2 * \file QDocumentDialog.C
3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
8 * Full author contact details are available in file CREDITS
14 #include "ControlDocument.h"
15 #include "QDocument.h"
18 #pragma implementation
21 #include "QDocumentDialog.h"
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"
34 #include "QBrowseBox.h"
36 #include "support/filetools.h"
37 #include "support/lstrings.h"
41 #include "lyx_main.h" // for user_lyxdir
43 #include <qwidgetstack.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>
53 #include "lengthcombo.h"
57 * Constructs a DocumentDialog which is a child of 'parent', with the
58 * name 'name' and widget flags set to 'f'
60 * The dialog will by default be modeless, unless you set 'modal' to
61 * TRUE to construct a modal dialog.
63 QDocumentDialog::QDocumentDialog( QDocument * form)
64 : QDocumentDialogBase( 0, 0, false, 0 ), form_(form)
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()));
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);
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);
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);
107 moduleStack->raiseWidget(LAYOUT);
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 );
120 connect( preambleModule->preambleMLE, SIGNAL( textChanged() ),
121 this , SLOT( change_adaptor() ) );
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() ) );
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() ) );
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() ) );
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() ) );
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) ) );
192 connect( marginsModule->marginCO, SIGNAL( activated(int) ),
193 this , SLOT( setCustomMargins(int) ) );
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() ) );
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) ) );
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() ) );
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() ) );
259 connect( bulletsModule->levelSP, SIGNAL( valueChanged(int) ),
260 this , SLOT( setBullet(int) ) );
261 connect( bulletsModule->levelSP, SIGNAL( valueChanged(int) ),
262 this , SLOT( setBulletSize(int) ) );
268 * Destroys the object and frees any allocated resources
270 QDocumentDialog::~QDocumentDialog()
272 // no need to delete child widgets, Qt does it all for us
280 void QDocumentDialog::setTitle(int item)
284 titleL->setText(_("Document Style"));
287 titleL->setText(_("LaTeX Packages"));
290 titleL->setText(_("Papersize and Orientation"));
293 titleL->setText(_("Margins"));
296 titleL->setText(_("Language Settings and Quote Style"));
299 titleL->setText(_("Bullet Types"));
302 titleL->setText(_("Numbering"));
305 titleL->setText(_("Bibliography Settings"));
308 titleL->setText(_("LaTeX Preamble"));
317 void QDocumentDialog::saveDefaultClicked()
319 form_->saveDocDefault();
326 void QDocumentDialog::useDefaultsClicked()
328 form_->useClassDefaults();
332 void QDocumentDialog::change_adaptor()
338 void QDocumentDialog::closeEvent(QCloseEvent * e)
345 void QDocumentDialog::setLSpacing(int item)
347 packagesModule->lspacingLE->setEnabled(item == 3);
351 void QDocumentDialog::setSkip(int item)
353 bool enable = (item == 3);
354 layoutModule->skipLE->setEnabled(enable);
355 layoutModule->skipLengthCO->setEnabled(enable);
359 void QDocumentDialog::enableSkip(bool skip)
361 layoutModule->skipCO->setEnabled(skip);
362 layoutModule->skipLE->setEnabled(skip);
363 layoutModule->skipLengthCO->setEnabled(skip);
365 setSkip(layoutModule->skipCO->currentItem());
369 void QDocumentDialog::setMargins(int papersize)
373 a4only << _("Small Margins") << _( "Very small Margins")
374 << _("Very wide Margins ");
375 normal << _("Default") << _("Custom");
377 int olditem = marginsModule->marginCO->currentItem();
378 marginsModule->marginCO->clear();
379 marginsModule->marginCO->insertStringList(normal);
381 marginsModule->marginCO->insertStringList(a4only);
383 marginsModule->marginCO->setCurrentItem(olditem);
384 setCustomMargins(olditem);
388 void QDocumentDialog::setCustomPapersize(int papersize)
390 bool const custom = (papersize == 1);
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);
402 void QDocumentDialog::setCustomMargins(int margin)
404 bool const custom = (margin == 1);
406 marginsModule->topL->setEnabled(custom);
407 marginsModule->topLE->setEnabled(custom);
408 marginsModule->topUnit->setEnabled(custom);
410 marginsModule->bottomL->setEnabled(custom);
411 marginsModule->bottomLE->setEnabled(custom);
412 marginsModule->bottomUnit->setEnabled(custom);
414 marginsModule->innerL->setEnabled(custom);
415 marginsModule->innerLE->setEnabled(custom);
416 marginsModule->innerUnit->setEnabled(custom);
418 marginsModule->outerL->setEnabled(custom);
419 marginsModule->outerLE->setEnabled(custom);
420 marginsModule->outerUnit->setEnabled(custom);
422 marginsModule->headheightL->setEnabled(custom);
423 marginsModule->headheightLE->setEnabled(custom);
424 marginsModule->headheightUnit->setEnabled(custom);
426 marginsModule->headsepL->setEnabled(custom);
427 marginsModule->headsepLE->setEnabled(custom);
428 marginsModule->headsepUnit->setEnabled(custom);
430 marginsModule->footskipL->setEnabled(custom);
431 marginsModule->footskipLE->setEnabled(custom);
432 marginsModule->footskipUnit->setEnabled(custom);
437 void QDocumentDialog::updateFontsize(string const & items, string const & sel)
439 layoutModule->fontsizeCO->clear();
440 layoutModule->fontsizeCO->insertItem("default");
442 for (int n=0; !token(items,'|',n).empty(); ++n)
443 layoutModule->fontsizeCO->
444 insertItem(token(items,'|',n).c_str());
446 for (int n = 0; n<layoutModule->fontsizeCO->count(); ++n) {
447 if (layoutModule->fontsizeCO->text(n).latin1()==sel) {
448 layoutModule->fontsizeCO->setCurrentItem(n);
455 void QDocumentDialog::updatePagestyle(string const & items, string const & sel)
457 layoutModule->pagestyleCO->clear();
458 layoutModule->pagestyleCO->insertItem("default");
460 for (int n=0; !token(items,'|',n).empty(); ++n)
461 layoutModule->pagestyleCO->
462 insertItem(token(items,'|',n).c_str());
464 for (int n = 0; n<layoutModule->pagestyleCO->count(); ++n) {
465 if (layoutModule->pagestyleCO->text(n).latin1()==sel) {
466 layoutModule->pagestyleCO->setCurrentItem(n);
473 void QDocumentDialog::classChanged()
475 unsigned int tc = layoutModule->classCO->currentItem();
477 BufferParams & params = form_->controller().params();
478 params.textclass = layoutModule->classCO->currentItem();
480 if (lyxrc.auto_reset_options) {
481 params.textclass = tc;
482 params.useClassDefaults();
483 form_->update_contents();
485 // update the params which are needed in any case
486 // (fontsizes, pagestyle)
487 params.textclass = tc;
488 updateFontsize(form_->controller().textClass().opt_fontsize(),
491 updatePagestyle(form_->controller().textClass().opt_pagestyle(),