Skip to content

Commit 58e0562

Browse files
Merge pull request #1285 from Npc8/master
Add ColumnHeaderSpanning event
2 parents d150cb8 + 09066e5 commit 58e0562

File tree

3 files changed

+33
-2
lines changed

3 files changed

+33
-2
lines changed

Source/VirtualTrees.BaseTree.pas

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,8 @@ TClipboardFormats = class(TStringList)
326326
const APlusSelectedHotBM :TBitmap; const AMinusBM : TBitmap; const AMinusHotBM : TBitmap;
327327
const AMinusSelectedHotBM :TBitmap; var ASize : TSize) of object;
328328

329+
TVTColumnHeaderSpanningEvent = procedure(Sender: TVTHeader; Column: TColumnIndex; var Count: Cardinal) of object;
330+
329331
// search, sort
330332
TVTCompareEvent = procedure(Sender: TBaseVirtualTree; Node1, Node2: PVirtualNode; Column: TColumnIndex;
331333
var Result: Integer) of object;
@@ -680,6 +682,7 @@ TBaseVirtualTree = class abstract(TVTBaseAncestor)
680682
// not covered by any node
681683
FOnMeasureItem: TVTMeasureItemEvent; // Triggered when a node is about to be drawn and its height was not yet
682684
// determined by the application.
685+
FOnColumnHeaderSpanning: TVTColumnHeaderSpanningEvent; // triggered before the header column area been create for painting
683686
FOnGetUserClipboardFormats: TVTGetUserClipboardFormatsEvent; // gives application/descendants the opportunity to
684687
// add own clipboard formats on the fly
685688
FOnPaintText: TVTPaintText; // triggered before either normal or fixed text is painted to allow
@@ -1055,6 +1058,7 @@ TBaseVirtualTree = class abstract(TVTBaseAncestor)
10551058
procedure DoStructureChange(Node: PVirtualNode; Reason: TChangeReason); virtual;
10561059
procedure DoTimerScroll; virtual;
10571060
procedure DoUpdating(State: TVTUpdateState); virtual;
1061+
procedure DoColumnHeaderSpanning(Column: TColumnIndex; var Count: Cardinal); virtual;
10581062
function DoValidateCache: Boolean; virtual;
10591063
procedure DragAndDrop(AllowedEffects: DWord; const DataObject: TVTDragDataObject; var DragEffect: Integer); virtual;
10601064
procedure DragCanceled; override;
@@ -1375,6 +1379,7 @@ TBaseVirtualTree = class abstract(TVTBaseAncestor)
13751379
property OnStateChange: TVTStateChangeEvent read FOnStateChange write FOnStateChange;
13761380
property OnStructureChange: TVTStructureChangeEvent read FOnStructureChange write FOnStructureChange;
13771381
property OnUpdating: TVTUpdatingEvent read FOnUpdating write FOnUpdating;
1382+
property OnColumnHeaderSpanning: TVTColumnHeaderSpanningEvent read FOnColumnHeaderSpanning write FOnColumnHeaderSpanning;
13781383
public
13791384
constructor Create(AOwner: TComponent); override;
13801385
destructor Destroy; override;
@@ -9671,6 +9676,14 @@ procedure TBaseVirtualTree.DoColumnDblClick(Column: TColumnIndex; Shift: TShiftS
96719676

96729677
//----------------------------------------------------------------------------------------------------------------------
96739678

9679+
procedure TBaseVirtualTree.DoColumnHeaderSpanning(Column: TColumnIndex; var Count: Cardinal);
9680+
begin
9681+
if Assigned(FOnColumnHeaderSpanning) then
9682+
FOnColumnHeaderSpanning(Self.Header, Column, Count);
9683+
end;
9684+
9685+
//----------------------------------------------------------------------------------------------------------------------
9686+
96749687
procedure TBaseVirtualTree.DoColumnResize(Column: TColumnIndex);
96759688

96769689
var

Source/VirtualTrees.Header.pas

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5743,6 +5743,8 @@ procedure TVirtualTreeColumns.PaintHeader(TargetCanvas : TCanvas; R : TRect; con
57435743
var
57445744
TargetRect : TRect;
57455745
MaxX : TDimension;
5746+
Count: Cardinal;
5747+
EndCol: TColumnIndex;
57465748
begin
57475749
if IsRectEmpty(R) then
57485750
Exit;
@@ -5799,7 +5801,21 @@ procedure TVirtualTreeColumns.PaintHeader(TargetCanvas : TCanvas; R : TRect; con
57995801
// Now go for each button.
58005802
while (Run > NoColumn) and (TargetRect.Left < MaxX) do
58015803
begin
5802-
TargetRect.Right := TargetRect.Left + Items[Run].Width;
5804+
5805+
//let application decide how many columns can be spanned
5806+
Count:= 1;
5807+
TreeViewControl.DoColumnHeaderSpanning(Run, Count);
5808+
5809+
if Count > FHeader.Columns.Count then Count := FHeader.Columns.Count;
5810+
if Count < 1 then Count := 1;
5811+
5812+
EndCol:= Run;
5813+
TargetRect.Right := TargetRect.Left;
5814+
repeat
5815+
Inc(TargetRect.Right, Items[EndCol].Width);
5816+
Dec(Count);
5817+
EndCol := GetNextVisibleColumn(EndCol);
5818+
until (Count = 0) or (EndCol <= NoColumn);
58035819

58045820
// create a clipping rect to limit painting to button area
58055821
ClipCanvas(TargetCanvas, Rect(Max(TargetRect.Left, Target.X), Target.Y + R.Top,
@@ -5810,7 +5826,8 @@ procedure TVirtualTreeColumns.PaintHeader(TargetCanvas : TCanvas; R : TRect; con
58105826
SelectClipRgn(Handle, 0);
58115827

58125828
TargetRect.Left := TargetRect.Right;
5813-
Run := GetNextVisibleColumn(Run);
5829+
5830+
Run := EndCol;
58145831
end;
58155832
end;
58165833
end;

Source/VirtualTrees.pas

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -595,6 +595,7 @@ TVirtualStringTree = class(TCustomVirtualStringTree)
595595
property OnCanResize;
596596
property OnGesture;
597597
property Touch;
598+
property OnColumnHeaderSpanning;
598599
end;
599600

600601
//----------------------------------------------------------------------------------------------------------------------

0 commit comments

Comments
 (0)