]> git.lyx.org Git - lyx.git/blob - src/frontends/qt4/GuiPopupMenu.cpp
Changes LayoutList from a vector<LayoutPtr> to a vector<Layout>.
[lyx.git] / src / frontends / qt4 / GuiPopupMenu.cpp
1 /**
2  * \file GuiPopupMenu.cpp
3  * This file is part of LyX, the document processor.
4  * Licence details can be found in the file COPYING.
5  *
6  * \author John Levon
7  * \author Abdelrazak Younes
8  *
9  * Full author contact details are available in file CREDITS.
10  */
11
12 #include <config.h>
13
14 #include "GuiView.h"
15
16 #include "Action.h"
17 #include "GuiApplication.h"
18 #include "GuiPopupMenu.h"
19 #include "qt_helpers.h"
20
21 #include "LyXFunc.h"
22 #include "MenuBackend.h"
23
24 #include "support/debug.h"
25 #include "support/lstrings.h"
26
27 namespace lyx {
28 namespace frontend {
29
30 GuiPopupMenu::GuiPopupMenu(GuiView * owner, MenuItem const & mi,
31                 bool topLevelMenu)
32         : QMenu(owner), owner_(owner)
33 {
34         name_ = toqstr(mi.submenuname());
35
36         setTitle(label(mi));
37
38         if (topLevelMenu)
39                 connect(this, SIGNAL(aboutToShow()), this, SLOT(updateView()));
40 }
41
42
43 void GuiPopupMenu::updateView()
44 {
45         LYXERR(Debug::GUI, "GuiPopupMenu::updateView()"
46                 << "\tTriggered menu: " << fromqstr(name_));
47
48         clear();
49
50         if (name_.isEmpty())
51                 return;
52
53         // Here, We make sure that theLyXFunc points to the correct LyXView.
54         theLyXFunc().setLyXView(owner_);
55
56         MenuBackend const & menubackend = guiApp->menuBackend();
57         Menu const & fromLyxMenu = menubackend.getMenu(qstring_to_ucs4(name_));
58         menubackend.expand(fromLyxMenu, topLevelMenu_, owner_->buffer());
59
60         if (!menubackend.hasMenu(topLevelMenu_.name())) {
61                 LYXERR(Debug::GUI, "\tWARNING: menu seems empty"
62                         << to_utf8(topLevelMenu_.name()));
63         }
64         populate(this, &topLevelMenu_);
65 }
66
67
68 void GuiPopupMenu::populate(QMenu * qMenu, Menu * menu)
69 {
70         LYXERR(Debug::GUI, "populating menu " << to_utf8(menu->name()));
71         if (menu->size() == 0) {
72                 LYXERR(Debug::GUI, "\tERROR: empty menu " << to_utf8(menu->name()));
73                 return;
74         }
75         LYXERR(Debug::GUI, " *****  menu entries " << menu->size());
76
77         Menu::const_iterator m = menu->begin();
78         Menu::const_iterator end = menu->end();
79
80         for (; m != end; ++m) {
81
82                 if (m->kind() == MenuItem::Separator) {
83
84                         qMenu->addSeparator();
85                         LYXERR(Debug::GUI, "adding Menubar Separator");
86
87                 } else if (m->kind() == MenuItem::Submenu) {
88
89                         LYXERR(Debug::GUI, "** creating New Sub-Menu "
90                                 << fromqstr(label(*m)));
91                         QMenu * subMenu = qMenu->addMenu(label(*m));
92                         populate(subMenu, m->submenu());
93
94                 } else { // we have a MenuItem::Command
95
96                         LYXERR(Debug::GUI, "creating Menu Item "
97                                 << to_utf8(m->label()));
98
99                         Action * action = new Action(*(owner_),
100                                 QIcon(), label(*m), m->func(), QString());
101                         qMenu->addAction(action);
102                 }
103         }
104 }
105
106
107 QString GuiPopupMenu::label(MenuItem const & mi) const
108 {
109         docstring label = support::subst(mi.label(), 
110                                          from_ascii("&"), from_ascii("&&"));
111
112         docstring const shortcut = mi.shortcut();
113         if (!shortcut.empty()) {
114                 size_t pos = label.find(shortcut);
115                 if (pos != docstring::npos)
116                         label.insert(pos, 1, char_type('&'));
117         }
118
119         docstring const binding = mi.binding();
120         if (!binding.empty())
121                 label += '\t' + binding;
122
123         return toqstr(label);
124 }
125
126
127 } // namespace frontend
128 } // namespace lyx
129
130 #include "GuiPopupMenu_moc.cpp"