{*******************************************************************} { } { Developer Express Visual Component Library } { ExpressPrinting System 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 dxPSdxMVLnk; interface {$I cxVer.inc} uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, Menus, Db, cxEdit, dxMasterView, cxControls, dxMasterViewColumns, dxBase, dxPSCore, dxPSGlbl, dxPSMD, cxDrawTextUtils, cxContainer, cxCheckBox, cxLabel, cxPC, cxGraphics, cxTextEdit, cxMaskEdit, cxDropDownEdit, cxColorComboBox, cxLookAndFeelPainters, cxButtons, cxSpinEdit, cxListBox, cxGeometry, dxPSReportRenderCanvas; type TdxMasterViewPaintOption = (mvpoHeaders, mvpoFooters, mvpoPreview, mvpoGrid, mvpoPreviewGrid, mvpoGroupFooterGrid, mvpoFlatCheckMarks, mvpoTransparentColumnGraphic, mvpoGraphicAsText, mvpo3DEffects, mvpoSoft3D, mvpoCheckMarksAsText, mvpoExpandButtons); TdxMasterViewPaintOptions = set of TdxMasterViewPaintOption; TdxMasterViewLinkCellType = (mvctUnknown, mvctCell, mvctFooter, mvctHeader, mvctPreview); TdxMasterViewDrawMode = (mvdmStrict, mvdmOddEven, mvdmBorrowSource); PdxMasterViewLevel = ^TdxMasterViewLevel; PdxMasterViewColumn = ^TdxMasterViewColumn; PdxMasterViewNode = ^TdxMasterViewNode; TdxMasterViewColumnHelperClass = class of TdxMasterViewColumnHelper; TdxMasterViewColumnHelper = class(TdxCustomClassMapItem) protected class procedure GetImageLists(AColumn: TdxMasterViewColumn; AProc: TdxPSGetImageListProc); virtual; public class function ColumnClass: TdxMasterViewColumnClass; virtual; class function PairClass: TClass; override; class procedure Register; end; TdxMasterViewImageColumnHelper = class(TdxMasterViewColumnHelper) protected class procedure GetImageLists(AColumn: TdxMasterViewColumn; AProc: TdxPSGetImageListProc); override; public class function ColumnClass: TdxMasterViewColumnClass; override; end; TdxMVReportLinkCustomDrawCellEvent = procedure(Sender: TBasedxReportLink; ACanvas: TCanvas; ABoundsRect, AClientRect: TRect; ANode: TdxMasterViewNode; AColumn: TdxMasterViewColumn; var AText: string; var AColor: TColor; AFont: TFont; var ATextAlignX: TcxTextAlignX; var ATextAlignY: TcxTextAlignY; var ADone: Boolean) of object; TdxMVReportLinkCustomDrawFooterCellEvent = procedure(Sender: TBasedxReportLink; ACanvas: TCanvas; ABoundsRect, AClientRect: TRect; ANode: TdxMasterViewNode; AColumn: TdxMasterViewColumn; var AText: string; var AColor: TColor; AFont: TFont; var ATextAlignX: TcxTextAlignX; var ATextAlignY: TcxTextAlignY; var ADone: Boolean) of object; TdxMVReportLinkCustomDrawHeaderCellEvent = procedure(Sender: TBasedxReportLink; ACanvas: TCanvas; ABoundsRect, AClientRect: TRect; AColumn: TdxMasterViewColumn; var AText: string; var AColor: TColor; AFont: TFont; var ATextAlignX: TcxTextAlignX; var ATextAlignY: TcxTextAlignY; var ASorted: TdxCellSortOrder; var ADone: Boolean) of object; TdxMVReportLinkCustomDrawPreviewCellEvent = procedure(Sender: TBasedxReportLink; ACanvas: TCanvas; ABoundsRect, AClientRect: TRect; ANode: TdxMasterViewNode; var AText: string; var AColor: TColor; AFont: TFont; var ADone: Boolean) of object; TdxMasterViewReportLink = class(TBasedxReportLink) private FAutoNodesExpand: Boolean; FCaptionColor: TColor; FCaptionNodeFont: TFont; FDrawMode: TdxMasterViewDrawMode; FEvenColor: TColor; FEvenFont: TFont; FExtendedSelect: Boolean; FFixedTransparent: Boolean; FFooterColor: TColor; FFooterFont: TFont; FGridLineColor: TColor; FGroupNodeFont: TFont; FGroupNodeColor: TColor; FHeaderColor: TColor; FHeaderFont: TFont; FOddFont: TFont; FOnlySelected: Boolean; FOptions: TdxMasterViewPaintOptions; FPreviewColor: TColor; FPreviewFont: TFont; FPreviewLineCount: Integer; FSupportedCustomDraw: Boolean; FOnCustomDrawCell: TdxMVReportLinkCustomDrawCellEvent; FOnCustomDrawFooterCell: TdxMVReportLinkCustomDrawFooterCellEvent; FOnCustomDrawHeaderCell: TdxMVReportLinkCustomDrawHeaderCellEvent; FOnCustomDrawPreviewCell: TdxMVReportLinkCustomDrawPreviewCellEvent; FColumnPlaces: TList; FCustomDrawFontChanged: Boolean; FDelimitersCells: TList; FFontIndexes: TList; FFonts: TList; FIndent: Integer; FLevels: TList; FNodes: TList; FSaveFont: TFont; FSelectedNodes: TList; FFooterLineHeight: Integer; FGroupNodeHeight: Integer; FHeaderLineHeight: Integer; FLevelCaptionHeight: Integer; FLineHeight: Integer; FPreviewFullHeight: Integer; FPreviewLineHeight: Integer; function GetOddColor: TColor; function GetOptions: TdxMasterViewPaintOptions; procedure SetAutoNodesExpand(Value: Boolean); procedure SetCaptionColor(Value: TColor); procedure SetCaptionNodeFont(Value: TFont); procedure SetDrawMode(Value: TdxMasterViewDrawMode); procedure SetEvenColor(Value: TColor); procedure SetEvenFont(Value: TFont); procedure SetExtendedSelect(Value: Boolean); procedure SetFixedTransparent(Value: Boolean); procedure SetFooterFont(Value: TFont); procedure SetGridLineColor(Value: TColor); procedure SetFooterColor(Value: TColor); procedure SetGroupNodeFont(Value: TFont); procedure SetGroupNodeColor(Value: TColor); procedure SetHeaderColor(Value: TColor); procedure SetHeaderFont(Value: TFont); function GetMasterView: TdxMasterView; procedure SetOddColor(Value: TColor); procedure SetOddFont(Value: TFont); procedure SetOnCustomDrawCell(Value: TdxMVReportLinkCustomDrawCellEvent); procedure SetOnCustomDrawFooterCell(Value: TdxMVReportLinkCustomDrawFooterCellEvent); procedure SetOnCustomDrawHeaderCell(Value: TdxMVReportLinkCustomDrawHeaderCellEvent); procedure SetOnCustomDrawPreviewCell(Value: TdxMVReportLinkCustomDrawPreviewCellEvent); procedure SetOnlySelected(Value: Boolean); procedure SetOptions(Value: TdxMasterViewPaintOptions); procedure SetPreviewColor(Value: TColor); procedure SetPreviewFont(Value: TFont); procedure SetPreviewLineCount(Value: Integer); procedure SetSupportCustomDraw(Value: Boolean); procedure AddNodes; procedure BuildSelectedNodeList; procedure CalcFontIndexes(AReportCells: TdxReportCells); procedure CustomDrawFontChanged(Sender: TObject); procedure FreeColumnPlaces; procedure FreeFontIndexes; function GetCellCustomDrawInfo(AItem: TdxReportVisualItem; ANode: PdxMasterViewNode; AColumn: PdxMasterViewColumn): TdxMasterViewLinkCellType; function IsExtendedSelect: Boolean; function IsExistSelectedNodes: Boolean; function IsSelectedNode(ANode: TdxMasterViewNode): Boolean; procedure LoadColumnPlaces; procedure LoadFontIndexes(AReportCells: TdxReportCells); function NodeExpanded(ANode: TdxMasterViewNode): Boolean; procedure PrepareData(Value: Boolean); protected FCaptionNodeFontIndex: Integer; FEvenFontIndex: Integer; FGroupNodeFontIndex: Integer; FFooterFontIndex: Integer; FHeaderFontIndex: Integer; FOddFontIndex: Integer; FPreviewFontIndex: Integer; procedure ConstructReport(AReportCells: TdxReportCells); override; function GetEmptyPagesCanExist: Boolean; override; procedure GetImageLists(AProc: TdxPSGetImageListProc); override; procedure InternalRestoreDefaults; override; procedure InternalRestoreFromOriginal; override; procedure MakeDelimiters(AReportCells: TdxReportCells; AHorzDelimiters, AVertDelimiters: TList); override; procedure PrepareConstruct(AReportCells: TdxReportCells); virtual; procedure UnprepareConstruct(AReportCells: TdxReportCells); virtual; procedure AssignValues(ADataItem: TAbstractdxReportCellData; ANode: TdxMasterViewNode; AColumn: TdxMasterViewColumn; ACellType: TdxMasterViewLinkCellType); virtual; function GetDataClass(ANode: TdxMasterViewNode; AColumn: TdxMasterViewColumn; ACellType: TdxMasterViewLinkCellType): TdxReportCellDataClass; virtual; { custom draw support } procedure CustomDraw(AItem: TAbstractdxReportCellData; ACanvas: TCanvas; ABoundsRect, AClientRect: TRect; var ADone: Boolean); override; procedure DoCustomDrawCell(ACanvas: TCanvas; ABoundsRect, AClientRect: TRect; ANode: TdxMasterViewNode; AColumn: TdxMasterViewColumn; var AText: string; var AColor: TColor; AFont: TFont; var ATextAlignX: TcxTextAlignX; var ATextAlignY: TcxTextAlignY; var ADone: Boolean); virtual; procedure DoCustomDrawFooterCell(ACanvas: TCanvas; ABoundsRect, AClientRect: TRect; ANode: TdxMasterViewNode; AColumn: TdxMasterViewColumn; var AText: string; var AColor: TColor; AFont: TFont; var ATextAlignX: TcxTextAlignX; var ATextAlignY: TcxTextAlignY; var ADone: Boolean); virtual; procedure DoCustomDrawHeaderCell(ACanvas: TCanvas; ABoundsRect, AClientRect: TRect; AColumn: TdxMasterViewColumn; var AText: string; var AColor: TColor; AFont: TFont; var ATextAlignX: TcxTextAlignX; var ATextAlignY: TcxTextAlignY; var ASorted: TdxCellSortOrder; var ADone: Boolean); virtual; procedure DoCustomDrawPreviewCell(ACanvas: TCanvas; ABoundsRect, AClientRect: TRect; ANode: TdxMasterViewNode; var AText: string; var AColor: TColor; AFont: TFont; var ADone: Boolean); virtual; function IsSupportedCustomDraw(Item: TAbstractdxReportCellData): Boolean; override; { options access } function AutoCalcPreviewLines: Boolean; function FlatCheckMarks: Boolean; function GraphicsAsText: Boolean; function OddEvenMode: Boolean; function ShowExpandButtons: Boolean; function ShowFooters(ANode: TdxMasterViewNode): Boolean; function ShowGrid(ANode: TdxMasterViewNode): Boolean; function ShowHeaders(ANode: TdxMasterViewNode): Boolean; function ShowPreview(ANode: TdxMasterViewNode): Boolean; function ShowPreviewGrid(ANode: TdxMasterViewNode): Boolean; function ShowGroupFooterGrid: Boolean; function TransparentColumnGraphics: Boolean; function Use3DEffects: Boolean; function UseSoft3D: Boolean; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure Assign(Source: TPersistent); override; property MasterView: TdxMasterView read GetMasterView; published property AutoNodesExpand: Boolean read FAutoNodesExpand write SetAutoNodesExpand default False; property CaptionColor: TColor read FCaptionColor write SetCaptionColor default clBtnFace; property CaptionNodeFont: TFont read FCaptionNodeFont write SetCaptionNodeFont stored IsFontStored; property Color; property DrawMode: TdxMasterViewDrawMode read FDrawMode write SetDrawMode default mvdmStrict; property EvenColor: TColor read FEvenColor write SetEvenColor default clWhite; property EvenFont: TFont read FEvenFont write SetEvenFont stored IsFontStored; property ExtendedSelect: Boolean read FExtendedSelect write SetExtendedSelect default True; property FixedTransparent: Boolean read FFixedTransparent write SetFixedTransparent default False; property Font; property FooterColor: TColor read FFooterColor write SetFooterColor default clBtnFace; property FooterFont: TFont read FFooterFont write SetFooterFont stored IsFontStored; property GridLineColor: TColor read FGridLineColor write SetGridLineColor default clBlack; property GroupNodeFont: TFont read FGroupNodeFont write SetGroupNodeFont stored IsFontStored; property GroupNodeColor: TColor read FGroupNodeColor write SetGroupNodeColor default clBtnFace; property HeaderColor: TColor read FHeaderColor write SetHeaderColor default clBtnFace; property HeaderFont: TFont read FHeaderFont write SetHeaderFont stored IsFontStored; property OddColor: TColor read GetOddColor write SetOddColor default clWhite; property OddFont: TFont read FOddFont write SetOddFont stored IsFontStored; property OnlySelected: Boolean read FOnlySelected write SetOnlySelected default False; property Options: TdxMasterViewPaintOptions read GetOptions write SetOptions default [mvpoHeaders, mvpoFooters, mvpoPreview, mvpoGrid, mvpoPreviewGrid, mvpoGroupFooterGrid, mvpoFlatCheckMarks, mvpo3DEffects, mvpoSoft3D, mvpoExpandButtons]; property PreviewColor: TColor read FPreviewColor write SetPreviewColor default clWhite; property PreviewFont: TFont read FPreviewFont write SetPreviewFont stored IsFontStored; property PreviewLineCount: Integer read FPreviewLineCount write SetPreviewLineCount default -1; property ScaleFonts; property ShowEmptyPages; property SupportedCustomDraw: Boolean read FSupportedCustomDraw write SetSupportCustomDraw default False; property Transparent; property UseHorzDelimiters; property UseVertDelimiters; property OnCustomDrawCell: TdxMVReportLinkCustomDrawCellEvent read FOnCustomDrawCell write SetOnCustomDrawCell; property OnCustomDrawFooterCell: TdxMVReportLinkCustomDrawFooterCellEvent read FOnCustomDrawFooterCell write SetOnCustomDrawFooterCell; property OnCustomDrawHeaderCell: TdxMVReportLinkCustomDrawHeaderCellEvent read FOnCustomDrawHeaderCell write SetOnCustomDrawHeaderCell; property OnCustomDrawPreviewCell: TdxMVReportLinkCustomDrawPreviewCellEvent read FOnCustomDrawPreviewCell write SetOnCustomDrawPreviewCell; end; TdxMVReportLinkDesignWindow = class(TStandarddxReportLinkDesignWindow) PageControl1: TcxPageControl; tshOptions: TcxTabSheet; imgShow: TImage; tshColors: TcxTabSheet; tshFonts: TcxTabSheet; tshBehaviors: TcxTabSheet; imgSelection: TImage; imgNodeExpanding: TImage; imgGraphics: TImage; img3DEffects: TImage; pnlPreview: TPanel; pmChangeFont: TPopupMenu; miChangeFont: TMenuItem; dxMVPreview: TdxMasterView; mvsCaptionStyle: TdxMasterViewStyle; mvsContentStyle: TdxMasterViewStyle; mvsFooterStyle: TdxMasterViewStyle; mvsGroupStyle: TdxMasterViewStyle; mvsHeaderStyle: TdxMasterViewStyle; mvsPreviewStyle: TdxMasterViewStyle; mvsAnotherContentStyle: TdxMasterViewStyle; tshPreview: TcxTabSheet; imgPreview: TImage; chbxShowGrid: TcxCheckBox; chbxShowGroupFooterGrid: TcxCheckBox; chbxShowHeaders: TcxCheckBox; chbxShowFooters: TcxCheckBox; chbxShowPreviewGrid: TcxCheckBox; chbxShowExpandButtons: TcxCheckBox; chbxTransparentColumnGraphic: TcxCheckBox; chbxDisplayGraphicsAsText: TcxCheckBox; chbxOnlySelected: TcxCheckBox; chbxExtendedSelect: TcxCheckBox; chbxAutoNodesExpand: TcxCheckBox; chbxUse3DEffects: TcxCheckBox; chbxUseSoft3D: TcxCheckBox; chbxCheckMarksAsText: TcxCheckBox; chbxFlatCheckMarks: TcxCheckBox; chbxShowPreview: TcxCheckBox; chbxAutoCalcPreviewLines: TcxCheckBox; lblShow: TcxLabel; lblGridLineColor: TcxLabel; lblDrawMode: TcxLabel; lblSelection: TcxLabel; lblExpanding: TcxLabel; lblRefinements: TcxLabel; lblLookAndFeel: TcxLabel; lblPreviewLineCount: TcxLabel; lblPreview: TcxLabel; lblPreviewWindow: TcxLabel; btnChangeFont: TcxButton; sePreviewLineCount: TcxSpinEdit; lbxFonts: TcxListBox; Bevel16: TcxLabel; chbxTransparent: TcxCheckBox; stTransparent: TcxLabel; cbxDrawMode: TcxComboBox; lblColor: TcxLabel; lblEvenColor: TcxLabel; lblPreviewColor: TcxLabel; ccbxPreviewColor: TcxColorComboBox; ccbxEvenColor: TcxColorComboBox; ccbxColor: TcxColorComboBox; stFixedTransparent: TcxLabel; chbxFixedTransparent: TcxCheckBox; lblLevelCaptionColor: TcxLabel; lblHeaderColor: TcxLabel; lblFooterColor: TcxLabel; lblGroupNodeColor: TcxLabel; ccbxCaptionColor: TcxColorComboBox; ccbxHeaderColor: TcxColorComboBox; ccbxFooterColor: TcxColorComboBox; ccbxGroupNodeColor: TcxColorComboBox; ccbxGridLineColor: TcxColorComboBox; cxLabel1: TcxLabel; procedure ShowClick(Sender: TObject); procedure chbxAutoNodesExpandClick(Sender: TObject); procedure chbxOnlySelectedClick(Sender: TObject); procedure chbxExtendedSelectClick(Sender: TObject); procedure chbxAutoCalcPreviewLinesClick(Sender: TObject); procedure chbxTransparentClick(Sender: TObject); procedure btnChangeFontClick(Sender: TObject); procedure lbxFontsMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure lbxFontsKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure lbxFontsClick(Sender: TObject); procedure cbxDrawModeClick(Sender: TObject); procedure pmChangeFontPopup(Sender: TObject); procedure lbxFontsDblClick(Sender: TObject); procedure PageControl1Change(Sender: TObject); procedure stTransparentClick(Sender: TObject); procedure stFixedTransparentClick(Sender: TObject); procedure lbxFontsDrawItem(AControl: TcxListBox; ACanvas: TcxCanvas; AIndex: Integer; ARect: TRect; AState: TOwnerDrawState); procedure ccbxColorChange(Sender: TObject); procedure cbxDrawModePropertiesDrawItem(AControl: TcxCustomComboBox; ACanvas: TcxCanvas; AIndex: Integer; const ARect: TRect; AState: TOwnerDrawState); procedure PreviewLineCountChange(Sender: TObject); private FdsDetail: TDataSource; FdsMaster: TDataSource; FmdDetail: TdxEasyMemData; FmdMaster: TdxEasyMemData; FMVColumnAddress: TdxMasterViewColumn; FMVColumnCash: TdxMasterViewCheckColumn; FMVColumnCount: TdxMasterViewColumn; FMVColumnName: TdxMasterViewColumn; FMVColumnPrice: TdxMasterViewColumn; FMVDetailLevel: TdxMasterViewLevel; FMVMasterLevel: TdxMasterViewLevel; FPreviewBox: TCustomControl; FLastIndex: Integer; procedure CreateControls; procedure CreateDataSets; procedure DoChangeFont(Index: Integer); procedure dxMVPreviewGetContentStyle(Sender: TdxMasterViewLevel; Node: TdxMasterViewNode; Column: TdxMasterViewColumn; var NewStyle: TdxMasterViewStyle); function GetFontByIndex(AIndex: Integer): TFont; function GetFontInfoText(AIndex: Integer): string; function GetReportLink: TdxMasterViewReportLink; function GetMaxWidth: Integer; procedure InitializeMasterView; function IsChangeFontEnabled: Boolean; function IsDisableIndex(AIndex: Integer): Boolean; procedure LoadMemData; procedure pbxPreviewPaint(Sender: TObject); procedure CMDialogChar(var Msg: TCMDialogChar); message CM_DIALOGCHAR; protected procedure DoInitialize; override; {$IFDEF DELPHI7} function GetPreviewHost: TCustomPanel; override; {$ENDIF} procedure LoadStrings; override; procedure PaintPreview(ACanvas: TCanvas; R: TRect); override; procedure UpdateControlsState; override; procedure UpdatePreview; override; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; property ReportLink: TdxMasterViewReportLink read GetReportLink; end; const dxDefaultMasterViewPaintOptions: TdxMasterViewPaintOptions = [mvpoHeaders, mvpoFooters, mvpoPreview, mvpoGrid, mvpoPreviewGrid, mvpoGroupFooterGrid, mvpoFlatCheckMarks, mvpo3DEffects, mvpoSoft3D, mvpoExpandButtons]; implementation {$R *.DFM} uses cxClasses, dxExtCtrls, dxPSRes, dxPSPopupMan, dxPrnDev, dxPSUtl, dxPSForm; type PColumnPlace = ^TColumnPlace; TColumnPlace = record Column: TdxMasterViewColumn; RowIndex, ColIndex, RowCount: Integer; end; TdxMasterViewColumnAccess = class(TdxMasterViewColumn); TdxMasterViewLevelAccess = class(TdxMasterViewLevel); TdxMasterViewNodeAccess = class(TdxMasterViewNode); TdxMasterViewCheckColumnAccess = class(TdxMasterViewCheckColumn); TdxMasterViewImageColumnAccess = class(TdxMasterViewImageColumn); TdxMasterViewGraphicColumnAccess = class(TdxMasterViewGraphicColumn); function ExposeLevel(ALevel: TdxMasterViewLevel): TdxMasterViewLevelAccess; begin Result := TdxMasterViewLevelAccess(ALevel); end; function ExposeNode(ANode: TdxMasterViewNode): TdxMasterViewNodeAccess; begin Result := TdxMasterViewNodeAccess(ANode); end; function ExposeColumn(AColumn: TdxMasterViewColumn): TdxMasterViewColumnAccess; begin Result := TdxMasterViewColumnAccess(AColumn); end; { TdxColumnHelpersFactory } type TdxColumnHelpersFactory = class(TdxCustomClassMaps) private function GetHelperClass(Column: TdxMasterViewColumn): TdxMasterViewColumnHelperClass; public class function Instance: TdxColumnHelpersFactory; reintroduce; overload; property HelperClasses[Column: TdxMasterViewColumn]: TdxMasterViewColumnHelperClass read GetHelperClass; default; end; function dxColumnHelpersFactory: TdxColumnHelpersFactory; begin Result := TdxColumnHelpersFactory.Instance; end; class function TdxColumnHelpersFactory.Instance: TdxColumnHelpersFactory; begin Result := inherited Instance as TdxColumnHelpersFactory; end; function TdxColumnHelpersFactory.GetHelperClass(Column: TdxMasterViewColumn): TdxMasterViewColumnHelperClass; begin Result := TdxMasterViewColumnHelperClass(PairClasses[Column.ClassType]); end; { TdxMasterViewColumnHelper } class function TdxMasterViewColumnHelper.ColumnClass: TdxMasterViewColumnClass; begin Result := TdxMasterViewColumn; end; class function TdxMasterViewColumnHelper.PairClass: TClass; begin Result := ColumnClass; end; class procedure TdxMasterViewColumnHelper.Register; begin dxColumnHelpersFactory.Register(Self); end; class procedure TdxMasterViewColumnHelper.GetImageLists(AColumn: TdxMasterViewColumn; AProc: TdxPSGetImageListProc); begin end; { TdxMasterViewImageColumnHelper } class function TdxMasterViewImageColumnHelper.ColumnClass: TdxMasterViewColumnClass; begin Result := TdxMasterViewImageColumn; end; class procedure TdxMasterViewImageColumnHelper.GetImageLists(AColumn: TdxMasterViewColumn; AProc: TdxPSGetImageListProc); begin inherited GetImageLists(AColumn, AProc); AProc(TdxMasterViewImageColumn(AColumn).Images); end; { TdxMasterViewReportLink } constructor TdxMasterViewReportLink.Create(AOwner: TComponent); function CreateFont: TFont; begin Result := TFont.Create; Result.OnChange := FontChanged end; begin inherited Create(AOwner); FCaptionNodeFont := CreateFont; FEvenFont := CreateFont; FFooterFont := CreateFont; FGroupNodeFont := CreateFont; FHeaderFont := CreateFont; FOddFont := CreateFont; FPreviewFont := CreateFont; FNodes := TList.Create; FDelimitersCells := TList.Create; FSaveFont := TFont.Create; FSaveFont.OnChange := CustomDrawFontChanged; InternalRestoreDefaults; LinkModified(False); end; destructor TdxMasterViewReportLink.Destroy; begin FSaveFont.Free; FDelimitersCells.Free; FNodes.Free; FPreviewFont.Free; FOddFont.Free; FHeaderFont.Free; FGroupNodeFont.Free; FFooterFont.Free; FEvenFont.Free; FCaptionNodeFont.Free; inherited Destroy; end; procedure TdxMasterViewReportLink.Assign(Source: TPersistent); begin inherited Assign(Source); if Source is TdxMasterViewReportLink then begin AutoNodesExpand := TdxMasterViewReportLink(Source).AutoNodesExpand; DrawMode := TdxMasterViewReportLink(Source).DrawMode; ExtendedSelect := TdxMasterViewReportLink(Source).ExtendedSelect; FixedTransparent := TdxMasterViewReportLink(Source).FixedTransparent; OnlySelected := TdxMasterViewReportLink(Source).OnlySelected; Options := TdxMasterViewReportLink(Source).Options; PreviewLineCount := TdxMasterViewReportLink(Source).PreviewLineCount; SupportedCustomDraw := TdxMasterViewReportLink(Source).SupportedCustomDraw; EvenColor := TdxMasterViewReportLink(Source).EvenColor; GroupNodeColor := TdxMasterViewReportLink(Source).GroupNodeColor; GridLineColor := TdxMasterViewReportLink(Source).GridLineColor; HeaderColor := TdxMasterViewReportLink(Source).HeaderColor; PreviewColor := TdxMasterViewReportLink(Source).PreviewColor; FooterColor := TdxMasterViewReportLink(Source).FooterColor; CaptionNodeFont := TdxMasterViewReportLink(Source).CaptionNodeFont; EvenFont := TdxMasterViewReportLink(Source).EvenFont; HeaderFont := TdxMasterViewReportLink(Source).HeaderFont; OddFont := TdxMasterViewReportLink(Source).OddFont; PreviewFont := TdxMasterViewReportLink(Source).PreviewFont; FooterFont := TdxMasterViewReportLink(Source).FooterFont; GroupNodeFont := TdxMasterViewReportLink(Source).GroupNodeFont; end; end; function TdxMasterViewReportLink.GetMasterView: TdxMasterView; begin Result := TdxMasterView(Component); end; procedure TdxMasterViewReportLink.CustomDrawFontChanged(Sender: TObject); begin FCustomDrawFontChanged := True; end; function TdxMasterViewReportLink.GetCellCustomDrawInfo(AItem: TdxReportVisualItem; ANode: PdxMasterViewNode; AColumn: PdxMasterViewColumn): TdxMasterViewLinkCellType; var Parent: TdxReportCell; begin Result := mvctUnknown; try if AItem.Data <> 0 then begin if TObject(AItem.Data) is TdxMasterViewColumn then begin Parent := AItem.Parent; if Parent <> nil then begin if Parent.Data = 0 then Result := mvctHeader else if TObject(Parent.Data) is TdxMasterViewNode then begin Parent := Parent.Parent; if Parent <> nil then begin if Parent = AItem.ReportCells.Cells then Result := mvctCell else Result := mvctFooter end; end; end; end else if TObject(AItem.Data) is TdxMasterViewNode then // Caption Node Result := mvctCell end else begin Parent := AItem.Parent; if (Parent <> nil) and (Parent.Data <> 0) and (TObject(Parent.Data) is TdxMasterViewNode) then Result := mvctPreview; end; except // eat exception if any Node or Column have been deleted already end; if Result <> mvctUnknown then begin if (AColumn <> nil) and (Result <> mvctPreview) then AColumn^ := TdxMasterViewColumn(AItem.Data); if (ANode <> nil) and (Result <> mvctHeader) then ANode^ := TdxMasterViewNode(AItem.Parent.Data); end; end; procedure TdxMasterViewReportLink.CustomDraw(AItem: TAbstractdxReportCellData; ACanvas: TCanvas; ABoundsRect, AClientRect: TRect; var ADone: Boolean); var AColumn: TdxMasterViewColumn; ANode: TdxMasterViewNode; AColor: TColor; ASorted: TdxCellSortOrder; AText: string; ATextAlignX: TcxTextAlignX; ATextAlignY: TcxTextAlignY; ACellType: TdxMasterViewLinkCellType; begin if AItem.Data = 0 then Exit; ACellType := GetCellCustomDrawInfo(AItem, @ANode, @AColumn); if ACellType = mvctUnknown then Exit; with TdxReportCellString(AItem) do begin AColor := ColorToRGB(Color); if Transparent then AColor := clNone; FSaveFont.Assign(Font); FCustomDrawFontChanged := False; AText := Text; if ACellType = mvctHeader then ASorted := SortOrder; if ACellType <> mvctPreview then begin ATextAlignX := TextAlignX; ATextAlignY := TextAlignY; end; case ACellType of mvctCell: DoCustomDrawCell(ACanvas, ABoundsRect, AClientRect, ANode, AColumn, AText, AColor, FSaveFont, ATextAlignX, ATextAlignY, ADone); mvctFooter: DoCustomDrawFooterCell(ACanvas, ABoundsRect, AClientRect, ANode, AColumn, AText, AColor, FSaveFont, ATextAlignX, ATextAlignY, ADone); mvctHeader: DoCustomDrawHeaderCell(ACanvas, ABoundsRect, AClientRect, AColumn, AText, AColor, FSaveFont, ATextAlignX, ATextAlignY, ASorted, ADone); mvctPreview: DoCustomDrawPreviewCell(ACanvas, ABoundsRect, AClientRect, ANode, AText, AColor, FSaveFont, 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; if ACellType = mvctHeader then SortOrder := ASorted; if ACellType <> mvctPreview then begin TextAlignX := ATextAlignX; TextAlignY := ATextAlignY; end; end; end; end; procedure TdxMasterViewReportLink.SetSupportCustomDraw(Value: Boolean); begin if FSupportedCustomDraw <> Value then begin FSupportedCustomDraw := Value; LinkModified(True); end; end; function TdxMasterViewReportLink.IsSupportedCustomDraw(Item: TAbstractdxReportCellData): Boolean; begin Result := SupportedCustomDraw; if Result and (Item <> nil) {and (Item.Data <> 0)} then case GetCellCustomDrawInfo(Item, nil, nil) of mvctCell: Result := Assigned(FOnCustomDrawCell); mvctFooter: Result := Assigned(FOnCustomDrawFooterCell); mvctHeader: Result := Assigned(FOnCustomDrawHeaderCell); mvctPreview: Result := Assigned(FOnCustomDrawPreviewCell); else Result := False; end; end; procedure TdxMasterViewReportLink.DoCustomDrawCell(ACanvas: TCanvas; ABoundsRect, AClientRect: TRect; ANode: TdxMasterViewNode; AColumn: TdxMasterViewColumn; var AText: string; var AColor: TColor; AFont: TFont; var ATextAlignX: TcxTextAlignX; var ATextAlignY: TcxTextAlignY; var ADone: Boolean); begin if Assigned(FOnCustomDrawCell) then FOnCustomDrawCell(Self, ACanvas, ABoundsRect, AClientRect, ANode, AColumn, AText, AColor, AFont, ATextAlignX, ATextAlignY, ADone); end; procedure TdxMasterViewReportLink.DoCustomDrawFooterCell(ACanvas: TCanvas; ABoundsRect, AClientRect: TRect; ANode: TdxMasterViewNode; AColumn: TdxMasterViewColumn; var AText: string; var AColor: TColor; AFont: TFont; var ATextAlignX: TcxTextAlignX; var ATextAlignY: TcxTextAlignY; var ADone: Boolean); begin if Assigned(FOnCustomDrawFooterCell) then FOnCustomDrawFooterCell(Self, ACanvas, ABoundsRect, AClientRect, ANode, AColumn, AText, AColor, AFont, ATextAlignX, ATextAlignY, ADone); end; procedure TdxMasterViewReportLink.DoCustomDrawHeaderCell(ACanvas: TCanvas; ABoundsRect, AClientRect: TRect; AColumn: TdxMasterViewColumn; var AText: string; var AColor: TColor; AFont: TFont; var ATextAlignX: TcxTextAlignX; var ATextAlignY: TcxTextAlignY; var ASorted: TdxCellSortOrder; var ADone: Boolean); begin if Assigned(FOnCustomDrawHeaderCell) then FOnCustomDrawHeaderCell(Self, ACanvas, ABoundsRect, AClientRect, AColumn, AText, AColor, AFont, ATextAlignX, ATextAlignY, ASorted, ADone); end; procedure TdxMasterViewReportLink.DoCustomDrawPreviewCell(ACanvas: TCanvas; ABoundsRect, AClientRect: TRect; ANode: TdxMasterViewNode; var AText: string; var AColor: TColor; AFont: TFont; var ADone: Boolean); begin if Assigned(FOnCustomDrawPreviewCell) then FOnCustomDrawPreviewCell(Self, ACanvas, ABoundsRect, AClientRect, ANode, AText, AColor, AFont, ADone); end; function TdxMasterViewReportLink.AutoCalcPreviewLines: Boolean; begin Result := PreviewLineCount = -1; end; function TdxMasterViewReportLink.FlatCheckMarks: Boolean; begin Result := mvpoFlatCheckMarks in Options; end; function TdxMasterViewReportLink.GraphicsAsText: Boolean; begin Result := mvpoGraphicAsText in Options; end; function TdxMasterViewReportLink.ShowExpandButtons: Boolean; begin Result := mvpoExpandButtons in Options; end; function TdxMasterViewReportLink.ShowFooters(ANode: TdxMasterViewNode): Boolean; begin if (DrawMode = mvdmBorrowSource) and (ANode <> nil) then Result := lovFooter in ANode.Level.OptionsView else Result := mvpoFooters in Options; end; function TdxMasterViewReportLink.ShowGrid(ANode: TdxMasterViewNode): Boolean; begin if (DrawMode = mvdmBorrowSource) and (ANode <> nil) then Result := lovGrid in ANode.Level.OptionsView else Result := mvpoGrid in Options; end; function TdxMasterViewReportLink.ShowGroupFooterGrid: Boolean; begin Result := mvpoGroupFooterGrid in Options; end; function TdxMasterViewReportLink.ShowHeaders(ANode: TdxMasterViewNode): Boolean; begin if (DrawMode = mvdmBorrowSource) and (ANode <> nil) then Result := lovHeader in ANode.Level.OptionsView else Result := mvpoHeaders in Options; end; function TdxMasterViewReportLink.ShowPreviewGrid(ANode: TdxMasterViewNode): Boolean; begin if (DrawMode = mvdmBorrowSource) and (ANode <> nil) then Result := lovGridWithPreview in ANode.Level.OptionsView else Result := mvpoPreviewGrid in Options; end; function TdxMasterViewReportLink.ShowPreview(ANode: TdxMasterViewNode): Boolean; begin if (DrawMode = mvdmBorrowSource) and (ANode <> nil) then Result := lovPreview in ANode.Level.OptionsView else Result := mvpoPreview in Options; end; function TdxMasterViewReportLink.IsExtendedSelect: Boolean; begin Result := IsExistSelectedNodes and ExtendedSelect; end; function TdxMasterViewReportLink.IsExistSelectedNodes: Boolean; begin Result := OnlySelected and (MasterView.SelectedItemCount > 0); end; function TdxMasterViewReportLink.IsSelectedNode(ANode: TdxMasterViewNode): Boolean; function IsExistSelectedChild(ANode: TdxMasterViewNode): Boolean; var I, J: Integer; begin Result := False; with MasterView do for I := 0 to ANode.Count - 1 do begin for J := 0 to SelectedItemCount - 1 do begin Result := (ANode[I] = SelectedItems[J]); if Result then Exit; end; if (ANode[I].Count > 0) then begin Result := IsExistSelectedChild(ANode[I]); if Result then Exit; end; end; end; function FindInOriginal(ANode: TdxMasterViewNode): Boolean; var I: Integer; begin Result := False; with MasterView do for I := 0 to SelectedItemCount - 1 do begin Result := ANode = SelectedItems[I]; if Result then Exit; end; end; function FindInChildren(ANode: TdxMasterViewNode): Boolean; var I: Integer; begin Result := False; for I := 0 to ANode.Count - 1 do begin Result := FindInOriginal(ANode[I]); if Result then Break else if ANode[I].Count > 0 then Result := FindInChildren(ANode[I]); if Result then Break; end; end; function FindInParent(ANode: TdxMasterViewNode): Boolean; begin Result := False; ANode := ANode.ParentNode; while Assigned(ANode) do begin Result := FindInOriginal(ANode); if Result then Break; ANode := ANode.ParentNode; end; end; begin Result := FindInOriginal(ANode); if not Result and (ANode.Count > 0) then Result := FindInChildren(ANode); if not Result and not IsExtendedSelect then Result := FindInParent(ANode); end; function TdxMasterViewReportLink.TransparentColumnGraphics: Boolean; begin Result := mvpoTransparentColumnGraphic in Options; end; function TdxMasterViewReportLink.OddEvenMode: Boolean; begin Result := DrawMode = mvdmOddEven; end; function TdxMasterViewReportLink.Use3DEffects: Boolean; begin Result := mvpo3DEffects in Options; end; function TdxMasterViewReportLink.UseSoft3D: Boolean; begin Result := mvpoSoft3D in Options; end; procedure TdxMasterViewReportLink.SetExtendedSelect(Value: Boolean); begin if FExtendedSelect <> Value then begin FExtendedSelect := Value; LinkModified(True); end; end; procedure TdxMasterViewReportLink.SetOnlySelected(Value: Boolean); begin if FOnlySelected <> Value then begin FOnlySelected := Value; // if OnlySelected then FAutoNodesExpand := False; LinkModified(True); end; end; procedure TdxMasterViewReportLink.SetAutoNodesExpand(Value: Boolean); begin if FAutoNodesExpand <> Value then begin FAutoNodesExpand := Value; //if AutoNodesExpand then FOnlySelected := False; LinkModified(True); end; end; procedure TdxMasterViewReportLink.SetDrawMode(Value: TdxMasterViewDrawMode); begin if FDrawMode <> Value then begin FDrawMode := Value; LinkModified(True); end; end; function TdxMasterViewReportLink.GetOptions: TdxMasterViewPaintOptions; begin Result := FOptions; end; procedure TdxMasterViewReportLink.SetOptions(Value: TdxMasterViewPaintOptions); begin if FOptions <> Value then begin FOptions := Value; LinkModified(True); end; end; procedure TdxMasterViewReportLink.SetOddFont(Value: TFont); begin FOddFont.Assign(Value); end; procedure TdxMasterViewReportLink.SetEvenFont(Value: TFont); begin FEvenFont.Assign(Value); end; procedure TdxMasterViewReportLink.SetHeaderFont(Value: TFont); begin FHeaderFont.Assign(Value); end; procedure TdxMasterViewReportLink.SetCaptionNodeFont(Value: TFont); begin FCaptionNodeFont.Assign(Value); end; procedure TdxMasterViewReportLink.SetGroupNodeFont(Value: TFont); begin FGroupNodeFont.Assign(Value); end; procedure TdxMasterViewReportLink.SetPreviewFont(Value: TFont); begin FPreviewFont.Assign(Value); end; procedure TdxMasterViewReportLink.SetFooterFont(Value: TFont); begin FFooterFont.Assign(Value); end; procedure TdxMasterViewReportLink.SetEvenColor(Value: TColor); begin if FEvenColor <> Value then begin FEvenColor := Value; if OddEvenMode then LinkModified(True); end; end; function TdxMasterViewReportLink.GetOddColor: TColor; begin Result := Color; end; procedure TdxMasterViewReportLink.SetOddColor(Value: TColor); begin inherited Color := Value; end; procedure TdxMasterViewReportLink.SetGroupNodeColor(Value: TColor); begin if FGroupNodeColor <> Value then begin FGroupNodeColor := Value; LinkModified(True); end; end; procedure TdxMasterViewReportLink.SetCaptionColor(Value: TColor); begin if FCaptionColor <> Value then begin FCaptionColor := Value; LinkModified(True); end; end; procedure TdxMasterViewReportLink.SetGridLineColor(Value: TColor); begin if FGridLineColor <> Value then begin FGridLineColor := Value; LinkModified(True); end; end; procedure TdxMasterViewReportLink.SetHeaderColor(Value: TColor); begin if FHeaderColor <> Value then begin FHeaderColor := Value; LinkModified(True); end; end; procedure TdxMasterViewReportLink.SetPreviewColor(Value: TColor); begin if FPreviewColor <> Value then begin FPreviewColor := Value; LinkModified(True); end; end; procedure TdxMasterViewReportLink.SetFooterColor(Value: TColor); begin if FFooterColor <> Value then begin FFooterColor := Value; LinkModified(True); end; end; procedure TdxMasterViewReportLink.SetFixedTransparent(Value: Boolean); begin if FFixedTransparent <> Value then begin FFixedTransparent := Value; LinkModified(True); end; end; procedure TdxMasterViewReportLink.SetPreviewLineCount(Value: Integer); begin if FPreviewLineCount < -1 then FPreviewLineCount := -1; if FPreviewLineCount <> Value then begin FPreviewLineCount := Value; LinkModified(True); end; end; procedure TdxMasterViewReportLink.SetOnCustomDrawCell(Value: TdxMVReportLinkCustomDrawCellEvent); begin if @FOnCustomDrawCell <> @Value then begin FOnCustomDrawCell := Value; LinkModified(True); end; end; procedure TdxMasterViewReportLink.SetOnCustomDrawFooterCell(Value: TdxMVReportLinkCustomDrawFooterCellEvent); begin if @FOnCustomDrawFooterCell <> @Value then begin FOnCustomDrawFooterCell := Value; LinkModified(True); end; end; procedure TdxMasterViewReportLink.SetOnCustomDrawHeaderCell(Value: TdxMVReportLinkCustomDrawHeaderCellEvent); begin if @FOnCustomDrawHeaderCell <> @Value then begin FOnCustomDrawHeaderCell := Value; LinkModified(True); end; end; procedure TdxMasterViewReportLink.SetOnCustomDrawPreviewCell(Value: TdxMVReportLinkCustomDrawPreviewCellEvent); begin if @FOnCustomDrawPreviewCell <> @Value then begin FOnCustomDrawPreviewCell := Value; LinkModified(True); end; end; procedure TdxMasterViewReportLink.InternalRestoreFromOriginal; procedure XorOption(var AOptions: TdxMasterViewPaintOptions; AItem: TdxMasterViewPaintOption; AValue: Boolean); begin if AValue then Include(AOptions, AItem) else Exclude(AOptions, AItem); end; procedure SetColorAndFont(AStyle: TdxMasterViewStyle; AFont: TFont; var AColor: TColor); begin if AStyle <> nil then begin if svFont in AStyle.AssignedValues then AFont.Assign(AStyle.Font); if svColor in AStyle.AssignedValues then AColor := AStyle.Color; end; end; var Level: TdxMasterViewLevel; begin inherited; if (MasterView = nil) or (MasterView.Levels.Count = 0) then Exit; Level := MasterView.Levels[0]; PreviewLineCount := Level.PreviewLineCount; FGridLineColor := Level.GridLinesColor; Font := MasterView.Font; SetColorAndFont(Level.ContentStyle, Font, FColor); SetColorAndFont(Level.HeaderStyle, HeaderFont, FHeaderColor); SetColorAndFont(Level.PreviewStyle, PreviewFont, FPreviewColor); SetColorAndFont(Level.GroupStyle, GroupNodeFont, FGroupNodeColor); SetColorAndFont(Level.FooterStyle, FooterFont, FFooterColor); SetColorAndFont(Level.CaptionStyle, CaptionNodeFont, FCaptionColor); XorOption(FOptions, mvpoHeaders, lovHeader in Level.OptionsView); XorOption(FOptions, mvpoFooters, lovFooter in Level.OptionsView); XorOption(FOptions, mvpoPreview, lovPreview in Level.OptionsView); XorOption(FOptions, mvpoGrid, lovGrid in Level.OptionsView); XorOption(FOptions, mvpoPreviewGrid, lovGridWithPreview in Level.OptionsView); end; procedure TdxMasterViewReportLink.InternalRestoreDefaults; begin inherited; FAutoNodesExpand := False; DrawMode := mvdmStrict; FixedTransparent := False; FOnlySelected := False; Options := dxDefaultMasterViewPaintOptions; FPreviewLineCount := -1; FSupportedCustomDraw := False; FEvenColor := Color; FGridLineColor := dxDefaultGridLineColor; FGroupNodeColor := dxDefaultFixedColor; FCaptionColor := dxDefaultFixedColor; FHeaderColor := dxDefaultFixedColor; FFooterColor := dxDefaultFixedColor; FPreviewColor := Color; CaptionNodeFont := DefaultFont; EvenFont := DefaultFont; FooterFont := DefaultFont; GroupNodeFont := DefaultFont; HeaderFont := DefaultFont; OddFont := DefaultFont; PreviewFont := DefaultFont; FExtendedSelect := True; end; function TdxMasterViewReportLink.GetEmptyPagesCanExist: Boolean; begin Result := True; end; procedure TdxMasterViewReportLink.GetImageLists(AProc: TdxPSGetImageListProc); var I, J: Integer; Level: TdxMasterViewLevel; Column: TdxMasterViewColumn; begin inherited; for I := 0 to MasterView.AbsoluteLevelCount - 1 do begin Level := MasterView.AbsoluteLevels[I]; for J := 0 to Level.ColumnCount - 1 do begin Column := Level.Columns[J]; dxColumnHelpersFactory[Column].GetImageLists(Column, AProc); end; end; end; procedure TdxMasterViewReportLink.MakeDelimiters(AReportCells: TdxReportCells; AHorzDelimiters, AVertDelimiters: TList); procedure IterateChildrens(ACell: TdxReportCell); var I: Integer; Cell: TdxReportCell; begin for I := 0 to ACell.CellCount - 1 do begin Cell := ACell[I]; AVertDelimiters.Add(Pointer(Cell.AbsoluteOrigin.Y)); if Cell.HasChildren then IterateChildrens(Cell); end; end; var I, J: Integer; Cell: TdxReportCell; begin inherited MakeDelimiters(AReportCells, AHorzDelimiters, AVertDelimiters); if AReportCells.Cells.CellCount = 0 then Exit; // horizontally if UseHorzDelimiters then for I := 0 to FDelimitersCells.Count - 1 do begin Cell := TdxReportCell(FDelimitersCells.List^[I]); for J := 0 to Cell.DataItemCount - 1 do with Cell.DataItems[J] do begin AHorzDelimiters.Add(Pointer(AbsoluteOrigin.X)); AHorzDelimiters.Add(Pointer(AbsoluteOrigin.X + Width)); end; end; //vertically if UseVertDelimiters then IterateChildrens(AReportCells.Cells); end; function TdxMasterViewReportLink.GetDataClass(ANode: TdxMasterViewNode; AColumn: TdxMasterViewColumn; ACellType: TdxMasterViewLinkCellType): TdxReportCellDataClass; const CheckClasses: array[Boolean] of TdxReportCellDataClass = (TdxReportCellCheckImage, TdxReportCellString); ImageClasses: array[Boolean] of TdxReportCellDataClass = (TdxReportCellGraphic, TdxReportCellImage); GraphicClasses: array[Boolean] of TdxReportCellDataClass = (TdxReportCellString, TdxReportCellGraphic); begin case ACellType of mvctCell: if ANode.NodeType in [ntCaption, ntGroup] then Result := TdxReportCellString else if AColumn is TdxMasterViewCheckColumn then Result := CheckClasses[mvpoCheckMarksAsText in Options] else if AColumn is TdxMasterViewImageColumn then Result := ImageClasses[TdxMasterViewImageColumn(AColumn).ShowDescription] else Result := GraphicClasses[(AColumn is TdxMasterViewGraphicColumn) and not (mvpoGraphicAsText in Options)]; mvctFooter, mvctPreview: Result := TdxReportCellString; mvctHeader: Result := TdxReportCellImage; else Result := TdxReportCellString; end; end; procedure TdxMasterViewReportLink.AssignValues(ADataItem: TAbstractdxReportCellData; ANode: TdxMasterViewNode; AColumn: TdxMasterViewColumn; ACellType: TdxMasterViewLinkCellType); const SortOrderMap: array[TdxMasterViewSortOrder] of TdxCellSortOrder = (csoNone, csoUp, csoDown); var AState: TdxMVCheckState; ANullStyle: TdxMVShowNullFieldStyle; AGraphicClass: TGraphicClass; begin if ADataItem is TdxReportCellCheck then begin with TdxMasterViewCheckColumnAccess(AColumn) do begin AState := GetCheckState(ANode.Strings[Index]); ANullStyle := ShowNullFieldStyle; end; with TdxReportCellCheck(ADataItem) do begin Enabled := not ((AState = csInactive) and (ANullStyle > nfsUnchecked)); Checked := (AState = csChecked) or ((AState = csInactive) and (ANullStyle = nfsGrayedChecked)); FlatBorder := FlatCheckMarks; end; Exit; end; if ADataItem is TdxReportCellImage then begin with TdxReportCellImage(ADataItem) do begin if ACellType = mvctCell then begin ImageIndex := TdxMasterViewImageColumnAccess(AColumn).GetItemIndex(ANode); ImageList := TdxMasterViewImageColumn(AColumn).Images; Multiline := AColumn.Multiline; if (ImageIndex > -1) and (ImageIndex < TdxMasterViewImageColumn(AColumn).Items.Count) then Text := TdxMasterViewImageColumn(AColumn).Items.Descriptions[ImageIndex]; TextAlignX := dxTextAlignX[AColumn.Alignment]; end else begin if not AColumn.HeaderGlyph.Empty then begin Image := AColumn.HeaderGlyph; ImageLayout := dxImageLayout[AColumn.HeaderGlyphAlignment] end; Multiline := False; Text := AColumn.Caption; SortOrder := SortOrderMap[AColumn.SortOrder]; TextAlignX := dxTextAlignX[AColumn.HeaderAlignment]; end; EndEllipsis := movDrawEndEllipsis in MasterView.OptionsView; ImageTransparent := True; MakeSpaceForEmptyImage := ACellType = mvctCell; TextAlignY := dxMultilineTextAlignY[Multiline]; end; Exit; end; if ADataItem is TdxReportCellGraphic then begin if AColumn is TdxMasterViewImageColumn then {ShowDescription} with TdxReportCellGraphic(ADataItem) do begin DrawMode := gdmCenter; ImageIndex := TdxMasterViewImageColumnAccess(AColumn).GetItemIndex(ANode); ImageList := TdxMasterViewImageColumn(AColumn).Images; end else begin AGraphicClass := TdxMasterViewGraphicColumnAccess(AColumn).GetGraphicClass(ANode); TdxMasterViewGraphicColumnAccess(AColumn).LoadPicture(AGraphicClass, ANode.Values[AColumn.Index]); with TdxReportCellGraphic(ADataItem) do begin Image := TdxMasterViewGraphicColumn(AColumn).Picture.Graphic; ImageTransparent := TransparentColumnGraphics; if AGraphicClass = nil then AGraphicClass := TBitmap; if not AGraphicClass.InheritsFrom(TIcon) and TdxMasterViewGraphicColumn(AColumn).Stretch then DrawMode := gdmStretchProportional else DrawMode := gdmNone; end end; Exit; end; if ADataItem is TdxReportCellString then begin with TdxReportCellString(ADataItem) do begin if ACellType = mvctFooter then begin Multiline := False; Text := ExposeColumn(AColumn).GetFooterText(ANode); TextAlignX := dxTextAlignX[AColumn.FooterAlignment]; end else begin if AColumn is TdxMasterViewGraphicColumn then Text := cxGetResourceString(@sdxGraphicAsTextValue) else begin Multiline := AColumn.Multiline; if Multiline then Text := ANode.Values[AColumn.Index] else Text := ANode.Strings[AColumn.Index]; end; TextAlignX := dxTextAlignX[AColumn.Alignment]; end; EndEllipsis := movDrawEndEllipsis in MasterView.OptionsView; TextAlignY := dxMultilineTextAlignY[Multiline]; end; Exit; end end; procedure TdxMasterViewReportLink.PrepareData(Value: Boolean); begin if Value and AutoNodesExpand then MasterView.Items.LoadChildren(True); end; procedure TdxMasterViewReportLink.PrepareConstruct(AReportCells: TdxReportCells); var AScreenCanvas: TdxPSReportRenderCanvas; begin AScreenCanvas := TdxPSReportRenderScreenCanvas.Create; try FLineHeight := Renderer.CalcTextPatternHeight(AScreenCanvas, Font); FHeaderLineHeight := Renderer.CalcTextPatternHeight(AScreenCanvas, HeaderFont); FLevelCaptionHeight := Renderer.CalcTextPatternHeight(AScreenCanvas, CaptionNodeFont); FGroupNodeHeight := Renderer.CalcTextPatternHeight(AScreenCanvas, GroupNodeFont); FPreviewLineHeight := Renderer.CalcTextPatternHeight(AScreenCanvas, PreviewFont); FFooterLineHeight := Renderer.CalcTextPatternHeight(AScreenCanvas, FooterFont) + 2 * Byte(ShowGroupFooterGrid); finally AScreenCanvas.Free; end; FIndent := 19; PrepareData(True); CalcFontIndexes(AReportCells); LoadColumnPlaces; AddNodes; FDelimitersCells.Clear; if IsExistSelectedNodes then begin FSelectedNodes := TList.Create; BuildSelectedNodeList; end; end; procedure TdxMasterViewReportLink.UnprepareConstruct(AReportCells: TdxReportCells); begin FreeAndNil(FSelectedNodes); FreeFontIndexes; FreeColumnPlaces; PrepareData(False); end; procedure TdxMasterViewReportLink.CalcFontIndexes(AReportCells: TdxReportCells); begin FCaptionNodeFontIndex := AddFontToPool(CaptionNodeFont); FEvenFontIndex := AddFontToPool(EvenFont); FGroupNodeFontIndex := AddFontToPool(GroupNodeFont); FFooterFontIndex := AddFontToPool(FooterFont); FHeaderFontIndex := AddFontToPool(HeaderFont); FOddFontIndex := AddFontToPool(OddFont); FPreviewFontIndex := AddFontToPool(PreviewFont); if DrawMode = mvdmBorrowSource then LoadFontIndexes(AReportCells); end; procedure TdxMasterViewReportLink.LoadFontIndexes(AReportCells: TdxReportCells); var I, Index: Integer; F: TFont; Style: TdxMasterViewStyle; begin FFonts := TList.Create; FFonts.Capacity := 1 + MasterView.StyleCount; FFontIndexes := TList.Create; FFontIndexes.Capacity := 1 + MasterView.StyleCount; F := MasterView.Font; FFonts.Add(F); Index := AddFontToPool(F); FFontIndexes.Add(Pointer(Index)); for I := 0 to MasterView.StyleCount - 1 do begin Style := MasterView.Styles[I]; if svFont in Style.AssignedValues then begin F := Style.Font; FFonts.Add(F); Index := AddFontToPool(F); FFontIndexes.Add(Pointer(Index)); end; end; end; procedure TdxMasterViewReportLink.FreeFontIndexes; begin FreeAndNil(FFontIndexes); FreeAndNil(FFonts); end; procedure TdxMasterViewReportLink.LoadColumnPlaces; var I: Integer; List: TList; Level: TdxMasterViewLevelAccess; begin FLevels := TList.Create; FLevels.Capacity := MasterView.AbsoluteLevelCount; FColumnPlaces := TList.Create; FColumnPlaces.Capacity := FLevels.Capacity; for I := 0 to MasterView.AbsoluteLevelCount - 1 do begin Level := ExposeLevel(MasterView.AbsoluteLevels[I]); FLevels.Add(Level); Level.SaveVisibleColumnsPlaces(List); FColumnPlaces.Add(List); end; end; procedure TdxMasterViewReportLink.FreeColumnPlaces; var I: Integer; Level: TdxMasterViewLevelAccess; ColumnPlace: TList; begin if FColumnPlaces <> nil then begin for I := 0 to FColumnPlaces.Count - 1 do begin Level := FLevels.List^[I]; ColumnPlace := FColumnPlaces.List^[I]; Level.FreeVisibleColumnsPlaces(ColumnPlace); end; FreeAndNil(FColumnPlaces); end; FreeAndNil(FLevels); end; function TdxMasterViewReportLink.NodeExpanded(ANode: TdxMasterViewNode): Boolean; begin Result := ANode.Expanded or (AutoNodesExpand and ExposeNode(ANode).CanExpand); end; procedure TdxMasterViewReportLink.AddNodes; procedure AddNode(ANode: TdxMasterViewNode); var I: Integer; Node: TdxMasterViewNode; begin for I := 0 to ANode.Count - 1 do begin Node := ANode[I]; if not IsExistSelectedNodes or IsSelectedNode(Node) then FNodes.Add(Node); if NodeExpanded(Node) then AddNode(Node); end; end; begin FNodes.Clear; if not AutoNodesExpand then if OnlySelected then FNodes.Capacity := MasterView.SelectedItemCount else FNodes.Capacity := MasterView.AbsoluteItemCount; AddNode(MasterView.Items); end; function SortFunc(AItem1, AItem2: Pointer): Integer; begin Result := Integer(TdxMasterViewNode(AItem1).ParentNode) - Integer(TdxMasterViewNode(AItem2).ParentNode); if Result = 0 then Result := TdxMasterViewNode(AItem1).Index - TdxMasterViewNode(AItem2).Index; end; procedure TdxMasterViewReportLink.BuildSelectedNodeList; var I: Integer; Node, TestNode: TdxMasterViewNode; begin for I := 0 to MasterView.SelectedItemCount - 1 do FSelectedNodes.Add(MasterView.SelectedItems[I]); FSelectedNodes.Sort(SortFunc); Node := nil; for I := 0 to FSelectedNodes.Count - 1 do begin TestNode := FSelectedNodes.List^[I]; if (Node <> nil) and (TestNode.ParentNode = Node.ParentNode) then FSelectedNodes[I] := nil else Node := TestNode; end; FSelectedNodes.Pack; end; procedure TdxMasterViewReportLink.ConstructReport(AReportCells: TdxReportCells); function CalcPreviewHeight(const S: string; AWidth: Integer): Integer; var AScreenCanvas: TdxPSReportRenderCanvas; R: TRect; begin AScreenCanvas := TdxPSReportRenderScreenCanvas.Create; try R := Rect(0, 0, AWidth, 0); Result := Renderer.CalcTextRect(AScreenCanvas, S, R, True, PreviewFont); finally AScreenCanvas.Free; end; end; function GetPreviewHeight(const S: string; AWidth: Integer): Integer; begin if AutoCalcPreviewLines then if S <> '' then Result := CalcPreviewHeight(S, AWidth) else Result := 0 else Result := PreviewLineCount * FPreviewLineHeight; end; function GetItemHeight(ANode: TdxMasterViewNode; ACellType: TdxMasterViewLinkCellType; AFullHeight: Boolean; AWidth: Integer; APreviewHeight: PInteger): Integer; var ALineHeight: Integer; begin case ANode.NodeType of ntData: begin case ACellType of mvctCell: ALineHeight := FLineHeight; mvctFooter: ALineHeight := FFooterLineHeight; mvctHeader: ALineHeight := FHeaderLineHeight; else ALineHeight := FLineHeight; end; if AFullHeight then Result := ANode.Level.Layout.RowCount * ALineHeight else Result := ALineHeight; if APreviewHeight <> nil then begin APreviewHeight^ := GetPreviewHeight(ANode.PreviewText, AWidth - ANode.Level.PreviewLeftIndent); if AFullHeight then Inc(Result, APreviewHeight^); end; end; ntCaption: Result := FLevelCaptionHeight; ntGroup: Result := FGroupNodeHeight; else Result := FLevelCaptionHeight; end; end; function IsGridExists(ANode: TdxMasterViewNode): Boolean; begin Result := ((ANode.PreviewText <> '') and (lovGridWithPreview in ANode.Level.OptionsView)) or (lovGrid in ANode.Level.OptionsView) end; function GetParentLevelsSeparatorWidth(ALevel: TdxMasterViewLevel): Integer; begin Result := 0; while ALevel <> nil do begin Inc(Result, ALevel.LevelSeparatorWidth); ALevel := ALevel.Parent; end; end; function GetLevelWidth(ALevel: TdxMasterViewLevel): Integer; var {Decrease, }Increase: Integer; begin {ver 2.3} // Decrease := -2; Result := ALevel.Layout.VisibleWidth + {ver 2.3} GetParentLevelsSeparatorWidth(ALevel.Parent); repeat Increase := ALevel.GroupColumnCount; if lovCaption in ALevel.OptionsView then Inc(Increase); if ALevel.Parent <> MasterView.Levels then Inc(Increase); Inc(Result, FIndent * Increase); // if not (lovGrid in ALevel.Parent.OptionsView) then Dec(Result); {ver 2.3} // Inc(Decrease); ALevel := ALevel.Parent; until ALevel = MasterView.Levels; {ver 2.3} {if Decrease > 0 then Dec(Result, Decrease) else Inc(Result, Decrease);} end; function CanShowPreviewGrid(ANode: TdxMasterViewNode): Boolean; begin Result := ShowGrid(ANode) and ShowPreviewGrid(ANode); end; function CanShowGroupFooterGrid(ANode: TdxMasterViewNode): Boolean; begin Result := ShowGrid(ANode) and ShowGroupFooterGrid; end; function GetDataItemSides(ANode: TdxMasterViewNode; AColumnPlace: PColumnPlace; ACellType: TdxMasterViewLinkCellType): TdxCellSides; begin Result := []; case ACellType of mvctCell: case ANode.NodeType of ntData: if CanShowPreviewGrid(ANode) then begin Result := csAll; if AColumnPlace^.ColIndex = 0 then Result := Result - [csLeft]; end else begin if ANode.Level.Layout.IsColumnLast(AColumnPlace^.Column) or (ANode.Level.ViewMode = vmVertical) then Result := Result + [csRight]; if ShowGrid(ANode) then begin if AColumnPlace^.RowIndex = 0 then Result := Result + [csTop]; if (not ShowPreview(ANode) or (FPreviewLineCount = 0) or (ANode.Level.ViewMode = vmVertical)) and // (ANode.Count > 0) and ((AColumnPlace^.RowIndex + AColumnPlace^.RowCount) = ANode.Level.Layout.RowCount) then Result := Result + [csBottom]; end; end; ntGroup, ntCaption: if CanShowPreviewGrid(ANode) then Result := csAll - [csLeft]; end; mvctPreview: begin Result := [csRight]; if ShowGrid(nil) then begin Result := Result + [csBottom]; if ShowPreviewGrid(ANode) then Result := Result + [csTop]; end; end; mvctHeader: Result := csAll; mvctFooter: if CanShowGroupFooterGrid(ANode) then Result := csAll; end; end; function GetDataItemRect(ANode: TdxMasterViewNode; AColumnPlace: PColumnPlace; ACell: TdxReportCell; ACellType: TdxMasterViewLinkCellType): TRect; var AColumn: TdxMasterViewColumnAccess; ALineHeight, ANodeLevelIndex, ColIndex: Integer; Layout: TdxMasterViewLayout; begin AColumn := nil; ColIndex := 0; if AColumnPlace <> nil then begin AColumn := ExposeColumn(AColumnPlace^.Column); ColIndex := AColumnPlace^.ColIndex; end; ANodeLevelIndex := ExposeNode(ANode).GetLevelIndex; ALineHeight := GetItemHeight(ANode, ACellType, False, 0, nil); Result := Rect(0, 0, 0, 0); with Result do begin if AColumn <> nil then begin Left := AColumn.Offset + MasterView.LeftPos - GetParentLevelsSeparatorWidth(ANode.Level.Parent); //Inc(Left, ANodeLevelIndex); // v 2.3 //if (ACellType in [mvctCell, mvctHeader]) and (ANode.Level.ViewMode = vmVertical) then // Inc(Left, 1 + ANodeLevelIndex); if not IsGridExists(ANode) then Inc(Left); if (ACellType = mvctCell) and (ANode.NodeType = ntData) and (ANode.Level.ViewMode = vmHorizontal) and (ColIndex = 0) and ExposeNode(ANode).HasExpandButton then Inc(Left, FIndent); Top := AColumnPlace^.RowIndex * ALineHeight; Bottom := Top + AColumnPlace^.RowCount * ALineHeight; if ANode.Level.ViewMode = vmHorizontal then begin Right := Left + AColumn.VisibleWidth; if (ACellType = mvctCell) and (ANode.NodeType = ntData) and ExposeNode(ANode).HasExpandButton and (ColIndex = 0) then Dec(Right, FIndent); if AColumn.Level.Layout.IsColumnLast(AColumn) then Right := ACell.BoundsRect.Right; end else begin Layout := ANode.Level.Layout; if ACellType in [mvctCell, mvctFooter] then begin if ShowHeaders(ANode) then Inc(Left, Layout.HeaderWidths[ColIndex]); Right := Left + Layout.ContentWidths[ColIndex]; if not ShowHeaders(ANode) then Inc(Right, Layout.HeaderWidths[ColIndex]); end else Right := Left + Layout.HeaderWidths[ColIndex]; end end else begin Right := Left + GetLevelWidth(ANode.Level); Bottom := Top + ACell.Height; end; if ANode.NodeType > ntData then Inc(Left, FIndent * (ANodeLevelIndex + 1)); end; if ACellType = mvctFooter then begin OffsetRect(Result, -ACell.Left, 0); InflateRect(Result, -2, -2); //if Use3DEffects then OffsetRect(Result, 0, -1); end; if Use3DEffects and (ACellType in [mvctFooter{, mvctHeader}]) then //2.3 begin Inc(Result.Left); Inc(Result.Top); end; end; function GetPreviewRect(ANode: TdxMasterViewNode; ACell: TdxReportCell): TRect; begin with Result do begin Left := FIndent * ExposeNode(ANode).GetLevelIndex; if (ANode.NodeType = ntData) and ExposeNode(ANode).HasExpandButton then Inc(Left, FIndent); Top := ACell.Height - FPreviewFullHeight; Right := ACell.Width; Bottom := ACell.Height; end; end; function GetNodeFontIndex(ANode: TdxMasterViewNode; AIsOdd, ADirect: Boolean): Integer; begin case ANode.NodeType of ntData: if ADirect then Result := FFontIndex else if AIsOdd then Result := FOddFontIndex else Result := FEvenFontIndex; ntCaption: Result := FCaptionNodeFontIndex; else {ntGroup} Result := FGroupNodeFontIndex; end; end; function GetFontIndex(AFont: TFont): Integer; var Index: Integer; begin Index := FFonts.IndexOf(AFont); if Index > -1 then Result := Integer(FFontIndexes.List^[Index]) else Result := FFontIndex; end; function GetCellFontIndex(ANode: TdxMasterViewNode; AColumn: TdxMasterViewColumn; ACellType: TdxMasterViewLinkCellType; AIsOdd: Boolean): Integer; begin case ACellType of mvctCell, mvctPreview: case DrawMode of mvdmStrict: if ACellType = mvctPreview then Result := FPreviewFontIndex else Result := GetNodeFontIndex(ANode, AIsOdd, True); mvdmOddEven: if ACellType = mvctPreview then Result := FPreviewFontIndex else Result := GetNodeFontIndex(ANode, AIsOdd, False); else {mvdmBorrowSource} if ACellType = mvctPreview then Result := GetFontIndex(ExposeLevel(ANode.Level).PreviewFont) else if AColumn <> nil then Result := GetFontIndex(ExposeColumn(AColumn).ContentFont) else case ANode.NodeType of ntData: Result := GetFontIndex(ExposeLevel(ANode.Level).ContentFont); ntCaption: Result := GetFontIndex(ExposeLevel(ANode.Level).CaptionFont); else {ntGroup} Result := GetFontIndex(ExposeLevel(ANode.Level).GroupFont); end; end; mvctHeader: if DrawMode < mvdmBorrowSource then Result := FHeaderFontIndex else if AColumn <> nil then Result := GetFontIndex(ExposeColumn(AColumn).HeaderFont) else Result := GetFontIndex(ExposeLevel(ANode.Level).HeaderFont); mvctFooter: if DrawMode < mvdmBorrowSource then Result := FFooterFontIndex else if AColumn <> nil then Result := GetFontIndex(ExposeColumn(AColumn).FooterFont) else Result := GetFontIndex(ExposeLevel(ANode.Level).FooterFont); else Result := 0; end; end; function GetNodeColor(ANode: TdxMasterViewNode; AIsOdd, ADirect: Boolean): TColor; begin case ANode.NodeType of ntData: if ADirect then Result := Color else if AIsOdd then Result := OddColor else Result := EvenColor; ntCaption: Result := CaptionColor; else {ntGroup} Result := GroupNodeColor; end; end; function GetCellColor(ANode: TdxMasterViewNode; AColumn: TdxMasterViewColumn; ACellType: TdxMasterViewLinkCellType; AIsOdd: Boolean): TColor; var IsOdd: Boolean; begin case ACellType of mvctCell, mvctPreview: case DrawMode of mvdmStrict: if ACellType = mvctPreview then Result := PreviewColor else Result := GetNodeColor(ANode, AIsOdd, True); mvdmOddEven: Result := GetNodeColor(ANode, AIsOdd, False); else {mvdmBorrowSource} begin IsOdd := Odd(ANode.Index) and (ANode.NodeType = ntData); if ACellType = mvctPreview then begin if IsOdd then begin Result := ExposeLevel(ANode.Level).PreviewAnotherColor; if Result = clNone then Result := ExposeLevel(ANode.Level).PreviewColor; end else Result := ExposeLevel(ANode.Level).PreviewColor end else begin if AColumn <> nil then begin if IsOdd then begin Result := ExposeColumn(AColumn).ContentAnotherColor; if Result = clNone then Result := ExposeLevel(ANode.Level).ContentColor; end else Result := ExposeColumn(AColumn).ContentColor end else begin case ANode.NodeType of ntData: if IsOdd then begin Result := ExposeLevel(ANode.Level).ContentAnotherColor; if Result = clNone then Result := ExposeLevel(ANode.Level).ContentColor; end else Result := ExposeLevel(ANode.Level).ContentColor; ntCaption: Result := ExposeLevel(ANode.Level).CaptionColor; else {ntGroup} Result := ExposeLevel(ANode.Level).GroupColor; end; end; end; end; end; mvctHeader: if DrawMode < mvdmBorrowSource then Result := HeaderColor else if AColumn <> nil then Result := ExposeColumn(AColumn).HeaderColor else Result := ExposeLevel(ANode.Level).HeaderColor; mvctFooter: if DrawMode < mvdmBorrowSource then Result := FooterColor else if AColumn <> nil then Result := ExposeColumn(AColumn).FooterColor else Result := ExposeLevel(ANode.Level).FooterColor; else Result := Color; end; Result := ColorToRGB(Result); end; function IsCellTransparent(ANode: TdxMasterViewNode; AColumn: TdxMasterViewColumn; ACellType: TdxMasterViewLinkCellType; AIsOdd: Boolean): Boolean; begin if DrawMode < mvdmBorrowSource then if (ANode.NodeType = ntData) and (ACellType in [mvctCell, mvctPreview]) then Result := Transparent else Result := FixedTransparent else Result := ColorToRGB(GetCellColor(ANode, AColumn, ACellType, AIsOdd)) = ColorToRGB(Color); end; function FirstInSelection(ANode: TdxMasterViewNode): Boolean; begin Result := FSelectedNodes.IndexOf(ANode) <> -1; end; function CanDrawHeaders(ANode: TdxMasterViewNode): Boolean; begin with ANode do Result := ShowHeaders(ANode) and (NodeType = ntData) and (ANode.Level.ViewMode = vmHorizontal) and ( (([lohForFirstNode, lohForFirstVisibleNode] * Level.OptionsHeader <> []) and (IsFirstInLevel or (IsExistSelectedNodes and FirstInSelection(ANode))) ) or (([lohAfterExpandedNode] * Level.OptionsHeader <> []) and (IsFirstInLevel or NodeExpanded(ParentNode[Index - 1]))) ); end; function CanDrawFooters(ANode: TdxMasterViewNode): Boolean; begin with ExposeNode(ANode) do Result := ShowFooters(ANode) and (NodeType in [ntData, ntCaption]) and IsLastInLevel and (not Expanded and (not AutoNodesExpand or not CanExpand)); end; function GetNodeFooterCount(ANode: TdxMasterViewNode): Integer; var FooterSize, EndLevelCount, EndLevelData, I: Integer; function HasFooter(AParentIndex: Integer): Boolean; var Level: TdxMasterViewLevelAccess; begin Result := (FooterSize <> 0) and ((AParentIndex <> 0) or (ANode.NodeType = ntData)); if Result and (AParentIndex <> -1) then begin Level := ExposeLevel(ANode.Level); with ExposeLevel(Level.Parents[AParentIndex]) do Result := ShowFooter and (AParentIndex < EndLevelCount); end; end; begin ExposeNode(ANode).EndLevel(FooterSize, EndLevelCount, EndLevelData); Result := 0; for I := 0 to EndLevelCount - 1 do if HasFooter(I) then Inc(Result); end; function GetIndentCellSides(ANode: TdxMasterViewNode; ACellType: TdxMasterViewLinkCellType; ALevelIndex, ACurrentIndex: Integer): TdxCellSides; var ParentNode: TdxMasterViewNode; begin Result := []; if ShowGrid(nil) then begin Result := [csLeft]; if (ACurrentIndex < ALevelIndex) or (ANode.NodeType = ntData) then Result := Result + [csRight]; if (ACellType = mvctCell) and (ACurrentIndex = ALevelIndex) and (ANode.NodeType in [ntCaption, ntGroup]) then Result := Result + [csTop]; ParentNode := ANode.ParentNodes[ALevelIndex - ACurrentIndex - Byte(ANode.NodeType <> ntData)]; if ACellType = mvctCell then begin if not NodeExpanded(ParentNode) then if ANode.NodeType = ntData then begin if ParentNode.IsLast and (not CanDrawFooters(ANode) or (GetNodeFooterCount(ANode) = 0)) then Result := Result + [csBottom] end else if (ACurrentIndex = ALevelIndex) or ParentNode.IsLast then Result := Result + [csBottom] end else if (ACellType = mvctFooter) and (ACurrentIndex = ALevelIndex) and ANode.Level.IsLast then Result := Result + [csBottom]; end else if ACurrentIndex = 0 then Result := [csLeft]; end; procedure SetupExpandButtons(ANode: TdxMasterViewNode; AItem: TdxReportCellExpandButton; AShowButton: Boolean); begin with AItem do begin ShowButton := AShowButton; if ShowButton then begin ButtonBorder3D := Use3DEffects; ButtonBorder3DSoft := Use3DEffects and UseSoft3D; ButtonTransparent := False; ButtonInteriorColor := clBtnFace; ButtonExpanded := NodeExpanded(ANode); if ButtonBorder3D then if ButtonBorder3DSoft then ButtonSize := 11 else ButtonSize := 12 else ButtonSize := 11; end; end; end; function DrawIndent(ANode: TdxMasterViewNode; ACell: TdxReportCell; ACellType: TdxMasterViewLinkCellType; AIsOdd: Boolean): Integer; var I, L, LevelIndex: Integer; Item: TdxReportCellExpandButton; B, IsOdd: Boolean; PrevSibl: TdxReportItem; ParentNode: TdxMasterViewNode; begin LevelIndex := ExposeNode(ANode).GetLevelIndex; if ANode.NodeType = ntData then Dec(LevelIndex); for I := 0 to LevelIndex do begin Item := TdxReportCellExpandButton.Create(ACell); with Item do begin L := 0; PrevSibl := GetPrevSibling; if PrevSibl <> nil then L := TdxReportVisualItem(PrevSibl).BoundsRect.Right; BoundsRect := Rect(L, 0, L + FIndent, ACell.Height); ParentNode := ANode.ParentNodes[LevelIndex - I + Byte(ANode.NodeType = ntData)]; IsOdd := Odd(ParentNode.Index) and (ParentNode.NodeType = ntData); Transparent := IsCellTransparent(ParentNode, nil, mvctCell, IsOdd); Color := GetCellColor(ParentNode, nil, mvctCell, IsOdd); CellSides := GetIndentCellSides(ANode, ACellType, LevelIndex, I); // 2.3 expand buttons B := ShowExpandButtons and (I = LevelIndex) and (ANode.NodeType in [ntCaption, ntGroup]) and ExposeNode(ANode).HasExpandButton and ExposeNode(ANode).ShowExpandButton; SetupExpandButtons(ANode, Item, B); end; end; if (ACellType = mvctCell) and (ANode.NodeType = ntData) and (ExposeNode(ANode).HasExpandButton or NodeExpanded(ANode)) then begin Item := TdxReportCellExpandButton.Create(ACell); with Item do begin L := 0; PrevSibl := GetPrevSibling; if PrevSibl <> nil then L := TdxReportVisualItem(PrevSibl).BoundsRect.Right; BoundsRect := Rect(L, 0, L + FIndent, ACell.Height); CellSides := [csLeft]; if ShowGrid(ANode) then begin CellSides := CellSides + [csTop]; if {ANode.IsLast or }not NodeExpanded(ANode) then CellSides := CellSides + [csBottom]; if ANode.Level.ViewMode = vmVertical then CellSides := CellSides + [csRight]; end; Transparent := IsCellTransparent(ANode, nil, mvctCell, AIsOdd); Color := GetCellColor(ANode, nil, mvctCell, AIsOdd); // 2.3 expand buttons B := ShowExpandButtons and ExposeNode(ANode).HasExpandButton and ExposeNode(ANode).ShowExpandButton; SetupExpandButtons(ANode, Item, B); end; end; Result := FIndent * (LevelIndex + Byte(ANode.NodeType = ntData)); end; procedure Setup3DEffects(AItem: TdxReportVisualItem; ACellType: TdxMasterViewLinkCellType); begin with AItem do if Use3DEffects then begin EdgeMode := cem3DEffects; case ACellType of mvctFooter: if AItem is TdxReportCell then begin Edge3DStyle := cesRaised; Edge3DSoft := UseSoft3D; end else begin Edge3DStyle := cesSunken; Edge3DSoft := True; end; mvctHeader: begin Edge3DStyle := cesRaised; Edge3DSoft := UseSoft3D; end end; end else EdgeMode := cemPattern; end; procedure ProcessCells(ANode: TdxMasterViewNode; AParent: TdxReportCell; ACellType: TdxMasterViewLinkCellType; AIsOdd: Boolean); var I, L, ACellHeight: Integer; R: TRect; ADataClass: TdxReportCellDataClass; ADataItem: TAbstractdxReportCellData; ACell: TdxReportCell; APrevSibl: TdxReportItem; AColumn, AGroupColumn: TdxMasterViewColumn; AColumnPlaces: TList; AColumnPlace: PColumnPlace; begin if ShowPreview(ANode) and (ACellType = mvctCell) and (ANode.NodeType = ntData) then begin L := GetLevelWidth(ANode.Level); ACellHeight := GetItemHeight(ANode, ACellType, True, L, @FPreviewFullHeight); end else begin ACellHeight := GetItemHeight(ANode, ACellType, True, 0, nil); FPreviewFullHeight := 0; end; ACell := TdxReportCell.Create(AParent); with ACell do begin BoundsRect := Rect(0, 0, GetLevelWidth(ANode.Level), ACellHeight); APrevSibl := GetPrevSibling; if APrevSibl <> nil then Top := TdxReportCell(APrevSibl).BoundsRect.Bottom; CellSides := [csLeft, csRight]; if ANode = FNodes.List^[0] then CellSides := CellSides + [csTop]; Transparent := {False;//} True; //??? rest spaces in column and data areas if ones exist must be drawn with special colors if IsSupportedCustomDraw(nil) and ((ACellType <> mvctHeader) or (ANode.Level.ViewMode = vmVertical)) then Data := Integer(ANode); end; L := DrawIndent(ANode, ACell, ACellType, AIsOdd); if ACellType = mvctFooter then begin ACell := TdxReportCell.Create(ACell); with ACell do begin R := Rect(L, 0, Parent.BoundsRect.Right, ACellHeight); { 2.3 if Use3DEffects then begin Inc(R.Left); Inc(R.Top); end;} BoundsRect := R; APrevSibl := GetPrevSibling; if APrevSibl <> nil then Top := TdxReportCell(APrevSibl).BoundsRect.Bottom; CellSides := csAll; Transparent := FixedTransparent; if not Transparent then Color := GetCellColor(ANode, nil, mvctFooter, False); if Use3DEffects then Setup3DEffects(ACell, ACellType); if IsSupportedCustomDraw(nil) then Data := Integer(ANode); end; end; case ANode.NodeType of ntData: begin if (ACellType = mvctHeader) or (ANode.Level.ViewMode = vmVertical) or (not ShowHeaders(ANode) and ANode.IsFirstinLevel) then FDelimitersCells.Add(ACell); AColumnPlaces := FColumnPlaces.List^[FLevels.IndexOf(ANode.Level)]; for I := 0 to AColumnPlaces.Count - 1 do begin AColumnPlace := AColumnPlaces.List^[I]; AColumn := AColumnPlace^.Column; if (ACellType = mvctFooter) and (AColumn.SummaryType = dxMasterView.stNone) then Continue; ADataClass := GetDataClass(ANode, AColumn, ACellType); if ADataClass = nil then Continue; ADataItem := ADataClass.Create(ACell); AssignValues(ADataItem, ANode, AColumn, ACellType); ADataItem.CellSides := GetDataItemSides(ANode, AColumnPlace, ACellType); ADataItem.BoundsRect := GetDataItemRect(ANode, AColumnPlace, ACell, ACellType); ADataItem.Transparent := IsCellTransparent(ANode, AColumn, ACellType, AIsOdd); if not ADataItem.Transparent then ADataItem.Color := GetCellColor(ANode, AColumn, ACellType, AIsOdd); ADataItem.FontIndex := GetCellFontIndex(ANode, AColumn, ACellType, AIsOdd); if Use3DEffects and (ACellType in [mvctFooter, mvctHeader]) then Setup3DEffects(ADataItem, ACellType); if IsSupportedCustomDraw(nil) then ADataItem.Data := Integer(AColumn); if (ANode.Level.ViewMode = vmVertical) and (ACellType <> mvctFooter) and ShowHeaders(ANode) then begin ADataClass := GetDataClass(ANode, AColumn, mvctHeader); ADataItem := ADataClass.Create(ACell); with ADataItem do begin AssignValues(ADataItem, ANode, AColumn, mvctHeader); CellSides := GetDataItemSides(ANode, AColumnPlace, mvctHeader); BoundsRect := GetDataItemRect(ANode, AColumnPlace, ACell, mvctHeader); Transparent := IsCellTransparent(ANode, nil, mvctHeader, AIsOdd); if not Transparent then Color := GetCellColor(ANode, AColumn, mvctHeader, AIsOdd); FontIndex := GetCellFontIndex(ANode, AColumn, mvctHeader, AIsOdd); if Use3DEffects then Setup3DEffects(ADataItem, mvctHeader); if IsSupportedCustomDraw(nil) then Data := Integer(AColumn); end; end; end; if ShowPreview(ANode) and (FPreviewFullHeight > 0) then begin ADataItem := TdxReportCellString.Create(ACell); with TdxReportCellString(ADataItem) do begin Text := ANode.PreviewText; Indents.Left := ANode.Level.PreviewLeftIndent; Multiline := True; CellSides := GetDataItemSides(ANode, nil, mvctPreview); BoundsRect := GetPreviewRect(ANode, ACell); Transparent := IsCellTransparent(ANode, nil, mvctPreview, AIsOdd); if not Transparent then Color := GetCellColor(ANode, nil, mvctPreview, AIsOdd); FontIndex := GetCellFontIndex(ANode, nil, mvctPreview, AIsOdd); end; end; end; ntCaption: begin ADataItem := TdxReportCellString.Create(ACell); with TdxReportCellString(ADataItem) do begin Text := ANode.Level.Caption; CellSides := GetDataItemSides(ANode, nil, ACellType); BoundsRect := GetDataItemRect(ANode, nil, ACell, mvctCell); Transparent := IsCellTransparent(ANode, nil, ACellType, AIsOdd); if not Transparent then Color := GetCellColor(ANode, nil, ACellType, AIsOdd); FontIndex := GetCellFontIndex(ANode, nil, ACellType, AIsOdd); if IsSupportedCustomDraw(nil) then Data := Integer(ANode); end; end; ntGroup: begin ADataItem := TdxReportCellString.Create(ACell); with TdxReportCellString(ADataItem) do begin AGroupColumn := ANode.Level.GroupColumns[ANode.GroupIndex]; Text := AGroupColumn.Caption + ' : ' + ExposeColumn(AGroupColumn).GetGroupDisplayText(ANode); CellSides := GetDataItemSides(ANode, nil, ACellType); BoundsRect := GetDataItemRect(ANode, nil, ACell, mvctCell); Transparent := IsCellTransparent(ANode, nil, ACellType, AIsOdd); if not Transparent then Color := GetCellColor(ANode, nil, ACellType, AIsOdd); FontIndex := GetCellFontIndex(ANode, nil, ACellType, AIsOdd); if IsSupportedCustomDraw(nil) then Data := Integer(AGroupColumn); end; end; end; end; procedure IterateNodes; var I, J, FooterCount: Integer; Node, FooterNode: TdxMasterViewNode; IsOdd: Boolean; begin for I := 0 to FNodes.Count - 1 do begin Node := TdxMasterViewNode(FNodes.List^[I]); IsOdd := not (Odd(Node.Index) and (Node.NodeType = ntData)); if CanDrawHeaders(Node) then ProcessCells(Node, AReportCells.Cells, mvctHeader, IsOdd); ProcessCells(Node, AReportCells.Cells, mvctCell, IsOdd); if CanDrawFooters(Node) then begin FooterCount := GetNodeFooterCount(Node); if FooterCount > 0 then begin FooterNode := Node; if FooterNode.NodeType = ntCaption then FooterNode := FooterNode.ParentNodeWithData; J := 0; while J < FooterCount do begin if lovFooter in FooterNode.Level.OptionsView then begin ProcessCells(FooterNode, AReportCells.Cells, mvctFooter, True); Inc(J); end; FooterNode := FooterNode.ParentNodeWithData; end; end; end; AReportCells.DoProgress(MulDiv(I, 100, FNodes.Count)); if AbortBuilding then Break; end; end; var I, Width, Height: Integer; Cell: TdxReportCell; begin if Component = nil then Exit; inherited ConstructReport(AReportCells); PrepareConstruct(AReportCells); try AReportCells.BorderColor := GridLineColor; with AReportCells.Cells do begin Color := dxDefaultColor; CellSides := []; Transparent := True; FontIndex := 0; end; if FNodes.Count > 0 then IterateNodes; if not AbortBuilding then begin Width := 0; for I := 0 to AReportCells.Cells.CellCount - 1 do begin Cell := AReportCells.Cells[I]; if Cell.Width > Width then Width := Cell.Width; end; Height := 0; Cell := AReportCells.Cells.LastCell; if Cell <> nil then Height := Cell.BoundsRect.Bottom; AReportCells.Cells.BoundsRect := Rect(0, 0, Width, Height); end; finally UnprepareConstruct(AReportCells); end; end; { TdxMVReportLinkDesignWindow } constructor TdxMVReportLinkDesignWindow.Create(AOwner: TComponent); begin HelpContext := dxhcMasterViewReportLinkDesigner; inherited Create(AOwner); CreateControls; LoadMemData; PageControl1.ActivePage := PageControl1.Pages[0]; FLastIndex := -1; dxPSPopupMenuController.RegisterControl(lbxFonts); end; destructor TdxMVReportLinkDesignWindow.Destroy; begin dxPSPopupMenuController.UnregisterControl(lbxFonts); inherited Destroy; end; const sdxOrderNo = 'OrderNo'; sdxName = 'Name'; sdxCount = 'Count'; sdxCompany = 'Company'; sdxAddress = 'Address'; sdxPrice = 'Price'; sdxCash = 'Cash'; procedure TdxMVReportLinkDesignWindow.CreateDataSets; procedure AddField(AFieldClass: TFieldClass; ADataSet: TDataSet; const AFieldName: string; ASize: Integer; ARequired: Boolean); begin with AFieldClass.Create(Self) do begin FieldName := AFieldName; DataSet := ADataSet; Size := ASize; Required := ARequired; end; end; begin FmdMaster := TdxEasyMemData.Create(Self); AddField(TIntegerField, FmdMaster, sdxOrderNo, 0, True); AddField(TStringField, FmdMaster, sdxName, 30, False); AddField(TStringField, FmdMaster, sdxCompany, 30, False); AddField(TStringField, FmdMaster, sdxAddress, 50, False); FmdDetail := TdxEasyMemData.Create(Self); AddField(TIntegerField, FmdDetail, sdxOrderNo, 0, True); AddField(TIntegerField, FmdDetail, sdxCount, 0, False); AddField(TCurrencyField, FmdDetail, sdxPrice, 0, False); AddField(TBooleanField, FmdDetail, sdxCash, 0, False); FmdMaster.Open; FmdMaster.InsertRecord([1, sdxName1, sdxCompany1, sdxAddress1]); FmdMaster.InsertRecord([2, sdxName2, sdxCompany2, sdxAddress2]); FmdDetail.Open; FmdDetail.InsertRecord([1, 100, 9.00, True]); FmdDetail.InsertRecord([1, 120, 19.00, False]); FmdDetail.InsertRecord([2, 110, 21.00, True]); FmdDetail.InsertRecord([2, 90, 100.00, True]); FmdDetail.InsertRecord([2, 140, 111.00, False]); FmdDetail.InsertRecord([2, 100, 112.00, False]); FdsMaster := TDataSource.Create(Self); FdsMaster.DataSet := FmdMaster; FdsDetail := TDataSource.Create(Self); FdsDetail.DataSet := FmdDetail; end; procedure TdxMVReportLinkDesignWindow.InitializeMasterView; function CreateColumn(ALevel: TdxMasterViewLevel; AColumnClass: TdxMasterViewColumnClass; const AFieldName: string; const ACaption: string; AMinWidth: Integer): TdxMasterViewColumn; begin Result := ALevel.CreateColumn(AColumnClass); with Result do begin FieldName := AFieldName; MinWidth := AMinWidth; Caption := ACaption; end; end; function CreateLevel(AParent: TdxMasterViewLevel; ADataSource: TDataSource): TdxMasterViewLevel; begin Result := AParent.Add; with Result do begin CaptionStyle := mvsCaptionStyle; ContentStyle := mvsContentStyle; FooterStyle := mvsFooterStyle; GroupStyle := mvsGroupStyle; HeaderStyle := mvsHeaderStyle; PreviewStyle := mvsPreviewStyle; OnGetContentStyle := dxMVPreviewGetContentStyle; OnGetPreviewStyle := dxMVPreviewGetContentStyle; DataSource := ADataSource; ID := sdxOrderNo; end; end; begin FMVMasterLevel := CreateLevel(dxMVPreview.Levels, FdsMaster); with FMVMasterLevel do begin OptionsView := FMVMasterLevel.OptionsView + [lovPreview]; PreviewFieldName := sdxAddress; end; FMVColumnName := CreateColumn(FMVMasterLevel, TdxMasterViewColumn, sdxName, sdxNameCaption, 80); FMVColumnAddress := CreateColumn(FMVMasterLevel, TdxMasterViewColumn, sdxCompany, sdxCompanyCaption, 154); FMVDetailLevel := CreateLevel(FMVMasterLevel, FdsDetail); with FMVDetailLevel do begin DetailKey := sdxOrderNo; MasterKey := sdxOrderNo; end; FMVColumnCount := CreateColumn(FMVDetailLevel, TdxMasterViewColumn, sdxCount, sdxCountCaption, 83); with FMVColumnCount do begin SummaryType := stAverage; SummaryFieldName := sdxCount; end; FMVColumnPrice := CreateColumn(FMVDetailLevel, TdxMasterViewColumn, sdxPrice, sdxPriceCaption, 100); with FMVColumnPrice do begin SummaryType := stAverage; SummaryFieldName := sdxPrice; end; FMVColumnCash := TdxMasterViewCheckColumn(CreateColumn(FMVDetailLevel, TdxMasterViewCheckColumn, sdxCash, sdxCashCaption, 50)); with FMVColumnCash do begin ValueChecked := 'True'; ValueUnchecked := 'False'; end; end; procedure TdxMVReportLinkDesignWindow.LoadMemData; begin CreateDataSets; InitializeMasterView; dxMVPreview.ApplyBestFit(nil, nil); end; { dxMVMasterLevelName.Width := 80; dxMVMasterLevelOrderNo.Width := 50; dxMVMasterLevelAddress.Width := 104; dxMVDetailLevelOrderNo.Width := 50; dxMVDetailLevelCount.Width := 83; dxMVDetailLevelPrice.Width := 100; } procedure TdxMVReportLinkDesignWindow.pbxPreviewPaint(Sender: TObject); begin with TdxPSPaintPanel(Sender) do PaintPreview(Canvas, ClientRect); end; procedure FrameRectColor(DC: hDC; const R: TRect; AColor: TColor); var Brush: HBRUSH; begin Brush := CreateSolidBrush(ColorToRGB(AColor)); FrameRect(DC, R, Brush); DeleteObject(Brush); end; procedure TdxMVReportLinkDesignWindow.PaintPreview(ACanvas: TCanvas; R: TRect); var DC: HDC; begin inherited; DC := ACanvas.Handle; dxMVPreview.PaintTo(DC, R.Left, R.Top); Dec(R.Right, 2); Dec(R.Bottom); FrameRectColor(DC, R, ReportLink.GridLineColor); end; procedure TdxMVReportLinkDesignWindow.CreateControls; begin FPreviewBox := TdxPSPaintPanel.Create(Self); with TdxPSPaintPanel(FPreviewBox) do begin Parent := pnlPreview; Height := dxMVPreview.Height; Width := dxMVPreview.Width; Left := (Parent.Width - Width) div 2; Top := (Parent.Height - Height) div 2; EdgeInner := esNone; EdgeOuter := esNone; OnPaint := pbxPreviewPaint; end; end; {$IFDEF DELPHI7} function TdxMVReportLinkDesignWindow.GetPreviewHost: TCustomPanel; begin Result := pnlPreview; end; {$ENDIF} procedure TdxMVReportLinkDesignWindow.LoadStrings; begin inherited LoadStrings; lblPreviewWindow.Caption := DropAmpersand(cxGetResourceString(@sdxPreview)); tshOptions.Caption := cxGetResourceString(@sdxOptions); tshFonts.Caption := cxGetResourceString(@sdxFonts); tshColors.Caption := cxGetResourceString(@sdxColors); tshBehaviors.Caption := cxGetResourceString(@sdxBehaviors); tshPreview.Caption := DropAmpersand(cxGetResourceString(@sdxPreview)); lblShow.Caption := cxGetResourceString(@sdxShow); chbxShowHeaders.Caption := cxGetResourceString(@sdxHeaders); chbxShowFooters.Caption := cxGetResourceString(@sdxFooters); chbxShowExpandButtons.Caption := cxGetResourceString(@sdxExpandButtons); chbxShowGrid.Caption := cxGetResourceString(@sdxGrid); chbxShowPreviewGrid.Caption := cxGetResourceString(@sdxNodesGrid); chbxShowGroupFooterGrid.Caption := cxGetResourceString(@sdxGroupFooterGrid); lblDrawMode.Caption := cxGetResourceString(@sdxDrawMode); with cbxDrawMode.Properties.Items do begin BeginUpdate; try Clear; AddObject(cxGetResourceString(@sdxDrawModeStrict), TObject(mvdmStrict)); AddObject(cxGetResourceString(@sdxDrawModeOddEven), TObject(mvdmOddEven)); AddObject(cxGetResourceString(@sdxDrawModeBorrow), TObject(mvdmBorrowSource)); finally EndUpdate; end; end; stTransparent.Caption := ' ' + cxGetResourceString(@sdxTransparent) + ' '; lblColor.Caption := cxGetResourceString(@sdxColor); lblEvenColor.Caption := cxGetResourceString(@sdxEvenColor); lblPreviewColor.Caption := cxGetResourceString(@sdxPreviewColor); stFixedTransparent.Caption := ' ' + cxGetResourceString(@sdxFixedTransparent) + ' '; lblLevelCaptionColor.Caption := cxGetResourceString(@sdxLevelCaptionColor); lblHeaderColor.Caption := cxGetResourceString(@sdxHeaderColor); lblFooterColor.Caption := cxGetResourceString(@sdxFooterColor); lblGroupNodeColor.Caption := cxGetResourceString(@sdxGroupNodeColor); lblGridLineColor.Caption := cxGetResourceString(@sdxGridLinesColor); with lbxFonts.Items do begin BeginUpdate; try Clear; Add(cxGetResourceString(@sdxFont)); Add(cxGetResourceString(@sdxOddFont)); Add(cxGetResourceString(@sdxEvenFont)); Add(cxGetResourceString(@sdxCaptionNodeFont)); Add(cxGetResourceString(@sdxGroupNodeFont)); Add(cxGetResourceString(@sdxFooterFont)); Add(cxGetResourceString(@sdxHeaderFont)); Add(cxGetResourceString(@sdxPreviewFont)); finally EndUpdate; end; end; btnChangeFont.Caption := cxGetResourceString(@sdxBtnChangeFont); miChangeFont.Caption := cxGetResourceString(@sdxBtnChangeFont); chbxAutoNodesExpand.Caption := cxGetResourceString(@sdxAutoNodesExpand); chbxOnlySelected.Caption := cxGetResourceString(@sdxOnlySelected); chbxExtendedSelect.Caption := cxGetResourceString(@sdxExtendedSelect); lblSelection.Caption := cxGetResourceString(@sdxSelection); lblExpanding.Caption := cxGetResourceString(@sdxNodeExpanding); lblLookAndFeel.Caption := cxGetResourceString(@sdxLookAndFeel); lblRefinements.Caption := cxGetResourceString(@sdxRefinements); chbxUse3DEffects.Caption := cxGetResourceString(@sdxUse3DEffects); chbxUseSoft3D.Caption := cxGetResourceString(@sdxSoft3D); chbxTransparentColumnGraphic.Caption := cxGetResourceString(@sdxTransparentColumnGraphics); chbxDisplayGraphicsAsText.Caption := cxGetResourceString(@sdxDisplayGraphicsAsText); chbxFlatCheckMarks.Caption := cxGetResourceString(@sdxFlatCheckMarks); chbxCheckMarksAsText.Caption := cxGetResourceString(@sdxCheckMarksAsText); lblPreview.Caption := DropAmpersand(cxGetResourceString(@sdxPreview)); chbxShowPreview.Caption := DropAmpersand(cxGetResourceString(@sdxVisible)); chbxAutoCalcPreviewLines.Caption := cxGetResourceString(@sdxAutoCalcPreviewLineCount); lblPreviewLineCount.Caption := cxGetResourceString(@sdxPreviewLineCount); end; procedure TdxMVReportLinkDesignWindow.CMDialogChar(var Msg: TCMDialogChar); var I: Integer; begin inherited; with PageControl1 do for I := 0 to PageCount - 1 do if IsAccel(Msg.CharCode, Pages[I].Caption) then begin Msg.Result := 1; ActivePage := Pages[I]; Exit; end; end; procedure TdxMVReportLinkDesignWindow.UpdateControlsState; begin inherited UpdateControlsState; if ReportLink.OddEvenMode then lblColor.Caption := cxGetResourceString(@sdxOddColor) else lblColor.Caption := cxGetResourceString(@sdxColor); chbxOnlySelected.Checked := ReportLink.OnlySelected; chbxExtendedSelect.Enabled := chbxOnlySelected.Checked; chbxAutoNodesExpand.Checked := ReportLink.AutoNodesExpand; chbxAutoCalcPreviewLines.Enabled := ReportLink.ShowPreview(nil); sePreviewLineCount.Enabled := ReportLink.ShowPreview(nil) and not ReportLink.AutoCalcPreviewLines; lblPreviewLineCount.Enabled := sePreviewLineCount.Enabled; chbxShowPreviewGrid.Enabled := chbxShowGrid.Checked; chbxShowGroupFooterGrid.Enabled := chbxShowGrid.Checked; chbxUseSoft3D.Enabled := chbxUse3DEffects.Checked; ccbxColor.Enabled := not chbxTransparent.Checked; lblColor.Enabled := ccbxColor.Enabled; ccbxEvenColor.Enabled := not chbxTransparent.Checked and ReportLink.OddEvenMode; lblEvenColor.Enabled := ccbxEvenColor.Enabled; ccbxPreviewColor.Enabled := not chbxTransparent.Checked and not ReportLink.OddEvenMode; lblPreviewColor.Enabled := ccbxPreviewColor.Enabled; ccbxCaptionColor.Enabled := not chbxFixedTransparent.Checked; lblLevelCaptionColor.Enabled := ccbxCaptionColor.Enabled; ccbxGroupNodeColor.Enabled := not chbxFixedTransparent.Checked; lblGroupNodeColor.Enabled := ccbxGroupNodeColor.Enabled; ccbxHeaderColor.Enabled := not chbxFixedTransparent.Checked; lblHeaderColor.Enabled := ccbxHeaderColor.Enabled; ccbxFooterColor.Enabled := not chbxFixedTransparent.Checked; lblFooterColor.Enabled := ccbxFooterColor.Enabled; btnChangeFont.Enabled := IsChangeFontEnabled; lbxFonts.Perform(LB_SETHORIZONTALEXTENT, GetMaxWidth, 0); end; function TdxMVReportLinkDesignWindow.IsChangeFontEnabled: Boolean; var I: Integer; begin if ReportLink.OddEvenMode then Result := lbxFonts.SelCount > 0 else begin Result := True; for I := 0 to lbxFonts.Items.Count - 1 do if lbxFonts.Selected[I] and not (I in [1, 2]) then Exit; Result := False; end; end; function TdxMVReportLinkDesignWindow.IsDisableIndex(AIndex: Integer): Boolean; begin Result := not ReportLink.OddEvenMode and (AIndex in [1, 2]); end; procedure TdxMVReportLinkDesignWindow.DoInitialize; begin inherited; with lbxFonts do begin Canvas.Font := Font; ItemHeight := 1 + lbxFonts.Canvas.TextHeight('Wg') + 2; Height := 4{border} + GetSystemMetrics(SM_CYHSCROLL) + Items.Count * ItemHeight; end; btnChangeFont.Top := lbxFonts.Top + lbxFonts.Height + 6; with ReportLink do begin chbxShowHeaders.Checked := ShowHeaders(nil); chbxShowFooters.Checked := ShowFooters(nil); chbxShowPreview.Checked := ShowPreview(nil); chbxAutoCalcPreviewLines.Checked := AutoCalcPreviewLines; sePreviewLineCount.Enabled := ShowPreview(nil) and not AutoCalcPreviewLines; sePreviewLineCount.Properties.MinValue := -Integer(AutoCalcPreviewLines); sePreviewLineCount.Value := PreviewLineCount; chbxShowGrid.Checked := ShowGrid(nil); chbxShowPreviewGrid.Checked := ShowPreviewGrid(nil); chbxShowGroupFooterGrid.Checked := ShowGroupFooterGrid; chbxFlatCheckMarks.Checked := FlatCheckMarks; chbxShowExpandButtons.Checked := ShowExpandButtons; if OddEvenMode then lblColor.Caption := cxGetResourceString(@sdxOddColor); chbxTransparent.Checked := Transparent; chbxFixedTransparent.Checked := FixedTransparent; cbxDrawMode.ItemIndex := cbxDrawMode.Properties.Items.IndexOfObject(TObject(DrawMode)); ccbxColor.ColorValue := ReportLink.Color; ccbxEvenColor.ColorValue := EvenColor; ccbxPreviewColor.ColorValue := PreviewColor; ccbxCaptionColor.ColorValue := CaptionColor; ccbxFooterColor.ColorValue := FooterColor; ccbxGridLineColor.ColorValue := GridLineColor; ccbxGroupNodeColor.ColorValue := GroupNodeColor; ccbxHeaderColor.ColorValue := HeaderColor; chbxOnlySelected.Checked := OnlySelected; chbxExtendedSelect.Checked := ExtendedSelect; chbxUse3DEffects.Checked := Use3DEffects; chbxUseSoft3D.Checked := UseSoft3D; chbxTransparentColumnGraphic.Checked := TransparentColumnGraphics; chbxDisplayGraphicsAsText.Checked := GraphicsAsText; end; dxMVPreview.FullExpand; UpdatePreview; lbxFonts.Invalidate; end; procedure TdxMVReportLinkDesignWindow.PreviewLineCountChange(Sender: TObject); begin if LockControlsUpdate then Exit; ReportLink.PreviewLineCount := TcxSpinEdit(Sender).Value; Modified := True; end; procedure TdxMVReportLinkDesignWindow.UpdatePreview; procedure XorOption(var AOptions: TdxMasterViewLevelOptionsView; AElement: TdxMasterViewLevelOptionView; Value: Boolean); begin if Value then AOptions := AOptions + [AElement] else AOptions := AOptions - [AElement]; end; var I: Integer; OV: TdxMasterViewLevelOptionsView; begin inherited UpdatePreview; OV := FMVMasterLevel.OptionsView; with ReportLink do begin XorOption(OV, lovHeader, ShowHeaders(nil)); XorOption(OV, lovPreview, ShowPreview(nil)); XorOption(OV, lovGrid, ShowGrid(nil)); XorOption(OV, lovGridWithPreview, ShowPreviewGrid(nil)); end; FMVMasterLevel.OptionsView := OV; FMVColumnCash.Border3D := not ReportLink.FlatCheckMarks; OV := FMVDetailLevel.OptionsView; with ReportLink do begin XorOption(OV, lovHeader, ShowHeaders(nil)); XorOption(OV, lovFooter, ShowFooters(nil)); XorOption(OV, lovGrid, ShowGrid(nil)); XorOption(OV, lovGridWithPreview, ShowPreviewGrid(nil)); end; FMVDetailLevel.OptionsView := OV; FMVMasterLevel.GridLinesColor := ReportLink.GridLineColor; FMVDetailLevel.GridLinesColor := FMVMasterLevel.GridLinesColor; with ReportLink do begin if FixedTransparent then begin mvsCaptionStyle.Color := clWindow; mvsHeaderStyle.Color := clWindow; mvsFooterStyle.Color := clWindow; mvsGroupStyle.Color := clWindow; end else begin mvsCaptionStyle.Color := CaptionColor; mvsHeaderStyle.Color := HeaderColor; mvsFooterStyle.Color := FooterColor; mvsGroupStyle.Color := GroupNodeColor; end; if Transparent then begin mvsContentStyle.Color := clWindow; mvsContentStyle.AnotherColor := clWindow; mvsPreviewStyle.Color := clWindow; mvsPreviewStyle.AnotherColor := clWindow; end else begin if DrawMode = mvdmOddEven then begin mvsContentStyle.Color := OddColor; mvsContentStyle.AnotherColor := OddColor; mvsPreviewStyle.Color := OddColor; mvsPreviewStyle.AnotherColor := EvenColor; end else begin mvsContentStyle.Color := Color; mvsContentStyle.AnotherColor := Color; mvsPreviewStyle.Color := PreviewColor; mvsPreviewStyle.AnotherColor := PreviewColor; end; end; with mvsPreviewStyle do AssignedValues := AssignedValues + [svAnotherColor]; if DrawMode = mvdmOddEven then begin mvsAnotherContentStyle.Color := EvenColor; mvsAnotherContentStyle.Font := EvenFont; end; mvsCaptionStyle.Font := CaptionNodeFont; mvsHeaderStyle.Font := HeaderFont; mvsFooterStyle.Font := FooterFont; mvsGroupStyle.Font := GroupNodeFont; if DrawMode = mvdmOddEven then begin mvsContentStyle.Font := OddFont; mvsPreviewStyle.Font := OddFont; end else begin mvsContentStyle.Font := Font; mvsPreviewStyle.Font := PreviewFont; end; for I := 0 to dxMVPreview.StyleCount - 1 do dxMVPreview.Styles[I].Font.Size := dxMVPreview.Font.Size; end; FPreviewBox.HandleNeeded; FPreviewBox.Invalidate; end; function TdxMVReportLinkDesignWindow.GetReportLink: TdxMasterViewReportLink; begin Result := inherited ReportLink as TdxMasterViewReportLink; end; procedure TdxMVReportLinkDesignWindow.ShowClick(Sender: TObject); begin if LockControlsUpdate then Exit; if Sender <> nil then begin with ReportLink do if TcxCheckBox(Sender).Checked then Options := Options + [TdxMasterViewPaintOption(TcxCheckBox(Sender).Tag)] else Options := Options - [TdxMasterViewPaintOption(TcxCheckBox(Sender).Tag)]; Modified := True; end; UpdatePreview; end; procedure TdxMVReportLinkDesignWindow.cbxDrawModeClick(Sender: TObject); begin if LockControlsUpdate then Exit; ReportLink.DrawMode := TdxMasterViewDrawMode(TcxComboBox(Sender).ItemObject); Modified := True; UpdatePreview; end; procedure TdxMVReportLinkDesignWindow.chbxAutoNodesExpandClick(Sender: TObject); begin if LockControlsUpdate then Exit; ReportLink.AutoNodesExpand := TcxCheckBox(Sender).Checked; Modified := True; end; procedure TdxMVReportLinkDesignWindow.chbxOnlySelectedClick(Sender: TObject); begin if LockControlsUpdate then Exit; ReportLink.OnlySelected := TcxCheckBox(Sender).Checked; Modified := True; end; procedure TdxMVReportLinkDesignWindow.chbxExtendedSelectClick(Sender: TObject); begin if LockControlsUpdate then Exit; ReportLink.ExtendedSelect := TcxCheckBox(Sender).Checked; Modified := True; end; procedure TdxMVReportLinkDesignWindow.chbxAutoCalcPreviewLinesClick(Sender: TObject); begin if LockControlsUpdate then Exit; ReportLink.PreviewLineCount := -Integer(TcxCheckBox(Sender).Checked); sePreviewLineCount.Properties.MinValue := -Integer(ReportLink.AutoCalcPreviewLines); sePreviewLineCount.Value := -Integer(ReportLink.AutoCalcPreviewLines); Modified := True; end; procedure TdxMVReportLinkDesignWindow.chbxTransparentClick(Sender: TObject); begin if LockControlsUpdate then Exit; case TcxCheckBox(Sender).Tag of 0: ReportLink.Transparent := TcxCheckBox(Sender).Checked; 1: ReportLink.FixedTransparent := TcxCheckBox(Sender).Checked; end; UpdatePreview; Modified := True; end; procedure TdxMVReportLinkDesignWindow.stTransparentClick(Sender: TObject); begin if chbxTransparent.CanFocus then ActiveControl := chbxTransparent; chbxTransparent.Checked := not chbxTransparent.Checked; end; procedure TdxMVReportLinkDesignWindow.stFixedTransparentClick(Sender: TObject); begin if chbxFixedTransparent.CanFocus then ActiveControl := chbxFixedTransparent; chbxFixedTransparent.Checked := not chbxFixedTransparent.Checked; end; procedure TdxMVReportLinkDesignWindow.ccbxColorChange(Sender: TObject); var AColor: TColor; begin if LockControlsUpdate then Exit; AColor := TcxColorComboBox(Sender).ColorValue; case TcxColorComboBox(Sender).Tag of 0: ReportLink.Color := AColor; 1: ReportLink.EvenColor := AColor; 2: ReportLink.PreviewColor := AColor; 3: ReportLink.CaptionColor := AColor; 4: ReportLink.GroupNodeColor := AColor; 5: ReportLink.HeaderColor := AColor; 6: ReportLink.FooterColor := AColor; 7: ReportLink.GridLineColor := AColor; end; UpdatePreview; Modified := True; end; procedure TdxMVReportLinkDesignWindow.btnChangeFontClick(Sender: TObject); begin DoChangeFont(lbxFonts.ItemIndex); end; procedure TdxMVReportLinkDesignWindow.lbxFontsMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var W: Integer; S: string; AIndex: Integer; begin AIndex := lbxFonts.ItemAtPos(Point(X, Y), True); if (AIndex = -1) or (AIndex = FLastIndex ) then Exit; lbxFonts.Hint := ''; Application.CancelHint; S := GetFontInfoText(AIndex); W := lbxFonts.Canvas.TextWidth(S); if W > lbxFonts.Width - lbxFonts.Canvas.TextWidth(lbxFonts.Items[AIndex]) then begin lbxFonts.Hint := S; FLastIndex := AIndex; end; end; procedure TdxMVReportLinkDesignWindow.lbxFontsKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); var ItemIndex: Integer; begin if (ReportLink.DrawMode <> mvdmOddEven) and (Key in [VK_UP, VK_DOWN]) then begin ItemIndex := TcxListBox(Sender).ItemIndex; case Key of VK_UP: if IsDisableIndex(ItemIndex - 1) then while IsDisableIndex(ItemIndex - 1) do Dec(ItemIndex); VK_DOWN: if IsDisableIndex(ItemIndex + 1) then while IsDisableIndex(ItemIndex + 1) do Inc(ItemIndex); end; TcxListBox(Sender).ItemIndex := ItemIndex; end; if (Key = VK_RETURN) and (ssCtrl in Shift) then btnChangeFont.Click; end; function TdxMVReportLinkDesignWindow.GetFontInfoText(AIndex: Integer): string; begin Result := FormatFontInfo(GetFontByIndex(AIndex)); end; function TdxMVReportLinkDesignWindow.GetMaxWidth: Integer; var I, L, W: Integer; begin with lbxFonts do begin W := Canvas.TextWidth(Items[0] + 'X'); for I := 1 to Items.Count - 1 do begin L := Canvas.TextWidth(Items[I] + 'X'); if L > W then W := L; end; Result := W; W := Canvas.TextWidth(GetFontInfoText(0) + 'X'); for I := 1 to Items.Count - 1 do begin L := Canvas.TextWidth(GetFontInfoText(I) + 'X'); if L > W then W := L; end; end; Inc(Result, W + 2 + 8 + 3); end; procedure TdxMVReportLinkDesignWindow.lbxFontsClick(Sender: TObject); begin if LockControlsUpdate then Exit; UpdateControlsState; end; procedure TdxMVReportLinkDesignWindow.pmChangeFontPopup(Sender: TObject); begin miChangeFont.Enabled := btnChangeFont.Enabled; end; procedure TdxMVReportLinkDesignWindow.lbxFontsDblClick(Sender: TObject); begin if btnChangeFont.Enabled then btnChangeFont.Click; end; function TdxMVReportLinkDesignWindow.GetFontByIndex(AIndex: Integer): TFont; begin with ReportLink do case AIndex of 0: Result := Font; 1: Result := OddFont; 2: Result := EvenFont; 3: Result := CaptionNodeFont; 4: Result := GroupNodeFont; 5: Result := FooterFont; 6: Result := HeaderFont; else Result := ReportLink.PreviewFont; end; end; procedure TdxMVReportLinkDesignWindow.DoChangeFont(Index: Integer); var I: Integer; begin with dxPSGlbl.FontDialog do begin Font := GetFontByIndex(Index); if Execute then begin with lbxFonts do begin for I := 0 to Items.Count - 1 do if Selected[I] then GetFontByIndex(I).Assign(Font); end; lbxFonts.Refresh; UpdatePreview; Modified := True; end; end; end; procedure TdxMVReportLinkDesignWindow.dxMVPreviewGetContentStyle( Sender: TdxMasterViewLevel; Node: TdxMasterViewNode; Column: TdxMasterViewColumn; var NewStyle: TdxMasterViewStyle); begin if (ReportLink.DrawMode = mvdmOddEven) and not ReportLink.Transparent and Odd(Node.Index) then NewStyle := mvsAnotherContentStyle; end; procedure TdxMVReportLinkDesignWindow.PageControl1Change(Sender: TObject); begin lblPreviewWindow.Parent := TcxPageControl(Sender).ActivePage; end; procedure RegisterHelpers; begin TdxMasterViewColumnHelper.Register; TdxMasterViewImageColumnHelper.Register; end; procedure UnregisterHelpers; begin TdxColumnHelpersFactory.ReleaseInstance; end; procedure TdxMVReportLinkDesignWindow.lbxFontsDrawItem( AControl: TcxListBox; ACanvas: TcxCanvas; AIndex: Integer; ARect: TRect; AState: TOwnerDrawState); function GetMaxLength: Integer; var I: Integer; begin Result := 0; for I := 0 to AControl.Items.Count - 1 do Result := Max(Result, ACanvas.TextWidth(AControl.Items[I])); Inc(Result, 8); end; const FirstEntry: Boolean = True; FontColorMap: array[Boolean] of TColor = (clWindowText, clBtnFace); MaxLength: Integer = 0; var R: TRect; begin if FirstEntry then begin MaxLength := GetMaxLength; FirstEntry := False; end; ACanvas.SaveState; try R := ARect; R.Right := R.Left + MaxLength; ACanvas.Font.Color := FontColorMap[IsDisableIndex(AIndex)]; ACanvas.FillRect(ARect, clWindow); ACanvas.DrawTexT(AControl.Items.Strings[AIndex], cxRectInflate(R, -2, -2), cxAlignVCenter); R.Left := R.Right; Inc(R.Right); ACanvas.FillRect(R, clBtnShadow); R.Left := R.Right; R.Right := ARect.Right; ACanvas.Brush.Color := clWindow; ACanvas.DrawTexT(GetFontInfoText(AIndex), cxRectInflate(R, -2, -2), cxAlignVCenter); finally ACanvas.RestoreState; end; end; procedure TdxMVReportLinkDesignWindow.cbxDrawModePropertiesDrawItem( AControl: TcxCustomComboBox; ACanvas: TcxCanvas; AIndex: Integer; const ARect: TRect; AState: TOwnerDrawState); const ImageIndexMap: array[TdxMasterViewDrawMode] of Integer = (0, 1, 3); begin dxDrawComboBoxItem(ACanvas.Canvas, ARect, AControl.Properties.Items[AIndex], dxPSDrawModeImages, ImageIndexMap[TdxMasterViewDrawMode(AControl.Properties.Items.Objects[AIndex])], AState); end; initialization RegisterHelpers; dxPSRegisterReportLink(TdxMasterViewReportLink, TdxMasterView, TdxMVReportLinkDesignWindow); finalization dxPSUnregisterReportLink(TdxMasterViewReportLink, TdxMasterView, TdxMVReportLinkDesignWindow); UnregisterHelpers; end.