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"
55 * Constructs a DocumentDialog which is a child of 'parent', with the
56 * name 'name' and widget flags set to 'f'
58 * The dialog will by default be modeless, unless you set 'modal' to
59 * TRUE to construct a modal dialog.
61 QDocumentDialog::QDocumentDialog( QDocument * form)
62 : QDocumentDialogBase( 0, 0, false, 0 ), form_(form)
64 connect(okPB, SIGNAL(clicked()),
65 form, SLOT(slotOK()));
66 connect(applyPB, SIGNAL(clicked()),
67 form, SLOT(slotApply()));
68 connect(cancelPB, SIGNAL(clicked()),
69 form, SLOT(slotClose()));
70 connect(restorePB, SIGNAL(clicked()),
71 form, SLOT(slotRestore()));
74 moduleLB->insertItem( _("Layout"), LAYOUT );
75 moduleLB->insertItem( _("Packages"), PACKAGES );
76 moduleLB->insertItem( _("Paper"), PAPER );
77 moduleLB->insertItem( _("Margins"), MARGINS );
78 moduleLB->insertItem( _("Language"), LANGUAGE );
79 moduleLB->insertItem( _("Bullets"), BULLETS );
80 moduleLB->insertItem( _("Numbering"), NUMBERING );
81 moduleLB->insertItem( _("Bibliography"), BIBLIOGRAPHY );
82 moduleLB->insertItem( _("Preamble"), PREAMBLE );
83 moduleLB->setCurrentItem(LAYOUT);
85 layoutModule = new ClassModuleBase(this);
86 paperModule = new PaperModuleBase(this);
87 marginsModule = new MarginsModuleBase(this);
88 packagesModule = new PackagesModuleBase(this);
89 langModule = new LanguageModuleBase(this);
90 bulletsModule = new BulletsModule(this);
91 numberingModule = new NumberingModuleBase(this);
92 biblioModule = new BiblioModuleBase(this);
93 preambleModule = new PreambleModuleBase(this);
95 moduleStack->addWidget(layoutModule,LAYOUT);
96 moduleStack->addWidget(paperModule,PAPER);
97 moduleStack->addWidget(marginsModule,MARGINS);
98 moduleStack->addWidget(packagesModule,PACKAGES);
99 moduleStack->addWidget(langModule,LANGUAGE);
100 moduleStack->addWidget(bulletsModule,BULLETS);
101 moduleStack->addWidget(numberingModule,NUMBERING);
102 moduleStack->addWidget(biblioModule,BIBLIOGRAPHY);
103 moduleStack->addWidget(preambleModule,PREAMBLE);
105 moduleStack->raiseWidget(LAYOUT);
107 //QPixmap image("standard.xpm");
108 //bulletsModule->bulletsBB->insertItem(image);
109 //bulletsModule->bulletsBB->resize(image.width(),image.height());
110 // take care of title
111 QFont f = titleL->font();
112 f.setWeight( QFont::Bold );
113 titleL->setFont( f );
117 connect( preambleModule->preambleMLE, SIGNAL( textChanged() ),
118 this , SLOT( change_adaptor() ) );
120 connect( biblioModule->natbibCB, SIGNAL( toggled(bool) ),
121 this , SLOT( change_adaptor() ) );
122 connect( biblioModule->citeStyleCO, SIGNAL( activated(int) ),
123 this , SLOT( change_adaptor() ) );
124 /* language & quote */
125 connect( langModule->singleQuoteRB, SIGNAL( toggled(bool) ),
126 this , SLOT( change_adaptor() ) );
127 connect( langModule->doubleQuoteRB, SIGNAL( toggled(bool) ),
128 this , SLOT( change_adaptor() ) );
129 connect( langModule->languageCO, SIGNAL( activated(int) ),
130 this , SLOT( change_adaptor() ) );
131 connect( langModule->quoteStyleCO, SIGNAL( activated(int) ),
132 this , SLOT( change_adaptor() ) );
134 connect( numberingModule->sectionnrDepthSB,
135 SIGNAL( valueChanged(int) ),
136 this , SLOT( change_adaptor() ) );
137 connect( numberingModule->tocDepthSB,
138 SIGNAL( valueChanged(int) ),
139 this , SLOT( change_adaptor() ) );
141 connect( packagesModule->lspacingCO, SIGNAL( activated(int) ),
142 this , SLOT( change_adaptor() ) );
143 connect( packagesModule->lspacingCO, SIGNAL( activated(int) ),
144 this , SLOT( setLSpacing(int) ) );
145 connect( packagesModule->lspacingLE,
146 SIGNAL( textChanged(const QString&) ),
147 this , SLOT( change_adaptor() ) );
148 connect( packagesModule->encodingCO, SIGNAL( activated(int) ),
149 this , SLOT( change_adaptor() ) );
150 connect( packagesModule->amsCB, SIGNAL( toggled(bool) ),
151 this , SLOT( change_adaptor() ) );
152 connect( packagesModule->psdriverCO, SIGNAL( activated(int) ),
153 this , SLOT( change_adaptor() ) );
155 connect( layoutModule->classCO, SIGNAL( activated(int) ),
156 this , SLOT( change_adaptor() ) );
157 connect( layoutModule->optionsLE,
158 SIGNAL( textChanged(const QString&) ),
159 this , SLOT( change_adaptor() ) );
160 connect( layoutModule->pagestyleCO, SIGNAL( activated(int) ),
161 this , SLOT( change_adaptor() ) );
162 connect( layoutModule->fontsCO, SIGNAL( activated(int) ),
163 this , SLOT( change_adaptor() ) );
164 connect( layoutModule->fontsizeCO, SIGNAL( activated(int) ),
165 this , SLOT( change_adaptor() ) );
166 connect( layoutModule->floatPlacementLE,
167 SIGNAL( textChanged(const QString&) ),
168 this , SLOT( change_adaptor() ) );
169 connect( layoutModule->skipRB, SIGNAL( toggled(bool) ),
170 this , SLOT( change_adaptor() ) );
171 connect( layoutModule->indentRB, SIGNAL( toggled(bool) ),
172 this , SLOT( change_adaptor() ) );
173 connect( layoutModule->skipCO, SIGNAL( activated(int) ),
174 this , SLOT( change_adaptor() ) );
175 connect( layoutModule->skipLE,
176 SIGNAL( textChanged(const QString&) ),
177 this , SLOT( change_adaptor() ) );
178 connect( layoutModule->skipLengthCO, SIGNAL( activated(int) ),
179 this , SLOT( change_adaptor() ) );
181 connect( layoutModule->classCO, SIGNAL( activated(int) ),
182 this , SLOT( classChanged() ) );
183 connect( layoutModule->skipCO, SIGNAL( activated(int) ),
184 this , SLOT( setSkip(int) ) );
185 connect( layoutModule->skipRB, SIGNAL( toggled(bool) ),
186 this , SLOT( enableSkip(bool) ) );
189 connect( marginsModule->marginCO, SIGNAL( activated(int) ),
190 this , SLOT( setCustomMargins(int) ) );
192 connect( marginsModule->marginCO, SIGNAL( activated(int) ),
193 this , SLOT( change_adaptor() ) );
194 connect( marginsModule->topLE, SIGNAL( textChanged(const QString&) ),
195 this , SLOT( change_adaptor() ) );
196 connect( marginsModule->topUnit, SIGNAL( activated(int) ),
197 this , SLOT( change_adaptor() ) );
198 connect( marginsModule->bottomLE, SIGNAL( textChanged(const QString&) ),
199 this , SLOT( change_adaptor() ) );
200 connect( marginsModule->bottomUnit, SIGNAL( activated(int) ),
201 this , SLOT( change_adaptor() ) );
202 connect( marginsModule->innerLE, SIGNAL( textChanged(const QString&) ),
203 this , SLOT( change_adaptor() ) );
204 connect( marginsModule->innerUnit, SIGNAL( activated(int) ),
205 this , SLOT( change_adaptor() ) );
206 connect( marginsModule->outerLE, SIGNAL( textChanged(const QString&) ),
207 this , SLOT( change_adaptor() ) );
208 connect( marginsModule->outerUnit, SIGNAL( activated(int) ),
209 this , SLOT( change_adaptor() ) );
210 connect( marginsModule->headheightLE, SIGNAL( textChanged(const QString&) ),
211 this , SLOT( change_adaptor() ) );
212 connect( marginsModule->headheightUnit, SIGNAL( activated(int) ),
213 this , SLOT( change_adaptor() ) );
214 connect( marginsModule->headsepLE, SIGNAL( textChanged(const QString&) ),
215 this , SLOT( change_adaptor() ) );
216 connect( marginsModule->headsepUnit, SIGNAL( activated(int) ),
217 this , SLOT( change_adaptor() ) );
218 connect( marginsModule->footskipLE, SIGNAL( textChanged(const QString&) ),
219 this , SLOT( change_adaptor() ) );
220 connect( marginsModule->footskipUnit, SIGNAL( activated(int) ),
221 this , SLOT( change_adaptor() ) );
224 connect( paperModule->papersizeCO, SIGNAL( activated(int) ),
225 this , SLOT( setMargins(int) ) );
226 connect( paperModule->papersizeCO, SIGNAL( activated(int) ),
227 this , SLOT( setCustomPapersize(int) ) );
228 connect( paperModule->papersizeCO, SIGNAL( activated(int) ),
229 this , SLOT( setCustomPapersize(int) ) );
231 connect( paperModule->papersizeCO, SIGNAL( activated(int) ),
232 this , SLOT( change_adaptor() ) );
233 connect( paperModule->paperheightLE, SIGNAL( textChanged(const QString&) ),
234 this , SLOT( change_adaptor() ) );
235 connect( paperModule->paperwidthLE, SIGNAL( textChanged(const QString&) ),
236 this , SLOT( change_adaptor() ) );
237 connect( paperModule->paperwidthUnitCO, SIGNAL( activated(int) ),
238 this , SLOT( change_adaptor() ) );
239 connect( paperModule->paperheightUnitCO, SIGNAL( activated(int) ),
240 this , SLOT( change_adaptor() ) );
241 connect( paperModule->portraitRB, SIGNAL( toggled(bool) ),
242 this , SLOT( change_adaptor() ) );
243 connect( paperModule->landscapeRB, SIGNAL( toggled(bool) ),
244 this , SLOT( change_adaptor() ) );
245 connect( paperModule->twoColumnCB, SIGNAL( toggled(bool) ),
246 this , SLOT( change_adaptor() ) );
247 connect( paperModule->facingPagesCB, SIGNAL( toggled(bool) ),
248 this , SLOT( change_adaptor() ) );
252 void QDocumentDialog::showPreamble()
254 moduleStack->raiseWidget(PREAMBLE);
256 QDocumentDialogBase::show();
260 * Destroys the object and frees any allocated resources
262 QDocumentDialog::~QDocumentDialog()
264 // no need to delete child widgets, Qt does it all for us
271 void QDocumentDialog::setTitle(int item)
275 titleL->setText(_("Document Style"));
278 titleL->setText(_("LaTeX Packages"));
281 titleL->setText(_("Papersize and Orientation"));
284 titleL->setText(_("Margins"));
287 titleL->setText(_("Language Settings and Quote Style"));
290 titleL->setText(_("Bullet Types"));
293 titleL->setText(_("Numbering"));
296 titleL->setText(_("Bibliography Settings"));
299 titleL->setText(_("LaTeX Preamble"));
307 void QDocumentDialog::saveDocDefault()
313 void QDocumentDialog::restore()
315 qWarning( "DocumentDialog::restore() not yet implemented!" );
321 void QDocumentDialog::useClassDefaults()
323 qWarning( "DocumentDialog::useClassDefaults() not yet implemented!" );
326 void QDocumentDialog::change_adaptor()
331 void QDocumentDialog::closeEvent(QCloseEvent * e)
337 void QDocumentDialog::setLSpacing(int item)
339 packagesModule->lspacingLE->setEnabled(item==3);
342 void QDocumentDialog::setSkip(int item)
344 bool enable = (item==3);
345 layoutModule->skipLE->setEnabled(enable);
346 layoutModule->skipLengthCO->setEnabled(enable);
349 void QDocumentDialog::enableSkip(bool skip)
351 layoutModule->skipCO->setEnabled(skip);
352 layoutModule->skipLE->setEnabled(skip);
353 layoutModule->skipLengthCO->setEnabled(skip);
355 setSkip(layoutModule->skipCO->currentItem());
358 void QDocumentDialog::setMargins(int papersize)
362 a4only << _("Small Margins") << _( "Very small Margins")
363 << _("Very wide Margins ");
364 normal << _("Default") << _("Custom");
366 int olditem = marginsModule->marginCO->currentItem();
367 marginsModule->marginCO->clear();
368 marginsModule->marginCO->insertStringList(normal);
370 marginsModule->marginCO->insertStringList(a4only);
372 marginsModule->marginCO->setCurrentItem(olditem);
373 setCustomMargins(olditem);
377 void QDocumentDialog::setCustomPapersize(int papersize)
379 bool const custom = (papersize==1);
381 paperModule->paperwidthL->setEnabled(custom);
382 paperModule->paperwidthLE->setEnabled(custom);
383 paperModule->paperwidthUnitCO->setEnabled(custom);
384 paperModule->paperheightL->setEnabled(custom);
385 paperModule->paperheightLE->setEnabled(custom);
386 paperModule->paperheightLE->setFocus();
387 paperModule->paperheightUnitCO->setEnabled(custom);
391 void QDocumentDialog::setCustomMargins(int margin)
393 bool const custom = (margin==1);
395 marginsModule->topL->setEnabled(custom);
396 marginsModule->topLE->setEnabled(custom);
397 marginsModule->topUnit->setEnabled(custom);
399 marginsModule->bottomL->setEnabled(custom);
400 marginsModule->bottomLE->setEnabled(custom);
401 marginsModule->bottomUnit->setEnabled(custom);
403 marginsModule->innerL->setEnabled(custom);
404 marginsModule->innerLE->setEnabled(custom);
405 marginsModule->innerUnit->setEnabled(custom);
407 marginsModule->outerL->setEnabled(custom);
408 marginsModule->outerLE->setEnabled(custom);
409 marginsModule->outerUnit->setEnabled(custom);
411 marginsModule->headheightL->setEnabled(custom);
412 marginsModule->headheightLE->setEnabled(custom);
413 marginsModule->headheightUnit->setEnabled(custom);
415 marginsModule->headsepL->setEnabled(custom);
416 marginsModule->headsepLE->setEnabled(custom);
417 marginsModule->headsepUnit->setEnabled(custom);
419 marginsModule->footskipL->setEnabled(custom);
420 marginsModule->footskipLE->setEnabled(custom);
421 marginsModule->footskipUnit->setEnabled(custom);
425 void QDocumentDialog::updateFontsize(string const & items, string const & sel)
427 layoutModule->fontsizeCO->clear();
428 layoutModule->fontsizeCO->insertItem("default");
430 for (int n=0; !token(items,'|',n).empty(); ++n)
431 layoutModule->fontsizeCO->
432 insertItem(token(items,'|',n).c_str());
434 for (int n = 0; n<layoutModule->fontsizeCO->count(); ++n) {
435 if (layoutModule->fontsizeCO->text(n).latin1()==sel) {
436 layoutModule->fontsizeCO->setCurrentItem(n);
442 void QDocumentDialog::updatePagestyle(string const & items, string const & sel)
444 layoutModule->pagestyleCO->clear();
445 layoutModule->pagestyleCO->insertItem("default");
447 for (int n=0; !token(items,'|',n).empty(); ++n)
448 layoutModule->pagestyleCO->
449 insertItem(token(items,'|',n).c_str());
451 for (int n = 0; n<layoutModule->pagestyleCO->count(); ++n) {
452 if (layoutModule->pagestyleCO->text(n).latin1()==sel) {
453 layoutModule->pagestyleCO->setCurrentItem(n);
459 void QDocumentDialog::classChanged()
461 updateFontsize(form_->controller().textClass().opt_fontsize(),
462 form_->controller().params().fontsize);
464 updatePagestyle(form_->controller().textClass().opt_pagestyle(),
465 form_->controller().params().pagestyle);