1{
2 /***************************************************************************
3                                   dbactns.pp
4                                   ----------
5 ***************************************************************************/
6
7 *****************************************************************************
8  This file is part of the Lazarus Component Library (LCL)
9
10  See the file COPYING.modifiedLGPL.txt, included in this distribution,
11  for details about the license.
12 *****************************************************************************
13}
14{$mode objfpc}{$h+}
15unit DBActns;
16
17interface
18
19uses Classes, DB, ActnList;
20
21type
22
23{ ---------------------------------------------------------------------
24    TDatasetAction - Parent for all other TDataset actions.
25  ---------------------------------------------------------------------}
26
27  TDataSetAction = Class(TAction)
28  Private
29    FDataSource: TDataSource;
30    procedure SetDataSource(Value: TDataSource);
31  Protected
32    procedure Notification(AComponent: TComponent; Operation: TOperation); override;
33    function GetDataSet(Target: TObject): TDataSet; virtual;
34  Public
35    function HandlesTarget(Target: TObject): Boolean; override;
36    property DataSource: TDataSource read FDataSource write SetDataSource;
37  end;
38
39{ ---------------------------------------------------------------------
40    Navigation Actions
41  ---------------------------------------------------------------------}
42
43  TDataSetFirst = Class(TDataSetAction)
44  Public
45    procedure ExecuteTarget(Target: TObject); override;
46    procedure UpdateTarget(Target: TObject); override;
47  Published
48    property DataSource;
49  end;
50
51  TDataSetLast = Class(TDataSetAction)
52  Public
53    procedure ExecuteTarget(Target: TObject); override;
54    procedure UpdateTarget(Target: TObject); override;
55  Published
56    property DataSource;
57  end;
58
59  TDataSetNext = Class(TDataSetAction)
60  Public
61    procedure ExecuteTarget(Target: TObject); override;
62    procedure UpdateTarget(Target: TObject); override;
63  Published
64    property DataSource;
65  end;
66
67  TDataSetPrior = Class(TDataSetAction)
68  Public
69    procedure ExecuteTarget(Target: TObject); override;
70    procedure UpdateTarget(Target: TObject); override;
71  Published
72    property DataSource;
73  end;
74
75  TDataSetRefresh = Class(TDataSetAction)
76  Public
77    procedure ExecuteTarget(Target: TObject); override;
78    procedure UpdateTarget(Target: TObject); override;
79  Published
80    property DataSource;
81  end;
82
83
84{ ---------------------------------------------------------------------
85    Data manipulation actions
86  ---------------------------------------------------------------------}
87
88  TDataSetCancel = Class(TDataSetAction)
89  Public
90    procedure ExecuteTarget(Target: TObject); override;
91    procedure UpdateTarget(Target: TObject); override;
92  Published
93    property DataSource;
94  end;
95
96  TDataSetDelete = Class(TDataSetAction)
97  Public
98    procedure ExecuteTarget(Target: TObject); override;
99    procedure UpdateTarget(Target: TObject); override;
100  Published
101    property DataSource;
102  end;
103
104  TDataSetEdit = Class(TDataSetAction)
105  Public
106    procedure ExecuteTarget(Target: TObject); override;
107    procedure UpdateTarget(Target: TObject); override;
108  Published
109    property DataSource;
110  end;
111
112  TDataSetInsert = Class(TDataSetAction)
113  Public
114    procedure ExecuteTarget(Target: TObject); override;
115    procedure UpdateTarget(Target: TObject); override;
116  Published
117    property DataSource;
118  end;
119
120  TDataSetPost = Class(TDataSetAction)
121  Public
122    procedure ExecuteTarget(Target: TObject); override;
123    procedure UpdateTarget(Target: TObject); override;
124  Published
125    property DataSource;
126  end;
127
128
129procedure Register;
130
131implementation
132
133procedure Register;
134begin
135  RegisterNoIcon([TDataSetFirst,TDataSetLast,TDataSetNext,
136    TDataSetPrior,TDataSetRefresh,TDataSetCancel,TDataSetDelete,TDataSetEdit,
137    TDataSetInsert,TDataSetPost]);
138end;
139
140
141{ ---------------------------------------------------------------------
142    TDatasetAction
143  ---------------------------------------------------------------------}
144
145function TDataSetAction.GetDataSet(Target: TObject): TDataSet;
146begin
147  Result:=(Target as TDataSource).DataSet;
148end;
149
150function TDataSetAction.HandlesTarget(Target: TObject): Boolean;
151
152begin
153  Result:=(DataSource<>Nil);
154  if Result and (DataSource=Target) then
155    Result:=(DataSource.DataSet<>Nil)
156  else
157    Result:=(Target is TDataSource) and (TDataSource(Target).DataSet<>Nil);
158end;
159
160
161procedure TDataSetAction.Notification(AComponent: TComponent;
162  Operation: TOperation);
163begin
164  inherited Notification(AComponent,Operation);
165  if (Operation=opRemove) and
166     (AComponent=DataSource) then
167    FDataSource:=Nil;
168end;
169
170
171procedure TDataSetAction.SetDataSource(Value: TDataSource);
172begin
173  if (Value<>FDataSource) then
174    begin
175    FDataSource:=Value;
176    if (Value<>Nil) then
177      Value.FreeNotification(Self);
178    end;
179end;
180
181
182{ ---------------------------------------------------------------------
183    TDatasetFirst
184  ---------------------------------------------------------------------}
185
186procedure TDataSetFirst.ExecuteTarget(Target: TObject);
187begin
188  GetDataSet(Target).First;
189end;
190
191
192procedure TDataSetFirst.UpdateTarget(Target: TObject);
193begin
194  With GetDataSet(Target) do
195    Enabled:=Active and not BOF;
196end;
197
198
199{ ---------------------------------------------------------------------
200    TDataSetLast
201  ---------------------------------------------------------------------}
202
203procedure TDataSetLast.ExecuteTarget(Target: TObject);
204begin
205  GetDataSet(Target).Last;
206end;
207
208
209procedure TDataSetLast.UpdateTarget(Target: TObject);
210begin
211  with GetDataSet(Target) do
212    Enabled:=Active and not EOF;
213end;
214
215
216{ ---------------------------------------------------------------------
217    TDataSetNext
218  ---------------------------------------------------------------------}
219
220procedure TDataSetNext.ExecuteTarget(Target: TObject);
221begin
222  GetDataSet(Target).Next;
223end;
224
225
226procedure TDataSetNext.UpdateTarget(Target: TObject);
227begin
228  with GetDataSet(Target) do
229    Enabled:=Active and not Eof;
230end;
231
232
233{ ---------------------------------------------------------------------
234    TDataSetPrior
235  ---------------------------------------------------------------------}
236
237procedure TDataSetPrior.ExecuteTarget(Target: TObject);
238begin
239  GetDataSet(Target).Prior;
240end;
241
242
243procedure TDataSetPrior.UpdateTarget(Target: TObject);
244begin
245  with GetDataSet(Target) do
246    Enabled:=Active and not BOF;
247end;
248
249
250{ ---------------------------------------------------------------------
251    TDataSetRefresh
252  ---------------------------------------------------------------------}
253
254procedure TDataSetRefresh.ExecuteTarget(Target: TObject);
255begin
256  GetDataSet(Target).Refresh;
257end;
258
259
260procedure TDataSetRefresh.UpdateTarget(Target: TObject);
261begin
262  with GetDataSet(Target) do
263    Enabled:=Active;
264end;
265
266
267{ ---------------------------------------------------------------------
268    TDatasetInsert
269  ---------------------------------------------------------------------}
270
271procedure TDataSetInsert.ExecuteTarget(Target: TObject);
272begin
273  GetDataSet(Target).Insert;
274end;
275
276procedure TDataSetInsert.UpdateTarget(Target: TObject);
277begin
278  with GetDataSet(Target) do
279    Enabled:=Active and CanModify and not (State in dsEditModes);
280end;
281
282
283{ ---------------------------------------------------------------------
284    TDataSetPost
285  ---------------------------------------------------------------------}
286
287procedure TDataSetPost.ExecuteTarget(Target: TObject);
288begin
289  GetDataSet(Target).Post;
290end;
291
292procedure TDataSetPost.UpdateTarget(Target: TObject);
293begin
294  with GetDataSet(Target) do
295    Enabled:=Active and (State in dsEditModes);
296end;
297
298{ ---------------------------------------------------------------------
299    TDataSetCancel
300  ---------------------------------------------------------------------}
301
302procedure TDataSetCancel.ExecuteTarget(Target: TObject);
303begin
304  GetDataSet(Target).Cancel;
305end;
306
307
308procedure TDataSetCancel.UpdateTarget(Target: TObject);
309begin
310  with GetDataSet(Target) do
311    Enabled:=Active and (State in dsEditModes);
312end;
313
314
315{ ---------------------------------------------------------------------
316    TDataSetEdit
317  ---------------------------------------------------------------------}
318
319procedure TDataSetEdit.ExecuteTarget(Target: TObject);
320begin
321  GetDataSet(Target).Edit;
322end;
323
324
325procedure TDataSetEdit.UpdateTarget(Target: TObject);
326begin
327  with GetDataSet(Target) do
328    Enabled:=Active and CanModify and not (State in dsEditModes);
329end;
330
331
332{ ---------------------------------------------------------------------
333    TDataSetDelete
334  ---------------------------------------------------------------------}
335
336procedure TDataSetDelete.ExecuteTarget(Target: TObject);
337begin
338  GetDataSet(Target).Delete;
339end;
340
341
342procedure TDataSetDelete.UpdateTarget(Target: TObject);
343begin
344  with GetDataSet(Target) do
345    Enabled:=Active and (not (BOF and EOF)) and CanModify;
346end;
347
348
349end.
350