initial commit
[rofl0r-KOL.git] / mckActionListEditor.inc
blobff2b5625184dd59fbefae0df3f18d321a955dc9e
1 type\r
2   TfmActionListEditor = class(TForm)\r
3   private\r
4     pnButtons: TPanel;\r
5     pnView: TPanel;\r
6     btAdd: TButton;\r
7     btDel: TButton;\r
8     btUp: TButton;\r
9     btDown: TButton;\r
10     chkStayOnTop: TCheckBox;\r
11     lvActions: TListView;\r
12     procedure FormResize(Sender: TObject);\r
13     procedure FormShow(Sender: TObject);\r
14     procedure chkStayOnTopClick(Sender: TObject);\r
15     procedure btAddClick(Sender: TObject);\r
16     procedure btDelClick(Sender: TObject);\r
17     procedure btUpClick(Sender: TObject);\r
18     procedure btDownClick(Sender: TObject);\r
19     procedure FormKeyDown(Sender: TObject; var Key: Word;\r
20       Shift: TShiftState);\r
21     procedure lvActionsSelectItem(Sender: TObject; Item: TListItem;\r
22       Selected: Boolean);\r
23     {$IFDEF VER90} {$DEFINE OLDDELPHI} {$ENDIF}\r
24     {$IFDEF VER100} {$DEFINE OLDDELPHI} {$ENDIF}\r
25     {$IFDEF OLDDELPHI}\r
26     procedure lvActionsChange(Sender: TObject; Item: TListItem; Change: TItemChange);\r
27     {$ENDIF}\r
28     procedure lvActionsEdited(Sender: TObject; Item: TListItem;\r
29       var S: String);\r
30     procedure FormDestroy(Sender: TObject);\r
31     procedure FormClose(Sender: TObject; var Action: TCloseAction);\r
32   private\r
33     { Private declarations }\r
34     FActionList: TComponent;\r
35     procedure SetActionList(const Value: TComponent);\r
36     procedure AdjustButtons;\r
37     procedure SelectLV;\r
38   public\r
39     { Public declarations }\r
40     property ActionList: TComponent read FActionList write SetActionList;\r
41     procedure MakeActive( SelectAny: Boolean );\r
42     constructor Create( AOwner: TComponent ); override;\r
43     procedure NameChanged(Sender: TComponent);\r
44   end;\r
46 var\r
47   fmlvActionsEditor: TfmActionListEditor;\r
49 implementation\r
51 uses mirror, mckCtrls, mckObjs;\r
53 //{$R *.DFM}\r
55 procedure TfmActionListEditor.AdjustButtons;\r
56 var LI: TListItem;\r
57 begin\r
58   LI := lvActions.Selected;\r
59   if LI = nil then\r
60   begin\r
61     btAdd.Enabled := lvActions.Items.Count = 0;\r
62     btDel.Enabled := FALSE;\r
63     btUp.Enabled := FALSE;\r
64     btDown.Enabled := FALSE;\r
65   end\r
66     else\r
67   begin\r
68     btAdd.Enabled := TRUE;\r
69     btDel.Enabled := TRUE;\r
70     btUp.Enabled := LI.Index > 0;\r
71     btDown.Enabled := LI.Index < lvActions.Items.Count - 1;\r
72   end;\r
73 end;\r
75 procedure TfmActionListEditor.FormResize(Sender: TObject);\r
76 begin\r
77   lvActions.Columns[ 0 ].Width := lvActions.ClientWidth;\r
78 end;\r
80 procedure TfmActionListEditor.MakeActive(SelectAny: Boolean);\r
81 var F: TForm;\r
82     D: IDesigner;\r
83     FD: IFormDesigner;\r
84     Act: TKOLAction;\r
85 begin\r
86   if lvActions.Items.Count > 0 then\r
87   if lvActions.Selected = nil then\r
88   if SelectAny then\r
89     lvActions.Selected := lvActions.Items[ 0 ];\r
90   if lvActions.Selected <> nil then\r
91   begin\r
92     Act := lvActions.Selected.Data;\r
93     F := (FActionList as TKOLActionList).Owner as TForm;\r
94     if F <> nil then\r
95     begin\r
96   {$IFDEF _D6orHigher}\r
97         F.Designer.QueryInterface(IFormDesigner,D);\r
98   {$ELSE}\r
99         D := F.Designer;\r
100   {$ENDIF}\r
101       if D <> nil then\r
102       if QueryFormDesigner( D, FD ) then\r
103       begin\r
104         RemoveSelection( FD );\r
105         FD.SelectComponent( Act );\r
106       end;\r
107     end;\r
108   end;\r
109   AdjustButtons;\r
110 end;\r
112 procedure TfmActionListEditor.SetActionList(const Value: TComponent);\r
113 var LV: TKOLActionList;\r
114 begin\r
115   FActionList := Value;\r
116   LV := FActionList as TKOLActionList;\r
117   Caption := LV.Name + ' actions';\r
118 end;\r
120 procedure TfmActionListEditor.FormShow(Sender: TObject);\r
121 var I: Integer;\r
122     LI: TListItem;\r
123     Act: TKOLAction;\r
124     AL: TKOLActionList;\r
125 begin\r
126   lvActions.Items.BeginUpdate;\r
127   TRY\r
129     lvActions.Items.Clear;\r
130     if FActionList <> nil then\r
131     if FActionList is TKOLActionList then\r
132     begin\r
133       AL := FActionList as TKOLActionList;\r
134       for I := 0 to AL.Count-1 do\r
135       begin\r
136         LI := lvActions.Items.Add;\r
137         Act := AL[ I ];\r
138         LI.Data := Act;\r
139         LI.Caption := Act.Name;\r
140       end;\r
141     end;\r
143   FINALLY\r
144     lvActions.Items.EndUpdate;\r
145   END;\r
146 end;\r
148 procedure TfmActionListEditor.chkStayOnTopClick(Sender: TObject);\r
149 begin\r
150   if chkStayOnTop.Checked then\r
151     FormStyle := fsStayOnTop\r
152   else\r
153     FormStyle := fsNormal;\r
154 end;\r
156 procedure TfmActionListEditor.btAddClick(Sender: TObject);\r
157 var LI: TListItem;\r
158     Act: TKOLAction;\r
159     AL: TKOLActionList;\r
160     I: Integer;\r
161     S: String;\r
162 begin\r
163   if FActionList = nil then Exit;\r
164   if not( FActionList is TKOLActionList ) then Exit;\r
165   AL := FActionList as TKOLActionList;\r
166   LI := lvActions.Selected;\r
167   if LI = nil then\r
168   begin\r
169     Act := TKOLAction.Create( AL.Owner );\r
170     LI := lvActions.Items.Add;\r
171     LI.Data := Act;\r
172   end\r
173     else\r
174   begin\r
175     if LI.Index >= lvActions.Items.Count then\r
176       Act := TKOLAction.Create( AL.Owner )\r
177     else\r
178     begin\r
179       Act := TKOLAction.Create( AL.Owner );\r
180       Act.ActionList:=AL;\r
181       AL.List.Move( lvActions.Items.Count, LI.Index + 1 );\r
182     end;\r
183     LI := lvActions.Items.Insert( LI.Index + 1 );\r
184     LI.Data := Act;\r
185   end;\r
186   if AL <> nil then begin\r
187     Act.ActionList:=AL;\r
188     if AL.Owner is TForm then\r
189       for I := 1 to MaxInt do\r
190       begin\r
191         S := 'Action' + IntToStr( I );\r
192         if (AL.Owner as TForm).FindComponent( S ) = nil then\r
193         if AL.FindComponent( S ) = nil then\r
194         begin\r
195           Act.Name := S;\r
196           break;\r
197         end;\r
198       end;\r
199   end;\r
200   lvActions.Selected := nil;\r
201   lvActions.Selected := LI;\r
202   lvActions.ItemFocused := LI;\r
203   LI.MakeVisible( FALSE );\r
204 end;\r
206 procedure TfmActionListEditor.btDelClick(Sender: TObject);\r
207 var LI: TListItem;\r
208     J: Integer;\r
209     Act: TKOLAction;\r
210 begin\r
211   LI := lvActions.Selected;\r
212   if LI <> nil then\r
213   begin\r
214     J := LI.Index;\r
215     Act := LI.Data;\r
216     Act.Free;\r
217     LI.Free;\r
218     if J >= lvActions.Items.Count then\r
219       Dec( J );\r
220     if J >= 0 then\r
221     begin\r
222       lvActions.Selected := lvActions.Items[ J ];\r
223       lvActions.ItemFocused := lvActions.Selected;\r
224     end;\r
225   end;\r
226   AdjustButtons;\r
227   if lvActions.Items.Count = 0 then\r
228     SelectLV;\r
229 end;\r
231 procedure TfmActionListEditor.btUpClick(Sender: TObject);\r
232 var LI, LI1: TListItem;\r
233     I: Integer;\r
234     AL: TKOLActionList;\r
235 begin\r
236   if FActionList = nil then Exit;\r
237   if not(FActionList is TKOLActionList) then Exit;\r
238   AL := FActionList as TKOLActionList;\r
239   LI := lvActions.Selected;\r
240   if LI = nil then Exit;\r
241   I := LI.Index - 1;\r
242   LI1 := lvActions.Items.Insert( I );\r
243   LI1.Caption := LI.Caption;\r
244   LI1.Data := LI.Data;\r
245   AL.List.Move( I + 1, I );\r
246   LI.Free;\r
247   lvActions.Selected := LI1;\r
248   lvActions.ItemFocused := LI1;\r
249   AdjustButtons;\r
250 end;\r
252 procedure TfmActionListEditor.btDownClick(Sender: TObject);\r
253 var LI, LI1: TListItem;\r
254     AL: TKOLActionList;\r
255 begin\r
256   if FActionList = nil then Exit;\r
257   if not(FActionList is TKOLActionList) then Exit;\r
258   AL := FActionList as TKOLActionList;\r
259   LI := lvActions.Selected;\r
260   if LI = nil then Exit;\r
261   AL.List.Move( LI.Index, LI.Index + 1 );\r
262   LI1 := lvActions.Items.Insert( LI.Index + 2 );\r
263   LI1.Caption := LI.Caption;\r
264   LI1.Data := LI.Data;\r
265   LI.Free;\r
266   lvActions.Selected := LI1;\r
267   lvActions.ItemFocused := LI1;\r
268   AdjustButtons;\r
269 end;\r
271 procedure TfmActionListEditor.FormKeyDown(Sender: TObject; var Key: Word;\r
272   Shift: TShiftState);\r
273 begin\r
274   case Key of\r
275   VK_F2:     if (lvActions.Selected <> nil) then\r
276                lvActions.Selected.EditCaption\r
277              else exit;\r
278   VK_INSERT: btAdd.Click;\r
279   VK_DELETE: if not lvActions.IsEditing then btDel.Click else exit;\r
280   VK_RETURN: if (ActiveControl = lvActions) and not lvActions.IsEditing and\r
281                 (lvActions.Selected <> nil) then\r
282                 lvActions.Selected.EditCaption\r
283              else exit;   \r
284   VK_UP:     if (GetKeyState( VK_CONTROL ) < 0) then\r
285                 btUp.Click\r
286              else Exit;\r
287   VK_DOWN:   if (GetKeyState( VK_CONTROL ) < 0) then\r
288                 btDown.Click\r
289              else Exit;\r
290   else Exit;\r
291   end;\r
292   Key := 0;\r
293 end;\r
295 procedure TfmActionListEditor.lvActionsSelectItem(Sender: TObject;\r
296   Item: TListItem; Selected: Boolean);\r
297 begin\r
298   if Selected then\r
299     MakeActive( FALSE );\r
300 end;\r
302 {$IFDEF OLDDELPHI}\r
303 procedure TfmActionListEditor.lvActionsChange(Sender: TObject; Item: TListItem; Change: TItemChange);\r
304 begin\r
305   if lvActions.Selected <> nil then\r
306     MakeActive( FALSE );\r
307 end;\r
308 {$ENDIF}\r
310 procedure TfmActionListEditor.lvActionsEdited(Sender: TObject;\r
311   Item: TListItem; var S: String);\r
312 var Act: TKOLAction;\r
313 begin\r
314   if Item = nil then Exit;\r
315   if S = '' then begin\r
316     S:=Item.Caption;\r
317     exit;\r
318   end;\r
319   Act := Item.Data;\r
320   Act.Name := S;\r
321   MakeActive( FALSE );\r
322 end;\r
324 procedure TfmActionListEditor.FormDestroy(Sender: TObject);\r
325 var LV: TKOLActionList;\r
326 begin\r
327   Rpt( 'Destroying ActionList columns editor' );\r
328   if FActionList = nil then Exit;\r
329   LV := FActionList as TKOLActionList;\r
330   LV.ActiveDesign := nil;\r
331 end;\r
333 procedure TfmActionListEditor.FormClose(Sender: TObject;\r
334   var Action: TCloseAction);\r
335 begin\r
336   Rpt( 'Closing ActionList columns editor' );\r
337   SelectLV;\r
338   modalResult := mrOK;\r
339 end;\r
341 procedure TfmActionListEditor.NameChanged(Sender: TComponent);\r
342 var\r
343   i: integer;\r
344 begin\r
345   for i:=0 to lvActions.Items.Count - 1 do\r
346     if lvActions.Items[i].Data = Sender then begin\r
347       lvActions.Items[i].Caption:=Sender.Name;\r
348     end;\r
349 end;\r
351 procedure TfmActionListEditor.SelectLV;\r
352 var F: TForm;\r
353     D: IDesigner;\r
354     FD: IFormDesigner;\r
355 begin\r
356   if FActionList <> nil then\r
357   begin\r
358     F := (FActionList as TKOLActionList).Owner as TForm;\r
359     if F <> nil then\r
360     begin\r
361         Rpt( 'Form found: ' + F.Name );\r
363   {$IFDEF _D6orHigher}                                  //\r
364         F.Designer.QueryInterface(IFormDesigner,D);     //\r
365   {$ELSE}                                               //\r
366         D := F.Designer;\r
367   {$ENDIF}                                              //\r
368         if D <> nil then\r
369         begin\r
371           Rpt( 'IDesigner interface returned' );\r
372           if QueryFormDesigner( D, FD ) then\r
373           begin\r
374             Rpt( 'IFormDesigner interface quered' );\r
375             try\r
376               RemoveSelection( FD );\r
377               FD.SelectComponent( FActionList );\r
378             except\r
379               Rpt( 'EXCEPTION *** Could not clear selection!' )\r
380             end;\r
381           end;\r
383         end;\r
384     end;\r
385   end;\r
386 end;\r
388 constructor TfmActionListEditor.Create(AOwner: TComponent);\r
389 begin\r
390   CreateNew(AOwner);\r
392   Left := 246;\r
393   Top := 107;\r
394   Width := 268;\r
395   Height := 314;\r
396   HorzScrollBar.Visible := False;\r
397   VertScrollBar.Visible := False;\r
398   BorderIcons := [biSystemMenu];\r
399   Caption := 'Actions';\r
400   //Color := clBtnFace;\r
401   //Font.Charset := DEFAULT_CHARSET;\r
402   //Font.Color := clWindowText;\r
403   //Font.Height := -11;\r
404   Font.Name := 'MS Sans Serif';\r
405   //Font.Style := [];\r
406   KeyPreview := True;\r
407   //OldCreateOrder := False;\r
408   Scaled := False;\r
409   OnClose := FormClose;\r
410   OnDestroy := FormDestroy;\r
411   OnKeyDown := FormKeyDown;\r
412   OnResize := FormResize;\r
413   OnShow := FormShow;\r
414   PixelsPerInch := 96;\r
415   //TextHeight := 13;\r
416   pnButtons := TPanel.Create( Self );\r
417   with pnButtons do\r
418   begin\r
419     Parent := Self;\r
420     Left := 150;\r
421     Top := 0;\r
422     Width := 110;\r
423     Height := 287;\r
424     Align := alRight;\r
425     BevelOuter := bvNone;\r
426     TabOrder := 0;\r
427     btAdd := TButton.Create( pnButtons );\r
428     with btAdd do\r
429     begin\r
430       Parent := pnButtons;\r
431       Left := 4;\r
432       Top := 4;\r
433       Width := 101;\r
434       Height := 25;\r
435       Caption := '&Add';\r
436       TabOrder := 0;\r
437       OnClick := btAddClick;\r
438     end;\r
439     btDel := TButton.Create( pnButtons );\r
440     with btDel do\r
441     begin\r
442       Parent := pnButtons;\r
443       Left := 4;\r
444       Top := 36;\r
445       Width := 101;\r
446       Height := 25;\r
447       Caption := '&Delete';\r
448       TabOrder := 1;\r
449       OnClick := btDelClick;\r
450     end;\r
451     btUp := TButton.Create( pnButtons );\r
452     with btUp do\r
453     begin\r
454       Parent := pnButtons;\r
455       Left := 4;\r
456       Top := 68;\r
457       Width := 49;\r
458       Height := 25;\r
459       Caption := '&Up';\r
460       TabOrder := 2;\r
461       OnClick := btUpClick;\r
462     end;\r
463     btDown := TButton.Create( pnButtons );\r
464     with btDown do\r
465     begin\r
466       Parent := pnButtons;\r
467       Left := 56;\r
468       Top := 68;\r
469       Width := 49;\r
470       Height := 25;\r
471       Caption := '&Down';\r
472       TabOrder := 3;\r
473       OnClick := btDownClick;\r
474     end;\r
475     chkStayOnTop := TCheckBox.Create( pnButtons );\r
476     with chkStayOnTop do\r
477     begin\r
478       Parent := pnButtons;\r
479       Left := 4;\r
480       Top := 100;\r
481       Width := 101;\r
482       Height := 17;\r
483       Caption := 'Stay On &Top';\r
484       TabOrder := 4;\r
485       OnClick := chkStayOnTopClick;\r
486     end;\r
487   end;\r
488   pnView := TPanel.Create( Self );\r
489   with pnView do\r
490   begin\r
491     Parent := Self;\r
492     Left := 0;\r
493     Top := 0;\r
494     Width := 150;\r
495     Height := 287;\r
496     Align := alClient;\r
497     BevelOuter := bvNone;\r
498     BorderWidth := 4;\r
499     TabOrder := 1;\r
500     lvActions := TListView.Create( pnView );\r
501     with lvActions do\r
502     begin\r
503       Parent := pnView;\r
504       Left := 4;\r
505       Top := 4;\r
506       Width := 142;\r
507       Height := 279;\r
508       Align := alClient;\r
509       Columns.Add;\r
510       HideSelection := False;\r
511       {$IFNDEF VER90}\r
512       RowSelect := True;\r
513       {$ENDIF}\r
514       ShowColumnHeaders := False;\r
515       TabOrder := 0;\r
516       ViewStyle := vsReport;\r
517       OnEdited := lvActionsEdited;\r
518       {$IFDEF OLDDELPHI}\r
519       OnChange := lvActionsChange;\r
520       {$ELSE}\r
521       OnSelectItem := lvActionsSelectItem;\r
522       {$ENDIF}\r
523     end;\r
524   end;\r
525 end;\r