Componentes.Terceros.DevExp.../internal/x.42/2/ExpressPrinting System/Sources/dxPSfmCompositionDsg.pas

736 lines
22 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 dxPSfmCompositionDsg;
interface
{$I cxVer.inc}
uses
Windows, Messages, Classes, Graphics, Controls, Forms, StdCtrls, ImgList,
Menus, ExtCtrls, ComCtrls, dxPSCore;
type
TdxfmCompositionDesignWindow = class(TAbstractdxReportLinkDesignWindow)
pmItems: TPopupMenu;
miAdd: TMenuItem;
miDelete: TMenuItem;
miLine1: TMenuItem;
miMoveUp: TMenuItem;
miMoveDown: TMenuItem;
miLine2: TMenuItem;
miDesign: TMenuItem;
ilItems: TImageList;
btnClose: TButton;
pcItems: TPageControl;
tbsItems: TTabSheet;
lvItems: TListView;
btnHelp: TButton;
miRename: TMenuItem;
miSelectAll: TMenuItem;
N1: TMenuItem;
btnMoveDown: TButton;
btnMoveUp: TButton;
btnDesign: TButton;
btnDelete: TButton;
btnAdd: TButton;
pnlNoItems: TPanel;
procedure MoveUpClick(Sender: TObject);
procedure MoveDownClick(Sender: TObject);
procedure DeleteClick(Sender: TObject);
procedure DesignerClick(Sender: TObject);
procedure AddClick(Sender: TObject);
procedure pmItemsPopup(Sender: TObject);
procedure lvItemsDragDrop(Sender, Source: TObject; X, Y: Integer);
procedure lvItemsDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure lvItemsStartDrag(Sender: TObject; var DragObject: TDragObject);
procedure lvItemsChange(Sender: TObject; Item: TListItem; Change: TItemChange);
procedure lvItemsEdited(Sender: TObject; Item: TListItem; var S: String);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure lvItemsEditing(Sender: TObject; Item: TListItem;
var AllowEdit: Boolean);
procedure RenameClick(Sender: TObject);
procedure SelectAllClick(Sender: TObject);
procedure tbsItemsResize(Sender: TObject);
procedure FormResize(Sender: TObject);
private
FIsRefreshing: Boolean;
FListViewWndProc: TWndMethod;
FSaveDragIndex: Integer;
function GetActiveItem: TdxCompositionLinkItem;
function GetComposition: TdxCompositionReportLink;
function GetHasOnlyBuiltInsAreInSelection: Boolean;
function GetIsSelected(Index: Integer): Boolean;
function GetItem(Index: Integer): TdxCompositionLinkItem;
function GetItemCount: Integer;
function GetSelectedCount: Integer;
function GetShowDescription: Boolean;
procedure SetActiveItem(Value: TdxCompositionLinkItem);
procedure SetIsSelected(Index: Integer; Value: Boolean);
function CanAdd: Boolean;
function CanDelete: Boolean;
function CanDesign: Boolean;
function CanEdit: Boolean;
function CanMoveDown: Boolean;
function CanMoveUp: Boolean;
function CanRename: Boolean;
function CanSelectAll: Boolean;
procedure DeleteSelection;
function GetSelectedItemsAsString: string;
procedure MoveSelection(ADelta: Integer);
procedure RefreshColumns;
procedure RefreshList;
procedure ListViewWndProc(var Message: TMessage);
procedure SubClassListView;
procedure UnsubClassListView;
procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR;
protected
procedure BeforeConstruction; override;
procedure Initialize; override;
procedure LoadStrings; override;
procedure UpdateControlsState; override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure LoadFromRegistry(const APath: string); override;
procedure SaveToRegistry(const APath: string); override;
property ActiveItem: TdxCompositionLinkItem read GetActiveItem write SetActiveItem;
property Composition: TdxCompositionReportLink read GetComposition;
property HasOnlyBuiltInsAreInSelection: Boolean read GetHasOnlyBuiltInsAreInSelection;
property IsSelected[Index: Integer]: Boolean read GetIsSelected write SetIsSelected;
property ItemCount: Integer read GetItemCount;
property Items[Index: Integer]: TdxCompositionLinkItem read GetItem;
property SelectedCount: Integer read GetSelectedCount;
property ShowDescription: Boolean read GetShowDescription;
end;
implementation
{$R *.DFM}
uses
SysUtils, CommCtrl, cxClasses, dxPSRes, dxPSGlbl, dxPSUtl, dxPSForm,
dxPSPopupMan, dxPSfmCompositionAdd;
constructor TdxfmCompositionDesignWindow.Create(AOwner: TComponent);
begin
HelpContext := dxhcCompositionReportLinkDesigner;
inherited;
dxPSPopupMenuController.RegisterControl(lvItems);
SubClassListView;
end;
destructor TdxfmCompositionDesignWindow.Destroy;
begin
UnsubClassListView;
dxPSPopupMenuController.UnregisterControl(lvItems);
inherited;
end;
procedure TdxfmCompositionDesignWindow.LoadFromRegistry(const APath: string);
begin
inherited;
dxLoadListViewColumnsFromRegistry(lvItems, APath);
end;
procedure TdxfmCompositionDesignWindow.SaveToRegistry(const APath: string);
begin
inherited;
dxSaveListViewColumnsToRegistry(lvItems, APath);
end;
procedure TdxfmCompositionDesignWindow.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 TdxfmCompositionDesignWindow.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 TdxfmCompositionDesignWindow.MoveUpClick(Sender: TObject);
begin
MoveSelection(-1);
end;
procedure TdxfmCompositionDesignWindow.MoveDownClick(Sender: TObject);
begin
MoveSelection(1);
end;
procedure TdxfmCompositionDesignWindow.lvItemsChange(Sender: TObject;
Item: TListItem; Change: TItemChange);
begin
if (Change = ctState) and not FIsRefreshing then
UpdateControlsState;
end;
procedure TdxfmCompositionDesignWindow.DesignerClick(Sender: TObject);
begin
if CanDesign then
if ActiveItem.ReportLink.DesignReport then
Modified := True
else
UpdateControlsState;
end;
procedure TdxfmCompositionDesignWindow.AddClick(Sender: TObject);
var
Data: TdxAddItemsToCompositionDlgData;
I: Integer;
begin
FillChar(Data, SizeOf(TdxAddItemsToCompositionDlgData), 0);
Data.Composition := Composition;
if ShowDescription then
Data.Options := [caiShowDescription];
Data.Items := TList.Create;
try
if dxShowAddItemsToCompositionDlg(Data) then
begin
Modified := True;
if Data.Items.Count > 1 then Composition.Items.BeginUpdate;
try
for I := 0 to Data.Items.Count - 1 do
Composition.Items.AddLink(TBasedxReportLink(Data.Items[I]));
finally
if Data.Items.Count > 1 then Composition.Items.EndUpdate;
end;
RefreshList;
end;
finally
Data.Items.Free;
end;
end;
procedure TdxfmCompositionDesignWindow.DeleteClick(Sender: TObject);
begin
if not lvItems.IsEditing and
MessageQuestion(Format(cxGetResourceString(@sdxConfirmDeleteItem), [GetSelectedItemsAsString])) then
DeleteSelection;
end;
procedure TdxfmCompositionDesignWindow.RenameClick(Sender: TObject);
begin
if SelectedCount = 1 then
lvItems.Selected.EditCaption;
end;
procedure TdxfmCompositionDesignWindow.SelectAllClick(Sender: TObject);
var
I: Integer;
begin
lvItems.Items.BeginUpdate;
try
for I := 0 to lvItems.Items.Count - 1 do
lvItems.Items[I].Selected := True;
finally
lvItems.Items.EndUpdate;
end;
end;
procedure TdxfmCompositionDesignWindow.pmItemsPopup(Sender: TObject);
begin
miDesign.Enabled := CanDesign;
miAdd.Enabled := CanAdd;
miDelete.Enabled := CanDelete;
miRename.Enabled := CanRename;
miSelectAll.Enabled := CanSelectAll;
miMoveUp.Enabled := CanMoveUp;
miMoveDown.Enabled := CanMoveDown;
end;
procedure TdxfmCompositionDesignWindow.lvItemsEditing(Sender: TObject;
Item: TListItem; var AllowEdit: Boolean);
begin
AllowEdit := IsDesigning or not Items[Item.Index].BuiltIn;
if AllowEdit then
lvItems.PopupMenu := nil;
end;
procedure TdxfmCompositionDesignWindow.lvItemsEdited(Sender: TObject;
Item: TListItem; var S: string);
begin
Items[Item.Index].ReportLink.Caption := S;
end;
procedure TdxfmCompositionDesignWindow.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
begin
CanClose := not lvItems.IsEditing;
end;
procedure TdxfmCompositionDesignWindow.FormKeyDown(Sender: TObject;
var Key: Word; Shift: TShiftState);
begin
if (Key = VK_ESCAPE) or (Key = VK_RETURN) then
Close;
end;
procedure TdxfmCompositionDesignWindow.lvItemsDragDrop(Sender,
Source: TObject; X, Y: Integer);
begin
MoveSelection(FSaveDragIndex - TListView(Sender).ItemFocused.Index);
end;
procedure TdxfmCompositionDesignWindow.lvItemsDragOver(Sender,
Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
var
Item: TListItem;
begin
Accept := Sender = Source;
if Accept then
begin
Item := TListView(Sender).GetItemAt(X, Y);
Accept := (Item <> nil) and (FSaveDragIndex <> TListView(Sender).ItemFocused.Index);
if Item <> nil then
FSaveDragIndex := Item.Index
else
FSaveDragIndex := -1;
end;
end;
procedure TdxfmCompositionDesignWindow.lvItemsStartDrag(Sender: TObject;
var DragObject: TDragObject);
begin
FSaveDragIndex := -1;
end;
procedure TdxfmCompositionDesignWindow.BeforeConstruction;
begin
inherited;
Options := Options + [foSizeableDialog];
end;
procedure TdxfmCompositionDesignWindow.Initialize;
begin
inherited;
btnHelp.Visible := HelpContext <> 0;
if not btnHelp.Visible then
btnClose.BoundsRect := btnHelp.BoundsRect
else
BorderIcons := BorderIcons + [biHelp];
RefreshColumns;
RefreshList;
pnlNoItems.Parent := lvItems;
FormResize(nil);
tbsItemsResize(nil);
end;
procedure TdxfmCompositionDesignWindow.LoadStrings;
begin
inherited;
tbsItems.Caption := cxGetResourceString(@sdxItems);
pnlNoItems.Caption := cxGetResourceString(@sdxThereAreNowItemsForShow);
btnDesign.Caption := cxGetResourceString(@sdxBtnDesign);
btnAdd.Caption := AddEndEllipsis(cxGetResourceString(@sdxBtnAdd));
btnDelete.Caption := cxGetResourceString(@sdxBtnDelete);
btnMoveUp.Caption := cxGetResourceString(@sdxBtnMoveUp);
btnMoveDown.Caption := cxGetResourceString(@sdxBtnMoveDown);
btnClose.Caption := cxGetResourceString(@sdxBtnClose);
miDesign.Caption := cxGetResourceString(@sdxBtnDesign);
miAdd.Caption := AddEndEllipsis(cxGetResourceString(@sdxBtnAdd));
miDelete.Caption := cxGetResourceString(@sdxBtnDelete);
miRename.Caption := cxGetResourceString(@sdxRename);
miSelectAll.Caption := cxGetResourceString(@sdxSelectAll);
miMoveUp.Caption := cxGetResourceString(@sdxBtnMoveUp);
miMoveDown.Caption := cxGetResourceString(@sdxBtnMoveDown);
end;
procedure TdxfmCompositionDesignWindow.UpdateControlsState;
begin
pnlNoItems.Visible := ItemCount = 0;
btnDesign.Enabled := CanDesign;
btnAdd.Enabled := CanAdd;
btnDelete.Enabled := CanDelete;
btnMoveUp.Enabled := CanMoveUp;
btnMoveDown.Enabled := CanMoveDown;
end;
function TdxfmCompositionDesignWindow.GetActiveItem: TdxCompositionLinkItem;
begin
if SelectedCount = 1 then
Result := TdxCompositionLinkItem(lvItems.Selected.Data)
else
Result := nil;
end;
function TdxfmCompositionDesignWindow.GetComposition: TdxCompositionReportLink;
begin
Result := TdxCompositionReportLink(ReportLink);
end;
function TdxfmCompositionDesignWindow.GetHasOnlyBuiltInsAreInSelection: Boolean;
var
I: Integer;
begin
Result := False;
for I := 0 to ItemCount - 1 do
if IsSelected[I] and not Items[I].BuiltIn then
Exit;
Result := True;
end;
function TdxfmCompositionDesignWindow.GetIsSelected(Index: Integer): Boolean;
begin
Result := lvItems.Items[Index].Selected;
end;
function TdxfmCompositionDesignWindow.GetItem(Index: Integer): TdxCompositionLinkItem;
begin
Result := TdxCompositionLinkItem(lvItems.Items[Index].Data);
end;
function TdxfmCompositionDesignWindow.GetItemCount: Integer;
begin
Result := lvItems.Items.Count;
end;
function TdxfmCompositionDesignWindow.GetSelectedCount: Integer;
begin
Result := lvItems.SelCount;
end;
function TdxfmCompositionDesignWindow.GetShowDescription: Boolean;
begin
Result := (Composition <> nil) and (coShowDescription in Composition.DesignerOptions);
end;
procedure TdxfmCompositionDesignWindow.SetActiveItem(Value: TdxCompositionLinkItem);
var
I: Integer;
Item: TListItem;
begin
for I := 0 to lvItems.Items.Count - 1 do
begin
Item := lvItems.Items[I];
if Item.Selected then Item.Selected := False;
end;
Item := lvItems.FindData(0, Value, True, True);
if Item <> nil then
begin
Item.Selected := True;
Item.Focused := True;
end;
end;
procedure TdxfmCompositionDesignWindow.SetIsSelected(Index: Integer; Value: Boolean);
begin
lvItems.Items[Index].Selected := Value;
end;
function TdxfmCompositionDesignWindow.CanAdd: Boolean;
begin
Result := CanEdit;
end;
function TdxfmCompositionDesignWindow.CanDelete: Boolean;
begin
Result := not lvItems.IsEditing and CanEdit and (SelectedCount <> 0) and
(IsDesigning or not HasOnlyBuiltInsAreInSelection);
end;
function TdxfmCompositionDesignWindow.CanDesign: Boolean;
begin
Result := (SelectedCount = 1) and ActiveItem.ReportLink.CheckToDesign;
end;
function TdxfmCompositionDesignWindow.CanEdit: Boolean;
begin
Result := (Composition <> nil) and (coCanEdit in Composition.DesignerOptions);
end;
function TdxfmCompositionDesignWindow.CanMoveDown: Boolean;
var
I, Counter: Integer;
begin
if CanEdit then
begin
Counter := 0;
for I := ItemCount - 1 downto 0 do
begin
if not IsSelected[I] then
begin
Result := Counter < SelectedCount;
Exit;
end;
Inc(Counter);
end;
end;
Result := False;
end;
function TdxfmCompositionDesignWindow.CanMoveUp: Boolean;
var
I: Integer;
begin
if CanEdit then
for I := 0 to ItemCount - 1 do
if not IsSelected[I] then
begin
Result := I < SelectedCount;
Exit;
end;
Result := False;
end;
function TdxfmCompositionDesignWindow.CanRename: Boolean;
begin
Result := (SelectedCount = 1) and (IsDesigning or not ActiveItem.BuiltIn);
end;
function TdxfmCompositionDesignWindow.CanSelectAll: Boolean;
begin
Result := (ItemCount <> 0) and (SelectedCount <> ItemCount);
end;
procedure TdxfmCompositionDesignWindow.DeleteSelection;
var
SelCount, I: Integer;
begin
SelCount := SelectedCount;
if SelCount > 1 then Composition.Items.BeginUpdate;
try
for I := 0 to ItemCount - 1 do
if IsSelected[I] and (IsDesigning or not Items[I].BuiltIn) then
TObject(lvItems.Items[I].Data).Free;
finally
if SelCount > 1 then Composition.Items.EndUpdate;
end;
RefreshList;
Modified := True;
end;
function TdxfmCompositionDesignWindow.GetSelectedItemsAsString: string;
var
I: Integer;
begin
Result := '';
for I := 0 to ItemCount - 1 do
if IsSelected[I] and (IsDesigning or not Items[I].BuiltIn) then
begin
if Result <> '' then
Result := Result + ', ';
Result := Result + '"' + lvItems.Items[I].Caption + '"';
end;
end;
procedure TdxfmCompositionDesignWindow.MoveSelection(ADelta: Integer);
procedure MoveDown(ADelta: Integer);
var
I, Index: Integer;
begin
for I := ItemCount - 1 downto 0 do
if IsSelected[I] then
begin
Index := Items[I].Index;
Inc(Index, ADelta);
if Index > ItemCount - 1 then Index := ItemCount - 1;
// while (Index < ItemCount) and IsSelected[Index] do Inc(Index);
Items[I].Index := Index;
end;
end;
procedure MoveUp(ADelta: Integer);
var
I, Index: Integer;
begin
for I := 0 to ItemCount - 1 do
if IsSelected[I] then
begin
Index := Items[I].Index;
Inc(Index, ADelta);
if Index < 0 then Index := 0;
// while (Index > -1) and IsSelected[Index] do Dec(Index);
Items[I].Index := Index;
end;
end;
begin
Composition.Items.BeginUpdate;
try
if ADelta > 0 then
MoveDown(ADelta)
else
MoveUp(ADelta);
finally
Composition.Items.EndUpdate;
end;
RefreshList;
end;
procedure TdxfmCompositionDesignWindow.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 * //+ Ord(not(coShowDescription in Composition.DesignerOptions))) *
(lvItems.Width - GetSystemMetrics(SM_CXHSCROLL)) div 3 - 3;
Caption := cxGetResourceString(@sdxItemName);
end;
if coShowDescription in Composition.DesignerOptions then
with lvItems.Columns.Add do
begin
Width := (lvItems.Width - GetSystemMetrics(SM_CXHSCROLL)) div 3 - 3;
Caption := cxGetResourceString(@sdxItemDescription);
end;
for I := 0 to Min(lvItems.Columns.Count - 1, Length(ColumnWidths) - 1) do
lvItems.Columns[I].Width := ColumnWidths[I];
finally
lvItems.Columns.EndUpdate;
end;
end;
procedure TdxfmCompositionDesignWindow.RefreshList;
const
Styles: array[Boolean] of TViewStyle = (vsReport, vsList);
var
Selection: TList;
I: Integer;
Strings: TStrings;
begin
lvItems.Items.BeginUpdate;
FIsRefreshing := True;
try
Selection := TList.Create;
try
dxSaveListViewSelection(lvItems, Selection);
Strings := TStringList.Create;
try
lvItems.Items.Clear;
if Composition <> nil then
Composition.GetItems(Strings, True);
for I := 0 to Strings.Count - 1 do
with lvItems.Items.Add do
begin
Caption := Strings[I];
Data := Strings.Objects[I];
SubItems.Add(TdxCompositionLinkItem(Data).ReportLink.Description);
end;
finally
Strings.Free;
end;
dxRestoreListViewSelection(lvItems, Selection);
finally
Selection.Free;
end;
lvItems.ViewStyle := Styles[ItemCount = 0];
// lvItems.Enabled := not FNoItemsState;
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 TdxfmCompositionDesignWindow.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 TdxfmCompositionDesignWindow.SubClassListView;
begin
lvItems.HandleNeeded;
FListViewWndProc := lvItems.WindowProc;
lvItems.WindowProc := ListViewWndProc;
end;
procedure TdxfmCompositionDesignWindow.UnsubClassListView;
begin
lvItems.WindowProc := FListViewWndProc;
end;
procedure TdxfmCompositionDesignWindow.CMDialogChar(var Message: TCMDialogChar);
begin
inherited;
if IsAccel(Message.CharCode, tbsItems.Caption) then
begin
Message.Result := 1;
if lvItems.Enabled then ActiveControl := lvItems;
end;
end;
end.