home *** CD-ROM | disk | FTP | other *** search
- unit WABD_TreeEditor;
-
- {$I kbmWABD.inc}
-
- interface
-
- uses
- {$ifdef LEVEL6}
- DesignIntf,
- {$else}
- DsgnIntf,
- {$endif}
- Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
- Menus, ComCtrls, WABD_Objects;
-
- type
- TWABDTreeEditor = class(TForm)
- tv: TTreeView;
- puTv: TPopupMenu;
- mitvAdd: TMenuItem;
- mitvDelete: TMenuItem;
- mitvAddChild: TMenuItem;
- procedure mitvAddClick(Sender: TObject);
- procedure mitvAddChildClick(Sender: TObject);
- procedure mitvDeleteClick(Sender: TObject);
- procedure tvClick(Sender: TObject);
- procedure tvEdited(Sender: TObject; Node: TTreeNode; var S: String);
- private
- { Private declarations }
- function RecurseRenumberNodes(node:TTreeNode; no:integer):integer;
- public
- { Public declarations }
- {$ifdef LEVEL6}
- MyDesigner : IDesigner;
- {$else}
- {$ifdef LEVEL5}
- MyDesigner : IFormDesigner;
- {$else}
- {$ifdef LEVEL4}
- MyDesigner : IFormDesigner;
- {$else}
- {$ifdef LEVEL3}
- MyDesigner : TFormDesigner; // Delphi 3, C++ Builder 3
- {$endif}
- {$endif}
- {$endif}
- {$endif}
-
- ParTree : TWABD_Tree;
- procedure Init;
- function DeleteNode(node:TTreeNode):boolean;
- procedure RenumberNodes;
- end;
-
- var
- WABDTreeEditor: TWABDTreeEditor;
-
- implementation
-
- {$R *.DFM}
-
- procedure TWABDTreeEditor.mitvAddClick(Sender: TObject);
- var
- c : TWABD_TreeNode;
- begin
- c:=MyDesigner.CreateComponent(TWABD_TreeNode, ParTree.Owner, 0, 0, 0, 0) as TWABD_TreeNode;
- c.Parent := ParTree;
- c.Level := 0;
- c.Caption:=c.Name;
- tv.Selected:=tv.Items.AddObject(nil,c.Name,c);
- RenumberNodes;
-
- MyDesigner.Modified;
- MyDesigner.SelectComponent(c);
- end;
-
- procedure TWABDTreeEditor.mitvAddChildClick(Sender: TObject);
- var
- c,oc: TWABD_TreeNode;
- co:TComponent;
- begin
- if tv.Selected=nil then exit;
- co:=TComponent(tv.Selected.Data);
- oc:=co as TWABD_TreeNode;
-
- // Create child node.
- c:=MyDesigner.CreateComponent(TWABD_TreeNode, ParTree.Owner, 0, 0, 0, 0) as TWABD_TreeNode;
- c.Parent := ParTree;
- c.Level := oc.Level+1;
- c.Caption:=c.Name;
- tv.Selected:=tv.Items.AddChildObject(tv.Selected,c.Name,c);
- RenumberNodes;
-
- MyDesigner.Modified;
- MyDesigner.SelectComponent(c);
- end;
-
- // Delete node and all children. Recursive function.
- function TWABDTreeEditor.DeleteNode(node:TTreeNode):boolean;
- var
- i:integer;
- c:TComponent;
- begin
- for i:=0 to node.count-1 do
- begin
- DeleteNode(node.Item[i]);
- end;
- if node.Data<>nil then
- begin
- c:=TComponent(node.Data);
- (c as TWABD_TreeNode).free;
- end;
- node.Delete;
- result:=true;
- end;
-
-
- // Renumber TWABD_Treenodes in treeview.
- procedure TWABDTreeEditor.RenumberNodes;
- var
- no:integer;
- n:TTreeNode;
- begin
- n:=tv.TopItem;
- no:=0;
- while n<>nil do
- begin
- no:=RecurseRenumberNodes(n,no)+1;
- n:=n.GetNextSibling;
- end;
- end;
- function TWABDTreeEditor.RecurseRenumberNodes(node:TTreeNode; no:integer):integer;
- var
- c:TComponent;
- cn:TTreeNode;
- begin
- Result:=no;
- if node=nil then exit;
-
- c:=TComponent(node.Data);
- (c as TWABD_TreeNode).Order:=Result;
-
- cn:=node.GetFirstChild;
- while cn<>nil do
- begin
- Result:=RecurseRenumberNodes(cn,Result+1);
- cn:=node.GetNextChild(cn);
- end;
- end;
-
- procedure TWABDTreeEditor.mitvDeleteClick(Sender: TObject);
- begin
- if tv.Selected=nil then exit;
-
- DeleteNode(tv.Selected);
- if tv.TopItem<>nil then RenumberNodes;
- MyDesigner.Modified;
- end;
-
- procedure TWABDTreeEditor.tvClick(Sender: TObject);
- begin
- if tv.Selected=nil then exit;
- MyDesigner.SelectComponent(TComponent(tv.Selected.Data));
- end;
-
- // Define stuff in the tree for the treenodes for this tree.
- procedure TWABDTreeEditor.Init;
- var
- i : integer;
- c : TComponent;
- n : TWABD_TreeNode;
- tn : TTreeNode;
- ol : integer; // Old level.
- begin
- Assert(ParTree<>nil, 'ParTree = nil');
- tv.Items.Clear;
-
- // Build treeview from twabd_treenodes within this twabd_tree.
- ol:=-1;
- tn:=nil;
- for i := 0 to ParTree.ChildCount-1 do begin
- c := ParTree.Children[i];
- Assert(c<>nil, 'c = nil');
-
- n := c as TWABD_TreeNode;
-
- // Check level of node to determine how to add it.
- if n.Level = 0 then // If top level.
- tn:=tv.Items.AddObject(nil,n.Caption,n)
- else if n.Level > ol then // if child of prev node.
- tn:=tv.Items.AddChildObject(tn,n.Caption,n)
- else if n.Level < ol then // if sibling of another lesser level, backtrack.
- begin
- while tn.level > n.Level do tn:=tn.Parent;
- tn:=tv.Items.AddChildObject(tn.Parent,n.Caption,n);
- end
- else // if sibling of prev node.
- tn:=tv.Items.AddObject(tn,n.Caption,n);
- ol:=n.Level;
- end;
- end;
-
- // Edited caption.
- procedure TWABDTreeEditor.tvEdited(Sender: TObject; Node: TTreeNode;
- var S: String);
- var
- c:TComponent;
- begin
- c:=TComponent(Node.Data);
- if c<>nil then
- with (c as TWABD_TreeNode) do
- begin
- caption:=S;
- changed;
- end;
- MyDesigner.SelectComponent(nil);
- MyDesigner.SelectComponent(c);
- end;
-
- end.
-