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

17966 lines
593 KiB
ObjectPascal

{*******************************************************************}
{ }
{ Developer Express Visual Component Library }
{ ExpressPrinting System(tm) COMPONENT SUITE }
{ }
{ Copyright (C) 1998-2009 Developer Express Inc. }
{ ALL RIGHTS RESERVED }
{ }
{ The entire contents of this file is protected by U.S. and }
{ International Copyright Laws. Unauthorized reproduction, }
{ reverse-engineering, and distribution of all or any portion of }
{ the code contained in this file is strictly prohibited and may }
{ result in severe civil and criminal penalties and will be }
{ prosecuted to the maximum extent possible under the law. }
{ }
{ RESTRICTIONS }
{ }
{ THIS SOURCE CODE AND ALL RESULTING INTERMEDIATE FILES }
{ (DCU, OBJ, DLL, ETC.) ARE CONFIDENTIAL AND PROPRIETARY TRADE }
{ SECRETS OF DEVELOPER EXPRESS INC. THE REGISTERED DEVELOPER IS }
{ LICENSED TO DISTRIBUTE THE EXPRESSPRINTINGSYSTEM AND }
{ ALL ACCOMPANYING VCL CONTROLS AS PART OF AN }
{ EXECUTABLE PROGRAM ONLY }
{ }
{ THE SOURCE CODE CONTAINED WITHIN THIS FILE AND ALL RELATED }
{ FILES OR ANY PORTION OF ITS CONTENTS SHALL AT NO TIME BE }
{ COPIED, TRANSFERRED, SOLD, DISTRIBUTED, OR OTHERWISE MADE }
{ AVAILABLE TO OTHER INDIVIDUALS WITHOUT EXPRESS WRITTEN CONSENT }
{ AND PERMISSION FROM DEVELOPER EXPRESS INC. }
{ }
{ CONSULT THE END USER LICENSE AGREEMENT FOR INFORMATION ON }
{ ADDITIONAL RESTRICTIONS. }
{ }
{*******************************************************************}
unit dxPScxGridLnk;
{$I cxVer.Inc}
{$DEFINE CHARTVIEW}
interface
uses
Windows, SysUtils, Messages, Classes, Graphics, Controls, StdCtrls, ComCtrls,
ExtCtrls, ImgList, Dialogs, ExtDlgs, Menus, cxGraphics, cxClasses, cxControls,
cxCustomData, cxDataStorage, cxData, cxDBData, cxGridDBDataDefinitions, cxGrid,
cxGridCustomView, cxGridCustomTableView, cxGridTableView, cxGridDBTableView,
cxGridCardView, cxGridDBCardView, cxGridBandedTableView, cxGridDBBandedTableView,
{$IFDEF CHARTVIEW}cxGridChartView, cxGridDBChartView, {$ENDIF}
{$IFNDEF DXVER500}cxGridViewData, {$ENDIF} cxGridLevel, cxStyles, cxLookAndFeels,
cxLookAndFeelPainters, cxFilter, cxEdit, cxTextEdit, cxCheckBox, cxImage, dxBase,
dxPSSngltn, dxExtCtrls, dxPSCore, dxPrnPg, dxPScxCommon;
const
vspsGridFirst = 0;
vspsGridBandHeader = vspsGridFirst + 0;
vspsGridCaption = vspsGridFirst + 1;
vspsGridCardCaptionRow = vspsGridFirst + 2;
vspsGridCardRowCaption = vspsGridFirst + 3;
vspsGridContent = vspsGridFirst + 4;
vspsGridContentEven = vspsGridFirst + 5;
vspsGridContentOdd = vspsGridFirst + 6;
vspsGridFilterBar = vspsGridFirst + 7;
vspsGridFooter = vspsGridFirst + 8;
vspsGridGroup = vspsGridFirst + 9;
vspsGridHeader = vspsGridFirst + 10;
vspsGridPreview = vspsGridFirst + 11;
vspsGridSelection = vspsGridFirst + 12;
vspsGridLast = vspsGridFirst + 12;
vsCardShadow = vsCardViewLast + 1;
vsCardViewLast = vsCardShadow;
bbTabs = -1;
dxDefaultInterCardsSpaceHorz = 4;
dxDefaultInterCardsSpaceVert = 4;
dxDefaultCardsShadowDepth = 4;
dxDefaultCardsShadowColor = clBlack;
dxGridAttributeIDBase = 0;
dxGridUndefinedID = dxGridAttributeIDBase + 0;
dxGridBandID = dxGridAttributeIDBase + 1;
dxGridCardRowCaptionID = dxGridAttributeIDBase + 2;
dxGridCardRowDataID = dxGridAttributeIDBase + 3;
dxGridFilterBarID = dxGridAttributeIDBase + 4;
dxGridFooterID = dxGridAttributeIDBase + 5;
dxGridGroupFooterID = dxGridAttributeIDBase + 6;
dxGridHeaderID = dxGridAttributeIDBase + 7;
dxGridLevelCaptionID = dxGridAttributeIDBase + 8;
dxGridRecordID = dxGridAttributeIDBase + 9;
type
TdxGridAttributeHostInfo = class;
TdxGridAttributeHostInfoServices = class;
TdxGridReportLink = class;
TdxGridReportLinkOptionsExpanding = class;
TdxfmGridReportLinkDesignWindow = class;
TdxCustomGridViewAdapter = class;
TdxCustomGridViewFormatter = class;
TdxCustomGridViewBuilder = class;
TdxCustomGridTableViewAdapter = class;
TdxCustomGridTableViewBuilder = class;
TdxGridTableViewAdapter = class;
TdxGridTableViewFormatter = class;
TdxGridTableViewBuilder = class;
TdxGridBandedTableViewAdapter = class;
TdxGridBandedTableViewFormatter = class;
TdxGridBandedTableViewBuilder = class;
TdxGridCardViewBuilder = class;
{$IFDEF CHARTVIEW}
TdxGridChartViewBuilder = class;
{$ENDIF}
TdxGridTableViewColumnPlace = class;
TdxGridTableViewColumnPlaceController = class;
TdxCustomGridBandedTableViewItemPlace = class;
TdxGridBandedTableViewItemPlace = class;
TdxGridBandedTableViewItemPlaceController = class;
TdxGridViewRowProducerClass = class of TdxGridViewRowProducer;
TdxGridViewRowProducer = class;
TdxGridViewCaptionProducerClass = class of TdxGridViewCaptionProducer;
TdxGridViewCaptionProducer = class;
TdxGridViewFilterBarProducerClass = class of TdxGridViewFilterBarProducer;
TdxGridViewFilterBarProducer = class;
TdxGridViewDetailsSeparatorProducerClass = class of TdxGridViewDetailsSeparatorProducer;
TdxGridViewDetailsSeparatorProducer = class;
TdxGridViewTerminatorProducerClass = class of TdxGridViewTerminatorProducer;
TdxGridViewTerminatorProducer = class;
TdxGridTableViewHeadersProducerClass = class of TdxGridTableViewHeadersProducer;
TdxGridTableViewHeadersProducer = class;
TdxGridTableViewFootersProducerClass = class of TdxGridTableViewFootersProducer;
TdxGridTableViewFootersProducer = class;
TdxGridTableViewCustomDataRowProducerClass = class of TdxGridTableViewCustomDataRowProducer;
TdxGridTableViewCustomDataRowProducer = class;
TdxGridTableViewRowSeparatorProducerClass = class of TdxGridTableViewRowSeparatorProducer;
TdxGridTableViewRowSeparatorProducer = class;
TdxGridTableViewGroupFooterProducerClass = class of TdxGridTableViewGroupFooterProducer;
TdxGridTableViewGroupFooterProducer = class;
TdxGridTableViewGroupRowSeparatorProducerClass = class of TdxGridTableViewGroupRowSeparatorProducer;
TdxGridTableViewGroupRowSeparatorProducer = class;
TdxGridTableViewBandsProducerClass = class of TdxGridTableViewBandsProducer;
TdxGridTableViewBandsProducer = class;
TdxGridCardViewCardsRowProducerClass = class of TdxGridCardViewCardsRowProducer;
TdxGridCardViewCardsRowProducer = class;
{$IFDEF CHARTVIEW}
TdxGridChartViewChartProducerClass = class of TdxGridChartViewChartProducer;
TdxGridChartViewChartProducer = class;
{$ENDIF}
{ View Attributes }
TdxGridAttributeClass = class of TdxGridAttribute;
TdxGridAttributeClasses = array of TdxGridAttributeClass;
TdxGridAttribute = class end;
TdxGridBandHeader = class(TdxGridAttribute);
TdxGridCardRowCaption = class(TdxGridAttribute);
TdxGridCardRowData = class(TdxGridAttribute);
TdxGridDetails = class(TdxGridAttribute);
TdxGridExpandButton = class(TdxGridAttribute);
TdxGridFilterBar = class(TdxGridAttribute);
TdxGridFooter = class(TdxGridAttribute);
TdxGridGroupFooter = class(TdxGridAttribute);
TdxGridGroupRow = class(TdxGridAttribute);
TdxGridHeader = class(TdxGridAttribute);
TdxGridLevelCaption = class(TdxGridAttribute);
TdxGridPreview = class(TdxGridAttribute);
TdxGridAttributeID = type Integer;
TdxGridCellCustomDrawInfo = record
GridAttributeID: TdxGridAttributeID;
GridView: TcxCustomGridView;
GridRecord: TcxCustomGridRecord;
GridColumn: TcxGridColumn;
GroupLevel: Integer;
GridBand: TcxGridBand;
GridCard: TcxGridCard;
GridCardRow: TcxGridCardViewRow;
(*case Byte of
0: (GridRecord: TcxCustomGridRecord;
GridColumn: TcxGridColumn;
GroupLevel: Integer;
GridBand: TcxGridBand);
1: (GridCard: TcxGridCard;
GridCardRow: TcxGridCardViewRow); *)
end;
TdxAttributeColorKind = (ackContentColor, ackTextColor);
TdxVerticalDetailsSeparatorKind = (vdskLeading, vdskTrailing);
{ View Helpers }
TdxCustomGridViewHelperClass = class of TdxCustomGridViewHelper;
TdxCustomGridViewHelper = class(TdxCustomClassMapItem)
private
FView: TcxCustomGridView;
protected
class procedure AddAttribute(var AnAtributes: TdxGridAttributeClasses; AnAttribute: TdxGridAttributeClass);
class function FilterPosition(AView: TcxCustomGridView): TcxGridFilterPosition; virtual;
class function IsFilterBarAtBottom(AView: TcxCustomGridView): Boolean; virtual;
class function IsFilterBarAtTop(AView: TcxCustomGridView): Boolean; virtual;
class function IsOffice11StyleGrouping(AView: TcxCustomGridView): Boolean; virtual;
class function ViewClass: TcxCustomGridViewClass; virtual;
public
constructor Create(AView: TcxCustomGridView); virtual;
class function PairClass: TClass; override;
class procedure Register;
class procedure Unregister;
class function ExtractCustomDrawID(AnItem: TdxReportVisualItem): TdxGridAttributeID; virtual;
class procedure ExtractCustomDrawInfo(AnItem: TdxReportVisualItem;
out ACustomDrawInfo: TdxGridCellCustomDrawInfo); virtual;
class function ExtractGridView(AnItem: TdxReportVisualItem): TcxCustomGridView; virtual;
class function IsAttributeSupported(AnAttribute: TdxGridAttributeClass): Boolean; virtual;
class function SupportedAttributes: TdxGridAttributeClasses; virtual;
property View: TcxCustomGridView read FView write FView;
end;
TdxNullGridViewHelper = class(TdxCustomGridViewHelper)
protected
class function ViewClass: TcxCustomGridViewClass; override;
public
class function IsAttributeSupported(AnAttribute: TdxGridAttributeClass): Boolean; override;
end;
TdxCustomGridTableViewHelper = class(TdxCustomGridViewHelper)
protected
class function ExtractRecord(AnItem: TdxReportVisualItem): TcxCustomGridRecord; virtual;
{$IFDEF DXVER500}
class function FilterPosition(AView: TcxCustomGridView): TcxGridFilterPosition; override;
{$ENDIF}
class function ViewClass: TcxCustomGridViewClass; override;
public
class function ExtractCustomDrawID(AnItem: TdxReportVisualItem): TdxGridAttributeID; override;
class function SupportedAttributes: TdxGridAttributeClasses; override;
end;
TdxGridCardViewHelper = class(TdxCustomGridTableViewHelper)
protected
class function ExtractCard(AnItem: TdxReportVisualItem): TcxGridCard; virtual;
class function ExtractCardRow(AnItem: TdxReportVisualItem): TcxGridCardViewRow; virtual;
class function ExtractRecord(AnItem: TdxReportVisualItem): TcxCustomGridRecord; override;
class function ViewClass: TcxCustomGridViewClass; override;
public
class function ExtractCustomDrawID(AnItem: TdxReportVisualItem): TdxGridAttributeID; override;
class procedure ExtractCustomDrawInfo(AnItem: TdxReportVisualItem;
out ACustomDrawInfo: TdxGridCellCustomDrawInfo); override;
end;
TdxGridTableViewHelper = class(TdxCustomGridTableViewHelper)
protected
class function ExtractColumn(AnItem: TdxReportVisualItem): TcxGridColumn; virtual;
class function ExtractGroupLevel(AnItem: TdxReportVisualItem): Integer; virtual;
class function ExtractRecord(AnItem: TdxReportVisualItem): TcxCustomGridRecord; override;
class function IsOffice11StyleGrouping(AView: TcxCustomGridView): Boolean; override;
class function ViewClass: TcxCustomGridViewClass; override;
public
class function ExtractCustomDrawID(AnItem: TdxReportVisualItem): TdxGridAttributeID; override;
class procedure ExtractCustomDrawInfo(AnItem: TdxReportVisualItem;
out ACustomDrawInfo: TdxGridCellCustomDrawInfo); override;
class function SupportedAttributes: TdxGridAttributeClasses; override;
end;
TdxGridBandedTableViewHelper = class(TdxGridTableViewHelper)
protected
class function ExtractBand(AnItem: TdxReportVisualItem): TcxGridBand; virtual;
class function ViewClass: TcxCustomGridViewClass; override;
public
class function ExtractCustomDrawID(AnItem: TdxReportVisualItem): TdxGridAttributeID; override;
class procedure ExtractCustomDrawInfo(AnItem: TdxReportVisualItem;
out ACustomDrawInfo: TdxGridCellCustomDrawInfo); override;
class function SupportedAttributes: TdxGridAttributeClasses; override;
end;
{ Record Helpers }
TdxCustomGridRecordHelperClass = class of TdxCustomGridRecordHelper;
TdxCustomGridRecordHelper = class(TdxCustomClassMapItem)
private
FAdapter: TdxCustomGridTableViewAdapter;
FGridRecord: TcxCustomGridRecord;
protected
function Adapter: TdxCustomGridTableViewAdapter; overload; virtual;
class function ProducerClass: TdxGridTableViewCustomDataRowProducerClass; virtual;
class function RecordClass: TcxCustomGridRecordClass; virtual;
{$IFDEF DXVER500}
function GetCanCellMergingAsMaster: Boolean; virtual;
function GetCanCellMergingAsSlave: Boolean; virtual;
{$ENDIF}
function GetHasDetails: Boolean; virtual;
{$IFDEF DXVER500}
function GetHasExpandButton: Boolean; virtual;
{$ENDIF}
function GetHasSelectedChildren: Boolean; virtual;
{$IFDEF DXVER500}
function GetIsCellMergingSeparator: Boolean; virtual;
{$ENDIF}
function GetParent: TcxCustomGridRecord; virtual;
public
constructor Create(AAdapter: TdxCustomGridTableViewAdapter); virtual;
class function PairClass: TClass; override;
class procedure Register;
class procedure Unregister;
{$IFDEF DXVER500}
property CanCellMergingAsMaster: Boolean read GetCanCellMergingAsMaster;
property CanCellMergingAsSlave: Boolean read GetCanCellMergingAsSlave;
{$ENDIF}
property GridRecord: TcxCustomGridRecord read FGridRecord write FGridRecord;
property HasDetails: Boolean read GetHasDetails;
{$IFDEF DXVER500}
property HasExpandButton: Boolean read GetHasExpandButton;
{$ENDIF}
property HasSelectedChildren: Boolean read GetHasSelectedChildren;
{$IFDEF DXVER500}
property IsCellMergingSeparator: Boolean read GetIsCellMergingSeparator;
{$ENDIF}
property Parent: TcxCustomGridRecord read GetParent;
end;
TdxCustomGridRowHelper = class(TdxCustomGridRecordHelper)
protected
function Adapter: TdxGridTableViewAdapter; reintroduce; overload;
class function RecordClass: TcxCustomGridRecordClass; override;
end;
TdxGridDataRowHelper = class(TdxCustomGridRowHelper)
private
function GetRow: TcxGridDataRow;
protected
class function ProducerClass: TdxGridTableViewCustomDataRowProducerClass; override;
class function RecordClass: TcxCustomGridRecordClass; override;
public
property Row: TcxGridDataRow read GetRow;
end;
TdxGridGroupRowHelper = class(TdxCustomGridRowHelper)
private
function GetGroupRow: TcxGridGroupRow;
protected
class function ProducerClass: TdxGridTableViewCustomDataRowProducerClass; override;
class function RecordClass: TcxCustomGridRecordClass; override;
{$IFDEF DXVER500}
function GetCanCellMergingAsMaster: Boolean; override;
function GetCanCellMergingAsSlave: Boolean; override;
function GetHasExpandButton: Boolean; override;
{$ENDIF}
function GetHasSelectedChildren: Boolean; override;
public
property GroupRow: TcxGridGroupRow read GetGroupRow;
end;
TdxGridMasterDataRowHelper = class(TdxCustomGridRowHelper)
private
function GetDetailView: TcxCustomGridView;
function GetMasterRow: TcxGridMasterDataRow;
protected
class function ProducerClass: TdxGridTableViewCustomDataRowProducerClass; override;
class function RecordClass: TcxCustomGridRecordClass; override;
{$IFDEF DXVER500}
function GetCanCellMergingAsMaster: Boolean; override;
{$ENDIF}
function GetHasDetails: Boolean; override;
{$IFDEF DXVER500}
function GetHasExpandButton: Boolean; override;
{$ENDIF}
function GetHasSelectedChildren: Boolean; override;
{$IFDEF DXVER500}
function GetIsCellMergingSeparator: Boolean; override;
{$ENDIF}
public
property DetailView: TcxCustomGridView read GetDetailView;
property MasterRow: TcxGridMasterDataRow read GetMasterRow;
end;
{ caches }
TdxRecordHelpersCache = class(TdxCustomCache)
private
FAdapter: TdxCustomGridTableViewAdapter;
function GetHelper(ARecord: TcxCustomGridRecord): TdxCustomGridRecordHelper;
function GetItem(Index: Integer): TdxCustomGridRecordHelper;
protected
function IndexOf(ARecord: TcxCustomGridRecord): Integer;
property Items[Index: Integer]: TdxCustomGridRecordHelper read GetItem;
public
constructor Create(AAdapter: TdxCustomGridTableViewAdapter);
property Adapter: TdxCustomGridTableViewAdapter read FAdapter;
property Helpers[ARecord: TcxCustomGridRecord]: TdxCustomGridRecordHelper read GetHelper; default;
end;
TdxProducerCache = class(TdxCustomCache)
private
FBuilder: TdxCustomGridViewBuilder;
function GetItem(Index: Integer): TdxGridViewRowProducer;
function GetProducer(ProducerClass: TdxGridViewRowProducerClass): TdxGridViewRowProducer;
protected
function IndexOf(AProducerClass: TdxGridViewRowProducerClass): Integer;
property Items[Index: Integer]: TdxGridViewRowProducer read GetItem;
public
constructor Create(ABuilder: TdxCustomGridViewBuilder);
property Builder: TdxCustomGridViewBuilder read FBuilder;
property Producers[ProducerClass: TdxGridViewRowProducerClass]: TdxGridViewRowProducer read GetProducer; default;
end;
{ CustomView Adapter, Formatter and Builder }
TdxGridViewAdapterClass = class of TdxCustomGridViewAdapter;
TdxCustomGridViewAdapter = class
private
FGridView: TcxCustomGridView;
FMasterAdapter: TdxCustomGridViewAdapter;
function GetAbsoluteLevel: Integer;
function GetCanUseLookAndFeelColors: Boolean;
function GetCaptionText: string;
function GetDetailsSeparatorColor: TColor;
function GetDetailsSeparatorThickness: Integer;
function GetFilter: TcxDataFilterCriteria;
function GetFilterActive: Boolean;
function GetFilterEmpty: Boolean;
function GetFilterText: string;
function GetGrid: TcxCustomGrid;
function GetGridLevel: TcxGridLevel;
function GetGridWidth: Integer;
function GetHasDetailsSeparator: Boolean;
function GetLookAndFeelKind: TcxLookAndFeelKind;
function GetLookAndFeelPainter: TcxCustomLookAndFeelPainterClass;
function GetIsDetail: Boolean;
function GetIsMaster: Boolean;
function GetMasterGridLevel: TcxGridLevel;
function GetSummary: TcxDataSummary;
function GetThemedCaptionColor: TColor;
function GetThemedCaptionTextColor: TColor;
function GetThemedFilterBarColor: TColor;
function GetThemedFilterBarTextColor: TColor;
function GetViewWidth: Integer;
protected
procedure AfterBuilding; virtual;
procedure BeforeBuilding; virtual;
function BackgroundBitmaps: TcxCustomGridBackgroundBitmaps; overload; virtual;
function GetBackgroundBitmap(Index: Integer): TBitmap;
function HasBackgroundBitmap(Index: Integer): Boolean;
function IsBackgroundBitmapSupported(Index: Integer): Boolean; virtual;
function Controller: TcxCustomGridController; overload; virtual;
function DataController: TcxCustomDataController; overload; virtual;
function CreateCloneAdapter(AClone: TcxCustomGridView): TdxCustomGridViewAdapter;
procedure ExpandAllRowsInClones(AMasterRows, AGroupRows: Boolean); virtual;
procedure ExpandAllRowsInGridView(AGridView: TcxCustomGridView; AMasterRows, AGroupRows: Boolean);
procedure ExpandAllRowsInLevel(ALevel: TcxGridLevel; AMasterRows, AGroupRows: Boolean; ARecursive: Boolean);
procedure ExpandAllRowsInItself(AMasterRows, AGroupRows: Boolean); virtual;
function GetAreAllMasterRowsCollapsed: Boolean; virtual;
function GetAutoWidth: Boolean; virtual;
function GetCanUseOnEveryPageMode: Boolean; virtual;
{$IFDEF DXVER500}
function GetFilterPosition: TcxGridFilterPosition; virtual;
{$ENDIF}
function GetHasSelectedRecords: Boolean; virtual;
function GetIndentCount: Integer; virtual;
function GetIndentWidth: Integer; virtual;
function GetIsOffice11StyleGrouping: Boolean; virtual;
function GetMasterGridRecord: TcxCustomGridRecord; virtual;
function GetRecordCount: Integer; virtual;
function GetViewWidthExtra: Integer; virtual;
{ Styles }
function GetCaptionViewParams: TcxViewParams; virtual;
function GetFilterBarViewParams: TcxViewParams; virtual;
function GetRootCaptionParams: TcxViewParams; virtual;
property Filter: TcxDataFilterCriteria read GetFilter;
property Grid: TcxCustomGrid read GetGrid;
property LookAndFeelKind: TcxLookAndFeelKind read GetLookAndFeelKind;
property LookAndFeelPainter: TcxCustomLookAndFeelPainterClass read GetLookAndFeelPainter;
property Summary: TcxDataSummary read GetSummary;
public
constructor Create(AMasterAdapter: TdxCustomGridViewAdapter; AGridView: TcxCustomGridView); virtual;
function GridView: TcxCustomGridView; overload; virtual;
class function GridViewClass: TcxCustomGridViewClass; virtual;
function Styles: TcxCustomGridStyles; overload; virtual;
procedure ExpandAllRows(AnOptionsExpanding: TdxGridReportLinkOptionsExpanding;
ARecursive: Boolean); virtual;
property AbsoluteLevel: Integer read GetAbsoluteLevel;
property AreAllMasterRowsCollapsed: Boolean read GetAreAllMasterRowsCollapsed;
property AutoWidth: Boolean read GetAutoWidth;
property CanUseOnEveryPageMode: Boolean read GetCanUseOnEveryPageMode;
property CanUseLookAndFeelColors: Boolean read GetCanUseLookAndFeelColors;
property CaptionText: string read GetCaptionText;
property DetailsSeparatorColor: TColor read GetDetailsSeparatorColor;
property DetailsSeparatorThickness: Integer read GetDetailsSeparatorThickness;
property GridLevel: TcxGridLevel read GetGridLevel;
property GridWidth: Integer read GetGridWidth;
property FilterActive: Boolean read GetFilterActive;
property FilterEmpty: Boolean read GetFilterEmpty;
{$IFDEF DXVER500}
property FilterPosition: TcxGridFilterPosition read GetFilterPosition;
{$ENDIF}
property FilterText: string read GetFilterText;
property HasDetailsSeparator: Boolean read GetHasDetailsSeparator;
property HasSelectedRecords: Boolean read GetHasSelectedRecords;
property IndentCount: Integer read GetIndentCount;
property IndentWidth: Integer read GetIndentWidth;
property IsDetail: Boolean read GetIsDetail;
property IsMaster: Boolean read GetIsMaster;
property IsOffice11StyleGrouping: Boolean read GetIsOffice11StyleGrouping;
property MasterAdapter: TdxCustomGridViewAdapter read FMasterAdapter;
property MasterGridLevel: TcxGridLevel read GetMasterGridLevel;
property MasterGridRecord: TcxCustomGridRecord read GetMasterGridRecord;
property RecordCount: Integer read GetRecordCount;
property ThemedCaptionColor: TColor read GetThemedCaptionColor;
property ThemedCaptionTextColor: TColor read GetThemedCaptionTextColor;
property ThemedFilterBarColor: TColor read GetThemedFilterBarColor;
property ThemedFilterBarTextColor: TColor read GetThemedFilterBarTextColor;
property ViewWidth: Integer read GetViewWidth;
property ViewWidthExtra: Integer read GetViewWidthExtra;
end;
TdxGridViewFormatterClass = class of TdxCustomGridViewFormatter;
TdxCustomGridViewFormatter = class(TObject, IUnknown)
private
FBuilder: TdxCustomGridViewBuilder;
FCaptionLineHeight: Integer;
FExpandButtons: TList;
FFilterBarLineHeight: Integer;
FFont: TFont;
FLookAndFeelItems: TList;
FTransparentColor: TColor;
function GetAbsoluteLevel: Integer;
function GetAutoWidth: Boolean;
function GetDC: HDC;
function GetEdgeMode: TdxCellEdgeMode;
{$IFDEF DXVER500}
function GetFilterBarPosition: TcxGridFilterPosition;
{$ENDIF}
function GetGridWidth: Integer;
function GetExpandButton(Index: Integer): TdxReportCellExpandButton;
function GetExpandButtonCount: Integer;
function GetIndentWidth: Integer;
function GetLookAndFeelItem(Index: Integer): TdxReportVisualItem;
function GetLookAndFeelItemCount: Integer;
function GetPaginateByTopLevelGroups: Boolean;
function GetRenderer: TdxPSReportRenderer;
function GetReportLink: TdxGridReportLink;
function GetShowCaption: Boolean;
function GetShowFilterBar: Boolean;
function GetUseLookAndFeelColors: Boolean;
function GetViewAvailableWidth: Integer;
function GetViewWidthExtra: Integer;
procedure FormatLookAndFeelItems;
procedure FormatExpandButtons;
protected
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
procedure AddDelimiters; virtual;
procedure AddHorizontalDelimiters; virtual;
procedure AddVerticalDelimiters; virtual;
procedure AfterBuilding; virtual;
procedure BeforeBuilding; virtual;
procedure Calculate; virtual;
procedure CalculateLineHeights; virtual;
function GetDetailsSeparatorColor: TColor; virtual;
function GetDetailsSeparatorThickness: Integer; virtual;
function GetHasDetailsSeparator: Boolean; virtual;
function GetSiteHeight: Integer; virtual;
function GetSiteWidth: Integer; virtual;
function GetViewWidth: Integer; virtual;
function GetViewWidthExtraAfter: Integer; virtual; // MD relation considering
function GetViewWidthExtraBefore: Integer; virtual; // MD relation considering
function BackgroundBitmaps: TcxCustomGridBackgroundBitmaps; overload; virtual;
function GetBackgroundBitmap(Index: Integer): TBitmap; virtual;
function GetBackgroundBitmapIndex(Index: Integer): Integer;
function HasBackgroundBitmap(Index: Integer): Boolean; virtual;
function MapStyleBackgroundBitmapIndex(AGridBackgroundBitmapIndex: Integer): Integer; virtual;
function CalculateFontHeight(const AParams: TdxReportItemViewParams): Integer;
procedure CalculateHeight(const AParams: TdxReportItemViewParams; var AHeight: Integer);
function GetStyleFontIndex(const AParams: TdxReportItemViewParams): Integer;
function IsColorTransparent(AColor: TColor): Boolean;
procedure RegisterExpandButton(AExpandButton: TdxReportCellExpandButton);
procedure RegisterLookAndFeelItem(AnItem: TdxReportVisualItem; AEdgeStyle: TdxCellEdgeStyle);
procedure SetViewParams(AnItem: TdxReportVisualItem; const AParams: TdxReportItemViewParams);
property DC: HDC read GetDC;
property EdgeMode: TdxCellEdgeMode read GetEdgeMode;
property ExpandButtonCount: Integer read GetExpandButtonCount;
property ExpandButtons[Index: Integer]: TdxReportCellExpandButton read GetExpandButton;
property GridWidth: Integer read GetGridWidth;
property LookAndFeelItemCount: Integer read GetLookAndFeelItemCount;
property LookAndFeelItems[Index: Integer]: TdxReportVisualItem read GetLookAndFeelItem;
property PaginateByTopLevelGroups: Boolean read GetPaginateByTopLevelGroups;
property Renderer: TdxPSReportRenderer read GetRenderer;
property ReportLink: TdxGridReportLink read GetReportLink;
property SiteHeight: Integer read GetSiteHeight;
property SiteWidth: Integer read GetSiteWidth;
public
constructor Create(ABuilder: TdxCustomGridViewBuilder); virtual;
destructor Destroy; override;
function Adapter: TdxCustomGridViewAdapter; overload; virtual;
function Builder: TdxCustomGridViewBuilder; overload; virtual;
{ Host }
procedure DoInitializeHost(AHost: TdxReportCell); virtual;
function GetHostClass: TdxReportCellClass; virtual;
function GetRowHostClass: TdxReportCellClass; virtual;
{ Caption }
procedure DoInitializeCaption(ACaption: TdxReportCellText); virtual;
procedure DoInitializeCaptionRow(ARow: TdxReportCell); virtual;
procedure DoReportLinkInitializeCaption(ACaption: TdxReportCellText); virtual;
function GetCaptionClass: TdxReportCellTextClass; virtual;
function GetCaptionViewParams: TdxReportItemViewParams; virtual;
{ Filter Box }
procedure DoInitializeFilterBar(AFilterBar: TdxReportCellText); virtual;
procedure DoInitializeFilterBarRow(ARow: TdxReportCell); virtual;
procedure DoReportLinkInitializeFilterBar(AFilterBar: TdxReportCellText); virtual;
function GetFilterBarClass: TdxReportCellTextClass; virtual;
function GetFilterBarViewParams: TdxReportItemViewParams; virtual;
{ Details Separator }
procedure DoInitializeDetailsSeparatorRow(ARow: TdxReportCell); virtual;
procedure DoInitializeHorzDetailsSeparator(ASeparator: TdxReportCellBox); virtual;
procedure DoInitializeVertBottomDetailsSeparator(ASeparator: TdxReportCellBox;
ASeparatorKind: TdxVerticalDetailsSeparatorKind); virtual;
procedure DoInitializeVertDetailsSeparator(ASeparator: TdxReportCellBox;
ASeparatorKind: TdxVerticalDetailsSeparatorKind); virtual;
procedure DoInitializeVertTopDetailsSeparator(ASeparator: TdxReportCellBox;
ASeparatorKind: TdxVerticalDetailsSeparatorKind); virtual;
function GetDetailsSeparatorClass: TdxReportCellBoxClass; virtual;
{ Master Indent }
procedure DoInitializeMasterIndent(AnIndent: TdxReportCellExpandButton; AnIndex, AnIndentCount: Integer); virtual;
function GetMasterIndentClass: TdxReportCellExpandButtonClass; virtual;
{ View Terminator }
procedure DoInitializeViewTerminator(ATerminator: TdxReportCellBox); virtual;
property AbsoluteLevel: Integer read GetAbsoluteLevel;
property AutoWidth: Boolean read GetAutoWidth;
property CaptionLineHeight: Integer read FCaptionLineHeight write FCaptionLineHeight;
property DetailsSeparatorColor: TColor read GetDetailsSeparatorColor;
property DetailsSeparatorThickness: Integer read GetDetailsSeparatorThickness;
property FilterBarLineHeight: Integer read FFilterBarLineHeight write FFilterBarLineHeight;
{$IFDEF DXVER500}
property FilterBarPosition: TcxGridFilterPosition read GetFilterBarPosition;
{$ENDIF}
property HasDetailsSeparator: Boolean read GetHasDetailsSeparator;
property IndentWidth: Integer read GetIndentWidth;
property ShowCaption: Boolean read GetShowCaption;
property ShowFilterBar: Boolean read GetShowFilterBar;
property TransparentColor: TColor read FTransparentColor write FTransparentColor;
property UseLookAndFeelColors: Boolean read GetUseLookAndFeelColors;
property ViewAvailableWidth: Integer read GetViewAvailableWidth;
property ViewWidth: Integer read GetViewWidth;
property ViewWidthExtra: Integer read GetViewWidthExtra;
property ViewWidthExtraAfter: Integer read GetViewWidthExtraAfter; // MD relation considering
property ViewWidthExtraBefore: Integer read GetViewWidthExtraBefore; // MD relation considering
end;
TdxGridViewBuilderClass = class of TdxCustomGridViewBuilder;
TdxCustomGridViewBuilder = class(TdxCustomClassMapItem)
private
FAdapter: TdxCustomGridViewAdapter;
FDetailsBuilder: TdxCustomGridViewBuilder;
FFormatter: TdxCustomGridViewFormatter;
FGridView: TcxCustomGridView;
FMasterBuilder: TdxCustomGridViewBuilder;
FProducerCache: TdxProducerCache;
FReportLink: TdxGridReportLink;
FReportRows: TList;
function GetAbsoluteBuilder(AIndex: Integer): TdxCustomGridViewBuilder;
function GetAutoWidth: Boolean;
function GetGridLevel: TcxGridLevel;
function GetGrid: TcxCustomGrid;
function GetHost: TdxReportCell;
function GetHostInfoServices: TdxGridAttributeHostInfoServices;
function GetReportRow(Index: Integer): TdxReportCell;
function GetReportRowCount: Integer;
function GetRootBuilder: TdxCustomGridViewBuilder;
protected
procedure AddReportRow(ARow: TdxReportCell);
procedure AfterBuilding; virtual;
procedure BeforeBuilding; virtual;
procedure DoBuild; virtual;
procedure DoBuildViewBody; virtual;
procedure DoBuildViewFooter; virtual;
procedure DoBuildViewHeader; virtual;
function GetViewAvailableWidth: Integer; virtual;
{ Caption }
procedure CreateCaption; virtual;
function GetCaptionProducer: TdxGridViewCaptionProducer; virtual;
function GetCaptionProducerClass: TdxGridViewCaptionProducerClass; virtual;
{ Details Separator }
procedure CreateBottomDetailsSeparator; virtual;
procedure CreateTopDetailsSeparator; virtual;
function GetDetailsBottomSeparatorProducer: TdxGridViewDetailsSeparatorProducer; virtual;
function GetDetailsBottomSeparatorProducerClass: TdxGridViewDetailsSeparatorProducerClass; virtual;
function GetDetailsTopSeparatorProducer: TdxGridViewDetailsSeparatorProducer; virtual;
function GetDetailsTopSeparatorProducerClass: TdxGridViewDetailsSeparatorProducerClass; virtual;
{ Filter Box }
procedure CreateFilterBar; virtual;
function GetFilterBarProducer: TdxGridViewFilterBarProducer; virtual;
function GetFilterBarProducerClass: TdxGridViewFilterBarProducerClass; virtual;
{ View Terminator }
procedure CreateViewTerminator; virtual;
function GetViewTerminatorProducer: TdxGridViewTerminatorProducer; virtual;
function GetViewTerminatorProducerClass: TdxGridViewTerminatorProducerClass; virtual;
function GridView: TcxCustomGridView; overload; virtual;
class function GridViewClass: TcxCustomGridViewClass; virtual;
property GridLevel: TcxGridLevel read GetGridLevel;
property HostInfoServices: TdxGridAttributeHostInfoServices read GetHostInfoServices;
property ProducerCache: TdxProducerCache read FProducerCache;
property ReportLink: TdxGridReportLink read FReportLink;
public
constructor Create(AReportLink: TdxGridReportLink; AMasterBuilder: TdxCustomGridViewBuilder;
AGridView: TcxCustomGridView); virtual;
destructor Destroy; override;
function Adapter: TdxCustomGridViewAdapter; overload; virtual;
class function AdapterClass: TdxGridViewAdapterClass; virtual;
class function CreateAdapter(AMasterAdapter: TdxCustomGridViewAdapter;
AGridView: TcxCustomGridView): TdxCustomGridViewAdapter; virtual;
function Formatter: TdxCustomGridViewFormatter; overload; virtual;
class function FormatterClass: TdxGridViewFormatterClass; virtual;
procedure Build;
function IsAborted: Boolean;
procedure Progress(const APercentDone: Double);
class function PairClass: TClass; override;
class procedure Register;
class procedure Unregister;
property AbsoluteBuilders[Index: Integer]: TdxCustomGridViewBuilder read GetAbsoluteBuilder;
property AutoWidth: Boolean read GetAutoWidth;
property DetailsBuilder: TdxCustomGridViewBuilder read FDetailsBuilder;
property Grid: TcxCustomGrid read GetGrid;
property Host: TdxReportCell read GetHost;
property MasterBuilder: TdxCustomGridViewBuilder read FMasterBuilder;
property ReportRowCount: Integer read GetReportRowCount;
property ReportRows[Index: Integer]: TdxReportCell read GetReportRow;
property RootBuilder: TdxCustomGridViewBuilder read GetRootBuilder;
property ViewAvailableWidth: Integer read GetViewAvailableWidth;
end;
{ CustomTableView Adapter and Formatter }
TdxGridTableAdapterForEachRecordProc = procedure(ARecord: TcxCustomGridRecord;
AData: Integer; var AContinue: Boolean) of object;
TdxCustomGridTableViewAdapter = class(TdxCustomGridViewAdapter)
private
FDetailsLineCount: Integer;
FRecordHelpersCache: TdxRecordHelpersCache;
function GetCellEndEllipsis: Boolean;
function GetDetailsLineCount: Integer;
function GetFiltering: TcxCustomGridTableFiltering;
function GetIsGridMode: Boolean;
function GetRecord(Index: Integer): TcxCustomGridRecord;
function GetRecordHelper(ARecord: TcxCustomGridRecord): TdxCustomGridRecordHelper;
function GetSelectedRecord(Index: Integer): TcxCustomGridRecord;
function GetSelectedRecordCount: Integer;
protected
function CalculateDetailsLineCount: Integer; virtual;
function GetContentViewParams(ARecord: TcxCustomGridRecord;
ATableItem: TcxCustomGridTableItem): TcxViewParams; virtual;
function GetPreviewViewParams(ARecord: TcxCustomGridRecord;
ATableItem: TcxCustomGridTableItem): TcxViewParams; virtual;
function GetSelectionViewParams: TcxViewParams; virtual;
function HasSelectionStyle: Boolean;
function Controller: TcxCustomGridTableController; reintroduce; overload;
procedure DoExpandMasterRow(ARecord: TcxCustomGridRecord; AData: Integer;
var AContinue: Boolean);
procedure ExpandAllGroupRows; virtual;
procedure ExpandAllMasterRows(AnExpandGroups: Boolean); virtual;
procedure ExpandAllRowsInItself(AMasterRows, AGroupRows: Boolean); override;
function GetAreAllMasterRowsCollapsed: Boolean; override;
function GetCanUseOnEveryPageMode: Boolean; override;
function GetCellAutoHeight: Boolean; virtual;
function GetCellMultiline: Boolean; virtual;
{$IFDEF DXVER500}
function GetFilterPosition: TcxGridFilterPosition; override;
{$ENDIF}
function GetGridLineColor: TColor; virtual;
function GetHasSelectedRecords: Boolean; override;
function GetMasterGridRecord: TcxCustomGridRecord; override;
function GetRecordCount: Integer; override;
procedure IsMasterRowCollapsed(ARecord: TcxCustomGridRecord; AData: Integer;
var AContinue: Boolean);
class function GetProperties(AnItem: TcxCustomGridTableItem;
ARecord: TcxCustomGridRecord): TcxCustomEditProperties; virtual;
class function GetPropertiesClass(AnItem: TcxCustomGridTableItem;
ARecord: TcxCustomGridRecord): TcxCustomEditPropertiesClass; virtual;
class function GetRepositoryItem(AnItem: TcxCustomGridTableItem;
ARecord: TcxCustomGridRecord): TcxEditRepositoryItem; virtual;
property RecordHelpersCache: TdxRecordHelpersCache read FRecordHelpersCache;
public
constructor Create(AMasterAdapter: TdxCustomGridViewAdapter; AGridView: TcxCustomGridView); override;
destructor Destroy; override;
function ForEachRecord(AProc: TdxGridTableAdapterForEachRecordProc; AData: Integer;
AProcessSelection: Boolean): Boolean;
function GridView: TcxCustomGridTableView; reintroduce; overload;
class function GridViewClass: TcxCustomGridViewClass; override;
function Styles: TcxCustomGridTableViewStyles; reintroduce; overload;
property CellAutoHeight: Boolean read GetCellAutoHeight;
property CellEndEllipsis: Boolean read GetCellEndEllipsis;
property CellMultiline: Boolean read GetCellMultiline;
property DetailsLineCount: Integer read GetDetailsLineCount write FDetailsLineCount;
property Filtering: TcxCustomGridTableFiltering read GetFiltering;
property GridLineColor: TColor read GetGridLineColor;
property IsGridMode: Boolean read GetIsGridMode;
property RecordHelpers[Row: TcxCustomGridRecord]: TdxCustomGridRecordHelper read GetRecordHelper;
property Records[Index: Integer]: TcxCustomGridRecord read GetRecord;
property SelectedRecordCount: Integer read GetSelectedRecordCount;
property SelectedRecords[Index: Integer]: TcxCustomGridRecord read GetSelectedRecord;
end;
TdxCustomGridTableViewFormatter = class(TdxCustomGridViewFormatter, IdxPSCellParams, IdxPSCellParams2)
private
FRecordIndexes: TList;
FSelectedRecordList: TList;
function GetGridLineColor: TColor;
function GetRecord(Index: Integer): TcxCustomGridRecord;
function GetRecordCount: Integer;
function GetRecordIndex(ARecord: TcxCustomGridRecord): Integer;
function GetSelectedRecord(Index: Integer): TcxCustomGridRecord;
function GetSelectedRecordCount: Integer;
protected
{ 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 AfterBuilding; override;
procedure BeforeBuilding; override;
procedure BuildSelectedRecordList; virtual;
function CanProcessSelectionStyle(ARecord: TcxCustomGridRecord): Boolean;
function IsSelectedRecord(ARecord: TcxCustomGridRecord): Boolean; virtual;
function GetContentBackgroundBitmapStyleIndex(ATableItem: TcxCustomGridTableItem): Integer; virtual;
function MapStyleBackgroundBitmapIndex(AGridBackgroundBitmapIndex: Integer): Integer; override;
property SelectedRecordList: TList read FSelectedRecordList;
public
constructor Create(ABuilder: TdxCustomGridViewBuilder); override;
destructor Destroy; override;
function Adapter: TdxCustomGridTableViewAdapter; reintroduce; overload;
function Builder: TdxCustomGridTableViewBuilder; reintroduce; overload;
function IndexOfRecord(ARecord: TcxCustomGridRecord): Integer;
{ Items }
procedure CheckDisplayValuePost(AProperties: TcxCustomEditProperties;
ATableItem: TcxCustomGridTableItem; ARecord: TcxCustomGridRecord; AnItem: TAbstractdxReportCellData);
procedure DoInitializeItem(AnItem: TAbstractdxReportCellData; ATableItem: TcxCustomGridTableItem;
ARecord: TcxCustomGridRecord; AnIsPreview: Boolean = False); virtual;
function GetItemClass(ATableItem: TcxCustomGridTableItem;
ARecord: TcxCustomGridRecord; AnIsPreview: Boolean = False): TdxReportCellDataClass; virtual;
function GetItemProperties(ATableItem: TcxCustomGridTableItem;
ARecord: TcxCustomGridRecord): TcxCustomEditProperties; virtual;
function GetItemValue(AProperties: TcxCustomEditProperties; ATableItem: TcxCustomGridTableItem;
ARecord: TcxCustomGridRecord): TcxEditValue; virtual;
function GetItemViewParams(ATableItem: TcxCustomGridTableItem;
ARecord: TcxCustomGridRecord; AnIsPreview: Boolean = False): TdxReportItemViewParams; virtual;
property GridLineColor: TColor read GetGridLineColor;
property RecordCount: Integer read GetRecordCount;
property RecordIndexes[ARecord: TcxCustomGridRecord]: Integer read GetRecordIndex;
property Records[Index: Integer]: TcxCustomGridRecord read GetRecord;
property SelectedRecordCount: Integer read GetSelectedRecordCount;
property SelectedRecords[Index: Integer]: TcxCustomGridRecord read GetSelectedRecord;
end;
TdxCustomGridTableViewBuilder = class(TdxCustomGridViewBuilder)
protected
procedure DoBuildViewFooter; override;
procedure DoBuildViewHeader; override;
procedure DoGetCellHeight(ARecord: TcxCustomGridRecord; ATableItem: TcxCustomGridTableItem;
var AHeight: Integer);
function GridView: TcxCustomGridTableView; reintroduce; overload;
class function GridViewClass: TcxCustomGridViewClass; override;
public
function Adapter: TdxCustomGridTableViewAdapter; reintroduce; overload;
class function AdapterClass: TdxGridViewAdapterClass; override;
function Formatter: TdxCustomGridTableViewFormatter; reintroduce; overload;
class function FormatterClass: TdxGridViewFormatterClass; override;
end;
{ GridTableView Adapter, Formatter and Builder }
TdxGridTableViewAdapter = class(TdxCustomGridTableViewAdapter)
private
function GetColumn(Index: Integer): TcxGridColumn;
function GetColumnCount: Integer;
function GetExpandButtonColor: TColor;
function GetExpandButtonSize: Integer;
function GetFooterItemText(Index: Integer): string;
function GetFooterMultiline: Boolean;
function GetGridLines: TcxGridLines;
function GetGroupedColumn(Index: Integer): TcxGridColumn;
function GetGroupedColumnCount: Integer;
function GetGroupFootersMode: TcxGridGroupFootersMode;
function GetGroupFootersMultiline: Boolean;
function GetGroupRowSeparatorColor: TColor;
function GetGroupRowSeparatorThickness: Integer;
function GetHasFooterItem(Index: Integer): Boolean;
function GetHasPreview: Boolean;
function GetHasRowSeparators: Boolean;
function GetHeaderEndEllipsis: Boolean;
function GetInternalColumnMinWidth(Column: TcxGridColumn): Integer;
function GetInternalColumnWidth(Column: TcxGridColumn): Integer;
function GetPreviewColumn: TcxGridColumn;
function GetPreviewLeftIndent: Integer;
function GetPreviewPlace: TcxGridPreviewPlace;
function GetPreviewRightIndent: Integer;
function GetRow(Index: Integer): TcxCustomGridRow;
function GetRowCount: Integer;
function GetRowSeparatorColor: TColor;
function GetRowSeparatorThickness: Integer;
function GetShowExpandButtonsForEmptyDetails: Boolean;
function GetShowHorzGridLines: Boolean;
function GetShowVertGridLines: Boolean;
function GetThemedFooterItemColor: TColor;
function GetThemedFooterItemTextColor: TColor;
function GetThemedHeaderItemColor: TColor;
function GetThemedHeaderItemTextColor: TColor;
protected
function Controller: TcxGridTableController; reintroduce; overload;
function DataController: TcxGridDataController; reintroduce; overload;
function GetAutoWidth: Boolean; override;
function GetCellAutoHeight: Boolean; override;
function GetCellMultiline: Boolean; override;
function GetGridLineColor: TColor; override;
function GetHeaderAutoHeight: Boolean; virtual;
function GetHeaderMultiline(Column: TcxGridColumn): Boolean; virtual;
function GetIndentCount: Integer; override;
function GetIndentWidth: Integer; override;
function GetIndicatorWidth: Integer; virtual;
function GetIsOffice11StyleGrouping: Boolean; override;
function GetViewWidthExtra: Integer; override;
function GetDataRowHeight: Integer; virtual;
function GetDataRowHeightAssigned: Boolean; virtual;
function GetFooterHeight: Integer; virtual;
function GetFooterHeightAssigned: Boolean; virtual;
function GetGroupFooterHeight: Integer; virtual;
function GetGroupFooterHeightAssigned: Boolean; virtual;
function GetGroupRowHeight: Integer; virtual;
function GetGroupRowHeightAssigned: Boolean; virtual;
function GetHeaderHeight: Integer; virtual;
function GetHeaderHeightAssigned: Boolean; virtual;
{ Styles }
function GetFilterBarViewParams: TcxViewParams; override;
function GetFooterViewParams(ARecord: TcxCustomGridRecord;
AGroupLevel: Integer; AColumn: TcxGridColumn): TcxViewParams; virtual;
function GetGroupRowViewParams(ARecord: TcxCustomGridRecord;
AGroupLevel: Integer): TcxViewParams; virtual;
function GetHeaderViewParams(AColumn: TcxGridColumn): TcxViewParams; virtual;
function GetPreviewViewParams(ARecord: TcxCustomGridRecord;
AnItem: TcxCustomGridTableItem): TcxViewParams; override;
property InternalColumnMinWidths[Column: TcxGridColumn]: Integer read GetInternalColumnMinWidth;
property InternalColumnWidths[Column: TcxGridColumn]: Integer read GetInternalColumnWidth;
public
constructor Create(AMasterAdapter: TdxCustomGridViewAdapter; AGridView: TcxCustomGridView); override;
function GridView: TcxGridTableView; reintroduce; overload;
class function GridViewClass: TcxCustomGridViewClass; override;
function Styles: TcxGridTableViewStyles; reintroduce; overload;
function HasDetails(AGridRow: TcxCustomGridRow): Boolean;
function GetGroupFooterCount(AGridRow: TcxCustomGridRow): Integer;
function GetGroupFooterItemText(ARowIndex, ALevel, AIndex: Integer): string;
function HasGroupFooter(AGridRow: TcxCustomGridRow; ALevel: Integer): Boolean;
function HasGroupFooterItem(ALevel, AIndex: Integer): Boolean;
function HasGroupFooters(AGridRow: TcxCustomGridRow): Boolean;
property ColumnCount: Integer read GetColumnCount;
property Columns[Index: Integer]: TcxGridColumn read GetColumn;
property DataRowHeight: Integer read GetDataRowHeight;
property DataRowHeightAssigned: Boolean read GetDataRowHeightAssigned;
property ExpandButtonColor: TColor read GetExpandButtonColor;
property ExpandButtonSize: Integer read GetExpandButtonSize;
property FooterHeight: Integer read GetFooterHeight;
property FooterHeightAssigned: Boolean read GetFooterHeightAssigned;
property FooterItemTexts[Index: Integer]: string read GetFooterItemText;
property FooterMultiline: Boolean read GetFooterMultiline;
property GridLines: TcxGridLines read GetGridLines;
property GroupedColumnCount: Integer read GetGroupedColumnCount;
property GroupedColumns[Index: Integer]: TcxGridColumn read GetGroupedColumn;
property GroupFooterHeight: Integer read GetGroupFooterHeight;
property GroupFooterHeightAssigned: Boolean read GetGroupFooterHeightAssigned;
property GroupFootersMode: TcxGridGroupFootersMode read GetGroupFootersMode;
property GroupFootersMultiline: Boolean read GetGroupFootersMultiline;
property GroupRowHeight: Integer read GetGroupRowHeight;
property GroupRowHeightAssigned: Boolean read GetGroupRowHeightAssigned;
property GroupRowSeparatorColor: TColor read GetGroupRowSeparatorColor;
property GroupRowSeparatorThickness: Integer read GetGroupRowSeparatorThickness;
property HasFooterItem[Index: Integer]: Boolean read GetHasFooterItem;
property HasPreview: Boolean read GetHasPreview;
property HasRowSeparators: Boolean read GetHasRowSeparators;
property HeaderAutoHeight: Boolean read GetHeaderAutoHeight;
property HeaderEndEllipsis: Boolean read GetHeaderEndEllipsis;
property HeaderHeight: Integer read GetHeaderHeight;
property HeaderHeightAssigned: Boolean read GetHeaderHeightAssigned;
property HeaderMultilines[Column: TcxGridColumn]: Boolean read GetHeaderMultiline;
property IndicatorWidth: Integer read GetIndicatorWidth;
property PreviewColumn: TcxGridColumn read GetPreviewColumn;
property PreviewLeftIndent: Integer read GetPreviewLeftIndent;
property PreviewPlace: TcxGridPreviewPlace read GetPreviewPlace;
property PreviewRightIndent: Integer read GetPreviewRightIndent;
property RowCount: Integer read GetRowCount;
property Rows[Index: Integer]: TcxCustomGridRow read GetRow;
property RowSeparatorColor: TColor read GetRowSeparatorColor;
property RowSeparatorThickness: Integer read GetRowSeparatorThickness;
property ShowExpandButtonsForEmptyDetails: Boolean read GetShowExpandButtonsForEmptyDetails;
property ShowHorzGridLines: Boolean read GetShowHorzGridLines;
property ShowVertGridLines: Boolean read GetShowVertGridLines;
property ThemedFooterItemColor: TColor read GetThemedFooterItemColor;
property ThemedFooterItemTextColor: TColor read GetThemedFooterItemTextColor;
property ThemedHeaderItemColor: TColor read GetThemedHeaderItemColor;
property ThemedHeaderItemTextColor: TColor read GetThemedHeaderItemTextColor;
end;
TdxCustomGridTableViewItemPlaceControllerClass = class of TdxCustomGridTableViewItemPlaceController;
TdxCustomGridTableViewItemPlaceController = class
private
FFormatter: TdxGridTableViewFormatter;
FHeaderLineCount: Integer;
FWidth: Integer;
function GetHeaderLineCount: Integer;
function GetWidth: Integer;
procedure SetWidth(Value: Integer);
protected
function CalculateWidth: Integer; virtual;
function CalculateHeaderLineCount: Integer; virtual;
function GetItemByColumn(Column: TcxGridColumn): TdxGridTableViewColumnPlace; virtual;
procedure WidthChanged; virtual;
public
constructor Create(AFormatter: TdxGridTableViewFormatter); virtual;
procedure Calculate; virtual;
procedure Refresh; virtual;
property Formatter: TdxGridTableViewFormatter read FFormatter;
property HeaderLineCount: Integer read GetHeaderLineCount;
property ItemsByColumn[Column: TcxGridColumn]: TdxGridTableViewColumnPlace read GetItemByColumn; default;
property Width: Integer read GetWidth write SetWidth;
end;
TdxGridTableViewColumnPlaceClass = class of TdxGridTableViewColumnPlace;
TdxGridTableViewColumnPlace = class
private
FColumn: TcxGridColumn;
FController: TdxGridTableViewColumnPlaceController;
FLeftBound: Integer;
FWidth: Integer;
function GetAdapter: TdxGridTableViewAdapter;
function GetCellBounds(RowIndex: Integer): TRect;
function GetCellHeight(RowIndex: Integer): Integer;
function GetFooterCellBounds: TRect;
function GetFooterLineHeight: Integer;
function GetFormatter: TdxGridTableViewFormatter;
function GetGroupFooterCellBounds(IndentCount: Integer): TRect;
function GetGroupFooterLineHeight: Integer;
function GetHeaderCellBounds: TRect;
function GetHeaderLineHeight: Integer;
function GetIndex: Integer;
function GetIsFixed: Boolean;
function GetLeftBound: Integer;
function GetMinWidth: Integer;
function GetOriginalWidth: Integer;
function GetWidth: Integer;
protected
function CalculateLeftBound: Integer; virtual;
function GetLineCount: Integer; virtual;
function GetRowIndex: Integer; virtual;
procedure InitAutoWidthItem(AnItem: TcxAutoWidthItem); virtual;
property Adapter: TdxGridTableViewAdapter read GetAdapter;
property Formatter: TdxGridTableViewFormatter read GetFormatter;
property IsFixed: Boolean read GetIsFixed;
property LineCount: Integer read GetLineCount;
property MinWidth: Integer read GetMinWidth;
property OriginalWidth: Integer read GetOriginalWidth;
property RowIndex: Integer read GetRowIndex;
public
constructor Create(AController: TdxGridTableViewColumnPlaceController; AColumn: TcxGridColumn); virtual;
procedure Calculate(ALeftBound: Integer); virtual;
property CellBounds[RowIndex: Integer]: TRect read GetCellBounds;
property CellHeights[RowIndex: Integer]: Integer read GetCellHeight;
property Column: TcxGridColumn read FColumn;
property Controller: TdxGridTableViewColumnPlaceController read FController;
property FooterCellBounds: TRect read GetFooterCellBounds;
property FooterLineHeight: Integer read GetFooterLineHeight;
property GroupFooterCellBounds[IndentCount: Integer]: TRect read GetGroupFooterCellBounds;
property GroupFooterLineHeight: Integer read GetGroupFooterLineHeight;
property HeaderCellBounds: TRect read GetHeaderCellBounds;
property HeaderLineHeight: Integer read GetHeaderLineHeight;
property Index: Integer read GetIndex;
property LeftBound: Integer read GetLeftBound write FLeftBound;
property Width: Integer read GetWidth write FWidth;
end;
TdxGridTableViewColumnPlaceController = class(TdxCustomGridTableViewItemPlaceController)
private
FColumnIndexes: TList;
FItems: TList;
function GetAdapter: TdxGridTableViewAdapter;
function GetColumnIndex(Column: TcxGridColumn): Integer;
function GetItem(Index: Integer): TdxGridTableViewColumnPlace;
function GetItemCount: Integer;
procedure FreeAndNilItems;
protected
function CalculateWidth: Integer; override;
function GetItemByColumn(Column: TcxGridColumn): TdxGridTableViewColumnPlace; override;
procedure AddItems; virtual;
procedure ClearItems;
function CreateItem(AColumn: TcxGridColumn): TdxGridTableViewColumnPlace; virtual;
function GetItemClass(AColumn: TcxGridColumn): TdxGridTableViewColumnPlaceClass; virtual;
function CalculateItemLeftBound(AnItem: TdxGridTableViewColumnPlace): Integer; virtual;
procedure CalculateItemsWidth; virtual;
function GetItemsAutoWidth: Boolean; virtual;
function GetItemsAvailableWidth: Integer; virtual;
property Adapter: TdxGridTableViewAdapter read GetAdapter;
property ItemsAutoWidth: Boolean read GetItemsAutoWidth;
property ItemsAvailableWidth: Integer read GetItemsAvailableWidth;
public
constructor Create(AFormatter: TdxGridTableViewFormatter); override;
destructor Destroy; override;
procedure Calculate; override;
procedure Refresh; override;
function IndexOf(AnItem: TdxGridTableViewColumnPlace): Integer; overload;
function IndexOf(AColumn: TcxGridColumn): Integer; overload;
property ColumnIndexes[Column: TcxGridColumn]: Integer read GetColumnIndex;
property ItemCount: Integer read GetItemCount;
property Items[Index: Integer]: TdxGridTableViewColumnPlace read GetItem; default;
end;
TdxGridTableViewReportDataAdapter = class
private
FBuilder: TdxCustomGridViewBuilder;
function GetReportItem(Row: TcxCustomGridRow; Column: TcxGridColumn): TdxReportVisualItem;
function GetReportRow(Index: Integer): TdxReportCell;
function GetReportRowByGridRow(Row: TcxCustomGridRow): TdxReportCell;
function GetReportRowCount: Integer;
public
constructor Create(ABuilder: TdxCustomGridViewBuilder); virtual;
property Builder: TdxCustomGridViewBuilder read FBuilder;
property ReportItems[Row: TcxCustomGridRow; Column: TcxGridColumn]: TdxReportVisualItem read GetReportItem;
property ReportRowCount: Integer read GetReportRowCount;
property ReportRows[Index: Integer]: TdxReportCell read GetReportRow; default;
property ReportRowsByGridRow[Row: TcxCustomGridRow]: TdxReportCell read GetReportRowByGridRow;
end;
TdxGridTableViewFormatter = class(TdxCustomGridTableViewFormatter)
private
FColumns: TList;
FDetailsLineHeight: Integer;
FFooterLineHeight: Integer;
FGroupFooterLineHeight: Integer;
FGroupRowLineHeight: Integer;
FHeaderLineHeight: Integer;
FItemPlaceController: TdxCustomGridTableViewItemPlaceController;
FPreviewLineHeight: Integer;
FReportDataAdapter: TdxGridTableViewReportDataAdapter;
FRowHeights: TList;
function GetColumn(Index: Integer): TcxGridColumn;
function GetColumnCount: Integer;
function GetGroupRowSeparatorColor: TColor;
function GetGroupRowSeparatorThickness: Integer;
function GetHasPreview: Boolean;
function GetHeaderLineCount: Integer;
function GetPreviewAutoHeight: Boolean;
function GetPreviewColumn: TcxGridColumn;
function GetPreviewMaxLineCount: Integer;
function GetRow(Index: Integer): TcxCustomGridRow;
function GetRowCount: Integer;
function GetRowHeight(Index: Integer): Integer;
function GetRowHeightByRow(Row: TcxCustomGridRow): Integer;
function GetRowSeparatorColor: TColor;
function GetRowSeparatorThickness: Integer;
function GetShowGroupFooters: Boolean;
function GetShowFooters: Boolean;
function GetShowHeaders: Boolean;
function GetShowPreview: Boolean;
procedure SetRowHeight(Index: Integer; Value: Integer);
procedure SetRowHeightByRow(Row: TcxCustomGridRow; Value: Integer);
protected
{ IdxPSCellParams2 }
function IdxPSCellParams2_GetPreviewMarginLeft: Integer; override;
function IdxPSCellParams2_GetPreviewMarginRight: Integer; override;
function IdxPSCellParams2_GetPreviewMaxHeight: Integer; override;
function IdxPSCellParams2_GetPreviewMaxLineCount: Integer; override;
procedure AddHorizontalDelimiters; override;
{$IFDEF DXVER500}
procedure AfterBuilding; override;
{$ENDIF}
procedure BeforeBuilding; override;
procedure Calculate; override;
procedure CalculateDataRowHeights; virtual;
procedure CalculateLineHeights; override;
function GetItemPlaceControllerClass: TdxCustomGridTableViewItemPlaceControllerClass; virtual;
function MapStyleBackgroundBitmapIndex(AGridBackgroundBitmapIndex: Integer): Integer; override;
{$IFDEF DXVER500}
function CanCellMerging: Boolean; virtual;
function CanColumnCellMerging(AColumn: TcxGridColumn): Boolean; virtual;
procedure PerformCellMerging; virtual;
procedure PerformColumnCellMerging(AColumn: TcxGridColumn); virtual;
{$ENDIF}
// actual columns used inside building (depends on ActualVisibility of columns and selection status)
procedure BuildColumnList; virtual;
procedure BuildItemLists; virtual;
function IsColumnActuallyVisible(AColumn: TcxGridColumn): Boolean; virtual;
function GetViewWidth: Integer; override;
property ItemPlaceController: TdxCustomGridTableViewItemPlaceController read FItemPlaceController;
property ReportDataAdapter: TdxGridTableViewReportDataAdapter read FReportDataAdapter;
public
constructor Create(ABuilder: TdxCustomGridViewBuilder); override;
destructor Destroy; override;
function Adapter: TdxGridTableViewAdapter; reintroduce; overload;
function Builder: TdxGridTableViewBuilder; reintroduce; overload;
{ Footers }
procedure DoInitializeFooterItem(AnItem: TAbstractdxReportCellData; AnIndex: Integer); virtual;
procedure DoInitializeFooterRow(ARow: TdxReportCell); virtual;
procedure DoReportLinkInitializeFooterItem(AnItem: TAbstractdxReportCellData; AnIndex: Integer); virtual;
function GetFooterItemBounds(AnIndex: Integer): TRect; virtual;
function GetFooterItemClass(AnIndex: Integer): TdxReportCellTextClass; virtual;
function GetFooterItemViewParams(AColumn: TcxGridColumn): TdxReportItemViewParams; virtual;
{ Group Footers }
procedure DoInitializeGroupFooterHost(AnItem: TdxReportVisualItem; ARecord: TcxCustomGridRecord; AGroupLevel: Integer); virtual;
procedure DoInitializeGroupFooterItem(AnItem: TAbstractdxReportCellData;
AnIndex: Integer; ARecord: TcxCustomGridRecord; AGroupLevel: Integer); virtual;
procedure DoInitializeGroupFooterRow(ARow: TdxReportCell;
ARecord: TcxCustomGridRecord; AGroupLevel: Integer); virtual;
procedure DoReportLinkInitializeGroupFooterItem(AnItem: TAbstractdxReportCellData;
AnIndex: Integer; ARecord: TcxCustomGridRecord; AGroupLevel: Integer); virtual;
function GetGroupFooterItemClass(AnIndex: Integer): TdxReportCellTextClass; virtual;
function GetGroupFooterItemBounds(AnIndex, AGroupLevel: Integer): TRect; virtual;
function GetGroupFooterItemViewParams(ARecord: TcxCustomGridRecord; AGroupLevel: Integer;
AColumn: TcxGridColumn): TdxReportItemViewParams; virtual;
{ Group Row }
procedure DoInitializeGroupRowItem(AnItem: TAbstractdxReportCellData; ARow: TcxGridGroupRow); virtual;
procedure DoInitializeGroupRow(ARow: TdxReportCell; ARecord: TcxCustomGridRecord); virtual;
function GetGroupRowClass: TdxReportCellTextClass; virtual;
function GetGroupRowViewParams(ARecord: TcxCustomGridRecord; ALevel: Integer): TdxReportItemViewParams; virtual;
{ Group Row Separator - Office11 Grouping Style }
procedure DoInitializeGroupRowSeparator(ASeparator: TAbstractdxReportCellData); virtual;
procedure DoInitializeGroupSeparatorRow(ARow: TdxReportCell); virtual;
function GetGroupRowSeparatorClass: TdxReportCellDataClass; virtual;
{ Headers }
procedure DoInitializeHeaderItem(AnItem: TAbstractdxReportCellData; AnIndex: Integer); virtual;
procedure DoInitializeHeaderRow(ARow: TdxReportCell); virtual;
procedure DoReportLinkInitializeHeaderItem(AnItem: TAbstractdxReportCellData; AnIndex: Integer); virtual;
function GetHeaderItemBounds(AnIndex: Integer): TRect; virtual;
function GetHeaderItemClass(AnIndex: Integer): TdxReportCellTextClass; virtual;
function GetHeaderItemViewParams(AColumn: TcxGridColumn): TdxReportItemViewParams; virtual;
{ Indents and Expand Buttons }
function CreateIndent(AParent: TdxReportCell): TdxReportCellExpandButton; virtual;
procedure DoInitializeDataRowIndent(AnIndent: TdxReportCellExpandButton;
AnIndex, AnIndentCount: Integer; ARecord: TcxCustomGridRecord); virtual;
procedure DoInitializeExpandButton(AnExpandButton: TdxReportCellExpandButton;
ARecord: TcxCustomGridRecord; AnIsMasterIndent: Boolean); virtual;
procedure DoInitializeGroupFooterIndent(AnIndent: TdxReportCellExpandButton;
AnIndex, AnIndentCount: Integer; ARecord: TcxCustomGridRecord); virtual;
procedure DoInitializeGroupRowIndent(AnIndent: TdxReportCellExpandButton;
AnIndex, AnIndentCount: Integer; ARecord: TcxCustomGridRecord); virtual;
procedure DoInitializeMasterDataRowIndent(AnIndent: TdxReportCellExpandButton;
AnIndex, AnIndentCount: Integer; ARecord: TcxCustomGridRecord); virtual;
procedure DoInitializeRowSeparatorIndent(AnIndent: TdxReportCellExpandButton;
AnIndex, AnIndentCount: Integer; ARecord: TcxCustomGridRecord); virtual;
function GetIndentClass: TdxReportCellExpandButtonClass; virtual;
function GetIndentViewParams(ARecord: TcxCustomGridRecord;
AnIndex, AnIndentCount: Integer; ANonRecordIndent: Boolean): TdxReportItemViewParams; virtual;
function HasExpandButton(ARecord: TcxCustomGridRecord): Boolean; virtual;
{ Items }
procedure DoInitializeDataRow(ARow: TdxReportCell; ARecord: TcxCustomGridRecord); virtual;
procedure DoReportLinkInitializeItem(AnItem: TAbstractdxReportCellData;
AColumn: TcxGridColumn; ARecord: TcxCustomGridRecord); virtual;
function GetItemBounds(AGridRow: TcxCustomGridRow;
AGridRowIndex, AColumnIndex: Integer): TRect; virtual;
function GetItemViewParams(ATableItem: TcxCustomGridTableItem;
ARecord: TcxCustomGridRecord; AnIsPreview: Boolean = False): TdxReportItemViewParams; override;
{ Master Indent }
procedure DoInitializeMasterIndent(AnIndent: TdxReportCellExpandButton;
AnIndex, AnIndentCount: Integer); override;
{ Preview }
procedure DoInitializePreview(APreview: TAbstractdxReportCellData; AColumn: TcxGridColumn;
ARecord: TcxCustomGridRecord); virtual;
function GetPreviewClass(AColumn: TcxGridColumn;
ARecord: TcxCustomGridRecord): TdxReportCellDataClass; virtual;
function GetPreviewViewParams(AColumn: TcxGridColumn;
ARecord: TcxCustomGridRecord): TdxReportItemViewParams; virtual;
{ Row Separator }
procedure DoInitializeSeparatorRow(ARow: TdxReportCell); virtual;
procedure DoInitializeRowSeparator(ASeparator: TAbstractdxReportCellData); virtual;
function GetRowSeparatorClass: TdxReportCellDataClass; virtual;
function GetReportItem(ARow: TcxCustomGridRow; AColumn: TcxGridColumn): TdxReportVisualItem;
property ColumnCount: Integer read GetColumnCount;
property Columns[Index: Integer]: TcxGridColumn read GetColumn;
property DetailsLineHeight: Integer read FDetailsLineHeight write FDetailsLineHeight;
property FooterLineHeight: Integer read FFooterLineHeight write FFooterLineHeight;
property GroupFooterLineHeight: Integer read FGroupFooterLineHeight write FGroupFooterLineHeight;
property GroupRowLineHeight: Integer read FGroupRowLineHeight write FGroupRowLineHeight;
property GroupRowSeparatorColor: TColor read GetGroupRowSeparatorColor;
property GroupRowSeparatorThickness: Integer read GetGroupRowSeparatorThickness;
property HasPreview: Boolean read GetHasPreview;
property HeaderLineCount: Integer read GetHeaderLineCount;
property HeaderLineHeight: Integer read FHeaderLineHeight write FHeaderLineHeight;
property PreviewAutoHeight: Boolean read GetPreviewAutoHeight;
property PreviewColumn: TcxGridColumn read GetPreviewColumn;
property PreviewLineHeight: Integer read FPreviewLineHeight write FPreviewLineHeight;
property PreviewMaxLineCount: Integer read GetPreviewMaxLineCount;
property RowCount: Integer read GetRowCount;
property RowHeights[Index: Integer]: Integer read GetRowHeight write SetRowHeight;
property RowHeightsByRow[Row: TcxCustomGridRow]: Integer read GetRowHeightByRow write SetRowHeightByRow;
property Rows[Index: Integer]: TcxCustomGridRow read GetRow;
property RowSeparatorColor: TColor read GetRowSeparatorColor;
property RowSeparatorThickness: Integer read GetRowSeparatorThickness;
property ShowGroupFooters: Boolean read GetShowGroupFooters;
property ShowFooters: Boolean read GetShowFooters;
property ShowHeaders: Boolean read GetShowHeaders;
property ShowPreview: Boolean read GetShowPreview;
end;
TdxGridTableViewBuilder = class(TdxCustomGridTableViewBuilder)
private
function GetLastReportRow: TdxReportCell;
function GetProcessedView: TcxCustomGridView;
procedure SetProcessedView(Value: TcxCustomGridView);
protected
procedure AddDelimitersHardVert(AReportRow: TdxReportCell);
procedure DoBuildViewBody; override;
procedure DoBuildViewFooter; override;
{ Details View }
procedure CreateDetails(AMasterRow: TcxGridMasterDataRow); virtual;
procedure CreateDetailView(AGridView: TcxCustomGridView); virtual;
function GetAreDetailsBuilt: Boolean; virtual;
{ Footer }
procedure CreateFooter; virtual;
function GetFootersProducer: TdxGridTableViewFootersProducer; virtual;
function GetFootersProducerClass: TdxGridTableViewFootersProducerClass; virtual;
{ Group Footer }
procedure CreateGroupFooters(AGridRow: TcxCustomGridRow); virtual;
function GetGroupFooterProducer: TdxGridTableViewGroupFooterProducer; virtual;
function GetGroupFooterProducerClass: TdxGridTableViewGroupFooterProducerClass; virtual;
{ Header }
procedure CreateHeader; virtual;
function GetHeadersProducer: TdxGridTableViewHeadersProducer; virtual;
function GetHeadersProducerClass: TdxGridTableViewHeadersProducerClass; virtual;
{ Rows }
procedure CreateRow(AGridRow: TcxCustomGridRow; ARowIndex: Integer); virtual;
procedure CreateRows; virtual;
function GetRowProducer(AGridRow: TcxCustomGridRow): TdxGridTableViewCustomDataRowProducer; virtual;
function GetRowProducerClass(AGridRow: TcxCustomGridRow): TdxGridTableViewCustomDataRowProducerClass; virtual;
{ Row Separators }
procedure CreateRowSeparator(AGridRow: TcxCustomGridRow; AnIsLast: Boolean = False); virtual;
function GetRowSeparatorProducer: TdxGridTableViewRowSeparatorProducer; virtual;
function GetRowSeparatorProducerClass: TdxGridTableViewRowSeparatorProducerClass; virtual;
function GetShowRowSeparators: Boolean; virtual;
{ GroupRow Separators }
procedure CreateGroupRowSeparator(AGridRow: TcxGridGroupRow); virtual;
function GetGroupRowSeparatorProducer: TdxGridTableViewGroupRowSeparatorProducer; virtual;
function GetGroupRowSeparatorProducerClass: TdxGridTableViewGroupRowSeparatorProducerClass; virtual;
function GetShowGroupRowSeparators: Boolean; virtual;
function GridView: TcxGridTableView; reintroduce; overload;
class function GridViewClass: TcxCustomGridViewClass; override;
property LastReportRow: TdxReportCell read GetLastReportRow;
property ProcessedView: TcxCustomGridView read GetProcessedView write SetProcessedView;
public
function Adapter: TdxGridTableViewAdapter; reintroduce; overload;
class function AdapterClass: TdxGridViewAdapterClass; override;
function Formatter: TdxGridTableViewFormatter; reintroduce; overload;
class function FormatterClass: TdxGridViewFormatterClass; override;
property AreDetailsBuilt: Boolean read GetAreDetailsBuilt;
property ShowGroupRowSeparators: Boolean read GetShowGroupRowSeparators;
property ShowRowSeparators: Boolean read GetShowRowSeparators;
end;
{ DBTableView Adapter, Formatter and Builder }
TdxGridDBTableViewAdapter = class(TdxGridTableViewAdapter)
private
FPrevAllRecordsAreLoaded: Boolean;
protected
procedure AfterBuilding; override;
procedure BeforeBuilding; override;
function DataController: TcxGridDBDataController; reintroduce; overload;
function DBDataModeController: TcxDBDataModeController; virtual;
procedure LoadAllRecords; virtual;
procedure UnloadAllRecords; virtual;
public
function GridView: TcxGridDBTableView; reintroduce; overload;
class function GridViewClass: TcxCustomGridViewClass; override;
end;
TdxGridDBTableViewBuilder = class(TdxGridTableViewBuilder)
public
function Adapter: TdxGridDBTableViewAdapter; reintroduce; overload;
class function AdapterClass: TdxGridViewAdapterClass; override;
end;
{ BandedTableView Adapter, Formatter and Builder }
TdxGridBandedTableViewAdapter = class(TdxGridTableViewAdapter)
private
FFooterLineCount: Integer;
function GetBand(Index: Integer): TcxGridBand;
function GetBandCount: Integer;
function GetBandEndEllipsis: Boolean;
function GetBandHeaderLineCount: Integer;
function GetBandHeaderMultiline: Boolean;
function GetBottomBand(Index: Integer): TcxGridBand;
function GetBottomBandCount: Integer;
function GetColumn(Index: Integer): TcxGridBandedColumn;
function GetFooterLineCount: Integer;
function GetRootBand(Index: Integer): TcxGridBand;
function GetRootBandCount: Integer;
function GetThemedBandHeaderItemColor: TColor;
function GetThemedBandHeaderItemTextColor: TColor;
protected
function CalculateDetailsLineCount: Integer; override;
function CalculateFooterLineCount: Integer; virtual;
function GetBandHeaderHeight: Integer; virtual;
function GetBandHeaderHeightAssigned: Boolean; virtual;
function GetBandHeaderViewParams(ABand: TcxGridBand): TcxViewParams; virtual;
function GetDataRowHeightAssigned: Boolean; override;
function GetFooterHeightAssigned: Boolean; override;
function GetHeaderHeightAssigned: Boolean; override;
function GetHeaderMultiline(Column: TcxGridColumn): Boolean; override;
public
constructor Create(AMasterAdapter: TdxCustomGridViewAdapter; AGridView: TcxCustomGridView); override;
function GridView: TcxGridBandedTableView; reintroduce; overload;
class function GridViewClass: TcxCustomGridViewClass; override;
function Styles: TcxGridBandedTableViewStyles; reintroduce; overload;
property BandCount: Integer read GetBandCount;
property BandEndEllipsis: Boolean read GetBandEndEllipsis;
property BandHeaderHeight: Integer read GetBandHeaderHeight;
property BandHeaderHeightAssigned: Boolean read GetBandHeaderHeightAssigned;
property BandHeaderLineCount: Integer read GetBandHeaderLineCount;
property BandHeaderMultiline: Boolean read GetBandHeaderMultiline;
property Bands[Index: Integer]: TcxGridBand read GetBand;
property BottomBandCount: Integer read GetBottomBandCount;
property BottomBands[Index: Integer]: TcxGridBand read GetBottomBand;
property Columns[Index: Integer]: TcxGridBandedColumn read GetColumn;
property FooterLineCount: Integer read GetFooterLineCount write FFooterLineCount;
property RootBandCount: Integer read GetRootBandCount;
property RootBands[Index: Integer]: TcxGridBand read GetRootBand;
property ThemedBandHeaderItemColor: TColor read GetThemedBandHeaderItemColor;
property ThemedBandHeaderItemTextColor: TColor read GetThemedBandHeaderItemTextColor;
end;
TdxGridBandedTableViewColumnPlace = class(TdxGridTableViewColumnPlace)
private
function GetColumn: TcxGridBandedColumn;
function GetController: TdxCustomGridBandedTableViewItemPlace;
function GetFormatter: TdxGridBandedTableViewFormatter;
protected
function GetLineCount: Integer; override;
function GetRowIndex: Integer; override;
public
property Column: TcxGridBandedColumn read GetColumn;
property Controller: TdxCustomGridBandedTableViewItemPlace read GetController;
property Formatter: TdxGridBandedTableViewFormatter read GetFormatter;
end;
TdxCustomGridBandedTableViewItemPlaceClass = class of TdxCustomGridBandedTableViewItemPlace;
TdxCustomGridBandedTableViewItemPlace = class(TdxGridTableViewColumnPlaceController)
private
FBand: TcxGridBand;
FController: TdxGridBandedTableViewItemPlaceController;
FHeight: Integer;
FLeftBound: Integer;
FMinWidth: Integer;
FParent: TdxGridBandedTableViewItemPlace;
FTopBound: Integer;
function GetAdapter: TdxGridBandedTableViewAdapter;
function GetBounds: TRect;
function GetFormatter: TdxGridBandedTableViewFormatter;
function GetHeight: Integer;
function GetIndex: Integer;
function GetIsFixed: Boolean;
function GetLeftBound: Integer;
function GetLevelIndex: Integer;
function GetMinWidth: Integer;
function GetTopBound: Integer;
function GetViewParams: TdxReportItemViewParams;
protected
function CalculateHeaderLineCount: Integer; override;
function CalculateWidth: Integer; override;
function GetItemClass(AColumn: TcxGridColumn): TdxGridTableViewColumnPlaceClass; override;
procedure AssignWidth;
function CalculateHeight: Integer; virtual;
function CalculateLeftBound: Integer; virtual;
function CalculateLevelHeight: Integer; virtual;
function CalculateLineHeight: Integer; virtual;
function CalculateMinWidth: Integer; virtual;
function CalculateTopBound: Integer; virtual;
procedure InitAutoWidthItem(AnItem: TcxAutoWidthItem); virtual;
function GetRowCount: Integer; virtual;
function InternalCalculateMinWidth: Integer; virtual;
function InternalCalculateWidth: Integer; virtual;
property Adapter: TdxGridBandedTableViewAdapter read GetAdapter;
property Band: TcxGridBand read FBand;
property IsFixed: Boolean read GetIsFixed;
property LevelIndex: Integer read GetLevelIndex;
property MinWidth: Integer read GetMinWidth;
property RowCount: Integer read GetRowCount;
property ViewParams: TdxReportItemViewParams read GetViewParams;
public
constructor Create(AController: TdxGridBandedTableViewItemPlaceController;
AParent: TdxGridBandedTableViewItemPlace; ABand: TcxGridBand); reintroduce; virtual;
property Bounds: TRect read GetBounds;
property Controller: TdxGridBandedTableViewItemPlaceController read FController;
property Formatter: TdxGridBandedTableViewFormatter read GetFormatter;
property Height: Integer read GetHeight write FHeight;
property Index: Integer read GetIndex;
property LeftBound: Integer read GetLeftBound write FLeftBound;
property Parent: TdxGridBandedTableViewItemPlace read FParent;
property TopBound: Integer read GetTopBound write FTopBound;
end;
TdxGridBandedTableViewItemPlace = class(TdxCustomGridBandedTableViewItemPlace)
private
FChildItems: TList;
function GetChildItem(Index: Integer): TdxCustomGridBandedTableViewItemPlace;
function GetChildItemCount: Integer;
protected
function GetRowCount: Integer; override;
function InternalCalculateMinWidth: Integer; override;
function InternalCalculateWidth: Integer; override;
procedure WidthChanged; override;
procedure CalculateChildItemWidths;
{$IFDEF DXVER500}
procedure RefreshChildItems;
{$ENDIF}
public
constructor Create(AnOwner: TdxGridBandedTableViewItemPlaceController;
AParent: TdxGridBandedTableViewItemPlace; ABand: TcxGridBand); override;
destructor Destroy; override;
function IndexOf(AnItem: TdxCustomGridBandedTableViewItemPlace): Integer;
{$IFDEF DXVER500}
procedure Refresh; override;
{$ENDIF}
property ChildItemCount: Integer read GetChildItemCount;
property ChildItems[Index: Integer]: TdxCustomGridBandedTableViewItemPlace read GetChildItem;
end;
TdxGridBandedTableViewBottomItemPlace = class(TdxCustomGridBandedTableViewItemPlace)
protected
procedure AddItems; override;
function CalculateItemLeftBound(AnItem: TdxGridTableViewColumnPlace): Integer; override;
procedure CalculateItemsWidth; override;
function GetItemsAutoWidth: Boolean; override;
function GetItemsAvailableWidth: Integer; override;
function GetRowCount: Integer; override;
function InternalCalculateMinWidth: Integer; override;
function InternalCalculateWidth: Integer; override;
procedure WidthChanged; override;
end;
TdxGridBandedTableViewItemPlaceController = class(TdxCustomGridTableViewItemPlaceController)
private
FBottomItems: TList;
FHeight: Integer;
FItems: TList;
FLevelCount: Integer;
FLevelHeights: TList;
FRootItems: TList;
function GetAdapter: TdxGridBandedTableViewAdapter;
function GetAutoWidth: Boolean;
function GetAvailableWidth: Integer;
function GetBottomItem(Index: Integer): TdxCustomGridBandedTableViewItemPlace;
function GetBottomItemCount: Integer;
function GetFormatter: TdxGridBandedTableViewFormatter;
function GetHeight: Integer;
function GetItem(Index: Integer): TdxCustomGridBandedTableViewItemPlace;
function GetItemByBand(Band: TcxGridBand): TdxCustomGridBandedTableViewItemPlace;
function GetItemCount: Integer;
function GetLevelCount: Integer;
function GetLevelHeight(Index: Integer): Integer;
function GetRootItem(Index: Integer): TdxCustomGridBandedTableViewItemPlace;
function GetRootItemCount: Integer;
procedure SetLevelHeight(Index: Integer; Value: Integer);
procedure FreeAndNilItems;
protected
function CalculateHeaderLineCount: Integer; override;
function CalculateWidth: Integer; override;
function GetItemByColumn(Column: TcxGridColumn): TdxGridTableViewColumnPlace; override;
procedure AddItems; virtual;
procedure ClearItems;
function CreateItem(ABand: TcxGridBand): TdxCustomGridBandedTableViewItemPlace; virtual;
function GetItemClass(ABand: TcxGridBand): TdxCustomGridBandedTableViewItemPlaceClass; virtual;
procedure RefreshBottomItems;
procedure RefreshItems;
procedure RefreshRootItems;
function CalculateHeight: Integer; virtual;
function CalculateItemHeight(AnItem: TdxCustomGridBandedTableViewItemPlace): Integer; virtual;
function CalculateItemLeftBound(AnItem: TdxCustomGridBandedTableViewItemPlace): Integer; virtual;
function CalculateItemTopBound(AnItem: TdxCustomGridBandedTableViewItemPlace): Integer; virtual;
function CalculateLevelCount: Integer; virtual;
procedure CalculateItemWidths;
procedure CalculateLevelHeights;
property AutoWidth: Boolean read GetAutoWidth;
property Adapter: TdxGridBandedTableViewAdapter read GetAdapter;
property AvailableWidth: Integer read GetAvailableWidth;
public
constructor Create(AFormatter: TdxGridTableViewFormatter); override;
destructor Destroy; override;
procedure Calculate; override;
procedure Refresh; override;
function IndexOf(AnItem: TdxCustomGridBandedTableViewItemPlace): Integer; overload;
function IndexOf(ABand: TcxGridBand): Integer; overload;
function RootIndexOf(AnItem: TdxCustomGridBandedTableViewItemPlace): Integer; overload;
function RootIndexOf(ABand: TcxGridBand): Integer; overload;
property BottomItemCount: Integer read GetBottomItemCount;
property BottomItems[Index: Integer]: TdxCustomGridBandedTableViewItemPlace read GetBottomItem;
property Formatter: TdxGridBandedTableViewFormatter read GetFormatter;
property Height: Integer read GetHeight;
property ItemCount: Integer read GetItemCount;
property Items[Index: Integer]: TdxCustomGridBandedTableViewItemPlace read GetItem; default;
property ItemsByBand[Band: TcxGridBand]: TdxCustomGridBandedTableViewItemPlace read GetItemByBand;
property LevelCount: Integer read GetLevelCount;
property LevelHeights[Index: Integer]: Integer read GetLevelHeight write SetLevelHeight;
property RootItemCount: Integer read GetRootItemCount;
property RootItems[Index: Integer]: TdxCustomGridBandedTableViewItemPlace read GetRootItem;
end;
TdxGridBandedTableViewFormatter = class(TdxGridTableViewFormatter)
private
FBands: TList;
function GetBand(Index: Integer): TcxGridBand;
function GetBandCount: Integer;
function GetColumn(Index: Integer): TcxGridBandedColumn;
function GetItemPlaceController: TdxGridBandedTableViewItemPlaceController;
function GetShowBandHeaders: Boolean;
protected
procedure AddHorizontalDelimiters; override;
{$IFDEF DXVER500}
function CanColumnCellMerging(AColumn: TcxGridColumn): Boolean; override;
function IsColumnActuallyVisible(AColumn: TcxGridColumn): Boolean; override;
{$ENDIF}
function GetItemPlaceControllerClass: TdxCustomGridTableViewItemPlaceControllerClass; override;
procedure BuildBandList; virtual;
procedure BuildItemLists; override;
function IsBandActuallyVisible(ABand: TcxGridBand): Boolean; virtual;
function MapStyleBackgroundBitmapIndex(AGridBackgroundBitmapIndex: Integer): Integer; override;
property ItemPlaceController: TdxGridBandedTableViewItemPlaceController read GetItemPlaceController;
public
constructor Create(ABuilder: TdxCustomGridViewBuilder); override;
destructor Destroy; override;
function Adapter: TdxGridBandedTableViewAdapter; reintroduce; overload;
function Builder: TdxGridBandedTableViewBuilder; reintroduce; overload;
{ Bands }
procedure DoInitializeBandItem(AnItem: TAbstractdxReportCellData; AnIndex: Integer); virtual;
procedure DoInitializeBandRow(ARow: TdxReportCell); virtual;
procedure DoReportLinkInitializeBandItem(AnItem: TAbstractdxReportCellData; AnIndex: Integer); virtual;
function GetBandItemBounds(AnIndex: Integer): TRect; virtual;
function GetBandItemClass(AnIndex: Integer): TdxReportCellTextClass; virtual;
function GetBandItemViewParams(ABand: TcxGridBand): TdxReportItemViewParams; virtual;
property BandCount: Integer read GetBandCount;
property Bands[Index: Integer]: TcxGridBand read GetBand;
property Columns[Index: Integer]: TcxGridBandedColumn read GetColumn;
property ShowBandHeaders: Boolean read GetShowBandHeaders;
end;
TdxGridBandedTableViewBuilder = class(TdxGridTableViewBuilder)
protected
procedure DoBuildViewBody; override;
procedure CreateBands; virtual;
function GetBandsProducer: TdxGridTableViewBandsProducer; virtual;
function GetBandsProducerClass: TdxGridTableViewBandsProducerClass; virtual;
function GridView: TcxGridBandedTableView; reintroduce; overload;
class function GridViewClass: TcxCustomGridViewClass; override;
public
function Adapter: TdxGridBandedTableViewAdapter; reintroduce; overload;
class function AdapterClass: TdxGridViewAdapterClass; override;
function Formatter: TdxGridBandedTableViewFormatter; reintroduce; overload;
class function FormatterClass: TdxGridViewFormatterClass; override;
end;
{ DBBandedTableView Adapter, Formatter and Builder }
TdxGridDBBandedTableViewAdapter = class(TdxGridBandedTableViewAdapter)
private
FPrevAllRecordsAreLoaded: Boolean;
protected
procedure AfterBuilding; override;
procedure BeforeBuilding; override;
function DataController: TcxGridDBDataController; reintroduce; overload;
function DBDataModeController: TcxDBDataModeController; virtual;
procedure LoadAllRecords; virtual;
procedure UnloadAllRecords; virtual;
public
function GridView: TcxGridDBBandedTableView; reintroduce; overload;
class function GridViewClass: TcxCustomGridViewClass; override;
end;
TdxGridDBBandedTableViewBuilder = class(TdxGridBandedTableViewBuilder)
public
function Adapter: TdxGridDBBandedTableViewAdapter; reintroduce; overload;
class function AdapterClass: TdxGridViewAdapterClass; override;
end;
{ CardView Adapter, Formatter and Builder }
TdxReportCard = class;
TdxReportCardRowClass = class of TdxReportCardRow;
TdxReportCardRow = class(TdxReportCell)
private
function GetCard: TdxReportCard;
function GetGridCardRow: TcxGridCardViewRow;
function GetHasCaption: Boolean;
function GetHeight: Integer;
function GetProperties: TcxCustomEditProperties;
function GetRowCaption: TdxReportCellText;
function GetRowData: TAbstractdxReportCellData;
function GetWidth: Integer;
procedure SetHeight(Value: Integer);
procedure SetRowCaptionWidth(Value: Integer);
procedure SetWidth(Value: Integer);
protected
procedure AdjustCellSides; virtual;
procedure CreateItems(ABuilder: TdxGridCardViewBuilder); virtual;
function MeasureCaptionWidth(DC: HDC): Integer;
function MeasureDataWidth(DC: HDC): Integer;
property Properties: TcxCustomEditProperties read GetProperties;
public
constructor CreateEx(AParent: TdxReportCell; AGridCardRow: TcxGridCardViewRow); virtual;
function MeasureHeight(DC: HDC; ACalculateLineHeight: Boolean;
ABuilder: TdxGridCardViewBuilder): Integer; reintroduce; overload;
property Card: TdxReportCard read GetCard;
property GridCardRow: TcxGridCardViewRow read GetGridCardRow;
property HasCaption: Boolean read GetHasCaption;
property Height: Integer read GetHeight write SetHeight;
property RowCaption: TdxReportCellText read GetRowCaption;
property RowCaptionWidth: Integer write SetRowCaptionWidth;
property RowData: TAbstractdxReportCellData read GetRowData;
property Width: Integer read GetWidth write SetWidth;
end;
TdxCardBorderPainter = class(TdxPSCellBorderPainter)
protected
procedure DrawShadow(DC: HDC); virtual;
public
procedure Paint(DC: HDC); override;
function Card: TdxReportCard; reintroduce; overload;
end;
TdxGridCardShadowDepth = 0..15;
TdxGridCardShadowPosition = (cspTopLeft, cspTopRight, cspBottomRight, cspBottomLeft);
TdxReportCard = class(TdxReportCell)
private
FRowCaptionWidth: Integer;
FShadowColor: TColor;
FShadowDepth: Integer;
FShadowPosition: TdxGridCardShadowPosition;
function GetGridCard: TcxGridCard;
function GetHasShadow: Boolean;
function GetHeight: Integer;
function GetReportLink: TdxGridReportLink;
function GetRow(Index: Integer): TdxReportCardRow;
function GetRowByCardRow(CardRow: TcxGridCardViewRow): TdxReportCardRow;
function GetRowCount: Integer;
function GetRowHeight(Index: Integer): Integer;
function GetRowsAvailableHeight: Integer;
function GetRowsAvailableWidth: Integer;
function GetRowsOriginLeft: Integer;
function GetRowsOriginTop: Integer;
function GetShadowRectHorz: TRect;
function GetShadowRectVert: TRect;
function GetWidth: Integer;
procedure SetHeight(Value: Integer);
procedure SetRowCaptionWidth(Value: Integer);
procedure SetRowHeight(Index, Value: Integer);
procedure SetShadowDepth2(Value: Integer);
procedure SetWidth(Value: Integer);
protected
procedure AddVerticalDelimiters; virtual;
procedure ConvertCoords(APixelsNumerator, APixelsDenominator: Integer); override;
procedure CreateRows(ABuilder: TdxGridCardViewBuilder); virtual;
function GetBorderPainterClass: TdxPSCellBorderPainterClass; override;
procedure ReadProperties(AReader: TdxPSDataReader); override;
procedure WriteProperties(AWriter: TdxPSDataWriter); override;
procedure AdjustHeight;
procedure AdjustRowsCellSides;
procedure AdjustRowsPos;
procedure AdjustRowsHeight(DC: HDC; AAutoHeight: Boolean; ABuilder: TdxGridCardViewBuilder);
procedure AdjustRowsWidth(DC: HDC);
function MeasureCaptionWidth(DC: HDC): Integer; virtual;
function MeasureDataWidth(DC: HDC): Integer; virtual;
property ReportLink: TdxGridReportLink read GetReportLink;
public
constructor Create(AParent: TdxReportCell); override;
constructor CreateEx(AParent: TdxReportCell; AGridCard: TcxGridCard); virtual;
function GetBorderOuterBounds(DC: HDC): TRect; override;
function IndexOfCardRow(ACardRow: TcxGridCardViewRow): Integer;
property GridCard: TcxGridCard read GetGridCard;
property HasShadow: Boolean read GetHasShadow;
property Height: Integer read GetHeight write SetHeight;
property RowCaptionWidth: Integer read FRowCaptionWidth write SetRowCaptionWidth;
property RowCount: Integer read GetRowCount;
property RowHeights[Index: Integer]: Integer read GetRowHeight write SetRowHeight;
property Rows[Index: Integer]: TdxReportCardRow read GetRow;
property RowsAvailableHeight: Integer read GetRowsAvailableHeight;
property RowsAvailableWidth: Integer read GetRowsAvailableWidth;
property RowsByCardRow[CardRow: TcxGridCardViewRow]: TdxReportCardRow read GetRowByCardRow;
property RowsOriginLeft: Integer read GetRowsOriginLeft;
property RowsOriginTop: Integer read GetRowsOriginTop;
property ShadowColor: TColor read FShadowColor write FShadowColor default clBlack;
property ShadowDepth: Integer read FShadowDepth write SetShadowDepth2 default dxDefaultCardsShadowDepth;
property ShadowRectHorz: TRect read GetShadowRectHorz;
property ShadowRectVert: TRect read GetShadowRectVert;
property ShadowPosition: TdxGridCardShadowPosition read FShadowPosition write FShadowPosition default cspBottomRight;
property Width: Integer read GetWidth write SetWidth;
end;
TdxReportCardClass = class of TdxReportCard;
TdxGridCardViewAdapter = class(TdxCustomGridTableViewAdapter)
private
function GetCaptionSeparator: string;
function GetCard(Index: Integer): TcxGridCard;
function GetCardCaptionWidth: Integer;
function GetCardCount: Integer;
function GetCardRow(Index: Integer): TcxGridCardViewRow;
function GetCardRowCount: Integer;
function GetCardSeparatorColor: Integer;
function GetCardSeparatorThickness: Integer;
function GetCardWidth: Integer;
function GetHasCardsSeparator: Boolean;
function GetRowAutoHeight: Boolean;
function GetRowCaptionAutoHeight: Boolean;
function GetRowCaptionEndEllipsis: Boolean;
function GetShowRowCaption(Index: Integer): Boolean;
protected
function GetAreAllMasterRowsCollapsed: Boolean; override;
function GetCaptionRowViewParams(ARecord: TcxCustomGridRecord;
ACardRow: TcxGridCardViewRow): TcxViewParams; virtual;
function GetCardViewParams(ARecord: TcxCustomGridRecord): TcxViewParams; virtual;
function GetContentViewParams(ARecord: TcxCustomGridRecord;
ATableItem: TcxCustomGridTableItem): TcxViewParams; override;
function GetRowCaptionViewParams(ARecord: TcxCustomGridRecord;
ACardRow: TcxGridCardViewRow): TcxViewParams; virtual;
public
function GridView: TcxGridCardView; reintroduce; overload;
class function GridViewClass: TcxCustomGridViewClass; override;
function Styles: TcxGridCardViewStyles; reintroduce; overload;
procedure GetVisibleCardRows(ACard: TcxGridCard; AList: TList);
procedure ExpandAllRows(AnOptionsExpanding: TdxGridReportLinkOptionsExpanding; ARecursive: Boolean); override;
function IsFirstRow(ACardRow: TcxGridCardViewRow): Boolean;
function IsLastRow(ACardRow: TcxGridCardViewRow): Boolean;
property CaptionSeparator: string read GetCaptionSeparator;
property CardCaptionWidth: Integer read GetCardCaptionWidth;
property CardCount: Integer read GetCardCount;
property CardRowCount: Integer read GetCardRowCount;
property CardRows[Index: Integer]: TcxGridCardViewRow read GetCardRow;
property Cards[Index: Integer]: TcxGridCard read GetCard;
property CardSeparatorColor: Integer read GetCardSeparatorColor;
property CardSeparatorThickness: Integer read GetCardSeparatorThickness;
property CardWidth: Integer read GetCardWidth;
property HasCardsSeparator: Boolean read GetHasCardsSeparator;
property RowCaptionAutoHeight: Boolean read GetRowCaptionAutoHeight;
property RowCaptionEndEllipsis: Boolean read GetRowCaptionEndEllipsis;
property RowAutoHeight: Boolean read GetRowAutoHeight;
property ShowRowCaption[Index: Integer]: Boolean read GetShowRowCaption;
end;
TdxGridCardViewFormatter = class(TdxCustomGridTableViewFormatter)
private
function GetAutoWidth: Boolean;
function GetCaptionAutoWidth: Boolean;
function GetCard(Index: Integer): TcxGridCard;
function GetCardCount: Integer;
function GetCardsAreaWidth: Integer;
function GetInterCardsSpaceHorz: Integer;
function GetInterCardsSpaceVert: Integer;
function GetKeepSameHeight: Boolean;
function GetKeepSameWidth: Boolean;
function GetRowAutoHeight: Boolean;
protected
procedure AddHorizontalDelimiters; override;
procedure AddVerticalDelimiters; override;
function GetViewWidth: Integer; override;
function GetContentBackgroundBitmapStyleIndex(ATableItem: TcxCustomGridTableItem): Integer; override;
function MapStyleBackgroundBitmapIndex(AGridBackgroundBitmapIndex: Integer): Integer; override;
function NeedDelimitByRows: Boolean; virtual;
public
function Adapter: TdxGridCardViewAdapter; reintroduce; overload;
function Builder: TdxGridCardViewBuilder; reintroduce; overload;
{ Cards }
procedure DoInitializeCard(ACard: TdxReportCard; AGridCard: TcxGridCard); virtual;
procedure DoInitializeCardsRow(ACard: TdxReportCell); virtual;
function GetCardClass(AGridCard: TcxGridCard): TdxReportCardClass; virtual;
function GetCardViewParams(ARecord: TcxCustomGridRecord): TdxReportItemViewParams; virtual;
{ Cards Caption }
procedure DoInitializeCardRowCaption(AnItem: TdxReportCellText;
ACardRow: TcxGridCardViewRow; AGridCard: TcxGridCard); virtual;
procedure DoReportLinkInitializeCardRowCaption(AnItem: TdxReportCellText;
ACardRow: TcxGridCardViewRow; AGridCard: TcxGridCard); virtual;
function GetCardRowCaptionClass(ACardRow: TcxGridCardViewRow): TdxReportCellTextClass; virtual;
function GetCardRowCaptionViewParams(ARecord: TcxCustomGridRecord;
ACardRow: TcxGridCardViewRow): TdxReportItemViewParams; virtual;
{ Cards Data }
procedure DoReportLinkInitializeCardRowData(AnItem: TAbstractdxReportCellData;
ACardRow: TcxGridCardViewRow; AGridCard: TcxGridCard); virtual;
function GetItemViewParams(ATableItem: TcxCustomGridTableItem;
ARecord: TcxCustomGridRecord; AnIsPreview: Boolean = False): TdxReportItemViewParams; override;
property AutoWidth: Boolean read GetAutoWidth;
property CaptionAutoWidth: Boolean read GetCaptionAutoWidth;
property CardCount: Integer read GetCardCount;
property Cards[Index: Integer]: TcxGridCard read GetCard;
property CardsAreaWidth: Integer read GetCardsAreaWidth;
property InterCardsSpaceHorz: Integer read GetInterCardsSpaceHorz;
property InterCardsSpaceVert: Integer read GetInterCardsSpaceVert;
property KeepSameHeight: Boolean read GetKeepSameHeight;
property KeepSameWidth: Boolean read GetKeepSameWidth;
property RowAutoHeight: Boolean read GetRowAutoHeight;
end;
TdxGridCardViewBuilder = class(TdxCustomGridTableViewBuilder)
private
FCards: TList;
FMaxCardWidth: Integer;
function GetCard(Index: Integer): TdxReportCard;
function GetCardCount: Integer;
procedure AdjustCardRowsCellSides;
procedure CreateCards;
procedure ResizeCards;
protected
procedure DoBuildViewBody; override;
function GetCardsRowProducer: TdxGridCardViewCardsRowProducer; virtual;
function GetCardsRowProducerClass: TdxGridCardViewCardsRowProducerClass; virtual;
procedure PlaceCards; virtual;
function GridView: TcxGridCardView; reintroduce; overload;
class function GridViewClass: TcxCustomGridViewClass; override;
property CardCount: Integer read GetCardCount;
property Cards[Index: Integer]: TdxReportCard read GetCard;
public
constructor Create(AReportLink: TdxGridReportLink;
AMasterBuilder: TdxCustomGridViewBuilder; AGridView: TcxCustomGridView); override;
destructor Destroy; override;
function Adapter: TdxGridCardViewAdapter; reintroduce; overload;
class function AdapterClass: TdxGridViewAdapterClass; override;
function Formatter: TdxGridCardViewFormatter; reintroduce; overload;
class function FormatterClass: TdxGridViewFormatterClass; override;
property MaxCardWidth: Integer read FMaxCardWidth;
end;
{ DBCardView Adapter, Formatter and Builder }
TdxGridDBCardViewAdapter = class(TdxGridCardViewAdapter)
private
FPrevAllRecordsAreLoaded: Boolean;
protected
procedure AfterBuilding; override;
procedure BeforeBuilding; override;
function DataController: TcxGridDBDataController; reintroduce; overload;
function DBDataModeController: TcxDBDataModeController; virtual;
procedure LoadAllRecords; virtual;
procedure UnloadAllRecords; virtual;
public
function GridView: TcxGridDBCardView; reintroduce; overload;
class function GridViewClass: TcxCustomGridViewClass; override;
end;
TdxGridDBCardViewBuilder = class(TdxGridCardViewBuilder)
public
function Adapter: TdxGridDBCardViewAdapter; reintroduce; overload;
class function AdapterClass: TdxGridViewAdapterClass; override;
end;
{$IFDEF CHARTVIEW}
{ ChartView Adapter, Formatter and Builder }
TdxGridChartViewAdapter = class(TdxCustomGridViewAdapter)
protected
function CreateGraphic(AGraphicClass: TGraphicClass; AWidth: Integer): TGraphic;
function GetCanUseOnEveryPageMode: Boolean; override;
public
function GridView: TcxGridChartView; reintroduce; overload;
class function GridViewClass: TcxCustomGridViewClass; override;
end;
TdxGridChartViewFormatter = class(TdxCustomGridViewFormatter)
private
function GetGraphicClass: TGraphicClass;
function GetGraphicTransparent: Boolean;
protected
function CreateChartImage: TGraphic; virtual;
procedure DoInitializeChartItem(AnItem: TdxReportCellGraphic); virtual;
procedure DoReportLinkInitializeChartItem(AnItem: TdxReportCellGraphic); virtual;
function GetChartItemClass: TdxReportCellGraphicClass;
function GetViewWidth: Integer; override;
public
function Adapter: TdxGridChartViewAdapter; reintroduce; overload;
function Builder: TdxGridChartViewBuilder; reintroduce; overload;
property GraphicClass: TGraphicClass read GetGraphicClass;
property GraphicTransparent: Boolean read GetGraphicTransparent;
end;
TdxGridChartViewBuilder = class(TdxCustomGridViewBuilder)
protected
function GetChartProducer: TdxGridChartViewChartProducer; virtual;
function GetChartProducerClass: TdxGridChartViewChartProducerClass; virtual;
procedure CreateChart; virtual;
procedure DoBuildViewBody; override;
function GridView: TcxGridChartView; reintroduce; overload;
class function GridViewClass: TcxCustomGridViewClass; override;
public
function Adapter: TdxGridChartViewAdapter; reintroduce; overload;
class function AdapterClass: TdxGridViewAdapterClass; override;
function Formatter: TdxGridChartViewFormatter; reintroduce; overload;
class function FormatterClass: TdxGridViewFormatterClass; override;
end;
{$ENDIF}
{ Producers }
TdxGridViewRowProducer = class
private
FBuilder: TdxCustomGridViewBuilder;
FHost: TdxReportCell;
FMasterIndents: TList;
FRow: TdxReportCell;
FRowHeight: Integer;
function GetDC: HDC;
function GetHostClass: TdxReportCellClass;
function GetIndentWidth: Integer;
function GetMasterBuilder(Index: Integer): TdxCustomGridViewBuilder;
function GetMasterIndent(Index: Integer): TdxReportCellBox;
function GetMasterIndentCount: Integer;
function GetRowHostClass: TdxReportCellClass;
function GetRowOriginX: Integer;
function GetRowWidth: Integer;
protected
procedure AddLeadingMasterIndentsAndSeparators; virtual;
procedure AddMasterIndents(AMasterFormatter: TdxCustomGridViewFormatter;
AMasterAdapter: TdxCustomGridViewAdapter; ALevel: Integer; var ALeftPos: Integer);
procedure AddMasterSeparator(AMasterFormatter: TdxCustomGridViewFormatter;
AMasterAdapter: TdxCustomGridViewAdapter; var ALeftPos: Integer;
ASeparatorKind: TdxVerticalDetailsSeparatorKind);
procedure AddTrailingMasterSeparators; virtual;
function CalculateItemHeight(DC: HDC; AnItem: TdxReportVisualItem): Integer; virtual;
procedure CalculateRowAutoHeight; virtual;
procedure CalculateRowHeight; virtual;
function CreateDetailsSeparator(AParent: TdxReportCell): TdxReportCellBox; virtual;
function CreateMasterIndent(AParent: TdxReportCell): TdxReportCellExpandButton; virtual;
procedure CreateRow; virtual;
procedure CreateRowHost(const AHostInfo: TdxGridAttributeHostInfo); virtual;
function DoesItemParticipateInRowAutoHeightCalculation(AnItem: TdxReportVisualItem): Boolean; virtual;
function GetDetailsSeparatorClass: TdxReportCellBoxClass; virtual;
function GetMasterIndentClass: TdxReportCellExpandButtonClass; virtual;
procedure FixupMasterIndentsHeight; virtual;
procedure FixupRowDataItemHeight(AnItem: TdxReportVisualItem); virtual;
procedure FixupRowDataHeight; virtual;
procedure FixupRowHeight; virtual;
procedure FixupRowOwnHeight; virtual;
procedure InitializeDetailsSeparator(AFormatter: TdxCustomGridViewFormatter;
ASeparator: TdxReportCellBox; ASeparatorKind: TdxVerticalDetailsSeparatorKind); virtual;
procedure InitializeMasterIndent(AFormatter: TdxCustomGridViewFormatter;
AIndent: TdxReportCellExpandButton; AIndex, ALevel: Integer); virtual;
procedure InitializeHost; virtual;
procedure InitializeRow; virtual;
function GetAutoHeight: Boolean; virtual;
function GetItemsSite: TdxReportCell; virtual;
function GetLineCount: Integer; virtual;
function GetLineHeight: Integer; virtual;
function GetWidth: Integer; virtual;
property DC: HDC read GetDC;
property HostClass: TdxReportCellClass read GetHostClass;
public
constructor Create(ABuilder: TdxCustomGridViewBuilder); virtual;
destructor Destroy; override;
function Adapter: TdxCustomGridViewAdapter; overload; virtual;
function Builder: TdxCustomGridViewBuilder; overload; virtual;
function Formatter: TdxCustomGridViewFormatter; overload; virtual;
function Produce(AHostInfo: TdxGridAttributeHostInfo): TdxReportCell; virtual;
property AutoHeight: Boolean read GetAutoHeight;
property Host: TdxReportCell read FHost;
property IndentWidth: Integer read GetIndentWidth;
property ItemsSite: TdxReportCell read GetItemsSite;
property LineCount: Integer read GetLineCount;
property LineHeight: Integer read GetLineHeight;
property MasterBuilders[Index: Integer]: TdxCustomGridViewBuilder read GetMasterBuilder;
property MasterIndentCount: Integer read GetMasterIndentCount;
property MasterIndents[Index: Integer]: TdxReportCellBox read GetMasterIndent;
property Row: TdxReportCell read FRow;
property RowHeight: Integer read FRowHeight write FRowHeight;
property RowOriginX: Integer read GetRowOriginX;
property RowWidth: Integer read GetRowWidth;
property Width: Integer read GetWidth;
end;
TdxGridViewCustomRowProducer = class(TdxGridViewRowProducer)
private
FItem: TAbstractdxReportCellData;
protected
procedure AddItem; virtual;
function CreateItem(AParent: TdxReportCell): TAbstractdxReportCellData; virtual;
procedure FixupRowDataHeight; override;
procedure InitializeItem; virtual;
function GetAutoHeight: Boolean; override;
function GetItemClass: TdxReportCellDataClass; virtual;
property Item: TAbstractdxReportCellData read FItem;
public
function Produce(AHostInfo: TdxGridAttributeHostInfo): TdxReportCell; override;
end;
TdxGridViewCaptionProducer = class(TdxGridViewCustomRowProducer)
private
function GetItem: TdxReportCellText;
protected
procedure InitializeItem; override;
procedure InitializeRow; override;
function GetItemClass: TdxReportCellDataClass; override;
function GetLineHeight: Integer; override;
public
property Item: TdxReportCellText read GetItem;
end;
TdxGridViewFilterBarProducer = class(TdxGridViewCustomRowProducer)
private
function GetItem: TdxReportCellText;
protected
procedure InitializeItem; override;
procedure InitializeRow; override;
function GetItemClass: TdxReportCellDataClass; override;
function GetLineHeight: Integer; override;
public
property Item: TdxReportCellText read GetItem;
end;
TdxGridViewDetailsSeparatorProducer = class(TdxGridViewCustomRowProducer)
private
function GetItem: TdxReportCellBox;
protected
procedure InitializeItem; override;
procedure InitializeRow; override;
function GetItemClass: TdxReportCellDataClass; override;
function GetLineHeight: Integer; override;
public
property Item: TdxReportCellBox read GetItem;
end;
TdxGridViewDetailsTopSeparatorProducer = class(TdxGridViewDetailsSeparatorProducer)
protected
procedure InitializeDetailsSeparator(AFormatter: TdxCustomGridViewFormatter;
ASeparator: TdxReportCellBox; ASeparatorKind: TdxVerticalDetailsSeparatorKind); override;
end;
TdxGridViewDetailsBottomSeparatorProducer = class(TdxGridViewDetailsSeparatorProducer)
protected
procedure InitializeDetailsSeparator(AFormatter: TdxCustomGridViewFormatter;
ASeparator: TdxReportCellBox; ASeparatorKind: TdxVerticalDetailsSeparatorKind); override;
end;
TdxGridViewTerminatorProducer = class(TdxGridViewDetailsSeparatorProducer)
protected
procedure InitializeItem; override;
function GetLineHeight: Integer; override;
end;
TdxGridTableViewRowProducer = class(TdxGridViewRowProducer)
public
function Adapter: TdxGridTableViewAdapter; reintroduce; overload;
function Builder: TdxGridTableViewBuilder; reintroduce; overload;
function Formatter: TdxGridTableViewFormatter; reintroduce; overload;
end;
TdxGridTableViewRowSubItemsProducer = class(TdxGridTableViewRowProducer)
private
FIndents: TList;
FSubItems: TList;
function GetColumn(Index: Integer): TcxGridColumn;
function GetIndent(Index: Integer): TdxReportCellExpandButton;
function GetSubItem(Index: Integer): TdxReportVisualItem;
protected
procedure AddIndents(AParent: TdxReportCell); virtual;
procedure AddSubItems(AParent: TdxReportCell); virtual;
procedure CreateRow; override;
function CreateSubItem(AnIndex: Integer; AParent: TdxReportCell): TAbstractdxReportCellData;
function IsItemIndent(AnItem: TdxReportVisualItem): Boolean;
procedure FixupIndentsHeight; virtual;
procedure FixupRowDataHeight; override;
procedure FixupRowHeight; override;
procedure InitializeIndentList; virtual;
procedure InitializeSubItem(ASubItem: TAbstractdxReportCellData; AIndex: Integer); virtual;
procedure InitializeSubItemList; virtual;
function GetHasSubItem(Index: Integer): Boolean; virtual;
function GetIndentCount: Integer; virtual;
function GetSubItemBound(Index: Integer): TRect; virtual;
function GetSubItemClass(Index: Integer): TdxReportCellDataClass; virtual; abstract;
function GetSubItemCount: Integer; virtual;
public
constructor Create(ABuilder: TdxCustomGridViewBuilder); override;
destructor Destroy; override;
function Produce(AHostInfo: TdxGridAttributeHostInfo): TdxReportCell; override;
property Columns[Index: Integer]: TcxGridColumn read GetColumn;
property HasSubItem[Index: Integer]: Boolean read GetHasSubItem;
property IndentCount: Integer read GetIndentCount;
property Indents[Index: Integer]: TdxReportCellExpandButton read GetIndent;
property SubItemBounds[Index: Integer]: TRect read GetSubItemBound;
property SubItemClasses[Index: Integer]: TdxReportCellDataClass read GetSubItemClass;
property SubItemCount: Integer read GetSubItemCount;
property SubItems[Index: Integer]: TdxReportVisualItem read GetSubItem; default;
end;
TdxGridTableViewHeadersProducer = class(TdxGridTableViewRowSubItemsProducer)
protected
procedure InitializeRow; override;
procedure InitializeSubItem(ASubItem: TAbstractdxReportCellData; AIndex: Integer); override;
function GetAutoHeight: Boolean; override;
function GetLineCount: Integer; override;
function GetLineHeight: Integer; override;
function GetSubItemBound(Index: Integer): TRect; override;
function GetSubItemClass(Index: Integer): TdxReportCellDataClass; override;
end;
TdxGridTableViewFootersProducer = class(TdxGridTableViewRowSubItemsProducer)
protected
procedure CalculateRowAutoHeight; override;
procedure CalculateRowHeight; override;
procedure FixupRowDataItemHeight(AnItem: TdxReportVisualItem); override;
procedure InitializeRow; override;
procedure InitializeSubItem(ASubItem: TAbstractdxReportCellData; AIndex: Integer); override;
function GetAutoHeight: Boolean; override;
function GetHasSubItem(Index: Integer): Boolean; override;
function GetLineCount: Integer; override;
function GetLineHeight: Integer; override;
function GetSubItemBound(Index: Integer): TRect; override;
function GetSubItemClass(Index: Integer): TdxReportCellDataClass; override;
end;
TdxGridTableViewCustomDataRowProducer = class(TdxGridTableViewRowSubItemsProducer)
private
FGridRow: TcxCustomGridRow;
FGridRowIndex: Integer;
function GetIndentArea: Integer;
function GetIndentBounds(Index: Integer): TRect;
protected
procedure AddIndents(AParent: TdxReportCell); override;
function CreateIndent(AnIndex: Integer; AParent: TdxReportCell): TdxReportCellExpandButton; virtual;
procedure InitializeIndent(AIndent: TdxReportCellExpandButton; AIndex: Integer); virtual;
function GetIndentCount: Integer; override;
function GetLineCount: Integer; override;
function GetLineHeight: Integer; override;
public
function GridRow: TcxCustomGridRow; overload; virtual;
function Produce(AHostInfo: TdxGridAttributeHostInfo;
AGridRow: TcxCustomGridRow; AGridRowIndex: Integer): TdxReportCell; reintroduce; virtual;
property GridRowIndex: Integer read FGridRowIndex;
property IndentArea: Integer read GetIndentArea;
property IndentBounds[Index: Integer]: TRect read GetIndentBounds;
end;
TdxCustomGridTableViewRowSeparatorProducer = class(TdxGridTableViewCustomDataRowProducer)
protected
procedure InitializeIndent(AIndent: TdxReportCellExpandButton; AIndex: Integer); override;
function GetAutoHeight: Boolean; override;
function GetSubItemCount: Integer; override;
function GetSubItemBound(Index: Integer): TRect; override;
public
function Produce(AHostInfo: TdxGridAttributeHostInfo;
AGridRow: TcxCustomGridRow): TdxReportCell; reintroduce; virtual;
end;
TdxGridTableViewRowSeparatorProducer = class(TdxCustomGridTableViewRowSeparatorProducer)
private
FIsLast: Boolean;
protected
procedure InitializeRow; override;
procedure InitializeSubItem(ASubItem: TAbstractdxReportCellData; AIndex: Integer); override;
function GetIndentCount: Integer; override;
function GetLineHeight: Integer; override;
function GetSubItemClass(Index: Integer): TdxReportCellDataClass; override;
public
function Produce(AHostInfo: TdxGridAttributeHostInfo; AGridRow: TcxCustomGridRow;
AnIsLast: Boolean): TdxReportCell; reintroduce; virtual;
property IsLast: Boolean read FIsLast;
end;
TdxGridTableViewGroupRowSeparatorProducer = class(TdxCustomGridTableViewRowSeparatorProducer)
protected
procedure InitializeRow; override;
procedure InitializeSubItem(ASubItem: TAbstractdxReportCellData; AIndex: Integer); override;
function GetLineHeight: Integer; override;
function GetSubItemClass(Index: Integer): TdxReportCellDataClass; override;
end;
TdxGridTableViewDataRowProducer = class(TdxGridTableViewCustomDataRowProducer)
private
FPreviewItem: TdxReportVisualItem;//TAbstractdxReportCellData;
function GetPreviewColumn: TcxGridColumn;
function GetPreviewPlace: TcxGridPreviewPlace;
protected
procedure AddPreview(AParent: TdxReportCell); virtual;
procedure AddSubItems(AParent: TdxReportCell); override;
procedure CalculateRowAutoHeight; override;
function DoesItemParticipateInRowAutoHeightCalculation(AnItem: TdxReportVisualItem): Boolean; override;
function CreatePreview(AParent: TdxReportCell): TdxReportVisualItem; virtual;
function GetPreviewClass: TdxReportCellDataClass; virtual;
procedure FixupRowDataHeight; override;
procedure InitializeIndent(AIndent: TdxReportCellExpandButton; AIndex: Integer); override;
procedure InitializeRow; override;
procedure InitializeSubItem(ASubItem: TAbstractdxReportCellData; AIndex: Integer); override;
function GetAutoHeight: Boolean; override;
function GetCellAutoHeight: Boolean; virtual;
function GetHasPreview: Boolean; virtual;
function GetIndentCount: Integer; override;
function GetLineCount: Integer; override;
function GetLineHeight: Integer; override;
function GetPreviewHeight: Integer; virtual;
function GetPreviewLineCount: Integer; virtual;
function GetPreviewLineHeight: Integer; virtual;
function GetSubItemBound(Index: Integer): TRect; override;
function GetSubItemClass(Index: Integer): TdxReportCellDataClass; override;
public
function GridRow: TcxGridDataRow; reintroduce; overload;
property CellAutoHeight: Boolean read GetCellAutoHeight;
property HasPreview: Boolean read GetHasPreview;
property PreviewColumn: TcxGridColumn read GetPreviewColumn;
property PreviewHeight: Integer read GetPreviewHeight;
property PreviewItem: TdxReportVisualItem read FPreviewItem;//TAbstractdxReportCellData read FPreviewItem;
property PreviewLineCount: Integer read GetPreviewLineCount;
property PreviewLineHeight: Integer read GetPreviewLineHeight;
property PreviewPlace: TcxGridPreviewPlace read GetPreviewPlace;
end;
TdxGridTableViewGroupRowProducer = class(TdxGridTableViewCustomDataRowProducer)
protected
procedure InitializeRow; override;
procedure InitializeIndent(AIndent: TdxReportCellExpandButton; AIndex: Integer); override;
procedure InitializeSubItem(ASubItem: TAbstractdxReportCellData; AIndex: Integer); override;
function GetAutoHeight: Boolean; override;
function GetIndentCount: Integer; override;
function GetLineCount: Integer; override;
function GetLineHeight: Integer; override;
function GetSubItemBound(Index: Integer): TRect; override;
function GetSubItemClass(Index: Integer): TdxReportCellDataClass; override;
function GetSubItemCount: Integer; override;
public
function GridRow: TcxGridGroupRow; reintroduce; overload;
end;
TdxGridTableViewMasterRowProducer = class(TdxGridTableViewDataRowProducer)
protected
procedure InitializeIndent(AIndent: TdxReportCellExpandButton; AIndex: Integer); override;
procedure InitializeSubItem(ASubItem: TAbstractdxReportCellData; AIndex: Integer); override;
function GetIndentCount: Integer; override;
public
function GridRow: TcxGridMasterDataRow; reintroduce; overload;
end;
TdxGridTableViewGroupFooterProducer = class(TdxGridTableViewCustomDataRowProducer)
private
FGroupLevel: Integer;
FIndex: Integer;
FItemsSite: TdxReportCell;
function GetGroupLevel: Integer;
function GetHostBounds: TRect;
protected
procedure AddSubItems(AParent: TdxReportCell); override;
procedure CalculateRowAutoHeight; override;
procedure FixupRowDataItemHeight(AnItem: TdxReportVisualItem); override;
procedure InitializeIndent(AIndent: TdxReportCellExpandButton; AIndex: Integer); override;
procedure InitializeRow; override;
procedure InitializeSubItem(ASubItem: TAbstractdxReportCellData; AIndex: Integer); override;
function GetAutoHeight: Boolean; override;
function GetHasSubItem(Index: Integer): Boolean; override;
function GetIndentCount: Integer; override;
function GetItemsSite: TdxReportCell; override;
function GetLineCount: Integer; override;
function GetLineHeight: Integer; override;
function GetSubItemBound(Index: Integer): TRect; override;
function GetSubItemClass(Index: Integer): TdxReportCellDataClass; override;
public
function Produce(AHostInfo: TdxGridAttributeHostInfo; AGridRow: TcxCustomGridRow;
AGroupLevel, AnIndex: Integer): TdxReportCell; reintroduce; virtual;
property GroupLevel: Integer read GetGroupLevel;
property HostBounds: TRect read GetHostBounds;
property Index: Integer read FIndex;
end;
TdxGridTableViewBandsProducer = class(TdxGridTableViewRowSubItemsProducer)
protected
procedure CalculateRowHeight; override;
procedure InitializeRow; override;
procedure InitializeSubItem(ASubItem: TAbstractdxReportCellData; AIndex: Integer); override;
function GetAutoHeight: Boolean; override;
function GetSubItemBound(Index: Integer): TRect; override;
function GetSubItemClass(Index: Integer): TdxReportCellDataClass; override;
function GetSubItemCount: Integer; override;
public
function Adapter: TdxGridBandedTableViewAdapter; reintroduce; overload;
function Builder: TdxGridBandedTableViewBuilder; reintroduce; overload;
function Formatter: TdxGridBandedTableViewFormatter; reintroduce; overload;
end;
TdxGridCardViewCardsRowProducer = class(TdxGridViewRowProducer)
protected
procedure CalculateRowHeight; override;
function GetAutoHeight: Boolean; override;
procedure InitializeRow; override;
public
function Adapter: TdxGridCardViewAdapter; reintroduce; overload;
function Builder: TdxGridCardViewBuilder; reintroduce; overload;
function Formatter: TdxGridCardViewFormatter; reintroduce; overload;
function CreateCard(AParent: TdxReportCell; AGridCard: TcxGridCard): TdxReportCard; virtual;
procedure InjectCard(ACard: TdxReportCard; AIndex: Integer); virtual;
function Produce(AHostInfo: TdxGridAttributeHostInfo;
ARowHeight: Integer): TdxReportCell; reintroduce; virtual;
end;
{$IFDEF CHARTVIEW}
TdxGridChartViewChartProducer = class(TdxGridViewCustomRowProducer)
private
FChartImage: TGraphic;
function GetChartImage: TGraphic;
function GetItem: TdxReportCellGraphic;
protected
procedure CalculateRowHeight; override;
function GetItemClass: TdxReportCellDataClass; override;
procedure InitializeItem; override;
property ChartImage: TGraphic read GetChartImage;
property Item: TdxReportCellGraphic read GetItem;
public
function Produce(AHostInfo: TdxGridAttributeHostInfo): TdxReportCell; override;
function Formatter: TdxGridChartViewFormatter; reintroduce; overload;
end;
{$ENDIF}
{ Options }
TdxGridReportLinkOptionsClass = class of TdxGridReportLinkOptions;
TdxGridReportLinkOptions = class(TdxCustomReportLinkOptions)
private
function GetReportLink: TdxGridReportLink;
public
property ReportLink: TdxGridReportLink read GetReportLink;
end;
TdxGridReportLinkOptionsCards = class;
TdxGridReportLinkCardsShadowClass = class of TdxGridReportLinkCardsShadow;
TdxGridReportLinkCardsShadow = class(TPersistent)
private
FColor: TColor;
FDepth: TdxGridCardShadowDepth;
FOptionsCards: TdxGridReportLinkOptionsCards;
FPosition: TdxGridCardShadowPosition;
function GetActualColor: TColor;
function GetVisible: Boolean;
procedure SetColor(Value: TColor);
procedure SetDepth(Value: TdxGridCardShadowDepth);
procedure SetPosition(Value: TdxGridCardShadowPosition);
protected
procedure Changed; dynamic;
public
constructor Create(AnOptionsCards: TdxGridReportLinkOptionsCards); virtual;
procedure Assign(Source: TPersistent); override;
procedure RestoreDefaults; virtual;
property ActualColor: TColor read GetActualColor;
property OptionsCards: TdxGridReportLinkOptionsCards read FOptionsCards;
property Visible: Boolean read GetVisible;
published
property Color: TColor read FColor write SetColor default clDefault;
property Depth: TdxGridCardShadowDepth read FDepth write SetDepth default dxDefaultCardsShadowDepth;
property Position: TdxGridCardShadowPosition read FPosition write SetPosition default cspBottomRight;
end;
TdxGridReportLinkOptionsCardsClass = class of TdxGridReportLinkOptionsCards;
TdxGridReportLinkOptionsCards = class(TdxGridReportLinkOptions)
private
FAutoWidth: Boolean;
FBorders: Boolean;
FInterCardsSpaceHorz: Integer;
FInterCardsSpaceVert: Integer;
FKeepSameHeight: Boolean;
FKeepSameWidth: Boolean;
FRowBordersHorz: Boolean;
FRowBordersVert: Boolean;
FShadow: TdxGridReportLinkCardsShadow;
function GetShadow: TdxGridReportLinkCardsShadow;
procedure SetAutoWidth(Value: Boolean);
procedure SetBorders(Value: Boolean);
procedure SetInterCardsSpaceHorz(Value: Integer);
procedure SetInterCardsSpaceVert(Value: Integer);
procedure SetKeepSameHeight(Value: Boolean);
procedure SetKeepSameWidth(Value: Boolean);
procedure SetRowBordersHorz(Value: Boolean);
procedure SetRowBordersVert(Value: Boolean);
procedure SetShadow(Value: TdxGridReportLinkCardsShadow);
protected
function DesignerTabIndex: Integer; override;
function GetShadowClass: TdxGridReportLinkCardsShadowClass; virtual;
public
destructor Destroy; override;
procedure Assign(Source: TPersistent); override;
procedure RestoreDefaults; override;
published
property AutoWidth: Boolean read FAutoWidth write SetAutoWidth default False;
property Borders: Boolean read FBorders write SetBorders default True;
property InterCardsSpaceHorz: Integer read FInterCardsSpaceHorz write SetInterCardsSpaceHorz default 4;
property InterCardsSpaceVert: Integer read FInterCardsSpaceVert write SetInterCardsSpaceVert default 4;
property KeepSameHeight: Boolean read FKeepSameHeight write SetKeepSameHeight default True;
property KeepSameWidth: Boolean read FKeepSameWidth write SetKeepSameWidth default True;
property RowBordersHorz: Boolean read FRowBordersHorz write SetRowBordersHorz default False;
property RowBordersVert: Boolean read FRowBordersVert write SetRowBordersVert default False;
property Shadow: TdxGridReportLinkCardsShadow read GetShadow write SetShadow;
end;
{$IFDEF CHARTVIEW}
TdxGridReportLinkOptionsChartsClass = class of TdxGridReportLinkOptionsCharts;
TdxGridReportLinkOptionsCharts = class(TdxGridReportLinkOptions)
private
FGraphicClass: TGraphicClass;
FIsGraphicClassAssigned: Boolean;
FTransparent: Boolean;
function GetGraphicClass: TGraphicClass;
function GetGraphicClassName: string;
function IsGraphicClassNameStored: Boolean;
procedure SetGraphicClass(Value: TGraphicClass);
procedure SetGraphicClassName(const Value: string);
procedure SetTransparent(Value: Boolean);
protected
function DesignerTabIndex: Integer; override;
public
procedure Assign(Source: TPersistent); override;
procedure RestoreDefaults; override;
function DefaultGraphicClass: TGraphicClass; virtual; //TBitmap
function SupportsGraphicClass(AGraphicClass: TGraphicClass): Boolean; virtual; //excluding TIcon
property GraphicClass: TGraphicClass read GetGraphicClass write SetGraphicClass;
published
property GraphicClassName: string read GetGraphicClassName write SetGraphicClassName stored IsGraphicClassNameStored;
property Transparent: Boolean read FTransparent write SetTransparent default False;
end;
{$ENDIF}
TdxGridReportLinkOptionsDetailsClass = class of TdxGridReportLinkOptionsDetails;
TdxGridReportLinkOptionsDetails = class(TdxGridReportLinkOptions)
private
FOnlyFocusedView: Boolean;
FStartFromFocusedView: Boolean;
procedure SetOnlyFocusedView(Value: Boolean);
procedure SetStartFromFocusedView(Value: Boolean);
protected
function DesignerTabIndex: Integer; override;
public
procedure Assign(Source: TPersistent); override;
procedure RestoreDefaults; override;
published
property OnlyFocusedView: Boolean read FOnlyFocusedView write SetOnlyFocusedView default False;
property StartFromFocusedView: Boolean read FStartFromFocusedView write SetStartFromFocusedView default False;
end;
TdxGridReportLinkOptionsExpanding = class(TdxCustomReportLinkOptionsExpanding)
private
{$IFDEF DXVER500}
FExpandCards: Boolean;
{$ENDIF}
FExpandGroupRows: Boolean;
FExpandMasterRows: Boolean;
function GetHasAny: Boolean;
function GetReportLink: TdxGridReportLink;
{$IFDEF DXVER500}
procedure SetExpandCards(Value: Boolean);
{$ENDIF}
procedure SetExpandGroupRows(Value: Boolean);
procedure SetExpandMasterRows(Value: Boolean);
protected
function DesignerTabIndex: Integer; override;
public
procedure Assign(Source: TPersistent); override;
procedure RestoreDefaults; override;
property HasAny: Boolean read GetHasAny;
property ReportLink: TdxGridReportLink read GetReportLink;
published
{$IFDEF DXVER500}
property ExpandCards: Boolean read FExpandCards write SetExpandCards default False;
{$ENDIF}
property ExpandGroupRows: Boolean read FExpandGroupRows write SetExpandGroupRows default False;
property ExpandMasterRows: Boolean read FExpandMasterRows write SetExpandMasterRows default False;
end;
TdxGridReportLinkOptionsFormatting = class(TdxCustomReportLinkOptionsFormatting)
private
FConsumeSelectionStyle: Boolean;
function GetReportLink: TdxGridReportLink;
procedure SetConsumeSelectionStyle(Value: Boolean);
protected
function DesignerTabIndex: Integer; override;
public
procedure Assign(Source: TPersistent); override;
procedure RestoreDefaults; override;
property ReportLink: TdxGridReportLink read GetReportLink;
published
property ConsumeSelectionStyle: Boolean read FConsumeSelectionStyle write SetConsumeSelectionStyle default False;
property UseLookAndFeelColors;
end;
TdxGridReportLinkOptionsLevelsClass = class of TdxGridReportLinkOptionsLevels;
TdxGridReportLinkOptionsLevels = class(TdxGridReportLinkOptions)
private
FRiseActiveLevelOntoTop: Boolean;
FUnwrap: Boolean;
FUnwrapTopLevel: Boolean;
procedure SetRiseActiveLevelOntoTop(Value: Boolean);
procedure SetUnwrap(Value: Boolean);
procedure SetUnwrapTopLevel(Value: Boolean);
protected
function DesignerTabIndex: Integer; override;
public
procedure Assign(Source: TPersistent); override;
procedure RestoreDefaults; override;
published
property RiseActiveLevelOntoTop: Boolean read FRiseActiveLevelOntoTop write SetRiseActiveLevelOntoTop default True;
property Unwrap: Boolean read FUnwrap write SetUnwrap default False;
property UnwrapTopLevel: Boolean read FUnwrapTopLevel write SetUnwrapTopLevel default True;
end;
TdxGridReportLinkOptionsOnEveryPage = class(TdxCustomTableControlReportLinkOptionsOnEveryPage)
private
FCaption: Boolean;
FFilterBar: Boolean;
function GetReportLink: TdxGridReportLink;
procedure SetCaption(Value: Boolean);
procedure SetFilterBar(Value: Boolean);
protected
function DesignerTabIndex: Integer; override;
public
procedure Assign(Source: TPersistent); override;
procedure RestoreDefaults; override;
function HasInstalledAttribute(AnAttribute: TdxGridAttributeClass): Boolean; virtual;
procedure SetAll; virtual;
procedure UnsetAll; virtual;
property ReportLink: TdxGridReportLink read GetReportLink;
published
property BandHeaders;
property Caption: Boolean read FCaption write SetCaption default True;
property FilterBar: Boolean read FFilterBar write SetFilterBar default True;
property Footers;
property Headers;
end;
TdxGridReportLinkOptionsPagination = class(TdxCustomTableControlReportLinkOptionsPagination)
private
FOneGroupPerPage: Boolean;
FTopLevelGroup: Boolean;
function GetReportLink: TdxGridReportLink;
procedure SetOneGroupPerPage(Value: Boolean);
procedure SetTopLevelGroup(Value: Boolean);
protected
function DesignerTabIndex: Integer; override;
public
procedure Assign(Source: TPersistent); override;
procedure RestoreDefaults; override;
property ReportLink: TdxGridReportLink read GetReportLink;
published
property Band;
property Column;
property Custom;
property OneGroupPerPage: Boolean read FOneGroupPerPage write SetOneGroupPerPage default False;
property Row;
property TopLevelGroup: Boolean read FTopLevelGroup write SetTopLevelGroup default False;
end;
TdxGridReportLinkOptionsPreview = class(TdxCustomTableControlReportLinkOptionsPreview)
private
function GetReportLink: TdxGridReportLink;
protected
function DesignerTabIndex: Integer; override;
public
property ReportLink: TdxGridReportLink read GetReportLink;
end;
TdxGridReportLinkOptionsRefinements = class(TdxCustomReportLinkOptionsRefinements)
private
function GetReportLink: TdxGridReportLink;
protected
function DesignerTabIndex: Integer; override;
public
property ReportLink: TdxGridReportLink read GetReportLink;
end;
TdxGridReportLinkOptionsSelection = class(TdxCustomTableControlReportLinkOptionsSelection)
private
function GetReportLink: TdxGridReportLink;
protected
function DesignerTabIndex: Integer; override;
public
property ReportLink: TdxGridReportLink read GetReportLink;
end;
TdxGridReportLinkOptionsSize = class(TdxCustomReportLinkOptionsSize)
private
function GetReportLink: TdxGridReportLink;
protected
function DesignerTabIndex: Integer; override;
public
property ReportLink: TdxGridReportLink read GetReportLink;
published
property AutoWidth;
end;
TdxGridReportLinkOptionsView = class(TdxCustomTableControlReportLinkOptionsView)
private
FCaption: Boolean;
FFilterBar: Boolean;
FGroupFooters: Boolean;
function GetReportLink: TdxGridReportLink;
procedure SetCaption(Value: Boolean);
procedure SetFilterBar(Value: Boolean);
procedure SetGroupFooters(Value: Boolean);
protected
function DesignerTabIndex: Integer; override;
public
procedure Assign(Source: TPersistent); override;
procedure RestoreDefaults; override;
function HasInstalledAttribute(AnAttribute: TdxGridAttributeClass): Boolean; virtual;
procedure SetAll;
procedure UnsetAll;
property ReportLink: TdxGridReportLink read GetReportLink;
published
property BandHeaders;
property Caption: Boolean read FCaption write SetCaption default True;
property ExpandButtons;
property FilterBar: Boolean read FFilterBar write SetFilterBar default True;
property Footers;
property GroupFooters: Boolean read FGroupFooters write SetGroupFooters default True;
property Headers;
end;
TdxGridAttributeHostInfo = class
private
FParent: TdxReportCell;
public
Origin: TPoint;
procedure Initialize(AParent: TdxReportCell);
property Parent: TdxReportCell read FParent;
end;
TdxGridAttributeHostInfoServicesClass = class of TdxGridAttributeHostInfoServices;
TdxGridAttributeHostInfoServices = class
private
FPageDetailsHostInfo: TdxGridAttributeHostInfo;
FPageFootersHostInfo: TdxGridAttributeHostInfo;
FPageHeadersHostInfo: TdxGridAttributeHostInfo;
FReportLink: TdxGridReportLink;
function GetActiveView: TcxCustomGridView;
function GetActiveViewHelper: TdxCustomGridViewHelperClass;
function GetArePageFootersAssigned: Boolean;
function GetArePageHeadersAssigned: Boolean;
function GetCanUseBandHeadersOnEveyPage: Boolean;
function GetCanUseCaptionOnEveryPage: Boolean;
function GetCanUseFilterBarOnEveryPage: Boolean;
function GetCanUseFootersOnEveryPage: Boolean;
function GetCanUseHeadersOnEveryPage: Boolean;
function GetIsInconsistentBandHeadersState: Boolean;
function GetIsInconsistentFilterBarState: Boolean;
function GetIsInconsistentFootersState: Boolean;
function GetIsInconsistentHeadersState: Boolean;
function GetLevelSeparatorBottomHostInfo: TdxGridAttributeHostInfo;
function GetLevelSeparatorTopHostInfo: TdxGridAttributeHostInfo;
function GetOptionsOnEveryPage: TdxGridReportLinkOptionsOnEveryPage;
function GetOptionsView: TdxGridReportLinkOptionsView;
function GetPageDetails: TdxReportCell;
function GetPageFooters: TdxReportCell;
function GetPageHeaders: TdxReportCell;
protected
procedure CreateHostInfos;
procedure DestroyHostInfos;
function GetBandHeadersHostInfo: TdxGridAttributeHostInfo; virtual;
function GetCaptionHostInfo: TdxGridAttributeHostInfo; virtual;
function GetFilterBarHostInfo: TdxGridAttributeHostInfo; virtual;
function GetFootersHostInfo: TdxGridAttributeHostInfo; virtual;
function GetHeadersHostInfo: TdxGridAttributeHostInfo; virtual;
function GetInconsistentStateText: string; virtual;
function GetIsInconsistentState: Boolean; virtual;
function HasCells: Boolean;
function IsAttributeSupported(AnAttribute: TdxGridAttributeClass): Boolean;
//function HasAttributeOnEveryPage: Boolean;
property ActiveView: TcxCustomGridView read GetActiveView;
property ActiveViewHelper: TdxCustomGridViewHelperClass read GetActiveViewHelper;
property OptionsOnEveryPage: TdxGridReportLinkOptionsOnEveryPage read GetOptionsOnEveryPage;
property OptionsView: TdxGridReportLinkOptionsView read GetOptionsView;
property PageDetails: TdxReportCell read GetPageDetails;
property PageFooters: TdxReportCell read GetPageFooters;
property PageHeaders: TdxReportCell read GetPageHeaders;
public
constructor Create(AReportLink: TdxGridReportLink); virtual;
destructor Destroy; override;
procedure Initialize;
property ArePageFootersAssigned: Boolean read GetArePageFootersAssigned;
property ArePageHeadersAssigned: Boolean read GetArePageHeadersAssigned;
property BandHeadersHostInfo: TdxGridAttributeHostInfo read GetBandHeadersHostInfo;
property CanUseBandHeadersOnEveyPage: Boolean read GetCanUseBandHeadersOnEveyPage;
property CanUseCaptionOnEveryPage: Boolean read GetCanUseCaptionOnEveryPage;
property CanUseFilterBarOnEveryPage: Boolean read GetCanUseFilterBarOnEveryPage;
property CanUseFootersOnEveryPage: Boolean read GetCanUseFootersOnEveryPage;
property CanUseHeadersOnEveryPage: Boolean read GetCanUseHeadersOnEveryPage;
property CaptionHostInfo: TdxGridAttributeHostInfo read GetCaptionHostInfo;
property FilterBarHostInfo: TdxGridAttributeHostInfo read GetFilterBarHostInfo;
property FootersHostInfo: TdxGridAttributeHostInfo read GetFootersHostInfo;
property HeadersHostInfo: TdxGridAttributeHostInfo read GetHeadersHostInfo;
property InconsistentStateText: string read GetInconsistentStateText;
property IsInconsistentBandHeadersState: Boolean read GetIsInconsistentBandHeadersState;
property IsInconsistentFilterBarState: Boolean read GetIsInconsistentFilterBarState;
property IsInconsistentFootersState: Boolean read GetIsInconsistentFootersState;
property IsInconsistentHeadersState: Boolean read GetIsInconsistentHeadersState;
property IsInconsistentState: Boolean read GetIsInconsistentState;
property LevelSeparatorBottomHostInfo: TdxGridAttributeHostInfo read GetLevelSeparatorBottomHostInfo;
property LevelSeparatorTopHostInfo: TdxGridAttributeHostInfo read GetLevelSeparatorTopHostInfo;
property PageDetailsHostInfo: TdxGridAttributeHostInfo read FPageDetailsHostInfo;
property PageFootersHostInfo: TdxGridAttributeHostInfo read FPageFootersHostInfo;
property PageHeadersHostInfo: TdxGridAttributeHostInfo read FPageHeadersHostInfo;
property ReportLink: TdxGridReportLink read FReportLink;
end;
TdxGridReportLinkStylesClass = class of TdxGridReportLinkStyles;
TdxGridReportLinkStyles = class(TdxCustomReportLinkStyles)
private
function GetReportLink: TdxGridReportLink;
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;
function IsCardViewStyle(AStyle: TcxStyle): Boolean;
public
procedure Assign(Source: TPersistent); override;
procedure GetBandHeaderParams(ABand: TcxGridBand; out AParams: TcxViewParams); virtual;
procedure GetCaptionParams(ATabLevel: TcxGridLevel; out AParams: TcxViewParams); virtual;
procedure GetCardCaptionRowParams(ARecord: TcxCustomGridRecord; AItem: TcxCustomGridTableItem;
out AParams: TcxViewParams); virtual;
procedure GetCardRowCaptionParams(ARecord: TcxCustomGridRecord; AItem: TcxCustomGridTableItem;
out AParams: TcxViewParams); virtual;
procedure GetContentParams(ARecord: TcxCustomGridRecord; AItem: TcxCustomGridTableItem;
out AParams: TcxViewParams); virtual;
procedure GetFilterBarParams(out AParams: TcxViewParams); virtual;
procedure GetFooterParams(ARecord: TcxCustomGridRecord; AGroupLevel: Integer;
AItem: TcxGridColumn; out AParams: TcxViewParams); virtual;
procedure GetGroupParams(ARecord: TcxCustomGridRecord; AGroupLevel: Integer;
out AParams: TcxViewParams); virtual;
procedure GetHeaderParams(AItem: TcxGridColumn; out AParams: TcxViewParams); virtual;
procedure GetPreviewParams(ARecord: TcxCustomGridRecord; AItem: TcxCustomGridTableItem;
out AParams: TcxViewParams); virtual;
procedure GetSelectionParams(out AParams: TcxViewParams); virtual;
property ReportLink: TdxGridReportLink read GetReportLink;
published
property BandHeader: TcxStyle Index vspsGridBandHeader read GetValue write SetValue;
property Caption: TcxStyle Index vspsGridCaption read GetValue write SetValue;
property CardCaptionRow: TcxStyle Index vspsGridCardCaptionRow read GetValue write SetValue;
property CardRowCaption: TcxStyle Index vspsGridCardRowCaption read GetValue write SetValue;
property Content: TcxStyle Index vspsGridContent read GetValue write SetValue;
property ContentEven: TcxStyle Index vspsGridContentEven read GetValue write SetValue;
property ContentOdd: TcxStyle Index vspsGridContentOdd read GetValue write SetValue;
property FilterBar: TcxStyle Index vspsGridFilterBar read GetValue write SetValue;
property Footer: TcxStyle Index vspsGridFooter read GetValue write SetValue;
property Group: TcxStyle Index vspsGridGroup read GetValue write SetValue;
property Header: TcxStyle Index vspsGridHeader read GetValue write SetValue;
property Preview: TcxStyle Index vspsGridPreview read GetValue write SetValue;
property Selection: TcxStyle Index vspsGridSelection read GetValue write SetValue;
property StyleSheet;
end;
TdxGridReportLinkStyleSheet = class(TdxCustomReportLinkStyleSheet)
private
function GetStylesValue: TdxGridReportLinkStyles;
procedure SetStylesValue(Value: TdxGridReportLinkStyles);
public
class function GetStylesClass: TcxCustomStylesClass; override;
published
property Styles: TdxGridReportLinkStyles read GetStylesValue write SetStylesValue;
end;
TdxGridReportLinkProcessParams = record
HasMasterDetails: Boolean;
HasMasterDetailsInTopView: Boolean;
HasOnlyCards: Boolean;
HasOnlyCharts: Boolean;
HasUnwrapableData: Boolean;
CanUseOnEveryPageMode: Boolean;
end;
TdxGridRecordArray = array of TcxCustomGridRecord;
TdxGridViewProc = procedure(AGridView: TcxCustomGridView) of object;
TdxGridGetCustomPageBreaksEvent = procedure(Sender: TdxGridReportLink) of object;
TdxGridReportLinkGetCellHeightEvent = procedure(Sender: TdxGridReportLink;
AView: TcxCustomGridTableView; ARecord: TcxCustomGridRecord;
ATableItem: TcxCustomGridTableItem; var AHeight: Integer) of object;
{ CustomDraw Events }
TdxGridReportLinkCustomDrawBandCellEvent = procedure(Sender: TdxGridReportLink;
ACanvas: TCanvas; AView: TcxGridBandedTableView; ABand: TcxGridBand;
AnItem: TdxReportCellString; var ADone: Boolean) of object;
TdxGridReportLinkCustomDrawCellEvent = procedure(Sender: TdxGridReportLink;
ACanvas: TCanvas; AView: TcxCustomGridTableView; ARecord: TcxCustomGridRecord;
AColumn: TcxGridColumn; AnItem: TAbstractdxReportCellData; var ADone: Boolean) of object;
TdxGridReportLinkCustomDrawCardRowCaptionCellEvent = procedure(Sender: TdxGridReportLink;
ACanvas: TCanvas; AView: TcxGridCardView; ACard: TcxGridCard; ARow: TcxGridCardViewRow;
AnItem: TdxReportCellString; var ADone: Boolean) of object;
TdxGridReportLinkCustomDrawCardRowDataCellEvent = procedure(Sender: TdxGridReportLink;
ACanvas: TCanvas; AView: TcxGridCardView; ACard: TcxGridCard; ARow: TcxGridCardViewRow;
AnItem: TAbstractdxReportCellData; var ADone: Boolean) of object;
TdxGridReportLinkCustomDrawFilterBarEvent = procedure(Sender: TdxGridReportLink;
ACanvas: TCanvas; AView: TcxCustomGridTableView; AnItem: TdxReportCellString;
var ADone: Boolean) of object;
TdxGridReportLinkCustomDrawFooterCellEvent = procedure(Sender: TdxGridReportLink;
ACanvas: TCanvas; AView: TcxGridTableView; ARecord: TcxCustomGridRecord;
AColumn: TcxGridColumn; ALevel: Integer; AnItem: TdxReportCellString;
var ADone: Boolean) of object;
TdxGridReportLinkCustomDrawHeaderCellEvent = procedure(Sender: TdxGridReportLink;
ACanvas: TCanvas; AView: TcxGridTableView; AColumn: TcxGridColumn;
AnItem: TdxReportCellString; var ADone: Boolean) of object;
TdxGridReportLinkCustomDrawLevelCaptionEvent = procedure(Sender: TdxGridReportLink;
ACanvas: TCanvas; AView: TcxCustomGridView; AnItem: TdxReportCellString;
var ADone: Boolean) of object;
{ Initializtion Events }
TdxGridReportLinkInitializeBandCellEvent = procedure(Sender: TdxGridReportLink;
AView: TcxGridBandedTableView; ABand: TcxGridBand; AnItem: TdxReportCellString) of object;
TdxGridReportLinkInitializeCellEvent = procedure(Sender: TdxGridReportLink;
AView: TcxCustomGridTableView; ARecord: TcxCustomGridRecord;
AColumn: TcxGridColumn; AnItem: TAbstractdxReportCellData) of object;
TdxGridReportLinkInitializeCardRowCaptionCellEvent = procedure(Sender: TdxGridReportLink;
AView: TcxGridCardView; ACard: TcxGridCard; ARow: TcxGridCardViewRow;
AnItem: TdxReportCellString) of object;
TdxGridReportLinkInitializeCardRowDataCellEvent = procedure(Sender: TdxGridReportLink;
AView: TcxGridCardView; ACard: TcxGridCard; ARow: TcxGridCardViewRow;
AnItem: TAbstractdxReportCellData) of object;
{$IFDEF CHARTVIEW}
TdxGridReportLinkInitializeChartCellEvent = procedure(Sender: TdxGridReportLink;
AView: TcxGridChartView; AnItem: TdxReportCellGraphic) of object;
{$ENDIF}
TdxGridReportLinkInitializeFilterBarEvent = procedure(Sender: TdxGridReportLink;
AView: TcxCustomGridTableView; AnItem: TdxReportCellString) of object;
TdxGridReportLinkInitializeFooterCellEvent = procedure(Sender: TdxGridReportLink;
AView: TcxGridTableView; ARecord: TcxCustomGridRecord;
AColumn: TcxGridColumn; ALevel: Integer; AnItem: TdxReportCellString) of object;
TdxGridReportLinkInitializeHeaderCellEvent = procedure(Sender: TdxGridReportLink;
AView: TcxGridTableView; AColumn: TcxGridColumn; AnItem: TdxReportCellString) of object;
TdxGridReportLinkInitializeLevelCaptionEvent = procedure(Sender: TdxGridReportLink;
AView: TcxCustomGridView; AnItem: TdxReportCellString) of object;
{ ReportLink }
TdxGridReportLink = class(TdxCustomTableControlReportLink)
private
FDelimitersHardVert: TList;
FHostInfoServices: TdxGridAttributeHostInfoServices;
FOptionsCards: TdxGridReportLinkOptionsCards;
{$IFDEF CHARTVIEW}
FOptionsCharts: TdxGridReportLinkOptionsCharts;
{$ENDIF}
FOptionsDetails: TdxGridReportLinkOptionsDetails;
FOptionsLevels: TdxGridReportLinkOptionsLevels;
FProcessedView: TcxCustomGridView;
FProcessParams: TdxGridReportLinkProcessParams;
FReportRows: TList;
FOnCustomDrawBandCell: TdxGridReportLinkCustomDrawBandCellEvent;
FOnCustomDrawCardRowCaptionCell: TdxGridReportLinkCustomDrawCardRowCaptionCellEvent;
FOnCustomDrawCardRowDataCell: TdxGridReportLinkCustomDrawCardRowDataCellEvent;
FOnCustomDrawCell: TdxGridReportLinkCustomDrawCellEvent;
FOnCustomDrawFilterBar: TdxGridReportLinkCustomDrawFilterBarEvent;
FOnCustomDrawFooterCell: TdxGridReportLinkCustomDrawFooterCellEvent;
FOnCustomDrawHeaderCell: TdxGridReportLinkCustomDrawHeaderCellEvent;
FOnCustomDrawLevelCaption: TdxGridReportLinkCustomDrawLevelCaptionEvent;
FOnGetCellHeight: TdxGridReportLinkGetCellHeightEvent;
FOnGetCustomPageBreaks: TdxGridGetCustomPageBreaksEvent;
FOnInitializeBandCell: TdxGridReportLinkInitializeBandCellEvent;
FOnInitializeCardRowCaptionCell: TdxGridReportLinkInitializeCardRowCaptionCellEvent;
FOnInitializeCardRowDataCell: TdxGridReportLinkInitializeCardRowDataCellEvent;
FOnInitializeCell: TdxGridReportLinkInitializeCellEvent;
{$IFDEF CHARTVIEW}
FOnInitializeChartCell: TdxGridReportLinkInitializeChartCellEvent;
{$ENDIF}
FOnInitializeFilterBar: TdxGridReportLinkInitializeFilterBarEvent;
FOnInitializeFooterCell: TdxGridReportLinkInitializeFooterCellEvent;
FOnInitializeHeaderCell: TdxGridReportLinkInitializeHeaderCellEvent;
FOnInitializeLevelCaption: TdxGridReportLinkInitializeLevelCaptionEvent;
function GetActiveStyles: TdxGridReportLinkStyles;
function GetActiveView: TcxCustomGridView;
function GetActiveViewHelper: TdxCustomGridViewHelperClass;
function GetActiveViewMasterRow: TcxGridMasterDataRow;
function GetActiveViewParentLevel: TcxGridLevel;
function GetDesignWindow: TdxfmGridReportLinkDesignWindow;
function GetGrid: TcxGrid;
function GetOptionsExpanding: TdxGridReportLinkOptionsExpanding;
function GetOptionsFormatting: TdxGridReportLinkOptionsFormatting;
function GetOptionsOnEveryPage: TdxGridReportLinkOptionsOnEveryPage;
function GetOptionsPagination: TdxGridReportLinkOptionsPagination;
function GetOptionsPreview: TdxGridReportLinkOptionsPreview;
function GetOptionsRefinements: TdxGridReportLinkOptionsRefinements;
function GetOptionsSelection: TdxGridReportLinkOptionsSelection;
function GetOptionsSize: TdxGridReportLinkOptionsSize;
function GetOptionsView: TdxGridReportLinkOptionsView;
function GetReportRow(Index: Integer): TdxReportCell;
function GetReportRowByGridRecord(GridRecord: TcxCustomGridRecord): TdxReportCell;
function GetReportRowCount: Integer;
function GetStyles: TdxGridReportLinkStyles;
procedure SetOnCustomDrawBandCell(Value: TdxGridReportLinkCustomDrawBandCellEvent);
procedure SetOnCustomDrawCell(Value: TdxGridReportLinkCustomDrawCellEvent);
procedure SetOnCustomDrawCardRowCaptionCell(Value: TdxGridReportLinkCustomDrawCardRowCaptionCellEvent);
procedure SetOnCustomDrawCardRowDataCell(Value: TdxGridReportLinkCustomDrawCardRowDataCellEvent);
procedure SetOnCustomDrawFilterBar(Value: TdxGridReportLinkCustomDrawFilterBarEvent);
procedure SetOnCustomDrawFooterCell(Value: TdxGridReportLinkCustomDrawFooterCellEvent);
procedure SetOnCustomDrawHeaderCell(Value: TdxGridReportLinkCustomDrawHeaderCellEvent);
procedure SetOnCustomDrawLevelCaption(Value: TdxGridReportLinkCustomDrawLevelCaptionEvent);
procedure SetOptionsCards(Value: TdxGridReportLinkOptionsCards);
{$IFDEF CHARTVIEW}
procedure SetOptionsCharts(Value: TdxGridReportLinkOptionsCharts);
{$ENDIF}
procedure SetOptionsDetails(Value: TdxGridReportLinkOptionsDetails);
procedure SetOptionsExpanding(Value: TdxGridReportLinkOptionsExpanding);
procedure SetOptionsFormatting(Value: TdxGridReportLinkOptionsFormatting);
procedure SetOptionsLevels(Value: TdxGridReportLinkOptionsLevels);
procedure SetOptionsOnEveryPage(Value: TdxGridReportLinkOptionsOnEveryPage);
procedure SetOptionsPagination(Value: TdxGridReportLinkOptionsPagination);
procedure SetOptionsPreview(Value: TdxGridReportLinkOptionsPreview);
procedure SetOptionsRefinements(Value: TdxGridReportLinkOptionsRefinements);
procedure SetOptionsSelection(Value: TdxGridReportLinkOptionsSelection);
procedure SetOptionsSize(Value: TdxGridReportLinkOptionsSize);
procedure SetOptionsView(Value: TdxGridReportLinkOptionsView);
procedure SetStyles(Value: TdxGridReportLinkStyles);
protected
procedure BeforeDesignReport; override;
procedure ConstructReport(AReportCells: TdxReportCells); override;
procedure ConvertCoords; override;
procedure CustomDraw(AItem: TAbstractdxReportCellData; ACanvas: TCanvas;
ABoundsRect, AClientRect: TRect; var ADone: Boolean); override;
function GetBreakPagesByHardDelimiters: Boolean; override;
function GetEmptyPagesCanExist: Boolean; override;
function GetRebuildOnPageParamsChange(AUpdateCodes: TdxPrinterPageUpdateCodes): Boolean; override;
function GetUseHardVertDelimiters: Boolean; override;
procedure InternalRestoreDefaults; override;
procedure InternalRestoreFromOriginal; override;
function IsDrawFootersOnEveryPage: Boolean; override;
function IsDrawHeadersOnEveryPage: Boolean; override;
function IsSupportedCustomDraw(Item: TAbstractdxReportCellData): Boolean; override;
procedure MakeHardDelimiters(AReportCells: TdxReportCells; AVertDelimiters: TList); override;
function GetAreNativeStylesAvailable: Boolean; override;
function GetStylesClass: TdxCustomReportLinkStylesClass; override;
function GetStyleSheetClass: TdxCustomReportLinkStyleSheetClass; override;
function GetStyleSheetPrototype: TdxCustomReportLinkStyleSheet; override;
procedure PrepareConstruct; override;
procedure DoCustomDrawBandCell(ACanvas: TCanvas; AView: TcxGridBandedTableView;
ABand: TcxGridBand; AnItem: TdxReportCellString; var ADone: Boolean); dynamic;
procedure DoCustomDrawCardRowCaptionCell(ACanvas: TCanvas; AView: TcxGridCardView;
ACard: TcxGridCard; ARow: TcxGridCardViewRow; AnItem: TdxReportCellString;
var ADone: Boolean); dynamic;
procedure DoCustomDrawCardRowDataCell(ACanvas: TCanvas; AView: TcxGridCardView;
ACard: TcxGridCard; ARow: TcxGridCardViewRow; AnItem: TAbstractdxReportCellData;
var ADone: Boolean); dynamic;
procedure DoCustomDrawCell(ACanvas: TCanvas; AView: TcxCustomGridTableView;
ARecord: TcxCustomGridRecord; AColumn: TcxGridColumn;
AnItem: TAbstractdxReportCellData; var ADone: Boolean); dynamic;
procedure DoCustomDrawFilterBar(ACanvas: TCanvas; AView: TcxCustomGridTableView;
AnItem: TdxReportCellString; var ADone: Boolean); dynamic;
procedure DoCustomDrawFooterCell(ACanvas: TCanvas; AView: TcxGridTableView;
ARecord: TcxCustomGridRecord; AColumn: TcxGridColumn; ALevel: Integer;
AnItem: TdxReportCellString; var ADone: Boolean); dynamic;
procedure DoCustomDrawHeaderCell(ACanvas: TCanvas; AView: TcxGridTableView;
AColumn: TcxGridColumn; AnItem: TdxReportCellString; var ADone: Boolean); dynamic;
procedure DoCustomDrawLevelCaption(ACanvas: TCanvas; AView: TcxCustomGridView;
AnItem: TdxReportCellString; var ADone: Boolean); dynamic;
procedure DoGetCellHeight(AView: TcxCustomGridTableView; ARecord: TcxCustomGridRecord;
ATableItem: TcxCustomGridTableItem; var AHeight: Integer); dynamic;
procedure DoGetCustomPageBreaks; dynamic;
procedure DoInitializeBandCell(AView: TcxGridBandedTableView; ABand: TcxGridBand;
AnItem: TdxReportCellString); dynamic;
procedure DoInitializeCardRowCaptionCell(AView: TcxGridCardView; ACard: TcxGridCard;
ARow: TcxGridCardViewRow; AnItem: TdxReportCellString); dynamic;
procedure DoInitializeCardRowDataCell(AView: TcxGridCardView; ACard: TcxGridCard;
ARow: TcxGridCardViewRow; AnItem: TAbstractdxReportCellData); dynamic;
procedure DoInitializeCell(AView: TcxCustomGridTableView; ARecord: TcxCustomGridRecord;
AColumn: TcxGridColumn; AnItem: TAbstractdxReportCellData); dynamic;
{$IFDEF CHARTVIEW}
procedure DoInitializeChartCell(AView: TcxGridChartView; AnItem: TdxReportCellGraphic); dynamic;
{$ENDIF}
procedure DoInitializeFilterBar(AView: TcxCustomGridTableView; AnItem: TdxReportCellString); dynamic;
procedure DoInitializeFooterCell(AView: TcxGridTableView; ARecord: TcxCustomGridRecord;
AColumn: TcxGridColumn; ALevel: Integer; AnItem: TdxReportCellString); dynamic;
procedure DoInitializeHeaderCell(AView: TcxGridTableView; AColumn: TcxGridColumn;
AnItem: TdxReportCellString); dynamic;
procedure DoInitializeLevelCaption(AView: TcxCustomGridView; AnItem: TdxReportCellString); dynamic;
procedure CreateOptions; override;
procedure DestroyOptions; override;
function GetOptionsCardsClass: TdxGridReportLinkOptionsCardsClass; virtual;
{$IFDEF CHARTVIEW}
function GetOptionsChartsClass: TdxGridReportLinkOptionsChartsClass; virtual;
{$ENDIF}
function GetOptionsDetailsClass: TdxGridReportLinkOptionsDetailsClass; virtual;
function GetOptionsExpandingClass: TdxCustomReportLinkOptionsExpandingClass; override;
function GetOptionsFormattingClass: TdxCustomReportLinkOptionsFormattingClass; override;
function GetOptionsLevelsClass: TdxGridReportLinkOptionsLevelsClass; virtual;
function GetOptionsOnEveryPageClass: TdxCustomTableControlReportLinkOptionsOnEveryPageClass; override;
function GetOptionsPaginationClass: TdxCustomReportLinkOptionsPaginationClass; override;
function GetOptionsPreviewClass: TdxCustomTableControlReportLinkOptionsPreviewClass; override;
function GetOptionsRefinementsClass: TdxCustomReportLinkOptionsRefinementsClass; override;
function GetOptionsSelectionClass: TdxCustomTableControlReportLinkOptionsSelectionClass; override;
function GetOptionsSizeClass: TdxCustomReportLinkOptionsSizeClass; override;
function GetOptionsViewClass: TdxCustomReportLinkOptionsViewClass; override;
procedure AddReportRow(AReportRow: TdxReportCell);
procedure AddVerticalHardDelimiter(ADelimiter: TdxReportCell); overload;
procedure AddVerticalHardDelimiter(ADelimiter: Integer); overload;
procedure BuildTopLevelView(AGridView: TcxCustomGridView);
procedure BuildTopLevelViews;
procedure BuildView(AMasterBuilder: TdxCustomGridViewBuilder; AGridView: TcxCustomGridView);
function CreateViewAdapter(AMasterAdapter: TdxCustomGridViewAdapter; AGridView: TcxCustomGridView): TdxCustomGridViewAdapter;
function CreateViewBuilder(AMasterBuilder: TdxCustomGridViewBuilder; AGridView: TcxCustomGridView): TdxCustomGridViewBuilder;
procedure DoExpandRows;
procedure DoExpandViewRows(AGridView: TcxCustomGridView);
procedure ForEachView(AMasterRow: TcxGridMasterDataRow; AProc: TdxGridViewProc);
function GetItemCustomDrawInfo(AnItem: TdxReportVisualItem; out ADrawInfo: TdxGridCellCustomDrawInfo): TdxGridAttributeID; virtual;
function HasSiblings(AGridView: TcxCustomGridView): Boolean;
function IsCardViewStyle(AStyle: TcxStyle): Boolean; virtual;
function IsCustomDrawn(AnAttributeID: TdxGridAttributeID): Boolean; virtual;
function IsOffice11StyleGrouping: Boolean;
procedure CalculateProcessParams;
function CanAttributeBeUsedOnEveryPage(AnAttribute: TdxGridAttributeClass): Boolean;
function IsAttributeUsedOnEveryPage(AnAttribute: TdxGridAttributeClass): Boolean;
property ActiveStyles: TdxGridReportLinkStyles read GetActiveStyles;
property ActiveView: TcxCustomGridView read GetActiveView;
property ActiveViewHelper: TdxCustomGridViewHelperClass read GetActiveViewHelper;
property ActiveViewMasterRow: TcxGridMasterDataRow read GetActiveViewMasterRow;
property ActiveViewParentLevel: TcxGridLevel read GetActiveViewParentLevel;
property DelimitersHardVert: TList read FDelimitersHardVert;
property HostInfoServices: TdxGridAttributeHostInfoServices read FHostInfoServices;
property ProcessParams: TdxGridReportLinkProcessParams read FProcessParams;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Assign(Source: TPersistent); override;
procedure AddPageBreak(AGridRecord: TcxCustomGridRecord); overload;
procedure AddPageBreak(const AGridRecords: array of TcxCustomGridRecord); overload;
procedure AddPageBreak(const AGridRecords: TdxGridRecordArray); overload;
procedure AddPageBreak(AGridRecords: TList); overload; // list of TcxCustomGridRecord
property Grid: TcxGrid read GetGrid;
property DesignWindow: TdxfmGridReportLinkDesignWindow read GetDesignWindow;
property ReportRows[Index: Integer]: TdxReportCell read GetReportRow;
property ReportRowsByGridRecord[GridRow: TcxCustomGridRecord]: TdxReportCell read GetReportRowByGridRecord;
property ReportRowCount: Integer read GetReportRowCount;
published
property Color;
property Font;
property OptionsCards: TdxGridReportLinkOptionsCards read FOptionsCards write SetOptionsCards;
{$IFDEF CHARTVIEW}
property OptionsCharts: TdxGridReportLinkOptionsCharts read FOptionsCharts write SetOptionsCharts;
{$ENDIF}
property OptionsDetails: TdxGridReportLinkOptionsDetails read FOptionsDetails write SetOptionsDetails;
property OptionsExpanding: TdxGridReportLinkOptionsExpanding read GetOptionsExpanding write SetOptionsExpanding;
property OptionsFormatting: TdxGridReportLinkOptionsFormatting read GetOptionsFormatting write SetOptionsFormatting;
property OptionsLevels: TdxGridReportLinkOptionsLevels read FOptionsLevels Write SetOptionsLevels;
property OptionsOnEveryPage: TdxGridReportLinkOptionsOnEveryPage read GetOptionsOnEveryPage write SetOptionsOnEveryPage;
property OptionsPagination: TdxGridReportLinkOptionsPagination read GetOptionsPagination write SetOptionsPagination;
property OptionsPreview: TdxGridReportLinkOptionsPreview read GetOptionsPreview write SetOptionsPreview;
property OptionsRefinements: TdxGridReportLinkOptionsRefinements read GetOptionsRefinements write SetOptionsRefinements;
property OptionsSelection: TdxGridReportLinkOptionsSelection read GetOptionsSelection write SetOptionsSelection;
property OptionsSize: TdxGridReportLinkOptionsSize read GetOptionsSize write SetOptionsSize;
property OptionsView: TdxGridReportLinkOptionsView read GetOptionsView write SetOptionsView;
property ScaleFonts;
property StyleRepository;
property Styles: TdxGridReportLinkStyles read GetStyles write SetStyles;
property SupportedCustomDraw;
property OnCustomDrawBandCell: TdxGridReportLinkCustomDrawBandCellEvent read FOnCustomDrawBandCell
write SetOnCustomDrawBandCell;
property OnCustomDrawCell: TdxGridReportLinkCustomDrawCellEvent read FOnCustomDrawCell
write SetOnCustomDrawCell;
property OnCustomDrawCardRowCaptionCell: TdxGridReportLinkCustomDrawCardRowCaptionCellEvent read FOnCustomDrawCardRowCaptionCell
write SetOnCustomDrawCardRowCaptionCell;
property OnCustomDrawCardRowDataCell: TdxGridReportLinkCustomDrawCardRowDataCellEvent read FOnCustomDrawCardRowDataCell
write SetOnCustomDrawCardRowDataCell;
property OnCustomDrawFilterBar: TdxGridReportLinkCustomDrawFilterBarEvent read FOnCustomDrawFilterBar
write SetOnCustomDrawFilterBar;
property OnCustomDrawFooterCell: TdxGridReportLinkCustomDrawFooterCellEvent read FOnCustomDrawFooterCell
write SetOnCustomDrawFooterCell;
property OnCustomDrawHeaderCell: TdxGridReportLinkCustomDrawHeaderCellEvent read FOnCustomDrawHeaderCell
write SetOnCustomDrawHeaderCell;
property OnCustomDrawLevelCaption: TdxGridReportLinkCustomDrawLevelCaptionEvent read FOnCustomDrawLevelCaption
write SetOnCustomDrawLevelCaption;
property OnGetCellHeight: TdxGridReportLinkGetCellHeightEvent read FOnGetCellHeight write FOnGetCellHeight;
property OnGetCustomPageBreaks: TdxGridGetCustomPageBreaksEvent read FOnGetCustomPageBreaks write FOnGetCustomPageBreaks;
property OnInitializeBandCell: TdxGridReportLinkInitializeBandCellEvent read FOnInitializeBandCell
write FOnInitializeBandCell;
property OnInitializeCardRowCaptionCell: TdxGridReportLinkInitializeCardRowCaptionCellEvent read FOnInitializeCardRowCaptionCell
write FOnInitializeCardRowCaptionCell;
property OnInitializeCardRowDataCell: TdxGridReportLinkInitializeCardRowDataCellEvent read FOnInitializeCardRowDataCell
write FOnInitializeCardRowDataCell;
property OnInitializeCell: TdxGridReportLinkInitializeCellEvent read FOnInitializeCell
write FOnInitializeCell;
{$IFDEF CHARTVIEW}
property OnInitializeChartCell: TdxGridReportLinkInitializeChartCellEvent read FOnInitializeChartCell
write FOnInitializeChartCell;
{$ENDIF}
property OnInitializeFilterBar: TdxGridReportLinkInitializeFilterBarEvent read FOnInitializeFilterBar
write FOnInitializeFilterBar;
property OnInitializeFooterCell: TdxGridReportLinkInitializeFooterCellEvent read FOnInitializeFooterCell
write FOnInitializeFooterCell;
property OnInitializeHeaderCell: TdxGridReportLinkInitializeHeaderCellEvent read FOnInitializeHeaderCell
write FOnInitializeHeaderCell;
property OnInitializeLevelCaption: TdxGridReportLinkInitializeLevelCaptionEvent read FOnInitializeLevelCaption
write FOnInitializeLevelCaption;
end;
TcxGridCardView2OptionsView = class(TcxGridCardViewOptionsView)
private
FCardBorders: Boolean;
FGridLineColor: TColor;
FGridLines: TcxGridLines;
FShadowDepth: Integer;
function GetShadowVisible: Boolean;
procedure SetCardBorders(Value: Boolean);
procedure SetGridLineColor(Value: TColor);
procedure SetGridLines(Value: TcxGridLines);
procedure SetShadowDepth(Value: Integer);
public
constructor Create(AGridView: TcxCustomGridView); override;
procedure Assign(Source: TPersistent); override;
property ShadowVisible: Boolean read GetShadowVisible;
published
property CardBorders: Boolean read FCardBorders write SetCardBorders default False;
property GridLineColor: TColor read FGridLineColor write SetGridLineColor default clDefault;
property GridLines: TcxGridLines read FGridLines write SetGridLines default glNone;
property ShadowDepth: Integer read FShadowDepth write SetShadowDepth;
end;
TcxGridCardView2Styles = class(TcxGridCardViewStyles)
private
FOnGetCardShadowStyle: TcxGridGetRecordStyleEvent;
protected
procedure GetDefaultViewParams(Index: Integer; AData: TObject; out AParams: TcxViewParams); override;
public
procedure Assign(Source: TPersistent); override;
procedure GetCardShadowParams(ARecord: TcxCustomGridRecord; out AParams: TcxViewParams); virtual;
published
property CardShadow: TcxStyle index vsCardShadow read GetValue write SetValue;
property OnGetCardShadowStyle: TcxGridGetRecordStyleEvent read FOnGetCardShadowStyle
write FOnGetCardShadowStyle;
end;
TcxGridCardView2 = class(TcxGridCardView)
protected
function GetOptionsViewClass: TcxCustomGridOptionsViewClass; override;
function GetStylesClass: TcxCustomGridViewStylesClass; override;
function GetViewDataClass: TcxCustomGridViewDataClass; override;
function GetViewInfoClass: TcxCustomGridViewInfoClass; override;
end;
TdxfmGridReportLinkDesignWindow = class(TdxfmCustomcxControlReportLinkDesignWindow)
PageControl1: TPageControl;
tshView: TTabSheet;
tshBehaviors: TTabSheet;
tshPreview: TTabSheet;
tshCards: TTabSheet;
lblShow: TLabel;
imgShow: TImage;
bvlShow: TBevel;
chbxShowBands: TCheckBox;
chbxShowHeaders: TCheckBox;
chbxShowFooters: TCheckBox;
chbxShowGroupFooters: TCheckBox;
chbxShowExpandButtons: TCheckBox;
lblOnEveryPage: TLabel;
imgOnEveryPage: TImage;
bvlOnEveryPage: TBevel;
chbxBandsOnEveryPage: TCheckBox;
chbxHeadersOnEveryPage: TCheckBox;
chbxFootersOnEveryPage: TCheckBox;
chbxFilterBarOnEveryPage: TCheckBox;
chbxCaptionsOnEveryPage: TCheckBox;
bvlWarningHost: TBevel;
lblSelection: TLabel;
imgSelection: TImage;
chbxProcessSelection: TCheckBox;
chbxProcessExactSelection: TCheckBox;
bvlSelection: TBevel;
lblExpanding: TLabel;
imgExpanding: TImage;
chbxExpandGroupRows: TCheckBox;
bvlExpanding: TBevel;
chbxExpandMasterRows: TCheckBox;
lblPreviewOptions: TLabel;
bvlPreviewOptions: TBevel;
chbxPreviewVisible: TCheckBox;
chbxPreviewAutoHeight: TCheckBox;
lblPreviewMaxLineCount: TLabel;
bvlPreviewMaxLineCountHost: TBevel;
chbxShowCaptions: TCheckBox;
chbxShowFilterBar: TCheckBox;
imgPreview: TImage;
chbxStartFromActiveView: TCheckBox;
chbxOnlyActiveView: TCheckBox;
lblDetails: TLabel;
bvlDetails: TBevel;
imgDetails: TImage;
tshFormatting: TTabSheet;
lblLookAndFeel: TLabel;
bvlLookAndFeel: TBevel;
imgLookAndFeel: TImage;
cbxLookAndFeel: TComboBox;
chbxFlatCheckMarks: TCheckBox;
chbxDisplayGraphicsAsText: TCheckBox;
chbxTransparentGraphics: TCheckBox;
imgRefinements: TImage;
lblRefinements: TLabel;
bvlRefinements: TBevel;
bvlCardSpaceVertHost: TBevel;
bvlCardSpaceHorzHost: TBevel;
lblCardSpaceVert: TLabel;
lblCardSpaceHorz: TLabel;
imgCardSpacing: TImage;
lblCardSpacing: TLabel;
bvlCardSpacing: TBevel;
bvlCardSizes: TBevel;
lblCardSizes: TLabel;
imgCardSizes: TImage;
chbxCardsKeepSameHeight: TCheckBox;
chbxCardsKeepSameWidth: TCheckBox;
chbxCardsAutoWidth: TCheckBox;
chbxCardsVertLines: TCheckBox;
chbxCardsHorzLines: TCheckBox;
chbxCardsBorder: TCheckBox;
imgCardFraming: TImage;
lblCardFraming: TLabel;
bvlCardFraming: TBevel;
bvlCardShadowColorHost: TBevel;
lblCardShadowDepth: TLabel;
bvlCardShadow: TBevel;
lblCardShadow: TLabel;
lblCardShadowColor: TLabel;
bvlCardShadowDepthHost: TBevel;
imgCardShadow: TImage;
pnlPreview: TPanel;
PreviewGrid: TcxGrid;
PreviewBandedView: TcxGridBandedTableView;
colVendorName: TcxGridBandedColumn;
colVendorLogo: TcxGridBandedColumn;
colVendorCountry: TcxGridBandedColumn;
colCarModel: TcxGridBandedColumn;
colIsSUVModel: TcxGridBandedColumn;
PreviewGridLevel: TcxGridLevel;
chbxLevelsUnwrap: TCheckBox;
imgLevels: TImage;
lblLevels: TLabel;
bvlLevels: TBevel;
chbxLevelsUnwrapTopLevel: TCheckBox;
chbxLevelsRiseActiveLevelOntoTop: TCheckBox;
chbxSuppressBackgroundBitmaps: TCheckBox;
tshStyles: TTabSheet;
btnStyleColor: TButton;
btnStyleFont: TButton;
btnStyleBackgroundBitmap: TButton;
chbxUseNativeStyles: TCheckBox;
bvlStyles: TBevel;
pmStyles: TPopupMenu;
miStyleFont: TMenuItem;
miStyleBackgroundBitmap: TMenuItem;
miStyleColor: TMenuItem;
bvlStyleSheets: TBevel;
lblStyleSheets: TLabel;
cbxStyleSheets: TComboBox;
btnStyleSheetNew: TButton;
btnStyleSheetCopy: TButton;
btnStyleSheetDelete: TButton;
milLine: TMenuItem;
miStylesSaveAs: TMenuItem;
btnStylesSaveAs: TButton;
btnStyleSheetRename: TButton;
miStyleBackgroundBitmapClear: TMenuItem;
btnStyleBackgroundBitmapClear: TButton;
btnStyleRestoreDefaults: TButton;
miStyleRestoreDefaults: TMenuItem;
miLine2: TMenuItem;
miLine3: TMenuItem;
bvlStylesHost: TBevel;
ilStylesPopup: TImageList;
miStylesSelectAll: TMenuItem;
miLine4: TMenuItem;
lblGridSize: TLabel;
bvlGridSize: TBevel;
imgGridSize: TImage;
chbxGridAutoWidth: TCheckBox;
chbxConsumeSelectionStyle: TCheckBox;
bvlRefinementsSeparator: TBevel;
lblPagination: TLabel;
bvlPagination: TBevel;
imgPagination: TImage;
chbxPaginateOneGroupPerPage: TCheckBox;
chbxPaginateByTopLevelGroups: TCheckBox;
lblPreviewWindow: TStaticText;
cxStyleRepository1: TcxStyleRepository;
styleCardShadow: TcxStyle;
styleCardBorder: TcxStyle;
Label1: TLabel;
chbxExpandCards: TCheckBox;
lblUseNativeStyles: TLabel;
tshCharts: TTabSheet;
lblChartsOptions: TLabel;
imgCharts: TImage;
chbxChartsTransparent: TCheckBox;
bvlChartsOptions: TBevel;
procedure OptionsViewClick(Sender: TObject);
procedure OptionsOnEveryPageClick(Sender: TObject);
procedure OptionsSelectionClick(Sender: TObject);
procedure OptionsExpandingClick(Sender: TObject);
procedure OptionsRefinementClick(Sender: TObject);
procedure LookAndFeelClick(Sender: TObject);
procedure PreviewVisibleClick(Sender: TObject);
procedure PreviewAutoHeightClick(Sender: TObject);
procedure OptionsCardsClick(Sender: TObject);
procedure IsSUVModelCustomDrawCell(Sender: TcxCustomGridTableView;
ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo;
var ADone: Boolean);
procedure VendorLogoCustomDrawCell(Sender: TcxCustomGridTableView;
ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo;
var ADone: Boolean);
procedure PreviewBandedViewCustomDrawColumnHeader(
Sender: TcxGridTableView; ACanvas: TcxCanvas;
AViewInfo: TcxGridColumnHeaderViewInfo; var ADone: Boolean);
procedure PreviewBandedViewCustomDrawBandHeader(
Sender: TcxGridBandedTableView; ACanvas: TcxCanvas;
AViewInfo: TcxGridBandHeaderViewInfo; var ADone: Boolean);
procedure PreviewBandedViewCustomDrawFooterCell(
Sender: TcxGridTableView; ACanvas: TcxCanvas;
AViewInfo: TcxGridColumnHeaderViewInfo; var ADone: Boolean);
procedure OptionsDetailsClick(Sender: TObject);
procedure OptionsSizeClick(Sender: TObject);
procedure OptionsLevelsClick(Sender: TObject);
procedure OptionsFormatingClick(Sender: TObject);
procedure StyleColorClick(Sender: TObject);
procedure StyleFontClick(Sender: TObject);
procedure StyleBackgroundBitmapClick(Sender: TObject);
procedure lbxStylesClick(Sender: TObject);
procedure pmStylesPopup(Sender: TObject);
procedure cbxStyleSheetsClick(Sender: TObject);
procedure StyleSheetNewClick(Sender: TObject);
procedure StyleSheetCopyClick(Sender: TObject);
procedure StyleSheetDeleteClick(Sender: TObject);
procedure StylesSaveAsClick(Sender: TObject);
procedure cbxStyleSheetsKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure StyleSheetRenameClick(Sender: TObject);
procedure PageControl1Change(Sender: TObject);
procedure StyleBackgroundBitmapClearClick(Sender: TObject);
procedure StyleRestoreDefaultsClick(Sender: TObject);
procedure miStylesSelectAllClick(Sender: TObject);
procedure OptionsPaginationClick(Sender: TObject);
procedure cbxStyleSheetsDrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
procedure lblUseNativeStylesClick(Sender: TObject);
procedure chbxChartsTransparentClick(Sender: TObject);
private
ccbxCardsShadowColor: TdxPSColorCombo;
lbxStyles: TdxStylesListBox;
PreviewCardView: TcxGridCardView2;
rowVendorName: TcxGridCardViewRow;
rowVendorLogo: TcxGridCardViewRow;
rowVendorCountry: TcxGridCardViewRow;
rowCarModel: TcxGridCardViewRow;
rowIsSuvModel: TcxGridCardViewRow;
seCardsShadowDepth: TdxPSSpinEdit;
seCardsSpaceHorz: TdxPSSpinEdit;
seCardsSpaceVert: TdxPSSpinEdit;
sePreviewMaxLineCount: TdxPSSpinEdit;
wpIncorrectOnEveryPageState: TdxPSWarningPane;
function GetActiveStyle: TcxStyle;
function GetHasSelectedStyles: Boolean;
function GetHasSelectedStylesWithAssignedBitmap: Boolean;
function GetReportLink: TdxGridReportLink;
procedure CardShadowDepthChanged(Sender: TObject);
procedure CardShadowColorChanged(Sender: TObject);
procedure CardSpaceHorzChanged(Sender: TObject);
procedure CardSpaceVertChanged(Sender: TObject);
procedure PreviewMaxLineCountChanged(Sender: TObject);
function CanSelectAllStyles: Boolean;
procedure ChangeActiveView(AView: TcxCustomGridView);
procedure CreateCardView;
procedure CreateControls;
procedure CustomDrawBorders(ACanvas: TcxCanvas; AViewInfo: TcxCustomGridCellViewInfo);
procedure CustomDrawFooter(ACanvas: TcxCanvas; R: TRect; AViewInfo: TcxCustomGridCellViewInfo);
procedure CustomDrawHeader(ACanvas: TcxCanvas; R: TRect; AViewInfo: TcxCustomGridCellViewInfo);
procedure CustomDrawTextRect(ACanvas: TcxCanvas; R: TRect; AViewInfo: TcxCustomGridCellViewInfo;
ABackgroundBitmap: TBitmap);
procedure InitializePreviewGrid;
procedure InitializePreviewGridStyles;
procedure LoadDataIntoPreviewGridView(AView: TcxCustomGridTableView);
procedure RecreateStylesListBox;
procedure RestoreSelectedStyles(AList: TList);
procedure SaveSelectedStyles(AList: TList);
procedure SetActivePage;
procedure UpdatePreviewGridStyles(const ACaption: string; AStyle: TcxStyle);
procedure UpdateWarningPane;
procedure SetOptionsCardsByIndex(Index: Integer; Value: Boolean);
procedure SetOptionsChartsByIndex(Index: Integer; Value: Boolean);
procedure SetOptionsDetailsByIndex(Index: Integer; Value: Boolean);
procedure SetOptionsExpandingByIndex(Index: Integer; Value: Boolean);
procedure SetOptionsFormattingByIndex(Index: Integer; Value: Boolean);
procedure SetOptionsLevelsByIndex(Index: Integer; Value: Boolean);
procedure SetOptionsOnEveryPageByIndex(Index: Integer; Value: Boolean);
procedure SetOptionsPaginationByIndex(Index: Integer; Value: Boolean);
procedure SetOptionsRefinementsByIndex(Index: Integer; Value: Boolean);
procedure SetOptionsSelectionByIndex(Index: Integer; Value: Boolean);
procedure SetOptionsSizeByIndex(Index: Integer; Value: Boolean);
procedure SetOptionsViewByIndex(Index: Integer; Value: Boolean);
protected
procedure DoInitialize; override;
{$IFDEF DELPHI7}
function GetPreviewHost: TCustomPanel; override;
{$ENDIF}
procedure LoadStrings; override;
procedure UpdateControlsState; override;
procedure UpdatePreview; override;
function GetDesignerTabIndex: Integer; override;
procedure SetDesignerTabIndex(Value: Integer); override;
procedure DoActiveStyleSheetChanged; override;
procedure DoFormActivated(AnActive: Boolean); override;
procedure DoRefreshStylesList; override;
procedure DoStyleChanged(const ACaption: string; AStyle: TcxStyle); override;
procedure DoStylesChanged(AStrings: TStrings; ARecreate: Boolean); override;
procedure GetSelectedStyleNames(AStrings: TStrings); override;
procedure GetStyleNames(out AStrings: TStrings); override;
procedure GetStyleSheetNames(out AStrings: TStrings); override;
property ActiveStyle: TcxStyle read GetActiveStyle;
property HasSelectedStyles: Boolean read GetHasSelectedStyles;
property HasSelectedStylesWithAssignedBitmap: Boolean read GetHasSelectedStylesWithAssignedBitmap;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
property ReportLink: TdxGridReportLink read GetReportLink;
end;
implementation
{$R *.DFM}
{658 x 466 - DesignWindow}
{.2 - IsOffice11StyleGrouping}
{.3 - chbxTransparentRichEdits}
uses
Registry, Forms, {$IFDEF DELPHI6}Variants, {$ENDIF}cxVariants, cxGridStrs,
cxDataUtils, dxThemeManager, {$IFDEF DXVER500}dxOffice11, {$ENDIF}dxPSGlbl,
cxDrawTextUtils, dxPSUtl, dxBkgnd, dxPSPopupMan, dxPSRes, dxPSImgs;
const
SortOrderMap: array[TcxGridSortOrder] of TdxCellSortOrder = (csoNone, csoUp, csoDown);
ExpandButtonInteriorColor = clBtnFace;
DefaultFilterBarColor = clBtnShadow;
DefaultFilterBarTextColor = clWindow;
DefaultIndentWidth = 20;
DefaultDataRowLineHeight = 19;
DefaultGroupFooterLineHeight = 20;
DefaultGroupRowLineHeight = 20;
DefaultFooterLineHeight = 20;
FilterBarTextOffset = 3;
FirstCardOffset = 2;
FooterItemInflateHorz = 2;
FooterItemInflateVert = 3;
TabsAreaOffset = 2;
var
FGridLinkStyleSheetPrototype: TdxGridReportLinkStyleSheet;
type
TdxPSGridDataCellPos = TcxGridDataCellPos;
TdxGridViewBuildersFactory = class(TdxCustomClassMaps)
private
function GetBuilderClass(GridView: TcxCustomGridView): TdxGridViewBuilderClass;
public
class function Instance: TdxGridViewBuildersFactory; reintroduce; overload;
function CreateViewAdapter(AMasterAdapter: TdxCustomGridViewAdapter;
AGridView: TcxCustomGridView): TdxCustomGridViewAdapter;
function CreateViewBuilder(AReportLink: TdxGridReportLink; AMasterBuilder: TdxCustomGridViewBuilder;
AGridView: TcxCustomGridView): TdxCustomGridViewBuilder;
property BuilderClasses[GridView: TcxCustomGridView]: TdxGridViewBuilderClass read GetBuilderClass; default;
end;
TdxViewHelpersFactory = class(TdxCustomClassMaps)
private
function GetHelperClass(GridView: TcxCustomGridView): TdxCustomGridViewHelperClass;
public
class function Instance: TdxViewHelpersFactory; reintroduce; overload;
function HelperClassByItem(AnItem: TdxReportVisualItem): TdxCustomGridViewHelperClass;
property HelperClasses[GridView: TcxCustomGridView]: TdxCustomGridViewHelperClass read GetHelperClass; default;
end;
TdxRecordHelpersFactory = class(TdxCustomClassMaps)
private
function GetHelperClass(GridRecord: TcxCustomGridRecord): TdxCustomGridRecordHelperClass;
public
class function Instance: TdxRecordHelpersFactory; reintroduce; overload;
property HelperClasses[GridRecord: TcxCustomGridRecord]: TdxCustomGridRecordHelperClass read GetHelperClass; default;
end;
TcxCustomGridCellPainterAccess = class(TcxCustomGridCellPainter);
TcxCustomGridCellViewInfoAccess = class(TcxCustomGridCellViewInfo);
TcxCustomGridRecordAccess = class(TcxCustomGridRecord);
TcxCustomGridTableControllerAccess = class(TcxCustomGridTableController);
TcxCustomGridTableItemAccess = class(TcxCustomGridTableItem);
{$IFDEF DXVER500}
TcxCustomGridTableFilteringAccess = class(TcxCustomGridTableFiltering);
{$ENDIF}
TcxCustomGridTableOptionsViewAccess = class(TcxCustomGridTableOptionsView);
TcxCustomGridViewAccess = class(TcxCustomGridView);
TcxGridColumnAccess = class(TcxGridColumn);
TcxGridMasterDataRowAccess = class(TcxGridMasterDataRow);
TcxGridTableViewInfoAccess = class(TcxGridTableViewInfo);
{ Helpers }
{ CustomGridCellPainter Helpers }
procedure CustomGridCellPainter_DrawBorders(AInstance: TcxCustomGridCellPainter);
begin
TcxCustomGridCellPainterAccess(AInstance).DrawBorders;
end;
{ CustomGridCellViewInfo Helpers }
function CustomGridCellViewInfo_GetPainterClass(AInstance: TcxCustomGridCellViewInfo): TcxCustomGridCellPainterClass;
begin
Result := TcxCustomGridCellViewInfoAccess(AInstance).GetPainterClass;
end;
{ CustomGridRecord Helpers }
function CustomGridRecord_GetIsParent(AInstance: TcxCustomGridRecord): Boolean;
begin
Result := TcxCustomGridRecordAccess(AInstance).IsParent;
end;
{ CustomGridTableController Helpers }
function CustomGridTableController_GetMultiSelect(AInstance: TcxCustomGridTableController): Boolean;
begin
Result := TcxCustomGridTableControllerAccess(AInstance).MultiSelect;
end;
{ CustomGridTableFiltering Helpers }
function CustomGridTableFiltering_GetPosition(AInstance: TcxCustomGridTableFiltering): TcxGridFilterPosition;
begin
Result := TcxCustomGridTableFilteringAccess(AInstance).Position;
end;
{ CustomGridTableOptionsView Helpers }
function CustomGridTableOptionsView_GetCellAutoHeight(AInstance: TcxCustomGridTableOptionsView): Boolean;
begin
Result := TcxCustomGridTableOptionsViewAccess(AInstance).CellAutoHeight;
end;
{ CustomGridView Helpers }
function CustomGridView_GetBackgroundBitmaps(AInstance: TcxCustomGridView): TcxCustomGridBackgroundBitmaps;
begin
Result := TcxCustomGridViewAccess(AInstance).BackgroundBitmaps;
end;
function CustomGridView_GetDataController(AInstance: TcxCustomGridView): TcxCustomDataController;
begin
Result := TcxCustomGridViewAccess(AInstance).DataController;
end;
function CustomGridView_GetStyles(AInstance: TcxCustomGridView): TcxCustomGridStyles;
begin
Result := TcxCustomGridViewAccess(AInstance).Styles;
end;
{ GridColumn Helpers }
function GridColumn_GetFixed(AInstance: TcxGridColumn): Boolean;
begin
Result := TcxGridColumnAccess(AInstance).Fixed;
end;
function GridColumn_DoCompareValuesForCellMerging(AInstance: TcxGridColumn;
ARow1: TcxGridDataRow; AProperties1: TcxCustomEditProperties; const AValue1: TcxEditValue;
ARow2: TcxGridDataRow; AProperties2: TcxCustomEditProperties; const AValue2: TcxEditValue): Boolean;
begin
Result := TcxGridColumnAccess(AInstance).DoCompareValuesForCellMerging(ARow1, AProperties1, AValue1, ARow2, AProperties2, AValue2);
end;
{ GridMasterDataRow Helpers }
procedure GridMasterDataRow_DoExpand(AInstance: TcxGridMasterDataRow; ARecurse: Boolean);
begin
TcxGridMasterDataRowAccess(AInstance).DoExpand(ARecurse);
end;
{ GridTableViewInfo Helpers }
procedure GridTableViewInfo_CalculateExpandButtonParams(AInstance: TcxGridTableViewInfo);
begin
TcxGridTableViewInfoAccess(AInstance).CalculateExpandButtonParams;
end;
{ Utilities }
function GridLinkStyleSheetPrototype: TdxGridReportLinkStyleSheet;
function CreateStyle(AColor, AFontColor: TColor): TcxStyle;
begin
Result := TcxStyle.Create(FGridLinkStyleSheetPrototype);
with Result do
begin
Color := AColor;
Font.Name := dxPSCore.dxPSDefaultFontName;
Font.Color := AFontColor;
end;
end;
begin
if FGridLinkStyleSheetPrototype = nil then
begin
FGridLinkStyleSheetPrototype := TdxGridReportLinkStyleSheet.Create(nil);
with FGridLinkStyleSheetPrototype.Styles as TdxGridReportLinkStyles do
begin
BandHeader := CreateStyle(dxPSCore.dxDefaultFixedColor, dxPSCore.dxPSDefaultFontColor);
Caption := CreateStyle(dxPSCore.dxDefaultFixedColor, dxPSCore.dxPSDefaultFontColor);
CardCaptionRow := CreateStyle(dxPSCore.dxDefaultFixedColor, dxPSCore.dxPSDefaultFontColor);
CardRowCaption := CreateStyle(dxPSCore.dxDefaultFixedColor, dxPSCore.dxPSDefaultFontColor);
Content := CreateStyle(dxPSCore.dxDefaultContentColor, dxPSCore.dxPSDefaultFontColor);
ContentEven := CreateStyle(dxPSCore.dxDefaultContentColor, dxPSCore.dxPSDefaultFontColor);
ContentOdd := CreateStyle(dxPSCore.dxDefaultContentColor, dxPSCore.dxPSDefaultFontColor);
FilterBar := CreateStyle(clBtnShadow, dxPSCore.dxDefaultContentColor);
Footer := CreateStyle(dxPSCore.dxDefaultFixedColor, dxPSCore.dxPSDefaultFontColor);
Group := CreateStyle(dxPSCore.dxDefaultFixedColor, dxPSCore.dxPSDefaultFontColor);
Header := CreateStyle(dxPSCore.dxDefaultFixedColor, dxPSCore.dxPSDefaultFontColor);
Preview := CreateStyle(dxPSCore.dxDefaultContentColor, dxPSCore.dxPSDefaultFontColor);
Selection := CreateStyle(dxPSCore.dxDefaultFixedColor, dxPSCore.dxPSDefaultFontColor);
end;
end;
Result := FGridLinkStyleSheetPrototype;
end;
function CreatePSDataCellPos: TdxPSGridDataCellPos;
begin
Result := TdxPSGridDataCellPos.Create;
end;
procedure FreePSDataCellPos(out ADataCellPos: TdxPSGridDataCellPos);
begin
FreeAndNil(ADataCellPos);
end;
procedure _LoadAllRecords(ADBDataModeController: TcxDBDataModeController;
out APrevAllRecordsAreLoaded: Boolean);
begin
APrevAllRecordsAreLoaded := not ADBDataModeController.GridMode;
if not APrevAllRecordsAreLoaded then
ADBDataModeController.GridMode := False;
end;
procedure _UnloadAllRecords(ADBDataModeController: TcxDBDataModeController;
const APrevAllRecordsAreLoaded: Boolean);
begin
if not APrevAllRecordsAreLoaded then
ADBDataModeController.GridMode := True;
end;
{ TdxGridViewBuildersFactory }
function dxGridViewBuildersFactory: TdxGridViewBuildersFactory;
begin
Result := TdxGridViewBuildersFactory.Instance;
end;
class function TdxGridViewBuildersFactory.Instance: TdxGridViewBuildersFactory;
begin
Result := inherited Instance as TdxGridViewBuildersFactory;
end;
function TdxGridViewBuildersFactory.CreateViewAdapter(AMasterAdapter: TdxCustomGridViewAdapter;
AGridView: TcxCustomGridView): TdxCustomGridViewAdapter;
begin
Result := BuilderClasses[AGridView].CreateAdapter(AMasterAdapter, AGridView);
end;
function TdxGridViewBuildersFactory.CreateViewBuilder(AReportLink: TdxGridReportLink;
AMasterBuilder: TdxCustomGridViewBuilder; AGridView: TcxCustomGridView): TdxCustomGridViewBuilder;
begin
Result := BuilderClasses[AGridView].Create(AReportLink, AMasterBuilder, AGridView);
end;
function TdxGridViewBuildersFactory.GetBuilderClass(GridView: TcxCustomGridView): TdxGridViewBuilderClass;
begin
Result := TdxGridViewBuilderClass(PairClasses[GridView.ClassType]);
end;
{ TdxViewHelpersFactory }
function dxViewHelpersFactory: TdxViewHelpersFactory;
begin
Result := TdxViewHelpersFactory.Instance;
end;
class function TdxViewHelpersFactory.Instance: TdxViewHelpersFactory;
begin
Result := inherited Instance as TdxViewHelpersFactory;
end;
function TdxViewHelpersFactory.HelperClassByItem(AnItem: TdxReportVisualItem): TdxCustomGridViewHelperClass;
begin
Result := HelperClasses[TcxCustomGridView(AnItem.TopLevelParent.Data)];
end;
function TdxViewHelpersFactory.GetHelperClass(GridView: TcxCustomGridView): TdxCustomGridViewHelperClass;
begin
if GridView = nil then
Result := nil
else
Result := TdxCustomGridViewHelperClass(PairClasses[GridView.ClassType]);
end;
{ TdxRecordHelpersFactory }
function dxRecordHelpersFactory: TdxRecordHelpersFactory;
begin
Result := TdxRecordHelpersFactory.Instance;
end;
class function TdxRecordHelpersFactory.Instance: TdxRecordHelpersFactory;
begin
Result := inherited Instance as TdxRecordHelpersFactory;
end;
function TdxRecordHelpersFactory.GetHelperClass(GridRecord: TcxCustomGridRecord): TdxCustomGridRecordHelperClass;
begin
Result := TdxCustomGridRecordHelperClass(PairClasses[GridRecord.ClassType]);
end;
{ CLR Accesssors }
{ TdxCustomGridViewHelper }
constructor TdxCustomGridViewHelper.Create(AView: TcxCustomGridView);
begin
inherited Create;
FView := AView;
end;
class function TdxCustomGridViewHelper.PairClass: TClass;
begin
Result := ViewClass;
end;
class procedure TdxCustomGridViewHelper.Register;
begin
dxViewHelpersFactory.Register(Self);
end;
class procedure TdxCustomGridViewHelper.Unregister;
begin
dxViewHelpersFactory.Unregister(Self);
end;
class function TdxCustomGridViewHelper.ExtractCustomDrawID(AnItem: TdxReportVisualItem): TdxGridAttributeID;
begin
Result := dxGridUndefinedID;
if TClass(AnItem.Data) = TdxGridLevelCaption then
Result := dxGridLevelCaptionID;
end;
class procedure TdxCustomGridViewHelper.ExtractCustomDrawInfo(AnItem: TdxReportVisualItem;
out ACustomDrawInfo: TdxGridCellCustomDrawInfo);
begin
FillChar(ACustomDrawInfo, SizeOf(ACustomDrawInfo), 0);
with ACustomDrawInfo do
begin
GridAttributeID := ExtractCustomDrawID(AnItem);
GridView := ExtractGridView(AnItem);
end;
end;
class function TdxCustomGridViewHelper.ExtractGridView(AnItem: TdxReportVisualItem): TcxCustomGridView;
begin
Result := TcxCustomGridView(AnItem.TopLevelParent.Data);
end;
class function TdxCustomGridViewHelper.IsAttributeSupported(AnAttribute: TdxGridAttributeClass): Boolean;
var
Attributes: TdxGridAttributeClasses;
I: Integer;
begin
Attributes := SupportedAttributes;
Result := True;
for I := Low(Attributes) to High(Attributes) do
if Attributes[I] = AnAttribute then Exit;
Result := False;
end;
class function TdxCustomGridViewHelper.SupportedAttributes: TdxGridAttributeClasses;
begin
SetLength(Result, 0);
AddAttribute(Result, TdxGridLevelCaption);
end;
class procedure TdxCustomGridViewHelper.AddAttribute(var AnAtributes: TdxGridAttributeClasses;
AnAttribute: TdxGridAttributeClass);
begin
SetLength(AnAtributes, Length(AnAtributes) + 1);
AnAtributes[Length(AnAtributes) - 1] := AnAttribute;
end;
{$IFDEF DXVER500}
class function TdxCustomGridViewHelper.FilterPosition(AView: TcxCustomGridView): TcxGridFilterPosition;
begin
Result := fpBottom;
end;
{$ENDIF}
class function TdxCustomGridViewHelper.IsFilterBarAtBottom(AView: TcxCustomGridView): Boolean;
begin
{$IFDEF DXVER500}
Result := FilterPosition(AView) = fpBottom;
{$ELSE}
Result := True;
{$ENDIF}
end;
class function TdxCustomGridViewHelper.IsFilterBarAtTop(AView: TcxCustomGridView): Boolean;
begin
{$IFDEF DXVER500}
Result := FilterPosition(AView) = fpTop;
{$ELSE}
Result := False;
{$ENDIF}
end;
class function TdxCustomGridViewHelper.IsOffice11StyleGrouping(AView: TcxCustomGridView): Boolean;
begin
Result := False;
end;
class function TdxCustomGridViewHelper.ViewClass: TcxCustomGridViewClass;
begin
Result := TcxCustomGridView;
end;
{ TdxNullGridViewHelper }
class function TdxNullGridViewHelper.IsAttributeSupported(AnAttribute: TdxGridAttributeClass): Boolean;
begin
Result := True;
end;
class function TdxNullGridViewHelper.ViewClass: TcxCustomGridViewClass;
begin
Result := nil;
end;
{ TdxCustomGridTableViewHelper }
class function TdxCustomGridTableViewHelper.ExtractCustomDrawID(AnItem: TdxReportVisualItem): TdxGridAttributeID;
begin
Result := inherited ExtractCustomDrawID(AnItem);
if Result = dxGridUndefinedID then
if TClass(AnItem.Data) = TdxGridFilterBar then
Result := dxGridFilterBarID;
end;
class function TdxCustomGridTableViewHelper.SupportedAttributes: TdxGridAttributeClasses;
begin
Result := inherited SupportedAttributes;
AddAttribute(Result, TdxGridFilterBar);
end;
class function TdxCustomGridTableViewHelper.ExtractRecord(AnItem: TdxReportVisualItem): TcxCustomGridRecord;
begin
Result := nil;
end;
{$IFDEF DXVER500}
class function TdxCustomGridTableViewHelper.FilterPosition(AView: TcxCustomGridView): TcxGridFilterPosition;
begin
Result := CustomGridTableFiltering_GetPosition(TcxCustomGridTableView(AView).Filtering);
end;
{$ENDIF}
class function TdxCustomGridTableViewHelper.ViewClass: TcxCustomGridViewClass;
begin
Result := TcxCustomGridTableView;
end;
{ TdxGridCardViewHelper }
class function TdxGridCardViewHelper.ExtractCustomDrawID(AnItem: TdxReportVisualItem): TdxGridAttributeID;
begin
Result := inherited ExtractCustomDrawID(AnItem);
if Result = dxGridUndefinedID then
if (AnItem.Parent <> nil) and (AnItem.Parent is TdxReportCardRow) then
if TClass(AnItem.Data) = TdxGridCardRowCaption then
Result := dxGridCardRowCaptionID
else
Result := dxGridCardRowDataID;
end;
class procedure TdxGridCardViewHelper.ExtractCustomDrawInfo(AnItem: TdxReportVisualItem;
out ACustomDrawInfo: TdxGridCellCustomDrawInfo);
begin
with ACustomDrawInfo do
try
inherited;
if GridAttributeID in [dxGridCardRowCaptionID, dxGridCardRowDataID] then
begin
GridCard := ExtractCard(AnItem);
GridCardRow := ExtractCardRow(AnItem);
end;
except
FillChar(ACustomDrawInfo, SizeOf(ACustomDrawInfo), 0);
GridAttributeID := dxGridUndefinedID;
end;
end;
class function TdxGridCardViewHelper.ExtractCard(AnItem: TdxReportVisualItem): TcxGridCard;
begin
Result := ExtractRecord(AnItem) as TcxGridCard;
end;
class function TdxGridCardViewHelper.ExtractCardRow(AnItem: TdxReportVisualItem): TcxGridCardViewRow;
begin
Result := TdxReportCardRow(AnItem.Parent).GridCardRow;
end;
class function TdxGridCardViewHelper.ExtractRecord(AnItem: TdxReportVisualItem): TcxCustomGridRecord;
begin
Result := TdxReportCard(AnItem.Parent.Parent).GridCard;
end;
class function TdxGridCardViewHelper.ViewClass: TcxCustomGridViewClass;
begin
Result := TcxGridCardView;
end;
{ TdxGridTableViewHelper }
class function TdxGridTableViewHelper.ExtractCustomDrawID(AnItem: TdxReportVisualItem): TdxGridAttributeID;
begin
Result := inherited ExtractCustomDrawID(AnItem);
if Result = dxGridUndefinedID then
if AnItem.Parent <> nil then
if TClass(AnItem.Parent.Data) = TdxGridHeader then
Result := dxGridHeaderID
else
if TClass(AnItem.Parent.Data) = TdxGridFooter then
Result := dxGridFooterID
else
if IsDelphiObject(AnItem.Data) and (TObject(AnItem.Data) is TcxCustomGridTableItem) then
if (AnItem.Parent.Parent <> nil) and (AnItem.Parent.Parent.Data >= 0) and
(AnItem.Parent.Parent.Data < High(Byte)) then
Result := dxGridGroupFooterID
else
Result := dxGridRecordID;
end;
class procedure TdxGridTableViewHelper.ExtractCustomDrawInfo(AnItem: TdxReportVisualItem;
out ACustomDrawInfo: TdxGridCellCustomDrawInfo);
begin
with ACustomDrawInfo do
try
inherited;
if GridAttributeID in [dxGridFooterID, dxGridGroupFooterID, dxGridHeaderID, dxGridRecordID] then
begin
GridColumn := ExtractColumn(AnItem);
if GridAttributeID in [dxGridRecordID, dxGridGroupFooterID] then
begin
GridRecord := ExtractRecord(AnItem);
if GridAttributeID = dxGridGroupFooterID then
GroupLevel := ExtractGroupLevel(AnItem);
end
else
GroupLevel := -1;
end;
except
FillChar(ACustomDrawInfo, SizeOf(ACustomDrawInfo), 0);
GridAttributeID := dxGridUndefinedID;
end;
end;
class function TdxGridTableViewHelper.SupportedAttributes: TdxGridAttributeClasses;
begin
Result := inherited SupportedAttributes;
AddAttribute(Result, TdxGridDetails);
AddAttribute(Result, TdxGridExpandButton);
AddAttribute(Result, TdxGridFooter);
AddAttribute(Result, TdxGridGroupFooter);
AddAttribute(Result, TdxGridGroupRow);
AddAttribute(Result, TdxGridHeader);
AddAttribute(Result, TdxGridPreview);
end;
class function TdxGridTableViewHelper.ExtractColumn(AnItem: TdxReportVisualItem): TcxGridColumn;
begin
Result := TcxGridColumn(AnItem.Data);
end;
class function TdxGridTableViewHelper.ExtractGroupLevel(AnItem: TdxReportVisualItem): Integer;
begin
Result := Integer(AnItem.Parent.Parent.Data);
end;
class function TdxGridTableViewHelper.ExtractRecord(AnItem: TdxReportVisualItem): TcxCustomGridRecord;
begin
Result := TcxCustomGridRecord(AnItem.Parent.Data);
end;
class function TdxGridTableViewHelper.ViewClass: TcxCustomGridViewClass;
begin
Result := TcxGridTableView;
end;
class function TdxGridTableViewHelper.IsOffice11StyleGrouping(AView: TcxCustomGridView): Boolean;
begin
{$IFDEF DXVER500}
Result := TcxGridTableView(AView).OptionsView.GroupRowStyle = grsOffice11;
{$ELSE}
Result := False;
{$ENDIF}
end;
{ TdxGridBandedTableViewHelper }
class function TdxGridBandedTableViewHelper.ExtractCustomDrawID(AnItem: TdxReportVisualItem): TdxGridAttributeID;
begin
Result := inherited ExtractCustomDrawID(AnItem);
if Result = dxGridUndefinedID then
if IsDelphiObject(AnItem.Data) and (TObject(AnItem.Data) is TcxGridBand) then
Result := dxGridBandID;
end;
class procedure TdxGridBandedTableViewHelper.ExtractCustomDrawInfo(AnItem: TdxReportVisualItem;
out ACustomDrawInfo: TdxGridCellCustomDrawInfo);
begin
with ACustomDrawInfo do
try
inherited;
if GridAttributeID = dxGridBandID then
GridBand := ExtractBand(AnItem);
except
FillChar(ACustomDrawInfo, SizeOf(ACustomDrawInfo), 0);
GridAttributeID := dxGridUndefinedID;
end;
end;
class function TdxGridBandedTableViewHelper.SupportedAttributes: TdxGridAttributeClasses;
begin
Result := inherited SupportedAttributes;
AddAttribute(Result, TdxGridBandHeader);
end;
class function TdxGridBandedTableViewHelper.ExtractBand(AnItem: TdxReportVisualItem): TcxGridBand;
begin
Result := TcxGridBand(AnItem.Data);
end;
class function TdxGridBandedTableViewHelper.ViewClass: TcxCustomGridViewClass;
begin
Result := TcxGridBandedTableView;
end;
{ TdxCustomGridRecordHelper }
constructor TdxCustomGridRecordHelper.Create(AAdapter: TdxCustomGridTableViewAdapter);
begin
inherited Create;
FAdapter := AAdapter;
end;
class function TdxCustomGridRecordHelper.PairClass: TClass;
begin
Result := RecordClass;
end;
class procedure TdxCustomGridRecordHelper.Register;
begin
dxRecordHelpersFactory.Register(Self);
end;
class procedure TdxCustomGridRecordHelper.Unregister;
begin
dxRecordHelpersFactory.Unregister(Self);
end;
function TdxCustomGridRecordHelper.Adapter: TdxCustomGridTableViewAdapter;
begin
Result := FAdapter;
end;
class function TdxCustomGridRecordHelper.ProducerClass: TdxGridTableViewCustomDataRowProducerClass;
begin
Result := TdxGridTableViewCustomDataRowProducer;
end;
class function TdxCustomGridRecordHelper.RecordClass: TcxCustomGridRecordClass;
begin
Result := TcxCustomGridRecord;
end;
{$IFDEF DXVER500}
function TdxCustomGridRecordHelper.GetCanCellMergingAsMaster: Boolean;
begin
Result := True;
end;
function TdxCustomGridRecordHelper.GetCanCellMergingAsSlave: Boolean;
begin
Result := True;
end;
{$ENDIF}
function TdxCustomGridRecordHelper.GetHasDetails: Boolean;
begin
Result := False;
end;
{$IFDEF DXVER500}
function TdxCustomGridRecordHelper.GetHasExpandButton: Boolean;
begin
Result := False;
end;
{$ENDIF}
function TdxCustomGridRecordHelper.GetHasSelectedChildren: Boolean;
begin
Result := False;
end;
{$IFDEF DXVER500}
function TdxCustomGridRecordHelper.GetIsCellMergingSeparator: Boolean;
begin
Result := False;
end;
{$ENDIF}
function TdxCustomGridRecordHelper.GetParent: TcxCustomGridRecord;
var
I: Integer;
begin
for I := GridRecord.Index - 1 downto 0 do
begin
Result := Adapter.Records[I];
if CustomGridRecord_GetIsParent(Result) and (Result.Level < GridRecord.Level) then
Exit;
end;
Result := nil;
end;
{ TdxCustomGridRowHelper }
function TdxCustomGridRowHelper.Adapter: TdxGridTableViewAdapter;
begin
Result := inherited Adapter as TdxGridTableViewAdapter;
end;
class function TdxCustomGridRowHelper.RecordClass: TcxCustomGridRecordClass;
begin
Result := TcxCustomGridRow;
end;
{ TdxGridDataRowHelper }
class function TdxGridDataRowHelper.ProducerClass: TdxGridTableViewCustomDataRowProducerClass;
begin
Result := TdxGridTableViewDataRowProducer;
end;
class function TdxGridDataRowHelper.RecordClass: TcxCustomGridRecordClass;
begin
Result := TcxGridDataRow;
end;
function TdxGridDataRowHelper.GetRow: TcxGridDataRow;
begin
Result := inherited GridRecord as TcxGridDataRow;
end;
{ TdxGridGroupRowHelper }
class function TdxGridGroupRowHelper.ProducerClass: TdxGridTableViewCustomDataRowProducerClass;
begin
Result := TdxGridTableViewGroupRowProducer;
end;
class function TdxGridGroupRowHelper.RecordClass: TcxCustomGridRecordClass;
begin
Result := TcxGridGroupRow;
end;
{$IFDEF DXVER500}
function TdxGridGroupRowHelper.GetCanCellMergingAsMaster: Boolean;
begin
Result := False;
end;
function TdxGridGroupRowHelper.GetCanCellMergingAsSlave: Boolean;
begin
Result := False;
end;
function TdxGridGroupRowHelper.GetHasExpandButton: Boolean;
begin
Result := not (dcoGroupsAlwaysExpanded in Adapter.DataController.Options);
end;
{$ENDIF}
function TdxGridGroupRowHelper.GetHasSelectedChildren: Boolean;
var
GroupLevel, I: Integer;
Row: TcxCustomGridRow;
begin
GroupLevel := GroupRow.Level;
for I := GroupRow.Index + 1 to Adapter.RowCount - 1 do
begin
Row := Adapter.Rows[I];
if Row.Level <= GroupLevel then Break;
Result := Row.Selected or Adapter.RecordHelpers[Row].HasSelectedChildren; //!!!
if Result then Exit;
end;
Result := False;
end;
function TdxGridGroupRowHelper.GetGroupRow: TcxGridGroupRow;
begin
Result := inherited GridRecord as TcxGridGroupRow;
end;
{ TdxGridMasterDataRowHelper }
class function TdxGridMasterDataRowHelper.ProducerClass: TdxGridTableViewCustomDataRowProducerClass;
begin
Result := TdxGridTableViewMasterRowProducer;
end;
class function TdxGridMasterDataRowHelper.RecordClass: TcxCustomGridRecordClass;
begin
Result := TcxGridMasterDataRow;
end;
{$IFDEF DXVER500}
function TdxGridMasterDataRowHelper.GetCanCellMergingAsMaster: Boolean;
begin
Result := not MasterRow.Expanded;
end;
{$ENDIF}
function TdxGridMasterDataRowHelper.GetHasDetails: Boolean;
begin
Result := MasterRow.Expanded;// and MasterRow.ActiveDetailGridViewExists //!!!
end;
{$IFDEF DXVER500}
function TdxGridMasterDataRowHelper.GetHasExpandButton: Boolean;
begin
Result := True;
end;
{$ENDIF}
function TdxGridMasterDataRowHelper.GetHasSelectedChildren: Boolean;
begin
Result := MasterRow.Expanded;
if Result then
with dxGridViewBuildersFactory.CreateViewAdapter(Adapter, DetailView) do
try
Result := HasSelectedRecords;
finally
Free;
end;
end;
{$IFDEF DXVER500}
function TdxGridMasterDataRowHelper.GetIsCellMergingSeparator: Boolean;
begin
Result := MasterRow.Expanded;
end;
{$ENDIF}
function TdxGridMasterDataRowHelper.GetDetailView: TcxCustomGridView;
begin
if HasDetails then
Result := MasterRow.ActiveDetailGridView
else
Result := nil;
end;
function TdxGridMasterDataRowHelper.GetMasterRow: TcxGridMasterDataRow;
begin
Result := inherited GridRecord as TcxGridMasterDataRow;
end;
{ TdxRecordHelpersCache }
constructor TdxRecordHelpersCache.Create(AAdapter: TdxCustomGridTableViewAdapter);
begin
inherited Create;
FAdapter := AAdapter;
end;
function TdxRecordHelpersCache.IndexOf(ARecord: TcxCustomGridRecord): Integer;
begin
for Result := 0 to Count - 1 do
if Items[Result].RecordClass = ARecord.ClassType then
Exit;
Result := Add(dxRecordHelpersFactory.HelperClasses[ARecord].Create(Adapter));
end;
function TdxRecordHelpersCache.GetHelper(ARecord: TcxCustomGridRecord): TdxCustomGridRecordHelper;
begin
Result := Items[IndexOf(ARecord)];
Result.GridRecord := ARecord;
end;
function TdxRecordHelpersCache.GetItem(Index: Integer): TdxCustomGridRecordHelper;
begin
Result := TdxCustomGridRecordHelper(inherited Items[Index]);
end;
{ TdxProducerCache }
constructor TdxProducerCache.Create(ABuilder: TdxCustomGridViewBuilder);
begin
inherited Create;
FBuilder := ABuilder;
end;
function TdxProducerCache.IndexOf(AProducerClass: TdxGridViewRowProducerClass): Integer;
begin
for Result := 0 to Count - 1 do
if Items[Result].ClassType = AProducerClass then Exit;
Result := Add(AProducerClass.Create(Builder));
end;
function TdxProducerCache.GetProducer(ProducerClass: TdxGridViewRowProducerClass): TdxGridViewRowProducer;
begin
Result := Items[IndexOf(ProducerClass)];
end;
function TdxProducerCache.GetItem(Index: Integer): TdxGridViewRowProducer;
begin
Result := inherited Items[Index] as TdxGridViewRowProducer;
end;
{ TdxCustomGridViewAdapter }
constructor TdxCustomGridViewAdapter.Create(AMasterAdapter: TdxCustomGridViewAdapter;
AGridView: TcxCustomGridView);
begin
inherited Create;
FMasterAdapter := AMasterAdapter;
FGridView := AGridView;
FGridView.SizeChanged(True, True); //!?
end;
function TdxCustomGridViewAdapter.GridView: TcxCustomGridView;
begin
Result := FGridView;
end;
class function TdxCustomGridViewAdapter.GridViewClass: TcxCustomGridViewClass;
begin
Result := TcxCustomGridView;
end;
function TdxCustomGridViewAdapter.Styles: TcxCustomGridStyles;
begin
Result := CustomGridView_GetStyles(GridView);
end;
procedure TdxCustomGridViewAdapter.ExpandAllRows(AnOptionsExpanding: TdxGridReportLinkOptionsExpanding;
ARecursive: Boolean);
begin
Grid.BeginUpdate;
try
ExpandAllRowsInLevel(GridLevel, AnOptionsExpanding.ExpandMasterRows,
AnOptionsExpanding.ExpandGroupRows, ARecursive);
finally
Grid.EndUpdate;
end;
end;
procedure TdxCustomGridViewAdapter.AfterBuilding;
begin
//GridView.CancelUpdate;
end;
procedure TdxCustomGridViewAdapter.BeforeBuilding;
begin
//GridView.BeginUpdate;
end;
function TdxCustomGridViewAdapter.BackgroundBitmaps: TcxCustomGridBackgroundBitmaps;
begin
Result := CustomGridView_GetBackgroundBitmaps(GridView);
end;
function TdxCustomGridViewAdapter.GetBackgroundBitmap(Index: Integer): TBitmap;
begin
if IsBackgroundBitmapSupported(Index) then
Result := BackgroundBitmaps.GetBitmap(Index)
else
Result := nil
end;
function TdxCustomGridViewAdapter.HasBackgroundBitmap(Index: Integer): Boolean;
var
Bitmap: TBitmap;
begin
Bitmap := BackgroundBitmaps.GetBitmap(Index);
Result := (Bitmap <> nil) and not Bitmap.Empty;
end;
function TdxCustomGridViewAdapter.IsBackgroundBitmapSupported(Index: Integer): Boolean;
begin
Result := Index <> bbTabs;
end;
function TdxCustomGridViewAdapter.Controller: TcxCustomGridController;
begin
Result := GridView.Controller;
end;
function TdxCustomGridViewAdapter.DataController: TcxCustomDataController;
begin
Result := CustomGridView_GetDataController(GridView);
end;
function TdxCustomGridViewAdapter.CreateCloneAdapter(AClone: TcxCustomGridView): TdxCustomGridViewAdapter;
begin
Result := dxGridViewBuildersFactory.CreateViewAdapter(MasterAdapter, AClone);
end;
procedure TdxCustomGridViewAdapter.ExpandAllRowsInGridView(AGridView: TcxCustomGridView;
AMasterRows, AGroupRows: Boolean);
begin
if AGridView = nil then Exit;
with dxGridViewBuildersFactory.CreateViewAdapter(nil, AGridView) do
try
ExpandAllRowsInItself(AMasterRows, AGroupRows);
ExpandAllRowsInClones(AMasterRows, AGroupRows);
finally
Free;
end;
end;
procedure TdxCustomGridViewAdapter.ExpandAllRowsInClones(AMasterRows, AGroupRows: Boolean);
var
I: Integer;
Clone: TcxCustomGridView;
begin
for I := 0 to GridView.CloneCount - 1 do
begin
Clone := GridView.Clones[I];
with CreateCloneAdapter(Clone) do
try
ExpandAllRowsInGridView(Clone, AMasterRows, AGroupRows);
finally
Free;
end;
end;
end;
procedure TdxCustomGridViewAdapter.ExpandAllRowsInLevel(ALevel: TcxGridLevel;
AMasterRows, AGroupRows: Boolean; ARecursive: Boolean);
var
I: Integer;
begin
ExpandAllRowsInGridView(ALevel.GridView, AMasterRows, AGroupRows);
if ARecursive then
for I := 0 to ALevel.VisibleCount - 1 do
ExpandAllRowsInLevel(ALevel.VisibleItems[I], AMasterRows, AGroupRows, ARecursive);
end;
procedure TdxCustomGridViewAdapter.ExpandAllRowsInItself(AMasterRows, AGroupRows: Boolean);
begin
end;
function TdxCustomGridViewAdapter.GetAreAllMasterRowsCollapsed: Boolean;
begin
Result := True;
end;
function TdxCustomGridViewAdapter.GetAutoWidth: Boolean;
begin
Result := False;
end;
function TdxCustomGridViewAdapter.GetCanUseOnEveryPageMode: Boolean;
begin
Result := False;
end;
{$IFDEF DXVER500}
function TdxCustomGridViewAdapter.GetFilterPosition: TcxGridFilterPosition;
begin
Result := fpBottom;
end;
{$ENDIF}
function TdxCustomGridViewAdapter.GetHasSelectedRecords: Boolean;
begin
Result := False;
end;
function TdxCustomGridViewAdapter.GetIndentCount: Integer;
begin
Result := Ord(IsMaster);
end;
function TdxCustomGridViewAdapter.GetIndentWidth: Integer;
begin
Result := DefaultIndentWidth;
end;
function TdxCustomGridViewAdapter.GetIsOffice11StyleGrouping: Boolean;
begin
Result := False;
end;
function TdxCustomGridViewAdapter.GetMasterGridRecord: TcxCustomGridRecord;
begin
Result := nil;
end;
function TdxCustomGridViewAdapter.GetRecordCount: Integer;
begin
Result := 0;
end;
function TdxCustomGridViewAdapter.GetViewWidthExtra: Integer;
begin
Result := Ord(IsMaster) * IndentWidth;
end;
function TdxCustomGridViewAdapter.GetCaptionViewParams: TcxViewParams;
var
Level: TcxGridLevel;
begin
if MasterAdapter = nil then
if GridView.MasterGridView <> nil then
begin
Level := GridView.MasterGridView.Level as TcxGridLevel;
Level.Styles.GetTabParams({$IFDEF DXVER500} MasterGridRecord, {$ENDIF} GridLevel, Result);
end
else
Result := GetRootCaptionParams
else
MasterAdapter.GridLevel.Styles.GetTabParams({$IFDEF DXVER500} MasterGridRecord, {$ENDIF} GridLevel, Result);
end;
function TdxCustomGridViewAdapter.GetFilterBarViewParams: TcxViewParams;
begin
Result.Color := clBtnShadow;
Result.Font := nil;
Result.TextColor := clWindow;
end;
function TdxCustomGridViewAdapter.GetRootCaptionParams: TcxViewParams;
begin
Grid.RootLevelStyles.GetTabParams({$IFDEF DXVER500} nil, {$ENDIF} GridLevel, Result);
end;
function TdxCustomGridViewAdapter.GetAbsoluteLevel: Integer;
begin
Result := GridLevel.Level;
end;
function TdxCustomGridViewAdapter.GetCanUseLookAndFeelColors: Boolean;
begin
Result := Grid.LookAndFeel.NativeStyle and dxThemeManager.AreVisualStylesAvailable;
end;
function TdxCustomGridViewAdapter.GetCaptionText: string;
begin
Result := GridLevel.DisplayCaption;
end;
function TdxCustomGridViewAdapter.GetDetailsSeparatorColor: TColor;
begin
Result := MasterGridLevel.Options.DetailFrameColor;
end;
function TdxCustomGridViewAdapter.GetDetailsSeparatorThickness: Integer;
begin
Result := MasterGridLevel.Options.DetailFrameWidth;
end;
function TdxCustomGridViewAdapter.GetFilter: TcxDataFilterCriteria;
begin
Result := DataController.Filter;
end;
function TdxCustomGridViewAdapter.GetFilterActive: Boolean;
begin
Result := Filter.Active;
end;
function TdxCustomGridViewAdapter.GetFilterEmpty: Boolean;
begin
Result := Filter.FilterText = '';
end;
function TdxCustomGridViewAdapter.GetFilterText: string;
begin
Result := Filter.FilterCaption;
if Result = '' then
Result := cxGetResourceString(@scxGridFilterIsEmpty);
end;
function TdxCustomGridViewAdapter.GetGrid: TcxCustomGrid;
begin
Result := GridView.Control as TcxCustomGrid;
end;
function TdxCustomGridViewAdapter.GetGridLevel: TcxGridLevel;
begin
Result := GridView.Level as TcxGridLevel;
end;
function TdxCustomGridViewAdapter.GetGridWidth: Integer;
begin
with Grid.ClientRect do
Result := Right - Left;
end;
function TdxCustomGridViewAdapter.GetHasDetailsSeparator: Boolean;
begin
Result := DetailsSeparatorThickness <> 0;
end;
function TdxCustomGridViewAdapter.GetLookAndFeelKind: TcxLookAndFeelKind;
begin
Result := Grid.LookAndFeel.Kind;
end;
function TdxCustomGridViewAdapter.GetLookAndFeelPainter: TcxCustomLookAndFeelPainterClass;
begin
Result := Grid.LookAndFeelPainter;
end;
function TdxCustomGridViewAdapter.GetIsDetail: Boolean;
begin
Result := GridView.IsDetail;
end;
function TdxCustomGridViewAdapter.GetIsMaster: Boolean;
begin
Result := GridView.IsMaster;
end;
function TdxCustomGridViewAdapter.GetMasterGridLevel: TcxGridLevel;
begin
Result := GridLevel.Parent;
end;
function TdxCustomGridViewAdapter.GetSummary: TcxDataSummary;
begin
Result := DataController.Summary;
end;
function TdxCustomGridViewAdapter.GetThemedCaptionColor: TColor;
begin
Result := LookAndFeelPainter.DefaultTabColor;
end;
function TdxCustomGridViewAdapter.GetThemedCaptionTextColor: TColor;
begin
Result := LookAndFeelPainter.DefaultTabTextColor;
end;
function TdxCustomGridViewAdapter.GetThemedFilterBarColor: TColor;
begin
Result := LookAndFeelPainter.DefaultFilterBoxColor;
end;
function TdxCustomGridViewAdapter.GetThemedFilterBarTextColor: TColor;
begin
Result := LookAndFeelPainter.DefaultFilterBoxTextColor;
end;
function TdxCustomGridViewAdapter.GetViewWidth: Integer;
begin
Result := GridView.Control.Width;
end;
{ TdxCustomGridViewFormatter }
constructor TdxCustomGridViewFormatter.Create(ABuilder: TdxCustomGridViewBuilder);
begin
inherited Create;
FBuilder := ABuilder;
FLookAndFeelItems := TList.Create;
FExpandButtons := TList.Create;
FFont := TFont.Create;
FTransparentColor := dxPSCore.dxDefaultContentColor;
end;
destructor TdxCustomGridViewFormatter.Destroy;
begin
FreeAndNil(FFont);
FreeAndNil(FExpandButtons);
FreeAndNil(FLookAndFeelItems);
inherited;
end;
function TdxCustomGridViewFormatter.Builder: TdxCustomGridViewBuilder;
begin
Result := FBuilder;
end;
function TdxCustomGridViewFormatter.Adapter: TdxCustomGridViewAdapter;
begin
Result := Builder.Adapter;
end;
procedure TdxCustomGridViewFormatter.DoInitializeHost(AHost: TdxReportCell);
begin
AHost.CellSides := [];
AHost.Data := Integer(Adapter.GridView);
AHost.Transparent := True;
end;
function TdxCustomGridViewFormatter.GetHostClass: TdxReportCellClass;
begin
Result := TdxReportCell; {Host}
end;
function TdxCustomGridViewFormatter.GetRowHostClass: TdxReportCellClass;
begin
Result := TdxReportCell;
end;
procedure TdxCustomGridViewFormatter.DoInitializeCaption(ACaption: TdxReportCellText);
begin
SetViewParams(ACaption, GetCaptionViewParams);
if HasBackgroundBitmap(bbTabs) then
ACaption.BackgroundBitmapIndex := GetBackgroundBitmapIndex(bbTabs);
RegisterLookAndFeelItem(ACaption, cesRaised);
ACaption.Data := Integer(TdxGridLevelCaption);
ACaption.Text := Adapter.CaptionText;
ACaption.HidePrefix := True;
end;
procedure TdxCustomGridViewFormatter.DoInitializeCaptionRow(ARow: TdxReportCell);
begin
end;
procedure TdxCustomGridViewFormatter.DoReportLinkInitializeCaption(ACaption: TdxReportCellText);
begin
ReportLink.DoInitializeLevelCaption(Adapter.GridView, TdxReportCellString(ACaption));
end;
function TdxCustomGridViewFormatter.GetCaptionClass: TdxReportCellTextClass;
begin
Result := TdxReportCellString;
end;
function TdxCustomGridViewFormatter.GetCaptionViewParams: TdxReportItemViewParams;
begin
if ReportLink.OptionsFormatting.UseNativeStyles then
ReportLink.Styles.GetCaptionParams(Adapter.GridLevel, Result.NativeParams)
else
Result.NativeParams := Adapter.GetCaptionViewParams;
if UseLookAndFeelColors and Adapter.CanUseLookAndFeelColors then
begin
Result.NativeParams.Color := Adapter.ThemedCaptionColor;
Result.NativeParams.TextColor := Adapter.ThemedCaptionTextColor;
end;
Result.CellSides := csAll;
Result.FontStyle := [];
Result.Transparent := IsColorTransparent(Result.NativeParams.Color); //ReportLink.FixedTransparent;
end;
procedure TdxCustomGridViewFormatter.DoInitializeFilterBar(AFilterBar: TdxReportCellText);
begin
SetViewParams(AFilterBar, GetFilterBarViewParams);
if HasBackgroundBitmap(bbFilterBox) then
AFilterBar.BackgroundBitmapIndex := GetBackgroundBitmapIndex(bbFilterBox);
with AFilterBar do
begin
Data := Integer(TdxGridFilterBar);
EndEllipsis := True;
Text := Adapter.FilterText;
end;
if not Adapter.FilterEmpty then
with TdxReportCellCheck(AFilterBar) do
begin
Checked := Adapter.FilterActive;
CheckPos := ccpLeft;
end;
end;
procedure TdxCustomGridViewFormatter.DoInitializeFilterBarRow(ARow: TdxReportCell);
begin
end;
procedure TdxCustomGridViewFormatter.DoReportLinkInitializeFilterBar(AFilterBar: TdxReportCellText);
begin
ReportLink.DoInitializeFilterBar(TcxCustomGridTableView(Adapter.GridView), TdxReportCellString(AFilterBar));
end;
function TdxCustomGridViewFormatter.GetFilterBarClass: TdxReportCellTextClass;
const
CheckClasses: array[Boolean] of TdxReportCellTextClass = (TdxReportCellCheck, TdxReportCellString);
begin
Result := CheckClasses[Adapter.FilterEmpty];
end;
function TdxCustomGridViewFormatter.GetFilterBarViewParams: TdxReportItemViewParams;
begin
if ReportLink.OptionsFormatting.UseNativeStyles then
ReportLink.Styles.GetFilterBarParams(Result.NativeParams)
else
Result.NativeParams := Adapter.GetFilterBarViewParams;
if UseLookAndFeelColors and Adapter.CanUseLookAndFeelColors then
begin
Result.NativeParams.Color := Adapter.ThemedCaptionColor;
Result.NativeParams.TextColor := Adapter.ThemedCaptionTextColor;
end;
Result.CellSides := csAll;
Result.FontStyle := [];
Result.Transparent := IsColorTransparent(Result.NativeParams.Color); //ReportLink.FixedTransparent;
end;
procedure TdxCustomGridViewFormatter.DoInitializeDetailsSeparatorRow(ARow: TdxReportCell);
begin
end;
procedure TdxCustomGridViewFormatter.DoInitializeHorzDetailsSeparator(ASeparator: TdxReportCellBox);
begin
with ASeparator do
begin
CellSides := csTopBottom;
Color := DetailsSeparatorColor;
Transparent := False;
end;
end;
procedure TdxCustomGridViewFormatter.DoInitializeVertBottomDetailsSeparator(ASeparator: TdxReportCellBox;
ASeparatorKind: TdxVerticalDetailsSeparatorKind);
begin
DoInitializeVertDetailsSeparator(ASeparator, ASeparatorKind);
case ASeparatorKind of
vdskLeading:
ASeparator.CellSides := [csLeft, csBottom];
vdskTrailing:
ASeparator.CellSides := [csRight, csBottom];
end;
end;
procedure TdxCustomGridViewFormatter.DoInitializeVertDetailsSeparator(ASeparator: TdxReportCellBox;
ASeparatorKind: TdxVerticalDetailsSeparatorKind);
begin
with ASeparator do
begin
CellSides := [csLeft, csRight];
Color := DetailsSeparatorColor;
Transparent := False;
end;
end;
procedure TdxCustomGridViewFormatter.DoInitializeVertTopDetailsSeparator(ASeparator: TdxReportCellBox;
ASeparatorKind: TdxVerticalDetailsSeparatorKind);
begin
DoInitializeVertDetailsSeparator(ASeparator, ASeparatorKind);
case ASeparatorKind of
vdskLeading:
ASeparator.CellSides := [csLeft, csTop];
vdskTrailing:
ASeparator.CellSides := [csRight, csTop];
end;
end;
function TdxCustomGridViewFormatter.GetDetailsSeparatorClass: TdxReportCellBoxClass;
begin
Result := TdxReportCellBox;
end;
procedure TdxCustomGridViewFormatter.DoInitializeMasterIndent(AnIndent: TdxReportCellExpandButton;
AnIndex, AnIndentCount: Integer);
begin
end;
function TdxCustomGridViewFormatter.GetMasterIndentClass: TdxReportCellExpandButtonClass;
begin
Result := TdxReportCellExpandButton;
end;
procedure TdxCustomGridViewFormatter.DoInitializeViewTerminator(ATerminator: TdxReportCellBox);
begin
ATerminator.CellSides := [csBottom];
ATerminator.Transparent := True;
end;
function TdxCustomGridViewFormatter.QueryInterface(const IID: TGUID; out Obj): HResult;
begin
if GetInterface(IID, Obj) then
Result := 0
else
Result := E_NOINTERFACE;
end;
function TdxCustomGridViewFormatter._AddRef: Integer;
begin
Result := 1;
end;
function TdxCustomGridViewFormatter._Release: Integer;
begin
Result := 1;
end;
procedure TdxCustomGridViewFormatter.AddDelimiters;
begin
AddHorizontalDelimiters;
AddVerticalDelimiters;
end;
procedure TdxCustomGridViewFormatter.AddHorizontalDelimiters;
begin
end;
procedure TdxCustomGridViewFormatter.AddVerticalDelimiters;
var
I: Integer;
begin
if ReportLink.OptionsPagination.Row then
for I := 0 to Builder.ReportRowCount - 1 do
ReportLink.AddVerticalDelimiter(Builder.ReportRows[I]);
end;
procedure TdxCustomGridViewFormatter.AfterBuilding;
begin
Adapter.AfterBuilding;
FormatLookAndFeelItems;
FormatExpandButtons;
AddDelimiters;
end;
procedure TdxCustomGridViewFormatter.BeforeBuilding;
begin
Adapter.BeforeBuilding;
Calculate;
end;
procedure TdxCustomGridViewFormatter.Calculate;
begin
CalculateLineHeights;
end;
procedure TdxCustomGridViewFormatter.CalculateLineHeights;
begin
CaptionLineHeight := 2 * TabsAreaOffset + CalculateFontHeight(GetCaptionViewParams);
FilterBarLineHeight := 2 * FilterBarTextOffset + CalculateFontHeight(GetFilterBarViewParams);
end;
function TdxCustomGridViewFormatter.GetDetailsSeparatorColor: TColor;
begin
Result := Adapter.DetailsSeparatorColor;
{with ReportLink.OptionsFormatting do
if UseNativeStyles then
begin
Result := FixedColor;
end;}
end;
function TdxCustomGridViewFormatter.GetDetailsSeparatorThickness: Integer;
begin
Result := Adapter.DetailsSeparatorThickness;
end;
function TdxCustomGridViewFormatter.GetHasDetailsSeparator: Boolean;
begin
Result := Adapter.HasDetailsSeparator;
end;
function TdxCustomGridViewFormatter.GetSiteHeight: Integer;
var
ControllerIntf: IdxReportLinkController;
begin
if ReportLink.IsAggregated and
Supports(TObject(ReportLink.Controller), IdxReportLinkController, ControllerIntf) then
with ControllerIntf.GetControlSiteBounds(ReportLink.Grid) do
Result := Bottom - Top - 1
else
with ReportLink.RealPrinterPage.PaintRectPixels do
Result := Bottom - Top - 1;
end;
function TdxCustomGridViewFormatter.GetSiteWidth: Integer;
var
ControllerIntf: IdxReportLinkController;
begin
if ReportLink.IsAggregated and
Supports(TObject(ReportLink.Controller), IdxReportLinkController, ControllerIntf) then
with ControllerIntf.GetControlSiteBounds(ReportLink.Grid) do
Result := Right - Left - 1
else
with ReportLink.RealPrinterPage.PaintRectPixels do
Result := Right - Left - 1;
end;
function TdxCustomGridViewFormatter.GetViewWidth: Integer;
begin
Result := 0;
end;
function TdxCustomGridViewFormatter.GetViewWidthExtraAfter: Integer;
var
I: Integer;
begin
Result := 0;
for I := 0 to AbsoluteLevel - 1 do
with Builder.AbsoluteBuilders[I].Adapter do
if HasDetailsSeparator then Inc(Result, DetailsSeparatorThickness);
if Adapter.HasDetailsSeparator then
Inc(Result, Adapter.DetailsSeparatorThickness);
end;
function TdxCustomGridViewFormatter.GetViewWidthExtraBefore: Integer;
var
I: Integer;
begin
Result := 0;
for I := 0 to AbsoluteLevel - 1 do
with Builder.AbsoluteBuilders[I].Adapter do
begin
Inc(Result, ViewWidthExtra);
if HasDetailsSeparator then Inc(Result, DetailsSeparatorThickness);
end;
if Adapter.HasDetailsSeparator then
Inc(Result, Adapter.DetailsSeparatorThickness);
end;
function TdxCustomGridViewFormatter.BackgroundBitmaps: TcxCustomGridBackgroundBitmaps;
begin
Result := Adapter.BackgroundBitmaps;
end;
function TdxCustomGridViewFormatter.GetBackgroundBitmap(Index: Integer): TBitmap;
begin
if ReportLink.OptionsFormatting.UseNativeStyles then
Result := ReportLink.Styles.GetBitmap(MapStyleBackgroundBitmapIndex(Index))
else
Result := Adapter.GetBackgroundBitmap(Index);
end;
function TdxCustomGridViewFormatter.GetBackgroundBitmapIndex(Index: Integer): Integer;
begin
Result := ReportLink.AddBackgroundBitmapToPool(GetBackgroundBitmap(Index));
end;
function TdxCustomGridViewFormatter.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 TdxCustomGridViewFormatter.MapStyleBackgroundBitmapIndex(AGridBackgroundBitmapIndex: Integer): Integer;
begin
case AGridBackgroundBitmapIndex of
bbTabs:
Result := vspsGridCaption;
bbContent:
Result := vspsGridContent;
bbFilterBox:
Result := vspsGridFilterBar;
else
Result := 0;
end;
end;
function TdxCustomGridViewFormatter.CalculateFontHeight(const AParams: TdxReportItemViewParams): Integer;
begin
Result := Renderer.CalcTextPatternHeight(DC, AParams.NativeParams.Font);
end;
procedure TdxCustomGridViewFormatter.CalculateHeight(const AParams: TdxReportItemViewParams;
var AHeight: Integer);
var
Value: Integer;
begin
Value := CalculateFontHeight(AParams);
if Value > AHeight then AHeight := Value;
end;
function TdxCustomGridViewFormatter.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 TdxCustomGridViewFormatter.IsColorTransparent(AColor: TColor): Boolean;
begin
Result := ColorToRGB(AColor) = ColorToRGB(TransparentColor);
end;
procedure TdxCustomGridViewFormatter.RegisterExpandButton(AExpandButton: TdxReportCellExpandButton);
begin
FExpandButtons.Add(AExpandButton);
end;
procedure TdxCustomGridViewFormatter.RegisterLookAndFeelItem(AnItem: TdxReportVisualItem;
AEdgeStyle: TdxCellEdgeStyle);
begin
AnItem.EdgeMode := Self.EdgeMode;
AnItem.Edge3DStyle := AEdgeStyle;
FLookAndFeelItems.Add(AnItem);
end;
procedure TdxCustomGridViewFormatter.SetViewParams(AnItem: TdxReportVisualItem;
const AParams: TdxReportItemViewParams);
begin
AnItem.CellSides := AParams.CellSides;
AnItem.Color := ColorToRGB(AParams.NativeParams.Color);
AnItem.FontIndex := GetStyleFontIndex(AParams);
AnItem.Transparent := AParams.Transparent;
end;
function TdxCustomGridViewFormatter.GetAbsoluteLevel: Integer;
begin
Result := Adapter.AbsoluteLevel;
if ReportLink.OptionsDetails.StartFromFocusedView then
Dec(Result, (ReportLink.ActiveView.Level as TcxGridLevel).Level);
end;
function TdxCustomGridViewFormatter.GetAutoWidth: Boolean;
begin
Result := ReportLink.OptionsSize.AutoWidth or Adapter.AutoWidth;
end;
function TdxCustomGridViewFormatter.GetDC: HDC;
begin
Result := ReportLink.ScreenDC;
end;
function TdxCustomGridViewFormatter.GetEdgeMode: TdxCellEdgeMode;
const
EdgeModeMap: array[Boolean] of TdxCellEdgeMode = (cemPattern, cem3DEffects);
begin
Result := EdgeModeMap[ReportLink.OptionsFormatting.LookAndFeelKind <> lfUltraFlat];
end;
{$IFDEF DXVER500}
function TdxCustomGridViewFormatter.GetFilterBarPosition: TcxGridFilterPosition;
begin
Result := Adapter.FilterPosition;
end;
{$ENDIF}
function TdxCustomGridViewFormatter.GetGridWidth: Integer;
begin
Result := Adapter.GridWidth;
end;
function TdxCustomGridViewFormatter.GetExpandButton(Index: Integer): TdxReportCellExpandButton;
begin
Result := TdxReportCellExpandButton(FExpandButtons[Index]);
end;
function TdxCustomGridViewFormatter.GetExpandButtonCount: Integer;
begin
Result := FExpandButtons.Count;
end;
function TdxCustomGridViewFormatter.GetIndentWidth: Integer;
begin
Result := Adapter.IndentWidth;
end;
function TdxCustomGridViewFormatter.GetLookAndFeelItem(Index: Integer): TdxReportVisualItem;
begin
Result := TdxReportVisualItem(FLookAndFeelItems[Index]);
end;
function TdxCustomGridViewFormatter.GetLookAndFeelItemCount: Integer;
begin
Result := FLookAndFeelItems.Count;
end;
function TdxCustomGridViewFormatter.GetPaginateByTopLevelGroups: Boolean;
begin
Result := ReportLink.OptionsPagination.TopLevelGroup;
end;
function TdxCustomGridViewFormatter.GetRenderer: TdxPSReportRenderer;
begin
Result := ReportLink.Renderer;
end;
function TdxCustomGridViewFormatter.GetReportLink: TdxGridReportLink;
begin
Result := Builder.ReportLink;
end;
function TdxCustomGridViewFormatter.GetShowCaption: Boolean;
begin
Result := ReportLink.OptionsView.Caption;
end;
function TdxCustomGridViewFormatter.GetShowFilterBar: Boolean;
begin
Result := ReportLink.OptionsView.FilterBar;
end;
function TdxCustomGridViewFormatter.GetUseLookAndFeelColors: Boolean;
begin
Result := ReportLink.OptionsFormatting.UseLookAndFeelColors;
end;
function TdxCustomGridViewFormatter.GetViewAvailableWidth: Integer;
begin
if ReportLink.OptionsSize.AutoWidth then
Result := SiteWidth
else
Result := Adapter.ViewWidth;
Dec(Result, ViewWidthExtraBefore + ViewWidthExtraAfter);
end;
function TdxCustomGridViewFormatter.GetViewWidthExtra: Integer;
begin
Result := Adapter.ViewWidthExtra;
end;
procedure TdxCustomGridViewFormatter.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;
procedure TdxCustomGridViewFormatter.FormatExpandButtons;
var
I: Integer;
begin
for I := 0 to ExpandButtonCount - 1 do
with ExpandButtons[I] do
begin
ButtonBorder3D := ReportLink.Effects3D;
ButtonBorder3DSoft := ReportLink.Soft3D;
end;
end;
{ TdxCustomGridViewBuilder }
constructor TdxCustomGridViewBuilder.Create(AReportLink: TdxGridReportLink;
AMasterBuilder: TdxCustomGridViewBuilder; AGridView: TcxCustomGridView);
function GetMasterAdapter: TdxCustomGridViewAdapter;
begin
if AMasterBuilder = nil then
Result := nil
else
Result := AMasterBuilder.Adapter;
end;
begin
inherited Create;
FReportLink := AReportLink;
FMasterBuilder := AMasterBuilder;
FGridView := AGridView;
FAdapter := CreateAdapter(GetMasterAdapter, GridView);
FFormatter := FormatterClass.Create(Self);
FProducerCache := TdxProducerCache.Create(Self);
FReportRows := TList.Create;
if MasterBuilder <> nil then
MasterBuilder.FDetailsBuilder := Self;
end;
destructor TdxCustomGridViewBuilder.Destroy;
begin
if MasterBuilder <> nil then
MasterBuilder.FDetailsBuilder := nil;
FreeAndNil(FReportRows);
FreeAndNil(FProducerCache);
FreeAndNil(FFormatter);
FreeAndNil(FAdapter);
inherited;
end;
function TdxCustomGridViewBuilder.Adapter: TdxCustomGridViewAdapter;
begin
Result := FAdapter;
end;
class function TdxCustomGridViewBuilder.AdapterClass: TdxGridViewAdapterClass;
begin
Result := TdxCustomGridViewAdapter;
end;
class function TdxCustomGridViewBuilder.CreateAdapter(AMasterAdapter: TdxCustomGridViewAdapter;
AGridView: TcxCustomGridView): TdxCustomGridViewAdapter;
begin
Result := AdapterClass.Create(AMasterAdapter, AGridView);
end;
function TdxCustomGridViewBuilder.Formatter: TdxCustomGridViewFormatter;
begin
Result := FFormatter;
end;
class function TdxCustomGridViewBuilder.FormatterClass: TdxGridViewFormatterClass;
begin
Result := TdxCustomGridViewFormatter;
end;
procedure TdxCustomGridViewBuilder.Build;
begin
BeforeBuilding;
try
DoBuild;
finally
AfterBuilding;
end;
end;
function TdxCustomGridViewBuilder.IsAborted: Boolean;
begin
Result := ReportLink.AbortBuilding;
end;
procedure TdxCustomGridViewBuilder.Progress(const APercentDone: Double);
begin
ReportLink.DoProgress(APercentDone);
end;
class function TdxCustomGridViewBuilder.PairClass: TClass;
begin
Result := GridViewClass;
end;
class procedure TdxCustomGridViewBuilder.Register;
begin
dxGridViewBuildersFactory.Register(Self);
end;
class procedure TdxCustomGridViewBuilder.Unregister;
begin
dxGridViewBuildersFactory.Unregister(Self);
end;
procedure TdxCustomGridViewBuilder.AddReportRow(ARow: TdxReportCell);
begin
if ARow.Parent = ReportLink.ReportCells.Cells then
FReportRows.Add(ARow);
end;
procedure TdxCustomGridViewBuilder.AfterBuilding;
begin
if not IsAborted then Formatter.AfterBuilding;
end;
procedure TdxCustomGridViewBuilder.BeforeBuilding;
begin
Formatter.BeforeBuilding;
end;
procedure TdxCustomGridViewBuilder.DoBuild;
begin
DoBuildViewHeader;
DoBuildViewBody;
if not IsAborted then DoBuildViewFooter;
end;
procedure TdxCustomGridViewBuilder.DoBuildViewBody;
begin
end;
procedure TdxCustomGridViewBuilder.DoBuildViewFooter;
begin
end;
procedure TdxCustomGridViewBuilder.DoBuildViewHeader;
begin
end;
function TdxCustomGridViewBuilder.GetViewAvailableWidth: Integer;
begin
Result := Formatter.ViewAvailableWidth;
end;
procedure TdxCustomGridViewBuilder.CreateCaption;
var
ReportRow: TdxReportCell;
begin
ReportRow := GetCaptionProducer.Produce(HostInfoServices.CaptionHostInfo);
AddReportRow(ReportRow);
end;
function TdxCustomGridViewBuilder.GetCaptionProducer: TdxGridViewCaptionProducer;
begin
Result := ProducerCache[GetCaptionProducerClass] as TdxGridViewCaptionProducer;
end;
function TdxCustomGridViewBuilder.GetCaptionProducerClass: TdxGridViewCaptionProducerClass;
begin
Result := TdxGridViewCaptionProducer;
end;
procedure TdxCustomGridViewBuilder.CreateBottomDetailsSeparator;
var
ReportRow: TdxReportCell;
begin
ReportRow := GetDetailsBottomSeparatorProducer.Produce(HostInfoServices.LevelSeparatorBottomHostInfo);
AddReportRow(ReportRow);
end;
procedure TdxCustomGridViewBuilder.CreateTopDetailsSeparator;
var
ReportRow: TdxReportCell;
begin
ReportRow := GetDetailsTopSeparatorProducer.Produce(HostInfoServices.LevelSeparatorTopHostInfo);
AddReportRow(ReportRow);
end;
function TdxCustomGridViewBuilder.GetDetailsBottomSeparatorProducer: TdxGridViewDetailsSeparatorProducer;
begin
Result := ProducerCache[GetDetailsBottomSeparatorProducerClass] as TdxGridViewDetailsSeparatorProducer;
end;
function TdxCustomGridViewBuilder.GetDetailsBottomSeparatorProducerClass: TdxGridViewDetailsSeparatorProducerClass;
begin
Result := TdxGridViewDetailsBottomSeparatorProducer;
end;
function TdxCustomGridViewBuilder.GetDetailsTopSeparatorProducer: TdxGridViewDetailsSeparatorProducer;
begin
Result := ProducerCache[GetDetailsTopSeparatorProducerClass] as TdxGridViewDetailsSeparatorProducer;
end;
function TdxCustomGridViewBuilder.GetDetailsTopSeparatorProducerClass: TdxGridViewDetailsSeparatorProducerClass;
begin
Result := TdxGridViewDetailsTopSeparatorProducer;
end;
procedure TdxCustomGridViewBuilder.CreateFilterBar;
var
ReportRow: TdxReportCell;
begin
ReportRow := GetFilterBarProducer.Produce(HostInfoServices.FilterBarHostInfo);
AddReportRow(ReportRow);
end;
function TdxCustomGridViewBuilder.GetFilterBarProducer: TdxGridViewFilterBarProducer;
begin
Result := ProducerCache[GetFilterBarProducerClass] as TdxGridViewFilterBarProducer;
end;
function TdxCustomGridViewBuilder.GetFilterBarProducerClass: TdxGridViewFilterBarProducerClass;
begin
Result := TdxGridViewFilterBarProducer;
end;
procedure TdxCustomGridViewBuilder.CreateViewTerminator;
var
ReportRow: TdxReportCell;
begin
ReportRow := GetViewTerminatorProducer.Produce(HostInfoServices.PageDetailsHostInfo);
AddReportRow(ReportRow);
end;
function TdxCustomGridViewBuilder.GetViewTerminatorProducer: TdxGridViewTerminatorProducer;
begin
Result := ProducerCache[GetViewTerminatorProducerClass] as TdxGridViewTerminatorProducer;
end;
function TdxCustomGridViewBuilder.GetViewTerminatorProducerClass: TdxGridViewTerminatorProducerClass;
begin
Result := TdxGridViewTerminatorProducer;
end;
function TdxCustomGridViewBuilder.GridView: TcxCustomGridView;
begin
Result := FGridView;
end;
class function TdxCustomGridViewBuilder.GridViewClass: TcxCustomGridViewClass;
begin
Result := TcxCustomGridView;
end;
function TdxCustomGridViewBuilder.GetAbsoluteBuilder(AIndex: Integer): TdxCustomGridViewBuilder;
begin
Result := RootBuilder;
while AIndex > 0 do
begin
Result := Result.DetailsBuilder;
Dec(AIndex);
end;
end;
function TdxCustomGridViewBuilder.GetAutoWidth: Boolean;
begin
Result := Formatter.AutoWidth;
end;
function TdxCustomGridViewBuilder.GetGridLevel: TcxGridLevel;
begin
Result := GridView.Level as TcxGridLevel;
end;
function TdxCustomGridViewBuilder.GetGrid: TcxCustomGrid;
begin
Result := ReportLink.Grid;
end;
function TdxCustomGridViewBuilder.GetHost: TdxReportCell;
begin
Result := ReportLink.ReportCells.Cells;
end;
function TdxCustomGridViewBuilder.GetHostInfoServices: TdxGridAttributeHostInfoServices;
begin
Result := ReportLink.HostInfoServices;
end;
function TdxCustomGridViewBuilder.GetReportRow(Index: Integer): TdxReportCell;
begin
Result := TdxReportCell(FReportRows[Index]);
end;
function TdxCustomGridViewBuilder.GetReportRowCount: Integer;
begin
Result := FReportRows.Count;
end;
function TdxCustomGridViewBuilder.GetRootBuilder: TdxCustomGridViewBuilder;
begin
Result := Self;
while Result.MasterBuilder <> nil do
Result := Result.MasterBuilder;
end;
{ TdxCustomGridTableViewAdapter }
constructor TdxCustomGridTableViewAdapter.Create(AMasterAdapter: TdxCustomGridViewAdapter;
AGridView: TcxCustomGridView);
begin
inherited;
FRecordHelpersCache := TdxRecordHelpersCache.Create(Self);
FDetailsLineCount := -1;
end;
destructor TdxCustomGridTableViewAdapter.Destroy;
begin
FreeAndNil(FRecordHelpersCache);
inherited;
end;
function TdxCustomGridTableViewAdapter.ForEachRecord(AProc: TdxGridTableAdapterForEachRecordProc;
AData: Integer; AProcessSelection: Boolean): Boolean;
var
I: Integer;
Continue: Boolean;
Record_: TcxCustomGridRecord;
begin
Result := True;
if @AProc = nil then Exit;
Continue := True;
for I := 0 to RecordCount - 1 do
begin
Record_ := Records[I];
if not AProcessSelection or Record_.Selected then
AProc(Record_, AData, Continue);
if not Continue then
begin
Result := False;
Break;
end;
end;
end;
function TdxCustomGridTableViewAdapter.GridView: TcxCustomGridTableView;
begin
Result := inherited GridView as TcxCustomGridTableView;
end;
class function TdxCustomGridTableViewAdapter.GridViewClass: TcxCustomGridViewClass;
begin
Result := TcxCustomGridTableView;
end;
function TdxCustomGridTableViewAdapter.Styles: TcxCustomGridTableViewStyles;
begin
Result := inherited Styles as TcxCustomGridTableViewStyles;
end;
function TdxCustomGridTableViewAdapter.CalculateDetailsLineCount: Integer;
begin
Result := 1;
end;
function TdxCustomGridTableViewAdapter.GetContentViewParams(ARecord: TcxCustomGridRecord;
ATableItem: TcxCustomGridTableItem): TcxViewParams;
begin
if (ATableItem <> nil) and (ATableItem.Styles <> nil) then
ATableItem.Styles.GetContentParams(ARecord, Result)
else
Styles.GetContentParams(ARecord, ATableItem, Result);
if Result.Color = clWindow then // 3.2
Result.Color := dxPSCore.dxDefaultContentColor;
end;
function TdxCustomGridTableViewAdapter.GetPreviewViewParams(ARecord: TcxCustomGridRecord;
ATableItem: TcxCustomGridTableItem): TcxViewParams;
begin
Result := GetContentViewParams(ARecord, ATableItem);
end;
function TdxCustomGridTableViewAdapter.GetSelectionViewParams: TcxViewParams;
begin
FillChar(Result, SizeOf(Result), 0);
with Styles.Selection do
begin
Result.Bitmap := Bitmap;
Result.Color := Color;
Result.Font := Font;
Result.TextColor := TextColor;
end;
end;
function TdxCustomGridTableViewAdapter.HasSelectionStyle: Boolean;
begin
Result := Styles.Selection <> nil;
end;
function TdxCustomGridTableViewAdapter.Controller: TcxCustomGridTableController;
begin
Result := inherited Controller as TcxCustomGridTableController;
end;
procedure TdxCustomGridTableViewAdapter.DoExpandMasterRow(ARecord: TcxCustomGridRecord;
AData: Integer; var AContinue: Boolean);
begin
if (ARecord is TcxGridMasterDataRow) and ARecord.Expandable then
GridMasterDataRow_DoExpand(TcxGridMasterDataRow(ARecord), True);
{begin
ARecord.Expanded := True;
with TcxGridMasterDataRow(ARecord) do
if ActiveDetailGridViewExists then
ExpandAllRowsInGridView(ActiveDetailGridView, True, Boolean(AData));
end;}
end;
procedure TdxCustomGridTableViewAdapter.ExpandAllGroupRows;
begin
DataController.Groups.FullExpand;
end;
procedure TdxCustomGridTableViewAdapter.ExpandAllMasterRows(AnExpandGroups: Boolean);
begin
ForEachRecord(DoExpandMasterRow, Integer(AnExpandGroups), False);
end;
procedure TdxCustomGridTableViewAdapter.ExpandAllRowsInItself(AMasterRows, AGroupRows: Boolean);
begin
if AGroupRows then ExpandAllGroupRows;
if AMasterRows then ExpandAllMasterRows(AGroupRows);
end;
function TdxCustomGridTableViewAdapter.GetAreAllMasterRowsCollapsed: Boolean;
begin
Result := ForEachRecord(IsMasterRowCollapsed, 0, False);
end;
function TdxCustomGridTableViewAdapter.GetCanUseOnEveryPageMode: Boolean;
begin
Result := RecordCount <> 0;
end;
function TdxCustomGridTableViewAdapter.GetHasSelectedRecords: Boolean;
var
I: Integer;
begin
Result := SelectedRecordCount <> 0;
if not Result then
for I := 0 to RecordCount - 1 do
begin
Result := RecordHelpers[Records[I]].HasSelectedChildren;
if Result then Break;
end;
end;
function TdxCustomGridTableViewAdapter.GetMasterGridRecord: TcxCustomGridRecord;
begin
Result := GridView.MasterGridRecord;
end;
function TdxCustomGridTableViewAdapter.GetRecordCount: Integer;
begin
Result := GridView.ViewData.RecordCount;
end;
class function TdxCustomGridTableViewAdapter.GetProperties(AnItem: TcxCustomGridTableItem;
ARecord: TcxCustomGridRecord): TcxCustomEditProperties;
begin
Result := AnItem.GetProperties(ARecord);
if Result = nil then
Result := GetRepositoryItem(AnItem, ARecord).Properties;
end;
class function TdxCustomGridTableViewAdapter.GetPropertiesClass(AnItem: TcxCustomGridTableItem;
ARecord: TcxCustomGridRecord): TcxCustomEditPropertiesClass;
begin
Result := TcxCustomEditPropertiesClass(GetProperties(AnItem, ARecord).ClassType);
end;
class function TdxCustomGridTableViewAdapter.GetRepositoryItem(AnItem: TcxCustomGridTableItem;
ARecord: TcxCustomGridRecord): TcxEditRepositoryItem;
begin
Result := AnItem.GetRepositoryItem;
end;
procedure TdxCustomGridTableViewAdapter.IsMasterRowCollapsed(ARecord: TcxCustomGridRecord;
AData: Integer; var AContinue: Boolean);
begin
if ARecord is TcxGridMasterDataRow then
AContinue := not ARecord.Expanded;
end;
function TdxCustomGridTableViewAdapter.GetCellAutoHeight: Boolean;
begin
Result := CustomGridTableOptionsView_GetCellAutoHeight(GridView.OptionsView);
end;
function TdxCustomGridTableViewAdapter.GetCellMultiline: Boolean;
begin
Result := CustomGridTableOptionsView_GetCellAutoHeight(GridView.OptionsView);
end;
{$IFDEF DXVER500}
function TdxCustomGridTableViewAdapter.GetFilterPosition: TcxGridFilterPosition;
begin
Result := CustomGridTableFiltering_GetPosition(Filtering);
end;
{$ENDIF}
function TdxCustomGridTableViewAdapter.GetGridLineColor: TColor;
begin
Result := GridView.LookAndFeelPainter.DefaultGridLineColor;
end;
function TdxCustomGridTableViewAdapter.GetCellEndEllipsis: Boolean;
begin
Result := GridView.OptionsView.CellEndEllipsis;
end;
function TdxCustomGridTableViewAdapter.GetDetailsLineCount: Integer;
begin
if FDetailsLineCount = -1 then
FDetailsLineCount := CalculateDetailsLineCount;
Result := FDetailsLineCount;
end;
function TdxCustomGridTableViewAdapter.GetFiltering: TcxCustomGridTableFiltering;
begin
Result := GridView.Filtering;
end;
function TdxCustomGridTableViewAdapter.GetIsGridMode: Boolean;
begin
Result := DataController.IsGridMode;
end;
function TdxCustomGridTableViewAdapter.GetRecord(Index: Integer): TcxCustomGridRecord;
begin
Result := GridView.ViewData.Records[Index];
end;
function TdxCustomGridTableViewAdapter.GetRecordHelper(ARecord: TcxCustomGridRecord): TdxCustomGridRecordHelper;
begin
Result := RecordHelpersCache.Helpers[ARecord];
end;
function TdxCustomGridTableViewAdapter.GetSelectedRecord(Index: Integer): TcxCustomGridRecord;
begin
Result := Controller.SelectedRecords[Index]
end;
function TdxCustomGridTableViewAdapter.GetSelectedRecordCount: Integer;
begin
if CustomGridTableController_GetMultiSelect(Controller) then
Result := Controller.SelectedRecordCount
else
Result := 0;
end;
{ TdxCustomGridTableViewFormatter }
constructor TdxCustomGridTableViewFormatter.Create(ABuilder: TdxCustomGridViewBuilder);
begin
inherited;
FRecordIndexes := TList.Create;
FSelectedRecordList := TList.Create;
//if ReportLink.OptionsSelection.ProcessSelection then BuildSelectedRecordList; {moved to BeforeBuilding in 3.03}
end;
destructor TdxCustomGridTableViewFormatter.Destroy;
begin
FreeAndNil(FRecordIndexes);
FreeAndNil(FSelectedRecordList);
inherited;
end;
function TdxCustomGridTableViewFormatter.Adapter: TdxCustomGridTableViewAdapter;
begin
Result := inherited Adapter as TdxCustomGridTableViewAdapter;
end;
function TdxCustomGridTableViewFormatter.Builder: TdxCustomGridTableViewBuilder;
begin
Result := inherited Builder as TdxCustomGridTableViewBuilder;
end;
function TdxCustomGridTableViewFormatter.IndexOfRecord(ARecord: TcxCustomGridRecord): Integer;
begin
for Result := 0 to RecordCount - 1 do
if Records[Result] = ARecord then Exit;
Result := -1;
end;
procedure TdxCustomGridTableViewFormatter.CheckDisplayValuePost(
AProperties: TcxCustomEditProperties; ATableItem: TcxCustomGridTableItem;
ARecord: TcxCustomGridRecord; AnItem: TAbstractdxReportCellData);
var
S: string;
begin
if (ATableItem <> nil) and (ARecord <> nil) and (AnItem is TdxReportCellText) and
(AProperties.GetEditValueSource(False) = evsValue) then
begin
S := TdxReportCellText(AnItem).Text;
TcxCustomGridTableItemAccess(ATableItem).DoGetDisplayText(ARecord, S);
TdxReportCellText(AnItem).Text := S;
end;
end;
procedure TdxCustomGridTableViewFormatter.DoInitializeItem(AnItem: TAbstractdxReportCellData;
ATableItem: TcxCustomGridTableItem; ARecord: TcxCustomGridRecord; AnIsPreview: Boolean = False);
function GetContentBackgroundBitmapStyleIndex: Integer;
begin
if AnIsPreview then
Result := bbPreview
else
Result := Self.GetContentBackgroundBitmapStyleIndex(ATableItem);
end;
var
Properties: TcxCustomEditProperties;
ViewParams: TdxReportItemViewParams;
CellValue: TcxEditValue;
ContentBackgroundBitmapStyleIndex: Integer;
begin
Properties := GetItemProperties(ATableItem, ARecord);
ViewParams := GetItemViewParams(ATableItem, ARecord, AnIsPreview);
CellValue := GetItemValue(Properties, ATableItem, ARecord);
dxPScxCommon.dxPSDataMaps.InitializeItem(AnItem, Properties, CellValue, Self,
ViewParams, AnIsPreview, ARecord.RecordIndex, ATableItem);
CheckDisplayValuePost(Properties, ATableItem, ARecord, AnItem);
dxPScxCommon.dxPSDataMaps.GetImageLists(Properties, ReportLink.AppendImageList);
SetViewParams(AnItem, ViewParams);
ContentBackgroundBitmapStyleIndex := GetContentBackgroundBitmapStyleIndex;
if HasBackgroundBitmap(ContentBackgroundBitmapStyleIndex) then
AnItem.BackgroundBitmapIndex := GetBackgroundBitmapIndex(ContentBackgroundBitmapStyleIndex);
AnItem.Data := Integer(ATableItem);
end;
function TdxCustomGridTableViewFormatter.GetItemClass(ATableItem: TcxCustomGridTableItem;
ARecord: TcxCustomGridRecord; AnIsPreview: Boolean = False): TdxReportCellDataClass;
begin
Result := dxPSDataMaps.ItemClass(GetItemProperties(ATableItem, ARecord), AnIsPreview);
end;
function TdxCustomGridTableViewFormatter.GetItemProperties(ATableItem: TcxCustomGridTableItem;
ARecord: TcxCustomGridRecord): TcxCustomEditProperties;
begin
Result := Adapter.GetProperties(ATableItem, ARecord);
end;
function TdxCustomGridTableViewFormatter.GetItemValue(AProperties: TcxCustomEditProperties;
ATableItem: TcxCustomGridTableItem; ARecord: TcxCustomGridRecord): TcxEditValue;
var
S: string;
begin
if AProperties.GetEditValueSource(False) = evsValue then
Result := ARecord.Values[ATableItem.Index]
else
begin
S := ARecord.DisplayTexts[ATableItem.Index];
TcxCustomGridTableItemAccess(ATableItem).DoGetDisplayText(ARecord, S);
Result := S;
end;
end;
function TdxCustomGridTableViewFormatter.GetItemViewParams(ATableItem: TcxCustomGridTableItem;
ARecord: TcxCustomGridRecord; AnIsPreview: Boolean = False): TdxReportItemViewParams;
begin
FillChar(Result, 0, SizeOf(Result));
if ReportLink.OptionsFormatting.UseNativeStyles then
if CanProcessSelectionStyle(ARecord) then
ReportLink.Styles.GetSelectionParams(Result.NativeParams)
else
if AnIsPreview then
ReportLink.Styles.GetPreviewParams(ARecord, ATableItem, Result.NativeParams)
else
ReportLink.Styles.GetContentParams(ARecord, ATableItem, Result.NativeParams)
else
if CanProcessSelectionStyle(ARecord) then
Result.NativeParams := Adapter.GetSelectionViewParams
else
if AnIsPreview then
Result.NativeParams := Adapter.GetPreviewViewParams(ARecord, ATableItem)
else
Result.NativeParams := Adapter.GetContentViewParams(ARecord, ATableItem);
end;
{ IdxPSCellParams }
function TdxCustomGridTableViewFormatter.IdxPSCellParams_GetAutoHeight: Boolean;
begin
Result := Adapter.CellAutoHeight;
end;
function TdxCustomGridTableViewFormatter.IdxPSCellParams_GetDC: HDC;
begin
Result := Self.DC;
end;
function TdxCustomGridTableViewFormatter.IdxPSCellParams_GetDisplayGraphicsAsText: Boolean;
begin
Result := ReportLink.OptionsRefinements.DisplayGraphicsAsText;
end;
function TdxCustomGridTableViewFormatter.IdxPSCellParams_GetEndEllipsis: Boolean;
begin
Result := Adapter.CellEndEllipsis;
end;
function TdxCustomGridTableViewFormatter.IdxPSCellParams_GetFlatCheckMarks: Boolean;
begin
Result := ReportLink.OptionsRefinements.FlatCheckMarks;
end;
function TdxCustomGridTableViewFormatter.IdxPSCellParams_GetGraphicsText: string;
begin
Result := ReportLink.OptionsRefinements.GraphicsText;
end;
function TdxCustomGridTableViewFormatter.IdxPSCellParams_GetMultiline: Boolean;
begin
Result := Adapter.CellMultiline;
end;
function TdxCustomGridTableViewFormatter.IdxPSCellParams_GetTransparentGraphics: Boolean;
begin
Result := ReportLink.OptionsRefinements.TransparentGraphics;
end;
{ IdxPSCellParams2 }
function TdxCustomGridTableViewFormatter.IdxPSCellParams2_GetPreviewMarginLeft: Integer;
begin
Result := dxTextSpace;
end;
function TdxCustomGridTableViewFormatter.IdxPSCellParams2_GetPreviewMarginRight: Integer;
begin
Result := dxTextSpace;
end;
function TdxCustomGridTableViewFormatter.IdxPSCellParams2_GetPreviewMaxHeight: Integer;
begin
Result := -1;
end;
function TdxCustomGridTableViewFormatter.IdxPSCellParams2_GetPreviewMaxLineCount: Integer;
begin
Result := -1;
end;
function TdxCustomGridTableViewFormatter.IdxPSCellParams2_GetRichEditGraphicClass: TGraphicClass;
const
GraphicClasses: array[Boolean] of TGraphicClass = (TMetafile, TBitmap);
begin
Result := GraphicClasses[IdxPSCellParams2_GetRichEditTransparent];
end;
function TdxCustomGridTableViewFormatter.IdxPSCellParams2_GetRichEditTransparent: Boolean;
begin
{$IFDEF DXVER500}
Result := ReportLink.OptionsRefinements.TransparentRichEdits;
{$ELSE}
Result := False;
{$ENDIF}
end;
procedure TdxCustomGridTableViewFormatter.AfterBuilding;
begin
inherited;
ReportLink.ReportCells.BorderColor := GridLineColor;
end;
procedure TdxCustomGridTableViewFormatter.BeforeBuilding;
begin
inherited;
if ReportLink.OptionsSelection.ProcessSelection then BuildSelectedRecordList;
end;
procedure TdxCustomGridTableViewFormatter.BuildSelectedRecordList;
var
I: Integer;
ARecord: TcxCustomGridRecord;
IsRecordIncluded: Boolean;
Helper: TdxCustomGridRecordHelper;
begin
SelectedRecordList.Clear;
for I := 0 to Adapter.RecordCount - 1 do
begin
ARecord := Adapter.Records[I];
IsRecordIncluded := ARecord.Selected;
if not IsRecordIncluded then
begin
Helper := Adapter.RecordHelpers[ARecord];
IsRecordIncluded := Helper.HasSelectedChildren or
(not ReportLink.OptionsSelection.ProcessExactSelection and (SelectedRecordList.IndexOf(Helper.Parent) <> -1));
end;
if IsRecordIncluded then
SelectedRecordList.Add(ARecord);
end;
end;
function TdxCustomGridTableViewFormatter.CanProcessSelectionStyle(ARecord: TcxCustomGridRecord): Boolean;
begin
Result := (ARecord <> nil) and ReportLink.OptionsFormatting.ConsumeSelectionStyle and IsSelectedRecord(ARecord);
if Result and not ReportLink.OptionsFormatting.UseNativeStyles then
Result := Adapter.HasSelectionStyle;
end;
function TdxCustomGridTableViewFormatter.IsSelectedRecord(ARecord: TcxCustomGridRecord): Boolean;
begin
Result := (SelectedRecordCount <> 0) or ARecord.Selected;
end;
function TdxCustomGridTableViewFormatter.GetContentBackgroundBitmapStyleIndex(ATableItem: TcxCustomGridTableItem): Integer;
begin
Result := bbContent;
end;
function TdxCustomGridTableViewFormatter.MapStyleBackgroundBitmapIndex(AGridBackgroundBitmapIndex: Integer): Integer;
begin
case AGridBackgroundBitmapIndex of
bbContent:
Result := vspsGridContent;
else
Result := 0;
end;
if Result = 0 then
Result := inherited MapStyleBackgroundBitmapIndex(AGridBackgroundBitmapIndex);
end;
function TdxCustomGridTableViewFormatter.GetGridLineColor: TColor;
begin
Result := ReportLink.OptionsFormatting.GridLineColor;
if Result = clDefault then
Result := Adapter.GridLineColor;
end;
function TdxCustomGridTableViewFormatter.GetRecord(Index: Integer): TcxCustomGridRecord;
begin
if SelectedRecordCount <> 0 then
Result := SelectedRecords[Index]
else
Result := Adapter.Records[Index];
end;
function TdxCustomGridTableViewFormatter.GetRecordCount: Integer;
begin
Result := SelectedRecordCount;
if Result = 0 then
Result := Adapter.RecordCount;
end;
function TdxCustomGridTableViewFormatter.GetRecordIndex(ARecord: TcxCustomGridRecord): Integer;
var
RecordIndex, IndexCount, I: Integer;
begin
RecordIndex := ARecord.Index;
IndexCount := FRecordIndexes.Count;
if RecordIndex > IndexCount - 1 then
begin
FRecordIndexes.Count := RecordIndex + 1;
for I := IndexCount to FRecordIndexes.Count - 1 do
FRecordIndexes[I] := TObject(-1);
end;
Result := Integer(FRecordIndexes[RecordIndex]);
if Result = -1 then
begin
FRecordIndexes[RecordIndex] := TObject(IndexOfRecord(ARecord));
Result := Integer(FRecordIndexes[RecordIndex]);
end;
end;
function TdxCustomGridTableViewFormatter.GetSelectedRecord(Index: Integer): TcxCustomGridRecord;
begin
Result := TcxCustomGridRecord(FSelectedRecordList[Index]);
end;
function TdxCustomGridTableViewFormatter.GetSelectedRecordCount: Integer;
begin
Result := FSelectedRecordList.Count;
end;
{ TdxCustomGridTableViewBuilder }
function TdxCustomGridTableViewBuilder.Adapter: TdxCustomGridTableViewAdapter;
begin
Result := inherited Adapter as TdxCustomGridTableViewAdapter;
end;
class function TdxCustomGridTableViewBuilder.AdapterClass: TdxGridViewAdapterClass;
begin
Result := TdxCustomGridTableViewAdapter;
end;
function TdxCustomGridTableViewBuilder.Formatter: TdxCustomGridTableViewFormatter;
begin
Result := inherited Formatter as TdxCustomGridTableViewFormatter;
end;
class function TdxCustomGridTableViewBuilder.FormatterClass: TdxGridViewFormatterClass;
begin
Result := TdxCustomGridTableViewFormatter;
end;
procedure TdxCustomGridTableViewBuilder.DoBuildViewFooter;
begin
if Formatter.ShowFilterBar {$IFDEF DXVER500} and (Formatter.FilterBarPosition = fpBottom) {$ENDIF} then
CreateFilterBar;
if Formatter.HasDetailsSeparator then
CreateBottomDetailsSeparator;
inherited;
end;
procedure TdxCustomGridTableViewBuilder.DoBuildViewHeader;
begin
inherited;
if Formatter.HasDetailsSeparator then
CreateTopDetailsSeparator;
if Formatter.ShowCaption then
CreateCaption;
{$IFDEF DXVER500}
if Formatter.ShowFilterBar and (Formatter.FilterBarPosition = fpTop) then
CreateFilterBar;
{$ENDIF}
end;
procedure TdxCustomGridTableViewBuilder.DoGetCellHeight(ARecord: TcxCustomGridRecord;
ATableItem: TcxCustomGridTableItem; var AHeight: Integer);
begin
ReportLink.DoGetCellHeight(GridView, ARecord, ATableItem, AHeight);
end;
function TdxCustomGridTableViewBuilder.GridView: TcxCustomGridTableView;
begin
Result := inherited GridView as TcxCustomGridTableView;
end;
class function TdxCustomGridTableViewBuilder.GridViewClass: TcxCustomGridViewClass;
begin
Result := TcxCustomGridTableView;
end;
{ TdxGridTableViewAdapter }
constructor TdxGridTableViewAdapter.Create(AMasterAdapter: TdxCustomGridViewAdapter;
AGridView: TcxCustomGridView);
begin
inherited;
GridTableViewInfo_CalculateExpandButtonParams(GridView.ViewInfo); // because LevelIndent
end;
function TdxGridTableViewAdapter.GridView: TcxGridTableView;
begin
Result := inherited GridView as TcxGridTableView;
end;
class function TdxGridTableViewAdapter.GridViewClass: TcxCustomGridViewClass;
begin
Result := TcxCustomGridView;
end;
function TdxGridTableViewAdapter.Styles: TcxGridTableViewStyles;
begin
Result := inherited Styles as TcxGridTableViewStyles;
end;
function TdxGridTableViewAdapter.HasDetails(AGridRow: TcxCustomGridRow): Boolean;
begin
Result := RecordHelpers[AGridRow].HasDetails;
end;
function TdxGridTableViewAdapter.GetGroupFooterCount(AGridRow: TcxCustomGridRow): Integer;
var
I: Integer;
begin
Result := 0;
for I := 0 to AGridRow.Level do
if HasGroupFooter(AGridRow, I) then
Inc(Result);
end;
function TdxGridTableViewAdapter.GetGroupFooterItemText(ARowIndex, ALevel, AIndex: Integer): string;
var
SummaryIndex: Integer;
begin
SummaryIndex := Summary.GroupFooterIndexOfItemLink[ALevel, Columns[AIndex]];
if SummaryIndex <> -1 then
Result := Summary.GroupFooterSummaryTexts[ARowIndex, ALevel, SummaryIndex]
else
Result := '';
end;
function TdxGridTableViewAdapter.HasGroupFooter(AGridRow: TcxCustomGridRow; ALevel: Integer): Boolean;
begin
if GroupFootersMode <> gfInvisible then
begin
if GroupFootersMode = gfAlwaysVisible then
Dec(ALevel);
Result := (0 <= ALevel) and (ALevel < AGridRow.Level) and AGridRow.IsParentRecordLast[ALevel];
if (AGridRow is TcxGridGroupRow) and (GroupFootersMode = gfAlwaysVisible) then
Result := Result or (ALevel = -1) and not AGridRow.Expanded;
end
else
Result := False;
end;
function TdxGridTableViewAdapter.HasGroupFooterItem(ALevel, AIndex: Integer): Boolean;
begin
Result := Summary.GroupFooterIndexOfItemLink[ALevel, Columns[AIndex]] <> -1;
end;
function TdxGridTableViewAdapter.HasGroupFooters(AGridRow: TcxCustomGridRow): Boolean;
begin
Result := GetGroupFooterCount(AGridRow) <> 0;
end;
function TdxGridTableViewAdapter.Controller: TcxGridTableController;
begin
Result := inherited Controller as TcxGridTableController;
end;
function TdxGridTableViewAdapter.DataController: TcxGridDataController;
begin
Result := GridView.DataController;
end;
function TdxGridTableViewAdapter.GetAutoWidth: Boolean;
begin
Result := GridView.OptionsView.ColumnAutoWidth;
end;
function TdxGridTableViewAdapter.GetCellAutoHeight: Boolean;
begin
Result := inherited GetCellAutoHeight and (DetailsLineCount = 1) and not DataRowHeightAssigned;
end;
function TdxGridTableViewAdapter.GetCellMultiline: Boolean;
begin
Result := inherited GetCellAutoHeight;// {3.1} and not DataRowHeightAssigned;// and (DetailsLineCount <> 1);
end;
function TdxGridTableViewAdapter.GetHeaderAutoHeight: Boolean;
begin
Result := GridView.OptionsView.HeaderAutoHeight and not HeaderHeightAssigned;
end;
function TdxGridTableViewAdapter.GetHeaderMultiline(Column: TcxGridColumn): Boolean;
begin
Result := HeaderAutoHeight or HeaderHeightAssigned;
end;
function TdxGridTableViewAdapter.GetIndentCount: Integer;
begin
Result := inherited GetIndentCount + GroupedColumnCount;
if (Result <> 0) and (GroupedColumnCount <> 0) and IsOffice11StyleGrouping then
Dec(Result);
end;
function TdxGridTableViewAdapter.GetIndentWidth: Integer;
begin
Result := GridView.ViewInfo.LevelIndent;
end;
function TdxGridTableViewAdapter.GetIndicatorWidth: Integer;
begin
if GridView.OptionsView.Indicator then
Result := GridView.OptionsView.IndicatorWidth
else
Result := 0;
end;
function TdxGridTableViewAdapter.GetIsOffice11StyleGrouping: Boolean;
begin
{$IFDEF DXVER500}
Result := GridView.OptionsView.GroupRowStyle = grsOffice11;
{$ELSE}
Result := False;
{$ENDIF}
end;
function TdxGridTableViewAdapter.GetViewWidthExtra: Integer;
var
IndentCount: Integer;
begin
Result := inherited GetViewWidthExtra;
IndentCount := GroupedColumnCount;
if (IndentCount <> 0) and IsOffice11StyleGrouping then
Dec(IndentCount);
Inc(Result, IndentCount * IndentWidth);
end;
function TdxGridTableViewAdapter.GetDataRowHeight: Integer;
begin
Result := GridView.OptionsView.DataRowHeight;
end;
function TdxGridTableViewAdapter.GetDataRowHeightAssigned: Boolean;
begin
Result := DataRowHeight <> 0;
end;
function TdxGridTableViewAdapter.GetFooterHeight: Integer;
begin
Result := DefaultFooterLineHeight;//GridView.OptionsView.HeaderHeight; {PS 3.03}
end;
function TdxGridTableViewAdapter.GetFooterHeightAssigned: Boolean;
begin
Result := False;
end;
function TdxGridTableViewAdapter.GetGroupFooterHeight: Integer;
begin
Result := DefaultGroupFooterLineHeight;
end;
function TdxGridTableViewAdapter.GetGroupFooterHeightAssigned: Boolean;
begin
Result := False;
end;
function TdxGridTableViewAdapter.GetGroupRowHeight: Integer;
begin
Result := GridView.OptionsView.GroupRowHeight;
end;
function TdxGridTableViewAdapter.GetGroupRowHeightAssigned: Boolean;
begin
Result := GroupRowHeight <> 0;
end;
function TdxGridTableViewAdapter.GetHeaderHeight: Integer;
begin
Result := GridView.OptionsView.HeaderHeight;
end;
function TdxGridTableViewAdapter.GetHeaderHeightAssigned: Boolean;
begin
Result := HeaderHeight <> 0;
end;
function TdxGridTableViewAdapter.GetFilterBarViewParams: TcxViewParams;
begin
Styles.GetViewParams(vsFilterBox, nil, nil, Result);
end;
function TdxGridTableViewAdapter.GetFooterViewParams(ARecord: TcxCustomGridRecord;
AGroupLevel: Integer; AColumn: TcxGridColumn): TcxViewParams;
begin
if (AColumn <> nil) and (AColumn.Styles <> nil) then
AColumn.Styles.GetFooterParams(TcxCustomGridRow(ARecord), {$IFDEF DXVER500} AGroupLevel, {$ENDIF} Result)
else
Styles.GetFooterParams(TcxCustomGridRow(ARecord), AColumn, {$IFDEF DXVER500} AGroupLevel, {$ENDIF} Result);
end;
function TdxGridTableViewAdapter.GetGroupRowViewParams(ARecord: TcxCustomGridRecord;
AGroupLevel: Integer): TcxViewParams;
begin
if (AGroupLevel >= 0) and (AGroupLevel < Styles.GridView.GroupedItemCount) then
Styles.GetGroupParams(ARecord, AGroupLevel, Result)
else
Styles.GetViewParams(vsGroup, ARecord, nil, Result);
end;
function TdxGridTableViewAdapter.GetHeaderViewParams(AColumn: TcxGridColumn): TcxViewParams;
begin
if (AColumn <> nil) and (AColumn.Styles <> nil) then
AColumn.Styles.GetHeaderParams(Result)
else
Styles.GetHeaderParams(AColumn, Result);
if AColumn = nil then
Result.Color := LookAndFeelPainter.DefaultHeaderBackgroundColor;
end;
function TdxGridTableViewAdapter.GetPreviewViewParams(ARecord: TcxCustomGridRecord;
AnItem: TcxCustomGridTableItem): TcxViewParams;
begin
Styles.GetPreviewParams(ARecord, TcxGridColumn(AnItem), Result);
// 3.2
if Result.Color = clWindow then
Result.Color := dxPSCore.dxDefaultContentColor;
end;
function TdxGridTableViewAdapter.GetColumn(Index: Integer): TcxGridColumn;
begin
Result := GridView.VisibleColumns[Index];
end;
function TdxGridTableViewAdapter.GetColumnCount: Integer;
begin
Result := GridView.VisibleColumnCount;
end;
function TdxGridTableViewAdapter.GetExpandButtonColor: TColor;
begin
Result := ExpandButtonInteriorColor;
end;
function TdxGridTableViewAdapter.GetExpandButtonSize: Integer;
begin
Result := GridView.ViewInfo.ExpandButtonSize;
end;
function TdxGridTableViewAdapter.GetFooterItemText(Index: Integer): string;
var
SummaryIndex: Integer;
begin
SummaryIndex := Summary.FooterSummaryItems.IndexOfItemLink(Columns[Index]);
if SummaryIndex <> -1 then
Result := Summary.FooterSummaryTexts[SummaryIndex]
else
Result := '';
end;
function TdxGridTableViewAdapter.GetFooterMultiline: Boolean;
begin
{$IFDEF DXVER500}
Result := GridView.OptionsView.FooterAutoHeight;
{$ELSE}
Result := False;
{$ENDIF}
end;
function TdxGridTableViewAdapter.GetGridLineColor: TColor;
begin
Result := GridView.OptionsView.GridLineColor;
if Result = clDefault then
Result := GridView.LookAndFeelPainter.DefaultGridLineColor;
end;
function TdxGridTableViewAdapter.GetGridLines: TcxGridLines;
begin
Result := GridView.OptionsView.GridLines;
end;
function TdxGridTableViewAdapter.GetGroupedColumn(Index: Integer): TcxGridColumn;
begin
Result := GridView.GroupedColumns[Index];
end;
function TdxGridTableViewAdapter.GetGroupedColumnCount: Integer;
begin
Result := GridView.GroupedColumnCount;
end;
function TdxGridTableViewAdapter.GetGroupFootersMode: TcxGridGroupFootersMode;
begin
Result := GridView.OptionsView.GroupFooters;
end;
function TdxGridTableViewAdapter.GetGroupFootersMultiline: Boolean;
begin
{$IFDEF DXVER500}
Result := GridView.OptionsView.FooterAutoHeight;
{$ELSE}
Result := False;
{$ENDIF}
end;
function TdxGridTableViewAdapter.GetGroupRowSeparatorColor: TColor;
begin
{$IFDEF DXVER500}
Result := dxOffice11.dxOffice11GroupRowSeparatorColor;
{$ELSE}
Result := clBtnFace;
{$ENDIF}
end;
function TdxGridTableViewAdapter.GetGroupRowSeparatorThickness: Integer;
begin
{$IFDEF DXVER500}
Result := cxGridTableView.cxGridOffice11GroupRowSeparatorWidth;
{$ELSE}
Result := 2;
{$ENDIF}
end;
function TdxGridTableViewAdapter.GetHasFooterItem(Index: Integer): Boolean;
begin
Result := Summary.FooterSummaryItems.IndexOfItemLink(Columns[Index]) <> -1;
end;
function TdxGridTableViewAdapter.GetHasPreview: Boolean;
begin
Result := PreviewColumn <> nil;
end;
function TdxGridTableViewAdapter.GetHasRowSeparators: Boolean;
begin
Result := RowSeparatorThickness > 0;
end;
function TdxGridTableViewAdapter.GetHeaderEndEllipsis: Boolean;
begin
Result := GridView.OptionsView.HeaderEndEllipsis;
end;
function TdxGridTableViewAdapter.GetInternalColumnMinWidth(Column: TcxGridColumn): Integer;
begin
Result := Column.MinWidth;
if Column.IsMostLeft then
Inc(Result, IndentCount * IndentWidth);
end;
function TdxGridTableViewAdapter.GetInternalColumnWidth(Column: TcxGridColumn): Integer;
begin
Result := Column.Width;
if Column.IsMostLeft then
Inc(Result, IndentCount * IndentWidth);
end;
function TdxGridTableViewAdapter.GetPreviewColumn: TcxGridColumn;
begin
Result := GridView.Preview.Column;
end;
function TdxGridTableViewAdapter.GetPreviewLeftIndent: Integer;
begin
Result := GridView.Preview.LeftIndent;
end;
function TdxGridTableViewAdapter.GetPreviewPlace: TcxGridPreviewPlace;
begin
Result := GridView.Preview.Place;
end;
function TdxGridTableViewAdapter.GetPreviewRightIndent: Integer;
begin
Result := GridView.Preview.RightIndent;
end;
function TdxGridTableViewAdapter.GetRow(Index: Integer): TcxCustomGridRow;
begin
Result := TcxCustomGridRow(Records[Index]);
end;
function TdxGridTableViewAdapter.GetRowCount: Integer;
begin
Result := RecordCount;
end;
function TdxGridTableViewAdapter.GetRowSeparatorColor: TColor;
begin
Result := GridView.OptionsView.RowSeparatorColor;
end;
function TdxGridTableViewAdapter.GetRowSeparatorThickness: Integer;
begin
Result := GridView.OptionsView.RowSeparatorWidth;
end;
function TdxGridTableViewAdapter.GetShowExpandButtonsForEmptyDetails: Boolean;
begin
{$IFDEF DXVER500}
Result := GridView.OptionsView.ExpandButtonsForEmptyDetails;
{$ELSE}
Result := True;
{$ENDIF}
end;
function TdxGridTableViewAdapter.GetShowHorzGridLines: Boolean;
begin
Result := GridLines in [glBoth, glHorizontal];
end;
function TdxGridTableViewAdapter.GetShowVertGridLines: Boolean;
begin
Result := GridLines in [glBoth, glVertical];
end;
function TdxGridTableViewAdapter.GetThemedFooterItemColor: TColor;
begin
Result := LookAndFeelPainter.DefaultFooterColor;
end;
function TdxGridTableViewAdapter.GetThemedFooterItemTextColor: TColor;
begin
Result := LookAndFeelPainter.DefaultFooterTextColor;
end;
function TdxGridTableViewAdapter.GetThemedHeaderItemColor: TColor;
begin
Result := LookAndFeelPainter.DefaultHeaderColor;
end;
function TdxGridTableViewAdapter.GetThemedHeaderItemTextColor: TColor;
begin
Result := LookAndFeelPainter.DefaultHeaderTextColor;
end;
{ TdxCustomGridTableViewItemPlaceController }
constructor TdxCustomGridTableViewItemPlaceController.Create(AFormatter: TdxGridTableViewFormatter);
begin
inherited Create;
FFormatter := AFormatter;
FHeaderLineCount := -1;
FWidth := -1;
end;
procedure TdxCustomGridTableViewItemPlaceController.Calculate;
begin
end;
procedure TdxCustomGridTableViewItemPlaceController.Refresh;
begin
end;
function TdxCustomGridTableViewItemPlaceController.CalculateHeaderLineCount: Integer;
begin
Result := 1;
end;
function TdxCustomGridTableViewItemPlaceController.CalculateWidth: Integer;
begin
Result := 0;
end;
function TdxCustomGridTableViewItemPlaceController.GetItemByColumn(Column: TcxGridColumn): TdxGridTableViewColumnPlace;
begin
Result := nil;
end;
procedure TdxCustomGridTableViewItemPlaceController.WidthChanged;
begin
end;
function TdxCustomGridTableViewItemPlaceController.GetHeaderLineCount: Integer;
begin
if FHeaderLineCount = -1 then
FHeaderLineCount := CalculateHeaderLineCount;
Result := FHeaderLineCount;
end;
function TdxCustomGridTableViewItemPlaceController.GetWidth: Integer;
begin
if FWidth = -1 then
FWidth := CalculateWidth;
Result := FWidth;
end;
procedure TdxCustomGridTableViewItemPlaceController.SetWidth(Value: Integer);
begin
FWidth := Value;
WidthChanged;
end;
{ TdxGridTableViewColumnPlace }
constructor TdxGridTableViewColumnPlace.Create(AController: TdxGridTableViewColumnPlaceController;
AColumn: TcxGridColumn);
begin
inherited Create;
FController := AController;
FColumn := AColumn;
FLeftBound := -1;
FWidth := -1;
end;
procedure TdxGridTableViewColumnPlace.Calculate(ALeftBound: Integer);
begin
FLeftBound := ALeftBound;
end;
function TdxGridTableViewColumnPlace.CalculateLeftBound: Integer;
begin
Result := Controller.CalculateItemLeftBound(Self);
end;
function TdxGridTableViewColumnPlace.GetLineCount: Integer;
begin
Result := 1;
end;
function TdxGridTableViewColumnPlace.GetRowIndex: Integer;
begin
Result := 0;
end;
procedure TdxGridTableViewColumnPlace.InitAutoWidthItem(AnItem: TcxAutoWidthItem);
begin
AnItem.Fixed := IsFixed;
AnItem.MinWidth := MinWidth;
AnItem.Width := Width;
end;
function TdxGridTableViewColumnPlace.GetAdapter: TdxGridTableViewAdapter;
begin
Result := Formatter.Adapter;
end;
function TdxGridTableViewColumnPlace.GetCellBounds(RowIndex: Integer): TRect;
var
CellHeight: Integer;
begin
CellHeight := CellHeights[RowIndex];
with Result do
begin
Left := LeftBound;
Top := Self.RowIndex * CellHeight;
Right := Left + Width;
Bottom := Top + LineCount * CellHeight;
end;
if Column.IsMostLeft then
Inc(Result.Left, Formatter.ViewWidthExtra);
end;
function TdxGridTableViewColumnPlace.GetCellHeight(RowIndex: Integer): Integer;
begin
Result := Formatter.RowHeights[RowIndex];
end;
function TdxGridTableViewColumnPlace.GetFooterCellBounds: TRect;
begin
with Result do
begin
Left := LeftBound;
Top := RowIndex * FooterLineHeight;
Right := Left + Width;
Bottom := Top + LineCount * FooterLineHeight;
end;
InflateRect(Result, -FooterItemInflateHorz, -FooterItemInflateVert);
if Column.IsMostLeft then
Inc(Result.Left, 2);
end;
function TdxGridTableViewColumnPlace.GetFooterLineHeight: Integer;
begin
Result := Formatter.FooterLineHeight;
end;
function TdxGridTableViewColumnPlace.GetFormatter: TdxGridTableViewFormatter;
begin
Result := Controller.Formatter;
end;
function TdxGridTableViewColumnPlace.GetGroupFooterCellBounds(IndentCount: Integer): TRect;
var
V: Integer;
begin
with Result do
begin
Left := LeftBound;
Top := RowIndex * GroupFooterLineHeight;
Right := Left + Width;
Bottom := Top + LineCount * GroupFooterLineHeight;
end;
V := IndentCount * Formatter.IndentWidth;
OffsetRect(Result, -V, 0);
if Column.IsMostLeft then
Inc(Result.Left, V);
InflateRect(Result, -FooterItemInflateHorz, -FooterItemInflateVert);
if Column.IsMostLeft then
Inc(Result.Left, 2);
end;
function TdxGridTableViewColumnPlace.GetGroupFooterLineHeight: Integer;
begin
Result := Formatter.GroupFooterLineHeight;
end;
function TdxGridTableViewColumnPlace.GetHeaderCellBounds: TRect;
begin
with Result do
begin
Left := LeftBound;
Top := RowIndex * HeaderLineHeight;
Right := Left + Width;
Bottom := Top + LineCount * HeaderLineHeight;
end;
end;
function TdxGridTableViewColumnPlace.GetHeaderLineHeight: Integer;
begin
Result := Formatter.HeaderLineHeight;
end;
function TdxGridTableViewColumnPlace.GetIndex: Integer;
begin
Result := Controller.IndexOf(Self);
end;
function TdxGridTableViewColumnPlace.GetIsFixed: Boolean;
begin
Result := GridColumn_GetFixed(Column);
end;
function TdxGridTableViewColumnPlace.GetLeftBound: Integer;
begin
if FLeftBound = -1 then
FLeftBound := CalculateLeftBound;
Result := FLeftBound;
end;
function TdxGridTableViewColumnPlace.GetMinWidth: Integer;
begin
Result := Adapter.InternalColumnMinWidths[Column];
end;
function TdxGridTableViewColumnPlace.GetOriginalWidth: Integer;
begin
Result := Adapter.InternalColumnWidths[Column];
end;
function TdxGridTableViewColumnPlace.GetWidth: Integer;
begin
Result := FWidth;
if Result = -1 then
Result := OriginalWidth;
end;
{ TdxGridTableViewColumnPlaceController }
constructor TdxGridTableViewColumnPlaceController.Create(AFormatter: TdxGridTableViewFormatter);
begin
inherited;
FColumnIndexes := TList.Create;
FItems := TList.Create;
FWidth := -1;
end;
destructor TdxGridTableViewColumnPlaceController.Destroy;
begin
FreeAndNilItems;
FreeAndNil(FColumnIndexes);
inherited;
end;
procedure TdxGridTableViewColumnPlaceController.Calculate;
begin
if ItemsAutoWidth then CalculateItemsWidth;
end;
procedure TdxGridTableViewColumnPlaceController.Refresh;
begin
FColumnIndexes.Clear;
ClearItems;
AddItems;
end;
function TdxGridTableViewColumnPlaceController.IndexOf(AnItem: TdxGridTableViewColumnPlace): Integer;
begin
Result := FItems.IndexOf(AnItem);
end;
function TdxGridTableViewColumnPlaceController.IndexOf(AColumn: TcxGridColumn): Integer;
begin
for Result := 0 to ItemCount - 1 do
if Items[Result].Column = AColumn then
Exit;
Result := -1;
end;
function TdxGridTableViewColumnPlaceController.CalculateWidth: Integer;
var
I: Integer;
begin
Result := 0;
for I := 0 to ItemCount - 1 do
Inc(Result, Items[I].Width);
end;
function TdxGridTableViewColumnPlaceController.GetItemByColumn(Column: TcxGridColumn): TdxGridTableViewColumnPlace;
var
Index: Integer;
begin
Index := ColumnIndexes[Column];
//Index := IndexOf(Column);
if Index <> -1 then // might be -1 when we are in loading stage (Building report while loading form)
Result := Items[Index]
else
Result := nil;
end;
procedure TdxGridTableViewColumnPlaceController.AddItems;
var
I: Integer;
begin
for I := 0 to Formatter.ColumnCount - 1 do
CreateItem(Formatter.Columns[I]);
end;
procedure TdxGridTableViewColumnPlaceController.ClearItems;
var
I: Integer;
begin
for I := 0 to ItemCount - 1 do
Items[I].Free;
FItems.Clear;
end;
function TdxGridTableViewColumnPlaceController.CreateItem(AColumn: TcxGridColumn): TdxGridTableViewColumnPlace;
begin
Result := GetItemClass(AColumn).Create(Self, AColumn);
FItems.Add(Result);
end;
function TdxGridTableViewColumnPlaceController.GetItemClass(AColumn: TcxGridColumn): TdxGridTableViewColumnPlaceClass;
begin
Result := TdxGridTableViewColumnPlace;
end;
function TdxGridTableViewColumnPlaceController.CalculateItemLeftBound(AnItem: TdxGridTableViewColumnPlace): Integer;
var
I: Integer;
begin
Result := 0;
for I := 0 to AnItem.Index - 1 do
Inc(Result, Items[I].Width);
end;
procedure TdxGridTableViewColumnPlaceController.CalculateItemsWidth;
var
AutoWidthObject: TcxAutoWidthObject;
I: Integer;
begin
AutoWidthObject := TcxAutoWidthObject.Create(ItemCount);
try
for I := 0 to ItemCount - 1 do
Items[I].InitAutoWidthItem(AutoWidthObject.AddItem);
AutoWidthObject.AvailableWidth := ItemsAvailableWidth;
AutoWidthObject.Calculate;
for I := 0 to ItemCount - 1 do
Items[I].Width := AutoWidthObject[I].AutoWidth;
finally
AutoWidthObject.Free;
end;
end;
function TdxGridTableViewColumnPlaceController.GetItemsAutoWidth: Boolean;
begin
Result := Formatter.AutoWidth;
end;
function TdxGridTableViewColumnPlaceController.GetItemsAvailableWidth: Integer;
begin
Result := Formatter.ViewAvailableWidth;
end;
function TdxGridTableViewColumnPlaceController.GetAdapter: TdxGridTableViewAdapter;
begin
Result := Formatter.Adapter;
end;
function TdxGridTableViewColumnPlaceController.GetColumnIndex(Column: TcxGridColumn): Integer;
var
ColumnIndex, IndexCount, I: Integer;
begin
ColumnIndex := Column.Index;
IndexCount := FColumnIndexes.Count;
if ColumnIndex > IndexCount - 1 then
begin
FColumnIndexes.Count := ColumnIndex + 1;
for I := IndexCount to FColumnIndexes.Count - 1 do
FColumnIndexes[I] := TObject(-1);
end;
Result := Integer(FColumnIndexes[ColumnIndex]);
if Result = -1 then
begin
FColumnIndexes[ColumnIndex] := TObject(IndexOf(Column));
Result := Integer(FColumnIndexes[ColumnIndex]);
end;
end;
function TdxGridTableViewColumnPlaceController.GetItem(Index: Integer): TdxGridTableViewColumnPlace;
begin
Result := TdxGridTableViewColumnPlace(FItems[Index]);
end;
function TdxGridTableViewColumnPlaceController.GetItemCount: Integer;
begin
Result := FItems.Count;
end;
procedure TdxGridTableViewColumnPlaceController.FreeAndNilItems;
begin
ClearItems;
FreeAndNil(FItems);
end;
{ TdxGridTableViewReportDataAdapter }
constructor TdxGridTableViewReportDataAdapter.Create(ABuilder: TdxCustomGridViewBuilder);
begin
inherited Create;
FBuilder := ABuilder;
end;
function TdxGridTableViewReportDataAdapter.GetReportItem(Row: TcxCustomGridRow;
Column: TcxGridColumn): TdxReportVisualItem;
var
ReportRow: TdxReportCell;
I: Integer;
begin
ReportRow := ReportRowsByGridRow[Row];
if ReportRow <> nil then
for I := 0 to ReportRow.DataItemCount - 1 do
begin
Result := ReportRow.DataItems[I];
if Result.Data = Integer(Column) then Exit;
end;
Result := nil;
end;
function TdxGridTableViewReportDataAdapter.GetReportRow(Index: Integer): TdxReportCell;
begin
Result := Builder.ReportRows[Index];
end;
function TdxGridTableViewReportDataAdapter.GetReportRowByGridRow(Row: TcxCustomGridRow): TdxReportCell;
var
I: Integer;
begin
for I := 0 to ReportRowCount - 1 do
if ReportRows[I].CellCount <> 0 then
begin
Result := ReportRows[I].Cells[0];
if Result.Data = Integer(Row) then Exit;
end;
Result := nil;
end;
function TdxGridTableViewReportDataAdapter.GetReportRowCount: Integer;
begin
Result := Builder.ReportRowCount;
end;
{ TdxGridTableViewFormatter }
constructor TdxGridTableViewFormatter.Create(ABuilder: TdxCustomGridViewBuilder);
begin
inherited;
FColumns := TList.Create;
FItemPlaceController := GetItemPlaceControllerClass.Create(Self);
FReportDataAdapter := TdxGridTableViewReportDataAdapter.Create(ABuilder);
FRowHeights := TList.Create;
end;
destructor TdxGridTableViewFormatter.Destroy;
begin
FreeAndNil(FRowHeights);
FreeAndNil(FItemPlaceController);
FreeAndNil(FReportDataAdapter);
FreeAndNil(FColumns);
inherited;
end;
function TdxGridTableViewFormatter.Adapter: TdxGridTableViewAdapter;
begin
Result := Builder.Adapter;
end;
function TdxGridTableViewFormatter.Builder: TdxGridTableViewBuilder;
begin
Result := inherited Builder as TdxGridTableViewBuilder;
end;
procedure TdxGridTableViewFormatter.DoInitializeFooterItem(AnItem: TAbstractdxReportCellData;
AnIndex: Integer);
var
Column: TcxGridColumn;
begin
Column := Columns[AnIndex];
SetViewParams(AnItem, GetFooterItemViewParams(Column));
if HasBackgroundBitmap(bbFooter) then
AnItem.BackgroundBitmapIndex := GetBackgroundBitmapIndex(bbFooter);
RegisterLookAndFeelItem(AnItem, cesSunken);
with AnItem as TdxReportCellString do
begin
Data := Integer(Column);
Text := Adapter.FooterItemTexts[AnIndex];
Multiline := Adapter.FooterMultiline;
TextAlignX := TextAlignXMap[Column.FooterAlignmentHorz];
if Multiline then
TextAlignY := taTop
else
TextAlignY := taCenterY;
end;
end;
procedure TdxGridTableViewFormatter.DoInitializeFooterRow(ARow: TdxReportCell);
begin
SetViewParams(ARow, GetFooterItemViewParams(nil));
RegisterLookAndFeelItem(ARow, cesRaised);
ARow.Data := Integer(TdxGridFooter);
end;
procedure TdxGridTableViewFormatter.DoReportLinkInitializeFooterItem(AnItem: TAbstractdxReportCellData;
AnIndex: Integer);
begin
ReportLink.DoInitializeFooterCell(Adapter.GridView, nil, Columns[AnIndex], 0, TdxReportCellString(AnItem));
end;
function TdxGridTableViewFormatter.GetFooterItemBounds(AnIndex: Integer): TRect;
var
Item: TdxGridTableViewColumnPlace;
begin
Item := ItemPlaceController[Columns[AnIndex]];
if Item <> nil then
Result := Item.FooterCellBounds
else
Result := dxPSGlbl.NullRect;
end;
function TdxGridTableViewFormatter.GetFooterItemClass(AnIndex: Integer): TdxReportCellTextClass;
begin
Result := TdxReportCellString;
end;
function TdxGridTableViewFormatter.GetFooterItemViewParams(AColumn: TcxGridColumn): TdxReportItemViewParams;
begin
if ReportLink.OptionsFormatting.UseNativeStyles then
ReportLink.Styles.GetFooterParams(nil, -1, AColumn, Result.NativeParams)
else
Result.NativeParams := Adapter.GetFooterViewParams(nil, -1, AColumn);
if UseLookAndFeelColors and Adapter.CanUseLookAndFeelColors then
if AColumn <> nil then
begin
Result.NativeParams.Color := Adapter.ThemedFooterItemColor;
Result.NativeParams.TextColor := Adapter.ThemedFooterItemTextColor;
end;
Result.CellSides := csAll;
Result.FontStyle := [];
Result.Transparent := IsColorTransparent(Result.NativeParams.Color); //ReportLink.FixedTransparent;
end;
procedure TdxGridTableViewFormatter.DoInitializeGroupFooterHost(AnItem: TdxReportVisualItem;
ARecord: TcxCustomGridRecord; AGroupLevel: Integer);
begin
SetViewParams(AnItem, GetGroupFooterItemViewParams(nil, AGroupLevel, nil));
RegisterLookAndFeelItem(AnItem, cesRaised);
AnItem.Data := Integer(ARecord);
end;
procedure TdxGridTableViewFormatter.DoInitializeGroupFooterItem(AnItem: TAbstractdxReportCellData;
AnIndex: Integer; ARecord: TcxCustomGridRecord; AGroupLevel: Integer);
var
Column: TcxGridColumn;
begin
Column := Columns[AnIndex];
SetViewParams(AnItem, GetGroupFooterItemViewParams(ARecord, AGroupLevel, Column));
if HasBackgroundBitmap(bbFooter) then
AnItem.BackgroundBitmapIndex := GetBackgroundBitmapIndex(bbFooter);
RegisterLookAndFeelItem(AnItem, cesSunken);
with TdxReportCellString(AnItem) do
begin
Data := Integer(Column);
Multiline := Adapter.GetGroupFootersMultiline;
Text := Adapter.GetGroupFooterItemText(ARecord.Index, AGroupLevel, AnIndex);
TextAlignX := TextAlignXMap[Column.FooterAlignmentHorz];
if Multiline then
TextAlignY := taTop
else
TextAlignY := taCenterY;
end;
end;
procedure TdxGridTableViewFormatter.DoInitializeGroupFooterRow(ARow: TdxReportCell;
ARecord: TcxCustomGridRecord; AGroupLevel: Integer);
begin
ARow.CellSides := csLeftRight;
ARow.Data := AGroupLevel; //v3.0 ARecord.Level
ARow.Transparent := True;
end;
procedure TdxGridTableViewFormatter.DoReportLinkInitializeGroupFooterItem(AnItem: TAbstractdxReportCellData;
AnIndex: Integer; ARecord: TcxCustomGridRecord; AGroupLevel: Integer);
begin
ReportLink.DoInitializeFooterCell(Adapter.GridView, ARecord, Columns[AnIndex],
AGroupLevel, TdxReportCellString(AnItem));
end;
function TdxGridTableViewFormatter.GetGroupFooterItemBounds(AnIndex, AGroupLevel: Integer): TRect;
var
Item: TdxGridTableViewColumnPlace;
begin
Item := ItemPlaceController[Columns[AnIndex]];
if Item <> nil then
Result := Item.GroupFooterCellBounds[AGroupLevel]
else
Result := dxPSGlbl.NullRect;
end;
function TdxGridTableViewFormatter.GetGroupFooterItemClass(AnIndex: Integer): TdxReportCellTextClass;
begin
Result := TdxReportCellString;
end;
function TdxGridTableViewFormatter.GetGroupFooterItemViewParams(ARecord: TcxCustomGridRecord;
AGroupLevel: Integer; AColumn: TcxGridColumn): TdxReportItemViewParams;
begin
if ReportLink.OptionsFormatting.UseNativeStyles then
ReportLink.Styles.GetFooterParams(ARecord, AGroupLevel, AColumn, Result.NativeParams)
else
Result.NativeParams := Adapter.GetFooterViewParams(ARecord, AGroupLevel, AColumn);
if UseLookAndFeelColors and Adapter.CanUseLookAndFeelColors then
if AColumn <> nil then
begin
Result.NativeParams.Color := Adapter.ThemedFooterItemColor;
Result.NativeParams.TextColor := Adapter.ThemedFooterItemTextColor;
end;
Result.CellSides := csAll;
Result.FontStyle := [];
Result.Transparent := IsColorTransparent(Result.NativeParams.Color); //ReportLink.FixedTransparent;
end;
procedure TdxGridTableViewFormatter.DoInitializeGroupRowItem(AnItem: TAbstractdxReportCellData;
ARow: TcxGridGroupRow);
var
AText: string;
begin
SetViewParams(AnItem, GetGroupRowViewParams(ARow, ARow.Level));
if HasBackgroundBitmap(bbGroup) then
AnItem.BackgroundBitmapIndex := GetBackgroundBitmapIndex(bbGroup);
with AnItem as TdxReportCellString do
begin
Data := Integer(Adapter.GroupedColumns[ARow.Level]);
AText := ARow.DisplayText;
TcxCustomGridTableItemAccess(ARow.GroupedColumn).DoGetDisplayText(ARow, AText);
Text := AText;
TextAlignX := taLeft;
if Adapter.IsOffice11StyleGrouping then TextAlignY := taBottom; {.2}
end;
end;
procedure TdxGridTableViewFormatter.DoInitializeGroupRow(ARow: TdxReportCell;
ARecord: TcxCustomGridRecord);
begin
ReportLink.AddReportRow(ARow);
ARow.CellSides := [];
ARow.Data := Integer(ARecord);
ARow.Transparent := True;
end;
function TdxGridTableViewFormatter.GetGroupRowClass: TdxReportCellTextClass;
begin
Result := TdxReportCellString;
end;
function TdxGridTableViewFormatter.GetGroupRowViewParams(ARecord: TcxCustomGridRecord;
ALevel: Integer): TdxReportItemViewParams;
begin
if ReportLink.OptionsFormatting.UseNativeStyles then
if CanProcessSelectionStyle(ARecord) then
ReportLink.Styles.GetSelectionParams(Result.NativeParams)
else
ReportLink.Styles.GetGroupParams(ARecord, ALevel, Result.NativeParams)
else
if CanProcessSelectionStyle(ARecord) then
Result.NativeParams := Adapter.GetSelectionViewParams
else
Result.NativeParams := Adapter.GetGroupRowViewParams(ARecord, ALevel);
Result.CellSides := CellSidesMap[Adapter.GridLines] - [csLeft] + [csRight];
if ARecord.Index = 0 then
Result.CellSides := Result.CellSides + [csTop];
Result.FontStyle := [];
Result.Transparent := IsColorTransparent(Result.NativeParams.Color); //ReportLink.FixedTransparent;
end;
procedure TdxGridTableViewFormatter.DoInitializeGroupRowSeparator(ASeparator: TAbstractdxReportCellData);
begin
ASeparator.CellSides := csAll;
ASeparator.Color := GroupRowSeparatorColor;
ASeparator.Transparent := IsColorTransparent(ASeparator.Color); //ReportLink.Transparent;
end;
procedure TdxGridTableViewFormatter.DoInitializeGroupSeparatorRow(ARow: TdxReportCell);
begin
ARow.CellSides := csLeftRight;
ARow.Transparent := True;
end;
function TdxGridTableViewFormatter.GetGroupRowSeparatorClass: TdxReportCellDataClass;
begin
Result := TdxReportCellBox;
end;
procedure TdxGridTableViewFormatter.DoInitializeHeaderItem(AnItem: TAbstractdxReportCellData;
AnIndex: Integer);
var
Column: TcxGridColumn;
begin
Column := Columns[AnIndex];
SetViewParams(AnItem, GetHeaderItemViewParams(Column));
if HasBackgroundBitmap(bbHeader) then
AnItem.BackgroundBitmapIndex := GetBackgroundBitmapIndex(bbHeader);
RegisterLookAndFeelItem(AnItem, cesRaised);
with AnItem as TdxReportCellImage do
begin
Data := Integer(Column);
EndEllipsis := Adapter.HeaderEndEllipsis;
if (Column.HeaderGlyph <> nil) and not Column.HeaderGlyph.Empty then
begin
Image := Column.HeaderGlyph;
ImageLayout := HeaderImageLayoutMap[Column.HeaderGlyphAlignmentHorz, Column.HeaderGlyphAlignmentVert];
IsTextDrawnForCenteredImage := True;
IsTextShiftedForHorizontallyCenteredImage :=
not (ImageLayout in [ilImageTopCenter, ilImageCenterCenter, ilImageBottomCenter]) and (Text <> '');
end;
Multiline := Adapter.HeaderMultilines[Column];
SortOrder := SortOrderMap[Column.SortOrder];
Text := Column.Caption;
TextAlignX := TextAlignXMap[Column.HeaderAlignmentHorz];
if Multiline then
TextAlignY := TextAlignYMap[Column.HeaderAlignmentVert]
else
TextAlignY := taCenterY;
end;
end;
procedure TdxGridTableViewFormatter.DoInitializeHeaderRow(ARow: TdxReportCell);
begin
SetViewParams(ARow, GetHeaderItemViewParams(nil));
ARow.Data := Integer(TdxGridHeader);
end;
procedure TdxGridTableViewFormatter.DoReportLinkInitializeHeaderItem(AnItem: TAbstractdxReportCellData;
AnIndex: Integer);
begin
ReportLink.DoInitializeHeaderCell(Adapter.GridView, Columns[AnIndex], TdxReportCellString(AnItem));
end;
function TdxGridTableViewFormatter.GetHeaderItemBounds(AnIndex: Integer): TRect;
var
Item: TdxGridTableViewColumnPlace;
begin
Item := ItemPlaceController[Columns[AnIndex]];
if Item <> nil then
Result := Item.HeaderCellBounds
else
Result := dxPSGlbl.NullRect;
end;
function TdxGridTableViewFormatter.GetHeaderItemClass(AnIndex: Integer): TdxReportCellTextClass;
begin
Result := TdxReportCellImage;
end;
function TdxGridTableViewFormatter.GetHeaderItemViewParams(AColumn: TcxGridColumn): TdxReportItemViewParams;
begin
if ReportLink.OptionsFormatting.UseNativeStyles then
ReportLink.Styles.GetHeaderParams(AColumn, Result.NativeParams)
else
Result.NativeParams := Adapter.GetHeaderViewParams(AColumn);
if UseLookAndFeelColors and Adapter.CanUseLookAndFeelColors then
if AColumn <> nil then
begin
Result.NativeParams.Color := Adapter.ThemedHeaderItemColor;
Result.NativeParams.TextColor := Adapter.ThemedHeaderItemTextColor;
end;
Result.CellSides := csAll;
Result.FontStyle := [];
Result.Transparent := False;
end;
function TdxGridTableViewFormatter.CreateIndent(AParent: TdxReportCell): TdxReportCellExpandButton;
begin
Result := GetIndentClass.Create(AParent);
end;
procedure TdxGridTableViewFormatter.DoInitializeDataRowIndent(AnIndent: TdxReportCellExpandButton;
AnIndex, AnIndentCount: Integer; ARecord: TcxCustomGridRecord);
begin
SetViewParams(AnIndent, GetIndentViewParams(ARecord, AnIndex, AnIndentCount, False));
if HasBackgroundBitmap(bbGroup) then
AnIndent.BackgroundBitmapIndex := GetBackgroundBitmapIndex(bbGroup);
end;
procedure TdxGridTableViewFormatter.DoInitializeExpandButton(AnExpandButton: TdxReportCellExpandButton;
ARecord: TcxCustomGridRecord; AnIsMasterIndent: Boolean);
begin
with AnExpandButton do
begin
{3.1 added}
ButtonAlignHorz := bahCenter;
if Adapter.IsOffice11StyleGrouping and not AnIsMasterIndent then {.2}
ButtonAlignVert := bavBottom
else
ButtonAlignVert := bavCenter;
ButtonExpanded := ARecord.Expanded;
ButtonSize := Adapter.ExpandButtonSize;
if (ReportLink.OptionsFormatting.LookAndFeelKind <> lfStandard) and not Odd(ButtonSize) then
ButtonSize := ButtonSize - 1;
ButtonInteriorColor := Adapter.ExpandButtonColor;
ButtonTransparent := IsColorTransparent(ButtonInteriorColor);
end;
RegisterExpandButton(AnExpandButton);
end;
procedure TdxGridTableViewFormatter.DoInitializeGroupFooterIndent(AnIndent: TdxReportCellExpandButton;
AnIndex, AnIndentCount: Integer; ARecord: TcxCustomGridRecord);
begin
SetViewParams(AnIndent, GetIndentViewParams(ARecord, AnIndex, AnIndentCount, True));
if HasBackgroundBitmap(bbGroup) then
AnIndent.BackgroundBitmapIndex := GetBackgroundBitmapIndex(bbGroup);
// if (AIndex = AIndentCount - 1) and Adapter.ShowHorzGridLines then
// AIndent.CellSides := AIndent.CellSides + [csBottom];
end;
procedure TdxGridTableViewFormatter.DoInitializeGroupRowIndent(AnIndent: TdxReportCellExpandButton;
AnIndex, AnIndentCount: Integer; ARecord: TcxCustomGridRecord);
begin
SetViewParams(AnIndent, GetIndentViewParams(ARecord, AnIndex, AnIndentCount, False));
if HasBackgroundBitmap(bbGroup) then
AnIndent.BackgroundBitmapIndex := GetBackgroundBitmapIndex(bbGroup);
if AnIndex = AnIndentCount - 1 then
begin
AnIndent.CellSides := AnIndent.CellSides - [csRight];
if Adapter.ShowHorzGridLines then
AnIndent.CellSides := AnIndent.CellSides + [csTop];
//if Adapter.IsOffice11StyleGrouping then
// AnIndent.CellSides := AnIndent.CellSides + [csBottom];
AnIndent.ShowButton := HasExpandButton(ARecord);
if AnIndent.ShowButton then
DoInitializeExpandButton(AnIndent, ARecord, False);
end;
end;
procedure TdxGridTableViewFormatter.DoInitializeMasterDataRowIndent(AnIndent: TdxReportCellExpandButton;
AnIndex, AnIndentCount: Integer; ARecord: TcxCustomGridRecord);
begin
{ DoInitializeMasterIndent -> ARecord = nil }
SetViewParams(AnIndent, GetIndentViewParams(ARecord, AnIndex, AnIndentCount, False));
if AnIndex = AnIndentCount - 1 then
if HasBackgroundBitmap(bbContent) then
AnIndent.BackgroundBitmapIndex := GetBackgroundBitmapIndex(bbContent)
else
else
if HasBackgroundBitmap(bbGroup) then
AnIndent.BackgroundBitmapIndex := GetBackgroundBitmapIndex(bbGroup);
if (ARecord <> nil) and (AnIndex = AnIndentCount - 1) then
begin
AnIndent.CellSides := AnIndent.CellSides - [csRight];
if Adapter.ShowHorzGridLines then
AnIndent.CellSides := AnIndent.CellSides + [csTop];
if not ARecord.Expanded then
AnIndent.CellSides := AnIndent.CellSides + [csBottom];
AnIndent.ShowButton := ReportLink.OptionsView.ExpandButtons and ARecord.Expandable;
if AnIndent.ShowButton then
DoInitializeExpandButton(AnIndent, ARecord, True);
end;
end;
procedure TdxGridTableViewFormatter.DoInitializeRowSeparatorIndent(AnIndent: TdxReportCellExpandButton;
AnIndex, AnIndentCount: Integer; ARecord: TcxCustomGridRecord);
begin
SetViewParams(AnIndent, GetIndentViewParams(ARecord, AnIndex, AnIndentCount, True));
if HasBackgroundBitmap(bbGroup) then
AnIndent.BackgroundBitmapIndex := GetBackgroundBitmapIndex(bbGroup);
end;
function TdxGridTableViewFormatter.GetIndentClass: TdxReportCellExpandButtonClass;
begin
if Adapter.IsOffice11StyleGrouping then
Result := TdxReportCellExpandButtonEx
else
Result := TdxReportCellExpandButton;
end;
function TdxGridTableViewFormatter.GetIndentViewParams(ARecord: TcxCustomGridRecord;
AnIndex, AnIndentCount: Integer; ANonRecordIndent: Boolean): TdxReportItemViewParams;
function IsMasterDataRowIndent: Boolean;
begin
with Adapter do
Result := AnIndex >= GroupedColumnCount - Ord(IsOffice11StyleGrouping and not (ARecord is TcxGridGroupRow));
end;
function GetRecord: TcxCustomGridRecord;
begin
if not ANonRecordIndent and (ARecord is TcxGridGroupRow) and (AnIndex = AnIndentCount - 1) then
Result := ARecord
else
Result := nil;
end;
const
VertGridLinesMap: array[Boolean] of TdxCellSides = ([], csLeftRight);
begin
if ReportLink.OptionsFormatting.UseNativeStyles then
if IsMasterDataRowIndent then
ReportLink.Styles.GetContentParams(Adapter.MasterGridRecord, nil, Result.NativeParams)
else
ReportLink.Styles.GetGroupParams(GetRecord, AnIndex, Result.NativeParams)
else
if IsMasterDataRowIndent then
Result.NativeParams := Adapter.GetContentViewParams(Adapter.MasterGridRecord, nil)
else
Result.NativeParams := Adapter.GetGroupRowViewParams(GetRecord, AnIndex);
Result.CellSides := VertGridLinesMap[Adapter.ShowHorzGridLines]; //PS3.1 (it was Adapter.ShowVertGridLines)
if AnIndex = 0 then
Result.CellSides := Result.CellSides + [csLeft];
Result.FontStyle := [];
Result.Transparent := IsColorTransparent(Result.NativeParams.Color);
end;
function TdxGridTableViewFormatter.HasExpandButton(ARecord: TcxCustomGridRecord): Boolean;
begin
Result := ReportLink.OptionsView.ExpandButtons{$IFDEF VER500} and Adapter.RecordHelpers[ARecord].HasExpandButton{$ENDIF};
end;
procedure TdxGridTableViewFormatter.DoInitializeDataRow(ARow: TdxReportCell;
ARecord: TcxCustomGridRecord);
begin
ReportLink.AddReportRow(ARow);
ARow.CellSides := csLeftRight;
ARow.Data := Integer(ARecord);
ARow.Transparent := True;
end;
procedure TdxGridTableViewFormatter.DoReportLinkInitializeItem(AnItem: TAbstractdxReportCellData;
AColumn: TcxGridColumn; ARecord: TcxCustomGridRecord);
begin
ReportLink.DoInitializeCell(Adapter.GridView, ARecord, AColumn, TdxReportCellString(AnItem));
end;
function TdxGridTableViewFormatter.GetItemBounds(AGridRow: TcxCustomGridRow;
AGridRowIndex, AColumnIndex: Integer): TRect;
var
Item: TdxGridTableViewColumnPlace;
begin
Item := ItemPlaceController[Columns[AColumnIndex]];
if Item <> nil then
Result := Item.CellBounds[AGridRowIndex]
else
Result := dxPSGlbl.NullRect;
end;
function TdxGridTableViewFormatter.GetItemViewParams(ATableItem: TcxCustomGridTableItem;
ARecord: TcxCustomGridRecord; AnIsPreview: Boolean = False): TdxReportItemViewParams;
begin
Result := inherited GetItemViewParams(ATableItem, ARecord, AnIsPreview);
if AnIsPreview then
begin
Result.CellSides := csLeftRight;
if Adapter.GridLines in [glBoth, glHorizontal] then
Result.CellSides := Result.CellSides + csTopBottom;
end
else
begin
Result.CellSides := CellSidesMap[Adapter.GridLines];
if TcxGridColumn(ATableItem).IsMostLeft and (ARecord <> nil) and ARecord.Expandable then
Result.CellSides := Result.CellSides - [csLeft]; {3.1}
end;
Result.FontStyle := [];
Result.Transparent := IsColorTransparent(Result.NativeParams.Color); //ReportLink.Transparent;
end;
procedure TdxGridTableViewFormatter.DoInitializeMasterIndent(AnIndent: TdxReportCellExpandButton;
AnIndex, AnIndentCount: Integer);
begin
DoInitializeMasterDataRowIndent(AnIndent, AnIndex, AnIndentCount, nil); //Adapter.GroupedColumnCount + 1, nil); //PS3.1 changed
end;
procedure TdxGridTableViewFormatter.DoInitializePreview(APreview: TAbstractdxReportCellData;
AColumn: TcxGridColumn; ARecord: TcxCustomGridRecord);
begin
DoInitializeItem(APreview, AColumn, ARecord, True);
end;
function TdxGridTableViewFormatter.GetPreviewClass(AColumn: TcxGridColumn;
ARecord: TcxCustomGridRecord): TdxReportCellDataClass;
begin
Result := GetItemClass(AColumn, ARecord, True);
end;
function TdxGridTableViewFormatter.GetPreviewViewParams(AColumn: TcxGridColumn;
ARecord: TcxCustomGridRecord): TdxReportItemViewParams;
begin
Result := GetItemViewParams(AColumn, ARecord, True)
end;
procedure TdxGridTableViewFormatter.DoInitializeSeparatorRow(ARow: TdxReportCell);
begin
ARow.CellSides := csLeftRight;
ARow.Transparent := True;
end;
procedure TdxGridTableViewFormatter.DoInitializeRowSeparator(ASeparator: TAbstractdxReportCellData);
begin
ASeparator.CellSides := csAll;
ASeparator.Color := RowSeparatorColor;
ASeparator.Transparent := IsColorTransparent(ASeparator.Color); //ReportLink.Transparent;
end;
function TdxGridTableViewFormatter.GetRowSeparatorClass: TdxReportCellDataClass;
begin
Result := TdxReportCellBox;
end;
function TdxGridTableViewFormatter.GetReportItem(ARow: TcxCustomGridRow;
AColumn: TcxGridColumn): TdxReportVisualItem;
begin
Result := ReportDataAdapter.ReportItems[ARow, AColumn];
end;
{ IdxPSCellParams2 }
function TdxGridTableViewFormatter.IdxPSCellParams2_GetPreviewMarginLeft: Integer;
begin
Result := Adapter.PreviewLeftIndent;
end;
function TdxGridTableViewFormatter.IdxPSCellParams2_GetPreviewMarginRight: Integer;
begin
Result := Adapter.PreviewRightIndent;
end;
function TdxGridTableViewFormatter.IdxPSCellParams2_GetPreviewMaxHeight: Integer;
begin
if PreviewAutoHeight then
Result := -1
else
Result := PreviewLineHeight * PreviewMaxLineCount;
end;
function TdxGridTableViewFormatter.IdxPSCellParams2_GetPreviewMaxLineCount: Integer;
begin
Result := PreviewMaxLineCount;
end;
procedure TdxGridTableViewFormatter.AddHorizontalDelimiters;
var
Origin, I: Integer;
Item: TdxGridTableViewColumnPlace;
R: TRect;
begin
inherited;
if ReportLink.OptionsPagination.Column then
begin
Origin := ViewWidthExtraBefore;
for I := 0 to ColumnCount - 1 do
begin
Item := ItemPlaceController[Columns[I]];
if Item <> nil then
begin
R := Item.HeaderCellBounds;
ReportLink.AddHorizontalDelimiter(Origin + R.Left);
ReportLink.AddHorizontalDelimiter(Origin + R.Right);
end;
end;
end;
end;
{$IFDEF DXVER500}
procedure TdxGridTableViewFormatter.AfterBuilding;
begin
if CanCellMerging then PerformCellMerging;
inherited;
end;
{$ENDIF}
procedure TdxGridTableViewFormatter.BeforeBuilding;
begin
BuildItemLists;
ItemPlaceController.Refresh;
inherited;
end;
procedure TdxGridTableViewFormatter.Calculate;
begin
inherited;
ItemPlaceController.Calculate;
end;
procedure TdxGridTableViewFormatter.CalculateDataRowHeights;
var
I, RowHeight, J, V: Integer;
Row: TcxCustomGridRow;
Column: TcxGridColumn;
begin
FRowHeights.Count := RowCount;
for I := 0 to RowCount - 1 do
begin
Row := Rows[I];
if not (Row is TcxGridGroupRow) then
begin
RowHeight := DetailsLineHeight;
if HeaderLineCount = 1 then
for J := 0 to ColumnCount - 1 do
begin
// assign to 0, if you want to give an user ability to shrink RowHeight to smaller value
V := DetailsLineHeight;
Column := Columns[J];
if not Column.IsPreview then
begin
Builder.DoGetCellHeight(Row, Columns[J], V);
if RowHeight <> V then RowHeight := V;
end;
end
end
else
RowHeight := GroupRowLineHeight;
RowHeights[I] := RowHeight;
end;
end;
procedure TdxGridTableViewFormatter.CalculateLineHeights;
var
I: Integer;
Column: TcxGridColumn;
begin
inherited;
FGroupFooterLineHeight := DefaultGroupFooterLineHeight;
if Adapter.GroupRowHeightAssigned then
FGroupRowLineHeight := Adapter.GroupRowHeight
else
begin
FGroupRowLineHeight := DefaultGroupRowLineHeight;
if Adapter.IsOffice11StyleGrouping then {.2}
FGroupRowLineHeight := 2 * FGroupRowLineHeight;
end;
FFooterLineHeight := Adapter.FooterHeight;
FGroupFooterLineHeight := Adapter.GroupFooterHeight;
FHeaderLineHeight := Adapter.HeaderHeight;
if Adapter.DataRowHeightAssigned then
FDetailsLineHeight := Adapter.DataRowHeight
else
FDetailsLineHeight := DefaultDataRowLineHeight;
FPreviewLineHeight := DefaultDataRowLineHeight;
for I := 0 to ColumnCount - 1 do
begin
Column := Columns[I];
if not Adapter.HeaderHeightAssigned then
CalculateHeight(GetHeaderItemViewParams(Column), FHeaderLineHeight);
{if not Adapter.FooterHeightAssigned then
begin
CalculateHeight(GetGroupFooterItemViewParams(nil, -1, Column), FGroupFooterLineHeight);
CalculateHeight(GetFooterItemViewParams(Column), FFooterLineHeight);
end;}
if not Adapter.FooterHeightAssigned then
CalculateHeight(GetFooterItemViewParams(Column), FFooterLineHeight);
if not Adapter.GroupFooterHeightAssigned then
CalculateHeight(GetGroupFooterItemViewParams(nil, -1, Column), FGroupFooterLineHeight);
if not Adapter.DataRowHeightAssigned and not Column.IsPreview then
CalculateHeight(GetItemViewParams(Column, nil, False), FDetailsLineHeight);
end;
if not Adapter.GroupRowHeightAssigned then
for I := 0 to RowCount - 1 do
CalculateHeight(GetGroupRowViewParams(Rows[I], -1), FGroupRowLineHeight);
if HasPreview then
CalculateHeight(GetItemViewParams({PreviewColumn}nil, nil, True), FPreviewLineHeight);
Inc(FFooterLineHeight, 2 * FooterItemInflateVert - 1);
Inc(FGroupFooterLineHeight, 2 * FooterItemInflateVert - 1);
CalculateDataRowHeights;
end;
function TdxGridTableViewFormatter.GetItemPlaceControllerClass: TdxCustomGridTableViewItemPlaceControllerClass;
begin
Result := TdxGridTableViewColumnPlaceController;
end;
function TdxGridTableViewFormatter.MapStyleBackgroundBitmapIndex(AGridBackgroundBitmapIndex: Integer): Integer;
begin
case AGridBackgroundBitmapIndex of
bbFooter:
Result := vspsGridFooter;
bbGroup:
Result := vspsGridGroup;
bbHeader:
Result := vspsGridHeader;
bbPreview:
Result := vspsGridPreview;
else
Result := 0;
end;
if Result = 0 then
Result := inherited MapStyleBackgroundBitmapIndex(AGridBackgroundBitmapIndex);
end;
{$IFDEF DXVER500}
function TdxGridTableViewFormatter.CanCellMerging: Boolean;
begin
Result := not HasPreview and (RowSeparatorThickness = 0);
end;
function TdxGridTableViewFormatter.CanColumnCellMerging(AColumn: TcxGridColumn): Boolean;
begin
Result := AColumn.Options.CellMerging;
end;
procedure TdxGridTableViewFormatter.PerformCellMerging;
var
I: Integer;
Column: TcxGridColumn;
begin
for I := 0 to ColumnCount - 1 do
begin
Column := Columns[I];
if CanColumnCellMerging(Column) then // because Column.CanCellMerging also performs GridView.CellMerging validation
PerformColumnCellMerging(Column);
end;
end;
procedure TdxGridTableViewFormatter.PerformColumnCellMerging(AColumn: TcxGridColumn);
function CanRowBeMergedAsMaster(ARow: TcxCustomGridRow): Boolean;
begin
Result := Adapter.RecordHelpers[ARow].CanCellMergingAsMaster;
end;
function CanRowBeMergedAsSlave(ARow: TcxCustomGridRow): Boolean;
begin
Result := Adapter.RecordHelpers[ARow].CanCellMergingAsSlave;
end;
function IsRowMergingSeparator(ARow: TcxCustomGridRow): Boolean;
begin
Result := Adapter.RecordHelpers[ARow].IsCellMergingSeparator;
end;
procedure RetrieveCellPropertiesAndValue(ARow: TcxCustomGridRow;
out AProperties: TcxCustomEditProperties; out AValue: TcxEditValue);
begin
AProperties := GetItemProperties(AColumn, ARow);
AValue := GetItemValue(AProperties, AColumn, ARow);
end;
function CompareCellsForMerging(ARow1: TcxGridDataRow; AProperties1: TcxCustomEditProperties;
const AValue1: TcxEditValue; ARow2: TcxGridDataRow; AProperties2: TcxCustomEditProperties;
const AValue2: TcxEditValue): Boolean;
begin
Result := GridColumn_DoCompareValuesForCellMerging(AColumn,
ARow1, AProperties1, AValue1, ARow2, AProperties2, AValue2);
end;
procedure DoMergeCells(AStartRowIndex, AStopRowIndex: Integer);
var
I: Integer;
MasterReportItem, SlaveReportItem: TdxReportVisualItem;
begin
MasterReportItem := GetReportItem(Rows[AStartRowIndex], AColumn);
for I := AStartRowIndex + 1 to AStopRowIndex do
begin
SlaveReportItem := GetReportItem(Rows[I], AColumn);
with MasterReportItem do
Height := Height + SlaveReportItem.Height;
end;
for I := AStartRowIndex + 1 to AStopRowIndex do
begin
SlaveReportItem := GetReportItem(Rows[I], AColumn);
if SlaveReportItem is TdxReportCellString then
TdxReportCellString(SlaveReportItem).Text := '';
SlaveReportItem.BackgroundBitmapIndex := MasterReportItem.BackgroundBitmapIndex;
if I <> AStopRowIndex then
SlaveReportItem.CellSides := SlaveReportItem.CellSides - [csBottom];
SlaveReportItem.CellSides := SlaveReportItem.CellSides - [csTop];
SlaveReportItem.Color := MasterReportItem.Color;
SlaveReportItem.ContentBkColor := MasterReportItem.ContentBkColor;
SlaveReportItem.ContentPattern := MasterReportItem.ContentPattern;
SlaveReportItem.Transparent := True;
end;
end;
var
I, J: Integer;
Row1, Row2: TcxCustomGridRow;
HasCellsMerging, AreCellsMerged, IsMergingSeparator: Boolean;
Properties1, Properties2: TcxCustomEditProperties;
Value1, Value2: TcxEditValue;
begin
I := 0;
while I < RowCount - 1 do
begin
HasCellsMerging := False;
Row1 := Rows[I];
if CanRowBeMergedAsMaster(Row1) then
begin
RetrieveCellPropertiesAndValue(Row1, Properties1, Value1);
//AreCellsMerged := False;
IsMergingSeparator := False;
J := I;
repeat
Inc(J);
Row2 := Rows[J];
if CanRowBeMergedAsSlave(Row2) then
begin
RetrieveCellPropertiesAndValue(Row2, Properties2, Value2);
AreCellsMerged := CompareCellsForMerging(TcxGridDataRow(Row1),
Properties1, Value1, TcxGridDataRow(Row2), Properties2, Value2);
if not HasCellsMerging then
HasCellsMerging := AreCellsMerged;
IsMergingSeparator := IsRowMergingSeparator(Row2);
end
else
AreCellsMerged := False;
until (J = RowCount - 1) or not AreCellsMerged or IsMergingSeparator;
if HasCellsMerging then
begin
if not AreCellsMerged then Dec(J);
DoMergeCells(I, J);
Inc(J);
end;
I := J;
end
else
Inc(I);
end;
end;
{$ENDIF}
procedure TdxGridTableViewFormatter.BuildColumnList;
var
I: Integer;
Column: TcxGridColumn;
begin
FColumns.Clear;
for I := 0 to Adapter.ColumnCount - 1 do
begin
Column := Adapter.Columns[I];
if IsColumnActuallyVisible(Column) then FColumns.Add(Column);
end;
end;
procedure TdxGridTableViewFormatter.BuildItemLists;
begin
BuildColumnList;
end;
function TdxGridTableViewFormatter.IsColumnActuallyVisible(AColumn: TcxGridColumn): Boolean;
begin
Result := AColumn.ActuallyVisible;
end;
function TdxGridTableViewFormatter.GetViewWidth: Integer;
begin
Result := ItemPlaceController.Width;
end;
function TdxGridTableViewFormatter.GetColumn(Index: Integer): TcxGridColumn;
begin
Result := TcxGridColumn(FColumns[Index]);
end;
function TdxGridTableViewFormatter.GetColumnCount: Integer;
begin
Result := FColumns.Count;
end;
function TdxGridTableViewFormatter.GetGroupRowSeparatorColor: TColor;
begin
Result := Adapter.GroupRowSeparatorColor;
end;
function TdxGridTableViewFormatter.GetGroupRowSeparatorThickness: Integer;
begin
Result := Adapter.GroupRowSeparatorThickness;
end;
function TdxGridTableViewFormatter.GetHasPreview: Boolean;
begin
Result := Adapter.HasPreview and ShowPreview and
(PreviewAutoHeight or (PreviewMaxLineCount > 0));
end;
function TdxGridTableViewFormatter.GetHeaderLineCount: Integer;
begin
Result := ItemPlaceController.HeaderLineCount;
end;
function TdxGridTableViewFormatter.GetPreviewAutoHeight: Boolean;
begin
Result := ReportLink.OptionsPreview.AutoHeight;
end;
function TdxGridTableViewFormatter.GetPreviewColumn: TcxGridColumn;
begin
Result := Adapter.PreviewColumn;
end;
function TdxGridTableViewFormatter.GetPreviewMaxLineCount: Integer;
begin
Result := ReportLink.OptionsPreview.MaxLineCount;
end;
function TdxGridTableViewFormatter.GetRow(Index: Integer): TcxCustomGridRow;
begin
Result := inherited Records[Index] as TcxCustomGridRow;
end;
function TdxGridTableViewFormatter.GetRowCount: Integer;
begin
Result := RecordCount;
end;
function TdxGridTableViewFormatter.GetRowHeight(Index: Integer): Integer;
begin
Result := Integer(FRowHeights[Index])
end;
function TdxGridTableViewFormatter.GetRowHeightByRow(Row: TcxCustomGridRow): Integer;
begin
Result := {20;//}RowHeights[RecordIndexes[Row]];
end;
function TdxGridTableViewFormatter.GetRowSeparatorColor: TColor;
begin
Result := Adapter.RowSeparatorColor;
{with ReportLink.OptionsFormatting do
if UseNativeStyles then
begin
Result := FixedColor;
end;}
end;
function TdxGridTableViewFormatter.GetRowSeparatorThickness: Integer;
begin
Result := Adapter.RowSeparatorThickness;
end;
function TdxGridTableViewFormatter.GetShowGroupFooters: Boolean;
begin
Result := ReportLink.OptionsView.GroupFooters;
end;
function TdxGridTableViewFormatter.GetShowFooters: Boolean;
begin
Result := ReportLink.OptionsView.Footers;
end;
function TdxGridTableViewFormatter.GetShowHeaders: Boolean;
begin
Result := ReportLink.OptionsView.Headers;
end;
function TdxGridTableViewFormatter.GetShowPreview: Boolean;
begin
Result := ReportLink.OptionsPreview.Visible;
end;
procedure TdxGridTableViewFormatter.SetRowHeight(Index: Integer; Value: Integer);
begin
FRowHeights[Index] := TObject(Value);
end;
procedure TdxGridTableViewFormatter.SetRowHeightByRow(Row: TcxCustomGridRow; Value: Integer);
begin
RowHeights[IndexOfRecord(Row)] := Value;
end;
{ TdxGridTableViewBuilder }
function TdxGridTableViewBuilder.Adapter: TdxGridTableViewAdapter;
begin
Result := inherited Adapter as TdxGridTableViewAdapter;
end;
class function TdxGridTableViewBuilder.AdapterClass: TdxGridViewAdapterClass;
begin
Result := TdxGridTableViewAdapter;
end;
function TdxGridTableViewBuilder.Formatter: TdxGridTableViewFormatter;
begin
Result := inherited Formatter as TdxGridTableViewFormatter;
end;
class function TdxGridTableViewBuilder.FormatterClass: TdxGridViewFormatterClass;
begin
Result := TdxGridTableViewFormatter;
end;
procedure TdxGridTableViewBuilder.AddDelimitersHardVert(AReportRow: TdxReportCell);
begin
ReportLink.FDelimitersHardVert.Add(TObject(AReportRow.AbsoluteRect.Top));
end;
procedure TdxGridTableViewBuilder.DoBuildViewBody;
begin
if Formatter.ShowHeaders then CreateHeader;
CreateRows;
if not IsAborted and Formatter.ShowFooters then
CreateFooter;
end;
procedure TdxGridTableViewBuilder.DoBuildViewFooter;
begin
inherited;
if not Formatter.HasDetailsSeparator then CreateViewTerminator;
end;
procedure TdxGridTableViewBuilder.CreateDetails(AMasterRow: TcxGridMasterDataRow);
var
CurrentView: TcxCustomGridView;
begin
if AMasterRow.ActiveDetailGridView <> nil then
if ReportLink.OptionsLevels.Unwrap then
begin
ProcessedView := nil;
try
if ReportLink.OptionsLevels.RiseActiveLevelOntoTop then
begin
CurrentView := AMasterRow.ActiveDetailGridView;
CreateDetailView(CurrentView);
ProcessedView := CurrentView;
end;
ReportLink.ForEachView(AMasterRow, CreateDetailView);
finally
ProcessedView := nil;
end;
end
else
CreateDetailView(AMasterRow.ActiveDetailGridView);
end;
procedure TdxGridTableViewBuilder.CreateDetailView(AGridView: TcxCustomGridView);
begin
if AGridView <> ProcessedView then ReportLink.BuildView(Self, AGridView);
end;
function TdxGridTableViewBuilder.GetAreDetailsBuilt: Boolean;
begin
with ReportLink.OptionsDetails do
Result := not StartFromFocusedView or not OnlyFocusedView;
end;
procedure TdxGridTableViewBuilder.CreateFooter;
var
ReportRow: TdxReportCell;
begin
ReportRow := GetFootersProducer.Produce(HostInfoServices.FootersHostInfo);
AddReportRow(ReportRow);
end;
function TdxGridTableViewBuilder.GetFootersProducer: TdxGridTableViewFootersProducer;
begin
Result := ProducerCache[GetFootersProducerClass] as TdxGridTableViewFootersProducer;
end;
function TdxGridTableViewBuilder.GetFootersProducerClass: TdxGridTableViewFootersProducerClass;
begin
Result := TdxGridTableViewFootersProducer;
end;
procedure TdxGridTableViewBuilder.CreateGroupFooters(AGridRow: TcxCustomGridRow);
var
Producer: TdxGridTableViewGroupFooterProducer;
HostInfo: TdxGridAttributeHostInfo;
Index, I: Integer;
ReportRow: TdxReportCell;
begin
Producer := GetGroupFooterProducer;
HostInfo := HostInfoServices.PageDetailsHostInfo;
Index := 0;
for I := 0 to AGridRow.Level do
if Adapter.HasGroupFooter(AGridRow, I) then
begin
ReportRow := Producer.Produce(HostInfo, AGridRow, AGridRow.Level - I, Index);
AddReportRow(ReportRow);
Inc(Index);
end;
end;
function TdxGridTableViewBuilder.GetGroupFooterProducer: TdxGridTableViewGroupFooterProducer;
begin
Result := ProducerCache[GetGroupFooterProducerClass] as TdxGridTableViewGroupFooterProducer;
end;
function TdxGridTableViewBuilder.GetGroupFooterProducerClass: TdxGridTableViewGroupFooterProducerClass;
begin
Result := TdxGridTableViewGroupFooterProducer;
end;
procedure TdxGridTableViewBuilder.CreateHeader;
var
ReportRow: TdxReportCell;
begin
ReportRow := GetHeadersProducer.Produce(HostInfoServices.HeadersHostInfo);
AddReportRow(ReportRow);
end;
function TdxGridTableViewBuilder.GetHeadersProducer: TdxGridTableViewHeadersProducer;
begin
Result := ProducerCache[GetHeadersProducerClass] as TdxGridTableViewHeadersProducer;
end;
function TdxGridTableViewBuilder.GetHeadersProducerClass: TdxGridTableViewHeadersProducerClass;
begin
Result := TdxGridTableViewHeadersProducer;
end;
procedure TdxGridTableViewBuilder.CreateRow(AGridRow: TcxCustomGridRow; ARowIndex: Integer);
var
ReportRow: TdxReportCell;
begin
ReportRow := GetRowProducer(AGridRow).Produce(HostInfoServices.PageDetailsHostInfo, AGridRow, ARowIndex);
AddReportRow(ReportRow);
end;
function TdxGridTableViewBuilder.GetRowProducer(AGridRow: TcxCustomGridRow): TdxGridTableViewCustomDataRowProducer;
begin
Result := ProducerCache[GetRowProducerClass(AGridRow)] as TdxGridTableViewCustomDataRowProducer;
end;
procedure TdxGridTableViewBuilder.CreateRows;
var
PrevGridRow, GridRow: TcxCustomGridRow;
I: Integer;
HasGroupDelimiter: Boolean;
begin
PrevGridRow := nil;
for I := 0 to Formatter.RowCount - 1 do
begin
GridRow := Formatter.Rows[I];
if (ShowRowSeparators and (I > 0)) and (not (PrevGridRow is TcxGridGroupRow) or not ShowGroupRowSeparators) then
CreateRowSeparator(GridRow, False);
HasGroupDelimiter := Formatter.PaginateByTopLevelGroups and (I > 0) and
(GridRow.Level = 0) and (GridRow is TcxGridGroupRow);
CreateRow(GridRow, I);
// Hard Delimiters
if HasGroupDelimiter then
AddDelimitersHardVert(LastReportRow);
if AreDetailsBuilt and Adapter.HasDetails(GridRow) then
CreateDetails(GridRow as TcxGridMasterDataRow);
if ShowGroupRowSeparators and (GridRow is TcxGridGroupRow) then
CreateGroupRowSeparator(TcxGridGroupRow(GridRow));
if Formatter.ShowGroupFooters and Adapter.HasGroupFooters(GridRow) then
CreateGroupFooters(GridRow);
// Last Row Separator
if (ShowRowSeparators and (I = Formatter.RowCount - 1)) and (not (GridRow is TcxGridGroupRow) or not ShowGroupRowSeparators) then
CreateRowSeparator(GridRow, True);
// Progress
if MasterBuilder = nil then
begin
Progress(100 * (I + 1) / Formatter.RowCount);
if IsAborted then Break;
end;
PrevGridRow := GridRow;
end;
end;
function TdxGridTableViewBuilder.GetRowProducerClass(AGridRow: TcxCustomGridRow): TdxGridTableViewCustomDataRowProducerClass;
begin
Result := Adapter.RecordHelpers[AGridRow].ProducerClass;
end;
procedure TdxGridTableViewBuilder.CreateRowSeparator(AGridRow: TcxCustomGridRow;
AnIsLast: Boolean = False);
var
ReportRow: TdxReportCell;
begin
ReportRow := GetRowSeparatorProducer.Produce(HostInfoServices.PageDetailsHostInfo, AGridRow, AnIsLast);
AddReportRow(ReportRow);
end;
function TdxGridTableViewBuilder.GetRowSeparatorProducer: TdxGridTableViewRowSeparatorProducer;
begin
Result := ProducerCache[GetRowSeparatorProducerClass] as TdxGridTableViewRowSeparatorProducer;
end;
function TdxGridTableViewBuilder.GetRowSeparatorProducerClass: TdxGridTableViewRowSeparatorProducerClass;
begin
Result := TdxGridTableViewRowSeparatorProducer;
end;
function TdxGridTableViewBuilder.GetShowRowSeparators: Boolean;
begin
Result := Adapter.HasRowSeparators;
end;
procedure TdxGridTableViewBuilder.CreateGroupRowSeparator(AGridRow: TcxGridGroupRow);
var
ReportRow: TdxReportCell;
begin
ReportRow := GetGroupRowSeparatorProducer.Produce(HostInfoServices.PageDetailsHostInfo, AGridRow);
AddReportRow(ReportRow);
end;
function TdxGridTableViewBuilder.GetGroupRowSeparatorProducer: TdxGridTableViewGroupRowSeparatorProducer;
begin
Result := ProducerCache[GetGroupRowSeparatorProducerClass] as TdxGridTableViewGroupRowSeparatorProducer;
end;
function TdxGridTableViewBuilder.GetGroupRowSeparatorProducerClass: TdxGridTableViewGroupRowSeparatorProducerClass;
begin
Result := TdxGridTableViewGroupRowSeparatorProducer;
end;
function TdxGridTableViewBuilder.GetShowGroupRowSeparators: Boolean;
begin
Result := Adapter.IsOffice11StyleGrouping;
end;
function TdxGridTableViewBuilder.GridView: TcxGridTableView;
begin
Result := inherited GridView as TcxGridTableView;
end;
class function TdxGridTableViewBuilder.GridViewClass: TcxCustomGridViewClass;
begin
Result := TcxGridTableView;
end;
function TdxGridTableViewBuilder.GetLastReportRow: TdxReportCell;
begin
Result := ReportRows[ReportRowCount - 1];
end;
function TdxGridTableViewBuilder.GetProcessedView: TcxCustomGridView;
begin
Result := ReportLink.FProcessedView;
end;
procedure TdxGridTableViewBuilder.SetProcessedView(Value: TcxCustomGridView);
begin
ReportLink.FProcessedView := Value;
end;
{ TdxGridDBTableViewAdapter }
function TdxGridDBTableViewAdapter.GridView: TcxGridDBTableView;
begin
Result := inherited GridView as TcxGridDBTableView;
end;
class function TdxGridDBTableViewAdapter.GridViewClass: TcxCustomGridViewClass;
begin
Result := TcxGridDBTableView;
end;
procedure TdxGridDBTableViewAdapter.AfterBuilding;
begin
UnloadAllRecords;
inherited;
end;
procedure TdxGridDBTableViewAdapter.BeforeBuilding;
begin
inherited;
LoadAllRecords;
end;
function TdxGridDBTableViewAdapter.DataController: TcxGridDBDataController;
begin
Result := TcxGridDBDataController(inherited DataController);
end;
function TdxGridDBTableViewAdapter.DBDataModeController: TcxDBDataModeController;
begin
Result := DataController.DataModeController;
end;
procedure TdxGridDBTableViewAdapter.LoadAllRecords;
begin
_LoadAllRecords(DBDataModeController, FPrevAllRecordsAreLoaded);
end;
procedure TdxGridDBTableViewAdapter.UnloadAllRecords;
begin
_UnloadAllRecords(DBDataModeController, FPrevAllRecordsAreLoaded);
end;
{ TdxGridDBTableViewBuilder }
function TdxGridDBTableViewBuilder.Adapter: TdxGridDBTableViewAdapter;
begin
Result := inherited Adapter as TdxGridDBTableViewAdapter;
end;
class function TdxGridDBTableViewBuilder.AdapterClass: TdxGridViewAdapterClass;
begin
Result := TdxGridDBTableViewAdapter;
end;
{ TdxGridBandedTableViewAdapter }
constructor TdxGridBandedTableViewAdapter.Create(AMasterAdapter: TdxCustomGridViewAdapter;
AGridView: TcxCustomGridView);
begin
inherited;
FFooterLineCount := -1;
end;
function TdxGridBandedTableViewAdapter.GridView: TcxGridBandedTableView;
begin
Result := inherited GridView as TcxGridBandedTableView;
end;
class function TdxGridBandedTableViewAdapter.GridViewClass: TcxCustomGridViewClass;
begin
Result := TcxGridBandedTableView;
end;
function TdxGridBandedTableViewAdapter.Styles: TcxGridBandedTableViewStyles;
begin
Result := inherited Styles as TcxGridBandedTableViewStyles;
end;
function TdxGridBandedTableViewAdapter.CalculateDetailsLineCount: Integer;
var
I, J, V: Integer;
BandRows: TcxGridBandRows;
begin
Result := 0;
for I := 0 to BottomBandCount - 1 do
begin
BandRows := BottomBands[I].Rows;
V := 0;
for J := 0 to BandRows.VisibleCount - 1 do
Inc(V, BandRows[J].LineCount);
if Result < V then Result := V;
end;
end;
function TdxGridBandedTableViewAdapter.CalculateFooterLineCount: Integer;
var
I, V: Integer;
begin
Result := 0;
for I := 0 to BottomBandCount - 1 do
begin
V := BottomBands[I].Rows.Count;
if Result < V then Result := V;
end;
end;
function TdxGridBandedTableViewAdapter.GetBandHeaderHeight: Integer;
begin
Result := GridView.OptionsView.BandHeaderHeight;
end;
function TdxGridBandedTableViewAdapter.GetBandHeaderHeightAssigned: Boolean;
begin
Result := BandHeaderHeight <> 0;
end;
function TdxGridBandedTableViewAdapter.GetBandHeaderViewParams(ABand: TcxGridBand): TcxViewParams;
begin
if (ABand <> nil) and (ABand.Styles <> nil) then
ABand.Styles.GetHeaderParams(Result)
else
Styles.GetBandHeaderParams(ABand, Result);
if ABand = nil then
Result.Color := LookAndFeelPainter.DefaultHeaderBackgroundColor
end;
function TdxGridBandedTableViewAdapter.GetDataRowHeightAssigned: Boolean;
begin
Result := (DetailsLineCount = 1) and inherited GetDataRowHeightAssigned;
end;
function TdxGridBandedTableViewAdapter.GetFooterHeightAssigned: Boolean;
begin
Result := (FooterLineCount = 1) and inherited GetFooterHeightAssigned;
end;
function TdxGridBandedTableViewAdapter.GetHeaderHeightAssigned: Boolean;
begin
Result := (DetailsLineCount = 1) and inherited GetHeaderHeightAssigned;
end;
function TdxGridBandedTableViewAdapter.GetHeaderMultiline(Column: TcxGridColumn): Boolean;
begin
Result := ((DetailsLineCount = 1) and inherited GetHeaderMultiline(Column)) or
(TcxGridBandedColumn(Column).Position.LineCount > 1); {PS 3.01}
end;
function TdxGridBandedTableViewAdapter.GetBand(Index: Integer): TcxGridBand;
begin
Result := GridView.Bands.VisibleItems[Index];
end;
function TdxGridBandedTableViewAdapter.GetBandCount: Integer;
begin
Result := GridView.Bands.VisibleCount;
end;
function TdxGridBandedTableViewAdapter.GetBandEndEllipsis: Boolean;
begin
Result := GridView.OptionsView.BandHeaderEndEllipsis;
end;
function TdxGridBandedTableViewAdapter.GetBandHeaderLineCount: Integer;
begin
Result := GridView.OptionsView.BandHeaderLineCount;
end;
function TdxGridBandedTableViewAdapter.GetBandHeaderMultiline: Boolean;
begin
Result := BandHeaderHeightAssigned;// or (BandHeaderLineCount > 1); {!!! v3.03}
end;
function TdxGridBandedTableViewAdapter.GetBottomBand(Index: Integer): TcxGridBand;
begin
{$IFDEF DXVER500}
Result := GridView.Bands.VisibleBottomItems[Index];
{$ELSE}
Result := GridView.Bands.VisibleItems[Index];
{$ENDIF}
end;
function TdxGridBandedTableViewAdapter.GetBottomBandCount: Integer;
begin
{$IFDEF DXVER500}
Result := GridView.Bands.VisibleBottomItemCount;
{$ELSE}
Result := GridView.Bands.VisibleCount;
{$ENDIF}
end;
function TdxGridBandedTableViewAdapter.GetColumn(Index: Integer): TcxGridBandedColumn;
begin
Result := GridView.VisibleColumns[Index];
end;
function TdxGridBandedTableViewAdapter.GetFooterLineCount: Integer;
begin
if FFooterLineCount = -1 then
FFooterLineCount := CalculateFooterLineCount;
Result := FFooterLineCount;
end;
function TdxGridBandedTableViewAdapter.GetRootBand(Index: Integer): TcxGridBand;
begin
{$IFDEF DXVER500}
Result := GridView.Bands.VisibleRootItems[Index];
{$ELSE}
Result := GridView.Bands.VisibleItems[Index];
{$ENDIF}
end;
function TdxGridBandedTableViewAdapter.GetRootBandCount: Integer;
begin
{$IFDEF DXVER500}
Result := GridView.Bands.VisibleRootItemCount;
{$ELSE}
Result := GridView.Bands.VisibleCount;
{$ENDIF}
end;
function TdxGridBandedTableViewAdapter.GetThemedBandHeaderItemColor: TColor;
begin
Result := LookAndFeelPainter.DefaultHeaderColor;
end;
function TdxGridBandedTableViewAdapter.GetThemedBandHeaderItemTextColor: TColor;
begin
Result := LookAndFeelPainter.DefaultHeaderTextColor;
end;
{ TdxGridBandedTableViewColumnPlace }
function TdxGridBandedTableViewColumnPlace.GetLineCount: Integer;
begin
Result := Column.Position.LineCount;
end;
function TdxGridBandedTableViewColumnPlace.GetRowIndex: Integer;
begin
Result := Column.Position.Row.LineOffset;
end;
function TdxGridBandedTableViewColumnPlace.GetColumn: TcxGridBandedColumn;
begin
Result := inherited Column as TcxGridBandedColumn;
end;
function TdxGridBandedTableViewColumnPlace.GetController: TdxCustomGridBandedTableViewItemPlace;
begin
Result := inherited Controller as TdxCustomGridBandedTableViewItemPlace;
end;
function TdxGridBandedTableViewColumnPlace.GetFormatter: TdxGridBandedTableViewFormatter;
begin
Result := inherited Formatter as TdxGridBandedTableViewFormatter;
end;
{ TdxCustomGridBandedTableViewItemPlace }
constructor TdxCustomGridBandedTableViewItemPlace.Create(AController: TdxGridBandedTableViewItemPlaceController;
AParent: TdxGridBandedTableViewItemPlace; ABand: TcxGridBand);
begin
inherited Create(AController.Formatter);
FController := AController;
FParent := AParent;
FBand := ABand;
FHeight := -1;
FLeftBound := -1;
FMinWidth := -1;
FTopBound := -1;
end;
function TdxCustomGridBandedTableViewItemPlace.CalculateHeaderLineCount: Integer;
var
I: Integer;
begin
Result := 0;
with Band.Rows do
for I := 0 to VisibleCount - 1 do
Inc(Result, VisibleItems[I].LineCount);
end;
function TdxCustomGridBandedTableViewItemPlace.CalculateWidth: Integer;
function FixedSize: Boolean;
var
I: Integer;
begin
Result := False;
for I := 0 to Band.ColumnCount - 1 do
Result := Result or not Band.Columns[I].Options.HorzSizing;
end;
begin
if FixedSize then
Result := Max(Band.Width, InternalCalculateWidth)
else
begin
Result := Band.Width;
if Result = 0 then
Result := InternalCalculateWidth
end;
if Result = 0 then
Result := cxGridBandedTableView.cxGridDefaultEmptyBandWidth;
if Result < InternalCalculateMinWidth then
Result := InternalCalculateMinWidth;
end;
function TdxCustomGridBandedTableViewItemPlace.GetItemClass(AColumn: TcxGridColumn): TdxGridTableViewColumnPlaceClass;
begin
Result := TdxGridBandedTableViewColumnPlace;
end;
procedure TdxCustomGridBandedTableViewItemPlace.AssignWidth;
begin
Width := Width;
end;
function TdxCustomGridBandedTableViewItemPlace.CalculateHeight: Integer;
begin
Result := Controller.CalculateItemHeight(Self);
end;
function TdxCustomGridBandedTableViewItemPlace.CalculateLevelHeight: Integer;
begin
if Adapter.BandHeaderHeightAssigned then
Result := Adapter.BandHeaderHeight
else
Result := CalculateLineHeight * Adapter.BandHeaderLineCount;
end;
function TdxCustomGridBandedTableViewItemPlace.CalculateLineHeight: Integer;
begin
Result := 0;
Formatter.CalculateHeight(ViewParams, Result);
end;
function TdxCustomGridBandedTableViewItemPlace.CalculateMinWidth: Integer;
begin
Result := InternalCalculateMinWidth;
{$IFDEF DXVER500}
if Result < Band.MinWidth then Result := Band.MinWidth;
{$ENDIF}
end;
function TdxCustomGridBandedTableViewItemPlace.CalculateLeftBound: Integer;
begin
Result := Controller.CalculateItemLeftBound(Self);
end;
function TdxCustomGridBandedTableViewItemPlace.CalculateTopBound: Integer;
begin
Result := Controller.CalculateItemTopBound(Self);
end;
function TdxCustomGridBandedTableViewItemPlace.GetRowCount: Integer;
begin
Result := 0;
end;
function TdxCustomGridBandedTableViewItemPlace.InternalCalculateMinWidth: Integer;
begin
Result := 0;
end;
function TdxCustomGridBandedTableViewItemPlace.InternalCalculateWidth: Integer;
begin
Result := 0;
end;
procedure TdxCustomGridBandedTableViewItemPlace.InitAutoWidthItem(AnItem: TcxAutoWidthItem);
begin
AnItem.Fixed := IsFixed;
AnItem.MinWidth := MinWidth;
AnItem.Width := Width;
end;
function TdxCustomGridBandedTableViewItemPlace.GetAdapter: TdxGridBandedTableViewAdapter;
begin
Result := inherited Adapter as TdxGridBandedTableViewAdapter;
end;
function TdxCustomGridBandedTableViewItemPlace.GetBounds: TRect;
begin
Result := MakeBounds(LeftBound, TopBound, Width, Height);
end;
function TdxCustomGridBandedTableViewItemPlace.GetFormatter: TdxGridBandedTableViewFormatter;
begin
Result := inherited Formatter as TdxGridBandedTableViewFormatter;
end;
function TdxCustomGridBandedTableViewItemPlace.GetHeight: Integer;
begin
if FHeight = -1 then
FHeight := CalculateHeight;
Result := FHeight;
end;
function TdxCustomGridBandedTableViewItemPlace.GetIndex: Integer;
begin
if Parent <> nil then
Result := Parent.IndexOf(Self)
else
Result := Controller.RootIndexOf(Self);
end;
function TdxCustomGridBandedTableViewItemPlace.GetIsFixed: Boolean;
begin
Result := not Band.Options.Sizing;
end;
function TdxCustomGridBandedTableViewItemPlace.GetLeftBound: Integer;
begin
if FLeftBound = -1 then
FLeftBound := CalculateLeftBound;
Result := FLeftBound;
end;
function TdxCustomGridBandedTableViewItemPlace.GetLevelIndex: Integer;
begin
{$IFDEF DXVER500}
Result := Band.BandLevelIndex;
{$ELSE}
Result := 0;
{$ENDIF}
end;
function TdxCustomGridBandedTableViewItemPlace.GetMinWidth: Integer;
begin
if FMinWidth = -1 then
FMinWidth := CalculateMinWidth;
Result := FMinWidth;
end;
function TdxCustomGridBandedTableViewItemPlace.GetTopBound: Integer;
begin
if FTopBound = -1 then
FTopBound := CalculateTopBound;
Result := FTopBound;
end;
function TdxCustomGridBandedTableViewItemPlace.GetViewParams: TdxReportItemViewParams;
begin
Result := Formatter.GetBandItemViewParams(Band);
end;
{ TdxGridBandedTableViewItemPlace }
constructor TdxGridBandedTableViewItemPlace.Create(AnOwner: TdxGridBandedTableViewItemPlaceController;
AParent: TdxGridBandedTableViewItemPlace; ABand: TcxGridBand);
begin
inherited;
FChildItems := TList.Create;
end;
destructor TdxGridBandedTableViewItemPlace.Destroy;
begin
FreeAndNil(FChildItems);
inherited;
end;
function TdxGridBandedTableViewItemPlace.IndexOf(AnItem: TdxCustomGridBandedTableViewItemPlace): Integer;
begin
Result := FChildItems.IndexOf(AnItem);
end;
{$IFDEF DXVER500}
procedure TdxGridBandedTableViewItemPlace.Refresh;
begin
inherited;
RefreshChildItems;
end;
{$ENDIF}
function TdxGridBandedTableViewItemPlace.GetRowCount: Integer;
begin
Result := 1;
end;
function TdxGridBandedTableViewItemPlace.InternalCalculateMinWidth: Integer;
var
I: Integer;
begin
Result := 0;
for I := 0 to ChildItemCount - 1 do
Inc(Result, ChildItems[I].MinWidth);
end;
function TdxGridBandedTableViewItemPlace.InternalCalculateWidth: Integer;
var
I: Integer;
begin
Result := 0;
for I := 0 to ChildItemCount - 1 do
Inc(Result, ChildItems[I].Width);
end;
procedure TdxGridBandedTableViewItemPlace.WidthChanged;
begin
inherited;
CalculateChildItemWidths;
end;
procedure TdxGridBandedTableViewItemPlace.CalculateChildItemWidths;
var
AutoWidthObject: TcxAutoWidthObject;
I: Integer;
begin
AutoWidthObject := TcxAutoWidthObject.Create(ChildItemCount);
try
for I := 0 to ChildItemCount - 1 do
ChildItems[I].InitAutoWidthItem(AutoWidthObject.AddItem);
AutoWidthObject.AvailableWidth := Width;
AutoWidthObject.Calculate;
for I := 0 to ChildItemCount - 1 do
ChildItems[I].Width := AutoWidthObject[I].AutoWidth;
finally
AutoWidthObject.Free;
end;
end;
{$IFDEF DXVER500}
procedure TdxGridBandedTableViewItemPlace.RefreshChildItems;
var
I: Integer;
begin
FChildItems.Count := Band.VisibleChildBandCount;
for I := 0 to FChildItems.Count - 1 do
begin
FChildItems[I] := Controller.ItemsByBand[Band.VisibleChildBands[I]];
ChildItems[I].FParent := Self;
end;
end;
{$ENDIF}
function TdxGridBandedTableViewItemPlace.GetChildItem(Index: Integer): TdxCustomGridBandedTableViewItemPlace;
begin
Result := TdxCustomGridBandedTableViewItemPlace(FChildItems[Index]);
end;
function TdxGridBandedTableViewItemPlace.GetChildItemCount: Integer;
begin
Result := FChildItems.Count;
end;
{ TdxGridBandedTableViewBottomItemPlace }
procedure TdxGridBandedTableViewBottomItemPlace.AddItems;
var
I, J: Integer;
Row: TcxGridBandRow;
begin
for I := 0 to Band.Rows.VisibleCount - 1 do
begin
Row := Band.Rows.VisibleItems[I];
for J := 0 to Row.VisibleCount - 1 do
CreateItem(Row.VisibleItems[J]);
end;
end;
function TdxGridBandedTableViewBottomItemPlace.CalculateItemLeftBound(AnItem: TdxGridTableViewColumnPlace): Integer;
var
Row: TcxGridBandRow;
I: Integer;
Item: TdxGridTableViewColumnPlace;
begin
Result := LeftBound;
Row := TdxGridBandedTableViewColumnPlace(AnItem).Column.Position.Row;
for I := 0 to TdxGridBandedTableViewColumnPlace(AnItem).Column.Position.VisibleColIndex - 1 do
begin
Item := ItemsByColumn[Row.VisibleItems[I]];
Inc(Result, Item.Width);
end;
end;
procedure TdxGridBandedTableViewBottomItemPlace.CalculateItemsWidth;
var
I, J: Integer;
Row: TcxGridBandRow;
AutoWidthObject: TcxAutoWidthObject;
Column: TcxGridColumn;
begin
for I := 0 to Band.Rows.VisibleCount - 1 do
begin
Row := Band.Rows.VisibleItems[I];
AutoWidthObject := TcxAutoWidthObject.Create(Row.VisibleCount);
try
for J := 0 to Row.VisibleCount - 1 do
ItemsByColumn[Row.VisibleItems[J]].InitAutoWidthItem(AutoWidthObject.AddItem);
AutoWidthObject.AvailableWidth := ItemsAvailableWidth;
AutoWidthObject.Calculate;
for J := 0 to Row.VisibleCount - 1 do
begin
Column := Row.VisibleItems[J];
ItemsByColumn[Column].Width := AutoWidthObject[J].AutoWidth;
end;
finally
AutoWidthObject.Free;
end;
end;
end;
function TdxGridBandedTableViewBottomItemPlace.GetItemsAutoWidth: Boolean;
begin
Result := True;
end;
function TdxGridBandedTableViewBottomItemPlace.GetItemsAvailableWidth: Integer;
begin
Result := Width;
end;
function TdxGridBandedTableViewBottomItemPlace.GetRowCount: Integer;
begin
Result := Controller.LevelCount - LevelIndex;
end;
function TdxGridBandedTableViewBottomItemPlace.InternalCalculateMinWidth: Integer;
var
I, V, J: Integer;
Row: TcxGridBandRow;
Column: TcxGridColumn;
begin
Result := 0;
for I := 0 to Band.Rows.VisibleCount - 1 do
begin
V := 0;
Row := Band.Rows.VisibleItems[I];
for J := 0 to Row.VisibleCount - 1 do
begin
Column := Row.VisibleItems[J];
Inc(V, Adapter.InternalColumnMinWidths[Column]);
end;
//if Row.IsFirst then
// Inc(V, Formatter.IndentWidth * Formatter.IndentCount);
if Result < V then Result := V;
end
end;
function TdxGridBandedTableViewBottomItemPlace.InternalCalculateWidth: Integer;
var
I, V, J: Integer;
Row: TcxGridBandRow;
Column: TcxGridColumn;
begin
Result := 0;
for I := 0 to Band.Rows.VisibleCount - 1 do
begin
V := 0;
Row := Band.Rows.VisibleItems[I];
for J := 0 to Row.VisibleCount - 1 do
begin
Column := Row.VisibleItems[J];
Inc(V, Adapter.InternalColumnWidths[Column]);
end;
if Result < V then Result := V;
end;
end;
procedure TdxGridBandedTableViewBottomItemPlace.WidthChanged;
begin
inherited;
CalculateItemsWidth;
end;
{ TdxGridBandedTableViewItemPlaceController }
constructor TdxGridBandedTableViewItemPlaceController.Create(AFormatter: TdxGridTableViewFormatter);
begin
inherited;
FBottomItems := TList.Create;
FItems := TList.Create;
FRootItems := TList.Create;
FLevelHeights := TList.Create;
FHeight := -1;
FLevelCount := -1;
end;
destructor TdxGridBandedTableViewItemPlaceController.Destroy;
begin
FreeAndNil(FLevelHeights);
FreeAndNil(FRootItems);
FreeAndNilItems;
FreeAndNil(FBottomItems);
inherited;
end;
procedure TdxGridBandedTableViewItemPlaceController.Calculate;
begin
CalculateLevelHeights;
CalculateItemWidths;
end;
procedure TdxGridBandedTableViewItemPlaceController.Refresh;
begin
ClearItems;
AddItems;
RefreshRootItems;
RefreshBottomItems;
RefreshItems;
end;
function TdxGridBandedTableViewItemPlaceController.IndexOf(AnItem: TdxCustomGridBandedTableViewItemPlace): Integer;
begin
Result := FItems.IndexOf(AnItem);
end;
function TdxGridBandedTableViewItemPlaceController.IndexOf(ABand: TcxGridBand): Integer;
begin
for Result := 0 to ItemCount - 1 do
if Items[Result].Band = ABand then
Exit;
Result := -1;
end;
function TdxGridBandedTableViewItemPlaceController.RootIndexOf(AnItem: TdxCustomGridBandedTableViewItemPlace): Integer;
begin
Result := FRootItems.IndexOf(AnItem);
end;
function TdxGridBandedTableViewItemPlaceController.RootIndexOf(ABand: TcxGridBand): Integer;
begin
for Result := 0 to RootItemCount - 1 do
if RootItems[Result].Band = ABand then
Exit;
Result := -1;
end;
function TdxGridBandedTableViewItemPlaceController.CalculateHeaderLineCount: Integer;
var
I, V: Integer;
begin
Result := -1;
for I := 0 to BottomItemCount - 1 do
begin
V := BottomItems[I].HeaderLineCount;
if Result < V then Result := V;
end;
end;
function TdxGridBandedTableViewItemPlaceController.CalculateWidth: Integer;
var
I: Integer;
begin
Result := 0;
for I := 0 to RootItemCount - 1 do
Inc(Result, RootItems[I].Width);
end;
function TdxGridBandedTableViewItemPlaceController.GetItemByColumn(Column: TcxGridColumn): TdxGridTableViewColumnPlace;
var
BandPlace: TdxCustomGridBandedTableViewItemPlace;
begin
BandPlace := ItemsByBand[TcxGridBandedColumn(Column).Position.Band];
if BandPlace <> nil then
Result := BandPlace.ItemsByColumn[Column]
else
Result := nil;
end;
procedure TdxGridBandedTableViewItemPlaceController.AddItems;
var
I: Integer;
begin
FItems.Count := Formatter.BandCount;
for I := 0 to ItemCount - 1 do
FItems[I] := CreateItem(Formatter.Bands[I]);
end;
function TdxGridBandedTableViewItemPlaceController.CalculateHeight: Integer;
var
I: Integer;
begin
Result := 0;
for I := 0 to LevelCount - 1 do
Inc(Result, LevelHeights[I]);
end;
function TdxGridBandedTableViewItemPlaceController.CalculateItemHeight(AnItem: TdxCustomGridBandedTableViewItemPlace): Integer;
var
I: Integer;
begin
Result := 0;
for I := AnItem.LevelIndex to AnItem.LevelIndex + AnItem.RowCount - 1 do
Inc(Result, LevelHeights[I]);
end;
function TdxGridBandedTableViewItemPlaceController.CalculateItemLeftBound(AnItem: TdxCustomGridBandedTableViewItemPlace): Integer;
var
I: Integer;
begin
if AnItem.Parent <> nil then
begin
Result := AnItem.Parent.LeftBound;
for I := 0 to AnItem.Index - 1 do
Inc(Result, AnItem.Parent.ChildItems[I].Width);
end
else
begin
Result := 0;
for I := 0 to AnItem.Index - 1 do
Inc(Result, RootItems[I].Width);
end;
end;
function TdxGridBandedTableViewItemPlaceController.CalculateItemTopBound(AnItem: TdxCustomGridBandedTableViewItemPlace): Integer;
var
I: Integer;
begin
Result := 0;
for I := 0 to AnItem.LevelIndex - 1 do
Inc(Result, LevelHeights[I]);
end;
function TdxGridBandedTableViewItemPlaceController.CalculateLevelCount: Integer;
var
I, V: Integer;
begin
Result := 0;
if ItemCount <> 0 then
begin
for I := 0 to ItemCount - 1 do
begin
V := Items[I].LevelIndex;
if Result < V then Result := V;
end;
Inc(Result);
end;
end;
procedure TdxGridBandedTableViewItemPlaceController.CalculateItemWidths;
var
I: Integer;
AutoWidthObject: TcxAutoWidthObject;
begin
for I := 0 to RootItemCount - 1 do
RootItems[I].AssignWidth;
if AutoWidth then
begin
AutoWidthObject := TcxAutoWidthObject.Create(RootItemCount);
try
for I := 0 to RootItemCount - 1 do
RootItems[I].InitAutoWidthItem(AutoWidthObject.AddItem);
AutoWidthObject.AvailableWidth := AvailableWidth;
AutoWidthObject.Calculate;
for I := 0 to RootItemCount - 1 do
RootItems[I].Width := AutoWidthObject[I].AutoWidth;
finally
AutoWidthObject.Free;
end;
end;
end;
procedure TdxGridBandedTableViewItemPlaceController.CalculateLevelHeights;
var
I, V: Integer;
Item: TdxCustomGridBandedTableViewItemPlace;
begin
FLevelHeights.Count := LevelCount;
for I := 0 to ItemCount - 1 do
begin
Item := Items[I];
V := Item.CalculateLevelHeight;
if LevelHeights[Item.LevelIndex] < V then
LevelHeights[Item.LevelIndex] := V;
end;
end;
procedure TdxGridBandedTableViewItemPlaceController.ClearItems;
var
I: Integer;
begin
for I := 0 to ItemCount - 1 do
Items[I].Free;
FItems.Clear;
end;
function TdxGridBandedTableViewItemPlaceController.CreateItem(ABand: TcxGridBand): TdxCustomGridBandedTableViewItemPlace;
begin
Result := GetItemClass(ABand).Create(Self, nil, ABand);
end;
function TdxGridBandedTableViewItemPlaceController.GetItemClass(ABand: TcxGridBand): TdxCustomGridBandedTableViewItemPlaceClass;
begin
{$IFDEF DXVER500}
if ABand.IsBottom then
Result := TdxGridBandedTableViewBottomItemPlace
else
Result := TdxGridBandedTableViewItemPlace;
{$ELSE}
Result := TdxGridBandedTableViewBottomItemPlace;
{$ENDIF}
end;
procedure TdxGridBandedTableViewItemPlaceController.RefreshBottomItems;
var
I: Integer;
begin
FBottomItems.Count := Adapter.BottomBandCount;
for I := 0 to BottomItemCount - 1 do
FBottomItems[I] := ItemsByBand[Adapter.BottomBands[I]];
end;
procedure TdxGridBandedTableViewItemPlaceController.RefreshItems;
var
I: Integer;
begin
for I := 0 to ItemCount - 1 do
Items[I].Refresh;
end;
procedure TdxGridBandedTableViewItemPlaceController.RefreshRootItems;
var
I: Integer;
begin
FRootItems.Count := Adapter.RootBandCount;
for I := 0 to RootItemCount - 1 do
FRootItems[I] := ItemsByBand[Adapter.RootBands[I]];
end;
function TdxGridBandedTableViewItemPlaceController.GetAdapter: TdxGridBandedTableViewAdapter;
begin
Result := Formatter.Adapter;
end;
function TdxGridBandedTableViewItemPlaceController.GetAutoWidth: Boolean;
begin
Result := Formatter.AutoWidth;
end;
function TdxGridBandedTableViewItemPlaceController.GetAvailableWidth: Integer;
begin
Result := Formatter.ViewAvailableWidth;
end;
function TdxGridBandedTableViewItemPlaceController.GetBottomItem(Index: Integer): TdxCustomGridBandedTableViewItemPlace;
begin
Result := TdxCustomGridBandedTableViewItemPlace(FBottomItems[Index]);
end;
function TdxGridBandedTableViewItemPlaceController.GetBottomItemCount: Integer;
begin
Result := FBottomItems.Count;
end;
function TdxGridBandedTableViewItemPlaceController.GetFormatter: TdxGridBandedTableViewFormatter;
begin
Result := inherited Formatter as TdxGridBandedTableViewFormatter;
end;
function TdxGridBandedTableViewItemPlaceController.GetHeight: Integer;
begin
if FHeight = -1 then
FHeight := CalculateHeight;
Result := FHeight;
end;
function TdxGridBandedTableViewItemPlaceController.GetItem(Index: Integer): TdxCustomGridBandedTableViewItemPlace;
begin
Result := TdxCustomGridBandedTableViewItemPlace(FItems[Index]);
end;
function TdxGridBandedTableViewItemPlaceController.GetItemByBand(Band: TcxGridBand): TdxCustomGridBandedTableViewItemPlace;
var
Index: Integer;
begin
Index := IndexOf(Band);
if Index <> -1 then
Result := Items[IndexOf(Band)]
else
Result := nil;
end;
function TdxGridBandedTableViewItemPlaceController.GetItemCount: Integer;
begin
Result := FItems.Count;
end;
function TdxGridBandedTableViewItemPlaceController.GetLevelCount: Integer;
begin
if FLevelCount = -1 then
FLevelCount := CalculateLevelCount;
Result := FLevelCount;
end;
function TdxGridBandedTableViewItemPlaceController.GetLevelHeight(Index: Integer): Integer;
begin
Result := Integer(FLevelHeights[Index]);
end;
function TdxGridBandedTableViewItemPlaceController.GetRootItem(Index: Integer): TdxCustomGridBandedTableViewItemPlace;
begin
Result := TdxCustomGridBandedTableViewItemPlace(FRootItems[Index]);
end;
function TdxGridBandedTableViewItemPlaceController.GetRootItemCount: Integer;
begin
Result := FRootItems.Count;
end;
procedure TdxGridBandedTableViewItemPlaceController.SetLevelHeight(Index: Integer; Value: Integer);
begin
FLevelHeights[Index] := TObject(Value);
end;
procedure TdxGridBandedTableViewItemPlaceController.FreeAndNilItems;
begin
ClearItems;
FreeAndNil(FItems);
end;
{ TdxGridBandedTableViewFormatter }
constructor TdxGridBandedTableViewFormatter.Create(ABuilder: TdxCustomGridViewBuilder);
begin
inherited;
FBands := TList.Create;
end;
destructor TdxGridBandedTableViewFormatter.Destroy;
begin
FreeAndNil(FBands);
inherited;
end;
function TdxGridBandedTableViewFormatter.Adapter: TdxGridBandedTableViewAdapter;
begin
Result := Builder.Adapter;
end;
function TdxGridBandedTableViewFormatter.Builder: TdxGridBandedTableViewBuilder;
begin
Result := inherited Builder as TdxGridBandedTableViewBuilder;
end;
procedure TdxGridBandedTableViewFormatter.DoInitializeBandItem(AnItem: TAbstractdxReportCellData;
AnIndex: Integer);
var
Band: TcxGridBand;
begin
Band := Bands[AnIndex];
SetViewParams(AnItem, GetBandItemViewParams(Band));
if HasBackgroundBitmap(bbBandHeader) then
AnItem.BackgroundBitmapIndex := GetBackgroundBitmapIndex(bbBandHeader);
RegisterLookAndFeelItem(AnItem, cesRaised);
with AnItem as TdxReportCellString do
begin
Data := Integer(Band);
EndEllipsis := Adapter.BandEndEllipsis;
Multiline := Adapter.BandHeaderMultiline;
Text := Band.Caption;
TextAlignX := TextAlignXMap[Band.HeaderAlignmentHorz];
TextAlignY := TextAlignYMap[Band.HeaderAlignmentVert];
//Transparent := False; {!!! v3.03}
end;
end;
procedure TdxGridBandedTableViewFormatter.DoInitializeBandRow(ARow: TdxReportCell);
begin
SetViewParams(ARow, GetBandItemViewParams(nil));
ARow.Transparent := True; //???
end;
procedure TdxGridBandedTableViewFormatter.DoReportLinkInitializeBandItem(AnItem: TAbstractdxReportCellData;
AnIndex: Integer);
begin
ReportLink.DoInitializeBandCell(Adapter.GridView, Bands[AnIndex], TdxReportCellString(AnItem));
end;
function TdxGridBandedTableViewFormatter.GetBandItemBounds(AnIndex: Integer): TRect;
var
Item: TdxCustomGridBandedTableViewItemPlace;
begin
Item := ItemPlaceController.ItemsByBand[Bands[AnIndex]];
if Item <> nil then
Result := Item.Bounds
else
Result := dxPSGlbl.NullRect;
end;
function TdxGridBandedTableViewFormatter.GetBandItemClass(AnIndex: Integer): TdxReportCellTextClass;
begin
Result := TdxReportCellString;
end;
function TdxGridBandedTableViewFormatter.GetBandItemViewParams(ABand: TcxGridBand): TdxReportItemViewParams;
begin
if ReportLink.OptionsFormatting.UseNativeStyles then
ReportLink.Styles.GetBandHeaderParams(ABand, Result.NativeParams)
else
Result.NativeParams := Adapter.GetBandHeaderViewParams(ABand);
if UseLookAndFeelColors and Adapter.CanUseLookAndFeelColors then
if ABand <> nil then
begin
Result.NativeParams.Color := Adapter.ThemedBandHeaderItemColor;
Result.NativeParams.TextColor := Adapter.ThemedBandHeaderItemTextColor;
end;
Result.CellSides := csAll;
Result.FontStyle := [];
Result.Transparent := False;
end;
procedure TdxGridBandedTableViewFormatter.AddHorizontalDelimiters;
var
Origin, I: Integer;
R: TRect;
Item: TdxCustomGridBandedTableViewItemPlace;
begin
if ReportLink.OptionsPagination.Band then
begin
Origin := ViewWidthExtraBefore;
for I := 0 to BandCount - 1 do
begin
Item := ItemPlaceController.ItemsByBand[Bands[I]];
if Item <> nil then
begin
R := Item.Bounds;
ReportLink.AddHorizontalDelimiter(Origin + R.Left);
ReportLink.AddHorizontalDelimiter(Origin + R.Right);
end;
end;
end;
inherited;
end;
{$IFDEF DXVER500}
function TdxGridBandedTableViewFormatter.CanColumnCellMerging(AColumn: TcxGridColumn): Boolean;
begin
Result := inherited CanColumnCellMerging(AColumn) and
(TcxGridBandedColumn(AColumn).Position.LineCount = ItemPlaceController.HeaderLineCount);
end;
function TdxGridBandedTableViewFormatter.IsColumnActuallyVisible(AColumn: TcxGridColumn): Boolean;
begin
Result := inherited IsColumnActuallyVisible(AColumn) and
TcxGridBandedColumn(AColumn).Position.Band.ActuallyVisible;
end;
{$ENDIF}
function TdxGridBandedTableViewFormatter.GetItemPlaceControllerClass: TdxCustomGridTableViewItemPlaceControllerClass;
begin
Result := TdxGridBandedTableViewItemPlaceController;
end;
procedure TdxGridBandedTableViewFormatter.BuildBandList;
var
I: Integer;
Band: TcxGridBand;
begin
FBands.Clear;
for I := 0 to Adapter.BandCount - 1 do
begin
Band := Adapter.Bands[I];
if IsBandActuallyVisible(Band) then FBands.Add(Band);
end;
end;
procedure TdxGridBandedTableViewFormatter.BuildItemLists;
begin
BuildBandList;
inherited;
end;
function TdxGridBandedTableViewFormatter.IsBandActuallyVisible(ABand: TcxGridBand): Boolean;
begin
{$IFDEF DXVER500}
Result := ABand.ActuallyVisible;
{$ELSE}
Result := True;
{$ENDIF}
end;
function TdxGridBandedTableViewFormatter.MapStyleBackgroundBitmapIndex(AGridBackgroundBitmapIndex: Integer): Integer;
begin
case AGridBackgroundBitmapIndex of
bbBandHeader:
Result := vspsGridBandHeader;
else
Result := 0;
end;
if Result = 0 then
Result := inherited MapStyleBackgroundBitmapIndex(AGridBackgroundBitmapIndex);
end;
function TdxGridBandedTableViewFormatter.GetBand(Index: Integer): TcxGridBand;
begin
Result := TcxGridBand(FBands[Index]);
end;
function TdxGridBandedTableViewFormatter.GetBandCount: Integer;
begin
Result := FBands.Count;
end;
function TdxGridBandedTableViewFormatter.GetColumn(Index: Integer): TcxGridBandedColumn;
begin
Result := inherited Columns[Index] as TcxGridBandedColumn;
end;
function TdxGridBandedTableViewFormatter.GetItemPlaceController: TdxGridBandedTableViewItemPlaceController;
begin
Result := inherited ItemPlaceController as TdxGridBandedTableViewItemPlaceController;
end;
function TdxGridBandedTableViewFormatter.GetShowBandHeaders: Boolean;
begin
Result := ReportLink.OptionsView.BandHeaders;
end;
{ TdxGridBandedTableViewBuilder }
function TdxGridBandedTableViewBuilder.Adapter: TdxGridBandedTableViewAdapter;
begin
Result := inherited Adapter as TdxGridBandedTableViewAdapter;
end;
class function TdxGridBandedTableViewBuilder.AdapterClass: TdxGridViewAdapterClass;
begin
Result := TdxGridBandedTableViewAdapter;
end;
function TdxGridBandedTableViewBuilder.Formatter: TdxGridBandedTableViewFormatter;
begin
Result := inherited Formatter as TdxGridBandedTableViewFormatter;
end;
class function TdxGridBandedTableViewBuilder.FormatterClass: TdxGridViewFormatterClass;
begin
Result := TdxGridBandedTableViewFormatter;
end;
procedure TdxGridBandedTableViewBuilder.DoBuildViewBody;
begin
if Formatter.ShowBandHeaders then CreateBands;
if Formatter.ShowHeaders then CreateHeader;
CreateRows;
if Formatter.ShowFooters then CreateFooter;
end;
procedure TdxGridBandedTableViewBuilder.CreateBands;
var
ReportRow: TdxReportCell;
begin
ReportRow := GetBandsProducer.Produce(HostInfoServices.BandHeadersHostInfo);
AddReportRow(ReportRow);
end;
function TdxGridBandedTableViewBuilder.GetBandsProducer: TdxGridTableViewBandsProducer;
begin
Result := ProducerCache[GetBandsProducerClass] as TdxGridTableViewBandsProducer;
end;
function TdxGridBandedTableViewBuilder.GetBandsProducerClass: TdxGridTableViewBandsProducerClass;
begin
Result := TdxGridTableViewBandsProducer;
end;
function TdxGridBandedTableViewBuilder.GridView: TcxGridBandedTableView;
begin
Result := inherited GridView as TcxGridBandedTableView;
end;
class function TdxGridBandedTableViewBuilder.GridViewClass: TcxCustomGridViewClass;
begin
Result := TcxGridBandedTableView;
end;
{ TdxGridDBBandedTableViewAdapter }
function TdxGridDBBandedTableViewAdapter.GridView: TcxGridDBBandedTableView;
begin
Result := inherited GridView as TcxGridDBBandedTableView;
end;
class function TdxGridDBBandedTableViewAdapter.GridViewClass: TcxCustomGridViewClass;
begin
Result := TcxGridDBBandedTableView;
end;
procedure TdxGridDBBandedTableViewAdapter.AfterBuilding;
begin
UnloadAllRecords;
inherited;
end;
procedure TdxGridDBBandedTableViewAdapter.BeforeBuilding;
begin
inherited;
LoadAllRecords;
end;
function TdxGridDBBandedTableViewAdapter.DataController: TcxGridDBDataController;
begin
Result := TcxGridDBDataController(inherited DataController);
end;
function TdxGridDBBandedTableViewAdapter.DBDataModeController: TcxDBDataModeController;
begin
Result := DataController.DataModeController;
end;
procedure TdxGridDBBandedTableViewAdapter.LoadAllRecords;
begin
_LoadAllRecords(DBDataModeController, FPrevAllRecordsAreLoaded);
end;
procedure TdxGridDBBandedTableViewAdapter.UnloadAllRecords;
begin
_UnloadAllRecords(DBDataModeController, FPrevAllRecordsAreLoaded);
end;
{ TdxGridDBBandedTableViewBuilder }
function TdxGridDBBandedTableViewBuilder.Adapter: TdxGridDBBandedTableViewAdapter;
begin
Result := inherited Adapter as TdxGridDBBandedTableViewAdapter;
end;
class function TdxGridDBBandedTableViewBuilder.AdapterClass: TdxGridViewAdapterClass;
begin
Result := TdxGridDBBandedTableViewAdapter;
end;
{ TdxGridCardViewAdapter }
function TdxGridCardViewAdapter.GridView: TcxGridCardView;
begin
Result := inherited GridView as TcxGridCardView;
end;
class function TdxGridCardViewAdapter.GridViewClass: TcxCustomGridViewClass;
begin
Result := TcxGridCardView;
end;
function TdxGridCardViewAdapter.Styles: TcxGridCardViewStyles;
begin
Result := inherited Styles as TcxGridCardViewStyles;
end;
procedure TdxGridCardViewAdapter.GetVisibleCardRows(ACard: TcxGridCard; AList: TList);
{$IFNDEF DXVER500}
var
I: Integer;
{$ENDIF}
begin
{$IFDEF DXVER500}
ACard.GetVisibleRows(AList);
{$ELSE}
for I := 0 to CardRowCount - 1 do
AList.Add(CardRows[I]);
{$ENDIF}
end;
procedure TdxGridCardViewAdapter.ExpandAllRows(AnOptionsExpanding: TdxGridReportLinkOptionsExpanding;
ARecursive: Boolean);
begin
{$IFDEF DXVER500}
if AnOptionsExpanding.ExpandCards then GridView.ViewData.Expand(True);
{$ENDIF}
end;
function TdxGridCardViewAdapter.IsFirstRow(ACardRow: TcxGridCardViewRow): Boolean;
begin
Result := ACardRow.VisibleIndex = 0;
end;
function TdxGridCardViewAdapter.IsLastRow(ACardRow: TcxGridCardViewRow): Boolean;
begin
Result := ACardRow.VisibleIndex = CardRowCount - 1;
end;
function TdxGridCardViewAdapter.GetAreAllMasterRowsCollapsed: Boolean;
begin
Result := True;
end;
function TdxGridCardViewAdapter.GetCaptionRowViewParams(ARecord: TcxCustomGridRecord;
ACardRow: TcxGridCardViewRow): TcxViewParams;
begin
if (ACardRow <> nil) and (ACardRow.Styles.CaptionRow <> nil) then
ACardRow.Styles.GetCaptionRowParams(ARecord, Result)
else
Styles.GetCaptionRowParams(ARecord, ACardRow, Result);
end;
function TdxGridCardViewAdapter.GetCardViewParams(ARecord: TcxCustomGridRecord): TcxViewParams;
begin
Styles.GetContentParams(ARecord, nil, Result);
end;
function TdxGridCardViewAdapter.GetContentViewParams(ARecord: TcxCustomGridRecord;
ATableItem: TcxCustomGridTableItem): TcxViewParams;
begin
if TcxGridCardViewRow(ATableItem).Kind = rkData then
Result := inherited GetContentViewParams(ARecord, ATableItem)
else
Result := GetCaptionRowViewParams(ARecord, TcxGridCardViewRow(ATableItem));
end;
function TdxGridCardViewAdapter.GetRowCaptionViewParams(ARecord: TcxCustomGridRecord;
ACardRow: TcxGridCardViewRow): TcxViewParams;
begin
if (ACardRow <> nil) and (ACardRow.Kind = rkData) then
if ACardRow.Styles.Caption <> nil then
ACardRow.Styles.GetCaptionParams(ARecord, Result)
else
Styles.GetRowCaptionParams(ARecord, ACardRow, Result)
else
Result := GetCaptionRowViewParams(ARecord, ACardRow);
end;
function TdxGridCardViewAdapter.GetCaptionSeparator: string;
begin
Result := GridView.OptionsView.CaptionSeparator;
end;
function TdxGridCardViewAdapter.GetCard(Index: Integer): TcxGridCard;
begin
Result := Records[Index] as TcxGridCard;
end;
function TdxGridCardViewAdapter.GetCardCount: Integer;
begin
Result := RecordCount;
end;
function TdxGridCardViewAdapter.GetCardCaptionWidth: Integer;
begin
Result := GridView.OptionsView.CaptionWidth;
end;
function TdxGridCardViewAdapter.GetCardRow(Index: Integer): TcxGridCardViewRow;
begin
Result := GridView.VisibleRows[Index];
end;
function TdxGridCardViewAdapter.GetCardRowCount: Integer;
begin
Result := GridView.VisibleRowCount;
end;
function TdxGridCardViewAdapter.GetCardSeparatorColor: Integer;
begin
Result := GridView.OptionsView.SeparatorColor;
end;
function TdxGridCardViewAdapter.GetCardSeparatorThickness: Integer;
begin
Result := GridView.OptionsView.SeparatorWidth;
end;
function TdxGridCardViewAdapter.GetCardWidth: Integer;
begin
Result := GridView.OptionsView.CardWidth;
end;
function TdxGridCardViewAdapter.GetHasCardsSeparator: Boolean;
begin
Result := CardSeparatorThickness <> 0;
end;
function TdxGridCardViewAdapter.GetRowAutoHeight: Boolean;
begin
with GridView.OptionsView do
Result := CellAutoHeight or RowCaptionAutoHeight;
end;
function TdxGridCardViewAdapter.GetRowCaptionAutoHeight: Boolean;
begin
Result := GridView.OptionsView.RowCaptionAutoHeight;
end;
function TdxGridCardViewAdapter.GetRowCaptionEndEllipsis: Boolean;
begin
Result := GridView.OptionsView.RowCaptionEndEllipsis;
end;
function TdxGridCardViewAdapter.GetShowRowCaption(Index: Integer): Boolean;
begin
Result := CardRows[Index].Options.ShowCaption;
end;
{ TdxGridCardViewFormatter }
function TdxGridCardViewFormatter.Adapter: TdxGridCardViewAdapter;
begin
Result := Builder.Adapter;
end;
function TdxGridCardViewFormatter.Builder: TdxGridCardViewBuilder;
begin
Result := inherited Builder as TdxGridCardViewBuilder;
end;
procedure TdxGridCardViewFormatter.DoInitializeCard(ACard: TdxReportCard;
AGridCard: TcxGridCard);
begin
with ReportLink.OptionsCards.Shadow do
begin
ACard.ShadowColor := ActualColor;
ACard.ShadowDepth := Depth;
ACard.ShadowPosition := Position;
end;
SetViewParams(ACard, GetCardViewParams(AGridCard));
ACard.Data := Integer(AGridCard);
ACard.Width := Adapter.CardWidth;
ACard.CreateRows(Builder);
end;
procedure TdxGridCardViewFormatter.DoInitializeCardsRow(ACard: TdxReportCell);
begin
if HasBackgroundBitmap(bbBackground) then
ACard.BackgroundBitmapIndex := GetBackgroundBitmapIndex(bbBackground);
ACard.CellSides := [];
end;
function TdxGridCardViewFormatter.GetCardClass(AGridCard: TcxGridCard): TdxReportCardClass;
begin
Result := TdxReportCard;
end;
function TdxGridCardViewFormatter.GetCardViewParams(ARecord: TcxCustomGridRecord): TdxReportItemViewParams;
begin
Result.NativeParams := Adapter.GetCardViewParams(ARecord);
Result.CellSides := csAll;//[]; // because of Card Shadow
Result.FontStyle := [];
Result.Transparent := True;
end;
procedure TdxGridCardViewFormatter.DoInitializeCardRowCaption(AnItem: TdxReportCellText;
ACardRow: TcxGridCardViewRow; AGridCard: TcxGridCard);
const
BackgroundBitmapIndexes: array[TcxGridCardViewRowKind] of Integer =
(bbRowCaption, bbCaptionRow{$IFDEF GRID6}, bbCaptionRow{$ENDIF});
begin
SetViewParams(AnItem, GetCardRowCaptionViewParams(AGridCard, ACardRow));
if HasBackgroundBitmap(BackgroundBitmapIndexes[ACardRow.Kind]) then
AnItem.BackgroundBitmapIndex := GetBackgroundBitmapIndex(BackgroundBitmapIndexes[ACardRow.Kind]);
with AnItem as TdxReportCellString do
begin
EndEllipsis := Adapter.RowCaptionEndEllipsis;
Multiline := {True; //}not EndEllipsis and not CaptionAutoWidth and Adapter.RowCaptionAutoHeight;
TextAlignX := TextAlignXMap[ACardRow.CaptionAlignmentHorz];
if Multiline then
TextAlignY := TextAlignYMap[ACardRow.CaptionAlignmentVert]
else
TextAlignY := taTop;
end;
AnItem.Text := ACardRow.Caption + Adapter.CaptionSeparator;
end;
procedure TdxGridCardViewFormatter.DoReportLinkInitializeCardRowCaption(AnItem: TdxReportCellText;
ACardRow: TcxGridCardViewRow; AGridCard: TcxGridCard);
begin
ReportLink.DoInitializeCardRowCaptionCell(Adapter.GridView, AGridCard, ACardRow, TdxReportCellString(AnItem));
end;
function TdxGridCardViewFormatter.GetCardRowCaptionClass(ACardRow: TcxGridCardViewRow): TdxReportCellTextClass;
begin
Result := TdxReportCellString;
end;
function TdxGridCardViewFormatter.GetCardRowCaptionViewParams(ARecord: TcxCustomGridRecord;
ACardRow: TcxGridCardViewRow): TdxReportItemViewParams;
begin
if ReportLink.OptionsFormatting.UseNativeStyles then
if ACardRow.Kind = rkData then
ReportLink.Styles.GetCardRowCaptionParams(ARecord, ACardRow, Result.NativeParams)
else
if CanProcessSelectionStyle(ARecord) then
ReportLink.Styles.GetSelectionParams(Result.NativeParams)
else
ReportLink.Styles.GetCardCaptionRowParams(ARecord, ACardRow, Result.NativeParams)
else
if (ACardRow.Kind = rkCaption) and CanProcessSelectionStyle(ARecord) then
Result.NativeParams := Adapter.GetSelectionViewParams
else
Result.NativeParams := Adapter.GetRowCaptionViewParams(ARecord, ACardRow);
// v.3.1 - because of fact that each Card in Grid v.5 might has different number of Rows,
// CellSides initialization was moved inside ReportCard
Result.CellSides := [];
Result.FontStyle := [];
Result.Transparent := IsColorTransparent(Result.NativeParams.Color); // ReportLink.FixedTransparent
end;
procedure TdxGridCardViewFormatter.DoReportLinkInitializeCardRowData(AnItem: TAbstractdxReportCellData;
ACardRow: TcxGridCardViewRow; AGridCard: TcxGridCard);
begin
ReportLink.DoInitializeCardRowDataCell(Adapter.GridView, AGridCard, ACardRow, TdxReportCellString(AnItem));
end;
function TdxGridCardViewFormatter.GetItemViewParams(ATableItem: TcxCustomGridTableItem;
ARecord: TcxCustomGridRecord; AnIsPreview: Boolean = False): TdxReportItemViewParams;
var
CardRow: TcxGridCardViewRow;
begin
CardRow := TcxGridCardViewRow(ATableItem);
if ReportLink.OptionsFormatting.UseNativeStyles then
if CardRow.Kind = rkData then
ReportLink.Styles.GetContentParams(ARecord, CardRow, Result.NativeParams)
else
if CanProcessSelectionStyle(ARecord) then
ReportLink.Styles.GetSelectionParams(Result.NativeParams)
else
ReportLink.Styles.GetCardCaptionRowParams(ARecord, CardRow, Result.NativeParams)
else
if CardRow.Kind = rkData then
Result := inherited GetItemViewParams(ATableItem, ARecord, AnIsPreview)
else
if CanProcessSelectionStyle(ARecord) then
Result.NativeParams := Adapter.GetSelectionViewParams
else
Result.NativeParams := Adapter.GetCaptionRowViewParams(ARecord, CardRow);
// v.3.1 - because fact that each Card in Grid v.5 might has different number of Rows,
// CellSides initialization was moved inside ReportCard
Result.CellSides := [];
Result.FontStyle := [];
Result.Transparent := IsColorTransparent(Result.NativeParams.Color); // ReportLink.FixedTransparent
end;
procedure TdxGridCardViewFormatter.AddHorizontalDelimiters;
var
I: Integer;
begin
for I := 0 to Builder.CardCount - 1 do
ReportLink.AddHorizontalDelimiter(Builder.Cards[I].AbsoluteRect.Right);
end;
procedure TdxGridCardViewFormatter.AddVerticalDelimiters;
var
I: Integer;
begin
if NeedDelimitByRows then
begin
for I := 0 to Builder.CardCount - 1 do
Builder.Cards[I].AddVerticalDelimiters;
end
else
inherited;
end;
function TdxGridCardViewFormatter.GetViewWidth: Integer;
var
MasterBuilder: TdxCustomGridViewBuilder;
begin
MasterBuilder := Builder.MasterBuilder;
if MasterBuilder <> nil then
begin
Result := MasterBuilder.Formatter.ViewWidth - MasterBuilder.Adapter.ViewWidthExtra;
if HasDetailsSeparator then
Dec(Result, 2 * DetailsSeparatorThickness);
end
else
begin
Result := SiteWidth;
if HasDetailsSeparator then
Dec(Result, 2 * DetailsSeparatorThickness);
if Result < Builder.MaxCardWidth + FirstCardOffset then
Result := Builder.MaxCardWidth + FirstCardOffset;
end;
end;
function TdxGridCardViewFormatter.MapStyleBackgroundBitmapIndex(AGridBackgroundBitmapIndex: Integer): Integer;
begin
case AGridBackgroundBitmapIndex of
bbCaptionRow:
Result := vspsGridCardCaptionRow;
bbRowCaption:
Result := vspsGridCardRowCaption;
else
Result := 0;
end;
if Result = 0 then
Result := inherited MapStyleBackgroundBitmapIndex(AGridBackgroundBitmapIndex);
end;
function TdxGridCardViewFormatter.GetContentBackgroundBitmapStyleIndex(ATableItem: TcxCustomGridTableItem): Integer;
const
BackgroundBitmapIndexes: array[TcxGridCardViewRowKind] of Integer =
(bbContent, bbCaptionRow{$IFDEF GRID6}, bbCaptionRow{$ENDIF});
begin
Result := BackgroundBitmapIndexes[TcxGridCardViewRow(ATableItem).Kind];
end;
function TdxGridCardViewFormatter.NeedDelimitByRows: Boolean;
{var
I: Integer;}
begin
Result := False;
{if MasterBuilder = nil then
for I := 0 to Builder.CardCount - 1 do
if Builder.Cards[I].Height > SiteHeight then
begin
Result := True;
Exit;
end;}
end;
function TdxGridCardViewFormatter.GetAutoWidth: Boolean;
begin
Result := ReportLink.OptionsCards.AutoWidth;
end;
function TdxGridCardViewFormatter.GetCaptionAutoWidth: Boolean;
begin
Result := Adapter.CardCaptionWidth = 0;
end;
function TdxGridCardViewFormatter.GetCard(Index: Integer): TcxGridCard;
begin
Result := TcxGridCard(Records[Index]);
end;
function TdxGridCardViewFormatter.GetCardCount: Integer;
begin
Result := RecordCount;
end;
function TdxGridCardViewFormatter.GetCardsAreaWidth: Integer;
begin
Result := ViewWidth - FirstCardOffset;
end;
function TdxGridCardViewFormatter.GetInterCardsSpaceHorz: Integer;
begin
Result := ReportLink.OptionsCards.InterCardsSpaceHorz;
end;
function TdxGridCardViewFormatter.GetInterCardsSpaceVert: Integer;
begin
Result := ReportLink.OptionsCards.InterCardsSpaceVert;
end;
function TdxGridCardViewFormatter.GetKeepSameHeight: Boolean;
begin
Result := ReportLink.OptionsCards.KeepSameHeight;
end;
function TdxGridCardViewFormatter.GetKeepSameWidth: Boolean;
begin
Result := ReportLink.OptionsCards.KeepSameWidth;
end;
function TdxGridCardViewFormatter.GetRowAutoHeight: Boolean;
begin
Result := Adapter.RowAutoHeight;
end;
{ TdxReportCardRow }
constructor TdxReportCardRow.CreateEx(AParent: TdxReportCell; AGridCardRow: TcxGridCardViewRow);
begin
inherited Create(AParent);
CellSides := [];
Data := Integer(AGridCardRow);
Width := Card.RowsAvailableWidth;
end;
function TdxReportCardRow.MeasureHeight(DC: HDC; ACalculateLineHeight: Boolean;
ABuilder: TdxGridCardViewBuilder): Integer;
function MeasureCaptionHeight: Integer;
begin
Result := DefaultDataRowLineHeight;
if HasCaption then
if ACalculateLineHeight then
Result := RowCaption.MeasureFontHeight(DC)
else
Result := RowCaption.MeasureContentHeight(DC);
if Result < DefaultDataRowLineHeight then
Result := DefaultDataRowLineHeight;
end;
function MeasureDataHeight: Integer;
var
MinHeight: Integer;
begin
MinHeight := RowData.MeasureFontHeight(DC);
if not ACalculateLineHeight then
begin
Result := RowData.MeasureContentHeight(DC);
if Result = 0 then
Result := MinHeight;
end
else
Result := MinHeight;
ABuilder.DoGetCellHeight(Card.GridCard, GridCardRow, Result);
if Result < MinHeight then
Result := MinHeight;
end;
begin
Result := Max(MeasureCaptionHeight, MeasureDataHeight);
end;
function TdxReportCardRow.MeasureCaptionWidth(DC: HDC): Integer;
begin
if HasCaption then
Result := RowCaption.MeasureContentWidth(DC) + 2
else
Result := 0;
end;
function TdxReportCardRow.MeasureDataWidth(DC: HDC): Integer;
begin
if dxPSDataMaps.DoesItemParticipateInAutoWidthCalculation(Properties) then
Result := RowData.MeasureContentWidth(DC) + 2
else
Result := 0;
end;
procedure TdxReportCardRow.AdjustCellSides;
var
ReportLink: TdxGridReportLink;
Sides: TdxCellSides;
begin
ReportLink := Card.ReportLink;
if ReportLink.OptionsCards.Borders then
begin
Sides := [];
if IsFirstItem then Include(Sides, csTop);
if IsLastItem then Include(Sides, csBottom);
if HasCaption then
begin
RowCaption.CellSides := RowCaption.CellSides + Sides;
RowCaption.CellSides := RowCaption.CellSides + [csLeft];
end;
RowData.CellSides := RowData.CellSides + Sides;
RowData.CellSides := RowData.CellSides + [csRight];
if not HasCaption then
RowData.CellSides := RowData.CellSides + [csLeft];
end;
if ReportLink.OptionsCards.RowBordersHorz then
begin
Sides := [];
if not IsFirstItem then Include(Sides, csTop);
if not IsLastItem then Include(Sides, csBottom);
if HasCaption then
RowCaption.CellSides := RowCaption.CellSides + Sides;
RowData.CellSides := RowData.CellSides + Sides;
end;
if ReportLink.OptionsCards.RowBordersVert then
if HasCaption then
begin
RowCaption.CellSides := RowCaption.CellSides + [csRight];
RowData.CellSides := RowData.CellSides + [csLeft];
end;
end;
procedure TdxReportCardRow.CreateItems(ABuilder: TdxGridCardViewBuilder);
const
InitialCaptionWidth = 100;
function HasRowCaption: Boolean;
begin
Result := ABuilder.Adapter.ShowRowCaption[Index];
end;
procedure CreateRowCaption;
var
RowCaption: TdxReportCellText;
begin
RowCaption := ABuilder.Formatter.GetCardRowCaptionClass(GridCardRow).Create(Self);
RowCaption.Width := InitialCaptionWidth;
RowCaption.Height := Height;
RowCaption.Data := Integer(TdxGridCardRowCaption);
ABuilder.Formatter.DoInitializeCardRowCaption(RowCaption, GridCardRow, Card.GridCard);
ABuilder.Formatter.DoReportLinkInitializeCardRowCaption(RowCaption, GridCardRow, Card.GridCard);
end;
procedure CreateRowData;
var
RowData: TAbstractdxReportCellData;
begin
RowData := ABuilder.Formatter.GetItemClass(GridCardRow, Card.GridCard, False).Create(Self);
if HasRowCaption then
RowData.Left := InitialCaptionWidth
else
RowData.Left := 0;
RowData.Width := Parent.Width - Left;
RowData.Height := DefaultDataRowLineHeight;
ABuilder.Formatter.DoInitializeItem(RowData, GridCardRow, Card.GridCard, False);
ABuilder.Formatter.DoReportLinkInitializeCardRowData(RowData, GridCardRow, Card.GridCard);
end;
begin
if HasRowCaption then CreateRowCaption;
CreateRowData;
Width := Width;
Height := Height;
end;
function TdxReportCardRow.GetCard: TdxReportCard;
begin
Result := TdxReportCard(Parent);
end;
function TdxReportCardRow.GetGridCardRow: TcxGridCardViewRow;
begin
Result := TcxGridCardViewRow(Data);
end;
function TdxReportCardRow.GetHasCaption: Boolean;
begin
Result := (DataItemCount > 1) or ((DataItemCount = 1) and (CellCount > 0));
end;
function TdxReportCardRow.GetHeight: Integer;
begin
Result := inherited Height;
end;
function TdxReportCardRow.GetProperties: TcxCustomEditProperties;
begin
Result := GridCardRow.GetProperties;
end;
function TdxReportCardRow.GetRowCaption: TdxReportCellText;
begin
if HasCaption then
Result := DataItems[0] as TdxReportCellText
else
Result := nil;
end;
function TdxReportCardRow.GetRowData: TAbstractdxReportCellData;
begin
if CellCount > 0 then
Result := TAbstractdxReportCellData(Cells[0])
else
begin
if DataItemCount > 0 then
Result := DataItems[DataItemCount - 1]
else
Result := nil;
end;
end;
function TdxReportCardRow.GetWidth: Integer;
begin
Result := inherited Width;
end;
procedure TdxReportCardRow.SetHeight(Value: Integer);
begin
inherited Height := Value;
if HasCaption then RowCaption.Height := Height;
RowData.Height := Height;
end;
procedure TdxReportCardRow.SetRowCaptionWidth(Value: Integer);
begin
if HasCaption then
begin
RowCaption.Width := Value;
RowData.Left := Value;
RowData.Width := Width - Value;
if RowCaption.Width >= Width then
RowCaption.CellSides := RowCaption.CellSides + [csRight];
end;
end;
procedure TdxReportCardRow.SetWidth(Value: Integer);
begin
inherited Width := Value;
if RowCaption <> nil then
if RowCaption.Width > Width then RowCaption.Width := Width;
if RowData <> nil then
begin
if RowData.Left > Width then RowData.Left := Width;
RowData.Width := Width - RowData.Left;
end;
end;
{ TdxCardBorderPainter }
function TdxCardBorderPainter.Card: TdxReportCard;
begin
Result := inherited Item as TdxReportCard;
end;
procedure TdxCardBorderPainter.Paint(DC: HDC);
begin
if Card.HasShadow then DrawShadow(DC);
end;
procedure TdxCardBorderPainter.DrawShadow(DC: HDC);
begin
Renderer.FillRect(DC, Card.ShadowRectHorz, Card.ShadowColor);
Renderer.FillRect(DC, Card.ShadowRectVert, Card.ShadowColor);
end;
{ TdxReportCard }
constructor TdxReportCard.Create(AParent: TdxReportCell);
begin
inherited;
ShadowColor := clBlack;
ShadowDepth := dxDefaultCardsShadowDepth;
ShadowPosition := cspBottomRight;
end;
constructor TdxReportCard.CreateEx(AParent: TdxReportCell; AGridCard: TcxGridCard);
begin
Create(AParent);
Data := Integer(AGridCard);
end;
function TdxReportCard.GetBorderOuterBounds(DC: HDC): TRect;
begin
Result := inherited GetBorderBounds(DC);
with Result do
case ShadowPosition of
cspTopLeft:
begin
Inc(Left, ShadowDepth);
Inc(Top, ShadowDepth);
end;
cspTopRight:
begin
Dec(Right, ShadowDepth);
Inc(Top, ShadowDepth);
end;
cspBottomRight:
begin
Dec(Right, ShadowDepth);
Dec(Bottom, ShadowDepth);
end;
cspBottomLeft:
begin
Inc(Left, ShadowDepth);
Dec(Bottom, ShadowDepth);
end;
end;
end;
function TdxReportCard.IndexOfCardRow(ACardRow: TcxGridCardViewRow): Integer;
begin
for Result := 0 to CellCount - 1 do
if Rows[Result].GridCardRow = ACardRow then Exit;
Result := -1;
end;
procedure TdxReportCard.AdjustHeight;
var
TotalHeight, I: Integer;
begin
TotalHeight := 0;
for I := 0 to RowCount - 1 do
Inc(TotalHeight, RowHeights[I]);
Height := TotalHeight;
end;
procedure TdxReportCard.AdjustRowsCellSides;
var
I: Integer;
begin
for I := 0 to RowCount - 1 do
Rows[I].AdjustCellSides;
end;
procedure TdxReportCard.AdjustRowsPos;
var
I: Integer;
begin
for I := 0 to RowCount - 1 do
with Rows[I] do
begin
Left := RowsOriginLeft;
Top := Top + RowsOriginTop;
end;
end;
procedure TdxReportCard.AdjustRowsHeight(DC: HDC; AAutoHeight: Boolean;
ABuilder: TdxGridCardViewBuilder);
var
I: Integer;
begin
for I := 0 to RowCount - 1 do
RowHeights[I] := Rows[I].MeasureHeight(DC, not AAutoHeight, ABuilder);
end;
procedure TdxReportCard.AdjustRowsWidth(DC: HDC);
begin
Width := RowCaptionWidth + MeasureDataWidth(DC);
end;
function TdxReportCard.MeasureCaptionWidth(DC: HDC): Integer;
var
I, V: Integer;
begin
Result := 0;
for I := 0 to RowCount - 1 do
begin
V := Rows[I].MeasureCaptionWidth(DC);
if V > Result then Result := V;
end;
end;
function TdxReportCard.MeasureDataWidth(DC: HDC): Integer;
var
I, V: Integer;
begin
Result := 0;
for I := 0 to RowCount - 1 do
begin
V := Rows[I].MeasureDataWidth(DC);
if V > Result then Result := V;
end;
end;
procedure TdxReportCard.AddVerticalDelimiters;
var
I: Integer;
begin
for I := 0 to RowCount - 1 do
ReportLink.AddVerticalDelimiter(Rows[I]);
end;
procedure TdxReportCard.ConvertCoords(APixelsNumerator, APixelsDenominator: Integer);
begin
inherited;
FShadowDepth := MulDiv(FShadowDepth, APixelsNumerator, APixelsDenominator);
end;
procedure TdxReportCard.CreateRows(ABuilder: TdxGridCardViewBuilder);
var
I: Integer;
List: TList;
CardRow: TdxReportCardRow;
begin
List := TList.Create;
try
ABuilder.Adapter.GetVisibleCardRows(GridCard, List);
AllocateSpaceForCells(List.Count);
for I := 0 to List.Count - 1 do
begin
CardRow := TdxReportCardRow.CreateEx(Self, TcxGridCardViewRow(List[I]));
CardRow.CreateItems(ABuilder);
end;
finally
List.Free;
end;
end;
function TdxReportCard.GetBorderPainterClass: TdxPSCellBorderPainterClass;
begin
Result := TdxCardBorderPainter;
end;
procedure TdxReportCard.ReadProperties(AReader: TdxPSDataReader);
begin
inherited;
with AReader do
begin
FRowCaptionWidth := ReadInteger;
FShadowColor := ReadInteger;
FShadowDepth := ReadInteger;
FShadowPosition := TdxGridCardShadowPosition(ReadInteger);
end;
end;
procedure TdxReportCard.WriteProperties(AWriter: TdxPSDataWriter);
begin
inherited;
with AWriter do
begin
WriteInteger(RowCaptionWidth);
WriteInteger(ShadowColor);
WriteInteger(ShadowDepth);
WriteInteger(Integer(ShadowPosition));
end;
end;
function TdxReportCard.GetGridCard: TcxGridCard;
begin
Result := TcxGridCard(Data);
end;
function TdxReportCard.GetHasShadow: Boolean;
begin
Result := ShadowDepth > 0;
end;
function TdxReportCard.GetHeight: Integer;
begin
Result := inherited Height;
end;
function TdxReportCard.GetRowCount: Integer;
begin
Result := CellCount;
end;
function TdxReportCard.GetReportLink: TdxGridReportLink;
begin
Result := TdxGridReportLink(ReportCells.ReportLink);
end;
function TdxReportCard.GetRow(Index: Integer): TdxReportCardRow;
begin
Result := Cells[Index] as TdxReportCardRow;
end;
function TdxReportCard.GetRowByCardRow(CardRow: TcxGridCardViewRow): TdxReportCardRow;
begin
Result := Rows[IndexOfCardRow(CardRow)];
end;
function TdxReportCard.GetRowHeight(Index: Integer): Integer;
begin
Result := Rows[Index].Height;
end;
function TdxReportCard.GetRowsAvailableHeight: Integer;
begin
Result := Height - ShadowDepth;
end;
function TdxReportCard.GetRowsAvailableWidth: Integer;
begin
Result := Width - ShadowDepth;
end;
function TdxReportCard.GetRowsOriginLeft: Integer;
begin
if ShadowPosition in [cspTopLeft, cspBottomLeft] then
Result := ShadowDepth
else
Result := 0;
end;
function TdxReportCard.GetRowsOriginTop: Integer;
begin
if ShadowPosition in [cspTopLeft, cspTopRight] then
Result := ShadowDepth
else
Result := 0;
end;
function TdxReportCard.GetShadowRectHorz: TRect;
begin
Result := BoundsRect;
OffsetRect(Result, -Result.Left, -Result.Top);
with Result do
case ShadowPosition of
cspTopLeft:
begin
Right := Right - ShadowDepth;
Bottom := Top + ShadowDepth;
end;
cspTopRight:
begin
Left := Left + ShadowDepth;
Bottom := Top + ShadowDepth;
end;
cspBottomRight:
begin
Left := Left + ShadowDepth;
Top := Bottom - ShadowDepth;
end;
cspBottomLeft:
begin
Right := Right - ShadowDepth;
Top := Bottom - ShadowDepth;
end;
end;
end;
function TdxReportCard.GetShadowRectVert: TRect;
begin
Result := BoundsRect;
OffsetRect(Result, -Result.Left, -Result.Top);
with Result do
case ShadowPosition of
cspTopLeft:
begin
Right := Left + ShadowDepth;
Top := Top + ShadowDepth;
Bottom := Bottom - ShadowDepth;
end;
cspTopRight:
begin
Left := Right - ShadowDepth;
Top := Top + ShadowDepth;
Bottom := Bottom - ShadowDepth;
end;
cspBottomRight:
begin
Left := Right - ShadowDepth;
Top := Top + ShadowDepth;
Bottom := Bottom - ShadowDepth;
end;
cspBottomLeft:
begin
Right := Left + ShadowDepth;
Top := Top + ShadowDepth;
Bottom := Bottom - ShadowDepth;
end;
end;
end;
function TdxReportCard.GetWidth: Integer;
begin
Result := inherited Width;
end;
procedure TdxReportCard.SetHeight(Value: Integer);
begin
inherited Height := Value + ShadowDepth;
end;
procedure TdxReportCard.SetRowCaptionWidth(Value: Integer);
var
I: Integer;
begin
if Value < 0 then Value := 0;
FRowCaptionWidth := Value;
for I := 0 to RowCount - 1 do
Rows[I].RowCaptionWidth := Value;
end;
procedure TdxReportCard.SetRowHeight(Index, Value: Integer);
var
Delta, I: Integer;
begin
if Value < 0 then Value := 0;
Delta := Value - Rows[Index].Height;
Rows[Index].Height := Value;
for I := Index + 1 to RowCount - 1 do
Rows[I].Top := Rows[I].Top + Delta;
end;
procedure TdxReportCard.SetShadowDepth2(Value: Integer);
var
SaveWidth, SaveHeight: Integer;
begin
if FShadowDepth <> Value then
begin
SaveHeight := RowsAvailableHeight;
SaveWidth := RowsAvailableWidth;
FShadowDepth := Value;
Height := SaveHeight;
Width := SaveWidth;
end;
end;
procedure TdxReportCard.SetWidth(Value: Integer);
var
I: Integer;
begin
inherited Width := Value + ShadowDepth;
for I := 0 to RowCount - 1 do
Rows[I].Width := RowsAvailableWidth;
end;
{ TdxGridCardViewBuilder }
constructor TdxGridCardViewBuilder.Create(AReportLink: TdxGridReportLink;
AMasterBuilder: TdxCustomGridViewBuilder; AGridView: TcxCustomGridView);
begin
inherited;
FCards := TList.Create;
end;
destructor TdxGridCardViewBuilder.Destroy;
begin
FreeAndNil(FCards);
inherited;
end;
function TdxGridCardViewBuilder.Adapter: TdxGridCardViewAdapter;
begin
Result := inherited Adapter as TdxGridCardViewAdapter;
end;
class function TdxGridCardViewBuilder.AdapterClass: TdxGridViewAdapterClass;
begin
Result := TdxGridCardViewAdapter;
end;
function TdxGridCardViewBuilder.Formatter: TdxGridCardViewFormatter;
begin
Result := inherited Formatter as TdxGridCardViewFormatter;
end;
class function TdxGridCardViewBuilder.FormatterClass: TdxGridViewFormatterClass;
begin
Result := TdxGridCardViewFormatter;
end;
procedure TdxGridCardViewBuilder.DoBuildViewBody;
begin
CreateCards;
if not IsAborted then
begin
ResizeCards;
PlaceCards;
AdjustCardRowsCellSides;
end;
end;
procedure TdxGridCardViewBuilder.AdjustCardRowsCellSides;
var
I: Integer;
begin
for I := 0 to CardCount - 1 do
Cards[I].AdjustRowsCellSides;
end;
procedure TdxGridCardViewBuilder.CreateCards;
var
Producer: TdxGridCardViewCardsRowProducer;
I: Integer;
begin
Producer := GetCardsRowProducer;
FCards.Count := Formatter.CardCount;
for I := 0 to CardCount - 1 do
begin
FCards[I] := Producer.CreateCard(Host, Formatter.Cards[I]);
if MasterBuilder = nil then
begin
Progress(100 * (I + 1) / Formatter.CardCount);
if IsAborted then Break;
end;
end;
end;
procedure TdxGridCardViewBuilder.PlaceCards;
procedure MakeRowIndexes(AnIndexes: TList);
var
I, PlaceWidth, EntryNumber: Integer;
begin
I := 0;
if CardCount > 0 then AnIndexes.Add(TObject(0));
while I < CardCount do
begin
PlaceWidth := Formatter.CardsAreaWidth;
EntryNumber := 0;
repeat
Inc(EntryNumber);
if EntryNumber > 1 then
Dec(PlaceWidth, Formatter.InterCardsSpaceHorz);
Dec(PlaceWidth, Cards[I].Width);
if (PlaceWidth >= 0) or (EntryNumber = 1) then
Inc(I);
until (PlaceWidth <= 0) or (I >= CardCount);
AnIndexes.Add(TObject(I));
end;
end;
procedure MakeRows(AIndexes: TList; AProducer: TdxGridCardViewCardsRowProducer);
function GetMaxCardHeight(AStartIndex, AEndIndex: Integer): Integer;
var
I, V: Integer;
begin
Result := Cards[AStartIndex].Height;
{$IFNDEF DXVER500}
if not Formatter.KeepSameHeight then
{$ENDIF}
for I := AStartIndex + 1 to AEndIndex do
begin
V := Cards[I].Height;
if Result < V then Result := V;
end;
end;
var
RowIndex, StartIndex, EndIndex, I, RowHeight: Integer;
ReportRow: TdxReportCell;
begin
for RowIndex := 0 to AIndexes.Count - 2 do
begin
StartIndex := Integer(AIndexes[RowIndex]);
EndIndex := Integer(AIndexes[RowIndex + 1]) - 1;
RowHeight := GetMaxCardHeight(StartIndex, EndIndex) + Formatter.InterCardsSpaceHorz;
ReportRow := AProducer.Produce(HostInfoServices.PageDetailsHostInfo, RowHeight);
AddReportRow(ReportRow);
for I := StartIndex to EndIndex do
AProducer.InjectCard(Cards[I], I - StartIndex);
end;
end;
var
Indexes: TList;
begin
Indexes := TList.Create;
try
MakeRowIndexes(Indexes);
MakeRows(Indexes, GetCardsRowProducer);
finally
Indexes.Free;
end;
end;
procedure TdxGridCardViewBuilder.ResizeCards;
procedure SetCardsRowCaptionWidth(DC: HDC);
var
RowCaptionWidth, I, V: Integer;
begin
if Formatter.CaptionAutoWidth then
begin
RowCaptionWidth := 0;
for I := 0 to CardCount - 1 do
begin
V := Cards[I].MeasureCaptionWidth(DC);
if V > RowCaptionWidth then RowCaptionWidth := V;
end;
end
else
RowCaptionWidth := Adapter.CardCaptionWidth;
if (RowCaptionWidth > Adapter.CardWidth) and not Formatter.AutoWidth then
RowCaptionWidth := Adapter.CardWidth;
for I := 0 to CardCount - 1 do
Cards[I].RowCaptionWidth := RowCaptionWidth;
end;
procedure CalcMaxCardWidth;
var
I, V: Integer;
begin
FMaxCardWidth := 0;
for I := 0 to CardCount - 1 do
begin
V := Cards[I].Width;
if V > FMaxCardWidth then FMaxCardWidth := V;
end;
end;
procedure SetCardsAutoWidth(DC: HDC);
var
I: Integer;
begin
for I := 0 to CardCount - 1 do
Cards[I].AdjustRowsWidth(DC);
end;
procedure SetSameCardsWidth(AWidth: Integer);
var
I: Integer;
begin
for I := 0 to CardCount - 1 do
Cards[I].Width := AWidth;
end;
procedure SetCardsRowHeight(DC: HDC; AAutoHeight: Boolean);
var
I: Integer;
begin
for I := 0 to CardCount - 1 do
Cards[I].AdjustRowsHeight(DC, AAutoHeight, Self);
end;
procedure SetCardsSameHeights;
var
CardRowHeights: array of Integer;
I, J, RowIndex: Integer;
Card: TdxReportCard;
Row: TdxReportCardRow;
begin
SetLength(CardRowHeights, Adapter.CardRowCount);
for I := 0 to CardCount - 1 do
begin
Card := Cards[I];
for J := 0 to Card.RowCount - 1 do
begin
Row := Card.Rows[J];
RowIndex := Row.GridCardRow.VisibleIndex;
if CardRowHeights[RowIndex] < Row.Height then
CardRowHeights[RowIndex] := Row.Height;
end;
end;
for I := 0 to CardCount - 1 do
begin
Card := Cards[I];
for J := 0 to Card.RowCount - 1 do
begin
RowIndex := Card.Rows[J].GridCardRow.VisibleIndex;
Card.RowHeights[J] := CardRowHeights[RowIndex];
end;
end;
end;
procedure AdjustCards;
var
I: Integer;
begin
for I := 0 to CardCount - 1 do
with Cards[I] do
begin
AdjustHeight;
AdjustRowsPos;
end;
end;
begin
FMaxCardWidth := 0;
SetCardsRowCaptionWidth(Formatter.DC);
if Formatter.AutoWidth then
begin
SetCardsAutoWidth(Formatter.DC);
CalcMaxCardWidth;
if Formatter.KeepSameWidth then SetSameCardsWidth(FMaxCardWidth - 4);
end;
CalcMaxCardWidth;
SetCardsRowHeight(Formatter.DC, Formatter.RowAutoHeight);
if Formatter.KeepSameHeight then SetCardsSameHeights;
AdjustCards;
end;
function TdxGridCardViewBuilder.GetCardsRowProducer: TdxGridCardViewCardsRowProducer;
begin
Result := ProducerCache[GetCardsRowProducerClass] as TdxGridCardViewCardsRowProducer;
end;
function TdxGridCardViewBuilder.GetCardsRowProducerClass: TdxGridCardViewCardsRowProducerClass;
begin
Result := TdxGridCardViewCardsRowProducer;
end;
function TdxGridCardViewBuilder.GridView: TcxGridCardView;
begin
Result := inherited GridView as TcxGridCardView;
end;
class function TdxGridCardViewBuilder.GridViewClass: TcxCustomGridViewClass;
begin
Result := TcxGridCardView;
end;
function TdxGridCardViewBuilder.GetCard(Index: Integer): TdxReportCard;
begin
Result := TdxReportCard(FCards[Index]);
end;
function TdxGridCardViewBuilder.GetCardCount: Integer;
begin
Result := FCards.Count;
end;
{ TdxGridDBCardViewAdapter }
function TdxGridDBCardViewAdapter.GridView: TcxGridDBCardView;
begin
Result := inherited GridView as TcxGridDBCardView;
end;
class function TdxGridDBCardViewAdapter.GridViewClass: TcxCustomGridViewClass;
begin
Result := TcxGridCardView;
end;
procedure TdxGridDBCardViewAdapter.AfterBuilding;
begin
UnloadAllRecords;
inherited;
end;
procedure TdxGridDBCardViewAdapter.BeforeBuilding;
begin
inherited;
LoadAllRecords;
end;
function TdxGridDBCardViewAdapter.DataController: TcxGridDBDataController;
begin
Result := TcxGridDBDataController(inherited DataController);
end;
function TdxGridDBCardViewAdapter.DBDataModeController: TcxDBDataModeController;
begin
Result := DataController.DataModeController;
end;
procedure TdxGridDBCardViewAdapter.LoadAllRecords;
begin
_LoadAllRecords(DBDataModeController, FPrevAllRecordsAreLoaded);
end;
procedure TdxGridDBCardViewAdapter.UnloadAllRecords;
begin
_UnloadAllRecords(DBDataModeController, FPrevAllRecordsAreLoaded);
end;
{ TdxGridDBCardViewBuilder }
function TdxGridDBCardViewBuilder.Adapter: TdxGridDBCardViewAdapter;
begin
Result := inherited Adapter as TdxGridDBCardViewAdapter;
end;
class function TdxGridDBCardViewBuilder.AdapterClass: TdxGridViewAdapterClass;
begin
Result := TdxGridDBCardViewAdapter;
end;
{$IFDEF CHARTVIEW}
{ TdxGridChartViewAdapter }
function TdxGridChartViewAdapter.GridView: TcxGridChartView;
begin
Result := inherited GridView as TcxGridChartView;
end;
class function TdxGridChartViewAdapter.GridViewClass: TcxCustomGridViewClass;
begin
Result := TcxGridChartView;
end;
function TdxGridChartViewAdapter.CreateGraphic(AGraphicClass: TGraphicClass;
AWidth: Integer): TGraphic;
var
AGraphic: TGraphic;
begin
if not (AGraphicClass.InheritsFrom(TBitmap) or AGraphicClass.InheritsFrom(TMetaFile)) then
begin
Result := GridView.CreateImage(TBitmap, Max(AWidth, 0), 0);
AGraphic := AGraphicClass.Create;
try
AGraphic.Assign(Result);
finally
Result.Free;
Result := AGraphic;
end;
end
else
Result := GridView.CreateImage(AGraphicClass, Max(AWidth, 0), 0);
end;
function TdxGridChartViewAdapter.GetCanUseOnEveryPageMode: Boolean;
begin
Result := True;
end;
{ TdxGridChartViewFormatter }
function TdxGridChartViewFormatter.Adapter: TdxGridChartViewAdapter;
begin
Result := inherited Adapter as TdxGridChartViewAdapter;
end;
function TdxGridChartViewFormatter.Builder: TdxGridChartViewBuilder;
begin
Result := inherited Builder as TdxGridChartViewBuilder;
end;
function TdxGridChartViewFormatter.CreateChartImage: TGraphic;
function GetWidth: Integer;
begin
if ReportLink.OptionsSize.AutoWidth then
Result := ViewAvailableWidth
else
Result := -1;
end;
begin
Result := Adapter.CreateGraphic(GraphicClass, GetWidth);
end;
procedure TdxGridChartViewFormatter.DoInitializeChartItem(AnItem: TdxReportCellGraphic);
begin
AnItem.ImageBuffering := cibNone;
AnItem.Image.Transparent := GraphicTransparent;
AnItem.ImageTransparent := GraphicTransparent;
AnItem.Center := True;
end;
procedure TdxGridChartViewFormatter.DoReportLinkInitializeChartItem(AnItem: TdxReportCellGraphic);
begin
ReportLink.DoInitializeChartCell(Adapter.GridView, AnItem);
end;
function TdxGridChartViewFormatter.GetChartItemClass: TdxReportCellGraphicClass;
begin
Result := TdxReportCellGraphic;
end;
function TdxGridChartViewFormatter.GetViewWidth: Integer;
begin
Result := ViewAvailableWidth;
end;
function TdxGridChartViewFormatter.GetGraphicClass: TGraphicClass;
begin
Result := ReportLink.OptionsCharts.GraphicClass;
end;
function TdxGridChartViewFormatter.GetGraphicTransparent: Boolean;
begin
Result := ReportLink.OptionsCharts.Transparent;
end;
{ TdxGridChartViewBuilder }
function TdxGridChartViewBuilder.Adapter: TdxGridChartViewAdapter;
begin
Result := inherited Adapter as TdxGridChartViewAdapter;
end;
class function TdxGridChartViewBuilder.AdapterClass: TdxGridViewAdapterClass;
begin
Result := TdxGridChartViewAdapter;
end;
function TdxGridChartViewBuilder.Formatter: TdxGridChartViewFormatter;
begin
Result := inherited Formatter as TdxGridChartViewFormatter;
end;
class function TdxGridChartViewBuilder.FormatterClass: TdxGridViewFormatterClass;
begin
Result := TdxGridChartViewFormatter;
end;
procedure TdxGridChartViewBuilder.DoBuildViewBody;
begin
inherited;
CreateChart;
end;
procedure TdxGridChartViewBuilder.CreateChart;
var
ReportRow: TdxReportCell;
begin
ReportRow := GetChartProducer.Produce(HostInfoServices.PageDetailsHostInfo);
AddReportRow(ReportRow);
end;
function TdxGridChartViewBuilder.GetChartProducer: TdxGridChartViewChartProducer;
begin
Result := ProducerCache[GetChartProducerClass] as TdxGridChartViewChartProducer;
end;
function TdxGridChartViewBuilder.GetChartProducerClass: TdxGridChartViewChartProducerClass;
begin
Result := TdxGridChartViewChartProducer;
end;
function TdxGridChartViewBuilder.GridView: TcxGridChartView;
begin
Result := inherited GridView as TcxGridChartView;
end;
class function TdxGridChartViewBuilder.GridViewClass: TcxCustomGridViewClass;
begin
Result := TcxGridChartView;
end;
{$ENDIF}
{ TdxGridViewRowProducer }
constructor TdxGridViewRowProducer.Create(ABuilder: TdxCustomGridViewBuilder);
begin
inherited Create;
FBuilder := ABuilder;
FMasterIndents := TList.Create;
end;
destructor TdxGridViewRowProducer.Destroy;
begin
FMasterIndents.Free;
inherited;
end;
function TdxGridViewRowProducer.Adapter: TdxCustomGridViewAdapter;
begin
Result := Builder.Adapter;
end;
function TdxGridViewRowProducer.Builder: TdxCustomGridViewBuilder;
begin
Result := FBuilder;
end;
function TdxGridViewRowProducer.Formatter: TdxCustomGridViewFormatter;
begin
Result := Builder.Formatter;
end;
function TdxGridViewRowProducer.Produce(AHostInfo: TdxGridAttributeHostInfo): TdxReportCell;
begin
FMasterIndents.Clear;
CalculateRowHeight;
CreateRowHost(AHostInfo);
CreateRow;
if AutoHeight then
begin
CalculateRowAutoHeight;
FixupRowHeight;
end;
Inc(AHostInfo.Origin.Y, RowHeight);
Result := Host;
end;
procedure TdxGridViewRowProducer.AddLeadingMasterIndentsAndSeparators;
var
LeftPos, I: Integer;
begin
LeftPos := 0;
for I := 0 to Formatter.AbsoluteLevel - 1 do
with MasterBuilders[I] do
begin
AddMasterSeparator(Formatter, Adapter, LeftPos, vdskLeading);
AddMasterIndents(Formatter, Adapter, I, LeftPos);
end;
AddMasterSeparator(Formatter, Adapter, LeftPos, vdskLeading);
end;
procedure TdxGridViewRowProducer.AddMasterIndents(AMasterFormatter: TdxCustomGridViewFormatter;
AMasterAdapter: TdxCustomGridViewAdapter; ALevel: Integer; var ALeftPos: Integer);
var
I: Integer;
Indent: TdxReportCellExpandButton;
begin
for I := 0 to AMasterAdapter.IndentCount - 1 do
begin
Indent := CreateMasterIndent(Host);
Indent.BoundsRect := MakeBounds(ALeftPos, 0, AMasterAdapter.IndentWidth, RowHeight);
InitializeMasterIndent(AMasterFormatter, Indent, I, ALevel);
Inc(ALeftPos, Indent.Width);
end;
end;
procedure TdxGridViewRowProducer.AddMasterSeparator(AMasterFormatter: TdxCustomGridViewFormatter;
AMasterAdapter: TdxCustomGridViewAdapter; var ALeftPos: Integer;
ASeparatorKind: TdxVerticalDetailsSeparatorKind);
var
Separator: TdxReportCellBox;
begin
if AMasterAdapter.HasDetailsSeparator then
begin
Separator := CreateDetailsSeparator(Host);
Separator.BoundsRect := MakeBounds(ALeftPos, 0, AMasterFormatter.DetailsSeparatorThickness, RowHeight);
InitializeDetailsSeparator(AMasterFormatter, Separator, ASeparatorKind);
Inc(ALeftPos, Separator.Width);
end;
end;
procedure TdxGridViewRowProducer.AddTrailingMasterSeparators;
var
LeftPos, I: Integer;
begin
LeftPos := Width - Formatter.ViewWidthExtraAfter;
AddMasterSeparator(Formatter, Adapter, LeftPos, vdskTrailing);
for I := Formatter.AbsoluteLevel - 1 downto 0 do
with Builder.AbsoluteBuilders[I] do
AddMasterSeparator(Formatter, Adapter, LeftPos, vdskTrailing);
end;
function TdxGridViewRowProducer.CalculateItemHeight(DC: HDC; AnItem: TdxReportVisualItem): Integer;
begin
Result := AnItem.MeasureContentHeight(DC);
end;
procedure TdxGridViewRowProducer.CalculateRowAutoHeight;
var
DC: HDC;
ItemsSite: TdxReportCell;
MaxRowHeight, I, V: Integer;
Item: TdxReportVisualItem;
begin
DC := Self.DC;
ItemsSite := Self.ItemsSite;
MaxRowHeight := 0;
for I := 0 to ItemsSite.DataItemCount - 1 do
begin
Item := ItemsSite.DataItems[I];
if DoesItemParticipateInRowAutoHeightCalculation(Item) then
begin
V := CalculateItemHeight(DC, Item);
if MaxRowHeight < V then MaxRowHeight := V;
end;
end;
{3.1}
for I := 0 to ItemsSite.CellCount - 1 do
begin
Item := ItemsSite.Cells[I];
if DoesItemParticipateInRowAutoHeightCalculation(Item) then
begin
V := CalculateItemHeight(DC, Item);
if MaxRowHeight < V then MaxRowHeight := V;
end;
end;
if RowHeight < MaxRowHeight then
RowHeight := MaxRowHeight;
end;
procedure TdxGridViewRowProducer.CalculateRowHeight;
begin
FRowHeight := LineCount * LineHeight;
end;
function TdxGridViewRowProducer.CreateDetailsSeparator(AParent: TdxReportCell): TdxReportCellBox;
begin
Result := GetDetailsSeparatorClass.Create(AParent);
FMasterIndents.Add(Result);
end;
function TdxGridViewRowProducer.CreateMasterIndent(AParent: TdxReportCell): TdxReportCellExpandButton;
begin
Result := GetMasterIndentClass.Create(AParent);
FMasterIndents.Add(Result);
end;
procedure TdxGridViewRowProducer.CreateRow;
begin
FRow := GetRowHostClass.Create(Host);
FRow.BoundsRect := MakeBounds(RowOriginX, 0, RowWidth, RowHeight);
InitializeRow;
AddTrailingMasterSeparators;
end;
procedure TdxGridViewRowProducer.CreateRowHost(const AHostInfo: TdxGridAttributeHostInfo);
begin
FHost := HostClass.Create(AHostInfo.Parent);
FHost.BoundsRect := MakeBounds(AHostInfo.Origin.X, AHostInfo.Origin.Y, Width, RowHeight);
InitializeHost;
AddLeadingMasterIndentsAndSeparators;
end;
function TdxGridViewRowProducer.DoesItemParticipateInRowAutoHeightCalculation(AnItem: TdxReportVisualItem): Boolean;
begin
Result := True;
end;
function TdxGridViewRowProducer.GetDetailsSeparatorClass: TdxReportCellBoxClass;
begin
Result := Formatter.GetDetailsSeparatorClass;
end;
function TdxGridViewRowProducer.GetMasterIndentClass: TdxReportCellExpandButtonClass;
begin
Result := Formatter.GetMasterIndentClass;
end;
procedure TdxGridViewRowProducer.FixupMasterIndentsHeight;
var
I: Integer;
begin
for I := 0 to MasterIndentCount - 1 do
with MasterIndents[I] do
Height := Parent.Height;
end;
procedure TdxGridViewRowProducer.FixupRowDataItemHeight(AnItem: TdxReportVisualItem);
begin
with AnItem do
Height := Parent.Height;
end;
procedure TdxGridViewRowProducer.FixupRowDataHeight;
begin
end;
procedure TdxGridViewRowProducer.FixupRowHeight;
begin
FixupRowOwnHeight;
FixupMasterIndentsHeight;
FixupRowDataHeight;
end;
procedure TdxGridViewRowProducer.FixupRowOwnHeight;
begin
Host.Height := RowHeight;
Row.Height := RowHeight;
ItemsSite.Height := RowHeight;
end;
procedure TdxGridViewRowProducer.InitializeDetailsSeparator(AFormatter: TdxCustomGridViewFormatter;
ASeparator: TdxReportCellBox; ASeparatorKind: TdxVerticalDetailsSeparatorKind);
begin
AFormatter.DoInitializeVertDetailsSeparator(ASeparator, ASeparatorKind);
end;
procedure TdxGridViewRowProducer.InitializeMasterIndent(AFormatter: TdxCustomGridViewFormatter;
AIndent: TdxReportCellExpandButton; AIndex, ALevel: Integer);
begin
AFormatter.DoInitializeMasterIndent(AIndent, AIndex, MasterBuilders[ALevel].Adapter.IndentCount);
end;
procedure TdxGridViewRowProducer.InitializeHost;
begin
Formatter.DoInitializeHost(Host);
end;
procedure TdxGridViewRowProducer.InitializeRow;
begin
end;
function TdxGridViewRowProducer.GetAutoHeight: Boolean;
begin
Result := LineCount = 1;
end;
function TdxGridViewRowProducer.GetItemsSite: TdxReportCell;
begin
Result := Row;
end;
function TdxGridViewRowProducer.GetLineCount: Integer;
begin
Result := 1;
end;
function TdxGridViewRowProducer.GetLineHeight: Integer;
begin
Result := 20;
end;
function TdxGridViewRowProducer.GetDC: HDC;
begin
Result := Formatter.DC;
end;
function TdxGridViewRowProducer.GetHostClass: TdxReportCellClass;
begin
Result := Formatter.GetHostClass;
end;
function TdxGridViewRowProducer.GetIndentWidth: Integer;
begin
Result := Adapter.IndentWidth;
end;
function TdxGridViewRowProducer.GetMasterBuilder(Index: Integer): TdxCustomGridViewBuilder;
begin
Result := Builder.AbsoluteBuilders[Index];
end;
function TdxGridViewRowProducer.GetMasterIndent(Index: Integer): TdxReportCellBox;
begin
Result := TdxReportCellBox(FMasterIndents[Index]);
end;
function TdxGridViewRowProducer.GetMasterIndentCount: Integer;
begin
Result := FMasterIndents.Count;
end;
function TdxGridViewRowProducer.GetRowHostClass: TdxReportCellClass;
begin
Result := Formatter.GetRowHostClass;
end;
function TdxGridViewRowProducer.GetWidth: Integer;
begin
with Formatter do
Result := ViewWidthExtraBefore + ViewWidth + ViewWidthExtraAfter;
end;
function TdxGridViewRowProducer.GetRowOriginX: Integer;
begin
Result := Formatter.ViewWidthExtraBefore;
end;
function TdxGridViewRowProducer.GetRowWidth: Integer;
begin
Result := Formatter.ViewWidth;
end;
{ TdxGridViewCustomRowProducer }
function TdxGridViewCustomRowProducer.Produce(AHostInfo: TdxGridAttributeHostInfo): TdxReportCell;
begin
Result := inherited Produce(AHostInfo);
AddItem;
end;
procedure TdxGridViewCustomRowProducer.AddItem;
begin
FItem := CreateItem(Row);
FItem.BoundsRect := MakeRect(0, 0, RowWidth, RowHeight);
InitializeItem;
end;
function TdxGridViewCustomRowProducer.CreateItem(AParent: TdxReportCell): TAbstractdxReportCellData;
begin
Result := GetItemClass.Create(AParent);
end;
procedure TdxGridViewCustomRowProducer.FixupRowDataHeight;
begin
inherited;
FixupRowDataItemHeight(Item);
end;
procedure TdxGridViewCustomRowProducer.InitializeItem;
begin
end;
function TdxGridViewCustomRowProducer.GetAutoHeight: Boolean;
begin
Result := False;
end;
function TdxGridViewCustomRowProducer.GetItemClass: TdxReportCellDataClass;
begin
Result := TAbstractdxReportCellData;
end;
{ TdxGridViewCaptionProducer }
procedure TdxGridViewCaptionProducer.InitializeItem;
begin
inherited;
Formatter.DoInitializeCaption(Item);
Formatter.DoReportLinkInitializeCaption(Item);
end;
procedure TdxGridViewCaptionProducer.InitializeRow;
begin
inherited;
Formatter.DoInitializeCaptionRow(Row);
end;
function TdxGridViewCaptionProducer.GetItemClass: TdxReportCellDataClass;
begin
Result := Formatter.GetCaptionClass;
end;
function TdxGridViewCaptionProducer.GetLineHeight: Integer;
begin
Result := Formatter.CaptionLineHeight;
end;
function TdxGridViewCaptionProducer.GetItem: TdxReportCellText;
begin
Result := TdxReportCellText(inherited Item);
end;
{ TdxGridViewFilterBarProducer }
procedure TdxGridViewFilterBarProducer.InitializeItem;
begin
inherited;
Formatter.DoInitializeFilterBar(Item);
Formatter.DoReportLinkInitializeFilterBar(Item);
end;
procedure TdxGridViewFilterBarProducer.InitializeRow;
begin
inherited;
Formatter.DoInitializeFilterBarRow(Row);
end;
function TdxGridViewFilterBarProducer.GetItemClass: TdxReportCellDataClass;
begin
Result := Formatter.GetFilterBarClass;
end;
function TdxGridViewFilterBarProducer.GetLineHeight: Integer;
begin
Result := Formatter.FilterBarLineHeight;
end;
function TdxGridViewFilterBarProducer.GetItem: TdxReportCellText;
begin
Result := TdxReportCellText(inherited Item);
end;
{ TdxGridViewDetailsSeparatorProducer }
procedure TdxGridViewDetailsSeparatorProducer.InitializeItem;
begin
inherited;
Formatter.DoInitializeHorzDetailsSeparator(Item);
end;
procedure TdxGridViewDetailsSeparatorProducer.InitializeRow;
begin
inherited;
Formatter.DoInitializeDetailsSeparatorRow(Row);
end;
function TdxGridViewDetailsSeparatorProducer.GetItemClass: TdxReportCellDataClass;
begin
Result := Formatter.GetDetailsSeparatorClass;
end;
function TdxGridViewDetailsSeparatorProducer.GetLineHeight: Integer;
begin
Result := Formatter.DetailsSeparatorThickness;
end;
function TdxGridViewDetailsSeparatorProducer.GetItem: TdxReportCellBox;
begin
Result := TdxReportCellBox(inherited Item);
end;
{ TdxGridViewDetailsTopSeparatorProducer }
procedure TdxGridViewDetailsTopSeparatorProducer.InitializeDetailsSeparator(
AFormatter: TdxCustomGridViewFormatter; ASeparator: TdxReportCellBox;
ASeparatorKind: TdxVerticalDetailsSeparatorKind);
begin
if AFormatter = Formatter then
AFormatter.DoInitializeVertTopDetailsSeparator(ASeparator, ASeparatorKind)
else
inherited;
end;
{ TdxGridViewDetailsBottomSeparatorProducer }
procedure TdxGridViewDetailsBottomSeparatorProducer.InitializeDetailsSeparator(
AFormatter: TdxCustomGridViewFormatter; ASeparator: TdxReportCellBox;
ASeparatorKind: TdxVerticalDetailsSeparatorKind);
begin
if AFormatter = Formatter then
AFormatter.DoInitializeVertBottomDetailsSeparator(ASeparator, ASeparatorKind)
else
inherited;
end;
{ TdxGridViewTerminatorProducer }
procedure TdxGridViewTerminatorProducer.InitializeItem;
begin
inherited;
Formatter.DoInitializeViewTerminator(Item);
end;
function TdxGridViewTerminatorProducer.GetLineHeight: Integer;
begin
Result := 1;
end;
{ TdxGridTableViewRowProducer }
function TdxGridTableViewRowProducer.Adapter: TdxGridTableViewAdapter;
begin
Result := inherited Adapter as TdxGridTableViewAdapter;
end;
function TdxGridTableViewRowProducer.Builder: TdxGridTableViewBuilder;
begin
Result := inherited Builder as TdxGridTableViewBuilder;
end;
function TdxGridTableViewRowProducer.Formatter: TdxGridTableViewFormatter;
begin
Result := Builder.Formatter;
end;
{ TdxGridTableViewRowSubItemsProducer }
constructor TdxGridTableViewRowSubItemsProducer.Create(ABuilder: TdxCustomGridViewBuilder);
begin
inherited;
FIndents := TList.Create;
FSubItems := TList.Create;
end;
destructor TdxGridTableViewRowSubItemsProducer.Destroy;
begin
FreeAndNil(FSubItems);
FreeAndNil(FIndents);
inherited;
end;
function TdxGridTableViewRowSubItemsProducer.Produce(AHostInfo: TdxGridAttributeHostInfo): TdxReportCell;
begin
InitializeIndentList;
InitializeSubItemList;
Result := inherited Produce(AHostInfo);
end;
procedure TdxGridTableViewRowSubItemsProducer.AddIndents(AParent: TdxReportCell);
begin
end;
procedure TdxGridTableViewRowSubItemsProducer.AddSubItems(AParent: TdxReportCell);
var
I: Integer;
Item: TAbstractdxReportCellData;
begin
for I := 0 to GetSubItemCount - 1 do
if HasSubItem[I] then
begin
Item := CreateSubItem(I, AParent);
Item.BoundsRect := SubItemBounds[I]; // needed before item initialization
InitializeSubItem(Item, I);
end;
end;
procedure TdxGridTableViewRowSubItemsProducer.CreateRow;
begin
inherited;
AddIndents(Row);
AddSubItems(Row);
end;
function TdxGridTableViewRowSubItemsProducer.CreateSubItem(AnIndex: Integer;
AParent: TdxReportCell): TAbstractdxReportCellData;
begin
Result := SubItemClasses[AnIndex].Create(AParent);
FSubItems[AnIndex] := Result;
end;
function TdxGridTableViewRowSubItemsProducer.IsItemIndent(AnItem: TdxReportVisualItem): Boolean;
begin
Result := FIndents.IndexOf(AnItem) <> -1;
end;
procedure TdxGridTableViewRowSubItemsProducer.FixupIndentsHeight;
var
I: Integer;
begin
for I := 0 to IndentCount - 1 do
with Indents[I] do
Height := Parent.Height;
end;
procedure TdxGridTableViewRowSubItemsProducer.FixupRowDataHeight;
var
I: Integer;
SubItem: TdxReportVisualItem;
begin
for I := 0 to SubItemCount - 1 do {.SubItemCount}
begin
SubItem := SubItems[I];
if SubItem <> nil then
FixupRowDataItemHeight(SubItem);
end;
end;
procedure TdxGridTableViewRowSubItemsProducer.FixupRowHeight;
begin
inherited;
FixupIndentsHeight;
end;
procedure TdxGridTableViewRowSubItemsProducer.InitializeIndentList;
begin
FIndents.Clear;
FIndents.Count := GetIndentCount;
end;
procedure TdxGridTableViewRowSubItemsProducer.InitializeSubItem(ASubItem: TAbstractdxReportCellData;
AIndex: Integer);
begin
end;
procedure TdxGridTableViewRowSubItemsProducer.InitializeSubItemList;
begin
FSubItems.Clear;
FSubItems.Count := GetSubItemCount;
end;
function TdxGridTableViewRowSubItemsProducer.GetHasSubItem(Index: Integer): Boolean;
begin
Result := True;
end;
function TdxGridTableViewRowSubItemsProducer.GetIndentCount: Integer;
begin
Result := 0;
end;
function TdxGridTableViewRowSubItemsProducer.GetSubItemBound(Index: Integer): TRect;
begin
Result := MakeRect(0, 0, -1, -1);
end;
function TdxGridTableViewRowSubItemsProducer.GetSubItemCount: Integer;
begin
Result := Formatter.ColumnCount;
end;
function TdxGridTableViewRowSubItemsProducer.GetColumn(Index: Integer): TcxGridColumn;
begin
Result := Formatter.Columns[Index];
end;
function TdxGridTableViewRowSubItemsProducer.GetIndent(Index: Integer): TdxReportCellExpandButton;
begin
Result := TdxReportCellExpandButton(FIndents[Index]);
end;
function TdxGridTableViewRowSubItemsProducer.GetSubItem(Index: Integer): TdxReportVisualItem;
begin
Result := TdxReportVisualItem(FSubItems[Index]);
end;
{ TdxGridTableViewHeadersProducer }
procedure TdxGridTableViewHeadersProducer.InitializeRow;
begin
inherited;
Formatter.DoInitializeHeaderRow(Row);
end;
procedure TdxGridTableViewHeadersProducer.InitializeSubItem(ASubItem: TAbstractdxReportCellData;
AIndex: Integer);
begin
inherited;
Formatter.DoInitializeHeaderItem(ASubItem, AIndex);
Formatter.DoReportLinkInitializeHeaderItem(ASubItem, AIndex);
end;
function TdxGridTableViewHeadersProducer.GetAutoHeight: Boolean;
begin
Result := inherited GetAutoHeight and Adapter.HeaderAutoHeight;
end;
function TdxGridTableViewHeadersProducer.GetLineCount: Integer;
begin
Result := Adapter.DetailsLineCount;
end;
function TdxGridTableViewHeadersProducer.GetLineHeight: Integer;
begin
Result := Formatter.HeaderLineHeight;
end;
function TdxGridTableViewHeadersProducer.GetSubItemBound(Index: Integer): TRect;
begin
Result := Formatter.GetHeaderItemBounds(Index);
end;
function TdxGridTableViewHeadersProducer.GetSubItemClass(Index: Integer): TdxReportCellDataClass;
begin
Result := Formatter.GetHeaderItemClass(Index);
end;
{ TdxGridTableViewFootersProducer }
procedure TdxGridTableViewFootersProducer.CalculateRowAutoHeight;
begin
inherited;
Inc(FRowHeight, 2 * FooterItemInflateVert);
end;
procedure TdxGridTableViewFootersProducer.CalculateRowHeight;
begin
if AutoHeight then
inherited
else
RowHeight := LineCount * LineHeight;
end;
procedure TdxGridTableViewFootersProducer.FixupRowDataItemHeight(AnItem: TdxReportVisualItem);
begin
with AnItem do
Height := Parent.Height - 2 * FooterItemInflateVert;
end;
procedure TdxGridTableViewFootersProducer.InitializeRow;
begin
inherited;
Formatter.DoInitializeFooterRow(Row);
end;
procedure TdxGridTableViewFootersProducer.InitializeSubItem(ASubItem: TAbstractdxReportCellData;
AIndex: Integer);
begin
inherited;
Formatter.DoInitializeFooterItem(ASubItem, AIndex);
Formatter.DoReportLinkInitializeFooterItem(ASubItem, AIndex);
end;
function TdxGridTableViewFootersProducer.GetAutoHeight: Boolean;
var
I: Integer;
begin
Result := inherited GetAutoHeight and Adapter.FooterMultiline;
if Result then
begin
for I := 0 to SubItemCount - 1 do
if HasSubItem[I] then Exit;
Result := False;
end;
end;
function TdxGridTableViewFootersProducer.GetHasSubItem(Index: Integer): Boolean;
begin
Result := Adapter.HasFooterItem[Index];
end;
function TdxGridTableViewFootersProducer.GetLineCount: Integer;
begin
Result := Adapter.DetailsLineCount;
end;
function TdxGridTableViewFootersProducer.GetLineHeight: Integer;
begin
Result := Formatter.FooterLineHeight;
end;
function TdxGridTableViewFootersProducer.GetSubItemBound(Index: Integer): TRect;
begin
Result := Formatter.GetFooterItemBounds(Index);
end;
function TdxGridTableViewFootersProducer.GetSubItemClass(Index: Integer): TdxReportCellDataClass;
begin
Result := Formatter.GetFooterItemClass(Index);
end;
{ TdxGridTableViewCustomDataRowProducer }
function TdxGridTableViewCustomDataRowProducer.Produce(AHostInfo: TdxGridAttributeHostInfo;
AGridRow: TcxCustomGridRow; AGridRowIndex: Integer): TdxReportCell;
begin
FGridRow := AGridRow;
FGridRowIndex := AGridRowIndex;
Result := inherited Produce(AHostInfo);
FGridRowIndex := -1;
FGridRow := nil;
end;
function TdxGridTableViewCustomDataRowProducer.GridRow: TcxCustomGridRow;
begin
Result := FGridRow;
end;
procedure TdxGridTableViewCustomDataRowProducer.AddIndents(AParent: TdxReportCell);
var
I: Integer;
Indent: TdxReportCellExpandButton;
begin
inherited;
for I := 0 to IndentCount - 1 do
begin
Indent := CreateIndent(I, AParent);
Indent.BoundsRect := IndentBounds[I];
InitializeIndent(Indent, I);
end;
end;
function TdxGridTableViewCustomDataRowProducer.CreateIndent(AnIndex: Integer;
AParent: TdxReportCell): TdxReportCellExpandButton;
begin
Result := Formatter.CreateIndent(AParent);
FIndents[AnIndex] := Result;
end;
procedure TdxGridTableViewCustomDataRowProducer.InitializeIndent(AIndent: TdxReportCellExpandButton;
AIndex: Integer);
begin
end;
function TdxGridTableViewCustomDataRowProducer.GetIndentCount: Integer;
begin
Result := GridRow.Level;
end;
function TdxGridTableViewCustomDataRowProducer.GetLineCount: Integer;
begin
Result := 1;
end;
function TdxGridTableViewCustomDataRowProducer.GetLineHeight: Integer;
begin
Result := DefaultDataRowLineHeight;
end;
function TdxGridTableViewCustomDataRowProducer.GetIndentArea: Integer;
begin
Result := IndentCount * IndentWidth;
end;
function TdxGridTableViewCustomDataRowProducer.GetIndentBounds(Index: Integer): TRect;
begin
Result := MakeBounds(IndentWidth * Index, 0, IndentWidth, RowHeight);
end;
{ TdxCustomGridTableViewRowSeparatorProducer }
function TdxCustomGridTableViewRowSeparatorProducer.Produce(AHostInfo: TdxGridAttributeHostInfo;
AGridRow: TcxCustomGridRow): TdxReportCell;
begin
Result := inherited Produce(AHostInfo, AGridRow, -1);
end;
procedure TdxCustomGridTableViewRowSeparatorProducer.InitializeIndent(AIndent: TdxReportCellExpandButton;
AIndex: Integer);
begin
inherited;
Formatter.DoInitializeRowSeparatorIndent(AIndent, AIndex, IndentCount, GridRow);
end;
function TdxCustomGridTableViewRowSeparatorProducer.GetAutoHeight: Boolean;
begin
Result := False;
end;
function TdxCustomGridTableViewRowSeparatorProducer.GetSubItemBound(Index: Integer): TRect;
begin
Result := MakeRect(IndentArea, 0, RowWidth, RowHeight);
end;
function TdxCustomGridTableViewRowSeparatorProducer.GetSubItemCount: Integer;
begin
Result := 1;
end;
{ TdxGridTableViewRowSeparatorProducer }
function TdxGridTableViewRowSeparatorProducer.Produce(AHostInfo: TdxGridAttributeHostInfo;
AGridRow: TcxCustomGridRow; AnIsLast: Boolean): TdxReportCell;
begin
FIsLast := AnIsLast;
Result := inherited Produce(AHostInfo, AGridRow);
end;
procedure TdxGridTableViewRowSeparatorProducer.InitializeRow;
begin
inherited;
Formatter.DoInitializeSeparatorRow(Row);
end;
procedure TdxGridTableViewRowSeparatorProducer.InitializeSubItem(ASubItem: TAbstractdxReportCellData;
AIndex: Integer);
begin
Formatter.DoInitializeRowSeparator(ASubItem);
end;
function TdxGridTableViewRowSeparatorProducer.GetIndentCount: Integer;
begin
if not IsLast then
begin
Result := inherited GetIndentCount;
if (Result <> 0) and Adapter.IsOffice11StyleGrouping and not (GridRow is TcxGridGroupRow) then {.2}
Dec(Result);
end
else
Result := 0;
end;
function TdxGridTableViewRowSeparatorProducer.GetLineHeight: Integer;
begin
Result := Formatter.RowSeparatorThickness;
end;
function TdxGridTableViewRowSeparatorProducer.GetSubItemClass(Index: Integer): TdxReportCellDataClass;
begin
Result := Formatter.GetRowSeparatorClass;
end;
{ TdxGridTableViewGroupRowSeparatorProducer }
procedure TdxGridTableViewGroupRowSeparatorProducer.InitializeRow;
begin
inherited;
Formatter.DoInitializeGroupSeparatorRow(Row);
end;
procedure TdxGridTableViewGroupRowSeparatorProducer.InitializeSubItem(ASubItem: TAbstractdxReportCellData;
AIndex: Integer);
begin
inherited;
Formatter.DoInitializeGroupRowSeparator(ASubItem);
end;
function TdxGridTableViewGroupRowSeparatorProducer.GetLineHeight: Integer;
begin
Result := Formatter.GroupRowSeparatorThickness;
end;
function TdxGridTableViewGroupRowSeparatorProducer.GetSubItemClass(Index: Integer): TdxReportCellDataClass;
begin
Result := Formatter.GetGroupRowSeparatorClass;
end;
{ TdxGridTableViewDataRowProducer }
function TdxGridTableViewDataRowProducer.GridRow: TcxGridDataRow;
begin
Result := inherited GridRow as TcxGridDataRow;
end;
procedure TdxGridTableViewDataRowProducer.AddPreview(AParent: TdxReportCell);
begin
FPreviewItem := CreatePreview(Row);
PreviewItem.Left := IndentArea;
// We have to set Width before because we use that value for PreviewHeight calculation
PreviewItem.Width := Width - IndentArea;
Formatter.DoInitializePreview(TAbstractdxReportCellData(PreviewItem), PreviewColumn, GridRow);
PreviewItem.Height := PreviewHeight;
PreviewItem.AdjustContent(Formatter.DC); {3.1}
end;
procedure TdxGridTableViewDataRowProducer.AddSubItems(AParent: TdxReportCell);
begin
inherited;
if HasPreview then AddPreview(AParent);
end;
procedure TdxGridTableViewDataRowProducer.CalculateRowAutoHeight;
begin
if CellAutoHeight then inherited;
if PreviewItem <> nil then
RowHeight := RowHeight + PreviewItem.Height;
end;
function TdxGridTableViewDataRowProducer.CreatePreview(AParent: TdxReportCell): TdxReportVisualItem;
begin
Result := GetPreviewClass.Create(AParent);
FPreviewItem := Result;
end;
function TdxGridTableViewDataRowProducer.DoesItemParticipateInRowAutoHeightCalculation(AnItem: TdxReportVisualItem): Boolean;
var
TableItem: TcxCustomGridTableItem;
Properties: TcxCustomEditProperties;
begin
Result := AnItem <> FPreviewItem;
// 3.2
if Result and not IsItemIndent(AnItem) then
begin
TableItem := TcxCustomGridTableItem(AnItem.Data);
Properties := Adapter.GetProperties(TableItem, GridRow);
Result := dxPScxCommon.dxPSDataMaps.DoesItemParticipateInAutoHeightCalculation(Properties);
end;
end;
function TdxGridTableViewDataRowProducer.GetPreviewClass: TdxReportCellDataClass;
begin
Result := Formatter.GetPreviewClass(PreviewColumn, GridRow);
end;
procedure TdxGridTableViewDataRowProducer.FixupRowDataHeight;
var
NewHeight, I: Integer;
Item: TdxReportVisualItem;
begin
NewHeight := RowHeight;
if PreviewItem <> nil then
Dec(NewHeight, PreviewItem.Height);
for I := 0 to Row.DataItemCount - 1 do
begin
Item := Row.DataItems[I];
if Item = PreviewItem then
if PreviewPlace = cxGridTableView.ppTop then
Item.Top := 0
else
Item.Top := NewHeight
else
if IsItemIndent(Item) then
begin
Item.Top := 0;
Item.Height := RowHeight;
end
else
begin
if CellAutoHeight then
Item.Height := NewHeight;
if HasPreview and (PreviewPlace = cxGridTableView.ppTop) then
Item.Top := Item.Top + PreviewItem.Height;
end;
end;
{3.1}
for I := 0 to Row.CellCount - 1 do
begin
Item := Row.Cells[I];
if Item = PreviewItem then
if PreviewPlace = cxGridTableView.ppTop then
Item.Top := 0
else
Item.Top := NewHeight
else
begin
if CellAutoHeight then
Item.Height := NewHeight;
if HasPreview and (PreviewPlace = cxGridTableView.ppTop) then
Item.Top := Item.Top + PreviewItem.Height;
end;
end;
end;
procedure TdxGridTableViewDataRowProducer.InitializeIndent(AIndent: TdxReportCellExpandButton;
AIndex: Integer);
begin
inherited;
Formatter.DoInitializeDataRowIndent(AIndent, AIndex, IndentCount, GridRow);
end;
procedure TdxGridTableViewDataRowProducer.InitializeRow;
begin
inherited;
Formatter.DoInitializeDataRow(Row, GridRow);
end;
procedure TdxGridTableViewDataRowProducer.InitializeSubItem(ASubItem: TAbstractdxReportCellData;
AIndex: Integer);
begin
inherited;
Formatter.DoInitializeItem(ASubItem, Columns[AIndex], GridRow, False);
Formatter.DoReportLinkInitializeItem(ASubItem, Columns[AIndex], GridRow);
end;
function TdxGridTableViewDataRowProducer.GetAutoHeight: Boolean;
begin
Result := CellAutoHeight or HasPreview;
end;
function TdxGridTableViewDataRowProducer.GetCellAutoHeight: Boolean;
begin
Result := inherited GetAutoHeight and Adapter.CellAutoHeight;
end;
function TdxGridTableViewDataRowProducer.GetHasPreview: Boolean;
begin
Result := Formatter.HasPreview;
end;
function TdxGridTableViewDataRowProducer.GetIndentCount: Integer;
begin
Result := inherited GetIndentCount;
if (Result <> 0) and Adapter.IsOffice11StyleGrouping then {.2}
Dec(Result);
end;
function TdxGridTableViewDataRowProducer.GetLineCount: Integer;
begin
Result := Adapter.DetailsLineCount;
end;
function TdxGridTableViewDataRowProducer.GetLineHeight: Integer;
begin
if Formatter.HeaderLineCount = 1 then
Result := Formatter.RowHeights[GridRowIndex]
else
Result := Formatter.DetailsLineHeight;
end;
function TdxGridTableViewDataRowProducer.GetPreviewHeight: Integer;
begin
Result := PreviewLineCount * PreviewLineHeight;
end;
function TdxGridTableViewDataRowProducer.GetPreviewLineCount: Integer;
begin
if FPreviewItem <> nil then
if not Formatter.PreviewAutoHeight then
begin
Result := PreviewItem.CalculateLineCount(Formatter.DC);
if Result <> Formatter.PreviewMaxLineCount then
Result := Formatter.PreviewMaxLineCount;
end
else
Result := 1
else
Result := 0;
end;
function TdxGridTableViewDataRowProducer.GetPreviewLineHeight: Integer;
var
LineHeight: Integer;
begin
if FPreviewItem <> nil then
if Formatter.PreviewAutoHeight then
begin
Result := PreviewItem.MeasureContentHeight(Formatter.DC);
if Formatter.PreviewMaxLineCount <> 0 then
begin
LineHeight := PreviewItem.MeasureFontHeight(Formatter.DC);
if Result > LineHeight * Formatter.PreviewMaxLineCount then
Result := LineHeight * Formatter.PreviewMaxLineCount;
end;
end
else
Result := PreviewItem.MeasureFontHeight(Formatter.DC)
else
Result := 0;
end;
function TdxGridTableViewDataRowProducer.GetSubItemBound(Index: Integer): TRect;
begin
Result := Formatter.GetItemBounds(GridRow, GridRowIndex, Index);
end;
function TdxGridTableViewDataRowProducer.GetSubItemClass(Index: Integer): TdxReportCellDataClass;
begin
Result := Formatter.GetItemClass(Columns[Index], GridRow, False);
end;
function TdxGridTableViewDataRowProducer.GetPreviewColumn: TcxGridColumn;
begin
Result := Adapter.PreviewColumn;
end;
function TdxGridTableViewDataRowProducer.GetPreviewPlace: TcxGridPreviewPlace;
begin
Result := Adapter.PreviewPlace;
end;
{ TdxGridTableViewGroupRowProducer}
procedure TdxGridTableViewGroupRowProducer.InitializeRow;
begin
inherited;
Formatter.DoInitializeGroupRow(Row, GridRow);
end;
function TdxGridTableViewGroupRowProducer.GridRow: TcxGridGroupRow;
begin
Result := inherited GridRow as TcxGridGroupRow;
end;
procedure TdxGridTableViewGroupRowProducer.InitializeIndent(AIndent: TdxReportCellExpandButton;
AIndex: Integer);
begin
inherited;
Formatter.DoInitializeGroupRowIndent(AIndent, AIndex, IndentCount, GridRow);
end;
procedure TdxGridTableViewGroupRowProducer.InitializeSubItem(ASubItem: TAbstractdxReportCellData;
AIndex: Integer);
begin
inherited;
Formatter.DoInitializeGroupRowItem(ASubItem, GridRow);
end;
function TdxGridTableViewGroupRowProducer.GetAutoHeight: Boolean;
begin
Result := False;
end;
function TdxGridTableViewGroupRowProducer.GetIndentCount: Integer;
begin
Result := inherited GetIndentCount + 1;
end;
function TdxGridTableViewGroupRowProducer.GetLineCount: Integer;
begin
Result := 1;
end;
function TdxGridTableViewGroupRowProducer.GetLineHeight: Integer;
begin
Result := Formatter.RowHeights[GridRowIndex];//}Formatter.GroupRowLineHeight; {3.1}
end;
function TdxGridTableViewGroupRowProducer.GetSubItemBound(Index: Integer): TRect;
begin
Result := MakeRect(IndentArea, 0, RowWidth, LineHeight);
end;
function TdxGridTableViewGroupRowProducer.GetSubItemClass(Index: Integer): TdxReportCellDataClass;
begin
Result := Formatter.GetGroupRowClass;
end;
function TdxGridTableViewGroupRowProducer.GetSubItemCount: Integer;
begin
Result := 1;
end;
{ TdxGridTableViewMasterRowProducer }
function TdxGridTableViewMasterRowProducer.GridRow: TcxGridMasterDataRow;
begin
Result := inherited GridRow as TcxGridMasterDataRow;
end;
procedure TdxGridTableViewMasterRowProducer.InitializeIndent(AIndent: TdxReportCellExpandButton;
AIndex: Integer);
begin
//inherited;
Formatter.DoInitializeMasterDataRowIndent(AIndent, AIndex, IndentCount, GridRow);
end;
procedure TdxGridTableViewMasterRowProducer.InitializeSubItem(ASubItem: TAbstractdxReportCellData;
AIndex: Integer);
begin
inherited;
if AIndex = 0 then
ASubItem.CellSides := ASubItem.CellSides - [csLeft];
end;
function TdxGridTableViewMasterRowProducer.GetIndentCount: Integer;
begin
Result := inherited GetIndentCount + 1;
end;
{ TdxGridTableViewGroupFooterProducer }
function TdxGridTableViewGroupFooterProducer.Produce(AHostInfo: TdxGridAttributeHostInfo;
AGridRow: TcxCustomGridRow; AGroupLevel, AnIndex: Integer): TdxReportCell;
begin
FGroupLevel := AGroupLevel;
FIndex := AnIndex;
Result := inherited Produce(AHostInfo, AGridRow, -1);
FGroupLevel := -1;
end;
procedure TdxGridTableViewGroupFooterProducer.AddSubItems(AParent: TdxReportCell);
function SubstituteParent(AParent: TdxReportCell): TdxReportCell;
begin
Result := TdxReportCell.Create(AParent);
Result.BoundsRect := HostBounds;
Formatter.DoInitializeGroupFooterHost(Result, GridRow, GroupLevel);
end;
begin
FItemsSite := SubstituteParent(AParent);
inherited AddSubItems(ItemsSite);
end;
procedure TdxGridTableViewGroupFooterProducer.CalculateRowAutoHeight;
begin
inherited;
Inc(FRowHeight, FooterItemInflateVert);
end;
procedure TdxGridTableViewGroupFooterProducer.FixupRowDataItemHeight(AnItem: TdxReportVisualItem);
begin
with AnItem do
Height := Parent.Height - 2 * FooterItemInflateVert;
end;
procedure TdxGridTableViewGroupFooterProducer.InitializeIndent(AIndent: TdxReportCellExpandButton;
AIndex: Integer);
begin
inherited;
Formatter.DoInitializeGroupFooterIndent(AIndent, AIndex, IndentCount, GridRow);
end;
procedure TdxGridTableViewGroupFooterProducer.InitializeRow;
begin
inherited;
Formatter.DoInitializeGroupFooterRow(Row, GridRow, GroupLevel);
end;
procedure TdxGridTableViewGroupFooterProducer.InitializeSubItem(ASubItem: TAbstractdxReportCellData;
AIndex: Integer);
begin
inherited;
Formatter.DoInitializeGroupFooterItem(ASubItem, AIndex, GridRow, GroupLevel);
Formatter.DoReportLinkInitializeGroupFooterItem(ASubItem, AIndex, GridRow, GroupLevel);
end;
function TdxGridTableViewGroupFooterProducer.GetAutoHeight: Boolean;
begin
Result := inherited GetAutoHeight and Adapter.GroupFootersMultiline and
((ItemsSite.DataItemCount <> 0) or (ItemsSite.CellCount <> 0));
end;
function TdxGridTableViewGroupFooterProducer.GetHasSubItem(Index: Integer): Boolean;
begin
Result := Adapter.HasGroupFooterItem(GroupLevel, Index);
end;
function TdxGridTableViewGroupFooterProducer.GetIndentCount: Integer;
begin
Result := GroupLevel;
if Adapter.GroupFootersMode = gfVisibleWhenExpanded then
begin
Inc(Result);
if Adapter.IsOffice11StyleGrouping and (Index = 0) and not (GridRow is TcxGridGroupRow) then
Dec(Result);
end
end;
function TdxGridTableViewGroupFooterProducer.GetItemsSite: TdxReportCell;
begin
Result := FItemsSite;
end;
function TdxGridTableViewGroupFooterProducer.GetLineCount: Integer;
begin
Result := Adapter.DetailsLineCount;
end;
function TdxGridTableViewGroupFooterProducer.GetLineHeight: Integer;
begin
Result := Formatter.GroupFooterLineHeight;
end;
function TdxGridTableViewGroupFooterProducer.GetSubItemBound(Index: Integer): TRect;
begin
Result := Formatter.GetGroupFooterItemBounds(Index, IndentCount);
end;
function TdxGridTableViewGroupFooterProducer.GetSubItemClass(Index: Integer): TdxReportCellDataClass;
begin
Result := Formatter.GetGroupFooterItemClass(Index);
end;
function TdxGridTableViewGroupFooterProducer.GetGroupLevel: Integer;
begin
Result := FGroupLevel;
if Adapter.GroupFootersMode = gfVisibleWhenExpanded then
Dec(Result);
end;
function TdxGridTableViewGroupFooterProducer.GetHostBounds: TRect;
begin
Result := MakeRect(IndentArea, 0, Row.Width, Row.Height);
end;
{ TdxGridTableViewBandsProducer }
function TdxGridTableViewBandsProducer.Adapter: TdxGridBandedTableViewAdapter;
begin
Result := inherited Adapter as TdxGridBandedTableViewAdapter;
end;
function TdxGridTableViewBandsProducer.Builder: TdxGridBandedTableViewBuilder;
begin
Result := inherited Builder as TdxGridBandedTableViewBuilder;
end;
function TdxGridTableViewBandsProducer.Formatter: TdxGridBandedTableViewFormatter;
begin
Result := inherited Formatter as TdxGridBandedTableViewFormatter;
end;
function TdxGridTableViewBandsProducer.GetSubItemCount: Integer;
begin
Result := Formatter.BandCount;
end;
procedure TdxGridTableViewBandsProducer.CalculateRowHeight;
begin
FRowHeight := Formatter.ItemPlaceController.Height;
end;
procedure TdxGridTableViewBandsProducer.InitializeRow;
begin
inherited;
Formatter.DoInitializeBandRow(Row);
end;
procedure TdxGridTableViewBandsProducer.InitializeSubItem(ASubItem: TAbstractdxReportCellData;
AIndex: Integer);
begin
inherited;
Formatter.DoInitializeBandItem(ASubItem, AIndex);
Formatter.DoReportLinkInitializeBandItem(ASubItem, AIndex);
end;
function TdxGridTableViewBandsProducer.GetAutoHeight: Boolean;
begin
Result := False;
end;
function TdxGridTableViewBandsProducer.GetSubItemBound(Index: Integer): TRect;
begin
Result := Formatter.GetBandItemBounds(Index);
end;
function TdxGridTableViewBandsProducer.GetSubItemClass(Index: Integer): TdxReportCellDataClass;
begin
Result := Formatter.GetBandItemClass(Index);
end;
{ TdxGridCardViewCardsRowProducer }
function TdxGridCardViewCardsRowProducer.Adapter: TdxGridCardViewAdapter;
begin
Result := inherited Adapter as TdxGridCardViewAdapter;
end;
function TdxGridCardViewCardsRowProducer.Builder: TdxGridCardViewBuilder;
begin
Result := inherited Builder as TdxGridCardViewBuilder;
end;
function TdxGridCardViewCardsRowProducer.Formatter: TdxGridCardViewFormatter;
begin
Result := inherited Formatter as TdxGridCardViewFormatter;
end;
function TdxGridCardViewCardsRowProducer.CreateCard(AParent: TdxReportCell;
AGridCard: TcxGridCard): TdxReportCard;
begin
Result := Formatter.GetCardClass(AGridCard).CreateEx(AParent, AGridCard);
Formatter.DoInitializeCard(Result, AGridCard);
end;
procedure TdxGridCardViewCardsRowProducer.InjectCard(ACard: TdxReportCard;
AIndex: Integer);
begin
ACard.Parent := Row;
ACard.Left := Formatter.InterCardsSpaceHorz div 2 +
AIndex * (Builder.MaxCardWidth + Formatter.InterCardsSpaceHorz);
ACard.Top := Formatter.InterCardsSpaceVert div 2;
end;
function TdxGridCardViewCardsRowProducer.Produce(AHostInfo: TdxGridAttributeHostInfo;
ARowHeight: Integer): TdxReportCell;
begin
FRowHeight := ARowHeight;
Result := inherited Produce(AHostInfo);
end;
procedure TdxGridCardViewCardsRowProducer.CalculateRowHeight;
begin
end;
function TdxGridCardViewCardsRowProducer.GetAutoHeight: Boolean;
begin
Result := False;
end;
procedure TdxGridCardViewCardsRowProducer.InitializeRow;
begin
inherited;
Formatter.DoInitializeCardsRow(Row);
end;
{$IFDEF CHARTVIEW}
{ TdxGridViewChartRowProducer }
function TdxGridChartViewChartProducer.Produce(AHostInfo: TdxGridAttributeHostInfo): TdxReportCell;
begin
try
Result := inherited Produce(AHostInfo);
finally
FreeAndNil(FChartImage);
end;
end;
function TdxGridChartViewChartProducer.Formatter: TdxGridChartViewFormatter;
begin
Result := inherited Formatter as TdxGridChartViewFormatter;
end;
procedure TdxGridChartViewChartProducer.CalculateRowHeight;
begin
if ChartImage <> nil then
RowHeight := ChartImage.Height
else
inherited;
end;
procedure TdxGridChartViewChartProducer.InitializeItem;
begin
inherited;
Item.Image := ChartImage;
Formatter.DoInitializeChartItem(Item);
Formatter.DoReportLinkInitializeChartItem(Item);
end;
function TdxGridChartViewChartProducer.GetItemClass: TdxReportCellDataClass;
begin
Result := Formatter.GetChartItemClass;
end;
function TdxGridChartViewChartProducer.GetChartImage: TGraphic;
begin
if FChartImage = nil then
FChartImage := Formatter.CreateChartImage;
Result := FChartImage;
end;
function TdxGridChartViewChartProducer.GetItem: TdxReportCellGraphic;
begin
Result := inherited Item as TdxReportCellGraphic;
end;
{$ENDIF}
{ TdxGridReportLinkOptions }
function TdxGridReportLinkOptions.GetReportLink: TdxGridReportLink;
begin
Result := inherited ReportLink as TdxGridReportLink;
end;
{ TdxGridReportLinkOptionsCardsShadow }
constructor TdxGridReportLinkCardsShadow.Create(AnOptionsCards: TdxGridReportLinkOptionsCards);
begin
inherited Create;
RestoreDefaults;
FOptionsCards := AnOptionsCards;
end;
procedure TdxGridReportLinkCardsShadow.Assign(Source: TPersistent);
begin
if Source is TdxGridReportLinkCardsShadow then
with TdxGridReportLinkCardsShadow(Source) do
begin
Self.Color := Color;
Self.Depth := Depth;
Self.Position := Position;
end
else
inherited;
end;
procedure TdxGridReportLinkCardsShadow.RestoreDefaults;
begin
inherited;
Color := clDefault;
Depth := dxDefaultCardsShadowDepth;
Position := cspBottomRight;
end;
procedure TdxGridReportLinkCardsShadow.Changed;
begin
if OptionsCards <> nil then OptionsCards.Changed;
end;
function TdxGridReportLinkCardsShadow.GetActualColor: TColor;
begin
Result := Color;
if Result = clDefault then
Result := dxDefaultCardsShadowColor;
end;
function TdxGridReportLinkCardsShadow.GetVisible: Boolean;
begin
Result := Depth <> 0;
end;
procedure TdxGridReportLinkCardsShadow.SetColor(Value: TColor);
begin
if FColor <> Value then
begin
FColor := Value;
if Visible then Changed;
end;
end;
procedure TdxGridReportLinkCardsShadow.SetDepth(Value: TdxGridCardShadowDepth);
begin
if FDepth <> Value then
begin
FDepth := Value;
Changed;
end;
end;
procedure TdxGridReportLinkCardsShadow.SetPosition(Value: TdxGridCardShadowPosition);
begin
if FPosition <> Value then
begin
FPosition := Value;
if Visible then Changed;
end;
end;
{ TdxGridReportLinkOptionsCards }
destructor TdxGridReportLinkOptionsCards.Destroy;
begin
FreeAndNil(FShadow);
inherited;
end;
procedure TdxGridReportLinkOptionsCards.Assign(Source: TPersistent);
begin
if Source is TdxGridReportLinkOptionsCards then
with TdxGridReportLinkOptionsCards(Source) do
begin
Self.AutoWidth := AutoWidth;
Self.Borders := Borders;
Self.InterCardsSpaceHorz := InterCardsSpaceHorz;
Self.InterCardsSpaceVert := InterCardsSpaceVert;
Self.KeepSameHeight := KeepSameHeight;
Self.KeepSameWidth := KeepSameWidth;
Self.RowBordersHorz := RowBordersHorz;
Self.RowBordersVert := RowBordersVert;
Self.Shadow := Shadow;
end;
inherited;
end;
procedure TdxGridReportLinkOptionsCards.RestoreDefaults;
begin
inherited;
AutoWidth := False;
Borders := True;
InterCardsSpaceHorz := dxDefaultInterCardsSpaceHorz;
InterCardsSpaceVert := dxDefaultInterCardsSpaceVert;
KeepSameHeight := True;
KeepSameWidth := True;
RowBordersHorz := False;
RowBordersVert := False;
Shadow.RestoreDefaults;
end;
function TdxGridReportLinkOptionsCards.DesignerTabIndex: Integer;
begin
Result := 5;
end;
function TdxGridReportLinkOptionsCards.GetShadowClass: TdxGridReportLinkCardsShadowClass;
begin
Result := TdxGridReportLinkCardsShadow;
end;
function TdxGridReportLinkOptionsCards.GetShadow: TdxGridReportLinkCardsShadow;
begin
if FShadow = nil then
FShadow := GetShadowClass.Create(Self);
Result := FShadow;
end;
procedure TdxGridReportLinkOptionsCards.SetAutoWidth(Value: Boolean);
begin
if FAutoWidth <> Value then
begin
FAutoWidth := Value;
Changed;
end;
end;
procedure TdxGridReportLinkOptionsCards.SetBorders(Value: Boolean);
begin
if FBorders <> Value then
begin
FBorders := Value;
Changed;
end;
end;
procedure TdxGridReportLinkOptionsCards.SetInterCardsSpaceHorz(Value: Integer);
begin
if Value < 0 then Value := 0;
if FInterCardsSpaceHorz <> Value then
begin
FInterCardsSpaceHorz := Value;
Changed;
end;
end;
procedure TdxGridReportLinkOptionsCards.SetInterCardsSpaceVert(Value: Integer);
begin
if Value < 0 then Value := 0;
if FInterCardsSpaceVert <> Value then
begin
FInterCardsSpaceVert := Value;
Changed;
end;
end;
procedure TdxGridReportLinkOptionsCards.SetKeepSameHeight(Value: Boolean);
begin
if FKeepSameHeight <> Value then
begin
FKeepSameHeight := Value;
Changed;
end;
end;
procedure TdxGridReportLinkOptionsCards.SetKeepSameWidth(Value: Boolean);
begin
if FKeepSameWidth <> Value then
begin
FKeepSameWidth := Value;
if AutoWidth then Changed;
end;
end;
procedure TdxGridReportLinkOptionsCards.SetRowBordersHorz(Value: Boolean);
begin
if FRowBordersHorz <> Value then
begin
FRowBordersHorz := Value;
Changed;
end;
end;
procedure TdxGridReportLinkOptionsCards.SetRowBordersVert(Value: Boolean);
begin
if FRowBordersVert <> Value then
begin
FRowBordersVert := Value;
Changed;
end;
end;
procedure TdxGridReportLinkOptionsCards.SetShadow(Value: TdxGridReportLinkCardsShadow);
begin
Shadow.Assign(Value);
end;
{ TdxGridReportLinkOptionsPagination }
procedure TdxGridReportLinkOptionsPagination.Assign(Source: TPersistent);
begin
if Source is TdxGridReportLinkOptionsPagination then
with TdxGridReportLinkOptionsPagination(Source) do
begin
Self.OneGroupPerPage := OneGroupPerPage;
Self.TopLevelGroup := TopLevelGroup;
end;
inherited;
end;
procedure TdxGridReportLinkOptionsPagination.RestoreDefaults;
begin
inherited;
OneGroupPerPage := False;
TopLevelGroup := False;
end;
function TdxGridReportLinkOptionsPagination.DesignerTabIndex: Integer;
begin
Result := 2;
end;
function TdxGridReportLinkOptionsPagination.GetReportLink: TdxGridReportLink;
begin
Result := inherited ReportLink as TdxGridReportLink;
end;
procedure TdxGridReportLinkOptionsPagination.SetOneGroupPerPage(Value: Boolean);
begin
if FOneGroupPerPage <> Value then
begin
FOneGroupPerPage := Value;
Changed;
end;
end;
procedure TdxGridReportLinkOptionsPagination.SetTopLevelGroup(Value: Boolean);
begin
if FTopLevelGroup <> Value then
begin
FTopLevelGroup := Value;
Changed;
end;
end;
{$IFDEF CHARTVIEW}
{ TdxGridReportLinkOptionsCharts }
procedure TdxGridReportLinkOptionsCharts.Assign(Source: TPersistent);
begin
if Source is TdxGridReportLinkOptionsCharts then
with TdxGridReportLinkOptionsCharts(Source) do
begin
Self.GraphicClass := GraphicClass;
Self.Transparent := Transparent;
end;
inherited;
end;
procedure TdxGridReportLinkOptionsCharts.RestoreDefaults;
begin
inherited;
FIsGraphicClassAssigned := False;
Transparent := False;
end;
function TdxGridReportLinkOptionsCharts.DefaultGraphicClass: TGraphicClass;
begin
Result := TBitmap;
end;
function TdxGridReportLinkOptionsCharts.SupportsGraphicClass(AGraphicClass: TGraphicClass): Boolean;
begin
Result := (AGraphicClass <> nil) and not AGraphicClass.InheritsFrom(TIcon);
end;
function TdxGridReportLinkOptionsCharts.DesignerTabIndex: Integer;
begin
Result := 6;
end;
function TdxGridReportLinkOptionsCharts.GetGraphicClass: TGraphicClass;
begin
if FIsGraphicClassAssigned then
Result := FGraphicClass
else
Result := DefaultGraphicClass;
end;
function TdxGridReportLinkOptionsCharts.GetGraphicClassName: string;
begin
Result := GraphicClass.ClassName;
end;
function TdxGridReportLinkOptionsCharts.IsGraphicClassNameStored: Boolean;
begin
Result := FIsGraphicClassAssigned;
end;
procedure TdxGridReportLinkOptionsCharts.SetGraphicClass(Value: TGraphicClass);
begin
if Value = nil then
Value := DefaultGraphicClass;
if (GraphicClass <> Value) and SupportsGraphicClass(Value) then
begin
FGraphicClass := Value;
FIsGraphicClassAssigned := Value <> DefaultGraphicClass;
end;
end;
procedure TdxGridReportLinkOptionsCharts.SetGraphicClassName(const Value: string);
var
AClass: TClass;
begin
AClass := Classes.GetClass(Value);
if (AClass <> nil) and AClass.InheritsFrom(TGraphic) then
GraphicClass := TGraphicClass(AClass)
else
GraphicClass := nil;
end;
procedure TdxGridReportLinkOptionsCharts.SetTransparent(Value: Boolean);
begin
if FTransparent <> Value then
begin
FTransparent := Value;
Changed;
end;
end;
{$ENDIF}
{ TdxGridReportLinkOptionsDetails }
procedure TdxGridReportLinkOptionsDetails.Assign(Source: TPersistent);
begin
if Source is TdxGridReportLinkOptionsDetails then
with TdxGridReportLinkOptionsDetails(Source) do
begin
Self.OnlyFocusedView := OnlyFocusedView;
Self.StartFromFocusedView := StartFromFocusedView;
end;
inherited;
end;
procedure TdxGridReportLinkOptionsDetails.RestoreDefaults;
begin
inherited;
OnlyFocusedView := False;
StartFromFocusedView := False;
end;
function TdxGridReportLinkOptionsDetails.DesignerTabIndex: Integer;
begin
Result := 1;
end;
procedure TdxGridReportLinkOptionsDetails.SetOnlyFocusedView(Value: Boolean);
begin
if FOnlyFocusedView <> Value then
begin
FOnlyFocusedView := Value;
if StartFromFocusedView then Changed;
end;
end;
procedure TdxGridReportLinkOptionsDetails.SetStartFromFocusedView(Value: Boolean);
begin
if FStartFromFocusedView <> Value then
begin
FStartFromFocusedView := Value;
Changed;
end;
end;
{ TdxGridReportLinkOptionsExpanding }
procedure TdxGridReportLinkOptionsExpanding.Assign(Source: TPersistent);
begin
if Source is TdxGridReportLinkOptionsExpanding then
with TdxGridReportLinkOptionsExpanding(Source) do
begin
{$IFDEF DXVER500}
Self.ExpandCards := ExpandCards;
{$ENDIF}
Self.ExpandGroupRows := ExpandGroupRows;
Self.ExpandMasterRows := ExpandMasterRows;
end;
inherited;
end;
procedure TdxGridReportLinkOptionsExpanding.RestoreDefaults;
begin
inherited;
{$IFDEF DXVER500}
ExpandCards := False;
{$ENDIF}
ExpandGroupRows := False;
ExpandMasterRows := False;
end;
function TdxGridReportLinkOptionsExpanding.DesignerTabIndex: Integer;
begin
Result := 1;
end;
function TdxGridReportLinkOptionsExpanding.GetHasAny: Boolean;
begin
Result := ExpandGroupRows or ExpandMasterRows {$IFDEF DXVER500} or ExpandCards {$ENDIF};
end;
function TdxGridReportLinkOptionsExpanding.GetReportLink: TdxGridReportLink;
begin
Result := inherited ReportLink as TdxGridReportLink;
end;
{$IFDEF DXVER500}
procedure TdxGridReportLinkOptionsExpanding.SetExpandCards(Value: Boolean);
begin
if FExpandCards <> Value then
begin
FExpandCards := Value;
Changed;
end;
end;
{$ENDIF}
procedure TdxGridReportLinkOptionsExpanding.SetExpandGroupRows(Value: Boolean);
begin
if FExpandGroupRows <> Value then
begin
FExpandGroupRows := Value;
Changed;
end;
end;
procedure TdxGridReportLinkOptionsExpanding.SetExpandMasterRows(Value: Boolean);
begin
if FExpandMasterRows <> Value then
begin
FExpandMasterRows := Value;
Changed;
end;
end;
{ TdxGridReportLinkOptionsFormatting }
procedure TdxGridReportLinkOptionsFormatting.Assign(Source: TPersistent);
begin
if Source is TdxGridReportLinkOptionsFormatting then
with TdxGridReportLinkOptionsFormatting(Source) do
begin
Self.ConsumeSelectionStyle := ConsumeSelectionStyle;
end;
inherited;
end;
procedure TdxGridReportLinkOptionsFormatting.RestoreDefaults;
begin
inherited;
ConsumeSelectionStyle := False;
end;
function TdxGridReportLinkOptionsFormatting.DesignerTabIndex: Integer;
begin
Result := 2;
end;
function TdxGridReportLinkOptionsFormatting.GetReportLink: TdxGridReportLink;
begin
Result := inherited ReportLink as TdxGridReportLink;
end;
procedure TdxGridReportLinkOptionsFormatting.SetConsumeSelectionStyle(Value: Boolean);
begin
if FConsumeSelectionStyle <> Value then
begin
FConsumeSelectionStyle := Value;
Changed;
end;
end;
{ TdxGridReportLinkOptionsLevels }
procedure TdxGridReportLinkOptionsLevels.Assign(Source: TPersistent);
begin
if Source is TdxGridReportLinkOptionsLevels then
with TdxGridReportLinkOptionsLevels(Source) do
begin
Self.RiseActiveLevelOntoTop := RiseActiveLevelOntoTop;
Self.Unwrap := Unwrap;
Self.UnwrapTopLevel := UnwrapTopLevel;
end;
inherited;
end;
procedure TdxGridReportLinkOptionsLevels.RestoreDefaults;
begin
inherited;
RiseActiveLevelOntoTop := True;
Unwrap := False;
UnwrapTopLevel := True;
end;
function TdxGridReportLinkOptionsLevels.DesignerTabIndex: Integer;
begin
Result := 1;
end;
procedure TdxGridReportLinkOptionsLevels.SetRiseActiveLevelOntoTop(Value: Boolean);
begin
if FRiseActiveLevelOntoTop <> Value then
begin
FRiseActiveLevelOntoTop := Value;
Changed;
end;
end;
procedure TdxGridReportLinkOptionsLevels.SetUnwrap(Value: Boolean);
begin
if FUnwrap <> Value then
begin
FUnwrap := Value;
Changed;
end;
end;
procedure TdxGridReportLinkOptionsLevels.SetUnwrapTopLevel(Value: Boolean);
begin
if FUnwrapTopLevel <> Value then
begin
FUnwrapTopLevel := Value;
Changed;
end;
end;
{ TdxGridReportLinkOptionsOnEveryPage }
procedure TdxGridReportLinkOptionsOnEveryPage.Assign(Source: TPersistent);
begin
if Source is TdxGridReportLinkOptionsOnEveryPage then
with TdxGridReportLinkOptionsOnEveryPage(Source) do
begin
Self.Caption := Caption;
Self.FilterBar := FilterBar;
end;
inherited;
end;
procedure TdxGridReportLinkOptionsOnEveryPage.RestoreDefaults;
begin
inherited;
Caption := True;
FilterBar := True;
end;
function TdxGridReportLinkOptionsOnEveryPage.HasInstalledAttribute(AnAttribute: TdxGridAttributeClass): Boolean;
begin
if AnAttribute.InheritsFrom(TdxGridLevelCaption) then
Result := Caption
else
if AnAttribute.InheritsFrom(TdxGridBandHeader) then
Result := BandHeaders
else
if AnAttribute.InheritsFrom(TdxGridHeader) then
Result := Headers
else
if AnAttribute.InheritsFrom(TdxGridFooter) then
Result := Footers
else
if AnAttribute.InheritsFrom(TdxGridFilterBar) then
Result := FilterBar
else
Result := False;
end;
procedure TdxGridReportLinkOptionsOnEveryPage.SetAll;
begin
BandHeaders := True;
Caption := True;
FilterBar := True;
Footers := True;
Headers := True;
end;
procedure TdxGridReportLinkOptionsOnEveryPage.UnsetAll;
begin
BandHeaders := False;
Caption := False;
FilterBar := False;
Footers := False;
Headers := False;
end;
function TdxGridReportLinkOptionsOnEveryPage.DesignerTabIndex: Integer;
begin
Result := 0;
end;
function TdxGridReportLinkOptionsOnEveryPage.GetReportLink: TdxGridReportLink;
begin
Result := inherited ReportLink as TdxGridReportLink;
end;
procedure TdxGridReportLinkOptionsOnEveryPage.SetCaption(Value: Boolean);
begin
if FCaption <> Value then
begin
FCaption := Value;
Changed;
end;
end;
procedure TdxGridReportLinkOptionsOnEveryPage.SetFilterBar(Value: Boolean);
begin
if FFilterBar <> Value then
begin
FFilterBar := Value;
Changed;
end;
end;
{ TdxGridReportLinkOptionsPreview }
function TdxGridReportLinkOptionsPreview.DesignerTabIndex: Integer;
begin
Result := 4;
end;
function TdxGridReportLinkOptionsPreview.GetReportLink: TdxGridReportLink;
begin
Result := inherited ReportLink as TdxGridReportLink;
end;
{ TdxGridReportLinkOptionsRefinements }
function TdxGridReportLinkOptionsRefinements.DesignerTabIndex: Integer;
begin
Result := 2;
end;
function TdxGridReportLinkOptionsRefinements.GetReportLink: TdxGridReportLink;
begin
Result := inherited ReportLink as TdxGridReportLink;
end;
{ TdxGridReportLinkOptionsSelection }
function TdxGridReportLinkOptionsSelection.DesignerTabIndex: Integer;
begin
Result := 1;
end;
function TdxGridReportLinkOptionsSelection.GetReportLink: TdxGridReportLink;
begin
Result := inherited ReportLink as TdxGridReportLink;
end;
{ TdxGridReportLinkOptionsSize }
function TdxGridReportLinkOptionsSize.DesignerTabIndex: Integer;
begin
Result := 1;
end;
function TdxGridReportLinkOptionsSize.GetReportLink: TdxGridReportLink;
begin
Result := inherited ReportLink as TdxGridReportLink;
end;
{ TdxGridReportLinkOptionsView }
procedure TdxGridReportLinkOptionsView.Assign(Source: TPersistent);
begin
if Source is TdxGridReportLinkOptionsView then
with TdxGridReportLinkOptionsView(Source) do
begin
Self.Caption := Caption;
Self.FilterBar := FilterBar;
Self.GroupFooters := GroupFooters;
end;
inherited;
end;
procedure TdxGridReportLinkOptionsView.RestoreDefaults;
begin
inherited;
Caption := True;
FilterBar := True;
GroupFooters := True;
end;
function TdxGridReportLinkOptionsView.HasInstalledAttribute(AnAttribute: TdxGridAttributeClass): Boolean;
begin
if AnAttribute.InheritsFrom(TdxGridLevelCaption) then
Result := Caption
else
if AnAttribute.InheritsFrom(TdxGridBandHeader) then
Result := BandHeaders
else
if AnAttribute.InheritsFrom(TdxGridHeader) then
Result := Headers
else
if AnAttribute.InheritsFrom(TdxGridFooter) then
Result := Footers
else
if AnAttribute.InheritsFrom(TdxGridFilterBar) then
Result := FilterBar
else
Result := False;
end;
procedure TdxGridReportLinkOptionsView.SetAll;
begin
BandHeaders := True;
Caption := True;
FilterBar := True;
Footers := True;
GroupFooters := True;
Headers := True;
ExpandButtons := True;
end;
procedure TdxGridReportLinkOptionsView.UnsetAll;
begin
BandHeaders := False;
Caption := False;
FilterBar := False;
Footers := False;
GroupFooters := False;
Headers := False;
ExpandButtons := False;
end;
function TdxGridReportLinkOptionsView.DesignerTabIndex: Integer;
begin
Result := 0;
end;
function TdxGridReportLinkOptionsView.GetReportLink: TdxGridReportLink;
begin
Result := inherited ReportLink as TdxGridReportLink;
end;
procedure TdxGridReportLinkOptionsView.SetCaption(Value: Boolean);
begin
if FCaption <> Value then
begin
FCaption := Value;
Changed;
end;
end;
procedure TdxGridReportLinkOptionsView.SetFilterBar(Value: Boolean);
begin
if FFilterBar <> Value then
begin
FFilterBar := Value;
Changed;
end;
end;
procedure TdxGridReportLinkOptionsView.SetGroupFooters(Value: Boolean);
begin
if FGroupFooters <> Value then
begin
FGroupFooters := Value;
Changed;
end;
end;
{ TdxGridAttributeHostInfo }
procedure TdxGridAttributeHostInfo.Initialize(AParent: TdxReportCell);
begin
Origin := NullPoint;
FParent := AParent;
end;
{ TdxGridAttributeHostInfoServices }
constructor TdxGridAttributeHostInfoServices.Create(AReportLink: TdxGridReportLink);
begin
inherited Create;
FReportLink := AReportLink;
CreateHostInfos;
end;
destructor TdxGridAttributeHostInfoServices.Destroy;
begin
DestroyHostInfos;
inherited;
end;
procedure TdxGridAttributeHostInfoServices.Initialize;
begin
PageDetailsHostInfo.Initialize(PageDetails);
PageFootersHostInfo.Initialize(PageFooters);
PageHeadersHostInfo.Initialize(PageHeaders);
end;
procedure TdxGridAttributeHostInfoServices.CreateHostInfos;
begin
FPageDetailsHostInfo := TdxGridAttributeHostInfo.Create;
FPageFootersHostInfo := TdxGridAttributeHostInfo.Create;
FPageHeadersHostInfo := TdxGridAttributeHostInfo.Create;
end;
procedure TdxGridAttributeHostInfoServices.DestroyHostInfos;
begin
FreeAndNil(FPageHeadersHostInfo);
FreeAndNil(FPageFootersHostInfo);
FreeAndNil(FPageDetailsHostInfo);
end;
function TdxGridAttributeHostInfoServices.GetBandHeadersHostInfo: TdxGridAttributeHostInfo;
begin
if CanUseBandHeadersOnEveyPage then
Result := PageHeadersHostInfo
else
Result := PageDetailsHostInfo;
end;
function TdxGridAttributeHostInfoServices.GetCaptionHostInfo: TdxGridAttributeHostInfo;
begin
if CanUseCaptionOnEveryPage then
Result := PageHeadersHostInfo
else
Result := PageDetailsHostInfo;
end;
function TdxGridAttributeHostInfoServices.GetFilterBarHostInfo: TdxGridAttributeHostInfo;
begin
if CanUseFilterBarOnEveryPage then
if ActiveViewHelper.IsFilterBarAtTop(ActiveView) then
Result := PageHeadersHostInfo
else
Result := PageFootersHostInfo
else
Result := PageDetailsHostInfo;
end;
function TdxGridAttributeHostInfoServices.GetFootersHostInfo: TdxGridAttributeHostInfo;
begin
if CanUseFootersOnEveryPage then
Result := PageFootersHostInfo
else
Result := PageDetailsHostInfo;
end;
function TdxGridAttributeHostInfoServices.GetHeadersHostInfo: TdxGridAttributeHostInfo;
begin
if CanUseHeadersOnEveryPage then
Result := PageHeadersHostInfo
else
Result := PageDetailsHostInfo;
end;
function TdxGridAttributeHostInfoServices.GetInconsistentStateText: string;
begin
if ReportLink.IsAggregated then
Result := cxGetResourceString(@sdxCannotUseOnEveryPageModeInAggregatedState)
else
if ReportLink.ProcessParams.HasMasterDetails then
Result := cxGetResourceString(@sdxCannotUseOnEveryPageMode)
else
if IsInconsistentFilterBarState then
Result := cxGetResourceString(@sdxIncorrectFilterBarState)
else
if IsInconsistentBandHeadersState then
if ActiveViewHelper.IsFilterBarAtTop(ActiveView) then
Result := cxGetResourceString(@sdxIncorrectBandHeadersState2)
else
Result := cxGetResourceString(@sdxIncorrectBandHeadersState)
else
if IsInconsistentHeadersState then
if ActiveViewHelper.IsFilterBarAtTop(ActiveView) then
Result := cxGetResourceString(@sdxIncorrectHeadersState2)
else
Result := cxGetResourceString(@sdxIncorrectHeadersState)
else
if IsInconsistentFootersState then
Result := cxGetResourceString(@sdxIncorrectFootersState)
else
Result := '';
end;
function TdxGridAttributeHostInfoServices.GetIsInconsistentState: Boolean;
begin
Result := ReportLink.IsAggregated or ReportLink.ProcessParams.HasMasterDetails or
IsInconsistentFilterBarState or IsInconsistentBandHeadersState or
IsInconsistentHeadersState or IsInconsistentFootersState;
end;
function TdxGridAttributeHostInfoServices.HasCells: Boolean;
begin
Result := ReportLink.ReportCells <> nil;
end;
function TdxGridAttributeHostInfoServices.IsAttributeSupported(AnAttribute: TdxGridAttributeClass): Boolean;
begin
Result := ActiveViewHelper.IsAttributeSupported(AnAttribute)
end;
function TdxGridAttributeHostInfoServices.GetActiveView: TcxCustomGridView;
begin
Result := ReportLink.ActiveView;
end;
function TdxGridAttributeHostInfoServices.GetActiveViewHelper: TdxCustomGridViewHelperClass;
begin
Result := ReportLink.ActiveViewHelper;
// if ActiveView = nil then
// Result := TdxNullGridViewHelper
// else
// Result := dxViewHelpersFactory[ActiveView];
end;
function TdxGridAttributeHostInfoServices.GetArePageFootersAssigned: Boolean;
begin
with ReportLink.ReportCells do
Result := (FootersHostInfo.Parent = FooterCells) or (FilterBarHostInfo.Parent = FooterCells);
end;
function TdxGridAttributeHostInfoServices.GetArePageHeadersAssigned: Boolean;
begin
with ReportLink.ReportCells do
Result := (CaptionHostInfo.Parent = HeaderCells) or (FilterBarHostInfo.Parent = HeaderCells) or
(BandHeadersHostInfo.Parent = HeaderCells) or (HeadersHostInfo.Parent = HeaderCells);
end;
function TdxGridAttributeHostInfoServices.GetCanUseBandHeadersOnEveyPage: Boolean;
begin
Result := ReportLink.CanAttributeBeUsedOnEveryPage(TdxGridBandHeader) and
ReportLink.IsAttributeUsedOnEveryPage(TdxGridLevelCaption) and
(ActiveViewHelper.IsFilterBarAtBottom(ActiveView) or ReportLink.IsAttributeUsedOnEveryPage(TdxGridFilterBar));
end;
function TdxGridAttributeHostInfoServices.GetCanUseCaptionOnEveryPage: Boolean;
begin
Result := ReportLink.CanAttributeBeUsedOnEveryPage(TdxGridLevelCaption);
end;
function TdxGridAttributeHostInfoServices.GetCanUseFilterBarOnEveryPage: Boolean;
begin
Result := ReportLink.CanAttributeBeUsedOnEveryPage(TdxGridFilterBar) and
ReportLink.IsAttributeUsedOnEveryPage(TdxGridLevelCaption);
end;
function TdxGridAttributeHostInfoServices.GetCanUseFootersOnEveryPage: Boolean;
begin
Result := ReportLink.CanAttributeBeUsedOnEveryPage(TdxGridFooter) and
(ActiveViewHelper.IsFilterBarAtTop(ActiveView) or ReportLink.IsAttributeUsedOnEveryPage(TdxGridFilterBar));
end;
function TdxGridAttributeHostInfoServices.GetCanUseHeadersOnEveryPage: Boolean;
begin
Result := ReportLink.CanAttributeBeUsedOnEveryPage(TdxGridHeader) and
ReportLink.IsAttributeUsedOnEveryPage(TdxGridLevelCaption) and
(ActiveViewHelper.IsFilterBarAtBottom(ActiveView) or ReportLink.IsAttributeUsedOnEveryPage(TdxGridFilterBar)) and
ReportLink.IsAttributeUsedOnEveryPage(TdxGridBandHeader);
end;
function TdxGridAttributeHostInfoServices.GetIsInconsistentBandHeadersState: Boolean;
begin
Result := IsAttributeSupported(TdxGridBandHeader) and OptionsOnEveryPage.BandHeaders and OptionsView.BandHeaders and
((IsAttributeSupported(TdxGridLevelCaption) and OptionsView.Caption and not OptionsOnEveryPage.Caption) or
(IsAttributeSupported(TdxGridFilterBar) and ActiveViewHelper.IsFilterBarAtTop(ActiveView) and
OptionsView.FilterBar and not OptionsOnEveryPage.FilterBar));
end;
function TdxGridAttributeHostInfoServices.GetIsInconsistentFilterBarState: Boolean;
begin
Result := ActiveViewHelper.IsFilterBarAtTop(ActiveView) and
(IsAttributeSupported(TdxGridFilterBar) and OptionsView.FilterBar and OptionsOnEveryPage.FilterBar and
IsAttributeSupported(TdxGridLevelCaption) and OptionsView.Caption and not OptionsOnEveryPage.Caption);
end;
function TdxGridAttributeHostInfoServices.GetIsInconsistentFootersState: Boolean;
begin
Result := IsAttributeSupported(TdxGridFooter) and OptionsView.Footers and OptionsOnEveryPage.Footers and
IsAttributeSupported(TdxGridFilterBar) and ActiveViewHelper.IsFilterBarAtBottom(ActiveView) and
OptionsView.FilterBar and not OptionsOnEveryPage.FilterBar;
end;
function TdxGridAttributeHostInfoServices.GetIsInconsistentHeadersState: Boolean;
begin
Result := IsAttributeSupported(TdxGridHeader) and OptionsView.Headers and OptionsOnEveryPage.Headers and
((IsAttributeSupported(TdxGridLevelCaption) and OptionsView.Caption and not OptionsOnEveryPage.Caption) or
(IsAttributeSupported(TdxGridFilterBar) and ActiveViewHelper.IsFilterBarAtTop(ActiveView) and
OptionsView.FilterBar and not OptionsOnEveryPage.FilterBar) or
(IsAttributeSupported(TdxGridBandHeader) and OptionsView.BandHeaders and not OptionsOnEveryPage.BandHeaders));
end;
function TdxGridAttributeHostInfoServices.GetLevelSeparatorBottomHostInfo: TdxGridAttributeHostInfo;
begin
if ArePageFootersAssigned then
Result := PageFootersHostInfo
else
Result := PageDetailsHostInfo;
end;
function TdxGridAttributeHostInfoServices.GetLevelSeparatorTopHostInfo: TdxGridAttributeHostInfo;
begin
if ArePageHeadersAssigned then
Result := PageHeadersHostInfo
else
Result := PageDetailsHostInfo;
end;
function TdxGridAttributeHostInfoServices.GetOptionsOnEveryPage: TdxGridReportLinkOptionsOnEveryPage;
begin
Result := ReportLink.OptionsOnEveryPage;
end;
function TdxGridAttributeHostInfoServices.GetOptionsView: TdxGridReportLinkOptionsView;
begin
Result := ReportLink.OptionsView;
end;
function TdxGridAttributeHostInfoServices.GetPageDetails: TdxReportCell;
begin
if HasCells then
Result := ReportLink.ReportCells.Cells
else
Result := nil;
end;
function TdxGridAttributeHostInfoServices.GetPageFooters: TdxReportCell;
begin
if HasCells and not ReportLink.ProcessParams.HasMasterDetails then
Result := ReportLink.ReportCells.FooterCells
else
Result := PageDetails;
end;
function TdxGridAttributeHostInfoServices.GetPageHeaders: TdxReportCell;
begin
if HasCells and not ReportLink.ProcessParams.HasMasterDetails then
Result := ReportLink.ReportCells.HeaderCells
else
Result := PageDetails;
end;
{ TdxGridReportLinkStyles }
procedure TdxGridReportLinkStyles.Assign(Source: TPersistent);
begin
inherited;
if Source is TdxGridReportLinkStyles then
with TdxGridReportLinkStyles(Source) do
begin
Self.BandHeader := BandHeader;
Self.Caption := Caption;
Self.CardCaptionRow := CardCaptionRow;
Self.CardRowCaption := CardRowCaption;
Self.Content := Content;
Self.ContentEven := ContentEven;
Self.ContentOdd := ContentOdd;
Self.FilterBar := FilterBar;
Self.Footer := Footer;
Self.Group := Group;
Self.Header := Header;
Self.Preview := Preview;
Self.Selection := Selection;
end; // TODO: assign to TcxGridXXXStyles
end;
procedure TdxGridReportLinkStyles.GetBandHeaderParams(ABand: TcxGridBand;
out AParams: TcxViewParams);
begin
GetViewParams(vspsGridBandHeader, ABand, nil, AParams);
end;
procedure TdxGridReportLinkStyles.GetCaptionParams(ATabLevel: TcxGridLevel; out AParams: TcxViewParams);
begin
GetViewParams(vspsGridCaption, ATabLevel, nil, AParams);
end;
procedure TdxGridReportLinkStyles.GetCardCaptionRowParams(ARecord: TcxCustomGridRecord;
AItem: TcxCustomGridTableItem; out AParams: TcxViewParams);
var
DataCellPos: TdxPSGridDataCellPos;
begin
DataCellPos := CreatePSDataCellPos;
try
with DataCellPos do
begin
GridRecord := ARecord;
Item := AItem;
end;
GetViewParams(vspsGridCardCaptionRow, DataCellPos, nil, AParams);
finally
FreePSDataCellPos(DataCellPos);
end;
end;
procedure TdxGridReportLinkStyles.GetCardRowCaptionParams(ARecord: TcxCustomGridRecord;
AItem: TcxCustomGridTableItem; out AParams: TcxViewParams);
var
DataCellPos: TdxPSGridDataCellPos;
begin
DataCellPos := CreatePSDataCellPos;
try
with DataCellPos do
begin
GridRecord := ARecord;
Item := AItem;
end;
GetViewParams(vspsGridCardRowCaption, DataCellPos, nil, AParams);
finally
FreePSDataCellPos(DataCellPos);
end;
end;
procedure TdxGridReportLinkStyles.GetContentParams(ARecord: TcxCustomGridRecord;
AItem: TcxCustomGridTableItem; out AParams: TcxViewParams);
const
StyleIndexes: array[Boolean] of Integer = (vspsGridContentEven, vspsGridContentOdd);
var
DataCellPos: TdxPSGridDataCellPos;
begin
if (ARecord <> nil) and (GetValue(StyleIndexes[Odd(ARecord.Index)]) <> nil) then
begin
DataCellPos := CreatePSDataCellPos;
try
with DataCellPos do
begin
GridRecord := ARecord;
Item := AItem;
end;
GetViewParams(StyleIndexes[Odd(ARecord.Index)], DataCellPos, nil, AParams);
finally
FreePSDataCellPos(DataCellPos);
end;
end
else
GetViewParams(vspsGridContent, ARecord, nil, AParams);
end;
procedure TdxGridReportLinkStyles.GetFilterBarParams(out AParams: TcxViewParams);
begin
GetViewParams(vspsGridFilterBar, nil, nil, AParams);
end;
procedure TdxGridReportLinkStyles.GetFooterParams(ARecord: TcxCustomGridRecord;
AGroupLevel: Integer; AItem: TcxGridColumn; out AParams: TcxViewParams);
begin
GetViewParams(vspsGridFooter, ARecord, nil, AParams);
end;
procedure TdxGridReportLinkStyles.GetGroupParams(ARecord: TcxCustomGridRecord;
AGroupLevel: Integer; out AParams: TcxViewParams);
begin
GetViewParams(vspsGridGroup, ARecord, nil, AParams);
end;
procedure TdxGridReportLinkStyles.GetHeaderParams(AItem: TcxGridColumn;
out AParams: TcxViewParams);
begin
GetViewParams(vspsGridHeader, nil, nil, AParams);
end;
procedure TdxGridReportLinkStyles.GetPreviewParams(ARecord: TcxCustomGridRecord;
AItem: TcxCustomGridTableItem; out AParams: TcxViewParams);
begin
GetViewParams(vspsGridPreview, ARecord, nil, AParams);
end;
procedure TdxGridReportLinkStyles.GetSelectionParams(out AParams: TcxViewParams);
begin
GetViewParams(vspsGridSelection, nil, nil, AParams);
end;
function TdxGridReportLinkStyles.DesignerTabIndex: Integer;
begin
Result := 3;
end;
procedure TdxGridReportLinkStyles.GetDefaultViewParams(Index: Integer; AData: TObject;
out AParams: TcxViewParams);
const
FixedParts = [vspsGridBandHeader, vspsGridCaption, vspsGridFooter, vspsGridHeader,
vspsGridSelection];
begin
inherited;
if ReportLink <> nil then
with AParams do
begin
if Index in FixedParts then
Color := dxPSCore.dxDefaultFixedColor
else
if Index = vspsGridGroup then
if ReportLink.IsOffice11StyleGrouping and (AData = nil) then
Color := dxPSCore.dxDefaultFixedColor
else
Color := dxPSCore.dxDefaultContentColor
else
if Index = vspsGridFilterBar then
Color := DefaultFilterBarColor
else
Color := dxPSCore.dxDefaultContentColor;
Font := ReportLink.Font;
if Index = vspsGridFilterBar then
TextColor := DefaultFilterBarTextColor
else
TextColor := Font.Color;
end;
end;
class function TdxGridReportLinkStyles.GetStyleCaption(AnIndex: Integer): string;
begin
case AnIndex of
vspsGridBandHeader:
Result := cxGetResourceString(@sdxBandHeaderStyle);
vspsGridCaption:
Result := cxGetResourceString(@sdxCaptionStyle);
vspsGridCardCaptionRow:
Result := cxGetResourceString(@sdxCardCaptionRowStyle);
vspsGridCardRowCaption:
Result := cxGetResourceString(@sdxCardRowCaptionStyle);
vspsGridContent:
Result := cxGetResourceString(@sdxContentStyle);
vspsGridContentEven:
Result := cxGetResourceString(@sdxContentEvenStyle);
vspsGridContentOdd:
Result := cxGetResourceString(@sdxContentOddStyle);
vspsGridFilterBar:
Result := cxGetResourceString(@sdxFilterBarStyle);
vspsGridFooter:
Result := cxGetResourceString(@sdxFooterStyle);
vspsGridGroup:
Result := cxGetResourceString(@sdxGroupStyle);
vspsGridHeader:
Result := cxGetResourceString(@sdxHeaderStyle);
vspsGridPreview:
Result := cxGetResourceString(@sdxPreviewStyle);
else
Result := cxGetResourceString(@sdxSelectionStyle);
end;
end;
function TdxGridReportLinkStyles.GetStyleIndexByCaption(const Caption: string): Integer;
begin
for Result := vspsGridFirst to vspsGridLast do
if dxPSUtl.dxSameText(Caption, GetStyleCaption(Result)) then
Exit;
Result := -1;
end;
function TdxGridReportLinkStyles.IsCardViewStyle(AStyle: TcxStyle): Boolean;
begin
Result := (AStyle <> nil) and ((AStyle = CardRowCaption) or (AStyle = CardCaptionRow));
end;
function TdxGridReportLinkStyles.GetReportLink: TdxGridReportLink;
begin
Result := inherited ReportLink as TdxGridReportLink;
end;
{ TdxGridReportLinkStyleSheet }
class function TdxGridReportLinkStyleSheet.GetStylesClass: TcxCustomStylesClass;
begin
Result := TdxGridReportLinkStyles;
end;
function TdxGridReportLinkStyleSheet.GetStylesValue: TdxGridReportLinkStyles;
begin
if GetStyles is TdxGridReportLinkStyles then
Result := TdxGridReportLinkStyles(GetStyles)
else
Result := nil;
end;
procedure TdxGridReportLinkStyleSheet.SetStylesValue(Value: TdxGridReportLinkStyles);
begin
SetStyles(Value);
end;
{ TdxGridReportLink }
constructor TdxGridReportLink.Create(AOwner: TComponent);
begin
inherited;
FDelimitersHardVert := TList.Create;
FHostInfoServices := TdxGridAttributeHostInfoServices.Create(Self);
FReportRows := TList.Create;
InternalRestoreDefaults;
LinkModified(False);
end;
destructor TdxGridReportLink.Destroy;
begin
FreeAndNil(FReportRows);
FreeAndNil(FHostInfoServices);
FreeAndNil(FDelimitersHardVert);
inherited;
end;
procedure TdxGridReportLink.Assign(Source: TPersistent);
begin
if Source is TdxGridReportLink then
with TdxGridReportLink(Source) do
begin
Self.OptionsCards := OptionsCards;
{$IFDEF CHARTVIEW}
Self.OptionsCharts := OptionsCharts;
{$ENDIF}
Self.OptionsDetails := OptionsDetails;
Self.OptionsLevels := OptionsLevels;
end;
inherited;
end;
procedure TdxGridReportLink.AddPageBreak(AGridRecord: TcxCustomGridRecord);
var
ReportRow: TdxReportCell;
begin
ReportRow := ReportRowsByGridRecord[AGridRecord];
if ReportRow <> nil then
AddVerticalHardDelimiter(ReportRow);
end;
procedure TdxGridReportLink.AddPageBreak(const AGridRecords: array of TcxCustomGridRecord);
var
I: Integer;
begin
for I := Low(AGridRecords) to High(AGridRecords) do
AddPageBreak(AGridRecords[I]);
end;
procedure TdxGridReportLink.AddPageBreak(const AGridRecords: TdxGridRecordArray);
var
I: Integer;
begin
for I := 0 to Length(AGridRecords) - 1 do
AddPageBreak(AGridRecords[I]);
end;
procedure TdxGridReportLink.AddPageBreak(AGridRecords: TList);
var
I: Integer;
P: Pointer;
begin
for I := 0 to AGridRecords.Count - 1 do
begin
P := AGridRecords[I];
if TObject(P) is TcxCustomGridRecord then
AddPageBreak(TcxCustomGridRecord(P));
end;
end;
procedure TdxGridReportLink.BeforeDesignReport;
begin
CalculateProcessParams;
inherited;
end;
procedure TdxGridReportLink.ConstructReport(AReportCells: TdxReportCells);
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.LastCell.BoundsRect.Bottom);
end;
end;
begin
with AReportCells do
begin
CalculateReportPartSizes(Cells);
if AreFooterCellsAllocated then CalculateReportPartSizes(FooterCells);
if AreHeaderCellsAllocated then CalculateReportPartSizes(HeaderCells);
end;
end;
begin
if Grid = nil then Exit;
inherited;
if ActiveView = nil then Exit;
PrepareConstruct;
try
BuildTopLevelViews;
if not AbortBuilding then CalculateSizes;
finally
UnprepareConstruct;
end;
end;
procedure TdxGridReportLink.ConvertCoords;
begin
inherited;
ConvertDelimiters(DelimitersHardVert);
end;
procedure TdxGridReportLink.CustomDraw(AItem: TAbstractdxReportCellData;
ACanvas: TCanvas; ABoundsRect, AClientRect: TRect; var ADone: Boolean);
var
DrawInfo: TdxGridCellCustomDrawInfo;
begin
GetItemCustomDrawInfo(AItem, DrawInfo);
with DrawInfo do
case GridAttributeID of
dxGridBandID:
DoCustomDrawBandCell(ACanvas, TcxGridBandedTableView(GridView), GridBand,
TdxReportCellString(AItem), ADone);
dxGridCardRowCaptionID:
DoCustomDrawCardRowCaptionCell(ACanvas, TcxGridCardView(GridView), GridCard,
GridCardRow, TdxReportCellString(AItem), ADone);
dxGridCardRowDataID:
DoCustomDrawCardRowDataCell(ACanvas, TcxGridCardView(GridView), GridCard,
GridCardRow, AItem, ADone);
dxGridFilterBarID:
DoCustomDrawFilterBar(ACanvas, TcxCustomGridTableView(GridView),
TdxReportCellString(AItem), ADone);
dxGridFooterID,
dxGridGroupFooterID:
DoCustomDrawFooterCell(ACanvas, TcxGridTableView(GridView), GridRecord,
GridColumn, GroupLevel, TdxReportCellString(AItem), ADone);
dxGridHeaderID:
DoCustomDrawHeaderCell(ACanvas, TcxGridTableView(GridView), GridColumn,
TdxReportCellString(AItem), ADone);
dxGridRecordID:
DoCustomDrawCell(ACanvas, TcxCustomGridTableView(GridView), GridRecord,
GridColumn, AItem, ADone);
dxGridLevelCaptionID:
DoCustomDrawLevelCaption(ACanvas, GridView, TdxReportCellString(AItem), ADone);
end;
end;
function TdxGridReportLink.GetBreakPagesByHardDelimiters: Boolean;
begin
with OptionsPagination do
Result := OneGroupPerPage or Custom;
end;
function TdxGridReportLink.GetEmptyPagesCanExist: Boolean;
begin
Result := True;//}ProcessParams.HasMasterDetails;
end;
function TdxGridReportLink.GetRebuildOnPageParamsChange(AUpdateCodes: TdxPrinterPageUpdateCodes): Boolean;
begin
Result := (AUpdateCodes * uaMarginsVert <> []) and (ProcessParams.HasOnlyCards or OptionsSize.AutoWidth);
end;
function TdxGridReportLink.GetUseHardVertDelimiters: Boolean;
begin
with OptionsPagination do
Result := TopLevelGroup or Custom;
end;
procedure TdxGridReportLink.InternalRestoreDefaults;
begin
inherited;
OptionsCards.RestoreDefaults;
{$IFDEF CHARTVIEW}
OptionsCharts.RestoreDefaults;
{$ENDIF}
OptionsDetails.RestoreDefaults;
OptionsLevels.RestoreDefaults;
end;
procedure TdxGridReportLink.InternalRestoreFromOriginal;
var
View: TcxCustomGridView;
begin
inherited;
Color := clWhite;
if Grid <> nil then
begin
OptionsFormatting.LookAndFeelKind := Grid.LookAndFeel.Kind;
OptionsView.Caption := Grid.RootLevelOptions.DetailTabsPosition <> dtpNone;
View := ActiveView;
if View <> nil then
begin
if View is TcxGridTableView then
begin
OptionsPreview.AutoHeight := TcxGridTableView(View).Preview.AutoHeight;
OptionsPreview.MaxLineCount := TcxGridTableView(View).Preview.MaxLineCount;
OptionsPreview.Visible := TcxGridTableView(View).Preview.Visible;
if View is TcxGridBandedTableView then
OptionsView.BandHeaders := TcxGridBandedTableView(View).OptionsView.BandHeaders;
OptionsView.FilterBar := (TcxGridTableView(View).Filtering.Visible = fvAlways) or
((TcxGridTableView(View).Filtering.Visible = fvNonEmpty) and
(TcxGridTableView(View).DataController.Filter.FilterText <> ''));
OptionsView.Footers := TcxGridTableView(View).OptionsView.Footer;
OptionsView.GroupFooters := TcxGridTableView(View).OptionsView.GroupFooters <> gfInvisible;
OptionsView.Headers := TcxGridTableView(View).OptionsView.Header;
OptionsSize.AutoWidth := TcxGridTableView(View).OptionsView.ColumnAutoWidth;
end;
if View is TcxGridCardView then
OptionsView.FilterBar := False;
end;
end;
end;
function TdxGridReportLink.IsDrawFootersOnEveryPage: Boolean;
begin
Result := HostInfoServices.ArePageFootersAssigned;
end;
function TdxGridReportLink.IsDrawHeadersOnEveryPage: Boolean;
begin
Result := HostInfoServices.ArePageHeadersAssigned;
end;
function TdxGridReportLink.IsSupportedCustomDraw(Item: TAbstractdxReportCellData): Boolean;
var
DrawInfo: TdxGridCellCustomDrawInfo;
begin
Result := inherited IsSupportedCustomDraw(Item) and
(Item <> nil) and IsCustomDrawn(GetItemCustomDrawInfo(Item, DrawInfo));
end;
procedure TdxGridReportLink.MakeHardDelimiters(AReportCells: TdxReportCells;
AVertDelimiters: TList);
begin
inherited;
if OptionsPagination.Custom then
try
DoGetCustomPageBreaks;
except
Application.HandleException(Self);
end;
dxPSUtl.dxCopyList(DelimitersHardVert, AVertDelimiters);
end;
function TdxGridReportLink.GetAreNativeStylesAvailable: Boolean;
begin
Result := OptionsFormatting.UseNativeStyles;
end;
function TdxGridReportLink.GetStylesClass: TdxCustomReportLinkStylesClass;
begin
Result := TdxGridReportLinkStyles;
end;
function TdxGridReportLink.GetStyleSheetClass: TdxCustomReportLinkStyleSheetClass;
begin
Result := TdxGridReportLinkStyleSheet;
end;
function TdxGridReportLink.GetStyleSheetPrototype: TdxCustomReportLinkStyleSheet;
begin
Result := GridLinkStyleSheetPrototype;
end;
procedure TdxGridReportLink.PrepareConstruct;
begin
inherited;
DelimitersHardVert.Clear;
FReportRows.Clear;
ReportCells.LookAndFeel := nil;//ReportCells.CreateGroupLookAndFeel(TdxPSReportGroupNullLookAndFeel);
if OptionsExpanding.HasAny then
DoExpandRows;
CalculateProcessParams;
HostInfoServices.Initialize;
end;
procedure TdxGridReportLink.DoCustomDrawBandCell(ACanvas: TCanvas;
AView: TcxGridBandedTableView; ABand: TcxGridBand; AnItem: TdxReportCellString;
var ADone: Boolean);
begin
if Assigned(FOnCustomDrawBandCell) then
FOnCustomDrawBandCell(Self, ACanvas, AView, ABand, AnItem, ADone);
end;
procedure TdxGridReportLink.DoCustomDrawCardRowCaptionCell(ACanvas: TCanvas;
AView: TcxGridCardView; ACard: TcxGridCard; ARow: TcxGridCardViewRow;
AnItem: TdxReportCellString; var ADone: Boolean);
begin
if Assigned(FOnCustomDrawCardRowCaptionCell) then
FOnCustomDrawCardRowCaptionCell(Self, ACanvas, AView, ACard, ARow, AnItem, ADone);
end;
procedure TdxGridReportLink.DoCustomDrawCardRowDataCell(ACanvas: TCanvas;
AView: TcxGridCardView; ACard: TcxGridCard; ARow: TcxGridCardViewRow;
AnItem: TAbstractdxReportCellData; var ADone: Boolean);
begin
if Assigned(FOnCustomDrawCardRowDataCell) then
FOnCustomDrawCardRowDataCell(Self, ACanvas, AView, ACard, ARow, AnItem, ADone);
end;
procedure TdxGridReportLink.DoCustomDrawCell(ACanvas: TCanvas;
AView: TcxCustomGridTableView; ARecord: TcxCustomGridRecord;
AColumn: TcxGridColumn; AnItem: TAbstractdxReportCellData; var ADone: Boolean);
begin
if Assigned(FOnCustomDrawCell) then
FOnCustomDrawCell(Self, ACanvas, AView, ARecord, AColumn, AnItem, ADone);
end;
procedure TdxGridReportLink.DoCustomDrawFilterBar(ACanvas: TCanvas;
AView: TcxCustomGridTableView; AnItem: TdxReportCellString; var ADone: Boolean);
begin
if Assigned(FOnCustomDrawFilterBar) then
FOnCustomDrawFilterBar(Self, ACanvas, AView, AnItem, ADone);
end;
procedure TdxGridReportLink.DoCustomDrawFooterCell(ACanvas: TCanvas;
AView: TcxGridTableView; ARecord: TcxCustomGridRecord; AColumn: TcxGridColumn;
ALevel: Integer; AnItem: TdxReportCellString; var ADone: Boolean);
begin
if Assigned(FOnCustomDrawFooterCell) then
FOnCustomDrawFooterCell(Self, ACanvas, AView, ARecord, AColumn, ALevel, AnItem, ADone);
end;
procedure TdxGridReportLink.DoCustomDrawHeaderCell(ACanvas: TCanvas;
AView: TcxGridTableView; AColumn: TcxGridColumn; AnItem: TdxReportCellString;
var ADone: Boolean);
begin
if Assigned(FOnCustomDrawHeaderCell) then
FOnCustomDrawHeaderCell(Self, ACanvas, AView, AColumn, AnItem, ADone);
end;
procedure TdxGridReportLink.DoCustomDrawLevelCaption(ACanvas: TCanvas;
AView: TcxCustomGridView; AnItem: TdxReportCellString; var ADone: Boolean);
begin
if Assigned(FOnCustomDrawLevelCaption) then
FOnCustomDrawLevelCaption(Self, ACanvas, AView, AnItem, ADone);
end;
procedure TdxGridReportLink.DoGetCellHeight(AView: TcxCustomGridTableView;
ARecord: TcxCustomGridRecord; ATableItem: TcxCustomGridTableItem;
var AHeight: Integer);
begin
if Assigned(FOnGetCellHeight) then
FOnGetCellHeight(Self, AView, ARecord, ATableItem, AHeight);
end;
procedure TdxGridReportLink.DoGetCustomPageBreaks;
begin
if Assigned(FOnGetCustomPageBreaks) then FOnGetCustomPageBreaks(Self);
end;
procedure TdxGridReportLink.DoInitializeBandCell(AView: TcxGridBandedTableView;
ABand: TcxGridBand; AnItem: TdxReportCellString);
begin
if Assigned(FOnInitializeBandCell) then
FOnInitializeBandCell(Self, AView, ABand, AnItem);
end;
procedure TdxGridReportLink.DoInitializeCardRowCaptionCell(AView: TcxGridCardView;
ACard: TcxGridCard; ARow: TcxGridCardViewRow; AnItem: TdxReportCellString);
begin
if Assigned(FOnInitializeCardRowCaptionCell) then
FOnInitializeCardRowCaptionCell(Self, AView, ACard, ARow, AnItem);
end;
procedure TdxGridReportLink.DoInitializeCardRowDataCell(AView: TcxGridCardView;
ACard: TcxGridCard; ARow: TcxGridCardViewRow; AnItem: TAbstractdxReportCellData);
begin
if Assigned(FOnInitializeCardRowDataCell) then
FOnInitializeCardRowDataCell(Self, AView, ACard, ARow, AnItem);
end;
procedure TdxGridReportLink.DoInitializeCell(AView: TcxCustomGridTableView;
ARecord: TcxCustomGridRecord; AColumn: TcxGridColumn; AnItem: TAbstractdxReportCellData);
begin
if Assigned(FOnInitializeCell) then
FOnInitializeCell(Self, AView, ARecord, AColumn, AnItem);
end;
{$IFDEF CHARTVIEW}
procedure TdxGridReportLink.DoInitializeChartCell(AView: TcxGridChartView;
AnItem: TdxReportCellGraphic);
begin
if Assigned(FOnInitializeChartCell) then
FOnInitializeChartCell(Self, AView, AnItem);
end;
{$ENDIF}
procedure TdxGridReportLink.DoInitializeFilterBar(AView: TcxCustomGridTableView;
AnItem: TdxReportCellString);
begin
if Assigned(FOnInitializeFilterBar) then
FOnInitializeFilterBar(Self, AView, AnItem);
end;
procedure TdxGridReportLink.DoInitializeFooterCell(AView: TcxGridTableView;
ARecord: TcxCustomGridRecord; AColumn: TcxGridColumn; ALevel: Integer;
AnItem: TdxReportCellString);
begin
if Assigned(FOnInitializeFooterCell) then
FOnInitializeFooterCell(Self, AView, ARecord, AColumn, ALevel, AnItem);
end;
procedure TdxGridReportLink.DoInitializeHeaderCell(AView: TcxGridTableView;
AColumn: TcxGridColumn; AnItem: TdxReportCellString);
begin
if Assigned(FOnInitializeHeaderCell) then
FOnInitializeHeaderCell(Self, AView, AColumn, AnItem);
end;
procedure TdxGridReportLink.DoInitializeLevelCaption(AView: TcxCustomGridView;
AnItem: TdxReportCellString);
begin
if Assigned(FOnInitializeLevelCaption) then
FOnInitializeLevelCaption(Self, AView, AnItem);
end;
procedure TdxGridReportLink.CreateOptions;
begin
inherited;
FOptionsCards := GetOptionsCardsClass.Create(Self);
{$IFDEF CHARTVIEW}
FOptionsCharts := GetOptionsChartsClass.Create(Self);
{$ENDIF}
FOptionsDetails := GetOptionsDetailsClass.Create(Self);
FOptionsLevels := GetOptionsLevelsClass.Create(Self);
end;
procedure TdxGridReportLink.DestroyOptions;
begin
FreeAndNil(FOptionsLevels);
FreeAndNil(FOptionsDetails);
{$IFDEF CHARTVIEW}
FreeAndNil(FOptionsCharts);
{$ENDIF}
FreeAndNil(FOptionsCards);
inherited;
end;
function TdxGridReportLink.GetOptionsCardsClass: TdxGridReportLinkOptionsCardsClass;
begin
Result := TdxGridReportLinkOptionsCards;
end;
{$IFDEF CHARTVIEW}
function TdxGridReportLink.GetOptionsChartsClass: TdxGridReportLinkOptionsChartsClass;
begin
Result := TdxGridReportLinkOptionsCharts;
end;
{$ENDIF}
function TdxGridReportLink.GetOptionsDetailsClass: TdxGridReportLinkOptionsDetailsClass;
begin
Result := TdxGridReportLinkOptionsDetails;
end;
function TdxGridReportLink.GetOptionsExpandingClass: TdxCustomReportLinkOptionsExpandingClass;
begin
Result := TdxGridReportLinkOptionsExpanding;
end;
function TdxGridReportLink.GetOptionsFormattingClass: TdxCustomReportLinkOptionsFormattingClass;
begin
Result := TdxGridReportLinkOptionsFormatting;
end;
function TdxGridReportLink.GetOptionsLevelsClass: TdxGridReportLinkOptionsLevelsClass;
begin
Result := TdxGridReportLinkOptionsLevels;
end;
function TdxGridReportLink.GetOptionsOnEveryPageClass: TdxCustomTableControlReportLinkOptionsOnEveryPageClass;
begin
Result := TdxGridReportLinkOptionsOnEveryPage;
end;
function TdxGridReportLink.GetOptionsPaginationClass: TdxCustomReportLinkOptionsPaginationClass;
begin
Result := TdxGridReportLinkOptionsPagination;
end;
function TdxGridReportLink.GetOptionsPreviewClass: TdxCustomTableControlReportLinkOptionsPreviewClass;
begin
Result := TdxGridReportLinkOptionsPreview;
end;
function TdxGridReportLink.GetOptionsRefinementsClass: TdxCustomReportLinkOptionsRefinementsClass;
begin
Result := TdxGridReportLinkOptionsRefinements;
end;
function TdxGridReportLink.GetOptionsSelectionClass: TdxCustomTableControlReportLinkOptionsSelectionClass;
begin
Result := TdxGridReportLinkOptionsSelection;
end;
function TdxGridReportLink.GetOptionsSizeClass: TdxCustomReportLinkOptionsSizeClass;
begin
Result := TdxGridReportLinkOptionsSize;
end;
function TdxGridReportLink.GetOptionsViewClass: TdxCustomReportLinkOptionsViewClass;
begin
Result := TdxGridReportLinkOptionsView;
end;
procedure TdxGridReportLink.AddReportRow(AReportRow: TdxReportCell);
begin
FReportRows.Add(AReportRow);
end;
procedure TdxGridReportLink.AddVerticalHardDelimiter(ADelimiter: TdxReportCell);
var
R: TRect;
begin
R := ADelimiter.AbsoluteRect;
AddVerticalHardDelimiter(R.Top);
end;
procedure TdxGridReportLink.AddVerticalHardDelimiter(ADelimiter: Integer);
begin
FDelimitersHardVert.Add(TObject(ADelimiter));
end;
procedure TdxGridReportLink.BuildTopLevelView(AGridView: TcxCustomGridView);
begin
if (AGridView <> FProcessedView) and (AGridView <> nil) then BuildView(nil, AGridView);
end;
procedure TdxGridReportLink.BuildTopLevelViews;
var
MasterRow: TcxGridMasterDataRow;
CurrentView: TcxCustomGridView;
begin
if OptionsLevels.Unwrap and OptionsLevels.UnwrapTopLevel then
begin
FProcessedView := nil;
try
MasterRow := ActiveViewMasterRow;
if OptionsLevels.RiseActiveLevelOntoTop then
begin
if MasterRow <> nil then
CurrentView := MasterRow.ActiveDetailGridView
else
CurrentView := ActiveView;
BuildTopLevelView(CurrentView);
FProcessedView := CurrentView;
end;
if not AbortBuilding then
ForEachView(MasterRow, BuildTopLevelView);
finally
FProcessedView := nil;
end;
end
else
BuildTopLevelView(ActiveView);
end;
procedure TdxGridReportLink.BuildView(AMasterBuilder: TdxCustomGridViewBuilder;
AGridView: TcxCustomGridView);
begin
with CreateViewBuilder(AMasterBuilder, AGridView) do
try
Build;
finally
Free;
end;
end;
function TdxGridReportLink.CreateViewAdapter(AMasterAdapter: TdxCustomGridViewAdapter;
AGridView: TcxCustomGridView): TdxCustomGridViewAdapter;
begin
Result := dxGridViewBuildersFactory.CreateViewAdapter(AMasterAdapter, AGridView);
end;
function TdxGridReportLink.CreateViewBuilder(AMasterBuilder: TdxCustomGridViewBuilder;
AGridView: TcxCustomGridView): TdxCustomGridViewBuilder;
begin
Result := dxGridViewBuildersFactory.CreateViewBuilder(Self, AMasterBuilder, AGridView);
end;
procedure TdxGridReportLink.DoExpandRows;
begin
if OptionsLevels.Unwrap and OptionsLevels.UnwrapTopLevel then
ForEachView(ActiveViewMasterRow, DoExpandViewRows)
else
DoExpandViewRows(ActiveView);
end;
procedure TdxGridReportLink.DoExpandViewRows(AGridView: TcxCustomGridView);
begin
if AGridView <> nil then
with CreateViewAdapter(nil, AGridView) do
try
ExpandAllRows(OptionsExpanding, not OptionsDetails.OnlyFocusedView);
finally
Free;
end;
end;
procedure TdxGridReportLink.ForEachView(AMasterRow: TcxGridMasterDataRow; AProc: TdxGridViewProc);
var
I: Integer;
GridView: TcxCustomGridView;
Level: TcxGridLevel;
begin
if not Assigned(AProc) then Exit;
if AMasterRow <> nil then
for I := 0 to AMasterRow.DetailGridViewCount -1 do
begin
GridView := AMasterRow.DetailGridViews[I];
if GridView <> nil then
begin
Level := GridView.Level as TcxGridLevel;
if Level.Visible then AProc(GridView);
end;
if AbortBuilding then Break;
end
else
with Grid.Levels do
for I := 0 to VisibleCount - 1 do
begin
AProc(VisibleItems[I].GridView);
if AbortBuilding then Break;
end;
end;
function TdxGridReportLink.GetItemCustomDrawInfo(AnItem: TdxReportVisualItem;
out ADrawInfo: TdxGridCellCustomDrawInfo): TdxGridAttributeID;
begin
dxViewHelpersFactory.HelperClassByItem(AnItem).ExtractCustomDrawInfo(AnItem, ADrawInfo);
Result := ADrawInfo.GridAttributeID;
end;
function TdxGridReportLink.HasSiblings(AGridView: TcxCustomGridView): Boolean;
var
ValidViewCount, I: Integer;
begin
if AGridView <> nil then
begin
ValidViewCount := 0;
with TcxGridLevel(AGridView.PatternGridView.Level).Parent do
for I := 0 to VisibleCount - 1 do
begin
if VisibleItems[I].GridView <> nil then Inc(ValidViewCount);
if ValidViewCount > 1 then Break;
end;
Result := ValidViewCount > 1;
end
else
Result := False;
end;
function TdxGridReportLink.IsCardViewStyle(AStyle: TcxStyle): Boolean;
begin
Result := Styles.IsCardViewStyle(AStyle);
end;
function TdxGridReportLink.IsCustomDrawn(AnAttributeID: TdxGridAttributeID): Boolean;
begin
Result := False;
case AnAttributeID of
dxGridBandID:
Result := Assigned(FOnCustomDrawBandCell);
dxGridCardRowCaptionID:
Result := Assigned(FOnCustomDrawCardRowCaptionCell);
dxGridCardRowDataID:
Result := Assigned(FOnCustomDrawCardRowDataCell);
dxGridFilterBarID:
Result := Assigned(FOnCustomDrawFilterBar);
dxGridFooterID,
dxGridGroupFooterID:
Result := Assigned(FOnCustomDrawFooterCell);
dxGridHeaderID:
Result := Assigned(FOnCustomDrawHeaderCell);
dxGridLevelCaptionID:
Result := Assigned(FOnCustomDrawLevelCaption);
dxGridRecordID:
Result := Assigned(FOnCustomDrawCell);
end;
end;
function TdxGridReportLink.IsOffice11StyleGrouping: Boolean;
begin
{$IFDEF DXVER500}
Result := ActiveViewHelper.IsOffice11StyleGrouping(ActiveView);
{$ELSE}
Result := False;
{$ENDIF}
end;
procedure TdxGridReportLink.CalculateProcessParams;
var
Adapter: TdxCustomGridViewAdapter;
View: TcxCustomGridView;
begin
View := ActiveView;
with FProcessParams do
if View = nil then
begin
HasMasterDetails := False;
HasMasterDetailsInTopView := False;
HasOnlyCards := False;
HasOnlyCharts := False;
HasUnwrapableData := False;
CanUseOnEveryPageMode := not IsAggregated;
end
else
begin
Adapter := CreateViewAdapter(nil, View);
try
HasUnwrapableData := HasSiblings(Grid.ActiveLevel.GridView);
HasMasterDetailsInTopView := View.IsDetail or View.IsMaster;
HasMasterDetails := (HasUnwrapableData and OptionsLevels.Unwrap) or
(View.IsMaster and not Adapter.AreAllMasterRowsCollapsed and
not (OptionsDetails.StartFromFocusedView and OptionsDetails.OnlyFocusedView));
HasOnlyCards := View is TcxGridCardView;
{$IFDEF CHARTVIEW}
HasOnlyCharts := View is TcxGridChartView;
{$ENDIF}
CanUseOnEveryPageMode := not IsAggregated and not HasMasterDetails and
Adapter.CanUseOnEveryPageMode; {Adapter.RecordCount <> 0}
finally
Adapter.Free;
end;
end;
end;
function TdxGridReportLink.CanAttributeBeUsedOnEveryPage(AnAttribute: TdxGridAttributeClass): Boolean;
begin
Result := ProcessParams.CanUseOnEveryPageMode and OptionsOnEveryPage.HasInstalledAttribute(AnAttribute);
end;
function TdxGridReportLink.IsAttributeUsedOnEveryPage(AnAttribute: TdxGridAttributeClass): Boolean;
begin
Result := CanAttributeBeUsedOnEveryPage(AnAttribute) or not OptionsView.HasInstalledAttribute(AnAttribute);
end;
function TdxGridReportLink.GetActiveStyles: TdxGridReportLinkStyles;
begin
Result := inherited ActiveStyles as TdxGridReportLinkStyles;
end;
function TdxGridReportLink.GetActiveView: TcxCustomGridView;
var
Level: TcxGridLevel;
begin
Result := nil;
if Grid <> nil then
Result := Grid.FocusedView;
if (Result <> nil) and not OptionsDetails.StartFromFocusedView then
begin
Level := Result.Level as TcxGridLevel;
while not Level.IsTop do
Level := Level.Parent;
Result := Level.GridView;
end;
end;
function TdxGridReportLink.GetActiveViewHelper: TdxCustomGridViewHelperClass;
begin
if ActiveView = nil then
Result := TdxNullGridViewHelper
else
Result := dxViewHelpersFactory[ActiveView];
end;
function TdxGridReportLink.GetActiveViewMasterRow: TcxGridMasterDataRow;
begin
Result := nil;
with ActiveView do
if MasterGridRecordIndex <> -1 then
Result := (MasterGridView as TcxGridTableView).ViewData.Rows[MasterGridRecordIndex] as TcxGridMasterDataRow;
end;
function TdxGridReportLink.GetActiveViewParentLevel: TcxGridLevel;
var
GridView: TcxCustomGridView;
begin
Result := nil;
GridView := ActiveView;
if GridView <> nil then
Result := TcxGridLevel(GridView.Level).Parent;
end;
function TdxGridReportLink.GetDesignWindow: TdxfmGridReportLinkDesignWindow;
begin
Result := inherited DesignWindow as TdxfmGridReportLinkDesignWindow;
end;
function TdxGridReportLink.GetGrid: TcxGrid;
begin
Result := TcxGrid(Component);
end;
function TdxGridReportLink.GetOptionsExpanding: TdxGridReportLinkOptionsExpanding;
begin
Result := inherited OptionsExpanding as TdxGridReportLinkOptionsExpanding;
end;
function TdxGridReportLink.GetOptionsFormatting: TdxGridReportLinkOptionsFormatting;
begin
Result := inherited OptionsFormatting as TdxGridReportLinkOptionsFormatting;
end;
function TdxGridReportLink.GetOptionsOnEveryPage: TdxGridReportLinkOptionsOnEveryPage;
begin
Result := inherited OptionsOnEveryPage as TdxGridReportLinkOptionsOnEveryPage;
end;
function TdxGridReportLink.GetOptionsPagination: TdxGridReportLinkOptionsPagination;
begin
Result := inherited OptionsPagination as TdxGridReportLinkOptionsPagination;
end;
function TdxGridReportLink.GetOptionsPreview: TdxGridReportLinkOptionsPreview;
begin
Result := inherited OptionsPreview as TdxGridReportLinkOptionsPreview;
end;
function TdxGridReportLink.GetOptionsRefinements: TdxGridReportLinkOptionsRefinements;
begin
Result := inherited OptionsRefinements as TdxGridReportLinkOptionsRefinements;
end;
function TdxGridReportLink.GetOptionsSelection: TdxGridReportLinkOptionsSelection;
begin
Result := inherited OptionsSelection as TdxGridReportLinkOptionsSelection;
end;
function TdxGridReportLink.GetOptionsSize: TdxGridReportLinkOptionsSize;
begin
Result := inherited OptionsSize as TdxGridReportLinkOptionsSize;
end;
function TdxGridReportLink.GetOptionsView: TdxGridReportLinkOptionsView;
begin
Result := inherited OptionsView as TdxGridReportLinkOptionsView;
end;
function TdxGridReportLink.GetReportRow(Index: Integer): TdxReportCell;
begin
Result := TdxReportCell(FReportRows[Index]);
end;
function TdxGridReportLink.GetReportRowByGridRecord(GridRecord: TcxCustomGridRecord): TdxReportCell;
var
I: Integer;
begin
if GridRecord <> nil then
for I := 0 to ReportRowCount - 1 do
begin
Result := ReportRows[I];
if Result.Data = Integer(GridRecord) then Exit;
end;
Result := nil;
end;
function TdxGridReportLink.GetReportRowCount: Integer;
begin
Result := FReportRows.Count;
end;
function TdxGridReportLink.GetStyles: TdxGridReportLinkStyles;
begin
Result := inherited Styles as TdxGridReportLinkStyles;
end;
procedure TdxGridReportLink.SetOnCustomDrawBandCell(Value: TdxGridReportLinkCustomDrawBandCellEvent);
begin
if @FOnCustomDrawBandCell <> @Value then
begin
FOnCustomDrawBandCell := Value;
if SupportedCustomDraw then LinkModified(True);
end;
end;
procedure TdxGridReportLink.SetOnCustomDrawCell(Value: TdxGridReportLinkCustomDrawCellEvent);
begin
if @FOnCustomDrawCell <> @Value then
begin
FOnCustomDrawCell := Value;
if SupportedCustomDraw then LinkModified(True);
end;
end;
procedure TdxGridReportLink.SetOnCustomDrawCardRowCaptionCell(Value: TdxGridReportLinkCustomDrawCardRowCaptionCellEvent);
begin
if @FOnCustomDrawCardRowCaptionCell <> @Value then
begin
FOnCustomDrawCardRowCaptionCell := Value;
if SupportedCustomDraw then LinkModified(True);
end;
end;
procedure TdxGridReportLink.SetOnCustomDrawCardRowDataCell(Value: TdxGridReportLinkCustomDrawCardRowDataCellEvent);
begin
if @FOnCustomDrawCardRowDataCell <> @Value then
begin
FOnCustomDrawCardRowDataCell := Value;
if SupportedCustomDraw then LinkModified(True);
end;
end;
procedure TdxGridReportLink.SetOnCustomDrawFilterBar(Value: TdxGridReportLinkCustomDrawFilterBarEvent);
begin
if @FOnCustomDrawFilterBar <> @Value then
begin
FOnCustomDrawFilterBar := Value;
if SupportedCustomDraw then LinkModified(True);
end;
end;
procedure TdxGridReportLink.SetOnCustomDrawFooterCell(Value: TdxGridReportLinkCustomDrawFooterCellEvent);
begin
if @FOnCustomDrawFooterCell <> @Value then
begin
FOnCustomDrawFooterCell := Value;
if SupportedCustomDraw then LinkModified(True);
end;
end;
procedure TdxGridReportLink.SetOnCustomDrawHeaderCell(Value: TdxGridReportLinkCustomDrawHeaderCellEvent);
begin
if @FOnCustomDrawHeaderCell <> @Value then
begin
FOnCustomDrawHeaderCell := Value;
if SupportedCustomDraw then LinkModified(True);
end;
end;
procedure TdxGridReportLink.SetOnCustomDrawLevelCaption(Value: TdxGridReportLinkCustomDrawLevelCaptionEvent);
begin
if @FOnCustomDrawLevelCaption <> @Value then
begin
FOnCustomDrawLevelCaption := Value;
if SupportedCustomDraw then LinkModified(True);
end;
end;
procedure TdxGridReportLink.SetOptionsCards(Value: TdxGridReportLinkOptionsCards);
begin
OptionsCards.Assign(Value);
end;
{$IFDEF CHARTVIEW}
procedure TdxGridReportLink.SetOptionsCharts(Value: TdxGridReportLinkOptionsCharts);
begin
OptionsCharts.Assign(Value);
end;
{$ENDIF}
procedure TdxGridReportLink.SetOptionsDetails(Value: TdxGridReportLinkOptionsDetails);
begin
OptionsDetails.Assign(Value);
end;
procedure TdxGridReportLink.SetOptionsExpanding(Value: TdxGridReportLinkOptionsExpanding);
begin
OptionsExpanding.Assign(Value);
end;
procedure TdxGridReportLink.SetOptionsFormatting(Value: TdxGridReportLinkOptionsFormatting);
begin
inherited OptionsFormatting := Value;
end;
procedure TdxGridReportLink.SetOptionsLevels(Value: TdxGridReportLinkOptionsLevels);
begin
OptionsLevels.Assign(Value);
end;
procedure TdxGridReportLink.SetOptionsOnEveryPage(Value: TdxGridReportLinkOptionsOnEveryPage);
begin
inherited OptionsOnEveryPage := Value;
end;
procedure TdxGridReportLink.SetOptionsPagination(Value: TdxGridReportLinkOptionsPagination);
begin
inherited OptionsPagination := Value;
end;
procedure TdxGridReportLink.SetOptionsPreview(Value: TdxGridReportLinkOptionsPreview);
begin
inherited OptionsPreview := Value;
end;
procedure TdxGridReportLink.SetOptionsRefinements(Value: TdxGridReportLinkOptionsRefinements);
begin
inherited OptionsRefinements := Value;
end;
procedure TdxGridReportLink.SetOptionsSelection(Value: TdxGridReportLinkOptionsSelection);
begin
inherited OptionsSelection := Value;
end;
procedure TdxGridReportLink.SetOptionsSize(Value: TdxGridReportLinkOptionsSize);
begin
inherited OptionsSize := Value;
end;
procedure TdxGridReportLink.SetOptionsView(Value: TdxGridReportLinkOptionsView);
begin
inherited OptionsView := Value;
end;
procedure TdxGridReportLink.SetStyles(Value: TdxGridReportLinkStyles);
begin
inherited Styles := Value;
end;
{ TcxGridCardView2OptionsView }
constructor TcxGridCardView2OptionsView.Create(AGridView: TcxCustomGridView);
begin
inherited;
FCardBorders := False;
FGridLineColor := clDefault;
FGridLines := glNone;
FShadowDepth := 4;
end;
procedure TcxGridCardView2OptionsView.Assign(Source: TPersistent);
begin
if Source is TcxGridCardView2OptionsView then
with TcxGridCardView2OptionsView(Source) do
begin
Self.CardBorders := CardBorders;
Self.GridLineColor := GridLineColor;
Self.GridLines := GridLines;
Self.ShadowDepth := ShadowDepth;
end;
inherited;
end;
function TcxGridCardView2OptionsView.GetShadowVisible: Boolean;
begin
Result := ShadowDepth <> 0;
end;
procedure TcxGridCardView2OptionsView.SetCardBorders(Value: Boolean);
begin
if FCardBorders <> Value then
begin
FCardBorders := Value;
{$IFDEF DXVER500}
Changed(vcSize);
{$ELSE}
SizeChanged;
{$ENDIF}
end;
end;
procedure TcxGridCardView2OptionsView.SetGridLineColor(Value: TColor);
begin
if FGridLineColor <> Value then
begin
FGridLineColor := Value;
{$IFDEF DXVER500}
Changed(vcLayout);
{$ELSE}
LayoutChanged;
{$ENDIF}
end;
end;
procedure TcxGridCardView2OptionsView.SetGridLines(Value: TcxGridLines);
begin
if FGridLines <> Value then
begin
FGridLines := Value;
{$IFDEF DXVER500}
Changed(vcSize);
{$ELSE}
SizeChanged;
{$ENDIF}
end;
end;
procedure TcxGridCardView2OptionsView.SetShadowDepth(Value: Integer);
begin
if Value < 0 then Value := 0;
if FShadowDepth <> Value then
begin
FShadowDepth := Value;
{$IFDEF DXVER500}
Changed(vcSize);
{$ELSE}
SizeChanged;
{$ENDIF}
end;
end;
{ TcxGridCardView2Styles }
procedure TcxGridCardView2Styles.Assign(Source: TPersistent);
begin
if Source is TcxGridCardView2Styles then
with TcxGridCardView2Styles(Source) do
begin
Self.CardShadow := CardShadow;
end;
inherited;
end;
procedure TcxGridCardView2Styles.GetCardShadowParams(ARecord: TcxCustomGridRecord;
out AParams: TcxViewParams);
var
AStyle: TcxStyle;
begin
AStyle := nil;
if Assigned(FOnGetCardShadowStyle) then
FOnGetCardShadowStyle(GridView, ARecord, AStyle);
GetViewParams(vsCardShadow, ARecord, AStyle, AParams);
end;
procedure TcxGridCardView2Styles.GetDefaultViewParams(Index: Integer; AData: TObject;
out AParams: TcxViewParams);
begin
inherited;
if Index = vsCardShadow then AParams.Color := clWindowText;
end;
type
TcxGridCardViewInfo2 = class;
TcxGridCardViewViewInfo2 = class;
TcxGridCardRowCaptionViewInfo2 = class(TcxGridCardRowCaptionViewInfo)
private
function GetCardViewInfo: TcxGridCardViewInfo2;
protected
function GetBorderColor(AIndex: TcxBorder): TColor; override;
function GetBorders: TcxBorders; override;
function GetBorderWidth(AIndex: TcxBorder): Integer; override;
public
property CardViewInfo: TcxGridCardViewInfo2 read GetCardViewInfo;
end;
TcxGridCardRowDataViewInfo2 = class(TcxGridCardRowDataViewInfo)
private
function GetCardViewInfo: TcxGridCardViewInfo2;
protected
function GetBorderColor(AIndex: TcxBorder): TColor; override;
function GetBorders: TcxBorders; override;
function GetBorderWidth(AIndex: TcxBorder): Integer; override;
public
property CardViewInfo: TcxGridCardViewInfo2 read GetCardViewInfo;
end;
TcxGridCardDataRowViewInfo2 = class(TcxGridCardDataRowViewInfo)
protected
{$IFDEF GRID6}class {$ENDIF}function GetCaptionViewInfoClass: TcxGridCardRowCaptionViewInfoClass; override;
{$IFDEF GRID6}class {$ENDIF}function GetDataViewInfoClass: TcxGridCardRowDataViewInfoClass; override;
end;
TcxGridCardCaptionRowViewInfo2 = class(TcxGridCardRowViewInfo)
protected
{$IFDEF GRID6}class {$ENDIF}function GetCaptionViewInfoClass: TcxGridCardRowCaptionViewInfoClass; override;
{$IFDEF GRID6}class {$ENDIF}function GetDataViewInfoClass: TcxGridCardRowDataViewInfoClass; override;
end;
TcxGridCardPainter2 = class(TcxGridCardPainter)
private
function GetViewInfo: TcxGridCardViewInfo2;
protected
procedure DrawBottomShadowAndRestSpace; virtual;
{$IFDEF DXVER500}
procedure DrawCardBorder; override;
{$ENDIF}
procedure DrawRightShadowAndRestSpace; virtual;
procedure DrawShadows; virtual;
procedure Paint; override;
property ViewInfo: TcxGridCardViewInfo2 read GetViewInfo;
end;
TcxGridCardViewInfo2 = class(TcxGridCardViewInfo)
private
function GetGridView: TcxGridCardView2;
protected
function CalculateHeight: Integer; override;
function GetContentWidth: Integer; override;
function GetPainterClass: TcxCustomGridCellPainterClass; override;
{$IFDEF GRID6}class {$ENDIF}function GetRowViewInfoClass(ARow: TcxGridCardViewRow): TcxGridCardRowViewInfoClass; override;
function GetBottomShadowRect: TRect; virtual;
function GetBottomShadowRestRect: TRect; virtual;
function GetCardRowCaptionBorders(ARowCaption: TcxGridCardRowCaptionViewInfo2): TcxBorders; virtual;
function GetCardRowDataBorders(ARowData: TcxGridCardRowDataViewInfo2): TcxBorders; virtual;
function GetGridLineColor: TColor; virtual;
function GetRightShadowRect: TRect; virtual;
function GetRightShadowRestRect: TRect; virtual;
function GetShadowColor: TColor; virtual;
function GetShadowDepth: Integer; virtual;
function GetShadowRestColor: TColor; virtual;
property GridView: TcxGridCardView2 read GetGridView;
public
property BottomShadowRect: TRect read GetBottomShadowRect;
property BottomShadowRestRect: TRect read GetBottomShadowRestRect;
property GridLineColor: TColor read GetGridLineColor;
property RightShadowRect: TRect read GetRightShadowRect;
property RightShadowRestRect: TRect read GetRightShadowRestRect;
property ShadowColor: TColor read GetShadowColor;
property ShadowDepth: Integer read GetShadowDepth;
property ShadowRestColor: TColor read GetShadowRestColor;
end;
TcxGridCard2 = class(TcxGridCard)
protected
function GetViewInfoClass: TcxCustomGridRecordViewInfoClass; override;
end;
TcxGridCardViewViewData2 = class(TcxGridCardViewViewData)
protected
function GetRecordClass(ARecordInfo: TcxRowInfo): TcxCustomGridRecordClass; override;
end;
TcxGridCardsHorizontalViewInfo2 = class(TcxGridCardsHorizontalViewInfo)
private
function GetGridView: TcxGridCardView2;
protected
function CalculateCardHeight: Integer; override;
function GetShadowDepth: Integer; virtual;
property GridView: TcxGridCardView2 read GetGridView;
public
property ShadowDepth: Integer read GetShadowDepth;
end;
TcxGridCardsVerticalViewInfo2 = class(TcxGridCardsVerticalViewInfo)
private
function GetGridView: TcxGridCardView2;
protected
function CalculateCardHeight: Integer; override;
function GetShadowDepth: Integer; virtual;
property GridView: TcxGridCardView2 read GetGridView;
public
property ShadowDepth: Integer read GetShadowDepth;
end;
TcxGridCardViewViewInfo2 = class(TcxGridCardViewViewInfo)
protected
function GetRecordsViewInfoClass: TcxCustomGridRecordsViewInfoClass; override;
end;
{ TcxGridCardRowCaptionViewInfo2 }
function TcxGridCardRowCaptionViewInfo2.GetBorderColor(AIndex: TcxBorder): TColor;
begin
Result := CardViewInfo.GridLineColor;
end;
function TcxGridCardRowCaptionViewInfo2.GetBorders: TcxBorders;
begin
Result := CardViewInfo.GetCardRowCaptionBorders(Self);
end;
function TcxGridCardRowCaptionViewInfo2.GetBorderWidth(AIndex: TcxBorder): Integer;
begin
Result := 1;
end;
function TcxGridCardRowCaptionViewInfo2.GetCardViewInfo: TcxGridCardViewInfo2;
begin
Result := inherited CardViewInfo as TcxGridCardViewInfo2
end;
{ TcxGridCardRowDataViewInfo2 }
function TcxGridCardRowDataViewInfo2.GetBorderColor(AIndex: TcxBorder): TColor;
begin
Result := CardViewInfo.GridLineColor;
end;
function TcxGridCardRowDataViewInfo2.GetBorders: TcxBorders;
begin
Result := CardViewInfo.GetCardRowDataBorders(Self);
end;
function TcxGridCardRowDataViewInfo2.GetBorderWidth(AIndex: TcxBorder): Integer;
begin
Result := 1;
end;
function TcxGridCardRowDataViewInfo2.GetCardViewInfo: TcxGridCardViewInfo2;
begin
Result := inherited CardViewInfo as TcxGridCardViewInfo2
end;
{ TcxGridCardDataRowViewInfo2 }
{$IFDEF GRID6}class {$ENDIF}function TcxGridCardDataRowViewInfo2.GetCaptionViewInfoClass: TcxGridCardRowCaptionViewInfoClass;
begin
Result := TcxGridCardRowCaptionViewInfo2;
end;
{$IFDEF GRID6}class {$ENDIF}function TcxGridCardDataRowViewInfo2.GetDataViewInfoClass: TcxGridCardRowDataViewInfoClass;
begin
Result := TcxGridCardRowDataViewInfo2;
end;
{ TcxGridCardCaptionRowViewInfo2 }
{$IFDEF GRID6}class {$ENDIF}function TcxGridCardCaptionRowViewInfo2.GetCaptionViewInfoClass: TcxGridCardRowCaptionViewInfoClass;
begin
Result := TcxGridCardRowCaptionViewInfo2;
end;
{$IFDEF GRID6}class {$ENDIF}function TcxGridCardCaptionRowViewInfo2.GetDataViewInfoClass: TcxGridCardRowDataViewInfoClass;
begin
Result := TcxGridCardRowDataViewInfo2;
end;
{ TcxGridCardPainter2 }
procedure TcxGridCardPainter2.DrawBottomShadowAndRestSpace;
var
R: TRect;
begin
R := ViewInfo.BottomShadowRect;
if Canvas.RectVisible(R) then
begin
Canvas.Brush.Color := ViewInfo.ShadowColor;
Canvas.FillRect(R);
end;
R := ViewInfo.BottomShadowRestRect;
if Canvas.RectVisible(R) then
begin
Canvas.Brush.Color := ViewInfo.ShadowRestColor;
Canvas.FillRect(R);
end;
end;
{$IFDEF DXVER500}
procedure TcxGridCardPainter2.DrawCardBorder;
begin
with ViewInfo, Self.Canvas do
FrameRect(Bounds, clWindow, CardBorderWidth);
end;
{$ENDIF}
procedure TcxGridCardPainter2.DrawRightShadowAndRestSpace;
var
R: TRect;
begin
R := ViewInfo.RightShadowRect;
if Canvas.RectVisible(R) then
begin
Canvas.Brush.Color := ViewInfo.ShadowColor;
Canvas.FillRect(R);
end;
R := ViewInfo.RightShadowRestRect;
if Canvas.RectVisible(R) then
begin
Canvas.Brush.Color := ViewInfo.ShadowRestColor;
Canvas.FillRect(R);
end;
end;
procedure TcxGridCardPainter2.DrawShadows;
var
Color: TColor;
begin
Color := Canvas.Brush.Color;
DrawBottomShadowAndRestSpace;
DrawRightShadowAndRestSpace;
Canvas.Brush.Color := Color;
end;
procedure TcxGridCardPainter2.Paint;
begin
DrawShadows;
inherited;
end;
function TcxGridCardPainter2.GetViewInfo: TcxGridCardViewInfo2;
begin
Result := TcxGridCardViewInfo2(inherited ViewInfo);
end;
{ TcxGridCardViewInfo2 }
function TcxGridCardViewInfo2.CalculateHeight: Integer;
begin
Result := inherited CalculateHeight;
if RecordsViewInfo.AutoDataRecordHeight or (RecordsViewInfo.CardHeight = -1) then
Inc(Result, ShadowDepth);
end;
function TcxGridCardViewInfo2.GetContentWidth: Integer;
begin
Result := inherited GetContentWidth - ShadowDepth;
end;
function TcxGridCardViewInfo2.GetPainterClass: TcxCustomGridCellPainterClass;
begin
Result := TcxGridCardPainter2;
end;
{$IFDEF GRID6}class {$ENDIF}function TcxGridCardViewInfo2.GetRowViewInfoClass(ARow: TcxGridCardViewRow): TcxGridCardRowViewInfoClass;
const
RowViewInfoClasses: array[TcxGridCardViewRowKind] of TcxGridCardRowViewInfoClass =
(TcxGridCardDataRowViewInfo2, TcxGridCardCaptionRowViewInfo2{$IFDEF GRID6}, TcxGridCardCaptionRowViewInfo2{$ENDIF});
begin
Result := RowViewInfoClasses[ARow.Kind];
end;
function TcxGridCardViewInfo2.GetBottomShadowRect: TRect;
begin
Result := ContentBounds;
Inc(Result.Left, ShadowDepth);
Result.Top := Result.Bottom - ShadowDepth;
end;
function TcxGridCardViewInfo2.GetBottomShadowRestRect: TRect;
begin
Result := ContentBounds;
Result.Right := Result.Left + ShadowDepth;
Result.Top := Result.Bottom - ShadowDepth;
end;
function TcxGridCardViewInfo2.GetCardRowCaptionBorders(ARowCaption: TcxGridCardRowCaptionViewInfo2): TcxBorders;
begin
Result := [bLeft, bTop];
if ARowCaption.Row.VisibleIndex = GridView.RowCount - 1 then
Include(Result, bBottom);
with TcxGridCardView2OptionsView(GridView.OptionsView) do
begin
if not CardBorders then
begin
Exclude(Result, bLeft);
if ARowCaption.Row.VisibleIndex = 0 then
Exclude(Result, bTop);
if ARowCaption.Row.VisibleIndex = Self.GridView.RowCount - 1 then
Exclude(Result, bBottom);
end;
if not (GridLines in [glBoth, glHorizontal]) and (ARowCaption.Row.VisibleIndex > 0) then
Exclude(Result, bTop);
end;
end;
function TcxGridCardViewInfo2.GetCardRowDataBorders(ARowData: TcxGridCardRowDataViewInfo2): TcxBorders;
begin
Result := [bLeft, bTop, bRight];
if ARowData.Row.VisibleIndex = GridView.RowCount - 1 then
Include(Result, bBottom);
with TcxGridCardView2OptionsView(GridView.OptionsView) do
begin
if not CardBorders then
begin
Exclude(Result, bRight);
if ARowData.Row.VisibleIndex = 0 then
Exclude(Result, bTop);
if ARowData.Row.VisibleIndex = Self.GridView.RowCount - 1 then
Exclude(Result, bBottom);
end;
if not (GridLines in [glBoth, glHorizontal]) and (ARowData.Row.VisibleIndex > 0) then
Exclude(Result, bTop);
if not (GridLines in [glBoth, glVertical]) then
Exclude(Result, bLeft);
end;
end;
function TcxGridCardViewInfo2.GetGridLineColor: TColor;
begin
Result := TcxGridCardView2OptionsView(GridView.OptionsView).GridLineColor;
if Result = clDefault then
Result := GridView.LookAndFeelPainter.DefaultGridLineColor;
end;
function TcxGridCardViewInfo2.GetRightShadowRect: TRect;
begin
Result := ContentBounds;
Result.Left := Result.Right - ShadowDepth;
Inc(Result.Top, ShadowDepth);
end;
function TcxGridCardViewInfo2.GetRightShadowRestRect: TRect;
begin
Result := ContentBounds;
Result.Left := Result.Right - ShadowDepth;
Result.Bottom := Result.Top + ShadowDepth;
end;
function TcxGridCardViewInfo2.GetShadowColor: TColor;
var
Params: TcxViewParams;
begin
TcxGridCardView2Styles(GridView.Styles).GetCardShadowParams(GridRecord, Params);
Result := Params.Color;
if Result = clDefault then
Result := clWindowText;
end;
function TcxGridCardViewInfo2.GetShadowDepth: Integer;
begin
Result := TcxGridCardView2OptionsView(GridView.OptionsView).ShadowDepth;
end;
function TcxGridCardViewInfo2.GetShadowRestColor: TColor;
var
Params: TcxViewParams;
begin
TcxGridCardView2Styles(GridView.Styles).GetViewParams(vsBackground, nil, nil, Params);
Result := Params.Color;
end;
function TcxGridCardViewInfo2.GetGridView: TcxGridCardView2;
begin
Result := TcxGridCardView2(inherited GridView);
end;
{ TcxGridCard2 }
function TcxGridCard2.GetViewInfoClass: TcxCustomGridRecordViewInfoClass;
begin
Result := TcxGridCardViewInfo2;
end;
{ TcxGridCardViewViewData2 }
function TcxGridCardViewViewData2.GetRecordClass(ARecordInfo: TcxRowInfo): TcxCustomGridRecordClass;
begin
Result := TcxGridCard2;
end;
{ TcxGridCardsHorizontalViewInfo2 }
function TcxGridCardsHorizontalViewInfo2.GetGridView: TcxGridCardView2;
begin
Result := TcxGridCardView2(inherited GridView);
end;
function TcxGridCardsHorizontalViewInfo2.CalculateCardHeight: Integer;
begin
Result := inherited CalculateCardHeight + ShadowDepth;
end;
function TcxGridCardsHorizontalViewInfo2.GetShadowDepth: Integer;
begin
Result := TcxGridCardView2OptionsView(GridView.OptionsView).ShadowDepth;
end;
{ TcxGridCardsVerticalViewInfo2 }
function TcxGridCardsVerticalViewInfo2.GetGridView: TcxGridCardView2;
begin
Result := TcxGridCardView2(inherited GridView);
end;
function TcxGridCardsVerticalViewInfo2.CalculateCardHeight: Integer;
begin
Result := inherited CalculateCardHeight + ShadowDepth;
end;
function TcxGridCardsVerticalViewInfo2.GetShadowDepth: Integer;
begin
Result := TcxGridCardView2OptionsView(GridView.OptionsView).ShadowDepth;
end;
{ TcxGridCardViewViewInfo2 }
function TcxGridCardViewViewInfo2.GetRecordsViewInfoClass: TcxCustomGridRecordsViewInfoClass;
const
ViewInfoClasses: array[TcxGridCardViewLayoutDirection] of TcxCustomGridRecordsViewInfoClass =
(TcxGridCardsHorizontalViewInfo2, TcxGridCardsVerticalViewInfo2);
begin
Result := ViewInfoClasses[GridView.LayoutDirection];
end;
{ TcxGridCardView2 }
function TcxGridCardView2.GetOptionsViewClass: TcxCustomGridOptionsViewClass;
begin
Result := TcxGridCardView2OptionsView;
end;
function TcxGridCardView2.GetStylesClass: TcxCustomGridViewStylesClass;
begin
Result := TcxGridCardView2Styles;
end;
function TcxGridCardView2.GetViewDataClass: TcxCustomGridViewDataClass;
begin
Result := TcxGridCardViewViewData2;
end;
function TcxGridCardView2.GetViewInfoClass: TcxCustomGridViewInfoClass;
begin
Result := TcxGridCardViewViewInfo2;
end;
{ TdxfmGridReportLinkDesignWindow }
constructor TdxfmGridReportLinkDesignWindow.Create(AOwner: TComponent);
begin
HelpContext := dxhccxGridReportLinkDesigner;
inherited;
CreateControls;
SetActivePage;
end;
destructor TdxfmGridReportLinkDesignWindow.Destroy;
begin
dxPSPopupMan.dxPSPopupMenuController.UnregisterControl(lbxStyles);
inherited;
end;
procedure TdxfmGridReportLinkDesignWindow.DoInitialize;
begin
lbxStyles.ReportLinkStyles := ReportLink.ActiveStyles;
inherited;
RefreshStylesList;
CreateCardView;
//CreateChartView;
{.$IFNDEF DXVER500}
{.$ENDIF}
{$IFNDEF DXVER500}
chbxExpandCards.Visible := False;
//chbxTransparentRichEdits.Visible := False; {.3}
//bvlRefinementsSeparator.Top := bvlRefinementsSeparator.Top - 20;
//chbxSuppressBackgroundBitmaps.Top := chbxSuppressBackgroundBitmaps.Top - 20;
//chbxConsumeSelectionStyle.Top := chbxConsumeSelectionStyle.Top - 20;
{$ENDIF}
if ReportLink.ProcessParams.HasOnlyCards then
PageControl1.ActivePage := tshCards;
if ReportLink.ProcessParams.HasOnlyCharts then
PageControl1.ActivePage := tshCharts;
InitializePreviewGrid;
InitializePreviewGridStyles;
LoadDataIntoPreviewGridView(PreviewGrid.Levels[0].GridView as TcxCustomGridTableView);
with ReportLink.OptionsView do
begin
chbxShowCaptions.Checked := Caption;
chbxShowBands.Checked := BandHeaders;
chbxShowExpandButtons.Checked := ExpandButtons;
chbxShowGroupFooters.Checked := GroupFooters;
chbxShowFilterBar.Checked := FilterBar;
chbxShowFooters.Checked := Footers;
chbxShowHeaders.Checked := Headers;
end;
with ReportLink.OptionsOnEveryPage do
begin
chbxCaptionsOnEveryPage.Checked := Caption;
chbxBandsOnEveryPage.Checked := BandHeaders;
chbxFilterBarOnEveryPage.Checked := FilterBar;
chbxFootersOnEveryPage.Checked := Footers;
chbxHeadersOnEveryPage.Checked := Headers;
end;
with cbxLookAndFeel do
begin
Items.Clear;
Items.AddObject(cxGetResourceString(@sdxLookAndFeelFlat), TObject(lfFlat));
Items.AddObject(cxGetResourceString(@sdxLookAndFeelStandard), TObject(lfStandard));
Items.AddObject(cxGetResourceString(@sdxLookAndFeelUltraFlat), TObject(lfUltraFlat));
ItemIndex := Items.IndexOfObject(TObject(ReportLink.OptionsFormatting.LookAndFeelKind));
end;
with ReportLink.OptionsSelection do
begin
chbxProcessSelection.Checked := ProcessSelection;
chbxProcessExactSelection.Checked := ProcessExactSelection;
end;
with ReportLink.OptionsExpanding do
begin
chbxExpandGroupRows.Checked := ExpandGroupRows;
chbxExpandMasterRows.Checked := ExpandMasterRows;
{$IFDEF DXVER500}
chbxExpandCards.Checked := ExpandCards;
{$ENDIF}
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.OptionsSize do
begin
chbxGridAutoWidth.Checked := AutoWidth;
end;
with ReportLink.OptionsDetails do
begin
chbxStartFromActiveView.Checked := StartFromFocusedView;
chbxOnlyActiveView.Checked := OnlyFocusedView;
end;
with ReportLink.OptionsLevels do
begin
chbxLevelsUnwrap.Checked := Unwrap;
chbxLevelsUnwrapTopLevel.Checked := UnwrapTopLevel;
chbxLevelsRiseActiveLevelOntoTop.Checked := RiseActiveLevelOntoTop;
end;
with ReportLink.OptionsFormatting do
begin
chbxSuppressBackgroundBitmaps.Checked := SuppressBackgroundBitmaps;
chbxConsumeSelectionStyle.Checked := ConsumeSelectionStyle;
chbxUseNativeStyles.Checked := UseNativeStyles;
end;
with ReportLink.OptionsPagination do
begin
chbxPaginateByTopLevelGroups.Checked := TopLevelGroup;
chbxPaginateOneGroupPerPage.Checked := OneGroupPerPage;
end;
with ReportLink.OptionsPreview do
begin
chbxPreviewVisible.Checked := Visible;
chbxPreviewAutoHeight.Checked := AutoHeight;
sePreviewMaxLineCount.AsInteger := MaxLineCount;
end;
with ReportLink.OptionsCards do
begin
chbxCardsAutoWidth.Checked := AutoWidth;
chbxCardsKeepSameWidth.Checked := KeepSameWidth;
chbxCardsKeepSameHeight.Checked := KeepSameHeight;
chbxCardsBorder.Checked := Borders;
chbxCardsHorzLines.Checked := RowBordersHorz;
chbxCardsVertLines.Checked := RowBordersVert;
seCardsSpaceHorz.AsInteger := InterCardsSpaceHorz;
seCardsSpaceVert.AsInteger := InterCardsSpaceVert;
with Shadow do
begin
seCardsShadowDepth.AsInteger := Depth;
ccbxCardsShadowColor.ColorValue := Color;
end;
end;
{$IFDEF CHARTVIEW}
with ReportLink.OptionsCharts do
begin
chbxChartsTransparent.Checked := Transparent;
end;
{$ENDIF}
end;
{$IFDEF DELPHI7}
function TdxfmGridReportLinkDesignWindow.GetPreviewHost: TCustomPanel;
begin
Result := pnlPreview;
end;
{$ENDIF}
procedure TdxfmGridReportLinkDesignWindow.LoadStrings;
procedure AdjustBevelSize(ABevel: TBevel; AControl: TControl);
var
Right: Integer;
begin
Right := ABevel.BoundsRect.Right;
ABevel.Left := AControl.Left + AControl.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);
chbxShowCaptions.Caption := cxGetResourceString(@sdxLevelCaption);
chbxShowBands.Caption := cxGetResourceString(@sdxBands);
chbxShowHeaders.Caption := cxGetResourceString(@sdxHeaders);
chbxShowFooters.Caption := cxGetResourceString(@sdxFooters);
chbxShowGroupFooters.Caption := cxGetResourceString(@sdxGroupFooters);
chbxShowExpandButtons.Caption := cxGetResourceString(@sdxExpandButtons);
chbxShowFilterBar.Caption := cxGetResourceString(@sdxFilterBar);
lblOnEveryPage.Caption := cxGetResourceString(@sdxOnEveryPage);
AdjustBevelSize(bvlOnEveryPage, lblOnEveryPage);
chbxCaptionsOnEveryPage.Caption := DropAmpersand(cxGetResourceString(@sdxLevelCaption));
chbxBandsOnEveryPage.Caption := DropAmpersand(cxGetResourceString(@sdxBands));
chbxHeadersOnEveryPage.Caption := DropAmpersand(cxGetResourceString(@sdxHeaders));
chbxFootersOnEveryPage.Caption := DropAmpersand(cxGetResourceString(@sdxFooters));
chbxFilterBarOnEveryPage.Caption := DropAmpersand(cxGetResourceString(@sdxFilterBar));
tshBehaviors.Caption := cxGetResourceString(@sdxBehaviorsTab);
lblSelection.Caption := cxGetResourceString(@sdxSelection);
AdjustBevelSize(bvlSelection, lblSelection);
chbxProcessSelection.Caption := cxGetResourceString(@sdxProcessSelection);
chbxProcessExactSelection.Caption := cxGetResourceString(@sdxProcessExactSelection);
lblExpanding.Caption := cxGetResourceString(@sdxExpanding);
AdjustBevelSize(bvlExpanding, lblExpanding);
chbxExpandGroupRows.Caption := cxGetResourceString(@sdxGroups);
chbxExpandMasterRows.Caption := cxGetResourceString(@sdxDetails);
chbxExpandCards.Caption := cxGetResourceString(@sdxCardsRows);
lblGridSize.Caption := cxGetResourceString(@sdxSize);
AdjustBevelSize(bvlGridSize, lblGridSize);
chbxGridAutoWidth.Caption := cxGetResourceString(@sdxAutoWidth);
lblDetails.Caption := DropAmpersand(cxGetResourceString(@sdxDetails));
AdjustBevelSize(bvlDetails, lblDetails);
chbxStartFromActiveView.Caption := cxGetResourceString(@sdxStartFromActiveDetails);
chbxOnlyActiveView.Caption := cxGetResourceString(@sdxOnlyActiveDetails);
lblLevels.Caption := cxGetResourceString(@sdxLevels);
AdjustBevelSize(bvlLevels, lblLevels);
chbxLevelsUnwrap.Caption := cxGetResourceString(@sdxUnwrap);
chbxLevelsUnwrapTopLevel.Caption := cxGetResourceString(@sdxUnwrapTopLevel);
chbxLevelsRiseActiveLevelOntoTop.Caption := cxGetResourceString(@sdxRiseActiveToTop);
tshFormatting.Caption := cxGetResourceString(@sdxFormatting);
lblLookAndFeel.Caption := cxGetResourceString(@sdxLookAndFeel);
AdjustBevelSize(bvlLookAndFeel, lblLookAndFeel);
lblRefinements.Caption := cxGetResourceString(@sdxRefinements);
AdjustBevelSize(bvlRefinements, lblRefinements);
chbxTransparentGraphics.Caption := cxGetResourceString(@sdxTransparentGraphics);
chbxDisplayGraphicsAsText.Caption := DropAmpersand(cxGetResourceString(@sdxDisplayGraphicsAsText));
chbxFlatCheckMarks.Caption := cxGetResourceString(@sdxFlatCheckMarks);
//chbxTransparentRichEdits.Caption := cxGetResourceString(@sdxTransparentRichEdits); {.3}
chbxSuppressBackgroundBitmaps.Caption := cxGetResourceString(@sdxSuppressBackgroundBitmaps);
chbxConsumeSelectionStyle.Caption := cxGetResourceString(@sdxConsumeSelectionStyle);
lblPagination.Caption := cxGetResourceString(@sdxPagination);
AdjustBevelSize(bvlPagination, lblPagination);
chbxPaginateByTopLevelGroups.Caption := cxGetResourceString(@sdxByTopLevelGroups);
chbxPaginateOneGroupPerPage.Caption := cxGetResourceString(@sdxOneGroupPerPage);
tshStyles.Caption := cxGetResourceString(@sdxStyles);
lblUseNativeStyles.Caption := cxGetResourceString(@sdxUseNativeStyles);
AdjustBevelSize(bvlStyles, lblUseNativeStyles);
btnStyleColor.Caption := cxGetResourceString(@sdxBtnColor);
btnStyleFont.Caption := cxGetResourceString(@sdxBtnFont);
btnStyleBackgroundBitmap.Caption := cxGetResourceString(@sdxBtnTexture);
btnStyleBackgroundBitmapClear.Caption := cxGetResourceString(@sdxBtnTextureClear);
btnStyleRestoreDefaults.Caption := cxGetResourceString(@sdxBtnRestoreDefaults);
btnStylesSaveAs.Caption := cxGetResourceString(@sdxBtnSaveAs);
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);
lblStyleSheets.Caption := cxGetResourceString(@sdxStyleSheets);
AdjustBevelSize(bvlStyleSheets, lblStyleSheets);
btnStyleSheetNew.Caption := cxGetResourceString(@sdxBtnNew);
btnStyleSheetCopy.Caption := cxGetResourceString(@sdxBtnCopy);
btnStyleSheetDelete.Caption := cxGetResourceString(@sdxBtnDelete);
btnStyleSheetRename.Caption := cxGetResourceString(@sdxBtnRename);
tshPreview.Caption := cxGetResourceString(@sdxPreviewTab);
lblPreviewOptions.Caption := cxGetResourceString(@sdxOptions);
AdjustBevelSize(bvlPreviewOptions, lblPreviewOptions);
chbxPreviewVisible.Caption := cxGetResourceString(@sdxVisible);
chbxPreviewAutoHeight.Caption := cxGetResourceString(@sdxPreviewAutoHeight);
lblPreviewMaxLineCount.Caption := cxGetResourceString(@sdxPreviewMaxLineCount);
tshCards.Caption := cxGetResourceString(@sdxCardsTab);
lblCardSizes.Caption := cxGetResourceString(@sdxSizes);
AdjustBevelSize(bvlCardSizes, lblCardSizes);
chbxCardsAutoWidth.Caption := cxGetResourceString(@sdxAutoWidth);
chbxCardsKeepSameWidth.Caption := cxGetResourceString(@sdxKeepSameWidth);
chbxCardsKeepSameHeight.Caption := cxGetResourceString(@sdxKeepSameHeight);
lblCardSpacing.Caption := cxGetResourceString(@sdxSpacing);
AdjustBevelSize(bvlCardSpacing, lblCardSpacing);
lblCardSpaceHorz.Caption := cxGetResourceString(@sdxHorizontal);
lblCardSpaceVert.Caption := cxGetResourceString(@sdxVertical);
lblCardFraming.Caption := cxGetResourceString(@sdxFraming);
AdjustBevelSize(bvlCardFraming, lblCardFraming);
chbxCardsBorder.Caption := cxGetResourceString(@sdxBorderLines);
chbxCardsHorzLines.Caption := cxGetResourceString(@sdxHorzLines);
chbxCardsVertLines.Caption := cxGetResourceString(@sdxVertLines);
lblCardShadow.Caption := cxGetResourceString(@sdxShadow);
AdjustBevelSize(bvlCardShadow, lblCardShadow);
lblCardShadowColor.Caption := cxGetResourceString(@sdxColor);
lblCardShadowDepth.Caption := cxGetResourceString(@sdxDepth);
tshCharts.Caption := cxGetResourceString(@sdxCharts);
lblChartsOptions.Caption := cxGetResourceString(@sdxOptions);
AdjustBevelSize(bvlChartsOptions, lblChartsOptions);
chbxChartsTransparent.Caption := cxGetResourceString(@sdxTransparent);
end;
procedure TdxfmGridReportLinkDesignWindow.UpdateControlsState;
var
View: TcxCustomGridView;
begin
inherited;
View := ReportLink.ActiveView;
if View <> nil then
with ReportLink.ProcessParams, dxViewHelpersFactory[View] do
begin
chbxShowBands.Enabled := IsAttributeSupported(TdxGridBandHeader);
chbxShowExpandButtons.Enabled := IsAttributeSupported(TdxGridExpandButton);
chbxShowFooters.Enabled := IsAttributeSupported(TdxGridFooter);
chbxShowGroupFooters.Enabled := IsAttributeSupported(TdxGridGroupFooter);
chbxShowHeaders.Enabled := IsAttributeSupported(TdxGridHeader);
chbxCaptionsOnEveryPage.Enabled := IsAttributeSupported(TdxGridLevelCaption) and not ReportLink.IsAggregated;
chbxBandsOnEveryPage.Enabled := IsAttributeSupported(TdxGridBandHeader) and not ReportLink.IsAggregated;
chbxHeadersOnEveryPage.Enabled := IsAttributeSupported(TdxGridHeader) and not ReportLink.IsAggregated;
chbxFilterBarOnEveryPage.Enabled := IsAttributeSupported(TdxGridFilterBar) and not ReportLink.IsAggregated;
chbxFootersOnEveryPage.Enabled := IsAttributeSupported(TdxGridFooter) and not ReportLink.IsAggregated;
chbxExpandGroupRows.Enabled := IsAttributeSupported(TdxGridGroupRow);
chbxExpandMasterRows.Enabled := IsAttributeSupported(TdxGridDetails);
lblDetails.Visible := IsDesigning or HasMasterDetailsInTopView or HasUnwrapableData;
bvlDetails.Visible := IsDesigning or HasMasterDetailsInTopView or HasUnwrapableData;
imgDetails.Visible := IsDesigning or HasMasterDetailsInTopView or HasUnwrapableData;
chbxStartFromActiveView.Visible := IsDesigning or HasMasterDetailsInTopView or HasUnwrapableData;
chbxOnlyActiveView.Visible := IsDesigning or HasMasterDetailsInTopView or HasUnwrapableData;
chbxOnlyActiveView.Enabled := chbxStartFromActiveView.Checked;
lblLevels.Visible := IsDesigning or HasUnwrapableData;
bvlLevels.Visible := IsDesigning or HasUnwrapableData;
imgLevels.Visible := IsDesigning or HasUnwrapableData;
chbxLevelsUnwrap.Visible := IsDesigning or HasUnwrapableData;
chbxLevelsUnwrapTopLevel.Visible := IsDesigning or HasUnwrapableData;
chbxLevelsRiseActiveLevelOntoTop.Visible := IsDesigning or HasUnwrapableData;
chbxLevelsUnwrapTopLevel.Enabled := chbxLevelsUnwrap.Checked;
chbxLevelsRiseActiveLevelOntoTop.Enabled := chbxLevelsUnwrap.Checked;
chbxPreviewVisible.Enabled := IsAttributeSupported(TdxGridPreview);
chbxPreviewAutoHeight.Enabled := IsAttributeSupported(TdxGridPreview);
sePreviewMaxLineCount.Enabled := IsAttributeSupported(TdxGridPreview);
lblPagination.Visible := IsDesigning or IsAttributeSupported(TdxGridGroupRow);
bvlPagination.Visible := IsDesigning or IsAttributeSupported(TdxGridGroupRow);
imgPagination.Visible := IsDesigning or IsAttributeSupported(TdxGridGroupRow);
chbxPaginateByTopLevelGroups.Visible := IsDesigning or IsAttributeSupported(TdxGridGroupRow);
chbxPaginateOneGroupPerPage.Visible := IsDesigning or IsAttributeSupported(TdxGridGroupRow);
end;
chbxProcessExactSelection.Enabled := chbxProcessSelection.Checked;
chbxPaginateOneGroupPerPage.Enabled := chbxPaginateByTopLevelGroups.Checked;
chbxCardsKeepSameWidth.Enabled := chbxCardsAutoWidth.Checked;
{$IFDEF CHARTVIEW}
chbxChartsTransparent.Checked := ReportLink.OptionsCharts.Transparent;
{$ELSE}
tshCharts.TabVisible := False; // if chart not available
{$ENDIF}
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;
UpdateWarningPane;
end;
procedure TdxfmGridReportLinkDesignWindow.UpdatePreview;
const
DetailTabsPositionMap: array[Boolean] of TcxGridDetailTabsPosition = (dtpNone, dtpTop);
GroupFootersMap: array[Boolean] of TcxGridGroupFootersMode = (gfInvisible, gfAlwaysVisible);
FilteringMap: array[Boolean] of {$IFDEF DXVER500}TcxGridFilterVisible{$ELSE}TcxGridTableFilterVisible{$ENDIF} =
(fvNonEmpty, fvAlways);
TransparentsMap: array[Boolean] of TcxImageTransparency = (gtOpaque, gtTransparent);
{$IFDEF DXVER500}
function GetFilterBarPosition: TcxGridFilterPosition;
var
View: TcxCustomGridView;
begin
View := ReportLink.ActiveView;
if View is TcxCustomGridTableView then
Result := CustomGridTableFiltering_GetPosition(TcxCustomGridTableView(View).Filtering)
else
Result := fpBottom;
end;
{$ENDIF}
procedure UpdateBandedView;
begin
TcxImageProperties(colVendorLogo.Properties).GraphicTransparency :=
TransparentsMap[ReportLink.OptionsRefinements.TransparentGraphics];
with PreviewBandedView do
begin
{$IFDEF DXVER500}
Filtering.Position := GetFilterBarPosition;
{$ENDIF}
Filtering.Visible := FilteringMap[ReportLink.OptionsView.FilterBar];
OptionsView.BandHeaders := ReportLink.OptionsView.BandHeaders;
OptionsView.Footer := ReportLink.OptionsView.Footers;
OptionsView.GroupFooters := GroupFootersMap[ReportLink.OptionsView.GroupFooters];
OptionsView.Header := ReportLink.OptionsView.Headers;
Preview.Visible := ReportLink.OptionsPreview.Visible;
ViewChanged;
end;
end;
procedure UpdateCardView;
begin
TcxImageProperties(rowVendorLogo.Properties).GraphicTransparency :=
TransparentsMap[ReportLink.OptionsRefinements.TransparentGraphics];
{$IFDEF DXVER500}
PreviewCardView.Filtering.Position := GetFilterBarPosition;
PreviewCardView.Filtering.Visible := FilteringMap[ReportLink.OptionsView.FilterBar];
{$ENDIF}
PreviewCardView.ViewChanged;
end;
begin
PreviewGrid.Enabled := False;
PreviewGrid.LookAndFeel.Kind := ReportLink.OptionsFormatting.LookAndFeelKind;
PreviewGrid.LookAndFeel.NativeStyle := False;
PreviewGrid.Font := ReportLink.Font;
PreviewGrid.RootLevelOptions.DetailTabsPosition := DetailTabsPositionMap[ReportLink.OptionsView.Caption];
UpdateBandedView;
UpdateCardView;
end;
function TdxfmGridReportLinkDesignWindow.GetDesignerTabIndex: Integer;
begin
Result := PageControl1.ActivePage.TabIndex;
end;
procedure TdxfmGridReportLinkDesignWindow.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 TdxfmGridReportLinkDesignWindow.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 TdxfmGridReportLinkDesignWindow.DoFormActivated(AnActive: Boolean);
begin
inherited;
if not AnActive then lbxStyles.HideToolTips;
end;
procedure TdxfmGridReportLinkDesignWindow.DoRefreshStylesList;
var
Styles: TdxGridReportLinkStyles;
List: TList;
begin
Styles := ReportLink.ActiveStyles;
with lbxStyles.Items do
begin
BeginUpdate;
try
List := TList.Create;
try
SaveSelectedStyles(List);
try
Clear;
AddObject(cxGetResourceString(@sdxBandHeaderStyle), Styles.BandHeader);
AddObject(cxGetResourceString(@sdxCaptionStyle), Styles.Caption);
AddObject(cxGetResourceString(@sdxCardCaptionRowStyle), Styles.CardCaptionRow);
AddObject(cxGetResourceString(@sdxCardRowCaptionStyle), Styles.CardRowCaption);
AddObject(cxGetResourceString(@sdxContentStyle), Styles.Content);
AddObject(cxGetResourceString(@sdxContentEvenStyle), Styles.ContentEven);
AddObject(cxGetResourceString(@sdxContentOddStyle), Styles.ContentOdd);
AddObject(cxGetResourceString(@sdxFilterBarStyle), Styles.FilterBar);
AddObject(cxGetResourceString(@sdxFooterStyle), Styles.Footer);
AddObject(cxGetResourceString(@sdxGroupStyle), Styles.Group);
AddObject(cxGetResourceString(@sdxHeaderStyle), Styles.Header);
AddObject(cxGetResourceString(@sdxPreviewStyle), Styles.Preview);
AddObject(cxGetResourceString(@sdxSelectionStyle), Styles.Selection);
finally
RestoreSelectedStyles(List);
end;
finally
List.Free;
end;
finally
EndUpdate;
end;
end;
InitializePreviewGridStyles;
end;
procedure TdxfmGridReportLinkDesignWindow.DoStyleChanged(const ACaption: string;
AStyle: TcxStyle);
begin
inherited;
Modified := True;
UpdatePreviewGridStyles(ACaption, AStyle);
end;
procedure TdxfmGridReportLinkDesignWindow.DoStylesChanged(AStrings: TStrings;
ARecreate: Boolean);
begin
if ARecreate then
RecreateStylesListBox
else
lbxStyles.Invalidate;
Modified := True;
UpdatePreview;
end;
procedure TdxfmGridReportLinkDesignWindow.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 TdxfmGridReportLinkDesignWindow.GetStyleNames(out AStrings: TStrings);
begin
AStrings := lbxStyles.Items;
end;
procedure TdxfmGridReportLinkDesignWindow.GetStyleSheetNames(out AStrings: TStrings);
begin
AStrings := cbxStyleSheets.Items;
end;
function TdxfmGridReportLinkDesignWindow.GetActiveStyle: TcxStyle;
begin
with lbxStyles do
if ItemIndex <> -1 then
Result := TcxStyle(Items.Objects[ItemIndex])
else
Result := nil;
end;
function TdxfmGridReportLinkDesignWindow.GetHasSelectedStyles: Boolean;
begin
Result := lbxStyles.SelCount <> 0;
end;
function TdxfmGridReportLinkDesignWindow.GetHasSelectedStylesWithAssignedBitmap: Boolean;
var
Strings: TStrings;
I: Integer;
cxStyle: TcxStyle;
begin
Result := True;
Strings := TStringList.Create;
try
GetSelectedStyleNames(Strings);
for I := 0 to Strings.Count - 1 do
begin
cxStyle := TcxStyle(Strings.Objects[I]);
if (cxStyle <> nil) and (cxStyle.Bitmap <> nil) and not cxStyle.Bitmap.Empty then
Exit;
end;
finally
Strings.Free;
end;
Result := False;
end;
function TdxfmGridReportLinkDesignWindow.GetReportLink: TdxGridReportLink;
begin
Result := inherited ReportLink as TdxGridReportLink;
end;
procedure TdxfmGridReportLinkDesignWindow.CardShadowColorChanged(Sender: TObject);
begin
if LockControlsUpdate then Exit;
if TdxPSColorCombo(Sender).IsAutoColorSelected then
ReportLink.OptionsCards.Shadow.Color := clDefault
else
ReportLink.OptionsCards.Shadow.Color := TdxPSColorCombo(Sender).ColorValue;
TcxGridCardView2Styles(PreviewCardView.Styles).CardShadow.Color := ReportLink.OptionsCards.Shadow.ActualColor;
Modified := True;
end;
procedure TdxfmGridReportLinkDesignWindow.CardShadowDepthChanged(Sender: TObject);
var
NewDepth: Integer;
begin
if LockControlsUpdate then Exit;
ReportLink.OptionsCards.Shadow.Depth := TdxPSSpinEdit(Sender).AsInteger;
NewDepth := TdxPSSpinEdit(Sender).AsInteger;
if NewDepth > 4 then NewDepth := 4;
TcxGridCardView2OptionsView(PreviewCardView.OptionsView).ShadowDepth := NewDepth;
Modified := True;
end;
procedure TdxfmGridReportLinkDesignWindow.CardSpaceHorzChanged(Sender: TObject);
begin
if LockControlsUpdate then Exit;
ReportLink.OptionsCards.InterCardsSpaceHorz := TdxPSSpinEdit(Sender).AsInteger;
Modified := True;
end;
procedure TdxfmGridReportLinkDesignWindow.CardSpaceVertChanged(Sender: TObject);
begin
if LockControlsUpdate then Exit;
ReportLink.OptionsCards.InterCardsSpaceVert := TdxPSSpinEdit(Sender).AsInteger;
Modified := True;
end;
procedure TdxfmGridReportLinkDesignWindow.PreviewMaxLineCountChanged(Sender: TObject);
begin
if LockControlsUpdate then Exit;
ReportLink.OptionsPreview.MaxLineCount := TdxPSSpinEdit(Sender).AsInteger;
Modified := True;
end;
function TdxfmGridReportLinkDesignWindow.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 TdxfmGridReportLinkDesignWindow.ChangeActiveView(AView: TcxCustomGridView);
var
OldGridView: TcxCustomGridView;
begin
with PreviewGrid.Levels[0] do
begin
OldGridView := GridView;
GridView := AView;
if OldGridView <> GridView then
LoadDataIntoPreviewGridView(GridView as TcxCustomGridTableView);
end;
end;
procedure TdxfmGridReportLinkDesignWindow.CreateCardView;
function CreateRow(APropertiesClass: TcxCustomEditPropertiesClass = nil;
AOnCustomDraw: TcxGridTableDataCellCustomDrawEvent = nil): TcxGridCardViewRow;
begin
Result := PreviewCardView.CreateRow;
Result.PropertiesClass := APropertiesClass;
Result.OnCustomDrawCell := AOnCustomDraw;
end;
begin
PreviewCardView := PreviewGrid.CreateView(TcxGridCardView2) as TcxGridCardView2;
with PreviewCardView do
begin
LayoutDirection := ldVertical;
{$IFDEF DXVER500}
Filtering.CustomizeDialog := False;
{$ENDIF}
TcxGridCardView2Styles(Styles).CardShadow := styleCardShadow;
with TcxGridCardView2OptionsView(OptionsView) do
begin
CardWidth := 135;
CardBorderWidth := 1;
CellAutoHeight := True;
GridLineColor := ReportLink.OptionsFormatting.GridLineColor;
SeparatorWidth := 0;
ScrollBars := ssNone;
ShadowDepth := ReportLink.OptionsCards.Shadow.Depth;
end;
{$IFDEF DXVER500}
with OptionsCustomize do
begin
CardExpanding := False;
RowFiltering := False;
end;
{$ENDIF}
end;
rowVendorName := CreateRow;
rowVendorLogo := CreateRow(TcxImageProperties, VendorLogoCustomDrawCell);
rowVendorCountry := CreateRow;
rowCarModel := CreateRow;
rowIsSuvModel := CreateRow(TcxCheckBoxProperties, IsSUVModelCustomDrawCell);
end;
procedure TdxfmGridReportLinkDesignWindow.CreateControls;
function CreateSpin(AHost: TControl; ALabel: TLabel; ATabOrder: TTabOrder;
AMinValue, AMaxValue, AValue: Integer): TdxPSSpinEdit;
begin
Result := TdxPSSpinEdit.Create(Self);
with Result do
begin
Parent := AHost.Parent;
BoundsRect := AHost.BoundsRect;
TabOrder := ATabOrder;
MinValue := AMinValue;
MaxValue := AMaxValue;
Value := AValue;
DefaultValue := AValue;
end;
ALabel.FocusControl := Result;
end;
function CreateColorCombo(AParent: TWinControl; AHost: TControl; ALabel: TLabel;
ATabOrder: TTabOrder; ATag: Integer; AAutoColor: TColor): TdxPSColorCombo;
begin
Result := TdxPSColorCombo.Create(Self);
with TdxPSColorCombo(Result) do
begin
BoundsRect := AHost.BoundsRect;
Tag := MakeTTag(ATag);
Parent := AParent;
TabOrder := ATabOrder;
ColorTypes := [ctPure];
ShowColorName := True;
ShowAutoColor := True;
AutoColor := AAutoColor;
end;
ALabel.FocusControl := Result;
AHost.Visible := False;
end;
procedure CreateWarningPane;
begin
wpIncorrectOnEveryPageState := TdxPSWarningPane.Create(Self);
wpIncorrectOnEveryPageState.Parent := tshView;
wpIncorrectOnEveryPageState.BoundsRect := bvlWarningHost.BoundsRect;
wpIncorrectOnEveryPageState.Font.Name := 'Tahoma';
wpIncorrectOnEveryPageState.Font.Size := 8;
bvlWarningHost.Visible := False;
end;
procedure CreateStylesListBox;
begin
lbxStyles := TdxStylesListBox.Create(Self);
lbxStyles.Parent := tshStyles;
lbxStyles.BoundsRect := bvlStylesHost.BoundsRect;
lbxStyles.PopupMenu := pmStyles;
lbxStyles.TabOrder := chbxUseNativeStyles.TabOrder + 1;
lbxStyles.OnClick := lbxStylesClick;
bvlStylesHost.Visible := False;
dxPSPopupMan.dxPSPopupMenuController.RegisterControl(lbxStyles);
end;
begin
sePreviewMaxLineCount := CreateSpin(bvlPreviewMaxLineCountHost, lblPreviewMaxLineCount,
chbxPreviewAutoHeight.TabOrder + 1, 0, 1000, 0);
sePreviewMaxLineCount.OnChange := PreviewMaxLineCountChanged;
seCardsSpaceHorz := CreateSpin(bvlCardSpaceHorzHost, lblCardSpaceHorz,
chbxCardsKeepSameHeight.TabOrder + 1, 0, 20, dxDefaultInterCardsSpaceHorz);
seCardsSpaceHorz.OnChange := CardSpaceHorzChanged;
seCardsSpaceVert := CreateSpin(bvlCardSpaceVertHost, lblCardSpaceVert,
seCardsSpaceHorz.TabOrder + 1, 0, 20, dxDefaultInterCardsSpaceVert);
seCardsSpaceVert.OnChange := CardSpaceVertChanged;
ccbxCardsShadowColor := CreateColorCombo(tshCards, bvlCardShadowColorHost, lblCardShadowColor,
chbxCardsVertLines.TabOrder + 1, 0, dxDefaultCardsShadowColor);
ccbxCardsShadowColor.OnChange := CardShadowColorChanged;
seCardsShadowDepth := CreateSpin(bvlCardShadowDepthHost, lblCardShadowDepth,
ccbxCardsShadowColor.TabOrder + 1, Low(TdxGridCardShadowDepth), High(TdxGridCardShadowDepth),
dxDefaultCardsShadowDepth);
seCardsShadowDepth.OnChange := CardShadowDepthChanged;
CreateStylesListBox;
CreateWarningPane;
end;
procedure TdxfmGridReportLinkDesignWindow.CustomDrawBorders(ACanvas: TcxCanvas;
AViewInfo: TcxCustomGridCellViewInfo);
var
PainterClass: TcxCustomGridCellPainterClass;
Painter: TcxCustomGridCellPainter;
begin
PainterClass := CustomGridCellViewInfo_GetPainterClass(AViewInfo);
Painter := PainterClass.Create(ACanvas, AViewInfo);
try
CustomGridCellPainter_DrawBorders(Painter);
finally
Painter.Free;
end;
end;
procedure TdxfmGridReportLinkDesignWindow.CustomDrawFooter(ACanvas: TcxCanvas;
R: TRect; AViewInfo: TcxCustomGridCellViewInfo);
begin
case ReportLink.OptionsFormatting.LookAndFeelKind of
lfStandard,
lfFlat:
ACanvas.DrawComplexFrame(R, AViewInfo.Params.TextColor, clBtnHighlight);
lfUltraFlat:
ACanvas.FrameRect(R, AViewInfo.Params.TextColor);
end;
InflateRect(R, -1, -1);
CustomDrawTextRect(ACanvas, R, AViewInfo, AViewInfo.BackgroundBitmap);
end;
procedure TdxfmGridReportLinkDesignWindow.CustomDrawHeader(ACanvas: TcxCanvas;
R: TRect; AViewInfo: TcxCustomGridCellViewInfo);
const
BottomRightColors: array[Boolean] of TColor = (clBtnFace, clBtnShadow);
begin
ACanvas.FrameRect(R, clWindowText);
if ReportLink.OptionsFormatting.LookAndFeelKind <> lfUltraFlat then
begin
InflateRect(R, -1, -1);
ACanvas.DrawComplexFrame(R, clBtnHighlight, BottomRightColors[ReportLink.OptionsFormatting.LookAndFeelKind = lfStandard]);
end;
InflateRect(R, -1, -1);
CustomDrawTextRect(ACanvas, R, AViewInfo, AViewInfo.BackgroundBitmap);
end;
procedure TdxfmGridReportLinkDesignWindow.CustomDrawTextRect(ACanvas: TcxCanvas;
R: TRect; AViewInfo: TcxCustomGridCellViewInfo; ABackgroundBitmap: TBitmap);
const
AlignmentHorzMap: array[TAlignment] of Integer = (cxAlignLeft, cxAlignRight, cxAlignCenter);
AlignmentVertMap: array[TcxAlignmentVert] of Integer = (cxAlignTop, cxAlignBottom, cxAlignVCenter);
begin
with AViewInfo do
begin
if ABackgroundBitmap = nil then
begin
ACanvas.Brush.Color := Params.Color;
ACanvas.FillRect(R);
end
else
dxBkgnd.DrawPicture(ABackgroundBitmap, ACanvas.Canvas, R, ppmTile, 1, 1, - R.Left - 0, - R.Top - 0);
InflateRect(R, -2, -1);
if ReportLink.OptionsFormatting.LookAndFeelKind = lfUltraFlat then
InflateRect(R, -1, -1);
if Params.Font <> nil then
ACanvas.Font := Params.Font;
ACanvas.Font.Color := Params.TextColor;
ACanvas.Brush.Style := bsClear;
ACanvas.DrawText(Text, R, AlignmentHorzMap[AlignmentHorz] or AlignmentVertMap[AlignmentVert] or cxSingleLine);
ACanvas.Brush.Style := bsSolid;
end;
end;
procedure TdxfmGridReportLinkDesignWindow.InitializePreviewGrid;
procedure SetupDataBindings(AView: TcxCustomGridTableView);
function GetColumnCaption(Index: Integer): string;
begin
case Index of
0: Result := cxGetResourceString(@sdxManufacturerNameColumnCaption);
1: Result := cxGetResourceString(@sdxManufacturerLogoColumnCaption);
2: Result := cxGetResourceString(@sdxManufacturerCountryColumnCaption);
3: Result := cxGetResourceString(@sdxCarModelColumnCaption);
else
Result := cxGetResourceString(@sdxCarIsSUVColumnCaption);
end;
end;
const
ColumnTypes: array[0..4] of TcxValueTypeClass =
(TcxStringValueType, TcxStringValueType, TcxStringValueType,
TcxStringValueType, TcxBooleanValueType);
var
I: Integer;
begin
for I := 0 to AView.ItemCount - 1 do
with AView.Items[I] do
begin
DataBinding.ValueTypeClass := ColumnTypes[I];
Caption := GetColumnCaption(I);
end;
end;
begin
if PageControl1.ActivePage = tshCards then
PreviewGrid.Levels[0].GridView := PreviewCardView
else
PreviewGrid.Levels[0].GridView := PreviewBandedView;
SetupDataBindings(PreviewBandedView);
PreviewGridLevel.Caption := cxGetResourceString(@sdxCarLevelCaption);
PreviewBandedView.Bands[0].Caption := cxGetResourceString(@sdxManufacturerBandCaption);
PreviewBandedView.Bands[1].Caption := cxGetResourceString(@sdxModelBandCaption);
PreviewBandedView.DataController.Summary.FooterSummaryItems[0].Format := cxGetResourceString(@sdxSummaryFormat);
SetupDataBindings(PreviewCardView);
// PreviewCardView.Rows[3].Visible := False;
end;
procedure TdxfmGridReportLinkDesignWindow.InitializePreviewGridStyles;
procedure ResetEvents(AStyles: TcxGridBandedTableViewStyles); overload;
begin
with AStyles do
begin
OnGetBandHeaderStyle := nil;
OnGetContentStyle := nil;
OnGetFooterStyle := nil;
OnGetGroupStyle := nil;
OnGetHeaderStyle := nil;
OnGetPreviewStyle := nil;
end;
end;
procedure ResetEvents(AStyles: TcxGridCardViewStyles); overload;
begin
with AStyles do
begin
OnGetCaptionRowStyle := nil;
OnGetCardBorderStyle := nil;
OnGetContentStyle := nil;
OnGetRowCaptionStyle := nil;
end;
end;
var
Styles: TdxGridReportLinkStyles;
begin
if ReportLink.OptionsFormatting.UseNativeStyles then
begin
Styles := ReportLink.ActiveStyles;
PreviewGrid.RootLevelStyles.Tab := Styles.Caption;
PreviewGrid.RootLevelStyles.TabsBackground := Styles.Caption;
if PreviewBandedView <> nil then
begin
dxPScxCommon.dxPSResetStyles(PreviewBandedView.Styles);
with PreviewBandedView.Styles do
begin
BandHeader := Styles.BandHeader;
Content := Styles.Content;
ContentEven := Styles.ContentEven;
ContentOdd := Styles.ContentOdd;
FilterBox := Styles.FilterBar;
Footer := Styles.Footer;
Group := Styles.Group;
Header := Styles.Header;
Preview := Styles.Preview;
end;
end;
if PreviewCardView <> nil then
begin
dxPScxCommon.dxPSResetStyles(PreviewCardView.Styles);
with PreviewCardView.Styles do
begin
CaptionRow := Styles.CardCaptionRow;
CardBorder := StyleCardBorder;
Content := Styles.Content;
ContentEven := Styles.ContentEven;
ContentOdd := Styles.ContentOdd;
RowCaption := Styles.CardRowCaption;
end;
end;
end
else
begin
if ReportLink.Grid <> nil then
begin
PreviewGrid.RootLevelStyles.Tab := ReportLink.Grid.RootLevelStyles.Tab;
PreviewGrid.RootLevelStyles.TabsBackground := ReportLink.Grid.RootLevelStyles.TabsBackground;
end
else
dxPScxCommon.dxPSResetStyles(PreviewGrid.RootLevelStyles);
if PreviewBandedView <> nil then
if ReportLink.ActiveView is TcxGridBandedTableView then
PreviewBandedView.Styles := TcxGridBandedTableView(ReportLink.ActiveView).Styles
else
dxPScxCommon.dxPSResetStyles(PreviewBandedView.Styles);
if PreviewCardView <> nil then
if ReportLink.ActiveView is TcxGridCardView then
PreviewCardView.Styles := TcxGridCardView(ReportLink.ActiveView).Styles
else
dxPScxCommon.dxPSResetStyles(PreviewCardView.Styles);
end;
PreviewGrid.RootLevelStyles.OnGetTabStyle := nil;
if PreviewBandedView <> nil then
begin
ResetEvents(PreviewBandedView.Styles);
PreviewBandedView.SizeChanged;
end;
if PreviewCardView <> nil then
begin
ResetEvents(PreviewCardView.Styles);
PreviewCardView.SizeChanged;
end;
end;
procedure TdxfmGridReportLinkDesignWindow.LoadDataIntoPreviewGridView(AView: TcxCustomGridTableView);
procedure AddRecord(ARecordIndex: Integer; const AValues: array of string);
var
I: Integer;
begin
with AView.DataController do
for I := 0 to ItemCount - 1 do
Values[ARecordIndex, I] := AValues[I];
end;
function CarVendorName(Index: Integer): string;
begin
case Index of
0: Result := cxGetResourceString(@sdxCarManufacturerName1);
1: Result := cxGetResourceString(@sdxCarManufacturerName2);
2: Result := cxGetResourceString(@sdxCarManufacturerName3);
else
Result := cxGetResourceString(@sdxCarManufacturerName4);
end;
end;
function CarVendorCountry(Index: Integer): string;
begin
case Index of
0: Result := cxGetResourceString(@sdxCarManufacturerCountry1);
1: Result := cxGetResourceString(@sdxCarManufacturerCountry2);
2: Result := cxGetResourceString(@sdxCarManufacturerCountry3);
else
Result := cxGetResourceString(@sdxCarManufacturerCountry4);
end;
end;
function CarModel(Index: Integer): string;
begin
case Index of
0: Result := cxGetResourceString(@sdxCarModel1);
1: Result := cxGetResourceString(@sdxCarModel2);
2: Result := cxGetResourceString(@sdxCarModel3);
else
Result := cxGetResourceString(@sdxCarModel4);
end;
end;
const
RecordCount = 4;
//CarSalesCount: array[0..RecordCount - 1] of Integer = (10, 6, 3, 5);
IsCarSUV: array[0..RecordCount - 1] of string = ('True', 'True', 'False', 'True');
var
I: Integer;
begin
AView.DataController.RecordCount := RecordCount;
for I := 0 to RecordCount - 1 do
AddRecord(I, [CarVendorName(I), dxPScxCommon.dxPSPreviewCarLogosAsString(I),
CarVendorCountry(I), CarModel(I), IsCarSUV[I]]);//, CarSalesCount[I]]);
end;
procedure TdxfmGridReportLinkDesignWindow.RecreateStylesListBox;
var
List: TList;
begin
List := TList.Create;
try
SaveSelectedStyles(List);
dxPSUtl.dxRecreateWnd(lbxStyles);
RestoreSelectedStyles(List);
finally
List.Free;
end;
end;
procedure TdxfmGridReportLinkDesignWindow.RestoreSelectedStyles(AList: TList);
var
I: Integer;
begin
for I := 0 to AList.Count - 1 do
lbxStyles.Selected[Integer(AList[I])] := True;
end;
procedure TdxfmGridReportLinkDesignWindow.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 TdxfmGridReportLinkDesignWindow.SetActivePage;
begin
PageControl1.ActivePage := PageControl1.Pages[DesignerTabIndex];
end;
procedure TdxfmGridReportLinkDesignWindow.UpdatePreviewGridStyles(const ACaption: string;
AStyle: TcxStyle);
begin
with PreviewGrid.RootLevelStyles do
if dxPSUtl.dxSameText(ACaption, cxGetResourceString(@sdxCaptionStyle)) then
begin
Tab := AStyle;
TabsBackground := AStyle;
end;
with PreviewBandedView.Styles do
begin
if dxPSUtl.dxSameText(ACaption, cxGetResourceString(@sdxBandHeaderStyle)) then
BandHeader := AStyle
else if dxPSUtl.dxSameText(ACaption, cxGetResourceString(@sdxContentStyle)) then
Content := AStyle
else if dxPSUtl.dxSameText(ACaption, cxGetResourceString(@sdxContentEvenStyle)) then
ContentEven := AStyle
else if dxPSUtl.dxSameText(ACaption, cxGetResourceString(@sdxContentOddStyle)) then
ContentOdd := AStyle
else if dxPSUtl.dxSameText(ACaption, cxGetResourceString(@sdxFooterStyle)) then
Footer := AStyle
else if dxPSUtl.dxSameText(ACaption, cxGetResourceString(@sdxGroupStyle)) then
Group := AStyle
else if dxPSUtl.dxSameText(ACaption, cxGetResourceString(@sdxHeaderStyle)) then
Header := AStyle
else if dxPSUtl.dxSameText(ACaption, cxGetResourceString(@sdxPreviewStyle)) then
Preview := AStyle;
end;
with PreviewCardView.Styles do
begin
if dxPSUtl.dxSameText(ACaption, cxGetResourceString(@sdxCardCaptionRowStyle)) then
CaptionRow := AStyle
else if dxPSUtl.dxSameText(ACaption, cxGetResourceString(@sdxCardRowCaptionStyle)) then
RowCaption := AStyle
else if dxPSUtl.dxSameText(ACaption, cxGetResourceString(@sdxContentStyle)) then
Content := AStyle
else if dxPSUtl.dxSameText(ACaption, cxGetResourceString(@sdxContentEvenStyle)) then
ContentEven := AStyle
else if dxPSUtl.dxSameText(ACaption, cxGetResourceString(@sdxContentOddStyle)) then
ContentOdd := AStyle
end;
end;
procedure TdxfmGridReportLinkDesignWindow.UpdateWarningPane;
begin
with ReportLink.HostInfoServices do
wpIncorrectOnEveryPageState.SetStateAndHint(IsInconsistentState, InconsistentStateText);
end;
procedure TdxfmGridReportLinkDesignWindow.SetOptionsCardsByIndex(Index: Integer;
Value: Boolean);
begin
if LockControlsUpdate then Exit;
with ReportLink.OptionsCards do
case Index of
0: AutoWidth := Value;
1: KeepSameWidth := Value;
2: KeepSameHeight := Value;
3: Borders := Value;
4: RowBordersHorz := Value;
5: RowBordersVert := Value;
end;
Modified := True;
end;
procedure TdxfmGridReportLinkDesignWindow.SetOptionsChartsByIndex(Index: Integer;
Value: Boolean);
begin
{$IFDEF CHARTVIEW}
if LockControlsUpdate then Exit;
with ReportLink.OptionsCharts do
case Index of
0: Transparent := Value;
end;
Modified := True;
{$ENDIF}
end;
procedure TdxfmGridReportLinkDesignWindow.SetOptionsDetailsByIndex(Index: Integer;
Value: Boolean);
begin
if LockControlsUpdate then Exit;
with ReportLink.OptionsDetails do
case Index of
0: StartFromFocusedView := Value;
1: OnlyFocusedView := Value;
end;
ReportLink.CalculateProcessParams;
Modified := True;
end;
procedure TdxfmGridReportLinkDesignWindow.SetOptionsExpandingByIndex(Index: Integer;
Value: Boolean);
begin
if LockControlsUpdate then Exit;
with ReportLink.OptionsExpanding do
case Index of
0: ExpandGroupRows := Value;
1: ExpandMasterRows := Value;
{$IFDEF DXVER500}
2: ExpandCards := Value;
{$ENDIF}
end;
Modified := True;
end;
procedure TdxfmGridReportLinkDesignWindow.SetOptionsFormattingByIndex(Index: Integer;
Value: Boolean);
begin
if LockControlsUpdate then Exit;
with ReportLink.OptionsFormatting do
case Index of
0:
begin
UseNativeStyles := Value;
InitializePreviewGridStyles;
RecreateStylesListBox;
end;
1: SuppressBackgroundBitmaps := Value;
2: ConsumeSelectionStyle := Value;
end;
Modified := True;
UpdatePreview;
end;
procedure TdxfmGridReportLinkDesignWindow.SetOptionsLevelsByIndex(Index: Integer; Value: Boolean);
begin
if LockControlsUpdate then Exit;
with ReportLink.OptionsLevels do
case Index of
0: Unwrap := Value;
1: UnwrapTopLevel := Value;
2: RiseActiveLevelOntoTop := Value;
end;
ReportLink.CalculateProcessParams;
Modified := True;
end;
procedure TdxfmGridReportLinkDesignWindow.SetOptionsOnEveryPageByIndex(Index: Integer;
Value: Boolean);
begin
if LockControlsUpdate then Exit;
with ReportLink.OptionsOnEveryPage do
case Index of
0: Caption := Value;
1: BandHeaders := Value;
2: Headers := Value;
3: Footers := Value;
4: FilterBar := Value;
end;
Modified := True;
end;
procedure TdxfmGridReportLinkDesignWindow.SetOptionsPaginationByIndex(Index: Integer;
Value: Boolean);
begin
if LockControlsUpdate then Exit;
with ReportLink.OptionsPagination do
case Index of
0: TopLevelGroup := Value;
1: OneGroupPerPage := Value;
end;
Modified := True;
end;
procedure TdxfmGridReportLinkDesignWindow.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 TdxfmGridReportLinkDesignWindow.SetOptionsSelectionByIndex(Index: Integer;
Value: Boolean);
begin
if LockControlsUpdate then Exit;
with ReportLink.OptionsSelection do
case Index of
0: ProcessSelection := Value;
1: ProcessExactSelection := Value;
end;
Modified := True;
end;
procedure TdxfmGridReportLinkDesignWindow.SetOptionsSizeByIndex(Index: Integer;
Value: Boolean);
begin
if LockControlsUpdate then Exit;
with ReportLink.OptionsSize do
case Index of
0: AutoWidth := Value;
end;
Modified := True;
end;
procedure TdxfmGridReportLinkDesignWindow.SetOptionsViewByIndex(Index: Integer;
Value: Boolean);
begin
if LockControlsUpdate then Exit;
with ReportLink.OptionsView do
case Index of
0: Caption := Value;
1: BandHeaders := Value;
2: Headers := Value;
3: Footers := Value;
4: GroupFooters := Value;
5: ExpandButtons := Value;
6: FilterBar := Value;
end;
Modified := True;
UpdatePreview;
end;
procedure TdxfmGridReportLinkDesignWindow.OptionsViewClick(Sender: TObject);
begin
with TCheckBox(Sender) do
SetOptionsViewByIndex(TTagToInt(Tag), Checked);
end;
procedure TdxfmGridReportLinkDesignWindow.OptionsOnEveryPageClick(Sender: TObject);
begin
with TCheckBox(Sender) do
SetOptionsOnEveryPageByIndex(TTagToInt(Tag), Checked);
end;
procedure TdxfmGridReportLinkDesignWindow.OptionsSelectionClick(Sender: TObject);
begin
with TCheckBox(Sender) do
SetOptionsSelectionByIndex(TTagToInt(Tag), Checked);
end;
procedure TdxfmGridReportLinkDesignWindow.OptionsExpandingClick(Sender: TObject);
begin
with TCheckBox(Sender) do
SetOptionsExpandingByIndex(TTagToInt(Tag), Checked);
end;
procedure TdxfmGridReportLinkDesignWindow.OptionsRefinementClick(Sender: TObject);
begin
with TCheckBox(Sender) do
SetOptionsRefinementsByIndex(TTagToInt(Tag), Checked);
end;
procedure TdxfmGridReportLinkDesignWindow.OptionsFormatingClick(Sender: TObject);
begin
with TCheckBox(Sender) do
SetOptionsFormattingByIndex(TTagToInt(Tag), Checked);
end;
procedure TdxfmGridReportLinkDesignWindow.lblUseNativeStylesClick(Sender: TObject);
begin
if chbxUseNativeStyles.CanFocus then ActiveControl := chbxUseNativeStyles;
chbxUseNativeStyles.Checked := not chbxUseNativeStyles.Checked;
end;
procedure TdxfmGridReportLinkDesignWindow.OptionsPaginationClick(Sender: TObject);
begin
with TCheckBox(Sender) do
SetOptionsPaginationByIndex(TTagToInt(Tag), Checked);
end;
procedure TdxfmGridReportLinkDesignWindow.OptionsSizeClick(Sender: TObject);
begin
with TCheckBox(Sender) do
SetOptionsSizeByIndex(TTagToInt(Tag), Checked);
end;
procedure TdxfmGridReportLinkDesignWindow.OptionsDetailsClick(Sender: TObject);
begin
with TCheckBox(Sender) do
SetOptionsDetailsByIndex(TTagToInt(Tag), Checked);
end;
procedure TdxfmGridReportLinkDesignWindow.OptionsLevelsClick(Sender: TObject);
begin
with TCheckBox(Sender) do
SetOptionsLevelsByIndex(TTagToInt(Tag), Checked);
end;
procedure TdxfmGridReportLinkDesignWindow.LookAndFeelClick(Sender: TObject);
begin
with TComboBox(Sender) do
ReportLink.OptionsFormatting.LookAndFeelKind := TcxLookAndFeelKind(Items.Objects[ItemIndex]);
Modified := True;
UpdatePreview;
end;
procedure TdxfmGridReportLinkDesignWindow.PageControl1Change(Sender: TObject);
begin
lblPreviewWindow.Parent := TPageControl(Sender).ActivePage;
if not ReportLink.ProcessParams.HasOnlyCards then
if PageControl1.ActivePage = tshCards then
ChangeActiveView(PreviewCardView)
else
if PageControl1.ActivePage = tshStyles then
if ReportLink.IsCardViewStyle(ActiveStyle) then
ChangeActiveView(PreviewCardView)
else
ChangeActiveView(PreviewBandedView)
else
ChangeActiveView(PreviewBandedView);
end;
procedure TdxfmGridReportLinkDesignWindow.PreviewVisibleClick(Sender: TObject);
begin
if LockControlsUpdate then Exit;
ReportLink.OptionsPreview.Visible := TCheckBox(Sender).Checked;
Modified := True;
UpdatePreview;
end;
procedure TdxfmGridReportLinkDesignWindow.PreviewAutoHeightClick(Sender: TObject);
begin
if LockControlsUpdate then Exit;
ReportLink.OptionsPreview.AutoHeight := TCheckBox(Sender).Checked;
Modified := True;
end;
procedure TdxfmGridReportLinkDesignWindow.OptionsCardsClick(Sender: TObject);
begin
with TCheckBox(Sender) do
SetOptionsCardsByIndex(TTagToInt(Tag), Checked);
with TcxGridCardView2OptionsView(PreviewCardView.OptionsView), ReportLink.OptionsCards do
begin
CardBorders := Borders;
GridLines := dxPScxCommon.dxPSMakecxGridLines(RowBordersHorz, RowBordersVert);
end;
//UpdatePreview;
end;
procedure TdxfmGridReportLinkDesignWindow.chbxChartsTransparentClick(Sender: TObject);
begin
with TCheckBox(Sender) do
SetOptionsChartsByIndex(TTagToInt(Tag), Checked);
end;
procedure TdxfmGridReportLinkDesignWindow.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 TdxfmGridReportLinkDesignWindow.lbxStylesClick(Sender: TObject);
begin
if LockControlsUpdate then Exit;
if not ReportLink.ProcessParams.HasOnlyCards then
if ReportLink.IsCardViewStyle(ActiveStyle) then
ChangeActiveView(PreviewCardView)
else
ChangeActiveView(PreviewBandedView);
UpdateControlsState;
end;
procedure TdxfmGridReportLinkDesignWindow.IsSUVModelCustomDrawCell(
Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
procedure DrawBackground(const R: TRect);
function GetParams: TcxViewParams;
begin
if AViewInfo is TcxGridCardRowDataViewInfo then
PreviewCardView.Styles.GetContentParams(AViewInfo.GridRecord, AViewInfo.Item, Result)
else
PreviewBandedView.Styles.GetContentParams(AViewInfo.GridRecord, AViewInfo.Item, Result);
end;
var
BackgroundBitmap: TBitmap;
PrevColor: TColor;
begin
BackgroundBitmap := CustomGridView_GetBackgroundBitmaps(AViewInfo.GridRecord.GridView).GetBitmap(bbContent);
if BackgroundBitmap = nil then
begin
PrevColor := ACanvas.Brush.Color;
ACanvas.Brush.Color := GetParams.Color;
ACanvas.FillRect(R);
ACanvas.Brush.Color := PrevColor;
end
else
dxBkgnd.DrawPicture(BackgroundBitmap, ACanvas.Canvas, R, ppmTile, 1, 1, -R.Left, -R.Top);
end;
procedure DrawCheck(R: TRect);
const
Painters: array[Boolean] of TcxCustomLookAndFeelPainterClass =
(TcxStandardLookAndFeelPainter, TcxUltraFlatLookAndFeelPainter);
CheckStateMap: array[Boolean] of TcxCheckBoxState = (cbsChecked, cbsUnchecked);
var
X, Y: Integer;
CheckState: Variant;
begin
with R do
begin
X := Left + (Right - Left - dxPSGlbl.CheckWidth) div 2;
Y := Top + (Bottom - Top - dxPSGlbl.CheckHeight) div 2;
end;
R := MakeBounds(X, Y, dxPSGlbl.CheckWidth, dxPSGlbl.CheckHeight);
CheckState := Variant(CheckStateMap[AViewInfo.RecordViewInfo.GridRecord.RecordIndex = 2]);
with Painters[ReportLink.OptionsRefinements.FlatCheckMarks] do
DrawCheckButton(ACanvas, R, cxbsDefault, CheckState = Variant(cbsChecked));
end;
var
R: TRect;
begin
if (Sender is TcxGridTableView) or (AViewInfo is TcxGridCardRowDataViewInfo) then
begin
R := AViewInfo.Bounds;
DrawBackground(R);
DrawCheck(R);
CustomDrawBorders(ACanvas, AViewInfo);
ADone := True;
end;
end;
procedure TdxfmGridReportLinkDesignWindow.VendorLogoCustomDrawCell(
Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
var
PrevText: string;
begin
if ReportLink.OptionsRefinements.DisplayGraphicsAsText and
((Sender is TcxGridTableView) or (AViewInfo is TcxGridCardRowDataViewInfo)) then
begin
PrevText := AViewInfo.Text;
AViewInfo.Text := ReportLink.OptionsRefinements.GraphicsText;
AViewInfo.AlignmentVert := vaTop;
//AViewInfo.Transparent := True;
CustomDrawTextRect(ACanvas, AViewInfo.Bounds, AViewInfo, AViewInfo.RecordViewInfo.BackgroundBitmap);
AViewInfo.Text := PrevText;
CustomDrawBorders(ACanvas, AViewInfo);
ADone := True;
end;
end;
procedure TdxfmGridReportLinkDesignWindow.PreviewBandedViewCustomDrawColumnHeader(
Sender: TcxGridTableView; ACanvas: TcxCanvas;
AViewInfo: TcxGridColumnHeaderViewInfo; var ADone: Boolean);
var
R: TRect;
begin
R := AViewInfo.Bounds;
Dec(R.Left);
if not ((PreviewGrid.LookAndFeel.Kind = lfUltraFlat) and
not TcxGridBandedTableOptionsView(Sender.OptionsView).BandHeaders) then
Dec(R.Top);
CustomDrawHeader(ACanvas, R, AViewInfo);
ADone := True;
end;
procedure TdxfmGridReportLinkDesignWindow.PreviewBandedViewCustomDrawBandHeader(
Sender: TcxGridBandedTableView; ACanvas: TcxCanvas;
AViewInfo: TcxGridBandHeaderViewInfo; var ADone: Boolean);
var
R: TRect;
begin
R := AViewInfo.Bounds;
Dec(R.Left);
CustomDrawHeader(ACanvas, R, AViewInfo);
ADone := True;
end;
procedure TdxfmGridReportLinkDesignWindow.PreviewBandedViewCustomDrawFooterCell(
Sender: TcxGridTableView; ACanvas: TcxCanvas;
AViewInfo: TcxGridColumnHeaderViewInfo; var ADone: Boolean);
begin
CustomDrawFooter(ACanvas, AViewInfo.Bounds, AViewInfo);
ADone := True;
end;
procedure TdxfmGridReportLinkDesignWindow.StyleColorClick(Sender: TObject);
begin
PerformStylesChangeColor;
end;
procedure TdxfmGridReportLinkDesignWindow.StyleFontClick(Sender: TObject);
begin
PerformStylesChangeFont;
end;
procedure TdxfmGridReportLinkDesignWindow.StyleBackgroundBitmapClick(Sender: TObject);
begin
PerformStylesChangeBitmap;
end;
procedure TdxfmGridReportLinkDesignWindow.StyleBackgroundBitmapClearClick(Sender: TObject);
begin
PerformStylesClearBitmap;
end;
procedure TdxfmGridReportLinkDesignWindow.StyleRestoreDefaultsClick(Sender: TObject);
begin
PerformStylesRestoreDefaults;
end;
procedure TdxfmGridReportLinkDesignWindow.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 TdxfmGridReportLinkDesignWindow.cbxStyleSheetsClick(Sender: TObject);
begin
with TComboBox(Sender) do
ActiveStyleSheet := TcxCustomStyleSheet(Items.Objects[ItemIndex]);
end;
procedure TdxfmGridReportLinkDesignWindow.StyleSheetNewClick(Sender: TObject);
begin
PerformStyleSheetNew;
end;
procedure TdxfmGridReportLinkDesignWindow.StyleSheetCopyClick(Sender: TObject);
begin
PerformStyleSheetCopy;
end;
procedure TdxfmGridReportLinkDesignWindow.StyleSheetDeleteClick(Sender: TObject);
begin
PerformStyleSheetDelete;
end;
procedure TdxfmGridReportLinkDesignWindow.StyleSheetRenameClick(Sender: TObject);
begin
PerformStyleSheetRename;
end;
procedure TdxfmGridReportLinkDesignWindow.StylesSaveAsClick(Sender: TObject);
begin
PerformStylesSaveAsStyleSheet;
end;
procedure TdxfmGridReportLinkDesignWindow.cbxStyleSheetsKeyDown(Sender: TObject;
var Key: Word; Shift: TShiftState);
begin
PerformStyleSheetKeyDown(Sender, Key, Shift);
end;
procedure TdxfmGridReportLinkDesignWindow.cbxStyleSheetsDrawItem(
Control: TWinControl; Index: Integer; Rect: TRect;
State: TOwnerDrawState);
begin
PerformStyleSheetDrawItem(TComboBox(Control).Canvas, Index, Rect, State, Control.Enabled);
end;
procedure RegisterAssistants;
begin
TdxCustomGridViewBuilder.Register;
TdxCustomGridTableViewBuilder.Register;
TdxGridTableViewBuilder.Register;
TdxGridDBTableViewBuilder.Register;
TdxGridBandedTableViewBuilder.Register;
TdxGridDBBandedTableViewBuilder.Register;
TdxGridCardViewBuilder.Register;
TdxGridDBCardViewBuilder.Register;
{$IFDEF CHARTVIEW}
TdxGridChartViewBuilder.Register;
{$ENDIF}
TdxCustomGridViewHelper.Register;
TdxCustomGridTableViewHelper.Register;
TdxGridCardViewHelper.Register;
TdxGridTableViewHelper.Register;
TdxGridBandedTableViewHelper.Register;
TdxCustomGridRecordHelper.Register;
TdxCustomGridRowHelper.Register;
TdxGridDataRowHelper.Register;
TdxGridGroupRowHelper.Register;
TdxGridMasterDataRowHelper.Register;
TdxGridReportLinkStyleSheet.Register;
end;
procedure RegisterItems;
begin
TdxReportCard.Register;
TdxReportCardRow.Register;
end;
procedure UnregisterAssistants;
begin
TdxGridReportLinkStyleSheet.Unregister;
TdxGridViewBuildersFactory.ReleaseInstance;
TdxViewHelpersFactory.ReleaseInstance;
TdxRecordHelpersFactory.ReleaseInstance;
end;
procedure UnregisterItems;
begin
TdxReportCardRow.Unregister;
TdxReportCard.Unregister;
end;
initialization
RegisterAssistants;
RegisterItems;
dxPSRegisterReportLink(TdxGridReportLink, TcxGrid, TdxfmGridReportLinkDesignWindow);
finalization
dxPSUnregisterReportLink(TdxGridReportLink, TcxGrid, TdxfmGridReportLinkDesignWindow);
UnregisterItems;
UnregisterAssistants;
FreeAndNil(FGridLinkStyleSheetPrototype);
end.