]> git.lyx.org Git - lyx.git/blob - src/frontends/xforms/Dialogs.C
Herbert's TeX Info extravaganza.
[lyx.git] / src / frontends / xforms / Dialogs.C
1 /* This file is part of
2  * ======================================================
3  *
4  *           LyX, The Document Processor
5  *
6  *           Copyright 1995 Matthias Ettrich
7  *           Copyright 1995-2001 The LyX Team.
8  *
9  * ======================================================
10  */
11
12 #include <config.h>
13
14 #ifdef __GNUG__
15 #pragma implementation
16 #endif
17
18 #include "Dialogs.h"
19 #include "BufferView.h"
20
21 #include "xformsBC.h"
22
23 #include "ControlAboutlyx.h"
24 #include "ControlBibitem.h"
25 #include "ControlBibtex.h"
26 #include "ControlCharacter.h"
27 #include "ControlCitation.h"
28 #include "ControlError.h"
29 #include "ControlERT.h"
30 #include "ControlExternal.h"
31 #include "ControlFloat.h"
32 #include "ControlGraphics.h"
33 #include "insets/insetgraphicsParams.h"
34 #include "ControlInclude.h"
35 #include "ControlIndex.h"
36 #include "ControlLog.h"
37 #include "ControlMinipage.h"
38 #include "ControlPreamble.h"
39 #include "ControlPrint.h"
40 #include "ControlRef.h"
41 #include "ControlSearch.h"
42 #include "ControlShowFile.h"
43 #include "ControlSpellchecker.h"
44 #include "ControlTabularCreate.h"
45 #include "ControlTexinfo.h"
46 #include "ControlThesaurus.h"
47 #include "ControlToc.h"
48 #include "ControlUrl.h"
49 #include "ControlVCLog.h"
50
51 #include "GUI.h"
52
53 #include "combox.h"       // needed for clean destruction of boost::scoped_ptr
54 #include "form_aboutlyx.h"
55 #include "form_bibitem.h"
56 #include "form_bibtex.h"
57 #include "form_browser.h"
58 #include "form_character.h"
59 #include "form_citation.h"
60 #include "form_error.h"
61 #include "form_ert.h"
62 #include "form_external.h"
63 #include "form_float.h"
64 #include "form_graphics.h"
65 #include "form_include.h"
66 #include "form_index.h"
67 #include "form_minipage.h"
68 #include "form_preamble.h"
69 #include "form_print.h"
70 #include "form_ref.h"
71 #include "form_search.h"
72 #include "form_spellchecker.h"
73 #include "form_tabular_create.h"
74 #include "form_texinfo.h"
75 #include "form_thesaurus.h"
76 #include "form_toc.h"
77 #include "form_url.h"
78
79 #include "FormAboutlyx.h"
80 #include "FormBibitem.h"
81 #include "FormBibtex.h"
82 #include "FormCharacter.h"
83 #include "FormCitation.h"
84 #include "FormError.h"
85 #include "FormERT.h"
86 #include "FormExternal.h"
87 #include "FormFloat.h"
88 #include "FormGraphics.h"
89 #include "FormInclude.h"
90 #include "FormIndex.h"
91 #include "FormLog.h"
92 #include "FormMinipage.h"
93 #include "FormPreamble.h"
94 #include "FormPrint.h"
95 #include "FormRef.h"
96 #include "FormSearch.h"
97 #include "FormShowFile.h"
98 #include "FormSpellchecker.h"
99 #include "FormTabularCreate.h"
100 #include "FormTexinfo.h" 
101 #include "FormThesaurus.h" 
102 #include "FormToc.h"
103 #include "FormUrl.h"
104 #include "FormVCLog.h"
105
106 #include "FormDocument.h"
107 #include "FormMathsPanel.h"
108 #include "FormParagraph.h"
109 #include "FormPreferences.h"
110 #include "FormTabular.h"
111
112 // Signal enabling all visible dialogs to be redrawn if so desired.
113 // E.g., when the GUI colours have been remapped.
114 SigC::Signal0<void> Dialogs::redrawGUI;
115
116 Dialogs::Dialogs(LyXView * lv)
117 {
118         add(new GUIAboutlyx<FormAboutlyx, xformsBC>(*lv, *this));
119         add(new GUIBibitem<FormBibitem, xformsBC>(*lv, *this));
120         add(new GUIBibtex<FormBibtex, xformsBC>(*lv, *this));
121         add(new GUICharacter<FormCharacter, xformsBC>(*lv, *this));
122         add(new GUICitation<FormCitation, xformsBC>(*lv, *this));
123         add(new GUIError<FormError, xformsBC>(*lv, *this));
124         add(new GUIERT<FormERT, xformsBC>(*lv, *this));
125         add(new GUIExternal<FormExternal, xformsBC>(*lv, *this));
126         add(new GUIGraphics<FormGraphics, xformsBC>(*lv, *this));
127         add(new GUIInclude<FormInclude, xformsBC>(*lv, *this));
128         add(new GUIIndex<FormIndex, xformsBC>(*lv, *this));
129         add(new GUILog<FormLog, xformsBC>(*lv, *this));
130         add(new GUIMinipage<FormMinipage, xformsBC>(*lv, *this));
131         add(new GUIFloat<FormFloat, xformsBC>(*lv, *this));
132         add(new GUIPreamble<FormPreamble, xformsBC>(*lv, *this));
133         add(new GUIPrint<FormPrint, xformsBC>(*lv, *this));
134         add(new GUIRef<FormRef, xformsBC>(*lv, *this));
135         add(new GUISearch<FormSearch, xformsBC>(*lv, *this));
136         add(new GUIShowFile<FormShowFile, xformsBC>(*lv, *this));
137         add(new GUISpellchecker<FormSpellchecker, xformsBC>(*lv, *this));
138         add(new GUITabularCreate<FormTabularCreate, xformsBC>(*lv, *this));
139 #ifdef HAVE_LIBAIKSAURUS
140         add(new GUIThesaurus<FormThesaurus, xformsBC>(*lv, *this));
141 #endif
142         add(new GUITexinfo<FormTexinfo, xformsBC>(*lv, *this));
143         add(new GUIToc<FormToc, xformsBC>(*lv, *this));
144         add(new GUIUrl<FormUrl, xformsBC>(*lv, *this));
145         add(new GUIVCLog<FormVCLog, xformsBC>(*lv, *this));
146
147         add(new FormDocument(lv, this));
148         add(new FormMathsPanel(lv, this));
149         add(new FormParagraph(lv, this));
150         add(new FormPreferences(lv, this));
151         add(new FormTabular(lv, this));
152         
153         // reduce the number of connections needed in
154         // dialogs by a simple connection here.
155         hideAll.connect(hideBufferDependent.slot());
156 }
157
158 /*****************************************************************************
159
160 Q.  WHY does Dialogs::Dialogs pass `this' to dialog constructors?
161
162 A.  To avoid a segfault.
163     The dialog constructors need to connect to their
164     respective showSomeDialog signal(*) but in order to do
165     that they need to get the address of the Dialogs instance
166     from LyXView::getDialogs().  However, since the Dialogs
167     instance is still being constructed at that time
168     LyXView::getDialogs() will *not* return the correct
169     address because it hasn't finished being constructed.
170     A Catch-22 situation (or is that the chicken and the egg...).
171     So to get around the problem we pass the address of
172     the newly created Dialogs instance using `this'.
173
174 (*) -- I'm using signals exclusively to guarantee that the gui code
175        remains hidden from the rest of the system.  In fact the only 
176        header related to dialogs that anything in the non-gui-specific
177        code gets to see is Dialogs.h!  Even Dialogs.h doesn't know what a 
178        FormCopyright class looks like or that its even going to be used!
179
180        No other gui dialog headers are seen outside of the gui-specific
181        directories!  This ensures that the gui is completely separate from
182        the rest of LyX.  All this through the use of a few simple signals.
183        BUT, the price is that during construction we need to connect the
184        implementations show() method to the showSomeDialog signal and this
185        requires that we have an instance of Dialogs and the problem mentioned
186        above.
187
188        Almost all other dialogs should be able to operate using the same style
189        of signalling used for Copyright.  Exceptions should be handled
190        by adding a specific show or update signal.  For example, spellchecker
191        needs to set the next suspect word and its options/replacements so we
192        need a:
193                  Signal0<void> updateSpellChecker;
194
195        Since we would have to have a
196                  Signal0<void> showSpellChecker;
197
198        in order to just see the spellchecker and let the user push the [Start]
199        button then the updateSpellChecker signal will make the SpellChecker
200        dialog get the new word and replacements list from LyX.  If you really,
201        really wanted to you could define a signal that would pass the new
202        word and replacements:
203                  Signal2<void, string, vector<string> > updateSpellChecker;
204
205        (or something similar) but, why bother when the spellchecker can get
206        it anyway with a LyXFunc call or two.  Besides if someone extends
207        what a dialog does then they also have to change code in the rest of 
208        LyX to pass more parameters or get the extra info via a function 
209        call anyway.  Thus reducing the independence of the two code bases.
210
211        We don't need a separate update signal for each dialog because most of 
212        them will be changed only when the buffer is changed (either by closing
213        the current open buffer or switching to another buffer in the current
214        LyXView -- different BufferView same LyXView or same BufferView same
215        LyXView).
216
217        So we minimise signals but maximise independence and programming 
218        simplicity, understandability and maintainability.  It's also
219        extremely easy to add support for Qt or gtk-- because they use
220        signals already. Guis that use callbacks, like xforms, must have their
221        code wrapped up like that in the form_copyright.[Ch] which is awkward
222        but will at least allow multiple instances of the same dialog.
223
224        LyXFuncs will be used for requesting/setting LyX internal info.  This
225        will ensure that scripts or LyXServer-connected applications can all
226        have access to the same calls as the internal user-interface.
227
228 ******************************************************************************/