git-svn-id: https://192.168.0.254/svn/Componentes.Terceros.DevExpressVCL@21 05c56307-c608-d34a-929d-697000501d7a
14090 lines
439 KiB
ObjectPascal
14090 lines
439 KiB
ObjectPascal
{********************************************************************}
|
|
{ }
|
|
{ Developer Express Visual Component Library }
|
|
{ ExpressQuantumGrid }
|
|
{ }
|
|
{ Copyright (c) 1998-2007 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 EXPRESSQUANTUMGRID 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 cxGridTableView;
|
|
|
|
{$I cxVer.inc}
|
|
|
|
interface
|
|
|
|
uses
|
|
{$IFDEF DELPHI6}
|
|
Variants,
|
|
{$ENDIF}
|
|
Windows, Messages,
|
|
Classes, Graphics, Controls, ImgList, Forms, Buttons, StdCtrls, ExtCtrls, ComCtrls,
|
|
cxClasses, cxControls, cxGraphics, cxLookAndFeels, cxLookAndFeelPainters, cxStyles,
|
|
cxStorage, cxPC, cxListBox,
|
|
cxContainer, cxEdit, cxTextEdit,
|
|
cxGrid, cxGridCommon, cxGridLevel, cxGridCustomView, cxGridCustomTableView, cxGridDetailsSite,
|
|
cxCustomData, cxData, cxDataStorage, cxFilter;
|
|
|
|
const
|
|
htGridBase = 200;
|
|
htGroupByBox = htGridBase + 1;
|
|
htColumnHeader = htGridBase + 2;
|
|
htColumnHeaderHorzSizingEdge = htGridBase + 3;
|
|
htColumnHeaderFilterButton = htGridBase + 4;
|
|
htFooter = htGridBase + 5;
|
|
htFooterCell = htGridBase + 6;
|
|
htGroupFooter = htGridBase + 7;
|
|
htGroupFooterCell = htGridBase + 8;
|
|
htRowIndicator = htGridBase + 9;
|
|
htRowSizingEdge = htGridBase + 10;
|
|
htIndicator = htGridBase + 11;
|
|
htIndicatorHeader = htGridBase + 12;
|
|
htRowLevelIndent = htGridBase + 13;
|
|
htHeader = htGridBase + 14;
|
|
htGroupSummary = htGridBase + 15;
|
|
|
|
ckHeader = 2;
|
|
ckGroupByBox = 3;
|
|
ckFooter = 4;
|
|
|
|
cxGridDefaultIndicatorWidth = 12;
|
|
|
|
cxGridCustomRowSeparatorDefaultWidth = 6;
|
|
cxGridCustomRowSeparatorMinWidth = 2;
|
|
|
|
cxGridPreviewDefaultLeftIndent = 20;
|
|
cxGridPreviewDefaultMaxLineCount = 3;
|
|
cxGridPreviewDefaultRightIndent = 5;
|
|
|
|
cxGridHeaderSizingEdgeSize = 8;
|
|
cxGridRowSizingEdgeSize = 8;
|
|
|
|
cxGridOffice11GroupRowSeparatorWidth: Integer = 2;
|
|
|
|
// record kind
|
|
rkFiltering = 2;
|
|
|
|
isColumnFirst = isCustomItemLast + 1;
|
|
isFooter = isColumnFirst;
|
|
isGroupSummary = isColumnFirst + 1;
|
|
isHeader = isColumnFirst + 2;
|
|
isColumnLast = isHeader;
|
|
|
|
bbTableFirst = bbCustomTableLast + 1;
|
|
bbFooter = bbTableFirst;
|
|
bbHeader = bbTableFirst + 1;
|
|
bbGroup = bbTableFirst + 2;
|
|
bbGroupByBox = bbTableFirst + 3;
|
|
bbIndicator = bbTableFirst + 4;
|
|
bbPreview = bbTableFirst + 5;
|
|
bbTableLast = bbPreview;
|
|
|
|
vsTableFirst = vsCustomTableLast + 1;
|
|
vsFilterRowInfoText = vsTableFirst;
|
|
vsFooter = vsTableFirst + 1;
|
|
vsGroup = vsTableFirst + 2;
|
|
vsGroupByBox = vsTableFirst + 3;
|
|
vsGroupFooterSortedSummary = vsTableFirst + 4;
|
|
vsGroupSortedSummary = vsTableFirst + 5;
|
|
vsGroupSummary = vsTableFirst + 6;
|
|
vsHeader = vsTableFirst + 7;
|
|
vsNewItemRowInfoText = vsTableFirst + 8;
|
|
vsIndicator = vsTableFirst + 9;
|
|
vsPreview = vsTableFirst + 10;
|
|
vsTableLast = vsPreview;
|
|
|
|
{$IFDEF BCB}
|
|
siFooter = 0;
|
|
siGroupFooter = 1;
|
|
siGroup = 2;
|
|
{$ENDIF}
|
|
|
|
type
|
|
TcxGridTableCustomizationForm = class;
|
|
TcxGridTableController = class;
|
|
TcxCustomGridRow = class;
|
|
TcxGridMasterDataRow = class;
|
|
TcxGridGroupRow = class;
|
|
TcxGridViewData = class;
|
|
TcxGridColumnHeaderAreaPainterClass = class of TcxGridColumnHeaderAreaPainter;
|
|
TcxGridColumnContainerViewInfo = class;
|
|
TcxGridColumnHeaderAreaViewInfoClass = class of TcxGridColumnHeaderAreaViewInfo;
|
|
TcxGridColumnHeaderAreaViewInfo = class;
|
|
TcxGridColumnHeaderFilterButtonViewInfo = class;
|
|
TcxGridColumnHeaderGlyphViewInfo = class;
|
|
TcxGridColumnHeaderViewInfoClass = class of TcxGridColumnHeaderViewInfo;
|
|
TcxGridColumnHeaderViewInfo = class;
|
|
TcxGridHeaderViewInfo = class;
|
|
TcxGridGroupByBoxViewInfo = class;
|
|
TcxGridFooterViewInfo = class;
|
|
TcxCustomGridIndicatorItemViewInfo = class;
|
|
TcxGridIndicatorHeaderItemViewInfo = class;
|
|
TcxGridIndicatorRowItemViewInfo = class;
|
|
TcxGridIndicatorFooterItemViewInfo = class;
|
|
TcxGridIndicatorViewInfo = class;
|
|
TcxGridRowFooterViewInfo = class;
|
|
TcxGridRowFootersViewInfo = class;
|
|
TcxCustomGridRowViewInfo = class;
|
|
TcxGridRowsViewInfo = class;
|
|
TcxGridTableViewInfo = class;
|
|
TcxGridTableViewInfoCacheItem = class;
|
|
TcxGridColumn = class;
|
|
TcxGridTableView = class;
|
|
|
|
TcxGridColumnContainerKind = Integer;
|
|
|
|
{ hit tests }
|
|
|
|
// custom column
|
|
|
|
TcxCustomGridColumnHitTest = class(TcxCustomGridViewHitTest)
|
|
public
|
|
Column: TcxGridColumn;
|
|
ColumnContainerKind: TcxGridColumnContainerKind;
|
|
end;
|
|
|
|
// group by box
|
|
|
|
TcxGridGroupByBoxHitTest = class(TcxCustomGridViewHitTest)
|
|
protected
|
|
class function GetHitTestCode: Integer; override;
|
|
end;
|
|
|
|
// column header
|
|
|
|
TcxGridColumnHeaderHitTest = class(TcxCustomGridColumnHitTest)
|
|
protected
|
|
class function GetHitTestCode: Integer; override;
|
|
public
|
|
function DragAndDropObjectClass: TcxCustomGridDragAndDropObjectClass; override;
|
|
end;
|
|
|
|
TcxGridColumnHeaderHorzSizingEdgeHitTest = class(TcxCustomGridColumnHitTest)
|
|
protected
|
|
class function GetHitTestCode: Integer; override;
|
|
public
|
|
function Cursor: TCursor; override;
|
|
function DragAndDropObjectClass: TcxCustomGridDragAndDropObjectClass; override;
|
|
end;
|
|
|
|
TcxGridColumnHeaderFilterButtonHitTest = class(TcxCustomGridColumnHitTest)
|
|
protected
|
|
class function GetHitTestCode: Integer; override;
|
|
end;
|
|
|
|
// header
|
|
|
|
TcxGridHeaderHitTest = class(TcxCustomGridViewHitTest)
|
|
protected
|
|
class function GetHitTestCode: Integer; override;
|
|
end;
|
|
|
|
// footer
|
|
|
|
TcxGridFooterHitTest = class(TcxCustomGridViewHitTest)
|
|
protected
|
|
class function GetHitTestCode: Integer; override;
|
|
end;
|
|
|
|
TcxGridFooterCellHitTest = class(TcxCustomGridColumnHitTest)
|
|
protected
|
|
class function GetHitTestCode: Integer; override;
|
|
public
|
|
SummaryItem: TcxDataSummaryItem;
|
|
end;
|
|
|
|
TcxGridGroupFooterHitTest = class(TcxGridFooterHitTest)
|
|
protected
|
|
class function GetHitTestCode: Integer; override;
|
|
end;
|
|
|
|
TcxGridGroupFooterCellHitTest = class(TcxGridFooterCellHitTest)
|
|
protected
|
|
class function GetHitTestCode: Integer; override;
|
|
end;
|
|
|
|
// indicator
|
|
|
|
TcxGridRowIndicatorHitTest = class(TcxGridRecordHitTest)
|
|
protected
|
|
class function GetHitTestCode: Integer; override;
|
|
public
|
|
MultiSelect: Boolean;
|
|
function Cursor: TCursor; override;
|
|
end;
|
|
|
|
TcxGridRowSizingEdgeHitTest = class(TcxGridRecordHitTest)
|
|
protected
|
|
class function GetHitTestCode: Integer; override;
|
|
public
|
|
function Cursor: TCursor; override;
|
|
function DragAndDropObjectClass: TcxCustomGridDragAndDropObjectClass; override;
|
|
end;
|
|
|
|
TcxGridIndicatorHitTest = class(TcxCustomGridViewHitTest)
|
|
protected
|
|
class function GetHitTestCode: Integer; override;
|
|
end;
|
|
|
|
TcxGridIndicatorHeaderHitTest = class(TcxGridIndicatorHitTest)
|
|
protected
|
|
class function GetHitTestCode: Integer; override;
|
|
end;
|
|
|
|
// row
|
|
|
|
TcxGridRowLevelIndentHitTest = class(TcxGridRecordHitTest)
|
|
protected
|
|
class function GetHitTestCode: Integer; override;
|
|
public
|
|
class function CanClick: Boolean; override;
|
|
end;
|
|
|
|
TcxGridGroupSummaryHitTest = class(TcxGridRecordHitTest)
|
|
private
|
|
function GetColumn: TcxGridColumn;
|
|
protected
|
|
class function GetHitTestCode: Integer; override;
|
|
public
|
|
SummaryItem: TcxDataSummaryItem;
|
|
property Column: TcxGridColumn read GetColumn;
|
|
end;
|
|
|
|
{ view data }
|
|
|
|
TcxCustomGridRowClass = class of TcxCustomGridRow;
|
|
|
|
TcxCustomGridRow = class(TcxCustomGridRecord)
|
|
private
|
|
function GetAsGroupRow: TcxGridGroupRow;
|
|
function GetAsMasterDataRow: TcxGridMasterDataRow;
|
|
function GetGridView: TcxGridTableView;
|
|
function GetGridViewLevel: TcxGridLevel;
|
|
function GetIsFilterRow: Boolean;
|
|
function GetIsNewItemRow: Boolean;
|
|
function GetViewData: TcxGridViewData;
|
|
protected
|
|
procedure KeyDown(var Key: Word; Shift: TShiftState); override;
|
|
public
|
|
function ExpandOnDblClick: Boolean; virtual;
|
|
function SupportsCellMultiSelect: Boolean; virtual;
|
|
|
|
property AsGroupRow: TcxGridGroupRow read GetAsGroupRow;
|
|
property AsMasterDataRow: TcxGridMasterDataRow read GetAsMasterDataRow;
|
|
property GridView: TcxGridTableView read GetGridView;
|
|
property GridViewLevel: TcxGridLevel read GetGridViewLevel;
|
|
property IsFilterRow: Boolean read GetIsFilterRow;
|
|
property IsNewItemRow: Boolean read GetIsNewItemRow;
|
|
property ViewData: TcxGridViewData read GetViewData;
|
|
end;
|
|
|
|
TcxGridDataRow = class(TcxCustomGridRow)
|
|
protected
|
|
function GetHasCells: Boolean; override;
|
|
function GetViewInfoCacheItemClass: TcxCustomGridViewInfoCacheItemClass; override;
|
|
function GetViewInfoClass: TcxCustomGridRecordViewInfoClass; override;
|
|
public
|
|
function SupportsCellMultiSelect: Boolean; override;
|
|
end;
|
|
|
|
TcxGridNewItemRowClass = class of TcxGridNewItemRow;
|
|
|
|
TcxGridNewItemRow = class(TcxGridDataRow)
|
|
public
|
|
function SupportsCellMultiSelect: Boolean; override;
|
|
end;
|
|
|
|
TcxGridFilterRowClass = class of TcxGridFilterRow;
|
|
|
|
TcxGridFilterRow = class(TcxGridNewItemRow)
|
|
private
|
|
FSelected: Boolean;
|
|
function GetFilterCriteriaItem(Index: Integer): TcxFilterCriteriaItem;
|
|
protected
|
|
procedure RefreshRecordInfo; override;
|
|
|
|
function GetSelected: Boolean; override;
|
|
function GetVisible: Boolean; override;
|
|
procedure SetSelected(Value: Boolean); override;
|
|
|
|
function GetDisplayText(Index: Integer): string; override;
|
|
function GetValue(Index: Integer): Variant; override;
|
|
procedure SetDisplayText(Index: Integer; const Value: string); override;
|
|
procedure SetValue(Index: Integer; const Value: Variant); override;
|
|
|
|
function GetDisplayTextForValue(AIndex: Integer; const AValue: Variant): string; virtual;
|
|
function GetFilterOperatorKind(const AValue: Variant; ACheckMask: Boolean): TcxFilterOperatorKind; virtual;
|
|
function IsFilterOperatorSupported(AKind: TcxFilterOperatorKind; const AValue: Variant): Boolean; virtual;
|
|
|
|
procedure KeyDown(var Key: Word; Shift: TShiftState); override;
|
|
|
|
property FilterCriteriaItems[Index: Integer]: TcxFilterCriteriaItem read GetFilterCriteriaItem;
|
|
property InternalSelected: Boolean read FSelected write FSelected;
|
|
public
|
|
destructor Destroy; override;
|
|
function CanFocusCells: Boolean; override;
|
|
function IsEmpty: Boolean;
|
|
end;
|
|
|
|
TcxGridMasterDataRow = class(TcxGridDataRow)
|
|
private
|
|
function GetActiveDetailGridView: TcxCustomGridView;
|
|
function GetActiveDetailGridViewExists: Boolean;
|
|
function GetActiveDetailIndex: Integer;
|
|
function GetActiveDetailLevel: TcxGridLevel;
|
|
function GetDetailGridView(Index: Integer): TcxCustomGridView;
|
|
function GetDetailGridViewCount: Integer;
|
|
function GetDetailGridViewExists(Index: Integer): Boolean;
|
|
function GetDetailGridViewHasData(Index: Integer): Boolean;
|
|
function GetInternalActiveDetailIndex: Integer;
|
|
procedure SetActiveDetailIndex(Value: Integer);
|
|
procedure SetActiveDetailLevel(Value: TcxGridLevel);
|
|
protected
|
|
procedure DoCollapse(ARecurse: Boolean); override;
|
|
procedure DoExpand(ARecurse: Boolean); override;
|
|
function GetExpandable: Boolean; override;
|
|
function GetExpanded: Boolean; override;
|
|
function GetHasChildren: Boolean; virtual;
|
|
function GetViewInfoCacheItemClass: TcxCustomGridViewInfoCacheItemClass; override;
|
|
function GetViewInfoClass: TcxCustomGridRecordViewInfoClass; override;
|
|
procedure KeyDown(var Key: Word; Shift: TShiftState); override;
|
|
procedure ToggleExpanded; override;
|
|
property InternalActiveDetailIndex: Integer read GetInternalActiveDetailIndex;
|
|
public
|
|
function ExpandOnDblClick: Boolean; override;
|
|
function GetFirstFocusableChild: TcxCustomGridRecord; override;
|
|
function GetLastFocusableChild(ARecursive: Boolean): TcxCustomGridRecord; override;
|
|
|
|
property ActiveDetailGridView: TcxCustomGridView read GetActiveDetailGridView;
|
|
property ActiveDetailGridViewExists: Boolean read GetActiveDetailGridViewExists;
|
|
property ActiveDetailIndex: Integer read GetActiveDetailIndex write SetActiveDetailIndex;
|
|
property ActiveDetailLevel: TcxGridLevel read GetActiveDetailLevel write SetActiveDetailLevel;
|
|
property DetailGridViewCount: Integer read GetDetailGridViewCount;
|
|
property DetailGridViewExists[Index: Integer]: Boolean read GetDetailGridViewExists;
|
|
property DetailGridViewHasData[Index: Integer]: Boolean read GetDetailGridViewHasData;
|
|
property DetailGridViews[Index: Integer]: TcxCustomGridView read GetDetailGridView;
|
|
property HasChildren: Boolean read GetHasChildren;
|
|
end;
|
|
|
|
TcxGridGroupRow = class(TcxCustomGridRow)
|
|
private
|
|
function GetGroupedColumn: TcxGridColumn;
|
|
function GetGroupSummaryItems: TcxDataGroupSummaryItems;
|
|
protected
|
|
procedure DoCollapse(ARecurse: Boolean); override;
|
|
procedure DoExpand(ARecurse: Boolean); override;
|
|
//function GetDestroyingOnExpanding: Boolean; override;
|
|
function GetExpandable: Boolean; override;
|
|
function GetExpanded: Boolean; override;
|
|
|
|
function GetDisplayCaption: string; virtual;
|
|
function GetDisplayText(Index: Integer): string; override;
|
|
function GetDisplayTextValue: string; virtual;
|
|
function GetIsData: Boolean; override;
|
|
function GetIsParent: Boolean; override;
|
|
function GetValue: Variant; reintroduce; virtual;
|
|
function GetViewInfoCacheItemClass: TcxCustomGridViewInfoCacheItemClass; override;
|
|
function GetViewInfoClass: TcxCustomGridRecordViewInfoClass; override;
|
|
procedure SetDisplayText(Index: Integer; const Value: string); override;
|
|
procedure SetValue(Index: Integer; const Value: Variant); override;
|
|
public
|
|
function GetGroupSummaryInfo(var ASummaryItems: TcxDataSummaryItems;
|
|
var ASummaryValues: PVariant): Boolean;
|
|
|
|
property DisplayCaption: string read GetDisplayCaption;
|
|
property DisplayText: string read GetDisplayTextValue;
|
|
property GroupedColumn: TcxGridColumn read GetGroupedColumn;
|
|
property GroupSummaryItems: TcxDataGroupSummaryItems read GetGroupSummaryItems;
|
|
property Value: Variant read GetValue;
|
|
end;
|
|
|
|
TcxGridViewData = class(TcxCustomGridTableViewData)
|
|
private
|
|
FFilterRow: TcxGridFilterRow;
|
|
function GetNewItemRow: TcxGridNewItemRow;
|
|
function GetRow(Index: Integer): TcxCustomGridRow;
|
|
function GetRowCount: Integer;
|
|
protected
|
|
function GetFirstVisibleExpandedMasterRow: TcxGridMasterDataRow; virtual;
|
|
function GetNewItemRecordClass: TcxCustomGridRecordClass; override;
|
|
function GetRecordByKind(AKind, AIndex: Integer): TcxCustomGridRecord; override;
|
|
function GetRecordClass(ARecordInfo: TcxRowInfo): TcxCustomGridRecordClass; override;
|
|
function GetRecordKind(ARecord: TcxCustomGridRecord): Integer; override;
|
|
|
|
procedure CreateFilterRow;
|
|
procedure DestroyFilterRow;
|
|
procedure CheckFilterRow;
|
|
//procedure RecreateFilterRow;
|
|
function GetFilterRowClass: TcxGridFilterRowClass; virtual;
|
|
public
|
|
destructor Destroy; override;
|
|
procedure Collapse(ARecurse: Boolean); override;
|
|
procedure Expand(ARecurse: Boolean); override;
|
|
function HasFilterRow: Boolean; virtual;
|
|
function HasNewItemRecord: Boolean; override;
|
|
function MakeDetailVisible(ADetailLevel: TComponent{TcxGridLevel}): TcxCustomGridView; override;
|
|
//procedure Refresh(ARecordCount: Integer); override;
|
|
|
|
property FilterRow: TcxGridFilterRow read FFilterRow;
|
|
property NewItemRow: TcxGridNewItemRow read GetNewItemRow;
|
|
property RowCount: Integer read GetRowCount;
|
|
property Rows[Index: Integer]: TcxCustomGridRow read GetRow;
|
|
end;
|
|
|
|
{ controller }
|
|
|
|
// drag&drop objects
|
|
|
|
TcxGridColumnHeaderMovingObjectClass = class of TcxGridColumnHeaderMovingObject;
|
|
|
|
TcxGridColumnHeaderMovingObject = class(TcxCustomGridTableItemMovingObject)
|
|
private
|
|
FOriginalDestColumnContainerKind: TcxGridColumnContainerKind;
|
|
|
|
function GetGridView: TcxGridTableView;
|
|
function GetSourceItem: TcxGridColumn;
|
|
function GetViewInfo: TcxGridTableViewInfo;
|
|
procedure SetSourceItem(Value: TcxGridColumn);
|
|
protected
|
|
procedure CalculateDestParams(AHitTest: TcxCustomGridHitTest;
|
|
out AContainerKind: TcxGridItemContainerKind; out AZone: TcxGridItemContainerZone); override;
|
|
function CanRemove: Boolean; override;
|
|
procedure CheckDestItemContainerKind(var AValue: TcxGridItemContainerKind); override;
|
|
procedure DoColumnMoving; virtual;
|
|
function GetArrowAreaBounds(APlace: TcxGridArrowPlace): TRect; override;
|
|
function GetArrowAreaBoundsForHeader(APlace: TcxGridArrowPlace): TRect; virtual;
|
|
function GetArrowsClientRect: TRect; override;
|
|
function GetSourceItemViewInfo: TcxCustomGridCellViewInfo; override;
|
|
function IsValidDestination: Boolean; override;
|
|
function IsValidDestinationForVisibleSource: Boolean; virtual;
|
|
|
|
procedure EndDragAndDrop(Accepted: Boolean); override;
|
|
|
|
property GridView: TcxGridTableView read GetGridView;
|
|
property OriginalDestColumnContainerKind: TcxGridColumnContainerKind
|
|
read FOriginalDestColumnContainerKind write FOriginalDestColumnContainerKind;
|
|
property SourceItem: TcxGridColumn read GetSourceItem write SetSourceItem;
|
|
property ViewInfo: TcxGridTableViewInfo read GetViewInfo;
|
|
public
|
|
procedure Init(const P: TPoint; AParams: TcxCustomGridHitTest); override;
|
|
end;
|
|
|
|
TcxCustomGridSizingObject = class(TcxCustomGridDragAndDropObject)
|
|
private
|
|
FDestPointX: Integer;
|
|
FDestPointY: Integer;
|
|
FOriginalSize: Integer;
|
|
function GetController: TcxGridTableController;
|
|
function GetGridView: TcxGridTableView;
|
|
function GetViewInfo: TcxGridTableViewInfo;
|
|
procedure SetDestPointX(Value: Integer);
|
|
procedure SetDestPointY(Value: Integer);
|
|
protected
|
|
procedure DirtyChanged; override;
|
|
function GetCurrentSize: Integer; virtual;
|
|
function GetDeltaSize: Integer; virtual;
|
|
function GetDragAndDropCursor(Accepted: Boolean): TCursor; override;
|
|
function GetHorzSizingMarkBounds: TRect; virtual;
|
|
function GetImmediateStart: Boolean; override;
|
|
function GetIsHorizontalSizing: Boolean; virtual;
|
|
function GetSizingItemBounds: TRect; virtual; abstract;
|
|
function GetSizingMarkBounds: TRect; virtual;
|
|
function GetSizingMarkWidth: Integer; virtual; abstract;
|
|
function GetVertSizingMarkBounds: TRect; virtual;
|
|
|
|
procedure DragAndDrop(const P: TPoint; var Accepted: Boolean); override;
|
|
|
|
property Controller: TcxGridTableController read GetController;
|
|
property CurrentSize: Integer read GetCurrentSize;
|
|
property DeltaSize: Integer read GetDeltaSize;
|
|
property DestPointX: Integer read FDestPointX write SetDestPointX;
|
|
property DestPointY: Integer read FDestPointY write SetDestPointY;
|
|
property GridView: TcxGridTableView read GetGridView;
|
|
property IsHorizontalSizing: Boolean read GetIsHorizontalSizing;
|
|
property OriginalSize: Integer read FOriginalSize write FOriginalSize;
|
|
property SizingItemBounds: TRect read GetSizingItemBounds;
|
|
property SizingMarkBounds: TRect read GetSizingMarkBounds;
|
|
property SizingMarkWidth: Integer read GetSizingMarkWidth;
|
|
property ViewInfo: TcxGridTableViewInfo read GetViewInfo;
|
|
public
|
|
procedure Init(const P: TPoint; AParams: TcxCustomGridHitTest); override;
|
|
end;
|
|
|
|
TcxCustomGridColumnSizingObject = class(TcxCustomGridSizingObject)
|
|
private
|
|
FColumn: TcxGridColumn;
|
|
function GetColumnHeaderViewInfo: TcxGridColumnHeaderViewInfo;
|
|
protected
|
|
function GetSizingItemBounds: TRect; override;
|
|
function GetSizingMarkWidth: Integer; override;
|
|
property Column: TcxGridColumn read FColumn write FColumn;
|
|
property ColumnHeaderViewInfo: TcxGridColumnHeaderViewInfo read GetColumnHeaderViewInfo;
|
|
public
|
|
procedure Init(const P: TPoint; AParams: TcxCustomGridHitTest); override;
|
|
end;
|
|
|
|
TcxGridColumnHorzSizingObject = class(TcxCustomGridColumnSizingObject)
|
|
protected
|
|
procedure BeginDragAndDrop; override;
|
|
procedure EndDragAndDrop(Accepted: Boolean); override;
|
|
function GetCurrentSize: Integer; override;
|
|
end;
|
|
|
|
TcxGridRowSizingObject = class(TcxCustomGridSizingObject)
|
|
private
|
|
FRow: TcxCustomGridRow;
|
|
function GetRowViewInfo: TcxCustomGridRowViewInfo;
|
|
protected
|
|
procedure BeginDragAndDrop; override;
|
|
procedure EndDragAndDrop(Accepted: Boolean); override;
|
|
function GetCurrentSize: Integer; override;
|
|
function GetIsHorizontalSizing: Boolean; override;
|
|
function GetSizingItemBounds: TRect; override;
|
|
function GetSizingMarkWidth: Integer; override;
|
|
property Row: TcxCustomGridRow read FRow;
|
|
property RowViewInfo: TcxCustomGridRowViewInfo read GetRowViewInfo;
|
|
public
|
|
procedure Init(const P: TPoint; AParams: TcxCustomGridHitTest); override;
|
|
end;
|
|
|
|
// customization form
|
|
|
|
TcxGridTableItemsListBox = class(TcxCustomGridTableItemsListBox)
|
|
private
|
|
function GetGridView: TcxGridTableView;
|
|
protected
|
|
function CalculateItemHeight: Integer; override;
|
|
function DrawItemDrawBackgroundHandler(ACanvas: TcxCanvas; const ABounds: TRect): Boolean; virtual; abstract;
|
|
function GetItemEndEllipsis: Boolean; virtual; abstract;
|
|
property GridView: TcxGridTableView read GetGridView;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
procedure PaintItem(ACanvas: TcxCanvas; R: TRect; AIndex: Integer; AFocused: Boolean); override;
|
|
end;
|
|
|
|
TcxGridTableColumnsListBox = class(TcxGridTableItemsListBox)
|
|
protected
|
|
function DrawItemDrawBackgroundHandler(ACanvas: TcxCanvas; const ABounds: TRect): Boolean; override;
|
|
function GetDragAndDropParams: TcxCustomGridHitTest; override;
|
|
function GetItemEndEllipsis: Boolean; override;
|
|
public
|
|
procedure RefreshItems; override;
|
|
end;
|
|
|
|
TcxGridTableCustomizationForm = class(TcxCustomGridTableCustomizationForm)
|
|
private
|
|
function GetColumnsListBox: TcxGridTableColumnsListBox;
|
|
function GetColumnsPage: TcxTabSheet;
|
|
function GetController: TcxGridTableController;
|
|
function GetGridView: TcxGridTableView;
|
|
function GetViewInfo: TcxGridTableViewInfo;
|
|
protected
|
|
function GetItemsListBoxClass: TcxCustomGridTableItemsListBoxClass; override;
|
|
function GetItemsPageCaption: string; override;
|
|
|
|
property ColumnsListBox: TcxGridTableColumnsListBox read GetColumnsListBox;
|
|
property GridView: TcxGridTableView read GetGridView;
|
|
property ViewInfo: TcxGridTableViewInfo read GetViewInfo;
|
|
public
|
|
property Controller: TcxGridTableController read GetController;
|
|
property ColumnsPage: TcxTabSheet read GetColumnsPage;
|
|
end;
|
|
|
|
// drag open info
|
|
|
|
TcxGridDragOpenInfoMasterDataRowTab = class(TcxGridDragOpenInfoTab)
|
|
public
|
|
GridRow: TcxGridMasterDataRow;
|
|
constructor Create(ALevel: TcxGridLevel; AGridRow: TcxGridMasterDataRow); reintroduce; virtual;
|
|
function Equals(AInfo: TcxCustomGridDragOpenInfo): Boolean; override;
|
|
procedure Run; override;
|
|
end;
|
|
|
|
// popup
|
|
|
|
TcxGridColumnsCustomizationPopup = class(TcxCustomGridItemsCustomizationPopup)
|
|
private
|
|
function GetGridView: TcxGridTableView;
|
|
protected
|
|
procedure ItemClicked(AItem: TObject; AChecked: Boolean); override;
|
|
procedure SetItemIndex(AItem: TObject; AIndex: Integer); override;
|
|
public
|
|
property GridView: TcxGridTableView read GetGridView;
|
|
end;
|
|
|
|
// controllers
|
|
|
|
TcxGridTableEditingController = class(TcxGridEditingController)
|
|
private
|
|
FApplyingImmediateFiltering: Boolean;
|
|
function GetController: TcxGridTableController;
|
|
function GetGridView: TcxGridTableView;
|
|
protected
|
|
function CanInitEditing: Boolean; override;
|
|
function CanUpdateEditValue: Boolean; override;
|
|
procedure DoEditChanged; override;
|
|
procedure DoEditKeyDown(var Key: Word; Shift: TShiftState); override;
|
|
function GetHideEditOnFocusedRecordChange: Boolean; override;
|
|
procedure InitEdit; override;
|
|
procedure PostEditingData; override;
|
|
property ApplyingImmediateFiltering: Boolean read FApplyingImmediateFiltering write FApplyingImmediateFiltering;
|
|
public
|
|
property Controller: TcxGridTableController read GetController;
|
|
property GridView: TcxGridTableView read GetGridView;
|
|
end;
|
|
|
|
TcxGridTableController = class(TcxCustomGridTableController)
|
|
private
|
|
FCellSelectionAnchor: TcxGridColumn;
|
|
FHorzSizingColumn: TcxGridColumn;
|
|
FIsFilterPopupOpenedFromHeader: Boolean;
|
|
FKeepFilterRowFocusing: Boolean;
|
|
FLeftPos: Integer;
|
|
FPressedColumn: TcxGridColumn;
|
|
FSelectedColumns: TList;
|
|
|
|
function GetColumnsCustomizationPopup: TcxGridColumnsCustomizationPopup;
|
|
function GetCustomizationForm: TcxGridTableCustomizationForm;
|
|
function GetEditingController: TcxGridTableEditingController;
|
|
function GetFocusedColumn: TcxGridColumn;
|
|
function GetFocusedColumnIndex: Integer;
|
|
function GetFocusedRow: TcxCustomGridRow;
|
|
function GetFocusedRowIndex: Integer;
|
|
function GetGridView: TcxGridTableView;
|
|
function GetIsColumnHorzSizing: Boolean;
|
|
function GetSelectedColumn(Index: Integer): TcxGridColumn;
|
|
function GetSelectedColumnCount: Integer;
|
|
function GetSelectedRow(Index: Integer): TcxCustomGridRow;
|
|
function GetSelectedRowCount: Integer;
|
|
function GetTopRowIndex: Integer;
|
|
function GetViewData: TcxGridViewData;
|
|
function GetViewInfo: TcxGridTableViewInfo;
|
|
procedure SetFocusedColumn(Value: TcxGridColumn);
|
|
procedure SetFocusedColumnIndex(Value: Integer);
|
|
procedure SetFocusedRow(Value: TcxCustomGridRow);
|
|
procedure SetFocusedRowIndex(Value: Integer);
|
|
procedure SetLeftPos(Value: Integer);
|
|
procedure SetPressedColumn(Value: TcxGridColumn);
|
|
procedure SetTopRowIndex(Value: Integer);
|
|
|
|
procedure AddSelectedColumn(AColumn: TcxGridColumn);
|
|
procedure RemoveSelectedColumn(AColumn: TcxGridColumn);
|
|
protected
|
|
function CanAppend(ACheckOptions: Boolean): Boolean; override;
|
|
function CanDelete(ACheckOptions: Boolean): Boolean; override;
|
|
function CanEdit: Boolean; override;
|
|
function CanInsert(ACheckOptions: Boolean): Boolean; override;
|
|
procedure CheckCoordinates; override;
|
|
procedure CheckLeftPos(var Value: Integer);
|
|
procedure FocusedItemChanged(APrevFocusedItem: TcxCustomGridTableItem); override;
|
|
procedure FocusedRecordChanged(APrevFocusedRecordIndex, AFocusedRecordIndex: Integer;
|
|
ANewItemRecordFocusingChanged: Boolean); override;
|
|
function GetDesignHitTest(AHitTest: TcxCustomGridHitTest): Boolean; override;
|
|
function GetFocusedRecord: TcxCustomGridRecord; override;
|
|
function GetIsRecordsScrollHorizontal: Boolean; override;
|
|
function GetItemsCustomizationPopupClass: TcxCustomGridItemsCustomizationPopupClass; override;
|
|
function GetMaxTopRecordIndexValue: Integer; override;
|
|
function GetMouseWheelScrollingKind: TcxMouseWheelScrollingKind; override;
|
|
function GetScrollBarRecordCount: Integer; override;
|
|
function IsColumnFixedDuringHorzSizing(AColumn: TcxGridColumn): Boolean; virtual;
|
|
function IsKeyForMultiSelect(AKey: Word; AShift: TShiftState;
|
|
AFocusedRecordChanged: Boolean): Boolean; override;
|
|
function IsPixelScrollBar(AKind: TScrollBarKind): Boolean; override;
|
|
procedure LeftPosChanged; virtual;
|
|
function NeedsAdditionalRowsScrolling(AIsCallFromMaster: Boolean = False): Boolean; virtual;
|
|
procedure RemoveFocus; override;
|
|
procedure ScrollData(ADirection: TcxDirection); override;
|
|
procedure SetFocusedRecord(Value: TcxCustomGridRecord); override;
|
|
procedure ShowNextPage; override;
|
|
procedure ShowPrevPage; override;
|
|
|
|
// internal draganddrop data scrolling
|
|
function CanScrollData(ADirection: TcxDirection): Boolean; override;
|
|
|
|
// selection
|
|
function CanPostponeRecordSelection: Boolean; override;
|
|
function CanProcessMultiSelect(AHitTest: TcxCustomGridHitTest;
|
|
AShift: TShiftState): Boolean; override;
|
|
procedure DoMouseNormalSelection(AHitTest: TcxCustomGridHitTest); override;
|
|
procedure DoMouseRangeSelection(AClearSelection: Boolean = True; AData: TObject = nil); override;
|
|
procedure DoNormalSelection; override;
|
|
procedure MultiSelectKeyDown(var Key: Word; Shift: TShiftState); override;
|
|
function SupportsAdditiveSelection: Boolean; override;
|
|
function SupportsRecordSelectionToggling: Boolean; override;
|
|
|
|
// special row focusing
|
|
function DefocusSpecialRow: Boolean; virtual;
|
|
function FocusSpecialRow: Boolean; virtual;
|
|
procedure FilterRowFocusChanged; virtual;
|
|
procedure FilterRowFocusChanging(AValue: Boolean); virtual;
|
|
|
|
// pull focusing
|
|
procedure DoPullFocusingScrolling(ADirection: TcxDirection); override;
|
|
function GetPullFocusingScrollingDirection(X, Y: Integer; out ADirection: TcxDirection): Boolean; override;
|
|
function SupportsPullFocusing: Boolean; override;
|
|
|
|
// delphi drag and drop
|
|
function GetDragOpenInfo(AHitTest: TcxCustomGridHitTest): TcxCustomGridDragOpenInfo; override;
|
|
function GetDragScrollDirection(X, Y: Integer): TcxDirection; override;
|
|
|
|
// customization
|
|
procedure CheckCustomizationFormBounds(var R: TRect); override;
|
|
function GetColumnHeaderDragAndDropObjectClass: TcxGridColumnHeaderMovingObjectClass; virtual;
|
|
function GetCustomizationFormClass: TcxCustomGridCustomizationFormClass; override;
|
|
|
|
// cells selection
|
|
function CanProcessCellMultiSelect(APrevFocusedColumn: TcxGridColumn): Boolean; virtual;
|
|
procedure CellMultiSelectKeyDown(var Key: Word; Shift: TShiftState); virtual;
|
|
procedure DoNormalCellSelection;
|
|
procedure DoRangeCellSelection;
|
|
function GetCellMultiSelect: Boolean; virtual;
|
|
property CellMultiSelect: Boolean read GetCellMultiSelect;
|
|
|
|
// BeginsWith mask
|
|
procedure AddBeginsWithMask(var AValue: Variant);
|
|
procedure RemoveBeginsWithMask(var AValue: Variant);
|
|
function GetBeginsWithMaskPos(const AValue: string): Integer;
|
|
|
|
function GetEditingControllerClass: TcxGridEditingControllerClass; override;
|
|
|
|
property IsFilterPopupOpenedFromHeader: Boolean read FIsFilterPopupOpenedFromHeader
|
|
write FIsFilterPopupOpenedFromHeader;
|
|
property KeepFilterRowFocusing: Boolean read FKeepFilterRowFocusing write FKeepFilterRowFocusing;
|
|
property ViewData: TcxGridViewData read GetViewData;
|
|
property ViewInfo: TcxGridTableViewInfo read GetViewInfo;
|
|
public
|
|
constructor Create(AGridView: TcxCustomGridView); override;
|
|
destructor Destroy; override;
|
|
procedure CheckScrolling(const P: TPoint); override;
|
|
procedure ClearGrouping;
|
|
procedure ClearSelection; override;
|
|
procedure DoCancelMode; override;
|
|
function IsFilterRowFocused: Boolean;
|
|
function IsNewItemRowFocused: Boolean;
|
|
function IsSpecialRowFocused: Boolean; virtual;
|
|
procedure MakeItemVisible(AItem: TcxCustomGridTableItem); override;
|
|
procedure SelectAll; override;
|
|
|
|
procedure InitScrollBarsParameters; override;
|
|
function IsDataFullyVisible(AIsCallFromMaster: Boolean = False): Boolean; override;
|
|
procedure Scroll(AScrollBarKind: TScrollBarKind; AScrollCode: TScrollCode;
|
|
var AScrollPos: Integer); override;
|
|
|
|
procedure EndDragAndDrop(Accepted: Boolean); override;
|
|
|
|
procedure DoKeyDown(var Key: Word; Shift: TShiftState); override;
|
|
procedure KeyDown(var Key: Word; Shift: TShiftState); override;
|
|
|
|
procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
|
|
|
|
// cells selection
|
|
procedure ClearCellSelection;
|
|
procedure SelectAllColumns;
|
|
procedure SelectCells(AFromColumn, AToColumn: TcxGridColumn;
|
|
AFromRowIndex, AToRowIndex: Integer);
|
|
procedure SelectColumns(AFromColumn, AToColumn: TcxGridColumn);
|
|
|
|
property CellSelectionAnchor: TcxGridColumn read FCellSelectionAnchor write FCellSelectionAnchor;
|
|
property ColumnsCustomizationPopup: TcxGridColumnsCustomizationPopup read GetColumnsCustomizationPopup;
|
|
property CustomizationForm: TcxGridTableCustomizationForm read GetCustomizationForm;
|
|
property EditingController: TcxGridTableEditingController read GetEditingController;
|
|
property FocusedColumn: TcxGridColumn read GetFocusedColumn write SetFocusedColumn;
|
|
property FocusedColumnIndex: Integer read GetFocusedColumnIndex write SetFocusedColumnIndex;
|
|
property FocusedRow: TcxCustomGridRow read GetFocusedRow write SetFocusedRow;
|
|
property FocusedRowIndex: Integer read GetFocusedRowIndex write SetFocusedRowIndex;
|
|
property GridView: TcxGridTableView read GetGridView;
|
|
property HorzSizingColumn: TcxGridColumn read FHorzSizingColumn;
|
|
property IsColumnHorzSizing: Boolean read GetIsColumnHorzSizing;
|
|
property LeftPos: Integer read FLeftPos write SetLeftPos;
|
|
property PressedColumn: TcxGridColumn read FPressedColumn write SetPressedColumn;
|
|
property SelectedColumnCount: Integer read GetSelectedColumnCount;
|
|
property SelectedColumns[Index: Integer]: TcxGridColumn read GetSelectedColumn;
|
|
property SelectedRowCount: Integer read GetSelectedRowCount;
|
|
property SelectedRows[Index: Integer]: TcxCustomGridRow read GetSelectedRow;
|
|
property TopRowIndex: Integer read GetTopRowIndex write SetTopRowIndex;
|
|
end;
|
|
|
|
{ painters }
|
|
|
|
// column container
|
|
|
|
TcxGridColumnContainerPainter = class(TcxCustomGridPartPainter)
|
|
private
|
|
function GetViewInfo: TcxGridColumnContainerViewInfo;
|
|
protected
|
|
procedure DrawContent; override;
|
|
procedure DrawItems; virtual;
|
|
function DrawItemsFirst: Boolean; virtual;
|
|
function ExcludeFromClipRect: Boolean; override;
|
|
property ViewInfo: TcxGridColumnContainerViewInfo read GetViewInfo;
|
|
end;
|
|
|
|
// header
|
|
|
|
TcxGridColumnHeaderAreaPainter = class(TcxCustomGridCellPainter)
|
|
private
|
|
function GetViewInfo: TcxGridColumnHeaderAreaViewInfo;
|
|
protected
|
|
function ExcludeFromClipRect: Boolean; override;
|
|
property ViewInfo: TcxGridColumnHeaderAreaViewInfo read GetViewInfo;
|
|
end;
|
|
|
|
TcxGridColumnHeaderSortingMarkPainter = class(TcxGridColumnHeaderAreaPainter)
|
|
protected
|
|
procedure Paint; override;
|
|
end;
|
|
|
|
TcxGridColumnHeaderFilterButtonPainter = class(TcxGridColumnHeaderAreaPainter)
|
|
private
|
|
function GetViewInfo: TcxGridColumnHeaderFilterButtonViewInfo;
|
|
protected
|
|
procedure Paint; override;
|
|
property ViewInfo: TcxGridColumnHeaderFilterButtonViewInfo read GetViewInfo;
|
|
end;
|
|
|
|
TcxGridColumnHeaderGlyphPainter = class(TcxGridColumnHeaderAreaPainter)
|
|
private
|
|
function GetViewInfo: TcxGridColumnHeaderGlyphViewInfo;
|
|
protected
|
|
procedure Paint; override;
|
|
property ViewInfo: TcxGridColumnHeaderGlyphViewInfo read GetViewInfo;
|
|
end;
|
|
|
|
TcxGridColumnHeaderPainter = class(TcxCustomGridCellPainter)
|
|
private
|
|
function GetViewInfo: TcxGridColumnHeaderViewInfo;
|
|
protected
|
|
procedure DrawAreas; virtual;
|
|
procedure DrawBorders; override;
|
|
procedure DrawContent; override;
|
|
procedure DrawPressed; virtual;
|
|
function ExcludeFromClipRect: Boolean; override;
|
|
procedure Paint; override;
|
|
property ViewInfo: TcxGridColumnHeaderViewInfo read GetViewInfo;
|
|
end;
|
|
|
|
TcxGridHeaderPainter = class(TcxGridColumnContainerPainter)
|
|
protected
|
|
function DrawItemsFirst: Boolean; override;
|
|
end;
|
|
|
|
// group by box
|
|
|
|
TcxGridGroupByBoxPainter = class(TcxGridColumnContainerPainter)
|
|
protected
|
|
procedure DrawBackground(const R: TRect); override;
|
|
procedure DrawContent; override;
|
|
function DrawItemsFirst: Boolean; override;
|
|
end;
|
|
|
|
// footer
|
|
|
|
TcxGridFooterCellPainter = class(TcxGridColumnHeaderPainter)
|
|
protected
|
|
procedure DrawBorders; override;
|
|
procedure DrawContent; override;
|
|
end;
|
|
|
|
TcxGridFooterPainterClass = class of TcxGridFooterPainter;
|
|
|
|
TcxGridFooterPainter = class(TcxGridColumnContainerPainter)
|
|
private
|
|
function GetViewInfo: TcxGridFooterViewInfo;
|
|
protected
|
|
procedure DrawBackground(const R: TRect); override;
|
|
procedure DrawBorders; override;
|
|
function DrawItemsFirst: Boolean; override;
|
|
procedure DrawSeparator; virtual;
|
|
property ViewInfo: TcxGridFooterViewInfo read GetViewInfo;
|
|
end;
|
|
|
|
// indicator
|
|
|
|
TcxCustomGridIndicatorItemPainter = class(TcxCustomGridCellPainter)
|
|
private
|
|
function GetViewInfo: TcxCustomGridIndicatorItemViewInfo;
|
|
protected
|
|
function ExcludeFromClipRect: Boolean; override;
|
|
property ViewInfo: TcxCustomGridIndicatorItemViewInfo read GetViewInfo;
|
|
end;
|
|
|
|
TcxGridIndicatorHeaderItemPainter = class(TcxCustomGridIndicatorItemPainter)
|
|
private
|
|
function GetViewInfo: TcxGridIndicatorHeaderItemViewInfo;
|
|
protected
|
|
function DrawBackgroundHandler(ACanvas: TcxCanvas; const ABounds: TRect): Boolean; override;
|
|
procedure DrawContent; override;
|
|
procedure DrawQuickCustomizationMark; virtual;
|
|
property ViewInfo: TcxGridIndicatorHeaderItemViewInfo read GetViewInfo;
|
|
end;
|
|
|
|
TcxGridIndicatorRowItemPainter = class(TcxCustomGridIndicatorItemPainter)
|
|
private
|
|
function GetViewInfo: TcxGridIndicatorRowItemViewInfo;
|
|
protected
|
|
procedure DrawContent; override;
|
|
property ViewInfo: TcxGridIndicatorRowItemViewInfo read GetViewInfo;
|
|
end;
|
|
|
|
TcxGridIndicatorFooterItemPainter = class(TcxCustomGridIndicatorItemPainter)
|
|
private
|
|
function GetViewInfo: TcxGridIndicatorFooterItemViewInfo;
|
|
protected
|
|
procedure DrawContent; override;
|
|
procedure DrawBorders; override;
|
|
property ViewInfo: TcxGridIndicatorFooterItemViewInfo read GetViewInfo;
|
|
end;
|
|
|
|
TcxGridIndicatorPainter = class(TcxCustomGridCellPainter)
|
|
private
|
|
function GetViewInfo: TcxGridIndicatorViewInfo;
|
|
protected
|
|
procedure DrawContent; override;
|
|
procedure DrawItems; virtual;
|
|
function DrawItemsFirst: Boolean; virtual;
|
|
function ExcludeFromClipRect: Boolean; override;
|
|
property ViewInfo: TcxGridIndicatorViewInfo read GetViewInfo;
|
|
end;
|
|
|
|
// custom row
|
|
|
|
TcxCustomGridRowPainter = class(TcxCustomGridRecordPainter)
|
|
private
|
|
function GetViewInfo: TcxCustomGridRowViewInfo;
|
|
protected
|
|
procedure DrawFooters; virtual;
|
|
procedure DrawIndent; virtual;
|
|
procedure DrawIndentPart(ALevel: Integer; const ABounds: TRect); virtual;
|
|
procedure DrawLastHorzGridLine; virtual;
|
|
procedure DrawSeparator; virtual;
|
|
procedure Paint; override;
|
|
property ViewInfo: TcxCustomGridRowViewInfo read GetViewInfo;
|
|
end;
|
|
|
|
// rows
|
|
|
|
TcxGridRowsPainterClass = class of TcxGridRowsPainter;
|
|
|
|
TcxGridRowsPainter = class(TcxCustomGridRecordsPainter)
|
|
private
|
|
function GetViewInfo: TcxGridRowsViewInfo;
|
|
protected
|
|
procedure Paint; override;
|
|
property ViewInfo: TcxGridRowsViewInfo read GetViewInfo;
|
|
public
|
|
class procedure DrawDataRowCells(ARowViewInfo: TcxCustomGridRowViewInfo); virtual;
|
|
end;
|
|
|
|
// table
|
|
|
|
TcxGridTablePainter = class(TcxCustomGridTablePainter)
|
|
private
|
|
FGridLines: TList;
|
|
function GetController: TcxGridTableController;
|
|
function GetGridView: TcxGridTableView;
|
|
function GetViewInfo: TcxGridTableViewInfo;
|
|
protected
|
|
function CanOffset(AItemsOffset, DX, DY: Integer): Boolean; override;
|
|
procedure DrawFooter; virtual;
|
|
procedure DrawGroupByBox; virtual;
|
|
procedure DrawHeader; virtual;
|
|
procedure DrawIndicator; virtual;
|
|
procedure DrawRecords; override;
|
|
procedure Offset(AItemsOffset: Integer); override;
|
|
procedure Offset(DX, DY: Integer); override;
|
|
procedure PaintContent; override;
|
|
public
|
|
procedure AddGridLine(const R: TRect);
|
|
property Controller: TcxGridTableController read GetController;
|
|
property GridView: TcxGridTableView read GetGridView;
|
|
property ViewInfo: TcxGridTableViewInfo read GetViewInfo;
|
|
end;
|
|
|
|
{ view infos }
|
|
|
|
// column container
|
|
|
|
TcxGridColumnContainerViewInfo = class(TcxCustomGridPartViewInfo)
|
|
private
|
|
FItemHeight: Integer;
|
|
FItems: TList;
|
|
function GetController: TcxGridTableController;
|
|
function GetCount: Integer;
|
|
function GetGridView: TcxGridTableView;
|
|
function GetGridViewInfo: TcxGridTableViewInfo;
|
|
function GetInternalItem(Index: Integer): TcxGridColumnHeaderViewInfo;
|
|
function GetItem(Index: Integer): TcxGridColumnHeaderViewInfo;
|
|
function GetItemHeight: Integer;
|
|
protected
|
|
function CreateItem(AIndex: Integer): TcxGridColumnHeaderViewInfo; virtual;
|
|
procedure CreateItems; virtual;
|
|
procedure DestroyItems; virtual;
|
|
function GetColumn(Index: Integer): TcxGridColumn; virtual; abstract;
|
|
function GetColumnCount: Integer; virtual; abstract;
|
|
function GetItemClass: TcxGridColumnHeaderViewInfoClass; virtual;
|
|
|
|
function CalculateItemHeight: Integer; virtual;
|
|
function GetAutoHeight: Boolean; virtual;
|
|
function GetColumnAdditionalWidth(AColumn: TcxGridColumn): Integer;
|
|
function GetColumnMinWidth(AColumn: TcxGridColumn): Integer; virtual;
|
|
function GetColumnNeighbors(AColumn: TcxGridColumn): TcxNeighbors; virtual;
|
|
function GetColumnWidth(AColumn: TcxGridColumn): Integer; virtual;
|
|
function GetItemAreaBounds(AItem: TcxGridColumnHeaderViewInfo): TRect; virtual;
|
|
function GetItemMultiLinePainting(AItem: TcxGridColumnHeaderViewInfo): Boolean; virtual;
|
|
function GetItemsAreaBounds: TRect; virtual;
|
|
function GetItemsHitTest(const P: TPoint): TcxCustomGridHitTest; virtual;
|
|
function GetKind: TcxGridColumnContainerKind; virtual; abstract;
|
|
function GetPainterClass: TcxCustomGridCellPainterClass; override;
|
|
function GetZonesAreaBounds: TRect; virtual;
|
|
procedure InitHitTest(AHitTest: TcxCustomGridHitTest); override;
|
|
procedure Offset(DX, DY: Integer); override;
|
|
|
|
property AutoHeight: Boolean read GetAutoHeight;
|
|
property ColumnCount: Integer read GetColumnCount;
|
|
property Columns[Index: Integer]: TcxGridColumn read GetColumn;
|
|
property Controller: TcxGridTableController read GetController;
|
|
property ZonesAreaBounds: TRect read GetZonesAreaBounds;
|
|
public
|
|
constructor Create(AGridViewInfo: TcxCustomGridTableViewInfo); override;
|
|
destructor Destroy; override;
|
|
procedure BeforeRecalculation; override;
|
|
function GetHitTest(const P: TPoint): TcxCustomGridHitTest; override;
|
|
function GetZone(const P: TPoint): TcxGridItemContainerZone; virtual;
|
|
property Count: Integer read GetCount;
|
|
property GridView: TcxGridTableView read GetGridView;
|
|
property GridViewInfo: TcxGridTableViewInfo read GetGridViewInfo;
|
|
property InternalItems[Index: Integer]: TcxGridColumnHeaderViewInfo read GetInternalItem;
|
|
property ItemHeight: Integer read GetItemHeight;
|
|
property Items[Index: Integer]: TcxGridColumnHeaderViewInfo read GetItem; default;
|
|
property ItemsAreaBounds: TRect read GetItemsAreaBounds;
|
|
property Kind: TcxGridColumnContainerKind read GetKind;
|
|
end;
|
|
|
|
// column header areas
|
|
|
|
TcxGridColumnHeaderAreaViewInfo = class(TcxCustomGridViewCellViewInfo)
|
|
private
|
|
FColumnHeaderViewInfo: TcxGridColumnHeaderViewInfo;
|
|
function GetColumn: TcxGridColumn;
|
|
function GetGridView: TcxGridTableView;
|
|
function GetGridViewInfo: TcxGridTableViewInfo;
|
|
protected
|
|
function GetAlignmentVert: TcxAlignmentVert; override;
|
|
function GetCanvas: TcxCanvas; override;
|
|
function GetHeight: Integer; override;
|
|
function GetWidth: Integer; override;
|
|
function HasMouse(AHitTest: TcxCustomGridHitTest): Boolean; override;
|
|
procedure InitHitTest(AHitTest: TcxCustomGridHitTest); override;
|
|
//procedure Invalidate; virtual;
|
|
function NeedsContainerHotTrack: Boolean; virtual;
|
|
function OccupiesSpace: Boolean; virtual;
|
|
function ResidesInContent: Boolean; virtual;
|
|
|
|
property Column: TcxGridColumn read GetColumn;
|
|
property GridView: TcxGridTableView read GetGridView;
|
|
property GridViewInfo: TcxGridTableViewInfo read GetGridViewInfo;
|
|
public
|
|
constructor Create(AColumnHeaderViewInfo: TcxGridColumnHeaderViewInfo); reintroduce; virtual;
|
|
procedure Calculate(const ABounds: TRect; var ATextAreaBounds: TRect); reintroduce; virtual;
|
|
property AlignmentHorz: TAlignment read GetAlignmentHorz;
|
|
property AlignmentVert: TcxAlignmentVert read GetAlignmentVert;
|
|
property ColumnHeaderViewInfo: TcxGridColumnHeaderViewInfo read FColumnHeaderViewInfo;
|
|
property Height: Integer read GetHeight;
|
|
property Width: Integer read GetWidth;
|
|
end;
|
|
|
|
TcxGridColumnHeaderSortingMarkViewInfo = class(TcxGridColumnHeaderAreaViewInfo)
|
|
private
|
|
function GetSortOrder: TcxGridSortOrder;
|
|
protected
|
|
function CalculateHeight: Integer; override;
|
|
function CalculateWidth: Integer; override;
|
|
function GetAlignmentHorz: TAlignment; override;
|
|
function GetHitTestClass: TcxCustomGridHitTestClass; override;
|
|
function GetPainterClass: TcxCustomGridCellPainterClass; override;
|
|
property SortOrder: TcxGridSortOrder read GetSortOrder;
|
|
end;
|
|
|
|
TcxGridColumnHeaderHorzSizingEdgeViewInfo = class(TcxGridColumnHeaderAreaViewInfo)
|
|
protected
|
|
function CalculateHeight: Integer; override;
|
|
function CalculateWidth: Integer; override;
|
|
function GetAlignmentHorz: TAlignment; override;
|
|
function GetHitTestClass: TcxCustomGridHitTestClass; override;
|
|
function GetPainterClass: TcxCustomGridCellPainterClass; override;
|
|
function OccupiesSpace: Boolean; override;
|
|
function ResidesInContent: Boolean; override;
|
|
public
|
|
procedure Calculate(const ABounds: TRect; var ATextAreaBounds: TRect); override;
|
|
function MouseDown(AHitTest: TcxCustomGridHitTest; AButton: TMouseButton;
|
|
AShift: TShiftState): Boolean; override;
|
|
end;
|
|
|
|
TcxGridColumnHeaderFilterButtonViewInfo = class(TcxGridColumnHeaderAreaViewInfo,
|
|
IcxGridFilterPopupOwner)
|
|
private
|
|
function GetActive: Boolean;
|
|
function GetDropDownWindowValue: TcxGridFilterPopup;
|
|
protected
|
|
{ IcxGridFilterPopupOwner }
|
|
function GetItem: TcxCustomGridTableItem;
|
|
|
|
function CalculateHeight: Integer; override;
|
|
function CalculateWidth: Integer; override;
|
|
procedure DropDown; override;
|
|
function EmulateMouseMoveAfterCalculate: Boolean; override;
|
|
function GetAlignmentHorz: TAlignment; override;
|
|
function GetAlwaysVisible: Boolean; virtual;
|
|
function GetHitTestClass: TcxCustomGridHitTestClass; override;
|
|
function GetPainterClass: TcxCustomGridCellPainterClass; override;
|
|
function GetVisible: Boolean; override;
|
|
function NeedsContainerHotTrack: Boolean; override;
|
|
function OccupiesSpace: Boolean; override;
|
|
procedure StateChanged(APrevState: TcxGridCellState); override;
|
|
|
|
function CloseDropDownWindowOnDestruction: Boolean; override;
|
|
function DropDownWindowExists: Boolean; override;
|
|
function GetDropDownWindow: TcxCustomGridPopup; override;
|
|
function GetDropDownWindowOwnerBounds: TRect; override;
|
|
function IsDropDownWindowOwner: Boolean; override;
|
|
property DropDownWindow: TcxGridFilterPopup read GetDropDownWindowValue;
|
|
|
|
property AlwaysVisible: Boolean read GetAlwaysVisible;
|
|
public
|
|
function MouseMove(AHitTest: TcxCustomGridHitTest; AShift: TShiftState): Boolean; override;
|
|
property Active: Boolean read GetActive;
|
|
end;
|
|
|
|
TcxGridColumnHeaderGlyphViewInfo = class(TcxGridColumnHeaderAreaViewInfo)
|
|
private
|
|
function GetGlyph: TBitmap;
|
|
protected
|
|
function CalculateHeight: Integer; override;
|
|
function CalculateWidth: Integer; override;
|
|
function GetAlignmentHorz: TAlignment; override;
|
|
function GetAlignmentVert: TcxAlignmentVert; override;
|
|
function GetHitTestClass: TcxCustomGridHitTestClass; override;
|
|
function GetPainterClass: TcxCustomGridCellPainterClass; override;
|
|
public
|
|
property Glyph: TBitmap read GetGlyph;
|
|
end;
|
|
|
|
// column header
|
|
|
|
TcxGridColumnHeaderViewInfo = class(TcxCustomGridViewCellViewInfo)
|
|
private
|
|
FAdditionalHeightAtTop: Integer;
|
|
FAdditionalWidthAtLeft: Integer;
|
|
FAreaViewInfos: TList;
|
|
FColumn: TcxGridColumn;
|
|
FContainer: TcxGridColumnContainerViewInfo;
|
|
FNeighbors: TcxNeighbors;
|
|
FRealWidth: Integer;
|
|
FTextAreaBounds: TRect;
|
|
FWidth: Integer;
|
|
|
|
function GetAreaViewInfoCount: Integer;
|
|
function GetAreaViewInfo(Index: Integer): TcxGridColumnHeaderAreaViewInfo;
|
|
function GetGridView: TcxGridTableView;
|
|
function GetGridViewInfo: TcxGridTableViewInfo;
|
|
function GetHasTextOffsetLeft: Boolean;
|
|
function GetHasTextOffsetRight: Boolean;
|
|
function GetIndex: Integer;
|
|
function GetIsFixed: Boolean;
|
|
function GetRealBounds: TRect;
|
|
function GetRealWidth: Integer;
|
|
|
|
procedure EnumAreaViewInfoClasses(AClass: TClass);
|
|
procedure CreateAreaViewInfos;
|
|
procedure DestroyAreaViewInfos;
|
|
protected
|
|
function AreasNeedHotTrack: Boolean;
|
|
function CalculateHasTextOffset(ASide: TAlignment): Boolean; virtual;
|
|
function CalculateHeight: Integer; override;
|
|
function CalculateRealWidth(Value: Integer): Integer;
|
|
procedure CalculateTextAreaBounds; virtual;
|
|
procedure CalculateVisible(ALeftBound, AWidth: Integer); virtual;
|
|
function CalculateWidth: Integer; override;
|
|
function CanFilter: Boolean; virtual;
|
|
function CanHorzSize: Boolean; virtual;
|
|
function CanPress: Boolean; virtual;
|
|
function CanShowHint: Boolean; override;
|
|
function CanSort: Boolean; virtual;
|
|
procedure CheckWidth(var Value: Integer); virtual;
|
|
function CustomDraw(ACanvas: TcxCanvas): Boolean; override;
|
|
procedure DoCalculateParams; override;
|
|
function GetAlignmentHorz: TAlignment; override;
|
|
function GetAlignmentVert: TcxAlignmentVert; override;
|
|
function GetAreaBounds: TRect; override;
|
|
procedure GetAreaViewInfoClasses(AProc: TcxGridClassEnumeratorProc); virtual;
|
|
function GetBackgroundBitmap: TBitmap; override;
|
|
function GetBorders: TcxBorders; override;
|
|
function GetBorderWidth(AIndex: TcxBorder): Integer; override;
|
|
function GetCanvas: TcxCanvas; override;
|
|
function GetCaption: string; virtual;
|
|
class function GetCellBorderWidth(ALookAndFeelPainter: TcxCustomLookAndFeelPainterClass): Integer; virtual;
|
|
class function GetCellHeight(ATextHeight: Integer;
|
|
ALookAndFeelPainter: TcxCustomLookAndFeelPainterClass): Integer; override;
|
|
function GetDataOffset: Integer; virtual;
|
|
function GetHeight: Integer; override;
|
|
function GetHitTestClass: TcxCustomGridHitTestClass; override;
|
|
function GetHotTrack: Boolean; override;
|
|
function GetIsDesignSelected: Boolean; override;
|
|
function GetIsPressed: Boolean; virtual;
|
|
function GetMaxWidth: Integer; virtual;
|
|
function GetMinWidth: Integer; virtual;
|
|
function GetMultiLine: Boolean; override;
|
|
function GetMultiLinePainting: Boolean; override;
|
|
function GetPainterClass: TcxCustomGridCellPainterClass; override;
|
|
function GetShowEndEllipsis: Boolean; override;
|
|
function GetText: string; override;
|
|
function GetTextAreaBounds: TRect; override;
|
|
procedure GetViewParams(var AParams: TcxViewParams); override;
|
|
function GetWidth: Integer; override;
|
|
function HasCustomDraw: Boolean; override;
|
|
function HasFixedContentSpace: Boolean; virtual;
|
|
function HasGlyph: Boolean; virtual;
|
|
function HasHeaderAsContainer: Boolean;
|
|
procedure InitHitTest(AHitTest: TcxCustomGridHitTest); override;
|
|
procedure Offset(DX, DY: Integer); override;
|
|
procedure SetWidth(Value: Integer); override;
|
|
procedure StateChanged(APrevState: TcxGridCellState); override;
|
|
|
|
property AdditionalWidthAtLeft: Integer read FAdditionalWidthAtLeft write FAdditionalWidthAtLeft;
|
|
property Caption: string read GetCaption;
|
|
property GridView: TcxGridTableView read GetGridView;
|
|
property GridViewInfo: TcxGridTableViewInfo read GetGridViewInfo;
|
|
property HasTextOffsetLeft: Boolean read GetHasTextOffsetLeft;
|
|
property HasTextOffsetRight: Boolean read GetHasTextOffsetRight;
|
|
public
|
|
constructor Create(AContainer: TcxGridColumnContainerViewInfo;
|
|
AColumn: TcxGridColumn); reintroduce; virtual;
|
|
destructor Destroy; override;
|
|
procedure BeforeRecalculation; override;
|
|
procedure Calculate(ALeftBound, ATopBound: Integer; AWidth: Integer = -1;
|
|
AHeight: Integer = -1); override;
|
|
function GetBestFitWidth: Integer; override;
|
|
function GetHitTest(const P: TPoint): TcxCustomGridHitTest; override;
|
|
procedure InitAutoWidthItem(AAutoWidthItem: TcxAutoWidthItem);
|
|
function MouseDown(AHitTest: TcxCustomGridHitTest; AButton: TMouseButton;
|
|
AShift: TShiftState): Boolean; override;
|
|
|
|
property AreaViewInfoCount: Integer read GetAreaViewInfoCount;
|
|
property AreaViewInfos[Index: Integer]: TcxGridColumnHeaderAreaViewInfo read GetAreaViewInfo;
|
|
property Column: TcxGridColumn read FColumn;
|
|
property Container: TcxGridColumnContainerViewInfo read FContainer;
|
|
property DataOffset: Integer read GetDataOffset;
|
|
property Index: Integer read GetIndex;
|
|
property IsFixed: Boolean read GetIsFixed;
|
|
property IsPressed: Boolean read GetIsPressed;
|
|
property MaxWidth: Integer read GetMaxWidth;
|
|
property MinWidth: Integer read GetMinWidth;
|
|
property Neighbors: TcxNeighbors read FNeighbors write FNeighbors;
|
|
property RealBounds: TRect read GetRealBounds;
|
|
property RealWidth: Integer read GetRealWidth;
|
|
end;
|
|
|
|
// header
|
|
|
|
TcxGridHeaderViewInfoSpecificClass = class of TcxGridHeaderViewInfoSpecific;
|
|
|
|
TcxGridHeaderViewInfoSpecific = class
|
|
private
|
|
FContainerViewInfo: TcxGridHeaderViewInfo;
|
|
function GetGridViewInfo: TcxGridTableViewInfo;
|
|
function GetItemHeight: Integer;
|
|
protected
|
|
function CalculateHeight: Integer; virtual;
|
|
function GetHeight: Integer; virtual;
|
|
public
|
|
constructor Create(AContainerViewInfo: TcxGridHeaderViewInfo); virtual;
|
|
property ContainerViewInfo: TcxGridHeaderViewInfo read FContainerViewInfo;
|
|
property GridViewInfo: TcxGridTableViewInfo read GetGridViewInfo;
|
|
property Height: Integer read GetHeight;
|
|
property ItemHeight: Integer read GetItemHeight;
|
|
end;
|
|
|
|
TcxGridHeaderViewInfoClass = class of TcxGridHeaderViewInfo;
|
|
|
|
TcxGridHeaderViewInfo = class(TcxGridColumnContainerViewInfo)
|
|
private
|
|
FSpecific: TcxGridHeaderViewInfoSpecific;
|
|
protected
|
|
function GetColumn(Index: Integer): TcxGridColumn; override;
|
|
function GetColumnCount: Integer; override;
|
|
|
|
procedure AddIndicatorItems(AIndicatorViewInfo: TcxGridIndicatorViewInfo; ATopBound: Integer); virtual;
|
|
procedure CalculateColumnAutoWidths; virtual;
|
|
procedure CalculateColumnWidths; virtual;
|
|
function CalculateHeight: Integer; override;
|
|
procedure CalculateInvisible; override;
|
|
function CalculateItemHeight: Integer; override;
|
|
procedure CalculateItems; virtual;
|
|
procedure CalculateVisible; override;
|
|
function CalculateWidth: Integer; override;
|
|
function CanCalculateAutoWidths: Boolean; virtual;
|
|
function DrawColumnBackgroundHandler(ACanvas: TcxCanvas; const ABounds: TRect): Boolean; virtual;
|
|
function GetAlignment: TcxGridPartAlignment; override;
|
|
function GetAutoHeight: Boolean; override;
|
|
function GetColumnBackgroundBitmap: TBitmap; virtual;
|
|
function GetColumnNeighbors(AColumn: TcxGridColumn): TcxNeighbors; override;
|
|
function GetHitTestClass: TcxCustomGridHitTestClass; override;
|
|
function GetIsAutoWidth: Boolean; override;
|
|
function GetIsScrollable: Boolean; override;
|
|
function GetItemMultiLinePainting(AItem: TcxGridColumnHeaderViewInfo): Boolean; override;
|
|
function GetKind: TcxGridColumnContainerKind; override;
|
|
function GetPainterClass: TcxCustomGridCellPainterClass; override;
|
|
procedure GetViewParams(var AParams: TcxViewParams); override;
|
|
function GetVisible: Boolean; override;
|
|
function GetWidth: Integer; override;
|
|
function GetZonesAreaBounds: TRect; override;
|
|
function IsAlwaysVisibleForCalculation: Boolean; virtual;
|
|
function IsHeightAssigned: Boolean; virtual;
|
|
procedure Offset(DX, DY: Integer); override;
|
|
procedure RecalculateItemVisibles;
|
|
|
|
property ColumnBackgroundBitmap: TBitmap read GetColumnBackgroundBitmap;
|
|
public
|
|
constructor Create(AGridViewInfo: TcxCustomGridTableViewInfo); override;
|
|
destructor Destroy; override;
|
|
procedure AssignColumnWidths;
|
|
procedure Calculate(ALeftBound, ATopBound: Integer; AWidth: Integer = -1;
|
|
AHeight: Integer = -1); override;
|
|
property Specific: TcxGridHeaderViewInfoSpecific read FSpecific;
|
|
end;
|
|
|
|
// group by box
|
|
|
|
TcxGridGroupByBoxColumnHeaderViewInfo = class(TcxGridColumnHeaderViewInfo)
|
|
private
|
|
function GetContainer: TcxGridGroupByBoxViewInfo;
|
|
protected
|
|
function CalculateHeight: Integer; override;
|
|
function GetCaption: string; override;
|
|
function HasFixedContentSpace: Boolean; override;
|
|
function InheritedCalculateHeight: Integer;
|
|
public
|
|
property Container: TcxGridGroupByBoxViewInfo read GetContainer;
|
|
end;
|
|
|
|
TcxGridGroupByBoxViewInfoClass = class of TcxGridGroupByBoxViewInfo;
|
|
|
|
TcxGridGroupByBoxViewInfo = class(TcxGridColumnContainerViewInfo)
|
|
private
|
|
FCalculatingColumnWidth: Boolean;
|
|
function GetGroupByBoxVerOffset: Integer;
|
|
function GetLinkLineBounds(Index: Integer; Horizontal: Boolean): TRect;
|
|
protected
|
|
function GetColumn(Index: Integer): TcxGridColumn; override;
|
|
function GetColumnCount: Integer; override;
|
|
function GetItemClass: TcxGridColumnHeaderViewInfoClass; override;
|
|
|
|
function CalculateHeight: Integer; override;
|
|
function CalculateItemHeight: Integer; override;
|
|
function CalculateWidth: Integer; override;
|
|
function GetAlignment: TcxGridPartAlignment; override;
|
|
function GetAlignmentVert: TcxAlignmentVert; override;
|
|
function GetBackgroundBitmap: TBitmap; override;
|
|
function GetColumnWidth(AColumn: TcxGridColumn): Integer; override;
|
|
function GetHitTestClass: TcxCustomGridHitTestClass; override;
|
|
function GetIsAutoWidth: Boolean; override;
|
|
function GetIsScrollable: Boolean; override;
|
|
function GetItemAreaBounds(AItem: TcxGridColumnHeaderViewInfo): TRect; override;
|
|
function GetKind: TcxGridColumnContainerKind; override;
|
|
function GetPainterClass: TcxCustomGridCellPainterClass; override;
|
|
function GetText: string; override;
|
|
function GetTextAreaBounds: TRect; override;
|
|
procedure GetViewParams(var AParams: TcxViewParams); override;
|
|
function GetVisible: Boolean; override;
|
|
|
|
property CalculatingColumnWidth: Boolean read FCalculatingColumnWidth;
|
|
property GroupByBoxVerOffset: Integer read GetGroupByBoxVerOffset;
|
|
public
|
|
procedure Calculate(ALeftBound, ATopBound: Integer; AWidth: Integer = -1;
|
|
AHeight: Integer = -1); override;
|
|
property LinkLineBounds[Index: Integer; Horizontal: Boolean]: TRect read GetLinkLineBounds;
|
|
end;
|
|
|
|
// footer
|
|
|
|
TcxGridFooterCellViewInfoClass = class of TcxGridFooterCellViewInfo;
|
|
|
|
TcxGridFooterCellViewInfo = class(TcxGridColumnHeaderViewInfo)
|
|
private
|
|
FSummaryItem: TcxDataSummaryItem;
|
|
function GetContainer: TcxGridFooterViewInfo;
|
|
function GetSummary: TcxDataSummary;
|
|
protected
|
|
procedure AfterCalculateBounds(var ABounds: TRect); override;
|
|
function CanPress: Boolean; override;
|
|
function CustomDraw(ACanvas: TcxCanvas): Boolean; override;
|
|
function GetAlignmentHorz: TAlignment; override;
|
|
function GetBackgroundBitmap: TBitmap; override;
|
|
procedure GetAreaViewInfoClasses(AProc: TcxGridClassEnumeratorProc); override;
|
|
function GetBorders: TcxBorders; override;
|
|
class function GetCellBorderWidth(ALookAndFeelPainter: TcxCustomLookAndFeelPainterClass): Integer; override;
|
|
function GetHitTestClass: TcxCustomGridHitTestClass; override;
|
|
function GetIsDesignSelected: Boolean; override;
|
|
function GetIsPressed: Boolean; override;
|
|
function GetPainterClass: TcxCustomGridCellPainterClass; override;
|
|
function GetText: string; override;
|
|
procedure GetViewParams(var AParams: TcxViewParams); override;
|
|
function HasCustomDraw: Boolean; override;
|
|
procedure InitHitTest(AHitTest: TcxCustomGridHitTest); override;
|
|
property Summary: TcxDataSummary read GetSummary;
|
|
public
|
|
constructor Create(AContainer: TcxGridColumnContainerViewInfo;
|
|
ASummaryItem: TcxDataSummaryItem); reintroduce; virtual;
|
|
function GetBestFitWidth: Integer; override;
|
|
function MouseDown(AHitTest: TcxCustomGridHitTest; AButton: TMouseButton;
|
|
AShift: TShiftState): Boolean; override;
|
|
property Container: TcxGridFooterViewInfo read GetContainer;
|
|
property SummaryItem: TcxDataSummaryItem read FSummaryItem;
|
|
end;
|
|
|
|
TcxGridFooterViewInfoClass = class of TcxGridFooterViewInfo;
|
|
|
|
TcxGridFooterViewInfo = class(TcxGridHeaderViewInfo)
|
|
private
|
|
FRowCount: Integer;
|
|
FSummaryItems: TList;
|
|
function GetMultipleSummaries: Boolean;
|
|
function GetRowCount: Integer;
|
|
function GetRowHeight: Integer;
|
|
protected
|
|
function CreateItem(AIndex: Integer): TcxGridColumnHeaderViewInfo; override;
|
|
procedure CreateItems; override;
|
|
procedure DestroyItems; override;
|
|
function GetColumn(Index: Integer): TcxGridColumn; override;
|
|
function GetColumnCount: Integer; override;
|
|
function GetItemClass: TcxGridColumnHeaderViewInfoClass; override;
|
|
procedure PrepareSummaryItems(ASummaryItems: TList); virtual;
|
|
|
|
function CalculateBounds: TRect; override;
|
|
function CalculateHeight: Integer; override;
|
|
function CalculateItemHeight: Integer; override;
|
|
procedure CalculateItem(AIndex: Integer); virtual;
|
|
procedure CalculateItems; override;
|
|
function CalculateRowCount: Integer; virtual;
|
|
function CanCalculateAutoWidths: Boolean; override;
|
|
function GetAlignment: TcxGridPartAlignment; override;
|
|
function GetAutoHeight: Boolean; override;
|
|
function GetBackgroundBitmap: TBitmap; override;
|
|
function GetBordersBounds: TRect; virtual;
|
|
function GetBorders: TcxBorders; override;
|
|
function GetBorderWidth(AIndex: TcxBorder): Integer; override;
|
|
function GetColumnWidth(AColumn: TcxGridColumn): Integer; override;
|
|
function GetHitTestClass: TcxCustomGridHitTestClass; override;
|
|
function GetIsAutoWidth: Boolean; override;
|
|
function GetIsScrollable: Boolean; override;
|
|
function GetItemAreaBounds(AItem: TcxGridColumnHeaderViewInfo): TRect; override;
|
|
function GetItemHeight(AColumn: TcxGridColumn): Integer; overload; virtual;
|
|
function GetItemHeight(AIndex: Integer): Integer; overload;
|
|
function GetItemHitTestClass: TcxCustomGridHitTestClass; virtual;
|
|
function GetItemLeftBound(AColumn: TcxGridColumn): Integer; overload; virtual;
|
|
function GetItemLeftBound(AIndex: Integer): Integer; overload;
|
|
function GetItemRowIndex(AIndex: Integer): Integer; virtual;
|
|
function GetItemsAreaBounds: TRect; override;
|
|
function GetItemTopBound(AColumn: TcxGridColumn): Integer; overload; virtual;
|
|
function GetItemTopBound(AIndex: Integer): Integer; overload; virtual;
|
|
function GetKind: TcxGridColumnContainerKind; override;
|
|
function GetPainterClass: TcxCustomGridCellPainterClass; override;
|
|
function GetSeparatorBounds: TRect; virtual;
|
|
function GetSeparatorWidth: Integer; virtual;
|
|
function GetSummaryItems: TcxDataSummaryItems; virtual;
|
|
procedure GetViewParams(var AParams: TcxViewParams); override;
|
|
function GetVisible: Boolean; override;
|
|
function HasSeparator: Boolean; virtual;
|
|
function IsAlwaysVisibleForCalculation: Boolean; override;
|
|
function IsHeightAssigned: Boolean; override;
|
|
function IsItemVisible(AIndex: Integer): Boolean; virtual;
|
|
procedure Offset(DX, DY: Integer); override;
|
|
|
|
property SummaryItemsList: TList read FSummaryItems;
|
|
public
|
|
function CanShowMultipleSummaries: Boolean; virtual;
|
|
function GetCellBestFitWidth(AColumn: TcxGridColumn): Integer; virtual;
|
|
function GetHitTest(const P: TPoint): TcxCustomGridHitTest; override;
|
|
|
|
property BordersBounds: TRect read GetBordersBounds;
|
|
property MultipleSummaries: Boolean read GetMultipleSummaries;
|
|
property RowCount: Integer read GetRowCount;
|
|
property RowHeight: Integer read GetRowHeight;
|
|
property SeparatorBounds: TRect read GetSeparatorBounds;
|
|
property SeparatorWidth: Integer read GetSeparatorWidth;
|
|
property SummaryItems: TcxDataSummaryItems read GetSummaryItems;
|
|
end;
|
|
|
|
// indicator
|
|
|
|
TcxCustomGridIndicatorItemViewInfoClass = class of TcxCustomGridIndicatorItemViewInfo;
|
|
|
|
TcxCustomGridIndicatorItemViewInfo = class(TcxCustomGridViewCellViewInfo)
|
|
private
|
|
FContainer: TcxGridIndicatorViewInfo;
|
|
function GetGridView: TcxGridTableView;
|
|
function GetGridViewInfo: TcxGridTableViewInfo;
|
|
protected
|
|
function CalculateWidth: Integer; override;
|
|
function CustomDraw(ACanvas: TcxCanvas): Boolean; override;
|
|
function GetHitTestClass: TcxCustomGridHitTestClass; override;
|
|
function GetPainterClass: TcxCustomGridCellPainterClass; override;
|
|
procedure GetViewParams(var AParams: TcxViewParams); override;
|
|
function HasCustomDraw: Boolean; override;
|
|
public
|
|
constructor Create(AContainer: TcxGridIndicatorViewInfo); reintroduce; virtual;
|
|
destructor Destroy; override;
|
|
property Container: TcxGridIndicatorViewInfo read FContainer;
|
|
property GridView: TcxGridTableView read GetGridView;
|
|
property GridViewInfo: TcxGridTableViewInfo read GetGridViewInfo;
|
|
end;
|
|
|
|
TcxGridIndicatorHeaderItemViewInfo = class(TcxCustomGridIndicatorItemViewInfo)
|
|
private
|
|
function GetDropDownWindowValue: TcxCustomGridCustomizationPopup;
|
|
protected
|
|
function CalculateHeight: Integer; override;
|
|
function CanShowHint: Boolean; override;
|
|
function GetCellBoundsForHint: TRect; override;
|
|
function GetHintTextRect(const AMousePos: TPoint): TRect; override;
|
|
function GetHitTestClass: TcxCustomGridHitTestClass; override;
|
|
function GetHotTrack: Boolean; override;
|
|
function GetPainterClass: TcxCustomGridCellPainterClass; override;
|
|
function GetText: string; override;
|
|
procedure GetViewParams(var AParams: TcxViewParams); override;
|
|
function IsHintForText: Boolean; override;
|
|
function IsHintMultiLine: Boolean; override;
|
|
function SupportsQuickCustomization: Boolean; virtual;
|
|
|
|
function CloseDropDownWindowOnDestruction: Boolean; override;
|
|
function DropDownWindowExists: Boolean; override;
|
|
function GetDropDownWindow: TcxCustomGridPopup; override;
|
|
property DropDownWindow: TcxCustomGridCustomizationPopup read GetDropDownWindowValue;
|
|
end;
|
|
|
|
TcxGridIndicatorRowItemViewInfo = class(TcxCustomGridIndicatorItemViewInfo)
|
|
private
|
|
FRowViewInfo: TcxCustomGridRowViewInfo;
|
|
function GetGridRecord: TcxCustomGridRow;
|
|
function GetGridView: TcxGridTableView;
|
|
protected
|
|
function CalculateHeight: Integer; override;
|
|
function GetBackgroundBitmap: TBitmap; override;
|
|
function GetIndicatorKind: TcxIndicatorKind; virtual;
|
|
function GetHitTestClass: TcxCustomGridHitTestClass; override;
|
|
function GetPainterClass: TcxCustomGridCellPainterClass; override;
|
|
function GetRowSizingEdgeBounds: TRect; virtual;
|
|
procedure InitHitTest(AHitTest: TcxCustomGridHitTest); override;
|
|
property RowSizingEdgeBounds: TRect read GetRowSizingEdgeBounds;
|
|
public
|
|
destructor Destroy; override;
|
|
function GetHitTest(const P: TPoint): TcxCustomGridHitTest; override;
|
|
function MouseDown(AHitTest: TcxCustomGridHitTest; AButton: TMouseButton;
|
|
AShift: TShiftState): Boolean; override;
|
|
property GridRecord: TcxCustomGridRow read GetGridRecord;
|
|
property GridView: TcxGridTableView read GetGridView;
|
|
property IndicatorKind: TcxIndicatorKind read GetIndicatorKind;
|
|
property RowViewInfo: TcxCustomGridRowViewInfo read FRowViewInfo write FRowViewInfo;
|
|
end;
|
|
|
|
TcxGridIndicatorFooterItemViewInfo = class(TcxCustomGridIndicatorItemViewInfo)
|
|
private
|
|
function GetSeparatorWidth: Integer;
|
|
protected
|
|
function CalculateHeight: Integer; override;
|
|
function GetBackgroundBitmap: TBitmap; override;
|
|
function GetBorders: TcxBorders; override;
|
|
function GetBordersBounds: TRect; virtual;
|
|
function GetBorderWidth(AIndex: TcxBorder): Integer; override;
|
|
function GetPainterClass: TcxCustomGridCellPainterClass; override;
|
|
function GetSeparatorBounds: TRect; virtual;
|
|
function HasSeparator: Boolean;
|
|
public
|
|
property BordersBounds: TRect read GetBordersBounds;
|
|
property SeparatorBounds: TRect read GetSeparatorBounds;
|
|
property SeparatorWidth: Integer read GetSeparatorWidth;
|
|
end;
|
|
|
|
TcxGridIndicatorViewInfoClass = class of TcxGridIndicatorViewInfo;
|
|
|
|
TcxGridIndicatorViewInfo = class(TcxCustomGridViewCellViewInfo)
|
|
private
|
|
FItems: TList;
|
|
function GetCount: Integer;
|
|
function GetGridView: TcxGridTableView;
|
|
function GetGridViewInfo: TcxGridTableViewInfo;
|
|
function GetItem(Index: Integer): TcxCustomGridIndicatorItemViewInfo;
|
|
procedure DestroyItems;
|
|
protected
|
|
function CalculateHeight: Integer; override;
|
|
function CalculateWidth: Integer; override;
|
|
function GetAlwaysVisible: Boolean; virtual;
|
|
function GetBackgroundBitmap: TBitmap; override;
|
|
function GetHitTestClass: TcxCustomGridHitTestClass; override;
|
|
function GetPainterClass: TcxCustomGridCellPainterClass; override;
|
|
procedure GetViewParams(var AParams: TcxViewParams); override;
|
|
function GetVisible: Boolean; override;
|
|
function GetWidth: Integer; override;
|
|
public
|
|
constructor Create(AGridViewInfo: TcxGridTableViewInfo); reintroduce; virtual;
|
|
destructor Destroy; override;
|
|
function AddItem(AItemClass: TcxCustomGridIndicatorItemViewInfoClass): TcxCustomGridIndicatorItemViewInfo; overload;
|
|
function AddItem(ATopBound, AHeight: Integer;
|
|
AItemClass: TcxCustomGridIndicatorItemViewInfoClass): TcxCustomGridIndicatorItemViewInfo; overload;
|
|
function AddRowItem(ARowViewInfo: TcxCustomGridRowViewInfo): TcxCustomGridIndicatorItemViewInfo;
|
|
procedure Calculate(ALeftBound, ATopBound: Integer; AWidth: Integer = -1;
|
|
AHeight: Integer = -1); override;
|
|
procedure CalculateRowItem(ARowViewInfo: TcxCustomGridRowViewInfo;
|
|
AItem: TcxCustomGridIndicatorItemViewInfo);
|
|
function GetHitTest(const P: TPoint): TcxCustomGridHitTest; override;
|
|
function GetRowItemBounds(AGridRecord: TcxCustomGridRow): TRect;
|
|
|
|
property AlwaysVisible: Boolean read GetAlwaysVisible;
|
|
property Count: Integer read GetCount;
|
|
property GridView: TcxGridTableView read GetGridView;
|
|
property GridViewInfo: TcxGridTableViewInfo read GetGridViewInfo;
|
|
property Items[Index: Integer]: TcxCustomGridIndicatorItemViewInfo read GetItem;
|
|
end;
|
|
|
|
// custom row
|
|
|
|
TcxGridRowFooterCellViewInfo = class(TcxGridFooterCellViewInfo)
|
|
private
|
|
function GetContainer: TcxGridRowFooterViewInfo;
|
|
function GetGridRecord: TcxCustomGridRow;
|
|
protected
|
|
function GetText: string; override;
|
|
procedure GetViewParams(var AParams: TcxViewParams); override;
|
|
public
|
|
property Container: TcxGridRowFooterViewInfo read GetContainer;
|
|
property GridRecord: TcxCustomGridRow read GetGridRecord;
|
|
end;
|
|
|
|
TcxGridRowFooterViewInfoClass = class of TcxGridRowFooterViewInfo;
|
|
|
|
TcxGridRowFooterViewInfo = class(TcxGridFooterViewInfo)
|
|
private
|
|
FContainer: TcxGridRowFootersViewInfo;
|
|
FLevel: Integer;
|
|
function GetIndent: Integer;
|
|
function GetGridRecord: TcxCustomGridRow;
|
|
function GetGroupLevel: Integer;
|
|
function GetRowViewInfo: TcxCustomGridRowViewInfo;
|
|
protected
|
|
function CalculateHeight: Integer; override;
|
|
function CalculateWidth: Integer; override;
|
|
function GetColumnWidth(AColumn: TcxGridColumn): Integer; override;
|
|
function GetHitTestClass: TcxCustomGridHitTestClass; override;
|
|
function GetIsPart: Boolean; override;
|
|
function GetItemAreaBounds(AItem: TcxGridColumnHeaderViewInfo): TRect; override;
|
|
function GetItemClass: TcxGridColumnHeaderViewInfoClass; override;
|
|
function GetItemHitTestClass: TcxCustomGridHitTestClass; override;
|
|
function GetItemMultiLinePainting(AItem: TcxGridColumnHeaderViewInfo): Boolean; override;
|
|
function GetSummaryItems: TcxDataSummaryItems; override;
|
|
procedure GetViewParams(var AParams: TcxViewParams); override;
|
|
function GetVisible: Boolean; override;
|
|
function GetVisualLevel: Integer; virtual;
|
|
function HasSeparator: Boolean; override;
|
|
procedure PrepareSummaryItems(ASummaryItems: TList); override;
|
|
property Indent: Integer read GetIndent;
|
|
public
|
|
constructor Create(AContainer: TcxGridRowFootersViewInfo; ALevel: Integer); reintroduce; virtual;
|
|
function CanShowMultipleSummaries: Boolean; override;
|
|
property Container: TcxGridRowFootersViewInfo read FContainer;
|
|
property GridRecord: TcxCustomGridRow read GetGridRecord;
|
|
property GroupLevel: Integer read GetGroupLevel;
|
|
property Level: Integer read FLevel;
|
|
property RowViewInfo: TcxCustomGridRowViewInfo read GetRowViewInfo;
|
|
property VisualLevel: Integer read GetVisualLevel;
|
|
end;
|
|
|
|
TcxGridRowFootersViewInfoClass = class of TcxGridRowFootersViewInfo;
|
|
|
|
TcxGridRowFootersViewInfo = class
|
|
private
|
|
FHeight: Integer;
|
|
FItems: TList;
|
|
FRowViewInfo: TcxCustomGridRowViewInfo;
|
|
function GetCount: Integer;
|
|
function GetGridViewInfo: TcxGridTableViewInfo;
|
|
function GetHeight: Integer;
|
|
function GetItem(Index: Integer): TcxGridRowFooterViewInfo;
|
|
function GetVisibleItem(ALevel: Integer): TcxGridRowFooterViewInfo;
|
|
procedure CreateItems;
|
|
procedure DestroyItems;
|
|
protected
|
|
procedure BeforeRecalculation; virtual;
|
|
procedure Calculate(ALeftBound, ATopBound: Integer); virtual;
|
|
function CalculateHeight: Integer; virtual;
|
|
function GetItemClass: TcxGridRowFooterViewInfoClass; virtual;
|
|
public
|
|
constructor Create(ARowViewInfo: TcxCustomGridRowViewInfo); virtual;
|
|
destructor Destroy; override;
|
|
function GetCellBestFitWidth(AColumn: TcxGridColumn): Integer;
|
|
function GetHitTest(const P: TPoint): TcxCustomGridHitTest; virtual;
|
|
function GetTopBound(ALevel: Integer; var ATopBound: Integer): Boolean;
|
|
procedure Offset(DX, DY: Integer); virtual;
|
|
procedure Paint;
|
|
|
|
property Count: Integer read GetCount;
|
|
property GridViewInfo: TcxGridTableViewInfo read GetGridViewInfo;
|
|
property Items[Index: Integer]: TcxGridRowFooterViewInfo read GetItem; default;
|
|
property Height: Integer read GetHeight;
|
|
property RowViewInfo: TcxCustomGridRowViewInfo read FRowViewInfo;
|
|
property VisibleItems[ALevel: Integer]: TcxGridRowFooterViewInfo read GetVisibleItem;
|
|
end;
|
|
|
|
TcxCustomGridRowViewInfoClass = class of TcxCustomGridRowViewInfo;
|
|
|
|
TcxCustomGridRowViewInfo = class(TcxCustomGridRecordViewInfo)
|
|
private
|
|
FFootersViewInfo: TcxGridRowFootersViewInfo;
|
|
FIndicatorItem: TcxCustomGridIndicatorItemViewInfo;
|
|
function GetCacheItem: TcxGridTableViewInfoCacheItem;
|
|
function GetGridView: TcxGridTableView;
|
|
function GetGridLines: TcxGridLines;
|
|
function GetGridRecord: TcxCustomGridRow;
|
|
function GetGridViewInfo: TcxGridTableViewInfo;
|
|
function GetLevel: Integer;
|
|
function GetLevelIndent: Integer;
|
|
function GetLevelIndentBounds(Index: Integer): TRect;
|
|
function GetLevelIndentHorzLineBounds(Index: Integer): TRect;
|
|
function GetLevelIndentSpaceBounds(Index: Integer): TRect;
|
|
function GetLevelIndentVertLineBounds(Index: Integer): TRect;
|
|
function GetRecordsViewInfo: TcxGridRowsViewInfo;
|
|
function GetVisualLevel: Integer;
|
|
procedure CreateFootersViewInfo;
|
|
procedure DestroyFootersViewInfo;
|
|
procedure RecreateFootersViewInfo;
|
|
protected
|
|
procedure AfterRowsViewInfoCalculate; virtual;
|
|
procedure AfterRowsViewInfoOffset; virtual;
|
|
procedure CalculateExpandButtonBounds(var ABounds: TRect); override;
|
|
function CalculateHeight: Integer; override;
|
|
function CalculateLevelIndentHorzLineBounds(ALevel: Integer; const ABounds: TRect): TRect;
|
|
function CalculateLevelIndentSpaceBounds(ALevel: Integer; const ABounds: TRect): TRect;
|
|
function CalculateLevelIndentVertLineBounds(ALevel: Integer; const ABounds: TRect): TRect;
|
|
function CalculateWidth: Integer; override;
|
|
function CanSize: Boolean; virtual;
|
|
procedure CheckRowHeight(var AValue: Integer); virtual;
|
|
function GetAutoHeight: Boolean; override;
|
|
function GetBaseHeight: Integer; virtual;
|
|
function GetBottomPartHeight: Integer; virtual;
|
|
function GetCellTransparent(ACell: TcxGridTableCellViewInfo): Boolean; override;
|
|
function GetContentBounds: TRect; override;
|
|
function GetContentIndent: Integer; virtual;
|
|
function GetContentWidth: Integer; override;
|
|
function GetDataHeight: Integer; virtual;
|
|
function GetDataIndent: Integer; virtual;
|
|
function GetDataWidth: Integer; virtual;
|
|
function GetFocusRectBounds: TRect; override;
|
|
function GetFootersViewInfoClass: TcxGridRowFootersViewInfoClass; virtual;
|
|
function GetFullyVisible: Boolean; virtual;
|
|
function GetLastHorzGridLineBounds: TRect; virtual;
|
|
function GetMaxHeight: Integer; virtual;
|
|
function GetNonBaseHeight: Integer; virtual;
|
|
function GetRowHeight: Integer; virtual;
|
|
function GetSeparatorBounds: TRect; virtual;
|
|
function GetSeparatorColor: TColor; virtual;
|
|
function GetSeparatorWidth: Integer; virtual;
|
|
function GetShowSeparator: Boolean; virtual;
|
|
function GetVisible: Boolean; override;
|
|
function GetWidth: Integer; override;
|
|
function HasAnyFooter(ALevel: Integer): Boolean;
|
|
function HasFooter(ALevel: Integer): Boolean; virtual;
|
|
function HasFooters: Boolean; virtual;
|
|
function HasLastHorzGridLine: Boolean; virtual;
|
|
procedure Offset(DX, DY: Integer); override;
|
|
procedure SetRowHeight(Value: Integer); virtual; abstract;
|
|
|
|
property BaseHeight: Integer read GetBaseHeight;
|
|
property BottomPartHeight: Integer read GetBottomPartHeight;
|
|
property CacheItem: TcxGridTableViewInfoCacheItem read GetCacheItem;
|
|
property IndicatorItem: TcxCustomGridIndicatorItemViewInfo read FIndicatorItem;
|
|
property LastHorzGridLineBounds: TRect read GetLastHorzGridLineBounds;
|
|
property Level: Integer read GetLevel;
|
|
property LevelIndent: Integer read GetLevelIndent;
|
|
property NonBaseHeight: Integer read GetNonBaseHeight;
|
|
property RowHeight: Integer read GetRowHeight write SetRowHeight;
|
|
property ShowSeparator: Boolean read GetShowSeparator;
|
|
public
|
|
constructor Create(ARecordsViewInfo: TcxCustomGridRecordsViewInfo;
|
|
ARecord: TcxCustomGridRecord); override;
|
|
destructor Destroy; override;
|
|
procedure BeforeRecalculation; override;
|
|
procedure Calculate(ALeftBound, ATopBound: Integer; AWidth: Integer = -1;
|
|
AHeight: Integer = -1); override;
|
|
function Click(AHitTest: TcxCustomGridHitTest; AButton: TMouseButton;
|
|
AShift: TShiftState): Boolean; override;
|
|
function GetBoundsForInvalidate(AItem: TcxCustomGridTableItem): TRect; override;
|
|
function GetHitTest(const P: TPoint): TcxCustomGridHitTest; override;
|
|
function HasSeparator: Boolean;
|
|
|
|
property ContentIndent: Integer read GetContentIndent;
|
|
property DataHeight: Integer read GetDataHeight;
|
|
property DataIndent: Integer read GetDataIndent;
|
|
property DataWidth: Integer read GetDataWidth;
|
|
property FootersViewInfo: TcxGridRowFootersViewInfo read FFootersViewInfo;
|
|
property FullyVisible: Boolean read GetFullyVisible;
|
|
property GridView: TcxGridTableView read GetGridView;
|
|
property GridLines: TcxGridLines read GetGridLines;
|
|
property GridRecord: TcxCustomGridRow read GetGridRecord;
|
|
property GridViewInfo: TcxGridTableViewInfo read GetGridViewInfo;
|
|
property LevelIndentBounds[Index: Integer]: TRect read GetLevelIndentBounds;
|
|
property LevelIndentHorzLineBounds[Index: Integer]: TRect read GetLevelIndentHorzLineBounds;
|
|
property LevelIndentSpaceBounds[Index: Integer]: TRect read GetLevelIndentSpaceBounds;
|
|
property LevelIndentVertLineBounds[Index: Integer]: TRect read GetLevelIndentVertLineBounds;
|
|
property MaxHeight: Integer read GetMaxHeight;
|
|
property RecordsViewInfo: TcxGridRowsViewInfo read GetRecordsViewInfo;
|
|
property SeparatorBounds: TRect read GetSeparatorBounds;
|
|
property SeparatorColor: TColor read GetSeparatorColor;
|
|
property SeparatorWidth: Integer read GetSeparatorWidth;
|
|
property VisualLevel: Integer read GetVisualLevel;
|
|
end;
|
|
|
|
// rows
|
|
|
|
TcxGridRowsViewInfoClass = class of TcxGridRowsViewInfo;
|
|
|
|
TcxGridRowsViewInfo = class(TcxCustomGridRecordsViewInfo)
|
|
private
|
|
FDataRowHeight: Integer;
|
|
FFilterRowViewInfo: TcxCustomGridRowViewInfo;
|
|
FGroupRowHeight: Integer;
|
|
FNewItemRowViewInfo: TcxCustomGridRowViewInfo;
|
|
FRestHeight: Integer;
|
|
FRowHeight: Integer;
|
|
function GetFilterRowViewInfo: TcxCustomGridRowViewInfo;
|
|
function GetGridView: TcxGridTableView;
|
|
function GetGridLines: TcxGridLines;
|
|
function GetGridViewInfo: TcxGridTableViewInfo;
|
|
function GetHeaderViewInfo: TcxGridHeaderViewInfo;
|
|
function GetItem(Index: Integer): TcxCustomGridRowViewInfo;
|
|
function GetNewItemRowViewInfo: TcxCustomGridRowViewInfo;
|
|
function GetPainterClassValue: TcxGridRowsPainterClass;
|
|
function GetViewData: TcxGridViewData;
|
|
protected
|
|
FIsFirstRowFullyVisible: Boolean;
|
|
FPartVisibleCount: Integer;
|
|
procedure AfterCalculate; override;
|
|
procedure AfterOffset; override;
|
|
procedure Calculate; override;
|
|
function CalculateBounds: TRect; override;
|
|
procedure CalculateConsts; virtual;
|
|
function CalculateContentBounds: TRect; override;
|
|
function CalculateDataRowHeight: Integer; virtual;
|
|
function CalculateGroupRowDefaultHeight(AMinHeight: Boolean): Integer; virtual;
|
|
function CalculateGroupRowHeight: Integer; virtual;
|
|
function CalculateRestHeight(ATopBound: Integer): Integer; virtual;
|
|
function CalculateRowDefaultHeight: Integer; virtual;
|
|
function CalculateRowHeight: Integer; virtual;
|
|
procedure CalculateVisibleCount; override;
|
|
function GetAutoDataCellHeight: Boolean; override;
|
|
function GetCommonDataRowHeight: Integer; virtual;
|
|
function GetFilterRowViewInfoClass: TcxCustomGridRowViewInfoClass; virtual;
|
|
function GetGroupBackgroundBitmap: TBitmap; virtual;
|
|
function GetGroupRowSeparatorWidth: Integer; virtual;
|
|
function GetItemLeftBound(AIndex: Integer): Integer; override;
|
|
function GetItemsOffset(AItemCountDelta: Integer): Integer; override;
|
|
function GetItemTopBound(AIndex: Integer): Integer; override;
|
|
function GetIsScrollable: Boolean; virtual;
|
|
function GetNewItemRowViewInfoClass: TcxCustomGridRowViewInfoClass; virtual;
|
|
function GetPainterClass: TcxCustomGridRecordsPainterClass; override;
|
|
function GetRowWidth: Integer; virtual;
|
|
function GetSeparatorWidth: Integer; virtual;
|
|
function HasFilterRow: Boolean;
|
|
function HasLastHorzGridLine(ARowViewInfo: TcxCustomGridRowViewInfo): Boolean; virtual;
|
|
function HasNewItemRow: Boolean;
|
|
function IsFilterRowVisible: Boolean; virtual;
|
|
function IsNewItemRowVisible: Boolean; virtual;
|
|
procedure NotifyItemsCalculationFinished;
|
|
procedure OffsetItem(AIndex, AOffset: Integer); override;
|
|
|
|
property GridView: TcxGridTableView read GetGridView;
|
|
property GridViewInfo: TcxGridTableViewInfo read GetGridViewInfo;
|
|
property HeaderViewInfo: TcxGridHeaderViewInfo read GetHeaderViewInfo;
|
|
property IsScrollable: Boolean read GetIsScrollable;
|
|
property ViewData: TcxGridViewData read GetViewData;
|
|
public
|
|
destructor Destroy; override;
|
|
procedure AfterConstruction; override;
|
|
function CalculateCustomGroupRowHeight(AMinHeight: Boolean; AParams: TcxViewParams): Integer; virtual;
|
|
function CanDataRowSize: Boolean; virtual;
|
|
function GetCellHeight(ACellContentHeight: Integer): Integer; override;
|
|
function GetDataRowCellsAreaViewInfoClass: TClass; virtual;
|
|
function GetFooterCellBestFitWidth(AColumn: TcxGridColumn): Integer;
|
|
function GetHitTest(const P: TPoint): TcxCustomGridHitTest; override;
|
|
function GetRealItem(ARecord: TcxCustomGridRecord): TcxCustomGridRecordViewInfo; override;
|
|
function GetRestHeight(ATopBound: Integer): Integer; virtual;
|
|
function IsCellMultiLine(AItem: TcxCustomGridTableItem): Boolean; override;
|
|
function IsDataRowHeightAssigned: Boolean; virtual;
|
|
procedure Offset(DX, DY: Integer); override;
|
|
|
|
property CommonDataRowHeight: Integer read GetCommonDataRowHeight;
|
|
property DataRowHeight: Integer read FDataRowHeight;
|
|
property FilterRowViewInfo: TcxCustomGridRowViewInfo read GetFilterRowViewInfo;
|
|
property GridLines: TcxGridLines read GetGridLines;
|
|
property GroupBackgroundBitmap: TBitmap read GetGroupBackgroundBitmap;
|
|
property GroupRowHeight: Integer read FGroupRowHeight write FGroupRowHeight;
|
|
property GroupRowSeparatorWidth: Integer read GetGroupRowSeparatorWidth;
|
|
property IsFirstRowFullyVisible: Boolean read FIsFirstRowFullyVisible;
|
|
property Items[Index: Integer]: TcxCustomGridRowViewInfo read GetItem; default;
|
|
property NewItemRowViewInfo: TcxCustomGridRowViewInfo read GetNewItemRowViewInfo;
|
|
property PainterClass: TcxGridRowsPainterClass read GetPainterClassValue;
|
|
property PartVisibleCount: Integer read FPartVisibleCount;
|
|
property RowHeight: Integer read FRowHeight write FRowHeight;
|
|
property RowWidth: Integer read GetRowWidth;
|
|
property SeparatorWidth: Integer read GetSeparatorWidth;
|
|
end;
|
|
|
|
// table
|
|
|
|
TcxGridTableViewInfo = class(TcxCustomGridTableViewInfo)
|
|
private
|
|
FDataWidth: Integer;
|
|
FExpandButtonIndent: Integer;
|
|
FFooterViewInfo: TcxGridFooterViewInfo;
|
|
FGroupByBoxViewInfo: TcxGridGroupByBoxViewInfo;
|
|
FHeaderViewInfo: TcxGridHeaderViewInfo;
|
|
FIndicatorViewInfo: TcxGridIndicatorViewInfo;
|
|
FLevelIndent: Integer;
|
|
FPrevDataRowHeight: Integer;
|
|
|
|
function GetController: TcxGridTableController;
|
|
function GetDataWidth: Integer;
|
|
function GetGridView: TcxGridTableView;
|
|
function GetGridLineColor: TColor;
|
|
function GetGridLines: TcxGridLines;
|
|
function GetLeftPos: Integer;
|
|
function GetLevelIndentBackgroundBitmap: TBitmap;
|
|
function GetLevelIndentColor(Index: Integer): TColor;
|
|
function GetRecordsViewInfo: TcxGridRowsViewInfo;
|
|
function GetViewData: TcxGridViewData;
|
|
protected
|
|
procedure AfterCalculating; override;
|
|
procedure BeforeCalculating; override;
|
|
procedure CreateViewInfos; override;
|
|
procedure DestroyViewInfos(AIsRecreating: Boolean); override;
|
|
procedure Calculate; override;
|
|
function CalculateClientBounds: TRect; override;
|
|
function CalculateDataWidth: Integer; virtual;
|
|
procedure CalculateExpandButtonParams; virtual;
|
|
procedure CalculateHeight(const AMaxSize: TPoint; var AHeight: Integer;
|
|
var AFullyVisible: Boolean); override;
|
|
function CalculatePartBounds(APart: TcxCustomGridPartViewInfo): TRect; override;
|
|
procedure CalculateParts; virtual;
|
|
function CalculateVisibleEqualHeightRecordCount: Integer; override;
|
|
procedure CalculateWidth(const AMaxSize: TPoint; var AWidth: Integer); override;
|
|
function DoGetHitTest(const P: TPoint): TcxCustomGridHitTest; override;
|
|
function GetDefaultGridModeBufferCount: Integer; override;
|
|
function GetFirstItemAdditionalWidth: Integer; virtual;
|
|
function GetGridLineWidth: Integer; virtual;
|
|
function GetLevelSeparatorColor: TColor; virtual;
|
|
function GetNonRecordsAreaHeight(ACheckScrollBar: Boolean): Integer; override;
|
|
function GetScrollableAreaBoundsHorz: TRect; override;
|
|
function GetScrollableAreaBoundsVert: TRect; override;
|
|
function GetVisualLevelCount: Integer; virtual;
|
|
procedure Offset(DX, DY: Integer); override;
|
|
procedure RecreateViewInfos; override;
|
|
function SupportsAutoHeight: Boolean; virtual;
|
|
function SupportsGroupSummariesAlignedWithColumns: Boolean; virtual;
|
|
function SupportsMultipleFooterSummaries: Boolean; virtual;
|
|
|
|
function GetFooterPainterClass: TcxGridFooterPainterClass; virtual;
|
|
function GetFooterViewInfoClass: TcxGridFooterViewInfoClass; virtual;
|
|
function GetGroupByBoxViewInfoClass: TcxGridGroupByBoxViewInfoClass; virtual;
|
|
function GetHeaderViewInfoClass: TcxGridHeaderViewInfoClass; virtual;
|
|
function GetIndicatorViewInfoClass: TcxGridIndicatorViewInfoClass; virtual;
|
|
function GetHeaderViewInfoSpecificClass: TcxGridHeaderViewInfoSpecificClass; virtual;
|
|
function GetRecordsViewInfoClass: TcxCustomGridRecordsViewInfoClass; override;
|
|
|
|
property Controller: TcxGridTableController read GetController;
|
|
property ViewData: TcxGridViewData read GetViewData;
|
|
public
|
|
function GetCellBorders(AIsRight, AIsBottom: Boolean): TcxBorders; virtual;
|
|
function GetCellHeight(AIndex, ACellHeight: Integer): Integer; virtual;
|
|
function GetCellTopOffset(AIndex, ACellHeight: Integer): Integer; virtual;
|
|
function GetOffsetBounds(AItemsOffset: Integer; out AUpdateBounds: TRect): TRect; overload; virtual;
|
|
function GetOffsetBounds(DX, DY: Integer; out AUpdateBounds: TRect): TRect; overload; virtual;
|
|
function GetVisualLevel(ALevel: Integer): Integer; virtual;
|
|
|
|
// for extended lookup edit
|
|
function GetNearestPopupHeight(AHeight: Integer; AAdditionalRecord: Boolean = False): Integer; override;
|
|
function GetPopupHeight(ADropDownRowCount: Integer): Integer; override;
|
|
|
|
property DataWidth: Integer read GetDataWidth;
|
|
property ExpandButtonIndent: Integer read FExpandButtonIndent write FExpandButtonIndent;
|
|
property FirstItemAdditionalWidth: Integer read GetFirstItemAdditionalWidth;
|
|
property FooterViewInfo: TcxGridFooterViewInfo read FFooterViewInfo;
|
|
property GridLineColor: TColor read GetGridLineColor;
|
|
property GridLines: TcxGridLines read GetGridLines;
|
|
property GridLineWidth: Integer read GetGridLineWidth;
|
|
property GridView: TcxGridTableView read GetGridView;
|
|
property GroupByBoxViewInfo: TcxGridGroupByBoxViewInfo read FGroupByBoxViewInfo;
|
|
property HeaderViewInfo: TcxGridHeaderViewInfo read FHeaderViewInfo;
|
|
property IndicatorViewInfo: TcxGridIndicatorViewInfo read FIndicatorViewInfo;
|
|
property LeftPos: Integer read GetLeftPos;
|
|
property LevelIndent: Integer read FLevelIndent write FLevelIndent;
|
|
property LevelIndentBackgroundBitmap: TBitmap read GetLevelIndentBackgroundBitmap;
|
|
property LevelIndentColors[Index: Integer]: TColor read GetLevelIndentColor;
|
|
property LevelSeparatorColor: TColor read GetLevelSeparatorColor;
|
|
property RecordsViewInfo: TcxGridRowsViewInfo read GetRecordsViewInfo;
|
|
property VisualLevelCount: Integer read GetVisualLevelCount;
|
|
end;
|
|
|
|
// cache
|
|
|
|
TcxGridTableViewInfoCacheItem = class(TcxCustomGridTableViewInfoCacheItem)
|
|
private
|
|
FIsPreviewHeightAssigned: Boolean;
|
|
FPreviewHeight: Integer;
|
|
procedure SetPreviewHeight(Value: Integer);
|
|
public
|
|
procedure UnassignValues(AKeepMaster: Boolean); override;
|
|
property IsPreviewHeightAssigned: Boolean read FIsPreviewHeightAssigned
|
|
write FIsPreviewHeightAssigned;
|
|
property PreviewHeight: Integer read FPreviewHeight write SetPreviewHeight;
|
|
end;
|
|
|
|
TcxGridMasterTableViewInfoCacheItem = class(TcxGridTableViewInfoCacheItem)
|
|
private
|
|
FIsDetailsSiteFullyVisibleAssigned: Boolean;
|
|
FIsDetailsSiteHeightAssigned: Boolean;
|
|
FIsDetailsSiteNormalHeightAssigned: Boolean;
|
|
FIsDetailsSiteWidthAssigned: Boolean;
|
|
FDetailsSiteFullyVisible: Boolean;
|
|
FDetailsSiteHeight: Integer;
|
|
FDetailsSiteNormalHeight: Integer;
|
|
FDetailsSiteWidth: Integer;
|
|
FUnassigningValues: Boolean;
|
|
function GetGridRecord: TcxGridMasterDataRow;
|
|
function GetIsDetailsSiteCachedInfoAssigned: Boolean;
|
|
procedure SetDetailsSiteFullyVisible(Value: Boolean);
|
|
procedure SetDetailsSiteHeight(Value: Integer);
|
|
procedure SetDetailsSiteNormalHeight(Value: Integer);
|
|
procedure SetDetailsSiteWidth(Value: Integer);
|
|
protected
|
|
property GridRecord: TcxGridMasterDataRow read GetGridRecord;
|
|
public
|
|
DetailsSiteCachedInfo: TcxCustomGridDetailsSiteViewInfoCachedInfo;
|
|
destructor Destroy; override;
|
|
procedure UnassignValues(AKeepMaster: Boolean); override;
|
|
property IsDetailsSiteCachedInfoAssigned: Boolean read GetIsDetailsSiteCachedInfoAssigned;
|
|
property IsDetailsSiteFullyVisibleAssigned: Boolean read FIsDetailsSiteFullyVisibleAssigned write FIsDetailsSiteFullyVisibleAssigned;
|
|
property IsDetailsSiteHeightAssigned: Boolean read FIsDetailsSiteHeightAssigned write FIsDetailsSiteHeightAssigned;
|
|
property IsDetailsSiteNormalHeightAssigned: Boolean read FIsDetailsSiteNormalHeightAssigned write FIsDetailsSiteNormalHeightAssigned;
|
|
property IsDetailsSiteWidthAssigned: Boolean read FIsDetailsSiteWidthAssigned write FIsDetailsSiteWidthAssigned;
|
|
property DetailsSiteFullyVisible: Boolean read FDetailsSiteFullyVisible write SetDetailsSiteFullyVisible;
|
|
property DetailsSiteHeight: Integer read FDetailsSiteHeight write SetDetailsSiteHeight;
|
|
property DetailsSiteNormalHeight: Integer read FDetailsSiteNormalHeight write SetDetailsSiteNormalHeight;
|
|
property DetailsSiteWidth: Integer read FDetailsSiteWidth write SetDetailsSiteWidth;
|
|
end;
|
|
|
|
{ view }
|
|
|
|
// column
|
|
|
|
TcxGridColumnOptions = class(TcxCustomGridTableItemOptions)
|
|
private
|
|
FCellMerging: Boolean;
|
|
FGroupFooters: Boolean;
|
|
FHorzSizing: Boolean;
|
|
function GetGridView: TcxGridTableView;
|
|
procedure SetCellMerging(Value: Boolean);
|
|
procedure SetGroupFooters(Value: Boolean);
|
|
procedure SetHorzSizing(Value: Boolean);
|
|
protected
|
|
property GridView: TcxGridTableView read GetGridView;
|
|
public
|
|
constructor Create(AItem: TcxCustomGridTableItem); override;
|
|
procedure Assign(Source: TPersistent); override;
|
|
published
|
|
property CellMerging: Boolean read FCellMerging write SetCellMerging default False;
|
|
property GroupFooters: Boolean read FGroupFooters write SetGroupFooters default True;
|
|
property Grouping;
|
|
property HorzSizing: Boolean read FHorzSizing write SetHorzSizing default True;
|
|
property Moving;
|
|
property ShowCaption;
|
|
property SortByDisplayText;
|
|
property Sorting;
|
|
end;
|
|
|
|
TcxGridGetFooterStyleExEvent = procedure(Sender: TcxGridTableView; ARow: TcxCustomGridRow;
|
|
AColumn: TcxGridColumn; AFooterGroupLevel: Integer; var AStyle: TcxStyle) of object;
|
|
TcxGridGetFooterSummaryStyleEvent = procedure(AView: TcxGridTableView; ARow: TcxCustomGridRow;
|
|
AColumn: TcxGridColumn; AFooterGroupLevel: Integer; ASummaryItem: TcxDataSummaryItem; var AStyle: TcxStyle) of object;
|
|
TcxGridGetGroupSummaryStyleEvent = procedure(Sender: TcxGridTableView; ARow: TcxGridGroupRow;
|
|
AColumn: TcxGridColumn; ASummaryItem: TcxDataSummaryItem; var AStyle: TcxStyle) of object;
|
|
TcxGridGetHeaderStyleEvent = procedure(Sender: TcxGridTableView;
|
|
AColumn: TcxGridColumn; {$IFDEF BCB}var{$ELSE}out{$ENDIF} AStyle: TcxStyle) of object;
|
|
|
|
TcxGridColumnStyles = class(TcxCustomGridTableItemStyles)
|
|
private
|
|
FOnGetFooterStyle: TcxGridGetCellStyleEvent;
|
|
FOnGetFooterStyleEx: TcxGridGetFooterStyleExEvent;
|
|
FOnGetFooterSummaryStyle: TcxGridGetFooterSummaryStyleEvent;
|
|
FOnGetGroupSummaryStyle: TcxGridGetGroupSummaryStyleEvent;
|
|
FOnGetHeaderStyle: TcxGridGetHeaderStyleEvent;
|
|
function GetGridViewValue: TcxGridTableView;
|
|
function GetItem: TcxGridColumn;
|
|
procedure SetOnGetFooterStyle(Value: TcxGridGetCellStyleEvent);
|
|
procedure SetOnGetFooterStyleEx(Value: TcxGridGetFooterStyleExEvent);
|
|
procedure SetOnGetFooterSummaryStyle(Value: TcxGridGetFooterSummaryStyleEvent);
|
|
procedure SetOnGetGroupSummaryStyle(Value: TcxGridGetGroupSummaryStyleEvent);
|
|
procedure SetOnGetHeaderStyle(Value: TcxGridGetHeaderStyleEvent);
|
|
protected
|
|
procedure GetDefaultViewParams(Index: Integer; AData: TObject; out AParams: TcxViewParams); override;
|
|
public
|
|
procedure Assign(Source: TPersistent); override;
|
|
procedure GetFooterParams(ARow: TcxCustomGridRow; AFooterGroupLevel: Integer;
|
|
ASummaryItem: TcxDataSummaryItem; out AParams: TcxViewParams); virtual;
|
|
procedure GetGroupSummaryParams(ARow: TcxGridGroupRow; ASummaryItem: TcxDataSummaryItem;
|
|
out AParams: TcxViewParams); virtual;
|
|
procedure GetHeaderParams(out AParams: TcxViewParams); virtual;
|
|
property GridView: TcxGridTableView read GetGridViewValue;
|
|
property Item: TcxGridColumn read GetItem;
|
|
published
|
|
property Footer: TcxStyle index isFooter read GetValue write SetValue;
|
|
property GroupSummary: TcxStyle index isGroupSummary read GetValue write SetValue;
|
|
property Header: TcxStyle index isHeader read GetValue write SetValue;
|
|
property OnGetFooterStyle: TcxGridGetCellStyleEvent read FOnGetFooterStyle write SetOnGetFooterStyle;
|
|
property OnGetFooterStyleEx: TcxGridGetFooterStyleExEvent read FOnGetFooterStyleEx write SetOnGetFooterStyleEx;
|
|
property OnGetFooterSummaryStyle: TcxGridGetFooterSummaryStyleEvent read FOnGetFooterSummaryStyle write SetOnGetFooterSummaryStyle;
|
|
property OnGetGroupSummaryStyle: TcxGridGetGroupSummaryStyleEvent read FOnGetGroupSummaryStyle write SetOnGetGroupSummaryStyle;
|
|
property OnGetHeaderStyle: TcxGridGetHeaderStyleEvent read FOnGetHeaderStyle write SetOnGetHeaderStyle;
|
|
end;
|
|
|
|
{$IFNDEF BCB}
|
|
TcxGridSummariesIndex = (siFooter, siGroupFooter, siGroup);
|
|
{$ELSE}
|
|
TcxGridSummariesIndex = Integer;
|
|
{$ENDIF}
|
|
|
|
TcxGridColumnSummaryClass = class of TcxGridColumnSummary;
|
|
|
|
TcxGridColumnSummary = class(TcxCustomGridTableItemCustomOptions)
|
|
private
|
|
function GetDataController: TcxCustomDataController;
|
|
function GetFormat(Index: TcxGridSummariesIndex): string;
|
|
function GetKind(Index: TcxGridSummariesIndex): TcxSummaryKind;
|
|
function GetSortByGroupFooterSummary: Boolean;
|
|
function GetSortByGroupSummary: Boolean;
|
|
procedure SetFormat(Index: TcxGridSummariesIndex; const Value: string);
|
|
procedure SetKind(Index: TcxGridSummariesIndex; Value: TcxSummaryKind);
|
|
procedure SetSortByGroupFooterSummary(Value: Boolean);
|
|
procedure SetSortByGroupSummary(Value: Boolean);
|
|
protected
|
|
function GetSummaryItems(AIndex: TcxGridSummariesIndex): TcxDataSummaryItems;
|
|
function GetSummaryItemsPosition(AIndex: TcxGridSummariesIndex): TcxSummaryPosition;
|
|
property DataController: TcxCustomDataController read GetDataController;
|
|
public
|
|
procedure Assign(Source: TPersistent); override;
|
|
published
|
|
property FooterKind: TcxSummaryKind index siFooter read GetKind write SetKind stored False;
|
|
property FooterFormat: string index siFooter read GetFormat write SetFormat stored False;
|
|
property GroupFooterKind: TcxSummaryKind index siGroupFooter read GetKind write SetKind stored False;
|
|
property GroupFooterFormat: string index siGroupFooter read GetFormat write SetFormat stored False;
|
|
property GroupKind: TcxSummaryKind index siGroup read GetKind write SetKind stored False;
|
|
property GroupFormat: string index siGroup read GetFormat write SetFormat stored False;
|
|
property SortByGroupFooterSummary: Boolean read GetSortByGroupFooterSummary write SetSortByGroupFooterSummary stored False;
|
|
property SortByGroupSummary: Boolean read GetSortByGroupSummary write SetSortByGroupSummary stored False;
|
|
end;
|
|
|
|
TcxGridColumnCompareRowValuesEvent = procedure(Sender: TcxGridColumn;
|
|
ARow1: TcxGridDataRow; AProperties1: TcxCustomEditProperties; const AValue1: TcxEditValue;
|
|
ARow2: TcxGridDataRow; AProperties2: TcxCustomEditProperties; const AValue2: TcxEditValue;
|
|
var AAreEqual: Boolean) of object;
|
|
TcxGridColumnCompareValuesEvent = procedure(Sender: TcxGridColumn;
|
|
AProperties1: TcxCustomEditProperties; const AValue1: TcxEditValue;
|
|
AProperties2: TcxCustomEditProperties; const AValue2: TcxEditValue; var AAreEqual: Boolean) of object;
|
|
TcxGridColumnCustomDrawHeaderEvent = procedure(Sender: TcxGridTableView; ACanvas: TcxCanvas;
|
|
AViewInfo: TcxGridColumnHeaderViewInfo; var ADone: Boolean) of object;
|
|
TcxGridGroupSummaryCellCustomDrawEvent = procedure(Sender: TObject; ACanvas: TcxCanvas;
|
|
ARow: TcxGridGroupRow; AColumn: TcxGridColumn; ASummaryItem: TcxDataSummaryItem;
|
|
AViewInfo: TcxCustomGridViewCellViewInfo; var ADone: Boolean) of object;
|
|
|
|
TcxGridColumn = class(TcxCustomGridTableItem)
|
|
private
|
|
FFooterAlignmentHorz: TAlignment;
|
|
FGroupSummaryAlignment: TAlignment;
|
|
FHeaderGlyph: TBitmap;
|
|
FHeaderGlyphAlignmentHorz: TAlignment;
|
|
FHeaderGlyphAlignmentVert: TcxAlignmentVert;
|
|
FIsFooterAlignmentHorzAssigned: Boolean;
|
|
FIsGroupSummaryAlignmentAssigned: Boolean;
|
|
FSelected: Boolean;
|
|
FSummary: TcxGridColumnSummary;
|
|
FOnCompareRowValuesForCellMerging: TcxGridColumnCompareRowValuesEvent;
|
|
FOnCompareValuesForCellMerging: TcxGridColumnCompareValuesEvent;
|
|
FOnCustomDrawFooterCell: TcxGridColumnCustomDrawHeaderEvent;
|
|
FOnCustomDrawGroupSummaryCell: TcxGridGroupSummaryCellCustomDrawEvent;
|
|
FOnCustomDrawHeader: TcxGridColumnCustomDrawHeaderEvent;
|
|
FOnHeaderClick: TNotifyEvent;
|
|
|
|
function GetController: TcxGridTableController;
|
|
function GetFooterAlignmentHorz: TAlignment;
|
|
function GetGridView: TcxGridTableView;
|
|
function GetGroupSummaryAlignment: TAlignment;
|
|
function GetIsPreview: Boolean;
|
|
function GetOptions: TcxGridColumnOptions;
|
|
function GetStyles: TcxGridColumnStyles;
|
|
function GetViewData: TcxGridViewData;
|
|
procedure SetFooterAlignmentHorz(Value: TAlignment);
|
|
procedure SetGroupSummaryAlignment(Value: TAlignment);
|
|
procedure SetHeaderGlyph(Value: TBitmap);
|
|
procedure SetHeaderGlyphAlignmentHorz(Value: TAlignment);
|
|
procedure SetHeaderGlyphAlignmentVert(Value: TcxAlignmentVert);
|
|
procedure SetIsPreview(Value: Boolean);
|
|
procedure SetOnCompareRowValuesForCellMerging(Value: TcxGridColumnCompareRowValuesEvent);
|
|
procedure SetOnCompareValuesForCellMerging(Value: TcxGridColumnCompareValuesEvent);
|
|
procedure SetOnCustomDrawFooterCell(Value: TcxGridColumnCustomDrawHeaderEvent);
|
|
procedure SetOnCustomDrawGroupSummaryCell(Value: TcxGridGroupSummaryCellCustomDrawEvent);
|
|
procedure SetOnCustomDrawHeader(Value: TcxGridColumnCustomDrawHeaderEvent);
|
|
procedure SetOnHeaderClick(Value: TNotifyEvent);
|
|
procedure SetOptions(Value: TcxGridColumnOptions);
|
|
procedure SetSelected(Value: Boolean);
|
|
procedure SetStyles(Value: TcxGridColumnStyles);
|
|
procedure SetSummary(Value: TcxGridColumnSummary);
|
|
|
|
function IsFooterAlignmentHorzStored: Boolean;
|
|
function IsGroupSummaryAlignmentStored: Boolean;
|
|
|
|
procedure HeaderGlyphChanged(Sender: TObject);
|
|
protected
|
|
// IcxStoredObject
|
|
function GetStoredProperties(AProperties: TStrings): Boolean; override;
|
|
procedure GetPropertyValue(const AName: string; var AValue: Variant); override;
|
|
procedure SetPropertyValue(const AName: string; const AValue: Variant); override;
|
|
|
|
procedure CreateSubClasses; override;
|
|
procedure DestroySubClasses; override;
|
|
function GetOptionsClass: TcxCustomGridTableItemOptionsClass; override;
|
|
function GetStylesClass: TcxCustomGridTableItemStylesClass; override;
|
|
function GetSummaryClass: TcxGridColumnSummaryClass; virtual;
|
|
|
|
procedure AssignColumnWidths; virtual;
|
|
procedure BestFitApplied(AFireEvents: Boolean); override;
|
|
function CalculateBestFitWidth: Integer; override;
|
|
function CanCellMerging: Boolean; virtual;
|
|
function CanEdit: Boolean; override;
|
|
function CanFocus(ARecord: TcxCustomGridRecord): Boolean; override;
|
|
function CanHorzSize: Boolean; override;
|
|
function CanShowGroupFooters: Boolean; virtual;
|
|
procedure ForceWidth(Value: Integer); override;
|
|
function GetEditValue: Variant; override;
|
|
procedure SetEditValue(const Value: Variant); override;
|
|
function GetFixed: Boolean; override;
|
|
function GetIsBottom: Boolean; virtual;
|
|
function GetIsLeft: Boolean; virtual;
|
|
function GetIsMostBottom: Boolean; virtual;
|
|
function GetIsMostLeft: Boolean; virtual;
|
|
function GetIsMostRight: Boolean; virtual;
|
|
function GetIsRight: Boolean; virtual;
|
|
function GetIsTop: Boolean; virtual;
|
|
function GetVisible: Boolean; override;
|
|
function GetVisibleForCustomization: Boolean; override;
|
|
function HasFixedWidth: Boolean; override;
|
|
function HideOnGrouping: Boolean; virtual;
|
|
function IsVisibleStored: Boolean; override;
|
|
function IsVisibleForCustomizationStored: Boolean; override;
|
|
function SupportsBeginsWithFilterOperator(ARow: TcxCustomGridRow): Boolean;
|
|
//procedure VisibleChanged; dynamic;
|
|
|
|
function GetHeaderViewInfoClass: TcxGridColumnHeaderViewInfoClass;
|
|
|
|
procedure DoCustomDrawFooterCell(ACanvas: TcxCanvas; AViewInfo: TcxGridColumnHeaderViewInfo;
|
|
var ADone: Boolean); virtual;
|
|
procedure DoCustomDrawGroupSummaryCell(ACanvas: TcxCanvas; AViewInfo: TcxCustomGridViewCellViewInfo;
|
|
var ADone: Boolean); virtual;
|
|
procedure DoCustomDrawHeader(ACanvas: TcxCanvas; AViewInfo: TcxGridColumnHeaderViewInfo;
|
|
var ADone: Boolean); virtual;
|
|
procedure DoHeaderClick; virtual;
|
|
function HasCustomDrawFooterCell: Boolean;
|
|
function HasCustomDrawGroupSummaryCell: Boolean;
|
|
function HasCustomDrawHeader: Boolean;
|
|
|
|
property Controller: TcxGridTableController read GetController;
|
|
property ViewData: TcxGridViewData read GetViewData;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
procedure Assign(Source: TPersistent); override;
|
|
function DoCompareValuesForCellMerging(
|
|
ARow1: TcxGridDataRow; AProperties1: TcxCustomEditProperties; const AValue1: TcxEditValue;
|
|
ARow2: TcxGridDataRow; AProperties2: TcxCustomEditProperties; const AValue2: TcxEditValue): Boolean;
|
|
procedure FocusWithSelection; override;
|
|
function GroupBy(AGroupIndex: Integer; ACanShow: Boolean = True): Boolean;
|
|
|
|
property GridView: TcxGridTableView read GetGridView;
|
|
property GroupingDateRanges;
|
|
property Hidden; // obsolete, use VisibleForCustomization
|
|
property IsBottom: Boolean read GetIsBottom;
|
|
property IsLeft: Boolean read GetIsLeft;
|
|
property IsMostBottom: Boolean read GetIsMostBottom;
|
|
property IsMostLeft: Boolean read GetIsMostLeft;
|
|
property IsMostRight: Boolean read GetIsMostRight;
|
|
property IsPreview: Boolean read GetIsPreview write SetIsPreview;
|
|
property IsRight: Boolean read GetIsRight;
|
|
property IsTop: Boolean read GetIsTop;
|
|
property Selected: Boolean read FSelected write SetSelected;
|
|
published
|
|
property BestFitMaxWidth;
|
|
property DateTimeGrouping;
|
|
property FooterAlignmentHorz: TAlignment read GetFooterAlignmentHorz write SetFooterAlignmentHorz stored IsFooterAlignmentHorzStored;
|
|
property GroupIndex;
|
|
property GroupSummaryAlignment: TAlignment read GetGroupSummaryAlignment write SetGroupSummaryAlignment stored IsGroupSummaryAlignmentStored;
|
|
property HeaderAlignmentHorz;
|
|
property HeaderAlignmentVert;
|
|
property HeaderGlyph: TBitmap read FHeaderGlyph write SetHeaderGlyph;
|
|
property HeaderGlyphAlignmentHorz: TAlignment read FHeaderGlyphAlignmentHorz write SetHeaderGlyphAlignmentHorz default taLeftJustify;
|
|
property HeaderGlyphAlignmentVert: TcxAlignmentVert read FHeaderGlyphAlignmentVert write SetHeaderGlyphAlignmentVert default vaCenter;
|
|
property MinWidth;
|
|
property Options: TcxGridColumnOptions read GetOptions write SetOptions;
|
|
property SortIndex;
|
|
property SortOrder;
|
|
property Styles: TcxGridColumnStyles read GetStyles write SetStyles;
|
|
property Summary: TcxGridColumnSummary read FSummary write SetSummary;
|
|
property VisibleForCustomization;
|
|
property Width;
|
|
property OnCompareRowValuesForCellMerging: TcxGridColumnCompareRowValuesEvent read FOnCompareRowValuesForCellMerging write SetOnCompareRowValuesForCellMerging;
|
|
property OnCompareValuesForCellMerging: TcxGridColumnCompareValuesEvent read FOnCompareValuesForCellMerging write SetOnCompareValuesForCellMerging;
|
|
property OnCustomDrawFooterCell: TcxGridColumnCustomDrawHeaderEvent read FOnCustomDrawFooterCell write SetOnCustomDrawFooterCell;
|
|
property OnCustomDrawGroupSummaryCell: TcxGridGroupSummaryCellCustomDrawEvent read FOnCustomDrawGroupSummaryCell write SetOnCustomDrawGroupSummaryCell;
|
|
property OnCustomDrawHeader: TcxGridColumnCustomDrawHeaderEvent read FOnCustomDrawHeader write SetOnCustomDrawHeader;
|
|
property OnHeaderClick: TNotifyEvent read FOnHeaderClick write SetOnHeaderClick;
|
|
property OnInitGroupingDateRanges;
|
|
end;
|
|
|
|
// options
|
|
|
|
TcxGridTableBackgroundBitmaps = class(TcxCustomGridTableBackgroundBitmaps)
|
|
protected
|
|
function GetBitmapStyleIndex(Index: Integer): Integer; override;
|
|
public
|
|
procedure Assign(Source: TPersistent); override;
|
|
published
|
|
property Footer: TBitmap index bbFooter read GetValue write SetValue;
|
|
property Header: TBitmap index bbHeader read GetValue write SetValue;
|
|
property Group: TBitmap index bbGroup read GetValue write SetValue;
|
|
property GroupByBox: TBitmap index bbGroupByBox read GetValue write SetValue;
|
|
property Indicator: TBitmap index bbIndicator read GetValue write SetValue;
|
|
property Preview: TBitmap index bbPreview read GetValue write SetValue;
|
|
end;
|
|
|
|
TcxGridTableDateTimeHandling = class(TcxCustomGridTableDateTimeHandling)
|
|
published
|
|
property DateFormat;
|
|
property Grouping;
|
|
property HourFormat;
|
|
property UseLongDateFormat;
|
|
property UseShortTimeFormat;
|
|
end;
|
|
|
|
// behavior
|
|
|
|
TcxGridTableOptionsBehavior = class(TcxCustomGridTableOptionsBehavior)
|
|
private
|
|
FColumnHeaderHints: Boolean;
|
|
FCopyPreviewToClipboard: Boolean;
|
|
FExpandMasterRowOnDblClick: Boolean;
|
|
procedure SetColumnHeaderHints(Value: Boolean);
|
|
procedure SetCopyPreviewToClipboard(Value: Boolean);
|
|
procedure SetExpandMasterRowOnDblClick(Value: Boolean);
|
|
public
|
|
constructor Create(AGridView: TcxCustomGridView); override;
|
|
procedure Assign(Source: TPersistent); override;
|
|
published
|
|
property BestFitMaxRecordCount;
|
|
property ColumnHeaderHints: Boolean read FColumnHeaderHints write SetColumnHeaderHints default True;
|
|
property CopyPreviewToClipboard: Boolean read FCopyPreviewToClipboard write SetCopyPreviewToClipboard default True;
|
|
property ExpandMasterRowOnDblClick: Boolean read FExpandMasterRowOnDblClick write SetExpandMasterRowOnDblClick default True;
|
|
property FocusCellOnCycle;
|
|
property PullFocusing;
|
|
end;
|
|
|
|
// filter
|
|
|
|
TcxGridTableFiltering = class(TcxCustomGridTableFiltering)
|
|
private
|
|
function GetColumnFilteredItemsList: Boolean;
|
|
function GetColumnMRUItemsList: Boolean;
|
|
function GetColumnMRUItemsListCount: Integer;
|
|
function GetColumnPopup: TcxGridItemFilterPopupOptions;
|
|
procedure SetColumnFilteredItemsList(Value: Boolean);
|
|
procedure SetColumnMRUItemsList(Value: Boolean);
|
|
procedure SetColumnMRUItemsListCount(Value: Integer);
|
|
procedure SetColumnPopup(Value: TcxGridItemFilterPopupOptions);
|
|
protected
|
|
procedure DefineProperties(Filer: TFiler); override;
|
|
public
|
|
// obsolete - use ColumnPopup.DropDownWidth
|
|
property ColumnPopupDropDownWidth: Integer read GetItemPopupDropDownWidth write SetItemPopupDropDownWidth;
|
|
property DropDownWidth;
|
|
// obsolete - use ColumnPopup.MaxDropDownItemCount
|
|
property ColumnPopupMaxDropDownItemCount: Integer read GetItemPopupMaxDropDownItemCount write SetItemPopupMaxDropDownItemCount;
|
|
property MaxDropDownCount;
|
|
published
|
|
property ColumnFilteredItemsList: Boolean read GetColumnFilteredItemsList
|
|
write SetColumnFilteredItemsList default False;
|
|
property ColumnMRUItemsList: Boolean read GetColumnMRUItemsList write SetColumnMRUItemsList default True;
|
|
property ColumnMRUItemsListCount: Integer read GetColumnMRUItemsListCount
|
|
write SetColumnMRUItemsListCount default cxGridFilterDefaultItemMRUItemsListCount;
|
|
property ColumnPopup: TcxGridItemFilterPopupOptions read GetColumnPopup write SetColumnPopup;
|
|
end;
|
|
|
|
// customize
|
|
|
|
TcxGridTableOptionsCustomize = class(TcxCustomGridTableOptionsCustomize)
|
|
private
|
|
FColumnHidingOnGrouping: Boolean;
|
|
FColumnHorzSizing: Boolean;
|
|
FDataRowSizing: Boolean;
|
|
FGroupBySorting: Boolean;
|
|
FGroupRowSizing: Boolean;
|
|
function GetColumnFiltering: Boolean;
|
|
function GetColumnGrouping: Boolean;
|
|
function GetColumnHiding: Boolean;
|
|
function GetColumnMoving: Boolean;
|
|
function GetColumnSorting: Boolean;
|
|
function GetColumnsQuickCustomization: Boolean;
|
|
function GetColumnsQuickCustomizationMaxDropDownCount: Integer;
|
|
function GetColumnsQuickCustomizationReordering: TcxGridQuickCustomizationReordering;
|
|
function GetGridView: TcxGridTableView;
|
|
procedure SetColumnFiltering(Value: Boolean);
|
|
procedure SetColumnGrouping(Value: Boolean);
|
|
procedure SetColumnHiding(Value: Boolean);
|
|
procedure SetColumnHidingOnGrouping(Value: Boolean);
|
|
procedure SetColumnHorzSizing(Value: Boolean);
|
|
procedure SetColumnMoving(Value: Boolean);
|
|
procedure SetColumnSorting(Value: Boolean);
|
|
procedure SetColumnsQuickCustomization(Value: Boolean);
|
|
procedure SetColumnsQuickCustomizationMaxDropDownCount(Value: Integer);
|
|
procedure SetColumnsQuickCustomizationReordering(Value: TcxGridQuickCustomizationReordering);
|
|
procedure SetDataRowSizing(Value: Boolean);
|
|
procedure SetGroupBySorting(Value: Boolean);
|
|
procedure SetGroupRowSizing(Value: Boolean);
|
|
public
|
|
constructor Create(AGridView: TcxCustomGridView); override;
|
|
procedure Assign(Source: TPersistent); override;
|
|
property GridView: TcxGridTableView read GetGridView;
|
|
published
|
|
property ColumnFiltering: Boolean read GetColumnFiltering write SetColumnFiltering default True;
|
|
property ColumnGrouping: Boolean read GetColumnGrouping write SetColumnGrouping default True;
|
|
property ColumnHiding: Boolean read GetColumnHiding write SetColumnHiding default False;
|
|
property ColumnHidingOnGrouping: Boolean read FColumnHidingOnGrouping write SetColumnHidingOnGrouping default True;
|
|
property ColumnHorzSizing: Boolean read FColumnHorzSizing write SetColumnHorzSizing default True;
|
|
property ColumnMoving: Boolean read GetColumnMoving write SetColumnMoving default True;
|
|
property ColumnSorting: Boolean read GetColumnSorting write SetColumnSorting default True;
|
|
property ColumnsQuickCustomization: Boolean read GetColumnsQuickCustomization
|
|
write SetColumnsQuickCustomization default False;
|
|
property ColumnsQuickCustomizationMaxDropDownCount: Integer read GetColumnsQuickCustomizationMaxDropDownCount
|
|
write SetColumnsQuickCustomizationMaxDropDownCount default 0;
|
|
property ColumnsQuickCustomizationReordering: TcxGridQuickCustomizationReordering
|
|
read GetColumnsQuickCustomizationReordering write SetColumnsQuickCustomizationReordering default qcrDefault;
|
|
property DataRowSizing: Boolean read FDataRowSizing write SetDataRowSizing default False;
|
|
property GroupBySorting: Boolean read FGroupBySorting write SetGroupBySorting default False;
|
|
property GroupRowSizing: Boolean read FGroupRowSizing write SetGroupRowSizing default False;
|
|
end;
|
|
|
|
// data
|
|
|
|
TcxGridTableOptionsData = class(TcxCustomGridTableOptionsData);
|
|
|
|
// selection
|
|
|
|
TcxGridTableOptionsSelection = class(TcxCustomGridTableOptionsSelection)
|
|
private
|
|
FCellMultiSelect: Boolean;
|
|
procedure SetCellMultiSelect(Value: Boolean);
|
|
function IsCellSelectStored: Boolean;
|
|
protected
|
|
function IsInvertSelectStored: Boolean; override;
|
|
function IsMultiSelectStored: Boolean; override;
|
|
procedure SetCellSelect(Value: Boolean); override;
|
|
procedure SetInvertSelect(Value: Boolean); override;
|
|
procedure SetMultiSelect(Value: Boolean); override;
|
|
public
|
|
procedure Assign(Source: TPersistent); override;
|
|
published
|
|
property CellMultiSelect: Boolean read FCellMultiSelect write SetCellMultiSelect default False;
|
|
property CellSelect stored IsCellSelectStored;
|
|
end;
|
|
|
|
// view
|
|
|
|
TcxGridSpecialRowOptions = class(TcxCustomGridOptions)
|
|
private
|
|
FInfoText: string;
|
|
FSeparatorColor: TColor;
|
|
FSeparatorWidth: Integer;
|
|
FVisible: Boolean;
|
|
function GetGridView: TcxGridTableView;
|
|
procedure SetInfoText(const Value: string);
|
|
procedure SetSeparatorColor(Value: TColor);
|
|
procedure SetSeparatorWidth(Value: Integer);
|
|
procedure SetVisible(Value: Boolean);
|
|
function IsInfoTextStored: Boolean;
|
|
protected
|
|
function DefaultInfoText: string; virtual; abstract;
|
|
function DefaultSeparatorColor: TColor; virtual;
|
|
procedure VisibleChanged; virtual; abstract;
|
|
public
|
|
constructor Create(AGridView: TcxCustomGridView); override;
|
|
procedure Assign(Source: TPersistent); override;
|
|
function GetSeparatorColor: TColor;
|
|
property GridView: TcxGridTableView read GetGridView;
|
|
published
|
|
property InfoText: string read FInfoText write SetInfoText stored IsInfoTextStored;
|
|
property SeparatorColor: TColor read FSeparatorColor write SetSeparatorColor default clDefault;
|
|
property SeparatorWidth: Integer read FSeparatorWidth write SetSeparatorWidth default cxGridCustomRowSeparatorDefaultWidth;
|
|
property Visible: Boolean read FVisible write SetVisible default False;
|
|
end;
|
|
|
|
TcxGridFilterRowApplyChangesMode = (fracOnCellExit, fracImmediately);
|
|
|
|
TcxGridFilterRowOptionsClass = class of TcxGridFilterRowOptions;
|
|
|
|
TcxGridFilterRowOptions = class(TcxGridSpecialRowOptions)
|
|
private
|
|
FApplyChanges: TcxGridFilterRowApplyChangesMode;
|
|
procedure SetApplyChanges(Value: TcxGridFilterRowApplyChangesMode);
|
|
protected
|
|
function DefaultInfoText: string; override;
|
|
procedure VisibleChanged; override;
|
|
public
|
|
procedure Assign(Source: TPersistent); override;
|
|
published
|
|
property ApplyChanges: TcxGridFilterRowApplyChangesMode read FApplyChanges
|
|
write SetApplyChanges default fracOnCellExit;
|
|
end;
|
|
|
|
TcxGridNewItemRowOptionsClass = class of TcxGridNewItemRowOptions;
|
|
|
|
TcxGridNewItemRowOptions = class(TcxGridSpecialRowOptions)
|
|
protected
|
|
function DefaultInfoText: string; override;
|
|
procedure VisibleChanged; override;
|
|
end;
|
|
|
|
TcxGridGroupFootersMode = (gfInvisible, gfVisibleWhenExpanded, gfAlwaysVisible);
|
|
TcxGridGroupRowStyle = (grsStandard, grsOffice11);
|
|
TcxGridGroupSummaryLayout = (gslStandard, gslAlignWithColumns,
|
|
gslAlignWithColumnsAndDistribute);
|
|
|
|
TcxGridTableOptionsView = class(TcxCustomGridTableOptionsView)
|
|
private
|
|
FColumnAutoWidth: Boolean;
|
|
FDataRowHeight: Integer;
|
|
FExpandButtonsForEmptyDetails: Boolean;
|
|
FFooter: Boolean;
|
|
FFooterAutoHeight: Boolean;
|
|
FFooterMultiSummaries: Boolean;
|
|
FGridLineColor: TColor;
|
|
FGridLines: TcxGridLines;
|
|
FGroupByBox: Boolean;
|
|
FGroupFooterMultiSummaries: Boolean;
|
|
FGroupFooters: TcxGridGroupFootersMode;
|
|
FGroupRowHeight: Integer;
|
|
FGroupRowStyle: TcxGridGroupRowStyle;
|
|
FGroupSummaryLayout: TcxGridGroupSummaryLayout;
|
|
FHeader: Boolean;
|
|
FHeaderHeight: Integer;
|
|
FIndicator: Boolean;
|
|
FIndicatorWidth: Integer;
|
|
FPrevGroupFooters: TcxGridGroupFootersMode;
|
|
FRowSeparatorColor: TColor;
|
|
FRowSeparatorWidth: Integer;
|
|
function GetExpandButtonsForEmptyDetails: Boolean;
|
|
function GetGridView: TcxGridTableView;
|
|
function GetHeaderAutoHeight: Boolean;
|
|
function GetHeaderEndEllipsis: Boolean;
|
|
function GetNewItemRow: Boolean;
|
|
function GetNewItemRowInfoText: string;
|
|
function GetNewItemRowSeparatorColor: TColor;
|
|
function GetNewItemRowSeparatorWidth: Integer;
|
|
function GetShowColumnFilterButtons: TcxGridShowItemFilterButtons;
|
|
procedure SetColumnAutoWidth(Value: Boolean);
|
|
procedure SetDataRowHeight(Value: Integer);
|
|
procedure SetExpandButtonsForEmptyDetails(Value: Boolean);
|
|
procedure SetFooter(Value: Boolean);
|
|
procedure SetFooterAutoHeight(Value: Boolean);
|
|
procedure SetFooterMultiSummaries(Value: Boolean);
|
|
procedure SetGridLineColor(Value: TColor);
|
|
procedure SetGridLines(Value: TcxGridLines);
|
|
procedure SetGroupByBox(Value: Boolean);
|
|
procedure SetGroupFooterMultiSummaries(Value: Boolean);
|
|
procedure SetGroupFooters(Value: TcxGridGroupFootersMode);
|
|
procedure SetGroupRowHeight(Value: Integer);
|
|
procedure SetGroupRowStyle(Value: TcxGridGroupRowStyle);
|
|
procedure SetGroupSummaryLayout(Value: TcxGridGroupSummaryLayout);
|
|
procedure SetHeader(Value: Boolean);
|
|
procedure SetHeaderAutoHeight(Value: Boolean);
|
|
procedure SetHeaderEndEllipsis(Value: Boolean);
|
|
procedure SetHeaderHeight(Value: Integer);
|
|
procedure SetIndicator(Value: Boolean);
|
|
procedure SetIndicatorWidth(Value: Integer);
|
|
procedure SetNewItemRow(Value: Boolean);
|
|
procedure SetNewItemRowInfoText(const Value: string);
|
|
procedure SetNewItemRowSeparatorColor(Value: TColor);
|
|
procedure SetNewItemRowSeparatorWidth(Value: Integer);
|
|
procedure SetRowSeparatorColor(Value: TColor);
|
|
procedure SetRowSeparatorWidth(Value: Integer);
|
|
procedure SetShowColumnFilterButtons(Value: TcxGridShowItemFilterButtons);
|
|
procedure ReadNewItemRow(Reader: TReader);
|
|
procedure ReadNewItemRowInfoText(Reader: TReader);
|
|
procedure ReadNewItemRowSeparatorColor(Reader: TReader);
|
|
procedure ReadNewItemRowSeparatorWidth(Reader: TReader);
|
|
protected
|
|
procedure DefineProperties(Filer: TFiler); override;
|
|
procedure ItemCaptionAutoHeightChanged; override;
|
|
public
|
|
constructor Create(AGridView: TcxCustomGridView); override;
|
|
procedure Assign(Source: TPersistent); override;
|
|
function CanShowFooterMultiSummaries: Boolean;
|
|
function CanShowGroupFooterMultiSummaries: Boolean;
|
|
procedure CheckDataRowHeight(var AValue: Integer); virtual;
|
|
procedure CheckGroupRowHeight(var AValue: Integer); virtual;
|
|
function GetGridLineColor: TColor;
|
|
function GetGroupSummaryLayout: TcxGridGroupSummaryLayout;
|
|
function GetRowSeparatorColor: TColor;
|
|
|
|
property GridView: TcxGridTableView read GetGridView;
|
|
// obsolete - use GridView.NewItemRow
|
|
property NewItemRow: Boolean read GetNewItemRow write SetNewItemRow;
|
|
property NewItemRowInfoText: string read GetNewItemRowInfoText write SetNewItemRowInfoText;
|
|
property NewItemRowSeparatorColor: TColor read GetNewItemRowSeparatorColor write SetNewItemRowSeparatorColor;
|
|
property NewItemRowSeparatorWidth: Integer read GetNewItemRowSeparatorWidth write SetNewItemRowSeparatorWidth;
|
|
property PrevGroupFooters: TcxGridGroupFootersMode read FPrevGroupFooters;
|
|
published
|
|
property CellAutoHeight;
|
|
property CellTextMaxLineCount;
|
|
property ColumnAutoWidth: Boolean read FColumnAutoWidth write SetColumnAutoWidth default False;
|
|
property DataRowHeight: Integer read FDataRowHeight write SetDataRowHeight default 0;
|
|
property ExpandButtonsForEmptyDetails: Boolean read GetExpandButtonsForEmptyDetails
|
|
write SetExpandButtonsForEmptyDetails default True;
|
|
property Footer: Boolean read FFooter write SetFooter default False;
|
|
property FooterAutoHeight: Boolean read FFooterAutoHeight write SetFooterAutoHeight default False;
|
|
property FooterMultiSummaries: Boolean read FFooterMultiSummaries write SetFooterMultiSummaries default False;
|
|
property GridLineColor: TColor read FGridLineColor write SetGridLineColor default clDefault;
|
|
property GridLines: TcxGridLines read FGridLines write SetGridLines default glBoth;
|
|
property GroupByBox: Boolean read FGroupByBox write SetGroupByBox default True;
|
|
property GroupFooterMultiSummaries: Boolean read FGroupFooterMultiSummaries write SetGroupFooterMultiSummaries default False;
|
|
property GroupFooters: TcxGridGroupFootersMode read FGroupFooters write SetGroupFooters default gfInvisible;
|
|
property GroupRowHeight: Integer read FGroupRowHeight write SetGroupRowHeight default 0;
|
|
property GroupRowStyle: TcxGridGroupRowStyle read FGroupRowStyle write SetGroupRowStyle default grsStandard;
|
|
property GroupSummaryLayout: TcxGridGroupSummaryLayout read FGroupSummaryLayout
|
|
write SetGroupSummaryLayout default gslStandard;
|
|
property Header: Boolean read FHeader write SetHeader default True;
|
|
property HeaderAutoHeight: Boolean read GetHeaderAutoHeight write SetHeaderAutoHeight default False;
|
|
property HeaderEndEllipsis: Boolean read GetHeaderEndEllipsis write SetHeaderEndEllipsis default False;
|
|
property HeaderHeight: Integer read FHeaderHeight write SetHeaderHeight default 0;
|
|
property Indicator: Boolean read FIndicator write SetIndicator default False;
|
|
property IndicatorWidth: Integer read FIndicatorWidth write SetIndicatorWidth default cxGridDefaultIndicatorWidth;
|
|
property RowSeparatorColor: TColor read FRowSeparatorColor write SetRowSeparatorColor default clDefault;
|
|
property RowSeparatorWidth: Integer read FRowSeparatorWidth write SetRowSeparatorWidth default 0;
|
|
property ShowColumnFilterButtons: TcxGridShowItemFilterButtons read GetShowColumnFilterButtons
|
|
write SetShowColumnFilterButtons default sfbWhenSelected;
|
|
end;
|
|
|
|
// preview
|
|
|
|
TcxGridPreviewPlace = (ppBottom, ppTop);
|
|
|
|
TcxGridPreviewClass = class of TcxGridPreview;
|
|
|
|
TcxGridPreview = class(TcxCustomGridOptions)
|
|
private
|
|
FAutoHeight: Boolean;
|
|
FColumn: TcxGridColumn;
|
|
FLeftIndent: Integer;
|
|
FMaxLineCount: Integer;
|
|
FPlace: TcxGridPreviewPlace;
|
|
FRightIndent: Integer;
|
|
FVisible: Boolean;
|
|
function GetActive: Boolean;
|
|
function GetGridView: TcxGridTableView;
|
|
procedure SetAutoHeight(Value: Boolean);
|
|
procedure SetColumn(Value: TcxGridColumn);
|
|
procedure SetLeftIndent(Value: Integer);
|
|
procedure SetMaxLineCount(Value: Integer);
|
|
procedure SetPlace(Value: TcxGridPreviewPlace);
|
|
procedure SetRightIndent(Value: Integer);
|
|
procedure SetVisible(Value: Boolean);
|
|
protected
|
|
procedure Notification(AComponent: TComponent; AOperation: TOperation); override;
|
|
procedure PropertyChanged;
|
|
public
|
|
constructor Create(AGridView: TcxCustomGridView); override;
|
|
procedure Assign(Source: TPersistent); override;
|
|
property Active: Boolean read GetActive;
|
|
property GridView: TcxGridTableView read GetGridView;
|
|
published
|
|
property AutoHeight: Boolean read FAutoHeight write SetAutoHeight default True;
|
|
property Column: TcxGridColumn read FColumn write SetColumn;
|
|
property LeftIndent: Integer read FLeftIndent write SetLeftIndent
|
|
default cxGridPreviewDefaultLeftIndent;
|
|
property MaxLineCount: Integer read FMaxLineCount write SetMaxLineCount
|
|
default cxGridPreviewDefaultMaxLineCount;
|
|
property Place: TcxGridPreviewPlace read FPlace write SetPlace default ppBottom;
|
|
property RightIndent: Integer read FRightIndent write SetRightIndent
|
|
default cxGridPreviewDefaultRightIndent;
|
|
property Visible: Boolean read FVisible write SetVisible default False;
|
|
end;
|
|
|
|
// styles
|
|
|
|
TcxGridGetGroupStyleEvent = procedure(Sender: TcxGridTableView; ARecord: TcxCustomGridRecord;
|
|
ALevel: Integer; {$IFDEF BCB}var{$ELSE}out{$ENDIF} AStyle: TcxStyle) of object;
|
|
|
|
TcxGridTableViewStyles = class(TcxCustomGridTableViewStyles)
|
|
private
|
|
FProcessingGroupSortedSummary: Boolean;
|
|
FOnGetFooterStyle: TcxGridGetCellStyleEvent;
|
|
FOnGetFooterStyleEx: TcxGridGetFooterStyleExEvent;
|
|
FOnGetFooterSummaryStyle: TcxGridGetFooterSummaryStyleEvent;
|
|
FOnGetGroupStyle: TcxGridGetGroupStyleEvent;
|
|
FOnGetGroupSummaryStyle: TcxGridGetGroupSummaryStyleEvent;
|
|
FOnGetHeaderStyle: TcxGridGetHeaderStyleEvent;
|
|
FOnGetPreviewStyle: TcxGridGetCellStyleEvent;
|
|
function GetGridViewValue: TcxGridTableView;
|
|
procedure SetOnGetFooterStyle(Value: TcxGridGetCellStyleEvent);
|
|
procedure SetOnGetFooterStyleEx(Value: TcxGridGetFooterStyleExEvent);
|
|
procedure SetOnGetFooterSummaryStyle(Value: TcxGridGetFooterSummaryStyleEvent);
|
|
procedure SetOnGetGroupStyle(Value: TcxGridGetGroupStyleEvent);
|
|
procedure SetOnGetGroupSummaryStyle(Value: TcxGridGetGroupSummaryStyleEvent);
|
|
procedure SetOnGetHeaderStyle(Value: TcxGridGetHeaderStyleEvent);
|
|
procedure SetOnGetPreviewStyle(Value: TcxGridGetCellStyleEvent);
|
|
protected
|
|
procedure GetDefaultViewParams(Index: Integer; AData: TObject; out AParams: TcxViewParams); override;
|
|
public
|
|
procedure Assign(Source: TPersistent); override;
|
|
procedure GetCellContentParams(ARecord: TcxCustomGridRecord; AItem: TObject;
|
|
out AParams: TcxViewParams); override;
|
|
procedure GetContentParams(ARecord: TcxCustomGridRecord; AItem: TcxCustomGridTableItem;
|
|
out AParams: TcxViewParams); override;
|
|
procedure GetFooterCellParams(ARow: TcxCustomGridRow; AColumn: TcxGridColumn;
|
|
AFooterGroupLevel: Integer; ASummaryItem: TcxDataSummaryItem; out AParams: TcxViewParams); virtual;
|
|
procedure GetFooterParams(ARow: TcxCustomGridRow; AColumn: TcxGridColumn;
|
|
AFooterGroupLevel: Integer; ASummaryItem: TcxDataSummaryItem; out AParams: TcxViewParams); virtual;
|
|
procedure GetGroupParams(ARecord: TcxCustomGridRecord; ALevel: Integer;
|
|
out AParams: TcxViewParams); virtual;
|
|
procedure GetGroupSummaryCellContentParams(ARow: TcxGridGroupRow;
|
|
ASummaryItem: TcxDataSummaryItem; out AParams: TcxViewParams); virtual;
|
|
procedure GetGroupSummaryCellParams(ARow: TcxGridGroupRow;
|
|
ASummaryItem: TcxDataSummaryItem; out AParams: TcxViewParams); virtual;
|
|
procedure GetGroupSummaryParams(ARow: TcxGridGroupRow; ASummaryItem: TcxDataSummaryItem;
|
|
out AParams: TcxViewParams); virtual;
|
|
procedure GetHeaderParams(AItem: TcxGridColumn; out AParams: TcxViewParams); virtual;
|
|
procedure GetPreviewParams(ARecord: TcxCustomGridRecord; AItem: TcxCustomGridTableItem;
|
|
out AParams: TcxViewParams); virtual;
|
|
procedure GetRecordContentParams(ARecord: TcxCustomGridRecord; AItem: TcxCustomGridTableItem;
|
|
out AParams: TcxViewParams); override;
|
|
property GridView: TcxGridTableView read GetGridViewValue;
|
|
published
|
|
property FilterRowInfoText: TcxStyle index vsFilterRowInfoText read GetValue write SetValue;
|
|
property Footer: TcxStyle index vsFooter read GetValue write SetValue;
|
|
property Group: TcxStyle index vsGroup read GetValue write SetValue;
|
|
property GroupByBox: TcxStyle index vsGroupByBox read GetValue write SetValue;
|
|
property GroupFooterSortedSummary: TcxStyle index vsGroupFooterSortedSummary read GetValue write SetValue;
|
|
property GroupSortedSummary: TcxStyle index vsGroupSortedSummary read GetValue write SetValue;
|
|
property GroupSummary: TcxStyle index vsGroupSummary read GetValue write SetValue;
|
|
property Header: TcxStyle index vsHeader read GetValue write SetValue;
|
|
property Indicator: TcxStyle index vsIndicator read GetValue write SetValue;
|
|
property NewItemRowInfoText: TcxStyle index vsNewItemRowInfoText read GetValue write SetValue;
|
|
property Preview: TcxStyle index vsPreview read GetValue write SetValue;
|
|
property StyleSheet;
|
|
property OnGetFooterStyle: TcxGridGetCellStyleEvent read FOnGetFooterStyle write SetOnGetFooterStyle;
|
|
property OnGetFooterStyleEx: TcxGridGetFooterStyleExEvent read FOnGetFooterStyleEx write SetOnGetFooterStyleEx;
|
|
property OnGetFooterSummaryStyle: TcxGridGetFooterSummaryStyleEvent read FOnGetFooterSummaryStyle write SetOnGetFooterSummaryStyle;
|
|
property OnGetGroupStyle: TcxGridGetGroupStyleEvent read FOnGetGroupStyle write SetOnGetGroupStyle;
|
|
property OnGetGroupSummaryStyle: TcxGridGetGroupSummaryStyleEvent read FOnGetGroupSummaryStyle write SetOnGetGroupSummaryStyle;
|
|
property OnGetHeaderStyle: TcxGridGetHeaderStyleEvent read FOnGetHeaderStyle write SetOnGetHeaderStyle;
|
|
property OnGetPreviewStyle: TcxGridGetCellStyleEvent read FOnGetPreviewStyle write SetOnGetPreviewStyle;
|
|
end;
|
|
|
|
TcxGridTableViewStyleSheet = class(TcxCustomStyleSheet)
|
|
private
|
|
function GetStylesValue: TcxGridTableViewStyles;
|
|
procedure SetStylesValue(Value: TcxGridTableViewStyles);
|
|
public
|
|
class function GetStylesClass: TcxCustomStylesClass; override;
|
|
published
|
|
property Styles: TcxGridTableViewStyles read GetStylesValue write SetStylesValue;
|
|
end;
|
|
|
|
// grid view
|
|
|
|
TcxGridTableSummaryGroupItemLink = class(TcxDataSummaryGroupItemLink,
|
|
{$IFNDEF DELPHI6}IUnknown,{$ENDIF} IcxStoredObject)
|
|
private
|
|
function GetColumn: TcxGridColumn;
|
|
procedure SetColumn(Value: TcxGridColumn);
|
|
function GetGridView: TcxGridTableView;
|
|
protected
|
|
// IInterface
|
|
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
|
|
function _AddRef: Integer; stdcall;
|
|
function _Release: Integer; stdcall;
|
|
// IcxStoredObject
|
|
function GetObjectName: string;
|
|
function GetProperties(AProperties: TStrings): Boolean;
|
|
procedure GetPropertyValue(const AName: string; var AValue: Variant);
|
|
procedure SetPropertyValue(const AName: string; const AValue: Variant);
|
|
property GridView: TcxGridTableView read GetGridView;
|
|
published
|
|
property Column: TcxGridColumn read GetColumn write SetColumn;
|
|
end;
|
|
|
|
IcxGridSummaryItem = interface
|
|
['{6F9A0C3E-E33F-4E77-9357-82F1D19CDB67}']
|
|
function GetDisplayText: string;
|
|
function GetVisibleForCustomization: Boolean;
|
|
property DisplayText: string read GetDisplayText;
|
|
property VisibleForCustomization: Boolean read GetVisibleForCustomization;
|
|
end;
|
|
|
|
TcxGridTableSummaryItem = class(TcxDataSummaryItem,
|
|
{$IFNDEF DELPHI6}IUnknown,{$ENDIF} IcxStoredObject, IcxGridSummaryItem)
|
|
private
|
|
FDisplayText: string;
|
|
FVisibleForCustomization: Boolean;
|
|
function GetColumn: TcxGridColumn;
|
|
function GetGridView: TcxGridTableView;
|
|
procedure SetColumn(Value: TcxGridColumn);
|
|
procedure SetDisplayText(const Value: string);
|
|
procedure SetVisibleForCustomization(Value: Boolean);
|
|
protected
|
|
// IInterface
|
|
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
|
|
function _AddRef: Integer; stdcall;
|
|
function _Release: Integer; stdcall;
|
|
// IcxStoredObject
|
|
function GetObjectName: string;
|
|
function GetProperties(AProperties: TStrings): Boolean;
|
|
procedure GetPropertyValue(const AName: string; var AValue: Variant);
|
|
procedure SetPropertyValue(const AName: string; const AValue: Variant);
|
|
// IcxGridSummaryItem
|
|
function GetDisplayText: string;
|
|
function GetVisibleForCustomization: Boolean;
|
|
|
|
property GridView: TcxGridTableView read GetGridView;
|
|
public
|
|
constructor Create(Collection: TCollection); override;
|
|
procedure Assign(Source: TPersistent); override;
|
|
published
|
|
property Column: TcxGridColumn read GetColumn write SetColumn;
|
|
property DisplayText: string read FDisplayText write SetDisplayText;
|
|
property Sorted;
|
|
property VisibleForCustomization: Boolean read FVisibleForCustomization
|
|
write SetVisibleForCustomization default True;
|
|
end;
|
|
|
|
TcxGridColumnEvent = procedure(Sender: TcxGridTableView; AColumn: TcxGridColumn) of object;
|
|
TcxGridIndicatorCellCustomDrawEvent = procedure(Sender: TcxGridTableView;
|
|
ACanvas: TcxCanvas; AViewInfo: TcxCustomGridIndicatorItemViewInfo; var ADone: Boolean) of object;
|
|
|
|
TcxGridTableView = class(TcxCustomGridTableView)
|
|
private
|
|
FFilterRow: TcxGridFilterRowOptions;
|
|
FNewItemRow: TcxGridNewItemRowOptions;
|
|
FPreview: TcxGridPreview;
|
|
FOnColumnHeaderClick: TcxGridColumnEvent;
|
|
FOnColumnPosChanged: TcxGridColumnEvent;
|
|
FOnColumnSizeChanged: TcxGridColumnEvent;
|
|
FOnCustomDrawColumnHeader: TcxGridColumnCustomDrawHeaderEvent;
|
|
FOnCustomDrawFooterCell: TcxGridColumnCustomDrawHeaderEvent;
|
|
FOnCustomDrawGroupCell: TcxGridTableCellCustomDrawEvent;
|
|
FOnCustomDrawGroupSummaryCell: TcxGridGroupSummaryCellCustomDrawEvent;
|
|
FOnCustomDrawIndicatorCell: TcxGridIndicatorCellCustomDrawEvent;
|
|
FOnLeftPosChanged: TNotifyEvent;
|
|
|
|
function GetBackgroundBitmaps: TcxGridTableBackgroundBitmaps;
|
|
function GetColumn(Index: Integer): TcxGridColumn;
|
|
function GetColumnCount: Integer;
|
|
function GetController: TcxGridTableController;
|
|
function GetDataController: TcxGridDataController;
|
|
function GetDateTimeHandling: TcxGridTableDateTimeHandling;
|
|
function GetFiltering: TcxGridTableFiltering;
|
|
function GetGroupedColumn(Index: Integer): TcxGridColumn;
|
|
function GetGroupedColumnCount: Integer;
|
|
function GetOptionsBehavior: TcxGridTableOptionsBehavior;
|
|
function GetOptionsCustomize: TcxGridTableOptionsCustomize;
|
|
function GetOptionsData: TcxGridTableOptionsData;
|
|
function GetOptionsSelection: TcxGridTableOptionsSelection;
|
|
function GetOptionsView: TcxGridTableOptionsView;
|
|
function GetPainter: TcxGridTablePainter;
|
|
function GetStyles: TcxGridTableViewStyles;
|
|
function GetViewData: TcxGridViewData;
|
|
function GetViewInfo: TcxGridTableViewInfo;
|
|
function GetVisibleColumn(Index: Integer): TcxGridColumn;
|
|
function GetVisibleColumnCount: Integer;
|
|
procedure SetBackgroundBitmaps(Value: TcxGridTableBackgroundBitmaps);
|
|
procedure SetColumn(Index: Integer; Value: TcxGridColumn);
|
|
procedure SetDataController(Value: TcxGridDataController);
|
|
procedure SetDateTimeHandling(Value: TcxGridTableDateTimeHandling);
|
|
procedure SetFiltering(Value: TcxGridTableFiltering);
|
|
procedure SetFilterRow(Value: TcxGridFilterRowOptions);
|
|
procedure SetNewItemRow(Value: TcxGridNewItemRowOptions);
|
|
procedure SetOnColumnHeaderClick(Value: TcxGridColumnEvent);
|
|
procedure SetOnColumnPosChanged(Value: TcxGridColumnEvent);
|
|
procedure SetOnColumnSizeChanged(Value: TcxGridColumnEvent);
|
|
procedure SetOnCustomDrawColumnHeader(Value: TcxGridColumnCustomDrawHeaderEvent);
|
|
procedure SetOnCustomDrawFooterCell(Value: TcxGridColumnCustomDrawHeaderEvent);
|
|
procedure SetOnCustomDrawGroupCell(Value: TcxGridTableCellCustomDrawEvent);
|
|
procedure SetOnCustomDrawGroupSummaryCell(Value: TcxGridGroupSummaryCellCustomDrawEvent);
|
|
procedure SetOnCustomDrawIndicatorCell(Value: TcxGridIndicatorCellCustomDrawEvent);
|
|
procedure SetOnLeftPosChanged(Value: TNotifyEvent);
|
|
procedure SetOptionsBehavior(Value: TcxGridTableOptionsBehavior);
|
|
procedure SetOptionsCustomize(Value: TcxGridTableOptionsCustomize);
|
|
procedure SetOptionsData(Value: TcxGridTableOptionsData);
|
|
procedure SetOptionsSelection(Value: TcxGridTableOptionsSelection);
|
|
procedure SetOptionsView(Value: TcxGridTableOptionsView);
|
|
procedure SetPreview(Value: TcxGridPreview);
|
|
procedure SetStyles(Value: TcxGridTableViewStyles);
|
|
|
|
protected
|
|
// IcxStoredObject
|
|
function GetProperties(AProperties: TStrings): Boolean; override;
|
|
procedure GetPropertyValue(const AName: string; var AValue: Variant); override;
|
|
procedure SetPropertyValue(const AName: string; const AValue: Variant); override;
|
|
// IcxGridViewLayoutEditorSupport - for design-time layout editor
|
|
procedure AssignLayout(ALayoutView: TcxCustomGridView); override;
|
|
function GetLayoutCustomizationFormButtonCaption: string; override;
|
|
|
|
procedure CreateOptions; override;
|
|
procedure DestroyOptions; override;
|
|
|
|
function CanCellMerging: Boolean; virtual;
|
|
function CanOffset(ARecordCountDelta: Integer): Boolean; override;
|
|
function CanOffsetHorz: Boolean; virtual;
|
|
procedure DetailDataChanged(ADetail: TcxCustomGridView); override;
|
|
procedure DoAssign(ASource: TcxCustomGridView); override;
|
|
procedure GetItemsListForClipboard(AItems: TList; ACopyAll: Boolean); override;
|
|
function GetResizeOnBoundsChange: Boolean; override;
|
|
function HasCellMerging: Boolean;
|
|
function IsEqualHeightRecords: Boolean; override;
|
|
function IsRecordHeightDependsOnData: Boolean; override;
|
|
function UpdateOnDetailDataChange(ADetail: TcxCustomGridView): Boolean; virtual;
|
|
|
|
function GetControllerClass: TcxCustomGridControllerClass; override;
|
|
function GetDataControllerClass: TcxCustomDataControllerClass; override;
|
|
function GetPainterClass: TcxCustomGridPainterClass; override;
|
|
function GetViewDataClass: TcxCustomGridViewDataClass; override;
|
|
function GetViewInfoClass: TcxCustomGridViewInfoClass; override;
|
|
|
|
function GetBackgroundBitmapsClass: TcxCustomGridBackgroundBitmapsClass; override;
|
|
function GetDateTimeHandlingClass: TcxCustomGridTableDateTimeHandlingClass; override;
|
|
function GetFilteringClass: TcxCustomGridTableFilteringClass; override;
|
|
function GetFilterRowOptionsClass: TcxGridFilterRowOptionsClass; virtual;
|
|
function GetNewItemRowOptionsClass: TcxGridNewItemRowOptionsClass; virtual;
|
|
function GetOptionsBehaviorClass: TcxCustomGridOptionsBehaviorClass; override;
|
|
function GetOptionsCustomizeClass: TcxCustomGridTableOptionsCustomizeClass; override;
|
|
function GetOptionsDataClass: TcxCustomGridOptionsDataClass; override;
|
|
function GetOptionsSelectionClass: TcxCustomGridOptionsSelectionClass; override;
|
|
function GetOptionsViewClass: TcxCustomGridOptionsViewClass; override;
|
|
function GetPreviewClass: TcxGridPreviewClass; virtual;
|
|
function GetStylesClass: TcxCustomGridViewStylesClass; override;
|
|
|
|
function GetSummaryGroupItemLinkClass: TcxDataSummaryGroupItemLinkClass; override;
|
|
function GetSummaryItemClass: TcxDataSummaryItemClass; override;
|
|
|
|
function GetItemClass: TcxCustomGridTableItemClass; override;
|
|
procedure ItemVisibilityChanged(AItem: TcxCustomGridTableItem; Value: Boolean); override;
|
|
|
|
function CalculateDataCellSelected(ARecord: TcxCustomGridRecord;
|
|
AItem: TcxCustomGridTableItem; AUseViewInfo: Boolean;
|
|
ACellViewInfo: TcxGridTableCellViewInfo): Boolean; override;
|
|
|
|
procedure DoColumnHeaderClick(AColumn: TcxGridColumn); virtual;
|
|
procedure DoColumnPosChanged(AColumn: TcxGridColumn); virtual;
|
|
procedure DoColumnSizeChanged(AColumn: TcxGridColumn); virtual;
|
|
procedure DoCustomDrawColumnHeader(ACanvas: TcxCanvas; AViewInfo: TcxGridColumnHeaderViewInfo;
|
|
var ADone: Boolean); virtual;
|
|
procedure DoCustomDrawFooterCell(ACanvas: TcxCanvas; AViewInfo: TcxGridColumnHeaderViewInfo;
|
|
var ADone: Boolean); virtual;
|
|
procedure DoCustomDrawGroupCell(ACanvas: TcxCanvas; AViewInfo: TcxGridTableCellViewInfo;
|
|
var ADone: Boolean); virtual;
|
|
procedure DoCustomDrawGroupSummaryCell(ACanvas: TcxCanvas; AViewInfo: TcxCustomGridViewCellViewInfo;
|
|
var ADone: Boolean); virtual;
|
|
procedure DoCustomDrawIndicatorCell(ACanvas: TcxCanvas; AViewInfo: TcxCustomGridIndicatorItemViewInfo;
|
|
var ADone: Boolean); virtual;
|
|
procedure DoLeftPosChanged; virtual;
|
|
function HasCustomDrawColumnHeader: Boolean;
|
|
function HasCustomDrawFooterCell: Boolean;
|
|
function HasCustomDrawGroupCell: Boolean;
|
|
function HasCustomDrawGroupSummaryCell: Boolean;
|
|
function HasCustomDrawIndicatorCell: Boolean;
|
|
public
|
|
function CreateColumn: TcxGridColumn;
|
|
|
|
// for extended lookup edit
|
|
class function CanBeLookupList: Boolean; override;
|
|
|
|
property ColumnCount: Integer read GetColumnCount;
|
|
property Columns[Index: Integer]: TcxGridColumn read GetColumn write SetColumn;
|
|
property Controller: TcxGridTableController read GetController;
|
|
property GroupedColumnCount: Integer read GetGroupedColumnCount;
|
|
property GroupedColumns[Index: Integer]: TcxGridColumn read GetGroupedColumn;
|
|
property Painter: TcxGridTablePainter read GetPainter;
|
|
property ViewData: TcxGridViewData read GetViewData;
|
|
property ViewInfo: TcxGridTableViewInfo read GetViewInfo;
|
|
property VisibleColumnCount: Integer read GetVisibleColumnCount;
|
|
property VisibleColumns[Index: Integer]: TcxGridColumn read GetVisibleColumn;
|
|
published
|
|
property BackgroundBitmaps: TcxGridTableBackgroundBitmaps read GetBackgroundBitmaps write SetBackgroundBitmaps;
|
|
property DataController: TcxGridDataController read GetDataController write SetDataController;
|
|
property DateTimeHandling: TcxGridTableDateTimeHandling read GetDateTimeHandling write SetDateTimeHandling;
|
|
property Filtering: TcxGridTableFiltering read GetFiltering write SetFiltering;
|
|
property FilterRow: TcxGridFilterRowOptions read FFilterRow write SetFilterRow;
|
|
property NewItemRow: TcxGridNewItemRowOptions read FNewItemRow write SetNewItemRow;
|
|
property OptionsBehavior: TcxGridTableOptionsBehavior read GetOptionsBehavior write SetOptionsBehavior;
|
|
property OptionsCustomize: TcxGridTableOptionsCustomize read GetOptionsCustomize write SetOptionsCustomize;
|
|
property OptionsData: TcxGridTableOptionsData read GetOptionsData write SetOptionsData;
|
|
property OptionsSelection: TcxGridTableOptionsSelection read GetOptionsSelection write SetOptionsSelection;
|
|
property OptionsView: TcxGridTableOptionsView read GetOptionsView write SetOptionsView;
|
|
property Preview: TcxGridPreview read FPreview write SetPreview;
|
|
property Styles: TcxGridTableViewStyles read GetStyles write SetStyles ;
|
|
|
|
property OnColumnHeaderClick: TcxGridColumnEvent read FOnColumnHeaderClick write SetOnColumnHeaderClick;
|
|
property OnColumnPosChanged: TcxGridColumnEvent read FOnColumnPosChanged write SetOnColumnPosChanged;
|
|
property OnColumnSizeChanged: TcxGridColumnEvent read FOnColumnSizeChanged write SetOnColumnSizeChanged;
|
|
property OnCustomDrawColumnHeader: TcxGridColumnCustomDrawHeaderEvent read FOnCustomDrawColumnHeader write SetOnCustomDrawColumnHeader;
|
|
property OnCustomDrawFooterCell: TcxGridColumnCustomDrawHeaderEvent read FOnCustomDrawFooterCell write SetOnCustomDrawFooterCell;
|
|
property OnCustomDrawGroupCell: TcxGridTableCellCustomDrawEvent read FOnCustomDrawGroupCell write SetOnCustomDrawGroupCell;
|
|
property OnCustomDrawGroupSummaryCell: TcxGridGroupSummaryCellCustomDrawEvent read FOnCustomDrawGroupSummaryCell write SetOnCustomDrawGroupSummaryCell;
|
|
property OnCustomDrawIndicatorCell: TcxGridIndicatorCellCustomDrawEvent read FOnCustomDrawIndicatorCell write SetOnCustomDrawIndicatorCell;
|
|
property OnCustomization;
|
|
property OnInitGroupingDateRanges;
|
|
property OnLeftPosChanged: TNotifyEvent read FOnLeftPosChanged write SetOnLeftPosChanged;
|
|
end;
|
|
|
|
{ TcxGridColumnAccess }
|
|
|
|
TcxGridColumnAccess = class
|
|
public
|
|
class function CanCellMerging(AInstance: TcxGridColumn): Boolean;
|
|
class function CanShowGroupFooters(AInstance: TcxGridColumn): Boolean;
|
|
class procedure DoCustomDrawGroupSummaryCell(AInstance: TcxGridColumn;
|
|
ACanvas: TcxCanvas; AViewInfo: TcxCustomGridViewCellViewInfo; var ADone: Boolean); virtual;
|
|
class function HasCustomDrawGroupSummaryCell(AInstance: TcxGridColumn): Boolean;
|
|
end;
|
|
|
|
{ TcxGridTableViewAccess }
|
|
|
|
TcxGridTableViewAccess = class
|
|
public
|
|
class procedure DoColumnPosChanged(AInstance: TcxGridTableView;
|
|
AColumn: TcxGridColumn);
|
|
class procedure DoCustomDrawGroupCell(AInstance: TcxGridTableView;
|
|
ACanvas: TcxCanvas; AViewInfo: TcxGridTableCellViewInfo; var ADone: Boolean);
|
|
class procedure DoCustomDrawGroupSummaryCell(AInstance: TcxGridTableView;
|
|
ACanvas: TcxCanvas; AViewInfo: TcxCustomGridViewCellViewInfo; var ADone: Boolean); virtual;
|
|
class function HasCustomDrawGroupCell(AInstance: TcxGridTableView): Boolean;
|
|
class function HasCustomDrawGroupSummaryCell(AInstance: TcxGridTableView): Boolean;
|
|
end;
|
|
|
|
implementation
|
|
|
|
uses
|
|
SysUtils, Math, dxOffice11, cxVariants, cxDataUtils, cxFilterControlUtils,
|
|
cxLibraryConsts, cxGridRows, cxGridStrs;
|
|
|
|
const
|
|
GroupByBoxLeftOffset = 6;
|
|
GroupByBoxTopOffset = 8;
|
|
GroupByBoxHorOffset = 4;
|
|
GroupByBoxLineVerOffset = 4;
|
|
GroupByBoxColumnWidth = 100;
|
|
GroupByBoxLineWidth = 1;
|
|
GroupByBoxLineColor = clBtnText;
|
|
HScrollDelta = 10;
|
|
|
|
FooterSeparatorWidth = 1;
|
|
|
|
TopIndexNone = -2;
|
|
RowIndexNone = -1;
|
|
|
|
ColumnHeaderHitTestCodes = [htColumnHeader];
|
|
|
|
ColumnHeaderMovingZoneSize = 15;
|
|
|
|
ColumnSizingMarkWidth = 1;
|
|
RowSizingMarkWidth = 1;
|
|
|
|
ScrollHotZoneWidth = 15;
|
|
|
|
type
|
|
TcxCustomGridAccess = class(TcxCustomGrid);
|
|
|
|
{ TcxGridGroupByBoxHitTest }
|
|
|
|
class function TcxGridGroupByBoxHitTest.GetHitTestCode: Integer;
|
|
begin
|
|
Result := htGroupByBox;
|
|
end;
|
|
|
|
{ TcxGridColumnHeaderHitTest }
|
|
|
|
class function TcxGridColumnHeaderHitTest.GetHitTestCode: Integer;
|
|
begin
|
|
Result := htColumnHeader;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderHitTest.DragAndDropObjectClass: TcxCustomGridDragAndDropObjectClass;
|
|
begin
|
|
if Column.CanMove then
|
|
Result := TcxGridTableView(GridView).Controller.GetColumnHeaderDragAndDropObjectClass
|
|
else
|
|
Result := nil;
|
|
end;
|
|
|
|
{ TcxGridColumnHeaderHorzSizingEdgeHitTest }
|
|
|
|
class function TcxGridColumnHeaderHorzSizingEdgeHitTest.GetHitTestCode: Integer;
|
|
begin
|
|
Result := htColumnHeaderHorzSizingEdge;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderHorzSizingEdgeHitTest.Cursor: TCursor;
|
|
begin
|
|
Result := crcxGridHorzSize;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderHorzSizingEdgeHitTest.DragAndDropObjectClass: TcxCustomGridDragAndDropObjectClass;
|
|
begin
|
|
Result := TcxGridColumnHorzSizingObject;
|
|
end;
|
|
|
|
{ TcxGridColumnHeaderFilterButtonHitTest }
|
|
|
|
class function TcxGridColumnHeaderFilterButtonHitTest.GetHitTestCode: Integer;
|
|
begin
|
|
Result := htColumnHeaderFilterButton;
|
|
end;
|
|
|
|
{ TcxGridHeaderHitTest }
|
|
|
|
class function TcxGridHeaderHitTest.GetHitTestCode: Integer;
|
|
begin
|
|
Result := htHeader;
|
|
end;
|
|
|
|
{ TcxGridFooterHitTest }
|
|
|
|
class function TcxGridFooterHitTest.GetHitTestCode: Integer;
|
|
begin
|
|
Result := htFooter;
|
|
end;
|
|
|
|
{ TcxGridFooterCellHitTest }
|
|
|
|
class function TcxGridFooterCellHitTest.GetHitTestCode: Integer;
|
|
begin
|
|
Result := htFooterCell;
|
|
end;
|
|
|
|
{ TcxGridGroupFooterHitTest }
|
|
|
|
class function TcxGridGroupFooterHitTest.GetHitTestCode: Integer;
|
|
begin
|
|
Result := htGroupFooter;
|
|
end;
|
|
|
|
{ TcxGridGroupFooterCellHitTest }
|
|
|
|
class function TcxGridGroupFooterCellHitTest.GetHitTestCode: Integer;
|
|
begin
|
|
Result := htGroupFooterCell;
|
|
end;
|
|
|
|
{ TcxGridRowIndicatorHitTest }
|
|
|
|
class function TcxGridRowIndicatorHitTest.GetHitTestCode: Integer;
|
|
begin
|
|
Result := htRowIndicator;
|
|
end;
|
|
|
|
function TcxGridRowIndicatorHitTest.Cursor: TCursor;
|
|
begin
|
|
if MultiSelect then
|
|
Result := crcxGridSelectRow
|
|
else
|
|
Result := inherited Cursor;
|
|
end;
|
|
|
|
{ TcxGridRowSizingEdgeHitTest }
|
|
|
|
class function TcxGridRowSizingEdgeHitTest.GetHitTestCode: Integer;
|
|
begin
|
|
Result := htRowSizingEdge;
|
|
end;
|
|
|
|
function TcxGridRowSizingEdgeHitTest.Cursor: TCursor;
|
|
begin
|
|
Result := crcxGridVertSize;
|
|
end;
|
|
|
|
function TcxGridRowSizingEdgeHitTest.DragAndDropObjectClass: TcxCustomGridDragAndDropObjectClass;
|
|
begin
|
|
Result := TcxGridRowSizingObject;
|
|
end;
|
|
|
|
{ TcxGridIndicatorHitTest }
|
|
|
|
class function TcxGridIndicatorHitTest.GetHitTestCode: Integer;
|
|
begin
|
|
Result := htIndicator;
|
|
end;
|
|
|
|
{ TcxGridIndicatorHeaderHitTest }
|
|
|
|
class function TcxGridIndicatorHeaderHitTest.GetHitTestCode: Integer;
|
|
begin
|
|
Result := htIndicatorHeader;
|
|
end;
|
|
|
|
{ TcxGridRowLevelIndentHitTest }
|
|
|
|
class function TcxGridRowLevelIndentHitTest.GetHitTestCode: Integer;
|
|
begin
|
|
Result := htRowLevelIndent;
|
|
end;
|
|
|
|
class function TcxGridRowLevelIndentHitTest.CanClick: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
{ TcxGridGroupSummaryHitTest }
|
|
|
|
function TcxGridGroupSummaryHitTest.GetColumn: TcxGridColumn;
|
|
begin
|
|
if SummaryItem = nil then
|
|
Result := nil
|
|
else
|
|
Result := SummaryItem.ItemLink as TcxGridColumn;
|
|
end;
|
|
|
|
class function TcxGridGroupSummaryHitTest.GetHitTestCode: Integer;
|
|
begin
|
|
Result := htGroupSummary;
|
|
end;
|
|
|
|
{ TcxCustomGridRow }
|
|
|
|
function TcxCustomGridRow.GetAsGroupRow: TcxGridGroupRow;
|
|
begin
|
|
Result := Self as TcxGridGroupRow;
|
|
end;
|
|
|
|
function TcxCustomGridRow.GetAsMasterDataRow: TcxGridMasterDataRow;
|
|
begin
|
|
Result := Self as TcxGridMasterDataRow;
|
|
end;
|
|
|
|
function TcxCustomGridRow.GetGridView: TcxGridTableView;
|
|
begin
|
|
Result := TcxGridTableView(inherited GridView);
|
|
end;
|
|
|
|
function TcxCustomGridRow.GetGridViewLevel: TcxGridLevel;
|
|
begin
|
|
Result := TcxGridLevel(GridView.Level);
|
|
end;
|
|
|
|
function TcxCustomGridRow.GetIsFilterRow: Boolean;
|
|
begin
|
|
Result := ViewData.FilterRow = Self;
|
|
end;
|
|
|
|
function TcxCustomGridRow.GetIsNewItemRow: Boolean;
|
|
begin
|
|
Result := IsNewItemRecord;
|
|
end;
|
|
|
|
function TcxCustomGridRow.GetViewData: TcxGridViewData;
|
|
begin
|
|
Result := TcxGridViewData(inherited ViewData);
|
|
end;
|
|
|
|
procedure TcxCustomGridRow.KeyDown(var Key: Word; Shift: TShiftState);
|
|
begin
|
|
inherited;
|
|
case Key of
|
|
VK_LEFT:
|
|
if Expandable and Expanded then
|
|
begin
|
|
Expanded := False;
|
|
Key := 0;
|
|
end;
|
|
VK_RIGHT:
|
|
if Expandable and not Expanded then
|
|
begin
|
|
Expanded := True;
|
|
Key := 0;
|
|
end;
|
|
VK_MULTIPLY:
|
|
if Expandable then
|
|
begin
|
|
GridView.Controller.EatKeyPress := True;
|
|
Expand(True);
|
|
Key := 0;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function TcxCustomGridRow.ExpandOnDblClick: Boolean;
|
|
begin
|
|
Result := Expandable;
|
|
end;
|
|
|
|
function TcxCustomGridRow.SupportsCellMultiSelect: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
{ TcxGridDataRow }
|
|
|
|
function TcxGridDataRow.GetHasCells: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
function TcxGridDataRow.GetViewInfoCacheItemClass: TcxCustomGridViewInfoCacheItemClass;
|
|
begin
|
|
Result := TcxGridTableViewInfoCacheItem;
|
|
end;
|
|
|
|
function TcxGridDataRow.GetViewInfoClass: TcxCustomGridRecordViewInfoClass;
|
|
begin
|
|
Result := TcxGridDataRowViewInfo;
|
|
end;
|
|
|
|
function TcxGridDataRow.SupportsCellMultiSelect: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
{ TcxGridNewItemRow }
|
|
|
|
function TcxGridNewItemRow.SupportsCellMultiSelect: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
{ TcxGridFilterRow }
|
|
|
|
destructor TcxGridFilterRow.Destroy;
|
|
begin
|
|
Selected := False;
|
|
inherited;
|
|
end;
|
|
|
|
function TcxGridFilterRow.GetFilterCriteriaItem(Index: Integer): TcxFilterCriteriaItem;
|
|
begin
|
|
Result := GridView.Columns[Index].DataBinding.FilterCriteriaItem;
|
|
if (Result <> nil) and not IsFilterOperatorSupported(Result.OperatorKind, Result.Value) then
|
|
Result := nil;
|
|
end;
|
|
|
|
procedure TcxGridFilterRow.RefreshRecordInfo;
|
|
begin
|
|
with RecordInfo do
|
|
begin
|
|
Expanded := False;
|
|
Level := 0;
|
|
RecordIndex := -1;
|
|
end
|
|
end;
|
|
|
|
function TcxGridFilterRow.GetSelected: Boolean;
|
|
begin
|
|
Result := FSelected;
|
|
end;
|
|
|
|
function TcxGridFilterRow.GetVisible: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
procedure TcxGridFilterRow.SetSelected(Value: Boolean);
|
|
begin
|
|
if FSelected <> Value then
|
|
begin
|
|
GridView.Controller.FilterRowFocusChanging(Value);
|
|
FSelected := Value;
|
|
Invalidate;
|
|
GridView.Controller.FilterRowFocusChanged;
|
|
end;
|
|
end;
|
|
|
|
function TcxGridFilterRow.GetDisplayText(Index: Integer): string;
|
|
var
|
|
AFilterCriteriaItem: TcxFilterCriteriaItem;
|
|
begin
|
|
AFilterCriteriaItem := FilterCriteriaItems[Index];
|
|
if AFilterCriteriaItem = nil then
|
|
Result := ''
|
|
else
|
|
Result := AFilterCriteriaItem.DisplayValue;
|
|
end;
|
|
|
|
function TcxGridFilterRow.GetValue(Index: Integer): Variant;
|
|
var
|
|
AFilterCriteriaItem: TcxFilterCriteriaItem;
|
|
begin
|
|
AFilterCriteriaItem := FilterCriteriaItems[Index];
|
|
if AFilterCriteriaItem = nil then
|
|
Result := Null
|
|
else
|
|
Result := AFilterCriteriaItem.Value;
|
|
end;
|
|
|
|
procedure TcxGridFilterRow.SetDisplayText(Index: Integer; const Value: string);
|
|
var
|
|
AFilterCriteriaItem: TcxFilterCriteriaItem;
|
|
begin
|
|
AFilterCriteriaItem := FilterCriteriaItems[Index];
|
|
if AFilterCriteriaItem <> nil then
|
|
AFilterCriteriaItem.DisplayValue := Value;
|
|
end;
|
|
|
|
procedure TcxGridFilterRow.SetValue(Index: Integer; const Value: Variant);
|
|
var
|
|
AGridView: TcxGridTableView;
|
|
begin
|
|
AGridView := GridView;
|
|
AGridView.Controller.KeepFilterRowFocusing := True;
|
|
try
|
|
if VarIsSoftNull(Value) then
|
|
AGridView.Columns[Index].DataBinding.Filtered := False
|
|
else
|
|
begin
|
|
DataController.Filter.BeginUpdate;
|
|
try
|
|
DataController.Filter.Active := True;
|
|
AGridView.Columns[Index].DataBinding.AddToFilter(nil,
|
|
GetFilterOperatorKind(Value, True), Value,
|
|
GetDisplayTextForValue(Index, Value), True);
|
|
finally
|
|
DataController.Filter.EndUpdate;
|
|
end;
|
|
end;
|
|
finally
|
|
AGridView.Controller.KeepFilterRowFocusing := False;
|
|
end;
|
|
end;
|
|
|
|
function TcxGridFilterRow.GetDisplayTextForValue(AIndex: Integer; const AValue: Variant): string;
|
|
var
|
|
AValueList: TcxGridFilterValueList;
|
|
AValueIndex: Integer;
|
|
begin
|
|
AValueList := ViewData.CreateFilterValueList;
|
|
try
|
|
GridView.Columns[AIndex].DataBinding.GetFilterValues(AValueList);
|
|
AValueIndex := AValueList.FindItemByValue(AValue);
|
|
if AValueIndex = -1 then
|
|
Result := GridView.Columns[AIndex].GetProperties(Self).GetDisplayText(AValue)
|
|
else
|
|
Result := AValueList[AValueIndex].DisplayText;
|
|
finally
|
|
AValueList.Free;
|
|
end;
|
|
end;
|
|
|
|
function TcxGridFilterRow.GetFilterOperatorKind(const AValue: Variant; ACheckMask: Boolean): TcxFilterOperatorKind;
|
|
|
|
function HasMask(const AValue: string): Boolean;
|
|
begin
|
|
Result :=
|
|
(Pos(DataController.Filter.PercentWildcard, AValue) <> 0) or
|
|
(Pos(DataController.Filter.UnderscoreWildcard, AValue) <> 0);
|
|
end;
|
|
|
|
begin
|
|
if VarIsStr(AValue) and (not ACheckMask or HasMask(AValue)) then
|
|
Result := foLike
|
|
else
|
|
Result := foEqual;
|
|
end;
|
|
|
|
function TcxGridFilterRow.IsFilterOperatorSupported(AKind: TcxFilterOperatorKind;
|
|
const AValue: Variant): Boolean;
|
|
begin
|
|
Result := (AKind = foEqual) or (GetFilterOperatorKind(AValue, False) = AKind);
|
|
end;
|
|
|
|
procedure TcxGridFilterRow.KeyDown(var Key: Word; Shift: TShiftState);
|
|
begin
|
|
inherited;
|
|
if Key = VK_ESCAPE then
|
|
begin
|
|
Focused := False;
|
|
Key := 0;
|
|
end;
|
|
end;
|
|
|
|
function TcxGridFilterRow.CanFocusCells: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
function TcxGridFilterRow.IsEmpty: Boolean;
|
|
{var
|
|
I: Integer;}
|
|
begin
|
|
{ for I := 0 to ValueCount - 1 do
|
|
begin
|
|
Result := FilterCriteriaItems[I] = nil;
|
|
if not Result then Exit;
|
|
end;
|
|
Result := True;}
|
|
Result := DataController.Filter.IsEmpty;
|
|
end;
|
|
|
|
{ TcxGridMasterDataRow }
|
|
|
|
function TcxGridMasterDataRow.GetActiveDetailGridView: TcxCustomGridView;
|
|
begin
|
|
if ActiveDetailIndex = -1 then
|
|
Result := nil
|
|
else
|
|
Result := DetailGridViews[ActiveDetailIndex];
|
|
end;
|
|
|
|
function TcxGridMasterDataRow.GetActiveDetailGridViewExists: Boolean;
|
|
begin
|
|
Result := IsValid and (ActiveDetailIndex <> -1) and DetailGridViewExists[ActiveDetailIndex];
|
|
end;
|
|
|
|
function TcxGridMasterDataRow.GetActiveDetailIndex: Integer;
|
|
begin
|
|
Result := InternalActiveDetailIndex;
|
|
if (Result <> -1) and not GridView.IsDestroying then
|
|
if not GridViewLevel[Result].Visible then
|
|
begin
|
|
GridView.BeginUpdate;
|
|
try
|
|
Result := GridView.GetDefaultActiveDetailIndex;
|
|
ActiveDetailIndex := Result;
|
|
finally
|
|
GridView.CancelUpdate;
|
|
end;
|
|
end
|
|
else
|
|
if not GridViewLevel.Options.TabsForEmptyDetails and not DetailGridViewHasData[Result] then
|
|
begin
|
|
GridView.BeginUpdate;
|
|
try
|
|
for Result := 0 to DetailGridViewCount - 1 do
|
|
if DetailGridViewHasData[Result] then
|
|
begin
|
|
ActiveDetailIndex := Result;
|
|
Exit;
|
|
end;
|
|
Result := -1;
|
|
finally
|
|
GridView.CancelUpdate;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function TcxGridMasterDataRow.GetActiveDetailLevel: TcxGridLevel;
|
|
begin
|
|
if ActiveDetailIndex = -1 then
|
|
Result := nil
|
|
else
|
|
Result := GridViewLevel[ActiveDetailIndex];
|
|
end;
|
|
|
|
function TcxGridMasterDataRow.GetDetailGridView(Index: Integer): TcxCustomGridView;
|
|
begin
|
|
Result := DataController.GetDetailLinkObject(RecordIndex, Index) as TcxCustomGridView;
|
|
end;
|
|
|
|
function TcxGridMasterDataRow.GetDetailGridViewCount: Integer;
|
|
begin
|
|
Result := DataController.Relations.Count;
|
|
end;
|
|
|
|
function TcxGridMasterDataRow.GetDetailGridViewExists(Index: Integer): Boolean;
|
|
begin
|
|
Result := DataController.IsDetailDataControllerExist(RecordIndex, Index);
|
|
end;
|
|
|
|
function TcxGridMasterDataRow.GetDetailGridViewHasData(Index: Integer): Boolean;
|
|
begin
|
|
Result := DataController.GetDetailHasChildren(RecordIndex, Index);
|
|
end;
|
|
|
|
function TcxGridMasterDataRow.GetInternalActiveDetailIndex: Integer;
|
|
begin
|
|
Result := DataController.GetDetailActiveRelationIndex(RecordIndex);
|
|
end;
|
|
|
|
procedure TcxGridMasterDataRow.SetActiveDetailIndex(Value: Integer);
|
|
var
|
|
AGridView: TcxCustomGridTableView;
|
|
APrevValue: Integer;
|
|
ANewActiveDetailLevel: TcxGridLevel;
|
|
begin
|
|
AGridView := GridView;
|
|
APrevValue := InternalActiveDetailIndex;
|
|
if APrevValue <> Value then
|
|
begin
|
|
ANewActiveDetailLevel := GridViewLevel.Items[Value];
|
|
DataController.ChangeDetailActiveRelationIndex(RecordIndex, Value);
|
|
//if InternalActiveDetailIndex <> APrevValue then
|
|
TcxCustomGridAccess(AGridView.Control).DoActiveTabChanged(ANewActiveDetailLevel);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridMasterDataRow.SetActiveDetailLevel(Value: TcxGridLevel);
|
|
begin
|
|
if Value.Parent = GridViewLevel then
|
|
ActiveDetailIndex := Value.Index;
|
|
end;
|
|
|
|
procedure TcxGridMasterDataRow.DoCollapse(ARecurse: Boolean);
|
|
var
|
|
I: Integer;
|
|
AGridView: TcxCustomGridView;
|
|
begin
|
|
GridView.BeginUpdate;
|
|
try
|
|
if Expanded and ARecurse then
|
|
for I := 0 to DetailGridViewCount - 1 do
|
|
if DetailGridViewExists[I] then
|
|
begin
|
|
AGridView := DetailGridViews[I];
|
|
if AGridView is TcxCustomGridTableView then
|
|
TcxCustomGridTableView(AGridView).ViewData.Collapse(ARecurse);
|
|
end;
|
|
DataController.ChangeDetailExpanding(RecordIndex, False);
|
|
finally
|
|
GridView.EndUpdate;
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridMasterDataRow.DoExpand(ARecurse: Boolean);
|
|
var
|
|
AViewData: TcxGridViewData;
|
|
ARecordIndex, I: Integer;
|
|
ARecord: TcxCustomGridRecord;
|
|
AGridView: TcxCustomGridView;
|
|
begin
|
|
AViewData := ViewData;
|
|
ARecordIndex := RecordIndex;
|
|
if not DataController.ChangeDetailExpanding(RecordIndex, True) then Exit;
|
|
ARecord := AViewData.GetRecordByRecordIndex(ARecordIndex);
|
|
if Self <> ARecord then
|
|
if ARecord is TcxGridMasterDataRow then
|
|
TcxGridMasterDataRow(ARecord).DoExpand(ARecurse)
|
|
else
|
|
else
|
|
if Expanded and ARecurse then
|
|
for I := 0 to DetailGridViewCount - 1 do
|
|
begin
|
|
AGridView := DetailGridViews[I];
|
|
if AGridView is TcxCustomGridTableView then
|
|
TcxCustomGridTableView(AGridView).ViewData.Expand(ARecurse);
|
|
end;
|
|
end;
|
|
|
|
function TcxGridMasterDataRow.GetExpandable: Boolean;
|
|
begin
|
|
Result := GridView.OptionsView.ExpandButtonsForEmptyDetails or
|
|
HasChildren or Expanded;
|
|
end;
|
|
|
|
function TcxGridMasterDataRow.GetExpanded: Boolean;
|
|
begin
|
|
Result := DataController.GetDetailExpanding(RecordInfo.RecordIndex);
|
|
end;
|
|
|
|
function TcxGridMasterDataRow.GetHasChildren: Boolean;
|
|
var
|
|
I: Integer;
|
|
ADataRelation: TcxCustomDataRelation;
|
|
begin
|
|
for I := 0 to GridViewLevel.VisibleCount - 1 do
|
|
begin
|
|
ADataRelation := GridViewLevel.VisibleItems[I].DataRelation;
|
|
//if ADataRelation <> nil then //!!!
|
|
begin
|
|
Result := DetailGridViewHasData[ADataRelation.Index];
|
|
if Result then Exit;
|
|
end;
|
|
end;
|
|
Result := False;
|
|
end;
|
|
|
|
function TcxGridMasterDataRow.GetViewInfoCacheItemClass: TcxCustomGridViewInfoCacheItemClass;
|
|
begin
|
|
Result := TcxGridMasterTableViewInfoCacheItem;
|
|
end;
|
|
|
|
function TcxGridMasterDataRow.GetViewInfoClass: TcxCustomGridRecordViewInfoClass;
|
|
begin
|
|
Result := TcxGridMasterDataRowViewInfo;
|
|
end;
|
|
|
|
procedure TcxGridMasterDataRow.KeyDown(var Key: Word; Shift: TShiftState);
|
|
begin
|
|
//if not ((Key = VK_LEFT) or (Key = VK_RIGHT)) then - AS5427
|
|
inherited;
|
|
end;
|
|
|
|
procedure TcxGridMasterDataRow.ToggleExpanded;
|
|
var
|
|
AGridView: TcxGridTableView;
|
|
AGridRecordIndex: Integer;
|
|
begin
|
|
if DataController.IsGridMode and not Expanded and not Focused then
|
|
begin
|
|
AGridView := GridView;
|
|
AGridRecordIndex := RecordIndex;
|
|
inherited;
|
|
if (AGridView.DataController.FocusedRecordIndex = AGridRecordIndex) then
|
|
AGridView.Controller.SelectFocusedRecord;
|
|
end
|
|
else
|
|
inherited;
|
|
end;
|
|
|
|
function TcxGridMasterDataRow.ExpandOnDblClick: Boolean;
|
|
begin
|
|
Result := inherited ExpandOnDblClick and
|
|
GridView.OptionsBehavior.ExpandMasterRowOnDblClick;
|
|
end;
|
|
|
|
function TcxGridMasterDataRow.GetFirstFocusableChild: TcxCustomGridRecord;
|
|
var
|
|
AGridView: TcxCustomGridView;
|
|
AGridRecordIndex: Integer;
|
|
ACycleChanged: Boolean;
|
|
begin
|
|
Result := inherited GetFirstFocusableChild;
|
|
if Expanded then
|
|
begin
|
|
AGridView := ActiveDetailGridView;
|
|
if (AGridView is TcxGridTableView) and TcxGridTableView(AGridView).ViewData.HasFilterRow then
|
|
Result := TcxGridTableView(AGridView).ViewData.FilterRow
|
|
else
|
|
if AGridView is TcxCustomGridTableView then
|
|
with TcxCustomGridTableView(AGridView) do
|
|
if ViewData.HasNewItemRecord then
|
|
Result := ViewData.NewItemRecord
|
|
else
|
|
begin
|
|
AGridRecordIndex := Controller.FindNextRecord(-1, True, False, ACycleChanged);
|
|
if AGridRecordIndex <> -1 then
|
|
Result := ViewData.Records[AGridRecordIndex];
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function TcxGridMasterDataRow.GetLastFocusableChild(ARecursive: Boolean): TcxCustomGridRecord;
|
|
var
|
|
AGridView: TcxCustomGridView;
|
|
AGridRecordIndex: Integer;
|
|
AGridRecord: TcxCustomGridRecord;
|
|
ACycleChanged: Boolean;
|
|
begin
|
|
Result := inherited GetLastFocusableChild(ARecursive);
|
|
if Expanded then
|
|
begin
|
|
AGridView := ActiveDetailGridView;
|
|
if AGridView is TcxCustomGridTableView then
|
|
with TcxCustomGridTableView(AGridView) do
|
|
begin
|
|
AGridRecordIndex := Controller.FindNextRecord(-1, False, True, ACycleChanged);
|
|
if AGridRecordIndex <> -1 then
|
|
begin
|
|
Result := ViewData.Records[AGridRecordIndex];
|
|
if ARecursive then
|
|
begin
|
|
AGridRecord := Result.GetLastFocusableChild(ARecursive);
|
|
if AGridRecord <> nil then Result := AGridRecord;
|
|
end;
|
|
end
|
|
else
|
|
if ViewData.HasNewItemRecord then
|
|
Result := ViewData.NewItemRecord
|
|
else
|
|
if (AGridView is TcxGridTableView) and
|
|
TcxGridTableView(AGridView).ViewData.HasFilterRow then
|
|
Result := TcxGridTableView(AGridView).ViewData.FilterRow;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
{ TcxGridGroupRow }
|
|
|
|
function TcxGridGroupRow.GetGroupedColumn: TcxGridColumn;
|
|
begin
|
|
Result := GridView.GroupedColumns[Level];
|
|
end;
|
|
|
|
function TcxGridGroupRow.GetGroupSummaryItems: TcxDataGroupSummaryItems;
|
|
begin
|
|
Result := DataController.Summary.GroupSummaryItems[Level];
|
|
end;
|
|
|
|
procedure TcxGridGroupRow.DoCollapse(ARecurse: Boolean);
|
|
begin
|
|
if ARecurse or Expanded then //!!!
|
|
DataController.Groups.ChangeExpanding(Index, False, ARecurse);
|
|
end;
|
|
|
|
procedure TcxGridGroupRow.DoExpand(ARecurse: Boolean);
|
|
begin
|
|
if ARecurse or not Expanded then //!!!
|
|
DataController.Groups.ChangeExpanding(Index, True, ARecurse);
|
|
end;
|
|
|
|
{function TcxGridGroupRow.GetDestroyingOnExpanding: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;}
|
|
|
|
function TcxGridGroupRow.GetExpandable: Boolean;
|
|
begin
|
|
Result := not (dcoGroupsAlwaysExpanded in DataController.Options);
|
|
end;
|
|
|
|
function TcxGridGroupRow.GetExpanded: Boolean;
|
|
begin
|
|
Result := RecordInfo.Expanded;
|
|
end;
|
|
|
|
function TcxGridGroupRow.GetDisplayCaption: string;
|
|
begin
|
|
Result := Format('%s : %s', [GroupedColumn.GetAlternateCaption, DisplayTexts[-1]]);
|
|
end;
|
|
|
|
function TcxGridGroupRow.GetDisplayText(Index: Integer): string;
|
|
begin
|
|
if ViewData.HasCustomDataHandling(GroupedColumn, doGrouping) then
|
|
Result := ViewData.GetCustomDataDisplayText(RecordIndex, GroupedColumn.Index, doGrouping)
|
|
else
|
|
Result := inherited GetDisplayText(Index);
|
|
end;
|
|
|
|
function TcxGridGroupRow.GetDisplayTextValue: string;
|
|
var
|
|
S: string;
|
|
begin
|
|
Result := DisplayCaption;
|
|
S := DataController.Summary.GroupSummaryText[Index];
|
|
if S <> '' then
|
|
Result := Result + ' ' + S;
|
|
end;
|
|
|
|
function TcxGridGroupRow.GetIsData: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
function TcxGridGroupRow.GetIsParent: Boolean;
|
|
begin
|
|
Result := RecordInfo.Level < DataController.Groups.GroupingItemCount; //!!!
|
|
end;
|
|
|
|
function TcxGridGroupRow.GetValue: Variant;
|
|
begin
|
|
Result := Values[-1];
|
|
if ViewData.HasCustomDataHandling(GroupedColumn, doGrouping) then
|
|
Result := ViewData.GetCustomDataValue(GroupedColumn, Result, doGrouping);
|
|
end;
|
|
|
|
function TcxGridGroupRow.GetViewInfoCacheItemClass: TcxCustomGridViewInfoCacheItemClass;
|
|
begin
|
|
Result := TcxGridTableViewInfoCacheItem;
|
|
end;
|
|
|
|
function TcxGridGroupRow.GetViewInfoClass: TcxCustomGridRecordViewInfoClass;
|
|
begin
|
|
Result := TcxGridGroupRowViewInfo;
|
|
end;
|
|
|
|
procedure TcxGridGroupRow.SetDisplayText(Index: Integer; const Value: string);
|
|
begin
|
|
end;
|
|
|
|
procedure TcxGridGroupRow.SetValue(Index: Integer; const Value: Variant);
|
|
begin
|
|
end;
|
|
|
|
function TcxGridGroupRow.GetGroupSummaryInfo(var ASummaryItems: TcxDataSummaryItems;
|
|
var ASummaryValues: PVariant): Boolean;
|
|
begin
|
|
Result := DataController.Summary.GetGroupSummaryInfo(Index, ASummaryItems, ASummaryValues);
|
|
end;
|
|
|
|
{ TcxGridViewData }
|
|
|
|
destructor TcxGridViewData.Destroy;
|
|
begin
|
|
DestroyFilterRow;
|
|
inherited;
|
|
end;
|
|
|
|
function TcxGridViewData.GetNewItemRow: TcxGridNewItemRow;
|
|
begin
|
|
Result := TcxGridNewItemRow(NewItemRecord);
|
|
end;
|
|
|
|
function TcxGridViewData.GetRow(Index: Integer): TcxCustomGridRow;
|
|
begin
|
|
Result := TcxCustomGridRow(Records[Index]);
|
|
end;
|
|
|
|
function TcxGridViewData.GetRowCount: Integer;
|
|
begin
|
|
Result := RecordCount;
|
|
end;
|
|
|
|
function TcxGridViewData.GetFirstVisibleExpandedMasterRow: TcxGridMasterDataRow;
|
|
|
|
function GetExistingVisibleExpandedMasterRowIndex: Integer;
|
|
begin
|
|
for Result := Controller.TopRecordIndex to Controller.TopRecordIndex + ViewInfo.RecordsViewInfo.VisibleCount - 1 do
|
|
if (Rows[Result] is TcxGridMasterDataRow) and Rows[Result].Expanded then
|
|
Exit;
|
|
Result := -1;
|
|
end;
|
|
|
|
function FindMasterRowAndMakeItExpandedAndVisible: Integer;
|
|
begin
|
|
Result := Controller.TopRecordIndex;
|
|
if Rows[Result] is TcxGridGroupRow then
|
|
begin
|
|
Rows[Result].Expand(True);
|
|
while (Result < RowCount) and not (Rows[Result] is TcxGridMasterDataRow) do
|
|
Inc(Result);
|
|
end;
|
|
if Result < RowCount then
|
|
Rows[Result].Expanded := True
|
|
else
|
|
Result := -1;
|
|
end;
|
|
|
|
var
|
|
ARowIndex: Integer;
|
|
begin
|
|
if (RowCount = 0) or not GridView.IsMaster then
|
|
Result := nil
|
|
else
|
|
begin
|
|
ARowIndex := GetExistingVisibleExpandedMasterRowIndex;
|
|
if ARowIndex = -1 then
|
|
ARowIndex := FindMasterRowAndMakeItExpandedAndVisible;
|
|
if ARowIndex = -1 then
|
|
Result := nil
|
|
else
|
|
Result := Rows[ARowIndex].AsMasterDataRow;
|
|
end;
|
|
end;
|
|
|
|
function TcxGridViewData.GetNewItemRecordClass: TcxCustomGridRecordClass;
|
|
begin
|
|
Result := TcxGridNewItemRow;
|
|
end;
|
|
|
|
function TcxGridViewData.GetRecordByKind(AKind, AIndex: Integer): TcxCustomGridRecord;
|
|
begin
|
|
if AKind = rkFiltering then
|
|
if HasFilterRow then
|
|
Result := FilterRow
|
|
else
|
|
Result := nil
|
|
else
|
|
Result := inherited GetRecordByKind(AKind, AIndex);
|
|
end;
|
|
|
|
function TcxGridViewData.GetRecordClass(ARecordInfo: TcxRowInfo): TcxCustomGridRecordClass;
|
|
begin
|
|
if ARecordInfo.Level < DataController.Groups.GroupingItemCount then
|
|
Result := TcxGridGroupRow
|
|
else
|
|
if GridView.IsMaster then
|
|
Result := TcxGridMasterDataRow
|
|
else
|
|
Result := TcxGridDataRow;
|
|
end;
|
|
|
|
function TcxGridViewData.GetRecordKind(ARecord: TcxCustomGridRecord): Integer;
|
|
begin
|
|
if HasFilterRow and (ARecord = FilterRow) then
|
|
Result := rkFiltering
|
|
else
|
|
Result := inherited GetRecordKind(ARecord);
|
|
end;
|
|
|
|
procedure TcxGridViewData.CreateFilterRow;
|
|
var
|
|
ARowInfo: TcxRowInfo;
|
|
begin
|
|
FFilterRow := GetFilterRowClass.Create(Self, -1, ARowInfo);
|
|
FFilterRow.RefreshRecordInfo;
|
|
end;
|
|
|
|
procedure TcxGridViewData.DestroyFilterRow;
|
|
begin
|
|
FFilterRow.Free;
|
|
FFilterRow := nil;
|
|
end;
|
|
|
|
procedure TcxGridViewData.CheckFilterRow;
|
|
begin
|
|
if HasFilterRow then
|
|
CreateFilterRow
|
|
else
|
|
DestroyFilterRow;
|
|
end;
|
|
|
|
{procedure TcxGridViewData.RecreateFilterRow;
|
|
var
|
|
ASelected: Boolean;
|
|
begin
|
|
if HasFilterRow then
|
|
begin
|
|
ASelected := FilterRow.InternalSelected;
|
|
DestroyFilterRow;
|
|
CreateFilterRow;
|
|
FilterRow.InternalSelected := ASelected;
|
|
end;
|
|
end;}
|
|
|
|
function TcxGridViewData.GetFilterRowClass: TcxGridFilterRowClass;
|
|
begin
|
|
Result := TcxGridFilterRow;
|
|
end;
|
|
|
|
procedure TcxGridViewData.Collapse(ARecurse: Boolean);
|
|
begin
|
|
if ARecurse then
|
|
begin
|
|
BeginUpdate;
|
|
try
|
|
DataController.Groups.FullCollapse;
|
|
DataController.CollapseDetails;
|
|
finally
|
|
EndUpdate;
|
|
end;
|
|
end
|
|
else
|
|
inherited;
|
|
end;
|
|
|
|
procedure TcxGridViewData.Expand(ARecurse: Boolean);
|
|
begin
|
|
DataController.Groups.FullExpand;
|
|
inherited;
|
|
end;
|
|
|
|
function TcxGridViewData.HasFilterRow: Boolean;
|
|
begin
|
|
Result := TcxGridTableView(GridView).FilterRow.Visible;
|
|
end;
|
|
|
|
function TcxGridViewData.HasNewItemRecord: Boolean;
|
|
begin
|
|
Result := TcxGridTableView(GridView).NewItemRow.Visible;
|
|
end;
|
|
|
|
function TcxGridViewData.MakeDetailVisible(ADetailLevel: TComponent{TcxGridLevel}): TcxCustomGridView;
|
|
var
|
|
ARow: TcxGridMasterDataRow;
|
|
begin
|
|
Result := inherited MakeDetailVisible(ADetailLevel);
|
|
ARow := GetFirstVisibleExpandedMasterRow;
|
|
if ARow <> nil then
|
|
begin
|
|
ARow.ActiveDetailLevel := TcxGridLevel(ADetailLevel);
|
|
if ARow.ActiveDetailLevel = ADetailLevel then
|
|
Result := ARow.ActiveDetailGridView;
|
|
ARow.MakeVisible;
|
|
end;
|
|
end;
|
|
|
|
{procedure TcxGridViewData.Refresh(ARecordCount: Integer);
|
|
begin
|
|
RecreateFilterRow;
|
|
inherited;
|
|
end;}
|
|
|
|
{ TcxGridColumnHeaderMovingObject }
|
|
|
|
function TcxGridColumnHeaderMovingObject.GetGridView: TcxGridTableView;
|
|
begin
|
|
Result := TcxGridTableView(inherited GridView);
|
|
end;
|
|
|
|
function TcxGridColumnHeaderMovingObject.GetSourceItem: TcxGridColumn;
|
|
begin
|
|
Result := TcxGridColumn(inherited SourceItem);
|
|
end;
|
|
|
|
function TcxGridColumnHeaderMovingObject.GetViewInfo: TcxGridTableViewInfo;
|
|
begin
|
|
Result := TcxGridTableViewInfo(inherited ViewInfo);
|
|
end;
|
|
|
|
procedure TcxGridColumnHeaderMovingObject.SetSourceItem(Value: TcxGridColumn);
|
|
begin
|
|
inherited SourceItem := Value;
|
|
end;
|
|
|
|
procedure TcxGridColumnHeaderMovingObject.CalculateDestParams(AHitTest: TcxCustomGridHitTest;
|
|
out AContainerKind: TcxGridItemContainerKind; out AZone: TcxGridItemContainerZone);
|
|
begin
|
|
inherited;
|
|
if AContainerKind = ckNone then
|
|
begin
|
|
AZone := ViewInfo.GroupByBoxViewInfo.GetZone(AHitTest.Pos);
|
|
if AZone = nil then
|
|
begin
|
|
AZone := ViewInfo.HeaderViewInfo.GetZone(AHitTest.Pos);
|
|
if AZone <> nil then
|
|
AContainerKind := ckHeader;
|
|
end
|
|
else
|
|
AContainerKind := ckGroupByBox;
|
|
end;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderMovingObject.CanRemove: Boolean;
|
|
begin
|
|
Result :=
|
|
(SourceItemContainerKind = ckGroupByBox) and SourceItem.CanGroup or
|
|
(SourceItemContainerKind = ckHeader) and SourceItem.CanHide and
|
|
(FOriginalDestColumnContainerKind <> ckGroupByBox) and
|
|
(GridView.Controller.Customization or GridView.OptionsCustomize.ColumnHiding);
|
|
end;
|
|
|
|
procedure TcxGridColumnHeaderMovingObject.CheckDestItemContainerKind(var AValue: TcxGridItemContainerKind);
|
|
begin
|
|
if (AValue = ckGroupByBox) and not SourceItem.CanGroup then
|
|
AValue := ckNone;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TcxGridColumnHeaderMovingObject.DoColumnMoving;
|
|
var
|
|
AIndex: Integer;
|
|
begin
|
|
with SourceItem do
|
|
begin
|
|
if DestZone.ItemIndex = GridView.VisibleColumnCount then
|
|
AIndex := GridView.ColumnCount - 1
|
|
else
|
|
begin
|
|
AIndex := GridView.VisibleColumns[DestZone.ItemIndex].Index;
|
|
if Index < AIndex then Dec(AIndex);
|
|
end;
|
|
Index := AIndex;
|
|
end;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderMovingObject.GetArrowAreaBounds(APlace: TcxGridArrowPlace): TRect;
|
|
|
|
procedure CalculateForGroupByBox;
|
|
begin
|
|
with ViewInfo.GroupByBoxViewInfo do
|
|
if DestZone.ItemIndex = Count then
|
|
if Count = 0 then
|
|
begin
|
|
Result := Bounds;
|
|
Inc(Result.Left, GroupByBoxLeftOffset);
|
|
InflateRect(Result, 0, -GroupByBoxTopOffset);
|
|
end
|
|
else
|
|
begin
|
|
Result := Items[Count - 1].Bounds;
|
|
Result.Left := Result.Right + GroupByBoxHorOffset div 2;
|
|
end
|
|
else
|
|
begin
|
|
Result := Items[DestZone.ItemIndex].Bounds;
|
|
Dec(Result.Left, GroupByBoxHorOffset div 2);
|
|
if DestZone.ItemIndex <> 0 then
|
|
OffsetRect(Result, 0, -GroupByBoxVerOffset div 2);
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
if DestItemContainerKind = ckGroupByBox then
|
|
CalculateForGroupByBox
|
|
else
|
|
Result := GetArrowAreaBoundsForHeader(APlace);
|
|
end;
|
|
|
|
function TcxGridColumnHeaderMovingObject.GetArrowAreaBoundsForHeader(APlace: TcxGridArrowPlace): TRect;
|
|
begin
|
|
with ViewInfo.HeaderViewInfo do
|
|
if DestZone.ItemIndex = Count then
|
|
if Count = 0 then
|
|
Result := Bounds
|
|
else
|
|
begin
|
|
Result := Items[Count - 1].Bounds;
|
|
Result.Left := Result.Right;
|
|
end
|
|
else
|
|
Result := Items[DestZone.ItemIndex].Bounds;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderMovingObject.GetArrowsClientRect: TRect;
|
|
begin
|
|
Result := inherited GetArrowsClientRect;
|
|
with ViewInfo.ClientBounds do
|
|
begin
|
|
Result.Left := Left;
|
|
Result.Right := Right;
|
|
end;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderMovingObject.GetSourceItemViewInfo: TcxCustomGridCellViewInfo;
|
|
begin
|
|
case SourceItemContainerKind of
|
|
ckGroupByBox:
|
|
Result := ViewInfo.GroupByBoxViewInfo[SourceItem.GroupIndex];
|
|
ckHeader:
|
|
Result := ViewInfo.HeaderViewInfo[SourceItem.VisibleIndex];
|
|
else
|
|
Result := inherited GetSourceItemViewInfo;
|
|
end;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderMovingObject.IsValidDestination: Boolean;
|
|
begin
|
|
Result := DestItemContainerKind in [ckGroupByBox, ckHeader];
|
|
if Result then
|
|
begin
|
|
case DestItemContainerKind of
|
|
ckGroupByBox:
|
|
Result := SourceItem.GroupIndex = -1;
|
|
ckHeader:
|
|
Result := not SourceItem.Visible;
|
|
end;
|
|
Result := Result or IsValidDestinationForVisibleSource;
|
|
end;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderMovingObject.IsValidDestinationForVisibleSource: Boolean;
|
|
begin
|
|
case DestItemContainerKind of
|
|
ckGroupByBox:
|
|
Result :=
|
|
(DestZone.ItemIndex < SourceItem.GroupIndex) or
|
|
(SourceItem.GroupIndex + 1 < DestZone.ItemIndex);
|
|
ckHeader:
|
|
Result :=
|
|
(SourceItemContainerKind = ckGroupByBox) or
|
|
(DestZone.ItemIndex < SourceItem.VisibleIndex) or
|
|
(SourceItem.VisibleIndex + 1 < DestZone.ItemIndex);
|
|
else
|
|
Result := False;
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridColumnHeaderMovingObject.EndDragAndDrop(Accepted: Boolean);
|
|
var
|
|
APrevGroupIndex: Integer;
|
|
AColumnPosChanged: Boolean;
|
|
|
|
procedure DoColumnGrouping;
|
|
begin
|
|
if IsValidDestination then
|
|
AColumnPosChanged := SourceItem.GroupBy(DestZone.ItemIndex -
|
|
Byte((SourceItem.GroupIndex <> -1) and (SourceItem.GroupIndex < DestZone.ItemIndex)));
|
|
end;
|
|
|
|
procedure DoColumnRemoving;
|
|
begin
|
|
if not CanRemove then Exit;
|
|
with SourceItem do
|
|
case SourceItemContainerKind of
|
|
ckGroupByBox:
|
|
AColumnPosChanged := SourceItem.GroupBy(-1,
|
|
(DestItemContainerKind <> ckCustomizationForm) and
|
|
(not GridView.OptionsCustomize.ColumnHiding or not CanHide) and
|
|
not Controller.Customization);
|
|
ckHeader:
|
|
if CanHide then
|
|
begin
|
|
Visible := False;
|
|
AColumnPosChanged := True;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
inherited;
|
|
if Accepted then
|
|
begin
|
|
AColumnPosChanged := False;
|
|
APrevGroupIndex := SourceItem.GroupIndex;
|
|
TcxCustomGrid(GridView.Control){GridView}.BeginUpdate;
|
|
try
|
|
case DestItemContainerKind of
|
|
ckGroupByBox:
|
|
DoColumnGrouping;
|
|
ckHeader:
|
|
if IsValidDestination then
|
|
begin
|
|
DoColumnMoving;
|
|
with SourceItem do
|
|
begin
|
|
if (SourceItemContainerKind = ckGroupByBox) and CanGroup then
|
|
GroupIndex := -1;
|
|
Visible := True;
|
|
end;
|
|
AColumnPosChanged := True;
|
|
end;
|
|
else
|
|
DoColumnRemoving;
|
|
end;
|
|
finally
|
|
TcxCustomGrid(GridView.Control){GridView}.EndUpdate;
|
|
end;
|
|
if SourceItem.GroupIndex <> APrevGroupIndex then
|
|
Controller.MakeFocusedRecordVisible;
|
|
if AColumnPosChanged then
|
|
GridView.DoColumnPosChanged(SourceItem);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridColumnHeaderMovingObject.Init(const P: TPoint; AParams: TcxCustomGridHitTest);
|
|
begin
|
|
inherited;
|
|
with AParams as TcxGridColumnHeaderHitTest do
|
|
begin
|
|
SourceItem := Column;
|
|
SourceItemContainerKind := ColumnContainerKind;
|
|
end;
|
|
end;
|
|
|
|
{ TcxCustomGridSizingObject }
|
|
|
|
function TcxCustomGridSizingObject.GetController: TcxGridTableController;
|
|
begin
|
|
Result := TcxGridTableController(inherited Controller);
|
|
end;
|
|
|
|
function TcxCustomGridSizingObject.GetGridView: TcxGridTableView;
|
|
begin
|
|
Result := TcxGridTableView(inherited GridView);
|
|
end;
|
|
|
|
function TcxCustomGridSizingObject.GetViewInfo: TcxGridTableViewInfo;
|
|
begin
|
|
Result := TcxGridTableViewInfo(inherited ViewInfo);
|
|
end;
|
|
|
|
procedure TcxCustomGridSizingObject.SetDestPointX(Value: Integer);
|
|
begin
|
|
if FDestPointX <> Value then
|
|
begin
|
|
Dirty := True;
|
|
FDestPointX := Value;
|
|
end;
|
|
end;
|
|
|
|
procedure TcxCustomGridSizingObject.SetDestPointY(Value: Integer);
|
|
begin
|
|
if FDestPointY <> Value then
|
|
begin
|
|
Dirty := True;
|
|
FDestPointY := Value;
|
|
end;
|
|
end;
|
|
|
|
procedure TcxCustomGridSizingObject.DirtyChanged;
|
|
begin
|
|
Canvas.InvertRect(SizingMarkBounds);
|
|
end;
|
|
|
|
function TcxCustomGridSizingObject.GetCurrentSize: Integer;
|
|
begin
|
|
Result := OriginalSize + DeltaSize;
|
|
end;
|
|
|
|
function TcxCustomGridSizingObject.GetDeltaSize: Integer;
|
|
begin
|
|
if IsHorizontalSizing then
|
|
Result := DestPointX - SourcePoint.X
|
|
else
|
|
Result := DestPointY - SourcePoint.Y;
|
|
end;
|
|
|
|
function TcxCustomGridSizingObject.GetDragAndDropCursor(Accepted: Boolean): TCursor;
|
|
begin
|
|
if IsHorizontalSizing then
|
|
Result := crcxGridHorzSize
|
|
else
|
|
Result := crcxGridVertSize;
|
|
end;
|
|
|
|
function TcxCustomGridSizingObject.GetHorzSizingMarkBounds: TRect;
|
|
begin
|
|
with Result do
|
|
begin
|
|
Right := SizingItemBounds.Left + CurrentSize;
|
|
Left := Right - SizingMarkWidth;
|
|
Top := SizingItemBounds.Top;
|
|
Bottom := ViewInfo.Bounds.Bottom - ViewInfo.PartsBottomHeight;
|
|
end;
|
|
end;
|
|
|
|
function TcxCustomGridSizingObject.GetImmediateStart: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
function TcxCustomGridSizingObject.GetIsHorizontalSizing: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
function TcxCustomGridSizingObject.GetSizingMarkBounds: TRect;
|
|
begin
|
|
if IsHorizontalSizing then
|
|
Result := GetHorzSizingMarkBounds
|
|
else
|
|
Result := GetVertSizingMarkBounds;
|
|
end;
|
|
|
|
function TcxCustomGridSizingObject.GetVertSizingMarkBounds: TRect;
|
|
begin
|
|
with Result do
|
|
begin
|
|
Left := ViewInfo.Bounds.Left;
|
|
Right := ViewInfo.Bounds.Right;
|
|
Bottom := SizingItemBounds.Top + CurrentSize;
|
|
Top := Bottom - SizingMarkWidth;
|
|
end;
|
|
end;
|
|
|
|
procedure TcxCustomGridSizingObject.DragAndDrop(const P: TPoint; var Accepted: Boolean);
|
|
begin
|
|
if IsHorizontalSizing then
|
|
DestPointX := P.X
|
|
else
|
|
DestPointY := P.Y;
|
|
Accepted := True;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TcxCustomGridSizingObject.Init(const P: TPoint; AParams: TcxCustomGridHitTest);
|
|
begin
|
|
inherited;
|
|
FDestPointX := SourcePoint.X;
|
|
FDestPointY := SourcePoint.Y;
|
|
end;
|
|
|
|
{ TcxCustomGridColumnSizingObject }
|
|
|
|
function TcxCustomGridColumnSizingObject.GetColumnHeaderViewInfo: TcxGridColumnHeaderViewInfo;
|
|
begin
|
|
Result := ViewInfo.HeaderViewInfo[Column.VisibleIndex];
|
|
end;
|
|
|
|
function TcxCustomGridColumnSizingObject.GetSizingItemBounds: TRect;
|
|
begin
|
|
Result := ColumnHeaderViewInfo.Bounds;
|
|
end;
|
|
|
|
function TcxCustomGridColumnSizingObject.GetSizingMarkWidth: Integer;
|
|
begin
|
|
Result := ColumnSizingMarkWidth;
|
|
end;
|
|
|
|
procedure TcxCustomGridColumnSizingObject.Init(const P: TPoint; AParams: TcxCustomGridHitTest);
|
|
begin
|
|
inherited;
|
|
Column := (AParams as TcxCustomGridColumnHitTest).Column;
|
|
end;
|
|
|
|
{ TcxGridColumnHorzSizingObject }
|
|
|
|
procedure TcxGridColumnHorzSizingObject.BeginDragAndDrop;
|
|
begin
|
|
OriginalSize := ColumnHeaderViewInfo.Width;
|
|
Controller.FHorzSizingColumn := Column;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TcxGridColumnHorzSizingObject.EndDragAndDrop(Accepted: Boolean);
|
|
begin
|
|
inherited;
|
|
Controller.FHorzSizingColumn := nil;
|
|
if Accepted and (CurrentSize <> OriginalSize) then
|
|
begin
|
|
Column.ForceWidth(ColumnHeaderViewInfo.CalculateRealWidth(CurrentSize));
|
|
GridView.DoColumnSizeChanged(Column);
|
|
end;
|
|
end;
|
|
|
|
function TcxGridColumnHorzSizingObject.GetCurrentSize: Integer;
|
|
begin
|
|
Result := inherited GetCurrentSize;
|
|
ColumnHeaderViewInfo.CheckWidth(Result);
|
|
end;
|
|
|
|
{ TcxGridRowSizingObject }
|
|
|
|
function TcxGridRowSizingObject.GetRowViewInfo: TcxCustomGridRowViewInfo;
|
|
begin
|
|
Result := TcxCustomGridRowViewInfo(FRow.ViewInfo);
|
|
end;
|
|
|
|
procedure TcxGridRowSizingObject.BeginDragAndDrop;
|
|
begin
|
|
OriginalSize := RowViewInfo.RowHeight;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TcxGridRowSizingObject.EndDragAndDrop(Accepted: Boolean);
|
|
begin
|
|
inherited;
|
|
if Accepted then
|
|
RowViewInfo.RowHeight := CurrentSize;
|
|
end;
|
|
|
|
function TcxGridRowSizingObject.GetCurrentSize: Integer;
|
|
begin
|
|
Result := inherited GetCurrentSize;
|
|
RowViewInfo.CheckRowHeight(Result);
|
|
end;
|
|
|
|
function TcxGridRowSizingObject.GetIsHorizontalSizing: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
function TcxGridRowSizingObject.GetSizingItemBounds: TRect;
|
|
begin //!!!
|
|
Result := RowViewInfo.Bounds;
|
|
end;
|
|
|
|
function TcxGridRowSizingObject.GetSizingMarkWidth: Integer;
|
|
begin
|
|
Result := RowSizingMarkWidth;
|
|
end;
|
|
|
|
procedure TcxGridRowSizingObject.Init(const P: TPoint; AParams: TcxCustomGridHitTest);
|
|
begin
|
|
inherited;
|
|
FRow := TcxCustomGridRow((AParams as TcxGridRowSizingEdgeHitTest).GridRecord);
|
|
end;
|
|
|
|
{ TcxGridTableItemsListBox }
|
|
|
|
constructor TcxGridTableItemsListBox.Create(AOwner: TComponent);
|
|
begin
|
|
inherited;
|
|
Style.Color := clBtnFace;
|
|
end;
|
|
|
|
function TcxGridTableItemsListBox.GetGridView: TcxGridTableView;
|
|
begin
|
|
Result := TcxGridTableView(inherited GridView);
|
|
end;
|
|
|
|
function TcxGridTableItemsListBox.CalculateItemHeight: Integer;
|
|
begin
|
|
Result := 2 * (LookAndFeelPainter.HeaderBorderSize + cxGridCellTextOffset) +
|
|
Canvas.TextHeight('Qq');
|
|
end;
|
|
|
|
procedure TcxGridTableItemsListBox.PaintItem(ACanvas: TcxCanvas; R: TRect;
|
|
AIndex: Integer; AFocused: Boolean);
|
|
const
|
|
States: array[Boolean] of TcxButtonState = (cxbsNormal, cxbsHot);
|
|
var
|
|
ATextR, ASelectionR: TRect;
|
|
begin
|
|
ACanvas.Font.Color := clBtnText;
|
|
ASelectionR := R;
|
|
with LookAndFeelPainter do
|
|
begin
|
|
InflateRect(ASelectionR, -HeaderBorderSize, -HeaderBorderSize);
|
|
ATextR := ASelectionR;
|
|
InflateRect(ATextR, -cxGridCellTextOffset, 0);
|
|
DrawHeader(ACanvas, R, ATextR, [],
|
|
cxBordersAll, States[AFocused], taLeftJustify, vaCenter, False,
|
|
GetItemEndEllipsis, Items[AIndex], ACanvas.Font,
|
|
clBtnText, clBtnFace, DrawItemDrawBackgroundHandler);
|
|
if AFocused then
|
|
DrawHeaderPressed(ACanvas, ASelectionR);
|
|
end;
|
|
end;
|
|
|
|
{ TcxGridTableColumnsListBox }
|
|
|
|
function TcxGridTableColumnsListBox.DrawItemDrawBackgroundHandler(ACanvas: TcxCanvas;
|
|
const ABounds: TRect): Boolean;
|
|
begin
|
|
Result := GridView.ViewInfo.HeaderViewInfo.DrawColumnBackgroundHandler(ACanvas, ABounds);
|
|
end;
|
|
|
|
function TcxGridTableColumnsListBox.GetDragAndDropParams: TcxCustomGridHitTest;
|
|
begin
|
|
Result := TcxGridColumnHeaderHitTest.Instance(Point(-1, -1));
|
|
with TcxGridColumnHeaderHitTest(Result) do
|
|
begin
|
|
GridView := Self.GridView;
|
|
Column := TcxGridColumn(DragAndDropItem);
|
|
ColumnContainerKind := ckCustomizationForm;
|
|
end;
|
|
end;
|
|
|
|
function TcxGridTableColumnsListBox.GetItemEndEllipsis: Boolean;
|
|
begin
|
|
Result := GridView.OptionsView.HeaderEndEllipsis;
|
|
end;
|
|
|
|
procedure TcxGridTableColumnsListBox.RefreshItems;
|
|
begin
|
|
inherited;
|
|
RefreshItemsAsTableItems;
|
|
end;
|
|
|
|
{ TcxGridTableCustomizationForm }
|
|
|
|
function TcxGridTableCustomizationForm.GetColumnsListBox: TcxGridTableColumnsListBox;
|
|
begin
|
|
Result := TcxGridTableColumnsListBox(ItemsListBox);
|
|
end;
|
|
|
|
function TcxGridTableCustomizationForm.GetColumnsPage: TcxTabSheet;
|
|
begin
|
|
Result := ItemsPage;
|
|
end;
|
|
|
|
function TcxGridTableCustomizationForm.GetController: TcxGridTableController;
|
|
begin
|
|
Result := TcxGridTableController(inherited Controller);
|
|
end;
|
|
|
|
function TcxGridTableCustomizationForm.GetGridView: TcxGridTableView;
|
|
begin
|
|
Result := TcxGridTableView(inherited GridView);
|
|
end;
|
|
|
|
function TcxGridTableCustomizationForm.GetViewInfo: TcxGridTableViewInfo;
|
|
begin
|
|
Result := TcxGridTableViewInfo(inherited ViewInfo);
|
|
end;
|
|
|
|
function TcxGridTableCustomizationForm.GetItemsListBoxClass: TcxCustomGridTableItemsListBoxClass;
|
|
begin
|
|
Result := TcxGridTableColumnsListBox;
|
|
end;
|
|
|
|
function TcxGridTableCustomizationForm.GetItemsPageCaption: string;
|
|
begin
|
|
Result := cxGetResourceString(@scxGridCustomizationFormColumnsPageCaption);
|
|
end;
|
|
|
|
{ TcxGridDragOpenInfoMasterDataRowTab }
|
|
|
|
constructor TcxGridDragOpenInfoMasterDataRowTab.Create(ALevel: TcxGridLevel;
|
|
AGridRow: TcxGridMasterDataRow);
|
|
begin
|
|
inherited Create(ALevel);
|
|
GridRow := AGridRow;
|
|
end;
|
|
|
|
function TcxGridDragOpenInfoMasterDataRowTab.Equals(AInfo: TcxCustomGridDragOpenInfo): Boolean;
|
|
begin
|
|
Result := inherited Equals(AInfo) and
|
|
(GridRow = TcxGridDragOpenInfoMasterDataRowTab(AInfo).GridRow);
|
|
end;
|
|
|
|
procedure TcxGridDragOpenInfoMasterDataRowTab.Run;
|
|
begin
|
|
GridRow.ActiveDetailIndex := Level.Index;
|
|
end;
|
|
|
|
{ TcxGridColumnsCustomizationPopup }
|
|
|
|
function TcxGridColumnsCustomizationPopup.GetGridView: TcxGridTableView;
|
|
begin
|
|
Result := TcxGridTableView(inherited GridView);
|
|
end;
|
|
|
|
procedure TcxGridColumnsCustomizationPopup.ItemClicked(AItem: TObject; AChecked: Boolean);
|
|
begin
|
|
inherited;
|
|
GridView.DoColumnPosChanged(TcxGridColumn(AItem));
|
|
end;
|
|
|
|
procedure TcxGridColumnsCustomizationPopup.SetItemIndex(AItem: TObject; AIndex: Integer);
|
|
begin
|
|
inherited;
|
|
GridView.DoColumnPosChanged(TcxGridColumn(AItem));
|
|
end;
|
|
|
|
{ TcxGridTableEditingController }
|
|
|
|
function TcxGridTableEditingController.GetController: TcxGridTableController;
|
|
begin
|
|
Result := TcxGridTableController(inherited Controller);
|
|
end;
|
|
|
|
function TcxGridTableEditingController.GetGridView: TcxGridTableView;
|
|
begin
|
|
Result := TcxGridTableView(inherited GridView);
|
|
end;
|
|
|
|
function TcxGridTableEditingController.CanInitEditing: Boolean;
|
|
begin
|
|
if Controller.IsFilterRowFocused then
|
|
Result := True
|
|
else
|
|
Result := inherited CanInitEditing;
|
|
end;
|
|
|
|
function TcxGridTableEditingController.CanUpdateEditValue: Boolean;
|
|
begin
|
|
Result := inherited CanUpdateEditValue and not ApplyingImmediateFiltering;
|
|
end;
|
|
|
|
procedure TcxGridTableEditingController.DoEditChanged;
|
|
begin
|
|
inherited;
|
|
if Controller.IsFilterRowFocused and (GridView.FilterRow.ApplyChanges = fracImmediately) then
|
|
begin
|
|
ApplyingImmediateFiltering := True;
|
|
try
|
|
EditingItem.EditValue := Edit.EditingValue;
|
|
finally
|
|
ApplyingImmediateFiltering := False;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableEditingController.DoEditKeyDown(var Key: Word; Shift: TShiftState);
|
|
begin
|
|
if Controller.IsFilterRowFocused and (GridView.FilterRow.ApplyChanges = fracImmediately) and
|
|
(Key = VK_ESCAPE) then
|
|
Edit.Reset;
|
|
inherited;
|
|
end;
|
|
|
|
function TcxGridTableEditingController.GetHideEditOnFocusedRecordChange: Boolean;
|
|
begin
|
|
Result := inherited GetHideEditOnFocusedRecordChange or
|
|
GridView.ViewData.HasFilterRow;
|
|
end;
|
|
|
|
procedure TcxGridTableEditingController.InitEdit;
|
|
|
|
procedure AddFilterValues(AStrings: TStrings);
|
|
var
|
|
AValueList: TcxGridFilterValueList;
|
|
I: Integer;
|
|
begin
|
|
AValueList := Controller.ViewData.CreateFilterValueList;
|
|
try
|
|
EditingItem.DataBinding.GetFilterValues(AValueList, True, False, True);
|
|
with AStrings do
|
|
begin
|
|
BeginUpdate;
|
|
try
|
|
for I := 0 to AValueList.Count - 1 do
|
|
Add(AValueList[I].Value);
|
|
finally
|
|
EndUpdate;
|
|
end;
|
|
end;
|
|
finally
|
|
AValueList.Free;
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
inherited;
|
|
if Controller.IsFilterRowFocused then
|
|
begin
|
|
// won't work if both Properties and RepositoryItem are assigned to column
|
|
Edit.InternalProperties.ReadOnly := False;
|
|
if (GridView.FilterRow.ApplyChanges = fracOnCellExit) and
|
|
(Edit is TcxCustomTextEdit) and (Edit.ActiveProperties = TcxCustomTextEdit(Edit).Properties) then
|
|
AddFilterValues(TcxCustomTextEdit(Edit).Properties.LookupItems);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableEditingController.PostEditingData;
|
|
begin
|
|
if Controller.IsFilterRowFocused then
|
|
UpdateValue
|
|
else
|
|
inherited;
|
|
end;
|
|
|
|
{ TcxGridTableController }
|
|
|
|
constructor TcxGridTableController.Create(AGridView: TcxCustomGridView);
|
|
begin
|
|
inherited;
|
|
FSelectedColumns := TList.Create;
|
|
end;
|
|
|
|
destructor TcxGridTableController.Destroy;
|
|
begin
|
|
FreeAndNil(FSelectedColumns);
|
|
inherited;
|
|
end;
|
|
|
|
function TcxGridTableController.GetColumnsCustomizationPopup: TcxGridColumnsCustomizationPopup;
|
|
begin
|
|
Result := TcxGridColumnsCustomizationPopup(ItemsCustomizationPopup);
|
|
end;
|
|
|
|
function TcxGridTableController.GetCustomizationForm: TcxGridTableCustomizationForm;
|
|
begin
|
|
Result := TcxGridTableCustomizationForm(inherited CustomizationForm);
|
|
end;
|
|
|
|
function TcxGridTableController.GetEditingController: TcxGridTableEditingController;
|
|
begin
|
|
Result := TcxGridTableEditingController(inherited EditingController);
|
|
end;
|
|
|
|
function TcxGridTableController.GetFocusedColumn: TcxGridColumn;
|
|
begin
|
|
Result := TcxGridColumn(FocusedItem);
|
|
end;
|
|
|
|
function TcxGridTableController.GetFocusedColumnIndex: Integer;
|
|
begin
|
|
Result := FocusedItemIndex;
|
|
end;
|
|
|
|
function TcxGridTableController.GetFocusedRow: TcxCustomGridRow;
|
|
begin
|
|
Result := TcxCustomGridRow(FocusedRecord);
|
|
end;
|
|
|
|
function TcxGridTableController.GetFocusedRowIndex: Integer;
|
|
begin
|
|
Result := FocusedRecordIndex;
|
|
end;
|
|
|
|
function TcxGridTableController.GetGridView: TcxGridTableView;
|
|
begin
|
|
Result := TcxGridTableView(inherited GridView);
|
|
end;
|
|
|
|
function TcxGridTableController.GetIsColumnHorzSizing: Boolean;
|
|
begin
|
|
Result := FHorzSizingColumn <> nil;
|
|
end;
|
|
|
|
function TcxGridTableController.GetSelectedColumn(Index: Integer): TcxGridColumn;
|
|
begin
|
|
Result := TcxGridColumn(FSelectedColumns[Index]);
|
|
end;
|
|
|
|
function TcxGridTableController.GetSelectedColumnCount: Integer;
|
|
begin
|
|
Result := FSelectedColumns.Count;
|
|
end;
|
|
|
|
function TcxGridTableController.GetSelectedRow(Index: Integer): TcxCustomGridRow;
|
|
begin
|
|
Result := TcxCustomGridRow(SelectedRecords[Index]);
|
|
end;
|
|
|
|
function TcxGridTableController.GetSelectedRowCount: Integer;
|
|
begin
|
|
Result := SelectedRecordCount;
|
|
end;
|
|
|
|
function TcxGridTableController.GetTopRowIndex: Integer;
|
|
begin
|
|
Result := TopRecordIndex;
|
|
end;
|
|
|
|
function TcxGridTableController.GetViewData: TcxGridViewData;
|
|
begin
|
|
Result := TcxGridViewData(inherited ViewData);
|
|
end;
|
|
|
|
function TcxGridTableController.GetViewInfo: TcxGridTableViewInfo;
|
|
begin
|
|
Result := TcxGridTableViewInfo(inherited ViewInfo);
|
|
end;
|
|
|
|
procedure TcxGridTableController.SetFocusedColumn(Value: TcxGridColumn);
|
|
begin
|
|
FocusedItem := Value;
|
|
end;
|
|
|
|
procedure TcxGridTableController.SetFocusedColumnIndex(Value: Integer);
|
|
begin
|
|
FocusedItemIndex := Value;
|
|
end;
|
|
|
|
procedure TcxGridTableController.SetFocusedRow(Value: TcxCustomGridRow);
|
|
begin
|
|
FocusedRecord := Value;
|
|
end;
|
|
|
|
procedure TcxGridTableController.SetFocusedRowIndex(Value: Integer);
|
|
begin
|
|
FocusedRecordIndex := Value;
|
|
end;
|
|
|
|
procedure TcxGridTableController.SetLeftPos(Value: Integer);
|
|
var
|
|
APrevLeftPos: Integer;
|
|
|
|
//var ft,lt:integer;
|
|
|
|
begin
|
|
CheckLeftPos(Value);
|
|
if FLeftPos <> Value then
|
|
begin
|
|
|
|
//ft:=gettickcount;
|
|
|
|
APrevLeftPos := FLeftPos;
|
|
FLeftPos := Value;
|
|
if GridView.CanOffsetHorz then
|
|
GridView.Offset(0, APrevLeftPos - FLeftPos, 0)
|
|
else
|
|
LeftPosChanged;
|
|
GridView.DoLeftPosChanged;
|
|
|
|
{site.Update;
|
|
lt := gettickcount;
|
|
application.MainForm.Caption := inttostr(lt-ft);}
|
|
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableController.SetPressedColumn(Value: TcxGridColumn);
|
|
var
|
|
R1, R2: TRect;
|
|
|
|
procedure GetUpdateRects;
|
|
|
|
function GetUpdateRect(AContainerViewInfo: TcxGridColumnContainerViewInfo;
|
|
AIndex: Integer): TRect;
|
|
begin
|
|
if AIndex <> -1 then
|
|
Result := AContainerViewInfo[AIndex].Bounds
|
|
else
|
|
Result := Rect(0, 0, 0, 0);
|
|
end;
|
|
|
|
begin
|
|
R1 := GetUpdateRect(ViewInfo.GroupByBoxViewInfo, FPressedColumn.GroupIndex);
|
|
R2 := GetUpdateRect(ViewInfo.HeaderViewInfo, FPressedColumn.VisibleIndex);
|
|
end;
|
|
|
|
procedure InvalidateRects;
|
|
begin
|
|
GridView.ViewChanged(R1);
|
|
GridView.ViewChanged(R2);
|
|
end;
|
|
|
|
begin
|
|
if FPressedColumn <> Value then
|
|
if ViewInfo.IsCalculating then
|
|
FPressedColumn := Value
|
|
else
|
|
begin
|
|
if Value = nil then GetUpdateRects;
|
|
FPressedColumn := Value;
|
|
if Value <> nil then GetUpdateRects;
|
|
InvalidateRects;
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableController.SetTopRowIndex(Value: Integer);
|
|
begin
|
|
TopRecordIndex := Value;
|
|
end;
|
|
|
|
procedure TcxGridTableController.AddSelectedColumn(AColumn: TcxGridColumn);
|
|
begin
|
|
AColumn.FSelected := True;
|
|
FSelectedColumns.Add(AColumn);
|
|
//GridView.LayoutChanged;
|
|
InvalidateSelection;
|
|
end;
|
|
|
|
procedure TcxGridTableController.RemoveSelectedColumn(AColumn: TcxGridColumn);
|
|
begin
|
|
AColumn.FSelected := False;
|
|
FSelectedColumns.Remove(AColumn);
|
|
//GridView.LayoutChanged;
|
|
InvalidateSelection;
|
|
end;
|
|
|
|
function TcxGridTableController.CanAppend(ACheckOptions: Boolean): Boolean;
|
|
begin
|
|
Result := inherited CanAppend(ACheckOptions) and not ViewData.HasNewItemRecord;
|
|
end;
|
|
|
|
function TcxGridTableController.CanDelete(ACheckOptions: Boolean): Boolean;
|
|
begin
|
|
Result := inherited CanDelete(ACheckOptions) and
|
|
not IsFilterRowFocused and not IsNewItemRowFocused;
|
|
end;
|
|
|
|
function TcxGridTableController.CanEdit: Boolean;
|
|
begin
|
|
Result := inherited CanEdit and not IsFilterRowFocused;
|
|
end;
|
|
|
|
function TcxGridTableController.CanInsert(ACheckOptions: Boolean): Boolean;
|
|
begin
|
|
Result := inherited CanInsert(ACheckOptions) and not IsFilterRowFocused;
|
|
end;
|
|
|
|
procedure TcxGridTableController.CheckCoordinates;
|
|
begin
|
|
inherited;
|
|
LeftPos := LeftPos;
|
|
end;
|
|
|
|
procedure TcxGridTableController.CheckLeftPos(var Value: Integer);
|
|
begin
|
|
if Value > ViewInfo.DataWidth - ViewInfo.ClientWidth then
|
|
Value := ViewInfo.DataWidth - ViewInfo.ClientWidth;
|
|
if Value < 0 then Value := 0;
|
|
end;
|
|
|
|
procedure TcxGridTableController.FocusedItemChanged(APrevFocusedItem: TcxCustomGridTableItem);
|
|
begin
|
|
if CellSelectionAnchor = nil then
|
|
CellSelectionAnchor := FocusedColumn;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TcxGridTableController.FocusedRecordChanged(APrevFocusedRecordIndex, AFocusedRecordIndex: Integer;
|
|
ANewItemRecordFocusingChanged: Boolean);
|
|
begin
|
|
if IsFilterRowFocused and KeepFilterRowFocusing then Exit;
|
|
inherited;
|
|
if ViewData.HasFilterRow and
|
|
((AFocusedRecordIndex <> APrevFocusedRecordIndex) or ANewItemRecordFocusingChanged) then
|
|
ViewData.FilterRow.Focused := False;
|
|
end;
|
|
|
|
function TcxGridTableController.GetDesignHitTest(AHitTest: TcxCustomGridHitTest): Boolean;
|
|
begin
|
|
Result := inherited GetDesignHitTest(AHitTest);
|
|
if not Result then
|
|
if AHitTest is TcxGridFooterCellHitTest then
|
|
Result := TcxGridFooterCellHitTest(AHitTest).SummaryItem <> nil
|
|
else
|
|
Result := AHitTest.HitTestCode in [htColumnHeader, htExpandButton, htTab,
|
|
htIndicatorHeader, htGroupSummary];
|
|
end;
|
|
|
|
function TcxGridTableController.GetFocusedRecord: TcxCustomGridRecord;
|
|
begin
|
|
if ViewData.HasFilterRow and ViewData.FilterRow.Selected then
|
|
Result := ViewData.FilterRow
|
|
else
|
|
begin
|
|
Result := inherited GetFocusedRecord;
|
|
if (Result = nil) and ViewData.HasNewItemRecord and ViewData.NewItemRow.Selected then
|
|
Result := ViewData.NewItemRow;
|
|
end;
|
|
end;
|
|
|
|
function TcxGridTableController.GetIsRecordsScrollHorizontal: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
function TcxGridTableController.GetItemsCustomizationPopupClass: TcxCustomGridItemsCustomizationPopupClass;
|
|
begin
|
|
Result := TcxGridColumnsCustomizationPopup;
|
|
end;
|
|
|
|
function TcxGridTableController.GetMaxTopRecordIndexValue: Integer;
|
|
begin
|
|
if NeedsAdditionalRowsScrolling then
|
|
Result := TopRowIndex + 1
|
|
else
|
|
Result := inherited GetMaxTopRecordIndexValue;
|
|
end;
|
|
|
|
function TcxGridTableController.GetMouseWheelScrollingKind: TcxMouseWheelScrollingKind;
|
|
begin
|
|
Result := mwskVertical;
|
|
end;
|
|
|
|
function TcxGridTableController.GetScrollBarRecordCount: Integer;
|
|
begin
|
|
Result := inherited GetScrollBarRecordCount;
|
|
if NeedsAdditionalRowsScrolling then Inc(Result);
|
|
end;
|
|
|
|
function TcxGridTableController.IsColumnFixedDuringHorzSizing(AColumn: TcxGridColumn): Boolean;
|
|
begin
|
|
Result :=
|
|
(AColumn = ForcingWidthItem) or
|
|
not ForcingWidthItem.IsLast and (AColumn.VisibleIndex < ForcingWidthItem.VisibleIndex);
|
|
end;
|
|
|
|
function TcxGridTableController.IsKeyForMultiSelect(AKey: Word; AShift: TShiftState;
|
|
AFocusedRecordChanged: Boolean): Boolean;
|
|
begin
|
|
Result := inherited IsKeyForMultiSelect(AKey, AShift, AFocusedRecordChanged) or
|
|
(AKey = VK_UP) or (AKey = VK_DOWN) or
|
|
((AKey = VK_HOME) or (AKey = VK_END)) and
|
|
(not GridView.OptionsSelection.CellSelect or (FocusedRecord = nil) or not FocusedRecord.HasCells);
|
|
end;
|
|
|
|
function TcxGridTableController.IsPixelScrollBar(AKind: TScrollBarKind): Boolean;
|
|
begin
|
|
Result := AKind = sbHorizontal;
|
|
end;
|
|
|
|
procedure TcxGridTableController.LeftPosChanged;
|
|
begin
|
|
GridView.LayoutChanged;
|
|
end;
|
|
|
|
function TcxGridTableController.NeedsAdditionalRowsScrolling(AIsCallFromMaster: Boolean = False): Boolean;
|
|
var
|
|
ALastRow: TcxGridMasterDataRow;
|
|
begin
|
|
Result := False;
|
|
if GridView.IsMaster and (ViewData.RowCount <> 0) and
|
|
((ViewInfo.VisibleRecordCount > 1) or AIsCallFromMaster) and
|
|
((ScrollBarPos = inherited GetScrollBarRecordCount - ViewInfo.VisibleRecordCount) or
|
|
AIsCallFromMaster and (ViewData.RowCount = 1)) and
|
|
(ViewData.Rows[ViewData.RowCount - 1] is TcxGridMasterDataRow) then
|
|
begin
|
|
ALastRow := ViewData.Rows[ViewData.RowCount - 1].AsMasterDataRow;
|
|
if ALastRow.Expanded and ALastRow.ActiveDetailGridViewExists then
|
|
Result :=
|
|
not ALastRow.ActiveDetailGridView.Controller.IsDataFullyVisible(True) and
|
|
TcxGridMasterDataRowViewInfo(ALastRow.ViewInfo).DetailsSiteVisible and
|
|
not TcxGridMasterDataRowViewInfo(ALastRow.ViewInfo).DetailsSiteViewInfo.HasMaxHeight;
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableController.RemoveFocus;
|
|
begin
|
|
with ViewData do
|
|
begin
|
|
if HasFilterRow then
|
|
FilterRow.Focused := False;
|
|
if HasNewItemRecord then
|
|
NewItemRow.Focused := False;
|
|
end;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TcxGridTableController.ScrollData(ADirection: TcxDirection);
|
|
begin
|
|
case ADirection of
|
|
dirLeft:
|
|
LeftPos := LeftPos - HScrollDelta;
|
|
dirRight:
|
|
LeftPos := LeftPos + HScrollDelta;
|
|
dirUp:
|
|
ScrollRecords(False, 1);
|
|
dirDown:
|
|
ScrollRecords(True, 1);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableController.SetFocusedRecord(Value: TcxCustomGridRecord);
|
|
begin
|
|
if (FocusedRecord <> Value) and ViewData.HasNewItemRecord then
|
|
if Value = ViewData.NewItemRow then
|
|
begin
|
|
Value.Selected := True;
|
|
Value := ViewData.NewItemRow;
|
|
end
|
|
else
|
|
if (FocusedRecord = ViewData.NewItemRow) and (Value = nil) then
|
|
FocusedRecord.Selected := False;
|
|
|
|
if ViewData.HasFilterRow then
|
|
if Value = ViewData.FilterRow then
|
|
if FocusedRecord = Value then
|
|
Exit
|
|
else
|
|
begin
|
|
ViewData.FilterRow.Selected := True;
|
|
Value := ViewData.GetRecordByIndex(FocusedRecordindex);
|
|
end
|
|
else
|
|
if FocusedRow = ViewData.FilterRow then
|
|
begin
|
|
FocusedRow.Selected := False;
|
|
if Value = nil then Exit;
|
|
end;
|
|
|
|
inherited;
|
|
end;
|
|
|
|
procedure TcxGridTableController.ShowNextPage;
|
|
begin
|
|
if TopRecordIndex <> -1 then
|
|
TopRecordIndex := TopRecordIndex + Max(1, ViewInfo.VisibleRecordCount - 1);
|
|
end;
|
|
|
|
procedure TcxGridTableController.ShowPrevPage;
|
|
var
|
|
AVisibleRowCount: Integer;
|
|
begin
|
|
if TopRecordIndex = -1 then Exit;
|
|
if TopRecordIndex = 0 then
|
|
if DataController.IsGridMode then
|
|
AVisibleRowCount := ViewInfo.VisibleRecordCount
|
|
else
|
|
Exit
|
|
else
|
|
begin
|
|
AVisibleRowCount := GetVisibleRecordCount(TopRecordIndex, False);
|
|
if DataController.IsGridMode and (TopRecordIndex - (AVisibleRowCount - 1) = 0) and
|
|
(AVisibleRowCount < ViewInfo.VisibleRecordCount) then
|
|
AVisibleRowCount := ViewInfo.VisibleRecordCount;
|
|
end;
|
|
if AVisibleRowCount = 1 then
|
|
TopRecordIndex := TopRecordIndex - 1
|
|
else
|
|
if DataController.IsGridMode then
|
|
TopRecordIndex := TopRecordIndex - (AVisibleRowCount - 1)
|
|
else
|
|
InternalTopRecordIndex := TopRecordIndex - (AVisibleRowCount - 1);
|
|
end;
|
|
|
|
function TcxGridTableController.CanScrollData(ADirection: TcxDirection): Boolean;
|
|
var
|
|
Value: Integer;
|
|
begin
|
|
case ADirection of
|
|
dirLeft:
|
|
Result := LeftPos <> 0;
|
|
dirRight:
|
|
begin
|
|
Value := LeftPos + HScrollDelta;
|
|
CheckLeftPos(Value);
|
|
Result := LeftPos <> Value;
|
|
end;
|
|
dirUp:
|
|
Result := TopRowIndex <> 0;
|
|
dirDown:
|
|
begin
|
|
Value := TopRowIndex + 1;
|
|
CheckTopRecordIndex(Value);
|
|
Result := TopRowIndex <> Value;
|
|
end;
|
|
else
|
|
Result := False;
|
|
end;
|
|
end;
|
|
|
|
function TcxGridTableController.CanPostponeRecordSelection: Boolean;
|
|
begin
|
|
Result := inherited CanPostponeRecordSelection and not CellMultiSelect;
|
|
end;
|
|
|
|
function TcxGridTableController.CanProcessMultiSelect(AHitTest: TcxCustomGridHitTest;
|
|
AShift: TShiftState): Boolean;
|
|
begin
|
|
Result := inherited CanProcessMultiSelect(AHitTest, AShift) and
|
|
not (IsClickableRecordHitTest(AHitTest) and
|
|
TcxCustomGridRow(TcxGridRecordHitTest(AHitTest).GridRecord).IsFilterRow) and
|
|
(not CellMultiSelect or (ssLeft in AShift) or
|
|
not (AHitTest.ViewInfo is TcxGridTableDataCellViewInfo) or
|
|
not TcxGridTableDataCellViewInfo(AHitTest.ViewInfo).Selected);
|
|
end;
|
|
|
|
procedure TcxGridTableController.DoMouseNormalSelection(AHitTest: TcxCustomGridHitTest);
|
|
begin
|
|
inherited;
|
|
if CellMultiSelect and (AHitTest is TcxGridRowIndicatorHitTest) then
|
|
SelectAllColumns;
|
|
end;
|
|
|
|
procedure TcxGridTableController.DoMouseRangeSelection(AClearSelection: Boolean = True;
|
|
AData: TObject = nil);
|
|
begin
|
|
inherited;
|
|
if CellMultiSelect then
|
|
if AData is TcxGridRowIndicatorHitTest then
|
|
SelectAllColumns
|
|
else
|
|
DoRangeCellSelection;
|
|
end;
|
|
|
|
procedure TcxGridTableController.DoNormalSelection;
|
|
var
|
|
ASelectionChanged: Boolean;
|
|
begin
|
|
ASelectionChanged := False;
|
|
BeginUpdate;
|
|
try
|
|
inherited;
|
|
if CellMultiSelect then
|
|
begin
|
|
if (SelectedColumnCount = 1) and SelectedColumns[0].Focused then Exit;
|
|
ClearCellSelection;
|
|
if FocusedColumn <> nil then
|
|
begin
|
|
FocusedColumn.Selected := True;
|
|
CellSelectionAnchor := FocusedColumn;
|
|
end;
|
|
ASelectionChanged := True;
|
|
end;
|
|
finally
|
|
EndUpdate;
|
|
end;
|
|
if ASelectionChanged then GridView.DoSelectionChanged;
|
|
end;
|
|
|
|
procedure TcxGridTableController.MultiSelectKeyDown(var Key: Word; Shift: TShiftState);
|
|
begin
|
|
if CellMultiSelect then
|
|
if ssShift in Shift then
|
|
DoRangeSelection
|
|
else
|
|
DoNormalSelectionWithAnchor
|
|
else
|
|
inherited;
|
|
end;
|
|
|
|
function TcxGridTableController.SupportsAdditiveSelection: Boolean;
|
|
begin
|
|
Result := not CellMultiSelect;
|
|
end;
|
|
|
|
function TcxGridTableController.SupportsRecordSelectionToggling: Boolean;
|
|
begin
|
|
Result := not CellMultiSelect;
|
|
end;
|
|
|
|
function TcxGridTableController.DefocusSpecialRow: Boolean;
|
|
|
|
function FocusTopRow: Boolean;
|
|
begin
|
|
if TopRecordIndex <> -1 then
|
|
begin
|
|
FocusedRecordIndex := TopRecordIndex;
|
|
Result := FocusedRecordIndex = TopRecordIndex;
|
|
end
|
|
else
|
|
Result := False;
|
|
end;
|
|
|
|
begin
|
|
Result := IsFilterRowFocused;
|
|
if Result then
|
|
if ViewData.HasNewItemRecord then
|
|
begin
|
|
ViewData.NewItemRow.Focused := True;
|
|
Result := ViewData.NewItemRow.Focused;
|
|
end
|
|
else
|
|
begin
|
|
Result := FocusTopRow;
|
|
if Result then
|
|
ViewData.FilterRow.Focused := False;
|
|
end
|
|
else
|
|
Result := IsNewItemRowFocused and FocusTopRow;
|
|
end;
|
|
|
|
function TcxGridTableController.FocusSpecialRow: Boolean;
|
|
begin
|
|
Result := ViewData.HasNewItemRecord and not ViewData.NewItemRow.Focused;
|
|
if Result then
|
|
begin
|
|
Result := not IsFilterRowFocused and IsStart;
|
|
if Result then
|
|
ViewData.NewItemRow.Focused := True;
|
|
end
|
|
else
|
|
begin
|
|
Result := ViewData.HasFilterRow and not ViewData.FilterRow.Focused;
|
|
if Result then
|
|
begin
|
|
Result := ViewData.HasNewItemRecord or IsStart;
|
|
if Result then
|
|
ViewData.FilterRow.Focused := True;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableController.FilterRowFocusChanged;
|
|
begin
|
|
inherited FocusedRecordChanged(FocusedRecordIndex, FocusedRecordIndex,
|
|
NewItemRecordFocused);
|
|
GridView.RefreshNavigators;
|
|
end;
|
|
|
|
procedure TcxGridTableController.FilterRowFocusChanging(AValue: Boolean);
|
|
var
|
|
AFocusedRecordIndex: Integer;
|
|
begin
|
|
if AValue then
|
|
begin
|
|
AFocusedRecordIndex := -1;
|
|
CheckEditing(AFocusedRecordIndex, False);
|
|
end
|
|
else
|
|
EditingController.HideEdit(not GridView.IsDestroying);
|
|
end;
|
|
|
|
procedure TcxGridTableController.DoPullFocusingScrolling(ADirection: TcxDirection);
|
|
begin
|
|
if ADirection in [dirLeft, dirRight] then
|
|
FocusNextCell(ADirection = dirRight, True, False);
|
|
inherited;
|
|
end;
|
|
|
|
function TcxGridTableController.GetPullFocusingScrollingDirection(X, Y: Integer;
|
|
out ADirection: TcxDirection): Boolean;
|
|
var
|
|
R: TRect;
|
|
begin
|
|
Result := inherited GetPullFocusingScrollingDirection(X, Y, ADirection);
|
|
if not Result then
|
|
begin
|
|
R := ViewInfo.ScrollableAreaBoundsVert;
|
|
if X < R.Left then
|
|
begin
|
|
ADirection := dirLeft;
|
|
Result := True;
|
|
end;
|
|
if X >= R.Right then
|
|
begin
|
|
ADirection := dirRight;
|
|
Result := True;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function TcxGridTableController.SupportsPullFocusing: Boolean;
|
|
begin
|
|
Result := inherited SupportsPullFocusing or CellMultiSelect;
|
|
end;
|
|
|
|
function TcxGridTableController.GetDragOpenInfo(AHitTest: TcxCustomGridHitTest): TcxCustomGridDragOpenInfo;
|
|
begin
|
|
Result := inherited GetDragOpenInfo(AHitTest);
|
|
if (Result = nil) and (AHitTest.HitTestCode = htTab) then
|
|
with TcxGridDetailsSiteTabHitTest(AHitTest) do
|
|
Result := TcxGridDragOpenInfoMasterDataRowTab.Create(Level, Owner as TcxGridMasterDataRow);
|
|
end;
|
|
|
|
function TcxGridTableController.GetDragScrollDirection(X, Y: Integer): TcxDirection;
|
|
var
|
|
R: TRect;
|
|
begin
|
|
Result := dirNone;
|
|
|
|
R := ViewInfo.ScrollableAreaBoundsVert;
|
|
if PtInRect(R, Point(X, Y)) then
|
|
if Y < R.Top + ScrollHotZoneWidth then
|
|
Result := dirUp
|
|
else
|
|
if Y >= R.Bottom - ScrollHotZoneWidth then
|
|
Result := dirDown;
|
|
|
|
if Result = dirNone then
|
|
begin
|
|
R := ViewInfo.ScrollableAreaBoundsHorz;
|
|
if PtInRect(R, Point(X, Y)) then
|
|
if X < R.Left + ScrollHotZoneWidth then
|
|
Result := dirLeft
|
|
else
|
|
if X >= R.Right - ScrollHotZoneWidth then
|
|
Result := dirRight;
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableController.CheckCustomizationFormBounds(var R: TRect);
|
|
var
|
|
AHeaderBottomBound: Integer;
|
|
begin
|
|
inherited;
|
|
AHeaderBottomBound := Site.ClientToScreen(ViewInfo.HeaderViewInfo.Bounds.BottomRight).Y;
|
|
if R.Top < AHeaderBottomBound then
|
|
OffsetRect(R, 0, AHeaderBottomBound - R.Top);
|
|
end;
|
|
|
|
function TcxGridTableController.GetColumnHeaderDragAndDropObjectClass: TcxGridColumnHeaderMovingObjectClass;
|
|
begin
|
|
Result := TcxGridColumnHeaderMovingObject;
|
|
end;
|
|
|
|
function TcxGridTableController.GetCustomizationFormClass: TcxCustomGridCustomizationFormClass;
|
|
begin
|
|
Result := TcxGridTableCustomizationForm;
|
|
end;
|
|
|
|
function TcxGridTableController.CanProcessCellMultiSelect(APrevFocusedColumn: TcxGridColumn): Boolean;
|
|
begin
|
|
Result := CellMultiSelect and (FocusedColumn <> APrevFocusedColumn);
|
|
end;
|
|
|
|
procedure TcxGridTableController.CellMultiSelectKeyDown(var Key: Word; Shift: TShiftState);
|
|
begin
|
|
if ssShift in Shift then
|
|
DoRangeCellSelection
|
|
else
|
|
DoNormalCellSelection;
|
|
end;
|
|
|
|
procedure TcxGridTableController.DoNormalCellSelection;
|
|
begin
|
|
DoNormalSelection;
|
|
SetSelectionAnchor(FocusedRowIndex);
|
|
//GridView.DoSelectionChanged;
|
|
end;
|
|
|
|
procedure TcxGridTableController.DoRangeCellSelection;
|
|
begin
|
|
SelectColumns(FCellSelectionAnchor, FocusedColumn);
|
|
end;
|
|
|
|
function TcxGridTableController.GetCellMultiSelect: Boolean;
|
|
begin
|
|
Result := GridView.OptionsSelection.CellMultiSelect;
|
|
end;
|
|
|
|
procedure TcxGridTableController.AddBeginsWithMask(var AValue: Variant);
|
|
begin
|
|
if VarIsStr(AValue) and (AValue <> '') and (GetBeginsWithMaskPos(AValue) = 0) then
|
|
AValue := AValue + DataController.Filter.PercentWildcard;
|
|
end;
|
|
|
|
procedure TcxGridTableController.RemoveBeginsWithMask(var AValue: Variant);
|
|
var
|
|
APos: Integer;
|
|
S: string;
|
|
begin
|
|
if VarIsStr(AValue) then
|
|
begin
|
|
APos := GetBeginsWithMaskPos(AValue);
|
|
if APos <> 0 then
|
|
begin
|
|
S := AValue;
|
|
Delete(S, APos, Length(DataController.Filter.PercentWildcard));
|
|
AValue := S;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function TcxGridTableController.GetBeginsWithMaskPos(const AValue: string): Integer;
|
|
begin
|
|
if (Length(AValue) = 0) or (AValue[Length(AValue)] <> DataController.Filter.PercentWildcard) then
|
|
Result := 0
|
|
else
|
|
Result := Length(AValue);
|
|
end;
|
|
|
|
function TcxGridTableController.GetEditingControllerClass: TcxGridEditingControllerClass;
|
|
begin
|
|
Result := TcxGridTableEditingController;
|
|
end;
|
|
|
|
procedure TcxGridTableController.CheckScrolling(const P: TPoint);
|
|
var
|
|
R: TRect;
|
|
begin
|
|
R := ViewInfo.ScrollableAreaBoundsHorz;
|
|
if PtInRect(R, P) then
|
|
if P.X < R.Left + ScrollHotZoneWidth then
|
|
ScrollDirection := dirLeft
|
|
else
|
|
if R.Right - ScrollHotZoneWidth <= P.X then
|
|
ScrollDirection := dirRight
|
|
else
|
|
ScrollDirection := dirNone
|
|
else
|
|
ScrollDirection := dirNone;
|
|
end;
|
|
|
|
procedure TcxGridTableController.ClearGrouping;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
BeginUpdate;
|
|
try
|
|
for I := 0 to GridView.GroupedColumnCount - 1 do
|
|
GridView.GroupedColumns[I].Visible := True;
|
|
DataController.Groups.ClearGrouping;
|
|
finally
|
|
EndUpdate;
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableController.ClearSelection;
|
|
begin
|
|
ClearCellSelection;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TcxGridTableController.DoCancelMode;
|
|
begin
|
|
inherited;
|
|
PressedColumn := nil;
|
|
end;
|
|
|
|
function TcxGridTableController.IsFilterRowFocused: Boolean;
|
|
begin
|
|
Result := ViewData.HasFilterRow and ViewData.FilterRow.Focused;
|
|
end;
|
|
|
|
function TcxGridTableController.IsNewItemRowFocused: Boolean;
|
|
begin
|
|
Result := ViewData.HasNewItemRecord and ViewData.NewItemRow.Focused;
|
|
end;
|
|
|
|
function TcxGridTableController.IsSpecialRowFocused: Boolean;
|
|
begin
|
|
Result := IsFilterRowFocused or IsNewItemRowFocused;
|
|
end;
|
|
|
|
procedure TcxGridTableController.MakeItemVisible(AItem: TcxCustomGridTableItem);
|
|
var
|
|
R: TRect;
|
|
|
|
function GetColumnBounds: TRect;
|
|
begin
|
|
Result := ViewInfo.HeaderViewInfo[AItem.VisibleIndex].Bounds;
|
|
end;
|
|
|
|
begin
|
|
if (AItem = nil) or (AItem.VisibleIndex = -1) or
|
|
(AItem.VisibleIndex >= ViewInfo.HeaderViewInfo.Count){!!!} then
|
|
Exit;
|
|
MakeFocusedRecordVisible;
|
|
if TcxGridColumn(AItem).CanScroll then
|
|
begin
|
|
R := GetColumnBounds;
|
|
with ViewInfo.ScrollableAreaBoundsHorz do
|
|
if R.Right - R.Left >= Right - Left then
|
|
LeftPos := LeftPos - (Left - R.Left)
|
|
else
|
|
begin
|
|
if R.Right > Right then
|
|
begin
|
|
LeftPos := LeftPos + (R.Right - Right);
|
|
R := GetColumnBounds;
|
|
end;
|
|
if R.Left < Left then
|
|
LeftPos := LeftPos - (Left - R.Left);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableController.SelectAll;
|
|
begin
|
|
BeginUpdate;
|
|
try
|
|
inherited;
|
|
if CellMultiSelect then
|
|
SelectAllColumns;
|
|
finally
|
|
EndUpdate;
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableController.InitScrollBarsParameters;
|
|
begin
|
|
Controller.SetScrollBarInfo(sbHorizontal, 0, ViewInfo.DataWidth - 1,
|
|
HScrollDelta, ViewInfo.ClientWidth, LeftPos, True, CanHScrollBarHide);
|
|
Controller.SetScrollBarInfo(sbVertical, 0, ScrollBarRecordCount - 1,
|
|
1, ViewInfo.VisibleRecordCount, ScrollBarPos, True, True);
|
|
end;
|
|
|
|
function TcxGridTableController.IsDataFullyVisible(AIsCallFromMaster: Boolean = False): Boolean;
|
|
begin
|
|
Result := inherited IsDataFullyVisible(AIsCallFromMaster) and
|
|
ViewInfo.RecordsViewInfo.IsFirstRowFullyVisible;
|
|
if Result and GridView.IsMaster then
|
|
Result := not NeedsAdditionalRowsScrolling(AIsCallFromMaster);
|
|
end;
|
|
|
|
procedure TcxGridTableController.Scroll(AScrollBarKind: TScrollBarKind; AScrollCode: TScrollCode;
|
|
var AScrollPos: Integer);
|
|
|
|
procedure ScrollHorizontal;
|
|
begin
|
|
case AScrollCode of
|
|
scLineUp:
|
|
ScrollData(dirLeft);
|
|
scLineDown:
|
|
ScrollData(dirRight);
|
|
scPageUp:
|
|
LeftPos := LeftPos - ViewInfo.ScrollableAreaWidth;
|
|
scPageDown:
|
|
LeftPos := LeftPos + ViewInfo.ScrollableAreaWidth;
|
|
scTrack:
|
|
LeftPos := AScrollPos;
|
|
end;
|
|
AScrollPos := LeftPos;
|
|
end;
|
|
|
|
procedure ScrollVertical;
|
|
begin
|
|
case AScrollCode of
|
|
scLineUp:
|
|
ScrollData(dirUp);
|
|
scLineDown:
|
|
ScrollData(dirDown);
|
|
scPageUp:
|
|
ScrollPage(False);
|
|
scPageDown:
|
|
ScrollPage(True);
|
|
scTrack:
|
|
if not DataController.IsGridMode then
|
|
ScrollBarPos := AScrollPos;
|
|
scPosition:
|
|
if DataController.IsGridMode then
|
|
ScrollBarPos := AScrollPos;
|
|
end;
|
|
AScrollPos := ScrollBarPos;
|
|
end;
|
|
|
|
begin
|
|
case AScrollBarKind of
|
|
sbHorizontal:
|
|
ScrollHorizontal;
|
|
sbVertical:
|
|
ScrollVertical;
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableController.EndDragAndDrop(Accepted: Boolean);
|
|
begin
|
|
PressedColumn := nil;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TcxGridTableController.DoKeyDown(var Key: Word; Shift: TShiftState);
|
|
var
|
|
AFocusedColumn: TcxGridColumn;
|
|
begin
|
|
AFocusedColumn := FocusedColumn;
|
|
inherited;
|
|
if CanProcessCellMultiSelect(AFocusedColumn) then
|
|
CellMultiSelectKeyDown(Key, Shift);
|
|
end;
|
|
|
|
procedure TcxGridTableController.KeyDown(var Key: Word; Shift: TShiftState);
|
|
|
|
//var ft,lt:integer;
|
|
|
|
var
|
|
AFocusedRowIndex: Integer;
|
|
begin
|
|
case Key of
|
|
VK_LEFT, VK_RIGHT:
|
|
if FocusNextCell(Key = VK_RIGHT) then Exit;//Key := 0;
|
|
VK_PRIOR:
|
|
if FocusSpecialRow then
|
|
Exit
|
|
else
|
|
if IsSpecialRowFocused then
|
|
begin
|
|
Key := 0;
|
|
Exit;
|
|
end;
|
|
VK_NEXT:
|
|
if DefocusSpecialRow then Exit;
|
|
end;
|
|
inherited;
|
|
case Key of
|
|
VK_LEFT:
|
|
ScrollData(dirLeft);
|
|
VK_RIGHT:
|
|
ScrollData(dirRight);
|
|
VK_UP:
|
|
{
|
|
begin
|
|
ft:=gettickcount;
|
|
}
|
|
if not FocusSpecialRow then
|
|
begin
|
|
if IsSpecialRowFocused then
|
|
AFocusedRowIndex := -1
|
|
else
|
|
AFocusedRowIndex := FocusedRowIndex;
|
|
if not FocusNextRecord(AFocusedRowIndex, False, False, not (ssShift in Shift),
|
|
not (ssShift in Shift)) and IsSpecialRowFocused then
|
|
Key := 0;
|
|
if not MultiSelect then Site.Update;
|
|
end;
|
|
{
|
|
lt:=gettickcount;
|
|
application.mainform.Caption := inttostr(lt-ft);
|
|
end;
|
|
}
|
|
VK_DOWN:
|
|
{
|
|
begin
|
|
ft:=gettickcount;
|
|
}
|
|
if not DefocusSpecialRow then
|
|
begin
|
|
FocusNextRecord(FocusedRowIndex, True, False, not (ssShift in Shift), not (ssShift in Shift));
|
|
if not MultiSelect then Site.Update;
|
|
end;
|
|
{
|
|
lt:=gettickcount;
|
|
application.mainform.Caption := inttostr(lt-ft);
|
|
end;
|
|
}
|
|
VK_HOME:
|
|
if (ssCtrl in Shift) or not FocusedRecordHasCells(True) then
|
|
GoToFirst(False)
|
|
else
|
|
FocusNextItem(-1, True, False, False);
|
|
VK_END:
|
|
if (ssCtrl in Shift) or not FocusedRecordHasCells(True) then
|
|
GoToLast(False, False)
|
|
else
|
|
FocusNextItem(-1, False, True, False);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableController.MouseUp(Button: TMouseButton; Shift: TShiftState;
|
|
X, Y: Integer);
|
|
|
|
procedure ProcessSorting;
|
|
|
|
procedure RemoveColumnSorting;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
if GridView.OptionsCustomize.GroupBySorting then
|
|
with PressedColumn do
|
|
if (GroupIndex = 0) and CanGroup then
|
|
begin
|
|
GroupIndex := -1;
|
|
Visible := True;
|
|
end;
|
|
PressedColumn.SortOrder := soNone;
|
|
if GridView.OptionsCustomize.GroupBySorting then
|
|
for I := 0 to GridView.SortedItemCount - 1 do
|
|
with TcxGridColumn(GridView.SortedItems[I]) do
|
|
if CanGroup then
|
|
begin
|
|
GroupIndex := 0;
|
|
Break;
|
|
end;
|
|
end;
|
|
|
|
procedure AddColumnSorting;
|
|
var
|
|
ASortOrder: TcxGridSortOrder;
|
|
begin
|
|
if PressedColumn.SortOrder = soAscending then
|
|
ASortOrder := soDescending
|
|
else
|
|
ASortOrder := soAscending;
|
|
if not (ssShift in Shift) and (PressedColumn.GroupIndex = -1) then
|
|
begin
|
|
if GridView.OptionsCustomize.GroupBySorting and PressedColumn.CanGroup then
|
|
ClearGrouping;
|
|
DataController.ClearSorting(True);
|
|
end;
|
|
PressedColumn.SortOrder := ASortOrder;
|
|
if GridView.OptionsCustomize.GroupBySorting and (PressedColumn.SortIndex = 0) and
|
|
(GridView.GroupedColumnCount = 0) and PressedColumn.CanGroup then
|
|
PressedColumn.GroupIndex := 0;
|
|
end;
|
|
|
|
begin
|
|
if not PressedColumn.CanSort then Exit;
|
|
try
|
|
ShowHourglassCursor;
|
|
BeginUpdate;
|
|
try
|
|
if ssCtrl in Shift then
|
|
RemoveColumnSorting
|
|
else
|
|
AddColumnSorting;
|
|
finally
|
|
EndUpdate;
|
|
HideHourglassCursor;
|
|
end;
|
|
finally
|
|
MakeFocusedRecordVisible;
|
|
DesignerModified;
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
inherited;
|
|
if Site.IsMouseInPressedArea(X, Y) and (PressedColumn <> nil) then
|
|
ProcessSorting;
|
|
PressedColumn := nil;
|
|
end;
|
|
|
|
procedure TcxGridTableController.ClearCellSelection;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
BeginUpdate;
|
|
try
|
|
for I := SelectedColumnCount - 1 downto 0 do
|
|
SelectedColumns[I].Selected := False;
|
|
finally
|
|
EndUpdate;
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableController.SelectAllColumns;
|
|
begin
|
|
SelectColumns(nil, nil);
|
|
end;
|
|
|
|
procedure TcxGridTableController.SelectCells(AFromColumn, AToColumn: TcxGridColumn;
|
|
AFromRowIndex, AToRowIndex: Integer);
|
|
begin
|
|
BeginUpdate;
|
|
try
|
|
if AFromRowIndex = -1 then AFromRowIndex := 0;
|
|
if AToRowIndex = -1 then AToRowIndex := DataController.RowCount - 1;
|
|
DataController.ClearSelection;
|
|
DataController.SelectRows(AFromRowIndex, AToRowIndex);
|
|
|
|
SelectColumns(AFromColumn, AToColumn);
|
|
finally
|
|
EndUpdate;
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableController.SelectColumns(AFromColumn, AToColumn: TcxGridColumn);
|
|
|
|
procedure GetNewSelectedColumns(AColumns: TList);
|
|
var
|
|
AStartIndex, AFinishIndex, I: Integer;
|
|
begin
|
|
AStartIndex := AColumns.IndexOf(AFromColumn);
|
|
if AStartIndex = -1 then AStartIndex := 0;
|
|
AFinishIndex := AColumns.IndexOf(AToColumn);
|
|
if AFinishIndex = -1 then
|
|
AFinishIndex := AColumns.Count - 1;
|
|
if (AStartIndex > AFinishIndex) and (AFinishIndex <> -1) then
|
|
begin
|
|
I := AStartIndex;
|
|
AStartIndex := AFinishIndex;
|
|
AFinishIndex := I;
|
|
end;
|
|
|
|
AColumns.Count := AFinishIndex + 1;
|
|
for I := 0 to AStartIndex - 1 do
|
|
AColumns.Delete(0);
|
|
end;
|
|
|
|
function IsSelectionChanged(ANewSelectedColumns: TList): Boolean;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
Result := ANewSelectedColumns.Count <> SelectedColumnCount;
|
|
if not Result then
|
|
for I := 0 to ANewSelectedColumns.Count - 1 do
|
|
begin
|
|
Result := not TcxGridColumn(ANewSelectedColumns[I]).Selected;
|
|
if Result then Break;
|
|
end;
|
|
end;
|
|
|
|
var
|
|
ASelectionChanged: Boolean;
|
|
AColumns: TList;
|
|
I: Integer;
|
|
begin
|
|
ASelectionChanged := False;
|
|
BeginUpdate;
|
|
AColumns := TList.Create;
|
|
try
|
|
GridView.GetVisibleItemsList(AColumns);
|
|
GetNewSelectedColumns(AColumns);
|
|
ASelectionChanged := IsSelectionChanged(AColumns);
|
|
|
|
if ASelectionChanged then
|
|
begin
|
|
ClearCellSelection;
|
|
for I := 0 to AColumns.Count - 1 do
|
|
TcxGridColumn(AColumns[I]).Selected := True;
|
|
end;
|
|
finally
|
|
AColumns.Free;
|
|
EndUpdate;
|
|
if ASelectionChanged then
|
|
GridView.DoSelectionChanged;
|
|
end;
|
|
end;
|
|
|
|
{ TcxGridColumnContainerPainter }
|
|
|
|
function TcxGridColumnContainerPainter.GetViewInfo: TcxGridColumnContainerViewInfo;
|
|
begin
|
|
Result := TcxGridColumnContainerViewInfo(inherited ViewInfo);
|
|
end;
|
|
|
|
procedure TcxGridColumnContainerPainter.DrawContent;
|
|
var
|
|
AClipRegion: TcxRegion;
|
|
begin
|
|
AClipRegion := Canvas.GetClipRegion;
|
|
try
|
|
Canvas.IntersectClipRect(ViewInfo.Bounds);
|
|
if DrawItemsFirst then
|
|
begin
|
|
DrawItems;
|
|
inherited;
|
|
end
|
|
else
|
|
begin
|
|
inherited;
|
|
DrawItems;
|
|
end
|
|
finally
|
|
Canvas.SetClipRegion(AClipRegion, roSet);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridColumnContainerPainter.DrawItems;
|
|
var
|
|
I: Integer;
|
|
AViewInfo: TcxGridColumnHeaderViewInfo;
|
|
begin
|
|
for I := 0 to ViewInfo.Count - 1 do
|
|
begin
|
|
AViewInfo := ViewInfo.InternalItems[I];
|
|
if AViewInfo <> nil then AViewInfo.Paint;
|
|
end;
|
|
end;
|
|
|
|
function TcxGridColumnContainerPainter.DrawItemsFirst: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
function TcxGridColumnContainerPainter.ExcludeFromClipRect: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
{ TcxGridColumnHeaderAreaPainter }
|
|
|
|
function TcxGridColumnHeaderAreaPainter.GetViewInfo: TcxGridColumnHeaderAreaViewInfo;
|
|
begin
|
|
Result := TcxGridColumnHeaderAreaViewInfo(inherited ViewInfo);
|
|
end;
|
|
|
|
function TcxGridColumnHeaderAreaPainter.ExcludeFromClipRect: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
{ TcxGridColumnHeaderSortingMarkPainter }
|
|
|
|
procedure TcxGridColumnHeaderSortingMarkPainter.Paint;
|
|
begin
|
|
ViewInfo.LookAndFeelPainter.DrawSortingMark(Canvas, ViewInfo.Bounds,
|
|
TcxGridColumnHeaderSortingMarkViewInfo(ViewInfo).SortOrder = soAscending);
|
|
end;
|
|
|
|
{ TcxGridColumnHeaderFilterButtonPainter }
|
|
|
|
function TcxGridColumnHeaderFilterButtonPainter.GetViewInfo: TcxGridColumnHeaderFilterButtonViewInfo;
|
|
begin
|
|
Result := TcxGridColumnHeaderFilterButtonViewInfo(inherited ViewInfo);
|
|
end;
|
|
|
|
procedure TcxGridColumnHeaderFilterButtonPainter.Paint;
|
|
begin
|
|
ViewInfo.LookAndFeelPainter.DrawFilterDropDownButton(Canvas, ViewInfo.Bounds,
|
|
ViewInfo.ButtonState, ViewInfo.Active);
|
|
end;
|
|
|
|
{ TcxGridColumnHeaderGlyphPainter }
|
|
|
|
function TcxGridColumnHeaderGlyphPainter.GetViewInfo: TcxGridColumnHeaderGlyphViewInfo;
|
|
begin
|
|
Result := TcxGridColumnHeaderGlyphViewInfo(inherited ViewInfo);
|
|
end;
|
|
|
|
procedure TcxGridColumnHeaderGlyphPainter.Paint;
|
|
begin
|
|
with ViewInfo.Bounds do
|
|
Canvas.DrawGlyph(Left, Top, ViewInfo.Glyph);
|
|
end;
|
|
|
|
{ TcxGridColumnHeaderPainter }
|
|
|
|
function TcxGridColumnHeaderPainter.GetViewInfo: TcxGridColumnHeaderViewInfo;
|
|
begin
|
|
Result := TcxGridColumnHeaderViewInfo(inherited ViewInfo);
|
|
end;
|
|
|
|
procedure TcxGridColumnHeaderPainter.DrawAreas;
|
|
var
|
|
AClipRegion: TcxRegion;
|
|
I: Integer;
|
|
begin
|
|
AClipRegion := Canvas.GetClipRegion;
|
|
try
|
|
for I := 0 to ViewInfo.AreaViewInfoCount - 1 do
|
|
ViewInfo.AreaViewInfos[I].Paint(Canvas);
|
|
finally
|
|
Canvas.SetClipRegion(AClipRegion, roSet);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridColumnHeaderPainter.DrawBorders;
|
|
begin
|
|
// inherited;
|
|
end;
|
|
|
|
procedure TcxGridColumnHeaderPainter.DrawContent;
|
|
const
|
|
States: array[TcxGridCellState] of TcxButtonState = (cxbsNormal, cxbsHot, cxbsPressed);
|
|
var
|
|
AState: TcxButtonState;
|
|
begin
|
|
with ViewInfo do
|
|
begin
|
|
if IsMainCanvasInUse then
|
|
begin
|
|
AState := States[State];
|
|
if IsPressed then AState := cxbsPressed;
|
|
end
|
|
else
|
|
AState := cxbsNormal;
|
|
LookAndFeelPainter.DrawHeader(Self.Canvas, Bounds, TextAreaBounds, Neighbors,
|
|
Borders, AState, AlignmentHorz, AlignmentVert, MultiLinePainting, ShowEndEllipsis,
|
|
Text, Params.Font, Params.TextColor, Params.Color,
|
|
ViewInfo.GridViewInfo.HeaderViewInfo.DrawColumnBackgroundHandler, Column.IsMostRight,
|
|
ViewInfo.Container.Kind = ckGroupByBox);
|
|
end;
|
|
DrawAreas;
|
|
end;
|
|
|
|
procedure TcxGridColumnHeaderPainter.DrawPressed;
|
|
begin
|
|
with ViewInfo do
|
|
LookAndFeelPainter.DrawHeaderPressed(Self.Canvas, Bounds);
|
|
end;
|
|
|
|
function TcxGridColumnHeaderPainter.ExcludeFromClipRect: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
procedure TcxGridColumnHeaderPainter.Paint;
|
|
begin
|
|
inherited;
|
|
if ViewInfo.IsPressed and IsMainCanvasInUse then DrawPressed;
|
|
end;
|
|
|
|
{ TcxGridHeaderPainter }
|
|
|
|
function TcxGridHeaderPainter.DrawItemsFirst: Boolean;
|
|
begin
|
|
Result := ViewInfo.LookAndFeelPainter.HeaderDrawCellsFirst;
|
|
end;
|
|
|
|
{ TcxGridGroupByBoxPainter }
|
|
|
|
procedure TcxGridGroupByBoxPainter.DrawBackground(const R: TRect);
|
|
begin
|
|
with ViewInfo do
|
|
LookAndFeelPainter.DrawGroupByBox(Canvas, R, Transparent, Params.Color,
|
|
BackgroundBitmap);
|
|
end;
|
|
|
|
procedure TcxGridGroupByBoxPainter.DrawContent;
|
|
var
|
|
I: Integer;
|
|
J: Boolean;
|
|
R: TRect;
|
|
begin
|
|
inherited;
|
|
Canvas.Brush.Color := GroupByBoxLineColor;
|
|
for I := 0 to ViewInfo.Count - 2 do
|
|
for J := Low(J) to High(J) do
|
|
begin
|
|
R := TcxGridGroupByBoxViewInfo(ViewInfo).LinkLineBounds[I, J];
|
|
with Canvas do
|
|
begin
|
|
FillRect(R);
|
|
//ExcludeClipRect(R);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function TcxGridGroupByBoxPainter.DrawItemsFirst: Boolean;
|
|
begin
|
|
Result := ViewInfo.LookAndFeelPainter.HeaderDrawCellsFirst;
|
|
end;
|
|
|
|
{ TcxGridFooterCellPainter }
|
|
|
|
procedure TcxGridFooterCellPainter.DrawBorders;
|
|
begin
|
|
// inherited;
|
|
end;
|
|
|
|
procedure TcxGridFooterCellPainter.DrawContent;
|
|
begin
|
|
with ViewInfo do
|
|
LookAndFeelPainter.DrawFooterCell(Self.Canvas, Bounds, AlignmentHorz,
|
|
AlignmentVert, MultiLinePainting, Text, Params.Font, Params.TextColor, Params.Color,
|
|
DrawBackgroundHandler);
|
|
end;
|
|
|
|
{ TcxGridFooterPainter }
|
|
|
|
function TcxGridFooterPainter.GetViewInfo: TcxGridFooterViewInfo;
|
|
begin
|
|
Result := TcxGridFooterViewInfo(inherited ViewInfo);
|
|
end;
|
|
|
|
procedure TcxGridFooterPainter.DrawBackground(const R: TRect);
|
|
begin
|
|
ViewInfo.LookAndFeelPainter.DrawFooterContent(Canvas, R, ViewInfo.Params);
|
|
end;
|
|
|
|
procedure TcxGridFooterPainter.DrawBorders;
|
|
begin
|
|
if ViewInfo.HasSeparator then DrawSeparator;
|
|
ViewInfo.LookAndFeelPainter.DrawFooterBorder(Canvas, ViewInfo.BordersBounds);
|
|
end;
|
|
|
|
function TcxGridFooterPainter.DrawItemsFirst: Boolean;
|
|
begin
|
|
Result := ViewInfo.LookAndFeelPainter.FooterDrawCellsFirst;
|
|
end;
|
|
|
|
procedure TcxGridFooterPainter.DrawSeparator;
|
|
begin
|
|
ViewInfo.LookAndFeelPainter.DrawFooterSeparator(Canvas, ViewInfo.SeparatorBounds);
|
|
end;
|
|
|
|
{ TcxCustomGridIndicatorItemPainter }
|
|
|
|
function TcxCustomGridIndicatorItemPainter.GetViewInfo: TcxCustomGridIndicatorItemViewInfo;
|
|
begin
|
|
Result := TcxCustomGridIndicatorItemViewInfo(inherited ViewInfo);
|
|
end;
|
|
|
|
function TcxCustomGridIndicatorItemPainter.ExcludeFromClipRect: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
{ TcxGridIndicatorHeaderItemPainter }
|
|
|
|
function TcxGridIndicatorHeaderItemPainter.GetViewInfo: TcxGridIndicatorHeaderItemViewInfo;
|
|
begin
|
|
Result := TcxGridIndicatorHeaderItemViewInfo(inherited ViewInfo);
|
|
end;
|
|
|
|
function TcxGridIndicatorHeaderItemPainter.DrawBackgroundHandler(ACanvas: TcxCanvas;
|
|
const ABounds: TRect): Boolean;
|
|
begin
|
|
Result := ViewInfo.GridViewInfo.HeaderViewInfo.DrawColumnBackgroundHandler(ACanvas, ABounds);
|
|
end;
|
|
|
|
procedure TcxGridIndicatorHeaderItemPainter.DrawContent;
|
|
begin
|
|
with ViewInfo do
|
|
begin
|
|
LookAndFeelPainter.DrawHeader(Self.Canvas, Bounds, Bounds, [nRight], cxBordersAll,
|
|
GridCellStateToButtonState(State), taLeftJustify, vaTop, False,
|
|
False, '', nil, clNone, Params.Color, DrawBackgroundHandler);
|
|
if SupportsQuickCustomization then
|
|
DrawQuickCustomizationMark;
|
|
if State = gcsPressed then
|
|
LookAndFeelPainter.DrawHeaderPressed(Self.Canvas, Bounds);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridIndicatorHeaderItemPainter.DrawQuickCustomizationMark;
|
|
begin
|
|
with ViewInfo do
|
|
LookAndFeelPainter.DrawIndicatorCustomizationMark(Canvas, Bounds, Params.TextColor);
|
|
end;
|
|
|
|
{ TcxGridIndicatorRowItemPainter }
|
|
|
|
function TcxGridIndicatorRowItemPainter.GetViewInfo: TcxGridIndicatorRowItemViewInfo;
|
|
begin
|
|
Result := TcxGridIndicatorRowItemViewInfo(inherited ViewInfo);
|
|
end;
|
|
|
|
procedure TcxGridIndicatorRowItemPainter.DrawContent;
|
|
begin
|
|
with ViewInfo do
|
|
LookAndFeelPainter.DrawIndicatorItem(Self.Canvas, Bounds, IndicatorKind, Params.Color,
|
|
DrawBackgroundHandler);
|
|
end;
|
|
|
|
{ TcxGridIndicatorFooterItemPainter }
|
|
|
|
function TcxGridIndicatorFooterItemPainter.GetViewInfo: TcxGridIndicatorFooterItemViewInfo;
|
|
begin
|
|
Result := TcxGridIndicatorFooterItemViewInfo(inherited ViewInfo);
|
|
end;
|
|
|
|
procedure TcxGridIndicatorFooterItemPainter.DrawBorders;
|
|
begin
|
|
with Canvas, ViewInfo do
|
|
begin
|
|
if HasSeparator then
|
|
LookAndFeelPainter.DrawFooterSeparator(Self.Canvas, SeparatorBounds);
|
|
LookAndFeelPainter.DrawFooterBorder(Self.Canvas, BordersBounds);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridIndicatorFooterItemPainter.DrawContent;
|
|
begin
|
|
if ViewInfo.GridView.LookAndFeel.SkinPainter = nil then
|
|
inherited DrawContent
|
|
else
|
|
with ViewInfo do
|
|
LookAndFeelPainter.DrawHeader(Canvas, Bounds, Bounds, [], [], cxbsNormal,
|
|
taLeftJustify, vaTop, False, False, '', nil, clNone, Params.Color, DrawBackgroundHandler);
|
|
end;
|
|
|
|
{ TcxGridIndicatorPainter }
|
|
|
|
function TcxGridIndicatorPainter.GetViewInfo: TcxGridIndicatorViewInfo;
|
|
begin
|
|
Result := TcxGridIndicatorViewInfo(inherited ViewInfo);
|
|
end;
|
|
|
|
procedure TcxGridIndicatorPainter.DrawContent;
|
|
begin
|
|
if DrawItemsFirst then
|
|
begin
|
|
DrawItems;
|
|
inherited;
|
|
end
|
|
else
|
|
begin
|
|
inherited;
|
|
DrawItems;
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridIndicatorPainter.DrawItems;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
with ViewInfo do
|
|
for I := 0 to Count - 1 do
|
|
Items[I].Paint;
|
|
end;
|
|
|
|
function TcxGridIndicatorPainter.DrawItemsFirst: Boolean;
|
|
begin
|
|
Result := ViewInfo.LookAndFeelPainter.IndicatorDrawItemsFirst;
|
|
end;
|
|
|
|
function TcxGridIndicatorPainter.ExcludeFromClipRect: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
{ TcxCustomGridRowPainter }
|
|
|
|
function TcxCustomGridRowPainter.GetViewInfo: TcxCustomGridRowViewInfo;
|
|
begin
|
|
Result := TcxCustomGridRowViewInfo(inherited ViewInfo);
|
|
end;
|
|
|
|
procedure TcxCustomGridRowPainter.DrawFooters;
|
|
begin
|
|
ViewInfo.FootersViewInfo.Paint;
|
|
end;
|
|
|
|
procedure TcxCustomGridRowPainter.DrawIndent;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to ViewInfo.VisualLevel - 1 do
|
|
DrawIndentPart(I, ViewInfo.LevelIndentBounds[I]);
|
|
end;
|
|
|
|
procedure TcxCustomGridRowPainter.DrawIndentPart(ALevel: Integer; const ABounds: TRect);
|
|
begin
|
|
with Canvas, ViewInfo do
|
|
begin
|
|
if GridViewInfo.LevelIndentBackgroundBitmap = nil then
|
|
begin
|
|
Brush.Color := GridViewInfo.LevelIndentColors[ALevel];
|
|
FillRect(CalculateLevelIndentSpaceBounds(ALevel, ABounds));
|
|
end
|
|
else
|
|
FillRect(CalculateLevelIndentSpaceBounds(ALevel, ABounds),
|
|
GridViewInfo.LevelIndentBackgroundBitmap);
|
|
|
|
Brush.Color := GridViewInfo.LevelSeparatorColor;
|
|
FillRect(CalculateLevelIndentVertLineBounds(ALevel, ABounds));
|
|
|
|
Brush.Color := GridViewInfo.GridLineColor;
|
|
FillRect(CalculateLevelIndentHorzLineBounds(ALevel, ABounds));
|
|
end;
|
|
end;
|
|
|
|
procedure TcxCustomGridRowPainter.DrawLastHorzGridLine;
|
|
begin
|
|
with Canvas do
|
|
begin
|
|
Brush.Color := ViewInfo.GridViewInfo.GridLineColor;
|
|
FillRect(ViewInfo.LastHorzGridLineBounds);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxCustomGridRowPainter.DrawSeparator;
|
|
begin
|
|
Canvas.Brush.Color := ViewInfo.SeparatorColor;
|
|
Canvas.FillRect(ViewInfo.SeparatorBounds);
|
|
end;
|
|
|
|
procedure TcxCustomGridRowPainter.Paint;
|
|
begin
|
|
if ViewInfo.HasFooters then DrawFooters;
|
|
DrawIndent;
|
|
if ViewInfo.HasLastHorzGridLine then DrawLastHorzGridLine;
|
|
if ViewInfo.HasSeparator then DrawSeparator;
|
|
inherited;
|
|
end;
|
|
|
|
{ TcxGridRowsPainter }
|
|
|
|
function TcxGridRowsPainter.GetViewInfo: TcxGridRowsViewInfo;
|
|
begin
|
|
Result := TcxGridRowsViewInfo(inherited ViewInfo);
|
|
end;
|
|
|
|
procedure TcxGridRowsPainter.Paint;
|
|
begin
|
|
with ViewInfo do
|
|
begin
|
|
if HasFilterRow then
|
|
FilterRowViewInfo.Paint;
|
|
if HasNewItemRow then
|
|
NewItemRowViewInfo.Paint;
|
|
end;
|
|
inherited;
|
|
end;
|
|
|
|
class procedure TcxGridRowsPainter.DrawDataRowCells(ARowViewInfo: TcxCustomGridRowViewInfo);
|
|
var
|
|
I: Integer;
|
|
ACellViewInfo: TcxGridDataCellViewInfo;
|
|
begin
|
|
with ARowViewInfo as TcxGridDataRowViewInfo do
|
|
begin
|
|
for I := 0 to CellViewInfoCount - 1 do
|
|
begin
|
|
ACellViewInfo := InternalCellViewInfos[I];
|
|
if ACellViewInfo <> nil then ACellViewInfo.Paint;
|
|
end;
|
|
CellsAreaViewInfo.Paint;
|
|
end;
|
|
end;
|
|
|
|
{ TcxGridTablePainter }
|
|
|
|
function TcxGridTablePainter.GetController: TcxGridTableController;
|
|
begin
|
|
Result := TcxGridTableController(inherited Controller);
|
|
end;
|
|
|
|
function TcxGridTablePainter.GetGridView: TcxGridTableView;
|
|
begin
|
|
Result := TcxGridTableView(inherited GridView);
|
|
end;
|
|
|
|
function TcxGridTablePainter.GetViewInfo: TcxGridTableViewInfo;
|
|
begin
|
|
Result := TcxGridTableViewInfo(inherited ViewInfo);
|
|
end;
|
|
|
|
function TcxGridTablePainter.CanOffset(AItemsOffset, DX, DY: Integer): Boolean;
|
|
begin
|
|
Result := inherited CanOffset(AItemsOffset, DX, DY) and
|
|
((AItemsOffset <> 0) or not GridView.IsMaster) and
|
|
(ViewInfo.RecordsViewInfo.GroupBackgroundBitmap = nil) and
|
|
((AItemsOffset <> 0) or (ViewInfo.HeaderViewInfo.ColumnBackgroundBitmap = nil)) and
|
|
(ViewInfo.FooterViewInfo.BackgroundBitmap = nil) and
|
|
((AItemsOffset <> 0) or not GridView.FilterRow.Visible or
|
|
(GridView.FilterRow.InfoText = '')) and
|
|
((AItemsOffset <> 0) or not GridView.NewItemRow.Visible or
|
|
(GridView.NewItemRow.InfoText = '')) and
|
|
((AItemsOffset = 0) or not GridView.HasCellMerging);
|
|
end;
|
|
|
|
procedure TcxGridTablePainter.DrawFooter;
|
|
begin
|
|
ViewInfo.FooterViewInfo.Paint;
|
|
end;
|
|
|
|
procedure TcxGridTablePainter.DrawGroupByBox;
|
|
begin
|
|
ViewInfo.GroupByBoxViewInfo.Paint;
|
|
end;
|
|
|
|
procedure TcxGridTablePainter.DrawHeader;
|
|
begin
|
|
ViewInfo.HeaderViewInfo.Paint;
|
|
end;
|
|
|
|
procedure TcxGridTablePainter.DrawIndicator;
|
|
begin
|
|
ViewInfo.IndicatorViewInfo.Paint;
|
|
end;
|
|
|
|
procedure TcxGridTablePainter.DrawRecords;
|
|
|
|
procedure DrawGridLines;
|
|
var
|
|
I: Integer;
|
|
N: array of DWORD;
|
|
P: array of TPoint;
|
|
R: TRect;
|
|
begin
|
|
SetLength(P, FGridLines.Count * 2);
|
|
SetLength(N, FGridLines.Count);
|
|
for I := 0 to FGridLines.Count - 1 do
|
|
begin
|
|
R := PRect(FGridLines[I])^;
|
|
P[2 * I] := R.TopLeft;
|
|
if R.Bottom = R.Top + 1 then
|
|
P[2 * I + 1] := Point(R.Right, R.Top)
|
|
else
|
|
P[2 * I + 1] := Point(R.Left, R.Bottom);
|
|
N[I] := 2;
|
|
end;
|
|
with Canvas do
|
|
begin
|
|
Pen.Color := ViewInfo.GridLineColor;
|
|
PolyPolyLine(Handle, P[0], N[0], FGridLines.Count);
|
|
end;
|
|
N := nil;
|
|
P := nil;
|
|
end;
|
|
|
|
procedure ClearGridLines;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to FGridLines.Count - 1 do
|
|
Dispose(PRect(FGridLines[I]));
|
|
end;
|
|
|
|
begin
|
|
FGridLines := TList.Create;
|
|
try
|
|
inherited;
|
|
DrawGridLines;
|
|
finally
|
|
ClearGridLines;
|
|
FreeAndNil(FGridLines);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTablePainter.Offset(AItemsOffset: Integer);
|
|
var
|
|
R, AUpdateBounds: TRect;
|
|
begin
|
|
R := ViewInfo.GetOffsetBounds(AItemsOffset, AUpdateBounds);
|
|
Site.ScrollWindow(0, AItemsOffset, R);
|
|
Site.InvalidateRect(AUpdateBounds, True);
|
|
Controller.InvalidateFocusedRecord;
|
|
if Controller.IsEditing then
|
|
RedrawWindow(Controller.EditingController.Edit.Handle, nil, 0, RDW_INVALIDATE or RDW_ALLCHILDREN);
|
|
end;
|
|
|
|
procedure TcxGridTablePainter.Offset(DX, DY: Integer);
|
|
var
|
|
R, AUpdateBounds: TRect;
|
|
begin
|
|
R := ViewInfo.GetOffsetBounds(DX, DY, AUpdateBounds);
|
|
Site.ScrollWindow(DX, 0, R);
|
|
Site.InvalidateRect(AUpdateBounds, True);
|
|
Controller.InvalidateFocusedRecord;
|
|
Site.Update;
|
|
end;
|
|
|
|
procedure TcxGridTablePainter.PaintContent;
|
|
//var
|
|
// ft,lt{,i}:integer;
|
|
begin
|
|
{ft:=gettickcount;
|
|
for I:=1 to 10 do
|
|
begin}
|
|
DrawGroupByBox;
|
|
DrawFilterBar;
|
|
DrawIndicator;
|
|
DrawHeader;
|
|
DrawFooter;
|
|
inherited;
|
|
{end;
|
|
lt:=gettickcount;
|
|
application.mainform.caption :=
|
|
inttostr(lt-ft);}
|
|
end;
|
|
|
|
procedure TcxGridTablePainter.AddGridLine(const R: TRect);
|
|
var
|
|
AR: PRect;
|
|
begin
|
|
New(AR);
|
|
AR^ := R;
|
|
FGridLines.Add(AR);
|
|
end;
|
|
|
|
{ TcxGridColumnContainerViewInfo }
|
|
|
|
constructor TcxGridColumnContainerViewInfo.Create(AGridViewInfo: TcxCustomGridTableViewInfo);
|
|
begin
|
|
inherited;
|
|
FItemHeight := -1;
|
|
CreateItems;
|
|
end;
|
|
|
|
destructor TcxGridColumnContainerViewInfo.Destroy;
|
|
begin
|
|
DestroyItems;
|
|
inherited;
|
|
end;
|
|
|
|
function TcxGridColumnContainerViewInfo.GetController: TcxGridTableController;
|
|
begin
|
|
Result := GridView.Controller;
|
|
end;
|
|
|
|
function TcxGridColumnContainerViewInfo.GetCount: Integer;
|
|
begin
|
|
Result := FItems.Count;
|
|
end;
|
|
|
|
function TcxGridColumnContainerViewInfo.GetGridView: TcxGridTableView;
|
|
begin
|
|
Result := TcxGridTableView(inherited GridView);
|
|
end;
|
|
|
|
function TcxGridColumnContainerViewInfo.GetGridViewInfo: TcxGridTableViewInfo;
|
|
begin
|
|
Result := TcxGridTableViewInfo(inherited GridViewInfo);
|
|
end;
|
|
|
|
function TcxGridColumnContainerViewInfo.GetInternalItem(Index: Integer): TcxGridColumnHeaderViewInfo;
|
|
begin
|
|
Result := TcxGridColumnHeaderViewInfo(FItems[Index]);
|
|
end;
|
|
|
|
function TcxGridColumnContainerViewInfo.GetItem(Index: Integer): TcxGridColumnHeaderViewInfo;
|
|
begin
|
|
Result := InternalItems[Index];
|
|
if Result = nil then
|
|
begin
|
|
Result := CreateItem(Index);
|
|
FItems[Index] := Result;
|
|
end;
|
|
end;
|
|
|
|
function TcxGridColumnContainerViewInfo.GetItemHeight: Integer;
|
|
begin
|
|
if FItemHeight = -1 then
|
|
FItemHeight := CalculateItemHeight;
|
|
Result := FItemHeight;
|
|
end;
|
|
|
|
function TcxGridColumnContainerViewInfo.CreateItem(AIndex: Integer): TcxGridColumnHeaderViewInfo;
|
|
begin
|
|
Result := GetItemClass.Create(Self, Columns[AIndex]);
|
|
end;
|
|
|
|
procedure TcxGridColumnContainerViewInfo.CreateItems;
|
|
begin
|
|
FItems := TList.Create;
|
|
FItems.Count := ColumnCount;
|
|
end;
|
|
|
|
procedure TcxGridColumnContainerViewInfo.DestroyItems;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to Count - 1 do InternalItems[I].Free;
|
|
FreeAndNil(FItems);
|
|
end;
|
|
|
|
function TcxGridColumnContainerViewInfo.GetItemClass: TcxGridColumnHeaderViewInfoClass;
|
|
begin
|
|
Result := TcxGridColumnHeaderViewInfo;
|
|
end;
|
|
|
|
function TcxGridColumnContainerViewInfo.CalculateItemHeight: Integer;
|
|
begin
|
|
CalculateParams;
|
|
Result := GetItemClass.GetCellHeight(
|
|
GridViewInfo.GetFontHeight(Params.Font), LookAndFeelPainter);
|
|
end;
|
|
|
|
function TcxGridColumnContainerViewInfo.GetAutoHeight: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
function TcxGridColumnContainerViewInfo.GetColumnAdditionalWidth(AColumn: TcxGridColumn): Integer;
|
|
begin
|
|
if AColumn.IsMostLeft then
|
|
Result := GridViewInfo.FirstItemAdditionalWidth
|
|
else
|
|
Result := 0;
|
|
end;
|
|
|
|
function TcxGridColumnContainerViewInfo.GetColumnMinWidth(AColumn: TcxGridColumn): Integer;
|
|
begin
|
|
Result := AColumn.MinWidth + GetColumnAdditionalWidth(AColumn);
|
|
end;
|
|
|
|
function TcxGridColumnContainerViewInfo.GetColumnNeighbors(AColumn: TcxGridColumn): TcxNeighbors;
|
|
begin
|
|
Result := [];
|
|
end;
|
|
|
|
function TcxGridColumnContainerViewInfo.GetColumnWidth(AColumn: TcxGridColumn): Integer;
|
|
begin
|
|
Result := AColumn.Width + GetColumnAdditionalWidth(AColumn);
|
|
end;
|
|
|
|
function TcxGridColumnContainerViewInfo.GetItemAreaBounds(AItem: TcxGridColumnHeaderViewInfo): TRect;
|
|
begin
|
|
Result := GridViewInfo.ScrollableAreaBoundsHorz;
|
|
end;
|
|
|
|
function TcxGridColumnContainerViewInfo.GetItemMultiLinePainting(AItem: TcxGridColumnHeaderViewInfo): Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
function TcxGridColumnContainerViewInfo.GetItemsAreaBounds: TRect;
|
|
begin
|
|
Result := Bounds;
|
|
end;
|
|
|
|
function TcxGridColumnContainerViewInfo.GetItemsHitTest(const P: TPoint): TcxCustomGridHitTest;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to Count - 1 do
|
|
begin
|
|
Result := Items[I].GetHitTest(P);
|
|
if Result <> nil then Exit;
|
|
end;
|
|
Result := nil;
|
|
end;
|
|
|
|
function TcxGridColumnContainerViewInfo.GetPainterClass: TcxCustomGridCellPainterClass;
|
|
begin
|
|
Result := TcxGridColumnContainerPainter;
|
|
end;
|
|
|
|
function TcxGridColumnContainerViewInfo.GetZonesAreaBounds: TRect;
|
|
begin
|
|
Result := Bounds;
|
|
Result.Right := GridViewInfo.ClientBounds.Right;
|
|
end;
|
|
|
|
procedure TcxGridColumnContainerViewInfo.InitHitTest(AHitTest: TcxCustomGridHitTest);
|
|
begin
|
|
inherited;
|
|
if AHitTest is TcxCustomGridColumnHitTest then
|
|
TcxCustomGridColumnHitTest(AHitTest).ColumnContainerKind := Kind;
|
|
end;
|
|
|
|
procedure TcxGridColumnContainerViewInfo.Offset(DX, DY: Integer);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
inherited;
|
|
for I := 0 to Count - 1 do
|
|
Items[I].DoOffset(DX, DY);
|
|
end;
|
|
|
|
procedure TcxGridColumnContainerViewInfo.BeforeRecalculation;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
inherited;
|
|
for I := 0 to Count - 1 do
|
|
Items[I].BeforeRecalculation;
|
|
end;
|
|
|
|
function TcxGridColumnContainerViewInfo.GetHitTest(const P: TPoint): TcxCustomGridHitTest;
|
|
begin
|
|
Result := GetItemsHitTest(P);
|
|
if Result = nil then
|
|
Result := inherited GetHitTest(P);
|
|
end;
|
|
|
|
function TcxGridColumnContainerViewInfo.GetZone(const P: TPoint): TcxGridItemContainerZone;
|
|
var
|
|
R: TRect;
|
|
ALastBound, I: Integer;
|
|
begin
|
|
Result := nil;
|
|
if not Visible then Exit;
|
|
R := ZonesAreaBounds;
|
|
if not PtInRect(R, P) then Exit;
|
|
ALastBound := R.Right;
|
|
for I := 0 to Count do
|
|
begin
|
|
if I = Count then
|
|
R.Right := ALastBound
|
|
else
|
|
with Items[I] do
|
|
R.Right := (Bounds.Left + Bounds.Right) div 2;
|
|
if PtInRect(R, P) then
|
|
begin
|
|
Result := TcxGridItemContainerZone.Create(I);
|
|
Break;
|
|
end;
|
|
R.Left := R.Right;
|
|
end;
|
|
end;
|
|
|
|
{ TcxGridColumnHeaderAreaViewInfo }
|
|
|
|
constructor TcxGridColumnHeaderAreaViewInfo.Create(AColumnHeaderViewInfo: TcxGridColumnHeaderViewInfo);
|
|
begin
|
|
inherited Create(AColumnHeaderViewInfo.GridViewInfo);
|
|
FColumnHeaderViewInfo := AColumnHeaderViewInfo;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderAreaViewInfo.GetColumn: TcxGridColumn;
|
|
begin
|
|
Result := FColumnHeaderViewInfo.Column;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderAreaViewInfo.GetGridView: TcxGridTableView;
|
|
begin
|
|
Result := FColumnHeaderViewInfo.GridView;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderAreaViewInfo.GetGridViewInfo: TcxGridTableViewInfo;
|
|
begin
|
|
Result := FColumnHeaderViewInfo.GridViewInfo;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderAreaViewInfo.GetAlignmentVert: TcxAlignmentVert;
|
|
begin
|
|
Result := vaCenter;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderAreaViewInfo.GetCanvas: TcxCanvas;
|
|
begin
|
|
Result := GridViewInfo.Canvas;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderAreaViewInfo.GetHeight: Integer;
|
|
begin
|
|
Result := CalculateHeight;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderAreaViewInfo.GetWidth: Integer;
|
|
begin
|
|
Result := CalculateWidth;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderAreaViewInfo.HasMouse(AHitTest: TcxCustomGridHitTest): Boolean;
|
|
begin
|
|
Result := inherited HasMouse(AHitTest);
|
|
if Result then
|
|
with TcxCustomGridColumnHitTest(AHitTest) do
|
|
Result := (Column = Self.Column) and
|
|
(ColumnContainerKind = ColumnHeaderViewInfo.Container.Kind);
|
|
end;
|
|
|
|
procedure TcxGridColumnHeaderAreaViewInfo.InitHitTest(AHitTest: TcxCustomGridHitTest);
|
|
begin
|
|
FColumnHeaderViewInfo.InitHitTest(AHitTest);
|
|
inherited;
|
|
end;
|
|
|
|
{procedure TcxGridColumnHeaderAreaViewInfo.Invalidate;
|
|
begin
|
|
if GridView <> nil then
|
|
GridView.ViewChanged(Bounds);
|
|
end;}
|
|
|
|
function TcxGridColumnHeaderAreaViewInfo.NeedsContainerHotTrack: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderAreaViewInfo.OccupiesSpace: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderAreaViewInfo.ResidesInContent: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
procedure TcxGridColumnHeaderAreaViewInfo.Calculate(const ABounds: TRect;
|
|
var ATextAreaBounds: TRect);
|
|
|
|
procedure AlignHorizontally;
|
|
var
|
|
AAreaAndTextWidth: Integer;
|
|
begin
|
|
case AlignmentHorz of
|
|
taLeftJustify:
|
|
begin
|
|
Bounds.Right := Bounds.Left + Width;
|
|
if OccupiesSpace then
|
|
ATextAreaBounds.Left := Bounds.Right;
|
|
end;
|
|
taRightJustify:
|
|
begin
|
|
Bounds.Left := Bounds.Right - Width;
|
|
if OccupiesSpace then
|
|
ATextAreaBounds.Right := Bounds.Left;
|
|
end;
|
|
taCenter:
|
|
if OccupiesSpace and (ColumnHeaderViewInfo.AlignmentHorz = taCenter) then
|
|
begin
|
|
AAreaAndTextWidth := Width + ColumnHeaderViewInfo.TextWidthWithOffset;
|
|
if AAreaAndTextWidth < Bounds.Right - Bounds.Left then
|
|
Inc(Bounds.Left, (Bounds.Right - Bounds.Left - AAreaAndTextWidth) div 2);
|
|
Bounds.Right := Bounds.Left + Width;
|
|
|
|
ATextAreaBounds.Left := Bounds.Right;
|
|
ATextAreaBounds.Right :=
|
|
Min(ATextAreaBounds.Right, ATextAreaBounds.Left + ColumnHeaderViewInfo.TextWidthWithOffset);
|
|
end
|
|
else
|
|
begin
|
|
Inc(Bounds.Left, (Bounds.Right - Bounds.Left - Width) div 2);
|
|
Bounds.Right := Bounds.Left + Width;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure AlignVertically;
|
|
begin
|
|
case AlignmentVert of
|
|
vaTop:
|
|
Bounds.Bottom := Bounds.Top + Height;
|
|
vaBottom:
|
|
Bounds.Top := Bounds.Bottom - Height;
|
|
vaCenter:
|
|
begin
|
|
Inc(Bounds.Top, (Bounds.Bottom - Bounds.Top - Height) div 2);
|
|
Bounds.Bottom := Bounds.Top + Height;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
if ResidesInContent then
|
|
Bounds := ATextAreaBounds
|
|
else
|
|
Bounds := ABounds;
|
|
if Width <> 0 then AlignHorizontally;
|
|
if Height <> 0 then AlignVertically;
|
|
with Bounds do
|
|
inherited Calculate(Left, Top, Right - Left, Bottom - Top);
|
|
end;
|
|
|
|
{ TcxGridColumnHeaderSortingMarkViewInfo }
|
|
|
|
function TcxGridColumnHeaderSortingMarkViewInfo.GetSortOrder: TcxGridSortOrder;
|
|
begin
|
|
Result := Column.SortOrder;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderSortingMarkViewInfo.CalculateHeight: Integer;
|
|
begin
|
|
Result := LookAndFeelPainter.SortingMarkAreaSize.Y;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderSortingMarkViewInfo.CalculateWidth: Integer;
|
|
begin
|
|
Result := LookAndFeelPainter.SortingMarkAreaSize.X;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderSortingMarkViewInfo.GetAlignmentHorz: TAlignment;
|
|
begin
|
|
Result := taRightJustify;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderSortingMarkViewInfo.GetHitTestClass: TcxCustomGridHitTestClass;
|
|
begin
|
|
Result := nil;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderSortingMarkViewInfo.GetPainterClass: TcxCustomGridCellPainterClass;
|
|
begin
|
|
Result := TcxGridColumnHeaderSortingMarkPainter;
|
|
end;
|
|
|
|
{ TcxGridColumnHeaderHorzSizingEdgeViewInfo }
|
|
|
|
function TcxGridColumnHeaderHorzSizingEdgeViewInfo.CalculateHeight: Integer;
|
|
begin
|
|
Result := 0;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderHorzSizingEdgeViewInfo.CalculateWidth: Integer;
|
|
begin
|
|
Result := cxGridHeaderSizingEdgeSize;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderHorzSizingEdgeViewInfo.GetAlignmentHorz: TAlignment;
|
|
begin
|
|
Result := taRightJustify;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderHorzSizingEdgeViewInfo.GetHitTestClass: TcxCustomGridHitTestClass;
|
|
begin
|
|
Result := TcxGridColumnHeaderHorzSizingEdgeHitTest;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderHorzSizingEdgeViewInfo.GetPainterClass: TcxCustomGridCellPainterClass;
|
|
begin
|
|
Result := nil;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderHorzSizingEdgeViewInfo.OccupiesSpace: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderHorzSizingEdgeViewInfo.ResidesInContent: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
procedure TcxGridColumnHeaderHorzSizingEdgeViewInfo.Calculate(const ABounds: TRect;
|
|
var ATextAreaBounds: TRect);
|
|
begin
|
|
inherited;
|
|
OffsetRect(Bounds, Width div 2, 0);
|
|
end;
|
|
|
|
function TcxGridColumnHeaderHorzSizingEdgeViewInfo.MouseDown(AHitTest: TcxCustomGridHitTest;
|
|
AButton: TMouseButton; AShift: TShiftState): Boolean;
|
|
var
|
|
AColumn: TcxGridColumn;
|
|
begin
|
|
Result := inherited MouseDown(AHitTest, AButton, AShift);
|
|
if (AButton = mbLeft) and (ssDouble in AShift) then
|
|
begin
|
|
AColumn := Column;
|
|
AColumn.ApplyBestFit(True, True);
|
|
Result := True;
|
|
end;
|
|
end;
|
|
|
|
{ TcxGridColumnHeaderFilterButtonViewInfo }
|
|
|
|
function TcxGridColumnHeaderFilterButtonViewInfo.GetActive: Boolean;
|
|
begin
|
|
Result := Column.Filtered;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderFilterButtonViewInfo.GetDropDownWindowValue: TcxGridFilterPopup;
|
|
begin
|
|
Result := TcxGridFilterPopup(inherited DropDownWindow);
|
|
end;
|
|
|
|
function TcxGridColumnHeaderFilterButtonViewInfo.GetItem: TcxCustomGridTableItem;
|
|
begin
|
|
Result := Column;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderFilterButtonViewInfo.CalculateHeight: Integer;
|
|
begin
|
|
Result := LookAndFeelPainter.FilterDropDownButtonSize.Y;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderFilterButtonViewInfo.CalculateWidth: Integer;
|
|
begin
|
|
Result := LookAndFeelPainter.FilterDropDownButtonSize.X;
|
|
end;
|
|
|
|
procedure TcxGridColumnHeaderFilterButtonViewInfo.DropDown;
|
|
begin
|
|
GridView.Controller.IsFilterPopupOpenedFromHeader := ColumnHeaderViewInfo.HasHeaderAsContainer;
|
|
inherited;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderFilterButtonViewInfo.EmulateMouseMoveAfterCalculate: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderFilterButtonViewInfo.GetAlignmentHorz: TAlignment;
|
|
begin
|
|
Result := taRightJustify;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderFilterButtonViewInfo.GetAlwaysVisible: Boolean;
|
|
begin
|
|
Result := GridView.OptionsView.ShowColumnFilterButtons = sfbAlways;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderFilterButtonViewInfo.GetHitTestClass: TcxCustomGridHitTestClass;
|
|
begin
|
|
if GridView.IsDesigning then
|
|
Result := nil
|
|
else
|
|
Result := TcxGridColumnHeaderFilterButtonHitTest;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderFilterButtonViewInfo.GetPainterClass: TcxCustomGridCellPainterClass;
|
|
begin
|
|
Result := TcxGridColumnHeaderFilterButtonPainter;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderFilterButtonViewInfo.GetVisible: Boolean;
|
|
begin
|
|
Result := AlwaysVisible or
|
|
(ColumnHeaderViewInfo.State <> gcsNone) or (State = gcsPressed);
|
|
end;
|
|
|
|
function TcxGridColumnHeaderFilterButtonViewInfo.NeedsContainerHotTrack: Boolean;
|
|
begin
|
|
Result := not AlwaysVisible;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderFilterButtonViewInfo.OccupiesSpace: Boolean;
|
|
begin
|
|
Result := ColumnHeaderViewInfo.HasFixedContentSpace or Visible;
|
|
end;
|
|
|
|
procedure TcxGridColumnHeaderFilterButtonViewInfo.StateChanged(APrevState: TcxGridCellState);
|
|
begin
|
|
if not IsDestroying and not Visible then
|
|
ColumnHeaderViewInfo.Update;
|
|
inherited;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderFilterButtonViewInfo.CloseDropDownWindowOnDestruction: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderFilterButtonViewInfo.DropDownWindowExists: Boolean;
|
|
begin
|
|
Result := GridView.Controller.HasFilterPopup;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderFilterButtonViewInfo.GetDropDownWindow: TcxCustomGridPopup;
|
|
begin
|
|
Result := GridView.Controller.FilterPopup;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderFilterButtonViewInfo.GetDropDownWindowOwnerBounds: TRect;
|
|
begin
|
|
Result := Bounds;
|
|
with ColumnHeaderViewInfo.Bounds do
|
|
begin
|
|
Result.Left := Left;
|
|
Result.Right := Right;
|
|
end;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderFilterButtonViewInfo.IsDropDownWindowOwner: Boolean;
|
|
begin
|
|
Result := inherited IsDropDownWindowOwner and (DropDownWindow.Item = Column) and
|
|
(GridView.Controller.IsFilterPopupOpenedFromHeader = ColumnHeaderViewInfo.HasHeaderAsContainer);
|
|
end;
|
|
|
|
function TcxGridColumnHeaderFilterButtonViewInfo.MouseMove(AHitTest: TcxCustomGridHitTest;
|
|
AShift: TShiftState): Boolean;
|
|
begin
|
|
Result := inherited MouseMove(AHitTest, AShift);
|
|
if State = gcsPressed then
|
|
ColumnHeaderViewInfo.State := gcsSelected;
|
|
end;
|
|
|
|
{ TcxGridColumnHeaderGlyphViewInfo }
|
|
|
|
function TcxGridColumnHeaderGlyphViewInfo.GetGlyph: TBitmap;
|
|
begin
|
|
Result := Column.HeaderGlyph;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderGlyphViewInfo.CalculateHeight: Integer;
|
|
begin
|
|
Result := Glyph.Height;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderGlyphViewInfo.CalculateWidth: Integer;
|
|
begin
|
|
Result := Glyph.Width;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderGlyphViewInfo.GetAlignmentHorz: TAlignment;
|
|
begin
|
|
Result := Column.HeaderGlyphAlignmentHorz;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderGlyphViewInfo.GetAlignmentVert: TcxAlignmentVert;
|
|
begin
|
|
Result := Column.HeaderGlyphAlignmentVert;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderGlyphViewInfo.GetHitTestClass: TcxCustomGridHitTestClass;
|
|
begin
|
|
Result := nil;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderGlyphViewInfo.GetPainterClass: TcxCustomGridCellPainterClass;
|
|
begin
|
|
Result := TcxGridColumnHeaderGlyphPainter;
|
|
end;
|
|
|
|
{ TcxGridColumnHeaderViewInfo }
|
|
|
|
constructor TcxGridColumnHeaderViewInfo.Create(AContainer: TcxGridColumnContainerViewInfo;
|
|
AColumn: TcxGridColumn);
|
|
begin
|
|
inherited Create(AContainer.GridViewInfo);
|
|
FAreaViewInfos := TList.Create;
|
|
FContainer := AContainer;
|
|
FColumn := AColumn;
|
|
FWidth := -1;
|
|
Width := -1;
|
|
CreateAreaViewInfos;
|
|
end;
|
|
|
|
destructor TcxGridColumnHeaderViewInfo.Destroy;
|
|
begin
|
|
DestroyAreaViewInfos;
|
|
FAreaViewInfos.Free;
|
|
inherited;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.GetAreaViewInfoCount: Integer;
|
|
begin
|
|
Result := FAreaViewInfos.Count;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.GetAreaViewInfo(Index: Integer): TcxGridColumnHeaderAreaViewInfo;
|
|
begin
|
|
Result := TcxGridColumnHeaderAreaViewInfo(FAreaViewInfos[Index]);
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.GetGridView: TcxGridTableView;
|
|
begin
|
|
Result := FContainer.GridView;
|
|
// if Result.IsDestroying then Result := nil;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.GetGridViewInfo: TcxGridTableViewInfo;
|
|
begin
|
|
Result := FContainer.GridViewInfo;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.GetHasTextOffsetLeft: Boolean;
|
|
begin
|
|
Result := CalculateHasTextOffset(taLeftJustify);
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.GetHasTextOffsetRight: Boolean;
|
|
begin
|
|
Result := CalculateHasTextOffset(taRightJustify);
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.GetIndex: Integer;
|
|
begin
|
|
Result := FColumn.VisibleIndex;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.GetIsFixed: Boolean;
|
|
begin
|
|
Result := FColumn.Fixed;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.GetRealBounds: TRect;
|
|
begin
|
|
Result := Bounds;
|
|
Inc(Result.Left, FAdditionalWidthAtLeft);
|
|
Inc(Result.Top, FAdditionalHeightAtTop);
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.GetRealWidth: Integer;
|
|
begin
|
|
if FRealWidth = 0 then
|
|
FRealWidth := CalculateRealWidth(Width);
|
|
Result := FRealWidth;
|
|
end;
|
|
|
|
procedure TcxGridColumnHeaderViewInfo.EnumAreaViewInfoClasses(AClass: TClass);
|
|
begin
|
|
FAreaViewInfos.Add(TcxGridColumnHeaderAreaViewInfoClass(AClass).Create(Self));
|
|
end;
|
|
|
|
procedure TcxGridColumnHeaderViewInfo.CreateAreaViewInfos;
|
|
begin
|
|
GetAreaViewInfoClasses(EnumAreaViewInfoClasses);
|
|
end;
|
|
|
|
procedure TcxGridColumnHeaderViewInfo.DestroyAreaViewInfos;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to AreaViewInfoCount - 1 do
|
|
AreaViewInfos[I].Free;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.AreasNeedHotTrack: Boolean;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to AreaViewInfoCount - 1 do
|
|
begin
|
|
Result := AreaViewInfos[I].NeedsContainerHotTrack;
|
|
if Result then Exit;
|
|
end;
|
|
Result := False;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.CalculateHasTextOffset(ASide: TAlignment): Boolean;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
if Text <> '' then
|
|
begin
|
|
Result := True;
|
|
for I := 0 to AreaViewInfoCount - 1 do
|
|
with AreaViewInfos[I] do
|
|
if OccupiesSpace and (AlignmentHorz = ASide) then Exit;
|
|
end;
|
|
Result := False;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.CalculateHeight: Integer;
|
|
begin
|
|
Result := GetTextCellHeight(GridViewInfo, LookAndFeelPainter);
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.CalculateRealWidth(Value: Integer): Integer;
|
|
begin
|
|
Result := Value - FContainer.GetColumnAdditionalWidth(Column);
|
|
end;
|
|
|
|
procedure TcxGridColumnHeaderViewInfo.CalculateTextAreaBounds;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
FTextAreaBounds := inherited GetTextAreaBounds;
|
|
for I := 0 to AreaViewInfoCount - 1 do
|
|
AreaViewInfos[I].Calculate(Bounds, FTextAreaBounds);
|
|
if HasTextOffsetLeft then
|
|
Inc(FTextAreaBounds.Left, cxGridCellTextOffset);
|
|
if HasTextOffsetRight then
|
|
Dec(FTextAreaBounds.Right, cxGridCellTextOffset);
|
|
end;
|
|
|
|
procedure TcxGridColumnHeaderViewInfo.CalculateVisible(ALeftBound, AWidth: Integer);
|
|
begin
|
|
with GridViewInfo.ClientBounds do
|
|
Visible := (ALeftBound < Right) and (ALeftBound + AWidth > Left);
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.CalculateWidth: Integer;
|
|
begin
|
|
if FWidth = -1 then
|
|
FWidth := FContainer.GetColumnWidth(Column);
|
|
Result := FWidth;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.CanFilter: Boolean;
|
|
begin
|
|
Result := FColumn.CanFilter(True);
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.CanHorzSize: Boolean;
|
|
begin
|
|
Result := FColumn.CanHorzSize and (Container.Kind = ckHeader);
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.CanPress: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.CanShowHint: Boolean;
|
|
begin
|
|
Result := GridView.OptionsBehavior.ColumnHeaderHints;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.CanSort: Boolean;
|
|
begin
|
|
Result := FColumn.SortOrder <> soNone;
|
|
end;
|
|
|
|
procedure TcxGridColumnHeaderViewInfo.CheckWidth(var Value: Integer);
|
|
begin
|
|
if Value < MinWidth then Value := MinWidth;
|
|
if Value > MaxWidth then Value := MaxWidth;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.CustomDraw(ACanvas: TcxCanvas): Boolean;
|
|
begin
|
|
Result := inherited CustomDraw(ACanvas);
|
|
if not Result then
|
|
begin
|
|
FColumn.DoCustomDrawHeader(ACanvas, Self, Result);
|
|
if not Result then
|
|
GridView.DoCustomDrawColumnHeader(ACanvas, Self, Result);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridColumnHeaderViewInfo.DoCalculateParams;
|
|
begin
|
|
FNeighbors := FContainer.GetColumnNeighbors(Column);
|
|
inherited;
|
|
CalculateTextAreaBounds;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.GetAlignmentHorz: TAlignment;
|
|
begin
|
|
Result := FColumn.HeaderAlignmentHorz;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.GetAlignmentVert: TcxAlignmentVert;
|
|
begin
|
|
Result := FColumn.HeaderAlignmentVert;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.GetAreaBounds: TRect;
|
|
begin
|
|
Result := Container.GetItemAreaBounds(Self);
|
|
end;
|
|
|
|
procedure TcxGridColumnHeaderViewInfo.GetAreaViewInfoClasses(AProc: TcxGridClassEnumeratorProc);
|
|
begin
|
|
if CanHorzSize then AProc(TcxGridColumnHeaderHorzSizingEdgeViewInfo);
|
|
if CanFilter then AProc(TcxGridColumnHeaderFilterButtonViewInfo);
|
|
if CanSort then AProc(TcxGridColumnHeaderSortingMarkViewInfo);
|
|
if HasGlyph then AProc(TcxGridColumnHeaderGlyphViewInfo);
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.GetBackgroundBitmap: TBitmap;
|
|
begin
|
|
Result := GridViewInfo.HeaderViewInfo.ColumnBackgroundBitmap;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.GetBorders: TcxBorders;
|
|
begin
|
|
Result := LookAndFeelPainter.HeaderBorders(Neighbors);
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.GetBorderWidth(AIndex: TcxBorder): Integer;
|
|
begin
|
|
Result := GetCellBorderWidth(LookAndFeelPainter);
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.GetCanvas: TcxCanvas;
|
|
begin
|
|
Result := GridViewInfo.Canvas;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.GetCaption: string;
|
|
begin
|
|
Result := Column.VisibleCaption;
|
|
end;
|
|
|
|
class function TcxGridColumnHeaderViewInfo.GetCellBorderWidth(ALookAndFeelPainter: TcxCustomLookAndFeelPainterClass): Integer;
|
|
begin
|
|
Result := ALookAndFeelPainter.HeaderBorderSize;
|
|
end;
|
|
|
|
class function TcxGridColumnHeaderViewInfo.GetCellHeight(ATextHeight: Integer;
|
|
ALookAndFeelPainter: TcxCustomLookAndFeelPainterClass): Integer;
|
|
begin
|
|
Result := inherited GetCellHeight(ATextHeight, ALookAndFeelPainter);
|
|
Inc(Result, 2 * GetCellBorderWidth(ALookAndFeelPainter));
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.GetDataOffset: Integer;
|
|
begin
|
|
Result := Bounds.Right - RealWidth;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.GetHeight: Integer;
|
|
begin
|
|
Result := inherited GetHeight - FAdditionalHeightAtTop;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.GetHitTestClass: TcxCustomGridHitTestClass;
|
|
begin
|
|
Result := TcxGridColumnHeaderHitTest;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.GetHotTrack: Boolean;
|
|
begin
|
|
Result := LookAndFeelPainter.IsHeaderHotTrack or AreasNeedHotTrack;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.GetIsDesignSelected: Boolean;
|
|
begin
|
|
Result := GridView.IsDesigning and
|
|
GridView.Controller.DesignController.IsObjectSelected(FColumn);
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.GetIsPressed: Boolean;
|
|
begin
|
|
Result := (State = gcsPressed) or (GridViewInfo.Controller.PressedColumn = Column);
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.GetMaxWidth: Integer;
|
|
var
|
|
AIndex, I: Integer;
|
|
begin
|
|
if GridView.OptionsView.ColumnAutoWidth then
|
|
begin
|
|
Result := GridViewInfo.ClientWidth;
|
|
AIndex := Column.VisibleIndex;
|
|
if AIndex = FContainer.Count - 1 then
|
|
for I := 0 to AIndex - 1 do
|
|
Dec(Result, FContainer[I].MinWidth)
|
|
else
|
|
for I := 0 to FContainer.Count - 1 do
|
|
begin
|
|
if I < AIndex then
|
|
Dec(Result, FContainer[I].Width);
|
|
if I > AIndex then
|
|
Dec(Result, FContainer[I].MinWidth);
|
|
end;
|
|
if Result < MinWidth then Result := MinWidth;
|
|
end
|
|
else
|
|
Result := MaxInt;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.GetMinWidth: Integer;
|
|
begin
|
|
if IsFixed then
|
|
Result := CalculateWidth
|
|
else
|
|
Result := FContainer.GetColumnMinWidth(Column);
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.GetMultiLine: Boolean;
|
|
begin
|
|
Result := FContainer.AutoHeight;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.GetMultiLinePainting: Boolean;
|
|
begin
|
|
Result := inherited GetMultiLinePainting or FContainer.GetItemMultiLinePainting(Self);
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.GetPainterClass: TcxCustomGridCellPainterClass;
|
|
begin
|
|
Result := TcxGridColumnHeaderPainter;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.GetShowEndEllipsis: Boolean;
|
|
begin
|
|
Result := GridView.OptionsView.HeaderEndEllipsis;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.GetText: string;
|
|
begin
|
|
if Column.Options.ShowCaption then
|
|
Result := Caption
|
|
else
|
|
Result := '';
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.GetTextAreaBounds: TRect;
|
|
begin
|
|
Result := FTextAreaBounds;
|
|
end;
|
|
|
|
procedure TcxGridColumnHeaderViewInfo.GetViewParams(var AParams: TcxViewParams);
|
|
begin
|
|
Column.Styles.GetHeaderParams(AParams);
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.GetWidth: Integer;
|
|
begin
|
|
Result := inherited GetWidth - FAdditionalWidthAtLeft;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.HasCustomDraw: Boolean;
|
|
begin
|
|
Result := Column.HasCustomDrawHeader or GridView.HasCustomDrawColumnHeader;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.HasFixedContentSpace: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.HasGlyph: Boolean;
|
|
begin
|
|
Result := not FColumn.HeaderGlyph.Empty;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.HasHeaderAsContainer: Boolean;
|
|
begin
|
|
Result := FContainer = GridViewInfo.HeaderViewInfo;
|
|
end;
|
|
|
|
procedure TcxGridColumnHeaderViewInfo.InitHitTest(AHitTest: TcxCustomGridHitTest);
|
|
begin
|
|
FContainer.InitHitTest(AHitTest);
|
|
inherited;
|
|
(AHitTest as TcxCustomGridColumnHitTest).Column := Column;
|
|
end;
|
|
|
|
procedure TcxGridColumnHeaderViewInfo.Offset(DX, DY: Integer);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
inherited;
|
|
OffsetRect(FTextAreaBounds, DX, DY);
|
|
for I := 0 to AreaViewInfoCount - 1 do
|
|
AreaViewInfos[I].DoOffset(DX, DY);
|
|
end;
|
|
|
|
procedure TcxGridColumnHeaderViewInfo.SetWidth(Value: Integer);
|
|
begin
|
|
inherited;
|
|
FWidth := Value;
|
|
end;
|
|
|
|
procedure TcxGridColumnHeaderViewInfo.StateChanged(APrevState: TcxGridCellState);
|
|
begin
|
|
if not IsDestroying and AreasNeedHotTrack then
|
|
Recalculate;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TcxGridColumnHeaderViewInfo.BeforeRecalculation;
|
|
begin
|
|
inherited;
|
|
Bounds := RealBounds;
|
|
end;
|
|
|
|
procedure TcxGridColumnHeaderViewInfo.Calculate(ALeftBound, ATopBound: Integer;
|
|
AWidth: Integer = -1; AHeight: Integer = -1);
|
|
|
|
procedure CheckHiddenBorders(var AAdditionalWidthAtLeft, AAdditionalHeightAtTop: Integer);
|
|
var
|
|
AHiddenBorders: TcxBorders;
|
|
begin
|
|
CalculateParams;
|
|
AHiddenBorders := cxBordersAll - Borders;
|
|
if AHiddenBorders <> [] then
|
|
begin
|
|
if bLeft in AHiddenBorders then
|
|
begin
|
|
Dec(ALeftBound, BorderWidth[bLeft]);
|
|
Inc(AWidth, BorderWidth[bLeft]);
|
|
Inc(AAdditionalWidthAtLeft, BorderWidth[bLeft]);
|
|
end;
|
|
if bTop in AHiddenBorders then
|
|
begin
|
|
Dec(ATopBound, BorderWidth[bTop]);
|
|
Inc(AHeight, BorderWidth[bTop]);
|
|
Inc(AAdditionalHeightAtTop, BorderWidth[bTop]);
|
|
end;
|
|
Borders := cxBordersAll;
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
FAdditionalWidthAtLeft := 0;
|
|
FAdditionalHeightAtTop := 0;
|
|
if AWidth = -1 then
|
|
AWidth := CalculateWidth;
|
|
CalculateVisible(ALeftBound, AWidth);
|
|
CheckHiddenBorders(FAdditionalWidthAtLeft, FAdditionalHeightAtTop);
|
|
inherited;
|
|
{if Visible then }CalculateTextAreaBounds;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.GetBestFitWidth: Integer;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
Result := inherited GetBestFitWidth - FAdditionalWidthAtLeft;
|
|
if HasTextOffsetLeft then Inc(Result, cxGridCellTextOffset);
|
|
if HasTextOffsetRight then Inc(Result, cxGridCellTextOffset);
|
|
for I := 0 to AreaViewInfoCount - 1 do
|
|
with AreaViewInfos[I] do
|
|
if OccupiesSpace then Inc(Result, Width);
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.GetHitTest(const P: TPoint): TcxCustomGridHitTest;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to AreaViewInfoCount - 1 do
|
|
begin
|
|
Result := AreaViewInfos[I].GetHitTest(P);
|
|
if Result <> nil then Exit;
|
|
end;
|
|
Result := inherited GetHitTest(P);
|
|
end;
|
|
|
|
procedure TcxGridColumnHeaderViewInfo.InitAutoWidthItem(AAutoWidthItem: TcxAutoWidthItem);
|
|
begin
|
|
AAutoWidthItem.MinWidth := MinWidth;
|
|
AAutoWidthItem.Width := CalculateWidth;
|
|
AAutoWidthItem.Fixed := IsFixed;
|
|
end;
|
|
|
|
function TcxGridColumnHeaderViewInfo.MouseDown(AHitTest: TcxCustomGridHitTest;
|
|
AButton: TMouseButton; AShift: TShiftState): Boolean;
|
|
begin
|
|
Result := inherited MouseDown(AHitTest, AButton, AShift);
|
|
if (AButton = mbLeft) and not (ssDouble in AShift) and CanPress then
|
|
begin
|
|
if GridView.IsDesigning then
|
|
GridView.Controller.DesignController.SelectObject(FColumn, not (ssShift in AShift))
|
|
else
|
|
begin
|
|
GridView.Controller.PressedColumn := FColumn;
|
|
FColumn.DoHeaderClick;
|
|
end;
|
|
Result := True;
|
|
end;
|
|
end;
|
|
|
|
{ TcxGridHeaderViewInfoSpecific }
|
|
|
|
constructor TcxGridHeaderViewInfoSpecific.Create(AContainerViewInfo: TcxGridHeaderViewInfo);
|
|
begin
|
|
inherited Create;
|
|
FContainerViewInfo := AContainerViewInfo;
|
|
end;
|
|
|
|
function TcxGridHeaderViewInfoSpecific.GetGridViewInfo: TcxGridTableViewInfo;
|
|
begin
|
|
Result := FContainerViewInfo.GridViewInfo;
|
|
end;
|
|
|
|
function TcxGridHeaderViewInfoSpecific.GetItemHeight: Integer;
|
|
begin
|
|
Result := FContainerViewInfo.ItemHeight;
|
|
end;
|
|
|
|
function TcxGridHeaderViewInfoSpecific.CalculateHeight: Integer;
|
|
begin
|
|
Result := ItemHeight;
|
|
end;
|
|
|
|
function TcxGridHeaderViewInfoSpecific.GetHeight: Integer;
|
|
begin
|
|
Result := CalculateHeight;
|
|
end;
|
|
|
|
{ TcxGridHeaderViewInfo }
|
|
|
|
constructor TcxGridHeaderViewInfo.Create(AGridViewInfo: TcxCustomGridTableViewInfo);
|
|
begin
|
|
inherited;
|
|
FSpecific := GridViewInfo.GetHeaderViewInfoSpecificClass.Create(Self);
|
|
end;
|
|
|
|
destructor TcxGridHeaderViewInfo.Destroy;
|
|
begin
|
|
FSpecific.Free;
|
|
inherited;
|
|
end;
|
|
|
|
function TcxGridHeaderViewInfo.GetColumn(Index: Integer): TcxGridColumn;
|
|
begin
|
|
Result := GridView.VisibleColumns[Index];
|
|
end;
|
|
|
|
function TcxGridHeaderViewInfo.GetColumnCount: Integer;
|
|
begin
|
|
Result := GridView.VisibleColumnCount;
|
|
end;
|
|
|
|
procedure TcxGridHeaderViewInfo.AddIndicatorItems(AIndicatorViewInfo: TcxGridIndicatorViewInfo;
|
|
ATopBound: Integer);
|
|
begin
|
|
AIndicatorViewInfo.AddItem(ATopBound, Height, TcxGridIndicatorHeaderItemViewInfo);
|
|
end;
|
|
|
|
procedure TcxGridHeaderViewInfo.CalculateColumnAutoWidths;
|
|
var
|
|
AAutoWidthObject: TcxAutoWidthObject;
|
|
I: Integer;
|
|
begin
|
|
AAutoWidthObject := TcxAutoWidthObject.Create(Count);
|
|
try
|
|
for I := 0 to Count - 1 do
|
|
Items[I].InitAutoWidthItem(AAutoWidthObject.AddItem);
|
|
AAutoWidthObject.AvailableWidth := GridViewInfo.ClientWidth;
|
|
AAutoWidthObject.Calculate;
|
|
for I := 0 to Count - 1 do
|
|
Items[I].Width := AAutoWidthObject[I].AutoWidth;
|
|
finally
|
|
AAutoWidthObject.Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridHeaderViewInfo.CalculateColumnWidths;
|
|
begin
|
|
if CanCalculateAutoWidths then CalculateColumnAutoWidths;
|
|
end;
|
|
|
|
function TcxGridHeaderViewInfo.CalculateHeight: Integer;
|
|
begin
|
|
Result := FSpecific.Height;
|
|
end;
|
|
|
|
procedure TcxGridHeaderViewInfo.CalculateInvisible;
|
|
begin
|
|
if IsAlwaysVisibleForCalculation then
|
|
begin
|
|
CalculateVisible;
|
|
Height := 0;
|
|
Bounds := Rect(0, 0, 0, 0);
|
|
end
|
|
else
|
|
inherited;
|
|
end;
|
|
|
|
function TcxGridHeaderViewInfo.CalculateItemHeight: Integer;
|
|
var
|
|
I, AColumnHeight: Integer;
|
|
begin
|
|
if IsHeightAssigned then
|
|
Result := GridView.OptionsView.HeaderHeight
|
|
else
|
|
begin
|
|
Result := 0;
|
|
CalculateParams;
|
|
for I := 0 to Count - 1 do
|
|
if Items[I].Visible then
|
|
begin
|
|
AColumnHeight := Items[I].CalculateHeight;
|
|
if AColumnHeight > Result then Result := AColumnHeight;
|
|
end;
|
|
if Result = 0 then
|
|
Result := inherited CalculateItemHeight;
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridHeaderViewInfo.CalculateItems;
|
|
var
|
|
ALeftBound, ATopBound, I, AWidth: Integer;
|
|
AItem: TcxGridColumnHeaderViewInfo;
|
|
begin
|
|
with ItemsAreaBounds do
|
|
begin
|
|
ALeftBound := Left;
|
|
ATopBound := Top;
|
|
end;
|
|
for I := 0 to Count - 1 do
|
|
begin
|
|
AItem := Items[I];
|
|
AWidth := AItem.CalculateWidth;
|
|
AItem.Calculate(ALeftBound, ATopBound, AWidth, ItemHeight);
|
|
Inc(ALeftBound, AWidth);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridHeaderViewInfo.CalculateVisible;
|
|
begin
|
|
CalculateColumnWidths;
|
|
inherited;
|
|
end;
|
|
|
|
function TcxGridHeaderViewInfo.CalculateWidth: Integer;
|
|
begin
|
|
Result := GridViewInfo.RecordsViewInfo.RowWidth;
|
|
end;
|
|
|
|
function TcxGridHeaderViewInfo.CanCalculateAutoWidths: Boolean;
|
|
begin
|
|
Result := GridView.OptionsView.ColumnAutoWidth;
|
|
end;
|
|
|
|
function TcxGridHeaderViewInfo.DrawColumnBackgroundHandler(ACanvas: TcxCanvas;
|
|
const ABounds: TRect): Boolean;
|
|
begin
|
|
Result := ColumnBackgroundBitmap <> nil;
|
|
if Result then
|
|
ACanvas.FillRect(ABounds, ColumnBackgroundBitmap);
|
|
end;
|
|
|
|
function TcxGridHeaderViewInfo.GetAlignment: TcxGridPartAlignment;
|
|
begin
|
|
Result := gpaTop;
|
|
end;
|
|
|
|
function TcxGridHeaderViewInfo.GetAutoHeight: Boolean;
|
|
begin
|
|
Result := GridViewInfo.SupportsAutoHeight and GridView.OptionsView.HeaderAutoHeight;
|
|
end;
|
|
|
|
function TcxGridHeaderViewInfo.GetColumnBackgroundBitmap: TBitmap;
|
|
begin
|
|
Result := GridView.BackgroundBitmaps.GetBitmap(bbHeader);
|
|
end;
|
|
|
|
function TcxGridHeaderViewInfo.GetColumnNeighbors(AColumn: TcxGridColumn): TcxNeighbors;
|
|
begin
|
|
Result := [];
|
|
if not AColumn.IsLeft then Include(Result, nLeft);
|
|
if not AColumn.IsRight then Include(Result, nRight);
|
|
end;
|
|
|
|
function TcxGridHeaderViewInfo.GetHitTestClass: TcxCustomGridHitTestClass;
|
|
begin
|
|
Result := TcxGridHeaderHitTest;
|
|
end;
|
|
|
|
function TcxGridHeaderViewInfo.GetIsAutoWidth: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
function TcxGridHeaderViewInfo.GetIsScrollable: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
function TcxGridHeaderViewInfo.GetItemMultiLinePainting(AItem: TcxGridColumnHeaderViewInfo): Boolean;
|
|
begin
|
|
Result := inherited GetItemMultiLinePainting(AItem) or IsHeightAssigned;
|
|
end;
|
|
|
|
function TcxGridHeaderViewInfo.GetKind: TcxGridColumnContainerKind;
|
|
begin
|
|
Result := ckHeader;
|
|
end;
|
|
|
|
function TcxGridHeaderViewInfo.GetPainterClass: TcxCustomGridCellPainterClass;
|
|
begin
|
|
Result := TcxGridHeaderPainter;
|
|
end;
|
|
|
|
procedure TcxGridHeaderViewInfo.GetViewParams(var AParams: TcxViewParams);
|
|
begin
|
|
GridView.Styles.GetHeaderParams(nil, AParams);
|
|
end;
|
|
|
|
function TcxGridHeaderViewInfo.GetVisible: Boolean;
|
|
begin
|
|
Result := GridView.OptionsView.Header;
|
|
end;
|
|
|
|
function TcxGridHeaderViewInfo.GetWidth: Integer;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
Result := 0;
|
|
for I := 0 to Count - 1 do
|
|
Inc(Result, Items[I].CalculateWidth);
|
|
end;
|
|
|
|
function TcxGridHeaderViewInfo.GetZonesAreaBounds: TRect;
|
|
begin
|
|
Result := inherited GetZonesAreaBounds;
|
|
InflateRect(Result, 0, ColumnHeaderMovingZoneSize);
|
|
end;
|
|
|
|
function TcxGridHeaderViewInfo.IsAlwaysVisibleForCalculation: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
function TcxGridHeaderViewInfo.IsHeightAssigned: Boolean;
|
|
begin
|
|
Result := GridView.OptionsView.HeaderHeight <> 0;
|
|
end;
|
|
|
|
procedure TcxGridHeaderViewInfo.Offset(DX, DY: Integer);
|
|
begin
|
|
inherited;
|
|
RecalculateItemVisibles;
|
|
end;
|
|
|
|
procedure TcxGridHeaderViewInfo.RecalculateItemVisibles;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to Count - 1 do
|
|
with Items[I] do
|
|
CalculateVisible(Bounds.Left, Bounds.Right - Bounds.Left);
|
|
end;
|
|
|
|
procedure TcxGridHeaderViewInfo.AssignColumnWidths;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
GridView.BeginUpdate;
|
|
try
|
|
for I := 0 to Count - 1 do
|
|
with Items[I] do
|
|
Column.Width := RealWidth;
|
|
finally
|
|
GridView.EndUpdate;
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridHeaderViewInfo.Calculate(ALeftBound, ATopBound: Integer;
|
|
AWidth: Integer = -1; AHeight: Integer = -1);
|
|
begin
|
|
inherited;
|
|
CalculateItems;
|
|
end;
|
|
|
|
{ TcxGridGroupByBoxColumnHeaderViewInfo }
|
|
|
|
function TcxGridGroupByBoxColumnHeaderViewInfo.GetContainer: TcxGridGroupByBoxViewInfo;
|
|
begin
|
|
Result := TcxGridGroupByBoxViewInfo(inherited Container);
|
|
end;
|
|
|
|
function TcxGridGroupByBoxColumnHeaderViewInfo.CalculateHeight: Integer;
|
|
begin
|
|
Result := TcxGridGroupByBoxViewInfo(Container).ItemHeight;
|
|
end;
|
|
|
|
function TcxGridGroupByBoxColumnHeaderViewInfo.GetCaption: string;
|
|
begin
|
|
Result := Column.GetAlternateCaption;
|
|
end;
|
|
|
|
function TcxGridGroupByBoxColumnHeaderViewInfo.HasFixedContentSpace: Boolean;
|
|
begin
|
|
Result := Container.CalculatingColumnWidth;
|
|
end;
|
|
|
|
function TcxGridGroupByBoxColumnHeaderViewInfo.InheritedCalculateHeight: Integer;
|
|
begin
|
|
Result := inherited CalculateHeight;
|
|
end;
|
|
|
|
{ TcxGridGroupByBoxViewInfo }
|
|
|
|
function TcxGridGroupByBoxViewInfo.GetGroupByBoxVerOffset: Integer;
|
|
begin
|
|
Result := ItemHeight div 2;
|
|
end;
|
|
|
|
function TcxGridGroupByBoxViewInfo.GetLinkLineBounds(Index: Integer;
|
|
Horizontal: Boolean): TRect;
|
|
begin
|
|
Result := Items[Index].Bounds;
|
|
Result.Left := Result.Right - 2 * GroupByBoxHorOffset;
|
|
Result.Top := Result.Bottom;
|
|
Inc(Result.Bottom, GroupByBoxLineVerOffset);
|
|
if Horizontal then
|
|
begin
|
|
Result.Top := Result.Bottom - GroupByBoxLineWidth;
|
|
Inc(Result.Right, GroupByBoxHorOffset);
|
|
end
|
|
else
|
|
Result.Right := Result.Left + GroupByBoxLineWidth;
|
|
end;
|
|
|
|
function TcxGridGroupByBoxViewInfo.GetColumn(Index: Integer): TcxGridColumn;
|
|
begin
|
|
Result := GridView.GroupedColumns[Index];
|
|
end;
|
|
|
|
function TcxGridGroupByBoxViewInfo.GetColumnCount: Integer;
|
|
begin
|
|
Result := GridView.GroupedColumnCount;
|
|
end;
|
|
|
|
function TcxGridGroupByBoxViewInfo.GetItemClass: TcxGridColumnHeaderViewInfoClass;
|
|
begin
|
|
Result := TcxGridGroupByBoxColumnHeaderViewInfo;
|
|
end;
|
|
|
|
function TcxGridGroupByBoxViewInfo.CalculateHeight: Integer;
|
|
|
|
function TextHeight: Integer;
|
|
begin
|
|
CalculateParams;
|
|
Result := GridViewInfo.GetFontHeight(Params.Font);
|
|
GetCellTextAreaSize(Result);
|
|
Inc(Result, 2);
|
|
end;
|
|
|
|
begin
|
|
Result := ColumnCount;
|
|
if Result = 0 then
|
|
Result := 2 * GroupByBoxTopOffset + TextHeight
|
|
else
|
|
Result := 2 * GroupByBoxTopOffset +
|
|
ItemHeight div 2 * (Result + 1) + Byte(Odd(ItemHeight));
|
|
end;
|
|
|
|
function TcxGridGroupByBoxViewInfo.CalculateItemHeight: Integer;
|
|
var
|
|
I, AColumnHeight: Integer;
|
|
begin
|
|
Result := 0;
|
|
CalculateParams;
|
|
for I := 0 to Count - 1 do
|
|
begin
|
|
AColumnHeight := TcxGridGroupByBoxColumnHeaderViewInfo(Items[I]).InheritedCalculateHeight;
|
|
if AColumnHeight > Result then Result := AColumnHeight;
|
|
end;
|
|
if Result = 0 then
|
|
Result := inherited CalculateItemHeight;
|
|
end;
|
|
|
|
function TcxGridGroupByBoxViewInfo.CalculateWidth: Integer;
|
|
begin
|
|
Result := GridViewInfo.ClientWidth;
|
|
end;
|
|
|
|
function TcxGridGroupByBoxViewInfo.GetAlignment: TcxGridPartAlignment;
|
|
begin
|
|
Result := gpaTop;
|
|
end;
|
|
|
|
function TcxGridGroupByBoxViewInfo.GetAlignmentVert: TcxAlignmentVert;
|
|
begin
|
|
Result := vaCenter;
|
|
end;
|
|
|
|
function TcxGridGroupByBoxViewInfo.GetBackgroundBitmap: TBitmap;
|
|
begin
|
|
Result := GridView.BackgroundBitmaps.GetBitmap(bbGroupByBox);
|
|
end;
|
|
|
|
function TcxGridGroupByBoxViewInfo.GetColumnWidth(AColumn: TcxGridColumn): Integer;
|
|
begin
|
|
FCalculatingColumnWidth := True;
|
|
Result := Items[AColumn.GroupIndex].GetBestFitWidth;
|
|
FCalculatingColumnWidth := False;
|
|
end;
|
|
|
|
function TcxGridGroupByBoxViewInfo.GetHitTestClass: TcxCustomGridHitTestClass;
|
|
begin
|
|
Result := TcxGridGroupByBoxHitTest;
|
|
end;
|
|
|
|
function TcxGridGroupByBoxViewInfo.GetIsAutoWidth: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
function TcxGridGroupByBoxViewInfo.GetIsScrollable: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
function TcxGridGroupByBoxViewInfo.GetItemAreaBounds(AItem: TcxGridColumnHeaderViewInfo): TRect;
|
|
begin
|
|
SetRectEmpty(Result);
|
|
end;
|
|
|
|
function TcxGridGroupByBoxViewInfo.GetKind: TcxGridColumnContainerKind;
|
|
begin
|
|
Result := ckGroupByBox;
|
|
end;
|
|
|
|
function TcxGridGroupByBoxViewInfo.GetPainterClass: TcxCustomGridCellPainterClass;
|
|
begin
|
|
Result := TcxGridGroupByBoxPainter;
|
|
end;
|
|
|
|
function TcxGridGroupByBoxViewInfo.GetText: string;
|
|
begin
|
|
if Count = 0 then
|
|
Result := cxGetResourceString(@scxGridGroupByBoxCaption)
|
|
else
|
|
Result := '';
|
|
end;
|
|
|
|
function TcxGridGroupByBoxViewInfo.GetTextAreaBounds: TRect;
|
|
begin
|
|
Result := inherited GetTextAreaBounds;
|
|
Inc(Result.Left, GroupByBoxLeftOffset);
|
|
end;
|
|
|
|
procedure TcxGridGroupByBoxViewInfo.GetViewParams(var AParams: TcxViewParams);
|
|
begin
|
|
GridView.Styles.GetViewParams(vsGroupByBox, nil, nil, AParams);
|
|
end;
|
|
|
|
function TcxGridGroupByBoxViewInfo.GetVisible: Boolean;
|
|
begin
|
|
Result := GridView.OptionsView.GroupByBox;
|
|
end;
|
|
|
|
procedure TcxGridGroupByBoxViewInfo.Calculate(ALeftBound, ATopBound: Integer;
|
|
AWidth: Integer = -1; AHeight: Integer = -1);
|
|
var
|
|
I: Integer;
|
|
AColumnHeaderViewInfo: TcxGridColumnHeaderViewInfo;
|
|
begin
|
|
inherited;
|
|
with Bounds do
|
|
begin
|
|
ALeftBound := Left + GroupByBoxLeftOffset;
|
|
ATopBound := Top + GroupByBoxTopOffset;
|
|
end;
|
|
for I := 0 to Count - 1 do
|
|
begin
|
|
AColumnHeaderViewInfo := Items[I];
|
|
AColumnHeaderViewInfo.Calculate(ALeftBound, ATopBound);
|
|
Inc(ALeftBound, AColumnHeaderViewInfo.Width + GroupByBoxHorOffset);
|
|
Inc(ATopBound, GroupByBoxVerOffset);
|
|
end;
|
|
end;
|
|
|
|
{ TcxGridFooterCellViewInfo }
|
|
|
|
constructor TcxGridFooterCellViewInfo.Create(AContainer: TcxGridColumnContainerViewInfo;
|
|
ASummaryItem: TcxDataSummaryItem);
|
|
begin
|
|
inherited Create(AContainer, TcxGridColumn(ASummaryItem.ItemLink));
|
|
FSummaryItem := ASummaryItem;
|
|
end;
|
|
|
|
function TcxGridFooterCellViewInfo.GetContainer: TcxGridFooterViewInfo;
|
|
begin
|
|
Result := TcxGridFooterViewInfo(inherited Container);
|
|
end;
|
|
|
|
function TcxGridFooterCellViewInfo.GetSummary: TcxDataSummary;
|
|
begin
|
|
Result := SummaryItem.SummaryItems.Summary;
|
|
end;
|
|
|
|
procedure TcxGridFooterCellViewInfo.AfterCalculateBounds(var ABounds: TRect);
|
|
begin
|
|
inherited;
|
|
with LookAndFeelPainter do
|
|
InflateRect(ABounds, -FooterCellOffset, -FooterCellOffset);
|
|
end;
|
|
|
|
function TcxGridFooterCellViewInfo.CanPress: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
function TcxGridFooterCellViewInfo.CustomDraw(ACanvas: TcxCanvas): Boolean;
|
|
begin
|
|
Result := False;
|
|
Column.DoCustomDrawFooterCell(ACanvas, Self, Result);
|
|
if not Result then
|
|
GridView.DoCustomDrawFooterCell(ACanvas, Self, Result);
|
|
end;
|
|
|
|
function TcxGridFooterCellViewInfo.GetAlignmentHorz: TAlignment;
|
|
begin
|
|
Result := Column.FooterAlignmentHorz;
|
|
end;
|
|
|
|
function TcxGridFooterCellViewInfo.GetBackgroundBitmap: TBitmap;
|
|
begin
|
|
Result := Container.BackgroundBitmap;
|
|
end;
|
|
|
|
procedure TcxGridFooterCellViewInfo.GetAreaViewInfoClasses(AProc: TcxGridClassEnumeratorProc);
|
|
begin
|
|
end;
|
|
|
|
function TcxGridFooterCellViewInfo.GetBorders: TcxBorders;
|
|
begin
|
|
Result := cxBordersAll;
|
|
end;
|
|
|
|
class function TcxGridFooterCellViewInfo.GetCellBorderWidth(ALookAndFeelPainter: TcxCustomLookAndFeelPainterClass): Integer;
|
|
begin
|
|
Result := ALookAndFeelPainter.FooterCellBorderSize;
|
|
end;
|
|
|
|
function TcxGridFooterCellViewInfo.GetHitTestClass: TcxCustomGridHitTestClass;
|
|
begin
|
|
Result := Container.GetItemHitTestClass;
|
|
end;
|
|
|
|
function TcxGridFooterCellViewInfo.GetIsDesignSelected: Boolean;
|
|
begin
|
|
Result := GridView.IsDesigning and
|
|
GridView.Controller.DesignController.IsObjectSelected(SummaryItem);
|
|
end;
|
|
|
|
function TcxGridFooterCellViewInfo.GetIsPressed: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
function TcxGridFooterCellViewInfo.GetPainterClass: TcxCustomGridCellPainterClass;
|
|
begin
|
|
Result := TcxGridFooterCellPainter;
|
|
end;
|
|
|
|
function TcxGridFooterCellViewInfo.GetText: string;
|
|
begin
|
|
try
|
|
Result := Summary.FooterSummaryTexts[SummaryItem.Index];
|
|
except
|
|
Application.HandleException(Self);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridFooterCellViewInfo.GetViewParams(var AParams: TcxViewParams);
|
|
begin
|
|
GridView.Styles.GetFooterCellParams(nil, Column, -1, SummaryItem, AParams);
|
|
end;
|
|
|
|
function TcxGridFooterCellViewInfo.HasCustomDraw: Boolean;
|
|
begin
|
|
Result := Column.HasCustomDrawFooterCell or GridView.HasCustomDrawFooterCell;
|
|
end;
|
|
|
|
procedure TcxGridFooterCellViewInfo.InitHitTest(AHitTest: TcxCustomGridHitTest);
|
|
begin
|
|
inherited;
|
|
(AHitTest as TcxGridFooterCellHitTest).SummaryItem := SummaryItem;
|
|
end;
|
|
|
|
function TcxGridFooterCellViewInfo.GetBestFitWidth: Integer;
|
|
begin
|
|
Result := inherited GetBestFitWidth + 2 * LookAndFeelPainter.FooterCellOffset;
|
|
end;
|
|
|
|
function TcxGridFooterCellViewInfo.MouseDown(AHitTest: TcxCustomGridHitTest;
|
|
AButton: TMouseButton; AShift: TShiftState): Boolean;
|
|
begin
|
|
Result := inherited MouseDown(AHitTest, AButton, AShift);
|
|
if GridView.IsDesigning and (AButton = mbLeft) then
|
|
begin
|
|
GridView.Controller.DesignController.SelectObject(SummaryItem, not (ssShift in AShift));
|
|
Result := True;
|
|
end;
|
|
end;
|
|
|
|
{ TcxGridFooterViewInfo }
|
|
|
|
function TcxGridFooterViewInfo.GetMultipleSummaries: Boolean;
|
|
begin
|
|
Result := RowCount > 1;
|
|
end;
|
|
|
|
function TcxGridFooterViewInfo.GetRowCount: Integer;
|
|
begin
|
|
if FRowCount = 0 then
|
|
FRowCount := CalculateRowCount;
|
|
Result := FRowCount;
|
|
end;
|
|
|
|
function TcxGridFooterViewInfo.GetRowHeight: Integer;
|
|
begin
|
|
if MultipleSummaries then
|
|
Result := ItemHeight
|
|
else
|
|
Result := inherited CalculateHeight;
|
|
end;
|
|
|
|
function TcxGridFooterViewInfo.CreateItem(AIndex: Integer): TcxGridColumnHeaderViewInfo;
|
|
begin
|
|
Result := TcxGridFooterCellViewInfoClass(GetItemClass).Create(Self, FSummaryItems[AIndex]);
|
|
end;
|
|
|
|
procedure TcxGridFooterViewInfo.CreateItems;
|
|
var
|
|
AColumnHasSummaries: array of Boolean;
|
|
I, AColumnVisibleIndex: Integer;
|
|
ASummaryItem: TcxDataSummaryItem;
|
|
begin
|
|
FSummaryItems := TList.Create;
|
|
SetLength(AColumnHasSummaries, GridView.VisibleColumnCount);
|
|
for I := 0 to SummaryItems.Count - 1 do
|
|
begin
|
|
ASummaryItem := SummaryItems[I];
|
|
if (ASummaryItem.Position = spFooter) and (ASummaryItem.ItemLink is TcxGridColumn) then
|
|
begin
|
|
AColumnVisibleIndex := TcxGridColumn(ASummaryItem.ItemLink).VisibleIndex;
|
|
if (AColumnVisibleIndex <> -1) and
|
|
(CanShowMultipleSummaries or not AColumnHasSummaries[AColumnVisibleIndex]) then
|
|
begin
|
|
FSummaryItems.Add(ASummaryItem);
|
|
AColumnHasSummaries[AColumnVisibleIndex] := True;
|
|
end;
|
|
end;
|
|
end;
|
|
PrepareSummaryItems(FSummaryItems);
|
|
inherited;
|
|
end;
|
|
|
|
procedure TcxGridFooterViewInfo.DestroyItems;
|
|
begin
|
|
inherited;
|
|
FreeAndNil(FSummaryItems);
|
|
end;
|
|
|
|
function TcxGridFooterViewInfo.GetColumn(Index: Integer): TcxGridColumn;
|
|
begin
|
|
Result := TcxGridColumn(TcxDataSummaryItem(FSummaryItems[Index]).ItemLink);
|
|
end;
|
|
|
|
function TcxGridFooterViewInfo.GetColumnCount: Integer;
|
|
begin
|
|
Result := FSummaryItems.Count;
|
|
end;
|
|
|
|
function TcxGridFooterViewInfo.GetItemClass: TcxGridColumnHeaderViewInfoClass;
|
|
begin
|
|
Result := TcxGridFooterCellViewInfo;
|
|
end;
|
|
|
|
procedure TcxGridFooterViewInfo.PrepareSummaryItems(ASummaryItems: TList);
|
|
begin
|
|
end;
|
|
|
|
function TcxGridFooterViewInfo.CalculateBounds: TRect;
|
|
begin
|
|
Result := inherited CalculateBounds;
|
|
with GridViewInfo.HeaderViewInfo.CalculateBounds do
|
|
begin
|
|
Result.Left := Left;
|
|
Result.Right := Right;
|
|
end;
|
|
end;
|
|
|
|
function TcxGridFooterViewInfo.CalculateHeight: Integer;
|
|
begin
|
|
CalculateParams;
|
|
Result := BorderSize[bTop] + RowCount * RowHeight + BorderSize[bBottom];
|
|
Inc(Result, SeparatorWidth);
|
|
end;
|
|
|
|
function TcxGridFooterViewInfo.CalculateItemHeight: Integer;
|
|
begin
|
|
Result := inherited CalculateItemHeight + 2 * LookAndFeelPainter.FooterCellOffset;
|
|
end;
|
|
|
|
procedure TcxGridFooterViewInfo.CalculateItem(AIndex: Integer);
|
|
begin
|
|
Items[AIndex].Calculate(GetItemLeftBound(AIndex), GetItemTopBound(AIndex),
|
|
-1, GetItemHeight(AIndex));
|
|
end;
|
|
|
|
procedure TcxGridFooterViewInfo.CalculateItems;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to Count - 1 do
|
|
if IsItemVisible(I) then CalculateItem(I);
|
|
end;
|
|
|
|
function TcxGridFooterViewInfo.CalculateRowCount: Integer;
|
|
var
|
|
I: Integer;
|
|
ItemCount: array of Integer;
|
|
begin
|
|
Result := 1;
|
|
if Count = 0 then Exit;
|
|
SetLength(ItemCount, GridView.VisibleItemCount);
|
|
for I := 0 to Count - 1 do
|
|
Inc(ItemCount[Items[I].Column.VisibleIndex]);
|
|
for I := 0 to Length(ItemCount) - 1 do
|
|
Result := Max(Result, ItemCount[I]);
|
|
end;
|
|
|
|
function TcxGridFooterViewInfo.CanCalculateAutoWidths: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
function TcxGridFooterViewInfo.GetAlignment: TcxGridPartAlignment;
|
|
begin
|
|
Result := gpaBottom;
|
|
end;
|
|
|
|
function TcxGridFooterViewInfo.GetAutoHeight: Boolean;
|
|
begin
|
|
Result := GridViewInfo.SupportsAutoHeight and
|
|
GridView.OptionsView.FooterAutoHeight and not MultipleSummaries;
|
|
end;
|
|
|
|
function TcxGridFooterViewInfo.GetBackgroundBitmap: TBitmap;
|
|
begin
|
|
Result := GridView.BackgroundBitmaps.GetBitmap(bbFooter);
|
|
end;
|
|
|
|
function TcxGridFooterViewInfo.GetBordersBounds: TRect;
|
|
begin
|
|
Result := Bounds;
|
|
Inc(Result.Top, SeparatorWidth);
|
|
end;
|
|
|
|
function TcxGridFooterViewInfo.GetBorders: TcxBorders;
|
|
begin
|
|
Result := LookAndFeelPainter.FooterBorders;
|
|
end;
|
|
|
|
function TcxGridFooterViewInfo.GetBorderWidth(AIndex: TcxBorder): Integer;
|
|
begin
|
|
Result := LookAndFeelPainter.FooterBorderSize;
|
|
end;
|
|
|
|
function TcxGridFooterViewInfo.GetColumnWidth(AColumn: TcxGridColumn): Integer;
|
|
begin
|
|
Result := GridViewInfo.HeaderViewInfo[AColumn.VisibleIndex].Width;
|
|
if AColumn.IsMostLeft then
|
|
Dec(Result, BorderSize[bLeft]);
|
|
if AColumn.IsMostRight then
|
|
Dec(Result, BorderSize[bRight]);
|
|
end;
|
|
|
|
function TcxGridFooterViewInfo.GetHitTestClass: TcxCustomGridHitTestClass;
|
|
begin
|
|
Result := TcxGridFooterHitTest;
|
|
end;
|
|
|
|
function TcxGridFooterViewInfo.GetIsAutoWidth: Boolean;
|
|
begin
|
|
Result := GridViewInfo.HeaderViewInfo.IsAutoWidth;
|
|
end;
|
|
|
|
function TcxGridFooterViewInfo.GetIsScrollable: Boolean;
|
|
begin
|
|
Result := GridViewInfo.HeaderViewInfo.IsScrollable;
|
|
end;
|
|
|
|
function TcxGridFooterViewInfo.GetItemAreaBounds(AItem: TcxGridColumnHeaderViewInfo): TRect;
|
|
begin
|
|
Result := GridViewInfo.HeaderViewInfo.GetItemAreaBounds(AItem);
|
|
end;
|
|
|
|
function TcxGridFooterViewInfo.GetItemHeight(AColumn: TcxGridColumn): Integer;
|
|
begin
|
|
if MultipleSummaries then
|
|
Result := ItemHeight
|
|
else
|
|
Result := GridViewInfo.GetCellHeight(AColumn.VisibleIndex, ItemHeight);
|
|
end;
|
|
|
|
function TcxGridFooterViewInfo.GetItemHeight(AIndex: Integer): Integer;
|
|
begin
|
|
Result := GetItemHeight(Items[AIndex].Column);
|
|
end;
|
|
|
|
function TcxGridFooterViewInfo.GetItemHitTestClass: TcxCustomGridHitTestClass;
|
|
begin
|
|
Result := TcxGridFooterCellHitTest;
|
|
end;
|
|
|
|
function TcxGridFooterViewInfo.GetItemLeftBound(AColumn: TcxGridColumn): Integer;
|
|
begin
|
|
if AColumn.IsMostLeft then
|
|
Result := ItemsAreaBounds.Left
|
|
else
|
|
Result := GridViewInfo.HeaderViewInfo[AColumn.VisibleIndex].RealBounds.Left;
|
|
end;
|
|
|
|
function TcxGridFooterViewInfo.GetItemLeftBound(AIndex: Integer): Integer;
|
|
begin
|
|
Result := GetItemLeftBound(Items[AIndex].Column);
|
|
end;
|
|
|
|
function TcxGridFooterViewInfo.GetItemRowIndex(AIndex: Integer): Integer;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
Result := 0;
|
|
for I := 0 to AIndex - 1 do
|
|
if Items[I].Column = Items[AIndex].Column then
|
|
Inc(Result);
|
|
end;
|
|
|
|
function TcxGridFooterViewInfo.GetItemsAreaBounds: TRect;
|
|
begin
|
|
Result := BordersBounds;
|
|
with Result do
|
|
begin
|
|
Inc(Left, BorderSize[bLeft]);
|
|
Inc(Top, BorderSize[bTop]);
|
|
Dec(Right, BorderSize[bRight]);
|
|
Dec(Bottom, BorderSize[bBottom]);
|
|
end;
|
|
end;
|
|
|
|
function TcxGridFooterViewInfo.GetItemTopBound(AColumn: TcxGridColumn): Integer;
|
|
begin
|
|
Result := ItemsAreaBounds.Top + GridViewInfo.GetCellTopOffset(AColumn.VisibleIndex, ItemHeight);
|
|
end;
|
|
|
|
function TcxGridFooterViewInfo.GetItemTopBound(AIndex: Integer): Integer;
|
|
begin
|
|
Result := GetItemTopBound(Items[AIndex].Column) + GetItemRowIndex(AIndex) * RowHeight;
|
|
end;
|
|
|
|
function TcxGridFooterViewInfo.GetKind: TcxGridColumnContainerKind;
|
|
begin
|
|
Result := ckFooter;
|
|
end;
|
|
|
|
function TcxGridFooterViewInfo.GetPainterClass: TcxCustomGridCellPainterClass;
|
|
begin
|
|
Result := GridViewInfo.GetFooterPainterClass;
|
|
end;
|
|
|
|
function TcxGridFooterViewInfo.GetSeparatorBounds: TRect;
|
|
begin
|
|
Result := Bounds;
|
|
Result.Bottom := Result.Top + SeparatorWidth;
|
|
end;
|
|
|
|
function TcxGridFooterViewInfo.GetSeparatorWidth: Integer;
|
|
begin
|
|
if HasSeparator then
|
|
Result := LookAndFeelPainter.FooterSeparatorSize
|
|
else
|
|
Result := 0;
|
|
end;
|
|
|
|
function TcxGridFooterViewInfo.GetSummaryItems: TcxDataSummaryItems;
|
|
begin
|
|
Result := GridView.FDataController.Summary.FooterSummaryItems;
|
|
end;
|
|
|
|
procedure TcxGridFooterViewInfo.GetViewParams(var AParams: TcxViewParams);
|
|
begin
|
|
GridView.Styles.GetFooterParams(nil, nil, -1, nil, AParams);
|
|
end;
|
|
|
|
function TcxGridFooterViewInfo.GetVisible: Boolean;
|
|
begin
|
|
Result := GridView.OptionsView.Footer;
|
|
end;
|
|
|
|
function TcxGridFooterViewInfo.HasSeparator: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
function TcxGridFooterViewInfo.IsAlwaysVisibleForCalculation: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
function TcxGridFooterViewInfo.IsHeightAssigned: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
function TcxGridFooterViewInfo.IsItemVisible(AIndex: Integer): Boolean;
|
|
begin
|
|
Result := GridViewInfo.HeaderViewInfo[Items[AIndex].Column.VisibleIndex].Visible;
|
|
end;
|
|
|
|
procedure TcxGridFooterViewInfo.Offset(DX, DY: Integer);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
inherited;
|
|
if DX <> 0 then
|
|
for I := 0 to Count - 1 do
|
|
if IsItemVisible(I) then
|
|
if not Items[I].Calculated then
|
|
CalculateItem(I)
|
|
else
|
|
else
|
|
Items[I].Calculated := False;
|
|
end;
|
|
|
|
function TcxGridFooterViewInfo.CanShowMultipleSummaries: Boolean;
|
|
begin
|
|
Result := GridView.OptionsView.CanShowFooterMultiSummaries;
|
|
end;
|
|
|
|
function TcxGridFooterViewInfo.GetCellBestFitWidth(AColumn: TcxGridColumn): Integer;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
Result := 0;
|
|
for I := 0 to Count - 1 do
|
|
if Items[I].Column = AColumn then
|
|
Result := Max(Result, Items[I].GetBestFitWidth);
|
|
end;
|
|
|
|
function TcxGridFooterViewInfo.GetHitTest(const P: TPoint): TcxCustomGridHitTest;
|
|
|
|
function GetCellBounds(AColumn: TcxGridColumn): TRect;
|
|
begin
|
|
Result.Left := GetItemLeftBound(AColumn);
|
|
Result.Right := Result.Left + GetColumnWidth(AColumn);
|
|
if MultipleSummaries then
|
|
with ItemsAreaBounds do
|
|
begin
|
|
Result.Top := Top;
|
|
Result.Bottom := Bottom;
|
|
end
|
|
else
|
|
begin
|
|
Result.Top := GetItemTopBound(AColumn);
|
|
Result.Bottom := Result.Top + GetItemHeight(AColumn);
|
|
end;
|
|
end;
|
|
|
|
var
|
|
I: Integer;
|
|
AColumn: TcxGridColumn;
|
|
begin
|
|
Result := GetItemsHitTest(P);
|
|
if Result = nil then
|
|
begin
|
|
Result := inherited GetHitTest(P);
|
|
if Result <> nil then
|
|
for I := 0 to GridView.VisibleColumnCount - 1 do
|
|
begin
|
|
AColumn := GridView.VisibleColumns[I];
|
|
if PtInRect(GetCellBounds(AColumn), P) then
|
|
begin
|
|
Result := GetItemHitTestClass.Instance(P);
|
|
InitHitTest(Result);
|
|
TcxGridFooterCellHitTest(Result).Column := AColumn;
|
|
TcxGridFooterCellHitTest(Result).SummaryItem := nil;
|
|
Break;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
{ TcxCustomGridIndicatorItemViewInfo }
|
|
|
|
constructor TcxCustomGridIndicatorItemViewInfo.Create(AContainer: TcxGridIndicatorViewInfo);
|
|
begin
|
|
inherited Create(AContainer.GridViewInfo);
|
|
FContainer := AContainer;
|
|
end;
|
|
|
|
destructor TcxCustomGridIndicatorItemViewInfo.Destroy;
|
|
begin
|
|
FContainer.FItems.Remove(Self);
|
|
inherited;
|
|
end;
|
|
|
|
function TcxCustomGridIndicatorItemViewInfo.GetGridView: TcxGridTableView;
|
|
begin
|
|
Result := TcxGridTableView(inherited GridView);
|
|
end;
|
|
|
|
function TcxCustomGridIndicatorItemViewInfo.GetGridViewInfo: TcxGridTableViewInfo;
|
|
begin
|
|
Result := TcxGridTableViewInfo(inherited GridViewInfo);
|
|
end;
|
|
|
|
function TcxCustomGridIndicatorItemViewInfo.CalculateWidth: Integer;
|
|
begin
|
|
Result := FContainer.Width;
|
|
end;
|
|
|
|
function TcxCustomGridIndicatorItemViewInfo.CustomDraw(ACanvas: TcxCanvas): Boolean;
|
|
begin
|
|
Result := inherited CustomDraw(ACanvas);
|
|
if not Result then
|
|
GridView.DoCustomDrawIndicatorCell(ACanvas, Self, Result);
|
|
end;
|
|
|
|
function TcxCustomGridIndicatorItemViewInfo.GetHitTestClass: TcxCustomGridHitTestClass;
|
|
begin
|
|
Result := TcxGridIndicatorHitTest;
|
|
end;
|
|
|
|
function TcxCustomGridIndicatorItemViewInfo.GetPainterClass: TcxCustomGridCellPainterClass;
|
|
begin
|
|
Result := TcxCustomGridIndicatorItemPainter;
|
|
end;
|
|
|
|
procedure TcxCustomGridIndicatorItemViewInfo.GetViewParams(var AParams: TcxViewParams);
|
|
begin
|
|
GridView.Styles.GetViewParams(vsIndicator, nil, nil, AParams);
|
|
end;
|
|
|
|
function TcxCustomGridIndicatorItemViewInfo.HasCustomDraw: Boolean;
|
|
begin
|
|
Result := GridView.HasCustomDrawIndicatorCell;
|
|
end;
|
|
|
|
{ TcxGridIndicatorHeaderItemViewInfo }
|
|
|
|
function TcxGridIndicatorHeaderItemViewInfo.GetDropDownWindowValue: TcxCustomGridCustomizationPopup;
|
|
begin
|
|
Result := TcxCustomGridCustomizationPopup(inherited DropDownWindow);
|
|
end;
|
|
|
|
function TcxGridIndicatorHeaderItemViewInfo.CalculateHeight: Integer;
|
|
begin
|
|
Result := 0;
|
|
end;
|
|
|
|
function TcxGridIndicatorHeaderItemViewInfo.CanShowHint: Boolean;
|
|
begin
|
|
Result := SupportsQuickCustomization;
|
|
end;
|
|
|
|
function TcxGridIndicatorHeaderItemViewInfo.GetCellBoundsForHint: TRect;
|
|
begin
|
|
Result := Bounds;
|
|
end;
|
|
|
|
function TcxGridIndicatorHeaderItemViewInfo.GetHintTextRect(const AMousePos: TPoint): TRect;
|
|
begin
|
|
Result := Bounds;
|
|
OffsetRect(Result, 0, Height + 5);
|
|
end;
|
|
|
|
function TcxGridIndicatorHeaderItemViewInfo.GetHitTestClass: TcxCustomGridHitTestClass;
|
|
begin
|
|
Result := TcxGridIndicatorHeaderHitTest;
|
|
end;
|
|
|
|
function TcxGridIndicatorHeaderItemViewInfo.GetHotTrack: Boolean;
|
|
begin
|
|
Result := SupportsQuickCustomization;
|
|
end;
|
|
|
|
function TcxGridIndicatorHeaderItemViewInfo.GetPainterClass: TcxCustomGridCellPainterClass;
|
|
begin
|
|
Result := TcxGridIndicatorHeaderItemPainter;
|
|
end;
|
|
|
|
function TcxGridIndicatorHeaderItemViewInfo.GetText: string;
|
|
begin
|
|
Result := cxGetResourceString(@scxGridColumnsQuickCustomizationHint);
|
|
end;
|
|
|
|
procedure TcxGridIndicatorHeaderItemViewInfo.GetViewParams(var AParams: TcxViewParams);
|
|
begin
|
|
GridView.Styles.GetHeaderParams(nil, AParams);
|
|
end;
|
|
|
|
function TcxGridIndicatorHeaderItemViewInfo.IsHintForText: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
function TcxGridIndicatorHeaderItemViewInfo.IsHintMultiLine: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
function TcxGridIndicatorHeaderItemViewInfo.SupportsQuickCustomization: Boolean;
|
|
begin
|
|
Result := GridView.OptionsCustomize.ColumnsQuickCustomization;
|
|
end;
|
|
|
|
function TcxGridIndicatorHeaderItemViewInfo.CloseDropDownWindowOnDestruction: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
function TcxGridIndicatorHeaderItemViewInfo.DropDownWindowExists: Boolean;
|
|
begin
|
|
Result := GridView.Controller.HasItemsCustomizationPopup;
|
|
end;
|
|
|
|
function TcxGridIndicatorHeaderItemViewInfo.GetDropDownWindow: TcxCustomGridPopup;
|
|
begin
|
|
Result := GridView.Controller.ItemsCustomizationPopup;
|
|
end;
|
|
|
|
{ TcxGridIndicatorRowItemViewInfo }
|
|
|
|
destructor TcxGridIndicatorRowItemViewInfo.Destroy;
|
|
begin
|
|
FRowViewInfo.FIndicatorItem := nil;
|
|
inherited;
|
|
end;
|
|
|
|
function TcxGridIndicatorRowItemViewInfo.GetGridRecord: TcxCustomGridRow;
|
|
begin
|
|
Result := FRowViewInfo.GridRecord;
|
|
end;
|
|
|
|
function TcxGridIndicatorRowItemViewInfo.GetGridView: TcxGridTableView;
|
|
begin
|
|
Result := TcxGridTableView(inherited GridView);
|
|
end;
|
|
|
|
function TcxGridIndicatorRowItemViewInfo.CalculateHeight: Integer;
|
|
begin
|
|
Result := 0;
|
|
end;
|
|
|
|
function TcxGridIndicatorRowItemViewInfo.GetBackgroundBitmap: TBitmap;
|
|
begin
|
|
Result := GridView.BackgroundBitmaps.GetBitmap(bbIndicator);
|
|
end;
|
|
|
|
function TcxGridIndicatorRowItemViewInfo.GetIndicatorKind: TcxIndicatorKind;
|
|
var
|
|
ARecordSelected: Boolean;
|
|
begin
|
|
if GridRecord.IsFilterRow then
|
|
Result := ikFilter
|
|
else
|
|
if GridRecord.IsNewItemRow then
|
|
Result := ikInsert
|
|
else
|
|
if GridRecord.IsEditing then
|
|
if dceInsert in GridView.FDataController.EditState then
|
|
Result := ikInsert
|
|
else
|
|
Result := ikEdit
|
|
else
|
|
begin
|
|
ARecordSelected := GridView.OptionsSelection.MultiSelect and GridRecord.Selected;
|
|
if GridRecord.Focused then
|
|
if ARecordSelected then
|
|
Result := ikMultiArrow
|
|
else
|
|
Result := ikArrow
|
|
else
|
|
if ARecordSelected then
|
|
Result := ikMultiDot
|
|
else
|
|
Result := ikNone;
|
|
end;
|
|
end;
|
|
|
|
function TcxGridIndicatorRowItemViewInfo.GetHitTestClass: TcxCustomGridHitTestClass;
|
|
begin
|
|
Result := TcxGridRowIndicatorHitTest;
|
|
end;
|
|
|
|
function TcxGridIndicatorRowItemViewInfo.GetPainterClass: TcxCustomGridCellPainterClass;
|
|
begin
|
|
Result := TcxGridIndicatorRowItemPainter;
|
|
end;
|
|
|
|
function TcxGridIndicatorRowItemViewInfo.GetRowSizingEdgeBounds: TRect;
|
|
begin
|
|
Result := Bounds;
|
|
with Result do
|
|
begin
|
|
Top := Bottom - cxGridRowSizingEdgeSize div 2;
|
|
Inc(Bottom, cxGridRowSizingEdgeSize div 2);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridIndicatorRowItemViewInfo.InitHitTest(AHitTest: TcxCustomGridHitTest);
|
|
begin
|
|
inherited;
|
|
TcxGridRecordHitTest(AHitTest).GridRecord := GridRecord;
|
|
if AHitTest is TcxGridRowIndicatorHitTest then
|
|
begin
|
|
AHitTest.ViewInfo := GridRecord.ViewInfo;
|
|
TcxGridRowIndicatorHitTest(AHitTest).MultiSelect := GridView.Controller.MultiSelect;
|
|
end;
|
|
end;
|
|
|
|
function TcxGridIndicatorRowItemViewInfo.GetHitTest(const P: TPoint): TcxCustomGridHitTest;
|
|
begin
|
|
if RowViewInfo.CanSize and PtInRect(RowSizingEdgeBounds, P) then
|
|
begin
|
|
Result := TcxGridRowSizingEdgeHitTest.Instance(P);
|
|
InitHitTest(Result);
|
|
end
|
|
else
|
|
Result := inherited GetHitTest(P);
|
|
end;
|
|
|
|
function TcxGridIndicatorRowItemViewInfo.MouseDown(AHitTest: TcxCustomGridHitTest;
|
|
AButton: TMouseButton; AShift: TShiftState): Boolean;
|
|
begin
|
|
Result := inherited MouseDown(AHitTest, AButton, AShift);
|
|
if (AButton = mbLeft) and (ssDouble in AShift) and
|
|
(AHitTest.HitTestCode = htRowSizingEdge) then
|
|
RowViewInfo.RowHeight := 0;
|
|
end;
|
|
|
|
{ TcxGridIndicatorFooterItemViewInfo }
|
|
|
|
function TcxGridIndicatorFooterItemViewInfo.GetSeparatorWidth: Integer;
|
|
begin
|
|
Result := GridViewInfo.FooterViewInfo.SeparatorWidth;
|
|
end;
|
|
|
|
function TcxGridIndicatorFooterItemViewInfo.CalculateHeight: Integer;
|
|
begin
|
|
Result := 0;
|
|
end;
|
|
|
|
function TcxGridIndicatorFooterItemViewInfo.GetBackgroundBitmap: TBitmap;
|
|
begin
|
|
Result := GridViewInfo.FooterViewInfo.BackgroundBitmap;
|
|
end;
|
|
|
|
function TcxGridIndicatorFooterItemViewInfo.GetBorders: TcxBorders;
|
|
begin
|
|
Result := LookAndFeelPainter.FooterBorders;
|
|
end;
|
|
|
|
function TcxGridIndicatorFooterItemViewInfo.GetBordersBounds: TRect;
|
|
begin
|
|
Result := Bounds;
|
|
Inc(Result.Top, SeparatorWidth);
|
|
end;
|
|
|
|
function TcxGridIndicatorFooterItemViewInfo.GetBorderWidth(AIndex: TcxBorder): Integer;
|
|
begin
|
|
Result := LookAndFeelPainter.FooterBorderSize;
|
|
if AIndex = bTop then Inc(Result, SeparatorWidth);
|
|
end;
|
|
|
|
function TcxGridIndicatorFooterItemViewInfo.GetPainterClass: TcxCustomGridCellPainterClass;
|
|
begin
|
|
Result := TcxGridIndicatorFooterItemPainter;
|
|
end;
|
|
|
|
function TcxGridIndicatorFooterItemViewInfo.GetSeparatorBounds: TRect;
|
|
begin
|
|
Result := Bounds;
|
|
Result.Bottom := Result.Top + SeparatorWidth;
|
|
end;
|
|
|
|
function TcxGridIndicatorFooterItemViewInfo.HasSeparator: Boolean;
|
|
begin
|
|
Result := GridViewInfo.FooterViewInfo.HasSeparator;
|
|
end;
|
|
|
|
{ TcxGridIndicatorViewInfo }
|
|
|
|
constructor TcxGridIndicatorViewInfo.Create(AGridViewInfo: TcxGridTableViewInfo);
|
|
begin
|
|
inherited Create(AGridViewInfo);
|
|
FItems := TList.Create;
|
|
end;
|
|
|
|
destructor TcxGridIndicatorViewInfo.Destroy;
|
|
begin
|
|
DestroyItems;
|
|
FItems.Free;
|
|
inherited;
|
|
end;
|
|
|
|
function TcxGridIndicatorViewInfo.GetCount: Integer;
|
|
begin
|
|
Result := FItems.Count;
|
|
end;
|
|
|
|
function TcxGridIndicatorViewInfo.GetGridView: TcxGridTableView;
|
|
begin
|
|
Result := TcxGridTableView(inherited GridView);
|
|
end;
|
|
|
|
function TcxGridIndicatorViewInfo.GetGridViewInfo: TcxGridTableViewInfo;
|
|
begin
|
|
Result := TcxGridTableViewInfo(inherited GridViewInfo);
|
|
end;
|
|
|
|
function TcxGridIndicatorViewInfo.GetItem(Index: Integer): TcxCustomGridIndicatorItemViewInfo;
|
|
begin
|
|
Result := TcxCustomGridIndicatorItemViewInfo(FItems[Index]);
|
|
end;
|
|
|
|
procedure TcxGridIndicatorViewInfo.DestroyItems;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := Count - 1 downto 0 do Items[I].Free;
|
|
end;
|
|
|
|
function TcxGridIndicatorViewInfo.CalculateHeight: Integer;
|
|
begin
|
|
with GridViewInfo do
|
|
Result := HeaderViewInfo.Height + ClientHeight + FooterViewInfo.Height;
|
|
end;
|
|
|
|
function TcxGridIndicatorViewInfo.CalculateWidth: Integer;
|
|
begin
|
|
if Visible then
|
|
Result := GridView.OptionsView.IndicatorWidth
|
|
else
|
|
Result := 0;
|
|
end;
|
|
|
|
function TcxGridIndicatorViewInfo.GetAlwaysVisible: Boolean;
|
|
begin
|
|
Result := GridView.OptionsCustomize.ColumnsQuickCustomization;
|
|
end;
|
|
|
|
function TcxGridIndicatorViewInfo.GetBackgroundBitmap: TBitmap;
|
|
begin
|
|
Result := GridViewInfo.BackgroundBitmap;
|
|
end;
|
|
|
|
function TcxGridIndicatorViewInfo.GetHitTestClass: TcxCustomGridHitTestClass;
|
|
begin
|
|
Result := TcxGridIndicatorHitTest;
|
|
end;
|
|
|
|
function TcxGridIndicatorViewInfo.GetPainterClass: TcxCustomGridCellPainterClass;
|
|
begin
|
|
Result := TcxGridIndicatorPainter;
|
|
end;
|
|
|
|
procedure TcxGridIndicatorViewInfo.GetViewParams(var AParams: TcxViewParams);
|
|
begin
|
|
AParams.Color := GridViewInfo.BackgroundColor;
|
|
end;
|
|
|
|
function TcxGridIndicatorViewInfo.GetVisible: Boolean;
|
|
begin
|
|
Result := GridView.OptionsView.Indicator or AlwaysVisible;
|
|
end;
|
|
|
|
function TcxGridIndicatorViewInfo.GetWidth: Integer;
|
|
begin
|
|
Result := CalculateWidth;
|
|
end;
|
|
|
|
function TcxGridIndicatorViewInfo.AddItem(AItemClass: TcxCustomGridIndicatorItemViewInfoClass): TcxCustomGridIndicatorItemViewInfo;
|
|
begin
|
|
Result := AItemClass.Create(Self);
|
|
FItems.Add(Result);
|
|
end;
|
|
|
|
function TcxGridIndicatorViewInfo.AddItem(ATopBound, AHeight: Integer;
|
|
AItemClass: TcxCustomGridIndicatorItemViewInfoClass): TcxCustomGridIndicatorItemViewInfo;
|
|
begin
|
|
Result := AddItem(AItemClass);
|
|
Result.Calculate(Bounds.Left, ATopBound, Width, AHeight);
|
|
end;
|
|
|
|
function TcxGridIndicatorViewInfo.AddRowItem(ARowViewInfo: TcxCustomGridRowViewInfo): TcxCustomGridIndicatorItemViewInfo;
|
|
begin
|
|
Result := AddItem(TcxGridIndicatorRowItemViewInfo);
|
|
TcxGridIndicatorRowItemViewInfo(Result).RowViewInfo := ARowViewInfo;
|
|
end;
|
|
|
|
procedure TcxGridIndicatorViewInfo.Calculate(ALeftBound, ATopBound: Integer;
|
|
AWidth: Integer = -1; AHeight: Integer = -1);
|
|
begin
|
|
inherited;
|
|
if GridViewInfo.HeaderViewInfo.Visible then
|
|
GridViewInfo.HeaderViewInfo.AddIndicatorItems(Self, Bounds.Top);
|
|
if GridViewInfo.FooterViewInfo.Visible then
|
|
AddItem(Bounds.Bottom - GridViewInfo.FooterViewInfo.Height,
|
|
GridViewInfo.FooterViewInfo.Height, TcxGridIndicatorFooterItemViewInfo);
|
|
end;
|
|
|
|
procedure TcxGridIndicatorViewInfo.CalculateRowItem(ARowViewInfo: TcxCustomGridRowViewInfo;
|
|
AItem: TcxCustomGridIndicatorItemViewInfo);
|
|
begin
|
|
AItem.Calculate(Bounds.Left, ARowViewInfo.Bounds.Top, Width, ARowViewInfo.Height);
|
|
end;
|
|
|
|
function TcxGridIndicatorViewInfo.GetHitTest(const P: TPoint): TcxCustomGridHitTest;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to Count - 1 do
|
|
begin
|
|
Result := Items[I].GetHitTest(P);
|
|
if Result <> nil then Exit;
|
|
end;
|
|
Result := inherited GetHitTest(P);
|
|
end;
|
|
|
|
function TcxGridIndicatorViewInfo.GetRowItemBounds(AGridRecord: TcxCustomGridRow): TRect;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to Count - 1 do
|
|
if (Items[I] is TcxGridIndicatorRowItemViewInfo) and
|
|
(TcxGridIndicatorRowItemViewInfo(Items[I]).GridRecord = AGridRecord) then
|
|
begin
|
|
Result := Items[I].Bounds;
|
|
Exit;
|
|
end;
|
|
Result := Rect(0, 0, 0, 0);
|
|
end;
|
|
|
|
{ TcxGridRowFooterCellViewInfo }
|
|
|
|
function TcxGridRowFooterCellViewInfo.GetContainer: TcxGridRowFooterViewInfo;
|
|
begin
|
|
Result := TcxGridRowFooterViewInfo(inherited Container);
|
|
end;
|
|
|
|
function TcxGridRowFooterCellViewInfo.GetGridRecord: TcxCustomGridRow;
|
|
begin
|
|
Result := Container.GridRecord;
|
|
end;
|
|
|
|
function TcxGridRowFooterCellViewInfo.GetText: string;
|
|
begin
|
|
try
|
|
Result := Summary.GroupFooterSummaryTexts[GridRecord.Index, Container.GroupLevel,
|
|
SummaryItem.Index];
|
|
except
|
|
Application.HandleException(Self);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridRowFooterCellViewInfo.GetViewParams(var AParams: TcxViewParams);
|
|
begin
|
|
GridView.Styles.GetFooterCellParams(GridRecord, Column, Container.GroupLevel,
|
|
SummaryItem, AParams);
|
|
end;
|
|
|
|
{ TcxGridRowFooterViewInfo }
|
|
|
|
constructor TcxGridRowFooterViewInfo.Create(AContainer: TcxGridRowFootersViewInfo;
|
|
ALevel: Integer);
|
|
begin
|
|
FContainer := AContainer;
|
|
FLevel := ALevel;
|
|
inherited Create(AContainer.GridViewInfo);
|
|
end;
|
|
|
|
function TcxGridRowFooterViewInfo.GetIndent: Integer;
|
|
begin
|
|
Result := VisualLevel * GridViewInfo.LevelIndent;
|
|
end;
|
|
|
|
function TcxGridRowFooterViewInfo.GetGridRecord: TcxCustomGridRow;
|
|
begin
|
|
Result := RowViewInfo.GridRecord;
|
|
end;
|
|
|
|
function TcxGridRowFooterViewInfo.GetGroupLevel: Integer;
|
|
begin
|
|
Result := RowViewInfo.Level - FLevel;
|
|
if GridView.OptionsView.GroupFooters = gfVisibleWhenExpanded then
|
|
Dec(Result);
|
|
end;
|
|
|
|
function TcxGridRowFooterViewInfo.GetRowViewInfo: TcxCustomGridRowViewInfo;
|
|
begin
|
|
Result := FContainer.RowViewInfo;
|
|
end;
|
|
|
|
function TcxGridRowFooterViewInfo.CalculateHeight: Integer;
|
|
begin
|
|
Result := inherited CalculateHeight;
|
|
Height := Result;
|
|
end;
|
|
|
|
function TcxGridRowFooterViewInfo.CalculateWidth: Integer;
|
|
begin
|
|
Result := inherited CalculateWidth - Indent;
|
|
end;
|
|
|
|
function TcxGridRowFooterViewInfo.GetColumnWidth(AColumn: TcxGridColumn): Integer;
|
|
begin
|
|
Result := inherited GetColumnWidth(AColumn);
|
|
if AColumn.IsMostLeft then Dec(Result, Indent);
|
|
end;
|
|
|
|
function TcxGridRowFooterViewInfo.GetHitTestClass: TcxCustomGridHitTestClass;
|
|
begin
|
|
Result := TcxGridGroupFooterHitTest;
|
|
end;
|
|
|
|
function TcxGridRowFooterViewInfo.GetIsPart: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
function TcxGridRowFooterViewInfo.GetItemAreaBounds(AItem: TcxGridColumnHeaderViewInfo): TRect;
|
|
begin
|
|
Result := Container.GridViewInfo.FooterViewInfo.GetItemAreaBounds(AItem);
|
|
end;
|
|
|
|
function TcxGridRowFooterViewInfo.GetItemClass: TcxGridColumnHeaderViewInfoClass;
|
|
begin
|
|
Result := TcxGridRowFooterCellViewInfo;
|
|
end;
|
|
|
|
function TcxGridRowFooterViewInfo.GetItemHitTestClass: TcxCustomGridHitTestClass;
|
|
begin
|
|
Result := TcxGridGroupFooterCellHitTest;
|
|
end;
|
|
|
|
function TcxGridRowFooterViewInfo.GetItemMultiLinePainting(AItem: TcxGridColumnHeaderViewInfo): Boolean;
|
|
begin
|
|
Result := GridViewInfo.FooterViewInfo.GetItemMultiLinePainting(AItem);
|
|
end;
|
|
|
|
function TcxGridRowFooterViewInfo.GetSummaryItems: TcxDataSummaryItems;
|
|
begin
|
|
Result := GridView.FDataController.Summary.GroupSummaryItems[GroupLevel];
|
|
end;
|
|
|
|
procedure TcxGridRowFooterViewInfo.GetViewParams(var AParams: TcxViewParams);
|
|
begin
|
|
GridView.Styles.GetFooterParams(GridRecord, nil, GroupLevel, nil, AParams);
|
|
end;
|
|
|
|
function TcxGridRowFooterViewInfo.GetVisible: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
function TcxGridRowFooterViewInfo.GetVisualLevel: Integer;
|
|
begin
|
|
Result := Container.GridViewInfo.GetVisualLevel(RowViewInfo.Level - FLevel);
|
|
end;
|
|
|
|
function TcxGridRowFooterViewInfo.HasSeparator: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
procedure TcxGridRowFooterViewInfo.PrepareSummaryItems(ASummaryItems: TList);
|
|
begin
|
|
GridViewInfo.FooterViewInfo.PrepareSummaryItems(ASummaryItems);
|
|
end;
|
|
|
|
function TcxGridRowFooterViewInfo.CanShowMultipleSummaries: Boolean;
|
|
begin
|
|
Result := GridView.OptionsView.CanShowGroupFooterMultiSummaries;
|
|
end;
|
|
|
|
{ TcxGridRowFootersViewInfo }
|
|
|
|
constructor TcxGridRowFootersViewInfo.Create(ARowViewInfo: TcxCustomGridRowViewInfo);
|
|
begin
|
|
inherited Create;
|
|
FRowViewInfo := ARowViewInfo;
|
|
FHeight := -1;
|
|
CreateItems;
|
|
end;
|
|
|
|
destructor TcxGridRowFootersViewInfo.Destroy;
|
|
begin
|
|
DestroyItems;
|
|
inherited;
|
|
end;
|
|
|
|
function TcxGridRowFootersViewInfo.GetCount: Integer;
|
|
begin
|
|
Result := FItems.Count;
|
|
end;
|
|
|
|
function TcxGridRowFootersViewInfo.GetGridViewInfo: TcxGridTableViewInfo;
|
|
begin
|
|
Result := FRowViewInfo.GridViewInfo;
|
|
end;
|
|
|
|
function TcxGridRowFootersViewInfo.GetHeight: Integer;
|
|
begin
|
|
if FHeight = -1 then
|
|
FHeight := CalculateHeight;
|
|
Result := FHeight;
|
|
end;
|
|
|
|
function TcxGridRowFootersViewInfo.GetItem(Index: Integer): TcxGridRowFooterViewInfo;
|
|
begin
|
|
Result := TcxGridRowFooterViewInfo(FItems[Index]);
|
|
end;
|
|
|
|
function TcxGridRowFootersViewInfo.GetVisibleItem(ALevel: Integer): TcxGridRowFooterViewInfo;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to Count - 1 do
|
|
begin
|
|
Result := Items[I];
|
|
if Result.Level = ALevel then Exit;
|
|
end;
|
|
Result := nil;
|
|
end;
|
|
|
|
procedure TcxGridRowFootersViewInfo.CreateItems;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
FItems := TList.Create;
|
|
for I := 0 to FRowViewInfo.Level do
|
|
if FRowViewInfo.HasFooter(I) then
|
|
FItems.Add(GetItemClass.Create(Self, I));
|
|
end;
|
|
|
|
procedure TcxGridRowFootersViewInfo.DestroyItems;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to Count - 1 do Items[I].Free;
|
|
FItems.Free;
|
|
end;
|
|
|
|
procedure TcxGridRowFootersViewInfo.BeforeRecalculation;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to Count - 1 do
|
|
Items[I].BeforeRecalculation;
|
|
end;
|
|
|
|
procedure TcxGridRowFootersViewInfo.Calculate(ALeftBound, ATopBound: Integer);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to Count - 1 do
|
|
begin
|
|
Items[I].Calculate(ALeftBound + Items[I].Indent, ATopBound);
|
|
Inc(ATopBound, Items[I].Height);
|
|
end;
|
|
end;
|
|
|
|
function TcxGridRowFootersViewInfo.CalculateHeight: Integer;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
Result := 0;
|
|
for I := 0 to Count - 1 do
|
|
Inc(Result, Items[I].CalculateHeight);
|
|
end;
|
|
|
|
function TcxGridRowFootersViewInfo.GetItemClass: TcxGridRowFooterViewInfoClass;
|
|
begin
|
|
Result := TcxGridRowFooterViewInfo;
|
|
end;
|
|
|
|
function TcxGridRowFootersViewInfo.GetCellBestFitWidth(AColumn: TcxGridColumn): Integer;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
Result := 0;
|
|
for I := 0 to Count - 1 do
|
|
Result := Max(Result, Items[I].GetCellBestFitWidth(AColumn));
|
|
end;
|
|
|
|
function TcxGridRowFootersViewInfo.GetHitTest(const P: TPoint): TcxCustomGridHitTest;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
Result := nil;
|
|
for I := 0 to Count - 1 do
|
|
begin
|
|
Result := Items[I].GetHitTest(P);
|
|
if Result <> nil then Break;
|
|
end;
|
|
end;
|
|
|
|
function TcxGridRowFootersViewInfo.GetTopBound(ALevel: Integer; var ATopBound: Integer): Boolean;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to Count - 1 do
|
|
begin
|
|
Result := Items[I].Level >= ALevel;
|
|
if Result then
|
|
begin
|
|
ATopBound := Items[I].Bounds.Top;
|
|
Exit;
|
|
end;
|
|
end;
|
|
Result := False;
|
|
end;
|
|
|
|
procedure TcxGridRowFootersViewInfo.Offset(DX, DY: Integer);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to Count - 1 do
|
|
Items[I].DoOffset(DX, DY);
|
|
end;
|
|
|
|
procedure TcxGridRowFootersViewInfo.Paint;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to Count - 1 do Items[I].Paint;
|
|
end;
|
|
|
|
{ TcxCustomGridRowViewInfo }
|
|
|
|
constructor TcxCustomGridRowViewInfo.Create(ARecordsViewInfo: TcxCustomGridRecordsViewInfo;
|
|
ARecord: TcxCustomGridRecord);
|
|
begin
|
|
inherited;
|
|
FIndicatorItem := GridViewInfo.IndicatorViewInfo.AddRowItem(Self);
|
|
CreateFootersViewInfo;
|
|
end;
|
|
|
|
destructor TcxCustomGridRowViewInfo.Destroy;
|
|
begin
|
|
DestroyFootersViewInfo;
|
|
FIndicatorItem.Free;
|
|
inherited;
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.GetCacheItem: TcxGridTableViewInfoCacheItem;
|
|
begin
|
|
Result := TcxGridTableViewInfoCacheItem(inherited CacheItem);
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.GetGridView: TcxGridTableView;
|
|
begin
|
|
Result := TcxGridTableView(inherited GridView);
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.GetGridLines: TcxGridLines;
|
|
begin
|
|
Result := RecordsViewInfo.GridLines;
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.GetGridRecord: TcxCustomGridRow;
|
|
begin
|
|
Result := TcxCustomGridRow(inherited GridRecord);
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.GetGridViewInfo: TcxGridTableViewInfo;
|
|
begin
|
|
Result := TcxGridTableViewInfo(inherited GridViewInfo);
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.GetLevel: Integer;
|
|
begin
|
|
Result := GridRecord.Level;
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.GetLevelIndent: Integer;
|
|
begin
|
|
Result := VisualLevel * GridViewInfo.LevelIndent;
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.GetLevelIndentBounds(Index: Integer): TRect;
|
|
begin
|
|
Result := Bounds;
|
|
if Index = -1 then
|
|
Result.Right := ContentIndent
|
|
else
|
|
begin
|
|
Inc(Result.Left, GridViewInfo.LevelIndent * Index);
|
|
Result.Right := Result.Left + GridViewInfo.LevelIndent;
|
|
FootersViewInfo.GetTopBound(Level - Index, Result.Bottom);
|
|
end;
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.GetLevelIndentHorzLineBounds(Index: Integer): TRect;
|
|
begin
|
|
Result := CalculateLevelIndentHorzLineBounds(Index, LevelIndentBounds[Index]);
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.GetLevelIndentSpaceBounds(Index: Integer): TRect;
|
|
begin
|
|
Result := CalculateLevelIndentSpaceBounds(Index, LevelIndentBounds[Index]);
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.GetLevelIndentVertLineBounds(Index: Integer): TRect;
|
|
begin
|
|
Result := CalculateLevelIndentVertLineBounds(Index, LevelIndentBounds[Index]);
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.GetRecordsViewInfo: TcxGridRowsViewInfo;
|
|
begin
|
|
Result := TcxGridRowsViewInfo(inherited RecordsViewInfo);
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.GetVisualLevel: Integer;
|
|
begin
|
|
Result := GridViewInfo.GetVisualLevel(Level);
|
|
end;
|
|
|
|
procedure TcxCustomGridRowViewInfo.CreateFootersViewInfo;
|
|
begin
|
|
if HasFooters then
|
|
FFootersViewInfo := GetFootersViewInfoClass.Create(Self);
|
|
end;
|
|
|
|
procedure TcxCustomGridRowViewInfo.DestroyFootersViewInfo;
|
|
begin
|
|
FFootersViewInfo.Free;
|
|
end;
|
|
|
|
procedure TcxCustomGridRowViewInfo.RecreateFootersViewInfo;
|
|
begin
|
|
DestroyFootersViewInfo;
|
|
CreateFootersViewInfo;
|
|
end;
|
|
|
|
procedure TcxCustomGridRowViewInfo.AfterRowsViewInfoCalculate;
|
|
begin
|
|
end;
|
|
|
|
procedure TcxCustomGridRowViewInfo.AfterRowsViewInfoOffset;
|
|
begin
|
|
end;
|
|
|
|
procedure TcxCustomGridRowViewInfo.CalculateExpandButtonBounds(var ABounds: TRect);
|
|
begin
|
|
if IsRectEmpty(Bounds) then
|
|
ABounds := Rect(0, 0, 0, 0)
|
|
else
|
|
with ABounds do
|
|
begin
|
|
Inc(Left, GridViewInfo.ExpandButtonIndent);
|
|
Right := Left + GridViewInfo.ExpandButtonSize;
|
|
Top := (Top + Bottom - GridViewInfo.ExpandButtonSize) div 2;
|
|
Bottom := Top + GridViewInfo.ExpandButtonSize;
|
|
end;
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.CalculateHeight: Integer;
|
|
begin
|
|
Result := BottomPartHeight;
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.CalculateLevelIndentHorzLineBounds(ALevel: Integer;
|
|
const ABounds: TRect): TRect;
|
|
begin
|
|
Result := ABounds;
|
|
with Result do
|
|
begin
|
|
Top := CalculateLevelIndentSpaceBounds(ALevel, ABounds).Bottom;
|
|
Bottom := Top + GridViewInfo.GridLineWidth;
|
|
if Bottom > ABounds.Bottom then Bottom := ABounds.Bottom;
|
|
end;
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.CalculateLevelIndentSpaceBounds(ALevel: Integer;
|
|
const ABounds: TRect): TRect;
|
|
var
|
|
AIsParentRecordLast: Boolean;
|
|
begin
|
|
AIsParentRecordLast := GridRecord.IsParentRecordLast[Level - ALevel - 1];
|
|
Result := ABounds;
|
|
if GridLines in [glBoth, glHorizontal] then
|
|
Dec(Result.Right, GridViewInfo.GridLineWidth);
|
|
if (GridLines <> glNone) and ((GridLines <> glVertical) and AIsParentRecordLast) then
|
|
Dec(Result.Bottom, GridViewInfo.GridLineWidth);
|
|
if AIsParentRecordLast and not HasAnyFooter(Level - ALevel) then
|
|
Dec(Result.Bottom, SeparatorWidth);
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.CalculateLevelIndentVertLineBounds(ALevel: Integer;
|
|
const ABounds: TRect): TRect;
|
|
begin
|
|
Result := ABounds;
|
|
with CalculateLevelIndentSpaceBounds(ALevel, ABounds) do
|
|
begin
|
|
Result.Left := Right;
|
|
Result.Bottom := Bottom;
|
|
end;
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.CalculateWidth: Integer;
|
|
begin
|
|
Result := 0{Width};
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.CanSize: Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
procedure TcxCustomGridRowViewInfo.CheckRowHeight(var AValue: Integer);
|
|
begin
|
|
if AValue < 1 then AValue := 1;
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.GetAutoHeight: Boolean;
|
|
begin
|
|
Result := RecordsViewInfo.AutoRecordHeight;
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.GetBaseHeight: Integer;
|
|
begin
|
|
Result := DataHeight;
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.GetBottomPartHeight: Integer;
|
|
begin
|
|
Result := SeparatorWidth;
|
|
if HasFooters then
|
|
Inc(Result, FFootersViewInfo.Height);
|
|
if HasLastHorzGridLine then
|
|
Inc(Result, GridViewInfo.GridLineWidth);
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.GetCellTransparent(ACell: TcxGridTableCellViewInfo): Boolean;
|
|
begin
|
|
Result := inherited GetCellTransparent(ACell) and not ACell.Selected;
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.GetContentBounds: TRect;
|
|
begin
|
|
Result := inherited GetContentBounds;
|
|
Result.Left := ContentIndent;
|
|
Result.Bottom := Result.Top + DataHeight;
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.GetContentIndent: Integer;
|
|
begin
|
|
Result := Bounds.Left + LevelIndent;
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.GetContentWidth: Integer;
|
|
begin
|
|
Result := Width - LevelIndent;
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.GetDataHeight: Integer;
|
|
begin
|
|
Result := Height - BottomPartHeight;
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.GetDataIndent: Integer;
|
|
begin
|
|
Result := ContentIndent;
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.GetDataWidth: Integer;
|
|
begin
|
|
Result := ContentWidth;
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.GetFocusRectBounds: TRect;
|
|
begin
|
|
Result := inherited GetFocusRectBounds;
|
|
Result.Left := DataIndent;
|
|
if GridLines <> glNone then
|
|
Dec(Result.Right, GridViewInfo.GridLineWidth);
|
|
Result.Bottom := Result.Top + DataHeight;
|
|
if GridLines in [glBoth, glHorizontal] then
|
|
Dec(Result.Bottom, GridViewInfo.GridLineWidth);
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.GetFootersViewInfoClass: TcxGridRowFootersViewInfoClass;
|
|
begin
|
|
Result := TcxGridRowFootersViewInfo;
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.GetFullyVisible: Boolean;
|
|
begin
|
|
Result := Height = MaxHeight;
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.GetLastHorzGridLineBounds: TRect;
|
|
begin
|
|
Result := Bounds;
|
|
Result.Top := Result.Bottom - GridViewInfo.GridLineWidth;
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.GetMaxHeight: Integer;
|
|
begin
|
|
Result := Height;
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.GetNonBaseHeight: Integer;
|
|
begin
|
|
Result := Height - BaseHeight;
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.GetRowHeight: Integer;
|
|
begin
|
|
Result := Height;
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.GetSeparatorBounds: TRect;
|
|
var
|
|
ASeparatorVisualLevel: Integer;
|
|
begin
|
|
with Result do
|
|
begin
|
|
Left := ContentIndent;
|
|
Right := Left + ContentWidth;
|
|
ASeparatorVisualLevel :=
|
|
GridViewInfo.GetVisualLevel(Level - GridRecord.LastParentRecordCount);
|
|
Dec(Left, (VisualLevel - ASeparatorVisualLevel) * GridViewInfo.LevelIndent);
|
|
Bottom := Bounds.Bottom;
|
|
Top := Bottom - SeparatorWidth;
|
|
end;
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.GetSeparatorColor: TColor;
|
|
begin
|
|
Result := GridView.OptionsView.GetRowSeparatorColor;
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.GetSeparatorWidth: Integer;
|
|
begin
|
|
if ShowSeparator then
|
|
Result := RecordsViewInfo.SeparatorWidth
|
|
else
|
|
Result := 0;
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.GetShowSeparator: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.GetVisible: Boolean;
|
|
begin
|
|
Result := Index < RecordsViewInfo.PartVisibleCount;
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.GetWidth: Integer;
|
|
begin
|
|
Result := RecordsViewInfo.RowWidth;
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.HasAnyFooter(ALevel: Integer): Boolean;
|
|
var
|
|
AFooterTopBound: Integer;
|
|
begin
|
|
Result := FootersViewInfo.GetTopBound(ALevel, AFooterTopBound);
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.HasFooter(ALevel: Integer): Boolean;
|
|
begin
|
|
if GridView.OptionsView.GroupFooters = gfInvisible then
|
|
Result := False
|
|
else
|
|
begin
|
|
if GridView.OptionsView.GroupFooters = gfAlwaysVisible then
|
|
Dec(ALevel);
|
|
Result := (0 <= ALevel) and (ALevel < Level) and
|
|
GridRecord.IsParentRecordLast[ALevel] and
|
|
GridView.GroupedColumns[Level - 1 - ALevel].CanShowGroupFooters;
|
|
end;
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.HasFooters: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.HasLastHorzGridLine: Boolean;
|
|
begin
|
|
Result := RecordsViewInfo.HasLastHorzGridLine(Self) and GridRecord.IsLast;
|
|
end;
|
|
|
|
procedure TcxCustomGridRowViewInfo.Offset(DX, DY: Integer);
|
|
begin
|
|
inherited;
|
|
FIndicatorItem.DoOffset(0, DY);
|
|
if HasFooters then
|
|
FFootersViewInfo.Offset(DX, DY);
|
|
end;
|
|
|
|
procedure TcxCustomGridRowViewInfo.BeforeRecalculation;
|
|
begin
|
|
inherited;
|
|
if HasFooters then
|
|
FFootersViewInfo.BeforeRecalculation;
|
|
end;
|
|
|
|
procedure TcxCustomGridRowViewInfo.Calculate(ALeftBound, ATopBound: Integer;
|
|
AWidth: Integer = -1; AHeight: Integer = -1);
|
|
begin
|
|
RecreateFootersViewInfo;
|
|
inherited;
|
|
GridViewInfo.IndicatorViewInfo.CalculateRowItem(Self, FIndicatorItem);
|
|
if HasFooters then
|
|
FFootersViewInfo.Calculate(Bounds.Left, ATopBound + Height - BottomPartHeight);
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.Click(AHitTest: TcxCustomGridHitTest; AButton: TMouseButton;
|
|
AShift: TShiftState): Boolean;
|
|
var
|
|
AGridRecord: TcxCustomGridRow;
|
|
begin
|
|
AGridRecord := GridRecord;
|
|
Result := inherited Click(AHitTest, AButton, AShift);
|
|
if Result and (ssDouble in AShift) and AGridRecord.ExpandOnDblClick then
|
|
AGridRecord.ToggleExpanded;
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.GetBoundsForInvalidate(AItem: TcxCustomGridTableItem): TRect;
|
|
var
|
|
R: TRect;
|
|
begin
|
|
Result := inherited GetBoundsForInvalidate(AItem);
|
|
if AItem = nil then
|
|
with GridViewInfo.IndicatorViewInfo do
|
|
if Visible then
|
|
begin
|
|
R := GetRowItemBounds(GridRecord);
|
|
if R.Left < Result.Left then Result.Left := R.Left;
|
|
end;
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.GetHitTest(const P: TPoint): TcxCustomGridHitTest;
|
|
begin
|
|
if HasFooters then
|
|
Result := FFootersViewInfo.GetHitTest(P)
|
|
else
|
|
Result := nil;
|
|
if Result = nil then
|
|
begin
|
|
Result := inherited GetHitTest(P);
|
|
if (Result <> nil) and PtInRect(LevelIndentBounds[-1], P) then
|
|
begin
|
|
Result := TcxGridRowLevelIndentHitTest.Instance(P);
|
|
InitHitTest(Result);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function TcxCustomGridRowViewInfo.HasSeparator: Boolean;
|
|
begin
|
|
Result := SeparatorWidth <> 0;
|
|
end;
|
|
|
|
{ TcxGridRowsViewInfo }
|
|
|
|
destructor TcxGridRowsViewInfo.Destroy;
|
|
begin
|
|
FFilterRowViewInfo.Free;
|
|
FNewItemRowViewInfo.Free;
|
|
inherited;
|
|
end;
|
|
|
|
function TcxGridRowsViewInfo.GetFilterRowViewInfo: TcxCustomGridRowViewInfo;
|
|
begin
|
|
Result := FFilterRowViewInfo;
|
|
if (Result <> nil) and (Result.GridRecord = nil) then
|
|
Result := nil;
|
|
end;
|
|
|
|
function TcxGridRowsViewInfo.GetGridView: TcxGridTableView;
|
|
begin
|
|
Result := TcxGridTableView(inherited GridView);
|
|
end;
|
|
|
|
function TcxGridRowsViewInfo.GetGridLines: TcxGridLines;
|
|
begin
|
|
Result := GridViewInfo.GridLines;
|
|
end;
|
|
|
|
function TcxGridRowsViewInfo.GetGridViewInfo: TcxGridTableViewInfo;
|
|
begin
|
|
Result := TcxGridTableViewInfo(inherited GridViewInfo);
|
|
end;
|
|
|
|
function TcxGridRowsViewInfo.GetHeaderViewInfo: TcxGridHeaderViewInfo;
|
|
begin
|
|
Result := GridViewInfo.HeaderViewInfo;
|
|
end;
|
|
|
|
function TcxGridRowsViewInfo.GetItem(Index: Integer): TcxCustomGridRowViewInfo;
|
|
begin
|
|
Result := TcxCustomGridRowViewInfo(inherited Items[Index]);
|
|
end;
|
|
|
|
function TcxGridRowsViewInfo.GetNewItemRowViewInfo: TcxCustomGridRowViewInfo;
|
|
begin
|
|
Result := FNewItemRowViewInfo;
|
|
if (Result <> nil) and (Result.GridRecord = nil) then
|
|
Result := nil;
|
|
end;
|
|
|
|
function TcxGridRowsViewInfo.GetPainterClassValue: TcxGridRowsPainterClass;
|
|
begin
|
|
Result := TcxGridRowsPainterClass(GetPainterClass);
|
|
end;
|
|
|
|
function TcxGridRowsViewInfo.GetViewData: TcxGridViewData;
|
|
begin
|
|
Result := TcxGridViewData(inherited ViewData);
|
|
end;
|
|
|
|
procedure TcxGridRowsViewInfo.AfterCalculate;
|
|
begin
|
|
NotifyItemsCalculationFinished;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TcxGridRowsViewInfo.AfterOffset;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to Count - 1 do
|
|
Items[I].AfterRowsViewInfoOffset;
|
|
NotifyItemsCalculationFinished;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TcxGridRowsViewInfo.Calculate;
|
|
|
|
procedure CalculateItems;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to FPartVisibleCount - 1 do
|
|
Items[I].MainCalculate(GetItemLeftBound(I), GetItemTopBound(I));
|
|
end;
|
|
|
|
var
|
|
ATopBound: Integer;
|
|
begin
|
|
CalculateConsts;
|
|
inherited;
|
|
if GridViewInfo.CalculateDown then
|
|
begin
|
|
ATopBound := Bounds.Top;
|
|
if HasFilterRow then
|
|
begin
|
|
FilterRowViewInfo.MainCalculate(ContentBounds.Left, ATopBound);
|
|
Inc(ATopBound, FilterRowViewInfo.Height);
|
|
end;
|
|
if HasNewItemRow then
|
|
NewItemRowViewInfo.MainCalculate(ContentBounds.Left, ATopBound);
|
|
end;
|
|
CalculateVisibleCount;
|
|
if GridViewInfo.CalculateDown and (FirstRecordIndex <> -1) then
|
|
CalculateItems;
|
|
end;
|
|
|
|
function TcxGridRowsViewInfo.CalculateBounds: TRect;
|
|
begin
|
|
Result := inherited CalculateBounds;
|
|
if IsScrollable then
|
|
Dec(Result.Left, GridViewInfo.LeftPos);
|
|
Result.Right := Result.Left + RowWidth;
|
|
end;
|
|
|
|
procedure TcxGridRowsViewInfo.CalculateConsts;
|
|
begin
|
|
FRowHeight := CalculateRowHeight;
|
|
FDataRowHeight := CalculateDataRowHeight;
|
|
FGroupRowHeight := CalculateGroupRowHeight;
|
|
end;
|
|
|
|
function TcxGridRowsViewInfo.CalculateContentBounds: TRect;
|
|
begin
|
|
Result := inherited CalculateContentBounds;
|
|
if HasFilterRow then
|
|
Inc(Result.Top, FilterRowViewInfo.Height);
|
|
if HasNewItemRow then
|
|
Inc(Result.Top, NewItemRowViewInfo.Height);
|
|
end;
|
|
|
|
function TcxGridRowsViewInfo.CalculateDataRowHeight: Integer;
|
|
begin
|
|
Result := FRowHeight;
|
|
end;
|
|
|
|
function TcxGridRowsViewInfo.CalculateGroupRowDefaultHeight(AMinHeight: Boolean): Integer;
|
|
var
|
|
AParams: TcxViewParams;
|
|
begin
|
|
GridView.Styles.GetGroupParams(nil, 0, AParams);
|
|
Result := CalculateCustomGroupRowHeight(AMinHeight, AParams);
|
|
end;
|
|
|
|
function TcxGridRowsViewInfo.CalculateGroupRowHeight: Integer;
|
|
begin
|
|
Result := GridView.OptionsView.GroupRowHeight;
|
|
if Result = 0 then
|
|
Result := CalculateGroupRowDefaultHeight(False);
|
|
end;
|
|
|
|
function TcxGridRowsViewInfo.CalculateRestHeight(ATopBound: Integer): Integer;
|
|
begin
|
|
Result := ContentBounds.Bottom - ATopBound;
|
|
{if not GridViewInfo.IsCalculating or GridViewInfo.CalculateDown then
|
|
Result := ContentBounds.Bottom - ATopBound
|
|
else
|
|
Result := MaxInt - 100000;}
|
|
end;
|
|
|
|
function TcxGridRowsViewInfo.CalculateRowDefaultHeight: Integer;
|
|
var
|
|
I, AFontHeight: Integer;
|
|
AParams: TcxViewParams;
|
|
begin
|
|
if GridView.VisibleColumnCount = 0 then
|
|
begin
|
|
GridView.Styles.GetContentParams(nil, nil, AParams);
|
|
Result := GridViewInfo.GetFontHeight(AParams.Font);
|
|
GetCellTextAreaSize(Result);
|
|
end
|
|
else
|
|
begin
|
|
Result := 0;
|
|
for I := 0 to HeaderViewInfo.Count - 1 do
|
|
begin
|
|
GridView.Styles.GetDataCellParams(nil, HeaderViewInfo[I].Column, AParams);
|
|
AFontHeight := HeaderViewInfo[I].Column.CalculateDefaultCellHeight(Canvas, AParams.Font);
|
|
if AFontHeight > Result then Result := AFontHeight;
|
|
end;
|
|
end;
|
|
Result := GetCellHeight(Result);
|
|
end;
|
|
|
|
function TcxGridRowsViewInfo.CalculateRowHeight: Integer;
|
|
begin
|
|
if IsDataRowHeightAssigned then
|
|
Result := GridView.OptionsView.DataRowHeight
|
|
else
|
|
Result := CalculateRowDefaultHeight;
|
|
end;
|
|
|
|
procedure TcxGridRowsViewInfo.CalculateVisibleCount;
|
|
var
|
|
ALastBottom, I, AHeight: Integer;
|
|
begin
|
|
inherited;
|
|
FPartVisibleCount := 0;
|
|
FIsFirstRowFullyVisible := True;
|
|
if FirstRecordIndex = -1 then Exit;
|
|
|
|
ALastBottom := ContentBounds.Top;
|
|
for I := 0 to MaxCount - 1 do
|
|
begin
|
|
Inc(FPartVisibleCount);
|
|
FRestHeight := CalculateRestHeight(ALastBottom);
|
|
AHeight := Items[I].MaxHeight;
|
|
Inc(ALastBottom, AHeight);
|
|
if ALastBottom > ContentBounds.Bottom then Break;
|
|
Inc(FVisibleCount);
|
|
if ALastBottom = ContentBounds.Bottom then Break;
|
|
end;
|
|
|
|
if MaxCount > 0 then
|
|
begin
|
|
if (FVisibleCount = FPartVisibleCount) and
|
|
(GridViewInfo.CalculateDown and not Items[FVisibleCount - 1].FullyVisible or
|
|
not GridViewInfo.CalculateDown and not Items[0].FullyVisible) then
|
|
Dec(FVisibleCount);
|
|
if FVisibleCount = 0 then
|
|
begin
|
|
FVisibleCount := 1;
|
|
FIsFirstRowFullyVisible := False;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function TcxGridRowsViewInfo.GetAutoDataCellHeight: Boolean;
|
|
begin
|
|
Result := inherited GetAutoDataCellHeight and
|
|
GridViewInfo.SupportsAutoHeight and
|
|
(not IsDataRowHeightAssigned or GridView.IsGetCellHeightAssigned);
|
|
end;
|
|
|
|
function TcxGridRowsViewInfo.GetCommonDataRowHeight: Integer;
|
|
begin
|
|
Result := FDataRowHeight + SeparatorWidth;
|
|
end;
|
|
|
|
function TcxGridRowsViewInfo.GetFilterRowViewInfoClass: TcxCustomGridRowViewInfoClass;
|
|
begin
|
|
Result := TcxGridFilterRowViewInfo;
|
|
end;
|
|
|
|
function TcxGridRowsViewInfo.GetGroupBackgroundBitmap: TBitmap;
|
|
begin
|
|
Result := GridView.BackgroundBitmaps.GetBitmap(bbGroup);
|
|
end;
|
|
|
|
function TcxGridRowsViewInfo.GetGroupRowSeparatorWidth: Integer;
|
|
begin
|
|
if GridView.OptionsView.GroupRowStyle = grsOffice11 then
|
|
Result := cxGridOffice11GroupRowSeparatorWidth
|
|
else
|
|
Result := 0;
|
|
end;
|
|
|
|
function TcxGridRowsViewInfo.GetItemLeftBound(AIndex: Integer): Integer;
|
|
begin
|
|
Result := ContentBounds.Left;
|
|
end;
|
|
|
|
function TcxGridRowsViewInfo.GetItemsOffset(AItemCountDelta: Integer): Integer;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
Result := 0;
|
|
for I := 0 to Abs(AItemCountDelta) - 1 do
|
|
Inc(Result, Items[I].Height);
|
|
if AItemCountDelta > 0 then
|
|
Result := -Result;
|
|
end;
|
|
|
|
function TcxGridRowsViewInfo.GetItemTopBound(AIndex: Integer): Integer;
|
|
begin
|
|
if AIndex = 0 then
|
|
Result := ContentBounds.Top
|
|
else
|
|
Result := Items[AIndex - 1].Bounds.Bottom;
|
|
end;
|
|
|
|
function TcxGridRowsViewInfo.GetIsScrollable: Boolean;
|
|
begin
|
|
Result := HeaderViewInfo.IsScrollable;
|
|
end;
|
|
|
|
function TcxGridRowsViewInfo.GetNewItemRowViewInfoClass: TcxCustomGridRowViewInfoClass;
|
|
begin
|
|
Result := TcxGridNewItemRowViewInfo;
|
|
end;
|
|
|
|
function TcxGridRowsViewInfo.GetPainterClass: TcxCustomGridRecordsPainterClass;
|
|
begin
|
|
Result := TcxGridRowsPainter;
|
|
end;
|
|
|
|
function TcxGridRowsViewInfo.GetRowWidth: Integer;
|
|
begin
|
|
Result := GridViewInfo.DataWidth;
|
|
end;
|
|
|
|
function TcxGridRowsViewInfo.GetSeparatorWidth: Integer;
|
|
begin
|
|
Result := GridView.OptionsView.RowSeparatorWidth;
|
|
end;
|
|
|
|
function TcxGridRowsViewInfo.HasFilterRow: Boolean;
|
|
begin
|
|
Result := FilterRowViewInfo <> nil;
|
|
end;
|
|
|
|
function TcxGridRowsViewInfo.HasLastHorzGridLine(ARowViewInfo: TcxCustomGridRowViewInfo): Boolean;
|
|
begin
|
|
Result := (GridLines = glVertical) and
|
|
((ARowViewInfo = nil) and (SeparatorWidth = 0) or
|
|
(ARowViewInfo <> nil) and not ARowViewInfo.HasSeparator);
|
|
end;
|
|
|
|
function TcxGridRowsViewInfo.HasNewItemRow: Boolean;
|
|
begin
|
|
Result := NewItemRowViewInfo <> nil;
|
|
end;
|
|
|
|
function TcxGridRowsViewInfo.IsFilterRowVisible: Boolean;
|
|
begin
|
|
Result := GridView.FilterRow.Visible;
|
|
end;
|
|
|
|
function TcxGridRowsViewInfo.IsNewItemRowVisible: Boolean;
|
|
begin
|
|
Result := GridView.NewItemRow.Visible;
|
|
end;
|
|
|
|
procedure TcxGridRowsViewInfo.NotifyItemsCalculationFinished;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to Count - 1 do
|
|
Items[I].AfterRowsViewInfoCalculate;
|
|
end;
|
|
|
|
procedure TcxGridRowsViewInfo.OffsetItem(AIndex, AOffset: Integer);
|
|
begin
|
|
Items[AIndex].DoOffset(0, AOffset);
|
|
end;
|
|
|
|
procedure TcxGridRowsViewInfo.AfterConstruction;
|
|
begin
|
|
inherited;
|
|
if IsFilterRowVisible then
|
|
FFilterRowViewInfo := GetFilterRowViewInfoClass.Create(Self, ViewData.FilterRow);
|
|
if IsNewItemRowVisible then
|
|
FNewItemRowViewInfo := GetNewItemRowViewInfoClass.Create(Self, ViewData.NewItemRow);
|
|
end;
|
|
|
|
function TcxGridRowsViewInfo.CalculateCustomGroupRowHeight(AMinHeight: Boolean;
|
|
AParams: TcxViewParams): Integer;
|
|
begin
|
|
Result := Max(GridViewInfo.GetFontHeight(AParams.Font), GridViewInfo.ExpandButtonSize);
|
|
GetCellTextAreaSize(Result);
|
|
if GridView.OptionsView.GroupRowStyle = grsStandard then
|
|
Result := GetCellHeight(Result)
|
|
else
|
|
begin
|
|
if not AMinHeight then
|
|
Result := 2 * Result;
|
|
Inc(Result, GroupRowSeparatorWidth);
|
|
end;
|
|
end;
|
|
|
|
function TcxGridRowsViewInfo.CanDataRowSize: Boolean;
|
|
begin
|
|
Result := GridViewInfo.SupportsAutoHeight and GridView.OptionsCustomize.DataRowSizing;
|
|
end;
|
|
|
|
function TcxGridRowsViewInfo.GetCellHeight(ACellContentHeight: Integer): Integer;
|
|
begin
|
|
Result := inherited GetCellHeight(ACellContentHeight);
|
|
if GridLines in [glBoth, glHorizontal] then
|
|
Inc(Result, GridViewInfo.GridLineWidth);
|
|
end;
|
|
|
|
function TcxGridRowsViewInfo.GetDataRowCellsAreaViewInfoClass: TClass;
|
|
begin
|
|
Result := TcxGridDataRowCellsAreaViewInfo;
|
|
end;
|
|
|
|
function TcxGridRowsViewInfo.GetFooterCellBestFitWidth(AColumn: TcxGridColumn): Integer;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
Result := 0;
|
|
for I := 0 to Count - 1 do
|
|
if Items[I].HasFooters then
|
|
Result := Max(Result, Items[I].FootersViewInfo.GetCellBestFitWidth(AColumn));
|
|
end;
|
|
|
|
function TcxGridRowsViewInfo.GetHitTest(const P: TPoint): TcxCustomGridHitTest;
|
|
begin
|
|
Result := inherited GetHitTest(P);
|
|
if Result = nil then
|
|
begin
|
|
if HasFilterRow then
|
|
Result := FilterRowViewInfo.GetHitTest(P);
|
|
if (Result = nil) and HasNewItemRow then
|
|
Result := NewItemRowViewInfo.GetHitTest(P);
|
|
end;
|
|
end;
|
|
|
|
function TcxGridRowsViewInfo.GetRealItem(ARecord: TcxCustomGridRecord): TcxCustomGridRecordViewInfo;
|
|
begin
|
|
if ViewData.HasFilterRow and (ARecord = ViewData.FilterRow) then
|
|
Result := FilterRowViewInfo
|
|
else
|
|
if ViewData.HasNewItemRecord and ARecord.IsNewItemRecord then
|
|
Result := NewItemRowViewInfo
|
|
else
|
|
Result := inherited GetRealItem(ARecord);
|
|
end;
|
|
|
|
function TcxGridRowsViewInfo.GetRestHeight(ATopBound: Integer): Integer;
|
|
begin
|
|
if GridViewInfo.IsCalculating then
|
|
Result := FRestHeight
|
|
else
|
|
Result := CalculateRestHeight(ATopBound);
|
|
end;
|
|
|
|
function TcxGridRowsViewInfo.IsCellMultiLine(AItem: TcxCustomGridTableItem): Boolean;
|
|
begin
|
|
Result := inherited IsCellMultiLine(AItem) or IsDataRowHeightAssigned;
|
|
end;
|
|
|
|
function TcxGridRowsViewInfo.IsDataRowHeightAssigned: Boolean;
|
|
begin
|
|
Result := GridViewInfo.SupportsAutoHeight and (GridView.OptionsView.DataRowHeight <> 0);
|
|
end;
|
|
|
|
procedure TcxGridRowsViewInfo.Offset(DX, DY: Integer);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
inherited;
|
|
if HasFilterRow then
|
|
FilterRowViewInfo.DoOffset(DX, 0);
|
|
if HasNewItemRow then
|
|
NewItemRowViewInfo.DoOffset(DX, 0);
|
|
for I := 0 to Count - 1 do
|
|
Items[I].DoOffset(DX, 0);
|
|
end;
|
|
|
|
{ TcxGridTableViewInfo }
|
|
|
|
function TcxGridTableViewInfo.GetController: TcxGridTableController;
|
|
begin
|
|
Result := TcxGridTableController(inherited Controller);
|
|
end;
|
|
|
|
function TcxGridTableViewInfo.GetDataWidth: Integer;
|
|
begin
|
|
if FDataWidth = 0 then
|
|
FDataWidth := CalculateDataWidth;
|
|
Result := FDataWidth;
|
|
end;
|
|
|
|
function TcxGridTableViewInfo.GetGridView: TcxGridTableView;
|
|
begin
|
|
Result := TcxGridTableView(inherited GridView);
|
|
end;
|
|
|
|
function TcxGridTableViewInfo.GetGridLineColor: TColor;
|
|
begin
|
|
Result := GridView.OptionsView.GetGridLineColor;
|
|
end;
|
|
|
|
function TcxGridTableViewInfo.GetGridLines: TcxGridLines;
|
|
begin
|
|
Result := GridView.OptionsView.GridLines;
|
|
end;
|
|
|
|
function TcxGridTableViewInfo.GetLeftPos: Integer;
|
|
begin
|
|
Result := Controller.LeftPos;
|
|
end;
|
|
|
|
function TcxGridTableViewInfo.GetLevelIndentBackgroundBitmap: TBitmap;
|
|
begin
|
|
Result := RecordsViewInfo.GroupBackgroundBitmap;
|
|
end;
|
|
|
|
function TcxGridTableViewInfo.GetLevelIndentColor(Index: Integer): TColor;
|
|
var
|
|
AParams: TcxViewParams;
|
|
begin
|
|
GridView.Styles.GetGroupParams(nil, Index, AParams);
|
|
Result := AParams.Color;
|
|
end;
|
|
|
|
function TcxGridTableViewInfo.GetRecordsViewInfo: TcxGridRowsViewInfo;
|
|
begin
|
|
Result := TcxGridRowsViewInfo(inherited RecordsViewInfo);
|
|
end;
|
|
|
|
function TcxGridTableViewInfo.GetViewData: TcxGridViewData;
|
|
begin
|
|
Result := TcxGridViewData(inherited ViewData);
|
|
end;
|
|
|
|
procedure TcxGridTableViewInfo.AfterCalculating;
|
|
begin
|
|
if Visible and (RecordsViewInfo.DataRowHeight <> FPrevDataRowHeight) then
|
|
Controller.PostGridModeBufferCountUpdate;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TcxGridTableViewInfo.BeforeCalculating;
|
|
begin
|
|
inherited;
|
|
CalculateExpandButtonParams;
|
|
if Visible then
|
|
FPrevDataRowHeight := RecordsViewInfo.DataRowHeight;
|
|
end;
|
|
|
|
procedure TcxGridTableViewInfo.CreateViewInfos;
|
|
|
|
function GetFilterViewInfoIndex: Integer;
|
|
begin
|
|
if FilterViewInfo.Alignment = gpaTop then
|
|
Result := FHeaderViewInfo.Index
|
|
else
|
|
Result := FFooterViewInfo.Index;
|
|
end;
|
|
|
|
begin
|
|
// inherited; - because of new item row view info in banded view
|
|
FGroupByBoxViewInfo := GetGroupByBoxViewInfoClass.Create(Self);
|
|
FHeaderViewInfo := GetHeaderViewInfoClass.Create(Self);
|
|
FFooterViewInfo := GetFooterViewInfoClass.Create(Self);
|
|
FIndicatorViewInfo := GetIndicatorViewInfoClass.Create(Self);
|
|
inherited;
|
|
FilterViewInfo.Index := GetFilterViewInfoIndex;
|
|
end;
|
|
|
|
procedure TcxGridTableViewInfo.DestroyViewInfos(AIsRecreating: Boolean);
|
|
begin
|
|
inherited;
|
|
FreeAndNil(FIndicatorViewInfo);
|
|
FreeAndNil(FFooterViewInfo);
|
|
FreeAndNil(FHeaderViewInfo);
|
|
FreeAndNil(FGroupByBoxViewInfo);
|
|
// inherited;
|
|
end;
|
|
|
|
{var
|
|
max: integer;}
|
|
|
|
procedure TcxGridTableViewInfo.Calculate;
|
|
(*var
|
|
ft,lt{,i}: Integer;*)
|
|
begin
|
|
//ft := gettickcount;
|
|
|
|
//for I := 1 to 10 do
|
|
|
|
try
|
|
RecreateViewInfos;
|
|
CalculateParts;
|
|
ClientBounds := CalculateClientBounds;
|
|
IndicatorViewInfo.Calculate(Bounds.Left, ClientBounds.Top - HeaderViewInfo.Height);
|
|
finally
|
|
inherited;
|
|
end;
|
|
|
|
(*if CalculateDown then
|
|
begin
|
|
lt := gettickcount;
|
|
//if lt - ft > max then max := lt - ft;
|
|
//if TcxGridLevel(GridView.Level).IsTop then
|
|
application.MainForm.Caption :=
|
|
//inttostr(max);
|
|
inttostr(lt - ft);
|
|
end;*)
|
|
end;
|
|
|
|
function TcxGridTableViewInfo.CalculateClientBounds: TRect;
|
|
begin
|
|
Result := inherited CalculateClientBounds;
|
|
Inc(Result.Left, IndicatorViewInfo.Width);
|
|
end;
|
|
|
|
function TcxGridTableViewInfo.CalculateDataWidth: Integer;
|
|
begin
|
|
Result := HeaderViewInfo.Width;
|
|
if (Result = 0) and GridView.OptionsView.ColumnAutoWidth then
|
|
Result := ClientWidth;
|
|
end;
|
|
|
|
procedure TcxGridTableViewInfo.CalculateExpandButtonParams;
|
|
begin
|
|
FExpandButtonIndent := 3;
|
|
FLevelIndent := FExpandButtonIndent + ExpandButtonSize + FExpandButtonIndent;
|
|
end;
|
|
|
|
procedure TcxGridTableViewInfo.CalculateHeight(const AMaxSize: TPoint;
|
|
var AHeight: Integer; var AFullyVisible: Boolean);
|
|
begin
|
|
MainCalculate(Classes.Bounds(
|
|
cxGridInvisibleCoordinate, 0, AMaxSize.X, AMaxSize.Y));
|
|
if VisibleRecordCount = 0 then
|
|
AHeight := GetNonRecordsAreaHeight(False) + RecordsViewInfo.DataRowHeight
|
|
else
|
|
AHeight := RecordsViewInfo.Items[RecordsViewInfo.Count - 1].Bounds.Bottom +
|
|
PartsBottomHeight;
|
|
AFullyVisible := (VisibleRecordCount = 0) or
|
|
(VisibleRecordCount = ViewData.RowCount - FirstRecordIndex) and
|
|
Controller.IsDataFullyVisible(True);
|
|
inherited;
|
|
end;
|
|
|
|
function TcxGridTableViewInfo.CalculatePartBounds(APart: TcxCustomGridPartViewInfo): TRect;
|
|
begin
|
|
Result := inherited CalculatePartBounds(APart);
|
|
if APart.IsScrollable then
|
|
OffsetRect(Result, -LeftPos, 0);
|
|
end;
|
|
|
|
procedure TcxGridTableViewInfo.CalculateParts;
|
|
begin
|
|
GroupByBoxViewInfo.MainCalculate;
|
|
FilterViewInfo.MainCalculate;
|
|
HeaderViewInfo.MainCalculate;
|
|
FooterViewInfo.MainCalculate;
|
|
end;
|
|
|
|
function TcxGridTableViewInfo.CalculateVisibleEqualHeightRecordCount: Integer;
|
|
begin
|
|
Result := (Bounds.Bottom - Bounds.Top - GetNonRecordsAreaHeight(False)) div
|
|
RecordsViewInfo.CommonDataRowHeight;
|
|
end;
|
|
|
|
procedure TcxGridTableViewInfo.CalculateWidth(const AMaxSize: TPoint; var AWidth: Integer);
|
|
begin
|
|
if GridView.OptionsView.ColumnAutoWidth then
|
|
with Site.ClientBounds do
|
|
AWidth := Right - Left
|
|
else
|
|
AWidth := IndicatorViewInfo.Width + DataWidth;
|
|
inherited;
|
|
end;
|
|
|
|
function TcxGridTableViewInfo.DoGetHitTest(const P: TPoint): TcxCustomGridHitTest;
|
|
begin
|
|
if PtInRect(Site.ClientBounds, P) then
|
|
begin
|
|
Result := IndicatorViewInfo.GetHitTest(P);
|
|
if Result <> nil then Exit;
|
|
end;
|
|
Result := inherited DoGetHitTest(P);
|
|
end;
|
|
|
|
function TcxGridTableViewInfo.GetDefaultGridModeBufferCount: Integer;
|
|
begin
|
|
if RecordsViewInfo.DataRowHeight = 0 then
|
|
begin
|
|
Controller.PostGridModeBufferCountUpdate;
|
|
Result := 0;
|
|
end
|
|
else
|
|
Result := Screen.Height div RecordsViewInfo.DataRowHeight + 2;
|
|
end;
|
|
|
|
function TcxGridTableViewInfo.GetFirstItemAdditionalWidth: Integer;
|
|
begin
|
|
Result := VisualLevelCount * LevelIndent;
|
|
end;
|
|
|
|
function TcxGridTableViewInfo.GetGridLineWidth: Integer;
|
|
begin
|
|
Result := 1;
|
|
end;
|
|
|
|
function TcxGridTableViewInfo.GetLevelSeparatorColor: TColor;
|
|
begin
|
|
Result := GridLineColor;
|
|
end;
|
|
|
|
function TcxGridTableViewInfo.GetNonRecordsAreaHeight(ACheckScrollBar: Boolean): Integer;
|
|
begin
|
|
Result := inherited GetNonRecordsAreaHeight(ACheckScrollBar);
|
|
with RecordsViewInfo do
|
|
begin
|
|
if HasFilterRow then
|
|
Inc(Result, FilterRowViewInfo.Height);
|
|
if HasNewItemRow then
|
|
Inc(Result, NewItemRowViewInfo.Height);
|
|
end;
|
|
end;
|
|
|
|
function TcxGridTableViewInfo.GetScrollableAreaBoundsHorz: TRect;
|
|
begin
|
|
Result := inherited GetScrollableAreaBoundsHorz;
|
|
Dec(Result.Top, HeaderViewInfo.Height);
|
|
Inc(Result.Bottom, FooterViewInfo.Height);
|
|
end;
|
|
|
|
function TcxGridTableViewInfo.GetScrollableAreaBoundsVert: TRect;
|
|
begin
|
|
Result := inherited GetScrollableAreaBoundsVert;
|
|
Dec(Result.Left, IndicatorViewInfo.Width);
|
|
Result.Top := RecordsViewInfo.ContentBounds.Top;
|
|
end;
|
|
|
|
function TcxGridTableViewInfo.GetVisualLevelCount: Integer;
|
|
begin
|
|
Result := GridView.GroupedColumnCount;
|
|
if (Result <> 0) and (GridView.OptionsView.GroupRowStyle = grsOffice11) then
|
|
Dec(Result);
|
|
if GridView.IsMaster then Inc(Result);
|
|
end;
|
|
|
|
procedure TcxGridTableViewInfo.Offset(DX, DY: Integer);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to PartCount - 1 do
|
|
with Parts[I] do
|
|
if IsScrollable then DoOffset(DX, 0);
|
|
inherited;
|
|
end;
|
|
|
|
procedure TcxGridTableViewInfo.RecreateViewInfos;
|
|
begin
|
|
FDataWidth := 0;
|
|
inherited;
|
|
end;
|
|
|
|
function TcxGridTableViewInfo.SupportsAutoHeight: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
function TcxGridTableViewInfo.SupportsGroupSummariesAlignedWithColumns: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
function TcxGridTableViewInfo.SupportsMultipleFooterSummaries: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
function TcxGridTableViewInfo.GetFooterPainterClass: TcxGridFooterPainterClass;
|
|
begin
|
|
Result := TcxGridFooterPainter;
|
|
end;
|
|
|
|
function TcxGridTableViewInfo.GetFooterViewInfoClass: TcxGridFooterViewInfoClass;
|
|
begin
|
|
Result := TcxGridFooterViewInfo;
|
|
end;
|
|
|
|
function TcxGridTableViewInfo.GetGroupByBoxViewInfoClass: TcxGridGroupByBoxViewInfoClass;
|
|
begin
|
|
Result := TcxGridGroupByBoxViewInfo;
|
|
end;
|
|
|
|
function TcxGridTableViewInfo.GetHeaderViewInfoClass: TcxGridHeaderViewInfoClass;
|
|
begin
|
|
Result := TcxGridHeaderViewInfo;
|
|
end;
|
|
|
|
function TcxGridTableViewInfo.GetIndicatorViewInfoClass: TcxGridIndicatorViewInfoClass;
|
|
begin
|
|
Result := TcxGridIndicatorViewInfo;
|
|
end;
|
|
|
|
function TcxGridTableViewInfo.GetHeaderViewInfoSpecificClass: TcxGridHeaderViewInfoSpecificClass;
|
|
begin
|
|
Result := TcxGridHeaderViewInfoSpecific;
|
|
end;
|
|
|
|
function TcxGridTableViewInfo.GetRecordsViewInfoClass: TcxCustomGridRecordsViewInfoClass;
|
|
begin
|
|
Result := TcxGridRowsViewInfo;
|
|
end;
|
|
|
|
function TcxGridTableViewInfo.GetCellBorders(AIsRight, AIsBottom: Boolean): TcxBorders;
|
|
begin
|
|
case GridLines of
|
|
glBoth:
|
|
Result := [bRight, bBottom];
|
|
glNone:
|
|
Result := [];
|
|
glVertical:
|
|
Result := [bRight];
|
|
glHorizontal:
|
|
begin
|
|
if AIsRight then
|
|
Result := [bRight]
|
|
else
|
|
Result := [];
|
|
Include(Result, bBottom);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function TcxGridTableViewInfo.GetCellHeight(AIndex, ACellHeight: Integer): Integer;
|
|
begin
|
|
Result := ACellHeight;
|
|
end;
|
|
|
|
function TcxGridTableViewInfo.GetCellTopOffset(AIndex, ACellHeight: Integer): Integer;
|
|
begin
|
|
Result := 0;
|
|
end;
|
|
|
|
function TcxGridTableViewInfo.GetOffsetBounds(AItemsOffset: Integer; out AUpdateBounds: TRect): TRect;
|
|
begin
|
|
Result := ScrollableAreaBoundsVert;
|
|
AUpdateBounds := Result;
|
|
if AItemsOffset < 0 then
|
|
begin
|
|
Inc(Result.Top, -AItemsOffset);
|
|
with RecordsViewInfo do
|
|
if VisibleCount >= 2 then
|
|
Result.Bottom := Items[VisibleCount - 2].Bounds.Bottom;
|
|
AUpdateBounds.Top := Result.Bottom + AItemsOffset;
|
|
end
|
|
else
|
|
begin
|
|
Dec(Result.Bottom, AItemsOffset);
|
|
with RecordsViewInfo do
|
|
if PartVisibleCount >= 2 then
|
|
Result.Top := Items[1].Bounds.Top;
|
|
AUpdateBounds.Bottom := Result.Top + AItemsOffset;
|
|
end;
|
|
end;
|
|
|
|
function TcxGridTableViewInfo.GetOffsetBounds(DX, DY: Integer; out AUpdateBounds: TRect): TRect;
|
|
begin
|
|
Result := ScrollableAreaBoundsHorz;
|
|
AUpdateBounds := Result;
|
|
if DX < 0 then
|
|
begin
|
|
Inc(Result.Left, -DX);
|
|
AUpdateBounds.Left := Result.Right + DX;
|
|
end
|
|
else
|
|
begin
|
|
Dec(Result.Right, DX);
|
|
AUpdateBounds.Right := Result.Left + DX;
|
|
end;
|
|
end;
|
|
|
|
function TcxGridTableViewInfo.GetVisualLevel(ALevel: Integer): Integer;
|
|
begin
|
|
Result := ALevel;
|
|
if (Result <> 0) and (Result = GridView.GroupedColumnCount) and
|
|
(GridView.OptionsView.GroupRowStyle = grsOffice11) then
|
|
Dec(Result);
|
|
end;
|
|
|
|
function TcxGridTableViewInfo.GetNearestPopupHeight(AHeight: Integer;
|
|
AAdditionalRecord: Boolean = False): Integer;
|
|
var
|
|
ARowCount: Integer;
|
|
begin
|
|
ARowCount := (AHeight - GetNonRecordsAreaHeight(True)) div RecordsViewInfo.DataRowHeight;
|
|
if ARowCount < 1 then ARowCount := 1;
|
|
if ARowCount > ViewData.RowCount + Ord(AAdditionalRecord) then
|
|
ARowCount := ViewData.RowCount + Ord(AAdditionalRecord);
|
|
Result := GetNonRecordsAreaHeight(True) + ARowCount * RecordsViewInfo.DataRowHeight;
|
|
end;
|
|
|
|
function TcxGridTableViewInfo.GetPopupHeight(ADropDownRowCount: Integer): Integer;
|
|
begin
|
|
Result := GetNonRecordsAreaHeight(True) + ADropDownRowCount * RecordsViewInfo.DataRowHeight;
|
|
end;
|
|
|
|
{ TcxGridTableViewInfoCacheItem }
|
|
|
|
procedure TcxGridTableViewInfoCacheItem.SetPreviewHeight(Value: Integer);
|
|
begin
|
|
FPreviewHeight := Value;
|
|
IsPreviewHeightAssigned := True;
|
|
end;
|
|
|
|
procedure TcxGridTableViewInfoCacheItem.UnassignValues(AKeepMaster: Boolean);
|
|
begin
|
|
inherited;
|
|
IsPreviewHeightAssigned := False;
|
|
end;
|
|
|
|
{ TcxGridMasterTableViewInfoCacheItem }
|
|
|
|
destructor TcxGridMasterTableViewInfoCacheItem.Destroy;
|
|
begin
|
|
if IsDetailsSiteCachedInfoAssigned then
|
|
FreeAndNil(DetailsSiteCachedInfo);
|
|
inherited;
|
|
end;
|
|
|
|
function TcxGridMasterTableViewInfoCacheItem.GetGridRecord: TcxGridMasterDataRow;
|
|
begin
|
|
Result := TcxGridMasterDataRow(inherited GridRecord);
|
|
end;
|
|
|
|
function TcxGridMasterTableViewInfoCacheItem.GetIsDetailsSiteCachedInfoAssigned: Boolean;
|
|
begin
|
|
Result := DetailsSiteCachedInfo <> nil;
|
|
end;
|
|
|
|
procedure TcxGridMasterTableViewInfoCacheItem.SetDetailsSiteFullyVisible(Value: Boolean);
|
|
begin
|
|
FDetailsSiteFullyVisible := Value;
|
|
IsDetailsSiteFullyVisibleAssigned := True;
|
|
end;
|
|
|
|
procedure TcxGridMasterTableViewInfoCacheItem.SetDetailsSiteHeight(Value: Integer);
|
|
begin
|
|
FDetailsSiteHeight := Value;
|
|
IsDetailsSiteHeightAssigned := True;
|
|
end;
|
|
|
|
procedure TcxGridMasterTableViewInfoCacheItem.SetDetailsSiteNormalHeight(Value: Integer);
|
|
begin
|
|
FDetailsSiteNormalHeight := Value;
|
|
IsDetailsSiteNormalHeightAssigned := True;
|
|
end;
|
|
|
|
procedure TcxGridMasterTableViewInfoCacheItem.SetDetailsSiteWidth(Value: Integer);
|
|
begin
|
|
FDetailsSiteWidth := Value;
|
|
IsDetailsSiteWidthAssigned := True;
|
|
end;
|
|
|
|
procedure TcxGridMasterTableViewInfoCacheItem.UnassignValues(AKeepMaster: Boolean);
|
|
begin
|
|
if FUnassigningValues then Exit;
|
|
FUnassigningValues := True;
|
|
try
|
|
inherited;
|
|
IsDetailsSiteFullyVisibleAssigned := False;
|
|
IsDetailsSiteHeightAssigned := False;
|
|
IsDetailsSiteNormalHeightAssigned := False;
|
|
IsDetailsSiteWidthAssigned := False;
|
|
if GridRecord.ActiveDetailGridViewExists and
|
|
(GridRecord.ActiveDetailGridView.ViewInfoCache <> nil) then
|
|
GridRecord.ActiveDetailGridView.ViewInfoCache.UnassignValues(AKeepMaster);
|
|
finally
|
|
FUnassigningValues := False;
|
|
end;
|
|
end;
|
|
|
|
{ TcxGridColumnOptions }
|
|
|
|
constructor TcxGridColumnOptions.Create(AItem: TcxCustomGridTableItem);
|
|
begin
|
|
inherited;
|
|
FGroupFooters := True;
|
|
FHorzSizing := True;
|
|
end;
|
|
|
|
function TcxGridColumnOptions.GetGridView: TcxGridTableView;
|
|
begin
|
|
Result := TcxGridTableView(inherited GridView);
|
|
end;
|
|
|
|
procedure TcxGridColumnOptions.SetCellMerging(Value: Boolean);
|
|
begin
|
|
if FCellMerging <> Value then
|
|
begin
|
|
FCellMerging := Value;
|
|
Changed;
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridColumnOptions.SetGroupFooters(Value: Boolean);
|
|
begin
|
|
if FGroupFooters <> Value then
|
|
begin
|
|
FGroupFooters := Value;
|
|
Changed(ticSize);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridColumnOptions.SetHorzSizing(Value: Boolean);
|
|
begin
|
|
if FHorzSizing <> Value then
|
|
begin
|
|
FHorzSizing := Value;
|
|
Changed;
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridColumnOptions.Assign(Source: TPersistent);
|
|
begin
|
|
if Source is TcxGridColumnOptions then
|
|
with TcxGridColumnOptions(Source) do
|
|
begin
|
|
Self.CellMerging := CellMerging;
|
|
Self.GroupFooters := GroupFooters;
|
|
Self.HorzSizing := HorzSizing;
|
|
end;
|
|
inherited;
|
|
end;
|
|
|
|
{ TcxGridRowFooterCellPos }
|
|
|
|
type
|
|
TcxGridRowFooterCellPos = class
|
|
public
|
|
Column: TcxGridColumn;
|
|
FooterGroupLevel: Integer;
|
|
Row: TcxCustomGridRow;
|
|
SummaryItem: TcxDataSummaryItem;
|
|
constructor Create(ARow: TcxCustomGridRow; AColumn: TcxGridColumn;
|
|
AFooterGroupLevel: Integer; ASummaryItem: TcxDataSummaryItem);
|
|
end;
|
|
|
|
constructor TcxGridRowFooterCellPos.Create(ARow: TcxCustomGridRow; AColumn: TcxGridColumn;
|
|
AFooterGroupLevel: Integer; ASummaryItem: TcxDataSummaryItem);
|
|
begin
|
|
inherited Create;
|
|
Row := ARow;
|
|
Column := AColumn;
|
|
FooterGroupLevel := AFooterGroupLevel;
|
|
SummaryItem := ASummaryItem;
|
|
end;
|
|
|
|
{ TcxGridGroupSummaryInfo }
|
|
|
|
type
|
|
TcxGridGroupSummaryInfo = class
|
|
public
|
|
Row: TcxGridGroupRow;
|
|
SummaryItem: TcxDataSummaryItem;
|
|
constructor Create(ARow: TcxGridGroupRow; ASummaryItem: TcxDataSummaryItem);
|
|
end;
|
|
|
|
constructor TcxGridGroupSummaryInfo.Create(ARow: TcxGridGroupRow; ASummaryItem: TcxDataSummaryItem);
|
|
begin
|
|
inherited Create;
|
|
Row := ARow;
|
|
SummaryItem := ASummaryItem;
|
|
end;
|
|
|
|
{ TcxGridColumnStyles }
|
|
|
|
function TcxGridColumnStyles.GetGridViewValue: TcxGridTableView;
|
|
begin
|
|
Result := TcxGridTableView(inherited GridView);
|
|
end;
|
|
|
|
function TcxGridColumnStyles.GetItem: TcxGridColumn;
|
|
begin
|
|
Result := TcxGridColumn(inherited Item);
|
|
end;
|
|
|
|
procedure TcxGridColumnStyles.SetOnGetFooterStyle(Value: TcxGridGetCellStyleEvent);
|
|
begin
|
|
if @FOnGetFooterStyle <> @Value then
|
|
begin
|
|
FOnGetFooterStyle := Value;
|
|
Item.Changed(ticProperty);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridColumnStyles.SetOnGetFooterStyleEx(Value: TcxGridGetFooterStyleExEvent);
|
|
begin
|
|
if @FOnGetFooterStyleEx <> @Value then
|
|
begin
|
|
FOnGetFooterStyleEx := Value;
|
|
Item.Changed(ticProperty);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridColumnStyles.SetOnGetFooterSummaryStyle(Value: TcxGridGetFooterSummaryStyleEvent);
|
|
begin
|
|
if @FOnGetFooterSummaryStyle <> @Value then
|
|
begin
|
|
FOnGetFooterSummaryStyle := Value;
|
|
Item.Changed(ticProperty);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridColumnStyles.SetOnGetGroupSummaryStyle(Value: TcxGridGetGroupSummaryStyleEvent);
|
|
begin
|
|
if @FOnGetGroupSummaryStyle <> @Value then
|
|
begin
|
|
FOnGetGroupSummaryStyle := Value;
|
|
Item.Changed(ticProperty);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridColumnStyles.SetOnGetHeaderStyle(Value: TcxGridGetHeaderStyleEvent);
|
|
begin
|
|
if @FOnGetHeaderStyle <> @Value then
|
|
begin
|
|
FOnGetHeaderStyle := Value;
|
|
Item.Changed(ticProperty);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridColumnStyles.GetDefaultViewParams(Index: Integer; AData: TObject;
|
|
out AParams: TcxViewParams);
|
|
begin
|
|
case Index of
|
|
isFooter:
|
|
GridView.Styles.GetFooterParams(TcxGridRowFooterCellPos(AData).Row, Item,
|
|
TcxGridRowFooterCellPos(AData).FooterGroupLevel,
|
|
TcxGridRowFooterCellPos(AData).SummaryItem, AParams);
|
|
isGroupSummary:
|
|
GridView.Styles.GetGroupSummaryParams(TcxGridGroupSummaryInfo(AData).Row,
|
|
TcxGridGroupSummaryInfo(AData).SummaryItem, AParams);
|
|
isHeader:
|
|
GridView.Styles.GetHeaderParams(Item, AParams);
|
|
else
|
|
inherited;
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridColumnStyles.Assign(Source: TPersistent);
|
|
begin
|
|
inherited;
|
|
if Source is TcxGridColumnStyles then
|
|
with TcxGridColumnStyles(Source) do
|
|
begin
|
|
Self.Footer := Footer;
|
|
Self.GroupSummary := GroupSummary;
|
|
Self.Header := Header;
|
|
Self.OnGetFooterStyle := OnGetFooterStyle;
|
|
Self.OnGetFooterStyleEx := OnGetFooterStyleEx;
|
|
Self.OnGetFooterSummaryStyle := OnGetFooterSummaryStyle;
|
|
Self.OnGetGroupSummaryStyle := OnGetGroupSummaryStyle;
|
|
Self.OnGetHeaderStyle := OnGetHeaderStyle;
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridColumnStyles.GetFooterParams(ARow: TcxCustomGridRow;
|
|
AFooterGroupLevel: Integer; ASummaryItem: TcxDataSummaryItem; out AParams: TcxViewParams);
|
|
var
|
|
AStyle: TcxStyle;
|
|
ARowFooterCellPos: TcxGridRowFooterCellPos;
|
|
begin
|
|
AStyle := nil;
|
|
if Assigned(FOnGetFooterStyle) then
|
|
FOnGetFooterStyle(GridView, ARow, Item, AStyle);
|
|
if Assigned(FOnGetFooterStyleEx) then
|
|
FOnGetFooterStyleEx(GridView, ARow, Item, AFooterGroupLevel, AStyle);
|
|
if Assigned(FOnGetFooterSummaryStyle) and (ASummaryItem <> nil) then
|
|
FOnGetFooterSummaryStyle(GridView, ARow, Item, AFooterGroupLevel, ASummaryItem, AStyle);
|
|
ARowFooterCellPos := TcxGridRowFooterCellPos.Create(ARow, Item, AFooterGroupLevel, ASummaryItem);
|
|
try
|
|
GetViewParams(isFooter, ARowFooterCellPos, AStyle, AParams);
|
|
finally
|
|
ARowFooterCellPos.Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridColumnStyles.GetGroupSummaryParams(ARow: TcxGridGroupRow;
|
|
ASummaryItem: TcxDataSummaryItem; out AParams: TcxViewParams);
|
|
var
|
|
AStyle: TcxStyle;
|
|
ASummaryInfo: TcxGridGroupSummaryInfo;
|
|
begin
|
|
AStyle := nil;
|
|
if (ARow <> nil) and Assigned(FOnGetGroupSummaryStyle) then
|
|
FOnGetGroupSummaryStyle(GridView, ARow, Item, ASummaryItem, AStyle);
|
|
ASummaryInfo := TcxGridGroupSummaryInfo.Create(ARow, ASummaryItem);
|
|
try
|
|
GetViewParams(isGroupSummary, ASummaryInfo, AStyle, AParams);
|
|
finally
|
|
ASummaryInfo.Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridColumnStyles.GetHeaderParams(out AParams: TcxViewParams);
|
|
var
|
|
AStyle: TcxStyle;
|
|
begin
|
|
AStyle := nil;
|
|
if Assigned(FOnGetHeaderStyle) then
|
|
FOnGetHeaderStyle(GridView, Item, AStyle);
|
|
GetViewParams(isHeader, nil, AStyle, AParams);
|
|
end;
|
|
|
|
{ TcxGridColumnSummary }
|
|
|
|
function TcxGridColumnSummary.GetDataController: TcxCustomDataController;
|
|
begin
|
|
Result := TcxGridTableView(GridView).FDataController;
|
|
end;
|
|
|
|
function TcxGridColumnSummary.GetFormat(Index: TcxGridSummariesIndex): string;
|
|
begin
|
|
Result := GetSummaryItems(Index).GetDataItemFormat(Item.Index, GetSummaryItemsPosition(Index));
|
|
end;
|
|
|
|
function TcxGridColumnSummary.GetKind(Index: TcxGridSummariesIndex): TcxSummaryKind;
|
|
begin
|
|
Result := GetSummaryItems(Index).GetDataItemKind(Item.Index, GetSummaryItemsPosition(Index));
|
|
end;
|
|
|
|
function TcxGridColumnSummary.GetSortByGroupFooterSummary: Boolean;
|
|
begin
|
|
Result := GetSummaryItems(siGroup).GetDataItemSorted(Item.Index, spFooter);
|
|
end;
|
|
|
|
function TcxGridColumnSummary.GetSortByGroupSummary: Boolean;
|
|
begin
|
|
Result := GetSummaryItems(siGroup).GetDataItemSorted(Item.Index, spGroup);
|
|
end;
|
|
|
|
procedure TcxGridColumnSummary.SetFormat(Index: TcxGridSummariesIndex; const Value: string);
|
|
begin
|
|
GetSummaryItems(Index).SetDataItemFormat(Item.Index, GetSummaryItemsPosition(Index), Value);
|
|
end;
|
|
|
|
procedure TcxGridColumnSummary.SetKind(Index: TcxGridSummariesIndex; Value: TcxSummaryKind);
|
|
begin
|
|
GetSummaryItems(Index).SetDataItemKind(Item.Index, GetSummaryItemsPosition(Index), Value);
|
|
end;
|
|
|
|
procedure TcxGridColumnSummary.SetSortByGroupFooterSummary(Value: Boolean);
|
|
begin
|
|
GetSummaryItems(siGroup).SetDataItemSorted(Item.Index, spFooter, Value);
|
|
end;
|
|
|
|
procedure TcxGridColumnSummary.SetSortByGroupSummary(Value: Boolean);
|
|
begin
|
|
GetSummaryItems(siGroup).SetDataItemSorted(Item.Index, spGroup, Value);
|
|
end;
|
|
|
|
function TcxGridColumnSummary.GetSummaryItems(AIndex: TcxGridSummariesIndex): TcxDataSummaryItems;
|
|
begin
|
|
with DataController.Summary do
|
|
if AIndex = siFooter then
|
|
Result := FooterSummaryItems
|
|
else
|
|
Result := DefaultGroupSummaryItems;
|
|
end;
|
|
|
|
function TcxGridColumnSummary.GetSummaryItemsPosition(AIndex: TcxGridSummariesIndex): TcxSummaryPosition;
|
|
begin
|
|
if AIndex = siGroup then
|
|
Result := spGroup
|
|
else
|
|
Result := spFooter;
|
|
end;
|
|
|
|
procedure TcxGridColumnSummary.Assign(Source: TPersistent);
|
|
begin
|
|
if Source is TcxGridColumnSummary then
|
|
with TcxGridColumnSummary(Source) do
|
|
begin
|
|
Self.FooterFormat := FooterFormat;
|
|
Self.FooterKind := FooterKind;
|
|
Self.GroupFooterFormat := GroupFooterFormat;
|
|
Self.GroupFooterKind := GroupFooterKind;
|
|
Self.GroupFormat := GroupFormat;
|
|
Self.GroupKind := GroupKind;
|
|
Self.SortByGroupFooterSummary := SortByGroupFooterSummary;
|
|
Self.SortByGroupSummary := SortByGroupSummary;
|
|
end;
|
|
inherited;
|
|
end;
|
|
|
|
{ TcxGridColumn }
|
|
|
|
constructor TcxGridColumn.Create(AOwner: TComponent);
|
|
begin
|
|
inherited;
|
|
FHeaderGlyphAlignmentVert := vaCenter;
|
|
end;
|
|
|
|
destructor TcxGridColumn.Destroy;
|
|
begin
|
|
Selected := False;
|
|
IsPreview := False;
|
|
inherited;
|
|
end;
|
|
|
|
function TcxGridColumn.GetController: TcxGridTableController;
|
|
begin
|
|
Result := TcxGridTableController(inherited Controller);
|
|
end;
|
|
|
|
function TcxGridColumn.GetFooterAlignmentHorz: TAlignment;
|
|
begin
|
|
if FIsFooterAlignmentHorzAssigned then
|
|
Result := FFooterAlignmentHorz
|
|
else
|
|
Result := GetDefaultValuesProvider.DefaultAlignment;
|
|
end;
|
|
|
|
function TcxGridColumn.GetGridView: TcxGridTableView;
|
|
begin
|
|
Result := TcxGridTableView(inherited GridView);
|
|
end;
|
|
|
|
function TcxGridColumn.GetGroupSummaryAlignment: TAlignment;
|
|
begin
|
|
if FIsGroupSummaryAlignmentAssigned then
|
|
Result := FGroupSummaryAlignment
|
|
else
|
|
Result := GetDefaultValuesProvider.DefaultAlignment;
|
|
end;
|
|
|
|
function TcxGridColumn.GetIsPreview: Boolean;
|
|
begin
|
|
Result := GridView.Preview.Column = Self;
|
|
end;
|
|
|
|
function TcxGridColumn.GetOptions: TcxGridColumnOptions;
|
|
begin
|
|
Result := TcxGridColumnOptions(inherited Options);
|
|
end;
|
|
|
|
function TcxGridColumn.GetStyles: TcxGridColumnStyles;
|
|
begin
|
|
Result := TcxGridColumnStyles(inherited Styles);
|
|
end;
|
|
|
|
function TcxGridColumn.GetViewData: TcxGridViewData;
|
|
begin
|
|
Result := TcxGridViewData(inherited ViewData);
|
|
end;
|
|
|
|
procedure TcxGridColumn.SetFooterAlignmentHorz(Value: TAlignment);
|
|
begin
|
|
if (FooterAlignmentHorz <> Value) or IsLoading then
|
|
begin
|
|
FFooterAlignmentHorz := Value;
|
|
FIsFooterAlignmentHorzAssigned := True;
|
|
Changed(ticLayout);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridColumn.SetGroupSummaryAlignment(Value: TAlignment);
|
|
begin
|
|
if (GroupSummaryAlignment <> Value) or IsLoading then
|
|
begin
|
|
FGroupSummaryAlignment := Value;
|
|
FIsGroupSummaryAlignmentAssigned := True;
|
|
Changed(ticLayout);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridColumn.SetHeaderGlyph(Value: TBitmap);
|
|
begin
|
|
FHeaderGlyph.Assign(Value);
|
|
end;
|
|
|
|
procedure TcxGridColumn.SetHeaderGlyphAlignmentHorz(Value: TAlignment);
|
|
begin
|
|
if FHeaderGlyphAlignmentHorz <> Value then
|
|
begin
|
|
FHeaderGlyphAlignmentHorz := Value;
|
|
Changed(ticLayout);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridColumn.SetHeaderGlyphAlignmentVert(Value: TcxAlignmentVert);
|
|
begin
|
|
if FHeaderGlyphAlignmentVert <> Value then
|
|
begin
|
|
FHeaderGlyphAlignmentVert := Value;
|
|
Changed(ticLayout);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridColumn.SetIsPreview(Value: Boolean);
|
|
begin
|
|
if IsPreview <> Value then
|
|
if Value then
|
|
GridView.Preview.Column := Self
|
|
else
|
|
GridView.Preview.Column := nil;
|
|
end;
|
|
|
|
procedure TcxGridColumn.SetOnCompareRowValuesForCellMerging(Value: TcxGridColumnCompareRowValuesEvent);
|
|
begin
|
|
if @FOnCompareRowValuesForCellMerging <> @Value then
|
|
begin
|
|
FOnCompareRowValuesForCellMerging := Value;
|
|
Changed(ticProperty);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridColumn.SetOnCompareValuesForCellMerging(Value: TcxGridColumnCompareValuesEvent);
|
|
begin
|
|
if @FOnCompareValuesForCellMerging <> @Value then
|
|
begin
|
|
FOnCompareValuesForCellMerging := Value;
|
|
Changed(ticProperty);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridColumn.SetOnCustomDrawFooterCell(Value: TcxGridColumnCustomDrawHeaderEvent);
|
|
begin
|
|
if @FOnCustomDrawFooterCell <> @Value then
|
|
begin
|
|
FOnCustomDrawFooterCell := Value;
|
|
Changed(ticProperty);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridColumn.SetOnCustomDrawGroupSummaryCell(Value: TcxGridGroupSummaryCellCustomDrawEvent);
|
|
begin
|
|
if @FOnCustomDrawGroupSummaryCell <> @Value then
|
|
begin
|
|
FOnCustomDrawGroupSummaryCell := Value;
|
|
Changed(ticProperty);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridColumn.SetOnCustomDrawHeader(Value: TcxGridColumnCustomDrawHeaderEvent);
|
|
begin
|
|
if @FOnCustomDrawHeader <> @Value then
|
|
begin
|
|
FOnCustomDrawHeader := Value;
|
|
Changed(ticProperty);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridColumn.SetOnHeaderClick(Value: TNotifyEvent);
|
|
begin
|
|
if @FOnHeaderClick <> @Value then
|
|
begin
|
|
FOnHeaderClick := Value;
|
|
Changed(ticProperty);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridColumn.SetOptions(Value: TcxGridColumnOptions);
|
|
begin
|
|
inherited Options := Value;
|
|
end;
|
|
|
|
procedure TcxGridColumn.SetSelected(Value: Boolean);
|
|
begin
|
|
if FSelected <> Value then
|
|
if Value then
|
|
Controller.AddSelectedColumn(Self)
|
|
else
|
|
Controller.RemoveSelectedColumn(Self);
|
|
end;
|
|
|
|
procedure TcxGridColumn.SetStyles(Value: TcxGridColumnStyles);
|
|
begin
|
|
inherited Styles := Value;
|
|
end;
|
|
|
|
procedure TcxGridColumn.SetSummary(Value: TcxGridColumnSummary);
|
|
begin
|
|
FSummary.Assign(Value);
|
|
end;
|
|
|
|
function TcxGridColumn.IsFooterAlignmentHorzStored: Boolean;
|
|
begin
|
|
Result := FIsFooterAlignmentHorzAssigned and
|
|
(FFooterAlignmentHorz <> GetDefaultValuesProvider.DefaultAlignment);
|
|
end;
|
|
|
|
function TcxGridColumn.IsGroupSummaryAlignmentStored: Boolean;
|
|
begin
|
|
Result := FIsGroupSummaryAlignmentAssigned and
|
|
(FGroupSummaryAlignment <> GetDefaultValuesProvider.DefaultAlignment);
|
|
end;
|
|
|
|
procedure TcxGridColumn.HeaderGlyphChanged(Sender: TObject);
|
|
begin
|
|
Changed(ticLayout);
|
|
end;
|
|
|
|
function TcxGridColumn.GetStoredProperties(AProperties: TStrings): Boolean;
|
|
begin
|
|
with AProperties do
|
|
begin
|
|
Add('GroupIndex');
|
|
Add('Width');
|
|
end;
|
|
Result := inherited GetStoredProperties(AProperties);
|
|
end;
|
|
|
|
procedure TcxGridColumn.GetPropertyValue(const AName: string; var AValue: Variant);
|
|
begin
|
|
if AName = 'Width' then
|
|
AValue := Width
|
|
else
|
|
if AName = 'GroupIndex' then
|
|
AValue := GroupIndex
|
|
else
|
|
inherited;
|
|
end;
|
|
|
|
procedure TcxGridColumn.SetPropertyValue(const AName: string; const AValue: Variant);
|
|
begin
|
|
if AName = 'Width' then
|
|
Width := AValue
|
|
else
|
|
if AName = 'GroupIndex' then
|
|
GroupIndex := AValue
|
|
else
|
|
inherited;
|
|
end;
|
|
|
|
procedure TcxGridColumn.CreateSubClasses;
|
|
begin
|
|
inherited;
|
|
FHeaderGlyph := TBitmap.Create;
|
|
FHeaderGlyph.OnChange := HeaderGlyphChanged;
|
|
FSummary := GetSummaryClass.Create(Self);
|
|
end;
|
|
|
|
procedure TcxGridColumn.DestroySubClasses;
|
|
begin
|
|
FreeAndNil(FSummary);
|
|
FreeAndNil(FHeaderGlyph);
|
|
inherited;
|
|
end;
|
|
|
|
function TcxGridColumn.GetOptionsClass: TcxCustomGridTableItemOptionsClass;
|
|
begin
|
|
Result := TcxGridColumnOptions;
|
|
end;
|
|
|
|
function TcxGridColumn.GetStylesClass: TcxCustomGridTableItemStylesClass;
|
|
begin
|
|
Result := TcxGridColumnStyles;
|
|
end;
|
|
|
|
function TcxGridColumn.GetSummaryClass: TcxGridColumnSummaryClass;
|
|
begin
|
|
Result := TcxGridColumnSummary;
|
|
end;
|
|
|
|
procedure TcxGridColumn.AssignColumnWidths;
|
|
begin
|
|
with GridView do
|
|
if OptionsView.ColumnAutoWidth then
|
|
ViewInfo.HeaderViewInfo.AssignColumnWidths;
|
|
end;
|
|
|
|
procedure TcxGridColumn.BestFitApplied(AFireEvents: Boolean);
|
|
begin
|
|
inherited;
|
|
if AFireEvents then
|
|
GridView.DoColumnSizeChanged(Self);
|
|
end;
|
|
|
|
function TcxGridColumn.CalculateBestFitWidth: Integer;
|
|
var
|
|
ABorders: TcxBorders;
|
|
begin
|
|
Result := inherited CalculateBestFitWidth;
|
|
ABorders := GridView.ViewInfo.GetCellBorders(IsMostRight, False);
|
|
Inc(Result, (Ord(bLeft in ABorders) + Ord(bRight in ABorders)) * GridView.ViewInfo.GridLineWidth);
|
|
if (VisibleIndex <> -1) and GridView.Visible then
|
|
begin
|
|
if GridView.OptionsView.Header then
|
|
Result := Max(Result, GridView.ViewInfo.HeaderViewInfo[VisibleIndex].GetBestFitWidth);
|
|
if GridView.OptionsView.Footer then
|
|
Result := Max(Result, GridView.ViewInfo.FooterViewInfo.GetCellBestFitWidth(Self));
|
|
Result := Max(Result, GridView.ViewInfo.RecordsViewInfo.GetFooterCellBestFitWidth(Self));
|
|
end;
|
|
end;
|
|
|
|
function TcxGridColumn.CanCellMerging: Boolean;
|
|
begin
|
|
Result := Options.CellMerging and GridView.CanCellMerging;
|
|
end;
|
|
|
|
function TcxGridColumn.CanEdit: Boolean;
|
|
begin
|
|
if Controller.IsFilterRowFocused then
|
|
Result := CanFocus(Controller.FocusedRecord) and (FocusedCellViewInfo <> nil)
|
|
else
|
|
Result := inherited CanEdit and not CanCellMerging;
|
|
end;
|
|
|
|
function TcxGridColumn.CanFocus(ARecord: TcxCustomGridRecord): Boolean;
|
|
begin
|
|
if ViewData.HasFilterRow and (ARecord = ViewData.FilterRow) then
|
|
Result := ActuallyVisible and CanFilter(False)
|
|
else
|
|
Result := inherited CanFocus(ARecord);
|
|
end;
|
|
|
|
function TcxGridColumn.CanHorzSize: Boolean;
|
|
begin
|
|
Result := inherited CanHorzSize and GridView.OptionsCustomize.ColumnHorzSizing;
|
|
end;
|
|
|
|
function TcxGridColumn.CanShowGroupFooters: Boolean;
|
|
begin
|
|
Result := Options.GroupFooters;
|
|
end;
|
|
|
|
procedure TcxGridColumn.ForceWidth(Value: Integer);
|
|
begin
|
|
AssignColumnWidths;
|
|
inherited;
|
|
AssignColumnWidths;
|
|
Changed(ticSize);
|
|
end;
|
|
|
|
function TcxGridColumn.GetEditValue: Variant;
|
|
begin
|
|
if Controller.IsFilterRowFocused then
|
|
begin
|
|
Result := ViewData.FilterRow.Values[Index];
|
|
if (GridView.FilterRow.ApplyChanges = fracImmediately) and
|
|
SupportsBeginsWithFilterOperator(ViewData.FilterRow) then
|
|
Controller.RemoveBeginsWithMask(Result);
|
|
end
|
|
else
|
|
Result := inherited GetEditValue;
|
|
end;
|
|
|
|
procedure TcxGridColumn.SetEditValue(const Value: Variant);
|
|
var
|
|
AValue: Variant;
|
|
begin
|
|
if Controller.IsFilterRowFocused then
|
|
begin
|
|
AValue := Value;
|
|
if (GridView.FilterRow.ApplyChanges = fracImmediately) and
|
|
SupportsBeginsWithFilterOperator(ViewData.FilterRow) then
|
|
Controller.AddBeginsWithMask(AValue);
|
|
ViewData.FilterRow.Values[Index] := AValue;
|
|
if not Controller.EditingController.ApplyingImmediateFiltering then
|
|
GridView.Filtering.AddFilterToMRUItems;
|
|
end
|
|
else
|
|
inherited SetEditValue(Value);
|
|
end;
|
|
|
|
function TcxGridColumn.GetFixed: Boolean;
|
|
begin
|
|
Result := inherited GetFixed or
|
|
(Controller.ForcingWidthItem <> nil) and
|
|
Controller.IsColumnFixedDuringHorzSizing(Self);
|
|
end;
|
|
|
|
function TcxGridColumn.GetIsBottom: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
function TcxGridColumn.GetIsLeft: Boolean;
|
|
begin
|
|
Result := IsFirst;
|
|
end;
|
|
|
|
function TcxGridColumn.GetIsMostBottom: Boolean;
|
|
begin
|
|
Result := IsBottom;
|
|
end;
|
|
|
|
function TcxGridColumn.GetIsMostLeft: Boolean;
|
|
begin
|
|
Result := IsLeft;
|
|
end;
|
|
|
|
function TcxGridColumn.GetIsMostRight: Boolean;
|
|
begin
|
|
Result := IsRight;
|
|
end;
|
|
|
|
function TcxGridColumn.GetIsRight: Boolean;
|
|
begin
|
|
Result := IsLast;
|
|
end;
|
|
|
|
function TcxGridColumn.GetIsTop: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
function TcxGridColumn.GetVisible: Boolean;
|
|
begin
|
|
Result := inherited GetVisible and not IsPreview;
|
|
end;
|
|
|
|
function TcxGridColumn.GetVisibleForCustomization: Boolean;
|
|
begin
|
|
Result := inherited GetVisibleForCustomization and not IsPreview;
|
|
end;
|
|
|
|
function TcxGridColumn.HasFixedWidth: Boolean;
|
|
begin
|
|
Result := not Options.HorzSizing;
|
|
end;
|
|
|
|
function TcxGridColumn.HideOnGrouping: Boolean;
|
|
begin
|
|
Result := GridView.OptionsCustomize.ColumnHidingOnGrouping;
|
|
end;
|
|
|
|
function TcxGridColumn.IsVisibleStored: Boolean;
|
|
begin
|
|
Result := inherited IsVisibleStored and not IsPreview;
|
|
end;
|
|
|
|
function TcxGridColumn.IsVisibleForCustomizationStored: Boolean;
|
|
begin
|
|
Result := inherited IsVisibleForCustomizationStored and not IsPreview;
|
|
end;
|
|
|
|
function TcxGridColumn.SupportsBeginsWithFilterOperator(ARow: TcxCustomGridRow): Boolean;
|
|
var
|
|
AProperties: TcxCustomEditProperties;
|
|
AFilterHelper: TcxCustomFilterEditHelperClass;
|
|
begin
|
|
if ARow = nil then
|
|
AProperties := GetProperties
|
|
else
|
|
AProperties := GetProperties(ARow);
|
|
AFilterHelper := FilterEditsController.FindHelper(AProperties.ClassType);
|
|
Result := (AFilterHelper <> nil) and
|
|
(fcoLike in AFilterHelper.GetSupportedFilterOperators(AProperties, DataBinding.ValueTypeClass));
|
|
end;
|
|
|
|
{procedure TcxGridColumn.VisibleChanged;
|
|
begin
|
|
//FGridView.RefreshVisibleColumnsList;
|
|
//FGridView.RefreshCustomizationForm;
|
|
end;}
|
|
|
|
function TcxGridColumn.GetHeaderViewInfoClass: TcxGridColumnHeaderViewInfoClass;
|
|
begin
|
|
Result := TcxGridColumnHeaderViewInfo;
|
|
end;
|
|
|
|
procedure TcxGridColumn.DoCustomDrawFooterCell(ACanvas: TcxCanvas;
|
|
AViewInfo: TcxGridColumnHeaderViewInfo; var ADone: Boolean);
|
|
begin
|
|
if HasCustomDrawFooterCell then
|
|
FOnCustomDrawFooterCell(GridView, ACanvas, AViewInfo, ADone);
|
|
end;
|
|
|
|
procedure TcxGridColumn.DoCustomDrawGroupSummaryCell(ACanvas: TcxCanvas;
|
|
AViewInfo: TcxCustomGridViewCellViewInfo; var ADone: Boolean);
|
|
var
|
|
ACell: TcxGridGroupSummaryCellViewInfo;
|
|
begin
|
|
if HasCustomDrawGroupSummaryCell then
|
|
begin
|
|
ACell := TcxGridGroupSummaryCellViewInfo(AViewInfo);
|
|
FOnCustomDrawGroupSummaryCell(Self, ACanvas, ACell.RowViewInfo.GridRecord,
|
|
Self, ACell.SummaryItem, AViewInfo, ADone);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridColumn.DoCustomDrawHeader(ACanvas: TcxCanvas;
|
|
AViewInfo: TcxGridColumnHeaderViewInfo; var ADone: Boolean);
|
|
begin
|
|
if HasCustomDrawHeader then
|
|
FOnCustomDrawHeader(GridView, ACanvas, AViewInfo, ADone);
|
|
end;
|
|
|
|
procedure TcxGridColumn.DoHeaderClick;
|
|
begin
|
|
if Assigned(FOnHeaderClick) then FOnHeaderClick(Self);
|
|
GridView.DoColumnHeaderClick(Self);
|
|
end;
|
|
|
|
function TcxGridColumn.HasCustomDrawFooterCell: Boolean;
|
|
begin
|
|
Result := Assigned(FOnCustomDrawFooterCell);
|
|
end;
|
|
|
|
function TcxGridColumn.HasCustomDrawGroupSummaryCell: Boolean;
|
|
begin
|
|
Result := Assigned(FOnCustomDrawGroupSummaryCell);
|
|
end;
|
|
|
|
function TcxGridColumn.HasCustomDrawHeader: Boolean;
|
|
begin
|
|
Result := Assigned(FOnCustomDrawHeader);
|
|
end;
|
|
|
|
procedure TcxGridColumn.Assign(Source: TPersistent);
|
|
begin
|
|
if Source is TcxGridColumn then
|
|
with TcxGridColumn(Source) do
|
|
begin
|
|
Self.FooterAlignmentHorz := FooterAlignmentHorz;
|
|
Self.GroupSummaryAlignment := GroupSummaryAlignment;
|
|
Self.HeaderGlyph := HeaderGlyph;
|
|
Self.HeaderGlyphAlignmentHorz := HeaderGlyphAlignmentHorz;
|
|
Self.HeaderGlyphAlignmentVert := HeaderGlyphAlignmentVert;
|
|
Self.Summary := Summary;
|
|
Self.OnCompareRowValuesForCellMerging := OnCompareRowValuesForCellMerging;
|
|
Self.OnCompareValuesForCellMerging := OnCompareValuesForCellMerging;
|
|
Self.OnCustomDrawFooterCell := OnCustomDrawFooterCell;
|
|
Self.OnCustomDrawGroupSummaryCell := OnCustomDrawGroupSummaryCell;
|
|
Self.OnCustomDrawHeader := OnCustomDrawHeader;
|
|
Self.OnHeaderClick := OnHeaderClick;
|
|
end;
|
|
inherited;
|
|
end;
|
|
|
|
function TcxGridColumn.DoCompareValuesForCellMerging(
|
|
ARow1: TcxGridDataRow; AProperties1: TcxCustomEditProperties; const AValue1: TcxEditValue;
|
|
ARow2: TcxGridDataRow; AProperties2: TcxCustomEditProperties; const AValue2: TcxEditValue): Boolean;
|
|
begin
|
|
Result := (AProperties1 = AProperties2) and AProperties1.CompareDisplayValues(AValue1, AValue2);
|
|
if Assigned(FOnCompareValuesForCellMerging) then
|
|
FOnCompareValuesForCellMerging(Self, AProperties1, AValue1, AProperties2, AValue2, Result);
|
|
if Assigned(FOnCompareRowValuesForCellMerging) then
|
|
FOnCompareRowValuesForCellMerging(Self, ARow1, AProperties1, AValue1,
|
|
ARow2, AProperties2, AValue2, Result);
|
|
end;
|
|
|
|
procedure TcxGridColumn.FocusWithSelection;
|
|
begin
|
|
if not Focused then
|
|
begin
|
|
GridView.BeginUpdate;
|
|
try
|
|
Controller.ClearCellSelection;
|
|
Selected := True;
|
|
Controller.CellSelectionAnchor := Self;
|
|
finally
|
|
GridView.EndUpdate;
|
|
end;
|
|
end;
|
|
inherited;
|
|
end;
|
|
|
|
function TcxGridColumn.GroupBy(AGroupIndex: Integer; ACanShow: Boolean = True): Boolean;
|
|
begin
|
|
Result := CanGroup;
|
|
if not Result then Exit;
|
|
GroupIndex := AGroupIndex;
|
|
if AGroupIndex = -1 then
|
|
if ACanShow and ShowOnUngrouping and WasVisibleBeforeGrouping then
|
|
Visible := True
|
|
else
|
|
else
|
|
if HideOnGrouping and CanHide then
|
|
Visible := False;
|
|
end;
|
|
|
|
{ TcxGridTableBackgroundBitmaps }
|
|
|
|
function TcxGridTableBackgroundBitmaps.GetBitmapStyleIndex(Index: Integer): Integer;
|
|
begin
|
|
case Index of
|
|
bbFooter:
|
|
Result := vsFooter;
|
|
bbHeader:
|
|
Result := vsHeader;
|
|
bbGroup:
|
|
Result := vsGroup;
|
|
bbGroupByBox:
|
|
Result := vsGroupByBox;
|
|
bbIndicator:
|
|
Result := vsIndicator;
|
|
bbPreview:
|
|
Result := vsPreview;
|
|
else
|
|
Result := inherited GetBitmapStyleIndex(Index);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableBackgroundBitmaps.Assign(Source: TPersistent);
|
|
begin
|
|
if Source is TcxGridTableBackgroundBitmaps then
|
|
with TcxGridTableBackgroundBitmaps(Source) do
|
|
begin
|
|
Self.Footer := Footer;
|
|
Self.Header := Header;
|
|
Self.Group := Group;
|
|
Self.GroupByBox := GroupByBox;
|
|
Self.Indicator := Indicator;
|
|
Self.Preview := Preview;
|
|
end;
|
|
inherited;
|
|
end;
|
|
|
|
{ TcxGridTableOptionsBehavior }
|
|
|
|
constructor TcxGridTableOptionsBehavior.Create(AGridView: TcxCustomGridView);
|
|
begin
|
|
inherited;
|
|
FColumnHeaderHints := True;
|
|
FCopyPreviewToClipboard := True;
|
|
FExpandMasterRowOnDblClick := True;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsBehavior.SetColumnHeaderHints(Value: Boolean);
|
|
begin
|
|
if FColumnHeaderHints <> Value then
|
|
begin
|
|
FColumnHeaderHints := Value;
|
|
Changed(vcProperty);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsBehavior.SetCopyPreviewToClipboard(Value: Boolean);
|
|
begin
|
|
if FCopyPreviewToClipboard <> Value then
|
|
begin
|
|
FCopyPreviewToClipboard := Value;
|
|
Changed(vcProperty);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsBehavior.SetExpandMasterRowOnDblClick(Value: Boolean);
|
|
begin
|
|
if FExpandMasterRowOnDblClick <> Value then
|
|
begin
|
|
FExpandMasterRowOnDblClick := Value;
|
|
Changed(vcProperty);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsBehavior.Assign(Source: TPersistent);
|
|
begin
|
|
if Source is TcxGridTableOptionsBehavior then
|
|
with TcxGridTableOptionsBehavior(Source) do
|
|
begin
|
|
Self.ColumnHeaderHints := ColumnHeaderHints;
|
|
Self.CopyPreviewToClipboard := CopyPreviewToClipboard;
|
|
Self.ExpandMasterRowOnDblClick := ExpandMasterRowOnDblClick;
|
|
end;
|
|
inherited;
|
|
end;
|
|
|
|
{ TcxGridTableFiltering }
|
|
|
|
function TcxGridTableFiltering.GetColumnFilteredItemsList: Boolean;
|
|
begin
|
|
Result := ItemFilteredItemsList;
|
|
end;
|
|
|
|
function TcxGridTableFiltering.GetColumnMRUItemsList: Boolean;
|
|
begin
|
|
Result := ItemMRUItemsList;
|
|
end;
|
|
|
|
function TcxGridTableFiltering.GetColumnMRUItemsListCount: Integer;
|
|
begin
|
|
Result := ItemMRUItemsListCount;
|
|
end;
|
|
|
|
function TcxGridTableFiltering.GetColumnPopup: TcxGridItemFilterPopupOptions;
|
|
begin
|
|
Result := ItemPopup;
|
|
end;
|
|
|
|
procedure TcxGridTableFiltering.SetColumnFilteredItemsList(Value: Boolean);
|
|
begin
|
|
ItemFilteredItemsList := Value;
|
|
end;
|
|
|
|
procedure TcxGridTableFiltering.SetColumnMRUItemsList(Value: Boolean);
|
|
begin
|
|
ItemMRUItemsList := Value;
|
|
end;
|
|
|
|
procedure TcxGridTableFiltering.SetColumnMRUItemsListCount(Value: Integer);
|
|
begin
|
|
ItemMRUItemsListCount := Value;
|
|
end;
|
|
|
|
procedure TcxGridTableFiltering.SetColumnPopup(Value: TcxGridItemFilterPopupOptions);
|
|
begin
|
|
ItemPopup := Value;
|
|
end;
|
|
|
|
procedure TcxGridTableFiltering.DefineProperties(Filer: TFiler);
|
|
begin
|
|
inherited;
|
|
Filer.DefineProperty('ColumnPopupDropDownWidth', ReadItemPopupDropDownWidth, nil, True);
|
|
Filer.DefineProperty('ColumnPopupMaxDropDownItemCount', ReadItemPopupMaxDropDownCount, nil, True);
|
|
end;
|
|
|
|
{ TcxGridTableOptionsCustomize }
|
|
|
|
constructor TcxGridTableOptionsCustomize.Create(AGridView: TcxCustomGridView);
|
|
begin
|
|
inherited;
|
|
FColumnHidingOnGrouping := True;
|
|
FColumnHorzSizing := True;
|
|
end;
|
|
|
|
function TcxGridTableOptionsCustomize.GetColumnFiltering: Boolean;
|
|
begin
|
|
Result := ItemFiltering;
|
|
end;
|
|
|
|
function TcxGridTableOptionsCustomize.GetColumnGrouping: Boolean;
|
|
begin
|
|
Result := ItemGrouping;
|
|
end;
|
|
|
|
function TcxGridTableOptionsCustomize.GetColumnHiding: Boolean;
|
|
begin
|
|
Result := ItemHiding;
|
|
end;
|
|
|
|
function TcxGridTableOptionsCustomize.GetColumnMoving: Boolean;
|
|
begin
|
|
Result := ItemMoving;
|
|
end;
|
|
|
|
function TcxGridTableOptionsCustomize.GetColumnSorting: Boolean;
|
|
begin
|
|
Result := ItemSorting;
|
|
end;
|
|
|
|
function TcxGridTableOptionsCustomize.GetColumnsQuickCustomization: Boolean;
|
|
begin
|
|
Result := ItemsQuickCustomization;
|
|
end;
|
|
|
|
function TcxGridTableOptionsCustomize.GetColumnsQuickCustomizationMaxDropDownCount: Integer;
|
|
begin
|
|
Result := ItemsQuickCustomizationMaxDropDownCount;
|
|
end;
|
|
|
|
function TcxGridTableOptionsCustomize.GetColumnsQuickCustomizationReordering: TcxGridQuickCustomizationReordering;
|
|
begin
|
|
Result := ItemsQuickCustomizationReordering;
|
|
end;
|
|
|
|
function TcxGridTableOptionsCustomize.GetGridView: TcxGridTableView;
|
|
begin
|
|
Result := TcxGridTableView(inherited GridView);
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsCustomize.SetColumnFiltering(Value: Boolean);
|
|
begin
|
|
ItemFiltering := Value;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsCustomize.SetColumnGrouping(Value: Boolean);
|
|
begin
|
|
ItemGrouping := Value;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsCustomize.SetColumnHiding(Value: Boolean);
|
|
begin
|
|
ItemHiding := Value;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsCustomize.SetColumnHidingOnGrouping(Value: Boolean);
|
|
begin
|
|
if FColumnHidingOnGrouping <> Value then
|
|
begin
|
|
FColumnHidingOnGrouping := Value;
|
|
Changed(vcProperty);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsCustomize.SetColumnHorzSizing(Value: Boolean);
|
|
begin
|
|
if FColumnHorzSizing <> Value then
|
|
begin
|
|
FColumnHorzSizing := Value;
|
|
Changed(vcLayout);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsCustomize.SetColumnMoving(Value: Boolean);
|
|
begin
|
|
ItemMoving := Value;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsCustomize.SetColumnSorting(Value: Boolean);
|
|
begin
|
|
ItemSorting := Value;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsCustomize.SetColumnsQuickCustomization(Value: Boolean);
|
|
begin
|
|
ItemsQuickCustomization := Value;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsCustomize.SetColumnsQuickCustomizationMaxDropDownCount(Value: Integer);
|
|
begin
|
|
ItemsQuickCustomizationMaxDropDownCount := Value;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsCustomize.SetColumnsQuickCustomizationReordering(Value: TcxGridQuickCustomizationReordering);
|
|
begin
|
|
ItemsQuickCustomizationReordering := Value;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsCustomize.SetDataRowSizing(Value: Boolean);
|
|
begin
|
|
if FDataRowSizing <> Value then
|
|
begin
|
|
FDataRowSizing := Value;
|
|
Changed(vcProperty);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsCustomize.SetGroupBySorting(Value: Boolean);
|
|
begin
|
|
if FGroupBySorting <> Value then
|
|
begin
|
|
FGroupBySorting := Value;
|
|
GridView.BeginUpdate;
|
|
try
|
|
GridView.Controller.ClearGrouping;
|
|
GridView.FDataController.ClearSorting(False);
|
|
Changed(vcProperty);
|
|
finally
|
|
GridView.EndUpdate;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsCustomize.SetGroupRowSizing(Value: Boolean);
|
|
begin
|
|
if FGroupRowSizing <> Value then
|
|
begin
|
|
FGroupRowSizing := Value;
|
|
Changed(vcProperty);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsCustomize.Assign(Source: TPersistent);
|
|
begin
|
|
if Source is TcxGridTableOptionsCustomize then
|
|
with TcxGridTableOptionsCustomize(Source) do
|
|
begin
|
|
Self.ColumnHidingOnGrouping := ColumnHidingOnGrouping;
|
|
Self.ColumnHorzSizing := ColumnHorzSizing;
|
|
Self.DataRowSizing := DataRowSizing;
|
|
Self.GroupBySorting := GroupBySorting;
|
|
Self.GroupRowSizing := GroupRowSizing;
|
|
end;
|
|
inherited;
|
|
end;
|
|
|
|
{ TcxGridTableOptionsSelection }
|
|
|
|
procedure TcxGridTableOptionsSelection.SetCellMultiSelect(Value: Boolean);
|
|
begin
|
|
if FCellMultiSelect <> Value then
|
|
begin
|
|
FCellMultiSelect := Value;
|
|
CellSelect := True;
|
|
InvertSelect := not Value;
|
|
MultiSelect := Value;
|
|
Changed(vcProperty);
|
|
end;
|
|
end;
|
|
|
|
function TcxGridTableOptionsSelection.IsCellSelectStored: Boolean;
|
|
begin
|
|
Result := not FCellMultiSelect;
|
|
end;
|
|
|
|
function TcxGridTableOptionsSelection.IsInvertSelectStored: Boolean;
|
|
begin
|
|
Result := not FCellMultiSelect and inherited IsInvertSelectStored;
|
|
end;
|
|
|
|
function TcxGridTableOptionsSelection.IsMultiSelectStored: Boolean;
|
|
begin
|
|
Result := not FCellMultiSelect and inherited IsMultiSelectStored;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsSelection.SetCellSelect(Value: Boolean);
|
|
begin
|
|
if not FCellMultiSelect or Value then
|
|
inherited;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsSelection.SetInvertSelect(Value: Boolean);
|
|
begin
|
|
if not FCellMultiSelect or not Value then
|
|
inherited;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsSelection.SetMultiSelect(Value: Boolean);
|
|
begin
|
|
if not FCellMultiSelect or Value then
|
|
inherited;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsSelection.Assign(Source: TPersistent);
|
|
begin
|
|
if Source is TcxGridTableOptionsSelection then
|
|
with TcxGridTableOptionsSelection(Source) do
|
|
Self.CellMultiSelect := CellMultiSelect;
|
|
inherited;
|
|
end;
|
|
|
|
{ TcxGridSpecialRowOptions }
|
|
|
|
constructor TcxGridSpecialRowOptions.Create(AGridView: TcxCustomGridView);
|
|
begin
|
|
inherited;
|
|
FInfoText := DefaultInfoText;
|
|
FSeparatorColor := clDefault;
|
|
FSeparatorWidth := cxGridCustomRowSeparatorDefaultWidth;
|
|
end;
|
|
|
|
function TcxGridSpecialRowOptions.GetGridView: TcxGridTableView;
|
|
begin
|
|
Result := TcxGridTableView(inherited GridView);
|
|
end;
|
|
|
|
procedure TcxGridSpecialRowOptions.SetInfoText(const Value: string);
|
|
begin
|
|
if FInfoText <> Value then
|
|
begin
|
|
FInfoText := Value;
|
|
Changed(vcLayout);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridSpecialRowOptions.SetSeparatorColor(Value: TColor);
|
|
begin
|
|
if FSeparatorColor <> Value then
|
|
begin
|
|
FSeparatorColor := Value;
|
|
Changed(vcLayout);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridSpecialRowOptions.SetSeparatorWidth(Value: Integer);
|
|
begin
|
|
if Value < cxGridCustomRowSeparatorMinWidth then
|
|
Value := cxGridCustomRowSeparatorMinWidth;
|
|
if FSeparatorWidth <> Value then
|
|
begin
|
|
FSeparatorWidth := Value;
|
|
Changed(vcSize);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridSpecialRowOptions.SetVisible(Value: Boolean);
|
|
begin
|
|
if FVisible <> Value then
|
|
begin
|
|
FVisible := Value;
|
|
VisibleChanged;
|
|
end;
|
|
end;
|
|
|
|
function TcxGridSpecialRowOptions.IsInfoTextStored: Boolean;
|
|
begin
|
|
Result := InfoText <> DefaultInfoText;
|
|
end;
|
|
|
|
function TcxGridSpecialRowOptions.DefaultSeparatorColor: TColor;
|
|
begin
|
|
Result := LookAndFeelPainter.DefaultHeaderColor;
|
|
end;
|
|
|
|
procedure TcxGridSpecialRowOptions.Assign(Source: TPersistent);
|
|
begin
|
|
inherited;
|
|
if Source is TcxGridSpecialRowOptions then
|
|
with TcxGridSpecialRowOptions(Source) do
|
|
begin
|
|
Self.InfoText := InfoText;
|
|
Self.SeparatorColor := SeparatorColor;
|
|
Self.SeparatorWidth := SeparatorWidth;
|
|
Self.Visible := Visible;
|
|
end;
|
|
end;
|
|
|
|
function TcxGridSpecialRowOptions.GetSeparatorColor: TColor;
|
|
begin
|
|
Result := FSeparatorColor;
|
|
if Result = clDefault then
|
|
Result := DefaultSeparatorColor;
|
|
end;
|
|
|
|
{ TcxGridFilterRowOptions }
|
|
|
|
procedure TcxGridFilterRowOptions.SetApplyChanges(Value: TcxGridFilterRowApplyChangesMode);
|
|
begin
|
|
if FApplyChanges <> Value then
|
|
begin
|
|
FApplyChanges := Value;
|
|
Changed(vcProperty);
|
|
end;
|
|
end;
|
|
|
|
function TcxGridFilterRowOptions.DefaultInfoText: string;
|
|
begin
|
|
Result := cxGetResourceString(@scxGridFilterRowInfoText);
|
|
end;
|
|
|
|
procedure TcxGridFilterRowOptions.VisibleChanged;
|
|
begin
|
|
GridView.ViewData.CheckFilterRow;
|
|
Changed(vcSize);
|
|
end;
|
|
|
|
procedure TcxGridFilterRowOptions.Assign(Source: TPersistent);
|
|
begin
|
|
inherited;
|
|
if Source is TcxGridFilterRowOptions then
|
|
ApplyChanges := TcxGridFilterRowOptions(Source).ApplyChanges;
|
|
end;
|
|
|
|
{ TcxGridNewItemRowOptions }
|
|
|
|
function TcxGridNewItemRowOptions.DefaultInfoText: string;
|
|
begin
|
|
Result := cxGetResourceString(@scxGridNewItemRowInfoText);
|
|
end;
|
|
|
|
procedure TcxGridNewItemRowOptions.VisibleChanged;
|
|
begin
|
|
GridView.ViewData.CheckNewItemRecord;
|
|
GridView.FDataController.UseNewItemRowForEditing := Visible;
|
|
end;
|
|
|
|
{ TcxGridTableOptionsView }
|
|
|
|
constructor TcxGridTableOptionsView.Create(AGridView: TcxCustomGridView);
|
|
begin
|
|
inherited;
|
|
FExpandButtonsForEmptyDetails := True;
|
|
FGridLineColor := clDefault;
|
|
FGroupByBox := True;
|
|
FHeader := True;
|
|
FIndicatorWidth := cxGridDefaultIndicatorWidth;
|
|
FPrevGroupFooters := gfVisibleWhenExpanded;
|
|
FRowSeparatorColor := clDefault;
|
|
end;
|
|
|
|
function TcxGridTableOptionsView.GetExpandButtonsForEmptyDetails: Boolean;
|
|
begin
|
|
Result := FExpandButtonsForEmptyDetails and
|
|
((GridView.Level = nil) or TcxGridLevel(GridView.Level).Options.TabsForEmptyDetails);
|
|
end;
|
|
|
|
function TcxGridTableOptionsView.GetGridView: TcxGridTableView;
|
|
begin
|
|
Result := TcxGridTableView(inherited GridView);
|
|
end;
|
|
|
|
function TcxGridTableOptionsView.GetHeaderAutoHeight: Boolean;
|
|
begin
|
|
Result := ItemCaptionAutoHeight;
|
|
end;
|
|
|
|
function TcxGridTableOptionsView.GetHeaderEndEllipsis: Boolean;
|
|
begin
|
|
Result := ItemCaptionEndEllipsis;
|
|
end;
|
|
|
|
function TcxGridTableOptionsView.GetNewItemRow: Boolean;
|
|
begin
|
|
Result := GridView.NewItemRow.Visible;
|
|
end;
|
|
|
|
function TcxGridTableOptionsView.GetNewItemRowInfoText: string;
|
|
begin
|
|
Result := GridView.NewItemRow.InfoText;
|
|
end;
|
|
|
|
function TcxGridTableOptionsView.GetNewItemRowSeparatorColor: TColor;
|
|
begin
|
|
Result := GridView.NewItemRow.SeparatorColor;
|
|
end;
|
|
|
|
function TcxGridTableOptionsView.GetNewItemRowSeparatorWidth: Integer;
|
|
begin
|
|
Result := GridView.NewItemRow.SeparatorWidth;
|
|
end;
|
|
|
|
function TcxGridTableOptionsView.GetShowColumnFilterButtons: TcxGridShowItemFilterButtons;
|
|
begin
|
|
Result := ShowItemFilterButtons;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsView.SetColumnAutoWidth(Value: Boolean);
|
|
begin
|
|
if FColumnAutoWidth <> Value then
|
|
begin
|
|
FColumnAutoWidth := Value;
|
|
Changed(vcSize);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsView.SetDataRowHeight(Value: Integer);
|
|
begin
|
|
CheckDataRowHeight(Value);
|
|
if FDataRowHeight <> Value then
|
|
begin
|
|
FDataRowHeight := Value;
|
|
Changed(vcSize);
|
|
GridView.Controller.DesignerModified;
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsView.SetExpandButtonsForEmptyDetails(Value: Boolean);
|
|
begin
|
|
if FExpandButtonsForEmptyDetails <> Value then
|
|
begin
|
|
FExpandButtonsForEmptyDetails := Value;
|
|
Changed(vcLayout);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsView.SetFooter(Value: Boolean);
|
|
begin
|
|
if FFooter <> Value then
|
|
begin
|
|
FFooter := Value;
|
|
Changed(vcSize);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsView.SetFooterAutoHeight(Value: Boolean);
|
|
begin
|
|
if FFooterAutoHeight <> Value then
|
|
begin
|
|
FFooterAutoHeight := Value;
|
|
Changed(vcSize);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsView.SetFooterMultiSummaries(Value: Boolean);
|
|
begin
|
|
if FFooterMultiSummaries <> Value then
|
|
begin
|
|
FFooterMultiSummaries := Value;
|
|
Changed(vcSize);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsView.SetGridLineColor(Value: TColor);
|
|
begin
|
|
if FGridLineColor <> Value then
|
|
begin
|
|
FGridLineColor := Value;
|
|
Changed(vcLayout);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsView.SetGridLines(Value: TcxGridLines);
|
|
begin
|
|
if FGridLines <> Value then
|
|
begin
|
|
FGridLines := Value;
|
|
Changed(vcSize);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsView.SetGroupByBox(Value: Boolean);
|
|
begin
|
|
if FGroupByBox <> Value then
|
|
begin
|
|
FGroupByBox := Value;
|
|
Changed(vcSize);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsView.SetGroupFooterMultiSummaries(Value: Boolean);
|
|
begin
|
|
if FGroupFooterMultiSummaries <> Value then
|
|
begin
|
|
FGroupFooterMultiSummaries := Value;
|
|
Changed(vcSize);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsView.SetGroupFooters(Value: TcxGridGroupFootersMode);
|
|
begin
|
|
if FGroupFooters <> Value then
|
|
begin
|
|
FPrevGroupFooters := FGroupFooters;
|
|
FGroupFooters := Value;
|
|
Changed(vcSize);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsView.SetGroupRowHeight(Value: Integer);
|
|
begin
|
|
CheckGroupRowHeight(Value);
|
|
if FGroupRowHeight <> Value then
|
|
begin
|
|
FGroupRowHeight := Value;
|
|
Changed(vcSize);
|
|
GridView.Controller.DesignerModified;
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsView.SetGroupRowStyle(Value: TcxGridGroupRowStyle);
|
|
begin
|
|
if FGroupRowStyle <> Value then
|
|
begin
|
|
FGroupRowStyle := Value;
|
|
Changed(vcSize);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsView.SetGroupSummaryLayout(Value: TcxGridGroupSummaryLayout);
|
|
begin
|
|
if FGroupSummaryLayout <> Value then
|
|
begin
|
|
FGroupSummaryLayout := Value;
|
|
Changed(vcSize);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsView.SetHeader(Value: Boolean);
|
|
begin
|
|
if FHeader <> Value then
|
|
begin
|
|
FHeader := Value;
|
|
Changed(vcSize);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsView.SetHeaderAutoHeight(Value: Boolean);
|
|
begin
|
|
ItemCaptionAutoHeight := Value;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsView.SetHeaderEndEllipsis(Value: Boolean);
|
|
begin
|
|
ItemCaptionEndEllipsis := Value;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsView.SetHeaderHeight(Value: Integer);
|
|
begin
|
|
if Value < 0 then Value := 0;
|
|
if FHeaderHeight <> Value then
|
|
begin
|
|
FHeaderHeight := Value;
|
|
Changed(vcSize);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsView.SetIndicator(Value: Boolean);
|
|
begin
|
|
if FIndicator <> Value then
|
|
begin
|
|
FIndicator := Value;
|
|
Changed(vcSize);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsView.SetIndicatorWidth(Value: Integer);
|
|
begin
|
|
if Value < 0 then Value := 0;
|
|
if FIndicatorWidth <> Value then
|
|
begin
|
|
FIndicatorWidth := Value;
|
|
Changed(vcSize);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsView.SetNewItemRow(Value: Boolean);
|
|
begin
|
|
GridView.NewItemRow.Visible := Value;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsView.SetNewItemRowInfoText(const Value: string);
|
|
begin
|
|
GridView.NewItemRow.InfoText := Value;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsView.SetNewItemRowSeparatorColor(Value: TColor);
|
|
begin
|
|
GridView.NewItemRow.SeparatorColor := Value;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsView.SetNewItemRowSeparatorWidth(Value: Integer);
|
|
begin
|
|
GridView.NewItemRow.SeparatorWidth := Value;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsView.SetRowSeparatorColor(Value: TColor);
|
|
begin
|
|
if FRowSeparatorColor <> Value then
|
|
begin
|
|
FRowSeparatorColor := Value;
|
|
Changed(vcLayout);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsView.SetRowSeparatorWidth(Value: Integer);
|
|
begin
|
|
if Value < 0 then Value := 0;
|
|
if FRowSeparatorWidth <> Value then
|
|
begin
|
|
FRowSeparatorWidth := Value;
|
|
Changed(vcSize);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsView.SetShowColumnFilterButtons(Value: TcxGridShowItemFilterButtons);
|
|
begin
|
|
ShowItemFilterButtons := Value;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsView.ReadNewItemRow(Reader: TReader);
|
|
begin
|
|
NewItemRow := Reader.ReadBoolean;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsView.ReadNewItemRowInfoText(Reader: TReader);
|
|
begin
|
|
NewItemRowInfoText := Reader.ReadString;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsView.ReadNewItemRowSeparatorColor(Reader: TReader);
|
|
begin
|
|
if Reader.NextValue = vaIdent then
|
|
NewItemRowSeparatorColor := StringToColor(Reader.ReadIdent)
|
|
else
|
|
NewItemRowSeparatorColor := Reader.ReadInteger;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsView.ReadNewItemRowSeparatorWidth(Reader: TReader);
|
|
begin
|
|
NewItemRowSeparatorWidth := Reader.ReadInteger;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsView.DefineProperties(Filer: TFiler);
|
|
begin
|
|
inherited;
|
|
Filer.DefineProperty('NewItemRow', ReadNewItemRow, nil, True);
|
|
Filer.DefineProperty('NewItemRowInfoText', ReadNewItemRowInfoText, nil, True);
|
|
Filer.DefineProperty('NewItemRowSeparatorColor', ReadNewItemRowSeparatorColor, nil, True);
|
|
Filer.DefineProperty('NewItemRowSeparatorWidth', ReadNewItemRowSeparatorWidth, nil, True);
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsView.ItemCaptionAutoHeightChanged;
|
|
begin
|
|
Changed(vcLayout);
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsView.Assign(Source: TPersistent);
|
|
begin
|
|
if Source is TcxGridTableOptionsView then
|
|
with TcxGridTableOptionsView(Source) do
|
|
begin
|
|
Self.ColumnAutoWidth := ColumnAutoWidth;
|
|
Self.DataRowHeight := DataRowHeight;
|
|
Self.ExpandButtonsForEmptyDetails := ExpandButtonsForEmptyDetails;
|
|
Self.Footer := Footer;
|
|
Self.FooterAutoHeight := FooterAutoHeight;
|
|
Self.FooterMultiSummaries := FooterMultiSummaries;
|
|
Self.GridLineColor := GridLineColor;
|
|
Self.GridLines := GridLines;
|
|
Self.GroupByBox := GroupByBox;
|
|
Self.GroupFooterMultiSummaries := GroupFooterMultiSummaries;
|
|
Self.GroupFooters := GroupFooters;
|
|
Self.GroupRowHeight := GroupRowHeight;
|
|
Self.GroupRowStyle := GroupRowStyle;
|
|
Self.GroupSummaryLayout := GroupSummaryLayout;
|
|
Self.Header := Header;
|
|
Self.HeaderHeight := HeaderHeight;
|
|
Self.Indicator := Indicator;
|
|
Self.IndicatorWidth := IndicatorWidth;
|
|
Self.FPrevGroupFooters := FPrevGroupFooters;
|
|
Self.RowSeparatorColor := RowSeparatorColor;
|
|
Self.RowSeparatorWidth := RowSeparatorWidth;
|
|
end;
|
|
inherited;
|
|
end;
|
|
|
|
function TcxGridTableOptionsView.CanShowFooterMultiSummaries: Boolean;
|
|
begin
|
|
Result := GridView.ViewInfo.SupportsMultipleFooterSummaries and FooterMultiSummaries;
|
|
end;
|
|
|
|
function TcxGridTableOptionsView.CanShowGroupFooterMultiSummaries: Boolean;
|
|
begin
|
|
Result := GridView.ViewInfo.SupportsMultipleFooterSummaries and GroupFooterMultiSummaries;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsView.CheckDataRowHeight(var AValue: Integer);
|
|
var
|
|
AMinValue: Integer;
|
|
begin
|
|
if AValue < 0 then AValue := 0;
|
|
if AValue > 0 then
|
|
begin
|
|
AMinValue := GridView.ViewInfo.RecordsViewInfo.CalculateRowDefaultHeight;
|
|
if AValue < AMinValue then AValue := AMinValue;
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableOptionsView.CheckGroupRowHeight(var AValue: Integer);
|
|
var
|
|
AMinValue: Integer;
|
|
begin
|
|
if AValue < 0 then AValue := 0;
|
|
if AValue > 0 then
|
|
begin
|
|
AMinValue :=
|
|
GridView.ViewInfo.RecordsViewInfo.CalculateGroupRowDefaultHeight(True);
|
|
if AValue < AMinValue then AValue := AMinValue;
|
|
end;
|
|
end;
|
|
|
|
function TcxGridTableOptionsView.GetGridLineColor: TColor;
|
|
begin
|
|
Result := FGridLineColor;
|
|
if Result = clDefault then
|
|
Result := LookAndFeelPainter.DefaultGridLineColor;
|
|
end;
|
|
|
|
function TcxGridTableOptionsView.GetGroupSummaryLayout: TcxGridGroupSummaryLayout;
|
|
begin
|
|
if GridView.ViewInfo.SupportsGroupSummariesAlignedWithColumns then
|
|
Result := FGroupSummaryLayout
|
|
else
|
|
Result := gslStandard;
|
|
end;
|
|
|
|
function TcxGridTableOptionsView.GetRowSeparatorColor: TColor;
|
|
begin
|
|
Result := FRowSeparatorColor;
|
|
if Result = clDefault then
|
|
Result := LookAndFeelPainter.DefaultRecordSeparatorColor;
|
|
end;
|
|
|
|
{ TcxGridPreview }
|
|
|
|
constructor TcxGridPreview.Create(AGridView: TcxCustomGridView);
|
|
begin
|
|
inherited;
|
|
FAutoHeight := True;
|
|
FLeftIndent := cxGridPreviewDefaultLeftIndent;
|
|
FMaxLineCount := cxGridPreviewDefaultMaxLineCount;
|
|
FRightIndent := cxGridPreviewDefaultRightIndent;
|
|
end;
|
|
|
|
function TcxGridPreview.GetActive: Boolean;
|
|
begin
|
|
Result := FVisible and (FColumn <> nil);
|
|
end;
|
|
|
|
function TcxGridPreview.GetGridView: TcxGridTableView;
|
|
begin
|
|
Result := TcxGridTableView(inherited GridView);
|
|
end;
|
|
|
|
procedure TcxGridPreview.SetAutoHeight(Value: Boolean);
|
|
begin
|
|
if FAutoHeight <> Value then
|
|
begin
|
|
FAutoHeight := Value;
|
|
PropertyChanged;
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridPreview.SetColumn(Value: TcxGridColumn);
|
|
|
|
procedure ColumnVisibilityChanged(AColumn: TcxGridColumn);
|
|
begin
|
|
AColumn.VisibleChanged;
|
|
GridView.ItemVisibilityChanged(AColumn, AColumn.ActuallyVisible);
|
|
AColumn.VisibleForCustomizationChanged;
|
|
end;
|
|
|
|
var
|
|
APrevColumn: TcxGridColumn;
|
|
begin
|
|
if (Value <> nil) and (Value.GridView <> GridView) then Value := nil;
|
|
if FColumn <> Value then
|
|
begin
|
|
APrevColumn := FColumn;
|
|
FColumn := Value;
|
|
GridView.BeginUpdate;
|
|
try
|
|
if APrevColumn <> nil then
|
|
ColumnVisibilityChanged(APrevColumn);
|
|
if FColumn <> nil then
|
|
ColumnVisibilityChanged(FColumn);
|
|
finally
|
|
GridView.EndUpdate;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridPreview.SetLeftIndent(Value: Integer);
|
|
begin
|
|
if Value < 0 then Value := 0;
|
|
if FLeftIndent <> Value then
|
|
begin
|
|
FLeftIndent := Value;
|
|
PropertyChanged;
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridPreview.SetMaxLineCount(Value: Integer);
|
|
begin
|
|
if Value < 0 then Value := 0;
|
|
if FMaxLineCount <> Value then
|
|
begin
|
|
FMaxLineCount := Value;
|
|
PropertyChanged;
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridPreview.SetPlace(Value: TcxGridPreviewPlace);
|
|
begin
|
|
if FPlace <> Value then
|
|
begin
|
|
FPlace := Value;
|
|
PropertyChanged;
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridPreview.SetRightIndent(Value: Integer);
|
|
begin
|
|
if Value < 0 then Value := 0;
|
|
if FRightIndent <> Value then
|
|
begin
|
|
FRightIndent := Value;
|
|
PropertyChanged;
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridPreview.SetVisible(Value: Boolean);
|
|
begin
|
|
if FVisible <> Value then
|
|
begin
|
|
FVisible := Value;
|
|
Changed(vcSize);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridPreview.Notification(AComponent: TComponent;
|
|
AOperation: TOperation);
|
|
begin
|
|
inherited;
|
|
if (AOperation = opRemove) and (AComponent = Column) then
|
|
Column := nil;
|
|
end;
|
|
|
|
procedure TcxGridPreview.PropertyChanged;
|
|
begin
|
|
if FVisible then
|
|
Changed(vcSize)
|
|
else
|
|
Changed(vcProperty);
|
|
end;
|
|
|
|
procedure TcxGridPreview.Assign(Source: TPersistent);
|
|
begin
|
|
if Source is TcxGridPreview then
|
|
with TcxGridPreview(Source) do
|
|
begin
|
|
Self.AutoHeight := AutoHeight;
|
|
if not Self.GridView.AssigningSettings then
|
|
if Column <> nil then
|
|
Self.Column := TcxGridColumn(Self.GridView.FindItemByID(Column.ID))
|
|
else
|
|
Self.Column := Column;
|
|
Self.LeftIndent := LeftIndent;
|
|
Self.MaxLineCount := MaxLineCount;
|
|
Self.Place := Place;
|
|
Self.RightIndent := RightIndent;
|
|
Self.Visible := Visible;
|
|
end;
|
|
inherited;
|
|
end;
|
|
|
|
{ TcxGridTableViewStyles }
|
|
|
|
function TcxGridTableViewStyles.GetGridViewValue: TcxGridTableView;
|
|
begin
|
|
Result := TcxGridTableView(inherited GridView);
|
|
end;
|
|
|
|
procedure TcxGridTableViewStyles.SetOnGetFooterStyle(Value: TcxGridGetCellStyleEvent);
|
|
begin
|
|
if @FOnGetFooterStyle <> @Value then
|
|
begin
|
|
FOnGetFooterStyle := Value;
|
|
GridView.Changed(vcProperty);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableViewStyles.SetOnGetFooterStyleEx(Value: TcxGridGetFooterStyleExEvent);
|
|
begin
|
|
if @FOnGetFooterStyleEx <> @Value then
|
|
begin
|
|
FOnGetFooterStyleEx := Value;
|
|
GridView.Changed(vcProperty);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableViewStyles.SetOnGetFooterSummaryStyle(Value: TcxGridGetFooterSummaryStyleEvent);
|
|
begin
|
|
if @FOnGetFooterSummaryStyle <> @Value then
|
|
begin
|
|
FOnGetFooterSummaryStyle := Value;
|
|
GridView.Changed(vcProperty);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableViewStyles.SetOnGetGroupStyle(Value: TcxGridGetGroupStyleEvent);
|
|
begin
|
|
if @FOnGetGroupStyle <> @Value then
|
|
begin
|
|
FOnGetGroupStyle := Value;
|
|
GridView.Changed(vcProperty);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableViewStyles.SetOnGetGroupSummaryStyle(Value: TcxGridGetGroupSummaryStyleEvent);
|
|
begin
|
|
if @FOnGetGroupSummaryStyle <> @Value then
|
|
begin
|
|
FOnGetGroupSummaryStyle := Value;
|
|
GridView.Changed(vcProperty);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableViewStyles.SetOnGetHeaderStyle(Value: TcxGridGetHeaderStyleEvent);
|
|
begin
|
|
if @FOnGetHeaderStyle <> @Value then
|
|
begin
|
|
FOnGetHeaderStyle := Value;
|
|
GridView.Changed(vcProperty);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableViewStyles.SetOnGetPreviewStyle(Value: TcxGridGetCellStyleEvent);
|
|
begin
|
|
if @FOnGetPreviewStyle <> @Value then
|
|
begin
|
|
FOnGetPreviewStyle := Value;
|
|
GridView.Changed(vcProperty);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableViewStyles.GetDefaultViewParams(Index: Integer; AData: TObject;
|
|
out AParams: TcxViewParams);
|
|
|
|
procedure GetGroupDefaultViewParams;
|
|
begin
|
|
with AParams, LookAndFeelPainter do
|
|
begin
|
|
inherited GetContentParams(TcxCustomGridRecord(AData), nil, AParams);
|
|
if GridView.OptionsView.GroupRowStyle = grsStandard then
|
|
begin
|
|
Color := DefaultGroupColor;
|
|
TextColor := DefaultGroupTextColor;
|
|
end
|
|
else
|
|
if AData = nil then
|
|
Color := dxOffice11GroupIndentColor
|
|
else
|
|
begin
|
|
Color := clWindow;
|
|
TextColor := dxOffice11GroupRowTextColor;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
inherited;
|
|
with AParams, LookAndFeelPainter do
|
|
case Index of
|
|
vsFooter:
|
|
begin
|
|
Color := DefaultFooterColor;
|
|
TextColor := DefaultFooterTextColor;
|
|
end;
|
|
vsGroup:
|
|
GetGroupDefaultViewParams;
|
|
vsGroupByBox:
|
|
begin
|
|
Color := DefaultGroupByBoxColor;
|
|
TextColor := DefaultGroupByBoxTextColor;
|
|
end;
|
|
vsGroupFooterSortedSummary:
|
|
if AData <> nil then
|
|
TcxGridRowFooterCellPos(AData).Column.Styles.GetFooterParams(
|
|
TcxGridRowFooterCellPos(AData).Row,
|
|
TcxGridRowFooterCellPos(AData).FooterGroupLevel,
|
|
TcxGridRowFooterCellPos(AData).SummaryItem, AParams)
|
|
else
|
|
GetFooterParams(nil, nil, -1, nil, AParams);
|
|
vsGroupSortedSummary:
|
|
if AData <> nil then
|
|
GetGroupSummaryCellContentParams(TcxGridGroupSummaryInfo(AData).Row,
|
|
TcxGridGroupSummaryInfo(AData).SummaryItem, AParams)
|
|
else
|
|
GetGroupSummaryCellContentParams(nil, nil, AParams);
|
|
vsGroupSummary:
|
|
GetRecordContentParams(TcxCustomGridRecord(AData), nil, AParams);
|
|
vsHeader, vsIndicator:
|
|
begin
|
|
Color := DefaultHeaderColor;
|
|
TextColor := DefaultHeaderTextColor;
|
|
end;
|
|
vsFilterRowInfoText, vsNewItemRowInfoText:
|
|
begin
|
|
GetContentParams(TcxCustomGridRecord(AData), nil, AParams);
|
|
TextColor := clGrayText;
|
|
end;
|
|
vsPreview:
|
|
begin
|
|
inherited GetContentParams(TcxCustomGridRecord(AData), GridView.Preview.Column, AParams);
|
|
TextColor := DefaultPreviewTextColor;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableViewStyles.Assign(Source: TPersistent);
|
|
begin
|
|
inherited;
|
|
if Source is TcxGridTableViewStyles then
|
|
with TcxGridTableViewStyles(Source) do
|
|
begin
|
|
Self.FilterRowInfoText := FilterRowInfoText;
|
|
Self.Footer := Footer;
|
|
Self.Group := Group;
|
|
Self.GroupByBox := GroupByBox;
|
|
Self.GroupFooterSortedSummary := GroupFooterSortedSummary;
|
|
Self.GroupSortedSummary := GroupSortedSummary;
|
|
Self.GroupSummary := GroupSummary;
|
|
Self.Header := Header;
|
|
Self.Indicator := Indicator;
|
|
Self.NewItemRowInfoText := NewItemRowInfoText;
|
|
Self.Preview := Preview;
|
|
Self.OnGetFooterStyle := OnGetFooterStyle;
|
|
Self.OnGetFooterStyleEx := OnGetFooterStyleEx;
|
|
Self.OnGetFooterSummaryStyle := OnGetFooterSummaryStyle;
|
|
Self.OnGetGroupStyle := OnGetGroupStyle;
|
|
Self.OnGetGroupSummaryStyle := OnGetGroupSummaryStyle;
|
|
Self.OnGetHeaderStyle := OnGetHeaderStyle;
|
|
Self.OnGetPreviewStyle := OnGetPreviewStyle;
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableViewStyles.GetCellContentParams(ARecord: TcxCustomGridRecord;
|
|
AItem: TObject; out AParams: TcxViewParams);
|
|
begin
|
|
if (AItem is TcxDataSummaryItem) or (AItem is TcxDataSummaryItems) then
|
|
begin
|
|
if AItem is TcxDataSummaryItems then
|
|
AItem := nil;
|
|
GetGroupSummaryCellContentParams(ARecord as TcxGridGroupRow, TcxDataSummaryItem(AItem), AParams);
|
|
end
|
|
else
|
|
inherited;
|
|
end;
|
|
|
|
procedure TcxGridTableViewStyles.GetContentParams(ARecord: TcxCustomGridRecord;
|
|
AItem: TcxCustomGridTableItem; out AParams: TcxViewParams);
|
|
begin
|
|
if (AItem <> nil) and TcxGridColumn(AItem).IsPreview then
|
|
GetPreviewParams(ARecord, AItem, AParams)
|
|
else
|
|
inherited;
|
|
end;
|
|
|
|
procedure TcxGridTableViewStyles.GetFooterCellParams(ARow: TcxCustomGridRow;
|
|
AColumn: TcxGridColumn; AFooterGroupLevel: Integer; ASummaryItem: TcxDataSummaryItem;
|
|
out AParams: TcxViewParams);
|
|
var
|
|
AFooterCellPos: TcxGridRowFooterCellPos;
|
|
begin
|
|
if (AFooterGroupLevel <> -1) and (ASummaryItem <> nil) and ASummaryItem.Sorted then
|
|
begin
|
|
AFooterCellPos := TcxGridRowFooterCellPos.Create(ARow, AColumn, AFooterGroupLevel, ASummaryItem);
|
|
try
|
|
GetViewParams(vsGroupFooterSortedSummary, AFooterCellPos, nil, AParams);
|
|
finally
|
|
AFooterCellPos.Free;
|
|
end;
|
|
end
|
|
else
|
|
AColumn.Styles.GetFooterParams(ARow, AFooterGroupLevel, ASummaryItem, AParams);
|
|
end;
|
|
|
|
procedure TcxGridTableViewStyles.GetFooterParams(ARow: TcxCustomGridRow;
|
|
AColumn: TcxGridColumn; AFooterGroupLevel: Integer; ASummaryItem: TcxDataSummaryItem;
|
|
out AParams: TcxViewParams);
|
|
var
|
|
AStyle: TcxStyle;
|
|
begin
|
|
AStyle := nil;
|
|
if Assigned(FOnGetFooterStyle) then
|
|
FOnGetFooterStyle(GridView, ARow, AColumn, AStyle);
|
|
if Assigned(FOnGetFooterStyleEx) then
|
|
FOnGetFooterStyleEx(GridView, ARow, AColumn, AFooterGroupLevel, AStyle);
|
|
if Assigned(FOnGetFooterSummaryStyle) and (ASummaryItem <> nil) then
|
|
FOnGetFooterSummaryStyle(GridView, ARow, AColumn, AFooterGroupLevel, ASummaryItem, AStyle);
|
|
GetViewParams(vsFooter, nil, AStyle, AParams);
|
|
end;
|
|
|
|
procedure TcxGridTableViewStyles.GetGroupParams(ARecord: TcxCustomGridRecord;
|
|
ALevel: Integer; out AParams: TcxViewParams);
|
|
var
|
|
AStyle: TcxStyle;
|
|
begin
|
|
AStyle := nil;
|
|
if Assigned(FOnGetGroupStyle) then
|
|
begin
|
|
if ARecord <> nil then ALevel := ARecord.Level;
|
|
FOnGetGroupStyle(GridView, ARecord, ALevel, AStyle);
|
|
end;
|
|
GetViewParams(vsGroup, ARecord, AStyle, AParams);
|
|
end;
|
|
|
|
procedure TcxGridTableViewStyles.GetGroupSummaryCellContentParams(ARow: TcxGridGroupRow;
|
|
ASummaryItem: TcxDataSummaryItem; out AParams: TcxViewParams);
|
|
var
|
|
ASummaryInfo: TcxGridGroupSummaryInfo;
|
|
begin
|
|
if not FProcessingGroupSortedSummary and
|
|
(ASummaryItem <> nil) and (ASummaryItem = ARow.GroupSummaryItems.SortedSummaryItem) then
|
|
begin
|
|
FProcessingGroupSortedSummary := True;
|
|
ASummaryInfo := TcxGridGroupSummaryInfo.Create(ARow, ASummaryItem);
|
|
try
|
|
GetViewParams(vsGroupSortedSummary, ASummaryInfo, nil, AParams);
|
|
finally
|
|
ASummaryInfo.Free;
|
|
FProcessingGroupSortedSummary := False;
|
|
end;
|
|
end
|
|
else
|
|
if (ASummaryItem = nil) or (ASummaryItem.ItemLink = nil) then
|
|
GetGroupSummaryParams(ARow, ASummaryItem, AParams)
|
|
else
|
|
TcxGridColumn(ASummaryItem.ItemLink).Styles.GetGroupSummaryParams(ARow, ASummaryItem, AParams);
|
|
end;
|
|
|
|
procedure TcxGridTableViewStyles.GetGroupSummaryCellParams(ARow: TcxGridGroupRow;
|
|
ASummaryItem: TcxDataSummaryItem; out AParams: TcxViewParams);
|
|
begin
|
|
if GridView.DrawDataCellSelected(ARow, nil) then
|
|
if ASummaryItem = nil then
|
|
GetSelectionParams(ARow, ARow.GroupSummaryItems, AParams)
|
|
else
|
|
GetSelectionParams(ARow, ASummaryItem, AParams)
|
|
else
|
|
GetGroupSummaryCellContentParams(ARow, ASummaryItem, AParams);
|
|
end;
|
|
|
|
procedure TcxGridTableViewStyles.GetGroupSummaryParams(ARow: TcxGridGroupRow;
|
|
ASummaryItem: TcxDataSummaryItem; out AParams: TcxViewParams);
|
|
var
|
|
AStyle: TcxStyle;
|
|
AColumn: TcxGridColumn;
|
|
begin
|
|
AStyle := nil;
|
|
if (ARow <> nil) and Assigned(FOnGetGroupSummaryStyle) then
|
|
begin
|
|
if ASummaryItem = nil then
|
|
AColumn := nil
|
|
else
|
|
AColumn := ASummaryItem.ItemLink as TcxGridColumn;
|
|
FOnGetGroupSummaryStyle(GridView, ARow, AColumn, ASummaryItem, AStyle);
|
|
end;
|
|
GetViewParams(vsGroupSummary, ARow, AStyle, AParams);
|
|
end;
|
|
|
|
procedure TcxGridTableViewStyles.GetHeaderParams(AItem: TcxGridColumn;
|
|
out AParams: TcxViewParams);
|
|
var
|
|
AStyle: TcxStyle;
|
|
begin
|
|
AStyle := nil;
|
|
if Assigned(FOnGetHeaderStyle) then
|
|
FOnGetHeaderStyle(GridView, AItem, AStyle);
|
|
GetViewParams(vsHeader, nil, AStyle, AParams);
|
|
end;
|
|
|
|
procedure TcxGridTableViewStyles.GetPreviewParams(ARecord: TcxCustomGridRecord;
|
|
AItem: TcxCustomGridTableItem; out AParams: TcxViewParams);
|
|
var
|
|
AStyle: TcxStyle;
|
|
begin
|
|
AStyle := nil;
|
|
if Assigned(FOnGetPreviewStyle) then
|
|
FOnGetPreviewStyle(GridView, ARecord, AItem, AStyle);
|
|
GetViewParams(vsPreview, ARecord, AStyle, AParams);
|
|
end;
|
|
|
|
procedure TcxGridTableViewStyles.GetRecordContentParams(ARecord: TcxCustomGridRecord;
|
|
AItem: TcxCustomGridTableItem; out AParams: TcxViewParams);
|
|
begin
|
|
if ARecord is TcxGridGroupRow then
|
|
GetGroupParams(ARecord, -1, AParams)
|
|
else
|
|
inherited;
|
|
end;
|
|
|
|
{ TcxGridTableViewStyleSheet }
|
|
|
|
function TcxGridTableViewStyleSheet.GetStylesValue: TcxGridTableViewStyles;
|
|
begin
|
|
Result := TcxGridTableViewStyles(GetStyles);
|
|
end;
|
|
|
|
procedure TcxGridTableViewStyleSheet.SetStylesValue(Value: TcxGridTableViewStyles);
|
|
begin
|
|
SetStyles(Value);
|
|
end;
|
|
|
|
class function TcxGridTableViewStyleSheet.GetStylesClass: TcxCustomStylesClass;
|
|
begin
|
|
Result := TcxGridTableViewStyles;
|
|
end;
|
|
|
|
{ TcxGridTableSummaryGroupItemLink }
|
|
|
|
function TcxGridTableSummaryGroupItemLink.GetColumn: TcxGridColumn;
|
|
begin
|
|
Result := TcxGridColumn(ItemLink);
|
|
end;
|
|
|
|
procedure TcxGridTableSummaryGroupItemLink.SetColumn(Value: TcxGridColumn);
|
|
begin
|
|
ItemLink := Value;
|
|
end;
|
|
|
|
function TcxGridTableSummaryGroupItemLink.GetGridView: TcxGridTableView;
|
|
begin
|
|
Result := TcxGridTableView((DataController as IcxCustomGridDataController).GridView);
|
|
end;
|
|
|
|
function TcxGridTableSummaryGroupItemLink.QueryInterface(const IID: TGUID; out Obj): HResult;
|
|
const
|
|
E_NOINTERFACE = HResult($80004002);
|
|
begin
|
|
if GetInterface(IID, Obj) then
|
|
Result := 0
|
|
else
|
|
Result := E_NOINTERFACE;
|
|
end;
|
|
|
|
function TcxGridTableSummaryGroupItemLink._AddRef: Integer;
|
|
begin
|
|
Result := -1;
|
|
end;
|
|
|
|
function TcxGridTableSummaryGroupItemLink._Release: Integer;
|
|
begin
|
|
Result := -1;
|
|
end;
|
|
|
|
function TcxGridTableSummaryGroupItemLink.GetObjectName: string;
|
|
begin
|
|
Result := '';
|
|
end;
|
|
|
|
function TcxGridTableSummaryGroupItemLink.GetProperties(AProperties: TStrings): Boolean;
|
|
begin
|
|
AProperties.Add('Column');
|
|
Result := True;
|
|
end;
|
|
|
|
procedure TcxGridTableSummaryGroupItemLink.GetPropertyValue(const AName: string;
|
|
var AValue: Variant);
|
|
begin
|
|
if AName = 'Column' then
|
|
if Column <> nil then
|
|
AValue := Column.GetObjectName
|
|
else
|
|
AValue := '';
|
|
end;
|
|
|
|
procedure TcxGridTableSummaryGroupItemLink.SetPropertyValue(const AName: string;
|
|
const AValue: Variant);
|
|
begin
|
|
if AName = 'Column' then
|
|
Column := TcxGridColumn(GridView.FindItemByObjectName(AValue));
|
|
end;
|
|
|
|
{ TcxGridTableSummaryItem }
|
|
|
|
constructor TcxGridTableSummaryItem.Create(Collection: TCollection);
|
|
begin
|
|
inherited;
|
|
FVisibleForCustomization := True;
|
|
end;
|
|
|
|
function TcxGridTableSummaryItem.GetColumn: TcxGridColumn;
|
|
begin
|
|
Result := TcxGridColumn(ItemLink);
|
|
end;
|
|
|
|
function TcxGridTableSummaryItem.GetGridView: TcxGridTableView;
|
|
begin
|
|
Result := TcxGridTableView((DataController as IcxCustomGridDataController).GridView);
|
|
end;
|
|
|
|
procedure TcxGridTableSummaryItem.SetColumn(Value: TcxGridColumn);
|
|
begin
|
|
ItemLink := Value;
|
|
end;
|
|
|
|
procedure TcxGridTableSummaryItem.SetDisplayText(const Value: string);
|
|
begin
|
|
if FDisplayText <> Value then
|
|
begin
|
|
FDisplayText := Value;
|
|
GridView.Changed(vcProperty);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableSummaryItem.SetVisibleForCustomization(Value: Boolean);
|
|
begin
|
|
if FVisibleForCustomization <> Value then
|
|
begin
|
|
FVisibleForCustomization := Value;
|
|
GridView.Changed(vcProperty);
|
|
end;
|
|
end;
|
|
|
|
function TcxGridTableSummaryItem.QueryInterface(const IID: TGUID; out Obj): HResult;
|
|
const
|
|
E_NOINTERFACE = HResult($80004002);
|
|
begin
|
|
if GetInterface(IID, Obj) then
|
|
Result := 0
|
|
else
|
|
Result := E_NOINTERFACE;
|
|
end;
|
|
|
|
function TcxGridTableSummaryItem._AddRef: Integer;
|
|
begin
|
|
Result := -1;
|
|
end;
|
|
|
|
function TcxGridTableSummaryItem._Release: Integer;
|
|
begin
|
|
Result := -1;
|
|
end;
|
|
|
|
function TcxGridTableSummaryItem.GetObjectName: string;
|
|
begin
|
|
Result := '';
|
|
end;
|
|
|
|
function TcxGridTableSummaryItem.GetProperties(AProperties: TStrings): Boolean;
|
|
begin
|
|
AProperties.Add('Column');
|
|
Result := False;
|
|
end;
|
|
|
|
procedure TcxGridTableSummaryItem.GetPropertyValue(const AName: string; var AValue: Variant);
|
|
begin
|
|
if AName = 'Column' then
|
|
if Column <> nil then
|
|
AValue := Column.GetObjectName
|
|
else
|
|
AValue := '';
|
|
end;
|
|
|
|
procedure TcxGridTableSummaryItem.SetPropertyValue(const AName: string; const AValue: Variant);
|
|
begin
|
|
if AName = 'Column' then
|
|
Column := TcxGridColumn(GridView.FindItemByObjectName(AValue));
|
|
end;
|
|
|
|
function TcxGridTableSummaryItem.GetDisplayText: string;
|
|
begin
|
|
Result := DisplayText;
|
|
end;
|
|
|
|
function TcxGridTableSummaryItem.GetVisibleForCustomization: Boolean;
|
|
begin
|
|
Result := VisibleForCustomization;
|
|
end;
|
|
|
|
procedure TcxGridTableSummaryItem.Assign(Source: TPersistent);
|
|
begin
|
|
inherited;
|
|
if Source is TcxGridTableSummaryItem then
|
|
with TcxGridTableSummaryItem(Source) do
|
|
begin
|
|
Self.DisplayText := DisplayText;
|
|
Self.VisibleForCustomization := VisibleForCustomization;
|
|
end;
|
|
end;
|
|
|
|
{ TcxGridTableView }
|
|
|
|
function TcxGridTableView.GetBackgroundBitmaps: TcxGridTableBackgroundBitmaps;
|
|
begin
|
|
Result := TcxGridTableBackgroundBitmaps(inherited BackgroundBitmaps);
|
|
end;
|
|
|
|
function TcxGridTableView.GetColumn(Index: Integer): TcxGridColumn;
|
|
begin
|
|
Result := TcxGridColumn(Items[Index]);
|
|
end;
|
|
|
|
function TcxGridTableView.GetColumnCount: Integer;
|
|
begin
|
|
Result := ItemCount;
|
|
end;
|
|
|
|
function TcxGridTableView.GetController: TcxGridTableController;
|
|
begin
|
|
Result := TcxGridTableController(inherited Controller);
|
|
end;
|
|
|
|
function TcxGridTableView.GetDataController: TcxGridDataController;
|
|
begin
|
|
Result := TcxGridDataController(FDataController);
|
|
end;
|
|
|
|
function TcxGridTableView.GetDateTimeHandling: TcxGridTableDateTimeHandling;
|
|
begin
|
|
Result := TcxGridTableDateTimeHandling(inherited DateTimeHandling);
|
|
end;
|
|
|
|
function TcxGridTableView.GetFiltering: TcxGridTableFiltering;
|
|
begin
|
|
Result := TcxGridTableFiltering(inherited Filtering);
|
|
end;
|
|
|
|
function TcxGridTableView.GetGroupedColumn(Index: Integer): TcxGridColumn;
|
|
begin
|
|
Result := TcxGridColumn(GroupedItems[Index]);
|
|
end;
|
|
|
|
function TcxGridTableView.GetGroupedColumnCount: Integer;
|
|
begin
|
|
Result := GroupedItemCount;
|
|
end;
|
|
|
|
function TcxGridTableView.GetOptionsBehavior: TcxGridTableOptionsBehavior;
|
|
begin
|
|
Result := TcxGridTableOptionsBehavior(inherited OptionsBehavior);
|
|
end;
|
|
|
|
function TcxGridTableView.GetOptionsCustomize: TcxGridTableOptionsCustomize;
|
|
begin
|
|
Result := TcxGridTableOptionsCustomize(inherited OptionsCustomize);
|
|
end;
|
|
|
|
function TcxGridTableView.GetOptionsData: TcxGridTableOptionsData;
|
|
begin
|
|
Result := TcxGridTableOptionsData(inherited OptionsData);
|
|
end;
|
|
|
|
function TcxGridTableView.GetOptionsSelection: TcxGridTableOptionsSelection;
|
|
begin
|
|
Result := TcxGridTableOptionsSelection(inherited OptionsSelection);
|
|
end;
|
|
|
|
function TcxGridTableView.GetOptionsView: TcxGridTableOptionsView;
|
|
begin
|
|
Result := TcxGridTableOptionsView(inherited OptionsView);
|
|
end;
|
|
|
|
function TcxGridTableView.GetPainter: TcxGridTablePainter;
|
|
begin
|
|
Result := TcxGridTablePainter(inherited Painter);
|
|
end;
|
|
|
|
function TcxGridTableView.GetStyles: TcxGridTableViewStyles;
|
|
begin
|
|
Result := TcxGridTableViewStyles(inherited Styles);
|
|
end;
|
|
|
|
function TcxGridTableView.GetViewData: TcxGridViewData;
|
|
begin
|
|
Result := TcxGridViewData(inherited ViewData);
|
|
end;
|
|
|
|
function TcxGridTableView.GetViewInfo: TcxGridTableViewInfo;
|
|
begin
|
|
Result := TcxGridTableViewInfo(inherited ViewInfo);
|
|
end;
|
|
|
|
function TcxGridTableView.GetVisibleColumn(Index: Integer): TcxGridColumn;
|
|
begin
|
|
Result := TcxGridColumn(VisibleItems[Index]);
|
|
end;
|
|
|
|
function TcxGridTableView.GetVisibleColumnCount: Integer;
|
|
begin
|
|
Result := VisibleItemCount;
|
|
end;
|
|
|
|
procedure TcxGridTableView.SetBackgroundBitmaps(Value: TcxGridTableBackgroundBitmaps);
|
|
begin
|
|
inherited BackgroundBitmaps := Value;
|
|
end;
|
|
|
|
procedure TcxGridTableView.SetColumn(Index: Integer; Value: TcxGridColumn);
|
|
begin
|
|
Items[Index] := Value;
|
|
end;
|
|
|
|
procedure TcxGridTableView.SetDataController(Value: TcxGridDataController);
|
|
begin
|
|
FDataController.Assign(Value);
|
|
end;
|
|
|
|
procedure TcxGridTableView.SetDateTimeHandling(Value: TcxGridTableDateTimeHandling);
|
|
begin
|
|
inherited DateTimeHandling := Value;
|
|
end;
|
|
|
|
procedure TcxGridTableView.SetFiltering(Value: TcxGridTableFiltering);
|
|
begin
|
|
inherited Filtering := Value;
|
|
end;
|
|
|
|
procedure TcxGridTableView.SetFilterRow(Value: TcxGridFilterRowOptions);
|
|
begin
|
|
FFilterRow.Assign(Value);
|
|
end;
|
|
|
|
procedure TcxGridTableView.SetNewItemRow(Value: TcxGridNewItemRowOptions);
|
|
begin
|
|
FNewItemRow.Assign(Value);
|
|
end;
|
|
|
|
procedure TcxGridTableView.SetOnColumnHeaderClick(Value: TcxGridColumnEvent);
|
|
begin
|
|
if @FOnColumnHeaderClick <> @Value then
|
|
begin
|
|
FOnColumnHeaderClick := Value;
|
|
Changed(vcProperty);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableView.SetOnColumnPosChanged(Value: TcxGridColumnEvent);
|
|
begin
|
|
if @FOnColumnPosChanged <> @Value then
|
|
begin
|
|
FOnColumnPosChanged := Value;
|
|
Changed(vcProperty);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableView.SetOnColumnSizeChanged(Value: TcxGridColumnEvent);
|
|
begin
|
|
if @FOnColumnSizeChanged <> @Value then
|
|
begin
|
|
FOnColumnSizeChanged := Value;
|
|
Changed(vcProperty);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableView.SetOnCustomDrawColumnHeader(Value: TcxGridColumnCustomDrawHeaderEvent);
|
|
begin
|
|
if @FOnCustomDrawColumnHeader <> @Value then
|
|
begin
|
|
FOnCustomDrawColumnHeader := Value;
|
|
Changed(vcProperty);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableView.SetOnCustomDrawFooterCell(Value: TcxGridColumnCustomDrawHeaderEvent);
|
|
begin
|
|
if @FOnCustomDrawFooterCell <> @Value then
|
|
begin
|
|
FOnCustomDrawFooterCell := Value;
|
|
Changed(vcProperty);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableView.SetOnCustomDrawGroupCell(Value: TcxGridTableCellCustomDrawEvent);
|
|
begin
|
|
if @FOnCustomDrawGroupCell <> @Value then
|
|
begin
|
|
FOnCustomDrawGroupCell := Value;
|
|
Changed(vcProperty);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableView.SetOnCustomDrawGroupSummaryCell(Value: TcxGridGroupSummaryCellCustomDrawEvent);
|
|
begin
|
|
if @FOnCustomDrawGroupSummaryCell <> @Value then
|
|
begin
|
|
FOnCustomDrawGroupSummaryCell := Value;
|
|
Changed(vcProperty);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableView.SetOnCustomDrawIndicatorCell(Value: TcxGridIndicatorCellCustomDrawEvent);
|
|
begin
|
|
if @FOnCustomDrawIndicatorCell <> @Value then
|
|
begin
|
|
FOnCustomDrawIndicatorCell := Value;
|
|
Changed(vcProperty);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableView.SetOnLeftPosChanged(Value: TNotifyEvent);
|
|
begin
|
|
if @FOnLeftPosChanged <> @Value then
|
|
begin
|
|
FOnLeftPosChanged := Value;
|
|
Changed(vcProperty);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableView.SetOptionsBehavior(Value: TcxGridTableOptionsBehavior);
|
|
begin
|
|
inherited OptionsBehavior := Value;
|
|
end;
|
|
|
|
procedure TcxGridTableView.SetOptionsCustomize(Value: TcxGridTableOptionsCustomize);
|
|
begin
|
|
inherited OptionsCustomize := Value;
|
|
end;
|
|
|
|
procedure TcxGridTableView.SetOptionsData(Value: TcxGridTableOptionsData);
|
|
begin
|
|
inherited OptionsData := Value;
|
|
end;
|
|
|
|
procedure TcxGridTableView.SetOptionsSelection(Value: TcxGridTableOptionsSelection);
|
|
begin
|
|
inherited OptionsSelection := Value;
|
|
end;
|
|
|
|
procedure TcxGridTableView.SetOptionsView(Value: TcxGridTableOptionsView);
|
|
begin
|
|
inherited OptionsView := Value;
|
|
end;
|
|
|
|
procedure TcxGridTableView.SetPreview(Value: TcxGridPreview);
|
|
begin
|
|
FPreview.Assign(Value);
|
|
end;
|
|
|
|
procedure TcxGridTableView.SetStyles(Value: TcxGridTableViewStyles);
|
|
begin
|
|
inherited Styles := Value;
|
|
end;
|
|
|
|
function TcxGridTableView.GetProperties(AProperties: TStrings): Boolean;
|
|
begin
|
|
with AProperties do
|
|
begin
|
|
Add('Footer');
|
|
Add('GroupByBox');
|
|
Add('GroupFooters');
|
|
Add('NewItemRow');
|
|
end;
|
|
Result := inherited GetProperties(AProperties);
|
|
end;
|
|
|
|
procedure TcxGridTableView.GetPropertyValue(const AName: string; var AValue: Variant);
|
|
begin
|
|
if AName = 'Footer' then
|
|
AValue := OptionsView.Footer
|
|
else
|
|
if AName = 'GroupByBox' then
|
|
AValue := OptionsView.GroupByBox
|
|
else
|
|
if AName = 'GroupFooters' then
|
|
AValue := Variant(OptionsView.GroupFooters)
|
|
else
|
|
if AName = 'NewItemRow' then
|
|
AValue := NewItemRow.Visible
|
|
else
|
|
inherited;
|
|
end;
|
|
|
|
procedure TcxGridTableView.SetPropertyValue(const AName: string; const AValue: Variant);
|
|
begin
|
|
if AName = 'Footer' then
|
|
OptionsView.Footer := AValue
|
|
else
|
|
if AName = 'GroupByBox' then
|
|
OptionsView.GroupByBox := AValue
|
|
else
|
|
if AName = 'GroupFooters' then
|
|
if VarIsStr(AValue) then // version 4
|
|
if AValue then
|
|
OptionsView.GroupFooters := gfVisibleWhenExpanded
|
|
else
|
|
OptionsView.GroupFooters := gfInvisible
|
|
else // version > 4
|
|
OptionsView.GroupFooters := TcxGridGroupFootersMode((AValue))
|
|
else
|
|
if AName = 'NewItemRow' then
|
|
NewItemRow.Visible := AValue
|
|
else
|
|
inherited;
|
|
end;
|
|
|
|
procedure TcxGridTableView.AssignLayout(ALayoutView: TcxCustomGridView);
|
|
begin
|
|
inherited;
|
|
with (ALayoutView as TcxGridTableView).OptionsView do
|
|
begin
|
|
Self.OptionsView.DataRowHeight := DataRowHeight;
|
|
Self.OptionsView.Footer := Footer;
|
|
Self.OptionsView.GroupByBox := GroupByBox;
|
|
Self.OptionsView.GroupFooters := GroupFooters;
|
|
Self.OptionsView.GroupRowHeight := GroupRowHeight;
|
|
end;
|
|
end;
|
|
|
|
function TcxGridTableView.GetLayoutCustomizationFormButtonCaption: string;
|
|
begin
|
|
Result := 'Columns customization';
|
|
end;
|
|
|
|
procedure TcxGridTableView.CreateOptions;
|
|
begin
|
|
inherited;
|
|
FFilterRow := GetFilterRowOptionsClass.Create(Self);
|
|
FNewItemRow := GetNewItemRowOptionsClass.Create(Self);
|
|
FPreview := GetPreviewClass.Create(Self);
|
|
end;
|
|
|
|
procedure TcxGridTableView.DestroyOptions;
|
|
begin
|
|
FreeAndNil(FPreview);
|
|
FreeAndNil(FNewItemRow);
|
|
FreeAndNil(FFilterRow);
|
|
inherited;
|
|
end;
|
|
|
|
function TcxGridTableView.CanCellMerging: Boolean;
|
|
begin
|
|
Result := not FPreview.Active and (OptionsView.RowSeparatorWidth = 0);
|
|
end;
|
|
|
|
function TcxGridTableView.CanOffset(ARecordCountDelta: Integer): Boolean;
|
|
begin
|
|
Result := inherited CanOffset(ARecordCountDelta) and not IsMaster;
|
|
end;
|
|
|
|
function TcxGridTableView.CanOffsetHorz: Boolean;
|
|
begin
|
|
Result := not TcxCustomGrid(Control).UpdateLocked and
|
|
(not IsMaster or (GroupedColumnCount = 0));
|
|
end;
|
|
|
|
procedure TcxGridTableView.DetailDataChanged(ADetail: TcxCustomGridView);
|
|
begin
|
|
inherited;
|
|
if UpdateOnDetailDataChange(ADetail) then
|
|
SizeChanged;
|
|
end;
|
|
|
|
procedure TcxGridTableView.DoAssign(ASource: TcxCustomGridView);
|
|
begin
|
|
if ASource is TcxGridTableView then
|
|
with TcxGridTableView(ASource) do
|
|
begin
|
|
Self.OnColumnHeaderClick := OnColumnHeaderClick;
|
|
Self.OnColumnPosChanged := OnColumnPosChanged;
|
|
Self.OnColumnSizeChanged := OnColumnSizeChanged;
|
|
Self.OnCustomDrawColumnHeader := OnCustomDrawColumnHeader;
|
|
Self.OnCustomDrawFooterCell := OnCustomDrawFooterCell;
|
|
Self.OnCustomDrawGroupCell := OnCustomDrawGroupCell;
|
|
Self.OnCustomDrawGroupSummaryCell := OnCustomDrawGroupSummaryCell;
|
|
Self.OnCustomDrawIndicatorCell := OnCustomDrawIndicatorCell;
|
|
Self.OnLeftPosChanged := OnLeftPosChanged;
|
|
end;
|
|
inherited;
|
|
if ASource is TcxGridTableView then
|
|
with TcxGridTableView(ASource) do
|
|
begin
|
|
Self.FilterRow := FilterRow;
|
|
Self.NewItemRow := NewItemRow;
|
|
Self.Preview := Preview;
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableView.GetItemsListForClipboard(AItems: TList; ACopyAll: Boolean);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
if ACopyAll or not Controller.CellMultiSelect then
|
|
inherited GetVisibleItemsList(AItems)
|
|
else
|
|
begin
|
|
inherited;
|
|
for I := AItems.Count - 1 downto 0 do
|
|
if not TcxGridColumn(AItems[I]).Selected then
|
|
AItems.Delete(I);
|
|
end;
|
|
if OptionsBehavior.CopyPreviewToClipboard then
|
|
if FPreview.Active then AItems.Add(FPreview.Column);
|
|
end;
|
|
|
|
function TcxGridTableView.GetResizeOnBoundsChange: Boolean;
|
|
begin
|
|
Result := inherited GetResizeOnBoundsChange or
|
|
OptionsView.ColumnAutoWidth or Preview.Active or IsMaster;
|
|
end;
|
|
|
|
function TcxGridTableView.HasCellMerging: Boolean;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to VisibleColumnCount - 1 do
|
|
begin
|
|
Result := VisibleColumns[I].CanCellMerging;
|
|
if Result then Exit;
|
|
end;
|
|
Result := False;
|
|
end;
|
|
|
|
function TcxGridTableView.IsEqualHeightRecords: Boolean;
|
|
begin
|
|
Result := inherited IsEqualHeightRecords and
|
|
not ViewInfo.RecordsViewInfo.HasLastHorzGridLine(nil) and
|
|
not Preview.Active and (GroupedColumnCount = 0) and not IsMaster;
|
|
end;
|
|
|
|
function TcxGridTableView.IsRecordHeightDependsOnData: Boolean;
|
|
begin
|
|
Result := inherited IsRecordHeightDependsOnData or
|
|
Preview.Active and Preview.AutoHeight;
|
|
end;
|
|
|
|
function TcxGridTableView.UpdateOnDetailDataChange(ADetail: TcxCustomGridView): Boolean;
|
|
begin
|
|
Result := not OptionsView.ExpandButtonsForEmptyDetails;
|
|
end;
|
|
|
|
function TcxGridTableView.GetControllerClass: TcxCustomGridControllerClass;
|
|
begin
|
|
Result := TcxGridTableController;
|
|
end;
|
|
|
|
function TcxGridTableView.GetDataControllerClass: TcxCustomDataControllerClass;
|
|
begin
|
|
Result := TcxGridDataController;
|
|
end;
|
|
|
|
function TcxGridTableView.GetPainterClass: TcxCustomGridPainterClass;
|
|
begin
|
|
Result := TcxGridTablePainter;
|
|
end;
|
|
|
|
function TcxGridTableView.GetViewDataClass: TcxCustomGridViewDataClass;
|
|
begin
|
|
Result := TcxGridViewData;
|
|
end;
|
|
|
|
function TcxGridTableView.GetViewInfoClass: TcxCustomGridViewInfoClass;
|
|
begin
|
|
Result := TcxGridTableViewInfo;
|
|
end;
|
|
|
|
function TcxGridTableView.GetBackgroundBitmapsClass: TcxCustomGridBackgroundBitmapsClass;
|
|
begin
|
|
Result := TcxGridTableBackgroundBitmaps;
|
|
end;
|
|
|
|
function TcxGridTableView.GetDateTimeHandlingClass: TcxCustomGridTableDateTimeHandlingClass;
|
|
begin
|
|
Result := TcxGridTableDateTimeHandling;
|
|
end;
|
|
|
|
function TcxGridTableView.GetFilteringClass: TcxCustomGridTableFilteringClass;
|
|
begin
|
|
Result := TcxGridTableFiltering;
|
|
end;
|
|
|
|
function TcxGridTableView.GetFilterRowOptionsClass: TcxGridFilterRowOptionsClass;
|
|
begin
|
|
Result := TcxGridFilterRowOptions;
|
|
end;
|
|
|
|
function TcxGridTableView.GetNewItemRowOptionsClass: TcxGridNewItemRowOptionsClass;
|
|
begin
|
|
Result := TcxGridNewItemRowOptions;
|
|
end;
|
|
|
|
function TcxGridTableView.GetOptionsBehaviorClass: TcxCustomGridOptionsBehaviorClass;
|
|
begin
|
|
Result := TcxGridTableOptionsBehavior;
|
|
end;
|
|
|
|
function TcxGridTableView.GetOptionsCustomizeClass: TcxCustomGridTableOptionsCustomizeClass;
|
|
begin
|
|
Result := TcxGridTableOptionsCustomize;
|
|
end;
|
|
|
|
function TcxGridTableView.GetOptionsDataClass: TcxCustomGridOptionsDataClass;
|
|
begin
|
|
Result := TcxGridTableOptionsData;
|
|
end;
|
|
|
|
function TcxGridTableView.GetOptionsSelectionClass: TcxCustomGridOptionsSelectionClass;
|
|
begin
|
|
Result := TcxGridTableOptionsSelection;
|
|
end;
|
|
|
|
function TcxGridTableView.GetOptionsViewClass: TcxCustomGridOptionsViewClass;
|
|
begin
|
|
Result := TcxGridTableOptionsView;
|
|
end;
|
|
|
|
function TcxGridTableView.GetPreviewClass: TcxGridPreviewClass;
|
|
begin
|
|
Result := TcxGridPreview;
|
|
end;
|
|
|
|
function TcxGridTableView.GetStylesClass: TcxCustomGridViewStylesClass;
|
|
begin
|
|
Result := TcxGridTableViewStyles;
|
|
end;
|
|
|
|
function TcxGridTableView.GetSummaryGroupItemLinkClass: TcxDataSummaryGroupItemLinkClass;
|
|
begin
|
|
Result := TcxGridTableSummaryGroupItemLink;
|
|
end;
|
|
|
|
function TcxGridTableView.GetSummaryItemClass: TcxDataSummaryItemClass;
|
|
begin
|
|
Result := TcxGridTableSummaryItem;
|
|
end;
|
|
|
|
function TcxGridTableView.GetItemClass: TcxCustomGridTableItemClass;
|
|
begin
|
|
Result := TcxGridColumn;
|
|
end;
|
|
|
|
procedure TcxGridTableView.ItemVisibilityChanged(AItem: TcxCustomGridTableItem;
|
|
Value: Boolean);
|
|
begin
|
|
if not Value and (AItem = Controller.CellSelectionAnchor) then
|
|
Controller.CellSelectionAnchor := Controller.FocusedColumn;
|
|
inherited;
|
|
end;
|
|
|
|
function TcxGridTableView.CalculateDataCellSelected(ARecord: TcxCustomGridRecord;
|
|
AItem: TcxCustomGridTableItem; AUseViewInfo: Boolean;
|
|
ACellViewInfo: TcxGridTableCellViewInfo): Boolean;
|
|
begin
|
|
if Controller.CellMultiSelect and TcxCustomGridRow(ARecord).SupportsCellMultiSelect then
|
|
Result := (AItem <> nil) and TcxGridColumn(AItem).Selected and
|
|
(not (ACellViewInfo is TcxGridTableDataCellViewInfo) or
|
|
not TcxGridTableDataCellViewInfo(ACellViewInfo).Editing)
|
|
else
|
|
Result := inherited CalculateDataCellSelected(ARecord, AItem, AUseViewInfo, ACellViewInfo);
|
|
end;
|
|
|
|
procedure TcxGridTableView.DoColumnHeaderClick(AColumn: TcxGridColumn);
|
|
begin
|
|
if Assigned(FOnColumnHeaderClick) then FOnColumnHeaderClick(Self, AColumn);
|
|
end;
|
|
|
|
procedure TcxGridTableView.DoColumnPosChanged(AColumn: TcxGridColumn);
|
|
begin
|
|
if Assigned(FOnColumnPosChanged) then FOnColumnPosChanged(Self, AColumn);
|
|
end;
|
|
|
|
procedure TcxGridTableView.DoColumnSizeChanged(AColumn: TcxGridColumn);
|
|
begin
|
|
if Assigned(FOnColumnSizeChanged) then FOnColumnSizeChanged(Self, AColumn);
|
|
end;
|
|
|
|
procedure TcxGridTableView.DoCustomDrawColumnHeader(ACanvas: TcxCanvas;
|
|
AViewInfo: TcxGridColumnHeaderViewInfo; var ADone: Boolean);
|
|
begin
|
|
if HasCustomDrawColumnHeader then
|
|
FOnCustomDrawColumnHeader(Self, ACanvas, AViewInfo, ADone);
|
|
end;
|
|
|
|
procedure TcxGridTableView.DoCustomDrawFooterCell(ACanvas: TcxCanvas;
|
|
AViewInfo: TcxGridColumnHeaderViewInfo; var ADone: Boolean);
|
|
begin
|
|
if HasCustomDrawFooterCell then
|
|
FOnCustomDrawFooterCell(Self, ACanvas, AViewInfo, ADone);
|
|
end;
|
|
|
|
procedure TcxGridTableView.DoCustomDrawGroupCell(ACanvas: TcxCanvas;
|
|
AViewInfo: TcxGridTableCellViewInfo; var ADone: Boolean);
|
|
begin
|
|
if HasCustomDrawGroupCell then
|
|
FOnCustomDrawGroupCell(Self, ACanvas, AViewInfo, ADone);
|
|
end;
|
|
|
|
procedure TcxGridTableView.DoCustomDrawGroupSummaryCell(ACanvas: TcxCanvas;
|
|
AViewInfo: TcxCustomGridViewCellViewInfo; var ADone: Boolean);
|
|
var
|
|
ACell: TcxGridGroupSummaryCellViewInfo;
|
|
begin
|
|
if HasCustomDrawGroupSummaryCell then
|
|
begin
|
|
ACell := TcxGridGroupSummaryCellViewInfo(AViewInfo);
|
|
FOnCustomDrawGroupSummaryCell(Self, ACanvas, ACell.RowViewInfo.GridRecord,
|
|
ACell.Column, ACell.SummaryItem, AViewInfo, ADone);
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridTableView.DoCustomDrawIndicatorCell(ACanvas: TcxCanvas;
|
|
AViewInfo: TcxCustomGridIndicatorItemViewInfo; var ADone: Boolean);
|
|
begin
|
|
if HasCustomDrawIndicatorCell then
|
|
FOnCustomDrawIndicatorCell(Self, ACanvas, AViewInfo, ADone);
|
|
end;
|
|
|
|
procedure TcxGridTableView.DoLeftPosChanged;
|
|
begin
|
|
if Assigned(FOnLeftPosChanged) then FOnLeftPosChanged(Self);
|
|
end;
|
|
|
|
function TcxGridTableView.HasCustomDrawColumnHeader: Boolean;
|
|
begin
|
|
Result := Assigned(FOnCustomDrawColumnHeader);
|
|
end;
|
|
|
|
function TcxGridTableView.HasCustomDrawFooterCell: Boolean;
|
|
begin
|
|
Result := Assigned(FOnCustomDrawFooterCell);
|
|
end;
|
|
|
|
function TcxGridTableView.HasCustomDrawGroupCell: Boolean;
|
|
begin
|
|
Result := Assigned(FOnCustomDrawGroupCell);
|
|
end;
|
|
|
|
function TcxGridTableView.HasCustomDrawGroupSummaryCell: Boolean;
|
|
begin
|
|
Result := Assigned(FOnCustomDrawGroupSummaryCell);
|
|
end;
|
|
|
|
function TcxGridTableView.HasCustomDrawIndicatorCell: Boolean;
|
|
begin
|
|
Result := Assigned(FOnCustomDrawIndicatorCell);
|
|
end;
|
|
|
|
function TcxGridTableView.CreateColumn: TcxGridColumn;
|
|
begin
|
|
Result := TcxGridColumn(CreateItem);
|
|
end;
|
|
|
|
class function TcxGridTableView.CanBeLookupList: Boolean;
|
|
begin
|
|
Result := True;
|
|
end;
|
|
|
|
{ TcxGridColumnAccess }
|
|
|
|
class function TcxGridColumnAccess.CanCellMerging(AInstance: TcxGridColumn): Boolean;
|
|
begin
|
|
Result := AInstance.CanCellMerging;
|
|
end;
|
|
|
|
class function TcxGridColumnAccess.CanShowGroupFooters(AInstance: TcxGridColumn): Boolean;
|
|
begin
|
|
Result := AInstance.CanShowGroupFooters;
|
|
end;
|
|
|
|
class procedure TcxGridColumnAccess.DoCustomDrawGroupSummaryCell(AInstance: TcxGridColumn;
|
|
ACanvas: TcxCanvas; AViewInfo: TcxCustomGridViewCellViewInfo; var ADone: Boolean);
|
|
begin
|
|
AInstance.DoCustomDrawGroupSummaryCell(ACanvas, AViewInfo, ADone);
|
|
end;
|
|
|
|
class function TcxGridColumnAccess.HasCustomDrawGroupSummaryCell(AInstance: TcxGridColumn): Boolean;
|
|
begin
|
|
Result := AInstance.HasCustomDrawGroupSummaryCell;
|
|
end;
|
|
|
|
{ TcxGridTableViewAccess }
|
|
|
|
class procedure TcxGridTableViewAccess.DoColumnPosChanged(AInstance: TcxGridTableView;
|
|
AColumn: TcxGridColumn);
|
|
begin
|
|
AInstance.DoColumnPosChanged(AColumn);
|
|
end;
|
|
|
|
class procedure TcxGridTableViewAccess.DoCustomDrawGroupCell(AInstance: TcxGridTableView;
|
|
ACanvas: TcxCanvas; AViewInfo: TcxGridTableCellViewInfo; var ADone: Boolean);
|
|
begin
|
|
AInstance.DoCustomDrawGroupCell(ACanvas, AViewInfo, ADone);
|
|
end;
|
|
|
|
class procedure TcxGridTableViewAccess.DoCustomDrawGroupSummaryCell(AInstance: TcxGridTableView;
|
|
ACanvas: TcxCanvas; AViewInfo: TcxCustomGridViewCellViewInfo; var ADone: Boolean);
|
|
begin
|
|
AInstance.DoCustomDrawGroupSummaryCell(ACanvas, AViewInfo, ADone);
|
|
end;
|
|
|
|
class function TcxGridTableViewAccess.HasCustomDrawGroupCell(AInstance: TcxGridTableView): Boolean;
|
|
begin
|
|
Result := AInstance.HasCustomDrawGroupCell;
|
|
end;
|
|
|
|
class function TcxGridTableViewAccess.HasCustomDrawGroupSummaryCell(AInstance: TcxGridTableView): Boolean;
|
|
begin
|
|
Result := AInstance.HasCustomDrawGroupSummaryCell;
|
|
end;
|
|
|
|
initialization
|
|
cxGridRegisteredViews.Register(TcxGridTableView, 'Table');
|
|
Classes.RegisterClasses([TcxGridColumn, TcxGridTableViewStyleSheet]);
|
|
|
|
finalization
|
|
cxGridRegisteredViews.Unregister(TcxGridTableView);
|
|
|
|
end.
|