home *** CD-ROM | disk | FTP | other *** search
- {*******************************************************}
- { }
- { eXpert Development Kit }
- { }
- { Copyright (c) 1996,97 Sergey Orlik }
- { - product manager of Borland Russia }
- { }
- {*******************************************************}
- unit XDKMnuEd;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Classes, Graphics, Controls,
- Forms, Dialogs, CommCtrl, ComCtrls, StdCtrls, Buttons,
- DsgnIntf, DsgnWnds, ToolIntf, LibIntf,
- XDKMenu;
-
- type
- TxdkIDEMenuItemProperty = class(TStringProperty)
- function GetAttributes: TPropertyAttributes; override;
- procedure GetValues(Proc:TGetStrProc); override;
- end;
-
- TxdkAddInMenuEditor = class(TComponentEditor)
- public
- procedure ExecuteVerb(Index:integer); override;
- function GetVerb(Index:integer):string; override;
- function GetVerbCount:integer; override;
- end;
-
- TxdkAddInMenuItemProperty = class (TClassProperty)
- public
- procedure Edit; override;
- function GetAttributes:TPropertyAttributes; override;
- end;
-
- TxdkAddInMenuDesigner = class(TDesignWindow)
- ItemsTree: TTreeView;
- BtnAdd: TBitBtn;
- BtnSub: TBitBtn;
- BtnIns: TBitBtn;
- BtnDel: TBitBtn;
- BitBtn1: TBitBtn;
- procedure FormClose(Sender: TObject; var Action: TCloseAction);
- procedure BtnAddClick(Sender: TObject);
- procedure BtnSubClick(Sender: TObject);
- procedure BtnInsClick(Sender: TObject);
- procedure BtnDelClick(Sender: TObject);
- procedure ItemsTreeEdited(Sender: TObject; Node: TTreeNode;
- var S: String);
- procedure ItemsTreeChange(Sender: TObject; Node: TTreeNode);
- procedure BitBtn1Click(Sender: TObject);
- private
- procedure LoadMenuData;
- protected
- AddInMenu : TxdkAddInMenu;
- procedure Activated; override; // TWindowDesigner
- public
- function Items:TxdkAddInMenuItem;
- procedure FormModified; override; // TWindowDesigner
- procedure ComponentDeleted(Component:TComponent); override; // TWindowDesigner
- procedure FormClosed(AForm:TCustomForm); override; // TWindowDesigner
- end;
-
- //===========================================================
- implementation
-
- {$R *.DFM}
- {$R IDEMenus.res}
-
- //===========================================================
- // TxdkIDEMenuItemProperty
-
- function TxdkIDEMenuItemProperty.GetAttributes:TPropertyAttributes;
- begin
- Result:=inherited GetAttributes+[paValueList,paSortList]
- end;
-
- procedure TxdkIDEMenuItemProperty.GetValues(Proc: TGetStrProc);
- const
- ResourceBufferSize = 2000;
- var
- Resource : THandle;
- ResourceSize: Integer;
- ResourcePtr, ResourceBuffer: PChar;
- IDEMenusList : TStringList;
- i : integer;
- begin
- IDEMenusList:=TStringList.Create;
- ResourceBuffer:=StrAlloc(ResourceBufferSize);
- ResourceSize:=SizeofResource(HInstance,
- FindResource(HInstance, 'IDEMENUS', RT_RCDATA));
- Resource:=LoadResource(HInstance,
- FindResource(HInstance, 'IDEMENUS', RT_RCDATA));
- ResourcePtr:=LockResource(Resource);
- ResourceBuffer:=StrAlloc(ResourceSize);
- Move(ResourcePtr^, ResourceBuffer^, ResourceSize);
- IDEMenusList.SetText(ResourceBuffer);
- for i:=0 to IDEMenusList.Count-1 do
- Proc(IDEMenusList[i]);
- IDEMenusList.Free;
- StrDispose(ResourceBuffer);
- UnlockResource(Resource);
- end;
-
- //===========================================================
-
- function FindDesigner(AddInMenu: TxdkAddInMenu): TxdkAddInMenuDesigner;
- var
- i: integer;
- begin
- Result:= nil;
- for i:=0 to Screen.FormCount-1 do
- begin
- if Screen.Forms[i] is TxdkAddInMenuDesigner then
- begin
- if TxdkAddInMenuDesigner(Screen.Forms[i]).AddInMenu = AddInMenu then
- begin
- Result:=TxdkAddInMenuDesigner(Screen.Forms[i]);
- Break;
- end;
- end;
- end;
- end;
-
- procedure ShowAddInMenuDesigner(Designer:TDesigner; AddInMenu:TxdkAddInMenu);
- var
- AddInMenuDesigner :TxdkAddInMenuDesigner;
- begin
- if AddInMenu=nil then
- Exit;
- AddInMenuDesigner:=FindDesigner(AddInMenu);
- if AddInMenuDesigner<>nil then
- begin
- AddInMenuDesigner.Show;
- if AddInMenuDesigner.WindowState = wsMinimized then
- AddInMenuDesigner.WindowState := wsNormal;
- end
- else
- begin
- AddInMenuDesigner:=TxdkAddInMenuDesigner.Create(Application);
- try
- AddInMenuDesigner.Designer:=TFormDesigner(Designer);
- AddInMenuDesigner.AddInMenu:=AddInMenu;
- AddInMenuDesigner.LoadMenuData;
- AddInMenuDesigner.Show;
- except
- AddInMenuDesigner.Free;
- raise;
- end;
- end;
- end;
-
- //===========================================================
- // TxdkAddInMenuEditor
-
- procedure TxdkAddInMenuEditor.ExecuteVerb(Index:integer);
- begin
- case Index of
- 0 : ShowAddInMenuDesigner(Designer,TxdkAddInMenu(Component))
- end;
- end;
-
- function TxdkAddInMenuEditor.GetVerb(Index:integer):string;
- begin
- Result:='AddIn Menu Designer ...';
- end;
-
- function TxdkAddInMenuEditor.GetVerbCount:integer;
- begin
- Result:=1;
- end;
-
- //===========================================================
- // TxdkAddInMenuItemProperty
-
- procedure TxdkAddInMenuItemProperty.Edit;
- begin
- ShowAddInMenuDesigner(Designer,TxdkAddInMenu(GetComponent(0)));
- end;
-
- function TxdkAddInMenuItemProperty.GetAttributes:TPropertyAttributes;
- begin
- Result:=[paDialog];
- end;
-
- //===========================================================
- // TxdkAddInMenuDesigner
-
- procedure TxdkAddInMenuDesigner.Activated;
- begin
- if AddInMenu.Items.Count>0 then
- Designer.SelectComponent(AddInMenu.Items[0])
- else
- Designer.SelectComponent(AddInMenu);
- end;
-
- procedure TxdkAddInMenuDesigner.FormModified;
- var
- ModifiedItem: TTreeNode;
-
- // FindModifiedItem
- function FindModifiedItem:TTreeNode;
- var
- i : integer;
-
- function IterateItem(ANode:TTreeNode):TTreeNode;
- var
- i : integer;
- Node : TTreeNode;
- begin
- if ANode<>nil then
- if ANode.Text<>TxdkAddInMenuItem(ANode.Data).Name then
- begin
- Result:=ANode;
- Exit;
- end;
- Result:=nil;
- for i:=0 to ANode.Count-1 do
- begin
- Result:=IterateItem(ANode.Item[i]);
- if Assigned(Result) then
- Break;
- end;
- end; // end of IterateItem
-
- begin
- Result:=nil;
- for i:=0 to Items.Count-1 do
- begin
- Result:=IterateItem(ItemsTree.Items[i]);
- if Assigned(Result) then
- Break;
- end;
- end; // end of FindModifiedItem
-
- begin
- ModifiedItem:=FindModifiedItem;
- if ModifiedItem<>nil then
- ModifiedItem.Text:=TxdkAddINMenuItem(ModifiedItem.Data).Name;
- end;
-
- procedure TxdkAddInMenuDesigner.ComponentDeleted(Component:TComponent);
- begin
- if Component=AddInMenu then
- Release;
- end;
-
- procedure TxdkAddInMenuDesigner.FormClosed(AForm:TCustomForm);
- begin
- if (AddInMenu<>nil) and (AForm=AddInMenu.Owner) then //???
- Release;
- end;
-
- function TxdkAddInMenuDesigner.Items:TxdkAddInMenuItem;
- begin
- Result:=AddInMenu.Items;
- end;
-
- procedure TxdkAddInMenuDesigner.LoadMenuData;
- var
- i : integer;
-
- procedure AddItem(ANode:TTreeNode; Item:TxdkAddInMenuItem);
- var
- i : integer;
- Node : TTreeNode;
- begin
- Node:=ItemsTree.Items.AddChildObject(ANode,Item.Name,Item);
- for i:=0 to Item.Count-1 do
- AddItem(Node,Item[i]);
- end;
-
- begin
- for i:=0 to Items.Count-1 do
- AddItem(nil,Items[i]);
- ItemsTree.FullExpand;
- end;
-
-
- procedure TxdkAddInMenuDesigner.FormClose(Sender: TObject;
- var Action: TCloseAction);
- begin
- Designer.SelectComponent(AddInMenu);
- Action:=caFree;
- end;
-
- procedure TxdkAddInMenuDesigner.BtnAddClick(Sender: TObject);
- var
- NewItem:TTreeNode;
- NewMenuItem:TxdkAddInMenuItem;
- begin
- ItemsTree.SetFocus;
- NewMenuItem:=xdkAddInNewMenuItem(AddInMenu.Owner,
- Designer.UniqueName(TxdkAddInMenuItem.ClassName));
- NewMenuItem.Caption:=NewMenuItem.Name;
- if (ItemsTree.Selected<>nil) and
- (ItemsTree.Selected.Parent<>nil) and
- (ItemsTree.Selected.Parent.Data<>nil)
- then
- TxdkAddInMenuItem(ItemsTree.Selected.Parent.Data).Add(NewMenuItem)
- else
- begin
- if Items<>nil then
- Items.Add(NewMenuItem);
- end;
- NewItem:=ItemsTree.Items.AddObject(ItemsTree.Selected,NewMenuItem.Name,NewMenuItem);
- ItemsTree.Selected:=NewItem;
- NewItem.EditText;
- end;
-
- procedure TxdkAddInMenuDesigner.BtnSubClick(Sender: TObject);
- var
- NewItem:TTreeNode;
- NewMenuItem:TxdkAddInMenuItem;
- begin
- ItemsTree.SetFocus;
- NewMenuItem:=xdkAddInNewMenuItem(AddInMenu.Owner,
- Designer.UniqueName(TxdkAddInMenuItem.ClassName));
- NewMenuItem.Caption:=NewMenuItem.Name;
- if (ItemsTree.Selected<>nil) and
- (ItemsTree.Selected.Data<>nil)
- then
- TxdkAddInMenuItem(ItemsTree.Selected.Data).Add(NewMenuItem)
- else
- Items.Add(NewMenuItem);
- NewItem:=ItemsTree.Items.AddChildObject(ItemsTree.Selected,NewMenuItem.Name,NewMenuItem);
- ItemsTree.Selected:=NewItem;
- NewItem.EditText;
- end;
-
- procedure TxdkAddInMenuDesigner.BtnInsClick(Sender: TObject);
- var
- NewItem:TTreeNode;
- NewMenuItem:TxdkAddInMenuItem;
- begin
- ItemsTree.SetFocus;
- NewMenuItem:=xdkAddInNewMenuItem(AddInMenu.Owner,
- Designer.UniqueName(TxdkAddInMenuItem.ClassName));
- NewMenuItem.Caption:=NewMenuItem.Name;
- if (ItemsTree.Selected<>nil) then
- begin
- if (ItemsTree.Selected.Level<>0) then
- TxdkAddInMenuItem(ItemsTree.Selected.Parent.Data).Insert(
- TxdkAddInMenuItem(ItemsTree.Selected.Data).MenuIndex,NewMenuItem)
- else
- Items.Insert(TxdkAddInMenuItem(ItemsTree.Selected.Data).MenuIndex,NewMenuItem)
- end else
- Items.Add(NewMenuItem);
- NewItem:=ItemsTree.Items.InsertObject(ItemsTree.Selected,NewMenuItem.Name,NewMenuItem);
- ItemsTree.Selected:=NewItem;
- NewItem.EditText;
- end;
-
- procedure TxdkAddInMenuDesigner.BtnDelClick(Sender: TObject);
- var
- Del : TTreeNode;
- Par : TTreeNode;
- begin
- ItemsTree.SetFocus;
- if ItemsTree.Selected=nil then
- Exit;
- Del:=ItemsTree.Selected;
- if Del.Data<>nil then
- begin
- TxdkAddInMenuItem(Del.Data).Free;
- Del.Data:=nil;
- end;
- Par:=Del.Parent;
- if Par=nil then
- begin
- ItemsTree.Selected:=nil;
- Designer.SelectComponent(AddInMenu);
- end
- else
- begin
- ItemsTree.Selected:=Par;
- Designer.SelectComponent(TComponent(Par.Data));
- end;
- ItemsTree.Items.Delete(Del);
- end;
-
- procedure TxdkAddInMenuDesigner.ItemsTreeEdited(Sender: TObject;
- Node: TTreeNode; var S: String);
- begin
- if (s<>EmptyStr) and (s<>TxdkAddInMenuItem(Node.Data).Name) then
- begin
- TxdkAddInMenuItem(Node.Data).Name:=s;
- Designer.Modified;
- end;
- end;
-
- procedure TxdkAddInMenuDesigner.ItemsTreeChange(Sender: TObject;
- Node: TTreeNode);
- begin
- if (Node<>nil) and (Node.Data<>nil) then
- Designer.SelectComponent(TxdkAddInMenuItem(Node.Data))
- else
- Designer.SelectComponent(AddInMenu);
- end;
-
- procedure TxdkAddInMenuDesigner.BitBtn1Click(Sender: TObject);
- begin
- Designer.SelectComponent(AddInMenu);
- Close;
- end;
-
- end.
-