⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gdregionseditor.pas

📁 DELPHI皮肤,让你的界面更精典. 可以自己画皮肤,运行速度更快.
💻 PAS
字号:
unit GDRegionsEditor;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Buttons, StdCtrls, ExtCtrls, Menus,GDRegionSelector,GDRegionList,
  DesignEditors,DesignIntf,DesignWindows,Dialogs;

type
  TRegionsEditor = class(TDesignWindow)
    Panel1: TPanel;
    RegionLst: TListBox;
    SpeedButton1: TSpeedButton;
    SpeedButton2: TSpeedButton;
    SpeedButton3: TSpeedButton;
    LocalMenu: TPopupMenu;
    NewItem: TMenuItem;
    N1: TMenuItem;
    CutItem: TMenuItem;
    CopyItem: TMenuItem;
    PasteItem: TMenuItem;
    DeleteItem: TMenuItem;
    SelectAllItem: TMenuItem;
    RegionEdit: TMenuItem;
    procedure NewItemClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure RegionLstClick(Sender: TObject);
    procedure SelectAllItemClick(Sender: TObject);
    procedure CutItemClick(Sender: TObject);
    procedure CopyItemClick(Sender: TObject);
    procedure PasteItemClick(Sender: TObject);
    procedure DeleteItemClick(Sender: TObject);
    procedure LocalMenuPopup(Sender: TObject);
    procedure RegionEditClick(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure RegionLstDblClick(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
    procedure SpeedButton2Click(Sender: TObject);
    procedure SpeedButton3Click(Sender: TObject);
  private
    { Private declarations }
    FSkinRegions:TGDSkinRegions;
    procedure Copy;
    procedure Cut;
    procedure Paste;
    procedure RegionListAdd(Region:TGdSkinRegion);
    procedure RemoveFields(Listbox: TListbox);
    procedure RestoreSelection(List: TListBox; var Selection: TStringList;
      ItemIndex, TopIndex: Integer; RestoreUpdate: Boolean);
    procedure SaveSelection(List: TListBox; var Selection: TStringList;
      var ItemIndex, TopIndex: Integer; NoUpdate: Boolean);
    procedure SelectAll;
    procedure UpdateCaption;
    procedure UpdateDisplay;
    procedure UpdateRegionList;
    procedure UpdateRegionsText;
    procedure UpdateSelection;
    procedure AddItem;
    procedure EditItem;
    procedure DelItem;    
  protected
    procedure Activated; override;
    procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  public
    { Public declarations }
    constructor Create(SkinRegions:TGDSkinRegions;ADesigner: IDesigner);
    function GetEditState: TEditState; override;
    function EditAction(Action: TEditAction): Boolean; override;
    procedure ItemsModified(const Designer: IDesigner); override;
    procedure SelectionChanged(const ADesigner: IDesigner; const ASelection: IDesignerSelections); override;
  end;

  TRegionEditor = class(TDefaultEditor)
  private
    function SkinRegions:TGDSkinRegions;
    procedure EditProperty(const PropertyEditor: IProperty;
      var Continue: Boolean); override;
  public
    procedure ExecuteVerb(Index: Integer);override;
    function GetVerb(Index: Integer): string; override;
    function GetVerbCount: Integer; override;
  end;

  procedure ShowEditor(const SkinRegions: TGDSkinRegions;
    const ADesigner: IDesigner);

  const SRegionEditor='%s.%s';

  procedure Register;

implementation

uses Math;

procedure Register;
begin
  RegisterComponentEditor(TGDSkinRegions, TRegionEditor);
  RegisterNoIcon([TGDSkinRegion]);  
//  RegisterPropertyEditor(TypeInfo(TGDSkinRegion), TGDSkinRegion, '', TRegionProperty);
end;

{$R *.dfm}

var
  RegionsEditor: TRegionsEditor;

procedure ShowEditor(const SkinRegions: TGDSkinRegions;
  const ADesigner: IDesigner);
begin
  if RegionsEditor=Nil then
    RegionsEditor:=TRegionsEditor.Create(SkinRegions,ADesigner);
  try
    SkinRegions.FreeNotification(RegionsEditor);
    RegionsEditor.Show;
  except
    RegionsEditor.Free;
    RegionsEditor:=Nil;
  end;
end;

constructor TRegionsEditor.Create(SkinRegions: TGDSkinRegions;
  ADesigner: IDesigner);
begin
  inherited Create(Application);
  Designer:=ADesigner;
  FSkinRegions:=SkinRegions;
  UpdateDisplay;
  UpdateCaption;
end;

{ TRegionEditor }

procedure TRegionEditor.EditProperty(const PropertyEditor: IProperty;
  var Continue: Boolean);
begin
  if SkinRegions<>Nil then
    ShowEditor(SkinRegions,Designer);
  Continue:=False;
end;

procedure TRegionEditor.ExecuteVerb(Index: Integer);
begin
  if Index = 0 then Edit;
end;

function TRegionEditor.GetVerb(Index: integer): string;
begin
  case Index of
    0:Result:='Region Selector';
  else
    Result:='';
  end;
end;

function TRegionEditor.GetVerbCount: integer;
begin
  Result:=1;
end;

procedure TRegionsEditor.UpdateRegionList;
var
  ItemIndex, TopIndex: Integer;
  Selection: TStringList;
  I:Integer;
  ARegion:TGdSkinRegion;
begin
  SaveSelection(RegionLst, Selection, ItemIndex, TopIndex, True);
  try
    RegionLst.Clear;
    for I:=0 to FSkinRegions.RegionCount-1 do
    begin
      ARegion:=FSkinRegions.Regions[I];
      RegionLst.Items.AddObject(ARegion.Name,ARegion);
    end;
  finally
    RestoreSelection(RegionLst, Selection, ItemIndex, TopIndex, True);
  end;
end;

procedure TRegionsEditor.NewItemClick(Sender: TObject);
begin
  AddItem;
end;

function TRegionEditor.SkinRegions: TGDSkinRegions;
begin
  Result:=Component as TGDSkinRegions;
end;

procedure TRegionsEditor.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  Action := caFree;
end;

procedure TRegionsEditor.Notification(AComponent: TComponent;
  Operation: TOperation);
begin
  inherited;
  if (Operation = opRemove) and
     (AComponent = FSkinRegions) then
    Free;
end;

procedure TRegionsEditor.UpdateSelection;
var
  I: Integer;
  Region: TGdSkinRegion;
  ComponentList: IDesignerSelections;
begin
  ComponentList := TDesignerSelections.Create;
  try
    with RegionLst do
      for I := 0 to Items.Count - 1 do
        if Selected[I] then
        begin
          Region := TGdSkinRegion(Items.Objects[I]){Dataset.FindField(Items[I])};
          if Region <> nil then ComponentList.Add(Region);
        end;
    if ComponentList.Count = 0 then ComponentList.Add(FSkinRegions);
  except
    raise;
  end;
  Designer.SetSelections(ComponentList);
end;

procedure TRegionsEditor.RegionLstClick(Sender: TObject);
begin
  UpdateSelection;
end;

procedure TRegionsEditor.SelectAll;
var
  I: Integer;
begin
  with RegionLst do
    for I := 0 to Items.Count - 1 do Selected[I] := True;
end;

procedure TRegionsEditor.SelectAllItemClick(Sender: TObject);
begin
  SelectAll;
  UpdateSelection;
end;

procedure TRegionsEditor.RemoveFields(Listbox: TListbox);
var
  I, Focused: Integer;
begin
//  CheckFieldDelete;
  try
    try
      Focused := ListBox.ItemIndex;
      with ListBox do
        for I := Items.Count - 1 downto 0 do
          if Selected[I] then
            TGdSkinRegion(Items.Objects[I]).Free;
    finally
      Designer.Modified;
    end;
  finally
    UpdateDisplay;
  end;
  if Focused <> -1 then
  begin
    Focused := Min(Focused, ListBox.Items.Count - 1);
    ListBox.ItemIndex := Focused;
    ListBox.Selected[Focused] := True;
    UpdateSelection;
  end;
  RegionLst.SetFocus  
end;

procedure TRegionsEditor.UpdateDisplay;
begin
  UpdateRegionList;
  UpdateSelection;
end;

procedure TRegionsEditor.Copy;
var
  I: Integer;
  ComponentList: IDesignerSelections;
begin
  ComponentList := TDesignerSelections.Create;
  try
    with RegionLst do
      for I := 0 to Items.Count - 1 do
        if Selected[I] then
          ComponentList.Add(TComponent(Items.Objects[I]){Dataset.FieldByName(Items[I])});
    CopyComponents(FSkinRegions.Owner, ComponentList);
  finally
  end;
end;

procedure TRegionsEditor.Cut;
begin
  Copy;
  RemoveFields(RegionLst);
end;

procedure TRegionsEditor.Paste;
var
  I,Index: Integer;
  ComponentList: IDesignerSelections;
  Region, R: TGdSkinRegion;
begin
  ComponentList := TDesignerSelections.Create;
  try
    R := nil;
    with RegionLst do
      if (ItemIndex <> -1) and (Items.Count > 0) then
        R := TGdSkinRegion(Items.Objects[ItemIndex]){Dataset.FieldByName(Items[ItemIndex])};
    try
      PasteComponents(FSkinRegions.Owner, FSkinRegions, ComponentList);
    finally
      UpdateDisplay;
    end;
    try
      with RegionLst do
        for I := 0 to Items.Count - 1 do Selected[I] := False;
      for I := 0 to ComponentList.Count - 1 do
        if ComponentList[I] is TGdSkinRegion then
        begin
          Region := TGdSkinRegion(ComponentList[I]);
//          Region.Name := UniqueName(Region);
          Index := RegionLst.Items.IndexOf(Region.Name);
          if Index <> -1 then RegionLst.Selected[Index] := True;
        end;
    finally
      UpdateDisplay;
    end;
  finally
  end;
end;

procedure TRegionsEditor.CutItemClick(Sender: TObject);
begin
  Cut;
end;

procedure TRegionsEditor.CopyItemClick(Sender: TObject);
begin
  Copy;
end;

procedure TRegionsEditor.PasteItemClick(Sender: TObject);
begin
  Paste;
end;

procedure TRegionsEditor.DeleteItemClick(Sender: TObject);
begin
  DelItem;
end;

procedure TRegionsEditor.RestoreSelection(List: TListBox;
  var Selection: TStringList; ItemIndex, TopIndex: Integer;
  RestoreUpdate: Boolean);
var
  I: Integer;
begin
  try
    with List do
      for I := 0 to Items.Count - 1 do
        Selected[I] := Selection.IndexOf(Items[I]) <> -1;
    if TopIndex <> -1 then List.TopIndex := TopIndex;
    if ItemIndex <> -1 then List.ItemIndex := ItemIndex;
  finally
    if RestoreUpdate then List.Items.EndUpdate;
    List.Invalidate;
    Selection.Free;
    Selection := nil;
    UpdateSelection;
  end;
end;

procedure TRegionsEditor.SaveSelection(List: TListBox;
  var Selection: TStringList; var ItemIndex, TopIndex: Integer;
  NoUpdate: Boolean);
var
  I: Integer;
begin
  Selection := TStringList.Create;
  try
    ItemIndex := List.ItemIndex;
    TopIndex := List.TopIndex;
    with List do
      for I := 0 to Items.Count - 1 do
        if Selected[I] then Selection.Add(Items[I]);
    if NoUpdate then List.Items.BeginUpdate;
  except
    Selection.Free;
    Selection := nil;
  end;
end;

procedure TRegionsEditor.SelectionChanged(const ADesigner: IDesigner;
  const ASelection: IDesignerSelections);
var
  I: Integer;
  S: Boolean;

  function InSelection(Component: TComponent): Boolean;
  var
    I: Integer;
  begin
    Result := True;
    if ASelection <> nil then
      with ASelection do
        for I := 0 to Count - 1 do
          if Component = Items[I] then Exit;
    Result := False;
  end;

begin
  with RegionLst do
    for I := 0 to Items.Count - 1 do
    begin
      S := InSelection(TComponent(Items.Objects[I]));
      if Selected[I] <> S then Selected[I] := S;
    end;
end;

function TRegionsEditor.EditAction(Action: TEditAction): Boolean;
begin
  Result := True;
  case Action of
    eaCut: Cut;
    eaCopy: Copy;
    eaPaste: Paste;
    eaDelete: RemoveFields(RegionLst);
    eaSelectAll:
      begin
        SelectAll;
        UpdateSelection;
      end;
  else
    Result := False;
  end;

end;

function TRegionsEditor.GetEditState: TEditState;

  function FieldsSelected(Listbox: TListbox): Boolean;
  var
    I: Integer;
  begin
    Result := True;
    with ListBox do
      for I := 0 to Items.Count - 1 do
        if Selected[I] then Exit;
    Result := False;
  end;

begin
  Result := [];
  if ClipboardComponents then Result := [esCanPaste];
  if FieldsSelected(RegionLst) then
    Result := Result + [esCanCopy, esCanCut, esCanDelete];
end;

procedure TRegionsEditor.ItemsModified(const Designer: IDesigner);
begin
  UpdateCaption;
  UpdateRegionsText;
end;

procedure TRegionsEditor.UpdateCaption;
var
  NewCaption: string;
begin
  if (FSkinRegions <> nil) and (FSkinRegions.Owner <> nil) then
    NewCaption := Format(SRegionEditor, [FSkinRegions.Owner.Name,
      FSkinRegions.Name]);
  if Caption <> NewCaption then Caption := NewCaption;
end;

procedure TRegionsEditor.LocalMenuPopup(Sender: TObject);
var
  EditState: TEditState;
begin
  EditState := GetEditState;
  CopyItem.Enabled := esCanCopy in EditState;
  PasteItem.Enabled := esCanPaste in EditState;
  CutItem.Enabled := esCanCut in EditState;
  DeleteItem.Enabled := esCanDelete in EditState;
  SelectAllItem.Enabled := RegionLst.Items.Count > 0;
  RegionEdit.Enabled:=(RegionLst.Count<>0) and (RegionLst.ItemIndex<>-1);
end;

procedure TRegionsEditor.Activated;
begin
  Designer.Activate;
  try
    UpdateSelection;
  except
    RegionLst.Items.Clear;
  end;
end;

procedure TRegionsEditor.UpdateRegionsText;
var
  I: Integer;
  Region: TGdSkinRegion;
begin
  with RegionLst do
  for I:=0 to Items.Count-1 do
  begin
    Region:=TGdSkinRegion(Items.Objects[I]);
    if Region<>Nil then Items.Strings[I]:=Region.Name;
  end;
end;

procedure TRegionsEditor.RegionListAdd(Region: TGdSkinRegion);
var
  Selection: TStringList;
begin
  Selection := TStringList.Create;
  try
    RegionLst.Items.AddObject(Region.Name,Region);
    Selection.Add(Region.Name);
  finally
    RestoreSelection(RegionLst, Selection, -1, -1, False);
  end;
end;

procedure TRegionsEditor.RegionEditClick(Sender: TObject);
begin
  EditItem;
end;

procedure TRegionsEditor.FormDestroy(Sender: TObject);
begin
  RegionsEditor:=Nil;
end;

procedure TRegionsEditor.RegionLstDblClick(Sender: TObject);
begin
  RegionEdit.Click;
end;

procedure TRegionsEditor.AddItem;
var
  Region:TRect;
  AGDRegion:TGdSkinRegion;
begin
  Region:=Rect(0,0,0,0);
  if TRegionSelector.EditRegion(FSkinRegions.Bitmap,Region) then
  begin
    AGDRegion:=TGdSkinRegion.Create(FSkinRegions.Owner);
    try
      AGDRegion.Name:=Designer.UniqueName(AGDRegion.ClassName);
      AGDRegion.Left:=Region.Left;
      AGDRegion.Top:=Region.Top;
      AGDRegion.Rigth:=Region.Right;
      AGDRegion.Bottom:=Region.Bottom;
      AGDRegion.SkinRegions:=FSkinRegions;
      RegionListAdd(AGDRegion);
    except
      on E:Exception do
      begin
        AGDRegion.Free;
        ShowMessage(E.Message);
      end;
    end;
    RegionLst.SetFocus;
  end;

end;

procedure TRegionsEditor.DelItem;
begin
  RemoveFields(RegionLst);
end;

procedure TRegionsEditor.EditItem;
var
  Region:TRect;
  AGDRegion:TGdSkinRegion;
begin
  with RegionLst do
  begin
    if (Count=0) or (ItemIndex=-1) then Exit;
    AGDRegion:=TGdSkinRegion(Items.Objects[ItemIndex]);
    Region:=AGDRegion.GetRect;
    if TRegionSelector.EditRegion(FSkinRegions.Bitmap,Region) then
    begin
      AGDRegion.Left:=Region.Left;
      AGDRegion.Top:=Region.Top;
      AGDRegion.Rigth:=Region.Right;
      AGDRegion.Bottom:=Region.Bottom;
      Designer.Modified;
    end;
  end;

end;

procedure TRegionsEditor.SpeedButton1Click(Sender: TObject);
begin
  AddItem;
end;

procedure TRegionsEditor.SpeedButton2Click(Sender: TObject);
begin
  EditItem;
end;

procedure TRegionsEditor.SpeedButton3Click(Sender: TObject);
begin
  DelItem;
end;

end.

⌨️ 快捷键说明

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