2 * \file GuiDocument.cpp
3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
7 * \author Richard Heck (modules)
9 * Full author contact details are available in file CREDITS.
14 #include "GuiDocument.h"
16 #include "GuiApplication.h"
17 #include "GuiBranches.h"
18 #include "GuiIndices.h"
19 #include "GuiSelectionManager.h"
20 #include "LaTeXHighlighter.h"
21 #include "LengthCombo.h"
22 #include "PanelStack.h"
23 #include "Validator.h"
25 #include "LayoutFile.h"
26 #include "BranchList.h"
27 #include "buffer_funcs.h"
29 #include "BufferParams.h"
30 #include "BufferView.h"
32 #include "ColorCache.h"
34 #include "FloatPlacement.h"
36 #include "FuncRequest.h"
38 #include "IndicesList.h"
40 #include "LaTeXFeatures.h"
42 #include "LayoutModuleList.h"
44 #include "ModuleList.h"
45 #include "OutputParams.h"
46 #include "PDFOptions.h"
47 #include "qt_helpers.h"
50 #include "insets/InsetListingsParams.h"
52 #include "support/debug.h"
53 #include "support/FileName.h"
54 #include "support/filetools.h"
55 #include "support/gettext.h"
56 #include "support/lstrings.h"
58 #include "frontends/alert.h"
60 #include <QAbstractItemModel>
61 #include <QHeaderView>
63 #include <QColorDialog>
64 #include <QCloseEvent>
65 #include <QFontDatabase>
67 #include <QTextCursor>
77 // a style sheet for buttons
78 // this is for example used for the background color setting button
79 static inline QString colorButtonStyleSheet(QColor const & bgColor)
81 if (bgColor.isValid()) {
82 QString rc = QLatin1String("background:");
91 using namespace lyx::support;
96 char const * const tex_graphics[] =
98 "default", "dvialw", "dvilaser", "dvipdf", "dvipdfm", "dvipdfmx",
99 "dvips", "dvipsone", "dvitops", "dviwin", "dviwindo", "dvi2ps", "emtex",
100 "ln", "oztex", "pctexhp", "pctexps", "pctexwin", "pctex32", "pdftex",
101 "psprint", "pubps", "tcidvi", "textures", "truetex", "vtex", "xdvi",
106 char const * const tex_graphics_gui[] =
108 N_("Default"), "dvialw", "DviLaser", "dvipdf", "DVIPDFM", "DVIPDFMx",
109 "Dvips", "DVIPSONE", "DVItoPS", "DVIWIN", "DVIWindo", "dvi2ps", "EmTeX",
110 "LN", "OzTeX", "pctexhp", "pctexps", "pctexwin", "PCTeX32", "pdfTeX",
111 "psprint", "pubps", "tcidvi", "Textures", "TrueTeX", "VTeX", "xdvi",
112 "XeTeX", N_("None"), ""
116 char const * const tex_fonts_roman[] =
118 "default", "cmr", "lmodern", "ae", "times", "palatino",
119 "charter", "newcent", "bookman", "utopia", "beraserif",
120 "ccfonts", "chancery", ""
124 char const * tex_fonts_roman_gui[] =
126 N_("Default"), N_("Computer Modern Roman"), N_("Latin Modern Roman"),
127 N_("AE (Almost European)"), N_("Times Roman"), N_("Palatino"),
128 N_("Bitstream Charter"), N_("New Century Schoolbook"), N_("Bookman"),
129 N_("Utopia"), N_("Bera Serif"), N_("Concrete Roman"), N_("Zapf Chancery"),
134 char const * const tex_fonts_sans[] =
136 "default", "cmss", "lmss", "helvet", "avant", "berasans", "cmbr", ""
140 char const * tex_fonts_sans_gui[] =
142 N_("Default"), N_("Computer Modern Sans"), N_("Latin Modern Sans"),
143 N_("Helvetica"), N_("Avant Garde"), N_("Bera Sans"), N_("CM Bright"), ""
147 char const * const tex_fonts_monospaced[] =
149 "default", "cmtt", "lmtt", "courier", "beramono", "luximono", "cmtl", ""
153 char const * tex_fonts_monospaced_gui[] =
155 N_("Default"), N_("Computer Modern Typewriter"),
156 N_("Latin Modern Typewriter"), N_("Courier"), N_("Bera Mono"),
157 N_("LuxiMono"), N_("CM Typewriter Light"), ""
161 char const * backref_opts[] =
163 "false", "section", "slide", "page", ""
167 char const * backref_opts_gui[] =
169 N_("Off"), N_("Section"), N_("Slide"), N_("Page"), ""
173 vector<pair<string, QString> > pagestyles;
176 } // anonymous namespace
180 RGBColor set_backgroundcolor;
183 // used when sorting the textclass list.
184 class less_textclass_avail_desc
185 : public binary_function<string, string, int>
188 bool operator()(string const & lhs, string const & rhs) const
190 // Ordering criteria:
191 // 1. Availability of text class
192 // 2. Description (lexicographic)
193 LayoutFile const & tc1 = LayoutFileList::get()[lhs];
194 LayoutFile const & tc2 = LayoutFileList::get()[rhs];
195 int const order = compare_no_case(
196 translateIfPossible(from_utf8(tc1.description())),
197 translateIfPossible(from_utf8(tc2.description())));
198 return (tc1.isTeXClassAvailable() && !tc2.isTeXClassAvailable()) ||
199 (tc1.isTeXClassAvailable() == tc2.isTeXClassAvailable() && order < 0);
208 vector<string> getRequiredList(string const & modName)
210 LyXModule const * const mod = theModuleList[modName];
212 return vector<string>(); //empty such thing
213 return mod->getRequiredModules();
217 vector<string> getExcludedList(string const & modName)
219 LyXModule const * const mod = theModuleList[modName];
221 return vector<string>(); //empty such thing
222 return mod->getExcludedModules();
226 docstring getModuleDescription(string const & modName)
228 LyXModule const * const mod = theModuleList[modName];
230 return _("Module not found!");
232 return translateIfPossible(from_utf8(mod->getDescription()));
236 vector<string> getPackageList(string const & modName)
238 LyXModule const * const mod = theModuleList[modName];
240 return vector<string>(); //empty such thing
241 return mod->getPackageList();
245 bool isModuleAvailable(string const & modName)
247 LyXModule const * const mod = theModuleList[modName];
250 return mod->isAvailable();
253 } // anonymous namespace
256 /////////////////////////////////////////////////////////////////////
258 // ModuleSelectionManager
260 /////////////////////////////////////////////////////////////////////
262 /// SelectionManager for use with modules
263 class ModuleSelectionManager : public GuiSelectionManager
267 ModuleSelectionManager(
268 QTreeView * availableLV,
269 QListView * selectedLV,
273 QPushButton * downPB,
274 GuiIdListModel * availableModel,
275 GuiIdListModel * selectedModel,
276 GuiDocument const * container)
277 : GuiSelectionManager(availableLV, selectedLV, addPB, delPB,
278 upPB, downPB, availableModel, selectedModel), container_(container)
281 void updateProvidedModules(LayoutModuleList const & pm)
282 { provided_modules_ = pm.list(); }
284 void updateExcludedModules(LayoutModuleList const & em)
285 { excluded_modules_ = em.list(); }
288 virtual void updateAddPB();
290 virtual void updateUpPB();
292 virtual void updateDownPB();
294 virtual void updateDelPB();
295 /// returns availableModel as a GuiIdListModel
296 GuiIdListModel * getAvailableModel()
298 return dynamic_cast<GuiIdListModel *>(availableModel);
300 /// returns selectedModel as a GuiIdListModel
301 GuiIdListModel * getSelectedModel()
303 return dynamic_cast<GuiIdListModel *>(selectedModel);
305 /// keeps a list of the modules the text class provides
306 list<string> provided_modules_;
308 list<string> excluded_modules_;
310 GuiDocument const * container_;
313 void ModuleSelectionManager::updateAddPB()
315 int const arows = availableModel->rowCount();
316 QModelIndexList const avail_sels =
317 availableLV->selectionModel()->selectedIndexes();
319 // disable if there aren't any modules (?), if none of them is chosen
320 // in the dialog, or if the chosen one is already selected for use.
321 if (arows == 0 || avail_sels.isEmpty() || isSelected(avail_sels.first())) {
322 addPB->setEnabled(false);
326 QModelIndex const & idx = availableLV->selectionModel()->currentIndex();
327 string const modname = getAvailableModel()->getIDString(idx.row());
330 container_->params().moduleCanBeAdded(modname);
331 addPB->setEnabled(enable);
335 void ModuleSelectionManager::updateDownPB()
337 int const srows = selectedModel->rowCount();
339 downPB->setEnabled(false);
342 QModelIndex const & curidx = selectedLV->selectionModel()->currentIndex();
343 int const curRow = curidx.row();
344 if (curRow < 0 || curRow >= srows - 1) { // invalid or last item
345 downPB->setEnabled(false);
349 // determine whether immediately succeding element requires this one
350 string const curmodname = getSelectedModel()->getIDString(curRow);
351 string const nextmodname = getSelectedModel()->getIDString(curRow + 1);
353 vector<string> reqs = getRequiredList(nextmodname);
355 // if it doesn't require anything....
357 downPB->setEnabled(true);
361 // Enable it if this module isn't required.
362 // FIXME This should perhaps be more flexible and check whether, even
363 // if the next one is required, there is also an earlier one that will do.
365 find(reqs.begin(), reqs.end(), curmodname) == reqs.end());
368 void ModuleSelectionManager::updateUpPB()
370 int const srows = selectedModel->rowCount();
372 upPB->setEnabled(false);
376 QModelIndex const & curIdx = selectedLV->selectionModel()->currentIndex();
377 int curRow = curIdx.row();
378 if (curRow <= 0 || curRow > srows - 1) { // first item or invalid
379 upPB->setEnabled(false);
382 string const curmodname = getSelectedModel()->getIDString(curRow);
384 // determine whether immediately preceding element is required by this one
385 vector<string> reqs = getRequiredList(curmodname);
387 // if this one doesn't require anything....
389 upPB->setEnabled(true);
394 // Enable it if the preceding module isn't required.
395 // NOTE This is less flexible than it might be. We could check whether, even
396 // if the previous one is required, there is an earlier one that would do.
397 string const premod = getSelectedModel()->getIDString(curRow - 1);
398 upPB->setEnabled(find(reqs.begin(), reqs.end(), premod) == reqs.end());
401 void ModuleSelectionManager::updateDelPB()
403 int const srows = selectedModel->rowCount();
405 deletePB->setEnabled(false);
409 QModelIndex const & curidx =
410 selectedLV->selectionModel()->currentIndex();
411 int const curRow = curidx.row();
412 if (curRow < 0 || curRow >= srows) { // invalid index?
413 deletePB->setEnabled(false);
417 string const curmodname = getSelectedModel()->getIDString(curRow);
419 // We're looking here for a reason NOT to enable the button. If we
420 // find one, we disable it and return. If we don't, we'll end up at
421 // the end of the function, and then we enable it.
422 for (int i = curRow + 1; i < srows; ++i) {
423 string const thisMod = getSelectedModel()->getIDString(i);
424 vector<string> reqs = getRequiredList(thisMod);
425 //does this one require us?
426 if (find(reqs.begin(), reqs.end(), curmodname) == reqs.end())
430 // OK, so this module requires us
431 // is there an EARLIER module that also satisfies the require?
432 // NOTE We demand that it be earlier to keep the list of modules
433 // consistent with the rule that a module must be proceeded by a
434 // required module. There would be more flexible ways to proceed,
435 // but that would be a lot more complicated, and the logic here is
436 // already complicated. (That's why I've left the debugging code.)
437 // lyxerr << "Testing " << thisMod << endl;
438 bool foundone = false;
439 for (int j = 0; j < curRow; ++j) {
440 string const mod = getSelectedModel()->getIDString(j);
441 // lyxerr << "In loop: Testing " << mod << endl;
442 // do we satisfy the require?
443 if (find(reqs.begin(), reqs.end(), mod) != reqs.end()) {
444 // lyxerr << mod << " does the trick." << endl;
449 // did we find a module to satisfy the require?
451 // lyxerr << "No matching module found." << endl;
452 deletePB->setEnabled(false);
456 // lyxerr << "All's well that ends well." << endl;
457 deletePB->setEnabled(true);
461 /////////////////////////////////////////////////////////////////////
465 /////////////////////////////////////////////////////////////////////
467 PreambleModule::PreambleModule() : current_id_(0)
469 // This is not a memory leak. The object will be destroyed
471 (void) new LaTeXHighlighter(preambleTE->document());
472 setFocusProxy(preambleTE);
473 connect(preambleTE, SIGNAL(textChanged()), this, SIGNAL(changed()));
477 void PreambleModule::update(BufferParams const & params, BufferId id)
479 QString preamble = toqstr(params.preamble);
480 // Nothing to do if the params and preamble are unchanged.
481 if (id == current_id_
482 && preamble == preambleTE->document()->toPlainText())
485 QTextCursor cur = preambleTE->textCursor();
486 // Save the coords before switching to the new one.
487 preamble_coords_[current_id_] =
488 make_pair(cur.position(), preambleTE->verticalScrollBar()->value());
490 // Save the params address for further use.
492 preambleTE->document()->setPlainText(preamble);
493 Coords::const_iterator it = preamble_coords_.find(current_id_);
494 if (it == preamble_coords_.end())
495 // First time we open this one.
496 preamble_coords_[current_id_] = make_pair(0, 0);
498 // Restore saved coords.
499 QTextCursor cur = preambleTE->textCursor();
500 cur.setPosition(it->second.first);
501 preambleTE->setTextCursor(cur);
502 preambleTE->verticalScrollBar()->setValue(it->second.second);
507 void PreambleModule::apply(BufferParams & params)
509 params.preamble = fromqstr(preambleTE->document()->toPlainText());
513 void PreambleModule::closeEvent(QCloseEvent * e)
515 // Save the coords before closing.
516 QTextCursor cur = preambleTE->textCursor();
517 preamble_coords_[current_id_] =
518 make_pair(cur.position(), preambleTE->verticalScrollBar()->value());
523 /////////////////////////////////////////////////////////////////////
527 /////////////////////////////////////////////////////////////////////
530 GuiDocument::GuiDocument(GuiView & lv)
531 : GuiDialog(lv, "document", qt_("Document Settings"))
535 connect(okPB, SIGNAL(clicked()), this, SLOT(slotOK()));
536 connect(applyPB, SIGNAL(clicked()), this, SLOT(slotApply()));
537 connect(closePB, SIGNAL(clicked()), this, SLOT(slotClose()));
538 connect(restorePB, SIGNAL(clicked()), this, SLOT(slotRestore()));
540 connect(savePB, SIGNAL(clicked()), this, SLOT(saveDefaultClicked()));
541 connect(defaultPB, SIGNAL(clicked()), this, SLOT(useDefaultsClicked()));
543 // Manage the restore, ok, apply, restore and cancel/close buttons
544 bc().setPolicy(ButtonPolicy::NoRepeatedApplyReadOnlyPolicy);
546 bc().setApply(applyPB);
547 bc().setCancel(closePB);
548 bc().setRestore(restorePB);
550 textLayoutModule = new UiWidget<Ui::TextLayoutUi>;
552 connect(textLayoutModule->lspacingCO, SIGNAL(activated(int)),
553 this, SLOT(change_adaptor()));
554 connect(textLayoutModule->lspacingCO, SIGNAL(activated(int)),
555 this, SLOT(setLSpacing(int)));
556 connect(textLayoutModule->lspacingLE, SIGNAL(textChanged(const QString &)),
557 this, SLOT(change_adaptor()));
559 connect(textLayoutModule->indentRB, SIGNAL(clicked()),
560 this, SLOT(change_adaptor()));
561 connect(textLayoutModule->indentRB, SIGNAL(toggled(bool)),
562 textLayoutModule->indentCO, SLOT(setEnabled(bool)));
563 connect(textLayoutModule->indentCO, SIGNAL(activated(int)),
564 this, SLOT(change_adaptor()));
565 connect(textLayoutModule->indentCO, SIGNAL(activated(int)),
566 this, SLOT(setIndent(int)));
567 connect(textLayoutModule->indentLE, SIGNAL(textChanged(const QString &)),
568 this, SLOT(change_adaptor()));
569 connect(textLayoutModule->indentLengthCO, SIGNAL(activated(int)),
570 this, SLOT(change_adaptor()));
572 connect(textLayoutModule->skipRB, SIGNAL(clicked()),
573 this, SLOT(change_adaptor()));
574 connect(textLayoutModule->skipRB, SIGNAL(toggled(bool)),
575 textLayoutModule->skipCO, SLOT(setEnabled(bool)));
576 connect(textLayoutModule->skipCO, SIGNAL(activated(int)),
577 this, SLOT(change_adaptor()));
578 connect(textLayoutModule->skipCO, SIGNAL(activated(int)),
579 this, SLOT(setSkip(int)));
580 connect(textLayoutModule->skipLE, SIGNAL(textChanged(const QString &)),
581 this, SLOT(change_adaptor()));
582 connect(textLayoutModule->skipLengthCO, SIGNAL(activated(int)),
583 this, SLOT(change_adaptor()));
585 connect(textLayoutModule->indentRB, SIGNAL(toggled(bool)),
586 this, SLOT(enableIndent(bool)));
587 connect(textLayoutModule->skipRB, SIGNAL(toggled(bool)),
588 this, SLOT(enableSkip(bool)));
590 connect(textLayoutModule->twoColumnCB, SIGNAL(clicked()),
591 this, SLOT(change_adaptor()));
592 connect(textLayoutModule->twoColumnCB, SIGNAL(clicked()),
593 this, SLOT(setColSep()));
595 textLayoutModule->lspacingLE->setValidator(new QDoubleValidator(
596 textLayoutModule->lspacingLE));
597 textLayoutModule->indentLE->setValidator(unsignedLengthValidator(
598 textLayoutModule->indentLE));
599 textLayoutModule->skipLE->setValidator(unsignedGlueLengthValidator(
600 textLayoutModule->skipLE));
602 textLayoutModule->indentCO->addItem(qt_("Default"));
603 textLayoutModule->indentCO->addItem(qt_("Custom"));
604 textLayoutModule->skipCO->addItem(qt_("SmallSkip"));
605 textLayoutModule->skipCO->addItem(qt_("MedSkip"));
606 textLayoutModule->skipCO->addItem(qt_("BigSkip"));
607 textLayoutModule->skipCO->addItem(qt_("Custom"));
608 textLayoutModule->lspacingCO->insertItem(
609 Spacing::Single, qt_("Single"));
610 textLayoutModule->lspacingCO->insertItem(
611 Spacing::Onehalf, qt_("OneHalf"));
612 textLayoutModule->lspacingCO->insertItem(
613 Spacing::Double, qt_("Double"));
614 textLayoutModule->lspacingCO->insertItem(
615 Spacing::Other, qt_("Custom"));
616 // initialize the length validator
617 bc().addCheckedLineEdit(textLayoutModule->indentLE);
618 bc().addCheckedLineEdit(textLayoutModule->skipLE);
620 // master/child handling
621 masterChildModule = new UiWidget<Ui::MasterChildUi>;
623 connect(masterChildModule->childrenTW, SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)),
624 this, SLOT(includeonlyClicked(QTreeWidgetItem *, int)));
625 connect(masterChildModule->includeonlyRB, SIGNAL(toggled(bool)),
626 masterChildModule->childrenTW, SLOT(setEnabled(bool)));
627 connect(masterChildModule->includeonlyRB, SIGNAL(toggled(bool)),
628 masterChildModule->maintainAuxCB, SLOT(setEnabled(bool)));
629 connect(masterChildModule->includeallRB, SIGNAL(clicked()),
630 this, SLOT(change_adaptor()));
631 connect(masterChildModule->includeonlyRB, SIGNAL(clicked()),
632 this, SLOT(change_adaptor()));
633 connect(masterChildModule->maintainAuxCB, SIGNAL(clicked()),
634 this, SLOT(change_adaptor()));
635 masterChildModule->childrenTW->setColumnCount(2);
636 masterChildModule->childrenTW->headerItem()->setText(0, qt_("Child Document"));
637 masterChildModule->childrenTW->headerItem()->setText(1, qt_("Include to Output"));
638 masterChildModule->childrenTW->resizeColumnToContents(1);
639 masterChildModule->childrenTW->resizeColumnToContents(2);
642 outputModule = new UiWidget<Ui::OutputUi>;
644 connect(outputModule->xetexCB, SIGNAL(clicked()),
645 this, SLOT(change_adaptor()));
646 connect(outputModule->xetexCB, SIGNAL(toggled(bool)),
647 this, SLOT(xetexChanged(bool)));
648 connect(outputModule->defaultFormatCO, SIGNAL(activated(int)),
649 this, SLOT(change_adaptor()));
652 fontModule = new UiWidget<Ui::FontUi>;
653 connect(fontModule->fontsRomanCO, SIGNAL(activated(int)),
654 this, SLOT(change_adaptor()));
655 connect(fontModule->fontsRomanCO, SIGNAL(activated(int)),
656 this, SLOT(romanChanged(int)));
657 connect(fontModule->fontsSansCO, SIGNAL(activated(int)),
658 this, SLOT(change_adaptor()));
659 connect(fontModule->fontsSansCO, SIGNAL(activated(int)),
660 this, SLOT(sansChanged(int)));
661 connect(fontModule->fontsTypewriterCO, SIGNAL(activated(int)),
662 this, SLOT(change_adaptor()));
663 connect(fontModule->fontsTypewriterCO, SIGNAL(activated(int)),
664 this, SLOT(ttChanged(int)));
665 connect(fontModule->fontsDefaultCO, SIGNAL(activated(int)),
666 this, SLOT(change_adaptor()));
667 connect(fontModule->fontencCO, SIGNAL(activated(int)),
668 this, SLOT(change_adaptor()));
669 connect(fontModule->fontencCO, SIGNAL(activated(int)),
670 this, SLOT(fontencChanged(int)));
671 connect(fontModule->fontencLE, SIGNAL(textChanged(const QString &)),
672 this, SLOT(change_adaptor()));
673 connect(fontModule->fontsizeCO, SIGNAL(activated(int)),
674 this, SLOT(change_adaptor()));
675 connect(fontModule->cjkFontLE, SIGNAL(textChanged(const QString &)),
676 this, SLOT(change_adaptor()));
677 connect(fontModule->scaleSansSB, SIGNAL(valueChanged(int)),
678 this, SLOT(change_adaptor()));
679 connect(fontModule->scaleTypewriterSB, SIGNAL(valueChanged(int)),
680 this, SLOT(change_adaptor()));
681 connect(fontModule->fontScCB, SIGNAL(clicked()),
682 this, SLOT(change_adaptor()));
683 connect(fontModule->fontOsfCB, SIGNAL(clicked()),
684 this, SLOT(change_adaptor()));
688 fontModule->fontsizeCO->addItem(qt_("Default"));
689 fontModule->fontsizeCO->addItem(qt_("10"));
690 fontModule->fontsizeCO->addItem(qt_("11"));
691 fontModule->fontsizeCO->addItem(qt_("12"));
693 fontModule->fontencCO->addItem(qt_("Default"));
694 fontModule->fontencCO->addItem(qt_("Custom"));
695 fontModule->fontencCO->addItem(qt_("None (no fontenc)"));
697 for (int n = 0; GuiDocument::fontfamilies_gui[n][0]; ++n)
698 fontModule->fontsDefaultCO->addItem(
699 qt_(GuiDocument::fontfamilies_gui[n]));
702 pageLayoutModule = new UiWidget<Ui::PageLayoutUi>;
704 connect(pageLayoutModule->papersizeCO, SIGNAL(activated(int)),
705 this, SLOT(papersizeChanged(int)));
706 connect(pageLayoutModule->papersizeCO, SIGNAL(activated(int)),
707 this, SLOT(papersizeChanged(int)));
708 connect(pageLayoutModule->portraitRB, SIGNAL(clicked()),
709 this, SLOT(portraitChanged()));
710 connect(pageLayoutModule->papersizeCO, SIGNAL(activated(int)),
711 this, SLOT(change_adaptor()));
712 connect(pageLayoutModule->paperheightLE, SIGNAL(textChanged(const QString &)),
713 this, SLOT(change_adaptor()));
714 connect(pageLayoutModule->paperwidthLE, SIGNAL(textChanged(const QString &)),
715 this, SLOT(change_adaptor()));
716 connect(pageLayoutModule->paperwidthUnitCO, SIGNAL(activated(int)),
717 this, SLOT(change_adaptor()));
718 connect(pageLayoutModule->paperheightUnitCO, SIGNAL(activated(int)),
719 this, SLOT(change_adaptor()));
720 connect(pageLayoutModule->portraitRB, SIGNAL(clicked()),
721 this, SLOT(change_adaptor()));
722 connect(pageLayoutModule->landscapeRB, SIGNAL(clicked()),
723 this, SLOT(change_adaptor()));
724 connect(pageLayoutModule->facingPagesCB, SIGNAL(clicked()),
725 this, SLOT(change_adaptor()));
726 connect(pageLayoutModule->pagestyleCO, SIGNAL(activated(int)),
727 this, SLOT(change_adaptor()));
728 connect(pageLayoutModule->backgroundPB, SIGNAL(clicked()),
729 this, SLOT(changeBackgroundColor()));
730 connect(pageLayoutModule->delbackgroundTB, SIGNAL(clicked()),
731 this, SLOT(deleteBackgroundColor()));
733 pageLayoutModule->pagestyleCO->addItem(qt_("Default"));
734 pageLayoutModule->pagestyleCO->addItem(qt_("empty"));
735 pageLayoutModule->pagestyleCO->addItem(qt_("plain"));
736 pageLayoutModule->pagestyleCO->addItem(qt_("headings"));
737 pageLayoutModule->pagestyleCO->addItem(qt_("fancy"));
738 bc().addCheckedLineEdit(pageLayoutModule->paperheightLE,
739 pageLayoutModule->paperheightL);
740 bc().addCheckedLineEdit(pageLayoutModule->paperwidthLE,
741 pageLayoutModule->paperwidthL);
744 QComboBox * cb = pageLayoutModule->papersizeCO;
745 cb->addItem(qt_("Default"));
746 cb->addItem(qt_("Custom"));
747 cb->addItem(qt_("US letter"));
748 cb->addItem(qt_("US legal"));
749 cb->addItem(qt_("US executive"));
750 cb->addItem(qt_("A3"));
751 cb->addItem(qt_("A4"));
752 cb->addItem(qt_("A5"));
753 cb->addItem(qt_("B3"));
754 cb->addItem(qt_("B4"));
755 cb->addItem(qt_("B5"));
756 // remove the %-items from the unit choice
757 pageLayoutModule->paperwidthUnitCO->noPercents();
758 pageLayoutModule->paperheightUnitCO->noPercents();
759 pageLayoutModule->paperheightLE->setValidator(unsignedLengthValidator(
760 pageLayoutModule->paperheightLE));
761 pageLayoutModule->paperwidthLE->setValidator(unsignedLengthValidator(
762 pageLayoutModule->paperwidthLE));
765 marginsModule = new UiWidget<Ui::MarginsUi>;
767 connect(marginsModule->marginCB, SIGNAL(toggled(bool)),
768 this, SLOT(setCustomMargins(bool)));
769 connect(marginsModule->marginCB, SIGNAL(clicked()),
770 this, SLOT(change_adaptor()));
771 connect(marginsModule->topLE, SIGNAL(textChanged(QString)),
772 this, SLOT(change_adaptor()));
773 connect(marginsModule->topUnit, SIGNAL(activated(int)),
774 this, SLOT(change_adaptor()));
775 connect(marginsModule->bottomLE, SIGNAL(textChanged(QString)),
776 this, SLOT(change_adaptor()));
777 connect(marginsModule->bottomUnit, SIGNAL(activated(int)),
778 this, SLOT(change_adaptor()));
779 connect(marginsModule->innerLE, SIGNAL(textChanged(QString)),
780 this, SLOT(change_adaptor()));
781 connect(marginsModule->innerUnit, SIGNAL(activated(int)),
782 this, SLOT(change_adaptor()));
783 connect(marginsModule->outerLE, SIGNAL(textChanged(QString)),
784 this, SLOT(change_adaptor()));
785 connect(marginsModule->outerUnit, SIGNAL(activated(int)),
786 this, SLOT(change_adaptor()));
787 connect(marginsModule->headheightLE, SIGNAL(textChanged(QString)),
788 this, SLOT(change_adaptor()));
789 connect(marginsModule->headheightUnit, SIGNAL(activated(int)),
790 this, SLOT(change_adaptor()));
791 connect(marginsModule->headsepLE, SIGNAL(textChanged(QString)),
792 this, SLOT(change_adaptor()));
793 connect(marginsModule->headsepUnit, SIGNAL(activated(int)),
794 this, SLOT(change_adaptor()));
795 connect(marginsModule->footskipLE, SIGNAL(textChanged(QString)),
796 this, SLOT(change_adaptor()));
797 connect(marginsModule->footskipUnit, SIGNAL(activated(int)),
798 this, SLOT(change_adaptor()));
799 connect(marginsModule->columnsepLE, SIGNAL(textChanged(QString)),
800 this, SLOT(change_adaptor()));
801 connect(marginsModule->columnsepUnit, SIGNAL(activated(int)),
802 this, SLOT(change_adaptor()));
803 marginsModule->topLE->setValidator(unsignedLengthValidator(
804 marginsModule->topLE));
805 marginsModule->bottomLE->setValidator(unsignedLengthValidator(
806 marginsModule->bottomLE));
807 marginsModule->innerLE->setValidator(unsignedLengthValidator(
808 marginsModule->innerLE));
809 marginsModule->outerLE->setValidator(unsignedLengthValidator(
810 marginsModule->outerLE));
811 marginsModule->headsepLE->setValidator(unsignedLengthValidator(
812 marginsModule->headsepLE));
813 marginsModule->headheightLE->setValidator(unsignedLengthValidator(
814 marginsModule->headheightLE));
815 marginsModule->footskipLE->setValidator(unsignedLengthValidator(
816 marginsModule->footskipLE));
817 marginsModule->columnsepLE->setValidator(unsignedLengthValidator(
818 marginsModule->columnsepLE));
820 bc().addCheckedLineEdit(marginsModule->topLE,
821 marginsModule->topL);
822 bc().addCheckedLineEdit(marginsModule->bottomLE,
823 marginsModule->bottomL);
824 bc().addCheckedLineEdit(marginsModule->innerLE,
825 marginsModule->innerL);
826 bc().addCheckedLineEdit(marginsModule->outerLE,
827 marginsModule->outerL);
828 bc().addCheckedLineEdit(marginsModule->headsepLE,
829 marginsModule->headsepL);
830 bc().addCheckedLineEdit(marginsModule->headheightLE,
831 marginsModule->headheightL);
832 bc().addCheckedLineEdit(marginsModule->footskipLE,
833 marginsModule->footskipL);
834 bc().addCheckedLineEdit(marginsModule->columnsepLE,
835 marginsModule->columnsepL);
838 langModule = new UiWidget<Ui::LanguageUi>;
840 connect(langModule->languageCO, SIGNAL(activated(int)),
841 this, SLOT(change_adaptor()));
842 connect(langModule->defaultencodingRB, SIGNAL(clicked()),
843 this, SLOT(change_adaptor()));
844 connect(langModule->otherencodingRB, SIGNAL(clicked()),
845 this, SLOT(change_adaptor()));
846 connect(langModule->encodingCO, SIGNAL(activated(int)),
847 this, SLOT(change_adaptor()));
848 connect(langModule->quoteStyleCO, SIGNAL(activated(int)),
849 this, SLOT(change_adaptor()));
851 QAbstractItemModel * language_model = guiApp->languageModel();
852 // FIXME: it would be nice if sorting was enabled/disabled via a checkbox.
853 language_model->sort(0);
854 langModule->languageCO->setModel(language_model);
855 langModule->languageCO->setModelColumn(0);
857 // Always put the default encoding in the first position.
858 langModule->encodingCO->addItem(qt_("Language Default (no inputenc)"));
859 QStringList encodinglist;
860 Encodings::const_iterator it = encodings.begin();
861 Encodings::const_iterator const end = encodings.end();
862 for (; it != end; ++it)
863 encodinglist.append(qt_(it->guiName()));
865 langModule->encodingCO->addItems(encodinglist);
867 langModule->quoteStyleCO->addItem(qt_("``text''"));
868 langModule->quoteStyleCO->addItem(qt_("''text''"));
869 langModule->quoteStyleCO->addItem(qt_(",,text``"));
870 langModule->quoteStyleCO->addItem(qt_(",,text''"));
871 langModule->quoteStyleCO->addItem(qt_("<<text>>"));
872 langModule->quoteStyleCO->addItem(qt_(">>text<<"));
875 numberingModule = new UiWidget<Ui::NumberingUi>;
877 connect(numberingModule->depthSL, SIGNAL(valueChanged(int)),
878 this, SLOT(change_adaptor()));
879 connect(numberingModule->tocSL, SIGNAL(valueChanged(int)),
880 this, SLOT(change_adaptor()));
881 connect(numberingModule->depthSL, SIGNAL(valueChanged(int)),
882 this, SLOT(updateNumbering()));
883 connect(numberingModule->tocSL, SIGNAL(valueChanged(int)),
884 this, SLOT(updateNumbering()));
885 numberingModule->tocTW->setColumnCount(3);
886 numberingModule->tocTW->headerItem()->setText(0, qt_("Example"));
887 numberingModule->tocTW->headerItem()->setText(1, qt_("Numbered"));
888 numberingModule->tocTW->headerItem()->setText(2, qt_("Appears in TOC"));
891 biblioModule = new UiWidget<Ui::BiblioUi>;
892 connect(biblioModule->citeNatbibRB, SIGNAL(toggled(bool)),
893 biblioModule->citationStyleL, SLOT(setEnabled(bool)));
894 connect(biblioModule->citeNatbibRB, SIGNAL(toggled(bool)),
895 biblioModule->citeStyleCO, SLOT(setEnabled(bool)));
897 connect(biblioModule->citeDefaultRB, SIGNAL(clicked()),
898 this, SLOT(change_adaptor()));
899 connect(biblioModule->citeNatbibRB, SIGNAL(clicked()),
900 this, SLOT(change_adaptor()));
901 connect(biblioModule->citeStyleCO, SIGNAL(activated(int)),
902 this, SLOT(change_adaptor()));
903 connect(biblioModule->citeJurabibRB, SIGNAL(clicked()),
904 this, SLOT(change_adaptor()));
905 connect(biblioModule->bibtopicCB, SIGNAL(clicked()),
906 this, SLOT(change_adaptor()));
907 connect(biblioModule->bibtexCO, SIGNAL(activated(int)),
908 this, SLOT(bibtexChanged(int)));
909 connect(biblioModule->bibtexOptionsED, SIGNAL(textChanged(QString)),
910 this, SLOT(change_adaptor()));
912 biblioModule->citeStyleCO->addItem(qt_("Author-year"));
913 biblioModule->citeStyleCO->addItem(qt_("Numerical"));
914 biblioModule->citeStyleCO->setCurrentIndex(0);
916 biblioModule->bibtexCO->clear();
918 biblioModule->bibtexCO->addItem(qt_("Default"), QString("default"));
919 for (set<string>::const_iterator it = lyxrc.bibtex_alternatives.begin();
920 it != lyxrc.bibtex_alternatives.end(); ++it) {
921 QString const command = toqstr(*it).left(toqstr(*it).indexOf(" "));
922 biblioModule->bibtexCO->addItem(command, command);
926 indicesModule = new GuiIndices;
927 connect(indicesModule, SIGNAL(changed()),
928 this, SLOT(change_adaptor()));
931 mathsModule = new UiWidget<Ui::MathsUi>;
932 connect(mathsModule->amsautoCB, SIGNAL(toggled(bool)),
933 mathsModule->amsCB, SLOT(setDisabled(bool)));
934 connect(mathsModule->esintautoCB, SIGNAL(toggled(bool)),
935 mathsModule->esintCB, SLOT(setDisabled(bool)));
936 connect(mathsModule->mhchemautoCB, SIGNAL(toggled(bool)),
937 mathsModule->mhchemCB, SLOT(setDisabled(bool)));
939 connect(mathsModule->amsCB, SIGNAL(clicked()),
940 this, SLOT(change_adaptor()));
941 connect(mathsModule->amsautoCB, SIGNAL(clicked()),
942 this, SLOT(change_adaptor()));
943 connect(mathsModule->esintCB, SIGNAL(clicked()),
944 this, SLOT(change_adaptor()));
945 connect(mathsModule->esintautoCB, SIGNAL(clicked()),
946 this, SLOT(change_adaptor()));
947 connect(mathsModule->mhchemCB, SIGNAL(clicked()),
948 this, SLOT(change_adaptor()));
949 connect(mathsModule->mhchemautoCB, SIGNAL(clicked()),
950 this, SLOT(change_adaptor()));
952 latexModule = new UiWidget<Ui::LaTeXUi>;
954 connect(latexModule->optionsLE, SIGNAL(textChanged(QString)),
955 this, SLOT(change_adaptor()));
956 connect(latexModule->defaultOptionsCB, SIGNAL(clicked()),
957 this, SLOT(change_adaptor()));
958 connect(latexModule->psdriverCO, SIGNAL(activated(int)),
959 this, SLOT(change_adaptor()));
960 connect(latexModule->classCO, SIGNAL(activated(int)),
961 this, SLOT(classChanged()));
962 connect(latexModule->classCO, SIGNAL(activated(int)),
963 this, SLOT(change_adaptor()));
964 connect(latexModule->layoutPB, SIGNAL(clicked()),
965 this, SLOT(browseLayout()));
966 connect(latexModule->layoutPB, SIGNAL(clicked()),
967 this, SLOT(change_adaptor()));
968 connect(latexModule->childDocGB, SIGNAL(clicked()),
969 this, SLOT(change_adaptor()));
970 connect(latexModule->childDocLE, SIGNAL(textChanged(QString)),
971 this, SLOT(change_adaptor()));
972 connect(latexModule->childDocPB, SIGNAL(clicked()),
973 this, SLOT(browseMaster()));
974 connect(latexModule->suppressDateCB, SIGNAL(clicked()),
975 this, SLOT(change_adaptor()));
977 // postscript drivers
978 for (int n = 0; tex_graphics[n][0]; ++n) {
979 QString enc = qt_(tex_graphics_gui[n]);
980 latexModule->psdriverCO->addItem(enc);
983 latexModule->classCO->setModel(&classes_model_);
984 LayoutFileList const & bcl = LayoutFileList::get();
985 vector<LayoutFileIndex> classList = bcl.classList();
986 sort(classList.begin(), classList.end(), less_textclass_avail_desc());
988 vector<LayoutFileIndex>::const_iterator cit = classList.begin();
989 vector<LayoutFileIndex>::const_iterator cen = classList.end();
990 for (int i = 0; cit != cen; ++cit, ++i) {
991 LayoutFile const & tc = bcl[*cit];
992 docstring item = (tc.isTeXClassAvailable()) ?
993 from_utf8(tc.description()) :
994 bformat(_("Unavailable: %1$s"), from_utf8(tc.description()));
995 classes_model_.insertRow(i, toqstr(item), *cit);
999 branchesModule = new GuiBranches;
1000 connect(branchesModule, SIGNAL(changed()),
1001 this, SLOT(change_adaptor()));
1002 connect(branchesModule, SIGNAL(renameBranches(docstring const &, docstring const &)),
1003 this, SLOT(branchesRename(docstring const &, docstring const &)));
1004 updateUnknownBranches();
1007 preambleModule = new PreambleModule;
1008 connect(preambleModule, SIGNAL(changed()),
1009 this, SLOT(change_adaptor()));
1012 bulletsModule = new BulletsModule;
1013 connect(bulletsModule, SIGNAL(changed()),
1014 this, SLOT(change_adaptor()));
1017 modulesModule = new UiWidget<Ui::ModulesUi>;
1018 modulesModule->availableLV->header()->setVisible(false);
1020 new ModuleSelectionManager(modulesModule->availableLV,
1021 modulesModule->selectedLV,
1022 modulesModule->addPB, modulesModule->deletePB,
1023 modulesModule->upPB, modulesModule->downPB,
1024 availableModel(), selectedModel(), this);
1025 connect(selectionManager, SIGNAL(updateHook()),
1026 this, SLOT(updateModuleInfo()));
1027 connect(selectionManager, SIGNAL(updateHook()),
1028 this, SLOT(change_adaptor()));
1029 connect(selectionManager, SIGNAL(selectionChanged()),
1030 this, SLOT(modulesChanged()));
1033 pdfSupportModule = new UiWidget<Ui::PDFSupportUi>;
1035 connect(pdfSupportModule->use_hyperrefGB, SIGNAL(toggled(bool)),
1036 this, SLOT(change_adaptor()));
1037 connect(pdfSupportModule->titleLE, SIGNAL(textChanged(QString)),
1038 this, SLOT(change_adaptor()));
1039 connect(pdfSupportModule->authorLE, SIGNAL(textChanged(QString)),
1040 this, SLOT(change_adaptor()));
1041 connect(pdfSupportModule->subjectLE, SIGNAL(textChanged(QString)),
1042 this, SLOT(change_adaptor()));
1043 connect(pdfSupportModule->keywordsLE, SIGNAL(textChanged(QString)),
1044 this, SLOT(change_adaptor()));
1045 connect(pdfSupportModule->bookmarksGB, SIGNAL(toggled(bool)),
1046 this, SLOT(change_adaptor()));
1047 connect(pdfSupportModule->bookmarksnumberedCB, SIGNAL(toggled(bool)),
1048 this, SLOT(change_adaptor()));
1049 connect(pdfSupportModule->bookmarksopenGB, SIGNAL(toggled(bool)),
1050 this, SLOT(change_adaptor()));
1051 connect(pdfSupportModule->bookmarksopenlevelSB, SIGNAL(valueChanged(int)),
1052 this, SLOT(change_adaptor()));
1053 connect(pdfSupportModule->breaklinksCB, SIGNAL(toggled(bool)),
1054 this, SLOT(change_adaptor()));
1055 connect(pdfSupportModule->pdfborderCB, SIGNAL(toggled(bool)),
1056 this, SLOT(change_adaptor()));
1057 connect(pdfSupportModule->colorlinksCB, SIGNAL(toggled(bool)),
1058 this, SLOT(change_adaptor()));
1059 connect(pdfSupportModule->backrefCO, SIGNAL(activated(int)),
1060 this, SLOT(change_adaptor()));
1061 connect(pdfSupportModule->pdfusetitleCB, SIGNAL(toggled(bool)),
1062 this, SLOT(change_adaptor()));
1063 connect(pdfSupportModule->fullscreenCB, SIGNAL(toggled(bool)),
1064 this, SLOT(change_adaptor()));
1065 connect(pdfSupportModule->optionsLE, SIGNAL(textChanged(QString)),
1066 this, SLOT(change_adaptor()));
1068 for (int i = 0; backref_opts[i][0]; ++i)
1069 pdfSupportModule->backrefCO->addItem(qt_(backref_opts_gui[i]));
1072 floatModule = new FloatPlacement;
1073 connect(floatModule, SIGNAL(changed()),
1074 this, SLOT(change_adaptor()));
1077 listingsModule = new UiWidget<Ui::ListingsSettingsUi>;
1078 connect(listingsModule->listingsED, SIGNAL(textChanged()),
1079 this, SLOT(change_adaptor()));
1080 connect(listingsModule->bypassCB, SIGNAL(clicked()),
1081 this, SLOT(change_adaptor()));
1082 connect(listingsModule->bypassCB, SIGNAL(clicked()),
1083 this, SLOT(setListingsMessage()));
1084 connect(listingsModule->listingsED, SIGNAL(textChanged()),
1085 this, SLOT(setListingsMessage()));
1086 listingsModule->listingsTB->setPlainText(
1087 qt_("Input listings parameters below. Enter ? for a list of parameters."));
1089 docPS->addPanel(latexModule, qt_("Document Class"));
1090 docPS->addPanel(masterChildModule, qt_("Child Documents"));
1091 docPS->addPanel(modulesModule, qt_("Modules"));
1092 docPS->addPanel(fontModule, qt_("Fonts"));
1093 docPS->addPanel(textLayoutModule, qt_("Text Layout"));
1094 docPS->addPanel(pageLayoutModule, qt_("Page Layout"));
1095 docPS->addPanel(marginsModule, qt_("Page Margins"));
1096 docPS->addPanel(langModule, qt_("Language"));
1097 docPS->addPanel(numberingModule, qt_("Numbering & TOC"));
1098 docPS->addPanel(biblioModule, qt_("Bibliography"));
1099 docPS->addPanel(indicesModule, qt_("Indexes"));
1100 docPS->addPanel(pdfSupportModule, qt_("PDF Properties"));
1101 docPS->addPanel(mathsModule, qt_("Math Options"));
1102 docPS->addPanel(floatModule, qt_("Float Placement"));
1103 docPS->addPanel(listingsModule, qt_("Listings"));
1104 docPS->addPanel(bulletsModule, qt_("Bullets"));
1105 docPS->addPanel(branchesModule, qt_("Branches"));
1106 docPS->addPanel(outputModule, qt_("Output"));
1107 docPS->addPanel(preambleModule, qt_("LaTeX Preamble"));
1108 docPS->setCurrentPanel(qt_("Document Class"));
1109 // FIXME: hack to work around resizing bug in Qt >= 4.2
1110 // bug verified with Qt 4.2.{0-3} (JSpitzm)
1111 #if QT_VERSION >= 0x040200
1112 docPS->updateGeometry();
1117 void GuiDocument::showPreamble()
1119 docPS->setCurrentPanel(qt_("LaTeX Preamble"));
1123 void GuiDocument::saveDefaultClicked()
1129 void GuiDocument::useDefaultsClicked()
1135 void GuiDocument::change_adaptor()
1141 void GuiDocument::includeonlyClicked(QTreeWidgetItem * item, int)
1146 string child = fromqstr(item->text(0));
1150 if (std::find(includeonlys_.begin(),
1151 includeonlys_.end(), child) != includeonlys_.end())
1152 includeonlys_.remove(child);
1154 includeonlys_.push_back(child);
1156 updateIncludeonlys();
1161 QString GuiDocument::validateListingsParameters()
1163 // use a cache here to avoid repeated validation
1164 // of the same parameters
1165 static string param_cache;
1166 static QString msg_cache;
1168 if (listingsModule->bypassCB->isChecked())
1171 string params = fromqstr(listingsModule->listingsED->toPlainText());
1172 if (params != param_cache) {
1173 param_cache = params;
1174 msg_cache = toqstr(InsetListingsParams(params).validate());
1180 void GuiDocument::setListingsMessage()
1182 static bool isOK = true;
1183 QString msg = validateListingsParameters();
1184 if (msg.isEmpty()) {
1188 // listingsTB->setTextColor("black");
1189 listingsModule->listingsTB->setPlainText(
1190 qt_("Input listings parameters below. "
1191 "Enter ? for a list of parameters."));
1194 // listingsTB->setTextColor("red");
1195 listingsModule->listingsTB->setPlainText(msg);
1200 void GuiDocument::setLSpacing(int item)
1202 textLayoutModule->lspacingLE->setEnabled(item == 3);
1206 void GuiDocument::setIndent(int item)
1208 bool const enable = (item == 1);
1209 textLayoutModule->indentLE->setEnabled(enable);
1210 textLayoutModule->indentLengthCO->setEnabled(enable);
1211 textLayoutModule->skipLE->setEnabled(false);
1212 textLayoutModule->skipLengthCO->setEnabled(false);
1217 void GuiDocument::enableIndent(bool indent)
1219 textLayoutModule->skipLE->setEnabled(!indent);
1220 textLayoutModule->skipLengthCO->setEnabled(!indent);
1222 setIndent(textLayoutModule->indentCO->currentIndex());
1226 void GuiDocument::setSkip(int item)
1228 bool const enable = (item == 3);
1229 textLayoutModule->skipLE->setEnabled(enable);
1230 textLayoutModule->skipLengthCO->setEnabled(enable);
1235 void GuiDocument::enableSkip(bool skip)
1237 textLayoutModule->indentLE->setEnabled(!skip);
1238 textLayoutModule->indentLengthCO->setEnabled(!skip);
1240 setSkip(textLayoutModule->skipCO->currentIndex());
1244 void GuiDocument::portraitChanged()
1246 setMargins(pageLayoutModule->papersizeCO->currentIndex());
1250 void GuiDocument::setMargins(bool custom)
1252 bool const extern_geometry =
1253 documentClass().provides("geometry");
1254 marginsModule->marginCB->setEnabled(!extern_geometry);
1255 if (extern_geometry) {
1256 marginsModule->marginCB->setChecked(false);
1257 setCustomMargins(true);
1260 marginsModule->marginCB->setChecked(custom);
1261 setCustomMargins(custom);
1265 void GuiDocument::papersizeChanged(int paper_size)
1267 setCustomPapersize(paper_size == 1);
1271 void GuiDocument::setCustomPapersize(bool custom)
1273 pageLayoutModule->paperwidthL->setEnabled(custom);
1274 pageLayoutModule->paperwidthLE->setEnabled(custom);
1275 pageLayoutModule->paperwidthUnitCO->setEnabled(custom);
1276 pageLayoutModule->paperheightL->setEnabled(custom);
1277 pageLayoutModule->paperheightLE->setEnabled(custom);
1278 pageLayoutModule->paperheightLE->setFocus();
1279 pageLayoutModule->paperheightUnitCO->setEnabled(custom);
1283 void GuiDocument::setColSep()
1285 setCustomMargins(marginsModule->marginCB->checkState() == Qt::Checked);
1289 void GuiDocument::setCustomMargins(bool custom)
1291 marginsModule->topL->setEnabled(!custom);
1292 marginsModule->topLE->setEnabled(!custom);
1293 marginsModule->topUnit->setEnabled(!custom);
1295 marginsModule->bottomL->setEnabled(!custom);
1296 marginsModule->bottomLE->setEnabled(!custom);
1297 marginsModule->bottomUnit->setEnabled(!custom);
1299 marginsModule->innerL->setEnabled(!custom);
1300 marginsModule->innerLE->setEnabled(!custom);
1301 marginsModule->innerUnit->setEnabled(!custom);
1303 marginsModule->outerL->setEnabled(!custom);
1304 marginsModule->outerLE->setEnabled(!custom);
1305 marginsModule->outerUnit->setEnabled(!custom);
1307 marginsModule->headheightL->setEnabled(!custom);
1308 marginsModule->headheightLE->setEnabled(!custom);
1309 marginsModule->headheightUnit->setEnabled(!custom);
1311 marginsModule->headsepL->setEnabled(!custom);
1312 marginsModule->headsepLE->setEnabled(!custom);
1313 marginsModule->headsepUnit->setEnabled(!custom);
1315 marginsModule->footskipL->setEnabled(!custom);
1316 marginsModule->footskipLE->setEnabled(!custom);
1317 marginsModule->footskipUnit->setEnabled(!custom);
1319 bool const enableColSep = !custom &&
1320 textLayoutModule->twoColumnCB->checkState() == Qt::Checked;
1321 marginsModule->columnsepL->setEnabled(enableColSep);
1322 marginsModule->columnsepLE->setEnabled(enableColSep);
1323 marginsModule->columnsepUnit->setEnabled(enableColSep);
1326 void GuiDocument::changeBackgroundColor()
1328 QColor const & newColor = QColorDialog::getColor(
1329 rgb2qcolor(set_backgroundcolor), asQWidget());
1330 if (!newColor.isValid())
1332 // set the button color
1333 pageLayoutModule->backgroundPB->setStyleSheet(
1334 colorButtonStyleSheet(newColor));
1336 set_backgroundcolor = rgbFromHexName(fromqstr(newColor.name()));
1341 void GuiDocument::deleteBackgroundColor()
1343 // set the button color back to white
1344 pageLayoutModule->backgroundPB->setStyleSheet(
1345 colorButtonStyleSheet(QColor(Qt::white)));
1346 // save white as the set color
1347 set_backgroundcolor = rgbFromHexName("#ffffff");
1352 void GuiDocument::xetexChanged(bool xetex)
1355 updateDefaultFormat();
1356 langModule->encodingCO->setEnabled(!xetex &&
1357 !langModule->defaultencodingRB->isChecked());
1358 langModule->defaultencodingRB->setEnabled(!xetex);
1359 langModule->otherencodingRB->setEnabled(!xetex);
1361 fontModule->fontsDefaultCO->setEnabled(!xetex);
1362 fontModule->fontsDefaultLA->setEnabled(!xetex);
1363 fontModule->cjkFontLE->setEnabled(!xetex);
1364 fontModule->cjkFontLA->setEnabled(!xetex);
1367 font = tex_fonts_sans[fontModule->fontsSansCO->currentIndex()];
1368 bool scaleable = providesScale(font);
1369 fontModule->scaleSansSB->setEnabled(scaleable);
1370 fontModule->scaleSansLA->setEnabled(scaleable);
1372 font = tex_fonts_monospaced[fontModule->fontsTypewriterCO->currentIndex()];
1373 scaleable = providesScale(font);
1374 fontModule->scaleTypewriterSB->setEnabled(scaleable);
1375 fontModule->scaleTypewriterLA->setEnabled(scaleable);
1377 font = tex_fonts_roman[fontModule->fontsRomanCO->currentIndex()];
1378 fontModule->fontScCB->setEnabled(providesSC(font));
1379 fontModule->fontOsfCB->setEnabled(providesOSF(font));
1381 fontModule->fontencLA->setEnabled(!xetex);
1382 fontModule->fontencCO->setEnabled(!xetex);
1383 fontModule->fontencLE->setEnabled(!xetex);
1387 void GuiDocument::updateFontsize(string const & items, string const & sel)
1389 fontModule->fontsizeCO->clear();
1390 fontModule->fontsizeCO->addItem(qt_("Default"));
1392 for (int n = 0; !token(items,'|',n).empty(); ++n)
1393 fontModule->fontsizeCO->
1394 addItem(toqstr(token(items,'|',n)));
1396 for (int n = 0; n < fontModule->fontsizeCO->count(); ++n) {
1397 if (fromqstr(fontModule->fontsizeCO->itemText(n)) == sel) {
1398 fontModule->fontsizeCO->setCurrentIndex(n);
1405 void GuiDocument::updateFontlist()
1407 fontModule->fontsRomanCO->clear();
1408 fontModule->fontsSansCO->clear();
1409 fontModule->fontsTypewriterCO->clear();
1411 // With XeTeX, we have access to all system fonts, but not the LaTeX fonts
1412 if (outputModule->xetexCB->isChecked()) {
1413 fontModule->fontsRomanCO->addItem(qt_("Default"));
1414 fontModule->fontsSansCO->addItem(qt_("Default"));
1415 fontModule->fontsTypewriterCO->addItem(qt_("Default"));
1417 QFontDatabase fontdb;
1418 QStringList families(fontdb.families());
1419 for (QStringList::Iterator it = families.begin(); it != families.end(); ++it) {
1420 fontModule->fontsRomanCO->addItem(*it);
1421 fontModule->fontsSansCO->addItem(*it);
1422 fontModule->fontsTypewriterCO->addItem(*it);
1427 for (int n = 0; tex_fonts_roman[n][0]; ++n) {
1428 QString font = qt_(tex_fonts_roman_gui[n]);
1429 if (!isFontAvailable(tex_fonts_roman[n]))
1430 font += qt_(" (not installed)");
1431 fontModule->fontsRomanCO->addItem(font);
1433 for (int n = 0; tex_fonts_sans[n][0]; ++n) {
1434 QString font = qt_(tex_fonts_sans_gui[n]);
1435 if (!isFontAvailable(tex_fonts_sans[n]))
1436 font += qt_(" (not installed)");
1437 fontModule->fontsSansCO->addItem(font);
1439 for (int n = 0; tex_fonts_monospaced[n][0]; ++n) {
1440 QString font = qt_(tex_fonts_monospaced_gui[n]);
1441 if (!isFontAvailable(tex_fonts_monospaced[n]))
1442 font += qt_(" (not installed)");
1443 fontModule->fontsTypewriterCO->addItem(font);
1448 void GuiDocument::fontencChanged(int item)
1450 fontModule->fontencLE->setEnabled(item == 1);
1454 void GuiDocument::romanChanged(int item)
1456 if (outputModule->xetexCB->isChecked())
1458 string const font = tex_fonts_roman[item];
1459 fontModule->fontScCB->setEnabled(providesSC(font));
1460 fontModule->fontOsfCB->setEnabled(providesOSF(font));
1464 void GuiDocument::sansChanged(int item)
1466 if (outputModule->xetexCB->isChecked())
1468 string const font = tex_fonts_sans[item];
1469 bool scaleable = providesScale(font);
1470 fontModule->scaleSansSB->setEnabled(scaleable);
1471 fontModule->scaleSansLA->setEnabled(scaleable);
1475 void GuiDocument::ttChanged(int item)
1477 if (outputModule->xetexCB->isChecked())
1479 string const font = tex_fonts_monospaced[item];
1480 bool scaleable = providesScale(font);
1481 fontModule->scaleTypewriterSB->setEnabled(scaleable);
1482 fontModule->scaleTypewriterLA->setEnabled(scaleable);
1486 void GuiDocument::updatePagestyle(string const & items, string const & sel)
1489 pageLayoutModule->pagestyleCO->clear();
1490 pageLayoutModule->pagestyleCO->addItem(qt_("Default"));
1492 for (int n = 0; !token(items, '|', n).empty(); ++n) {
1493 string style = token(items, '|', n);
1494 QString style_gui = qt_(style);
1495 pagestyles.push_back(pair<string, QString>(style, style_gui));
1496 pageLayoutModule->pagestyleCO->addItem(style_gui);
1499 if (sel == "default") {
1500 pageLayoutModule->pagestyleCO->setCurrentIndex(0);
1506 for (size_t i = 0; i < pagestyles.size(); ++i)
1507 if (pagestyles[i].first == sel)
1508 nn = pageLayoutModule->pagestyleCO->findText(pagestyles[i].second);
1511 pageLayoutModule->pagestyleCO->setCurrentIndex(nn);
1515 void GuiDocument::browseLayout()
1517 QString const label1 = qt_("Layouts|#o#O");
1518 QString const dir1 = toqstr(lyxrc.document_path);
1519 QStringList const filter(qt_("LyX Layout (*.layout)"));
1520 QString file = browseRelFile(QString(), bufferFilepath(),
1521 qt_("Local layout file"), filter, false,
1524 if (!file.endsWith(".layout"))
1527 FileName layoutFile = support::makeAbsPath(fromqstr(file),
1528 fromqstr(bufferFilepath()));
1530 int const ret = Alert::prompt(_("Local layout file"),
1531 _("The layout file you have selected is a local layout\n"
1532 "file, not one in the system or user directory. Your\n"
1533 "document may not work with this layout if you do not\n"
1534 "keep the layout file in the document directory."),
1535 1, 1, _("&Set Layout"), _("&Cancel"));
1539 // load the layout file
1540 LayoutFileList & bcl = LayoutFileList::get();
1541 string classname = layoutFile.onlyFileName();
1542 // this will update an existing layout if that layout has been loaded before.
1543 LayoutFileIndex name = bcl.addLocalLayout(
1544 classname.substr(0, classname.size() - 7),
1545 layoutFile.onlyPath().absFilename());
1548 Alert::error(_("Error"),
1549 _("Unable to read local layout file."));
1553 // do not trigger classChanged if there is no change.
1554 if (latexModule->classCO->currentText() == toqstr(name))
1558 int idx = latexModule->classCO->findText(toqstr(name));
1560 classes_model_.insertRow(0, toqstr(name), name);
1561 latexModule->classCO->setCurrentIndex(0);
1563 latexModule->classCO->setCurrentIndex(idx);
1569 void GuiDocument::browseMaster()
1571 QString const title = qt_("Select master document");
1572 QString const dir1 = toqstr(lyxrc.document_path);
1573 QString const old = latexModule->childDocLE->text();
1574 QString const docpath = toqstr(support::onlyPath(buffer().absFileName()));
1575 QStringList const filter(qt_("LyX Files (*.lyx)"));
1576 QString file = browseRelFile(old, docpath, title, filter, false,
1577 qt_("Documents|#o#O"), toqstr(lyxrc.document_path));
1579 if (!file.isEmpty())
1580 latexModule->childDocLE->setText(file);
1584 void GuiDocument::classChanged()
1586 int idx = latexModule->classCO->currentIndex();
1589 string const classname = classes_model_.getIDString(idx);
1591 // check whether the selected modules have changed.
1592 bool modules_changed = false;
1593 unsigned int const srows = selectedModel()->rowCount();
1594 if (srows != bp_.getModules().size())
1595 modules_changed = true;
1597 list<string>::const_iterator mit = bp_.getModules().begin();
1598 list<string>::const_iterator men = bp_.getModules().end();
1599 for (unsigned int i = 0; i < srows && mit != men; ++i, ++mit)
1600 if (selectedModel()->getIDString(i) != *mit) {
1601 modules_changed = true;
1606 if (modules_changed || lyxrc.auto_reset_options) {
1607 if (applyPB->isEnabled()) {
1608 int const ret = Alert::prompt(_("Unapplied changes"),
1609 _("Some changes in the dialog were not yet applied.\n"
1610 "If you do not apply now, they will be lost after this action."),
1611 1, 1, _("&Apply"), _("&Dismiss"));
1617 // We load the TextClass as soon as it is selected. This is
1618 // necessary so that other options in the dialog can be updated
1619 // according to the new class. Note, however, that, if you use
1620 // the scroll wheel when sitting on the combo box, we'll load a
1621 // lot of TextClass objects very quickly....
1622 if (!bp_.setBaseClass(classname)) {
1623 Alert::error(_("Error"), _("Unable to set document class."));
1626 if (lyxrc.auto_reset_options)
1627 bp_.useClassDefaults();
1629 // With the introduction of modules came a distinction between the base
1630 // class and the document class. The former corresponds to the main layout
1631 // file; the latter is that plus the modules (or the document-specific layout,
1632 // or whatever else there could be). Our parameters come from the document
1633 // class. So when we set the base class, we also need to recreate the document
1634 // class. Otherwise, we still have the old one.
1635 bp_.makeDocumentClass();
1640 void GuiDocument::bibtexChanged(int n)
1642 biblioModule->bibtexOptionsED->setEnabled(n != 0);
1648 // This is an insanely complicated attempt to make this sort of thing
1649 // work with RTL languages.
1650 docstring formatStrVec(vector<string> const & v, docstring const & s)
1652 //this mess formats the list as "v[0], v[1], ..., [s] v[n]"
1656 return from_utf8(v[0]);
1657 if (v.size() == 2) {
1658 docstring retval = _("%1$s and %2$s");
1659 retval = subst(retval, _("and"), s);
1660 return bformat(retval, from_utf8(v[0]), from_utf8(v[1]));
1662 // The idea here is to format all but the last two items...
1663 int const vSize = v.size();
1664 docstring t2 = _("%1$s, %2$s");
1665 docstring retval = from_utf8(v[0]);
1666 for (int i = 1; i < vSize - 2; ++i)
1667 retval = bformat(t2, retval, from_utf8(v[i]));
1668 //...and then to plug them, and the last two, into this schema
1669 docstring t = _("%1$s, %2$s, and %3$s");
1670 t = subst(t, _("and"), s);
1671 return bformat(t, retval, from_utf8(v[vSize - 2]), from_utf8(v[vSize - 1]));
1674 vector<string> idsToNames(vector<string> const & idList)
1676 vector<string> retval;
1677 vector<string>::const_iterator it = idList.begin();
1678 vector<string>::const_iterator end = idList.end();
1679 for (; it != end; ++it) {
1680 LyXModule const * const mod = theModuleList[*it];
1682 retval.push_back(*it + " (Unavailable)");
1684 retval.push_back(mod->getName());
1691 void GuiDocument::modulesToParams(BufferParams & bp)
1693 // update list of loaded modules
1694 bp.clearLayoutModules();
1695 int const srows = modules_sel_model_.rowCount();
1696 for (int i = 0; i < srows; ++i)
1697 bp.addLayoutModule(modules_sel_model_.getIDString(i));
1699 // update the list of removed modules
1700 bp.clearRemovedModules();
1701 LayoutModuleList const & reqmods = bp.baseClass()->defaultModules();
1702 list<string>::const_iterator rit = reqmods.begin();
1703 list<string>::const_iterator ren = reqmods.end();
1705 // check each of the default modules
1706 for (; rit != ren; rit++) {
1707 list<string>::const_iterator mit = bp.getModules().begin();
1708 list<string>::const_iterator men = bp.getModules().end();
1710 for (; mit != men; mit++) {
1717 // the module isn't present so must have been removed by the user
1718 bp.addRemovedModule(*rit);
1723 void GuiDocument::modulesChanged()
1725 modulesToParams(bp_);
1726 bp_.makeDocumentClass();
1731 void GuiDocument::updateModuleInfo()
1733 selectionManager->update();
1735 //Module description
1736 bool const focus_on_selected = selectionManager->selectedFocused();
1737 QAbstractItemView * lv;
1738 if (focus_on_selected)
1739 lv = modulesModule->selectedLV;
1741 lv= modulesModule->availableLV;
1742 if (lv->selectionModel()->selectedIndexes().isEmpty()) {
1743 modulesModule->infoML->document()->clear();
1746 QModelIndex const & idx = lv->selectionModel()->currentIndex();
1747 GuiIdListModel const & id_model =
1748 focus_on_selected ? modules_sel_model_ : modules_av_model_;
1749 string const modName = id_model.getIDString(idx.row());
1750 docstring desc = getModuleDescription(modName);
1752 LayoutModuleList const & provmods = bp_.baseClass()->providedModules();
1753 if (std::find(provmods.begin(), provmods.end(), modName) != provmods.end()) {
1756 desc += _("Module provided by document class.");
1759 vector<string> pkglist = getPackageList(modName);
1760 docstring pkgdesc = formatStrVec(pkglist, _("and"));
1761 if (!pkgdesc.empty()) {
1764 desc += bformat(_("Package(s) required: %1$s."), pkgdesc);
1767 pkglist = getRequiredList(modName);
1768 if (!pkglist.empty()) {
1769 vector<string> const reqdescs = idsToNames(pkglist);
1770 pkgdesc = formatStrVec(reqdescs, _("or"));
1773 desc += bformat(_("Module required: %1$s."), pkgdesc);
1776 pkglist = getExcludedList(modName);
1777 if (!pkglist.empty()) {
1778 vector<string> const reqdescs = idsToNames(pkglist);
1779 pkgdesc = formatStrVec(reqdescs, _( "and"));
1782 desc += bformat(_("Modules excluded: %1$s."), pkgdesc);
1785 if (!isModuleAvailable(modName)) {
1788 desc += _("WARNING: Some required packages are unavailable!");
1791 modulesModule->infoML->document()->setPlainText(toqstr(desc));
1795 void GuiDocument::updateNumbering()
1797 DocumentClass const & tclass = documentClass();
1799 numberingModule->tocTW->setUpdatesEnabled(false);
1800 numberingModule->tocTW->clear();
1802 int const depth = numberingModule->depthSL->value();
1803 int const toc = numberingModule->tocSL->value();
1804 QString const no = qt_("No");
1805 QString const yes = qt_("Yes");
1806 QTreeWidgetItem * item = 0;
1808 DocumentClass::const_iterator lit = tclass.begin();
1809 DocumentClass::const_iterator len = tclass.end();
1810 for (; lit != len; ++lit) {
1811 int const toclevel = lit->toclevel;
1812 if (toclevel != Layout::NOT_IN_TOC && lit->labeltype == LABEL_COUNTER) {
1813 item = new QTreeWidgetItem(numberingModule->tocTW);
1814 item->setText(0, toqstr(translateIfPossible(lit->name())));
1815 item->setText(1, (toclevel <= depth) ? yes : no);
1816 item->setText(2, (toclevel <= toc) ? yes : no);
1820 numberingModule->tocTW->setUpdatesEnabled(true);
1821 numberingModule->tocTW->update();
1825 void GuiDocument::updateDefaultFormat()
1829 // make a copy in order to consider unapplied changes
1830 Buffer * tmpbuf = const_cast<Buffer *>(&buffer());
1831 tmpbuf->params().useXetex = outputModule->xetexCB->isChecked();
1832 int idx = latexModule->classCO->currentIndex();
1834 string const classname = classes_model_.getIDString(idx);
1835 tmpbuf->params().setBaseClass(classname);
1836 tmpbuf->params().makeDocumentClass();
1838 outputModule->defaultFormatCO->blockSignals(true);
1839 outputModule->defaultFormatCO->clear();
1840 outputModule->defaultFormatCO->addItem(qt_("Default"),
1841 QVariant(QString("default")));
1842 typedef vector<Format const *> Formats;
1843 Formats formats = tmpbuf->exportableFormats(true);
1844 Formats::const_iterator cit = formats.begin();
1845 Formats::const_iterator end = formats.end();
1846 for (; cit != end; ++cit)
1847 outputModule->defaultFormatCO->addItem(qt_((*cit)->prettyname()),
1848 QVariant(toqstr((*cit)->name())));
1849 outputModule->defaultFormatCO->blockSignals(false);
1853 bool GuiDocument::isChildIncluded(string const & child)
1855 if (includeonlys_.empty())
1857 return (std::find(includeonlys_.begin(),
1858 includeonlys_.end(), child) != includeonlys_.end());
1862 void GuiDocument::applyView()
1865 preambleModule->apply(bp_);
1868 bp_.suppress_date = latexModule->suppressDateCB->isChecked();
1871 bp_.setCiteEngine(ENGINE_BASIC);
1873 if (biblioModule->citeNatbibRB->isChecked()) {
1874 bool const use_numerical_citations =
1875 biblioModule->citeStyleCO->currentIndex();
1876 if (use_numerical_citations)
1877 bp_.setCiteEngine(ENGINE_NATBIB_NUMERICAL);
1879 bp_.setCiteEngine(ENGINE_NATBIB_AUTHORYEAR);
1881 } else if (biblioModule->citeJurabibRB->isChecked())
1882 bp_.setCiteEngine(ENGINE_JURABIB);
1885 biblioModule->bibtopicCB->isChecked();
1887 string const bibtex_command =
1888 fromqstr(biblioModule->bibtexCO->itemData(
1889 biblioModule->bibtexCO->currentIndex()).toString());
1890 string const bibtex_options =
1891 fromqstr(biblioModule->bibtexOptionsED->text());
1892 if (bibtex_command == "default" || bibtex_options.empty())
1893 bp_.bibtex_command = bibtex_command;
1895 bp_.bibtex_command = bibtex_command + " " + bibtex_options;
1898 indicesModule->apply(bp_);
1900 // language & quotes
1901 if (langModule->defaultencodingRB->isChecked()) {
1902 bp_.inputenc = "auto";
1904 int i = langModule->encodingCO->currentIndex();
1906 bp_.inputenc = "default";
1908 QString const enc_gui =
1909 langModule->encodingCO->currentText();
1910 Encodings::const_iterator it = encodings.begin();
1911 Encodings::const_iterator const end = encodings.end();
1913 for (; it != end; ++it) {
1914 if (qt_(it->guiName()) == enc_gui) {
1915 bp_.inputenc = it->latexName();
1921 // should not happen
1922 lyxerr << "GuiDocument::apply: Unknown encoding! Resetting to default" << endl;
1923 bp_.inputenc = "default";
1928 InsetQuotes::QuoteLanguage lga = InsetQuotes::EnglishQuotes;
1929 switch (langModule->quoteStyleCO->currentIndex()) {
1931 lga = InsetQuotes::EnglishQuotes;
1934 lga = InsetQuotes::SwedishQuotes;
1937 lga = InsetQuotes::GermanQuotes;
1940 lga = InsetQuotes::PolishQuotes;
1943 lga = InsetQuotes::FrenchQuotes;
1946 lga = InsetQuotes::DanishQuotes;
1949 bp_.quotes_language = lga;
1951 QString const lang = langModule->languageCO->itemData(
1952 langModule->languageCO->currentIndex()).toString();
1953 bp_.language = lyx::languages.getLanguage(fromqstr(lang));
1956 if (bp_.documentClass().hasTocLevels()) {
1957 bp_.tocdepth = numberingModule->tocSL->value();
1958 bp_.secnumdepth = numberingModule->depthSL->value();
1962 bp_.user_defined_bullet(0) = bulletsModule->bullet(0);
1963 bp_.user_defined_bullet(1) = bulletsModule->bullet(1);
1964 bp_.user_defined_bullet(2) = bulletsModule->bullet(2);
1965 bp_.user_defined_bullet(3) = bulletsModule->bullet(3);
1968 bp_.graphicsDriver =
1969 tex_graphics[latexModule->psdriverCO->currentIndex()];
1972 int idx = latexModule->classCO->currentIndex();
1974 string const classname = classes_model_.getIDString(idx);
1975 bp_.setBaseClass(classname);
1979 modulesToParams(bp_);
1982 if (mathsModule->amsautoCB->isChecked()) {
1983 bp_.use_amsmath = BufferParams::package_auto;
1985 if (mathsModule->amsCB->isChecked())
1986 bp_.use_amsmath = BufferParams::package_on;
1988 bp_.use_amsmath = BufferParams::package_off;
1990 if (mathsModule->esintautoCB->isChecked())
1991 bp_.use_esint = BufferParams::package_auto;
1993 if (mathsModule->esintCB->isChecked())
1994 bp_.use_esint = BufferParams::package_on;
1996 bp_.use_esint = BufferParams::package_off;
1998 if (mathsModule->mhchemautoCB->isChecked())
1999 bp_.use_mhchem = BufferParams::package_auto;
2001 if (mathsModule->mhchemCB->isChecked())
2002 bp_.use_mhchem = BufferParams::package_on;
2004 bp_.use_mhchem = BufferParams::package_off;
2008 if (pageLayoutModule->pagestyleCO->currentIndex() == 0)
2009 bp_.pagestyle = "default";
2011 QString style_gui = pageLayoutModule->pagestyleCO->currentText();
2012 for (size_t i = 0; i != pagestyles.size(); ++i)
2013 if (pagestyles[i].second == style_gui)
2014 bp_.pagestyle = pagestyles[i].first;
2018 switch (textLayoutModule->lspacingCO->currentIndex()) {
2020 bp_.spacing().set(Spacing::Single);
2023 bp_.spacing().set(Spacing::Onehalf);
2026 bp_.spacing().set(Spacing::Double);
2029 bp_.spacing().set(Spacing::Other,
2030 widgetToDoubleStr(textLayoutModule->lspacingLE));
2034 if (textLayoutModule->twoColumnCB->isChecked())
2039 if (textLayoutModule->indentRB->isChecked()) {
2040 // if paragraphs are separated by an indentation
2041 bp_.paragraph_separation = BufferParams::ParagraphIndentSeparation;
2042 switch (textLayoutModule->indentCO->currentIndex()) {
2044 bp_.setIndentation(HSpace(HSpace::DEFAULT));
2047 HSpace indent = HSpace(
2048 widgetsToLength(textLayoutModule->indentLE,
2049 textLayoutModule->indentLengthCO)
2051 bp_.setIndentation(indent);
2055 // this should never happen
2056 bp_.setIndentation(HSpace(HSpace::DEFAULT));
2060 // if paragraphs are separated by a skip
2061 bp_.paragraph_separation = BufferParams::ParagraphSkipSeparation;
2062 switch (textLayoutModule->skipCO->currentIndex()) {
2064 bp_.setDefSkip(VSpace(VSpace::SMALLSKIP));
2067 bp_.setDefSkip(VSpace(VSpace::MEDSKIP));
2070 bp_.setDefSkip(VSpace(VSpace::BIGSKIP));
2075 widgetsToLength(textLayoutModule->skipLE,
2076 textLayoutModule->skipLengthCO)
2082 // this should never happen
2083 bp_.setDefSkip(VSpace(VSpace::MEDSKIP));
2089 fromqstr(latexModule->optionsLE->text());
2091 bp_.use_default_options =
2092 latexModule->defaultOptionsCB->isChecked();
2094 if (latexModule->childDocGB->isChecked())
2096 fromqstr(latexModule->childDocLE->text());
2098 bp_.master = string();
2101 bp_.clearIncludedChildren();
2102 if (masterChildModule->includeonlyRB->isChecked()) {
2103 list<string>::const_iterator it = includeonlys_.begin();
2104 for (; it != includeonlys_.end() ; ++it) {
2105 bp_.addIncludedChildren(*it);
2108 bp_.maintain_unincluded_children =
2109 masterChildModule->maintainAuxCB->isChecked();
2112 bp_.float_placement = floatModule->get();
2115 // text should have passed validation
2116 bp_.listings_params =
2117 InsetListingsParams(fromqstr(listingsModule->listingsED->toPlainText())).params();
2120 bp_.defaultOutputFormat = fromqstr(outputModule->defaultFormatCO->itemData(
2121 outputModule->defaultFormatCO->currentIndex()).toString());
2123 bool const xetex = outputModule->xetexCB->isChecked();
2124 bp_.useXetex = xetex;
2128 if (fontModule->fontsRomanCO->currentIndex() == 0)
2129 bp_.fontsRoman = "default";
2132 fromqstr(fontModule->fontsRomanCO->currentText());
2134 if (fontModule->fontsSansCO->currentIndex() == 0)
2135 bp_.fontsSans = "default";
2138 fromqstr(fontModule->fontsSansCO->currentText());
2140 if (fontModule->fontsTypewriterCO->currentIndex() == 0)
2141 bp_.fontsTypewriter = "default";
2143 bp_.fontsTypewriter =
2144 fromqstr(fontModule->fontsTypewriterCO->currentText());
2147 tex_fonts_roman[fontModule->fontsRomanCO->currentIndex()];
2150 tex_fonts_sans[fontModule->fontsSansCO->currentIndex()];
2152 bp_.fontsTypewriter =
2153 tex_fonts_monospaced[fontModule->fontsTypewriterCO->currentIndex()];
2156 if (fontModule->fontencCO->currentIndex() == 0)
2157 bp_.fontenc = "global";
2158 else if (fontModule->fontencCO->currentIndex() == 1)
2159 bp_.fontenc = fromqstr(fontModule->fontencLE->text());
2160 else if (fontModule->fontencCO->currentIndex() == 2)
2161 bp_.fontenc = "default";
2164 fromqstr(fontModule->cjkFontLE->text());
2166 bp_.fontsSansScale = fontModule->scaleSansSB->value();
2168 bp_.fontsTypewriterScale = fontModule->scaleTypewriterSB->value();
2170 bp_.fontsSC = fontModule->fontScCB->isChecked();
2172 bp_.fontsOSF = fontModule->fontOsfCB->isChecked();
2175 bp_.fontsDefaultFamily = "default";
2177 bp_.fontsDefaultFamily = GuiDocument::fontfamilies[
2178 fontModule->fontsDefaultCO->currentIndex()];
2180 if (fontModule->fontsizeCO->currentIndex() == 0)
2181 bp_.fontsize = "default";
2184 fromqstr(fontModule->fontsizeCO->currentText());
2187 bp_.papersize = PAPER_SIZE(
2188 pageLayoutModule->papersizeCO->currentIndex());
2190 // custom, A3, B3 and B4 paper sizes need geometry
2191 int psize = pageLayoutModule->papersizeCO->currentIndex();
2192 bool geom_papersize = (psize == 1 || psize == 5 || psize == 8 || psize == 9);
2194 bp_.paperwidth = widgetsToLength(pageLayoutModule->paperwidthLE,
2195 pageLayoutModule->paperwidthUnitCO);
2197 bp_.paperheight = widgetsToLength(pageLayoutModule->paperheightLE,
2198 pageLayoutModule->paperheightUnitCO);
2200 if (pageLayoutModule->facingPagesCB->isChecked())
2201 bp_.sides = TwoSides;
2203 bp_.sides = OneSide;
2205 if (pageLayoutModule->landscapeRB->isChecked())
2206 bp_.orientation = ORIENTATION_LANDSCAPE;
2208 bp_.orientation = ORIENTATION_PORTRAIT;
2210 bp_.backgroundcolor = set_backgroundcolor;
2213 bp_.use_geometry = !marginsModule->marginCB->isChecked()
2216 Ui::MarginsUi const * m = marginsModule;
2218 bp_.leftmargin = widgetsToLength(m->innerLE, m->innerUnit);
2219 bp_.topmargin = widgetsToLength(m->topLE, m->topUnit);
2220 bp_.rightmargin = widgetsToLength(m->outerLE, m->outerUnit);
2221 bp_.bottommargin = widgetsToLength(m->bottomLE, m->bottomUnit);
2222 bp_.headheight = widgetsToLength(m->headheightLE, m->headheightUnit);
2223 bp_.headsep = widgetsToLength(m->headsepLE, m->headsepUnit);
2224 bp_.footskip = widgetsToLength(m->footskipLE, m->footskipUnit);
2225 bp_.columnsep = widgetsToLength(m->columnsepLE, m->columnsepUnit);
2228 branchesModule->apply(bp_);
2231 PDFOptions & pdf = bp_.pdfoptions();
2232 pdf.use_hyperref = pdfSupportModule->use_hyperrefGB->isChecked();
2233 pdf.title = fromqstr(pdfSupportModule->titleLE->text());
2234 pdf.author = fromqstr(pdfSupportModule->authorLE->text());
2235 pdf.subject = fromqstr(pdfSupportModule->subjectLE->text());
2236 pdf.keywords = fromqstr(pdfSupportModule->keywordsLE->text());
2238 pdf.bookmarks = pdfSupportModule->bookmarksGB->isChecked();
2239 pdf.bookmarksnumbered = pdfSupportModule->bookmarksnumberedCB->isChecked();
2240 pdf.bookmarksopen = pdfSupportModule->bookmarksopenGB->isChecked();
2241 pdf.bookmarksopenlevel = pdfSupportModule->bookmarksopenlevelSB->value();
2243 pdf.breaklinks = pdfSupportModule->breaklinksCB->isChecked();
2244 pdf.pdfborder = pdfSupportModule->pdfborderCB->isChecked();
2245 pdf.pdfusetitle = pdfSupportModule->pdfusetitleCB->isChecked();
2246 pdf.colorlinks = pdfSupportModule->colorlinksCB->isChecked();
2248 backref_opts[pdfSupportModule->backrefCO->currentIndex()];
2249 if (pdfSupportModule->fullscreenCB->isChecked())
2250 pdf.pagemode = pdf.pagemode_fullscreen;
2252 pdf.pagemode.clear();
2253 pdf.quoted_options = pdf.quoted_options_check(
2254 fromqstr(pdfSupportModule->optionsLE->text()));
2258 void GuiDocument::paramsToDialog()
2260 // set the default unit
2261 Length::UNIT const defaultUnit = Length::defaultUnit();
2264 preambleModule->update(bp_, id());
2267 latexModule->suppressDateCB->setChecked(bp_.suppress_date);
2270 biblioModule->citeDefaultRB->setChecked(
2271 bp_.citeEngine() == ENGINE_BASIC);
2273 biblioModule->citeNatbibRB->setChecked(
2274 bp_.citeEngine() == ENGINE_NATBIB_NUMERICAL ||
2275 bp_.citeEngine() == ENGINE_NATBIB_AUTHORYEAR);
2277 biblioModule->citeStyleCO->setCurrentIndex(
2278 bp_.citeEngine() == ENGINE_NATBIB_NUMERICAL);
2280 biblioModule->citeJurabibRB->setChecked(
2281 bp_.citeEngine() == ENGINE_JURABIB);
2283 biblioModule->bibtopicCB->setChecked(
2288 split(bp_.bibtex_command, command, ' ');
2290 int const bpos = biblioModule->bibtexCO->findData(toqstr(command));
2292 biblioModule->bibtexCO->setCurrentIndex(bpos);
2293 biblioModule->bibtexOptionsED->setText(toqstr(options).trimmed());
2295 biblioModule->bibtexCO->setCurrentIndex(0);
2296 biblioModule->bibtexOptionsED->clear();
2298 biblioModule->bibtexOptionsED->setEnabled(
2299 biblioModule->bibtexCO->currentIndex() != 0);
2302 indicesModule->update(bp_);
2304 // language & quotes
2305 int const pos = langModule->languageCO->findData(toqstr(
2306 bp_.language->lang()));
2307 langModule->languageCO->setCurrentIndex(pos);
2309 langModule->quoteStyleCO->setCurrentIndex(
2310 bp_.quotes_language);
2312 bool default_enc = true;
2313 if (bp_.inputenc != "auto") {
2314 default_enc = false;
2315 if (bp_.inputenc == "default") {
2316 langModule->encodingCO->setCurrentIndex(0);
2319 Encodings::const_iterator it = encodings.begin();
2320 Encodings::const_iterator const end = encodings.end();
2321 for (; it != end; ++it) {
2322 if (it->latexName() == bp_.inputenc) {
2323 enc_gui = it->guiName();
2327 int const i = langModule->encodingCO->findText(
2330 langModule->encodingCO->setCurrentIndex(i);
2332 // unknown encoding. Set to default.
2336 langModule->defaultencodingRB->setChecked(default_enc);
2337 langModule->otherencodingRB->setChecked(!default_enc);
2340 int const min_toclevel = documentClass().min_toclevel();
2341 int const max_toclevel = documentClass().max_toclevel();
2342 if (documentClass().hasTocLevels()) {
2343 numberingModule->setEnabled(true);
2344 numberingModule->depthSL->setMinimum(min_toclevel - 1);
2345 numberingModule->depthSL->setMaximum(max_toclevel);
2346 numberingModule->depthSL->setValue(bp_.secnumdepth);
2347 numberingModule->tocSL->setMaximum(min_toclevel - 1);
2348 numberingModule->tocSL->setMaximum(max_toclevel);
2349 numberingModule->tocSL->setValue(bp_.tocdepth);
2352 numberingModule->setEnabled(false);
2353 numberingModule->tocTW->clear();
2357 bulletsModule->setBullet(0, bp_.user_defined_bullet(0));
2358 bulletsModule->setBullet(1, bp_.user_defined_bullet(1));
2359 bulletsModule->setBullet(2, bp_.user_defined_bullet(2));
2360 bulletsModule->setBullet(3, bp_.user_defined_bullet(3));
2361 bulletsModule->init();
2364 int nitem = findToken(tex_graphics, bp_.graphicsDriver);
2366 latexModule->psdriverCO->setCurrentIndex(nitem);
2369 mathsModule->amsCB->setChecked(
2370 bp_.use_amsmath == BufferParams::package_on);
2371 mathsModule->amsautoCB->setChecked(
2372 bp_.use_amsmath == BufferParams::package_auto);
2374 mathsModule->esintCB->setChecked(
2375 bp_.use_esint == BufferParams::package_on);
2376 mathsModule->esintautoCB->setChecked(
2377 bp_.use_esint == BufferParams::package_auto);
2379 mathsModule->mhchemCB->setChecked(
2380 bp_.use_mhchem == BufferParams::package_on);
2381 mathsModule->mhchemautoCB->setChecked(
2382 bp_.use_mhchem == BufferParams::package_auto);
2384 switch (bp_.spacing().getSpace()) {
2385 case Spacing::Other: nitem = 3; break;
2386 case Spacing::Double: nitem = 2; break;
2387 case Spacing::Onehalf: nitem = 1; break;
2388 case Spacing::Default: case Spacing::Single: nitem = 0; break;
2392 string const & layoutID = bp_.baseClassID();
2393 setLayoutComboByIDString(layoutID);
2395 updatePagestyle(documentClass().opt_pagestyle(),
2398 textLayoutModule->lspacingCO->setCurrentIndex(nitem);
2399 if (bp_.spacing().getSpace() == Spacing::Other) {
2400 doubleToWidget(textLayoutModule->lspacingLE,
2401 bp_.spacing().getValueAsString());
2405 if (bp_.paragraph_separation == BufferParams::ParagraphIndentSeparation) {
2406 textLayoutModule->indentRB->setChecked(true);
2407 string indentation = bp_.getIndentation().asLyXCommand();
2409 if (indentation != "default") {
2410 lengthToWidgets(textLayoutModule->indentLE,
2411 textLayoutModule->indentLengthCO,
2412 indentation, defaultUnit);
2415 textLayoutModule->indentCO->setCurrentIndex(indent);
2418 textLayoutModule->skipRB->setChecked(true);
2420 switch (bp_.getDefSkip().kind()) {
2421 case VSpace::SMALLSKIP:
2424 case VSpace::MEDSKIP:
2427 case VSpace::BIGSKIP:
2430 case VSpace::LENGTH:
2433 string const length = bp_.getDefSkip().asLyXCommand();
2434 lengthToWidgets(textLayoutModule->skipLE,
2435 textLayoutModule->skipLengthCO,
2436 length, defaultUnit);
2443 textLayoutModule->skipCO->setCurrentIndex(skip);
2447 textLayoutModule->twoColumnCB->setChecked(
2450 if (!bp_.options.empty()) {
2451 latexModule->optionsLE->setText(
2452 toqstr(bp_.options));
2454 latexModule->optionsLE->setText(QString());
2458 latexModule->defaultOptionsCB->setChecked(
2459 bp_.use_default_options);
2460 updateSelectedModules();
2461 selectionManager->updateProvidedModules(
2462 bp_.baseClass()->providedModules());
2463 selectionManager->updateExcludedModules(
2464 bp_.baseClass()->excludedModules());
2466 if (!documentClass().options().empty()) {
2467 latexModule->defaultOptionsLE->setText(
2468 toqstr(documentClass().options()));
2470 latexModule->defaultOptionsLE->setText(
2471 toqstr(_("[No options predefined]")));
2474 latexModule->defaultOptionsLE->setEnabled(
2475 bp_.use_default_options
2476 && !documentClass().options().empty());
2478 latexModule->defaultOptionsCB->setEnabled(
2479 !documentClass().options().empty());
2481 if (!bp_.master.empty()) {
2482 latexModule->childDocGB->setChecked(true);
2483 latexModule->childDocLE->setText(
2484 toqstr(bp_.master));
2486 latexModule->childDocLE->setText(QString());
2487 latexModule->childDocGB->setChecked(false);
2491 std::vector<Buffer *> children;
2493 children = buffer().getChildren(false);
2494 if (children.empty()) {
2495 masterChildModule->childrenTW->clear();
2496 includeonlys_.clear();
2497 docPS->showPanel(qt_("Child Documents"), false);
2498 if (docPS->isCurrentPanel(qt_("Child Documents")))
2499 docPS->setCurrentPanel(qt_("Document Class"));
2501 docPS->showPanel(qt_("Child Documents"), true);
2502 masterChildModule->setEnabled(true);
2503 includeonlys_ = bp_.getIncludedChildren();
2504 updateIncludeonlys();
2506 masterChildModule->maintainAuxCB->setChecked(
2507 bp_.maintain_unincluded_children);
2510 floatModule->set(bp_.float_placement);
2513 // break listings_params to multiple lines
2515 InsetListingsParams(bp_.listings_params).separatedParams();
2516 listingsModule->listingsED->setPlainText(toqstr(lstparams));
2519 // update combobox with formats
2520 updateDefaultFormat();
2521 int index = outputModule->defaultFormatCO->findData(toqstr(
2522 bp_.defaultOutputFormat));
2523 // set to default if format is not found
2526 outputModule->defaultFormatCO->setCurrentIndex(index);
2527 outputModule->xetexCB->setEnabled(bp_.baseClass()->outputType() == lyx::LATEX);
2528 outputModule->xetexCB->setChecked(
2529 bp_.baseClass()->outputType() == lyx::LATEX && bp_.useXetex);
2532 updateFontsize(documentClass().opt_fontsize(),
2536 fontModule->fontencLA->setEnabled(false);
2537 fontModule->fontencCO->setEnabled(false);
2538 fontModule->fontencLE->setEnabled(false);
2539 for (int i = 0; i < fontModule->fontsRomanCO->count(); ++i) {
2540 if (fontModule->fontsRomanCO->itemText(i) == toqstr(bp_.fontsRoman)) {
2541 fontModule->fontsRomanCO->setCurrentIndex(i);
2546 for (int i = 0; i < fontModule->fontsSansCO->count(); ++i) {
2547 if (fontModule->fontsSansCO->itemText(i) == toqstr(bp_.fontsSans)) {
2548 fontModule->fontsSansCO->setCurrentIndex(i);
2552 for (int i = 0; i < fontModule->fontsTypewriterCO->count(); ++i) {
2553 if (fontModule->fontsTypewriterCO->itemText(i) ==
2554 toqstr(bp_.fontsTypewriter)) {
2555 fontModule->fontsTypewriterCO->setCurrentIndex(i);
2560 fontModule->fontencLA->setEnabled(true);
2561 fontModule->fontencCO->setEnabled(true);
2562 fontModule->fontencLE->setEnabled(true);
2563 int n = findToken(tex_fonts_roman, bp_.fontsRoman);
2565 fontModule->fontsRomanCO->setCurrentIndex(n);
2569 n = findToken(tex_fonts_sans, bp_.fontsSans);
2571 fontModule->fontsSansCO->setCurrentIndex(n);
2575 n = findToken(tex_fonts_monospaced, bp_.fontsTypewriter);
2577 fontModule->fontsTypewriterCO->setCurrentIndex(n);
2582 if (!bp_.fontsCJK.empty())
2583 fontModule->cjkFontLE->setText(
2584 toqstr(bp_.fontsCJK));
2586 fontModule->cjkFontLE->setText(QString());
2588 fontModule->fontScCB->setChecked(bp_.fontsSC);
2589 fontModule->fontOsfCB->setChecked(bp_.fontsOSF);
2590 fontModule->scaleSansSB->setValue(bp_.fontsSansScale);
2591 fontModule->scaleTypewriterSB->setValue(bp_.fontsTypewriterScale);
2593 int nn = findToken(GuiDocument::fontfamilies, bp_.fontsDefaultFamily);
2595 fontModule->fontsDefaultCO->setCurrentIndex(nn);
2597 if (bp_.fontenc == "global")
2598 fontModule->fontencCO->setCurrentIndex(0);
2599 else if (bp_.fontenc == "default")
2600 fontModule->fontencCO->setCurrentIndex(2);
2602 fontModule->fontencCO->setCurrentIndex(1);
2603 fontModule->fontencLE->setText(toqstr(bp_.fontenc));
2607 bool const extern_geometry =
2608 documentClass().provides("geometry");
2609 int const psize = bp_.papersize;
2610 pageLayoutModule->papersizeCO->setCurrentIndex(psize);
2611 setCustomPapersize(!extern_geometry && psize == 1);
2612 pageLayoutModule->papersizeCO->setEnabled(!extern_geometry);
2614 bool const landscape =
2615 bp_.orientation == ORIENTATION_LANDSCAPE;
2616 pageLayoutModule->landscapeRB->setChecked(landscape);
2617 pageLayoutModule->portraitRB->setChecked(!landscape);
2618 pageLayoutModule->landscapeRB->setEnabled(!extern_geometry);
2619 pageLayoutModule->portraitRB->setEnabled(!extern_geometry);
2621 pageLayoutModule->facingPagesCB->setChecked(
2622 bp_.sides == TwoSides);
2624 pageLayoutModule->backgroundPB->setStyleSheet(
2625 colorButtonStyleSheet(rgb2qcolor(bp_.backgroundcolor)));
2626 set_backgroundcolor = bp_.backgroundcolor;
2628 lengthToWidgets(pageLayoutModule->paperwidthLE,
2629 pageLayoutModule->paperwidthUnitCO, bp_.paperwidth, defaultUnit);
2630 lengthToWidgets(pageLayoutModule->paperheightLE,
2631 pageLayoutModule->paperheightUnitCO, bp_.paperheight, defaultUnit);
2634 Ui::MarginsUi * m = marginsModule;
2636 setMargins(!bp_.use_geometry);
2638 lengthToWidgets(m->topLE, m->topUnit,
2639 bp_.topmargin, defaultUnit);
2641 lengthToWidgets(m->bottomLE, m->bottomUnit,
2642 bp_.bottommargin, defaultUnit);
2644 lengthToWidgets(m->innerLE, m->innerUnit,
2645 bp_.leftmargin, defaultUnit);
2647 lengthToWidgets(m->outerLE, m->outerUnit,
2648 bp_.rightmargin, defaultUnit);
2650 lengthToWidgets(m->headheightLE, m->headheightUnit,
2651 bp_.headheight, defaultUnit);
2653 lengthToWidgets(m->headsepLE, m->headsepUnit,
2654 bp_.headsep, defaultUnit);
2656 lengthToWidgets(m->footskipLE, m->footskipUnit,
2657 bp_.footskip, defaultUnit);
2659 lengthToWidgets(m->columnsepLE, m->columnsepUnit,
2660 bp_.columnsep, defaultUnit);
2663 updateUnknownBranches();
2664 branchesModule->update(bp_);
2667 PDFOptions const & pdf = bp_.pdfoptions();
2668 pdfSupportModule->use_hyperrefGB->setChecked(pdf.use_hyperref);
2669 pdfSupportModule->titleLE->setText(toqstr(pdf.title));
2670 pdfSupportModule->authorLE->setText(toqstr(pdf.author));
2671 pdfSupportModule->subjectLE->setText(toqstr(pdf.subject));
2672 pdfSupportModule->keywordsLE->setText(toqstr(pdf.keywords));
2674 pdfSupportModule->bookmarksGB->setChecked(pdf.bookmarks);
2675 pdfSupportModule->bookmarksnumberedCB->setChecked(pdf.bookmarksnumbered);
2676 pdfSupportModule->bookmarksopenGB->setChecked(pdf.bookmarksopen);
2678 pdfSupportModule->bookmarksopenlevelSB->setValue(pdf.bookmarksopenlevel);
2680 pdfSupportModule->breaklinksCB->setChecked(pdf.breaklinks);
2681 pdfSupportModule->pdfborderCB->setChecked(pdf.pdfborder);
2682 pdfSupportModule->pdfusetitleCB->setChecked(pdf.pdfusetitle);
2683 pdfSupportModule->colorlinksCB->setChecked(pdf.colorlinks);
2685 nn = findToken(backref_opts, pdf.backref);
2687 pdfSupportModule->backrefCO->setCurrentIndex(nn);
2689 pdfSupportModule->fullscreenCB->setChecked
2690 (pdf.pagemode == pdf.pagemode_fullscreen);
2692 pdfSupportModule->optionsLE->setText(
2693 toqstr(pdf.quoted_options));
2695 // Make sure that the bc is in the INITIAL state
2696 if (bc().policy().buttonStatus(ButtonPolicy::RESTORE))
2699 // clear changed branches cache
2700 changedBranches_.clear();
2704 void GuiDocument::saveDocDefault()
2706 // we have to apply the params first
2712 void GuiDocument::updateAvailableModules()
2714 modules_av_model_.clear();
2715 list<modInfoStruct> const & modInfoList = getModuleInfo();
2716 list<modInfoStruct>::const_iterator mit = modInfoList.begin();
2717 list<modInfoStruct>::const_iterator men = modInfoList.end();
2718 for (int i = 0; mit != men; ++mit, ++i)
2719 modules_av_model_.insertRow(i, mit->name, mit->id,
2724 void GuiDocument::updateSelectedModules()
2726 modules_sel_model_.clear();
2727 list<modInfoStruct> const selModList = getSelectedModules();
2728 list<modInfoStruct>::const_iterator mit = selModList.begin();
2729 list<modInfoStruct>::const_iterator men = selModList.end();
2730 for (int i = 0; mit != men; ++mit, ++i)
2731 modules_sel_model_.insertRow(i, mit->name, mit->id,
2736 void GuiDocument::updateIncludeonlys()
2738 masterChildModule->childrenTW->clear();
2739 QString const no = qt_("No");
2740 QString const yes = qt_("Yes");
2742 if (includeonlys_.empty()) {
2743 masterChildModule->includeallRB->setChecked(true);
2744 masterChildModule->childrenTW->setEnabled(false);
2745 masterChildModule->maintainAuxCB->setEnabled(false);
2747 masterChildModule->includeonlyRB->setChecked(true);
2748 masterChildModule->childrenTW->setEnabled(true);
2749 masterChildModule->maintainAuxCB->setEnabled(true);
2751 QTreeWidgetItem * item = 0;
2752 std::vector<Buffer *> children = buffer().getChildren(false);
2753 vector<Buffer *>::const_iterator it = children.begin();
2754 vector<Buffer *>::const_iterator end = children.end();
2755 bool has_unincluded = false;
2756 bool all_unincluded = true;
2757 for (; it != end; ++it) {
2758 item = new QTreeWidgetItem(masterChildModule->childrenTW);
2761 to_utf8(makeRelPath(from_utf8((*it)->fileName().absFilename()),
2762 from_utf8(buffer().filePath())));
2763 item->setText(0, toqstr(name));
2764 item->setText(1, isChildIncluded(name) ? yes : no);
2765 if (!isChildIncluded(name))
2766 has_unincluded = true;
2768 all_unincluded = false;
2770 // Both if all childs are included and if none is included
2771 // is equal to "include all" (i.e., ommit \includeonly).
2772 // Thus, reset the GUI.
2773 if (!has_unincluded || all_unincluded) {
2774 masterChildModule->includeallRB->setChecked(true);
2775 masterChildModule->childrenTW->setEnabled(false);
2776 includeonlys_.clear();
2778 // If all are included, we need to update again.
2779 if (!has_unincluded)
2780 updateIncludeonlys();
2784 void GuiDocument::updateContents()
2786 // Nothing to do here as the document settings is not cursor dependant.
2791 void GuiDocument::useClassDefaults()
2793 if (applyPB->isEnabled()) {
2794 int const ret = Alert::prompt(_("Unapplied changes"),
2795 _("Some changes in the dialog were not yet applied.\n"
2796 "If you do not apply now, they will be lost after this action."),
2797 1, 1, _("&Apply"), _("&Dismiss"));
2802 int idx = latexModule->classCO->currentIndex();
2803 string const classname = classes_model_.getIDString(idx);
2804 if (!bp_.setBaseClass(classname)) {
2805 Alert::error(_("Error"), _("Unable to set document class."));
2808 bp_.useClassDefaults();
2813 void GuiDocument::setLayoutComboByIDString(string const & idString)
2815 int idx = classes_model_.findIDString(idString);
2817 Alert::warning(_("Can't set layout!"),
2818 bformat(_("Unable to set layout for ID: %1$s"), from_utf8(idString)));
2820 latexModule->classCO->setCurrentIndex(idx);
2824 bool GuiDocument::isValid()
2826 return validateListingsParameters().isEmpty()
2827 && (textLayoutModule->skipCO->currentIndex() != 3
2828 || !textLayoutModule->skipLE->text().isEmpty()
2829 || textLayoutModule->indentRB->isChecked())
2830 && (textLayoutModule->indentCO->currentIndex() != 1
2831 || !textLayoutModule->indentLE->text().isEmpty()
2832 || textLayoutModule->skipRB->isChecked());
2836 char const * const GuiDocument::fontfamilies[5] = {
2837 "default", "rmdefault", "sfdefault", "ttdefault", ""
2841 char const * GuiDocument::fontfamilies_gui[5] = {
2842 N_("Default"), N_("Roman"), N_("Sans Serif"), N_("Typewriter"), ""
2846 bool GuiDocument::initialiseParams(string const &)
2848 BufferView const * view = bufferview();
2850 bp_ = BufferParams();
2854 bp_ = view->buffer().params();
2856 updateAvailableModules();
2857 //FIXME It'd be nice to make sure here that the selected
2858 //modules are consistent: That required modules are actually
2859 //selected, and that we don't have conflicts. If so, we could
2860 //at least pop up a warning.
2866 void GuiDocument::clearParams()
2868 bp_ = BufferParams();
2872 BufferId GuiDocument::id() const
2874 BufferView const * const view = bufferview();
2875 return view? &view->buffer() : 0;
2879 list<GuiDocument::modInfoStruct> const & GuiDocument::getModuleInfo()
2881 return moduleNames_;
2885 list<GuiDocument::modInfoStruct> const
2886 GuiDocument::makeModuleInfo(LayoutModuleList const & mods)
2888 LayoutModuleList::const_iterator it = mods.begin();
2889 LayoutModuleList::const_iterator end = mods.end();
2890 list<modInfoStruct> mInfo;
2891 for (; it != end; ++it) {
2894 LyXModule const * const mod = theModuleList[*it];
2897 m.name = toqstr(translateIfPossible(from_utf8(mod->getName())));
2899 m.name = toqstr(*it) + toqstr(" (") + qt_("Not Found") + toqstr(")");
2906 list<GuiDocument::modInfoStruct> const GuiDocument::getSelectedModules()
2908 return makeModuleInfo(params().getModules());
2912 list<GuiDocument::modInfoStruct> const GuiDocument::getProvidedModules()
2914 return makeModuleInfo(params().baseClass()->providedModules());
2918 DocumentClass const & GuiDocument::documentClass() const
2920 return bp_.documentClass();
2924 static void dispatch_bufferparams(Dialog const & dialog,
2925 BufferParams const & bp, FuncCode lfun)
2928 ss << "\\begin_header\n";
2930 ss << "\\end_header\n";
2931 dialog.dispatch(FuncRequest(lfun, ss.str()));
2935 void GuiDocument::dispatchParams()
2937 // This must come first so that a language change is correctly noticed
2940 // Apply the BufferParams. Note that this will set the base class
2941 // and then update the buffer's layout.
2942 dispatch_bufferparams(*this, params(), LFUN_BUFFER_PARAMS_APPLY);
2944 if (!params().master.empty()) {
2945 FileName const master_file = support::makeAbsPath(params().master,
2946 support::onlyPath(buffer().absFileName()));
2947 if (isLyXFilename(master_file.absFilename())) {
2948 Buffer * master = checkAndLoadLyXFile(master_file);
2950 if (master->isChild(const_cast<Buffer *>(&buffer())))
2951 const_cast<Buffer &>(buffer()).setParent(master);
2953 Alert::warning(_("Assigned master does not include this file"),
2954 bformat(_("You must include this file in the document\n"
2955 "'%1$s' in order to use the master document\n"
2956 "feature."), from_utf8(params().master)));
2958 Alert::warning(_("Could not load master"),
2959 bformat(_("The master document '%1$s'\n"
2960 "could not be loaded."),
2961 from_utf8(params().master)));
2965 // Generate the colours requested by each new branch.
2966 BranchList & branchlist = params().branchlist();
2967 if (!branchlist.empty()) {
2968 BranchList::const_iterator it = branchlist.begin();
2969 BranchList::const_iterator const end = branchlist.end();
2970 for (; it != end; ++it) {
2971 docstring const & current_branch = it->branch();
2972 Branch const * branch = branchlist.find(current_branch);
2973 string const x11hexname = X11hexname(branch->color());
2974 // display the new color
2975 docstring const str = current_branch + ' ' + from_ascii(x11hexname);
2976 dispatch(FuncRequest(LFUN_SET_COLOR, str));
2979 // Open insets of selected branches, close deselected ones
2980 dispatch(FuncRequest(LFUN_ALL_INSETS_TOGGLE,
2983 // rename branches in the document
2984 executeBranchRenaming();
2985 // and clear changed branches cache
2986 changedBranches_.clear();
2988 // Generate the colours requested by indices.
2989 IndicesList & indiceslist = params().indiceslist();
2990 if (!indiceslist.empty()) {
2991 IndicesList::const_iterator it = indiceslist.begin();
2992 IndicesList::const_iterator const end = indiceslist.end();
2993 for (; it != end; ++it) {
2994 docstring const & current_index = it->shortcut();
2995 Index const * index = indiceslist.findShortcut(current_index);
2996 string const x11hexname = X11hexname(index->color());
2997 // display the new color
2998 docstring const str = current_index + ' ' + from_ascii(x11hexname);
2999 dispatch(FuncRequest(LFUN_SET_COLOR, str));
3002 // FIXME: If we used an LFUN, we would not need those two lines:
3003 BufferView * bv = const_cast<BufferView *>(bufferview());
3004 bv->processUpdateFlags(Update::Force | Update::FitCursor);
3008 void GuiDocument::setLanguage() const
3010 Language const * const newL = bp_.language;
3011 if (buffer().params().language == newL)
3014 string const & lang_name = newL->lang();
3015 dispatch(FuncRequest(LFUN_BUFFER_LANGUAGE, lang_name));
3019 void GuiDocument::saveAsDefault() const
3021 dispatch_bufferparams(*this, params(), LFUN_BUFFER_SAVE_AS_DEFAULT);
3025 bool GuiDocument::isFontAvailable(string const & font) const
3027 if (font == "default" || font == "cmr"
3028 || font == "cmss" || font == "cmtt")
3029 // these are standard
3031 if (font == "lmodern" || font == "lmss" || font == "lmtt")
3032 return LaTeXFeatures::isAvailable("lmodern");
3033 if (font == "times" || font == "palatino"
3034 || font == "helvet" || font == "courier")
3035 return LaTeXFeatures::isAvailable("psnfss");
3036 if (font == "cmbr" || font == "cmtl")
3037 return LaTeXFeatures::isAvailable("cmbright");
3038 if (font == "utopia")
3039 return LaTeXFeatures::isAvailable("utopia")
3040 || LaTeXFeatures::isAvailable("fourier");
3041 if (font == "beraserif" || font == "berasans"
3042 || font == "beramono")
3043 return LaTeXFeatures::isAvailable("bera");
3044 return LaTeXFeatures::isAvailable(font);
3048 bool GuiDocument::providesOSF(string const & font) const
3050 if (outputModule->xetexCB->isChecked())
3051 // FIXME: we should check if the fonts really
3052 // have OSF support. But how?
3055 return isFontAvailable("eco");
3056 if (font == "palatino")
3057 return isFontAvailable("mathpazo");
3062 bool GuiDocument::providesSC(string const & font) const
3064 if (outputModule->xetexCB->isChecked())
3066 if (font == "palatino")
3067 return isFontAvailable("mathpazo");
3068 if (font == "utopia")
3069 return isFontAvailable("fourier");
3074 bool GuiDocument::providesScale(string const & font) const
3076 if (outputModule->xetexCB->isChecked())
3078 return font == "helvet" || font == "luximono"
3079 || font == "berasans" || font == "beramono";
3083 void GuiDocument::loadModuleInfo()
3085 moduleNames_.clear();
3086 LyXModuleList::const_iterator it = theModuleList.begin();
3087 LyXModuleList::const_iterator end = theModuleList.end();
3088 for (; it != end; ++it) {
3092 m.name = toqstr(translateIfPossible(from_utf8(it->getName())));
3093 // this is supposed to give us the first sentence of the description
3096 toqstr(translateIfPossible(from_utf8(it->getDescription())));
3097 int const pos = desc.indexOf(".");
3099 desc.truncate(pos + 1);
3100 m.description = desc;
3101 moduleNames_.push_back(m);
3106 void GuiDocument::updateUnknownBranches()
3110 list<docstring> used_branches;
3111 buffer().getUsedBranches(used_branches);
3112 list<docstring>::const_iterator it = used_branches.begin();
3113 QStringList unknown_branches;
3114 for (; it != used_branches.end() ; ++it) {
3115 if (!buffer().params().branchlist().find(*it))
3116 unknown_branches.append(toqstr(*it));
3118 branchesModule->setUnknownBranches(unknown_branches);
3122 void GuiDocument::branchesRename(docstring const & oldname, docstring const & newname)
3124 map<docstring, docstring>::iterator it = changedBranches_.begin();
3125 for (; it != changedBranches_.end() ; ++it) {
3126 if (it->second == oldname) {
3127 // branch has already been renamed
3128 it->second = newname;
3133 changedBranches_[oldname] = newname;
3137 void GuiDocument::executeBranchRenaming() const
3139 map<docstring, docstring>::const_iterator it = changedBranches_.begin();
3140 for (; it != changedBranches_.end() ; ++it) {
3141 docstring const arg = '"' + it->first + '"' + " " + '"' + it->second + '"';
3142 dispatch(FuncRequest(LFUN_BRANCHES_RENAME, arg));
3147 Dialog * createGuiDocument(GuiView & lv) { return new GuiDocument(lv); }
3150 } // namespace frontend
3153 #include "moc_GuiDocument.cpp"