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