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