913 lines
28 KiB
ObjectPascal
913 lines
28 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 dxPSfmLnkAdd;
|
|
|
|
interface
|
|
|
|
{$I cxVer.inc}
|
|
|
|
uses
|
|
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Registry,
|
|
ExtCtrls, StdCtrls, ComCtrls, Menus, ImgList, dxPSForm, dxPSCompsProvider,
|
|
dxPSCore;
|
|
|
|
type
|
|
TSortOrder = (soNone, soUp, soDown);
|
|
|
|
TdxAddReportLinkDlgDataOption = (adoShowDesignButton, adoShowDescriptionColumn,
|
|
adoShowOnlyComponentsWOLinks, adoShowOnlyComponentsInActiveForm,
|
|
adoAllowMultiSelect, adoShowNameEdit, adoShowCaptionEdit,
|
|
adoShowHideCustomContainers, adoShowCreatorEdit);
|
|
TdxAddReportLinkDlgDataOptions = set of TdxAddReportLinkDlgDataOption;
|
|
|
|
TdxfmAddComponent = class(TCustomdxPSForm)
|
|
btnOK: TButton;
|
|
btnCancel: TButton;
|
|
btnHelp: TButton;
|
|
btnDesign: TButton;
|
|
ilItems: TImageList;
|
|
pmItems: TPopupMenu;
|
|
miAdd: TMenuItem;
|
|
miLine1: TMenuItem;
|
|
miDesign: TMenuItem;
|
|
pnlHost: TPanel;
|
|
pgctrlItems: TPageControl;
|
|
tbsItems: TTabSheet;
|
|
pnlBottomHost: TPanel;
|
|
chbxOnlyUnLinked: TCheckBox;
|
|
chbxOnlyInCurrentModule: TCheckBox;
|
|
lvItems: TListView;
|
|
pnlNoItems: TPanel;
|
|
pnlNameHost: TPanel;
|
|
pnlCreatorHost: TPanel;
|
|
lblName: TLabel;
|
|
edName: TEdit;
|
|
lblCreator: TLabel;
|
|
edCreator: TEdit;
|
|
pnlSeparatorHost: TPanel;
|
|
bvlSeparator: TBevel;
|
|
chbxHideCustomContainers: TCheckBox;
|
|
bvlOnlyUnLinked: TBevel;
|
|
bvlHideCustomContainers: TBevel;
|
|
bvlOnlyInCurrentModule: TBevel;
|
|
btnDescription: TButton;
|
|
pnlCaptionHost: TPanel;
|
|
lblCaption: TLabel;
|
|
edCaption: TEdit;
|
|
ilColumns: TImageList;
|
|
procedure chbxClick(Sender: TObject);
|
|
procedure btnDesignClick(Sender: TObject);
|
|
procedure lvItemsDblClick(Sender: TObject);
|
|
procedure pmItemsPopup(Sender: TObject);
|
|
procedure FormResize(Sender: TObject);
|
|
procedure lvItemsChange(Sender: TObject; Item: TListItem; Change: TItemChange);
|
|
procedure btnDescriptionClick(Sender: TObject);
|
|
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
|
|
procedure lvItemsColumnClick(Sender: TObject; Column: TListColumn);
|
|
procedure lvItemsCompare(Sender: TObject; Item1, Item2: TListItem;
|
|
Data: Integer; var Compare: Integer);
|
|
procedure FormCreate(Sender: TObject);
|
|
procedure FormDestroy(Sender: TObject);
|
|
private
|
|
FComponentPrinter: TdxComponentPrinter;
|
|
FDesignBtnPressed: Boolean;
|
|
FOptions: TdxAddReportLinkDlgDataOptions;
|
|
FOriginalReportLinkName: string;
|
|
FReportLink: TBasedxReportLink;
|
|
FPrevListViewWndProc: TWndMethod;
|
|
FReportLinkDescription: string;
|
|
FSortedColumnIndex: Integer;
|
|
FSortOrder: TSortOrder;
|
|
function GetItemCount: Integer;
|
|
function GetListViewHeader: HWND;
|
|
function GetReportLinkCaption: string;
|
|
function GetReportLinkCreator: string;
|
|
function GetReportLinkName: string;
|
|
function GetSelectedComponent: TComponent;
|
|
procedure GetSelection(AList: TList);
|
|
procedure SetReportLinkCaption(const Value: string);
|
|
procedure SetReportLinkCreator(const Value: string);
|
|
procedure SetReportLinkName(const Value: string);
|
|
|
|
procedure AssignListViewHeaderImages;
|
|
procedure ListViewWndProc(var Message: TMessage);
|
|
procedure RestoreListViewWndProc;
|
|
procedure SubstituteListViewWndProc;
|
|
|
|
function CanEditName: Boolean;
|
|
function CanDesign: Boolean;
|
|
function CanSelect: Boolean;
|
|
function CheckUserInput: Boolean;
|
|
procedure ClearList;
|
|
procedure Initialize;
|
|
procedure LoadStrings;
|
|
function PreparedOptions: TdxPSGetComponentOptions;
|
|
procedure RefreshColumns;
|
|
procedure RefreshList;
|
|
procedure RefreshSorting;
|
|
procedure SetActiveControl;
|
|
procedure SetColumnSortMark(AIndex: Integer; ASortOrder: TSortOrder);
|
|
procedure SortColumn(Column: TListColumn; ASortOrder: TSortOrder);
|
|
procedure UpdateControlsState;
|
|
procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR;
|
|
protected
|
|
procedure CreateWnd; override;
|
|
procedure BeforeConstruction; override;
|
|
|
|
procedure LoadComponentState(const APath: string);
|
|
procedure LoadListViewSorting(const APath: string);
|
|
procedure SaveComponentState(const APath: string);
|
|
procedure SaveListViewSorting(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 ItemCount: Integer read GetItemCount;
|
|
property OriginalReportLinkName: string read FOriginalReportLinkName write FOriginalReportLinkName;
|
|
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 SelectedComponent: TComponent read GetSelectedComponent;
|
|
end;
|
|
|
|
PdxAddReportLinkDlgData = ^TdxAddReportLinkDlgData;
|
|
TdxAddReportLinkDlgData = record
|
|
Components: TList;
|
|
ComponentPrinter: TdxComponentPrinter;
|
|
ReportLink: TBasedxReportLink;
|
|
ReportLinkName: string;
|
|
ReportLinkCaption: string;
|
|
ReportLinkCreator: string;
|
|
ReportLinkDescription: string;
|
|
Options: TdxAddReportLinkDlgDataOptions;
|
|
DesignBtnPressed: Boolean;
|
|
Title: string;
|
|
end;
|
|
|
|
function dxShowAddComponentsDlg(var AData: TdxAddReportLinkDlgData): Boolean;
|
|
|
|
implementation
|
|
|
|
{$R *.DFM}
|
|
|
|
uses
|
|
CommCtrl, cxClasses, dxPSRes, dxPSUtl, dxPSGlbl, dxPSPopupMan, dxPSfmEditDesc;
|
|
|
|
const
|
|
sdxOnlyWithoutLinks = 'OnlyWithoutLinks'; // Don't Localize
|
|
sdxOnlyInCurrentModule = 'OnlyInCurrentModule'; // Don't Localize
|
|
sdxHideCustomContainers_ = 'HideCustomContainers'; // Don't Localize
|
|
sdxSortedColumnIndex = 'SortedColumnIndex'; // Don't Localize
|
|
sdxSortOrder = 'SortOrder'; // Don't Localize
|
|
|
|
function dxShowAddComponentsDlg(var AData: TdxAddReportLinkDlgData): Boolean;
|
|
var
|
|
Dialog: TdxfmAddComponent;
|
|
begin
|
|
Result := False;
|
|
if AData.Components = nil then Exit;
|
|
|
|
Dialog := TdxfmAddComponent.Create(nil);
|
|
try
|
|
Dialog.FOptions := AData.Options;
|
|
Dialog.FComponentPrinter := AData.ComponentPrinter;
|
|
Dialog.FReportLink := AData.ReportLink;
|
|
Dialog.ReportLinkName := AData.ReportLinkName;
|
|
Dialog.OriginalReportLinkName := Dialog.ReportLinkName;
|
|
Dialog.ReportLinkCaption := AData.ReportLinkCaption;
|
|
Dialog.ReportLinkCreator := AData.ReportLinkCreator;
|
|
Dialog.ReportLinkDescription := AData.ReportLinkDescription;
|
|
if AData.Title <> '' then
|
|
Dialog.Caption := AData.Title;
|
|
|
|
Result := Dialog.Execute;
|
|
|
|
if Result then
|
|
begin
|
|
Dialog.GetSelection(AData.Components);
|
|
AData.DesignBtnPressed := Dialog.FDesignBtnPressed;
|
|
if Dialog.SelectedComponent <> nil then
|
|
AData.ReportLinkName := Dialog.ReportLinkName;
|
|
AData.ReportLinkCaption := Dialog.ReportLinkCaption;
|
|
AData.ReportLinkCreator := Dialog.ReportLinkCreator;
|
|
AData.ReportLinkDescription := Dialog.ReportLinkDescription;
|
|
end;
|
|
finally
|
|
Dialog.Free;
|
|
end;
|
|
end;
|
|
|
|
{ TdxfmAddComponent }
|
|
|
|
procedure TdxfmAddComponent.FormCreate(Sender: TObject);
|
|
begin
|
|
FSortedColumnIndex := -1;
|
|
HelpContext := dxPSGlbl.dxhcAddLinkDlg;
|
|
Application.MainForm.Caption := Caption;
|
|
SubstituteListViewWndProc;
|
|
AssignListViewHeaderImages;
|
|
dxPSPopupMenuController.RegisterControl(lvItems);
|
|
end;
|
|
|
|
procedure TdxfmAddComponent.FormDestroy(Sender: TObject);
|
|
begin
|
|
dxPSPopupMenuController.UnregisterControl(lvItems);
|
|
RestoreListViewWndProc;
|
|
ClearList;
|
|
end;
|
|
|
|
procedure TdxfmAddComponent.FormResize(Sender: TObject);
|
|
const
|
|
BtnOffsetY = 6;
|
|
Offset = 3;
|
|
var
|
|
BtnOffsetX, RightOrigin, TopOrigin: Integer;
|
|
begin
|
|
BtnOffsetX := pnlHost.Left;
|
|
RightOrigin := BtnOffsetX + pnlHost.Width;
|
|
TopOrigin := pnlHost.Top + pnlHost.Height + BtnOffsetY;
|
|
|
|
dxPSUtl.PlaceButtons([btnHelp, btnDesign, btnCancel, btnOK], BtnOffsetX, RightOrigin, TopOrigin);
|
|
with pnlNoItems do
|
|
begin
|
|
Left := Offset;
|
|
Top := (lvItems.ClientHeight - Height) div 2;
|
|
Width := lvItems.ClientWidth - 2 * Offset;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxfmAddComponent.chbxClick(Sender: TObject);
|
|
begin
|
|
RefreshList;
|
|
RefreshSorting;
|
|
end;
|
|
|
|
procedure TdxfmAddComponent.btnDesignClick(Sender: TObject);
|
|
begin
|
|
FDesignBtnPressed := True;
|
|
ModalResult := mrOk;
|
|
end;
|
|
|
|
procedure TdxfmAddComponent.lvItemsChange(Sender: TObject; Item: TListItem;
|
|
Change: TItemChange);
|
|
begin
|
|
if Change = ctState then UpdateControlsState;
|
|
end;
|
|
|
|
procedure TdxfmAddComponent.btnDescriptionClick(Sender: TObject);
|
|
var
|
|
S: string;
|
|
begin
|
|
S := ReportLinkDescription;
|
|
if dxEditDescriptionDlg(S) then
|
|
ReportLinkDescription := S;
|
|
end;
|
|
|
|
procedure TdxfmAddComponent.FormCloseQuery(Sender: TObject;
|
|
var CanClose: Boolean);
|
|
begin
|
|
if ModalResult = mrOK then
|
|
CanClose := CheckUserInput;
|
|
end;
|
|
|
|
procedure TdxfmAddComponent.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;
|
|
SetColumnSortMark(FSortedColumnIndex, soNone);
|
|
FSortOrder := soNone;
|
|
FSortedColumnIndex := -1;
|
|
end
|
|
else
|
|
else
|
|
begin
|
|
FSortOrder := SortOrderToggleMap[FSortOrder];
|
|
SortColumn(Column, FSortOrder);
|
|
end;
|
|
end;
|
|
|
|
procedure TdxfmAddComponent.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 TdxfmAddComponent.lvItemsDblClick(Sender: TObject);
|
|
begin
|
|
ModalResult := mrOk;
|
|
end;
|
|
|
|
procedure TdxfmAddComponent.pmItemsPopup(Sender: TObject);
|
|
begin
|
|
miAdd.Enabled := CanSelect;
|
|
miDesign.Enabled := CanDesign;
|
|
miDesign.Visible := adoShowDesignButton in FOptions;
|
|
miLine1.Visible := miDesign.Visible;
|
|
end;
|
|
|
|
function TdxfmAddComponent.Execute: Boolean;
|
|
begin
|
|
Initialize;
|
|
Result := ShowModal = mrOk;
|
|
end;
|
|
|
|
procedure TdxfmAddComponent.LoadFromRegistry(const APath: string);
|
|
begin
|
|
inherited;
|
|
dxLoadListViewColumnsFromRegistry(lvItems, APath);
|
|
LoadComponentState(APath);
|
|
LoadListViewSorting(APath + '\' + lvItems.Name);
|
|
end;
|
|
|
|
procedure TdxfmAddComponent.SaveToRegistry(const APath: string);
|
|
begin
|
|
inherited;
|
|
dxSaveListViewColumnsToRegistry(lvItems, APath);
|
|
SaveComponentState(APath);
|
|
SaveListViewSorting(APath + '\' + lvItems.Name);
|
|
end;
|
|
|
|
procedure TdxfmAddComponent.CreateWnd;
|
|
begin
|
|
inherited;
|
|
SendMessage(Handle, WM_SETICON, 1, Icon.Handle);
|
|
end;
|
|
|
|
procedure TdxfmAddComponent.BeforeConstruction;
|
|
begin
|
|
inherited;
|
|
Options := Options + [foSizeableDialog];
|
|
end;
|
|
|
|
procedure TdxfmAddComponent.LoadComponentState(const APath: string);
|
|
var
|
|
Registry: TRegistry;
|
|
begin
|
|
Registry := TRegistry.Create;
|
|
try
|
|
if Registry.OpenKey(APath, False) then
|
|
try
|
|
if Registry.ValueExists(sdxOnlyWithoutLinks) then
|
|
chbxOnlyUnLinked.Checked := Registry.ReadBool(sdxOnlyWithoutLinks);
|
|
if Registry.ValueExists(sdxOnlyInCurrentModule) then
|
|
chbxOnlyInCurrentModule.Checked := Registry.ReadBool(sdxOnlyInCurrentModule);
|
|
if Registry.ValueExists(sdxHideCustomContainers_) then
|
|
chbxHideCustomContainers.Checked := Registry.ReadBool(sdxHideCustomContainers_);
|
|
except
|
|
on ERegistryException do
|
|
{ ignore }
|
|
else
|
|
raise;
|
|
end;
|
|
finally
|
|
Registry.Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxfmAddComponent.LoadListViewSorting(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 TdxfmAddComponent.SaveListViewSorting(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 TdxfmAddComponent.SaveComponentState(const APath: string);
|
|
var
|
|
Registry: TRegistry;
|
|
begin
|
|
Registry := TRegistry.Create;
|
|
try
|
|
if Registry.OpenKey(APath, True) then
|
|
try
|
|
Registry.WriteBool(sdxOnlyWithoutLinks, chbxOnlyUnLinked.Checked);
|
|
Registry.WriteBool(sdxOnlyInCurrentModule, chbxOnlyInCurrentModule.Checked);
|
|
Registry.WriteBool(sdxHideCustomContainers_, chbxHideCustomContainers.Checked);
|
|
except
|
|
on ERegistryException do
|
|
{ ignore }
|
|
else
|
|
raise;
|
|
end;
|
|
finally
|
|
Registry.Free;
|
|
end;
|
|
end;
|
|
|
|
function TdxfmAddComponent.GetItemCount: Integer;
|
|
begin
|
|
Result := lvItems.Items.Count;
|
|
end;
|
|
|
|
function TdxfmAddComponent.GetListViewHeader: HWND;
|
|
begin
|
|
lvItems.HandleNeeded;
|
|
if lvItems.HandleAllocated then
|
|
Result := ListView_GetHeader(lvItems.Handle)
|
|
else
|
|
Result := 0;
|
|
end;
|
|
|
|
function TdxfmAddComponent.GetReportLinkCaption: string;
|
|
begin
|
|
Result := edCaption.Text;
|
|
end;
|
|
|
|
function TdxfmAddComponent.GetReportLinkCreator: string;
|
|
begin
|
|
Result := edCreator.Text;
|
|
end;
|
|
|
|
function TdxfmAddComponent.GetReportLinkName: string;
|
|
begin
|
|
Result := edName.Text;
|
|
end;
|
|
|
|
function TdxfmAddComponent.GetSelectedComponent: TComponent;
|
|
begin
|
|
if lvItems.SelCount = 1 then
|
|
Result := TdxComponentItem(lvItems.Selected.Data).Component
|
|
else
|
|
Result := nil;
|
|
end;
|
|
|
|
procedure TdxfmAddComponent.GetSelection(AList: TList);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
with lvItems do
|
|
begin
|
|
for I := 0 to Items.Count - 1 do
|
|
if Items[I].Selected then
|
|
AList.Add(TdxComponentItem(Items[I].Data).Component);
|
|
end;
|
|
end;
|
|
|
|
procedure TdxfmAddComponent.SetReportLinkCaption(const Value: string);
|
|
begin
|
|
edCaption.Text := Value;
|
|
end;
|
|
|
|
procedure TdxfmAddComponent.SetReportLinkCreator(const Value: string);
|
|
begin
|
|
edCreator.Text := Value;
|
|
end;
|
|
|
|
procedure TdxfmAddComponent.SetReportLinkName(const Value: string);
|
|
begin
|
|
edName.Text := Value;
|
|
end;
|
|
|
|
procedure TdxfmAddComponent.AssignListViewHeaderImages;
|
|
var
|
|
Header: HWND;
|
|
begin
|
|
Header := ListViewHeader;
|
|
if IsWindow(Header) and not IsWindow(Header_GetImageList(Header)) then
|
|
Header_SetImageList(Header, ilColumns.Handle);
|
|
end;
|
|
|
|
procedure TdxfmAddComponent.ListViewWndProc(var Message: TMessage);
|
|
begin
|
|
FPrevListViewWndProc(Message);
|
|
|
|
if (FSortedColumnIndex <> -1) and (Message.Msg = WM_NOTIFY) then
|
|
if (TWMNotify(Message).NMHdr^.hWndFrom = ListViewHeader) and
|
|
(TWMNotify(Message).NMHdr^.Code = HDN_ENDTRACK) then
|
|
SetColumnSortMark(FSortedColumnIndex, FSortOrder);
|
|
end;
|
|
|
|
procedure TdxfmAddComponent.RestoreListViewWndProc;
|
|
begin
|
|
lvItems.WindowProc := FPrevListViewWndProc;
|
|
end;
|
|
|
|
procedure TdxfmAddComponent.SubstituteListViewWndProc;
|
|
begin
|
|
FPrevListViewWndProc := lvItems.WindowProc;
|
|
lvItems.WindowProc := ListViewWndProc;
|
|
end;
|
|
|
|
function TdxfmAddComponent.CanDesign: Boolean;
|
|
begin
|
|
Result := (SelectedComponent <> nil) and
|
|
FComponentPrinter.DesignerExistsByComponent(SelectedComponent);
|
|
end;
|
|
|
|
function TdxfmAddComponent.CanEditName: Boolean;
|
|
begin
|
|
Result := SelectedComponent <> nil;
|
|
end;
|
|
|
|
function TdxfmAddComponent.CanSelect: Boolean;
|
|
begin
|
|
Result := lvItems.Selected <> nil;
|
|
end;
|
|
|
|
function TdxfmAddComponent.CheckUserInput: Boolean;
|
|
begin
|
|
if adoShowNameEdit in FOptions then
|
|
begin
|
|
Result := IsValidIdent(ReportLinkName);
|
|
if Result then
|
|
begin
|
|
Result := FComponentPrinter.Owner.FindComponent(ReportLinkName) = nil;
|
|
if not Result then
|
|
MessageError(Format(cxGetResourceString(@sdxComponentAlreadyExists), [ReportLinkName]));
|
|
end
|
|
else
|
|
MessageError(Format(cxGetResourceString(@sdxInvalidComponentName), [ReportLinkName]));
|
|
|
|
if not Result and edName.CanFocus then
|
|
begin
|
|
edName.Text := FOriginalReportLinkName;
|
|
edName.SelectAll;
|
|
ActiveControl := edName;
|
|
end;
|
|
end
|
|
else
|
|
Result := True;
|
|
end;
|
|
|
|
procedure TdxfmAddComponent.ClearList;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to lvItems.Items.Count - 1 do
|
|
TObject(lvItems.Items[I].Data).Free;
|
|
lvItems.Items.Clear;
|
|
end;
|
|
|
|
procedure TdxfmAddComponent.Initialize;
|
|
begin
|
|
pnlNameHost.Visible := adoShowNameEdit in FOptions;
|
|
pnlCaptionHost.Visible := adoShowCaptionEdit in FOptions;
|
|
pnlCreatorHost.Visible := adoShowCreatorEdit in FOptions;
|
|
pnlSeparatorHost.Visible := pnlNameHost.Visible or pnlCaptionHost.Visible or pnlCreatorHost.Visible;
|
|
btnDesign.Visible := adoShowDesignButton in FOptions;
|
|
|
|
btnHelp.Visible := HelpContext <> 0;
|
|
if HelpContext <> 0 then
|
|
BorderIcons := BorderIcons + [biHelp];
|
|
|
|
lvItems.MultiSelect := adoAllowMultiSelect in FOptions;
|
|
|
|
chbxOnlyInCurrentModule.Visible := adoShowOnlyComponentsInActiveForm in FOptions;
|
|
chbxOnlyUnLinked.Visible := adoShowOnlyComponentsWOLinks in FOptions;
|
|
chbxHideCustomContainers.Visible := adoShowHideCustomContainers in FOptions;
|
|
|
|
pnlBottomHost.Visible := chbxOnlyInCurrentModule.Visible or chbxOnlyUnLinked.Visible or chbxHideCustomContainers.Visible;
|
|
if pnlBottomHost.Visible then
|
|
begin
|
|
if not chbxHideCustomContainers.Visible then
|
|
pnlBottomHost.Height := pnlBottomHost.Height - bvlHideCustomContainers.Height;
|
|
if not chbxOnlyInCurrentModule.Visible then
|
|
pnlBottomHost.Height := pnlBottomHost.Height - bvlOnlyInCurrentModule.Height;
|
|
if not chbxOnlyUnLinked.Visible then
|
|
pnlBottomHost.Height := pnlBottomHost.Height - bvlOnlyUnLinked.Height;
|
|
|
|
if not chbxHideCustomContainers.Visible then
|
|
begin
|
|
chbxOnlyUnLinked.BoundsRect := chbxOnlyInCurrentModule.BoundsRect;
|
|
chbxOnlyInCurrentModule.BoundsRect := chbxHideCustomContainers.BoundsRect;
|
|
end;
|
|
if not chbxOnlyInCurrentModule.Visible then
|
|
chbxOnlyUnLinked.BoundsRect := chbxOnlyInCurrentModule.BoundsRect;
|
|
end;
|
|
|
|
pnlNoItems.Parent := lvItems;
|
|
|
|
RefreshColumns;
|
|
RefreshList;
|
|
LoadStrings;
|
|
|
|
FormResize(nil);
|
|
SetActiveControl;
|
|
end;
|
|
|
|
procedure TdxfmAddComponent.LoadStrings;
|
|
begin
|
|
if (FComponentPrinter = nil) or not (csDesigning in FComponentPrinter.ComponentState) then
|
|
Caption := cxGetResourceString(@sdxAddReport);
|
|
|
|
lblName.Caption := cxGetResourceString(@sdxName);
|
|
lblCaption.Caption := cxGetResourceString(@sdxCaption);
|
|
lblCreator.Caption := cxGetResourceString(@sdxCreator);
|
|
btnDescription.Caption := cxGetResourceString(@sdxBtnDescription);
|
|
|
|
tbsItems.Caption := cxGetResourceString(@sdxAvailableSources);
|
|
|
|
chbxHideCustomContainers.Caption := cxGetResourceString(@sdxHideCustomContainers);
|
|
chbxOnlyInCurrentModule.Caption := cxGetResourceString(@sdxOnlyComponentsInActiveForm);
|
|
chbxOnlyUnLinked.Caption := cxGetResourceString(@sdxOnlyComponentsWithoutLinks);
|
|
|
|
pnlNoItems.Caption := cxGetResourceString(@sdxThereAreNowItemsForShow);
|
|
miAdd.Caption := cxGetResourceString(@sdxAddReport);
|
|
miDesign.Caption := cxGetResourceString(@sdxAddAndDesignReport);
|
|
|
|
btnOK.Caption := cxGetResourceString(@sdxBtnOK);
|
|
btnDesign.Caption := cxGetResourceString(@sdxBtnDesign);
|
|
btnCancel.Caption := cxGetResourceString(@sdxBtnCancel);
|
|
btnHelp.Caption := cxGetResourceString(@sdxBtnHelp);
|
|
end;
|
|
|
|
function TdxfmAddComponent.PreparedOptions: TdxPSGetComponentOptions;
|
|
begin
|
|
Result := [];
|
|
if (adoShowOnlyComponentsWOLinks in FOptions) and chbxOnlyUnLinked.Checked then
|
|
Include(Result, gcoExcludeExisting);
|
|
if (adoShowOnlyComponentsInActiveForm in FOptions) and chbxOnlyInCurrentModule.Checked then
|
|
Include(Result, gcoExcludeOutOfActiveForm);
|
|
if (adoShowHideCustomContainers in FOptions) and chbxHideCustomContainers.Checked then
|
|
Include(Result, gcoHideCustomContainers);
|
|
end;
|
|
|
|
procedure TdxfmAddComponent.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 adoShowDescriptionColumn 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 Min(lvItems.Columns.Count - 1, Length(ColumnWidths) - 1) do
|
|
lvItems.Columns[I].Width := ColumnWidths[I];
|
|
finally
|
|
lvItems.ColumnClick := True;
|
|
lvItems.Columns.EndUpdate;
|
|
end;
|
|
end;
|
|
|
|
procedure TdxfmAddComponent.RefreshList;
|
|
|
|
procedure LoadStrings(AStrings: TStrings; AnOptions: TdxPSGetComponentOptions);
|
|
begin
|
|
dxPSComponentProvidersFactory.GetComponents(FComponentPrinter, FReportLink, AStrings, AnOptions);
|
|
end;
|
|
|
|
procedure FillList(AStrings: TStrings);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to AStrings.Count - 1 do
|
|
with lvItems.Items.Add do
|
|
begin
|
|
Caption := AStrings[I];
|
|
Data := AStrings.Objects[I];
|
|
SubItems.Add(TdxComponentItem(Data).Description);
|
|
end;
|
|
end;
|
|
|
|
procedure RestoreSelection(ASelection: TList);
|
|
var
|
|
I, J: Integer;
|
|
Item: TListItem;
|
|
begin
|
|
for I := 0 to ASelection.Count - 1 do
|
|
for J := 0 to lvItems.Items.Count - 1 do
|
|
begin
|
|
Item := TListItem(lvItems.Items[J]);
|
|
if TdxComponentItem(Item.Data).Component = ASelection[I] then
|
|
begin
|
|
Item.Selected := True;
|
|
Item.MakeVisible(True);
|
|
Break;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure UpdateListViewState;
|
|
const
|
|
Styles: array[Boolean] of TViewStyle = (vsReport, vsList);
|
|
begin
|
|
lvItems.ViewStyle := Styles[ItemCount = 0];
|
|
lvItems.ColumnClick := True;
|
|
lvItems.Enabled := ItemCount <> 0;
|
|
lvItems.HideSelection := ItemCount = 0;
|
|
if (lvItems.SelCount = 0) and (ItemCount <> 0) then
|
|
lvItems.Selected := lvItems.Items[0];
|
|
end;
|
|
|
|
var
|
|
Selection: TList;
|
|
Strings: TStrings;
|
|
begin
|
|
lvItems.Items.BeginUpdate;
|
|
try
|
|
Selection := TList.Create;
|
|
try
|
|
GetSelection(Selection);
|
|
|
|
Strings := TStringList.Create;
|
|
try
|
|
ClearList;
|
|
LoadStrings(Strings, PreparedOptions);
|
|
FillList(Strings);
|
|
finally
|
|
Strings.Free;
|
|
end;
|
|
|
|
RestoreSelection(Selection);
|
|
|
|
UpdateListViewState;
|
|
finally
|
|
Selection.Free;
|
|
end;
|
|
finally
|
|
lvItems.Items.EndUpdate;
|
|
end;
|
|
UpdateControlsState;
|
|
end;
|
|
|
|
procedure TdxfmAddComponent.RefreshSorting;
|
|
begin
|
|
if (FSortedColumnIndex > -1) and (FSortedColumnIndex < lvItems.Columns.Count) and
|
|
(FSortOrder <> soNone) then
|
|
SortColumn(lvItems.Columns[FSortedColumnIndex], FSortOrder);
|
|
end;
|
|
|
|
procedure TdxfmAddComponent.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;
|
|
|
|
procedure TdxfmAddComponent.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;
|
|
|
|
procedure TdxfmAddComponent.SortColumn(Column: TListColumn; ASortOrder: TSortOrder);
|
|
var
|
|
Item: TListItem;
|
|
begin
|
|
dxPSCore.dxPSStartWait;
|
|
try
|
|
if (FSortedColumnIndex <> Column.Index) and (FSortedColumnIndex <> -1) then
|
|
SetColumnSortMark(FSortedColumnIndex, soNone);
|
|
FSortedColumnIndex := Column.Index;
|
|
if ASortOrder <> soNone then
|
|
begin
|
|
lvItems.CustomSort(nil, MakeTTag(FSortedColumnIndex));
|
|
SetColumnSortMark(FSortedColumnIndex, ASortOrder);
|
|
end;
|
|
Item := lvItems.Selected;
|
|
if Item <> nil then
|
|
Item.MakeVisible(True);
|
|
finally
|
|
dxPSCore.dxPSStopWait;
|
|
end;
|
|
lvItems.Invalidate;
|
|
end;
|
|
|
|
procedure TdxfmAddComponent.UpdateControlsState;
|
|
begin
|
|
edName.Enabled := CanEditName;
|
|
edCaption.Enabled := ItemCount <> 0;
|
|
edCreator.Enabled := ItemCount <> 0;
|
|
btnDescription.Enabled := ItemCount <> 0;
|
|
pnlNoItems.Visible := ItemCount = 0;
|
|
btnDesign.Enabled := CanDesign;
|
|
end;
|
|
|
|
procedure TdxfmAddComponent.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.
|
|
|