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

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.