#include "Session.h"
#include "TextClass.h"
#include "TocBackend.h"
-#include "ToolbarBackend.h"
+#include "Toolbars.h"
#include "insets/Inset.h"
#include "insets/InsetCitation.h"
#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"
// 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;
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 *);
}
if (enabled || !i.optional()) {
items_.push_back(i);
- items_.back().status().enabled(enabled);
+ items_.back().status().setEnabled(enabled);
}
}
else
}
-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();
{
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)));
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;
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)) {
for (; fit != end ; ++fit) {
if ((*fit)->dummy())
continue;
- QString label = toqstr((*fit)->prettyname());
- QString const shortcut = toqstr((*fit)->shortcut());
+
+ docstring lab = from_utf8((*fit)->prettyname());
+ docstring scut = from_utf8((*fit)->shortcut());
+ docstring const tmplab = lab;
+
+ if (!scut.empty())
+ lab += char_type('|') + scut;
+ docstring lab_i18n = translateIfPossible(lab);
+ bool const untranslated = (lab == lab_i18n);
+ QString const shortcut = toqstr(split(lab_i18n, lab, '|'));
+ QString label = toqstr(lab);
+ if (untranslated)
+ // this might happen if the shortcut
+ // has been redefined
+ label = toqstr(translateIfPossible(tmplab));
switch (kind) {
case MenuItem::ImportFormats:
- // FIXME: This is a hack, we should rather solve
- // FIXME: bug 2488 instead.
- if ((*fit)->name() == "text")
- label = qt_("Plain Text");
- else if ((*fit)->name() == "textparagraph")
- label = qt_("Plain Text, Join Lines");
label += "...";
break;
case MenuItem::ViewFormats:
LASSERT(false, /**/);
break;
}
- // FIXME: if we had proper support for translating the
- // format names defined in configure.py, there would
- // not be a need to check whether the shortcut is
- // correct. If we add it uncondiitonally, it would
- // create useless warnings on bad shortcuts
- if (!shortcut.isEmpty() && label.contains(shortcut))
+ if (!shortcut.isEmpty())
label += '|' + shortcut;
if (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())));
}
}
}
-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!"),
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)));
}
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) {
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);
}
-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),
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);
}
}
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())));
}
}
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;
/// 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_;
NameMap name_map_;
};
+
+MenuDefinition Menus::Impl::mac_special_menu_;
+
+
/*
Here is what the Qt documentation says about how a menubar is chosen:
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));
}
}
// 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);
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:
break;
case MenuItem::PasteRecent:
- tomenu.expandPasteRecent();
+ tomenu.expandPasteRecent(buf);
break;
case MenuItem::Toolbars:
break;
case MenuItem::Command:
- if (!specialmenu_.hasFunc(cit->func()))
+ if (!mac_special_menu_.hasFunc(cit->func()))
tomenu.addWithStatusCheck(*cit);
}
}
Menus::Menus() : d(new Impl) {}
+
Menus::~Menus()
{
delete d;
}
+
+void Menus::reset()
+{
+ delete d;
+ d = new Impl;
+}
+
+
void Menus::read(Lexer & lex)
{
enum {
bool Menus::searchMenu(FuncRequest const & func,
- vector<docstring> & names) const
+ docstring_list & names) const
{
MenuDefinition menu;
d->expand(d->menubar_, menu, 0);
{
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 {
} // namespace frontend
} // namespace lyx
-#include "Menus_moc.cpp"
+#include "moc_Menus.cpp"