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);
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 );
119 connect( preambleModule->preambleMLE, SIGNAL( textChanged() ),
120 this , SLOT( change_adaptor() ) );
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() ) );
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() ) );
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() ) );
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() ) );
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) ) );
191 connect( marginsModule->marginCO, SIGNAL( activated(int) ),
192 this , SLOT( setCustomMargins(int) ) );
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() ) );
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) ) );
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() ) );
255 void QDocumentDialog::showPreamble()
257 moduleStack->raiseWidget(PREAMBLE);
259 QDocumentDialogBase::show();
264 * Destroys the object and frees any allocated resources
266 QDocumentDialog::~QDocumentDialog()
268 // no need to delete child widgets, Qt does it all for us
276 void QDocumentDialog::setTitle(int item)
280 titleL->setText(_("Document Style"));
283 titleL->setText(_("LaTeX Packages"));
286 titleL->setText(_("Papersize and Orientation"));
289 titleL->setText(_("Margins"));
292 titleL->setText(_("Language Settings and Quote Style"));
295 titleL->setText(_("Bullet Types"));
298 titleL->setText(_("Numbering"));
301 titleL->setText(_("Bibliography Settings"));
304 titleL->setText(_("LaTeX Preamble"));
313 void QDocumentDialog::saveDocDefault()
320 void QDocumentDialog::restore()
322 qWarning( "DocumentDialog::restore() not yet implemented!" );
329 void QDocumentDialog::useClassDefaults()
331 qWarning( "DocumentDialog::useClassDefaults() not yet implemented!" );
335 void QDocumentDialog::change_adaptor()
341 void QDocumentDialog::closeEvent(QCloseEvent * e)
348 void QDocumentDialog::setLSpacing(int item)
350 packagesModule->lspacingLE->setEnabled(item == 3);
354 void QDocumentDialog::setSkip(int item)
356 bool enable = (item == 3);
357 layoutModule->skipLE->setEnabled(enable);
358 layoutModule->skipLengthCO->setEnabled(enable);
362 void QDocumentDialog::enableSkip(bool skip)
364 layoutModule->skipCO->setEnabled(skip);
365 layoutModule->skipLE->setEnabled(skip);
366 layoutModule->skipLengthCO->setEnabled(skip);
368 setSkip(layoutModule->skipCO->currentItem());
372 void QDocumentDialog::setMargins(int papersize)
376 a4only << _("Small Margins") << _( "Very small Margins")
377 << _("Very wide Margins ");
378 normal << _("Default") << _("Custom");
380 int olditem = marginsModule->marginCO->currentItem();
381 marginsModule->marginCO->clear();
382 marginsModule->marginCO->insertStringList(normal);
384 marginsModule->marginCO->insertStringList(a4only);
386 marginsModule->marginCO->setCurrentItem(olditem);
387 setCustomMargins(olditem);
391 void QDocumentDialog::setCustomPapersize(int papersize)
393 bool const custom = (papersize == 1);
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);
405 void QDocumentDialog::setCustomMargins(int margin)
407 bool const custom = (margin == 1);
409 marginsModule->topL->setEnabled(custom);
410 marginsModule->topLE->setEnabled(custom);
411 marginsModule->topUnit->setEnabled(custom);
413 marginsModule->bottomL->setEnabled(custom);
414 marginsModule->bottomLE->setEnabled(custom);
415 marginsModule->bottomUnit->setEnabled(custom);
417 marginsModule->innerL->setEnabled(custom);
418 marginsModule->innerLE->setEnabled(custom);
419 marginsModule->innerUnit->setEnabled(custom);
421 marginsModule->outerL->setEnabled(custom);
422 marginsModule->outerLE->setEnabled(custom);
423 marginsModule->outerUnit->setEnabled(custom);
425 marginsModule->headheightL->setEnabled(custom);
426 marginsModule->headheightLE->setEnabled(custom);
427 marginsModule->headheightUnit->setEnabled(custom);
429 marginsModule->headsepL->setEnabled(custom);
430 marginsModule->headsepLE->setEnabled(custom);
431 marginsModule->headsepUnit->setEnabled(custom);
433 marginsModule->footskipL->setEnabled(custom);
434 marginsModule->footskipLE->setEnabled(custom);
435 marginsModule->footskipUnit->setEnabled(custom);
440 void QDocumentDialog::updateFontsize(string const & items, string const & sel)
442 layoutModule->fontsizeCO->clear();
443 layoutModule->fontsizeCO->insertItem("default");
445 for (int n=0; !token(items,'|',n).empty(); ++n)
446 layoutModule->fontsizeCO->
447 insertItem(token(items,'|',n).c_str());
449 for (int n = 0; n<layoutModule->fontsizeCO->count(); ++n) {
450 if (layoutModule->fontsizeCO->text(n).latin1()==sel) {
451 layoutModule->fontsizeCO->setCurrentItem(n);
458 void QDocumentDialog::updatePagestyle(string const & items, string const & sel)
460 layoutModule->pagestyleCO->clear();
461 layoutModule->pagestyleCO->insertItem("default");
463 for (int n=0; !token(items,'|',n).empty(); ++n)
464 layoutModule->pagestyleCO->
465 insertItem(token(items,'|',n).c_str());
467 for (int n = 0; n<layoutModule->pagestyleCO->count(); ++n) {
468 if (layoutModule->pagestyleCO->text(n).latin1()==sel) {
469 layoutModule->pagestyleCO->setCurrentItem(n);
476 void QDocumentDialog::classChanged()
478 updateFontsize(form_->controller().textClass().opt_fontsize(),
479 form_->controller().params().fontsize);
481 updatePagestyle(form_->controller().textClass().opt_pagestyle(),
482 form_->controller().params().pagestyle);