Componentes.Terceros.DevExp.../official/x.35/ExpressPrinting System/Sources/dxPSfmLnkAdde.pas
2008-05-12 15:08:14 +00:00

732 lines
22 KiB
ObjectPascal

{*******************************************************************}
{ }
{ Developer Express Visual Component Library }
{ ExpressPrinting System(tm) COMPONENT SUITE }
{ }
{ Copyright (C) 1998-2008 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 dxPSfmLnkAddE;
interface
{$I cxVer.inc}
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, StdCtrls, Registry,
Menus, Forms, ComCtrls, ExtCtrls, ImgList, dxPSCore, dxPSForm;
type
TSortOrder = (soNone, soUp, soDown);
TdxfmAddReportLinkClass = class(TCustomdxPSForm)
btnOK: TButton;
btnCancel: TButton;
btnHelp: TButton;
ilLinks: TImageList;
btnDesign: TButton;
pmLinks: TPopupMenu;
miSelect: TMenuItem;
miDesign: TMenuItem;
miLine1: TMenuItem;
pnlHost: TPanel;
pnlNameHost: TPanel;
lblName: TLabel;
edName: TEdit;
pnlCaptionHost: TPanel;
lblCaption: TLabel;
edCaption: TEdit;
pnlSeparatorHost: TPanel;
bvlSeparator: TBevel;
pgctrlItems: TPageControl;
tbsItems: TTabSheet;
lvItems: TListView;
pnlCreatorHost: TPanel;
lblCreator: TLabel;
edCreator: TEdit;
btnDescription: TButton;
ilColumns: TImageList;
procedure btnHelpClick(Sender: TObject);
procedure lvItemsDblClick(Sender: TObject);
procedure lvItemsColumnClick(Sender: TObject; Column: TListColumn);
procedure lvItemsCompare(Sender: TObject; Item1, Item2: TListItem;
Data: Integer; var Compare: Integer);
procedure FormResize(Sender: TObject);
procedure btnDesignClick(Sender: TObject);
procedure pmLinksPopup(Sender: TObject);
procedure lvItemsChange(Sender: TObject; Item: TListItem; Change: TItemChange);
procedure btnDescriptionClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure lvItemsCustomDrawItem(Sender: TCustomListView;
Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
private
FDesignBtnPressed: Boolean;
{$IFDEF DELPHI5}
FPrevListViewWndProc: TWndMethod;
{$ENDIF}
FReportLinkDescription: string;
FSortedColumnIndex: Integer;
FSortOrder: TSortOrder;
function GetListViewHeader: HWND;
function GetReportLinkCaption: string;
function GetReportLinkCreator: string;
function GetReportLinkName: string;
function GetSelectedReportLinkClass: TdxReportLinkClass;
procedure SetReportLinkCaption(const Value: string);
procedure SetReportLinkCreator(Value: string);
procedure SetReportLinkName(const Value: string);
function CanEditCaption: Boolean;
function CanEditCreator: Boolean;
function CanEditDescription: Boolean;
function CanEditName: Boolean;
function CanDesign: Boolean;
function CanSelect: Boolean;
procedure Initialize;
procedure RefreshList;
procedure SetActiveControl;
{$IFDEF DELPHI5}
procedure SetColumnSortMark(AIndex: Integer; ASortOrder: TSortOrder);
{$ENDIF}
procedure SortColumn(Column: TListColumn; ASortOrder: TSortOrder);
procedure RefreshSorting;
procedure UpdateControlsState;
{$IFDEF DELPHI5}
procedure AssignListViewHeaderImages;
procedure ListViewWndProc(var Message: TMessage);
procedure RestoreListViewWndProc;
procedure SubstituteListViewWndProc;
{$ENDIF}
procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR;
protected
procedure CreateWnd; override;
procedure BeforeConstruction; override;
procedure LoadSorting(const APath: string);
procedure SaveSorting(const APath: string);
property ListViewHeader: HWND read GetListViewHeader;
public
function Execute: Boolean;
procedure LoadFromRegistry(const APath: string); override;
procedure SaveToRegistry(const APath: string); override;
property ReportLinkCaption: string read GetReportLinkCaption write SetReportLinkCaption;
property ReportLinkCreator: string read GetReportLinkCreator write SetReportLinkCreator;
property ReportLinkDescription: string read FReportLinkDescription write FReportLinkDescription;
property ReportLinkName: string read GetReportLinkName write SetReportLinkName;
property SelectedReportLinkClass: TdxReportLinkClass read GetSelectedReportLinkClass;
end;
PdxAddReportLinkClassDlgData = ^TdxAddReportLinkClassDlgData;
TdxAddReportLinkClassDlgData = record
ReportLinkClass: TdxReportLinkClass;
ReportLinkName: string;
ReportLinkCaption: string;
ReportLinkCreator: string;
ReportLinkDescription: string;
DesignBtnPressed: Boolean;
HelpContext: THelpContext;
end;
function dxShowAddReportLinkClassDlg(var AData: TdxAddReportLinkClassDlgData): Boolean;
implementation
{$R *.DFM}
uses
Dialogs, CommCtrl, dxBase, dxPSGlbl, dxPSUtl, dxPSDsgProxies, dxPSPopupMan,
dxPSfmEditDesc;
const
sdxSortedColumnIndex = 'SortedColumnIndex'; // Don't Localize
sdxSortOrder = 'SortOrder'; // Don't Localize
type
TCustomListViewAccess = class(TCustomListView);
function dxShowAddReportLinkClassDlg(var AData: TdxAddReportLinkClassDlgData): Boolean;
var
Dialog: TdxfmAddReportLinkClass;
begin
Dialog := TdxfmAddReportLinkClass.Create(nil);
try
Dialog.ReportLinkName := AData.ReportLinkName;
Dialog.ReportLinkCaption := AData.ReportLinkCaption;
Dialog.ReportLinkCreator := AData.ReportLinkCreator;
Dialog.ReportLinkDescription := AData.ReportLinkDescription;
if AData.HelpContext <> 0 then
Dialog.HelpContext := AData.HelpContext;
Result := Dialog.Execute;
if Result then
begin
AData.ReportLinkClass := Dialog.SelectedReportLinkClass;
AData.ReportLinkName := Dialog.ReportLinkName;
AData.ReportLinkCaption := Dialog.ReportLinkCaption;
AData.ReportLinkCreator := Dialog.ReportLinkCreator;
AData.ReportLinkDescription := Dialog.ReportLinkDescription;
AData.DesignBtnPressed := Dialog.FDesignBtnPressed;
end;
finally
Dialog.Free;
end;
end;
{ TfmAddEmptyReportLink }
procedure TdxfmAddReportLinkClass.FormCreate(Sender: TObject);
begin
FSortedColumnIndex := -1;
HelpContext := dxPSGlbl.dxhcAddEmptyLinkDlg;
dxPSDsgProxies.dxIdeImagesProvider.Refresh;
lvItems.SmallImages := dxPSDsgProxies.dxIdeImagesProvider.Images;
{$IFDEF DELPHI5}
SubstituteListViewWndProc;
AssignListViewHeaderImages;
{$ENDIF}
dxPSPopupMenuController.RegisterControl(lvItems);
end;
procedure TdxfmAddReportLinkClass.FormDestroy(Sender: TObject);
begin
dxPSPopupMenuController.UnregisterControl(lvItems);
{$IFDEF DELPHI5}
RestoreListViewWndProc;
{$ENDIF}
end;
function TdxfmAddReportLinkClass.Execute: Boolean;
begin
Initialize;
Result := (ShowModal = mrOk) and (lvItems.Selected <> nil);
end;
procedure TdxfmAddReportLinkClass.LoadFromRegistry(const APath: string);
begin
inherited;
dxLoadListViewColumnsFromRegistry(lvItems, APath);
LoadSorting(APath + '\' + lvItems.Name);
end;
procedure TdxfmAddReportLinkClass.SaveToRegistry(const APath: string);
begin
inherited;
dxSaveListViewColumnsToRegistry(lvItems, APath);
SaveSorting(APath + '\' + lvItems.Name);
end;
procedure TdxfmAddReportLinkClass.CreateWnd;
begin
inherited;
SendMessage(Handle, WM_SETICON, 1, Icon.Handle);
end;
procedure TdxfmAddReportLinkClass.BeforeConstruction;
begin
inherited;
Options := Options + [foSizeableDialog];
end;
procedure TdxfmAddReportLinkClass.LoadSorting(const APath: string);
begin
with TRegistry.Create do
try
if OpenKey(APath, False) then
try
if ValueExists(sdxSortedColumnIndex) then
FSortedColumnIndex := ReadInteger(sdxSortedColumnIndex);
if ValueExists(sdxSortOrder) then
FSortOrder := TSortOrder(ReadInteger(sdxSortOrder));
except
end;
finally
Free;
end;
end;
procedure TdxfmAddReportLinkClass.SaveSorting(const APath: string);
begin
with TRegistry.Create do
try
if OpenKey(APath, True) then
begin
WriteInteger(sdxSortedColumnIndex, FSortedColumnIndex);
WriteInteger(sdxSortOrder, Integer(FSortOrder));
end;
finally
Free;
end;
end;
procedure TdxfmAddReportLinkClass.pmLinksPopup(Sender: TObject);
begin
miSelect.Enabled := CanSelect;
miDesign.Enabled := CanDesign;
end;
procedure TdxfmAddReportLinkClass.lvItemsChange(Sender: TObject;
Item: TListItem; Change: TItemChange);
begin
if Change = ctState then UpdateControlsState;
end;
procedure TdxfmAddReportLinkClass.btnDescriptionClick(Sender: TObject);
var
S: string;
begin
S := ReportLinkDescription;
if dxEditDescriptionDlg(S) then
ReportLinkDescription := S;
end;
procedure TdxfmAddReportLinkClass.btnDesignClick(Sender: TObject);
begin
FDesignBtnPressed := True;
ModalResult := mrOk;
end;
procedure TdxfmAddReportLinkClass.btnHelpClick(Sender: TObject);
begin
if HelpContext <> 0 then Application.HelpContext(HelpContext);
end;
procedure TdxfmAddReportLinkClass.lvItemsDblClick(Sender: TObject);
begin
if lvItems.Selected <> nil then ModalResult := mrOk;
end;
procedure TdxfmAddReportLinkClass.lvItemsColumnClick(Sender: TObject; Column: TListColumn);
const
SortOrderToggleMap: array[TSortOrder] of TSortOrder = (soUp, soDown, soUp);
var
KeyboardState: TKeyboardState;
begin
Windows.GetKeyboardState(KeyboardState);
if KeyboardState[VK_CONTROL] and $80 <> 0 then
if FSortedColumnIndex <> -1 then
begin
RefreshList;
{$IFDEF DELPHI5}
SetColumnSortMark(FSortedColumnIndex, soNone);
{$ENDIF}
FSortOrder := soNone;
FSortedColumnIndex := -1;
end
else
else
begin
FSortOrder := SortOrderToggleMap[FSortOrder];
SortColumn(Column, FSortOrder);
end;
end;
procedure TdxfmAddReportLinkClass.FormResize(Sender: TObject);
const
BtnOffsetY = 6;
var
BtnOffsetX, RightOrigin, TopOrigin: Integer;
begin
BtnOffsetX := pnlHost.Left;
with pnlHost do
SetBounds(Left, Top, Self.ClientWidth - 2 * Left,
Self.ClientHeight - Top - btnOK.Height - 2 * BtnOffsetY);
RightOrigin := pnlHost.Left + pnlHost.Width;
TopOrigin := pnlHost.Top + pnlHost.Height + BtnOffsetY;
PlaceButtons([btnHelp, btnDesign, btnCancel, btnOK], BtnOffsetX, RightOrigin, TopOrigin);
end;
procedure TdxfmAddReportLinkClass.lvItemsCompare(Sender: TObject; Item1, Item2: TListItem;
Data: Integer; var Compare: Integer);
begin
if Data = 0 then
Compare := CompareText(Item1.Caption, Item2.Caption)
else
Compare := CompareText(Item1.SubItems[Data - 1], Item2.SubItems[Data - 1]);
if FSortOrder = soUp then
Compare := -Compare;
end;
procedure TdxfmAddReportLinkClass.lvItemsCustomDrawItem(
Sender: TCustomListView; Item: TListItem; State: TCustomDrawState;
var DefaultDraw: Boolean);
var
R: TRect;
DC: HDC;
BkColor, TextColor: COLORREF;
X, Y: Integer;
begin
if [cdsSelected, cdsFocused] * State = [cdsSelected, cdsFocused] then
begin
R := Item.DisplayRect(drIcon);
if Item.ImageIndex = -1 then
begin
Sender.Canvas.Brush.Color := clWindow;
Sender.Canvas.FillRect(R);
end
else
TCustomListViewAccess(Sender).SmallImages.Draw(Sender.Canvas, R.Left, R.Top, Item.ImageIndex);
DC := Sender.Canvas.Handle;
BkColor := SetBkColor(DC, ColorToRGB(clHighLight));
TextColor := SetTextColor(DC, ColorToRGB(clHighLightText));
R := Item.DisplayRect(drLabel);
with R do
begin
X := R.Left + 2;
Y := Top + (Bottom - Top - Canvas.TextHeight(Item.Caption)) div 2;
end;
Sender.Canvas.TextRect(R, X, Y, Item.Caption);
ListView_GetSubItemRect(Sender.Handle, Item.Index, 1, LVIR_LABEL, @R);
with R do
begin
X := R.Left + 6;
Y := Top + (Bottom - Top - Sender.Canvas.TextHeight(Item.SubItems[0])) div 2;
end;
Sender.Canvas.TextRect(R, X, Y, Item.SubItems[0]);
SetTextColor(DC, TextColor);
SetBkColor(DC, BkColor);
if cdsFocused in State then
begin
UnionRect(R, R, Item.DisplayRect(drLabel));
Sender.Canvas.DrawFocusRect(R);
end;
DefaultDraw := False;
end;
end;
function TdxfmAddReportLinkClass.GetListViewHeader: HWND;
begin
lvItems.HandleNeeded;
if lvItems.HandleAllocated then
Result := ListView_GetHeader(lvItems.Handle)
else
Result := 0;
end;
function TdxfmAddReportLinkClass.GetReportLinkCaption: string;
begin
Result := edCaption.Text;
end;
function TdxfmAddReportLinkClass.GetReportLinkCreator: string;
begin
Result := edCreator.Text;
end;
function TdxfmAddReportLinkClass.GetReportLinkName: string;
begin
Result := edName.Text;
end;
function TdxfmAddReportLinkClass.GetSelectedReportLinkClass: TdxReportLinkClass;
begin
if lvItems.Selected <> nil then
Result := TdxReportLinkClass(lvItems.Selected.Data)
else
Result := nil;
end;
procedure TdxfmAddReportLinkClass.SetReportLinkCaption(const Value: string);
begin
edCaption.Text := Value;
end;
procedure TdxfmAddReportLinkClass.SetReportLinkCreator(Value: string);
begin
edCreator.Text := Value;
end;
procedure TdxfmAddReportLinkClass.SetReportLinkName(const Value: string);
begin
edName.Text := Value;
end;
function TdxfmAddReportLinkClass.CanDesign: Boolean;
begin
Result := dxPSDesignerClassByLinkClass(SelectedReportLinkClass) <> nil;
end;
function TdxfmAddReportLinkClass.CanEditCaption: Boolean;
begin
Result := SelectedReportLinkClass <> nil;
end;
function TdxfmAddReportLinkClass.CanEditCreator: Boolean;
begin
Result := SelectedReportLinkClass <> nil;
end;
function TdxfmAddReportLinkClass.CanEditDescription: Boolean;
begin
Result := SelectedReportLinkClass <> nil;
end;
function TdxfmAddReportLinkClass.CanEditName: Boolean;
begin
Result := SelectedReportLinkClass <> nil;
end;
function TdxfmAddReportLinkClass.CanSelect: Boolean;
begin
Result := lvItems.Selected <> nil;
end;
procedure TdxfmAddReportLinkClass.Initialize;
begin
btnHelp.Visible := HelpContext <> 0;
RefreshList;
with lvItems do
begin
btnOK.Enabled := Items.Count > 0;
if Items.Count > 0 then
begin
Selected := Items[0];
ItemFocused := Selected;
end;
end;
pmLinks.Images := ilLinks;
miDesign.ImageIndex := 0;
FormResize(nil);
SetActiveControl;
RefreshSorting;
end;
procedure TdxfmAddReportLinkClass.RefreshList;
var
Selection: TList;
I, J: Integer;
LinkClasses: TdxClassList;
ComponentClasses: TdxClassList;
LinkClass: TdxReportLinkClass;
ComponentClass: TComponentClass;
begin
lvItems.Items.BeginUpdate;
try
Selection := TList.Create;
try
dxPSUtl.dxSaveListViewSelection(lvItems, Selection);
try
lvItems.Items.Clear;
LinkClasses := TdxClassList.Create;
try
ComponentClasses := TdxClassList.Create;
try
dxPSGetActiveReportLinksList(LinkClasses);
for I := 0 to LinkClasses.Count - 1 do
begin
ComponentClasses.Clear;
LinkClass := TdxReportLinkClass(LinkClasses[I]);
with lvItems.Items.Add do
begin
LinkClass.GetSupportedComponentList(ComponentClasses);
for J := 0 to ComponentClasses.Count - 1 do
begin
ComponentClass := TComponentClass(ComponentClasses[J]);
if J = 0 then
ImageIndex := dxPSDsgProxies.dxIdeImagesProvider.ImageIndexes[ComponentClass];
if Caption <> '' then
Caption := Caption + ', ';
if ComponentClass <> nil then
Caption := Caption + ComponentClass.ClassName;
end;
Data := (LinkClass);
StateIndex := -1;
SubItems.Add(LinkClass.ClassName);
end;
end;
finally
ComponentClasses.Free;
end;
finally
LinkClasses.Free;
end;
finally
dxPSUtl.dxRestoreListViewSelection(lvItems, Selection);
end;
finally
Selection.Free;
end;
finally
lvItems.Items.EndUpdate;
end;
end;
procedure TdxfmAddReportLinkClass.SetActiveControl;
begin
if lvItems.CanFocus then
ActiveControl := lvItems
else
if edName.CanFocus then
begin
ActiveControl := edName;
edName.SelectAll;
end
else
if edCaption.CanFocus then
begin
ActiveControl := edCaption;
edCaption.SelectAll;
end
else
if edCreator.CanFocus then
begin
ActiveControl := edCreator;
edCreator.SelectAll;
end;
end;
{$IFDEF DELPHI5}
procedure TdxfmAddReportLinkClass.SetColumnSortMark(AIndex: Integer; ASortOrder: TSortOrder);
const
Format: Integer = HDF_IMAGE or HDF_BITMAP_ON_RIGHT;
ImageIndexes: array[TSortOrder] of Integer = (-1, 0, 1);
var
Header: HWND;
HDItem: THDItem;
begin
AssignListViewHeaderImages;
Header := ListViewHeader;
if IsWindow(Header) then
begin
FillChar(HDItem, SizeOf(HDItem), 0);
HDItem.Mask := HDI_FORMAT or HDI_IMAGE;
Header_GetItem(Header, AIndex, HDItem);
if ASortOrder <> soNone then
HDItem.fmt := HDItem.fmt or Format
else
HDItem.fmt := HDItem.fmt and not Format;
HDItem.iImage := ImageIndexes[ASortOrder];
Header_SetItem(Header, AIndex, HDItem);
end;
end;
{$ENDIF}
procedure TdxfmAddReportLinkClass.SortColumn(Column: TListColumn; ASortOrder: TSortOrder);
var
Item: TListItem;
begin
dxPSCore.dxPSStartWait;
try
{$IFDEF DELPHI5}
if (FSortedColumnIndex <> Column.Index) and (FSortedColumnIndex <> -1) then
SetColumnSortMark(FSortedColumnIndex, soNone);
{$ENDIF}
FSortedColumnIndex := Column.Index;
if ASortOrder <> soNone then
begin
lvItems.CustomSort(nil, MakeTTag(FSortedColumnIndex));
{$IFDEF DELPHI5}
SetColumnSortMark(FSortedColumnIndex, ASortOrder);
{$ENDIF}
end;
Item := lvItems.Selected;
if Item <> nil then
Item.MakeVisible(True);
finally
dxPSCore.dxPSStopWait;
end;
lvItems.Invalidate;
end;
procedure TdxfmAddReportLinkClass.RefreshSorting;
begin
if (FSortedColumnIndex <> -1) and (FSortOrder <> soNone) then
SortColumn(lvItems.Columns[FSortedColumnIndex], FSortOrder);
end;
procedure TdxfmAddReportLinkClass.UpdateControlsState;
begin
btnDesign.Enabled := CanDesign;
edCaption.Enabled := CanEditCaption;
edCreator.Enabled := CanEditCreator;
btnDescription.Enabled := CanEditDescription;
edName.Enabled := CanEditName;
end;
{$IFDEF DELPHI5}
procedure TdxfmAddReportLinkClass.AssignListViewHeaderImages;
var
Header: HWND;
begin
Header := ListViewHeader;
if IsWindow(Header) and not IsWindow(Header_GetImageList(Header)) then
Header_SetImageList(Header, ilColumns.Handle);
end;
procedure TdxfmAddReportLinkClass.ListViewWndProc(var Message: TMessage);
begin
FPrevListViewWndProc(Message);
if (FSortedColumnIndex <> -1) and (Message.Msg = WM_NOTIFY) then
with TWMNotify(Message).NMHdr^ do
if (hWndFrom = ListViewHeader) and (Code = HDN_ENDTRACK) then
SetColumnSortMark(FSortedColumnIndex, FSortOrder);
end;
procedure TdxfmAddReportLinkClass.RestoreListViewWndProc;
begin
lvItems.WindowProc := FPrevListViewWndProc;
end;
procedure TdxfmAddReportLinkClass.SubstituteListViewWndProc;
begin
FPrevListViewWndProc := lvItems.WindowProc;
lvItems.WindowProc := ListViewWndProc;
end;
{$ENDIF}
procedure TdxfmAddReportLinkClass.CMDialogChar(var Message: TCMDialogChar);
begin
inherited;
if IsAccel(Message.CharCode, tbsItems.Caption) then
begin
Message.Result := 1;
ActiveControl := lvItems;
end;
end;
end.