home *** CD-ROM | disk | FTP | other *** search
/ CD Actual Thematic 25: Programming / pc_actual_25.iso / Delphi / eXpertDevelopmentKit / SOURCE / XDKMNUED.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1998-01-26  |  11.2 KB  |  410 lines

  1. {*******************************************************}
  2. {                                                       }
  3. {       eXpert Development Kit                          }
  4. {                                                       }
  5. {       Copyright (c) 1996,97 Sergey Orlik              }
  6. {       - product manager of Borland Russia             }
  7. {                                                       }
  8. {*******************************************************}
  9. unit XDKMnuEd;
  10.  
  11. interface
  12.  
  13. uses
  14.   Windows, Messages, SysUtils, Classes, Graphics, Controls,
  15.   Forms, Dialogs, CommCtrl, ComCtrls, StdCtrls, Buttons,
  16.   DsgnIntf, DsgnWnds, ToolIntf, LibIntf,
  17.   XDKMenu;
  18.  
  19. type
  20.   TxdkIDEMenuItemProperty = class(TStringProperty)
  21.     function  GetAttributes: TPropertyAttributes; override;
  22.     procedure GetValues(Proc:TGetStrProc); override;
  23.   end;
  24.  
  25.   TxdkAddInMenuEditor = class(TComponentEditor)
  26.   public
  27.     procedure ExecuteVerb(Index:integer); override;
  28.     function GetVerb(Index:integer):string; override;
  29.     function GetVerbCount:integer; override;
  30.   end;
  31.  
  32.   TxdkAddInMenuItemProperty = class (TClassProperty)
  33.   public
  34.     procedure Edit; override;
  35.     function GetAttributes:TPropertyAttributes; override;
  36.   end;
  37.  
  38.   TxdkAddInMenuDesigner = class(TDesignWindow)
  39.     ItemsTree: TTreeView;
  40.     BtnAdd: TBitBtn;
  41.     BtnSub: TBitBtn;
  42.     BtnIns: TBitBtn;
  43.     BtnDel: TBitBtn;
  44.     BitBtn1: TBitBtn;
  45.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  46.     procedure BtnAddClick(Sender: TObject);
  47.     procedure BtnSubClick(Sender: TObject);
  48.     procedure BtnInsClick(Sender: TObject);
  49.     procedure BtnDelClick(Sender: TObject);
  50.     procedure ItemsTreeEdited(Sender: TObject; Node: TTreeNode;
  51.       var S: String);
  52.     procedure ItemsTreeChange(Sender: TObject; Node: TTreeNode);
  53.     procedure BitBtn1Click(Sender: TObject);
  54.   private
  55.     procedure LoadMenuData;  
  56.   protected
  57.     AddInMenu : TxdkAddInMenu;
  58.     procedure Activated; override; // TWindowDesigner
  59.   public
  60.     function  Items:TxdkAddInMenuItem;
  61.     procedure FormModified; override; // TWindowDesigner
  62.     procedure ComponentDeleted(Component:TComponent); override; // TWindowDesigner
  63.     procedure FormClosed(AForm:TCustomForm); override;  // TWindowDesigner
  64.   end;
  65.  
  66. //===========================================================
  67. implementation
  68.  
  69. {$R *.DFM}
  70. {$R IDEMenus.res}
  71.  
  72. //===========================================================
  73. // TxdkIDEMenuItemProperty
  74.  
  75. function TxdkIDEMenuItemProperty.GetAttributes:TPropertyAttributes;
  76. begin
  77.   Result:=inherited GetAttributes+[paValueList,paSortList]
  78. end;
  79.  
  80. procedure TxdkIDEMenuItemProperty.GetValues(Proc: TGetStrProc);
  81. const
  82.   ResourceBufferSize = 2000;
  83. var
  84.   Resource : THandle;
  85.   ResourceSize: Integer;
  86.   ResourcePtr, ResourceBuffer: PChar;
  87.   IDEMenusList : TStringList;
  88.   i  : integer;
  89. begin
  90.   IDEMenusList:=TStringList.Create;
  91.   ResourceBuffer:=StrAlloc(ResourceBufferSize);
  92.   ResourceSize:=SizeofResource(HInstance,
  93.     FindResource(HInstance, 'IDEMENUS', RT_RCDATA));
  94.   Resource:=LoadResource(HInstance,
  95.     FindResource(HInstance, 'IDEMENUS', RT_RCDATA));
  96.   ResourcePtr:=LockResource(Resource);
  97.   ResourceBuffer:=StrAlloc(ResourceSize);
  98.   Move(ResourcePtr^, ResourceBuffer^, ResourceSize);
  99.   IDEMenusList.SetText(ResourceBuffer);
  100.   for i:=0 to IDEMenusList.Count-1 do
  101.     Proc(IDEMenusList[i]);
  102.   IDEMenusList.Free;
  103.   StrDispose(ResourceBuffer);
  104.   UnlockResource(Resource);
  105. end;
  106.  
  107. //===========================================================
  108.  
  109. function FindDesigner(AddInMenu: TxdkAddInMenu): TxdkAddInMenuDesigner;
  110. var
  111.   i: integer;
  112. begin
  113.   Result:= nil;
  114.   for i:=0 to Screen.FormCount-1 do
  115.   begin
  116.     if Screen.Forms[i] is TxdkAddInMenuDesigner then
  117.     begin
  118.       if TxdkAddInMenuDesigner(Screen.Forms[i]).AddInMenu = AddInMenu then
  119.       begin
  120.         Result:=TxdkAddInMenuDesigner(Screen.Forms[i]);
  121.         Break;
  122.       end;
  123.     end;
  124.   end;
  125. end;
  126.  
  127. procedure ShowAddInMenuDesigner(Designer:TDesigner; AddInMenu:TxdkAddInMenu);
  128. var
  129.   AddInMenuDesigner :TxdkAddInMenuDesigner;
  130. begin
  131.   if AddInMenu=nil then
  132.     Exit;
  133.   AddInMenuDesigner:=FindDesigner(AddInMenu);
  134.   if AddInMenuDesigner<>nil then
  135.     begin
  136.       AddInMenuDesigner.Show;
  137.       if AddInMenuDesigner.WindowState = wsMinimized then
  138.         AddInMenuDesigner.WindowState := wsNormal;
  139.     end
  140.   else
  141.     begin
  142.       AddInMenuDesigner:=TxdkAddInMenuDesigner.Create(Application);
  143.       try
  144.         AddInMenuDesigner.Designer:=TFormDesigner(Designer);
  145.         AddInMenuDesigner.AddInMenu:=AddInMenu;
  146.         AddInMenuDesigner.LoadMenuData;
  147.         AddInMenuDesigner.Show;
  148.       except
  149.         AddInMenuDesigner.Free;
  150.         raise;
  151.       end;
  152.     end;
  153. end;
  154.  
  155. //===========================================================
  156. // TxdkAddInMenuEditor
  157.  
  158. procedure TxdkAddInMenuEditor.ExecuteVerb(Index:integer);
  159. begin
  160.   case Index of
  161.     0 : ShowAddInMenuDesigner(Designer,TxdkAddInMenu(Component))
  162.   end;
  163. end;
  164.  
  165. function TxdkAddInMenuEditor.GetVerb(Index:integer):string;
  166. begin
  167.   Result:='AddIn Menu Designer ...';
  168. end;
  169.  
  170. function TxdkAddInMenuEditor.GetVerbCount:integer;
  171. begin
  172.   Result:=1;
  173. end;
  174.  
  175. //===========================================================
  176. // TxdkAddInMenuItemProperty
  177.  
  178. procedure TxdkAddInMenuItemProperty.Edit;
  179. begin
  180.   ShowAddInMenuDesigner(Designer,TxdkAddInMenu(GetComponent(0)));
  181. end;
  182.  
  183. function TxdkAddInMenuItemProperty.GetAttributes:TPropertyAttributes;
  184. begin
  185.   Result:=[paDialog];
  186. end;
  187.  
  188. //===========================================================
  189. // TxdkAddInMenuDesigner
  190.  
  191. procedure TxdkAddInMenuDesigner.Activated;
  192. begin
  193.   if AddInMenu.Items.Count>0 then
  194.     Designer.SelectComponent(AddInMenu.Items[0])
  195.   else
  196.     Designer.SelectComponent(AddInMenu);
  197. end;
  198.  
  199. procedure TxdkAddInMenuDesigner.FormModified;
  200. var
  201.   ModifiedItem: TTreeNode;
  202.  
  203.   // FindModifiedItem
  204.   function FindModifiedItem:TTreeNode;
  205.   var
  206.     i : integer;
  207.  
  208.     function IterateItem(ANode:TTreeNode):TTreeNode;
  209.     var
  210.       i    : integer;
  211.       Node : TTreeNode;
  212.     begin
  213.       if ANode<>nil then
  214.         if ANode.Text<>TxdkAddInMenuItem(ANode.Data).Name then
  215.         begin
  216.           Result:=ANode;
  217.           Exit;
  218.         end;
  219.       Result:=nil;  
  220.       for i:=0 to ANode.Count-1 do
  221.       begin
  222.         Result:=IterateItem(ANode.Item[i]);
  223.         if Assigned(Result) then
  224.           Break;
  225.       end;
  226.     end; // end of IterateItem
  227.  
  228.   begin
  229.     Result:=nil;
  230.     for i:=0 to Items.Count-1 do
  231.     begin
  232.       Result:=IterateItem(ItemsTree.Items[i]);
  233.       if Assigned(Result) then
  234.         Break;
  235.     end;
  236.   end;  // end of FindModifiedItem
  237.  
  238. begin
  239.   ModifiedItem:=FindModifiedItem;
  240.   if ModifiedItem<>nil then
  241.     ModifiedItem.Text:=TxdkAddINMenuItem(ModifiedItem.Data).Name;
  242. end;
  243.  
  244. procedure TxdkAddInMenuDesigner.ComponentDeleted(Component:TComponent);
  245. begin
  246.   if Component=AddInMenu then
  247.     Release;
  248. end;
  249.  
  250. procedure TxdkAddInMenuDesigner.FormClosed(AForm:TCustomForm);
  251. begin
  252.   if (AddInMenu<>nil) and (AForm=AddInMenu.Owner) then  //???
  253.     Release;
  254. end;
  255.  
  256. function TxdkAddInMenuDesigner.Items:TxdkAddInMenuItem;
  257. begin
  258.   Result:=AddInMenu.Items;
  259. end;
  260.  
  261. procedure TxdkAddInMenuDesigner.LoadMenuData;
  262. var
  263.   i : integer;
  264.  
  265.   procedure AddItem(ANode:TTreeNode; Item:TxdkAddInMenuItem);
  266.   var
  267.     i    : integer;
  268.     Node : TTreeNode;
  269.   begin
  270.     Node:=ItemsTree.Items.AddChildObject(ANode,Item.Name,Item);
  271.     for i:=0 to Item.Count-1 do
  272.       AddItem(Node,Item[i]);
  273.   end;
  274.  
  275. begin
  276.   for i:=0 to Items.Count-1 do
  277.     AddItem(nil,Items[i]);
  278.   ItemsTree.FullExpand;
  279. end;
  280.  
  281.  
  282. procedure TxdkAddInMenuDesigner.FormClose(Sender: TObject;
  283.   var Action: TCloseAction);
  284. begin
  285.   Designer.SelectComponent(AddInMenu);
  286.   Action:=caFree;
  287. end;
  288.  
  289. procedure TxdkAddInMenuDesigner.BtnAddClick(Sender: TObject);
  290. var
  291.   NewItem:TTreeNode;
  292.   NewMenuItem:TxdkAddInMenuItem;
  293. begin
  294.   ItemsTree.SetFocus;
  295.   NewMenuItem:=xdkAddInNewMenuItem(AddInMenu.Owner,
  296.                                 Designer.UniqueName(TxdkAddInMenuItem.ClassName));
  297.   NewMenuItem.Caption:=NewMenuItem.Name;
  298.   if (ItemsTree.Selected<>nil) and
  299.      (ItemsTree.Selected.Parent<>nil) and
  300.      (ItemsTree.Selected.Parent.Data<>nil)
  301.   then
  302.     TxdkAddInMenuItem(ItemsTree.Selected.Parent.Data).Add(NewMenuItem)
  303.   else
  304.     begin
  305.       if Items<>nil then
  306.         Items.Add(NewMenuItem);
  307.     end;
  308.   NewItem:=ItemsTree.Items.AddObject(ItemsTree.Selected,NewMenuItem.Name,NewMenuItem);
  309.   ItemsTree.Selected:=NewItem;
  310.   NewItem.EditText;
  311. end;
  312.  
  313. procedure TxdkAddInMenuDesigner.BtnSubClick(Sender: TObject);
  314. var
  315.   NewItem:TTreeNode;
  316.   NewMenuItem:TxdkAddInMenuItem;
  317. begin
  318.   ItemsTree.SetFocus;
  319.   NewMenuItem:=xdkAddInNewMenuItem(AddInMenu.Owner,
  320.                                Designer.UniqueName(TxdkAddInMenuItem.ClassName));
  321.   NewMenuItem.Caption:=NewMenuItem.Name;
  322.   if (ItemsTree.Selected<>nil) and
  323.      (ItemsTree.Selected.Data<>nil)
  324.   then
  325.     TxdkAddInMenuItem(ItemsTree.Selected.Data).Add(NewMenuItem)
  326.   else
  327.     Items.Add(NewMenuItem);
  328.   NewItem:=ItemsTree.Items.AddChildObject(ItemsTree.Selected,NewMenuItem.Name,NewMenuItem);
  329.   ItemsTree.Selected:=NewItem;
  330.   NewItem.EditText;
  331. end;
  332.  
  333. procedure TxdkAddInMenuDesigner.BtnInsClick(Sender: TObject);
  334. var
  335.   NewItem:TTreeNode;
  336.   NewMenuItem:TxdkAddInMenuItem;
  337. begin
  338.   ItemsTree.SetFocus;
  339.   NewMenuItem:=xdkAddInNewMenuItem(AddInMenu.Owner,
  340.                                Designer.UniqueName(TxdkAddInMenuItem.ClassName));
  341.   NewMenuItem.Caption:=NewMenuItem.Name;
  342.   if (ItemsTree.Selected<>nil) then
  343.   begin
  344.     if (ItemsTree.Selected.Level<>0) then
  345.       TxdkAddInMenuItem(ItemsTree.Selected.Parent.Data).Insert(
  346.         TxdkAddInMenuItem(ItemsTree.Selected.Data).MenuIndex,NewMenuItem)
  347.     else
  348.       Items.Insert(TxdkAddInMenuItem(ItemsTree.Selected.Data).MenuIndex,NewMenuItem)
  349.   end else
  350.     Items.Add(NewMenuItem);
  351.   NewItem:=ItemsTree.Items.InsertObject(ItemsTree.Selected,NewMenuItem.Name,NewMenuItem);
  352.   ItemsTree.Selected:=NewItem;
  353.   NewItem.EditText;
  354. end;
  355.  
  356. procedure TxdkAddInMenuDesigner.BtnDelClick(Sender: TObject);
  357. var
  358.   Del : TTreeNode;
  359.   Par : TTreeNode;
  360. begin
  361.   ItemsTree.SetFocus;
  362.   if ItemsTree.Selected=nil then
  363.     Exit;
  364.   Del:=ItemsTree.Selected;
  365.   if Del.Data<>nil then
  366.   begin
  367.     TxdkAddInMenuItem(Del.Data).Free;
  368.     Del.Data:=nil;
  369.   end;
  370.   Par:=Del.Parent;
  371.   if Par=nil then
  372.     begin
  373.       ItemsTree.Selected:=nil;
  374.       Designer.SelectComponent(AddInMenu);
  375.     end
  376.   else
  377.     begin
  378.       ItemsTree.Selected:=Par;
  379.       Designer.SelectComponent(TComponent(Par.Data));
  380.     end;
  381.   ItemsTree.Items.Delete(Del);
  382. end;
  383.  
  384. procedure TxdkAddInMenuDesigner.ItemsTreeEdited(Sender: TObject;
  385.   Node: TTreeNode; var S: String);
  386. begin
  387.   if (s<>EmptyStr) and (s<>TxdkAddInMenuItem(Node.Data).Name) then
  388.   begin
  389.     TxdkAddInMenuItem(Node.Data).Name:=s;
  390.     Designer.Modified;
  391.   end;
  392. end;
  393.  
  394. procedure TxdkAddInMenuDesigner.ItemsTreeChange(Sender: TObject;
  395.   Node: TTreeNode);
  396. begin
  397.   if (Node<>nil) and (Node.Data<>nil) then
  398.     Designer.SelectComponent(TxdkAddInMenuItem(Node.Data))
  399.   else
  400.     Designer.SelectComponent(AddInMenu);
  401. end;
  402.  
  403. procedure TxdkAddInMenuDesigner.BitBtn1Click(Sender: TObject);
  404. begin
  405.   Designer.SelectComponent(AddInMenu);
  406.   Close;
  407. end;
  408.  
  409. end.
  410.