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 "CategorizedCombo.h"
17 #include "GuiApplication.h"
18 #include "GuiBranches.h"
19 #include "GuiIndices.h"
20 #include "GuiSelectionManager.h"
21 #include "LaTeXHighlighter.h"
22 #include "LengthCombo.h"
23 #include "PanelStack.h"
24 #include "Validator.h"
26 #include "LayoutFile.h"
27 #include "BranchList.h"
28 #include "buffer_funcs.h"
30 #include "BufferParams.h"
31 #include "BufferView.h"
33 #include "ColorCache.h"
35 #include "FloatPlacement.h"
37 #include "FuncRequest.h"
39 #include "IndicesList.h"
41 #include "LaTeXFeatures.h"
42 #include "LaTeXFonts.h"
44 #include "LayoutEnums.h"
45 #include "LayoutModuleList.h"
47 #include "ModuleList.h"
48 #include "OutputParams.h"
49 #include "PDFOptions.h"
50 #include "qt_helpers.h"
52 #include "TextClass.h"
55 #include "insets/InsetListingsParams.h"
57 #include "support/debug.h"
58 #include "support/FileName.h"
59 #include "support/filetools.h"
60 #include "support/gettext.h"
61 #include "support/lassert.h"
62 #include "support/lstrings.h"
64 #include "frontends/alert.h"
66 #include <QAbstractItemModel>
67 #include <QHeaderView>
69 #include <QColorDialog>
70 #include <QCloseEvent>
71 #include <QFontDatabase>
73 #include <QTextCursor>
83 // a style sheet for buttons
84 // this is for example used for the background color setting button
85 static inline QString colorButtonStyleSheet(QColor const & bgColor)
87 if (bgColor.isValid()) {
88 QString rc = QLatin1String("background-color:");
97 using namespace lyx::support;
102 char const * const tex_graphics[] =
104 "default", "dvialw", "dvilaser", "dvipdf", "dvipdfm", "dvipdfmx",
105 "dvips", "dvipsone", "dvitops", "dviwin", "dviwindo", "dvi2ps", "emtex",
106 "ln", "oztex", "pctexhp", "pctexps", "pctexwin", "pctex32", "pdftex",
107 "psprint", "pubps", "tcidvi", "textures", "truetex", "vtex", "xdvi",
112 char const * const tex_graphics_gui[] =
114 N_("Default"), "dvialw", "DviLaser", "dvipdf", "DVIPDFM", "DVIPDFMx",
115 "Dvips", "DVIPSONE", "DVItoPS", "DVIWIN", "DVIWindo", "dvi2ps", "EmTeX",
116 "LN", "OzTeX", "pctexhp", "pctexps", "pctexwin", "PCTeX32", "pdfTeX",
117 "psprint", "pubps", "tcidvi", "Textures", "TrueTeX", "VTeX", "xdvi",
118 "XeTeX", N_("None"), ""
122 char const * backref_opts[] =
124 "false", "section", "slide", "page", ""
128 char const * backref_opts_gui[] =
130 N_("Off"), N_("Section"), N_("Slide"), N_("Page"), ""
134 vector<string> engine_types_;
135 vector<pair<string, QString> > pagestyles;
137 QMap<QString, QString> rmfonts_;
138 QMap<QString, QString> sffonts_;
139 QMap<QString, QString> ttfonts_;
140 QMap<QString, QString> mathfonts_;
143 } // anonymous namespace
147 RGBColor set_backgroundcolor;
148 bool is_backgroundcolor;
149 RGBColor set_fontcolor;
151 RGBColor set_notefontcolor;
152 RGBColor set_boxbgcolor;
153 bool forced_fontspec_activation;
156 // used when sorting the textclass list.
157 class less_textclass_avail_desc
158 : public binary_function<string, string, int>
161 bool operator()(string const & lhs, string const & rhs) const
163 // Ordering criteria:
164 // 1. Availability of text class
165 // 2. Description (lexicographic)
166 LayoutFile const & tc1 = LayoutFileList::get()[lhs];
167 LayoutFile const & tc2 = LayoutFileList::get()[rhs];
168 int const order = compare_no_case(
169 translateIfPossible(from_utf8(tc1.description())),
170 translateIfPossible(from_utf8(tc2.description())));
171 return (tc1.isTeXClassAvailable() && !tc2.isTeXClassAvailable()) ||
172 (tc1.isTeXClassAvailable() == tc2.isTeXClassAvailable() && order < 0);
181 vector<string> getRequiredList(string const & modName)
183 LyXModule const * const mod = theModuleList[modName];
185 return vector<string>(); //empty such thing
186 return mod->getRequiredModules();
190 vector<string> getExcludedList(string const & modName)
192 LyXModule const * const mod = theModuleList[modName];
194 return vector<string>(); //empty such thing
195 return mod->getExcludedModules();
199 docstring getModuleCategory(string const & modName)
201 LyXModule const * const mod = theModuleList[modName];
204 return from_utf8(mod->category());
208 docstring getModuleDescription(string const & modName)
210 LyXModule const * const mod = theModuleList[modName];
212 return _("Module not found!");
214 return translateIfPossible(from_utf8(mod->getDescription()));
218 vector<string> getPackageList(string const & modName)
220 LyXModule const * const mod = theModuleList[modName];
222 return vector<string>(); //empty such thing
223 return mod->getPackageList();
227 bool isModuleAvailable(string const & modName)
229 LyXModule const * const mod = theModuleList[modName];
232 return mod->isAvailable();
235 } // anonymous namespace
238 /////////////////////////////////////////////////////////////////////
240 // ModuleSelectionManager
242 /////////////////////////////////////////////////////////////////////
244 /// SelectionManager for use with modules
245 class ModuleSelectionManager : public GuiSelectionManager
249 ModuleSelectionManager(
250 QTreeView * availableLV,
251 QListView * selectedLV,
255 QPushButton * downPB,
256 GuiIdListModel * availableModel,
257 GuiIdListModel * selectedModel,
258 GuiDocument const * container)
259 : GuiSelectionManager(availableLV, selectedLV, addPB, delPB,
260 upPB, downPB, availableModel, selectedModel), container_(container)
263 void updateProvidedModules(LayoutModuleList const & pm)
264 { provided_modules_ = pm.list(); }
266 void updateExcludedModules(LayoutModuleList const & em)
267 { excluded_modules_ = em.list(); }
270 virtual void updateAddPB();
272 virtual void updateUpPB();
274 virtual void updateDownPB();
276 virtual void updateDelPB();
277 /// returns availableModel as a GuiIdListModel
278 GuiIdListModel * getAvailableModel()
280 return dynamic_cast<GuiIdListModel *>(availableModel);
282 /// returns selectedModel as a GuiIdListModel
283 GuiIdListModel * getSelectedModel()
285 return dynamic_cast<GuiIdListModel *>(selectedModel);
287 /// keeps a list of the modules the text class provides
288 list<string> provided_modules_;
290 list<string> excluded_modules_;
292 GuiDocument const * container_;
295 void ModuleSelectionManager::updateAddPB()
297 int const arows = availableModel->rowCount();
298 QModelIndexList const avail_sels =
299 availableLV->selectionModel()->selectedIndexes();
301 // disable if there aren't any modules (?), if none of them is chosen
302 // in the dialog, or if the chosen one is already selected for use.
303 if (arows == 0 || avail_sels.isEmpty() || isSelected(avail_sels.first())) {
304 addPB->setEnabled(false);
308 QModelIndex const & idx = availableLV->selectionModel()->currentIndex();
309 string const modname = getAvailableModel()->getIDString(idx.row());
312 container_->params().layoutModuleCanBeAdded(modname);
313 addPB->setEnabled(enable);
317 void ModuleSelectionManager::updateDownPB()
319 int const srows = selectedModel->rowCount();
321 downPB->setEnabled(false);
324 QModelIndex const & curidx = selectedLV->selectionModel()->currentIndex();
325 int const curRow = curidx.row();
326 if (curRow < 0 || curRow >= srows - 1) { // invalid or last item
327 downPB->setEnabled(false);
331 // determine whether immediately succeding element requires this one
332 string const curmodname = getSelectedModel()->getIDString(curRow);
333 string const nextmodname = getSelectedModel()->getIDString(curRow + 1);
335 vector<string> reqs = getRequiredList(nextmodname);
337 // if it doesn't require anything....
339 downPB->setEnabled(true);
343 // Enable it if this module isn't required.
344 // FIXME This should perhaps be more flexible and check whether, even
345 // if the next one is required, there is also an earlier one that will do.
347 find(reqs.begin(), reqs.end(), curmodname) == reqs.end());
350 void ModuleSelectionManager::updateUpPB()
352 int const srows = selectedModel->rowCount();
354 upPB->setEnabled(false);
358 QModelIndex const & curIdx = selectedLV->selectionModel()->currentIndex();
359 int curRow = curIdx.row();
360 if (curRow <= 0 || curRow > srows - 1) { // first item or invalid
361 upPB->setEnabled(false);
364 string const curmodname = getSelectedModel()->getIDString(curRow);
366 // determine whether immediately preceding element is required by this one
367 vector<string> reqs = getRequiredList(curmodname);
369 // if this one doesn't require anything....
371 upPB->setEnabled(true);
376 // Enable it if the preceding module isn't required.
377 // NOTE This is less flexible than it might be. We could check whether, even
378 // if the previous one is required, there is an earlier one that would do.
379 string const premod = getSelectedModel()->getIDString(curRow - 1);
380 upPB->setEnabled(find(reqs.begin(), reqs.end(), premod) == reqs.end());
383 void ModuleSelectionManager::updateDelPB()
385 int const srows = selectedModel->rowCount();
387 deletePB->setEnabled(false);
391 QModelIndex const & curidx =
392 selectedLV->selectionModel()->currentIndex();
393 int const curRow = curidx.row();
394 if (curRow < 0 || curRow >= srows) { // invalid index?
395 deletePB->setEnabled(false);
399 string const curmodname = getSelectedModel()->getIDString(curRow);
401 // We're looking here for a reason NOT to enable the button. If we
402 // find one, we disable it and return. If we don't, we'll end up at
403 // the end of the function, and then we enable it.
404 for (int i = curRow + 1; i < srows; ++i) {
405 string const thisMod = getSelectedModel()->getIDString(i);
406 vector<string> reqs = getRequiredList(thisMod);
407 //does this one require us?
408 if (find(reqs.begin(), reqs.end(), curmodname) == reqs.end())
412 // OK, so this module requires us
413 // is there an EARLIER module that also satisfies the require?
414 // NOTE We demand that it be earlier to keep the list of modules
415 // consistent with the rule that a module must be proceeded by a
416 // required module. There would be more flexible ways to proceed,
417 // but that would be a lot more complicated, and the logic here is
418 // already complicated. (That's why I've left the debugging code.)
419 // lyxerr << "Testing " << thisMod << endl;
420 bool foundone = false;
421 for (int j = 0; j < curRow; ++j) {
422 string const mod = getSelectedModel()->getIDString(j);
423 // lyxerr << "In loop: Testing " << mod << endl;
424 // do we satisfy the require?
425 if (find(reqs.begin(), reqs.end(), mod) != reqs.end()) {
426 // lyxerr << mod << " does the trick." << endl;
431 // did we find a module to satisfy the require?
433 // lyxerr << "No matching module found." << endl;
434 deletePB->setEnabled(false);
438 // lyxerr << "All's well that ends well." << endl;
439 deletePB->setEnabled(true);
443 /////////////////////////////////////////////////////////////////////
447 /////////////////////////////////////////////////////////////////////
449 PreambleModule::PreambleModule() : current_id_(0)
451 // This is not a memory leak. The object will be destroyed
453 (void) new LaTeXHighlighter(preambleTE->document());
454 setFocusProxy(preambleTE);
455 connect(preambleTE, SIGNAL(textChanged()), this, SIGNAL(changed()));
459 void PreambleModule::update(BufferParams const & params, BufferId id)
461 QString preamble = toqstr(params.preamble);
462 // Nothing to do if the params and preamble are unchanged.
463 if (id == current_id_
464 && preamble == preambleTE->document()->toPlainText())
467 QTextCursor cur = preambleTE->textCursor();
468 // Save the coords before switching to the new one.
469 preamble_coords_[current_id_] =
470 make_pair(cur.position(), preambleTE->verticalScrollBar()->value());
472 // Save the params address for further use.
474 preambleTE->document()->setPlainText(preamble);
475 Coords::const_iterator it = preamble_coords_.find(current_id_);
476 if (it == preamble_coords_.end())
477 // First time we open this one.
478 preamble_coords_[current_id_] = make_pair(0, 0);
480 // Restore saved coords.
481 QTextCursor cur = preambleTE->textCursor();
482 cur.setPosition(it->second.first);
483 preambleTE->setTextCursor(cur);
484 preambleTE->verticalScrollBar()->setValue(it->second.second);
489 void PreambleModule::apply(BufferParams & params)
491 params.preamble = fromqstr(preambleTE->document()->toPlainText());
495 void PreambleModule::closeEvent(QCloseEvent * e)
497 // Save the coords before closing.
498 QTextCursor cur = preambleTE->textCursor();
499 preamble_coords_[current_id_] =
500 make_pair(cur.position(), preambleTE->verticalScrollBar()->value());
505 /////////////////////////////////////////////////////////////////////
509 /////////////////////////////////////////////////////////////////////
512 LocalLayout::LocalLayout() : current_id_(0), validated_(false)
514 connect(locallayoutTE, SIGNAL(textChanged()), this, SLOT(textChanged()));
515 connect(validatePB, SIGNAL(clicked()), this, SLOT(validatePressed()));
516 connect(convertPB, SIGNAL(clicked()), this, SLOT(convertPressed()));
520 void LocalLayout::update(BufferParams const & params, BufferId id)
522 QString layout = toqstr(params.getLocalLayout(false));
523 // Nothing to do if the params and preamble are unchanged.
524 if (id == current_id_
525 && layout == locallayoutTE->document()->toPlainText())
528 // Save the params address for further use.
530 locallayoutTE->document()->setPlainText(layout);
535 void LocalLayout::apply(BufferParams & params)
537 string const layout = fromqstr(locallayoutTE->document()->toPlainText());
538 params.setLocalLayout(layout, false);
542 void LocalLayout::textChanged()
544 static const QString message =
545 qt_("Press button to check validity...");
546 string const layout =
547 fromqstr(locallayoutTE->document()->toPlainText().trimmed());
549 if (layout.empty()) {
551 validatePB->setEnabled(false);
552 validLB->setText("");
556 } else if (!validatePB->isEnabled()) {
557 // if that's already enabled, we shouldn't need to do anything.
559 validLB->setText(message);
560 validatePB->setEnabled(true);
561 convertPB->setEnabled(false);
567 void LocalLayout::convert() {
568 string const layout =
569 fromqstr(locallayoutTE->document()->toPlainText().trimmed());
570 string const newlayout = TextClass::convert(layout);
572 if (newlayout.empty()) {
573 Alert::error(_("Conversion Failed!"),
574 _("Failed to convert local layout to current format."));
576 locallayoutTE->setPlainText(toqstr(newlayout));
582 void LocalLayout::convertPressed() {
588 void LocalLayout::validate() {
589 static const QString valid = qt_("Layout is valid!");
590 static const QString vtext =
591 toqstr("<p style=\"font-weight: bold; \">")
592 + valid + toqstr("</p>");
593 static const QString invalid = qt_("Layout is invalid!");
594 static const QString ivtext =
595 toqstr("<p style=\"color: #c00000; font-weight: bold; \">")
596 + invalid + toqstr("</p>");
598 string const layout =
599 fromqstr(locallayoutTE->document()->toPlainText().trimmed());
600 if (!layout.empty()) {
601 TextClass::ReturnValues const ret = TextClass::validate(layout);
602 validated_ = (ret == TextClass::OK) || (ret == TextClass::OK_OLDFORMAT);
603 validatePB->setEnabled(false);
604 validLB->setText(validated_ ? vtext : ivtext);
605 if (ret == TextClass::OK_OLDFORMAT) {
607 convertPB->setEnabled(true);
608 convertLB->setText(qt_("Convert to current format"));
618 void LocalLayout::validatePressed() {
624 /////////////////////////////////////////////////////////////////////
628 /////////////////////////////////////////////////////////////////////
631 GuiDocument::GuiDocument(GuiView & lv)
632 : GuiDialog(lv, "document", qt_("Document Settings")),
633 nonModuleChanged_(false)
637 connect(okPB, SIGNAL(clicked()), this, SLOT(slotOK()));
638 connect(applyPB, SIGNAL(clicked()), this, SLOT(slotApply()));
639 connect(closePB, SIGNAL(clicked()), this, SLOT(slotClose()));
640 connect(restorePB, SIGNAL(clicked()), this, SLOT(slotRestore()));
642 connect(savePB, SIGNAL(clicked()), this, SLOT(saveDefaultClicked()));
643 connect(defaultPB, SIGNAL(clicked()), this, SLOT(useDefaultsClicked()));
645 // Manage the restore, ok, apply, restore and cancel/close buttons
646 bc().setPolicy(ButtonPolicy::NoRepeatedApplyReadOnlyPolicy);
648 bc().setApply(applyPB);
649 bc().setCancel(closePB);
650 bc().setRestore(restorePB);
654 textLayoutModule = new UiWidget<Ui::TextLayoutUi>;
655 connect(textLayoutModule->lspacingCO, SIGNAL(activated(int)),
656 this, SLOT(change_adaptor()));
657 connect(textLayoutModule->lspacingCO, SIGNAL(activated(int)),
658 this, SLOT(setLSpacing(int)));
659 connect(textLayoutModule->lspacingLE, SIGNAL(textChanged(const QString &)),
660 this, SLOT(change_adaptor()));
662 connect(textLayoutModule->indentRB, SIGNAL(clicked()),
663 this, SLOT(change_adaptor()));
664 connect(textLayoutModule->indentRB, SIGNAL(toggled(bool)),
665 textLayoutModule->indentCO, SLOT(setEnabled(bool)));
666 connect(textLayoutModule->indentCO, SIGNAL(activated(int)),
667 this, SLOT(change_adaptor()));
668 connect(textLayoutModule->indentCO, SIGNAL(activated(int)),
669 this, SLOT(setIndent(int)));
670 connect(textLayoutModule->indentLE, SIGNAL(textChanged(const QString &)),
671 this, SLOT(change_adaptor()));
672 connect(textLayoutModule->indentLengthCO, SIGNAL(activated(int)),
673 this, SLOT(change_adaptor()));
675 connect(textLayoutModule->skipRB, SIGNAL(clicked()),
676 this, SLOT(change_adaptor()));
677 connect(textLayoutModule->skipRB, SIGNAL(toggled(bool)),
678 textLayoutModule->skipCO, SLOT(setEnabled(bool)));
679 connect(textLayoutModule->skipCO, SIGNAL(activated(int)),
680 this, SLOT(change_adaptor()));
681 connect(textLayoutModule->skipCO, SIGNAL(activated(int)),
682 this, SLOT(setSkip(int)));
683 connect(textLayoutModule->skipLE, SIGNAL(textChanged(const QString &)),
684 this, SLOT(change_adaptor()));
685 connect(textLayoutModule->skipLengthCO, SIGNAL(activated(int)),
686 this, SLOT(change_adaptor()));
688 connect(textLayoutModule->indentRB, SIGNAL(toggled(bool)),
689 this, SLOT(enableIndent(bool)));
690 connect(textLayoutModule->skipRB, SIGNAL(toggled(bool)),
691 this, SLOT(enableSkip(bool)));
693 connect(textLayoutModule->twoColumnCB, SIGNAL(clicked()),
694 this, SLOT(change_adaptor()));
695 connect(textLayoutModule->twoColumnCB, SIGNAL(clicked()),
696 this, SLOT(setColSep()));
697 connect(textLayoutModule->justCB, SIGNAL(clicked()),
698 this, SLOT(change_adaptor()));
700 textLayoutModule->lspacingLE->setValidator(new QDoubleValidator(
701 textLayoutModule->lspacingLE));
702 textLayoutModule->indentLE->setValidator(unsignedLengthValidator(
703 textLayoutModule->indentLE));
704 textLayoutModule->skipLE->setValidator(unsignedGlueLengthValidator(
705 textLayoutModule->skipLE));
707 textLayoutModule->indentCO->addItem(qt_("Default"));
708 textLayoutModule->indentCO->addItem(qt_("Custom"));
709 textLayoutModule->skipCO->addItem(qt_("SmallSkip"));
710 textLayoutModule->skipCO->addItem(qt_("MedSkip"));
711 textLayoutModule->skipCO->addItem(qt_("BigSkip"));
712 textLayoutModule->skipCO->addItem(qt_("Custom"));
713 textLayoutModule->lspacingCO->insertItem(
714 Spacing::Single, qt_("Single"));
715 textLayoutModule->lspacingCO->insertItem(
716 Spacing::Onehalf, qt_("OneHalf"));
717 textLayoutModule->lspacingCO->insertItem(
718 Spacing::Double, qt_("Double"));
719 textLayoutModule->lspacingCO->insertItem(
720 Spacing::Other, qt_("Custom"));
721 // initialize the length validator
722 bc().addCheckedLineEdit(textLayoutModule->indentLE);
723 bc().addCheckedLineEdit(textLayoutModule->skipLE);
726 // master/child handling
727 masterChildModule = new UiWidget<Ui::MasterChildUi>;
729 connect(masterChildModule->childrenTW, SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)),
730 this, SLOT(includeonlyClicked(QTreeWidgetItem *, int)));
731 connect(masterChildModule->includeonlyRB, SIGNAL(toggled(bool)),
732 masterChildModule->childrenTW, SLOT(setEnabled(bool)));
733 connect(masterChildModule->includeonlyRB, SIGNAL(toggled(bool)),
734 masterChildModule->maintainAuxCB, SLOT(setEnabled(bool)));
735 connect(masterChildModule->includeallRB, SIGNAL(clicked()),
736 this, SLOT(change_adaptor()));
737 connect(masterChildModule->includeonlyRB, SIGNAL(clicked()),
738 this, SLOT(change_adaptor()));
739 connect(masterChildModule->maintainAuxCB, SIGNAL(clicked()),
740 this, SLOT(change_adaptor()));
741 masterChildModule->childrenTW->setColumnCount(2);
742 masterChildModule->childrenTW->headerItem()->setText(0, qt_("Child Document"));
743 masterChildModule->childrenTW->headerItem()->setText(1, qt_("Include to Output"));
744 masterChildModule->childrenTW->resizeColumnToContents(1);
745 masterChildModule->childrenTW->resizeColumnToContents(2);
749 outputModule = new UiWidget<Ui::OutputUi>;
751 connect(outputModule->defaultFormatCO, SIGNAL(activated(int)),
752 this, SLOT(change_adaptor()));
753 connect(outputModule->mathimgSB, SIGNAL(valueChanged(double)),
754 this, SLOT(change_adaptor()));
755 connect(outputModule->strictCB, SIGNAL(stateChanged(int)),
756 this, SLOT(change_adaptor()));
757 connect(outputModule->cssCB, SIGNAL(stateChanged(int)),
758 this, SLOT(change_adaptor()));
759 connect(outputModule->mathoutCB, SIGNAL(currentIndexChanged(int)),
760 this, SLOT(change_adaptor()));
762 connect(outputModule->outputsyncCB, SIGNAL(clicked()),
763 this, SLOT(change_adaptor()));
764 connect(outputModule->synccustomCB, SIGNAL(editTextChanged(QString)),
765 this, SLOT(change_adaptor()));
766 outputModule->synccustomCB->addItem("");
767 outputModule->synccustomCB->addItem("\\synctex=1");
768 outputModule->synccustomCB->addItem("\\synctex=-1");
769 outputModule->synccustomCB->addItem("\\usepackage[active]{srcltx}");
771 outputModule->synccustomCB->setValidator(new NoNewLineValidator(
772 outputModule->synccustomCB));
775 fontModule = new UiWidget<Ui::FontUi>;
776 connect(fontModule->osFontsCB, SIGNAL(clicked()),
777 this, SLOT(change_adaptor()));
778 connect(fontModule->osFontsCB, SIGNAL(toggled(bool)),
779 this, SLOT(osFontsChanged(bool)));
780 connect(fontModule->fontsRomanCO, SIGNAL(activated(int)),
781 this, SLOT(change_adaptor()));
782 connect(fontModule->fontsRomanCO, SIGNAL(activated(int)),
783 this, SLOT(romanChanged(int)));
784 connect(fontModule->fontsSansCO, SIGNAL(activated(int)),
785 this, SLOT(change_adaptor()));
786 connect(fontModule->fontsSansCO, SIGNAL(activated(int)),
787 this, SLOT(sansChanged(int)));
788 connect(fontModule->fontsTypewriterCO, SIGNAL(activated(int)),
789 this, SLOT(change_adaptor()));
790 connect(fontModule->fontsTypewriterCO, SIGNAL(activated(int)),
791 this, SLOT(ttChanged(int)));
792 connect(fontModule->fontsMathCO, SIGNAL(activated(int)),
793 this, SLOT(change_adaptor()));
794 connect(fontModule->fontsMathCO, SIGNAL(activated(int)),
795 this, SLOT(mathFontChanged(int)));
796 connect(fontModule->fontsDefaultCO, SIGNAL(activated(int)),
797 this, SLOT(change_adaptor()));
798 connect(fontModule->fontencCO, SIGNAL(activated(int)),
799 this, SLOT(change_adaptor()));
800 connect(fontModule->fontencCO, SIGNAL(activated(int)),
801 this, SLOT(fontencChanged(int)));
802 connect(fontModule->fontencLE, SIGNAL(textChanged(const QString &)),
803 this, SLOT(change_adaptor()));
804 connect(fontModule->fontsizeCO, SIGNAL(activated(int)),
805 this, SLOT(change_adaptor()));
806 connect(fontModule->cjkFontLE, SIGNAL(textChanged(const QString &)),
807 this, SLOT(change_adaptor()));
808 connect(fontModule->scaleSansSB, SIGNAL(valueChanged(int)),
809 this, SLOT(change_adaptor()));
810 connect(fontModule->scaleTypewriterSB, SIGNAL(valueChanged(int)),
811 this, SLOT(change_adaptor()));
812 connect(fontModule->fontScCB, SIGNAL(clicked()),
813 this, SLOT(change_adaptor()));
814 connect(fontModule->fontScCB, SIGNAL(toggled(bool)),
815 this, SLOT(fontScToggled(bool)));
816 connect(fontModule->fontOsfCB, SIGNAL(clicked()),
817 this, SLOT(change_adaptor()));
818 connect(fontModule->fontOsfCB, SIGNAL(toggled(bool)),
819 this, SLOT(fontOsfToggled(bool)));
821 fontModule->fontencLE->setValidator(new NoNewLineValidator(
822 fontModule->fontencLE));
823 fontModule->cjkFontLE->setValidator(new NoNewLineValidator(
824 fontModule->cjkFontLE));
828 fontModule->fontsizeCO->addItem(qt_("Default"));
829 fontModule->fontsizeCO->addItem(qt_("10"));
830 fontModule->fontsizeCO->addItem(qt_("11"));
831 fontModule->fontsizeCO->addItem(qt_("12"));
833 fontModule->fontencCO->addItem(qt_("Default"), QString("global"));
834 fontModule->fontencCO->addItem(qt_("Custom"), QString("custom"));
835 fontModule->fontencCO->addItem(qt_("None (no fontenc)"), QString("default"));
837 for (int n = 0; GuiDocument::fontfamilies_gui[n][0]; ++n)
838 fontModule->fontsDefaultCO->addItem(
839 qt_(GuiDocument::fontfamilies_gui[n]));
841 if (!LaTeXFeatures::isAvailable("fontspec"))
842 fontModule->osFontsCB->setToolTip(
843 qt_("Use OpenType and TrueType fonts directly (requires XeTeX or LuaTeX)\n"
844 "You need to install the package \"fontspec\" to use this feature"));
848 pageLayoutModule = new UiWidget<Ui::PageLayoutUi>;
849 connect(pageLayoutModule->papersizeCO, SIGNAL(activated(int)),
850 this, SLOT(papersizeChanged(int)));
851 connect(pageLayoutModule->papersizeCO, SIGNAL(activated(int)),
852 this, SLOT(papersizeChanged(int)));
853 connect(pageLayoutModule->portraitRB, SIGNAL(clicked()),
854 this, SLOT(change_adaptor()));
855 connect(pageLayoutModule->papersizeCO, SIGNAL(activated(int)),
856 this, SLOT(change_adaptor()));
857 connect(pageLayoutModule->paperheightLE, SIGNAL(textChanged(const QString &)),
858 this, SLOT(change_adaptor()));
859 connect(pageLayoutModule->paperwidthLE, SIGNAL(textChanged(const QString &)),
860 this, SLOT(change_adaptor()));
861 connect(pageLayoutModule->paperwidthUnitCO, SIGNAL(activated(int)),
862 this, SLOT(change_adaptor()));
863 connect(pageLayoutModule->paperheightUnitCO, SIGNAL(activated(int)),
864 this, SLOT(change_adaptor()));
865 connect(pageLayoutModule->portraitRB, SIGNAL(clicked()),
866 this, SLOT(change_adaptor()));
867 connect(pageLayoutModule->landscapeRB, SIGNAL(clicked()),
868 this, SLOT(change_adaptor()));
869 connect(pageLayoutModule->facingPagesCB, SIGNAL(clicked()),
870 this, SLOT(change_adaptor()));
871 connect(pageLayoutModule->pagestyleCO, SIGNAL(activated(int)),
872 this, SLOT(change_adaptor()));
874 pageLayoutModule->pagestyleCO->addItem(qt_("Default"));
875 pageLayoutModule->pagestyleCO->addItem(qt_("empty"));
876 pageLayoutModule->pagestyleCO->addItem(qt_("plain"));
877 pageLayoutModule->pagestyleCO->addItem(qt_("headings"));
878 pageLayoutModule->pagestyleCO->addItem(qt_("fancy"));
879 bc().addCheckedLineEdit(pageLayoutModule->paperheightLE,
880 pageLayoutModule->paperheightL);
881 bc().addCheckedLineEdit(pageLayoutModule->paperwidthLE,
882 pageLayoutModule->paperwidthL);
884 QComboBox * cb = pageLayoutModule->papersizeCO;
885 cb->addItem(qt_("Default"));
886 cb->addItem(qt_("Custom"));
887 cb->addItem(qt_("US letter"));
888 cb->addItem(qt_("US legal"));
889 cb->addItem(qt_("US executive"));
890 cb->addItem(qt_("A0"));
891 cb->addItem(qt_("A1"));
892 cb->addItem(qt_("A2"));
893 cb->addItem(qt_("A3"));
894 cb->addItem(qt_("A4"));
895 cb->addItem(qt_("A5"));
896 cb->addItem(qt_("A6"));
897 cb->addItem(qt_("B0"));
898 cb->addItem(qt_("B1"));
899 cb->addItem(qt_("B2"));
900 cb->addItem(qt_("B3"));
901 cb->addItem(qt_("B4"));
902 cb->addItem(qt_("B5"));
903 cb->addItem(qt_("B6"));
904 cb->addItem(qt_("C0"));
905 cb->addItem(qt_("C1"));
906 cb->addItem(qt_("C2"));
907 cb->addItem(qt_("C3"));
908 cb->addItem(qt_("C4"));
909 cb->addItem(qt_("C5"));
910 cb->addItem(qt_("C6"));
911 cb->addItem(qt_("JIS B0"));
912 cb->addItem(qt_("JIS B1"));
913 cb->addItem(qt_("JIS B2"));
914 cb->addItem(qt_("JIS B3"));
915 cb->addItem(qt_("JIS B4"));
916 cb->addItem(qt_("JIS B5"));
917 cb->addItem(qt_("JIS B6"));
918 // remove the %-items from the unit choice
919 pageLayoutModule->paperwidthUnitCO->noPercents();
920 pageLayoutModule->paperheightUnitCO->noPercents();
921 pageLayoutModule->paperheightLE->setValidator(unsignedLengthValidator(
922 pageLayoutModule->paperheightLE));
923 pageLayoutModule->paperwidthLE->setValidator(unsignedLengthValidator(
924 pageLayoutModule->paperwidthLE));
928 marginsModule = new UiWidget<Ui::MarginsUi>;
929 connect(marginsModule->marginCB, SIGNAL(toggled(bool)),
930 this, SLOT(setCustomMargins(bool)));
931 connect(marginsModule->marginCB, SIGNAL(clicked()),
932 this, SLOT(change_adaptor()));
933 connect(marginsModule->topLE, SIGNAL(textChanged(QString)),
934 this, SLOT(change_adaptor()));
935 connect(marginsModule->topUnit, SIGNAL(activated(int)),
936 this, SLOT(change_adaptor()));
937 connect(marginsModule->bottomLE, SIGNAL(textChanged(QString)),
938 this, SLOT(change_adaptor()));
939 connect(marginsModule->bottomUnit, SIGNAL(activated(int)),
940 this, SLOT(change_adaptor()));
941 connect(marginsModule->innerLE, SIGNAL(textChanged(QString)),
942 this, SLOT(change_adaptor()));
943 connect(marginsModule->innerUnit, SIGNAL(activated(int)),
944 this, SLOT(change_adaptor()));
945 connect(marginsModule->outerLE, SIGNAL(textChanged(QString)),
946 this, SLOT(change_adaptor()));
947 connect(marginsModule->outerUnit, SIGNAL(activated(int)),
948 this, SLOT(change_adaptor()));
949 connect(marginsModule->headheightLE, SIGNAL(textChanged(QString)),
950 this, SLOT(change_adaptor()));
951 connect(marginsModule->headheightUnit, SIGNAL(activated(int)),
952 this, SLOT(change_adaptor()));
953 connect(marginsModule->headsepLE, SIGNAL(textChanged(QString)),
954 this, SLOT(change_adaptor()));
955 connect(marginsModule->headsepUnit, SIGNAL(activated(int)),
956 this, SLOT(change_adaptor()));
957 connect(marginsModule->footskipLE, SIGNAL(textChanged(QString)),
958 this, SLOT(change_adaptor()));
959 connect(marginsModule->footskipUnit, SIGNAL(activated(int)),
960 this, SLOT(change_adaptor()));
961 connect(marginsModule->columnsepLE, SIGNAL(textChanged(QString)),
962 this, SLOT(change_adaptor()));
963 connect(marginsModule->columnsepUnit, SIGNAL(activated(int)),
964 this, SLOT(change_adaptor()));
965 marginsModule->topLE->setValidator(unsignedLengthValidator(
966 marginsModule->topLE));
967 marginsModule->bottomLE->setValidator(unsignedLengthValidator(
968 marginsModule->bottomLE));
969 marginsModule->innerLE->setValidator(unsignedLengthValidator(
970 marginsModule->innerLE));
971 marginsModule->outerLE->setValidator(unsignedLengthValidator(
972 marginsModule->outerLE));
973 marginsModule->headsepLE->setValidator(unsignedLengthValidator(
974 marginsModule->headsepLE));
975 marginsModule->headheightLE->setValidator(unsignedLengthValidator(
976 marginsModule->headheightLE));
977 marginsModule->footskipLE->setValidator(unsignedLengthValidator(
978 marginsModule->footskipLE));
979 marginsModule->columnsepLE->setValidator(unsignedLengthValidator(
980 marginsModule->columnsepLE));
982 bc().addCheckedLineEdit(marginsModule->topLE,
983 marginsModule->topL);
984 bc().addCheckedLineEdit(marginsModule->bottomLE,
985 marginsModule->bottomL);
986 bc().addCheckedLineEdit(marginsModule->innerLE,
987 marginsModule->innerL);
988 bc().addCheckedLineEdit(marginsModule->outerLE,
989 marginsModule->outerL);
990 bc().addCheckedLineEdit(marginsModule->headsepLE,
991 marginsModule->headsepL);
992 bc().addCheckedLineEdit(marginsModule->headheightLE,
993 marginsModule->headheightL);
994 bc().addCheckedLineEdit(marginsModule->footskipLE,
995 marginsModule->footskipL);
996 bc().addCheckedLineEdit(marginsModule->columnsepLE,
997 marginsModule->columnsepL);
1001 langModule = new UiWidget<Ui::LanguageUi>;
1002 connect(langModule->languageCO, SIGNAL(activated(int)),
1003 this, SLOT(change_adaptor()));
1004 connect(langModule->languageCO, SIGNAL(activated(int)),
1005 this, SLOT(languageChanged(int)));
1006 connect(langModule->defaultencodingRB, SIGNAL(clicked()),
1007 this, SLOT(change_adaptor()));
1008 connect(langModule->otherencodingRB, SIGNAL(clicked()),
1009 this, SLOT(change_adaptor()));
1010 connect(langModule->encodingCO, SIGNAL(activated(int)),
1011 this, SLOT(change_adaptor()));
1012 connect(langModule->quoteStyleCO, SIGNAL(activated(int)),
1013 this, SLOT(change_adaptor()));
1014 connect(langModule->languagePackageCO, SIGNAL(activated(int)),
1015 this, SLOT(change_adaptor()));
1016 connect(langModule->languagePackageLE, SIGNAL(textChanged(QString)),
1017 this, SLOT(change_adaptor()));
1018 connect(langModule->languagePackageCO, SIGNAL(currentIndexChanged(int)),
1019 this, SLOT(languagePackageChanged(int)));
1021 langModule->languagePackageLE->setValidator(new NoNewLineValidator(
1022 langModule->languagePackageLE));
1024 QAbstractItemModel * language_model = guiApp->languageModel();
1025 // FIXME: it would be nice if sorting was enabled/disabled via a checkbox.
1026 language_model->sort(0);
1027 langModule->languageCO->setModel(language_model);
1028 langModule->languageCO->setModelColumn(0);
1030 // Always put the default encoding in the first position.
1031 langModule->encodingCO->addItem(qt_("Language Default (no inputenc)"));
1032 QStringList encodinglist;
1033 Encodings::const_iterator it = encodings.begin();
1034 Encodings::const_iterator const end = encodings.end();
1035 for (; it != end; ++it)
1037 encodinglist.append(qt_(it->guiName()));
1038 encodinglist.sort();
1039 langModule->encodingCO->addItems(encodinglist);
1041 langModule->quoteStyleCO->addItem(
1042 qt_("``text''"),InsetQuotes::EnglishQuotes);
1043 langModule->quoteStyleCO->addItem(
1044 qt_("''text''"), InsetQuotes::SwedishQuotes);
1045 langModule->quoteStyleCO->addItem
1046 (qt_(",,text``"), InsetQuotes::GermanQuotes);
1047 langModule->quoteStyleCO->addItem(
1048 qt_(",,text''"), InsetQuotes::PolishQuotes);
1049 langModule->quoteStyleCO->addItem(
1050 qt_("<<text>>"), InsetQuotes::FrenchQuotes);
1051 langModule->quoteStyleCO->addItem(
1052 qt_(">>text<<"), InsetQuotes::DanishQuotes);
1054 langModule->languagePackageCO->addItem(
1055 qt_("Default"), toqstr("default"));
1056 langModule->languagePackageCO->addItem(
1057 qt_("Automatic"), toqstr("auto"));
1058 langModule->languagePackageCO->addItem(
1059 qt_("Always Babel"), toqstr("babel"));
1060 langModule->languagePackageCO->addItem(
1061 qt_("Custom"), toqstr("custom"));
1062 langModule->languagePackageCO->addItem(
1063 qt_("None[[language package]]"), toqstr("none"));
1067 colorModule = new UiWidget<Ui::ColorUi>;
1068 connect(colorModule->fontColorPB, SIGNAL(clicked()),
1069 this, SLOT(changeFontColor()));
1070 connect(colorModule->delFontColorTB, SIGNAL(clicked()),
1071 this, SLOT(deleteFontColor()));
1072 connect(colorModule->noteFontColorPB, SIGNAL(clicked()),
1073 this, SLOT(changeNoteFontColor()));
1074 connect(colorModule->delNoteFontColorTB, SIGNAL(clicked()),
1075 this, SLOT(deleteNoteFontColor()));
1076 connect(colorModule->backgroundPB, SIGNAL(clicked()),
1077 this, SLOT(changeBackgroundColor()));
1078 connect(colorModule->delBackgroundTB, SIGNAL(clicked()),
1079 this, SLOT(deleteBackgroundColor()));
1080 connect(colorModule->boxBackgroundPB, SIGNAL(clicked()),
1081 this, SLOT(changeBoxBackgroundColor()));
1082 connect(colorModule->delBoxBackgroundTB, SIGNAL(clicked()),
1083 this, SLOT(deleteBoxBackgroundColor()));
1087 numberingModule = new UiWidget<Ui::NumberingUi>;
1088 connect(numberingModule->depthSL, SIGNAL(valueChanged(int)),
1089 this, SLOT(change_adaptor()));
1090 connect(numberingModule->tocSL, SIGNAL(valueChanged(int)),
1091 this, SLOT(change_adaptor()));
1092 connect(numberingModule->depthSL, SIGNAL(valueChanged(int)),
1093 this, SLOT(updateNumbering()));
1094 connect(numberingModule->tocSL, SIGNAL(valueChanged(int)),
1095 this, SLOT(updateNumbering()));
1096 numberingModule->tocTW->setColumnCount(3);
1097 numberingModule->tocTW->headerItem()->setText(0, qt_("Example"));
1098 numberingModule->tocTW->headerItem()->setText(1, qt_("Numbered"));
1099 numberingModule->tocTW->headerItem()->setText(2, qt_("Appears in TOC"));
1100 setSectionResizeMode(numberingModule->tocTW->header(), QHeaderView::ResizeToContents);
1103 biblioModule = new UiWidget<Ui::BiblioUi>;
1104 connect(biblioModule->citeDefaultRB, SIGNAL(toggled(bool)),
1105 this, SLOT(setNumerical(bool)));
1106 connect(biblioModule->citeJurabibRB, SIGNAL(toggled(bool)),
1107 this, SLOT(setAuthorYear(bool)));
1108 connect(biblioModule->citeNatbibRB, SIGNAL(toggled(bool)),
1109 biblioModule->citationStyleL, SLOT(setEnabled(bool)));
1110 connect(biblioModule->citeNatbibRB, SIGNAL(toggled(bool)),
1111 biblioModule->citeStyleCO, SLOT(setEnabled(bool)));
1112 connect(biblioModule->citeDefaultRB, SIGNAL(clicked()),
1113 this, SLOT(biblioChanged()));
1114 connect(biblioModule->citeNatbibRB, SIGNAL(clicked()),
1115 this, SLOT(biblioChanged()));
1116 connect(biblioModule->citeStyleCO, SIGNAL(activated(int)),
1117 this, SLOT(biblioChanged()));
1118 connect(biblioModule->citeJurabibRB, SIGNAL(clicked()),
1119 this, SLOT(biblioChanged()));
1120 connect(biblioModule->bibtopicCB, SIGNAL(clicked()),
1121 this, SLOT(biblioChanged()));
1122 connect(biblioModule->bibtexCO, SIGNAL(activated(int)),
1123 this, SLOT(bibtexChanged(int)));
1124 connect(biblioModule->bibtexOptionsLE, SIGNAL(textChanged(QString)),
1125 this, SLOT(biblioChanged()));
1126 connect(biblioModule->bibtexStyleLE, SIGNAL(textChanged(QString)),
1127 this, SLOT(biblioChanged()));
1129 biblioModule->bibtexOptionsLE->setValidator(new NoNewLineValidator(
1130 biblioModule->bibtexOptionsLE));
1131 biblioModule->bibtexStyleLE->setValidator(new NoNewLineValidator(
1132 biblioModule->bibtexStyleLE));
1134 biblioModule->citeStyleCO->addItem(qt_("Author-year"));
1135 biblioModule->citeStyleCO->addItem(qt_("Numerical"));
1136 biblioModule->citeStyleCO->setCurrentIndex(0);
1138 // NOTE: we do not provide "custom" here for security reasons!
1139 biblioModule->bibtexCO->clear();
1140 biblioModule->bibtexCO->addItem(qt_("Default"), QString("default"));
1141 for (set<string>::const_iterator it = lyxrc.bibtex_alternatives.begin();
1142 it != lyxrc.bibtex_alternatives.end(); ++it) {
1143 QString const command = toqstr(*it).left(toqstr(*it).indexOf(" "));
1144 biblioModule->bibtexCO->addItem(command, command);
1149 indicesModule = new GuiIndices;
1150 connect(indicesModule, SIGNAL(changed()),
1151 this, SLOT(change_adaptor()));
1155 mathsModule = new UiWidget<Ui::MathsUi>;
1156 QStringList headers;
1157 headers << qt_("Package") << qt_("Load automatically")
1158 << qt_("Load always") << qt_("Do not load");
1159 mathsModule->packagesTW->setHorizontalHeaderLabels(headers);
1160 setSectionResizeMode(mathsModule->packagesTW->horizontalHeader(), QHeaderView::Stretch);
1161 map<string, string> const & packages = BufferParams::auto_packages();
1162 mathsModule->packagesTW->setRowCount(packages.size());
1164 for (map<string, string>::const_iterator it = packages.begin();
1165 it != packages.end(); ++it) {
1166 docstring const package = from_ascii(it->first);
1167 QString autoTooltip = qt_(it->second);
1168 QString alwaysTooltip;
1169 if (package == "amsmath")
1171 qt_("The AMS LaTeX packages are always used");
1173 alwaysTooltip = toqstr(bformat(
1174 _("The LaTeX package %1$s is always used"),
1176 QString neverTooltip;
1177 if (package == "amsmath")
1179 qt_("The AMS LaTeX packages are never used");
1181 neverTooltip = toqstr(bformat(
1182 _("The LaTeX package %1$s is never used"),
1184 QRadioButton * autoRB = new QRadioButton(mathsModule);
1185 QRadioButton * alwaysRB = new QRadioButton(mathsModule);
1186 QRadioButton * neverRB = new QRadioButton(mathsModule);
1187 QButtonGroup * packageGroup = new QButtonGroup(mathsModule);
1188 packageGroup->addButton(autoRB);
1189 packageGroup->addButton(alwaysRB);
1190 packageGroup->addButton(neverRB);
1191 autoRB->setToolTip(autoTooltip);
1192 alwaysRB->setToolTip(alwaysTooltip);
1193 neverRB->setToolTip(neverTooltip);
1194 QTableWidgetItem * pack = new QTableWidgetItem(toqstr(package));
1195 mathsModule->packagesTW->setItem(i, 0, pack);
1196 mathsModule->packagesTW->setCellWidget(i, 1, autoRB);
1197 mathsModule->packagesTW->setCellWidget(i, 2, alwaysRB);
1198 mathsModule->packagesTW->setCellWidget(i, 3, neverRB);
1200 connect(autoRB, SIGNAL(clicked()),
1201 this, SLOT(change_adaptor()));
1202 connect(alwaysRB, SIGNAL(clicked()),
1203 this, SLOT(change_adaptor()));
1204 connect(neverRB, SIGNAL(clicked()),
1205 this, SLOT(change_adaptor()));
1208 connect(mathsModule->allPackagesAutoPB, SIGNAL(clicked()),
1209 this, SLOT(allPackagesAuto()));
1210 connect(mathsModule->allPackagesAlwaysPB, SIGNAL(clicked()),
1211 this, SLOT(allPackagesAlways()));
1212 connect(mathsModule->allPackagesNotPB, SIGNAL(clicked()),
1213 this, SLOT(allPackagesNot()));
1214 connect(mathsModule->allPackagesAutoPB, SIGNAL(clicked()),
1215 this, SLOT(change_adaptor()));
1216 connect(mathsModule->allPackagesAlwaysPB, SIGNAL(clicked()),
1217 this, SLOT(change_adaptor()));
1218 connect(mathsModule->allPackagesNotPB, SIGNAL(clicked()),
1219 this, SLOT(change_adaptor()));
1223 latexModule = new UiWidget<Ui::LaTeXUi>;
1224 connect(latexModule->optionsLE, SIGNAL(textChanged(QString)),
1225 this, SLOT(change_adaptor()));
1226 connect(latexModule->defaultOptionsCB, SIGNAL(clicked()),
1227 this, SLOT(change_adaptor()));
1228 connect(latexModule->psdriverCO, SIGNAL(activated(int)),
1229 this, SLOT(change_adaptor()));
1230 connect(latexModule->classCO, SIGNAL(activated(int)),
1231 this, SLOT(classChanged_adaptor()));
1232 connect(latexModule->classCO, SIGNAL(activated(int)),
1233 this, SLOT(change_adaptor()));
1234 connect(latexModule->layoutPB, SIGNAL(clicked()),
1235 this, SLOT(browseLayout()));
1236 connect(latexModule->layoutPB, SIGNAL(clicked()),
1237 this, SLOT(change_adaptor()));
1238 connect(latexModule->childDocGB, SIGNAL(clicked()),
1239 this, SLOT(change_adaptor()));
1240 connect(latexModule->childDocLE, SIGNAL(textChanged(QString)),
1241 this, SLOT(change_adaptor()));
1242 connect(latexModule->childDocPB, SIGNAL(clicked()),
1243 this, SLOT(browseMaster()));
1244 connect(latexModule->suppressDateCB, SIGNAL(clicked()),
1245 this, SLOT(change_adaptor()));
1246 connect(latexModule->refstyleCB, SIGNAL(clicked()),
1247 this, SLOT(change_adaptor()));
1249 latexModule->optionsLE->setValidator(new NoNewLineValidator(
1250 latexModule->optionsLE));
1251 latexModule->childDocLE->setValidator(new NoNewLineValidator(
1252 latexModule->childDocLE));
1254 // postscript drivers
1255 for (int n = 0; tex_graphics[n][0]; ++n) {
1256 QString enc = qt_(tex_graphics_gui[n]);
1257 latexModule->psdriverCO->addItem(enc);
1260 LayoutFileList const & bcl = LayoutFileList::get();
1261 vector<LayoutFileIndex> classList = bcl.classList();
1262 sort(classList.begin(), classList.end(), less_textclass_avail_desc());
1264 vector<LayoutFileIndex>::const_iterator cit = classList.begin();
1265 vector<LayoutFileIndex>::const_iterator cen = classList.end();
1266 for (int i = 0; cit != cen; ++cit, ++i) {
1267 LayoutFile const & tc = bcl[*cit];
1268 bool const available = tc.isTeXClassAvailable();
1269 docstring const guiname = translateIfPossible(from_utf8(tc.description()));
1270 // tooltip sensu "KOMA-Script Article [Class 'scrartcl']"
1271 QString tooltip = toqstr(bformat(_("%1$s [Class '%2$s']"), guiname, from_utf8(tc.latexname())));
1273 docstring const output_type = (tc.outputType() == lyx::DOCBOOK) ? _("DocBook") : _("LaTeX");
1274 tooltip += '\n' + toqstr(wrap(bformat(_("Class not found by LyX. "
1275 "Please check if you have the matching %1$s class "
1276 "and all required packages (%2$s) installed."),
1277 output_type, from_utf8(tc.prerequisites(", ")))));
1279 latexModule->classCO->addItemSort(toqstr(tc.name()),
1281 toqstr(translateIfPossible(from_utf8(tc.category()))),
1283 true, true, true, available);
1288 branchesModule = new GuiBranches;
1289 connect(branchesModule, SIGNAL(changed()),
1290 this, SLOT(change_adaptor()));
1291 connect(branchesModule, SIGNAL(renameBranches(docstring const &, docstring const &)),
1292 this, SLOT(branchesRename(docstring const &, docstring const &)));
1293 connect(branchesModule, SIGNAL(okPressed()), this, SLOT(slotOK()));
1294 updateUnknownBranches();
1298 preambleModule = new PreambleModule;
1299 connect(preambleModule, SIGNAL(changed()),
1300 this, SLOT(change_adaptor()));
1302 localLayout = new LocalLayout;
1303 connect(localLayout, SIGNAL(changed()),
1304 this, SLOT(change_adaptor()));
1308 bulletsModule = new BulletsModule;
1309 connect(bulletsModule, SIGNAL(changed()),
1310 this, SLOT(change_adaptor()));
1314 modulesModule = new UiWidget<Ui::ModulesUi>;
1315 modulesModule->availableLV->header()->setVisible(false);
1316 setSectionResizeMode(modulesModule->availableLV->header(), QHeaderView::ResizeToContents);
1317 modulesModule->availableLV->header()->setStretchLastSection(false);
1319 new ModuleSelectionManager(modulesModule->availableLV,
1320 modulesModule->selectedLV,
1321 modulesModule->addPB, modulesModule->deletePB,
1322 modulesModule->upPB, modulesModule->downPB,
1323 availableModel(), selectedModel(), this);
1324 connect(selectionManager, SIGNAL(updateHook()),
1325 this, SLOT(updateModuleInfo()));
1326 connect(selectionManager, SIGNAL(selectionChanged()),
1327 this, SLOT(modulesChanged()));
1331 pdfSupportModule = new UiWidget<Ui::PDFSupportUi>;
1332 connect(pdfSupportModule->use_hyperrefGB, SIGNAL(toggled(bool)),
1333 this, SLOT(change_adaptor()));
1334 connect(pdfSupportModule->titleLE, SIGNAL(textChanged(QString)),
1335 this, SLOT(change_adaptor()));
1336 connect(pdfSupportModule->authorLE, SIGNAL(textChanged(QString)),
1337 this, SLOT(change_adaptor()));
1338 connect(pdfSupportModule->subjectLE, SIGNAL(textChanged(QString)),
1339 this, SLOT(change_adaptor()));
1340 connect(pdfSupportModule->keywordsLE, SIGNAL(textChanged(QString)),
1341 this, SLOT(change_adaptor()));
1342 connect(pdfSupportModule->bookmarksGB, SIGNAL(toggled(bool)),
1343 this, SLOT(change_adaptor()));
1344 connect(pdfSupportModule->bookmarksnumberedCB, SIGNAL(toggled(bool)),
1345 this, SLOT(change_adaptor()));
1346 connect(pdfSupportModule->bookmarksopenGB, SIGNAL(toggled(bool)),
1347 this, SLOT(change_adaptor()));
1348 connect(pdfSupportModule->bookmarksopenlevelSB, SIGNAL(valueChanged(int)),
1349 this, SLOT(change_adaptor()));
1350 connect(pdfSupportModule->breaklinksCB, SIGNAL(toggled(bool)),
1351 this, SLOT(change_adaptor()));
1352 connect(pdfSupportModule->pdfborderCB, SIGNAL(toggled(bool)),
1353 this, SLOT(change_adaptor()));
1354 connect(pdfSupportModule->colorlinksCB, SIGNAL(toggled(bool)),
1355 this, SLOT(change_adaptor()));
1356 connect(pdfSupportModule->backrefCO, SIGNAL(activated(int)),
1357 this, SLOT(change_adaptor()));
1358 connect(pdfSupportModule->pdfusetitleCB, SIGNAL(toggled(bool)),
1359 this, SLOT(change_adaptor()));
1360 connect(pdfSupportModule->fullscreenCB, SIGNAL(toggled(bool)),
1361 this, SLOT(change_adaptor()));
1362 connect(pdfSupportModule->optionsLE, SIGNAL(textChanged(QString)),
1363 this, SLOT(change_adaptor()));
1365 pdfSupportModule->titleLE->setValidator(new NoNewLineValidator(
1366 pdfSupportModule->titleLE));
1367 pdfSupportModule->authorLE->setValidator(new NoNewLineValidator(
1368 pdfSupportModule->authorLE));
1369 pdfSupportModule->subjectLE->setValidator(new NoNewLineValidator(
1370 pdfSupportModule->subjectLE));
1371 pdfSupportModule->keywordsLE->setValidator(new NoNewLineValidator(
1372 pdfSupportModule->keywordsLE));
1373 pdfSupportModule->optionsLE->setValidator(new NoNewLineValidator(
1374 pdfSupportModule->optionsLE));
1376 for (int i = 0; backref_opts[i][0]; ++i)
1377 pdfSupportModule->backrefCO->addItem(qt_(backref_opts_gui[i]));
1381 floatModule = new FloatPlacement;
1382 connect(floatModule, SIGNAL(changed()),
1383 this, SLOT(change_adaptor()));
1387 listingsModule = new UiWidget<Ui::ListingsSettingsUi>;
1388 connect(listingsModule->listingsED, SIGNAL(textChanged()),
1389 this, SLOT(change_adaptor()));
1390 connect(listingsModule->bypassCB, SIGNAL(clicked()),
1391 this, SLOT(change_adaptor()));
1392 connect(listingsModule->bypassCB, SIGNAL(clicked()),
1393 this, SLOT(setListingsMessage()));
1394 connect(listingsModule->listingsED, SIGNAL(textChanged()),
1395 this, SLOT(setListingsMessage()));
1396 listingsModule->listingsTB->setPlainText(
1397 qt_("Input listings parameters below. Enter ? for a list of parameters."));
1401 docPS->addPanel(latexModule, N_("Document Class"));
1402 docPS->addPanel(masterChildModule, N_("Child Documents"));
1403 docPS->addPanel(modulesModule, N_("Modules"));
1404 docPS->addPanel(localLayout, N_("Local Layout"));
1405 docPS->addPanel(fontModule, N_("Fonts"));
1406 docPS->addPanel(textLayoutModule, N_("Text Layout"));
1407 docPS->addPanel(pageLayoutModule, N_("Page Layout"));
1408 docPS->addPanel(marginsModule, N_("Page Margins"));
1409 docPS->addPanel(langModule, N_("Language"));
1410 docPS->addPanel(colorModule, N_("Colors"));
1411 docPS->addPanel(numberingModule, N_("Numbering & TOC"));
1412 docPS->addPanel(biblioModule, N_("Bibliography"));
1413 docPS->addPanel(indicesModule, N_("Indexes"));
1414 docPS->addPanel(pdfSupportModule, N_("PDF Properties"));
1415 docPS->addPanel(mathsModule, N_("Math Options"));
1416 docPS->addPanel(floatModule, N_("Float Placement"));
1417 docPS->addPanel(listingsModule, N_("Listings[[inset]]"));
1418 docPS->addPanel(bulletsModule, N_("Bullets"));
1419 docPS->addPanel(branchesModule, N_("Branches"));
1420 docPS->addPanel(outputModule, N_("Output"));
1421 docPS->addPanel(preambleModule, N_("LaTeX Preamble"));
1422 docPS->setCurrentPanel("Document Class");
1423 // FIXME: hack to work around resizing bug in Qt >= 4.2
1424 // bug verified with Qt 4.2.{0-3} (JSpitzm)
1425 #if QT_VERSION >= 0x040200
1426 docPS->updateGeometry();
1431 void GuiDocument::saveDefaultClicked()
1437 void GuiDocument::useDefaultsClicked()
1443 void GuiDocument::change_adaptor()
1445 nonModuleChanged_ = true;
1450 void GuiDocument::includeonlyClicked(QTreeWidgetItem * item, int)
1455 string child = fromqstr(item->text(0));
1459 if (std::find(includeonlys_.begin(),
1460 includeonlys_.end(), child) != includeonlys_.end())
1461 includeonlys_.remove(child);
1463 includeonlys_.push_back(child);
1465 updateIncludeonlys();
1470 QString GuiDocument::validateListingsParameters()
1472 // use a cache here to avoid repeated validation
1473 // of the same parameters
1475 static string param_cache;
1476 static QString msg_cache;
1478 if (listingsModule->bypassCB->isChecked())
1481 string params = fromqstr(listingsModule->listingsED->toPlainText());
1482 if (params != param_cache) {
1483 param_cache = params;
1484 msg_cache = toqstr(InsetListingsParams(params).validate());
1490 void GuiDocument::setListingsMessage()
1493 static bool isOK = true;
1494 QString msg = validateListingsParameters();
1495 if (msg.isEmpty()) {
1499 // listingsTB->setTextColor("black");
1500 listingsModule->listingsTB->setPlainText(
1501 qt_("Input listings parameters below. "
1502 "Enter ? for a list of parameters."));
1505 // listingsTB->setTextColor("red");
1506 listingsModule->listingsTB->setPlainText(msg);
1511 void GuiDocument::setLSpacing(int item)
1513 textLayoutModule->lspacingLE->setEnabled(item == 3);
1517 void GuiDocument::setIndent(int item)
1519 bool const enable = (item == 1);
1520 textLayoutModule->indentLE->setEnabled(enable);
1521 textLayoutModule->indentLengthCO->setEnabled(enable);
1522 textLayoutModule->skipLE->setEnabled(false);
1523 textLayoutModule->skipLengthCO->setEnabled(false);
1528 void GuiDocument::enableIndent(bool indent)
1530 textLayoutModule->skipLE->setEnabled(!indent);
1531 textLayoutModule->skipLengthCO->setEnabled(!indent);
1533 setIndent(textLayoutModule->indentCO->currentIndex());
1537 void GuiDocument::setSkip(int item)
1539 bool const enable = (item == 3);
1540 textLayoutModule->skipLE->setEnabled(enable);
1541 textLayoutModule->skipLengthCO->setEnabled(enable);
1546 void GuiDocument::enableSkip(bool skip)
1548 textLayoutModule->indentLE->setEnabled(!skip);
1549 textLayoutModule->indentLengthCO->setEnabled(!skip);
1551 setSkip(textLayoutModule->skipCO->currentIndex());
1555 void GuiDocument::setMargins()
1557 bool const extern_geometry =
1558 documentClass().provides("geometry");
1559 marginsModule->marginCB->setEnabled(!extern_geometry);
1560 if (extern_geometry) {
1561 marginsModule->marginCB->setChecked(false);
1562 setCustomMargins(true);
1564 marginsModule->marginCB->setChecked(!bp_.use_geometry);
1565 setCustomMargins(!bp_.use_geometry);
1570 void GuiDocument::papersizeChanged(int paper_size)
1572 setCustomPapersize(paper_size == 1);
1576 void GuiDocument::setCustomPapersize(bool custom)
1578 pageLayoutModule->paperwidthL->setEnabled(custom);
1579 pageLayoutModule->paperwidthLE->setEnabled(custom);
1580 pageLayoutModule->paperwidthUnitCO->setEnabled(custom);
1581 pageLayoutModule->paperheightL->setEnabled(custom);
1582 pageLayoutModule->paperheightLE->setEnabled(custom);
1583 pageLayoutModule->paperheightLE->setFocus();
1584 pageLayoutModule->paperheightUnitCO->setEnabled(custom);
1588 void GuiDocument::setColSep()
1590 setCustomMargins(marginsModule->marginCB->checkState() == Qt::Checked);
1594 void GuiDocument::setCustomMargins(bool custom)
1596 marginsModule->topL->setEnabled(!custom);
1597 marginsModule->topLE->setEnabled(!custom);
1598 marginsModule->topUnit->setEnabled(!custom);
1600 marginsModule->bottomL->setEnabled(!custom);
1601 marginsModule->bottomLE->setEnabled(!custom);
1602 marginsModule->bottomUnit->setEnabled(!custom);
1604 marginsModule->innerL->setEnabled(!custom);
1605 marginsModule->innerLE->setEnabled(!custom);
1606 marginsModule->innerUnit->setEnabled(!custom);
1608 marginsModule->outerL->setEnabled(!custom);
1609 marginsModule->outerLE->setEnabled(!custom);
1610 marginsModule->outerUnit->setEnabled(!custom);
1612 marginsModule->headheightL->setEnabled(!custom);
1613 marginsModule->headheightLE->setEnabled(!custom);
1614 marginsModule->headheightUnit->setEnabled(!custom);
1616 marginsModule->headsepL->setEnabled(!custom);
1617 marginsModule->headsepLE->setEnabled(!custom);
1618 marginsModule->headsepUnit->setEnabled(!custom);
1620 marginsModule->footskipL->setEnabled(!custom);
1621 marginsModule->footskipLE->setEnabled(!custom);
1622 marginsModule->footskipUnit->setEnabled(!custom);
1624 bool const enableColSep = !custom &&
1625 textLayoutModule->twoColumnCB->checkState() == Qt::Checked;
1626 marginsModule->columnsepL->setEnabled(enableColSep);
1627 marginsModule->columnsepLE->setEnabled(enableColSep);
1628 marginsModule->columnsepUnit->setEnabled(enableColSep);
1632 void GuiDocument::changeBackgroundColor()
1634 QColor const & newColor = QColorDialog::getColor(
1635 rgb2qcolor(set_backgroundcolor), asQWidget());
1636 if (!newColor.isValid())
1638 // set the button color and text
1639 colorModule->backgroundPB->setStyleSheet(
1640 colorButtonStyleSheet(newColor));
1641 colorModule->backgroundPB->setText(qt_("&Change..."));
1643 set_backgroundcolor = rgbFromHexName(fromqstr(newColor.name()));
1644 is_backgroundcolor = true;
1649 void GuiDocument::deleteBackgroundColor()
1651 // set the button color back to default by setting an empty StyleSheet
1652 colorModule->backgroundPB->setStyleSheet(QLatin1String(""));
1653 // change button text
1654 colorModule->backgroundPB->setText(qt_("&Default..."));
1655 // save default color (white)
1656 set_backgroundcolor = rgbFromHexName("#ffffff");
1657 is_backgroundcolor = false;
1662 void GuiDocument::changeFontColor()
1664 QColor const & newColor = QColorDialog::getColor(
1665 rgb2qcolor(set_fontcolor), asQWidget());
1666 if (!newColor.isValid())
1668 // set the button color and text
1669 colorModule->fontColorPB->setStyleSheet(
1670 colorButtonStyleSheet(newColor));
1671 colorModule->fontColorPB->setText(qt_("&Change..."));
1673 set_fontcolor = rgbFromHexName(fromqstr(newColor.name()));
1674 is_fontcolor = true;
1679 void GuiDocument::deleteFontColor()
1681 // set the button color back to default by setting an empty StyleSheet
1682 colorModule->fontColorPB->setStyleSheet(QLatin1String(""));
1683 // change button text
1684 colorModule->fontColorPB->setText(qt_("&Default..."));
1685 // save default color (black)
1686 set_fontcolor = rgbFromHexName("#000000");
1687 is_fontcolor = false;
1692 void GuiDocument::changeNoteFontColor()
1694 QColor const & newColor = QColorDialog::getColor(
1695 rgb2qcolor(set_notefontcolor), asQWidget());
1696 if (!newColor.isValid())
1698 // set the button color
1699 colorModule->noteFontColorPB->setStyleSheet(
1700 colorButtonStyleSheet(newColor));
1702 set_notefontcolor = rgbFromHexName(fromqstr(newColor.name()));
1707 void GuiDocument::deleteNoteFontColor()
1709 // set the button color back to pref
1710 theApp()->getRgbColor(Color_greyedouttext, set_notefontcolor);
1711 colorModule->noteFontColorPB->setStyleSheet(
1712 colorButtonStyleSheet(rgb2qcolor(set_notefontcolor)));
1717 void GuiDocument::changeBoxBackgroundColor()
1719 QColor const & newColor = QColorDialog::getColor(
1720 rgb2qcolor(set_boxbgcolor), asQWidget());
1721 if (!newColor.isValid())
1723 // set the button color
1724 colorModule->boxBackgroundPB->setStyleSheet(
1725 colorButtonStyleSheet(newColor));
1727 set_boxbgcolor = rgbFromHexName(fromqstr(newColor.name()));
1732 void GuiDocument::deleteBoxBackgroundColor()
1734 // set the button color back to pref
1735 theApp()->getRgbColor(Color_shadedbg, set_boxbgcolor);
1736 colorModule->boxBackgroundPB->setStyleSheet(
1737 colorButtonStyleSheet(rgb2qcolor(set_boxbgcolor)));
1742 void GuiDocument::languageChanged(int i)
1744 // some languages only work with polyglossia/XeTeX
1745 Language const * lang = lyx::languages.getLanguage(
1746 fromqstr(langModule->languageCO->itemData(i).toString()));
1747 if (lang->babel().empty() && !lang->polyglossia().empty()) {
1748 // If we force to switch fontspec on, store
1749 // current state (#8717)
1750 if (fontModule->osFontsCB->isEnabled())
1751 forced_fontspec_activation =
1752 !fontModule->osFontsCB->isChecked();
1753 fontModule->osFontsCB->setChecked(true);
1754 fontModule->osFontsCB->setEnabled(false);
1757 fontModule->osFontsCB->setEnabled(true);
1758 // If we have forced to switch fontspec on,
1759 // restore previous state (#8717)
1760 if (forced_fontspec_activation)
1761 fontModule->osFontsCB->setChecked(false);
1762 forced_fontspec_activation = false;
1765 // set appropriate quotation mark style
1766 if (!lang->quoteStyle().empty()) {
1767 langModule->quoteStyleCO->setCurrentIndex(
1768 bp_.getQuoteStyle(lang->quoteStyle()));
1773 void GuiDocument::osFontsChanged(bool nontexfonts)
1775 bool const tex_fonts = !nontexfonts;
1777 // store default format
1778 QString const dformat = outputModule->defaultFormatCO->itemData(
1779 outputModule->defaultFormatCO->currentIndex()).toString();
1780 updateDefaultFormat();
1781 // try to restore default format
1782 int index = outputModule->defaultFormatCO->findData(dformat);
1783 // set to default if format is not found
1786 outputModule->defaultFormatCO->setCurrentIndex(index);
1787 langModule->encodingCO->setEnabled(tex_fonts &&
1788 !langModule->defaultencodingRB->isChecked());
1789 langModule->defaultencodingRB->setEnabled(tex_fonts);
1790 langModule->otherencodingRB->setEnabled(tex_fonts);
1792 fontModule->fontsDefaultCO->setEnabled(tex_fonts);
1793 fontModule->fontsDefaultLA->setEnabled(tex_fonts);
1794 fontModule->cjkFontLE->setEnabled(tex_fonts);
1795 fontModule->cjkFontLA->setEnabled(tex_fonts);
1797 updateFontOptions();
1799 fontModule->fontencLA->setEnabled(tex_fonts);
1800 fontModule->fontencCO->setEnabled(tex_fonts);
1802 fontModule->fontencLE->setEnabled(false);
1804 fontencChanged(fontModule->fontencCO->currentIndex());
1808 void GuiDocument::mathFontChanged(int)
1810 updateFontOptions();
1814 void GuiDocument::fontOsfToggled(bool state)
1816 if (fontModule->osFontsCB->isChecked())
1818 QString font = fontModule->fontsRomanCO->itemData(
1819 fontModule->fontsRomanCO->currentIndex()).toString();
1820 if (hasMonolithicExpertSet(font))
1821 fontModule->fontScCB->setChecked(state);
1825 void GuiDocument::fontScToggled(bool state)
1827 if (fontModule->osFontsCB->isChecked())
1829 QString font = fontModule->fontsRomanCO->itemData(
1830 fontModule->fontsRomanCO->currentIndex()).toString();
1831 if (hasMonolithicExpertSet(font))
1832 fontModule->fontOsfCB->setChecked(state);
1836 void GuiDocument::updateFontOptions()
1838 bool const tex_fonts = !fontModule->osFontsCB->isChecked();
1841 font = fontModule->fontsSansCO->itemData(
1842 fontModule->fontsSansCO->currentIndex()).toString();
1843 bool scaleable = providesScale(font);
1844 fontModule->scaleSansSB->setEnabled(scaleable);
1845 fontModule->scaleSansLA->setEnabled(scaleable);
1847 font = fontModule->fontsTypewriterCO->itemData(
1848 fontModule->fontsTypewriterCO->currentIndex()).toString();
1849 scaleable = providesScale(font);
1850 fontModule->scaleTypewriterSB->setEnabled(scaleable);
1851 fontModule->scaleTypewriterLA->setEnabled(scaleable);
1853 font = fontModule->fontsRomanCO->itemData(
1854 fontModule->fontsRomanCO->currentIndex()).toString();
1855 fontModule->fontScCB->setEnabled(providesSC(font));
1856 fontModule->fontOsfCB->setEnabled(providesOSF(font));
1857 updateMathFonts(font);
1861 void GuiDocument::updateFontsize(string const & items, string const & sel)
1863 fontModule->fontsizeCO->clear();
1864 fontModule->fontsizeCO->addItem(qt_("Default"));
1866 for (int n = 0; !token(items,'|',n).empty(); ++n)
1867 fontModule->fontsizeCO->
1868 addItem(toqstr(token(items,'|',n)));
1870 for (int n = 0; n < fontModule->fontsizeCO->count(); ++n) {
1871 if (fromqstr(fontModule->fontsizeCO->itemText(n)) == sel) {
1872 fontModule->fontsizeCO->setCurrentIndex(n);
1879 bool GuiDocument::ot1() const
1881 QString const fontenc =
1882 fontModule->fontencCO->itemData(fontModule->fontencCO->currentIndex()).toString();
1883 return (fontenc == "default"
1884 || (fontenc == "global" && (lyxrc.fontenc == "default" || lyxrc.fontenc == "OT1"))
1885 || (fontenc == "custom" && fontModule->fontencLE->text() == "OT1"));
1889 bool GuiDocument::completeFontset() const
1891 return (fontModule->fontsSansCO->itemData(
1892 fontModule->fontsSansCO->currentIndex()).toString() == "default"
1893 && fontModule->fontsSansCO->itemData(
1894 fontModule->fontsSansCO->currentIndex()).toString() == "default");
1898 bool GuiDocument::noMathFont() const
1900 return (fontModule->fontsMathCO->itemData(
1901 fontModule->fontsMathCO->currentIndex()).toString() == "default");
1905 void GuiDocument::updateTexFonts()
1907 LaTeXFonts::TexFontMap texfontmap = theLaTeXFonts().getLaTeXFonts();
1909 LaTeXFonts::TexFontMap::const_iterator it = texfontmap.begin();
1910 LaTeXFonts::TexFontMap::const_iterator end = texfontmap.end();
1911 for (; it != end; ++it) {
1912 LaTeXFont lf = it->second;
1913 if (lf.name().empty()) {
1914 LYXERR0("Error: Unnamed font: " << it->first);
1917 docstring const family = lf.family();
1918 docstring guiname = translateIfPossible(lf.guiname());
1919 if (!lf.available(ot1(), noMathFont()))
1920 guiname += _(" (not installed)");
1922 rmfonts_.insert(toqstr(guiname), toqstr(it->first));
1923 else if (family == "sf")
1924 sffonts_.insert(toqstr(guiname), toqstr(it->first));
1925 else if (family == "tt")
1926 ttfonts_.insert(toqstr(guiname), toqstr(it->first));
1927 else if (family == "math")
1928 mathfonts_.insert(toqstr(guiname), toqstr(it->first));
1933 void GuiDocument::updateFontlist()
1935 fontModule->fontsRomanCO->clear();
1936 fontModule->fontsSansCO->clear();
1937 fontModule->fontsTypewriterCO->clear();
1938 fontModule->fontsMathCO->clear();
1940 // With fontspec (XeTeX, LuaTeX), we have access to all system fonts, but not the LaTeX fonts
1941 if (fontModule->osFontsCB->isChecked()) {
1942 fontModule->fontsRomanCO->addItem(qt_("Default"), QString("default"));
1943 fontModule->fontsSansCO->addItem(qt_("Default"), QString("default"));
1944 fontModule->fontsTypewriterCO->addItem(qt_("Default"), QString("default"));
1945 QString unimath = qt_("Non-TeX Fonts Default");
1946 if (!LaTeXFeatures::isAvailable("unicode-math"))
1947 unimath += qt_(" (not available)");
1948 fontModule->fontsMathCO->addItem(qt_("Class Default (TeX Fonts)"), QString("auto"));
1949 fontModule->fontsMathCO->addItem(unimath, QString("default"));
1951 QFontDatabase fontdb;
1952 QStringList families(fontdb.families());
1953 for (QStringList::Iterator it = families.begin(); it != families.end(); ++it) {
1954 fontModule->fontsRomanCO->addItem(*it, *it);
1955 fontModule->fontsSansCO->addItem(*it, *it);
1956 fontModule->fontsTypewriterCO->addItem(*it, *it);
1961 if (rmfonts_.empty())
1964 fontModule->fontsRomanCO->addItem(qt_("Default"), QString("default"));
1965 QMap<QString, QString>::const_iterator rmi = rmfonts_.constBegin();
1966 while (rmi != rmfonts_.constEnd()) {
1967 fontModule->fontsRomanCO->addItem(rmi.key(), rmi.value());
1971 fontModule->fontsSansCO->addItem(qt_("Default"), QString("default"));
1972 QMap<QString, QString>::const_iterator sfi = sffonts_.constBegin();
1973 while (sfi != sffonts_.constEnd()) {
1974 fontModule->fontsSansCO->addItem(sfi.key(), sfi.value());
1978 fontModule->fontsTypewriterCO->addItem(qt_("Default"), QString("default"));
1979 QMap<QString, QString>::const_iterator tti = ttfonts_.constBegin();
1980 while (tti != ttfonts_.constEnd()) {
1981 fontModule->fontsTypewriterCO->addItem(tti.key(), tti.value());
1985 fontModule->fontsMathCO->addItem(qt_("Automatic"), QString("auto"));
1986 fontModule->fontsMathCO->addItem(qt_("Class Default"), QString("default"));
1987 QMap<QString, QString>::const_iterator mmi = mathfonts_.constBegin();
1988 while (mmi != mathfonts_.constEnd()) {
1989 fontModule->fontsMathCO->addItem(mmi.key(), mmi.value());
1995 void GuiDocument::fontencChanged(int item)
1997 fontModule->fontencLE->setEnabled(
1998 fontModule->fontencCO->itemData(item).toString() == "custom");
1999 // The availability of TeX fonts depends on the font encoding
2001 updateFontOptions();
2005 void GuiDocument::updateMathFonts(QString const & rm)
2007 if (fontModule->osFontsCB->isChecked())
2009 QString const math =
2010 fontModule->fontsMathCO->itemData(fontModule->fontsMathCO->currentIndex()).toString();
2011 int const i = fontModule->fontsMathCO->findData("default");
2012 if (providesNoMath(rm) && i == -1)
2013 fontModule->fontsMathCO->insertItem(1, qt_("Class Default"), QString("default"));
2014 else if (!providesNoMath(rm) && i != -1) {
2015 int const c = fontModule->fontsMathCO->currentIndex();
2016 fontModule->fontsMathCO->removeItem(i);
2018 fontModule->fontsMathCO->setCurrentIndex(0);
2023 void GuiDocument::romanChanged(int item)
2025 if (fontModule->osFontsCB->isChecked())
2027 QString const font =
2028 fontModule->fontsRomanCO->itemData(item).toString();
2029 fontModule->fontScCB->setEnabled(providesSC(font));
2030 fontModule->fontOsfCB->setEnabled(providesOSF(font));
2031 updateMathFonts(font);
2035 void GuiDocument::sansChanged(int item)
2037 if (fontModule->osFontsCB->isChecked())
2039 QString const font =
2040 fontModule->fontsSansCO->itemData(item).toString();
2041 bool scaleable = providesScale(font);
2042 fontModule->scaleSansSB->setEnabled(scaleable);
2043 fontModule->scaleSansLA->setEnabled(scaleable);
2047 void GuiDocument::ttChanged(int item)
2049 if (fontModule->osFontsCB->isChecked())
2051 QString const font =
2052 fontModule->fontsTypewriterCO->itemData(item).toString();
2053 bool scaleable = providesScale(font);
2054 fontModule->scaleTypewriterSB->setEnabled(scaleable);
2055 fontModule->scaleTypewriterLA->setEnabled(scaleable);
2059 void GuiDocument::updatePagestyle(string const & items, string const & sel)
2062 pageLayoutModule->pagestyleCO->clear();
2063 pageLayoutModule->pagestyleCO->addItem(qt_("Default"));
2065 for (int n = 0; !token(items, '|', n).empty(); ++n) {
2066 string style = token(items, '|', n);
2067 QString style_gui = qt_(style);
2068 pagestyles.push_back(pair<string, QString>(style, style_gui));
2069 pageLayoutModule->pagestyleCO->addItem(style_gui);
2072 if (sel == "default") {
2073 pageLayoutModule->pagestyleCO->setCurrentIndex(0);
2079 for (size_t i = 0; i < pagestyles.size(); ++i)
2080 if (pagestyles[i].first == sel)
2081 nn = pageLayoutModule->pagestyleCO->findText(pagestyles[i].second);
2084 pageLayoutModule->pagestyleCO->setCurrentIndex(nn);
2088 void GuiDocument::browseLayout()
2090 QString const label1 = qt_("Layouts|#o#O");
2091 QString const dir1 = toqstr(lyxrc.document_path);
2092 QStringList const filter(qt_("LyX Layout (*.layout)"));
2093 QString file = browseRelToParent(QString(), bufferFilePath(),
2094 qt_("Local layout file"), filter, false,
2097 if (!file.endsWith(".layout"))
2100 FileName layoutFile = support::makeAbsPath(fromqstr(file),
2101 fromqstr(bufferFilePath()));
2103 int const ret = Alert::prompt(_("Local layout file"),
2104 _("The layout file you have selected is a local layout\n"
2105 "file, not one in the system or user directory.\n"
2106 "Your document will not work with this layout if you\n"
2107 "move the layout file to a different directory."),
2108 1, 1, _("&Set Layout"), _("&Cancel"));
2112 // load the layout file
2113 LayoutFileList & bcl = LayoutFileList::get();
2114 string classname = layoutFile.onlyFileName();
2115 // this will update an existing layout if that layout has been loaded before.
2116 LayoutFileIndex name = support::onlyFileName(bcl.addLocalLayout(
2117 classname.substr(0, classname.size() - 7),
2118 layoutFile.onlyPath().absFileName()));
2121 Alert::error(_("Error"),
2122 _("Unable to read local layout file."));
2126 const_cast<Buffer &>(buffer()).setLayoutPos(layoutFile.onlyPath().absFileName());
2128 // do not trigger classChanged if there is no change.
2129 if (latexModule->classCO->currentText() == toqstr(name))
2133 bool const avail = latexModule->classCO->set(toqstr(name));
2135 LayoutFile const & tc = bcl[name];
2136 docstring const guiname = translateIfPossible(from_utf8(tc.description()));
2137 // tooltip sensu "KOMA-Script Article [Class 'scrartcl']"
2138 QString tooltip = toqstr(bformat(_("%1$s [Class '%2$s']"), guiname, from_utf8(tc.latexname())));
2139 tooltip += '\n' + qt_("This is a local layout file.");
2140 latexModule->classCO->addItemSort(toqstr(tc.name()), toqstr(guiname),
2141 toqstr(translateIfPossible(from_utf8(tc.category()))),
2143 true, true, true, true);
2144 latexModule->classCO->set(toqstr(name));
2151 void GuiDocument::browseMaster()
2153 QString const title = qt_("Select master document");
2154 QString const dir1 = toqstr(lyxrc.document_path);
2155 QString const old = latexModule->childDocLE->text();
2156 QString const docpath = toqstr(support::onlyPath(buffer().absFileName()));
2157 QStringList const filter(qt_("LyX Files (*.lyx)"));
2158 QString file = browseRelToSub(old, docpath, title, filter, false,
2159 qt_("Documents|#o#O"), toqstr(lyxrc.document_path));
2161 if (!file.isEmpty())
2162 latexModule->childDocLE->setText(file);
2166 void GuiDocument::classChanged_adaptor()
2168 const_cast<Buffer &>(buffer()).setLayoutPos(string());
2173 void GuiDocument::classChanged()
2175 int idx = latexModule->classCO->currentIndex();
2178 string const classname = fromqstr(latexModule->classCO->getData(idx));
2180 if (applyPB->isEnabled()) {
2181 int const ret = Alert::prompt(_("Unapplied changes"),
2182 _("Some changes in the dialog were not yet applied.\n"
2183 "If you do not apply now, they will be lost after this action."),
2184 1, 1, _("&Apply"), _("&Dismiss"));
2189 // We load the TextClass as soon as it is selected. This is
2190 // necessary so that other options in the dialog can be updated
2191 // according to the new class. Note, however, that, if you use
2192 // the scroll wheel when sitting on the combo box, we'll load a
2193 // lot of TextClass objects very quickly....
2194 if (!bp_.setBaseClass(classname)) {
2195 Alert::error(_("Error"), _("Unable to set document class."));
2198 if (lyxrc.auto_reset_options)
2199 bp_.useClassDefaults();
2201 // With the introduction of modules came a distinction between the base
2202 // class and the document class. The former corresponds to the main layout
2203 // file; the latter is that plus the modules (or the document-specific layout,
2204 // or whatever else there could be). Our parameters come from the document
2205 // class. So when we set the base class, we also need to recreate the document
2206 // class. Otherwise, we still have the old one.
2207 bp_.makeDocumentClass();
2212 void GuiDocument::languagePackageChanged(int i)
2214 langModule->languagePackageLE->setEnabled(
2215 langModule->languagePackageCO->itemData(i).toString() == "custom");
2219 void GuiDocument::biblioChanged()
2221 biblioChanged_ = true;
2226 void GuiDocument::bibtexChanged(int n)
2228 biblioModule->bibtexOptionsLE->setEnabled(
2229 biblioModule->bibtexCO->itemData(n).toString() != "default");
2234 void GuiDocument::setAuthorYear(bool authoryear)
2237 biblioModule->citeStyleCO->setCurrentIndex(0);
2242 void GuiDocument::setNumerical(bool numerical)
2245 biblioModule->citeStyleCO->setCurrentIndex(1);
2250 void GuiDocument::updateEngineType(string const & items, CiteEngineType const & sel)
2252 engine_types_.clear();
2256 for (int n = 0; !token(items, '|', n).empty(); ++n) {
2258 string style = token(items, '|', n);
2259 engine_types_.push_back(style);
2263 case ENGINE_TYPE_AUTHORYEAR:
2264 biblioModule->citeStyleCO->setCurrentIndex(0);
2266 case ENGINE_TYPE_NUMERICAL:
2267 case ENGINE_TYPE_DEFAULT:
2268 biblioModule->citeStyleCO->setCurrentIndex(1);
2272 biblioModule->citationStyleL->setEnabled(nn > 1);
2273 biblioModule->citeStyleCO->setEnabled(nn > 1);
2278 // If the textclass allows only one of authoryear or numerical,
2279 // we have no choice but to force that engine type.
2280 if (engine_types_[0] == "authoryear")
2281 biblioModule->citeStyleCO->setCurrentIndex(0);
2283 biblioModule->citeStyleCO->setCurrentIndex(1);
2289 // both of these should take a vector<docstring>
2291 // This is an insanely complicated attempt to make this sort of thing
2292 // work with RTL languages.
2293 docstring formatStrVec(vector<string> const & v, docstring const & s)
2295 //this mess formats the list as "v[0], v[1], ..., [s] v[n]"
2299 return translateIfPossible(from_utf8(v[0]));
2300 if (v.size() == 2) {
2301 docstring retval = _("%1$s and %2$s");
2302 retval = subst(retval, _("and"), s);
2303 return bformat(retval, translateIfPossible(from_utf8(v[0])),
2304 translateIfPossible(from_utf8(v[1])));
2306 // The idea here is to format all but the last two items...
2307 int const vSize = v.size();
2308 docstring t2 = _("%1$s, %2$s");
2309 docstring retval = translateIfPossible(from_utf8(v[0]));
2310 for (int i = 1; i < vSize - 2; ++i)
2311 retval = bformat(t2, retval, translateIfPossible(from_utf8(v[i])));
2312 //...and then to plug them, and the last two, into this schema
2313 docstring t = _("%1$s, %2$s, and %3$s");
2314 t = subst(t, _("and"), s);
2315 return bformat(t, retval, translateIfPossible(from_utf8(v[vSize - 2])),
2316 translateIfPossible(from_utf8(v[vSize - 1])));
2319 vector<string> idsToNames(vector<string> const & idList)
2321 vector<string> retval;
2322 vector<string>::const_iterator it = idList.begin();
2323 vector<string>::const_iterator end = idList.end();
2324 for (; it != end; ++it) {
2325 LyXModule const * const mod = theModuleList[*it];
2327 retval.push_back(to_utf8(bformat(_("%1$s (unavailable)"),
2328 translateIfPossible(from_utf8(*it)))));
2330 retval.push_back(mod->getName());
2334 } // end anonymous namespace
2337 void GuiDocument::modulesToParams(BufferParams & bp)
2339 // update list of loaded modules
2340 bp.clearLayoutModules();
2341 int const srows = modules_sel_model_.rowCount();
2342 for (int i = 0; i < srows; ++i)
2343 bp.addLayoutModule(modules_sel_model_.getIDString(i));
2345 // update the list of removed modules
2346 bp.clearRemovedModules();
2347 LayoutModuleList const & reqmods = bp.baseClass()->defaultModules();
2348 list<string>::const_iterator rit = reqmods.begin();
2349 list<string>::const_iterator ren = reqmods.end();
2351 // check each of the default modules
2352 for (; rit != ren; ++rit) {
2353 list<string>::const_iterator mit = bp.getModules().begin();
2354 list<string>::const_iterator men = bp.getModules().end();
2356 for (; mit != men; ++mit) {
2363 // the module isn't present so must have been removed by the user
2364 bp.addRemovedModule(*rit);
2369 void GuiDocument::modulesChanged()
2371 modulesToParams(bp_);
2373 if (applyPB->isEnabled() && nonModuleChanged_) {
2374 int const ret = Alert::prompt(_("Unapplied changes"),
2375 _("Some changes in the dialog were not yet applied.\n"
2376 "If you do not apply now, they will be lost after this action."),
2377 1, 1, _("&Apply"), _("&Dismiss"));
2382 bp_.makeDocumentClass();
2388 void GuiDocument::updateModuleInfo()
2390 selectionManager->update();
2392 //Module description
2393 bool const focus_on_selected = selectionManager->selectedFocused();
2394 QAbstractItemView * lv;
2395 if (focus_on_selected)
2396 lv = modulesModule->selectedLV;
2398 lv = modulesModule->availableLV;
2399 if (lv->selectionModel()->selectedIndexes().isEmpty()) {
2400 modulesModule->infoML->document()->clear();
2403 QModelIndex const & idx = lv->selectionModel()->currentIndex();
2404 GuiIdListModel const & id_model =
2405 focus_on_selected ? modules_sel_model_ : modules_av_model_;
2406 string const modName = id_model.getIDString(idx.row());
2407 docstring desc = getModuleDescription(modName);
2409 LayoutModuleList const & provmods = bp_.baseClass()->providedModules();
2410 if (std::find(provmods.begin(), provmods.end(), modName) != provmods.end()) {
2413 desc += _("Module provided by document class.");
2416 docstring cat = getModuleCategory(modName);
2420 desc += bformat(_("Category: %1$s."), cat);
2423 vector<string> pkglist = getPackageList(modName);
2424 docstring pkgdesc = formatStrVec(pkglist, _("and"));
2425 if (!pkgdesc.empty()) {
2428 desc += bformat(_("Package(s) required: %1$s."), pkgdesc);
2431 pkglist = getRequiredList(modName);
2432 if (!pkglist.empty()) {
2433 vector<string> const reqdescs = idsToNames(pkglist);
2434 pkgdesc = formatStrVec(reqdescs, _("or"));
2437 desc += bformat(_("Modules required: %1$s."), pkgdesc);
2440 pkglist = getExcludedList(modName);
2441 if (!pkglist.empty()) {
2442 vector<string> const reqdescs = idsToNames(pkglist);
2443 pkgdesc = formatStrVec(reqdescs, _( "and"));
2446 desc += bformat(_("Modules excluded: %1$s."), pkgdesc);
2449 if (!isModuleAvailable(modName)) {
2452 desc += _("WARNING: Some required packages are unavailable!");
2455 modulesModule->infoML->document()->setPlainText(toqstr(desc));
2459 void GuiDocument::updateNumbering()
2461 DocumentClass const & tclass = documentClass();
2463 numberingModule->tocTW->setUpdatesEnabled(false);
2464 numberingModule->tocTW->clear();
2466 int const depth = numberingModule->depthSL->value();
2467 int const toc = numberingModule->tocSL->value();
2468 QString const no = qt_("No");
2469 QString const yes = qt_("Yes");
2470 QTreeWidgetItem * item = 0;
2472 DocumentClass::const_iterator lit = tclass.begin();
2473 DocumentClass::const_iterator len = tclass.end();
2474 for (; lit != len; ++lit) {
2475 int const toclevel = lit->toclevel;
2476 if (toclevel != Layout::NOT_IN_TOC && !lit->counter.empty()) {
2477 item = new QTreeWidgetItem(numberingModule->tocTW);
2478 item->setText(0, toqstr(translateIfPossible(lit->name())));
2479 item->setText(1, (toclevel <= depth) ? yes : no);
2480 item->setText(2, (toclevel <= toc) ? yes : no);
2484 numberingModule->tocTW->setUpdatesEnabled(true);
2485 numberingModule->tocTW->update();
2489 void GuiDocument::updateDefaultFormat()
2493 // make a copy in order to consider unapplied changes
2494 BufferParams param_copy = buffer().params();
2495 param_copy.useNonTeXFonts = fontModule->osFontsCB->isChecked();
2496 int const idx = latexModule->classCO->currentIndex();
2498 string const classname = fromqstr(latexModule->classCO->getData(idx));
2499 param_copy.setBaseClass(classname);
2500 param_copy.makeDocumentClass(true);
2502 outputModule->defaultFormatCO->blockSignals(true);
2503 outputModule->defaultFormatCO->clear();
2504 outputModule->defaultFormatCO->addItem(qt_("Default"),
2505 QVariant(QString("default")));
2506 typedef vector<Format const *> Formats;
2507 Formats formats = param_copy.exportableFormats(true);
2508 sort(formats.begin(), formats.end(), Format::formatSorter);
2509 Formats::const_iterator cit = formats.begin();
2510 Formats::const_iterator end = formats.end();
2511 for (; cit != end; ++cit)
2512 outputModule->defaultFormatCO->addItem(qt_((*cit)->prettyname()),
2513 QVariant(toqstr((*cit)->name())));
2514 outputModule->defaultFormatCO->blockSignals(false);
2518 bool GuiDocument::isChildIncluded(string const & child)
2520 if (includeonlys_.empty())
2522 return (std::find(includeonlys_.begin(),
2523 includeonlys_.end(), child) != includeonlys_.end());
2527 void GuiDocument::applyView()
2530 preambleModule->apply(bp_);
2531 localLayout->apply(bp_);
2534 bp_.suppress_date = latexModule->suppressDateCB->isChecked();
2535 bp_.use_refstyle = latexModule->refstyleCB->isChecked();
2538 if (biblioModule->citeNatbibRB->isChecked())
2539 bp_.setCiteEngine("natbib");
2540 else if (biblioModule->citeJurabibRB->isChecked())
2541 bp_.setCiteEngine("jurabib");
2542 if (biblioModule->citeDefaultRB->isChecked()) {
2543 bp_.setCiteEngine("basic");
2544 bp_.setCiteEngineType(ENGINE_TYPE_DEFAULT);
2547 if (biblioModule->citeStyleCO->currentIndex())
2548 bp_.setCiteEngineType(ENGINE_TYPE_NUMERICAL);
2550 bp_.setCiteEngineType(ENGINE_TYPE_AUTHORYEAR);
2553 biblioModule->bibtopicCB->isChecked();
2555 bp_.biblio_style = fromqstr(biblioModule->bibtexStyleLE->text());
2557 string const bibtex_command =
2558 fromqstr(biblioModule->bibtexCO->itemData(
2559 biblioModule->bibtexCO->currentIndex()).toString());
2560 string const bibtex_options =
2561 fromqstr(biblioModule->bibtexOptionsLE->text());
2562 if (bibtex_command == "default" || bibtex_options.empty())
2563 bp_.bibtex_command = bibtex_command;
2565 bp_.bibtex_command = bibtex_command + " " + bibtex_options;
2567 if (biblioChanged_) {
2568 buffer().invalidateBibinfoCache();
2569 buffer().removeBiblioTempFiles();
2573 indicesModule->apply(bp_);
2575 // language & quotes
2576 if (langModule->defaultencodingRB->isChecked()) {
2577 bp_.inputenc = "auto";
2579 int i = langModule->encodingCO->currentIndex();
2581 bp_.inputenc = "default";
2583 QString const enc_gui =
2584 langModule->encodingCO->currentText();
2585 Encodings::const_iterator it = encodings.begin();
2586 Encodings::const_iterator const end = encodings.end();
2588 for (; it != end; ++it) {
2589 if (qt_(it->guiName()) == enc_gui &&
2591 bp_.inputenc = it->name();
2597 // should not happen
2598 lyxerr << "GuiDocument::apply: Unknown encoding! Resetting to default" << endl;
2599 bp_.inputenc = "default";
2604 bp_.quotes_language = (InsetQuotes::QuoteLanguage) langModule->quoteStyleCO->itemData(
2605 langModule->quoteStyleCO->currentIndex()).toInt();
2607 QString const lang = langModule->languageCO->itemData(
2608 langModule->languageCO->currentIndex()).toString();
2609 bp_.language = lyx::languages.getLanguage(fromqstr(lang));
2611 QString const pack = langModule->languagePackageCO->itemData(
2612 langModule->languagePackageCO->currentIndex()).toString();
2613 if (pack == "custom")
2615 fromqstr(langModule->languagePackageLE->text());
2617 bp_.lang_package = fromqstr(pack);
2620 bp_.backgroundcolor = set_backgroundcolor;
2621 bp_.isbackgroundcolor = is_backgroundcolor;
2622 bp_.fontcolor = set_fontcolor;
2623 bp_.isfontcolor = is_fontcolor;
2624 bp_.notefontcolor = set_notefontcolor;
2625 bp_.boxbgcolor = set_boxbgcolor;
2628 if (bp_.documentClass().hasTocLevels()) {
2629 bp_.tocdepth = numberingModule->tocSL->value();
2630 bp_.secnumdepth = numberingModule->depthSL->value();
2634 bp_.user_defined_bullet(0) = bulletsModule->bullet(0);
2635 bp_.user_defined_bullet(1) = bulletsModule->bullet(1);
2636 bp_.user_defined_bullet(2) = bulletsModule->bullet(2);
2637 bp_.user_defined_bullet(3) = bulletsModule->bullet(3);
2640 bp_.graphics_driver =
2641 tex_graphics[latexModule->psdriverCO->currentIndex()];
2644 int idx = latexModule->classCO->currentIndex();
2646 string const classname = fromqstr(latexModule->classCO->getData(idx));
2647 bp_.setBaseClass(classname);
2651 modulesToParams(bp_);
2654 map<string, string> const & packages = BufferParams::auto_packages();
2655 for (map<string, string>::const_iterator it = packages.begin();
2656 it != packages.end(); ++it) {
2657 QTableWidgetItem * item = mathsModule->packagesTW->findItems(toqstr(it->first), Qt::MatchExactly)[0];
2660 int row = mathsModule->packagesTW->row(item);
2661 QRadioButton * rb = (QRadioButton*)mathsModule->packagesTW->cellWidget(row, 1);
2662 if (rb->isChecked()) {
2663 bp_.use_package(it->first, BufferParams::package_auto);
2666 rb = (QRadioButton*)mathsModule->packagesTW->cellWidget(row, 2);
2667 if (rb->isChecked()) {
2668 bp_.use_package(it->first, BufferParams::package_on);
2671 rb = (QRadioButton*)mathsModule->packagesTW->cellWidget(row, 3);
2672 if (rb->isChecked())
2673 bp_.use_package(it->first, BufferParams::package_off);
2677 if (pageLayoutModule->pagestyleCO->currentIndex() == 0)
2678 bp_.pagestyle = "default";
2680 QString style_gui = pageLayoutModule->pagestyleCO->currentText();
2681 for (size_t i = 0; i != pagestyles.size(); ++i)
2682 if (pagestyles[i].second == style_gui)
2683 bp_.pagestyle = pagestyles[i].first;
2687 switch (textLayoutModule->lspacingCO->currentIndex()) {
2689 bp_.spacing().set(Spacing::Single);
2692 bp_.spacing().set(Spacing::Onehalf);
2695 bp_.spacing().set(Spacing::Double);
2698 string s = widgetToDoubleStr(textLayoutModule->lspacingLE);
2700 bp_.spacing().set(Spacing::Single);
2702 bp_.spacing().set(Spacing::Other, s);
2707 if (textLayoutModule->twoColumnCB->isChecked())
2712 bp_.justification = textLayoutModule->justCB->isChecked();
2714 if (textLayoutModule->indentRB->isChecked()) {
2715 // if paragraphs are separated by an indentation
2716 bp_.paragraph_separation = BufferParams::ParagraphIndentSeparation;
2717 switch (textLayoutModule->indentCO->currentIndex()) {
2719 bp_.setIndentation(HSpace(HSpace::DEFAULT));
2722 HSpace indent = HSpace(
2723 widgetsToLength(textLayoutModule->indentLE,
2724 textLayoutModule->indentLengthCO)
2726 bp_.setIndentation(indent);
2730 // this should never happen
2731 bp_.setIndentation(HSpace(HSpace::DEFAULT));
2735 // if paragraphs are separated by a skip
2736 bp_.paragraph_separation = BufferParams::ParagraphSkipSeparation;
2737 switch (textLayoutModule->skipCO->currentIndex()) {
2739 bp_.setDefSkip(VSpace(VSpace::SMALLSKIP));
2742 bp_.setDefSkip(VSpace(VSpace::MEDSKIP));
2745 bp_.setDefSkip(VSpace(VSpace::BIGSKIP));
2750 widgetsToLength(textLayoutModule->skipLE,
2751 textLayoutModule->skipLengthCO)
2757 // this should never happen
2758 bp_.setDefSkip(VSpace(VSpace::MEDSKIP));
2764 fromqstr(latexModule->optionsLE->text());
2766 bp_.use_default_options =
2767 latexModule->defaultOptionsCB->isChecked();
2769 if (latexModule->childDocGB->isChecked())
2771 fromqstr(latexModule->childDocLE->text());
2773 bp_.master = string();
2776 bp_.clearIncludedChildren();
2777 if (masterChildModule->includeonlyRB->isChecked()) {
2778 list<string>::const_iterator it = includeonlys_.begin();
2779 for (; it != includeonlys_.end() ; ++it) {
2780 bp_.addIncludedChildren(*it);
2783 bp_.maintain_unincluded_children =
2784 masterChildModule->maintainAuxCB->isChecked();
2787 bp_.float_placement = floatModule->get();
2790 // text should have passed validation
2791 bp_.listings_params =
2792 InsetListingsParams(fromqstr(listingsModule->listingsED->toPlainText())).params();
2795 bp_.default_output_format = fromqstr(outputModule->defaultFormatCO->itemData(
2796 outputModule->defaultFormatCO->currentIndex()).toString());
2798 bool const nontexfonts = fontModule->osFontsCB->isChecked();
2799 bp_.useNonTeXFonts = nontexfonts;
2801 bp_.output_sync = outputModule->outputsyncCB->isChecked();
2803 bp_.output_sync_macro = fromqstr(outputModule->synccustomCB->currentText());
2805 int mathfmt = outputModule->mathoutCB->currentIndex();
2808 BufferParams::MathOutput const mo =
2809 static_cast<BufferParams::MathOutput>(mathfmt);
2810 bp_.html_math_output = mo;
2811 bp_.html_be_strict = outputModule->strictCB->isChecked();
2812 bp_.html_css_as_file = outputModule->cssCB->isChecked();
2813 bp_.html_math_img_scale = outputModule->mathimgSB->value();
2814 bp_.display_pixel_ratio = theGuiApp()->pixelRatio();
2818 fromqstr(fontModule->fontsRomanCO->
2819 itemData(fontModule->fontsRomanCO->currentIndex()).toString());
2822 fromqstr(fontModule->fontsSansCO->
2823 itemData(fontModule->fontsSansCO->currentIndex()).toString());
2825 bp_.fonts_typewriter =
2826 fromqstr(fontModule->fontsTypewriterCO->
2827 itemData(fontModule->fontsTypewriterCO->currentIndex()).toString());
2830 fromqstr(fontModule->fontsMathCO->
2831 itemData(fontModule->fontsMathCO->currentIndex()).toString());
2833 QString const fontenc =
2834 fontModule->fontencCO->itemData(fontModule->fontencCO->currentIndex()).toString();
2835 if (fontenc == "custom")
2836 bp_.fontenc = fromqstr(fontModule->fontencLE->text());
2838 bp_.fontenc = fromqstr(fontenc);
2841 fromqstr(fontModule->cjkFontLE->text());
2843 bp_.fonts_sans_scale = fontModule->scaleSansSB->value();
2845 bp_.fonts_typewriter_scale = fontModule->scaleTypewriterSB->value();
2847 bp_.fonts_expert_sc = fontModule->fontScCB->isChecked();
2849 bp_.fonts_old_figures = fontModule->fontOsfCB->isChecked();
2852 bp_.fonts_default_family = "default";
2854 bp_.fonts_default_family = GuiDocument::fontfamilies[
2855 fontModule->fontsDefaultCO->currentIndex()];
2857 if (fontModule->fontsizeCO->currentIndex() == 0)
2858 bp_.fontsize = "default";
2861 fromqstr(fontModule->fontsizeCO->currentText());
2864 bp_.papersize = PAPER_SIZE(
2865 pageLayoutModule->papersizeCO->currentIndex());
2867 bp_.paperwidth = widgetsToLength(pageLayoutModule->paperwidthLE,
2868 pageLayoutModule->paperwidthUnitCO);
2870 bp_.paperheight = widgetsToLength(pageLayoutModule->paperheightLE,
2871 pageLayoutModule->paperheightUnitCO);
2873 if (pageLayoutModule->facingPagesCB->isChecked())
2874 bp_.sides = TwoSides;
2876 bp_.sides = OneSide;
2878 if (pageLayoutModule->landscapeRB->isChecked())
2879 bp_.orientation = ORIENTATION_LANDSCAPE;
2881 bp_.orientation = ORIENTATION_PORTRAIT;
2884 bp_.use_geometry = !marginsModule->marginCB->isChecked();
2886 Ui::MarginsUi const * m = marginsModule;
2888 bp_.leftmargin = widgetsToLength(m->innerLE, m->innerUnit);
2889 bp_.topmargin = widgetsToLength(m->topLE, m->topUnit);
2890 bp_.rightmargin = widgetsToLength(m->outerLE, m->outerUnit);
2891 bp_.bottommargin = widgetsToLength(m->bottomLE, m->bottomUnit);
2892 bp_.headheight = widgetsToLength(m->headheightLE, m->headheightUnit);
2893 bp_.headsep = widgetsToLength(m->headsepLE, m->headsepUnit);
2894 bp_.footskip = widgetsToLength(m->footskipLE, m->footskipUnit);
2895 bp_.columnsep = widgetsToLength(m->columnsepLE, m->columnsepUnit);
2898 branchesModule->apply(bp_);
2901 PDFOptions & pdf = bp_.pdfoptions();
2902 pdf.use_hyperref = pdfSupportModule->use_hyperrefGB->isChecked();
2903 pdf.title = fromqstr(pdfSupportModule->titleLE->text());
2904 pdf.author = fromqstr(pdfSupportModule->authorLE->text());
2905 pdf.subject = fromqstr(pdfSupportModule->subjectLE->text());
2906 pdf.keywords = fromqstr(pdfSupportModule->keywordsLE->text());
2908 pdf.bookmarks = pdfSupportModule->bookmarksGB->isChecked();
2909 pdf.bookmarksnumbered = pdfSupportModule->bookmarksnumberedCB->isChecked();
2910 pdf.bookmarksopen = pdfSupportModule->bookmarksopenGB->isChecked();
2911 pdf.bookmarksopenlevel = pdfSupportModule->bookmarksopenlevelSB->value();
2913 pdf.breaklinks = pdfSupportModule->breaklinksCB->isChecked();
2914 pdf.pdfborder = pdfSupportModule->pdfborderCB->isChecked();
2915 pdf.pdfusetitle = pdfSupportModule->pdfusetitleCB->isChecked();
2916 pdf.colorlinks = pdfSupportModule->colorlinksCB->isChecked();
2918 backref_opts[pdfSupportModule->backrefCO->currentIndex()];
2919 if (pdfSupportModule->fullscreenCB->isChecked())
2920 pdf.pagemode = pdf.pagemode_fullscreen;
2922 pdf.pagemode.clear();
2923 pdf.quoted_options = pdf.quoted_options_check(
2924 fromqstr(pdfSupportModule->optionsLE->text()));
2927 nonModuleChanged_ = false;
2931 void GuiDocument::paramsToDialog()
2933 // set the default unit
2934 Length::UNIT const default_unit = Length::defaultUnit();
2937 preambleModule->update(bp_, id());
2938 localLayout->update(bp_, id());
2941 latexModule->suppressDateCB->setChecked(bp_.suppress_date);
2942 latexModule->refstyleCB->setChecked(bp_.use_refstyle);
2945 string const cite_engine = bp_.citeEngine().list().front();
2947 biblioModule->citeDefaultRB->setChecked(
2948 cite_engine == "basic");
2950 biblioModule->citeJurabibRB->setChecked(
2951 cite_engine == "jurabib");
2953 biblioModule->citeNatbibRB->setChecked(
2954 cite_engine == "natbib");
2956 biblioModule->citeStyleCO->setCurrentIndex(
2957 bp_.citeEngineType() & ENGINE_TYPE_NUMERICAL);
2959 updateEngineType(documentClass().opt_enginetype(),
2960 bp_.citeEngineType());
2962 biblioModule->bibtopicCB->setChecked(
2965 biblioModule->bibtexStyleLE->setText(toqstr(bp_.biblio_style));
2969 split(bp_.bibtex_command, command, ' ');
2971 int const bpos = biblioModule->bibtexCO->findData(toqstr(command));
2973 biblioModule->bibtexCO->setCurrentIndex(bpos);
2974 biblioModule->bibtexOptionsLE->setText(toqstr(options).trimmed());
2976 // We reset to default if we do not know the specified compiler
2977 // This is for security reasons
2978 biblioModule->bibtexCO->setCurrentIndex(
2979 biblioModule->bibtexCO->findData(toqstr("default")));
2980 biblioModule->bibtexOptionsLE->clear();
2982 biblioModule->bibtexOptionsLE->setEnabled(
2983 biblioModule->bibtexCO->currentIndex() != 0);
2985 biblioChanged_ = false;
2988 indicesModule->update(bp_);
2990 // language & quotes
2991 int const pos = langModule->languageCO->findData(toqstr(
2992 bp_.language->lang()));
2993 langModule->languageCO->setCurrentIndex(pos);
2995 langModule->quoteStyleCO->setCurrentIndex(
2996 bp_.quotes_language);
2998 bool default_enc = true;
2999 if (bp_.inputenc != "auto") {
3000 default_enc = false;
3001 if (bp_.inputenc == "default") {
3002 langModule->encodingCO->setCurrentIndex(0);
3005 Encodings::const_iterator it = encodings.begin();
3006 Encodings::const_iterator const end = encodings.end();
3007 for (; it != end; ++it) {
3008 if (it->name() == bp_.inputenc &&
3010 enc_gui = it->guiName();
3014 int const i = langModule->encodingCO->findText(
3017 langModule->encodingCO->setCurrentIndex(i);
3019 // unknown encoding. Set to default.
3023 langModule->defaultencodingRB->setChecked(default_enc);
3024 langModule->otherencodingRB->setChecked(!default_enc);
3026 int const p = langModule->languagePackageCO->findData(toqstr(bp_.lang_package));
3028 langModule->languagePackageCO->setCurrentIndex(
3029 langModule->languagePackageCO->findData("custom"));
3030 langModule->languagePackageLE->setText(toqstr(bp_.lang_package));
3032 langModule->languagePackageCO->setCurrentIndex(p);
3033 langModule->languagePackageLE->clear();
3037 if (bp_.isfontcolor) {
3038 colorModule->fontColorPB->setStyleSheet(
3039 colorButtonStyleSheet(rgb2qcolor(bp_.fontcolor)));
3041 set_fontcolor = bp_.fontcolor;
3042 is_fontcolor = bp_.isfontcolor;
3044 colorModule->noteFontColorPB->setStyleSheet(
3045 colorButtonStyleSheet(rgb2qcolor(bp_.notefontcolor)));
3046 set_notefontcolor = bp_.notefontcolor;
3048 if (bp_.isbackgroundcolor) {
3049 colorModule->backgroundPB->setStyleSheet(
3050 colorButtonStyleSheet(rgb2qcolor(bp_.backgroundcolor)));
3052 set_backgroundcolor = bp_.backgroundcolor;
3053 is_backgroundcolor = bp_.isbackgroundcolor;
3055 colorModule->boxBackgroundPB->setStyleSheet(
3056 colorButtonStyleSheet(rgb2qcolor(bp_.boxbgcolor)));
3057 set_boxbgcolor = bp_.boxbgcolor;
3060 int const min_toclevel = documentClass().min_toclevel();
3061 int const max_toclevel = documentClass().max_toclevel();
3062 if (documentClass().hasTocLevels()) {
3063 numberingModule->setEnabled(true);
3064 numberingModule->depthSL->setMinimum(min_toclevel - 1);
3065 numberingModule->depthSL->setMaximum(max_toclevel);
3066 numberingModule->depthSL->setValue(bp_.secnumdepth);
3067 numberingModule->tocSL->setMaximum(min_toclevel - 1);
3068 numberingModule->tocSL->setMaximum(max_toclevel);
3069 numberingModule->tocSL->setValue(bp_.tocdepth);
3072 numberingModule->setEnabled(false);
3073 numberingModule->tocTW->clear();
3077 bulletsModule->setBullet(0, bp_.user_defined_bullet(0));
3078 bulletsModule->setBullet(1, bp_.user_defined_bullet(1));
3079 bulletsModule->setBullet(2, bp_.user_defined_bullet(2));
3080 bulletsModule->setBullet(3, bp_.user_defined_bullet(3));
3081 bulletsModule->init();
3084 int nitem = findToken(tex_graphics, bp_.graphics_driver);
3086 latexModule->psdriverCO->setCurrentIndex(nitem);
3089 map<string, string> const & packages = BufferParams::auto_packages();
3090 for (map<string, string>::const_iterator it = packages.begin();
3091 it != packages.end(); ++it) {
3092 QTableWidgetItem * item = mathsModule->packagesTW->findItems(toqstr(it->first), Qt::MatchExactly)[0];
3095 int row = mathsModule->packagesTW->row(item);
3096 switch (bp_.use_package(it->first)) {
3097 case BufferParams::package_off: {
3098 QRadioButton * rb = (QRadioButton*)mathsModule->packagesTW->cellWidget(row, 3);
3099 rb->setChecked(true);
3102 case BufferParams::package_on: {
3103 QRadioButton * rb = (QRadioButton*)mathsModule->packagesTW->cellWidget(row, 2);
3104 rb->setChecked(true);
3107 case BufferParams::package_auto: {
3108 QRadioButton * rb = (QRadioButton*)mathsModule->packagesTW->cellWidget(row, 1);
3109 rb->setChecked(true);
3115 switch (bp_.spacing().getSpace()) {
3116 case Spacing::Other: nitem = 3; break;
3117 case Spacing::Double: nitem = 2; break;
3118 case Spacing::Onehalf: nitem = 1; break;
3119 case Spacing::Default: case Spacing::Single: nitem = 0; break;
3123 string const & layoutID = bp_.baseClassID();
3124 setLayoutComboByIDString(layoutID);
3126 updatePagestyle(documentClass().opt_pagestyle(),
3129 textLayoutModule->lspacingCO->setCurrentIndex(nitem);
3130 if (bp_.spacing().getSpace() == Spacing::Other) {
3131 doubleToWidget(textLayoutModule->lspacingLE,
3132 bp_.spacing().getValueAsString());
3136 if (bp_.paragraph_separation == BufferParams::ParagraphIndentSeparation) {
3137 textLayoutModule->indentRB->setChecked(true);
3138 string indentation = bp_.getIndentation().asLyXCommand();
3140 if (indentation != "default") {
3141 lengthToWidgets(textLayoutModule->indentLE,
3142 textLayoutModule->indentLengthCO,
3143 indentation, default_unit);
3146 textLayoutModule->indentCO->setCurrentIndex(indent);
3149 textLayoutModule->skipRB->setChecked(true);
3151 switch (bp_.getDefSkip().kind()) {
3152 case VSpace::SMALLSKIP:
3155 case VSpace::MEDSKIP:
3158 case VSpace::BIGSKIP:
3161 case VSpace::LENGTH:
3164 string const length = bp_.getDefSkip().asLyXCommand();
3165 lengthToWidgets(textLayoutModule->skipLE,
3166 textLayoutModule->skipLengthCO,
3167 length, default_unit);
3174 textLayoutModule->skipCO->setCurrentIndex(skip);
3178 textLayoutModule->twoColumnCB->setChecked(
3180 textLayoutModule->justCB->setChecked(bp_.justification);
3182 if (!bp_.options.empty()) {
3183 latexModule->optionsLE->setText(
3184 toqstr(bp_.options));
3186 latexModule->optionsLE->setText(QString());
3190 latexModule->defaultOptionsCB->setChecked(
3191 bp_.use_default_options);
3192 updateSelectedModules();
3193 selectionManager->updateProvidedModules(
3194 bp_.baseClass()->providedModules());
3195 selectionManager->updateExcludedModules(
3196 bp_.baseClass()->excludedModules());
3198 if (!documentClass().options().empty()) {
3199 latexModule->defaultOptionsLE->setText(
3200 toqstr(documentClass().options()));
3202 latexModule->defaultOptionsLE->setText(
3203 toqstr(_("[No options predefined]")));
3206 latexModule->defaultOptionsLE->setEnabled(
3207 bp_.use_default_options
3208 && !documentClass().options().empty());
3210 latexModule->defaultOptionsCB->setEnabled(
3211 !documentClass().options().empty());
3213 if (!bp_.master.empty()) {
3214 latexModule->childDocGB->setChecked(true);
3215 latexModule->childDocLE->setText(
3216 toqstr(bp_.master));
3218 latexModule->childDocLE->setText(QString());
3219 latexModule->childDocGB->setChecked(false);
3223 if (!bufferview() || !buffer().hasChildren()) {
3224 masterChildModule->childrenTW->clear();
3225 includeonlys_.clear();
3226 docPS->showPanel("Child Documents", false);
3227 if (docPS->isCurrentPanel("Child Documents"))
3228 docPS->setCurrentPanel("Document Class");
3230 docPS->showPanel("Child Documents", true);
3231 masterChildModule->setEnabled(true);
3232 includeonlys_ = bp_.getIncludedChildren();
3233 updateIncludeonlys();
3235 masterChildModule->maintainAuxCB->setChecked(
3236 bp_.maintain_unincluded_children);
3239 floatModule->set(bp_.float_placement);
3242 // break listings_params to multiple lines
3244 InsetListingsParams(bp_.listings_params).separatedParams();
3245 listingsModule->listingsED->setPlainText(toqstr(lstparams));
3248 // some languages only work with polyglossia/XeTeX
3249 Language const * lang = lyx::languages.getLanguage(
3250 fromqstr(langModule->languageCO->itemData(
3251 langModule->languageCO->currentIndex()).toString()));
3252 bool const need_fontspec =
3253 lang->babel().empty() && !lang->polyglossia().empty();
3254 bool const os_fonts_available =
3255 bp_.baseClass()->outputType() == lyx::LATEX
3256 && LaTeXFeatures::isAvailable("fontspec");
3257 fontModule->osFontsCB->setEnabled(os_fonts_available && !need_fontspec);
3258 fontModule->osFontsCB->setChecked(
3259 (os_fonts_available && bp_.useNonTeXFonts) || need_fontspec);
3260 updateFontsize(documentClass().opt_fontsize(),
3263 QString font = toqstr(bp_.fonts_roman);
3264 int rpos = fontModule->fontsRomanCO->findData(font);
3266 rpos = fontModule->fontsRomanCO->count();
3267 fontModule->fontsRomanCO->addItem(font + qt_(" (not installed)"), font);
3269 fontModule->fontsRomanCO->setCurrentIndex(rpos);
3271 font = toqstr(bp_.fonts_sans);
3272 int spos = fontModule->fontsSansCO->findData(font);
3274 spos = fontModule->fontsSansCO->count();
3275 fontModule->fontsSansCO->addItem(font + qt_(" (not installed)"), font);
3277 fontModule->fontsSansCO->setCurrentIndex(spos);
3279 font = toqstr(bp_.fonts_typewriter);
3280 int tpos = fontModule->fontsTypewriterCO->findData(font);
3282 tpos = fontModule->fontsTypewriterCO->count();
3283 fontModule->fontsTypewriterCO->addItem(font + qt_(" (not installed)"), font);
3285 fontModule->fontsTypewriterCO->setCurrentIndex(tpos);
3287 font = toqstr(bp_.fonts_math);
3288 int mpos = fontModule->fontsMathCO->findData(font);
3290 mpos = fontModule->fontsMathCO->count();
3291 fontModule->fontsMathCO->addItem(font + qt_(" (not installed)"), font);
3293 fontModule->fontsMathCO->setCurrentIndex(mpos);
3295 if (bp_.useNonTeXFonts && os_fonts_available) {
3296 fontModule->fontencLA->setEnabled(false);
3297 fontModule->fontencCO->setEnabled(false);
3298 fontModule->fontencLE->setEnabled(false);
3300 fontModule->fontencLA->setEnabled(true);
3301 fontModule->fontencCO->setEnabled(true);
3302 fontModule->fontencLE->setEnabled(true);
3308 if (!bp_.fonts_cjk.empty())
3309 fontModule->cjkFontLE->setText(
3310 toqstr(bp_.fonts_cjk));
3312 fontModule->cjkFontLE->setText(QString());
3314 fontModule->fontScCB->setChecked(bp_.fonts_expert_sc);
3315 fontModule->fontOsfCB->setChecked(bp_.fonts_old_figures);
3316 fontModule->scaleSansSB->setValue(bp_.fonts_sans_scale);
3317 fontModule->scaleTypewriterSB->setValue(bp_.fonts_typewriter_scale);
3319 int nn = findToken(GuiDocument::fontfamilies, bp_.fonts_default_family);
3321 fontModule->fontsDefaultCO->setCurrentIndex(nn);
3323 if (bp_.fontenc == "global" || bp_.fontenc == "default") {
3324 fontModule->fontencCO->setCurrentIndex(
3325 fontModule->fontencCO->findData(toqstr(bp_.fontenc)));
3326 fontModule->fontencLE->setEnabled(false);
3328 fontModule->fontencCO->setCurrentIndex(1);
3329 fontModule->fontencLE->setText(toqstr(bp_.fontenc));
3333 // This must be set _after_ fonts since updateDefaultFormat()
3334 // checks osFontsCB settings.
3335 // update combobox with formats
3336 updateDefaultFormat();
3337 int index = outputModule->defaultFormatCO->findData(toqstr(
3338 bp_.default_output_format));
3339 // set to default if format is not found
3342 outputModule->defaultFormatCO->setCurrentIndex(index);
3344 outputModule->outputsyncCB->setChecked(bp_.output_sync);
3345 outputModule->synccustomCB->setEditText(toqstr(bp_.output_sync_macro));
3347 outputModule->mathimgSB->setValue(bp_.html_math_img_scale);
3348 outputModule->mathoutCB->setCurrentIndex(bp_.html_math_output);
3349 outputModule->strictCB->setChecked(bp_.html_be_strict);
3350 outputModule->cssCB->setChecked(bp_.html_css_as_file);
3353 bool const extern_geometry =
3354 documentClass().provides("geometry");
3355 int const psize = bp_.papersize;
3356 pageLayoutModule->papersizeCO->setCurrentIndex(psize);
3357 setCustomPapersize(!extern_geometry && psize == 1);
3358 pageLayoutModule->papersizeCO->setEnabled(!extern_geometry);
3360 bool const landscape =
3361 bp_.orientation == ORIENTATION_LANDSCAPE;
3362 pageLayoutModule->landscapeRB->setChecked(landscape);
3363 pageLayoutModule->portraitRB->setChecked(!landscape);
3364 pageLayoutModule->landscapeRB->setEnabled(!extern_geometry);
3365 pageLayoutModule->portraitRB->setEnabled(!extern_geometry);
3367 pageLayoutModule->facingPagesCB->setChecked(
3368 bp_.sides == TwoSides);
3370 lengthToWidgets(pageLayoutModule->paperwidthLE,
3371 pageLayoutModule->paperwidthUnitCO, bp_.paperwidth, default_unit);
3372 lengthToWidgets(pageLayoutModule->paperheightLE,
3373 pageLayoutModule->paperheightUnitCO, bp_.paperheight, default_unit);
3376 Ui::MarginsUi * m = marginsModule;
3380 lengthToWidgets(m->topLE, m->topUnit,
3381 bp_.topmargin, default_unit);
3383 lengthToWidgets(m->bottomLE, m->bottomUnit,
3384 bp_.bottommargin, default_unit);
3386 lengthToWidgets(m->innerLE, m->innerUnit,
3387 bp_.leftmargin, default_unit);
3389 lengthToWidgets(m->outerLE, m->outerUnit,
3390 bp_.rightmargin, default_unit);
3392 lengthToWidgets(m->headheightLE, m->headheightUnit,
3393 bp_.headheight, default_unit);
3395 lengthToWidgets(m->headsepLE, m->headsepUnit,
3396 bp_.headsep, default_unit);
3398 lengthToWidgets(m->footskipLE, m->footskipUnit,
3399 bp_.footskip, default_unit);
3401 lengthToWidgets(m->columnsepLE, m->columnsepUnit,
3402 bp_.columnsep, default_unit);
3405 updateUnknownBranches();
3406 branchesModule->update(bp_);
3409 PDFOptions const & pdf = bp_.pdfoptions();
3410 pdfSupportModule->use_hyperrefGB->setChecked(pdf.use_hyperref);
3411 if (bp_.documentClass().provides("hyperref"))
3412 pdfSupportModule->use_hyperrefGB->setTitle(qt_("C&ustomize Hyperref Options"));
3414 pdfSupportModule->use_hyperrefGB->setTitle(qt_("&Use Hyperref Support"));
3415 pdfSupportModule->titleLE->setText(toqstr(pdf.title));
3416 pdfSupportModule->authorLE->setText(toqstr(pdf.author));
3417 pdfSupportModule->subjectLE->setText(toqstr(pdf.subject));
3418 pdfSupportModule->keywordsLE->setText(toqstr(pdf.keywords));
3420 pdfSupportModule->bookmarksGB->setChecked(pdf.bookmarks);
3421 pdfSupportModule->bookmarksnumberedCB->setChecked(pdf.bookmarksnumbered);
3422 pdfSupportModule->bookmarksopenGB->setChecked(pdf.bookmarksopen);
3424 pdfSupportModule->bookmarksopenlevelSB->setValue(pdf.bookmarksopenlevel);
3426 pdfSupportModule->breaklinksCB->setChecked(pdf.breaklinks);
3427 pdfSupportModule->pdfborderCB->setChecked(pdf.pdfborder);
3428 pdfSupportModule->pdfusetitleCB->setChecked(pdf.pdfusetitle);
3429 pdfSupportModule->colorlinksCB->setChecked(pdf.colorlinks);
3431 nn = findToken(backref_opts, pdf.backref);
3433 pdfSupportModule->backrefCO->setCurrentIndex(nn);
3435 pdfSupportModule->fullscreenCB->setChecked
3436 (pdf.pagemode == pdf.pagemode_fullscreen);
3438 pdfSupportModule->optionsLE->setText(
3439 toqstr(pdf.quoted_options));
3441 // Make sure that the bc is in the INITIAL state
3442 if (bc().policy().buttonStatus(ButtonPolicy::RESTORE))
3445 // clear changed branches cache
3446 changedBranches_.clear();
3449 nonModuleChanged_ = false;
3453 void GuiDocument::saveDocDefault()
3455 // we have to apply the params first
3461 void GuiDocument::updateAvailableModules()
3463 modules_av_model_.clear();
3464 list<modInfoStruct> const & modInfoList = getModuleInfo();
3465 list<modInfoStruct>::const_iterator mit = modInfoList.begin();
3466 list<modInfoStruct>::const_iterator men = modInfoList.end();
3467 for (int i = 0; mit != men; ++mit, ++i)
3468 modules_av_model_.insertRow(i, mit->name, mit->id,
3473 void GuiDocument::updateSelectedModules()
3475 modules_sel_model_.clear();
3476 list<modInfoStruct> const selModList = getSelectedModules();
3477 list<modInfoStruct>::const_iterator mit = selModList.begin();
3478 list<modInfoStruct>::const_iterator men = selModList.end();
3479 for (int i = 0; mit != men; ++mit, ++i)
3480 modules_sel_model_.insertRow(i, mit->name, mit->id,
3485 void GuiDocument::updateIncludeonlys()
3487 masterChildModule->childrenTW->clear();
3488 QString const no = qt_("No");
3489 QString const yes = qt_("Yes");
3491 if (includeonlys_.empty()) {
3492 masterChildModule->includeallRB->setChecked(true);
3493 masterChildModule->childrenTW->setEnabled(false);
3494 masterChildModule->maintainAuxCB->setEnabled(false);
3496 masterChildModule->includeonlyRB->setChecked(true);
3497 masterChildModule->childrenTW->setEnabled(true);
3498 masterChildModule->maintainAuxCB->setEnabled(true);
3500 QTreeWidgetItem * item = 0;
3501 ListOfBuffers children = buffer().getChildren();
3502 ListOfBuffers::const_iterator it = children.begin();
3503 ListOfBuffers::const_iterator end = children.end();
3504 bool has_unincluded = false;
3505 bool all_unincluded = true;
3506 for (; it != end; ++it) {
3507 item = new QTreeWidgetItem(masterChildModule->childrenTW);
3510 to_utf8(makeRelPath(from_utf8((*it)->fileName().absFileName()),
3511 from_utf8(buffer().filePath())));
3512 item->setText(0, toqstr(name));
3513 item->setText(1, isChildIncluded(name) ? yes : no);
3514 if (!isChildIncluded(name))
3515 has_unincluded = true;
3517 all_unincluded = false;
3519 // Both if all childs are included and if none is included
3520 // is equal to "include all" (i.e., ommit \includeonly).
3521 // Thus, reset the GUI.
3522 if (!has_unincluded || all_unincluded) {
3523 masterChildModule->includeallRB->setChecked(true);
3524 masterChildModule->childrenTW->setEnabled(false);
3525 includeonlys_.clear();
3527 // If all are included, we need to update again.
3528 if (!has_unincluded)
3529 updateIncludeonlys();
3533 void GuiDocument::updateContents()
3535 // Nothing to do here as the document settings is not cursor dependant.
3540 void GuiDocument::useClassDefaults()
3542 if (applyPB->isEnabled()) {
3543 int const ret = Alert::prompt(_("Unapplied changes"),
3544 _("Some changes in the dialog were not yet applied.\n"
3545 "If you do not apply now, they will be lost after this action."),
3546 1, 1, _("&Apply"), _("&Dismiss"));
3551 int idx = latexModule->classCO->currentIndex();
3552 string const classname = fromqstr(latexModule->classCO->getData(idx));
3553 if (!bp_.setBaseClass(classname)) {
3554 Alert::error(_("Error"), _("Unable to set document class."));
3557 bp_.useClassDefaults();
3562 void GuiDocument::setLayoutComboByIDString(string const & idString)
3564 if (!latexModule->classCO->set(toqstr(idString)))
3565 Alert::warning(_("Can't set layout!"),
3566 bformat(_("Unable to set layout for ID: %1$s"), from_utf8(idString)));
3570 bool GuiDocument::isValid()
3573 validateListingsParameters().isEmpty() &&
3574 localLayout->isValid() &&
3576 // if we're asking for skips between paragraphs
3577 !textLayoutModule->skipRB->isChecked() ||
3578 // then either we haven't chosen custom
3579 textLayoutModule->skipCO->currentIndex() != 3 ||
3580 // or else a length has been given
3581 !textLayoutModule->skipLE->text().isEmpty()
3584 // if we're asking for indentation
3585 !textLayoutModule->indentRB->isChecked() ||
3586 // then either we haven't chosen custom
3587 textLayoutModule->indentCO->currentIndex() != 1 ||
3588 // or else a length has been given
3589 !textLayoutModule->indentLE->text().isEmpty()
3594 char const * const GuiDocument::fontfamilies[5] = {
3595 "default", "rmdefault", "sfdefault", "ttdefault", ""
3599 char const * GuiDocument::fontfamilies_gui[5] = {
3600 N_("Default"), N_("Roman"), N_("Sans Serif"), N_("Typewriter"), ""
3604 bool GuiDocument::initialiseParams(string const &)
3606 BufferView const * view = bufferview();
3608 bp_ = BufferParams();
3612 bp_ = view->buffer().params();
3614 updateAvailableModules();
3615 //FIXME It'd be nice to make sure here that the selected
3616 //modules are consistent: That required modules are actually
3617 //selected, and that we don't have conflicts. If so, we could
3618 //at least pop up a warning.
3624 void GuiDocument::clearParams()
3626 bp_ = BufferParams();
3630 BufferId GuiDocument::id() const
3632 BufferView const * const view = bufferview();
3633 return view? &view->buffer() : 0;
3637 list<GuiDocument::modInfoStruct> const & GuiDocument::getModuleInfo()
3639 return moduleNames_;
3643 list<GuiDocument::modInfoStruct> const
3644 GuiDocument::makeModuleInfo(LayoutModuleList const & mods)
3646 LayoutModuleList::const_iterator it = mods.begin();
3647 LayoutModuleList::const_iterator end = mods.end();
3648 list<modInfoStruct> mInfo;
3649 for (; it != end; ++it) {
3652 LyXModule const * const mod = theModuleList[*it];
3655 m.name = toqstr(translateIfPossible(from_utf8(mod->getName())));
3657 m.name = toqstr(*it) + toqstr(" (") + qt_("Not Found") + toqstr(")");
3664 list<GuiDocument::modInfoStruct> const GuiDocument::getSelectedModules()
3666 return makeModuleInfo(params().getModules());
3670 list<GuiDocument::modInfoStruct> const GuiDocument::getProvidedModules()
3672 return makeModuleInfo(params().baseClass()->providedModules());
3676 DocumentClass const & GuiDocument::documentClass() const
3678 return bp_.documentClass();
3682 static void dispatch_bufferparams(Dialog const & dialog,
3683 BufferParams const & bp, FuncCode lfun, Buffer const * buf)
3686 ss << "\\begin_header\n";
3687 bp.writeFile(ss, buf);
3688 ss << "\\end_header\n";
3689 dialog.dispatch(FuncRequest(lfun, ss.str()));
3693 void GuiDocument::dispatchParams()
3695 // We need a non-const buffer object.
3696 Buffer & buf = const_cast<BufferView *>(bufferview())->buffer();
3697 // There may be several undo records; group them (bug #8998)
3698 buf.undo().beginUndoGroup();
3700 // This must come first so that a language change is correctly noticed
3703 // Apply the BufferParams. Note that this will set the base class
3704 // and then update the buffer's layout.
3705 dispatch_bufferparams(*this, params(), LFUN_BUFFER_PARAMS_APPLY, &buffer());
3707 if (!params().master.empty()) {
3708 FileName const master_file = support::makeAbsPath(params().master,
3709 support::onlyPath(buffer().absFileName()));
3710 if (isLyXFileName(master_file.absFileName())) {
3711 Buffer * master = checkAndLoadLyXFile(master_file);
3713 if (master->isChild(const_cast<Buffer *>(&buffer())))
3714 const_cast<Buffer &>(buffer()).setParent(master);
3716 Alert::warning(_("Assigned master does not include this file"),
3717 bformat(_("You must include this file in the document\n"
3718 "'%1$s' in order to use the master document\n"
3719 "feature."), from_utf8(params().master)));
3721 Alert::warning(_("Could not load master"),
3722 bformat(_("The master document '%1$s'\n"
3723 "could not be loaded."),
3724 from_utf8(params().master)));
3728 // Generate the colours requested by each new branch.
3729 BranchList & branchlist = params().branchlist();
3730 if (!branchlist.empty()) {
3731 BranchList::const_iterator it = branchlist.begin();
3732 BranchList::const_iterator const end = branchlist.end();
3733 for (; it != end; ++it) {
3734 docstring const & current_branch = it->branch();
3735 Branch const * branch = branchlist.find(current_branch);
3736 string const x11hexname = X11hexname(branch->color());
3737 // display the new color
3738 docstring const str = current_branch + ' ' + from_ascii(x11hexname);
3739 dispatch(FuncRequest(LFUN_SET_COLOR, str));
3742 // Open insets of selected branches, close deselected ones
3743 dispatch(FuncRequest(LFUN_INSET_FORALL,
3744 "Branch inset-toggle assign"));
3746 // rename branches in the document
3747 executeBranchRenaming();
3748 // and clear changed branches cache
3749 changedBranches_.clear();
3751 // Generate the colours requested by indices.
3752 IndicesList & indiceslist = params().indiceslist();
3753 if (!indiceslist.empty()) {
3754 IndicesList::const_iterator it = indiceslist.begin();
3755 IndicesList::const_iterator const end = indiceslist.end();
3756 for (; it != end; ++it) {
3757 docstring const & current_index = it->shortcut();
3758 Index const * index = indiceslist.findShortcut(current_index);
3759 string const x11hexname = X11hexname(index->color());
3760 // display the new color
3761 docstring const str = current_index + ' ' + from_ascii(x11hexname);
3762 dispatch(FuncRequest(LFUN_SET_COLOR, str));
3766 // If we used an LFUN, we would not need these two lines:
3767 BufferView * bv = const_cast<BufferView *>(bufferview());
3768 bv->processUpdateFlags(Update::Force | Update::FitCursor);
3770 // Don't forget to close the group. Note that it is important
3771 // to check that there is no early return in the method.
3772 buf.undo().endUndoGroup();
3776 void GuiDocument::setLanguage() const
3778 Language const * const newL = bp_.language;
3779 if (buffer().params().language == newL)
3782 string const & lang_name = newL->lang();
3783 dispatch(FuncRequest(LFUN_BUFFER_LANGUAGE, lang_name));
3787 void GuiDocument::saveAsDefault() const
3789 dispatch_bufferparams(*this, params(), LFUN_BUFFER_SAVE_AS_DEFAULT, &buffer());
3793 bool GuiDocument::providesOSF(QString const & font) const
3795 if (fontModule->osFontsCB->isChecked())
3796 // FIXME: we should check if the fonts really
3797 // have OSF support. But how?
3799 return theLaTeXFonts().getLaTeXFont(
3800 qstring_to_ucs4(font)).providesOSF(ot1(),
3806 bool GuiDocument::providesSC(QString const & font) const
3808 if (fontModule->osFontsCB->isChecked())
3810 return theLaTeXFonts().getLaTeXFont(
3811 qstring_to_ucs4(font)).providesSC(ot1(),
3817 bool GuiDocument::providesScale(QString const & font) const
3819 if (fontModule->osFontsCB->isChecked())
3821 return theLaTeXFonts().getLaTeXFont(
3822 qstring_to_ucs4(font)).providesScale(ot1(),
3828 bool GuiDocument::providesNoMath(QString const & font) const
3830 if (fontModule->osFontsCB->isChecked())
3832 return theLaTeXFonts().getLaTeXFont(
3833 qstring_to_ucs4(font)).providesNoMath(ot1(),
3838 bool GuiDocument::hasMonolithicExpertSet(QString const & font) const
3840 if (fontModule->osFontsCB->isChecked())
3842 return theLaTeXFonts().getLaTeXFont(
3843 qstring_to_ucs4(font)).hasMonolithicExpertSet(ot1(),
3849 void GuiDocument::loadModuleInfo()
3851 moduleNames_.clear();
3852 LyXModuleList::const_iterator it = theModuleList.begin();
3853 LyXModuleList::const_iterator end = theModuleList.end();
3854 for (; it != end; ++it) {
3858 m.name = toqstr(translateIfPossible(from_utf8(it->getName())));
3859 // this is supposed to give us the first sentence of the description
3862 toqstr(translateIfPossible(from_utf8(it->getDescription())));
3863 int const pos = desc.indexOf(".");
3865 desc.truncate(pos + 1);
3866 m.description = desc;
3867 if (it->category().substr(0, 8) != "Citation")
3868 moduleNames_.push_back(m);
3873 void GuiDocument::updateUnknownBranches()
3877 list<docstring> used_branches;
3878 buffer().getUsedBranches(used_branches);
3879 list<docstring>::const_iterator it = used_branches.begin();
3880 QStringList unknown_branches;
3881 for (; it != used_branches.end() ; ++it) {
3882 if (!buffer().params().branchlist().find(*it))
3883 unknown_branches.append(toqstr(*it));
3885 branchesModule->setUnknownBranches(unknown_branches);
3889 void GuiDocument::branchesRename(docstring const & oldname, docstring const & newname)
3891 map<docstring, docstring>::iterator it = changedBranches_.begin();
3892 for (; it != changedBranches_.end() ; ++it) {
3893 if (it->second == oldname) {
3894 // branch has already been renamed
3895 it->second = newname;
3900 changedBranches_[oldname] = newname;
3904 void GuiDocument::executeBranchRenaming() const
3906 map<docstring, docstring>::const_iterator it = changedBranches_.begin();
3907 for (; it != changedBranches_.end() ; ++it) {
3908 docstring const arg = '"' + it->first + '"' + " " + '"' + it->second + '"';
3909 dispatch(FuncRequest(LFUN_BRANCHES_RENAME, arg));
3914 void GuiDocument::allPackagesAuto()
3920 void GuiDocument::allPackagesAlways()
3926 void GuiDocument::allPackagesNot()
3932 void GuiDocument::allPackages(int col)
3934 for (int row = 0; row < mathsModule->packagesTW->rowCount(); ++row) {
3935 QRadioButton * rb = (QRadioButton*)mathsModule->packagesTW->cellWidget(row, col);
3936 rb->setChecked(true);
3941 Dialog * createGuiDocument(GuiView & lv) { return new GuiDocument(lv); }
3944 } // namespace frontend
3947 #include "moc_GuiDocument.cpp"