cxvieweditor.pas

来自「胜天进销存源码,国产优秀的进销存」· PAS 代码 · 共 966 行 · 第 1/2 页

PAS
966
字号
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.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?