Componentes.Terceros.DevExp.../internal/x.44/1/ExpressPrinting System/Sources/dxPScxTL5Lnk.pas
2009-06-29 12:09:02 +00:00

9036 lines
308 KiB
ObjectPascal

{*******************************************************************}
{ }
{ Developer Express Visual Component Library }
{ ExpressPrinting System(tm) COMPONENT SUITE }
{ }
{ Copyright (C) 1998-2009 Developer Express Inc. }
{ ALL RIGHTS RESERVED }
{ }
{ The entire contents of this file is protected by U.S. and }
{ International Copyright Laws. Unauthorized reproduction, }
{ reverse-engineering, and distribution of all or any portion of }
{ the code contained in this file is strictly prohibited and may }
{ result in severe civil and criminal penalties and will be }
{ prosecuted to the maximum extent possible under the law. }
{ }
{ RESTRICTIONS }
{ }
{ THIS SOURCE CODE AND ALL RESULTING INTERMEDIATE FILES }
{ (DCU, OBJ, DLL, ETC.) ARE CONFIDENTIAL AND PROPRIETARY TRADE }
{ SECRETS OF DEVELOPER EXPRESS INC. THE REGISTERED DEVELOPER IS }
{ LICENSED TO DISTRIBUTE THE EXPRESSPRINTINGSYSTEM AND }
{ ALL ACCOMPANYING VCL CONTROLS AS PART OF AN }
{ EXECUTABLE PROGRAM ONLY. }
{ }
{ THE SOURCE CODE CONTAINED WITHIN THIS FILE AND ALL RELATED }
{ FILES OR ANY PORTION OF ITS CONTENTS SHALL AT NO TIME BE }
{ COPIED, TRANSFERRED, SOLD, DISTRIBUTED, OR OTHERWISE MADE }
{ AVAILABLE TO OTHER INDIVIDUALS WITHOUT EXPRESS WRITTEN CONSENT }
{ AND PERMISSION FROM DEVELOPER EXPRESS INC. }
{ }
{ CONSULT THE END USER LICENSE AGREEMENT FOR INFORMATION ON }
{ ADDITIONAL RESTRICTIONS. }
{ }
{*******************************************************************}
unit dxPScxTL5Lnk;
interface
{$I cxVer.inc}
uses
Windows, SysUtils, Messages, Classes, Graphics, Controls, StdCtrls, ComCtrls,
ExtCtrls, ImgList, Menus, Dialogs, ExtDlgs, Contnrs, Types, cxClasses, cxControls,
cxGraphics, cxGeometry, cxStyles, cxLookAndFeels, cxLookAndFeelPainters, cxEdit,
cxTextEdit, cxInplaceContainer, cxTL, cxDBTL, cxTLData, cxCustomData, dxExtCtrls,
dxBase, dxPSSngltn, dxPrnPg, dxPSCore, dxPScxCommon;
const
vspsTreeListFirst = 0;
vspsTreeListBandHeader = vspsTreeListFirst + 0;
vspsTreeListContent = vspsTreeListFirst + 1;
vspsTreeListContentEven = vspsTreeListFirst + 2;
vspsTreeListContentOdd = vspsTreeListFirst + 3;
vspsTreeListFooter = vspsTreeListFirst + 4;
vspsTreeListFooterRow = vspsTreeListFirst + 5;
vspsTreeListHeader = vspsTreeListFirst + 6;
vspsTreeListIndent = vspsTreeListFirst + 7;
vspsTreeListPreview = vspsTreeListFirst + 8;
vspsTreeListSelection = vspsTreeListFirst + 9;
vspsTreeListBandBackground = vspsTreeListFirst + 10;
vspsTreeListLast = vspsTreeListBandBackground;
cxTreeListAttributeIDBase = 0;
cxTreeListUndefinedID = cxTreeListAttributeIDBase + 0;
cxTreeListBandID = cxTreeListAttributeIDBase + 1;
cxTreeListFooterID = cxTreeListAttributeIDBase + 2;
cxTreeListHeaderID = cxTreeListAttributeIDBase + 3;
cxTreeListIndentID = cxTreeListAttributeIDBase + 4;
cxTreeListNodeID = cxTreeListAttributeIDBase + 5;
type
TcxTreeListNodeClass = class of TcxTreeListNode;
TcxTreeListCustomReportLink = class;
TdxfmTreeListReportLinkDesignWindow = class;
TcxTreeListAttributeHostInfo = class;
TcxTreeListAdapterClass = class of TcxTreeListAdapter;
TcxTreeListAdapter = class;
TcxTreeListReportLinkFormatterClass = class of TcxTreeListReportLinkFormatter;
TcxTreeListReportLinkFormatter = class;
TcxTreeListReportLinkBuilderClass = class of TcxTreeListReportLinkBuilder;
TcxTreeListReportLinkBuilder = class;
TcxTreeListAttributeClass = class of TcxTreeListAttribute;
TcxTreeListAttribute = class end;
TcxTreeListBandAttribute = class(TcxTreeListAttribute);
TcxTreeListNodeAttribute = class(TcxTreeListAttribute);
TcxTreeListFooterAttribute = class(TcxTreeListAttribute);
TcxTreeListHeaderAttribute = class(TcxTreeListAttribute);
TcxTreeListColumnPlace = class;
TcxTreeListCustomBandPlace = class;
TcxTreeListBandPlace = class;
TcxTreeListItemPlaceController = class;
TcxTreeListAttributeID = type Integer;
TcxTreeListCellCustomDrawInfo = record
AttributeID: TcxTreeListAttributeID;
Band: TcxTreeListBand;
Column: TcxTreeListColumn;
Node: TcxTreeListNode;
Index: Integer;
end;
{ producers }
TcxTreeListReportLinkRowProducerClass = class of TcxTreeListReportLinkRowProducer;
TcxTreeListReportLinkRowProducer = class
private
FBuilder: TcxTreeListReportLinkBuilder;
FHost: TdxReportCell;
FRow: TdxReportCell;
FRowHeight: Integer;
function GetDC: HDC;
function GetIndentWidth: Integer;
function GetRowWidth: Integer;
protected
procedure AfterCalculateRowHeight; virtual;
procedure CalculateRowAutoHeight; virtual;
procedure CalculateRowHeight; virtual;
procedure CreateRow; virtual;
procedure CreateRowHost(const AHostInfo: TcxTreeListAttributeHostInfo); virtual;
function DoesItemParticipateInRowAutoHeightCalculation(AnItem: TdxReportVisualItem): Boolean; virtual;
procedure FixupRowDataHeight; virtual;
procedure FixupRowHeight; virtual;
procedure FixupRowItselfHeight; virtual;
procedure InitializeRow; virtual;
function GetAutoHeight: Boolean; virtual;
function GetLineCount: Integer; virtual;
function GetLineHeight: Integer; virtual;
property DC: HDC read GetDC;
public
constructor Create(ABuilder: TcxTreeListReportLinkBuilder); virtual;
function Adapter: TcxTreeListAdapter; overload; virtual;
function Builder: TcxTreeListReportLinkBuilder; overload; virtual;
function Formatter: TcxTreeListReportLinkFormatter; overload; virtual;
function Produce(AHostInfo: TcxTreeListAttributeHostInfo): TdxReportCell; virtual;
property AutoHeight: Boolean read GetAutoHeight;
property Host: TdxReportCell read FHost;
property IndentWidth: Integer read GetIndentWidth;
property LineCount: Integer read GetLineCount;
property LineHeight: Integer read GetLineHeight;
property Row: TdxReportCell read FRow;
property RowHeight: Integer read FRowHeight write FRowHeight;
property RowWidth: Integer read GetRowWidth;
end;
TcxTreeListReportLinkNodeSeparatorProducerClass = class of TcxTreeListReportLinkNodeSeparatorProducer;
TcxTreeListReportLinkNodeSeparatorProducer = class(TcxTreeListReportLinkRowProducer)
private
FItem: TAbstractdxReportCellData;
protected
procedure InitializeItem; virtual;
procedure InitializeRow; override;
function GetAutoHeight: Boolean; override;
function GetItemClass: TdxReportCellDataClass; virtual;
function GetLineHeight: Integer; override;
public
function Produce(AHostInfo: TcxTreeListAttributeHostInfo): TdxReportCell; override;
end;
TcxTreeListReportLinkRowSubItemsProducerClass = class of TcxTreeListReportLinkRowSubItemsProducer;
TcxTreeListReportLinkRowSubItemsProducer = class(TcxTreeListReportLinkRowProducer)
private
function GetColumn(Index: Integer): TcxTreeListColumn;
protected
procedure CreateDataItems(AParent: TdxReportCell); virtual;
procedure CreateRow; override;
procedure InitializeSubItem(ASubItem: TAbstractdxReportCellData; AnIndex: Integer); virtual;
function GetHasSubItem(Index: Integer): Boolean; virtual;
function GetSubItemBound(Index: Integer): TRect; virtual;
function GetSubItemClass(Index: Integer): TdxReportCellDataClass; virtual; abstract;
function GetSubItemCount: Integer; virtual;
public
property Columns[Index: Integer]: TcxTreeListColumn read GetColumn;
property HasSubItem[Index: Integer]: Boolean read GetHasSubItem;
property SubItemBounds[Index: Integer]: TRect read GetSubItemBound;
property SubItemClasses[Index: Integer]: TdxReportCellDataClass read GetSubItemClass;
property SubItemCount: Integer read GetSubItemCount;
end;
TcxTreeListReportLinkBandsProducerClass = class of TcxTreeListReportLinkBandsProducer;
TcxTreeListReportLinkBandsProducer = class(TcxTreeListReportLinkRowSubItemsProducer)
protected
procedure CalculateRowHeight; override;
procedure InitializeRow; override;
procedure InitializeSubItem(ASubItem: TAbstractdxReportCellData; AnIndex: Integer); override;
function GetAutoHeight: Boolean; override;
function GetSubItemBound(Index: Integer): TRect; override;
function GetSubItemClass(Index: Integer): TdxReportCellDataClass; override;
function GetSubItemCount: Integer; override;
end;
TcxTreeListReportLinkFootersProducerClass = class of TcxTreeListReportLinkFootersProducer;
TcxTreeListReportLinkBandedRowProducer = class(TcxTreeListReportLinkRowProducer)
private
FIndents: TList;
function GetIndent(Index: Integer): TdxReportCellExpandButton;
protected
procedure AfterCalculateRowHeight; override;
procedure CreateBandedDataItems(AParent: TdxReportCell); virtual;
procedure CreateBandedRows(AParent: TdxReportCell); virtual;
procedure CreateIndents(AParent: TdxReportCell); virtual;
procedure CreateIndentsRow(AParent: TdxReportCell); virtual;
procedure CreateRow; override;
function GetBandedDataItemBounds(AItem: TAbstractdxReportCellData): TRect; virtual;
function GetBandedDataItemClass(AColumnPlace: TcxTreeListColumnPlace): TdxReportCellDataClass; virtual;
function GetBandedRowIndent: Integer; virtual;
function GetIndentArea: Integer; virtual;
function GetIndentBound(AIndex: Integer): TRect; virtual;
function GetIndentCount: Integer; virtual;
procedure InitializeBandedDataItem(AItem: TAbstractdxReportCellData); virtual;
procedure InitializeBandedRow(ARow: TdxReportCell); virtual;
procedure InitializeIndent(AnIndent: TdxReportCellExpandButton; AnIndex: Integer); virtual;
property IndentArea: Integer read GetIndentArea;
property IndentBounds[Index: Integer]: TRect read GetIndentBound;
property IndentCount: Integer read GetIndentCount;
property Indents[Index: Integer]: TdxReportCellExpandButton read GetIndent;
public
constructor Create(ABuilder: TcxTreeListReportLinkBuilder); override;
destructor Destroy; override;
function Produce(AHostInfo: TcxTreeListAttributeHostInfo): TdxReportCell; override;
end;
TcxTreeListReportLinkFootersProducer = class(TcxTreeListReportLinkBandedRowProducer)
private
FAttachedNode: TcxTreeListNode;
FDataNode: TcxTreeListNode;
protected
procedure CreateBandedDataItems(AParent: TdxReportCell); override;
function GetAutoHeight: Boolean; override;
function GetBandedRowIndent: Integer; override;
function GetIndentCount: Integer; override;
function GetLineCount: Integer; override;
function GetLineHeight: Integer; override;
procedure InitializeBandedRow(ARow: TdxReportCell); override;
procedure InitializeIndent(AnIndent: TdxReportCellExpandButton; AnIndex: Integer); override;
procedure InitializeRow; override;
public
function Produce(AHostInfo: TcxTreeListAttributeHostInfo; AAttachedNode,
ADataNode: TcxTreeListNode): TdxReportCell; reintroduce; virtual;
end;
TcxTreeListReportLinkHeadersProducerClass = class of TcxTreeListReportLinkHeadersProducer;
TcxTreeListReportLinkHeadersProducer = class(TcxTreeListReportLinkRowSubItemsProducer)
protected
procedure InitializeRow; override;
procedure InitializeSubItem(ASubItem: TAbstractdxReportCellData; AnIndex: Integer); override;
function GetAutoHeight: Boolean; override;
function GetLineCount: Integer; override;
function GetLineHeight: Integer; override;
function GetSubItemBound(Index: Integer): TRect; override;
function GetSubItemClass(Index: Integer): TdxReportCellDataClass; override;
end;
TcxTreeListReportLinkNodeProducerClass = class of TcxTreeListReportLinkNodeProducer;
TcxTreeListReportLinkNodeProducer = class(TcxTreeListReportLinkBandedRowProducer)
private
FCheck: TdxCustomReportCellCheck;
FImage: TdxReportCellGraphic;
FNode: TcxTreeListNode;
FPreviewItem: TAbstractdxReportCellData;
FStateImage: TdxReportCellGraphic;
function GetCheckIndentIndex: Integer;
function GetImageIndentIndex: Integer;
function GetPreviewColumn: TcxTreeListColumn;
function GetPreviewPlace: TcxTreeListPreviewPlace;
function GetStateImageIndentIndex: Integer;
protected
procedure CalculateRowAutoHeight; override;
procedure CreateChecks(AParent: TdxReportCell); virtual;
procedure CreateIcons(AParent: TdxReportCell); virtual;
procedure CreateImages(AParent: TdxReportCell); virtual;
procedure CreateIndents(AParent: TdxReportCell); override;
procedure CreatePreview(AParent: TdxReportCell); virtual;
procedure CreateRow; override;
procedure CreateStateImages(AParent: TdxReportCell); virtual;
function DoesItemParticipateInRowAutoHeightCalculation(AnItem: TdxReportVisualItem): Boolean; override;
procedure FixupRowDataHeight; override;
procedure InitializeBandedDataItem(AItem: TAbstractdxReportCellData); override;
procedure InitializeBandedRow(ARow: TdxReportCell); override;
procedure InitializeCheck; virtual;
procedure InitializeImage(AnIndex: Integer); virtual;
procedure InitializeIndent(AnIndent: TdxReportCellExpandButton; AnIndex: Integer); override;
procedure InitializeRow; override;
procedure InitializeStateImage(AnIndex: Integer); virtual;
function IsItemIndent(AnItem: TdxReportVisualItem): Boolean;
function GetAutoHeight: Boolean; override;
function GetBandedDataItemBounds(AItem: TAbstractdxReportCellData): TRect; override;
function GetBandedDataItemClass(AColumnPlace: TcxTreeListColumnPlace): TdxReportCellDataClass; override;
function GetBandedRowIndent: Integer; override;
function GetCellAutoHeight: Boolean; virtual;
function GetCheckRect: TRect; virtual;
function GetHasPreview: Boolean; virtual;
function GetImageRect: TRect; virtual;
function GetIndentCount: Integer; override;
function GetLineCount: Integer; override;
function GetLineHeight: Integer; override;
function GetPreviewHeight: Integer; virtual;
function GetPreviewIndent: Integer; virtual;
function GetPreviewLineCount: Integer; virtual;
function GetPreviewLineHeight: Integer; virtual;
function GetStateImageRect: TRect; virtual;
public
function Produce(AHostInfo: TcxTreeListAttributeHostInfo;
ANode: TcxTreeListNode): TdxReportCell; reintroduce; virtual;
property CellAutoHeight: Boolean read GetCellAutoHeight;
property CheckIndentIndex: Integer read GetCheckIndentIndex;
property CheckRect: TRect read GetCheckRect;
property HasPreview: Boolean read GetHasPreview;
property Image: TdxReportCellGraphic read FImage;
property ImageIndentIndex: Integer read GetImageIndentIndex;
property ImageRect: TRect read GetImageRect;
property PreviewColumn: TcxTreeListColumn read GetPreviewColumn;
property PreviewHeight: Integer read GetPreviewHeight;
property PreviewIndent: Integer read GetPreviewIndent;
property PreviewItem: TAbstractdxReportCellData read FPreviewItem;
property PreviewLineCount: Integer read GetPreviewLineCount;
property PreviewLineHeight: Integer read GetPreviewLineHeight;
property PreviewPlace: TcxTreeListPreviewPlace read GetPreviewPlace;
property StateImage: TdxReportCellGraphic read FStateImage;
property StateImageIndentIndex: Integer read GetStateImageIndentIndex;
property StateImageRect: TRect read GetStateImageRect;
end;
TcxTreeListReportLinkCategorizedNodeProducer = class(TcxTreeListReportLinkNodeProducer)
protected
procedure CreateBandedRows(AParent: TdxReportCell); override;
end;
{ helpers }
TcxTreeListNodeHelperClass = class of TcxTreeListNodeHelper;
TcxTreeListNodeHelper = class(TdxCustomClassMapItem)
private
FAdapter: TcxTreeListAdapter;
FNode: TcxTreeListNode;
protected
function Adapter: TcxTreeListAdapter; overload; virtual;
class function NodeClass: TcxTreeListNodeClass; virtual;
function GetHasSelectedChildren: Boolean; virtual;
function GetHasSelectedParents: Boolean; virtual;
public
constructor Create(AnAdapter: TcxTreeListAdapter); virtual;
class function PairClass: TClass; override;
class function ProducerClass: TcxTreeListReportLinkNodeProducerClass; virtual;
class procedure Register;
class procedure Unregister;
property HasSelectedChildren: Boolean read GetHasSelectedChildren;
property HasSelectedParents: Boolean read GetHasSelectedParents;
property Node: TcxTreeListNode read FNode write FNode;
end;
TcxTreeListNodeHelperCache = class(TdxCustomCache)
private
FAdapter: TcxTreeListAdapter;
function GetHelper(Node: TcxTreeListNode): TcxTreeListNodeHelper;
function GetItem(Index: Integer): TcxTreeListNodeHelper;
protected
function IndexOf(Node: TcxTreeListNode): Integer;
property Items[Index: Integer]: TcxTreeListNodeHelper read GetItem;
public
constructor Create(AnAdapter: TcxTreeListAdapter);
property Adapter: TcxTreeListAdapter read FAdapter;
property Helpers[Node: TcxTreeListNode]: TcxTreeListNodeHelper read GetHelper; default;
end;
TcxTreeListReportLinkProducerCache = class(TdxCustomCache)
private
FBuilder: TcxTreeListReportLinkBuilder;
function GetItem(Index: Integer): TcxTreeListReportLinkRowProducer;
function GetProducer(ProducerClass: TcxTreeListReportLinkRowProducerClass): TcxTreeListReportLinkRowProducer;
protected
function IndexOf(AProducerClass: TcxTreeListReportLinkRowProducerClass): Integer;
property Items[Index: Integer]: TcxTreeListReportLinkRowProducer read GetItem;
public
constructor Create(ABuilder: TcxTreeListReportLinkBuilder);
property Builder: TcxTreeListReportLinkBuilder read FBuilder;
property Producers[ProducerClass: TcxTreeListReportLinkRowProducerClass]: TcxTreeListReportLinkRowProducer read GetProducer; default;
end;
TcxTreeListReportLinkBuilder = class
private
FAdapter: TcxTreeListAdapter;
FFormatter: TcxTreeListReportLinkFormatter;
FProducerCache: TcxTreeListReportLinkProducerCache;
FReportLink: TcxTreeListCustomReportLink;
FReportRows: TList;
function GetHost: TdxReportCell;
function GetReportCells: TdxReportCells;
function GetReportRow(Index: Integer): TdxReportCell;
function GetReportRowCount: Integer;
function GetTreeList: TcxCustomTreeList;
protected
procedure AddReportRow(ARow: TdxReportCell);
procedure AfterBuilding; virtual;
procedure BeforeBuilding; virtual;
{ bands }
procedure CreateBands; virtual;
function GetBandsProducer: TcxTreeListReportLinkBandsProducer;
function GetBandsProducerClass: TcxTreeListReportLinkBandsProducerClass; virtual;
{ footers }
procedure CreateFooters(AHostInfo: TcxTreeListAttributeHostInfo;
AAttachedNode, ADataNode: TcxTreeListNode); virtual;
function GetFootersProducer: TcxTreeListReportLinkFootersProducer;
function GetFootersProducerClass: TcxTreeListReportLinkFootersProducerClass; virtual;
{ headers }
procedure CreateHeaders; virtual;
function GetHeadersProducer: TcxTreeListReportLinkHeadersProducer;
function GetHeadersProducerClass: TcxTreeListReportLinkHeadersProducerClass; virtual;
{ nodes }
procedure CreateNode(ANode: TcxTreeListNode); virtual;
procedure CreateNodes; virtual;
function GetNodeProducer(ANode: TcxTreeListNode): TcxTreeListReportLinkNodeProducer;
function GetNodeProducerClass(ANode: TcxTreeListNode): TcxTreeListReportLinkNodeProducerClass; virtual;
{ separators }
procedure CreateNodeSeparator(ANode: TcxTreeListNode); virtual;
function GetNodeSeparatorProducer: TcxTreeListReportLinkNodeSeparatorProducer;
function GetNodeSeparatorProducerClass: TcxTreeListReportLinkNodeSeparatorProducerClass; virtual;
procedure DoBuild; virtual;
function IsAborted: Boolean;
property ProducerCache: TcxTreeListReportLinkProducerCache read FProducerCache;
property ReportLink: TcxTreeListCustomReportLink read FReportLink;
public
constructor Create(AReportLink: TcxTreeListCustomReportLink); virtual;
destructor Destroy; override;
procedure Build; virtual;
procedure Progress(const APercentDone: Double);
function Adapter: TcxTreeListAdapter; overload; virtual;
class function AdapterClass: TcxTreeListAdapterClass; virtual;
function Formatter: TcxTreeListReportLinkFormatter; overload; virtual;
class function FormatterClass: TcxTreeListReportLinkFormatterClass; virtual;
property Host: TdxReportCell read GetHost;
property ReportCells: TdxReportCells read GetReportCells;
property ReportRowCount: Integer read GetReportRowCount;
property ReportRows[Index: Integer]: TdxReportCell read GetReportRow;
property TreeList: TcxCustomTreeList read GetTreeList;
end;
TcxTreeListReportLinkBuilderHandler = class
private
FBuilder: TcxTreeListReportLinkBuilder;
function GetReportLink: TcxTreeListCustomReportLink;
public
constructor Create(ABuilder: TcxTreeListReportLinkBuilder); virtual;
function Builder: TcxTreeListReportLinkBuilder; overload; virtual;
property ReportLink: TcxTreeListCustomReportLink read GetReportLink;
end;
TcxTreeListAdapter = class(TcxTreeListReportLinkBuilderHandler)
private
FDetailsLineCount: Integer;
FFooterLineCount: Integer;
FGroupFooterLineCount: Integer;
FHelperCache: TcxTreeListNodeHelperCache;
FMultiRows: Boolean;
function GetAutoWidth: Boolean;
function GetBand(Index: Integer): TcxTreeListBand;
function GetBandCount: Integer;
function GetBottomBand(Index: Integer): TcxTreeListBand;
function GetBottomBandCount: Integer;
function GetCanUseLookAndFeelColors: Boolean;
function GetCategorizedColumn: TcxTreeListColumn;
function GetCellAutoHeight: Boolean;
function GetCellEndEllipsis: Boolean;
function GetCellMultiline: Boolean;
function GetColumn(Index: Integer): TcxTreeListColumn;
function GetColumnCount: Integer;
function GetDefaultRowHeight: Integer;
function GetFooterLineCount(ANode: TcxTreeListNode): Integer;
function GetGridLines: TcxTreeListGridLines;
function GetGridLinesColor: TColor;
function GetHasPreview: Boolean;
function GetHeaderAutoHeight: Boolean;
function GetHelper(Node: TcxTreeListNode): TcxTreeListNodeHelper;
function GetImages: TCustomImageList;
function GetIndentWidth: Integer;
function GetIsDefaultRowHeightAssigned: Boolean;
function GetIsNodeColorUsedForIndents: Boolean;
function GetLookAndFeelKind: TcxLookAndFeelKind;
function GetLookAndFeelPainter: TcxCustomLookAndFeelPainterClass;
function GetMultiSelection: Boolean;
function GetNode(Index: Integer): TcxTreeListNode;
function GetNodeCount: Integer;
function GetOptionsView: TcxTreeListOptionsView;
function GetPaintStyle: TcxTreeListPaintStyle;
function GetPreviewColumn: TcxTreeListColumn;
function GetPreviewLeftIndent: Integer;
function GetPreviewPlace: TcxTreeListPreviewPlace;
function GetPreviewRightIndent: Integer;
function GetRootBand(Index: Integer): TcxTreeListBand;
function GetRootBandCount: Integer;
function GetShowRoot: Boolean;
function GetShowHorzGridLines: Boolean;
function GetShowTreeLines: Boolean;
function GetShowVertGridLines: Boolean;
function GetStateImages: TCustomImageList;
function GetStyles: TcxTreeListStyles;
function GetThemedBandHeaderItemColor: TColor;
function GetThemedBandHeaderItemTextColor: TColor;
function GetThemedFooterItemColor: TColor;
function GetThemedFooterItemTextColor: TColor;
function GetThemedHeaderItemColor: TColor;
function GetThemedHeaderItemTextColor: TColor;
function GetThemedHeaderRowColor: TColor;
function GetTreeLinesColor: TColor;
function GetTreeLinesStyle: TcxTreeListTreeLineStyle;
function GetTreeList: TcxCustomTreeList;
function GetUseStylesForIndents: Boolean;
protected
function CalculateDetailsLineCount: Integer; virtual;
procedure Calculate;
{ properties }
class function GetProperties(AColumn: TcxTreeListColumn; ANode: TcxTreeListNode): TcxCustomEditProperties;
class function GetPropertiesClass(AColumn: TcxTreeListColumn; ANode: TcxTreeListNode): TcxCustomEditPropertiesClass;
class function GetRepositoryItem(AColumn: TcxTreeListColumn; ANode: TcxTreeListNode): TcxEditRepositoryItem;
{ styles }
function GetBackgroundViewParams: TcxViewParams; virtual;
function GetBandBackgroundViewParams: TcxViewParams; virtual;
function GetBandHeaderViewParams(ABand: TcxTreeListBand): TcxViewParams; virtual;
function GetColumnFooterViewParams(AColumn: TcxTreeListColumn): TcxViewParams; virtual;
function GetColumnHeaderViewParams(AColumn: TcxTreeListColumn): TcxViewParams; virtual;
function GetContentViewParams(ANode: TcxTreeListNode; AColumn: TcxTreeListColumn): TcxViewParams; virtual;
function GetIndentViewParams(ANode: TcxTreeListNode; AnIndent: Integer): TcxViewParams; virtual;
function GetPreviewViewParams(ANode: TcxTreeListNode; AColumn: TcxTreeListColumn): TcxViewParams; virtual;
function GetFooterRowViewParams: TcxViewParams; virtual;
function GetSelectionViewParams: TcxViewParams; virtual;
function HasSelectionStyle: Boolean;
{ Backgrounds }
function GetBackgroundBitmap(Index: Integer): TBitmap;
function HasBackgroundBitmap(Index: Integer): Boolean;
function GetCheckWidth(ANode: TcxTreeListNode): Integer;
function GetImagesHeight(ANode: TcxTreeListNode): Integer;
function GetImagesWidth(ANode: TcxTreeListNode): Integer;
function GetStateImagesHeight(ANode: TcxTreeListNode): Integer;
function GetStateImagesWidth(ANode: TcxTreeListNode): Integer;
function HasCheck(ANode: TcxTreeListNode): Boolean;
function HasImages(ANode: TcxTreeListNode): Boolean;
function HasStateImages(ANode: TcxTreeListNode): Boolean;
function IsGroupNode(ANode: TcxTreeListNode): Boolean;
function HasNodeAttachedFooter(ANode, ASummaryNode: TcxTreeListNode): Boolean;
function HasNodeSummary(ANode: TcxTreeListNode): Boolean;
property Helpers[Node: TcxTreeListNode]: TcxTreeListNodeHelper read GetHelper;
property LookAndFeelKind: TcxLookAndFeelKind read GetLookAndFeelKind;
property LookAndFeelPainter: TcxCustomLookAndFeelPainterClass read GetLookAndFeelPainter;
property OptionsView: TcxTreeListOptionsView read GetOptionsView;
property Styles: TcxTreeListStyles read GetStyles;
property TreeList: TcxCustomTreeList read GetTreeList;
public
constructor Create(ABuilder: TcxTreeListReportLinkBuilder); override;
destructor Destroy; override;
property AutoWidth: Boolean read GetAutoWidth;
property BandCount: Integer read GetBandCount;
property Bands[Index: Integer]: TcxTreeListBand read GetBand;
property BottomBandCount: Integer read GetBottomBandCount;
property BottomBands[Index: Integer]: TcxTreeListBand read GetBottomBand;
property CanUseLookAndFeelColors: Boolean read GetCanUseLookAndFeelColors;
property CategorizedColumn: TcxTreeListColumn read GetCategorizedColumn;
property CellAutoHeight: Boolean read GetCellAutoHeight;
property CellEndEllipsis: Boolean read GetCellEndEllipsis;
property CellMultiline: Boolean read GetCellMultiline;
property ColumnCount: Integer read GetColumnCount;
property Columns[Index: Integer]: TcxTreeListColumn read GetColumn;
property DefaultRowHeight: Integer read GetDefaultRowHeight;
property DetailsLineCount: Integer read FDetailsLineCount;
property FooterLineCount[ANode: TcxTreeListNode]: Integer read GetFooterLineCount;
property GridLines: TcxTreeListGridLines read GetGridLines;
property GridLinesColor: TColor read GetGridLinesColor;
property HasPreview: Boolean read GetHasPreview;
property HeaderAutoHeight: Boolean read GetHeaderAutoHeight;
property Images: TCustomImageList read GetImages;
property IndentWidth: Integer read GetIndentWidth;
property IsDefaultRowHeightAssigned: Boolean read GetIsDefaultRowHeightAssigned;
property IsNodeColorUsedForIndents: Boolean read GetIsNodeColorUsedForIndents;
property MultiSelection: Boolean read GetMultiSelection;
property PaintStyle: TcxTreeListPaintStyle read GetPaintStyle;
property PreviewColumn: TcxTreeListColumn read GetPreviewColumn;
property PreviewLeftIndent: Integer read GetPreviewLeftIndent;
property PreviewPlace: TcxTreeListPreviewPlace read GetPreviewPlace;
property PreviewRightIndent: Integer read GetPreviewRightIndent;
property NodeCount: Integer read GetNodeCount;
property Nodes[Index: Integer]: TcxTreeListNode read GetNode;
property RootBandCount: Integer read GetRootBandCount;
property RootBands[Index: Integer]: TcxTreeListBand read GetRootBand;
property ShowRoot: Boolean read GetShowRoot;
property ShowHorzGridLines: Boolean read GetShowHorzGridLines;
property ShowTreeLines: Boolean read GetShowTreeLines;
property ShowVertGridLines: Boolean read GetShowVertGridLines;
property StateImages: TCustomImageList read GetStateImages;
property ThemedBandHeaderItemColor: TColor read GetThemedBandHeaderItemColor;
property ThemedBandHeaderItemTextColor: TColor read GetThemedBandHeaderItemTextColor;
property ThemedFooterItemColor: TColor read GetThemedFooterItemColor;
property ThemedFooterItemTextColor: TColor read GetThemedFooterItemTextColor;
property ThemedHeaderItemColor: TColor read GetThemedHeaderItemColor;
property ThemedHeaderItemTextColor: TColor read GetThemedHeaderItemTextColor;
property ThemedHeaderRowColor: TColor read GetThemedHeaderRowColor;
property TreeLinesColor: TColor read GetTreeLinesColor;
property TreeLinesStyle: TcxTreeListTreeLineStyle read GetTreeLinesStyle;
property UseStylesForIndents: Boolean read GetUseStylesForIndents;
end;
TcxTreeListCustomItemPlaceController = class
private
FFormatter: TcxTreeListReportLinkFormatter;
FHeaderLineCount: Integer;
FWidth: Integer;
function GetAdapter: TcxTreeListAdapter;
function GetHeaderLineCount: Integer;
function GetWidth: Integer;
procedure SetWidth(Value: Integer);
protected
function CalculateWidth: Integer; virtual;
function CalculateHeaderLineCount: Integer; virtual;
function GetItemByColumn(Column: TcxTreeListColumn): TcxTreeListColumnPlace; virtual;
procedure WidthChanged; virtual;
public
constructor Create(AFormatter: TcxTreeListReportLinkFormatter); virtual;
procedure Calculate; virtual;
procedure Refresh; virtual;
property Adapter: TcxTreeListAdapter read GetAdapter;
property Formatter: TcxTreeListReportLinkFormatter read FFormatter;
property HeaderLineCount: Integer read GetHeaderLineCount;
property ItemsByColumn[Column: TcxTreeListColumn]: TcxTreeListColumnPlace read GetItemByColumn; default;
property Width: Integer read GetWidth write SetWidth;
end;
TcxTreeListColumnPlace = class
private
FColumn: TcxTreeListColumn;
FController: TcxTreeListCustomBandPlace;
FLeftBound: Integer;
FWidth: Integer;
function GetAdapter: TcxTreeListAdapter;
function GetCellBounds(ANode: TcxTreeListNode): TRect;
function GetCellHeight(ANode: TcxTreeListNode): Integer;
function GetFooterCellBounds(AIndex: Integer): TRect;
function GetFooterLineHeight: Integer;
function GetFormatter: TcxTreeListReportLinkFormatter;
function GetHeaderCellBounds: TRect;
function GetHeaderLineHeight: Integer;
function GetIndex: Integer;
function GetIsFixed: Boolean;
function GetLeftBound: Integer;
function GetMinWidth: Integer;
function GetOriginalWidth: Integer;
function GetWidth: Integer;
protected
function CalculateLeftBound: Integer; virtual;
function GetLineCount: Integer; virtual;
function GetRowIndex: Integer; virtual;
procedure InitAutoWidthItem(AnItem: TcxAutoWidthItem); virtual;
property Adapter: TcxTreeListAdapter read GetAdapter;
property Formatter: TcxTreeListReportLinkFormatter read GetFormatter;
property IsFixed: Boolean read GetIsFixed;
property LineCount: Integer read GetLineCount;
property MinWidth: Integer read GetMinWidth;
property OriginalWidth: Integer read GetOriginalWidth;
property RowIndex: Integer read GetRowIndex;
public
constructor Create(AController: TcxTreeListCustomBandPlace; AColumn: TcxTreeListColumn); virtual;
procedure Calculate(ALeftBound: Integer); virtual;
property CellBounds[ANode: TcxTreeListNode]: TRect read GetCellBounds;
property CellHeights[ANode: TcxTreeListNode]: Integer read GetCellHeight;
property Column: TcxTreeListColumn read FColumn;
property Controller: TcxTreeListCustomBandPlace read FController;
property FooterCellBounds[AIndex: Integer]: TRect read GetFooterCellBounds;
property FooterLineHeight: Integer read GetFooterLineHeight;
property HeaderCellBounds: TRect read GetHeaderCellBounds;
property HeaderLineHeight: Integer read GetHeaderLineHeight;
property Index: Integer read GetIndex;
property LeftBound: Integer read GetLeftBound write FLeftBound;
property Width: Integer read GetWidth write FWidth;
end;
TcxTreeListCustomBandPlace = class(TcxTreeListCustomItemPlaceController)
private
FBand: TcxTreeListBand;
FColumnIndexes: TList;
FController: TcxTreeListItemPlaceController;
FHeight: Integer;
FItems: TObjectList;
FLeftBound: Integer;
FMinWidth: Integer;
FParent: TcxTreeListBandPlace;
FTopBound: Integer;
function GetColumnIndex(AColumn: TcxTreeListColumn): Integer;
function GetBounds: TRect;
function GetExpandable: Boolean;
function GetHeight: Integer;
function GetIndex: Integer;
function GetIsFixed: Boolean;
function GetItem(AIndex: Integer): TcxTreeListColumnPlace;
function GetItemCount: Integer;
function GetLeftBound: Integer;
function GetLevelIndex: Integer;
function GetMinWidth: Integer;
function GetTopBound: Integer;
function GetViewParams: TdxReportItemViewParams;
protected
function CalculateHeaderLineCount: Integer; override;
function CalculateWidth: Integer; override;
function GetItemByColumn(Column: TcxTreeListColumn): TcxTreeListColumnPlace; override;
procedure AddItems; virtual;
procedure AssignWidth;
function CalculateHeight: Integer; virtual;
function CalculateItemLeftBound(AnItem: TcxTreeListColumnPlace): Integer; virtual;
procedure CalculateItemsWidth; virtual;
function CalculateLeftBound: Integer; virtual;
function CalculateLevelHeight: Integer; virtual;
function CalculateLineHeight: Integer; virtual;
function CalculateMinWidth: Integer; virtual;
function CalculateTopBound: Integer; virtual;
function CreateItem(AColumn: TcxTreeListColumn): TcxTreeListColumnPlace; virtual;
procedure InitAutoWidthItem(AnItem: TcxAutoWidthItem); virtual;
function GetRowCount: Integer; virtual;
function GetItemsAutoWidth: Boolean; virtual;
function GetItemsAvailableWidth: Integer; virtual;
function InternalCalculateMinWidth: Integer; virtual;
function InternalCalculateWidth: Integer; virtual;
property Band: TcxTreeListBand read FBand;
property IsFixed: Boolean read GetIsFixed;
property ItemsAutoWidth: Boolean read GetItemsAutoWidth;
property ItemsAvailableWidth: Integer read GetItemsAvailableWidth;
property LevelIndex: Integer read GetLevelIndex;
property MinWidth: Integer read GetMinWidth;
property RowCount: Integer read GetRowCount;
property ViewParams: TdxReportItemViewParams read GetViewParams;
public
constructor Create(AController: TcxTreeListItemPlaceController;
AParent: TcxTreeListBandPlace; ABand: TcxTreeListBand); reintroduce; virtual;
destructor Destroy; override;
procedure Calculate; override;
function IndexOf(AnItem: TcxTreeListColumnPlace): Integer; overload;
function IndexOf(AColumn: TcxTreeListColumn): Integer; overload;
procedure Refresh; override;
property Bounds: TRect read GetBounds;
property ColumnIndexes[Column: TcxTreeListColumn]: Integer read GetColumnIndex;
property Controller: TcxTreeListItemPlaceController read FController;
property Expandable: Boolean read GetExpandable;
property Height: Integer read GetHeight write FHeight;
property Index: Integer read GetIndex;
property ItemCount: Integer read GetItemCount;
property Items[Index: Integer]: TcxTreeListColumnPlace read GetItem; default;
property LeftBound: Integer read GetLeftBound write FLeftBound;
property Parent: TcxTreeListBandPlace read FParent;
property TopBound: Integer read GetTopBound write FTopBound;
end;
TcxTreeListCustomBandPlaceClass = class of TcxTreeListCustomBandPlace;
TcxTreeListBandPlace = class(TcxTreeListCustomBandPlace)
private
FChildItems: TList;
function GetChildItem(Index: Integer): TcxTreeListCustomBandPlace;
function GetChildItemCount: Integer;
protected
function GetRowCount: Integer; override;
function InternalCalculateMinWidth: Integer; override;
function InternalCalculateWidth: Integer; override;
procedure WidthChanged; override;
procedure CalculateChildItemWidths;
procedure RefreshChildItems;
public
constructor Create(AnOwner: TcxTreeListItemPlaceController;
AParent: TcxTreeListBandPlace; ABand: TcxTreeListBand); override;
destructor Destroy; override;
function IndexOf(AnItem: TcxTreeListCustomBandPlace): Integer;
procedure Refresh; override;
property ChildItemCount: Integer read GetChildItemCount;
property ChildItems[Index: Integer]: TcxTreeListCustomBandPlace read GetChildItem;
end;
TcxTreeListBottomBandPlace = class(TcxTreeListCustomBandPlace)
protected
procedure AddItems; override;
function CalculateItemLeftBound(AnItem: TcxTreeListColumnPlace): Integer; override;
procedure CalculateItemsWidth; override;
function GetItemsAutoWidth: Boolean; override;
function GetItemsAvailableWidth: Integer; override;
function GetRowCount: Integer; override;
function InternalCalculateMinWidth: Integer; override;
function InternalCalculateWidth: Integer; override;
procedure WidthChanged; override;
end;
TcxTreeListItemPlaceController = class(TcxTreeListCustomItemPlaceController)
private
FBottomItems: TList;
FHeight: Integer;
FItems: TObjectList;
FLevelCount: Integer;
FLevelHeights: TList;
FRootItems: TList;
function GetAutoWidth: Boolean;
function GetAvailableWidth: Integer;
function GetBottomItem(AIndex: Integer): TcxTreeListCustomBandPlace;
function GetBottomItemCount: Integer;
function GetHeight: Integer;
function GetItem(AIndex: Integer): TcxTreeListCustomBandPlace;
function GetItemByBand(ABand: TcxTreeListBand): TcxTreeListCustomBandPlace;
function GetItemCount: Integer;
function GetLevelCount: Integer;
function GetLevelHeight(AIndex: Integer): Integer;
function GetRootItem(AIndex: Integer): TcxTreeListCustomBandPlace;
function GetRootItemCount: Integer;
procedure SetLevelHeight(AIndex: Integer; AValue: Integer);
protected
function CalculateHeaderLineCount: Integer; override;
function CalculateWidth: Integer; override;
function GetItemByColumn(AColumn: TcxTreeListColumn): TcxTreeListColumnPlace; override;
procedure AddItems; virtual;
function CreateItem(ABand: TcxTreeListBand): TcxTreeListCustomBandPlace; virtual;
function GetItemClass(ABand: TcxTreeListBand): TcxTreeListCustomBandPlaceClass; virtual;
procedure RefreshBottomItems;
procedure RefreshItems;
procedure RefreshRootItems;
function CalculateHeight: Integer; virtual;
function CalculateItemHeight(AnItem: TcxTreeListCustomBandPlace): Integer; virtual;
function CalculateItemLeftBound(AnItem: TcxTreeListCustomBandPlace): Integer; virtual;
function CalculateItemTopBound(AnItem: TcxTreeListCustomBandPlace): Integer; virtual;
function CalculateLevelCount: Integer; virtual;
procedure CalculateItemWidths;
procedure CalculateLevelHeights;
property AutoWidth: Boolean read GetAutoWidth;
property AvailableWidth: Integer read GetAvailableWidth;
public
constructor Create(AFormatter: TcxTreeListReportLinkFormatter); override;
destructor Destroy; override;
procedure Calculate; override;
procedure Refresh; override;
function BottomIndexOf(AnItem: TcxTreeListCustomBandPlace): Integer;
function IndexOf(AnItem: TcxTreeListCustomBandPlace): Integer; overload;
function IndexOf(ABand: TcxTreeListBand): Integer; overload;
function RootIndexOf(AnItem: TcxTreeListCustomBandPlace): Integer; overload;
function RootIndexOf(ABand: TcxTreeListBand): Integer; overload;
property BottomItemCount: Integer read GetBottomItemCount;
property BottomItems[Index: Integer]: TcxTreeListCustomBandPlace read GetBottomItem;
property Height: Integer read GetHeight;
property ItemCount: Integer read GetItemCount;
property Items[Index: Integer]: TcxTreeListCustomBandPlace read GetItem; default;
property ItemsByBand[Band: TcxTreeListBand]: TcxTreeListCustomBandPlace read GetItemByBand;
property LevelCount: Integer read GetLevelCount;
property LevelHeights[Index: Integer]: Integer read GetLevelHeight write SetLevelHeight;
property RootItemCount: Integer read GetRootItemCount;
property RootItems[Index: Integer]: TcxTreeListCustomBandPlace read GetRootItem;
end;
TcxTreeListReportLinkSummaryItems = array of array of TcxTreeListSummaryItem;
TcxTreeListReportLinkFormatter = class(TcxTreeListReportLinkBuilderHandler,
IUnknown, IdxPSCellParams, IdxPSCellParams2)
private
FBands: TList;
FBandLineHeight: Integer;
FColumns: TList;
FDetailsLineHeight: Integer;
FGroupFooterSummaryItems: TcxTreeListReportLinkSummaryItems;
FItemPlaceController: TcxTreeListItemPlaceController;
FFont: TFont;
FFooterLineHeight: Integer;
FHeaderLineHeight: Integer;
FLookAndFeelItems: TList;
FNodes: TList;
FPreviewLineHeight: Integer;
FFooterSummaryItems: TcxTreeListReportLinkSummaryItems;
FTransparentColor: TColor;
function GetAutoWidth: Boolean;
function GetAvailableWidth: Integer;
function GetBandCount: Integer;
function GetBands(AIndex: Integer): TcxTreeListBand;
function GetColumnCount: Integer;
function GetColumns(AIndex: Integer): TcxTreeListColumn;
function GetDC: HDC;
function GetExpandButtonColor: TColor;
function GetExpandButtonSize: Integer;
function GetGridLinesColor: TColor;
function GetHasNodeSeparator: Boolean;
function GetHasPreview: Boolean;
function GetIndentCount(Node: TcxTreeListNode): Integer;
function GetIsNodeColorUsedForIndents: Boolean;
function GetLookAndFeelItem(Index: Integer): TdxReportVisualItem;
function GetLookAndFeelItemCount: Integer;
function GetNode(Index: Integer): TcxTreeListNode;
function GetNodeCount: Integer;
function GetNodeSeparatorColor: TColor;
function GetNodeSeparatorThickness: Integer;
function GetPreviewAutoHeight: Boolean;
function GetPreviewColumn: TcxTreeListColumn;
function GetPreviewMaxLineCount: Integer;
function GetRenderer: TdxPSReportRenderer;
function GetShowBandHeaders: Boolean;
function GetShowFooters: Boolean;
function GetShowHeaders: Boolean;
function GetShowPreview: Boolean;
function GetUseLookAndFeelColors: Boolean;
function GetViewWidth: Integer;
function GetTreeLinesColor: TColor;
function GetTreeLinesStyle: TcxTreeListTreeLineStyle;
procedure FormatLookAndFeelItems;
protected
{ IUnknown }
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
{ IdxPSCellParams }
function IdxPSCellParams.GetAutoHeight = IdxPSCellParams_GetAutoHeight;
function IdxPSCellParams.GetDC = IdxPSCellParams_GetDC;
function IdxPSCellParams.GetDisplayGraphicsAsText = IdxPSCellParams_GetDisplayGraphicsAsText;
function IdxPSCellParams.GetEndEllipsis = IdxPSCellParams_GetEndEllipsis;
function IdxPSCellParams.GetFlatCheckMarks = IdxPSCellParams_GetFlatCheckMarks;
function IdxPSCellParams.GetGraphicsText = IdxPSCellParams_GetGraphicsText;
function IdxPSCellParams.GetMultiline = IdxPSCellParams_GetMultiline;
function IdxPSCellParams.GetTransparentGraphics = IdxPSCellParams_GetTransparentGraphics;
function IdxPSCellParams_GetAutoHeight: Boolean; virtual;
function IdxPSCellParams_GetDC: HDC; virtual;
function IdxPSCellParams_GetDisplayGraphicsAsText: Boolean; virtual;
function IdxPSCellParams_GetEndEllipsis: Boolean; virtual;
function IdxPSCellParams_GetFlatCheckMarks: Boolean; virtual;
function IdxPSCellParams_GetGraphicsText: string; virtual;
function IdxPSCellParams_GetMultiline: Boolean; virtual;
function IdxPSCellParams_GetTransparentGraphics: Boolean; virtual;
{ IdxPSCellParams2 }
function IdxPSCellParams2.GetPreviewMarginLeft = IdxPSCellParams2_GetPreviewMarginLeft;
function IdxPSCellParams2.GetPreviewMarginRight = IdxPSCellParams2_GetPreviewMarginRight;
function IdxPSCellParams2.GetPreviewMaxHeight = IdxPSCellParams2_GetPreviewMaxHeight;
function IdxPSCellParams2.GetPreviewMaxLineCount = IdxPSCellParams2_GetPreviewMaxLineCount;
function IdxPSCellParams2.GetRichEditGraphicClass = IdxPSCellParams2_GetRichEditGraphicClass;
function IdxPSCellParams2.GetRichEditTransparent = IdxPSCellParams2_GetRichEditTransparent;
function IdxPSCellParams2_GetPreviewMarginLeft: Integer; virtual;
function IdxPSCellParams2_GetPreviewMarginRight: Integer; virtual;
function IdxPSCellParams2_GetPreviewMaxHeight: Integer; virtual;
function IdxPSCellParams2_GetPreviewMaxLineCount: Integer; virtual;
function IdxPSCellParams2_GetRichEditGraphicClass: TGraphicClass; virtual;
function IdxPSCellParams2_GetRichEditTransparent: Boolean; virtual;
procedure AddDelimiters; virtual;
procedure AddHorizontalDelimiters; virtual;
procedure AddVerticalDelimiters; virtual;
procedure AfterBuilding; virtual;
procedure BeforeBuilding; virtual;
procedure CalculateLineHeights; virtual;
function CanProcessSelectionStyle(ANode: TcxTreeListNode): Boolean;
procedure CreateNodeList; virtual;
function IsSelectedNode(ANode: TcxTreeListNode): Boolean; virtual;
function GetBackgroundBitmap(Index: Integer): TBitmap;
function GetBackgroundBitmapIndex(Index: Integer): Integer;
function HasBackgroundBitmap(Index: Integer): Boolean;
function MapStyleBackgroundBitmapIndex(ATreeListBackgroundBitmapIndex: Integer): Integer;
procedure CalculateHeight(const AParams: TdxReportItemViewParams; var AHeight: Integer);
procedure CalculateNodeHeight(ANode: TcxTreeListNode; const AParams: TdxReportItemViewParams;
var AHeight: Integer);
function CalculatePatternHeight(const AParams: TdxReportItemViewParams): Integer;
procedure CreateBands;
procedure CreateColumns;
procedure CreateItems;
procedure CreateSummaryItems;
function GetFooterCellCount(AColumn: TcxTreeListColumn; ANode: TcxTreeListNode): Integer;
function GetNodeIndent(ANode: TcxTreeListNode): Integer;
function GetNodeParent(ANode: TcxTreeListNode; ALevel: Integer): TcxTreeListNode;
function GetNextNode(ANode: TcxTreeListNode): TcxTreeListNode;
function GetPrevNode(ANode: TcxTreeListNode): TcxTreeListNode;
function GetStyleFontIndex(const AParams: TdxReportItemViewParams): Integer;
function GetSummaryItems(ANode: TcxTreeListNode): TcxTreeListReportLinkSummaryItems;
function HasFooterCell(AColumn: TcxTreeListColumn; ANode: TcxTreeListNode): Boolean;
function HasParent(ANode: TcxTreeListNode): Boolean;
function IndexOfNode(ANode: TcxTreeListNode): Integer;
function IsColorTransparent(AColor: TColor): Boolean;
function IsFirstNode(ANode: TcxTreeListNode): Boolean;
function IsLastNode(ANode: TcxTreeListNode): Boolean;
function IsNodeExpanded(ANode: TcxTreeListNode): Boolean;
function IsNodeFirstChild(ANode: TcxTreeListNode): Boolean;
function IsNodeLastChild(ANode: TcxTreeListNode): Boolean;
function IsOddNode(ANode: TcxTreeListNode): Boolean;
function IsNodeSelected(ANode: TcxTreeListNode): Boolean;
procedure RegisterLookAndFeelItem(AnItem: TdxReportVisualItem; AEdgeStyle: TdxCellEdgeStyle);
procedure SetViewParams(AnItem: TdxReportVisualItem; const AParams: TdxReportItemViewParams);
function MakeIndentIndex(AnIndex: Integer): DWORD;
property DC: HDC read GetDC;
property ItemPlaceController: TcxTreeListItemPlaceController read FItemPlaceController;
property LookAndFeelItemCount: Integer read GetLookAndFeelItemCount;
property LookAndFeelItems[Index: Integer]: TdxReportVisualItem read GetLookAndFeelItem;
property Renderer: TdxPSReportRenderer read GetRenderer;
property ViewWidth: Integer read GetViewWidth;
public
constructor Create(ABuilder: TcxTreeListReportLinkBuilder); override;
destructor Destroy; override;
function Adapter: TcxTreeListAdapter; overload; virtual;
procedure DoInitializeHost(AHost: TdxReportCell); virtual;
{ Bands }
procedure DoInitializeBandItem(AnItem: TAbstractdxReportCellData; AnIndex: Integer); virtual;
procedure DoInitializeBandRow(ARow: TdxReportCell); virtual;
procedure DoReportLinkInitializeBandItem(AnItem: TAbstractdxReportCellData; AIndex: Integer); virtual;
function GetBandBackgroundViewParams: TdxReportItemViewParams; virtual;
function GetBandItemClass(Index: Integer): TdxReportCellTextClass; virtual;
function GetBandItemBounds(Index: Integer): TRect;
function GetBandItemViewParams(ABand: TcxTreeListBand): TdxReportItemViewParams; virtual;
{ Checks }
procedure DoInitializeNodeCheck(AnItem: TdxCustomReportCellCheck;
ANode: TcxTreeListNode; AnIndex: Integer); virtual;
function GetNodeCheckCellSides(ANode: TcxTreeListNode; AnIndex: Integer): TdxCellSides; virtual;
function GetNodeCheckClass(ANode: TcxTreeListNode): TdxCustomReportCellCheckClass; virtual;
function GetNodeCheckViewParams(ANode: TcxTreeListNode; AnIndex: Integer): TdxReportItemViewParams; virtual;
{ Footers }
procedure DoInitializeFooterCell(AnItem: TAbstractdxReportCellData;
AColumn: TcxTreeListColumn; ACellIndex: Integer; ANode: TcxTreeListNode); virtual;
procedure DoInitializeFooterIndent(AnItem: TdxReportCellExpandButton;
AnIndex, AnIndentCount: Integer; ANode: TcxTreeListNode);
procedure DoInitializeFooterBandedRow(ARow: TdxReportCell; AIndentCount: Integer); virtual;
procedure DoInitializeFooterRow(ARow: TdxReportCell); virtual;
procedure DoReportLinkInitializeFooterCell(AnItem: TAbstractdxReportCellData;
AColumnIndex, ACellIndex: Integer); virtual;
function GetFooterCellBounds(AColumn: TcxTreeListColumn; ACellIndex, AIndent: Integer): TRect; virtual;
function GetFooterCellClass: TdxReportCellTextClass; virtual;
function GetFooterCellViewParams(AColumn: TcxTreeListColumn): TdxReportItemViewParams; virtual;
function GetNodeFooterIndentTreeLineMode(AnIndex, AnIndentCount: Integer;
ANode: TcxTreeListNode): TdxPSTreeLineMode;
function GetFooterRowViewParams: TdxReportItemViewParams; virtual;
{ Headers }
procedure DoInitializeHeaderItem(AnItem: TAbstractdxReportCellData; AnIndex: Integer); virtual;
procedure DoInitializeHeaderRow(ARow: TdxReportCell); virtual;
procedure DoReportLinkInitializeHeaderItem(AnItem: TAbstractdxReportCellData; AIndex: Integer); virtual;
function GetHeaderItemBounds(AnIndex: Integer): TRect; virtual;
function GetHeaderItemClass(AnIndex: Integer): TdxReportCellTextClass; virtual;
function GetHeaderItemViewParams(AColumn: TcxTreeListColumn): TdxReportItemViewParams; virtual;
{ Images }
procedure DoInitializeNodeImage(AnItem: TdxReportCellGraphic; ANode: TcxTreeListNode; AnIndex: Integer); virtual;
procedure DoReportLinkInitializeNodeImage(AnItem: TAbstractdxReportCellData; ANode: TcxTreeListNode; AnIndex: Integer); virtual;
function GetNodeImageCellSides(ANode: TcxTreeListNode; AnIndex: Integer): TdxCellSides;
function GetNodeImageClass: TdxReportCellGraphicClass; virtual;
function GetNodeImageViewParams(ANode: TcxTreeListNode; AnIndex: Integer): TdxReportItemViewParams; virtual;
{ Indents and Expand Buttons }
procedure DoInitializeNodeIndent(AnItem: TdxReportCellExpandButton; AnIndex, AnIndentCount: Integer; ANode: TcxTreeListNode); virtual;
procedure DoInitializeExpandButton(AnItem: TdxReportCellExpandButton; AnIndex, AnIndentCount: Integer; ANode: TcxTreeListNode); virtual;
procedure DoReportLinkInitializeNodeIndent(AnItem: TAbstractdxReportCellData; AnIndex, AnIndentCount: Integer; ANode: TcxTreeListNode); virtual;
function GetNodeIndentCellSides(ANode: TcxTreeListNode; AnIndex, AnIndentCount: Integer): TdxCellSides; virtual;
function GetNodeIndentClass: TdxReportCellExpandButtonClass; virtual;
function GetNodeIndentTreeLineMode(AnIndex, AnIndentCount: Integer; ANode: TcxTreeListNode): TdxPSTreeLineMode;
function GetNodeIndentViewParams(ANode: TcxTreeListNode; AnIndex, AnIndentCount: Integer): TdxReportItemViewParams; virtual;
{ Nodes }
procedure DoInitializeNodeBandedRow(ARow: TdxReportCell); virtual;
procedure DoInitializeNodeRow(ARow: TdxReportCell; ANode: TcxTreeListNode); virtual;
procedure DoInitializeNodeItem(AnItem: TAbstractdxReportCellData;
AColumn: TcxTreeListColumn; ANode: TcxTreeListNode; AnIsPreview: Boolean = False); virtual;
procedure DoReportLinkInitializeNodeItem(AnItem: TAbstractdxReportCellData;
AColumn: TcxTreeListColumn; ANode: TcxTreeListNode); virtual;
function GetCellValue(AProperties: TcxCustomEditProperties;
AColumn: TcxTreeListColumn; ANode: TcxTreeListNode): TcxEditValue; virtual;
function GetNodeBackgroundBitmapStyleIndex(ANode: TcxTreeListNode): Integer;
function GetNodeItemBounds(ANode: TcxTreeListNode; AIndex: Integer): TRect; virtual;
function GetNodeItemCellSides(AColumn: TcxTreeListColumn; ANode: TcxTreeListNode): TdxCellSides;
function GetNodeItemClass(AColumn: TcxTreeListColumn; ANode: TcxTreeListNode;
AnIsPreview: Boolean = False): TdxReportCellDataClass; virtual;
function GetNodeItemViewParams(AColumn: TcxTreeListColumn; ANode: TcxTreeListNode): TdxReportItemViewParams; virtual;
{ Preview }
procedure DoInitializePreview(AnItem: TAbstractdxReportCellData; AColumn: TcxTreeListColumn; ANode: TcxTreeListNode); virtual;
function GetPreviewCellSides(ANode: TcxTreeListNode): TdxCellSides; virtual;
function GetPreviewClass(AColumn: TcxTreeListColumn; ANode: TcxTreeListNode): TdxReportCellDataClass; virtual;
function GetPreviewViewParams(AColumn: TcxTreeListColumn; ANode: TcxTreeListNode): TdxReportItemViewParams; virtual;
{ Separators }
procedure DoInitializeNodeSeparator(AnItem: TAbstractdxReportCellData); virtual;
procedure DoInitializeNodeSeparatorRow(ARow: TdxReportCell); virtual;
function GetNodeSeparatorClass: TdxReportCellBoxClass; virtual;
{ State images }
procedure DoInitializeNodeStateImage(AnItem: TdxReportCellGraphic; ANode: TcxTreeListNode; AnIndex: Integer); virtual;
procedure DoReportLinkInitializeNodeStateImage(AnItem: TAbstractdxReportCellData; ANode: TcxTreeListNode; AnIndex: Integer); virtual;
function GetNodeStateImageCellSides(ANode: TcxTreeListNode; AnIndex: Integer): TdxCellSides; virtual;
function GetNodeStateImageClass: TdxReportCellGraphicClass; virtual;
function GetNodeStateImageViewParams(ANode: TcxTreeListNode; AnIndex: Integer): TdxReportItemViewParams; virtual;
property AutoWidth: Boolean read GetAutoWidth;
property AvailableWidth: Integer read GetAvailableWidth;
property BandLineHeight: Integer read FBandLineHeight write FBandLineHeight;
property BandCount: Integer read GetBandCount;
property Bands[Index: Integer]: TcxTreeListBand read GetBands;
property ColumnCount: Integer read GetColumnCount;
property Columns[Index: Integer]: TcxTreeListColumn read GetColumns;
property DetailsLineHeight: Integer read FDetailsLineHeight write FDetailsLineHeight;
property ExpandButtonColor: TColor read GetExpandButtonColor;
property ExpandButtonSize: Integer read GetExpandButtonSize;
property FooterLineHeight: Integer read FFooterLineHeight write FFooterLineHeight;
property GridLinesColor: TColor read GetGridLinesColor;
property HasNodeSeparator: Boolean read GetHasNodeSeparator;
property HasPreview: Boolean read GetHasPreview;
property HeaderLineHeight: Integer read FHeaderLineHeight write FHeaderLineHeight;
property IndentCounts[Node: TcxTreeListNode]: Integer read GetIndentCount;
property IsNodeColorUsedForIndents: Boolean read GetIsNodeColorUsedForIndents;
property NodeCount: Integer read GetNodeCount;
property Nodes[Index: Integer]: TcxTreeListNode read GetNode;
property NodeSeparatorColor: TColor read GetNodeSeparatorColor;
property NodeSeparatorThickness: Integer read GetNodeSeparatorThickness;
property PreviewAutoHeight: Boolean read GetPreviewAutoHeight;
property PreviewColumn: TcxTreeListColumn read GetPreviewColumn;
property PreviewLineHeight: Integer read FPreviewLineHeight write FPreviewLineHeight;
property PreviewMaxLineCount: Integer read GetPreviewMaxLineCount;
property ShowBandHeaders: Boolean read GetShowBandHeaders;
property ShowFooters: Boolean read GetShowFooters;
property ShowHeaders: Boolean read GetShowHeaders;
property ShowPreview: Boolean read GetShowPreview;
property UseLookAndFeelColors: Boolean read GetUseLookAndFeelColors;
property TransparentColor: TColor read FTransparentColor write FTransparentColor default clWindow;
property TreeLinesColor: TColor read GetTreeLinesColor;
property TreeLinesStyle: TcxTreeListTreeLineStyle read GetTreeLinesStyle;
end;
{ Options }
TcxTreeListReportLinkOptionsExpanding = class(TdxCustomReportLinkOptionsExpanding)
private
FAutoExpandNodes: Boolean;
FExplicitlyExpandNodes: Boolean;
function GetReportLink: TcxTreeListCustomReportLink;
procedure SetAutoExpandNodes(Value: Boolean);
procedure SetExplicitlyExpandNodes(Value: Boolean);
protected
function DesignerTabIndex: Integer; override;
public
procedure Assign(Source: TPersistent); override;
procedure RestoreDefaults; override;
property ReportLink: TcxTreeListCustomReportLink read GetReportLink;
published
property AutoExpandNodes: Boolean read FAutoExpandNodes write SetAutoExpandNodes default False;
property ExplicitlyExpandNodes: Boolean read FExplicitlyExpandNodes write SetExplicitlyExpandNodes default False;
end;
TcxTreeListReportLinkOptionsFormatting = class(TdxCustomReportLinkOptionsFormatting)
private
FConsumeSelectionStyle: Boolean;
FNodeSeparatorColor: TColor;
FNodeSeparatorThickness: Integer;
function GetActualNodeSeparatorColor: TColor;
function GetReportLink: TcxTreeListCustomReportLink;
procedure SetConsumeSelectionStyle(Value: Boolean);
procedure SetNodeSeparatorColor(Value: TColor);
procedure SetNodeSeparatorThickness(Value: Integer);
protected
function DesignerTabIndex: Integer; override;
public
procedure Assign(Source: TPersistent); override;
procedure RestoreDefaults; override;
property ActualNodeSeparatorColor: TColor read GetActualNodeSeparatorColor;
property ReportLink: TcxTreeListCustomReportLink read GetReportLink;
published
property ConsumeSelectionStyle: Boolean read FConsumeSelectionStyle write SetConsumeSelectionStyle default False;
property NodeSeparatorColor: TColor read FNodeSeparatorColor write SetNodeSeparatorColor default clDefault;
property NodeSeparatorThickness: Integer read FNodeSeparatorThickness write SetNodeSeparatorThickness default 0;
property UseLookAndFeelColors;
end;
TcxTreeListReportLinkOptionsOnEveryPage = class(TdxCustomTableControlReportLinkOptionsOnEveryPage)
private
function GetReportLink: TcxTreeListCustomReportLink;
protected
function DesignerTabIndex: Integer; override;
public
property ReportLink: TcxTreeListCustomReportLink read GetReportLink;
published
property BandHeaders;
property Footers;
property Headers;
end;
TcxTreeListReportLinkOptionsPagination = class(TdxCustomTableControlReportLinkOptionsPagination)
private
function GetNode: Boolean;
function GetReportLink: TcxTreeListCustomReportLink;
procedure SetNode(Value: Boolean);
protected
function DesignerTabIndex: Integer; override;
public
property ReportLink: TcxTreeListCustomReportLink read GetReportLink;
published
property Band;
property Column;
property Custom;
property Node: Boolean read GetNode write SetNode default True;
end;
TcxTreeListReportLinkOptionsPreview = class(TdxCustomTableControlReportLinkOptionsPreview)
private
function GetReportLink: TcxTreeListCustomReportLink;
protected
function DesignerTabIndex: Integer; override;
public
property ReportLink: TcxTreeListCustomReportLink read GetReportLink;
end;
TcxTreeListReportLinkOptionsRefinements = class(TdxCustomReportLinkOptionsRefinements)
private
function GetReportLink: TcxTreeListCustomReportLink;
protected
function DesignerTabIndex: Integer; override;
public
property ReportLink: TcxTreeListCustomReportLink read GetReportLink;
end;
TcxTreeListReportLinkOptionsSelection = class(TdxCustomTableControlReportLinkOptionsSelection)
private
function GetReportLink: TcxTreeListCustomReportLink;
protected
function DesignerTabIndex: Integer; override;
public
property ReportLink: TcxTreeListCustomReportLink read GetReportLink;
end;
TcxTreeListReportLinkOptionsSize = class(TdxCustomReportLinkOptionsSize)
private
function GetReportLink: TcxTreeListCustomReportLink;
protected
function DesignerTabIndex: Integer; override;
public
property ReportLink: TcxTreeListCustomReportLink read GetReportLink;
published
property AutoWidth;
end;
TcxTreeListReportLinkOptionsView = class(TdxCustomTableControlReportLinkOptionsView)
private
FBorders: Boolean;
FTreeLines: Boolean;
function GetReportLink: TcxTreeListCustomReportLink;
procedure SetBorders(Value: Boolean);
procedure SetTreeLines(Value: Boolean);
protected
function DesignerTabIndex: Integer; override;
public
procedure Assign(Source: TPersistent); override;
procedure RestoreDefaults; override;
property ReportLink: TcxTreeListCustomReportLink read GetReportLink;
published
property BandHeaders;
property Borders: Boolean read FBorders write SetBorders default True;
property ExpandButtons;
property Footers;
property Headers;
property TreeLines: Boolean read FTreeLines write SetTreeLines default True;
end;
{ TcxTreeListReportLinkStyles }
TcxTreeListReportLinkStylesClass = class of TcxTreeListReportLinkStyles;
TcxTreeListReportLinkStyles = class(TdxCustomReportLinkStyles)
private
FOnGetNodeIndentStyle: TcxTreeListGetNodeIndentStyleEvent;
function GetReportLink: TcxTreeListCustomReportLink;
protected
function DesignerTabIndex: Integer; override;
procedure GetDefaultViewParams(Index: Integer; AData: TObject; out AParams: TcxViewParams); override;
class function GetStyleCaption(AnIndex: Integer): string; override;
function GetStyleIndexByCaption(const Caption: string): Integer; override;
public
procedure Assign(Source: TPersistent); override;
procedure GetBandHeaderParams(ABand: TcxTreeListBand; out AParams: TcxViewParams); virtual;
procedure GetColumnFooterParams(ANode: TcxTreeListNode; AColumn: TcxTreeListColumn;
out AParams: TcxViewParams); virtual;
procedure GetColumnHeaderParams(AColumn: TcxTreeListColumn; out AParams: TcxViewParams); virtual;
procedure GetContentParams(ANode: TcxTreeListNode; AColumn: TcxTreeListColumn;
out AParams: TcxViewParams); virtual;
procedure GetFooterRowParams(out AParams: TcxViewParams); virtual;
procedure GetImagesParams(ANode: TcxTreeListNode; out AParams: TcxViewParams); virtual;
procedure GetIndentParams(ANode: TcxTreeListNode; AnIndent: Integer; out AParams: TcxViewParams); virtual;
procedure GetPreviewParams(ANode: TcxTreeListNode; AColumn: TcxTreeListColumn;
out AParams: TcxViewParams); virtual;
procedure GetSelectionParams(out AParams: TcxViewParams); virtual;
property ReportLink: TcxTreeListCustomReportLink read GetReportLink;
published
property BandBackground: TcxStyle Index vspsTreeListBandBackground read GetValue write SetValue;
property BandHeader: TcxStyle Index vspsTreeListBandHeader read GetValue write SetValue;
property Content: TcxStyle Index vspsTreeListContent read GetValue write SetValue;
property ContentEven: TcxStyle Index vspsTreeListContentEven read GetValue write SetValue;
property ContentOdd: TcxStyle Index vspsTreeListContentOdd read GetValue write SetValue;
property Footer: TcxStyle Index vspsTreeListFooter read GetValue write SetValue;
property FooterRow: TcxStyle Index vspsTreeListFooterRow read GetValue write SetValue;
property Header: TcxStyle Index vspsTreeListHeader read GetValue write SetValue;
property Preview: TcxStyle Index vspsTreeListPreview read GetValue write SetValue;
property Selection: TcxStyle Index vspsTreeListSelection read GetValue write SetValue;
property StyleSheet;
property OnGetNodeIndentStyle: TcxTreeListGetNodeIndentStyleEvent read FOnGetNodeIndentStyle write FOnGetNodeIndentStyle;
end;
TcxTreeListReportLinkStyleSheet = class(TdxCustomReportLinkStyleSheet)
private
function GetStylesValue: TcxTreeListReportLinkStyles;
procedure SetStylesValue(Value: TcxTreeListReportLinkStyles);
public
class function GetStylesClass: TcxCustomStylesClass; override;
published
property Styles: TcxTreeListReportLinkStyles read GetStylesValue write SetStylesValue;
end;
{ Host Services }
TcxTreeListAttributeHostInfo = class
private
FParent: TdxReportCell;
public
Origin: TPoint;
procedure Initialize(AParent: TdxReportCell);
property Parent: TdxReportCell read FParent;
end;
TcxTreeListAttributeHostInfoServicesClass = class of TcxTreeListAttributeHostInfoServices;
TcxTreeListAttributeHostInfoServices = class
private
FPageDetailsHostInfo: TcxTreeListAttributeHostInfo;
FPageFootersHostInfo: TcxTreeListAttributeHostInfo;
FPageHeadersHostInfo: TcxTreeListAttributeHostInfo;
FReportLink: TcxTreeListCustomReportLink;
function GetArePageFootersAssigned: Boolean;
function GetArePageHeadersAssigned: Boolean;
function GetCanUseBandHeadersOnEveyPage: Boolean;
function GetCanUseFootersOnEveryPage: Boolean;
function GetCanUseHeadersOnEveryPage: Boolean;
function GetIsInconsistentHeadersState: Boolean;
function GetOptionsOnEveryPage: TcxTreeListReportLinkOptionsOnEveryPage;
function GetOptionsView: TcxTreeListReportLinkOptionsView;
function GetPageDetails: TdxReportCell;
function GetPageFooters: TdxReportCell;
function GetPageHeaders: TdxReportCell;
protected
procedure CreateHostInfos;
procedure DestroyHostInfos;
function GetBandHeadersHostInfo: TcxTreeListAttributeHostInfo; virtual;
function GetFootersHostInfo: TcxTreeListAttributeHostInfo; virtual;
function GetHeadersHostInfo: TcxTreeListAttributeHostInfo; virtual;
function GetInconsistentStateText: string; virtual;
function GetIsInconsistentState: Boolean; virtual;
function HasCells: Boolean;
property OptionsOnEveryPage: TcxTreeListReportLinkOptionsOnEveryPage read GetOptionsOnEveryPage;
property OptionsView: TcxTreeListReportLinkOptionsView read GetOptionsView;
property PageDetails: TdxReportCell read GetPageDetails;
property PageFooters: TdxReportCell read GetPageFooters;
property PageHeaders: TdxReportCell read GetPageHeaders;
public
constructor Create(AReportLink: TcxTreeListCustomReportLink); virtual;
destructor Destroy; override;
procedure InitializeHostInfos;
property ArePageFootersAssigned: Boolean read GetArePageFootersAssigned;
property ArePageHeadersAssigned: Boolean read GetArePageHeadersAssigned;
property BandHeadersHostInfo: TcxTreeListAttributeHostInfo read GetBandHeadersHostInfo;
property CanUseBandHeadersOnEveyPage: Boolean read GetCanUseBandHeadersOnEveyPage;
property CanUseFootersOnEveryPage: Boolean read GetCanUseFootersOnEveryPage;
property CanUseHeadersOnEveryPage: Boolean read GetCanUseHeadersOnEveryPage;
property FootersHostInfo: TcxTreeListAttributeHostInfo read GetFootersHostInfo;
property HeadersHostInfo: TcxTreeListAttributeHostInfo read GetHeadersHostInfo;
property InconsistentStateText: string read GetInconsistentStateText;
property IsInconsistentHeadersState: Boolean read GetIsInconsistentHeadersState;
property IsInconsistentState: Boolean read GetIsInconsistentState;
property PageDetailsHostInfo: TcxTreeListAttributeHostInfo read FPageDetailsHostInfo;
property PageFootersHostInfo: TcxTreeListAttributeHostInfo read FPageFootersHostInfo;
property PageHeadersHostInfo: TcxTreeListAttributeHostInfo read FPageHeadersHostInfo;
property ReportLink: TcxTreeListCustomReportLink read FReportLink;
end;
{ TcxTreeListCustomReportLink }
TcxTreeListNodeArray = array of TcxTreeListNode;
TcxTreeListReportLinkGetCustomPageBreaksEvent = procedure(Sender: TcxTreeListCustomReportLink) of object;
TcxTreeListReportLinkCustomDrawBandCellEvent = procedure(Sender: TcxTreeListCustomReportLink;
ACanvas: TCanvas; ABand: TcxTreeListBand; AnItem: TdxReportCellImage;
var ADone: Boolean) of object;
TcxTreeListReportLinkCustomDrawCellEvent = procedure(Sender: TcxTreeListCustomReportLink;
ACanvas: TCanvas; ANode: TcxTreeListNode; AColumn: TcxTreeListColumn;
AnItem: TAbstractdxReportCellData; var ADone: Boolean) of object;
TcxTreeListReportLinkCustomDrawFooterCellEvent = procedure(Sender: TcxTreeListCustomReportLink;
ACanvas: TCanvas; AColumn: TcxTreeListColumn; AnItem: TdxReportCellString; var ADone: Boolean) of object;
TcxTreeListReportLinkCustomDrawHeaderCellEvent = procedure(Sender: TcxTreeListCustomReportLink;
ACanvas: TCanvas; AColumn: TcxTreeListColumn; AnItem: TdxReportCellImage; var ADone: Boolean) of object;
TcxTreeListReportLinkCustomDrawIndentCellEvent = procedure(Sender: TcxTreeListCustomReportLink;
ACanvas: TCanvas; ANode: TcxTreeListNode; AnIndex: Integer; AnItem: TAbstractdxReportCellData;
var ADone: Boolean) of object;
TcxTreeListReportLinkInitializeBandCellEvent = procedure(Sender: TcxTreeListCustomReportLink;
ABand: TcxTreeListBand; AnItem: TdxReportCellImage) of object;
TcxTreeListReportLinkInitializeCellEvent = procedure(Sender: TcxTreeListCustomReportLink;
ANode: TcxTreeListNode; AColumn: TcxTreeListColumn; AnItem: TAbstractdxReportCellData) of object;
TcxTreeListReportLinkInitializeFooterCellEvent = procedure(Sender: TcxTreeListCustomReportLink;
ASummaryCellIndex: Integer; AColumn: TcxTreeListColumn; AnItem: TdxReportCellString) of object;
TcxTreeListReportLinkInitializeHeaderCellEvent = procedure(Sender: TcxTreeListCustomReportLink;
AColumn: TcxTreeListColumn; AnItem: TdxReportCellImage) of object;
TcxTreeListReportLinkInitializeIndentCellEvent = procedure(Sender: TcxTreeListCustomReportLink;
ANode: TcxTreeListNode; AnIndex: Integer; AnItem: TAbstractdxReportCellData) of object;
TcxTreeListCustomReportLink = class(TdxCustomTableControlReportLink)
private
FBuilder: TcxTreeListReportLinkBuilder;
FDelimitersHardVert: TList;
FHostInfoServices: TcxTreeListAttributeHostInfoServices;
FReportRows: TList;
FOnCustomDrawBandCell: TcxTreeListReportLinkCustomDrawBandCellEvent;
FOnCustomDrawCell: TcxTreeListReportLinkCustomDrawCellEvent;
FOnCustomDrawFooterCell: TcxTreeListReportLinkCustomDrawFooterCellEvent;
FOnCustomDrawHeaderCell: TcxTreeListReportLinkCustomDrawHeaderCellEvent;
FOnCustomDrawIndentCell: TcxTreeListReportLinkCustomDrawIndentCellEvent;
FOnGetCustomPageBreaks: TcxTreeListReportLinkGetCustomPageBreaksEvent;
FOnInitializeBandCell: TcxTreeListReportLinkInitializeBandCellEvent;
FOnInitializeCell: TcxTreeListReportLinkInitializeCellEvent;
FOnInitializeFooterCell: TcxTreeListReportLinkInitializeFooterCellEvent;
FOnInitializeHeaderCell: TcxTreeListReportLinkInitializeHeaderCellEvent;
FOnInitializeIndentCell: TcxTreeListReportLinkInitializeIndentCellEvent;
function GetActiveStyles: TcxTreeListReportLinkStyles;
function GetDesignWindow: TdxfmTreeListReportLinkDesignWindow;
function GetReportRow(Index: Integer): TdxReportCell;
function GetReportRowByNode(Node: TcxTreeListNode): TdxReportCell;
function GetReportRowCount: Integer;
function GetOptionsExpanding: TcxTreeListReportLinkOptionsExpanding;
function GetOptionsFormatting: TcxTreeListReportLinkOptionsFormatting;
function GetOptionsOnEveryPage: TcxTreeListReportLinkOptionsOnEveryPage;
function GetOptionsPagination: TcxTreeListReportLinkOptionsPagination;
function GetOptionsPreview: TcxTreeListReportLinkOptionsPreview;
function GetOptionsRefinements: TcxTreeListReportLinkOptionsRefinements;
function GetOptionsSelection: TcxTreeListReportLinkOptionsSelection;
function GetOptionsSize: TcxTreeListReportLinkOptionsSize;
function GetOptionsView: TcxTreeListReportLinkOptionsView;
function GetStyles: TcxTreeListReportLinkStyles;
function GetTreeList: TcxCustomTreeList;
procedure SetOnCustomDrawBandCell(Value: TcxTreeListReportLinkCustomDrawBandCellEvent);
procedure SetOnCustomDrawCell(Value: TcxTreeListReportLinkCustomDrawCellEvent);
procedure SetOnCustomDrawFooterCell(Value: TcxTreeListReportLinkCustomDrawFooterCellEvent);
procedure SetOnCustomDrawHeaderCell(Value: TcxTreeListReportLinkCustomDrawHeaderCellEvent);
procedure SetOnCustomDrawIndentCell(Value: TcxTreeListReportLinkCustomDrawIndentCellEvent);
procedure SetOptionsExpanding(Value: TcxTreeListReportLinkOptionsExpanding);
procedure SetOptionsFormatting(Value: TcxTreeListReportLinkOptionsFormatting);
procedure SetOptionsOnEveryPage(Value: TcxTreeListReportLinkOptionsOnEveryPage);
procedure SetOptionsPagination(Value: TcxTreeListReportLinkOptionsPagination);
procedure SetOptionsPreview(Value: TcxTreeListReportLinkOptionsPreview);
procedure SetOptionsRefinements(Value: TcxTreeListReportLinkOptionsRefinements);
procedure SetOptionsSelection(Value: TcxTreeListReportLinkOptionsSelection);
procedure SetOptionsSize(Value: TcxTreeListReportLinkOptionsSize);
procedure SetOptionsView(Value: TcxTreeListReportLinkOptionsView);
procedure SetStyles(Value: TcxTreeListReportLinkStyles);
protected
procedure ConstructReport(AReportCells: TdxReportCells); override;
procedure ConvertCoords; override;
procedure CustomDraw(AItem: TAbstractdxReportCellData; ACanvas: TCanvas;
ABoundsRect, AClientRect: TRect; var ADone: Boolean); override;
function GetBreakPagesByHardDelimiters: Boolean; override;
procedure GetImageLists(AProc: TdxPSGetImageListProc); override;
function GetRebuildOnPageParamsChange(AUpdateCodes: TdxPrinterPageUpdateCodes): Boolean; override;
function GetUseHardVertDelimiters: Boolean; override;
procedure InternalRestoreFromOriginal; override;
function IsDrawFootersOnEveryPage: Boolean; override;
function IsDrawHeadersOnEveryPage: Boolean; override;
function IsSupportedCustomDraw(Item: TAbstractdxReportCellData): Boolean; override;
procedure MakeHardDelimiters(AReportCells: TdxReportCells; AVertDelimiters: TList); override;
function GetAreNativeStylesAvailable: Boolean; override;
function GetStylesClass: TdxCustomReportLinkStylesClass; override;
function GetStyleSheetClass: TdxCustomReportLinkStyleSheetClass; override;
function GetStyleSheetPrototype: TdxCustomReportLinkStyleSheet; override;
procedure PrepareConstruct; override;
procedure DoCustomDrawBandCell(ACanvas: TCanvas; ABand: TcxTreeListBand;
AnItem: TdxReportCellImage; var ADone: Boolean); dynamic;
procedure DoCustomDrawCell(ACanvas: TCanvas; ANode: TcxTreeListNode;
AColumn: TcxTreeListColumn; AnItem: TAbstractdxReportCellData;
var ADone: Boolean); dynamic;
procedure DoCustomDrawFooterCell(ACanvas: TCanvas; AColumn: TcxTreeListColumn;
AnItem: TdxReportCellString; var ADone: Boolean); dynamic;
procedure DoCustomDrawHeaderCell(ACanvas: TCanvas; AColumn: TcxTreeListColumn;
AnItem: TdxReportCellImage; var ADone: Boolean); dynamic;
procedure DoCustomDrawIndentCell(ACanvas: TCanvas; ANode: TcxTreeListNode;
AnIndex: Integer; AnItem: TAbstractdxReportCellData; var ADone: Boolean); dynamic;
procedure DoGetCustomPageBreaks; dynamic;
procedure DoInitializeBandCell(ABand: TcxTreeListBand; AnItem: TdxReportCellImage); dynamic;
procedure DoInitializeCell(ANode: TcxTreeListNode; AColumn: TcxTreeListColumn; AnItem: TAbstractdxReportCellData); dynamic;
procedure DoInitializeFooterCell( AColumn: TcxTreeListColumn; ASummaryCellIndex: Integer; AnItem: TdxReportCellString); dynamic;
procedure DoInitializeHeaderCell(AColumn: TcxTreeListColumn; AnItem: TdxReportCellImage); dynamic;
procedure DoInitializeIndentCell(ANode: TcxTreeListNode; AnIndex: Integer; AnItem: TAbstractdxReportCellData); dynamic;
function GetOptionsExpandingClass: TdxCustomReportLinkOptionsExpandingClass; override;
function GetOptionsFormattingClass: TdxCustomReportLinkOptionsFormattingClass; override;
function GetOptionsOnEveryPageClass: TdxCustomTableControlReportLinkOptionsOnEveryPageClass; override;
function GetOptionsPaginationClass: TdxCustomReportLinkOptionsPaginationClass; override;
function GetOptionsPreviewClass: TdxCustomTableControlReportLinkOptionsPreviewClass; override;
function GetOptionsRefinementsClass: TdxCustomReportLinkOptionsRefinementsClass; override;
function GetOptionsSelectionClass: TdxCustomTableControlReportLinkOptionsSelectionClass; override;
function GetOptionsSizeClass: TdxCustomReportLinkOptionsSizeClass; override;
function GetOptionsViewClass: TdxCustomReportLinkOptionsViewClass; override;
procedure AddReportRow(AReportRow: TdxReportCell);
procedure AddVerticalHardDelimiter(ADelimiter: TdxReportCell); overload;
procedure AddVerticalHardDelimiter(ADelimiter: Integer); overload;
function CreateBuilder: TcxTreeListReportLinkBuilder; virtual;
class function GetBuilderClass: TcxTreeListReportLinkBuilderClass; virtual;
function ExtractIndentIndex(AData: Integer): Integer;
function GetItemCustomDrawInfo(AnItem: TdxReportVisualItem;
out ADrawInfo: TcxTreeListCellCustomDrawInfo): TcxTreeListAttributeID; virtual;
function IsCustomDrawn(AnAttributeID: TcxTreeListAttributeID): Boolean; virtual;
function MakeIndentIndex(AnIndex: Integer): DWORD;
property ActiveStyles: TcxTreeListReportLinkStyles read GetActiveStyles;
property Builder: TcxTreeListReportLinkBuilder read FBuilder;
property DelimitersHardVert: TList read FDelimitersHardVert;
property HostInfoServices: TcxTreeListAttributeHostInfoServices read FHostInfoServices;
property TreeList: TcxCustomTreeList read GetTreeList;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure AddPageBreak(ANode: TcxTreeListNode); overload;
procedure AddPageBreak(const ANodes: array of TcxTreeListNode); overload;
procedure AddPageBreak(const ANodes: TcxTreeListNodeArray); overload;
procedure AddPageBreak(ANodes: TList); overload; // List of TcxCustomGridRecord
property DesignWindow: TdxfmTreeListReportLinkDesignWindow read GetDesignWindow;
property ReportRows[Index: Integer]: TdxReportCell read GetReportRow;
property ReportRowsByNode[Node: TcxTreeListNode]: TdxReportCell read GetReportRowByNode;
property ReportRowCount: Integer read GetReportRowCount;
published
property Color;
property Font;
property OptionsExpanding: TcxTreeListReportLinkOptionsExpanding read GetOptionsExpanding write SetOptionsExpanding;
property OptionsFormatting: TcxTreeListReportLinkOptionsFormatting read GetOptionsFormatting write SetOptionsFormatting;
property OptionsOnEveryPage: TcxTreeListReportLinkOptionsOnEveryPage read GetOptionsOnEveryPage write SetOptionsOnEveryPage;
property OptionsPagination: TcxTreeListReportLinkOptionsPagination read GetOptionsPagination write SetOptionsPagination;
property OptionsPreview: TcxTreeListReportLinkOptionsPreview read GetOptionsPreview write SetOptionsPreview;
property OptionsRefinements: TcxTreeListReportLinkOptionsRefinements read GetOptionsRefinements write SetOptionsRefinements;
property OptionsSelection: TcxTreeListReportLinkOptionsSelection read GetOptionsSelection write SetOptionsSelection;
property OptionsSize: TcxTreeListReportLinkOptionsSize read GetOptionsSize write SetOptionsSize;
property OptionsView: TcxTreeListReportLinkOptionsView read GetOptionsView write SetOptionsView;
property ScaleFonts;
property StyleRepository;
property Styles: TcxTreeListReportLinkStyles read GetStyles write SetStyles;
property SupportedCustomDraw;
property OnCustomDrawBandCell: TcxTreeListReportLinkCustomDrawBandCellEvent read FOnCustomDrawBandCell
write SetOnCustomDrawBandCell;
property OnCustomDrawCell: TcxTreeListReportLinkCustomDrawCellEvent read FOnCustomDrawCell
write SetOnCustomDrawCell;
property OnCustomDrawFooterCell: TcxTreeListReportLinkCustomDrawFooterCellEvent read FOnCustomDrawFooterCell
write SetOnCustomDrawFooterCell;
property OnCustomDrawHeaderCell: TcxTreeListReportLinkCustomDrawHeaderCellEvent read FOnCustomDrawHeaderCell
write SetOnCustomDrawHeaderCell;
property OnCustomDrawIndentCell: TcxTreeListReportLinkCustomDrawIndentCellEvent read FOnCustomDrawIndentCell
write SetOnCustomDrawIndentCell;
property OnGetCustomPageBreaks: TcxTreeListReportLinkGetCustomPageBreaksEvent read FOnGetCustomPageBreaks write FOnGetCustomPageBreaks;
property OnInitializeBandCell: TcxTreeListReportLinkInitializeBandCellEvent read FOnInitializeBandCell
write FOnInitializeBandCell;
property OnInitializeCell: TcxTreeListReportLinkInitializeCellEvent read FOnInitializeCell
write FOnInitializeCell;
property OnInitializeFooterCell: TcxTreeListReportLinkInitializeFooterCellEvent read FOnInitializeFooterCell
write FOnInitializeFooterCell;
property OnInitializeHeaderCell: TcxTreeListReportLinkInitializeHeaderCellEvent read FOnInitializeHeaderCell
write FOnInitializeHeaderCell;
property OnInitializeIndentCell: TcxTreeListReportLinkInitializeIndentCellEvent read FOnInitializeIndentCell
Write FOnInitializeIndentCell;
end;
TcxTreeListReportLink = class(TcxTreeListCustomReportLink)
private
function GetTreeList: TcxTreeList;
public
property TreeList: TcxTreeList read GetTreeList;
end;
TcxDBTreeListReportLink = class(TcxTreeListCustomReportLink)
private
function GetDBTreeList: TcxDBTreeList;
public
property DBTreeList: TcxDBTreeList read GetDBTreeList;
end;
TcxVirtualTreeListReportLink = class(TcxTreeListCustomReportLink)
private
function GetVirtualTreeList: TcxVirtualTreeList;
public
property VirtualTreeList: TcxVirtualTreeList read GetVirtualTreeList;
end;
TdxfmTreeListReportLinkDesignWindow = class(TdxfmCustomcxControlReportLinkDesignWindow)
PageControl1: TPageControl;
tshView: TTabSheet;
lblShow: TLabel;
imgShow: TImage;
bvlShow: TBevel;
lblOnEveryPage: TLabel;
imgOnEveryPage: TImage;
bvlOnEveryPage: TBevel;
bvlWarningHost: TBevel;
chbxShowBands: TCheckBox;
chbxShowHeaders: TCheckBox;
chbxShowFooters: TCheckBox;
chbxShowExpandButtons: TCheckBox;
chbxBandsOnEveryPage: TCheckBox;
chbxHeadersOnEveryPage: TCheckBox;
chbxFootersOnEveryPage: TCheckBox;
chbxShowTreeLines: TCheckBox;
tshBehaviors: TTabSheet;
tshFormatting: TTabSheet;
lblLookAndFeel: TLabel;
bvlLookAndFeel: TBevel;
imgLookAndFeel: TImage;
imgRefinements: TImage;
lblRefinements: TLabel;
bvlRefinements: TBevel;
cbxLookAndFeel: TComboBox;
chbxFlatCheckMarks: TCheckBox;
chbxDisplayGraphicsAsText: TCheckBox;
chbxTransparentGraphics: TCheckBox;
tshPreview: TTabSheet;
lblPreviewOptions: TLabel;
bvlPreviewOptions: TBevel;
lblPreviewMaxLineCount: TLabel;
bvlPreviewMaxLineCountHost: TBevel;
imgPreview: TImage;
chbxPreviewVisible: TCheckBox;
chbxPreviewAutoHeight: TCheckBox;
pnlPreview: TPanel;
cxStyleRepository1: TcxStyleRepository;
styleBandHeaders: TcxStyle;
styleStandard: TcxStyle;
stylePreview: TcxStyle;
styleCardShadow: TcxStyle;
chbxSuppressBackgroundBitmaps: TCheckBox;
tshStyles: TTabSheet;
bvlStyles: TBevel;
bvlStyleSheets: TBevel;
lblStyleSheets: TLabel;
btnStyleColor: TButton;
btnStyleFont: TButton;
btnStyleBackgroundBitmap: TButton;
chbxUseNativeStyles: TCheckBox;
cbxStyleSheets: TComboBox;
btnStyleSheetNew: TButton;
btnStyleSheetCopy: TButton;
btnStyleSheetDelete: TButton;
btnStylesSaveAs: TButton;
btnStyleSheetRename: TButton;
pmStyles: TPopupMenu;
miStyleFont: TMenuItem;
miStyleColor: TMenuItem;
miStyleBackgroundBitmap: TMenuItem;
milLine: TMenuItem;
miStylesSaveAs: TMenuItem;
btnStyleBackgroundBitmapClear: TButton;
btnStyleRestoreDefaults: TButton;
miLine2: TMenuItem;
miLine3: TMenuItem;
miStyleBackgroundBitmapClear: TMenuItem;
miStyleRestoreDefaults: TMenuItem;
bvlStylesHost: TBevel;
ilStylesPopup: TImageList;
PreviewTreeList: TcxTreeList;
colManufacturerName: TcxTreeListColumn;
colManufacturerLogo: TcxTreeListColumn;
colManufacturerCountry: TcxTreeListColumn;
colCarModel: TcxTreeListColumn;
colCarIsSUV: TcxTreeListColumn;
chbxShowBorders: TCheckBox;
miStylesSelectAll: TMenuItem;
miLine4: TMenuItem;
chbxConsumeSelectionStyle: TCheckBox;
bvlRefinementsSeparator: TBevel;
Bevel2: TBevel;
pnlBehaviors: TPanel;
pnlSelection: TPanel;
lblSelection: TLabel;
imgSelection: TImage;
bvlSelection: TBevel;
chbxProcessSelection: TCheckBox;
chbxProcessExactSelection: TCheckBox;
pnlExpanding: TPanel;
lblExpanding: TLabel;
imgExpanding: TImage;
bvlExpanding: TBevel;
chbxExpandNodes: TCheckBox;
pnlSize: TPanel;
lblSize: TLabel;
bvlSize: TBevel;
imgGridSize: TImage;
chbxAutoWidth: TCheckBox;
pnlSeparators: TPanel;
lblSeparators: TLabel;
bvlSeparator: TBevel;
lblSeparatorsThickness: TLabel;
lblSeparatorsColor: TLabel;
bvlSeparatorThicknessHost: TBevel;
bvlSeparatorColorHost: TBevel;
imgSeparators: TImage;
chbxExplicitlyExpandNodes: TCheckBox;
lblPreviewWindow: TStaticText;
Label1: TLabel;
lblUseNativeStyles: TLabel;
procedure LookAndFeelChange(Sender: TObject);
procedure OptionsRefinementsClick(Sender: TObject);
procedure PreviewVisibleClick(Sender: TObject);
procedure PreviewAutoHeightClick(Sender: TObject);
procedure OptionsSelectionClick(Sender: TObject);
procedure OptionsExpandingClick(Sender: TObject);
procedure OptionsViewClick(Sender: TObject);
procedure OptionsOnEveryPageClick(Sender: TObject);
procedure OptionsSizeClick(Sender: TObject);
procedure OptionsFormattingClick(Sender: TObject);
procedure pmStylesPopup(Sender: TObject);
procedure StyleColorClick(Sender: TObject);
procedure StyleFontClick(Sender: TObject);
procedure StyleBackgroundBitmapClick(Sender: TObject);
procedure cbxStyleSheetsClick(Sender: TObject);
procedure btnStyleSheetNewClick(Sender: TObject);
procedure btnStyleSheetCopyClick(Sender: TObject);
procedure btnStyleSheetDeleteClick(Sender: TObject);
procedure btnStyleSheetRenameClick(Sender: TObject);
procedure StylesSaveAsClick(Sender: TObject);
procedure cbxStyleSheetsKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure lbxStylesClick(Sender: TObject);
procedure StyleBackgroundBitmapClearClick(Sender: TObject);
procedure StyleRestoreDefaultsClick(Sender: TObject);
procedure miStylesSelectAllClick(Sender: TObject);
procedure PageControl1Change(Sender: TObject);
procedure cbxStyleSheetsDrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
procedure lblUseNativeStylesClick(Sender: TObject);
procedure PreviewTreeListCustomDrawBandHeaderCell(
Sender: TcxCustomTreeList; ACanvas: TcxCanvas;
AViewInfo: TcxTreeListHeaderCellViewInfo; var ADone: Boolean);
procedure PreviewTreeListCustomDrawDataCell(Sender: TcxCustomTreeList;
ACanvas: TcxCanvas; AViewInfo: TcxTreeListEditCellViewInfo;
var ADone: Boolean);
procedure PreviewTreeListCustomDrawFooterCell(
Sender: TcxCustomTreeList; ACanvas: TcxCanvas;
AViewInfo: TcxTreeListFooterCellViewInfo; var ADone: Boolean);
procedure PreviewTreeListCustomDrawHeaderCell(
Sender: TcxCustomTreeList; ACanvas: TcxCanvas;
AViewInfo: TcxTreeListHeaderCellViewInfo; var ADone: Boolean);
private
lbxStyles: TdxStylesListBox;
sePreviewMaxLineCount: TdxPSSpinEdit;
seSeparatorThickness: TdxPSSpinEdit;
ccbxSeparatorColor: TdxPSColorCombo;
wpIncorrectOnEveryPageState: TdxPSWarningPane;
function GetActiveStyle: TcxStyle;
function GetHasSelectedStyles: Boolean;
function GetHasSelectedStylesWithAssignedBitmap: Boolean;
function GetReportLink: TcxTreeListCustomReportLink;
procedure PreviewMaxLineCountChanged(Sender: TObject);
procedure SeparatorColorChanged(Sender: TObject);
procedure SeparatorThicknessChanged(Sender: TObject);
function CanSelectAllStyles: Boolean;
procedure CreateControls;
procedure CustomDrawBorders(ACanvas: TcxCanvas; const R: TRect);
procedure CustomDrawCheckMark(ACanvas: TcxCanvas; AViewInfo: TcxTreeListEditCellViewInfo);
procedure CustomDrawFooter(ACanvas: TcxCanvas; R: TRect; AViewInfo: TcxTreeListFooterCellViewInfo);
procedure CustomDrawHeader(ACanvas: TcxCanvas; R: TRect; AViewInfo: TcxTreeListHeaderCellViewInfo);
procedure CustomDrawTextRect(ACanvas: TcxCanvas; R: TRect; const AText: string;
AnAlignmentHorz: TAlignment; AnAlignmentVert: TcxAlignmentVert; AParams: TcxViewParams);
function ExtractAlignmentHorz(AViewInfo: TcxTreeListEditCellViewInfo): TAlignment;
function ExtractAlignmentVert(AViewInfo: TcxTreeListEditCellViewInfo): TcxAlignmentVert;
procedure InitializePreviewTreeList;
procedure InitializePreviewTreeListStyles;
procedure LoadDataIntoPreviewTreeList;
procedure RecreateStylesListBox;
procedure RestoreSelectedStyles(AList: TList);
procedure SaveSelectedStyles(AList: TList);
procedure SetActivePage;
procedure UpdatePreviewTreeListStyles(const ACaption: string; AStyle: TcxStyle);
procedure WarningPaneUpdate;
procedure SetOptionsExpandingByIndex(Index: Integer; Value: Boolean);
procedure SetOptionsFormattingByIndex(Index: Integer; Value: Boolean);
procedure SetOptionsOnEveryPageByIndex(Index: Integer; Value: Boolean);
procedure SetOptionsRefinementsByIndex(Index: Integer; Value: Boolean);
procedure SetOptionsSelectionByIndex(Index: Integer; Value: Boolean);
procedure SetOptionsSizeByIndex(Index: Integer; Value: Boolean);
procedure SetOptionsViewByIndex(Index: Integer; Value: Boolean);
protected
procedure DoInitialize; override;
{$IFDEF DELPHI7}
function GetPreviewHost: TCustomPanel; override;
{$ENDIF}
procedure LoadStrings; override;
procedure UpdateControlsState; override;
procedure UpdatePreview; override;
function GetDesignerTabIndex: Integer; override;
procedure SetDesignerTabIndex(Value: Integer); override;
procedure DoActiveStyleSheetChanged; override;
procedure DoFormActivated(AnActive: Boolean); override;
procedure DoRefreshStylesList; override;
procedure DoStyleChanged(const ACaption: string; AStyle: TcxStyle); override;
procedure DoStylesChanged(AStrings: TStrings; ARecreate: Boolean); override;
procedure GetSelectedStyleNames(AStrings: TStrings); override;
procedure GetStyleNames(out AStrings: TStrings); override;
procedure GetStyleSheetNames(out AStrings: TStrings); override;
property ActiveStyle: TcxStyle read GetActiveStyle;
property HasSelectedStyles: Boolean read GetHasSelectedStyles;
property HasSelectedStylesWithAssignedBitmap: Boolean read GetHasSelectedStylesWithAssignedBitmap;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
property ReportLink: TcxTreeListCustomReportLink read GetReportLink;
end;
const
dxPSDefaultTreeListNodeSeparatorColor: TColor = clBtnShadow;
implementation
{$R *.dfm}
{ 634x420 - DesignWindow }
{.3 - chbxTransparentRichEdits }
uses
{$IFDEF DELPHI6}
Variants,
{$ENDIF} Forms, Registry, dxThemeManager, cxDataStorage, cxDataUtils,
cxImage, cxCheckBox, dxPSGlbl, dxPSRes, dxPSImgs, cxDrawTextUtils, dxPSPopupMan,
dxPSUtl, dxBkgnd, Math;
const
CellSidesMap: array[TcxTreeListGridLines] of TdxCellSides = ([], csTopBottom, csLeftRight, csAll);
SortOrderMap: array[TcxDataSortOrder] of TdxCellSortOrder = (csoNone, csoUp, csoDown);
TreeLinesStyleMap: array[TcxTreeListTreeLineStyle] of TdxPSTreeLineStyle = (tlsDot, tlsDot, tlsSolid);
DefaultDataRowLineHeight = 19;
DefaultExpandButtonSize = 9;
DefaultIndentWidth = 15;
ExpandButtonInteriorColors: array[Boolean] of TColor = (clWindow, clBtnShadow);
FooterItemInflateHorz = 2;
FooterItemInflateVert = 3;
NodeIndentMask = $00000FF0;
NodeIndentOffset = $00000004;
var
FDefaultdxPScxTreeListLinkStyleSheet: TcxTreeListReportLinkStyleSheet;
type
TcxTreeListNodeHelperFactory = class(TdxCustomClassMaps)
private
function GetHelperClass(Node: TcxTreeListNode): TcxTreeListNodeHelperClass;
public
class function Instance: TcxTreeListNodeHelperFactory; reintroduce; overload;
property HelperClasses[Node: TcxTreeListNode]: TcxTreeListNodeHelperClass read GetHelperClass; default;
end;
TcxCustomTreeListAccess = class(TcxCustomTreeList);
TcxTreeListColumnAccess = class(TcxTreeListColumn);
TcxTreeListBandAccess = class(TcxTreeListBand);
{ Helpers }
{ CustomTreeList Helpers }
function CustomTreeList_DoIsGroupNode(AInstance: TcxCustomTreeList; ANode: TcxTreeListNode): Boolean;
begin
Result := TcxCustomTreeListAccess(AInstance).DoIsGroupNode(ANode);
end;
function CustomTreeList_GetImages(AInstance: TcxCustomTreeList): TCustomImageList;
begin
Result := TcxCustomTreeListAccess(AInstance).Images;
end;
function CustomTreeList_GetLookAndFeel(AInstance: TcxCustomTreeList): TcxLookAndFeel;
begin
Result := TcxCustomTreeListAccess(AInstance).LookAndFeel;
end;
function CustomTreeList_GetLookAndFeelPainter(AInstance: TcxCustomTreeList): TcxCustomLookAndFeelPainterClass;
begin
Result := TcxCustomTreeListAccess(AInstance).LookAndFeelPainter;
end;
function CustomTreeList_GetOptionsSelection(AInstance: TcxCustomTreeList): TcxTreeListOptionsSelection;
begin
Result := TcxCustomTreeListAccess(AInstance).OptionsSelection;
end;
function CustomTreeList_GetOptionsView(AInstance: TcxCustomTreeList): TcxTreeListOptionsView;
begin
Result := TcxCustomTreeListAccess(AInstance).OptionsView;
end;
function CustomTreeList_GetPreview(AInstance: TcxCustomTreeList): TcxTreeListPreview;
begin
Result := TcxCustomTreeListAccess(AInstance).Preview;
end;
function CustomTreeList_GetStateImages(AInstance: TcxCustomTreeList): TCustomImageList;
begin
Result := TcxCustomTreeListAccess(AInstance).StateImages;
end;
function CustomTreeList_GetStyles(AInstance: TcxCustomTreeList): TcxTreeListStyles;
begin
Result := TcxCustomTreeListAccess(AInstance).Styles;
end;
function CustomTreeList_GetVisibleBand(AInstance: TcxCustomTreeList;
Index: Integer): TcxTreeListBand;
begin
Result := TcxCustomTreeListAccess(AInstance).Bands.VisibleItems[Index];
end;
function CustomTreeList_GetVisibleBandCount(AInstance: TcxCustomTreeList): Integer;
begin
Result := TcxCustomTreeListAccess(AInstance).Bands.VisibleItemCount;
end;
function CustomTreeList_GetVisibleColumn(AInstance: TcxCustomTreeList;
Index: Integer): TcxTreeListColumn;
begin
Result := TcxCustomTreeListAccess(AInstance).VisibleColumns[Index];
end;
function CustomTreeList_GetVisibleColumnCount(AInstance: TcxCustomTreeList): Integer;
begin
Result := TcxCustomTreeListAccess(AInstance).VisibleColumnCount;
end;
{ TreeListColumn Helpers }
function TreeListColumn_DoGetEditProperties(AInstance: TcxTreeListColumn;
ANode: TcxTreeListNode): TcxCustomEditProperties;
begin
Result := TcxTreeListColumnAccess(AInstance).DoGetEditProperties(ANode);
end;
{ Utilities }
function DefaultdxPScxTreeListLinkStyleSheet: TcxTreeListReportLinkStyleSheet;
function CreateStyle(AColor: TColor; AFontColor: TColor): TcxStyle;
begin
Result := TcxStyle.Create(DefaultdxPScxTreeListLinkStyleSheet);
with Result do
begin
Color := AColor;
Font.Name := dxPSCore.dxPSDefaultFontName;
Font.Color := AFontColor;
end;
end;
begin
if FDefaultdxPScxTreeListLinkStyleSheet = nil then
begin
FDefaultdxPScxTreeListLinkStyleSheet := TcxTreeListReportLinkStyleSheet.Create(nil);
with FDefaultdxPScxTreeListLinkStyleSheet.Styles as TcxTreeListReportLinkStyles do
begin
BandHeader := CreateStyle(dxPSCore.dxDefaultFixedColor, dxPSCore.dxPSDefaultFontColor);
Content := CreateStyle(dxPSCore.dxDefaultContentColor, dxPSCore.dxPSDefaultFontColor);
ContentEven := CreateStyle(dxPSCore.dxDefaultContentColor, dxPSCore.dxPSDefaultFontColor);
ContentOdd := CreateStyle(dxPSCore.dxDefaultContentColor, dxPSCore.dxPSDefaultFontColor);
Footer := CreateStyle(dxPSCore.dxDefaultFixedColor, dxPSCore.dxPSDefaultFontColor);
FooterRow := CreateStyle(dxPSCore.dxDefaultFixedColor, dxPSCore.dxPSDefaultFontColor);
Header := CreateStyle(dxPSCore.dxDefaultFixedColor, dxPSCore.dxPSDefaultFontColor);
Preview := CreateStyle(dxPSCore.dxDefaultContentColor, dxPSCore.dxPSDefaultFontColor);
Selection := CreateStyle(dxPSCore.dxDefaultFixedColor, dxPSCore.dxPSDefaultFontColor);
end;
end;
Result := FDefaultdxPScxTreeListLinkStyleSheet;
end;
function IsValidPointer(const AData: Integer): Boolean;
begin
//Result := (HInstance = 0) or (FindHInstance(Pointer(AData)) = HInstance);
Result := DWORD(AData) > HInstance;
end;
{ TcxTreeListNodeHelperFactory }
function cxTreeListNodeHelperFactory: TcxTreeListNodeHelperFactory;
begin
Result := TcxTreeListNodeHelperFactory.Instance;
end;
class function TcxTreeListNodeHelperFactory.Instance: TcxTreeListNodeHelperFactory;
begin
Result := inherited Instance as TcxTreeListNodeHelperFactory;
end;
function TcxTreeListNodeHelperFactory.GetHelperClass(Node: TcxTreeListNode): TcxTreeListNodeHelperClass;
begin
Result := TcxTreeListNodeHelperClass(PairClasses[Node.ClassType]);
end;
{ CLR Accessors }
{ TcxTreeListReportLinkRowProducer }
constructor TcxTreeListReportLinkRowProducer.Create(ABuilder: TcxTreeListReportLinkBuilder);
begin
inherited Create;
FBuilder := ABuilder;
end;
function TcxTreeListReportLinkRowProducer.Adapter: TcxTreeListAdapter;
begin
Result := Builder.Adapter;
end;
function TcxTreeListReportLinkRowProducer.Builder: TcxTreeListReportLinkBuilder;
begin
Result := FBuilder;
end;
function TcxTreeListReportLinkRowProducer.Formatter: TcxTreeListReportLinkFormatter;
begin
Result := Builder.Formatter;
end;
function TcxTreeListReportLinkRowProducer.Produce(AHostInfo: TcxTreeListAttributeHostInfo): TdxReportCell;
begin
CalculateRowHeight;
CreateRowHost(AHostInfo);
CreateRow;
if AutoHeight then
begin
CalculateRowAutoHeight;
FixupRowHeight;
end;
AfterCalculateRowHeight;
Inc(AHostInfo.Origin.Y, RowHeight);
Result := Host;
end;
procedure TcxTreeListReportLinkRowProducer.AfterCalculateRowHeight;
begin
end;
procedure TcxTreeListReportLinkRowProducer.CalculateRowAutoHeight;
var
DC: HDC;
MaxRowHeight, I, V: Integer;
Item: TdxReportVisualItem;
begin
DC := Self.DC;
MaxRowHeight := 0;
for I := 0 to Row.DataItemCount - 1 do
begin
Item := Row.DataItems[I];
if DoesItemParticipateInRowAutoHeightCalculation(Item) then
begin
V := Item.MeasureContentHeight(DC);
if MaxRowHeight < V then MaxRowHeight := V;
end;
end;
// v3.1
for I := 0 to Row.CellCount - 1 do
begin
Item := Row.Cells[I];
if DoesItemParticipateInRowAutoHeightCalculation(Item) then
begin
V := Item.MeasureContentHeight(DC);
if MaxRowHeight < V then MaxRowHeight := V;
end;
end;
if RowHeight < MaxRowHeight then
RowHeight := MaxRowHeight;
end;
procedure TcxTreeListReportLinkRowProducer.CalculateRowHeight;
begin
FRowHeight := LineCount * LineHeight;
end;
procedure TcxTreeListReportLinkRowProducer.CreateRow;
begin
FRow := TdxReportCell.Create(Host);
FRow.BoundsRect := MakeBounds(0, 0, RowWidth, RowHeight);
InitializeRow;
end;
procedure TcxTreeListReportLinkRowProducer.CreateRowHost(const AHostInfo: TcxTreeListAttributeHostInfo);
begin
FHost := TdxReportCell.Create(AHostInfo.Parent);
FHost.BoundsRect := MakeBounds(AHostInfo.Origin.X, AHostInfo.Origin.Y, RowWidth, RowHeight);
Formatter.DoInitializeHost(Host);
end;
function TcxTreeListReportLinkRowProducer.DoesItemParticipateInRowAutoHeightCalculation(
AnItem: TdxReportVisualItem): Boolean;
begin
Result := True;
end;
procedure TcxTreeListReportLinkRowProducer.FixupRowDataHeight;
var
I: Integer;
begin
for I := 0 to Row.DataItemCount - 1 do
Row.DataItems[I].Height := RowHeight;
// v3.1
for I := 0 to Row.CellCount - 1 do
Row.Cells[I].Height := RowHeight;
end;
procedure TcxTreeListReportLinkRowProducer.FixupRowHeight;
begin
FixupRowItselfHeight;
FixupRowDataHeight;
end;
procedure TcxTreeListReportLinkRowProducer.FixupRowItselfHeight;
begin
Host.Height := RowHeight;
Row.Height := RowHeight;
end;
procedure TcxTreeListReportLinkRowProducer.InitializeRow;
begin
end;
function TcxTreeListReportLinkRowProducer.GetAutoHeight: Boolean;
begin
Result := LineCount = 1;
end;
function TcxTreeListReportLinkRowProducer.GetLineCount: Integer;
begin
Result := 1;
end;
function TcxTreeListReportLinkRowProducer.GetLineHeight: Integer;
begin
Result := 20;
end;
function TcxTreeListReportLinkRowProducer.GetDC: HDC;
begin
Result := Formatter.DC;
end;
function TcxTreeListReportLinkRowProducer.GetIndentWidth: Integer;
begin
Result := Adapter.IndentWidth;
end;
function TcxTreeListReportLinkRowProducer.GetRowWidth: Integer;
begin
Result := Formatter.ViewWidth;
end;
{ TcxTreeListReportLinkNodeSeparatorProducer }
function TcxTreeListReportLinkNodeSeparatorProducer.Produce(AHostInfo: TcxTreeListAttributeHostInfo): TdxReportCell;
begin
Result := inherited Produce(AHostInfo);
FItem := GetItemClass.Create(Row);
FItem.BoundsRect := MakeRect(0, 0, RowWidth, RowHeight);
InitializeItem;
end;
procedure TcxTreeListReportLinkNodeSeparatorProducer.InitializeItem;
begin
Formatter.DoInitializeNodeSeparator(FItem);
end;
procedure TcxTreeListReportLinkNodeSeparatorProducer.InitializeRow;
begin
Formatter.DoInitializeNodeSeparatorRow(Row);
end;
function TcxTreeListReportLinkNodeSeparatorProducer.GetAutoHeight: Boolean;
begin
Result := False;
end;
function TcxTreeListReportLinkNodeSeparatorProducer.GetItemClass: TdxReportCellDataClass;
begin
Result := Formatter.GetNodeSeparatorClass;
end;
function TcxTreeListReportLinkNodeSeparatorProducer.GetLineHeight: Integer;
begin
Result := Formatter.NodeSeparatorThickness;
end;
{ TcxTreeListReportLinkRowSubItemsProducer }
procedure TcxTreeListReportLinkRowSubItemsProducer.CreateDataItems(AParent: TdxReportCell);
var
I: Integer;
AItem: TAbstractdxReportCellData;
begin
for I := 0 to SubItemCount - 1 do
if HasSubItem[I] then
begin
AItem := SubItemClasses[I].Create(AParent);
AItem.BoundsRect := SubItemBounds[I];
InitializeSubItem(AItem, I);
end;
end;
procedure TcxTreeListReportLinkRowSubItemsProducer.CreateRow;
begin
inherited CreateRow;
CreateDataItems(Row);
end;
procedure TcxTreeListReportLinkRowSubItemsProducer.InitializeSubItem(ASubItem: TAbstractdxReportCellData;
AnIndex: Integer);
begin
end;
function TcxTreeListReportLinkRowSubItemsProducer.GetHasSubItem(Index: Integer): Boolean;
begin
Result := True;
end;
function TcxTreeListReportLinkRowSubItemsProducer.GetSubItemBound(Index: Integer): TRect;
begin
Result := MakeRect(0, 0, -1, -1);
end;
function TcxTreeListReportLinkRowSubItemsProducer.GetSubItemCount: Integer;
begin
Result := Formatter.ColumnCount;
end;
function TcxTreeListReportLinkRowSubItemsProducer.GetColumn(Index: Integer): TcxTreeListColumn;
begin
Result := Formatter.Columns[Index];
end;
{ TcxTreeListReportLinkBandsProducer }
function TcxTreeListReportLinkBandsProducer.GetSubItemCount: Integer;
begin
Result := Formatter.BandCount;
end;
procedure TcxTreeListReportLinkBandsProducer.CalculateRowHeight;
begin
FRowHeight := Formatter.ItemPlaceController.Height;
end;
procedure TcxTreeListReportLinkBandsProducer.InitializeRow;
begin
inherited;
Formatter.DoInitializeBandRow(Row);
end;
procedure TcxTreeListReportLinkBandsProducer.InitializeSubItem(ASubItem: TAbstractdxReportCellData;
AnIndex: Integer);
begin
inherited;
Formatter.DoInitializeBandItem(ASubItem, AnIndex);
Formatter.DoReportLinkInitializeBandItem(ASubItem, AnIndex);
end;
function TcxTreeListReportLinkBandsProducer.GetAutoHeight: Boolean;
begin
Result := False;
end;
function TcxTreeListReportLinkBandsProducer.GetSubItemBound(Index: Integer): TRect;
begin
Result := Formatter.GetBandItemBounds(Index);
end;
function TcxTreeListReportLinkBandsProducer.GetSubItemClass(Index: Integer): TdxReportCellDataClass;
begin
Result := Formatter.GetBandItemClass(Index);
end;
{ TcxTreeListReportLinkBandedProducer }
constructor TcxTreeListReportLinkBandedRowProducer.Create(ABuilder: TcxTreeListReportLinkBuilder);
begin
inherited Create(ABuilder);
FIndents := TList.Create;
end;
destructor TcxTreeListReportLinkBandedRowProducer.Destroy;
begin
FIndents.Free;
inherited Destroy;
end;
function TcxTreeListReportLinkBandedRowProducer.Produce(AHostInfo: TcxTreeListAttributeHostInfo): TdxReportCell;
begin
FIndents.Clear;
Result := inherited Produce(AHostInfo);
end;
procedure TcxTreeListReportLinkBandedRowProducer.AfterCalculateRowHeight;
begin
CreateIndentsRow(Row);
end;
procedure TcxTreeListReportLinkBandedRowProducer.CreateBandedDataItems(AParent: TdxReportCell);
var
I: Integer;
ABandPlace: TcxTreeListCustomBandPlace;
AColumnPlace: TcxTreeListColumnPlace;
AItem: TAbstractdxReportCellData;
begin
ABandPlace := TcxTreeListCustomBandPlace(AParent.Data);
for I := 0 to ABandPlace.ItemCount - 1 do
begin
AColumnPlace := ABandPlace.Items[I];
AItem := GetBandedDataItemClass(AColumnPlace).Create(AParent);
AItem.Data := Integer(AColumnPlace);
AItem.BoundsRect := GetBandedDataItemBounds(AItem);
InitializeBandedDataItem(AItem);
end;
end;
procedure TcxTreeListReportLinkBandedRowProducer.CreateBandedRows(AParent: TdxReportCell);
var
I: Integer;
ABandPlace: TcxTreeListCustomBandPlace;
ARow: TdxReportCell;
ABandRowBounds: TRect;
begin
for I := 0 to Formatter.ItemPlaceController.BottomItemCount - 1 do
begin
ABandPlace := Formatter.ItemPlaceController.BottomItems[I];
ARow := TdxReportCell.Create(AParent);
ARow.Data := Integer(ABandPlace);
ABandRowBounds := MakeBounds(ABandPlace.LeftBound, 0, ABandPlace.Width, RowHeight);
if ABandPlace.Band.ActuallyExpandable then
Inc(ABandRowBounds.Left, GetBandedRowIndent);
ARow.BoundsRect := ABandRowBounds;
InitializeBandedRow(ARow);
CreateBandedDataItems(ARow);
end;
end;
procedure TcxTreeListReportLinkBandedRowProducer.CreateIndents(AParent: TdxReportCell);
var
I: Integer;
AIndentCell: TdxReportCellExpandButton;
begin
for I := 0 to IndentCount - 1 do
begin
AIndentCell := Formatter.GetNodeIndentClass.Create(AParent);
AIndentCell.BoundsRect := IndentBounds[I];
InitializeIndent(AIndentCell, I);
FIndents.Add(AIndentCell);
end;
end;
procedure TcxTreeListReportLinkBandedRowProducer.CreateIndentsRow(AParent: TdxReportCell);
var
AIndentsRow: TdxReportCell;
ABandPlace: TcxTreeListCustomBandPlace;
begin
ABandPlace := Formatter.ItemPlaceController.ItemsByBand[Adapter.TreeList.Bands.ExpandableBand];
AIndentsRow := TdxReportCell.Create(AParent);
AIndentsRow.CellSides := [];
AIndentsRow.BoundsRect := MakeBounds(ABandPlace.LeftBound, 0, GetBandedRowIndent, RowHeight);
CreateIndents(AIndentsRow);
end;
procedure TcxTreeListReportLinkBandedRowProducer.CreateRow;
begin
inherited CreateRow;
CreateBandedRows(Row);
end;
function TcxTreeListReportLinkBandedRowProducer.GetBandedDataItemBounds(
AItem: TAbstractdxReportCellData): TRect;
begin
Result := dxPSGlbl.NullRect;
end;
function TcxTreeListReportLinkBandedRowProducer.GetBandedDataItemClass(
AColumnPlace: TcxTreeListColumnPlace): TdxReportCellDataClass;
begin
Result := nil;
end;
function TcxTreeListReportLinkBandedRowProducer.GetBandedRowIndent: Integer;
begin
Result := 0;
end;
function TcxTreeListReportLinkBandedRowProducer.GetIndentArea: Integer;
begin
Result := IndentCount * IndentWidth;
end;
function TcxTreeListReportLinkBandedRowProducer.GetIndentBound(AIndex: Integer): TRect;
begin
Result := MakeBounds(IndentWidth * AIndex, 0, IndentWidth, RowHeight);
end;
function TcxTreeListReportLinkBandedRowProducer.GetIndentCount: Integer;
begin
Result := 0;
end;
procedure TcxTreeListReportLinkBandedRowProducer.InitializeBandedDataItem(
AItem: TAbstractdxReportCellData);
begin
end;
procedure TcxTreeListReportLinkBandedRowProducer.InitializeBandedRow(
ARow: TdxReportCell);
begin
end;
procedure TcxTreeListReportLinkBandedRowProducer.InitializeIndent(AnIndent: TdxReportCellExpandButton; AnIndex: Integer);
begin
end;
function TcxTreeListReportLinkBandedRowProducer.GetIndent(Index: Integer): TdxReportCellExpandButton;
begin
Result := FIndents[Index];
end;
{ TcxTreeListReportLinkFootersProducer }
function TcxTreeListReportLinkFootersProducer.Produce(AHostInfo: TcxTreeListAttributeHostInfo;
AAttachedNode, ADataNode: TcxTreeListNode): TdxReportCell;
begin
FAttachedNode := AAttachedNode;
FDataNode := ADataNode;
Result := inherited Produce(AHostInfo);
FDataNode := nil;
FAttachedNode := nil;
end;
procedure TcxTreeListReportLinkFootersProducer.CreateBandedDataItems(AParent: TdxReportCell);
var
I, ACellIndex: Integer;
AItem: TAbstractdxReportCellData;
AColumnPlace: TcxTreeListColumnPlace;
ABandPlace: TcxTreeListCustomBandPlace;
begin
ABandPlace := TcxTreeListCustomBandPlace(AParent.Data);
for I := 0 to ABandPlace.ItemCount - 1 do
begin
AColumnPlace := ABandPlace.Items[I];
for ACellIndex := 0 to Formatter.GetFooterCellCount(AColumnPlace.Column, FDataNode) - 1 do
begin
AItem := TdxReportCellString.Create(AParent);
AItem.BoundsRect := cxRectOffset(Formatter.GetFooterCellBounds(AColumnPlace.Column,
ACellIndex, IndentArea), -AParent.Left, 0);
Formatter.DoInitializeFooterCell(AItem, AColumnPlace.Column, ACellIndex, FDataNode);
end;
end;
end;
function TcxTreeListReportLinkFootersProducer.GetAutoHeight: Boolean;
begin
Result := False;
end;
function TcxTreeListReportLinkFootersProducer.GetBandedRowIndent: Integer;
begin
Result := IndentArea;
end;
function TcxTreeListReportLinkFootersProducer.GetIndentCount: Integer;
begin
if FAttachedNode <> nil then
begin
Result := Formatter.IndentCounts[FDataNode];
if Adapter.OptionsView.GroupFooters = tlgfVisibleWhenExpanded then
Inc(Result);
end
else
Result := 0;
end;
function TcxTreeListReportLinkFootersProducer.GetLineCount: Integer;
begin
Result := Adapter.FooterLineCount[FDataNode];
end;
function TcxTreeListReportLinkFootersProducer.GetLineHeight: Integer;
begin
Result := Formatter.FooterLineHeight;
end;
procedure TcxTreeListReportLinkFootersProducer.InitializeBandedRow(ARow: TdxReportCell);
begin
inherited InitializeBandedRow(ARow);
Formatter.DoInitializeFooterBandedRow(ARow, IndentCount);
end;
procedure TcxTreeListReportLinkFootersProducer.InitializeIndent(
AnIndent: TdxReportCellExpandButton; AnIndex: Integer);
begin
Formatter.DoInitializeFooterIndent(AnIndent, AnIndex, IndentCount, FAttachedNode);
Formatter.DoReportLinkInitializeNodeIndent(AnIndent, AnIndex, IndentCount, FAttachedNode); // TODO FooterIndentinitialize
end;
procedure TcxTreeListReportLinkFootersProducer.InitializeRow;
begin
inherited InitializeRow;
Formatter.DoInitializeFooterRow(Row);
end;
{ TcxTreeListReportLinkHeadersProducer }
procedure TcxTreeListReportLinkHeadersProducer.InitializeRow;
begin
inherited;
Formatter.DoInitializeHeaderRow(Row);
end;
procedure TcxTreeListReportLinkHeadersProducer.InitializeSubItem(
ASubItem: TAbstractdxReportCellData; AnIndex: Integer);
begin
inherited;
Formatter.DoInitializeHeaderItem(ASubItem, AnIndex);
Formatter.DoReportLinkInitializeHeaderItem(ASubItem, AnIndex);
end;
function TcxTreeListReportLinkHeadersProducer.GetAutoHeight: Boolean;
begin
Result := inherited GetAutoHeight and Adapter.HeaderAutoHeight;
end;
function TcxTreeListReportLinkHeadersProducer.GetLineCount: Integer;
begin
Result := Adapter.DetailsLineCount;
end;
function TcxTreeListReportLinkHeadersProducer.GetLineHeight: Integer;
begin
Result := Formatter.HeaderLineHeight;
end;
function TcxTreeListReportLinkHeadersProducer.GetSubItemBound(Index: Integer): TRect;
begin
Result := Formatter.GetHeaderItemBounds(Index);
end;
function TcxTreeListReportLinkHeadersProducer.GetSubItemClass(Index: Integer): TdxReportCellDataClass;
begin
Result := Formatter.GetHeaderItemClass(Index);
end;
{ TcxTreeListReportLinkNodeProducer }
function TcxTreeListReportLinkNodeProducer.Produce(AHostInfo: TcxTreeListAttributeHostInfo;
ANode: TcxTreeListNode): TdxReportCell;
begin
FNode := ANode;
Result := inherited Produce(AHostInfo);
FNode := nil;
end;
procedure TcxTreeListReportLinkNodeProducer.CalculateRowAutoHeight;
var
AMaxRowHeight, ACurrentItemHeight: Integer;
I, J: Integer;
ACell: TdxReportCell;
AItem: TdxReportVisualItem;
begin
if CellAutoHeight then
begin
AMaxRowHeight := 0;
for I := 0 to Row.CellCount - 1 do
begin
ACell := Row.Cells[I];
for J := 0 to ACell.DataItemCount - 1 do
begin
AItem := ACell.DataItems[J];
if DoesItemParticipateInRowAutoHeightCalculation(AItem) then
begin
ACurrentItemHeight := AItem.MeasureContentHeight(Self.DC);
if AMaxRowHeight < ACurrentItemHeight then
AMaxRowHeight := ACurrentItemHeight;
end;
end;
end;
if RowHeight < AMaxRowHeight then
RowHeight := AMaxRowHeight;
end;
if HasPreview then
RowHeight := RowHeight + PreviewItem.Height;
end;
procedure TcxTreeListReportLinkNodeProducer.CreateChecks(AParent: TdxReportCell);
begin
FCheck := Formatter.GetNodeCheckClass(FNode).Create(AParent);
FCheck.BoundsRect := CheckRect;
InitializeCheck;
end;
procedure TcxTreeListReportLinkNodeProducer.CreateIcons(AParent: TdxReportCell);
begin
if Adapter.HasCheck(FNode) then CreateChecks(AParent);
if Adapter.HasStateImages(FNode) then CreateStateImages(AParent);
if Adapter.HasImages(FNode) then CreateImages(AParent);
end;
procedure TcxTreeListReportLinkNodeProducer.CreateImages(AParent: TdxReportCell);
begin
FImage := Formatter.GetNodeImageClass.Create(AParent);
FImage.BoundsRect := ImageRect;
InitializeImage(ImageIndentIndex);
end;
procedure TcxTreeListReportLinkNodeProducer.CreateIndents(AParent: TdxReportCell);
begin
inherited CreateIndents(AParent);
CreateIcons(AParent);
end;
procedure TcxTreeListReportLinkNodeProducer.CreatePreview(AParent: TdxReportCell);
begin
FPreviewItem := Formatter.GetPreviewClass(PreviewColumn, FNode).Create(AParent);
PreviewItem.Left := PreviewIndent;
// We have to set Width before because we use this value for PreviewHeight calculation
PreviewItem.Width := RowWidth - PreviewItem.Left;
Formatter.DoInitializePreview(FPreviewItem, PreviewColumn, FNode); // v3.1 because cxRichEdit
PreviewItem.Height := PreviewHeight;
PreviewItem.AdjustContent(Formatter.DC); // v3.1
end;
procedure TcxTreeListReportLinkNodeProducer.CreateRow;
begin
inherited CreateRow;
if HasPreview then CreatePreview(Row);
end;
procedure TcxTreeListReportLinkNodeProducer.CreateStateImages(AParent: TdxReportCell);
begin
FStateImage := Formatter.GetNodeStateImageClass.Create(AParent);
FStateImage.BoundsRect := StateImageRect;
InitializeStateImage(StateImageIndentIndex);
end;
function TcxTreeListReportLinkNodeProducer.DoesItemParticipateInRowAutoHeightCalculation(
AnItem: TdxReportVisualItem): Boolean;
var
AColumn: TcxTreeListColumn;
AProperties: TcxCustomEditProperties;
begin
Result := AnItem <> FPreviewItem;
if Result and not IsItemIndent(AnItem) and IsDelphiObject(AnItem.Data) then
begin
AColumn := TcxTreeListColumn(AnItem.Data);
AProperties := Adapter.GetProperties(AColumn, FNode);
Result := dxPScxCommon.dxPSDataMaps.DoesItemParticipateInAutoHeightCalculation(AProperties);
end;
end;
procedure TcxTreeListReportLinkNodeProducer.FixupRowDataHeight;
var
ANewHeight, I, J: Integer;
AItem: TdxReportVisualItem;
ACell: TdxReportCell;
begin
ANewHeight := RowHeight;
if PreviewItem <> nil then
begin
Dec(ANewHeight, PreviewItem.Height);
if PreviewPlace = tlppTop then
PreviewItem.Top := 0
else
PreviewItem.Top := ANewHeight;
end;
for I := 0 to Row.DataItemCount - 1 do
begin
if Row.DataItems[I] <> PreviewItem then
begin
Row.DataItems[I].Height := ANewHeight;
if HasPreview and (PreviewPlace = tlppTop) then
Row.DataItems[I].Top := Row.DataItems[I].Top + PreviewItem.Height;
end;
end;
for I := 0 to Row.CellCount - 1 do
begin
ACell := Row.Cells[I];
if HasPreview and (PreviewPlace = tlppTop) then
ACell.Top := ACell.Top + PreviewItem.Height;
if CellAutoHeight then
begin
ACell.Height := ANewHeight;
for J := 0 to ACell.DataItemCount - 1 do
begin
AItem := ACell.DataItems[J];
AItem.Height := ANewHeight;
end;
end;
end;
end;
procedure TcxTreeListReportLinkNodeProducer.InitializeBandedDataItem(AItem: TAbstractdxReportCellData);
begin
inherited InitializeBandedDataItem(AItem);
Formatter.DoInitializeNodeItem(AItem, TcxTreeListColumnPlace(AItem.Data).Column, FNode, False);
Formatter.DoReportLinkInitializeNodeItem(AItem, TcxTreeListColumnPlace(AItem.Data).Column, FNode);
end;
procedure TcxTreeListReportLinkNodeProducer.InitializeBandedRow(ARow: TdxReportCell);
begin
inherited InitializeBandedRow(ARow);
Formatter.DoInitializeNodeBandedRow(ARow);
end;
procedure TcxTreeListReportLinkNodeProducer.InitializeCheck;
begin
Formatter.DoInitializeNodeCheck(FCheck, FNode, CheckIndentIndex);
end;
procedure TcxTreeListReportLinkNodeProducer.InitializeImage(AnIndex: Integer);
begin
Formatter.DoInitializeNodeImage(Image, FNode, AnIndex);
end;
procedure TcxTreeListReportLinkNodeProducer.InitializeIndent(AnIndent: TdxReportCellExpandButton;
AnIndex: Integer);
begin
Formatter.DoInitializeNodeIndent(AnIndent, AnIndex, IndentCount, FNode);
Formatter.DoReportLinkInitializeNodeIndent(AnIndent, AnIndex, IndentCount, FNode);
end;
procedure TcxTreeListReportLinkNodeProducer.InitializeRow;
begin
inherited;
Formatter.DoInitializeNodeRow(Row, FNode);
end;
procedure TcxTreeListReportLinkNodeProducer.InitializeStateImage(AnIndex: Integer);
begin
Formatter.DoInitializeNodeStateImage(StateImage, FNode, AnIndex);
Formatter.DoReportLinkInitializeNodeStateImage(StateImage, FNode, AnIndex);
end;
function TcxTreeListReportLinkNodeProducer.IsItemIndent(AnItem: TdxReportVisualItem): Boolean;
begin
Result := FIndents.IndexOf(AnItem) <> -1;
end;
function TcxTreeListReportLinkNodeProducer.GetAutoHeight: Boolean;
begin
Result := CellAutoHeight or HasPreview;
end;
function TcxTreeListReportLinkNodeProducer.GetBandedDataItemBounds(AItem: TAbstractdxReportCellData): TRect;
var
AColumnPlace: TcxTreeListColumnPlace;
begin
AColumnPlace := TcxTreeListColumnPlace(AItem.Data);
Result := cxRectOffset(AColumnPlace.CellBounds[FNode], -AItem.Parent.Left, 0);
end;
function TcxTreeListReportLinkNodeProducer.GetBandedDataItemClass(
AColumnPlace: TcxTreeListColumnPlace): TdxReportCellDataClass;
begin
Result := Formatter.GetNodeItemClass(AColumnPlace.Column, FNode, False);
end;
function TcxTreeListReportLinkNodeProducer.GetBandedRowIndent: Integer;
begin
Result := PreviewIndent;
end;
function TcxTreeListReportLinkNodeProducer.GetCellAutoHeight: Boolean;
begin
Result := inherited GetAutoHeight and Adapter.CellAutoHeight;
end;
function TcxTreeListReportLinkNodeProducer.GetCheckRect: TRect;
begin
Result := MakeBounds(IndentWidth * IndentCount, 0, Adapter.GetCheckWidth(FNode), RowHeight);
end;
function TcxTreeListReportLinkNodeProducer.GetHasPreview: Boolean;
begin
Result := Formatter.HasPreview;
end;
function TcxTreeListReportLinkNodeProducer.GetImageRect: TRect;
begin
Result := MakeBounds(IndentWidth * IndentCount, 0, Adapter.GetImagesWidth(FNode), RowHeight);
OffsetRect(Result, Adapter.GetStateImagesWidth(FNode) + Adapter.GetCheckWidth(FNode), 0);
end;
function TcxTreeListReportLinkNodeProducer.GetIndentCount: Integer;
begin
Result := Formatter.IndentCounts[FNode];
end;
function TcxTreeListReportLinkNodeProducer.GetLineCount: Integer;
begin
Result := Adapter.DetailsLineCount;
end;
function TcxTreeListReportLinkNodeProducer.GetLineHeight: Integer;
begin
Result := Formatter.DetailsLineHeight;
end;
function TcxTreeListReportLinkNodeProducer.GetPreviewHeight: Integer;
begin
Result := PreviewLineCount * PreviewLineHeight;
if not (Formatter.PreviewAutoHeight and (Formatter.PreviewMaxLineCount = 0)) then
Inc(Result, 2 * dxTextSpace);
end;
function TcxTreeListReportLinkNodeProducer.GetPreviewIndent: Integer;
begin
Result := Formatter.GetNodeIndent(FNode);
end;
function TcxTreeListReportLinkNodeProducer.GetPreviewLineCount: Integer;
begin
if FPreviewItem <> nil then
if not Formatter.PreviewAutoHeight then
begin
Result := PreviewItem.CalculateLineCount(Formatter.DC);
if Result <> Formatter.PreviewMaxLineCount then
Result := Formatter.PreviewMaxLineCount;
end
else
Result := 1
else
Result := 0;
end;
function TcxTreeListReportLinkNodeProducer.GetPreviewLineHeight: Integer;
var
LineHeight: Integer;
begin
if FPreviewItem <> nil then
if Formatter.PreviewAutoHeight then
begin
Result := PreviewItem.MeasureContentHeight(Formatter.DC);
if Formatter.PreviewMaxLineCount <> 0 then
begin
LineHeight := PreviewItem.MeasureFontHeight(Formatter.DC) - 2 * dxTextSpace;
if Result > LineHeight * Formatter.PreviewMaxLineCount then
Result := LineHeight * Formatter.PreviewMaxLineCount;
end;
end
else
Result := PreviewItem.MeasureFontHeight(Formatter.DC) - 2 * dxTextSpace
else
Result := 0;
end;
function TcxTreeListReportLinkNodeProducer.GetStateImageRect: TRect;
begin
Result := MakeBounds(IndentWidth * IndentCount + Adapter.GetCheckWidth(FNode), 0,
Adapter.GetStateImagesWidth(FNode), RowHeight);
end;
function TcxTreeListReportLinkNodeProducer.GetCheckIndentIndex: Integer;
begin
Result := IndentCount;
end;
function TcxTreeListReportLinkNodeProducer.GetImageIndentIndex: Integer;
begin
Result := StateImageIndentIndex;
if Adapter.HasStateImages(FNode) then
Inc(Result);
end;
function TcxTreeListReportLinkNodeProducer.GetPreviewColumn: TcxTreeListColumn;
begin
Result := Adapter.PreviewColumn;
end;
function TcxTreeListReportLinkNodeProducer.GetPreviewPlace: TcxTreeListPreviewPlace;
begin
Result := Adapter.PreviewPlace;
end;
function TcxTreeListReportLinkNodeProducer.GetStateImageIndentIndex: Integer;
begin
Result := CheckIndentIndex;
if Adapter.HasCheck(FNode) then
Inc(Result);
end;
{ TcxTreeListReportLinkCategorizedNodeProducer }
procedure TcxTreeListReportLinkCategorizedNodeProducer.CreateBandedRows(AParent: TdxReportCell);
var
AItem: TAbstractdxReportCellData;
begin
AItem := Formatter.GetNodeItemClass(Adapter.CategorizedColumn, FNode, False).Create(Row);
AItem.BoundsRect := MakeRect(PreviewIndent, 0, RowWidth, RowHeight);
Formatter.DoInitializeNodeItem(AItem, Adapter.CategorizedColumn, FNode, False);
Formatter.DoReportLinkInitializeNodeItem(AItem, Adapter.CategorizedColumn, FNode);
end;
{ TcxTreeListNodeHelper }
constructor TcxTreeListNodeHelper.Create(AnAdapter: TcxTreeListAdapter);
begin
inherited Create;
FAdapter := AnAdapter;
end;
class function TcxTreeListNodeHelper.PairClass: TClass;
begin
Result := NodeClass;
end;
class function TcxTreeListNodeHelper.ProducerClass: TcxTreeListReportLinkNodeProducerClass;
begin
Result := TcxTreeListReportLinkNodeProducer;
end;
class procedure TcxTreeListNodeHelper.Register;
begin
cxTreeListNodeHelperFactory.Register(Self);
end;
class procedure TcxTreeListNodeHelper.Unregister;
begin
cxTreeListNodeHelperFactory.Unregister(Self);
end;
function TcxTreeListNodeHelper.Adapter: TcxTreeListAdapter;
begin
Result := FAdapter;
end;
function TcxTreeListNodeHelper.GetHasSelectedChildren: Boolean;
var
SaveNode: TcxTreeListNode;
I: Integer;
begin
Result := True;
SaveNode := Node;
try
with Node do
for I := 0 to Count - 1 do
begin
Node := Items[I];
if Node.Selected or Adapter.Helpers[Node].HasSelectedChildren then Exit;
end;
finally
Node := SaveNode;
end;
Result := False;
end;
function TcxTreeListNodeHelper.GetHasSelectedParents: Boolean;
var
Parent: TcxTreeListNode;
begin
Parent := Node;
while (Parent <> nil) and not Parent.Selected do
Parent := Parent.Parent;
Result := Parent <> nil;
end;
class function TcxTreeListNodeHelper.NodeClass: TcxTreeListNodeClass;
begin
Result := TcxTreeListNode;
end;
{ TcxTreeListNodeHelperCache }
constructor TcxTreeListNodeHelperCache.Create(AnAdapter: TcxTreeListAdapter);
begin
inherited Create;
FAdapter := AnAdapter;
end;
function TcxTreeListNodeHelperCache.IndexOf(Node: TcxTreeListNode): Integer;
begin
for Result := 0 to Count - 1 do
if Items[Result].NodeClass = Node.ClassType then Exit;
Result := Add(cxTreeListNodeHelperFactory.HelperClasses[Node].Create(Adapter));
end;
function TcxTreeListNodeHelperCache.GetHelper(Node: TcxTreeListNode): TcxTreeListNodeHelper;
begin
Result := Items[IndexOf(Node)];
Result.Node := Node;
end;
function TcxTreeListNodeHelperCache.GetItem(Index: Integer): TcxTreeListNodeHelper;
begin
Result := TcxTreeListNodeHelper(inherited Items[Index]);
end;
{ TcxTreeListReportLinkProducerCache }
constructor TcxTreeListReportLinkProducerCache.Create(ABuilder: TcxTreeListReportLinkBuilder);
begin
inherited Create;
FBuilder := ABuilder;
end;
function TcxTreeListReportLinkProducerCache.IndexOf(AProducerClass: TcxTreeListReportLinkRowProducerClass): Integer;
begin
for Result := 0 to Count - 1 do
if Items[Result].ClassType = AProducerClass then Exit;
Result := Add(AProducerClass.Create(Builder));
end;
function TcxTreeListReportLinkProducerCache.GetProducer(ProducerClass: TcxTreeListReportLinkRowProducerClass): TcxTreeListReportLinkRowProducer;
begin
Result := Items[IndexOf(ProducerClass)];
end;
function TcxTreeListReportLinkProducerCache.GetItem(Index: Integer): TcxTreeListReportLinkRowProducer;
begin
Result := TcxTreeListReportLinkRowProducer(inherited Items[Index]);
end;
{ TcxTreeListReportLinkBuilder }
constructor TcxTreeListReportLinkBuilder.Create(AReportLink: TcxTreeListCustomReportLink);
begin
inherited Create;
FReportLink := AReportLink;
FAdapter := AdapterClass.Create(Self);
FFormatter := FormatterClass.Create(Self);
FProducerCache := TcxTreeListReportLinkProducerCache.Create(Self);
FReportRows := TList.Create;
end;
destructor TcxTreeListReportLinkBuilder.Destroy;
begin
FreeAndNil(FReportRows);
FreeAndNil(FProducerCache);
FreeAndNil(FFormatter);
FreeAndNil(FAdapter);
inherited;
end;
procedure TcxTreeListReportLinkBuilder.Build;
begin
BeforeBuilding;
try
DoBuild;
finally
AfterBuilding;
end;
end;
procedure TcxTreeListReportLinkBuilder.Progress(const APercentDone: Double);
begin
ReportLink.DoProgress(APercentDone);
end;
function TcxTreeListReportLinkBuilder.Adapter: TcxTreeListAdapter;
begin
Result := FAdapter;
end;
class function TcxTreeListReportLinkBuilder.AdapterClass: TcxTreeListAdapterClass;
begin
Result := TcxTreeListAdapter;
end;
function TcxTreeListReportLinkBuilder.Formatter: TcxTreeListReportLinkFormatter;
begin
Result := FFormatter;
end;
class function TcxTreeListReportLinkBuilder.FormatterClass: TcxTreeListReportLinkFormatterClass;
begin
Result := TcxTreeListReportLinkFormatter;
end;
procedure TcxTreeListReportLinkBuilder.AddReportRow(ARow: TdxReportCell);
begin
if ARow.Parent = ReportLink.ReportCells.Cells then
FReportRows.Add(ARow);
end;
procedure TcxTreeListReportLinkBuilder.AfterBuilding;
begin
Formatter.AfterBuilding;
end;
procedure TcxTreeListReportLinkBuilder.BeforeBuilding;
begin
Formatter.BeforeBuilding;
end;
procedure TcxTreeListReportLinkBuilder.CreateBands;
begin
AddReportRow(GetBandsProducer.Produce(ReportLink.HostInfoServices.BandHeadersHostInfo));
end;
function TcxTreeListReportLinkBuilder.GetBandsProducer: TcxTreeListReportLinkBandsProducer;
begin
Result := ProducerCache[GetBandsProducerClass] as TcxTreeListReportLinkBandsProducer;
end;
function TcxTreeListReportLinkBuilder.GetBandsProducerClass: TcxTreeListReportLinkBandsProducerClass;
begin
Result := TcxTreeListReportLinkBandsProducer;
end;
procedure TcxTreeListReportLinkBuilder.CreateFooters(AHostInfo: TcxTreeListAttributeHostInfo;
AAttachedNode, ADataNode: TcxTreeListNode);
begin
AddReportRow(GetFootersProducer.Produce(AHostInfo, AAttachedNode, ADataNode));
end;
function TcxTreeListReportLinkBuilder.GetFootersProducer: TcxTreeListReportLinkFootersProducer;
begin
Result := ProducerCache[GetFootersProducerClass] as TcxTreeListReportLinkFootersProducer;
end;
function TcxTreeListReportLinkBuilder.GetFootersProducerClass: TcxTreeListReportLinkFootersProducerClass;
begin
Result := TcxTreeListReportLinkFootersProducer;
end;
procedure TcxTreeListReportLinkBuilder.CreateHeaders;
begin
AddReportRow(GetHeadersProducer.Produce(ReportLink.HostInfoServices.HeadersHostInfo));
end;
function TcxTreeListReportLinkBuilder.GetHeadersProducer: TcxTreeListReportLinkHeadersProducer;
begin
Result := ProducerCache[GetHeadersProducerClass] as TcxTreeListReportLinkHeadersProducer;
end;
function TcxTreeListReportLinkBuilder.GetHeadersProducerClass: TcxTreeListReportLinkHeadersProducerClass;
begin
Result := TcxTreeListReportLinkHeadersProducer;
end;
procedure TcxTreeListReportLinkBuilder.CreateNode(ANode: TcxTreeListNode);
begin
AddReportRow(GetNodeProducer(ANode).Produce(ReportLink.HostInfoServices.PageDetailsHostInfo, ANode));
end;
procedure TcxTreeListReportLinkBuilder.CreateNodes;
var
AHasNodeSeparator, AHasGroupFooters: Boolean;
I: Integer;
ANode: TcxTreeListNode;
ASummaryNodes: TObjectStack;
begin
AHasNodeSeparator := Formatter.HasNodeSeparator;
AHasGroupFooters := Adapter.OptionsView.GroupFooters <> tlgfInvisible;
ASummaryNodes := TObjectStack.Create;
try
for I := 0 to Formatter.NodeCount - 1 do
begin
ANode := Formatter.Nodes[I];
CreateNode(ANode);
if AHasGroupFooters then
begin
if Adapter.HasNodeSummary(ANode) then
ASummaryNodes.Push(ANode);
while (ASummaryNodes.Count > 0) and
Adapter.HasNodeAttachedFooter(ANode, TcxTreeListNode(ASummaryNodes.Peek)) do
CreateFooters(ReportLink.HostInfoServices.PageDetailsHostInfo, ANode,
TcxTreeListNode(ASummaryNodes.Pop));
end;
if AHasNodeSeparator and (I < Formatter.NodeCount - 1) then
CreateNodeSeparator(ANode);
Progress(100 * (I + 1) / Formatter.NodeCount);
if IsAborted then Break;
end;
finally
ASummaryNodes.Free;
end;
end;
function TcxTreeListReportLinkBuilder.GetNodeProducer(ANode: TcxTreeListNode): TcxTreeListReportLinkNodeProducer;
begin
Result := ProducerCache[GetNodeProducerClass(ANode)] as TcxTreeListReportLinkNodeProducer;
end;
function TcxTreeListReportLinkBuilder.GetNodeProducerClass(ANode: TcxTreeListNode): TcxTreeListReportLinkNodeProducerClass;
begin
if Adapter.IsGroupNode(ANode) then
Result := TcxTreeListReportLinkCategorizedNodeProducer
else
Result := Adapter.Helpers[ANode].ProducerClass;
end;
procedure TcxTreeListReportLinkBuilder.CreateNodeSeparator(ANode: TcxTreeListNode);
begin
AddReportRow(GetNodeSeparatorProducer.Produce(ReportLink.HostInfoServices.PageDetailsHostInfo));
end;
function TcxTreeListReportLinkBuilder.GetNodeSeparatorProducer: TcxTreeListReportLinkNodeSeparatorProducer;
begin
Result := ProducerCache[GetNodeSeparatorProducerClass] as TcxTreeListReportLinkNodeSeparatorProducer;
end;
function TcxTreeListReportLinkBuilder.GetNodeSeparatorProducerClass: TcxTreeListReportLinkNodeSeparatorProducerClass;
begin
Result := TcxTreeListReportLinkNodeSeparatorProducer;
end;
procedure TcxTreeListReportLinkBuilder.DoBuild;
begin
if Formatter.ShowBandHeaders then CreateBands;
if Formatter.ShowHeaders then CreateHeaders;
CreateNodes;
if not IsAborted and Formatter.ShowFooters then
CreateFooters(ReportLink.HostInfoServices.FootersHostInfo, nil, TreeList.Root);
end;
function TcxTreeListReportLinkBuilder.IsAborted: Boolean;
begin
Result := ReportLink.AbortBuilding;
end;
function TcxTreeListReportLinkBuilder.GetHost: TdxReportCell;
begin
Result := ReportLink.ReportCells.Cells;
end;
function TcxTreeListReportLinkBuilder.GetReportCells: TdxReportCells;
begin
Result := ReportLink.ReportCells;
end;
function TcxTreeListReportLinkBuilder.GetReportRow(Index: Integer): TdxReportCell;
begin
Result := TdxReportCell(FReportRows[Index]);
end;
function TcxTreeListReportLinkBuilder.GetReportRowCount: Integer;
begin
Result := FReportRows.Count;
end;
function TcxTreeListReportLinkBuilder.GetTreeList: TcxCustomTreeList;
begin
Result := ReportLink.TreeList;
end;
{ TcxTreeListReportLinkBuilderHandler }
constructor TcxTreeListReportLinkBuilderHandler.Create(ABuilder: TcxTreeListReportLinkBuilder);
begin
inherited Create;
FBuilder := ABuilder;
end;
function TcxTreeListReportLinkBuilderHandler.Builder: TcxTreeListReportLinkBuilder;
begin
Result := FBuilder;
end;
function TcxTreeListReportLinkBuilderHandler.GetReportLink: TcxTreeListCustomReportLink;
begin
Result := Builder.ReportLink;
end;
{ TcxTreeListAdapter }
constructor TcxTreeListAdapter.Create(ABuilder: TcxTreeListReportLinkBuilder);
begin
inherited;
FHelperCache := TcxTreeListNodeHelperCache.Create(Self);
FDetailsLineCount := -1;
FFooterLineCount := -1;
FMultiRows := False;
end;
destructor TcxTreeListAdapter.Destroy;
begin
FreeAndNil(FHelperCache);
inherited;
end;
function TcxTreeListAdapter.CalculateDetailsLineCount: Integer;
var
I, J, V: Integer;
ABandRows: TcxTreeListBandRows;
begin
Result := 0;
for I := 0 to BottomBandCount - 1 do
begin
ABandRows := BottomBands[I].BandRows;
FMultiRows := FMultiRows or (ABandRows.VisibleItemCount > 1);
V := 0;
for J := 0 to ABandRows.VisibleItemCount - 1 do
Inc(V, ABandRows[J].LineCount);
if Result < V then Result := V;
end;
end;
procedure TcxTreeListAdapter.Calculate;
begin
FDetailsLineCount := CalculateDetailsLineCount;
if not FMultiRows then
begin
FFooterLineCount := Max(1, TreeList.Summary.FooterSummaryRowCount);
FGroupFooterLineCount := Max(1, TreeList.Summary.GroupFooterSummaryRowCount);
end
else
begin
FFooterLineCount := Max(1, TreeList.Bands.ColumnsLineCount);
FGroupFooterLineCount := FFooterLineCount;
end;
end;
class function TcxTreeListAdapter.GetProperties(AColumn: TcxTreeListColumn;
ANode: TcxTreeListNode): TcxCustomEditProperties;
begin
Result := TreeListColumn_DoGetEditProperties(AColumn, ANode);
if Result = nil then
Result := GetRepositoryItem(AColumn, ANode).Properties;
end;
class function TcxTreeListAdapter.GetPropertiesClass(AColumn: TcxTreeListColumn;
ANode: TcxTreeListNode): TcxCustomEditPropertiesClass;
begin
Result := TcxCustomEditPropertiesClass(GetProperties(AColumn, ANode).ClassType);
end;
class function TcxTreeListAdapter.GetRepositoryItem(AColumn: TcxTreeListColumn;
ANode: TcxTreeListNode): TcxEditRepositoryItem;
begin
Result := AColumn.RepositoryItem;
end;
function TcxTreeListAdapter.GetBackgroundViewParams: TcxViewParams;
begin
Result := Styles.GetBackgroundParams;
end;
function TcxTreeListAdapter.GetBandBackgroundViewParams: TcxViewParams;
begin
Result := Styles.GetBandBackgroundParams(nil);
end;
function TcxTreeListAdapter.GetBandHeaderViewParams(ABand: TcxTreeListBand): TcxViewParams;
begin
Result := Styles.GetBandHeaderParams(ABand);
if ABand = nil then
Result.Color := LookAndFeelPainter.DefaultHeaderBackgroundColor
end;
function TcxTreeListAdapter.GetContentViewParams(ANode: TcxTreeListNode;
AColumn: TcxTreeListColumn): TcxViewParams;
begin
Result := Styles.GetContentParams(ANode, AColumn);
// v3.2
if Result.Color = clWindow then
Result.Color := dxPSCore.dxDefaultContentColor;
end;
function TcxTreeListAdapter.GetColumnFooterViewParams(AColumn: TcxTreeListColumn): TcxViewParams;
begin
Result := Styles.GetColumnFooterParams(AColumn, nil);
Result.Color := LookAndFeelPainter.DefaultHeaderColor
end;
function TcxTreeListAdapter.GetColumnHeaderViewParams(AColumn: TcxTreeListColumn): TcxViewParams;
begin
if AColumn = nil then
begin
// FillChar(Result, SizeOf(Result), 0);
// Result.Color := LookAndFeelPainter.DefaultHeaderBackgroundColor;
Result := Styles.GetBandBackgroundParams(Bands[0])
end
else
Result := Styles.GetColumnHeaderParams(AColumn);
end;
function TcxTreeListAdapter.GetIndentViewParams(ANode: TcxTreeListNode;
AnIndent: Integer): TcxViewParams;
begin
Result := Styles.GetIndentParams(ANode, AnIndent);
// v3.2
if Result.Color = clWindow then
Result.Color := dxPSCore.dxDefaultContentColor;
end;
function TcxTreeListAdapter.GetPreviewViewParams(ANode: TcxTreeListNode;
AColumn: TcxTreeListColumn): TcxViewParams;
begin
Result := Styles.GetPreviewParams(ANode);
// v3.2
if Result.Color = clWindow then
Result.Color := dxPSCore.dxDefaultContentColor;
end;
function TcxTreeListAdapter.GetFooterRowViewParams: TcxViewParams;
begin
Result := Styles.GetFooterParams;
end;
function TcxTreeListAdapter.GetSelectionViewParams: TcxViewParams;
begin
FillChar(Result, SizeOf(Result), 0);
with Styles.Selection do
begin
Result.Bitmap := nil;
Result.Color := Color;
Result.Font := Font;
Result.TextColor := TextColor;
end;
end;
function TcxTreeListAdapter.HasSelectionStyle: Boolean;
begin
Result := Styles.Selection <> nil;
end;
function TcxTreeListAdapter.GetBackgroundBitmap(Index: Integer): TBitmap;
begin
Result := Styles.GetBitmap(Index);
end;
function TcxTreeListAdapter.HasBackgroundBitmap(Index: Integer): Boolean;
begin
Result := GetBackgroundBitmap(Index) <> nil;
end;
function TcxTreeListAdapter.GetCheckWidth(ANode: TcxTreeListNode): Integer;
begin
if HasCheck(ANode) then
Result := DefaultIndentWidth
else
Result := 0;
end;
function TcxTreeListAdapter.GetImagesHeight(ANode: TcxTreeListNode): Integer;
begin
if HasImages(ANode) then
Result := 1 + Images.Height + 1
else
Result := 0;
end;
function TcxTreeListAdapter.GetImagesWidth(ANode: TcxTreeListNode): Integer;
begin
if HasImages(ANode) then
Result := 1 + Images.Width + 1
else
Result := 0;
end;
function TcxTreeListAdapter.GetStateImagesHeight(ANode: TcxTreeListNode): Integer;
begin
if HasStateImages(ANode) then
Result := 1 + StateImages.Height + 1
else
Result := 0;
end;
function TcxTreeListAdapter.GetStateImagesWidth(ANode: TcxTreeListNode): Integer;
begin
if HasStateImages(ANode) then
Result := 1 + StateImages.Width + 1
else
Result := 0;
end;
function TcxTreeListAdapter.HasCheck(ANode: TcxTreeListNode): Boolean;
begin
Result := TreeList.OptionsView.CheckGroups and (ANode.Parent <> nil) and
(ANode.Parent.CheckGroupType <> ncgNone);
end;
function TcxTreeListAdapter.HasImages(ANode: TcxTreeListNode): Boolean;
begin
Result := Images <> nil;
if Result and (ANode <> nil) then
Result := (ANode.ImageIndex > -1) and (ANode.ImageIndex < Images.Count);
end;
function TcxTreeListAdapter.HasStateImages(ANode: TcxTreeListNode): Boolean;
begin
Result := StateImages <> nil;
if Result and (ANode <> nil) then
Result := (ANode.StateIndex > -1) and (ANode.StateIndex < StateImages.Count);
end;
function TcxTreeListAdapter.IsGroupNode(ANode: TcxTreeListNode): Boolean;
begin
Result := CustomTreeList_DoIsGroupNode(TreeList, ANode);
end;
function TcxTreeListAdapter.HasNodeAttachedFooter(ANode, ASummaryNode: TcxTreeListNode): Boolean;
begin
Result := not ANode.Expanded and ((ANode = ASummaryNode) or
(ANode = ASummaryNode.GetLastChildVisible) or
ANode.HasAsParent(ASummaryNode.GetLastChildVisible));
end;
function TcxTreeListAdapter.HasNodeSummary(ANode: TcxTreeListNode): Boolean;
begin
Result := ANode.HasChildren and ((OptionsView.GroupFooters = tlgfAlwaysVisible) or
(OptionsView.GroupFooters = tlgfVisibleWhenExpanded) and ANode.Expanded);
end;
function TcxTreeListAdapter.GetAutoWidth: Boolean;
begin
Result := OptionsView.ColumnAutoWidth;
end;
function TcxTreeListAdapter.GetBand(Index: Integer): TcxTreeListBand;
begin
Result := CustomTreeList_GetVisibleBand(TreeList, Index);
end;
function TcxTreeListAdapter.GetBandCount: Integer;
begin
Result := CustomTreeList_GetVisibleBandCount(TreeList);
end;
function TcxTreeListAdapter.GetBottomBand(Index: Integer): TcxTreeListBand;
begin
Result := TreeList.Bands.BottomItems[Index];
end;
function TcxTreeListAdapter.GetBottomBandCount: Integer;
begin
Result := TreeList.Bands.BottomItemCount;
end;
function TcxTreeListAdapter.GetCanUseLookAndFeelColors: Boolean;
begin
Result := CustomTreeList_GetLookAndFeel(TreeList).NativeStyle and
dxThemeManager.AreVisualStylesAvailable;
end;
function TcxTreeListAdapter.GetCategorizedColumn: TcxTreeListColumn;
begin
Result := OptionsView.GetCategorizedColumn;
end;
function TcxTreeListAdapter.GetColumnCount: Integer;
begin
Result := CustomTreeList_GetVisibleColumnCount(TreeList);
end;
function TcxTreeListAdapter.GetCellAutoHeight: Boolean;
begin
Result := OptionsView.CellAutoHeight and (DetailsLineCount = 1);
end;
function TcxTreeListAdapter.GetCellEndEllipsis: Boolean;
begin
Result := OptionsView.CellEndEllipsis;
end;
function TcxTreeListAdapter.GetCellMultiline: Boolean;
begin
Result := OptionsView.CellAutoHeight and (DetailsLineCount = 1);
end;
function TcxTreeListAdapter.GetColumn(Index: Integer): TcxTreeListColumn;
begin
Result := CustomTreeList_GetVisibleColumn(TreeList, Index);
end;
function TcxTreeListAdapter.GetDefaultRowHeight: Integer;
begin
Result := TreeList.DefaultRowHeight;
end;
function TcxTreeListAdapter.GetFooterLineCount(ANode: TcxTreeListNode): Integer;
begin
if ANode = TreeList.Root then
Result := FFooterLineCount
else
Result := FGroupFooterLineCount;
end;
function TcxTreeListAdapter.GetGridLines: TcxTreeListGridLines;
begin
Result := OptionsView.GridLines;
end;
function TcxTreeListAdapter.GetGridLinesColor: TColor;
begin
Result := OptionsView.GridLineColor;
if Result = clDefault then
Result := LookAndFeelPainter.DefaultGridLineColor;
end;
function TcxTreeListAdapter.GetHasPreview: Boolean;
begin
Result := TreeList.Preview.Active;
end;
function TcxTreeListAdapter.GetHeaderAutoHeight: Boolean;
begin
Result := (DetailsLineCount = 1) and OptionsView.CellAutoHeight;
end;
function TcxTreeListAdapter.GetHelper(Node: TcxTreeListNode): TcxTreeListNodeHelper;
begin
Result := FHelperCache.Helpers[Node];
end;
function TcxTreeListAdapter.GetIndentWidth: Integer;
begin
Result := GetStateImagesWidth(nil);
if GetImagesWidth(nil) > GetStateImagesWidth(nil) then
Result := GetImagesWidth(nil);
if Result = 0 then
Result := DefaultIndentWidth;
end;
function TcxTreeListAdapter.GetIsDefaultRowHeightAssigned: Boolean;
begin
Result := DefaultRowHeight <> 0;
end;
function TcxTreeListAdapter.GetImages: TCustomImageList;
begin
Result := CustomTreeList_GetImages(TreeList);
end;
function TcxTreeListAdapter.GetIsNodeColorUsedForIndents: Boolean;
begin
Result := OptionsView.UseNodeColorForIndent;
end;
function TcxTreeListAdapter.GetLookAndFeelKind: TcxLookAndFeelKind;
begin
Result := CustomTreeList_GetLookAndFeel(TreeList).Kind;
end;
function TcxTreeListAdapter.GetLookAndFeelPainter: TcxCustomLookAndFeelPainterClass;
begin
Result := CustomTreeList_GetLookAndFeelPainter(TreeList);
end;
function TcxTreeListAdapter.GetMultiSelection: Boolean;
begin
Result := CustomTreeList_GetOptionsSelection(TreeList).MultiSelect;
end;
function TcxTreeListAdapter.GetNode(Index: Integer): TcxTreeListNode;
begin
Result := TreeList.Root[Index];
end;
function TcxTreeListAdapter.GetNodeCount: Integer;
begin
Result := TreeList.Root.Count;
end;
function TcxTreeListAdapter.GetOptionsView: TcxTreeListOptionsView;
begin
Result := CustomTreeList_GetOptionsView(TreeList);
end;
function TcxTreeListAdapter.GetPaintStyle: TcxTreeListPaintStyle;
begin
Result := OptionsView.PaintStyle;
end;
function TcxTreeListAdapter.GetPreviewColumn: TcxTreeListColumn;
begin
Result := CustomTreeList_GetPreview(TreeList).Column;
end;
function TcxTreeListAdapter.GetPreviewLeftIndent: Integer;
begin
Result := CustomTreeList_GetPreview(TreeList).LeftIndent;
end;
function TcxTreeListAdapter.GetPreviewPlace: TcxTreeListPreviewPlace;
begin
Result := CustomTreeList_GetPreview(TreeList).Place;
end;
function TcxTreeListAdapter.GetPreviewRightIndent: Integer;
begin
Result := CustomTreeList_GetPreview(TreeList).RightIndent;
end;
function TcxTreeListAdapter.GetRootBand(Index: Integer): TcxTreeListBand;
begin
Result := TreeList.Bands.VisibleRootItems[Index];
end;
function TcxTreeListAdapter.GetRootBandCount: Integer;
begin
Result := TreeList.Bands.visibleRootItemCount;
end;
function TcxTreeListAdapter.GetShowRoot: Boolean;
begin
Result := OptionsView.ShowRoot;
end;
function TcxTreeListAdapter.GetShowHorzGridLines: Boolean;
begin
Result := GridLines in [tlglHorz, tlglBoth];
end;
function TcxTreeListAdapter.GetShowTreeLines: Boolean;
begin
Result := OptionsView.TreeLineStyle <> tllsNone;
end;
function TcxTreeListAdapter.GetShowVertGridLines: Boolean;
begin
Result := GridLines in [tlglVert, tlglBoth];
end;
function TcxTreeListAdapter.GetStateImages: TCustomImageList;
begin
Result := CustomTreeList_GetStateImages(TreeList);
end;
function TcxTreeListAdapter.GetStyles: TcxTreeListStyles;
begin
Result := CustomTreeList_GetStyles(TreeList);
end;
function TcxTreeListAdapter.GetThemedBandHeaderItemColor: TColor;
begin
Result := LookAndFeelPainter.DefaultHeaderColor;
end;
function TcxTreeListAdapter.GetThemedBandHeaderItemTextColor: TColor;
begin
Result := LookAndFeelPainter.DefaultHeaderTextColor;
end;
function TcxTreeListAdapter.GetThemedFooterItemColor: TColor;
begin
Result := LookAndFeelPainter.DefaultFooterColor;
end;
function TcxTreeListAdapter.GetThemedFooterItemTextColor: TColor;
begin
Result := LookAndFeelPainter.DefaultFooterTextColor;
end;
function TcxTreeListAdapter.GetThemedHeaderItemColor: TColor;
begin
Result := LookAndFeelPainter.DefaultHeaderColor;
end;
function TcxTreeListAdapter.GetThemedHeaderItemTextColor: TColor;
begin
Result := LookAndFeelPainter.DefaultHeaderTextColor;
end;
function TcxTreeListAdapter.GetThemedHeaderRowColor: TColor;
begin
Result := LookAndFeelPainter.DefaultHeaderBackgroundColor;
end;
function TcxTreeListAdapter.GetTreeLinesColor: TColor;
begin
Result := OptionsView.TreeLineColor;
end;
function TcxTreeListAdapter.GetTreeLinesStyle: TcxTreeListTreeLineStyle;
begin
Result := OptionsView.TreeLineStyle;
end;
function TcxTreeListAdapter.GetTreeList: TcxCustomTreeList;
begin
Result := Builder.TreeList;
end;
function TcxTreeListAdapter.GetUseStylesForIndents: Boolean;
begin
Result := OptionsView.UseNodeColorForIndent;
end;
{ TcxTreeListCustomItemPlaceController }
constructor TcxTreeListCustomItemPlaceController.Create(
AFormatter: TcxTreeListReportLinkFormatter);
begin
inherited Create;
FFormatter := AFormatter;
FHeaderLineCount := -1;
FWidth := -1;
end;
procedure TcxTreeListCustomItemPlaceController.Calculate;
begin
end;
procedure TcxTreeListCustomItemPlaceController.Refresh;
begin
end;
function TcxTreeListCustomItemPlaceController.CalculateWidth: Integer;
begin
Result := 0;
end;
function TcxTreeListCustomItemPlaceController.CalculateHeaderLineCount: Integer;
begin
Result := 1;
end;
function TcxTreeListCustomItemPlaceController.GetItemByColumn(
Column: TcxTreeListColumn): TcxTreeListColumnPlace;
begin
Result := nil;
end;
procedure TcxTreeListCustomItemPlaceController.WidthChanged;
begin
end;
function TcxTreeListCustomItemPlaceController.GetAdapter: TcxTreeListAdapter;
begin
Result := Formatter.Adapter;
end;
function TcxTreeListCustomItemPlaceController.GetHeaderLineCount: Integer;
begin
if FHeaderLineCount = -1 then
FHeaderLineCount := CalculateHeaderLineCount;
Result := FHeaderLineCount;
end;
function TcxTreeListCustomItemPlaceController.GetWidth: Integer;
begin
if FWidth = -1 then
FWidth := CalculateWidth;
Result := FWidth;
end;
procedure TcxTreeListCustomItemPlaceController.SetWidth(Value: Integer);
begin
FWidth := Value;
WidthChanged;
end;
{ TcxTreeListColumnPlace }
constructor TcxTreeListColumnPlace.Create(
AController: TcxTreeListCustomBandPlace; AColumn: TcxTreeListColumn);
begin
inherited Create;
FController := AController;
FColumn := AColumn;
FLeftBound := -1;
FWidth := -1;
end;
procedure TcxTreeListColumnPlace.Calculate(ALeftBound: Integer);
begin
FLeftBound := ALeftBound;
end;
function TcxTreeListColumnPlace.CalculateLeftBound: Integer;
begin
Result := Controller.CalculateItemLeftBound(Self);
end;
function TcxTreeListColumnPlace.GetLineCount: Integer;
begin
Result := Column.Position.LineCount;
end;
function TcxTreeListColumnPlace.GetRowIndex: Integer;
begin
Result := Column.Position.Row.LineOffset;
end;
procedure TcxTreeListColumnPlace.InitAutoWidthItem(
AnItem: TcxAutoWidthItem);
begin
AnItem.Fixed := IsFixed;
AnItem.MinWidth := MinWidth;
AnItem.Width := Width;
end;
function TcxTreeListColumnPlace.GetAdapter: TcxTreeListAdapter;
begin
Result := Formatter.Adapter;
end;
function TcxTreeListColumnPlace.GetCellBounds(ANode: TcxTreeListNode): TRect;
var
ACellHeight: Integer;
AColumnAccess: TcxTreeListColumnAccess;
begin
ACellHeight := CellHeights[ANode];
Result := cxRectBounds(LeftBound, RowIndex * ACellHeight, Width, LineCount * ACellHeight);
AColumnAccess := TcxTreeListColumnAccess(Column);
if AColumnAccess.HasIndent then
Inc(Result.Left, Formatter.GetNodeIndent(ANode));
end;
function TcxTreeListColumnPlace.GetCellHeight(ANode: TcxTreeListNode): Integer;
begin
Result := Formatter.DetailsLineHeight;
end;
function TcxTreeListColumnPlace.GetFooterCellBounds(AIndex: Integer): TRect;
begin
Result := Bounds(LeftBound, (RowIndex + AIndex * LineCount) * FooterLineHeight,
Width, LineCount * FooterLineHeight);
InflateRect(Result, -FooterItemInflateHorz, -FooterItemInflateVert);
end;
function TcxTreeListColumnPlace.GetFooterLineHeight: Integer;
begin
Result := Formatter.FooterLineHeight;
end;
function TcxTreeListColumnPlace.GetFormatter: TcxTreeListReportLinkFormatter;
begin
Result := Controller.Formatter;
end;
function TcxTreeListColumnPlace.GetHeaderCellBounds: TRect;
begin
Result := cxRectBounds(LeftBound, RowIndex * HeaderLineHeight, Width,
LineCount * HeaderLineHeight);
end;
function TcxTreeListColumnPlace.GetHeaderLineHeight: Integer;
begin
Result := Formatter.HeaderLineHeight;
end;
function TcxTreeListColumnPlace.GetIndex: Integer;
begin
Result := Controller.IndexOf(Self);
end;
function TcxTreeListColumnPlace.GetIsFixed: Boolean;
var
AColumnAccess: TcxTreeListColumnAccess;
begin
AColumnAccess := TcxTreeListColumnAccess(Column);
Result := AColumnAccess.IsFixed;
end;
function TcxTreeListColumnPlace.GetLeftBound: Integer;
begin
if FLeftBound = -1 then
FLeftBound := CalculateLeftBound;
Result := FLeftBound;
end;
function TcxTreeListColumnPlace.GetMinWidth: Integer;
begin
Result := Column.MinWidth + Column.IndentWidth;
end;
function TcxTreeListColumnPlace.GetOriginalWidth: Integer;
begin
Result := Column.DisplayWidth;
end;
function TcxTreeListColumnPlace.GetWidth: Integer;
begin
Result := FWidth;
if Result = -1 then
Result := OriginalWidth;
end;
{ TcxTreeListCustomBandPlace }
constructor TcxTreeListCustomBandPlace.Create(
AController: TcxTreeListItemPlaceController;
AParent: TcxTreeListBandPlace; ABand: TcxTreeListBand);
begin
inherited Create(AController.Formatter);
FColumnIndexes := TList.Create;
FItems := TObjectList.Create;
FController := AController;
FParent := AParent;
FBand := ABand;
FHeight := -1;
FLeftBound := -1;
FMinWidth := -1;
FTopBound := -1;
end;
destructor TcxTreeListCustomBandPlace.Destroy;
begin
FreeAndNil(FItems);
FreeAndNil(FColumnIndexes);
inherited Destroy;
end;
procedure TcxTreeListCustomBandPlace.Calculate;
begin
if ItemsAutoWidth then CalculateItemsWidth;
end;
function TcxTreeListCustomBandPlace.IndexOf(
AnItem: TcxTreeListColumnPlace): Integer;
begin
Result := FItems.IndexOf(AnItem);
end;
function TcxTreeListCustomBandPlace.IndexOf(
AColumn: TcxTreeListColumn): Integer;
begin
for Result := 0 to ItemCount - 1 do
if Items[Result].Column = AColumn then
Exit;
Result := -1;
end;
procedure TcxTreeListCustomBandPlace.Refresh;
begin
FColumnIndexes.Clear;
FItems.Clear;
AddItems;
end;
function TcxTreeListCustomBandPlace.CalculateHeaderLineCount: Integer;
var
I: Integer;
begin
Result := 0;
with Band.BandRows do
for I := 0 to VisibleItemCount - 1 do
Inc(Result, VisibleItems[I].LineCount);
end;
function TcxTreeListCustomBandPlace.CalculateWidth: Integer;
function FixedSize: Boolean;
var
I: Integer;
begin
Result := False;
for I := 0 to Band.ColumnCount - 1 do
Result := Result or not Band.Columns[I].Options.Sizing;
end;
begin
if FixedSize then
Result := Max(Band.Width, InternalCalculateWidth)
else
begin
Result := Band.Width;
if Result = 0 then
Result := InternalCalculateWidth
end;
if Result = 0 then
Result := cxTreeListDefWidth;
if Result < InternalCalculateMinWidth then
Result := InternalCalculateMinWidth;
end;
function TcxTreeListCustomBandPlace.GetItemByColumn(
Column: TcxTreeListColumn): TcxTreeListColumnPlace;
var
Index: Integer;
begin
Index := ColumnIndexes[Column];
//Index := IndexOf(Column);
if Index <> -1 then // might be -1 when we are in loading stage (Building report while loading form)
Result := Items[Index]
else
Result := nil;
end;
procedure TcxTreeListCustomBandPlace.AddItems;
var
I: Integer;
begin
for I := 0 to Formatter.ColumnCount - 1 do
CreateItem(Formatter.Columns[I]);
end;
procedure TcxTreeListCustomBandPlace.AssignWidth;
begin
Width := Width;
end;
function TcxTreeListCustomBandPlace.CalculateHeight: Integer;
begin
Result := Controller.CalculateItemHeight(Self);
end;
function TcxTreeListCustomBandPlace.CalculateItemLeftBound(
AnItem: TcxTreeListColumnPlace): Integer;
var
I: Integer;
begin
Result := 0;
for I := 0 to AnItem.Index - 1 do
Inc(Result, Items[I].Width);
end;
procedure TcxTreeListCustomBandPlace.CalculateItemsWidth;
var
AAutoWidthObject: TcxAutoWidthObject;
I: Integer;
begin
AAutoWidthObject := TcxAutoWidthObject.Create(ItemCount);
try
for I := 0 to ItemCount - 1 do
Items[I].InitAutoWidthItem(AAutoWidthObject.AddItem);
AAutoWidthObject.AvailableWidth := ItemsAvailableWidth;
AAutoWidthObject.Calculate;
for I := 0 to ItemCount - 1 do
Items[I].Width := AAutoWidthObject[I].AutoWidth;
finally
AAutoWidthObject.Free;
end;
end;
function TcxTreeListCustomBandPlace.CalculateLeftBound: Integer;
begin
Result := Controller.CalculateItemLeftBound(Self);
end;
function TcxTreeListCustomBandPlace.CalculateLevelHeight: Integer;
begin
if Adapter.OptionsView.BandLineHeight > 0 then
Result := Adapter.OptionsView.BandLineHeight
else
Result := CalculateLineHeight;// * BandLineCount;
end;
function TcxTreeListCustomBandPlace.CalculateLineHeight: Integer;
begin
Result := 0;
Formatter.CalculateHeight(ViewParams, Result);
end;
function TcxTreeListCustomBandPlace.CalculateMinWidth: Integer;
begin
Result := Max(InternalCalculateMinWidth, Band.MinWidth);
end;
function TcxTreeListCustomBandPlace.CalculateTopBound: Integer;
begin
Result := Controller.CalculateItemTopBound(Self);
end;
function TcxTreeListCustomBandPlace.CreateItem(
AColumn: TcxTreeListColumn): TcxTreeListColumnPlace;
begin
Result := TcxTreeListColumnPlace.Create(Self, AColumn);
FItems.Add(Result);
end;
procedure TcxTreeListCustomBandPlace.InitAutoWidthItem(
AnItem: TcxAutoWidthItem);
begin
AnItem.Fixed := IsFixed;
AnItem.MinWidth := MinWidth;
AnItem.Width := Width;
end;
function TcxTreeListCustomBandPlace.GetRowCount: Integer;
begin
Result := 0;
end;
function TcxTreeListCustomBandPlace.GetItemsAutoWidth: Boolean;
begin
Result := Formatter.AutoWidth;
end;
function TcxTreeListCustomBandPlace.GetItemsAvailableWidth: Integer;
begin
Result := Formatter.AvailableWidth;
end;
function TcxTreeListCustomBandPlace.InternalCalculateMinWidth: Integer;
begin
Result := 0;
end;
function TcxTreeListCustomBandPlace.InternalCalculateWidth: Integer;
begin
Result := 0;
end;
function TcxTreeListCustomBandPlace.GetColumnIndex(
AColumn: TcxTreeListColumn): Integer;
var
AColumnIndex, AIndexCount, I: Integer;
begin
AColumnIndex := AColumn.ItemIndex;
AIndexCount := FColumnIndexes.Count;
if AColumnIndex > AIndexCount - 1 then
begin
FColumnIndexes.Count := AColumnIndex + 1;
for I := AIndexCount to FColumnIndexes.Count - 1 do
FColumnIndexes[I] := TObject(-1);
end;
Result := Integer(FColumnIndexes[AColumnIndex]);
if Result = -1 then
begin
FColumnIndexes[AColumnIndex] := TObject(IndexOf(AColumn));
Result := Integer(FColumnIndexes[AColumnIndex]);
end;
end;
function TcxTreeListCustomBandPlace.GetBounds: TRect;
begin
Result := MakeBounds(LeftBound, TopBound, Width, Height);
end;
function TcxTreeListCustomBandPlace.GetExpandable: Boolean;
begin
Result := Band.ActuallyExpandable;
end;
function TcxTreeListCustomBandPlace.GetHeight: Integer;
begin
if FHeight = -1 then
FHeight := CalculateHeight;
Result := FHeight;
end;
function TcxTreeListCustomBandPlace.GetIndex: Integer;
begin
if Parent <> nil then
Result := Parent.IndexOf(Self)
else
Result := Controller.RootIndexOf(Self);
end;
function TcxTreeListCustomBandPlace.GetIsFixed: Boolean;
begin
Result := not Band.Options.Sizing;
end;
function TcxTreeListCustomBandPlace.GetItem(AIndex: Integer): TcxTreeListColumnPlace;
begin
Result := TcxTreeListColumnPlace(FItems[AIndex]);
end;
function TcxTreeListCustomBandPlace.GetItemCount: Integer;
begin
Result := FItems.Count;
end;
function TcxTreeListCustomBandPlace.GetLeftBound: Integer;
begin
if FLeftBound = -1 then
FLeftBound := CalculateLeftBound;
Result := FLeftBound;
end;
function TcxTreeListCustomBandPlace.GetLevelIndex: Integer;
begin
Result := Band.Level;
end;
function TcxTreeListCustomBandPlace.GetMinWidth: Integer;
begin
if FMinWidth = -1 then
FMinWidth := CalculateMinWidth;
Result := FMinWidth;
end;
function TcxTreeListCustomBandPlace.GetTopBound: Integer;
begin
if FTopBound = -1 then
FTopBound := CalculateTopBound;
Result := FTopBound;
end;
function TcxTreeListCustomBandPlace.GetViewParams: TdxReportItemViewParams;
begin
Result := Formatter.GetBandItemViewParams(Band);
end;
{ TcxTreeListBandPlace }
constructor TcxTreeListBandPlace.Create(AnOwner: TcxTreeListItemPlaceController;
AParent: TcxTreeListBandPlace; ABand: TcxTreeListBand);
begin
inherited;
FChildItems := TList.Create;
end;
destructor TcxTreeListBandPlace.Destroy;
begin
FreeAndNil(FChildItems);
inherited;
end;
function TcxTreeListBandPlace.IndexOf(
AnItem: TcxTreeListCustomBandPlace): Integer;
begin
Result := FChildItems.IndexOf(AnItem);
end;
procedure TcxTreeListBandPlace.Refresh;
begin
inherited Refresh;
RefreshChildItems;
end;
function TcxTreeListBandPlace.GetRowCount: Integer;
begin
Result := 1;
end;
function TcxTreeListBandPlace.InternalCalculateMinWidth: Integer;
var
I: Integer;
begin
Result := 0;
for I := 0 to ChildItemCount - 1 do
Inc(Result, ChildItems[I].MinWidth);
end;
function TcxTreeListBandPlace.InternalCalculateWidth: Integer;
var
I: Integer;
begin
Result := 0;
for I := 0 to ChildItemCount - 1 do
Inc(Result, ChildItems[I].Width);
end;
procedure TcxTreeListBandPlace.WidthChanged;
begin
inherited WidthChanged;
CalculateChildItemWidths;
end;
procedure TcxTreeListBandPlace.CalculateChildItemWidths;
var
AAutoWidthObject: TcxAutoWidthObject;
I: Integer;
begin
AAutoWidthObject := TcxAutoWidthObject.Create(ChildItemCount);
try
for I := 0 to ChildItemCount - 1 do
ChildItems[I].InitAutoWidthItem(AAutoWidthObject.AddItem);
AAutoWidthObject.AvailableWidth := Width;
AAutoWidthObject.Calculate;
for I := 0 to ChildItemCount - 1 do
ChildItems[I].Width := AAutoWidthObject[I].AutoWidth;
finally
AAutoWidthObject.Free;
end;
end;
procedure TcxTreeListBandPlace.RefreshChildItems;
var
I: Integer;
ABandAccess: TcxTreeListBandAccess;
begin
ABandAccess := TcxTreeListBandAccess(Band);
FChildItems.Count := ABandAccess.ChildVisibleBands.Count;
for I := 0 to FChildItems.Count - 1 do
begin
FChildItems[I] := Controller.ItemsByBand[ABandAccess.ChildVisibleBands[I]];
ChildItems[I].FParent := Self;
end;
end;
function TcxTreeListBandPlace.GetChildItem(
Index: Integer): TcxTreeListCustomBandPlace;
begin
Result := TcxTreeListCustomBandPlace(FChildItems[Index]);
end;
function TcxTreeListBandPlace.GetChildItemCount: Integer;
begin
Result := FChildItems.Count;
end;
{ TcxTreeListBottomBandPlace }
procedure TcxTreeListBottomBandPlace.AddItems;
var
I, J: Integer;
ARow: TcxTreeListBandRow;
begin
for I := 0 to Band.BandRows.VisibleItemCount - 1 do
begin
ARow := Band.BandRows.VisibleItems[I];
for J := 0 to ARow.VisibleItemCount - 1 do
CreateItem(ARow.VisibleItems[J]);
end;
end;
function TcxTreeListBottomBandPlace.CalculateItemLeftBound(
AnItem: TcxTreeListColumnPlace): Integer;
var
ARow: TcxTreeListBandRow;
I: Integer;
ACurrentItem: TcxTreeListColumnPlace;
begin
Result := LeftBound;
ARow := AnItem.Column.Position.Row;
for I := 0 to AnItem.Column.Position.VisibleColIndex - 1 do
begin
ACurrentItem := ItemsByColumn[ARow.VisibleItems[I]];
Inc(Result, ACurrentItem.Width);
end;
end;
procedure TcxTreeListBottomBandPlace.CalculateItemsWidth;
var
I, J: Integer;
ARow: TcxTreeListBandRow;
AAutoWidthObject: TcxAutoWidthObject;
AColumn: TcxTreeListColumn;
begin
for I := 0 to Band.BandRows.VisibleItemCount - 1 do
begin
ARow := Band.BandRows.VisibleItems[I];
AAutoWidthObject := TcxAutoWidthObject.Create(ARow.VisibleItemCount);
try
for J := 0 to ARow.VisibleItemCount - 1 do
ItemsByColumn[ARow.VisibleItems[J]].InitAutoWidthItem(AAutoWidthObject.AddItem);
AAutoWidthObject.AvailableWidth := ItemsAvailableWidth;
AAutoWidthObject.Calculate;
for J := 0 to ARow.VisibleItemCount - 1 do
begin
AColumn := ARow.VisibleItems[J];
ItemsByColumn[AColumn].Width := AAutoWidthObject[J].AutoWidth;
end;
finally
AAutoWidthObject.Free;
end;
end;
end;
function TcxTreeListBottomBandPlace.GetItemsAutoWidth: Boolean;
begin
Result := True;
end;
function TcxTreeListBottomBandPlace.GetItemsAvailableWidth: Integer;
begin
Result := Width;
end;
function TcxTreeListBottomBandPlace.GetRowCount: Integer;
begin
Result := Controller.LevelCount - LevelIndex;
end;
function TcxTreeListBottomBandPlace.InternalCalculateMinWidth: Integer;
var
I, V, J: Integer;
ARow: TcxTreeListBandRow;
AColumn: TcxTreeListColumn;
begin
Result := 0;
for I := 0 to Band.BandRows.VisibleItemCount - 1 do
begin
V := 0;
ARow := Band.BandRows.VisibleItems[I];
for J := 0 to ARow.VisibleItemCount - 1 do
begin
AColumn := ARow.VisibleItems[J];
Inc(V, AColumn.MinWidth);
end;
if Result < V then Result := V;
end;
end;
function TcxTreeListBottomBandPlace.InternalCalculateWidth: Integer;
var
I, V, J: Integer;
ARow: TcxTreeListBandRow;
AColumn: TcxTreeListColumn;
begin
Result := 0;
for I := 0 to Band.BandRows.VisibleItemCount - 1 do
begin
V := 0;
ARow := Band.BandRows.VisibleItems[I];
for J := 0 to ARow.VisibleItemCount - 1 do
begin
AColumn := ARow.VisibleItems[J];
Inc(V, AColumn.Width);
end;
if Result < V then Result := V;
end;
end;
procedure TcxTreeListBottomBandPlace.WidthChanged;
begin
inherited;
CalculateItemsWidth;
end;
{ TcxTreeListItemPlaceController }
constructor TcxTreeListItemPlaceController.Create(
AFormatter: TcxTreeListReportLinkFormatter);
begin
inherited Create(AFormatter);
FBottomItems := TList.Create;
FItems := TObjectList.Create;
FRootItems := TList.Create;
FLevelHeights := TList.Create;
FHeight := -1;
FLevelCount := -1;
end;
destructor TcxTreeListItemPlaceController.Destroy;
begin
FreeAndNil(FLevelHeights);
FreeAndNil(FRootItems);
FreeAndNil(FItems);
FreeAndNil(FBottomItems);
inherited;
end;
procedure TcxTreeListItemPlaceController.Calculate;
begin
CalculateLevelHeights;
CalculateItemWidths;
end;
procedure TcxTreeListItemPlaceController.Refresh;
begin
FItems.Clear;
AddItems;
RefreshRootItems;
RefreshBottomItems;
RefreshItems;
end;
function TcxTreeListItemPlaceController.BottomIndexOf(AnItem: TcxTreeListCustomBandPlace): Integer;
begin
Result := FBottomItems.IndexOf(AnItem);
end;
function TcxTreeListItemPlaceController.IndexOf(
AnItem: TcxTreeListCustomBandPlace): Integer;
begin
Result := FItems.IndexOf(AnItem);
end;
function TcxTreeListItemPlaceController.IndexOf(
ABand: TcxTreeListBand): Integer;
begin
for Result := 0 to ItemCount - 1 do
if Items[Result].Band = ABand then
Exit;
Result := -1;
end;
function TcxTreeListItemPlaceController.RootIndexOf(
ABand: TcxTreeListBand): Integer;
begin
for Result := 0 to RootItemCount - 1 do
if RootItems[Result].Band = ABand then
Exit;
Result := -1;
end;
function TcxTreeListItemPlaceController.RootIndexOf(
AnItem: TcxTreeListCustomBandPlace): Integer;
begin
Result := FRootItems.IndexOf(AnItem);
end;
function TcxTreeListItemPlaceController.CalculateHeaderLineCount: Integer;
var
I, V: Integer;
begin
Result := -1;
for I := 0 to BottomItemCount - 1 do
begin
V := BottomItems[I].HeaderLineCount;
if Result < V then Result := V;
end;
end;
function TcxTreeListItemPlaceController.CalculateWidth: Integer;
var
I: Integer;
begin
Result := 0;
for I := 0 to RootItemCount - 1 do
Inc(Result, RootItems[I].Width);
end;
function TcxTreeListItemPlaceController.GetItemByColumn(
AColumn: TcxTreeListColumn): TcxTreeListColumnPlace;
var
ABandPlace: TcxTreeListCustomBandPlace;
begin
ABandPlace := ItemsByBand[TcxTreeListColumn(AColumn).Position.Band];
if ABandPlace <> nil then
Result := ABandPlace.ItemsByColumn[AColumn]
else
Result := nil;
end;
procedure TcxTreeListItemPlaceController.AddItems;
var
I: Integer;
begin
FItems.Count := Formatter.BandCount;
for I := 0 to ItemCount - 1 do
FItems[I] := CreateItem(Formatter.Bands[I]);
end;
function TcxTreeListItemPlaceController.CreateItem(
ABand: TcxTreeListBand): TcxTreeListCustomBandPlace;
begin
Result := GetItemClass(ABand).Create(Self, nil, ABand);
end;
function TcxTreeListItemPlaceController.GetItemClass(
ABand: TcxTreeListBand): TcxTreeListCustomBandPlaceClass;
begin
if ABand.IsBottom then
Result := TcxTreeListBottomBandPlace
else
Result := TcxTreeListBandPlace;
end;
procedure TcxTreeListItemPlaceController.RefreshBottomItems;
var
I: Integer;
begin
FBottomItems.Count := Adapter.BottomBandCount;
for I := 0 to BottomItemCount - 1 do
FBottomItems[I] := ItemsByBand[Adapter.BottomBands[I]];
end;
procedure TcxTreeListItemPlaceController.RefreshItems;
var
I: Integer;
begin
for I := 0 to ItemCount - 1 do
Items[I].Refresh;
end;
procedure TcxTreeListItemPlaceController.RefreshRootItems;
var
I: Integer;
begin
FRootItems.Count := Adapter.RootBandCount;
for I := 0 to RootItemCount - 1 do
FRootItems[I] := ItemsByBand[Adapter.RootBands[I]];
end;
function TcxTreeListItemPlaceController.CalculateHeight: Integer;
var
I: Integer;
begin
Result := 0;
for I := 0 to LevelCount - 1 do
Inc(Result, LevelHeights[I]);
end;
function TcxTreeListItemPlaceController.CalculateItemHeight(
AnItem: TcxTreeListCustomBandPlace): Integer;
var
I: Integer;
begin
Result := 0;
for I := AnItem.LevelIndex to AnItem.LevelIndex + AnItem.RowCount - 1 do
Inc(Result, LevelHeights[I]);
end;
function TcxTreeListItemPlaceController.CalculateItemLeftBound(
AnItem: TcxTreeListCustomBandPlace): Integer;
var
I: Integer;
begin
if AnItem.Parent <> nil then
begin
Result := AnItem.Parent.LeftBound;
for I := 0 to AnItem.Index - 1 do
Inc(Result, AnItem.Parent.ChildItems[I].Width);
end
else
begin
Result := 0;
for I := 0 to AnItem.Index - 1 do
Inc(Result, RootItems[I].Width);
end;
end;
function TcxTreeListItemPlaceController.CalculateItemTopBound(
AnItem: TcxTreeListCustomBandPlace): Integer;
var
I: Integer;
begin
Result := 0;
for I := 0 to AnItem.LevelIndex - 1 do
Inc(Result, LevelHeights[I]);
end;
function TcxTreeListItemPlaceController.CalculateLevelCount: Integer;
var
I, V: Integer;
begin
Result := 0;
if ItemCount <> 0 then
begin
for I := 0 to ItemCount - 1 do
begin
V := Items[I].LevelIndex;
if Result < V then Result := V;
end;
Inc(Result);
end;
end;
procedure TcxTreeListItemPlaceController.CalculateItemWidths;
var
I: Integer;
AutoWidthObject: TcxAutoWidthObject;
begin
for I := 0 to RootItemCount - 1 do
RootItems[I].AssignWidth;
if AutoWidth then
begin
AutoWidthObject := TcxAutoWidthObject.Create(RootItemCount);
try
for I := 0 to RootItemCount - 1 do
RootItems[I].InitAutoWidthItem(AutoWidthObject.AddItem);
AutoWidthObject.AvailableWidth := AvailableWidth;
AutoWidthObject.Calculate;
for I := 0 to RootItemCount - 1 do
RootItems[I].Width := AutoWidthObject[I].AutoWidth;
finally
AutoWidthObject.Free;
end;
end;
end;
procedure TcxTreeListItemPlaceController.CalculateLevelHeights;
var
I, V: Integer;
AItem: TcxTreeListCustomBandPlace;
begin
FLevelHeights.Count := LevelCount;
for I := 0 to ItemCount - 1 do
begin
AItem := Items[I];
V := AItem.CalculateLevelHeight;
if LevelHeights[AItem.LevelIndex] < V then
LevelHeights[AItem.LevelIndex] := V;
end;
end;
function TcxTreeListItemPlaceController.GetAutoWidth: Boolean;
begin
Result := Formatter.AutoWidth or Adapter.AutoWidth;
end;
function TcxTreeListItemPlaceController.GetAvailableWidth: Integer;
begin
Result := Formatter.AvailableWidth;
end;
function TcxTreeListItemPlaceController.GetBottomItem(
AIndex: Integer): TcxTreeListCustomBandPlace;
begin
Result := TcxTreeListCustomBandPlace(FBottomItems[AIndex]);
end;
function TcxTreeListItemPlaceController.GetBottomItemCount: Integer;
begin
Result := FBottomItems.Count;
end;
function TcxTreeListItemPlaceController.GetHeight: Integer;
begin
if FHeight = -1 then
FHeight := CalculateHeight;
Result := FHeight;
end;
function TcxTreeListItemPlaceController.GetItem(
AIndex: Integer): TcxTreeListCustomBandPlace;
begin
Result := TcxTreeListCustomBandPlace(FItems[AIndex]);
end;
function TcxTreeListItemPlaceController.GetItemByBand(
ABand: TcxTreeListBand): TcxTreeListCustomBandPlace;
var
AIndex: Integer;
begin
AIndex := IndexOf(ABand);
if AIndex <> -1 then
Result := Items[IndexOf(ABand)]
else
Result := nil;
end;
function TcxTreeListItemPlaceController.GetItemCount: Integer;
begin
Result := FItems.Count;
end;
function TcxTreeListItemPlaceController.GetLevelCount: Integer;
begin
if FLevelCount = -1 then
FLevelCount := CalculateLevelCount;
Result := FLevelCount;
end;
function TcxTreeListItemPlaceController.GetLevelHeight(
AIndex: Integer): Integer;
begin
Result := Integer(FLevelHeights[AIndex]);
end;
function TcxTreeListItemPlaceController.GetRootItem(
AIndex: Integer): TcxTreeListCustomBandPlace;
begin
Result := TcxTreeListCustomBandPlace(FRootItems[AIndex]);
end;
function TcxTreeListItemPlaceController.GetRootItemCount: Integer;
begin
Result := FRootItems.Count;
end;
procedure TcxTreeListItemPlaceController.SetLevelHeight(AIndex,
AValue: Integer);
begin
FLevelHeights[AIndex] := TObject(AValue);
end;
{ TcxTreeListReportLinkFormatter }
constructor TcxTreeListReportLinkFormatter.Create(ABuilder: TcxTreeListReportLinkBuilder);
begin
inherited;
FFont := TFont.Create;
FLookAndFeelItems := TList.Create;
FNodes := TList.Create;
FColumns := TList.Create;
FBands := TList.Create;
CreateNodeList;
FTransparentColor := dxPSCore.dxDefaultContentColor;
FItemPlaceController := TcxTreeListItemPlaceController.Create(Self);
end;
destructor TcxTreeListReportLinkFormatter.Destroy;
begin
FreeAndNil(FItemPlaceController);
FreeAndNil(FBands);
FreeAndNil(FColumns);
FreeAndNil(FNodes);
FreeAndNil(FLookAndFeelItems);
FreeAndNil(FFont);
inherited;
end;
function TcxTreeListReportLinkFormatter.Adapter: TcxTreeListAdapter;
begin
Result := Builder.Adapter;
end;
procedure TcxTreeListReportLinkFormatter.DoInitializeHost(AHost: TdxReportCell);
begin
AHost.CellSides := [];
AHost.Transparent := True;
end;
procedure TcxTreeListReportLinkFormatter.DoInitializeBandItem(AnItem: TAbstractdxReportCellData;
AnIndex: Integer);
var
Band: TcxTreeListBand;
begin
Band := Bands[AnIndex];
SetViewParams(AnItem, GetBandItemViewParams(Band));
RegisterLookAndFeelItem(AnItem, cesRaised);
if HasBackgroundBitmap(tlsv_BandHeader) then
AnItem.BackgroundBitmapIndex := GetBackgroundBitmapIndex(tlsv_BandHeader);
with AnItem as TdxReportCellImage do
begin
Data := Integer(Band);
EndEllipsis := Band.Caption.ShowEndEllipsis;
if not Band.Caption.Glyph.Empty then
begin
Image := Band.Caption.Glyph;
ImageLayout := HeaderImageLayoutMap[Band.Caption.GlyphAlignHorz, Band.Caption.GlyphAlignVert];
ImageTransparent := True;
IsTextDrawnForCenteredImage := True;
IsTextShiftedForHorizontallyCenteredImage := not (ImageLayout in [ilImageTopCenter, ilImageCenterCenter, ilImageBottomCenter]);
end;
Multiline := Band.Caption.Multiline;
Text := Band.Caption.Text;
TextAlignX := TextAlignXMap[Band.Caption.AlignHorz];
TextAlignY := TextAlignYMap[Band.Caption.AlignVert];
end;
end;
procedure TcxTreeListReportLinkFormatter.DoInitializeBandRow(ARow: TdxReportCell);
begin
//SetViewParams(ARow, GetBandBackgroundViewParams);
ARow.Transparent := True; //???
ARow.Data := Integer(TcxTreeListBandAttribute);
end;
procedure TcxTreeListReportLinkFormatter.DoReportLinkInitializeBandItem(AnItem: TAbstractdxReportCellData;
AIndex: Integer);
begin
ReportLink.DoInitializeBandCell(Bands[AIndex], TdxReportCellImage(AnItem));
end;
function TcxTreeListReportLinkFormatter.GetBandBackgroundViewParams: TdxReportItemViewParams;
begin
Result.NativeParams := Adapter.GetBandBackgroundViewParams;
Result.CellSides := [];
Result.FontStyle := [];
Result.Transparent := True;
end;
function TcxTreeListReportLinkFormatter.GetBandItemBounds(Index: Integer): TRect;
var
Item: TcxTreeListCustomBandPlace;
begin
Item := ItemPlaceController.ItemsByBand[Bands[Index]];
if Item <> nil then
Result := Item.Bounds
else
Result := dxPSGlbl.NullRect;
end;
function TcxTreeListReportLinkFormatter.GetBandItemClass(Index: Integer): TdxReportCellTextClass;
begin
Result := TdxReportCellImage;
end;
function TcxTreeListReportLinkFormatter.GetBandItemViewParams(ABand: TcxTreeListBand): TdxReportItemViewParams;
begin
FillChar(Result, SizeOf(Result), 0);
if ReportLink.OptionsFormatting.UseNativeStyles then
ReportLink.Styles.GetBandHeaderParams(ABand, Result.NativeParams)
else
Result.NativeParams := Adapter.GetBandHeaderViewParams(ABand);
if UseLookAndFeelColors and Adapter.CanUseLookAndFeelColors then
if ABand <> nil then
begin
Result.NativeParams.Color := Adapter.ThemedBandHeaderItemColor;
Result.NativeParams.TextColor := Adapter.ThemedBandHeaderItemTextColor;
end;
Result.CellSides := csAll;
Result.FontStyle := [];
Result.Transparent := IsColorTransparent(Result.NativeParams.Color); // ReportLink.FixedTransparent;
end;
procedure TcxTreeListReportLinkFormatter.DoInitializeNodeCheck(AnItem: TdxCustomReportCellCheck;
ANode: TcxTreeListNode; AnIndex: Integer);
begin
SetViewParams(AnItem, GetNodeCheckViewParams(ANode, AnIndex));
if HasBackgroundBitmap(tlsv_Content) then
AnItem.BackgroundBitmapIndex := GetBackgroundBitmapIndex(tlsv_Content);
AnItem.Checked := ANode.CheckState <> cbsUnchecked;
AnItem.Enabled := ANode.CheckState <> cbsGrayed;
TdxReportCellCheck(AnItem).FlatBorder := ReportLink.OptionsRefinements.FlatCheckMarks;
end;
function TcxTreeListReportLinkFormatter.GetNodeCheckCellSides(ANode: TcxTreeListNode;
AnIndex: Integer): TdxCellSides;
begin
Result := [];
if ReportLink.OptionsView.Borders and not Adapter.HasStateImages(ANode) and
not Adapter.HasImages(ANode) then
Result := [csRight];
end;
function TcxTreeListReportLinkFormatter.GetNodeCheckClass(ANode: TcxTreeListNode): TdxCustomReportCellCheckClass;
begin
case ANode.Parent.CheckGroupType of
ncgCheckGroup:
Result := TdxReportCellCheck
else {ncgRadioGroup}
Result := TdxReportCellRadio;
end;
end;
function TcxTreeListReportLinkFormatter.GetNodeCheckViewParams(ANode: TcxTreeListNode;
AnIndex: Integer): TdxReportItemViewParams;
begin
FillChar(Result, SizeOf(Result), 0);
if ReportLink.OptionsFormatting.UseNativeStyles then
if CanProcessSelectionStyle(ANode) then
ReportLink.Styles.GetSelectionParams(Result.NativeParams)
else
ReportLink.Styles.GetImagesParams(ANode, Result.NativeParams)
else
if CanProcessSelectionStyle(ANode) then
Result.NativeParams := Adapter.GetSelectionViewParams
else
Result.NativeParams := Adapter.GetIndentViewParams(ANode, AnIndex);
Result.CellSides := GetNodeCheckCellSides(ANode, AnIndex);
Result.Transparent := IsColorTransparent(Result.NativeParams.Color);
end;
procedure TcxTreeListReportLinkFormatter.DoInitializeFooterCell(AnItem: TAbstractdxReportCellData;
AColumn: TcxTreeListColumn; ACellIndex: Integer; ANode: TcxTreeListNode);
var
ASummaryItem: TcxTreeListSummaryItem;
I, AColumnIndex: Integer;
begin
AColumnIndex := FColumns.IndexOf(AColumn);
SetViewParams(AnItem, GetFooterCellViewParams(AColumn));
RegisterLookAndFeelItem(AnItem, cesSunken);
if HasBackgroundBitmap(tlsv_ColumnFooter) then
AnItem.BackgroundBitmapIndex := GetBackgroundBitmapIndex(tlsv_ColumnFooter);
ASummaryItem := GetSummaryItems(ANode)[AColumnIndex, ACellIndex];
with AnItem as TdxReportCellString do
begin
Data := Integer(AColumn);
Multiline := AColumn.Position.LineCount > 1;
TextAlignX := TextAlignXMap[ASummaryItem.AlignHorz];
TextAlignY := TextAlignYMap[ASummaryItem.AlignVert];
if (GetFooterCellCount(AColumn, ANode) <> 1) or
(Length(GetSummaryItems(ANode)[AColumnIndex]) = 1) then
Text := ANode.FooterSummaryTexts[ASummaryItem.AbsoluteIndex]
else
for I := 0 to High(GetSummaryItems(ANode)[AColumnIndex]) do
begin
if Text <> '' then
Text := Text + ';';
Text := Text + ANode.FooterSummaryTexts[GetSummaryItems(ANode)[AColumnIndex, I].AbsoluteIndex];
end;
end;
end;
procedure TcxTreeListReportLinkFormatter.DoInitializeFooterIndent(AnItem: TdxReportCellExpandButton;
AnIndex, AnIndentCount: Integer; ANode: TcxTreeListNode);
begin
SetViewParams(AnItem, GetNodeIndentViewParams(ANode, AnIndex, AnIndentCount));
if HasBackgroundBitmap(tlsv_Content) then
AnItem.BackgroundBitmapIndex := GetBackgroundBitmapIndex(tlsv_Content);
AnItem.Data := MakeIndentIndex(AnIndex);
AnItem.ShowButton := False;
if ReportLink.OptionsView.Borders and (AnIndex = AnIndentCount - 1) then
AnItem.CellSides := [csRight]
else
AnItem.CellSides := [];
if ReportLink.OptionsView.TreeLines then
AnItem.TreeLineMode := GetNodeFooterIndentTreeLineMode(AnIndex, AnIndentCount, ANode);
end;
procedure TcxTreeListReportLinkFormatter.DoInitializeFooterBandedRow(
ARow: TdxReportCell; AIndentCount: Integer);
var
ABandPlace: TcxTreeListCustomBandPlace;
AIndex, ALastIndex: Integer;
begin
SetViewParams(ARow, GetFooterRowViewParams);
RegisterLookAndFeelItem(ARow, cesRaised);
ABandPlace := TcxTreeListCustomBandPlace(ARow.Data);
ARow.CellSides := csTopBottom;
AIndex := ABandPlace.Controller.BottomIndexOf(ABandPlace);
ALastIndex := ABandPlace.Controller.BottomItemCount - 1;
if (AIndex = 0) or ABandPlace.Expandable and (AIndentCount > 0) then
ARow.CellSides := ARow.CellSides + [csLeft];
if (AIndex = ALastIndex) or
ABandPlace.Controller.BottomItems[AIndex + 1].Expandable and (AIndentCount > 0) then
ARow.CellSides := ARow.CellSides + [csRight];
end;
procedure TcxTreeListReportLinkFormatter.DoInitializeFooterRow(ARow: TdxReportCell);
begin
ARow.Transparent := True;
ARow.Data := Integer(TcxTreeListFooterAttribute);
ARow.CellSides := csLeftRight;
end;
procedure TcxTreeListReportLinkFormatter.DoReportLinkInitializeFooterCell(AnItem: TAbstractdxReportCellData;
AColumnIndex, ACellIndex: Integer);
begin
ReportLink.DoInitializeFooterCell(Columns[AColumnIndex], ACellIndex,
TdxReportCellString(AnItem));
end;
function TcxTreeListReportLinkFormatter.GetFooterCellBounds(AColumn: TcxTreeListColumn;
ACellIndex, AIndent: Integer): TRect;
var
AItem: TcxTreeListColumnPlace;
AColumnAccess: TcxTreeListColumnAccess;
begin
AItem := ItemPlaceController.ItemsByColumn[AColumn];
if AItem <> nil then
begin
Result := AItem.FooterCellBounds[ACellIndex];
AColumnAccess := TcxTreeListColumnAccess(AColumn);
if AColumnAccess.HasIndent then
Inc(Result.Left, AIndent);
end
else
Result := dxPSGlbl.NullRect;
end;
function TcxTreeListReportLinkFormatter.GetFooterCellClass: TdxReportCellTextClass;
begin
Result := TdxReportCellString;
end;
function TcxTreeListReportLinkFormatter.GetFooterCellViewParams(AColumn: TcxTreeListColumn): TdxReportItemViewParams;
begin
FillChar(Result, SizeOf(Result), 0);
if ReportLink.OptionsFormatting.UseNativeStyles then
ReportLink.Styles.GetColumnFooterParams(nil, AColumn, Result.NativeParams)
else
Result.NativeParams := Adapter.GetColumnFooterViewParams(AColumn);
if UseLookAndFeelColors and Adapter.CanUseLookAndFeelColors then
if AColumn <> nil then
begin
Result.NativeParams.Color := Adapter.ThemedFooterItemColor;
Result.NativeParams.TextColor := Adapter.ThemedFooterItemTextColor;
end;
Result.CellSides := csAll;
Result.FontStyle := [];
Result.Transparent := IsColorTransparent(Result.NativeParams.Color);
end;
function TcxTreeListReportLinkFormatter.GetNodeFooterIndentTreeLineMode(AnIndex, AnIndentCount: Integer;
ANode: TcxTreeListNode): TdxPSTreeLineMode;
function GetParentWithCertainLevel(ALevel: Integer): TcxTreeListNode;
begin
Result := ANode;
while Result.Level > ALevel do
Result := Result.Parent;
end;
begin
if not Adapter.ShowRoot then
Inc(AnIndex);
if IsNodeLastChild(GetParentWithCertainLevel(AnIndex)) then
Result := tlmNone
else
Result := tlmVertical
end;
function TcxTreeListReportLinkFormatter.GetFooterRowViewParams: TdxReportItemViewParams;
begin
FillChar(Result, SizeOf(Result), 0);
if ReportLink.OptionsFormatting.UseNativeStyles then
ReportLink.Styles.GetFooterRowParams(Result.NativeParams)
else
Result.NativeParams := Adapter.GetFooterRowViewParams;
Result.CellSides := csAll;
Result.FontStyle := [];
Result.Transparent := IsColorTransparent(Result.NativeParams.Color);
end;
procedure TcxTreeListReportLinkFormatter.DoInitializeHeaderItem(AnItem: TAbstractdxReportCellData;
AnIndex: Integer);
var
AColumn: TcxTreeListColumn;
begin
AColumn := Columns[AnIndex];
SetViewParams(AnItem, GetHeaderItemViewParams(AColumn));
RegisterLookAndFeelItem(AnItem, cesRaised);
if HasBackgroundBitmap(tlsv_ColumnHeader) then
AnItem.BackgroundBitmapIndex := GetBackgroundBitmapIndex(tlsv_ColumnHeader);
with AnItem as TdxReportCellImage do
begin
Data := Integer(AColumn);
EndEllipsis := AColumn.Caption.ShowEndEllipsis;
if not AColumn.Caption.Glyph.Empty then
begin
Image := AColumn.Caption.Glyph;
ImageLayout := HeaderImageLayoutMap[AColumn.Caption.GlyphAlignHorz, AColumn.Caption.GlyphAlignVert];
IsTextDrawnForCenteredImage := True;
IsTextShiftedForHorizontallyCenteredImage := not (ImageLayout in [ilImageTopCenter, ilImageCenterCenter, ilImageBottomCenter]);
end;
Multiline := AColumn.Caption.MultiLine;
SortOrder := SortOrderMap[AColumn.SortOrder];
Text := AColumn.Caption.Text;
TextAlignX := TextAlignXMap[AColumn.Caption.AlignHorz];
TextAlignY := TextAlignYMap[AColumn.Caption.AlignVert];
end;
end;
procedure TcxTreeListReportLinkFormatter.DoInitializeHeaderRow(ARow: TdxReportCell);
begin
SetViewParams(ARow, GetHeaderItemViewParams(nil));
ARow.Data := Integer(TcxTreeListHeaderAttribute);
end;
procedure TcxTreeListReportLinkFormatter.DoReportLinkInitializeHeaderItem(AnItem: TAbstractdxReportCellData;
AIndex: Integer);
begin
ReportLink.DoInitializeHeaderCell(Columns[AIndex], TdxReportCellImage(AnItem));
end;
function TcxTreeListReportLinkFormatter.GetHeaderItemBounds(AnIndex: Integer): TRect;
var
AItem: TcxTreeListColumnPlace;
begin
AItem := ItemPlaceController.ItemsByColumn[Columns[AnIndex]];
if AItem <> nil then
Result := AItem.HeaderCellBounds
else
Result := dxPSGlbl.NullRect;
end;
function TcxTreeListReportLinkFormatter.GetHeaderItemClass(AnIndex: Integer): TdxReportCellTextClass;
begin
Result := TdxReportCellImage;
end;
function TcxTreeListReportLinkFormatter.GetHeaderItemViewParams(AColumn: TcxTreeListColumn): TdxReportItemViewParams;
begin
FillChar(Result, SizeOf(Result), 0);
if ReportLink.OptionsFormatting.UseNativeStyles then
ReportLink.Styles.GetColumnHeaderParams(AColumn, Result.NativeParams)
else
Result.NativeParams := Adapter.GetColumnHeaderViewParams(AColumn);
if UseLookAndFeelColors and Adapter.CanUseLookAndFeelColors then
if AColumn <> nil then
begin
Result.NativeParams.Color := Adapter.ThemedHeaderItemColor;
Result.NativeParams.TextColor := Adapter.ThemedHeaderItemTextColor;
end;
Result.CellSides := csAll;
Result.FontStyle := [];
Result.Transparent := IsColorTransparent(Result.NativeParams.Color); //ReportLink.FixedTransparent;
end;
procedure TcxTreeListReportLinkFormatter.DoInitializeNodeImage(AnItem: TdxReportCellGraphic;
ANode: TcxTreeListNode; AnIndex: Integer);
begin
SetViewParams(AnItem, GetNodeImageViewParams(ANode, AnIndex));
if HasBackgroundBitmap(tlsv_Content) then
AnItem.BackgroundBitmapIndex := GetBackgroundBitmapIndex(tlsv_Content);
AnItem.Data := MakeIndentIndex(AnIndex);
AnItem.DrawMode := gdmCenter;
AnItem.ImageIndex := ANode.ImageIndex;
AnItem.ImageList := Adapter.Images;
AnItem.ImageTransparent := True;
end;
procedure TcxTreeListReportLinkFormatter.DoReportLinkInitializeNodeImage(AnItem: TAbstractdxReportCellData;
ANode: TcxTreeListNode; AnIndex: Integer);
begin
ReportLink.DoInitializeIndentCell(ANode, AnIndex, AnItem);
end;
function TcxTreeListReportLinkFormatter.GetNodeImageCellSides(ANode: TcxTreeListNode;
AnIndex: Integer): TdxCellSides;
begin
Result := [];
if ReportLink.OptionsView.Borders then
Result := [csRight];
end;
function TcxTreeListReportLinkFormatter.GetNodeImageClass: TdxReportCellGraphicClass;
begin
Result := TdxReportCellGraphic;
end;
function TcxTreeListReportLinkFormatter.GetNodeImageViewParams(ANode: TcxTreeListNode;
AnIndex: Integer): TdxReportItemViewParams;
begin
FillChar(Result, SizeOf(Result), 0);
if ReportLink.OptionsFormatting.UseNativeStyles then
if CanProcessSelectionStyle(ANode) then
ReportLink.Styles.GetSelectionParams(Result.NativeParams)
else
ReportLink.Styles.GetImagesParams(ANode, Result.NativeParams)
else
if CanProcessSelectionStyle(ANode) then
Result.NativeParams := Adapter.GetSelectionViewParams
else
Result.NativeParams := Adapter.GetIndentViewParams(ANode, AnIndex);
Result.CellSides := GetNodeImageCellSides(ANode, AnIndex);
Result.Transparent := IsColorTransparent(Result.NativeParams.Color); // ReportLink.FixedTransparent;
end;
procedure TcxTreeListReportLinkFormatter.DoInitializeNodeIndent(AnItem: TdxReportCellExpandButton;
AnIndex, AnIndentCount: Integer; ANode: TcxTreeListNode);
begin
SetViewParams(AnItem, GetNodeIndentViewParams(ANode, AnIndex, AnIndentCount));
if HasBackgroundBitmap(tlsv_Content) then
AnItem.BackgroundBitmapIndex := GetBackgroundBitmapIndex(tlsv_Content);
AnItem.Data := MakeIndentIndex(AnIndex);
AnItem.ShowButton := (AnIndex = AnIndentCount - 1) and ANode.HasChildren and ReportLink.OptionsView.ExpandButtons;
if AnItem.ShowButton then
DoInitializeExpandButton(AnItem, AnIndex, AnIndentCount, ANode);
if ReportLink.OptionsView.TreeLines then
AnItem.TreeLineMode := GetNodeIndentTreeLineMode(AnIndex, AnIndentCount, ANode);
end;
procedure TcxTreeListReportLinkFormatter.DoInitializeExpandButton(AnItem: TdxReportCellExpandButton;
AnIndex, AnIndentCount: Integer; ANode: TcxTreeListNode);
begin
with AnItem do
begin
ButtonExpanded := IsNodeExpanded(ANode);
ButtonSize := ExpandButtonSize;
ButtonInteriorColor := ExpandButtonColor;
ButtonTransparent := IsColorTransparent(ButtonInteriorColor);
end;
end;
procedure TcxTreeListReportLinkFormatter.DoReportLinkInitializeNodeIndent(AnItem: TAbstractdxReportCellData;
AnIndex, AnIndentCount: Integer; ANode: TcxTreeListNode);
begin
ReportLink.DoInitializeIndentCell(ANode, AnIndex, AnItem);
end;
function TcxTreeListReportLinkFormatter.GetNodeIndentCellSides(ANode: TcxTreeListNode;
AnIndex, AnIndentCount: Integer): TdxCellSides;
begin
Result := [];
if ReportLink.OptionsView.Borders and (AnIndex = AnIndentCount - 1) and
not Adapter.HasStateImages(ANode) and not Adapter.HasImages(ANode) and not
Adapter.HasCheck(ANode) then
Result := [csRight];
end;
function TcxTreeListReportLinkFormatter.GetNodeIndentClass: TdxReportCellExpandButtonClass;
begin
Result := TdxReportCellExpandButton;
end;
function TcxTreeListReportLinkFormatter.GetNodeIndentTreeLineMode(AnIndex,
AnIndentCount: Integer; ANode: TcxTreeListNode): TdxPSTreeLineMode;
var
Level: Integer;
Parent: TcxTreeListNode;
begin
Level := AnIndentCount - AnIndex - 1;
Parent := GetNodeParent(ANode, Level);
if Parent = ANode then
if IsNodeLastChild(ANode) then
Result := tlmBottomRightCorner
else
if not HasParent(ANode) and IsNodeFirstChild(ANode) then
Result := tlmTopRightCorner
else
Result := tlmCross
else
if IsNodeLastChild(Parent) then
Result := tlmNone
else
Result := tlmVertical;
end;
function TcxTreeListReportLinkFormatter.GetNodeIndentViewParams(ANode: TcxTreeListNode;
AnIndex, AnIndentCount: Integer): TdxReportItemViewParams;
begin
FillChar(Result, 0, SizeOf(Result));
if ReportLink.OptionsFormatting.UseNativeStyles then
if CanProcessSelectionStyle(ANode) then
ReportLink.Styles.GetSelectionParams(Result.NativeParams)
else
ReportLink.Styles.GetIndentParams(ANode, AnIndex, Result.NativeParams)
else
if CanProcessSelectionStyle(ANode) then
Result.NativeParams := Adapter.GetSelectionViewParams
else
Result.NativeParams := Adapter.GetIndentViewParams(ANode, AnIndex);
// if not CanProcessSelectionStyle(ANode) and not IsNodeColorUsedForIndents then
// Result.Color := ReportLink.Color;
Result.CellSides := GetNodeIndentCellSides(ANode, AnIndex, AnIndentCount);
Result.FontStyle := [];
Result.Transparent := IsColorTransparent(Result.NativeParams.Color); //ReportLink.FixedTransparent
end;
procedure TcxTreeListReportLinkFormatter.DoInitializeNodeBandedRow(ARow: TdxReportCell);
const
CellSidesMap: array[Boolean] of TdxCellSides = ([], csAll);
begin
ARow.CellSides := CellSidesMap[ReportLink.OptionsView.Borders];
ARow.Transparent := True;
end;
procedure TcxTreeListReportLinkFormatter.DoInitializeNodeRow(ARow: TdxReportCell;
ANode: TcxTreeListNode);
const
CellSidesMap: array[Boolean] of TdxCellSides = ([], csLeftRight);
begin
ARow.CellSides := CellSidesMap[ReportLink.OptionsView.Borders];
ARow.Data := Integer(ANode);
ARow.Transparent := True;
ReportLink.AddReportRow(ARow);
end;
procedure TcxTreeListReportLinkFormatter.DoInitializeNodeItem(AnItem: TAbstractdxReportCellData;
AColumn: TcxTreeListColumn; ANode: TcxTreeListNode; AnIsPreview: Boolean = False);
function GetViewParams: TdxReportItemViewParams;
begin
if AnIsPreview then
Result := GetPreviewViewParams(AColumn, ANode)
else
Result := GetNodeItemViewParams(AColumn, ANode);
end;
var
Properties: TcxCustomEditProperties;
ViewParams: TdxReportItemViewParams;
CellValue: TcxEditValue;
begin
Properties := Adapter.GetProperties(AColumn, ANode);
ViewParams := GetViewParams;
CellValue := GetCellValue(Properties, AColumn, ANode);
dxPScxCommon.dxPSDataMaps.InitializeItem(AnItem, Properties, CellValue, Self, ViewParams, AnIsPreview{, ANode.RecordIndex});
dxPScxCommon.dxPSDataMaps.GetImageLists(Properties, ReportLink.AppendImageList);
SetViewParams(AnItem, ViewParams);
with ViewParams, NativeParams do
if (Bitmap <> nil) and not Bitmap.Empty then
AnItem.BackgroundBitmapIndex := ReportLink.AddBackgroundBitmapToPool(Bitmap);
AnItem.Data := Integer(AColumn);
end;
procedure TcxTreeListReportLinkFormatter.DoReportLinkInitializeNodeItem(AnItem: TAbstractdxReportCellData;
AColumn: TcxTreeListColumn; ANode: TcxTreeListNode);
begin
ReportLink.DoInitializeCell(ANode, AColumn, AnItem);
end;
function TcxTreeListReportLinkFormatter.GetCellValue(AProperties: TcxCustomEditProperties;
AColumn: TcxTreeListColumn; ANode: TcxTreeListNode): TcxEditValue;
begin
if AProperties.GetEditValueSource(False) = evsValue then
Result := ANode.Values[AColumn.ItemIndex]
else
Result := ANode.Texts[AColumn.ItemIndex];
end;
function TcxTreeListReportLinkFormatter.GetNodeBackgroundBitmapStyleIndex(ANode: TcxTreeListNode): Integer;
function HasBackgroundBitmap(AStyle: TcxStyle): Boolean;
begin
Result := (AStyle <> nil) and (svBitmap in AStyle.AssignedValues);
end;
begin
Result := tlsv_Content;
if IsOddNode(ANode) and HasBackgroundBitmap(ReportLink.Styles.StylesByCaption[cxGetResourceString(@sdxContentOddStyle)]) then
Result := tlsv_ContentOdd
else
if not IsOddNode(ANode) and HasBackgroundBitmap(ReportLink.Styles.StylesByCaption[cxGetResourceString(@sdxContentEvenStyle)]) then
Result := tlsv_ContentEven
end;
function TcxTreeListReportLinkFormatter.GetNodeItemBounds(ANode: TcxTreeListNode;
AIndex: Integer): TRect;
var
AItem: TcxTreeListColumnPlace;
begin
AItem := ItemPlaceController.ItemsByColumn[Columns[AIndex]];
if AItem <> nil then
Result := AItem.CellBounds[ANode]
else
Result := dxPSGlbl.NullRect;
end;
function TcxTreeListReportLinkFormatter.GetNodeItemCellSides(AColumn: TcxTreeListColumn;
ANode: TcxTreeListNode): TdxCellSides;
begin
if ReportLink.OptionsView.Borders then
Result := csAll
else
Result := [];
end;
function TcxTreeListReportLinkFormatter.GetNodeItemClass(AColumn: TcxTreeListColumn;
ANode: TcxTreeListNode; AnIsPreview: Boolean = False): TdxReportCellDataClass;
begin
Result := dxPSDataMaps.ItemClass(Adapter.GetProperties(AColumn, ANode), AnIsPreview);
end;
function TcxTreeListReportLinkFormatter.GetNodeItemViewParams(AColumn: TcxTreeListColumn;
ANode: TcxTreeListNode): TdxReportItemViewParams;
begin
FillChar(Result, 0, SizeOf(Result));
if ReportLink.OptionsFormatting.UseNativeStyles then
if CanProcessSelectionStyle(ANode) then
ReportLink.Styles.GetSelectionParams(Result.NativeParams)
else
ReportLink.Styles.GetContentParams(ANode, AColumn, Result.NativeParams)
else
if CanProcessSelectionStyle(ANode) then
Result.NativeParams := Adapter.GetSelectionViewParams
else
Result.NativeParams := Adapter.GetContentViewParams(ANode, AColumn);
Result.CellSides := GetNodeItemCellSides(AColumn, ANode);
Result.FontStyle := [];
Result.Transparent := IsColorTransparent(Result.NativeParams.Color); //ReportLink.Transparent;
end;
procedure TcxTreeListReportLinkFormatter.DoInitializePreview(AnItem: TAbstractdxReportCellData;
AColumn: TcxTreeListColumn; ANode: TcxTreeListNode);
begin
DoInitializeNodeItem(AnItem, AColumn, ANode, True);
end;
function TcxTreeListReportLinkFormatter.GetPreviewCellSides(ANode: TcxTreeListNode): TdxCellSides;
const
CellSidesMap: array[Boolean] of TdxCellSides = ([], csAll);
begin
Result := CellSidesMap[ReportLink.OptionsView.Borders];
end;
function TcxTreeListReportLinkFormatter.GetPreviewClass(AColumn: TcxTreeListColumn;
ANode: TcxTreeListNode): TdxReportCellDataClass;
begin
Result := GetNodeItemClass(AColumn, ANode, True);
end;
function TcxTreeListReportLinkFormatter.GetPreviewViewParams(AColumn: TcxTreeListColumn;
ANode: TcxTreeListNode): TdxReportItemViewParams;
begin
FillChar(Result, SizeOf(Result), 0);
if ReportLink.OptionsFormatting.UseNativeStyles then
if CanProcessSelectionStyle(ANode) then
ReportLink.Styles.GetSelectionParams(Result.NativeParams)
else
ReportLink.Styles.GetPreviewParams(ANode, AColumn, Result.NativeParams)
else
if CanProcessSelectionStyle(ANode) then
Result.NativeParams := Adapter.GetSelectionViewParams
else
Result.NativeParams := Adapter.GetPreviewViewParams(ANode, AColumn);
Result.CellSides := GetPreviewCellSides(ANode);
Result.FontStyle := [];
Result.Transparent := {True;//}IsColorTransparent(Result.NativeParams.Color); //ReportLink.Transparent;
end;
procedure TcxTreeListReportLinkFormatter.DoInitializeNodeSeparator(AnItem: TAbstractdxReportCellData);
begin
with TdxReportCellBox(AnItem) do
begin
CellSides := csAll;
Color := NodeSeparatorColor;
Transparent := False;
end;
end;
procedure TcxTreeListReportLinkFormatter.DoInitializeNodeSeparatorRow(ARow: TdxReportCell);
begin
end;
function TcxTreeListReportLinkFormatter.GetNodeSeparatorClass: TdxReportCellBoxClass;
begin
Result := TdxReportCellBox;
end;
{ state images }
procedure TcxTreeListReportLinkFormatter.DoInitializeNodeStateImage(AnItem: TdxReportCellGraphic;
ANode: TcxTreeListNode; AnIndex: Integer);
begin
SetViewParams(AnItem, GetNodeStateImageViewParams(ANode, AnIndex));
if HasBackgroundBitmap(tlsv_Content) then
AnItem.BackgroundBitmapIndex := GetBackgroundBitmapIndex(tlsv_Content);
AnItem.Data := MakeIndentIndex(AnIndex);
AnItem.DrawMode := gdmCenter;
AnItem.ImageIndex := ANode.StateIndex;
AnItem.ImageList := Adapter.StateImages;
AnItem.ImageTransparent := True;
end;
procedure TcxTreeListReportLinkFormatter.DoReportLinkInitializeNodeStateImage(AnItem: TAbstractdxReportCellData;
ANode: TcxTreeListNode; AnIndex: Integer);
begin
ReportLink.DoInitializeIndentCell(ANode, AnIndex, AnItem);
end;
function TcxTreeListReportLinkFormatter.GetNodeStateImageCellSides(ANode: TcxTreeListNode;
AnIndex: Integer): TdxCellSides;
begin
Result := [];
if ReportLink.OptionsView.Borders and not Adapter.HasImages(ANode) then
Result := [csRight];
end;
function TcxTreeListReportLinkFormatter.GetNodeStateImageClass: TdxReportCellGraphicClass;
begin
Result := TdxReportCellGraphic;
end;
function TcxTreeListReportLinkFormatter.GetNodeStateImageViewParams(ANode: TcxTreeListNode;
AnIndex: Integer): TdxReportItemViewParams;
begin
FillChar(Result, SizeOf(Result), 0);
if ReportLink.OptionsFormatting.UseNativeStyles then
if CanProcessSelectionStyle(ANode) then
ReportLink.Styles.GetSelectionParams(Result.NativeParams)
else
ReportLink.Styles.GetImagesParams(ANode, Result.NativeParams)
else
if CanProcessSelectionStyle(ANode) then
Result.NativeParams := Adapter.GetSelectionViewParams
else
Result.NativeParams := Adapter.GetIndentViewParams(ANode, AnIndex);
Result.CellSides := GetNodeStateImageCellSides(ANode, AnIndex);
Result.Transparent := IsColorTransparent(Result.NativeParams.Color); // ReportLink.FixedTransparent;
end;
function TcxTreeListReportLinkFormatter.QueryInterface(const IID: TGUID; out Obj): HResult;
begin
if GetInterface(IID, Obj) then
Result := 0
else
Result := E_NOINTERFACE;
end;
function TcxTreeListReportLinkFormatter._AddRef: Integer;
begin
Result := 1;
end;
function TcxTreeListReportLinkFormatter._Release: Integer;
begin
Result := 1;
end;
function TcxTreeListReportLinkFormatter.IdxPSCellParams_GetAutoHeight: Boolean;
begin
Result := Adapter.CellAutoHeight;
end;
function TcxTreeListReportLinkFormatter.IdxPSCellParams_GetDC: HDC;
begin
Result := Self.DC;
end;
function TcxTreeListReportLinkFormatter.IdxPSCellParams_GetDisplayGraphicsAsText: Boolean;
begin
Result := ReportLink.OptionsRefinements.DisplayGraphicsAsText;
end;
function TcxTreeListReportLinkFormatter.IdxPSCellParams_GetEndEllipsis: Boolean;
begin
Result := Adapter.CellEndEllipsis;
end;
function TcxTreeListReportLinkFormatter.IdxPSCellParams_GetFlatCheckMarks: Boolean;
begin
Result := ReportLink.OptionsRefinements.FlatCheckMarks;
end;
function TcxTreeListReportLinkFormatter.IdxPSCellParams_GetGraphicsText: string;
begin
Result := ReportLink.OptionsRefinements.GraphicsText;
end;
function TcxTreeListReportLinkFormatter.IdxPSCellParams_GetMultiline: Boolean;
begin
Result := Adapter.CellMultiline;
end;
function TcxTreeListReportLinkFormatter.IdxPSCellParams_GetTransparentGraphics: Boolean;
begin
Result := ReportLink.OptionsRefinements.TransparentGraphics;
end;
function TcxTreeListReportLinkFormatter.IdxPSCellParams2_GetPreviewMarginLeft: Integer;
begin
Result := Adapter.PreviewLeftIndent;
end;
function TcxTreeListReportLinkFormatter.IdxPSCellParams2_GetPreviewMarginRight: Integer;
begin
Result := Adapter.PreviewRightIndent;
end;
function TcxTreeListReportLinkFormatter.IdxPSCellParams2_GetPreviewMaxHeight: Integer;
begin
if PreviewAutoHeight then
Result := -1
else
Result := PreviewLineHeight * PreviewMaxLineCount;
end;
function TcxTreeListReportLinkFormatter.IdxPSCellParams2_GetPreviewMaxLineCount: Integer;
begin
Result := PreviewMaxLineCount;
end;
function TcxTreeListReportLinkFormatter.IdxPSCellParams2_GetRichEditGraphicClass: TGraphicClass;
const
GraphicClasses: array[Boolean] of TGraphicClass = (TMetafile, TBitmap);
begin
Result := GraphicClasses[IdxPSCellParams2_GetRichEditTransparent];
end;
function TcxTreeListReportLinkFormatter.IdxPSCellParams2_GetRichEditTransparent: Boolean;
begin
{$IFDEF DXVER500}
Result := ReportLink.OptionsRefinements.TransparentRichEdits;
{$ELSE}
Result := False;
{$ENDIF}
end;
procedure TcxTreeListReportLinkFormatter.AddDelimiters;
begin
with ReportLink.OptionsPagination do
begin
if Band or Column then AddHorizontalDelimiters;
if Node then AddVerticalDelimiters;
end;
end;
procedure TcxTreeListReportLinkFormatter.AddHorizontalDelimiters;
var
I: Integer;
R: TRect;
AColumnPlace: TcxTreeListColumnPlace;
ABandPlace: TcxTreeListCustomBandPlace;
begin
if ReportLink.OptionsPagination.Band then
begin
for I := 0 to BandCount - 1 do
begin
ABandPlace := ItemPlaceController.ItemsByBand[Bands[I]];
if ABandPlace <> nil then
begin
R := ABandPlace.Bounds;
ReportLink.AddHorizontalDelimiter(R.Left);
ReportLink.AddHorizontalDelimiter(R.Right);
end;
end;
end
else
for I := 0 to ColumnCount - 1 do
begin
AColumnPlace := ItemPlaceController.ItemsByColumn[Columns[I]];
if AColumnPlace <> nil then
begin
R := AColumnPlace.HeaderCellBounds;
ReportLink.AddHorizontalDelimiter(R.Left);
ReportLink.AddHorizontalDelimiter(R.Right);
end;
end;
end;
procedure TcxTreeListReportLinkFormatter.AddVerticalDelimiters;
var
I: Integer;
begin
for I := 0 to Builder.ReportRowCount - 1 do
ReportLink.AddVerticalDelimiter(Builder.ReportRows[I]);
end;
procedure TcxTreeListReportLinkFormatter.AfterBuilding;
begin
if not Builder.IsAborted then
begin
FormatLookAndFeelItems;
AddDelimiters;
Builder.ReportCells.BorderColor := GridLinesColor;
Builder.ReportCells.TreeLineColor := Adapter.TreeLinesColor;
Builder.ReportCells.TreeLineStyle := TreeLinesStyleMap[Adapter.TreeLinesStyle];
end;
end;
procedure TcxTreeListReportLinkFormatter.BeforeBuilding;
begin
CreateItems;
Adapter.Calculate;
CalculateLineHeights;
ItemPlaceController.Refresh;
ItemPlaceController.Calculate;
end;
procedure TcxTreeListReportLinkFormatter.CalculateLineHeights;
var
I: Integer;
AColumn: TcxTreeListColumn;
begin
FBandLineHeight := 0;
if Adapter.IsDefaultRowHeightAssigned then
FDetailsLineHeight := Adapter.DefaultRowHeight
else
FDetailsLineHeight := DefaultDataRowLineHeight;
FFooterLineHeight := 0;
FHeaderLineHeight := 0;
for I := 0 to ColumnCount - 1 do
begin
AColumn := Columns[I];
CalculateHeight(GetFooterCellViewParams(AColumn), FFooterLineHeight);
CalculateHeight(GetHeaderItemViewParams(AColumn), FHeaderLineHeight);
if not Adapter.IsDefaultRowHeightAssigned and not AColumn.IsPreview then
CalculateNodeHeight(nil, GetNodeItemViewParams(AColumn, Nodes[0]), FDetailsLineHeight);
end;
Inc(FFooterLineHeight, 2 * FooterItemInflateVert);
FPreviewLineHeight := Adapter.DefaultRowHeight;
if PreviewColumn <> nil then
CalculateHeight(GetPreviewViewParams(PreviewColumn, Nodes[0]), FPreviewLineHeight);
for I := 0 to BandCount - 1 do
CalculateHeight(GetBandItemViewParams(Bands[I]), FBandLineHeight);
end;
function TcxTreeListReportLinkFormatter.CanProcessSelectionStyle(ANode: TcxTreeListNode): Boolean;
begin
Result := (ANode <> nil) and ReportLink.OptionsFormatting.ConsumeSelectionStyle and IsSelectedNode(ANode);
if Result and not ReportLink.OptionsFormatting.UseNativeStyles then
Result := Adapter.HasSelectionStyle;
end;
procedure TcxTreeListReportLinkFormatter.CreateNodeList;
function IsNodeProcessed(ANode: TcxTreeListNode): Boolean;
var
Helper: TcxTreeListNodeHelper;
begin
Helper := Adapter.Helpers[ANode];
Result := not Adapter.MultiSelection or not ReportLink.OptionsSelection.ProcessSelection or
(ANode.Selected or Helper.HasSelectedChildren or
(not ReportLink.OptionsSelection.ProcessExactSelection and Helper.HasSelectedParents));
end;
procedure ProcessNode(ANode: TcxTreeListNode);
var
I: Integer;
Node: TcxTreeListNode;
begin
FNodes.Add(ANode);
if (ANode.Count > 0) and (ReportLink.OptionsExpanding.ExplicitlyExpandNodes or
(ANode.Expanded or (ReportLink.OptionsExpanding.AutoExpandNodes and ANode.CanExpand))) then
for I := 0 to ANode.Count - 1 do
begin
Node := ANode[I];
if IsNodeProcessed(Node) then ProcessNode(Node);
end;
end;
var
I: Integer;
Node: TcxTreeListNode;
begin
FNodes.Clear;
for I := 0 to Adapter.NodeCount - 1 do
begin
Node := Adapter.Nodes[I];
if IsNodeProcessed(Node) then ProcessNode(Node);
end;
end;
function TcxTreeListReportLinkFormatter.IsSelectedNode(ANode: TcxTreeListNode): Boolean;
begin
Result := ReportLink.OptionsSelection.ProcessSelection or ANode.Selected;
end;
function TcxTreeListReportLinkFormatter.GetBackgroundBitmap(Index: Integer): TBitmap;
begin
if ReportLink.OptionsFormatting.UseNativeStyles then
Result := ReportLink.Styles.GetBitmap(MapStyleBackgroundBitmapIndex(Index))
else
Result := Adapter.GetBackgroundBitmap(Index);
end;
function TcxTreeListReportLinkFormatter.GetBackgroundBitmapIndex(Index: Integer): Integer;
begin
Result := ReportLink.AddBackgroundBitmapToPool(GetBackgroundBitmap(Index));
end;
function TcxTreeListReportLinkFormatter.HasBackgroundBitmap(Index: Integer): Boolean;
var
Bitmap: TBitmap;
begin
if not ReportLink.OptionsFormatting.SuppressBackgroundBitmaps then
begin
Bitmap := GetBackgroundBitmap(Index);
Result := (Bitmap <> nil) and not Bitmap.Empty;
end
else
Result := False;
end;
function TcxTreeListReportLinkFormatter.MapStyleBackgroundBitmapIndex(ATreeListBackgroundBitmapIndex: Integer): Integer;
begin
case ATreeListBackgroundBitmapIndex of
tlsv_BandBackground:
Result := vspsTreeListBandBackground;
tlsv_BandHeader:
Result := vspsTreeListBandHeader;
tlsv_Content:
Result := vspsTreeListContent;
tlsv_ContentOdd:
Result := vspsTreeListContentOdd;
tlsv_ContentEven:
Result := vspsTreeListContentEven;
tlsv_ColumnFooter:
Result := vspsTreeListFooter;
tlsv_ColumnHeader:
Result := vspsTreeListHeader;
tlsv_Footer:
Result := vspsTreeListFooterRow;
tlsv_Preview:
Result := vspsTreeListPreview;
else
Result := 0;
end;
end;
procedure TcxTreeListReportLinkFormatter.CalculateHeight(const AParams: TdxReportItemViewParams;
var AHeight: Integer);
begin
AHeight := Max(AHeight, CalculatePatternHeight(AParams));
end;
procedure TcxTreeListReportLinkFormatter.CalculateNodeHeight(ANode: TcxTreeListNode;
const AParams: TdxReportItemViewParams; var AHeight: Integer);
begin
AHeight := Max(Max(Max(AHeight, CalculatePatternHeight(AParams)),
Adapter.GetImagesHeight(ANode)), Adapter.GetStateImagesHeight(ANode));
end;
function TcxTreeListReportLinkFormatter.CalculatePatternHeight(const AParams: TdxReportItemViewParams): Integer;
begin
Result := Renderer.CalcTextPatternHeight(DC, AParams.NativeParams.Font);
end;
procedure TcxTreeListReportLinkFormatter.CreateBands;
var
I: Integer;
Band: TcxTreeListBand;
begin
FBands.Clear;
for I := 0 to Adapter.BandCount - 1 do
begin
Band := Adapter.Bands[I];
if Band.ActuallyVisible then FBands.Add(Band);
end;
end;
procedure TcxTreeListReportLinkFormatter.CreateColumns;
var
I: Integer;
AColumn: TcxTreeListColumn;
begin
FColumns.Clear;
for I := 0 to Adapter.ColumnCount - 1 do
begin
AColumn := Adapter.Columns[I];
if AColumn.ActuallyVisible then FColumns.Add(AColumn);
end;
end;
procedure TcxTreeListReportLinkFormatter.CreateItems;
begin
CreateColumns;
CreateBands;
CreateSummaryItems;
end;
procedure TcxTreeListReportLinkFormatter.CreateSummaryItems;
procedure InternalCreateSummaryItems(AColumnIndex: Integer;
AVisibleSummaryItems: TcxTreeListReportLinkSummaryItems; ASummaryItems: TcxTreeListSummaryItems);
var
ASummaryIndex, AVisibleIndex: Integer;
begin
AVisibleIndex := 0;
SetLength(AVisibleSummaryItems[AColumnIndex], ASummaryItems.VisibleCount);
for ASummaryIndex := 0 to ASummaryItems.Count - 1 do
if ASummaryItems[ASummaryIndex].Visible and (ASummaryItems[ASummaryIndex].Kind <> skNone) then
begin
AVisibleSummaryItems[AColumnIndex, AVisibleIndex] := ASummaryItems[ASummaryIndex];
Inc(AVisibleIndex);
end;
end;
var
I: Integer;
begin
SetLength(FGroupFooterSummaryItems, ColumnCount);
SetLength(FFooterSummaryItems, ColumnCount);
for I := 0 to ColumnCount - 1 do
begin
InternalCreateSummaryItems(I, FFooterSummaryItems,
Columns[I].Summary.FooterSummaryItems);
InternalCreateSummaryItems(I, FGroupFooterSummaryItems,
Columns[I].Summary.GroupFooterSummaryItems);
end;
end;
function TcxTreeListReportLinkFormatter.GetFooterCellCount(AColumn: TcxTreeListColumn; ANode: TcxTreeListNode): Integer;
begin
if HasFooterCell(AColumn, ANode) then
Result := IfThen(Adapter.FMultiRows, 1, Length(GetSummaryItems(ANode)[FColumns.IndexOf(AColumn)]))
else
Result := 0;
end;
function TcxTreeListReportLinkFormatter.GetNodeIndent(ANode: TcxTreeListNode): Integer;
begin
Result := Adapter.IndentWidth * IndentCounts[ANode] + Adapter.GetImagesWidth(ANode) +
Adapter.GetStateImagesWidth(ANode) + Adapter.GetCheckWidth(ANode);
end;
function TcxTreeListReportLinkFormatter.GetNodeParent(ANode: TcxTreeListNode;
ALevel: Integer): TcxTreeListNode;
begin
Result := ANode;
while ALevel > 0 do
begin
Result := Result.Parent;
Dec(ALevel);
end;
end;
function TcxTreeListReportLinkFormatter.GetNextNode(ANode: TcxTreeListNode): TcxTreeListNode;
var
Index: Integer;
begin
Index := IndexOfNode(ANode);
if Index < NodeCount - 1 then
Result := Nodes[Index + 1]
else
Result := nil;
end;
function TcxTreeListReportLinkFormatter.GetPrevNode(ANode: TcxTreeListNode): TcxTreeListNode;
var
Index: Integer;
begin
Index := IndexOfNode(ANode);
if Index > 0 then
Result := Nodes[Index - 1]
else
Result := nil;
end;
function TcxTreeListReportLinkFormatter.GetStyleFontIndex(const AParams: TdxReportItemViewParams): Integer;
begin
if AParams.NativeParams.Font <> nil then
begin
FFont.Assign(AParams.NativeParams.Font);
if not dxPSUtl.dxIsTrueTypeFont(FFont) then
FFont.Name := ReportLink.Font.Name;
FFont.Color := ColorToRGB(AParams.NativeParams.TextColor);
FFont.Style := FFont.Style + AParams.FontStyle;
Result := ReportLink.AddFontToPool(FFont);
end
else
Result := 0;
end;
function TcxTreeListReportLinkFormatter.GetSummaryItems(ANode: TcxTreeListNode): TcxTreeListReportLinkSummaryItems;
begin
if ANode = Adapter.TreeList.Root then
Result := FFooterSummaryItems
else
Result := FGroupFooterSummaryItems;
end;
function TcxTreeListReportLinkFormatter.HasFooterCell(AColumn: TcxTreeListColumn; ANode: TcxTreeListNode): Boolean;
begin
if ANode = Adapter.TreeList.Root then
Result := AColumn.Options.Footer
else
Result := AColumn.Options.GroupFooter;
Result := Result and (Length(GetSummaryItems(ANode)[FColumns.IndexOf(AColumn)]) > 0);
end;
function TcxTreeListReportLinkFormatter.HasParent(ANode: TcxTreeListNode): Boolean;
begin
Result := ANode.Level > 0;
end;
function TcxTreeListReportLinkFormatter.IndexOfNode(ANode: TcxTreeListNode): Integer;
begin
Result := FNodes.IndexOf(ANode);
end;
function TcxTreeListReportLinkFormatter.IsColorTransparent(AColor: TColor): Boolean;
begin
Result := ColorToRGB(AColor) = ColorToRGB(TransparentColor);
end;
function TcxTreeListReportLinkFormatter.IsFirstNode(ANode: TcxTreeListNode): Boolean;
begin
Result := ANode = FNodes.First;
end;
function TcxTreeListReportLinkFormatter.IsLastNode(ANode: TcxTreeListNode): Boolean;
begin
Result := ANode = FNodes.Last;
end;
function TcxTreeListReportLinkFormatter.IsNodeExpanded(ANode: TcxTreeListNode): Boolean;
var
NextNode: TcxTreeListNode;
begin
Result := ANode.Expanded;
if not Result then
begin
NextNode := GetNextNode(ANode);
Result := (NextNode <> nil) and (NextNode.Level > ANode.Level);
end;
end;
function TcxTreeListReportLinkFormatter.IsNodeFirstChild(ANode: TcxTreeListNode): Boolean;
begin
Result := ANode.GetPrevSiblingVisible = nil;
end;
function TcxTreeListReportLinkFormatter.IsNodeLastChild(ANode: TcxTreeListNode): Boolean;
begin
Result := ANode.GetNextSiblingVisible = nil;
end;
function TcxTreeListReportLinkFormatter.IsOddNode(ANode: TcxTreeListNode): Boolean;
begin
Result := Odd(FNodes.IndexOf(ANode));
end;
function TcxTreeListReportLinkFormatter.IsNodeSelected(ANode: TcxTreeListNode): Boolean;
begin
Result := ANode.Selected;
end;
procedure TcxTreeListReportLinkFormatter.RegisterLookAndFeelItem(AnItem: TdxReportVisualItem;
AEdgeStyle: TdxCellEdgeStyle);
begin
AnItem.EdgeMode := cem3DEffects;
AnItem.Edge3DStyle := AEdgeStyle;
FLookAndFeelItems.Add(AnItem);
end;
procedure TcxTreeListReportLinkFormatter.SetViewParams(AnItem: TdxReportVisualItem;
const AParams: TdxReportItemViewParams);
begin
with AnItem do
begin
CellSides := AParams.CellSides;
Color := ColorToRGB(AParams.NativeParams.Color);
FontIndex := GetStyleFontIndex(AParams);
Transparent := AParams.Transparent;
end;
end;
function TcxTreeListReportLinkFormatter.MakeIndentIndex(AnIndex: Integer): DWORD;
begin
Result := ReportLink.MakeIndentIndex(AnIndex);
end;
function TcxTreeListReportLinkFormatter.GetAutoWidth: Boolean;
begin
Result := ReportLink.OptionsSize.AutoWidth;
end;
function TcxTreeListReportLinkFormatter.GetAvailableWidth: Integer;
var
AControllerIntf: IdxReportLinkController;
R: TRect;
begin
if AutoWidth then
if ReportLink.IsAggregated and
Supports(TObject(ReportLink.Controller), IdxReportLinkController, AControllerIntf) then
R := AControllerIntf.GetControlSiteBounds(ReportLink.TreeList)
else
R := ReportLink.RealPrinterPage.PaintRectPixels
else
R := Adapter.TreeList.ClientBounds;
Result := R.Right - R.Left - 1;
end;
function TcxTreeListReportLinkFormatter.GetBandCount: Integer;
begin
Result := FBands.Count;
end;
function TcxTreeListReportLinkFormatter.GetBands(AIndex: Integer): TcxTreeListBand;
begin
Result := FBands[AIndex];
end;
function TcxTreeListReportLinkFormatter.GetColumnCount: Integer;
begin
Result := FColumns.Count;
end;
function TcxTreeListReportLinkFormatter.GetColumns(AIndex: Integer): TcxTreeListColumn;
begin
Result := FColumns[AIndex];
end;
function TcxTreeListReportLinkFormatter.GetDC: HDC;
begin
Result := ReportLink.ScreenDC;
end;
function TcxTreeListReportLinkFormatter.GetExpandButtonColor: TColor;
begin
Result := ExpandButtonInteriorColors[Adapter.TreeLinesStyle = tllsSolid];
end;
function TcxTreeListReportLinkFormatter.GetExpandButtonSize: Integer;
begin
Result := DefaultExpandButtonSize;
end;
function TcxTreeListReportLinkFormatter.GetGridLinesColor: TColor;
begin
Result := ReportLink.OptionsFormatting.GridLineColor;
if Result = clDefault then
Result := Adapter.GridLinesColor;
end;
function TcxTreeListReportLinkFormatter.GetHasNodeSeparator: Boolean;
begin
Result := NodeSeparatorThickness > 0;
end;
function TcxTreeListReportLinkFormatter.GetHasPreview: Boolean;
begin
Result := Adapter.HasPreview and ShowPreview and (PreviewAutoHeight or (PreviewMaxLineCount > 0));
end;
function TcxTreeListReportLinkFormatter.GetIndentCount(Node: TcxTreeListNode): Integer;
begin
Result := Node.Level;
if Adapter.ShowRoot then Inc(Result);
end;
function TcxTreeListReportLinkFormatter.GetIsNodeColorUsedForIndents: Boolean;
begin
Result := Adapter.IsNodeColorUsedForIndents;
end;
function TcxTreeListReportLinkFormatter.GetLookAndFeelItem(Index: Integer): TdxReportVisualItem;
begin
Result := TdxReportVisualItem(FLookAndFeelItems[Index]);
end;
function TcxTreeListReportLinkFormatter.GetLookAndFeelItemCount: Integer;
begin
Result := FLookAndFeelItems.Count;
end;
function TcxTreeListReportLinkFormatter.GetNode(Index: Integer): TcxTreeListNode;
begin
Result := TcxTreeListNode(FNodes[Index]);
end;
function TcxTreeListReportLinkFormatter.GetNodeCount: Integer;
begin
Result := FNodes.Count;
end;
function TcxTreeListReportLinkFormatter.GetNodeSeparatorColor: TColor;
begin
Result := ReportLink.OptionsFormatting.ActualNodeSeparatorColor;
end;
function TcxTreeListReportLinkFormatter.GetNodeSeparatorThickness: Integer;
begin
Result := ReportLink.OptionsFormatting.NodeSeparatorThickness;
end;
function TcxTreeListReportLinkFormatter.GetPreviewAutoHeight: Boolean;
begin
Result := ReportLink.OptionsPreview.AutoHeight;
end;
function TcxTreeListReportLinkFormatter.GetPreviewColumn: TcxTreeListColumn;
begin
Result := Adapter.PreviewColumn;
end;
function TcxTreeListReportLinkFormatter.GetPreviewMaxLineCount: Integer;
begin
Result := ReportLink.OptionsPreview.MaxLineCount;
end;
function TcxTreeListReportLinkFormatter.GetRenderer: TdxPSReportRenderer;
begin
Result := ReportLink.Renderer;
end;
function TcxTreeListReportLinkFormatter.GetShowBandHeaders: Boolean;
begin
Result := ReportLink.OptionsView.BandHeaders;
end;
function TcxTreeListReportLinkFormatter.GetShowFooters: Boolean;
begin
Result := ReportLink.OptionsView.Footers;
end;
function TcxTreeListReportLinkFormatter.GetShowHeaders: Boolean;
begin
Result := ReportLink.OptionsView.Headers;
end;
function TcxTreeListReportLinkFormatter.GetShowPreview: Boolean;
begin
Result := ReportLink.OptionsPreview.Visible;
end;
function TcxTreeListReportLinkFormatter.GetUseLookAndFeelColors: Boolean;
begin
Result := ReportLink.OptionsFormatting.UseLookAndFeelColors;
end;
function TcxTreeListReportLinkFormatter.GetViewWidth: Integer;
begin
Result := ItemPlaceController.Width;
end;
function TcxTreeListReportLinkFormatter.GetTreeLinesColor: TColor;
begin
Result := Adapter.TreeLinesColor;
end;
function TcxTreeListReportLinkFormatter.GetTreeLinesStyle: TcxTreeListTreeLineStyle;
begin
Result := Adapter.TreeLinesStyle;
end;
procedure TcxTreeListReportLinkFormatter.FormatLookAndFeelItems;
const
Borders3D: array[TdxCellEdgeStyle, Boolean] of TdxPSCellBorderClass =
((TdxPSCellRaisedBorder, TdxPSCellRaisedSoftBorder),
(TdxPSCellSunkenBorder, TdxPSCellSunkenSoftBorder));
var
I: Integer;
begin
for I := 0 to LookAndFeelItemCount - 1 do
with LookAndFeelItems[I] do
if ReportLink.Effects3D then
BorderClass := Borders3D[Edge3DStyle, ReportLink.Soft3D]
else
BorderClass := TdxPSCellUltraFlatBorder;
end;
{ TcxTreeListReportLinkOptionsExpanding }
procedure TcxTreeListReportLinkOptionsExpanding.Assign(Source: TPersistent);
begin
if Source is TcxTreeListReportLinkOptionsExpanding then
with TcxTreeListReportLinkOptionsExpanding(Source) do
begin
Self.AutoExpandNodes := AutoExpandNodes;
Self.ExplicitlyExpandNodes := ExplicitlyExpandNodes;
end;
inherited;
end;
procedure TcxTreeListReportLinkOptionsExpanding.RestoreDefaults;
begin
inherited;
AutoExpandNodes := False;
ExplicitlyExpandNodes := False;
end;
function TcxTreeListReportLinkOptionsExpanding.DesignerTabIndex: Integer;
begin
Result := 1;
end;
function TcxTreeListReportLinkOptionsExpanding.GetReportLink: TcxTreeListCustomReportLink;
begin
Result := inherited ReportLink as TcxTreeListCustomReportLink;
end;
procedure TcxTreeListReportLinkOptionsExpanding.SetAutoExpandNodes(Value: Boolean);
begin
if FAutoExpandNodes <> Value then
begin
FAutoExpandNodes := Value;
Changed;
end;
end;
procedure TcxTreeListReportLinkOptionsExpanding.SetExplicitlyExpandNodes(Value: Boolean);
begin
if FExplicitlyExpandNodes <> Value then
begin
FExplicitlyExpandNodes := Value;
Changed;
end;
end;
{ TcxTreeListReportLinkOptionsFormatting }
procedure TcxTreeListReportLinkOptionsFormatting.Assign(Source: TPersistent);
begin
if Source is TcxTreeListReportLinkOptionsFormatting then
with TcxTreeListReportLinkOptionsFormatting(Source) do
begin
Self.ConsumeSelectionStyle := ConsumeSelectionStyle;
Self.NodeSeparatorColor := NodeSeparatorColor;
Self.NodeSeparatorThickness := NodeSeparatorThickness;
end;
inherited;
end;
procedure TcxTreeListReportLinkOptionsFormatting.RestoreDefaults;
begin
inherited;
ConsumeSelectionStyle := False;
NodeSeparatorColor := clDefault;
NodeSeparatorThickness := 0;
end;
function TcxTreeListReportLinkOptionsFormatting.DesignerTabIndex: Integer;
begin
Result := 2;
end;
function TcxTreeListReportLinkOptionsFormatting.GetActualNodeSeparatorColor: TColor;
begin
Result := NodeSeparatorColor;
if Result = clDefault then
Result := dxPSDefaultTreeListNodeSeparatorColor;
end;
function TcxTreeListReportLinkOptionsFormatting.GetReportLink: TcxTreeListCustomReportLink;
begin
Result := inherited ReportLink as TcxTreeListCustomReportLink;
end;
procedure TcxTreeListReportLinkOptionsFormatting.SetConsumeSelectionStyle(Value: Boolean);
begin
if FConsumeSelectionStyle <> Value then
begin
FConsumeSelectionStyle := Value;
Changed;
end;
end;
procedure TcxTreeListReportLinkOptionsFormatting.SetNodeSeparatorColor(Value: TColor);
begin
if FNodeSeparatorColor <> Value then
begin
FNodeSeparatorColor := Value;
if NodeSeparatorThickness <> 0 then Changed;
end;
end;
procedure TcxTreeListReportLinkOptionsFormatting.SetNodeSeparatorThickness(Value: Integer);
begin
if Value < 0 then Value := 0;
if FNodeSeparatorThickness <> Value then
begin
FNodeSeparatorThickness := Value;
Changed;
end;
end;
{ TcxTreeListReportLinkOptionsOnEveryPage }
function TcxTreeListReportLinkOptionsOnEveryPage.DesignerTabIndex: Integer;
begin
Result := 0;
end;
function TcxTreeListReportLinkOptionsOnEveryPage.GetReportLink: TcxTreeListCustomReportLink;
begin
Result := inherited ReportLink as TcxTreeListCustomReportLink;
end;
{ TcxTreeListReportLinkOptionsPagination }
function TcxTreeListReportLinkOptionsPagination.DesignerTabIndex: Integer;
begin
Result := 0;
end;
function TcxTreeListReportLinkOptionsPagination.GetNode: Boolean;
begin
Result := inherited Row;
end;
function TcxTreeListReportLinkOptionsPagination.GetReportLink: TcxTreeListCustomReportLink;
begin
Result := inherited ReportLink as TcxTreeListCustomReportLink;
end;
procedure TcxTreeListReportLinkOptionsPagination.SetNode(Value: Boolean);
begin
inherited Row := Value;
end;
{ TcxTreeListReportLinkOptionsPreview }
function TcxTreeListReportLinkOptionsPreview.DesignerTabIndex: Integer;
begin
Result := 4;
end;
function TcxTreeListReportLinkOptionsPreview.GetReportLink: TcxTreeListCustomReportLink;
begin
Result := inherited ReportLink as TcxTreeListCustomReportLink;
end;
{ TcxTreeListReportLinkOptionsRefinements }
function TcxTreeListReportLinkOptionsRefinements.DesignerTabIndex: Integer;
begin
Result := 2;
end;
function TcxTreeListReportLinkOptionsRefinements.GetReportLink: TcxTreeListCustomReportLink;
begin
Result := inherited ReportLink as TcxTreeListCustomReportLink;
end;
{ TcxTreeListReportLinkOptionsSelection }
function TcxTreeListReportLinkOptionsSelection.DesignerTabIndex: Integer;
begin
Result := 1;
end;
function TcxTreeListReportLinkOptionsSelection.GetReportLink: TcxTreeListCustomReportLink;
begin
Result := inherited ReportLink as TcxTreeListCustomReportLink;
end;
{ TcxTreeListReportLinkOptionsSize }
function TcxTreeListReportLinkOptionsSize.DesignerTabIndex: Integer;
begin
Result := 1;
end;
function TcxTreeListReportLinkOptionsSize.GetReportLink: TcxTreeListCustomReportLink;
begin
Result := inherited ReportLink as TcxTreeListCustomReportLink;
end;
{ TcxTreeListReportLinkOptionsView }
procedure TcxTreeListReportLinkOptionsView.Assign(Source: TPersistent);
begin
if Source is TcxTreeListReportLinkOptionsView then
with TcxTreeListReportLinkOptionsView(Source) do
begin
Self.Borders := Borders;
Self.TreeLines := TreeLines;
end;
inherited;
end;
procedure TcxTreeListReportLinkOptionsView.RestoreDefaults;
begin
inherited;
Borders := True;
TreeLines := True;
end;
function TcxTreeListReportLinkOptionsView.DesignerTabIndex: Integer;
begin
Result := 0;
end;
function TcxTreeListReportLinkOptionsView.GetReportLink: TcxTreeListCustomReportLink;
begin
Result := inherited ReportLink as TcxTreeListCustomReportLink;
end;
procedure TcxTreeListReportLinkOptionsView.SetBorders(Value: Boolean);
begin
if FBorders <> Value then
begin
FBorders := Value;
Changed;
end;
end;
procedure TcxTreeListReportLinkOptionsView.SetTreeLines(Value: Boolean);
begin
if FTreeLines <> Value then
begin
FTreeLines := Value;
Changed;
end;
end;
{ TcxTreeListReportLinkStyles }
procedure TcxTreeListReportLinkStyles.Assign(Source: TPersistent);
begin
inherited;
if Source is TcxTreeListReportLinkStyles then
with TcxTreeListReportLinkStyles(Source) do
begin
Self.BandHeader := BandHeader;
Self.Content := Content;
Self.ContentEven := ContentEven;
Self.ContentOdd := ContentOdd;
Self.Footer := Footer;
Self.FooterRow := FooterRow;
Self.Header := Header;
Self.Preview := Preview;
end;
end;
procedure TcxTreeListReportLinkStyles.GetBandHeaderParams(ABand: TcxTreeListBand;
out AParams: TcxViewParams);
begin
GetViewParams(vspsTreeListBandHeader, ABand, nil, AParams);
end;
procedure TcxTreeListReportLinkStyles.GetColumnFooterParams(ANode: TcxTreeListNode;
AColumn: TcxTreeListColumn; out AParams: TcxViewParams);
begin
GetViewParams(vspsTreeListFooter, ANode, nil, AParams);
end;
procedure TcxTreeListReportLinkStyles.GetColumnHeaderParams(AColumn: TcxTreeListColumn;
out AParams: TcxViewParams);
begin
if AColumn <> nil then
GetViewParams(vspsTreeListHeader, nil, nil, AParams)
else
GetViewParams(vspsTreeListBandBackground, nil, nil, AParams);
end;
procedure TcxTreeListReportLinkStyles.GetContentParams(ANode: TcxTreeListNode;
AColumn: TcxTreeListColumn; out AParams: TcxViewParams);
function IsOddNode(ANode: TcxTreeListNode): Boolean;
var
Builder: TcxTreeListReportLinkBuilder;
begin
Builder := ReportLink.Builder;
if Builder <> nil then
Result := Builder.Formatter.IsOddNode(ANode)
else
Result := Odd(ANode.VisibleIndex);
end;
const
StyleIndexes: array[Boolean] of Integer = (vspsTreeListContentEven, vspsTreeListContentOdd);
begin
if (ANode <> nil) and (GetValue(StyleIndexes[IsOddNode(ANode)]) <> nil) then
GetViewParams(StyleIndexes[IsOddNode(ANode)], ANode, nil, AParams)
else
GetViewParams(vspsTreeListContent, ANode, nil, AParams);
end;
procedure TcxTreeListReportLinkStyles.GetFooterRowParams(out AParams: TcxViewParams);
begin
GetViewParams(vspsTreeListFooterRow, nil, nil, AParams);
end;
procedure TcxTreeListReportLinkStyles.GetImagesParams(ANode: TcxTreeListNode;
out AParams: TcxViewParams);
begin
GetContentParams(ANode, nil, AParams);
end;
procedure TcxTreeListReportLinkStyles.GetIndentParams(ANode: TcxTreeListNode;
AnIndent: Integer; out AParams: TcxViewParams);
function IsNodeColorUsedForIndents: Boolean;
var
Builder: TcxTreeListReportLinkBuilder;
begin
Builder := ReportLink.Builder;
Result := (Builder <> nil) and Builder.Formatter.IsNodeColorUsedForIndents;
end;
begin
if IsNodeColorUsedForIndents then
GetContentParams(ANode, nil, AParams)
else
GetViewParams(vspsTreeListIndent, ANode, nil{AnIndent}, AParams);
end;
procedure TcxTreeListReportLinkStyles.GetPreviewParams(ANode: TcxTreeListNode;
AColumn: TcxTreeListColumn; out AParams: TcxViewParams);
begin
GetViewParams(vspsTreeListPreview, ANode, nil, AParams);
end;
procedure TcxTreeListReportLinkStyles.GetSelectionParams(out AParams: TcxViewParams);
begin
GetViewParams(vspsTreeListSelection, nil, nil, AParams);
end;
function TcxTreeListReportLinkStyles.DesignerTabIndex: Integer;
begin
Result := 3;
end;
procedure TcxTreeListReportLinkStyles.GetDefaultViewParams(Index: Integer; AData: TObject;
out AParams: TcxViewParams);
const
FixedParts = [vspsTreeListBandHeader, vspsTreeListFooter, vspsTreeListFooterRow,
vspsTreeListHeader, vspsTreeListSelection];
begin
inherited;
if ReportLink <> nil then
with AParams do
begin
if Index in FixedParts then
Color := dxPSCore.dxDefaultFixedColor
else
Color := dxPSCore.dxDefaultContentColor; //TreeListReportLink.Color; // ???
Font := ReportLink.Font;
TextColor := Font.Color;
end;
end;
class function TcxTreeListReportLinkStyles.GetStyleCaption(AnIndex: Integer): string;
begin
case AnIndex of
vspsTreeListBandBackground:
Result := cxGetResourceString(@sdxBandBackgroundStyle);
vspsTreeListBandHeader:
Result := cxGetResourceString(@sdxBandHeaderStyle);
vspsTreeListContent:
Result := cxGetResourceString(@sdxContentStyle);
vspsTreeListContentEven:
Result := cxGetResourceString(@sdxContentEvenStyle);
vspsTreeListContentOdd:
Result := cxGetResourceString(@sdxContentOddStyle);
vspsTreeListFooter:
Result := cxGetResourceString(@sdxFooterStyle);
vspsTreeListFooterRow:
Result := cxGetResourceString(@sdxFooterRowStyle);
vspsTreeListHeader:
Result := cxGetResourceString(@sdxHeaderStyle);
vspsTreeListIndent:
Result := cxGetResourceString(@sdxIndentStyle);
vspsTreeListPreview:
Result := cxGetResourceString(@sdxPreviewStyle);
else
Result := cxGetResourceString(@sdxSelectionStyle);
end;
end;
function TcxTreeListReportLinkStyles.GetStyleIndexByCaption(const Caption: string): Integer;
begin
for Result := vspsTreeListFirst to vspsTreeListLast do
if dxPSUtl.dxSameText(Caption, GetStyleCaption(Result)) then
Exit;
Result := -1;
end;
function TcxTreeListReportLinkStyles.GetReportLink: TcxTreeListCustomReportLink;
begin
Result := inherited ReportLink as TcxTreeListCustomReportLink;
end;
{ TcxTreeListReportLinkStyleSheet }
class function TcxTreeListReportLinkStyleSheet.GetStylesClass: TcxCustomStylesClass;
begin
Result := TcxTreeListReportLinkStyles;
end;
function TcxTreeListReportLinkStyleSheet.GetStylesValue: TcxTreeListReportLinkStyles;
begin
if GetStyles is TcxTreeListReportLinkStyles then
Result := TcxTreeListReportLinkStyles(GetStyles)
else
Result := nil;
end;
procedure TcxTreeListReportLinkStyleSheet.SetStylesValue(Value: TcxTreeListReportLinkStyles);
begin
SetStyles(Value);
end;
{ TcxTreeListAttributeHostInfo }
procedure TcxTreeListAttributeHostInfo.Initialize(AParent: TdxReportCell);
begin
Origin := NullPoint;
FParent := AParent;
end;
{ TcxTreeListAttributeHostInfoServices }
constructor TcxTreeListAttributeHostInfoServices.Create(AReportLink: TcxTreeListCustomReportLink);
begin
inherited Create;
FReportLink := AReportLink;
CreateHostInfos;
end;
destructor TcxTreeListAttributeHostInfoServices.Destroy;
begin
DestroyHostInfos;
inherited;
end;
procedure TcxTreeListAttributeHostInfoServices.InitializeHostInfos;
begin
PageDetailsHostInfo.Initialize(PageDetails);
PageFootersHostInfo.Initialize(PageFooters);
PageHeadersHostInfo.Initialize(PageHeaders);
end;
procedure TcxTreeListAttributeHostInfoServices.CreateHostInfos;
begin
FPageDetailsHostInfo := TcxTreeListAttributeHostInfo.Create;
FPageFootersHostInfo := TcxTreeListAttributeHostInfo.Create;
FPageHeadersHostInfo := TcxTreeListAttributeHostInfo.Create;
end;
procedure TcxTreeListAttributeHostInfoServices.DestroyHostInfos;
begin
FreeAndNil(FPageHeadersHostInfo);
FreeAndNil(FPageFootersHostInfo);
FreeAndNil(FPageDetailsHostInfo);
end;
function TcxTreeListAttributeHostInfoServices.GetBandHeadersHostInfo: TcxTreeListAttributeHostInfo;
begin
if CanUseBandHeadersOnEveyPage then
Result := PageHeadersHostInfo
else
Result := PageDetailsHostInfo;
end;
function TcxTreeListAttributeHostInfoServices.GetFootersHostInfo: TcxTreeListAttributeHostInfo;
begin
if CanUseFootersOnEveryPage then
Result := PageFootersHostInfo
else
Result := PageDetailsHostInfo;
end;
function TcxTreeListAttributeHostInfoServices.GetHeadersHostInfo: TcxTreeListAttributeHostInfo;
begin
if CanUseHeadersOnEveryPage then
Result := PageHeadersHostInfo
else
Result := PageDetailsHostInfo;
end;
function TcxTreeListAttributeHostInfoServices.GetInconsistentStateText: string;
begin
if ReportLink.IsAggregated then
Result := cxGetResourceString(@sdxCannotUseOnEveryPageModeInAggregatedState)
else
if IsInconsistentHeadersState then
Result := cxGetResourceString(@sdxTLIncorrectHeadersState)
else
Result := '';
end;
function TcxTreeListAttributeHostInfoServices.GetIsInconsistentState: Boolean;
begin
Result := ReportLink.IsAggregated or IsInconsistentHeadersState;
end;
function TcxTreeListAttributeHostInfoServices.HasCells: Boolean;
begin
Result := ReportLink.ReportCells <> nil;
end;
function TcxTreeListAttributeHostInfoServices.GetArePageFootersAssigned: Boolean;
begin
Result := FootersHostInfo.Parent = ReportLink.ReportCells.FooterCells;
end;
function TcxTreeListAttributeHostInfoServices.GetArePageHeadersAssigned: Boolean;
begin
with ReportLink.ReportCells do
Result := (BandHeadersHostInfo.Parent = HeaderCells) or (HeadersHostInfo.Parent = HeaderCells);
end;
function TcxTreeListAttributeHostInfoServices.GetCanUseBandHeadersOnEveyPage: Boolean;
begin
Result := not ReportLink.IsAggregated and OptionsOnEveryPage.BandHeaders;
end;
function TcxTreeListAttributeHostInfoServices.GetCanUseFootersOnEveryPage: Boolean;
begin
Result := not ReportLink.IsAggregated and OptionsOnEveryPage.Footers;
end;
function TcxTreeListAttributeHostInfoServices.GetCanUseHeadersOnEveryPage: Boolean;
begin
Result := not ReportLink.IsAggregated and OptionsOnEveryPage.Headers and
((BandHeadersHostInfo = PageHeadersHostInfo) or not OptionsView.BandHeaders);
end;
function TcxTreeListAttributeHostInfoServices.GetIsInconsistentHeadersState: Boolean;
begin
Result := OptionsOnEveryPage.Headers and OptionsView.Headers and OptionsView.BandHeaders and not OptionsOnEveryPage.BandHeaders;
end;
function TcxTreeListAttributeHostInfoServices.GetOptionsOnEveryPage: TcxTreeListReportLinkOptionsOnEveryPage;
begin
Result := ReportLink.OptionsOnEveryPage;
end;
function TcxTreeListAttributeHostInfoServices.GetOptionsView: TcxTreeListReportLinkOptionsView;
begin
Result := ReportLink.OptionsView;
end;
function TcxTreeListAttributeHostInfoServices.GetPageDetails: TdxReportCell;
begin
if HasCells then
Result := ReportLink.ReportCells.Cells
else
Result := nil;
end;
function TcxTreeListAttributeHostInfoServices.GetPageFooters: TdxReportCell;
begin
if HasCells then
Result := ReportLink.ReportCells.FooterCells
else
Result := PageDetails;
end;
function TcxTreeListAttributeHostInfoServices.GetPageHeaders: TdxReportCell;
begin
if HasCells then
Result := ReportLink.ReportCells.HeaderCells
else
Result := PageDetails;
end;
{ TcxTreeListCustomReportLink }
constructor TcxTreeListCustomReportLink.Create(AOwner: TComponent);
begin
inherited;
FDelimitersHardVert := TList.Create;
FHostInfoServices := TcxTreeListAttributeHostInfoServices.Create(Self);
FReportRows := TList.Create;
InternalRestoreDefaults;
LinkModified(False);
end;
destructor TcxTreeListCustomReportLink.Destroy;
begin
FreeAndNil(FReportRows);
FreeAndNil(FHostInfoServices);
FreeAndNil(FDelimitersHardVert);
inherited;
end;
procedure TcxTreeListCustomReportLink.AddPageBreak(ANode: TcxTreeListNode);
var
ReportRow: TdxReportCell;
begin
ReportRow := ReportRowsByNode[ANode];
if ReportRow <> nil then
AddVerticalHardDelimiter(ReportRow);
end;
procedure TcxTreeListCustomReportLink.AddPageBreak(const ANodes: array of TcxTreeListNode);
var
I: Integer;
begin
for I := Low(ANodes) to High(ANodes) do
AddPageBreak(ANodes[I]);
end;
procedure TcxTreeListCustomReportLink.AddPageBreak(const ANodes: TcxTreeListNodeArray);
var
I: Integer;
begin
for I := 0 to Length(ANodes) - 1 do
AddPageBreak(ANodes[I]);
end;
procedure TcxTreeListCustomReportLink.AddPageBreak(ANodes: TList);
var
I: Integer;
P: Pointer ;
begin
for I := 0 to ANodes.Count - 1 do
begin
P := ANodes[I];
if TObject(P) is TcxTreeListNode then
AddPageBreak(TcxTreeListNode(P));
end;
end;
procedure TcxTreeListCustomReportLink.ConstructReport(AReportCells: TdxReportCells);
function HasData: Boolean;
begin
Result := (CustomTreeList_GetVisibleColumnCount(TreeList) <> 0) and
(TreeList.Count <> 0);
end;
procedure Build;
begin
FBuilder := CreateBuilder;
try
FBuilder.Build;
finally
FreeAndNil(FBuilder);
end;
end;
procedure CalculateSizes;
procedure CalculateReportPartSizes(ACell: TdxReportCell);
var
Width, I, V: Integer;
begin
if ACell.CellCount > 0 then
begin
Width := 0;
for I := 0 to ACell.CellCount - 1 do
begin
V := ACell.Cells[I].Width;
if Width < V then Width := V;
end;
ACell.BoundsRect := MakeRect(0, 0, Width, ACell[ACell.CellCount - 1].BoundsRect.Bottom);
end;
end;
begin
with AReportCells do
begin
CalculateReportPartSizes(Cells);
if AreFooterCellsAllocated then CalculateReportPartSizes(FooterCells);
if AreHeaderCellsAllocated then CalculateReportPartSizes(HeaderCells);
end;
end;
begin
if TreeList = nil then Exit;
inherited;
if not HasData then Exit;
PrepareConstruct;
try
Build;
if not AbortBuilding then CalculateSizes;
finally
UnprepareConstruct;
end;
end;
procedure TcxTreeListCustomReportLink.ConvertCoords;
begin
inherited;
ConvertDelimiters(DelimitersHardVert);
end;
procedure TcxTreeListCustomReportLink.CustomDraw(AItem: TAbstractdxReportCellData;
ACanvas: TCanvas; ABoundsRect, AClientRect: TRect; var ADone: Boolean);
var
DrawInfo: TcxTreeListCellCustomDrawInfo;
begin
GetItemCustomDrawInfo(AItem, DrawInfo);
with DrawInfo do
case AttributeID of
cxTreeListBandID:
DoCustomDrawBandCell(ACanvas, Band, TdxReportCellImage(AItem), ADone);
cxTreeListFooterID:
DoCustomDrawFooterCell(ACanvas, Column, TdxReportCellString(AItem), ADone);
cxTreeListHeaderID:
DoCustomDrawHeaderCell(ACanvas, Column, TdxReportCellImage(AItem), ADone);
cxTreeListIndentID:
DoCustomDrawIndentCell(ACanvas, Node, Index, AItem, ADone);
cxTreeListNodeID:
DoCustomDrawCell(ACanvas, Node, Column, AItem, ADone);
end;
end;
function TcxTreeListCustomReportLink.GetBreakPagesByHardDelimiters: Boolean;
begin
Result := OptionsPagination.Custom;
end;
procedure TcxTreeListCustomReportLink.GetImageLists(AProc: TdxPSGetImageListProc);
begin
inherited;
AProc(CustomTreeList_GetImages(TreeList));
AProc(CustomTreeList_GetStateImages(TreeList));
end;
function TcxTreeListCustomReportLink.GetRebuildOnPageParamsChange(AUpdateCodes: TdxPrinterPageUpdateCodes): Boolean;
begin
Result := (AUpdateCodes * uaMarginsVert <> []) and OptionsSize.AutoWidth;
end;
function TcxTreeListCustomReportLink.GetUseHardVertDelimiters: Boolean;
begin
Result := OptionsPagination.Custom;
end;
procedure TcxTreeListCustomReportLink.InternalRestoreFromOriginal;
var
TreeListOptionsView: TcxTreeListOptionsView;
TreeListPreview: TcxTreeListPreview;
begin
inherited;
if TreeList <> nil then
begin
OptionsFormatting.LookAndFeelKind := CustomTreeList_GetLookAndFeel(TreeList).Kind;
TreeListPreview := CustomTreeList_GetPreview(TreeList);
with OptionsPreview do
begin
AutoHeight := TreeListPreview.AutoHeight;
MaxLineCount := TreeListPreview.MaxLineCount;
Visible := TreeListPreview.Visible;
end;
TreeListOptionsView := CustomTreeList_GetOptionsView(TreeList);
with OptionsView do
begin
BandHeaders := TreeListOptionsView.Bands;
ExpandButtons := TreeListOptionsView.Buttons;
Footers := TreeListOptionsView.Footer;
Headers := TreeListOptionsView.Headers;
TreeLines := TreeListOptionsView.TreeLineStyle <> tllsNone;
end;
OptionsSize.AutoWidth := TreeListOptionsView.ColumnAutoWidth;
end;
end;
function TcxTreeListCustomReportLink.IsDrawFootersOnEveryPage: Boolean;
begin
Result := HostInfoServices.ArePageFootersAssigned;
end;
function TcxTreeListCustomReportLink.IsDrawHeadersOnEveryPage: Boolean;
begin
Result := HostInfoServices.ArePageHeadersAssigned;
end;
function TcxTreeListCustomReportLink.IsSupportedCustomDraw(Item: TAbstractdxReportCellData): Boolean;
var
DrawInfo: TcxTreeListCellCustomDrawInfo;
begin
Result := inherited IsSupportedCustomDraw(Item) and
(Item <> nil) and IsCustomDrawn(GetItemCustomDrawInfo(Item, DrawInfo));
end;
procedure TcxTreeListCustomReportLink.MakeHardDelimiters(AReportCells: TdxReportCells;
AVertDelimiters: TList);
begin
inherited;
if OptionsPagination.Custom then
try
DoGetCustomPageBreaks;
except
Application.HandleException(Self);
end;
dxPSUtl.dxCopyList(DelimitersHardVert, AVertDelimiters);
end;
function TcxTreeListCustomReportLink.GetAreNativeStylesAvailable: Boolean;
begin
Result := OptionsFormatting.UseNativeStyles;
end;
function TcxTreeListCustomReportLink.GetStylesClass: TdxCustomReportLinkStylesClass;
begin
Result := TcxTreeListReportLinkStyles;
end;
function TcxTreeListCustomReportLink.GetStyleSheetClass: TdxCustomReportLinkStyleSheetClass;
begin
Result := TcxTreeListReportLinkStyleSheet;
end;
function TcxTreeListCustomReportLink.GetStyleSheetPrototype: TdxCustomReportLinkStyleSheet;
begin
Result := DefaultdxPScxTreeListLinkStyleSheet;
end;
procedure TcxTreeListCustomReportLink.PrepareConstruct;
begin
inherited;
DelimitersHardVert.Clear;
FReportRows.Clear;
ReportCells.LookAndFeel := nil;//CreateGroupLookAndFeel(TdxPSReportGroupNullLookAndFeel);
HostInfoServices.InitializeHostInfos;
if OptionsExpanding.ExplicitlyExpandNodes then
TreeList.FullExpand;
end;
procedure TcxTreeListCustomReportLink.DoCustomDrawBandCell(ACanvas: TCanvas;
ABand: TcxTreeListBand; AnItem: TdxReportCellImage; var ADone: Boolean);
begin
if Assigned(FOnCustomDrawBandCell) then
FOnCustomDrawBandCell(Self, ACanvas, ABand, AnItem, ADone);
end;
procedure TcxTreeListCustomReportLink.DoCustomDrawCell(ACanvas: TCanvas;
ANode: TcxTreeListNode; AColumn: TcxTreeListColumn;
AnItem: TAbstractdxReportCellData; var ADone: Boolean);
begin
if Assigned(FOnCustomDrawCell) then
FOnCustomDrawCell(Self, ACanvas, ANode, AColumn, AnItem, ADone);
end;
procedure TcxTreeListCustomReportLink.DoCustomDrawFooterCell(ACanvas: TCanvas;
AColumn: TcxTreeListColumn; AnItem: TdxReportCellString; var ADone: Boolean);
begin
if Assigned(FOnCustomDrawFooterCell) then
FOnCustomDrawFooterCell(Self, ACanvas, AColumn, AnItem, ADone);
end;
procedure TcxTreeListCustomReportLink.DoCustomDrawHeaderCell(ACanvas: TCanvas;
AColumn: TcxTreeListColumn; AnItem: TdxReportCellImage; var ADone: Boolean);
begin
if Assigned(FOnCustomDrawHeaderCell) then
FOnCustomDrawHeaderCell(Self, ACanvas, AColumn, AnItem, ADone);
end;
procedure TcxTreeListCustomReportLink.DoCustomDrawIndentCell(ACanvas: TCanvas;
ANode: TcxTreeListNode; AnIndex: Integer; AnItem: TAbstractdxReportCellData;
var ADone: Boolean);
begin
if Assigned(FOnCustomDrawIndentCell) then
FOnCustomDrawIndentCell(Self, ACanvas, ANode, AnIndex, AnItem, ADone);
end;
procedure TcxTreeListCustomReportLink.DoGetCustomPageBreaks;
begin
if Assigned(FOnGetCustomPageBreaks) then FOnGetCustomPageBreaks(Self);
end;
procedure TcxTreeListCustomReportLink.DoInitializeBandCell(ABand: TcxTreeListBand;
AnItem: TdxReportCellImage);
begin
if Assigned(FOnInitializeBandCell) then
FOnInitializeBandCell(Self, ABand, AnItem);
end;
procedure TcxTreeListCustomReportLink.DoInitializeCell(ANode: TcxTreeListNode;
AColumn: TcxTreeListColumn; AnItem: TAbstractdxReportCellData);
begin
if Assigned(FOnInitializeCell) then
FOnInitializeCell(Self, ANode, AColumn, AnItem);
end;
procedure TcxTreeListCustomReportLink.DoInitializeFooterCell(AColumn: TcxTreeListColumn;
ASummaryCellIndex: Integer; AnItem: TdxReportCellString);
begin
if Assigned(FOnInitializeFooterCell) then
FOnInitializeFooterCell(Self, ASummaryCellIndex, AColumn, AnItem);
end;
procedure TcxTreeListCustomReportLink.DoInitializeHeaderCell(AColumn: TcxTreeListColumn;
AnItem: TdxReportCellImage);
begin
if Assigned(FOnInitializeHeaderCell) then
FOnInitializeHeaderCell(Self, AColumn, AnItem);
end;
procedure TcxTreeListCustomReportLink.DoInitializeIndentCell(ANode: TcxTreeListNode;
AnIndex: Integer; AnItem: TAbstractdxReportCellData);
begin
if Assigned(FOnInitializeIndentCell) then
FOnInitializeIndentCell(Self, ANode, AnIndex, AnItem);
end;
function TcxTreeListCustomReportLink.GetOptionsExpandingClass: TdxCustomReportLinkOptionsExpandingClass;
begin
Result := TcxTreeListReportLinkOptionsExpanding;
end;
function TcxTreeListCustomReportLink.GetOptionsFormattingClass: TdxCustomReportLinkOptionsFormattingClass;
begin
Result := TcxTreeListReportLinkOptionsFormatting;
end;
function TcxTreeListCustomReportLink.GetOptionsOnEveryPageClass: TdxCustomTableControlReportLinkOptionsOnEveryPageClass;
begin
Result := TcxTreeListReportLinkOptionsOnEveryPage;
end;
function TcxTreeListCustomReportLink.GetOptionsPaginationClass: TdxCustomReportLinkOptionsPaginationClass;
begin
Result := TcxTreeListReportLinkOptionsPagination;
end;
function TcxTreeListCustomReportLink.GetOptionsPreviewClass: TdxCustomTableControlReportLinkOptionsPreviewClass;
begin
Result := TcxTreeListReportLinkOptionsPreview;
end;
function TcxTreeListCustomReportLink.GetOptionsRefinementsClass: TdxCustomReportLinkOptionsRefinementsClass;
begin
Result := TcxTreeListReportLinkOptionsRefinements;
end;
function TcxTreeListCustomReportLink.GetOptionsSelectionClass: TdxCustomTableControlReportLinkOptionsSelectionClass;
begin
Result := TcxTreeListReportLinkOptionsSelection;
end;
function TcxTreeListCustomReportLink.GetOptionsSizeClass: TdxCustomReportLinkOptionsSizeClass;
begin
Result := TcxTreeListReportLinkOptionsSize;
end;
function TcxTreeListCustomReportLink.GetOptionsViewClass: TdxCustomReportLinkOptionsViewClass;
begin
Result := TcxTreeListReportLinkOptionsView;
end;
procedure TcxTreeListCustomReportLink.AddReportRow(AReportRow: TdxReportCell);
begin
FReportRows.Add(AReportRow);
end;
procedure TcxTreeListCustomReportLink.AddVerticalHardDelimiter(ADelimiter: TdxReportCell);
begin
AddVerticalHardDelimiter(ADelimiter.AbsoluteRect.Top);
end;
procedure TcxTreeListCustomReportLink.AddVerticalHardDelimiter(ADelimiter: Integer);
begin
FDelimitersHardVert.Add(TObject(ADelimiter));
end;
function TcxTreeListCustomReportLink.CreateBuilder: TcxTreeListReportLinkBuilder;
begin
Result := GetBuilderClass.Create(Self);
end;
class function TcxTreeListCustomReportLink.GetBuilderClass: TcxTreeListReportLinkBuilderClass;
begin
Result := TcxTreeListReportLinkBuilder;
end;
function TcxTreeListCustomReportLink.ExtractIndentIndex(AData: Integer): Integer;
begin
Result := (AData and NodeIndentMask) shr NodeIndentOffset;
end;
function TcxTreeListCustomReportLink.GetItemCustomDrawInfo(AnItem: TdxReportVisualItem;
out ADrawInfo: TcxTreeListCellCustomDrawInfo): TcxTreeListAttributeID;
function IsBand(AData: DWORD): Boolean;
begin
try
Result := IsDelphiObject(AData) and (TObject(AData) is TcxTreeListBand);
except
Result := False;
end;
if Result then
begin
ADrawInfo.Band := TcxTreeListBand(AData);
ADrawInfo.AttributeID := cxTreeListBandID;
end;
end;
function IsColumn(AData: DWORD): Boolean;
begin
try
Result := IsDelphiObject(AData) and (TObject(AData) is TcxTreeListColumn);
except
Result := False;
end;
if Result then
ADrawInfo.Column := TcxTreeListColumn(AData);
end;
function IsFooter(AData: DWORD): Boolean;
begin
try
Result := TClass(AData) = TcxTreeListFooterAttribute;
except
Result := False;
end;
if Result then
ADrawInfo.AttributeID := cxTreeListFooterID;
end;
function IsHeader(AData: Integer): Boolean;
begin
try
Result := IsDelphiObject(AData) and TClass(AData).InheritsFrom(TcxTreeListHeaderAttribute);
except
Result := False;
end;
if Result then
ADrawInfo.AttributeID := cxTreeListHeaderID;
end;
function IsIndent(AData: DWORD): Boolean;
begin
Result := True;
ADrawInfo.Index := ExtractIndentIndex(AData);
ADrawInfo.AttributeID := cxTreeListIndentID;
end;
function IsNode(AData: DWORD): Boolean;
begin
try
Result := IsDelphiObject(AData) and (TObject(AData) is TcxTreeListNode);
except
Result := False;
end;
if Result then
begin
ADrawInfo.Node := TcxTreeListNode(AData);
ADrawInfo.AttributeID := cxTreeListNodeID;
end;
end;
var
Data: DWORD;
begin
FillChar(ADrawInfo, SizeOf(ADrawInfo), 0);
try
try
Data := AnItem.Data;
if IsColumn(Data) then
begin
if AnItem.Parent <> nil then
begin
Data := AnItem.Parent.Data;
if not IsNode(Data) then
if not IsHeader(Data) then IsFooter(Data);
end;
end
else
if not IsBand(Data) then IsIndent(Data);
except
FillChar(ADrawInfo, SizeOf(ADrawInfo), 0);
end;
finally
Result := ADrawInfo.AttributeID;
end;
end;
function TcxTreeListCustomReportLink.IsCustomDrawn(AnAttributeID: TcxTreeListAttributeID): Boolean;
begin
Result := False;
case AnAttributeID of
cxTreeListBandID:
Result := Assigned(FOnCustomDrawBandCell);
cxTreeListFooterID:
Result := Assigned(FOnCustomDrawFooterCell);
cxTreeListHeaderID:
Result := Assigned(FOnCustomDrawHeaderCell);
cxTreeListIndentID:
Result := Assigned(FOnCustomDrawIndentCell);
cxTreeListNodeID:
Result := Assigned(FOnCustomDrawCell);
end;
end;
function TcxTreeListCustomReportLink.MakeIndentIndex(AnIndex: Integer): DWORD;
begin
Result := AnIndex shl NodeIndentOffset;
end;
function TcxTreeListCustomReportLink.GetActiveStyles: TcxTreeListReportLinkStyles;
begin
Result := inherited ActiveStyles as TcxTreeListReportLinkStyles;
end;
function TcxTreeListCustomReportLink.GetDesignWindow: TdxfmTreeListReportLinkDesignWindow;
begin
Result := inherited DesignWindow as TdxfmTreeListReportLinkDesignWindow;
end;
function TcxTreeListCustomReportLink.GetReportRow(Index: Integer): TdxReportCell;
begin
Result := FReportRows[Index];
end;
function TcxTreeListCustomReportLink.GetReportRowByNode(Node: TcxTreeListNode): TdxReportCell;
var
I: Integer;
begin
if (Node <> nil) and not Node.IsFirstVisible then
for I := 0 to ReportRowCount - 1 do
begin
Result := ReportRows[I];
if Result.Data = Integer(Node) then Exit;
end;
Result := nil;
end;
function TcxTreeListCustomReportLink.GetReportRowCount: Integer;
begin
Result := FReportRows.Count;
end;
function TcxTreeListCustomReportLink.GetOptionsExpanding: TcxTreeListReportLinkOptionsExpanding;
begin
Result := inherited OptionsExpanding as TcxTreeListReportLinkOptionsExpanding;
end;
function TcxTreeListCustomReportLink.GetOptionsFormatting: TcxTreeListReportLinkOptionsFormatting;
begin
Result := inherited OptionsFormatting as TcxTreeListReportLinkOptionsFormatting;
end;
function TcxTreeListCustomReportLink.GetOptionsOnEveryPage: TcxTreeListReportLinkOptionsOnEveryPage;
begin
Result := inherited OptionsOnEveryPage as TcxTreeListReportLinkOptionsOnEveryPage;
end;
function TcxTreeListCustomReportLink.GetOptionsPagination: TcxTreeListReportLinkOptionsPagination;
begin
Result := inherited OptionsPagination as TcxTreeListReportLinkOptionsPagination;
end;
function TcxTreeListCustomReportLink.GetOptionsPreview: TcxTreeListReportLinkOptionsPreview;
begin
Result := inherited OptionsPreview as TcxTreeListReportLinkOptionsPreview;
end;
function TcxTreeListCustomReportLink.GetOptionsRefinements: TcxTreeListReportLinkOptionsRefinements;
begin
Result := inherited OptionsRefinements as TcxTreeListReportLinkOptionsRefinements;
end;
function TcxTreeListCustomReportLink.GetOptionsSelection: TcxTreeListReportLinkOptionsSelection;
begin
Result := inherited OptionsSelection as TcxTreeListReportLinkOptionsSelection;
end;
function TcxTreeListCustomReportLink.GetOptionsSize: TcxTreeListReportLinkOptionsSize;
begin
Result := inherited OptionsSize as TcxTreeListReportLinkOptionsSize;
end;
function TcxTreeListCustomReportLink.GetOptionsView: TcxTreeListReportLinkOptionsView;
begin
Result := inherited OptionsView as TcxTreeListReportLinkOptionsView;
end;
function TcxTreeListCustomReportLink.GetStyles: TcxTreeListReportLinkStyles;
begin
Result := inherited Styles as TcxTreeListReportLinkStyles;
end;
function TcxTreeListCustomReportLink.GetTreeList: TcxCustomTreeList;
begin
Result := TcxCustomTreeList(Component);
end;
procedure TcxTreeListCustomReportLink.SetOnCustomDrawBandCell(Value: TcxTreeListReportLinkCustomDrawBandCellEvent);
begin
if @FOnCustomDrawBandCell <> @Value then
begin
FOnCustomDrawBandCell := Value;
if SupportedCustomDraw then LinkModified(True);
end;
end;
procedure TcxTreeListCustomReportLink.SetOnCustomDrawCell(Value: TcxTreeListReportLinkCustomDrawCellEvent);
begin
if @FOnCustomDrawCell <> @Value then
begin
FOnCustomDrawCell := Value;
if SupportedCustomDraw then LinkModified(True);
end;
end;
procedure TcxTreeListCustomReportLink.SetOnCustomDrawFooterCell(Value: TcxTreeListReportLinkCustomDrawFooterCellEvent);
begin
if @FOnCustomDrawFooterCell <> @Value then
begin
FOnCustomDrawFooterCell := Value;
if SupportedCustomDraw then LinkModified(True);
end;
end;
procedure TcxTreeListCustomReportLink.SetOnCustomDrawHeaderCell(Value: TcxTreeListReportLinkCustomDrawHeaderCellEvent);
begin
if @FOnCustomDrawHeaderCell <> @Value then
begin
FOnCustomDrawHeaderCell := Value;
if SupportedCustomDraw then LinkModified(True);
end;
end;
procedure TcxTreeListCustomReportLink.SetOnCustomDrawIndentCell(Value: TcxTreeListReportLinkCustomDrawIndentCellEvent);
begin
if @FOnCustomDrawIndentCell <> @Value then
begin
FOnCustomDrawIndentCell := Value;
if SupportedCustomDraw then LinkModified(True);
end;
end;
procedure TcxTreeListCustomReportLink.SetOptionsExpanding(Value: TcxTreeListReportLinkOptionsExpanding);
begin
inherited OptionsExpanding := Value;
end;
procedure TcxTreeListCustomReportLink.SetOptionsFormatting(Value: TcxTreeListReportLinkOptionsFormatting);
begin
inherited OptionsFormatting := Value;
end;
procedure TcxTreeListCustomReportLink.SetOptionsOnEveryPage(Value: TcxTreeListReportLinkOptionsOnEveryPage);
begin
inherited OptionsOnEveryPage := Value;
end;
procedure TcxTreeListCustomReportLink.SetOptionsPagination(Value: TcxTreeListReportLinkOptionsPagination);
begin
inherited OptionsPagination := Value;
end;
procedure TcxTreeListCustomReportLink.SetOptionsPreview(Value: TcxTreeListReportLinkOptionsPreview);
begin
inherited OptionsPreview := Value;
end;
procedure TcxTreeListCustomReportLink.SetOptionsRefinements(Value: TcxTreeListReportLinkOptionsRefinements);
begin
inherited OptionsRefinements := Value;
end;
procedure TcxTreeListCustomReportLink.SetOptionsSelection(Value: TcxTreeListReportLinkOptionsSelection);
begin
inherited OptionsSelection := Value;
end;
procedure TcxTreeListCustomReportLink.SetOptionsSize(Value: TcxTreeListReportLinkOptionsSize);
begin
inherited OptionsSize := Value;
end;
procedure TcxTreeListCustomReportLink.SetOptionsView(Value: TcxTreeListReportLinkOptionsView);
begin
inherited OptionsView := Value;
end;
procedure TcxTreeListCustomReportLink.SetStyles(Value: TcxTreeListReportLinkStyles);
begin
inherited Styles := Value;
end;
{ TcxTreeListReportLink }
function TcxTreeListReportLink.GetTreeList: TcxTreeList;
begin
Result := TcxTreeList(Component);
end;
{ TcxDBTreeListReportLink }
function TcxDBTreeListReportLink.GetDBTreeList: TcxDBTreeList;
begin
Result := TcxDBTreeList(Component);
end;
{ TcxVirtualTreeListReportLink }
function TcxVirtualTreeListReportLink.GetVirtualTreeList: TcxVirtualTreeList;
begin
Result := TcxVirtualTreeList(Component);
end;
{ TdxfmTreeListReportLinkDesignWindow }
constructor TdxfmTreeListReportLinkDesignWindow.Create(AOwner: TComponent);
begin
HelpContext := dxPSGlbl .dxhccxTreeListReportLinkDesigner;
inherited;
CreateControls;
SetActivePage;
end;
destructor TdxfmTreeListReportLinkDesignWindow.Destroy;
begin
dxPSPopupMan.dxPSPopupMenuController.UnregisterControl(lbxStyles);
inherited;
end;
procedure TdxfmTreeListReportLinkDesignWindow.DoInitialize;
begin
lbxStyles.ReportLinkStyles := ReportLink.ActiveStyles;
inherited DoInitialize;
RefreshStylesList;
InitializePreviewTreeList;
InitializePreviewTreeListStyles;
LoadDataIntoPreviewTreeList;
(*{$IFNDEF DXVER500} {.3}
chbxTransparentRichEdits.Visible := False;
bvlRefinementsSeparator.Top := bvlRefinementsSeparator.Top - 15;
chbxSuppressBackgroundBitmaps.Top := chbxSuppressBackgroundBitmaps.Top - 15;
chbxConsumeSelectionStyle.Top := chbxConsumeSelectionStyle.Top - 15;
{$ENDIF} *)
with ReportLink.OptionsView do
begin
chbxShowBands.Checked := BandHeaders;
chbxShowBorders.Checked := Borders;
chbxShowExpandButtons.Checked := ExpandButtons;
chbxShowFooters.Checked := Footers;
chbxShowHeaders.Checked := Headers;
chbxShowTreeLines.Checked := TreeLines;
end;
with ReportLink.OptionsOnEveryPage do
begin
chbxBandsOnEveryPage.Checked := BandHeaders;
chbxFootersOnEveryPage.Checked := Footers;
chbxHeadersOnEveryPage.Checked := Headers;
end;
with cbxLookAndFeel do
begin
Items.Clear;
Items.AddObject(cxGetResourceString(@sdxLookAndFeelFlat), TObject(lfFlat));
Items.AddObject(cxGetResourceString(@sdxLookAndFeelStandard), TObject(lfStandard));
Items.AddObject(cxGetResourceString(@sdxLookAndFeelUltraFlat), TObject(lfUltraFlat));
ItemIndex := Items.IndexOfObject(TObject(ReportLink.OptionsFormatting.LookAndFeelKind));
end;
with ReportLink.OptionsFormatting do
begin
ccbxSeparatorColor.ColorValue := ActualNodeSeparatorColor;
seSeparatorThickness.AsInteger := NodeSeparatorThickness;
chbxConsumeSelectionStyle.Checked := ConsumeSelectionStyle;
chbxSuppressBackgroundBitmaps.Checked := SuppressBackgroundBitmaps;
chbxUseNativeStyles.Checked := UseNativeStyles;
end;
with ReportLink.OptionsSelection do
begin
chbxProcessSelection.Checked := ProcessSelection;
chbxProcessExactSelection.Checked := ProcessExactSelection;
end;
with ReportLink.OptionsExpanding do
begin
chbxExpandNodes.Checked := AutoExpandNodes;
chbxExplicitlyExpandNodes.Checked := ExplicitlyExpandNodes;
end;
with ReportLink.OptionsSize do
begin
chbxAutoWidth.Checked := AutoWidth;
end;
with ReportLink.OptionsRefinements do
begin
chbxTransparentGraphics.Checked := TransparentGraphics;
chbxDisplayGraphicsAsText.Checked := DisplayGraphicsAsText;
chbxFlatCheckMarks.Checked := FlatCheckMarks;
(*{$IFDEF DXVER500} {.3}
chbxTransparentRichEdits.Checked := TransparentRichEdits;
{$ENDIF} *)
end;
with ReportLink.OptionsPreview do
begin
chbxPreviewVisible.Checked := Visible;
chbxPreviewAutoHeight.Checked := AutoHeight;
sePreviewMaxLineCount.AsInteger := MaxLineCount;
end;
end;
{$IFDEF DELPHI7}
function TdxfmTreeListReportLinkDesignWindow.GetPreviewHost: TCustomPanel;
begin
Result := pnlPreview;
end;
{$ENDIF}
procedure TdxfmTreeListReportLinkDesignWindow.LoadStrings;
procedure AdjustBevelSize(ABevel: TBevel; ALabel: TControl);
var
Right: Integer;
begin
Right := ABevel.BoundsRect.Right;
ABevel.Left := ALabel.Left + ALabel.Width + 10;
ABevel.Width := Right - ABevel.Left;
end;
begin
inherited;
lblPreviewWindow.Caption := DropAmpersand(cxGetResourceString(@sdxPreview));
tshView.Caption := cxGetResourceString(@sdxViewTab);
lblShow.Caption := cxGetResourceString(@sdxShow);
AdjustBevelSize(bvlShow, lblShow);
chbxShowBands.Caption := cxGetResourceString(@sdxBands);
chbxShowHeaders.Caption := cxGetResourceString(@sdxHeaders);
chbxShowFooters.Caption := cxGetResourceString(@sdxFooters);
Bevel2.Width := bvlShow.Width - (Bevel2.Left - bvlShow.Left);
chbxShowBorders.Caption := cxGetResourceString(@sdxBorders);
chbxShowExpandButtons.Caption := cxGetResourceString(@sdxExpandButtons);
chbxShowTreeLines.Caption := cxGetResourceString(@sdxTreeLines);
lblOnEveryPage.Caption := cxGetResourceString(@sdxOnEveryPage);
AdjustBevelSize(bvlOnEveryPage, lblOnEveryPage);
chbxBandsOnEveryPage.Caption := DropAmpersand(cxGetResourceString(@sdxBands));
chbxHeadersOnEveryPage.Caption := DropAmpersand(cxGetResourceString(@sdxHeaders));
chbxFootersOnEveryPage.Caption := DropAmpersand(cxGetResourceString(@sdxFooters));
tshBehaviors.Caption := cxGetResourceString(@sdxBehaviorsTab);
lblSelection.Caption := cxGetResourceString(@sdxSelection);
AdjustBevelSize(bvlSelection, lblSelection);
chbxProcessSelection.Caption := cxGetResourceString(@sdxProcessSelection);
chbxProcessExactSelection.Caption := cxGetResourceString(@sdxProcessExactSelection);
lblExpanding.Caption := cxGetResourceString(@sdxExpanding);
AdjustBevelSize(bvlExpanding, lblExpanding);
chbxExpandNodes.Caption := cxGetResourceString(@sdxNodes);
chbxExplicitlyExpandNodes.Caption := cxGetResourceString(@sdxExplicitlyExpandNodes);
lblSize.Caption := cxGetResourceString(@sdxSize);
AdjustBevelSize(bvlSize, lblSize);
chbxAutoWidth.Caption := cxGetResourceString(@sdxAutoWidth);
tshFormatting.Caption := cxGetResourceString(@sdxFormatting);
lblLookAndFeel.Caption := cxGetResourceString(@sdxLookAndFeel);
AdjustBevelSize(bvlLookAndFeel, lblLookAndFeel);
lblRefinements.Caption := cxGetResourceString(@sdxRefinements);
AdjustBevelSize(bvlRefinements, lblRefinements);
chbxTransparentGraphics.Caption := cxGetResourceString(@sdxTransparentGraphics);
chbxDisplayGraphicsAsText.Caption := DropAmpersand(cxGetResourceString(@sdxDisplayGraphicsAsText));
chbxFlatCheckMarks.Caption := cxGetResourceString(@sdxFlatCheckMarks);
//chbxTransparentRichEdits.Caption := cxGetResourceString(@sdxTransparentRichEdits); {.3}
chbxSuppressBackgroundBitmaps.Caption := cxGetResourceString(@sdxSuppressBackgroundBitmaps);
chbxConsumeSelectionStyle.Caption := cxGetResourceString(@sdxConsumeSelectionStyle);
lblSeparators.Caption := cxGetResourceString(@sdxSeparators);
AdjustBevelSize(bvlSeparator, lblSeparators);
lblSeparatorsColor.Caption := cxGetResourceString(@sdxColor);
lblSeparatorsThickness.Caption := cxGetResourceString(@sdxThickness);
tshStyles.Caption := cxGetResourceString(@sdxStyles);
lblUseNativeStyles.Caption := cxGetResourceString(@sdxUseNativeStyles);
AdjustBevelSize(bvlStyles, lblUseNativeStyles);
btnStyleColor.Caption := cxGetResourceString(@sdxBtnColor);
btnStyleFont.Caption := cxGetResourceString(@sdxBtnFont);
btnStyleBackgroundBitmap.Caption := cxGetResourceString(@sdxBtnTexture);
btnStyleBackgroundBitmapClear.Caption := cxGetResourceString(@sdxBtnTextureClear);
btnStyleRestoreDefaults.Caption := cxGetResourceString(@sdxBtnRestoreDefaults);
btnStylesSaveAs.Caption := cxGetResourceString(@sdxBtnSaveAs);
btnStyleSheetNew.Caption := cxGetResourceString(@sdxBtnNew);
btnStyleSheetCopy.Caption := cxGetResourceString(@sdxBtnCopy);
btnStyleSheetDelete.Caption := cxGetResourceString(@sdxBtnDelete);
btnStyleSheetRename.Caption := cxGetResourceString(@sdxBtnRename);
miStyleColor.Caption := cxGetResourceString(@sdxBtnColor);
miStyleFont.Caption := cxGetResourceString(@sdxBtnFont);
miStyleBackgroundBitmap.Caption := cxGetResourceString(@sdxBtnTexture);
miStyleBackgroundBitmapClear.Caption := cxGetResourceString(@sdxBtnTextureClear);
miStyleRestoreDefaults.Caption := cxGetResourceString(@sdxBtnRestoreDefaults);
miStylesSelectAll.Caption := cxGetResourceString(@sdxSelectAll);
miStylesSaveAs.Caption := cxGetResourceString(@sdxBtnSaveAs);
tshPreview.Caption := cxGetResourceString(@sdxPreviewTab);
lblPreviewOptions.Caption := cxGetResourceString(@sdxOptions);
AdjustBevelSize(bvlPreviewOptions, lblPreviewOptions);
chbxPreviewVisible.Caption := cxGetResourceString(@sdxVisible);
chbxPreviewAutoHeight.Caption := cxGetResourceString(@sdxPreviewAutoHeight);
lblPreviewMaxLineCount.Caption := cxGetResourceString(@sdxPreviewMaxLineCount);
lblStyleSheets.Caption := cxGetResourceString(@sdxStyleSheets);
end;
procedure TdxfmTreeListReportLinkDesignWindow.UpdateControlsState;
begin
inherited;
chbxProcessExactSelection.Enabled := chbxProcessSelection.Checked;
chbxExplicitlyExpandNodes.Enabled := chbxExpandNodes.Checked;
lbxStyles.Enabled := AreNativeStylesAvailable;
btnStyleColor.Enabled := AreNativeStylesAvailable and HasSelectedStyles;
btnStyleFont.Enabled := AreNativeStylesAvailable and HasSelectedStyles;
btnStyleBackgroundBitmap.Enabled := AreNativeStylesAvailable and HasSelectedStyles;
btnStyleBackgroundBitmapClear.Enabled := AreNativeStylesAvailable and HasSelectedStylesWithAssignedBitmap;
btnStyleRestoreDefaults.Enabled := AreNativeStylesAvailable and HasSelectedStyles;
btnStylesSaveAs.Enabled := CanSaveStyles;
lblStyleSheets.Enabled := AreNativeStylesAvailable;
cbxStyleSheets.Enabled := AreNativeStylesAvailable;
btnStyleSheetNew.Enabled := CanCreateStyleSheet;
btnStyleSheetCopy.Enabled := CanCopyStyleSheet;
btnStyleSheetDelete.Enabled := CanDeleteStyleSheet;
btnStyleSheetRename.Enabled := CanRenameStyleSheet;
WarningPaneUpdate;
end;
procedure TdxfmTreeListReportLinkDesignWindow.UpdatePreview;
const
TransparentsMap: array[Boolean] of TcxImageTransparency = (gtOpaque, gtTransparent);
TreeLineStylesMap: array[Boolean] of TcxTreeListTreeLineStyle = (tllsNone, tllsDot);
begin
PreviewTreeList.Enabled := False;
PreviewTreeList.LookAndFeel.Kind := ReportLink.OptionsFormatting.LookAndFeelKind;
PreviewTreeList.LookAndFeel.NativeStyle := False;
PreviewTreeList.Font := ReportLink.Font;
chbxBandsOnEveryPage.Enabled := not ReportLink.IsAggregated;
chbxHeadersOnEveryPage.Enabled := not ReportLink.IsAggregated;
chbxFootersOnEveryPage.Enabled := not ReportLink.IsAggregated;
TcxImageProperties(colManufacturerLogo.Properties).GraphicTransparency :=
TransparentsMap[ReportLink.OptionsRefinements.TransparentGraphics];
PreviewTreeList.OptionsView.Bands := ReportLink.OptionsView.BandHeaders;
PreviewTreeList.OptionsView.Footer := ReportLink.OptionsView.Footers;
PreviewTreeList.OptionsView.Headers := ReportLink.OptionsView.Headers;
PreviewTreeList.OptionsView.Buttons := ReportLink.OptionsView.ExpandButtons;
PreviewTreeList.OptionsView.TreeLineStyle := TreeLineStylesMap[ReportLink.OptionsView.TreeLines];
PreviewTreeList.OptionsView.ShowRoot := (ReportLink.TreeList <> nil) and
CustomTreeList_GetOptionsView(ReportLink.TreeList).ShowRoot;
PreviewTreeList.Preview.Visible := ReportLink.OptionsPreview.Visible;
if ReportLink.TreeList <> nil then
PreviewTreeList.OptionsView.UseNodeColorForIndent :=
CustomTreeList_GetOptionsView(ReportLink.TreeList).UseNodeColorForIndent;
PreviewTreeList.Invalidate;
end;
function TdxfmTreeListReportLinkDesignWindow.GetDesignerTabIndex: Integer;
begin
Result := PageControl1.ActivePage.TabIndex;
end;
procedure TdxfmTreeListReportLinkDesignWindow.SetDesignerTabIndex(Value: Integer);
begin
if Value < 0 then Value := 0;
if Value > PageControl1.PageCount - 1 then
Value := PageControl1.PageCount - 1;
PageControl1.ActivePage := PageControl1.Pages[Value];
end;
procedure TdxfmTreeListReportLinkDesignWindow.DoActiveStyleSheetChanged;
begin
lbxStyles.ReportLinkStyles := ReportLink.ActiveStyles;
inherited;
with cbxStyleSheets do
ItemIndex := Items.IndexOfObject(ActiveStyleSheet);
if not LockControlsUpdate then
begin
Modified := True;
UpdatePreview;
end;
end;
procedure TdxfmTreeListReportLinkDesignWindow.DoFormActivated(AnActive: Boolean);
begin
inherited;
if not AnActive then lbxStyles.HideToolTips;
end;
procedure TdxfmTreeListReportLinkDesignWindow.DoRefreshStylesList;
var
Styles: TcxTreeListReportLinkStyles;
List: TList;
begin
Styles := ReportLink.ActiveStyles;
with lbxStyles.Items do
begin
BeginUpdate;
try
List := TList.Create;
try
SaveSelectedStyles(List);
try
Clear;
AddObject(cxGetResourceString(@sdxBandBackgroundStyle), Styles.BandBackground);
AddObject(cxGetResourceString(@sdxBandHeaderStyle), Styles.BandHeader);
AddObject(cxGetResourceString(@sdxContentStyle), Styles.Content);
AddObject(cxGetResourceString(@sdxContentEvenStyle), Styles.ContentEven);
AddObject(cxGetResourceString(@sdxContentOddStyle), Styles.ContentOdd);
AddObject(cxGetResourceString(@sdxFooterStyle), Styles.Footer);
AddObject(cxGetResourceString(@sdxFooterRowStyle), Styles.FooterRow);
AddObject(cxGetResourceString(@sdxHeaderStyle), Styles.Header);
AddObject(cxGetResourceString(@sdxPreviewStyle), Styles.Preview);
AddObject(cxGetResourceString(@sdxSelectionStyle), Styles.Selection);
finally
RestoreSelectedStyles(List);
end;
finally
List.Free;
end;
finally
EndUpdate;
end;
end;
InitializePreviewTreeListStyles;
end;
procedure TdxfmTreeListReportLinkDesignWindow.DoStyleChanged(const ACaption: string;
AStyle: TcxStyle);
begin
inherited;
UpdatePreviewTreeListStyles(ACaption, AStyle);
end;
procedure TdxfmTreeListReportLinkDesignWindow.DoStylesChanged(AStrings: TStrings;
ARecreate: Boolean);
begin
if ARecreate then
RecreateStylesListBox
else
lbxStyles.Invalidate;
Modified := True;
UpdatePreview;
end;
procedure TdxfmTreeListReportLinkDesignWindow.GetSelectedStyleNames(AStrings: TStrings);
var
I: Integer;
begin
AStrings.Clear;
with lbxStyles do
for I := 0 to Items.Count - 1 do
if Selected[I] then
AStrings.AddObject(Items[I], Items.Objects[I]);
end;
procedure TdxfmTreeListReportLinkDesignWindow.GetStyleNames(out AStrings: TStrings);
begin
AStrings := lbxStyles.Items;
end;
procedure TdxfmTreeListReportLinkDesignWindow.GetStyleSheetNames(out AStrings: TStrings);
begin
AStrings := cbxStyleSheets.Items;
end;
function TdxfmTreeListReportLinkDesignWindow.GetActiveStyle: TcxStyle;
begin
with lbxStyles do
if ItemIndex <> -1 then
Result := TcxStyle(Items.Objects[ItemIndex])
else
Result := nil;
end;
function TdxfmTreeListReportLinkDesignWindow.GetHasSelectedStyles: Boolean;
begin
Result := lbxStyles.SelCount <> 0;
end;
function TdxfmTreeListReportLinkDesignWindow.GetHasSelectedStylesWithAssignedBitmap: Boolean;
var
Styles: TStrings;
I: Integer;
Style: TcxStyle;
begin
Result := True;
Styles := TStringList.Create;
try
GetSelectedStyleNames(Styles);
for I := 0 to Styles.Count - 1 do
begin
Style := TcxStyle(Styles.Objects[I]);
if (Style <> nil) and (Style.Bitmap <> nil) and not Style.Bitmap.Empty then
Exit;
end;
finally
Styles.Free;
end;
Result := False;
end;
function TdxfmTreeListReportLinkDesignWindow.GetReportLink: TcxTreeListCustomReportLink;
begin
Result := inherited ReportLink as TcxTreeListCustomReportLink;
end;
procedure TdxfmTreeListReportLinkDesignWindow.PreviewMaxLineCountChanged(Sender: TObject);
begin
if LockControlsUpdate then Exit;
ReportLink.OptionsPreview.MaxLineCount := TdxPSSpinEdit(Sender).AsInteger;
Modified := True;
end;
procedure TdxfmTreeListReportLinkDesignWindow.SeparatorColorChanged(Sender: TObject);
begin
if LockControlsUpdate then Exit;
if TdxPSColorCombo(Sender).IsAutoColorSelected then
ReportLink.OptionsFormatting.NodeSeparatorColor := clDefault
else
ReportLink.OptionsFormatting.NodeSeparatorColor := TdxPSColorCombo(Sender).ColorValue;
Modified := True;
end;
procedure TdxfmTreeListReportLinkDesignWindow.SeparatorThicknessChanged(Sender: TObject);
begin
if LockControlsUpdate then Exit;
ReportLink.OptionsFormatting.NodeSeparatorThickness := TdxPSSpinEdit(Sender).AsInteger;
Modified := True;
end;
function TdxfmTreeListReportLinkDesignWindow.CanSelectAllStyles: Boolean;
var
I: Integer;
begin
Result := AreNativeStylesAvailable;
if Result then
begin
for I := 0 to lbxStyles.Items.Count - 1 do
if not lbxStyles.Selected[I] then Exit;
Result := False;
end;
end;
procedure TdxfmTreeListReportLinkDesignWindow.CreateControls;
function CreateSpin(AHost: TControl; ALabel: TLabel; ATabOrder: TTabOrder;
AMinValue, AMaxValue, AValue: Integer): TdxPSSpinEdit;
begin
Result := TdxPSSpinEdit.Create(Self);
with Result do
begin
Parent := AHost.Parent;
BoundsRect := AHost.BoundsRect;
TabOrder := ATabOrder;
MinValue := AMinValue;
MaxValue := AMaxValue;
Value := AValue;
DefaultValue := AValue;
end;
ALabel.FocusControl := Result;
end;
function CreateColorCombo(AHost: TControl; ALabel: TLabel; ATabOrder: TTabOrder;
ATag: Integer; AAutoColor: TColor): TdxPSColorCombo;
begin
Result := TdxPSColorCombo.Create(Self);
with TdxPSColorCombo(Result) do
begin
BoundsRect := AHost.BoundsRect;
Tag := MakeTTag(ATag);
Parent := AHost.Parent;
TabOrder := ATabOrder;
ColorTypes := [ctPure];
ShowColorName := True;
ShowAutoColor := True;
AutoColor := AAutoColor;
end;
ALabel.FocusControl := Result;
AHost.Visible := False;
end;
procedure CreateWarningPane;
begin
wpIncorrectOnEveryPageState := TdxPSWarningPane.Create(Self);
wpIncorrectOnEveryPageState.Parent := tshView;
wpIncorrectOnEveryPageState.BoundsRect := bvlWarningHost.BoundsRect;
bvlWarningHost.Visible := False;
end;
procedure CreateStylesListBox;
begin
lbxStyles := TdxStylesListBox.Create(Self);
lbxStyles.Parent := tshStyles;
lbxStyles.BoundsRect := bvlStylesHost.BoundsRect;
lbxStyles.PopupMenu := pmStyles;
lbxStyles.TabOrder := chbxUseNativeStyles.TabOrder + 1;
lbxStyles.OnClick := lbxStylesClick;
bvlStylesHost.Visible := False;
dxPSPopupMan.dxPSPopupMenuController.RegisterControl(lbxStyles);
end;
begin
sePreviewMaxLineCount := CreateSpin(bvlPreviewMaxLineCountHost, lblPreviewMaxLineCount,
chbxPreviewAutoHeight.TabOrder + 1, 0, 1000, 0);
sePreviewMaxLineCount.OnChange := PreviewMaxLineCountChanged;
seSeparatorThickness := CreateSpin(bvlSeparatorThicknessHost, lblSeparatorsThickness,
chbxConsumeSelectionStyle.TabOrder + 1, 0, 16, 0);
seSeparatorThickness.OnChange := SeparatorThicknessChanged;
ccbxSeparatorColor := CreateColorCombo(bvlSeparatorColorHost, lblSeparatorsColor,
seSeparatorThickness.TabOrder + 1, 0, dxPSDefaultTreeListNodeSeparatorColor);
ccbxSeparatorColor.OnChange := SeparatorColorChanged;
CreateWarningPane;
CreateStylesListBox;
end;
procedure TdxfmTreeListReportLinkDesignWindow.CustomDrawBorders(ACanvas: TcxCanvas;
const R: TRect);
var
GridLinesColor: TColor;
begin
with ReportLink do
begin
GridLinesColor := PreviewTreeList.OptionsView.GridLineColor;
{if TreeList <> nil then
GridLinesColor := CustomTreeList_GetOptionsView(TreeList).GridLineColor
else
GridLinesColor := PreviewTreeList.OptionsView.GridLineColor;//clWindowText;}
if GridLinesColor = clDefault then
GridLinesColor := CustomTreeList_GetLookAndFeelPainter(PreviewTreeList).DefaultGridLineColor;
end;
ACanvas.DrawComplexFrame(R, GridLinesColor, GridLinesColor, [bLeft, bBottom, bRight]);
end;
procedure TdxfmTreeListReportLinkDesignWindow.CustomDrawCheckMark(ACanvas: TcxCanvas;
AViewInfo: TcxTreeListEditCellViewInfo);
const
Painters: array[Boolean] of TcxCustomLookAndFeelPainterClass =
(TcxStandardLookAndFeelPainter, TcxUltraFlatLookAndFeelPainter);
var
PrevColor: TColor;
R: TRect;
Params: TcxViewParams;
X, Y: Integer;
CheckValue: Variant;
begin
PrevColor := ACanvas.Brush.Color;
R := AViewInfo.BoundsRect;
Params := PreviewTreeList.Styles.GetContentParams(AViewInfo.Node, AViewInfo.Column);
if Params.Bitmap = nil then
begin
ACanvas.Brush.Color := Params.Color;
ACanvas.FillRect(R);
end
else
dxBkgnd.DrawPicture(Params.Bitmap, ACanvas.Canvas, R, ppmTile, 1, 1, -R.Left, -R.Top);
X := R.Left + (R.Right - R.Left - CheckWidth) div 2;
Y := R.Top + (R.Bottom - R.Top - CheckWidth) div 2;
R := MakeBounds(X, Y, CheckWidth, CheckWidth);
CheckValue := cbsChecked;
if AViewInfo.Node.Index = 0 then
CheckValue := cbsUnchecked;
with Painters[ReportLink.OptionsRefinements.FlatCheckMarks] do
DrawCheckButton(ACanvas, R, cxbsDefault, CheckValue = cbsChecked);
ACanvas.Brush.Color := PrevColor;
end;
procedure TdxfmTreeListReportLinkDesignWindow.CustomDrawFooter(ACanvas: TcxCanvas;
R: TRect; AViewInfo: TcxTreeListFooterCellViewInfo);
begin
if AViewInfo.Hidden then Exit;
case ReportLink.OptionsFormatting.LookAndFeelKind of
lfStandard,
lfFlat:
ACanvas.DrawComplexFrame(R, AViewInfo.ViewParams.TextColor, clBtnHighlight);
lfUltraFlat:
ACanvas.FrameRect(R, AViewInfo.ViewParams.TextColor);
end;
InflateRect(R, -1, -1);
with AViewInfo do
CustomDrawTextRect(ACanvas, R, Text, AlignHorz, AlignVert, ViewParams);
end;
procedure TdxfmTreeListReportLinkDesignWindow.CustomDrawHeader(ACanvas: TcxCanvas;
R: TRect; AViewInfo: TcxTreeListHeaderCellViewInfo);
const
BottomRightColors: array[Boolean] of TColor = (clBtnFace, clBtnShadow);
begin
ACanvas.FrameRect(R, clWindowText);//AViewInfo.ViewParams.TextColor);
if ReportLink.OptionsFormatting.LookAndFeelKind <> lfUltraFlat then
begin
InflateRect(R, -1, -1);
ACanvas.DrawComplexFrame(R, clBtnHighlight,
BottomRightColors[ReportLink.OptionsFormatting.LookAndFeelKind = lfStandard]);
end;
InflateRect(R, -1, -1);
with AViewInfo do
CustomDrawTextRect(ACanvas, R, Text, AlignHorz, AlignVert, ViewParams);
end;
procedure TdxfmTreeListReportLinkDesignWindow.CustomDrawTextRect(ACanvas: TcxCanvas;
R: TRect; const AText: string; AnAlignmentHorz: TAlignment; AnAlignmentVert: TcxAlignmentVert;
AParams: TcxViewParams);
const
AlignmentHorzMap: array[TAlignment] of Integer = (cxAlignLeft, cxAlignRight, cxAlignCenter);
AlignmentVertMap: array[TcxAlignmentVert] of Integer = (cxAlignTop, cxAlignBottom, cxAlignVCenter);
begin
if AParams.Bitmap = nil then
begin
ACanvas.Brush.Color := AParams.Color;
ACanvas.FillRect(R);
end
else
dxBkgnd.DrawPicture(AParams.Bitmap, ACanvas.Canvas, R, ppmTile, 1, 1, - R.Left - 0, - R.Top - 0);
InflateRect(R, -2, -1);
if AParams.Font <> nil then
ACanvas.Font := AParams.Font;
ACanvas.Font.Color := AParams.TextColor;
ACanvas.Brush.Style := bsClear;
ACanvas.DrawText(AText, R,
AlignmentHorzMap[AnAlignmentHorz] or AlignmentVertMap[AnAlignmentVert] or cxSingleLine);
ACanvas.Brush.Style := bsSolid;
end;
function TdxfmTreeListReportLinkDesignWindow.ExtractAlignmentHorz(
AViewInfo: TcxTreeListEditCellViewInfo): TAlignment;
begin
with AViewInfo.Column do
if Properties <> nil then
Result := cxEditProperties_GetAlignment(Properties).Horz
else
Result := taLeftJustify;
end;
function TdxfmTreeListReportLinkDesignWindow.ExtractAlignmentVert(
AViewInfo: TcxTreeListEditCellViewInfo): TcxAlignmentVert;
const
EditAlignmentVertMap: array[TcxEditVertAlignment] of TcxAlignmentVert =
(vaTop, vaBottom, vaCenter);
begin
with AViewInfo.Column do
if Properties <> nil then
Result := EditAlignmentVertMap[cxEditProperties_GetAlignment(Properties).Vert]
else
Result := vaCenter;
end;
procedure TdxfmTreeListReportLinkDesignWindow.InitializePreviewTreeList;
procedure SetupDataBindings;
function GetColumnCaption(AnIndex: Integer): string;
begin
case AnIndex of
0: Result := cxGetResourceString(@sdxManufacturerNameColumnCaption);
1: Result := cxGetResourceString(@sdxManufacturerLogoColumnCaption);
2: Result := cxGetResourceString(@sdxManufacturerCountryColumnCaption);
3: Result := cxGetResourceString(@sdxCarModelColumnCaption);
else
Result := cxGetResourceString(@sdxCarIsSUVColumnCaption);
end;
end;
const
ColumnProperties: array[0..4] of string =
('TcxTextEditProperties', 'TcxImageProperties', 'TcxTextEditProperties',
'TcxTextEditProperties', 'TcxCheckBoxProperties');
var
I: Integer;
begin
for I := 0 to PreviewTreeList.ColumnCount - 1 do
with PreviewTreeList.Columns[I] do
begin
PropertiesClassName := ColumnProperties[I];
Caption.Text := GetColumnCaption(I);
end;
end;
var
ASummaryItems: TcxTreeListSummaryItems;
begin
SetupDataBindings;
//TcxImageProperties(colManufacturerLogo.Properties).Stretch := True;
PreviewTreeList.Bands[0].Caption.Text := cxGetResourceString(@sdxManufacturerBandCaption);
PreviewTreeList.Bands[1].Caption.Text := cxGetResourceString(@sdxModelBandCaption);
PreviewTreeList.OptionsView.Footer := True;
ASummaryItems :=PreviewTreeList.Columns[0].Summary.FooterSummaryItems;
if ASummaryItems.Count = 0 then
ASummaryItems.Add;
ASummaryItems[0].Kind := skCount;
ASummaryItems[0].Format := cxGetResourceString(@sdxSummaryFormat);
end;
procedure TdxfmTreeListReportLinkDesignWindow.InitializePreviewTreeListStyles;
procedure ResetEvents(AStyles: TcxTreeListStyles);
begin
with AStyles do
begin
OnGetBandBackgroundStyle := nil;
OnGetBandContentStyle := nil;
OnGetBandHeaderStyle := nil;
OnGetBandFooterStyle := nil;
OnGetColumnFooterStyle := nil;
OnGetColumnHeaderStyle := nil;
OnGetContentStyle := nil;
OnGetNodeIndentStyle := nil;
OnGetPreviewStyle := nil;
end;
end;
var
Styles: TcxTreeListReportLinkStyles;
begin
if ReportLink.OptionsFormatting.UseNativeStyles then
begin
Styles := ReportLink.ActiveStyles;
dxPSResetStyles(PreviewTreeList.Styles);
with PreviewTreeList.Styles do
begin
BandBackground := Styles.BandBackground;
BandHeader := Styles.BandHeader;
Content := Styles.Content;
ContentEven := Styles.ContentEven;
ContentOdd := Styles.ContentOdd;
ColumnFooter := Styles.Footer;
ColumnHeader := Styles.Header;
Footer := Styles.FooterRow;
Preview := Styles.Preview;
end;
end
else
if ReportLink.TreeList <> nil then
PreviewTreeList.Styles := CustomTreeList_GetStyles(ReportLink.TreeList)
else
dxPScxCommon.dxPSResetStyles(PreviewTreeList.Styles);
ResetEvents(PreviewTreeList.Styles);
end;
procedure TdxfmTreeListReportLinkDesignWindow.LoadDataIntoPreviewTreeList;
function GetManufacturerName(AnIndex: Integer): string;
begin
case AnIndex of
0: Result := cxGetResourceString(@sdxCarManufacturerName5);
1: Result := cxGetResourceString(@sdxCarManufacturerName1);
2: Result := cxGetResourceString(@sdxCarManufacturerName2);
else
Result := cxGetResourceString(@sdxCarManufacturerName4);
end;
end;
function GetManufacturerCountry(AnIndex: Integer): string;
begin
case AnIndex of
0: Result := cxGetResourceString(@sdxCarManufacturerCountry5);
1: Result := cxGetResourceString(@sdxCarManufacturerCountry1);
2: Result := cxGetResourceString(@sdxCarManufacturerCountry2);
else
Result := cxGetResourceString(@sdxCarManufacturerCountry4);
end;
end;
function GetCarModel(AnIndex: Integer): string;
begin
case AnIndex of
0: Result := cxGetResourceString(@sdxCarModel5);
1: Result := cxGetResourceString(@sdxCarModel1);
2: Result := cxGetResourceString(@sdxCarModel2);
else
Result := cxGetResourceString(@sdxCarModel4);
end;
end;
const
RecordCount = 4;
CarLogosIndexes: array[0..RecordCount - 1] of Integer = (4, 0, 1, 3);
AreCarsSUV: array[0..RecordCount - 1] of string = ('False', 'True', 'True', 'True');
var
I: Integer;
begin
PreviewTreeList.Clear;
for I := 0 to RecordCount - 1 do
with PreviewTreeList.Add do
begin
Values[0] := GetManufacturerName(I);
Values[1] := dxPScxCommon.dxPSPreviewCarLogosAsString(CarLogosIndexes[I]);
Values[2] := GetManufacturerCountry(I);
Values[3] := GetCarModel(I);
Values[4] := AreCarsSUV[I];
end;
end;
procedure TdxfmTreeListReportLinkDesignWindow.RecreateStylesListBox;
var
List: TList;
begin
List := TList.Create;
try
SaveSelectedStyles(List);
dxPSUtl.dxRecreateWnd(lbxStyles);
RestoreSelectedStyles(List);
finally
List.Free;
end;
end;
procedure TdxfmTreeListReportLinkDesignWindow.RestoreSelectedStyles(AList: TList);
var
I: Integer;
begin
for I := 0 to AList.Count - 1 do
lbxStyles.Selected[Integer(AList[I])] := True;
end;
procedure TdxfmTreeListReportLinkDesignWindow.SaveSelectedStyles(AList: TList);
var
I: Integer;
begin
AList.Clear;
for I := 0 to lbxStyles.Items.Count - 1 do
if lbxStyles.Selected[I] then AList.Add(TObject(I));
end;
procedure TdxfmTreeListReportLinkDesignWindow.SetActivePage;
begin
PageControl1.ActivePage := PageControl1.Pages[DesignerTabIndex];
end;
procedure TdxfmTreeListReportLinkDesignWindow.UpdatePreviewTreeListStyles(const ACaption: string;
AStyle: TcxStyle);
begin
with PreviewTreeList.Styles do
begin
if dxPSUtl.dxSameText(ACaption, cxGetResourceString(@sdxBandBackgroundStyle)) then
BandBackground := AStyle
else if dxPSUtl.dxSameText(ACaption, cxGetResourceString(@sdxBandHeaderStyle)) then
BandHeader := AStyle
else if dxPSUtl.dxSameText(ACaption, cxGetResourceString(@sdxContentStyle)) then
Content := AStyle
else if dxPSUtl.dxSameText(ACaption, cxGetResourceString(@sdxContentEvenStyle)) then
ContentEven := AStyle
else if dxPSUtl.dxSameText(ACaption, cxGetResourceString(@sdxContentOddStyle)) then
ContentOdd := AStyle
else if dxPSUtl.dxSameText(ACaption, cxGetResourceString(@sdxFooterStyle)) then
ColumnFooter := AStyle
else if dxPSUtl.dxSameText(ACaption, cxGetResourceString(@sdxHeaderStyle)) then
ColumnHeader := AStyle
else if dxPSUtl.dxSameText(ACaption, cxGetResourceString(@sdxFooterRowStyle)) then
Footer := AStyle
else if dxPSUtl.dxSameText(ACaption, cxGetResourceString(@sdxPreviewStyle)) then
Preview := AStyle
else if dxPSUtl.dxSameText(ACaption, cxGetResourceString(@sdxSelectionStyle)) then
Selection := AStyle
end;
end;
procedure TdxfmTreeListReportLinkDesignWindow.WarningPaneUpdate;
begin
with ReportLink.HostInfoServices do
wpIncorrectOnEveryPageState.SetStateAndHint(IsInconsistentState, InconsistentStateText);
end;
procedure TdxfmTreeListReportLinkDesignWindow.SetOptionsExpandingByIndex(Index: Integer;
Value: Boolean);
begin
if LockControlsUpdate then Exit;
with ReportLink.OptionsExpanding do
case Index of
0: AutoExpandNodes := Value;
1: ExplicitlyExpandNodes := Value;
end;
Modified := True;
end;
procedure TdxfmTreeListReportLinkDesignWindow.SetOptionsFormattingByIndex(Index: Integer;
Value: Boolean);
begin
if LockControlsUpdate then Exit;
with ReportLink.OptionsFormatting do
case Index of
0:
begin
UseNativeStyles := Value;
InitializePreviewTreeListStyles;
end;
1: SuppressBackgroundBitmaps := Value;
2: ConsumeSelectionStyle := Value;
end;
Modified := True;
UpdatePreview;
end;
procedure TdxfmTreeListReportLinkDesignWindow.SetOptionsOnEveryPageByIndex(Index: Integer;
Value: Boolean);
begin
if LockControlsUpdate then Exit;
with ReportLink.OptionsOnEveryPage do
case Index of
0: BandHeaders := Value;
1: Headers := Value;
2: Footers := Value;
end;
Modified := True;
end;
procedure TdxfmTreeListReportLinkDesignWindow.SetOptionsRefinementsByIndex(Index: Integer;
Value: Boolean);
begin
if LockControlsUpdate then Exit;
with ReportLink.OptionsRefinements do
case Index of
0: TransparentGraphics := Value;
1: DisplayGraphicsAsText := Value;
2: FlatCheckMarks := Value;
{$IFDEF DXVER500}
3: TransparentRichEdits := Value;
{$ENDIF}
end;
Modified := True;
UpdatePreview;
end;
procedure TdxfmTreeListReportLinkDesignWindow.SetOptionsSelectionByIndex(Index: Integer;
Value: Boolean);
begin
if LockControlsUpdate then Exit;
with ReportLink.OptionsSelection do
case Index of
0: ProcessSelection := Value;
1: ProcessExactSelection := Value;
end;
Modified := True;
end;
procedure TdxfmTreeListReportLinkDesignWindow.SetOptionsSizeByIndex(Index: Integer;
Value: Boolean);
begin
if LockControlsUpdate then Exit;
with ReportLink.OptionsSize do
case Index of
0: AutoWidth := Value;
end;
Modified := True;
end;
procedure TdxfmTreeListReportLinkDesignWindow.SetOptionsViewByIndex(Index: Integer;
Value: Boolean);
begin
if LockControlsUpdate then Exit;
with ReportLink.OptionsView do
case Index of
0: BandHeaders := Value;
1: Headers := Value;
2: Footers := Value;
3: ExpandButtons := Value;
4: TreeLines := Value;
5: Borders := Value;
end;
Modified := True;
UpdatePreview;
end;
procedure TdxfmTreeListReportLinkDesignWindow.LookAndFeelChange(Sender: TObject);
begin
if LockControlsUpdate then Exit;
with TComboBox(Sender) do
ReportLink.OptionsFormatting.LookAndFeelKind := TcxLookAndFeelKind(Items.Objects[ItemIndex]);
Modified := True;
UpdatePreview;
end;
procedure TdxfmTreeListReportLinkDesignWindow.OptionsRefinementsClick(
Sender: TObject);
begin
with TCheckBox(Sender) do
SetOptionsRefinementsByIndex(TTagToInt(Tag), Checked);
end;
procedure TdxfmTreeListReportLinkDesignWindow.PreviewVisibleClick(
Sender: TObject);
begin
if LockControlsUpdate then Exit;
ReportLink.OptionsPreview.Visible := TCheckBox(Sender).Checked;
Modified := True;
UpdatePreview;
end;
procedure TdxfmTreeListReportLinkDesignWindow.PreviewAutoHeightClick(
Sender: TObject);
begin
if LockControlsUpdate then Exit;
ReportLink.OptionsPreview.AutoHeight := TCheckBox(Sender).Checked;
Modified := True;
end;
procedure TdxfmTreeListReportLinkDesignWindow.OptionsSelectionClick(
Sender: TObject);
begin
with TCheckBox(Sender) do
SetOptionsSelectionByIndex(TTagToInt(Tag), Checked);
end;
procedure TdxfmTreeListReportLinkDesignWindow.OptionsExpandingClick(
Sender: TObject);
begin
with TCheckBox(Sender) do
SetOptionsExpandingByIndex(TTagToInt(Tag), Checked);
end;
procedure TdxfmTreeListReportLinkDesignWindow.OptionsSizeClick(
Sender: TObject);
begin
with TCheckBox(Sender) do
SetOptionsSizeByIndex(TTagToInt(Tag), Checked);
end;
procedure TdxfmTreeListReportLinkDesignWindow.OptionsViewClick(
Sender: TObject);
begin
with TCheckBox(Sender) do
SetOptionsViewByIndex(TTagToInt(Tag), Checked);
end;
procedure TdxfmTreeListReportLinkDesignWindow.OptionsOnEveryPageClick(
Sender: TObject);
begin
with TCheckBox(Sender) do
SetOptionsOnEveryPageByIndex(TTagToInt(Tag), Checked);
end;
procedure TdxfmTreeListReportLinkDesignWindow.OptionsFormattingClick(
Sender: TObject);
begin
with TCheckBox(Sender) do
SetOptionsFormattingByIndex(TTagToInt(Tag), Checked);
end;
procedure TdxfmTreeListReportLinkDesignWindow.lblUseNativeStylesClick(
Sender: TObject);
begin
if chbxUseNativeStyles.CanFocus then ActiveControl := chbxUseNativeStyles;
chbxUseNativeStyles.Checked := not chbxUseNativeStyles.Checked;
end;
procedure TdxfmTreeListReportLinkDesignWindow.pmStylesPopup(Sender: TObject);
begin
lbxStyles.HideToolTips;
miStyleColor.Enabled := AreNativeStylesAvailable and HasSelectedStyles;
miStyleFont.Enabled := AreNativeStylesAvailable and HasSelectedStyles;
miStyleBackgroundBitmap.Enabled := AreNativeStylesAvailable and HasSelectedStyles;
miStyleBackgroundBitmapClear.Enabled := AreNativeStylesAvailable and HasSelectedStylesWithAssignedBitmap;
miStyleRestoreDefaults.Enabled := AreNativeStylesAvailable and HasSelectedStyles;
miStylesSelectAll.Enabled := CanSelectAllStyles;
miStylesSaveAs.Enabled := CanSaveStyles;
end;
procedure TdxfmTreeListReportLinkDesignWindow.StyleColorClick(Sender: TObject);
begin
PerformStylesChangeColor;
end;
procedure TdxfmTreeListReportLinkDesignWindow.StyleFontClick(Sender: TObject);
begin
PerformStylesChangeFont;
end;
procedure TdxfmTreeListReportLinkDesignWindow.StyleBackgroundBitmapClick(
Sender: TObject);
begin
PerformStylesChangeBitmap;
end;
procedure TdxfmTreeListReportLinkDesignWindow.StyleBackgroundBitmapClearClick(
Sender: TObject);
begin
PerformStylesClearBitmap;
end;
procedure TdxfmTreeListReportLinkDesignWindow.StyleRestoreDefaultsClick(
Sender: TObject);
begin
PerformStylesRestoreDefaults;
end;
procedure TdxfmTreeListReportLinkDesignWindow.cbxStyleSheetsClick(Sender: TObject);
begin
with TComboBox(Sender) do
ActiveStyleSheet := TcxCustomStyleSheet(Items.Objects[ItemIndex]);
end;
procedure TdxfmTreeListReportLinkDesignWindow.btnStyleSheetNewClick(Sender: TObject);
begin
PerformStyleSheetNew;
end;
procedure TdxfmTreeListReportLinkDesignWindow.btnStyleSheetCopyClick(Sender: TObject);
begin
PerformStyleSheetCopy;
end;
procedure TdxfmTreeListReportLinkDesignWindow.btnStyleSheetDeleteClick(Sender: TObject);
begin
PerformStyleSheetDelete;
end;
procedure TdxfmTreeListReportLinkDesignWindow.btnStyleSheetRenameClick(Sender: TObject);
begin
PerformStyleSheetRename;
end;
procedure TdxfmTreeListReportLinkDesignWindow.miStylesSelectAllClick(Sender: TObject);
begin
lbxStyles.SelectAll;
UpdateControlsState;
end;
procedure TdxfmTreeListReportLinkDesignWindow.StylesSaveAsClick(Sender: TObject);
begin
PerformStylesSaveAsStyleSheet;
end;
procedure TdxfmTreeListReportLinkDesignWindow.cbxStyleSheetsKeyDown(Sender: TObject;
var Key: Word; Shift: TShiftState);
begin
PerformStyleSheetKeyDown(Sender, Key, Shift);
end;
procedure TdxfmTreeListReportLinkDesignWindow.cbxStyleSheetsDrawItem(
Control: TWinControl; Index: Integer; Rect: TRect;
State: TOwnerDrawState);
begin
PerformStyleSheetDrawItem(TComboBox(Control).Canvas, Index, Rect, State, Control.Enabled);
end;
procedure TdxfmTreeListReportLinkDesignWindow.lbxStylesClick(Sender: TObject);
begin
if LockControlsUpdate then Exit;
UpdateControlsState;
end;
procedure TdxfmTreeListReportLinkDesignWindow.PageControl1Change(Sender: TObject);
begin
lblPreviewWindow.Parent := TPageControl(Sender).ActivePage;
end;
procedure RegisterAssistants;
begin
TcxTreeListNodeHelper.Register;
TcxTreeListReportLinkStyleSheet.Register;
end;
procedure UnregisterAssistants;
begin
TcxTreeListReportLinkStyleSheet.Unregister;
TcxTreeListNodeHelperFactory.ReleaseInstance;
end;
procedure TdxfmTreeListReportLinkDesignWindow.PreviewTreeListCustomDrawBandHeaderCell(
Sender: TcxCustomTreeList; ACanvas: TcxCanvas;
AViewInfo: TcxTreeListHeaderCellViewInfo; var ADone: Boolean);
var
R: TRect;
begin
R := AViewInfo.BoundsRect;
Dec(R.Top);
Dec(R.Left);
CustomDrawHeader(ACanvas, R, AViewInfo);
ADone := True;
end;
procedure TdxfmTreeListReportLinkDesignWindow.PreviewTreeListCustomDrawDataCell(
Sender: TcxCustomTreeList; ACanvas: TcxCanvas;
AViewInfo: TcxTreeListEditCellViewInfo; var ADone: Boolean);
begin
if AViewInfo.Column = colManufacturerLogo then
if ReportLink.OptionsRefinements.DisplayGraphicsAsText then
begin
CustomDrawTextRect(ACanvas, AViewInfo.BoundsRect, ReportLink.OptionsRefinements.GraphicsText,
ExtractAlignmentHorz(AViewInfo), ExtractAlignmentVert(AViewInfo), AViewInfo.ViewParams);
CustomDrawBorders(ACanvas, AViewInfo.BoundsRect);
ADone := True;
end;
if AViewInfo.Column = colCarIsSUV then
begin
CustomDrawCheckMark(ACanvas, AViewInfo);
CustomDrawBorders(ACanvas, AViewInfo.BoundsRect);
ADone := True;
end;
end;
procedure TdxfmTreeListReportLinkDesignWindow.PreviewTreeListCustomDrawFooterCell(
Sender: TcxCustomTreeList; ACanvas: TcxCanvas;
AViewInfo: TcxTreeListFooterCellViewInfo; var ADone: Boolean);
begin
CustomDrawFooter(ACanvas, AViewInfo.BoundsRect, TcxTreeListFooterCellViewInfo(AViewInfo));
ADone := True;
end;
procedure TdxfmTreeListReportLinkDesignWindow.PreviewTreeListCustomDrawHeaderCell(
Sender: TcxCustomTreeList; ACanvas: TcxCanvas;
AViewInfo: TcxTreeListHeaderCellViewInfo; var ADone: Boolean);
var
R: TRect;
begin
R := AViewInfo.BoundsRect;
Dec(R.Top);
Dec(R.Left);
CustomDrawHeader(ACanvas, R, AViewInfo);
ADone := True;
end;
initialization
RegisterAssistants;
dxPSRegisterReportLink(TcxTreeListReportLink, TcxTreeList, TdxfmTreeListReportLinkDesignWindow);
dxPSRegisterReportLink(TcxDBTreeListReportLink, TcxDBTreeList, TdxfmTreeListReportLinkDesignWindow);
dxPSRegisterReportLink(TcxVirtualTreeListReportLink, TcxVirtualTreeList, TdxfmTreeListReportLinkDesignWindow);
finalization
dxPSUnregisterReportLink(TcxVirtualTreeListReportLink, TcxVirtualTreeList, TdxfmTreeListReportLinkDesignWindow);
dxPSUnregisterReportLink(TcxDBTreeListReportLink, TcxDBTreeList, TdxfmTreeListReportLinkDesignWindow);
dxPSUnregisterReportLink(TcxTreeListReportLink, TcxTreeList, TdxfmTreeListReportLinkDesignWindow);
UnregisterAssistants;
FreeAndNil(FDefaultdxPScxTreeListLinkStyleSheet);
end.