mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-16 19:49:18 +02:00
MG: added multiselection to TTreeView
git-svn-id: trunk@3307 -
This commit is contained in:
parent
4d2b332a14
commit
42c2244602
@ -42,6 +42,7 @@ uses
|
|||||||
vclGlobals, lMessages, Menus, ImgList, GraphType, Graphics, ToolWin, CommCtrl;
|
vclGlobals, lMessages, Menus, ImgList, GraphType, Graphics, ToolWin, CommCtrl;
|
||||||
|
|
||||||
type
|
type
|
||||||
|
|
||||||
{ TAlignment = Class(TWinControl)
|
{ TAlignment = Class(TWinControl)
|
||||||
public
|
public
|
||||||
constructor Create(AOwner : TComponent); override;
|
constructor Create(AOwner : TComponent); override;
|
||||||
@ -124,8 +125,9 @@ type
|
|||||||
|
|
||||||
TCustomDrawTarget = (dtControl, dtItem, dtSubItem);
|
TCustomDrawTarget = (dtControl, dtItem, dtSubItem);
|
||||||
TCustomDrawStage = (cdPrePaint, cdPostPaint, cdPreErase, cdPostErase);
|
TCustomDrawStage = (cdPrePaint, cdPostPaint, cdPreErase, cdPostErase);
|
||||||
TCustomDrawState = set of (cdsSelected, cdsGrayed, cdsDisabled, cdsChecked,
|
TCustomDrawStateFlag = (cdsSelected, cdsGrayed, cdsDisabled, cdsChecked,
|
||||||
cdsFocused, cdsDefault, cdsHot, cdsMarked, cdsIndeterminate);
|
cdsFocused, cdsDefault, cdsHot, cdsMarked, cdsIndeterminate);
|
||||||
|
TCustomDrawState = set of TCustomDrawStateFlag;
|
||||||
|
|
||||||
|
|
||||||
{TListView}
|
{TListView}
|
||||||
@ -819,8 +821,8 @@ type
|
|||||||
TTreeNodes = class;
|
TTreeNodes = class;
|
||||||
TTreeNode = class;
|
TTreeNode = class;
|
||||||
|
|
||||||
TNodeState = (nsCut, nsDropHilited, nsFocused, nsSelected, nsExpanded,
|
TNodeState = (nsCut, nsDropHilited, nsFocused, nsSelected, nsMultiSelected,
|
||||||
nsHasChildren);
|
nsExpanded, nsHasChildren);
|
||||||
TNodeStates = set of TNodeState;
|
TNodeStates = set of TNodeState;
|
||||||
TNodeAttachMode = (naAdd, naAddFirst, naAddChild, naAddChildFirst, naInsert);
|
TNodeAttachMode = (naAdd, naAddFirst, naAddChild, naAddChildFirst, naInsert);
|
||||||
|
|
||||||
@ -909,9 +911,11 @@ type
|
|||||||
//FItemId: HTreeItem;
|
//FItemId: HTreeItem;
|
||||||
FItems: TTreeNodeArray; // first level child nodes
|
FItems: TTreeNodeArray; // first level child nodes
|
||||||
FNextBrother: TTreeNode; // next sibling
|
FNextBrother: TTreeNode; // next sibling
|
||||||
|
FNextMultiSelected: TTreeNode;
|
||||||
FOverlayIndex: Integer;
|
FOverlayIndex: Integer;
|
||||||
FParent: TTreeNode;
|
FParent: TTreeNode;
|
||||||
FPrevBrother: TTreeNode; // previous sibling
|
FPrevBrother: TTreeNode; // previous sibling
|
||||||
|
FPrevMultiSelected: TTreeNode;
|
||||||
FSelectedIndex: Integer;
|
FSelectedIndex: Integer;
|
||||||
FStateIndex: Integer;
|
FStateIndex: Integer;
|
||||||
FStates: TNodeStates;
|
FStates: TNodeStates;
|
||||||
@ -919,6 +923,7 @@ type
|
|||||||
FText: string;
|
FText: string;
|
||||||
FTop: integer; // top coordinate
|
FTop: integer; // top coordinate
|
||||||
function AreParentsExpanded: Boolean;
|
function AreParentsExpanded: Boolean;
|
||||||
|
procedure BindToMultiSelected;
|
||||||
function CompareCount(CompareMe: Integer): Boolean;
|
function CompareCount(CompareMe: Integer): Boolean;
|
||||||
function DoCanExpand(ExpandIt: Boolean): Boolean;
|
function DoCanExpand(ExpandIt: Boolean): Boolean;
|
||||||
procedure DoExpand(ExpandIt: Boolean);
|
procedure DoExpand(ExpandIt: Boolean);
|
||||||
@ -934,6 +939,7 @@ type
|
|||||||
function GetIndex: Integer;
|
function GetIndex: Integer;
|
||||||
function GetItems(AnIndex: Integer): TTreeNode;
|
function GetItems(AnIndex: Integer): TTreeNode;
|
||||||
function GetLevel: Integer;
|
function GetLevel: Integer;
|
||||||
|
function GetMultiSelected: Boolean;
|
||||||
function GetSelected: Boolean;
|
function GetSelected: Boolean;
|
||||||
function GetState(NodeState: TNodeState): Boolean;
|
function GetState(NodeState: TNodeState): Boolean;
|
||||||
function GetTreeNodes: TTreeNodes;
|
function GetTreeNodes: TTreeNodes;
|
||||||
@ -954,12 +960,14 @@ type
|
|||||||
procedure SetHeight(AValue: integer);
|
procedure SetHeight(AValue: integer);
|
||||||
procedure SetImageIndex(AValue: integer);
|
procedure SetImageIndex(AValue: integer);
|
||||||
procedure SetItems(AnIndex: Integer; AValue: TTreeNode);
|
procedure SetItems(AnIndex: Integer; AValue: TTreeNode);
|
||||||
|
procedure SetMultiSelected(const AValue: Boolean);
|
||||||
procedure SetOverlayIndex(AValue: Integer);
|
procedure SetOverlayIndex(AValue: Integer);
|
||||||
procedure SetSelected(AValue: Boolean);
|
procedure SetSelected(AValue: Boolean);
|
||||||
procedure SetSelectedIndex(AValue: Integer);
|
procedure SetSelectedIndex(AValue: Integer);
|
||||||
procedure SetStateIndex(AValue: Integer);
|
procedure SetStateIndex(AValue: Integer);
|
||||||
procedure SetText(const S: string);
|
procedure SetText(const S: string);
|
||||||
procedure Unbind;
|
procedure Unbind;
|
||||||
|
procedure UnbindFromMultiSelected;
|
||||||
procedure WriteData(Stream: TStream; Info: PTreeNodeInfo);
|
procedure WriteData(Stream: TStream; Info: PTreeNodeInfo);
|
||||||
procedure WriteDelphiData(Stream: TStream; Info: PDelphiNodeInfo);
|
procedure WriteDelphiData(Stream: TStream; Info: PDelphiNodeInfo);
|
||||||
public
|
public
|
||||||
@ -993,16 +1001,19 @@ type
|
|||||||
function GetLastSubChild: TTreeNode;
|
function GetLastSubChild: TTreeNode;
|
||||||
function GetNext: TTreeNode;
|
function GetNext: TTreeNode;
|
||||||
function GetNextChild(AValue: TTreeNode): TTreeNode;
|
function GetNextChild(AValue: TTreeNode): TTreeNode;
|
||||||
|
function GetNextMultiSelected: TTreeNode;
|
||||||
function GetNextSibling: TTreeNode;
|
function GetNextSibling: TTreeNode;
|
||||||
function GetNextVisible: TTreeNode;
|
function GetNextVisible: TTreeNode;
|
||||||
function GetPrev: TTreeNode;
|
function GetPrev: TTreeNode;
|
||||||
function GetPrevChild(AValue: TTreeNode): TTreeNode;
|
function GetPrevChild(AValue: TTreeNode): TTreeNode;
|
||||||
|
function GetPrevMultiSelected: TTreeNode;
|
||||||
function GetPrevSibling: TTreeNode;
|
function GetPrevSibling: TTreeNode;
|
||||||
function GetPrevVisible: TTreeNode;
|
function GetPrevVisible: TTreeNode;
|
||||||
function HasAsParent(AValue: TTreeNode): Boolean;
|
function HasAsParent(AValue: TTreeNode): Boolean;
|
||||||
function IndexOf(AValue: TTreeNode): Integer;
|
function IndexOf(AValue: TTreeNode): Integer;
|
||||||
procedure MakeVisible;
|
procedure MakeVisible;
|
||||||
procedure MoveTo(Destination: TTreeNode; Mode: TNodeAttachMode); virtual;
|
procedure MoveTo(Destination: TTreeNode; Mode: TNodeAttachMode); virtual;
|
||||||
|
procedure MultiSelectGroup;
|
||||||
procedure Update;
|
procedure Update;
|
||||||
function ConsistencyCheck: integer;
|
function ConsistencyCheck: integer;
|
||||||
procedure WriteDebugReport(const Prefix: string; Recurse: boolean);
|
procedure WriteDebugReport(const Prefix: string; Recurse: boolean);
|
||||||
@ -1023,6 +1034,7 @@ type
|
|||||||
property Items[Index: Integer]: TTreeNode read GetItems write SetItems; default;
|
property Items[Index: Integer]: TTreeNode read GetItems write SetItems; default;
|
||||||
//property ItemId: HTreeItem read FItemId;
|
//property ItemId: HTreeItem read FItemId;
|
||||||
property Level: Integer read GetLevel;
|
property Level: Integer read GetLevel;
|
||||||
|
property MultiSelected: Boolean read GetMultiSelected write SetMultiSelected;
|
||||||
property OverlayIndex: Integer read FOverlayIndex write SetOverlayIndex;
|
property OverlayIndex: Integer read FOverlayIndex write SetOverlayIndex;
|
||||||
property Owner: TTreeNodes read FOwner;
|
property Owner: TTreeNodes read FOwner;
|
||||||
property Parent: TTreeNode read FParent;
|
property Parent: TTreeNode read FParent;
|
||||||
@ -1047,13 +1059,14 @@ type
|
|||||||
TTreeNodes = class(TPersistent)
|
TTreeNodes = class(TPersistent)
|
||||||
private
|
private
|
||||||
FCount: integer;
|
FCount: integer;
|
||||||
|
FFirstMultiSelected: TTreeNode;
|
||||||
|
FKeepCollapsedNodes: boolean;
|
||||||
FNodeCache: TNodeCache;
|
FNodeCache: TNodeCache;
|
||||||
FOwner: TCustomTreeView;
|
FOwner: TCustomTreeView;
|
||||||
FTopLvlCapacity: integer;
|
FTopLvlCapacity: integer;
|
||||||
FTopLvlCount: integer;
|
FTopLvlCount: integer;
|
||||||
FTopLvlItems: TTreeNodeArray; // root and root siblings
|
FTopLvlItems: TTreeNodeArray; // root and root siblings
|
||||||
FUpdateCount: Integer;
|
FUpdateCount: Integer;
|
||||||
FKeepCollapsedNodes: boolean;
|
|
||||||
procedure AddedNode(AValue: TTreeNode);
|
procedure AddedNode(AValue: TTreeNode);
|
||||||
procedure ClearCache;
|
procedure ClearCache;
|
||||||
function GetHandle: THandle;
|
function GetHandle: THandle;
|
||||||
@ -1098,6 +1111,7 @@ type
|
|||||||
procedure Assign(Source: TPersistent); override;
|
procedure Assign(Source: TPersistent); override;
|
||||||
procedure BeginUpdate;
|
procedure BeginUpdate;
|
||||||
procedure Clear;
|
procedure Clear;
|
||||||
|
procedure ClearMultiSelection;
|
||||||
procedure Delete(Node: TTreeNode);
|
procedure Delete(Node: TTreeNode);
|
||||||
procedure EndUpdate;
|
procedure EndUpdate;
|
||||||
function GetFirstNode: TTreeNode;
|
function GetFirstNode: TTreeNode;
|
||||||
@ -1126,16 +1140,43 @@ type
|
|||||||
|
|
||||||
{ TCustomTreeView }
|
{ TCustomTreeView }
|
||||||
|
|
||||||
TTreeViewState = (tvsScrollbarChanged, tvsMaxRightNeedsUpdate,
|
TTreeViewState = (
|
||||||
tvsTopsNeedsUpdate, tvsMaxLvlNeedsUpdate, tvsTopItemNeedsUpdate,
|
tvsScrollbarChanged,
|
||||||
tvsBottomItemNeedsUpdate, tvsCanvasChanged, tvsDragged, tvsIsEditing,
|
tvsMaxRightNeedsUpdate,
|
||||||
tvsStateChanging, tvsManualNotify, tvsUpdating, tvsMouseCapture,
|
tvsTopsNeedsUpdate,
|
||||||
tvsWaitForDragging, tvsDblClicked);
|
tvsMaxLvlNeedsUpdate,
|
||||||
|
tvsTopItemNeedsUpdate,
|
||||||
|
tvsBottomItemNeedsUpdate,
|
||||||
|
tvsCanvasChanged,
|
||||||
|
tvsDragged,
|
||||||
|
tvsIsEditing,
|
||||||
|
tvsStateChanging,
|
||||||
|
tvsManualNotify,
|
||||||
|
tvsUpdating,
|
||||||
|
tvsMouseCapture,
|
||||||
|
tvsWaitForDragging,
|
||||||
|
tvsDblClicked,
|
||||||
|
tvsTripleClicked,
|
||||||
|
tvsQuadClicked
|
||||||
|
);
|
||||||
TTreeViewStates = set of TTreeViewState;
|
TTreeViewStates = set of TTreeViewState;
|
||||||
|
|
||||||
TTreeViewOption = (tvoAutoExpand, tvoHideSelection, tvoHotTrack,
|
TTreeViewOption = (
|
||||||
tvoRightClickSelect, tvoReadOnly, tvoShowButtons, tvoShowRoot, tvoShowLines,
|
tvoAutoExpand,
|
||||||
tvoToolTips, tvoRowSelect, tvoKeepCollapsedNodes, tvoShowSeparators);
|
tvoHideSelection,
|
||||||
|
tvoHotTrack,
|
||||||
|
tvoRightClickSelect,
|
||||||
|
tvoReadOnly,
|
||||||
|
tvoShowButtons,
|
||||||
|
tvoShowRoot,
|
||||||
|
tvoShowLines,
|
||||||
|
tvoToolTips,
|
||||||
|
tvoRowSelect,
|
||||||
|
tvoKeepCollapsedNodes,
|
||||||
|
tvoShowSeparators,
|
||||||
|
tvoAllowMultiselect,
|
||||||
|
tvoAutoItemHeight
|
||||||
|
);
|
||||||
TTreeViewOptions = set of TTreeViewOption;
|
TTreeViewOptions = set of TTreeViewOption;
|
||||||
|
|
||||||
TTreeViewExpandSignType = (tvestPlusMinus, tvestArrow);
|
TTreeViewExpandSignType = (tvestPlusMinus, tvestArrow);
|
||||||
@ -1615,6 +1656,9 @@ end.
|
|||||||
{ =============================================================================
|
{ =============================================================================
|
||||||
|
|
||||||
$Log$
|
$Log$
|
||||||
|
Revision 1.40 2002/09/09 17:41:18 lazarus
|
||||||
|
MG: added multiselection to TTreeView
|
||||||
|
|
||||||
Revision 1.39 2002/09/05 13:33:10 lazarus
|
Revision 1.39 2002/09/05 13:33:10 lazarus
|
||||||
MG: set default value for TStatusBar.SimplePanel
|
MG: set default value for TStatusBar.SimplePanel
|
||||||
|
|
||||||
|
@ -23,8 +23,6 @@
|
|||||||
TTreeView for LCL
|
TTreeView for LCL
|
||||||
|
|
||||||
ToDo:
|
ToDo:
|
||||||
- Multiselection
|
|
||||||
- custom draw
|
|
||||||
- Drag&Drop
|
- Drag&Drop
|
||||||
- Editing
|
- Editing
|
||||||
- Columns
|
- Columns
|
||||||
@ -335,6 +333,19 @@ begin
|
|||||||
Result:=true;
|
Result:=true;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TTreeNode.BindToMultiSelected;
|
||||||
|
var
|
||||||
|
TheTreeNodes: TTreeNodes;
|
||||||
|
begin
|
||||||
|
TheTreeNodes:=TreeNodes;
|
||||||
|
if TheTreeNodes=nil then exit;
|
||||||
|
FNextMultiSelected:=TheTreeNodes.FFirstMultiSelected;
|
||||||
|
FPrevMultiSelected:=nil;
|
||||||
|
if FNextMultiSelected<>nil then
|
||||||
|
FNextMultiSelected.FPrevMultiSelected:=Self;
|
||||||
|
TheTreeNodes.FFirstMultiSelected:=Self;
|
||||||
|
end;
|
||||||
|
|
||||||
function TTreeNode.CompareCount(CompareMe: Integer): Boolean;
|
function TTreeNode.CompareCount(CompareMe: Integer): Boolean;
|
||||||
{var
|
{var
|
||||||
ACount: integer;
|
ACount: integer;
|
||||||
@ -468,12 +479,6 @@ begin
|
|||||||
TreeView.Selected:=nil;
|
TreeView.Selected:=nil;
|
||||||
end;
|
end;
|
||||||
Update;
|
Update;
|
||||||
{ ToDo:
|
|
||||||
if Value then
|
|
||||||
TreeView_SelectItem(Handle, ItemId)
|
|
||||||
else if Selected then
|
|
||||||
TreeView_SelectItem(Handle, nil);
|
|
||||||
}
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TTreeNode.GetCut: Boolean;
|
function TTreeNode.GetCut: Boolean;
|
||||||
@ -630,6 +635,11 @@ begin
|
|||||||
Result := nil;
|
Result := nil;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TTreeNode.GetNextMultiSelected: TTreeNode;
|
||||||
|
begin
|
||||||
|
Result:=FNextMultiSelected;
|
||||||
|
end;
|
||||||
|
|
||||||
function TTreeNode.GetPrevChild(AValue: TTreeNode): TTreeNode;
|
function TTreeNode.GetPrevChild(AValue: TTreeNode): TTreeNode;
|
||||||
begin
|
begin
|
||||||
if AValue <> nil then
|
if AValue <> nil then
|
||||||
@ -638,6 +648,11 @@ begin
|
|||||||
Result := nil;
|
Result := nil;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TTreeNode.GetPrevMultiSelected: TTreeNode;
|
||||||
|
begin
|
||||||
|
Result:=FPrevMultiSelected;
|
||||||
|
end;
|
||||||
|
|
||||||
function TTreeNode.GetFirstChild: TTreeNode;
|
function TTreeNode.GetFirstChild: TTreeNode;
|
||||||
begin
|
begin
|
||||||
if Count>0 then
|
if Count>0 then
|
||||||
@ -788,6 +803,21 @@ begin
|
|||||||
Items[AnIndex].Assign(AValue);
|
Items[AnIndex].Assign(AValue);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TTreeNode.SetMultiSelected(const AValue: Boolean);
|
||||||
|
begin
|
||||||
|
if AValue=GetMultiSelected then exit;
|
||||||
|
if AValue then begin
|
||||||
|
if (Treeview<>nil) and (not (tvoAllowMultiselect in TreeView.Options)) then
|
||||||
|
exit;
|
||||||
|
Include(FStates,nsMultiSelected);
|
||||||
|
if TreeNodes<>nil then BindToMultiSelected;
|
||||||
|
end else begin
|
||||||
|
Exclude(FStates,nsMultiSelected);
|
||||||
|
if TreeNodes<>nil then UnbindFromMultiSelected;
|
||||||
|
end;
|
||||||
|
Update;
|
||||||
|
end;
|
||||||
|
|
||||||
function TTreeNode.IndexOf(AValue: TTreeNode): Integer;
|
function TTreeNode.IndexOf(AValue: TTreeNode): Integer;
|
||||||
begin
|
begin
|
||||||
if AValue=nil then begin
|
if AValue=nil then begin
|
||||||
@ -828,9 +858,9 @@ procedure TTreeNode.Unbind;
|
|||||||
var OldIndex, i: integer;
|
var OldIndex, i: integer;
|
||||||
HigherNode: TTreeNode;
|
HigherNode: TTreeNode;
|
||||||
begin
|
begin
|
||||||
{$IFDEF TREEVIEW_DEBUG}
|
{$IFDEF TREEVIEW_DEBUG}
|
||||||
writeln('[TTreeNode.Unbind] Self=',HexStr(Cardinal(Self),8),' Self.Text=',Text);
|
writeln('[TTreeNode.Unbind] Self=',HexStr(Cardinal(Self),8),' Self.Text=',Text);
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
Selected:=false;
|
Selected:=false;
|
||||||
if Owner<>nil then begin
|
if Owner<>nil then begin
|
||||||
Owner.ClearCache;
|
Owner.ClearCache;
|
||||||
@ -841,6 +871,7 @@ writeln('[TTreeNode.Unbind] Self=',HexStr(Cardinal(Self),8),' Self.Text=',Text);
|
|||||||
tvsTopsNeedsUpdate,tvsTopItemNeedsUpdate,tvsBottomItemNeedsUpdate];
|
tvsTopsNeedsUpdate,tvsTopItemNeedsUpdate,tvsBottomItemNeedsUpdate];
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
UnbindFromMultiSelected;
|
||||||
if FPrevBrother<>nil then FPrevBrother.FNextBrother:=FNextBrother;
|
if FPrevBrother<>nil then FPrevBrother.FNextBrother:=FNextBrother;
|
||||||
if FNextBrother<>nil then FNextBrother.FPrevBrother:=FPrevBrother;
|
if FNextBrother<>nil then FNextBrother.FPrevBrother:=FPrevBrother;
|
||||||
FPrevBrother:=nil;
|
FPrevBrother:=nil;
|
||||||
@ -870,6 +901,22 @@ writeln('[TTreeNode.Unbind] Self=',HexStr(Cardinal(Self),8),' Self.Text=',Text);
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TTreeNode.UnbindFromMultiSelected;
|
||||||
|
var
|
||||||
|
TheTreeNodes: TTreeNodes;
|
||||||
|
begin
|
||||||
|
TheTreeNodes:=TreeNodes;
|
||||||
|
if TheTreeNodes=nil then exit;
|
||||||
|
if TheTreeNodes.FFirstMultiSelected=Self then
|
||||||
|
TheTreeNodes.FFirstMultiSelected:=FNextMultiSelected;
|
||||||
|
if FNextMultiSelected<>nil then
|
||||||
|
FNextMultiSelected.FPrevMultiSelected:=FPrevMultiSelected;
|
||||||
|
if FPrevMultiSelected<>nil then
|
||||||
|
FPrevMultiSelected.FNextMultiSelected:=FNextMultiSelected;
|
||||||
|
FNextMultiSelected:=nil;
|
||||||
|
FPrevMultiSelected:=nil;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TTreeNode.InternalMove(ANode: TTreeNode;
|
procedure TTreeNode.InternalMove(ANode: TTreeNode;
|
||||||
AddMode: TAddMode);
|
AddMode: TAddMode);
|
||||||
{
|
{
|
||||||
@ -882,12 +929,12 @@ procedure TTreeNode.InternalMove(ANode: TTreeNode;
|
|||||||
var HigherNode: TTreeNode;
|
var HigherNode: TTreeNode;
|
||||||
NewIndex, NewParentItemSize, i: integer;
|
NewIndex, NewParentItemSize, i: integer;
|
||||||
begin
|
begin
|
||||||
{$IFDEF TREEVIEW_DEBUG}
|
{$IFDEF TREEVIEW_DEBUG}
|
||||||
write('[TTreeNode.InternalMove] Self=',HexStr(Cardinal(Self),8),' Self.Text=',Text
|
write('[TTreeNode.InternalMove] Self=',HexStr(Cardinal(Self),8),' Self.Text=',Text
|
||||||
,' ANode=',ANode<>nil,' AddMode=',AddModeNames[AddMode]);
|
,' ANode=',ANode<>nil,' AddMode=',AddModeNames[AddMode]);
|
||||||
if ANode<>nil then write(' ANode.Text=',ANode.Text);
|
if ANode<>nil then write(' ANode.Text=',ANode.Text);
|
||||||
writeln('');
|
writeln('');
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
Unbind;
|
Unbind;
|
||||||
// set parent
|
// set parent
|
||||||
if AddMode in [taAdd, taAddFirst] then
|
if AddMode in [taAdd, taAddFirst] then
|
||||||
@ -1076,6 +1123,28 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TTreeNode.MultiSelectGroup;
|
||||||
|
var
|
||||||
|
FirstNode, LastNode, ANode: TTreeNode;
|
||||||
|
begin
|
||||||
|
if (TreeView<>nil) and (not (tvoAllowMultiselect in TreeView.Options)) then
|
||||||
|
exit;
|
||||||
|
FirstNode:=GetPrevSibling;
|
||||||
|
while (FirstNode<>nil) and (not FirstNode.MultiSelected) do
|
||||||
|
FirstNode:=FirstNode.GetPrevSibling;
|
||||||
|
if FirstNode=nil then FirstNode:=Self;
|
||||||
|
LastNode:=GetNextSibling;
|
||||||
|
while (LastNode<>nil) and (not LastNode.MultiSelected) do
|
||||||
|
LastNode:=LastNode.GetNextSibling;
|
||||||
|
if LastNode=nil then LastNode:=Self;
|
||||||
|
ANode:=FirstNode;
|
||||||
|
while ANode<>nil do begin
|
||||||
|
ANode.MultiSelected:=true;
|
||||||
|
if ANode=LastNode then break;
|
||||||
|
ANode:=ANode.GetNextSibling;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TTreeNode.MakeVisible;
|
procedure TTreeNode.MakeVisible;
|
||||||
begin
|
begin
|
||||||
if TreeView<>nil then
|
if TreeView<>nil then
|
||||||
@ -1097,6 +1166,11 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TTreeNode.GetMultiSelected: Boolean;
|
||||||
|
begin
|
||||||
|
Result := GetState(nsMultiSelected);
|
||||||
|
end;
|
||||||
|
|
||||||
function TTreeNode.IsNodeVisible: Boolean;
|
function TTreeNode.IsNodeVisible: Boolean;
|
||||||
//var Rect: TRect;
|
//var Rect: TRect;
|
||||||
begin
|
begin
|
||||||
@ -1503,6 +1577,18 @@ begin
|
|||||||
GetLastNode.Delete;
|
GetLastNode.Delete;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TTreeNodes.ClearMultiSelection;
|
||||||
|
var
|
||||||
|
ANode, OldNode: TTreeNode;
|
||||||
|
begin
|
||||||
|
ANode:=FFirstMultiSelected;
|
||||||
|
while ANode<>nil do begin
|
||||||
|
OldNode:=ANode;
|
||||||
|
ANode:=ANode.GetNextMultiSelected;
|
||||||
|
OldNode.MultiSelected:=false;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
function TTreeNodes.AddChildFirst(ParentNode: TTreeNode; const S: string): TTreeNode;
|
function TTreeNodes.AddChildFirst(ParentNode: TTreeNode; const S: string): TTreeNode;
|
||||||
begin
|
begin
|
||||||
Result := AddChildObjectFirst(ParentNode, S, nil);
|
Result := AddChildObjectFirst(ParentNode, S, nil);
|
||||||
@ -1622,12 +1708,12 @@ var ok: boolean;
|
|||||||
begin
|
begin
|
||||||
if Owner=nil then
|
if Owner=nil then
|
||||||
TreeNodeError('TTreeNodes.InternalAddObject Owner=nil');
|
TreeNodeError('TTreeNodes.InternalAddObject Owner=nil');
|
||||||
{$IFDEF TREEVIEW_DEBUG}
|
{$IFDEF TREEVIEW_DEBUG}
|
||||||
write('[TTreeNodes.InternalAddObject] Node=',Node<>nil,' S=',S,
|
write('[TTreeNodes.InternalAddObject] Node=',Node<>nil,' S=',S,
|
||||||
' AddMode=',AddModeNames[AddMode]);
|
' AddMode=',AddModeNames[AddMode]);
|
||||||
if Node<>nil then write(' Node.Text=',Node.Text);
|
if Node<>nil then write(' Node.Text=',Node.Text);
|
||||||
writeln('');
|
writeln('');
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
Result := Owner.CreateNode;
|
Result := Owner.CreateNode;
|
||||||
ok:=false;
|
ok:=false;
|
||||||
try
|
try
|
||||||
@ -1635,9 +1721,8 @@ writeln('');
|
|||||||
Result.Text := S;
|
Result.Text := S;
|
||||||
// move node in tree (tree of TTreeNode)
|
// move node in tree (tree of TTreeNode)
|
||||||
Result.InternalMove(Node,AddMode);
|
Result.InternalMove(Node,AddMode);
|
||||||
if (Owner<>nil) and Owner.AutoExpand and (Node<>nil) and (Node.Parent<>nil)
|
if (Owner<>nil) and Owner.AutoExpand and (Result.Parent<>nil) then
|
||||||
then
|
Result.Parent.Expanded:=true;
|
||||||
Node.Parent.Expanded:=true;
|
|
||||||
if (FUpdateCount=0) and (Owner<>nil) then
|
if (FUpdateCount=0) and (Owner<>nil) then
|
||||||
Owner.Invalidate;
|
Owner.Invalidate;
|
||||||
ok:=true;
|
ok:=true;
|
||||||
@ -2706,12 +2791,20 @@ begin
|
|||||||
if FOptions=NewOptions then exit;
|
if FOptions=NewOptions then exit;
|
||||||
ChangedOptions:=(FOptions-NewOptions)+(NewOptions-FOptions);
|
ChangedOptions:=(FOptions-NewOptions)+(NewOptions-FOptions);
|
||||||
FOptions:=NewOptions;
|
FOptions:=NewOptions;
|
||||||
if (tvoKeepCollapsedNodes) in ChangedOptions then
|
if tvoKeepCollapsedNodes in ChangedOptions then
|
||||||
Items.KeepCollapsedNodes:=(tvoKeepCollapsedNodes in FOptions);
|
Items.KeepCollapsedNodes:=(tvoKeepCollapsedNodes in FOptions);
|
||||||
if (tvoReadOnly in ChangedOptions) and (not (tvoReadOnly in FOptions)) then
|
if (tvoReadOnly in ChangedOptions) and (not (tvoReadOnly in FOptions)) then
|
||||||
EndEditing;
|
EndEditing;
|
||||||
|
if (tvoAllowMultiselect in ChangedOptions) then begin
|
||||||
|
if (tvoAllowMultiselect in FOptions) then begin
|
||||||
|
if Selected<>nil then Selected.MultiSelected:=true;
|
||||||
|
end else begin
|
||||||
|
Items.ClearMultiSelection;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
if ([tvoHideSelection,tvoReadOnly,tvoShowButtons,tvoShowRoot,tvoShowLines]
|
if ([tvoHideSelection,tvoReadOnly,tvoShowButtons,tvoShowRoot,tvoShowLines]
|
||||||
* ChangedOptions)<>[] then
|
* ChangedOptions)<>[]
|
||||||
|
then
|
||||||
Invalidate;
|
Invalidate;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -3589,8 +3682,10 @@ end;
|
|||||||
}
|
}
|
||||||
procedure TCustomTreeView.WndProc(var Message: TLMessage);
|
procedure TCustomTreeView.WndProc(var Message: TLMessage);
|
||||||
begin
|
begin
|
||||||
if not (csDesigning in ComponentState) and ((Message.Msg = LM_LBUTTONDOWN) or
|
if not (csDesigning in ComponentState)
|
||||||
(Message.Msg = LM_LBUTTONDBLCLK)) and not Dragging and
|
and ((Message.Msg = LM_LBUTTONDOWN)
|
||||||
|
or (Message.Msg = LM_LBUTTONDBLCLK))
|
||||||
|
and not Dragging and
|
||||||
(DragMode = dmAutomatic) and (DragKind = dkDrag) then
|
(DragMode = dmAutomatic) and (DragKind = dkDrag) then
|
||||||
begin
|
begin
|
||||||
if not IsControlMouseMsg(TLMMouse(Message)) then begin
|
if not IsControlMouseMsg(TLMMouse(Message)) then begin
|
||||||
@ -3601,7 +3696,8 @@ begin
|
|||||||
{else if Message.Msg = CN_BASE+LM_CONTEXTMENU then
|
{else if Message.Msg = CN_BASE+LM_CONTEXTMENU then
|
||||||
Message.Result := Perform(LM_CONTEXTMENU, Message.WParam, Message.LParam)
|
Message.Result := Perform(LM_CONTEXTMENU, Message.WParam, Message.LParam)
|
||||||
}
|
}
|
||||||
else inherited WndProc(Message);
|
else
|
||||||
|
inherited WndProc(Message);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCustomTreeView.DoStartDrag(var DragObject: TDragObject);
|
procedure TCustomTreeView.DoStartDrag(var DragObject: TDragObject);
|
||||||
@ -3672,13 +3768,18 @@ begin
|
|||||||
end;}
|
end;}
|
||||||
|
|
||||||
procedure TCustomTreeView.DoPaint;
|
procedure TCustomTreeView.DoPaint;
|
||||||
var a,HalfBorderWidth:integer;
|
var
|
||||||
SpaceRect:TRect;
|
a,HalfBorderWidth:integer;
|
||||||
|
SpaceRect, DrawRect: TRect;
|
||||||
Node: TTreeNode;
|
Node: TTreeNode;
|
||||||
begin
|
begin
|
||||||
if tvsUpdating in FStates then exit;
|
if tvsUpdating in FStates then exit;
|
||||||
UpdateScrollbars;
|
UpdateScrollbars;
|
||||||
with Canvas do begin
|
with Canvas do begin
|
||||||
|
if Assigned(FOnCustomDraw) then begin
|
||||||
|
DrawRect:=ClientRect;
|
||||||
|
if not CustomDraw(DrawRect,cdPrePaint) then exit;
|
||||||
|
end;
|
||||||
// draw nodes
|
// draw nodes
|
||||||
Node:=TopItem;
|
Node:=TopItem;
|
||||||
//write('[TCustomTreeView.DoPaint] A Node=',HexStr(Cardinal(Node),8));
|
//write('[TCustomTreeView.DoPaint] A Node=',HexStr(Cardinal(Node),8));
|
||||||
@ -3686,8 +3787,8 @@ begin
|
|||||||
while Node<>nil do begin
|
while Node<>nil do begin
|
||||||
DoPaintNode(Node);
|
DoPaintNode(Node);
|
||||||
Node:=Node.GetNextVisible;
|
Node:=Node.GetNextVisible;
|
||||||
//write('[TCustomTreeView.DoPaint] B Node=',HexStr(Cardinal(Node),8));
|
//write('[TCustomTreeView.DoPaint] B Node=',HexStr(Cardinal(Node),8));
|
||||||
//if Node<>nil then writeln(' Node.Text=',Node.Text) else writeln('');
|
//if Node<>nil then writeln(' Node.Text=',Node.Text) else writeln('');
|
||||||
end;
|
end;
|
||||||
// draw unused space below nodes
|
// draw unused space below nodes
|
||||||
SpaceRect:=Rect(BorderWidth,BorderWidth,
|
SpaceRect:=Rect(BorderWidth,BorderWidth,
|
||||||
@ -3722,12 +3823,18 @@ begin
|
|||||||
LineTo((ClientWidth-ScrollBarWidth)-1-a,(ClientHeight-ScrollBarWidth)-1-a);
|
LineTo((ClientWidth-ScrollBarWidth)-1-a,(ClientHeight-ScrollBarWidth)-1-a);
|
||||||
LineTo(a,(ClientHeight-ScrollBarWidth)-1-a);
|
LineTo(a,(ClientHeight-ScrollBarWidth)-1-a);
|
||||||
end;
|
end;
|
||||||
|
if Assigned(FOnCustomDraw) then begin
|
||||||
|
DrawRect:=ClientRect;
|
||||||
|
if not CustomDraw(DrawRect,cdPostPaint) then exit;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCustomTreeView.DoPaintNode(Node: TTreeNode);
|
procedure TCustomTreeView.DoPaintNode(Node: TTreeNode);
|
||||||
var NodeRect: TRect;
|
var
|
||||||
|
NodeRect: TRect;
|
||||||
VertMid: integer;
|
VertMid: integer;
|
||||||
|
NodeSelected: boolean;
|
||||||
|
|
||||||
function InvertColor(AColor: TColor): TColor;
|
function InvertColor(AColor: TColor): TColor;
|
||||||
var Red, Green, Blue: integer;
|
var Red, Green, Blue: integer;
|
||||||
@ -3812,7 +3919,7 @@ var NodeRect: TRect;
|
|||||||
Points[1]:=Point(ARight-1,MidY);
|
Points[1]:=Point(ARight-1,MidY);
|
||||||
Points[2]:=Point(MidX-1,ABottom);
|
Points[2]:=Point(MidX-1,ABottom);
|
||||||
end;
|
end;
|
||||||
PolyGon(Points,3,false);
|
Polygon(Points,3,false);
|
||||||
FreeMem(Points);
|
FreeMem(Points);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
@ -3823,18 +3930,33 @@ var NodeRect: TRect;
|
|||||||
var x, ImgIndex: integer;
|
var x, ImgIndex: integer;
|
||||||
CurBackgroundColor, OldFontColor: TColor;
|
CurBackgroundColor, OldFontColor: TColor;
|
||||||
CurTextRect: TRect;
|
CurTextRect: TRect;
|
||||||
|
DrawState: TCustomDrawState;
|
||||||
|
PaintImages: boolean;
|
||||||
begin
|
begin
|
||||||
NodeRect:=Node.DisplayRect(false);
|
NodeRect:=Node.DisplayRect(false);
|
||||||
if (NodeRect.Bottom<0) or (NodeRect.Top>=(ClientHeight-ScrollBarWidth)) then
|
if (NodeRect.Bottom<0) or (NodeRect.Top>=(ClientHeight-ScrollBarWidth)) then
|
||||||
exit;
|
exit;
|
||||||
|
NodeSelected:=(Node.Selected) or (Node.MultiSelected);
|
||||||
|
if Assigned(OnCustomDrawItem) then begin
|
||||||
|
DrawState:=[];
|
||||||
|
if NodeSelected then
|
||||||
|
Include(DrawState,cdsSelected);
|
||||||
|
if Node.Focused then
|
||||||
|
Include(DrawState,cdsFocused);
|
||||||
|
if Node.MultiSelected then
|
||||||
|
Include(DrawState,cdsMarked);
|
||||||
|
if not CustomDrawItem(Node,DrawState,cdPrePaint,PaintImages) then exit;
|
||||||
|
end else begin
|
||||||
|
PaintImages:=true;
|
||||||
|
end;
|
||||||
VertMid:=(NodeRect.Top+NodeRect.Bottom) shr 1;
|
VertMid:=(NodeRect.Top+NodeRect.Bottom) shr 1;
|
||||||
//writeln('[TCustomTreeView.DoPaintNode] Node=',HexStr(Cardinal(Node),8),' Node.Text=',Node.Text,' NodeRect=',NodeRect.Left,',',NodeRect.Top,',',NodeRect.Right,',',NodeRect.Bottom,' VertMid=',VertMid);
|
//writeln('[TCustomTreeView.DoPaintNode] Node=',HexStr(Cardinal(Node),8),' Node.Text=',Node.Text,' NodeRect=',NodeRect.Left,',',NodeRect.Top,',',NodeRect.Right,',',NodeRect.Bottom,' VertMid=',VertMid);
|
||||||
with Canvas do begin
|
with Canvas do begin
|
||||||
// draw background
|
// draw background
|
||||||
if (FSelectedNode<>Node) or (not (tvoRowSelect in FOptions)) then
|
if (tvoRowSelect in FOptions) and NodeSelected then
|
||||||
CurBackgroundColor:=FBackgroundColor
|
CurBackgroundColor:=FSelectedColor
|
||||||
else
|
else
|
||||||
CurBackgroundColor:=FSelectedColor;
|
CurBackgroundColor:=FBackgroundColor;
|
||||||
if CurBackgroundColor<>clNone then begin
|
if CurBackgroundColor<>clNone then begin
|
||||||
Brush.Color:=CurBackgroundColor;
|
Brush.Color:=CurBackgroundColor;
|
||||||
FillRect(NodeRect);
|
FillRect(NodeRect);
|
||||||
@ -3844,13 +3966,12 @@ begin
|
|||||||
Pen.Style:=psDot;
|
Pen.Style:=psDot;
|
||||||
x:=DrawTreeLines(Node);
|
x:=DrawTreeLines(Node);
|
||||||
Pen.Style:=psSolid;
|
Pen.Style:=psSolid;
|
||||||
//writeln('TCustomTreeView.DoPaintNode x=',x);
|
|
||||||
// draw expand sign
|
// draw expand sign
|
||||||
if Node.HasChildren then begin
|
if Node.HasChildren then begin
|
||||||
DrawExpandSign(x-Indent+(Indent shr 1),VertMid,Node.Expanded);
|
DrawExpandSign(x-Indent+(Indent shr 1),VertMid,Node.Expanded);
|
||||||
end;
|
end;
|
||||||
// draw icon
|
// draw icon
|
||||||
if Images<>nil then begin
|
if (Images<>nil) and PaintImages then begin
|
||||||
if FSelectedNode<>Node then
|
if FSelectedNode<>Node then
|
||||||
ImgIndex:=Node.ImageIndex
|
ImgIndex:=Node.ImageIndex
|
||||||
else
|
else
|
||||||
@ -3860,13 +3981,13 @@ begin
|
|||||||
inc(x,Images.Width);
|
inc(x,Images.Width);
|
||||||
end;
|
end;
|
||||||
// draw state icon
|
// draw state icon
|
||||||
if StateImages<>nil then begin
|
if (StateImages<>nil) and PaintImages then begin
|
||||||
if (Node.StateIndex>=0) and (Node.StateIndex<StateImages.Count) then
|
if (Node.StateIndex>=0) and (Node.StateIndex<StateImages.Count) then
|
||||||
StateImages.Draw(Canvas,x,NodeRect.Top,Node.StateIndex,true);
|
StateImages.Draw(Canvas,x,NodeRect.Top,Node.StateIndex,true);
|
||||||
inc(x,StateImages.Width);
|
inc(x,StateImages.Width);
|
||||||
end;
|
end;
|
||||||
// draw text
|
// draw text
|
||||||
if (FSelectedNode=Node) and (FSelectedColor<>clNone) then begin
|
if NodeSelected and (FSelectedColor<>clNone) then begin
|
||||||
Brush.Color:=FSelectedColor;
|
Brush.Color:=FSelectedColor;
|
||||||
CurTextRect:=NodeRect;
|
CurTextRect:=NodeRect;
|
||||||
CurTextRect.Left:=x;
|
CurTextRect.Left:=x;
|
||||||
@ -3886,6 +4007,18 @@ begin
|
|||||||
LineTo(NodeRect.Right,NodeRect.Bottom-1);
|
LineTo(NodeRect.Right,NodeRect.Bottom-1);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
if Assigned(OnCustomDrawItem) then begin
|
||||||
|
DrawState:=[];
|
||||||
|
if Node.Selected then
|
||||||
|
Include(DrawState,cdsSelected);
|
||||||
|
if Node.Focused then
|
||||||
|
Include(DrawState,cdsFocused);
|
||||||
|
if Node.MultiSelected then
|
||||||
|
Include(DrawState,cdsMarked);
|
||||||
|
if not CustomDrawItem(Node,DrawState,cdPostPaint,PaintImages) then exit;
|
||||||
|
end else begin
|
||||||
|
PaintImages:=true;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCustomTreeView.GetImageIndex(Node: TTreeNode);
|
procedure TCustomTreeView.GetImageIndex(Node: TTreeNode);
|
||||||
@ -4015,19 +4148,10 @@ var
|
|||||||
CursorNode: TTreeNode;
|
CursorNode: TTreeNode;
|
||||||
bStartDrag: boolean;
|
bStartDrag: boolean;
|
||||||
begin
|
begin
|
||||||
if (X>=(ClientWidth-ScrollBarWidth)) or (Y>=(ClientHeight-ScrollBarWidth))
|
|
||||||
then begin
|
|
||||||
// workaround vs scrollbar clientrect bug in lcl
|
|
||||||
inherited MouseDown(Button, Shift, X, Y);
|
|
||||||
exit;
|
|
||||||
end;
|
|
||||||
if Button = mbLeft then begin
|
|
||||||
if ssDouble in Shift then Exit;
|
|
||||||
end;
|
|
||||||
fMouseDownX := X;
|
fMouseDownX := X;
|
||||||
fMouseDownY := Y;
|
fMouseDownY := Y;
|
||||||
if Button=mbMiddle then begin
|
if Button=mbMiddle then begin
|
||||||
if ssDouble in Shift then Exit;
|
if ([ssDouble,ssTriple,ssQuad]*Shift)<>[] then Exit;
|
||||||
if tvsIsEditing in FStates then begin
|
if tvsIsEditing in FStates then begin
|
||||||
// ToDo: insert clipboard text into node text
|
// ToDo: insert clipboard text into node text
|
||||||
// :=PrimarySelection.AsText;
|
// :=PrimarySelection.AsText;
|
||||||
@ -4036,27 +4160,42 @@ begin
|
|||||||
inherited MouseDown(Button, Shift, X, Y);
|
inherited MouseDown(Button, Shift, X, Y);
|
||||||
CursorNode:=GetNodeAt(X,Y);
|
CursorNode:=GetNodeAt(X,Y);
|
||||||
bStartDrag := false;
|
bStartDrag := false;
|
||||||
if (Button = mbLeft) and (CursorNode<>nil) then begin
|
if ([ssDouble,ssTriple,ssQuad]*Shift)=[] then begin
|
||||||
Exclude(fStates,tvsWaitForDragging);
|
if (Button = mbLeft) and (CursorNode<>nil) then begin
|
||||||
if CursorNode.HasChildren
|
Exclude(fStates,tvsWaitForDragging);
|
||||||
and (x>=CursorNode.DisplayExpandSignLeft)
|
if CursorNode.HasChildren
|
||||||
and (x<CursorNode.DisplayExpandSignRight) then begin
|
and (x>=CursorNode.DisplayExpandSignLeft)
|
||||||
// mousedown occured on expand sign -> expand/collapse
|
and (x<CursorNode.DisplayExpandSignRight) then begin
|
||||||
CursorNode.Expanded:=not CursorNode.Expanded;
|
// mousedown occured on expand sign -> expand/collapse
|
||||||
end else if x>=CursorNode.DisplayTextLeft then begin
|
CursorNode.Expanded:=not CursorNode.Expanded;
|
||||||
// mousedown occured in text -> select node and begin drag operation
|
end else if x>=CursorNode.DisplayTextLeft then begin
|
||||||
Include(FStates,tvsMouseCapture);
|
// mousedown occured in text -> select node and begin drag operation
|
||||||
Selected:=CursorNode;
|
Include(FStates,tvsMouseCapture);
|
||||||
bStartDrag := true;
|
if not (tvoAllowMultiselect in Options) then begin
|
||||||
|
Selected:=CursorNode;
|
||||||
|
end else begin
|
||||||
|
if (ssShift in Shift) then begin
|
||||||
|
CursorNode.MultiSelectGroup;
|
||||||
|
end else if (ssCtrl in Shift) then begin
|
||||||
|
CursorNode.MultiSelected:=not CursorNode.MultiSelected;
|
||||||
|
end else begin
|
||||||
|
Items.ClearMultiSelection;
|
||||||
|
CursorNode.MultiSelected:=true;
|
||||||
|
writeln('AAA1 ',CursorNode.MultiSelected);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
bStartDrag := true;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
if (Button = mbLeft) and bStartDrag then
|
||||||
if (Button = mbLeft) and bStartDrag then
|
Include(fStates, tvsWaitForDragging)
|
||||||
Include(fStates, tvsWaitForDragging)
|
else begin
|
||||||
else begin
|
if ([tvsDblClicked,tvsTripleClicked,tvsQuadClicked]*fStates)<>[] then
|
||||||
if not (tvsDblClicked in fStates) then begin
|
begin
|
||||||
if Button=mbMiddle then begin
|
if Button=mbMiddle then begin
|
||||||
// insert primary selection text
|
// insert primary selection text
|
||||||
|
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
Loading…
Reference in New Issue
Block a user