]> git.lyx.org Git - features.git/blob - src/frontends/gtk/Dialogs.C
Add GParagraph dialog, make GViewBase update() when it show()s
[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 "GCharacter.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 "GParagraph.h"
77 #include "FormPreamble.h"
78 #include "FormPreferences.h"
79 #include "GPrint.h"
80 #include "FormRef.h"
81 #include "GSearch.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->bc().view(new GBC(dialog->bc()));
202                 dialog->setController(new ControlCharacter(*dialog));
203                 dialog->setView(new GCharacter(*dialog));
204                 dialog->bc().bp(new OkApplyCancelReadOnlyPolicy);
205         } else if (name == "citation") {
206                 dialog->setController(new ControlCitation(*dialog));
207                 dialog->setView(new FormCitation(*dialog));
208                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
209         } else if (name == "document") {
210                 dialog->setController(new ControlDocument(*dialog));
211                 dialog->setView(new FormDocument(*dialog));
212                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
213         } else if (name == "errorlist") {
214                 dialog->setController(new ControlErrorList(*dialog));
215                 dialog->setView(new FormErrorList(*dialog));
216                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
217         } else if (name == "ert") {
218                 dialog->setController(new ControlERT(*dialog));
219                 dialog->setView(new FormERT(*dialog));
220                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
221         } else if (name == "external") {
222                 dialog->setController(new ControlExternal(*dialog));
223                 dialog->setView(new FormExternal(*dialog));
224                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
225         } else if (name == "file") {
226                 dialog->setController(new ControlShowFile(*dialog));
227                 dialog->setView(new FormShowFile(*dialog));
228                 dialog->bc().bp(new OkCancelPolicy);
229         } else if (name == "findreplace") {
230                 dialog->bc().view(new GBC(dialog->bc()));
231                 dialog->setController(new ControlSearch(*dialog));
232                 dialog->setView(new GSearch(*dialog));
233                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
234         } else if (name == "float") {
235                 dialog->setController(new ControlFloat(*dialog));
236                 dialog->setView(new FormFloat(*dialog));
237                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
238         } else if (name == "graphics") {
239                 dialog->setController(new ControlGraphics(*dialog));
240                 dialog->setView(new FormGraphics(*dialog));
241                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
242         } else if (name == "include") {
243                 dialog->setController(new ControlInclude(*dialog));
244                 dialog->setView(new FormInclude(*dialog));
245                 dialog->bc().bp(new OkApplyCancelReadOnlyPolicy);
246         } else if (name == "index") {
247                 dialog->bc().view(new GBC(dialog->bc()));
248                 dialog->setController(new ControlCommand(*dialog, name));
249                 dialog->setView(new GText(*dialog,
250                                           _("Index"), _("Keyword:|#K")));
251                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
252         } else if (name == "label") {
253                 dialog->bc().view(new GBC(dialog->bc()));
254                 dialog->setController(new ControlCommand(*dialog, name));
255                 dialog->setView(new GText(*dialog,
256                                           _("Label"), _("Label:|#L")));
257                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
258         } else if (name == "log") {
259                 dialog->setController(new ControlLog(*dialog));
260                 dialog->setView(new FormLog(*dialog));
261                 dialog->bc().bp(new OkCancelPolicy);
262
263         } else if (name == "mathpanel") {
264                 dialog->bc().view(new GBC(dialog->bc()));
265                 dialog->setController(new ControlMath(*dialog));
266                 dialog->setView(new GMathPanel(*dialog));
267                 dialog->bc().bp(new IgnorantPolicy);
268
269         } else if (name == "mathaccents") {
270                 FormMathsBitmap * bitmap =
271                         createFormBitmap(*dialog, _("Maths Decorations & Accents"),
272                                          latex_deco, nr_latex_deco);
273                 bitmap->addBitmap(
274                         BitmapStore(12, 3, 4, deco1_width, deco1_height, deco1_bits, true));
275                 bitmap->addBitmap(
276                         BitmapStore(10, 4, 3, deco2_width, deco2_height, deco2_bits, true));
277
278                 dialog->setController(new ControlMath(*dialog));
279                 dialog->setView(bitmap);
280                 dialog->bc().bp(new IgnorantPolicy);
281
282         } else if (name == "matharrows") {
283                 FormMathsBitmap * bitmap =
284                         createFormBitmap(*dialog, _("Arrows"), latex_arrow, nr_latex_arrow);
285                 bitmap->addBitmap(
286                         BitmapStore(20, 5, 4, arrow_width,  arrow_height,  arrow_bits, true));
287                 bitmap->addBitmap(
288                         BitmapStore(7,  2, 4, larrow_width, larrow_height, larrow_bits, false));
289                 bitmap->addBitmap(
290                         BitmapStore(4,  2, 2, darrow_width,  darrow_height, darrow_bits, true));
291
292                 dialog->setController(new ControlMath(*dialog));
293                 dialog->setView(bitmap);
294                 dialog->bc().bp(new IgnorantPolicy);
295
296         } else if (name == "mathoperators") {
297                 FormMathsBitmap * bitmap =
298                         createFormBitmap(*dialog, _("Binary Ops"),
299                                          latex_bop, nr_latex_bop);
300                 bitmap->addBitmap(
301                         BitmapStore(31, 4, 8, bop_width, bop_height, bop_bits, true));
302
303                 dialog->setController(new ControlMath(*dialog));
304                 dialog->setView(bitmap);
305                 dialog->bc().bp(new IgnorantPolicy);
306
307         } else if (name == "mathrelations") {
308                 FormMathsBitmap * bitmap =
309                         createFormBitmap(*dialog, _("Binary Relations"),
310                                          latex_brel, nr_latex_brel);
311                 bitmap->addBitmap(
312                         BitmapStore(35, 4, 9, brel_width, brel_height, brel_bits, true));
313
314                 dialog->setController(new ControlMath(*dialog));
315                 dialog->setView(bitmap);
316                 dialog->bc().bp(new IgnorantPolicy);
317
318         } else if (name == "mathgreek") {
319                 FormMathsBitmap * bitmap =
320                         createFormBitmap(*dialog, _("Greek"),
321                                          latex_greek, nr_latex_greek);
322                 bitmap->addBitmap(
323                         BitmapStore(11, 6, 2, Greek_width, Greek_height, Greek_bits, true));
324                 bitmap->addBitmap(
325                         BitmapStore(28, 7, 4, greek_width, greek_height, greek_bits, true));
326
327                 dialog->setController(new ControlMath(*dialog));
328                 dialog->setView(bitmap);
329                 dialog->bc().bp(new IgnorantPolicy);
330
331         } else if (name == "mathmisc") {
332                 FormMathsBitmap * bitmap =
333                         createFormBitmap(*dialog, _("Misc"),
334                                          latex_misc, nr_latex_misc);
335                 bitmap->addBitmap(
336                         BitmapStore(29, 5, 6, misc_width, misc_height, misc_bits, true));
337                 bitmap->addBitmap(
338                         BitmapStore(5, 5, 1, misc4_width, misc4_height, misc4_bits, true));
339                 bitmap->addBitmap(
340                         BitmapStore(6, 3, 2, misc2_width, misc2_height, misc2_bits, false));
341                 bitmap->addBitmap(
342                         BitmapStore(4, 2, 2, misc3_width, misc3_height, misc3_bits, true));
343
344                 dialog->setController(new ControlMath(*dialog));
345                 dialog->setView(bitmap);
346                 dialog->bc().bp(new IgnorantPolicy);
347
348         } else if (name == "mathdots") {
349                 FormMathsBitmap * bitmap =
350                         createFormBitmap(*dialog, _("Dots"),
351                                          latex_dots, nr_latex_dots);
352                 bitmap->addBitmap(
353                         BitmapStore(4, 4, 1, dots_width, dots_height, dots_bits, true));
354
355                 dialog->setController(new ControlMath(*dialog));
356                 dialog->setView(bitmap);
357                 dialog->bc().bp(new IgnorantPolicy);
358
359         } else if (name == "mathbigoperators") {
360                 FormMathsBitmap * bitmap =
361                         createFormBitmap(*dialog, _("Big Operators"),
362                                          latex_varsz, nr_latex_varsz);
363                 bitmap->addBitmap(
364                         BitmapStore(14, 3, 5, varsz_width, varsz_height, varsz_bits, true));
365
366                 dialog->setController(new ControlMath(*dialog));
367                 dialog->setView(bitmap);
368                 dialog->bc().bp(new IgnorantPolicy);
369
370         } else if (name == "mathamsmisc") {
371                 FormMathsBitmap * bitmap =
372                         createFormBitmap(*dialog, _("AMS Misc"),
373                                          latex_ams_misc, nr_latex_ams_misc);
374                 bitmap->addBitmap(
375                         BitmapStore(9, 5, 2, ams1_width, ams1_height, ams1_bits, true));
376                 bitmap->addBitmap(
377                         BitmapStore(26, 3, 9, ams7_width, ams7_height, ams7_bits, true));
378
379                 dialog->setController(new ControlMath(*dialog));
380                 dialog->setView(bitmap);
381                 dialog->bc().bp(new IgnorantPolicy);
382
383         } else if (name == "mathamsarrows") {
384                 FormMathsBitmap * bitmap =
385                         createFormBitmap(*dialog, _("AMS Arrows"),
386                                          latex_ams_arrows, nr_latex_ams_arrows);
387                 bitmap->addBitmap(
388                         BitmapStore(32, 3, 11, ams2_width, ams2_height, ams2_bits, true));
389                 bitmap->addBitmap(
390                         BitmapStore(6, 3, 2, ams3_width, ams3_height, ams3_bits, true));
391
392                 dialog->setController(new ControlMath(*dialog));
393                 dialog->setView(bitmap);
394                 dialog->bc().bp(new IgnorantPolicy);
395
396         } else if (name == "mathamsrelations") {
397                 FormMathsBitmap * bitmap =
398                         createFormBitmap(*dialog, _("AMS Relations"),
399                                          latex_ams_rel, nr_latex_ams_rel);
400                 bitmap->addBitmap(
401                         BitmapStore(66, 6, 11, ams_rel_width, ams_rel_height, ams_rel_bits, true));
402
403                 dialog->setController(new ControlMath(*dialog));
404                 dialog->setView(bitmap);
405                 dialog->bc().bp(new IgnorantPolicy);
406
407         } else if (name == "mathamsnegatedrelations") {
408                 FormMathsBitmap * bitmap =
409                         createFormBitmap(*dialog, _("AMS Negated Rel"),
410                                          latex_ams_nrel, nr_latex_ams_nrel);
411                 bitmap->addBitmap(
412                         BitmapStore(51, 6, 9, ams_nrel_width, ams_nrel_height, ams_nrel_bits, true));
413
414                 dialog->setController(new ControlMath(*dialog));
415                 dialog->setView(bitmap);
416                 dialog->bc().bp(new IgnorantPolicy);
417
418         } else if (name == "mathamsoperators") {
419                 FormMathsBitmap * bitmap =
420                         createFormBitmap(*dialog, _("AMS Operators"),
421                                          latex_ams_ops, nr_latex_ams_ops);
422                 bitmap->addBitmap(
423                         BitmapStore(23, 3, 8, ams_ops_width, ams_ops_height, ams_ops_bits, true));
424
425                 dialog->setController(new ControlMath(*dialog));
426                 dialog->setView(bitmap);
427                 dialog->bc().bp(new IgnorantPolicy);
428
429         } else if (name == "mathdelimiter") {
430                 dialog->bc().view(new GBC(dialog->bc()));
431                 dialog->setController(new ControlMath(*dialog));
432                 dialog->setView(new GMathDelim(*dialog));
433                 dialog->bc().bp(new OkApplyCancelReadOnlyPolicy);
434         } else if (name == "mathmatrix") {
435                 dialog->setController(new ControlMath(*dialog));
436                 dialog->setView(new FormMathsMatrix(*dialog));
437                 dialog->bc().bp(new OkApplyCancelReadOnlyPolicy);
438         } else if (name == "mathspace") {
439                 dialog->setController(new ControlMath(*dialog));
440                 dialog->setView(new FormMathsSpace(*dialog));
441                 dialog->bc().bp(new IgnorantPolicy);
442         } else if (name == "mathstyle") {
443                 dialog->setController(new ControlMath(*dialog));
444                 dialog->setView(new FormMathsStyle(*dialog));
445                 dialog->bc().bp(new IgnorantPolicy);
446         } else if (name == "note") {
447                 dialog->setController(new ControlNote(*dialog));
448                 dialog->setView(new FormNote(*dialog));
449                 dialog->bc().bp(new OkApplyCancelReadOnlyPolicy);
450         } else if (name == "branch") {
451                 dialog->setController(new ControlBranch(*dialog));
452                 dialog->setView(new FormBranch(*dialog));
453                 dialog->bc().bp(new OkApplyCancelReadOnlyPolicy);
454         } else if (name == "paragraph") {
455                 dialog->bc().view(new GBC(dialog->bc()));
456                 dialog->setController(new ControlParagraph(*dialog));
457                 dialog->setView(new GParagraph(*dialog));
458                 dialog->bc().bp(new OkApplyCancelReadOnlyPolicy);
459         } else if (name == "preamble") {
460                 dialog->setController(new ControlPreamble(*dialog));
461                 dialog->setView(new FormPreamble(*dialog));
462                 dialog->bc().bp(new OkApplyCancelPolicy);
463         } else if (name == "prefs") {
464                 dialog->setController(new ControlPrefs(*dialog));
465                 dialog->setView(new FormPreferences(*dialog));
466                 dialog->bc().bp(new PreferencesPolicy);
467         } else if (name == "print") {
468                 dialog->bc().view(new GBC(dialog->bc()));
469                 dialog->setController(new ControlPrint(*dialog));
470                 dialog->setView(new GPrint(*dialog));
471                 dialog->bc().bp(new OkCancelPolicy);
472         } else if (name == "ref") {
473                 dialog->setController(new ControlRef(*dialog));
474                 dialog->setView(new FormRef(*dialog));
475                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
476         } else if (name == "sendto") {
477                 dialog->setController(new ControlSendto(*dialog));
478                 dialog->setView(new FormSendto(*dialog));
479                 dialog->bc().bp(new OkApplyCancelPolicy);
480         } else if (name == "spellchecker") {
481                 dialog->setController(new ControlSpellchecker(*dialog));
482                 dialog->setView(new FormSpellchecker(*dialog));
483                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
484         } else if (name == "tabular") {
485                 dialog->setController(new ControlTabular(*dialog));
486                 dialog->setView(new FormTabular(*dialog));
487                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
488         } else if (name == "tabularcreate") {
489                 dialog->bc().view(new GBC(dialog->bc()));
490                 dialog->setController(new ControlTabularCreate(*dialog));
491                 dialog->setView(new GTableCreate(*dialog));
492                 dialog->bc().bp(new IgnorantPolicy);
493         } else if (name == "texinfo") {
494                 dialog->setController(new ControlTexinfo(*dialog));
495                 dialog->setView(new FormTexinfo(*dialog));
496                 dialog->bc().bp(new OkCancelPolicy);
497 #ifdef HAVE_LIBAIKSAURUS
498         } else if (name == "thesaurus") {
499                 dialog->setController(new ControlThesaurus(*dialog));
500                 dialog->setView(new FormThesaurus(*dialog));
501                 dialog->bc().bp(new OkApplyCancelReadOnlyPolicy);
502 #endif
503         } else if (name == "toc") {
504                 dialog->setController(new ControlToc(*dialog));
505                 dialog->setView(new FormToc(*dialog));
506                 dialog->bc().bp(new OkCancelPolicy);
507         } else if (name == "url") {
508                 dialog->bc().view(new GBC(dialog->bc()));
509                 dialog->setController(new ControlCommand(*dialog, name));
510                 dialog->setView(new GUrl(*dialog));
511                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
512         } else if (name == "vspace") {
513                 dialog->setController(new ControlVSpace(*dialog));
514                 dialog->setView(new FormVSpace(*dialog));
515                 dialog->bc().bp(new OkApplyCancelReadOnlyPolicy);
516         } else if (name == "wrap") {
517                 dialog->setController(new ControlWrap(*dialog));
518                 dialog->setView(new FormWrap(*dialog));
519                 dialog->bc().bp(new NoRepeatedApplyReadOnlyPolicy);
520         }
521
522         return dialog;
523 }
524
525
526 void Dialogs::toggleTooltips()
527 {
528         Tooltips::toggleEnabled();
529 }
530
531
532 /// Are the tooltips on or off?
533 bool Dialogs::tooltipsEnabled()
534 {
535         return Tooltips::enabled();
536 }