cxcustomtablevieweditor.pas

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

PAS
1,118
字号
{********************************************************************}
{                                                                    }
{       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 cxCustomTableViewEditor;

{$I cxVer.inc}

interface

uses
{$IFDEF DELPHI6}
  Variants,
{$ENDIF}
  Windows, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, ComCtrls, Menus,
  cxClasses, cxCustomData, cxDBData, cxNavigator, cxGridCustomView, cxGridCustomTableView,
  cxGridStructureNavigator, cxViewEditor, cxLookAndFeelPainters, cxButtons,
  cxPC, cxControls;

type
  TcxCustomTableViewEditor = class(TcxViewEditor)
    PageControl1: TcxPageControl;
    TSItems: TcxTabSheet;
    TSSummary: TcxTabSheet;
    Panel1: TPanel;
    BColumnAdd: TcxButton;
    BColumnDelete: TcxButton;
    BColumnAddAll: TcxButton;
    BColumnRestore: TcxButton;
    PMColumns: TPopupMenu;
    MIColumnAdd: TMenuItem;
    MIColumnDelete: TMenuItem;
    MIColumnRestore: TMenuItem;
    MIColumnSelectAll: TMenuItem;
    PageControl2: TcxPageControl;
    TSFooterSummaryItems: TcxTabSheet;
    TSDefaultGroupSummaryItems: TcxTabSheet;
    TabSheet3: TcxTabSheet;
    Panel2: TPanel;
    Panel3: TPanel;
    BAddFooterSummaryItem: TcxButton;
    BDeleteFooterSummaryItem: TcxButton;
    LBFooterSummary: TListBox;
    Panel4: TPanel;
    Label1: TLabel;
    Panel5: TPanel;
    Panel6: TPanel;
    BDefaultGroupSummaryAdd: TcxButton;
    BDefaultGroupSummaryDelete: TcxButton;
    LBDefaultGroupsSummary: TListBox;
    Panel7: TPanel;
    Label2: TLabel;
    PSummaryGroups: TPanel;
    PLinks: TPanel;
    PGroupItems: TPanel;
    Panel11: TPanel;
    BGroupSummaryItemAdd: TcxButton;
    BGroupSummaryItemDelete: TcxButton;
    LBGroupSummaryItems: TListBox;
    Panel12: TPanel;
    Label4: TLabel;
    PGroups: TPanel;
    Panel14: TPanel;
    BSummaryGroupAdd: TcxButton;
    BSummaryGroupDelete: TcxButton;
    LBSummaryGroups: TListBox;
    Panel15: TPanel;
    Label5: TLabel;
    PUnlinkedColumns: TPanel;
    LBUnlinkedColumns: TListBox;
    Panel19: TPanel;
    Label6: TLabel;
    PLinkUnlink: TPanel;
    PLinkedColumns: TPanel;
    LBLinkedColumns: TListBox;
    Panel23: TPanel;
    Label7: TLabel;
    BColumnLink: TcxButton;
    BColumnUnlink: TcxButton;
    Splitter2: TSplitter;
    PGSeparator: TPanel;
    N1: TMenuItem;
    BColumnMoveUp: TcxButton;
    BColumnMoveDown: TcxButton;
    N2: TMenuItem;
    MIColumnMoveUp: TMenuItem;
    MIColumnMoveDown: TMenuItem;
    PMFooterSummary: TPopupMenu;
    MIFooterSummaryAdd: TMenuItem;
    MIFooterSummaryDelete: TMenuItem;
    MenuItem4a: TMenuItem;
    MIFooterSummarySelectAll: TMenuItem;
    PMDefaultGroupsSummary: TPopupMenu;
    MIDefaultGroupSummaryAdd: TMenuItem;
    MIDefaultGroupSummaryDelete: TMenuItem;
    MenuItem3b: TMenuItem;
    MIDefaultGroupSummarySelectAll: TMenuItem;
    PMSummaryGroups: TPopupMenu;
    MISummaryGroupAdd: TMenuItem;
    MISummaryGroupDelete: TMenuItem;
    MenuItem5d: TMenuItem;
    MISummaryGroupSelectAll: TMenuItem;
    PMGroupSummaryItems: TPopupMenu;
    MIGroupSummaryItemsAdd: TMenuItem;
    MIGroupSummaryItemsDelete: TMenuItem;
    MenuItem6c: TMenuItem;
    MIGroupSummaryItemsSelectAll: TMenuItem;
    Panel8: TPanel;
    LBColumns: TListBox;
    Panel9: TPanel;
    Panel10: TPanel;
    Panel13: TPanel;
    Panel16: TPanel;
    Panel17: TPanel;
    Panel18: TPanel;
    BColumnAddMissing: TcxButton;
    procedure LBColumnsClick(Sender: TObject);
    procedure BColumnAddClick(Sender: TObject);
    procedure BColumnDeleteClick(Sender: TObject);
    procedure BColumnRestoreClick(Sender: TObject);
    procedure MIColumnSelectAllClick(Sender: TObject);
    procedure LBFooterSummaryClick(Sender: TObject);
    procedure BAddFooterSummaryItemClick(Sender: TObject);
    procedure BDeleteFooterSummaryItemClick(Sender: TObject);
    procedure LBDefaultGroupsSummaryClick(Sender: TObject);
    procedure BDefaultGroupSummaryAddClick(Sender: TObject);
    procedure BDefaultGroupSummaryDeleteClick(Sender: TObject);
    procedure LBSummaryGroupsClick(Sender: TObject);
    procedure BSummaryGroupAddClick(Sender: TObject);
    procedure BSummaryGroupDeleteClick(Sender: TObject);
    procedure LBGroupSummaryItemsClick(Sender: TObject);
    procedure BGroupSummaryItemAddClick(Sender: TObject);
    procedure BGroupSummaryItemDeleteClick(Sender: TObject);
    procedure LBUnlinkedColumnsClick(Sender: TObject);
    procedure BColumnLinkClick(Sender: TObject);
    procedure BColumnUnlinkClick(Sender: TObject);
    procedure BColumnAddAllClick(Sender: TObject);
    procedure PLinksResize(Sender: TObject);
    procedure PSummaryGroupsResize(Sender: TObject);
    procedure LBColumnsDragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    procedure LBColumnsEndDrag(Sender, Target: TObject; X, Y: Integer);
    procedure LBColumnsStartDrag(Sender: TObject;
      var DragObject: TDragObject);
    procedure LBColumnsDragDrop(Sender, Source: TObject; X, Y: Integer);
    procedure BColumnMoveUpClick(Sender: TObject);
    procedure BColumnMoveDownClick(Sender: TObject);
    procedure MIFooterSummarySelectAllClick(Sender: TObject);
    procedure MIDefaultGroupSummarySelectAllClick(Sender: TObject);
    procedure MISummaryGroupSelectAllClick(Sender: TObject);
    procedure MIGroupSummaryItemsSelectAllClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure LBColumnsDrawItem(Control: TWinControl; Index: Integer;
      Rect: TRect; State: TOwnerDrawState);
    procedure BColumnAddMissingClick(Sender: TObject);
  private
    FColumnsPrevDragIndex: Integer;
    FSummaryGroup: TcxDataSummaryGroup;
    function GetDefaultGroupSummaryItems: TcxDataGroupSummaryItems;
    function GetFooterSummaryItems: TcxDataFooterSummaryItems;
    function GetSummaryGroups: TcxDataSummaryGroups;
    function GetView: TcxCustomGridTableView;
    procedure SetSummaryGroup(Value: TcxDataSummaryGroup);

    procedure ReindexColumnsProc(AList: TList; ANewIndex: Integer);
    procedure UpdateSummaryGroupLinks;
    procedure UpdateSummaryGroups;
  protected
    procedure CalculateListBoxItemHeight(AListBox: TListBox);
    procedure CollectionItemsAdd(AListBox: TListBox; ACollection: TCollection);
    procedure CollectionItemsDelete(AListBox: TListBox; ACollection: TCollection);
    procedure DoCreateViewItems(AMissingItemsOnly: Boolean);
    procedure DrawListBoxItem(AListBox: TWinControl; AIndex: Integer; R: TRect);
    function GetCurrentGroup: TcxDataSummaryGroup;
    function GetDeleteItemsCaption: string; virtual;
    procedure SelectAllColumns;
    procedure UpdateButtons; virtual;
    procedure UpdateColumnList; virtual;
    procedure UpdateEditor; override;
    procedure UpdateSelection; override;
    procedure UpdateSummary;
    procedure UpdateSummarySelection;
    property SummaryGroup: TcxDataSummaryGroup read FSummaryGroup write SetSummaryGroup; 
  public
    class function GetViewByObject(APersistent: TPersistent): TcxCustomGridView; override;
    property DefaultGroupSummaryItems: TcxDataGroupSummaryItems read GetDefaultGroupSummaryItems;
    property FooterSummaryItems: TcxDataFooterSummaryItems read GetFooterSummaryItems;
    property SummaryGroups: TcxDataSummaryGroups read GetSummaryGroups;
    property View: TcxCustomGridTableView read GetView;
  end;

  { TcxCustomGridTableViewStorage }

  TcxCustomGridTableViewStorage = class(TcxCustomGridViewStorage)
  private
    function GetNavigatorButtons: TcxNavigatorControlButtons;
  protected
    function CustomTableView: TcxCustomGridTableView;
  public
    class function GetViewClass: TcxCustomGridViewClass; override;
  published
    property NavigatorButtons: TcxNavigatorControlButtons read GetNavigatorButtons;
  end;

  { TcxCustomGridViewMenuProvider }

  TcxCustomGridTableViewMenuProvider = class(TcxCustomGridViewMenuProvider)
  private
    function GetGridView: TcxCustomGridTableView;
    function GetViewItemNameValue: string;
  protected
    function CanDeleteItems: Boolean;
    procedure CreateAllItems(Sender: TcxGridViewMenuItem);
    procedure CreateItem(Sender: TcxGridViewMenuItem);
    procedure CreateMissingItems(Sender: TcxGridViewMenuItem);
    procedure DeleteAllItems(Sender: TcxGridViewMenuItem);
    procedure InitStructureCreationItems; virtual;
    procedure InitStructureItems; override;
    property ViewItemName: string read GetViewItemNameValue;
  public
    property GridView: TcxCustomGridTableView read GetGridView;
  end;

implementation

uses
  cxDesignWindows;

{$R *.dfm}

function CheckInDataController(APersistent: TPersistent): TcxCustomGridView;
var
  ADataController: TcxCustomDataController;
  AIDataController: IcxCustomGridDataController;
begin
  ADataController := nil;
  if APersistent is TcxCustomDataSummaryItem then
    ADataController := (APersistent as TcxCustomDataSummaryItem).DataController
  else
  if APersistent is TcxDataSummaryItems then
    ADataController := (APersistent as TcxDataSummaryItems).DataController
  else
  if APersistent is TcxDataSummaryGroups then
    ADataController := (APersistent as TcxDataSummaryGroups).Summary.DataController
  else
  if APersistent is TcxDataSummaryGroup then
    ADataController := (APersistent as TcxDataSummaryGroup).SummaryGroups.Summary.DataController
  else
  if APersistent is TcxDataSummaryGroupItemLinks then
    ADataController :=
      (APersistent as TcxDataSummaryGroupItemLinks).SummaryGroup.SummaryGroups.Summary.DataController;
  if (ADataController <> nil) and Supports(ADataController, IcxCustomGridDataController) then
  begin
    Supports(TObject(ADataController), IcxCustomGridDataController, AIDataController);
    Result := AIDataController.GridView;
  end
  else
    Result := nil;
end;

function GetViewItemName(AView: TcxCustomGridTableView): string;
var
  I: Integer;
begin
  Result := TcxCustomGridTableViewAccess.GetItemClass(AView).ClassName;
  for I := Length(Result) downto 1 do
    if Result[I] in ['A'..'Z'] then
    begin
      Delete(Result, 1, I - 1);
      Break;
    end;
end;

function CreateViewItem(AView: TcxCustomGridTableView): TcxCustomGridTableItem;
begin
  Result := AView.CreateItem;
  Result.Name := GetViewItemUniqueName(AView, Result, GetViewItemName(AView));
end;

procedure CreateViewItems(AView: TcxCustomGridView; AMissingItemsOnly: Boolean);
begin
  (AView.DataController as IcxCustomGridDataController).CreateAllItems(AMissingItemsOnly);
end;

{ TcxCustomGridTableViewStorage }

function TcxCustomGridTableViewStorage.GetNavigatorButtons: TcxNavigatorControlButtons;
begin
  Result := CustomTableView.NavigatorButtons;
end;

function TcxCustomGridTableViewStorage.CustomTableView: TcxCustomGridTableView;
begin
  Result := inherited View as TcxCustomGridTableView;
end;

class function TcxCustomGridTableViewStorage.GetViewClass: TcxCustomGridViewClass;
begin
  Result := TcxCustomGridTableView;
end;

{ TcxCustomTableViewEditor }

class function TcxCustomTableViewEditor.GetViewByObject(APersistent: TPersistent): TcxCustomGridView;
begin
  // Items
  if APersistent is TcxCustomGridTableItem then
    Result := (APersistent as TcxCustomGridTableItem).GridView
  else
    // DataController
    Result := CheckInDataController(APersistent);
end;

procedure TcxCustomTableViewEditor.CalculateListBoxItemHeight(AListBox: TListBox);
begin
  with AListBox do
  begin
    Canvas.Font := Font;
    ItemHeight := 2 + Canvas.TextHeight('Qq');
  end;
end;

procedure TcxCustomTableViewEditor.CollectionItemsAdd(AListBox: TListBox;
  ACollection: TCollection);
var
  AItem: TCollectionItem;
begin
  ListBoxClearSelection(AListBox);
  AItem := ACollection.Add;
  ListBoxLoadCollection(AListBox, ACollection);
  ListBoxSelectByObject(AListBox, AItem);
  FormEditor.ListBoxApplySelection(AListBox, nil);
  UpdateDesigner;
end;

procedure TcxCustomTableViewEditor.CollectionItemsDelete(AListBox: TListBox;
  ACollection: TCollection);
begin
  if AListBox.SelCount > 0 then
  begin
    BeginUpdate;
    try

⌨️ 快捷键说明

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