]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/Menus.cpp
Menus: Factor Toc code
[lyx.git] / src / frontends / qt4 / Menus.cpp
index 78639b9e35b3aa83ec71952139a9c44904123190..22ef06bbd196768c3017fcaa74acb2fb3399bf13 100644 (file)
@@ -60,6 +60,7 @@
 #include "insets/Inset.h"
 #include "insets/InsetCitation.h"
 #include "insets/InsetGraphics.h"
+#include "insets/InsetQuotes.h"
 
 #include "support/lassert.h"
 #include "support/convert.h"
@@ -188,7 +189,9 @@ public:
                in the InsetCaption context menu. */
                SwitchCaptions,
                /** Commands to separate environments. */
-               EnvironmentSeparators
+               EnvironmentSeparators,
+               /** This is the list of quotation marks available */
+               SwitchQuotes
        };
 
        explicit MenuItem(Kind kind) : kind_(kind), optional_(false) {}
@@ -319,8 +322,6 @@ public:
        ///
        size_t size() const { return items_.size(); }
        ///
-       MenuItem const & operator[](size_t) const;
-       ///
        const_iterator begin() const { return items_.begin(); }
        ///
        const_iterator end() const { return items_.end(); }
@@ -350,6 +351,7 @@ public:
        void expandFloatListInsert(Buffer const * buf);
        void expandFloatInsert(Buffer const * buf);
        void expandFlexInsert(Buffer const * buf, InsetLayout::InsetLyXType type);
+       void expandTocSubmenu(std::string const & type, Toc const & toc_list);
        void expandToc2(Toc const & toc_list, size_t from, size_t to, int depth, string toc_type);
        void expandToc(Buffer const * buf);
        void expandPasteRecent(Buffer const * buf);
@@ -364,6 +366,7 @@ public:
        void expandArguments(BufferView const *, bool switcharg = false);
        void expandCaptions(Buffer const * buf, bool switchcap = false);
        void expandEnvironmentSeparators(BufferView const *);
+       void expandQuotes(BufferView const *);
        ///
        ItemList items_;
        ///
@@ -476,7 +479,8 @@ void MenuDefinition::read(Lexer & lex)
                md_switcharguments,
                md_captions,
                md_switchcaptions,
