📄 virtualtrees.pas
字号:
function GetPreviousVisibleColumn(Column: TColumnIndex): TColumnIndex;
function GetVisibleColumns: TColumnsArray;
function GetVisibleFixedWidth: Integer;
function IsValidColumn(Column: TColumnIndex): Boolean;
procedure LoadFromStream(const Stream: TStream; Version: Integer);
procedure PaintHeader(DC: HDC; R: TRect; HOffset: Integer); virtual;
procedure SaveToStream(const Stream: TStream);
function TotalWidth: Integer;
property ClickIndex: TColumnIndex read FClickIndex;
property Items[Index: TColumnIndex]: TVirtualTreeColumn read GetItem write SetItem; default;
property Header: TVTHeader read FHeader;
property TrackIndex: TColumnIndex read FTrackIndex;
end;
TVirtualTreeColumnsClass = class of TVirtualTreeColumns;
TVTHeaderStyle = (
hsThickButtons, // TButton look and feel
hsFlatButtons, // flatter look than hsThickButton, like an always raised flat TToolButton
hsPlates, // flat TToolButton look and feel (raise on hover etc.)
hsXPStyle // Windows XP style
);
TVTHeaderOption = (
hoAutoResize, // Adjust a column so that the header never exceeds the client width of the owner control.
hoColumnResize, // Resizing columns with the mouse is allowed.
hoDblClickResize, // Allows a column to resize itself to its largest entry.
hoDrag, // Dragging columns is allowed.
hoHotTrack, // Header captions are highlighted when mouse is over a particular column.
hoOwnerDraw, // Header items with the owner draw style can be drawn by the application via event.
hoRestrictDrag, // Header can only be dragged horizontally.
hoShowHint, // Show application defined header hint.
hoShowImages, // Show header images.
hoShowSortGlyphs, // Allow visible sort glyphs.
hoVisible, // Header is visible.
hoAutoSpring // Distribute size changes of the header to all columns, which are sizable and have the
// coAutoSpring option enabled. hoAutoResize must be enabled too.
);
TVTHeaderOptions = set of TVTHeaderOption;
THeaderState = (
hsAutoSizing, // auto size chain is in progess, do not trigger again on WM_SIZE
hsDragging, // header dragging is in progress (only if enabled)
hsDragPending, // left button is down, user might want to start dragging a column
hsLoading, // The header currently loads from stream, so updates are not necessary.
hsTracking, // column resizing is in progress
hsTrackPending // left button is down, user might want to start resize a column
);
THeaderStates = set of THeaderState;
TSortDirection = (
sdAscending,
sdDescending
);
// desribes what made a structure change event happen
TChangeReason = (
crIgnore, // used as placeholder
crAccumulated, // used for delayed changes
crChildAdded, // one or more child nodes have been added
crChildDeleted, // one or more child nodes have been deleted
crNodeAdded, // a node has been added
crNodeCopied, // a node has been duplicated
crNodeMoved // a node has been moved to a new place
);
TVTHeader = class(TPersistent)
private
FOwner: TBaseVirtualTree;
FColumns: TVirtualTreeColumns;
FHeight: Cardinal;
FFont: TFont;
FParentFont: Boolean;
FOptions: TVTHeaderOptions;
FStates: THeaderStates; // used to keep track of internal states the header can enter
FLeftTrackPos: Integer; // left border of this column to quickly calculate its width on resize
FStyle: TVTHeaderStyle; // button style
FBackground: TColor;
FAutoSizeIndex: TColumnIndex;
FPopupMenu: TPopupMenu;
FMainColumn: TColumnIndex; // the column which holds the tree
FImages: TCustomImageList;
FImageChangeLink: TChangeLink; // connections to the image list to get notified about changes
FSortColumn: TColumnIndex;
FSortDirection: TSortDirection;
FTrackStart: TPoint; // client coordinates of the tracking start point
FDragStart: TPoint; // initial mouse drag position
FDragImage: TVTDragImage; // drag image management during header drag
FLastWidth: Integer; // Used to adjust spring columns. This is the width of all visible columns,
// not the header rectangle.
procedure FontChanged(Sender: TObject);
function GetMainColumn: TColumnIndex;
function GetUseColumns: Boolean;
procedure SetAutoSizeIndex(Value: TColumnIndex);
procedure SetBackground(Value: TColor);
procedure SetColumns(Value: TVirtualTreeColumns);
procedure SetFont(const Value: TFont);
procedure SetHeight(Value: Cardinal);
procedure SetImages(const Value: TCustomImageList);
procedure SetMainColumn(Value: TColumnIndex);
procedure SetOptions(Value: TVTHeaderOptions);
procedure SetParentFont(Value: Boolean);
procedure SetSortColumn(Value: TColumnIndex);
procedure SetSortDirection(const Value: TSortDirection);
procedure SetStyle(Value: TVTHeaderStyle);
protected
function CanWriteColumns: Boolean; virtual;
procedure ChangeScale(M, D: Integer); virtual;
function DetermineSplitterIndex(P: TPoint): Boolean; virtual;
procedure DragTo(P: TPoint);
function GetColumnsClass: TVirtualTreeColumnsClass; virtual;
function GetOwner: TPersistent; override;
function GetShiftState: TShiftState;
function HandleHeaderMouseMove(var Message: TWMMouseMove): Boolean;
function HandleMessage(var Message: TMessage): Boolean; virtual;
procedure ImageListChange(Sender: TObject);
procedure PrepareDrag(P, Start: TPoint);
procedure ReadColumns(Reader: TReader);
procedure RecalculateHeader; virtual;
procedure UpdateMainColumn;
procedure UpdateSpringColumns;
procedure WriteColumns(Writer: TWriter);
public
constructor Create(AOwner: TBaseVirtualTree); virtual;
destructor Destroy; override;
procedure Assign(Source: TPersistent); override;
procedure AutoFitColumns(Animated: Boolean = True);
function InHeader(P: TPoint): Boolean; virtual;
procedure Invalidate(Column: TVirtualTreeColumn; ExpandToRight: Boolean = False);
procedure LoadFromStream(const Stream: TStream); virtual;
procedure RestoreColumns;
procedure SaveToStream(const Stream: TStream); virtual;
property DragImage: TVTDragImage read FDragImage;
property States: THeaderStates read FStates;
property Treeview: TBaseVirtualTree read FOwner;
property UseColumns: Boolean read GetUseColumns;
published
property AutoSizeIndex: TColumnIndex read FAutoSizeIndex write SetAutoSizeIndex;
property Background: TColor read FBackground write SetBackground default clBtnFace;
property Columns: TVirtualTreeColumns read FColumns write SetColumns stored False; // Stored by the owner tree to
// support VFI.
property Font: TFont read FFont write SetFont;
property Height: Cardinal read FHeight write SetHeight default 17;
property Images: TCustomImageList read FImages write SetImages;
property MainColumn: TColumnIndex read GetMainColumn write SetMainColumn default 0;
property Options: TVTHeaderOptions read FOptions write SetOptions default [hoColumnResize, hoDrag, hoShowSortGlyphs];
property ParentFont: Boolean read FParentFont write SetParentFont default False;
property PopupMenu: TPopupMenu read FPopupMenu write FPopUpMenu;
property SortColumn: TColumnIndex read FSortColumn write SetSortColumn default NoColumn;
property SortDirection: TSortDirection read FSortDirection write SetSortDirection default sdAscending;
property Style: TVTHeaderStyle read FStyle write SetStyle default hsThickButtons;
end;
TVTHeaderClass = class of TVTHeader;
// Communication interface between a tree editor and the tree itself (declared as using stdcall in case it
// is implemented in a (C/C++) DLL). The GUID is not nessecary in Delphi but important for BCB users
// to allow QueryInterface and _uuidof calls.
IVTEditLink = interface
['{2BE3EAFA-5ACB-45B4-9D9A-B58BCC496E17}']
function BeginEdit: Boolean; stdcall; // Called when editing actually starts.
function CancelEdit: Boolean; stdcall; // Called when editing has been cancelled by the tree.
function EndEdit: Boolean; stdcall; // Called when editing has been finished by the tree.
function PrepareEdit(Tree: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex): Boolean; stdcall;
// Called after creation to allow a setup.
function GetBounds: TRect; stdcall; // Called to get the current size of the edit window
// (only important if the edit resizes itself).
procedure ProcessMessage(var Message: TMessage); stdcall;
// Used to forward messages to the edit window(s)-
procedure SetBounds(R: TRect); stdcall; // Called to place the editor.
end;
// Indicates in the OnUpdating event what state the tree is currently in.
TVTUpdateState = (
usBegin, // The tree just entered the update state (BeginUpdate call for the first time).
usBeginSynch, // The tree just entered the synch update state (BeginSynch call for the first time).
usSynch, // Begin/EndSynch has been called but the tree did not change the update state.
usUpdate, // Begin/EndUpdate has been called but the tree did not change the update state.
usEnd, // The tree just left the update state (EndUpdate called for the last level).
usEndSynch // The tree just left the synch update state (EndSynch called for the last level).
);
// Used during owner draw of the header to indicate which drop mark for the column must be drawn.
TVTDropMarkMode = (
dmmNone,
dmmLeft,
dmmRight
);
// This structure carries all important information about header painting and is used in the advanced header painting.
THeaderPaintInfo = record
TargetCanvas: TCanvas;
Column: TVirtualTreeColumn;
PaintRectangle: TRect;
TextRectangle: TRect;
IsHoverIndex,
IsDownIndex,
IsEnabled,
ShowHeaderGlyph,
ShowSortGlyph,
ShowRightBorder: Boolean;
DropMark: TVTDropMarkMode;
GlyphPos,
SortGlyphPos: TPoint;
end;
// These elements are used both to query the application, which of them it wants to draw itself and to tell it during
// painting, which elements must be drawn during the advanced custom draw events.
THeaderPaintElements = set of (
hpeBackground,
hpeDropMark,
hpeHeaderGlyph,
hpeSortGlyph,
hpeText
);
// Various events must be handled at different places than they were initiated or need
// a persistent storage until they are reset.
TVirtualTreeStates = set of (
tsCancelHintAnimation, // Set when a new hint is about to show but an old hint is still being animated.
tsChangePending, // A selection change is pending.
tsCheckPropagation, // Set during automatic check state propagation.
tsCollapsing, // A full collapse operation is in progress.
tsToggleFocusedSelection, // Node selection was modifed using Ctrl-click. Change selection state on next mouse up.
tsClearPending, // Need to clear the current selection on next mouse move.
tsClipboardFlushing, // Set during flushing the clipboard to avoid freeing the content.
tsCopyPending, // Indicates a pending copy operation which needs to be finished.
tsCutPending, // Indicates a pending cut operation which needs to be finished.
tsDrawSelPending, // Multiselection only. User held down the left mouse button on a free
// area and might want to start draw selection.
tsDrawSelecting, // Multiselection only. Draw selection has actually started.
tsEditing, // Indicates that an edit operation is currently in progress.
tsEditPending, // An mouse up start edit if dragging has not started.
tsExpanding, // A full expand operation is in progress.
tsHint, // Set when our hint is visible or soon will be.
tsInAnimation, // Set if the tree is currently in an animation loop.
tsIncrementalSearching, // Set when the user starts incremental search.
tsIncrementalSearchPending, // Set in WM_KEYDOWN to tell to use the char in WM_CHAR for incremental search.
tsIterating, // Set when IterateSubtree is currently in progress.
tsKeyCheckPending, // A check operation is under way, initiated by a key press (space key). Ignore mouse.
tsLeftButtonDown, // Set when the left mouse button is down.
tsMouseCheckPending, // A check operation is under way, initiated by a mouse click. Ignore space key.
tsMiddleButtonDown, // Set when the middle mouse button is down.
tsNeedScale, // On next ChangeScale scale the default node height.
tsNeedRootCountUpdate, // Set if while loading a root node count is set.
tsOLEDragging, // OLE dragging in progress.
tsOLEDragPending, // User has requested to start delayed dragging.
tsPainting, // The tree is currently painting itself.
tsRightButtonDown, // Set when the right mouse button is down.
tsPopupMenuShown, // The user clicked the right mouse button, which might cause a popup menu to appear.
tsScrolling, // Set when autoscrolling is active.
tsScrollPending, // Set when waiting for the scroll delay time to elapse.
tsSizing, // Set when the tree window is being resized. This is used to prevent recursive calls
// due to setting the
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -