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