]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/Menus.cpp
thrid attempt at changing the naming pattern of the intermediated 'mocced' files
[lyx.git] / src / frontends / qt4 / Menus.cpp
index 81fbc325296457e76bbc6f0de96ced2b4c0758eb..43e339401da309d9bb12f70ed397a3970a6a1862 100644 (file)
@@ -46,7 +46,7 @@
 #include "Session.h"
 #include "TextClass.h"
 #include "TocBackend.h"
-#include "ToolbarBackend.h"
+#include "Toolbars.h"
 
 #include "insets/Inset.h"
 #include "insets/InsetCitation.h"
@@ -55,6 +55,7 @@
 #include "support/lassert.h"
 #include "support/convert.h"
 #include "support/debug.h"
+#include "support/docstring_list.h"
 #include "support/filetools.h"
 #include "support/gettext.h"
 #include "support/lstrings.h"
@@ -269,7 +270,7 @@ public:
        
        // search for func in this menu iteratively, and put menu
        // names in a stack.
-       bool searchMenu(FuncRequest const & func, std::vector<docstring> & names)
+       bool searchMenu(FuncRequest const & func, docstring_list & names)
                const;
        ///
        bool hasFunc(FuncRequest const &) const;
@@ -287,10 +288,10 @@ public:
        void expandFormats(MenuItem::Kind kind, Buffer const * buf);
        void expandFloatListInsert(Buffer const * buf);
        void expandFloatInsert(Buffer const * buf);
-       void expandFlexInsert(Buffer const * buf, std::string s);
+       void expandFlexInsert(Buffer const * buf, InsetLayout::InsetLyXType type);
        void expandToc2(Toc const & toc_list, size_t from, size_t to, int depth);
        void expandToc(Buffer const * buf);
-       void expandPasteRecent();
+       void expandPasteRecent(Buffer const * buf);
        void expandToolbars();
        void expandBranches(Buffer const * buf);
        void expandCiteStyles(BufferView const *);
@@ -351,7 +352,7 @@ void MenuDefinition::addWithStatusCheck(MenuItem const & i)
                        }
                        if (enabled || !i.optional()) {
                                items_.push_back(i);
-                               items_.back().status().enabled(enabled);
+                               items_.back().status().setEnabled(enabled);
                        }
                }
                else
@@ -591,7 +592,7 @@ void MenuDefinition::checkShortcuts() const
 }
 
 
