Componentes.Terceros.DevExp.../internal/x.46/2/ExpressPrinting System/Sources/dxPSCPDsg.pas

677 lines
20 KiB
ObjectPascal

{*******************************************************************}
{ }
{ Developer Express Visual Component Library }
{ ExpressPrinting System(tm) COMPONENT SUITE }
{ }
{ Copyright (C) 1998-2009 Developer Express Inc. }
{ ALL RIGHTS RESERVED }
{ }
{ The entire contents of this file is protected by U.S. and }
{ International Copyright Laws. Unauthorized reproduction, }
{ reverse-engineering, and distribution of all or any portion of }
{ the code contained in this file is strictly prohibited and may }
{ result in severe civil and criminal penalties and will be }
{ prosecuted to the maximum extent possible under the law. }
{ }
{ RESTRICTIONS }
{ }
{ THIS SOURCE CODE AND ALL RESULTING INTERMEDIATE FILES }
{ (DCU, OBJ, DLL, ETC.) ARE CONFIDENTIAL AND PROPRIETARY TRADE }
{ SECRETS OF DEVELOPER EXPRESS INC. THE REGISTERED DEVELOPER IS }
{ LICENSED TO DISTRIBUTE THE EXPRESSPRINTINGSYSTEM AND }
{ ALL ACCOMPANYING VCL CONTROLS AS PART OF AN }
{ EXECUTABLE PROGRAM ONLY. }
{ }
{ THE SOURCE CODE CONTAINED WITHIN THIS FILE AND ALL RELATED }
{ FILES OR ANY PORTION OF ITS CONTENTS SHALL AT NO TIME BE }
{ COPIED, TRANSFERRED, SOLD, DISTRIBUTED, OR OTHERWISE MADE }
{ AVAILABLE TO OTHER INDIVIDUALS WITHOUT EXPRESS WRITTEN CONSENT }
{ AND PERMISSION FROM DEVELOPER EXPRESS INC. }
{ }
{ CONSULT THE END USER LICENSE AGREEMENT FOR INFORMATION ON }
{ ADDITIONAL RESTRICTIONS. }
{ }
{*******************************************************************}
unit dxPSCPDsg;
interface
{$I cxVer.inc}
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, ComCtrls, ImgList, Menus, dxPSCore, dxPSForm;
type
TdxfmCPDesignerOption = (doShowDescription);
TdxfmCPDesignerOptions = set of TdxfmCPDesignerOption;
TdxfmCPDesigner = class(TCustomdxPSForm)
pmItems: TPopupMenu;
miDesign: TMenuItem;
miLine2: TMenuItem;
miAdd: TMenuItem;
miDelete: TMenuItem;
ilItems: TImageList;
btnClose: TButton;
btnHelp: TButton;
pcItems: TPageControl;
tbsItems: TTabSheet;
lvItems: TListView;
pnlButtons: TPanel;
btnDesign: TButton;
btnAdd: TButton;
btnDelete: TButton;
btnPageSetup: TButton;
btnPrintPreview: TButton;
btnPrint: TButton;
miPageSetup: TMenuItem;
miPrintPreview: TMenuItem;
miPrint: TMenuItem;
miLine1: TMenuItem;
miRename: TMenuItem;
btnAddComposition: TButton;
miAddComposition: TMenuItem;
pnlNoItems: TPanel;
procedure lvItemsChange(Sender: TObject; Item: TListItem; Change: TItemChange);
procedure AddClick(Sender: TObject);
procedure AddCompositionClick(Sender: TObject);
procedure DeleteClick(Sender: TObject);
procedure pmItemsPopup(Sender: TObject);
procedure DesignClick(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure lvItemsEdited(Sender: TObject; Item: TListItem; var S: String);
procedure lvItemsEditing(Sender: TObject; Item: TListItem; var AllowEdit: Boolean);
procedure lvItemsDblClick(Sender: TObject);
procedure PageSetupClick(Sender: TObject);
procedure PrintPreviewClick(Sender: TObject);
procedure PrintClick(Sender: TObject);
procedure RenameClick(Sender: TObject);
procedure tbsItemsResize(Sender: TObject);
procedure FormResize(Sender: TObject);
private
FComponentPrinter: TdxComponentPrinter;
FIsRefreshing: Boolean;
FListViewWndProc: TWndMethod;
FOptions: TdxfmCPDesignerOptions;
function GetCurrentLink: TBasedxReportLink;
function GetItem(Index: Integer): TBasedxReportLink;
function GetItemCount: Integer;
function GetSelected(Index: Integer): Boolean;
function GetSelectedCount: Integer;
procedure SetCurrentLink(Value: TBasedxReportLink);
procedure SetSelected(Index: Integer; Value: Boolean);
function CanAdd: Boolean;
function CanAddComposition: Boolean;
function CanDelete: Boolean;
function CanDesign: Boolean;
function CanPageSetup: Boolean;
function CanPrint: Boolean;
function CanPrintPreview: Boolean;
function CanRename: Boolean;
procedure DeleteSelection;
function GetSelectedItemsAsString: string;
function HasOnlyBuiltInsAreInSelection: Boolean;
procedure Initialize;
procedure LoadStrings;
procedure RefreshColumns;
procedure RefreshList;
procedure UpdateControlsState;
procedure ListViewWndProc(var Message: TMessage);
procedure SubClassListView;
procedure UnsubClassListView;
procedure CMDialogChar(var Msg: TCMDialogChar); message CM_DIALOGCHAR;
protected
procedure BeforeConstruction; override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Execute;
procedure LoadFromRegistry(const APath: string); override;
procedure SaveToRegistry(const APath: string); override;
property ComponentPrinter: TdxComponentPrinter read FComponentPrinter write FComponentPrinter;
property CurrentLink: TBasedxReportLink read GetCurrentLink write SetCurrentLink;
property ItemCount: Integer read GetItemCount;
property Items[Index: Integer]: TBasedxReportLink read GetItem;
property Selected[Index: Integer]: Boolean read GetSelected write SetSelected;
property SelectedCount: Integer read GetSelectedCount;
end;
PdxCPDesignerDlgData = ^TdxCPDesignerDlgData;
TdxCPDesignerDlgData = record
ComponentPrinter: TdxComponentPrinter;
Options: TdxfmCPDesignerOptions;
end;
procedure dxShowCPDesignerDlg(const AData: TdxCPDesignerDlgData);
implementation
{$R *.DFM}
uses
Math, CommCtrl, cxClasses, dxPSGlbl, dxPSUtl, dxPSRes, dxPSPopupMan,
dxPSfmLnkAdd, dxPSCompsProvider;
procedure dxShowCPDesignerDlg(const AData: TdxCPDesignerDlgData);
var
Dialog: TdxfmCPDesigner;
begin
if AData.ComponentPrinter = nil then Exit;
Dialog := TdxfmCPDesigner.Create(nil);
try
Dialog.ComponentPrinter := AData.ComponentPrinter;
Dialog.FOptions := AData.Options;
Dialog.Execute;
finally
Dialog.Free;
end;
end;
{ TdxfmCPDesigner }
procedure TdxfmCPDesigner.FormResize(Sender: TObject);
const
BtnOffsetY = 6;
var
BtnOffsetX, RightOrigin, TopOrigin: Integer;
begin
BtnOffsetX := pcItems.Left;
RightOrigin := BtnOffsetX + pcItems.Width;
TopOrigin := pcItems.Top + pcItems.Height + BtnOffsetY;
dxPSUtl.PlaceButtons([btnHelp, btnClose], BtnOffsetX, RightOrigin, TopOrigin);
end;
procedure TdxfmCPDesigner.tbsItemsResize(Sender: TObject);
var
R: TRect;
begin
R := lvItems.ClientRect;
InflateRect(R, -3, -3);
with R do
begin
Top := (Bottom - Top - pnlNoItems.Height) div 2;
Bottom := Top + pnlNoItems.Height;
end;
pnlNoItems.BoundsRect := R;
end;
procedure TdxfmCPDesigner.lvItemsChange(Sender: TObject; Item: TListItem;
Change: TItemChange);
begin
if (Change = ctState) and not FIsRefreshing then
UpdateControlsState;
end;
procedure TdxfmCPDesigner.pmItemsPopup(Sender: TObject);
begin
miAdd.Enabled := CanAdd;
miAddComposition.Enabled := CanAddComposition;
miDelete.Enabled := CanDelete;
miRename.Enabled := CanRename;
miDesign.Enabled := CanDesign;
miPageSetup.Enabled := CanPageSetup;
miPrint.Enabled := CanPrint;
miPrintPreview.Enabled := CanPrintPreview;
end;
procedure TdxfmCPDesigner.AddClick(Sender: TObject);
var
Data: TdxAddReportLinkDlgData;
I: Integer;
Component: TComponent;
LinkClass: TdxReportLinkClass;
Link: TBasedxReportLink;
begin
FillChar(Data, SizeOf(TdxAddReportLinkDlgData), 0);
Data.Components := TList.Create;
try
Data.ComponentPrinter := FComponentPrinter;
Data.Options := [adoShowDesignButton, adoShowDescriptionColumn, adoAllowMultiSelect, adoShowCaptionEdit];
Data.ReportLinkCaption := cxGetResourceString(@sdxNewReport);
if dxShowAddComponentsDlg(Data) then
for I := 0 to Data.Components.Count - 1 do
begin
Component := TComponent(Data.Components[I]);
LinkClass := dxPSLinkClassByCompClass(TComponentClass(Component.ClassType));
if LinkClass <> nil then
begin
Link := ComponentPrinter.AddLink(Component);
Link.Caption := Data.ReportLinkCaption;
Link.Description := Data.ReportLinkDescription;
if Data.Components.Count = 1 then
Link.Name := Data.ReportLinkName;
RefreshList;
CurrentLink := Link;
if Data.DesignBtnPressed then
ComponentPrinter.DesignReport(Link);
end;
end;
finally
Data.Components.Free;
end;
end;
procedure TdxfmCPDesigner.AddCompositionClick(Sender: TObject);
var
Link: TBasedxReportLink;
begin
Link := ComponentPrinter.AddEmptyLink(TdxCompositionReportLink);
Link.Caption := cxGetResourceString(@sdxNewCompositionCaption);
RefreshList;
CurrentLink := Link;
RenameClick(nil);
end;
procedure TdxfmCPDesigner.DeleteClick(Sender: TObject);
begin
if not lvItems.IsEditing and
MessageQuestion(Format(cxGetResourceString(@sdxConfirmDeleteItem), [GetSelectedItemsAsString])) then
DeleteSelection;
end;
procedure TdxfmCPDesigner.RenameClick(Sender: TObject);
begin
if SelectedCount = 1 then
lvItems.Selected.EditCaption;
end;
procedure TdxfmCPDesigner.DesignClick(Sender: TObject);
begin
if CurrentLink.DesignReport then
RefreshList
else
UpdateControlsState;
end;
procedure TdxfmCPDesigner.PageSetupClick(Sender: TObject);
begin
CurrentLink.PageSetup;
end;
procedure TdxfmCPDesigner.PrintPreviewClick(Sender: TObject);
begin
CurrentLink.Preview(True);
end;
procedure TdxfmCPDesigner.PrintClick(Sender: TObject);
begin
CurrentLink.Print(True, nil);
end;
procedure TdxfmCPDesigner.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose := not lvItems.IsEditing;
end;
procedure TdxfmCPDesigner.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (Key = VK_ESCAPE) or (Key = VK_RETURN) then Close;
end;
procedure TdxfmCPDesigner.lvItemsEditing(Sender: TObject; Item: TListItem;
var AllowEdit: Boolean);
begin
AllowEdit := not Items[Item.Index].BuiltIn;
if AllowEdit then
lvItems.PopupMenu := nil;
end;
procedure TdxfmCPDesigner.lvItemsEdited(Sender: TObject; Item: TListItem;
var S: string);
begin
Items[Item.Index].Caption := S;
end;
procedure TdxfmCPDesigner.lvItemsDblClick(Sender: TObject);
begin
if SelectedCount = 1 then btnDesign.Click;
end;
constructor TdxfmCPDesigner.Create(AOwner: TComponent);
begin
inherited;
HelpContext := dxPSGlbl.dxhcAddComponentsToComponentPrinterDlg;
dxPSPopupMenuController.RegisterControl(lvItems);
SubClassListView;
end;
destructor TdxfmCPDesigner.Destroy;
begin
UnsubClassListView;
dxPSPopupMenuController.UnregisterControl(lvItems);
inherited;
end;
procedure TdxfmCPDesigner.Execute;
begin
Initialize;
ShowModal;
end;
procedure TdxfmCPDesigner.LoadFromRegistry(const APath: string);
begin
inherited;
dxPSUtl.dxLoadListViewColumnsFromRegistry(lvItems, APath);
end;
procedure TdxfmCPDesigner.SaveToRegistry(const APath: string);
begin
inherited;
dxPSUtl.dxSaveListViewColumnsToRegistry(lvItems, APath);
end;
procedure TdxfmCPDesigner.BeforeConstruction;
begin
inherited;
Options := Options + [foSizeableDialog];
end;
function TdxfmCPDesigner.CanDesign: Boolean;
begin
Result := (SelectedCount = 1) and (CurrentLink <> nil) and CurrentLink.CheckToDesign;
end;
function TdxfmCPDesigner.CanPageSetup: Boolean;
begin
Result := (SelectedCount = 1) and (CurrentLink <> nil);
end;
function TdxfmCPDesigner.CanPrint: Boolean;
begin
Result := (SelectedCount = 1) and (CurrentLink <> nil) and CurrentLink.DataProviderPresent;
end;
function TdxfmCPDesigner.CanPrintPreview: Boolean;
begin
Result := (SelectedCount = 1) and (CurrentLink <> nil) and CurrentLink.DataProviderPresent;
end;
function TdxfmCPDesigner.CanRename: Boolean;
begin
Result := (SelectedCount = 1) and (CurrentLink <> nil) and not CurrentLink.BuiltIn;
end;
procedure TdxfmCPDesigner.DeleteSelection;
var
I: Integer;
begin
for I := 0 to ItemCount - 1 do
if Selected[I] and not Items[I].BuiltIn then
TObject(lvItems.Items[I].Data).Free;
RefreshList;
end;
function TdxfmCPDesigner.GetCurrentLink: TBasedxReportLink;
begin
if SelectedCount = 1 then
Result := TBasedxReportLink(lvItems.Selected.Data)
else
Result := nil;
end;
function TdxfmCPDesigner.GetItem(Index: Integer): TBasedxReportLink;
begin
Result := TBasedxReportLink(lvItems.Items[Index].Data);
end;
function TdxfmCPDesigner.GetItemCount: Integer;
begin
Result := lvItems.Items.Count;
end;
function TdxfmCPDesigner.GetSelected(Index: Integer): Boolean;
begin
Result := lvItems.Items[Index].Selected;
end;
function TdxfmCPDesigner.GetSelectedCount: Integer;
begin
Result := lvItems.SelCount;
end;
procedure TdxfmCPDesigner.SetCurrentLink(Value: TBasedxReportLink);
var
ListItem: TListItem;
I: Integer;
begin
ListItem := lvItems.FindData(0, Value, True, True);
if ListItem <> nil then
begin
lvItems.Items.BeginUpdate;
try
for I := 0 To ItemCount - 1 do
Selected[I] := False;
lvItems.Selected := ListItem;
finally
lvItems.Items.EndUpdate;
end;
end;
end;
procedure TdxfmCPDesigner.SetSelected(Index: Integer; Value: Boolean);
begin
lvItems.Items[Index].Selected := Value;
end;
function TdxfmCPDesigner.CanAdd: Boolean;
begin
Result := True;
end;
function TdxfmCPDesigner.CanAddComposition: Boolean;
begin
Result := True;
end;
function TdxfmCPDesigner.CanDelete: Boolean;
begin
Result := (SelectedCount <> 0) and not HasOnlyBuiltInsAreInSelection;
end;
procedure TdxfmCPDesigner.LoadStrings;
begin
Caption := cxGetResourceString(@sdxEditReports);
tbsItems.Caption := cxGetResourceString(@sdxItems);
pnlNoItems.Caption := cxGetResourceString(@sdxThereAreNowItemsForShow);
btnAdd.Caption := AddEndEllipsis(cxGetResourceString(@sdxBtnAdd));
btnAddComposition.Caption := cxGetResourceString(@sdxBtnAddComposition);
btnDelete.Caption := cxGetResourceString(@sdxBtnDelete);
btnDesign.Caption := cxGetResourceString(@sdxBtnDesign);
btnPageSetup.Caption := cxGetResourceString(@sdxBtnPageSetup);
btnPrint.Caption := cxGetResourceString(@sdxBtnPrint);
btnPrintPreview.Caption := cxGetResourceString(@sdxBtnPreview);
btnClose.Caption := cxGetResourceString(@sdxBtnClose);
btnHelp.Caption := cxGetResourceString(@sdxBtnHelp);
miAdd.Caption := AddEndEllipsis(cxGetResourceString(@sdxBtnAdd));
miAddComposition.Caption := cxGetResourceString(@sdxBtnAddComposition);
miDelete.Caption := cxGetResourceString(@sdxBtnDelete);
miRename.Caption := cxGetResourceString(@sdxRename);
miDesign.Caption := cxGetResourceString(@sdxBtnDesign);
miPageSetup.Caption := cxGetResourceString(@sdxBtnPageSetup);
miPrint.Caption := cxGetResourceString(@sdxBtnPrint);
miPrintPreview.Caption := cxGetResourceString(@sdxBtnPreview);
end;
function TdxfmCPDesigner.GetSelectedItemsAsString: string;
var
I: Integer;
begin
Result := '';
for I := 0 to ItemCount - 1 do
if Selected[I] and not Items[I].BuiltIn then
begin
if Result <> '' then Result := Result + ', ';
Result := Result + '"' + lvItems.Items[I].Caption + '"';
end;
end;
function TdxfmCPDesigner.HasOnlyBuiltInsAreInSelection: Boolean;
var
I: Integer;
begin
Result := False;
for I := 0 to ItemCount - 1 do
if Selected[I] and not Items[I].BuiltIn then
Exit;
Result := True;
end;
procedure TdxfmCPDesigner.Initialize;
begin
if HelpContext <> 0 then
BorderIcons := BorderIcons + [biHelp];
btnHelp.Visible := HelpContext <> 0;
if not btnHelp.Visible then
btnClose.BoundsRect := btnHelp.BoundsRect;
LoadStrings;
RefreshColumns;
RefreshList;
pnlNoItems.Parent := lvItems;
FormResize(nil);
tbsItemsResize(nil);
end;
procedure TdxfmCPDesigner.RefreshColumns;
var
ColumnWidths: array of Integer;
I: Integer;
begin
lvItems.Columns.BeginUpdate;
try
SetLength(ColumnWidths, lvItems.Columns.Count);
for I := 0 to lvItems.Columns.Count - 1 do
ColumnWidths[I] := lvItems.Columns[I].Width;
lvItems.Columns.Clear;
with lvItems.Columns.Add do
begin
Width := 2 * (lvItems.Width - GetSystemMetrics(SM_CXHSCROLL) - 2) div 3;
Caption := cxGetResourceString(@sdxItemName);
end;
if doShowDescription in FOptions then
with lvItems.Columns.Add do
begin
Width := (lvItems.Width - GetSystemMetrics(SM_CXHSCROLL) - 2) div 3;
Caption := cxGetResourceString(@sdxItemDescription);
end;
for I := 0 to MinIntValue([lvItems.Columns.Count - 1, Length(ColumnWidths) - 1]) do
lvItems.Columns[I].Width := ColumnWidths[I];
finally
lvItems.Columns.EndUpdate;
end;
end;
procedure TdxfmCPDesigner.RefreshList;
const
ViewStyles: array[Boolean] of TViewStyle = (vsReport, vsList);
var
Selection: TList;
I: Integer;
ReportLink: TBasedxReportLink;
begin
lvItems.Items.BeginUpdate;
FIsRefreshing := True;
try
Selection := TList.Create;
try
dxPSUtl.dxSaveListViewSelection(lvItems, Selection);
lvItems.Items.Clear;
for I := 0 to ComponentPrinter.LinkCount - 1 do
begin
ReportLink := ComponentPrinter[I];
with lvItems.Items.Add do
begin
Caption := ReportLink.Caption;
Data := ReportLink;
SubItems.Add(ReportLink.Description);
end;
end;
dxPSUtl.dxRestoreListViewSelection(lvItems, Selection);
finally
Selection.Free;
end;
lvItems.ViewStyle := ViewStyles[ItemCount = 0];
lvItems.Enabled := ItemCount <> 0;
lvItems.HideSelection := ItemCount = 0;
if (lvItems.SelCount = 0) and (ItemCount <> 0) then
lvItems.Selected := lvItems.Items[0];
finally
FIsRefreshing := False;
lvItems.Items.EndUpdate;
end;
UpdateControlsState;
lvItems.Refresh;
end;
procedure TdxfmCPDesigner.UpdateControlsState;
begin
pnlNoItems.Visible := ItemCount = 0;
btnAdd.Enabled := CanAdd;
btnAddComposition.Enabled := CanAddComposition;
btnDelete.Enabled := CanDelete;
btnDesign.Enabled := CanDesign;
btnPageSetup.Enabled := CanPageSetup;
btnPrint.Enabled := CanPrint;
btnPrintPreview.Enabled := CanPrintPreview;
end;
procedure TdxfmCPDesigner.ListViewWndProc(var Message: TMessage);
begin
FListViewWndProc(Message);
if Message.Msg = CN_NOTIFY then
if TWMNotify(Message).NMHdr^.code = LVN_ENDLABELEDIT then
lvItems.PopupMenu := pmItems;
end;
procedure TdxfmCPDesigner.SubClassListView;
begin
lvItems.HandleNeeded;
FListViewWndProc := lvItems.WindowProc;
lvItems.WindowProc := ListViewWndProc;
end;
procedure TdxfmCPDesigner.UnsubClassListView;
begin
lvItems.WindowProc := FListViewWndProc;
end;
procedure TdxfmCPDesigner.CMDialogChar(var Msg: TCMDialogChar);
begin
inherited;
if IsAccel(Msg.CharCode, tbsItems.Caption) then
begin
Msg.Result := 1;
if lvItems.Enabled and lvItems.CanFocus then
ActiveControl := lvItems;
end;
end;
end.