home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2001 December
/
Chip_2001-12_cd1.bin
/
zkuste
/
delphi
/
kompon
/
d3456
/
DATRVIEW.ZIP
/
uDATreeView.pas
< prev
Wrap
Pascal/Delphi Source File
|
2001-09-14
|
6KB
|
230 lines
{*****************************************************************************
*
* DATreeView.pas - My TreeView
*
* Copyright (c) 2000-1 Diego Amicabile
*
* Author: Diego Amicabile
* E-mail: diegoami@yahoo.it
* Homepage: http://www.geocities.com/diegoami
*
* This component is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation;
*
* This component is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this component; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
*****************************************************************************}
unit uDATreeView;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls;
type
TOnDragNodeEvent = procedure(Sender : TObject; Source, Destination : TTreeNode) of object;
TDATreeView = class(TTreeView)
private
FOnDeleteNode : TTVChangedEvent;
FCutNode : TTreeNode;
FCutNodes : TList;
FOnDragNodeEvent : TOnDragNodeEvent;
FDragDropEnabled : Boolean;
FCustomDragDrop
: Boolean;
NodDrag : TTreeNode;
protected
procedure DeleteNodeContent(Node : TTreeNode);
procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer); override;
procedure DragOver(Source: TObject; X, Y: Integer; State: TDragState;
var Accept: Boolean); override;
public
procedure DragDrop(Source: TObject; X, Y: Integer); override;
procedure DeleteNode(Node : TTreeNode);
procedure ClearAll;
constructor Create(AOwner : TComponent); override;
procedure CutNodes(Nodes : TList);
procedure CutNode(Node : TTreeNode);
procedure PasteNodeAt(Node : TTreeNode);
published
property DragDropEnabled : Boolean read FDragDropEnabled write FDragDropEnabled;
property CustomDragDrop : Boolean read FCustomDragDrop write FCustomDragDrop;
property OnDeleteNode : TTVChangedEvent read FOnDeleteNode write FOnDeleteNode;
property OnDragNodeEvent : TOnDragNodeEvent read FOnDragNodeEvent write FOnDragNodeEvent;
end;
procedure Register;
implementation
constructor TDATreeView.Create(AOwner : TComponent);
begin
inherited;
end;
procedure TDATreeView.DeleteNode(Node : TTreeNode);
var i : integer;
DelNode : TTreeNode;
begin
for i := Node.Count - 1 downto 0 do begin
DelNode := Node.Item[i];
DeleteNode(DelNode);
end;
DeleteNodeContent(Node);
Items.Delete(Node);
Node := nil;
end;
procedure TDATreeView.ClearAll;
var i : integer;
begin
for i := Items.Count-1 downto 0 do
DeleteNode(Items[i]);
Items.Clear;
end;
procedure TDATreeView.DeleteNodeContent(Node : TTreeNode);
begin
if Assigned(FOnDeleteNode) then
FOnDeleteNode(Self,Node);
end;
procedure TDATreeView.CutNodes(Nodes : TList);
var i : integer;
Node : TTreeNode;
begin
if (Nodes <> nil) then begin
for i := 0 to Nodes.Count-1 do begin
Node := TTreeNode(Nodes.Items[i]);
Node.Cut := False;
end;
end;
FCutNodes := Nodes;
for i := 0 to Nodes.Count-1 do begin
Node := TTreeNode(Nodes.Items[i]);
Node.Cut := True;
end;
end;
procedure TDATreeView.CutNode(Node : TTreeNode);
begin
if (FCutNode <> nil) and (FCutNode.Owner <> nil) and (FCutNode.Parent <> nil) and (FCutNode.TreeView <> nil) then
FCutNode.Cut := False;
FCutNode := Node;
FCutNode.Cut := True;
end;
procedure TDATreeView.PasteNodeAt(Node : TTreeNode);
procedure PasteNodeRoutine(FromNode, ToNode : TTreeNode);
var i : integer;
NewNode : TTreeNode;
begin
NewNode := Items.AddChildObject(ToNode, FromNode.Text, FromNode.Data);
NewNode.ImageIndex := FromNode.ImageIndex;
NewNode.SelectedIndex := FromNode.SelectedIndex;
for i := 0 to FromNode.Count-1 do
PasteNodeRoutine(FromNode.Item[i],NewNode)
end;
var i : integer;
TempNode : TTreeNode;
begin
if (FCutNode <> nil) and (FCutNode <> Node) then begin
FCutNode.Cut := false;
PasteNodeRoutine(FCutNode,Node);
DeleteNode(FCutNode);
FCutNode := nil;
end else begin
for i := 0 to FCutNodes.Count-1 do begin
TempNode := TTreeNode(FCutNodes.Items[i]);
PasteNodeRoutine(TempNode,Node);
DeleteNode(TempNode);
end;
FCutnodes := nil;
end;
end;
procedure TDATreeView.MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
var HT : THitTests;
begin
inherited;
if Button = mbLeft then begin
nodDrag := GetNodeAt(X,Y);
HT := GetHitTestInfoAt(X, Y);
if (nodDrag <> nil) and (DragDropEnabled) and (HT - [htOnItem] <> HT) then
BeginDrag(false, Mouse.DragThreshold+2);
end;
end;
procedure TDATreeView.DragDrop(Source: TObject; X, Y: Integer);
var NodX : TTreeNode;
HT : THitTests;
begin
if Source is TTreeView then begin
HT := GetHitTestInfoAt(X, Y);
NodX := TTreeView(Source).GetNodeAt(X,Y);
if (NodX <> nil) and (HT - [htOnIcon,htOnItem, htOnLabel] <> HT) then
if (FCustomDragDrop) and (Assigned(FOnDragNodeEvent)) then
FOnDragNodeEvent(Self,NodDrag, NodX)
else begin
CutNode(NodDrag);
PasteNodeAt(Nodx);
end;
end;
inherited;
end;
procedure TDATreeView.DragOver(Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
inherited;
Accept := Accept or ((Source is TTreeView) and DragDropEnabled);
end;
procedure Register;
begin
RegisterComponents('Diego Amicabile', [TDATreeView]);
end;
end.