Class TCustomTreeViewEx (unit TreeVwEx)

Inherits from

TCustomTreeView

Constructors


constructor Create(AOwner: TComponent);

TCustomTreeViewEx ----------------------------------------------------------


Functions

procedure Delete;


procedure DeleteNode(Node: TTreeNode);


destructor Destroy;


procedure Insert(AsChild: Boolean);


function IsRootNode(Node: TTreeNode): Boolean;

IsRootNode is true if the node has no parent:

if (FDisableCount = 0) and (Selected <> nil) then Selected.


function IsSingleRootNode(Node: TTreeNode): Boolean;

IsSingleRootNode is true if the node is the only one without parent:

This function was improved by Zlatko Ivankovic: THANKS!


function MoveNode(Source, Destination: TTreeNode; Mode: TNodeAttachMode): Boolean;

htNowhere, htOnIndent,

function CanDelete(Node: TTreeNode): Boolean;

Original IsSingleRootNode: Look at this, and you will see how elegant the above solution from Zlatko Ivankovic is: function TCustomTreeViewEx.

function CanEdit(Node: TTreeNode): Boolean;


function DoDelete(Node: TTreeNode): Boolean;


procedure DoStartDrag(var DragObject: TDragObject);

Allow PopupMenu if CNNotify was called with NM_RCLICK:

function DragAllowed(Node: TTreeNode): Boolean;


procedure DragCanceled;

DestinationNode is a candidate to get the new parent of the dragged node

procedure DragDrop(Source: TObject; X, Y: Integer);


procedure DragOver(Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);


procedure Expand(Node: TTreeNode);


function GetDeleteQuestion(Node: TTreeNode): string;


function GetDragImages: TCustomImageList;

This is why I have copied this part from TCustomTreeView: // SetDragImage(0, 2, 2); By calling SetDragImage, the original procedure sets the ImageList.

procedure InternalDeleteNode(Node: TTreeNode; AskForDeleteAll: Boolean; var DeleteAll, Canceled: Boolean; IsRecursiveCall: Boolean);


procedure KeyDown(var Key: Word; Shift: TShiftState);


procedure KillAllTimer;


procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);


procedure MouseMove(Shift: TShiftState; X, Y: Integer);

maybe it becomes a doubleclick, wait a little bit:

procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);


function ShowDeletePrompt(Node: TTreeNode; var DeleteAll: Boolean; ShowDeleteAllButton: Boolean): Boolean;


procedure WndProc(var Message: TMessage);

Message.

procedure CMDrag(var Message: TCMDrag);

with WMMouse do begin Msg := WM_MOUSEMOVE; Keys := 0; Result := 0; Pos.

procedure CNNotify(var Message: TWMNotify);

no PopupMenu anyway

procedure DoDragOver(Source: TDragObject; X, Y: Integer; PossibleDrop: Boolean);

if PossibleDrop and FDontAcceptLastPossibleDropTarget then Selected.

procedure DoScroll(Node: TTreeNode; MouseX, MouseY: Integer);

case

function MultipleRootsAllowed: Boolean;


procedure WMChar(var Message: TWMKeyDown);

bugfix part 2:

procedure WMRButtonUp(var Message: TWMRButtonUp);

make changes of the tree invisible

procedure WMTimer(var Msg: TWMTimer);

, htOnIcon, htOnIndent, htOnRight

Properties

property Align :


property BorderStyle :


property Color :


property Ctl3D :


property DragCursor :


property DragImageShow : TTVDragImageShow

DragImageShow: tvdisDefault: Show a dragimage if the Images property is not nil tvdisAlways: Show a dragimage even if Images is nil (text only) tvdisNever: No dragimage anyway

property DragMode :


property Enabled :


property Font :


property HideSelection :


property IgnoreWMChars : TIgnoreWMChars


property Images :


property Indent :


property Items :


property Options : TTreeViewExOptions

possible published:

property ParentColor :


property ParentCtl3D :


property ParentFont :


property ParentShowHint :


property PopupMenu :


property ReadOnly :


property RSelected : TTreeNode

The last node that was clicked with the right mouse-button:

property ShowButtons :

possible published, inherited from TCustomTreeView:

