lazarus/examples/virtualtreeview/vst_advanced/MultilineDemo.pas

160 lines
5.2 KiB
ObjectPascal

unit MultilineDemo;
{$MODE Delphi}
{$H+}
// Virtual Treeview sample form demonstrating following features:
// - Multiline node captions.
// Written by Mike Lischke.
interface
uses
LCLIntf, SysUtils, Classes, Forms, Controls, Graphics, Laz.VirtualTrees,
ExtCtrls, StdCtrls, LResources;
type
TNodeForm = class(TForm)
Panel1: TPanel;
MLTree: TLazVirtualStringTree;
Label8: TLabel;
AutoAdjustCheckBox: TCheckBox;
procedure MLTreeInitNode(Sender: TBaseVirtualTree; ParentNode, Node: PVirtualNode;
var InitialStates: TVirtualNodeInitStates);
procedure FormCreate(Sender: TObject);
procedure MLTreeGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex;
TextType: TVSTTextType; var CellText: String);
procedure MLTreePaintText(Sender: TBaseVirtualTree; const TargetCanvas: TCanvas; Node: PVirtualNode;
Column: TColumnIndex; TextType: TVSTTextType);
procedure MLTreeEditing(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; var Allowed: Boolean);
procedure MLTreeStateChange(Sender: TBaseVirtualTree; Enter, Leave: TVirtualTreeStates);
procedure MLTreeMeasureItem(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode;
var NodeHeight: Integer);
procedure AutoAdjustCheckBoxClick(Sender: TObject);
end;
//----------------------------------------------------------------------------------------------------------------------
implementation
{$R *.lfm}
uses
Main, States;
var
DemoText: array[0..29] of String;
//----------------------------------------------------------------------------------------------------------------------
procedure TNodeForm.MLTreeInitNode(Sender: TBaseVirtualTree; ParentNode, Node: PVirtualNode;
var InitialStates: TVirtualNodeInitStates);
begin
Node.Align := 20; // Alignment of expand/collapse button nearly at the top of the node.
if (Node.Index mod 3) = 0 then
begin
MLTree.NodeHeight[Node] := 40;
end
else
begin
MLTree.NodeHeight[Node] := 120;
Include(InitialStates, ivsMultiline);
end;
end;
//----------------------------------------------------------------------------------------------------------------------
procedure TNodeForm.FormCreate(Sender: TObject);
begin
LoadUnicodeStrings('Lorem ipsum', DemoText);
end;
//----------------------------------------------------------------------------------------------------------------------
procedure TNodeForm.MLTreeGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex;
TextType: TVSTTextType; var CellText: String);
// Returns the text for the given node. This text was loaded at form creation time from the application resource.
begin
// The display is organized so that for every two main text nodes a node with empty main text is used. This
// node however gets text in its second column (with column spanning enabled).
// This creates the visual effect of a chapter heading and two indented paragraphs.
// Another possibility to get this effect is to use child nodes and only one column.
// Note: the main column is in the second position!
case Column of
0: // Main column.
if (Node.Index mod 3) = 0 then
CellText := ''
else
CellText := DemoText[Node.Index mod 30];
1:
if (Node.Index mod 3) = 0 then
CellText := DemoText[Node.Index mod 30]
else
CellText := '';
end;
end;
//----------------------------------------------------------------------------------------------------------------------
procedure TNodeForm.MLTreePaintText(Sender: TBaseVirtualTree; const TargetCanvas: TCanvas;
Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType);
begin
if (Node.Index mod 3) = 0 then
begin
TargetCanvas.Font.Size := 12;
TargetCanvas.Font.Style := [fsBold];
end;
end;
//----------------------------------------------------------------------------------------------------------------------
procedure TNodeForm.MLTreeEditing(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex;
var Allowed: Boolean);
begin
Allowed := (Node.Index mod 3) <> 0;
end;
//----------------------------------------------------------------------------------------------------------------------
procedure TNodeForm.MLTreeStateChange(Sender: TBaseVirtualTree; Enter, Leave: TVirtualTreeStates);
begin
if not (csDestroying in ComponentState) then
UpdateStateDisplay(Sender.TreeStates, Enter, Leave);
end;
//----------------------------------------------------------------------------------------------------------------------
procedure TNodeForm.MLTreeMeasureItem(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode;
var NodeHeight: Integer);
begin
if Sender.MultiLine[Node] and AutoAdjustCheckBox.Checked then
begin
TargetCanvas.Font := Sender.Font;
NodeHeight := MLTree.ComputeNodeHeight(TargetCanvas, Node, 0);
end;
// ...else use what's set by default.
end;
//----------------------------------------------------------------------------------------------------------------------
procedure TNodeForm.AutoAdjustCheckBoxClick(Sender: TObject);
begin
MLTree.ReinitNode(nil, True);
MLTree.Invalidate;
end;
//----------------------------------------------------------------------------------------------------------------------
end.