Designer: Improve MenuEditor, delete only one item at time. Issue #22142, patch from Anton

git-svn-id: trunk@37659 -
This commit is contained in:
juha 2012-06-15 18:01:35 +00:00
parent 744f01cc46
commit 80fa80846b

View File

@ -70,7 +70,10 @@ type
procedure TemplateView(templatemenuitem: string; default_template: Integer); procedure TemplateView(templatemenuitem: string; default_template: Integer);
end; end;
{ TDesignerMenuItem }
TDesignerMenuItem = class TDesignerMenuItem = class
public
SelfPanel: TPanel; SelfPanel: TPanel;
SubMenuPanel: TPanel; SubMenuPanel: TPanel;
SubMenuArrow: TArrow; SubMenuArrow: TArrow;
@ -88,6 +91,8 @@ type
SelfPanelCreated: Boolean; SelfPanelCreated: Boolean;
SubMenuPanelCreated: Boolean; SubMenuPanelCreated: Boolean;
ID: string; ID: string;
RealMenuItem: TMenuItem;
constructor Create(ARealMenuItem: TMenuItem);
end; end;
{ TDesignerMainMenu } { TDesignerMainMenu }
@ -102,7 +107,6 @@ type
fMenu: TMenu; fMenu: TMenu;
fDefaultComponentEditor: TDefaultComponentEditor; fDefaultComponentEditor: TDefaultComponentEditor;
FDesignerPopupMenu: TPopupMenu; FDesignerPopupMenu: TPopupMenu;
TemplateMenuForm: TTemplateMenuForm;
temp_panel: TPanel; temp_panel: TPanel;
temp_level: Integer; temp_level: Integer;
temp_newitemcounter: Integer; temp_newitemcounter: Integer;
@ -110,6 +114,7 @@ type
function GetDesigner: TComponentEditorDesigner; function GetDesigner: TComponentEditorDesigner;
procedure SetRoot(const AValue: TDesignerMenuItem); procedure SetRoot(const AValue: TDesignerMenuItem);
protected protected
procedure DesignerSetSelection(const ASelection: TPersistentSelectionList);
procedure PersistentDeleting(APersistent: TPersistent); procedure PersistentDeleting(APersistent: TPersistent);
function SearchItemByPanel(DMenuItem: TDesignerMenuItem; APanel: TPanel): TDesignerMenuItem; function SearchItemByPanel(DMenuItem: TDesignerMenuItem; APanel: TPanel): TDesignerMenuItem;
procedure ClearAllMenus; procedure ClearAllMenus;
@ -201,6 +206,48 @@ var
TemplateMenuFormCreateAction: Integer; TemplateMenuFormCreateAction: Integer;
XMLConfig: TXMLConfig = nil; XMLConfig: TXMLConfig = nil;
{ TDesignerMenuItem }
constructor TDesignerMenuItem.Create(ARealMenuItem: TMenuItem);
begin
Self.RealMenuItem := ARealMenuItem;
end;
{ TDesignerMainMenu }
procedure TDesignerMainMenu.DesignerSetSelection(
const ASelection: TPersistentSelectionList);
var
i: Integer;
MenuItem, pMenu: TMenuItem;
DesignerItem: TDesignerMenuItem;
InvalidateNeeded: Boolean;
begin
InvalidateNeeded := False;
for i := 0 to ASelection.Count - 1 do
if ASelection.Items[i] is TMenuItem then
begin
MenuItem := TMenuItem(ASelection.Items[i]);
pMenu := MenuItem;
while pMenu.HasParent do
pMenu := pMenu.Parent;
if pMenu <> fMenu.Items then Continue;
DesignerItem := FindDesignerMenuItem(MenuItem);
if not Assigned(DesignerItem) then Continue;
ChangeMenuItem(Root, 2, Root.ID);
InitIndexSequence;
SelectedDesignerMenuItem := DesignerItem.ID;
ChangeMenuItem(Root, 1, SelectedDesignerMenuItem);
CreateIndexSequence(Root, SelectedDesignerMenuItem, 1);
InvalidateNeeded := True;
end;
if InvalidateNeeded then
RealignDesigner;
end;
function TDesignerMainMenu.GetDesigner: TComponentEditorDesigner; function TDesignerMainMenu.GetDesigner: TComponentEditorDesigner;
begin begin
Result:=nil; Result:=nil;
@ -297,8 +344,9 @@ begin
GlobalDesignHook.AddHandlerModified(@OnDesignerModified); GlobalDesignHook.AddHandlerModified(@OnDesignerModified);
//GlobalDesignHook.AddHandlerPersistentAdded(@OnComponentAdded); //GlobalDesignHook.AddHandlerPersistentAdded(@OnComponentAdded);
GlobalDesignHook.AddHandlerPersistentDeleting(@PersistentDeleting); GlobalDesignHook.AddHandlerPersistentDeleting(@PersistentDeleting);
GlobalDesignHook.AddHandlerSetSelection(@DesignerSetSelection);
FRoot := TDesignerMenuItem.Create; FRoot := TDesignerMenuItem.Create(nil);
fMenu := AMenu; fMenu := AMenu;
temp_level := 1; temp_level := 1;
@ -395,7 +443,7 @@ begin
PrevMI := nil; PrevMI := nil;
for i := 0 to fMenu.Items.Count - 1 do for i := 0 to fMenu.Items.Count - 1 do
begin begin
MI := TDesignerMenuItem.Create; MI := TDesignerMenuItem.Create(fMenu.Items[i]);
MI.Caption := fMenu.Items[i].Caption; MI.Caption := fMenu.Items[i].Caption;
MI.Level := temp_level; MI.Level := temp_level;
MI.NextItem := nil; MI.NextItem := nil;
@ -429,7 +477,7 @@ begin
PrevMI:=nil; PrevMI:=nil;
for i:= 0 to AMenuItem.Count-1 do for i:= 0 to AMenuItem.Count-1 do
begin begin
MI := TDesignerMenuItem.Create; MI := TDesignerMenuItem.Create(AMenuItem.Items[i]);
MI.Caption:=AMenuItem.Items[i].Caption; MI.Caption:=AMenuItem.Items[i].Caption;
MI.Level:=temp_level; MI.Level:=temp_level;
MI.NextItem:=nil; MI.NextItem:=nil;
@ -798,8 +846,8 @@ begin
SetCoordinates(POSITION_LEFT, POSITION_TOP, 0, Root); SetCoordinates(POSITION_LEFT, POSITION_TOP, 0, Root);
InitIndexSequence; InitIndexSequence;
CreateIndexSequence(Root, SelectedDesignerMenuItem, 1); CreateIndexSequence(Root, SelectedDesignerMenuItem, 1);
UpdateMenu(fMenu.Items, GetDesignerMenuItem(Root, SelectedDesignerMenuItem).PrevItem, 1, 2); UpdateMenu(fMenu.Items,
RealignDesigner; GetDesignerMenuItem(Root, SelectedDesignerMenuItem).PrevItem, 1, 2);
end; end;
// ------------------------------------------------------------// // ------------------------------------------------------------//
@ -816,8 +864,8 @@ begin
SetCoordinates(POSITION_LEFT, POSITION_TOP, 0, Root); SetCoordinates(POSITION_LEFT, POSITION_TOP, 0, Root);
InitIndexSequence; InitIndexSequence;
CreateIndexSequence(Root, SelectedDesignerMenuItem, 1); CreateIndexSequence(Root, SelectedDesignerMenuItem, 1);
UpdateMenu(fMenu.Items, GetDesignerMenuItem(Root, SelectedDesignerMenuItem).NextItem, 1, 1); UpdateMenu(fMenu.Items,
RealignDesigner; GetDesignerMenuItem(Root,SelectedDesignerMenuItem).NextItem,1,1);
end; end;
// ------------------------------------------------------------// // ------------------------------------------------------------//
@ -834,8 +882,8 @@ begin
SetCoordinates(POSITION_LEFT, POSITION_TOP, 0, Root); SetCoordinates(POSITION_LEFT, POSITION_TOP, 0, Root);
InitIndexSequence; InitIndexSequence;
CreateIndexSequence(Root, SelectedDesignerMenuItem,1); CreateIndexSequence(Root, SelectedDesignerMenuItem,1);
UpdateMenu(fMenu.Items, GetDesignerMenuItem(Root, SelectedDesignerMenuItem).SubMenu, 1, 3); UpdateMenu(fMenu.Items,
RealignDesigner; GetDesignerMenuItem(Root, SelectedDesignerMenuItem).SubMenu, 1, 3);
end; end;
// -----------------------------------------------------------------------// // -----------------------------------------------------------------------//
@ -917,8 +965,7 @@ begin
if APersistent is TMenuItem then if APersistent is TMenuItem then
begin begin
Item := FindDesignerMenuItem(MenuItem); Item := FindDesignerMenuItem(MenuItem);
// how we can compare them? if Item <> nil then
if (Item <> nil) and (Item.Caption = MenuItem.Caption) then
begin begin
DeleteItem(Item); DeleteItem(Item);
SetCoordinates(POSITION_LEFT, POSITION_TOP, 0, Root); SetCoordinates(POSITION_LEFT, POSITION_TOP, 0, Root);
@ -965,208 +1012,213 @@ procedure TDesignerMainMenu.InsertFromTemplateClick(Sender: TObject);
var var
templatemenuitem: string; templatemenuitem: string;
temp_designermenuitem: TDesignerMenuItem; temp_designermenuitem: TDesignerMenuItem;
TemplateMenuForm: TTemplateMenuForm;
begin begin
TemplateMenuFormCreateAction:=1; TemplateMenuFormCreateAction:=1;
TemplateMenuForm:=TTemplateMenuForm.Create(self); TemplateMenuForm:=TTemplateMenuForm.Create(nil);
try
if (TemplateMenuForm.ShowModal = mrOK) then if (TemplateMenuForm.ShowModal = mrOK) then
begin
if (GetDesignerMenuItem(Root, SelectedDesignerMenuItem).SubMenu <> nil) then
begin begin
HideDesignerMenuItem(GetDesignerMenuItem(Root, SelectedDesignerMenuItem));
GetDesignerMenuItem(Root, SelectedDesignerMenuItem).SubMenu:=nil;
GetDesignerMenuItem(Root, SelectedDesignerMenuItem).SubMenuPanel.Visible:=false;
InitIndexSequence;
CreateIndexSequence(Root, SelectedDesignerMenuItem, 1);
UpdateMenu(fMenu.Items, GetDesignerMenuItem(Root, SelectedDesignerMenuItem), 1, 8);
end;
if (TemplateMenuForm.GetSelectedMenuTemplate > NUMBER_OF_DEFAULT_TEMPLATES) then
begin
Str(TemplateMenuForm.GetSelectedMenuTemplate - NUMBER_OF_DEFAULT_TEMPLATES, templatemenuitem);
templatemenuitem:='menu_' + templatemenuitem;
InitIndexSequence;
CreateIndexSequence(Root, SelectedDesignerMenuItem, 1);
ChangeCaption(GetDesignerMenuItem(Root, SelectedDesignerMenuItem), XMLConfig.Getvalue(templatemenuitem + '/Name/Value', ''));
UpdateMenu(fMenu.Items, GetDesignerMenuItem(Root, SelectedDesignerMenuItem), 1, 6);
InsertFromTemplate(templatemenuitem, SelectedDesignerMenuItem);
end
// Some of default templates has been selected
else begin
temp_designermenuitem:=GetDesignerMenuItem(Root, SelectedDesignerMenuItem);
case TemplateMenuForm.GetSelectedMenuTemplate of
1: Begin
// Change a caption of selected designermenuitem fo "File"
ChangeCaption (temp_designermenuitem, lisFile);
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6);
// Add an submenu with first item and set it's caption to "New"
SelectedDesignerMenuItem:=temp_designermenuitem.ID;
AddSubMenuClick(self);
temp_designermenuitem:=temp_designermenuitem.SubMenu;
ChangeCaption (temp_designermenuitem, lisNew);
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6);
// Add new separator
SelectedDesignerMenuItem:=temp_designermenuitem.ID;
AddNewItemAfterClick(self);
temp_designermenuitem:=temp_designermenuitem.NextItem;
ChangeCaption (temp_designermenuitem, '-');
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6);
// Add new item and set it's caption to "Open" if (GetDesignerMenuItem(Root, SelectedDesignerMenuItem).SubMenu <> nil) then
SelectedDesignerMenuItem:=temp_designermenuitem.ID; begin
AddNewItemAfterClick(self); HideDesignerMenuItem(GetDesignerMenuItem(Root, SelectedDesignerMenuItem));
temp_designermenuitem:=temp_designermenuitem.NextItem; GetDesignerMenuItem(Root, SelectedDesignerMenuItem).SubMenu:=nil;
ChangeCaption (temp_designermenuitem, lisOpen); GetDesignerMenuItem(Root, SelectedDesignerMenuItem).SubMenuPanel.Visible:=false;
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6); InitIndexSequence;
CreateIndexSequence(Root, SelectedDesignerMenuItem, 1);
// Add new item and set it's caption to "Open Recent" UpdateMenu(fMenu.Items, GetDesignerMenuItem(Root, SelectedDesignerMenuItem), 1, 8);
SelectedDesignerMenuItem:=temp_designermenuitem.ID;
AddNewItemAfterClick(self);
temp_designermenuitem:=temp_designermenuitem.NextItem;
ChangeCaption (temp_designermenuitem, lisMenuTemplateOpenRecent);
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6);
// Add new item and set it's caption to "Save"
SelectedDesignerMenuItem:=temp_designermenuitem.ID;
AddNewItemAfterClick(self);
temp_designermenuitem:=temp_designermenuitem.NextItem;
ChangeCaption (temp_designermenuitem, lisSave);
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6);
// Add new item and set it's caption to "Save As"
SelectedDesignerMenuItem:=temp_designermenuitem.ID;
AddNewItemAfterClick(self);
temp_designermenuitem:=temp_designermenuitem.NextItem;
ChangeCaption (temp_designermenuitem, lisSaveAs);
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6);
// Add new item and set it's caption to "Close"
SelectedDesignerMenuItem:=temp_designermenuitem.ID;
AddNewItemAfterClick(self);
temp_designermenuitem:=temp_designermenuitem.NextItem;
ChangeCaption (temp_designermenuitem, lisClose);
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6);
// Add new separator
SelectedDesignerMenuItem:=temp_designermenuitem.ID;
AddNewItemAfterClick(self);
temp_designermenuitem:=temp_designermenuitem.NextItem;
ChangeCaption (temp_designermenuitem, '-');
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6);
// Add new item and set it's caption to "Exit"
SelectedDesignerMenuItem:=temp_designermenuitem.ID;
AddNewItemAfterClick(self);
temp_designermenuitem:=temp_designermenuitem.NextItem;
ChangeCaption (temp_designermenuitem, lisExit);
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6);
end;
2: begin
// Change a caption of selected designermenuitem fo "Edit"
ChangeCaption (temp_designermenuitem, lisEdit);
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6);
// Add an submenu with first item and set it's caption to "Undo"
SelectedDesignerMenuItem:=temp_designermenuitem.ID;
AddSubMenuClick(self);
temp_designermenuitem:=temp_designermenuitem.SubMenu;
ChangeCaption (temp_designermenuitem, lisUndo);
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6);
// Add new item and set it's caption to "Redo"
SelectedDesignerMenuItem:=temp_designermenuitem.ID;
AddNewItemAfterClick(self);
temp_designermenuitem:=temp_designermenuitem.NextItem;
ChangeCaption (temp_designermenuitem, lisRedo);
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6);
// Add new separator
SelectedDesignerMenuItem:=temp_designermenuitem.ID;
AddNewItemAfterClick(self);
temp_designermenuitem:=temp_designermenuitem.NextItem;
ChangeCaption (temp_designermenuitem, '-');
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6);
// Add new item and set it's caption to "Cut"
SelectedDesignerMenuItem:=temp_designermenuitem.ID;
AddNewItemAfterClick(self);
temp_designermenuitem:=temp_designermenuitem.NextItem;
ChangeCaption (temp_designermenuitem, lisCut);
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6);
// Add new item and set it's caption to "Copy"
SelectedDesignerMenuItem:=temp_designermenuitem.ID;
AddNewItemAfterClick(self);
temp_designermenuitem:=temp_designermenuitem.NextItem;
ChangeCaption (temp_designermenuitem, lisCopy);
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6);
// Add new item and set it's caption to "Paste"
SelectedDesignerMenuItem:=temp_designermenuitem.ID;
AddNewItemAfterClick(self);
temp_designermenuitem:=temp_designermenuitem.NextItem;
ChangeCaption (temp_designermenuitem, lisPaste);
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6);
// Add new separator
SelectedDesignerMenuItem:=temp_designermenuitem.ID;
AddNewItemAfterClick(self);
temp_designermenuitem:=temp_designermenuitem.NextItem;
ChangeCaption (temp_designermenuitem, '-');
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6);
// Add new item and set it's caption to "Find"
SelectedDesignerMenuItem:=temp_designermenuitem.ID;
AddNewItemAfterClick(self);
temp_designermenuitem:=temp_designermenuitem.NextItem;
ChangeCaption (temp_designermenuitem, lisMenuTemplateFind);
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6);
// Add new item and set it's caption to "Find Next"
SelectedDesignerMenuItem:=temp_designermenuitem.ID;
AddNewItemAfterClick(self);
temp_designermenuitem:=temp_designermenuitem.NextItem;
ChangeCaption (temp_designermenuitem, lisMenuTemplateFindNext);
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6);
end;
3: begin
// Change a caption of selected designermenuitem fo "Help"
ChangeCaption (temp_designermenuitem, lisHelp);
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6);
// Add an submenu with first item and set it's caption to "Contents"
SelectedDesignerMenuItem:=temp_designermenuitem.ID;
AddSubMenuClick(self);
temp_designermenuitem:=temp_designermenuitem.SubMenu;
ChangeCaption (temp_designermenuitem, lisMenuTemplateContents);
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6);
// Add new item and set it's caption to "Tutorial"
SelectedDesignerMenuItem:=temp_designermenuitem.ID;
AddNewItemAfterClick(self);
temp_designermenuitem:=temp_designermenuitem.NextItem;
ChangeCaption (temp_designermenuitem, lisMenuTemplateTutorial);
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6);
// Add new separator
SelectedDesignerMenuItem:=temp_designermenuitem.ID;
AddNewItemAfterClick(self);
temp_designermenuitem:=temp_designermenuitem.NextItem;
ChangeCaption (temp_designermenuitem, '-');
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6);
// Add new item and set it's caption to "About"
SelectedDesignerMenuItem:=temp_designermenuitem.ID;
AddNewItemAfterClick(self);
temp_designermenuitem:=temp_designermenuitem.NextItem;
ChangeCaption (temp_designermenuitem, lisMenuTemplateAbout);
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6 );
end;
end; end;
if (TemplateMenuForm.GetSelectedMenuTemplate > NUMBER_OF_DEFAULT_TEMPLATES) then
begin
Str(TemplateMenuForm.GetSelectedMenuTemplate - NUMBER_OF_DEFAULT_TEMPLATES, templatemenuitem);
templatemenuitem:='menu_' + templatemenuitem;
InitIndexSequence;
CreateIndexSequence(Root, SelectedDesignerMenuItem, 1);
ChangeCaption(GetDesignerMenuItem(Root, SelectedDesignerMenuItem), XMLConfig.Getvalue(templatemenuitem + '/Name/Value', ''));
UpdateMenu(fMenu.Items, GetDesignerMenuItem(Root, SelectedDesignerMenuItem), 1, 6);
InsertFromTemplate(templatemenuitem, SelectedDesignerMenuItem);
end
// Some of default templates has been selected
else begin
temp_designermenuitem:=GetDesignerMenuItem(Root, SelectedDesignerMenuItem);
case TemplateMenuForm.GetSelectedMenuTemplate of
1: Begin
// Change a caption of selected designermenuitem to "File"
ChangeCaption (temp_designermenuitem, lisFile);
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6);
// Add an submenu with first item and set it's caption to "New"
SelectedDesignerMenuItem:=temp_designermenuitem.ID;
AddSubMenuClick(self);
temp_designermenuitem:=temp_designermenuitem.SubMenu;
ChangeCaption (temp_designermenuitem, lisNew);
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6);
// Add new separator
SelectedDesignerMenuItem:=temp_designermenuitem.ID;
AddNewItemAfterClick(self);
temp_designermenuitem:=temp_designermenuitem.NextItem;
ChangeCaption (temp_designermenuitem, '-');
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6);
// Add new item and set it's caption to "Open"
SelectedDesignerMenuItem:=temp_designermenuitem.ID;
AddNewItemAfterClick(self);
temp_designermenuitem:=temp_designermenuitem.NextItem;
ChangeCaption (temp_designermenuitem, lisOpen);
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6);
// Add new item and set it's caption to "Open Recent"
SelectedDesignerMenuItem:=temp_designermenuitem.ID;
AddNewItemAfterClick(self);
temp_designermenuitem:=temp_designermenuitem.NextItem;
ChangeCaption (temp_designermenuitem, lisMenuTemplateOpenRecent);
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6);
// Add new item and set it's caption to "Save"
SelectedDesignerMenuItem:=temp_designermenuitem.ID;
AddNewItemAfterClick(self);
temp_designermenuitem:=temp_designermenuitem.NextItem;
ChangeCaption (temp_designermenuitem, lisSave);
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6);
// Add new item and set it's caption to "Save As"
SelectedDesignerMenuItem:=temp_designermenuitem.ID;
AddNewItemAfterClick(self);
temp_designermenuitem:=temp_designermenuitem.NextItem;
ChangeCaption (temp_designermenuitem, lisSaveAs);
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6);
// Add new item and set it's caption to "Close"
SelectedDesignerMenuItem:=temp_designermenuitem.ID;
AddNewItemAfterClick(self);
temp_designermenuitem:=temp_designermenuitem.NextItem;
ChangeCaption (temp_designermenuitem, lisClose);
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6);
// Add new separator
SelectedDesignerMenuItem:=temp_designermenuitem.ID;
AddNewItemAfterClick(self);
temp_designermenuitem:=temp_designermenuitem.NextItem;
ChangeCaption (temp_designermenuitem, '-');
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6);
// Add new item and set it's caption to "Exit"
SelectedDesignerMenuItem:=temp_designermenuitem.ID;
AddNewItemAfterClick(self);
temp_designermenuitem:=temp_designermenuitem.NextItem;
ChangeCaption (temp_designermenuitem, lisExit);
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6);
end;
2: begin
// Change a caption of selected designermenuitem fo "Edit"
ChangeCaption (temp_designermenuitem, lisEdit);
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6);
// Add an submenu with first item and set it's caption to "Undo"
SelectedDesignerMenuItem:=temp_designermenuitem.ID;
AddSubMenuClick(self);
temp_designermenuitem:=temp_designermenuitem.SubMenu;
ChangeCaption (temp_designermenuitem, lisUndo);
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6);
// Add new item and set it's caption to "Redo"
SelectedDesignerMenuItem:=temp_designermenuitem.ID;
AddNewItemAfterClick(self);
temp_designermenuitem:=temp_designermenuitem.NextItem;
ChangeCaption (temp_designermenuitem, lisRedo);
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6);
// Add new separator
SelectedDesignerMenuItem:=temp_designermenuitem.ID;
AddNewItemAfterClick(self);
temp_designermenuitem:=temp_designermenuitem.NextItem;
ChangeCaption (temp_designermenuitem, '-');
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6);
// Add new item and set it's caption to "Cut"
SelectedDesignerMenuItem:=temp_designermenuitem.ID;
AddNewItemAfterClick(self);
temp_designermenuitem:=temp_designermenuitem.NextItem;
ChangeCaption (temp_designermenuitem, lisCut);
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6);
// Add new item and set it's caption to "Copy"
SelectedDesignerMenuItem:=temp_designermenuitem.ID;
AddNewItemAfterClick(self);
temp_designermenuitem:=temp_designermenuitem.NextItem;
ChangeCaption (temp_designermenuitem, lisCopy);
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6);
// Add new item and set it's caption to "Paste"
SelectedDesignerMenuItem:=temp_designermenuitem.ID;
AddNewItemAfterClick(self);
temp_designermenuitem:=temp_designermenuitem.NextItem;
ChangeCaption (temp_designermenuitem, lisPaste);
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6);
// Add new separator
SelectedDesignerMenuItem:=temp_designermenuitem.ID;
AddNewItemAfterClick(self);
temp_designermenuitem:=temp_designermenuitem.NextItem;
ChangeCaption (temp_designermenuitem, '-');
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6);
// Add new item and set it's caption to "Find"
SelectedDesignerMenuItem:=temp_designermenuitem.ID;
AddNewItemAfterClick(self);
temp_designermenuitem:=temp_designermenuitem.NextItem;
ChangeCaption (temp_designermenuitem, lisMenuTemplateFind);
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6);
// Add new item and set it's caption to "Find Next"
SelectedDesignerMenuItem:=temp_designermenuitem.ID;
AddNewItemAfterClick(self);
temp_designermenuitem:=temp_designermenuitem.NextItem;
ChangeCaption (temp_designermenuitem, lisMenuTemplateFindNext);
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6);
end;
3: begin
// Change a caption of selected designermenuitem fo "Help"
ChangeCaption (temp_designermenuitem, lisHelp);
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6);
// Add an submenu with first item and set it's caption to "Contents"
SelectedDesignerMenuItem:=temp_designermenuitem.ID;
AddSubMenuClick(self);
temp_designermenuitem:=temp_designermenuitem.SubMenu;
ChangeCaption (temp_designermenuitem, lisMenuTemplateContents);
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6);
// Add new item and set it's caption to "Tutorial"
SelectedDesignerMenuItem:=temp_designermenuitem.ID;
AddNewItemAfterClick(self);
temp_designermenuitem:=temp_designermenuitem.NextItem;
ChangeCaption (temp_designermenuitem, lisMenuTemplateTutorial);
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6);
// Add new separator
SelectedDesignerMenuItem:=temp_designermenuitem.ID;
AddNewItemAfterClick(self);
temp_designermenuitem:=temp_designermenuitem.NextItem;
ChangeCaption (temp_designermenuitem, '-');
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6);
// Add new item and set it's caption to "About"
SelectedDesignerMenuItem:=temp_designermenuitem.ID;
AddNewItemAfterClick(self);
temp_designermenuitem:=temp_designermenuitem.NextItem;
ChangeCaption (temp_designermenuitem, lisMenuTemplateAbout);
UpdateMenu(fMenu.Items, temp_designermenuitem, 1, 6 );
end;
end;
end;
RealignDesigner;
end; end;
finally
TemplateMenuForm.Free;
end; end;
end; end;
@ -1223,26 +1275,30 @@ procedure TDesignerMainMenu.SaveAsTemplateClick(Sender: TObject);
var var
i: Integer; i: Integer;
str_i, templatemenuitem: string; str_i, templatemenuitem: string;
TemplateMenuForm: TTemplateMenuForm;
begin begin
i:=1; i:=1;
Str(i,str_i); Str(i,str_i);
templatemenuitem:='menu_' + str_i; templatemenuitem:='menu_' + str_i;
TemplateMenuFormCreateAction:=2; TemplateMenuFormCreateAction:=2;
TemplateMenuForm:=TTemplateMenuForm.Create(self); TemplateMenuForm:=TTemplateMenuForm.Create(nil);
try
if (TemplateMenuForm.ShowModal = mrOK) then if (TemplateMenuForm.ShowModal = mrOK) then
begin
while (XMLConfig.GetValue(templatemenuitem + '/Name/Value','does_not_exists') <> 'does_not_exists') do
begin begin
Inc(i); while (XMLConfig.GetValue(templatemenuitem + '/Name/Value','does_not_exists') <> 'does_not_exists') do
Str(i,str_i); begin
templatemenuitem:='menu_' + str_i; Inc(i);
Str(i,str_i);
templatemenuitem:='menu_' + str_i;
end;
XMLConfig.SetValue(templatemenuitem + '/Description/Value', TemplateMenuForm.GetDescription);
SaveAsTemplate(templatemenuitem, SelectedDesignerMenuItem);
InvalidateFileStateCache;
XMLConfig.Flush;
end; end;
XMLConfig.SetValue(templatemenuitem + '/Description/Value', TemplateMenuForm.GetDescription); finally
SaveAsTemplate(templatemenuitem, SelectedDesignerMenuItem); TemplateMenuForm.Free;
InvalidateFileStateCache;
XMLConfig.Flush;
end; end;
end; end;
@ -1278,66 +1334,71 @@ procedure TDesignerMainMenu.DeleteFromTemplateClick(Sender: TObject);
var var
i,j: Integer; i,j: Integer;
str_i, str_j, old_templatemenuitem, new_templatemenuitem: string; str_i, str_j, old_templatemenuitem, new_templatemenuitem: string;
TemplateMenuForm: TTemplateMenuForm;
begin begin
//SelectedDesignerMenuItem:=GetSelectedDesignerMenuItem(Root); //SelectedDesignerMenuItem:=GetSelectedDesignerMenuItem(Root);
i:=1; i:=1;
j:=1; j:=1;
TemplateMenuFormCreateAction:=3; TemplateMenuFormCreateAction:=3;
TemplateMenuForm:=TTemplateMenuForm.Create(self); TemplateMenuForm:=TTemplateMenuForm.Create(nil);
if (TemplateMenuForm.ShowModal = mrOK) and (TemplateMenuForm.GetSelectedMenuTemplate > 0) then try
begin if (TemplateMenuForm.ShowModal = mrOK) and (TemplateMenuForm.GetSelectedMenuTemplate > 0) then
i:=TemplateMenuForm.GetSelectedMenuTemplate;
Str(i + 1, new_templatemenuitem);
new_templatemenuitem:='menu_' + new_templatemenuitem;
if (XMLConfig.GetValue(new_templatemenuitem + '/Name/Value', 'does_not_exists') <> 'does_not_exists') then
begin begin
i:=TemplateMenuForm.GetSelectedMenuTemplate; i:=TemplateMenuForm.GetSelectedMenuTemplate;
Str(i, new_templatemenuitem); Str(i + 1, new_templatemenuitem);
new_templatemenuitem:='menu_' + new_templatemenuitem; new_templatemenuitem:='menu_' + new_templatemenuitem;
// This deletes all subitems in menuitem, which will be replaced if (XMLConfig.GetValue(new_templatemenuitem + '/Name/Value', 'does_not_exists') <> 'does_not_exists') then
str_i:='1';
while (XMLConfig.GetValue(new_templatemenuitem + '/subitem_' + str_i + '/Name/Value', 'does_not_exists') <> 'does_not_exists') do
begin begin
XMLConfig.DeletePath(new_templatemenuitem + '/subitem_' + str_i); i:=TemplateMenuForm.GetSelectedMenuTemplate;
Inc(i);
Str(i, str_i);
end;
i:=TemplateMenuForm.GetSelectedMenuTemplate;
Str(i + 1, old_templatemenuitem);
old_templatemenuitem:='menu_' + old_templatemenuitem;
while (XMLConfig.GetValue(old_templatemenuitem + '/Name/Value', 'does_not_exists') <> 'does_not_exists') do
begin
// This deletes all subitems in menuitem, which will be replaced
str_j:='1';
while (XMLConfig.GetValue(new_templatemenuitem + '/subitem_' + str_j + '/Name/Value', 'does_not_exists') <> 'does_not_exists') do
begin
XMLConfig.DeletePath(new_templatemenuitem + '/subitem_' + str_j);
Inc(j);
Str(j, str_j);
end;
// (Re)place the old menuitem on other place(on other menuitem) in the menutemplates.xml file
ReplaceInTemplate(old_templatemenuitem, new_templatemenuitem);
Inc(i);
Str(i, new_templatemenuitem); Str(i, new_templatemenuitem);
new_templatemenuitem:='menu_' + new_templatemenuitem; new_templatemenuitem:='menu_' + new_templatemenuitem;
// This deletes all subitems in menuitem, which will be replaced
str_i:='1';
while (XMLConfig.GetValue(new_templatemenuitem + '/subitem_' + str_i + '/Name/Value', 'does_not_exists') <> 'does_not_exists') do
begin
XMLConfig.DeletePath(new_templatemenuitem + '/subitem_' + str_i);
Inc(i);
Str(i, str_i);
end;
i:=TemplateMenuForm.GetSelectedMenuTemplate;
Str(i + 1, old_templatemenuitem); Str(i + 1, old_templatemenuitem);
old_templatemenuitem:='menu_' + old_templatemenuitem; old_templatemenuitem:='menu_' + old_templatemenuitem;
end;
XMLConfig.DeletePath(new_templatemenuitem); while (XMLConfig.GetValue(old_templatemenuitem + '/Name/Value', 'does_not_exists') <> 'does_not_exists') do
end else begin
begin // This deletes all subitems in menuitem, which will be replaced
i:=TemplateMenuForm.GetSelectedMenuTemplate; str_j:='1';
Str(i, old_templatemenuitem); while (XMLConfig.GetValue(new_templatemenuitem + '/subitem_' + str_j + '/Name/Value', 'does_not_exists') <> 'does_not_exists') do
old_templatemenuitem:='menu_' + old_templatemenuitem; begin
XMLConfig.DeletePath(old_templatemenuitem); XMLConfig.DeletePath(new_templatemenuitem + '/subitem_' + str_j);
end; Inc(j);
InvalidateFileStateCache; Str(j, str_j);
XMLConfig.Flush; end;
// (Re)place the old menuitem on other place(on other menuitem) in the menutemplates.xml file
ReplaceInTemplate(old_templatemenuitem, new_templatemenuitem);
Inc(i);
Str(i, new_templatemenuitem);
new_templatemenuitem:='menu_' + new_templatemenuitem;
Str(i + 1, old_templatemenuitem);
old_templatemenuitem:='menu_' + old_templatemenuitem;
end;
XMLConfig.DeletePath(new_templatemenuitem);
end else
begin
i:=TemplateMenuForm.GetSelectedMenuTemplate;
Str(i, old_templatemenuitem);
old_templatemenuitem:='menu_' + old_templatemenuitem;
XMLConfig.DeletePath(old_templatemenuitem);
end;
InvalidateFileStateCache;
XMLConfig.Flush;
end;
finally
TemplateMenuForm.Free;
end; end;
end; end;
@ -1370,42 +1431,30 @@ begin
end; end;
// --------------------------------------------------------------------------------------------------------------// // --------------------------------------------------------------------------------------------------------------//
// Some property og some object has changed -> we need to know if caption of some menuitem has changed ----------// // Some property of some object has changed -> we need to know if caption of some menuitem has changed ----------//
// --------------------------------------------------------------------------------------------------------------// // --------------------------------------------------------------------------------------------------------------//
procedure TDesignerMainMenu.OnDesignerModified(Sender: TObject); procedure TDesignerMainMenu.OnDesignerModified(Sender: TObject);
var var
Selection: TPersistentSelectionList;
i: Integer; i: Integer;
Instance: TPersistent; Instance: TPersistent;
MenuItem: TMenuItem; MenuItem: TMenuItem;
InvalidateNeeded: Boolean; InvalidateNeeded: Boolean;
DesignerMenuItem: TDesignerMenuItem; DesignerMenuItem: TDesignerMenuItem;
begin begin
Selection := TPersistentSelectionList.Create; for i := 0 to TPropertyEditor(Sender).PropCount - 1 do
GlobalDesignHook.GetSelection(Selection); begin
try Instance := TPropertyEditor(Sender).GetComponent(i);
InvalidateNeeded:=false; if Instance is TMenuItem then begin
for i := Selection.Count - 1 downto 0 do MenuItem := TMenuItem(Instance);
begin DesignerMenuItem := FindDesignerMenuItem(MenuItem);
Instance := Selection[i]; if DesignerMenuItem = nil then Continue;
if Instance is TMenuItem
then begin ChangeCaption(DesignerMenuItem, MenuItem.Caption);
MenuItem:=TMenuItem(Instance); InvalidateNeeded := True;
// ToDo
// how to get the Designer menu item?
DesignerMenuItem:=FindDesignerMenuItem(MenuItem);
//writeln('TDesignerMainMenu.OnDesignerModified A ',MenuItem.Name,' ',DesignerMenuItem<>nil,' ',MenuItem.Caption);
if DesignerMenuItem = nil then Continue;
ChangeCaption(DesignerMenuItem, MenuItem.Caption);
InvalidateNeeded := true;
end;
end; end;
if InvalidateNeeded then
RealignDesigner;
finally
Selection.Free;
end; end;
if InvalidateNeeded then
RealignDesigner;
end; end;
procedure TDesignerMainMenu.OnComponentAdded(Sender: TObject); procedure TDesignerMainMenu.OnComponentAdded(Sender: TObject);
@ -1442,7 +1491,7 @@ begin
Result:=nil; Result:=nil;
if (DMenuItem.ID = Ident) then if (DMenuItem.ID = Ident) then
begin begin
NewMI := TDesignerMenuItem.Create; NewMI := TDesignerMenuItem.Create(nil); // it's better to move TMenuItem.Create here from UpdateMenu()
Str(temp_newitemcounter, temp_newitemcounterstring); Str(temp_newitemcounter, temp_newitemcounterstring);
NewMI.Caption:='New Item' + temp_newitemcounterstring; NewMI.Caption:='New Item' + temp_newitemcounterstring;
NewMI.Level:=DMenuItem.Level; NewMI.Level:=DMenuItem.Level;
@ -1505,7 +1554,7 @@ begin
TempMI:=nil; TempMI:=nil;
if (DMenuItem.ID = Ident) then if (DMenuItem.ID = Ident) then
begin begin
NewMI := TDesignerMenuItem.Create; NewMI := TDesignerMenuItem.Create(nil); // it's better to move TMenuItem.Create here from UpdateMenu()
Str(temp_newitemcounter,temp_newitemcounterstring); Str(temp_newitemcounter,temp_newitemcounterstring);
NewMI.Caption:='New Item' + temp_newitemcounterstring; NewMI.Caption:='New Item' + temp_newitemcounterstring;
NewMI.Level:=DMenuItem.Level; NewMI.Level:=DMenuItem.Level;
@ -1550,7 +1599,7 @@ begin
Result:=nil; Result:=nil;
if ((DMenuItem.ID = Ident) and (DMenuItem.SubMenu = nil)) then if ((DMenuItem.ID = Ident) and (DMenuItem.SubMenu = nil)) then
begin begin
new_menuitem := TDesignerMenuItem.Create; new_menuitem := TDesignerMenuItem.Create(nil); // it's better to move TMenuItem.Create here from UpdateMenu()
Str(temp_newitemcounter,temp_newitemcounterstring); Str(temp_newitemcounter,temp_newitemcounterstring);
new_menuitem.Caption:='New Item' + temp_newitemcounterstring; new_menuitem.Caption:='New Item' + temp_newitemcounterstring;
new_menuitem.Level:=DMenuItem.Level + 1; new_menuitem.Level:=DMenuItem.Level + 1;
@ -1778,7 +1827,6 @@ function TDesignerMainMenu.FindDesignerMenuItem(AMenuItem: TMenuItem): TDesigner
function FindRecursive(TheMenuItem: TMenuItem): TDesignerMenuItem; function FindRecursive(TheMenuItem: TMenuItem): TDesignerMenuItem;
var var
ParentDesignerMenuItem: TDesignerMenuItem; ParentDesignerMenuItem: TDesignerMenuItem;
i: Integer;
begin begin
Result := nil; Result := nil;
if TheMenuItem = nil then if TheMenuItem = nil then
@ -1807,12 +1855,8 @@ function TDesignerMainMenu.FindDesignerMenuItem(AMenuItem: TMenuItem): TDesigner
end; end;
if Result <> nil then if Result <> nil then
begin begin
i := TheMenuItem.MenuIndex; while (Result <> nil) and (Result.RealMenuItem <> TheMenuItem) do
while (Result <> nil) and (i > 0) do
begin
Result := Result.NextItem; Result := Result.NextItem;
dec(i);
end;
end; end;
end; end;
@ -1866,11 +1910,12 @@ var
temp_menuitem: TMenuItem; temp_menuitem: TMenuItem;
begin begin
case TheAction of case TheAction of
// Insert new AMenuItem after selected AMenuItem // Insert new AMenuItem after selected AMenuItem
1: begin 1: begin
if (index_sequence[Ind + 1] = -1) then if (index_sequence[Ind + 1] = -1) then
begin begin
temp_menuitem:=TMenuItem.Create(fMenu.Owner); temp_menuitem:=TMenuItem.Create(fMenu.Owner);
DMenuItem.RealMenuItem := temp_menuitem;
temp_menuitem.Caption:=DMenuItem.Caption; temp_menuitem.Caption:=DMenuItem.Caption;
// code from Mattias (one of mail he sent me) // code from Mattias (one of mail he sent me)
@ -1878,7 +1923,6 @@ begin
AMenuItem.Insert(index_sequence[Ind] + 1, temp_menuitem); AMenuItem.Insert(index_sequence[Ind] + 1, temp_menuitem);
GetDesigner.PropertyEditorHook.PersistentAdded(temp_menuitem, true); GetDesigner.PropertyEditorHook.PersistentAdded(temp_menuitem, true);
GetDesigner.Modified; GetDesigner.Modified;
end else end else
begin begin
UpdateMenu(AMenuItem.Items[index_sequence[Ind]], DMenuItem, Ind + 1, TheAction); UpdateMenu(AMenuItem.Items[index_sequence[Ind]], DMenuItem, Ind + 1, TheAction);
@ -1889,6 +1933,7 @@ begin
if (index_sequence[Ind + 1] = -1) then if (index_sequence[Ind + 1] = -1) then
begin begin
temp_menuitem:=TMenuItem.Create(fMenu.Owner); temp_menuitem:=TMenuItem.Create(fMenu.Owner);
DMenuItem.RealMenuItem := temp_menuitem;
temp_menuitem.Caption:=DMenuItem.Caption; temp_menuitem.Caption:=DMenuItem.Caption;
// code from Mattias (one of mail he sent me) // code from Mattias (one of mail he sent me)
@ -1905,7 +1950,8 @@ begin
3: begin 3: begin
if (index_sequence[Ind + 1] = -1) then if (index_sequence[Ind + 1] = -1) then
begin begin
temp_menuitem:=TMenuItem.Create(fMenu.Owner); temp_menuitem:=TMenuItem.Create(fMenu.Owner);
DMenuItem.RealMenuItem := temp_menuitem;
temp_menuitem.Caption:=DMenuItem.Caption; temp_menuitem.Caption:=DMenuItem.Caption;
// code from Mattias (one of mail he sent me) // code from Mattias (one of mail he sent me)
@ -2015,10 +2061,6 @@ begin
Str(i,str_i); Str(i,str_i);
end; end;
// Select the first menu on list and show it in "Template Preview"
if (TemplatesListBox.Items.Count > 0) then
TemplatesListBox.Selected[0]:=true;
case fAction of case fAction of
1: begin 1: begin
// content of "Caption" is generated from LazarusIDEStrConsts // content of "Caption" is generated from LazarusIDEStrConsts
@ -2042,6 +2084,11 @@ begin
TemplateView('menu_1/subitem_', 0); TemplateView('menu_1/subitem_', 0);
end; end;
end; end;
// Select the first menu on list and show it in "Template Preview"
if (TemplatesListBox.Items.Count > 0) then
TemplatesListBox.Selected[0]:=true;
ButtonPanel1.OKButton.OnClick := @OKBitBtnClick; ButtonPanel1.OKButton.OnClick := @OKBitBtnClick;
ButtonPanel1.CancelButton.OnClick := @CancelBitBtnClick; ButtonPanel1.CancelButton.OnClick := @CancelBitBtnClick;
end; end;