property ShowHint :


property ShowLines :


property ShowRoot :


property SortType :


property StateImages :


property TabOrder :


property TabStop :


property Visible :


Events

event OnChange :


event OnChanging :


event OnClick :


event OnCollapsed :


event OnCollapsing :


event OnCompare :


event OnDblClick :


event OnDeleting : TTVDeletingEvent

Called before the deleting of a node starts:

event OnDeletion :


event OnDragDrop :


event OnDragging : TTVDraggingEvent

possible published: } { Called before the dragging of a node starts:

event OnDragOver :


event OnEdited :


event OnEditing :


event OnEndDrag :


event OnEnter :


event OnExit :


event OnExpanded :


event OnExpanding :


event OnGetImageIndex :


event OnGetSelectedIndex :


event OnKeyDown :


event OnKeyPress :


event OnKeyUp :


event OnMouseDown :


event OnMouseMove :


event OnMouseSelect : TNotifyEvent


event OnMouseUp :


event OnStartDrag :


Variables

FDisableCount : Integer;


FRSelected : TTreeNode;


FDelRootID : LongInt;


FDontAcceptLastPossibleDropTarget : Boolean;


FDragImage : TImageList;


FDragImageShow : TTVDragImageShow;


FDragScrollTickCount : Integer;


FIgnoreWMChars : TIgnoreWMChars;


FLastPossibleDropTarget : TTreeNode;


FLMouseDownTickCount : Integer;


FMouseSelectTimer : Longint;


FOnDeleting : TTVDeletingEvent;


FOnDragging : TTVDraggingEvent;


FOnMouseSelect : TNotifyEvent;


FOptions : TTreeViewExOptions;


FScrollTimer : Longint;


FState : TTreeViewExStates;



Constructors


constructor Create(AOwner: TComponent);

TCustomTreeViewEx ----------------------------------------------------------


Functions


procedure Delete;


procedure DeleteNode(Node: TTreeNode);


destructor Destroy;


procedure Insert(AsChild: Boolean);


function IsRootNode(Node: TTreeNode): Boolean;

IsRootNode is true if the node has no parent:

if (FDisableCount = 0) and (Selected <> nil) then Selected.MakeVisible;


function IsSingleRootNode(Node: TTreeNode): Boolean;

IsSingleRootNode is true if the node is the only one without parent:

This function was improved by Zlatko Ivankovic: THANKS!


function MoveNode(Source, Destination: TTreeNode; Mode: TNodeAttachMode): Boolean;

htNowhere, htOnIndent,


function CanDelete(Node: TTreeNode): Boolean;

Original IsSingleRootNode: Look at this, and you will see how elegant the above solution from Zlatko Ivankovic is: function TCustomTreeViewEx.IsSingleRootNode(Node: TTreeNode): Boolean; var i: Integer; begin Result := false; if not IsRootNode(Node) then exit; for i := 0 to Items.Count - 1 do if (Items[i] <> Node) and IsRootNode(Items[i]) then exit; { found another root } Result := true; end;


function CanEdit(Node: TTreeNode): Boolean;


function DoDelete(Node: TTreeNode): Boolean;


procedure DoStartDrag(var DragObject: TDragObject);

Allow PopupMenu if CNNotify was called with NM_RCLICK:


function DragAllowed(Node: TTreeNode): Boolean;


procedure DragCanceled;

DestinationNode is a candidate to get the new parent of the dragged node


procedure DragDrop(Source: TObject; X, Y: Integer);


procedure DragOver(Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);


procedure Expand(Node: TTreeNode);


function GetDeleteQuestion(Node: TTreeNode): string;


function GetDragImages: TCustomImageList;

This is why I have copied this part from TCustomTreeView: // SetDragImage(0, 2, 2); By calling SetDragImage, the original procedure sets the ImageList.Dragging property to true. If no real drag happens (no mouse move), the ImageList will call ShowCursor(True) without a call of ShowCursor(False) before - so the cursor remains visible while dragging. This is a bug of TCustomImageList (in Delphi 2.0, I don't know if in D3 too), but it is not possible to overwrite TCustomImageList to make it bugfree.


procedure InternalDeleteNode(Node: TTreeNode; AskForDeleteAll: Boolean; var DeleteAll, Canceled: Boolean; IsRecursiveCall: Boolean);


procedure KeyDown(var Key: Word; Shift: TShiftState);


procedure KillAllTimer;


procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);


