Componentes.Terceros.DevExp.../official/x.48/ExpressQuantumGrid 4/Sources/cxGridTableView.pas
2010-01-18 18:33:24 +00:00

12322 lines
370 KiB
ObjectPascal

{********************************************************************}
{ }
{ Developer Express Visual Component Library }
{ ExpressQuantumGrid }
{ }
{ Copyright (c) 1998-2009 Developer Express Inc. }
{ ALL RIGHTS RESERVED }
{ }
{ The entire contents of this file is protected by U.S. and }
{ International Copyright Laws. Unauthorized reproduction, }
{ reverse-engineering, and distribution of all or any portion of }
{ the code contained in this file is strictly prohibited and may }
{ result in severe civil and criminal penalties and will be }
{ prosecuted to the maximum extent possible under the law. }
{ }
{ RESTRICTIONS }
{ }
{ THIS SOURCE CODE AND ALL RESULTING INTERMEDIATE FILES }
{ (DCU, OBJ, DLL, ETC.) ARE CONFIDENTIAL AND PROPRIETARY TRADE }
{ SECRETS OF DEVELOPER EXPRESS INC. THE REGISTERED DEVELOPER IS }
{ LICENSED TO DISTRIBUTE THE 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 cxGridVer.inc}
interface
uses
Windows, Messages,
Classes, Graphics, Controls, ImgList, Forms, Buttons, StdCtrls, ExtCtrls, ComCtrls,
cxClasses, cxControls, cxGraphics, cxLookAndFeelPainters, cxStyles, cxListBox,
cxStorage,
cxContainer, cxEdit,
cxGrid, cxGridCommon, cxGridLevel, cxGridCustomView, cxGridCustomTableView, cxGridViewData,
cxCustomData, cxFilter, cxData, cxDataStorage;
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;
htFilter = htGridBase + 9;
htFilterActivateButton = htGridBase + 10;
htFilterCloseButton = htGridBase + 11;
htFilterCustomizeButton = htGridBase + 12;
htRowIndicator = htGridBase + 13;
htRowSizingEdge = htGridBase + 14;
htIndicator = htGridBase + 15;
htRowLevelIndent = htGridBase + 16;
htCustomizationForm = htGridBase + 17;
htHeader = htGridBase + 18;
ccNone = 0;
ccHeader = 1;
ccGroupByBox = 2;
ccCustomizationForm = 3;
ccFooter = 4;
cxGridCustomizationFormDefaultWidth = 180;
cxGridCustomizationFormDefaultHeight = 300;
cxGridDefaultIndicatorWidth = 12;
cxGridDefaultNewItemRowSeparatorWidth = 6;
cxGridMinNewItemRowSeparatorWidth = 2;
cxGridTableFilterDefaultMaxDropDownCount = 15;
cxGridPreviewDefaultLeftIndent = 20;
cxGridPreviewDefaultMaxLineCount = 3;
cxGridPreviewDefaultRightIndent = 5;
cxGridHeaderSizingEdgeSize = 8;
cxGridRowSizingEdgeSize = 8;
isColumnFirst = isCustomItemLast + 1;
isFooter = isColumnFirst;
isHeader = isColumnFirst + 1;
isColumnLast = isHeader;
bbTableFirst = bbCustomTableLast + 1;
bbFilterBox = bbTableFirst;
bbFooter = bbTableFirst + 1;
bbHeader = bbTableFirst + 2;
bbGroup = bbTableFirst + 3;
bbGroupByBox = bbTableFirst + 4;
bbIndicator = bbTableFirst + 5;
bbPreview = bbTableFirst + 6;
bbTableLast = bbPreview;
vsTableFirst = vsCustomTableLast + 1;
vsFilterBox = vsTableFirst;
vsFooter = vsTableFirst + 1;
vsGroup = vsTableFirst + 2;
vsGroupByBox = vsTableFirst + 3;
vsHeader = vsTableFirst + 4;
vsNewItemRowInfoText = vsTableFirst + 5;
vsIndicator = vsTableFirst + 6;
vsPreview = vsTableFirst + 7;
vsTableLast = vsPreview;
type
TcxCustomGridTableItemsListBox = class;
TcxGridTableCustomizationForm = class;
TcxGridTableController = class;
TcxCustomGridPartViewInfo = class;
TcxGridColumnHeaderAreaPainterClass = class of TcxGridColumnHeaderAreaPainter;
TcxGridColumnContainerZone = class;
TcxGridColumnContainerViewInfo = class;
TcxGridColumnHeaderAreaViewInfoClass = class of TcxGridColumnHeaderAreaViewInfo;
TcxGridColumnHeaderAreaViewInfo = class;
TcxGridColumnHeaderFilterButtonViewInfo = class;
TcxGridColumnHeaderGlyphViewInfo = class;
TcxGridColumnHeaderViewInfoClass = class of TcxGridColumnHeaderViewInfo;
TcxGridColumnHeaderViewInfo = class;
TcxGridHeaderViewInfo = class;
TcxGridFooterViewInfo = class;
TcxCustomGridFilterButtonViewInfo = class;
TcxGridFilterActivateButtonViewInfo = class;
TcxGridFilterButtonsViewInfo = class;
TcxGridFilterViewInfo = class;
TcxCustomGridIndicatorItemViewInfo = class;
TcxGridIndicatorRowItemViewInfo = class;
TcxGridIndicatorFooterItemViewInfo = class;
TcxGridIndicatorViewInfo = class;
TcxGridRowFooterViewInfo = class;
TcxGridRowFootersViewInfo = class;
TcxCustomGridRowViewInfo = class;
TcxGridRowsViewInfo = class;
TcxGridTableViewInfo = class;
TcxGridTableViewInfoCacheItem = class;
TcxGridTableFiltering = class;
TcxGridColumn = class;
TcxGridTableView = class;
TcxGridColumnContainerKind = Integer;
{ hit tests }
// custom column
TcxCustomGridColumnHitTestClass = class of TcxCustomGridColumnHitTest;
TcxCustomGridColumnHitTest = class(TcxCustomGridViewHitTest)
public
Column: TcxGridColumn;
ColumnContainerKind: TcxGridColumnContainerKind;
//procedure Assign(Source: TcxCustomGridHitTest); override;
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
class 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;
end;
TcxGridGroupFooterHitTest = class(TcxGridFooterHitTest)
protected
class function GetHitTestCode: Integer; override;
end;
TcxGridGroupFooterCellHitTest = class(TcxGridFooterCellHitTest)
protected
class function GetHitTestCode: Integer; override;
end;
// filter
TcxGridFilterHitTest = class(TcxCustomGridViewHitTest)
protected
class function GetHitTestCode: Integer; override;
end;
TcxGridFilterCloseButtonHitTest = class(TcxCustomGridViewHitTest)
protected
class function GetHitTestCode: Integer; override;
end;
TcxGridFilterActivateButtonHitTest = class(TcxCustomGridViewHitTest)
protected
class function GetHitTestCode: Integer; override;
end;
TcxGridFilterCustomizeButtonHitTest = class(TcxCustomGridViewHitTest)
protected
class function GetHitTestCode: Integer; override;
end;
// indicator
TcxGridRowIndicatorHitTest = class(TcxGridRecordHitTest)
protected
class function GetHitTestCode: Integer; override;
end;
TcxGridRowSizingEdgeHitTest = class(TcxGridRecordHitTest)
protected
class function GetHitTestCode: Integer; override;
public
class function Cursor: TCursor; override;
function DragAndDropObjectClass: TcxCustomGridDragAndDropObjectClass; override;
end;
TcxGridIndicatorHitTest = class(TcxCustomGridViewHitTest)
protected
class function GetHitTestCode: Integer; override;
end;
// row
TcxGridRowLevelIndentHitTest = class(TcxGridRecordHitTest)
protected
class function GetHitTestCode: Integer; override;
public
class function CanClick: Boolean; override;
end;
// customization form
TcxGridCustomozationFormHitTest = class(TcxCustomGridViewHitTest)
protected
class function GetHitTestCode: Integer; override;
end;
{ controller }
TcxGridDragAndDropObject = class(TcxCustomGridTableDragAndDropObject)
private
function GetController: TcxGridTableController;
function GetGridView: TcxGridTableView;
function GetViewInfo: TcxGridTableViewInfo;
protected
procedure AfterScrolling; virtual;
procedure BeforeScrolling; virtual;
property Controller: TcxGridTableController read GetController;
property GridView: TcxGridTableView read GetGridView;
property ViewInfo: TcxGridTableViewInfo read GetViewInfo;
end;
TcxGridArrowNumber = (anFirst, anLast);
TcxGridArrowPlace = (apLeft, apTop, apRight, apBottom);
TcxCustomGridMovingObject = class(TcxGridDragAndDropObject)
private
FArrowsVisible: Boolean;
FDragImage: TBitmap;
FDragImageCanvas: TcxCanvas;
FDragImageOffset: TPoint;
FDragImagePos: TPoint;
FDragImageSavingBitmap: TBitmap;
FDragImageSavingPos: TPoint;
FDragImageVisible: Boolean;
FSavingBitmap: TBitmap;
function GetArrowPlace(AArrowNumber: TcxGridArrowNumber): TcxGridArrowPlace;
function GetCustomizationForm: TcxGridTableCustomizationForm;
function GetDragImageSavingCanvas: TCanvas;
function GetSavingBitmap: TBitmap;
function GetSavingCanvas: TCanvas;
procedure CreateDragImage;
procedure DestroyDragImage;
protected
procedure AfterScrolling; override;
procedure BeforeScrolling; override;
procedure DirtyChanged; override;
function GetDragAndDropCursor(Accepted: Boolean): TCursor; override;
procedure ChangeArrowsVisibility(AVisible: Boolean);
procedure ChangeDragImagePosition(AVisible: Boolean = True);
function AreArrowsVertical: Boolean; virtual;
function CalculateDragImageOffset: TPoint; virtual;
function CanRemove: Boolean; virtual; abstract;
function GetArrowAreaBounds(APlace: TcxGridArrowPlace): TRect; virtual; abstract;
function GetArrowBounds(APlace: TcxGridArrowPlace): TRect; virtual;
function GetArrowsClientRect: TRect; virtual;
function GetCustomizationFormListBox: TcxCustomGridTableItemsListBox; virtual; abstract;
function GetDragImageBounds(AMousePos: TPoint): TRect; virtual;
function GetSourceItem: TObject; virtual; abstract;
function GetSourceItemBounds: TRect; virtual;
function GetSourceItemViewInfo: TcxCustomGridCellViewInfo; virtual;
procedure InitDragImage; virtual;
function IsSourceCustomizationForm: Boolean; virtual; abstract;
function IsValidDestination: Boolean; virtual; abstract;
property ArrowBounds[APlace: TcxGridArrowPlace]: TRect read GetArrowBounds;
property ArrowPlaces[AArrowNumber: TcxGridArrowNumber]: TcxGridArrowPlace read GetArrowPlace;
property ArrowsClientRect: TRect read GetArrowsClientRect;
property CustomizationForm: TcxGridTableCustomizationForm read GetCustomizationForm;
property CustomizationFormListBox: TcxCustomGridTableItemsListBox read GetCustomizationFormListBox;
property DragImage: TBitmap read FDragImage;
property DragImageCanvas: TcxCanvas read FDragImageCanvas;
property DragImageOffset: TPoint read FDragImageOffset;
property DragImagePos: TPoint read FDragImagePos write FDragImagePos;
property DragImageSavingBitmap: TBitmap read FDragImageSavingBitmap;
property DragImageSavingCanvas: TCanvas read GetDragImageSavingCanvas;
property DragImageSavingPos: TPoint read FDragImageSavingPos write FDragImageSavingPos;
property DragImageVisible: Boolean read FDragImageVisible write FDragImageVisible;
property SavingBitmap: TBitmap read GetSavingBitmap;
property SavingCanvas: TCanvas read GetSavingCanvas;
property SourceItem: TObject read GetSourceItem;
property SourceItemBounds: TRect read GetSourceItemBounds;
property SourceItemViewInfo: TcxCustomGridCellViewInfo read GetSourceItemViewInfo;
public
constructor Create(AControl: TcxControl); override;
destructor Destroy; override;
procedure BeginDragAndDrop; override;
procedure DragAndDrop(const P: TPoint; var Accepted: Boolean); override;
procedure EndDragAndDrop(Accepted: Boolean); override;
end;
TcxGridColumnHeaderMovingObjectClass = class of TcxGridColumnHeaderMovingObject;
TcxGridColumnHeaderMovingObject = class(TcxCustomGridMovingObject)
private
FDestColumnContainerKind: TcxGridColumnContainerKind;
FDestZone: TcxGridColumnContainerZone;
FSourceColumn: TcxGridColumn;
FSourceColumnContainerKind: TcxGridColumnContainerKind;
procedure SetDestColumnContainerKind(Value: TcxGridColumnContainerKind);
procedure SetDestZone(Value: TcxGridColumnContainerZone);
protected
function CanRemove: Boolean; override;
procedure DoColumnMoving; virtual;
function GetArrowAreaBounds(APlace: TcxGridArrowPlace): TRect; override;
function GetArrowAreaBoundsForHeader(APlace: TcxGridArrowPlace): TRect; virtual;
function GetCustomizationFormListBox: TcxCustomGridTableItemsListBox; override;
function GetSourceItem: TObject; override;
function GetSourceItemViewInfo: TcxCustomGridCellViewInfo; override;
function IsSourceCustomizationForm: Boolean; override;
function IsValidDestination: Boolean; override;
function IsValidDestinationForVisibleSource: Boolean; virtual;
property DestColumnContainerKind: TcxGridColumnContainerKind
read FDestColumnContainerKind write SetDestColumnContainerKind;
property DestZone: TcxGridColumnContainerZone read FDestZone write SetDestZone;
property SourceColumn: TcxGridColumn read FSourceColumn write FSourceColumn;
property SourceColumnContainerKind: TcxGridColumnContainerKind
read FSourceColumnContainerKind write FSourceColumnContainerKind;
public
constructor Create(AControl: TcxControl); override;
destructor Destroy; override;
procedure BeginDragAndDrop; override;
procedure DragAndDrop(const P: TPoint; var Accepted: Boolean); override;
procedure EndDragAndDrop(Accepted: Boolean); override;
procedure Init(const P: TPoint; AParams: TcxCustomGridHitTest); override;
end;
TcxCustomGridSizingObject = class(TcxGridDragAndDropObject)
private
FDestPointX: Integer;
FDestPointY: Integer;
FOriginalSize: Integer;
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;
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 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;
public
procedure DragAndDrop(const P: TPoint; var Accepted: Boolean); override;
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
function GetCurrentSize: Integer; override;
public
procedure BeginDragAndDrop; override;
procedure EndDragAndDrop(Accepted: Boolean); override;
end;
TcxGridRowSizingObject = class(TcxCustomGridSizingObject)
private
FRow: TcxCustomGridRow;
function GetRowViewInfo: TcxCustomGridRowViewInfo;
protected
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 BeginDragAndDrop; override;
procedure EndDragAndDrop(Accepted: Boolean); override;
procedure Init(const P: TPoint; AParams: TcxCustomGridHitTest); override;
end;
TcxGridFilterPopupClass = class of TcxGridFilterPopup;
TcxGridFilterPopup = class(TcxCustomPopupWindow)
private
FGridView: TcxGridTableView;
FListBox: TcxListBox;
FListBoxItems: TStringList;
FOwnerViewInfo: TcxGridColumnHeaderFilterButtonViewInfo;
FValueList: TcxDataFilterValueList;
function GetColumn: TcxGridColumn;
function GetFilter: TcxDataFilterCriteria;
procedure SetOwnerViewInfo(Value: TcxGridColumnHeaderFilterButtonViewInfo);
procedure ListBoxDrawItem(AControl: TcxListBox; ACanvas: TcxCanvas;
AIndex: Integer; ARect: TRect; AState: TOwnerDrawState);
procedure ListBoxKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure ListBoxMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
procedure ListBoxMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
protected
procedure AddListBoxItems; virtual;
procedure AdjustListBoxSize; virtual;
procedure ApplyFilter(AItemIndex: Integer); virtual;
function CalculateOwnerBounds: TRect; virtual;
procedure CreateListBox; virtual;
procedure InitPopup; override;
procedure Paint; override;
procedure VisibleChanged; override;
property Column: TcxGridColumn read GetColumn;
property Filter: TcxDataFilterCriteria read GetFilter;
property GridView: TcxGridTableView read FGridView;
property ListBoxItems: TStringList read FListBoxItems;
property OwnerViewInfo: TcxGridColumnHeaderFilterButtonViewInfo read FOwnerViewInfo
write SetOwnerViewInfo;
property ValueList: TcxDataFilterValueList read FValueList;
public
constructor Create(AGridView: TcxGridTableView); reintroduce; virtual;
destructor Destroy; override;
procedure CloseUp; override;
procedure CloseUpAndFocusGridView;
procedure Popup(AOwnerViewInfo: TcxGridColumnHeaderFilterButtonViewInfo); reintroduce; virtual;
end;
TcxCustomGridTableItemsListBox = class(TListBox)
private
FcxCanvas: TcxCanvas;
FDragAndDropItemIndex: Integer;
FMouseDownPos: TPoint;
function GetDragAndDropItem: TObject;
function GetGridView: TcxGridTableView;
function GetLookAndFeelPainter: TcxCustomLookAndFeelPainterClass;
procedure WMCancelMode(var Message: TWMCancelMode); message WM_CANCELMODE;
procedure WMNCCalcSize(var Message: TWMNCCalcSize); message WM_NCCALCSIZE;
procedure WMNCPaint(var Message: TWMNCPaint); message WM_NCPAINT;
protected
procedure CreateParams(var Params: TCreateParams); override;
procedure CreateWnd; override;
procedure DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState); override;
procedure KeyDown(var Key: Word; Shift: TShiftState); override;
procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
procedure CalculateBorderStyle;
procedure CalculateItemHeight;
function GetDragAndDropParams: TcxCustomGridHitTest; virtual; abstract;
property DragAndDropItem: TObject read GetDragAndDropItem;
property DragAndDropItemIndex: Integer read FDragAndDropItemIndex;
property GridView: TcxGridTableView read GetGridView;
property LookAndFeelPainter: TcxCustomLookAndFeelpainterClass read GetLookAndFeelPainter;
public
constructor Create(AOwner: TComponent); reintroduce;
destructor Destroy; override;
function IndexOfItem(AItem: TObject): Integer;
procedure PaintItem(ACanvas: TcxCanvas; R: TRect; AIndex: Integer; AFocused: Boolean);
procedure RefreshItems; virtual;
end;
TcxGridTableColumnsListBoxClass = class of TcxGridTableColumnsListBox;
TcxGridTableColumnsListBox = class(TcxCustomGridTableItemsListBox)
protected
function GetDragAndDropParams: TcxCustomGridHitTest; override;
public
procedure RefreshItems; override;
end;
TcxGridTableCustomizationFormClass = class of TcxGridTableCustomizationForm;
TcxGridTableCustomizationForm = class(TForm)
private
FColumnsListBox: TcxGridTableColumnsListBox;
FColumnsPage: TTabSheet;
FController: TcxGridTableController;
FHookTimer: TTimer;
FOffset: Integer;
FPageControl: TPageControl;
FStep: Integer;
function GetGridView: TcxGridTableView;
function GetViewInfo: TcxGridTableViewInfo;
procedure HookTimerHandler(Sender: TObject);
protected
procedure CreateParams(var Params: TCreateParams); override;
procedure DoClose(var Action: TCloseAction); override;
procedure DoShow; override;
procedure CalculateConsts; virtual;
procedure CreateControls; virtual;
function CreatePage(const ACaption: string; AVisible: Boolean): TTabSheet;
function GetColumnsListBoxBounds: TRect; virtual;
function GetColumnsListBoxClass: TcxGridTableColumnsListBoxClass; virtual;
function GetContentBounds: TRect; virtual;
function GetPageControlBounds: TRect; virtual;
procedure InitPageControl; virtual;
property ColumnsListBox: TcxGridTableColumnsListBox read FColumnsListBox;
property ContentBounds: TRect read GetContentBounds;
property GridView: TcxGridTableView read GetGridView;
property Offset: Integer read FOffset write FOffset;
property PageControl: TPageControl read FPageControl;
property Step: Integer read FStep write FStep;
property ViewInfo: TcxGridTableViewInfo read GetViewInfo;
public
constructor Create(AController: TcxGridTableController); reintroduce; virtual;
destructor Destroy; override;
property Controller: TcxGridTableController read FController;
procedure ActivatePage(APage: TTabSheet);
procedure RefreshData; virtual;
property ColumnsPage: TTabSheet read FColumnsPage;
end;
TcxGridDragOpenInfoMasterDataRowTab = class(TcxGridDragOpenInfoTab)
public
GridRow: TcxGridMasterDataRow;
constructor Create(ALevel: TcxGridLevel; AGridRow: TcxGridMasterDataRow); reintroduce; virtual;
function Equals(AInfo: TcxCustomGridDragOpenInfo): Boolean; override;
procedure Run; override;
end;
TcxGridTableController = class(TcxCustomGridTableController)
private
FCustomization: Boolean;
FCustomizationForm: TcxGridTableCustomizationForm;
FCustomizationFormBounds: TRect;
FFilterPopup: TcxGridFilterPopup;
FHorzSizingColumn: TcxGridColumn;
FLeftPos: Integer;
FMovingColumn: TcxGridColumn;
FPressedColumn: TcxGridColumn;
FScrollDirection: TcxDirection;
FScrollTimer: TTimer;
function GetDragAndDropObject: TcxGridDragAndDropObject;
function GetFilterPopup: TcxGridFilterPopup;
function GetFocusedColumn: TcxGridColumn;
function GetFocusedColumnIndex: Integer;
function GetFocusedRow: TcxCustomGridRow;
function GetFocusedRowIndex: Integer;
function GetGridView: TcxGridTableView;
function GetIsColumnHorzSizing: Boolean;
function GetIsColumnMoving: Boolean;
function GetSelectedRow(Index: Integer): TcxCustomGridRow;
function GetSelectedRowCount: Integer;
function GetTopRowIndex: Integer;
function GetViewData: TcxGridViewData;
function GetViewInfo: TcxGridTableViewInfo;
procedure SetCustomization(Value: Boolean);
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 SetScrollDirection(Value: TcxDirection);
procedure SetTopRowIndex(Value: Integer);
procedure CreateScrollTimer;
procedure DestroyScrollTimer;
procedure ScrollTimerHandler(Sender: TObject);
protected
function CanAppend(ACheckOptions: Boolean): Boolean; override;
function CanDelete(ACheckOptions: Boolean): Boolean; override;
function CanScroll(ADirection: TcxDirection): Boolean;
procedure CheckCoordinates; override;
procedure CheckLeftPos(var Value: Integer);
function GetDesignHitTest(AHitTest: TcxCustomGridHitTest): Boolean; override;
function GetDragScrollDirection(X, Y: Integer): TcxDirection; override;
function GetFilterPopupClass: TcxGridFilterPopupClass; virtual;
function GetFocusedRecord: TcxCustomGridRecord; override;
function GetIsRecordsScrollHorizontal: Boolean; 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);
procedure SetFocusedRecord(Value: TcxCustomGridRecord); override;
procedure ShowNextPage; override;
procedure ShowPrevPage; override;
function GetColumnHeaderDragAndDropObjectClass: TcxGridColumnHeaderMovingObjectClass; virtual;
function GetCustomizationFormClass: TcxGridTableCustomizationFormClass; virtual;
function GetRealCustomizationFormBounds: TRect;
procedure HideCustomizationForm;
procedure ShowCustomizationForm;
// delphi drag and drop
function GetDragOpenInfo(AHitTest: TcxCustomGridHitTest): TcxCustomGridDragOpenInfo; override;
property DragAndDropObject: TcxGridDragAndDropObject read GetDragAndDropObject;
property ScrollDirection: TcxDirection read FScrollDirection write SetScrollDirection;
property ViewData: TcxGridViewData read GetViewData;
property ViewInfo: TcxGridTableViewInfo read GetViewInfo;
public
destructor Destroy; override;
procedure CheckScrolling(const P: TPoint);
procedure DoCancelMode; override;
function HasFilterPopup: Boolean;
procedure MakeItemVisible(AItem: TcxCustomGridTableItem); override;
procedure MakeRecordVisible(ARecord: TcxCustomGridRecord); override;
procedure RefreshCustomizationForm;
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 KeyDown(var Key: Word; Shift: TShiftState); override;
procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
property Customization: Boolean read FCustomization write SetCustomization;
property CustomizationForm: TcxGridTableCustomizationForm read FCustomizationForm;
property CustomizationFormBounds: TRect read FCustomizationFormBounds
write FCustomizationFormBounds;
property FilterPopup: TcxGridFilterPopup read GetFilterPopup;
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 IsColumnMoving: Boolean read GetIsColumnMoving;
property LeftPos: Integer read FLeftPos write SetLeftPos;
property MovingColumn: TcxGridColumn read FMovingColumn;
property PressedColumn: TcxGridColumn read FPressedColumn write SetPressedColumn;
property SelectedRowCount: Integer read GetSelectedRowCount;
property SelectedRows[Index: Integer]: TcxCustomGridRow read GetSelectedRow;
property TopRowIndex: Integer read GetTopRowIndex write SetTopRowIndex;
end;
{ painters }
// part
TcxCustomGridPartPainter = class(TcxCustomGridCellPainter);
// column container
TcxGridColumnContainerPainterClass = class of TcxGridColumnContainerPainter;
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
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 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
TcxGridGroupByBoxPainterClass = class of TcxGridGroupByBoxPainter;
TcxGridGroupByBoxPainter = class(TcxGridColumnContainerPainter)
protected
procedure DrawContent; 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 DrawBorders; override;
function DrawItemsFirst: Boolean; override;
procedure DrawSeparator; virtual;
property ViewInfo: TcxGridFooterViewInfo read GetViewInfo;
end;
// filter
TcxCustomGridFilterButtonPainter = class(TcxCustomGridCellPainter)
private
function GetViewInfo: TcxCustomGridFilterButtonViewInfo;
protected
function ExcludeFromClipRect: Boolean; override;
property ViewInfo: TcxCustomGridFilterButtonViewInfo read GetViewInfo;
end;
TcxGridFilterCloseButtonPainter = class(TcxCustomGridFilterButtonPainter)
protected
procedure DrawContent; override;
end;
TcxGridFilterActivateButtonPainter = class(TcxCustomGridFilterButtonPainter)
private
function GetViewInfo: TcxGridFilterActivateButtonViewInfo;
protected
procedure DrawContent; override;
property ViewInfo: TcxGridFilterActivateButtonViewInfo read GetViewInfo;
end;
TcxGridFilterCustomizeButtonPainter = class(TcxCustomGridFilterButtonPainter)
protected
procedure Paint; override;
end;
TcxGridFilterPainterClass = class of TcxGridFilterPainter;
TcxGridFilterPainter = class(TcxCustomGridPartPainter)
private
function GetViewInfo: TcxGridFilterViewInfo;
protected
procedure DrawButtons; virtual;
function ExcludeFromClipRect: Boolean; override;
procedure Paint; override;
property ViewInfo: TcxGridFilterViewInfo 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)
protected
procedure DrawContent; override;
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 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
property ViewInfo: TcxGridRowsViewInfo read GetViewInfo;
public
class procedure DrawDataRowCells(ARowViewInfo: TcxCustomGridRowViewInfo); virtual;
procedure Paint; override;
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 DrawFilterBar; virtual;
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 }
// grid part
TcxGridPartAlignment = (gpaTop, gpaBottom);
TcxCustomGridPartViewInfo = class(TcxCustomGridViewCellViewInfo)
private
FHeight: Integer;
function GetGridView: TcxGridTableView;
function GetGridViewInfo: TcxGridTableViewInfo;
function GetIndex: Integer;
protected
function CalculateBounds: TRect; virtual;
procedure CalculateInvisible; virtual;
procedure CalculateVisible; virtual;
function CustomDrawBackground(ACanvas: TcxCanvas): Boolean; override;
function GetAlignment: TcxGridPartAlignment; virtual; abstract;
function GetHeight: Integer; override;
function GetIsAutoWidth: Boolean; virtual; abstract;
function GetIsPart: Boolean; virtual;
function GetIsScrollable: Boolean; virtual; abstract;
function GetPainterClass: TcxCustomGridCellPainterClass; override;
function HasCustomDrawBackground: Boolean; override;
procedure InitHitTest(AHitTest: TcxCustomGridHitTest); override;
property Alignment: TcxGridPartAlignment read GetAlignment;
property Index: Integer read GetIndex;
property IsAutoWidth: Boolean read GetIsAutoWidth;
property IsPart: Boolean read GetIsPart;
property IsScrollable: Boolean read GetIsScrollable;
public
constructor Create(AGridViewInfo: TcxGridTableViewInfo); virtual;
destructor Destroy; override;
procedure MainCalculate;
property GridView: TcxGridTableView read GetGridView;
property GridViewInfo: TcxGridTableViewInfo read GetGridViewInfo;
end;
// column container
TcxGridColumnContainerZone = class
public
ColumnIndex: Integer;
constructor Create(AColumnIndex: Integer);
function IsEqual(Value: TcxGridColumnContainerZone): Boolean; virtual;
end;
TcxGridColumnContainerViewInfo = class(TcxCustomGridPartViewInfo)
private
FItemHeight: Integer;
FItems: TList;
function GetController: TcxGridTableController;
function GetCount: Integer;
function GetInternalItem(Index: Integer): TcxGridColumnHeaderViewInfo;
function GetItem(Index: Integer): TcxGridColumnHeaderViewInfo;
function GetItemHeight: Integer;
function CreateItem(AIndex: Integer): TcxGridColumnHeaderViewInfo;
procedure CreateItems;
procedure DestroyItems;
protected
function CalculateItemHeight: Integer; virtual;
function GetAutoHeight: Boolean; virtual;
function GetColumn(Index: Integer): TcxGridColumn; virtual; abstract;
function GetColumnAdditionalWidth(AColumn: TcxGridColumn): Integer;
function GetColumnCount: Integer; virtual; abstract;
function GetColumnMinWidth(AColumn: TcxGridColumn): Integer; virtual;
function GetColumnNeighbors(AColumn: TcxGridColumn): TcxNeighbors; virtual;
function GetColumnWidth(AColumn: TcxGridColumn): Integer; virtual;
function GetItemClass: TcxGridColumnHeaderViewInfoClass; virtual;
function GetItemMultiLinePainting: Boolean; virtual;
function GetItemsAreaBounds: TRect; 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: TcxGridTableViewInfo); override;
destructor Destroy; override;
procedure BeforeRecalculation; override;
function GetHitTest(const P: TPoint): TcxCustomGridHitTest; override;
function GetZone(const P: TPoint): TcxGridColumnContainerZone; virtual;
property Count: Integer read GetCount;
property InternalItems[Index: Integer]: TcxGridColumnHeaderViewInfo read GetInternalItem;
property ItemHeight: Integer read GetItemHeight;
property ItemMultiLinePainting: Boolean read GetItemMultiLinePainting;
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 GetIsOccupyingSpace: Boolean; virtual;
function GetTransparent: Boolean; reintroduce; virtual; abstract;
function GetWidth: Integer; override;
function HasMouse(AHitTest: TcxCustomGridHitTest): Boolean; override;
procedure InitHitTest(AHitTest: TcxCustomGridHitTest); override;
//procedure Invalidate; virtual;
property Column: TcxGridColumn read GetColumn;
property ColumnHeaderViewInfo: TcxGridColumnHeaderViewInfo read FColumnHeaderViewInfo;
property GridView: TcxGridTableView read GetGridView;
property GridViewInfo: TcxGridTableViewInfo read GetGridViewInfo;
property IsOccupyingSpace: Boolean read GetIsOccupyingSpace;
public
constructor Create(AColumnHeaderViewInfo: TcxGridColumnHeaderViewInfo); virtual;
procedure Calculate(const ABounds: TRect; var ATextAreaBounds: TRect); reintroduce; virtual;
property AlignmentHorz: TAlignment read GetAlignmentHorz;
property AlignmentVert: TcxAlignmentVert read GetAlignmentVert;
property Height: Integer read GetHeight;
property Transparent: Boolean read GetTransparent;
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;
function GetTransparent: Boolean; 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 GetIsOccupyingSpace: Boolean; override;
function GetPainterClass: TcxCustomGridCellPainterClass; override;
function GetTransparent: 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)
private
function GetActive: Boolean;
function GetDropDownWindow: TcxGridFilterPopup;
protected
procedure BeforeStateChange; override;
function CalculateHeight: Integer; override;
function CalculateWidth: Integer; override;
function EmulateMouseMoveAfterCalculate: Boolean; override;
function GetAlignmentHorz: TAlignment; override;
function GetHitTestClass: TcxCustomGridHitTestClass; override;
function GetHotTrack: Boolean; override;
function GetIsCheck: Boolean; override;
function GetPainterClass: TcxCustomGridCellPainterClass; override;
function GetTransparent: Boolean; override;
procedure StateChanged; override;
procedure CloseUp; virtual;
procedure DropDown; virtual;
public
destructor Destroy; override;
property Active: Boolean read GetActive;
property DropDownWindow: TcxGridFilterPopup read GetDropDownWindow;
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;
function GetTransparent: Boolean; override;
public
property Glyph: TBitmap read GetGlyph;
end;
// column header
TcxGridColumnHeaderViewInfo = class(TcxCustomGridViewCellViewInfo)
private
FAdditionalWidth: Integer;
FAreaViewInfos: TList;
FColumn: TcxGridColumn;
FContainer: TcxGridColumnContainerViewInfo;
FHasTextOffsetLeft: Boolean;
FHasTextOffsetRight: Boolean;
FNeighbors: TcxNeighbors;
FRealWidth: Integer;
FTextAreaBounds: TRect;
FWidth: Integer;
function GetAreaViewInfoCount: Integer;
function GetAreaViewInfo(Index: Integer): TcxGridColumnHeaderAreaViewInfo;
function GetGridView: TcxGridTableView;
function GetGridViewInfo: TcxGridTableViewInfo;
function GetIndex: Integer;
function GetIsFixed: Boolean;
function GetRealBounds: TRect;
function GetRealWidth: Integer;
procedure EnumAreaViewInfoClasses(AClass: TClass);
procedure CreateAreaViewInfos;
procedure DestroyAreaViewInfos;
protected
function CalculateHasTextOffsetLeft: Boolean; virtual;
function CalculateHasTextOffsetRight: 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 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;
procedure GetAreaViewInfoClasses(AProc: TcxGridClassEnumeratorProc); virtual;
function GetBackgroundBitmap: TBitmap; override;
function GetBorders: TcxBorders; override;
function GetBorderWidth(AIndex: TcxBorder): Integer; override;
function GetCanvas: TcxCanvas; override;
class function GetCellBorderWidth(ALookAndFeelPainter: TcxCustomLookAndFeelPainterClass): Integer; virtual;
class function GetCellHeight(ATextHeight: Integer;
ALookAndFeelPainter: TcxCustomLookAndFeelPainterClass): Integer; override;
function GetDataOffset: Integer; virtual;
function GetHitTestClass: TcxCustomGridHitTestClass; override;
function GetHotTrack: 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 HasGlyph: Boolean; virtual;
procedure InitHitTest(AHitTest: TcxCustomGridHitTest); override;
procedure Offset(DX, DY: Integer); override;
procedure SetWidth(Value: Integer); override;
procedure StateChanged; override;
property AdditionalWidth: Integer read FAdditionalWidth write FAdditionalWidth;
property AreaViewInfoCount: Integer read GetAreaViewInfoCount;
property AreaViewInfos[Index: Integer]: TcxGridColumnHeaderAreaViewInfo read GetAreaViewInfo;
property GridView: TcxGridTableView read GetGridView;
property GridViewInfo: TcxGridTableViewInfo read GetGridViewInfo;
property HasTextOffsetLeft: Boolean read FHasTextOffsetLeft;
property HasTextOffsetRight: Boolean read FHasTextOffsetRight;
public
constructor Create(AContainer: TcxGridColumnContainerViewInfo;
AColumn: TcxGridColumn); virtual;
destructor Destroy; override;
procedure Calculate(ALeftBound, ATopBound: Integer; AWidth: Integer = -1;
AHeight: Integer = -1); override;
function GetBestFitWidth: Integer; virtual;
function GetHitTest(const P: TPoint): TcxCustomGridHitTest; override;
procedure InitAutoWidthItem(AAutoWidthItem: TcxAutoWidthItem);
function MouseDown(AHitTest: TcxCustomGridHitTest; AButton: TMouseButton;
AShift: TShiftState): Boolean; override;
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
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 GetColumn(Index: Integer): TcxGridColumn; override;
function GetColumnBackgroundBitmap: TBitmap; virtual;
function GetColumnCount: Integer; override;
function GetColumnNeighbors(AColumn: TcxGridColumn): TcxNeighbors; override;
function GetHitTestClass: TcxCustomGridHitTestClass; override;
function GetIsAutoWidth: Boolean; override;
function GetIsScrollable: Boolean; override;
function GetItemMultiLinePainting: 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 AutoHeight: Boolean read GetAutoHeight;
property ColumnBackgroundBitmap: TBitmap read GetColumnBackgroundBitmap;
public
constructor Create(AGridViewInfo: TcxGridTableViewInfo); 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)
protected
function CalculateHeight: Integer; override;
function InheritedCalculateHeight: Integer;
end;
TcxGridGroupByBoxViewInfoClass = class of TcxGridGroupByBoxViewInfo;
TcxGridGroupByBoxViewInfo = class(TcxGridColumnContainerViewInfo)
private
function GetGroupByBoxVerOffset: Integer;
function GetLinkLineBounds(Index: Integer; Horizontal: Boolean): TRect;
protected
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 GetColumn(Index: Integer): TcxGridColumn; override;
function GetColumnCount: Integer; override;
function GetColumnWidth(AColumn: TcxGridColumn): Integer; override;
function GetHitTestClass: TcxCustomGridHitTestClass; override;
function GetIsAutoWidth: Boolean; override;
function GetIsScrollable: Boolean; override;
function GetItemClass: TcxGridColumnHeaderViewInfoClass; 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 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
TcxGridFooterCellViewInfo = class(TcxGridColumnHeaderViewInfo)
private
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 GetIsPressed: Boolean; override;
function GetPainterClass: TcxCustomGridCellPainterClass; override;
function GetSummaryItemIndex: Integer; virtual;
function GetText: string; override;
procedure GetViewParams(var AParams: TcxViewParams); override;
function GetVisible: Boolean; override;
function HasCustomDraw: Boolean; override;
property Summary: TcxDataSummary read GetSummary;
public
function GetBestFitWidth: Integer; override;
property SummaryItemIndex: Integer read GetSummaryItemIndex;
end;
TcxGridFooterViewInfoClass = class of TcxGridFooterViewInfo;
TcxGridFooterViewInfo = class(TcxGridHeaderViewInfo)
protected
function CalculateBounds: TRect; override;
function CalculateHeight: Integer; override;
function CalculateItemHeight: Integer; override;
procedure CalculateItem(AIndex: Integer); virtual;
procedure CalculateItems; override;
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 GetItemClass: TcxGridColumnHeaderViewInfoClass; override;
function GetItemHeight(AIndex: Integer): Integer; virtual;
function GetItemLeftBound(AIndex: Integer): Integer; virtual;
function GetItemsAreaBounds: TRect; override;
function GetItemTopBound(AIndex: Integer): Integer; virtual;
function GetKind: TcxGridColumnContainerKind; override;
function GetPainterClass: TcxCustomGridCellPainterClass; override;
function GetSeparatorBounds: TRect; virtual;
function GetSeparatorColor: TColor; virtual;
function GetSeparatorWidth: Integer; 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;
public
property BordersBounds: TRect read GetBordersBounds;
property SeparatorBounds: TRect read GetSeparatorBounds;
property SeparatorColor: TColor read GetSeparatorColor;
property SeparatorWidth: Integer read GetSeparatorWidth;
end;
// filter
TcxGridFilterButtonAlignment = (fbaLeft, fbaRight);
TcxCustomGridFilterButtonViewInfoClass = class of TcxCustomGridFilterButtonViewInfo;
TcxCustomGridFilterButtonViewInfo = class(TcxCustomGridViewCellViewInfo)
private
FContainer: TcxGridFilterButtonsViewInfo;
function GetFilter: TcxDataFilterCriteria;
function GetGridView: TcxGridTableView;
protected
function GetAlignment: TcxGridFilterButtonAlignment; virtual;
function GetCanvas: TcxCanvas; override;
function GetHotTrack: Boolean; override;
function GetVisible: Boolean; override;
procedure StateChanged; override;
property Container: TcxGridFilterButtonsViewInfo read FContainer;
property Filter: TcxDataFilterCriteria read GetFilter;
public
constructor Create(AContainer: TcxGridFilterButtonsViewInfo); virtual;
property Alignment: TcxGridFilterButtonAlignment read GetAlignment;
property GridView: TcxGridTableView read GetGridView;
end;
TcxGridFilterCloseButtonViewInfo = class(TcxCustomGridFilterButtonViewInfo)
protected
function CalculateHeight: Integer; override;
function CalculateWidth: Integer; override;
procedure Click; override;
function GetHitTestClass: TcxCustomGridHitTestClass; override;
function GetPainterClass: TcxCustomGridCellPainterClass; override;
end;
TcxGridFilterActivateButtonViewInfo = class(TcxCustomGridFilterButtonViewInfo)
private
function GetChecked: Boolean;
protected
function CalculateHeight: Integer; override;
function CalculateWidth: Integer; override;
procedure Click; override;
function GetHitTestClass: TcxCustomGridHitTestClass; override;
function GetPainterClass: TcxCustomGridCellPainterClass; override;
public
property Checked: Boolean read GetChecked;
end;
TcxGridFilterCustomizeButtonViewInfo = class(TcxCustomGridFilterButtonViewInfo)
protected
function CalculateHeight: Integer; override;
function CalculateWidth: Integer; override;
procedure Click; override;
function GetAlignment: TcxGridFilterButtonAlignment; override;
function GetAlignmentHorz: TAlignment; override;
function GetAlignmentVert: TcxAlignmentVert; override;
function GetBorders: TcxBorders; override;
function GetBorderWidth(AIndex: TcxBorder): Integer; override;
function GetHitTestClass: TcxCustomGridHitTestClass; override;
function GetPainterClass: TcxCustomGridCellPainterClass; override;
function GetText: string; override;
function GetTextAreaBounds: TRect; override;
procedure GetViewParams(var AParams: TcxViewParams); override;
function GetVisible: Boolean; override;
end;
TcxGridFilterButtonsViewInfoClass = class of TcxGridFilterButtonsViewInfo;
TcxGridFilterButtonsViewInfo = class
private
FFilterViewInfo: TcxGridFilterViewInfo;
FItems: TList;
function GetCount: Integer;
function GetGridView: TcxGridTableView;
function GetHeight: Integer;
function GetItem(Index: Integer): TcxCustomGridFilterButtonViewInfo;
function GetWidth(AAlignment: TcxGridFilterButtonAlignment): Integer;
function GetWidthLeftPart: Integer;
function GetWidthRightPart: Integer;
procedure DestroyItems;
protected
procedure AddItems; virtual;
property FilterViewInfo: TcxGridFilterViewInfo read FFilterViewInfo;
property GridView: TcxGridTableView read GetGridView;
public
constructor Create(AFilterViewInfo: TcxGridFilterViewInfo); virtual;
destructor Destroy; override;
procedure AddItem(AItemClass: TcxCustomGridFilterButtonViewInfoClass);
procedure Calculate(const ABounds: TRect); virtual;
function GetHitTest(const P: TPoint): TcxCustomGridHitTest; virtual;
property Count: Integer read GetCount;
property Height: Integer read GetHeight;
property Items[Index: Integer]: TcxCustomGridFilterButtonViewInfo read GetItem; default;
property WidthLeftPart: Integer read GetWidthLeftPart;
property WidthRightPart: Integer read GetWidthRightPart;
end;
TcxGridFilterViewInfoClass = class of TcxGridFilterViewInfo;
TcxGridFilterViewInfo = class(TcxCustomGridPartViewInfo)
private
FButtonsViewInfo: TcxGridFilterButtonsViewInfo;
function GetFilter: TcxDataFilterCriteria;
function GetFiltering: TcxGridTableFiltering;
procedure CreateButtonsViewInfo;
procedure DestroyButtonsViewInfo;
protected
function CalculateButtonsViewInfoBounds: TRect; virtual;
function CalculateHeight: Integer; override;
function CalculateWidth: Integer; override;
function GetAlignment: TcxGridPartAlignment; override;
function GetAlignmentVert: TcxAlignmentVert; override;
function GetBackgroundBitmap: TBitmap; override;
function GetHitTestClass: TcxCustomGridHitTestClass; override;
function GetIsAutoWidth: Boolean; override;
function GetIsScrollable: Boolean; override;
function GetPainterClass: TcxCustomGridCellPainterClass; override;
function GetText: string; override;
function GetTextAreaBounds: TRect; override;
procedure GetViewParams(var AParams: TcxViewParams); override;
function GetVisible: Boolean; override;
function GetButtonsViewInfoClass: TcxGridFilterButtonsViewInfoClass; virtual;
property Filter: TcxDataFilterCriteria read GetFilter;
property Filtering: TcxGridTableFiltering read GetFiltering;
public
constructor Create(AGridViewInfo: TcxGridTableViewInfo); override;
destructor Destroy; override;
procedure Calculate(ALeftBound, ATopBound: Integer; AWidth: Integer = -1;
AHeight: Integer = -1); override;
// procedure Calculate; override;
function GetHitTest(const P: TPoint): TcxCustomGridHitTest; override;
property ButtonsViewInfo: TcxGridFilterButtonsViewInfo read FButtonsViewInfo;
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); virtual;
destructor Destroy; override;
property Container: TcxGridIndicatorViewInfo read FContainer;
property GridView: TcxGridTableView read GetGridView;
property GridViewInfo: TcxGridTableViewInfo read GetGridViewInfo;
end;
TcxGridIndicatorHeaderItemViewInfo = class(TcxCustomGridIndicatorItemViewInfo)
protected
function GetPainterClass: TcxCustomGridCellPainterClass; override;
end;
TcxGridIndicatorRowItemViewInfo = class(TcxCustomGridIndicatorItemViewInfo)
private
FRowViewInfo: TcxCustomGridRowViewInfo;
function GetGridRecord: TcxCustomGridRow;
function GetGridView: TcxGridTableView;
protected
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 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 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;
function AddItem(AItemClass: TcxCustomGridIndicatorItemViewInfoClass): TcxCustomGridIndicatorItemViewInfo; overload;
function AddItem(ATopBound, AHeight: Integer;
AItemClass: TcxCustomGridIndicatorItemViewInfoClass): TcxCustomGridIndicatorItemViewInfo; overload;
public
constructor Create(AGridViewInfo: TcxGridTableViewInfo); virtual;
destructor Destroy; override;
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 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;
function GetRowViewInfo: TcxCustomGridRowViewInfo;
protected
function GetHitTestClass: TcxCustomGridHitTestClass; override;
function GetSummaryItemIndex: Integer; override;
function GetText: string; override;
procedure GetViewParams(var AParams: TcxViewParams); override;
public
property Container: TcxGridRowFooterViewInfo read GetContainer;
property GridRecord: TcxCustomGridRow read GetGridRecord;
property RowViewInfo: TcxCustomGridRowViewInfo read GetRowViewInfo;
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 CalculateBounds: TRect; override;
function CalculateWidth: Integer; override;
function GetColumnWidth(AColumn: TcxGridColumn): Integer; override;
function GetHitTestClass: TcxCustomGridHitTestClass; override;
function GetIsPart: Boolean; override;
function GetItemClass: TcxGridColumnHeaderViewInfoClass; override;
procedure GetViewParams(var AParams: TcxViewParams); override;
function GetVisible: Boolean; override;
function HasSeparator: Boolean; override;
property Indent: Integer read GetIndent;
public
constructor Create(AContainer: TcxGridRowFootersViewInfo; ALevel: Integer); reintroduce; virtual;
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;
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(Index: 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(ACellIndex: Integer): Integer;
function GetHitTest(const P: TPoint): TcxCustomGridHitTest; virtual;
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[Index: 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 GetHasSeparator: Boolean;
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 GetSeparatorWidth: Integer;
procedure CreateFootersViewInfo;
procedure DestroyFootersViewInfo;
procedure RecreateFootersViewInfo;
protected
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; abstract;
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 GetLastHorzGridLineBounds: TRect; virtual;
function GetMaxHeight: Integer; virtual;
function GetNonBaseHeight: Integer; virtual;
function GetRowHeight: Integer; virtual;
function GetSeparatorBounds: TRect; virtual;
function GetSeparatorColor: TColor; virtual;
function GetShowSeparator: Boolean; virtual;
function GetVisible: Boolean; override;
function GetWidth: Integer; override;
function HasFooter(ALevel: Integer): 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;
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 GridView: TcxGridTableView read GetGridView;
property GridLines: TcxGridLines read GetGridLines;
property GridRecord: TcxCustomGridRow read GetGridRecord;
property GridViewInfo: TcxGridTableViewInfo read GetGridViewInfo;
property HasSeparator: Boolean read GetHasSeparator;
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;
end;
// rows
TcxGridRowsViewInfoClass = class of TcxGridRowsViewInfo;
TcxGridRowsViewInfo = class(TcxCustomGridRecordsViewInfo)
private
FContentBounds: TRect;
FDataRowHeight: Integer;
FGroupRowHeight: Integer;
FNewItemRowViewInfo: TcxCustomGridRowViewInfo;
FRestHeight: Integer;
FRowHeight: Integer;
function GetGridView: TcxGridTableView;
function GetGridLines: TcxGridLines;
function GetGridViewInfo: TcxGridTableViewInfo;
function GetHasNewItemRecord: Boolean;
function GetHeaderViewInfo: TcxGridHeaderViewInfo;
function GetItem(Index: Integer): TcxCustomGridRowViewInfo;
function GetNewItemRowViewInfo: TcxCustomGridRowViewInfo;
function GetPainterClassValue: TcxGridRowsPainterClass;
function GetViewData: TcxGridViewData;
protected
FPartVisibleCount: Integer;
procedure Calculate; override;
function CalculateBounds: TRect; override;
procedure CalculateConsts; virtual;
function CalculateContentBounds: TRect; virtual;
function CalculateDataRowHeight: Integer; virtual;
function CalculateGroupRowHeight: Integer; virtual;
function CalculateRestHeight(ATopBound: Integer): Integer; virtual;
function CalculateRowHeight: Integer; virtual;
procedure CalculateVisibleCount; override;
function GetAutoDataRecordHeight: Boolean; override;
function GetCommonDataRowHeight: Integer; virtual;
function GetGroupBackgroundBitmap: TBitmap; 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 GetShowNewItemRow: Boolean; virtual;
function HasLastHorzGridLine(ARowViewInfo: TcxCustomGridRowViewInfo): Boolean; virtual;
procedure OffsetItem(AIndex, AOffset: Integer); override;
property GridView: TcxGridTableView read GetGridView;
property GridViewInfo: TcxGridTableViewInfo read GetGridViewInfo;
property HasNewItemRecord: Boolean read GetHasNewItemRecord;
property HeaderViewInfo: TcxGridHeaderViewInfo read GetHeaderViewInfo;
property IsScrollable: Boolean read GetIsScrollable;
property ShowNewItemRow: Boolean read GetShowNewItemRow;
property ViewData: TcxGridViewData read GetViewData;
public
destructor Destroy; override;
procedure AfterConstruction; override;
function CalculateCustomGroupRowHeight(AParams: TcxViewParams): Integer; virtual;
function CanDataRowSize: Boolean; virtual;
function GetCellHeight(ACellContentHeight: Integer): Integer; override;
function GetDataRowCellsAreaViewInfoClass: TClass; virtual;
function GetFooterCellBestFitWidth(ACellIndex: Integer): Integer;
function GetHitTest(const P: TPoint): TcxCustomGridHitTest; override;
function GetRealItem(ARecord: TcxCustomGridRecord; ARecordIndex: Integer): TcxCustomGridRecordViewInfo; override;
function GetRestHeight(ATopBound: Integer): Integer; virtual;
function IsDataRowHeightAssigned: Boolean; virtual;
procedure Offset(DX, DY: Integer); override;
property CommonDataRowHeight: Integer read GetCommonDataRowHeight;
property ContentBounds: TRect read FContentBounds;
property DataRowHeight: Integer read FDataRowHeight;
property GridLines: TcxGridLines read GetGridLines;
property GroupBackgroundBitmap: TBitmap read GetGroupBackgroundBitmap;
property GroupRowHeight: Integer read FGroupRowHeight write FGroupRowHeight;
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;
FFooterViewInfo: TcxGridFooterViewInfo;
FFilterViewInfo: TcxGridFilterViewInfo;
FGroupByBoxViewInfo: TcxGridGroupByBoxViewInfo;
FHeaderViewInfo: TcxGridHeaderViewInfo;
FIndicatorViewInfo: TcxGridIndicatorViewInfo;
FParts: TList;
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 GetPart(Index: Integer): TcxCustomGridPartViewInfo;
function GetPartCount: Integer;
function GetPartsBottomHeight: Integer;
function GetPartsCustomHeight(AAlignment: TcxGridPartAlignment): Integer;
function GetPartsTopHeight: Integer;
function GetRecordsViewInfo: TcxGridRowsViewInfo;
function GetViewData: TcxGridViewData;
procedure AddPart(AItem: TcxCustomGridPartViewInfo);
procedure RemovePart(AItem: TcxCustomGridPartViewInfo);
protected
procedure AfterCalculating; override;
procedure BeforeCalculating; override;
procedure CreateViewInfos; override;
procedure DestroyViewInfos(AIsRecreating: Boolean); override;
procedure Calculate; override;
function CalculateClientBounds: TRect; override;
procedure CalculateHeight(const AMaxSize: TPoint; var AHeight: Integer;
var AFullyVisible: Boolean); override;
function CalculateVisibleEqualHeightRecordCount: Integer; override;
procedure CalculateWidth(const AMaxSize: TPoint; var AWidth: Integer); override;
function GetDefaultGridModeBufferCount: Integer; override;
procedure Offset(DX, DY: Integer); override;
procedure RecreateViewInfos; override;
function GetFooterPainterClass: TcxGridFooterPainterClass; virtual;
function GetRecordsViewInfoClass: TcxCustomGridRecordsViewInfoClass; override;
function CalculateDataWidth: Integer; virtual;
function CalculatePartBounds(APart: TcxCustomGridPartViewInfo): TRect; virtual;
function GetFilterViewInfoClass: TcxGridFilterViewInfoClass; virtual;
function GetFirstItemAdditionalWidth: Integer; virtual;
function GetFooterViewInfoClass: TcxGridFooterViewInfoClass; virtual;
function GetGridLineWidth: Integer; virtual;
function GetGroupByBoxViewInfoClass: TcxGridGroupByBoxViewInfoClass; virtual;
function GetHeaderViewInfoClass: TcxGridHeaderViewInfoClass; virtual;
function GetIndicatorViewInfoClass: TcxGridIndicatorViewInfoClass; virtual;
function GetLevelSeparatorColor: TColor; virtual;
function GetHeaderViewInfoSpecificClass: TcxGridHeaderViewInfoSpecificClass; virtual;
function GetNonRowsAreaHeight(ACheckScrollBar: Boolean): Integer; virtual;
function GetScrollableAreaBoundsHorz: TRect; override;
function GetScrollableAreaBoundsVert: TRect; override;
property Controller: TcxGridTableController read GetController;
property PartCount: Integer read GetPartCount;
property Parts[Index: Integer]: TcxCustomGridPartViewInfo read GetPart;
property ViewData: TcxGridViewData read GetViewData;
public
constructor Create(AGridView: TcxCustomGridView); override;
destructor Destroy; override;
function GetCellBorders(AIsRight, AIsBottom: Boolean): TcxBorders; virtual;
function GetCellHeight(AIndex, ACellHeight: Integer): Integer; virtual;
function GetCellTopOffset(AIndex, ACellHeight: Integer): Integer; virtual;
function GetHitTest(const P: TPoint): TcxCustomGridHitTest; override;
function GetOffsetBounds(AItemsOffset: Integer; out AUpdateBounds: TRect): TRect; overload; virtual;
function GetOffsetBounds(DX, DY: Integer; out AUpdateBounds: TRect): TRect; overload; 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 FilterViewInfo: TcxGridFilterViewInfo read FFilterViewInfo;
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 LevelIndentBackgroundBitmap: TBitmap read GetLevelIndentBackgroundBitmap;
property LevelIndentColors[Index: Integer]: TColor read GetLevelIndentColor;
property LevelSeparatorColor: TColor read GetLevelSeparatorColor;
property PartsBottomHeight: Integer read GetPartsBottomHeight;
property PartsTopHeight: Integer read GetPartsTopHeight;
property RecordsViewInfo: TcxGridRowsViewInfo read GetRecordsViewInfo;
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
FIsDetailsSiteHeightAssigned: Boolean;
FIsDetailsSiteNormalHeightAssigned: Boolean;
FIsDetailsSiteWidthAssigned: Boolean;
FDetailsSiteHeight: Integer;
FDetailsSiteNormalHeight: Integer;
FDetailsSiteWidth: Integer;
FUnassigningValues: Boolean;
function GetGridRecord: TcxGridMasterDataRow;
procedure SetDetailsSiteHeight(Value: Integer);
procedure SetDetailsSiteNormalHeight(Value: Integer);
procedure SetDetailsSiteWidth(Value: Integer);
protected
property GridRecord: TcxGridMasterDataRow read GetGridRecord;
public
procedure UnassignValues(AKeepMaster: Boolean); override;
property IsDetailsSiteHeightAssigned: Boolean read FIsDetailsSiteHeightAssigned
write FIsDetailsSiteHeightAssigned;
property IsDetailsSiteNormalHeightAssigned: Boolean read FIsDetailsSiteNormalHeightAssigned
write FIsDetailsSiteNormalHeightAssigned;
property IsDetailsSiteWidthAssigned: Boolean read FIsDetailsSiteWidthAssigned
write FIsDetailsSiteWidthAssigned;
property DetailsSiteHeight: Integer read FDetailsSiteHeight write SetDetailsSiteHeight;
property DetailsSiteNormalHeight: Integer read FDetailsSiteNormalHeight
write SetDetailsSiteNormalHeight;
property DetailsSiteWidth: Integer read FDetailsSiteWidth write SetDetailsSiteWidth;
end;
TcxGridTableViewInfoCache = class(TcxCustomGridTableViewInfoCache)
protected
function GetItemClass: TcxCustomGridViewInfoCacheItemClass; override;
end;
{ view }
// column
TcxGridColumnOptions = class(TcxCustomGridTableItemOptions)
private
FHorzSizing: Boolean;
function GetGridView: TcxGridTableView;
procedure SetHorzSizing(Value: Boolean);
protected
property GridView: TcxGridTableView read GetGridView;
public
constructor Create(AItem: TcxCustomGridTableItem); override;
procedure Assign(Source: TPersistent); override;
published
property Grouping;
property HorzSizing: Boolean read FHorzSizing write SetHorzSizing default True;
property Moving;
property Sorting;
end;
TcxGridGetHeaderStyleEvent = procedure(Sender: TcxGridTableView;
AColumn: TcxGridColumn; {$IFDEF BCB}var{$ELSE}out{$ENDIF} AStyle: TcxStyle) of object;
TcxGridColumnStyles = class(TcxCustomGridTableItemStyles)
private
FOnGetFooterStyle: TcxGridGetCellStyleEvent;
FOnGetHeaderStyle: TcxGridGetHeaderStyleEvent;
function GetGridViewValue: TcxGridTableView;
function GetItem: TcxGridColumn;
protected
procedure GetDefaultViewParams(Index: Integer; AData: TObject; out AParams: TcxViewParams); override;
public
procedure Assign(Source: TPersistent); override;
procedure GetFooterParams(ARecord: TcxCustomGridRecord; 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 Header: TcxStyle index isHeader read GetValue write SetValue;
property OnGetFooterStyle: TcxGridGetCellStyleEvent read FOnGetFooterStyle write FOnGetFooterStyle;
property OnGetHeaderStyle: TcxGridGetHeaderStyleEvent read FOnGetHeaderStyle write FOnGetHeaderStyle;
end;
TcxGridColumnCustomDrawHeaderEvent = procedure(Sender: TcxGridTableView; ACanvas: TcxCanvas;
AViewInfo: TcxGridColumnHeaderViewInfo; var ADone: Boolean) of object;
TcxGridColumnUserFilteringEvent = procedure(Sender: TcxGridColumn;
const AValue: Variant; const ADisplayText: string) of object;
TcxGridColumn = class(TcxCustomGridTableItem)
private
FFooterAlignmentHorz: TAlignment;
FHeaderGlyph: TBitmap;
FHeaderGlyphAlignmentHorz: TAlignment;
FHeaderGlyphAlignmentVert: TcxAlignmentVert;
FHidden: Boolean;
FIsFooterAlignmentHorzAssigned: Boolean;
FOnCustomDrawFooterCell: TcxGridColumnCustomDrawHeaderEvent;
FOnCustomDrawHeader: TcxGridColumnCustomDrawHeaderEvent;
FOnHeaderClick: TNotifyEvent;
FOnUserFiltering: TcxGridColumnUserFilteringEvent;
function GetFooterAlignmentHorz: TAlignment;
function GetGridView: TcxGridTableView;
function GetHidden: Boolean;
function GetIsPreview: Boolean;
function GetOptions: TcxGridColumnOptions;
function GetStyles: TcxGridColumnStyles;
procedure SetFooterAlignmentHorz(Value: TAlignment);
procedure SetHeaderGlyph(Value: TBitmap);
procedure SetHeaderGlyphAlignmentHorz(Value: TAlignment);
procedure SetHeaderGlyphAlignmentVert(Value: TcxAlignmentVert);
procedure SetHidden(Value: Boolean);
procedure SetIsPreview(Value: Boolean);
procedure SetOptions(Value: TcxGridColumnOptions);
procedure SetStyles(Value: TcxGridColumnStyles);
function IsFooterAlignmentHorzStored: Boolean;
function IsHiddenStored: 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;
procedure AssignColumnWidths; virtual;
function CanFilter(ACheckGridViewOptions: Boolean): Boolean; override;
function CanHorzSize: Boolean; override;
procedure CaptionChanged; override;
procedure ForceWidth(Value: Integer); override;
function GetBestFitWidth: Integer; override;
function GetFilterable: Boolean; 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 GetVisible: Boolean; override;
function HasCustomDrawFooterCell: Boolean;
function HasCustomDrawHeader: Boolean;
procedure HiddenChanged; virtual;
function HideOnGrouping: Boolean; virtual;
function IsVisibleStored: Boolean; override;
//procedure VisibleChanged; dynamic;
function GetHeaderViewInfoClass: TcxGridColumnHeaderViewInfoClass;
function GetOptionsClass: TcxCustomGridTableItemOptionsClass; override;
function GetStylesClass: TcxCustomGridTableItemStylesClass; override;
function GetViewInfoClass: TcxCustomGridCellViewInfoClass;
procedure DoCustomDrawFooterCell(ACanvas: TcxCanvas; AViewInfo: TcxGridColumnHeaderViewInfo;
var ADone: Boolean); virtual;
procedure DoCustomDrawHeader(ACanvas: TcxCanvas; AViewInfo: TcxGridColumnHeaderViewInfo;
var ADone: Boolean); virtual;
procedure DoHeaderClick; virtual;
procedure DoUserFiltering(const AValue: Variant; const ADisplayText: string); virtual;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Assign(Source: TPersistent); override;
property GridView: TcxGridTableView read GetGridView;
property Filtered;
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;
published
property FooterAlignmentHorz: TAlignment read GetFooterAlignmentHorz write SetFooterAlignmentHorz
stored IsFooterAlignmentHorzStored;
property GroupIndex;
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 Hidden: Boolean read GetHidden write SetHidden stored IsHiddenStored;
property MinWidth;
property Options: TcxGridColumnOptions read GetOptions write SetOptions;
property SortOrder;
property Styles: TcxGridColumnStyles read GetStyles write SetStyles;
property Width;
property OnCustomDrawFooterCell: TcxGridColumnCustomDrawHeaderEvent read FOnCustomDrawFooterCell write FOnCustomDrawFooterCell;
property OnCustomDrawHeader: TcxGridColumnCustomDrawHeaderEvent read FOnCustomDrawHeader write FOnCustomDrawHeader;
property OnHeaderClick: TNotifyEvent read FOnHeaderClick write FOnHeaderClick;
property OnGetFilterDisplayText;
property OnGetFilterValues;
property OnUserFiltering: TcxGridColumnUserFilteringEvent read FOnUserFiltering write FOnUserFiltering;
end;
// options
{4}
TcxGridTableBackgroundBitmaps = class(TcxCustomGridTableBackgroundBitmaps)
protected
function GetBitmapStyleIndex(Index: Integer): Integer; override;
public
procedure Assign(Source: TPersistent); override;
published
property FilterBox: TBitmap index bbFilterBox read GetValue write SetValue;
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;
// behavior
TcxGridTableOptionsBehavior = class(TcxCustomGridTableOptionsBehavior)
private
FExpandMasterRowOnDblClick: Boolean;
public
constructor Create(AGridView: TcxCustomGridView); override;
procedure Assign(Source: TPersistent); override;
published
property BestFitMaxRecordCount;
property ExpandMasterRowOnDblClick: Boolean read FExpandMasterRowOnDblClick write FExpandMasterRowOnDblClick default True;
property FocusCellOnCycle;
property PullFocusing;
end;
// filter
TcxGridFilterItemList = class;
TcxCustomGridFilterItem = class
private
FParent: TcxGridFilterItemList;
protected
function GetIsList: Boolean; virtual; abstract;
public
constructor Create(AParent: TcxGridFilterItemList);
destructor Destroy; override;
property IsList: Boolean read GetIsList;
property Parent: TcxGridFilterItemList read FParent;
end;
TcxGridFilterItem = class(TcxCustomGridFilterItem)
private
FDisplayText: string;
FColumn: TcxGridColumn;
FOperatorKind: TcxFilterOperatorKind;
FValue: Variant;
protected
function GetIsList: Boolean; override;
public
constructor Create(AParent: TcxGridFilterItemList; AColumn: TcxGridColumn;
AOperatorKind: TcxFilterOperatorKind; const AValue: Variant;
const ADisplayText: string);
property Column: TcxGridColumn read FColumn;
property DisplayText: string read FDisplayText write FDisplayText;
property OperatorKind: TcxFilterOperatorKind read FOperatorKind write FOperatorKind;
property Value: Variant read FValue write FValue;
end;
TcxGridFilterItemList = class(TcxCustomGridFilterItem)
private
FBoolOperatorKind: TcxFilterBoolOperatorKind;
FItems: TList;
FOnChange: TNotifyEvent;
function GetCount: Integer;
function GetItem(Index: Integer): TcxCustomGridFilterItem;
procedure SetBoolOperatorKind(Value: TcxFilterBoolOperatorKind);
procedure InternalAddItem(AItem: TcxCustomGridFilterItem);
procedure InternalRemoveItem(AItem: TcxCustomGridFilterItem);
protected
procedure Changed; virtual;
function GetIsList: Boolean; override;
public
constructor Create(AParent: TcxGridFilterItemList; ABoolOperatorKind: TcxFilterBoolOperatorKind);
destructor Destroy; override;
function AddItem(AColumn: TcxGridColumn; AOperatorKind: TcxFilterOperatorKind;
const AValue: Variant; const ADisplayText: string): TcxGridFilterItem;
function AddItemList(ABoolOperatorKind: TcxFilterBoolOperatorKind): TcxGridFilterItemList;
procedure Assign(ACriteriaItemList: TcxFilterCriteriaItemList);
procedure AssignTo(ACriteriaItemList: TcxFilterCriteriaItemList);
procedure Clear;
function HasItem(AItem: TcxCustomGridFilterItem): Boolean;
property BoolOperatorKind: TcxFilterBoolOperatorKind read FBoolOperatorKind
write SetBoolOperatorKind;
property Count: Integer read GetCount;
property Items[Index: Integer]: TcxCustomGridFilterItem read GetItem; default;
property OnChange: TNotifyEvent read FOnChange write FOnChange;
end;
TcxGridTableFiltering = class(TcxCustomGridTableFiltering)
published
property CustomizeDialog;
property DropDownWidth;
property MaxDropDownCount;
property Visible;
end;
// customize
TcxGridTableOptionsCustomizeClass = class of TcxGridTableOptionsCustomize;
TcxGridTableOptionsCustomize = class(TcxCustomGridTableOptionsCustomize)
private
FColumnFiltering: Boolean;
FColumnHiding: Boolean;
FColumnHidingOnGrouping: Boolean;
FColumnHorzSizing: Boolean;
FDataRowSizing: Boolean;
FGroupRowSizing: Boolean;
function GetColumnGrouping: Boolean;
function GetColumnMoving: Boolean;
function GetColumnSorting: Boolean;
function GetGridView: TcxGridTableView;
procedure SetColumnFiltering(Value: Boolean);
procedure SetColumnGrouping(Value: Boolean);
procedure SetColumnHorzSizing(Value: Boolean);
procedure SetColumnMoving(Value: Boolean);
procedure SetColumnSorting(Value: Boolean);
public
constructor Create(AGridView: TcxCustomGridView); override;
procedure Assign(Source: TPersistent); override;
property GridView: TcxGridTableView read GetGridView;
published
property ColumnFiltering: Boolean read FColumnFiltering write SetColumnFiltering default True;
property ColumnGrouping: Boolean read GetColumnGrouping write SetColumnGrouping default True;
property ColumnHiding: Boolean read FColumnHiding write FColumnHiding default False;
property ColumnHidingOnGrouping: Boolean read FColumnHidingOnGrouping write FColumnHidingOnGrouping 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 DataRowSizing: Boolean read FDataRowSizing write FDataRowSizing default False;
property GroupRowSizing: Boolean read FGroupRowSizing write FGroupRowSizing default False;
end;
// data
TcxGridTableOptionsData = class(TcxCustomGridTableOptionsData);
// selection
TcxGridTableOptionsSelection = class(TcxCustomGridTableOptionsSelection);
// view
TcxGridGroupFootersMode = (gfInvisible, gfVisibleWhenExpanded, gfAlwaysVisible);
TcxGridTableOptionsView = class(TcxCustomGridTableOptionsView)
private
FColumnAutoWidth: Boolean;
FDataRowHeight: Integer;
FExpandButtonsForEmptyDetails: Boolean;
FFooter: Boolean;
FGridLineColor: TColor;
FGridLines: TcxGridLines;
FGroupByBox: Boolean;
FGroupFooters: TcxGridGroupFootersMode;
FGroupRowHeight: Integer;
FHeader: Boolean;
FHeaderHeight: Integer;
FIndicator: Boolean;
FIndicatorWidth: Integer;
FNewItemRow: Boolean;
FNewItemRowInfoText: string;
FNewItemRowSeparatorColor: TColor;
FNewItemRowSeparatorWidth: Integer;
FRowSeparatorColor: TColor;
FRowSeparatorWidth: Integer;
function GetGridView: TcxGridTableView;
function GetHeaderAutoHeight: Boolean;
function GetHeaderEndEllipsis: Boolean;
procedure SetColumnAutoWidth(Value: Boolean);
procedure SetDataRowHeight(Value: Integer);
procedure SetExpandButtonsForEmptyDetails(Value: Boolean);
procedure SetFooter(Value: Boolean);
procedure SetGridLineColor(Value: TColor);
procedure SetGridLines(Value: TcxGridLines);
procedure SetGroupByBox(Value: Boolean);
procedure SetGroupFooters(Value: TcxGridGroupFootersMode);
procedure SetGroupRowHeight(Value: Integer);
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);
function IsNewItemRowInfoTextStored: Boolean;
protected
procedure ItemCaptionAutoHeightChanged; override;
public
constructor Create(AGridView: TcxCustomGridView); override;
procedure Assign(Source: TPersistent); override;
procedure CheckDataRowHeight(var AValue: Integer); virtual;
procedure CheckGroupRowHeight(var AValue: Integer); virtual;
function GetGridLineColor: TColor;
function GetNewItemRowSeparatorColor: TColor;
function GetRowSeparatorColor: TColor;
property GridView: TcxGridTableView read GetGridView;
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 FExpandButtonsForEmptyDetails
write SetExpandButtonsForEmptyDetails default True;
property Footer: Boolean read FFooter write SetFooter 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 GroupFooters: TcxGridGroupFootersMode read FGroupFooters write SetGroupFooters default gfInvisible;
property GroupRowHeight: Integer read FGroupRowHeight write SetGroupRowHeight default 0;
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 NewItemRow: Boolean read FNewItemRow write SetNewItemRow default False;
property NewItemRowInfoText: string read FNewItemRowInfoText write SetNewItemRowInfoText
stored IsNewItemRowInfoTextStored;
property NewItemRowSeparatorColor: TColor read FNewItemRowSeparatorColor
write SetNewItemRowSeparatorColor default clDefault;
property NewItemRowSeparatorWidth: Integer read FNewItemRowSeparatorWidth
write SetNewItemRowSeparatorWidth default cxGridDefaultNewItemRowSeparatorWidth;
property RowSeparatorColor: TColor read FRowSeparatorColor write SetRowSeparatorColor default clDefault;
property RowSeparatorWidth: Integer read FRowSeparatorWidth write SetRowSeparatorWidth default 0;
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;
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 SizeChanged;
function GridView: TcxGridTableView; reintroduce;
public
constructor Create(AGridView: TcxCustomGridView); override;
procedure Assign(Source: TPersistent); override;
property Active: Boolean read GetActive;
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
FOnGetFooterStyle: TcxGridGetCellStyleEvent;
FOnGetGroupStyle: TcxGridGetGroupStyleEvent;
FOnGetHeaderStyle: TcxGridGetHeaderStyleEvent;
FOnGetPreviewStyle: TcxGridGetCellStyleEvent;
function GetGridViewValue: TcxGridTableView;
protected
procedure GetDefaultViewParams(Index: Integer; AData: TObject; out AParams: TcxViewParams); override;
public
procedure Assign(Source: TPersistent); override;
procedure GetContentParams(ARecord: TcxCustomGridRecord; AItem: TcxCustomGridTableItem;
out AParams: TcxViewParams); override;
procedure GetFooterParams(ARecord: TcxCustomGridRecord; AItem: TcxGridColumn;
out AParams: TcxViewParams); virtual;
procedure GetGroupParams(ARecord: TcxCustomGridRecord; ALevel: Integer;
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 FilterBox: TcxStyle index vsFilterBox 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 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 OnGetFooterStyle: TcxGridGetCellStyleEvent read FOnGetFooterStyle write FOnGetFooterStyle;
property OnGetGroupStyle: TcxGridGetGroupStyleEvent read FOnGetGroupStyle write FOnGetGroupStyle;
property OnGetHeaderStyle: TcxGridGetHeaderStyleEvent read FOnGetHeaderStyle write FOnGetHeaderStyle;
property OnGetPreviewStyle: TcxGridGetCellStyleEvent read FOnGetPreviewStyle write FOnGetPreviewStyle;
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);
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);
published
property Column: TcxGridColumn read GetColumn write SetColumn;
end;
TcxGridTableSummaryItem = class(TcxDataSummaryItem,
{$IFNDEF DELPHI6}IUnknown,{$ENDIF} IcxStoredObject)
private
function GetColumn: TcxGridColumn;
function GetGridView: TcxGridTableView;
procedure SetColumn(Value: TcxGridColumn);
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;
TcxGridColumnEvent = procedure(Sender: TcxGridTableView; AColumn: TcxGridColumn) of object;
TcxGridIndicatorCellCustomDrawEvent = procedure(Sender: TcxGridTableView;
ACanvas: TcxCanvas; AViewInfo: TcxCustomGridIndicatorItemViewInfo; var ADone: Boolean) of object;
TcxGridPartCustomDrawBackgroundEvent = procedure(Sender: TcxGridTableView;
ACanvas: TcxCanvas; AViewInfo: TcxCustomGridCellViewInfo; var ADone: Boolean) of object;
TcxGridTableView = class(TcxCustomGridTableView)
private
FPreview: TcxGridPreview;
FOnColumnHeaderClick: TcxGridColumnEvent;
FOnColumnPosChanged: TcxGridColumnEvent;
FOnColumnSizeChanged: TcxGridColumnEvent;
FOnCustomDrawColumnHeader: TcxGridColumnCustomDrawHeaderEvent;
FOnCustomDrawFooterCell: TcxGridColumnCustomDrawHeaderEvent;
FOnCustomDrawGroupCell: TcxGridTableCellCustomDrawEvent;
FOnCustomDrawIndicatorCell: TcxGridIndicatorCellCustomDrawEvent;
FOnCustomDrawPartBackground: TcxGridPartCustomDrawBackgroundEvent;
FOnCustomization: TNotifyEvent;
FOnLeftPosChanged: TNotifyEvent;
function GetBackgroundBitmaps: TcxGridTableBackgroundBitmaps;
function GetColumn(Index: Integer): TcxGridColumn;
function GetColumnCount: Integer;
function GetController: TcxGridTableController;
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 GetViewInfoCache: TcxGridTableViewInfoCache;
function GetVisibleColumn(Index: Integer): TcxGridColumn;
function GetVisibleColumnCount: Integer;
procedure SetBackgroundBitmaps(Value: TcxGridTableBackgroundBitmaps);
procedure SetColumn(Index: Integer; Value: TcxGridColumn);
procedure SetFiltering(Value: TcxGridTableFiltering);
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;
procedure CreateOptions; override;
procedure DestroyOptions; override;
function CanOffset(ARecordCountDelta: Integer): Boolean; override;
function CanOffsetHorz: Boolean; virtual;
procedure DoAssign(ASource: TcxCustomGridView); override;
function GetIsControlFocused: Boolean; override;
function GetResizeOnBoundsChange: Boolean; override;
function HasCustomDrawColumnHeader: Boolean;
function HasCustomDrawFooterCell: Boolean;
function HasCustomDrawGroupCell: Boolean;
function HasCustomDrawIndicatorCell: Boolean;
function HasCustomDrawPartBackground: Boolean;
function IsEqualHeightRecords: Boolean; override;
procedure LookAndFeelChanged; override;
function GetControllerClass: TcxCustomGridControllerClass; override;
function GetDataControllerClass: TcxCustomDataControllerClass; override;
function GetPainterClass: TcxCustomGridPainterClass; override;
function GetViewDataClass: TcxCustomGridViewDataClass; override;
function GetViewInfoCacheClass: TcxCustomGridViewInfoCacheClass; override;
function GetViewInfoClass: TcxCustomGridViewInfoClass; override;
function GetBackgroundBitmapsClass: TcxCustomGridBackgroundBitmapsClass; override;
function GetFilteringClass: TcxCustomGridTableFilteringClass; override;
function GetOptionsBehaviorClass: TcxCustomGridTableOptionsBehaviorClass; override;
function GetOptionsCustomizeClass: TcxCustomGridTableOptionsCustomizeClass; 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;
procedure RemoveItem(AItem: TcxCustomGridTableItem); override;
procedure RefreshCustomizationForm;
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 DoCustomDrawIndicatorCell(ACanvas: TcxCanvas; AViewInfo: TcxCustomGridIndicatorItemViewInfo;
var ADone: Boolean); virtual;
procedure DoCustomDrawPartBackground(ACanvas: TcxCanvas; AViewInfo: TcxCustomGridCellViewInfo;
var ADone: Boolean); virtual;
procedure DoCustomization; virtual;
procedure DoLeftPosChanged; virtual;
public
destructor Destroy; override;
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 ViewInfoCache: TcxGridTableViewInfoCache read GetViewInfoCache;
property VisibleColumnCount: Integer read GetVisibleColumnCount;
property VisibleColumns[Index: Integer]: TcxGridColumn read GetVisibleColumn;
published
property BackgroundBitmaps: TcxGridTableBackgroundBitmaps read GetBackgroundBitmaps
write SetBackgroundBitmaps;
property Filtering: TcxGridTableFiltering read GetFiltering write SetFiltering;
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 FOnColumnHeaderClick;
property OnColumnPosChanged: TcxGridColumnEvent read FOnColumnPosChanged write FOnColumnPosChanged;
property OnColumnSizeChanged: TcxGridColumnEvent read FOnColumnSizeChanged write FOnColumnSizeChanged;
property OnCustomDrawColumnHeader: TcxGridColumnCustomDrawHeaderEvent read FOnCustomDrawColumnHeader write FOnCustomDrawColumnHeader;
property OnCustomDrawFooterCell: TcxGridColumnCustomDrawHeaderEvent read FOnCustomDrawFooterCell write FOnCustomDrawFooterCell;
property OnCustomDrawGroupCell: TcxGridTableCellCustomDrawEvent read FOnCustomDrawGroupCell write FOnCustomDrawGroupCell;
property OnCustomDrawIndicatorCell: TcxGridIndicatorCellCustomDrawEvent read FOnCustomDrawIndicatorCell write FOnCustomDrawIndicatorCell;
property OnCustomDrawPartBackground: TcxGridPartCustomDrawBackgroundEvent read FOnCustomDrawPartBackground write FOnCustomDrawPartBackground;
property OnCustomization: TNotifyEvent read FOnCustomization write FOnCustomization;
property OnFilterControlDialogShow;
property OnLeftPosChanged: TNotifyEvent read FOnLeftPosChanged write FOnLeftPosChanged;
end;
implementation
uses
SysUtils, Math,
{$IFDEF DELPHI6}
Variants,
{$ENDIF}
cxScrollBar, cxGridDetailsSite, cxGridRows, cxGridStrs, cxFilterConsts, cxLibraryConsts;
const
GroupByBoxLeftOffset = 6;
GroupByBoxTopOffset = 8;
GroupByBoxHorOffset = 4;
GroupByBoxLineVerOffset = 4;
GroupByBoxColumnWidth = 100;
GroupByBoxLineWidth = 1;
GroupByBoxLineColor = clBtnText;
HScrollDelta = 10;
FooterSeparatorWidth = 1;
FilterButtonsFirstOffset = 4;
FilterButtonsOffset = 4;
FilterTextOffset = 3;
TopIndexNone = -2;
RowIndexNone = -1;
ColumnHeaderHitTestCodes = [htColumnHeader];
ColumnHeaderMovingZoneSize = 15;
DragAndDropArrowWidth = 11;
DragAndDropArrowHeight = 9;
DragAndDropArrowBorderColor = clBlack;
DragAndDropArrowColor = clLime;
ColumnSizingMarkWidth = 1;
RowSizingMarkWidth = 1;
ScrollHotZoneWidth = 15;
ScrollTimeIntervalVert = 70;
ScrollTimeIntervalHorz = ScrollTimeIntervalVert div 2;
type
TcxControlAccess = class(TcxControl);
TcxCustomGridCellViewInfoAccess = class(TcxCustomGridCellViewInfo);
{ TcxCustomGridColumnHitTest }
{procedure TcxCustomGridColumnHitTest.Assign(Source: TcxCustomGridHitTest);
begin
if Source is TcxCustomGridColumnHitTest then
with TcxCustomGridColumnHitTest(Source) do
begin
Self.Column := Column;
end
else
inherited;
end;}
{ 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;
class 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;
{ TcxGridFilterHitTest }
class function TcxGridFilterHitTest.GetHitTestCode: Integer;
begin
Result := htFilter;
end;
{ TcxGridFilterCloseButtonHitTest }
class function TcxGridFilterCloseButtonHitTest.GetHitTestCode: Integer;
begin
Result := htFilterCloseButton;
end;
{ TcxGridFilterActivateButtonHitTest }
class function TcxGridFilterActivateButtonHitTest.GetHitTestCode: Integer;
begin
Result := htFilterActivateButton;
end;
{ TcxGridFilterCustomizeButtonHitTest }
class function TcxGridFilterCustomizeButtonHitTest.GetHitTestCode: Integer;
begin
Result := htFilterCustomizeButton;
end;
{ TcxGridRowIndicatorHitTest }
class function TcxGridRowIndicatorHitTest.GetHitTestCode: Integer;
begin
Result := htRowIndicator;
end;
{ TcxGridRowSizingEdgeHitTest }
class function TcxGridRowSizingEdgeHitTest.GetHitTestCode: Integer;
begin
Result := htRowSizingEdge;
end;
class 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;
{ TcxGridRowLevelIndentHitTest }
class function TcxGridRowLevelIndentHitTest.GetHitTestCode: Integer;
begin
Result := htRowLevelIndent;
end;
class function TcxGridRowLevelIndentHitTest.CanClick: Boolean;
begin
Result := False;
end;
{ TcxGridCustomozationFormHitTest }
class function TcxGridCustomozationFormHitTest.GetHitTestCode: Integer;
begin
Result := htCustomizationForm;
end;
{ TcxGridDragAndDropObject }
function TcxGridDragAndDropObject.GetController: TcxGridTableController;
begin
Result := TcxGridTableController(inherited Controller);
end;
function TcxGridDragAndDropObject.GetGridView: TcxGridTableView;
begin
Result := TcxGridTableView(inherited GridView);
end;
function TcxGridDragAndDropObject.GetViewInfo: TcxGridTableViewInfo;
begin
Result := TcxGridTableViewInfo(inherited ViewInfo);
end;
procedure TcxGridDragAndDropObject.AfterScrolling;
begin
end;
procedure TcxGridDragAndDropObject.BeforeScrolling;
begin
end;
{ TcxCustomGridMovingObject }
constructor TcxCustomGridMovingObject.Create(AControl: TcxControl);
begin
inherited;
FDragImagePos := Point(-1, -1);
end;
destructor TcxCustomGridMovingObject.Destroy;
begin
FSavingBitmap.Free;
inherited;
end;
function TcxCustomGridMovingObject.GetArrowPlace(AArrowNumber: TcxGridArrowNumber): TcxGridArrowPlace;
begin
Result := TcxGridArrowPlace(2 * Ord(AArrowNumber) + Ord(AreArrowsVertical));
{ if AreArrowsVertical then
if AArrowNumber = anFirst then
Result := apTop
else
Result := apBottom
else
if AArrowNumber = anFirst then
Result := apLeft
else
Result := apRight;}
end;
function TcxCustomGridMovingObject.GetCustomizationForm: TcxGridTableCustomizationForm;
begin
Result := Controller.CustomizationForm;
end;
function TcxCustomGridMovingObject.GetDragImageSavingCanvas: TCanvas;
begin
Result := DragImageSavingBitmap.Canvas;
end;
function TcxCustomGridMovingObject.GetSavingBitmap: TBitmap;
begin
if FSavingBitmap = nil then
begin
FSavingBitmap := TBitmap.Create;
with FSavingBitmap do
begin
Width := 2 * DragAndDropArrowWidth;
Height := DragAndDropArrowWidth;
end;
end;
Result := FSavingBitmap;
end;
function TcxCustomGridMovingObject.GetSavingCanvas: TCanvas;
begin
Result := SavingBitmap.Canvas;
end;
procedure TcxCustomGridMovingObject.CreateDragImage;
begin
FDragImage := TBitmap.Create;
FDragImageCanvas := TcxCanvas.Create(FDragImage.Canvas);
InitDragImage;
FDragImageSavingBitmap := TBitmap.Create;
with FDragImageSavingBitmap do
begin
Width := FDragImage.Width;
Height := FDragImage.Height;
end
end;
procedure TcxCustomGridMovingObject.DestroyDragImage;
begin
FreeAndNil(FDragImageSavingBitmap);
FreeAndNil(FDragImageCanvas);
FreeAndNil(FDragImage);
end;
procedure TcxCustomGridMovingObject.AfterScrolling;
begin
ChangeArrowsVisibility(True);
ChangeDragImagePosition(True);
inherited;
end;
procedure TcxCustomGridMovingObject.BeforeScrolling;
begin
inherited;
ChangeDragImagePosition(False);
ChangeArrowsVisibility(False);
end;
procedure TcxCustomGridMovingObject.DirtyChanged;
begin
inherited;
if Dirty then
ChangeDragImagePosition(False);
ChangeArrowsVisibility(not Dirty);
if not Dirty then
ChangeDragImagePosition(True);
end;
function TcxCustomGridMovingObject.GetDragAndDropCursor(Accepted: Boolean): TCursor;
begin
if Accepted then
Result := crArrow
else
if CanRemove then
Result := crcxGridRemove
else
Result := crcxGridNoDrop;
end;
procedure TcxCustomGridMovingObject.ChangeArrowsVisibility(AVisible: Boolean);
var
ACanvas: TcxScreenCanvas;
procedure SaveBackground;
var
R: TRect;
begin
R := ArrowBounds[ArrowPlaces[anFirst]];
OffsetRect(R, -R.Left, -R.Top);
SavingCanvas.CopyRect(R, ACanvas.Canvas, ArrowBounds[ArrowPlaces[anFirst]]);
OffsetRect(R, R.Right - R.Left, 0);
SavingCanvas.CopyRect(R, ACanvas.Canvas, ArrowBounds[ArrowPlaces[anLast]]);
end;
procedure RestoreBackground;
var
R: TRect;
begin
R := ArrowBounds[ArrowPlaces[anFirst]];
OffsetRect(R, -R.Left, -R.Top);
ACanvas.CopyRect(ArrowBounds[ArrowPlaces[anFirst]], SavingCanvas, R);
OffsetRect(R, R.Right - R.Left, 0);
ACanvas.CopyRect(ArrowBounds[ArrowPlaces[anLast]], SavingCanvas, R);
end;
procedure DrawArrows;
procedure DrawArrow(AArrowPlace: TcxGridArrowPlace);
var
R: TRect;
P: array[1..7] of TPoint;
procedure CalculatePointsForLeftArrow;
begin
with R do
begin
P[1] := Point(Left + 3, Top);
P[2] := Point(Left + 3, Top + 3);
P[3] := Point(Left, Top + 3);
P[4] := Point(Left, Bottom - 4);
P[5] := Point(Left + 3, Bottom - 4);
P[6] := Point(Left + 3, Bottom - 1);
P[7] := Point(Right - 1, Top + 5);
end;
end;
procedure CalculatePointsForTopArrow;
begin
with R do
begin
P[1] := Point(Left + 3, Top);
P[2] := Point(Right - 4, Top);
P[3] := Point(Right - 4, Top + 3);
P[4] := Point(Right - 1, Top + 3);
P[5] := Point(Left + 5, Bottom - 1);
P[6] := Point(Left, Top + 3);
P[7] := Point(Left + 3, Top + 3);
end;
end;
procedure CalculatePointsForRightArrow;
begin
with R do
begin
P[1] := Point(Right - 4, Top);
P[2] := Point(Right - 4, Top + 3);
P[3] := Point(Right - 1, Top + 3);
P[4] := Point(Right - 1, Bottom - 4);
P[5] := Point(Right - 4, Bottom - 4);
P[6] := Point(Right - 4, Bottom - 1);
P[7] := Point(Left, Top + 5);
end;
end;
procedure CalculatePointsForBottomArrow;
begin
with R do
begin
P[1] := Point(Left + 3, Bottom - 1);
P[2] := Point(Right - 4, Bottom - 1);
P[3] := Point(Right - 4, Bottom - 4);
P[4] := Point(Right - 1, Bottom - 4);
P[5] := Point(Left + 5, Top);
P[6] := Point(Left, Bottom - 4);
P[7] := Point(Left + 3, Bottom - 4);
end;
end;
begin
R := ArrowBounds[AArrowPlace];
case AArrowPlace of
apLeft:
CalculatePointsForLeftArrow;
apTop:
CalculatePointsForTopArrow;
apRight:
CalculatePointsForRightArrow;
apBottom:
CalculatePointsForBottomArrow;
end;
ACanvas.Brush.Color := DragAndDropArrowColor;
ACanvas.Pen.Color := DragAndDropArrowBorderColor;
ACanvas.Polygon(P);
end;
begin
DrawArrow(ArrowPlaces[anFirst]);
DrawArrow(ArrowPlaces[anLast]);
end;
begin
if AVisible and not IsValidDestination then AVisible := False;
if FArrowsVisible <> AVisible then
begin
FArrowsVisible := AVisible;
ACanvas := TcxScreenCanvas.Create;
try
if FArrowsVisible then
begin
SaveBackground;
DrawArrows;
end
else
RestoreBackground;
finally
ACanvas.Free;
end;
end;
end;
procedure TcxCustomGridMovingObject.ChangeDragImagePosition(AVisible: Boolean = True);
var
ACanvas: TcxScreenCanvas;
procedure SaveBackground;
var
AScreenR, ASaveR: TRect;
begin
FDragImageSavingPos := CurMousePos;
AScreenR := GetDragImageBounds(FDragImageSavingPos);
ASaveR := AScreenR;
OffsetRect(ASaveR, -ASaveR.Left, -ASaveR.Top);
DragImageSavingCanvas.CopyRect(ASaveR, ACanvas.Canvas, AScreenR);
end;
procedure RestoreBackground;
var
AScreenR, ASaveR: TRect;
begin
AScreenR := GetDragImageBounds(FDragImageSavingPos);
ASaveR := AScreenR;
OffsetRect(ASaveR, -ASaveR.Left, -ASaveR.Top);
ACanvas.CopyRect(AScreenR, DragImageSavingCanvas, ASaveR);
end;
procedure DrawImage;
var
AScreenR, AImageR: TRect;
begin
AScreenR := GetDragImageBounds(FDragImagePos);
AImageR := AScreenR;
OffsetRect(AImageR, -AImageR.Left, -AImageR.Top);
ACanvas.CopyRect(AScreenR, FDragImage.Canvas, AImageR);
end;
procedure ShowImage;
begin
FDragImagePos := CurMousePos;
SaveBackground;
DrawImage;
end;
procedure HideImage;
begin
RestoreBackground;
end;
procedure MoveImage;
var
AOldBounds, ANewBounds: TRect;
function GetChangeBounds(const AOldBounds, ANewBounds: TRect; ABorder: TcxBorder): TRect;
begin
Result := ANewBounds;
case ABorder of
bLeft:
Result.Right := AOldBounds.Left;
bTop:
Result.Bottom := AOldBounds.Top;
bRight:
Result.Left := AOldBounds.Right;
bBottom:
Result.Top := AOldBounds.Bottom;
end;
end;
procedure RestoreChanges;
var
R: TRect;
I: TcxBorder;
procedure RestoreChange(const R: TRect);
var
ASavingBitmapR: TRect;
begin
if IsRectEmpty(R) then Exit;
ASavingBitmapR := R;
with AOldBounds do
OffsetRect(ASavingBitmapR, -Left, -Top);
ACanvas.CopyRect(R, DragImageSavingCanvas, ASavingBitmapR);
end;
begin
if IntersectRect(R, AOldBounds, ANewBounds) then
for I := Low(I) to High(I) do
RestoreChange(GetChangeBounds(ANewBounds, AOldBounds, I))
else
RestoreChange(AOldBounds);
end;
procedure OffsetSavingBitmap;
var
R1, R2: TRect;
begin
R1 := AOldBounds;
with R1 do
OffsetRect(R1, -Left, -Top);
R2 := R1;
OffsetRect(R2, AOldBounds.Left - ANewBounds.Left, AOldBounds.Top - ANewBounds.Top);
DragImageSavingCanvas.CopyRect(R2, DragImageSavingCanvas, R1);
end;
procedure SaveChanges;
var
I: TcxBorder;
procedure SaveChange(const R: TRect);
var
ASavingBitmapR: TRect;
begin
if IsRectEmpty(R) then Exit;
ASavingBitmapR := R;
with ANewBounds do
OffsetRect(ASavingBitmapR, -Left, -Top);
DragImageSavingCanvas.CopyRect(ASavingBitmapR, ACanvas.Canvas, R);
end;
begin
for I := Low(I) to High(I) do
SaveChange(GetChangeBounds(AOldBounds, ANewBounds, I));
end;
begin
FDragImagePos := CurMousePos;
AOldBounds := GetDragImageBounds(FDragImageSavingPos);
ANewBounds := GetDragImageBounds(FDragImagePos);
FDragImageSavingPos := FDragImagePos;
RestoreChanges;
OffsetSavingBitmap;
SaveChanges;
DrawImage;
end;
begin
ACanvas := TcxScreenCanvas.Create;
try
if FDragImageVisible <> AVisible then
begin
FDragImageVisible := AVisible;
if AVisible then
ShowImage
else
HideImage;
end
else
if FDragImageVisible and
((FDragImagePos.X <> CurMousePos.X) or (DragImagePos.Y <> CurMousePos.Y)) then
MoveImage;
finally
ACanvas.Free;
end;
end;
function TcxCustomGridMovingObject.AreArrowsVertical: Boolean;
begin
Result := True;
end;
function TcxCustomGridMovingObject.CalculateDragImageOffset: TPoint;
begin
with SourceItemBounds, SourcePoint do
begin
Result.X := MulDiv(X - Left, FDragImage.Width, Right - Left);
Result.Y := MulDiv(Y - Top, FDragImage.Height, Bottom - Top);
end;
end;
function TcxCustomGridMovingObject.GetArrowBounds(APlace: TcxGridArrowPlace): TRect;
procedure CheckResult;
procedure CheckValue(var Value: Integer);
begin
with ArrowsClientRect do
begin
if Value < Left then Value := Left;
if Value > Right - 1 then Value := Right - 1;
end;
end;
begin
CheckValue(Result.Left);
CheckValue(Result.Right);
end;
procedure CalculateHorizontalArrowBounds;
begin
Result.Bottom := Result.Top + 1;
InflateRect(Result, 0, DragAndDropArrowWidth div 2);
if APlace = apLeft then
begin
Result.Right := Result.Left;
Dec(Result.Left, DragAndDropArrowHeight);
end
else
begin
Result.Left := Result.Right;
Inc(Result.Right, DragAndDropArrowHeight);
end;
end;
procedure CalculateVerticalArrowBounds;
begin
Result.Right := Result.Left + 1;
InflateRect(Result, DragAndDropArrowWidth div 2, 0);
if APlace = apTop then
begin
Result.Bottom := Result.Top;
Dec(Result.Top, DragAndDropArrowHeight);
end
else
begin
Result.Top := Result.Bottom;
Inc(Result.Bottom, DragAndDropArrowHeight);
end;
end;
procedure ConvertToScreenCoordinates;
begin
with GridView.Site, Result do
begin
TopLeft := ClientToScreen(TopLeft);
BottomRight := ClientToScreen(BottomRight);
end;
end;
begin
Result := GetArrowAreaBounds(APlace);
CheckResult;
if APlace in [apLeft, apRight] then
CalculateHorizontalArrowBounds
else
CalculateVerticalArrowBounds;
ConvertToScreenCoordinates;
end;
function TcxCustomGridMovingObject.GetArrowsClientRect: TRect;
begin
Result := ViewInfo.Bounds;
end;
function TcxCustomGridMovingObject.GetDragImageBounds(AMousePos: TPoint): TRect;
begin
Result := Rect(0, 0, FDragImage.Width, FDragImage.Height);
with Control.ClientToScreen(AMousePos) do
OffsetRect(Result, X - FDragImageOffset.X, Y - FDragImageOffset.Y);
end;
function TcxCustomGridMovingObject.GetSourceItemBounds: TRect;
begin
if SourceItemViewInfo <> nil then
Result := SourceItemViewInfo.Bounds
else
if IsSourceCustomizationForm then
with CustomizationFormListBox do
begin
Result := ItemRect(IndexOfItem(SourceItem));
MapWindowRect(Handle, Control.Handle, Result);
end
else
Result := Rect(0, 0, 0, 0);
end;
function TcxCustomGridMovingObject.GetSourceItemViewInfo: TcxCustomGridCellViewInfo;
begin
Result := nil;
end;
procedure TcxCustomGridMovingObject.InitDragImage;
procedure InitUsingSourceItemViewInfo;
var
AViewInfo: TcxCustomGridCellViewInfo;
begin
AViewInfo := SourceItemViewInfo;
with AViewInfo.Bounds.TopLeft do
SetViewportOrgEx(DragImage.Canvas.Handle, -X, -Y, nil);
AViewInfo.Paint(DragImageCanvas);
end;
procedure InitFromCustomizationForm;
var
R: TRect;
begin
R := SourceItemBounds;
with R do
OffsetRect(R, -Left, -Top);
with CustomizationFormListBox do
PaintItem(DragImageCanvas, R, IndexOfItem(SourceItem), False);
end;
begin
with FDragImage, SourceItemBounds do
begin
Width := Right - Left;
Height := Bottom - Top;
end;
if SourceItemViewInfo <> nil then
InitUsingSourceItemViewInfo
else
if IsSourceCustomizationForm then
InitFromCustomizationForm;
end;
procedure TcxCustomGridMovingObject.BeginDragAndDrop;
begin
CreateDragImage;
FDragImageOffset := CalculateDragImageOffset;
Control.Update;
inherited;
end;
procedure TcxCustomGridMovingObject.DragAndDrop(const P: TPoint; var Accepted: Boolean);
begin
inherited;
ChangeDragImagePosition;
Controller.CheckScrolling(P);
end;
procedure TcxCustomGridMovingObject.EndDragAndDrop(Accepted: Boolean);
begin
inherited;
DestroyDragImage;
end;
{ TcxGridColumnHeaderMovingObject }
constructor TcxGridColumnHeaderMovingObject.Create(AControl: TcxControl);
begin
inherited;
FDestColumnContainerKind := ccNone;
end;
destructor TcxGridColumnHeaderMovingObject.Destroy;
begin
DestZone := nil;
inherited;
end;
procedure TcxGridColumnHeaderMovingObject.SetDestColumnContainerKind(Value: TcxGridColumnContainerKind);
begin
if FDestColumnContainerKind <> Value then
begin
Dirty := True;
FDestColumnContainerKind := Value;
end;
end;
procedure TcxGridColumnHeaderMovingObject.SetDestZone(Value: TcxGridColumnContainerZone);
begin
if (FDestZone <> Value) and
((FDestZone = nil) or not FDestZone.IsEqual(Value) or
(Value = nil) or not Value.IsEqual(FDestZone)) then
begin
Dirty := True;
FDestZone.Free;
FDestZone := Value;
end
else
Value.Free;
end;
function TcxGridColumnHeaderMovingObject.CanRemove: Boolean;
begin
Result :=
(SourceColumnContainerKind = ccGroupByBox) and SourceColumn.CanGroup or
(SourceColumnContainerKind = ccHeader) and SourceColumn.CanHide and
(GridView.OptionsCustomize.ColumnHiding or GridView.Controller.Customization);
end;
procedure TcxGridColumnHeaderMovingObject.DoColumnMoving;
var
AIndex: Integer;
begin
with SourceColumn do
begin
if DestZone.ColumnIndex = GridView.VisibleColumnCount then
AIndex := GridView.ColumnCount - 1
else
begin
AIndex := GridView.VisibleColumns[DestZone.ColumnIndex].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.ColumnIndex = 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.ColumnIndex].Bounds;
Dec(Result.Left, GroupByBoxHorOffset div 2);
if DestZone.ColumnIndex <> 0 then
OffsetRect(Result, 0, -GroupByBoxVerOffset div 2);
end;
end;
begin
if DestColumnContainerKind = ccGroupByBox then
CalculateForGroupByBox
else
Result := GetArrowAreaBoundsForHeader(APlace);
end;
function TcxGridColumnHeaderMovingObject.GetArrowAreaBoundsForHeader(APlace: TcxGridArrowPlace): TRect;
begin
with ViewInfo.HeaderViewInfo do
if DestZone.ColumnIndex = Count then
if Count = 0 then
Result := Bounds
else
begin
Result := Items[Count - 1].Bounds;
Result.Left := Result.Right;
end
else
Result := Items[DestZone.ColumnIndex].Bounds;
end;
function TcxGridColumnHeaderMovingObject.GetCustomizationFormListBox: TcxCustomGridTableItemsListBox;
begin
Result := CustomizationForm.ColumnsListBox;
end;
function TcxGridColumnHeaderMovingObject.GetSourceItem: TObject;
begin
Result := SourceColumn;
end;
function TcxGridColumnHeaderMovingObject.GetSourceItemViewInfo: TcxCustomGridCellViewInfo;
begin
case SourceColumnContainerKind of
ccGroupByBox:
Result := ViewInfo.GroupByBoxViewInfo[SourceColumn.GroupIndex];
ccHeader:
Result := ViewInfo.HeaderViewInfo[SourceColumn.VisibleIndex];
else
Result := inherited GetSourceItemViewInfo;
end;
end;
function TcxGridColumnHeaderMovingObject.IsSourceCustomizationForm: Boolean;
begin
Result := SourceColumnContainerKind = ccCustomizationForm;
end;
function TcxGridColumnHeaderMovingObject.IsValidDestination: Boolean;
begin
Result := DestColumnContainerKind in [ccGroupByBox, ccHeader];
if Result then
begin
case DestColumnContainerKind of
ccGroupByBox:
Result := SourceColumn.GroupIndex = -1;
ccHeader:
Result := not SourceColumn.Visible;
end;
Result := Result or IsValidDestinationForVisibleSource;
end;
end;
function TcxGridColumnHeaderMovingObject.IsValidDestinationForVisibleSource: Boolean;
begin
case DestColumnContainerKind of
ccGroupByBox:
Result :=
(DestZone.ColumnIndex < SourceColumn.GroupIndex) or
(SourceColumn.GroupIndex + 1 < DestZone.ColumnIndex);
ccHeader:
Result :=
(SourceColumnContainerKind = ccGroupByBox) or
(DestZone.ColumnIndex < SourceColumn.VisibleIndex) or
(SourceColumn.VisibleIndex + 1 < DestZone.ColumnIndex);
else
Result := False;
end;
end;
procedure TcxGridColumnHeaderMovingObject.BeginDragAndDrop;
begin
if CustomizationForm <> nil then
with CustomizationForm do
ActivatePage(ColumnsPage);
Controller.FMovingColumn := SourceColumn;
inherited;
end;
procedure TcxGridColumnHeaderMovingObject.DragAndDrop(const P: TPoint; var Accepted: Boolean);
var
ADestZone: TcxGridColumnContainerZone;
AHitTest: TcxCustomGridHitTest;
begin
ADestZone := nil;
AHitTest := ViewInfo.GetHitTest(P);
if AHitTest.HitTestCode = htCustomizationForm then
DestColumnContainerKind := ccCustomizationForm
else
begin
ADestZone := ViewInfo.GroupByBoxViewInfo.GetZone(P);
if ADestZone = nil then
begin
ADestZone := ViewInfo.HeaderViewInfo.GetZone(P);
if ADestZone = nil then
DestColumnContainerKind := ccNone
else
DestColumnContainerKind := ccHeader;
end
else
DestColumnContainerKind := ccGroupByBox;
end;
DestZone := ADestZone;
Accepted := DestColumnContainerKind <> ccNone;
inherited;
end;
procedure TcxGridColumnHeaderMovingObject.EndDragAndDrop(Accepted: Boolean);
var
APrevGroupIndex: Integer;
AColumnPosChanged: Boolean;
procedure DoColumnGrouping;
begin
if IsValidDestination then
with SourceColumn do
if CanGroup then
begin
GroupIndex := DestZone.ColumnIndex -
Byte((GroupIndex <> -1) and (GroupIndex < DestZone.ColumnIndex));
if HideOnGrouping and CanHide then Visible := False;
AColumnPosChanged := True;
end;
end;
procedure DoColumnRemoving;
begin
if not CanRemove then Exit;
with SourceColumn do
case SourceColumnContainerKind of
ccGroupByBox:
if CanGroup then
begin
GroupIndex := -1;
if (DestColumnContainerKind <> ccCustomizationForm) and
ShowOnUngrouping and WasVisibleBeforeGrouping then
Visible := True;
AColumnPosChanged := True;
end;
ccHeader:
if CanHide then
begin
Visible := False;
AColumnPosChanged := True;
end;
end;
end;
begin
inherited;
Controller.FMovingColumn := nil;
if Accepted then
begin
AColumnPosChanged := False;
APrevGroupIndex := SourceColumn.GroupIndex;
case DestColumnContainerKind of
ccGroupByBox:
DoColumnGrouping;
ccHeader:
if IsValidDestination then
begin
DoColumnMoving;
with SourceColumn do
begin
if (SourceColumnContainerKind = ccGroupByBox) and CanGroup then
GroupIndex := -1;
Visible := True;
end;
AColumnPosChanged := True;
end;
else
DoColumnRemoving;
end;
if SourceColumn.GroupIndex <> APrevGroupIndex then
Controller.MakeFocusedRecordVisible;
if AColumnPosChanged then
GridView.DoColumnPosChanged(SourceColumn);
end;
end;
procedure TcxGridColumnHeaderMovingObject.Init(const P: TPoint; AParams: TcxCustomGridHitTest);
begin
inherited;
with AParams as TcxGridColumnHeaderHitTest do
begin
SourceColumn := Column;
SourceColumnContainerKind := ColumnContainerKind;
end;
end;
{ TcxCustomGridSizingObject }
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 }
function TcxGridColumnHorzSizingObject.GetCurrentSize: Integer;
begin
Result := inherited GetCurrentSize;
ColumnHeaderViewInfo.CheckWidth(Result);
end;
procedure TcxGridColumnHorzSizingObject.BeginDragAndDrop;
begin
OriginalSize := ColumnHeaderViewInfo.Width;
Controller.FHorzSizingColumn := Column;
inherited;
end;
procedure TcxGridColumnHorzSizingObject.EndDragAndDrop(Accepted: Boolean);
begin
inherited;
if Accepted and (CurrentSize <> OriginalSize) then
begin
Column.ForceWidth(ColumnHeaderViewInfo.CalculateRealWidth(CurrentSize));
Controller.FHorzSizingColumn := nil;
GridView.SizeChanged;
GridView.DoColumnSizeChanged(Column);
end
else
Controller.FHorzSizingColumn := nil;
end;
{ TcxGridRowSizingObject }
function TcxGridRowSizingObject.GetRowViewInfo: TcxCustomGridRowViewInfo;
begin
Result := TcxCustomGridRowViewInfo(FRow.ViewInfo);
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.BeginDragAndDrop;
begin
OriginalSize := RowViewInfo.RowHeight;
inherited;
end;
procedure TcxGridRowSizingObject.EndDragAndDrop(Accepted: Boolean);
begin
inherited;
if Accepted then
RowViewInfo.RowHeight := CurrentSize;
end;
procedure TcxGridRowSizingObject.Init(const P: TPoint; AParams: TcxCustomGridHitTest);
begin
inherited;
FRow := TcxCustomGridRow((AParams as TcxGridRowSizingEdgeHitTest).GridRecord);
end;
{ TcxCustomGridTableItemsListBox }
constructor TcxCustomGridTableItemsListBox.Create(AOwner: TComponent);
begin
inherited;
Color := clBtnFace;
Sorted := True;
Style := lbOwnerDrawFixed;
CalculateBorderStyle;
FcxCanvas := TcxCanvas.Create(Canvas);
FDragAndDropItemIndex := -1;
end;
destructor TcxCustomGridTableItemsListBox.Destroy;
begin
FcxCanvas.Free;
inherited;
end;
function TcxCustomGridTableItemsListBox.GetDragAndDropItem: TObject;
begin
Result := Items.Objects[FDragAndDropItemIndex];
end;
function TcxCustomGridTableItemsListBox.GetGridView: TcxGridTableView;
begin
Result := (Owner as TcxGridTableCustomizationForm).Controller.GridView;
end;
function TcxCustomGridTableItemsListBox.GetLookAndFeelPainter: TcxCustomLookAndFeelPainterClass;
begin
Result := (Owner as TcxGridTableCustomizationForm).ViewInfo.LookAndFeelPainter;
end;
procedure TcxCustomGridTableItemsListBox.WMCancelMode(var Message: TWMCancelMode);
begin
inherited;
FDragAndDropItemIndex := -1;
end;
procedure TcxCustomGridTableItemsListBox.WMNCCalcSize(var Message: TWMNCCalcSize);
begin
inherited;
if BorderStyle = bsNone then
InflateRect(Message.CalcSize_Params^.rgrc[0], -1, -1);
end;
procedure TcxCustomGridTableItemsListBox.WMNCPaint(var Message: TWMNCPaint);
var
R: TRect;
DC: HDC;
begin
inherited;
if BorderStyle = bsNone then
begin
GetWindowRect(Handle, R);
OffsetRect(R, -R.Left, -R.Top);
DC := GetWindowDC(Handle);
DrawEdge(DC, R, BDR_SUNKENOUTER, BF_RECT);
ReleaseDC(Handle, DC);
end;
end;
procedure TcxCustomGridTableItemsListBox.CreateParams(var Params: TCreateParams);
begin
inherited;
with Params do
WindowClass.Style := WindowClass.Style or CS_HREDRAW;
end;
procedure TcxCustomGridTableItemsListBox.CreateWnd;
begin
inherited;
CalculateItemHeight;
end;
procedure TcxCustomGridTableItemsListBox.DrawItem(Index: Integer; Rect: TRect;
State: TOwnerDrawState);
begin
PaintItem(FcxCanvas, Rect, Index, odFocused in State);
if odFocused in State then FcxCanvas.DrawFocusRect(Rect);
end;
procedure TcxCustomGridTableItemsListBox.KeyDown(var Key: Word; Shift: TShiftState);
begin
inherited;
if Key = VK_ESCAPE then GridView.Site.FinishDragAndDrop(False);
end;
procedure TcxCustomGridTableItemsListBox.MouseDown(Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
AItemIndex: Integer;
begin
inherited;
if Button = mbLeft then
begin
AItemIndex := ItemAtPos(Point(X, Y), True);
if AItemIndex <> -1 then
begin
FDragAndDropItemIndex := AItemIndex;
FMouseDownPos := Point(X, Y);
end;
end;
end;
procedure TcxCustomGridTableItemsListBox.MouseMove(Shift: TShiftState; X, Y: Integer);
var
AParams: TcxCustomGridHitTest;
P: TPoint;
begin
inherited;
if (FDragAndDropItemIndex <> -1) and
(not IsPointInDragDetectArea(FMouseDownPos, X, Y) or
(ItemAtPos(Point(X, Y), False) <> FDragAndDropItemIndex)) then
begin
AParams := GetDragAndDropParams;
with GridView do
begin
P := FMouseDownPos;
P := Site.ScreenToClient(ClientToScreen(P));
Controller.DragAndDropObjectClass := AParams.DragAndDropObjectClass;
Controller.DragAndDropObject.Init(P, AParams);
Site.BeginDragAndDrop;
end;
FDragAndDropItemIndex := -1;
end;
end;
procedure TcxCustomGridTableItemsListBox.MouseUp(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
begin
inherited;
FDragAndDropItemIndex := -1;
end;
procedure TcxCustomGridTableItemsListBox.CalculateBorderStyle;
begin
if LookAndFeelPainter.HeaderBorderSize <= 1 then
BorderStyle := bsNone
else
BorderStyle := bsSingle;
end;
procedure TcxCustomGridTableItemsListBox.CalculateItemHeight;
begin
ItemHeight := 2 * (LookAndFeelPainter.HeaderBorderSize + cxTextOffset) + Canvas.TextHeight('Qq');
end;
function TcxCustomGridTableItemsListBox.IndexOfItem(AItem: TObject): Integer;
begin
Result := Items.IndexOfObject(AItem);
end;
procedure TcxCustomGridTableItemsListBox.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, -cxTextOffset, 0);
DrawHeader(ACanvas, R, ATextR, [],
cxBordersAll, States[AFocused], taLeftJustify, vaCenter, False,
GridView.OptionsView.HeaderEndEllipsis, Items[AIndex], ACanvas.Font,
clBtnText, clBtnFace, GridView.ViewInfo.HeaderViewInfo.DrawColumnBackgroundHandler{4});
if AFocused then
DrawHeaderPressed(ACanvas, ASelectionR);
end;
end;
procedure TcxCustomGridTableItemsListBox.RefreshItems;
begin
CalculateItemHeight;
end;
{ TcxGridTableColumnsListBox }
function TcxGridTableColumnsListBox.GetDragAndDropParams: TcxCustomGridHitTest;
begin
Result := TcxGridColumnHeaderHitTest.Instance(Point(-1, -1));
with TcxGridColumnHeaderHitTest(Result) do
begin
GridView := Self.GridView;
Column := TcxGridColumn(DragAndDropItem);
ColumnContainerKind := ccCustomizationForm;
end;
end;
procedure TcxGridTableColumnsListBox.RefreshItems;
var
I: Integer;
AColumn: TcxGridColumn;
begin
inherited;
with Items do
begin
BeginUpdate;
try
Clear;
for I := 0 to GridView.ColumnCount - 1 do
begin
AColumn := GridView.Columns[I];
if not AColumn.Hidden and not AColumn.Visible then
AddObject(AColumn.Caption, AColumn);
end;
finally
EndUpdate;
end;
end;
end;
{ TcxGridCustomizationForm }
// TODO: system menu, hiding when control is hidden or minimized
constructor TcxGridTableCustomizationForm.Create(AController: TcxGridTableController);
begin
inherited CreateNew(nil);
FController := AController;
Caption := cxGetResourceString(@scxGridCustomizationFormCaption);
BorderStyle := bsSizeToolWin;
Font := TcxControlAccess(Controller.Control).Font;
CalculateConsts;
CreateControls;
end;
destructor TcxGridTableCustomizationForm.Destroy;
begin
FHookTimer.Free;
FController.Customization := False;
inherited;
end;
function TcxGridTableCustomizationForm.GetGridView: TcxGridTableView;
begin
Result := FController.GridView;
end;
function TcxGridTableCustomizationForm.GetViewInfo: TcxGridTableViewInfo;
begin
Result := FController.ViewInfo;
end;
procedure TcxGridTableCustomizationForm.HookTimerHandler(Sender: TObject);
begin
if IsIconic(Application.Handle) then
Visible := False
else
if not IsWindowVisible(FController.Site.Handle) then
FController.Customization := False
else
if not Visible then
begin
ShowWindow(Handle, SW_SHOWNOACTIVATE);
Visible := True;
end;
end;
procedure TcxGridTableCustomizationForm.CreateParams(var Params: TCreateParams);
begin
inherited;
with Params do
begin
Style := Style or WS_POPUP;
// Style := WS_POPUP or WS_CLIPCHILDREN or WS_CLIPSIBLINGS or WS_CAPTION or
// WS_SYSMENU or WS_SIZEBOX;
// ExStyle := WS_EX_TOOLWINDOW or WS_EX_DLGMODALFRAME or WS_EX_CONTROLPARENT;
// WindowClass.Style := CS_SAVEBITS;
WndParent := FController.Site.Handle;
end;
end;
procedure TcxGridTableCustomizationForm.DoClose(var Action: TCloseAction);
begin
FreeAndNil(FHookTimer);
Action := caFree;
end;
procedure TcxGridTableCustomizationForm.DoShow;
begin
if FHookTimer = nil then
begin
FHookTimer := TTimer.Create(nil);
with FHookTimer do
begin
Interval := 100;
OnTimer := HookTimerHandler;
end;
end;
inherited;
end;
procedure TcxGridTableCustomizationForm.CalculateConsts;
begin
FOffset := Canvas.TextHeight('Qq') div 6;
FStep := 2 * FOffset;
end;
procedure TcxGridTableCustomizationForm.CreateControls;
procedure CreatePageControl;
begin
FPageControl := TPageControl.Create(Self);
with FPageControl do
begin
Anchors := [akTop, akLeft, akRight, akBottom];
BoundsRect := GetPageControlBounds;
Parent := Self;
InitPageControl;
end;
end;
procedure CreateColumnsListBox;
begin
FColumnsListBox := GetColumnsListBoxClass.Create(Self);
with FColumnsListBox do
begin
Align := alClient;
Parent := FColumnsPage;
RefreshItems;
end;
end;
begin
CreatePageControl;
CreateColumnsListBox;
end;
function TcxGridTableCustomizationForm.CreatePage(const ACaption: string;
AVisible: Boolean): TTabSheet;
begin
Result := TTabSheet.Create(FPageControl);
with Result do
begin
PageControl := FPageControl;
Caption := ACaption;
TabVisible := AVisible;
end;
end;
function TcxGridTableCustomizationForm.GetColumnsListBoxBounds: TRect;
begin
Result := FColumnsPage.ClientRect;
end;
function TcxGridTableCustomizationForm.GetColumnsListBoxClass: TcxGridTableColumnsListBoxClass;
begin
Result := TcxGridTableColumnsListBox;
end;
function TcxGridTableCustomizationForm.GetContentBounds: TRect;
begin
Result := ClientRect;
InflateRect(Result, -Offset, -Offset);
end;
function TcxGridTableCustomizationForm.GetPageControlBounds: TRect;
begin
Result := ContentBounds;
end;
procedure TcxGridTableCustomizationForm.InitPageControl;
begin
FColumnsPage := CreatePage(cxGetResourceString(@scxGridCustomizationFormColumnsPageCaption),
GridView.OptionsCustomize.ColumnMoving);
end;
procedure TcxGridTableCustomizationForm.ActivatePage(APage: TTabSheet);
begin
if APage.TabVisible then
FPageControl.ActivePage := APage;
end;
procedure TcxGridTableCustomizationForm.RefreshData;
begin
FColumnsListBox.RefreshItems;
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;
{ TcxGridTableController }
destructor TcxGridTableController.Destroy;
begin
FFilterPopup.Free;
inherited;
end;
function TcxGridTableController.GetDragAndDropObject: TcxGridDragAndDropObject;
begin
Result := TcxGridDragAndDropObject(inherited DragAndDropObject);
end;
function TcxGridTableController.GetFilterPopup: TcxGridFilterPopup;
begin
if FFilterPopup = nil then
FFilterPopup := GetFilterPopupClass.Create(GridView);
Result := FFilterPopup;
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.GetIsColumnMoving: Boolean;
begin
Result := FMovingColumn <> nil;
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.SetCustomization(Value: Boolean);
begin
if FCustomization <> Value then
begin
FCustomization := Value;
if Value then
ShowCustomizationForm
else
HideCustomizationForm;
TcxCustomGrid(Control).SendNotifications(gnkCustomization);
GridView.DoCustomization;
end;
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 {2}
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
begin
if Value = nil then GetUpdateRects;
FPressedColumn := Value;
if Value <> nil then GetUpdateRects;
InvalidateRects;
end;
end;
procedure TcxGridTableController.SetScrollDirection(Value: TcxDirection);
begin
if FScrollDirection <> Value then
begin
DestroyScrollTimer;
FScrollDirection := Value;
if FScrollDirection <> dirNone then
CreateScrollTimer;
end;
end;
procedure TcxGridTableController.SetTopRowIndex(Value: Integer);
begin
TopRecordIndex := Value;
end;
procedure TcxGridTableController.CreateScrollTimer;
begin
FScrollTimer := TTimer.Create(nil);
with FScrollTimer do
begin
Interval := ScrollTimeIntervalHorz;
OnTimer := ScrollTimerHandler;
end;
end;
procedure TcxGridTableController.DestroyScrollTimer;
begin
FreeAndNil(FScrollTimer);
end;
procedure TcxGridTableController.ScrollTimerHandler(Sender: TObject);
var
AAccepted: Boolean;
begin
if CanScroll(FScrollDirection) then
begin
if DragAndDropObject <> nil then
DragAndDropObject.BeforeScrolling;
ScrollData(FScrollDirection);
if DragAndDropObject <> nil then
begin
Site.Update;
DragAndDropObject.AfterScrolling;
TcxControlAccess(Site).DragAndDrop(Site.ScreenToClient(Mouse.CursorPos), AAccepted);
end;
end;
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 ViewData.HasNewItemRecord or not ViewData.NewItemRow.Focused);
end;
function TcxGridTableController.CanScroll(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;
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;
function TcxGridTableController.GetDesignHitTest(AHitTest: TcxCustomGridHitTest): Boolean;
begin
Result := inherited GetDesignHitTest(AHitTest);
if not Result then
Result := AHitTest.HitTestCode in [htExpandButton, htTab];
end;
function TcxGridTableController.GetDragScrollDirection(X, Y: Integer): TcxDirection;
var
R: TRect;
begin
Result := inherited GetDragScrollDirection(X, Y);
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 R.Right - ScrollHotZoneWidth <= X then
Result := dirRight;
end;
end;
function TcxGridTableController.GetFilterPopupClass: TcxGridFilterPopupClass;
begin
Result := TcxGridFilterPopup;
end;
function TcxGridTableController.GetFocusedRecord: TcxCustomGridRecord;
begin
Result := inherited GetFocusedRecord;
if (Result = nil) and ViewData.HasNewItemRecord and ViewData.NewItemRow.Selected then
Result := ViewData.NewItemRow;
end;
function TcxGridTableController.GetIsRecordsScrollHorizontal: Boolean;
begin
Result := False;
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: TcxCustomGridRow;
begin
Result := False;
if GridView.IsMaster and
((ViewInfo.VisibleRecordCount > 1) or AIsCallFromMaster) and
(TopRowIndex = inherited GetScrollBarRecordCount - ViewInfo.VisibleRecordCount) then
begin
ALastRow := ViewData.Rows[ViewData.RowCount - 1];
if ALastRow is TcxGridMasterDataRow and ALastRow.Expanded and
TcxGridMasterDataRow(ALastRow).ActiveDetailGridViewExists then
Result := not TcxGridMasterDataRow(ALastRow).ActiveDetailGridView.Controller.IsDataFullyVisible(True);
end;
end;
procedure TcxGridTableController.RemoveFocus;
begin
with ViewData do
if HasNewItemRecord and NewItemRow.Focused then
NewItemRow.Focused := False;
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);
var
ARecordIndex: Integer;
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 then
begin
ARecordIndex := ViewData.GetRecordIndexByRecord(Value);
FocusedRecord.Selected := False;
Value := ViewData.GetRecordByRecordIndex(ARecordIndex);
end;
inherited;
end;
procedure TcxGridTableController.ShowNextPage;
begin
if TopRecordIndex = -1 then Exit;
if ViewInfo.VisibleRecordCount = 1 then
TopRecordIndex := TopRecordIndex + 1
else
TopRecordIndex := TopRecordIndex + (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.GetColumnHeaderDragAndDropObjectClass: TcxGridColumnHeaderMovingObjectClass;
begin
Result := TcxGridColumnHeaderMovingObject;
end;
function TcxGridTableController.GetCustomizationFormClass: TcxGridTableCustomizationFormClass;
begin
Result := TcxGridTableCustomizationForm;
end;
function TcxGridTableController.GetRealCustomizationFormBounds: TRect;
var
AHeaderBottomBound: Integer;
begin
if IsRectEmpty(FCustomizationFormBounds) then
begin
Result.BottomRight := Site.ClientToScreen(Site.ClientRect.BottomRight);
Result.Left := Result.Right - cxGridCustomizationFormDefaultWidth;
Result.Top := Result.Bottom - cxGridCustomizationFormDefaultHeight;
AHeaderBottomBound := Site.ClientToScreen(ViewInfo.HeaderViewInfo.Bounds.BottomRight).Y;
if Result.Top < AHeaderBottomBound then
OffsetRect(Result, 0, AHeaderBottomBound - Result.Top);
end
else
Result := CustomizationFormBounds;
end;
procedure TcxGridTableController.HideCustomizationForm;
begin
if not (csDestroying in FCustomizationForm.ComponentState) then
FCustomizationForm.Free;
FCustomizationForm := nil;
end;
procedure TcxGridTableController.ShowCustomizationForm;
begin
FCustomizationForm := GetCustomizationFormClass.Create(Self);
FCustomizationForm.BoundsRect := GetRealCustomizationFormBounds;
FCustomizationForm.Show;
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;
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.DoCancelMode;
begin
inherited;
PressedColumn := nil;
end;
function TcxGridTableController.HasFilterPopup: Boolean;
begin
Result := FFilterPopup <> nil;
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.MakeRecordVisible(ARecord: TcxCustomGridRecord);
begin
if ViewData.HasNewItemRecord and (ARecord = ViewData.NewItemRow) then
GridView.MakeMasterGridRecordVisible
else
inherited;
end;
procedure TcxGridTableController.RefreshCustomizationForm;
begin
if CustomizationForm <> nil then
CustomizationForm.RefreshData;
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);
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
ScrollDirection := dirNone;
PressedColumn := nil;
inherited;
end;
procedure TcxGridTableController.KeyDown(var Key: Word; Shift: TShiftState);
function FocusNewItemRow: Boolean;
var
ACycleChanged: Boolean;
begin
Result := ViewData.HasNewItemRecord and not ViewData.NewItemRow.Focused;
if Result then
begin
if DataController.IsGridMode then
Result := DataController.IsBOF
else
Result := FindNextRecord(FocusedRecordIndex, False, False, ACycleChanged) = -1;
if Result then
ViewData.NewItemRow.Focused := True;
end;
end;
function DefocusNewItemRow: Boolean;
begin
Result := ViewData.HasNewItemRecord and ViewData.NewItemRow.Focused and
(TopRecordIndex <> -1);
if Result then
begin
FocusedRecordIndex := TopRecordIndex;
Result := FocusedRecordIndex = TopRecordIndex;
end;
end;
//var ft,lt:integer;
begin
case Key of
VK_LEFT, VK_RIGHT:
if FocusNextCell(Key = VK_RIGHT) then Key := 0;
VK_PRIOR:
if FocusNewItemRow or
ViewData.HasNewItemRecord and ViewData.NewItemRow.Focused then
Exit;
VK_NEXT:
if DefocusNewItemRow then Exit;
end;
inherited; //!!!!
case Key of
VK_LEFT:
ScrollData(dirLeft);
VK_RIGHT:
ScrollData(dirRight);
VK_UP:
{3}
{begin
ft:=gettickcount;}
if not FocusNewItemRow then
FocusNextRecord(FocusedRowIndex, False, False, True);
{site.update;
lt:=gettickcount;
application.mainform.Caption := inttostr(lt-ft);
end;}
VK_DOWN:
{3}
{begin
ft:=gettickcount;}
if not DefocusNewItemRow then
FocusNextRecord(FocusedRowIndex, True, False, True);
{site.update;
lt:=gettickcount;
application.mainform.Caption := inttostr(lt-ft);
end;}
VK_HOME:
if (ssCtrl in Shift) or not FocusedRecordHasCells(True) then
if DataController.IsGridMode then
DataController.GotoFirst
else
FocusNextRecord(-1, True, False, False)
else
FocusNextItem(-1, True, False, False);
VK_END:
if (ssCtrl in Shift) or not FocusedRecordHasCells(True) then
if DataController.IsGridMode then
DataController.GotoLast
else
FocusNextRecord(-1, False, True, False)
else
FocusNextItem(-1, False, True, False);
end;
end;
procedure TcxGridTableController.MouseUp(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
procedure ProcessSorting;
var
ASortOrder: TcxGridSortOrder;
begin
if not PressedColumn.CanSort then Exit;
try
ShowHourglassCursor;
BeginUpdate;
try
with PressedColumn do
if ssCtrl in Shift then
SortOrder := soNone
else
begin
if SortOrder = soAscending then
ASortOrder := soDescending
else
ASortOrder := soAscending;
if not (ssShift in Shift) and (PressedColumn.GroupIndex = -1) then
DataController.ClearSorting(True);
SortOrder := ASortOrder;
end;
finally
EndUpdate;
HideHourglassCursor;
end;
finally
MakeFocusedRecordVisible;
DesignerModified;
end;
end;
begin
inherited;
if Site.IsMouseInPressedArea(X, Y) and (PressedColumn <> nil) then
ProcessSorting;
PressedColumn := nil;
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;
{ 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,
GridCellStateToButtonState(ViewInfo.State), 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.DrawBorders;
begin
// inherited;
end;
procedure TcxGridColumnHeaderPainter.DrawContent;
const
States: array[TcxGridCellState] of TcxButtonState = (cxbsNormal, cxbsHot, cxbsPressed);
var
AState: TcxButtonState;
I: Integer;
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{4});
end;
for I := 0 to ViewInfo.AreaViewInfoCount - 1 do
ViewInfo.AreaViewInfos[I].Paint(Canvas);
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.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;
{ TcxGridFooterCellPainter }
procedure TcxGridFooterCellPainter.DrawBorders;
begin
// inherited;
end;
procedure TcxGridFooterCellPainter.DrawContent;
begin
with ViewInfo do
LookAndFeelPainter.DrawFooterCell(Self.Canvas, Bounds, AlignmentHorz,
AlignmentVert, MultiLine, Text, Params.Font, Params.TextColor, Params.Color,
DrawBackgroundHandler);
end;
{ TcxGridFooterPainter }
function TcxGridFooterPainter.GetViewInfo: TcxGridFooterViewInfo;
begin
Result := TcxGridFooterViewInfo(inherited ViewInfo);
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
Canvas.Brush.Color := ViewInfo.SeparatorColor;
Canvas.FillRect(ViewInfo.SeparatorBounds);
end;
{ TcxCustomGridFilterButtonPainter }
function TcxCustomGridFilterButtonPainter.GetViewInfo: TcxCustomGridFilterButtonViewInfo;
begin
Result := TcxCustomGridFilterButtonViewInfo(inherited ViewInfo);
end;
function TcxCustomGridFilterButtonPainter.ExcludeFromClipRect: Boolean;
begin
Result := True;
end;
{ TcxGridFilterCloseButtonPainter }
procedure TcxGridFilterCloseButtonPainter.DrawContent;
begin
ViewInfo.LookAndFeelPainter.DrawFilterCloseButton(Canvas, ViewInfo.Bounds,
GridCellStateToButtonState(ViewInfo.State));
end;
{ TcxGridFilterActivateButtonPainter }
function TcxGridFilterActivateButtonPainter.GetViewInfo: TcxGridFilterActivateButtonViewInfo;
begin
Result := TcxGridFilterActivateButtonViewInfo(inherited ViewInfo);
end;
procedure TcxGridFilterActivateButtonPainter.DrawContent;
begin
ViewInfo.LookAndFeelPainter.DrawFilterActivateButton(Canvas, ViewInfo.Bounds,
GridCellStateToButtonState(ViewInfo.State), ViewInfo.Checked);
end;
{ TcxGridFilterCustomizeButtonPainter }
procedure TcxGridFilterCustomizeButtonPainter.Paint;
begin
ViewInfo.LookAndFeelPainter.DrawButton(Canvas, ViewInfo.Bounds, ViewInfo.Text,
GridCellStateToButtonState(ViewInfo.State));
end;
{ TcxGridFilterPainter }
function TcxGridFilterPainter.GetViewInfo: TcxGridFilterViewInfo;
begin
Result := TcxGridFilterViewInfo(inherited ViewInfo);
end;
procedure TcxGridFilterPainter.DrawButtons;
var
I: Integer;
begin
with ViewInfo.ButtonsViewInfo do
for I := 0 to Count - 1 do
Items[I].Paint;
end;
function TcxGridFilterPainter.ExcludeFromClipRect: Boolean;
begin
Result := True;
end;
procedure TcxGridFilterPainter.Paint;
begin
// DrawButtons; - commented because of XP
inherited;
DrawButtons;
end;
{ TcxCustomGridIndicatorItemPainter }
function TcxCustomGridIndicatorItemPainter.GetViewInfo: TcxCustomGridIndicatorItemViewInfo;
begin
Result := TcxCustomGridIndicatorItemViewInfo(inherited ViewInfo);
end;
function TcxCustomGridIndicatorItemPainter.ExcludeFromClipRect: Boolean;
begin
Result := True;
end;
{ TcxGridIndicatorHeaderItemPainter }
procedure TcxGridIndicatorHeaderItemPainter.DrawContent;
begin
with ViewInfo do
LookAndFeelPainter.DrawHeader(Self.Canvas, Bounds, Bounds, [], cxBordersAll,
cxbsNormal, taLeftJustify, vaTop, False, False, '', nil, clNone, Params.Color,
GridViewInfo.HeaderViewInfo.DrawColumnBackgroundHandler{4});
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
begin
Brush.Color := GridViewInfo.FooterViewInfo.SeparatorColor;
FillRect(SeparatorBounds);
end;
LookAndFeelPainter.DrawFooterBorder(Self.Canvas, BordersBounds);
end;
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.Level - 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 {4}
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
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;
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;
procedure TcxGridRowsPainter.Paint;
begin
with ViewInfo do
if HasNewItemRecord then NewItemRowViewInfo.Paint;
inherited;
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.BackgroundBitmap = nil)) and
(ViewInfo.FooterViewInfo.BackgroundBitmap = nil) and
((AItemsOffset <> 0) or not GridView.OptionsView.NewItemRow or
(GridView.OptionsView.NewItemRowInfoText = ''));
end;
procedure TcxGridTablePainter.DrawFilterBar;
begin
ViewInfo.FilterViewInfo.Paint;
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;
type
PPointArray = ^TPointArray;
TPointArray = array of TPoint;
PIntegerArray = ^TIntegerArray;
TIntegerArray = array[0..0] of Integer;
var
P: TPointArray;
N: PIntegerArray;
I: Integer;
begin
SetLength(P, FGridLines.Count * 2);
GetMem(N, FGridLines.Count * SizeOf(Integer));
for I := 0 to FGridLines.Count - 1 do
begin
with PRect(FGridLines[I])^ do
begin
P[2 * I] := TopLeft;
if Bottom = Top + 1 then
P[2 * I + 1] := Point(Right, Top)
else
P[2 * I + 1] := Point(Left, Bottom);
end;
N^[I] := 2;
end;
with Canvas do
begin
Pen.Color := ViewInfo.GridLineColor;
PolyPolyLine(Handle, P[0], N^, FGridLines.Count);
end;
FreeMem(N);
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 {2}
R := ViewInfo.GetOffsetBounds(AItemsOffset, AUpdateBounds);
ScrollWindowEx(Site.Handle, 0, AItemsOffset, @R, nil, 0, nil, SW_ERASE or SW_INVALIDATE);
Site.InvalidateRect(AUpdateBounds, True);
Controller.InvalidateFocusedRecord;
end;
procedure TcxGridTablePainter.Offset(DX, DY: Integer);
var
R, AUpdateBounds: TRect;
begin {2}
R := ViewInfo.GetOffsetBounds(DX, DY, AUpdateBounds);
ScrollWindowEx(Site.Handle, DX, 0, @R, nil, 0, nil, SW_ERASE or SW_INVALIDATE);
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;
{ TcxCustomGridPartViewInfo }
constructor TcxCustomGridPartViewInfo.Create(AGridViewInfo: TcxGridTableViewInfo);
begin
inherited Create(AGridViewInfo);
if IsPart then
GridViewInfo.AddPart(Self);
end;
destructor TcxCustomGridPartViewInfo.Destroy;
begin
if IsPart then
GridViewInfo.RemovePart(Self);
inherited;
end;
function TcxCustomGridPartViewInfo.GetGridView: TcxGridTableView;
begin
Result := TcxGridTableView(inherited GridView);
end;
function TcxCustomGridPartViewInfo.GetGridViewInfo: TcxGridTableViewInfo;
begin
Result := TcxGridTableViewInfo(inherited GridViewInfo);
end;
function TcxCustomGridPartViewInfo.GetIndex: Integer;
begin
Result := GridViewInfo.FParts.IndexOf(Self);
end;
function TcxCustomGridPartViewInfo.CalculateBounds: TRect;
begin
Result := GridViewInfo.CalculatePartBounds(Self);
end;
procedure TcxCustomGridPartViewInfo.CalculateInvisible;
begin
FHeight := 0;
inherited Calculate(0, 0, 0, 0);
end;
procedure TcxCustomGridPartViewInfo.CalculateVisible;
begin
FHeight := CalculateHeight;
with CalculateBounds do
Calculate(Left, Top, Right - Left, Bottom - Top);
end;
function TcxCustomGridPartViewInfo.CustomDrawBackground(ACanvas: TcxCanvas): Boolean;
begin
Result := inherited CustomDrawBackground(ACanvas);
if not Result then
GridView.DoCustomDrawPartBackground(ACanvas, Self, Result);
end;
function TcxCustomGridPartViewInfo.GetHeight: Integer;
begin
Result := inherited GetHeight;
if Result = 0 then Result := FHeight;
end;
function TcxCustomGridPartViewInfo.GetIsPart: Boolean;
begin
Result := True;
end;
function TcxCustomGridPartViewInfo.GetPainterClass: TcxCustomGridCellPainterClass;
begin
Result := TcxCustomGridPartPainter;
end;
function TcxCustomGridPartViewInfo.HasCustomDrawBackground: Boolean;
begin
Result := GridView.HasCustomDrawPartBackground;
end;
procedure TcxCustomGridPartViewInfo.InitHitTest(AHitTest: TcxCustomGridHitTest);
begin
inherited;
GridViewInfo.InitHitTest(AHitTest);
end;
procedure TcxCustomGridPartViewInfo.MainCalculate;
begin
if Visible then
CalculateVisible
else
CalculateInvisible;
end;
{ TcxGridColumnContainerZone }
constructor TcxGridColumnContainerZone.Create(AColumnIndex: Integer);
begin
inherited Create;
ColumnIndex := AColumnIndex;
end;
function TcxGridColumnContainerZone.IsEqual(Value: TcxGridColumnContainerZone): Boolean;
begin
Result := (Value <> nil) and (ColumnIndex = Value.ColumnIndex);
end;
{ TcxGridColumnContainerViewInfo }
constructor TcxGridColumnContainerViewInfo.Create(AGridViewInfo: TcxGridTableViewInfo);
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.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.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.GetItemClass: TcxGridColumnHeaderViewInfoClass;
begin
Result := TcxGridColumnHeaderViewInfo;
end;
function TcxGridColumnContainerViewInfo.GetItemMultiLinePainting: Boolean;
begin
Result := False;
end;
function TcxGridColumnContainerViewInfo.GetItemsAreaBounds: TRect;
begin
Result := Bounds;
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 {2}
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;
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 TcxGridColumnContainerViewInfo.GetZone(const P: TPoint): TcxGridColumnContainerZone;
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 := TcxGridColumnContainerZone.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.GetIsOccupyingSpace: Boolean;
begin
Result := True;
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;}
procedure TcxGridColumnHeaderAreaViewInfo.Calculate(const ABounds: TRect;
var ATextAreaBounds: TRect);
procedure AlignHorizontally;
begin
case AlignmentHorz of
taLeftJustify:
begin
Bounds.Right := Bounds.Left + Width;
if IsOccupyingSpace then
ATextAreaBounds.Left := Bounds.Right;
end;
taRightJustify:
begin
Bounds.Left := Bounds.Right - Width;
if IsOccupyingSpace then
ATextAreaBounds.Right := Bounds.Left;
end;
taCenter:
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 IsOccupyingSpace 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;
function TcxGridColumnHeaderSortingMarkViewInfo.GetTransparent: Boolean;
begin
Result := True;
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.GetIsOccupyingSpace: Boolean;
begin
Result := False;
end;
function TcxGridColumnHeaderHorzSizingEdgeViewInfo.GetPainterClass: TcxCustomGridCellPainterClass;
begin
Result := nil;
end;
function TcxGridColumnHeaderHorzSizingEdgeViewInfo.GetTransparent: Boolean;
begin
Result := True;
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;
begin
Result := inherited MouseDown(AHitTest, AButton, AShift);
if (AButton = mbLeft) and (ssDouble in AShift) then
begin
Column.ApplyBestFit;
Result := True;
end;
end;
{ TcxGridFilterPopup }
constructor TcxGridFilterPopup.Create(AGridView: TcxGridTableView);
begin
inherited Create(AGridView.Site);
FGridView := AGridView;
AlignHorz := pahRight;
OwnerParent := FGridView.Site;
CaptureFocus := True;
IsTopMost := True;
FListBoxItems := TStringList.Create;
FValueList := Filter.CreateValueList;
CreateListBox;
end;
destructor TcxGridFilterPopup.Destroy;
begin
FValueList.Free;
FListBoxItems.Free;
inherited;
end;
function TcxGridFilterPopup.GetColumn: TcxGridColumn;
begin
Result := FOwnerViewInfo.Column;
end;
function TcxGridFilterPopup.GetFilter: TcxDataFilterCriteria;
begin
Result := FGridView.DataController.Filter;
end;
procedure TcxGridFilterPopup.SetOwnerViewInfo(Value: TcxGridColumnHeaderFilterButtonViewInfo);
begin
if FOwnerViewInfo <> Value then
begin
if (Value = nil) and Visible then
CloseUp;
FOwnerViewInfo := Value;
end;
end;
procedure TcxGridFilterPopup.ListBoxDrawItem(AControl: TcxListBox; ACanvas: TcxCanvas;
AIndex: Integer; ARect: TRect; AState: TOwnerDrawState);
begin
with AControl, ACanvas do
begin
FillRect(ARect);
Inc(ARect.Left, 2);
DrawText(Items[AIndex], ARect, cxSingleLine or cxAlignLeft or cxAlignTop);
Dec(ARect.Left, 2);
if odFocused in AState then DrawFocusRect(ARect);
end;
end;
procedure TcxGridFilterPopup.ListBoxKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
case Key of
VK_RETURN:
ApplyFilter(FListBox.ItemIndex);
VK_ESCAPE:
CloseUpAndFocusGridView;
end;
end;
procedure TcxGridFilterPopup.ListBoxMouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
begin
with FListBox do
ItemIndex := ItemAtPos(Point(X, Y), True);
end;
procedure TcxGridFilterPopup.ListBoxMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ApplyFilter(FListBox.ItemAtPos(Point(X, Y), True))
end;
procedure TcxGridFilterPopup.AddListBoxItems;
begin
Column.DataBinding.GetFilterStrings(FListBoxItems, FValueList);
end;
procedure TcxGridFilterPopup.AdjustListBoxSize;
var
ADropDownCount: Integer;
function CalculateClientHeight: Integer;
begin
Result := ADropDownCount * FListBox.ItemHeight;
end;
function CalculateClientWidth: Integer;
var
I, AItemWidth: Integer;
begin
Result := FGridView.Filtering.DropDownWidth;
if Result = 0 then
begin
for I := 0 to FListBoxItems.Count - 1 do
begin
AItemWidth := FListBox.Canvas.TextWidth(FListBoxItems[I]);
if AItemWidth > Result then Result := AItemWidth;
end;
Inc(Result, 2 * 2);
end;
if ADropDownCount < FListBoxItems.Count then
Inc(Result, GetScrollBarSize.cx);
end;
begin
with FListBox do
begin
ADropDownCount := FGridView.Filtering.GetDropDownCount(FListBoxItems.Count);
ItemHeight := Canvas.TextHeight('Qq');
ClientHeight := CalculateClientHeight;
ClientWidth := CalculateClientWidth;
if NCWidth + Width < FOwnerViewInfo.ColumnHeaderViewInfo.Width then
Width := FOwnerViewInfo.ColumnHeaderViewInfo.Width - NCWidth;
end;
end;
procedure TcxGridFilterPopup.ApplyFilter(AItemIndex: Integer);
begin
CloseUpAndFocusGridView;
if AItemIndex <> -1 then
begin
Filter.BeginUpdate;
try
with FValueList[AItemIndex]^ do
begin
if not (Kind in [fviAll, fviCustom]) then
Filter.Active := True;
case Kind of
fviAll:
Column.Filtered := False;
fviCustom:
FGridView.Filtering.RunCustomizeDialog(Column);
fviBlanks:
Column.DataBinding.AddToFilter(nil, foEqual, Value,
cxGetResourceString(@cxSFilterBlankCaption));
fviNonBlanks:
Column.DataBinding.AddToFilter(nil, foNotEqual, Value,
cxGetResourceString(@cxSFilterBlankCaption));
fviUser:
Column.DoUserFiltering(Value, DisplayText);
fviValue:
Column.DataBinding.AddToFilter(nil, foEqual, Value, DisplayText);
end;
end;
finally
Filter.EndUpdate;
end;
end;
end;
function TcxGridFilterPopup.CalculateOwnerBounds: TRect;
begin
Result := FOwnerViewInfo.Bounds;
with FOwnerViewInfo.ColumnHeaderViewInfo.Bounds do
begin
Result.Left := Left;
Result.Right := Right;
end;
end;
procedure TcxGridFilterPopup.CreateListBox;
begin
FListBox := TcxListBox.Create(Self);
with FListBox do
begin
Style.LookAndFeel.MasterLookAndFeel := TcxCustomGrid(GridView.Control).LookAndFeel;
ListStyle := lbOwnerDrawFixed;
with Style do
begin
BorderStyle := cbsNone;
HotTrack := False;
TransparentBorder := False;
end;
Parent := Self;
OnDrawItem := ListBoxDrawItem;
OnKeyDown := ListBoxKeyDown;
OnMouseMove := ListBoxMouseMove;
OnMouseUp := ListBoxMouseUp;
end;
end;
procedure TcxGridFilterPopup.InitPopup;
begin
ShowHourglassCursor;
try
inherited;
BorderStyle := FGridView.LookAndFeelPainter.PopupBorderStyle;
Font := TcxControlAccess(FGridView.Control).Font;
OwnerBounds := CalculateOwnerBounds;
with FListBox do
Canvas.Font := Font;
AddListBoxItems;
AdjustListBoxSize;
FListBox.Items := FListBoxItems;
FListBox.ItemIndex := FValueList.GetIndexByCriteriaItem(Column.DataBinding.FilterCriteriaItem);
finally
HideHourglassCursor;
end;
end;
procedure TcxGridFilterPopup.Paint;
begin
DrawFrame;
end;
procedure TcxGridFilterPopup.VisibleChanged;
begin
inherited;
if not Visible and (FOwnerViewInfo <> nil) then
begin
FOwnerViewInfo.State := gcsNone;
end;
end;
procedure TcxGridFilterPopup.CloseUp;
begin
inherited CloseUp;
FListBox.Clear;
TcxControlAccess(GridView.Site).FocusChanged;
//TcxCustomGridAccess(GridView.Control).UpdateFocusing(GridView.IsControlFocused{ Site.IsFocused});
//GridView.Controller.InvalidateSelection;
end;
procedure TcxGridFilterPopup.CloseUpAndFocusGridView;
begin
CloseUp;
end;
procedure TcxGridFilterPopup.Popup(AOwnerViewInfo: TcxGridColumnHeaderFilterButtonViewInfo);
begin
FOwnerViewInfo := AOwnerViewInfo;
inherited Popup(FListBox);
end;
{ TcxGridColumnHeaderFilterButtonViewInfo }
destructor TcxGridColumnHeaderFilterButtonViewInfo.Destroy;
begin
if GridView.Controller.HasFilterPopup and
(DropDownWindow.OwnerViewInfo = Self) then
DropDownWindow.OwnerViewInfo := nil;
inherited;
end;
function TcxGridColumnHeaderFilterButtonViewInfo.GetActive: Boolean;
begin
Result := Column.Filtered;
end;
function TcxGridColumnHeaderFilterButtonViewInfo.GetDropDownWindow: TcxGridFilterPopup;
begin
Result := GridView.Controller.FilterPopup;
end;
procedure TcxGridColumnHeaderFilterButtonViewInfo.BeforeStateChange;
begin
inherited;
if State = gcsPressed then CloseUp;
end;
function TcxGridColumnHeaderFilterButtonViewInfo.CalculateHeight: Integer;
begin
Result := LookAndFeelPainter.FilterDropDownButtonSize.Y;
end;
function TcxGridColumnHeaderFilterButtonViewInfo.CalculateWidth: Integer;
begin
Result := LookAndFeelPainter.FilterDropDownButtonSize.X;
end;
function TcxGridColumnHeaderFilterButtonViewInfo.EmulateMouseMoveAfterCalculate: Boolean;
begin
Result := True;
end;
function TcxGridColumnHeaderFilterButtonViewInfo.GetAlignmentHorz: TAlignment;
begin
Result := taRightJustify;
end;
function TcxGridColumnHeaderFilterButtonViewInfo.GetHitTestClass: TcxCustomGridHitTestClass;
begin
Result := TcxGridColumnHeaderFilterButtonHitTest;
end;
function TcxGridColumnHeaderFilterButtonViewInfo.GetHotTrack: Boolean;
begin
Result := True;
end;
function TcxGridColumnHeaderFilterButtonViewInfo.GetIsCheck: Boolean;
begin
Result := True;
end;
function TcxGridColumnHeaderFilterButtonViewInfo.GetPainterClass: TcxCustomGridCellPainterClass;
begin
Result := TcxGridColumnHeaderFilterButtonPainter;
end;
function TcxGridColumnHeaderFilterButtonViewInfo.GetTransparent: Boolean;
begin
Result := False;
end;
procedure TcxGridColumnHeaderFilterButtonViewInfo.StateChanged;
begin
inherited;
if State = gcsPressed then DropDown;
end;
procedure TcxGridColumnHeaderFilterButtonViewInfo.CloseUp;
begin
(* // check!
DropDownWindow.DestroyHandle;
*)
//GridView.Controller.InvalidateSelection;
end;
procedure TcxGridColumnHeaderFilterButtonViewInfo.DropDown;
begin
DropDownWindow.Popup(Self);
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;
function TcxGridColumnHeaderGlyphViewInfo.GetTransparent: Boolean;
begin
Result := True;
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.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, FAdditionalWidth);
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.CalculateHasTextOffsetLeft: Boolean;
var
I: Integer;
begin
Result := True;
for I := 0 to AreaViewInfoCount - 1 do
with AreaViewInfos[I] do
if IsOccupyingSpace and (AlignmentHorz = taLeftJustify) then Exit;
Result := False;
end;
function TcxGridColumnHeaderViewInfo.CalculateHasTextOffsetRight: Boolean;
var
I: Integer;
begin
Result := True;
for I := 0 to AreaViewInfoCount - 1 do
with AreaViewInfos[I] do
if IsOccupyingSpace and (AlignmentHorz = taRightJustify) then Exit;
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;
procedure CalcAreaViewInfos;
var
I: Integer;
begin
for I := 0 to AreaViewInfoCount - 1 do
AreaViewInfos[I].Calculate(Bounds, FTextAreaBounds);
end;
begin
FTextAreaBounds := inherited GetTextAreaBounds;
CalcAreaViewInfos;
if FHasTextOffsetLeft then
Inc(FTextAreaBounds.Left, cxGridCellTextOffset);
if FHasTextOffsetRight 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 = ccHeader);
end;
function TcxGridColumnHeaderViewInfo.CanPress: Boolean;
begin
Result := True;
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);
FHasTextOffsetLeft := CalculateHasTextOffsetLeft;
FHasTextOffsetRight := CalculateHasTextOffsetRight;
inherited;
CalculateTextAreaBounds;
end;
function TcxGridColumnHeaderViewInfo.GetAlignmentHorz: TAlignment;
begin
Result := FColumn.HeaderAlignmentHorz;
end;
function TcxGridColumnHeaderViewInfo.GetAlignmentVert: TcxAlignmentVert;
begin
Result := FColumn.HeaderAlignmentVert;
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;
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.GetHitTestClass: TcxCustomGridHitTestClass;
begin
Result := TcxGridColumnHeaderHitTest;
end;
function TcxGridColumnHeaderViewInfo.GetHotTrack: Boolean;
begin
Result := LookAndFeelPainter.IsHeaderHotTrack;
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
Result := FContainer.GetColumnMinWidth(Column);
end;
function TcxGridColumnHeaderViewInfo.GetMultiLine: Boolean;
begin
Result := FContainer.AutoHeight;
end;
function TcxGridColumnHeaderViewInfo.GetMultiLinePainting: Boolean;
begin
Result := inherited GetMultiLinePainting or FContainer.ItemMultiLinePainting;
end;
function TcxGridColumnHeaderViewInfo.GetPainterClass: TcxCustomGridCellPainterClass;
begin
Result := TcxGridColumnHeaderPainter;
end;
function TcxGridColumnHeaderViewInfo.GetShowEndEllipsis: Boolean;
begin
Result := GridView.OptionsView.HeaderEndEllipsis;
end;
function TcxGridColumnHeaderViewInfo.GetText: string;
begin
Result := Column.Caption;
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 - FAdditionalWidth;
end;
function TcxGridColumnHeaderViewInfo.HasCustomDraw: Boolean;
begin
Result := Column.HasCustomDrawHeader or GridView.HasCustomDrawColumnHeader;
end;
function TcxGridColumnHeaderViewInfo.HasGlyph: Boolean;
begin
Result := not FColumn.HeaderGlyph.Empty;
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 {2}
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;
begin
inherited;
case State of
gcsPressed:
MouseCapture := True;
gcsNone:
MouseCapture := False;
end;
end;
procedure TcxGridColumnHeaderViewInfo.Calculate(ALeftBound, ATopBound: Integer;
AWidth: Integer = -1; AHeight: Integer = -1);
procedure CheckHiddenBorders;
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(FAdditionalWidth, BorderWidth[bLeft]);
end;
if bTop in AHiddenBorders then
begin
Dec(ATopBound, BorderWidth[bTop]);
Inc(AHeight, BorderWidth[bTop]);
end;
Borders := cxBordersAll;
end;
end;
begin
FAdditionalWidth := 0;
if AWidth = -1 then
AWidth := CalculateWidth;
CalculateVisible(ALeftBound, AWidth);
CheckHiddenBorders;
inherited;
{if Visible then }CalculateTextAreaBounds;
end;
function TcxGridColumnHeaderViewInfo.GetBestFitWidth: Integer;
var
I: Integer;
begin
Result := BorderSize[bLeft] + TextAreaWidth + BorderSize[bRight] -
FAdditionalWidth;
if FHasTextOffsetLeft then Inc(Result, cxGridCellTextOffset);
if FHasTextOffsetRight then Inc(Result, cxGridCellTextOffset);
for I := 0 to AreaViewInfoCount - 1 do
with AreaViewInfos[I] do
if IsOccupyingSpace 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
GridView.Controller.PressedColumn := FColumn;
FColumn.DoHeaderClick;
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: TcxGridTableViewInfo);
begin
inherited;
FSpecific := AGridViewInfo.GetHeaderViewInfoSpecificClass.Create(Self);
end;
destructor TcxGridHeaderViewInfo.Destroy;
begin
FSpecific.Free;
inherited;
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;
FHeight := 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 {4}
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 := GridView.OptionsView.HeaderAutoHeight;
end;
function TcxGridHeaderViewInfo.GetColumn(Index: Integer): TcxGridColumn;
begin
Result := GridView.VisibleColumns[Index];
end;
function TcxGridHeaderViewInfo.GetColumnBackgroundBitmap: TBitmap;
begin {4}
Result := GridView.BackgroundBitmaps.GetBitmap(bbHeader);
end;
function TcxGridHeaderViewInfo.GetColumnCount: Integer;
begin
Result := GridView.VisibleColumnCount;
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: Boolean;
begin
Result := inherited GetItemMultiLinePainting or IsHeightAssigned;
end;
function TcxGridHeaderViewInfo.GetKind: TcxGridColumnContainerKind;
begin
Result := ccHeader;
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 {2}
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.CalculateHeight: Integer;
begin
Result := TcxGridGroupByBoxViewInfo(Container).ItemHeight;
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.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 {4}
Result := GridView.BackgroundBitmaps.GetBitmap(bbGroupByBox);
end;
function TcxGridGroupByBoxViewInfo.GetColumn(Index: Integer): TcxGridColumn;
begin
Result := GridView.GroupedColumns[Index];
end;
function TcxGridGroupByBoxViewInfo.GetColumnCount: Integer;
begin
Result := GridView.GroupedColumnCount;
end;
function TcxGridGroupByBoxViewInfo.GetColumnWidth(AColumn: TcxGridColumn): Integer;
begin
Result := Items[AColumn.GroupIndex].GetBestFitWidth;
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.GetItemClass: TcxGridColumnHeaderViewInfoClass;
begin
Result := TcxGridGroupByBoxColumnHeaderViewInfo;
end;
function TcxGridGroupByBoxViewInfo.GetKind: TcxGridColumnContainerKind;
begin
Result := ccGroupByBox;
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 }
function TcxGridFooterCellViewInfo.GetSummary: TcxDataSummary;
begin
Result := GridView.DataController.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 {4}
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 := TcxGridFooterCellHitTest;
end;
function TcxGridFooterCellViewInfo.GetIsPressed: Boolean;
begin
Result := False;
end;
function TcxGridFooterCellViewInfo.GetPainterClass: TcxCustomGridCellPainterClass;
begin
Result := TcxGridFooterCellPainter;
end;
function TcxGridFooterCellViewInfo.GetSummaryItemIndex: Integer;
begin
Result := Summary.FooterSummaryItems.IndexOfItemLink(Column);
end;
function TcxGridFooterCellViewInfo.GetText: string;
begin
if SummaryItemIndex = -1 then
Result := ''
else
Result := Summary.FooterSummaryTexts[SummaryItemIndex];
end;
procedure TcxGridFooterCellViewInfo.GetViewParams(var AParams: TcxViewParams);
begin
Column.Styles.GetFooterParams(nil, AParams);
end;
function TcxGridFooterCellViewInfo.GetVisible: Boolean;
begin
Result := SummaryItemIndex <> -1;
end;
function TcxGridFooterCellViewInfo.HasCustomDraw: Boolean;
begin
Result := Column.HasCustomDrawFooterCell or GridView.HasCustomDrawFooterCell;
end;
function TcxGridFooterCellViewInfo.GetBestFitWidth: Integer;
begin
Result := inherited GetBestFitWidth + 2 * LookAndFeelPainter.FooterCellOffset;
end;
{ TcxGridFooterViewInfo }
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] + inherited CalculateHeight + BorderSize[bBottom];
if HasSeparator then 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.CanCalculateAutoWidths: Boolean;
begin
Result := False;
end;
function TcxGridFooterViewInfo.GetAlignment: TcxGridPartAlignment;
begin
Result := gpaBottom;
end;
function TcxGridFooterViewInfo.GetAutoHeight: Boolean;
begin
Result := False;
end;
function TcxGridFooterViewInfo.GetBackgroundBitmap: TBitmap;
begin {4}
Result := GridView.BackgroundBitmaps.GetBitmap(bbFooter);
end;
function TcxGridFooterViewInfo.GetBordersBounds: TRect;
begin
Result := Bounds;
if HasSeparator then 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.GetItemClass: TcxGridColumnHeaderViewInfoClass;
begin
Result := TcxGridFooterCellViewInfo;
end;
function TcxGridFooterViewInfo.GetItemHeight(AIndex: Integer): Integer;
begin
Result := GridViewInfo.GetCellHeight(AIndex, ItemHeight);
end;
function TcxGridFooterViewInfo.GetItemLeftBound(AIndex: Integer): Integer;
begin
if Items[AIndex].Column.IsMostLeft then
Result := ItemsAreaBounds.Left
else
Result := GridViewInfo.HeaderViewInfo[AIndex].RealBounds.Left;
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(AIndex: Integer): Integer;
begin
Result := ItemsAreaBounds.Top + GridViewInfo.GetCellTopOffset(AIndex, ItemHeight);
end;
function TcxGridFooterViewInfo.GetKind: TcxGridColumnContainerKind;
begin
Result := ccFooter;
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.GetSeparatorColor: TColor;
begin
Result := GridViewInfo.GridLineColor;
end;
function TcxGridFooterViewInfo.GetSeparatorWidth: Integer;
begin
Result := FooterSeparatorWidth;
end;
procedure TcxGridFooterViewInfo.GetViewParams(var AParams: TcxViewParams);
begin
GridView.Styles.GetFooterParams(nil, 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[AIndex].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;
{ TcxCustomGridFilterButtonViewInfo }
constructor TcxCustomGridFilterButtonViewInfo.Create(AContainer: TcxGridFilterButtonsViewInfo);
begin
inherited Create(AContainer.FilterViewInfo.GridViewInfo);
FContainer := AContainer;
end;
function TcxCustomGridFilterButtonViewInfo.GetFilter: TcxDataFilterCriteria;
begin
Result := FContainer.FilterViewInfo.Filter;
end;
function TcxCustomGridFilterButtonViewInfo.GetGridView: TcxGridTableView;
begin
Result := TcxGridTableView(inherited GridView);
end;
function TcxCustomGridFilterButtonViewInfo.GetAlignment: TcxGridFilterButtonAlignment;
begin
Result := fbaLeft;
end;
function TcxCustomGridFilterButtonViewInfo.GetCanvas: TcxCanvas;
begin
Result := FContainer.FilterViewInfo.Canvas;
end;
function TcxCustomGridFilterButtonViewInfo.GetHotTrack: Boolean;
begin
Result := True;
end;
function TcxCustomGridFilterButtonViewInfo.GetVisible: Boolean;
begin
Result := not Filter.IsEmpty;
end;
procedure TcxCustomGridFilterButtonViewInfo.StateChanged;
begin
inherited;
case State of
gcsPressed:
MouseCapture := True;
gcsNone:
MouseCapture := False;
end;
end;
{ TcxGridFilterCloseButtonViewInfo }
function TcxGridFilterCloseButtonViewInfo.CalculateHeight: Integer;
begin
Result := LookAndFeelPainter.FilterCloseButtonSize.Y;
end;
function TcxGridFilterCloseButtonViewInfo.CalculateWidth: Integer;
begin
Result := LookAndFeelPainter.FilterCloseButtonSize.X;
end;
procedure TcxGridFilterCloseButtonViewInfo.Click;
begin
inherited;
Filter.Clear;
end;
function TcxGridFilterCloseButtonViewInfo.GetHitTestClass: TcxCustomGridHitTestClass;
begin
Result := TcxGridFilterCloseButtonHitTest;
end;
function TcxGridFilterCloseButtonViewInfo.GetPainterClass: TcxCustomGridCellPainterClass;
begin
Result := TcxGridFilterCloseButtonPainter;
end;
{ TcxGridFilterActivateButtonViewInfo }
function TcxGridFilterActivateButtonViewInfo.GetChecked: Boolean;
begin
Result := Filter.Active;
end;
function TcxGridFilterActivateButtonViewInfo.CalculateHeight: Integer;
begin
Result := LookAndFeelPainter.FilterActivateButtonSize.Y;
end;
function TcxGridFilterActivateButtonViewInfo.CalculateWidth: Integer;
begin
Result := LookAndFeelPainter.FilterActivateButtonSize.X;
end;
procedure TcxGridFilterActivateButtonViewInfo.Click;
begin
inherited;
with Filter do
Active := not Active;
end;
function TcxGridFilterActivateButtonViewInfo.GetHitTestClass: TcxCustomGridHitTestClass;
begin
Result := TcxGridFilterActivateButtonHitTest;
end;
function TcxGridFilterActivateButtonViewInfo.GetPainterClass: TcxCustomGridCellPainterClass;
begin
Result := TcxGridFilterActivateButtonPainter;
end;
{ TcxGridFilterCustomizeButtonViewInfo }
function TcxGridFilterCustomizeButtonViewInfo.CalculateHeight: Integer;
begin
Result := BorderWidth[bTop] + BorderWidth[bBottom] + TextAreaHeight +
2 * LookAndFeelPainter.ButtonTextOffset;
end;
function TcxGridFilterCustomizeButtonViewInfo.CalculateWidth: Integer;
begin
Result := BorderWidth[bLeft] + BorderWidth[bRight] + TextAreaWidth +
2 * LookAndFeelPainter.ButtonTextOffset;
end;
procedure TcxGridFilterCustomizeButtonViewInfo.Click;
begin
inherited;
GridView.Filtering.RunCustomizeDialog;
end;
function TcxGridFilterCustomizeButtonViewInfo.GetAlignment: TcxGridFilterButtonAlignment;
begin
Result := fbaRight;
end;
function TcxGridFilterCustomizeButtonViewInfo.GetAlignmentHorz: TAlignment;
begin
Result := taCenter;
end;
function TcxGridFilterCustomizeButtonViewInfo.GetAlignmentVert: TcxAlignmentVert;
begin
Result := vaCenter;
end;
function TcxGridFilterCustomizeButtonViewInfo.GetBorders: TcxBorders;
begin
Result := [bLeft, bTop, bRight, bBottom];
end;
function TcxGridFilterCustomizeButtonViewInfo.GetBorderWidth(AIndex: TcxBorder): Integer;
begin
Result := LookAndFeelPainter.ButtonBorderSize;
end;
function TcxGridFilterCustomizeButtonViewInfo.GetHitTestClass: TcxCustomGridHitTestClass;
begin
Result := TcxGridFilterCustomizeButtonHitTest;
end;
function TcxGridFilterCustomizeButtonViewInfo.GetPainterClass: TcxCustomGridCellPainterClass;
begin
Result := TcxGridFilterCustomizeButtonPainter;
end;
function TcxGridFilterCustomizeButtonViewInfo.GetText: string;
begin
Result := cxGetResourceString(@scxGridFilterCustomizeButtonCaption);
end;
function TcxGridFilterCustomizeButtonViewInfo.GetTextAreaBounds: TRect;
begin
Result := inherited GetTextAreaBounds;
if LookAndFeelPainter.ButtonSymbolState(GridCellStateToButtonState(State)) = cxbsPressed then
OffsetRect(Result, 1, 1);
end;
procedure TcxGridFilterCustomizeButtonViewInfo.GetViewParams(var AParams: TcxViewParams);
var
AState: TcxButtonState;
begin
AState := GridCellStateToButtonState(State);
with AParams do
begin
Color := LookAndFeelPainter.ButtonColor(AState);
Font := Container.FilterViewInfo.Params.Font;
TextColor := LookAndFeelPainter.ButtonSymbolColor(AState);
end;
end;
function TcxGridFilterCustomizeButtonViewInfo.GetVisible: Boolean;
begin
Result := GridView.Filtering.CustomizeDialog;
end;
{ TcxGridFilterButtonsViewInfo }
constructor TcxGridFilterButtonsViewInfo.Create(AFilterViewInfo: TcxGridFilterViewInfo);
begin
inherited Create;
FFilterViewInfo := AFilterViewInfo;
FItems := TList.Create;
AddItems;
end;
destructor TcxGridFilterButtonsViewInfo.Destroy;
begin
DestroyItems;
FItems.Free;
inherited;
end;
function TcxGridFilterButtonsViewInfo.GetCount: Integer;
begin
Result := FItems.Count;
end;
function TcxGridFilterButtonsViewInfo.GetGridView: TcxGridTableView;
begin
Result := FFilterViewInfo.GridView;
end;
function TcxGridFilterButtonsViewInfo.GetHeight: Integer;
var
I, AItemHeight: Integer;
begin
Result := 0;
for I := 0 to Count - 1 do
if Items[I].Visible then
begin
AItemHeight := Items[I].CalculateHeight;
if Result < AItemHeight then Result := AItemHeight;
end;
if Result <> 0 then Inc(Result, 2 * FilterButtonsFirstOffset);
end;
function TcxGridFilterButtonsViewInfo.GetItem(Index: Integer): TcxCustomGridFilterButtonViewInfo;
begin
Result := FItems[Index];
end;
function TcxGridFilterButtonsViewInfo.GetWidth(AAlignment: TcxGridFilterButtonAlignment): Integer;
var
I: Integer;
begin
Result := 0;
if Count <> 0 then
begin
for I := 0 to Count - 1 do
with Items[I] do
if Visible and (Alignment = AAlignment) then
Inc(Result, CalculateWidth + FilterButtonsOffset);
if Result <> 0 then
Inc(Result, 2 * FilterButtonsFirstOffset - FilterButtonsOffset);
end;
end;
function TcxGridFilterButtonsViewInfo.GetWidthLeftPart: Integer;
begin
Result := GetWidth(fbaLeft);
end;
function TcxGridFilterButtonsViewInfo.GetWidthRightPart: Integer;
begin
Result := GetWidth(fbaRight);
end;
procedure TcxGridFilterButtonsViewInfo.DestroyItems;
var
I: Integer;
begin
for I := 0 to Count - 1 do Items[I].Free;
FItems.Clear;
end;
procedure TcxGridFilterButtonsViewInfo.AddItems;
begin
AddItem(TcxGridFilterCloseButtonViewInfo);
AddItem(TcxGridFilterActivateButtonViewInfo);
AddItem(TcxGridFilterCustomizeButtonViewInfo);
end;
procedure TcxGridFilterButtonsViewInfo.AddItem(AItemClass: TcxCustomGridFilterButtonViewInfoClass);
begin
FItems.Add(AItemClass.Create(Self));
end;
procedure TcxGridFilterButtonsViewInfo.Calculate(const ABounds: TRect);
var
ALeftMargin, ARightMargin, ALeft, I: Integer;
begin
ALeftMargin := ABounds.Left + FilterButtonsFirstOffset;
ARightMargin := ABounds.Right - FilterButtonsFirstOffset;
for I := 0 to Count - 1 do
with Items[I], ABounds do
if Visible then
begin
if Alignment = fbaLeft then
ALeft := ALeftMargin
else
ALeft := ARightMargin - CalculateWidth;
Calculate(ALeft, MulDiv(Top + Bottom - CalculateHeight, 1, 2));
if Alignment = fbaLeft then
ALeftMargin := Bounds.Right + FilterButtonsOffset
else
ARightMargin := Bounds.Left - FilterButtonsOffset;
end;
end;
function TcxGridFilterButtonsViewInfo.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;
{ TcxGridFilterViewInfo }
constructor TcxGridFilterViewInfo.Create(AGridViewInfo: TcxGridTableViewInfo);
begin
inherited;
CreateButtonsViewInfo;
end;
destructor TcxGridFilterViewInfo.Destroy;
begin
DestroyButtonsViewInfo;
inherited;
end;
function TcxGridFilterViewInfo.GetFilter: TcxDataFilterCriteria;
begin
Result := GridView.DataController.Filter;
end;
function TcxGridFilterViewInfo.GetFiltering: TcxGridTableFiltering;
begin
Result := GridView.Filtering;
end;
procedure TcxGridFilterViewInfo.CreateButtonsViewInfo;
begin
FButtonsViewInfo := GetButtonsViewInfoClass.Create(Self);
end;
procedure TcxGridFilterViewInfo.DestroyButtonsViewInfo;
begin
FreeAndNil(FButtonsViewInfo);
end;
function TcxGridFilterViewInfo.CalculateButtonsViewInfoBounds: TRect;
begin
Result := Bounds;
end;
function TcxGridFilterViewInfo.CalculateHeight: Integer;
var
AButtonsHeight: Integer;
begin
Result := FilterTextOffset + TextAreaHeight + FilterTextOffset;
AButtonsHeight := FButtonsViewInfo.Height;
if Result < AButtonsHeight then Result := AButtonsHeight;
end;
function TcxGridFilterViewInfo.CalculateWidth: Integer;
begin
Result := GridViewInfo.ClientWidth;
end;
function TcxGridFilterViewInfo.GetAlignment: TcxGridPartAlignment;
begin
Result := gpaBottom;
end;
function TcxGridFilterViewInfo.GetAlignmentVert: TcxAlignmentVert;
begin
Result := vaCenter;
end;
function TcxGridFilterViewInfo.GetBackgroundBitmap: TBitmap;
begin {4}
Result := GridView.BackgroundBitmaps.GetBitmap(bbFilterBox);
end;
function TcxGridFilterViewInfo.GetHitTestClass: TcxCustomGridHitTestClass;
begin
Result := TcxGridFilterHitTest;
end;
function TcxGridFilterViewInfo.GetIsAutoWidth: Boolean;
begin
Result := True;
end;
function TcxGridFilterViewInfo.GetIsScrollable: Boolean;
begin
Result := False;
end;
function TcxGridFilterViewInfo.GetPainterClass: TcxCustomGridCellPainterClass;
begin
Result := TcxGridFilterPainter;
end;
function TcxGridFilterViewInfo.GetText: string;
begin
Result := Filter.FilterCaption;
if Result = '' then
Result := cxGetResourceString(@scxGridFilterIsEmpty);
end;
function TcxGridFilterViewInfo.GetTextAreaBounds: TRect;
begin
Result := inherited GetTextAreaBounds;
Inc(Result.Left, FButtonsViewInfo.WidthLeftPart);
Dec(Result.Right, FButtonsViewInfo.WidthRightPart);
InflateRect(Result, -FilterTextOffset, 0);
end;
procedure TcxGridFilterViewInfo.GetViewParams(var AParams: TcxViewParams);
begin
GridView.Styles.GetViewParams(vsFilterBox, nil, nil, AParams);
end;
function TcxGridFilterViewInfo.GetVisible: Boolean;
begin
Result := (Filtering.Visible = fvAlways) or
(Filtering.Visible = fvNonEmpty) and not Filter.IsEmpty;
end;
function TcxGridFilterViewInfo.GetButtonsViewInfoClass: TcxGridFilterButtonsViewInfoClass;
begin
Result := TcxGridFilterButtonsViewInfo;
end;
procedure TcxGridFilterViewInfo.Calculate(ALeftBound, ATopBound: Integer;
AWidth: Integer = -1; AHeight: Integer = -1);
begin
inherited;
FButtonsViewInfo.Calculate(CalculateButtonsViewInfoBounds);
end;
function TcxGridFilterViewInfo.GetHitTest(const P: TPoint): TcxCustomGridHitTest;
begin
Result := FButtonsViewInfo.GetHitTest(P);
if Result = nil then
Result := inherited GetHitTest(P);
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.GetPainterClass: TcxCustomGridCellPainterClass;
begin
Result := TcxGridIndicatorHeaderItemPainter;
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.GetBackgroundBitmap: TBitmap;
begin {4}
Result := GridView.BackgroundBitmaps.GetBitmap(bbIndicator);
end;
function TcxGridIndicatorRowItemViewInfo.GetIndicatorKind: TcxIndicatorKind;
var
ARecordSelected: Boolean;
begin
if GridRecord.IsNewItemRow then
Result := ikInsert
else
if GridRecord.IsEditing then
if dceInsert in GridView.DataController.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
AHitTest.ViewInfo := GridRecord.ViewInfo;
end;
function TcxGridIndicatorRowItemViewInfo.GetHitTest(const P: TPoint): TcxCustomGridHitTest;
begin
if TcxCustomGridRowViewInfo(GridRecord.ViewInfo).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.GetBackgroundBitmap: TBitmap;
begin {4}
Result := GridViewInfo.FooterViewInfo.BackgroundBitmap;
end;
function TcxGridIndicatorFooterItemViewInfo.GetBorders: TcxBorders;
begin
Result := LookAndFeelPainter.FooterBorders;
end;
function TcxGridIndicatorFooterItemViewInfo.GetBordersBounds: TRect;
begin
Result := Bounds;
if HasSeparator then Inc(Result.Top, SeparatorWidth);
end;
function TcxGridIndicatorFooterItemViewInfo.GetBorderWidth(AIndex: TcxBorder): Integer;
begin
Result := LookAndFeelPainter.FooterBorderSize;
if (AIndex = bTop) and HasSeparator 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 := 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.GetBackgroundBitmap: TBitmap;
begin {4}
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;
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
AddItem(Bounds.Top, GridViewInfo.HeaderViewInfo.Height, TcxGridIndicatorHeaderItemViewInfo);
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.GetRowViewInfo: TcxCustomGridRowViewInfo;
begin
Result := Container.RowViewInfo;
end;
function TcxGridRowFooterCellViewInfo.GetHitTestClass: TcxCustomGridHitTestClass;
begin
Result := TcxGridGroupFooterCellHitTest;
end;
function TcxGridRowFooterCellViewInfo.GetSummaryItemIndex: Integer;
begin
Result := Summary.GroupFooterIndexOfItemLink[Container.GroupLevel, Column];
end;
function TcxGridRowFooterCellViewInfo.GetText: string;
begin
Result := Summary.GroupFooterSummaryTexts[GridRecord.Index, Container.GroupLevel,
SummaryItemIndex];
end;
procedure TcxGridRowFooterCellViewInfo.GetViewParams(var AParams: TcxViewParams);
begin
Column.Styles.GetFooterParams(GridRecord, AParams);
end;
{ TcxGridRowFooterViewInfo }
constructor TcxGridRowFooterViewInfo.Create(AContainer: TcxGridRowFootersViewInfo;
ALevel: Integer);
begin
inherited Create(AContainer.GridViewInfo);
FContainer := AContainer;
FLevel := ALevel;
end;
function TcxGridRowFooterViewInfo.GetIndent: Integer;
begin
Result := GridViewInfo.LevelIndent * (FContainer.RowViewInfo.Level - FLevel);
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.CalculateBounds: TRect;
begin
Result := Bounds;
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.GetItemClass: TcxGridColumnHeaderViewInfoClass;
begin
Result := TcxGridRowFooterCellViewInfo;
end;
procedure TcxGridRowFooterViewInfo.GetViewParams(var AParams: TcxViewParams);
begin
GridView.Styles.GetFooterParams(GridRecord, nil, AParams);
end;
function TcxGridRowFooterViewInfo.GetVisible: Boolean;
begin
Result := True;
end;
function TcxGridRowFooterViewInfo.HasSeparator: Boolean;
begin
Result := False;
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 := FItems[Index];
end;
function TcxGridRowFootersViewInfo.GetVisibleItem(Index: Integer): TcxGridRowFooterViewInfo;
var
I: Integer;
begin
for I := 0 to Count - 1 do
begin
Result := Items[I];
if Result.Level = Index 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].Level * GridViewInfo.LevelIndent, 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(ACellIndex: Integer): Integer;
var
I: Integer;
begin
Result := 0;
for I := 0 to Count - 1 do
Result := Max(Result, Items[I][ACellIndex].GetBestFitWidth);
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;
procedure TcxGridRowFootersViewInfo.Offset(DX, DY: Integer);
var
I: Integer;
begin {2}
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.GetHasSeparator: Boolean;
begin
Result := SeparatorWidth <> 0;
end;
function TcxCustomGridRowViewInfo.GetLevel: Integer;
begin
Result := GridRecord.Level;
end;
function TcxCustomGridRowViewInfo.GetLevelIndent: Integer;
begin
Result := Level * 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;
if HasFooter(Level - Index) then
Result.Bottom := FFootersViewInfo.VisibleItems[Level - Index].Bounds.Top;
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.GetSeparatorWidth: Integer;
begin
if ShowSeparator then
Result := RecordsViewInfo.SeparatorWidth
else
Result := 0;
end;
procedure TcxCustomGridRowViewInfo.CreateFootersViewInfo;
begin
FFootersViewInfo := GetFootersViewInfoClass.Create(Self);
end;
procedure TcxCustomGridRowViewInfo.DestroyFootersViewInfo;
begin
FFootersViewInfo.Free;
end;
procedure TcxCustomGridRowViewInfo.RecreateFootersViewInfo;
begin
DestroyFootersViewInfo;
CreateFootersViewInfo;
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 HasFooter(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;
function TcxCustomGridRowViewInfo.GetAutoHeight: Boolean;
begin
Result := RecordsViewInfo.AutoRecordHeight;
end;
function TcxCustomGridRowViewInfo.GetBaseHeight: Integer;
begin
Result := DataHeight;
end;
function TcxCustomGridRowViewInfo.GetBottomPartHeight: Integer;
begin
Result := FFootersViewInfo.Height + SeparatorWidth;
if HasLastHorzGridLine then
Inc(Result, GridViewInfo.GridLineWidth);
end;
function TcxCustomGridRowViewInfo.GetCellTransparent(ACell: TcxGridTableCellViewInfo): Boolean;
begin {4}
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.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
I: Integer;
begin
with Result do
begin
Left := ContentIndent;
Right := Left + ContentWidth;
for I := 0 to Level - 1 do
if GridRecord.IsParentRecordLast[I] then
Dec(Left, GridViewInfo.LevelIndent)
else
Break;
Bottom := Bounds.Bottom;
Top := Bottom - SeparatorWidth;
end;
end;
function TcxCustomGridRowViewInfo.GetSeparatorColor: TColor;
begin
Result := GridView.OptionsView.GetRowSeparatorColor;
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.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];
end;
{ Result :=
(GridView.OptionsView.GroupFooters = gfVisibleWhenExpanded) and
((ALevel <> Level) and GridRecord.IsParentRecordLast[ALevel]) or
(GridView.OptionsView.GroupFooters = gfAlwaysVisible) and
(ALevel <> 0) and GridRecord.IsParentRecordLast[ALevel - 1];}
end;
function TcxCustomGridRowViewInfo.HasLastHorzGridLine: Boolean;
begin
Result := RecordsViewInfo.HasLastHorzGridLine(Self) and GridRecord.IsLast;
end;
procedure TcxCustomGridRowViewInfo.Offset(DX, DY: Integer);
begin {2}
inherited;
FIndicatorItem.DoOffset(0, DY);
FFootersViewInfo.Offset(DX, DY);
end;
procedure TcxCustomGridRowViewInfo.BeforeRecalculation;
begin
inherited;
FFootersViewInfo.BeforeRecalculation;
end;
procedure TcxCustomGridRowViewInfo.Calculate(ALeftBound, ATopBound: Integer;
AWidth: Integer = -1; AHeight: Integer = -1);
begin
RecreateFootersViewInfo;
inherited;
GridViewInfo.IndicatorViewInfo.CalculateRowItem(Self, FIndicatorItem);
FFootersViewInfo.Calculate(ContentIndent, 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
with AGridRecord do
Expanded := not Expanded;
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
Result := FFootersViewInfo.GetHitTest(P);
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;
{ TcxGridRowsViewInfo }
destructor TcxGridRowsViewInfo.Destroy;
begin
FNewItemRowViewInfo.Free;
inherited;
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.GetHasNewItemRecord: Boolean;
begin
Result := NewItemRowViewInfo <> nil;
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.Calculate;
procedure CalculateItems;
var
I: Integer;
begin
for I := 0 to FPartVisibleCount - 1 do
Items[I].MainCalculate(GetItemLeftBound(I), GetItemTopBound(I));
end;
begin
CalculateConsts;
inherited;
FContentBounds := CalculateContentBounds;
if GridViewInfo.CalculateDown and HasNewItemRecord then
FNewItemRowViewInfo.MainCalculate(ContentBounds.Left, Bounds.Top);
CalculateVisibleCount; {2}
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 := Bounds;
if HasNewItemRecord then
Inc(Result.Top, FNewItemRowViewInfo.Height);
end;
function TcxGridRowsViewInfo.CalculateDataRowHeight: Integer;
begin
Result := FRowHeight;
end;
function TcxGridRowsViewInfo.CalculateGroupRowHeight: Integer;
var
AParams: TcxViewParams;
begin
Result := GridView.OptionsView.GroupRowHeight;
if Result = 0 then
begin
GridView.Styles.GetGroupParams(nil, 0, AParams);
Result := CalculateCustomGroupRowHeight(AParams);
end;
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.CalculateRowHeight: Integer;
var
I, AFontHeight: Integer;
AParams: TcxViewParams;
begin
if IsDataRowHeightAssigned then
Result := GridView.OptionsView.DataRowHeight
else
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;
end;
procedure TcxGridRowsViewInfo.CalculateVisibleCount;
var
ALastBottom, I, AHeight: Integer;
begin {2}
inherited;
FPartVisibleCount := 0;
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 (FVisibleCount = 0) and (MaxCount > 0) then
FVisibleCount := 1;
end;
function TcxGridRowsViewInfo.GetAutoDataRecordHeight: Boolean;
begin
Result := inherited GetAutoDataRecordHeight and not IsDataRowHeightAssigned;
end;
function TcxGridRowsViewInfo.GetCommonDataRowHeight: Integer;
begin
Result := FDataRowHeight + SeparatorWidth;
end;
function TcxGridRowsViewInfo.GetGroupBackgroundBitmap: TBitmap;
begin
Result := GridView.BackgroundBitmaps.GetBitmap(bbGroup);
end;
function TcxGridRowsViewInfo.GetItemLeftBound(AIndex: Integer): Integer;
begin {2}
Result := ContentBounds.Left;
end;
function TcxGridRowsViewInfo.GetItemsOffset(AItemCountDelta: Integer): Integer;
var
I: Integer;
begin {2}
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 {2}
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.GetShowNewItemRow: Boolean;
begin
Result := GridView.OptionsView.NewItemRow;
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;
procedure TcxGridRowsViewInfo.OffsetItem(AIndex, AOffset: Integer);
begin {2}
Items[AIndex].DoOffset(0, AOffset);
end;
procedure TcxGridRowsViewInfo.AfterConstruction;
begin
inherited;
if ShowNewItemRow then
FNewItemRowViewInfo := GetNewItemRowViewInfoClass.Create(Self, ViewData.NewItemRow);
end;
function TcxGridRowsViewInfo.CalculateCustomGroupRowHeight(AParams: TcxViewParams): Integer;
begin
Result := GridViewInfo.GetFontHeight(AParams.Font);
if Result < GridViewInfo.ExpandButtonSize then
Result := GridViewInfo.ExpandButtonSize;
GetCellTextAreaSize(Result);
Result := GetCellHeight(Result);
{if GridLines in [glBoth, glHorizontal] then
Inc(Result, GridViewInfo.GridLineWidth);}
end;
function TcxGridRowsViewInfo.CanDataRowSize: Boolean;
begin
Result := 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(ACellIndex: Integer): Integer;
var
I: Integer;
begin
Result := 0;
for I := 0 to Count - 1 do
Result := Max(Result, Items[I].FootersViewInfo.GetCellBestFitWidth(ACellIndex));
end;
function TcxGridRowsViewInfo.GetHitTest(const P: TPoint): TcxCustomGridHitTest;
begin
Result := inherited GetHitTest(P);
if (Result = nil) and HasNewItemRecord then
Result := FNewItemRowViewInfo.GetHitTest(P);
end;
function TcxGridRowsViewInfo.GetRealItem(ARecord: TcxCustomGridRecord;
ARecordIndex: Integer): TcxCustomGridRecordViewInfo;
begin
if (ARecordIndex = -1) and (ARecord <> nil) and
ViewData.HasNewItemRecord and ARecord.IsNewItemRecord then
Result := NewItemRowViewInfo
else
Result := inherited GetRealItem(ARecord, ARecordIndex);
end;
function TcxGridRowsViewInfo.GetRestHeight(ATopBound: Integer): Integer;
begin
if GridViewInfo.IsCalculating then
Result := FRestHeight
else
Result := CalculateRestHeight(ATopBound);
end;
function TcxGridRowsViewInfo.IsDataRowHeightAssigned: Boolean;
begin
Result := GridView.OptionsView.DataRowHeight <> 0;
end;
procedure TcxGridRowsViewInfo.Offset(DX, DY: Integer);
var
I: Integer;
begin {2}
inherited;
OffsetRect(FContentBounds, DX, 0);
if HasNewItemRecord then
FNewItemRowViewInfo.DoOffset(DX, 0);
for I := 0 to Count - 1 do
Items[I].DoOffset(DX, 0);
end;
{ TcxGridTableViewInfo }
constructor TcxGridTableViewInfo.Create(AGridView: TcxCustomGridView);
begin
FParts := TList.Create;
inherited;
end;
destructor TcxGridTableViewInfo.Destroy;
begin
FParts.Free;
inherited;
end;
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 {4}
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.GetPart(Index: Integer): TcxCustomGridPartViewInfo;
begin
Result := FParts[Index];
end;
function TcxGridTableViewInfo.GetPartCount: Integer;
begin
Result := FParts.Count;
end;
function TcxGridTableViewInfo.GetPartsBottomHeight: Integer;
begin
Result := GetPartsCustomHeight(gpaBottom);
end;
function TcxGridTableViewInfo.GetPartsCustomHeight(AAlignment: TcxGridPartAlignment): Integer;
var
I: Integer;
begin
Result := 0;
for I := 0 to PartCount - 1 do
with Parts[I] do
if Alignment = AAlignment then Inc(Result, Height);
end;
function TcxGridTableViewInfo.GetPartsTopHeight: Integer;
begin
Result := GetPartsCustomHeight(gpaTop);
end;
function TcxGridTableViewInfo.GetRecordsViewInfo: TcxGridRowsViewInfo;
begin
Result := TcxGridRowsViewInfo(inherited RecordsViewInfo);
end;
function TcxGridTableViewInfo.GetViewData: TcxGridViewData;
begin
Result := TcxGridViewData(inherited ViewData);
end;
procedure TcxGridTableViewInfo.AddPart(AItem: TcxCustomGridPartViewInfo);
begin
FParts.Add(AItem);
end;
procedure TcxGridTableViewInfo.RemovePart(AItem: TcxCustomGridPartViewInfo);
begin
FParts.Remove(AItem);
end;
procedure TcxGridTableViewInfo.AfterCalculating;
begin
inherited;
if not IsInternalUse and not SizeCalculating and (RecordsViewInfo.DataRowHeight <> FPrevDataRowHeight) then
Controller.PostGridModeBufferCountUpdate;
end;
procedure TcxGridTableViewInfo.BeforeCalculating;
begin
inherited;
if not IsInternalUse and not SizeCalculating then
FPrevDataRowHeight := RecordsViewInfo.DataRowHeight;
end;
procedure TcxGridTableViewInfo.CreateViewInfos;
begin
// inherited; - because of new item row view info in banded view
FGroupByBoxViewInfo := GetGroupByBoxViewInfoClass.Create(Self);
FHeaderViewInfo := GetHeaderViewInfoClass.Create(Self);
FFilterViewInfo := GetFilterViewInfoClass.Create(Self);
FFooterViewInfo := GetFooterViewInfoClass.Create(Self);
FIndicatorViewInfo := GetIndicatorViewInfoClass.Create(Self);
inherited;
end;
procedure TcxGridTableViewInfo.DestroyViewInfos(AIsRecreating: Boolean);
begin
inherited;
FreeAndNil(FIndicatorViewInfo);
FreeAndNil(FFooterViewInfo);
FreeAndNil(FHeaderViewInfo);
FreeAndNil(FGroupByBoxViewInfo);
FreeAndNil(FFilterViewInfo);
// inherited;
end;
{var
max: integer;}
procedure TcxGridTableViewInfo.Calculate;
(*var
ft,lt{,i}: Integer;*)
begin
//ft := gettickcount;
//for I := 1 to 10 do
try
RecreateViewInfos;
GroupByBoxViewInfo.MainCalculate;
HeaderViewInfo.MainCalculate;
FilterViewInfo.MainCalculate;
FooterViewInfo.MainCalculate;
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);
Inc(Result.Top, PartsTopHeight);
Dec(Result.Bottom, PartsBottomHeight);
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 := GetNonRowsAreaHeight(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.CalculateVisibleEqualHeightRecordCount: Integer;
begin
Result := (Bounds.Bottom - Bounds.Top - GetNonRowsAreaHeight(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.GetDefaultGridModeBufferCount: Integer;
begin
if RecordsViewInfo.DataRowHeight = 0 then
begin
Controller.PostGridModeBufferCountUpdate;
Result := 0;
end
else
Result := Screen.Height div RecordsViewInfo.DataRowHeight + 2;
end;
procedure TcxGridTableViewInfo.Offset(DX, DY: Integer);
var
I: Integer;
begin {2}
for I := 0 to PartCount - 1 do
with Parts[I] do
if IsScrollable then Offset(DX, 0);
inherited;
end;
procedure TcxGridTableViewInfo.RecreateViewInfos;
begin
FDataWidth := 0;
inherited;
end;
function TcxGridTableViewInfo.GetFooterPainterClass: TcxGridFooterPainterClass;
begin
Result := TcxGridFooterPainter;
end;
function TcxGridTableViewInfo.GetRecordsViewInfoClass: TcxCustomGridRecordsViewInfoClass;
begin
Result := TcxGridRowsViewInfo;
end;
function TcxGridTableViewInfo.CalculateDataWidth: Integer;
begin
Result := HeaderViewInfo.Width;
if (Result = 0) and GridView.OptionsView.ColumnAutoWidth then
Result := ClientWidth;
end;
function TcxGridTableViewInfo.CalculatePartBounds(APart: TcxCustomGridPartViewInfo): TRect;
var
I: Integer;
begin
Result := ClientBounds;
if APart.IsScrollable then
Dec(Result.Left, LeftPos)
else
if APart.IsAutoWidth then
begin
Result.Left := Bounds.Left;
Result.Right := Bounds.Right;
end;
if not APart.IsAutoWidth then
Result.Right := Result.Left + APart.CalculateWidth;
for I := PartCount - 1 downto APart.Index do
case Parts[I].Alignment of
gpaTop:
Dec(Result.Top, Parts[I].Height);
gpaBottom:
Inc(Result.Bottom, Parts[I].Height);
end;
case APart.Alignment of
gpaTop:
Result.Bottom := Result.Top + APart.Height;
gpaBottom:
Result.Top := Result.Bottom - APart.Height;
end;
end;
function TcxGridTableViewInfo.GetFilterViewInfoClass: TcxGridFilterViewInfoClass;
begin
Result := TcxGridFilterViewInfo;
end;
function TcxGridTableViewInfo.GetFirstItemAdditionalWidth: Integer;
begin
Result := (GridView.GroupedColumnCount + Ord(GridView.IsMaster)) * LevelIndent;
end;
function TcxGridTableViewInfo.GetFooterViewInfoClass: TcxGridFooterViewInfoClass;
begin
Result := TcxGridFooterViewInfo;
end;
function TcxGridTableViewInfo.GetGridLineWidth: Integer;
begin
Result := 1;
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.GetLevelSeparatorColor: TColor;
begin
Result := GridLineColor;
end;
function TcxGridTableViewInfo.GetHeaderViewInfoSpecificClass: TcxGridHeaderViewInfoSpecificClass;
begin
Result := TcxGridHeaderViewInfoSpecific;
end;
function TcxGridTableViewInfo.GetNonRowsAreaHeight(ACheckScrollBar: Boolean): Integer;
begin
Result := PartsTopHeight + PartsBottomHeight;
with RecordsViewInfo do
if NewItemRowViewInfo <> nil then
Inc(Result, NewItemRowViewInfo.Height);
if ACheckScrollBar then AddScrollBarHeight(Result);
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.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.GetHitTest(const P: TPoint): TcxCustomGridHitTest;
var
AScreenP: TPoint;
I: Integer;
begin
AScreenP := Site.ClientToScreen(P);
if (Controller.CustomizationForm <> nil) and
PtInRect(Controller.CustomizationForm.BoundsRect, AScreenP) then
begin
Result := TcxGridCustomozationFormHitTest.Instance(P);
InitHitTest(Result);
end
else
begin
if PtInRect(Site.ClientBounds, P) then
begin
Result := IndicatorViewInfo.GetHitTest(P);
if Result <> nil then Exit;
for I := 0 to PartCount - 1 do
if Parts[I].Visible then
begin
Result := Parts[I].GetHitTest(P);
if Result <> nil then Exit;
end;
end;
Result := inherited GetHitTest(P);
end;
end;
function TcxGridTableViewInfo.GetOffsetBounds(AItemsOffset: Integer; out AUpdateBounds: TRect): TRect;
begin {2}
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 {2}
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.GetNearestPopupHeight(AHeight: Integer;
AAdditionalRecord: Boolean = False): Integer;
var
ARowCount: Integer;
begin
ARowCount := (AHeight - GetNonRowsAreaHeight(True)) div RecordsViewInfo.DataRowHeight;
if ARowCount < 1 then ARowCount := 1;
if ARowCount > ViewData.RowCount + Ord(AAdditionalRecord) then
ARowCount := ViewData.RowCount + Ord(AAdditionalRecord);
Result := GetNonRowsAreaHeight(True) + ARowCount * RecordsViewInfo.DataRowHeight;
end;
function TcxGridTableViewInfo.GetPopupHeight(ADropDownRowCount: Integer): Integer;
begin
Result := GetNonRowsAreaHeight(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 }
function TcxGridMasterTableViewInfoCacheItem.GetGridRecord: TcxGridMasterDataRow;
begin
Result := TcxGridMasterDataRow(inherited GridRecord);
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;
IsDetailsSiteHeightAssigned := False;
IsDetailsSiteNormalHeightAssigned := False;
IsDetailsSiteWidthAssigned := False;
if GridRecord.ActiveDetailGridViewExists then
GridRecord.ActiveDetailGridView.ViewInfoCache.UnassignValues(AKeepMaster);
finally
FUnassigningValues := False;
end;
end;
{ TcxGridTableViewInfoCache }
function TcxGridTableViewInfoCache.GetItemClass: TcxCustomGridViewInfoCacheItemClass;
begin
if GridView.IsMaster then
Result := TcxGridMasterTableViewInfoCacheItem
else
Result := TcxGridTableViewInfoCacheItem;
end;
{ TcxGridColumnOptions }
constructor TcxGridColumnOptions.Create(AItem: TcxCustomGridTableItem);
begin
inherited;
FHorzSizing := True;
end;
function TcxGridColumnOptions.GetGridView: TcxGridTableView;
begin
Result := TcxGridTableView(inherited GridView);
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
Self.HorzSizing := HorzSizing;
inherited;
end;
{ TcxGridColumnStyles }
function TcxGridColumnStyles.GetGridViewValue: TcxGridTableView;
begin
Result := TcxGridTableView(inherited GridView);
end;
function TcxGridColumnStyles.GetItem: TcxGridColumn;
begin
Result := TcxGridColumn(inherited Item);
end;
procedure TcxGridColumnStyles.GetDefaultViewParams(Index: Integer; AData: TObject;
out AParams: TcxViewParams);
begin
case Index of
isFooter:
GridView.Styles.GetFooterParams(TcxCustomGridRecord(AData), Item, 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.Header := Header;
Self.OnGetFooterStyle := OnGetFooterStyle;
Self.OnGetHeaderStyle := OnGetHeaderStyle;
end;
end;
procedure TcxGridColumnStyles.GetFooterParams(ARecord: TcxCustomGridRecord;
out AParams: TcxViewParams);
var
AStyle: TcxStyle;
begin
AStyle := nil;
if Assigned(FOnGetFooterStyle) then
FOnGetFooterStyle(GridView, ARecord, Item, AStyle);
GetViewParams(isFooter, ARecord, AStyle, AParams);
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;
{ TcxGridColumn }
constructor TcxGridColumn.Create(AOwner: TComponent);
begin
inherited;
FHeaderGlyphAlignmentVert := vaCenter;
end;
destructor TcxGridColumn.Destroy;
begin
IsPreview := False;
inherited;
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.GetHidden: Boolean;
begin
Result := FHidden or IsPreview;
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;
procedure TcxGridColumn.SetFooterAlignmentHorz(Value: TAlignment);
begin
if (FooterAlignmentHorz <> Value) or IsLoading then
begin
FFooterAlignmentHorz := Value;
FIsFooterAlignmentHorzAssigned := 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.SetHidden(Value: Boolean);
begin
if Hidden <> Value then
begin
FHidden := Value;
HiddenChanged;
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.SetOptions(Value: TcxGridColumnOptions);
begin
inherited Options := Value;
end;
procedure TcxGridColumn.SetStyles(Value: TcxGridColumnStyles);
begin
inherited Styles := Value;
end;
function TcxGridColumn.IsFooterAlignmentHorzStored: Boolean;
begin
Result := FIsFooterAlignmentHorzAssigned and
(FFooterAlignmentHorz <> GetDefaultValuesProvider.DefaultAlignment);
end;
function TcxGridColumn.IsHiddenStored: Boolean;
begin
Result := Hidden and not IsPreview;
end;
procedure TcxGridColumn.HeaderGlyphChanged(Sender: TObject);
begin
Changed(ticLayout);
end;
function TcxGridColumn.GetStoredProperties(AProperties: TStrings): Boolean;
begin
inherited GetStoredProperties(AProperties);
with AProperties do
begin
Add('GroupIndex');
Add('Width');
end;
Result := True;
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;
end;
procedure TcxGridColumn.DestroySubClasses;
begin
FreeAndNil(FHeaderGlyph);
inherited;
end;
procedure TcxGridColumn.AssignColumnWidths;
begin
with GridView do
if OptionsView.ColumnAutoWidth then
ViewInfo.HeaderViewInfo.AssignColumnWidths;
end;
function TcxGridColumn.CanFilter(ACheckGridViewOptions: Boolean): Boolean;
begin
Result := inherited CanFilter(ACheckGridViewOptions) and
(not ACheckGridViewOptions or GridView.OptionsCustomize.ColumnFiltering);
end;
function TcxGridColumn.CanHorzSize: Boolean;
begin
Result := GridView.OptionsCustomize.ColumnHorzSizing and Options.HorzSizing;
end;
procedure TcxGridColumn.CaptionChanged;
begin
inherited;
GridView.RefreshCustomizationForm;
end;
procedure TcxGridColumn.ForceWidth(Value: Integer);
begin
AssignColumnWidths;
inherited;
AssignColumnWidths;
end;
function TcxGridColumn.GetBestFitWidth: Integer;
var
ABorders: TcxBorders;
begin
Result := inherited GetBestFitWidth;
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[VisibleIndex].GetBestFitWidth);
Result := Max(Result, GridView.ViewInfo.RecordsViewInfo.GetFooterCellBestFitWidth(VisibleIndex));
end;
end;
function TcxGridColumn.GetFilterable: Boolean;
begin
Result := inherited GetFilterable {and not Hidden};
end;
function TcxGridColumn.GetFixed: Boolean;
begin
Result := inherited GetFixed or not Options.HorzSizing or
(GridView.Controller.ForcingWidthItem <> nil) and
GridView.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.GetVisible: Boolean;
begin
Result := inherited GetVisible and not IsPreview;
end;
function TcxGridColumn.HasCustomDrawFooterCell: Boolean;
begin
Result := Assigned(FOnCustomDrawFooterCell);
end;
function TcxGridColumn.HasCustomDrawHeader: Boolean;
begin
Result := Assigned(FOnCustomDrawHeader);
end;
procedure TcxGridColumn.HiddenChanged;
begin
with GridView do
begin
//RefreshFilterableItemsList;
RefreshCustomizationForm;
end;
end;
function TcxGridColumn.HideOnGrouping: Boolean;
begin
Result := GridView.OptionsCustomize.ColumnHidingOnGrouping;
end;
function TcxGridColumn.IsVisibleStored: Boolean;
begin
Result := inherited IsVisibleStored and not IsPreview;
end;
{procedure TcxGridColumn.VisibleChanged;
begin
//FGridView.RefreshVisibleColumnsList;
//FGridView.RefreshCustomizationForm;
end;}
function TcxGridColumn.GetHeaderViewInfoClass: TcxGridColumnHeaderViewInfoClass;
begin
Result := TcxGridColumnHeaderViewInfo;
end;
function TcxGridColumn.GetOptionsClass: TcxCustomGridTableItemOptionsClass;
begin
Result := TcxGridColumnOptions;
end;
function TcxGridColumn.GetStylesClass: TcxCustomGridTableItemStylesClass;
begin
Result := TcxGridColumnStyles;
end;
function TcxGridColumn.GetViewInfoClass: TcxCustomGridCellViewInfoClass;
begin
Result := TcxGridDataCellViewInfo;
end;
procedure TcxGridColumn.DoCustomDrawFooterCell(ACanvas: TcxCanvas;
AViewInfo: TcxGridColumnHeaderViewInfo; var ADone: Boolean);
begin
if HasCustomDrawFooterCell then
FOnCustomDrawFooterCell(GridView, ACanvas, AViewInfo, ADone);
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;
procedure TcxGridColumn.DoUserFiltering(const AValue: Variant; const ADisplayText: string);
begin
if Assigned(FOnUserFiltering) then FOnUserFiltering(Self, AValue, ADisplayText);
end;
procedure TcxGridColumn.Assign(Source: TPersistent);
begin
if Source is TcxGridColumn then
with TcxGridColumn(Source) do
begin
Self.FooterAlignmentHorz := FooterAlignmentHorz;
Self.HeaderGlyph := HeaderGlyph;
Self.HeaderGlyphAlignmentHorz := HeaderGlyphAlignmentHorz;
Self.HeaderGlyphAlignmentVert := HeaderGlyphAlignmentVert;
Self.Hidden := Hidden;
Self.OnCustomDrawFooterCell := OnCustomDrawFooterCell;
Self.OnCustomDrawHeader := OnCustomDrawHeader;
Self.OnHeaderClick := OnHeaderClick;
Self.OnUserFiltering := OnUserFiltering;
end;
inherited;
end;
{ TcxGridTableBackgroundBitmaps }
function TcxGridTableBackgroundBitmaps.GetBitmapStyleIndex(Index: Integer): Integer;
begin
case Index of
bbFilterBox:
Result := vsFilterBox;
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.FilterBox := FilterBox;
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;
FExpandMasterRowOnDblClick := True;
end;
procedure TcxGridTableOptionsBehavior.Assign(Source: TPersistent);
begin
if Source is TcxGridTableOptionsBehavior then
with TcxGridTableOptionsBehavior(Source) do
Self.ExpandMasterRowOnDblClick := ExpandMasterRowOnDblClick;
inherited;
end;
{ TcxCustomGridFilterItem }
constructor TcxCustomGridFilterItem.Create(AParent: TcxGridFilterItemList);
begin
inherited Create;
FParent := AParent;
end;
destructor TcxCustomGridFilterItem.Destroy;
begin
if FParent <> nil then
FParent.InternalRemoveItem(Self);
inherited;
end;
{ TcxGridFilterItem }
constructor TcxGridFilterItem.Create(AParent: TcxGridFilterItemList;
AColumn: TcxGridColumn; AOperatorKind: TcxFilterOperatorKind; const AValue: Variant;
const ADisplayText: string);
begin
inherited Create(AParent);
FColumn := AColumn;
FOperatorKind := AOperatorKind;
FValue := AValue;
FDisplayText := ADisplayText;
end;
function TcxGridFilterItem.GetIsList: Boolean;
begin
Result := False;
end;
{ TcxGridFilterItemList }
constructor TcxGridFilterItemList.Create(AParent: TcxGridFilterItemList;
ABoolOperatorKind: TcxFilterBoolOperatorKind);
begin
inherited Create(AParent);
FBoolOperatorKind := ABoolOperatorKind;
FItems := TList.Create;
end;
destructor TcxGridFilterItemList.Destroy;
begin
Clear;
FItems.Free;
inherited;
end;
function TcxGridFilterItemList.GetCount: Integer;
begin
Result := FItems.Count;
end;
function TcxGridFilterItemList.GetItem(Index: Integer): TcxCustomGridFilterItem;
begin
Result := TcxCustomGridFilterItem(FItems[Index]);
end;
procedure TcxGridFilterItemList.SetBoolOperatorKind(Value: TcxFilterBoolOperatorKind);
begin
if FBoolOperatorKind <> Value then
begin
FBoolOperatorKind := Value;
Changed;
end;
end;
procedure TcxGridFilterItemList.InternalAddItem(AItem: TcxCustomGridFilterItem);
begin
FItems.Add(AItem);
Changed;
end;
procedure TcxGridFilterItemList.InternalRemoveItem(AItem: TcxCustomGridFilterItem);
begin
FItems.Remove(AItem);
Changed;
end;
procedure TcxGridFilterItemList.Changed;
begin
if Assigned(FOnChange) then FOnChange(Self);
if FParent <> nil then FParent.Changed;
end;
function TcxGridFilterItemList.GetIsList: Boolean;
begin
Result := True;
end;
function TcxGridFilterItemList.AddItem(AColumn: TcxGridColumn;
AOperatorKind: TcxFilterOperatorKind; const AValue: Variant;
const ADisplayText: string): TcxGridFilterItem;
begin
Result := TcxGridFilterItem.Create(Self, AColumn, AOperatorKind, AValue, ADisplayText);
InternalAddItem(Result);
end;
function TcxGridFilterItemList.AddItemList(ABoolOperatorKind: TcxFilterBoolOperatorKind): TcxGridFilterItemList;
begin
Result := TcxGridFilterItemList.Create(Self, ABoolOperatorKind);
InternalAddItem(Result);
end;
procedure TcxGridFilterItemList.Assign(ACriteriaItemList: TcxFilterCriteriaItemList);
var
I: Integer;
AItemList: TcxFilterCriteriaItemList;
begin
Clear;
BoolOperatorKind := ACriteriaItemList.BoolOperatorKind;
for I := 0 to ACriteriaItemList.Count - 1 do
if ACriteriaItemList[I].IsItemList then
begin
AItemList := TcxFilterCriteriaItemList(ACriteriaItemList[I]);
AddItemList(AItemList.BoolOperatorKind).Assign(AItemList);
end
else
with TcxFilterCriteriaItem(ACriteriaItemList[I]) do
Self.AddItem(ItemLink as TcxGridColumn, OperatorKind, Value, DisplayValue);
end;
procedure TcxGridFilterItemList.AssignTo(ACriteriaItemList: TcxFilterCriteriaItemList);
var
I: Integer;
AItemList: TcxGridFilterItemList;
begin
ACriteriaItemList.Clear;
ACriteriaItemList.BoolOperatorKind := FBoolOperatorKind;
for I := 0 to Count - 1 do
if Items[I].IsList then
begin
AItemList := TcxGridFilterItemList(Items[I]);
AItemList.AssignTo(ACriteriaItemList.AddItemList(AItemList.BoolOperatorKind));
end
else
with TcxGridFilterItem(Items[I]) do
ACriteriaItemList.AddItem(Column, OperatorKind, Value, DisplayText);
end;
procedure TcxGridFilterItemList.Clear;
begin
while Count <> 0 do Items[0].Free;
end;
function TcxGridFilterItemList.HasItem(AItem: TcxCustomGridFilterItem): Boolean;
var
I: Integer;
begin
for I := 0 to Count - 1 do
begin
Result := Items[I] = AItem;
if not Result and Items[I].IsList then
Result := TcxGridFilterItemList(Items[I]).HasItem(AItem);
if Result then Exit;
end;
Result := False;
end;
{ TcxGridTableOptionsCustomize }
constructor TcxGridTableOptionsCustomize.Create(AGridView: TcxCustomGridView);
begin
inherited;
FColumnFiltering := True;
FColumnHidingOnGrouping := True;
FColumnHorzSizing := True;
end;
function TcxGridTableOptionsCustomize.GetColumnGrouping: Boolean;
begin
Result := ItemGrouping;
end;
function TcxGridTableOptionsCustomize.GetColumnMoving: Boolean;
begin
Result := ItemMoving;
end;
function TcxGridTableOptionsCustomize.GetColumnSorting: Boolean;
begin
Result := ItemSorting;
end;
function TcxGridTableOptionsCustomize.GetGridView: TcxGridTableView;
begin
Result := TcxGridTableView(inherited GridView);
end;
procedure TcxGridTableOptionsCustomize.SetColumnFiltering(Value: Boolean);
begin
if FColumnFiltering <> Value then
begin
FColumnFiltering := Value;
LayoutChanged;
end;
end;
procedure TcxGridTableOptionsCustomize.SetColumnGrouping(Value: Boolean);
begin
ItemGrouping := Value;
end;
procedure TcxGridTableOptionsCustomize.SetColumnHorzSizing(Value: Boolean);
begin
if FColumnHorzSizing <> Value then
begin
FColumnHorzSizing := Value;
LayoutChanged;
end;
end;
procedure TcxGridTableOptionsCustomize.SetColumnMoving(Value: Boolean);
begin
ItemMoving := Value;
end;
procedure TcxGridTableOptionsCustomize.SetColumnSorting(Value: Boolean);
begin
ItemSorting := Value;
end;
procedure TcxGridTableOptionsCustomize.Assign(Source: TPersistent);
begin
if Source is TcxGridTableOptionsCustomize then
with TcxGridTableOptionsCustomize(Source) do
begin
Self.ColumnFiltering := ColumnFiltering;
Self.ColumnHiding := ColumnHiding;
Self.ColumnHidingOnGrouping := ColumnHidingOnGrouping;
Self.ColumnHorzSizing := ColumnHorzSizing;
Self.DataRowSizing := DataRowSizing;
Self.GroupRowSizing := GroupRowSizing;
end;
inherited;
end;
{ TcxGridTableOptionsView }
constructor TcxGridTableOptionsView.Create(AGridView: TcxCustomGridView);
begin
inherited;
FExpandButtonsForEmptyDetails := True;
FGridLineColor := clDefault;
FGroupByBox := True;
FHeader := True;
FIndicatorWidth := cxGridDefaultIndicatorWidth;
FNewItemRowInfoText := cxGetResourceString(@scxGridNewItemRowInfoText);
FNewItemRowSeparatorColor := clDefault;
FNewItemRowSeparatorWidth := cxGridDefaultNewItemRowSeparatorWidth;
FRowSeparatorColor := clDefault;
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;
procedure TcxGridTableOptionsView.SetColumnAutoWidth(Value: Boolean);
begin
if FColumnAutoWidth <> Value then
begin
FColumnAutoWidth := Value;
SizeChanged;
end;
end;
procedure TcxGridTableOptionsView.SetDataRowHeight(Value: Integer);
begin
CheckDataRowHeight(Value);
if FDataRowHeight <> Value then
begin
FDataRowHeight := Value;
SizeChanged;
GridView.Controller.DesignerModified;
end;
end;
procedure TcxGridTableOptionsView.SetExpandButtonsForEmptyDetails(Value: Boolean);
begin
if FExpandButtonsForEmptyDetails <> Value then
begin
FExpandButtonsForEmptyDetails := Value;
LayoutChanged;
end;
end;
procedure TcxGridTableOptionsView.SetFooter(Value: Boolean);
begin
if FFooter <> Value then
begin
FFooter := Value;
SizeChanged;
end;
end;
procedure TcxGridTableOptionsView.SetGridLineColor(Value: TColor);
begin
if FGridLineColor <> Value then
begin
FGridLineColor := Value;
LayoutChanged;
end;
end;
procedure TcxGridTableOptionsView.SetGridLines(Value: TcxGridLines);
begin
if FGridLines <> Value then
begin
FGridLines := Value;
SizeChanged;
end;
end;
procedure TcxGridTableOptionsView.SetGroupByBox(Value: Boolean);
begin
if FGroupByBox <> Value then
begin
FGroupByBox := Value;
SizeChanged;
end;
end;
procedure TcxGridTableOptionsView.SetGroupFooters(Value: TcxGridGroupFootersMode);
begin
if FGroupFooters <> Value then
begin
FGroupFooters := Value;
SizeChanged;
end;
end;
procedure TcxGridTableOptionsView.SetGroupRowHeight(Value: Integer);
begin
CheckGroupRowHeight(Value);
if FGroupRowHeight <> Value then
begin
FGroupRowHeight := Value;
SizeChanged;
GridView.Controller.DesignerModified;
end;
end;
procedure TcxGridTableOptionsView.SetHeader(Value: Boolean);
begin
if FHeader <> Value then
begin
FHeader := Value;
SizeChanged;
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;
SizeChanged;
end;
end;
procedure TcxGridTableOptionsView.SetIndicator(Value: Boolean);
begin
if FIndicator <> Value then
begin
FIndicator := Value;
SizeChanged;
end;
end;
procedure TcxGridTableOptionsView.SetIndicatorWidth(Value: Integer);
begin
if Value < 0 then Value := 0;
if FIndicatorWidth <> Value then
begin
FIndicatorWidth := Value;
SizeChanged;
end;
end;
procedure TcxGridTableOptionsView.SetNewItemRow(Value: Boolean);
begin
if FNewItemRow <> Value then
begin
FNewItemRow := Value;
GridView.ViewData.CheckNewItemRecord;
GridView.DataController.UseNewItemRowForEditing := FNewItemRow;
end;
end;
procedure TcxGridTableOptionsView.SetNewItemRowInfoText(const Value: string);
begin
if FNewItemRowInfoText <> Value then
begin
FNewItemRowInfoText := Value;
LayoutChanged;
end;
end;
procedure TcxGridTableOptionsView.SetNewItemRowSeparatorColor(Value: TColor);
begin
if FNewItemRowSeparatorColor <> Value then
begin
FNewItemRowSeparatorColor := Value;
LayoutChanged;
end;
end;
procedure TcxGridTableOptionsView.SetNewItemRowSeparatorWidth(Value: Integer);
begin
if Value < cxGridMinNewItemRowSeparatorWidth then
Value := cxGridMinNewItemRowSeparatorWidth;
if FNewItemRowSeparatorWidth <> Value then
begin
FNewItemRowSeparatorWidth := Value;
SizeChanged;
end;
end;
procedure TcxGridTableOptionsView.SetRowSeparatorColor(Value: TColor);
begin
if FRowSeparatorColor <> Value then
begin
FRowSeparatorColor := Value;
LayoutChanged;
end;
end;
procedure TcxGridTableOptionsView.SetRowSeparatorWidth(Value: Integer);
begin
if Value < 0 then Value := 0;
if FRowSeparatorWidth <> Value then
begin
FRowSeparatorWidth := Value;
SizeChanged;
end;
end;
function TcxGridTableOptionsView.IsNewItemRowInfoTextStored: Boolean;
begin
Result := FNewItemRowInfoText <> cxGetResourceString(@scxGridNewItemRowInfoText);
end;
procedure TcxGridTableOptionsView.ItemCaptionAutoHeightChanged;
begin
LayoutChanged;
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.GridLineColor := GridLineColor;
Self.GridLines := GridLines;
Self.GroupByBox := GroupByBox;
Self.GroupFooters := GroupFooters;
Self.GroupRowHeight := GroupRowHeight;
Self.Header := Header;
Self.HeaderHeight := HeaderHeight;
Self.Indicator := Indicator;
Self.IndicatorWidth := IndicatorWidth;
Self.NewItemRow := NewItemRow;
Self.NewItemRowInfoText := NewItemRowInfoText;
Self.NewItemRowSeparatorColor := NewItemRowSeparatorColor;
Self.NewItemRowSeparatorWidth := NewItemRowSeparatorWidth;
Self.RowSeparatorColor := RowSeparatorColor;
Self.RowSeparatorWidth := RowSeparatorWidth;
end;
inherited;
end;
procedure TcxGridTableOptionsView.CheckDataRowHeight(var AValue: Integer);
begin
if AValue < 0 then AValue := 0;
end;
procedure TcxGridTableOptionsView.CheckGroupRowHeight(var AValue: Integer);
begin
if AValue < 0 then AValue := 0;
end;
function TcxGridTableOptionsView.GetGridLineColor: TColor;
begin
Result := FGridLineColor;
if Result = clDefault then
Result := LookAndFeelPainter.DefaultGridLineColor;
end;
function TcxGridTableOptionsView.GetNewItemRowSeparatorColor: TColor;
begin
Result := FNewItemRowSeparatorColor;
if Result = clDefault then
Result := LookAndFeelPainter.DefaultHeaderColor;
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;
procedure TcxGridPreview.SetAutoHeight(Value: Boolean);
begin
if FAutoHeight <> Value then
begin
FAutoHeight := Value;
if FVisible then SizeChanged;
end;
end;
procedure TcxGridPreview.SetColumn(Value: TcxGridColumn);
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
begin
GridView.ItemVisibilityChanged(APrevColumn, APrevColumn.InternalVisible);
APrevColumn.HiddenChanged;
end;
if FColumn <> nil then
begin
GridView.ItemVisibilityChanged(FColumn, False);
FColumn.HiddenChanged;
end;
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;
if FVisible then SizeChanged;
end;
end;
procedure TcxGridPreview.SetMaxLineCount(Value: Integer);
begin
if Value < 0 then Value := 0;
if FMaxLineCount <> Value then
begin
FMaxLineCount := Value;
if FVisible then SizeChanged;
end;
end;
procedure TcxGridPreview.SetPlace(Value: TcxGridPreviewPlace);
begin
if FPlace <> Value then
begin
FPlace := Value;
if FVisible then SizeChanged;
end;
end;
procedure TcxGridPreview.SetRightIndent(Value: Integer);
begin
if Value < 0 then Value := 0;
if FRightIndent <> Value then
begin
FRightIndent := Value;
if FVisible then SizeChanged;
end;
end;
procedure TcxGridPreview.SetVisible(Value: Boolean);
begin
if FVisible <> Value then
begin
FVisible := Value;
SizeChanged;
end;
end;
procedure TcxGridPreview.Notification(AComponent: TComponent;
AOperation: TOperation);
begin
inherited;
if (AOperation = opRemove) and (AComponent = Column) then
Column := nil;
end;
procedure TcxGridPreview.SizeChanged;
begin
(GridView as TcxGridTableView).SizeChanged;
end;
function TcxGridPreview.GridView: TcxGridTableView;
begin
Result := TcxGridTableView(inherited GridView);
end;
procedure TcxGridPreview.Assign(Source: TPersistent);
begin
if Source is TcxGridPreview then
with TcxGridPreview(Source) do
begin
Self.AutoHeight := AutoHeight;
if Self.GridView.AssigningPattern and (Column <> nil) then
Self.Column := Self.GridView.Columns[Column.Index]
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.GetDefaultViewParams(Index: Integer; AData: TObject;
out AParams: TcxViewParams);
begin
inherited;
with AParams, LookAndFeelPainter do
case Index of
vsFilterBox:
begin
Color := DefaultFilterBoxColor;
TextColor := DefaultFilterBoxTextColor;
end;
vsFooter:
begin
Color := DefaultFooterColor;
TextColor := DefaultFooterTextColor;
end;
vsGroup:
begin
inherited GetContentParams(TcxCustomGridRecord(AData), nil, AParams);
Color := DefaultGroupColor;
TextColor := DefaultGroupTextColor;
end;
vsGroupByBox:
begin
Color := DefaultGroupByBoxColor;
TextColor := DefaultGroupByBoxTextColor;
end;
vsHeader:
begin
Color := DefaultHeaderColor;
TextColor := DefaultHeaderTextColor;
end;
vsIndicator:
Color := DefaultHeaderColor;
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.FilterBox := FilterBox;
Self.Footer := Footer;
Self.Group := Group;
Self.GroupByBox := GroupByBox;
Self.Header := Header;
Self.Indicator := Indicator;
Self.NewItemRowInfoText := NewItemRowInfoText;
Self.Preview := Preview;
Self.OnGetFooterStyle := OnGetFooterStyle;
Self.OnGetGroupStyle := OnGetGroupStyle;
Self.OnGetHeaderStyle := OnGetHeaderStyle;
Self.OnGetPreviewStyle := OnGetPreviewStyle;
end;
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.GetFooterParams(ARecord: TcxCustomGridRecord;
AItem: TcxGridColumn; out AParams: TcxViewParams);
var
AStyle: TcxStyle;
begin
AStyle := nil;
if Assigned(FOnGetFooterStyle) then
FOnGetFooterStyle(GridView, ARecord, AItem, AStyle);
GetViewParams(vsFooter, ARecord, 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.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.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.Name
else
AValue := '';
end;
procedure TcxGridTableSummaryGroupItemLink.SetPropertyValue(const AName: string;
const AValue: Variant);
var
I: Integer;
begin
if AName = 'Column' then
begin
Column := nil;
with TcxCustomGridTableView((DataController as IcxCustomGridDataController).GridView) do
for I := 0 to ItemCount - 1 do
if Items[I].Name = AValue then
begin
Column := Items[I] as TcxGridColumn;
Break;
end;
end;
end;
{ TcxGridTableSummaryItem }
function TcxGridTableSummaryItem.GetColumn: TcxGridColumn;
begin
Result := TcxGridColumn(ItemLink);
end;
function TcxGridTableSummaryItem.GetGridView: TcxGridTableView;
begin
Result := TcxGridTableView(TcxGridDataController(DataController).GridView);
end;
procedure TcxGridTableSummaryItem.SetColumn(Value: TcxGridColumn);
begin
ItemLink := Value;
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;
{ TcxGridTableView }
destructor TcxGridTableView.Destroy;
begin
Controller.Customization := False;
inherited;
end;
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.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.GetViewInfoCache: TcxGridTableViewInfoCache;
begin
Result := TcxGridTableViewInfoCache(inherited ViewInfoCache);
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.SetFiltering(Value: TcxGridTableFiltering);
begin
inherited Filtering := Value;
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 := OptionsView.GroupFooters = gfVisibleWhenExpanded
else
if AName = 'NewItemRow' then
AValue := OptionsView.NewItemRow
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 AValue then
OptionsView.GroupFooters := gfVisibleWhenExpanded
else
OptionsView.GroupFooters := gfInvisible
else
if AName = 'NewItemRow' then
OptionsView.NewItemRow := AValue
else
inherited;
end;
procedure TcxGridTableView.CreateOptions;
begin
inherited;
FPreview := GetPreviewClass.Create(Self);
end;
procedure TcxGridTableView.DestroyOptions;
begin
FreeAndNil(FPreview);
inherited;
end;
function TcxGridTableView.CanOffset(ARecordCountDelta: Integer): Boolean;
begin {2}
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.DoAssign(ASource: TcxCustomGridView);
begin
if ASource is TcxGridTableView then
with TcxGridTableView(ASource) do
begin
Self.OptionsCustomize := OptionsCustomize;
Self.OnColumnHeaderClick := OnColumnHeaderClick;
Self.OnColumnPosChanged := OnColumnPosChanged;
Self.OnColumnSizeChanged := OnColumnSizeChanged;
Self.OnCustomDrawColumnHeader := OnCustomDrawColumnHeader;
Self.OnCustomDrawFooterCell := OnCustomDrawFooterCell;
Self.OnCustomDrawGroupCell := OnCustomDrawGroupCell;
Self.OnCustomDrawIndicatorCell := OnCustomDrawIndicatorCell;
Self.OnCustomDrawPartBackground := OnCustomDrawPartBackground;
Self.OnCustomization := OnCustomization;
Self.OnLeftPosChanged := OnLeftPosChanged;
end;
inherited;
if ASource is TcxGridTableView then
Preview := TcxGridTableView(ASource).Preview;
end;
function TcxGridTableView.GetIsControlFocused: Boolean;
begin
Result := inherited GetIsControlFocused or Controller.FilterPopup.Visible;
end;
function TcxGridTableView.GetResizeOnBoundsChange: Boolean;
begin
Result := inherited GetResizeOnBoundsChange or
OptionsView.ColumnAutoWidth or Preview.Active or IsMaster;
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.HasCustomDrawIndicatorCell: Boolean;
begin
Result := Assigned(FOnCustomDrawIndicatorCell);
end;
function TcxGridTableView.HasCustomDrawPartBackground: Boolean;
begin
Result := Assigned(FOnCustomDrawPartBackground);
end;
function TcxGridTableView.IsEqualHeightRecords: Boolean;
begin
Result := inherited IsEqualHeightRecords and
not ViewInfo.RecordsViewInfo.HasLastHorzGridLine(nil) and
not Preview.Visible and (GroupedColumnCount = 0) and not IsMaster;
end;
procedure TcxGridTableView.LookAndFeelChanged;
begin
inherited;
RefreshCustomizationForm;
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.GetViewInfoCacheClass: TcxCustomGridViewInfoCacheClass;
begin
Result := TcxGridTableViewInfoCache;
end;
function TcxGridTableView.GetViewInfoClass: TcxCustomGridViewInfoClass;
begin
Result := TcxGridTableViewInfo;
end;
function TcxGridTableView.GetBackgroundBitmapsClass: TcxCustomGridBackgroundBitmapsClass;
begin
Result := TcxGridTableBackgroundBitmaps;
end;
function TcxGridTableView.GetFilteringClass: TcxCustomGridTableFilteringClass;
begin
Result := TcxGridTableFiltering;
end;
function TcxGridTableView.GetOptionsBehaviorClass: TcxCustomGridTableOptionsBehaviorClass;
begin
Result := TcxGridTableOptionsBehavior;
end;
function TcxGridTableView.GetOptionsCustomizeClass: TcxCustomGridTableOptionsCustomizeClass;
begin
Result := TcxGridTableOptionsCustomize;
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
inherited;
RefreshCustomizationForm;
end;
procedure TcxGridTableView.RemoveItem(AItem: TcxCustomGridTableItem);
begin
inherited;
RefreshCustomizationForm;
end;
procedure TcxGridTableView.RefreshCustomizationForm;
begin
Controller.RefreshCustomizationForm;
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.DoCustomDrawIndicatorCell(ACanvas: TcxCanvas;
AViewInfo: TcxCustomGridIndicatorItemViewInfo; var ADone: Boolean);
begin
if HasCustomDrawIndicatorCell then
FOnCustomDrawIndicatorCell(Self, ACanvas, AViewInfo, ADone);
end;
procedure TcxGridTableView.DoCustomDrawPartBackground(ACanvas: TcxCanvas;
AViewInfo: TcxCustomGridCellViewInfo; var ADone: Boolean);
begin
if HasCustomDrawPartBackground then
FOnCustomDrawPartBackground(Self, ACanvas, AViewInfo, ADone);
end;
procedure TcxGridTableView.DoCustomization;
begin
if Assigned(FOnCustomization) then FOnCustomization(Self);
end;
procedure TcxGridTableView.DoLeftPosChanged;
begin
if Assigned(FOnLeftPosChanged) then FOnLeftPosChanged(Self);
end;
function TcxGridTableView.CreateColumn: TcxGridColumn;
begin
Result := TcxGridColumn(CreateItem);
end;
class function TcxGridTableView.CanBeLookupList: Boolean;
begin
Result := True;
end;
initialization
cxGridRegisteredViews.Register(TcxGridTableView, 'Table');
Classes.RegisterClasses([TcxGridColumn, TcxGridTableViewStyleSheet]);
finalization
cxGridRegisteredViews.Unregister(TcxGridTableView);
end.