Skip to content

Commit 6150466

Browse files
author
Joachim Marder
committed
TVirtualTreePerItemAction: Moved code from ExecuteTarget() to DoBeforeExecute() and DoAfterExecute() which simplifies creating derived actions that do not use IterateSubtree() / fToExecute.
1 parent a2cf749 commit 6150466

1 file changed

Lines changed: 84 additions & 76 deletions

File tree

Source/VirtualTrees.Actions.pas

Lines changed: 84 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ interface
55
uses
66
System.Classes,
77
System.Actions,
8+
Vcl.Controls,
89
Vcl.ActnList,
910
VirtualTrees;
1011

@@ -20,7 +21,7 @@ TVirtualTreeAction = class(TCustomAction)
2021
fFilter: TVirtualNodeStates; // Apply only of nodes which match these states
2122
procedure SetControl(Value: TBaseVirtualTree); // Setter for the property "Control"
2223
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
23-
procedure DoAfterExecute; // Fires the event "OnAfterExecute"
24+
procedure DoAfterExecute; virtual;// Fires the event "OnAfterExecute"
2425
property SelectedOnly: Boolean read GetSelectedOnly write SetSelectedOnly default False;
2526
public
2627
function HandlesTarget(Target: TObject): Boolean; override;
@@ -45,9 +46,11 @@ TVirtualTreeAction = class(TCustomAction)
4546
TVirtualTreePerItemAction = class(TVirtualTreeAction)
4647
strict private
4748
fOnBeforeExecute: TNotifyEvent;
49+
fOldCursor: TCursor;
4850
strict protected
4951
fToExecute: TVTGetNodeProc; // method which is executed per item to perform this action
50-
procedure DoBeforeExecute;
52+
procedure DoBeforeExecute();
53+
procedure DoAfterExecute(); override;// Fires the event "OnAfterExecute"
5154
public
5255
constructor Create(AOwner: TComponent); override;
5356
procedure ExecuteTarget(Target: TObject); override;
@@ -79,10 +82,10 @@ TVirtualTreeSelectAll = class(TVirtualTreeAction)
7982

8083
// Base class for actions that are applied to selected nodes only
8184
TVirtualTreeForSelectedAction = class(TVirtualTreeAction)
82-
public
83-
constructor Create(AOwner: TComponent); override;
84-
end;
85-
85+
public
86+
constructor Create(AOwner: TComponent); override;
87+
end;
88+
8689
TVirtualTreeCopy = class(TVirtualTreeForSelectedAction)
8790
public
8891
procedure ExecuteTarget(Target: TObject); override;
@@ -109,7 +112,7 @@ procedure Register;
109112
implementation
110113

111114
uses
112-
Controls, Forms;
115+
Vcl.Forms;
113116

114117
procedure Register;
115118
begin
@@ -128,18 +131,18 @@ constructor TVirtualTreeAction.Create(AOwner: TComponent);
128131
end;
129132

130133
function TVirtualTreeAction.GetSelectedOnly: Boolean;
131-
begin
132-
exit(TVirtualNodeState.vsSelected in fFilter);
133-
end;
134-
134+
begin
135+
exit(TVirtualNodeState.vsSelected in fFilter);
136+
end;
137+
135138
procedure TVirtualTreeAction.SetSelectedOnly(const Value: Boolean);
136-
begin
137-
if Value then
138-
Include(fFilter, TVirtualNodeState.vsSelected)
139-
else
140-
Exclude(fFilter, TVirtualNodeState.vsSelected);
141-
end;
142-
139+
begin
140+
if Value then
141+
Include(fFilter, TVirtualNodeState.vsSelected)
142+
else
143+
Exclude(fFilter, TVirtualNodeState.vsSelected);
144+
end;
145+
143146
procedure TVirtualTreeAction.DoAfterExecute;
144147
begin
145148
if Assigned(fOnAfterExecute) then
@@ -160,7 +163,7 @@ procedure TVirtualTreeAction.UpdateTarget(Target: TObject);
160163

161164
procedure TVirtualTreeAction.ExecuteTarget(Target: TObject);
162165
begin
163-
DoAfterExecute();
166+
DoAfterExecute();
164167
end;
165168

166169
procedure TVirtualTreeAction.Notification(AComponent: TComponent; Operation: TOperation);
@@ -186,35 +189,40 @@ procedure TVirtualTreeAction.SetControl(Value: TBaseVirtualTree);
186189
{ TVirtualTreePerItemAction }
187190

