Componentes.Terceros.DevExp.../internal/x.36/1/ExpressQuantumGrid 6/Sources/cxViewEditor.pas
2008-09-04 11:31:51 +00:00

966 lines
29 KiB
ObjectPascal

{********************************************************************}
{ }
{ Developer Express Visual Component Library }
{ ExpressQuantumGrid }
{ }
{ 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 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, 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.