* Synchronize with main VTV repository up to svn rev 285

* Add file with v5 upgrade issues

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@3290 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
blikblum
2014-07-06 16:49:24 +00:00
parent 9ac30f010f
commit 486e6b630c
2 changed files with 113 additions and 56 deletions

View File

@@ -27,7 +27,25 @@ unit VirtualTrees;
// (C) 1999-2001 digital publishing AG. All Rights Reserved. // (C) 1999-2001 digital publishing AG. All Rights Reserved.
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
// //
// October 2010
// - Bug Fix: Now taking horizontal scroll position into account when drawing text of EmptyListMessage property
// - Bug Fix: Prevented potential "index out of bounds" exception in TVirtualTreeHintWindow.CalcHintRect
// - Bug Fix - Issue #187: Showing a dialog in OnChange or OnRemoveSelection event handlers can cause the VT to
// enter mode for drawing selection rectangle.
// - Improvement: Made inherited event OnCanResize published for TVirtualStringTree for Delphi 2010 and later
//
// - Improvement: TBaseVirtualTree.ToggleNode now tries to keep the visual position of the toggled node,
// even when toChildrenAbove is set
// September 2010
// - Improvement: Added additional check regarding the tree reference to TVirtualTreeHintWindow.AnimationCallback
// - Improvement: Made TBaseVirtualTree.AdjustImageBorder protected and virtual
// - Improvement: TVirtualTreeColumns now observes if the focused column is removed
// - Improvement: Made compatible with Delphi XE (Thanks to Roman Kassebaum)
// August 2010 // August 2010
// - Improvement: TCustomVirtualStringTree.DoTextMeasuring now returns TSize
// - Improvement: Renamed TVTMeasureTextWidthEvent to TVTMeasureTextEvent and introduced new
// event TCustomVirtualStringTree.OnMeasureTextHeight
// - Improvement: Made TBaseVirtualTree.GetMaxColumnWidth virtual
// - Bug fix: TBaseVirtualTree.OnRemoveFromSelection is now triggered by TBaseVirtualTree.RemoveFromSelection // - Bug fix: TBaseVirtualTree.OnRemoveFromSelection is now triggered by TBaseVirtualTree.RemoveFromSelection
// as intended // as intended
// July 2010 // July 2010
@@ -1414,6 +1432,7 @@ type
procedure HandleClick(P: TPoint; Button: TMouseButton; Force, DblClick: Boolean); virtual; procedure HandleClick(P: TPoint; Button: TMouseButton; Force, DblClick: Boolean); virtual;
procedure IndexChanged(OldIndex, NewIndex: Integer); procedure IndexChanged(OldIndex, NewIndex: Integer);
procedure InitializePositionArray; procedure InitializePositionArray;
procedure Notify(Item: TCollectionItem; Action: TCollectionNotification); override;
procedure ReorderColumns(RTL: Boolean); procedure ReorderColumns(RTL: Boolean);
procedure Update(Item: TCollectionItem); override; procedure Update(Item: TCollectionItem); override;
procedure UpdatePositions(Force: Boolean = False); procedure UpdatePositions(Force: Boolean = False);
@@ -2496,10 +2515,8 @@ type
FOnEndOperation: TVTOperationEvent; // Called when an operation ends FOnEndOperation: TVTOperationEvent; // Called when an operation ends
procedure AdjustCoordinatesByIndent(var PaintInfo: TVTPaintInfo; Indent: Integer); procedure AdjustCoordinatesByIndent(var PaintInfo: TVTPaintInfo; Indent: Integer);
procedure AdjustImageBorder(ImageWidth, ImageHeight: Integer; BidiMode: TBidiMode; VAlign: Integer; var R: TRect; procedure AdjustTotalCount(Node: PVirtualNode; Value: Integer; relative: Boolean = False);
var ImageInfo: TVTImageInfo); procedure AdjustTotalHeight(Node: PVirtualNode; Value: Integer; relative: Boolean = False);
procedure AdjustTotalCount(Node: PVirtualNode; Value: Integer; Relative: Boolean = False);
procedure AdjustTotalHeight(Node: PVirtualNode; Value: Integer; Relative: Boolean = False);
function CalculateCacheEntryCount: Integer; function CalculateCacheEntryCount: Integer;
procedure CalculateVerticalAlignments(ShowImages, ShowStateImages: Boolean; Node: PVirtualNode; out VAlign, procedure CalculateVerticalAlignments(ShowImages, ShowStateImages: Boolean; Node: PVirtualNode; out VAlign,
VButtonAlign: Integer); VButtonAlign: Integer);
@@ -2676,6 +2693,10 @@ type
procedure SetEmptyListMessage(const Value: String); procedure SetEmptyListMessage(const Value: String);
procedure AddToSelection(Node: PVirtualNode); overload; virtual; procedure AddToSelection(Node: PVirtualNode); overload; virtual;
procedure AddToSelection(const NewItems: TNodeArray; NewLength: Integer; ForceInsert: Boolean = False); overload; virtual; procedure AddToSelection(const NewItems: TNodeArray; NewLength: Integer; ForceInsert: Boolean = False); overload; virtual;
procedure AdjustImageBorder(Images: TCustomImageList; BidiMode: TBidiMode; VAlign: Integer; var R: TRect;
var ImageInfo: TVTImageInfo); virtual; overload;
procedure AdjustImageBorder(ImageWidth, ImageHeight: Integer; BidiMode: TBidiMode; VAlign: Integer; var R: TRect;
var ImageInfo: TVTImageInfo); overload;
procedure AdjustPaintCellRect(var PaintInfo: TVTPaintInfo; out NextNonEmpty: TColumnIndex); virtual; procedure AdjustPaintCellRect(var PaintInfo: TVTPaintInfo; out NextNonEmpty: TColumnIndex); virtual;
procedure AdjustPanningCursor(X, Y: Integer); virtual; procedure AdjustPanningCursor(X, Y: Integer); virtual;
procedure AdviseChangeEvent(StructureChange: Boolean; Node: PVirtualNode; Reason: TChangeReason); virtual; procedure AdviseChangeEvent(StructureChange: Boolean; Node: PVirtualNode; Reason: TChangeReason); virtual;
@@ -2829,7 +2850,7 @@ type
procedure FontChanged(AFont: TObject); virtual; procedure FontChanged(AFont: TObject); virtual;
function GetBorderDimensions: TSize; virtual; function GetBorderDimensions: TSize; virtual;
function GetCheckImage(Node: PVirtualNode; ImgCheckType: TCheckType = ctNone; function GetCheckImage(Node: PVirtualNode; ImgCheckType: TCheckType = ctNone;
ImgCheckState: TCheckState = csUncheckedNormal; ImgEnabled: Boolean = False): Integer; virtual; ImgCheckState: TCheckState = csUncheckedNormal; ImgEnabled: Boolean = True): Integer; virtual;
class function GetCheckImageListFor(Kind: TCheckImageKind): TCustomImageList; virtual; class function GetCheckImageListFor(Kind: TCheckImageKind): TCustomImageList; virtual;
function GetClientRect: TRect; override; function GetClientRect: TRect; override;
function GetColumnClass: TVirtualTreeColumnClass; virtual; function GetColumnClass: TVirtualTreeColumnClass; virtual;
@@ -3161,7 +3182,7 @@ type
function GetLastVisibleChildNoInit(Node: PVirtualNode; IncludeFiltered: Boolean = False): PVirtualNode; function GetLastVisibleChildNoInit(Node: PVirtualNode; IncludeFiltered: Boolean = False): PVirtualNode;
function GetLastVisibleNoInit(Node: PVirtualNode = nil; ConsiderChildrenAbove: Boolean = True; function GetLastVisibleNoInit(Node: PVirtualNode = nil; ConsiderChildrenAbove: Boolean = True;
IncludeFiltered: Boolean = False): PVirtualNode; IncludeFiltered: Boolean = False): PVirtualNode;
function GetMaxColumnWidth(Column: TColumnIndex; UseSmartColumnWidth: Boolean = False): Integer; function GetMaxColumnWidth(Column: TColumnIndex; UseSmartColumnWidth: Boolean = False): Integer; virtual;
function GetNext(Node: PVirtualNode; ConsiderChildrenAbove: Boolean = False): PVirtualNode; function GetNext(Node: PVirtualNode; ConsiderChildrenAbove: Boolean = False): PVirtualNode;
function GetNextChecked(Node: PVirtualNode; State: TCheckState = csCheckedNormal; function GetNextChecked(Node: PVirtualNode; State: TCheckState = csCheckedNormal;
ConsiderChildrenAbove: Boolean = False): PVirtualNode; overload; ConsiderChildrenAbove: Boolean = False): PVirtualNode; overload;
@@ -3434,8 +3455,8 @@ type
TVSTShortenStringEvent = procedure(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; TVSTShortenStringEvent = procedure(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode;
Column: TColumnIndex; const S: String; TextSpace: Integer; var Result: String; Column: TColumnIndex; const S: String; TextSpace: Integer; var Result: String;
var Done: Boolean) of object; var Done: Boolean) of object;
TVTMeasureTextWidthEvent = procedure(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; TVTMeasureTextEvent = procedure(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode;
Column: TColumnIndex; const Text: String; var Width: Integer) of object; Column: TColumnIndex; const Text: String; var Extent: Integer) of object;
TVTDrawTextEvent = procedure(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; TVTDrawTextEvent = procedure(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode;
Column: TColumnIndex; const Text: String; const CellRect: TRect; var DefaultDraw: Boolean) of object; Column: TColumnIndex; const Text: String; const CellRect: TRect; var DefaultDraw: Boolean) of object;
@@ -3477,7 +3498,8 @@ type
FOnGetHint: TVSTGetHintEvent; // used to retrieve the hint to be displayed for a specific node FOnGetHint: TVSTGetHintEvent; // used to retrieve the hint to be displayed for a specific node
FOnNewText: TVSTNewTextEvent; // used to notify the application about an edited node caption FOnNewText: TVSTNewTextEvent; // used to notify the application about an edited node caption
FOnShortenString: TVSTShortenStringEvent; // used to allow the application a customized string shortage FOnShortenString: TVSTShortenStringEvent; // used to allow the application a customized string shortage
FOnMeasureTextWidth: TVTMeasureTextWidthEvent; // used to adjust the width of the cells FOnMeasureTextWidth: TVTMeasureTextEvent; // used to adjust the width of the cells
FOnMeasureTextHeight: TVTMeasureTextEvent;
FOnDrawText: TVTDrawTextEvent; // used to custom draw the node text FOnDrawText: TVTDrawTextEvent; // used to custom draw the node text
procedure AddContentToBuffer(Buffer: TBufferedUTF8String; Source: TVSTTextSourceType; const Separator: String); procedure AddContentToBuffer(Buffer: TBufferedUTF8String; Source: TVSTTextSourceType; const Separator: String);
@@ -3514,7 +3536,7 @@ type
function DoShortenString(Canvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; const S: String; Width: Integer; function DoShortenString(Canvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; const S: String; Width: Integer;
EllipsisWidth: Integer = 0): String; virtual; EllipsisWidth: Integer = 0): String; virtual;
procedure DoTextDrawing(var PaintInfo: TVTPaintInfo; const Text: String; CellRect: TRect; DrawFormat: Cardinal); virtual; procedure DoTextDrawing(var PaintInfo: TVTPaintInfo; const Text: String; CellRect: TRect; DrawFormat: Cardinal); virtual;
function DoTextMeasuring(Canvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; const Text: String): Integer; virtual; function DoTextMeasuring(Canvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; const Text: String): TSize; virtual;
function GetOptionsClass: TTreeOptionsClass; override; function GetOptionsClass: TTreeOptionsClass; override;
function InternalData(Node: PVirtualNode): Pointer; function InternalData(Node: PVirtualNode): Pointer;
procedure MainColumnChanged; override; procedure MainColumnChanged; override;
@@ -3532,7 +3554,8 @@ type
property OnNewText: TVSTNewTextEvent read FOnNewText write FOnNewText; property OnNewText: TVSTNewTextEvent read FOnNewText write FOnNewText;
property OnPaintText: TVTPaintText read FOnPaintText write FOnPaintText; property OnPaintText: TVTPaintText read FOnPaintText write FOnPaintText;
property OnShortenString: TVSTShortenStringEvent read FOnShortenString write FOnShortenString; property OnShortenString: TVSTShortenStringEvent read FOnShortenString write FOnShortenString;
property OnMeasureTextWidth: TVTMeasureTextWidthEvent read FOnMeasureTextWidth write FOnMeasureTextWidth; property OnMeasureTextWidth: TVTMeasureTextEvent read FOnMeasureTextWidth write FOnMeasureTextWidth;
property OnMeasureTextHeight: TVTMeasureTextEvent read FOnMeasureTextHeight write FOnMeasureTextHeight;
property OnDrawText: TVTDrawTextEvent read FOnDrawText write FOnDrawText; property OnDrawText: TVTDrawTextEvent read FOnDrawText write FOnDrawText;
public public
constructor Create(AOwner: TComponent); override; constructor Create(AOwner: TComponent); override;
@@ -3756,6 +3779,7 @@ type
property OnLoadTree; property OnLoadTree;
property OnMeasureItem; property OnMeasureItem;
property OnMeasureTextWidth; property OnMeasureTextWidth;
property OnMeasureTextHeight;
property OnMouseDown; property OnMouseDown;
property OnMouseMove; property OnMouseMove;
property OnMouseUp; property OnMouseUp;
@@ -3785,6 +3809,8 @@ type
property OnStructureChange; property OnStructureChange;
property OnUpdating; property OnUpdating;
property OnUTF8KeyPress; property OnUTF8KeyPress;
//delphi only
//property OnCanResize;
end; end;
TVTDrawHintEvent = procedure(Sender: TBaseVirtualTree; HintCanvas: TCanvas; Node: PVirtualNode; const R: TRect; TVTDrawHintEvent = procedure(Sender: TBaseVirtualTree; HintCanvas: TCanvas; Node: PVirtualNode; const R: TRect;
@@ -8174,6 +8200,17 @@ end;
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
procedure TVirtualTreeColumns.Notify(Item: TCollectionItem; Action: TCollectionNotification);
begin
if Action in [cnExtracting, cnDeleting] then
with Header.Treeview do
if not (csLoading in ComponentState) and (FFocusedColumn = Item.Index) then
FFocusedColumn := NoColumn;
end;
//----------------------------------------------------------------------------------------------------------------------
procedure TVirtualTreeColumns.ReorderColumns(RTL: Boolean); procedure TVirtualTreeColumns.ReorderColumns(RTL: Boolean);
var var
@@ -11741,28 +11778,7 @@ end;
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
procedure TBaseVirtualTree.AdjustImageBorder(ImageWidth, ImageHeight: Integer; BidiMode: TBidiMode; VAlign: Integer; var R: TRect; procedure TBaseVirtualTree.AdjustTotalCount(Node: PVirtualNode; Value: Integer; relative: Boolean = False);
var ImageInfo: TVTImageInfo);
// Depending on the width of the image list as well as the given bidi mode R must be adjusted.
begin
if BidiMode = bdLeftToRight then
begin
ImageInfo.XPos := R.Left;
Inc(R.Left, ImageWidth + 2);
end
else
begin
ImageInfo.XPos := R.Right - Images.Width;
Dec(R.Right, ImageWidth + 2);
end;
ImageInfo.YPos := R.Top + VAlign - ImageHeight div 2;
end;
//----------------------------------------------------------------------------------------------------------------------
procedure TBaseVirtualTree.AdjustTotalCount(Node: PVirtualNode; Value: Integer; Relative: Boolean = False);
// Sets a node's total count to the given value and recursively adjusts the parent's total count // Sets a node's total count to the given value and recursively adjusts the parent's total count
// (actually, the adjustment is done iteratively to avoid function call overheads). // (actually, the adjustment is done iteratively to avoid function call overheads).
@@ -17332,6 +17348,39 @@ end;
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
procedure TBaseVirtualTree.AdjustImageBorder(Images: TCustomImageList; BidiMode: TBidiMode; VAlign: Integer; var R: TRect;
var ImageInfo: TVTImageInfo);
// Depending on the width of the image list as well as the given bidi mode R must be adjusted.
begin
AdjustImageBorder(Images.Width, Images.Height, BidiMode, VAlign, R, ImageInfo);
end;
//----------------------------------------------------------------------------------------------------------------------
procedure TBaseVirtualTree.AdjustImageBorder(ImageWidth, ImageHeight: Integer; BidiMode: TBidiMode; VAlign: Integer; var R: TRect;
var ImageInfo: TVTImageInfo);
// Depending on the width of the image list as well as the given bidi mode R must be adjusted.
begin
if BidiMode = bdLeftToRight then
begin
ImageInfo.XPos := R.Left;
Inc(R.Left, ImageWidth + 2);
end
else
begin
ImageInfo.XPos := R.Right - Images.Width;
Dec(R.Right, ImageWidth + 2);
end;
ImageInfo.YPos := R.Top + VAlign - ImageHeight div 2;
end;
//----------------------------------------------------------------------------------------------------------------------
procedure TBaseVirtualTree.AdjustPaintCellRect(var PaintInfo: TVTPaintInfo; out NextNonEmpty: TColumnIndex); procedure TBaseVirtualTree.AdjustPaintCellRect(var PaintInfo: TVTPaintInfo; out NextNonEmpty: TColumnIndex);
// Used in descendants to modify the paint rectangle of the current column while painting a certain node. // Used in descendants to modify the paint rectangle of the current column while painting a certain node.
@@ -20693,7 +20742,7 @@ end;
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
function TBaseVirtualTree.GetCheckImage(Node: PVirtualNode; ImgCheckType: TCheckType = ctNone; ImgCheckState: function TBaseVirtualTree.GetCheckImage(Node: PVirtualNode; ImgCheckType: TCheckType = ctNone; ImgCheckState:
TCheckState = csUncheckedNormal; ImgEnabled: Boolean = False): Integer; TCheckState = csUncheckedNormal; ImgEnabled: Boolean = True): Integer;
// Determines the index into the check image list for the given node depending on the check type // Determines the index into the check image list for the given node depending on the check type
// and enabled state. // and enabled state.
@@ -21577,6 +21626,21 @@ begin
CanClear := not AutoDrag and CanClear := not AutoDrag and
(not (tsRightButtonDown in FStates) or not HasPopupMenu(HitNode, HitColumn, Point(XPos, YPos))); (not (tsRightButtonDown in FStates) or not HasPopupMenu(HitNode, HitColumn, Point(XPos, YPos)));
// User starts a selection with a selection rectangle.
if not (toDisableDrawSelection in FOptions.FSelectionOptions) and not (IsHit or FullRowDrag) and MultiSelect then
begin
SetCapture(Handle);
DoStateChange([tsDrawSelPending]);
FDrawSelShiftState := ShiftState;
FNewSelRect := Rect(Message.XPos + FEffectiveOffsetX, Message.YPos - FOffsetY, Message.XPos + FEffectiveOffsetX,
Message.YPos - FOffsetY);
//lclheader
if hoVisible in FHeader.Options then
OffsetRect(FNewSelRect, 0, -FHeader.Height);
{$ifdef DEBUG_VTV}Logger.Send([lcSelection],'FNewSelRect', FNewSelRect);{$endif}
FLastSelRect := Rect(0, 0, 0, 0);
end;
//lcl //lcl
FocusCanChange := DoFocusChanging(FFocusedNode, HitInfo.HitNode, FFocusedColumn, Column); FocusCanChange := DoFocusChanging(FFocusedNode, HitInfo.HitNode, FFocusedColumn, Column);
@@ -21610,20 +21674,10 @@ begin
(hiOnItem in HitInfo.HitPositions))) and NodeSelected and not NewColumn and ShiftEmpty then (hiOnItem in HitInfo.HitPositions))) and NodeSelected and not NewColumn and ShiftEmpty then
DoStateChange([tsEditPending]); DoStateChange([tsEditPending]);
// User starts a selection with a selection rectangle.
if not (toDisableDrawSelection in FOptions.FSelectionOptions) and not (IsHit or FullRowDrag) and MultiSelect then if not (toDisableDrawSelection in FOptions.FSelectionOptions) and not (IsHit or FullRowDrag) and MultiSelect then
begin begin
SetCapture(Handle); // The original code here was moved up to fix issue #187.
DoStateChange([tsDrawSelPending]); // In order not to break the semantics of this procedure, we are leaving these if statements here
FDrawSelShiftState := ShiftState;
FNewSelRect := Rect(Message.XPos + FEffectiveOffsetX, Message.YPos - FOffsetY, Message.XPos + FEffectiveOffsetX,
Message.YPos - FOffsetY);
//lclheader
if hoVisible in FHeader.Options then
OffsetRect(FNewSelRect, 0, -FHeader.Height);
{$ifdef DEBUG_VTV}Logger.Send([lcSelection],'FNewSelRect', FNewSelRect);{$endif}
FLastSelRect := Rect(0, 0, 0, 0);
if not IsCellHit then if not IsCellHit then
Exit; Exit;
end; end;
@@ -29434,7 +29488,7 @@ begin
// output a message if no items are to display // output a message if no items are to display
Canvas.Font := Self.Font; Canvas.Font := Self.Font;
SetBkMode(TargetCanvas.Handle, TRANSPARENT); SetBkMode(TargetCanvas.Handle, TRANSPARENT);
TextOut(TargetCanvas.Handle, 2, 2, PAnsiChar(FEmptyListMessage), Length(FEmptyListMessage)); TextOut(TargetCanvas.Handle, 2 - Window.Left, 2 - Window.Top, PAnsiChar(FEmptyListMessage), Length(FEmptyListMessage));
end;//if end;//if
DoAfterPaint(TargetCanvas); DoAfterPaint(TargetCanvas);
@@ -30435,6 +30489,8 @@ begin
begin begin
NeedUpdate := True; NeedUpdate := True;
// Calculate the height delta right now as we need it for toChildrenAbove anyway.
HeightDelta := -Integer(Node.TotalHeight) + Integer(NodeHeight[Node]);
if (FUpdateCount = 0) and (toAnimatedToggle in FOptions.FAnimationOptions) and not if (FUpdateCount = 0) and (toAnimatedToggle in FOptions.FAnimationOptions) and not
(tsCollapsing in FStates) then (tsCollapsing in FStates) then
begin begin
@@ -30448,7 +30504,6 @@ begin
// on the position of the node to be collapsed. // on the position of the node to be collapsed.
R1 := GetDisplayRect(Node, NoColumn, False); R1 := GetDisplayRect(Node, NoColumn, False);
Mode2 := tamNoScroll; Mode2 := tamNoScroll;
HeightDelta := -Integer(Node.TotalHeight) + Integer(NodeHeight[Node]);
if toChildrenAbove in FOptions.FPaintOptions then if toChildrenAbove in FOptions.FPaintOptions then
begin begin
PosHoldable := (FOffsetY + (Integer(Node.TotalHeight - NodeHeight[Node]))) <= 0; PosHoldable := (FOffsetY + (Integer(Node.TotalHeight - NodeHeight[Node]))) <= 0;
@@ -31995,7 +32050,7 @@ begin
Canvas.Font := Font; Canvas.Font := Font;
DoPaintText(Node, Canvas, Column, ttNormal); DoPaintText(Node, Canvas, Column, ttNormal);
Inc(Result, DoTextMeasuring(Canvas, Node, Column, Text)); Inc(Result, DoTextMeasuring(Canvas, Node, Column, Text).cx);
end; end;
end; end;
@@ -32234,28 +32289,28 @@ end;
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
function TCustomVirtualStringTree.DoTextMeasuring(Canvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; function TCustomVirtualStringTree.DoTextMeasuring(Canvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
const Text: String): Integer; const Text: String): TSize;
var var
Size: TSize;
R: TRect; R: TRect;
DrawFormat: Integer; DrawFormat: Integer;
begin begin
GetTextExtentPoint32(Canvas.Handle, PChar(Text), Length(Text), Size); GetTextExtentPoint32(Canvas.Handle, PChar(Text), Length(Text), Result);
if vsMultiLine in Node.States then if vsMultiLine in Node.States then
begin begin
DrawFormat := DT_CALCRECT or DT_NOPREFIX or DT_WORDBREAK or DT_END_ELLIPSIS or DT_EDITCONTROL or AlignmentToDrawFlag[Alignment]; DrawFormat := DT_CALCRECT or DT_NOPREFIX or DT_WORDBREAK or DT_END_ELLIPSIS or DT_EDITCONTROL or AlignmentToDrawFlag[Alignment];
if BidiMode <> bdLeftToRight then if BidiMode <> bdLeftToRight then
DrawFormat := DrawFormat or DT_RTLREADING; DrawFormat := DrawFormat or DT_RTLREADING;
R := Rect(0, 0, Size.cx, MaxInt); R := Rect(0, 0, Result.cx, MaxInt);
DrawText(Canvas.Handle, PChar(Text), Length(Text), R, DrawFormat); DrawText(Canvas.Handle, PChar(Text), Length(Text), R, DrawFormat);
Size.cx := R.Right - R.Left; Result.cx := R.Right - R.Left;
end; end;
Result := Size.cx;
if Assigned(FOnMeasureTextWidth) then if Assigned(FOnMeasureTextWidth) then
FOnMeasureTextWidth(Self, Canvas, Node, Column, Text, Result); FOnMeasureTextWidth(Self, Canvas, Node, Column, Text, Result.cx);
if Assigned(FOnMeasureTextHeight) then
FOnMeasureTextHeight(Self, Canvas, Node, Column, Text, Result.cy);
end; end;
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------

View File

@@ -0,0 +1,2 @@
* Use TImageList in checkbox support
* Review ContentTo* methods