-               md_env_separators
+               md_env_separators,
+               md_switchquotes
        };
 
        LexerKeyword menutags[] = {
@@ -511,6 +515,7 @@ void MenuDefinition::read(Lexer & lex)
                { "submenu", md_submenu },
                { "switcharguments", md_switcharguments },
                { "switchcaptions", md_switchcaptions },
+               { "switchquotes", md_switchquotes },
                { "toc", md_toc },
                { "toolbars", md_toolbars },
                { "updateformats", md_updateformats },
@@ -658,6 +663,10 @@ void MenuDefinition::read(Lexer & lex)
                        add(MenuItem(MenuItem::EnvironmentSeparators));
                        break;
 
+               case md_switchquotes:
+                       add(MenuItem(MenuItem::SwitchQuotes));
+                       break;
+
                case md_optsubmenu:
                case md_submenu: {
                        lex.next(true);
@@ -682,12 +691,6 @@ void MenuDefinition::read(Lexer & lex)
 }
 
 
-MenuItem const & MenuDefinition::operator[](size_type i) const
-{
-       return items_[i];
-}
-
-
 bool MenuDefinition::hasFunc(FuncRequest const & func) const
 {
        for (const_iterator it = begin(), et = end(); it != et; ++it)
@@ -1034,8 +1037,7 @@ void MenuDefinition::expandFormats(MenuItem::Kind const kind, Buffer const * buf
        if (!buf && kind != MenuItem::ImportFormats)
                return;
 
-       typedef vector<Format const *> Formats;
-       Formats formats;
+       FormatList formats;
        FuncCode action = LFUN_NOACTION;
 
        switch (kind) {
@@ -1059,7 +1061,6 @@ void MenuDefinition::expandFormats(MenuItem::Kind const kind, Buffer const * buf
                LATTEST(false);
                return;
        }
-       sort(formats.begin(), formats.end(), Format::formatSorter);
 
        bool const view_update = (kind == MenuItem::ViewFormats
                        || kind == MenuItem::UpdateFormats);
@@ -1310,7 +1311,6 @@ void MenuDefinition::expandToc(Buffer const * buf)
        }
 
        MenuDefinition other_lists;
-       FloatList const & floatlist = buf->params().documentClass().floats();
        TocList const & toc_list = buf->tocBackend().tocs();
        TocList::const_iterator cit = toc_list.begin();
        TocList::const_iterator end = toc_list.end();
@@ -1319,16 +1319,11 @@ void MenuDefinition::expandToc(Buffer const * buf)
                if (cit->first == "tableofcontents" || cit->second->empty())
                        continue;
                MenuDefinition submenu;
-               // "Open outliner..." entry
-               FuncRequest f(LFUN_DIALOG_SHOW, "toc " + cit->first);
-               submenu.add(MenuItem(MenuItem::Command, qt_("Open Outliner..."), f));
-               submenu.add(MenuItem(MenuItem::Separator));
-               // add entries
-               submenu.expandToc2(*cit->second, 0, cit->second->size(), 0, cit->first);
+               submenu.expandTocSubmenu(cit->first, *cit->second);
                MenuItem item(MenuItem::Submenu, guiName(cit->first, buf->params()));
                item.setSubmenu(submenu);
                // deserves to be in the main menu?
-               if (floatlist.typeExist(cit->first) || cit->first == "child")
+               if (!TocBackend::isOther(cit->first))
                        add(item);
                else
                        other_lists.add(item);
@@ -1353,6 +1348,17 @@ void MenuDefinition::expandToc(Buffer const * buf)
 }
 
 
+void MenuDefinition::expandTocSubmenu(std::string const & type, Toc const & toc)
+{
+       // "Open outliner..." entry
+       FuncRequest f(LFUN_DIALOG_SHOW, "toc " + type);
+       add(MenuItem(MenuItem::Command, qt_("Open Outliner..."), f));
+       add(MenuItem(MenuItem::Separator));
+       // add entries
+       expandToc2(toc, 0, toc.size(), 0, type);
+}
+
+
 void MenuDefinition::expandPasteRecent(Buffer const * buf)
 {
        docstring_list const sel = cap::availableSelections(buf);
@@ -1651,6 +1657,133 @@ void MenuDefinition::expandCaptions(Buffer const * buf, bool switchcap)
 }
 
 
+void MenuDefinition::expandQuotes(BufferView const * bv)
+{
+       if (!bv)
+               return;
+    
+       if (!bv->cursor().inTexted())
+               return;
+
+       Inset const * inset = bv->cursor().nextInset();
+       if (!inset || inset->lyxCode() != QUOTE_CODE) {
+               add(MenuItem(MenuItem::Command,
+                                   qt_("No Quote in Scope!"),
+                                   FuncRequest(LFUN_NOACTION)));
+               return;
+       }
+       InsetQuotes const * qinset =
+               static_cast<InsetQuotes const *>(inset);
+
+       map<string, docstring> styles = quoteparams.getTypes();
+       string const qtype = qinset->getType();
+       
+       map<string, docstring>::const_iterator qq = styles.begin();
+       map<string, docstring>::const_iterator end = styles.end();
+
+       MenuDefinition aqs;
+
+       BufferParams const & bp = bv->buffer().masterBuffer()->params();
+
+       // The global setting
+       InsetQuotesParams::QuoteStyle globalqs = bp.quotes_style;
+       char const globalqsc = quoteparams.getStyleChar(globalqs);
+
+       // The current language's default
+       InsetQuotesParams::QuoteStyle langdefqs =
+               bp.getQuoteStyle(bv->cursor().current_font.language()->quoteStyle());
+       char const langqs = quoteparams.getStyleChar(langdefqs);
+
+       bool main_global_qs = false;
+       bool main_langdef_qs = false;
+       bool main_dynamic_qs = false;
+       docstring const subcmd = from_ascii("changetype ");
+       docstring const wildcards = from_ascii("..");
+       // Add the items
+       // First the top level menu (all glyphs of the current style) ...
+       // Begin with dynamic (if they are current style),
+       if (qtype[0] == 'x') {
+               FuncRequest cmd = FuncRequest(LFUN_INSET_MODIFY, subcmd + from_ascii("xld"));
+               docstring desc = bformat(_("%1$s (dynamic)"),
+                       quoteparams.getShortGuiLabel(globalqsc + from_ascii("ld")));
+               add(MenuItem(MenuItem::Command, toqstr(desc), cmd));
+               cmd = FuncRequest(LFUN_INSET_MODIFY, subcmd + from_ascii("xls"));
+               desc = bformat(_("%1$s (dynamic)"),
+                       quoteparams.getShortGuiLabel(globalqsc + from_ascii("ls")));
+               add(MenuItem(MenuItem::Command, toqstr(desc), cmd));
+               cmd = FuncRequest(LFUN_INSET_MODIFY, subcmd + from_ascii("xrd"));
+               desc = bformat(_("%1$s (dynamic)"),
+                       quoteparams.getShortGuiLabel(globalqsc + from_ascii("rd")));
+               add(MenuItem(MenuItem::Command, toqstr(desc), cmd));
+               cmd = FuncRequest(LFUN_INSET_MODIFY, subcmd + from_ascii("xrs"));
+               desc = bformat(_("%1$s (dynamic)"),
+                       quoteparams.getShortGuiLabel(globalqsc + from_ascii("rs")));
+               add(MenuItem(MenuItem::Command, toqstr(desc), cmd));
+               main_dynamic_qs = true;
+       }
+       // now traverse through the static styles ...
+       for (; qq != end; ++qq) {
+               docstring const style = from_ascii(qq->first);
+               bool langdef = (style[0] == langqs);
+               bool globaldef = (style[0] == globalqsc);
+               
+               if (prefixIs(style, qtype[0])) {
+                       FuncRequest cmd = FuncRequest(LFUN_INSET_MODIFY, subcmd + style);
+                       docstring const desc = quoteparams.getShortGuiLabel(style);
+                       add(MenuItem(MenuItem::Command, toqstr(desc), cmd));
+                       main_global_qs = globaldef;
+                       main_langdef_qs = langdef;
+               }
+               else if (!langdef && !globaldef && suffixIs(style, from_ascii("ld"))) {
+                       docstring const desc =
+                               quoteparams.getGuiLabel(quoteparams.getQuoteStyle(to_ascii(style)));
+                       FuncRequest cmd = FuncRequest(LFUN_INSET_MODIFY, subcmd + style[0] + "..");
+                       aqs.add(MenuItem(MenuItem::Command, toqstr(desc), cmd));
+               }
+       }
+
+       add(MenuItem(MenuItem::Separator));
+
+       bool have_section = false;
+       bool display_static = false;
+       // ... then potentially items to reset to the defaults and to dynamic style ...
+       if (!main_dynamic_qs && globalqsc != 'x') {
+               FuncRequest cmd = FuncRequest(LFUN_INSET_MODIFY, subcmd + 'x' + wildcards);
+               docstring const desc = bformat(_("Use dynamic quotes (%1$s)|d"),
+                                               quoteparams.getGuiLabel(globalqs));
+               add(MenuItem(MenuItem::Command, toqstr(desc), cmd));
+               have_section = true;
+               display_static = true;
+       }
+       if (!main_global_qs && langdefqs != globalqs) {
+               docstring const variant = main_dynamic_qs ? _("dynamic[[Quotes]]") : _("static[[Quotes]]");
+               FuncRequest cmd = FuncRequest(LFUN_INSET_MODIFY, subcmd + globalqsc + wildcards);
+               docstring const desc = bformat(_("Reset to document default (%1$s, %2$s)|o"),
+                                               quoteparams.getGuiLabel(globalqs), variant);
+               add(MenuItem(MenuItem::Command, toqstr(desc), cmd));
+               have_section = true;
+       }
+       if (!main_langdef_qs) {
+               FuncRequest cmd = FuncRequest(LFUN_INSET_MODIFY, subcmd + globalqsc + wildcards);
+               docstring const desc = (main_dynamic_qs || display_static) 
+                                       ? bformat(_("Reset to language default (%1$s, %2$s)|l"),
+                                                 quoteparams.getGuiLabel(langdefqs), _("static[[Quotes]]"))
+                                       : bformat(_("Reset to language default (%1$s)|l"),
+                                                 quoteparams.getGuiLabel(langdefqs));
+               add(MenuItem(MenuItem::Command, toqstr(desc), cmd));
+               have_section = true;
+       }
+
+       if (have_section)
+               add(MenuItem(MenuItem::Separator));
+
+       // ... and a subitem with the rest
+       MenuItem item(MenuItem::Submenu, qt_("Change Style|y"));
+       item.setSubmenu(aqs);
+       add(item);
+}
+
+
 void MenuDefinition::expandEnvironmentSeparators(BufferView const * bv)
 {
        if (!bv)
@@ -2081,6 +2214,10 @@ void Menus::Impl::expand(MenuDefinition const & frommenu,
                        tomenu.expandEnvironmentSeparators(bv);
                        break;
 
+               case MenuItem::SwitchQuotes:
+                       tomenu.expandQuotes(bv);
+                       break;
+
                case MenuItem::Submenu: {
                        MenuItem item(*cit);
                        item.setSubmenu(MenuDefinition(cit->submenuname()));