From e111cf8fb907f6cca186e27b7cca11e1a9c896c0 Mon Sep 17 00:00:00 2001 From: wp_xxyyzz Date: Mon, 10 Nov 2014 13:05:28 +0000 Subject: [PATCH] fpspreadsheet: Initial implementation of fpsActions (a set of standard actions to simplify the main spreadsheet manipulation tasks) git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@3714 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- .../fpspreadsheet/examples/fpsctrls/main.lfm | 184 +++++++++++- .../fpspreadsheet/examples/fpsctrls/main.pas | 17 +- .../examples/fpsctrls_no_install/main.lfm | 38 ++- .../examples/fpsctrls_no_install/main.pas | 28 +- components/fpspreadsheet/fpsactions.pas | 273 ++++++++++++++++++ .../laz_fpspreadsheet_visual.lpk | 7 +- .../laz_fpspreadsheet_visual.pas | 4 +- 7 files changed, 522 insertions(+), 29 deletions(-) create mode 100644 components/fpspreadsheet/fpsactions.pas diff --git a/components/fpspreadsheet/examples/fpsctrls/main.lfm b/components/fpspreadsheet/examples/fpsctrls/main.lfm index 5602be100..809ff4b9b 100644 --- a/components/fpspreadsheet/examples/fpsctrls/main.lfm +++ b/components/fpspreadsheet/examples/fpsctrls/main.lfm @@ -1,11 +1,12 @@ object Form1: TForm1 - Left = 349 + Left = 342 Height = 600 - Top = 117 + Top = 242 Width = 925 Caption = 'Form1' - ClientHeight = 600 + ClientHeight = 575 ClientWidth = 925 + Menu = MainMenu LCLVersion = '1.3' object Panel1: TPanel Left = 0 @@ -28,7 +29,7 @@ object Form1: TForm1 end object CellIndicator: TsCellIndicator Left = 95 - Height = 23 + Height = 28 Top = 9 Width = 80 TabOrder = 1 @@ -37,7 +38,7 @@ object Form1: TForm1 end object CellEdit: TsCellEdit Left = 184 - Height = 23 + Height = 28 Top = 9 Width = 731 Anchors = [akTop, akLeft, akRight] @@ -48,7 +49,7 @@ object Form1: TForm1 end object WorkbookTabControl: TsWorkbookTabControl Left = 0 - Height = 558 + Height = 533 Top = 42 Width = 672 TabIndex = 0 @@ -60,8 +61,8 @@ object Form1: TForm1 WorkbookSource = WorkbookSource object WorksheetGrid: TsWorksheetGrid Left = 2 - Height = 533 - Top = 23 + Height = 503 + Top = 28 Width = 668 FrozenCols = 0 FrozenRows = 0 @@ -113,7 +114,7 @@ object Form1: TForm1 end object InspectorTabControl: TTabControl Left = 677 - Height = 558 + Height = 533 Top = 42 Width = 248 OnChange = InspectorTabControlChange @@ -128,19 +129,20 @@ object Form1: TForm1 TabOrder = 2 object Inspector: TsSpreadsheetInspector Left = 2 - Height = 533 - Top = 23 + Height = 503 + Top = 28 Width = 244 Align = alClient - RowCount = 24 + RowCount = 25 TabOrder = 1 Strings.Strings = ( 'FileName=' 'FileFormat=sfExcel8' + 'ActiveWorksheet=Sheet1' 'Options=boAutoCalc, boCalcBeforeSaving, boReadFormulas' 'FormatSettings=' ' ThousandSeparator=.' - ' DecimalSeparator=.' + ' DecimalSeparator=,' ' ListSeparator=;' ' DateSeparator=.' ' TimeSeparator=:' @@ -166,14 +168,14 @@ object Form1: TForm1 WorkbookSource = WorkbookSource Mode = imWorkbook ColWidths = ( - 120 - 120 + 109 + 110 ) end end object Splitter1: TSplitter Left = 672 - Height = 558 + Height = 533 Top = 42 Width = 5 Align = alRight @@ -195,5 +197,155 @@ object Form1: TForm1 object ActionList1: TActionList left = 434 top = 180 + object AddWorksheetAction: TsWorksheetAddAction + Category = 'FPSpreadsheet' + Caption = 'Add' + Hint = 'Add empty worksheet' + WorkbookSource = WorkbookSource + NameMask = 'Sheet%d' + end + object DeleteWorksheetAction: TsWorksheetDeleteAction + Category = 'FPSpreadsheet' + Caption = 'Delete' + Hint = 'Delete worksheet' + WorkbookSource = WorkbookSource + end + object RenameWorksheetAction: TsWorksheetRenameAction + Category = 'FPSpreadsheet' + Caption = 'Rename...' + Hint = 'Rename worksheet' + WorkbookSource = WorkbookSource + end + end + object ImageList1: TImageList + left = 434 + top = 249 + Bitmap = { + 4C690300000010000000100000007E7E7E007E7E7E007F7F7F00808080008080 + 800080808000808080008080800080808000129D000014A8000015A9009915A9 + 00CC15A9009914A80000129D00007E7E7E007E7E7E007F7F7F00808080008080 + 800080808000808080008080800080808000129D000013A1000014A400CC75EE + 64FF14A400CC13A10000129D00007E7E7E007E7E7E007F7F7F00808080008080 + 800080808000808080008080800080808000129C0099129D00CC129D00CC66EB + 55FF129D00CC129D00CC129C00997E7E7E007E7E7E007F7F7F227F7F7F597F7F + 7F667F7F7F667F7F7F667F7F7F667F7F7F661A930CE052E741FF52E741FF52E7 + 41FF52E741FF52E741FF109500CC7A7A7A007A7A7A007A7A7A5AE9E9E9D3FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6EBB66FF3EA333FF3EA333FF3DE2 + 2CFF178B0BDF0E8C00CC0E8D0099727272007272720072727268FCFCFCFFFBFB + FBFFFBFBFBFFFBFBFBFFFBFBFBFFFBFBFBFFFBFBFBFFFBFBFBFF3C9B32FF2BDF + 1AFF16810BE10F8703000E8C00006A6A6A006A6A6A006A6A6A6AF8F8F8FFF6F6 + F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FF66A362FF3686 + 32FF266B22C43C6C39003B7A340058585800616161006161616BF4F4F4FFF0F0 + F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF4F4 + F4FF6161616B61616100585858004C4C4C00515151005656566CEFEFEFFFEAEA + EAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEFEF + EFFF5656566C515151004C4C4C004B4B4B534C4C4C6E4C4C4C6EEBEBEBFFE4E4 + E4FFE4E4E4FFE4E4E4FFE4E4E4FFE4E4E4FFE4E4E4FFE4E4E4FFE4E4E4FFEBEB + EBFF4C4C4C6E4C4C4C6E4B4B4B533C3C3C70F0F0F0FFF0F0F0FFECECECFFE8E8 + E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFECEC + ECFFF0F0F0FFF0F0F0FF3C3C3C701B1B1B581717177517171775171717751717 + 1775171717751717177517171775171717751717177517171775171717751717 + 177517171775171717751B1B1B58FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF007E7E7E007E7E7E007F7F7F00808080008080 + 8000808080008080800080808000808080000000A6990000A7CC0000A7CC0000 + A7CC0000A7CC0000A7CC0000A6997E7E7E007E7E7E007F7F7F227F7F7F597F7F + 7F667F7F7F667F7F7F667F7F7F667F7F7F660C0C95E05E5EF7FF5E5EF7FF5E5E + F7FF5E5EF7FF5E5EF7FF000098CC7A7A7A007A7A7A007A7A7A5AE9E9E9D3FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6666B4FF333399FF333399FF2828 + 92F60B0B7FDF000080CC00008499727272007272720072727268FCFCFCFFFBFB + FBFFFBFBFBFFFBFBFBFFFBFBFBFFFBFBFBFFFBFBFBFFFBFBFBFFFBFBFBFFFCFC + FCFF727272681C1C7600000080006A6A6A006A6A6A006A6A6A6AF8F8F8FFF6F6 + F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF8F8 + F8FF6A6A6A6A6A6A6A003434740058585800616161006161616BF4F4F4FFF0F0 + F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF0F0F0FFF4F4 + F4FF6161616B61616100585858004C4C4C00515151005656566CEFEFEFFFEAEA + EAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEAEAEAFFEFEF + EFFF5656566C515151004C4C4C004B4B4B534C4C4C6E4C4C4C6EEBEBEBFFE4E4 + E4FFE4E4E4FFE4E4E4FFE4E4E4FFE4E4E4FFE4E4E4FFE4E4E4FFE4E4E4FFEBEB + EBFF4C4C4C6E4C4C4C6E4B4B4B533C3C3C70F0F0F0FFF0F0F0FFECECECFFE8E8 + E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFECEC + ECFFF0F0F0FFF0F0F0FF3C3C3C701B1B1B581717177517171775171717751717 + 1775171717751717177517171775171717751717177517171775171717751717 + 177517171775171717751B1B1B58FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF007E7E7E007E7E7E007F7F7F00808080008080 + 800080808000808080008080800080808000808080006E85890001A3BB005555 + 55002B2B9D390101DEAF0101C6407E7E7E007E7E7E007F7F7F00808080008080 + 800080808000808080008080800080808000808080006E85890001A3BB005454 + 542438386F7C8080FFFF0101B1C17E7E7E007E7E7E007F7F7F00808080008080 + 800080808000808080008080800080808000808080006E85890001A2BA3F4A4A + 4A6CF7F7F7FF1A1A468E00009F467E7E7E007E7E7E007F7F7F227F7F7F597F7F + 7F667F7F7F667F7F7F667F7F7F667F7F7F667F7F7F66538B948C1494A9D379E6 + F7FF2D2D2D8F1212122E00009C007A7A7A007A7A7A007A7A7A5AE9E9E9D3FFFF + FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1E8EEFF4BB6C7FF79E6F7FF3496 + A8F44D6F7681444444003C3C8A00727272007272720072727268FCFCFCFFFBFB + FBFFFBFBFBFFFBFBFBFFFBFBFBFFBFE5EBFF4AB4C5FF79E6F7FF419EAFFFB9D8 + DEFF7272726872727200727272006A6A6A006A6A6A006A6A6A6AF8F8F8FFF6F6 + F6FFF6F6F6FFF6F6F6FFD2E4EAFF49B3C4FF79E6F7FF3F9DADFFB5D4DAFFF8F8 + F8FF6A6A6A6A6A6A6A006A6A6A0058585800616161006161616BF4F4F4FFF0F0 + F0FFF0F0F0FFF0F0F0FF79AFC1FFD9F4FFFF3E9BACFFB0CFD5FFF0F0F0FFF4F4 + F4FF6161616B61616100585858004C4C4C00515151005656566CEFEFEFFFEAEA + EAFFEAEAEAFFEAEAEAFF000000FF4F8393FFB2C6CCFFEAEAEAFFEAEAEAFFEFEF + EFFF5656566C515151004C4C4C004B4B4B534C4C4C6E4C4C4C6EEBEBEBFFE4E4 + E4FFE4E4E4FFE4E4E4FFE4E4E4FFE4E4E4FFE4E4E4FFE4E4E4FFE4E4E4FFEBEB + EBFF4C4C4C6E4C4C4C6E4B4B4B533C3C3C70F0F0F0FFF0F0F0FFECECECFFE8E8 + E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFE8E8E8FFECEC + ECFFF0F0F0FFF0F0F0FF3C3C3C701B1B1B581717177517171775171717751717 + 1775171717751717177517171775171717751717177517171775171717751717 + 177517171775171717751B1B1B58FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF + FF00FFFFFF00FFFFFF00FFFFFF00 + } + end + object MainMenu: TMainMenu + left = 434 + top = 320 + object MnuFile: TMenuItem + Caption = 'File' + object MenuItem1: TMenuItem + Caption = 'New Item5' + end + end + object MnuEdit: TMenuItem + Caption = 'Edit' + object MnuWorksheet: TMenuItem + Caption = 'Worksheet' + object MnuAddSheet: TMenuItem + Action = AddWorksheetAction + end + object MenuItem2: TMenuItem + Action = DeleteWorksheetAction + end + object MenuItem3: TMenuItem + Caption = '-' + end + object MenuItem4: TMenuItem + Action = RenameWorksheetAction + end + end + end end end diff --git a/components/fpspreadsheet/examples/fpsctrls/main.pas b/components/fpspreadsheet/examples/fpsctrls/main.pas index 1b73c6993..0d541f766 100644 --- a/components/fpspreadsheet/examples/fpsctrls/main.pas +++ b/components/fpspreadsheet/examples/fpsctrls/main.pas @@ -6,8 +6,8 @@ interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls, - StdCtrls, ComCtrls, ActnList, - fpspreadsheet, fpspreadsheetctrls, fpspreadsheetgrid; + StdCtrls, ComCtrls, ActnList, Menus, + fpspreadsheet, fpspreadsheetctrls, fpspreadsheetgrid, fpsActions; type @@ -16,6 +16,16 @@ type TForm1 = class(TForm) ActionList1: TActionList; Button1: TButton; + ImageList1: TImageList; + MainMenu: TMainMenu; + MenuItem1: TMenuItem; + MenuItem2: TMenuItem; + MenuItem3: TMenuItem; + MenuItem4: TMenuItem; + MnuFile: TMenuItem; + MnuWorksheet: TMenuItem; + MnuAddSheet: TMenuItem; + MnuEdit: TMenuItem; OpenDialog: TOpenDialog; OpenDialog1: TOpenDialog; Panel1: TPanel; @@ -24,6 +34,9 @@ type Splitter1: TSplitter; Inspector: TsSpreadsheetInspector; InspectorTabControl: TTabControl; + AddWorksheetAction: TsWorksheetAddAction; + DeleteWorksheetAction: TsWorksheetDeleteAction; + RenameWorksheetAction: TsWorksheetRenameAction; WorkbookSource: TsWorkbookSource; WorkbookTabControl: TsWorkbookTabControl; WorksheetGrid: TsWorksheetGrid; diff --git a/components/fpspreadsheet/examples/fpsctrls_no_install/main.lfm b/components/fpspreadsheet/examples/fpsctrls_no_install/main.lfm index 2435ee64d..48d2a56c2 100644 --- a/components/fpspreadsheet/examples/fpsctrls_no_install/main.lfm +++ b/components/fpspreadsheet/examples/fpsctrls_no_install/main.lfm @@ -4,8 +4,9 @@ object Form1: TForm1 Top = 177 Width = 874 Caption = 'Form1' - ClientHeight = 528 + ClientHeight = 503 ClientWidth = 874 + Menu = MainMenu OnCreate = FormCreate LCLVersion = '1.3' object Panel1: TPanel @@ -125,10 +126,10 @@ object Form1: TForm1 end object CbLoader: TComboBox Left = 104 - Height = 23 + Height = 28 Top = 8 Width = 148 - ItemHeight = 15 + ItemHeight = 20 ItemIndex = 1 Items.Strings = ( 'Workbook' @@ -141,16 +142,16 @@ object Form1: TForm1 end object Label1: TLabel Left = 13 - Height = 15 + Height = 20 Top = 11 - Width = 58 + Width = 73 Caption = 'Loaded by:' ParentColor = False end end object InspectorTabControl: TTabControl Left = 577 - Height = 454 + Height = 429 Top = 74 Width = 297 OnChange = InspectorTabControlChange @@ -166,7 +167,7 @@ object Form1: TForm1 end object Splitter1: TSplitter Left = 572 - Height = 454 + Height = 429 Top = 74 Width = 5 Align = alRight @@ -179,4 +180,27 @@ object Form1: TForm1 left = 48 top = 80 end + object MainMenu: TMainMenu + left = 203 + top = 80 + object MnuFile: TMenuItem + Caption = 'File' + end + object MnuEdit: TMenuItem + Caption = 'Edit' + object MnuWorksheets: TMenuItem + Caption = 'Worksheet' + object MnuAddWorksheet: TMenuItem + Caption = 'New Item4' + end + object MnuDeleteWorksheet: TMenuItem + Caption = 'New Item5' + end + end + end + end + object ActionList: TActionList + left = 203 + top = 144 + end end diff --git a/components/fpspreadsheet/examples/fpsctrls_no_install/main.pas b/components/fpspreadsheet/examples/fpsctrls_no_install/main.pas index 0219582b1..34cfff0f6 100644 --- a/components/fpspreadsheet/examples/fpsctrls_no_install/main.pas +++ b/components/fpspreadsheet/examples/fpsctrls_no_install/main.pas @@ -6,17 +6,24 @@ interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, - StdCtrls, ComCtrls, ExtCtrls, Grids, Buttons, - fpspreadsheet, fpspreadsheetctrls, fpSpreadsheetGrid; + StdCtrls, ComCtrls, ExtCtrls, Grids, Buttons, Menus, ActnList, + fpspreadsheet, fpspreadsheetctrls, fpSpreadsheetGrid, fpsActions; type { TForm1 } TForm1 = class(TForm) + ActionList: TActionList; BtnLoad: TButton; CbLoader: TComboBox; Label1: TLabel; + MainMenu: TMainMenu; + MnuDeleteWorksheet: TMenuItem; + MnuAddWorksheet: TMenuItem; + MnuWorksheets: TMenuItem; + MnuEdit: TMenuItem; + MnuFile: TMenuItem; OpenDialog: TOpenDialog; Panel1: TPanel; SpeedButton1: TSpeedButton; @@ -83,6 +90,8 @@ begin end; procedure TForm1.FormCreate(Sender: TObject); +var + actn: TAction; begin WorkbookSource := TsWorkbookSource.Create(self); with WorkbookSource do begin @@ -129,6 +138,21 @@ begin Align := alClient; WorkbookSource := Self.WorkbookSource; end; + + actn := TsWorksheetAddAction.Create(self); + with TsWorksheetAddAction(actn) do begin + ActionList := self.ActionList; + WorkbookSource := Self.WorkbookSource; + end; + MnuAddWorksheet.Action := actn; + + actn := TsWorksheetDeleteAction.Create(self); + with TsWorksheetDeleteAction(actn) do begin + ActionList := self.ActionList; + WOrkbookSource := Self.WorkbookSource; + end; + MnuDeleteWorksheet.Action := actn; + end; procedure TForm1.InspectorTabControlChange(Sender: TObject); diff --git a/components/fpspreadsheet/fpsactions.pas b/components/fpspreadsheet/fpsactions.pas new file mode 100644 index 000000000..8db62bf86 --- /dev/null +++ b/components/fpspreadsheet/fpsactions.pas @@ -0,0 +1,273 @@ +unit fpsActions; + +interface + +uses + SysUtils, Classes, Controls, ActnList, + fpspreadsheet, fpspreadsheetctrls; + +type + TsSpreadsheetAction = class(TAction) + private + FWorkbookSource: TsWorkbookSource; + function GetWorkbook: TsWorkbook; + function GetWorksheet: TsWorksheet; + protected + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + property Worksheet: TsWorksheet read GetWorksheet; + public + function HandlesTarget(Target: TObject): Boolean; override; + procedure UpdateTarget(Target: TObject); override; + property Workbook: TsWorkbook read GetWorkbook; + published + property WorkbookSource: TsWorkbookSource read FWorkbookSource write FWorkbookSource; + end; + + { --- Actions related to worksheets --- } + + TsWorksheetAction = class(TsSpreadsheetAction) + private + public + function HandlesTarget(Target: TObject): Boolean; override; + procedure UpdateTarget(Target: TObject); override; + property Worksheet; + end; + + { Action for adding a worksheet } + TsWorksheetAddAction = class(TsWorksheetAction) + private + FNameMask: String; + procedure SetNameMask(const AValue: String); + protected + function GetUniqueSheetName: String; + public + constructor Create(AOwner: TComponent); override; + procedure ExecuteTarget(Target: TObject); override; + published + property NameMask: String read FNameMask write SetNameMask; + end; + + { Action for deleting selected worksheet } + TsWorksheetDeleteAction = class(TsWorksheetAction) + public + constructor Create(AOwner: TComponent); override; + procedure ExecuteTarget(Target: TObject); override; + end; + + { Action for renaming selected worksheet } + TsWorksheetRenameAction = class(TsWorksheetAction) + public + constructor Create(AOwner: TComponent); override; + procedure ExecuteTarget(Target: TObject); override; + end; + + procedure Register; + +implementation + +uses + Dialogs; + +procedure Register; +begin + RegisterActions('FPSpreadsheet', [ + TsWorksheetAddAction, TsWorksheetDeleteAction, TsWorksheetRenameAction + ], nil); +end; + + +{ TsSpreadsheetAction } + +function TsSpreadsheetAction.GetWorkbook: TsWorkbook; +begin + if FWorkbookSource <> nil then + Result := FWorkbookSource.Workbook + else + Result := nil; +end; + +function TsSpreadsheetAction.GetWorksheet: TsWorksheet; +begin + if FWorkbookSource <> nil then + Result := FWorkbookSource.Worksheet + else + Result := nil; +end; + +function TsSpreadsheetAction.HandlesTarget(Target: TObject): Boolean; +begin + Result := (Target <> nil) and (Target = FWorkbookSource); +end; + +procedure TsSpreadsheetAction.Notification(AComponent: TComponent; + Operation: TOperation); +begin + inherited Notification(AComponent, Operation); + if (Operation = opRemove) and (AComponent = FWorkbookSource) then + FWorkbookSource := nil; +end; + +procedure TsSpreadsheetAction.UpdateTarget(Target: TObject); +begin + Enabled := HandlesTarget(Target); +end; + + +{ TsWorksheetAction } + +function TsWorksheetAction.HandlesTarget(Target: TObject): Boolean; +begin + Result := inherited HandlesTarget(Target) and (Worksheet <> nil); +end; + +procedure TsWorksheetAction.UpdateTarget(Target: TObject); +begin + Enabled := inherited Enabled and (Worksheet <> nil); +end; + + +{ TsWorksheetAddAction } + +constructor TsWOrksheetAddAction.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + Caption := 'Add'; + Hint := 'Add empty worksheet'; + FNameMask := 'Sheet%d'; +end; + +function TsWorksheetAddAction.GetUniqueSheetName: String; +var + i: Integer; +begin + Result := ''; + if Workbook = nil then + exit; + + i := 0; + repeat + inc(i); + Result := Format(FNameMask, [i]); + until Workbook.GetWorksheetByName(Result) = nil +end; + +procedure TsWorksheetAddAction.ExecuteTarget(Target: TObject); +var + sheetName: String; +begin + if HandlesTarget(Target) then + begin + sheetName := GetUniqueSheetName; + Workbook.AddWorksheet(sheetName); + end; +end; + +procedure TsWorksheetAddAction.SetNameMask(const AValue: String); +begin + if AValue = FNameMask then + exit; + + if pos('%d', AValue) = 0 then + raise Exception.Create('Worksheet name mask must contain a %d place-holder.'); + + FNameMask := AValue; +end; + + +{ TsWorksheetDeleteAction } + +constructor TsWorksheetDeleteAction.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + Caption := 'Delete'; + Hint := 'Delete worksheet'; +end; + +procedure TsWorksheetDeleteAction.ExecuteTarget(Target: TObject); +begin + if HandlesTarget(Target) then + begin + if Workbook.GetWorksheetCount = 1 then + begin + MessageDlg('The workbook must contain at least 1 worksheet', mtError, [mbOK], 0); + exit; + end; + + if MessageDlg( + Format('Do you really want to delete worksheet "%s"?', [Worksheet.Name]), + mtConfirmation, [mbYes, mbNo], 0) <> mrYes + then + exit; + + Workbook.RemoveWorksheet(Worksheet); + // The workbooksource takes care of selecting the next worksheet + end; +end; + + +{ TsWorksheetRenameAction } + +constructor TsWorksheetRenameAction.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + Caption := 'Rename...'; + Hint := 'Rename worksheet'; +end; + +procedure TsWorksheetRenameAction.ExecuteTarget(Target: TObject); +var + s: String; +begin + if HandlesTarget(Target) then + begin + s := Worksheet.Name; + if InputQuery('Rename worksheet', 'New worksheet name', s) then + Worksheet.Name := s; + end; +end; + + + (* + { TsSpreadsheetAction } + + TsSpreadsheetAction = class(TAction) + private + FWorkbookSource: TsWorkbookSource; + function GetWorkbook: TsWorkbook; + function GetWorksheet: TsWorksheet; + procedure SetWorkbookLink(AValue: TsWorkbookSource); + protected + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + procedure UpdateCell; virtual; + procedure UpdateWorkbook; virtual; + procedure UpdateWorksheet; virtual; + public + destructor Destroy; override; + procedure ListenerNotification(AChangedItems: TsNotificationItems; + AData: Pointer = nil); + property Workbook: TsWorkbook read GetWorkbook; + property Worksheet: TsWorksheet read GetWorksheet; + published + property WorkbookLink: TsWorkbookSource read FWorkbookSource write SetWorkbookLink; + end; + + {TsWorksheetNavigateAction} + TsWorksheetNavigateAction = class(TsSpreadsheetAction) + public + function Update: Boolean; override; + end; + + {TsNextWorksheetAction} + TsNextWorksheetAction = class(TAction) + public + function Execute: Boolean; override; + end; + + {TsPreviosWorksheetAction} + TsPreviousWorksheetAction = class(TAction) + public + function Execute: Boolean; override; + end; *) + + + end. diff --git a/components/fpspreadsheet/laz_fpspreadsheet_visual.lpk b/components/fpspreadsheet/laz_fpspreadsheet_visual.lpk index 7827e4c95..3333f156a 100644 --- a/components/fpspreadsheet/laz_fpspreadsheet_visual.lpk +++ b/components/fpspreadsheet/laz_fpspreadsheet_visual.lpk @@ -20,7 +20,7 @@ It provides graphical components like a grid and chart."/> - + @@ -36,6 +36,11 @@ It provides graphical components like a grid and chart."/> + + + + + diff --git a/components/fpspreadsheet/laz_fpspreadsheet_visual.pas b/components/fpspreadsheet/laz_fpspreadsheet_visual.pas index ec7872708..051539048 100644 --- a/components/fpspreadsheet/laz_fpspreadsheet_visual.pas +++ b/components/fpspreadsheet/laz_fpspreadsheet_visual.pas @@ -7,7 +7,8 @@ unit laz_fpspreadsheet_visual; interface uses - fpspreadsheetctrls, fpspreadsheetgrid, fpspreadsheetchart, LazarusPackageIntf; + fpspreadsheetctrls, fpspreadsheetgrid, fpspreadsheetchart, fpsActions, + LazarusPackageIntf; implementation @@ -16,6 +17,7 @@ begin RegisterUnit('fpspreadsheetctrls', @fpspreadsheetctrls.Register); RegisterUnit('fpspreadsheetgrid', @fpspreadsheetgrid.Register); RegisterUnit('fpspreadsheetchart', @fpspreadsheetchart.Register); + RegisterUnit('fpsactions', @fpsactions.Register); end; initialization