X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fqt4%2FMenus.cpp;h=627ec4c4c95c31be9ff7c4694c7a3266488c1fab;hb=28be7d552f62cc02fa86d7f79201d089bfb2d7b5;hp=1100dd30e36a057dd4ffa72cabcb91c6a5974263;hpb=237193f8a888777192981136469a5d4febb8e9d8;p=lyx.git diff --git a/src/frontends/qt4/Menus.cpp b/src/frontends/qt4/Menus.cpp index 1100dd30e3..627ec4c4c9 100644 --- a/src/frontends/qt4/Menus.cpp +++ b/src/frontends/qt4/Menus.cpp @@ -135,6 +135,9 @@ public: /** This is a list of exportable formats typically for the File->Export menu. */ ExportFormats, + /** This exports the document default format + typically for the File->Export menu. */ + ExportFormat, /** This is a list of importable formats typically for the File->Import menu. */ ImportFormats, @@ -351,6 +354,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); @@ -453,6 +457,7 @@ void MenuDefinition::read(Lexer & lex) md_custom, md_elements, md_endmenu, + md_exportformat, md_exportformats, md_importformats, md_indices, @@ -494,6 +499,7 @@ void MenuDefinition::read(Lexer & lex) { "elements", md_elements }, { "end", md_endmenu }, { "environmentseparators", md_env_separators }, + { "exportformat", md_exportformat }, { "exportformats", md_exportformats }, { "floatinsert", md_floatinsert }, { "floatlistinsert", md_floatlistinsert }, @@ -586,6 +592,10 @@ void MenuDefinition::read(Lexer & lex) add(MenuItem(MenuItem::ExportFormats)); break; + case md_exportformat: + add(MenuItem(MenuItem::ExportFormat)); + break; + case md_importformats: add(MenuItem(MenuItem::ImportFormats)); break; @@ -980,6 +990,8 @@ void MenuDefinition::expandDocuments() QString label = toqstr(b.fileName().displayName(20)); if (!b.isClean()) label += "*"; + if (b.notifiesExternalModification()) + label += QChar(0x26a0); if (i < 10) label = QString::number(i) + ". " + label + '|' + QString::number(i); add(MenuItem(MenuItem::Command, label, @@ -997,6 +1009,8 @@ void MenuDefinition::expandDocuments() QString label = toqstr(b->fileName().displayName(20)); if (!b->isClean()) label += "*"; + if (b->notifiesExternalModification()) + label += QChar(0x26a0); if (i < 10) label = QString::number(i) + ". " + label + '|' + QString::number(i); item.submenu().add(MenuItem(MenuItem::Command, label, @@ -1207,7 +1221,7 @@ void MenuDefinition::expandFlexInsert( } } // FIXME This is a little clunky. - if (items_.empty() && type == InsetLayout::CUSTOM && !buf->isReadonly()) + if (items_.empty() && type == InsetLayout::CUSTOM && !buf->hasReadonlyFlag()) add(MenuItem(MenuItem::Help, qt_("No Custom Insets Defined!"))); } @@ -1310,25 +1324,20 @@ 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(); - for (; cit != end; ++cit) { + // In the navigation menu, only add tocs from this document + TocBackend const & backend = buf->tocBackend(); + TocList const & toc_list = backend.tocs(); + for (pair> const & toc : toc_list) { // Handle table of contents later - if (cit->first == "tableofcontents" || cit->second->empty()) + if (toc.first == "tableofcontents" || toc.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); - MenuItem item(MenuItem::Submenu, guiName(cit->first, buf->params())); + submenu.expandTocSubmenu(toc.first, *toc.second); + docstring const toc_name = backend.outlinerName(toc.first); + MenuItem item(MenuItem::Submenu, toqstr(toc_name)); item.setSubmenu(submenu); // deserves to be in the main menu? - if (floatlist.typeExist(cit->first) || cit->first == "child") + if (!TocBackend::isOther(toc.first)) add(item); else other_lists.add(item); @@ -1340,8 +1349,8 @@ void MenuDefinition::expandToc(Buffer const * buf) } // Handle normal TOC add(MenuItem(MenuItem::Separator)); - cit = toc_list.find("tableofcontents"); - if (cit == end) + TocList::const_iterator cit = toc_list.find("tableofcontents"); + if (cit == toc_list.end()) LYXERR(Debug::GUI, "No table of contents."); else { if (!cit->second->empty()) @@ -1353,6 +1362,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); @@ -1392,7 +1412,7 @@ void MenuDefinition::expandToolbars() void MenuDefinition::expandBranches(Buffer const * buf) { - if (!buf || buf->isReadonly()) + if (!buf || buf->hasReadonlyFlag()) return; BufferParams const & master_params = buf->masterBuffer()->params(); @@ -1529,10 +1549,11 @@ void MenuDefinition::expandCiteStyles(BufferView const * bv) FuncRequest(LFUN_NOACTION))); return; } - InsetCommand const * citinset = - static_cast(inset); + InsetCitation const * citinset = + static_cast(inset); Buffer const * buf = &bv->buffer(); + BufferParams const & bp = buf->masterParams(); string const cmd = citinset->params().getCmdName(); docstring const & key = citinset->getParam("key"); @@ -1543,33 +1564,85 @@ void MenuDefinition::expandCiteStyles(BufferView const * bv) return; } - docstring const & before = citinset->getParam("before"); - docstring const & after = citinset->getParam("after"); - size_t const n = cmd.size(); - bool const force = cmd[0] == 'C'; - bool const full = cmd[n] == '*'; + bool const force = isUpperCase(cmd[0]); + bool const star = cmd[n] == '*'; vector const keys = getVectorFromString(key); - vector const citeStyleList = buf->params().citeStyles(); - static const size_t max_length = 40; - vector citeStrings = - buf->masterBibInfo().getCiteStrings(keys, citeStyleList, bv->buffer(), - before, after, from_utf8("dialog"), max_length); - - vector::const_iterator cit = citeStrings.begin(); - vector::const_iterator end = citeStrings.end(); + vector const citeStyleList = bp.citeStyles(); + + CitationStyle cs = citinset->getCitationStyle(bp, cmd, citeStyleList); + bool const qualified = cs.hasQualifiedList + && (keys.size() > 1 + || !citinset->getParam("pretextlist").empty() + || !citinset->getParam("posttextlist").empty()); + std::map pres = + citinset->getQualifiedLists(citinset->getParam("pretextlist")); + std::map posts = + citinset->getQualifiedLists(citinset->getParam("posttextlist")); + + CiteItem ci; + ci.textBefore = citinset->getParam("before"); + ci.textAfter = citinset->getParam("after"); + ci.forceUpperCase = force; + ci.Starred = star; + ci.context = CiteItem::Dialog; + ci.max_size = 40; + ci.isQualified = qualified; + ci.pretexts = pres; + ci.posttexts = posts; + BiblioInfo::CiteStringMap citeStrings = + buf->masterBibInfo().getCiteStrings(keys, citeStyleList, bv->buffer(), ci); + + BiblioInfo::CiteStringMap::const_iterator cit = citeStrings.begin(); + BiblioInfo::CiteStringMap::const_iterator end = citeStrings.end(); for (int ii = 1; cit != end; ++cit, ++ii) { - docstring label = *cit; + docstring label = cit->second; CitationStyle cs = citeStyleList[ii - 1]; cs.forceUpperCase &= force; - cs.fullAuthorList &= full; + cs.hasStarredVersion &= star; addWithStatusCheck(MenuItem(MenuItem::Command, toqstr(label), FuncRequest(LFUN_INSET_MODIFY, "changetype " + from_utf8(citationStyleToString(cs))))); } + + if (cs.hasStarredVersion) { + docstring starred = _("All authors|h"); + // Check if we have a custom string/tooltip for the starred version + if (!cs.stardesc.empty()) { + string val = + bp.documentClass().getCiteMacro(buf->params().citeEngineType(), cs.stardesc); + if (!val.empty()) + starred = translateIfPossible(from_utf8(val)); + // Transform qt-style accelerators to menu-style + int const amps = count_char(starred, '&'); + if (amps > 0) { + if (amps > 1) + starred = subst(starred, from_ascii("&&"), from_ascii("<:amp:>")); + size_t n = starred.find('&'); + char_type accel = char_type(); + if (n != docstring::npos && n < starred.size() - 1) + accel = starred[n + 1]; + starred = subst(starred, from_ascii("&"), from_ascii("")); + if (amps > 1) + starred = subst(starred, from_ascii("<:amp:>"), from_ascii("&&")); + if (accel != char_type()) + starred = starred + '|' + accel; + } + } + add(MenuItem(MenuItem::Separator)); + addWithStatusCheck(MenuItem(MenuItem::Command, toqstr(starred), + FuncRequest(LFUN_INSET_MODIFY, "toggleparam star"))); + } + + if (cs.forceUpperCase) { + if (!cs.hasStarredVersion) + add(MenuItem(MenuItem::Separator)); + addWithStatusCheck(MenuItem(MenuItem::Command, toqstr(_("Force upper case|u")), + FuncRequest(LFUN_INSET_MODIFY, "toggleparam casing"))); + } } @@ -1616,7 +1689,7 @@ void MenuDefinition::expandCaptions(Buffer const * buf, bool switchcap) for (pair const & il : dc.insetLayouts()) { docstring instype; docstring const type = split(il.first, instype, ':'); - if (instype == "Caption") { + if (instype == from_ascii("Caption")) { // skip forbidden caption types FuncRequest const cmd = switchcap ? FuncRequest(LFUN_INSET_MODIFY, from_ascii("changetype ") + type) @@ -1655,7 +1728,7 @@ void MenuDefinition::expandQuotes(BufferView const * bv) { if (!bv) return; - + if (!bv->cursor().inTexted()) return; @@ -1671,127 +1744,105 @@ void MenuDefinition::expandQuotes(BufferView const * bv) map styles = quoteparams.getTypes(); string const qtype = qinset->getType(); - + map::const_iterator qq = styles.begin(); map::const_iterator end = styles.end(); - MenuDefinition eqs; - MenuDefinition sqs; - MenuDefinition gqs; - MenuDefinition pqs; - MenuDefinition cqs; MenuDefinition aqs; - MenuDefinition qqs; - MenuDefinition bqs; - MenuDefinition wqs; - MenuDefinition fqs; - MenuDefinition iqs; - MenuDefinition rqs; + + 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); - FuncRequest const cmd = FuncRequest(LFUN_INSET_MODIFY, from_ascii("changetype ") + style); - docstring const desc = contains(style, 'l') ? - bformat(_("%1$stext"), qq->second) : bformat(_("text%1$s"), qq->second); - if (prefixIs(style, qtype[0])) + 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)); - else if (prefixIs(style, 'e') && !prefixIs(qtype, "e")) - eqs.add(MenuItem(MenuItem::Command, toqstr(desc), cmd)); - else if (prefixIs(style, 's') && !prefixIs(qtype, "s")) - sqs.add(MenuItem(MenuItem::Command, toqstr(desc), cmd)); - else if (prefixIs(style, 'g') && !prefixIs(qtype, "g")) - gqs.add(MenuItem(MenuItem::Command, toqstr(desc), cmd)); - else if (prefixIs(style, 'p') && !prefixIs(qtype, "p")) - pqs.add(MenuItem(MenuItem::Command, toqstr(desc), cmd)); - else if (prefixIs(style, 'c') && !prefixIs(qtype, "c")) - cqs.add(MenuItem(MenuItem::Command, toqstr(desc), cmd)); - else if (prefixIs(style, 'a') && !prefixIs(qtype, "a")) + 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)); - else if (prefixIs(style, 'q') && !prefixIs(qtype, "q")) - qqs.add(MenuItem(MenuItem::Command, toqstr(desc), cmd)); - else if (prefixIs(style, 'b') && !prefixIs(qtype, "b")) - bqs.add(MenuItem(MenuItem::Command, toqstr(desc), cmd)); - else if (prefixIs(style, 'w') && !prefixIs(qtype, "w")) - wqs.add(MenuItem(MenuItem::Command, toqstr(desc), cmd)); - else if (prefixIs(style, 'f') && !prefixIs(qtype, "f")) - fqs.add(MenuItem(MenuItem::Command, toqstr(desc), cmd)); - else if (prefixIs(style, 'i') && !prefixIs(qtype, "i")) - iqs.add(MenuItem(MenuItem::Command, toqstr(desc), cmd)); - else if (prefixIs(style, 'r') && !prefixIs(qtype, "r")) - rqs.add(MenuItem(MenuItem::Command, toqstr(desc), cmd)); - } - - if (!eqs.empty()) { - MenuItem item(MenuItem::Submenu, - toqstr(quoteparams.getGuiLabel(InsetQuotesParams::EnglishQuotes))); - item.setSubmenu(eqs); - add(item); - } - if (!sqs.empty()) { - MenuItem item(MenuItem::Submenu, - toqstr(quoteparams.getGuiLabel(InsetQuotesParams::SwedishQuotes))); - item.setSubmenu(sqs); - add(item); - } - if (!gqs.empty()) { - MenuItem item(MenuItem::Submenu, - toqstr(quoteparams.getGuiLabel(InsetQuotesParams::GermanQuotes))); - item.setSubmenu(gqs); - add(item); - } - if (!pqs.empty()) { - MenuItem item(MenuItem::Submenu, - toqstr(quoteparams.getGuiLabel(InsetQuotesParams::PolishQuotes))); - item.setSubmenu(pqs); - add(item); - } - if (!cqs.empty()) { - MenuItem item(MenuItem::Submenu, - toqstr(quoteparams.getGuiLabel(InsetQuotesParams::SwissQuotes))); - item.setSubmenu(cqs); - add(item); - } - if (!aqs.empty()) { - MenuItem item(MenuItem::Submenu, - toqstr(quoteparams.getGuiLabel(InsetQuotesParams::DanishQuotes))); - item.setSubmenu(aqs); - add(item); - } - if (!qqs.empty()) { - MenuItem item(MenuItem::Submenu, - toqstr(quoteparams.getGuiLabel(InsetQuotesParams::PlainQuotes))); - item.setSubmenu(qqs); - add(item); - } - if (!bqs.empty()) { - MenuItem item(MenuItem::Submenu, - toqstr(quoteparams.getGuiLabel(InsetQuotesParams::BritishQuotes))); - item.setSubmenu(bqs); - add(item); - } - if (!wqs.empty()) { - MenuItem item(MenuItem::Submenu, - toqstr(quoteparams.getGuiLabel(InsetQuotesParams::SwedishGQuotes))); - item.setSubmenu(wqs); - add(item); - } - if (!fqs.empty()) { - MenuItem item(MenuItem::Submenu, - toqstr(quoteparams.getGuiLabel(InsetQuotesParams::FrenchQuotes))); - item.setSubmenu(fqs); - add(item); - } - if (!iqs.empty()) { - MenuItem item(MenuItem::Submenu, - toqstr(quoteparams.getGuiLabel(InsetQuotesParams::FrenchINQuotes))); - item.setSubmenu(iqs); - add(item); + } } - if (!rqs.empty()) { - MenuItem item(MenuItem::Submenu, - toqstr(quoteparams.getGuiLabel(InsetQuotesParams::RussianQuotes))); - item.setSubmenu(rqs); - add(item); + + add(MenuItem(MenuItem::Separator)); + + 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)); + 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)); + } + 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)); } + + add(MenuItem(MenuItem::Separator)); + + // ... and a subitem with the rest + MenuItem item(MenuItem::Submenu, qt_("Change Style|y")); + item.setSubmenu(aqs); + add(item); } @@ -2137,6 +2188,19 @@ void Menus::Impl::expand(MenuDefinition const & frommenu, tomenu.expandFormats(cit->kind(), buf); break; + case MenuItem::ExportFormat: { + if (!buf) + break; + string const format = buf->params().getDefaultOutputFormat(); + Format const * f = theFormats().getFormat(format); + docstring const name = f ? f->prettyname() : from_utf8(format); + docstring const label = bformat(_("Export [%1$s]|E"), name); + MenuItem item(MenuItem::Command, toqstr(label), + FuncRequest(LFUN_BUFFER_EXPORT)); + tomenu.addWithStatusCheck(item); + break; + } + case MenuItem::CharStyles: tomenu.expandFlexInsert(buf, InsetLayout::CHARSTYLE); break;