git-svn-id: https://192.168.0.254/svn/Componentes.Terceros.DevExpressVCL@38 05c56307-c608-d34a-929d-697000501d7a
2998 lines
102 KiB
ObjectPascal
2998 lines
102 KiB
ObjectPascal
{*******************************************************************}
|
|
{ }
|
|
{ Developer Express Visual Component Library }
|
|
{ ExpressPrinting System(tm) COMPONENT SUITE }
|
|
{ }
|
|
{ Copyright (C) 1998-2009 Developer Express Inc. }
|
|
{ ALL RIGHTS RESERVED }
|
|
{ }
|
|
{ The entire contents of this file is protected by U.S. and }
|
|
{ International Copyright Laws. Unauthorized reproduction, }
|
|
{ reverse-engineering, and distribution of all or any portion of }
|
|
{ the code contained in this file is strictly prohibited and may }
|
|
{ result in severe civil and criminal penalties and will be }
|
|
{ prosecuted to the maximum extent possible under the law. }
|
|
{ }
|
|
{ RESTRICTIONS }
|
|
{ }
|
|
{ THIS SOURCE CODE AND ALL RESULTING INTERMEDIATE FILES }
|
|
{ (DCU, OBJ, DLL, ETC.) ARE CONFIDENTIAL AND PROPRIETARY TRADE }
|
|
{ SECRETS OF DEVELOPER EXPRESS INC. THE REGISTERED DEVELOPER IS }
|
|
{ LICENSED TO DISTRIBUTE THE EXPRESSPRINTINGSYSTEM AND }
|
|
{ ALL ACCOMPANYING VCL CONTROLS AS PART OF AN }
|
|
{ EXECUTABLE PROGRAM ONLY. }
|
|
{ }
|
|
{ THE SOURCE CODE CONTAINED WITHIN THIS FILE AND ALL RELATED }
|
|
{ FILES OR ANY PORTION OF ITS CONTENTS SHALL AT NO TIME BE }
|
|
{ COPIED, TRANSFERRED, SOLD, DISTRIBUTED, OR OTHERWISE MADE }
|
|
{ AVAILABLE TO OTHER INDIVIDUALS WITHOUT EXPRESS WRITTEN CONSENT }
|
|
{ AND PERMISSION FROM DEVELOPER EXPRESS INC. }
|
|
{ }
|
|
{ CONSULT THE END USER LICENSE AGREEMENT FOR INFORMATION ON }
|
|
{ ADDITIONAL RESTRICTIONS. }
|
|
{ }
|
|
{*******************************************************************}
|
|
|
|
unit dxPSdxInsLnk;
|
|
|
|
interface
|
|
|
|
{$I cxVer.inc}
|
|
|
|
uses
|
|
Classes, Windows, Graphics, ExtCtrls, StdCtrls, Controls, ComCtrls, Dialogs,
|
|
ImgList, Forms, dxInspct, dxExEdtr, dxInspRw, dxCntner, dxPSGlbl, dxPSCore,
|
|
dxBase, cxDrawTextUtils;
|
|
|
|
type
|
|
TdxInspectorPaintOption = (ipoBorder, ipoHorzLines, ipoVertLines,
|
|
ipoFlatCheckMarks, ipoCheckMarksAsText,
|
|
ipoImages, ipoTransparentRowGraphic, ipoGraphicAsText,
|
|
ipoExpandButtons);
|
|
TdxInspectorPaintOptions = set of TdxInspectorPaintOption;
|
|
|
|
TdxInspectorRowHelperClass = class of TdxInspectorRowHelper;
|
|
|
|
TdxInspectorRowHelper = class(TdxCustomClassMapItem)
|
|
protected
|
|
class procedure GetImageLists(ARow: TdxInspectorRow; AProc: TdxPSGetImageListProc); virtual;
|
|
public
|
|
class function PairClass: TClass; override;
|
|
class procedure Register;
|
|
class function RowClass: TdxInspectorRowClass; virtual;
|
|
end;
|
|
|
|
TdxInspectorImageRowHelper = class(TdxInspectorRowHelper)
|
|
protected
|
|
class procedure GetImageLists(ARow: TdxInspectorRow; AProc: TdxPSGetImageListProc); override;
|
|
public
|
|
class function RowClass: TdxInspectorRowClass; override;
|
|
end;
|
|
|
|
TdxInspectorReportLinkCustomEvent = procedure(Sender: TBasedxReportLink;
|
|
ARow: TdxInspectorRow; ACanvas: TCanvas; ABoundsRect, AClientRect: TRect;
|
|
var AText: string; var AColor: TColor; AFont: TFont;
|
|
var ATextAlignX: TcxTextAlignX; var ATextAlignY: TcxTextAlignY;
|
|
var ADone: Boolean) of object;
|
|
|
|
TCustomdxInspectorReportLink = class(TBasedxReportLink)
|
|
private
|
|
FAutoNodesExpand: Boolean;
|
|
FAutoWidth: Boolean;
|
|
FDefaultGroupFont: TFont;
|
|
FFixedTransparent: Boolean;
|
|
FFixedColor: TColor;
|
|
FFixedFont: TFont;
|
|
FGraphicAsTextText: string;
|
|
FGridLineColor: TColor;
|
|
FGroupColor: TColor;
|
|
FGroupFont: TFont;
|
|
FGroupTransparent: Boolean;
|
|
FIsGraphicAsTextAssigned: Boolean;
|
|
FOddFont: TFont;
|
|
FOptions: TdxInspectorPaintOptions;
|
|
FSupportedCustomDraw: Boolean;
|
|
FOnCustomDrawCaption: TdxInspectorReportLinkCustomEvent;
|
|
FOnCustomDrawValue: TdxInspectorReportLinkCustomEvent;
|
|
FOnCustomDrawCaptionSeparator: TdxInspectorReportLinkCustomEvent;
|
|
FOnCustomDrawValueSeparator: TdxInspectorReportLinkCustomEvent;
|
|
FCustomDrawFontChanged: Boolean;
|
|
FFixedFontIndex: Integer;
|
|
FGroupFontIndex: Integer;
|
|
FSaveFont: TFont;
|
|
// Layout fields
|
|
FCaptionWidth: Integer;
|
|
FBandCount: Integer;
|
|
FBands: TList;
|
|
FBandWidth: Integer;
|
|
FFullWidth: Integer;
|
|
FIndent: Integer;
|
|
FMaxBandHeight: Integer;
|
|
FRowHeight: Integer;
|
|
FRowHeights: TList;
|
|
FRows: TList;
|
|
FValueWidth: Integer;
|
|
function GetCustomInspector: TCustomdxInspectorControl;
|
|
function GetGraphicAsTextText: string;
|
|
function GetOddColor: TColor;
|
|
function GetOptions: TdxInspectorPaintOptions;
|
|
function IsGraphicAsTextTextStored: Boolean;
|
|
function IsGroupFontStored: Boolean;
|
|
procedure SetAutoNodesExpand(Value: Boolean);
|
|
procedure SetAutoWidth(Value: Boolean);
|
|
procedure SetFixedColor(Value: TColor);
|
|
procedure SetFixedFont(Value: TFont);
|
|
procedure SetFixedTransparent(Value: Boolean);
|
|
procedure SetGraphicAsTextText(const Value: string);
|
|
procedure SetGridLineColor(Value: TColor);
|
|
procedure SetGroupFont(Value: TFont);
|
|
procedure SetGroupNodeColor(Value: TColor);
|
|
procedure SetGroupTransparent(Value: Boolean);
|
|
procedure SetOddFont(Value: TFont);
|
|
procedure SetOddColor(Value: TColor);
|
|
procedure SetOnCustomDrawCaption(Value: TdxInspectorReportLinkCustomEvent);
|
|
procedure SetOnCustomDrawValue(Value: TdxInspectorReportLinkCustomEvent);
|
|
procedure SetOnCustomDrawCaptionSeparator(Value: TdxInspectorReportLinkCustomEvent);
|
|
procedure SetOnCustomDrawValueSeparator(Value: TdxInspectorReportLinkCustomEvent);
|
|
procedure SetOptions(Value: TdxInspectorPaintOptions);
|
|
procedure SetSupportCustomDraw(Value: Boolean);
|
|
|
|
procedure CalcAutoWidths;
|
|
procedure CalcLayout;
|
|
procedure CalcMaxBandHeight;
|
|
procedure CalcRowHeights;
|
|
procedure CalcStandardRowHeight;
|
|
procedure CustomDrawFontChanged(Sender: TObject);
|
|
function GetRow(AIndex: Integer): TdxInspectorRow;
|
|
function GetRowCellSides(ARow: TdxInspectorRow): TdxCellSides;
|
|
function GetRowCaptionColor(ARow: TdxInspectorRow): TColor;
|
|
function GetRowCaptionCellSides(ARow: TdxInspectorRow): TdxCellSides;
|
|
function GetRowCaptionTransparency(ARow: TdxInspectorRow): Boolean;
|
|
function GetRowHeight(ARowIndex: Integer): Integer;
|
|
function GetRowIndentCellSides(ARow: TdxInspectorRow; ALevelIndex: Integer): TdxCellSides;
|
|
function GetRowIndentColor(ARow: TdxInspectorRow; ALevelIndex: Integer): TColor;
|
|
function GetRowIndentCount(ARow: TdxInspectorRow): Integer;
|
|
function GetRowIndentTransparency(ARow: TdxInspectorRow; ALevelIndex: Integer): Boolean;
|
|
function GetRowSeparatorCellSides(ARow: TdxInspectorRow): TdxCellSides;
|
|
function GetRowTextIndent(ARow: TdxInspectorRow; AIncludeImageWidth: Boolean): Integer;
|
|
function GetRowValueCellSides(ARow: TdxInspectorRow): TdxCellSides;
|
|
function GetRowValueText(ARow: TdxInspectorRow): string;
|
|
procedure PlaceRow(ARow: TdxInspectorRow; ARowIndex: Integer; ACell: TdxReportCell);
|
|
|
|
function IsCheckMarksAsText: Boolean;
|
|
function IsDisplayGraphicsAsText: Boolean;
|
|
function IsDrawAnyLines: Boolean;
|
|
function IsDrawBorder: Boolean;
|
|
function IsDrawEndEllipsis: Boolean;
|
|
function IsDrawExpandButtons: Boolean;
|
|
function IsDrawHorzLines: Boolean;
|
|
function IsDrawVertLines: Boolean;
|
|
function IsFlatCheckMarks: Boolean;
|
|
function IsShowExpandButtons: Boolean;
|
|
function IsShowImages: Boolean;
|
|
function IsTransparentColumnGraphics: Boolean;
|
|
|
|
function IsAutoBandCount: Boolean;
|
|
function IsBottomRow(ARow: TdxInspectorRow): Boolean;
|
|
function IsRowAutoHeight: Boolean;
|
|
function IsRowCaptionMultilined(ARow: TdxInspectorRow): Boolean;
|
|
function IsRowValueMultilined(ARow: TdxInspectorRow): Boolean;
|
|
function IsTopRow(ARow: TdxInspectorRow): Boolean;
|
|
|
|
procedure InsertRowCaption(ACell: TdxReportCell; ARow: TdxInspectorRow; ARowIndex: Integer);
|
|
procedure InsertRowImage(ACell: TdxReportCell; ARow: TdxInspectorRow);
|
|
procedure InsertRowIndent(ACell: TdxReportCell; ARow: TdxInspectorRow);
|
|
procedure InsertRowValue(ACell: TdxReportCell; ARow: TdxInspectorRow; ARowIndex: Integer);
|
|
|
|
procedure CalcComplexRowItemsWidths;
|
|
function CanDrawRowImage(ARow: TdxInspectorRow): Boolean;
|
|
function ComplexRowByRow(ARow: TdxInspectorRow): TdxInspectorComplexRow;
|
|
function GetComplexRowSeparatorText(ARow: TdxInspectorRow): string;
|
|
function GetRowImageCellSides(ARow: TdxInspectorRow): TdxCellSides;
|
|
function GetRowItemByRow(ARow: TdxInspectorRow): Pointer;
|
|
function GetUltimateParentRow(ARow: TdxInspectorRow): TdxInspectorRow;
|
|
function IsComplexRowSeparator(ARow: TdxInspectorComplexRow; AIndex: Integer): Boolean;
|
|
function IsNetCategoryRow(ARow: TdxInspectorRow): Boolean;
|
|
function IsNetMode: Boolean;
|
|
function IsNetUltimateLastRowInParent(ARow: TdxInspectorRow): Boolean;
|
|
|
|
procedure AddRows;
|
|
procedure ClearRows;
|
|
procedure DistributeRowsByBands;
|
|
procedure FreeAndNilRows;
|
|
|
|
procedure ClearBands;
|
|
procedure FreeAndNilBands;
|
|
|
|
procedure ReadIsGraphicAsTextValueAssigned(AReader: TReader);
|
|
procedure WriteIsGraphicAsTextValueAssigned(AWriter: TWriter);
|
|
protected
|
|
procedure DefineProperties(Filer: TFiler); override;
|
|
procedure ConstructReport(AReportCells: TdxReportCells); override;
|
|
procedure GetImageLists(AProc: TdxPSGetImageListProc); override;
|
|
procedure InternalRestoreDefaults; override;
|
|
procedure InternalRestoreFromOriginal; override;
|
|
procedure MakeDelimiters(AReportCells: TdxReportCells; AHorzDelimiters,
|
|
AVertDelimiters: TList); override;
|
|
|
|
procedure AssignValues(ADataItem: TAbstractdxReportCellData;
|
|
ARow: TdxInspectorRow); virtual;
|
|
function GetDataClass(ARow: TdxInspectorRow): TdxReportCellDataClass; virtual;
|
|
procedure GetImageListsFromRows(AProc: TdxPSGetImageListProc); virtual;
|
|
function GetRowFontIndex(ARow: TdxInspectorRow): Integer; virtual;
|
|
procedure PrepareConstruct(AReportCells: TdxReportCells); virtual;
|
|
procedure UnprepareConstruct(AReportCells: TdxReportCells); virtual;
|
|
|
|
procedure CustomDraw(AItem: TAbstractdxReportCellData; ACanvas: TCanvas;
|
|
ABoundsRect, AClientRect: TRect; var ADone: Boolean); override;
|
|
procedure DoCustomDrawCaption(ARow: TdxInspectorRow; ACanvas: TCanvas;
|
|
ABoundsRect, AClientRect: TRect; var AText: string; var AColor: TColor;
|
|
AFont: TFont; var ATextAlignX: TcxTextAlignX; var ATextAlignY: TcxTextAlignY;
|
|
var ADone: Boolean); virtual;
|
|
procedure DoCustomDrawValue(ARow: TdxInspectorRow; ACanvas: TCanvas;
|
|
ABoundsRect, AClientRect: TRect; var AText: string; var AColor: TColor;
|
|
AFont: TFont; var ATextAlignX: TcxTextAlignX; var ATextAlignY: TcxTextAlignY;
|
|
var ADone: Boolean); virtual;
|
|
procedure DoCustomDrawCaptionSeparator(ARow: TdxInspectorRow; ACanvas: TCanvas;
|
|
ABoundsRect, AClientRect: TRect; var AText: string; var AColor: TColor;
|
|
AFont: TFont; var ATextAlignX: TcxTextAlignX; var ATextAlignY: TcxTextAlignY;
|
|
var ADone: Boolean); virtual;
|
|
procedure DoCustomDrawValueSeparator(ARow: TdxInspectorRow; ACanvas: TCanvas;
|
|
ABoundsRect, AClientRect: TRect; var AText: string; var AColor: TColor;
|
|
AFont: TFont; var ATextAlignX: TcxTextAlignX; var ATextAlignY: TcxTextAlignY;
|
|
var ADone: Boolean); virtual;
|
|
function IsSupportedCustomDraw(Item: TAbstractdxReportCellData): Boolean; override;
|
|
|
|
procedure InitializeDefaultGroupFont(AFont: TFont);
|
|
|
|
property CustomInspector: TCustomdxInspectorControl read GetCustomInspector;
|
|
published
|
|
constructor Create(AOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
procedure Assign(Source: TPersistent); override;
|
|
function DefaultGraphicAsTextText: string; virtual;
|
|
function DefaultGroupFont: TFont; virtual;
|
|
|
|
property AutoNodesExpand: Boolean read FAutoNodesExpand write SetAutoNodesExpand default False;
|
|
property AutoWidth: Boolean read FAutoWidth write SetAutoWidth default False;
|
|
property Color;
|
|
property FixedTransparent: Boolean read FFixedTransparent write SetFixedTransparent default False;
|
|
property FixedColor: TColor read FFixedColor write SetFixedColor default clBtnFace; {dxDefaultFixedColor}
|
|
property FixedFont: TFont read FFixedFont write SetFixedFont stored IsFontStored;
|
|
property Font;
|
|
property GraphicAsTextText: string read GetGraphicAsTextText write SetGraphicAsTextText stored IsGraphicAsTextTextStored;
|
|
property GridLineColor: TColor read FGridLineColor write SetGridLineColor default clBlack; {dxDefaultGridLineColor}
|
|
property GroupColor: TColor read FGroupColor write SetGroupNodeColor default clBtnFace; {dxDefaultFixedColor}
|
|
property GroupFont: TFont read FGroupFont write SetGroupFont stored IsGroupFontStored;
|
|
property GroupTransparent: Boolean read FGroupTransparent write SetGroupTransparent default False;
|
|
property OddColor: TColor read GetOddColor write SetOddColor default clWhite; {clDefaultColor}
|
|
property OddFont: TFont read FOddFont write SetOddFont stored IsFontStored;
|
|
property Options: TdxInspectorPaintOptions read GetOptions write SetOptions
|
|
default [ipoBorder..ipoFlatCheckMarks ,
|
|
ipoImages , ipoExpandButtons]; {dxDefaultInspectorPaintOptions}
|
|
property ScaleFonts;
|
|
property SupportedCustomDraw: Boolean read FSupportedCustomDraw write SetSupportCustomDraw default False;
|
|
property Transparent;
|
|
property UseHorzDelimiters;
|
|
property UseVertDelimiters;
|
|
|
|
property OnCustomDrawCaption: TdxInspectorReportLinkCustomEvent read FOnCustomDrawCaption write SetOnCustomDrawCaption;
|
|
property OnCustomDrawValue: TdxInspectorReportLinkCustomEvent read FOnCustomDrawValue write SetOnCustomDrawValue;
|
|
property OnCustomDrawCaptionSeparator: TdxInspectorReportLinkCustomEvent read FOnCustomDrawCaptionSeparator write SetOnCustomDrawCaptionSeparator;
|
|
property OnCustomDrawValueSeparator: TdxInspectorReportLinkCustomEvent read FOnCustomDrawValueSeparator write SetOnCustomDrawValueSeparator;
|
|
end;
|
|
|
|
TdxInspectorReportLink = class(TCustomdxInspectorReportLink)
|
|
private
|
|
function GetInspector: TdxInspector;
|
|
public
|
|
property Inspector: TdxInspector read GetInspector;
|
|
end;
|
|
|
|
TdxInspectorDesignWindow = class(TStandarddxReportLinkDesignWindow)
|
|
PageControl1: TPageControl;
|
|
tshOptions: TTabSheet;
|
|
tshColors: TTabSheet;
|
|
tshFonts: TTabSheet;
|
|
pnlPreview: TPanel;
|
|
chbxTransparent: TCheckBox;
|
|
gbxTransparent: TGroupBox;
|
|
lblColor: TLabel;
|
|
bvlColorHolder: TBevel;
|
|
chbxCaptionTransparent: TCheckBox;
|
|
gbxCaptionTransparent: TGroupBox;
|
|
lblCaptionColor: TLabel;
|
|
bvlFixedColorHolder: TBevel;
|
|
lblGridLinesColor: TLabel;
|
|
bvlGridLineColorHolder: TBevel;
|
|
lblShow: TLabel;
|
|
bvlShow: TBevel;
|
|
chbxShowBorders: TCheckBox;
|
|
chbxShowHorzLines: TCheckBox;
|
|
chbxShowVertLines: TCheckBox;
|
|
btnFont: TButton;
|
|
edFont: TEdit;
|
|
btnGroupFont: TButton;
|
|
edGroupFont: TEdit;
|
|
btnFixedFont: TButton;
|
|
edFixedFont: TEdit;
|
|
chbxShowImages: TCheckBox;
|
|
gbxGroupTransparent: TGroupBox;
|
|
chbxGroupTransparent: TCheckBox;
|
|
lblGroupColor: TLabel;
|
|
bvlGroupColorHolder: TBevel;
|
|
imgGrid: TImage;
|
|
chbxShowExpandButtons: TCheckBox;
|
|
ilVendorLogos: TImageList;
|
|
ilCarPhotos: TImageList;
|
|
tshFormatting: TTabSheet;
|
|
lblRefinements: TLabel;
|
|
bvlAppearance: TBevel;
|
|
chbxFlatCheckMarks: TCheckBox;
|
|
chbxCheckMarksAsText: TCheckBox;
|
|
imgGraphics: TImage;
|
|
chbxDisplayGraphicsAsText: TCheckBox;
|
|
chbxTransparentColumnGraphics: TCheckBox;
|
|
lblBehaviors: TLabel;
|
|
chbxAutoNodesExpand: TCheckBox;
|
|
chbxAutoWidth: TCheckBox;
|
|
bvlBehaviors: TBevel;
|
|
Image4: TImage;
|
|
lblPreview: TStaticText;
|
|
pnlPreviewHost: TPanel;
|
|
insPreview: TdxInspector;
|
|
irMersedesBenz: TdxInspectorTextRow;
|
|
irMBPhoto: TdxInspectorTextGraphicRow;
|
|
irMBSUV: TdxInspectorTextCheckRow;
|
|
irMBModel: TdxInspectorTextRow;
|
|
irBMW: TdxInspectorTextRow;
|
|
irBMWModel: TdxInspectorTextRow;
|
|
irBMWSUV: TdxInspectorTextCheckRow;
|
|
irBMWPhoto: TdxInspectorTextGraphicRow;
|
|
stTransparent: TStaticText;
|
|
stCaptionTransparent: TStaticText;
|
|
stGroupTransparent: TStaticText;
|
|
procedure chbxAutoNodesExpandClick(Sender: TObject);
|
|
procedure chbxTransparentClick(Sender: TObject);
|
|
procedure chbxAutoWidthClick(Sender: TObject);
|
|
procedure btnFontClick(Sender: TObject);
|
|
procedure chbxOptionsClick(Sender: TObject);
|
|
procedure irMBSUVDrawValue(Sender: TdxInspectorRow;
|
|
ACanvas: TCanvas; ARect: TRect; var AText: String; AFont: TFont;
|
|
var AColor: TColor; var ADone: Boolean);
|
|
procedure InspectorDrawValue(Sender: TdxInspectorRow; ACanvas: TCanvas;
|
|
ARect: TRect; var AText: String; AFont: TFont; var AColor: TColor;
|
|
var ADone: Boolean);
|
|
procedure irMBPhotoDrawValue(Sender: TdxInspectorRow; ACanvas: TCanvas;
|
|
ARect: TRect; var AText: String; AFont: TFont; var AColor: TColor;
|
|
var ADone: Boolean);
|
|
procedure InspectorDrawCaption(Sender: TdxInspectorRow;
|
|
ACanvas: TCanvas; ARect: TRect; var AText: String; AFont: TFont;
|
|
var AColor: TColor; var ADone: Boolean);
|
|
procedure PageControl1Change(Sender: TObject);
|
|
procedure stTransparentClick(Sender: TObject);
|
|
procedure stCaptionTransparentClick(Sender: TObject);
|
|
procedure stGroupTransparentClick(Sender: TObject);
|
|
private
|
|
FccbxColor: TCustomComboBox;
|
|
FccbxCaptionColor: TCustomComboBox;
|
|
FccbxGroupColor: TCustomComboBox;
|
|
FccbxGridLineColor: TCustomComboBox;
|
|
|
|
procedure ccbxColorChange(Sender: TObject);
|
|
procedure CreateControls;
|
|
function GetReportLink: TCustomdxInspectorReportLink;
|
|
procedure LoadDataToInspector;
|
|
function CaptionColor: TColor;
|
|
function GroupColor: TColor;
|
|
function ValueColor: TColor;
|
|
|
|
procedure CMDialogChar(var message: TCMDialogChar); message CM_DIALOGCHAR;
|
|
protected
|
|
procedure DoInitialize; override;
|
|
{$IFDEF DELPHI7}
|
|
function GetPreviewHost: TCustomPanel; override;
|
|
{$ENDIF}
|
|
procedure LoadStrings; override;
|
|
procedure UpdateControlsState; override;
|
|
procedure UpdatePreview; override;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
property ReportLink: TCustomdxInspectorReportLink read GetReportLink;
|
|
end;
|
|
|
|
TdxInspectorColumnMapperProc = function(ARow: TdxInspectorRow;
|
|
AReportLink: TCustomdxInspectorReportLink): TdxReportCellDataClass;
|
|
TdxInspectorAssignDataProc = procedure(AReportLink: TCustomdxInspectorReportLink;
|
|
ADataItem: TAbstractdxReportCellData; AInspector: TCustomdxInspector;
|
|
ARow: TdxInspectorRow);
|
|
|
|
function DefaultdxInspectorMapperProc(ARow: TdxInspectorRow;
|
|
AReportLink: TCustomdxInspectorReportLink): TdxReportCellDataClass;
|
|
procedure DefaultdxInspectorAssignDataProc(AReportLink: TCustomdxInspectorReportLink;
|
|
ADataItem: TAbstractdxReportCellData; AInspector: TCustomdxInspector;
|
|
ARow: TdxInspectorRow);
|
|
|
|
const
|
|
FdxInspectorAssignDataProc: TdxInspectorAssignDataProc = DefaultdxInspectorAssignDataProc;
|
|
FdxInspectorColumnMapperProc: TdxInspectorColumnMapperProc = DefaultdxInspectorMapperProc;
|
|
|
|
dxDefaultInspectorPaintOptions: TdxInspectorPaintOptions =
|
|
[ipoBorder..ipoFlatCheckMarks , ipoImages ,
|
|
ipoExpandButtons];
|
|
|
|
implementation
|
|
|
|
{$R *.DFM}
|
|
|
|
uses
|
|
SysUtils, Math, cxClasses, dxExtCtrls, dxPSRes, dxPrnDev, dxPSUtl;
|
|
|
|
var
|
|
FPicture: TPicture;
|
|
|
|
type
|
|
TCustomdxInspectorControlAccess = class(TCustomdxInspectorControl);
|
|
TdxInspectorRowAccess = class(TdxInspectorRow);
|
|
TdxInspectorGraphicRowAccess = class(TdxInspectorGraphicRow);
|
|
TdxInspectorMemoRowAccess = class(TdxInspectorMemoRow);
|
|
|
|
TdxInspectorCellType = (ictNone, ictCaption, ictValue, ictCaptionSeparator, ictValueSeparator);
|
|
|
|
PdxRowItem = ^TdxRowItem;
|
|
TdxRowItem = record
|
|
Row: TdxInspectorRow;
|
|
CaptionWidths: TList;
|
|
ValueWidths: TList;
|
|
end;
|
|
|
|
PdxBandItem = ^TdxBandItem;
|
|
TdxBandItem = record
|
|
Rows: TList;
|
|
end;
|
|
|
|
function GetTextWidth(ADC: HDC; AFont: HFONT; const S: string): Integer;
|
|
var
|
|
TextSize: TSize;
|
|
begin
|
|
if S <> '' then
|
|
begin
|
|
SelectObject(ADC, AFont);
|
|
GetTextExtentPoint32(ADC, PChar(S), Length(S), TextSize);
|
|
Result := 3 + TextSize.cX + 3;
|
|
end
|
|
else
|
|
Result := 0;
|
|
end;
|
|
|
|
{TdxInspectorRow, TdxInspectorMaskRow, TdxInspectorMemoRow,
|
|
TdxInspectorDateRow, TdxInspectorButtonRow,TdxInspectorCheckRow,
|
|
TdxInspectorImageRow, TdxInspectorSpinRow, TdxInspectorPickRow,
|
|
TdxInspectorHyperLinkRow, TdxInspectorTimeRow, TdxInspectorCurrencyRow,
|
|
TdxInspectorGraphicRow, TdxInspectorBlobRow, TdxInspectorMRURow,
|
|
TdxInspectorPopupRow, TdxInspectorLookupRow, TdxInspectorCalcRow,
|
|
TdxInspectorExtLookupRow}
|
|
|
|
function DefaultdxInspectorMapperProc(ARow: TdxInspectorRow;
|
|
AReportLink: TCustomdxInspectorReportLink): TdxReportCellDataClass;
|
|
const
|
|
CheckClasses: array[Boolean] of TdxReportCellDataClass = (TdxReportCellCheckImage, TdxReportCellString);
|
|
ImageClasses: array[Boolean] of TdxReportCellDataClass = (TdxReportCellGraphic, TdxReportCellImage);
|
|
GraphicClasses: array[Boolean] of TdxReportCellDataClass = (TdxReportCellString, TdxReportCellGraphic);
|
|
begin
|
|
if ARow is TdxInspectorCheckRow then
|
|
Result := CheckClasses[ipoCheckMarksAsText in AReportLink.Options]
|
|
else
|
|
if ARow is TdxInspectorImageRow then
|
|
Result := ImageClasses[TdxInspectorImageRow(ARow).ShowDescription]
|
|
else
|
|
Result := GraphicClasses[(ARow is TdxInspectorGraphicRow) and not (ipoGraphicAsText in AReportLink.Options)];
|
|
end;
|
|
|
|
procedure DefaultdxInspectorAssignDataProc(AReportLink: TCustomdxInspectorReportLink;
|
|
ADataItem: TAbstractdxReportCellData; AInspector: TCustomdxInspector;
|
|
ARow: TdxInspectorRow);
|
|
var
|
|
AState: TCheckBoxState;
|
|
ANullStyle: TdxShowNullFieldStyle;
|
|
AImageIndex, ATextIndex: Integer;
|
|
S: string;
|
|
GraphicClass: TGraphicClass;
|
|
BaseRow: TdxInspectorRow;
|
|
ComplexRow: TdxInspectorComplexRow;
|
|
begin
|
|
case TdxInspectorCellType(ADataItem.Data) of
|
|
ictCaptionSeparator:
|
|
with TdxReportCellString(ADataItem) do
|
|
begin
|
|
CellSides := AReportLink.GetRowSeparatorCellSides(ARow);
|
|
EndEllipsis := AReportLink.IsDrawEndEllipsis;
|
|
FontIndex := AReportLink.GetRowFontIndex(ARow);
|
|
Indent := 0;
|
|
Text := AReportLink.GetComplexRowSeparatorText(ARow);
|
|
TextAlignX := taCenterX;
|
|
TextAlignY := taCenterY;
|
|
Transparent := AReportLink.GetRowCaptionTransparency(ARow);
|
|
if not Transparent then
|
|
Color := AReportLink.GetRowCaptionColor(ARow);
|
|
end;
|
|
ictValueSeparator:
|
|
with TdxReportCellString(ADataItem) do
|
|
begin
|
|
CellSides := AReportLink.GetRowSeparatorCellSides(ARow);
|
|
EndEllipsis := AReportLink.IsDrawEndEllipsis;
|
|
FontIndex := 0;
|
|
Indent := 0;
|
|
Text := AReportLink.GetComplexRowSeparatorText(ARow);
|
|
TextAlignX := taCenterX;
|
|
TextAlignY := taCenterY;
|
|
Transparent := AReportLink.Transparent;
|
|
if not Transparent then
|
|
Color := AReportLink.Color;
|
|
end;
|
|
ictCaption:
|
|
with TdxReportCellString(ADataItem) do
|
|
begin
|
|
CellSides := AReportLink.GetRowCaptionCellSides(ARow);
|
|
EndEllipsis := AReportLink.IsDrawEndEllipsis;
|
|
FontIndex := AReportLink.GetRowFontIndex(ARow);
|
|
Indent := 2;
|
|
BaseRow := ARow;
|
|
ComplexRow := AReportLink.ComplexRowByRow(ARow);
|
|
if ComplexRow <> nil then BaseRow := ComplexRow;
|
|
Multiline := AReportLink.IsRowCaptionMultilined(BaseRow);
|
|
Text := ARow.Caption;
|
|
TextAlignY := dxMultilineTextAlignY[Multiline];
|
|
Transparent := AReportLink.GetRowCaptionTransparency(ARow);
|
|
if not Transparent then
|
|
Color := AReportLink.GetRowCaptionColor(ARow);
|
|
end;
|
|
ictValue:
|
|
if TdxInspectorCellType(ADataItem.Data) = ictValue then
|
|
begin
|
|
TdxReportVisualItem(ADataItem).CellSides := AReportLink.GetRowValueCellSides(ARow);
|
|
TdxReportVisualItem(ADataItem).Transparent := AReportLink.Transparent;
|
|
if not TdxReportVisualItem(ADataItem).Transparent then
|
|
TdxReportVisualItem(ADataItem).Color := AReportLink.Color;
|
|
if ADataItem is TdxReportCellCheck then
|
|
with TdxReportCellCheck(ADataItem) do
|
|
|
|
begin
|
|
AState := TCheckBoxState(TdxInspectorCheckRow(ARow).GetCheckBoxState(AReportLink.GetRowValueText(ARow)));
|
|
ANullStyle := TdxInspectorCheckRow(ARow).ShowNullFieldStyle;
|
|
Enabled := not ((AState = cbGrayed) and (ANullStyle > nsUnchecked));
|
|
Checked := (AState = cbChecked) or
|
|
((AState = cbGrayed) and (ANullStyle = nsGrayedChecked));
|
|
FlatBorder := AReportLink.IsFlatCheckMarks;
|
|
end
|
|
else
|
|
if ADataItem is TdxReportCellImage then
|
|
with TdxReportCellImage(ADataItem) do
|
|
begin
|
|
S := AReportLink.GetRowValueText(ARow);
|
|
TdxInspectorImageRow(ARow).GetIndexes(S, AImageIndex, ATextIndex);
|
|
if ATextIndex <> -1 then
|
|
Text := TdxInspectorImageRow(ARow).Descriptions[ATextIndex];
|
|
ImageList := TdxInspectorImageRow(ARow).Images;
|
|
ImageIndex := AImageIndex;
|
|
MakeSpaceForEmptyImage := True;
|
|
EndEllipsis := True;
|
|
Multiline := TdxInspectorImageRow(ARow).MultilineText;
|
|
TextAlignX := dxTextAlignX[ARow.Alignment];
|
|
TextAlignY := dxMultilineTextAlignY[Multiline];
|
|
end
|
|
else
|
|
if ADataItem is TdxReportCellGraphic then
|
|
if ARow is TdxInspectorGraphicRow then
|
|
begin
|
|
GraphicClass := TdxInspectorGraphicRowAccess(ARow).GetGraphicClass;
|
|
LoadPicture(FPicture, GraphicClass, TdxInspectorGraphicRowAccess(ARow).GetGraphicValue);
|
|
if GraphicClass = nil then GraphicClass := TBitmap;
|
|
with TdxReportCellGraphic(ADataItem) do
|
|
begin
|
|
Image := FPicture.Graphic;
|
|
ImageTransparent :=
|
|
(ipoTransparentRowGraphic in AReportLink.Options) or GraphicClass.InheritsFrom(TIcon);
|
|
if not GraphicClass.InheritsFrom(TIcon) and TdxInspectorGraphicRow(ARow).Stretch then
|
|
DrawMode := gdmStretchProportional
|
|
else
|
|
if TdxInspectorGraphicRow(ARow).Center then
|
|
DrawMode := gdmCenter
|
|
else
|
|
DrawMode := gdmNone;
|
|
end
|
|
end
|
|
else
|
|
with TdxReportCellGraphic(ADataItem) do
|
|
begin
|
|
S := AReportLink.GetRowValueText(ARow);
|
|
TdxInspectorImageRow(ARow).GetIndexes(S, AImageIndex, ATextIndex);
|
|
ImageList := TdxInspectorImageRow(ARow).Images;
|
|
ImageIndex := AImageIndex;
|
|
DrawMode := gdmCenter;
|
|
end
|
|
else
|
|
{ TdxInspectorTextRow, TdxInspectorMaskRow, TdxInspectorDateRow
|
|
TdxInspectorCalcRow, TdxInspectorButtonRow, TdxInspectorSpinRow,
|
|
TdxInspectorPickRow, TdxInspectorTimeRow, TdxInspectorCurrencyRow,
|
|
TdxInspectorHyperLinkRow }
|
|
with TdxReportCellString(ADataItem) do
|
|
begin
|
|
Text := AReportLink.GetRowValueText(ARow);
|
|
EndEllipsis := ioDrawEndEllipsis in TCustomdxInspectorControlAccess(AInspector).Options;
|
|
Multiline := AReportLink.IsRowValueMultilined(ARow);
|
|
TextAlignX := dxTextAlignX[ARow.Alignment];
|
|
TextAlignY := dxMultilineTextAlignY[Multiline];
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
{ TdxRowHelpersFactory }
|
|
|
|
type
|
|
TdxRowHelpersFactory = class(TdxCustomClassMaps)
|
|
private
|
|
function GetHelperClass(Row: TdxInspectorRow): TdxInspectorRowHelperClass;
|
|
public
|
|
class function Instance: TdxRowHelpersFactory; reintroduce; overload;
|
|
property HelperClasses[Row: TdxInspectorRow]: TdxInspectorRowHelperClass read GetHelperClass; default;
|
|
end;
|
|
|
|
function dxRowHelpersFactory: TdxRowHelpersFactory;
|
|
begin
|
|
Result := TdxRowHelpersFactory.Instance;
|
|
end;
|
|
|
|
class function TdxRowHelpersFactory.Instance: TdxRowHelpersFactory;
|
|
begin
|
|
Result := inherited Instance as TdxRowHelpersFactory;
|
|
end;
|
|
|
|
function TdxRowHelpersFactory.GetHelperClass(Row: TdxInspectorRow): TdxInspectorRowHelperClass;
|
|
begin
|
|
Result := TdxInspectorRowHelperClass(PairClasses[Row.ClassType]);
|
|
end;
|
|
|
|
{ TdxInspectorRowHelper }
|
|
|
|
class function TdxInspectorRowHelper.PairClass: TClass;
|
|
begin
|
|
Result := RowClass;
|
|
end;
|
|
|
|
class procedure TdxInspectorRowHelper.Register;
|
|
begin
|
|
dxRowHelpersFactory.Register(Self);
|
|
end;
|
|
|
|
class function TdxInspectorRowHelper.RowClass: TdxInspectorRowClass;
|
|
begin
|
|
Result := TdxInspectorRow;
|
|
end;
|
|
|
|
class procedure TdxInspectorRowHelper.GetImageLists(ARow: TdxInspectorRow;
|
|
AProc: TdxPSGetImageListProc);
|
|
begin
|
|
end;
|
|
|
|
{ TdxInspectorImageRowHelper }
|
|
|
|
class function TdxInspectorImageRowHelper.RowClass: TdxInspectorRowClass;
|
|
begin
|
|
Result := TdxInspectorImageRow;
|
|
end;
|
|
|
|
class procedure TdxInspectorImageRowHelper.GetImageLists(ARow: TdxInspectorRow;
|
|
AProc: TdxPSGetImageListProc);
|
|
begin
|
|
AProc(TdxInspectorImageRow(ARow).Images);
|
|
end;
|
|
|
|
{ TCustomdxInspectorReportLink }
|
|
|
|
constructor TCustomdxInspectorReportLink.Create(AOwner: TComponent);
|
|
begin
|
|
inherited;
|
|
FFixedFont := TFont.Create;
|
|
FOddFont := TFont.Create;
|
|
FGroupFont := TFont.Create;
|
|
|
|
InternalRestoreDefaults;
|
|
LinkModified(False);
|
|
|
|
FFixedFont.OnChange := FontChanged;
|
|
FOddFont.OnChange := FontChanged;
|
|
FGroupFont.OnChange := FontChanged;
|
|
FSaveFont := TFont.Create;
|
|
FSaveFont.OnChange := CustomDrawFontChanged;
|
|
|
|
FRows := TList.Create;
|
|
FBands := TList.Create;
|
|
FRowHeights := TList.Create;
|
|
end;
|
|
|
|
destructor TCustomdxInspectorReportLink.Destroy;
|
|
begin
|
|
FreeAndNil(FDefaultGroupFont);
|
|
FreeAndNil(FRowHeights);
|
|
FreeAndNilRows;
|
|
FreeAndNilBands;
|
|
FreeAndNil(FSaveFont);
|
|
FreeAndNil(FGroupFont);
|
|
FreeAndNil(FOddFont);
|
|
FreeAndNil(FFixedFont);
|
|
inherited;
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.Assign(Source: TPersistent);
|
|
begin
|
|
if Source is TCustomdxInspectorReportLink then
|
|
with TCustomdxInspectorReportLink(Source) do
|
|
begin
|
|
Self.FIsGraphicAsTextAssigned := FIsGraphicAsTextAssigned;
|
|
Self.AutoNodesExpand := AutoNodesExpand;
|
|
Self.AutoWidth := AutoWidth;
|
|
Self.FixedTransparent := FixedTransparent;
|
|
Self.GroupTransparent := GroupTransparent;
|
|
Self.FixedColor := FixedColor;
|
|
Self.FixedFont := FixedFont;
|
|
Self.GridLineColor := GridLineColor;
|
|
Self.GroupFont := GroupFont;
|
|
Self.GroupColor := GroupColor;
|
|
Self.OddFont := OddFont;
|
|
Self.Options := Options;
|
|
Self.SupportedCustomDraw := SupportedCustomDraw;
|
|
end;
|
|
inherited;
|
|
end;
|
|
|
|
function TCustomdxInspectorReportLink.DefaultGraphicAsTextText: string;
|
|
begin
|
|
Result := cxGetResourceString(@sdxGraphicAsTextValue);
|
|
end;
|
|
|
|
function TCustomdxInspectorReportLink.DefaultGroupFont: TFont;
|
|
begin
|
|
if FDefaultGroupFont = nil then
|
|
begin
|
|
FDefaultGroupFont := TFont.Create;
|
|
InitializeDefaultGroupFont(FDefaultGroupFont);
|
|
end;
|
|
Result := FDefaultGroupFont;
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.DefineProperties(Filer: TFiler);
|
|
begin
|
|
inherited;
|
|
Filer.DefineProperty('IsGraphicAsTextValueAssigned', ReadIsGraphicAsTextValueAssigned,
|
|
WriteIsGraphicAsTextValueAssigned,
|
|
FIsGraphicAsTextAssigned and (GraphicAsTextText = ''));
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.ConstructReport(AReportCells: TdxReportCells);
|
|
var
|
|
I: Integer;
|
|
ParentCell, Cell: TdxReportCell;
|
|
CurrentRow: TdxInspectorRow;
|
|
begin
|
|
if CustomInspector = nil then Exit;
|
|
inherited;
|
|
if CustomInspector.TotalRowCount = 0 then Exit;
|
|
|
|
PrepareConstruct(AReportCells);
|
|
try
|
|
AReportCells.BorderColor := GridLineColor;
|
|
AReportCells.Cells.FontIndex := FFontIndex;
|
|
AReportCells.Cells.Color := Color;
|
|
|
|
if IsAutoBandCount then
|
|
begin
|
|
ParentCell := TdxReportCell.Create(AReportCells.Cells);
|
|
ParentCell.CellSides := [];
|
|
ParentCell.Transparent := True;
|
|
end
|
|
else
|
|
ParentCell := AReportCells.Cells;
|
|
|
|
for I := 0 to FRows.Count - 1 do
|
|
begin
|
|
CurrentRow := GetRow(I);
|
|
|
|
Cell := TdxReportCell.Create(ParentCell);
|
|
Cell.CellSides := GetRowCellSides(CurrentRow);
|
|
Cell.Data := Integer(CurrentRow);
|
|
PlaceRow(CurrentRow, I, Cell);
|
|
|
|
InsertRowIndent(Cell, CurrentRow);
|
|
if CanDrawRowImage(CurrentRow) then
|
|
InsertRowImage(Cell, CurrentRow);
|
|
InsertRowCaption(Cell, CurrentRow, I);
|
|
if not CurrentRow.IsCategory then
|
|
InsertRowValue(Cell, CurrentRow, I);
|
|
|
|
AReportCells.DoProgress(MulDiv(I, 100, FRows.Count));
|
|
if AbortBuilding then Break;
|
|
end;
|
|
|
|
if not AbortBuilding then
|
|
begin
|
|
ParentCell.BoundsRect := Rect(0, 0, FBandCount * FBandWidth, FMaxBandHeight);
|
|
AReportCells.Cells.BoundsRect := ParentCell.BoundsRect;
|
|
end;
|
|
finally
|
|
UnprepareConstruct(AReportCells);
|
|
end;
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.GetImageLists(AProc: TdxPSGetImageListProc);
|
|
begin
|
|
inherited;
|
|
AProc(TCustomdxInspectorControlAccess(CustomInspector).Images);
|
|
GetImageListsFromRows(AProc);
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.InternalRestoreDefaults;
|
|
begin
|
|
inherited;
|
|
FAutoNodesExpand := False;
|
|
FAutoWidth := False;
|
|
FFixedTransparent := False;
|
|
FGroupTransparent := False;
|
|
FFixedColor := dxDefaultFixedColor;
|
|
GridLineColor := dxDefaultGridLineColor;
|
|
FGroupColor := FixedColor;
|
|
FOptions := dxDefaultInspectorPaintOptions;
|
|
SupportedCustomDraw := False;
|
|
|
|
FixedFont := DefaultFont;
|
|
GroupFont := DefaultGroupFont;
|
|
OddFont := DefaultFont;
|
|
|
|
FIsGraphicAsTextAssigned := False;
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.InternalRestoreFromOriginal;
|
|
begin
|
|
inherited;
|
|
FixedTransparent :=
|
|
TCustomdxInspectorControlAccess(CustomInspector).PaintStyle = ipsSimple;
|
|
FixedTransparent :=
|
|
FixedTransparent or (TCustomdxInspectorControlAccess(CustomInspector).PaintStyle = ipsNET);
|
|
if TCustomdxInspectorControlAccess(CustomInspector).PaintStyle = ipsCategorized then
|
|
begin
|
|
GroupColor := clBtnShadow;
|
|
GridLineColor := dxDefaultFixedColor;
|
|
end;
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.MakeDelimiters(AReportCells: TdxReportCells;
|
|
AHorzDelimiters, AVertDelimiters: TList);
|
|
var
|
|
I, RowIndex: Integer;
|
|
Cell: TdxReportCell;
|
|
begin
|
|
inherited;
|
|
if IsAutoBandCount then
|
|
Cell := AReportCells.Cells[0]
|
|
else
|
|
Cell := AReportCells.Cells;
|
|
|
|
{ horz. }
|
|
if Cell.CellCount > 0 then
|
|
begin
|
|
RowIndex := 0;
|
|
while (RowIndex < Cell.CellCount) and GetRow(RowIndex).IsCategory do
|
|
Inc(RowIndex);
|
|
if RowIndex = Cell.CellCount then RowIndex := 0;
|
|
for I := 0 to Cell[RowIndex].DataItemCount - 1 do
|
|
AHorzDelimiters.Add(Pointer(Cell[RowIndex].DataItems[I].BoundsRect.Right));
|
|
end;
|
|
|
|
{ vert. }
|
|
if UseVertDelimiters then
|
|
for I := 0 to Cell.CellCount - 1 do
|
|
AVertDelimiters.Add(Pointer(Cell[I].BoundsRect.Bottom));
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.CalcLayout;
|
|
begin
|
|
case TCustomdxInspectorControlAccess(CustomInspector).PaintStyle of
|
|
ipsSimple , ipsNET :
|
|
FIndent := dxInspectorButtonSize + 6;
|
|
ipsCategorized:
|
|
FIndent := dxInspectorButtonSize + 5
|
|
else
|
|
FIndent := dxInspectorButtonExSize + 4;
|
|
end;
|
|
|
|
with TCustomdxInspectorControlAccess(CustomInspector) do
|
|
begin
|
|
FBandCount := GetBandIndexByNode(LastNode) + 1;
|
|
if FBandCount = 0 then FBandCount := 1;
|
|
if IsAutoBandCount then
|
|
FBandWidth := BandWidth
|
|
else
|
|
FBandWidth := ClientWidth;
|
|
end;
|
|
FCaptionWidth := TCustomdxInspectorControlAccess(CustomInspector).DividerPos;
|
|
FValueWidth := FBandWidth - FCaptionWidth;
|
|
CalcStandardRowHeight;
|
|
CalcComplexRowItemsWidths;
|
|
if AutoWidth then CalcAutoWidths;
|
|
FFullWidth := FBandWidth * FBandCount;
|
|
CalcRowHeights;
|
|
DistributeRowsByBands;
|
|
CalcMaxBandHeight;
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.CalcMaxBandHeight;
|
|
var
|
|
I, J, V: Integer;
|
|
Rows: TList;
|
|
begin
|
|
FMaxBandHeight := 0;
|
|
for I := 0 to FBands.Count - 1 do
|
|
begin
|
|
Rows := PdxBandItem(FBands.List[I])^.Rows;
|
|
V := 0;
|
|
for J := 0 to Rows.Count - 1 do
|
|
Inc(V, GetRowHeight(J));
|
|
if FMaxBandHeight < V then
|
|
FMaxBandHeight := V;
|
|
end;
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.PrepareConstruct(AReportCells: TdxReportCells);
|
|
begin
|
|
AddRows;
|
|
CalcLayout;
|
|
FFixedFontIndex := AddFontToPool(FixedFont);
|
|
FGroupFontIndex := AddFontToPool(GroupFont);
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.UnprepareConstruct(AReportCells: TdxReportCells);
|
|
begin
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.AssignValues(ADataItem: TAbstractdxReportCellData;
|
|
ARow: TdxInspectorRow);
|
|
begin
|
|
if Assigned(FdxInspectorAssignDataProc) then
|
|
FdxInspectorAssignDataProc(Self, ADataItem, CustomInspector, ARow);
|
|
end;
|
|
|
|
function TCustomdxInspectorReportLink.GetDataClass(ARow: TdxInspectorRow): TdxReportCellDataClass;
|
|
begin
|
|
if Assigned(FdxInspectorColumnMapperProc) then
|
|
Result := FdxInspectorColumnMapperProc(ARow, Self)
|
|
else
|
|
Result := nil;
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.GetImageListsFromRows(AProc: TdxPSGetImageListProc);
|
|
var
|
|
I: Integer;
|
|
Row: TdxInspectorRow;
|
|
begin
|
|
for I := 0 to CustomInspector.Count - 1 do
|
|
begin
|
|
Row := CustomInspector.Rows[I];
|
|
dxRowHelpersFactory[Row].GetImageLists(Row, AProc);
|
|
end;
|
|
end;
|
|
|
|
function TCustomdxInspectorReportLink.GetRowFontIndex(ARow: TdxInspectorRow): Integer;
|
|
begin
|
|
if ARow.IsCategory then
|
|
Result := FGroupFontIndex
|
|
else
|
|
Result := FFixedFontIndex;
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.CustomDraw(AItem: TAbstractdxReportCellData;
|
|
ACanvas: TCanvas; ABoundsRect, AClientRect: TRect; var ADone: Boolean);
|
|
var
|
|
AColor: TColor;
|
|
AText: string;
|
|
ATextAlignX: TcxTextAlignX;
|
|
ATextAlignY: TcxTextAlignY;
|
|
ARow: TdxInspectorRow;
|
|
begin
|
|
if AItem.Data = 0 then Exit;
|
|
with TdxReportCellString(AItem) do
|
|
begin
|
|
//!!!
|
|
//ParentColor := False;
|
|
AColor := ColorToRGB(Color);
|
|
if Transparent then AColor := clNone;
|
|
FSaveFont.Assign(Font);
|
|
FCustomDrawFontChanged := False;
|
|
AText := Text;
|
|
ATextAlignX := TextAlignX;
|
|
ATextAlignY := TextAlignY;
|
|
ARow := TdxInspectorRow(AItem.Parent.Data);
|
|
case TdxInspectorCellType(AItem.Data) of
|
|
ictCaption:
|
|
DoCustomDrawCaption(ARow, ACanvas, ABoundsRect, AClientRect, AText, AColor,
|
|
FSaveFont, ATextAlignX, ATextAlignY, ADone);
|
|
ictValue:
|
|
DoCustomDrawValue(ARow, ACanvas, ABoundsRect, AClientRect, AText, AColor,
|
|
FSaveFont, ATextAlignX, ATextAlignY, ADone);
|
|
ictCaptionSeparator:
|
|
DoCustomDrawCaptionSeparator(ARow, ACanvas, ABoundsRect, AClientRect, AText, AColor,
|
|
FSaveFont, ATextAlignX, ATextAlignY, ADone);
|
|
ictValueSeparator:
|
|
DoCustomDrawValueSeparator(ARow, ACanvas, ABoundsRect, AClientRect, AText, AColor,
|
|
FSaveFont, ATextAlignX, ATextAlignY, ADone);
|
|
end;
|
|
if not ADone then
|
|
begin
|
|
if FCustomDrawFontChanged then
|
|
begin
|
|
SelectObject(ACanvas.Handle, FSaveFont.Handle);
|
|
SetTextColor(ACanvas.Handle, ColorToRGB(FSaveFont.Color));
|
|
FontIndex := -1;
|
|
end;
|
|
if (AColor <> clNone) then
|
|
begin
|
|
Color := AColor;
|
|
Transparent := False;
|
|
end;
|
|
Text := AText;
|
|
TextAlignX := ATextAlignX;
|
|
TextAlignY := ATextAlignY;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.DoCustomDrawCaption(ARow: TdxInspectorRow;
|
|
ACanvas: TCanvas; ABoundsRect, AClientRect: TRect; var AText: string;
|
|
var AColor: TColor; AFont: TFont; var ATextAlignX: TcxTextAlignX;
|
|
var ATextAlignY: TcxTextAlignY; var ADone: Boolean);
|
|
begin
|
|
if Assigned(FOnCustomDrawCaption) then
|
|
FOnCustomDrawCaption(Self, ARow, ACanvas, ABoundsRect, AClientRect, AText,
|
|
AColor, AFont, ATextAlignX, ATextAlignY, ADone)
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.DoCustomDrawValue(ARow: TdxInspectorRow;
|
|
ACanvas: TCanvas; ABoundsRect, AClientRect: TRect; var AText: string;
|
|
var AColor: TColor; AFont: TFont; var ATextAlignX: TcxTextAlignX;
|
|
var ATextAlignY: TcxTextAlignY; var ADone: Boolean);
|
|
begin
|
|
if Assigned(FOnCustomDrawValue) then
|
|
FOnCustomDrawValue(Self, ARow, ACanvas, ABoundsRect, AClientRect, AText,
|
|
AColor, AFont, ATextAlignX, ATextAlignY, ADone)
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.DoCustomDrawCaptionSeparator(ARow: TdxInspectorRow;
|
|
ACanvas: TCanvas; ABoundsRect, AClientRect: TRect; var AText: string;
|
|
var AColor: TColor; AFont: TFont; var ATextAlignX: TcxTextAlignX;
|
|
var ATextAlignY: TcxTextAlignY; var ADone: Boolean);
|
|
begin
|
|
if Assigned(FOnCustomDrawCaptionSeparator) then
|
|
FOnCustomDrawCaptionSeparator(Self, ARow, ACanvas, ABoundsRect, AClientRect,
|
|
AText, AColor, AFont, ATextAlignX, ATextAlignY, ADone)
|
|
end;
|
|
procedure TCustomdxInspectorReportLink.DoCustomDrawValueSeparator(ARow: TdxInspectorRow;
|
|
ACanvas: TCanvas; ABoundsRect, AClientRect: TRect; var AText: string;
|
|
var AColor: TColor; AFont: TFont; var ATextAlignX: TcxTextAlignX;
|
|
var ATextAlignY: TcxTextAlignY; var ADone: Boolean);
|
|
begin
|
|
if Assigned(FOnCustomDrawValueSeparator) then
|
|
FOnCustomDrawValueSeparator(Self, ARow, ACanvas, ABoundsRect, AClientRect,
|
|
AText, AColor, AFont, ATextAlignX, ATextAlignY, ADone)
|
|
end;
|
|
|
|
function TCustomdxInspectorReportLink.IsSupportedCustomDraw(Item: TAbstractdxReportCellData): Boolean;
|
|
begin
|
|
Result := SupportedCustomDraw;
|
|
if Result and (Item <> nil) then
|
|
case TdxInspectorCellType(Item.Data) of
|
|
ictCaption:
|
|
Result := Assigned(FOnCustomDrawCaption);
|
|
ictValue:
|
|
Result := Assigned(FOnCustomDrawValue);
|
|
ictCaptionSeparator:
|
|
Result := Assigned(FOnCustomDrawCaptionSeparator);
|
|
ictValueSeparator:
|
|
Result := Assigned(FOnCustomDrawValueSeparator);
|
|
else
|
|
Result := False;
|
|
end;
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.InitializeDefaultGroupFont(AFont: TFont);
|
|
begin
|
|
AFont.Assign(DefaultFont);
|
|
AFont.Style := AFont.Style + [fsBold];
|
|
end;
|
|
|
|
function TCustomdxInspectorReportLink.GetCustomInspector: TCustomdxInspectorControl;
|
|
begin
|
|
Result := TCustomdxInspectorControl(Component);
|
|
end;
|
|
|
|
function TCustomdxInspectorReportLink.GetGraphicAsTextText: string;
|
|
begin
|
|
if FIsGraphicAsTextAssigned then
|
|
Result := FGraphicAsTextText
|
|
else
|
|
Result := DefaultGraphicAsTextText;
|
|
end;
|
|
|
|
function TCustomdxInspectorReportLink.GetOddColor: TColor;
|
|
begin
|
|
Result := inherited Color;
|
|
end;
|
|
|
|
function TCustomdxInspectorReportLink.GetOptions: TdxInspectorPaintOptions;
|
|
begin
|
|
Result := FOptions;
|
|
end;
|
|
|
|
function TCustomdxInspectorReportLink.IsGraphicAsTextTextStored: Boolean;
|
|
begin
|
|
Result := FIsGraphicAsTextAssigned and (FGraphicAsTextText <> DefaultGraphicAsTextText);
|
|
end;
|
|
|
|
function TCustomdxInspectorReportLink.IsGroupFontStored: Boolean;
|
|
begin
|
|
Result := not dxPSUtl.dxAreFontsEqual(GroupFont, DefaultGroupFont);
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.SetAutoNodesExpand(Value: Boolean);
|
|
begin
|
|
if FAutoNodesExpand <> Value then
|
|
begin
|
|
FAutoNodesExpand := Value;
|
|
LinkModified(True);
|
|
end;
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.SetAutoWidth(Value: Boolean);
|
|
begin
|
|
if FAutoWidth <> Value then
|
|
begin
|
|
FAutoWidth := Value;
|
|
LinkModified(True);
|
|
end;
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.SetFixedColor(Value: TColor);
|
|
begin
|
|
if FFixedColor <> Value then
|
|
begin
|
|
FFixedColor := Value;
|
|
LinkModified(True);
|
|
end;
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.SetFixedFont(Value: TFont);
|
|
begin
|
|
FFixedFont.Assign(Value);
|
|
LinkModified(True);
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.SetFixedTransparent(Value: Boolean);
|
|
begin
|
|
if FFixedTransparent <> Value then
|
|
begin
|
|
FFixedTransparent := Value;
|
|
LinkModified(True);
|
|
end;
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.SetGraphicAsTextText(const Value: string);
|
|
begin
|
|
if GraphicAsTextText <> Value then
|
|
begin
|
|
FGraphicAsTextText := Value;
|
|
FIsGraphicAsTextAssigned := True;
|
|
if ipoGraphicAsText in Options then LinkModified(True);
|
|
end;
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.SetGridLineColor(Value: TColor);
|
|
begin
|
|
if FGridLineColor <> Value then
|
|
begin
|
|
FGridLineColor := Value;
|
|
if IsDrawAnyLines then LinkModified(True);
|
|
end;
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.SetGroupFont(Value: TFont);
|
|
begin
|
|
GroupFont.Assign(Value);
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.SetGroupNodeColor(Value: TColor);
|
|
begin
|
|
if FGroupColor <> Value then
|
|
begin
|
|
FGroupColor := Value;
|
|
LinkModified(True);
|
|
end;
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.SetGroupTransparent(Value: Boolean);
|
|
begin
|
|
if FGroupTransparent <> Value then
|
|
begin
|
|
FGroupTransparent := Value;
|
|
LinkModified(True);
|
|
end;
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.SetOddColor(Value: TColor);
|
|
begin
|
|
inherited Color := Value;
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.SetOddFont(Value: TFont);
|
|
begin
|
|
OddFont.Assign(Value);
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.SetOnCustomDrawCaption(Value: TdxInspectorReportLinkCustomEvent);
|
|
begin
|
|
if @FOnCustomDrawCaption <> @Value then
|
|
begin
|
|
FOnCustomDrawCaption := Value;
|
|
LinkModified(True);
|
|
end;
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.SetOnCustomDrawValue(Value: TdxInspectorReportLinkCustomEvent);
|
|
begin
|
|
if @FOnCustomDrawValue <> @Value then
|
|
begin
|
|
FOnCustomDrawValue := Value;
|
|
LinkModified(True);
|
|
end;
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.SetOnCustomDrawCaptionSeparator(Value: TdxInspectorReportLinkCustomEvent);
|
|
begin
|
|
if @FOnCustomDrawCaptionSeparator <> @Value then
|
|
begin
|
|
FOnCustomDrawCaptionSeparator := Value;
|
|
LinkModified(True);
|
|
end;
|
|
end;
|
|
procedure TCustomdxInspectorReportLink.SetOnCustomDrawValueSeparator(Value: TdxInspectorReportLinkCustomEvent);
|
|
begin
|
|
if @FOnCustomDrawValueSeparator <> @Value then
|
|
begin
|
|
FOnCustomDrawValueSeparator := Value;
|
|
LinkModified(True);
|
|
end;
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.SetOptions(Value: TdxInspectorPaintOptions);
|
|
begin
|
|
if FOptions <> Value then
|
|
begin
|
|
FOptions := Value;
|
|
LinkModified(True);
|
|
end;
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.SetSupportCustomDraw(Value: Boolean);
|
|
begin
|
|
if FSupportedCustomDraw <> Value then
|
|
begin
|
|
FSupportedCustomDraw := Value;
|
|
if Assigned(FOnCustomDrawCaption) or Assigned(FOnCustomDrawValue) then
|
|
LinkModified(True);
|
|
end;
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.CalcAutoWidths;
|
|
|
|
function CalcSum(AData: TList): Integer;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
Result := 0;
|
|
for I := 0 to AData.Count - 1 do
|
|
Inc(Result, Integer(AData.List^[I]));
|
|
end;
|
|
|
|
function GetFont(ARow: TdxInspectorRow; AIsCaption: Boolean): HFONT;
|
|
begin
|
|
if ARow.IsCategory then
|
|
Result := GroupFont.Handle
|
|
else
|
|
if AIsCaption then
|
|
Result := FixedFont.Handle
|
|
else
|
|
Result := Font.Handle;
|
|
end;
|
|
|
|
procedure GetRowWidths(ADC: HDC; ARow: TdxInspectorRow; ARowIndex: Integer;
|
|
var ACaptionWidth, AValueWidth: Integer);
|
|
var
|
|
I, V: Integer;
|
|
RowItem: PdxRowItem;
|
|
ChildRow: TdxInspectorRowAccess;
|
|
Separator: Boolean;
|
|
S: string;
|
|
begin
|
|
if ARow is TdxInspectorComplexRow then
|
|
begin
|
|
RowItem := PdxRowItem(FRows.List^[ARowIndex]);
|
|
for I := 0 to RowItem.CaptionWidths.Count - 1 do
|
|
begin
|
|
Separator := IsComplexRowSeparator(TdxInspectorComplexRow(ARow), I);
|
|
ChildRow := TdxInspectorRowAccess(TdxInspectorComplexRow(ARow).Items[I div 2].Row);
|
|
if not IsRowCaptionMultilined(ARow) then
|
|
begin
|
|
if Separator then
|
|
S := GetComplexRowSeparatorText(ARow)
|
|
else
|
|
S := ChildRow.Caption;
|
|
V := GetTextWidth(ADC, GetFont(ChildRow, True), S);
|
|
if Integer(RowItem^.CaptionWidths.List^[I]) < V then
|
|
RowItem^.CaptionWidths[I] := Pointer(V);
|
|
end;
|
|
if not IsRowValueMultilined(ChildRow) then
|
|
begin
|
|
if Separator then
|
|
S := GetComplexRowSeparatorText(ARow)
|
|
else
|
|
S := GetRowValueText(ChildRow);
|
|
V := GetTextWidth(ADC, GetFont(ChildRow, False), S);
|
|
if Integer(RowItem^.ValueWidths.List^[I]) < V then
|
|
RowItem^.ValueWidths[I] := Pointer(V);
|
|
end;
|
|
end;
|
|
ACaptionWidth := CalcSum(RowItem^.CaptionWidths);
|
|
AValueWidth := CalcSum(RowItem^.ValueWidths);
|
|
Exit;
|
|
end
|
|
else
|
|
begin
|
|
if not IsRowCaptionMultilined(ARow) then
|
|
ACaptionWidth := GetTextWidth(ADC, GetFont(ARow, True), ARow.Caption);
|
|
if not IsRowValueMultilined(ARow) and not ARow.IsCategory then
|
|
AValueWidth := GetTextWidth(ADC, GetFont(ARow, False), GetRowValueText(ARow));
|
|
end;
|
|
end;
|
|
|
|
var
|
|
DC: HDC;
|
|
PrevFont: HFONT;
|
|
I: Integer;
|
|
Row: TdxInspectorRow;
|
|
CW, VW: Integer;
|
|
begin
|
|
DC := GetDC(0);
|
|
try
|
|
PrevFont := GetCurrentObject(DC, OBJ_FONT);
|
|
for I := 0 to FRows.Count - 1 do
|
|
begin
|
|
CW := FCaptionWidth;
|
|
VW := FValueWidth;
|
|
Row := GetRow(I);
|
|
GetRowWidths(DC, Row, I, CW, VW);
|
|
Inc(CW, GetRowTextIndent(Row, True));
|
|
if FCaptionWidth < CW then FCaptionWidth := CW;
|
|
if FValueWidth < VW then FValueWidth := VW;
|
|
end;
|
|
SelectObject(DC, PrevFont);
|
|
FBandWidth := FCaptionWidth + FValueWidth;
|
|
finally
|
|
ReleaseDC(0, DC)
|
|
end;
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.CalcRowHeights;
|
|
|
|
function CalcHeight(ADC: HDC; AFont: TFont; const S: string; AMultiline: Boolean;
|
|
ABaseWidth: Integer): Integer;
|
|
var
|
|
R: TRect;
|
|
Size: TSize;
|
|
begin
|
|
SelectObject(ADC, AFont.Handle);
|
|
if AMultiline and IsRowAutoHeight then
|
|
if S <> '' then
|
|
begin
|
|
R := Rect(0, 0, ABaseWidth - 4, 0);
|
|
if R.Right < R.Left then R.Right := R.Left;
|
|
Result := Windows.DrawText(ADC, PChar(S), Length(S), R,
|
|
DT_CALCRECT or DT_EDITCONTROL or DT_LEFT or DT_WORDBREAK) + 2;
|
|
end
|
|
else
|
|
Result := 0
|
|
else
|
|
begin
|
|
GetTextExtentPoint32(ADC, 'Wg', 2, Size);
|
|
Result := Size.cY;
|
|
end;
|
|
end;
|
|
|
|
var
|
|
DC: HDC;
|
|
PrevFont: HFONT;
|
|
I, V, RowHeight, OriginalRowHeight: Integer;
|
|
RowItem: PdxRowItem;
|
|
Row: TdxInspectorRow;
|
|
J: Integer;
|
|
ChildRow: TdxInspectorRow;
|
|
begin
|
|
FRowHeights.Clear;
|
|
DC := GetDC(0);
|
|
try
|
|
PrevFont := GetCurrentObject(DC, OBJ_FONT);
|
|
for I := 0 to FRows.Count - 1 do
|
|
begin
|
|
RowItem := PdxRowItem(FRows.List^[I]);
|
|
Row := RowItem^.Row;
|
|
RowHeight := FRowHeight;
|
|
if Row.IsCategory then
|
|
RowHeight := CalcHeight(DC, GroupFont, Row.Caption, False, FBandWidth)
|
|
else
|
|
begin
|
|
if Row is TdxInspectorComplexRow then
|
|
for J := 0 to TdxInspectorComplexRow(Row).Items.Count - 1 do
|
|
begin
|
|
ChildRow := TdxInspectorComplexRow(Row).Items[J].Row;
|
|
V := CalcHeight(DC, FixedFont, ChildRow.Caption, IsRowCaptionMultilined(Row), Integer(RowItem^.CaptionWidths.List^[2 * J]));
|
|
if RowHeight < V then RowHeight := V;
|
|
V := CalcHeight(DC, Font, GetRowValueText(ChildRow), IsRowValueMultilined(Row), Integer(RowItem^.ValueWidths.List^[2 * J]));
|
|
if RowHeight < V then
|
|
RowHeight := V;
|
|
end
|
|
else
|
|
begin
|
|
V := CalcHeight(DC, FixedFont, Row.Caption, IsRowCaptionMultilined(Row), FCaptionWidth);
|
|
if RowHeight < V then RowHeight := V;
|
|
V := CalcHeight(DC, Font, GetRowValueText(Row), IsRowValueMultilined(Row), FValueWidth);
|
|
if RowHeight < V then
|
|
RowHeight := V;
|
|
end;
|
|
end;
|
|
OriginalRowHeight := TCustomdxInspectorControlAccess(CustomInspector).GetRowHeight(Row);
|
|
if RowHeight < OriginalRowHeight then
|
|
RowHeight := OriginalRowHeight;
|
|
|
|
Inc(RowHeight, 1 + 1);
|
|
if IsRowCaptionMultilined(Row) then
|
|
Inc(RowHeight, 1 + 1);
|
|
|
|
FRowHeights.Add(Pointer(RowHeight));
|
|
end;
|
|
SelectObject(DC, PrevFont);
|
|
finally
|
|
ReleaseDC(0, DC);
|
|
end;
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.CalcStandardRowHeight;
|
|
|
|
function GetHeight(ADC: HDC; AFont: TFont): Integer;
|
|
var
|
|
TextSize: TSize;
|
|
begin
|
|
SelectObject(ADC, AFont.Handle);
|
|
GetTextExtentPoint32(ADC, 'Wg', 2, TextSize);
|
|
Result := TextSize.cy;
|
|
end;
|
|
|
|
var
|
|
DC: HDC;
|
|
PrevFont: HFONT;
|
|
begin
|
|
DC := GetDC(0);
|
|
try
|
|
PrevFont := GetCurrentObject(DC, OBJ_FONT);
|
|
FRowHeight := MaxIntValue([GetHeight(DC, Font), GetHeight(DC, GroupFont), GetHeight(DC, FixedFont)]);
|
|
SelectObject(DC, PrevFont);
|
|
finally
|
|
ReleaseDC(0, DC);
|
|
end;
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.CustomDrawFontChanged(Sender: TObject);
|
|
begin
|
|
FCustomDrawFontChanged := True;
|
|
end;
|
|
|
|
function TCustomdxInspectorReportLink.GetRow(AIndex: Integer): TdxInspectorRow;
|
|
begin
|
|
Result := PdxRowItem(FRows.List^[AIndex])^.Row;
|
|
end;
|
|
|
|
function TCustomdxInspectorReportLink.GetRowCellSides(ARow: TdxInspectorRow): TdxCellSides;
|
|
begin
|
|
if IsDrawBorder then
|
|
begin
|
|
Result := [csLeft, csRight];
|
|
if IsTopRow(ARow) then Result := Result + [csTop];
|
|
if IsBottomRow(ARow) then Result := Result + [csBottom];
|
|
end
|
|
else
|
|
Result := [];
|
|
end;
|
|
|
|
function TCustomdxInspectorReportLink.GetRowIndentCellSides(ARow: TdxInspectorRow;
|
|
ALevelIndex: Integer): TdxCellSides;
|
|
begin
|
|
if (ALevelIndex = 0) and IsNetMode then
|
|
begin
|
|
Result := [csLeft];
|
|
if not IsNetCategoryRow(ARow) or (ARow.Node.Level > 0) then
|
|
Include(Result, csRight);
|
|
// if (ARow.Node.Level = 0) and (ARow.Node.Count > 0) then
|
|
if IsNetCategoryRow(ARow) then
|
|
Include(Result, csTop);
|
|
{ver. 2.31
|
|
if ARow.Node <> nil then
|
|
begin
|
|
if (ARow.Node.Level = 0) and (ARow.Node.Count > 0) and not ARow.Node.Expanded and not AutoNodesExpand then
|
|
Include(Result, csBottom);
|
|
end;}
|
|
if IsNetUltimateLastRowInParent(ARow) then
|
|
Include(Result, csBottom);
|
|
end
|
|
else
|
|
Result := [csTop, csBottom];
|
|
|
|
if (ALevelIndex = 1) and (ARow.Node <> nil) and (ARow.Node.Level = 0) and ARow.IsCategory then
|
|
Include(Result, csLeft);
|
|
|
|
if not IsDrawBorder then
|
|
begin
|
|
if IsTopRow(ARow) then Exclude(Result, csTop);
|
|
if IsBottomRow(ARow) then Exclude(Result, csBottom);
|
|
if ALevelIndex = 0 then
|
|
begin
|
|
Exclude(Result, csLeft);
|
|
Exclude(Result, csRight);
|
|
end;
|
|
|
|
if ALevelIndex = 1 then
|
|
Exclude(Result, csRight);
|
|
|
|
if IsNetMode then
|
|
begin
|
|
if IsNetCategoryRow(ARow) then
|
|
begin
|
|
Exclude(Result, csTop);
|
|
Exclude(Result, csBottom);
|
|
end;
|
|
if IsNetUltimateLastRowInParent(ARow) then
|
|
Exclude(Result, csBottom);
|
|
if (ARow.Node <> nil) and (ARow.Node.Level = 1) and (ARow.Node.Index = 0) and
|
|
TdxInspectorRowNode(ARow.Node.Parent).Row.IsCategory then
|
|
Exclude(Result, csTop);
|
|
end;
|
|
end;
|
|
|
|
if not IsDrawHorzLines then
|
|
begin
|
|
if IsNetMode then
|
|
begin
|
|
case ALevelIndex of
|
|
0: if IsNetCategoryRow(ARow) then Exclude(Result, csTop);
|
|
1: if not ((ARow.Node <> nil) and (ARow.Node.Level = 1) and (ARow.Node.Index = 0) and
|
|
TdxInspectorRowNode(ARow.Node.Parent).Row.IsCategory) then
|
|
Exclude(Result, csTop);
|
|
else
|
|
Exclude(Result, csTop);
|
|
end;
|
|
if not IsNetUltimateLastRowInParent(ARow) then
|
|
Exclude(Result, csBottom);
|
|
end
|
|
else
|
|
begin
|
|
if not IsTopRow(ARow) then Exclude(Result, csTop);
|
|
if not IsBottomRow(ARow) then Exclude(Result, csBottom);
|
|
end;
|
|
end;
|
|
|
|
if not IsDrawVertLines and IsNetMode then
|
|
if not GetUltimateParentRow(ARow).IsCategory then
|
|
begin
|
|
if ALevelIndex = 0 then Exclude(Result, csRight);
|
|
if ALevelIndex = 1 then Exclude(Result, csLeft);
|
|
end;
|
|
end;
|
|
|
|
function TCustomdxInspectorReportLink.GetRowIndentColor(ARow: TdxInspectorRow;
|
|
ALevelIndex: Integer): TColor;
|
|
begin
|
|
if IsNetMode and (ALevelIndex = 0) and GetUltimateParentRow(ARow).IsCategory then
|
|
Result := GroupColor
|
|
else
|
|
Result := GetRowCaptionColor(ARow);
|
|
end;
|
|
|
|
function TCustomdxInspectorReportLink.GetRowIndentCount(ARow: TdxInspectorRow): Integer;
|
|
begin
|
|
Result := ARow.Node.Level;
|
|
with TCustomdxInspectorControlAccess(CustomInspector) do
|
|
if PaintStyle in [ipsStandard, ipsSimple, ipsExtended, ipsNet] then
|
|
Inc(Result);
|
|
end;
|
|
|
|
function TCustomdxInspectorReportLink.GetRowIndentTransparency(ARow: TdxInspectorRow;
|
|
ALevelIndex: Integer): Boolean;
|
|
begin
|
|
if IsNetMode and (ALevelIndex = 0) and GetUltimateParentRow(ARow).IsCategory then
|
|
Result := GroupTransparent
|
|
else
|
|
Result := GetRowCaptionTransparency(ARow);
|
|
end;
|
|
|
|
function TCustomdxInspectorReportLink.GetRowSeparatorCellSides(ARow: TdxInspectorRow): TdxCellSides;
|
|
begin
|
|
Result := [csTop, csBottom];
|
|
if not IsDrawBorder then
|
|
begin
|
|
if IsTopRow(ARow) then Exclude(Result, csTop);
|
|
if IsBottomRow(ARow) then Exclude(Result, csBottom);
|
|
end;
|
|
if not IsDrawHorzLines then
|
|
begin
|
|
if not IsTopRow(ARow) then Exclude(Result, csTop);
|
|
if not IsBottomRow(ARow) then Exclude(Result, csBottom);
|
|
end;
|
|
end;
|
|
|
|
function TCustomdxInspectorReportLink.GetRowTextIndent(ARow: TdxInspectorRow;
|
|
AIncludeImageWidth: Boolean): Integer;
|
|
begin
|
|
Result := FIndent * GetRowIndentCount(ARow);
|
|
if AIncludeImageWidth and CanDrawRowImage(ARow) then
|
|
Inc(Result, TCustomdxInspectorControlAccess(CustomInspector).Images.Width);
|
|
end;
|
|
|
|
function TCustomdxInspectorReportLink.GetRowCaptionColor(ARow: TdxInspectorRow): TColor;
|
|
begin
|
|
if ARow.IsCategory then
|
|
Result := GroupColor
|
|
else
|
|
Result := FixedColor;
|
|
end;
|
|
|
|
function TCustomdxInspectorReportLink.GetRowCaptionCellSides(ARow: TdxInspectorRow): TdxCellSides;
|
|
var
|
|
ComplexRow: TdxInspectorComplexRow;
|
|
Index: Integer;
|
|
begin
|
|
Result := csAll;
|
|
ComplexRow := ComplexRowByRow(ARow);
|
|
Index := 0;
|
|
if ComplexRow <> nil then
|
|
Index := ComplexRow.Items.IndexOfRow(ARow);
|
|
if (ComplexRow = nil) or (Index = 0) then
|
|
Exclude(Result, csLeft);
|
|
if (ComplexRow <> nil) and (GetComplexRowSeparatorText(ARow) <> '') then
|
|
begin
|
|
Exclude(Result, csLeft);
|
|
if Index < ComplexRow.Items.Count - 1 then
|
|
Exclude(Result, csRight);
|
|
end;
|
|
if ComplexRow <> nil then ARow := ComplexRow;
|
|
|
|
if not IsDrawBorder then
|
|
begin
|
|
if ARow.IsCategory then Exclude(Result, csRight);
|
|
if IsTopRow(ARow) then Exclude(Result, csTop);
|
|
if IsBottomRow(ARow) then Exclude(Result, csBottom);
|
|
if IsNetMode then
|
|
begin
|
|
if IsNetCategoryRow(ARow) then
|
|
begin
|
|
Exclude(Result, csTop);
|
|
Exclude(Result, csBottom);
|
|
end;
|
|
if IsNetUltimateLastRowInParent(ARow) then
|
|
Exclude(Result, csBottom);
|
|
end;
|
|
end;
|
|
|
|
// not IsNetCategoryRow(ARow) and not (IsNetUltimateLastRowInParent(ARow)
|
|
if not IsDrawHorzLines then
|
|
if not IsNetMode or not IsNetCategoryRow(ARow) then
|
|
begin
|
|
if not IsTopRow(ARow) then Exclude(Result, csTop);
|
|
if not IsBottomRow(ARow) and not IsNetUltimateLastRowInParent(ARow) then
|
|
Exclude(Result, csBottom);
|
|
end;
|
|
|
|
if not IsDrawVertLines then
|
|
begin
|
|
if not ARow.IsCategory then Exclude(Result, csRight);
|
|
if ComplexRow <> nil then
|
|
begin
|
|
if Index < ComplexRow.Items.Count - 1 then Exclude(Result, csRight);
|
|
if Index > 0 then Exclude(Result, csLeft);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function TCustomdxInspectorReportLink.GetRowCaptionTransparency(ARow: TdxInspectorRow): Boolean;
|
|
begin
|
|
if IsNetMode then
|
|
if IsNetCategoryRow(ARow) then
|
|
Result := GroupTransparent
|
|
else
|
|
Result := FixedTransparent
|
|
else
|
|
if ARow.IsCategory then
|
|
Result := GroupTransparent
|
|
else
|
|
Result := FixedTransparent
|
|
end;
|
|
|
|
function TCustomdxInspectorReportLink.GetRowHeight(ARowIndex: Integer): Integer;
|
|
begin
|
|
Result := Integer(FRowHeights.List^[ARowIndex]);
|
|
end;
|
|
|
|
function TCustomdxInspectorReportLink.GetRowValueCellSides(ARow: TdxInspectorRow): TdxCellSides;
|
|
var
|
|
ComplexRow: TdxInspectorComplexRow;
|
|
Index: Integer;
|
|
begin
|
|
Result := csAll;
|
|
ComplexRow := ComplexRowByRow(ARow);
|
|
Index := 0;
|
|
if ComplexRow <> nil then
|
|
Index := ComplexRow.Items.IndexOfRow(ARow);
|
|
if (ComplexRow = nil) or (Index = 0) then
|
|
Exclude(Result, csLeft);
|
|
if (ComplexRow <> nil) and (GetComplexRowSeparatorText(ARow) <> '') then
|
|
begin
|
|
Exclude(Result, csLeft);
|
|
if Index < ComplexRow.Items.Count - 1 then
|
|
Exclude(Result, csRight);
|
|
end;
|
|
|
|
if not IsDrawBorder then
|
|
begin
|
|
if ComplexRow = nil then
|
|
Exclude(Result, csRight)
|
|
else
|
|
if Index = ComplexRow.Items.Count - 1 then
|
|
Exclude(Result, csRight);
|
|
Exclude(Result, csRight);
|
|
if IsTopRow(ARow) then Exclude(Result, csTop);
|
|
if IsBottomRow(ARow) then Exclude(Result, csBottom);
|
|
if IsNetMode and IsNetUltimateLastRowInParent(ARow) then
|
|
Exclude(Result, csBottom);
|
|
end;
|
|
|
|
if not IsDrawHorzLines then
|
|
begin
|
|
if not IsTopRow(ARow) then Exclude(Result, csTop);
|
|
if not IsBottomRow(ARow) and not IsNetUltimateLastRowInParent(ARow) then
|
|
Exclude(Result, csBottom);
|
|
end;
|
|
|
|
if not IsDrawVertLines then
|
|
begin
|
|
if not ARow.IsCategory then Exclude(Result, csLeft);
|
|
if ComplexRow <> nil then
|
|
begin
|
|
if Index < ComplexRow.Items.Count - 1 then Exclude(Result, csRight);
|
|
if Index > 0 then Exclude(Result, csLeft);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function TCustomdxInspectorReportLink.GetRowValueText(ARow: TdxInspectorRow): string;
|
|
begin
|
|
if ARow is TdxInspectorMemoRow then
|
|
Result := TdxInspectorMemoRowAccess(ARow).GetMemoText
|
|
else
|
|
if (ARow is TdxInspectorTextRow) and (TdxInspectorTextRow(ARow).PasswordChar <> #0) then
|
|
Result := ReplicateChar(TdxInspectorTextRow(ARow).PasswordChar, Length(TdxInspectorRowAccess(ARow).GetDisplayText))
|
|
else
|
|
if ARow is TdxInspectorGraphicRow then
|
|
Result := GraphicAsTextText
|
|
else
|
|
Result := TdxInspectorRowAccess(ARow).GetDisplayText;
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.PlaceRow(ARow: TdxInspectorRow;
|
|
ARowIndex: Integer; ACell: TdxReportCell);
|
|
var
|
|
PrevSibl: TdxReportItem;
|
|
BandIndex, PrevBandIndex: Integer;
|
|
begin
|
|
ACell.BoundsRect := Rect(0, 0, FBandWidth, GetRowHeight(ARowIndex));
|
|
BandIndex := 0;
|
|
PrevSibl := ACell.GetPrevSibling;
|
|
if PrevSibl <> nil then
|
|
begin
|
|
if IsAutoBandCount then
|
|
begin
|
|
BandIndex :=
|
|
TCustomdxInspectorControlAccess(CustomInspector).GetBandIndexByNode(ARow.Node);
|
|
PrevBandIndex :=
|
|
TCustomdxInspectorControlAccess(CustomInspector).GetBandIndexByNode(TdxInspectorRow(PrevSibl.Data).Node);
|
|
end
|
|
else
|
|
PrevBandIndex := 0;
|
|
if BandIndex <> PrevBandIndex then
|
|
ACell.Left := TdxReportVisualItem(PrevSibl).BoundsRect.Right
|
|
else
|
|
begin
|
|
ACell.Top := TdxReportVisualItem(PrevSibl).BoundsRect.Bottom;
|
|
ACell.Left := TdxReportVisualItem(PrevSibl).Left;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function TCustomdxInspectorReportLink.IsDisplayGraphicsAsText: Boolean;
|
|
begin
|
|
Result := ipoGraphicAsText in Options;
|
|
end;
|
|
|
|
function TCustomdxInspectorReportLink.IsCheckMarksAsText: Boolean;
|
|
begin
|
|
Result := ipoCheckMarksAsText in Options;
|
|
end;
|
|
|
|
function TCustomdxInspectorReportLink.IsDrawAnyLines: Boolean;
|
|
begin
|
|
Result := Options * [ipoBorder..ipoVertLines] <> [];
|
|
end;
|
|
|
|
function TCustomdxInspectorReportLink.IsDrawBorder: Boolean;
|
|
begin
|
|
Result := ipoBorder in Options;
|
|
end;
|
|
|
|
function TCustomdxInspectorReportLink.IsDrawEndEllipsis: Boolean;
|
|
begin
|
|
Result := ioDrawEndEllipsis in TCustomdxInspectorControlAccess(CustomInspector).Options;
|
|
end;
|
|
|
|
function TCustomdxInspectorReportLink.IsDrawExpandButtons: Boolean;
|
|
begin
|
|
Result := ipoExpandButtons in Options;
|
|
end;
|
|
|
|
function TCustomdxInspectorReportLink.IsDrawHorzLines: Boolean;
|
|
begin
|
|
Result := ipoHorzLines in Options;
|
|
end;
|
|
|
|
function TCustomdxInspectorReportLink.IsDrawVertLines: Boolean;
|
|
begin
|
|
Result := ipoVertLines in Options;
|
|
end;
|
|
|
|
function TCustomdxInspectorReportLink.IsFlatCheckMarks: Boolean;
|
|
begin
|
|
Result := ipoFlatCheckMarks in Options;
|
|
end;
|
|
|
|
function TCustomdxInspectorReportLink.IsShowExpandButtons: Boolean;
|
|
begin
|
|
Result := ipoExpandButtons in Options;
|
|
end;
|
|
|
|
function TCustomdxInspectorReportLink.IsShowImages: Boolean;
|
|
begin
|
|
Result := ipoImages in Options;
|
|
end;
|
|
|
|
function TCustomdxInspectorReportLink.IsTransparentColumnGraphics: Boolean;
|
|
begin
|
|
Result := ipoTransparentRowGraphic in Options;
|
|
end;
|
|
|
|
function TCustomdxInspectorReportLink.IsAutoBandCount: Boolean;
|
|
begin
|
|
Result := (CustomInspector <> nil) and
|
|
(ioAutoBandCount in TCustomdxInspectorControlAccess(CustomInspector).Options);
|
|
end;
|
|
|
|
function TCustomdxInspectorReportLink.IsRowAutoHeight: Boolean;
|
|
begin
|
|
Result := (CustomInspector <> nil) and
|
|
(ioRowAutoHeight in TCustomdxInspectorControlAccess(CustomInspector).Options);
|
|
end;
|
|
|
|
function TCustomdxInspectorReportLink.IsRowCaptionMultilined(ARow: TdxInspectorRow): Boolean;
|
|
begin
|
|
Result := (rvRowHeight in ARow.AssignedValues) or IsRowValueMultilined(ARow);
|
|
end;
|
|
|
|
function TCustomdxInspectorReportLink.IsRowValueMultilined(ARow: TdxInspectorRow): Boolean;
|
|
begin
|
|
Result := (ARow is TdxInspectorMemoRow) or ((ARow is TdxInspectorCustomBlobRow) and (TdxInspectorCustomBlobRow(ARow).BlobPaintStyle = bpsText));
|
|
end;
|
|
|
|
function TCustomdxInspectorReportLink.IsBottomRow(ARow: TdxInspectorRow): Boolean;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to FBands.Count - 1 do
|
|
begin
|
|
Result := PdxBandItem(FBands.List^[I]).Rows.Last = ARow;
|
|
if Result then Exit;
|
|
end;
|
|
Result := False;
|
|
end;
|
|
|
|
function TCustomdxInspectorReportLink.IsTopRow(ARow: TdxInspectorRow): Boolean;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to FBands.Count - 1 do
|
|
begin
|
|
Result := PdxBandItem(FBands.List^[I]).Rows.First = ARow;
|
|
if Result then Exit;
|
|
end;
|
|
Result := False;
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.InsertRowCaption(ACell: TdxReportCell;
|
|
ARow: TdxInspectorRow; ARowIndex: Integer);
|
|
|
|
procedure PlaceRowCaptionPart(ADataItem: TdxReportVisualItem;
|
|
ARow: TdxInspectorRow; AItemIndex: Integer);
|
|
var
|
|
PrevSibl: TdxReportItem;
|
|
V: Integer;
|
|
ComplexRow: TdxInspectorComplexRow;
|
|
W: Integer;
|
|
begin
|
|
V := 0;
|
|
PrevSibl := ADataItem.GetPrevSibling;
|
|
if PrevSibl <> nil then
|
|
V := TdxReportVisualItem(PrevSibl).BoundsRect.Right;
|
|
ComplexRow := ComplexRowByRow(ARow);
|
|
if ComplexRow <> nil then
|
|
begin
|
|
if ARow = ComplexRow.Items[ComplexRow.Items.Count - 1].Row then
|
|
W := FCaptionWidth - V
|
|
else
|
|
W := Integer(PdxRowItem(GetRowItemByRow(ComplexRow)).CaptionWidths.List^[AItemIndex]);
|
|
ADataItem.BoundsRect := Rect(V, 0, V + W, ADataItem.Parent.Height);
|
|
end
|
|
else
|
|
if ARow.IsCategory then
|
|
ADataItem.BoundsRect := Rect(V, 0, ADataItem.Parent.Width, ADataItem.Parent.Height)
|
|
else
|
|
ADataItem.BoundsRect := Rect(V, 0, FCaptionWidth, ADataItem.Parent.Height);
|
|
end;
|
|
|
|
procedure InsertRowCaptionPart(ARow: TdxInspectorRow; AItemIndex: Integer;
|
|
AIsRowSeparator: Boolean);
|
|
var
|
|
DataItem: TdxReportCellString;
|
|
Separator: Boolean;
|
|
I: Integer;
|
|
ChildRow: TdxInspectorRow;
|
|
begin
|
|
if not AIsRowSeparator and (ARow is TdxInspectorComplexRow) and not ARow.IsCategory then
|
|
begin
|
|
for I := 0 to PdxRowItem(FRows.List^[ARowIndex]).CaptionWidths.Count - 1 do
|
|
begin
|
|
if (GetComplexRowSeparatorText(ARow) = '') and Odd(I) then
|
|
Continue;
|
|
Separator := IsComplexRowSeparator(TdxInspectorComplexRow(ARow), I);
|
|
ChildRow := TdxInspectorComplexRow(ARow).Items[I div 2].Row;
|
|
InsertRowCaptionPart(ChildRow, I, Separator);
|
|
end;
|
|
Exit;
|
|
end
|
|
else
|
|
begin
|
|
DataItem := TdxReportCellString.Create(ACell);
|
|
if AIsRowSeparator then
|
|
DataItem.Data := Integer(ictCaptionSeparator)
|
|
else
|
|
DataItem.Data := Integer(ictCaption);
|
|
|
|
PlaceRowCaptionPart(DataItem, ARow, AItemIndex);
|
|
AssignValues(DataItem, ARow);
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
InsertRowCaptionPart(ARow, 0, False);
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.InsertRowIndent(ACell: TdxReportCell; ARow: TdxInspectorRow);
|
|
|
|
function GetButtonSize: Integer;
|
|
begin
|
|
with TCustomdxInspectorControlAccess(CustomInspector) do
|
|
if PaintStyle in [ipsSimple , ipsNET, ipsCategorized ] then
|
|
Result := dxInspectorButtonSize
|
|
else
|
|
Result := dxInspectorButtonExSize + 1;
|
|
end;
|
|
|
|
procedure InsertRowIndentPart(ALevelIndex, AMaxLevel: Integer);
|
|
var
|
|
IndentBox: TdxReportCellExpandButton;
|
|
V: Integer;
|
|
PrevSibl: TdxReportItem;
|
|
begin
|
|
IndentBox := TdxReportCellExpandButton.Create(ACell);
|
|
with IndentBox do
|
|
begin
|
|
V := 0;
|
|
PrevSibl := GetPrevSibling;
|
|
if PrevSibl <> nil then
|
|
V := TdxReportVisualItem(PrevSibl).BoundsRect.Right;
|
|
BoundsRect := Rect(V, 0, V + FIndent, ACell.Height);
|
|
Transparent := GetRowIndentTransparency(ARow, ALevelIndex);
|
|
if not Transparent then
|
|
Color := GetRowIndentColor(ARow, ALevelIndex);
|
|
CellSides := GetRowIndentCellSides(ARow, ALevelIndex);
|
|
|
|
{ 2.3 }
|
|
ShowButton := IsShowExpandButtons and (ALevelIndex = AMaxLevel) and
|
|
(ARow.Node <> nil) and (ARow.Node.Count <> 0);
|
|
if ShowButton then
|
|
begin
|
|
ButtonExpanded := (ARow.Node <> nil) and ARow.Node.Expanded or AutoNodesExpand;
|
|
ShowButtonBorder := TCustomdxInspectorControlAccess(CustomInspector).PaintStyle <> ipsStandard;
|
|
if ShowButtonBorder then
|
|
begin
|
|
ButtonBorder3D := TCustomdxInspectorControlAccess(CustomInspector).PaintStyle = ipsExtended;
|
|
ButtonSize := GetButtonSize;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function IndentExists(ARow: TdxInspectorRow): Boolean;
|
|
begin
|
|
Result := (ComplexRowByRow(ARow) = nil) and
|
|
not ((TCustomdxInspectorControlAccess(CustomInspector).PaintStyle = ipsCategorized) and
|
|
ARow.IsCategory and (ARow.Node.Level = 0));
|
|
end;
|
|
|
|
var
|
|
I, MaxLevel: Integer;
|
|
begin
|
|
if IndentExists(ARow) then
|
|
begin
|
|
MaxLevel := GetRowIndentCount(ARow) - 1;
|
|
for I := 0 to MaxLevel do
|
|
InsertRowIndentPart(I, MaxLevel);
|
|
end;
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.InsertRowValue(ACell: TdxReportCell; ARow: TdxInspectorRow;
|
|
ARowIndex: Integer);
|
|
|
|
procedure PlaceRowValuePart(ADataItem: TdxReportVisualItem; ARow: TdxInspectorRow;
|
|
AItemIndex: Integer);
|
|
var
|
|
PrevSibl: TdxReportItem;
|
|
V: Integer;
|
|
ComplexRow: TdxInspectorComplexRow;
|
|
W: Integer;
|
|
begin
|
|
V := 0;
|
|
PrevSibl := ADataItem.GetPrevSibling;
|
|
if PrevSibl <> nil then
|
|
V := TdxReportVisualItem(PrevSibl).BoundsRect.Right;
|
|
ComplexRow := ComplexRowByRow(ARow);
|
|
if ComplexRow <> nil then
|
|
begin
|
|
if ARow = ComplexRow.Items[ComplexRow.Items.Count - 1].Row then
|
|
W := FBandWidth - V
|
|
else
|
|
W := Integer(PdxRowItem(GetRowItemByRow(ComplexRow)).ValueWidths.List^[AItemIndex]);
|
|
ADataItem.BoundsRect := Rect(V, 0, V + W, ADataItem.Parent.Height);
|
|
end
|
|
else
|
|
ADataItem.BoundsRect := Rect(V, 0, V + FValueWidth, ADataItem.Parent.Height);
|
|
end;
|
|
|
|
procedure InsertRowValuePart(ARow: TdxInspectorRow; AItemIndex: Integer;
|
|
AIsRowSeparator: Boolean);
|
|
var
|
|
DataClass: TdxReportCellDataClass;
|
|
DataItem: TAbstractdxReportCellData;
|
|
Separator: Boolean;
|
|
I: Integer;
|
|
ChildRow: TdxInspectorRow;
|
|
begin
|
|
if ARow is TdxInspectorComplexRow then
|
|
begin
|
|
for I := 0 to PdxRowItem(FRows.List^[ARowIndex]).CaptionWidths.Count - 1 do
|
|
begin
|
|
if (GetComplexRowSeparatorText(ARow) = '') and Odd(I) then
|
|
Continue;
|
|
Separator := IsComplexRowSeparator(TdxInspectorComplexRow(ARow), I);
|
|
ChildRow := TdxInspectorComplexRow(ARow).Items[I div 2].Row;
|
|
InsertRowValuePart(ChildRow, I, Separator);
|
|
end;
|
|
Exit;
|
|
end
|
|
else
|
|
begin
|
|
if AIsRowSeparator then
|
|
begin
|
|
DataItem := TdxReportCellString.Create(ACell);
|
|
DataItem.Data := Integer(ictValueSeparator)
|
|
end
|
|
else
|
|
begin
|
|
DataClass := GetDataClass(ARow);
|
|
DataItem := DataClass.Create(ACell);
|
|
DataItem.Data := Integer(ictValue);
|
|
end;
|
|
PlaceRowValuePart(DataItem, ARow, AItemIndex);
|
|
AssignValues(DataItem, ARow);
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
InsertRowValuePart(ARow, 0, False);
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.CalcComplexRowItemsWidths;
|
|
var
|
|
DC: HDC;
|
|
I, J: Integer;
|
|
RowItem: PdxRowItem;
|
|
Row: TdxInspectorRow;
|
|
S: string;
|
|
CaptionSeparatorWidth, ValueSeparatorWidth: Integer;
|
|
CaptionViewInfo, ValueViewInfo: TdxInspectorComplexRowViewInfo;
|
|
begin
|
|
DC := GetDC(0);
|
|
try
|
|
for I := 0 to FRows.Count - 1 do
|
|
begin
|
|
RowItem := PdxRowItem(FRows.List^[I]);
|
|
Row := RowItem^.Row;
|
|
if (Row is TdxInspectorComplexRow) and not Row.IsCategory then
|
|
begin
|
|
if GetComplexRowSeparatorText(Row) <> '' then
|
|
begin
|
|
S := GetComplexRowSeparatorText(Row) + '_';
|
|
CaptionSeparatorWidth := GetTextWidth(DC, FixedFont.Handle, S);
|
|
if TCustomdxInspectorControlAccess(CustomInspector).PaintStyle = ipsCategorized then
|
|
ValueSeparatorWidth := 4
|
|
else
|
|
ValueSeparatorWidth := GetTextWidth(DC, Font.Handle, S);
|
|
end
|
|
else
|
|
begin
|
|
ValueSeparatorWidth := 4;
|
|
CaptionSeparatorWidth := 4;
|
|
end;
|
|
CaptionViewInfo := TdxInspectorComplexRowViewInfo.Create(TdxInspectorComplexRow(Row), CaptionSeparatorWidth);
|
|
ValueViewInfo := TdxInspectorComplexRowViewInfo.Create(TdxInspectorComplexRow(Row), ValueSeparatorWidth);
|
|
try
|
|
RowItem^.CaptionWidths := TList.Create;
|
|
RowItem^.ValueWidths := TList.Create;
|
|
CaptionViewInfo.Calculate(Rect(0, 0, FCaptionWidth - GetRowTextIndent(Row, True), 0));
|
|
ValueViewInfo.Calculate(Rect(0, 0, FValueWidth, 0));
|
|
RowItem^.CaptionWidths.Count := ValueViewInfo.Count;
|
|
RowItem^.ValueWidths.Count := ValueViewInfo.Count;
|
|
for J := 0 to RowItem^.CaptionWidths.Count - 1 do
|
|
begin
|
|
with CaptionViewInfo[J].Bounds do
|
|
RowItem^.CaptionWidths[J] := Pointer(Right - Left);
|
|
with ValueViewInfo[J].Bounds do
|
|
RowItem^.ValueWidths[J] := Pointer(Right - Left);
|
|
end;
|
|
finally
|
|
ValueViewInfo.Free;
|
|
CaptionViewInfo.Free;
|
|
end;
|
|
end;
|
|
end;
|
|
finally
|
|
ReleaseDC(0, DC);
|
|
end;
|
|
end;
|
|
function TCustomdxInspectorReportLink.CanDrawRowImage(ARow: TdxInspectorRow): Boolean;
|
|
begin
|
|
Result := IsShowImages and (TCustomdxInspectorControlAccess(CustomInspector).Images <> nil) and
|
|
(ComplexRowByRow(ARow) = nil) and
|
|
(ARow.ImageIndex > -1) and (ARow.ImageIndex < TCustomdxInspectorControlAccess(CustomInspector).Images.Count);
|
|
end;
|
|
function TCustomdxInspectorReportLink.ComplexRowByRow(ARow: TdxInspectorRow): TdxInspectorComplexRow;
|
|
begin
|
|
Result := TCustomdxInspectorControl(CustomInspector).ComplexRowByRow(ARow);
|
|
end;
|
|
function TCustomdxInspectorReportLink.GetComplexRowSeparatorText(ARow: TdxInspectorRow): string;
|
|
begin
|
|
Result := TCustomdxInspectorControlAccess(CustomInspector).ComplexRowSeparator;
|
|
end;
|
|
function TCustomdxInspectorReportLink.GetRowImageCellSides(ARow: TdxInspectorRow): TdxCellSides;
|
|
begin
|
|
Result := [];
|
|
if IsDrawHorzLines then
|
|
Result := Result + [csTop, csBottom];
|
|
end;
|
|
function TCustomdxInspectorReportLink.GetRowItemByRow(ARow: TdxInspectorRow): Pointer;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to FRows.Count - 1 do
|
|
begin
|
|
Result := FRows[I];
|
|
if PdxRowItem(Result)^.Row = ARow then Exit;
|
|
end;
|
|
Result := nil;
|
|
end;
|
|
function TCustomdxInspectorReportLink.GetUltimateParentRow(ARow: TdxInspectorRow): TdxInspectorRow;
|
|
var
|
|
Node: TdxInspectorNode;
|
|
begin
|
|
Node := ARow.Node;
|
|
while Node.Level <> 0 do Node := Node.Parent;
|
|
Result := TdxInspectorRowNode(Node).Row;
|
|
end;
|
|
function TCustomdxInspectorReportLink.IsComplexRowSeparator(ARow: TdxInspectorComplexRow;
|
|
AIndex: Integer): Boolean;
|
|
begin
|
|
Result := (GetComplexRowSeparatorText(ARow) <> '') and Odd(AIndex);
|
|
end;
|
|
procedure TCustomdxInspectorReportLink.InsertRowImage(ACell: TdxReportCell; ARow: TdxInspectorRow);
|
|
var
|
|
PrevSibl: TdxReportItem;
|
|
DataItem: TdxReportCellImage;
|
|
begin
|
|
DataItem := TdxReportCellImage.Create(ACell);
|
|
with DataItem do
|
|
begin
|
|
BoundsRect :=
|
|
Bounds(1, 0, TCustomdxInspectorControlAccess(CustomInspector).Images.Width + 1, DataItem.Parent.Height);
|
|
PrevSibl := DataItem.GetPrevSibling;
|
|
if PrevSibl <> nil then
|
|
Left := TdxReportVisualItem(PrevSibl).BoundsRect.Right;
|
|
ImageList := TCustomdxInspectorControlAccess(CustomInspector).Images;
|
|
ImageIndex := ARow.ImageIndex;
|
|
CellSides := GetRowImageCellSides(ARow);
|
|
ImageTransparent := True;
|
|
Transparent := FixedTransparent;
|
|
Color := GetRowCaptionColor(ARow);
|
|
end;
|
|
end;
|
|
|
|
function TCustomdxInspectorReportLink.IsNetCategoryRow(ARow: TdxInspectorRow): Boolean;
|
|
begin
|
|
Result := IsNetMode and (ARow.Node <> nil) and (ARow.Node.Level = 0) and ARow.IsCategory;
|
|
end;
|
|
|
|
function TCustomdxInspectorReportLink.IsNetMode: Boolean;
|
|
begin
|
|
Result := TCustomdxInspectorControlAccess(CustomInspector).PaintStyle = ipsNET;
|
|
end;
|
|
|
|
function TCustomdxInspectorReportLink.IsNetUltimateLastRowInParent(ARow: TdxInspectorRow): Boolean;
|
|
var
|
|
Node: TdxInspectorRowNode;
|
|
begin
|
|
Node := ARow.Node;
|
|
if Node <> nil then
|
|
begin
|
|
while (Node.Level <> 0) and Node.IsLast do
|
|
Node := TdxInspectorRowNode(Node.Parent);
|
|
Result :=
|
|
(Node.Level = 0) and ((ARow.Node.Count = 0) or (not ARow.Node.Expanded and not AutoNodesExpand)) and
|
|
(Node.Row.IsCategory or IsBottomRow(ARow));
|
|
end
|
|
else
|
|
Result := IsBottomRow(ARow);
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.AddRows;
|
|
|
|
procedure AddRow(ANode: TdxInspectorRowNode);
|
|
var
|
|
I: Integer;
|
|
RowItem: PdxRowItem;
|
|
begin
|
|
New(RowItem);
|
|
FillChar(RowItem^, SizeOf(TdxRowItem), 0);
|
|
RowItem^.Row := ANode.Row;
|
|
FRows.Add(RowItem);
|
|
|
|
if ANode.Expanded or AutoNodesExpand then
|
|
for I := 0 to ANode.Count - 1 do
|
|
AddRow(TdxInspectorRowNode(ANode[I]));
|
|
end;
|
|
|
|
var
|
|
I: Integer;
|
|
begin
|
|
ClearRows;
|
|
if CustomInspector.TotalRowCount > 0 then
|
|
begin
|
|
if not AutoNodesExpand then
|
|
FRows.Capacity := TCustomdxInspectorControlAccess(CustomInspector).GetAbsoluteCount;
|
|
for I := 0 to CustomInspector.Count - 1 do
|
|
AddRow(TdxInspectorRowNode(CustomInspector.Items[I]));
|
|
end;
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.ClearRows;
|
|
var
|
|
I: Integer;
|
|
RowItem: PdxRowItem;
|
|
begin
|
|
for I := 0 to FRows.Count - 1 do
|
|
begin
|
|
RowItem := FRows.List^[I];
|
|
if RowItem^.CaptionWidths <> nil then RowItem^.CaptionWidths.Free;
|
|
if RowItem^.ValueWidths <> nil then RowItem^.ValueWidths.Free;
|
|
Dispose(PdxRowItem(RowItem));
|
|
end;
|
|
FRows.Clear;
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.DistributeRowsByBands;
|
|
var
|
|
I, BandIndex: Integer;
|
|
BandItem: PdxBandItem;
|
|
begin
|
|
ClearBands;
|
|
if TCustomdxInspectorControlAccess(CustomInspector).IsAutoBandCount then
|
|
begin
|
|
CustomInspector.HandleNeeded;
|
|
for I := 0 to FRows.Count - 1 do
|
|
begin
|
|
BandIndex := TCustomdxInspectorControlAccess(CustomInspector).GetBandIndexByNode(GetRow(I).Node);
|
|
if BandIndex > FBands.Count - 1 then
|
|
FBands.Count := 1 + BandIndex;
|
|
if FBands.List^[BandIndex] = nil then
|
|
begin
|
|
New(BandItem);
|
|
FillChar(BandItem^, SizeOf(TdxBandItem), 0);
|
|
BandItem^.Rows := TList.Create;
|
|
FBands[BandIndex] := BandItem;
|
|
end;
|
|
PdxBandItem(FBands.List^[BandIndex])^.Rows.Add(GetRow(I));
|
|
end;
|
|
Exit;
|
|
end
|
|
else
|
|
begin
|
|
New(BandItem);
|
|
FillChar(BandItem^, SizeOf(TdxBandItem), 0);
|
|
BandItem^.Rows := TList.Create;
|
|
FBands.Add(BandItem);
|
|
for I := 0 to FRows.Count - 1 do
|
|
BandItem^.Rows.Add(GetRow(I));
|
|
end;
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.FreeAndNilRows;
|
|
begin
|
|
ClearRows;
|
|
FreeAndNil(FRows);
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.ClearBands;
|
|
var
|
|
I: Integer;
|
|
BandItem: PdxBandItem;
|
|
begin
|
|
for I := 0 to FBands.Count - 1 do
|
|
begin
|
|
BandItem := FBands.List^[I];
|
|
BandItem^.Rows.Free;
|
|
Dispose(PdxBandItem(BandItem));
|
|
end;
|
|
FBands.Clear;
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.FreeAndNilBands;
|
|
begin
|
|
ClearBands;
|
|
FreeAndNil(FBands);
|
|
end;
|
|
|
|
procedure TCustomdxInspectorReportLink.ReadIsGraphicAsTextValueAssigned(AReader: TReader);
|
|
begin
|
|
FIsGraphicAsTextAssigned := AReader.ReadBoolean;
|
|
end;
|
|
procedure TCustomdxInspectorReportLink.WriteIsGraphicAsTextValueAssigned(AWriter: TWriter);
|
|
begin
|
|
AWriter.WriteBoolean(FIsGraphicAsTextAssigned);
|
|
end;
|
|
|
|
{ TdxInspectorReportLink }
|
|
|
|
function TdxInspectorReportLink.GetInspector: TdxInspector;
|
|
begin
|
|
Result := TdxInspector(Component);
|
|
end;
|
|
|
|
{ TdxInspectorDesignWindow }
|
|
|
|
constructor TdxInspectorDesignWindow.Create(AOwner: TComponent);
|
|
begin
|
|
HelpContext := dxhcInspectorGridReportLinkDesigner;
|
|
inherited;
|
|
CreateControls;
|
|
PageControl1.ActivePage := PageControl1.Pages[0];
|
|
end;
|
|
|
|
function TdxInspectorDesignWindow.GetReportLink: TCustomdxInspectorReportLink;
|
|
begin
|
|
Result := inherited ReportLink as TCustomdxInspectorReportLink;
|
|
end;
|
|
|
|
procedure TdxInspectorDesignWindow.LoadDataToInspector;
|
|
|
|
function BitmapToText(AImageIndex: Integer): string;
|
|
var
|
|
Picture: TPicture;
|
|
begin
|
|
Picture := TPicture.Create;
|
|
try
|
|
Picture.Bitmap.Width := ilCarPhotos.Width;
|
|
Picture.Bitmap.Height := ilCarPhotos.Height;
|
|
ilCarPhotos.Draw(Picture.Bitmap.Canvas, 0, 0, AImageIndex);
|
|
dxExEdtr.SavePicture(Picture, Result);
|
|
finally
|
|
Picture.Free;
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
irMBPhoto.Text := BitmapToText(0);
|
|
irBMWPhoto.Text := BitmapToText(1);
|
|
end;
|
|
|
|
procedure TdxInspectorDesignWindow.CMDialogChar(var message: TCMDialogChar);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
inherited;
|
|
with PageControl1 do
|
|
for I := 0 to PageCount - 1 do
|
|
if IsAccel(message.CharCode, Pages[I].Caption) then
|
|
begin
|
|
message.Result := 1;
|
|
ActivePage := Pages[I];
|
|
Exit;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxInspectorDesignWindow.CreateControls;
|
|
|
|
function CreateColorCombo(AParent: TWinControl; AHost: TControl;
|
|
ATag: Integer; AAutoColor: TColor; ALabel: TLabel): TdxPSColorCombo;
|
|
begin
|
|
Result := TdxPSColorCombo.Create(Self);
|
|
with TdxPSColorCombo(Result) do
|
|
begin
|
|
BoundsRect := AHost.BoundsRect;
|
|
Tag := ATag;
|
|
Parent := AParent;
|
|
ColorTypes := [ctPure];
|
|
ShowColorName := True;
|
|
ShowAutoColor := True;
|
|
AutoColor := AAutoColor;
|
|
OnChange := ccbxColorChange;
|
|
end;
|
|
ALabel.FocusControl := Result;
|
|
AHost.Visible := False;
|
|
end;
|
|
|
|
begin
|
|
FccbxColor :=
|
|
CreateColorCombo(gbxTransparent, bvlColorHolder, 0, dxDefaultColor, lblColor);
|
|
FccbxCaptionColor :=
|
|
CreateColorCombo(gbxCaptionTransparent, bvlFixedColorHolder, 1, dxDefaultFixedColor, lblCaptionColor);
|
|
FccbxGroupColor :=
|
|
CreateColorCombo(gbxGroupTransparent, bvlGroupColorHolder, 2, dxDefaultFixedColor, lblGroupColor);
|
|
FccbxGridLineColor :=
|
|
CreateColorCombo(tshColors, bvlGridLineColorHolder, 3, dxDefaultGridLineColor, lblGridLinesColor);
|
|
end;
|
|
|
|
procedure TdxInspectorDesignWindow.DoInitialize;
|
|
begin
|
|
inherited DoInitialize;
|
|
LoadDataToInspector;
|
|
TCustomdxInspectorControlAccess(insPreview).SetFocusedNode(nil);
|
|
|
|
chbxShowBorders.Checked := ReportLink.IsDrawBorder;
|
|
chbxShowHorzLines.Checked := ReportLink.IsDrawHorzLines;
|
|
chbxShowVertLines.Checked := ReportLink.IsDrawVertLines;
|
|
chbxShowExpandButtons.Checked := ReportLink.IsShowExpandButtons;
|
|
chbxFlatCheckMarks.Checked := ReportLink.IsFlatCheckMarks;
|
|
chbxShowImages.Checked := ReportLink.IsShowImages;
|
|
chbxCheckMarksAsText.Checked := ReportLink.IsCheckMarksAsText;
|
|
chbxDisplayGraphicsAsText.Checked := ReportLink.IsDisplayGraphicsAsText;
|
|
chbxTransparentColumnGraphics.Checked := ReportLink.IsTransparentColumnGraphics;
|
|
chbxAutoWidth.Checked := ReportLink.AutoWidth;
|
|
|
|
chbxTransparent.Checked := ReportLink.Transparent;
|
|
TdxPSColorCombo(FccbxColor).ColorValue := ColorToRGB(ReportLink.Color);
|
|
chbxCaptionTransparent.Checked := ReportLink.FixedTransparent;
|
|
chbxGroupTransparent.Checked := ReportLink.GroupTransparent;
|
|
|
|
TdxPSColorCombo(FccbxCaptionColor).ColorValue := ReportLink.FixedColor;
|
|
TdxPSColorCombo(FccbxGroupColor).ColorValue := ReportLink.GroupColor;
|
|
TdxPSColorCombo(FccbxGridLineColor).ColorValue := ReportLink.GridLineColor;
|
|
|
|
FontInfoToText(ReportLink.Font, edFont);
|
|
FontInfoToText(ReportLink.FixedFont, edFixedFont);
|
|
FontInfoToText(ReportLink.GroupFont, edGroupFont);
|
|
|
|
chbxAutoNodesExpand.Checked := ReportLink.AutoNodesExpand;
|
|
end;
|
|
|
|
procedure TdxInspectorDesignWindow.UpdateControlsState;
|
|
begin
|
|
inherited UpdateControlsState;
|
|
FccbxColor.Enabled := not chbxTransparent.Checked;
|
|
lblColor.Enabled := FccbxColor.Enabled;
|
|
FccbxCaptionColor.Enabled := not chbxCaptionTransparent.Checked;
|
|
lblCaptionColor.Enabled := FccbxCaptionColor.Enabled;
|
|
FccbxGroupColor.Enabled := not chbxGroupTransparent.Checked;
|
|
lblGroupColor.Enabled := FccbxGroupColor.Enabled;
|
|
|
|
UpdatePreview;
|
|
end;
|
|
|
|
{$IFDEF DELPHI7}
|
|
function TdxInspectorDesignWindow.GetPreviewHost: TCustomPanel;
|
|
begin
|
|
Result := pnlPreview;
|
|
end;
|
|
{$ENDIF}
|
|
|
|
procedure TdxInspectorDesignWindow.LoadStrings;
|
|
|
|
procedure AdjustBevelSize(ABevel: TBevel; ALabel: TLabel);
|
|
var
|
|
Right: Integer;
|
|
begin
|
|
Right := ABevel.BoundsRect.Right;
|
|
ABevel.Left := ALabel.Left + ALabel.Width + 10;
|
|
ABevel.Width := Right - ABevel.Left;
|
|
end;
|
|
|
|
begin
|
|
inherited;
|
|
lblPreview.Caption := DropAmpersand(cxGetResourceString(@sdxPreview));
|
|
|
|
irMBModel.Caption := cxGetResourceString(@sdxCarModelColumnCaption);
|
|
irMBSUV.Caption := cxGetResourceString(@sdxCarIsSUVColumnCaption);
|
|
irMBPhoto.Caption := cxGetResourceString(@sdxCarPhotoColumnCaption);
|
|
|
|
irBMWModel.Caption := cxGetResourceString(@sdxCarModelColumnCaption);
|
|
irBMWSUV.Caption := cxGetResourceString(@sdxCarIsSUVColumnCaption);
|
|
irBMWPhoto.Caption := cxGetResourceString(@sdxCarPhotoColumnCaption);
|
|
|
|
tshOptions.Caption := cxGetResourceString(@sdxOptions);
|
|
lblShow.Caption := cxGetResourceString(@sdxShow);
|
|
AdjustBevelSize(bvlShow, lblShow);
|
|
chbxShowBorders.Caption := cxGetResourceString(@sdxBorderLines);
|
|
chbxShowHorzLines.Caption := cxGetResourceString(@sdxHorzLines);
|
|
chbxShowVertLines.Caption := cxGetResourceString(@sdxVertLines);
|
|
chbxShowExpandButtons.Caption := cxGetResourceString(@sdxExpandButtons);
|
|
chbxShowImages.Caption := cxGetResourceString(@sdxImages);
|
|
|
|
lblBehaviors.Caption := cxGetResourceString(@sdxBehaviors);
|
|
AdjustBevelSize(bvlBehaviors, lblBehaviors);
|
|
chbxAutoNodesExpand.Caption := cxGetResourceString(@sdxAutoNodesExpand);
|
|
chbxAutoWidth.Caption := cxGetResourceString(@sdxAutoWidth);
|
|
|
|
tshColors.Caption := cxGetResourceString(@sdxColors);
|
|
stTransparent.Caption := ' ' + cxGetResourceString(@sdxTransparent) + ' ';
|
|
lblColor.Caption := cxGetResourceString(@sdxColor);
|
|
stCaptionTransparent.Caption := ' ' + cxGetResourceString(@sdxCaptionTransparent) + ' ';
|
|
lblCaptionColor.Caption := cxGetResourceString(@sdxCaptionColor);
|
|
stGroupTransparent.Caption := ' ' + cxGetResourceString(@sdxGroupTransparent) + ' ';
|
|
lblGroupColor.Caption := cxGetResourceString(@sdxGroupColor);
|
|
lblGridLinesColor.Caption := cxGetResourceString(@sdxGridLinesColor);
|
|
|
|
tshFonts.Caption := cxGetResourceString(@sdxFonts);
|
|
btnFont.Caption := cxGetResourceString(@sdxBtnFont);
|
|
btnFixedFont.Caption := cxGetResourceString(@sdxBtnFixedFont);
|
|
btnGroupFont.Caption := cxGetResourceString(@sdxBtnGroupFont);
|
|
|
|
tshFormatting.Caption := cxGetResourceString(@sdxFormatting);
|
|
lblRefinements.Caption := cxGetResourceString(@sdxRefinements);
|
|
AdjustBevelSize(bvlAppearance, lblRefinements);
|
|
chbxFlatCheckMarks.Caption := cxGetResourceString(@sdxFlatCheckMarks);
|
|
chbxCheckMarksAsText.Caption := cxGetResourceString(@sdxCheckMarksAsText);
|
|
chbxDisplayGraphicsAsText.Caption := cxGetResourceString(@sdxDisplayGraphicsAsText);
|
|
chbxTransparentColumnGraphics.Caption := cxGetResourceString(@sdxTransparentColumnGraphics);
|
|
end;
|
|
|
|
procedure TdxInspectorDesignWindow.ccbxColorChange(Sender: TObject);
|
|
var
|
|
AColor: TColor;
|
|
begin
|
|
if LockControlsUpdate then Exit;
|
|
AColor := TdxPSColorCombo(Sender).ColorValue;
|
|
case TdxPSColorCombo(Sender).Tag of
|
|
0: ReportLink.Color := AColor;
|
|
1: ReportLink.FixedColor := AColor;
|
|
2: ReportLink.GroupColor := AColor;
|
|
3: ReportLink.GridLineColor := AColor;
|
|
end;
|
|
Modified := True;
|
|
end;
|
|
|
|
procedure TdxInspectorDesignWindow.chbxAutoNodesExpandClick(
|
|
Sender: TObject);
|
|
begin
|
|
if LockControlsUpdate then Exit;
|
|
ReportLink.AutoNodesExpand := TCheckBox(Sender).Checked;
|
|
Modified := True;
|
|
end;
|
|
|
|
procedure TdxInspectorDesignWindow.UpdatePreview;
|
|
const
|
|
BorderStyleMap: array[Boolean] of TBorderStyle = (bsNone, bsSingle);
|
|
MBImageIndexes: array[Boolean] of Integer = (-1, 0);
|
|
BMWImageIndexes: array[Boolean] of Integer = (-1, 1);
|
|
begin
|
|
if ReportLink.CustomInspector <> nil then
|
|
insPreview.PaintStyle := TCustomdxInspectorControlAccess(ReportLink.CustomInspector).PaintStyle;
|
|
insPreview.GridColor := ReportLink.GridLineColor;
|
|
irMersedesBenz.ImageIndex := MBImageIndexes[ReportLink.IsShowImages];
|
|
irBMW.ImageIndex := BMWImageIndexes[ReportLink.IsShowImages];
|
|
irMBSUV.Border3D := not ReportLink.IsFlatCheckMarks;
|
|
irBMWSUV.Border3D := not ReportLink.IsFlatCheckMarks;
|
|
|
|
insPreview.Invalidate;
|
|
pnlPreviewHost.BorderStyle := BorderStyleMap[ReportLink.IsDrawBorder];
|
|
//shPreviewFrame.Pen.Color := ReportLink.GridLineColor;
|
|
end;
|
|
|
|
procedure TdxInspectorDesignWindow.chbxTransparentClick(Sender: TObject);
|
|
begin
|
|
if LockControlsUpdate then Exit;
|
|
case TCheckBox(Sender).Tag of
|
|
0: ReportLink.Transparent := TCheckBox(Sender).Checked;
|
|
1: ReportLink.FixedTransparent := TCheckBox(Sender).Checked;
|
|
2: ReportLink.GroupTransparent := TCheckBox(Sender).Checked;
|
|
end;
|
|
Modified := True;
|
|
end;
|
|
|
|
procedure TdxInspectorDesignWindow.stCaptionTransparentClick(Sender: TObject);
|
|
begin
|
|
if chbxCaptionTransparent.CanFocus then ActiveControl := chbxCaptionTransparent;
|
|
chbxCaptionTransparent.Checked := not chbxCaptionTransparent.Checked;
|
|
end;
|
|
|
|
procedure TdxInspectorDesignWindow.stGroupTransparentClick(Sender: TObject);
|
|
begin
|
|
if chbxGroupTransparent.CanFocus then ActiveControl := chbxGroupTransparent;
|
|
chbxGroupTransparent.Checked := not chbxGroupTransparent.Checked;
|
|
end;
|
|
|
|
procedure TdxInspectorDesignWindow.stTransparentClick(Sender: TObject);
|
|
begin
|
|
if chbxTransparent.CanFocus then ActiveControl := chbxTransparent;
|
|
chbxTransparent.Checked := not chbxTransparent.Checked;
|
|
end;
|
|
|
|
procedure TdxInspectorDesignWindow.chbxAutoWidthClick(Sender: TObject);
|
|
begin
|
|
if LockControlsUpdate then Exit;
|
|
ReportLink.AutoWidth := TCheckBox(Sender).Checked;
|
|
Modified := True;
|
|
end;
|
|
|
|
procedure TdxInspectorDesignWindow.btnFontClick(Sender: TObject);
|
|
begin
|
|
if LockControlsUpdate then Exit;
|
|
with dxPSGlbl.FontDialog do
|
|
begin
|
|
case TButton(Sender).Tag of
|
|
0: Font := ReportLink.Font;
|
|
1: Font := ReportLink.FixedFont;
|
|
2: Font := ReportLink.GroupFont;
|
|
end;
|
|
|
|
if Execute then
|
|
begin
|
|
case TButton(Sender).Tag of
|
|
0:
|
|
begin
|
|
ReportLink.Font := Font;
|
|
FontInfoToText(ReportLink.Font, edFont);
|
|
end;
|
|
1:
|
|
begin
|
|
ReportLink.FixedFont := Font;
|
|
FontInfoToText(ReportLink.FixedFont, edFixedFont);
|
|
end;
|
|
2:
|
|
begin
|
|
ReportLink.GroupFont := Font;
|
|
FontInfoToText(ReportLink.GroupFont, edGroupFont);
|
|
end;
|
|
end;
|
|
Modified := True;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxInspectorDesignWindow.chbxOptionsClick(Sender: TObject);
|
|
begin
|
|
if LockControlsUpdate then Exit;
|
|
with TCheckBox(Sender) do
|
|
if Checked then
|
|
ReportLink.Options := ReportLink.Options + [TdxInspectorPaintOption(Tag)]
|
|
else
|
|
ReportLink.Options := ReportLink.Options - [TdxInspectorPaintOption(Tag)];
|
|
Modified := True;
|
|
end;
|
|
|
|
function TdxInspectorDesignWindow.CaptionColor: TColor;
|
|
begin
|
|
if ReportLink.FixedTransparent then
|
|
Result := clWindow
|
|
else
|
|
Result := ReportLink.FixedColor;
|
|
end;
|
|
|
|
function TdxInspectorDesignWindow.GroupColor: TColor;
|
|
begin
|
|
if ReportLink.GroupTransparent then
|
|
Result := clWindow
|
|
else
|
|
Result := ReportLink.GroupColor;
|
|
end;
|
|
|
|
function TdxInspectorDesignWindow.ValueColor: TColor;
|
|
begin
|
|
if ReportLink.Transparent then
|
|
Result := clWindow
|
|
else
|
|
Result := ReportLink.Color;
|
|
end;
|
|
|
|
{ custom draw helpers }
|
|
|
|
procedure FillRectColor(ACanvas: TCanvas; const R: TRect; AColor: TColor);
|
|
begin
|
|
ACanvas.Brush.Color := AColor;
|
|
ACanvas.FillRect(R);
|
|
end;
|
|
|
|
procedure DrawTextRect(ACanvas: TCanvas; R: TRect; const AText: string;
|
|
AFont: TFont; AColor: TColor; ATextAlignY: TcxTextAlignY);
|
|
var
|
|
X, Y: Integer;
|
|
begin
|
|
FillRectColor(ACanvas, R, AColor);
|
|
InflateRect(R, -2, 0);
|
|
ACanvas.Font := AFont;
|
|
ACanvas.Brush.Style := bsClear;
|
|
X := R.Left + 2;
|
|
if ATextAlignY = taTop then
|
|
Y := R.Top + 2
|
|
else
|
|
Y := R.Top + (R.Bottom - R.Top - ACanvas.TextHeight(AText)) div 2;
|
|
ACanvas.TextRect(R, X, Y, AText);
|
|
end;
|
|
|
|
procedure DrawExpandButton(ACanvas: TCanvas; R: TRect; AColor: TColor;
|
|
APaintStyle: TdxInspectorPaintStyle);
|
|
const
|
|
AreDrawBorders: array[TdxInspectorPaintStyle] of Boolean =
|
|
(False, True, True, True, False);
|
|
IsDrawSign: array[TdxInspectorPaintStyle] of Boolean =
|
|
(True, True, True, True, False);
|
|
Borders3D: array[TdxInspectorPaintStyle] of Boolean =
|
|
(False, False, True, False, False);
|
|
ButtonSizes: array[TdxInspectorPaintStyle] of Integer =
|
|
(dxInspectorButtonSize, dxInspectorButtonSize, dxInspectorButtonExSize,
|
|
dxInspectorButtonSize, dxInspectorButtonSize);
|
|
var
|
|
ButtonSize: Integer;
|
|
begin
|
|
ACanvas.Brush.Color := AColor;
|
|
ACanvas.FillRect(R);
|
|
|
|
ButtonSize := ButtonSizes[APaintStyle];
|
|
with R do
|
|
R := Bounds(Left + (Right - Left - ButtonSize) div 2,
|
|
Top + (Bottom - Top - ButtonSize) div 2, ButtonSize, ButtonSize);
|
|
if AreDrawBorders[APaintStyle] then
|
|
begin
|
|
if Borders3D[APaintStyle] then
|
|
begin
|
|
DrawEdge(ACanvas.Handle, R, EDGE_RAISED, BF_RECT or BF_SOFT);
|
|
InflateRect(R, -1, -1);
|
|
Dec(R.Right);
|
|
Dec(R.Bottom);
|
|
end
|
|
else
|
|
begin
|
|
ACanvas.Brush.Color := clWindowText;
|
|
ACanvas.FrameRect(R);
|
|
InflateRect(R, -1, -1);
|
|
end;
|
|
end
|
|
else
|
|
begin
|
|
InflateRect(R, -1, -2);
|
|
OffsetRect(R, 1, 0);
|
|
end;
|
|
|
|
if IsDrawSign[APaintStyle] then
|
|
begin
|
|
with R do
|
|
R := Rect(Left + 1, Top + (Bottom - Top) div 2, Right - 1, Top + (Bottom - Top) div 2 + 1);
|
|
ACanvas.Brush.Color := clWindowText;
|
|
ACanvas.FillRect(R);
|
|
end;
|
|
end;
|
|
|
|
procedure TdxInspectorDesignWindow.irMBSUVDrawValue(
|
|
Sender: TdxInspectorRow; ACanvas: TCanvas; ARect: TRect;
|
|
var AText: String; AFont: TFont; var AColor: TColor; var ADone: Boolean);
|
|
begin
|
|
AFont := ReportLink.Font;
|
|
AColor := ValueColor;
|
|
if ReportLink.IsCheckMarksAsText then
|
|
begin
|
|
DrawTextRect(ACanvas, ARect, AText, AFont, AColor, taCenterY);
|
|
ADone := True;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxInspectorDesignWindow.InspectorDrawValue(
|
|
Sender: TdxInspectorRow; ACanvas: TCanvas; ARect: TRect;
|
|
var AText: String; AFont: TFont; var AColor: TColor; var ADone: Boolean);
|
|
begin
|
|
DrawTextRect(ACanvas, ARect, AText, ReportLink.Font, ValueColor, taCenterY);
|
|
ADone := True;
|
|
end;
|
|
|
|
procedure TdxInspectorDesignWindow.irMBPhotoDrawValue(
|
|
Sender: TdxInspectorRow; ACanvas: TCanvas; ARect: TRect;
|
|
var AText: String; AFont: TFont; var AColor: TColor; var ADone: Boolean);
|
|
begin
|
|
AFont := ReportLink.Font;
|
|
AColor := ValueColor;
|
|
if ReportLink.IsDisplayGraphicsAsText then
|
|
begin
|
|
DrawTextRect(ACanvas, ARect, ReportLink.GraphicAsTextText, AFont, AColor, taTop);
|
|
ADone := True;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxInspectorDesignWindow.InspectorDrawCaption(
|
|
Sender: TdxInspectorRow; ACanvas: TCanvas; ARect: TRect;
|
|
var AText: string; AFont: TFont; var AColor: TColor; var ADone: Boolean);
|
|
type
|
|
TdxInspectorCaptionIndentDrawInfo = record
|
|
CategoryIndentRect: TRect;
|
|
ImageRect: TRect;
|
|
IndentRect: TRect;
|
|
end;
|
|
|
|
procedure CalcDrawInfo(var ADrawInfo: TdxInspectorCaptionIndentDrawInfo);
|
|
const
|
|
IndentWidth = 14;
|
|
begin
|
|
FillChar(ADrawInfo, SizeOf(TdxInspectorCaptionIndentDrawInfo), 0);
|
|
|
|
with ADrawInfo do
|
|
begin
|
|
ImageRect := ARect;
|
|
CategoryIndentRect := ARect;
|
|
IndentRect := ARect;
|
|
|
|
ImageRect.Right := ImageRect.Left;
|
|
IndentRect.Right := IndentRect.Left;
|
|
CategoryIndentRect.Right := CategoryIndentRect.Left;
|
|
|
|
if Sender.IsCategory then
|
|
begin
|
|
if Sender.ImageIndex <> -1 then
|
|
Dec(ImageRect.Left, ilVendorLogos.Width);
|
|
CategoryIndentRect.Right := ImageRect.Left;
|
|
CategoryIndentRect.Left := 0;
|
|
end
|
|
else
|
|
begin
|
|
IndentRect.Left := IndentRect.Right - IndentWidth;
|
|
if insPreview.PaintStyle = ipsNet then
|
|
begin
|
|
CategoryIndentRect.Right := IndentRect.Left;
|
|
CategoryIndentRect.Left := 0;
|
|
end
|
|
else
|
|
IndentRect.Left := 0;
|
|
end;
|
|
if (insPreview.PaintStyle = ipsNet) and ((Sender <> irMBPhoto) and (Sender <> irBMWPhoto)) then
|
|
Inc(CategoryIndentRect.Bottom);
|
|
end;
|
|
end;
|
|
|
|
procedure DrawImage(const R: TRect);
|
|
begin
|
|
FillRectColor(ACanvas, R, GroupColor);
|
|
ilVendorLogos.Draw(ACanvas, R.Left, R.Top, Sender.ImageIndex);
|
|
end;
|
|
|
|
const
|
|
TextAligns: array[Boolean] of TcxTextAlignY = (taCenterY, taTop);
|
|
var
|
|
DrawInfo: TdxInspectorCaptionIndentDrawInfo;
|
|
begin
|
|
if Sender.IsCategory then
|
|
begin
|
|
AColor := GroupColor;
|
|
AFont := ReportLink.GroupFont;
|
|
end
|
|
else
|
|
begin
|
|
AColor := CaptionColor;
|
|
AFont := ReportLink.FixedFont;
|
|
end;
|
|
|
|
DrawTextRect(ACanvas, ARect, AText, AFont, AColor, TextAligns[Sender is TdxInspectorTextGraphicRow]);
|
|
CalcDrawInfo(DrawInfo);
|
|
with DrawInfo do
|
|
begin
|
|
if not IsRectEmpty(ImageRect) then
|
|
DrawImage(ImageRect);
|
|
if not IsRectEmpty(IndentRect) then
|
|
FillRectColor(ACanvas, IndentRect, AColor);
|
|
if not IsRectEmpty(CategoryIndentRect) then
|
|
begin
|
|
if Sender.IsCategory and ReportLink.IsDrawExpandButtons then
|
|
DrawExpandButton(ACanvas, CategoryIndentRect, GroupColor, insPreview.PaintStyle)
|
|
else
|
|
FillRectColor(ACanvas, CategoryIndentRect, GroupColor);
|
|
if not Sender.IsCategory then
|
|
begin
|
|
CategoryIndentRect.Left := CategoryIndentRect.Right - 1;
|
|
FillRectColor(ACanvas, CategoryIndentRect, ReportLink.GridLineColor);
|
|
end;
|
|
end;
|
|
end;
|
|
ADone := True;
|
|
end;
|
|
|
|
procedure TdxInspectorDesignWindow.PageControl1Change(Sender: TObject);
|
|
begin
|
|
lblPreview.Parent := TPageControl(Sender).ActivePage;
|
|
end;
|
|
|
|
procedure RegisterHelpers;
|
|
begin
|
|
TdxInspectorRowHelper.Register;
|
|
TdxInspectorImageRowHelper.Register;
|
|
end;
|
|
|
|
procedure UnregisterHelpers;
|
|
begin
|
|
TdxRowHelpersFactory.ReleaseInstance;
|
|
end;
|
|
|
|
initialization
|
|
RegisterHelpers;
|
|
|
|
dxPSRegisterReportLink(TdxInspectorReportLink, TdxInspector, TdxInspectorDesignWindow);
|
|
FPicture := TPicture.Create;
|
|
|
|
finalization
|
|
FPicture.Free;
|
|
dxPSUnregisterReportLink(TdxInspectorReportLink, TdxInspector, TdxInspectorDesignWindow);
|
|
UnregisterHelpers;
|
|
|
|
end.
|
|
|