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