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