📄 gdregionseditor.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 + -