home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 December / Chip_2001-12_cd1.bin / zkuste / delphi / kompon / d3456 / DATRVIEW.ZIP / uDATreeView.pas < prev   
Pascal/Delphi Source File  |  2001-09-14  |  6KB  |  230 lines

  1. {*****************************************************************************
  2.  *
  3.  *  DATreeView.pas - My TreeView
  4.  *
  5.  *  Copyright (c) 2000-1 Diego Amicabile
  6.  *
  7.  *  Author:     Diego Amicabile
  8.  *  E-mail:     diegoami@yahoo.it
  9.  *  Homepage:   http://www.geocities.com/diegoami
  10.  *
  11.  *  This component is free software; you can redistribute it and/or
  12.  *  modify it under the terms of the GNU General Public License
  13.  *  as published by the Free Software Foundation;
  14.  *
  15.  *  This component is distributed in the hope that it will be useful,
  16.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  *  GNU General Public License for more details.
  19.  *
  20.  *  You should have received a copy of the GNU General Public License
  21.  *  along with this component; if not, write to the Free Software
  22.  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA
  23.  *
  24.  *****************************************************************************}
  25.  
  26. unit uDATreeView;
  27.  
  28. interface
  29.  
  30. uses
  31.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  32.   ComCtrls;
  33.  
  34. type
  35.   TOnDragNodeEvent = procedure(Sender : TObject; Source, Destination : TTreeNode) of object;
  36.  
  37.   TDATreeView = class(TTreeView)
  38.   private
  39.     FOnDeleteNode : TTVChangedEvent;
  40.     FCutNode : TTreeNode;
  41.     FCutNodes : TList;
  42.     FOnDragNodeEvent : TOnDragNodeEvent;
  43.     FDragDropEnabled : Boolean;
  44.     FCustomDragDrop
  45.      : Boolean;
  46.     NodDrag : TTreeNode;
  47.  
  48.   protected
  49.  
  50.  
  51.     procedure DeleteNodeContent(Node : TTreeNode);
  52.     procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
  53.       X, Y: Integer); override;
  54.     procedure DragOver(Source: TObject; X, Y: Integer; State: TDragState;
  55.       var Accept: Boolean); override;
  56.   public
  57.     procedure DragDrop(Source: TObject; X, Y: Integer); override;
  58.     procedure DeleteNode(Node : TTreeNode);
  59.  
  60.     procedure ClearAll;
  61.     constructor Create(AOwner : TComponent); override;
  62.     procedure CutNodes(Nodes : TList);
  63.     procedure CutNode(Node : TTreeNode);
  64.     procedure PasteNodeAt(Node : TTreeNode);
  65.   published
  66.     property DragDropEnabled : Boolean read FDragDropEnabled write FDragDropEnabled;
  67.     property CustomDragDrop : Boolean read FCustomDragDrop write FCustomDragDrop;
  68.     property OnDeleteNode : TTVChangedEvent read FOnDeleteNode write FOnDeleteNode;
  69.     property OnDragNodeEvent : TOnDragNodeEvent read FOnDragNodeEvent write FOnDragNodeEvent;
  70.   end;
  71.  
  72. procedure Register;
  73.  
  74. implementation
  75.  
  76. constructor TDATreeView.Create(AOwner : TComponent);
  77. begin
  78.   inherited;
  79.  
  80.  
  81. end;
  82.  
  83. procedure TDATreeView.DeleteNode(Node : TTreeNode);
  84. var i : integer;
  85.   DelNode : TTreeNode;
  86. begin
  87.  
  88.   for i := Node.Count - 1 downto 0 do begin
  89.     DelNode := Node.Item[i];
  90.     DeleteNode(DelNode);
  91.   end;
  92.   DeleteNodeContent(Node);
  93.  
  94.   Items.Delete(Node);
  95.  
  96.   Node := nil;
  97.  
  98.  
  99. end;
  100.  
  101. procedure TDATreeView.ClearAll;
  102. var i : integer;
  103. begin
  104.   for i := Items.Count-1 downto 0 do
  105.     DeleteNode(Items[i]);
  106.   Items.Clear;
  107. end;
  108.  
  109.  
  110. procedure TDATreeView.DeleteNodeContent(Node : TTreeNode);
  111. begin
  112.   if Assigned(FOnDeleteNode) then
  113.     FOnDeleteNode(Self,Node);
  114. end;
  115.  
  116. procedure TDATreeView.CutNodes(Nodes : TList);
  117. var i : integer;
  118.     Node : TTreeNode;
  119. begin
  120.   if (Nodes <> nil) then begin
  121.     for i := 0 to Nodes.Count-1 do begin
  122.       Node := TTreeNode(Nodes.Items[i]);
  123.       Node.Cut := False;
  124.     end;
  125.   end;
  126.   FCutNodes := Nodes;
  127.   for i := 0 to Nodes.Count-1 do begin
  128.       Node := TTreeNode(Nodes.Items[i]);
  129.       Node.Cut := True;
  130.   end;
  131.  
  132. end;
  133.  
  134.  
  135.  
  136. procedure TDATreeView.CutNode(Node : TTreeNode);
  137. begin
  138.   if (FCutNode <> nil) and (FCutNode.Owner <> nil) and (FCutNode.Parent <> nil) and (FCutNode.TreeView <> nil) then
  139.     FCutNode.Cut := False;
  140.  
  141.   FCutNode := Node;
  142.   FCutNode.Cut := True;
  143. end;
  144.  
  145.  
  146. procedure TDATreeView.PasteNodeAt(Node : TTreeNode);
  147.  
  148.   procedure PasteNodeRoutine(FromNode, ToNode : TTreeNode);
  149.   var i : integer;
  150.       NewNode : TTreeNode;
  151.  
  152.   begin
  153.     NewNode := Items.AddChildObject(ToNode, FromNode.Text, FromNode.Data);
  154.     NewNode.ImageIndex := FromNode.ImageIndex;
  155.     NewNode.SelectedIndex := FromNode.SelectedIndex;
  156.     for i := 0 to FromNode.Count-1 do
  157.       PasteNodeRoutine(FromNode.Item[i],NewNode)
  158.   end;
  159.  
  160. var i : integer;
  161.      TempNode : TTreeNode;
  162. begin
  163.   if (FCutNode <> nil) and (FCutNode <> Node) then begin
  164.           FCutNode.Cut := false;
  165.  
  166.         PasteNodeRoutine(FCutNode,Node);
  167.         DeleteNode(FCutNode);
  168.         FCutNode := nil;
  169.  
  170.   end else begin
  171.     for i := 0 to FCutNodes.Count-1 do begin
  172.       TempNode := TTreeNode(FCutNodes.Items[i]);
  173.       PasteNodeRoutine(TempNode,Node);
  174.       DeleteNode(TempNode);
  175.  
  176.     end;
  177.     FCutnodes := nil;
  178.   end;
  179.  
  180. end;
  181.  
  182. procedure TDATreeView.MouseDown(Button: TMouseButton; Shift: TShiftState;
  183.   X, Y: Integer);
  184.  var HT : THitTests;
  185. begin
  186.   inherited;
  187.   if Button = mbLeft then begin
  188.  
  189.     nodDrag := GetNodeAt(X,Y);
  190.     HT := GetHitTestInfoAt(X, Y);
  191.  
  192.    if (nodDrag <> nil) and (DragDropEnabled) and (HT - [htOnItem] <> HT) then
  193.        BeginDrag(false, Mouse.DragThreshold+2);
  194.   end;
  195. end;
  196.  
  197. procedure TDATreeView.DragDrop(Source: TObject; X, Y: Integer);
  198. var NodX : TTreeNode;
  199.     HT : THitTests;
  200. begin
  201.   if Source is TTreeView then begin
  202.     HT := GetHitTestInfoAt(X, Y);
  203.     NodX := TTreeView(Source).GetNodeAt(X,Y);
  204.     if (NodX <> nil) and (HT - [htOnIcon,htOnItem, htOnLabel] <> HT) then
  205.       if (FCustomDragDrop) and (Assigned(FOnDragNodeEvent)) then
  206.         FOnDragNodeEvent(Self,NodDrag, NodX)
  207.       else begin
  208.         CutNode(NodDrag);
  209.         PasteNodeAt(Nodx);
  210.       end;
  211.  
  212.   end;
  213.   inherited;
  214. end;
  215.  
  216. procedure TDATreeView.DragOver(Source: TObject; X, Y: Integer;
  217.   State: TDragState; var Accept: Boolean);
  218. begin
  219.   inherited;
  220.   Accept := Accept or ((Source is TTreeView) and DragDropEnabled);
  221. end;
  222.  
  223.  
  224. procedure Register;
  225. begin
  226.   RegisterComponents('Diego Amicabile', [TDATreeView]);
  227. end;
  228.  
  229. end.
  230.