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