cxstylerepositoryeditor.pas

来自「胜天进销存源码,国产优秀的进销存」· PAS 代码 · 共 471 行

PAS
471
字号

{********************************************************************}
{                                                                    }
{           Developer Express Visual Component Library               }
{           Express Cross Platform Library classes                   }
{                                                                    }
{           Copyright (c) 2000-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 EXPRESSCROSSPLATFORMLIBRARY 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 cxStyleRepositoryEditor;

{$I cxVer.inc}

interface

uses
  Windows,
{$IFDEF DELPHI6}
    DesignIntf,
  Variants,
{$ELSE}
  DsgnIntf,
{$ENDIF}
  SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, cxDesignWindows, StdCtrls, cxStyles, ExtCtrls, Menus, ComCtrls;

type
  TcxStyleRepositoryEditor = class(TcxDesignFormEditor)
    lbStyles: TListBox;
    btStyleAdd: TButton;
    btStyleDelete: TButton;
    btClose: TButton;
    pnlStyles: TPanel;
    pmStyles: TPopupMenu;
    miStyleAdd: TMenuItem;
    miStyleDelete: TMenuItem;
    N1: TMenuItem;
    miStyleSelectAll: TMenuItem;
    PageControl1: TPageControl;
    tsStyles: TTabSheet;
    tsStyleSheets: TTabSheet;
    lbStyleSheets: TListBox;
    pnlStyleSheets: TPanel;
    btStyleSheetAdd: TButton;
    btStyleSheetDelete: TButton;
    Button3: TButton;
    pmStyleSheets: TPopupMenu;
    miStyleSheetAdd: TMenuItem;
    miStyleSheetDelete: TMenuItem;
    MenuItem3: TMenuItem;
    miStyleSheetSelectAll: TMenuItem;
    btnStyleSheetEdit: TButton;
    imStyleSheetEdit: TMenuItem;
    pmAddStyleSheet: TPopupMenu;
    btnStyleSheetsSave: TButton;
    SaveDialog: TSaveDialog;
    btnStyleSheetsLoad: TButton;
    OpenDialog: TOpenDialog;
    btnStyleSheetsPredefine: TButton;
    procedure lbStylesClick(Sender: TObject);
    procedure btStyleDeleteClick(Sender: TObject);
    procedure btCloseClick(Sender: TObject);
    procedure btStyleAddClick(Sender: TObject);
    procedure miStyleSelectAllClick(Sender: TObject);
    procedure btStyleSheetAddClick(Sender: TObject);
    procedure btStyleSheetDeleteClick(Sender: TObject);
    procedure miStyleSheetSelectAllClick(Sender: TObject);
    procedure lbStyleSheetsClick(Sender: TObject);
    procedure btnStyleSheetEditClick(Sender: TObject);
    procedure btnStyleSheetsSaveClick(Sender: TObject);
    procedure btnStyleSheetsLoadClick(Sender: TObject);
    procedure btnStyleSheetsPredefineClick(Sender: TObject);
  private
    procedure AddStyleSheets(AList: TList);
    function DoStyleGetName(AStyle: TcxStyle): string;
    procedure DoAddStyleSheetMenuItemClick(Sender: TObject);
    procedure InitAddStyleSheetMenu;
    procedure ListBoxSelectComponents(AListBox: TListBox);
    function GetStyleRepository: TcxStyleRepository;
    procedure UpdateButtons;
    procedure UpdateDesigner(Sender: TObject);
    procedure UpdateItems;
    procedure SelectItem(AListBox: TListBox; AItem: TPersistent);
    function FindItemToSelect(AListBox: TListBox): TObject;
    procedure DeleteSelectedComponents(AListBox: TListBox);
  protected
    procedure InitFormEditor; override;
  public
    procedure DoItemsModified; override;
    procedure SelectionsChanged(const ASelection: TDesignerSelectionList); override;
    property StyleRepository: TcxStyleRepository read GetStyleRepository;
  end;

procedure ShowStyleRepositoryEditor(ADesigner: IDesigner;
  AStyleRepository: TcxStyleRepository);

implementation

{$R *.dfm}

uses
  cxStyleSheetEditor, cxStyleSheetsLoad;

procedure ShowStyleRepositoryEditor(ADesigner: IDesigner;
  AStyleRepository: TcxStyleRepository);
begin
  ShowFormEditorClass(ADesigner, AStyleRepository, TcxStyleRepositoryEditor);
end;

function TcxStyleRepositoryEditor.GetStyleRepository: TcxStyleRepository;
begin
  Result := Component as TcxStyleRepository;
end;

procedure TcxStyleRepositoryEditor.UpdateDesigner(Sender: TObject);
begin
  Designer.Modified;
end;

procedure TcxStyleRepositoryEditor.InitFormEditor;
begin
  inherited InitFormEditor;
  UpdateItems;
  UpdateSelection;
  UpdateButtons;
  InitAddStyleSheetMenu;
end;

procedure TcxStyleRepositoryEditor.DoItemsModified;
begin
  UpdateItems;
end;

procedure TcxStyleRepositoryEditor.AddStyleSheets(AList: TList);
var
  I: Integer;
begin
  for I := 0 to AList.Count - 1 do
  begin
    if TcxCustomStyleSheet(AList[I]).Name = '' then
      TcxCustomStyleSheet(AList[I]).Name :=
        CreateUniqueName(Component.Owner, nil, TcxCustomStyleSheet(AList[I]), '', '');
    lbStyleSheets.Items.AddObject(TcxCustomStyleSheet(AList[I]).Name,
      TcxCustomStyleSheet(AList[I]));
  end;
end;

function TcxStyleRepositoryEditor.DoStyleGetName(AStyle: TcxStyle): string;
begin
  if AStyle.Name = '' then
    Result := CreateUniqueName(Component.Owner, nil, AStyle, '', '')
  else Result := AStyle.Name;  
  lbStyles.Items.AddObject(Result, AStyle);
end;

procedure TcxStyleRepositoryEditor.DoAddStyleSheetMenuItemClick(Sender: TObject);
var
  AItem: TcxCustomStyleSheet;
  AList: TList;
begin
  AList := TList.Create;
  try
    GetRegisteredStyleSheetClasses(AList);
    AItem := StyleRepository.CreateStyleSheetEx(
       TcxCustomStyleSheetClass(AList[TMenuItem(Sender).Tag]), StyleRepository.Owner);
  finally
    AList.Free;
  end;
  AItem.Name := CreateUniqueName(Component.Owner, nil, AItem, '', '');
  UpdateItems;
  SelectItem(lbStyleSheets, AItem);
  UpdateButtons;
  UpdateDesigner(nil);
end;

procedure TcxStyleRepositoryEditor.InitAddStyleSheetMenu;
var
  AList: TList;
  AMenuItem: TMenuItem;
  I: Integer;
begin
  AList := TList.Create;
  try
    GetRegisteredStyleSheetClasses(AList);
    for I := 0 to AList.Count - 1 do
    begin
      AMenuItem := TMenuItem.Create(self);
      pmAddStyleSheet.Items.Add(AMenuItem);
      AMenuItem.Caption := TcxCustomStyleSheetClass(AList[I]).ClassName;
      AMenuItem.Tag := I;
      AMenuItem.OnClick := DoAddStyleSheetMenuItemClick;
    end;  
  finally
    AList.Free;
  end;
end;

procedure TcxStyleRepositoryEditor.ListBoxSelectComponents(AListBox: TListBox);
var
  AList: TList;
  I: Integer;
begin
  AList := TList.Create;
  try
    for I := 0 to AListBox.Items.Count - 1 do
      if AListBox.Selected[I] then
        AList.Add(AListBox.Items.Objects[I]);
    SelectComponents(AList, StyleRepository);
  finally
    AList.Free;
  end;
  UpdateButtons;
end;

procedure TcxStyleRepositoryEditor.SelectItem(AListBox: TListBox; AItem: TPersistent);
begin
  with AListBox do
    ItemIndex := Items.IndexOfObject(AItem);
  ListBoxClearSelection(AListBox);
  if Component <> nil then
    if AItem <> nil then
      Designer.SelectComponent(AItem)
    else
      Designer.SelectComponent(Component);
end;

procedure TcxStyleRepositoryEditor.UpdateButtons;
begin
  btStyleDelete.Enabled := lbStyles.SelCount <> 0;
  miStyleDelete.Enabled := btStyleDelete.Enabled;
  miStyleSelectAll.Enabled := btStyleDelete.Enabled;
  btStyleSheetDelete.Enabled := lbStyleSheets.SelCount <> 0;
  miStyleSheetDelete.Enabled := btStyleSheetDelete.Enabled;
  miStyleSheetSelectAll.Enabled := btStyleSheetDelete.Enabled;
  btnStyleSheetsSave.Enabled := btStyleSheetDelete.Enabled;
  btnStyleSheetEdit.Enabled := lbStyleSheets.SelCount = 1;
  imStyleSheetEdit.Enabled := btnStyleSheetEdit.Enabled;
end;

function TcxStyleRepositoryEditor.FindItemToSelect(AListBox: TListBox): TObject;
var
  I: Integer;
begin
  Result := nil;
  with AListBox do
  begin
    if ItemIndex = -1 then Exit;
    if not Selected[ItemIndex] then
      Result := Items.Objects[ItemIndex]
    else
    begin
      for I := ItemIndex + 1 to Items.Count - 1 do
        if not Selected[I] then
        begin
          Result := Items.Objects[I];
          Exit
        end;
      for I := ItemIndex - 1 downto 0 do
        if not Selected[I] then
        begin
          Result := Items.Objects[I];
          Exit
        end;
    end;
  end;
end;

procedure TcxStyleRepositoryEditor.UpdateItems;
var
  I, AItemIndex, ATopIndex: Integer;
  ASelection: TStringList;
begin
  ListBoxSaveSelection(lbStyles, ASelection, AItemIndex, ATopIndex);
  try
    lbStyles.Items.Clear;
    for I := 0 to StyleRepository.Count - 1 do
      lbStyles.Items.AddObject(StyleRepository.Items[I].Name, StyleRepository.Items[I]);
  finally
    ListBoxRestoreSelection(lbStyles, ASelection, AItemIndex, ATopIndex);
  end;
  ListBoxSaveSelection(lbStyleSheets, ASelection, AItemIndex, ATopIndex);
  try
    lbStyleSheets.Items.Clear;
    for I := 0 to StyleRepository. StyleSheetCount - 1 do
      lbStyleSheets.Items.AddObject(StyleRepository.StyleSheets[I].Name, StyleRepository.StyleSheets[I]);
  finally
    ListBoxRestoreSelection(lbStyleSheets, ASelection, AItemIndex, ATopIndex);
  end;
end;

procedure TcxStyleRepositoryEditor.DeleteSelectedComponents(AListBox: TListBox);
var
  I: Integer;
  AItem: TPersistent;
begin
  if AListBox.SelCount > 0 then
  begin
    AItem := FindItemToSelect(AListBox) as TPersistent;
    for I := 0 to AListBox.Items.Count - 1 do
      if AListBox.Selected[I] then
        AListBox.Items.Objects[I].Free;
    UpdateItems;
    SelectItem(AListBox, AItem);
    UpdateButtons;
    UpdateDesigner(nil);
  end;
end;

procedure TcxStyleRepositoryEditor.lbStylesClick(Sender: TObject);
begin
  ListBoxSelectComponents(lbStyles);
end;

procedure TcxStyleRepositoryEditor.lbStyleSheetsClick(Sender: TObject);
begin
  ListBoxSelectComponents(lbStyleSheets);
end;

procedure TcxStyleRepositoryEditor.btStyleDeleteClick(Sender: TObject);
begin
  DeleteSelectedComponents(lbStyles);
end;

procedure TcxStyleRepositoryEditor.btStyleSheetDeleteClick(
  Sender: TObject);
begin
  DeleteSelectedComponents(lbStyleSheets);
end;

procedure TcxStyleRepositoryEditor.SelectionsChanged(const ASelection: TDesignerSelectionList);
var
  AList: TList;
begin
  AList := TList.Create;
  try
    GetSelectionList(AList);
    ListBoxSyncSelection(lbStyles, AList);
    ListBoxSyncSelection(lbStyleSheets, AList);
  finally
    AList.Free;
  end;
  UpdateButtons;
end;

procedure TcxStyleRepositoryEditor.btCloseClick(Sender: TObject);
begin
  Close;
end;

procedure TcxStyleRepositoryEditor.btStyleAddClick(Sender: TObject);
var
  AItem: TcxCustomStyle;
begin
  AItem := StyleRepository.CreateItemEx(TcxStyle, StyleRepository.Owner);
  AItem.Name := CreateUniqueName(Component.Owner, nil, AItem, '', '');
  UpdateItems;
  SelectItem(lbStyles, AItem);
  UpdateButtons;
  UpdateDesigner(nil);
end;  

procedure TcxStyleRepositoryEditor.btStyleSheetAddClick(Sender: TObject);
var
  pt: TPoint;
begin
  pt.X := btStyleAdd.Left;
  pt.Y := btStyleAdd.Top + btStyleAdd.Height;
  pt := btStyleAdd.Parent.ClientToScreen(pt);
  pmAddStyleSheet.Popup(pt.X, pt.Y);
end;

procedure TcxStyleRepositoryEditor.miStyleSelectAllClick(Sender: TObject);
begin
  ListBoxSelectAll(lbStyles);
  lbStylesClick(nil);
end;

procedure TcxStyleRepositoryEditor.miStyleSheetSelectAllClick(Sender: TObject);
begin
  ListBoxSelectAll(lbStyleSheets);
  lbStyleSheetsClick(nil);
end;

procedure TcxStyleRepositoryEditor.btnStyleSheetEditClick(Sender: TObject);
begin
  if ShowcxStyleSheetEditor(TcxCustomStyleSheet(
    lbStyleSheets.Items.Objects[lbStyleSheets.ItemIndex]), DoStyleGetName) then
    Designer.Modified;  
end;

procedure TcxStyleRepositoryEditor.btnStyleSheetsSaveClick(
  Sender: TObject);
var
  I: Integer;
  AList: TList;
begin
  if SaveDialog.Execute then
  begin
    AList := TList.Create;
    try
      for I := 0 to lbStyleSheets.Items.Count - 1 do
        if lbStyleSheets.Selected[I] then
          AList.Add(TcxCustomStyleSheet(lbStyleSheets.Items.Objects[I]));
    SaveStyleSheetsToIniFile(SaveDialog.FileName, AList);
    finally
      AList.Free;
    end;
  end;

end;

procedure TcxStyleRepositoryEditor.btnStyleSheetsLoadClick(
  Sender: TObject);
var
  AStyleSheetList: TList;
begin
  if not OpenDialog.Execute then exit;
  AStyleSheetList := TList.Create;
  try
    ShowLoadStyleSheetsFromIniFile(OpenDialog.FileName, StyleRepository,
      Component.Owner, AStyleSheetList, DoStyleGetName);
    AddStyleSheets(AStyleSheetList);
  finally
    AStyleSheetList.Free;
  end;
end;

procedure TcxStyleRepositoryEditor.btnStyleSheetsPredefineClick(
  Sender: TObject);
var
  AStyleSheetList: TList;
begin
  AStyleSheetList := TList.Create;
  try
    ShowLoadStyleSheetsFromPreDefineStyles(StyleRepository, Component.Owner,
                AStyleSheetList, DoStyleGetName);
    AddStyleSheets(AStyleSheetList);
  finally
    AStyleSheetList.Free;
  end;
end;

end.

⌨️ 快捷键说明

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