git-svn-id: https://192.168.0.254/svn/Componentes.Terceros.DevExpressVCL@58 05c56307-c608-d34a-929d-697000501d7a
966 lines
29 KiB
ObjectPascal
966 lines
29 KiB
ObjectPascal
{********************************************************************}
|
|
{ }
|
|
{ Developer Express Visual Component Library }
|
|
{ ExpressQuantumGrid }
|
|
{ }
|
|
{ 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 EXPRESSQUANTUMGRID 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 cxViewEditor;
|
|
|
|
{$I cxVer.inc}
|
|
|
|
interface
|
|
|
|
uses
|
|
{$IFDEF DELPHI6}
|
|
DesignIntf, DesignMenus,
|
|
{$ELSE}
|
|
DsgnIntf,
|
|
{$ENDIF}
|
|
{$IFDEF DELPHI6}
|
|
Variants,
|
|
{$ENDIF}
|
|
{$IFNDEF NONDB}
|
|
DB,
|
|
{$ENDIF}
|
|
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Menus,
|
|
Dialogs, ExtCtrls, dxCoreReg, cxLibraryReg,
|
|
cxClasses, cxStorage, cxDesignWindows, cxCustomData, cxGridCommon, cxGridCustomView;
|
|
|
|
const
|
|
cxGridViewMenuSeparatorCaption = '-';
|
|
|
|
type
|
|
{ TcxViewEditor }
|
|
|
|
TcxViewEditor = class(TForm)
|
|
PViewEditor: TPanel;
|
|
procedure FormKeyPress(Sender: TObject; var Key: Char);
|
|
private
|
|
FView: TcxCustomGridView;
|
|
function GetDataController: TcxCustomDataController;
|
|
function GetOwnerForm: TComponent;
|
|
protected
|
|
procedure BeginUpdate;
|
|
function CanAddComponent: Boolean;
|
|
function CanDeleteComponent(AComponent: TComponent): Boolean;
|
|
procedure EndUpdate;
|
|
procedure GetSelectionList(AList: TList);
|
|
procedure SelectComponent(AComponent: TPersistent);
|
|
function UniqueName(AComponent: TComponent;
|
|
const ATruncateClassName: string = ScxGridPrefixName): string; virtual;
|
|
procedure UpdateDesigner; virtual;
|
|
procedure UpdateEditor; virtual;
|
|
procedure UpdateSelection; virtual;
|
|
property DataController: TcxCustomDataController read GetDataController;
|
|
public
|
|
FormEditor: TcxDesignFormEditor;
|
|
class function GetViewByObject(APersistent: TPersistent): TcxCustomGridView; virtual;
|
|
procedure SetView(Value: TcxCustomGridView; ARefreshNeeded: Boolean);
|
|
property OwnerForm: TComponent read GetOwnerForm;
|
|
property View: TcxCustomGridView read FView;
|
|
end;
|
|
|
|
TcxViewEditorClass = class of TcxViewEditor;
|
|
|
|
{ TcxCustomGridViewStorage }
|
|
|
|
TcxCustomGridViewStorage = class(TcxInterfacedPersistent, IcxStoredObject)
|
|
private
|
|
FView: TcxCustomGridView;
|
|
protected
|
|
// IcxStoredObject
|
|
function GetObjectName: string;
|
|
function GetProperties(AProperties: TStrings): Boolean;
|
|
procedure GetPropertyValue(const AName: string; var AValue: Variant);
|
|
procedure SetPropertyValue(const AName: string; const AValue: Variant);
|
|
property View: TcxCustomGridView read FView;
|
|
public
|
|
constructor Create(AView: TcxCustomGridView); reintroduce; virtual;
|
|
class function GetViewClass: TcxCustomGridViewClass; virtual;
|
|
end;
|
|
|
|
TcxCustomGridViewStorageClass = class of TcxCustomGridViewStorage;
|
|
|
|
{ View Menu Provider }
|
|
|
|
TcxGridViewMenuItem = class;
|
|
|
|
TcxGridViewMenuItemActionEvent = procedure(Sender: TcxGridViewMenuItem) of object;
|
|
|
|
TcxGridViewMenuItems = class
|
|
private
|
|
FItems: TList;
|
|
function GetCount: Integer;
|
|
function GetItem(Index: Integer): TcxGridViewMenuItem;
|
|
protected
|
|
procedure ClearItems;
|
|
public
|
|
constructor Create;
|
|
destructor Destroy; override;
|
|
function AddItem(const ACaption: string; AOnClick: TcxGridViewMenuItemActionEvent = nil;
|
|
AEnabled: Boolean = True; AChecked: Boolean = False; AData: TObject = nil): TcxGridViewMenuItem;
|
|
function AddSeparator: TcxGridViewMenuItem;
|
|
procedure Delete(AIndex: Integer);
|
|
procedure Prepare(AMenuItem: TMenuItem); overload; virtual;
|
|
{$IFDEF DELPHI6}
|
|
procedure Prepare(const AMenuItem: TDesignMenuItem); overload; virtual;
|
|
{$ENDIF}
|
|
procedure RemoveExcessSeparators;
|
|
property Count: Integer read GetCount;
|
|
property Items[Index: Integer]: TcxGridViewMenuItem read GetItem; default;
|
|
end;
|
|
|
|
TcxGridViewMenuItem = class(TcxGridViewMenuItems)
|
|
private
|
|
procedure MenuItemClick(Sender: TObject);
|
|
protected
|
|
OnAction: TcxGridViewMenuItemActionEvent;
|
|
public
|
|
Caption: string;
|
|
Checked: Boolean;
|
|
Data: TObject;
|
|
Enabled: Boolean;
|
|
constructor Create(const ACaption: string; AEnabled: Boolean;
|
|
AChecked: Boolean; AData: TObject; AOnAction: TcxGridViewMenuItemActionEvent);
|
|
procedure DoAction;
|
|
function IsSeparator: Boolean;
|
|
procedure Prepare(AMenuItem: TMenuItem); overload; override;
|
|
{$IFDEF DELPHI6}
|
|
procedure Prepare(const AMenuItem: TDesignMenuItem); overload; override;
|
|
{$ENDIF}
|
|
end;
|
|
|
|
TcxCustomGridViewMenuProviderClass = class of TcxCustomGridViewMenuProvider;
|
|
|
|
TcxCustomGridViewMenuProvider = class
|
|
private
|
|
FDesigner: IDesigner;
|
|
FDesignHelper: TcxDesignHelper;
|
|
FGridView: TcxCustomGridView;
|
|
FItems: TcxGridViewMenuItems;
|
|
{$IFNDEF NONDB}
|
|
FDataSourceNames: TStringList;
|
|
procedure GetDataSourceName(const S: string);
|
|
function GetDBGridView: TcxCustomGridView;
|
|
function GetViewDataSource: TDataSource;
|
|
procedure SetViewDataSource(Value: TDataSource);
|
|
{$ENDIF}
|
|
protected
|
|
procedure DesignerModified;
|
|
procedure ObjectCreated(AObject: TPersistent);
|
|
procedure SelectObject(AObject: TPersistent);
|
|
|
|
procedure InitAdditionalItems; virtual;
|
|
procedure InitCopySettingsFromViewItem; virtual;
|
|
{$IFNDEF NONDB}
|
|
procedure InitDataBindingItems; virtual;
|
|
{$ENDIF}
|
|
procedure InitItems; virtual;
|
|
procedure InitLayoutItems; virtual;
|
|
procedure InitStructureItems; virtual;
|
|
|
|
procedure CopySettings(Sender: TcxGridViewMenuItem);
|
|
procedure DeleteView(Sender: TcxGridViewMenuItem);
|
|
procedure EditLayoutAndData(Sender: TcxGridViewMenuItem);
|
|
procedure SetAsDefault(Sender: TcxGridViewMenuItem);
|
|
{$IFNDEF NONDB}
|
|
function GetDataSourceNames: TStringList;
|
|
procedure LinkToDataSource(Sender: TcxGridViewMenuItem);
|
|
{$ENDIF}
|
|
|
|
{$IFNDEF NONDB}
|
|
property ViewDataSource: TDataSource read GetViewDataSource write SetViewDataSource;
|
|
property DBGridView: TcxCustomGridView read GetDBGridView;
|
|
{$ENDIF}
|
|
property Designer: IDesigner read FDesigner;
|
|
property DesignHelper: TcxDesignHelper read FDesignHelper;
|
|
public
|
|
constructor Create(AGridView: TcxCustomGridView); virtual;
|
|
destructor Destroy; override;
|
|
property GridView: TcxCustomGridView read FGridView;
|
|
property Items: TcxGridViewMenuItems read FItems;
|
|
end;
|
|
|
|
{ TcxGridViewList }
|
|
|
|
TcxGridViewList = class
|
|
private
|
|
FDesigner: IDesigner;
|
|
FViewNames: TStringList;
|
|
function GetView(Index: Integer): TcxCustomGridView;
|
|
procedure AddViewName(const S: string);
|
|
protected
|
|
procedure GetViewNames; virtual;
|
|
public
|
|
constructor Create(ADesigner: IDesigner);
|
|
destructor Destroy; override;
|
|
function GetViewIndex(AView: TcxCustomGridView): Integer;
|
|
property Designer: IDesigner read FDesigner;
|
|
property ViewNames: TStringList read FViewNames;
|
|
property Views[Index: Integer]: TcxCustomGridView read GetView;
|
|
end;
|
|
|
|
function GetViewEditorClass(AViewClass: TcxCustomGridViewClass): TcxViewEditorClass;
|
|
procedure RegisterViewEditorClass(AViewClass: TcxCustomGridViewClass; AViewEditorClass: TcxViewEditorClass);
|
|
procedure UnregisterViewEditorClass(AViewClass: TcxCustomGridViewClass; AViewEditorClass: TcxViewEditorClass);
|
|
function GetLinkedView(APersistent: TPersistent): TcxCustomGridView;
|
|
function IsViewLinkedToComponent(AView: TcxCustomGridView; AComponent: TComponent): Boolean;
|
|
|
|
function GetViewTemplateRegKey: string;
|
|
procedure RegisterDefaultViewStorage(AStorageClass: TcxCustomGridViewStorageClass);
|
|
procedure UnregisterDefaultViewStorage(AStorageClass: TcxCustomGridViewStorageClass);
|
|
function GetDefaultViewStorageByViewClass(AGridView: TcxCustomGridView): TcxCustomGridViewStorage;
|
|
|
|
procedure RestoreViewFromTemplate(const ARegPath: string; AView: TcxCustomGridView);
|
|
procedure SaveViewToTemplate(const ARegPath: string; AView: TcxCustomGridView);
|
|
|
|
function CreateViewMenuProvider(AView: TcxCustomGridView): TcxCustomGridViewMenuProvider;
|
|
function GetViewMenuProviderClass(AView: TcxCustomGridView): TcxCustomGridViewMenuProviderClass;
|
|
procedure RegisterViewMenuProviderClass(AViewClass: TcxCustomGridViewClass;
|
|
AViewMenuProviderClass: TcxCustomGridViewMenuProviderClass);
|
|
procedure UnregisterViewMenuProviderClass(AViewClass: TcxCustomGridViewClass;
|
|
AViewMenuProviderClass: TcxCustomGridViewMenuProviderClass);
|
|
|
|
function GetViewItemUniqueName(AView: TcxCustomGridView; AItem: TComponent;
|
|
const AItemName: string): string;
|
|
|
|
implementation
|
|
|
|
{$R *.dfm}
|
|
|
|
uses
|
|
{$IFNDEF NONDB}
|
|
TypInfo, cxDBData,
|
|
{$ENDIF}
|
|
cxGrid, cxGridLevel, cxGridViewLayoutEditor;
|
|
|
|
type
|
|
TcxDesignWindowAccess = class(TcxDesignWindow);
|
|
|
|
var
|
|
ViewEditorClassList: TcxRegisteredClassList;
|
|
DefaultViewStorages: TList;
|
|
ViewMenuProviderClassList: TcxRegisteredClassList;
|
|
|
|
function GetViewEditorClass(AViewClass: TcxCustomGridViewClass): TcxViewEditorClass;
|
|
begin
|
|
Result := TcxViewEditorClass(ViewEditorClassList.FindClass(AViewClass));
|
|
end;
|
|
|
|
procedure RegisterViewEditorClass(AViewClass: TcxCustomGridViewClass; AViewEditorClass: TcxViewEditorClass);
|
|
begin
|
|
ViewEditorClassList.Register(AViewClass, AViewEditorClass);
|
|
end;
|
|
|
|
procedure UnregisterViewEditorClass(AViewClass: TcxCustomGridViewClass; AViewEditorClass: TcxViewEditorClass);
|
|
begin
|
|
ViewEditorClassList.Unregister(AViewClass, AViewEditorClass);
|
|
end;
|
|
|
|
function GetLinkedView(APersistent: TPersistent): TcxCustomGridView;
|
|
var
|
|
I: Integer;
|
|
AViewEditorClass: TcxViewEditorClass;
|
|
begin
|
|
Result := nil;
|
|
for I := 0 to ViewEditorClassList.Count - 1 do
|
|
begin
|
|
AViewEditorClass := TcxViewEditorClass(ViewEditorClassList[I].RegisteredClass);
|
|
Result := AViewEditorClass.GetViewByObject(APersistent);
|
|
if Result <> nil then
|
|
Break;
|
|
end;
|
|
end;
|
|
|
|
function IsViewLinkedToComponent(AView: TcxCustomGridView; AComponent: TComponent): Boolean;
|
|
|
|
function CheckLevels(ALevel: TcxGridLevel): Boolean;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
Result := False;
|
|
for I := 0 to ALevel.Count - 1 do
|
|
if (ALevel[I].GridView = AView) or CheckLevels(ALevel[I]) then
|
|
begin
|
|
Result := True;
|
|
Break;
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
Result := AView.GetParentComponent = AComponent;
|
|
if not Result and (AComponent is TcxCustomGrid) then // check Levels (from Repository)
|
|
Result := CheckLevels(TcxCustomGrid(AComponent).Levels);
|
|
end;
|
|
|
|
function GetViewTemplateRegKey: string;
|
|
begin
|
|
Result := TcxDesignWindow.GetBaseRegKey + '\TcxGridViewTemplate';
|
|
end;
|
|
|
|
procedure RegisterDefaultViewStorage(AStorageClass: TcxCustomGridViewStorageClass);
|
|
begin
|
|
if DefaultViewStorages = nil then
|
|
DefaultViewStorages := TList.Create;
|
|
if DefaultViewStorages.IndexOf((AStorageClass)) < 0 then
|
|
DefaultViewStorages.Add((AStorageClass));
|
|
end;
|
|
|
|
procedure UnregisterDefaultViewStorage(AStorageClass: TcxCustomGridViewStorageClass);
|
|
begin
|
|
if DefaultViewStorages <> nil then
|
|
DefaultViewStorages.Remove((AStorageClass));
|
|
end;
|
|
|
|
function GetDefaultViewStorageByViewClass(AGridView: TcxCustomGridView): TcxCustomGridViewStorage;
|
|
var
|
|
I: Integer;
|
|
ACurrent, AStorageClass: TcxCustomGridViewStorageClass;
|
|
begin
|
|
Result := nil;
|
|
AStorageClass := nil;
|
|
if (DefaultViewStorages <> nil) and (AGridView <> nil) then
|
|
begin
|
|
for I := 0 to DefaultViewStorages.Count - 1 do
|
|
begin
|
|
ACurrent := TcxCustomGridViewStorageClass(DefaultViewStorages[I]);
|
|
|
|
if AGridView.InheritsFrom(ACurrent.GetViewClass) then
|
|
if (AStorageClass = nil) or
|
|
not AStorageClass.GetViewClass.InheritsFrom(ACurrent.GetViewClass) then
|
|
AStorageClass := ACurrent;
|
|
|
|
if (AStorageClass <> nil) and
|
|
(AStorageClass.GetViewClass = AGridView.ClassType) then
|
|
Break;
|
|
end;
|
|
end;
|
|
if AStorageClass <> nil then
|
|
Result := AStorageClass.Create(AGridView);
|
|
end;
|
|
|
|
procedure RestoreViewFromTemplate(const ARegPath: string; AView: TcxCustomGridView);
|
|
var
|
|
AStorage: TcxStorage;
|
|
AViewStorage: TcxCustomGridViewStorage;
|
|
begin
|
|
AViewStorage := GetDefaultViewStorageByViewClass(AView);
|
|
if AViewStorage = nil then Exit;
|
|
try
|
|
AStorage := TcxStorage.Create(ARegPath{ + '\' + AViewStorage.GetObjectName});
|
|
try
|
|
AStorage.Modes := AStorage.Modes + [smSavePublishedClassProperties];
|
|
AStorage.RestoreFromRegistry(AViewStorage);
|
|
finally
|
|
AStorage.Free;
|
|
end;
|
|
finally
|
|
AViewStorage.Free;
|
|
end;
|
|
end;
|
|
|
|
procedure SaveViewToTemplate(const ARegPath: string; AView: TcxCustomGridView);
|
|
var
|
|
AStorage: TcxStorage;
|
|
AViewStorage: TcxCustomGridViewStorage;
|
|
begin
|
|
AViewStorage := GetDefaultViewStorageByViewClass(AView);
|
|
if AViewStorage = nil then Exit;
|
|
try
|
|
AStorage := TcxStorage.Create(ARegPath{ + '\' + AViewStorage.GetObjectName});
|
|
try
|
|
AStorage.Modes := AStorage.Modes + [smSavePublishedClassProperties];
|
|
AStorage.Recreate := False;
|
|
AStorage.StoreToRegistry(AViewStorage);
|
|
finally
|
|
AStorage.Free;
|
|
end;
|
|
finally
|
|
AViewStorage.Free;
|
|
end;
|
|
end;
|
|
|
|
function CreateViewMenuProvider(AView: TcxCustomGridView): TcxCustomGridViewMenuProvider;
|
|
var
|
|
AClass: TcxCustomGridViewMenuProviderClass;
|
|
begin
|
|
AClass := GetViewMenuProviderClass(AView);
|
|
if AClass = nil then
|
|
Result := nil
|
|
else
|
|
Result := AClass.Create(AView);
|
|
end;
|
|
|
|
function GetViewMenuProviderClass(AView: TcxCustomGridView): TcxCustomGridViewMenuProviderClass;
|
|
begin
|
|
Result := TcxCustomGridViewMenuProviderClass(ViewMenuProviderClassList.FindClass(AView.ClassType));
|
|
end;
|
|
|
|
procedure RegisterViewMenuProviderClass(AViewClass: TcxCustomGridViewClass;
|
|
AViewMenuProviderClass: TcxCustomGridViewMenuProviderClass);
|
|
begin
|
|
ViewMenuProviderClassList.Register(AViewClass, AViewMenuProviderClass);
|
|
end;
|
|
|
|
procedure UnregisterViewMenuProviderClass(AViewClass: TcxCustomGridViewClass;
|
|
AViewMenuProviderClass: TcxCustomGridViewMenuProviderClass);
|
|
begin
|
|
ViewMenuProviderClassList.Unregister(AViewClass, AViewMenuProviderClass);
|
|
end;
|
|
|
|
function GetViewItemUniqueName(AView: TcxCustomGridView; AItem: TComponent;
|
|
const AItemName: string): string;
|
|
begin
|
|
Result := CreateUniqueName(AView.Owner{!!!}, AView, AItem,
|
|
Copy(AItem.ClassName, 1, Pos(AItemName, AItem.ClassName) - 1), '');
|
|
end;
|
|
|
|
{ TcxCustomGridViewStorage }
|
|
|
|
constructor TcxCustomGridViewStorage.Create(AView: TcxCustomGridView);
|
|
begin
|
|
inherited Create(AView);
|
|
FView := AView;
|
|
end;
|
|
|
|
class function TcxCustomGridViewStorage.GetViewClass: TcxCustomGridViewClass;
|
|
begin
|
|
Result := nil;
|
|
end;
|
|
|
|
function TcxCustomGridViewStorage.GetObjectName: string;
|
|
begin
|
|
Result := GetViewClass.ClassName;
|
|
end;
|
|
|
|
function TcxCustomGridViewStorage.GetProperties(AProperties: TStrings): Boolean;
|
|
begin
|
|
Result := False;
|
|
end;
|
|
|
|
procedure TcxCustomGridViewStorage.GetPropertyValue(const AName: string; var AValue: Variant);
|
|
begin
|
|
end;
|
|
|
|
procedure TcxCustomGridViewStorage.SetPropertyValue(const AName: string; const AValue: Variant);
|
|
begin
|
|
end;
|
|
|
|
{ TcxViewEditor }
|
|
|
|
class function TcxViewEditor.GetViewByObject(APersistent: TPersistent): TcxCustomGridView;
|
|
begin
|
|
Result := nil;
|
|
end;
|
|
|
|
procedure TcxViewEditor.SetView(Value: TcxCustomGridView; ARefreshNeeded: Boolean);
|
|
begin
|
|
FView := Value;
|
|
if ARefreshNeeded then
|
|
UpdateEditor;
|
|
UpdateSelection;
|
|
end;
|
|
|
|
procedure TcxViewEditor.BeginUpdate;
|
|
begin
|
|
FormEditor.BeginUpdate;
|
|
end;
|
|
|
|
function TcxViewEditor.CanAddComponent: Boolean;
|
|
begin
|
|
Result := FormEditor.CanAddComponent;
|
|
end;
|
|
|
|
function TcxViewEditor.CanDeleteComponent(AComponent: TComponent): Boolean;
|
|
begin
|
|
Result := FormEditor.CanDeleteComponent(AComponent);
|
|
end;
|
|
|
|
procedure TcxViewEditor.EndUpdate;
|
|
begin
|
|
FormEditor.EndUpdate;
|
|
end;
|
|
|
|
procedure TcxViewEditor.GetSelectionList(AList: TList);
|
|
begin
|
|
FormEditor.GetSelectionList(AList);
|
|
end;
|
|
|
|
procedure TcxViewEditor.SelectComponent(AComponent: TPersistent);
|
|
begin
|
|
FormEditor.SelectComponent(AComponent);
|
|
end;
|
|
|
|
function TcxViewEditor.UniqueName(AComponent: TComponent;
|
|
const ATruncateClassName: string = ScxGridPrefixName): string;
|
|
begin
|
|
Result := CreateUniqueName(OwnerForm, View, AComponent, ATruncateClassName, '');
|
|
end;
|
|
|
|
procedure TcxViewEditor.UpdateDesigner;
|
|
begin
|
|
FormEditor.Designer.Modified;
|
|
end;
|
|
|
|
procedure TcxViewEditor.UpdateEditor;
|
|
begin
|
|
end;
|
|
|
|
procedure TcxViewEditor.UpdateSelection;
|
|
begin
|
|
end;
|
|
|
|
function TcxViewEditor.GetDataController: TcxCustomDataController;
|
|
begin
|
|
Result := FView.DataController;
|
|
end;
|
|
|
|
function TcxViewEditor.GetOwnerForm: TComponent;
|
|
begin
|
|
Result := FormEditor.Component.Owner;
|
|
end;
|
|
|
|
procedure TcxViewEditor.FormKeyPress(Sender: TObject; var Key: Char);
|
|
begin
|
|
case Key of
|
|
#13, #33..#126:
|
|
begin
|
|
if Key = #13 then Key := #0;
|
|
TcxDesignWindowAccess(FormEditor).ActivateInspector(Key);
|
|
Key := #0;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
{ TcxGridViewMenuItems }
|
|
|
|
constructor TcxGridViewMenuItems.Create;
|
|
begin
|
|
inherited;
|
|
FItems := TList.Create;
|
|
end;
|
|
|
|
destructor TcxGridViewMenuItems.Destroy;
|
|
begin
|
|
ClearItems;
|
|
FItems.Free;
|
|
inherited;
|
|
end;
|
|
|
|
function TcxGridViewMenuItems.GetCount: Integer;
|
|
begin
|
|
Result := FItems.Count;
|
|
end;
|
|
|
|
function TcxGridViewMenuItems.GetItem(Index: Integer): TcxGridViewMenuItem;
|
|
begin
|
|
Result := TcxGridViewMenuItem(FItems[Index]);
|
|
end;
|
|
|
|
procedure TcxGridViewMenuItems.ClearItems;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := Count - 1 downto 0 do
|
|
Delete(I);
|
|
end;
|
|
|
|
function TcxGridViewMenuItems.AddItem(const ACaption: string;
|
|
AOnClick: TcxGridViewMenuItemActionEvent = nil; AEnabled: Boolean = True;
|
|
AChecked: Boolean = False; AData: TObject = nil): TcxGridViewMenuItem;
|
|
begin
|
|
Result := TcxGridViewMenuItem.Create(ACaption, AEnabled, AChecked, AData, AOnClick);
|
|
FItems.Add(Result);
|
|
end;
|
|
|
|
function TcxGridViewMenuItems.AddSeparator: TcxGridViewMenuItem;
|
|
begin
|
|
Result := AddItem(cxGridViewMenuSeparatorCaption);
|
|
end;
|
|
|
|
procedure TcxGridViewMenuItems.Delete(AIndex: Integer);
|
|
begin
|
|
Items[AIndex].Free;
|
|
FItems.Delete(AIndex);
|
|
end;
|
|
|
|
procedure TcxGridViewMenuItems.Prepare(AMenuItem: TMenuItem);
|
|
var
|
|
I: Integer;
|
|
AChildMenuItem: TMenuItem;
|
|
begin
|
|
for I := 0 to Count - 1 do
|
|
begin
|
|
AChildMenuItem := CreateMenuItem(AMenuItem.Owner, '');
|
|
Items[I].Prepare(AChildMenuItem);
|
|
AMenuItem.Add(AChildMenuItem);
|
|
end;
|
|
end;
|
|
|
|
{$IFDEF DELPHI6}
|
|
|
|
procedure TcxGridViewMenuItems.Prepare(const AMenuItem: TDesignMenuItem);
|
|
var
|
|
I: Integer;
|
|
AChildMenuItem: TDesignMenuItem;
|
|
begin
|
|
for I := 0 to Count - 1 do
|
|
begin
|
|
AChildMenuItem := AMenuItem.AddItem('', 0, False, True, Items[I].MenuItemClick);
|
|
Items[I].Prepare(AChildMenuItem);
|
|
end;
|
|
end;
|
|
|
|
{$ENDIF}
|
|
|
|
procedure TcxGridViewMenuItems.RemoveExcessSeparators;
|
|
var
|
|
APrevItemIsSeparator: Boolean;
|
|
I: Integer;
|
|
begin
|
|
APrevItemIsSeparator := True;
|
|
for I := Count - 1 downto 0 do
|
|
if Items[I].IsSeparator then
|
|
if APrevItemIsSeparator then
|
|
Delete(I)
|
|
else
|
|
APrevItemIsSeparator := True
|
|
else
|
|
begin
|
|
APrevItemIsSeparator := False;
|
|
Items[I].RemoveExcessSeparators;
|
|
end;
|
|
end;
|
|
|
|
{ TcxGridViewMenuItem }
|
|
|
|
constructor TcxGridViewMenuItem.Create(const ACaption: string;
|
|
AEnabled, AChecked: Boolean; AData: TObject; AOnAction: TcxGridViewMenuItemActionEvent);
|
|
begin
|
|
inherited Create;
|
|
Caption := ACaption;
|
|
Enabled := AEnabled;
|
|
Checked := AChecked;
|
|
Data := AData;
|
|
OnAction := AOnAction;
|
|
end;
|
|
|
|
procedure TcxGridViewMenuItem.MenuItemClick(Sender: TObject);
|
|
begin
|
|
DoAction;
|
|
end;
|
|
|
|
procedure TcxGridViewMenuItem.DoAction;
|
|
begin
|
|
if Assigned(OnAction) then OnAction(Self);
|
|
end;
|
|
|
|
function TcxGridViewMenuItem.IsSeparator: Boolean;
|
|
begin
|
|
Result := Caption = cxGridViewMenuSeparatorCaption;
|
|
end;
|
|
|
|
procedure TcxGridViewMenuItem.Prepare(AMenuItem: TMenuItem);
|
|
begin
|
|
AMenuItem.Caption := Caption;
|
|
AMenuItem.Enabled := Enabled;
|
|
AMenuItem.Checked := Checked;
|
|
if not Assigned(AMenuItem.OnClick) then
|
|
AMenuItem.OnClick := MenuItemClick;
|
|
inherited;
|
|
end;
|
|
|
|
{$IFDEF DELPHI6}
|
|
|
|
procedure TcxGridViewMenuItem.Prepare(const AMenuItem: TDesignMenuItem);
|
|
begin
|
|
AMenuItem.Caption := Caption;
|
|
AMenuItem.Enabled := Enabled;
|
|
AMenuItem.Checked := Checked;
|
|
inherited;
|
|
end;
|
|
|
|
{$ENDIF}
|
|
|
|
{ TcxCustomGridViewMenuProvider }
|
|
|
|
constructor TcxCustomGridViewMenuProvider.Create(AGridView: TcxCustomGridView);
|
|
begin
|
|
inherited Create;
|
|
FGridView := AGridView;
|
|
FDesigner := GetObjectDesigner(GridView);
|
|
FDesignHelper := TcxDesignHelper.Create(GridView.Control);
|
|
FItems := TcxGridViewMenuItems.Create;
|
|
InitItems;
|
|
Items.RemoveExcessSeparators;
|
|
end;
|
|
|
|
destructor TcxCustomGridViewMenuProvider.Destroy;
|
|
begin
|
|
FItems.Free;
|
|
FDesignHelper.Free;
|
|
inherited;
|
|
end;
|
|
|
|
{$IFNDEF NONDB}
|
|
|
|
procedure TcxCustomGridViewMenuProvider.GetDataSourceName(const S: string);
|
|
begin
|
|
FDataSourceNames.Add(S);
|
|
end;
|
|
|
|
function TcxCustomGridViewMenuProvider.GetDBGridView: TcxCustomGridView;
|
|
begin
|
|
Result := GridView;
|
|
if not (Result.DataController is TcxDBDataController) then
|
|
Result := nil;
|
|
end;
|
|
|
|
function TcxCustomGridViewMenuProvider.GetViewDataSource: TDataSource;
|
|
begin
|
|
Result := TcxDBDataController(DBGridView.DataController).DataSource;
|
|
end;
|
|
|
|
procedure TcxCustomGridViewMenuProvider.SetViewDataSource(Value: TDataSource);
|
|
begin
|
|
TcxDBDataController(DBGridView.DataController).DataSource := Value;
|
|
end;
|
|
|
|
{$ENDIF}
|
|
|
|
procedure TcxCustomGridViewMenuProvider.DesignerModified;
|
|
begin
|
|
Designer.Modified;
|
|
end;
|
|
|
|
procedure TcxCustomGridViewMenuProvider.ObjectCreated(AObject: TPersistent);
|
|
begin
|
|
SelectObject(AObject);
|
|
DesignerModified;
|
|
end;
|
|
|
|
procedure TcxCustomGridViewMenuProvider.SelectObject(AObject: TPersistent);
|
|
begin
|
|
DesignHelper.SelectObject(AObject, True, False);
|
|
end;
|
|
|
|
procedure TcxCustomGridViewMenuProvider.InitAdditionalItems;
|
|
begin
|
|
Items.AddItem('Edit Layout and Data...', EditLayoutAndData);
|
|
InitCopySettingsFromViewItem;
|
|
Items.AddItem('Set As Default', SetAsDefault);
|
|
end;
|
|
|
|
procedure TcxCustomGridViewMenuProvider.InitCopySettingsFromViewItem;
|
|
var
|
|
AViewList: TcxGridViewList;
|
|
AItem: TcxGridViewMenuItem;
|
|
I: Integer;
|
|
begin
|
|
AViewList := TcxGridViewList.Create(Designer);
|
|
try
|
|
if AViewList.ViewNames.Count = 1 then Exit;
|
|
AItem := Items.AddItem('Copy Settings from View');
|
|
for I := 0 to AViewList.ViewNames.Count - 1 do
|
|
if AViewList.Views[I] <> GridView then
|
|
AItem.AddItem(AViewList.ViewNames[I], CopySettings, True, False, AViewList.Views[I]);
|
|
finally
|
|
AViewList.Free;
|
|
end;
|
|
end;
|
|
|
|
{$IFNDEF NONDB}
|
|
|
|
procedure TcxCustomGridViewMenuProvider.InitDataBindingItems;
|
|
var
|
|
I: Integer;
|
|
AItem: TcxGridViewMenuItem;
|
|
ADataSourceNames: TStringList;
|
|
|
|
function IsDataSourceLinked(AIndex: Integer): Boolean;
|
|
begin
|
|
Result := Designer.GetComponent(ADataSourceNames[AIndex]) = ViewDataSource;
|
|
end;
|
|
|
|
begin
|
|
ADataSourceNames := GetDataSourceNames;
|
|
try
|
|
if ADataSourceNames.Count = 0 then Exit;
|
|
if ADataSourceNames.Count = 1 then
|
|
Items.AddItem('Link to ' + ADataSourceNames[0], LinkToDataSource, True,
|
|
IsDataSourceLinked(0), TObject(0))
|
|
else
|
|
begin
|
|
AItem := Items.AddItem('Link to DataSource', nil, True, False);
|
|
for I := 0 to ADataSourceNames.Count - 1 do
|
|
AItem.AddItem(ADataSourceNames[I], LinkToDataSource, True,
|
|
IsDataSourceLinked(I), TObject(I));
|
|
end;
|
|
finally
|
|
ADataSourceNames.Free;
|
|
end;
|
|
end;
|
|
|
|
{$ENDIF}
|
|
|
|
procedure TcxCustomGridViewMenuProvider.InitItems;
|
|
begin
|
|
{$IFNDEF NONDB}
|
|
if DBGridView <> nil then
|
|
begin
|
|
InitDataBindingItems;
|
|
Items.AddSeparator;
|
|
end;
|
|
{$ENDIF}
|
|
InitStructureItems;
|
|
Items.AddSeparator;
|
|
InitLayoutItems;
|
|
Items.AddSeparator;
|
|
InitAdditionalItems;
|
|
end;
|
|
|
|
procedure TcxCustomGridViewMenuProvider.InitLayoutItems;
|
|
begin
|
|
end;
|
|
|
|
procedure TcxCustomGridViewMenuProvider.InitStructureItems;
|
|
begin
|
|
Items.AddItem('Delete View', DeleteView, CanDeleteComponent(GridView.Owner, GridView));
|
|
end;
|
|
|
|
procedure TcxCustomGridViewMenuProvider.CopySettings(Sender: TcxGridViewMenuItem);
|
|
begin
|
|
GridView.AssignSettings(Sender.Data as TcxCustomGridView);
|
|
DesignerModified;
|
|
end;
|
|
|
|
procedure TcxCustomGridViewMenuProvider.DeleteView(Sender: TcxGridViewMenuItem);
|
|
begin
|
|
SelectObject(GridView.Level);
|
|
GridView.Free;
|
|
DesignerModified;
|
|
end;
|
|
|
|
procedure TcxCustomGridViewMenuProvider.EditLayoutAndData(Sender: TcxGridViewMenuItem);
|
|
begin
|
|
if ShowGridViewEditor(GridView) then
|
|
DesignerModified;
|
|
end;
|
|
|
|
procedure TcxCustomGridViewMenuProvider.SetAsDefault(Sender: TcxGridViewMenuItem);
|
|
begin
|
|
SaveViewToTemplate(GetViewTemplateRegKey, GridView);
|
|
end;
|
|
|
|
{$IFNDEF NONDB}
|
|
|
|
function TcxCustomGridViewMenuProvider.GetDataSourceNames: TStringList;
|
|
begin
|
|
Result := TStringList.Create;
|
|
FDataSourceNames := Result;
|
|
Designer.GetComponentNames(GetTypeData(TypeInfo(TDataSource)), GetDataSourceName);
|
|
FDataSourceNames := nil;
|
|
Result.Sort;
|
|
end;
|
|
|
|
procedure TcxCustomGridViewMenuProvider.LinkToDataSource(Sender: TcxGridViewMenuItem);
|
|
var
|
|
ADataSourceNames: TStringList;
|
|
ADataSource: TDataSource;
|
|
begin
|
|
ADataSourceNames := GetDataSourceNames;
|
|
try
|
|
ADataSource := TDataSource(Designer.GetComponent(ADataSourceNames[Integer(Sender.Data)]));
|
|
(DBGridView.DataController as IcxCustomGridDataController).DeleteAllItems;
|
|
ViewDataSource := ADataSource;
|
|
(DBGridView.DataController as IcxCustomGridDataController).CreateAllItems(False);
|
|
DesignerModified;
|
|
finally
|
|
ADataSourceNames.Free;
|
|
end;
|
|
end;
|
|
|
|
{$ENDIF}
|
|
|
|
{ TcxGridViewList }
|
|
|
|
constructor TcxGridViewList.Create(ADesigner: IDesigner);
|
|
begin
|
|
inherited Create;
|
|
FDesigner := ADesigner;
|
|
FViewNames := TStringList.Create;
|
|
GetViewNames;
|
|
FViewNames.Sorted := True;
|
|
end;
|
|
|
|
destructor TcxGridViewList.Destroy;
|
|
begin
|
|
FViewNames.Free;
|
|
inherited;
|
|
end;
|
|
|
|
function TcxGridViewList.GetView(Index: Integer): TcxCustomGridView;
|
|
begin
|
|
if (0 <= Index) and (Index < ViewNames.Count) then
|
|
Result := Designer.GetComponent(ViewNames[Index]) as TcxCustomGridView
|
|
else
|
|
Result := nil;
|
|
end;
|
|
|
|
procedure TcxGridViewList.AddViewName(const S: string);
|
|
begin
|
|
FViewNames.Add(S);
|
|
end;
|
|
|
|
procedure TcxGridViewList.GetViewNames;
|
|
begin
|
|
ViewNames.Clear;
|
|
Designer.GetComponentNames(GetTypeData(PTypeInfo(TcxCustomGridView.ClassInfo)), AddViewName);
|
|
end;
|
|
|
|
function TcxGridViewList.GetViewIndex(AView: TcxCustomGridView): Integer;
|
|
begin
|
|
Result := ViewNames.IndexOf(Designer.GetComponentName(AView));
|
|
end;
|
|
|
|
initialization
|
|
ViewEditorClassList := TcxRegisteredClassList.Create;
|
|
ViewMenuProviderClassList := TcxRegisteredClassList.Create;
|
|
RegisterViewMenuProviderClass(TcxCustomGridView, TcxCustomGridViewMenuProvider);
|
|
|
|
finalization
|
|
UnregisterViewMenuProviderClass(TcxCustomGridView, TcxCustomGridViewMenuProvider);
|
|
FreeAndNil(ViewMenuProviderClassList);
|
|
FreeAndNil(ViewEditorClassList);
|
|
FreeAndNil(DefaultViewStorages);
|
|
|
|
end.
|