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 >
Pascal/Delphi Source File  |  2001-07-15  |  5KB  |  221 lines

  1. unit WABD_TreeEditor;
  2.  
  3. {$I kbmWABD.inc}
  4.  
  5. interface
  6.  
  7. uses
  8. {$ifdef LEVEL6}
  9.   DesignIntf,
  10. {$else}
  11.   DsgnIntf,
  12. {$endif}
  13.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  14.   Menus, ComCtrls, WABD_Objects;
  15.  
  16. type
  17.   TWABDTreeEditor = class(TForm)
  18.     tv: TTreeView;
  19.     puTv: TPopupMenu;
  20.     mitvAdd: TMenuItem;
  21.     mitvDelete: TMenuItem;
  22.     mitvAddChild: TMenuItem;
  23.     procedure mitvAddClick(Sender: TObject);
  24.     procedure mitvAddChildClick(Sender: TObject);
  25.     procedure mitvDeleteClick(Sender: TObject);
  26.     procedure tvClick(Sender: TObject);
  27.     procedure tvEdited(Sender: TObject; Node: TTreeNode; var S: String);
  28.   private
  29.     { Private declarations }
  30.     function RecurseRenumberNodes(node:TTreeNode; no:integer):integer;
  31.   public
  32.     { Public declarations }
  33. {$ifdef LEVEL6}
  34.     MyDesigner   : IDesigner;
  35. {$else}
  36.  {$ifdef LEVEL5}
  37.     MyDesigner   : IFormDesigner;
  38.  {$else}
  39.   {$ifdef LEVEL4}
  40.     MyDesigner   : IFormDesigner;
  41.   {$else}
  42.    {$ifdef LEVEL3}
  43.     MyDesigner   : TFormDesigner; // Delphi 3, C++ Builder 3
  44.    {$endif}
  45.   {$endif}
  46.  {$endif}
  47. {$endif}
  48.  
  49.     ParTree     : TWABD_Tree;
  50.     procedure Init;
  51.     function DeleteNode(node:TTreeNode):boolean;
  52.     procedure RenumberNodes;
  53.   end;
  54.  
  55. var
  56.   WABDTreeEditor: TWABDTreeEditor;
  57.  
  58. implementation
  59.  
  60. {$R *.DFM}
  61.  
  62. procedure TWABDTreeEditor.mitvAddClick(Sender: TObject);
  63. var
  64.    c    : TWABD_TreeNode;
  65. begin
  66.      c:=MyDesigner.CreateComponent(TWABD_TreeNode, ParTree.Owner, 0, 0, 0, 0) as TWABD_TreeNode;
  67.      c.Parent := ParTree;
  68.      c.Level := 0;
  69.      c.Caption:=c.Name;
  70.      tv.Selected:=tv.Items.AddObject(nil,c.Name,c);
  71.      RenumberNodes;
  72.  
  73.      MyDesigner.Modified;
  74.      MyDesigner.SelectComponent(c);
  75. end;
  76.  
  77. procedure TWABDTreeEditor.mitvAddChildClick(Sender: TObject);
  78. var
  79.    c,oc: TWABD_TreeNode;
  80.    co:TComponent;
  81. begin
  82.      if tv.Selected=nil then exit;
  83.      co:=TComponent(tv.Selected.Data);
  84.      oc:=co as TWABD_TreeNode;
  85.  
  86.      // Create child node.
  87.      c:=MyDesigner.CreateComponent(TWABD_TreeNode, ParTree.Owner, 0, 0, 0, 0) as TWABD_TreeNode;
  88.      c.Parent := ParTree;
  89.      c.Level := oc.Level+1;
  90.      c.Caption:=c.Name;
  91.      tv.Selected:=tv.Items.AddChildObject(tv.Selected,c.Name,c);
  92.      RenumberNodes;
  93.  
  94.      MyDesigner.Modified;
  95.      MyDesigner.SelectComponent(c);
  96. end;
  97.  
  98. // Delete node and all children. Recursive function.
  99. function TWABDTreeEditor.DeleteNode(node:TTreeNode):boolean;
  100. var
  101.    i:integer;
  102.    c:TComponent;
  103. begin
  104.      for i:=0 to node.count-1 do
  105.      begin
  106.           DeleteNode(node.Item[i]);
  107.      end;
  108.      if node.Data<>nil then
  109.      begin
  110.           c:=TComponent(node.Data);
  111.           (c as TWABD_TreeNode).free;
  112.      end;
  113.      node.Delete;
  114.      result:=true;
  115. end;
  116.  
  117.  
  118. // Renumber TWABD_Treenodes in treeview.
  119. procedure TWABDTreeEditor.RenumberNodes;
  120. var
  121.    no:integer;
  122.    n:TTreeNode;
  123. begin
  124.      n:=tv.TopItem;
  125.      no:=0;
  126.      while n<>nil do
  127.      begin
  128.           no:=RecurseRenumberNodes(n,no)+1;
  129.           n:=n.GetNextSibling;
  130.      end;
  131. end;
  132. function TWABDTreeEditor.RecurseRenumberNodes(node:TTreeNode; no:integer):integer;
  133. var
  134.    c:TComponent;
  135.    cn:TTreeNode;
  136. begin
  137.      Result:=no;
  138.      if node=nil then exit;
  139.  
  140.      c:=TComponent(node.Data);
  141.      (c as TWABD_TreeNode).Order:=Result;
  142.  
  143.      cn:=node.GetFirstChild;
  144.      while cn<>nil do
  145.      begin
  146.           Result:=RecurseRenumberNodes(cn,Result+1);
  147.           cn:=node.GetNextChild(cn);
  148.      end;
  149. end;
  150.  
  151. procedure TWABDTreeEditor.mitvDeleteClick(Sender: TObject);
  152. begin
  153.      if tv.Selected=nil then exit;
  154.  
  155.      DeleteNode(tv.Selected);
  156.      if tv.TopItem<>nil then RenumberNodes;
  157.      MyDesigner.Modified;
  158. end;
  159.  
  160. procedure TWABDTreeEditor.tvClick(Sender: TObject);
  161. begin
  162.      if tv.Selected=nil then exit;
  163.      MyDesigner.SelectComponent(TComponent(tv.Selected.Data));
  164. end;
  165.  
  166. // Define stuff in the tree for the treenodes for this tree.
  167. procedure TWABDTreeEditor.Init;
  168. var
  169.    i  : integer;
  170.    c  : TComponent;
  171.    n  : TWABD_TreeNode;
  172.    tn : TTreeNode;
  173.    ol : integer;       // Old level.
  174. begin
  175.    Assert(ParTree<>nil, 'ParTree = nil');
  176.    tv.Items.Clear;
  177.  
  178.    // Build treeview from twabd_treenodes within this twabd_tree.
  179.    ol:=-1;
  180.    tn:=nil;
  181.    for i := 0 to ParTree.ChildCount-1 do begin
  182.       c := ParTree.Children[i];
  183.       Assert(c<>nil, 'c = nil');
  184.  
  185.       n := c as TWABD_TreeNode;
  186.  
  187.       // Check level of node to determine how to add it.
  188.       if n.Level = 0 then // If top level.
  189.          tn:=tv.Items.AddObject(nil,n.Caption,n)
  190.       else if n.Level > ol then // if child of prev node.
  191.          tn:=tv.Items.AddChildObject(tn,n.Caption,n)
  192.       else if n.Level < ol then // if sibling of another lesser level, backtrack.
  193.       begin
  194.            while tn.level > n.Level do tn:=tn.Parent;
  195.            tn:=tv.Items.AddChildObject(tn.Parent,n.Caption,n);
  196.       end
  197.       else                      // if sibling of prev node.
  198.           tn:=tv.Items.AddObject(tn,n.Caption,n);
  199.       ol:=n.Level;
  200.    end;
  201. end;
  202.  
  203. // Edited caption.
  204. procedure TWABDTreeEditor.tvEdited(Sender: TObject; Node: TTreeNode;
  205.   var S: String);
  206. var
  207.    c:TComponent;
  208. begin
  209.      c:=TComponent(Node.Data);
  210.      if c<>nil then
  211.         with (c as TWABD_TreeNode) do
  212.         begin
  213.              caption:=S;
  214.              changed;
  215.         end;
  216.      MyDesigner.SelectComponent(nil);
  217.      MyDesigner.SelectComponent(c);
  218. end;
  219.  
  220. end.
  221.