home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2001 October
/
Chip_2001-10_cd1.bin
/
zkuste
/
delphi
/
nastroje
/
d3456
/
KBMWABD.ZIP
/
WABD_TreeEditor.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
2001-07-15
|
5KB
|
221 lines
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.