procedure MouseMove(Shift: TShiftState; X, Y: Integer);

maybe it becomes a doubleclick, wait a little bit:


procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);


function ShowDeletePrompt(Node: TTreeNode; var DeleteAll: Boolean; ShowDeleteAllButton: Boolean): Boolean;


procedure WndProc(var Message: TMessage);

Message.Result := 1;


procedure CMDrag(var Message: TCMDrag);

with WMMouse do begin Msg := WM_MOUSEMOVE; Keys := 0; Result := 0; Pos.X := MouseX; Pos.Y := MouseY; end; LastDragSource.MouseMsg(WMMouse); private >:-(


procedure CNNotify(var Message: TWMNotify);

no PopupMenu anyway


procedure DoDragOver(Source: TDragObject; X, Y: Integer; PossibleDrop: Boolean);

if PossibleDrop and FDontAcceptLastPossibleDropTarget then Selected.DropTarget := true;


procedure DoScroll(Node: TTreeNode; MouseX, MouseY: Integer);

case


function MultipleRootsAllowed: Boolean;


procedure WMChar(var Message: TWMKeyDown);

bugfix part 2:


procedure WMRButtonUp(var Message: TWMRButtonUp);

make changes of the tree invisible


procedure WMTimer(var Msg: TWMTimer);

, htOnIcon, htOnIndent, htOnRight


Properties


property Align :


property BorderStyle :


property Color :


property Ctl3D :


property DragCursor :


property DragImageShow : TTVDragImageShow

DragImageShow: tvdisDefault: Show a dragimage if the Images property is not nil tvdisAlways: Show a dragimage even if Images is nil (text only) tvdisNever: No dragimage anyway


property DragMode :


property Enabled :


property Font :


property HideSelection :


property IgnoreWMChars : TIgnoreWMChars


property Images :


property Indent :


property Items :


property Options : TTreeViewExOptions

possible published:


property ParentColor :


property ParentCtl3D :


property ParentFont :


property ParentShowHint :


property PopupMenu :


property ReadOnly :


property RSelected : TTreeNode

The last node that was clicked with the right mouse-button:


property ShowButtons :

possible published, inherited from TCustomTreeView:


property ShowHint :


property ShowLines :


property ShowRoot :


property SortType :


property StateImages :


property TabOrder :


property TabStop :


property Visible :


Events


event OnChange :


event OnChanging :


event OnClick :


event OnCollapsed :


event OnCollapsing :


event OnCompare :


event OnDblClick :


event OnDeleting : TTVDeletingEvent

Called before the deleting of a node starts:


event OnDeletion :


event OnDragDrop :


event OnDragging : TTVDraggingEvent

possible published: } { Called before the dragging of a node starts:


event OnDragOver :


event OnEdited :


event OnEditing :


event OnEndDrag :


event OnEnter :


event OnExit :


event OnExpanded :


event OnExpanding :


event OnGetImageIndex :


event OnGetSelectedIndex :


event OnKeyDown :


event OnKeyPress :


event OnKeyUp :


event OnMouseDown :


event OnMouseMove :


event OnMouseSelect : TNotifyEvent


event OnMouseUp :


event OnStartDrag :


Variables


FDisableCount : Integer;


FRSelected : TTreeNode;


FDelRootID : LongInt;


FDontAcceptLastPossibleDropTarget : Boolean;


FDragImage : TImageList;


FDragImageShow : TTVDragImageShow;


FDragScrollTickCount : Integer;


FIgnoreWMChars : TIgnoreWMChars;


FLastPossibleDropTarget : TTreeNode;


FLMouseDownTickCount : Integer;


FMouseSelectTimer : Longint;


FOnDeleting : TTVDeletingEvent;


FOnDragging : TTVDraggingEvent;


FOnMouseSelect : TNotifyEvent;


FOptions : TTreeViewExOptions;


FScrollTimer : Longint;


FState : TTreeViewExStates;