]> git.lyx.org Git - features.git/blob - src/frontends/gtk/Dialogs.C
Wrap most of the frontend code up inside namespace lyx::frontend.
[features.git] / src / frontends / gtk / Dialogs.C
1 /**
2  * \file xforms/Dialogs.C
3  * This file is part of LyX, the document processor.
4  * Licence details can be found in the file COPYING.
5  *
6  * \author Angus Leeming
7  *
8  * Full author contact details are available in file CREDITS.
9  */
10
11 #include <config.h>
12
13 #include "Dialogs.h"
14 #include "Dialog.h"
15
16 #include "Tooltips.h"
17
18 #include "ControlAboutlyx.h"
19 #include "ControlBibtex.h"
20 #include "ControlBox.h"
21 #include "ControlBranch.h"
22 #include "ControlChanges.h"
23 #include "ControlCharacter.h"
24 #include "ControlCitation.h"
25 #include "ControlCommand.h"
26 #include "ControlDocument.h"
27 #include "ControlErrorList.h"
28 #include "ControlERT.h"
29 #include "ControlExternal.h"
30 #include "ControlFloat.h"
31 #include "ControlGraphics.h"
32 #include "ControlInclude.h"
33 #include "ControlLog.h"
34 #include "ControlMath.h"
35 #include "ControlNote.h"
36 #include "ControlParagraph.h"
37 #include "ControlPreamble.h"
38 #include "ControlPrefs.h"
39 #include "ControlPrint.h"
40 #include "ControlRef.h"
41 #include "ControlSearch.h"
42 #include "ControlSendto.h"
43 #include "ControlShowFile.h"
44 #include "ControlSpellchecker.h"
45 #include "ControlTabular.h"
46 #include "ControlTabularCreate.h"
47 #include "ControlTexinfo.h"
48 #include "ControlToc.h"
49 #include "ControlVSpace.h"
50 #include "ControlWrap.h"
51
52 #include "GAboutlyx.h"
53 #include "GText.h"
54 #include "GMathDelim.h"
55 #include "FormBibitem.h"
56 #include "FormBibtex.h"
57 #include "FormBox.h"
58 #include "FormBranch.h"
59 #include "FormChanges.h"
60 #include "FormCharacter.h"
61 #include "FormCitation.h"
62 #include "FormDocument.h"
63 #include "FormErrorList.h"
64 #include "FormERT.h"
65 #include "FormExternal.h"
66 #include "FormFloat.h"
67 #include "FormGraphics.h"
68 #include "FormInclude.h"
69 #include "FormLog.h"
70 #include "GMathPanel.h"
71 #include "FormMathsBitmap.h"
72 #include "FormMathsMatrix.h"
73 #include "FormMathsSpace.h"
74 #include "FormMathsStyle.h"
75 #include "FormNote.h"
76 #include "FormParagraph.h"
77 #include "FormPreamble.h"
78 #include "FormPreferences.h"
79 #include "FormPrint.h"
80 #include "FormRef.h"
81 #include "FormSearch.h"
82 #include "FormSendto.h"
83 #include "FormTabular.h"
84 #include "FormTexinfo.h"
85 #include "FormShowFile.h"
86 #include "FormSpellchecker.h"
87 #include "GTableCreate.h"
88 #include "FormToc.h"
89 #include "GUrl.h"
90 #include "FormVSpace.h"
91 #include "FormWrap.h"
92
93 #ifdef HAVE_LIBAIKSAURUS
94 #include "ControlThesaurus.h"
95 #include "FormThesaurus.h"
96 #endif
97
98 #include "xformsBC.h"
99 #include "ButtonController.h"
100
101 #include "arrows.xbm"
102 #include "bop.xbm"
103 #include "brel.xbm"
104 #include "deco.xbm"
105 #include "dots.xbm"
106 #include "greek.xbm"
107 #include "misc.xbm"
108 #include "varsz.xbm"
109
110 #include "ams_misc.xbm"
111 #include "ams_arrows.xbm"
112 #include "ams_rel.xbm"
113 #include "ams_nrel.xbm"
114 #include "ams_ops.xbm"
115
116 #include <boost/assert.hpp>
117 #include <vector>
118
119 using std::string;
120
121 using namespace lyx::frontend;
122
123 namespace {
124
125 FormMathsBitmap * createFormBitmap(Dialog & parent, string const & title,
126                                    char const * const * data, int size)
127 {
128         char const * const * const end = data + size;
129         return new FormMathsBitmap(parent, title, std::vector<string>(data, end));
130 }
131
132
133 char const * const dialognames[] = {
134 "aboutlyx", "bibitem", "bibtex", "box", "branch", "changes", "character",
135 "citation", "document", "errorlist" , "ert", "external", "file",
136 "findreplace", "float", "graphics", "include", "index", "label", "log",
137 "mathpanel", "mathaccents", "matharrows", "mathoperators", "mathrelations",
138 "mathgreek", "mathmisc", "mathdots", "mathbigoperators", "mathamsmisc",
139 "mathamsarrows", "mathamsrelations", "mathamsnegatedrelations",
140 "mathamsoperators", "mathdelimiter", "mathmatrix", "mathspace", "mathstyle",
141 "note", "paragraph", "preamble", "prefs", "print", "ref", "sendto",
142 "spellchecker", "tabular", "tabularcreate", "texinfo",
143
144 #ifdef HAVE_LIBAIKSAURUS
145 "thesaurus",
146 #endif
147
148 "toc", "url", "vspace", "wrap" };
149
150 char const * const * const end_dialognames =
151         dialognames + (sizeof(dialognames) / sizeof(char *));
152
153 struct cmpCStr {
154         cmpCStr(char const * name) : name_(name) {}
155         bool operator()(char const * other) {
156                 return strcmp(other, name_) == 0;
157         }
158 private:
159         char const * name_;
160 };
161
162 } // namespace anon
163
164
165 bool Dialogs::isValidName(string const & name) const
166 {
167         return std::find_if(dialognames, end_dialognames,
168                             cmpCStr(name.c_str())) != end_dialognames;
169 }
170
171
172 Dialogs::DialogPtr Dialogs::build(string const & name)
173 {
174         BOOST_ASSERT(isValidName(name));
175
176         DialogPtr dialog(new Dialog(lyxview_, name));
177         dialog->bc().view(new xformsBC(dialog->bc()));
178
179         if (name == "aboutlyx") {
180                 dialog->bc().view(new GBC(dialog->bc()));
181                 dialog->setController(new ControlAboutlyx(*dialog));
182                 dialog->setView(new GAboutlyx(*dialog));
183                 dialog->bc().bp(new OkCancelPolicy);
184         } else if (name == "bibitem") {
185                 dialog->setController(new ControlCommand(*dialog, name));
186                 dialog->setView(new FormBibitem(*dialog));
187                 dialog->bc().bp(new OkCancelReadOnlyPolicy);
188         } else if (name == "bibtex") {
189                 dialog->setController(new ControlBibtex(*dialog));
190                 dialog->setView(new FormBibtex(*dialog));
191                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
192         } else if (name == "box") {
193                 dialog->setController(new ControlBox(*dialog));
194                 dialog->setView(new FormBox(*dialog));
195                 dialog->bc().bp(new OkApplyCancelReadOnlyPolicy);
196         } else if (name == "changes") {
197                 dialog->setController(new ControlChanges(*dialog));
198                 dialog->setView(new FormChanges(*dialog));
199                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
200         } else if (name == "character") {
201                 dialog->setController(new ControlCharacter(*dialog));
202                 dialog->setView(new FormCharacter(*dialog));
203                 dialog->bc().bp(new OkApplyCancelReadOnlyPolicy);
204         } else if (name == "citation") {
205                 dialog->setController(new ControlCitation(*dialog));
206                 dialog->setView(new FormCitation(*dialog));
207                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
208         } else if (name == "document") {
209                 dialog->setController(new ControlDocument(*dialog));
210                 dialog->setView(new FormDocument(*dialog));
211                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
212         } else if (name == "errorlist") {
213                 dialog->setController(new ControlErrorList(*dialog));
214                 dialog->setView(new FormErrorList(*dialog));
215                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
216         } else if (name == "ert") {
217                 dialog->setController(new ControlERT(*dialog));
218                 dialog->setView(new FormERT(*dialog));
219                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
220         } else if (name == "external") {
221                 dialog->setController(new ControlExternal(*dialog));
222                 dialog->setView(new FormExternal(*dialog));
223                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
224         } else if (name == "file") {
225                 dialog->setController(new ControlShowFile(*dialog));
226                 dialog->setView(new FormShowFile(*dialog));
227                 dialog->bc().bp(new OkCancelPolicy);
228         } else if (name == "findreplace") {
229                 dialog->setController(new ControlSearch(*dialog));
230                 dialog->setView(new FormSearch(*dialog));
231                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
232         } else if (name == "float") {
233                 dialog->setController(new ControlFloat(*dialog));
234                 dialog->setView(new FormFloat(*dialog));
235                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
236         } else if (name == "graphics") {
237                 dialog->setController(new ControlGraphics(*dialog));
238                 dialog->setView(new FormGraphics(*dialog));
239                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
240         } else if (name == "include") {
241                 dialog->setController(new ControlInclude(*dialog));
242                 dialog->setView(new FormInclude(*dialog));
243                 dialog->bc().bp(new OkApplyCancelReadOnlyPolicy);
244         } else if (name == "index") {
245                 dialog->bc().view(new GBC(dialog->bc()));
246                 dialog->setController(new ControlCommand(*dialog, name));
247                 dialog->setView(new GText(*dialog,
248                                           _("Index"), _("Keyword:|#K")));
249                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
250         } else if (name == "label") {
251                 dialog->bc().view(new GBC(dialog->bc()));
252                 dialog->setController(new ControlCommand(*dialog, name));
253                 dialog->setView(new GText(*dialog,
254                                           _("Label"), _("Label:|#L")));
255                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
256         } else if (name == "log") {
257                 dialog->setController(new ControlLog(*dialog));
258                 dialog->setView(new FormLog(*dialog));
259                 dialog->bc().bp(new OkCancelPolicy);
260
261         } else if (name == "mathpanel") {
262                 dialog->bc().view(new GBC(dialog->bc()));
263                 dialog->setController(new ControlMath(*dialog));
264                 dialog->setView(new GMathPanel(*dialog));
265                 dialog->bc().bp(new IgnorantPolicy);
266
267         } else if (name == "mathaccents") {
268                 FormMathsBitmap * bitmap =
269                         createFormBitmap(*dialog, _("Maths Decorations & Accents"),
270                                          latex_deco, nr_latex_deco);
271                 bitmap->addBitmap(
272                         BitmapStore(12, 3, 4, deco1_width, deco1_height, deco1_bits, true));
273                 bitmap->addBitmap(
274                         BitmapStore(10, 4, 3, deco2_width, deco2_height, deco2_bits, true));
275
276                 dialog->setController(new ControlMath(*dialog));
277                 dialog->setView(bitmap);
278                 dialog->bc().bp(new IgnorantPolicy);
279
280         } else if (name == "matharrows") {
281                 FormMathsBitmap * bitmap =
282                         createFormBitmap(*dialog, _("Arrows"), latex_arrow, nr_latex_arrow);
283                 bitmap->addBitmap(
284                         BitmapStore(20, 5, 4, arrow_width,  arrow_height,  arrow_bits, true));
285                 bitmap->addBitmap(
286                         BitmapStore(7,  2, 4, larrow_width, larrow_height, larrow_bits, false));
287                 bitmap->addBitmap(
288                         BitmapStore(4,  2, 2, darrow_width,  darrow_height, darrow_bits, true));
289
290                 dialog->setController(new ControlMath(*dialog));
291                 dialog->setView(bitmap);
292                 dialog->bc().bp(new IgnorantPolicy);
293
294         } else if (name == "mathoperators") {
295                 FormMathsBitmap * bitmap =
296                         createFormBitmap(*dialog, _("Binary Ops"),
297                                          latex_bop, nr_latex_bop);
298                 bitmap->addBitmap(
299                         BitmapStore(31, 4, 8, bop_width, bop_height, bop_bits, true));
300
301                 dialog->setController(new ControlMath(*dialog));
302                 dialog->setView(bitmap);
303                 dialog->bc().bp(new IgnorantPolicy);
304
305         } else if (name == "mathrelations") {
306                 FormMathsBitmap * bitmap =
307                         createFormBitmap(*dialog, _("Binary Relations"),
308                                          latex_brel, nr_latex_brel);
309                 bitmap->addBitmap(
310                         BitmapStore(35, 4, 9, brel_width, brel_height, brel_bits, true));
311
312                 dialog->setController(new ControlMath(*dialog));
313                 dialog->setView(bitmap);
314                 dialog->bc().bp(new IgnorantPolicy);
315
316         } else if (name == "mathgreek") {
317                 FormMathsBitmap * bitmap =
318                         createFormBitmap(*dialog, _("Greek"),
319                                          latex_greek, nr_latex_greek);
320                 bitmap->addBitmap(
321                         BitmapStore(11, 6, 2, Greek_width, Greek_height, Greek_bits, true));
322                 bitmap->addBitmap(
323                         BitmapStore(28, 7, 4, greek_width, greek_height, greek_bits, true));
324
325                 dialog->setController(new ControlMath(*dialog));
326                 dialog->setView(bitmap);
327                 dialog->bc().bp(new IgnorantPolicy);
328
329         } else if (name == "mathmisc") {
330                 FormMathsBitmap * bitmap =
331                         createFormBitmap(*dialog, _("Misc"),
332                                          latex_misc, nr_latex_misc);
333                 bitmap->addBitmap(
334                         BitmapStore(29, 5, 6, misc_width, misc_height, misc_bits, true));
335                 bitmap->addBitmap(
336                         BitmapStore(5, 5, 1, misc4_width, misc4_height, misc4_bits, true));
337                 bitmap->addBitmap(
338                         BitmapStore(6, 3, 2, misc2_width, misc2_height, misc2_bits, false));
339                 bitmap->addBitmap(
340                         BitmapStore(4, 2, 2, misc3_width, misc3_height, misc3_bits, true));
341
342                 dialog->setController(new ControlMath(*dialog));
343                 dialog->setView(bitmap);
344                 dialog->bc().bp(new IgnorantPolicy);
345
346         } else if (name == "mathdots") {
347                 FormMathsBitmap * bitmap =
348                         createFormBitmap(*dialog, _("Dots"),
349                                          latex_dots, nr_latex_dots);
350                 bitmap->addBitmap(
351                         BitmapStore(4, 4, 1, dots_width, dots_height, dots_bits, true));
352
353                 dialog->setController(new ControlMath(*dialog));
354                 dialog->setView(bitmap);
355                 dialog->bc().bp(new IgnorantPolicy);
356
357         } else if (name == "mathbigoperators") {
358                 FormMathsBitmap * bitmap =
359                         createFormBitmap(*dialog, _("Big Operators"),
360                                          latex_varsz, nr_latex_varsz);
361                 bitmap->addBitmap(
362                         BitmapStore(14, 3, 5, varsz_width, varsz_height, varsz_bits, true));
363
364                 dialog->setController(new ControlMath(*dialog));
365                 dialog->setView(bitmap);
366                 dialog->bc().bp(new IgnorantPolicy);
367
368         } else if (name == "mathamsmisc") {
369                 FormMathsBitmap * bitmap =
370                         createFormBitmap(*dialog, _("AMS Misc"),
371                                          latex_ams_misc, nr_latex_ams_misc);
372                 bitmap->addBitmap(
373                         BitmapStore(9, 5, 2, ams1_width, ams1_height, ams1_bits, true));
374                 bitmap->addBitmap(
375                         BitmapStore(26, 3, 9, ams7_width, ams7_height, ams7_bits, true));
376
377                 dialog->setController(new ControlMath(*dialog));
378                 dialog->setView(bitmap);
379                 dialog->bc().bp(new IgnorantPolicy);
380
381         } else if (name == "mathamsarrows") {
382                 FormMathsBitmap * bitmap =
383                         createFormBitmap(*dialog, _("AMS Arrows"),
384                                          latex_ams_arrows, nr_latex_ams_arrows);
385                 bitmap->addBitmap(
386                         BitmapStore(32, 3, 11, ams2_width, ams2_height, ams2_bits, true));
387                 bitmap->addBitmap(
388                         BitmapStore(6, 3, 2, ams3_width, ams3_height, ams3_bits, true));
389
390                 dialog->setController(new ControlMath(*dialog));
391                 dialog->setView(bitmap);
392                 dialog->bc().bp(new IgnorantPolicy);
393
394         } else if (name == "mathamsrelations") {
395                 FormMathsBitmap * bitmap =
396                         createFormBitmap(*dialog, _("AMS Relations"),
397                                          latex_ams_rel, nr_latex_ams_rel);
398                 bitmap->addBitmap(
399                         BitmapStore(66, 6, 11, ams_rel_width, ams_rel_height, ams_rel_bits, true));
400
401                 dialog->setController(new ControlMath(*dialog));
402                 dialog->setView(bitmap);
403                 dialog->bc().bp(new IgnorantPolicy);
404
405         } else if (name == "mathamsnegatedrelations") {
406                 FormMathsBitmap * bitmap =
407                         createFormBitmap(*dialog, _("AMS Negated Rel"),
408                                          latex_ams_nrel, nr_latex_ams_nrel);
409                 bitmap->addBitmap(
410                         BitmapStore(51, 6, 9, ams_nrel_width, ams_nrel_height, ams_nrel_bits, true));
411
412                 dialog->setController(new ControlMath(*dialog));
413                 dialog->setView(bitmap);
414                 dialog->bc().bp(new IgnorantPolicy);
415
416         } else if (name == "mathamsoperators") {
417                 FormMathsBitmap * bitmap =
418                         createFormBitmap(*dialog, _("AMS Operators"),
419                                          latex_ams_ops, nr_latex_ams_ops);
420                 bitmap->addBitmap(
421                         BitmapStore(23, 3, 8, ams_ops_width, ams_ops_height, ams_ops_bits, true));
422
423                 dialog->setController(new ControlMath(*dialog));
424                 dialog->setView(bitmap);
425                 dialog->bc().bp(new IgnorantPolicy);
426
427         } else if (name == "mathdelimiter") {
428                 dialog->bc().view(new GBC(dialog->bc()));
429                 dialog->setController(new ControlMath(*dialog));
430                 dialog->setView(new GMathDelim(*dialog));
431                 dialog->bc().bp(new OkApplyCancelReadOnlyPolicy);
432         } else if (name == "mathmatrix") {
433                 dialog->setController(new ControlMath(*dialog));
434                 dialog->setView(new FormMathsMatrix(*dialog));
435                 dialog->bc().bp(new OkApplyCancelReadOnlyPolicy);
436         } else if (name == "mathspace") {
437                 dialog->setController(new ControlMath(*dialog));
438                 dialog->setView(new FormMathsSpace(*dialog));
439                 dialog->bc().bp(new IgnorantPolicy);
440         } else if (name == "mathstyle") {
441                 dialog->setController(new ControlMath(*dialog));
442                 dialog->setView(new FormMathsStyle(*dialog));
443                 dialog->bc().bp(new IgnorantPolicy);
444         } else if (name == "note") {
445                 dialog->setController(new ControlNote(*dialog));
446                 dialog->setView(new FormNote(*dialog));
447                 dialog->bc().bp(new OkApplyCancelReadOnlyPolicy);
448         } else if (name == "branch") {
449                 dialog->setController(new ControlBranch(*dialog));
450                 dialog->setView(new FormBranch(*dialog));
451                 dialog->bc().bp(new OkApplyCancelReadOnlyPolicy);
452         } else if (name == "paragraph") {
453                 dialog->setController(new ControlParagraph(*dialog));
454                 dialog->setView(new FormParagraph(*dialog));
455                 dialog->bc().bp(new OkApplyCancelReadOnlyPolicy);
456         } else if (name == "preamble") {
457                 dialog->setController(new ControlPreamble(*dialog));
458                 dialog->setView(new FormPreamble(*dialog));
459                 dialog->bc().bp(new OkApplyCancelPolicy);
460         } else if (name == "prefs") {
461                 dialog->setController(new ControlPrefs(*dialog));
462                 dialog->setView(new FormPreferences(*dialog));
463                 dialog->bc().bp(new PreferencesPolicy);
464         } else if (name == "print") {
465                 dialog->setController(new ControlPrint(*dialog));
466                 dialog->setView(new FormPrint(*dialog));
467                 dialog->bc().bp(new OkApplyCancelPolicy);
468         } else if (name == "ref") {
469                 dialog->setController(new ControlRef(*dialog));
470                 dialog->setView(new FormRef(*dialog));
471                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
472         } else if (name == "sendto") {
473                 dialog->setController(new ControlSendto(*dialog));
474                 dialog->setView(new FormSendto(*dialog));
475                 dialog->bc().bp(new OkApplyCancelPolicy);
476         } else if (name == "spellchecker") {
477                 dialog->setController(new ControlSpellchecker(*dialog));
478                 dialog->setView(new FormSpellchecker(*dialog));
479                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
480         } else if (name == "tabular") {
481                 dialog->setController(new ControlTabular(*dialog));
482                 dialog->setView(new FormTabular(*dialog));
483                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
484         } else if (name == "tabularcreate") {
485                 dialog->bc().view(new GBC(dialog->bc()));
486                 dialog->setController(new ControlTabularCreate(*dialog));
487                 dialog->setView(new GTableCreate(*dialog));
488                 dialog->bc().bp(new IgnorantPolicy);
489         } else if (name == "texinfo") {
490                 dialog->setController(new ControlTexinfo(*dialog));
491                 dialog->setView(new FormTexinfo(*dialog));
492                 dialog->bc().bp(new OkCancelPolicy);
493 #ifdef HAVE_LIBAIKSAURUS
494         } else if (name == "thesaurus") {
495                 dialog->setController(new ControlThesaurus(*dialog));
496                 dialog->setView(new FormThesaurus(*dialog));
497                 dialog->bc().bp(new OkApplyCancelReadOnlyPolicy);
498 #endif
499         } else if (name == "toc") {
500                 dialog->setController(new ControlToc(*dialog));
501                 dialog->setView(new FormToc(*dialog));
502                 dialog->bc().bp(new OkCancelPolicy);
503         } else if (name == "url") {
504                 dialog->bc().view(new GBC(dialog->bc()));
505                 dialog->setController(new ControlCommand(*dialog, name));
506                 dialog->setView(new GUrl(*dialog));
507                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
508         } else if (name == "vspace") {
509                 dialog->setController(new ControlVSpace(*dialog));
510                 dialog->setView(new FormVSpace(*dialog));
511                 dialog->bc().bp(new OkApplyCancelReadOnlyPolicy);
512         } else if (name == "wrap") {
513                 dialog->setController(new ControlWrap(*dialog));
514                 dialog->setView(new FormWrap(*dialog));
515                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
516         }
517
518         return dialog;
519 }
520
521
522 void Dialogs::toggleTooltips()
523 {
524         Tooltips::toggleEnabled();
525 }
526
527
528 /// Are the tooltips on or off?
529 bool Dialogs::tooltipsEnabled()
530 {
531         return Tooltips::enabled();
532 }