]> git.lyx.org Git - lyx.git/blobdiff - src/MenuBackend.C
small changes to ButtonController usage
[lyx.git] / src / MenuBackend.C
index 582dd35280ffcf2a88bb35db2303eb98785210be..f4ff0ac0bb7b440a98f6fbd893d9190212b03762 100644 (file)
@@ -14,6 +14,7 @@
 #endif
 
 #include <config.h>
+#include <memory>
 #include "support/LAssert.h"
 #include "MenuBackend.h"
 #include "lyxlex.h"
@@ -63,7 +64,7 @@ Menu & Menu::add(MenuItem const & i)
 }
 
 
-void Menu::read(LyXLex & lex)
+Menu & Menu::read(LyXLex & lex)
 {
        enum Menutags {
                md_item = 1,
@@ -100,7 +101,9 @@ void Menu::read(LyXLex & lex)
                        // fallback to md_item
                case md_item: {
                        lex.next();
-                       string name = _(lex.GetString().c_str());
+                       char * tmp = strdup(lex.GetString().c_str());
+                       string name = _(tmp);
+                       free(tmp);
                        lex.next();
                        string command = lex.GetString();
                        add(MenuItem(MenuItem::Command, name, 
@@ -119,7 +122,9 @@ void Menu::read(LyXLex & lex)
                        break;
                case md_submenu: {
                        lex.next();
-                       string mlabel = _(lex.GetString().c_str());
+                       char * tmp = strdup(lex.GetString().c_str());
+                       string mlabel = _(tmp);
+                       free(tmp);
                        lex.next();
                        string mname = lex.GetString();
                        add(MenuItem(MenuItem::Submenu, mlabel, mname));
@@ -135,6 +140,7 @@ void Menu::read(LyXLex & lex)
                }
        }
        lex.popTable();
+       return *this;
 }
 
 
@@ -163,23 +169,29 @@ void MenuBackend::read(LyXLex & lex)
                lex.printTable(lyxerr);
 
        bool quit = false;
+       bool menubar = false;
 
        while (lex.IsOK() && !quit) {
                switch(lex.lex()) {
+               case md_menubar: 
+                       menubar = true;
+                       // fallback to md_menu
                case md_menu: {
                        lex.next();
                        string name = lex.GetString();
-                       Menu menu(name, false);
-                       menu.read(lex);
-                       add(menu);
-                       break;
-               }
-               case md_menubar: {
-                       lex.next();
-                       string name = lex.GetString();
-                       Menu menubar(name, true);
-                       menubar.read(lex);
-                       add(menubar);
+                       if (hasMenu(name)) {
+                               if (getMenu(name).menubar() == menubar) {
+                                       getMenu(name).read(lex);
+                               } else {
+                                       lex.printError("Cannot append to menu `$$Token' unless it is of the same type");
+                                       return;
+                               }
+                       } else {                                
+                               Menu menu(name, menubar);
+                               menu.read(lex);
+                               add(menu);
+                       }
+                       menubar = false;
                        break;
                }
                case md_endmenuset:
@@ -204,10 +216,10 @@ void MenuBackend::defaults()
 
        Menu file("file");
        file
-               .add(MenuItem(MenuItem::Command, N_("New...|N"), "buffer-new"))
-               .add(MenuItem(MenuItem::Command, N_("Open...|O"), "buffer-open"))
-               .add(MenuItem(MenuItem::Submenu, N_("Import|I"), "import"))
-               .add(MenuItem(MenuItem::Command, N_("Quit|Q"), "lyx-quit"))
+               .add(MenuItem(MenuItem::Command, _("New...|N"), "buffer-new"))
+               .add(MenuItem(MenuItem::Command, _("Open...|O"), "buffer-open"))
+               .add(MenuItem(MenuItem::Submenu, _("Import|I"), "import"))
+               .add(MenuItem(MenuItem::Command, _("Quit|Q"), "lyx-quit"))
                .add(MenuItem(MenuItem::Separator))
                .add(MenuItem(MenuItem::Lastfiles));
        add(file);
@@ -215,17 +227,17 @@ void MenuBackend::defaults()
        Menu import("import");
        import
                .add(MenuItem(MenuItem::Command,
-                             N_("LaTeX...|L"), "buffer-import latex"))
+                             _("LaTeX...|L"), "buffer-import latex"))
                .add(MenuItem(MenuItem::Command,
-                             N_("LinuxDoc...|L"), "buffer-import linuxdoc"));
+                             _("LinuxDoc...|L"), "buffer-import linuxdoc"));
        add(import);
  
        Menu edit("edit");
        edit
-               .add(MenuItem(MenuItem::Command, N_("Cut"), "cut"))
-               .add(MenuItem(MenuItem::Command, N_("Copy"), "copy"))
-               .add(MenuItem(MenuItem::Command, N_("Paste"), "paste"))
-               .add(MenuItem(MenuItem::Command, N_("Emphasize"), "font-emph"));
+               .add(MenuItem(MenuItem::Command, _("Cut"), "cut"))
+               .add(MenuItem(MenuItem::Command, _("Copy"), "copy"))
+               .add(MenuItem(MenuItem::Command, _("Paste"), "paste"))
+               .add(MenuItem(MenuItem::Command, _("Emphasize"), "font-emph"));
        add(edit);
 
        Menu documents("documents");
@@ -234,14 +246,14 @@ void MenuBackend::defaults()
 
        Menu main("main", true);
        main
-               .add(MenuItem(MenuItem::Submenu, N_("File|F"), "file"))
-               .add(MenuItem(MenuItem::Submenu, N_("Edit|E"), "edit"))
+               .add(MenuItem(MenuItem::Submenu, _("File|F"), "file"))
+               .add(MenuItem(MenuItem::Submenu, _("Edit|E"), "edit"))
                .add(MenuItem(MenuItem::Submenu,
-                             N_("Documents|D"), "documents"));
+                             _("Documents|D"), "documents"));
        add(main);
 
        Menu main_nobuffer("main_nobuffer", true);
-       main_nobuffer.add(MenuItem(MenuItem::Submenu, N_("File|F"), "file"));
+       main_nobuffer.add(MenuItem(MenuItem::Submenu, _("File|F"), "file"));
        add(main_nobuffer);
 
        if (lyxerr.debugging(Debug::GUI)) {
@@ -262,7 +274,8 @@ void MenuBackend::add(Menu const & menu)
 
 bool MenuBackend::hasMenu(string const & name) const
 {
-       for (const_iterator cit = begin(); cit != end(); ++cit) {
+       const_iterator mend = end();
+       for (const_iterator cit = begin(); cit != mend; ++cit) {
                if ((*cit).name() == name)
                        return true;
        }
@@ -272,10 +285,25 @@ bool MenuBackend::hasMenu(string const & name) const
 
 Menu const & MenuBackend::getMenu(string const & name) const
 {
-       for (const_iterator cit = begin(); cit != end(); ++cit) {
+       const_iterator mend = end();
+       for (const_iterator cit = begin(); cit != mend; ++cit) {
                if ((*cit).name() == name)
                        return (*cit);
        }
        Assert(false); // we actually require the name to exist.
        return menulist_.front();
 }
+
+
+Menu & MenuBackend::getMenu(string const & name)
+{
+       MenuList::iterator end = menulist_.end();
+       for (MenuList::iterator cit = menulist_.begin(); 
+            cit != end; ++cit) {
+               if ((*cit).name() == name)
+                       return (*cit);
+       }
+       Assert(false); // we actually require the name to exist.
+       return menulist_.front();
+}
+