]> git.lyx.org Git - lyx.git/blob - src/frontends/qt2/QDocumentDialog.C
7dd89a7a244ff51b734c14e6c645ba9e7428c416
[lyx.git] / src / frontends / qt2 / QDocumentDialog.C
1 /**
2  * \file QDocumentDialog.C
3  * This file is part of LyX, the document processor.
4  * Licence details can be found in the file COPYING.
5  *
6  * \author Edwin Leuven
7  *
8  * Full author contact details are available in file CREDITS
9  */
10
11 #include <config.h>
12 #include "gettext.h"
13
14 #include "ControlDocument.h"
15 #include "QDocument.h"
16
17 #ifdef __GNUG__
18 #pragma implementation
19 #endif
20
21 #include "QDocumentDialog.h"
22
23 #include "ui/ClassModuleBase.h"
24 #include "ui/PackagesModuleBase.h"
25 #include "ui/PaperModuleBase.h"
26 #include "ui/LanguageModuleBase.h"
27 #include "ui/BulletsModuleBase.h"
28 #include "BulletsModule.h"
29 #include "ui/BiblioModuleBase.h"
30 #include "ui/NumberingModuleBase.h"
31 #include "ui/MarginsModuleBase.h"
32 #include "ui/PreambleModuleBase.h"
33
34 #include "QBrowseBox.h"
35 #include "Spacing.h"
36 #include "support/filetools.h"
37 #include "support/lstrings.h"
38 #include "Alert.h"
39 #include "lyxrc.h"
40 #include "buffer.h"
41 #include "lyx_main.h" // for user_lyxdir
42
43 #include <qwidgetstack.h>
44 #include <qlistbox.h>
45 #include <qlabel.h>
46 #include <qmultilineedit.h>
47 #include <qlineedit.h>
48 #include <qpushbutton.h>
49 #include <qcombobox.h>
50 #include <qradiobutton.h>
51 #include <qcheckbox.h>
52 #include <qspinbox.h>
53 #include "lengthcombo.h"
54 /* 
55  *  Constructs a DocumentDialog which is a child of 'parent', with the 
56  *  name 'name' and widget flags set to 'f' 
57  *
58  *  The dialog will by default be modeless, unless you set 'modal' to
59  *  TRUE to construct a modal dialog.
60  */
61 QDocumentDialog::QDocumentDialog( QDocument * form)
62         : QDocumentDialogBase( 0, 0, false, 0 ), form_(form)
63 {
64         connect(okPB, SIGNAL(clicked()),
65                 form, SLOT(slotOK()));
66         connect(applyPB, SIGNAL(clicked()),
67                 form, SLOT(slotApply()));
68         connect(cancelPB, SIGNAL(clicked()),
69                 form, SLOT(slotClose()));
70         connect(restorePB, SIGNAL(clicked()),
71                 form, SLOT(slotRestore()));
72         
73         moduleLB->clear();
74         moduleLB->insertItem( _("Layout"), LAYOUT );
75         moduleLB->insertItem( _("Packages"), PACKAGES );
76         moduleLB->insertItem( _("Paper"), PAPER );
77         moduleLB->insertItem( _("Margins"), MARGINS );
78         moduleLB->insertItem( _("Language"), LANGUAGE );
79         moduleLB->insertItem( _("Bullets"), BULLETS );
80         moduleLB->insertItem( _("Numbering"), NUMBERING );
81         moduleLB->insertItem( _("Bibliography"), BIBLIOGRAPHY );
82         moduleLB->insertItem( _("Preamble"), PREAMBLE );
83         moduleLB->setCurrentItem(LAYOUT);
84
85         layoutModule = new ClassModuleBase(this);
86         paperModule = new PaperModuleBase(this);
87         marginsModule = new MarginsModuleBase(this);
88         packagesModule = new PackagesModuleBase(this);
89         langModule = new LanguageModuleBase(this);
90         bulletsModule = new BulletsModule(this);
91         numberingModule = new NumberingModuleBase(this);
92         biblioModule = new BiblioModuleBase(this);
93         preambleModule = new PreambleModuleBase(this);
94
95         moduleStack->addWidget(layoutModule,LAYOUT);
96         moduleStack->addWidget(paperModule,PAPER);
97         moduleStack->addWidget(marginsModule,MARGINS);
98         moduleStack->addWidget(packagesModule,PACKAGES);
99         moduleStack->addWidget(langModule,LANGUAGE);
100         moduleStack->addWidget(bulletsModule,BULLETS);
101         moduleStack->addWidget(numberingModule,NUMBERING);
102         moduleStack->addWidget(biblioModule,BIBLIOGRAPHY);
103         moduleStack->addWidget(preambleModule,PREAMBLE);
104         
105         moduleStack->raiseWidget(LAYOUT);
106
107         //QPixmap image("standard.xpm");
108         //bulletsModule->bulletsBB->insertItem(image);
109         //bulletsModule->bulletsBB->resize(image.width(),image.height());
110         // take care of title
111         QFont f = titleL->font();
112         f.setWeight( QFont::Bold );
113         titleL->setFont( f );
114         setTitle(LAYOUT);
115         
116         /* preamble */
117         connect( preambleModule->preambleMLE, SIGNAL( textChanged() ),
118                  this , SLOT( change_adaptor() ) );
119         /* biblio */
120         connect( biblioModule->natbibCB, SIGNAL( toggled(bool) ),
121                  this , SLOT( change_adaptor() ) );
122         connect( biblioModule->citeStyleCO, SIGNAL( activated(int) ),
123                  this , SLOT( change_adaptor() ) );
124         /* language & quote */
125         connect( langModule->singleQuoteRB, SIGNAL( toggled(bool) ),
126                  this , SLOT( change_adaptor() ) );
127         connect( langModule->doubleQuoteRB, SIGNAL( toggled(bool) ),
128                  this , SLOT( change_adaptor() ) );
129         connect( langModule->languageCO, SIGNAL( activated(int) ),
130                  this , SLOT( change_adaptor() ) );
131         connect( langModule->quoteStyleCO, SIGNAL( activated(int) ),
132                  this , SLOT( change_adaptor() ) );
133         /* numbering */
134         connect( numberingModule->sectionnrDepthSB,
135                  SIGNAL( valueChanged(int) ),
136                  this , SLOT( change_adaptor() ) );
137         connect( numberingModule->tocDepthSB,
138                  SIGNAL( valueChanged(int) ),
139                  this , SLOT( change_adaptor() ) );
140         /* packages */
141         connect( packagesModule->lspacingCO, SIGNAL( activated(int) ),
142                  this , SLOT( change_adaptor() ) );
143         connect( packagesModule->lspacingCO, SIGNAL( activated(int) ),
144                  this , SLOT( setLSpacing(int) ) );
145         connect( packagesModule->lspacingLE,
146                  SIGNAL( textChanged(const QString&) ),
147                  this , SLOT( change_adaptor() ) );
148         connect( packagesModule->encodingCO, SIGNAL( activated(int) ),
149                  this , SLOT( change_adaptor() ) );
150         connect( packagesModule->amsCB, SIGNAL( toggled(bool) ),
151                  this , SLOT( change_adaptor() ) );
152         connect( packagesModule->psdriverCO, SIGNAL( activated(int) ),
153                  this , SLOT( change_adaptor() ) );
154         /* layout */
155         connect( layoutModule->classCO, SIGNAL( activated(int) ),
156                  this , SLOT( change_adaptor() ) );
157         connect( layoutModule->optionsLE,
158                  SIGNAL( textChanged(const QString&) ),
159                  this , SLOT( change_adaptor() ) );
160         connect( layoutModule->pagestyleCO, SIGNAL( activated(int) ),
161                  this , SLOT( change_adaptor() ) );
162         connect( layoutModule->fontsCO, SIGNAL( activated(int) ),
163                  this , SLOT( change_adaptor() ) );
164         connect( layoutModule->fontsizeCO, SIGNAL( activated(int) ),
165                  this , SLOT( change_adaptor() ) );
166         connect( layoutModule->floatPlacementLE,
167                  SIGNAL( textChanged(const QString&) ),
168                  this , SLOT( change_adaptor() ) );
169         connect( layoutModule->skipRB, SIGNAL( toggled(bool) ),
170                  this , SLOT( change_adaptor() ) );
171         connect( layoutModule->indentRB, SIGNAL( toggled(bool) ),
172                  this , SLOT( change_adaptor() ) );
173         connect( layoutModule->skipCO, SIGNAL( activated(int) ),
174                  this , SLOT( change_adaptor() ) );
175         connect( layoutModule->skipLE,
176                  SIGNAL( textChanged(const QString&) ),
177                  this , SLOT( change_adaptor() ) );
178         connect( layoutModule->skipLengthCO, SIGNAL( activated(int) ),
179                  this , SLOT( change_adaptor() ) );
180         
181         connect( layoutModule->classCO, SIGNAL( activated(int) ),
182                  this , SLOT( classChanged() ) );
183         connect( layoutModule->skipCO, SIGNAL( activated(int) ),
184                  this , SLOT( setSkip(int) ) );
185         connect( layoutModule->skipRB, SIGNAL( toggled(bool) ),
186                  this , SLOT( enableSkip(bool) ) );
187         
188         /* margins */
189         connect( marginsModule->marginCO, SIGNAL( activated(int) ),
190                  this , SLOT( setCustomMargins(int) ) );
191         
192         connect( marginsModule->marginCO, SIGNAL( activated(int) ),
193                  this , SLOT( change_adaptor() ) );
194         connect( marginsModule->topLE, SIGNAL( textChanged(const QString&) ),
195                  this , SLOT( change_adaptor() ) );
196         connect( marginsModule->topUnit, SIGNAL( activated(int) ),
197                  this , SLOT( change_adaptor() ) );
198         connect( marginsModule->bottomLE, SIGNAL( textChanged(const QString&) ),
199                  this , SLOT( change_adaptor() ) );
200         connect( marginsModule->bottomUnit, SIGNAL( activated(int) ),
201                  this , SLOT( change_adaptor() ) );
202         connect( marginsModule->innerLE, SIGNAL( textChanged(const QString&) ),
203                  this , SLOT( change_adaptor() ) );
204         connect( marginsModule->innerUnit, SIGNAL( activated(int) ),
205                  this , SLOT( change_adaptor() ) );
206         connect( marginsModule->outerLE, SIGNAL( textChanged(const QString&) ),
207                  this , SLOT( change_adaptor() ) );
208         connect( marginsModule->outerUnit, SIGNAL( activated(int) ),
209                  this , SLOT( change_adaptor() ) );
210         connect( marginsModule->headheightLE, SIGNAL( textChanged(const QString&) ),
211                  this , SLOT( change_adaptor() ) );
212         connect( marginsModule->headheightUnit, SIGNAL( activated(int) ),
213                  this , SLOT( change_adaptor() ) );
214         connect( marginsModule->headsepLE, SIGNAL( textChanged(const QString&) ),
215                  this , SLOT( change_adaptor() ) );
216         connect( marginsModule->headsepUnit, SIGNAL( activated(int) ),
217                  this , SLOT( change_adaptor() ) );
218         connect( marginsModule->footskipLE, SIGNAL( textChanged(const QString&) ),
219                  this , SLOT( change_adaptor() ) );
220         connect( marginsModule->footskipUnit, SIGNAL( activated(int) ),
221                  this , SLOT( change_adaptor() ) );
222         
223         /* paper */
224         connect( paperModule->papersizeCO, SIGNAL( activated(int) ),
225                  this , SLOT( setMargins(int) ) );
226         connect( paperModule->papersizeCO, SIGNAL( activated(int) ),
227                  this , SLOT( setCustomPapersize(int) ) );
228         connect( paperModule->papersizeCO, SIGNAL( activated(int) ),
229                  this , SLOT( setCustomPapersize(int) ) );
230         
231         connect( paperModule->papersizeCO, SIGNAL( activated(int) ),
232                  this , SLOT( change_adaptor() ) );
233         connect( paperModule->paperheightLE, SIGNAL( textChanged(const QString&) ),
234                  this , SLOT( change_adaptor() ) );
235         connect( paperModule->paperwidthLE, SIGNAL( textChanged(const QString&) ),
236                  this , SLOT( change_adaptor() ) );
237         connect( paperModule->paperwidthUnitCO, SIGNAL( activated(int) ),
238                  this , SLOT( change_adaptor() ) );
239         connect( paperModule->paperheightUnitCO, SIGNAL( activated(int) ),
240                  this , SLOT( change_adaptor() ) );
241         connect( paperModule->portraitRB, SIGNAL( toggled(bool) ),
242                  this , SLOT( change_adaptor() ) );
243         connect( paperModule->landscapeRB, SIGNAL( toggled(bool) ),
244                  this , SLOT( change_adaptor() ) );
245         connect( paperModule->twoColumnCB, SIGNAL( toggled(bool) ),
246                  this , SLOT( change_adaptor() ) );
247         connect( paperModule->facingPagesCB, SIGNAL( toggled(bool) ),
248                  this , SLOT( change_adaptor() ) );
249         
250 }
251
252 void QDocumentDialog::showPreamble()
253 {
254         moduleStack->raiseWidget(PREAMBLE);
255         setTitle(PREAMBLE);
256         QDocumentDialogBase::show();
257 }
258
259 /*  
260  *  Destroys the object and frees any allocated resources
261  */
262 QDocumentDialog::~QDocumentDialog()
263 {
264     // no need to delete child widgets, Qt does it all for us
265 }
266
267 /* 
268  * public slot
269  */
270
271 void QDocumentDialog::setTitle(int item)
272 {
273         switch(item) {
274         case LAYOUT:
275                 titleL->setText(_("Document Style"));
276                 break;
277         case PACKAGES:
278                 titleL->setText(_("LaTeX Packages"));
279                 break;
280         case PAPER:
281                 titleL->setText(_("Papersize and Orientation"));
282                 break;
283         case MARGINS:
284                 titleL->setText(_("Margins"));
285                 break;
286         case LANGUAGE:
287                 titleL->setText(_("Language Settings and Quote Style"));
288                 break;
289         case BULLETS:
290                 titleL->setText(_("Bullet Types"));
291                 break;
292         case NUMBERING:
293                 titleL->setText(_("Numbering"));
294                 break;
295         case BIBLIOGRAPHY:
296                 titleL->setText(_("Bibliography Settings"));
297                 break;
298         case PREAMBLE:
299                 titleL->setText(_("LaTeX Preamble"));
300                 break;
301         }
302 }
303
304 /* 
305  * public slot
306  */
307 void QDocumentDialog::saveDocDefault()
308 {}
309
310 /* 
311  * public slot
312  */
313 void QDocumentDialog::restore()
314 {
315     qWarning( "DocumentDialog::restore() not yet implemented!" ); 
316 }
317
318 /* 
319  * public slot
320  */
321 void QDocumentDialog::useClassDefaults()
322 {
323     qWarning( "DocumentDialog::useClassDefaults() not yet implemented!" ); 
324 }
325
326 void QDocumentDialog::change_adaptor()
327 {
328         form_->changed();
329 }
330
331 void QDocumentDialog::closeEvent(QCloseEvent * e)
332 {
333         form_->slotWMHide();
334         e->accept();
335 }
336
337 void QDocumentDialog::setLSpacing(int item)
338 {
339         packagesModule->lspacingLE->setEnabled(item==3);
340 }
341
342 void QDocumentDialog::setSkip(int item)
343 {
344         bool enable = (item==3);
345         layoutModule->skipLE->setEnabled(enable);
346         layoutModule->skipLengthCO->setEnabled(enable);
347 }
348
349 void QDocumentDialog::enableSkip(bool skip)
350 {
351         layoutModule->skipCO->setEnabled(skip);
352         layoutModule->skipLE->setEnabled(skip);
353         layoutModule->skipLengthCO->setEnabled(skip);
354         if (skip)
355                 setSkip(layoutModule->skipCO->currentItem());
356 }
357
358 void QDocumentDialog::setMargins(int papersize)
359 {
360         QStringList a4only;
361         QStringList normal;
362         a4only << _("Small Margins") << _( "Very small Margins")
363                << _("Very wide Margins ");
364         normal << _("Default") << _("Custom");
365         
366         int olditem = marginsModule->marginCO->currentItem();
367         marginsModule->marginCO->clear();
368         marginsModule->marginCO->insertStringList(normal);
369         if (papersize==6) {
370                 marginsModule->marginCO->insertStringList(a4only);
371         }
372         marginsModule->marginCO->setCurrentItem(olditem);
373         setCustomMargins(olditem);
374 }
375
376
377 void QDocumentDialog::setCustomPapersize(int papersize)
378 {
379         bool const custom = (papersize==1);
380         
381         paperModule->paperwidthL->setEnabled(custom);
382         paperModule->paperwidthLE->setEnabled(custom);
383         paperModule->paperwidthUnitCO->setEnabled(custom);
384         paperModule->paperheightL->setEnabled(custom);
385         paperModule->paperheightLE->setEnabled(custom);
386         paperModule->paperheightLE->setFocus();
387         paperModule->paperheightUnitCO->setEnabled(custom);
388 }
389
390
391 void QDocumentDialog::setCustomMargins(int margin)
392 {
393         bool const custom = (margin==1);
394         
395         marginsModule->topL->setEnabled(custom);
396         marginsModule->topLE->setEnabled(custom);
397         marginsModule->topUnit->setEnabled(custom);
398
399         marginsModule->bottomL->setEnabled(custom);
400         marginsModule->bottomLE->setEnabled(custom);
401         marginsModule->bottomUnit->setEnabled(custom);
402
403         marginsModule->innerL->setEnabled(custom);
404         marginsModule->innerLE->setEnabled(custom);
405         marginsModule->innerUnit->setEnabled(custom);
406
407         marginsModule->outerL->setEnabled(custom);
408         marginsModule->outerLE->setEnabled(custom);
409         marginsModule->outerUnit->setEnabled(custom);
410
411         marginsModule->headheightL->setEnabled(custom);
412         marginsModule->headheightLE->setEnabled(custom);
413         marginsModule->headheightUnit->setEnabled(custom);
414
415         marginsModule->headsepL->setEnabled(custom);
416         marginsModule->headsepLE->setEnabled(custom);
417         marginsModule->headsepUnit->setEnabled(custom);
418
419         marginsModule->footskipL->setEnabled(custom);
420         marginsModule->footskipLE->setEnabled(custom);
421         marginsModule->footskipUnit->setEnabled(custom);
422
423 }
424
425 void QDocumentDialog::updateFontsize(string const & items, string const & sel)
426 {
427         layoutModule->fontsizeCO->clear();
428         layoutModule->fontsizeCO->insertItem("default");
429         
430         for (int n=0; !token(items,'|',n).empty(); ++n)
431                 layoutModule->fontsizeCO->
432                         insertItem(token(items,'|',n).c_str());
433
434         for (int n = 0; n<layoutModule->fontsizeCO->count(); ++n) {
435                 if (layoutModule->fontsizeCO->text(n).latin1()==sel) {
436                         layoutModule->fontsizeCO->setCurrentItem(n);
437                         break;
438                 }
439         }
440 }
441
442 void QDocumentDialog::updatePagestyle(string const & items, string const & sel)
443 {
444         layoutModule->pagestyleCO->clear();
445         layoutModule->pagestyleCO->insertItem("default");
446
447         for (int n=0; !token(items,'|',n).empty(); ++n)
448                 layoutModule->pagestyleCO->
449                         insertItem(token(items,'|',n).c_str());
450
451         for (int n = 0; n<layoutModule->pagestyleCO->count(); ++n) {
452                 if (layoutModule->pagestyleCO->text(n).latin1()==sel) {
453                         layoutModule->pagestyleCO->setCurrentItem(n);
454                         break;
455                 }
456         }
457 }
458
459 void QDocumentDialog::classChanged()
460 {
461         updateFontsize(form_->controller().textClass().opt_fontsize(),
462                        form_->controller().params().fontsize);
463         
464         updatePagestyle(form_->controller().textClass().opt_pagestyle(),
465                         form_->controller().params().pagestyle);
466         
467 }
468
469