]> git.lyx.org Git - features.git/blob - src/MenuBackend.C
some fix to ui gettext
[features.git] / src / MenuBackend.C
1 /* This file is part of
2  * ====================================================== 
3  * 
4  *           LyX, The Document Processor
5  *
6  *           Copyright 1995 Matthias Ettrich
7  *           Copyright 1995-2000 The LyX Team.
8  *
9  *
10  * ====================================================== */
11
12 #ifdef __GNUG__
13 #pragma implementation
14 #endif
15
16 #include <config.h>
17 #include <memory>
18 #include "support/LAssert.h"
19 #include "MenuBackend.h"
20 #include "lyxlex.h"
21 #include "LyXAction.h"
22 #include "debug.h"
23 #include "gettext.h"
24
25 extern LyXAction lyxaction;
26
27 using std::endl;
28
29 // This is the global menu definition
30 MenuBackend menubackend;
31
32
33 MenuItem::MenuItem(Kind kind, string const & label, 
34                    string const & command, bool optional) 
35         : kind_(kind), label_(label), optional_(optional)
36 {
37         switch(kind) {
38         case Separator:
39         case Documents:
40         case Lastfiles:
41                 break;
42         case Command:
43                 action_ = lyxaction.LookupFunc(command);
44
45                 if (action_ == LFUN_UNKNOWN_ACTION) {
46                         lyxerr << "MenuItem(): LyX command `"
47                                << command << "' does not exist." << endl; 
48                 }
49                 if (optional_)
50                         lyxerr[Debug::GUI] << "Optional item " 
51                                            << command << endl; 
52                 break;
53         case Submenu:
54                 submenu_ = command;
55                 break;
56         }
57 }
58
59
60 Menu & Menu::add(MenuItem const & i)
61 {
62         items_.push_back(i);
63         return *this;
64 }
65
66
67 void Menu::read(LyXLex & lex)
68 {
69         enum Menutags {
70                 md_item = 1,
71                 md_documents,
72                 md_endmenu,
73                 md_lastfiles,
74                 md_optitem,
75                 md_submenu,
76                 md_separator,
77                 md_last
78         };
79
80         struct keyword_item menutags[md_last-1] = {
81                 { "documents", md_documents },
82                 { "end", md_endmenu },
83                 { "item", md_item },
84                 { "lastfiles", md_lastfiles },
85                 { "optitem", md_optitem }, 
86                 { "separator", md_separator },
87                 { "submenu", md_submenu }
88         };
89
90         lex.pushTable(menutags, md_last - 1);
91         if (lyxerr.debugging(Debug::PARSER))
92                 lex.printTable(lyxerr);
93
94         bool quit = false;
95         bool optional = false;
96
97         while (lex.IsOK() && !quit) {
98                 switch(lex.lex()) {
99                 case md_optitem:
100                         optional = true;
101                         // fallback to md_item
102                 case md_item: {
103                         lex.next();
104                         char * tmp = strdup(lex.GetString().c_str());
105                         string name = _(tmp);
106                         free(tmp);
107                         lex.next();
108                         string command = lex.GetString();
109                         add(MenuItem(MenuItem::Command, name, 
110                                      command, optional));
111                         optional = false;
112                         break;
113                 }
114                 case md_separator:
115                         add(MenuItem(MenuItem::Separator));
116                         break;
117                 case md_lastfiles:
118                         add(MenuItem(MenuItem::Lastfiles));
119                         break;
120                 case md_documents:
121                         add(MenuItem(MenuItem::Documents));
122                         break;
123                 case md_submenu: {
124                         lex.next();
125                         char * tmp = strdup(lex.GetString().c_str());
126                         string mlabel = _(tmp);
127                         free(tmp);
128                         lex.next();
129                         string mname = lex.GetString();
130                         add(MenuItem(MenuItem::Submenu, mlabel, mname));
131                         break;
132                 }
133                 case md_endmenu:
134                         quit = true;
135                         break;
136                 default:
137                         lex.printError("menubar::read: "
138                                        "Unknown menu tag: `$$Token'");
139                         break;
140                 }
141         }
142         lex.popTable();
143 }
144
145
146 void MenuBackend::read(LyXLex & lex)
147 {
148         enum Menutags {
149                 md_menu = 1,
150                 md_menubar,
151                 md_endmenuset,
152                 md_last
153         };
154
155         struct keyword_item menutags[md_last - 1] = {
156                 { "end", md_endmenuset },
157                 { "menu", md_menu },
158                 { "menubar", md_menubar }
159         };
160
161         //consistency check
162         if (compare_no_case(lex.GetString(), "menuset"))
163                 lyxerr << "Menubackend::read: ERROR wrong token:`"
164                        << lex.GetString() << '\'' << endl;
165
166         lex.pushTable(menutags, md_last - 1);
167         if (lyxerr.debugging(Debug::PARSER))
168                 lex.printTable(lyxerr);
169
170         bool quit = false;
171
172         while (lex.IsOK() && !quit) {
173                 switch(lex.lex()) {
174                 case md_menu: {
175                         lex.next();
176                         string name = lex.GetString();
177                         Menu menu(name, false);
178                         menu.read(lex);
179                         add(menu);
180                         break;
181                 }
182                 case md_menubar: {
183                         lex.next();
184                         string name = lex.GetString();
185                         Menu menubar(name, true);
186                         menubar.read(lex);
187                         add(menubar);
188                         break;
189                 }
190                 case md_endmenuset:
191                         quit = true;
192                         break;
193                 default:
194                         lex.printError("menubackend::read: "
195                                        "Unknown menu tag: `$$Token'");
196                         break;
197                 }
198         }
199         lex.popTable();
200 }
201
202
203 void MenuBackend::defaults()
204 {
205         menulist_.clear();
206
207         lyxerr[Debug::GUI] << "MenuBackend::defaults: using default values" 
208                            << endl;
209
210         Menu file("file");
211         file
212                 .add(MenuItem(MenuItem::Command, _("New...|N"), "buffer-new"))
213                 .add(MenuItem(MenuItem::Command, _("Open...|O"), "buffer-open"))
214                 .add(MenuItem(MenuItem::Submenu, _("Import|I"), "import"))
215                 .add(MenuItem(MenuItem::Command, _("Quit|Q"), "lyx-quit"))
216                 .add(MenuItem(MenuItem::Separator))
217                 .add(MenuItem(MenuItem::Lastfiles));
218         add(file);
219
220         Menu import("import");
221         import
222                 .add(MenuItem(MenuItem::Command,
223                               _("LaTeX...|L"), "buffer-import latex"))
224                 .add(MenuItem(MenuItem::Command,
225                               _("LinuxDoc...|L"), "buffer-import linuxdoc"));
226         add(import);
227  
228         Menu edit("edit");
229         edit
230                 .add(MenuItem(MenuItem::Command, _("Cut"), "cut"))
231                 .add(MenuItem(MenuItem::Command, _("Copy"), "copy"))
232                 .add(MenuItem(MenuItem::Command, _("Paste"), "paste"))
233                 .add(MenuItem(MenuItem::Command, _("Emphasize"), "font-emph"));
234         add(edit);
235
236         Menu documents("documents");
237         documents.add(MenuItem(MenuItem::Documents));
238         add(documents);
239
240         Menu main("main", true);
241         main
242                 .add(MenuItem(MenuItem::Submenu, _("File|F"), "file"))
243                 .add(MenuItem(MenuItem::Submenu, _("Edit|E"), "edit"))
244                 .add(MenuItem(MenuItem::Submenu,
245                               _("Documents|D"), "documents"));
246         add(main);
247
248         Menu main_nobuffer("main_nobuffer", true);
249         main_nobuffer.add(MenuItem(MenuItem::Submenu, _("File|F"), "file"));
250         add(main_nobuffer);
251
252         if (lyxerr.debugging(Debug::GUI)) {
253                 for(const_iterator cit = begin();
254                     cit != end() ; ++cit)
255                         lyxerr << "Menu name: " << cit->name() 
256                                << ", Menubar: " << cit->menubar() 
257                                << endl;
258         }
259 }
260
261
262 void MenuBackend::add(Menu const & menu)
263 {
264         menulist_.push_back(menu);
265 }
266
267
268 bool MenuBackend::hasMenu(string const & name) const
269 {
270         for (const_iterator cit = begin(); cit != end(); ++cit) {
271                 if ((*cit).name() == name)
272                         return true;
273         }
274         return false;
275 }
276
277
278 Menu const & MenuBackend::getMenu(string const & name) const
279 {
280         for (const_iterator cit = begin(); cit != end(); ++cit) {
281                 if ((*cit).name() == name)
282                         return (*cit);
283         }
284         Assert(false); // we actually require the name to exist.
285         return menulist_.front();
286 }