4 TKOLMenuDesign = class(TForm)
\r
14 chbStayOnTop: TCheckBox;
\r
15 procedure btInsertClick(Sender: TObject);
\r
16 procedure tvMenuChange(Sender: TObject; Node: TTreeNode);
\r
17 procedure btAddClick(Sender: TObject);
\r
18 procedure btSubmenuClick(Sender: TObject);
\r
19 procedure btDeleteClick(Sender: TObject);
\r
20 procedure btOKClick(Sender: TObject);
\r
21 procedure chbStayOnTopClick(Sender: TObject);
\r
22 procedure btUpClick(Sender: TObject);
\r
23 procedure btDownClick(Sender: TObject);
\r
25 FMenuComponent: TComponent;
\r
26 procedure FormDestroy(Sender: TObject);
\r
27 procedure FormClose(Sender: TObject; var Action: TCloseAction);
\r
28 procedure FormKeyDown(Sender: TObject; var Key: Word;
\r
29 Shift: TShiftState);
\r
30 procedure Set_Menu(const Value: TComponent);
\r
31 { Private declarations }
\r
32 procedure NewItem( Insert, SubItem: Boolean );
\r
33 procedure CheckButtons;
\r
34 function MenuItemTitle( MI: TComponent ): String;
\r
36 { Public declarations }
\r
37 Constructor Create( AOwner: TComponent ); override;
\r
38 property MenuComponent: TComponent read FMenuComponent write Set_Menu;
\r
39 procedure MakeActive;
\r
40 procedure RefreshItems;
\r
44 KOLMenuDesign: TKOLMenuDesign;
\r
52 //{$R MckMenuEdArrows.res}
\r
56 procedure TKOLMenuDesign.MakeActive;
\r
57 var MI: TKOLMenuItem;
\r
62 if tvMenu.Items.Count > 0 then
\r
63 if tvMenu.Selected = nil then
\r
64 tvMenu.Selected := tvMenu.Items[ 0 ];
\r
65 if tvMenu.Selected <> nil then
\r
67 MI := tvMenu.Selected.Data;
\r
68 if MI = nil then Exit;
\r
69 // set here MI as a current component in Object Inspector
\r
70 F := (MenuComponent as TKOLMenu).ParentForm;
\r
73 //*///////////////////////////////////////////////////////
\r
74 {$IFDEF _D6orHigher} //
\r
75 F.Designer.QueryInterface(IFormDesigner,D); //
\r
77 //*///////////////////////////////////////////////////////
\r
79 //*///////////////////////////////////////////////////////
\r
81 //*///////////////////////////////////////////////////////
\r
83 if QueryFormDesigner( D, FD ) then
\r
85 RemoveSelection( FD );
\r
86 FD.SelectComponent( MI );
\r
93 procedure TKOLMenuDesign.Set_Menu(const Value: TComponent);
\r
98 procedure AddItem( Node: TTreeNode; MI: TKOLMenuItem );
\r
99 var NewNode: TTreeNode;
\r
102 NewNode := tvMenu.Items.AddChild( Node, MenuItemTitle( MI ) );
\r
103 NewNode.Data := MI;
\r
104 for I := 0 to MI.Count - 1 do
\r
105 AddItem( NewNode, MI.SubItems[ I ] );
\r
109 FMenuComponent := Value;
\r
110 M := Value as TKOLMenu;
\r
111 tvMenu.HandleNeeded;
\r
112 tvMenu.Items.BeginUpdate;
\r
115 tvMenu.Items.Clear;
\r
116 for I := 0 to M.Count - 1 do
\r
118 MI := M.Items[ I ];
\r
119 AddItem( nil, MI );
\r
122 if tvMenu.Items.Count > 0 then
\r
125 tvMenu.Items.EndUpdate;
\r
127 {$IFNDEF _D5orD6} // Bug in earlier Delphi2..Delphi4
\r
128 tvMenu.Items.EndUpdate;
\r
135 procedure TKOLMenuDesign.btInsertClick(Sender: TObject);
\r
137 NewItem( True, False );
\r
140 procedure TKOLMenuDesign.FormDestroy(Sender: TObject);
\r
143 if MenuComponent <> nil then
\r
145 M := MenuComponent as TKOLMenu;
\r
146 M.ActiveDesign := nil;
\r
151 procedure TKOLMenuDesign.tvMenuChange(Sender: TObject; Node: TTreeNode);
\r
157 procedure TKOLMenuDesign.CheckButtons;
\r
159 btDelete.Enabled := (tvMenu.Selected <> nil) and (tvMenu.Selected.Count = 0);
\r
160 btSubmenu.Enabled := (tvMenu.Selected <> nil) and (tvMenu.Selected.Count = 0);
\r
161 btUp.Enabled := (tvMenu.Selected <> nil) and (tvMenu.Selected.GetPrevSibling <> nil);
\r
162 btDown.Enabled := (tvMenu.Selected <> nil) and (tvMenu.Selected.GetNextSibling <> nil);
\r
165 procedure TKOLMenuDesign.NewItem(Insert, Subitem: Boolean);
\r
166 var N, NN: TTreeNode;
\r
170 AParent: TKOLMenuItem;
\r
172 N := tvMenu.Selected;
\r
173 if (N = nil) and (tvMenu.Items.Count > 0) then Exit;
\r
175 if (N = nil) or (N.Parent = nil) and not SubItem then
\r
178 if (N <> nil) and SubItem then
\r
181 C := N.Parent.Data;
\r
183 if (N <> nil) and not Subitem and not Insert then
\r
184 if N.GetNextSibling <> nil then
\r
187 N := N.GetNextSibling;
\r
191 if C is TKOLMenuItem then
\r
192 AParent := C as TKOLMenuItem;
\r
193 if Subitem or (N = nil) then
\r
194 MI := TKOLMenuItem.Create( MenuComponent, AParent, nil )
\r
196 if not Insert and (N.GetNextSibling = nil) then
\r
197 MI := TKOLMenuItem.Create( MenuComponent, AParent, nil )
\r
199 MI := TKOLMenuItem.Create( MenuComponent, AParent, N.Data );
\r
201 for I := 1 to MaxInt do
\r
203 if MenuComponent <> nil then
\r
204 if (MenuComponent as TKOLMenu).NameAlreadyUsed( 'N' + IntToStr( I ) ) then
\r
206 MI.Name := 'N' + IntToStr( I );
\r
210 if (N = nil) or (not Insert and not SubItem) then
\r
211 NN := tvMenu.Items.Add( N, '[ ' + MI.Name + ' ]' )
\r
213 if not Subitem then
\r
214 NN := tvMenu.Items.Insert( N, '[ ' + MI.Name + ' ]' )
\r
217 NN := tvMenu.Items.AddChild( N, '[ ' + MI.Name + ' ]' );
\r
222 tvMenu.Selected := NN;
\r
227 procedure TKOLMenuDesign.RefreshItems;
\r
232 for I := 0 to tvMenu.Items.Count - 1 do
\r
234 N := tvMenu.Items[ I ];
\r
237 N.Text := MenuItemTitle( MI );
\r
241 procedure TKOLMenuDesign.btAddClick(Sender: TObject);
\r
243 NewItem( False, False );
\r
246 procedure TKOLMenuDesign.btSubmenuClick(Sender: TObject);
\r
248 NewItem( False, True );
\r
251 procedure TKOLMenuDesign.btDeleteClick(Sender: TObject);
\r
252 var N, NN: TTreeNode;
\r
259 N := tvMenu.Selected;
\r
260 if N = nil then Exit;
\r
262 Rpt( 'Deleting: ' + S );
\r
264 if MI = nil then Exit;
\r
265 NN := N.GetNextSibling;
\r
267 NN := N.GetPrevSibling;
\r
272 if MenuComponent <> nil then
\r
274 F := (MenuComponent as TKOLMenu).ParentForm;
\r
277 //*///////////////////////////////////////////////////////
\r
278 {$IFDEF _D6orHigher} //
\r
279 F.Designer.QueryInterface(IFormDesigner,D); //
\r
281 //*///////////////////////////////////////////////////////
\r
283 //*///////////////////////////////////////////////////////
\r
285 //*///////////////////////////////////////////////////////
\r
287 if QueryFormDesigner( D, FD ) then
\r
289 RemoveSelection( FD );
\r
290 FD.SelectComponent( MenuComponent );
\r
296 Rpt( 'Deleted: ' + S );
\r
299 Rpt( 'ITEM Destroyed: ' + S );
\r
302 tvMenu.Selected := NN;
\r
303 Rpt( 'Selected: ' + IntToStr( Integer( NN ) ) );
\r
305 if MenuComponent <> nil then
\r
307 (MenuComponent as TKOLMenu).Change;
\r
308 Rpt( 'Changed: ' + MenuComponent.Name );
\r
311 Rpt( 'Buttons checked. Deleting of ' + S + ' finished.' );
\r
314 procedure TKOLMenuDesign.btOKClick(Sender: TObject);
\r
319 function TKOLMenuDesign.MenuItemTitle(MI: TComponent): String;
\r
321 Result := (MI as TKOLMenuITem).Caption;
\r
322 if Result = '' then
\r
323 Result := '[ ' + MI.Name + ' ]';
\r
326 procedure TKOLMenuDesign.FormClose(Sender: TObject;
\r
327 var Action: TCloseAction);
\r
332 if MenuComponent <> nil then
\r
334 Rpt( 'Closing KOLMenuEditor form' );
\r
335 F := (MenuComponent as TKOLMenu).ParentForm;
\r
338 Rpt( 'Form found: ' + F.Name );
\r
339 //*///////////////////////////////////////////////////////
\r
340 {$IFDEF _D6orHigher} //
\r
341 F.Designer.QueryInterface(IFormDesigner,D); //
\r
343 //*///////////////////////////////////////////////////////
\r
345 //*///////////////////////////////////////////////////////
\r
347 //*///////////////////////////////////////////////////////
\r
350 Rpt( 'IDesigner interface returned' );
\r
351 if QueryFormDesigner( D, FD ) then
\r
353 Rpt( 'IFormDesigner interface quered' );
\r
355 RemoveSelection( FD );
\r
356 FD.SelectComponent( MenuComponent );
\r
358 Rpt( 'EXCEPTION *** Could not clear selection!' )
\r
366 procedure TKOLMenuDesign.chbStayOnTopClick(Sender: TObject);
\r
368 if chbStayOnTop.Checked then
\r
369 FormStyle := fsStayOnTop
\r
371 FormStyle := fsNormal;
\r
374 procedure TKOLMenuDesign.btUpClick(Sender: TObject);
\r
375 var CurNode: TTreeNode;
\r
376 CurMI: TKOLMenuItem;
\r
379 CurNode := tvMenu.Selected;
\r
380 if CurNode = nil then Exit;
\r
381 if CurNode.GetPrevSibling = nil then Exit;
\r
382 CurMI := CurNode.Data;
\r
383 if CurMI = nil then Exit;
\r
384 if MenuComponent = nil then Exit;
\r
385 if not(MenuComponent is TKOLMenu) then Exit;
\r
387 CurNode.MoveTo( CurNode.GetPrevSibling, naInsert );
\r
388 AC := ActiveControl;
\r
391 if not btUp.Enabled then
\r
392 PostMessage( Handle, WM_NEXTDLGCTL, 0, 0 );
\r
395 procedure TKOLMenuDesign.btDownClick(Sender: TObject);
\r
396 var CurNode: TTreeNode;
\r
397 CurMI: TKOLMenuItem;
\r
400 CurNode := tvMenu.Selected;
\r
401 if CurNode = nil then Exit;
\r
402 if CurNode.GetNextSibling = nil then Exit;
\r
403 CurMI := CurNode.Data;
\r
404 if CurMI = nil then Exit;
\r
405 if MenuComponent = nil then Exit;
\r
406 if not(MenuComponent is TKOLMenu) then Exit;
\r
408 if CurNode.GetNextSibling.GetNextSibling = nil then
\r
409 CurNode.MoveTo( CurNode.GetNExtSibling, naAdd )
\r
411 CurNode.MoveTo( CurNode.GetNextSibling.GetNextSibling, naInsert );
\r
412 AC := ActiveControl;
\r
414 if AC = btDown then
\r
415 if not btDown.Enabled then
\r
416 PostMessage( Handle, WM_NEXTDLGCTL, 0, 0 );
\r
419 procedure TKOLMenuDesign.FormKeyDown(Sender: TObject; var Key: Word;
\r
420 Shift: TShiftState);
\r
424 if btDelete.Enabled then
\r
427 if btInsert.Enabled then
\r
430 if GetKeyState( VK_CONTROL ) < 0 then
\r
431 if btUp.Enabled then
\r
434 if GetKeyState( VK_CONTROL ) < 0 then
\r
435 if btDown.Enabled then
\r
439 if (tvMenu.Selected <> nil) and (tvMenu.Selected.Count = 0) then
\r
441 if btSubmenu.Enabled then
\r
446 if ActiveControl <> tvMenu then
\r
451 {if ActiveControl <> tvMenu then
\r
457 constructor TKOLMenuDesign.Create(AOwner: TComponent);
\r
462 BorderIcons := [biSystemMenu, biMinimize];
\r
463 BorderStyle := bsToolWindow ;
\r
464 ClientHeight := 299 ;
\r
465 ClientWidth := 343 ;
\r
466 //Color := clBtnFace ;
\r
467 //Font.Charset := DEFAULT_CHARSET ;
\r
468 //Font.Color := clWindowText ;
\r
469 //Font.Height := -11 ;
\r
470 //Font.Name := 'MS Sans Serif' ;
\r
471 //Font.Style := [] ;
\r
472 KeyPreview := True ;
\r
473 //OldCreateOrder := False ;
\r
475 Position := poDesktopCenter ;
\r
478 Position := poScreenCenter ;
\r
482 OnClose := FormClose ;
\r
483 OnDestroy := FormDestroy ;
\r
484 OnKeyDown := FormKeyDown ;
\r
485 //PixelsPerInch := 96 ;
\r
486 //TextHeight := 13 ;
\r
488 tvMenu := TTreeView.Create( Self ) ;
\r
489 tvMenu.Parent := Self ;
\r
492 tvMenu.Width := 227 ;
\r
493 tvMenu.Height := 285 ;
\r
494 tvMenu.HideSelection := False ;
\r
495 //tvMenu.Indent := 19 ;
\r
496 tvMenu.ReadOnly := True ;
\r
497 //tvMenu.TabOrder := 0 ;
\r
498 tvMenu.OnChange := tvMenuChange ;
\r
500 btOK := TButton.Create( Self ) ;
\r
501 btOK.Parent := Self;
\r
505 btOK.Height := 25 ;
\r
506 btOK.Caption := 'Close' ;
\r
507 //btOK.TabOrder := 1 ;
\r
508 btOK.OnClick := btOKClick ;
\r
510 btUp := TBitBtn.Create( Self ) ;
\r
511 btUp.Parent := Self;
\r
515 btUp.Height := 27 ;
\r
516 btUp.Enabled := False ;
\r
517 //btUp.TabOrder := 2 ;
\r
518 btUp.OnClick := btUpClick ;
\r
519 btUp.Glyph.Handle := LoadBitmap( hInstance, 'MCKARROWUP' );
\r
521 btDown := TBitBtn.Create( Self ) ;
\r
522 btDown.Parent := Self;
\r
523 btDown.Left := 295 ;
\r
525 btDown.Width := 40 ;
\r
526 btDown.Height := 27 ;
\r
527 btDown.Enabled := False ;
\r
528 //btDown.TabOrder := 3 ;
\r
529 btDown.OnClick := btDownClick ;
\r
530 btDown.Glyph.Handle := LoadBitmap( hInstance, 'MCKARROWDN' );
\r
532 btInsert := TButton.Create( Self ) ;
\r
533 btInsert.Parent := Self;
\r
534 btInsert.Left := 244 ;
\r
535 btInsert.Top := 170 ;
\r
536 btInsert.Width := 91 ;
\r
537 btInsert.Height := 25 ;
\r
538 btInsert.Caption := 'Insert' ;
\r
539 //btInsert.TabOrder := 4 ;
\r
540 btInsert.OnClick := btInsertClick ;
\r
542 btAdd := TButton.Create( Self ) ;
\r
543 btAdd.Parent := Self;
\r
544 btAdd.Left := 244 ;
\r
546 btAdd.Width := 91 ;
\r
547 btAdd.Height := 25 ;
\r
548 btAdd.Caption := 'Add' ;
\r
549 //btAdd.TabOrder := 5 ;
\r
550 btAdd.OnClick := btAddClick ;
\r
552 btDelete := TButton.Create( Self ) ;
\r
553 btDelete.Parent := Self;
\r
554 btDelete.Left := 244 ;
\r
555 btDelete.Top := 234 ;
\r
556 btDelete.Width := 91 ;
\r
557 btDelete.Height := 25 ;
\r
558 btDelete.Caption := 'Delete' ;
\r
559 btDelete.Enabled := False ;
\r
560 //btDelete.TabOrder := 6 ;
\r
561 btDelete.OnClick := btDeleteClick ;
\r
563 btSubmenu := TButton.Create( Self ) ;
\r
564 btSubMenu.Parent := Self;
\r
565 btSubmenu.Left := 244 ;
\r
566 btSubmenu.Top := 266 ;
\r
567 btSubmenu.Width := 91 ;
\r
568 btSubmenu.Height := 25 ;
\r
569 btSubmenu.Caption := 'New submenu' ;
\r
570 btSubmenu.Enabled := False ;
\r
571 //btSubmenu.TabOrder := 7 ;
\r
572 btSubmenu.OnClick := btSubmenuClick ;
\r
574 chbStayOnTop := TCheckBox.Create( Self ) ;
\r
575 chbStayOnTop.Parent := Self;
\r
576 chbStayOnTop.Left := 244 ;
\r
577 chbStayOnTop.Top := 40 ;
\r
578 chbStayOnTop.Width := 91 ;
\r
579 chbStayOnTop.Height := 17 ;
\r
580 chbStayOnTop.Caption := 'Stay On Top' ;
\r
581 //chbStayOnTop.TabOrder := 8 ;
\r
582 chbStayOnTop.OnClick := chbStayOnTopClick;
\r