188191
constructor TVirtualTreePerItemAction.Create(AOwner: TComponent);
189-
begin
190-
inherited;
191-
fToExecute := nil;
192-
fOnBeforeExecute := nil;
193-
end;
194-
192+
begin
193+
inherited;
194+
fToExecute := nil;
195+
fOnBeforeExecute := nil;
196+
fOldCursor := crNone;
197+
end;
198+
199+
procedure TVirtualTreePerItemAction.DoAfterExecute;
200+
begin
201+
inherited;
202+
Control.EndUpdate;
203+
if fOldCursor <> crNone then
204+
Screen.Cursor := fOldCursor;
205+
end;
206+
195207
procedure TVirtualTreePerItemAction.DoBeforeExecute;
196208
begin
209+
if Screen.Cursor <> crHourGlass then begin
210+
fOldCursor := Screen.Cursor;
211+
Screen.Cursor := crHourGlass;
212+
end;//if
197213
if Assigned(fOnBeforeExecute) then
198214
fOnBeforeExecute(Self);
215+
Control.BeginUpdate();
199216
end;
200217

201218
procedure TVirtualTreePerItemAction.ExecuteTarget(Target: TObject);
202-
var
203-
lOldCursor: TCursor;
204219
begin
205-
if Assigned(Self.Control) then
206-
Target := Self.Control;
207220
DoBeforeExecute();
208-
lOldCursor := Screen.Cursor;
209-
Screen.Cursor := crHourGlass;
210-
Control.BeginUpdate();
211221
try
212222
Control.IterateSubtree(nil, Self.fToExecute, nil, fFilter);
213-
finally
214-
Control.EndUpdate;
215-
Screen.Cursor := lOldCursor;
223+
finally
224+
DoAfterExecute();
216225
end;
217-
Inherited ExecuteTarget(Target);
218226
end;
219227

220228
{ TVirtualTreeCheckAll }
@@ -244,62 +252,62 @@ constructor TVirtualTreeUncheckAll.Create(AOwner: TComponent);
244252

245253

246254
{ TVirtualStringSelectAll }
247-
255+
248256
procedure TVirtualTreeSelectAll.UpdateTarget(Target: TObject);
249257
begin
250-
Inherited;
251-
//Enabled := Enabled and (toMultiSelect in Control.TreeOptions.SelectionOptions) // TreeOptions is protected :-(
258+
Inherited;
259+
//Enabled := Enabled and (toMultiSelect in Control.TreeOptions.SelectionOptions) // TreeOptions is protected :-(
252260
end;
253261

254262
procedure TVirtualTreeSelectAll.ExecuteTarget(Target: TObject);
255-
begin
256-
Control.SelectAll(False);
257-
inherited;
258-
end;
259-
260-
261-
{ TVirtualTreeForSelectedAction }
263+
begin
264+
Control.SelectAll(False);
265+
inherited;
266+
end;
267+
268+
269+
{ TVirtualTreeForSelectedAction }
262270

263271
constructor TVirtualTreeForSelectedAction.Create(AOwner: TComponent);
264-
begin
265-
inherited;
266-
SelectedOnly := True;
267-
end;
268-
269-
270-
{ TVirtualTreeCopy }
271-
272-
procedure TVirtualTreeCopy.ExecuteTarget(Target: TObject);
273-
begin
274-
Control.CopyToClipboard();
275-
Inherited;
276-
end;
272+
begin
273+
inherited;
274+
SelectedOnly := True;
275+
end;
276+
277+
278+
{ TVirtualTreeCopy }
279+
280+
procedure TVirtualTreeCopy.ExecuteTarget(Target: TObject);
281+
begin
282+
Control.CopyToClipboard();
283+
Inherited;
284+
end;
277285

278286

279287
{ TVirtualTreeCut }
280-
281-
procedure TVirtualTreeCut.ExecuteTarget(Target: TObject);
282-
begin
283-
Control.CutToClipboard();
284-
Inherited;
285-
end;
288+
289+
procedure TVirtualTreeCut.ExecuteTarget(Target: TObject);
290+
begin
291+
Control.CutToClipboard();
292+
Inherited;
293+
end;
286294

287295

288296
{ TVirtualTreePaste }
289-
290-
procedure TVirtualTreePaste.ExecuteTarget(Target: TObject);
291-
begin
292-
Control.PasteFromClipboard();
293-
Inherited;
294-
end;
297+
298+
procedure TVirtualTreePaste.ExecuteTarget(Target: TObject);
299+
begin
300+
Control.PasteFromClipboard();
301+
Inherited;
302+
end;
295303

296304

297305
{ TVirtualTreeDelete }
298-
299-
procedure TVirtualTreeDelete.ExecuteTarget(Target: TObject);
300-
begin
301-
Control.DeleteSelectedNodes();
302-
Inherited;
306+
307+
procedure TVirtualTreeDelete.ExecuteTarget(Target: TObject);
308+
begin
309+
Control.DeleteSelectedNodes();
310+
Inherited;
303311
end;
304312

305313

0 commit comments

Comments
 (0)