-bool MenuDefinition::searchMenu(FuncRequest const & func, vector<docstring> & names) const
+bool MenuDefinition::searchMenu(FuncRequest const & func, docstring_list & names) const
 {
        const_iterator m = begin();
        const_iterator m_end = end();
@@ -638,21 +639,15 @@ void MenuDefinition::expandGraphicsGroups(BufferView const * bv)
 {
        if (!bv)
                return;
-       Cursor const & cur = bv->cursor();
-       Buffer const & buf = bv->buffer();
        set<string> grp;
-       InsetGraphics::getGraphicsGroups(buf, grp);
-       set<string>::const_iterator it = grp.begin();
-       set<string>::const_iterator end = grp.end();
+       graphics::getGraphicsGroups(bv->buffer(), grp);
        if (grp.empty())
                return;
 
-       InsetGraphics * ins = InsetGraphics::getCurrentGraphicsInset(cur);
-       if (!ins)
-               return;
-       add(MenuItem(MenuItem::Separator));
-       if (!ins->getParams().groupId.empty())
-               add(MenuItem(MenuItem::Command, qt_("Clear group"), FuncRequest(LFUN_SET_GRAPHICS_GROUP)));
+       set<string>::const_iterator it = grp.begin();
+       set<string>::const_iterator end = grp.end();
+       add(MenuItem(MenuItem::Command, qt_("No Group"), 
+                    FuncRequest(LFUN_SET_GRAPHICS_GROUP)));
        for (; it != end; it++) {
                addWithStatusCheck(MenuItem(MenuItem::Command, toqstr(*it),
                                FuncRequest(LFUN_SET_GRAPHICS_GROUP, *it)));
@@ -661,7 +656,7 @@ void MenuDefinition::expandGraphicsGroups(BufferView const * bv)
 
 void MenuDefinition::expandLastfiles()
 {
-       LastFilesSection::LastFiles const & lf = LyX::cref().session().lastFiles().lastFiles();
+       LastFilesSection::LastFiles const & lf = theSession().lastFiles().lastFiles();
        LastFilesSection::LastFiles::const_iterator lfit = lf.begin();
 
        int ii = 1;
@@ -704,7 +699,7 @@ void MenuDefinition::expandDocuments()
 
 void MenuDefinition::expandBookmarks()
 {
-       lyx::BookmarksSection const & bm = LyX::cref().session().bookmarks();
+       lyx::BookmarksSection const & bm = theSession().bookmarks();
 
        for (size_t i = 1; i <= bm.size(); ++i) {
                if (bm.isValid(i)) {
@@ -812,7 +807,7 @@ void MenuDefinition::expandFloatListInsert(Buffer const * buf)
        for (; cit != end; ++cit) {
                addWithStatusCheck(MenuItem(MenuItem::Command,
                                    qt_(cit->second.listName()),
-                                   FuncRequest(LFUN_FLOAT_LIST,
+                                   FuncRequest(LFUN_FLOAT_LIST_INSERT,
                                                cit->second.type())));
        }
 }
@@ -839,7 +834,8 @@ void MenuDefinition::expandFloatInsert(Buffer const * buf)
 }
 
 
-void MenuDefinition::expandFlexInsert(Buffer const * buf, string s)
+void MenuDefinition::expandFlexInsert(
+               Buffer const * buf, InsetLayout::InsetLyXType type)
 {
        if (!buf) {
                add(MenuItem(MenuItem::Command, qt_("No Document Open!"),
@@ -852,11 +848,16 @@ void MenuDefinition::expandFlexInsert(Buffer const * buf, string s)
        TextClass::InsetLayouts::const_iterator end = insetLayouts.end();
        for (; cit != end; ++cit) {
                docstring const label = cit->first;
-               if (cit->second.lyxtype() == s)
+               if (cit->second.lyxtype() == type)
                        addWithStatusCheck(MenuItem(MenuItem::Command, 
-                               toqstr(label), FuncRequest(LFUN_FLEX_INSERT,
-                                               label)));
+                               toqstr(translateIfPossible(label)),
+                               FuncRequest(LFUN_FLEX_INSERT, label)));
        }
+       // FIXME This is a little clunky.
+       if (items_.empty() && type == InsetLayout::CUSTOM)
+               add(MenuItem(MenuItem::Command,
+                                   qt_("No custom insets defined!"),
+                                   FuncRequest(LFUN_NOACTION)));
 }
 
 
@@ -929,10 +930,6 @@ void MenuDefinition::expandToc(Buffer const * buf)
                return;
        }
 
-       Buffer* cbuf = const_cast<Buffer*>(buf);
-       cbuf->tocBackend().update();
-       cbuf->structureChanged();
-
        // Add an entry for the master doc if this is a child doc
        Buffer const * const master = buf->masterBuffer();
        if (buf != master) {
@@ -953,12 +950,6 @@ void MenuDefinition::expandToc(Buffer const * buf)
                if (cit->first == "tableofcontents")
                        continue;
 
-               if (cit->first == "listing") {
-                       // FIXME: the listing navigate menu causes a crash for unknown
-                       // reason. See http://bugzilla.lyx.org/show_bug.cgi?id=4613
-                       continue;
-               }
-
                MenuDefinition submenu;
                if (cit->second.size() >= 30) {
                        FuncRequest f(LFUN_DIALOG_SHOW, "toc " + cit->first);
@@ -999,12 +990,12 @@ void MenuDefinition::expandToc(Buffer const * buf)
 }
 
 
-void MenuDefinition::expandPasteRecent()
+void MenuDefinition::expandPasteRecent(Buffer const * buf)
 {
-       vector<docstring> const sel = cap::availableSelections();
+       docstring_list const sel = cap::availableSelections(buf);
 
-       vector<docstring>::const_iterator cit = sel.begin();
-       vector<docstring>::const_iterator end = sel.end();
+       docstring_list::const_iterator cit = sel.begin();
+       docstring_list::const_iterator end = sel.end();
 
        for (unsigned int index = 0; cit != end; ++cit, ++index) {
                add(MenuItem(MenuItem::Command, toqstr(*cit),
@@ -1015,27 +1006,23 @@ void MenuDefinition::expandPasteRecent()
 
 void MenuDefinition::expandToolbars()
 {
-       //
+       MenuDefinition other_lists;
        // extracts the toolbars from the backend
-       ToolbarBackend::Toolbars::const_iterator cit = toolbarbackend.begin();
-       ToolbarBackend::Toolbars::const_iterator end = toolbarbackend.end();
-
+       Toolbars::Infos::const_iterator cit = guiApp->toolbars().begin();
+       Toolbars::Infos::const_iterator end = guiApp->toolbars().end();
        for (; cit != end; ++cit) {
-               QString label = qt_(cit->gui_name);
-               // frontends are not supposed to turn on/off toolbars,
-               // if they cannot update ToolbarBackend::flags. That
-               // is to say, ToolbarsBackend::flags should reflect
-               // the true state of toolbars.
-               //
-               // menu is displayed as
-               //       on/off review
-               // and
-               //              review (auto)
-               // in the case of auto.
-               if (cit->flags & ToolbarInfo::AUTO)
-                       label += qt_(" (auto)");
-               add(MenuItem(MenuItem::Command, label,
-                                   FuncRequest(LFUN_TOOLBAR_TOGGLE, cit->name + " allowauto")));
+               MenuItem const item(MenuItem::Command, toqstr(cit->gui_name),
+                               FuncRequest(LFUN_TOOLBAR_TOGGLE, cit->name));
+               if (guiApp->toolbars().isMainToolbar(cit->name))
+                       add(item);
+               else
+                       other_lists.add(item);
+       }
+
+       if (!other_lists.empty()) {
+               MenuItem item(MenuItem::Submenu, qt_("Other Toolbars"));
+               item.setSubmenu(other_lists);
+               add(item);
        }
 }
 
@@ -1061,12 +1048,14 @@ void MenuDefinition::expandBranches(Buffer const * buf)
        BranchList::const_iterator end = params.branchlist().end();
 
        for (int ii = 1; cit != end; ++cit, ++ii) {
-               docstring label = cit->getBranch();
-               if (ii < 10)
-                       label = convert<docstring>(ii) + ". " + label + char_type('|') + convert<docstring>(ii);
+               docstring label = cit->branch();
+               if (ii < 10) {
+                       label = convert<docstring>(ii) + ". " + label
+                               + char_type('|') + convert<docstring>(ii);
+               }
                addWithStatusCheck(MenuItem(MenuItem::Command, toqstr(label),
                                    FuncRequest(LFUN_BRANCH_INSERT,
-                                               cit->getBranch())));
+                                               cit->branch())));
        }
 }
 
@@ -1097,11 +1086,11 @@ void MenuDefinition::expandCiteStyles(BufferView const * bv)
                key = qstring_to_ucs4(toqstr(key).split(',')[0]);
 
        vector<CiteStyle> citeStyleList = citeStyles(buf->params().citeEngine());
-       vector<docstring> citeStrings =
+       docstring_list citeStrings =
                buf->masterBibInfo().getCiteStrings(key, bv->buffer());
 
-       vector<docstring>::const_iterator cit = citeStrings.begin();
-       vector<docstring>::const_iterator end = citeStrings.end();
+       docstring_list::const_iterator cit = citeStrings.begin();
+       docstring_list::const_iterator end = citeStrings.end();
 
        for (int ii = 1; cit != end; ++cit, ++ii) {
                docstring label = *cit;
@@ -1237,9 +1226,14 @@ struct Menus::Impl {
        /// Mac special menu.
        /** This defines a menu whose entries list the FuncRequests
            that will be removed by expand() in other menus. This is
-           used by the Qt/Mac code
+           used by the Qt/Mac code.
+
+           NOTE: Qt does not remove the menu items when clearing a QMenuBar,
+           such that the items will keep accessing the FuncRequests in
+           the MenuDefinition. While Menus::Impl might be recreated,
+           we keep mac_special_menu_ in memory by making it static.
        */
-       MenuDefinition specialmenu_;
+       static MenuDefinition mac_special_menu_;
 
        ///
        MenuList menulist_;
@@ -1252,6 +1246,10 @@ struct Menus::Impl {
        NameMap name_map_;
 };
 
+
+MenuDefinition Menus::Impl::mac_special_menu_;
+
+
 /*
   Here is what the Qt documentation says about how a menubar is chosen:
 
@@ -1308,11 +1306,11 @@ void Menus::Impl::macxMenuBarInit(GuiView * view, QMenuBar * qmb)
        const size_t num_entries = sizeof(entries) / sizeof(entries[0]);
 
        // the special menu for Menus. Fill it up only once.
-       if (specialmenu_.size() == 0) {
+       if (mac_special_menu_.size() == 0) {
                for (size_t i = 0 ; i < num_entries ; ++i) {
                        FuncRequest const func(entries[i].action,
                                from_utf8(entries[i].arg));
-                       specialmenu_.add(MenuItem(MenuItem::Command, 
+                       mac_special_menu_.add(MenuItem(MenuItem::Command,
                                entries[i].label, func));
                }
        }
@@ -1320,8 +1318,8 @@ void Menus::Impl::macxMenuBarInit(GuiView * view, QMenuBar * qmb)
        // add the entries to a QMenu that will eventually be empty
        // and therefore invisible.
        QMenu * qMenu = qmb->addMenu("special");
-       MenuDefinition::const_iterator cit = specialmenu_.begin();
-       MenuDefinition::const_iterator end = specialmenu_.end();
+       MenuDefinition::const_iterator cit = mac_special_menu_.begin();
+       MenuDefinition::const_iterator end = mac_special_menu_.end();
        for (size_t i = 0 ; cit != end ; ++cit, ++i) {
                Action * action = new Action(view, QIcon(), cit->label(),
                        cit->func(), QString(), qMenu);
@@ -1361,15 +1359,15 @@ void Menus::Impl::expand(MenuDefinition const & frommenu,
                        break;
 
                case MenuItem::CharStyles:
-                       tomenu.expandFlexInsert(buf, "charstyle");
+                       tomenu.expandFlexInsert(buf, InsetLayout::CHARSTYLE);
                        break;
 
                case MenuItem::Custom:
-                       tomenu.expandFlexInsert(buf, "custom");
+                       tomenu.expandFlexInsert(buf, InsetLayout::CUSTOM);
                        break;
 
                case MenuItem::Elements:
-                       tomenu.expandFlexInsert(buf, "element");
+                       tomenu.expandFlexInsert(buf, InsetLayout::ELEMENT);
                        break;
 
                case MenuItem::FloatListInsert:
@@ -1381,7 +1379,7 @@ void Menus::Impl::expand(MenuDefinition const & frommenu,
                        break;
 
                case MenuItem::PasteRecent:
-                       tomenu.expandPasteRecent();
+                       tomenu.expandPasteRecent(buf);
                        break;
 
                case MenuItem::Toolbars:
@@ -1417,7 +1415,7 @@ void Menus::Impl::expand(MenuDefinition const & frommenu,
                        break;
 
                case MenuItem::Command:
-                       if (!specialmenu_.hasFunc(cit->func()))
+                       if (!mac_special_menu_.hasFunc(cit->func()))
                                tomenu.addWithStatusCheck(*cit);
                }
        }
@@ -1468,11 +1466,20 @@ MenuDefinition & Menus::Impl::getMenu(QString const & name)
 
 Menus::Menus() : d(new Impl) {}
 
+
 Menus::~Menus()
 {
   delete d;
 }
 
+
+void Menus::reset()
+{
+       delete d;
+       d = new Impl;
+}
+
+
 void Menus::read(Lexer & lex)
 {
        enum {
@@ -1526,7 +1533,7 @@ void Menus::read(Lexer & lex)
 
 
 bool Menus::searchMenu(FuncRequest const & func,
-       vector<docstring> & names) const
+       docstring_list & names) const
 {
        MenuDefinition menu;
        d->expand(d->menubar_, menu, 0);
@@ -1538,7 +1545,11 @@ void Menus::fillMenuBar(QMenuBar * qmb, GuiView * view, bool initial)
 {
        if (initial) {
 #ifdef Q_WS_MACX
-               // setup special mac specific menu item
+               // setup special mac specific menu items, but only do this
+               // the first time a QMenuBar is created. Otherwise Qt will
+               // create duplicate items in the application menu. It seems
+               // that Qt does not remove them when the QMenubar is cleared.
+               LYXERR(Debug::GUI, "Creating Mac OS X special menu bar");
                d->macxMenuBarInit(view, qmb);
 #endif
        } else {
@@ -1634,4 +1645,4 @@ Menu * Menus::menu(QString const & name, GuiView & view)
 } // namespace frontend
 } // namespace lyx
 
-#include "Menus_moc.cpp"
+#include "moc_Menus.cpp"