{*******************************************************************} { } { 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 dxPScxVGridLnk; interface {$I cxVer.inc} uses Windows, SysUtils, Classes, Graphics, Controls, StdCtrls, ExtCtrls, ComCtrls, Menus, ImgList, cxClasses, cxControls, cxGraphics, cxLookAndFeels, cxStyles, cxCustomData, cxInplaceContainer, cxVGrid, cxDBVGrid, cxOI, cxEdit, cxTextEdit, cxMemo, cxImage, dxBase, dxPSSngltn, dxPSGlbl, dxPScxCommon, dxPSCore, dxPrnPg, dxExtCtrls, cxDrawTextUtils; const vspsVGridFirst = 0; vspsVGridContent = vspsVGridFirst + 0; vspsVGridHeader = vspsVGridFirst + 1; vspsVGridCategory = vspsVGridFirst + 2; vspsVGridLast = vspsVGridFirst + 2; cxVerticalGridBaseAttributeID = 0; cxVerticalGridUndefinedID = cxVerticalGridBaseAttributeID + 0; cxVerticalGridCategoryRowID = cxVerticalGridBaseAttributeID + 1; cxVerticalGridRowHeaderID = cxVerticalGridBaseAttributeID + 2; cxVerticalGridRowHeaderSeparatorID = cxVerticalGridBaseAttributeID + 3; cxVerticalGridRowValueID = cxVerticalGridBaseAttributeID + 4; cxVerticalGridRowValueSeparatorID = cxVerticalGridBaseAttributeID + 5; cxVerticalGridRowIndentID = cxVerticalGridBaseAttributeID + 6; type TcxCustomVerticalGridReportLink = class; TcxfmVerticalGridReportLinkDesignWindow = class; TcxVerticalGridReportLinkOptionsView = class; TcxCustomVerticalGridAdapterClass = class of TcxCustomVerticalGridAdapter; TcxCustomVerticalGridAdapter = class; TcxCustomVerticalGridReportLinkBuilderClass = class of TcxCustomVerticalGridReportLinkBuilder; TcxCustomVerticalGridReportLinkBuilder = class; TcxCustomVerticalGridReportLinkFormatterClass = class of TcxCustomVerticalGridReportLinkFormatter; TcxCustomVerticalGridReportLinkFormatter = class; TcxVerticalGridCustomRowHelperClass = class of TcxVerticalGridCustomRowHelper; TcxVerticalGridCustomRowHelper = class; TcxVerticalGridCategoryRowHelper = class; TcxVerticalGridCustomEditorRowHelper = class; TcxVerticalGridCustomMultiEditorRowHelper = class; TcxVerticalGridHostInfo = class; TcxVerticalGridAttributeID = type Integer; TcxVerticalGridCellCustomDrawInfo = record AttributeID: TcxVerticalGridAttributeID; Row: TcxCustomRow; CellIndex: Integer; RecordIndex: Integer; end; { Row Places } TcxVerticalGridRowElementPlace = class public Offset: Integer; Width: Integer; procedure Clear; end; TcxVerticalGridCustomRowPlaceClass = class of TcxVerticalGridCustomRowPlace; TcxVerticalGridCustomRowPlace = class private FFormatter: TcxCustomVerticalGridReportLinkFormatter; FRow: TcxCustomRow; FWrapIndex: Integer; function GetDC: HDC; function GetHasHeader: Boolean; function GetIndentArea: Integer; function GetInterRecordsSpace: Integer; function GetItemCount: Integer; function GetRecordCount: Integer; function GetRecordWidth(RecordIndex: Integer): Integer; function GetStartRecordIndex: Integer; function GetStopRecordIndex: Integer; protected procedure AddDelimiters(AReportLink: TcxCustomVerticalGridReportLink); virtual; procedure Calculate; virtual; function CalculatedHeaderWidth: Integer; virtual; function CalculatedMinHeight: Integer; virtual; function CalculatedMinWidth: Integer; virtual; function CalculatedRecordWidth(ARecordIndex: Integer): Integer; virtual; function CalculatedTextPatternHeight(AFont: HFONT): Integer; function CalculatedTextWidth(const AText: string; AFont: HFONT): Integer; procedure Clear; virtual; function GetHeaderAvailableWidth: Integer; virtual; function GetValueAvailableWidth(RecordIndex: Integer): Integer; virtual; function Row: TcxCustomRow; overload; virtual; function RowHelper: TcxVerticalGridCustomRowHelper; overload; virtual; property DC: HDC read GetDC; property Formatter: TcxCustomVerticalGridReportLinkFormatter read FFormatter; property HasHeader: Boolean read GetHasHeader; property HeaderAvailableWidth: Integer read GetHeaderAvailableWidth; property InterRecordsSpace: Integer read GetInterRecordsSpace; property ItemCount: Integer read GetItemCount; property RecordCount: Integer read GetRecordCount; property RecordWidths[RecordIndex: Integer]: Integer read GetRecordWidth; property StartRecordIndex: Integer read GetStartRecordIndex; property StopRecordIndex: Integer read GetStopRecordIndex; property ValueAvailableWidths[RecordIndex: Integer]: Integer read GetValueAvailableWidth; public constructor Create(AFormatter: TcxCustomVerticalGridReportLinkFormatter; ARow: TcxCustomRow; AWrapIndex: Integer); virtual; property IndentArea: Integer read GetIndentArea; property WrapIndex: Integer read FWrapIndex; end; TcxVerticalGridCategoryRowPlace = class(TcxVerticalGridCustomRowPlace) private FPlace: TcxVerticalGridRowElementPlace; function GetCaption: string; function GetFont: TFont; function GetOffset: Integer; function GetWidth: Integer; protected procedure Calculate; override; function CalculatedHeaderWidth: Integer; override; function CalculatedMinHeight: Integer; override; function CalculatedMinWidth: Integer; override; function Row: TcxCategoryRow; reintroduce; overload; function RowHelper: TcxVerticalGridCategoryRowHelper; reintroduce; overload; property Caption: string read GetCaption; property Font: TFont read GetFont; public constructor Create(AFormatter: TcxCustomVerticalGridReportLinkFormatter; ARow: TcxCustomRow; AWrapIndex: Integer); override; destructor Destroy; override; property Offset: Integer read GetOffset; property Width: Integer read GetWidth; end; TcxVerticalGridCustomEditorRowPlace = class(TcxVerticalGridCustomRowPlace) private FHeaderPlace: TcxVerticalGridRowElementPlace; FValuePlaces: TList; function GetHeaderFont: TFont; function GetProperty(RecordIndex: Integer): TcxCustomEditProperties; function GetValueFont(RecordIndex: Integer): TFont; function GetValuePlace(RecordIndex: Integer): TcxVerticalGridRowElementPlace; function GetValuePlaceCount: Integer; function GetValue(RecordIndex: Integer): TcxEditValue; function GetValuesOffset: Integer; protected procedure AddDelimiters(AReportLink: TcxCustomVerticalGridReportLink); override; procedure Calculate; override; function CalculatedHeaderWidth: Integer; override; function CalculatedMinHeight: Integer; override; function CalculatedRecordWidth(ARecordIndex: Integer): Integer; override; procedure CalculateHeaderPlace; virtual; procedure CalculateValuePlaces; virtual; procedure Clear; override; procedure ClearValuePlaces; procedure CreateValuePlaces; procedure FreeAndNilValuePlaces; function DoesItemParticipateInBestFitCalculation(ARecordIndex: Integer): Boolean; function MeasureWidth(ARecordIndex: Integer): Integer; function Row: TcxCustomEditorRow; reintroduce; overload; function RowHelper: TcxVerticalGridCustomEditorRowHelper; reintroduce; overload; property HeaderFont: TFont read GetHeaderFont; property Properties[RecordIndex: Integer]: TcxCustomEditProperties read GetProperty; property ValueFonts[RecordIndex: Integer]: TFont read GetValueFont; property Values[RecordIndex: Integer]: TcxEditValue read GetValue; property ValuesOffset: Integer read GetValuesOffset; public constructor Create(AFormatter: TcxCustomVerticalGridReportLinkFormatter; ARow: TcxCustomRow; AWrapIndex: Integer); override; destructor Destroy; override; property HeaderPlace: TcxVerticalGridRowElementPlace read FHeaderPlace; property ValuePlaceCount: Integer read GetValuePlaceCount; property ValuePlaces[RecordIndex: Integer]: TcxVerticalGridRowElementPlace read GetValuePlace; end; TcxVerticalGridCustomMultiEditorRowPlace = class(TcxVerticalGridCustomRowPlace) private FHeaderPlaces: TList; FHeaderSeparatorPlaces: TList; FValuePlaces: TList; FValueSeparatorPlaces: TList; function GetHasHeaderSeparators: Boolean; function GetHasValueSeparators: Boolean; function GetHeaderFont(CellIndex: Integer): TFont; function GetHeaderPlace(CellIndex: Integer): TcxVerticalGridRowElementPlace; function GetHeaderPlaceCount: Integer; function GetHeaderSeparatorCount: Integer; function GetHeaderSeparatorPlace(CellIndex: Integer): TcxVerticalGridRowElementPlace; function GetHeaderSeparatorPlaceCount: Integer; function GetHeaderSeparatorsArea: Integer; function GetHeaderSeparatorsFont(CellIndex: Integer): TFont; function GetProperty(CellIndex, RecordIndex: Integer): TcxCustomEditProperties; function GetValue(CellIndex, RecordIndex: Integer): TcxEditValue; function GetValueFlatIndex(CellIndex, RecordIndex: Integer): Integer; function GetValueFont(CellIndex, RecordIndex: Integer): TFont; function GetValuePlace(CellIndex, RecordIndex: Integer): TcxVerticalGridRowElementPlace; function GetValuePlaceCount: Integer; function GetValueSeparatorCount: Integer; function GetValueSeparatorFlatIndex(CellIndex, RecordIndex: Integer): Integer; function GetValueSeparatorPlace(CellIndex, RecordIndex: Integer): TcxVerticalGridRowElementPlace; function GetValueSeparatorPlaceCount: Integer; function GetValueSeparatorsArea(RecordIndex: Integer): Integer; function GetValueSeparatorsFont(CellIndex, RecordIndex: Integer): TFont; function GetValuesOffset: Integer; protected procedure AddDelimiters(AReportLink: TcxCustomVerticalGridReportLink); override; procedure Calculate; override; function CalculatedHeaderWidth: Integer; override; function CalculatedMinHeight: Integer; override; function CalculatedRecordWidth(ARecordIndex: Integer): Integer; override; procedure CalculateHeaderPartWidths; procedure CalculateHeaderPlaces; virtual; procedure CalculateHeaderSeparatorPlaces; virtual; procedure CalculateHeaderSeparatorWidths; virtual; procedure CalculatePartWidths(AnAutoWidthObject: TcxAutoWidthObject; AnAvailableWidth: Integer); procedure CalculateValuePartWidths; procedure CalculateValuePlaces; virtual; procedure CalculateValueSeparatorPlaces; virtual; procedure CalculateValueSeparatorWidths; virtual; procedure Clear; override; function GetHeaderAvailableWidth: Integer; override; function GetValueAvailableWidth(RecordIndex: Integer): Integer; override; procedure ClearPlaces; procedure CreatePlaces; procedure FreeAndNilPlaces; function DoesItemParticipateInBestFitCalculation(ACellIndex, ARecordIndex: Integer): Boolean; function MeasureWidth(ACellIndex, ARecordIndex: Integer): Integer; function Row: TcxCustomMultiEditorRow; reintroduce; overload; function RowHelper: TcxVerticalGridCustomMultiEditorRowHelper; reintroduce; overload; property HasHeaderSeparators: Boolean read GetHasHeaderSeparators; property HasValueSeparators: Boolean read GetHasValueSeparators; property HeaderFonts[CellIndex: Integer]: TFont read GetHeaderFont; property HeaderSeparatorCount: Integer read GetHeaderSeparatorCount; property HeaderSeparatorsArea: Integer read GetHeaderSeparatorsArea; property HeaderSeparatorsFonts[Index: Integer]: TFont read GetHeaderSeparatorsFont; property Properties[CellIndex, RecordIndex: Integer]: TcxCustomEditProperties read GetProperty; property ValueFlatIndexes[CellIndex, RecordIndex: Integer]: Integer read GetValueFlatIndex; property ValueFonts[CellIndex, RecordIndex: Integer]: TFont read GetValueFont; property Values[CellIndex, RecordIndex: Integer]: TcxEditValue read GetValue; property ValueSeparatorCount: Integer read GetValueSeparatorCount; property ValueSeparatorFlatIndexes[CellIndex, RecordIndex: Integer]: Integer read GetValueSeparatorFlatIndex; property ValueSeparatorsAreas[RecordIndex: Integer]: Integer read GetValueSeparatorsArea; property ValueSeparatorsFonts[CellIndex, RecordIndex: Integer]: TFont read GetValueSeparatorsFont; property ValuesOffset: Integer read GetValuesOffset; public constructor Create(AFormatter: TcxCustomVerticalGridReportLinkFormatter; ARow: TcxCustomRow; AWrapIndex: Integer); override; destructor Destroy; override; property HeaderPlaceCount: Integer read GetHeaderPlaceCount; property HeaderPlaces[CellIndex: Integer]: TcxVerticalGridRowElementPlace read GetHeaderPlace; property HeaderSeparatorPlaceCount: Integer read GetHeaderSeparatorPlaceCount; property HeaderSeparatorPlaces[CellIndex: Integer]: TcxVerticalGridRowElementPlace read GetHeaderSeparatorPlace; property ValuePlaceCount: Integer read GetValuePlaceCount; property ValuePlaces[CellIndex, RecordIndex: Integer]: TcxVerticalGridRowElementPlace read GetValuePlace; property ValueSeparatorPlaceCount: Integer read GetValueSeparatorPlaceCount; property ValueSeparatorPlaces[CellIndex, RecordIndex: Integer]: TcxVerticalGridRowElementPlace read GetValueSeparatorPlace; end; { Row Producers } TcxVerticalGridReportLinkCustomElementProducerClass = class of TcxVerticalGridReportLinkCustomElementProducer; TcxVerticalGridReportLinkCustomElementProducer = class private FBuilder: TcxCustomVerticalGridReportLinkBuilder; FHost: TdxReportCell; FRow: TdxReportCell; FRowHeight: Integer; FWrapIndex: Integer; function GetDC: HDC; function GetRowWidth: Integer; protected procedure CalculateRowHeight; virtual; procedure CreateRow; virtual; procedure CreateRowHost(AHostInfo: TcxVerticalGridHostInfo); virtual; procedure InitializeRow; virtual; property DC: HDC read GetDC; property WrapIndex: Integer read FWrapIndex; public constructor Create(ABuilder: TcxCustomVerticalGridReportLinkBuilder); virtual; function Adapter: TcxCustomVerticalGridAdapter; overload; virtual; function Builder: TcxCustomVerticalGridReportLinkBuilder; overload; virtual; function Formatter: TcxCustomVerticalGridReportLinkFormatter; overload; virtual; function Produce(AHostInfo: TcxVerticalGridHostInfo; AWrapIndex: Integer): TdxReportCell; virtual; property Host: TdxReportCell read FHost; property Row: TdxReportCell read FRow; property RowHeight: Integer read FRowHeight write FRowHeight; property RowWidth: Integer read GetRowWidth; end; TcxVerticalGridReportLinkWrapSeparatorProducerClass = class of TcxVerticalGridReportLinkWrapSeparatorProducer; TcxVerticalGridReportLinkWrapSeparatorProducer = class(TcxVerticalGridReportLinkCustomElementProducer) private FSeparator: TdxReportCellString; function GetSeparatorBounds: TRect; protected procedure CreateRow; override; procedure CreateSeparator(AParent: TdxReportCell); virtual; procedure InitializeRow; override; procedure InitializeSeparator; virtual; public property Separator: TdxReportCellString read FSeparator; property SeparatorBounds: TRect read GetSeparatorBounds; end; TcxVerticalGridReportLinkCustomRowProducerClass = class of TcxVerticalGridReportLinkCustomRowProducer; TcxVerticalGridReportLinkCustomRowProducer = class(TcxVerticalGridReportLinkCustomElementProducer) private FGridRow: TcxCustomRow; FIndents: TList; function GetIndent(Index: Integer): TdxReportCellExpandButton; function GetIndentBounds(Index: Integer): TRect; function GetIndentCount: Integer; function GetIndentWidth: Integer; function GetItemCount: Integer; function GetRecordCount: Integer; function GetStartRecordIndex: Integer; function GetStopRecordIndex: Integer; protected procedure CalculateRowAutoHeight; virtual; procedure CalculateRowHeight; override; procedure ClearItems; virtual; procedure CreateRow; override; function CreateRowIndent(AParent: TdxReportCell): TdxReportCellExpandButton; procedure CreateRowIndents(AParent: TdxReportCell); virtual; function DoesItemParticipateInRowAutoHeightCalculation(AnItem: TAbstractdxReportCellData): Boolean; virtual; procedure FixupRowDataHeight; virtual; procedure FixupRowHeight; virtual; procedure FixupRowItselfHeight; virtual; procedure InitializeRow; override; procedure InitializeRowIndent(AnItem: TdxReportCellExpandButton; AnIndex: Integer); virtual; function GetAutoHeight: Boolean; virtual; function GetHasIndents: Boolean; virtual; function GetLineHeight: Integer; virtual; property ItemCount: Integer read GetItemCount; property RecordCount: Integer read GetRecordCount; public constructor Create(ABuilder: TcxCustomVerticalGridReportLinkBuilder); override; destructor Destroy; override; function GridRow: TcxCustomRow; overload; virtual; function GridRowHelper: TcxVerticalGridCustomRowHelper; overload; virtual; function GridRowPlace: TcxVerticalGridCustomRowPlace; overload; virtual; function Produce(AHostInfo: TcxVerticalGridHostInfo; AGridRow: TcxCustomRow; AWrapIndex: Integer): TdxReportCell; reintroduce; overload; property AutoHeight: Boolean read GetAutoHeight; property HasIndents: Boolean read GetHasIndents; property IndentBounds[Index: Integer]: TRect read GetIndentBounds; property IndentCount: Integer read GetIndentCount; property Indents[Index: Integer]: TdxReportCellExpandButton read GetIndent; property IndentWidth: Integer read GetIndentWidth; property LineHeight: Integer read GetLineHeight; property StartRecordIndex: Integer read GetStartRecordIndex; property StopRecordIndex: Integer read GetStopRecordIndex; end; TcxVerticalGridReportLinkCategoryRowProducer = class(TcxVerticalGridReportLinkCustomRowProducer) private function GetCategoryBounds: TRect; protected procedure CreateCategoryRow(AParent: TdxReportCell); virtual; procedure CreateRow; override; public function GridRow: TcxCategoryRow; reintroduce; overload; function GridRowHelper: TcxVerticalGridCategoryRowHelper; reintroduce; overload; function GridRowPlace: TcxVerticalGridCategoryRowPlace; reintroduce; overload; property CategoryBounds: TRect read GetCategoryBounds; end; TcxVerticalGridReportLinkCustomEditableRowProducer = class(TcxVerticalGridReportLinkCustomRowProducer) private FHeaders: TList; FValues: TList; function GetHeader(Index: Integer): TdxReportCellImage; function GetHeaderCount: Integer; function GetValue(Index: Integer): TAbstractdxReportCellData; function GetValueCount: Integer; protected procedure ClearItems; override; function CreateHeaderItem(AParent: TdxReportCell; ACellIndex: Integer): TdxReportCellImage; function CreateValueItem(AParent: TdxReportCell; ACellIndex, ARecordIndex: Integer): TAbstractdxReportCellData; procedure DoInitializeHeader(AnItem: TdxReportCellImage; AnIndex: Integer); virtual; procedure DoInitializeValue(AnItem: TAbstractdxReportCellData; ACellIndex, ARecordIndex: Integer); virtual; function DoesItemParticipateInRowAutoHeightCalculation(AnItem: TAbstractdxReportCellData): Boolean; override; property HeaderCount: Integer read GetHeaderCount; property Headers[Index: Integer]: TdxReportCellImage read GetHeader; property ValueCount: Integer read GetValueCount; property Values[Index: Integer]: TAbstractdxReportCellData read GetValue; public constructor Create(ABuilder: TcxCustomVerticalGridReportLinkBuilder); override; destructor Destroy; override; property RecordCount; end; TcxVerticalGridReportLinkCustomEditorRowProducer = class(TcxVerticalGridReportLinkCustomEditableRowProducer) private function GetHasHeader: Boolean; function GetHeader: TdxReportCellImage; function GetHeaderBounds: TRect; function GetValueBounds(Index: Integer): TRect; protected procedure CreateHeader(AParent: TdxReportCell); virtual; procedure CreateRow; override; procedure CreateValues(AParent: TdxReportCell); virtual; property HasHeader: Boolean read GetHasHeader; property HeaderBounds: TRect read GetHeaderBounds; property ValueBounds[Index: Integer]: TRect read GetValueBounds; public function GridRow: TcxCustomEditorRow; reintroduce; overload; function GridRowHelper: TcxVerticalGridCustomEditorRowHelper; reintroduce; overload; function GridRowPlace: TcxVerticalGridCustomEditorRowPlace; reintroduce; overload; property Header: TdxReportCellImage read GetHeader; property ValueCount; property Values; end; TcxVerticalGridReportLinkCustomMultiEditorRowProducer = class(TcxVerticalGridReportLinkCustomEditableRowProducer) private FHeaderSeparators: TList; FValueSeparators: TList; function GetHasHeaderSeparators: Boolean; function GetHasValueSeparators: Boolean; function GetHeaderBounds(Index: Integer): TRect; function GetHeaderSeparator(Index: Integer): TdxReportCellString; function GetHeaderSeparatorBounds(Index: Integer): TRect; function GetHeaderSeparatorCount: Integer; function GetHeaderSeparatorText(Index: Integer): string; function GetValue(CellIndex, RecordIndex: Integer): TAbstractdxReportCellData; function GetValueBounds(CellIndex, RecordIndex: Integer): TRect; function GetValueSeparator(Index: Integer): TdxReportCellString; function GetValueSeparatorBounds(Index, RecordIndex: Integer): TRect; function GetValueSeparatorCount: Integer; function GetValueSeparatorText(Index: Integer): string; protected procedure ClearItems; override; procedure CreateRow; override; procedure CreateHeaders(AParent: TdxReportCell); virtual; function CreateHeaderSeparator(AParent: TdxReportCell): TdxReportCellString; procedure CreateHeaderSeparators(AParent: TdxReportCell); virtual; procedure CreateValues(AParent: TdxReportCell); virtual; function CreateValueSeparator(AParent: TdxReportCell): TdxReportCellString; procedure CreateValueSeparators(AParent: TdxReportCell); virtual; procedure DoInitializeHeaderSeparator(AnItem: TdxReportCellString; AnIndex: Integer); virtual; procedure DoInitializeValueSeparator(AnItem: TdxReportCellString; AnIndex, ARecordIndex: Integer); virtual; property HasHeaderSeparators: Boolean read GetHasHeaderSeparators; property HasValueSeparators: Boolean read GetHasValueSeparators; property HeaderBounds[Index: Integer]: TRect read GetHeaderBounds; property HeaderSeparatorBounds[Index: Integer]: TRect read GetHeaderSeparatorBounds; property HeaderSeparatorTexts[Index: Integer]: string read GetHeaderSeparatorText; property ValueSeparatorBounds[Index, RecordIndex: Integer]: TRect read GetValueSeparatorBounds; property ValueBounds[CellIndex, RecordIndex: Integer]: TRect read GetValueBounds; property ValueSeparatorTexts[Index: Integer]: string read GetValueSeparatorText; public constructor Create(ABuilder: TcxCustomVerticalGridReportLinkBuilder); override; destructor Destroy; override; function GridRow: TcxCustomMultiEditorRow; reintroduce; overload; function GridRowHelper: TcxVerticalGridCustomMultiEditorRowHelper; reintroduce; overload; function GridRowPlace: TcxVerticalGridCustomMultiEditorRowPlace; reintroduce; overload; property HeaderCount; property Headers; property HeaderSeparatorCount: Integer read GetHeaderSeparatorCount; property HeaderSeparators[Index: Integer]: TdxReportCellString read GetHeaderSeparator; property ValueCount; property Values[CellIndex, RecordIndex: Integer]: TAbstractdxReportCellData read GetValue; property ValueSeparatorCount: Integer read GetValueSeparatorCount; property ValueSeparators[Index: Integer]: TdxReportCellString read GetValueSeparator; end; { Row Helpers } TcxVerticalGridCustomRowHelper = class(TdxCustomClassMapItem) private FAdapter: TcxCustomVerticalGridAdapter; FRow: TcxCustomRow; protected function Adapter: TcxCustomVerticalGridAdapter; overload; virtual; function GetDisplayText(Index, RecordIndex: Integer): string; virtual; function GetEditProperties(Index, RecordIndex: Integer): TcxCustomEditProperties; virtual; function GetHasHeaderImage(Index: Integer): Boolean; virtual; function GetHasHeaderSeparators: Boolean; virtual; function GetHasValueSeparators: Boolean; virtual; function GetHeaderAlignmentHorz(Index: Integer): TcxTextAlignX; virtual; function GetHeaderAlignmentVert(Index: Integer): TcxTextAlignY; virtual; function GetHeaderCaption(Index: Integer): string; virtual; function GetImageIndex(Index: Integer): Integer; virtual; function GetIndentCount: Integer; virtual; function GetItemCount: Integer; virtual; function GetRecordMinWidth: Integer; virtual; function GetRowProperties(Index: Integer): TcxCustomRowProperties; virtual; function GetSeparatorsAlignmentVert: TcxAlignmentVert; virtual; function GetValue(Index, RecordIndex: Integer): TcxEditValue; virtual; property HasHeaderSeparators: Boolean read GetHasHeaderSeparators; property HasValueSeparators: Boolean read GetHasValueSeparators; property ItemCount: Integer read GetItemCount; property RecordMinWidth: Integer read GetRecordMinWidth; property SeparatorsAlignmentVert: TcxAlignmentVert read GetSeparatorsAlignmentVert; public constructor Create(AnAdapter: TcxCustomVerticalGridAdapter); virtual; procedure Initialize(ARow: TcxCustomRow); virtual; class function PairClass: TClass; override; class procedure Register; class procedure Unregister; class function ProducerClass: TcxVerticalGridReportLinkCustomRowProducerClass; virtual; function Properties(Index: Integer): TcxCustomRowProperties; overload; virtual; function Row: TcxCustomRow; overload; virtual; class function RowClass: TcxCustomRowClass; virtual; class function RowPlaceClass: TcxVerticalGridCustomRowPlaceClass; virtual; property DisplayTexts[Index, RecordIndex: Integer]: string read GetDisplayText; property EditProperties[Index, RecordIndex: Integer]: TcxCustomEditProperties read GetEditProperties; property HasHeaderImages[Index: Integer]: Boolean read GetHasHeaderImage; property HeaderAlignmentHorzs[Index: Integer]: TcxTextAlignX read GetHeaderAlignmentHorz; property HeaderAlignmentVerts[Index: Integer]: TcxTextAlignY read GetHeaderAlignmentVert; property HeaderCaptions[Index: Integer]: string read GetHeaderCaption; property ImageIndexes[Index: Integer]: Integer read GetImageIndex; property IndentCount: Integer read GetIndentCount; property Values[Index, RecordIndex: Integer]: TcxEditValue read GetValue; end; TcxVerticalGridCategoryRowHelper = class(TcxVerticalGridCustomRowHelper) protected function GetCaption: string; function GetHeaderAlignmentHorz(Index: Integer): TcxTextAlignX; override; function GetHeaderAlignmentVert(Index: Integer): TcxTextAlignY; override; function GetHeaderCaption(Index: Integer): string; override; function GetImageIndex(Index: Integer): Integer; override; public class function ProducerClass: TcxVerticalGridReportLinkCustomRowProducerClass; override; function Properties(Index: Integer): TcxCaptionRowProperties; reintroduce; overload; function Row: TcxCategoryRow; reintroduce; overload; class function RowClass: TcxCustomRowClass; override; class function RowPlaceClass: TcxVerticalGridCustomRowPlaceClass; override; property Caption: string read GetCaption; end; TcxVerticalGridCustomEditorRowHelper = class(TcxVerticalGridCustomRowHelper) protected function GetDisplayText(Index, RecordIndex: Integer): string; override; function GetEditProperties(Index, RecordIndex: Integer): TcxCustomEditProperties; override; function GetHeaderAlignmentHorz(Index: Integer): TcxTextAlignX; override; function GetHeaderAlignmentVert(Index: Integer): TcxTextAlignY; override; function GetHeaderCaption(Index: Integer): string; override; function GetImageIndex(Index: Integer): Integer; override; function GetRecordMinWidth: Integer; override; function GetValue(Index, RecordIndex: Integer): TcxEditValue; override; public class function ProducerClass: TcxVerticalGridReportLinkCustomRowProducerClass; override; function Properties(Index: Integer): TcxCustomEditorRowProperties; reintroduce; overload; function Row: TcxCustomEditorRow; reintroduce; overload; class function RowClass: TcxCustomRowClass; override; class function RowPlaceClass: TcxVerticalGridCustomRowPlaceClass; override; property RecordMinWidth; end; TcxVerticalGridEditorRowHelper = class(TcxVerticalGridCustomEditorRowHelper) public function Properties(Index: Integer): TcxEditorRowProperties; reintroduce; overload; function Row: TcxEditorRow; reintroduce; overload; class function RowClass: TcxCustomRowClass; override; end; TcxVerticalGridDBEditorRowHelper = class(TcxVerticalGridCustomEditorRowHelper) public function Properties(Index: Integer): TcxDBEditorRowProperties; reintroduce; overload; function Row: TcxDBEditorRow; reintroduce; overload; class function RowClass: TcxCustomRowClass; override; end; TcxVerticalGridCustomMultiEditorRowHelper = class(TcxVerticalGridCustomRowHelper) private function GetHeaderSeparatorCount: Integer; function GetHeaderSeparatorText(Index: Integer): string; function GetValueSeparatorCount: Integer; function GetValueSeparatorText(Index: Integer): string; protected function GetDisplayText(Index, RecordIndex: Integer): string; override; function GetEditProperties(Index, RecordIndex: Integer): TcxCustomEditProperties; override; function GetHasHeaderSeparators: Boolean; override; function GetHasValueSeparators: Boolean; override; function GetHeaderAlignmentHorz(Index: Integer): TcxTextAlignX; override; function GetHeaderAlignmentVert(Index: Integer): TcxTextAlignY; override; function GetHeaderCaption(Index: Integer): string; override; function GetImageIndex(Index: Integer): Integer; override; function GetItemCount: Integer; override; function GetRecordMinWidth: Integer; override; function GetRowProperties(Index: Integer): TcxCustomRowProperties; override; function GetSeparatorsAlignmentVert: TcxAlignmentVert; override; function GetValue(Index, RecordIndex: Integer): TcxEditValue; override; public class function ProducerClass: TcxVerticalGridReportLinkCustomRowProducerClass; override; function Properties(Index: Integer): TcxEditorRowItemProperties; reintroduce; overload; function RootProperties: TcxMultiEditorRowProperties; overload; virtual; function Row: TcxCustomMultiEditorRow; reintroduce; overload; class function RowClass: TcxCustomRowClass; override; class function RowPlaceClass: TcxVerticalGridCustomRowPlaceClass; override; property HasHeaderSeparators; property HasValueSeparators; property HeaderSeparatorCount: Integer read GetHeaderSeparatorCount; property HeaderSeparatorTexts[Index: Integer]: string read GetHeaderSeparatorText; property ItemCount; property RecordMinWidth; property SeparatorsAlignmentVert; property ValueSeparatorCount: Integer read GetValueSeparatorCount; property ValueSeparatorTexts[Index: Integer]: string read GetValueSeparatorText; end; { Caches } TcxVerticalGridRowHelperCache = class(TdxCustomCache) private FAdapter: TcxCustomVerticalGridAdapter; function GetHelper(Row: TcxCustomRow): TcxVerticalGridCustomRowHelper; function GetItem(Index: Integer): TcxVerticalGridCustomRowHelper; protected function IndexOf(Row: TcxCustomRow): Integer; property Items[Index: Integer]: TcxVerticalGridCustomRowHelper read GetItem; public constructor Create(AnAdapter: TcxCustomVerticalGridAdapter); property Adapter: TcxCustomVerticalGridAdapter read FAdapter; property Helpers[Row: TcxCustomRow]: TcxVerticalGridCustomRowHelper read GetHelper; default; end; TcxVerticalGridReportLinkProducerCache = class(TdxCustomCache) private FBuilder: TcxCustomVerticalGridReportLinkBuilder; function GetItem(Index: Integer): TcxVerticalGridReportLinkCustomRowProducer; function GetProducer(ProducerClass: TcxVerticalGridReportLinkCustomRowProducerClass): TcxVerticalGridReportLinkCustomRowProducer; protected function IndexOf(AProducerClass: TcxVerticalGridReportLinkCustomRowProducerClass): Integer; property Items[Index: Integer]: TcxVerticalGridReportLinkCustomRowProducer read GetItem; public constructor Create(ABuilder: TcxCustomVerticalGridReportLinkBuilder); property Builder: TcxCustomVerticalGridReportLinkBuilder read FBuilder; property Producers[ProducerClass: TcxVerticalGridReportLinkCustomRowProducerClass]: TcxVerticalGridReportLinkCustomRowProducer read GetProducer; default; end; TcxCustomVerticalGridReportLinkBuilder = class private FAdapter: TcxCustomVerticalGridAdapter; FFormatter: TcxCustomVerticalGridReportLinkFormatter; FProducerCache: TcxVerticalGridReportLinkProducerCache; FReportLink: TcxCustomVerticalGridReportLink; FReportRows: TList; FWrapSeparatorProducer: TcxVerticalGridReportLinkWrapSeparatorProducer; function GetAvailableSiteWidth: Integer; function GetAvailableWidth: Integer; function GetHost: TdxReportCell; function GetReportCells: TdxReportCells; function GetReportRow(Index: Integer): TdxReportCell; function GetReportRowCount: Integer; function GetVerticalGrid: TcxCustomVerticalGrid; protected procedure AddReportRow(ARow: TdxReportCell); procedure AfterBuilding; virtual; procedure BeforeBuilding; virtual; procedure CreateRow(ARow: TcxCustomRow; AWrapIndex: Integer); virtual; procedure CreateRows; virtual; procedure CreateWrapSeparator(AWrapIndex: Integer); virtual; function GetRowProducer(ARow: TcxCustomRow): TcxVerticalGridReportLinkCustomRowProducer; function GetRowProducerClass(ARow: TcxCustomRow): TcxVerticalGridReportLinkCustomRowProducerClass; virtual; function GetWrapSeparatorProducer(AWrapIndex: Integer): TcxVerticalGridReportLinkWrapSeparatorProducer; function GetWrapSeparatorProducerClass: TcxVerticalGridReportLinkWrapSeparatorProducerClass; virtual; function AreWrapSeparatorsNeeded: Boolean; procedure DoBuild; virtual; function IsAborted: Boolean; property ProducerCache: TcxVerticalGridReportLinkProducerCache read FProducerCache; property ReportLink: TcxCustomVerticalGridReportLink read FReportLink; public constructor Create(AReportLink: TcxCustomVerticalGridReportLink); virtual; destructor Destroy; override; procedure Build; virtual; procedure Progress(const APercentDone: Double); function Adapter: TcxCustomVerticalGridAdapter; overload; virtual; class function AdapterClass: TcxCustomVerticalGridAdapterClass; virtual; function Formatter: TcxCustomVerticalGridReportLinkFormatter; overload; virtual; class function FormatterClass: TcxCustomVerticalGridReportLinkFormatterClass; virtual; property AvailableSiteWidth: Integer read GetAvailableSiteWidth; property AvailableWidth: Integer read GetAvailableWidth; property Host: TdxReportCell read GetHost; property ReportCells: TdxReportCells read GetReportCells; property ReportRowCount: Integer read GetReportRowCount; property ReportRows[Index: Integer]: TdxReportCell read GetReportRow; property VerticalGrid: TcxCustomVerticalGrid read GetVerticalGrid; end; TcxVerticalGridReportLinkBuilderHandler = class private FBuilder: TcxCustomVerticalGridReportLinkBuilder; function GetReportLink: TcxCustomVerticalGridReportLink; public constructor Create(ABuilder: TcxCustomVerticalGridReportLinkBuilder); virtual; function Builder: TcxCustomVerticalGridReportLinkBuilder; overload; virtual; property ReportLink: TcxCustomVerticalGridReportLink read GetReportLink; end; TcxCustomVerticalGridAdapter = class(TcxVerticalGridReportLinkBuilderHandler) private FHelperCache: TcxVerticalGridRowHelperCache; function GetCellAutoHeight: Boolean; function GetCellEndEllipsis: Boolean; function GetCellMultiline: Boolean; function GetDataController: TcxCustomDataController; function GetDefaultRowHeight: Integer; function GetFirstRecordIndex: Integer; function GetGridLinesColor: TColor; function GetHeaderAvailableWidth(Row: TcxCustomRow): Integer; function GetHeaderMinWidth: Integer; function GetHeaderWidth: Integer; function GetHelper(Row: TcxCustomRow): TcxVerticalGridCustomRowHelper; function GetImages: TCustomImageList; function GetIndentArea(Row: TcxCustomRow): Integer; function GetIndentCount(Row: TcxCustomRow): Integer; function GetIndentWidth: Integer; function GetMakeSpaceForEmptyImage: Boolean; function GetOptionsView: TcxvgOptionsView; function GetPaintStyle: TcxvgPaintStyle; function GetRecordCount: Integer; function GetRecordMinWidth(RecordIndex: Integer): Integer; function GetRecordWidth(RecordCount: Integer): Integer; function GetRow(Index: Integer): TcxCustomRow; function GetRowCount: Integer; function GetRowHeight(Row: TcxCustomRow): Integer; function GetShowHeaders: Boolean; function GetShowHorzGridLines: Boolean; function GetShowVertGridLines: Boolean; function GetStyles: TcxVerticalGridStyles; function GetValueMinWidth: Integer; function GetVerticalGrid: TcxCustomVerticalGrid; protected procedure AfterBuilding; virtual; procedure BeforeBuilding; virtual; function GetInterRecordsSpace: Integer; virtual; function GetLayoutStyle: TcxvgLayoutStyle; virtual; abstract; { properties } function GetProperties(ARow: TcxCustomRow; AnIndex, ARecordIndex: Integer): TcxCustomEditProperties; function GetPropertiesClass(ARow: TcxCustomRow; AnIndex, ARecordIndex: Integer): TcxCustomEditPropertiesClass; { styles } function GetCategoryViewParams(ARow: TcxCustomRow): TcxViewParams; virtual; function GetContentViewParams(ARow: TcxCustomRow; AnIndex, ARecordIndex: Integer): TcxViewParams; virtual; function GetHeaderViewParams(ARow: TcxCustomRow): TcxViewParams; virtual; function GetImageViewParams(ARow: TcxCustomRow): TcxViewParams; virtual; function GetIndentViewParams(ARow: TcxCustomRow): TcxViewParams; virtual; { backgrounds } function GetBackgroundBitmap(Index: Integer): TBitmap; function GetRowIndentBackgroundBitmapIndex(ARow: TcxCustomRow; Alevel: Integer): Integer; function HasBackgroundBitmap(Index: Integer): Boolean; procedure FullExpand; function GetImageHeight(ARow: TcxCustomRow; AnIndex: Integer): Integer; function GetImageWidth(ARow: TcxCustomRow; AnIndex: Integer): Integer; function GetRowParentAtLevel(ARow: TcxCustomRow; ALevel: Integer): TcxCustomRow; function HasCategoryRowAsParentAtLevel(ARow: TcxCustomRow; ALevel: Integer; ACheckFollow: Boolean): Boolean; function HasRowImage(ARow: TcxCustomRow; AnIndex: Integer): Boolean; function IsRowLastChildAtLevel(ARow: TcxCustomRow; ALevel: Integer): Boolean; function IsRowVisible(ARow: TcxCustomRow): Boolean; property Helpers[Row: TcxCustomRow]: TcxVerticalGridCustomRowHelper read GetHelper; property OptionsView: TcxvgOptionsView read GetOptionsView; property Styles: TcxVerticalGridStyles read GetStyles; property VerticalGrid: TcxCustomVerticalGrid read GetVerticalGrid; public constructor Create(ABuilder: TcxCustomVerticalGridReportLinkBuilder); override; destructor Destroy; override; property DataController: TcxCustomDataController read GetDataController; property CellAutoHeight: Boolean read GetCellAutoHeight; property CellEndEllipsis: Boolean read GetCellEndEllipsis; property CellMultiline: Boolean read GetCellMultiline; property DefaultRowHeight: Integer read GetDefaultRowHeight; property FirstRecordIndex: Integer read GetFirstRecordIndex; property GridLinesColor: TColor read GetGridLinesColor; property HeaderAvailableWidths[Row: TcxCustomRow]: Integer read GetHeaderAvailableWidth; property HeaderMinWidth: Integer read GetHeaderMinWidth; property HeaderWidth: Integer read GetHeaderWidth; property Images: TCustomImageList read GetImages; property IndentAreas[Row: TcxCustomRow]: Integer read GetIndentArea; property IndentCounts[Row: TcxCustomRow]: Integer read GetIndentCount; property IndentWidth: Integer read GetIndentWidth; property InterRecordsSpace: Integer read GetInterRecordsSpace; property LayoutStyle: TcxvgLayoutStyle read GetLayoutStyle; property MakeSpaceForEmptyImage: Boolean read GetMakeSpaceForEmptyImage; property PaintStyle: TcxvgPaintStyle read GetPaintStyle; property RecordCount: Integer read GetRecordCount; property RecordMinWidths[RecordIndex: Integer]: Integer read GetRecordMinWidth; property RecordWidth[RecordCount: Integer]: Integer read GetRecordWidth; property RowCount: Integer read GetRowCount; property RowHeights[Row: TcxCustomRow]: Integer read GetRowHeight; property Rows[Index: Integer]: TcxCustomRow read GetRow; property ShowHeaders: Boolean read GetShowHeaders; property ShowHorzGridLines: Boolean read GetShowHorzGridLines; property ShowVertGridLines: Boolean read GetShowVertGridLines; property ValueMinWidth: Integer read GetValueMinWidth; end; TcxCustomVerticalGridReportLinkFormatter = class(TcxVerticalGridReportLinkBuilderHandler, IUnknown, IdxPSCellParams, IdxPSCellParams2) private FFont: TFont; FHeaderWidth: Integer; FInterRecordsSpace: Integer; FIsPrevGridMode: Boolean; FLookAndFeelItems: TList; FRecordWidths: TList; FRowHeights: TList; FRowPlaces: TList; FRows: TList; FTransparentColor: TColor; FViewWidths: TList; FWrappedRecordStartIndexes: TList; function GetAutoWidth: Boolean; function GetDataController: TcxCustomDataController; function GetDC: HDC; function GetExpandButtonColor(Row: TcxCustomRow): TColor; function GetExpandButtonSize: Integer; function GetGridLinesColor: TColor; function GetHeaderAvailableWidth(Row: TcxCustomRow): Integer; function GetHeaderMinWidth: Integer; function GetHeaderWidth: Integer; function GetIndentArea(Row: TcxCustomRow): Integer; function GetInternalIndexByRecordIndex(RecordIndex: Integer): Integer; function GetInternalRecordWidth: Integer; function GetInterRecordsSpace: Integer; function GetLookAndFeelItem(Index: Integer): TdxReportVisualItem; function GetLookAndFeelItemCount: Integer; function GetOptionsView: TcxVerticalGridReportLinkOptionsView; function GetRecordCount(Index: Integer): Integer; function GetRecordMinWidth(RecordIndex: Integer): Integer; function GetRecordWidth(RecordIndex: Integer): Integer; function GetRow(Index: Integer): TcxCustomRow; function GetRowCount: Integer; function GetRowHeight(Row: TcxCustomRow): Integer; function GetRowHelper(Row: TcxCustomRow): TcxVerticalGridCustomRowHelper; function GetRowPlace(WrapIndex, Index: Integer): TcxVerticalGridCustomRowPlace; function GetRowPlaceByRow(Row: TcxCustomRow; WrapIndex: Integer): TcxVerticalGridCustomRowPlace; function GetRowPlaceFlatIndex(WrapIndex, Index: Integer): Integer; function GetRowPlaceCount: Integer; function GetRenderer: TdxPSReportRenderer; function GetShowBorders: Boolean; function GetShowHeaders: Boolean; function GetShowHorzGridLines: Boolean; function GetShowVertGridLines: Boolean; function GetViewMaxWidth: Integer; function GetViewWidth(WrapIndex: Integer): Integer; function GetWrapCount: Integer; function GetWrappedRecordStartIndex(Index: Integer): Integer; function GetWrappedRecordStopIndex(Index: Integer): Integer; function GetWrapSeparatorHeight: Integer; procedure SetInterRecordsSpace(Value: Integer); procedure SetRecordWidth(RecordIndex: Integer; Value: Integer); procedure SetRowHeight(Row: TcxCustomRow; Value: Integer); procedure SetViewWidth(WrapIndex: Integer; Value: Integer); 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; function GetAreRecordsNeededLoading: Boolean; virtual; function GetAreRecordsNeededUnloading: Boolean; virtual; function GetFirstInternalRecordIndex: Integer; virtual; function GetInternalRecordCount: Integer; virtual; procedure LoadRecords; virtual; procedure UnloadRecords; virtual; procedure AddWrappedRecordStartIndex(Value: Integer); procedure Calculate; virtual; procedure CalculateBestFit; virtual; procedure CalculateHeight(const AParams: TdxReportItemViewParams; var AHeight: Integer); function CalculatedMinWidth: Integer; virtual; procedure CalculateRecordAutoWidths; procedure CalculateRecordCounts; procedure CalculateRowHeights; procedure CalculateRowPlaces; procedure CalculateViewWidths; procedure CreateRowList; virtual; procedure CreateRowPlaces; function CreateRowPlace(ARow: TcxCustomRow; AWrapIndex: Integer): TcxVerticalGridCustomRowPlace; virtual; procedure InitializeRecordWidths; virtual; procedure InitializeRowHeights; virtual; procedure InitializeWrappedRecordIndexes; virtual; function GetBackgroundBitmap(Index: Integer): TBitmap; function GetBackgroundBitmapIndex(Index: Integer): Integer; function HasBackgroundBitmap(Index: Integer): Boolean; function MapStyleBackgroundBitmapIndex(AVerticalGridBackgroundBitmapIndex: Integer): Integer; function GetCategoryRowFont(ARow: TcxCustomRow): TFont; function GetRowHeaderFont(ARow: TcxCustomRow; AnIndex: Integer): TFont; function GetRowHeaderSeparatorsFont(ARow: TcxCustomRow; AnIndex: Integer): TFont; function GetRowValueFont(ARow: TcxCustomRow; AnIndex, ARecordIndex: Integer): TFont; function GetRowValueSeparatorsFont(ARow: TcxCustomRow; AnIndex, ARecordIndex: Integer): TFont; procedure ClearRowPlaces; function FixupHorzCellSides(ARow: TcxCustomRow; ACellSides: TdxCellSides): TdxCellSides; procedure FreeAndNilRowPlaces; function GetImageHeight(ARow: TcxCustomRow; ACellIndex: Integer): Integer; function GetImageWidth(ARow: TcxCustomRow; ACellIndex: Integer): Integer; function GetNextRow(ARow: TcxCustomRow): TcxCustomRow; function GetPrevRow(ARow: TcxCustomRow): TcxCustomRow; function GetRowByReportRow(ARow: TdxReportCell): TcxCustomRow; function GetStyleFontIndex(const AParams: TdxReportItemViewParams): Integer; function IndexOfRow(ARow: TcxCustomRow): Integer; function IsColorTransparent(AColor: TColor): Boolean; function IsFirstRow(ARow: TcxCustomRow): Boolean; function IsLastRow(ARow: TcxCustomRow): Boolean; function MakeCustomDrawCodeData(AnAttribute: TcxVerticalGridAttributeID; ACellIndex, ARecordIndex: Integer): Integer; procedure RegisterLookAndFeelItem(AnItem: TdxReportVisualItem; AEdgeStyle: TdxCellEdgeStyle); procedure SetViewParams(AnItem: TdxReportVisualItem; const AParams: TdxReportItemViewParams); property AreRecordsNeededLoading: Boolean read GetAreRecordsNeededLoading; property AreRecordsNeededUnloading: Boolean read GetAreRecordsNeededUnloading; property DataController: TcxCustomDataController read GetDataController; property DC: HDC read GetDC; property FirstInternalRecordIndex: Integer read GetFirstInternalRecordIndex; property HeaderAvailableWidths[Row: TcxCustomRow]: Integer read GetHeaderAvailableWidth; property IndentAreas[Row: TcxCustomRow]: Integer read GetIndentArea; property InternalIndexesByRecordIndex[RecordIndex: Integer]: Integer read GetInternalIndexByRecordIndex; property InternalRecordCount: Integer read GetInternalRecordCount; property InternalRecordWidth: Integer read GetInternalRecordWidth; property IsPrevGridMode: Boolean read FIsPrevGridMode; property LookAndFeelItemCount: Integer read GetLookAndFeelItemCount; property LookAndFeelItems[Index: Integer]: TdxReportVisualItem read GetLookAndFeelItem; property Renderer: TdxPSReportRenderer read GetRenderer; property RowHelpers[Row: TcxCustomRow]: TcxVerticalGridCustomRowHelper read GetRowHelper; property RowPlaceCount: Integer read GetRowPlaceCount; property RowPlaceFlatIndexes[WrapIndex, Index: Integer]: Integer read GetRowPlaceFlatIndex; property RowPlaces[WrapIndex, Index: Integer]: TcxVerticalGridCustomRowPlace read GetRowPlace; property RowPlacesByRow[Row: TcxCustomRow; WrapIndex: Integer]: TcxVerticalGridCustomRowPlace read GetRowPlaceByRow; property ViewWidths[WrapIndex: Integer]: Integer read GetViewWidth write SetViewWidth; property WrappedRecordStartIndexes[Index: Integer]: Integer read GetWrappedRecordStartIndex; property WrappedRecordStopIndexes[Index: Integer]: Integer read GetWrappedRecordStopIndex; public constructor Create(ABuilder: TcxCustomVerticalGridReportLinkBuilder); override; destructor Destroy; override; function Adapter: TcxCustomVerticalGridAdapter; overload; virtual; procedure DoInitializeHost(AHost: TdxReportCell); virtual; { Images } procedure DoInitializeRowImage(ARow: TcxCustomRow; AnItem: TdxReportCellGraphic; AnIndex: Integer); virtual; function GetRowImageCellSides(ARow: TcxCustomRow): TdxCellSides; virtual; function GetRowImageClass: TdxReportCellGraphicClass; virtual; function GetRowImageViewParams(ARow: TcxCustomRow; AnIndex: Integer): TdxReportItemViewParams; virtual; { Indents and Expand Buttons } procedure DoInitializeRowIndent(ARow: TcxCustomRow; AnItem: TdxReportCellExpandButton; AnIndex, AnIndentCount: Integer); virtual; procedure DoInitializeExpandButton(ARow: TcxCustomRow; AnItem: TdxReportCellExpandButton; AnIndex, AnIndentCount: Integer); virtual; procedure DoReportLinkInitializeRowIndent(ARow: TcxCustomRow; AnItem: TdxReportCellExpandButton; AnIndex: Integer); virtual; function GetRowIndentCellSides(ARow: TcxCustomRow; AnIndex, AnIndentCount: Integer): TdxCellSides; virtual; function GetRowIndentClass: TdxReportCellExpandButtonClass; virtual; function GetRowIndentViewParams(ARow: TcxCustomRow; AnIndex, AnIndentCount: Integer): TdxReportItemViewParams; virtual; { Rows } procedure DoInitializeCategoryRow(ARow: TcxCategoryRow; AnItem: TdxReportCellImage); virtual; procedure DoInitializeRowReportRow(ARow: TcxCustomRow; AReportRow: TdxReportCell); virtual; procedure DoInitializeRowHeader(ARow: TcxCustomRow; AnItem: TdxReportCellImage; AnIndex: Integer); virtual; procedure DoInitializeRowValue(ARow: TcxCustomRow; AnItem: TAbstractdxReportCellData; AnIndex, ARecordIndex: Integer); virtual; procedure DoReportLinkInitializeRowHeader(ARow: TcxCustomRow; AnItem: TdxReportCellImage; AnIndex: Integer); virtual; procedure DoReportLinkInitializeRowValue(ARow: TcxCustomRow; AnItem: TAbstractdxReportCellData; AnIndex, ARecordIndex: Integer); virtual; function GetCategoryRowCellSides(ARow: TcxCustomRow): TdxCellSides; virtual; function GetCategoryRowClass(ARow: TcxCustomRow): TdxReportCellImageClass; virtual; function GetCategoryRowViewParams(ARow: TcxCustomRow): TdxReportItemViewParams; virtual; function GetCellValue(ARow: TcxCustomRow; AProperties: TcxCustomEditProperties; AnIndex, ARecordIndex: Integer): TcxEditValue; virtual; function GetRowHeaderCellSides(ARow: TcxCustomRow; AnIndex: Integer): TdxCellSides; virtual; function GetRowHeaderClass(ARow: TcxCustomRow): TdxReportCellImageClass; virtual; function GetRowHeaderViewParams(ARow: TcxCustomRow; AnIndex: Integer): TdxReportItemViewParams; virtual; function GetRowValueCellSides(ARow: TcxCustomRow; AnIndex, ARecordIndex: Integer): TdxCellSides; virtual; function GetRowValueClass(ARow: TcxCustomRow; AnIndex, ARecordIndex: Integer): TdxReportCellDataClass; virtual; function GetRowValueViewParams(ARow: TcxCustomRow; AnIndex, ARecordIndex: Integer): TdxReportItemViewParams; virtual; { Value and Header Separators } procedure DoInitializeRowHeaderSeparator(ARow: TcxCustomMultiEditorRow; AnItem: TdxReportCellString; AnIndex: Integer); virtual; procedure DoInitializeRowValueSeparator(ARow: TcxCustomMultiEditorRow; AnItem: TdxReportCellString; AnIndex, ARecordIndex: Integer); virtual; procedure DoReportLinkInitializeRowHeaderSeparator(ARow: TcxCustomMultiEditorRow; AnItem: TdxReportCellString; AnIndex: Integer); virtual; procedure DoReportLinkInitializeRowValueSeparator(ARow: TcxCustomMultiEditorRow; AnItem: TdxReportCellString; AnIndex, ARecordIndex: Integer); virtual; function GetRowHeaderSeparatorCellSides(ARow: TcxCustomMultiEditorRow): TdxCellSides; function GetRowHeaderSeparatorClass(ARow: TcxCustomMultiEditorRow): TdxReportCellStringClass; virtual; function GetRowHeaderSeparatorViewParams(ARow: TcxCustomMultiEditorRow; AnIndex: Integer): TdxReportItemViewParams; virtual; function GetRowValueSeparatorCellSides(ARow: TcxCustomMultiEditorRow): TdxCellSides; function GetRowValueSeparatorClass(ARow: TcxCustomMultiEditorRow): TdxReportCellStringClass; virtual; function GetRowValueSeparatorViewParams(ARow: TcxCustomMultiEditorRow; AnIndex, ARecordIndex: Integer): TdxReportItemViewParams; virtual; { Wrap Separators} procedure DoInitializeWrapSeparatorItem(AnItem: TdxReportCellString; AWrapIndex: Integer); virtual; procedure DoInitializeWrapSeparatorRow(ARow: TdxReportCell); virtual; function GetWrapSeparatorClass: TdxReportCellStringClass; virtual; property AutoWidth: Boolean read GetAutoWidth; property ExpandButtonColors[Row: TcxCustomRow]: TColor read GetExpandButtonColor; property ExpandButtonSize: Integer read GetExpandButtonSize; property GridLinesColor: TColor read GetGridLinesColor; property HeaderMinWidth: Integer read GetHeaderMinWidth; property HeaderWidth: Integer read GetHeaderWidth write FHeaderWidth; property InterRecordsSpace: Integer read GetInterRecordsSpace write SetInterRecordsSpace; property OptionsView: TcxVerticalGridReportLinkOptionsView read GetOptionsView; property RecordCounts[Index: Integer]: Integer read GetRecordCount; property RecordMinWidths[RecordIndex: Integer]: Integer read GetRecordMinWidth; property RecordWidths[RecordIndex: Integer]: Integer read GetRecordWidth write SetRecordWidth; property RowCount: Integer read GetRowCount; property RowHeights[Row: TcxCustomRow]: Integer read GetRowHeight write SetRowHeight; property Rows[Index: Integer]: TcxCustomRow read GetRow; property ShowBorders: Boolean read GetShowBorders; property ShowHeaders: Boolean read GetShowHeaders; property ShowHorzGridLines: Boolean read GetShowHorzGridLines; property ShowVertGridLines: Boolean read GetShowVertGridLines; property TransparentColor: TColor read FTransparentColor write FTransparentColor default clWindow; property ViewMaxWidth: Integer read GetViewMaxWidth; property WrapCount: Integer read GetWrapCount; property WrapSeparatorHeight: Integer read GetWrapSeparatorHeight; end; { Options } TcxVerticalGridReportLinkOptionsExpanding = class(TdxCustomReportLinkOptionsExpanding) private FAutoExpandRows: Boolean; function GetReportLink: TcxCustomVerticalGridReportLink; procedure SetAutoExpandRows(Value: Boolean); protected function DesignerTabIndex: Integer; override; public procedure Assign(Source: TPersistent); override; procedure RestoreDefaults; override; property ReportLink: TcxCustomVerticalGridReportLink read GetReportLink; published property AutoExpandRows: Boolean read FAutoExpandRows write SetAutoExpandRows default False; end; TcxVerticalGridReportLinkOptionsFormatting = class(TdxCustomReportLinkOptionsFormatting) private function GetReportLink: TcxCustomVerticalGridReportLink; protected function DesignerTabIndex: Integer; override; public property ReportLink: TcxCustomVerticalGridReportLink read GetReportLink; end; TcxVerticalGridReportLinkOptionsPagination = class(TdxCustomReportLinkOptionsPagination) private FByRows: Boolean; FByWrapping: Boolean; FOneWrappingPerPage: Boolean; function GetReportLink: TcxCustomVerticalGridReportLink; procedure SetByRows(Value: Boolean); procedure SetByWrapping(Value: Boolean); procedure SetOneWrappingPerPage(Value: Boolean); protected function DesignerTabIndex: Integer; override; public procedure Assign(Source: TPersistent); override; procedure RestoreDefaults; override; property ReportLink: TcxCustomVerticalGridReportLink read GetReportLink; published property ByRows: Boolean read FByRows write SetByRows default True; property ByWrapping: Boolean read FByWrapping write SetByWrapping default True; property OneWrappingPerPage: Boolean read FOneWrappingPerPage write SetOneWrappingPerPage default False; end; TcxVerticalGridReportLinkOptionsRefinements = class(TdxCustomReportLinkOptionsRefinements) private function GetReportLink: TcxCustomVerticalGridReportLink; function GetSuppressBackgroundBitmaps: Boolean; procedure SetSuppressBackgroundBitmaps(Value: Boolean); protected function DesignerTabIndex: Integer; override; public property ReportLink: TcxCustomVerticalGridReportLink read GetReportLink; published // for backward compatibility only -> now is moved to OptionsFormatting property SuppressBackgroundBitmaps: Boolean read GetSuppressBackgroundBitmaps write SetSuppressBackgroundBitmaps stored False; end; TcxVerticalGridReportLinkOptionsSize = class(TdxCustomReportLinkOptionsSize) private FBestFit: Boolean; FKeepSameRecordWidths: Boolean; FWrapRecords: Boolean; FWrapSeparatorHeight: Integer; function GetReportLink: TcxCustomVerticalGridReportLink; procedure SetBestFit(Value: Boolean); procedure SetKeepSameRecordWidths(Value: Boolean); procedure SetWrapRecords(Value: Boolean); procedure SetWrapSeparatorHeight(Value: Integer); protected function DesignerTabIndex: Integer; override; public procedure Assign(Source: TPersistent); override; procedure RestoreDefaults; override; property ReportLink: TcxCustomVerticalGridReportLink read GetReportLink; published property AutoWidth; property BestFit: Boolean read FBestFit write SetBestFit default False; property KeepSameRecordWidths: Boolean read FKeepSameRecordWidths write SetKeepSameRecordWidths default True; property WrapRecords: Boolean read FWrapRecords write SetWrapRecords default True; property WrapSeparatorHeight: Integer read FWrapSeparatorHeight write SetWrapSeparatorHeight default 20; end; TcxVerticalGridReportLinkPrintMode = (vpmLoadedRecords, vpmAllRecords); TcxVerticalGridReportLinkOptionsView = class(TdxCustomReportLinkOptionsView) private FBorders: Boolean; FExpandButtons: Boolean; FHeaders: Boolean; FMode: TcxVerticalGridReportLinkPrintMode; function GetReportLink: TcxCustomVerticalGridReportLink; procedure SetBorders(Value: Boolean); procedure SetExpandButtons(Value: Boolean); procedure SetHeaders(Value: Boolean); procedure SetMode(Value: TcxVerticalGridReportLinkPrintMode); protected function DesignerTabIndex: Integer; override; function GetActualMode: TcxVerticalGridReportLinkPrintMode; virtual; property Mode: TcxVerticalGridReportLinkPrintMode read FMode write SetMode default vpmLoadedRecords; public procedure Assign(Source: TPersistent); override; procedure RestoreDefaults; override; property ActualMode: TcxVerticalGridReportLinkPrintMode read GetActualMode; property ReportLink: TcxCustomVerticalGridReportLink read GetReportLink; published property Borders: Boolean read FBorders write SetBorders default True; property ExpandButtons: Boolean read FExpandButtons write SetExpandButtons default True; property Headers: Boolean read FHeaders write SetHeaders default True; end; { Styles } TcxVerticalGridReportLinkStylesClass = class of TcxVerticalGridReportLinkStyles; TcxVerticalGridReportLinkStyles = class(TdxCustomReportLinkStyles) private function GetReportLink: TcxCustomVerticalGridReportLink; 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 GetCategoryParams(ARow: TcxCustomRow; out AParams: TcxViewParams); virtual; procedure GetContentParams(ARow: TcxCustomRow; AnIndex, ARecordIndex: Integer; out AParams: TcxViewParams); virtual; procedure GetHeaderParams(ARow: TcxCustomRow; out AParams: TcxViewParams); virtual; procedure GetIndentParams(ARow: TcxCustomRow; out AParams: TcxViewParams); virtual; property ReportLink: TcxCustomVerticalGridReportLink read GetReportLink; published property Category: TcxStyle Index vspsVGridCategory read GetValue write SetValue; property Content: TcxStyle Index vspsVGridContent read GetValue write SetValue; property Header: TcxStyle Index vspsVGridHeader read GetValue write SetValue; property StyleSheet; end; TcxVerticalGridReportLinkStyleSheet = class(TdxCustomReportLinkStyleSheet) private function GetStylesValue: TcxVerticalGridReportLinkStyles; procedure SetStylesValue(Value: TcxVerticalGridReportLinkStyles); public class function GetStylesClass: TcxCustomStylesClass; override; published property Styles: TcxVerticalGridReportLinkStyles read GetStylesValue write SetStylesValue; end; { HostInfo } TcxVerticalGridHostInfo = class private FParent: TdxReportCell; public Origin: TPoint; procedure Initialize(AParent: TdxReportCell); property Parent: TdxReportCell read FParent; end; { TcxCustomVerticalGridReportLink } { CustomDraw Events } TcxVerticalGridReportLinkCustomDrawRowHeaderCellEvent = procedure(Sender: TcxCustomVerticalGridReportLink; ACanvas: TCanvas; ARow: TcxCustomRow; ACellIndex: Integer; AnItem: TdxReportCellImage; var ADone: Boolean) of object; TcxVerticalGridReportLinkCustomDrawRowHeaderSeparatorCellEvent = procedure(Sender: TcxCustomVerticalGridReportLink; ACanvas: TCanvas; ARow: TcxCustomRow; AnIndex: Integer; AnItem: TdxReportCellString; var ADone: Boolean) of object; TcxVerticalGridReportLinkCustomDrawRowIndentCellEvent = procedure(Sender: TcxCustomVerticalGridReportLink; ACanvas: TCanvas; ARow: TcxCustomRow; AnIndex: Integer; AnItem: TdxReportCellExpandButton; var ADone: Boolean) of object; TcxVerticalGridReportLinkCustomDrawRowValueCellEvent = procedure(Sender: TcxCustomVerticalGridReportLink; ACanvas: TCanvas; ARow: TcxCustomRow; ACellIndex, ARecordIndex: Integer; AnItem: TAbstractdxReportCellData; var ADone: Boolean) of object; TcxVerticalGridReportLinkCustomDrawRowValueSeparatorCellEvent = procedure(Sender: TcxCustomVerticalGridReportLink; ACanvas: TCanvas; ARow: TcxCustomRow; ACellIndex, ARecordIndex: Integer; AnItem: TdxReportCellString; var ADone: Boolean) of object; { Initialiazation Events } TcxVerticalGridReportLinkInitializeRowHeaderCellEvent = procedure(Sender: TcxCustomVerticalGridReportLink; ARow: TcxCustomRow; ACellIndex: Integer; AnItem: TdxReportCellImage) of object; TcxVerticalGridReportLinkInitializeRowHeaderSeparatorCellEvent = procedure(Sender: TcxCustomVerticalGridReportLink; ARow: TcxCustomRow; AnIndex: Integer; AnItem: TdxReportCellString) of object; TcxVerticalGridReportLinkInitializeRowIndentCellEvent = procedure(Sender: TcxCustomVerticalGridReportLink; ARow: TcxCustomRow; AnIndex: Integer; AnItem: TdxReportCellExpandButton) of object; TcxVerticalGridReportLinkInitializeRowValueCellEvent = procedure(Sender: TcxCustomVerticalGridReportLink; ARow: TcxCustomRow; ACellIndex, ARecordIndex: Integer; AnItem: TAbstractdxReportCellData) of object; TcxVerticalGridReportLinkInitializeRowValueSeparatorCellEvent = procedure(Sender: TcxCustomVerticalGridReportLink; ARow: TcxCustomRow; ACellIndex, ARecordIndex: Integer; AnItem: TdxReportCellString) of object; TcxCustomVerticalGridReportLink = class(TdxCustomcxControlReportLink) private FBuilder: TcxCustomVerticalGridReportLinkBuilder; FCategoryFont: TFont; FDelimitersHardVert: TList; FHostInfo: TcxVerticalGridHostInfo; FOnCustomDrawRowHeaderCell: TcxVerticalGridReportLinkCustomDrawRowHeaderCellEvent; FOnCustomDrawRowHeaderSeparatorCell: TcxVerticalGridReportLinkCustomDrawRowHeaderSeparatorCellEvent; FOnCustomDrawRowIndentCell: TcxVerticalGridReportLinkCustomDrawRowIndentCellEvent; FOnCustomDrawRowValueCell: TcxVerticalGridReportLinkCustomDrawRowValueCellEvent; FOnCustomDrawRowValueSeparatorCell: TcxVerticalGridReportLinkCustomDrawRowValueSeparatorCellEvent; FOnInitializeRowHeaderCell: TcxVerticalGridReportLinkInitializeRowHeaderCellEvent; FOnInitializeRowHeaderSeparatorCell: TcxVerticalGridReportLinkInitializeRowHeaderSeparatorCellEvent; FOnInitializeRowIndentCell: TcxVerticalGridReportLinkInitializeRowIndentCellEvent; FOnInitializeRowValueCell: TcxVerticalGridReportLinkInitializeRowValueCellEvent; FOnInitializeRowValueSeparatorCell: TcxVerticalGridReportLinkInitializeRowValueSeparatorCellEvent; function GetActiveStyles: TcxVerticalGridReportLinkStyles; function GetDesignWindow: TcxfmVerticalGridReportLinkDesignWindow; function GetOptionsExpanding: TcxVerticalGridReportLinkOptionsExpanding; function GetOptionsFormatting: TcxVerticalGridReportLinkOptionsFormatting; function GetOptionsPagination: TcxVerticalGridReportLinkOptionsPagination; function GetOptionsRefinements: TcxVerticalGridReportLinkOptionsRefinements; function GetOptionsSize: TcxVerticalGridReportLinkOptionsSize; function GetOptionsView: TcxVerticalGridReportLinkOptionsView; function GetStyles: TcxVerticalGridReportLinkStyles; function GetVerticalGrid: TcxCustomVerticalGrid; procedure SetCategoryFont(Value: TFont); procedure SetOnCustomDrawRowHeaderCell(Value: TcxVerticalGridReportLinkCustomDrawRowHeaderCellEvent); procedure SetOnCustomDrawRowHeaderSeparatorCell(Value: TcxVerticalGridReportLinkCustomDrawRowHeaderSeparatorCellEvent); procedure SetOnCustomDrawRowIndentCell(Value: TcxVerticalGridReportLinkCustomDrawRowIndentCellEvent); procedure SetOnCustomDrawRowValueCell(Value: TcxVerticalGridReportLinkCustomDrawRowValueCellEvent); procedure SetOnCustomDrawRowValueSeparatorCell(Value: TcxVerticalGridReportLinkCustomDrawRowValueSeparatorCellEvent); procedure SetOptionsExpanding(Value: TcxVerticalGridReportLinkOptionsExpanding); procedure SetOptionsFormatting(Value: TcxVerticalGridReportLinkOptionsFormatting); procedure SetOptionsPagination(Value: TcxVerticalGridReportLinkOptionsPagination); procedure SetOptionsRefinements(Value: TcxVerticalGridReportLinkOptionsRefinements); procedure SetOptionsSize(Value: TcxVerticalGridReportLinkOptionsSize); procedure SetOptionsView(Value: TcxVerticalGridReportLinkOptionsView); procedure SetStyles(Value: TcxVerticalGridReportLinkStyles); protected procedure ConstructReport(AReportCells: TdxReportCells); override; procedure ConvertCoords; override; procedure CustomDraw(AItem: TAbstractdxReportCellData; ACanvas: TCanvas; ABoundsRect, AClientRect: TRect; var ADone: Boolean); override; procedure FontChanged(Sender: TObject); override; function GetBreakPagesByHardDelimiters: Boolean; override; procedure GetImageLists(AProc: TdxPSGetImageListProc); override; function GetRebuildOnPageParamsChange(AUpdateCodes: TdxPrinterPageUpdateCodes): Boolean; override; function GetUseHardVertDelimiters: Boolean; override; procedure InternalRestoreFromOriginal; override; function IsSupportedCustomDraw(Item: TAbstractdxReportCellData): Boolean; override; procedure MakeHardDelimiters(AReportCells: TdxReportCells; AVertDelimiters: TList); override; procedure DoCustomDrawRowHeaderCell(ACanvas: TCanvas; ARow: TcxCustomRow; AnIndex: Integer; AnItem: TdxReportCellImage; var ADone: Boolean); dynamic; procedure DoCustomDrawRowHeaderSeparatorCell(ACanvas: TCanvas; ARow: TcxCustomRow; AnIndex: Integer; AnItem: TdxReportCellString; var ADone: Boolean); dynamic; procedure DoCustomDrawRowIndentCell(ACanvas: TCanvas; ARow: TcxCustomRow; AnIndex: Integer; AnItem: TdxReportCellExpandButton; var ADone: Boolean); dynamic; procedure DoCustomDrawRowValueCell(ACanvas: TCanvas; ARow: TcxCustomRow; ACellIndex, ARecordIndex: Integer; AnItem: TAbstractdxReportCellData; var ADone: Boolean); dynamic; procedure DoCustomDrawRowValueSeparatorCell(ACanvas: TCanvas; ARow: TcxCustomRow; ACellIndex, ARecordIndex: Integer; AnItem: TdxReportCellString; var ADone: Boolean); dynamic; procedure DoInitializeRowHeaderCell(ARow: TcxCustomRow; ACellIndex: Integer; AnItem: TdxReportCellImage); dynamic; procedure DoInitializeRowHeaderSeparatorCell(ARow: TcxCustomRow; AnIndex: Integer; AnItem: TdxReportCellString); dynamic; procedure DoInitializeRowIndentCell(ARow: TcxCustomRow; AnIndex: Integer; AnItem: TdxReportCellExpandButton); dynamic; procedure DoInitializeRowValueCell(ARow: TcxCustomRow; ACellIndex, ARecordIndex: Integer; AnItem: TAbstractdxReportCellData); dynamic; procedure DoInitializeRowValueSeparatorCell(ARow: TcxCustomRow; ACellIndex, ARecordIndex: Integer; AnItem: TdxReportCellString); dynamic; function GetOptionsExpandingClass: TdxCustomReportLinkOptionsExpandingClass; override; function GetOptionsFormattingClass: TdxCustomReportLinkOptionsFormattingClass; override; function GetOptionsPaginationClass: TdxCustomReportLinkOptionsPaginationClass; override; function GetOptionsRefinementsClass: TdxCustomReportLinkOptionsRefinementsClass; override; function GetOptionsSizeClass: TdxCustomReportLinkOptionsSizeClass; override; function GetOptionsViewClass: TdxCustomReportLinkOptionsViewClass; override; function GetAreNativeStylesAvailable: Boolean; override; function GetStylesClass: TdxCustomReportLinkStylesClass; override; function GetStyleSheetClass: TdxCustomReportLinkStyleSheetClass; override; function GetStyleSheetPrototype: TdxCustomReportLinkStyleSheet; override; procedure PrepareConstruct; override; procedure UnprepareConstruct; override; procedure AddVerticalHardDelimiter(ADelimiter: TdxReportCell); overload; procedure AddVerticalHardDelimiter(ADelimiter: Integer); overload; // Builder function CreateBuilder: TcxCustomVerticalGridReportLinkBuilder; virtual; class function GetBuilderClass: TcxCustomVerticalGridReportLinkBuilderClass; virtual; // CustomDraw procedure ExtractCustomDrawCodeDataValues(ACode: Integer; var AnAttribute: TcxVerticalGridAttributeID; var ACellIndex, ARecordIndex: Integer); function GetItemCustomDrawInfo(AnItem: TdxReportVisualItem; out ADrawInfo: TcxVerticalGridCellCustomDrawInfo): TcxVerticalGridAttributeID; virtual; function IsCustomDrawn(AnAttributeID: TcxVerticalGridAttributeID): Boolean; virtual; function MakeCustomDrawCodeData(AnAttribute: TcxVerticalGridAttributeID; ACellIndex, ARecordIndex: Integer): Integer; // DesignWindow procedure InitializePrintModeControl(AControl: TComboBox); virtual; procedure UpdateStatePrintModeControl(AControl: TComboBox); virtual; property ActiveStyles: TcxVerticalGridReportLinkStyles read GetActiveStyles; property Builder: TcxCustomVerticalGridReportLinkBuilder read FBuilder; property CategoryFont: TFont read FCategoryFont write SetCategoryFont; property DelimitersHardVert: TList read FDelimitersHardVert; property HostInfo: TcxVerticalGridHostInfo read FHostInfo; property VerticalGrid: TcxCustomVerticalGrid read GetVerticalGrid; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; property DesignWindow: TcxfmVerticalGridReportLinkDesignWindow read GetDesignWindow; published property Color; property Font; property OptionsExpanding: TcxVerticalGridReportLinkOptionsExpanding read GetOptionsExpanding write SetOptionsExpanding; property OptionsFormatting: TcxVerticalGridReportLinkOptionsFormatting read GetOptionsFormatting write SetOptionsFormatting; property OptionsPagination: TcxVerticalGridReportLinkOptionsPagination read GetOptionsPagination write SetOptionsPagination; property OptionsRefinements: TcxVerticalGridReportLinkOptionsRefinements read GetOptionsRefinements write SetOptionsRefinements; property OptionsSize: TcxVerticalGridReportLinkOptionsSize read GetOptionsSize write SetOptionsSize; property OptionsView: TcxVerticalGridReportLinkOptionsView read GetOptionsView write SetOptionsView; property ScaleFonts; property StyleRepository; property Styles: TcxVerticalGridReportLinkStyles read GetStyles write SetStyles; property SupportedCustomDraw; property OnCustomDrawRowHeaderCell: TcxVerticalGridReportLinkCustomDrawRowHeaderCellEvent read FOnCustomDrawRowHeaderCell write SetOnCustomDrawRowHeaderCell; property OnCustomDrawRowHeaderSeparatorCell: TcxVerticalGridReportLinkCustomDrawRowHeaderSeparatorCellEvent read FOnCustomDrawRowHeaderSeparatorCell write SetOnCustomDrawRowHeaderSeparatorCell; property OnCustomDrawRowIndentCell: TcxVerticalGridReportLinkCustomDrawRowIndentCellEvent read FOnCustomDrawRowIndentCell write SetOnCustomDrawRowIndentCell; property OnCustomDrawRowValueCell: TcxVerticalGridReportLinkCustomDrawRowValueCellEvent read FOnCustomDrawRowValueCell write SetOnCustomDrawRowValueCell; property OnCustomDrawRowValueSeparatorCell: TcxVerticalGridReportLinkCustomDrawRowValueSeparatorCellEvent read FOnCustomDrawRowValueSeparatorCell write SetOnCustomDrawRowValueSeparatorCell; property OnInitializeRowHeaderCell: TcxVerticalGridReportLinkInitializeRowHeaderCellEvent read FOnInitializeRowHeaderCell write FOnInitializeRowHeaderCell; property OnInitializeRowHeaderSeparatorCell: TcxVerticalGridReportLinkInitializeRowHeaderSeparatorCellEvent read FOnInitializeRowHeaderSeparatorCell write FOnInitializeRowHeaderSeparatorCell; property OnInitializeRowIndentCell: TcxVerticalGridReportLinkInitializeRowIndentCellEvent read FOnInitializeRowIndentCell write FOnInitializeRowIndentCell; property OnInitializeRowValueCell: TcxVerticalGridReportLinkInitializeRowValueCellEvent read FOnInitializeRowValueCell write FOnInitializeRowValueCell; property OnInitializeRowValueSeparatorCell: TcxVerticalGridReportLinkInitializeRowValueSeparatorCellEvent read FOnInitializeRowValueSeparatorCell write FOnInitializeRowValueSeparatorCell; end; TcxUnboundVerticalGridReportLinkBuilder = class(TcxCustomVerticalGridReportLinkBuilder) public class function AdapterClass: TcxCustomVerticalGridAdapterClass; override; end; TcxUnboundVerticalGridAdapter = class(TcxCustomVerticalGridAdapter) private function GetVerticalGrid: TcxUnboundVerticalGrid; protected function GetLayoutStyle: TcxvgLayoutStyle; override; property VerticalGrid: TcxUnboundVerticalGrid read GetVerticalGrid; end; TcxUnboundVerticalGridReportLink = class(TcxCustomVerticalGridReportLink) protected class function GetBuilderClass: TcxCustomVerticalGridReportLinkBuilderClass; override; end; TcxVerticalGridReportLink = class(TcxUnboundVerticalGridReportLink) private function GetVerticalGrid: TcxVerticalGrid; public property VerticalGrid: TcxVerticalGrid read GetVerticalGrid; end; { RTTI Inspector } TcxRTTIInspectorReportLink = class(TcxUnboundVerticalGridReportLink) private function GetRTTIInspector: TcxRTTIInspector; public property RTTIInspector: TcxRTTIInspector read GetRTTIInspector; end; { VirtualVerticalGrid } TcxVirtualVerticalGridReportLinkBuilder = class(TcxCustomVerticalGridReportLinkBuilder) public class function AdapterClass: TcxCustomVerticalGridAdapterClass; override; class function FormatterClass: TcxCustomVerticalGridReportLinkFormatterClass; override; end; TcxVirtualVerticalGridAdapter = class(TcxCustomVerticalGridAdapter) private function GetOptionsView: TcxvgMultiRecordsOptionsView; function GetVerticalGrid: TcxVirtualVerticalGrid; protected function GetInterRecordsSpace: Integer; override; function GetLayoutStyle: TcxvgLayoutStyle; override; public property OptionsView: TcxvgMultiRecordsOptionsView read GetOptionsView; property VerticalGrid: TcxVirtualVerticalGrid read GetVerticalGrid; end; TcxVirtualVerticalGridReportLinkFormatter = class(TcxCustomVerticalGridReportLinkFormatter) protected function GetFirstInternalRecordIndex: Integer; override; function GetInternalRecordCount: Integer; override; end; TcxVirtualVerticalGridReportLink = class; TcxVirtualVerticalGridReportLinkOptionsView = class(TcxVerticalGridReportLinkOptionsView) private function GetReportLink: TcxVirtualVerticalGridReportLink; protected function GetActualMode: TcxVerticalGridReportLinkPrintMode; override; public property ReportLink: TcxVirtualVerticalGridReportLink read GetReportLink; published property Mode; end; TcxVirtualVerticalGridReportLink = class(TcxCustomVerticalGridReportLink) private function GetOptionsView: TcxVirtualVerticalGridReportLinkOptionsView; function GetVirtualVerticalGrid: TcxVirtualVerticalGrid; procedure SetOptionsView(Value: TcxVirtualVerticalGridReportLinkOptionsView); protected procedure InternalRestoreFromOriginal; override; class function GetBuilderClass: TcxCustomVerticalGridReportLinkBuilderClass; override; function GetOptionsViewClass: TdxCustomReportLinkOptionsViewClass; override; procedure InitializePrintModeControl(AControl: TComboBox); override; procedure UpdateStatePrintModeControl(AControl: TComboBox); override; public property VirtualVerticalGrid: TcxVirtualVerticalGrid read GetVirtualVerticalGrid; published property OptionsView: TcxVirtualVerticalGridReportLinkOptionsView read GetOptionsView write SetOptionsView; end; { DBVericalGrid } TcxDBVerticalGridReportLinkBuilder = class(TcxVirtualVerticalGridReportLinkBuilder) public class function FormatterClass: TcxCustomVerticalGridReportLinkFormatterClass; override; end; TcxDBVerticalGridReportLinkFormatter = class(TcxVirtualVerticalGridReportLinkFormatter) private function GetDataController: TcxDBVerticalGridDataController; protected function GetAreRecordsNeededLoading: Boolean; override; function GetAreRecordsNeededUnloading: Boolean; override; procedure LoadRecords; override; procedure UnloadRecords; override; public property DataController: TcxDBVerticalGridDataController read GetDataController; end; TcxDBVerticalGridReportLink = class(TcxVirtualVerticalGridReportLink) private function GetDBVerticalGrid: TcxDBVerticalGrid; protected class function GetBuilderClass: TcxCustomVerticalGridReportLinkBuilderClass; override; public property DBVerticalGrid: TcxDBVerticalGrid read GetDBVerticalGrid; end; TcxfmVerticalGridReportLinkDesignWindow = class(TdxfmCustomcxControlReportLinkDesignWindow) PageControl1: TPageControl; tshView: TTabSheet; lblShow: TLabel; imgShow: TImage; bvlShow: TBevel; chbxShowHeaders: TCheckBox; chbxShowExpandButtons: TCheckBox; chbxShowBorders: TCheckBox; tshBehaviors: TTabSheet; lblExpanding: TLabel; imgExpanding: TImage; bvlExpanding: TBevel; lblSize: TLabel; bvlSize: TBevel; imgGridSize: TImage; chbxExpandRows: TCheckBox; chbxAutoWidth: TCheckBox; tshFormatting: TTabSheet; lblLookAndFeel: TLabel; bvlLookAndFeel: TBevel; imgLookAndFeel: TImage; imgRefinements: TImage; lblRefinements: TLabel; bvlRefinements: TBevel; cbxLookAndFeel: TComboBox; chbxFlatCheckMarks: TCheckBox; chbxDisplayGraphicsAsText: TCheckBox; chbxTransparentGraphics: TCheckBox; chbxSuppressBackgroundBitmaps: TCheckBox; tshStyles: TTabSheet; bvlStyles: TBevel; bvlStyleSheets: TBevel; lblStyleSheets: TLabel; bvlStylesHost: TBevel; btnStyleColor: TButton; btnStyleFont: TButton; btnStyleBackgroundBitmap: TButton; chbxUseNativeStyles: TCheckBox; cbxStyleSheets: TComboBox; btnStyleSheetNew: TButton; btnStyleSheetCopy: TButton; btnStyleSheetDelete: TButton; btnStylesSaveAs: TButton; btnStyleSheetRename: TButton; btnStyleBackgroundBitmapClear: TButton; btnStyleRestoreDefaults: TButton; cxStyleRepository1: TcxStyleRepository; styleCategory: TcxStyle; pmStyles: TPopupMenu; miStyleFont: TMenuItem; miStyleColor: TMenuItem; miLine3: TMenuItem; miStyleBackgroundBitmap: TMenuItem; miStyleBackgroundBitmapClear: TMenuItem; milLine: TMenuItem; miStylesSelectAll: TMenuItem; miLine2: TMenuItem; miStyleRestoreDefaults: TMenuItem; miLine4: TMenuItem; miStylesSaveAs: TMenuItem; ilStylesPopup: TImageList; pnlPreview: TPanel; chbxBestFit: TCheckBox; PreviewVGrid: TcxVerticalGrid; chbxWrapRecords: TCheckBox; chbxKeepSameRecordWidths: TCheckBox; lblPagination: TLabel; bvlPagination: TBevel; chbxPaginateByRows: TCheckBox; chbxPaginateByWrapping: TCheckBox; chbxOneWrappingPerPage: TCheckBox; imgPagination: TImage; rowLuxurySedan: TcxCategoryRow; rowManufacturer: TcxEditorRow; rowModel: TcxEditorRow; rowPicture: TcxEditorRow; rowEngine: TcxEditorRow; rowTransmission: TcxEditorRow; rowTires: TcxEditorRow; styleHeader: TcxStyle; styleContent: TcxStyle; lblPreviewWindow: TStaticText; bvlMultipleRecords: TBevel; cbxPrintMode: TComboBox; lblPrintMode: TLabel; Label1: TLabel; lblUseNativeStyles: TLabel; procedure LookAndFeelChange(Sender: TObject); procedure OptionsExpandingClick(Sender: TObject); procedure OptionsFormattingClick(Sender: TObject); procedure OptionsPaginationClick(Sender: TObject); procedure OptionsRefinementsClick(Sender: TObject); procedure OptionsSizeClick(Sender: TObject); procedure OptionsViewClick(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 PreviewVGridDrawValue(Sender: TObject; ACanvas: TcxCanvas; APainter: TcxvgPainter; AValueInfo: TcxRowValueInfo; var Done: Boolean); procedure PageControl1Change(Sender: TObject); procedure cbxPrintModeChange(Sender: TObject); procedure cbxStyleSheetsDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); procedure lblUseNativeStylesClick(Sender: TObject); private lbxStyles: TdxStylesListBox; function GetActiveStyle: TcxStyle; function GetComponent: TcxCustomVerticalGrid; function GetHasSelectedStyles: Boolean; function GetHasSelectedStylesWithAssignedBitmap: Boolean; function GetReportLink: TcxCustomVerticalGridReportLink; function CanSelectAllStyles: Boolean; procedure CreateControls; procedure CustomDrawTextRect(ACanvas: TcxCanvas; AViewInfo: TcxRowValueInfo; const AText: string); procedure InitializePreviewVerticalGridStyles; procedure LoadDataIntoPreviewVerticalGrid; procedure RecreateStylesListBox; procedure RestoreSelectedStyles(AList: TList); procedure SaveSelectedStyles(AList: TList); procedure SetActivePage; procedure UpdatePreviewVerticalGridStyles(const ACaption: string; AStyle: TcxStyle); procedure SetOptionsExpandingByIndex(Index: Integer; Value: Boolean); procedure SetOptionsFormattingByIndex(Index: Integer; Value: Boolean); procedure SetOptionsPaginationByIndex(Index: Integer; Value: Boolean); procedure SetOptionsRefinementsByIndex(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 GetStyleSheetNames(out AStrings: TStrings); override; procedure GetStyleNames(out AStrings: TStrings); override; property ActiveStyle: TcxStyle read GetActiveStyle; property Component: TcxCustomVerticalGrid read GetComponent; property HasSelectedStyles: Boolean read GetHasSelectedStyles; property HasSelectedStylesWithAssignedBitmap: Boolean read GetHasSelectedStylesWithAssignedBitmap; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; property ReportLink: TcxCustomVerticalGridReportLink read GetReportLink; end; function PreviewImage: TPicture; function PreviewImageAsString: AnsiString; implementation {$R *.dfm} { 652 x 432 - DesignWindow } {.3 - chbxTransparentRichEdits} uses {$IFDEF DELPHI6} Variants, {$ENDIF} Math, Forms, Registry, cxLookAndFeelPainters, cxDataUtils, cxDataStorage, dxPSRes, dxPSImgs, dxPSUtl, dxBkgnd, dxPSPopupMan; const DefaultExpandButtonSize = 11; DefaultIndentWidth = 20; DefaultRowMinHeight = 20; ExpandButtonInteriorColor: TColor = clWindow; // ------------------------------------------------------------------ // // Cell.Data = 0000.0000.0000.0000.0000.0000.0000.0000 = DWORD, 32b // // | | | | // // | | | | // // |ID,4| Index,8b| RecordIndex,20b | // // ------------------------------------------------------------------ // // ^ ^ ^ // | | | // | | ---- // | ---------------- | // --------------------- | | // | | | // | | | CodeAttributeMask = $0000000F; // -- | | CodeAttributeOffset = $0000001C; // | | CodeIndexMask = $000000FF; //------ | CodeIndexOffset = $00000014; // | CodeRecordIndexMask = $000FFFFF; //--------- CodeRecordIndexOffset = $00000000; var FBMW760Li: TPicture; FDefaultdxPScxVerticalGridLinkStyleSheet: TcxVerticalGridReportLinkStyleSheet; type TcxVerticalGridRowHelperFactory = class(TdxCustomClassMaps) private function GetHelperClass(Row: TcxCustomRow): TcxVerticalGridCustomRowHelperClass; public class function Instance: TcxVerticalGridRowHelperFactory; reintroduce; overload; property HelperClasses[Row: TcxCustomRow]: TcxVerticalGridCustomRowHelperClass read GetHelperClass; default; end; TcxCustomMultiEditorRowAccess = class(TcxCustomMultiEditorRow); TcxCustomRowAccess = class(TcxCustomRow); TcxCustomVerticalGridAccess = class(TcxCustomVerticalGrid); TcxUnboundVerticalGridAccess = class(TcxUnboundVerticalGrid); { Helpers } { CustomMultiEditorRow Helpers } function CustomMultiEditorRow_GetProperties(AInstance: TcxCustomMultiEditorRow): TcxMultiEditorRowProperties; begin Result := TcxCustomMultiEditorRowAccess(AInstance).Properties; end; { CustomRow Helpers } function CustomRow_GetProperties(AInstance: TcxCustomRow): TcxCustomRowProperties; begin Result := TcxCustomRowAccess(AInstance).FProperties; end; function CustomRow_IsHeightAssigned(AInstance: TcxCustomRow): Boolean; begin Result := TcxCustomRowAccess(AInstance).IsHeightAssigned; end; { CustomVerticalGrid Helpers } function CustomVerticalGrid_GetCategoryFont(AInstance: TcxCustomVerticalGrid): TFont; begin Result := TcxCustomVerticalGridAccess(AInstance).CategoryFont; end; function CustomVerticalGrid_GetDataController(AInstance: TcxCustomVerticalGrid): TcxCustomDataController; begin Result := TcxCustomVerticalGridAccess(AInstance).DataController; end; function CustomVerticalGrid_GetRecordCount(AInstance: TcxCustomVerticalGrid): Integer; begin Result := TcxCustomVerticalGridAccess(AInstance).RecordCount; end; { UnboundVerticalGrid Helpers } function UnboundVerticalGrid_GetLayoutStyle(AInstance: TcxUnboundVerticalGrid): TcxvgUnboundLayoutStyle; begin Result := TcxUnboundVerticalGridAccess(AInstance).LayoutStyle; end; { Utilities } function PreviewImage: TPicture; begin if FBMW760Li = nil then begin FBMW760Li := TPicture.Create; Bitmap_LoadFromResourceName(FBMW760Li.Bitmap, IDB_DXPSCARBMW760LI); end; Result := FBMW760Li; end; function PreviewImageAsString: AnsiString; begin cxImage.SavePicture(PreviewImage, Result); end; function DefaultdxPScxVerticalGridLinkStyleSheet: TcxVerticalGridReportLinkStyleSheet; function CreateStyle(AColor: TColor; AFontColor: TColor): TcxStyle; begin Result := TcxStyle.Create(DefaultdxPScxVerticalGridLinkStyleSheet); with Result do begin Color := AColor; Font.Name := dxPSCore.dxPSDefaultFontName; Font.Color := AFontColor; end; end; begin if FDefaultdxPScxVerticalGridLinkStyleSheet = nil then begin FDefaultdxPScxVerticalGridLinkStyleSheet := TcxVerticalGridReportLinkStyleSheet.Create(nil); with FDefaultdxPScxVerticalGridLinkStyleSheet.Styles as TcxVerticalGridReportLinkStyles do begin Category := CreateStyle(dxPSCore.dxDefaultFixedColor, dxPSCore.dxPSDefaultFontColor); Content := CreateStyle(dxPSCore.dxDefaultContentColor, dxPSCore.dxPSDefaultFontColor); Header := CreateStyle(dxPSCore.dxDefaultFixedColor, dxPSCore.dxPSDefaultFontColor); end; end; Result := FDefaultdxPScxVerticalGridLinkStyleSheet; end; { PlaceList Helpers } procedure ClearPlaceList(AList: TList); var I: Integer; begin for I := 0 to AList.Count - 1 do TObject(AList[I]).Free; AList.Clear; end; function CreatePlaceList(ACount: Integer): TList; var I: Integer; begin Result := TList.Create; Result.Capacity := ACount; for I := 0 to ACount - 1 do Result.Add(TcxVerticalGridRowElementPlace.Create); end; { TcxVerticalGridRowHelperFactory } function dxVerticalGridRowHelperFactory: TcxVerticalGridRowHelperFactory; begin Result := TcxVerticalGridRowHelperFactory.Instance; end; class function TcxVerticalGridRowHelperFactory.Instance: TcxVerticalGridRowHelperFactory; begin Result := inherited Instance as TcxVerticalGridRowHelperFactory; end; function TcxVerticalGridRowHelperFactory.GetHelperClass(Row: TcxCustomRow): TcxVerticalGridCustomRowHelperClass; begin Result := TcxVerticalGridCustomRowHelperClass(PairClasses[Row.ClassType]); end; { CLR Accessors } { TcxVerticalGridRowElementPlace } procedure TcxVerticalGridRowElementPlace.Clear; begin Offset := 0; Width := 0; end; { TcxVerticalGridCustomRowPlace } constructor TcxVerticalGridCustomRowPlace.Create(AFormatter: TcxCustomVerticalGridReportLinkFormatter; ARow: TcxCustomRow; AWrapIndex: Integer); begin inherited Create; FFormatter := AFormatter; FRow := ARow; FWrapIndex := AWrapIndex; end; procedure TcxVerticalGridCustomRowPlace.AddDelimiters(AReportLink: TcxCustomVerticalGridReportLink); begin end; procedure TcxVerticalGridCustomRowPlace.Calculate; begin end; function TcxVerticalGridCustomRowPlace.CalculatedHeaderWidth: Integer; begin Result := CalculatedMinWidth; end; function TcxVerticalGridCustomRowPlace.CalculatedMinHeight: Integer; begin Result := Formatter.GetImageHeight(Row, 0); if Result = 0 then Result := DefaultRowMinHeight; end; function TcxVerticalGridCustomRowPlace.CalculatedMinWidth: Integer; begin Result := IndentArea; end; function TcxVerticalGridCustomRowPlace.CalculatedRecordWidth(ARecordIndex: Integer): Integer; begin Result := 0; end; function TcxVerticalGridCustomRowPlace.CalculatedTextPatternHeight(AFont: HFONT): Integer; var Size: TSize; begin SelectObject(DC, AFont); GetTextExtentPoint(DC, 'Wg', 2, Size); Result := 2 + Size.cy + 2; end; function TcxVerticalGridCustomRowPlace.CalculatedTextWidth(const AText: string; AFont: HFONT): Integer; var Size: TSize; begin SelectObject(DC, AFont); GetTextExtentPoint(DC, PChar(AText), Length(AText), Size); Result := 3 + Size.cx + 3; end; procedure TcxVerticalGridCustomRowPlace.Clear; begin end; function TcxVerticalGridCustomRowPlace.GetHeaderAvailableWidth: Integer; begin Result := Formatter.HeaderAvailableWidths[Row]; end; function TcxVerticalGridCustomRowPlace.GetValueAvailableWidth(RecordIndex: Integer): Integer; begin Result := Formatter.RecordWidths[RecordIndex]; end; function TcxVerticalGridCustomRowPlace.Row: TcxCustomRow; begin Result := FRow; end; function TcxVerticalGridCustomRowPlace.RowHelper: TcxVerticalGridCustomRowHelper; begin Result := Formatter.RowHelpers[Row]; end; function TcxVerticalGridCustomRowPlace.GetDC: HDC; begin Result := Formatter.DC; end; function TcxVerticalGridCustomRowPlace.GetHasHeader: Boolean; begin Result := Formatter.ShowHeaders; end; function TcxVerticalGridCustomRowPlace.GetIndentArea: Integer; begin Result := Formatter.IndentAreas[Row]; end; function TcxVerticalGridCustomRowPlace.GetInterRecordsSpace: Integer; begin Result := Formatter.InterRecordsSpace; end; function TcxVerticalGridCustomRowPlace.GetItemCount: Integer; begin Result := RowHelper.ItemCount; end; function TcxVerticalGridCustomRowPlace.GetRecordCount: Integer; begin Result := Formatter.RecordCounts[WrapIndex]; end; function TcxVerticalGridCustomRowPlace.GetRecordWidth(RecordIndex: Integer): Integer; begin Result := Formatter.RecordWidths[RecordIndex]; end; function TcxVerticalGridCustomRowPlace.GetStartRecordIndex: Integer; begin Result := Formatter.WrappedRecordStartIndexes[WrapIndex]; end; function TcxVerticalGridCustomRowPlace.GetStopRecordIndex: Integer; begin Result := Formatter.WrappedRecordStopIndexes[WrapIndex]; end; { TcxVerticalGridCategoryRowPlace } constructor TcxVerticalGridCategoryRowPlace.Create(AFormatter: TcxCustomVerticalGridReportLinkFormatter; ARow: TcxCustomRow; AWrapIndex: Integer); begin inherited; FPlace := TcxVerticalGridRowElementPlace.Create; end; destructor TcxVerticalGridCategoryRowPlace.Destroy; begin FreeAndNil(FPlace); inherited; end; procedure TcxVerticalGridCategoryRowPlace.Calculate; begin inherited; FPlace.Offset := IndentArea; FPlace.Width := Formatter.ViewWidths[WrapIndex] - IndentArea; end; function TcxVerticalGridCategoryRowPlace.CalculatedHeaderWidth: Integer; begin Result := IndentArea; end; function TcxVerticalGridCategoryRowPlace.CalculatedMinHeight: Integer; var F: HFONT; V: Integer; begin Result := inherited CalculatedMinHeight; F := Windows.GetCurrentObject(DC, OBJ_FONT); V := CalculatedTextPatternHeight(Font.Handle); Windows.SelectObject(DC, F); if Result < V then Result := V; end; function TcxVerticalGridCategoryRowPlace.CalculatedMinWidth: Integer; var F: HFONT; begin Result := inherited CalculatedMinWidth; F := Windows.GetCurrentObject(DC, OBJ_FONT); Inc(Result, CalculatedTextWidth(Caption, Font.Handle)); Windows.SelectObject(DC, F); Inc(Result, Formatter.GetImageWidth(Row, 0)); end; function TcxVerticalGridCategoryRowPlace.Row: TcxCategoryRow; begin Result := inherited Row as TcxCategoryRow; end; function TcxVerticalGridCategoryRowPlace.RowHelper: TcxVerticalGridCategoryRowHelper; begin Result := inherited RowHelper as TcxVerticalGridCategoryRowHelper; end; function TcxVerticalGridCategoryRowPlace.GetCaption: string; begin Result := RowHelper.Caption; end; function TcxVerticalGridCategoryRowPlace.GetFont: TFont; begin Result := Formatter.GetCategoryRowFont(Row); end; function TcxVerticalGridCategoryRowPlace.GetOffset: Integer; begin Result := FPlace.Offset; end; function TcxVerticalGridCategoryRowPlace.GetWidth: Integer; begin Result := FPlace.Width; end; { TcxVerticalGridCustomEditorRowPlace } constructor TcxVerticalGridCustomEditorRowPlace.Create(AFormatter: TcxCustomVerticalGridReportLinkFormatter; ARow: TcxCustomRow; AWrapIndex: Integer); begin inherited; FHeaderPlace := TcxVerticalGridRowElementPlace.Create; CreateValuePlaces; end; destructor TcxVerticalGridCustomEditorRowPlace.Destroy; begin FreeAndNilValuePlaces; FreeAndNil(FHeaderPlace); inherited; end; procedure TcxVerticalGridCustomEditorRowPlace.AddDelimiters(AReportLink: TcxCustomVerticalGridReportLink); var I: Integer; begin inherited; if HasHeader then begin AReportLink.AddHorizontalDelimiter(HeaderPlace.Offset); AReportLink.AddHorizontalDelimiter(HeaderPlace.Offset + HeaderPlace.Width); end; for I := StartRecordIndex to StartRecordIndex + ValuePlaceCount - 1 do begin AReportLink.AddHorizontalDelimiter(ValuePlaces[I].Offset); AReportLink.AddHorizontalDelimiter(ValuePlaces[I].Offset + ValuePlaces[I].Width); end; end; procedure TcxVerticalGridCustomEditorRowPlace.Calculate; begin inherited; CalculateHeaderPlace; CalculateValuePlaces; end; function TcxVerticalGridCustomEditorRowPlace.CalculatedHeaderWidth: Integer; var F: HFONT; begin Result := inherited CalculatedHeaderWidth; F := Windows.GetCurrentObject(DC, OBJ_FONT); Inc(Result, CalculatedTextWidth(RowHelper.HeaderCaptions[0], HeaderFont.Handle)); SelectObject(DC, F); Inc(Result, Formatter.GetImageWidth(Row, 0)); if Result <> 0 then Inc(Result, 1 + 1); // Borders end; function TcxVerticalGridCustomEditorRowPlace.CalculatedMinHeight: Integer; var I, HeaderMinHeight, V, RowMinHeight: Integer; begin Result := inherited CalculatedMinHeight; HeaderMinHeight := CalculatedTextPatternHeight(HeaderFont.Handle); RowMinHeight := 0; for I := 0 to RecordCount - 1 do begin V := CalculatedTextPatternHeight(ValueFonts[I].Handle); if RowMinHeight < V then RowMinHeight := V; end; Result := Round(Math.MaxValue([Result, HeaderMinHeight, RowMinHeight])); end; function TcxVerticalGridCustomEditorRowPlace.CalculatedRecordWidth(ARecordIndex: Integer): Integer; begin if DoesItemParticipateInBestFitCalculation(ARecordIndex) then begin Result := MeasureWidth(ARecordIndex); if Result <> 0 then Inc(Result, 1 + 1); // Borders end else Result := 0; end; procedure TcxVerticalGridCustomEditorRowPlace.CalculateHeaderPlace; begin HeaderPlace.Offset := IndentArea; if HasHeader then HeaderPlace.Width := HeaderAvailableWidth; end; procedure TcxVerticalGridCustomEditorRowPlace.CalculateValuePlaces; var CurrentOffset, I: Integer; begin CurrentOffset := ValuesOffset; for I := StartRecordIndex to StopRecordIndex do begin with ValuePlaces[I] do begin Offset := CurrentOffset; Width := RecordWidths[I]; end; Inc(CurrentOffset, ValuePlaces[I].Width + InterRecordsSpace); end; end; procedure TcxVerticalGridCustomEditorRowPlace.Clear; begin inherited; HeaderPlace.Clear; ClearValuePlaces; end; procedure TcxVerticalGridCustomEditorRowPlace.ClearValuePlaces; begin ClearPlaceList(FValuePlaces); end; procedure TcxVerticalGridCustomEditorRowPlace.CreateValuePlaces; begin FValuePlaces := CreatePlaceList(RecordCount); end; procedure TcxVerticalGridCustomEditorRowPlace.FreeAndNilValuePlaces; begin ClearValuePlaces; FreeAndNil(FValuePlaces); end; function TcxVerticalGridCustomEditorRowPlace.DoesItemParticipateInBestFitCalculation(ARecordIndex: Integer): Boolean; begin Result := dxPScxCommon.dxPSDataMaps.DoesItemParticipateInBestFitCalculation(Properties[ARecordIndex]); end; function TcxVerticalGridCustomEditorRowPlace.MeasureWidth(ARecordIndex: Integer): Integer; begin Result := dxPScxCommon.dxPSDataMaps.MeasureWidth(Properties[ARecordIndex], Values[ARecordIndex], Formatter, ValueFonts[ARecordIndex], ARecordIndex); end; function TcxVerticalGridCustomEditorRowPlace.Row: TcxCustomEditorRow; begin Result := inherited Row as TcxCustomEditorRow; end; function TcxVerticalGridCustomEditorRowPlace.RowHelper: TcxVerticalGridCustomEditorRowHelper; begin Result := inherited RowHelper as TcxVerticalGridCustomEditorRowHelper; end; function TcxVerticalGridCustomEditorRowPlace.GetHeaderFont: TFont; begin Result := Formatter.GetRowHeaderFont(Row, 0); end; function TcxVerticalGridCustomEditorRowPlace.GetProperty(RecordIndex: Integer): TcxCustomEditProperties; begin Result := RowHelper.EditProperties[0, RecordIndex]; end; function TcxVerticalGridCustomEditorRowPlace.GetValueFont(RecordIndex: Integer): TFont; begin Result := Formatter.GetRowValueFont(Row, 0, RecordIndex); end; function TcxVerticalGridCustomEditorRowPlace.GetValuePlace(RecordIndex: Integer): TcxVerticalGridRowElementPlace; begin Result := FValuePlaces[RecordIndex - StartRecordIndex]; end; function TcxVerticalGridCustomEditorRowPlace.GetValuePlaceCount: Integer; begin Result := FValuePlaces.Count; end; function TcxVerticalGridCustomEditorRowPlace.GetValue(RecordIndex: Integer): TcxEditValue; begin Result := RowHelper.Values[0, RecordIndex]; end; function TcxVerticalGridCustomEditorRowPlace.GetValuesOffset: Integer; begin Result := HeaderPlace.Offset + HeaderPlace.Width; end; { TcxVerticalGridCustomMultiEditorRowPlace } constructor TcxVerticalGridCustomMultiEditorRowPlace.Create(AFormatter: TcxCustomVerticalGridReportLinkFormatter; ARow: TcxCustomRow; AWrapIndex: Integer); begin inherited; CreatePlaces; end; destructor TcxVerticalGridCustomMultiEditorRowPlace.Destroy; begin FreeAndNilPlaces; inherited; end; procedure TcxVerticalGridCustomMultiEditorRowPlace.AddDelimiters(AReportLink: TcxCustomVerticalGridReportLink); begin inherited; AReportLink.AddHorizontalDelimiter(ValuesOffset); end; procedure TcxVerticalGridCustomMultiEditorRowPlace.Calculate; begin inherited; if HasHeaderSeparators then CalculateHeaderSeparatorWidths; if HasValueSeparators then CalculateValueSeparatorWidths; CalculateHeaderPlaces; CalculateValuePlaces; if HasHeaderSeparators then CalculateHeaderSeparatorPlaces; if HasValueSeparators then CalculateValueSeparatorPlaces; end; function TcxVerticalGridCustomMultiEditorRowPlace.CalculatedHeaderWidth: Integer; var I: Integer; begin Result := inherited CalculatedHeaderWidth; for I := 0 to ItemCount - 1 do begin Inc(Result, Formatter.GetImageWidth(Row, I)); Inc(Result, CalculatedTextWidth(RowHelper.HeaderCaptions[I], HeaderFonts[I].Handle)); end; if HasHeaderSeparators then begin CalculateHeaderSeparatorWidths; Inc(Result, HeaderSeparatorsArea); end; end; function TcxVerticalGridCustomMultiEditorRowPlace.CalculatedMinHeight: Integer; var I, J, V, RowMinHeight, ImageHeight, RowHeaderMinHeight, ValueSeparatorMinHeight: Integer; begin RowHeaderMinHeight := 0; ImageHeight := 0; for I := 0 to ItemCount - 1 do begin V := CalculatedTextPatternHeight(HeaderFonts[I].Handle); if RowHeaderMinHeight < V then RowHeaderMinHeight := V; V := Formatter.GetImageHeight(Row, I); if ImageHeight < V then ImageHeight := V; end; RowMinHeight := 0; ValueSeparatorMinHeight := 0; for I := 0 to RecordCount - 1 do for J := 0 to ItemCount - 1 do begin V := CalculatedTextPatternHeight(ValueFonts[J, I].Handle); if RowMinHeight < V then RowMinHeight := V; V := CalculatedTextPatternHeight(ValueSeparatorsFonts[J, I].Handle); if ValueSeparatorMinHeight < V then ValueSeparatorMinHeight := V; end; Result := Round(Math.MaxValue([RowHeaderMinHeight, RowMinHeight, ValueSeparatorMinHeight, ImageHeight, DefaultRowMinHeight])); end; function TcxVerticalGridCustomMultiEditorRowPlace.CalculatedRecordWidth(ARecordIndex: Integer): Integer; var I, W: Integer; begin Result := 0; for I := 0 to ItemCount - 1 do if DoesItemParticipateInBestFitCalculation(I, ARecordIndex) then begin W := MeasureWidth(I, ARecordIndex); if W <> 0 then Inc(W, 1 + 1); // borders Inc(Result, W); end; if HasValueSeparators then begin CalculateValueSeparatorWidths; Inc(Result, ValueSeparatorsAreas[ARecordIndex]); end; if Result <> 0 then Inc(Result, 1 + 1); // Borders end; procedure TcxVerticalGridCustomMultiEditorRowPlace.CalculateHeaderPartWidths; var AutoWidthObject: TcxAutoWidthObject; I: Integer; begin AutoWidthObject := TcxAutoWidthObject.Create(RowHelper.ItemCount); try CalculatePartWidths(AutoWidthObject, HeaderAvailableWidth); for I := 0 to AutoWidthObject.Count - 1 do HeaderPlaces[I].Width := AutoWidthObject[I].AutoWidth; finally AutoWidthObject.Free; end; end; procedure TcxVerticalGridCustomMultiEditorRowPlace.CalculateHeaderPlaces; var CurrentOffset, I: Integer; begin if HasHeader then CalculateHeaderPartWidths; CurrentOffset := IndentArea; for I := 0 to ItemCount - 1 do begin HeaderPlaces[I].Offset := CurrentOffset; Inc(CurrentOffset, HeaderPlaces[I].Width); if HasHeaderSeparators and (I < ItemCount - 1) then Inc(CurrentOffset, HeaderSeparatorPlaces[I].Width); end; end; procedure TcxVerticalGridCustomMultiEditorRowPlace.CalculateHeaderSeparatorPlaces; var CurrentOffset, I: Integer; begin CurrentOffset := IndentArea; for I := 0 to HeaderSeparatorCount - 1 do begin Inc(CurrentOffset, HeaderPlaces[I].Width); HeaderSeparatorPlaces[I].Offset := CurrentOffset; Inc(CurrentOffset, HeaderSeparatorPlaces[I].Width); end; end; procedure TcxVerticalGridCustomMultiEditorRowPlace.CalculateHeaderSeparatorWidths; var F: HFONT; I: Integer; begin F := Windows.GetCurrentObject(DC, OBJ_FONT); for I := 0 to HeaderSeparatorCount - 1 do HeaderSeparatorPlaces[I].Width := CalculatedTextWidth(RowHelper.HeaderSeparatorTexts[I], HeaderSeparatorsFonts[I].Handle); Windows.SelectObject(DC, F); end; procedure TcxVerticalGridCustomMultiEditorRowPlace.CalculatePartWidths(AnAutoWidthObject: TcxAutoWidthObject; AnAvailableWidth: Integer); procedure AssignAutoWidthItem(AnItem: TcxAutoWidthItem; AProperties: TcxEditorRowItemProperties); begin AnItem.MinWidth := 0; AnItem.Width := AProperties.Width; end; var I: Integer; begin for I := 0 to ItemCount - 1 do AssignAutoWidthItem(AnAutoWidthObject.AddItem, RowHelper.Properties(I)); AnAutoWidthObject.AvailableWidth := AnAvailableWidth; AnAutoWidthObject.Calculate; end; procedure TcxVerticalGridCustomMultiEditorRowPlace.CalculateValuePartWidths; procedure CalculateValueRecordPartWidths(ARecordIndex: Integer); var AutoWidthObject: TcxAutoWidthObject; I: Integer; begin AutoWidthObject := TcxAutoWidthObject.Create(RowHelper.ItemCount); try CalculatePartWidths(AutoWidthObject, ValueAvailableWidths[ARecordIndex]); for I := 0 to AutoWidthObject.Count - 1 do ValuePlaces[I, ARecordIndex].Width := AutoWidthObject[I].AutoWidth; finally AutoWidthObject.Free; end; end; var I: Integer; begin for I := StartRecordIndex to StopRecordIndex do CalculateValueRecordPartWidths(I); end; procedure TcxVerticalGridCustomMultiEditorRowPlace.CalculateValuePlaces; var CurrentOffset, I, J: Integer; begin CalculateValuePartWidths; CurrentOffset := ValuesOffset; for I := StartRecordIndex to StopRecordIndex do begin for J := 0 to ItemCount - 1 do begin ValuePlaces[J, I].Offset := CurrentOffset; Inc(CurrentOffset, ValuePlaces[J, I].Width); if HasValueSeparators and (J < ItemCount - 1) then Inc(CurrentOffset, ValueSeparatorPlaces[J, I].Width); end; Inc(CurrentOffset, InterRecordsSpace); end; end; procedure TcxVerticalGridCustomMultiEditorRowPlace.CalculateValueSeparatorPlaces; var CurrentOffset, I, J: Integer; begin CurrentOffset := ValuesOffset; for I := StartRecordIndex to StopRecordIndex do begin Inc(CurrentOffset, ValuePlaces[0, I].Width); for J := 0 to ValueSeparatorCount - 1 do begin ValueSeparatorPlaces[J, I].Offset := CurrentOffset; Inc(CurrentOffset, ValuePlaces[J + 1, I].Width + ValueSeparatorPlaces[J, I].Width); end; Inc(CurrentOffset, InterRecordsSpace); end; end; procedure TcxVerticalGridCustomMultiEditorRowPlace.CalculateValueSeparatorWidths; var F: HFONT; I, J: Integer; begin F := Windows.GetCurrentObject(DC, OBJ_FONT); for I := StartRecordIndex to StopRecordIndex do for J := 0 to ValueSeparatorCount - 1 do ValueSeparatorPlaces[J, I].Width := CalculatedTextWidth(RowHelper.ValueSeparatorTexts[J], ValueSeparatorsFonts[J, I].Handle); Windows.SelectObject(DC, F); end; procedure TcxVerticalGridCustomMultiEditorRowPlace.Clear; begin inherited; ClearPlaces; end; function TcxVerticalGridCustomMultiEditorRowPlace.GetHeaderAvailableWidth: Integer; begin Result := inherited GetHeaderAvailableWidth - HeaderSeparatorsArea; end; function TcxVerticalGridCustomMultiEditorRowPlace.GetValueAvailableWidth(RecordIndex: Integer): Integer; begin Result := inherited GetValueAvailableWidth(RecordIndex) - ValueSeparatorsAreas[RecordIndex]; end; procedure TcxVerticalGridCustomMultiEditorRowPlace.ClearPlaces; begin ClearPlaceList(FHeaderPlaces); ClearPlaceList(FHeaderSeparatorPlaces); ClearPlaceList(FValuePlaces); ClearPlaceList(FValueSeparatorPlaces); end; procedure TcxVerticalGridCustomMultiEditorRowPlace.CreatePlaces; begin FHeaderPlaces := CreatePlaceList(ItemCount); FHeaderSeparatorPlaces := CreatePlaceList(HeaderSeparatorCount); FValuePlaces := CreatePlaceList(RecordCount * ItemCount); FValueSeparatorPlaces := CreatePlaceList(RecordCount * ValueSeparatorCount); end; procedure TcxVerticalGridCustomMultiEditorRowPlace.FreeAndNilPlaces; begin ClearPlaces; FreeAndNil(FHeaderPlaces); FreeAndNil(FHeaderSeparatorPlaces); FreeAndNil(FValuePlaces); FreeAndNil(FValueSeparatorPlaces); end; function TcxVerticalGridCustomMultiEditorRowPlace.DoesItemParticipateInBestFitCalculation(ACellIndex, ARecordIndex: Integer): Boolean; begin Result := dxPScxCommon.dxPSDataMaps.DoesItemParticipateInBestFitCalculation(Properties[ACellIndex, ARecordIndex]); end; function TcxVerticalGridCustomMultiEditorRowPlace.MeasureWidth(ACellIndex, ARecordIndex: Integer): Integer; begin Result := dxPScxCommon.dxPSDataMaps.MeasureWidth(Properties[ACellIndex, ARecordIndex], Values[ACellIndex, ARecordIndex], Formatter, ValueFonts[ACellIndex, ARecordIndex], ARecordIndex); end; function TcxVerticalGridCustomMultiEditorRowPlace.Row: TcxCustomMultiEditorRow; begin Result := inherited Row as TcxCustomMultiEditorRow; end; function TcxVerticalGridCustomMultiEditorRowPlace.RowHelper: TcxVerticalGridCustomMultiEditorRowHelper; begin Result := inherited RowHelper as TcxVerticalGridCustomMultiEditorRowHelper; end; function TcxVerticalGridCustomMultiEditorRowPlace.GetHasHeaderSeparators: Boolean; begin Result := HasHeader and RowHelper.HasHeaderSeparators; end; function TcxVerticalGridCustomMultiEditorRowPlace.GetHasValueSeparators: Boolean; begin Result := RowHelper.HasValueSeparators; end; function TcxVerticalGridCustomMultiEditorRowPlace.GetHeaderFont(CellIndex: Integer): TFont; begin Result := Formatter.GetRowHeaderFont(Row, CellIndex); end; function TcxVerticalGridCustomMultiEditorRowPlace.GetHeaderPlace(CellIndex: Integer): TcxVerticalGridRowElementPlace; begin Result := FHeaderPlaces[CellIndex]; end; function TcxVerticalGridCustomMultiEditorRowPlace.GetHeaderPlaceCount: Integer; begin Result := FHeaderPlaces.Count; end; function TcxVerticalGridCustomMultiEditorRowPlace.GetHeaderSeparatorCount: Integer; begin Result := RowHelper.HeaderSeparatorCount; end; function TcxVerticalGridCustomMultiEditorRowPlace.GetHeaderSeparatorPlace(CellIndex: Integer): TcxVerticalGridRowElementPlace; begin Result := FHeaderSeparatorPlaces[CellIndex]; end; function TcxVerticalGridCustomMultiEditorRowPlace.GetHeaderSeparatorPlaceCount: Integer; begin Result := FHeaderSeparatorPlaces.Count; end; function TcxVerticalGridCustomMultiEditorRowPlace.GetHeaderSeparatorsArea: Integer; var I: Integer; begin if HasHeaderSeparators then begin Result := 0; for I := 0 to HeaderSeparatorCount - 1 do Inc(Result, HeaderSeparatorPlaces[I].Width); end else Result := 0; end; function TcxVerticalGridCustomMultiEditorRowPlace.GetHeaderSeparatorsFont(CellIndex: Integer): TFont; begin Result := Formatter.GetRowHeaderSeparatorsFont(Row, CellIndex); end; function TcxVerticalGridCustomMultiEditorRowPlace.GetProperty(CellIndex, RecordIndex: Integer): TcxCustomEditProperties; begin Result := RowHelper.EditProperties[CellIndex, RecordIndex]; end; function TcxVerticalGridCustomMultiEditorRowPlace.GetValue(CellIndex, RecordIndex: Integer): TcxEditValue; begin Result := RowHelper.Values[CellIndex, RecordIndex]; end; function TcxVerticalGridCustomMultiEditorRowPlace.GetValueFlatIndex(CellIndex, RecordIndex: Integer): Integer; begin Result := RecordIndex * ItemCount + CellIndex; end; function TcxVerticalGridCustomMultiEditorRowPlace.GetValueFont(CellIndex, RecordIndex: Integer): TFont; begin Result := Formatter.GetRowValueFont(Row, CellIndex, RecordIndex); end; function TcxVerticalGridCustomMultiEditorRowPlace.GetValuePlace(CellIndex, RecordIndex: Integer): TcxVerticalGridRowElementPlace; begin Result := FValuePlaces[ValueFlatIndexes[CellIndex, RecordIndex - StartRecordIndex]]; end; function TcxVerticalGridCustomMultiEditorRowPlace.GetValuePlaceCount: Integer; begin Result := FValuePlaces.Count; end; function TcxVerticalGridCustomMultiEditorRowPlace.GetValueSeparatorsArea(RecordIndex: Integer): Integer; var I: Integer; begin if HasValueSeparators then begin Result := 0; for I := 0 to RowHelper.ValueSeparatorCount - 1 do Inc(Result, ValueSeparatorPlaces[I, RecordIndex].Width); end else Result := 0; end; function TcxVerticalGridCustomMultiEditorRowPlace.GetValueSeparatorCount: Integer; begin Result := RowHelper.ValueSeparatorCount; end; function TcxVerticalGridCustomMultiEditorRowPlace.GetValueSeparatorFlatIndex(CellIndex, RecordIndex: Integer): Integer; begin Result := RecordIndex * ValueSeparatorCount + CellIndex; end; function TcxVerticalGridCustomMultiEditorRowPlace.GetValueSeparatorPlace(CellIndex, RecordIndex: Integer): TcxVerticalGridRowElementPlace; begin Result := FValueSeparatorPlaces[ValueSeparatorFlatIndexes[CellIndex, RecordIndex - StartRecordIndex]]; end; function TcxVerticalGridCustomMultiEditorRowPlace.GetValueSeparatorPlaceCount: Integer; begin Result := FValueSeparatorPlaces.Count; end; function TcxVerticalGridCustomMultiEditorRowPlace.GetValueSeparatorsFont(CellIndex, RecordIndex: Integer): TFont; begin Result := Formatter.GetRowValueSeparatorsFont(Row, CellIndex, RecordIndex); end; function TcxVerticalGridCustomMultiEditorRowPlace.GetValuesOffset: Integer; begin with HeaderPlaces[RowHelper.ItemCount - 1] do Result := Offset + Width; end; { TcxVerticalGridReportLinkCustomElementProducer } constructor TcxVerticalGridReportLinkCustomElementProducer.Create(ABuilder: TcxCustomVerticalGridReportLinkBuilder); begin inherited Create; FBuilder := ABuilder; end; function TcxVerticalGridReportLinkCustomElementProducer.Adapter: TcxCustomVerticalGridAdapter; begin Result := Builder.Adapter; end; function TcxVerticalGridReportLinkCustomElementProducer.Builder: TcxCustomVerticalGridReportLinkBuilder; begin Result := FBuilder; end; function TcxVerticalGridReportLinkCustomElementProducer.Formatter: TcxCustomVerticalGridReportLinkFormatter; begin Result := Builder.Formatter; end; function TcxVerticalGridReportLinkCustomElementProducer.Produce(AHostInfo: TcxVerticalGridHostInfo; AWrapIndex: Integer): TdxReportCell; begin FWrapIndex := AWrapIndex; CalculateRowHeight; CreateRowHost(AHostInfo); CreateRow; Inc(AHostInfo.Origin.Y, RowHeight); Result := Host; end; procedure TcxVerticalGridReportLinkCustomElementProducer.CalculateRowHeight; begin FRowHeight := Formatter.WrapSeparatorHeight; end; procedure TcxVerticalGridReportLinkCustomElementProducer.CreateRow; begin FRow := TdxReportCell.Create(Host); FRow.BoundsRect := MakeBounds(0, 0, RowWidth, RowHeight); InitializeRow; end; procedure TcxVerticalGridReportLinkCustomElementProducer.CreateRowHost(AHostInfo: TcxVerticalGridHostInfo); begin FHost := TdxReportCell.Create(AHostInfo.Parent); FHost.BoundsRect := MakeBounds(AHostInfo.Origin.X, AHostInfo.Origin.Y, RowWidth, RowHeight); Formatter.DoInitializeHost(Host); end; procedure TcxVerticalGridReportLinkCustomElementProducer.InitializeRow; begin end; function TcxVerticalGridReportLinkCustomElementProducer.GetDC: HDC; begin Result := Formatter.DC; end; function TcxVerticalGridReportLinkCustomElementProducer.GetRowWidth: Integer; begin Result := Formatter.ViewWidths[WrapIndex]; end; { TcxVerticalGridReportLinkWrapSeparatorProducer } procedure TcxVerticalGridReportLinkWrapSeparatorProducer.CreateRow; begin inherited; CreateSeparator(Row); end; procedure TcxVerticalGridReportLinkWrapSeparatorProducer.CreateSeparator(AParent: TdxReportCell); begin FSeparator := Formatter.GetWrapSeparatorClass.Create(AParent); FSeparator.BoundsRect := SeparatorBounds; InitializeSeparator; end; procedure TcxVerticalGridReportLinkWrapSeparatorProducer.InitializeRow; begin Formatter.DoInitializeWrapSeparatorRow(Row); end; procedure TcxVerticalGridReportLinkWrapSeparatorProducer.InitializeSeparator; begin Formatter.DoInitializeWrapSeparatorItem(Separator, WrapIndex); end; function TcxVerticalGridReportLinkWrapSeparatorProducer.GetSeparatorBounds: TRect; begin Result := Row.BoundsRect; OffsetRect(Result, -Result.Left, -Result.Top); end; { TcxVerticalGridReportLinkCustomRowProducer } constructor TcxVerticalGridReportLinkCustomRowProducer.Create(ABuilder: TcxCustomVerticalGridReportLinkBuilder); begin inherited; FIndents := TList.Create; end; destructor TcxVerticalGridReportLinkCustomRowProducer.Destroy; begin FreeAndNil(FIndents); inherited; end; function TcxVerticalGridReportLinkCustomRowProducer.GridRow: TcxCustomRow; begin Result := FGridRow; end; function TcxVerticalGridReportLinkCustomRowProducer.GridRowHelper: TcxVerticalGridCustomRowHelper; begin Result := Formatter.RowHelpers[GridRow]; end; function TcxVerticalGridReportLinkCustomRowProducer.GridRowPlace: TcxVerticalGridCustomRowPlace; begin Result := Formatter.RowPlacesByRow[GridRow, WrapIndex]; end; function TcxVerticalGridReportLinkCustomRowProducer.Produce(AHostInfo: TcxVerticalGridHostInfo; AGridRow: TcxCustomRow; AWrapIndex: Integer): TdxReportCell; begin ClearItems; FWrapIndex := AWrapIndex; FGridRow := AGridRow; try CalculateRowHeight; CreateRowHost(AHostInfo); CreateRow; if AutoHeight then begin CalculateRowAutoHeight; FixupRowHeight; end; Inc(AHostInfo.Origin.Y, RowHeight); Result := Host; finally FGridRow := nil; end; end; procedure TcxVerticalGridReportLinkCustomRowProducer.CalculateRowAutoHeight; var DC: HDC; MaxRowHeight, I, V: Integer; Item: TAbstractdxReportCellData; 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; RowHeight := MaxRowHeight; end; procedure TcxVerticalGridReportLinkCustomRowProducer.CalculateRowHeight; begin FRowHeight := Formatter.RowHeights[GridRow]; Inc(FRowHeight, 1 + 1); end; procedure TcxVerticalGridReportLinkCustomRowProducer.ClearItems; begin FIndents.Clear; end; procedure TcxVerticalGridReportLinkCustomRowProducer.CreateRow; begin inherited; if HasIndents then CreateRowIndents(Row); end; function TcxVerticalGridReportLinkCustomRowProducer.CreateRowIndent(AParent: TdxReportCell): TdxReportCellExpandButton; begin Result := Formatter.GetRowIndentClass.Create(AParent); FIndents.Add(Result); end; procedure TcxVerticalGridReportLinkCustomRowProducer.CreateRowIndents(AParent: TdxReportCell); var I: Integer; Indent: TdxReportCellExpandButton; begin for I := 0 to IndentCount - 1 do begin Indent := CreateRowIndent(AParent); Indent.BoundsRect := IndentBounds[I]; InitializeRowIndent(Indent, I); end; end; function TcxVerticalGridReportLinkCustomRowProducer.DoesItemParticipateInRowAutoHeightCalculation(AnItem: TAbstractdxReportCellData): Boolean; begin Result := True; end; procedure TcxVerticalGridReportLinkCustomRowProducer.FixupRowDataHeight; var I: Integer; begin for I := 0 to Row.DataItemCount - 1 do Row.DataItems[I].Height := RowHeight; end; procedure TcxVerticalGridReportLinkCustomRowProducer.FixupRowHeight; begin FixupRowItselfHeight; FixupRowDataHeight; end; procedure TcxVerticalGridReportLinkCustomRowProducer.FixupRowItselfHeight; begin Host.Height := RowHeight; Row.Height := RowHeight; end; procedure TcxVerticalGridReportLinkCustomRowProducer.InitializeRow; begin Formatter.DoInitializeRowReportRow(GridRow, Row); end; procedure TcxVerticalGridReportLinkCustomRowProducer.InitializeRowIndent(AnItem: TdxReportCellExpandButton; AnIndex: Integer); begin Formatter.DoInitializeRowIndent(GridRow, AnItem, AnIndex, IndentCount); Formatter.DoReportLinkInitializeRowIndent(GridRow, AnItem, AnIndex); end; function TcxVerticalGridReportLinkCustomRowProducer.GetAutoHeight: Boolean; begin Result := Adapter.CellAutoHeight and GridRow.Options.CanAutoHeight and not CustomRow_IsHeightAssigned(GridRow); end; function TcxVerticalGridReportLinkCustomRowProducer.GetLineHeight: Integer; begin if not CustomRow_IsHeightAssigned(GridRow) then Result := GridRow.Height else Result := Row.Height; end; function TcxVerticalGridReportLinkCustomRowProducer.GetHasIndents: Boolean; begin Result := IndentCount <> 0; end; function TcxVerticalGridReportLinkCustomRowProducer.GetIndent(Index: Integer): TdxReportCellExpandButton; begin Result := TdxReportCellExpandButton(FIndents[Index]); end; function TcxVerticalGridReportLinkCustomRowProducer.GetIndentBounds(Index: Integer): TRect; begin Result := MakeBounds(IndentWidth * Index, 0, IndentWidth, RowHeight); end; function TcxVerticalGridReportLinkCustomRowProducer.GetIndentCount: Integer; begin if Formatter.ShowHeaders then Result := Adapter.IndentCounts[GridRow] else Result := 0; end; function TcxVerticalGridReportLinkCustomRowProducer.GetIndentWidth: Integer; begin Result := Adapter.IndentWidth; end; function TcxVerticalGridReportLinkCustomRowProducer.GetItemCount: Integer; begin Result := GridRowHelper.ItemCount; end; function TcxVerticalGridReportLinkCustomRowProducer.GetRecordCount: Integer; begin Result := Formatter.RecordCounts[WrapIndex]; end; function TcxVerticalGridReportLinkCustomRowProducer.GetStartRecordIndex: Integer; begin Result := Formatter.WrappedRecordStartIndexes[WrapIndex]; end; function TcxVerticalGridReportLinkCustomRowProducer.GetStopRecordIndex: Integer; begin Result := Formatter.WrappedRecordStopIndexes[WrapIndex]; end; { TcxVerticalGridReportLinkCategoryRowProducer } function TcxVerticalGridReportLinkCategoryRowProducer.GridRow: TcxCategoryRow; begin Result := inherited GridRow as TcxCategoryRow; end; function TcxVerticalGridReportLinkCategoryRowProducer.GridRowHelper: TcxVerticalGridCategoryRowHelper; begin Result := inherited GridRowHelper as TcxVerticalGridCategoryRowHelper; end; function TcxVerticalGridReportLinkCategoryRowProducer.GridRowPlace: TcxVerticalGridCategoryRowPlace; begin Result := inherited GridRowPlace as TcxVerticalGridCategoryRowPlace; end; procedure TcxVerticalGridReportLinkCategoryRowProducer.CreateCategoryRow(AParent: TdxReportCell); var Item: TdxReportCellImage; begin Item := Formatter.GetCategoryRowClass(GridRow).Create(Row); Item.BoundsRect := CategoryBounds; Formatter.DoInitializeCategoryRow(GridRow, Item); end; procedure TcxVerticalGridReportLinkCategoryRowProducer.CreateRow; begin inherited; CreateCategoryRow(Row); end; function TcxVerticalGridReportLinkCategoryRowProducer.GetCategoryBounds: TRect; begin Result := MakeBounds(GridRowPlace.Offset, 0, GridRowPlace.Width, RowHeight); end; { TcxVerticalGridReportLinkCustomEditableRowProducer } constructor TcxVerticalGridReportLinkCustomEditableRowProducer.Create(ABuilder: TcxCustomVerticalGridReportLinkBuilder); begin inherited; FHeaders := TList.Create; FValues := TList.Create; end; destructor TcxVerticalGridReportLinkCustomEditableRowProducer.Destroy; begin FreeAndNil(FValues); FreeAndNil(FHeaders); inherited; end; procedure TcxVerticalGridReportLinkCustomEditableRowProducer.ClearItems; begin inherited; FHeaders.Clear; FValues.Clear; end; function TcxVerticalGridReportLinkCustomEditableRowProducer.CreateHeaderItem(AParent: TdxReportCell; ACellIndex: Integer): TdxReportCellImage; begin Result := Formatter.GetRowHeaderClass(GridRow).Create(AParent); FHeaders.Add(Result); end; function TcxVerticalGridReportLinkCustomEditableRowProducer.CreateValueItem(AParent: TdxReportCell; ACellIndex, ARecordIndex: Integer): TAbstractdxReportCellData; begin Result := Formatter.GetRowValueClass(GridRow, ACellIndex, ARecordIndex).Create(AParent); FValues.Add(Result); end; procedure TcxVerticalGridReportLinkCustomEditableRowProducer.DoInitializeHeader(AnItem: TdxReportCellImage; AnIndex: Integer); begin Formatter.DoInitializeRowHeader(GridRow, AnItem, AnIndex); Formatter.DoReportLinkInitializeRowHeader(GridRow, AnItem, AnIndex); end; procedure TcxVerticalGridReportLinkCustomEditableRowProducer.DoInitializeValue(AnItem: TAbstractdxReportCellData; ACellIndex, ARecordIndex: Integer); begin Formatter.DoInitializeRowValue(GridRow, AnItem, ACellIndex, ARecordIndex); Formatter.DoReportLinkInitializeRowValue(GridRow, AnItem, ACellIndex, ARecordIndex); end; function TcxVerticalGridReportLinkCustomEditableRowProducer.DoesItemParticipateInRowAutoHeightCalculation( AnItem: TAbstractdxReportCellData): Boolean; begin Result := True; end; function TcxVerticalGridReportLinkCustomEditableRowProducer.GetHeader(Index: Integer): TdxReportCellImage; begin Result := TdxReportCellImage(FHeaders[Index]); end; function TcxVerticalGridReportLinkCustomEditableRowProducer.GetHeaderCount: Integer; begin Result := FHeaders.Count; end; function TcxVerticalGridReportLinkCustomEditableRowProducer.GetValue(Index: Integer): TAbstractdxReportCellData; begin Result := TAbstractdxReportCellData(FValues[Index]); end; function TcxVerticalGridReportLinkCustomEditableRowProducer.GetValueCount: Integer; begin Result := FValues.Count; end; { TcxVerticalGridReportLinkCustomEditorRowProducer } function TcxVerticalGridReportLinkCustomEditorRowProducer.GridRow: TcxCustomEditorRow; begin Result := inherited GridRow as TcxCustomEditorRow; end; function TcxVerticalGridReportLinkCustomEditorRowProducer.GridRowHelper: TcxVerticalGridCustomEditorRowHelper; begin Result := inherited GridRowHelper as TcxVerticalGridCustomEditorRowHelper; end; function TcxVerticalGridReportLinkCustomEditorRowProducer.GridRowPlace: TcxVerticalGridCustomEditorRowPlace; begin Result := inherited GridRowPlace as TcxVerticalGridCustomEditorRowPlace; end; procedure TcxVerticalGridReportLinkCustomEditorRowProducer.CreateRow; begin inherited; if HasHeader then CreateHeader(Row); CreateValues(Row); end; procedure TcxVerticalGridReportLinkCustomEditorRowProducer.CreateHeader(AParent: TdxReportCell); var Header: TdxReportCellImage; begin Header := CreateHeaderItem(AParent, 0); Header.BoundsRect := HeaderBounds; DoInitializeHeader(Header, 0); end; procedure TcxVerticalGridReportLinkCustomEditorRowProducer.CreateValues(AParent: TdxReportCell); var I: Integer; Value: TAbstractdxReportCellData; begin for I := StartRecordIndex to StopRecordIndex do begin Value := CreateValueItem(AParent, 0, I); Value.BoundsRect := ValueBounds[I]; DoInitializeValue(Value, 0, I); end; end; function TcxVerticalGridReportLinkCustomEditorRowProducer.GetHasHeader: Boolean; begin Result := Formatter.ShowHeaders; end; function TcxVerticalGridReportLinkCustomEditorRowProducer.GetHeader: TdxReportCellImage; begin Result := Headers[0]; end; function TcxVerticalGridReportLinkCustomEditorRowProducer.GetHeaderBounds: TRect; begin with GridRowPlace.HeaderPlace do Result := MakeBounds(Offset, 0, Width, RowHeight); end; function TcxVerticalGridReportLinkCustomEditorRowProducer.GetValueBounds(Index: Integer): TRect; begin with GridRowPlace do Result := MakeBounds(ValuePlaces[Index].Offset, 0, ValuePlaces[Index].Width, RowHeight); end; { TcxVerticalGridReportLinkCustomMultiEditorRowProducer } constructor TcxVerticalGridReportLinkCustomMultiEditorRowProducer.Create(ABuilder: TcxCustomVerticalGridReportLinkBuilder); begin inherited; FHeaderSeparators := TList.Create; FValueSeparators := TList.Create; end; destructor TcxVerticalGridReportLinkCustomMultiEditorRowProducer.Destroy; begin FreeAndNil(FValueSeparators); FreeAndNil(FHeaderSeparators); inherited; end; function TcxVerticalGridReportLinkCustomMultiEditorRowProducer.GridRow: TcxCustomMultiEditorRow; begin Result := inherited GridRow as TcxCustomMultiEditorRow; end; function TcxVerticalGridReportLinkCustomMultiEditorRowProducer.GridRowHelper: TcxVerticalGridCustomMultiEditorRowHelper; begin Result := inherited GridRowHelper as TcxVerticalGridCustomMultiEditorRowHelper; end; function TcxVerticalGridReportLinkCustomMultiEditorRowProducer.GridRowPlace: TcxVerticalGridCustomMultiEditorRowPlace; begin Result := inherited GridRowPlace as TcxVerticalGridCustomMultiEditorRowPlace; end; procedure TcxVerticalGridReportLinkCustomMultiEditorRowProducer.ClearItems; begin inherited; FHeaderSeparators.Clear; FValueSeparators.Clear; end; procedure TcxVerticalGridReportLinkCustomMultiEditorRowProducer.CreateRow; begin inherited; CreateHeaders(Row); CreateValues(Row); if HasHeaderSeparators then CreateHeaderSeparators(Row); if HasValueSeparators then CreateValueSeparators(Row); end; procedure TcxVerticalGridReportLinkCustomMultiEditorRowProducer.CreateHeaders(AParent: TdxReportCell); var I: Integer; Header: TdxReportCellImage; begin for I := 0 to GridRowHelper.ItemCount - 1 do begin Header := CreateHeaderItem(AParent, I); Header.BoundsRect := HeaderBounds[I]; DoInitializeHeader(Header, I); end; end; function TcxVerticalGridReportLinkCustomMultiEditorRowProducer.CreateHeaderSeparator(AParent: TdxReportCell): TdxReportCellString; begin Result := Formatter.GetRowHeaderSeparatorClass(GridRow).Create(AParent); FValueSeparators.Add(Result); end; procedure TcxVerticalGridReportLinkCustomMultiEditorRowProducer.CreateHeaderSeparators(AParent: TdxReportCell); var I: Integer; Separator: TdxReportCellString; begin for I := 0 to HeaderSeparatorCount - 1 do begin Separator := CreateHeaderSeparator(AParent); Separator.BoundsRect := HeaderSeparatorBounds[I]; Separator.Text := HeaderSeparatorTexts[I]; DoInitializeHeaderSeparator(Separator, I); end; end; procedure TcxVerticalGridReportLinkCustomMultiEditorRowProducer.CreateValues(AParent: TdxReportCell); var I, J: Integer; Item: TAbstractdxReportCellData; begin for I := StartRecordIndex to StopRecordIndex do for J := 0 to ItemCount - 1 do begin Item := CreateValueItem(AParent, J, I); Item.BoundsRect := ValueBounds[J, I]; DoInitializeValue(Item, J, I); end; end; function TcxVerticalGridReportLinkCustomMultiEditorRowProducer.CreateValueSeparator(AParent: TdxReportCell): TdxReportCellString; begin Result := Formatter.GetRowValueSeparatorClass(GridRow).Create(AParent); FValueSeparators.Add(Result); end; procedure TcxVerticalGridReportLinkCustomMultiEditorRowProducer.CreateValueSeparators(AParent: TdxReportCell); var I, J: Integer; Separator: TdxReportCellString; begin for I := StartRecordIndex to StopRecordIndex do for J := 0 to ValueSeparatorCount - 1 do begin Separator := CreateValueSeparator(AParent); Separator.BoundsRect := ValueSeparatorBounds[J, I]; Separator.Text := ValueSeparatorTexts[J]; DoInitializeValueSeparator(Separator, J, I); end; end; procedure TcxVerticalGridReportLinkCustomMultiEditorRowProducer.DoInitializeHeaderSeparator(AnItem: TdxReportCellString; AnIndex: Integer); begin Formatter.DoInitializeRowHeaderSeparator(GridRow, AnItem, AnIndex); Formatter.DoReportLinkInitializeRowHeaderSeparator(GridRow, AnItem, AnIndex); end; procedure TcxVerticalGridReportLinkCustomMultiEditorRowProducer.DoInitializeValueSeparator(AnItem: TdxReportCellString; AnIndex, ARecordIndex: Integer); begin Formatter.DoInitializeRowValueSeparator(GridRow, AnItem, AnIndex, ARecordIndex); Formatter.DoReportLinkInitializeRowValueSeparator(GridRow, AnItem, AnIndex, ARecordIndex); end; function TcxVerticalGridReportLinkCustomMultiEditorRowProducer.GetHasHeaderSeparators: Boolean; begin Result := GridRowHelper.HasHeaderSeparators; end; function TcxVerticalGridReportLinkCustomMultiEditorRowProducer.GetHasValueSeparators: Boolean; begin Result := GridRowHelper.HasValueSeparators; end; function TcxVerticalGridReportLinkCustomMultiEditorRowProducer.GetHeaderBounds(Index: Integer): TRect; begin with GridRowPlace.HeaderPlaces[Index] do Result := MakeBounds(Offset, 0, Width, RowHeight); end; function TcxVerticalGridReportLinkCustomMultiEditorRowProducer.GetHeaderSeparator(Index: Integer): TdxReportCellString; begin Result := TdxReportCellString(FHeaderSeparators[Index]); end; function TcxVerticalGridReportLinkCustomMultiEditorRowProducer.GetHeaderSeparatorBounds(Index: Integer): TRect; begin with GridRowPlace do Result := MakeBounds(HeaderSeparatorPlaces[Index].Offset, 0, HeaderSeparatorPlaces[Index].Width, RowHeight); end; function TcxVerticalGridReportLinkCustomMultiEditorRowProducer.GetHeaderSeparatorCount: Integer; begin Result := GridRowHelper.HeaderSeparatorCount; end; function TcxVerticalGridReportLinkCustomMultiEditorRowProducer.GetHeaderSeparatorText(Index: Integer): string; begin Result := GridRowHelper.HeaderSeparatorTexts[Index]; end; function TcxVerticalGridReportLinkCustomMultiEditorRowProducer.GetValue(CellIndex, RecordIndex: Integer): TAbstractdxReportCellData; begin Result := FValues[RecordIndex * GridRowHelper.ItemCount + CellIndex]; end; function TcxVerticalGridReportLinkCustomMultiEditorRowProducer.GetValueBounds(CellIndex, RecordIndex: Integer): TRect; begin with GridRowPlace do Result := MakeBounds(ValuePlaces[CellIndex, RecordIndex].Offset, 0, ValuePlaces[CellIndex, RecordIndex].Width, RowHeight); end; function TcxVerticalGridReportLinkCustomMultiEditorRowProducer.GetValueSeparator(Index: Integer): TdxReportCellString; begin Result := TdxReportCellString(FValueSeparators[Index]); end; function TcxVerticalGridReportLinkCustomMultiEditorRowProducer.GetValueSeparatorBounds(Index, RecordIndex: Integer): TRect; begin with GridRowPlace do Result := MakeBounds(ValueSeparatorPlaces[Index, RecordIndex].Offset, 0, ValueSeparatorPlaces[Index, RecordIndex].Width, RowHeight); end; function TcxVerticalGridReportLinkCustomMultiEditorRowProducer.GetValueSeparatorCount: Integer; begin Result := GridRowHelper.ValueSeparatorCount; end; function TcxVerticalGridReportLinkCustomMultiEditorRowProducer.GetValueSeparatorText(Index: Integer): string; begin Result := GridRowHelper.ValueSeparatorTexts[Index]; end; { TcxVerticalGridCustomRowHelper } constructor TcxVerticalGridCustomRowHelper.Create(AnAdapter: TcxCustomVerticalGridAdapter); begin inherited Create; FAdapter := AnAdapter; end; procedure TcxVerticalGridCustomRowHelper.Initialize(ARow: TcxCustomRow); begin FRow := ARow; end; class function TcxVerticalGridCustomRowHelper.PairClass: TClass; begin Result := RowClass; end; class function TcxVerticalGridCustomRowHelper.ProducerClass: TcxVerticalGridReportLinkCustomRowProducerClass; begin Result := TcxVerticalGridReportLinkCustomRowProducer; end; class procedure TcxVerticalGridCustomRowHelper.Register; begin dxVerticalGridRowHelperFactory.Register(Self); end; class procedure TcxVerticalGridCustomRowHelper.Unregister; begin dxVerticalGridRowHelperFactory.Unregister(Self); end; function TcxVerticalGridCustomRowHelper.Properties(Index: Integer): TcxCustomRowProperties; begin Result := GetRowProperties(Index); end; function TcxVerticalGridCustomRowHelper.Row: TcxCustomRow; begin Result := FRow; end; class function TcxVerticalGridCustomRowHelper.RowClass: TcxCustomRowClass; begin Result := TcxCustomRow; end; class function TcxVerticalGridCustomRowHelper.RowPlaceClass: TcxVerticalGridCustomRowPlaceClass; begin Result := TcxVerticalGridCustomRowPlace; end; function TcxVerticalGridCustomRowHelper.Adapter: TcxCustomVerticalGridAdapter; begin Result := FAdapter; end; function TcxVerticalGridCustomRowHelper.GetEditProperties(Index, RecordIndex: Integer): TcxCustomEditProperties; begin Result := nil; end; function TcxVerticalGridCustomRowHelper.GetHasHeaderImage(Index: Integer): Boolean; begin Result := (Adapter.Images <> nil) and (ImageIndexes[Index] > -1) and (ImageIndexes[Index] < Adapter.Images.Count); end; function TcxVerticalGridCustomRowHelper.GetHasHeaderSeparators: Boolean; begin Result := False; end; function TcxVerticalGridCustomRowHelper.GetHasValueSeparators: Boolean; begin Result := False; end; function TcxVerticalGridCustomRowHelper.GetHeaderAlignmentHorz(Index: Integer): TcxTextAlignX; begin Result := taLeft; end; function TcxVerticalGridCustomRowHelper.GetHeaderAlignmentVert(Index: Integer): TcxTextAlignY; begin Result := taCenterY; end; function TcxVerticalGridCustomRowHelper.GetHeaderCaption(Index: Integer): string; begin Result := ''; end; function TcxVerticalGridCustomRowHelper.GetImageIndex(Index: Integer): Integer; begin Result := -1; end; function TcxVerticalGridCustomRowHelper.GetIndentCount: Integer; begin Result := Row.Level + 1; end; function TcxVerticalGridCustomRowHelper.GetItemCount: Integer; begin Result := 1; end; function TcxVerticalGridCustomRowHelper.GetRecordMinWidth: Integer; begin Result := DefaultIndentWidth; end; function TcxVerticalGridCustomRowHelper.GetRowProperties(Index: Integer): TcxCustomRowProperties; begin Result := CustomRow_GetProperties(Row); end; function TcxVerticalGridCustomRowHelper.GetDisplayText(Index, RecordIndex: Integer): string; begin Result := ''; end; function TcxVerticalGridCustomRowHelper.GetSeparatorsAlignmentVert: TcxAlignmentVert; begin Result := vaCenter; end; function TcxVerticalGridCustomRowHelper.GetValue(Index, RecordIndex: Integer): TcxEditValue; begin Result := ''; end; { TcxVerticalGridCategoryRowHelper } class function TcxVerticalGridCategoryRowHelper.ProducerClass: TcxVerticalGridReportLinkCustomRowProducerClass; begin Result := TcxVerticalGridReportLinkCategoryRowProducer; end; function TcxVerticalGridCategoryRowHelper.Properties(Index: Integer): TcxCaptionRowProperties; begin Result := Row.Properties; end; function TcxVerticalGridCategoryRowHelper.Row: TcxCategoryRow; begin Result := inherited Row as TcxCategoryRow; end; class function TcxVerticalGridCategoryRowHelper.RowClass: TcxCustomRowClass; begin Result := TcxCategoryRow; end; class function TcxVerticalGridCategoryRowHelper.RowPlaceClass: TcxVerticalGridCustomRowPlaceClass; begin Result := TcxVerticalGridCategoryRowPlace; end; function TcxVerticalGridCategoryRowHelper.GetCaption: string; begin Result := HeaderCaptions[0]; end; function TcxVerticalGridCategoryRowHelper.GetHeaderAlignmentHorz(Index: Integer): TcxTextAlignX; begin Result := TextAlignXMap[Properties(Index).HeaderAlignmentHorz]; end; function TcxVerticalGridCategoryRowHelper.GetHeaderAlignmentVert(Index: Integer): TcxTextAlignY; begin Result := TextAlignYMap[Properties(Index).HeaderAlignmentVert]; end; function TcxVerticalGridCategoryRowHelper.GetHeaderCaption(Index: Integer): string; begin Result := Properties(Index).Caption; end; function TcxVerticalGridCategoryRowHelper.GetImageIndex(Index: Integer): Integer; begin Result := Properties(Index).ImageIndex; end; { TcxVerticalGridCustomEditorRowHelper } class function TcxVerticalGridCustomEditorRowHelper.ProducerClass: TcxVerticalGridReportLinkCustomRowProducerClass; begin Result := TcxVerticalGridReportLinkCustomEditorRowProducer; end; function TcxVerticalGridCustomEditorRowHelper.Properties(Index: Integer): TcxCustomEditorRowProperties; begin Result := TcxCustomEditorRowProperties(inherited Properties(Index)); end; function TcxVerticalGridCustomEditorRowHelper.Row: TcxCustomEditorRow; begin Result := inherited Row as TcxCustomEditorRow; end; class function TcxVerticalGridCustomEditorRowHelper.RowClass: TcxCustomRowClass; begin Result := TcxCustomEditorRow; end; class function TcxVerticalGridCustomEditorRowHelper.RowPlaceClass: TcxVerticalGridCustomRowPlaceClass; begin Result := TcxVerticalGridCustomEditorRowPlace; end; function TcxVerticalGridCustomEditorRowHelper.GetEditProperties(Index, RecordIndex: Integer): TcxCustomEditProperties; begin Result := TcxCustomEditorRowProperties(Properties(Index)).DisplayEditProperties[RecordIndex]; end; function TcxVerticalGridCustomEditorRowHelper.GetHeaderAlignmentHorz(Index: Integer): TcxTextAlignX; begin Result := TextAlignXMap[Properties(Index).HeaderAlignmentHorz]; end; function TcxVerticalGridCustomEditorRowHelper.GetHeaderAlignmentVert(Index: Integer): TcxTextAlignY; begin Result := TextAlignYMap[Properties(Index).HeaderAlignmentVert]; end; function TcxVerticalGridCustomEditorRowHelper.GetHeaderCaption(Index: Integer): string; begin Result := Properties(Index).Caption; end; function TcxVerticalGridCustomEditorRowHelper.GetImageIndex(Index: Integer): Integer; begin Result := Properties(Index).ImageIndex; end; function TcxVerticalGridCustomEditorRowHelper.GetDisplayText(Index, RecordIndex: Integer): string; begin Result := Properties(Index).DisplayTexts[RecordIndex]; end; function TcxVerticalGridCustomEditorRowHelper.GetRecordMinWidth: Integer; begin Result := Adapter.ValueMinWidth; end; function TcxVerticalGridCustomEditorRowHelper.GetValue(Index, RecordIndex: Integer): TcxEditValue; begin Result := Properties(Index).Values[RecordIndex]; end; { TcxVerticalGridEditorRowHelper } function TcxVerticalGridEditorRowHelper.Properties(Index: Integer): TcxEditorRowProperties; begin Result := Row.Properties; end; function TcxVerticalGridEditorRowHelper.Row: TcxEditorRow; begin Result := inherited Row as TcxEditorRow; end; class function TcxVerticalGridEditorRowHelper.RowClass: TcxCustomRowClass; begin Result := TcxEditorRow; end; { TcxVerticalGridDBEditorRowHelper } function TcxVerticalGridDBEditorRowHelper.Properties(Index: Integer): TcxDBEditorRowProperties; begin Result := Row.Properties; end; function TcxVerticalGridDBEditorRowHelper.Row: TcxDBEditorRow; begin Result := inherited Row as TcxDBEditorRow; end; class function TcxVerticalGridDBEditorRowHelper.RowClass: TcxCustomRowClass; begin Result := TcxDBEditorRow; end; { TcxVerticalGridCustomMultiEditorRowHelper } class function TcxVerticalGridCustomMultiEditorRowHelper.ProducerClass: TcxVerticalGridReportLinkCustomRowProducerClass; begin Result := TcxVerticalGridReportLinkCustomMultiEditorRowProducer; end; function TcxVerticalGridCustomMultiEditorRowHelper.Properties(Index: Integer): TcxEditorRowItemProperties; begin Result := TcxEditorRowItemProperties(GetRowProperties(Index)); end; function TcxVerticalGridCustomMultiEditorRowHelper.RootProperties: TcxMultiEditorRowProperties; begin Result := CustomMultiEditorRow_GetProperties(Row); end; function TcxVerticalGridCustomMultiEditorRowHelper.Row: TcxCustomMultiEditorRow; begin Result := inherited Row as TcxCustomMultiEditorRow; end; class function TcxVerticalGridCustomMultiEditorRowHelper.RowClass: TcxCustomRowClass; begin Result := TcxCustomMultiEditorRow; end; class function TcxVerticalGridCustomMultiEditorRowHelper.RowPlaceClass: TcxVerticalGridCustomRowPlaceClass; begin Result := TcxVerticalGridCustomMultiEditorRowPlace; end; function TcxVerticalGridCustomMultiEditorRowHelper.GetEditProperties(Index, RecordIndex: Integer): TcxCustomEditProperties; begin Result := TcxCustomEditorRowProperties(Properties(Index)).DisplayEditProperties[RecordIndex]; end; function TcxVerticalGridCustomMultiEditorRowHelper.GetHasHeaderSeparators: Boolean; begin Result := RootProperties.SeparatorKind = skString; end; function TcxVerticalGridCustomMultiEditorRowHelper.GetHasValueSeparators: Boolean; begin Result := RootProperties.SeparatorKind = skString; end; function TcxVerticalGridCustomMultiEditorRowHelper.GetHeaderAlignmentHorz(Index: Integer): TcxTextAlignX; begin Result := TextAlignXMap[Properties(Index).HeaderAlignmentHorz]; end; function TcxVerticalGridCustomMultiEditorRowHelper.GetHeaderAlignmentVert(Index: Integer): TcxTextAlignY; begin Result := TextAlignYMap[Properties(Index).HeaderAlignmentVert]; end; function TcxVerticalGridCustomMultiEditorRowHelper.GetHeaderCaption(Index: Integer): string; begin Result := Properties(Index).Caption; end; function TcxVerticalGridCustomMultiEditorRowHelper.GetImageIndex(Index: Integer): Integer; begin Result := Properties(Index).ImageIndex; end; function TcxVerticalGridCustomMultiEditorRowHelper.GetItemCount: Integer; begin Result := RootProperties.Editors.Count; end; function TcxVerticalGridCustomMultiEditorRowHelper.GetRecordMinWidth: Integer; begin Result := Adapter.ValueMinWidth * ItemCount; end; function TcxVerticalGridCustomMultiEditorRowHelper.GetRowProperties(Index: Integer): TcxCustomRowProperties; begin Result := RootProperties.Editors[Index]; end; function TcxVerticalGridCustomMultiEditorRowHelper.GetDisplayText(Index, RecordIndex: Integer): string; begin Result := Properties(Index).DisplayTexts[RecordIndex]; end; function TcxVerticalGridCustomMultiEditorRowHelper.GetHeaderSeparatorCount: Integer; begin if HasValueSeparators then Result := ItemCount - 1 else Result := 0; end; function TcxVerticalGridCustomMultiEditorRowHelper.GetHeaderSeparatorText(Index: Integer): string; begin Result := RootProperties.SeparatorString; end; function TcxVerticalGridCustomMultiEditorRowHelper.GetSeparatorsAlignmentVert: TcxAlignmentVert; begin Result := RootProperties.SeparatorAlignmentVert; end; function TcxVerticalGridCustomMultiEditorRowHelper.GetValue(Index, RecordIndex: Integer): TcxEditValue; begin Result := Properties(Index).Values[RecordIndex]; end; function TcxVerticalGridCustomMultiEditorRowHelper.GetValueSeparatorCount: Integer; begin if HasValueSeparators then Result := ItemCount - 1 else Result := 0; end; function TcxVerticalGridCustomMultiEditorRowHelper.GetValueSeparatorText(Index: Integer): string; begin Result := RootProperties.SeparatorString; end; { TcxVerticalGridRowHelperCache } constructor TcxVerticalGridRowHelperCache.Create(AnAdapter: TcxCustomVerticalGridAdapter); begin inherited Create; FAdapter := AnAdapter; end; function TcxVerticalGridRowHelperCache.IndexOf(Row: TcxCustomRow): Integer; begin for Result := 0 to Count - 1 do if Items[Result].RowClass = Row.ClassType then Exit; Result := Add(dxVerticalGridRowHelperFactory.HelperClasses[Row].Create(Adapter)); end; function TcxVerticalGridRowHelperCache.GetHelper(Row: TcxCustomRow): TcxVerticalGridCustomRowHelper; begin Result := Items[IndexOf(Row)]; Result.Initialize(Row); end; function TcxVerticalGridRowHelperCache.GetItem(Index: Integer): TcxVerticalGridCustomRowHelper; begin Result := TcxVerticalGridCustomRowHelper(inherited Items[Index]); end; { TcxVerticalGridReportLinkProducerCache } constructor TcxVerticalGridReportLinkProducerCache.Create(ABuilder: TcxCustomVerticalGridReportLinkBuilder); begin inherited Create; FBuilder := ABuilder; end; function TcxVerticalGridReportLinkProducerCache.IndexOf(AProducerClass: TcxVerticalGridReportLinkCustomRowProducerClass): Integer; begin for Result := 0 to Count - 1 do if Items[Result].ClassType = AProducerClass then Exit; Result := Add(AProducerClass.Create(Builder)); end; function TcxVerticalGridReportLinkProducerCache.GetProducer(ProducerClass: TcxVerticalGridReportLinkCustomRowProducerClass): TcxVerticalGridReportLinkCustomRowProducer; begin Result := Items[IndexOf(ProducerClass)]; end; function TcxVerticalGridReportLinkProducerCache.GetItem(Index: Integer): TcxVerticalGridReportLinkCustomRowProducer; begin Result := TcxVerticalGridReportLinkCustomRowProducer(inherited Items[Index]); end; { TcxCustomVerticalGridReportLinkBuilder } constructor TcxCustomVerticalGridReportLinkBuilder.Create(AReportLink: TcxCustomVerticalGridReportLink); begin inherited Create; FReportLink := AReportLink; FAdapter := AdapterClass.Create(Self); FFormatter := FormatterClass.Create(Self); FProducerCache := TcxVerticalGridReportLinkProducerCache.Create(Self); FReportRows := TList.Create; end; destructor TcxCustomVerticalGridReportLinkBuilder.Destroy; begin FreeAndNil(FWrapSeparatorProducer); FreeAndNil(FReportRows); FreeAndNil(FProducerCache); FreeAndNil(FFormatter); FreeAndNil(FAdapter); inherited; end; procedure TcxCustomVerticalGridReportLinkBuilder.Build; begin BeforeBuilding; try DoBuild; finally AfterBuilding; end; end; procedure TcxCustomVerticalGridReportLinkBuilder.Progress(const APercentDone: Double); begin ReportLink.DoProgress(APercentDone); end; function TcxCustomVerticalGridReportLinkBuilder.Adapter: TcxCustomVerticalGridAdapter; begin Result := FAdapter; end; class function TcxCustomVerticalGridReportLinkBuilder.AdapterClass: TcxCustomVerticalGridAdapterClass; begin Result := TcxCustomVerticalGridAdapter; end; function TcxCustomVerticalGridReportLinkBuilder.Formatter: TcxCustomVerticalGridReportLinkFormatter; begin Result := FFormatter; end; class function TcxCustomVerticalGridReportLinkBuilder.FormatterClass: TcxCustomVerticalGridReportLinkFormatterClass; begin Result := TcxCustomVerticalGridReportLinkFormatter; end; procedure TcxCustomVerticalGridReportLinkBuilder.AddReportRow(ARow: TdxReportCell); begin if ARow.Parent = ReportLink.ReportCells.Cells then FReportRows.Add(ARow); end; procedure TcxCustomVerticalGridReportLinkBuilder.AfterBuilding; begin Formatter.AfterBuilding; Adapter.AfterBuilding; end; procedure TcxCustomVerticalGridReportLinkBuilder.BeforeBuilding; begin Adapter.BeforeBuilding; Formatter.BeforeBuilding; end; procedure TcxCustomVerticalGridReportLinkBuilder.CreateRow(ARow: TcxCustomRow; AWrapIndex: Integer); var ReportRow: TdxReportCell; begin ReportRow := GetRowProducer(ARow).Produce(ReportLink.HostInfo, ARow, AWrapIndex); AddReportRow(ReportRow); end; procedure TcxCustomVerticalGridReportLinkBuilder.CreateRows; var I, J: Integer; Row: TcxCustomRow; begin for I := 0 to Formatter.WrapCount - 1 do begin for J := 0 to Formatter.RowCount - 1 do begin Row := Formatter.Rows[J]; CreateRow(Row, I); Progress(100 * (I * Formatter.RowCount + J) / (Formatter.WrapCount * Formatter.RowCount)); if IsAborted then Break; end; if IsAborted then Break; if AreWrapSeparatorsNeeded and (I < Formatter.WrapCount - 1) then CreateWrapSeparator(I); end; end; procedure TcxCustomVerticalGridReportLinkBuilder.CreateWrapSeparator(AWrapIndex: Integer); var ReportRow: TdxReportCell; begin ReportRow := GetWrapSeparatorProducer(AWrapIndex).Produce(ReportLink.HostInfo, AWrapIndex); AddReportRow(ReportRow); end; function TcxCustomVerticalGridReportLinkBuilder.GetRowProducer(ARow: TcxCustomRow): TcxVerticalGridReportLinkCustomRowProducer; begin Result := ProducerCache[GetRowProducerClass(ARow)] as TcxVerticalGridReportLinkCustomRowProducer; end; function TcxCustomVerticalGridReportLinkBuilder.GetRowProducerClass(ARow: TcxCustomRow): TcxVerticalGridReportLinkCustomRowProducerClass; begin Result := Formatter.RowHelpers[ARow].ProducerClass; end; function TcxCustomVerticalGridReportLinkBuilder.GetWrapSeparatorProducer(AWrapIndex: Integer): TcxVerticalGridReportLinkWrapSeparatorProducer; begin if FWrapSeparatorProducer = nil then FWrapSeparatorProducer := GetWrapSeparatorProducerClass.Create(Self); Result := FWrapSeparatorProducer; end; function TcxCustomVerticalGridReportLinkBuilder.GetWrapSeparatorProducerClass: TcxVerticalGridReportLinkWrapSeparatorProducerClass; begin Result := TcxVerticalGridReportLinkWrapSeparatorProducer; end; function TcxCustomVerticalGridReportLinkBuilder.AreWrapSeparatorsNeeded: Boolean; begin with ReportLink.OptionsPagination do Result := ByRows or (ByWrapping and not OneWrappingPerPage); end; procedure TcxCustomVerticalGridReportLinkBuilder.DoBuild; begin CreateRows; end; function TcxCustomVerticalGridReportLinkBuilder.IsAborted: Boolean; begin Result := ReportLink.AbortBuilding; end; function TcxCustomVerticalGridReportLinkBuilder.GetAvailableSiteWidth: Integer; var ControllerIntf: IdxReportLinkController; begin if ReportLink.IsAggregated and Supports(TObject(ReportLink.Controller), IdxReportLinkController, ControllerIntf) then with ControllerIntf.GetControlSiteBounds(ReportLink.VerticalGrid) do Result := Bottom - Top - 1 else with ReportLink.RealPrinterPage.PaintRectPixels do Result := Right - Left - 1; Result := MulDiv(Result, 100, ReportLink.GetRealScaleFactor); end; function TcxCustomVerticalGridReportLinkBuilder.GetAvailableWidth: Integer; begin if Formatter.AutoWidth then Result := GetAvailableSiteWidth else with VerticalGrid.ClientBounds do Result := Right - Left; end; function TcxCustomVerticalGridReportLinkBuilder.GetHost: TdxReportCell; begin Result := ReportLink.ReportCells.Cells; end; function TcxCustomVerticalGridReportLinkBuilder.GetReportCells: TdxReportCells; begin Result := ReportLink.ReportCells; end; function TcxCustomVerticalGridReportLinkBuilder.GetReportRow(Index: Integer): TdxReportCell; begin Result := TdxReportCell(FReportRows[Index]); end; function TcxCustomVerticalGridReportLinkBuilder.GetReportRowCount: Integer; begin Result := FReportRows.Count; end; function TcxCustomVerticalGridReportLinkBuilder.GetVerticalGrid: TcxCustomVerticalGrid; begin Result := ReportLink.VerticalGrid; end; { TcxVerticalGridReportLinkBuilderHandler } constructor TcxVerticalGridReportLinkBuilderHandler.Create(ABuilder: TcxCustomVerticalGridReportLinkBuilder); begin inherited Create; FBuilder := ABuilder; end; function TcxVerticalGridReportLinkBuilderHandler.Builder: TcxCustomVerticalGridReportLinkBuilder; begin Result := FBuilder; end; function TcxVerticalGridReportLinkBuilderHandler.GetReportLink: TcxCustomVerticalGridReportLink; begin Result := Builder.ReportLink; end; { TcxCustomVerticalGridAdapter } constructor TcxCustomVerticalGridAdapter.Create(ABuilder: TcxCustomVerticalGridReportLinkBuilder); begin inherited; FHelperCache := TcxVerticalGridRowHelperCache.Create(Self); end; destructor TcxCustomVerticalGridAdapter.Destroy; begin FreeAndNil(FHelperCache); inherited; end; procedure TcxCustomVerticalGridAdapter.AfterBuilding; begin end; procedure TcxCustomVerticalGridAdapter.BeforeBuilding; begin end; function TcxCustomVerticalGridAdapter.GetInterRecordsSpace: Integer; begin Result := 0; end; function TcxCustomVerticalGridAdapter.GetProperties(ARow: TcxCustomRow; AnIndex, ARecordIndex: Integer): TcxCustomEditProperties; begin Result := Helpers[ARow].GetEditProperties(AnIndex, ARecordIndex); end; function TcxCustomVerticalGridAdapter.GetPropertiesClass(ARow: TcxCustomRow; AnIndex, ARecordIndex: Integer): TcxCustomEditPropertiesClass; begin Result := TcxCustomEditPropertiesClass(GetProperties(ARow, AnIndex, ARecordIndex).ClassType); end; function TcxCustomVerticalGridAdapter.GetCategoryViewParams(ARow: TcxCustomRow): TcxViewParams; begin Result := Styles.GetCategoryParams(ARow); // v3.2 if Result.Color = clWindow then Result.Color := dxPSCore.dxDefaultContentColor; end; function TcxCustomVerticalGridAdapter.GetContentViewParams(ARow: TcxCustomRow; AnIndex, ARecordIndex: Integer): TcxViewParams; var Properties: TcxCustomEditorRowProperties; begin Properties := TcxCustomEditorRowProperties(Helpers[ARow].GetRowProperties(AnIndex)); Result := Styles.GetContentParams(Properties, False, ARecordIndex); // v3.2 if Result.Color = clWindow then Result.Color := dxPSCore.dxDefaultContentColor; end; function TcxCustomVerticalGridAdapter.GetHeaderViewParams(ARow: TcxCustomRow): TcxViewParams; begin Result := Styles.GetHeaderParams(ARow); // v3.2 if Result.Color = clWindow then Result.Color := dxPSCore.dxDefaultContentColor; end; function TcxCustomVerticalGridAdapter.GetImageViewParams(ARow: TcxCustomRow): TcxViewParams; begin Result := GetHeaderViewParams(ARow); end; function TcxCustomVerticalGridAdapter.GetIndentViewParams(ARow: TcxCustomRow): TcxViewParams; begin if ARow is TcxCategoryRow then Result := GetCategoryViewParams(ARow) else Result := GetHeaderViewParams(ARow); end; function TcxCustomVerticalGridAdapter.GetBackgroundBitmap(Index: Integer): TBitmap; begin Result := Styles.GetBitmap(Index); end; function TcxCustomVerticalGridAdapter.GetRowIndentBackgroundBitmapIndex(ARow: TcxCustomRow; ALevel: Integer): Integer; const BackgroundBitmapIndexes: array[Boolean] of Integer = (vgs_Header, vgs_Category); begin Result := BackgroundBitmapIndexes[GetRowParentAtLevel(ARow, ALevel) is TcxCategoryRow]; end; function TcxCustomVerticalGridAdapter.HasBackgroundBitmap(Index: Integer): Boolean; begin Result := GetBackgroundBitmap(Index) <> nil; end; procedure TcxCustomVerticalGridAdapter.FullExpand; begin VerticalGrid.FullExpand; end; function TcxCustomVerticalGridAdapter.GetImageHeight(ARow: TcxCustomRow; AnIndex: Integer): Integer; begin if HasRowImage(ARow, AnIndex) then Result := 1 + Images.Height + 1 else Result := 0; end; function TcxCustomVerticalGridAdapter.GetImageWidth(ARow: TcxCustomRow; AnIndex: Integer): Integer; begin if HasRowImage(ARow, AnIndex) then Result := 1 + Images.Width + 1 else Result := 0; end; function TcxCustomVerticalGridAdapter.GetRowParentAtLevel(ARow: TcxCustomRow; ALevel: Integer): TcxCustomRow; begin Result := ARow; while ALevel > 0 do begin Result := Result.Parent; Dec(ALevel); end; end; function TcxCustomVerticalGridAdapter.HasCategoryRowAsParentAtLevel(ARow: TcxCustomRow; ALevel: Integer; ACheckFollow: Boolean): Boolean; begin while ALevel > 0 do begin ARow := ARow.Parent; if ACheckFollow and (ARow is TcxCategoryRow) then Break; Dec(ALevel); end; Result := ARow is TcxCategoryRow; end; function TcxCustomVerticalGridAdapter.HasRowImage(ARow: TcxCustomRow; AnIndex: Integer): Boolean; var Helper: TcxVerticalGridCustomRowHelper; begin Result := Images <> nil; if Result and (ARow <> nil) and not MakeSpaceForEmptyImage then begin Helper := Helpers[ARow]; Result := (Helper.ImageIndexes[AnIndex] > -1) and (Helper.ImageIndexes[AnIndex] < Images.Count); end; end; function TcxCustomVerticalGridAdapter.IsRowLastChildAtLevel(ARow: TcxCustomRow; ALevel: Integer): Boolean; begin while (ALevel > 0) and ARow.IsLastVisible do begin ARow := ARow.Parent; Dec(ALevel); end; Result := ARow.IsLastVisible; end; function TcxCustomVerticalGridAdapter.IsRowVisible(ARow: TcxCustomRow): Boolean; begin Result := VerticalGrid.IsRowVisible(ARow); end; function TcxCustomVerticalGridAdapter.GetCellAutoHeight: Boolean; begin Result := OptionsView.CellAutoHeight; end; function TcxCustomVerticalGridAdapter.GetCellEndEllipsis: Boolean; begin Result := OptionsView.CellEndEllipsis; end; function TcxCustomVerticalGridAdapter.GetCellMultiline: Boolean; begin Result := OptionsView.CellAutoHeight; end; function TcxCustomVerticalGridAdapter.GetDataController: TcxCustomDataController; begin Result := CustomVerticalGrid_GetDataController(VerticalGrid); end; function TcxCustomVerticalGridAdapter.GetDefaultRowHeight: Integer; begin Result := OptionsView.RowHeight; end; function TcxCustomVerticalGridAdapter.GetFirstRecordIndex: Integer; begin if VerticalGrid.ViewInfo <> nil then Result := VerticalGrid.ViewInfo.FirstVisibleRecordIndex else Result := 0; end; function TcxCustomVerticalGridAdapter.GetGridLinesColor: TColor; begin Result := OptionsView.GridLineColor; end; function TcxCustomVerticalGridAdapter.GetHeaderAvailableWidth(Row: TcxCustomRow): Integer; begin Result := HeaderWidth - IndentAreas[Row]; end; function TcxCustomVerticalGridAdapter.GetHeaderMinWidth: Integer; begin Result := OptionsView.RowHeaderMinWidth; end; function TcxCustomVerticalGridAdapter.GetHeaderWidth: Integer; begin Result := OptionsView.RowHeaderWidth; end; function TcxCustomVerticalGridAdapter.GetHelper(Row: TcxCustomRow): TcxVerticalGridCustomRowHelper; begin Result := FHelperCache[Row]; end; function TcxCustomVerticalGridAdapter.GetImages: TCustomImageList; begin Result := VerticalGrid.Images; end; function TcxCustomVerticalGridAdapter.GetIndentArea(Row: TcxCustomRow): Integer; begin Result := IndentCounts[Row] * IndentWidth; end; function TcxCustomVerticalGridAdapter.GetIndentCount(Row: TcxCustomRow): Integer; begin Result := Helpers[Row].IndentCount; end; function TcxCustomVerticalGridAdapter.GetIndentWidth: Integer; begin Result := GetImageWidth(nil, 0); if Result = 0 then Result := DefaultIndentWidth; end; function TcxCustomVerticalGridAdapter.GetMakeSpaceForEmptyImage: Boolean; begin Result := OptionsView.ShowEmptyRowImage; end; function TcxCustomVerticalGridAdapter.GetOptionsView: TcxvgOptionsView; begin Result := VerticalGrid.OptionsView; end; function TcxCustomVerticalGridAdapter.GetPaintStyle: TcxvgPaintStyle; begin Result := OptionsView.PaintStyle; end; function TcxCustomVerticalGridAdapter.GetRecordCount: Integer; begin Result := CustomVerticalGrid_GetRecordCount(VerticalGrid); end; function TcxCustomVerticalGridAdapter.GetRecordMinWidth(RecordIndex: Integer): Integer; var I, V: Integer; Row: TcxCustomRow; begin Result := 0; for I := 0 to RowCount - 1 do begin Row := Rows[I]; if IsRowVisible(Row) then begin V := Helpers[Row].RecordMinWidth; if Result < V then Result := V; end; end; end; function TcxCustomVerticalGridAdapter.GetRecordWidth(RecordCount: Integer): Integer; begin // v3.1 if LayoutStyle in [lsMultiRecordView, lsBandsView] then //if RecordCount <> 1 then Result := OptionsView.ValueWidth else Result := VerticalGrid.ClientWidth - HeaderWidth; end; function TcxCustomVerticalGridAdapter.GetRow(Index: Integer): TcxCustomRow; begin Result := VerticalGrid.Rows[Index]; end; function TcxCustomVerticalGridAdapter.GetRowCount: Integer; begin Result := VerticalGrid.Rows.Count; end; function TcxCustomVerticalGridAdapter.GetRowHeight(Row: TcxCustomRow): Integer; begin Result := VerticalGrid.ViewInfo.CalcRowHeight(Row); end; function TcxCustomVerticalGridAdapter.GetShowHeaders: Boolean; begin Result := OptionsView.ShowHeaders; end; function TcxCustomVerticalGridAdapter.GetShowHorzGridLines: Boolean; begin Result := OptionsView.GridLines in [vglBoth, vglHorizontal]; end; function TcxCustomVerticalGridAdapter.GetShowVertGridLines: Boolean; begin Result := OptionsView.GridLines in [vglBoth, vglVertical]; end; function TcxCustomVerticalGridAdapter.GetStyles: TcxVerticalGridStyles; begin Result := VerticalGrid.Styles; end; function TcxCustomVerticalGridAdapter.GetValueMinWidth: Integer; begin Result := OptionsView.ValueMinWidth; end; function TcxCustomVerticalGridAdapter.GetVerticalGrid: TcxCustomVerticalGrid; begin Result := Builder.VerticalGrid; end; { TcxCustomVerticalGridReportLinkFormatter } constructor TcxCustomVerticalGridReportLinkFormatter.Create(ABuilder: TcxCustomVerticalGridReportLinkBuilder); begin inherited; FFont := TFont.Create; FHeaderWidth := -1; FInterRecordsSpace := -1; FLookAndFeelItems := TList.Create; FRecordWidths := TList.Create; FRowHeights := TList.Create; FRowPlaces := TList.Create; FRows := TList.Create; FTransparentColor := dxPSCore.dxDefaultContentColor; FViewWidths := TList.Create; FWrappedRecordStartIndexes := TList.Create; end; destructor TcxCustomVerticalGridReportLinkFormatter.Destroy; begin FreeAndNilRowPlaces; FreeAndNil(FViewWidths); FreeAndNil(FWrappedRecordStartIndexes); FreeAndNil(FRows); FreeAndNil(FRowHeights); FreeAndNil(FRecordWidths); FreeAndNil(FLookAndFeelItems); FreeAndNil(FFont); inherited; end; function TcxCustomVerticalGridReportLinkFormatter.Adapter: TcxCustomVerticalGridAdapter; begin Result := Builder.Adapter; end; procedure TcxCustomVerticalGridReportLinkFormatter.DoInitializeHost(AHost: TdxReportCell); begin AHost.CellSides := []; AHost.Transparent := True; end; procedure TcxCustomVerticalGridReportLinkFormatter.DoInitializeRowImage(ARow: TcxCustomRow; AnItem: TdxReportCellGraphic; AnIndex: Integer); begin SetViewParams(AnItem, GetRowImageViewParams(ARow, AnIndex)); if HasBackgroundBitmap(vgs_Content) then AnItem.BackgroundBitmapIndex := GetBackgroundBitmapIndex(vgs_Content); AnItem.DrawMode := gdmCenter; AnItem.ImageIndex := RowHelpers[ARow].ImageIndexes[AnIndex]; AnItem.ImageList := Adapter.Images; AnItem.ImageTransparent := True; end; function TcxCustomVerticalGridReportLinkFormatter.GetRowImageCellSides(ARow: TcxCustomRow): TdxCellSides; begin Result := csTopBottom; Result := FixupHorzCellSides(ARow, Result); end; function TcxCustomVerticalGridReportLinkFormatter.GetRowImageClass: TdxReportCellGraphicClass; begin Result := TdxReportCellGraphic; end; function TcxCustomVerticalGridReportLinkFormatter.GetRowImageViewParams(ARow: TcxCustomRow; AnIndex: Integer): TdxReportItemViewParams; begin if ReportLink.OptionsFormatting.UseNativeStyles then ReportLink.Styles.GetHeaderParams(ARow, Result.NativeParams) else Result.NativeParams := Adapter.GetImageViewParams(ARow); Result.CellSides := GetRowImageCellSides(ARow); Result.Transparent := IsColorTransparent(Result.NativeParams.Color); // ReportLink.FixedTransparent; end; procedure TcxCustomVerticalGridReportLinkFormatter.DoInitializeRowIndent(ARow: TcxCustomRow; AnItem: TdxReportCellExpandButton; AnIndex, AnIndentCount: Integer); var BackgroundBitmapIndex: Integer; begin SetViewParams(AnItem, GetRowIndentViewParams(ARow, AnIndex, AnIndentCount)); BackgroundBitmapIndex := Adapter.GetRowIndentBackgroundBitmapIndex(ARow, AnIndentCount - AnIndex - 1); if HasBackgroundBitmap(BackgroundBitmapIndex) then AnItem.BackgroundBitmapIndex := GetBackgroundBitmapIndex(BackgroundBitmapIndex); AnItem.Data := MakeCustomDrawCodeData(cxVerticalGridRowIndentID, AnIndex, 0); AnItem.ShowButton := (AnIndex = AnIndentCount - 1) and OptionsView.ExpandButtons and ARow.HasChildren; if AnItem.ShowButton then DoInitializeExpandButton(ARow, AnItem, AnIndex, AnIndentCount); end; procedure TcxCustomVerticalGridReportLinkFormatter.DoInitializeExpandButton(ARow: TcxCustomRow; AnItem: TdxReportCellExpandButton; AnIndex, AnIndentCount: Integer); begin with AnItem do begin ButtonBorder3D := ReportLink.Effects3D; ButtonBorder3DSoft := ReportLink.Soft3D; ButtonExpanded := ARow.Expanded; ButtonInteriorColor := ExpandButtonColors[ARow]; ButtonSize := ExpandButtonSize; ButtonTransparent := False;//IsColorTransparent(ButtonInteriorColor); end; end; procedure TcxCustomVerticalGridReportLinkFormatter.DoReportLinkInitializeRowIndent(ARow: TcxCustomRow; AnItem: TdxReportCellExpandButton; AnIndex: Integer); begin ReportLink.DoInitializeRowIndentCell(ARow, AnIndex, AnItem); end; function TcxCustomVerticalGridReportLinkFormatter.GetRowIndentCellSides(ARow: TcxCustomRow; AnIndex, AnIndentCount: Integer): TdxCellSides; var Level: Integer; NextRow: TcxCustomRow; begin if Adapter.PaintStyle = psdotNet then begin Result := []; Level := AnIndentCount - AnIndex - 1; if (ARow is TcxCategoryRow) and ((AnIndex = AnIndentCount - 1) or ((AnIndex = AnIndentCount - 2) and not Adapter.HasCategoryRowAsParentAtLevel(ARow, Level, False))) then Include(Result, csTop); if not (ARow is TcxCategoryRow) and not Adapter.HasCategoryRowAsParentAtLevel(ARow, Level, True) then Result := Result + csTopBottom; if not (ARow is TcxCategoryRow) and Adapter.IsRowLastChildAtLevel(ARow, Level) and Adapter.HasCategoryRowAsParentAtLevel(ARow, Level, False) then Include(Result, csBottom); if IsLastRow(ARow) then Include(Result, csBottom); if (AnIndex = 0) or ((ARow is TcxCategoryRow) and (AnIndex = AnIndentCount - 1)) then Include(Result, csLeft); if (AnIndex <> AnIndentCount - 1) and Adapter.HasCategoryRowAsParentAtLevel(ARow, Level, False) then Result := Result + csLeftRight; if AnIndex = AnIndentCount - 1 then begin if (ARow is TcxCategoryRow) and ARow.HasChildren then begin NextRow := GetNextRow(ARow); if (NextRow <> nil) and (NextRow.Level > ARow.Level) then Result := Result - [csBottom, csRight]; end; if not (ARow is TcxCategoryRow) then Include(Result, csLeft); end; end else begin Result := csTopBottom; if AnIndex = 0 then Include(Result, csLeft); end; Result := FixupHorzCellSides(ARow, Result); if not ShowVertGridLines then begin Exclude(Result, csRight); if AnIndex <> 0 then Exclude(Result, csLeft); end; if (AnIndex = 0) and not ShowBorders then Exclude(Result, csLeft); end; function TcxCustomVerticalGridReportLinkFormatter.GetRowIndentClass: TdxReportCellExpandButtonClass; begin Result := TdxReportCellExpandButton; end; function TcxCustomVerticalGridReportLinkFormatter.GetRowIndentViewParams(ARow: TcxCustomRow; AnIndex, AnIndentCount: Integer): TdxReportItemViewParams; var ParentRow: TcxCustomRow; begin ParentRow := Adapter.GetRowParentAtLevel(ARow, AnIndentCount - AnIndex - 1); if ReportLink.OptionsFormatting.UseNativeStyles then ReportLink.Styles.GetIndentParams(ParentRow, Result.NativeParams) else Result.NativeParams := Adapter.GetIndentViewParams(ParentRow); Result.CellSides := GetRowIndentCellSides(ARow, AnIndex, AnIndentCount); Result.FontStyle := []; Result.Transparent := IsColorTransparent(Result.NativeParams.Color); //ReportLink.FixedTransparent end; procedure TcxCustomVerticalGridReportLinkFormatter.DoInitializeCategoryRow(ARow: TcxCategoryRow; AnItem: TdxReportCellImage); var Helper: TcxVerticalGridCustomRowHelper; begin SetViewParams(AnItem, GetCategoryRowViewParams(ARow)); if HasBackgroundBitmap(vgs_Category) then AnItem.BackgroundBitmapIndex := GetBackgroundBitmapIndex(vgs_Category); Helper := RowHelpers[ARow]; with AnItem as TdxReportCellImage do begin Data := MakeCustomDrawCodeData(cxVerticalGridCategoryRowID, 0, 0); EndEllipsis := Adapter.CellEndEllipsis and not ReportLink.OptionsSize.BestFit; if Helper.HasHeaderImages[0] then begin ImageIndex := Helper.ImageIndexes[0]; ImageList := Adapter.Images; ImageLayout := ilImageCenterLeft; end; Multiline := False; Text := Helper.HeaderCaptions[0]; TextAlignX := Helper.HeaderAlignmentHorzs[0]; TextAlignY := Helper.HeaderAlignmentVerts[0]; end; end; procedure TcxCustomVerticalGridReportLinkFormatter.DoInitializeRowReportRow(ARow: TcxCustomRow; AReportRow: TdxReportCell); begin AReportRow.CellSides := []; AReportRow.Data := Integer(ARow); AReportRow.Transparent := True; end; procedure TcxCustomVerticalGridReportLinkFormatter.DoInitializeRowHeader(ARow: TcxCustomRow; AnItem: TdxReportCellImage; AnIndex: Integer); var Helper: TcxVerticalGridCustomRowHelper; begin SetViewParams(AnItem, GetRowHeaderViewParams(ARow, AnIndex)); if HasBackgroundBitmap(vgs_Header) then AnItem.BackgroundBitmapIndex := GetBackgroundBitmapIndex(vgs_Header); Helper := RowHelpers[ARow]; with AnItem as TdxReportCellImage do begin Data := MakeCustomDrawCodeData(cxVerticalGridRowHeaderID, AnIndex, 0); EndEllipsis := Adapter.CellEndEllipsis and not ReportLink.OptionsSize.BestFit; ImageIndex := Helper.ImageIndexes[AnIndex]; ImageList := Adapter.Images; ImageLayout := ilImageCenterLeft; MakeSpaceForEmptyImage := Adapter.MakeSpaceForEmptyImage; Multiline := False; Text := Helper.HeaderCaptions[AnIndex]; TextAlignX := Helper.HeaderAlignmentHorzs[AnIndex]; TextAlignY := Helper.HeaderAlignmentVerts[AnIndex]; end; end; procedure TcxCustomVerticalGridReportLinkFormatter.DoInitializeRowValue(ARow: TcxCustomRow; AnItem: TAbstractdxReportCellData; AnIndex, ARecordIndex: Integer); var Properties: TcxCustomEditProperties; ViewParams: TdxReportItemViewParams; CellValue: TcxEditValue; begin Properties := Adapter.GetProperties(ARow, AnIndex, ARecordIndex); ViewParams := GetRowValueViewParams(ARow, AnIndex, ARecordIndex); CellValue := GetCellValue(ARow, Properties, AnIndex, ARecordIndex); dxPScxCommon.dxPSDataMaps.InitializeItem(AnItem, Properties, CellValue, Self, ViewParams, False, ARecordIndex, TcxCustomRowAccess(ARow).GetEditContainer(AnIndex)); dxPScxCommon.dxPSDataMaps.GetImageLists(Properties, ReportLink.AppendImageList); SetViewParams(AnItem, ViewParams); if HasBackgroundBitmap(vgs_Content) then AnItem.BackgroundBitmapIndex := GetBackgroundBitmapIndex(vgs_Content); AnItem.Data := MakeCustomDrawCodeData(cxVerticalGridRowValueID, AnIndex, ARecordIndex); end; procedure TcxCustomVerticalGridReportLinkFormatter.DoReportLinkInitializeRowHeader(ARow: TcxCustomRow; AnItem: TdxReportCellImage; AnIndex: Integer); begin ReportLink.DoInitializeRowHeaderCell(ARow, AnIndex, AnItem); end; procedure TcxCustomVerticalGridReportLinkFormatter.DoReportLinkInitializeRowValue(ARow: TcxCustomRow; AnItem: TAbstractdxReportCellData; AnIndex, ARecordIndex: Integer); begin ReportLink.DoInitializeRowValueCell(ARow, AnIndex, ARecordIndex, AnItem); end; function TcxCustomVerticalGridReportLinkFormatter.GetCategoryRowCellSides(ARow: TcxCustomRow): TdxCellSides; begin Result := [csTop, csRight, csBottom]; if not ShowHeaders then Include(Result, csLeft); if not ShowBorders then Exclude(Result, csRight); Result := FixupHorzCellSides(ARow, Result); end; function TcxCustomVerticalGridReportLinkFormatter.GetCategoryRowClass(ARow: TcxCustomRow): TdxReportCellImageClass; begin Result := TdxReportCellImage; end; function TcxCustomVerticalGridReportLinkFormatter.GetCategoryRowViewParams(ARow: TcxCustomRow): TdxReportItemViewParams; begin FillChar(Result, 0, SizeOf(Result)); if ReportLink.OptionsFormatting.UseNativeStyles then ReportLink.Styles.GetCategoryParams(ARow, Result.NativeParams) else Result.NativeParams := Adapter.GetCategoryViewParams(ARow); Result.CellSides := GetCategoryRowCellSides(ARow); Result.FontStyle := []; Result.Transparent := IsColorTransparent(Result.NativeParams.Color); //ReportLink.Transparent; end; function TcxCustomVerticalGridReportLinkFormatter.GetCellValue(ARow: TcxCustomRow; AProperties: TcxCustomEditProperties; AnIndex, ARecordIndex: Integer): TcxEditValue; var Helper: TcxVerticalGridCustomRowHelper; begin Helper := RowHelpers[ARow]; if AProperties.GetEditValueSource(False) = evsValue then Result := Helper.Values[AnIndex, ARecordIndex] else Result := Helper.DisplayTexts[AnIndex, ARecordIndex]; end; function TcxCustomVerticalGridReportLinkFormatter.GetRowHeaderCellSides(ARow: TcxCustomRow; AnIndex: Integer): TdxCellSides; var Helper: TcxVerticalGridCustomRowHelper; begin Helper := RowHelpers[ARow]; Result := csAll; if Helper.HasHeaderSeparators and (Helper.ItemCount <> 1) then begin if AnIndex <> 0 then Exclude(Result, csLeft); if AnIndex <> Helper.ItemCount - 1 then Exclude(Result, csRight); end; if AnIndex = 0 then Exclude(Result, csLeft); if not ShowVertGridLines then Result := Result - csLeftRight; Result := FixupHorzCellSides(ARow, Result); end; function TcxCustomVerticalGridReportLinkFormatter.GetRowHeaderClass(ARow: TcxCustomRow): TdxReportCellImageClass; begin Result := TdxReportCellImage; end; function TcxCustomVerticalGridReportLinkFormatter.GetRowHeaderViewParams(ARow: TcxCustomRow; AnIndex: Integer): TdxReportItemViewParams; begin FillChar(Result, 0, SizeOf(Result)); if ReportLink.OptionsFormatting.UseNativeStyles then ReportLink.Styles.GetHeaderParams(ARow, Result.NativeParams) else Result.NativeParams := Adapter.GetHeaderViewParams(ARow); Result.CellSides := GetRowHeaderCellSides(ARow, AnIndex); Result.FontStyle := []; Result.Transparent := IsColorTransparent(Result.NativeParams.Color); //ReportLink.Transparent; end; function TcxCustomVerticalGridReportLinkFormatter.GetRowValueCellSides(ARow: TcxCustomRow; AnIndex, ARecordIndex: Integer): TdxCellSides; var Helper: TcxVerticalGridCustomRowHelper; begin Helper := RowHelpers[ARow]; Result := csAll; if Helper.HasValueSeparators and (Helper.ItemCount <> 1) then begin if AnIndex <> 0 then Exclude(Result, csLeft); if AnIndex <> Helper.ItemCount - 1 then Exclude(Result, csRight); end; if not ShowVertGridLines then begin Exclude(Result, csLeft); if AnIndex <> Helper.ItemCount - 1 then Exclude(Result, csRight); end; if not ShowBorders and (AnIndex = Helper.ItemCount - 1) then Exclude(Result, csRight); Result := FixupHorzCellSides(ARow, Result); end; function TcxCustomVerticalGridReportLinkFormatter.GetRowValueClass(ARow: TcxCustomRow; AnIndex, ARecordIndex: Integer): TdxReportCellDataClass; begin Result := dxPScxCommon.dxPSDataMaps.ItemClass(Adapter.GetProperties(ARow, AnIndex, ARecordIndex)); end; function TcxCustomVerticalGridReportLinkFormatter.GetRowValueViewParams(ARow: TcxCustomRow; AnIndex, ARecordIndex: Integer): TdxReportItemViewParams; begin FillChar(Result, 0, SizeOf(Result)); if ReportLink.OptionsFormatting.UseNativeStyles then ReportLink.Styles.GetContentParams(ARow, AnIndex, ARecordIndex, Result.NativeParams) else Result.NativeParams := Adapter.GetContentViewParams(ARow, AnIndex, ARecordIndex); Result.CellSides := GetRowValueCellSides(ARow, AnIndex, ARecordIndex); Result.FontStyle := []; Result.Transparent := IsColorTransparent(Result.NativeParams.Color); //ReportLink.Transparent; end; procedure TcxCustomVerticalGridReportLinkFormatter.DoInitializeRowHeaderSeparator(ARow: TcxCustomMultiEditorRow; AnItem: TdxReportCellString; AnIndex: Integer); begin SetViewParams(AnItem, GetRowHeaderSeparatorViewParams(ARow, AnIndex)); if HasBackgroundBitmap(vgs_Header) then AnItem.BackgroundBitmapIndex := GetBackgroundBitmapIndex(vgs_Header); with TdxReportCellString(AnItem) do begin Data := MakeCustomDrawCodeData(cxVerticalGridRowHeaderSeparatorID, AnIndex, 0); EndEllipsis := False; Multiline := False; TextAlignX := taLeft; TextAlignY := dxPScxCommon.TextAlignYMap[RowHelpers[ARow].SeparatorsAlignmentVert]; end; end; procedure TcxCustomVerticalGridReportLinkFormatter.DoInitializeRowValueSeparator(ARow: TcxCustomMultiEditorRow; AnItem: TdxReportCellString; AnIndex, ARecordIndex: Integer); begin SetViewParams(AnItem, GetRowValueSeparatorViewParams(ARow, AnIndex, ARecordIndex)); if HasBackgroundBitmap(vgs_Content) then AnItem.BackgroundBitmapIndex := GetBackgroundBitmapIndex(vgs_Content); with TdxReportCellString(AnItem) do begin Data := MakeCustomDrawCodeData(cxVerticalGridRowValueSeparatorID, AnIndex, ARecordIndex); EndEllipsis := False; Multiline := False; TextAlignX := taLeft; TextAlignY := dxPScxCommon.TextAlignYMap[RowHelpers[ARow].SeparatorsAlignmentVert]; end; end; procedure TcxCustomVerticalGridReportLinkFormatter.DoReportLinkInitializeRowHeaderSeparator(ARow: TcxCustomMultiEditorRow; AnItem: TdxReportCellString; AnIndex: Integer); begin ReportLink.DoInitializeRowHeaderSeparatorCell(ARow, AnIndex, AnItem); end; procedure TcxCustomVerticalGridReportLinkFormatter.DoReportLinkInitializeRowValueSeparator(ARow: TcxCustomMultiEditorRow; AnItem: TdxReportCellString; AnIndex, ARecordIndex: Integer); begin ReportLink.DoInitializeRowValueSeparatorCell(ARow, AnIndex, ARecordIndex, AnItem); end; function TcxCustomVerticalGridReportLinkFormatter.GetRowHeaderSeparatorCellSides(ARow: TcxCustomMultiEditorRow): TdxCellSides; begin Result := FixupHorzCellSides(ARow, csTopBottom); end; function TcxCustomVerticalGridReportLinkFormatter.GetRowHeaderSeparatorClass(ARow: TcxCustomMultiEditorRow): TdxReportCellStringClass; begin Result := TdxReportCellString; end; function TcxCustomVerticalGridReportLinkFormatter.GetRowHeaderSeparatorViewParams(ARow: TcxCustomMultiEditorRow; AnIndex: Integer): TdxReportItemViewParams; begin FillChar(Result, 0, SizeOf(Result)); if ReportLink.OptionsFormatting.UseNativeStyles then ReportLink.Styles.GetHeaderParams(ARow, Result.NativeParams) else Result.NativeParams := Adapter.GetHeaderViewParams(ARow); Result.CellSides := GetRowHeaderSeparatorCellSides(ARow); Result.FontStyle := []; Result.Transparent := IsColorTransparent(Result.NativeParams.Color); //ReportLink.Transparent; end; function TcxCustomVerticalGridReportLinkFormatter.GetRowValueSeparatorCellSides(ARow: TcxCustomMultiEditorRow): TdxCellSides; begin Result := FixupHorzCellSides(ARow, csTopBottom); end; function TcxCustomVerticalGridReportLinkFormatter.GetRowValueSeparatorClass(ARow: TcxCustomMultiEditorRow): TdxReportCellStringClass; begin Result := TdxReportCellString; end; function TcxCustomVerticalGridReportLinkFormatter.GetRowValueSeparatorViewParams(ARow: TcxCustomMultiEditorRow; AnIndex, ARecordIndex: Integer): TdxReportItemViewParams; begin FillChar(Result, 0, SizeOf(Result)); if ReportLink.OptionsFormatting.UseNativeStyles then ReportLink.Styles.GetContentParams(ARow, AnIndex, ARecordIndex, Result.NativeParams) else Result.NativeParams := Adapter.GetContentViewParams(ARow, AnIndex, ARecordIndex); Result.CellSides := GetRowValueSeparatorCellSides(ARow); Result.FontStyle := []; Result.Transparent := IsColorTransparent(Result.NativeParams.Color); //ReportLink.Transparent; end; procedure TcxCustomVerticalGridReportLinkFormatter.DoInitializeWrapSeparatorItem(AnItem: TdxReportCellString; AWrapIndex: Integer); begin AnItem.CellSides := []; AnItem.Data := AWrapIndex; AnItem.Transparent := True; end; procedure TcxCustomVerticalGridReportLinkFormatter.DoInitializeWrapSeparatorRow(ARow: TdxReportCell); begin ARow.CellSides := []; ARow.Transparent := True; end; function TcxCustomVerticalGridReportLinkFormatter.GetWrapSeparatorClass: TdxReportCellStringClass; begin Result := TdxReportCellString; end; function TcxCustomVerticalGridReportLinkFormatter.QueryInterface(const IID: TGUID; out Obj): HResult; begin if GetInterface(IID, Obj) then Result := 0 else Result := E_NOINTERFACE; end; function TcxCustomVerticalGridReportLinkFormatter._AddRef: Integer; begin Result := 1; end; function TcxCustomVerticalGridReportLinkFormatter._Release: Integer; begin Result := 1; end; function TcxCustomVerticalGridReportLinkFormatter.IdxPSCellParams_GetAutoHeight: Boolean; begin Result := Adapter.CellAutoHeight; end; function TcxCustomVerticalGridReportLinkFormatter.IdxPSCellParams_GetDC: HDC; begin Result := Self.DC; end; function TcxCustomVerticalGridReportLinkFormatter.IdxPSCellParams_GetDisplayGraphicsAsText: Boolean; begin Result := ReportLink.OptionsRefinements.DisplayGraphicsAsText; end; function TcxCustomVerticalGridReportLinkFormatter.IdxPSCellParams_GetEndEllipsis: Boolean; begin Result := Adapter.CellEndEllipsis and not ReportLink.OptionsSize.BestFit; end; function TcxCustomVerticalGridReportLinkFormatter.IdxPSCellParams_GetFlatCheckMarks: Boolean; begin Result := ReportLink.OptionsRefinements.FlatCheckMarks; end; function TcxCustomVerticalGridReportLinkFormatter.IdxPSCellParams_GetGraphicsText: string; begin Result := ReportLink.OptionsRefinements.GraphicsText; end; function TcxCustomVerticalGridReportLinkFormatter.IdxPSCellParams_GetMultiline: Boolean; begin Result := Adapter.CellMultiline; end; function TcxCustomVerticalGridReportLinkFormatter.IdxPSCellParams_GetTransparentGraphics: Boolean; begin Result := ReportLink.OptionsRefinements.TransparentGraphics; end; function TcxCustomVerticalGridReportLinkFormatter.IdxPSCellParams2_GetPreviewMarginLeft: Integer; begin Result := 2; end; function TcxCustomVerticalGridReportLinkFormatter.IdxPSCellParams2_GetPreviewMarginRight: Integer; begin Result := 2; end; function TcxCustomVerticalGridReportLinkFormatter.IdxPSCellParams2_GetPreviewMaxHeight: Integer; begin Result := -1; end; function TcxCustomVerticalGridReportLinkFormatter.IdxPSCellParams2_GetPreviewMaxLineCount: Integer; begin Result := -1; end; function TcxCustomVerticalGridReportLinkFormatter.IdxPSCellParams2_GetRichEditGraphicClass: TGraphicClass; const GraphicClasses: array[Boolean] of TGraphicClass = (TMetafile, TBitmap); begin Result := GraphicClasses[IdxPSCellParams2_GetRichEditTransparent]; end; function TcxCustomVerticalGridReportLinkFormatter.IdxPSCellParams2_GetRichEditTransparent: Boolean; begin {$IFDEF DXVER500} Result := ReportLink.OptionsRefinements.TransparentRichEdits; {$ELSE} Result := False; {$ENDIF} end; procedure TcxCustomVerticalGridReportLinkFormatter.AddDelimiters; begin AddHorizontalDelimiters; AddVerticalDelimiters; end; procedure TcxCustomVerticalGridReportLinkFormatter.AddHorizontalDelimiters; var I, J: Integer; begin for I := 0 to WrapCount - 1 do for J := 0 to RowCount - 1 do RowPlaces[I, J].AddDelimiters(ReportLink); end; procedure TcxCustomVerticalGridReportLinkFormatter.AddVerticalDelimiters; var I: Integer; Row: TdxReportCell; begin for I := 0 to Builder.ReportRowCount - 1 do begin Row := Builder.ReportRows[I]; ReportLink.AddVerticalDelimiter(Row); if ReportLink.OptionsPagination.ByWrapping and IsLastRow(GetRowByReportRow(Row)) then ReportLink.AddVerticalHardDelimiter(Row); end; end; procedure TcxCustomVerticalGridReportLinkFormatter.AfterBuilding; begin if not Builder.IsAborted then begin FormatLookAndFeelItems; AddDelimiters; Builder.ReportCells.BorderColor := GridLinesColor; end; if AreRecordsNeededUnloading then UnloadRecords; FIsPrevGridMode := False; end; procedure TcxCustomVerticalGridReportLinkFormatter.BeforeBuilding; begin FIsPrevGridMode := DataController.IsGridMode; if AreRecordsNeededLoading then LoadRecords; if ReportLink.OptionsExpanding.AutoExpandRows then Adapter.FullExpand; CreateRowList; InitializeWrappedRecordIndexes; InitializeRecordWidths; InitializeRowHeights; Calculate; end; function TcxCustomVerticalGridReportLinkFormatter.GetAreRecordsNeededLoading: Boolean; begin Result := False; end; function TcxCustomVerticalGridReportLinkFormatter.GetAreRecordsNeededUnloading: Boolean; begin Result := False; end; function TcxCustomVerticalGridReportLinkFormatter.GetFirstInternalRecordIndex: Integer; begin Result := 0; end; function TcxCustomVerticalGridReportLinkFormatter.GetInternalRecordCount: Integer; begin Result := Adapter.RecordCount; end; procedure TcxCustomVerticalGridReportLinkFormatter.LoadRecords; begin end; procedure TcxCustomVerticalGridReportLinkFormatter.UnloadRecords; begin end; procedure TcxCustomVerticalGridReportLinkFormatter.AddWrappedRecordStartIndex(Value: Integer); begin FWrappedRecordStartIndexes.Add(TObject(Value)); end; procedure TcxCustomVerticalGridReportLinkFormatter.Calculate; begin CreateRowPlaces; if ReportLink.OptionsSize.BestFit and not ReportLink.OptionsSize.AutoWidth then CalculateBestFit; if ReportLink.OptionsSize.WrapRecords and (InternalRecordCount > 1) then begin CalculateRecordCounts; CreateRowPlaces; end; if ReportLink.OptionsSize.AutoWidth then CalculateRecordAutoWidths; CalculateViewWidths; CalculateRowHeights; CalculateRowPlaces; end; procedure TcxCustomVerticalGridReportLinkFormatter.CalculateBestFit; var RecordMinWidth, I, V, J, RecordMaxWidth: Integer; begin RecordMinWidth := CalculatedMinWidth; if ShowHeaders then begin for I := 0 to RowCount - 1 do begin V := RowPlaces[0, I].CalculatedHeaderWidth; if HeaderWidth < V then HeaderWidth := V; end; Dec(RecordMinWidth, HeaderWidth); end; RecordMaxWidth := 0; for I := WrappedRecordStartIndexes[0] to WrappedRecordStopIndexes[WrapCount - 1] do // v3.03 {0 to InternalRecordCount - 1} begin for J := 0 to RowCount - 1 do begin V := RowPlaces[0, J].CalculatedRecordWidth(I); if RecordWidths[I] < V then RecordWidths[I] := V; end; if RecordWidths[I] < RecordMinWidth then RecordWidths[I] := RecordMinWidth; if RecordMaxWidth < RecordWidths[I] then RecordMaxWidth := RecordWidths[I]; end; if ReportLink.OptionsSize.KeepSameRecordWidths then for I := WrappedRecordStartIndexes[0] to WrappedRecordStopIndexes[WrapCount - 1] do // v3.03 {0 to InternalRecordCount - 1} RecordWidths[I] := RecordMaxWidth; end; procedure TcxCustomVerticalGridReportLinkFormatter.CalculateHeight(const AParams: TdxReportItemViewParams; var AHeight: Integer); function CalculatedPatternHeight: Integer; begin Result := Renderer.CalcTextPatternHeight(DC, AParams.NativeParams.Font); end; var Value: Integer; begin Value := CalculatedPatternHeight; if Value > AHeight then AHeight := Value; end; function TcxCustomVerticalGridReportLinkFormatter.CalculatedMinWidth: Integer; var I, V: Integer; begin Result := 0; for I := 0 to RowCount - 1 do begin V := RowPlaces[0, I].CalculatedMinWidth; if Result < V then Result := V; end; end; procedure TcxCustomVerticalGridReportLinkFormatter.CalculateRecordCounts; var V, RecordIndex, RecordCount: Integer; begin V := Builder.AvailableSiteWidth - HeaderWidth; if V > 0 then begin RecordIndex := 0; repeat RecordCount := 0; while (V > 0) and (RecordIndex < InternalRecordCount) do begin Dec(V, RecordWidths[RecordIndex]); Inc(RecordIndex); Inc(RecordCount); if V > 0 then begin Dec(V, InterRecordsSpace); if (V < 0) and (RecordCount <> 1) then Inc(RecordIndex); end; end; if V <= 0 then begin if RecordCount > 1 then Dec(RecordIndex); AddWrappedRecordStartIndex(RecordIndex); V := Builder.AvailableSiteWidth - HeaderWidth; end; until RecordIndex > InternalRecordCount - 1; end else for RecordIndex := 1 to InternalRecordCount - 1 do AddWrappedRecordStartIndex(RecordIndex); AddWrappedRecordStartIndex(InternalRecordCount); end; procedure TcxCustomVerticalGridReportLinkFormatter.CalculateRowHeights; var I, RowHeight: Integer; Row: TcxCustomRow; begin for I := 0 to RowCount - 1 do begin Row := Rows[I]; RowHeight := Adapter.RowHeights[Row]; if RowHeight = -1 then RowHeight := RowPlaces[0, IndexOfRow(Row)].CalculatedMinHeight; RowHeights[Row] := RowHeight; end; end; procedure TcxCustomVerticalGridReportLinkFormatter.CalculateRecordAutoWidths; procedure AssignAutoWidthItem(AnItem: TcxAutoWidthItem; AMinWidth, AWidth: Integer); begin AnItem.MinWidth := AMinWidth; AnItem.Width := AWidth; end; function GetAvailableSiteWidth(ARecordCount: Integer): Integer; begin Result := Builder.AvailableSiteWidth - InterRecordsSpace * (ARecordCount - 1) - HeaderWidth; end; var I, J: Integer; AutoWidthObject: TcxAutoWidthObject; begin if InternalRecordCount <> 1 then for I := 0 to WrapCount - 1 do begin AutoWidthObject := TcxAutoWidthObject.Create(RecordCounts[I]); try for J := WrappedRecordStartIndexes[I] to WrappedRecordStopIndexes[I] do AssignAutoWidthItem(AutoWidthObject.AddItem, RecordMinWidths[J], RecordWidths[J]); AutoWidthObject.AvailableWidth := GetAvailableSiteWidth(RecordCounts[I]); AutoWidthObject.Calculate; for J := WrappedRecordStartIndexes[I] to WrappedRecordStopIndexes[I] do RecordWidths[J] := AutoWidthObject[J - WrappedRecordStartIndexes[I]].AutoWidth; finally AutoWidthObject.Free; end; end else for I := WrappedRecordStartIndexes[0] to WrappedRecordStopIndexes[WrapCount - 1] do // v3.03 {0 to InternalRecordCount - 1} RecordWidths[I] := GetAvailableSiteWidth(InternalRecordCount); end; procedure TcxCustomVerticalGridReportLinkFormatter.CalculateRowPlaces; var I, J: Integer; begin for I := 0 to WrapCount - 1 do for J := 0 to RowCount - 1 do RowPlaces[I, J].Calculate; end; procedure TcxCustomVerticalGridReportLinkFormatter.CalculateViewWidths; var I, J, V: Integer; begin FViewWidths.Count := WrapCount; for I := 0 to WrapCount - 1 do begin V := HeaderWidth; for J := WrappedRecordStartIndexes[I] to WrappedRecordStopIndexes[I] do begin Inc(V, RecordWidths[J]); if J < WrappedRecordStopIndexes[I] then Inc(V, InterRecordsSpace); end; ViewWidths[I] := V; end; end; procedure TcxCustomVerticalGridReportLinkFormatter.CreateRowList; var I: Integer; Row: TcxCustomRow; begin FRows.Clear; for I := 0 to Adapter.RowCount - 1 do begin Row := Adapter.Rows[I]; if Adapter.IsRowVisible(Row) then FRows.Add(Row); end; end; procedure TcxCustomVerticalGridReportLinkFormatter.CreateRowPlaces; var I, J: Integer; Place: TcxVerticalGridCustomRowPlace; begin ClearRowPlaces; for I := 0 to WrapCount - 1 do for J := 0 to RowCount - 1 do begin Place := CreateRowPlace(Rows[J], I); FRowPlaces.Add(Place); end; end; function TcxCustomVerticalGridReportLinkFormatter.CreateRowPlace(ARow: TcxCustomRow; AWrapIndex: Integer): TcxVerticalGridCustomRowPlace; begin Result := RowHelpers[ARow].RowPlaceClass.Create(Self, ARow, AWrapIndex); end; procedure TcxCustomVerticalGridReportLinkFormatter.InitializeRecordWidths; var I: Integer; begin FRecordWidths.Count := InternalRecordCount; for I := WrappedRecordStartIndexes[0] to WrappedRecordStopIndexes[WrapCount - 1] do // v3.03 {0 to InternalRecordCount - 1} RecordWidths[I] := -1; end; procedure TcxCustomVerticalGridReportLinkFormatter.InitializeRowHeights; var I: Integer; begin FRowHeights.Count := RowCount; for I := 0 to RowCount - 1 do RowHeights[Rows[I]] := -1; end; procedure TcxCustomVerticalGridReportLinkFormatter.InitializeWrappedRecordIndexes; begin AddWrappedRecordStartIndex(FirstInternalRecordIndex); end; function TcxCustomVerticalGridReportLinkFormatter.GetBackgroundBitmap(Index: Integer): TBitmap; begin if ReportLink.OptionsFormatting.UseNativeStyles then Result := ReportLink.Styles.GetBitmap(MapStyleBackgroundBitmapIndex(Index)) else Result := Adapter.GetBackgroundBitmap(Index); end; function TcxCustomVerticalGridReportLinkFormatter.GetBackgroundBitmapIndex(Index: Integer): Integer; begin Result := ReportLink.AddBackgroundBitmapToPool(GetBackgroundBitmap(Index)); end; function TcxCustomVerticalGridReportLinkFormatter.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 TcxCustomVerticalGridReportLinkFormatter.MapStyleBackgroundBitmapIndex(AVerticalGridBackgroundBitmapIndex: Integer): Integer; begin case AVerticalGridBackgroundBitmapIndex of vgs_Category: Result := vspsVGridCategory; vgs_Content: Result := vspsVGridContent; vgs_Header: Result := vspsVGridHeader; else Result := 0; end; end; function TcxCustomVerticalGridReportLinkFormatter.GetCategoryRowFont(ARow: TcxCustomRow): TFont; begin Result := GetCategoryRowViewParams(ARow).NativeParams.Font; end; function TcxCustomVerticalGridReportLinkFormatter.GetRowHeaderFont(ARow: TcxCustomRow; AnIndex: Integer): TFont; begin Result := GetRowHeaderViewParams(ARow, AnIndex).NativeParams.Font; end; function TcxCustomVerticalGridReportLinkFormatter.GetRowHeaderSeparatorsFont(ARow: TcxCustomRow; AnIndex: Integer): TFont; begin Result := GetRowHeaderViewParams(ARow, AnIndex).NativeParams.Font; end; function TcxCustomVerticalGridReportLinkFormatter.GetRowValueFont(ARow: TcxCustomRow; AnIndex, ARecordIndex: Integer): TFont; begin Result := GetRowValueViewParams(ARow, AnIndex, ARecordIndex).NativeParams.Font; end; function TcxCustomVerticalGridReportLinkFormatter.GetRowValueSeparatorsFont(ARow: TcxCustomRow; AnIndex, ARecordIndex: Integer): TFont; begin Result := GetRowValueViewParams(ARow, AnIndex, ARecordIndex).NativeParams.Font; end; procedure TcxCustomVerticalGridReportLinkFormatter.ClearRowPlaces; var I: Integer; begin for I := 0 to FRowPlaces.Count - 1 do TObject(FRowPlaces[I]).Free; FRowPlaces.Clear; end; function TcxCustomVerticalGridReportLinkFormatter.FixupHorzCellSides(ARow: TcxCustomRow; ACellSides: TdxCellSides): TdxCellSides; begin Result := ACellSides; if not ShowHorzGridLines then begin if not IsFirstRow(ARow) then Exclude(Result, csTop); if not IsLastRow(ARow) then Exclude(Result, csBottom); end; if not ShowBorders then begin if IsFirstRow(ARow) then Exclude(Result, csTop); if IsLastRow(ARow) then Exclude(Result, csBottom); end; end; procedure TcxCustomVerticalGridReportLinkFormatter.FreeAndNilRowPlaces; begin ClearRowPlaces; FreeAndNil(FRowPlaces); end; function TcxCustomVerticalGridReportLinkFormatter.GetImageHeight(ARow: TcxCustomRow; ACellIndex: Integer): Integer; begin Result := Adapter.GetImageHeight(ARow, ACellIndex); end; function TcxCustomVerticalGridReportLinkFormatter.GetImageWidth(ARow: TcxCustomRow; ACellIndex: Integer): Integer; begin Result := Adapter.GetImageWidth(ARow, ACellIndex); end; function TcxCustomVerticalGridReportLinkFormatter.GetNextRow(ARow: TcxCustomRow): TcxCustomRow; var Index: Integer; begin Index := IndexOfRow(ARow); if Index < RowCount - 1 then Result := Rows[Index + 1] else Result := nil; end; function TcxCustomVerticalGridReportLinkFormatter.GetRowByReportRow(ARow: TdxReportCell): TcxCustomRow; begin Result := TcxCustomRow(ARow.Cells[0].Data); end; function TcxCustomVerticalGridReportLinkFormatter.GetPrevRow(ARow: TcxCustomRow): TcxCustomRow; var Index: Integer; begin Index := IndexOfRow(ARow); if Index > 0 then Result := Rows[Index - 1] else Result := nil; end; function TcxCustomVerticalGridReportLinkFormatter.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 TcxCustomVerticalGridReportLinkFormatter.IndexOfRow(ARow: TcxCustomRow): Integer; begin Result := FRows.IndexOf(ARow); end; function TcxCustomVerticalGridReportLinkFormatter.IsColorTransparent(AColor: TColor): Boolean; begin Result := ColorToRGB(AColor) = ColorToRGB(TransparentColor); end; function TcxCustomVerticalGridReportLinkFormatter.IsFirstRow(ARow: TcxCustomRow): Boolean; begin Result := ARow = FRows.First; end; function TcxCustomVerticalGridReportLinkFormatter.IsLastRow(ARow: TcxCustomRow): Boolean; begin Result := ARow = FRows.Last; end; function TcxCustomVerticalGridReportLinkFormatter.MakeCustomDrawCodeData(AnAttribute: TcxVerticalGridAttributeID; ACellIndex, ARecordIndex: Integer): Integer; begin Result := ReportLink.MakeCustomDrawCodeData(AnAttribute, ACellIndex, ARecordIndex); end; procedure TcxCustomVerticalGridReportLinkFormatter.RegisterLookAndFeelItem(AnItem: TdxReportVisualItem; AEdgeStyle: TdxCellEdgeStyle); begin AnItem.EdgeMode := cem3DEffects; AnItem.Edge3DStyle := AEdgeStyle; FLookAndFeelItems.Add(AnItem); end; procedure TcxCustomVerticalGridReportLinkFormatter.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 TcxCustomVerticalGridReportLinkFormatter.GetAutoWidth: Boolean; begin Result := ReportLink.OptionsSize.AutoWidth; end; function TcxCustomVerticalGridReportLinkFormatter.GetDataController: TcxCustomDataController; begin Result := Adapter.DataController; end; function TcxCustomVerticalGridReportLinkFormatter.GetDC: HDC; begin Result := ReportLink.ScreenDC; end; function TcxCustomVerticalGridReportLinkFormatter.GetExpandButtonColor(Row: TcxCustomRow): TColor; begin if Row is TcxCategoryRow then Result := GetCategoryRowViewParams(Row).NativeParams.Color else Result := ExpandButtonInteriorColor; end; function TcxCustomVerticalGridReportLinkFormatter.GetExpandButtonSize: Integer; begin Result := DefaultExpandButtonSize; end; function TcxCustomVerticalGridReportLinkFormatter.GetGridLinesColor: TColor; begin Result := ReportLink.OptionsFormatting.GridLineColor; if Result = clDefault then Result := Adapter.GridLinesColor; end; function TcxCustomVerticalGridReportLinkFormatter.GetHeaderAvailableWidth(Row: TcxCustomRow): Integer; begin if ShowHeaders then if HeaderWidth <> -1 then begin Result := HeaderWidth - IndentAreas[Row]; if Result < 0 then Result := 0; end else Result := Adapter.HeaderAvailableWidths[Row] else Result := 0; end; function TcxCustomVerticalGridReportLinkFormatter.GetHeaderMinWidth: Integer; begin Result := Adapter.HeaderMinWidth; end; function TcxCustomVerticalGridReportLinkFormatter.GetHeaderWidth: Integer; begin if ShowHeaders then if FHeaderWidth = -1 then Result := Adapter.HeaderWidth else Result := FHeaderWidth else Result := 0; end; function TcxCustomVerticalGridReportLinkFormatter.GetIndentArea(Row: TcxCustomRow): Integer; begin if ShowHeaders then Result := Adapter.IndentAreas[Row] else Result := 0; end; function TcxCustomVerticalGridReportLinkFormatter.GetInternalRecordWidth: Integer; begin Result := Adapter.RecordWidth[InternalRecordCount]; end; function TcxCustomVerticalGridReportLinkFormatter.GetInterRecordsSpace: Integer; begin if FInterRecordsSpace = -1 then Result := Adapter.InterRecordsSpace else Result := FInterRecordsSpace; end; function TcxCustomVerticalGridReportLinkFormatter.GetLookAndFeelItem(Index: Integer): TdxReportVisualItem; begin Result := TdxReportVisualItem(FLookAndFeelItems[Index]); end; function TcxCustomVerticalGridReportLinkFormatter.GetLookAndFeelItemCount: Integer; begin Result := FLookAndFeelItems.Count; end; function TcxCustomVerticalGridReportLinkFormatter.GetOptionsView: TcxVerticalGridReportLinkOptionsView; begin Result := ReportLink.OptionsView; end; function TcxCustomVerticalGridReportLinkFormatter.GetRecordCount(Index: Integer): Integer; begin Result := WrappedRecordStopIndexes[Index] - WrappedRecordStartIndexes[Index] + 1; end; function TcxCustomVerticalGridReportLinkFormatter.GetInternalIndexByRecordIndex(RecordIndex: Integer): Integer; begin Result := RecordIndex - FirstInternalRecordIndex; end; function TcxCustomVerticalGridReportLinkFormatter.GetRecordMinWidth(RecordIndex: Integer): Integer; begin Result := Adapter.RecordMinWidths[RecordIndex]; end; function TcxCustomVerticalGridReportLinkFormatter.GetRecordWidth(RecordIndex: Integer): Integer; begin Result := Integer(FRecordWidths[InternalIndexesByRecordIndex[RecordIndex]]); if Result = -1 then Result := InternalRecordWidth; end; function TcxCustomVerticalGridReportLinkFormatter.GetRow(Index: Integer): TcxCustomRow; begin Result := TcxCustomRow(FRows[Index]); end; function TcxCustomVerticalGridReportLinkFormatter.GetRowCount: Integer; begin Result := FRows.Count; end; function TcxCustomVerticalGridReportLinkFormatter.GetRowHeight(Row: TcxCustomRow): Integer; begin Result := Integer(FRowHeights[IndexOfRow(Row)]); end; function TcxCustomVerticalGridReportLinkFormatter.GetRowHelper(Row: TcxCustomRow): TcxVerticalGridCustomRowHelper; begin Result := Adapter.Helpers[Row]; end; function TcxCustomVerticalGridReportLinkFormatter.GetRowPlace(WrapIndex, Index: Integer): TcxVerticalGridCustomRowPlace; begin Result := FRowPlaces[RowPlaceFlatIndexes[WrapIndex, Index]]; end; function TcxCustomVerticalGridReportLinkFormatter.GetRowPlaceByRow(Row: TcxCustomRow; WrapIndex: Integer): TcxVerticalGridCustomRowPlace; begin Result := RowPlaces[WrapIndex, IndexOfRow(Row)]; end; function TcxCustomVerticalGridReportLinkFormatter.GetRowPlaceFlatIndex(WrapIndex, Index: Integer): Integer; begin Result := WrapIndex * RowCount + Index; end; function TcxCustomVerticalGridReportLinkFormatter.GetRowPlaceCount: Integer; begin Result := FRowPlaces.Count; end; function TcxCustomVerticalGridReportLinkFormatter.GetRenderer: TdxPSReportRenderer; begin Result := ReportLink.Renderer; end; function TcxCustomVerticalGridReportLinkFormatter.GetShowBorders: Boolean; begin Result := OptionsView.Borders; end; function TcxCustomVerticalGridReportLinkFormatter.GetShowHeaders: Boolean; begin Result := OptionsView.Headers; end; function TcxCustomVerticalGridReportLinkFormatter.GetShowHorzGridLines: Boolean; begin Result := Adapter.ShowHorzGridLines; end; function TcxCustomVerticalGridReportLinkFormatter.GetShowVertGridLines: Boolean; begin Result := Adapter.ShowVertGridLines; end; function TcxCustomVerticalGridReportLinkFormatter.GetViewMaxWidth: Integer; var I, V: Integer; begin Result := 0; for I := 0 to WrapCount - 1 do begin V := ViewWidths[I]; if Result < V then Result := V; end; end; function TcxCustomVerticalGridReportLinkFormatter.GetViewWidth(WrapIndex: Integer): Integer; begin Result := Integer(FViewWidths[WrapIndex]); end; function TcxCustomVerticalGridReportLinkFormatter.GetWrapCount: Integer; begin Result := Max(1, FWrappedRecordStartIndexes.Count - 1); end; function TcxCustomVerticalGridReportLinkFormatter.GetWrappedRecordStartIndex(Index: Integer): Integer; begin Result := Integer(FWrappedRecordStartIndexes[Index]); end; function TcxCustomVerticalGridReportLinkFormatter.GetWrappedRecordStopIndex(Index: Integer): Integer; begin if Index < WrapCount - 1 then Result := WrappedRecordStartIndexes[Index + 1] - 1 else Result := WrappedRecordStartIndexes[0] + InternalRecordCount - 1; end; function TcxCustomVerticalGridReportLinkFormatter.GetWrapSeparatorHeight: Integer; begin Result := ReportLink.OptionsSize.WrapSeparatorHeight; end; procedure TcxCustomVerticalGridReportLinkFormatter.SetInterRecordsSpace(Value: Integer); begin if Value < 0 then Value := 0; FInterRecordsSpace := Value; end; procedure TcxCustomVerticalGridReportLinkFormatter.SetRecordWidth(RecordIndex: Integer; Value: Integer); begin FRecordWidths[InternalIndexesByRecordIndex[RecordIndex]] := TObject(Value); end; procedure TcxCustomVerticalGridReportLinkFormatter.SetRowHeight(Row: TcxCustomRow; Value: Integer); begin FRowHeights[IndexOfRow(Row)] := TObject(Value); end; procedure TcxCustomVerticalGridReportLinkFormatter.SetViewWidth(WrapIndex: Integer; Value: Integer); begin FViewWidths[WrapIndex] := TObject(Value); end; procedure TcxCustomVerticalGridReportLinkFormatter.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; { TcxVerticalGridReportLinkOptionsExpanding } procedure TcxVerticalGridReportLinkOptionsExpanding.Assign(Source: TPersistent); begin if Source is TcxVerticalGridReportLinkOptionsExpanding then with TcxVerticalGridReportLinkOptionsExpanding(Source) do begin Self.AutoExpandRows := AutoExpandRows; end; inherited; end; procedure TcxVerticalGridReportLinkOptionsExpanding.RestoreDefaults; begin inherited; AutoExpandRows := False; end; function TcxVerticalGridReportLinkOptionsExpanding.DesignerTabIndex: Integer; begin Result := 1; end; function TcxVerticalGridReportLinkOptionsExpanding.GetReportLink: TcxCustomVerticalGridReportLink; begin Result := inherited ReportLink as TcxCustomVerticalGridReportLink; end; procedure TcxVerticalGridReportLinkOptionsExpanding.SetAutoExpandRows(Value: Boolean); begin if FAutoExpandRows <> Value then begin FAutoExpandRows := Value; Changed; end; end; { TcxVerticalGridReportLinkOptionsFormatting } function TcxVerticalGridReportLinkOptionsFormatting.DesignerTabIndex: Integer; begin Result := 2; end; function TcxVerticalGridReportLinkOptionsFormatting.GetReportLink: TcxCustomVerticalGridReportLink; begin Result := inherited ReportLink as TcxCustomVerticalGridReportLink; end; { TcxVerticalGridReportLinkOptionsPagination } procedure TcxVerticalGridReportLinkOptionsPagination.Assign(Source: TPersistent); begin if Source is TcxVerticalGridReportLinkOptionsPagination then with TcxVerticalGridReportLinkOptionsPagination(Source) do begin Self.ByRows := ByRows; Self.ByWrapping := ByWrapping; Self.OneWrappingPerPage := OneWrappingPerPage; end; inherited; end; procedure TcxVerticalGridReportLinkOptionsPagination.RestoreDefaults; begin inherited; ByRows := True; ByWrapping := True; OneWrappingPerPage := False; end; function TcxVerticalGridReportLinkOptionsPagination.DesignerTabIndex: Integer; begin Result := 2; end; function TcxVerticalGridReportLinkOptionsPagination.GetReportLink: TcxCustomVerticalGridReportLink; begin Result := inherited ReportLink as TcxCustomVerticalGridReportLink; end; procedure TcxVerticalGridReportLinkOptionsPagination.SetByRows(Value: Boolean); begin if FByRows <> Value then begin FByRows := Value; Changed; end; end; procedure TcxVerticalGridReportLinkOptionsPagination.SetByWrapping(Value: Boolean); begin if FByWrapping <> Value then begin FByWrapping := Value; Changed; end; end; procedure TcxVerticalGridReportLinkOptionsPagination.SetOneWrappingPerPage(Value: Boolean); begin if FOneWrappingPerPage <> Value then begin FOneWrappingPerPage := Value; if ByWrapping then Changed; end; end; { TcxVerticalGridReportLinkOptionsRefinements } function TcxVerticalGridReportLinkOptionsRefinements.DesignerTabIndex: Integer; begin Result := 2; end; function TcxVerticalGridReportLinkOptionsRefinements.GetReportLink: TcxCustomVerticalGridReportLink; begin Result := inherited ReportLink as TcxCustomVerticalGridReportLink; end; function TcxVerticalGridReportLinkOptionsRefinements.GetSuppressBackgroundBitmaps: Boolean; begin Result := ReportLink.OptionsFormatting.SuppressBackgroundBitmaps; end; procedure TcxVerticalGridReportLinkOptionsRefinements.SetSuppressBackgroundBitmaps(Value: Boolean); begin ReportLink.OptionsFormatting.SuppressBackgroundBitmaps := Value; end; { TcxVerticalGridReportLinkOptionsSize } procedure TcxVerticalGridReportLinkOptionsSize.Assign(Source: TPersistent); begin if Source is TcxVerticalGridReportLinkOptionsSize then with TcxVerticalGridReportLinkOptionsSize(Source) do begin Self.BestFit := BestFit; Self.KeepSameRecordWidths := KeepSameRecordWidths; Self.WrapRecords := WrapRecords; Self.WrapSeparatorHeight := WrapSeparatorHeight; end; inherited; end; procedure TcxVerticalGridReportLinkOptionsSize.RestoreDefaults; begin inherited; BestFit := False; KeepSameRecordWidths := True; WrapRecords := True; WrapSeparatorHeight := 20; end; function TcxVerticalGridReportLinkOptionsSize.DesignerTabIndex: Integer; begin Result := 1; end; function TcxVerticalGridReportLinkOptionsSize.GetReportLink: TcxCustomVerticalGridReportLink; begin Result := inherited ReportLink as TcxCustomVerticalGridReportLink; end; procedure TcxVerticalGridReportLinkOptionsSize.SetBestFit(Value: Boolean); begin if FBestFit <> Value then begin FBestFit := Value; Changed; end; end; procedure TcxVerticalGridReportLinkOptionsSize.SetKeepSameRecordWidths(Value: Boolean); begin if FKeepSameRecordWidths <> Value then begin FKeepSameRecordWidths := Value; if BestFit then Changed; end; end; procedure TcxVerticalGridReportLinkOptionsSize.SetWrapRecords(Value: Boolean); begin if FWrapRecords <> Value then begin FWrapRecords := Value; Changed; end; end; procedure TcxVerticalGridReportLinkOptionsSize.SetWrapSeparatorHeight(Value: Integer); begin if Value < 0 then Value := 0; if FWrapSeparatorHeight <> Value then begin FWrapSeparatorHeight := Value; Changed; end; end; { TcxVerticalGridReportLinkOptionsView } procedure TcxVerticalGridReportLinkOptionsView.Assign(Source: TPersistent); begin if Source is TcxVerticalGridReportLinkOptionsView then with TcxVerticalGridReportLinkOptionsView(Source) do begin Self.Borders := Borders; Self.ExpandButtons := ExpandButtons; Self.Headers := Headers; Self.Mode := Mode; end; inherited; end; procedure TcxVerticalGridReportLinkOptionsView.RestoreDefaults; begin inherited; Borders := True; ExpandButtons := True; Headers := True; Mode := vpmLoadedRecords; end; function TcxVerticalGridReportLinkOptionsView.DesignerTabIndex: Integer; begin Result := 0; end; function TcxVerticalGridReportLinkOptionsView.GetActualMode: TcxVerticalGridReportLinkPrintMode; begin Result := vpmLoadedRecords; // i.e. always equals 1 record for non Virtual(DB)VerticalGrid end; function TcxVerticalGridReportLinkOptionsView.GetReportLink: TcxCustomVerticalGridReportLink; begin Result := inherited ReportLink as TcxCustomVerticalGridReportLink; end; procedure TcxVerticalGridReportLinkOptionsView.SetBorders(Value: Boolean); begin if FBorders <> Value then begin FBorders := Value; Changed; end; end; procedure TcxVerticalGridReportLinkOptionsView.SetExpandButtons(Value: Boolean); begin if FExpandButtons <> Value then begin FExpandButtons := Value; Changed; end; end; procedure TcxVerticalGridReportLinkOptionsView.SetHeaders(Value: Boolean); begin if FHeaders <> Value then begin FHeaders := Value; Changed; end; end; procedure TcxVerticalGridReportLinkOptionsView.SetMode(Value: TcxVerticalGridReportLinkPrintMode); begin if FMode <> Value then begin FMode := Value; Changed; end; end; { TcxVerticalGridReportLinkStyles } procedure TcxVerticalGridReportLinkStyles.Assign(Source: TPersistent); begin if Source is TcxVerticalGridReportLinkStyles then with TcxVerticalGridReportLinkStyles(Source) do begin Self.Category := Category; Self.Content := Content; Self.Header := Header; end; inherited; end; procedure TcxVerticalGridReportLinkStyles.GetCategoryParams(ARow: TcxCustomRow; out AParams: TcxViewParams); begin GetViewParams(vspsVGridCategory, ARow, nil, AParams); end; procedure TcxVerticalGridReportLinkStyles.GetContentParams(ARow: TcxCustomRow; AnIndex, ARecordIndex: Integer; out AParams: TcxViewParams); begin GetViewParams(vspsVGridContent, ARow, nil, AParams); end; procedure TcxVerticalGridReportLinkStyles.GetHeaderParams(ARow: TcxCustomRow; out AParams: TcxViewParams); begin GetViewParams(vspsVGridHeader, nil, nil, AParams); end; procedure TcxVerticalGridReportLinkStyles.GetIndentParams(ARow: TcxCustomRow; out AParams: TcxViewParams); const StyleIndexes: array[Boolean] of Integer = (vspsVGridHeader, vspsVGridCategory); begin GetViewParams(StyleIndexes[ARow is TcxCategoryRow], ARow, nil, AParams) end; function TcxVerticalGridReportLinkStyles.DesignerTabIndex: Integer; begin Result := 3; end; procedure TcxVerticalGridReportLinkStyles.GetDefaultViewParams(Index: Integer; AData: TObject; out AParams: TcxViewParams); const FixedParts = [vspsVGridCategory, vspsVGridHeader]; begin inherited; if ReportLink <> nil then with AParams do begin if Index in FixedParts then Color := dxPSCore.dxDefaultFixedColor else Color := dxPSCore.dxDefaultContentColor; if Index = vspsVGridCategory then Font := ReportLink.CategoryFont else Font := ReportLink.Font; TextColor := Font.Color; end; end; class function TcxVerticalGridReportLinkStyles.GetStyleCaption(AnIndex: Integer): string; begin case AnIndex of vspsVGridContent: Result := cxGetResourceString(@sdxContentStyle); vspsVGridHeader: Result := cxGetResourceString(@sdxHeaderStyle); else Result := cxGetResourceString(@sdxCategoryStyle); end; end; function TcxVerticalGridReportLinkStyles.GetStyleIndexByCaption(const Caption: string): Integer; begin for Result := vspsVGridFirst to vspsVGridLast do if dxPSUtl.dxSameText(Caption, GetStyleCaption(Result)) then Exit; Result := -1; end; function TcxVerticalGridReportLinkStyles.GetReportLink: TcxCustomVerticalGridReportLink; begin Result := inherited ReportLink as TcxCustomVerticalGridReportLink; end; { TcxVerticalGridReportLinkStyleSheet } class function TcxVerticalGridReportLinkStyleSheet.GetStylesClass: TcxCustomStylesClass; begin Result := TcxVerticalGridReportLinkStyles; end; function TcxVerticalGridReportLinkStyleSheet.GetStylesValue: TcxVerticalGridReportLinkStyles; begin if GetStyles is TcxVerticalGridReportLinkStyles then Result := TcxVerticalGridReportLinkStyles(GetStyles) else Result := nil; end; procedure TcxVerticalGridReportLinkStyleSheet.SetStylesValue(Value: TcxVerticalGridReportLinkStyles); begin SetStyles(Value); end; { TcxVerticalGridHostInfo } procedure TcxVerticalGridHostInfo.Initialize(AParent: TdxReportCell); begin FParent := AParent; end; { TcxCustomVerticalGridReportLink } constructor TcxCustomVerticalGridReportLink.Create(AOwner: TComponent); begin inherited; FCategoryFont := TFont.Create; CategoryFont := Font; FDelimitersHardVert := TList.Create; InternalRestoreDefaults; LinkModified(False); end; destructor TcxCustomVerticalGridReportLink.Destroy; begin FreeAndNil(FDelimitersHardVert); FreeAndNil(FCategoryFont); inherited; end; procedure TcxCustomVerticalGridReportLink.ConstructReport(AReportCells: TdxReportCells); function HasData: Boolean; begin Result := VerticalGrid.HasVisibleRows; 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 CalculateReportPartSizes(AReportCells.Cells); end; begin if VerticalGrid = nil then Exit; inherited; if not HasData then Exit; PrepareConstruct; try Build; if not AbortBuilding then CalculateSizes; finally UnprepareConstruct; end; end; procedure TcxCustomVerticalGridReportLink.ConvertCoords; begin inherited; ConvertDelimiters(DelimitersHardVert); end; procedure TcxCustomVerticalGridReportLink.CustomDraw(AItem: TAbstractdxReportCellData; ACanvas: TCanvas; ABoundsRect, AClientRect: TRect; var ADone: Boolean); var DrawInfo: TcxVerticalGridCellCustomDrawInfo; begin GetItemCustomDrawInfo(AItem, DrawInfo); with DrawInfo do case AttributeID of cxVerticalGridCategoryRowID: DoCustomDrawRowHeaderCell(ACanvas, Row, CellIndex, TdxReportCellImage(AItem), ADone); cxVerticalGridRowHeaderID: DoCustomDrawRowHeaderCell(ACanvas, Row, CellIndex, TdxReportCellImage(AItem), ADone); cxVerticalGridRowHeaderSeparatorID: DoCustomDrawRowHeaderSeparatorCell(ACanvas, Row, CellIndex, TdxReportCellString(AItem), ADone); cxVerticalGridRowValueID: DoCustomDrawRowValueCell(ACanvas, Row, CellIndex, RecordIndex, AItem, ADone); cxVerticalGridRowValueSeparatorID: DoCustomDrawRowValueSeparatorCell(ACanvas, Row, CellIndex, RecordIndex, TdxReportCellString(AItem), ADone); cxVerticalGridRowIndentID: DoCustomDrawRowIndentCell(ACanvas, Row, CellIndex, TdxReportCellExpandButton(AItem), ADone); end; end; procedure TcxCustomVerticalGridReportLink.FontChanged(Sender: TObject); begin if CategoryFont <> nil then CategoryFont := Font; inherited; end; function TcxCustomVerticalGridReportLink.GetBreakPagesByHardDelimiters: Boolean; begin Result := OptionsPagination.OneWrappingPerPage; end; procedure TcxCustomVerticalGridReportLink.GetImageLists(AProc: TdxPSGetImageListProc); begin inherited; AProc(VerticalGrid.Images); end; function TcxCustomVerticalGridReportLink.GetRebuildOnPageParamsChange(AUpdateCodes: TdxPrinterPageUpdateCodes): Boolean; begin Result := (AUpdateCodes * uaMarginsVert <> []) and (OptionsSize.AutoWidth or OptionsSize.WrapRecords); end; function TcxCustomVerticalGridReportLink.GetUseHardVertDelimiters: Boolean; begin Result := OptionsPagination.ByWrapping; end; procedure TcxCustomVerticalGridReportLink.InternalRestoreFromOriginal; begin inherited; if VerticalGrid <> nil then begin OptionsFormatting.LookAndFeelKind := VerticalGrid.LookAndFeel.Kind; OptionsSize.AutoWidth := VerticalGrid.OptionsView.AutoScaleBands; OptionsView.ExpandButtons := VerticalGrid.OptionsView.ShowButtons; OptionsView.Headers := VerticalGrid.OptionsView.ShowHeaders; end; end; function TcxCustomVerticalGridReportLink.IsSupportedCustomDraw(Item: TAbstractdxReportCellData): Boolean; var DrawInfo: TcxVerticalGridCellCustomDrawInfo; begin Result := inherited IsSupportedCustomDraw(Item) and (Item <> nil) and IsCustomDrawn(GetItemCustomDrawInfo(Item, DrawInfo)); end; procedure TcxCustomVerticalGridReportLink.MakeHardDelimiters(AReportCells: TdxReportCells; AVertDelimiters: TList); begin inherited; dxPSUtl.dxCopyList(DelimitersHardVert, AVertDelimiters); end; procedure TcxCustomVerticalGridReportLink.DoCustomDrawRowHeaderCell(ACanvas: TCanvas; ARow: TcxCustomRow; AnIndex: Integer; AnItem: TdxReportCellImage; var ADone: Boolean); begin if Assigned(FOnCustomDrawRowHeaderCell) then FOnCustomDrawRowHeaderCell(Self, ACanvas, ARow, AnIndex, AnItem, ADone); end; procedure TcxCustomVerticalGridReportLink.DoCustomDrawRowHeaderSeparatorCell(ACanvas: TCanvas; ARow: TcxCustomRow; AnIndex: Integer; AnItem: TdxReportCellString; var ADone: Boolean); begin if Assigned(FOnCustomDrawRowHeaderSeparatorCell) then FOnCustomDrawRowHeaderSeparatorCell(Self, ACanvas, ARow, AnIndex, AnItem, ADone); end; procedure TcxCustomVerticalGridReportLink.DoCustomDrawRowIndentCell(ACanvas: TCanvas; ARow: TcxCustomRow; AnIndex: Integer; AnItem: TdxReportCellExpandButton; var ADone: Boolean); begin if Assigned(FOnCustomDrawRowIndentCell) then FOnCustomDrawRowIndentCell(Self, ACanvas, ARow, AnIndex, AnItem, ADone); end; procedure TcxCustomVerticalGridReportLink.DoCustomDrawRowValueCell(ACanvas: TCanvas; ARow: TcxCustomRow; ACellIndex, ARecordIndex: Integer; AnItem: TAbstractdxReportCellData; var ADone: Boolean); begin if Assigned(FOnCustomDrawRowValueCell) then FOnCustomDrawRowValueCell(Self, ACanvas, ARow, ACellIndex, ARecordIndex, AnItem, ADone); end; procedure TcxCustomVerticalGridReportLink.DoCustomDrawRowValueSeparatorCell(ACanvas: TCanvas; ARow: TcxCustomRow; ACellIndex, ARecordIndex: Integer; AnItem: TdxReportCellString; var ADone: Boolean); begin if Assigned(FOnCustomDrawRowValueSeparatorCell) then FOnCustomDrawRowValueSeparatorCell(Self, ACanvas, ARow, ACellIndex, ARecordIndex, AnItem, ADone); end; procedure TcxCustomVerticalGridReportLink.DoInitializeRowHeaderCell(ARow: TcxCustomRow; ACellIndex: Integer; AnItem: TdxReportCellImage); begin if Assigned(FOnInitializeRowHeaderCell) then FOnInitializeRowHeaderCell(Self, ARow, ACellIndex, AnItem); end; procedure TcxCustomVerticalGridReportLink.DoInitializeRowHeaderSeparatorCell(ARow: TcxCustomRow; AnIndex: Integer; AnItem: TdxReportCellString); begin if Assigned(FOnInitializeRowHeaderSeparatorCell) then FOnInitializeRowHeaderSeparatorCell(Self, ARow, AnIndex, AnItem); end; procedure TcxCustomVerticalGridReportLink.DoInitializeRowIndentCell(ARow: TcxCustomRow; AnIndex: Integer; AnItem: TdxReportCellExpandButton); begin if Assigned(FOnInitializeRowIndentCell) then FOnInitializeRowIndentCell(Self, ARow, AnIndex, AnItem); end; procedure TcxCustomVerticalGridReportLink.DoInitializeRowValueCell(ARow: TcxCustomRow; ACellIndex, ARecordIndex: Integer; AnItem: TAbstractdxReportCellData); begin if Assigned(FOnInitializeRowValueCell) then FOnInitializeRowValueCell(Self, ARow, ACellIndex, ARecordIndex, AnItem); end; procedure TcxCustomVerticalGridReportLink.DoInitializeRowValueSeparatorCell(ARow: TcxCustomRow; ACellIndex, ARecordIndex: Integer; AnItem: TdxReportCellString); begin if Assigned(FOnInitializeRowValueSeparatorCell) then FOnInitializeRowValueSeparatorCell(Self, ARow, ACellIndex, ARecordIndex, AnItem); end; function TcxCustomVerticalGridReportLink.GetOptionsExpandingClass: TdxCustomReportLinkOptionsExpandingClass; begin Result := TcxVerticalGridReportLinkOptionsExpanding; end; function TcxCustomVerticalGridReportLink.GetOptionsFormattingClass: TdxCustomReportLinkOptionsFormattingClass; begin Result := TcxVerticalGridReportLinkOptionsFormatting; end; function TcxCustomVerticalGridReportLink.GetOptionsPaginationClass: TdxCustomReportLinkOptionsPaginationClass; begin Result := TcxVerticalGridReportLinkOptionsPagination; end; function TcxCustomVerticalGridReportLink.GetOptionsRefinementsClass: TdxCustomReportLinkOptionsRefinementsClass; begin Result := TcxVerticalGridReportLinkOptionsRefinements; end; function TcxCustomVerticalGridReportLink.GetOptionsSizeClass: TdxCustomReportLinkOptionsSizeClass; begin Result := TcxVerticalGridReportLinkOptionsSize; end; function TcxCustomVerticalGridReportLink.GetOptionsViewClass: TdxCustomReportLinkOptionsViewClass; begin Result := TcxVerticalGridReportLinkOptionsView; end; function TcxCustomVerticalGridReportLink.GetAreNativeStylesAvailable: Boolean; begin Result := OptionsFormatting.UseNativeStyles; end; function TcxCustomVerticalGridReportLink.GetStylesClass: TdxCustomReportLinkStylesClass; begin Result := TcxVerticalGridReportLinkStyles; end; function TcxCustomVerticalGridReportLink.GetStyleSheetClass: TdxCustomReportLinkStyleSheetClass; begin Result := TcxVerticalGridReportLinkStyleSheet; end; function TcxCustomVerticalGridReportLink.GetStyleSheetPrototype: TdxCustomReportLinkStyleSheet; begin Result := DefaultdxPScxVerticalGridLinkStyleSheet; end; procedure TcxCustomVerticalGridReportLink.PrepareConstruct; begin inherited; DelimitersHardVert.Clear; ReportCells.LookAndFeel := nil;//CreateGroupLookAndFeel(TdxPSReportGroupNullLookAndFeel); FHostInfo := TcxVerticalGridHostInfo.Create; FHostInfo.Initialize(ReportCells.Cells); end; procedure TcxCustomVerticalGridReportLink.UnprepareConstruct; begin FreeAndNil(FHostInfo); inherited; end; procedure TcxCustomVerticalGridReportLink.AddVerticalHardDelimiter(ADelimiter: TdxReportCell); begin AddVerticalHardDelimiter(ADelimiter.AbsoluteRect.Bottom); end; procedure TcxCustomVerticalGridReportLink.AddVerticalHardDelimiter(ADelimiter: Integer); begin FDelimitersHardVert.Add(TObject(ADelimiter)); end; function TcxCustomVerticalGridReportLink.CreateBuilder: TcxCustomVerticalGridReportLinkBuilder; begin Result := GetBuilderClass.Create(Self); end; class function TcxCustomVerticalGridReportLink.GetBuilderClass: TcxCustomVerticalGridReportLinkBuilderClass; begin Result := TcxCustomVerticalGridReportLinkBuilder; end; procedure TcxCustomVerticalGridReportLink.ExtractCustomDrawCodeDataValues(ACode: Integer; var AnAttribute: TcxVerticalGridAttributeID; var ACellIndex, ARecordIndex: Integer); begin AnAttribute := (ACode shr CodeAttributeOffset) and CodeAttributeMask; ACellIndex := (ACode shr CodeIndexOffset) and CodeIndexMask; ARecordIndex := (ACode shr CodeRecordIndexOffset) and CodeRecordIndexMask; end; function TcxCustomVerticalGridReportLink.GetItemCustomDrawInfo(AnItem: TdxReportVisualItem; out ADrawInfo: TcxVerticalGridCellCustomDrawInfo): TcxVerticalGridAttributeID; begin FillChar(ADrawInfo, SizeOf(ADrawInfo), 0); try try with ADrawInfo do begin Row := TcxCustomRow(AnItem.Parent.Data); ExtractCustomDrawCodeDataValues(AnItem.Data, AttributeID, CellIndex, RecordIndex); end; except FillChar(ADrawInfo, SizeOf(ADrawInfo), 0); end; finally Result := ADrawInfo.AttributeID; end; end; function TcxCustomVerticalGridReportLink.IsCustomDrawn(AnAttributeID: TcxVerticalGridAttributeID): Boolean; begin Result := False; case AnAttributeID of cxVerticalGridCategoryRowID: Result := Assigned(FOnCustomDrawRowHeaderCell); cxVerticalGridRowHeaderID: Result := Assigned(FOnCustomDrawRowHeaderCell); cxVerticalGridRowHeaderSeparatorID: Result := Assigned(FOnCustomDrawRowHeaderSeparatorCell); cxVerticalGridRowValueID: Result := Assigned(FOnCustomDrawRowValueCell); cxVerticalGridRowValueSeparatorID: Result := Assigned(FOnCustomDrawRowValueSeparatorCell); cxVerticalGridRowIndentID: Result := Assigned(FOnCustomDrawRowIndentCell); end; end; function TcxCustomVerticalGridReportLink.MakeCustomDrawCodeData(AnAttribute: TcxVerticalGridAttributeID; ACellIndex, ARecordIndex: Integer): Integer; begin Result := ((AnAttribute and CodeAttributeMask) shl CodeAttributeOffset) or ((ACellIndex and CodeIndexMask) shl CodeIndexOffset) or ((ARecordIndex and CodeRecordIndexMask) shl CodeRecordIndexOffset); end; procedure TcxCustomVerticalGridReportLink.InitializePrintModeControl(AControl: TComboBox); begin end; procedure TcxCustomVerticalGridReportLink.UpdateStatePrintModeControl(AControl: TComboBox); begin AControl.Enabled := False; AControl.Visible := False; end; function TcxCustomVerticalGridReportLink.GetActiveStyles: TcxVerticalGridReportLinkStyles; begin Result := inherited ActiveStyles as TcxVerticalGridReportLinkStyles; end; function TcxCustomVerticalGridReportLink.GetDesignWindow: TcxfmVerticalGridReportLinkDesignWindow; begin Result := inherited DesignWindow as TcxfmVerticalGridReportLinkDesignWindow; end; function TcxCustomVerticalGridReportLink.GetOptionsExpanding: TcxVerticalGridReportLinkOptionsExpanding; begin Result := inherited OptionsExpanding as TcxVerticalGridReportLinkOptionsExpanding; end; function TcxCustomVerticalGridReportLink.GetOptionsFormatting: TcxVerticalGridReportLinkOptionsFormatting; begin Result := inherited OptionsFormatting as TcxVerticalGridReportLinkOptionsFormatting; end; function TcxCustomVerticalGridReportLink.GetOptionsPagination: TcxVerticalGridReportLinkOptionsPagination; begin Result := inherited OptionsPagination as TcxVerticalGridReportLinkOptionsPagination; end; function TcxCustomVerticalGridReportLink.GetOptionsRefinements: TcxVerticalGridReportLinkOptionsRefinements; begin Result := inherited OptionsRefinements as TcxVerticalGridReportLinkOptionsRefinements; end; function TcxCustomVerticalGridReportLink.GetOptionsSize: TcxVerticalGridReportLinkOptionsSize; begin Result := inherited OptionsSize as TcxVerticalGridReportLinkOptionsSize; end; function TcxCustomVerticalGridReportLink.GetOptionsView: TcxVerticalGridReportLinkOptionsView; begin Result := inherited OptionsView as TcxVerticalGridReportLinkOptionsView; end; function TcxCustomVerticalGridReportLink.GetStyles: TcxVerticalGridReportLinkStyles; begin Result := inherited Styles as TcxVerticalGridReportLinkStyles; end; function TcxCustomVerticalGridReportLink.GetVerticalGrid: TcxCustomVerticalGrid; begin Result := TcxCustomVerticalGrid(Component); end; procedure TcxCustomVerticalGridReportLink.SetOnCustomDrawRowHeaderCell( Value: TcxVerticalGridReportLinkCustomDrawRowHeaderCellEvent); begin if @FOnCustomDrawRowHeaderCell <> @Value then begin FOnCustomDrawRowHeaderCell := Value; if SupportedCustomDraw then LinkModified(True); end; end; procedure TcxCustomVerticalGridReportLink.SetCategoryFont(Value: TFont); begin CategoryFont.Assign(Value); CategoryFont.Style := CategoryFont.Style + [fsBold]; end; procedure TcxCustomVerticalGridReportLink.SetOnCustomDrawRowHeaderSeparatorCell( Value: TcxVerticalGridReportLinkCustomDrawRowHeaderSeparatorCellEvent); begin if @FOnCustomDrawRowHeaderSeparatorCell <> @Value then begin FOnCustomDrawRowHeaderSeparatorCell := Value; if SupportedCustomDraw then LinkModified(True); end; end; procedure TcxCustomVerticalGridReportLink.SetOnCustomDrawRowIndentCell( Value: TcxVerticalGridReportLinkCustomDrawRowIndentCellEvent); begin if @FOnCustomDrawRowIndentCell <> @Value then begin FOnCustomDrawRowIndentCell := Value; if SupportedCustomDraw then LinkModified(True); end; end; procedure TcxCustomVerticalGridReportLink.SetOnCustomDrawRowValueCell( Value: TcxVerticalGridReportLinkCustomDrawRowValueCellEvent); begin if @FOnCustomDrawRowValueCell <> @Value then begin FOnCustomDrawRowValueCell := Value; if SupportedCustomDraw then LinkModified(True); end; end; procedure TcxCustomVerticalGridReportLink.SetOnCustomDrawRowValueSeparatorCell( Value: TcxVerticalGridReportLinkCustomDrawRowValueSeparatorCellEvent); begin if @FOnCustomDrawRowValueSeparatorCell <> @Value then begin FOnCustomDrawRowValueSeparatorCell := Value; if SupportedCustomDraw then LinkModified(True); end; end; procedure TcxCustomVerticalGridReportLink.SetOptionsExpanding(Value: TcxVerticalGridReportLinkOptionsExpanding); begin inherited OptionsExpanding := Value; end; procedure TcxCustomVerticalGridReportLink.SetOptionsFormatting(Value: TcxVerticalGridReportLinkOptionsFormatting); begin inherited OptionsFormatting := Value; end; procedure TcxCustomVerticalGridReportLink.SetOptionsPagination(Value: TcxVerticalGridReportLinkOptionsPagination); begin inherited OptionsPagination := Value; end; procedure TcxCustomVerticalGridReportLink.SetOptionsRefinements(Value: TcxVerticalGridReportLinkOptionsRefinements); begin inherited OptionsRefinements := Value; end; procedure TcxCustomVerticalGridReportLink.SetOptionsSize(Value: TcxVerticalGridReportLinkOptionsSize); begin inherited OptionsSize := Value; end; procedure TcxCustomVerticalGridReportLink.SetOptionsView(Value: TcxVerticalGridReportLinkOptionsView); begin inherited OptionsView := Value; end; procedure TcxCustomVerticalGridReportLink.SetStyles(Value: TcxVerticalGridReportLinkStyles); begin inherited Styles := Value; end; { TcxUnboundVerticalGridReportLinkBuilder } class function TcxUnboundVerticalGridReportLinkBuilder.AdapterClass: TcxCustomVerticalGridAdapterClass; begin Result := TcxUnboundVerticalGridAdapter; end; { TcxUnboundVerticalGridAdapter } function TcxUnboundVerticalGridAdapter.GetLayoutStyle: TcxvgLayoutStyle; begin Result := TcxvgLayoutStyle(UnboundVerticalGrid_GetLayoutStyle(VerticalGrid)); end; function TcxUnboundVerticalGridAdapter.GetVerticalGrid: TcxUnboundVerticalGrid; begin Result := inherited VerticalGrid as TcxUnboundVerticalGrid; end; { TcxUnboundVerticalGridReportLink } class function TcxUnboundVerticalGridReportLink.GetBuilderClass: TcxCustomVerticalGridReportLinkBuilderClass; begin Result := TcxUnboundVerticalGridReportLinkBuilder; end; { TcxVerticalGridReportLink } function TcxVerticalGridReportLink.GetVerticalGrid: TcxVerticalGrid; begin Result := TcxVerticalGrid(Component); end; { TcxRTTIInspectorReportLink } function TcxRTTIInspectorReportLink.GetRTTIInspector: TcxRTTIInspector; begin Result := TcxRTTIInspector(Component); end; { TcxVirtualVerticalGridReportLinkBuilder } class function TcxVirtualVerticalGridReportLinkBuilder.AdapterClass: TcxCustomVerticalGridAdapterClass; begin Result := TcxVirtualVerticalGridAdapter; end; class function TcxVirtualVerticalGridReportLinkBuilder.FormatterClass: TcxCustomVerticalGridReportLinkFormatterClass; begin Result := TcxVirtualVerticalGridReportLinkFormatter; end; { TcxVirtualVerticalGridAdapter } function TcxVirtualVerticalGridAdapter.GetInterRecordsSpace: Integer; begin Result := OptionsView.RecordsInterval; end; function TcxVirtualVerticalGridAdapter.GetLayoutStyle: TcxvgLayoutStyle; begin Result := VerticalGrid.LayoutStyle; end; function TcxVirtualVerticalGridAdapter.GetOptionsView: TcxvgMultiRecordsOptionsView; begin Result := inherited OptionsView as TcxvgMultiRecordsOptionsView; end; function TcxVirtualVerticalGridAdapter.GetVerticalGrid: TcxVirtualVerticalGrid; begin Result := inherited VerticalGrid as TcxVirtualVerticalGrid; end; { TcxVirtualVerticalGridReportLinkFormatter } function TcxVirtualVerticalGridReportLinkFormatter.GetFirstInternalRecordIndex: Integer; begin Result := inherited GetFirstInternalRecordIndex; if (Adapter.LayoutStyle <> lsMultiRecordView) and (InternalRecordCount = 1) and (ReportLink.OptionsView.ActualMode = vpmLoadedRecords) then Result := Adapter.FirstRecordIndex; end; function TcxVirtualVerticalGridReportLinkFormatter.GetInternalRecordCount: Integer; begin Result := inherited GetInternalRecordCount; if (Adapter.LayoutStyle <> lsMultiRecordView) and (Result <> 0) and (ReportLink.OptionsView.ActualMode = vpmLoadedRecords) then Result := 1; end; { TcxVirtualVerticalGridReportLinkOptionsView } function TcxVirtualVerticalGridReportLinkOptionsView.GetActualMode: TcxVerticalGridReportLinkPrintMode; begin Result := Mode; if ReportLink.VirtualVerticalGrid <> nil then with ReportLink.VirtualVerticalGrid do if not DataController.IsGridMode and (LayoutStyle = lsMultiRecordView) then Result := vpmAllRecords; end; function TcxVirtualVerticalGridReportLinkOptionsView.GetReportLink: TcxVirtualVerticalGridReportLink; begin Result := inherited ReportLink as TcxVirtualVerticalGridReportLink; end; { TcxVirtualVerticalGridReportLink } procedure TcxVirtualVerticalGridReportLink.InternalRestoreFromOriginal; begin inherited; if VirtualVerticalGrid <> nil then if VirtualVerticalGrid.DataController.IsGridMode then OptionsView.Mode := vpmLoadedRecords else if VirtualVerticalGrid.LayoutStyle = lsMultiRecordView then OptionsView.Mode := vpmAllRecords else OptionsView.Mode := vpmLoadedRecords; end; class function TcxVirtualVerticalGridReportLink.GetBuilderClass: TcxCustomVerticalGridReportLinkBuilderClass; begin Result := TcxVirtualVerticalGridReportLinkBuilder; end; function TcxVirtualVerticalGridReportLink.GetOptionsViewClass: TdxCustomReportLinkOptionsViewClass; begin Result := TcxVirtualVerticalGridReportLinkOptionsView; end; procedure TcxVirtualVerticalGridReportLink.InitializePrintModeControl(AControl: TComboBox); function IsModeAccepted(AMode: TcxVerticalGridReportLinkPrintMode): Boolean; begin if VirtualVerticalGrid <> nil then if VirtualVerticalGrid.DataController.IsGridMode then Result := True else if VirtualVerticalGrid.LayoutStyle = lsMultiRecordView then Result := AMode = vpmAllRecords else Result := True else Result := True; end; function PrintModeString(AMode: TcxVerticalGridReportLinkPrintMode): string; begin if (VirtualVerticalGrid = nil) or (VirtualVerticalGrid.LayoutStyle = lsMultiRecordView) then if AMode = vpmLoadedRecords then Result := cxGetResourceString(@sdxLoadedRecords) else Result := cxGetResourceString(@sdxAllRecords) else if AMode = vpmLoadedRecords then Result := cxGetResourceString(@sdxCurrentRecord) else Result := cxGetResourceString(@sdxAllRecords); end; var I: TcxVerticalGridReportLinkPrintMode; begin with AControl do begin Items.BeginUpdate; try Clear; for I := Low(TcxVerticalGridReportLinkPrintMode) to High(TcxVerticalGridReportLinkPrintMode) do if IsModeAccepted(I) then Items.AddObject(PrintModeString(I), TObject(I)); ItemIndex := Items.IndexOfObject(TObject(OptionsView.ActualMode)); finally Items.EndUpdate; end; end; end; procedure TcxVirtualVerticalGridReportLink.UpdateStatePrintModeControl(AControl: TComboBox); begin AControl.Enabled := AControl.Items.Count > 1; AControl.Visible := True; end; function TcxVirtualVerticalGridReportLink.GetOptionsView: TcxVirtualVerticalGridReportLinkOptionsView; begin Result := inherited OptionsView as TcxVirtualVerticalGridReportLinkOptionsView; end; function TcxVirtualVerticalGridReportLink.GetVirtualVerticalGrid: TcxVirtualVerticalGrid; begin Result := Component as TcxVirtualVerticalGrid; end; procedure TcxVirtualVerticalGridReportLink.SetOptionsView(Value: TcxVirtualVerticalGridReportLinkOptionsView); begin inherited OptionsView := Value; end; { TcxDBVerticalGridReportLinkBuilder } class function TcxDBVerticalGridReportLinkBuilder.FormatterClass: TcxCustomVerticalGridReportLinkFormatterClass; begin Result := TcxDBVerticalGridReportLinkFormatter; end; { TcxDBVerticalGridReportLinkFormatter } function TcxDBVerticalGridReportLinkFormatter.GetAreRecordsNeededLoading: Boolean; begin Result := DataController.IsGridMode and (OptionsView.Mode = vpmAllRecords); end; function TcxDBVerticalGridReportLinkFormatter.GetAreRecordsNeededUnloading: Boolean; begin Result := IsPrevGridMode and (OptionsView.Mode = vpmAllRecords); end; procedure TcxDBVerticalGridReportLinkFormatter.LoadRecords; begin DataController.GridMode := False; end; procedure TcxDBVerticalGridReportLinkFormatter.UnloadRecords; begin DataController.GridMode := True; end; function TcxDBVerticalGridReportLinkFormatter.GetDataController: TcxDBVerticalGridDataController; begin Result := inherited DataController as TcxDBVerticalGridDataController; end; { TcxDBVerticalGridReportLink } class function TcxDBVerticalGridReportLink.GetBuilderClass: TcxCustomVerticalGridReportLinkBuilderClass; begin Result := TcxDBVerticalGridReportLinkBuilder; end; function TcxDBVerticalGridReportLink.GetDBVerticalGrid: TcxDBVerticalGrid; begin Result := Component as TcxDBVerticalGrid; end; { TcxfmVerticalGridReportLinkDesignWindow } constructor TcxfmVerticalGridReportLinkDesignWindow.Create(AOwner: TComponent); begin HelpContext := dxPSGlbl.dxhccxVerticalGridReportLinkDesigner; inherited; CreateControls; SetActivePage; end; destructor TcxfmVerticalGridReportLinkDesignWindow.Destroy; begin dxPSPopupMan.dxPSPopupMenuController.UnregisterControl(lbxStyles); inherited; end; procedure TcxfmVerticalGridReportLinkDesignWindow.LookAndFeelChange(Sender: TObject); begin if LockControlsUpdate then Exit; with TComboBox(Sender) do ReportLink.OptionsFormatting.LookAndFeelKind := TcxLookAndFeelKind(Items.Objects[ItemIndex]); Modified := True; UpdatePreview; end; procedure TcxfmVerticalGridReportLinkDesignWindow.OptionsExpandingClick(Sender: TObject); begin with TCheckBox(Sender) do SetOptionsExpandingByIndex(TTagToInt(Tag), Checked); end; procedure TcxfmVerticalGridReportLinkDesignWindow.OptionsFormattingClick(Sender: TObject); begin with TCheckBox(Sender) do SetOptionsFormattingByIndex(TTagToInt(Tag), Checked); end; procedure TcxfmVerticalGridReportLinkDesignWindow.OptionsRefinementsClick(Sender: TObject); begin with TCheckBox(Sender) do SetOptionsRefinementsByIndex(TTagToInt(Tag), Checked); end; procedure TcxfmVerticalGridReportLinkDesignWindow.OptionsPaginationClick( Sender: TObject); begin with TCheckBox(Sender) do SetOptionsPaginationByIndex(TTagToInt(Tag), Checked); end; procedure TcxfmVerticalGridReportLinkDesignWindow.OptionsSizeClick(Sender: TObject); begin with TCheckBox(Sender) do SetOptionsSizeByIndex(TTagToInt(Tag), Checked); end; procedure TcxfmVerticalGridReportLinkDesignWindow.OptionsViewClick(Sender: TObject); begin with TCheckBox(Sender) do SetOptionsViewByIndex(TTagToInt(Tag), Checked); end; procedure TcxfmVerticalGridReportLinkDesignWindow.cbxPrintModeChange(Sender: TObject); begin if LockControlsUpdate then Exit; with TComboBox(Sender) do ReportLink.OptionsView.Mode := TcxVerticalGridReportLinkPrintMode(Items.Objects[ItemIndex]); Modified := True; end; procedure TcxfmVerticalGridReportLinkDesignWindow.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 TcxfmVerticalGridReportLinkDesignWindow.lblUseNativeStylesClick( Sender: TObject); begin if chbxUseNativeStyles.CanFocus then ActiveControl := chbxUseNativeStyles; chbxUseNativeStyles.Checked := not chbxUseNativeStyles.Checked; end; procedure TcxfmVerticalGridReportLinkDesignWindow.StyleColorClick(Sender: TObject); begin PerformStylesChangeColor; end; procedure TcxfmVerticalGridReportLinkDesignWindow.StyleFontClick(Sender: TObject); begin PerformStylesChangeFont; end; procedure TcxfmVerticalGridReportLinkDesignWindow.StyleBackgroundBitmapClick( Sender: TObject); begin PerformStylesChangeBitmap; end; procedure TcxfmVerticalGridReportLinkDesignWindow.StyleBackgroundBitmapClearClick( Sender: TObject); begin PerformStylesClearBitmap; end; procedure TcxfmVerticalGridReportLinkDesignWindow.StyleRestoreDefaultsClick( Sender: TObject); begin PerformStylesRestoreDefaults; end; procedure TcxfmVerticalGridReportLinkDesignWindow.DoInitialize; begin lbxStyles.ReportLinkStyles := ReportLink.ActiveStyles; inherited; RefreshStylesList; LoadDataIntoPreviewVerticalGrid; InitializePreviewVerticalGridStyles; (*{$IFNDEF DXVER500} {.3} chbxTransparentRichEdits.Visible := False; {$ENDIF} *) with ReportLink.OptionsView do begin chbxShowBorders.Checked := Borders; chbxShowExpandButtons.Checked := ExpandButtons; chbxShowHeaders.Checked := Headers; end; ReportLink.InitializePrintModeControl(cbxPrintMode); 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 chbxSuppressBackgroundBitmaps.Checked := SuppressBackgroundBitmaps; chbxUseNativeStyles.Checked := UseNativeStyles; end; with ReportLink.OptionsExpanding do begin chbxExpandRows.Checked := AutoExpandRows; end; with ReportLink.OptionsSize do begin chbxAutoWidth.Checked := AutoWidth; chbxBestFit.Checked := BestFit; chbxKeepSameRecordWidths.Checked := KeepSameRecordWidths; chbxWrapRecords.Checked := WrapRecords; 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.OptionsPagination do begin chbxPaginateByRows.Checked := ByRows; chbxPaginateByWrapping.Checked := ByWrapping; chbxOneWrappingPerPage.Checked := OneWrappingPerPage; end; end; {$IFDEF DELPHI7} function TcxfmVerticalGridReportLinkDesignWindow.GetPreviewHost: TCustomPanel; begin Result := pnlPreview; end; {$ENDIF} procedure TcxfmVerticalGridReportLinkDesignWindow.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); chbxShowHeaders.Caption := cxGetResourceString(@sdxHeaders); chbxShowBorders.Caption := cxGetResourceString(@sdxBorders); chbxShowExpandButtons.Caption := cxGetResourceString(@sdxExpandButtons); lblPrintMode.Caption := cxGetResourceString(@sdxMode); tshBehaviors.Caption := cxGetResourceString(@sdxBehaviorsTab); lblExpanding.Caption := cxGetResourceString(@sdxExpanding); AdjustBevelSize(bvlExpanding, lblExpanding); chbxExpandRows.Caption := cxGetResourceString(@sdxRows); lblSize.Caption := cxGetResourceString(@sdxSize); AdjustBevelSize(bvlSize, lblSize); chbxAutoWidth.Caption := cxGetResourceString(@sdxAutoWidth); chbxBestFit.Caption := cxGetResourceString(@sdxBestFit); chbxKeepSameRecordWidths.Caption := cxGetResourceString(@sdxKeepSameRecordWidths); chbxWrapRecords.Caption := cxGetResourceString(@sdxWrapRecords); 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); lblPagination.Caption := cxGetResourceString(@sdxPagination); AdjustBevelSize(bvlPagination, lblPagination); chbxPaginateByRows.Caption := cxGetResourceString(@sdxByRows); chbxPaginateByWrapping.Caption := cxGetResourceString(@sdxByWrapping); chbxOneWrappingPerPage.Caption := cxGetResourceString(@sdxOneWrappingPerPage); tshStyles.Caption := cxGetResourceString(@sdxStyles); lblStyleSheets.Caption := cxGetResourceString(@sdxStyleSheets); 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); end; procedure TcxfmVerticalGridReportLinkDesignWindow.UpdateControlsState; begin inherited; ReportLink.UpdateStatePrintModeControl(cbxPrintMode); lblPrintMode.Visible := cbxPrintMode.Visible; bvlMultipleRecords.Visible := cbxPrintMode.Visible; chbxBestFit.Enabled := not chbxAutoWidth.Checked; chbxKeepSameRecordWidths.Enabled := chbxBestFit.Enabled and chbxBestFit.Checked; chbxOneWrappingPerPage.Enabled := chbxPaginateByWrapping.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; end; procedure TcxfmVerticalGridReportLinkDesignWindow.UpdatePreview; const TransparentsMap: array[Boolean] of TcxImageTransparency = (gtOpaque, gtTransparent); begin PreviewVGrid.Enabled := False; PreviewVGrid.Font := ReportLink.Font; CustomVerticalGrid_GetCategoryFont(PreviewVGrid).Assign(ReportLink.CategoryFont); TcxImageProperties(rowPicture.Properties.EditProperties).GraphicTransparency := TransparentsMap[ReportLink.OptionsRefinements.TransparentGraphics]; PreviewVGrid.OptionsView.ShowHeaders := ReportLink.OptionsView.Headers; PreviewVGrid.OptionsView.ShowButtons := ReportLink.OptionsView.ExpandButtons; PreviewVGrid.Invalidate; end; function TcxfmVerticalGridReportLinkDesignWindow.GetDesignerTabIndex: Integer; begin Result := PageControl1.ActivePage.TabIndex; end; procedure TcxfmVerticalGridReportLinkDesignWindow.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 TcxfmVerticalGridReportLinkDesignWindow.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 TcxfmVerticalGridReportLinkDesignWindow.DoFormActivated(AnActive: Boolean); begin inherited; if not AnActive then lbxStyles.HideToolTips; end; procedure TcxfmVerticalGridReportLinkDesignWindow.DoRefreshStylesList; var Styles: TcxVerticalGridReportLinkStyles; List: TList; begin Styles := ReportLink.ActiveStyles; with lbxStyles.Items do begin BeginUpdate; try List := TList.Create; try SaveSelectedStyles(List); try Clear; AddObject(cxGetResourceString(@sdxCategoryStyle), Styles.Category); AddObject(cxGetResourceString(@sdxContentStyle), Styles.Content); AddObject(cxGetResourceString(@sdxHeaderStyle), Styles.Header); finally RestoreSelectedStyles(List); end; finally List.Free; end; finally EndUpdate; end; end; InitializePreviewVerticalGridStyles; end; procedure TcxfmVerticalGridReportLinkDesignWindow.DoStyleChanged(const ACaption: string; AStyle: TcxStyle); begin inherited; UpdatePreviewVerticalGridStyles(ACaption, AStyle); end; procedure TcxfmVerticalGridReportLinkDesignWindow.DoStylesChanged(AStrings: TStrings; ARecreate: Boolean); begin if ARecreate then RecreateStylesListBox else lbxStyles.Invalidate; Modified := True; UpdatePreview; end; procedure TcxfmVerticalGridReportLinkDesignWindow.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 TcxfmVerticalGridReportLinkDesignWindow.GetStyleSheetNames(out AStrings: TStrings); begin AStrings := cbxStyleSheets.Items; end; procedure TcxfmVerticalGridReportLinkDesignWindow.GetStyleNames(out AStrings: TStrings); begin AStrings := lbxStyles.Items; end; function TcxfmVerticalGridReportLinkDesignWindow.GetActiveStyle: TcxStyle; begin with lbxStyles do if ItemIndex <> -1 then Result := TcxStyle(Items.Objects[ItemIndex]) else Result := nil; end; function TcxfmVerticalGridReportLinkDesignWindow.GetComponent: TcxCustomVerticalGrid; begin Result := inherited Component as TcxCustomVerticalGrid; end; function TcxfmVerticalGridReportLinkDesignWindow.GetHasSelectedStyles: Boolean; begin Result := lbxStyles.SelCount <> 0; end; function TcxfmVerticalGridReportLinkDesignWindow.GetHasSelectedStylesWithAssignedBitmap: Boolean; var Styles: TStrings; I: Integer; cxStyle: TcxStyle; begin Result := True; Styles := TStringList.Create; try GetSelectedStyleNames(Styles); for I := 0 to Styles.Count - 1 do begin cxStyle := TcxStyle(Styles.Objects[I]); if (cxStyle <> nil) and (cxStyle.Bitmap <> nil) and not cxStyle.Bitmap.Empty then Exit; end; finally Styles.Free; end; Result := False; end; function TcxfmVerticalGridReportLinkDesignWindow.GetReportLink: TcxCustomVerticalGridReportLink; begin Result := inherited ReportLink as TcxCustomVerticalGridReportLink; end; function TcxfmVerticalGridReportLinkDesignWindow.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 TcxfmVerticalGridReportLinkDesignWindow.CreateControls; 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 CreateStylesListBox; end; procedure TcxfmVerticalGridReportLinkDesignWindow.CustomDrawTextRect(ACanvas: TcxCanvas; AViewInfo: TcxRowValueInfo; const AText: string); const AlignmentHorz = cxAlignLeft; AlignmentVert = cxAlignTop; var R: TRect; begin with AViewInfo do begin R := BoundsRect; if ViewParams.Bitmap = nil then begin ACanvas.Brush.Color := ViewParams.Color; ACanvas.FillRect(R); end else dxBkgnd.DrawPicture(ViewParams.Bitmap, ACanvas.Canvas, R, ppmTile, 1, 1, -R.Left, -R.Top); InflateRect(R, -2, -1); if ViewParams.Font <> nil then ACanvas.Font := ViewParams.Font; ACanvas.Font.Color := ViewParams.TextColor; ACanvas.Brush.Style := bsClear; ACanvas.DrawText(AText, R, AlignmentHorz or AlignmentVert or cxSingleLine); ACanvas.Brush.Style := bsSolid; end; end; procedure TcxfmVerticalGridReportLinkDesignWindow.InitializePreviewVerticalGridStyles; procedure ResetEvents(AStyles: TcxVerticalGridStyles); begin with AStyles do begin OnGetCategoryStyle := nil; OnGetHeaderStyle := nil; OnGetContentStyle := nil; end; end; var Styles: TcxVerticalGridReportLinkStyles; begin if ReportLink.OptionsFormatting.UseNativeStyles then begin dxPScxCommon.dxPSResetStyles(PreviewVGrid.Styles); Styles := ReportLink.ActiveStyles; with PreviewVGrid.Styles do begin Category := Styles.Category; Content := Styles.Content; Header := Styles.Header; end; end else if Component <> nil then PreviewVGrid.Styles := Component.Styles else dxPScxCommon.dxPSResetStyles(PreviewVGrid.Styles); ResetEvents(PreviewVGrid.Styles); end; procedure TcxfmVerticalGridReportLinkDesignWindow.LoadDataIntoPreviewVerticalGrid; const RowCount = 6; RowEditProperties: array[0..RowCount - 1] of TcxCustomEditPropertiesClass = (TcxTextEditProperties, TcxTextEditProperties, TcxImageProperties, TcxMemoProperties, TcxTextEditProperties, TcxMemoProperties); RowHeights: array[0..RowCount - 1] of Integer = (-1, -1, 116, 57, -1, 44); function RowCaptionString(Index: Integer): string; begin case Index of 0: Result := cxGetResourceString(@sdxCarManufacturer); 1: Result := cxGetResourceString(@sdxCarModel); 2: Result := cxGetResourceString(@sdxPicture); 3: Result := cxGetResourceString(@sdxCarEngine); 4: Result := cxGetResourceString(@sdxCarTransmission); else Result := cxGetResourceString(@sdxCarTires); end; end; function RowValueString(Index: Integer): string; begin case Index of 0: Result := cxGetResourceString(@sdx760V12Manufacturer); 1: Result := cxGetResourceString(@sdx760V12Model); 2: Result := ''; 3: Result := cxGetResourceString(@sdx760V12Engine); 4: Result := cxGetResourceString(@sdx760V12Transmission); else Result := cxGetResourceString(@sdx760V12Tires); end; end; var I: Integer; S: AnsiString; begin rowLuxurySedan.Properties.Caption := cxGetResourceString(@sdxLuxurySedans); for I := 0 to rowLuxurySedan.Count - 1 do with TcxEditorRow(rowLuxurySedan.Rows[I]) do begin Properties.Caption := DropAmpersand(RowCaptionString(I)); Properties.EditPropertiesClass := RowEditProperties[I]; if RowValueString(I) <> '' then Properties.Value := RowValueString(I); if RowHeights[I] <> -1 then Height := RowHeights[I]; end; cxImage.SavePicture(PreviewImage, S); rowPicture.Properties.Value := S; end; procedure TcxfmVerticalGridReportLinkDesignWindow.RecreateStylesListBox; var List: TList; begin List := TList.Create; try SaveSelectedStyles(List); dxPSUtl.dxRecreateWnd(lbxStyles); RestoreSelectedStyles(List); finally List.Free; end; end; procedure TcxfmVerticalGridReportLinkDesignWindow.RestoreSelectedStyles(AList: TList); var I: Integer; begin for I := 0 to AList.Count - 1 do lbxStyles.Selected[Integer(AList[I])] := True; end; procedure TcxfmVerticalGridReportLinkDesignWindow.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 TcxfmVerticalGridReportLinkDesignWindow.SetActivePage; begin PageControl1.ActivePage := PageControl1.Pages[DesignerTabIndex]; end; procedure TcxfmVerticalGridReportLinkDesignWindow.UpdatePreviewVerticalGridStyles(const ACaption: string; AStyle: TcxStyle); begin with PreviewVGrid.Styles do begin if dxPSUtl.dxSameText(ACaption, cxGetResourceString(@sdxCategoryStyle)) then Category := AStyle else if dxPSUtl.dxSameText(ACaption, cxGetResourceString(@sdxContentStyle)) then Content := AStyle else if dxPSUtl.dxSameText(ACaption, cxGetResourceString(@sdxHeaderStyle)) then Header := AStyle; end; end; procedure TcxfmVerticalGridReportLinkDesignWindow.SetOptionsExpandingByIndex(Index: Integer; Value: Boolean); begin if LockControlsUpdate then Exit; with ReportLink.OptionsExpanding do case Index of 0: AutoExpandRows := Value; end; Modified := True; end; procedure TcxfmVerticalGridReportLinkDesignWindow.SetOptionsFormattingByIndex(Index: Integer; Value: Boolean); begin if LockControlsUpdate then Exit; with ReportLink.OptionsFormatting do case Index of 0: begin UseNativeStyles := Value; InitializePreviewVerticalGridStyles; end; 1: SuppressBackgroundBitmaps := Value; end; Modified := True; UpdatePreview; end; procedure TcxfmVerticalGridReportLinkDesignWindow.SetOptionsPaginationByIndex(Index: Integer; Value: Boolean); begin if LockControlsUpdate then Exit; with ReportLink.OptionsPagination do case Index of 0: ByRows := Value; 1: ByWrapping := Value; 2: OneWrappingPerPage := Value; end; Modified := True; end; procedure TcxfmVerticalGridReportLinkDesignWindow.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 TcxfmVerticalGridReportLinkDesignWindow.SetOptionsSizeByIndex(Index: Integer; Value: Boolean); begin if LockControlsUpdate then Exit; with ReportLink.OptionsSize do case Index of 0: AutoWidth := Value; 1: BestFit := Value; 2: KeepSameRecordWidths := Value; 3: WrapRecords := Value; end; Modified := True; end; procedure TcxfmVerticalGridReportLinkDesignWindow.SetOptionsViewByIndex(Index: Integer; Value: Boolean); begin if LockControlsUpdate then Exit; with ReportLink.OptionsView do case Index of 0: Headers := Value; 1: ExpandButtons := Value; 2: Borders := Value; end; Modified := True; UpdatePreview; end; procedure TcxfmVerticalGridReportLinkDesignWindow.PreviewVGridDrawValue( Sender: TObject; ACanvas: TcxCanvas; APainter: TcxvgPainter; AValueInfo: TcxRowValueInfo; var Done: Boolean); begin if AValueInfo.Row = rowPicture then with ReportLink.OptionsRefinements do if DisplayGraphicsAsText then begin CustomDrawTextRect(ACanvas, AValueInfo, GraphicsText); Done := True; end; end; procedure TcxfmVerticalGridReportLinkDesignWindow.cbxStyleSheetsClick(Sender: TObject); begin with TComboBox(Sender) do ActiveStyleSheet := TcxCustomStyleSheet(Items.Objects[ItemIndex]); end; procedure TcxfmVerticalGridReportLinkDesignWindow.btnStyleSheetNewClick(Sender: TObject); begin PerformStyleSheetNew; end; procedure TcxfmVerticalGridReportLinkDesignWindow.btnStyleSheetCopyClick( Sender: TObject); begin PerformStyleSheetCopy; end; procedure TcxfmVerticalGridReportLinkDesignWindow.btnStyleSheetDeleteClick(Sender: TObject); begin PerformStyleSheetDelete; end; procedure TcxfmVerticalGridReportLinkDesignWindow.btnStyleSheetRenameClick(Sender: TObject); begin PerformStyleSheetRename; end; procedure TcxfmVerticalGridReportLinkDesignWindow.miStylesSelectAllClick(Sender: TObject); {$IFNDEF DELPHI6} var I: Integer; {$ENDIF} begin with lbxStyles do begin {$IFDEF DELPHI6} SelectAll; {$ELSE} Items.BeginUpdate; try for I := 0 to Items.Count - 1 do Selected[I] := True; finally Items.EndUpdate; end; {$ENDIF} end; UpdateControlsState; end; procedure TcxfmVerticalGridReportLinkDesignWindow.StylesSaveAsClick(Sender: TObject); begin PerformStylesSaveAsStyleSheet; end; procedure TcxfmVerticalGridReportLinkDesignWindow.cbxStyleSheetsKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin PerformStyleSheetKeyDown(Sender, Key, Shift); end; procedure TcxfmVerticalGridReportLinkDesignWindow.cbxStyleSheetsDrawItem( Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); begin PerformStyleSheetDrawItem(TComboBox(Control).Canvas, Index, Rect, State, Control.Enabled); end; procedure TcxfmVerticalGridReportLinkDesignWindow.lbxStylesClick(Sender: TObject); begin if not LockControlsUpdate then UpdateControlsState; end; procedure TcxfmVerticalGridReportLinkDesignWindow.PageControl1Change(Sender: TObject); begin lblPreviewWindow.Parent := TPageControl(Sender).ActivePage; end; procedure RegisterAssistants; begin TcxVerticalGridCustomRowHelper.Register; TcxVerticalGridCategoryRowHelper.Register; TcxVerticalGridCustomEditorRowHelper.Register; TcxVerticalGridEditorRowHelper.Register; TcxVerticalGridDBEditorRowHelper.Register; TcxVerticalGridCustomMultiEditorRowHelper.Register; TcxVerticalGridReportLinkStyleSheet.Register; end; procedure UnregisterAssistants; begin TcxVerticalGridReportLinkStyleSheet.Unregister; TcxVerticalGridCustomMultiEditorRowHelper.Unregister; TcxVerticalGridDBEditorRowHelper.Unregister; TcxVerticalGridEditorRowHelper.Unregister; TcxVerticalGridCustomEditorRowHelper.Unregister; TcxVerticalGridCategoryRowHelper.Unregister; TcxVerticalGridCustomRowHelper.Unregister; TcxVerticalGridRowHelperFactory.ReleaseInstance; end; procedure RegisterVGridReportLink(AReportLinkClass: TdxReportLinkClass; AVGridClass: TComponentClass); begin dxPSRegisterReportLink(AReportLinkClass, AVGridClass, TcxfmVerticalGridReportLinkDesignWindow); end; procedure UnregisterVGridReportLink(AReportLinkClass: TdxReportLinkClass; AVGridClass: TComponentClass); begin dxPSUnregisterReportLink(AReportLinkClass, AVGridClass, TcxfmVerticalGridReportLinkDesignWindow); end; initialization RegisterAssistants; RegisterVGridReportLink(TcxVerticalGridReportLink, TcxVerticalGrid); RegisterVGridReportLink(TcxRTTIInspectorReportLink, TcxRTTIInspector); RegisterVGridReportLink(TcxDBVerticalGridReportLink, TcxDBVerticalGrid); RegisterVGridReportLink(TcxVirtualVerticalGridReportLink, TcxVirtualVerticalGrid); finalization UnregisterVGridReportLink(TcxVirtualVerticalGridReportLink, TcxVirtualVerticalGrid); UnregisterVGridReportLink(TcxDBVerticalGridReportLink, TcxDBVerticalGrid); UnregisterVGridReportLink(TcxRTTIInspectorReportLink, TcxRTTIInspector); UnregisterVGridReportLink(TcxVerticalGridReportLink, TcxVerticalGrid); UnregisterAssistants; FreeAndNil(FDefaultdxPScxVerticalGridLinkStyleSheet); FreeAndNil(FBMW760Li); end.