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"
36 #include "FloatPlacement.h"
38 #include "FuncRequest.h"
40 #include "IndicesList.h"
42 #include "LaTeXFeatures.h"
43 #include "LaTeXFonts.h"
45 #include "LayoutEnums.h"
46 #include "LayoutModuleList.h"
48 #include "ModuleList.h"
49 #include "OutputParams.h"
50 #include "PDFOptions.h"
51 #include "qt_helpers.h"
53 #include "TextClass.h"
57 #include "insets/InsetListingsParams.h"
59 #include "support/debug.h"
60 #include "support/FileName.h"
61 #include "support/filetools.h"
62 #include "support/gettext.h"
63 #include "support/lassert.h"
64 #include "support/lstrings.h"
66 #include "frontends/alert.h"
68 #include <QAbstractItemModel>
69 #include <QHeaderView>
71 #include <QColorDialog>
72 #include <QCloseEvent>
73 #include <QFontDatabase>
75 #include <QTextBoundaryFinder>
76 #include <QTextCursor>
86 // a style sheet for buttons
87 // this is for example used for the background color setting button
88 static inline QString colorButtonStyleSheet(QColor const & bgColor)
90 if (bgColor.isValid()) {
91 QString rc = QLatin1String("background-color:");
100 using namespace lyx::support;
105 char const * const tex_graphics[] =
107 "default", "dvialw", "dvilaser", "dvipdf", "dvipdfm", "dvipdfmx",
108 "dvips", "dvipsone", "dvitops", "dviwin", "dviwindo", "dvi2ps", "emtex",
109 "ln", "oztex", "pctexhp", "pctexps", "pctexwin", "pctex32", "pdftex",
110 "psprint", "pubps", "tcidvi", "textures", "truetex", "vtex", "xdvi",
115 char const * const tex_graphics_gui[] =
117 N_("Default"), "dvialw", "DviLaser", "dvipdf", "DVIPDFM", "DVIPDFMx",
118 "Dvips", "DVIPSONE", "DVItoPS", "DVIWIN", "DVIWindo", "dvi2ps", "EmTeX",
119 "LN", "OzTeX", "pctexhp", "pctexps", "pctexwin", "PCTeX32", "pdfTeX",
120 "psprint", "pubps", "tcidvi", "Textures", "TrueTeX", "VTeX", "xdvi",
121 "XeTeX", N_("None"), ""
125 char const * backref_opts[] =
127 "false", "section", "slide", "page", ""
131 char const * backref_opts_gui[] =
133 N_("Off"), N_("Section"), N_("Slide"), N_("Page"), ""
137 vector<string> engine_types_;
138 vector<pair<string, QString> > pagestyles;
140 QMap<QString, QString> rmfonts_;
141 QMap<QString, QString> sffonts_;
142 QMap<QString, QString> ttfonts_;
143 QMap<QString, QString> mathfonts_;
146 } // anonymous namespace
150 RGBColor set_backgroundcolor;
151 bool is_backgroundcolor;
152 RGBColor set_fontcolor;
154 RGBColor set_notefontcolor;
155 RGBColor set_boxbgcolor;
156 bool forced_fontspec_activation;
159 // used when sorting the textclass list.
160 class less_textclass_avail_desc
161 : public binary_function<string, string, int>
164 bool operator()(string const & lhs, string const & rhs) const
166 // Ordering criteria:
167 // 1. Availability of text class
168 // 2. Description (lexicographic)
169 LayoutFile const & tc1 = LayoutFileList::get()[lhs];
170 LayoutFile const & tc2 = LayoutFileList::get()[rhs];
171 int const order = compare_no_case(
172 translateIfPossible(from_utf8(tc1.description())),
173 translateIfPossible(from_utf8(tc2.description())));
174 return (tc1.isTeXClassAvailable() && !tc2.isTeXClassAvailable()) ||
175 (tc1.isTeXClassAvailable() == tc2.isTeXClassAvailable() && order < 0);
184 vector<string> getRequiredList(string const & modName)
186 LyXModule const * const mod = theModuleList[modName];
188 return vector<string>(); //empty such thing
189 return mod->getRequiredModules();
193 vector<string> getExcludedList(string const & modName)
195 LyXModule const * const mod = theModuleList[modName];
197 return vector<string>(); //empty such thing
198 return mod->getExcludedModules();
202 docstring getModuleCategory(string const & modName)
204 LyXModule const * const mod = theModuleList[modName];
207 return from_utf8(mod->category());
211 docstring getModuleDescription(string const & modName)
213 LyXModule const * const mod = theModuleList[modName];
215 return _("Module not found!");
217 return translateIfPossible(from_utf8(mod->getDescription()));
221 vector<string> getPackageList(string const & modName)
223 LyXModule const * const mod = theModuleList[modName];
225 return vector<string>(); //empty such thing
226 return mod->getPackageList();
230 bool isModuleAvailable(string const & modName)
232 LyXModule const * const mod = theModuleList[modName];
235 return mod->isAvailable();
238 } // anonymous namespace
241 /////////////////////////////////////////////////////////////////////
243 // ModuleSelectionManager
245 /////////////////////////////////////////////////////////////////////
247 /// SelectionManager for use with modules
248 class ModuleSelectionManager : public GuiSelectionManager
252 ModuleSelectionManager(
253 QTreeView * availableLV,
254 QListView * selectedLV,
258 QPushButton * downPB,
259 GuiIdListModel * availableModel,
260 GuiIdListModel * selectedModel,
261 GuiDocument const * container)
262 : GuiSelectionManager(availableLV, selectedLV, addPB, delPB,
263 upPB, downPB, availableModel, selectedModel), container_(container)
266 void updateProvidedModules(LayoutModuleList const & pm)
267 { provided_modules_ = pm.list(); }
269 void updateExcludedModules(LayoutModuleList const & em)
270 { excluded_modules_ = em.list(); }
273 virtual void updateAddPB();
275 virtual void updateUpPB();
277 virtual void updateDownPB();
279 virtual void updateDelPB();
280 /// returns availableModel as a GuiIdListModel
281 GuiIdListModel * getAvailableModel()
283 return dynamic_cast<GuiIdListModel *>(availableModel);
285 /// returns selectedModel as a GuiIdListModel
286 GuiIdListModel * getSelectedModel()
288 return dynamic_cast<GuiIdListModel *>(selectedModel);
290 /// keeps a list of the modules the text class provides
291 list<string> provided_modules_;
293 list<string> excluded_modules_;
295 GuiDocument const * container_;
298 void ModuleSelectionManager::updateAddPB()
300 int const arows = availableModel->rowCount();
301 QModelIndexList const avail_sels =
302 availableLV->selectionModel()->selectedIndexes();
304 // disable if there aren't any modules (?), if none of them is chosen
305 // in the dialog, or if the chosen one is already selected for use.
306 if (arows == 0 || avail_sels.isEmpty() || isSelected(avail_sels.first())) {
307 addPB->setEnabled(false);
311 QModelIndex const & idx = availableLV->selectionModel()->currentIndex();
312 string const modname = getAvailableModel()->getIDString(idx.row());
315 container_->params().layoutModuleCanBeAdded(modname);
316 addPB->setEnabled(enable);
320 void ModuleSelectionManager::updateDownPB()
322 int const srows = selectedModel->rowCount();
324 downPB->setEnabled(false);
327 QModelIndex const & curidx = selectedLV->selectionModel()->currentIndex();
328 int const curRow = curidx.row();
329 if (curRow < 0 || curRow >= srows - 1) { // invalid or last item
330 downPB->setEnabled(false);
334 // determine whether immediately succeding element requires this one
335 string const curmodname = getSelectedModel()->getIDString(curRow);
336 string const nextmodname = getSelectedModel()->getIDString(curRow + 1);
338 vector<string> reqs = getRequiredList(nextmodname);
340 // if it doesn't require anything....
342 downPB->setEnabled(true);
346 // Enable it if this module isn't required.
347 // FIXME This should perhaps be more flexible and check whether, even
348 // if the next one is required, there is also an earlier one that will do.
350 find(reqs.begin(), reqs.end(), curmodname) == reqs.end());
353 void ModuleSelectionManager::updateUpPB()
355 int const srows = selectedModel->rowCount();
357 upPB->setEnabled(false);
361 QModelIndex const & curIdx = selectedLV->selectionModel()->currentIndex();
362 int curRow = curIdx.row();
363 if (curRow <= 0 || curRow > srows - 1) { // first item or invalid
364 upPB->setEnabled(false);
367 string const curmodname = getSelectedModel()->getIDString(curRow);
369 // determine whether immediately preceding element is required by this one
370 vector<string> reqs = getRequiredList(curmodname);
372 // if this one doesn't require anything....
374 upPB->setEnabled(true);
379 // Enable it if the preceding module isn't required.
380 // NOTE This is less flexible than it might be. We could check whether, even
381 // if the previous one is required, there is an earlier one that would do.
382 string const premod = getSelectedModel()->getIDString(curRow - 1);
383 upPB->setEnabled(find(reqs.begin(), reqs.end(), premod) == reqs.end());
386 void ModuleSelectionManager::updateDelPB()
388 int const srows = selectedModel->rowCount();
390 deletePB->setEnabled(false);
394 QModelIndex const & curidx =
395 selectedLV->selectionModel()->currentIndex();
396 int const curRow = curidx.row();
397 if (curRow < 0 || curRow >= srows) { // invalid index?
398 deletePB->setEnabled(false);
402 string const curmodname = getSelectedModel()->getIDString(curRow);
404 // We're looking here for a reason NOT to enable the button. If we
405 // find one, we disable it and return. If we don't, we'll end up at
406 // the end of the function, and then we enable it.
407 for (int i = curRow + 1; i < srows; ++i) {
408 string const thisMod = getSelectedModel()->getIDString(i);
409 vector<string> reqs = getRequiredList(thisMod);
410 //does this one require us?
411 if (find(reqs.begin(), reqs.end(), curmodname) == reqs.end())
415 // OK, so this module requires us
416 // is there an EARLIER module that also satisfies the require?
417 // NOTE We demand that it be earlier to keep the list of modules
418 // consistent with the rule that a module must be proceeded by a
419 // required module. There would be more flexible ways to proceed,
420 // but that would be a lot more complicated, and the logic here is
421 // already complicated. (That's why I've left the debugging code.)
422 // lyxerr << "Testing " << thisMod << endl;
423 bool foundone = false;
424 for (int j = 0; j < curRow; ++j) {
425 string const mod = getSelectedModel()->getIDString(j);
426 // lyxerr << "In loop: Testing " << mod << endl;
427 // do we satisfy the require?
428 if (find(reqs.begin(), reqs.end(), mod) != reqs.end()) {
429 // lyxerr << mod << " does the trick." << endl;
434 // did we find a module to satisfy the require?
436 // lyxerr << "No matching module found." << endl;
437 deletePB->setEnabled(false);
441 // lyxerr << "All's well that ends well." << endl;
442 deletePB->setEnabled(true);
446 /////////////////////////////////////////////////////////////////////
450 /////////////////////////////////////////////////////////////////////
452 PreambleModule::PreambleModule() : current_id_(0)
454 // This is not a memory leak. The object will be destroyed
456 // @ is letter in the LyX user preamble
457 (void) new LaTeXHighlighter(preambleTE->document(), true);
458 preambleTE->setFont(guiApp->typewriterSystemFont());
459 preambleTE->setWordWrapMode(QTextOption::NoWrap);
460 setFocusProxy(preambleTE);
461 connect(preambleTE, SIGNAL(textChanged()), this, SIGNAL(changed()));
465 void PreambleModule::update(BufferParams const & params, BufferId id)
467 QString preamble = toqstr(params.preamble);
468 // Nothing to do if the params and preamble are unchanged.
469 if (id == current_id_
470 && preamble == preambleTE->document()->toPlainText())
473 QTextCursor cur = preambleTE->textCursor();
474 // Save the coords before switching to the new one.
475 preamble_coords_[current_id_] =
476 make_pair(cur.position(), preambleTE->verticalScrollBar()->value());
478 // Save the params address for further use.
480 preambleTE->document()->setPlainText(preamble);
481 Coords::const_iterator it = preamble_coords_.find(current_id_);
482 if (it == preamble_coords_.end())
483 // First time we open this one.
484 preamble_coords_[current_id_] = make_pair(0, 0);
486 // Restore saved coords.
487 QTextCursor cur = preambleTE->textCursor();
488 cur.setPosition(it->second.first);
489 preambleTE->setTextCursor(cur);
490 preambleTE->verticalScrollBar()->setValue(it->second.second);
495 void PreambleModule::apply(BufferParams & params)
497 params.preamble = fromqstr(preambleTE->document()->toPlainText());
501 void PreambleModule::closeEvent(QCloseEvent * e)
503 // Save the coords before closing.
504 QTextCursor cur = preambleTE->textCursor();
505 preamble_coords_[current_id_] =
506 make_pair(cur.position(), preambleTE->verticalScrollBar()->value());
511 /////////////////////////////////////////////////////////////////////
515 /////////////////////////////////////////////////////////////////////
518 LocalLayout::LocalLayout() : current_id_(0), validated_(false)
520 connect(locallayoutTE, SIGNAL(textChanged()), this, SLOT(textChanged()));
521 connect(validatePB, SIGNAL(clicked()), this, SLOT(validatePressed()));
522 connect(convertPB, SIGNAL(clicked()), this, SLOT(convertPressed()));
526 void LocalLayout::update(BufferParams const & params, BufferId id)
528 QString layout = toqstr(params.getLocalLayout(false));
529 // Nothing to do if the params and preamble are unchanged.
530 if (id == current_id_
531 && layout == locallayoutTE->document()->toPlainText())
534 // Save the params address for further use.
536 locallayoutTE->document()->setPlainText(layout);
541 void LocalLayout::apply(BufferParams & params)
543 string const layout = fromqstr(locallayoutTE->document()->toPlainText());
544 params.setLocalLayout(layout, false);
548 void LocalLayout::hideConvert()
550 convertPB->setEnabled(false);
551 convertLB->setText("");
557 void LocalLayout::textChanged()
559 static const QString message =
560 qt_("Press button to check validity...");
561 string const layout =
562 fromqstr(locallayoutTE->document()->toPlainText().trimmed());
564 if (layout.empty()) {
566 validatePB->setEnabled(false);
567 validLB->setText("");
570 } else if (!validatePB->isEnabled()) {
571 // if that's already enabled, we shouldn't need to do anything.
573 validLB->setText(message);
574 validatePB->setEnabled(true);
581 void LocalLayout::convert() {
582 string const layout =
583 fromqstr(locallayoutTE->document()->toPlainText().trimmed());
584 string const newlayout = TextClass::convert(layout);
585 if (!newlayout.empty())
586 locallayoutTE->setPlainText(toqstr(newlayout));
591 void LocalLayout::convertPressed() {
598 void LocalLayout::validate() {
600 static const QString vpar("<p style=\"font-weight: bold;\">%1</p>");
601 // Flashy red bold text
602 static const QString ivpar("<p style=\"color: #c00000; font-weight: bold; \">"
604 string const layout =
605 fromqstr(locallayoutTE->document()->toPlainText().trimmed());
606 if (!layout.empty()) {
607 TextClass::ReturnValues const ret = TextClass::validate(layout);
608 validated_ = (ret == TextClass::OK) || (ret == TextClass::OK_OLDFORMAT);
609 validatePB->setEnabled(false);
610 validLB->setText(validated_ ? vpar.arg(qt_("Layout is valid!"))
611 : ivpar.arg(qt_("Layout is invalid!")));
612 if (ret == TextClass::OK_OLDFORMAT) {
614 // Testing conversion to LYXFILE_LAYOUT_FORMAT at this point
616 if (TextClass::convert(layout).empty()) {
617 // Conversion failed. If LAYOUT_FORMAT > LYXFILE_LAYOUT_FORMAT,
618 // then maybe the layout is still valid, but its format is more
619 // recent than LYXFILE_LAYOUT_FORMAT. However, if LAYOUT_FORMAT
620 // == LYXFILE_LAYOUT_FORMAT then something is definitely wrong.
621 convertPB->setEnabled(false);
622 const QString text = (LAYOUT_FORMAT == LYXFILE_LAYOUT_FORMAT)
623 ? ivpar.arg(qt_("Conversion to current format impossible!"))
624 : vpar.arg(qt_("Conversion to current stable format "
626 convertLB->setText(text);
628 convertPB->setEnabled(true);
629 convertLB->setText(qt_("Convert to current format"));
640 void LocalLayout::validatePressed() {
646 /////////////////////////////////////////////////////////////////////
650 /////////////////////////////////////////////////////////////////////
653 GuiDocument::GuiDocument(GuiView & lv)
654 : GuiDialog(lv, "document", qt_("Document Settings")),
655 biblioChanged_(false), nonModuleChanged_(false)
659 connect(okPB, SIGNAL(clicked()), this, SLOT(slotOK()));
660 connect(applyPB, SIGNAL(clicked()), this, SLOT(slotApply()));
661 connect(closePB, SIGNAL(clicked()), this, SLOT(slotClose()));
662 connect(restorePB, SIGNAL(clicked()), this, SLOT(slotRestore()));
664 connect(savePB, SIGNAL(clicked()), this, SLOT(saveDefaultClicked()));
665 connect(defaultPB, SIGNAL(clicked()), this, SLOT(useDefaultsClicked()));
667 // Manage the restore, ok, apply, restore and cancel/close buttons
668 bc().setPolicy(ButtonPolicy::NoRepeatedApplyReadOnlyPolicy);
670 bc().setApply(applyPB);
671 bc().setCancel(closePB);
672 bc().setRestore(restorePB);
676 textLayoutModule = new UiWidget<Ui::TextLayoutUi>;
677 connect(textLayoutModule->lspacingCO, SIGNAL(activated(int)),
678 this, SLOT(change_adaptor()));
679 connect(textLayoutModule->lspacingCO, SIGNAL(activated(int)),
680 this, SLOT(setLSpacing(int)));
681 connect(textLayoutModule->lspacingLE, SIGNAL(textChanged(const QString &)),
682 this, SLOT(change_adaptor()));
684 connect(textLayoutModule->indentRB, SIGNAL(clicked()),
685 this, SLOT(change_adaptor()));
686 connect(textLayoutModule->indentRB, SIGNAL(toggled(bool)),
687 textLayoutModule->indentCO, SLOT(setEnabled(bool)));
688 connect(textLayoutModule->indentCO, SIGNAL(activated(int)),
689 this, SLOT(change_adaptor()));
690 connect(textLayoutModule->indentCO, SIGNAL(activated(int)),
691 this, SLOT(setIndent(int)));
692 connect(textLayoutModule->indentLE, SIGNAL(textChanged(const QString &)),
693 this, SLOT(change_adaptor()));
694 connect(textLayoutModule->indentLengthCO, SIGNAL(activated(int)),
695 this, SLOT(change_adaptor()));
697 connect(textLayoutModule->skipRB, SIGNAL(clicked()),
698 this, SLOT(change_adaptor()));
699 connect(textLayoutModule->skipRB, SIGNAL(toggled(bool)),
700 textLayoutModule->skipCO, SLOT(setEnabled(bool)));
701 connect(textLayoutModule->skipCO, SIGNAL(activated(int)),
702 this, SLOT(change_adaptor()));
703 connect(textLayoutModule->skipCO, SIGNAL(activated(int)),
704 this, SLOT(setSkip(int)));
705 connect(textLayoutModule->skipLE, SIGNAL(textChanged(const QString &)),
706 this, SLOT(change_adaptor()));
707 connect(textLayoutModule->skipLengthCO, SIGNAL(activated(int)),
708 this, SLOT(change_adaptor()));
710 connect(textLayoutModule->indentRB, SIGNAL(toggled(bool)),
711 this, SLOT(enableIndent(bool)));
712 connect(textLayoutModule->skipRB, SIGNAL(toggled(bool)),
713 this, SLOT(enableSkip(bool)));
715 connect(textLayoutModule->twoColumnCB, SIGNAL(clicked()),
716 this, SLOT(change_adaptor()));
717 connect(textLayoutModule->twoColumnCB, SIGNAL(clicked()),
718 this, SLOT(setColSep()));
719 connect(textLayoutModule->justCB, SIGNAL(clicked()),
720 this, SLOT(change_adaptor()));
722 textLayoutModule->lspacingLE->setValidator(new QDoubleValidator(
723 textLayoutModule->lspacingLE));
724 textLayoutModule->indentLE->setValidator(new LengthValidator(
725 textLayoutModule->indentLE));
726 textLayoutModule->skipLE->setValidator(new LengthValidator(
727 textLayoutModule->skipLE));
729 textLayoutModule->indentCO->addItem(qt_("Default"));
730 textLayoutModule->indentCO->addItem(qt_("Custom"));
731 textLayoutModule->skipCO->addItem(qt_("SmallSkip"));
732 textLayoutModule->skipCO->addItem(qt_("MedSkip"));
733 textLayoutModule->skipCO->addItem(qt_("BigSkip"));
734 textLayoutModule->skipCO->addItem(qt_("Custom"));
735 textLayoutModule->lspacingCO->insertItem(
736 Spacing::Single, qt_("Single"));
737 textLayoutModule->lspacingCO->insertItem(
738 Spacing::Onehalf, qt_("OneHalf"));
739 textLayoutModule->lspacingCO->insertItem(
740 Spacing::Double, qt_("Double"));
741 textLayoutModule->lspacingCO->insertItem(
742 Spacing::Other, qt_("Custom"));
743 // initialize the length validator
744 bc().addCheckedLineEdit(textLayoutModule->indentLE);
745 bc().addCheckedLineEdit(textLayoutModule->skipLE);
748 // master/child handling
749 masterChildModule = new UiWidget<Ui::MasterChildUi>;
751 connect(masterChildModule->childrenTW, SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)),
752 this, SLOT(includeonlyClicked(QTreeWidgetItem *, int)));
753 connect(masterChildModule->includeonlyRB, SIGNAL(toggled(bool)),
754 masterChildModule->childrenTW, SLOT(setEnabled(bool)));
755 connect(masterChildModule->includeonlyRB, SIGNAL(toggled(bool)),
756 masterChildModule->maintainAuxCB, SLOT(setEnabled(bool)));
757 connect(masterChildModule->includeallRB, SIGNAL(clicked()),
758 this, SLOT(change_adaptor()));
759 connect(masterChildModule->includeonlyRB, SIGNAL(clicked()),
760 this, SLOT(change_adaptor()));
761 connect(masterChildModule->maintainAuxCB, SIGNAL(clicked()),
762 this, SLOT(change_adaptor()));
763 masterChildModule->childrenTW->setColumnCount(2);
764 masterChildModule->childrenTW->headerItem()->setText(0, qt_("Child Document"));
765 masterChildModule->childrenTW->headerItem()->setText(1, qt_("Include to Output"));
766 masterChildModule->childrenTW->resizeColumnToContents(1);
767 masterChildModule->childrenTW->resizeColumnToContents(2);
771 outputModule = new UiWidget<Ui::OutputUi>;
773 connect(outputModule->defaultFormatCO, SIGNAL(activated(int)),
774 this, SLOT(change_adaptor()));
775 connect(outputModule->mathimgSB, SIGNAL(valueChanged(double)),
776 this, SLOT(change_adaptor()));
777 connect(outputModule->strictCB, SIGNAL(stateChanged(int)),
778 this, SLOT(change_adaptor()));
779 connect(outputModule->cssCB, SIGNAL(stateChanged(int)),
780 this, SLOT(change_adaptor()));
781 connect(outputModule->mathoutCB, SIGNAL(currentIndexChanged(int)),
782 this, SLOT(change_adaptor()));
784 connect(outputModule->outputsyncCB, SIGNAL(clicked()),
785 this, SLOT(change_adaptor()));
786 connect(outputModule->synccustomCB, SIGNAL(editTextChanged(QString)),
787 this, SLOT(change_adaptor()));
788 outputModule->synccustomCB->addItem("");
789 outputModule->synccustomCB->addItem("\\synctex=1");
790 outputModule->synccustomCB->addItem("\\synctex=-1");
791 outputModule->synccustomCB->addItem("\\usepackage[active]{srcltx}");
793 outputModule->synccustomCB->setValidator(new NoNewLineValidator(
794 outputModule->synccustomCB));
796 connect(outputModule->saveTransientPropertiesCB, SIGNAL(clicked()),
797 this, SLOT(change_adaptor()));
800 fontModule = new FontModule;
801 connect(fontModule->osFontsCB, SIGNAL(clicked()),
802 this, SLOT(change_adaptor()));
803 connect(fontModule->osFontsCB, SIGNAL(toggled(bool)),
804 this, SLOT(osFontsChanged(bool)));
805 connect(fontModule->fontsRomanCO, SIGNAL(activated(int)),
806 this, SLOT(change_adaptor()));
807 connect(fontModule->fontsRomanCO, SIGNAL(activated(int)),
808 this, SLOT(romanChanged(int)));
809 connect(fontModule->fontsSansCO, SIGNAL(activated(int)),
810 this, SLOT(change_adaptor()));
811 connect(fontModule->fontsSansCO, SIGNAL(activated(int)),
812 this, SLOT(sansChanged(int)));
813 connect(fontModule->fontsTypewriterCO, SIGNAL(activated(int)),
814 this, SLOT(change_adaptor()));
815 connect(fontModule->fontsTypewriterCO, SIGNAL(activated(int)),
816 this, SLOT(ttChanged(int)));
817 connect(fontModule->fontsMathCO, SIGNAL(activated(int)),
818 this, SLOT(change_adaptor()));
819 connect(fontModule->fontsMathCO, SIGNAL(activated(int)),
820 this, SLOT(mathFontChanged(int)));
821 connect(fontModule->fontsDefaultCO, SIGNAL(activated(int)),
822 this, SLOT(change_adaptor()));
823 connect(fontModule->fontencCO, SIGNAL(activated(int)),
824 this, SLOT(change_adaptor()));
825 connect(fontModule->fontencCO, SIGNAL(activated(int)),
826 this, SLOT(fontencChanged(int)));
827 connect(fontModule->fontencLE, SIGNAL(textChanged(const QString &)),
828 this, SLOT(change_adaptor()));
829 connect(fontModule->fontsizeCO, SIGNAL(activated(int)),
830 this, SLOT(change_adaptor()));
831 connect(fontModule->cjkFontLE, SIGNAL(textChanged(const QString &)),
832 this, SLOT(change_adaptor()));
833 connect(fontModule->microtypeCB, SIGNAL(clicked()),
834 this, SLOT(change_adaptor()));
835 connect(fontModule->scaleSansSB, SIGNAL(valueChanged(int)),
836 this, SLOT(change_adaptor()));
837 connect(fontModule->scaleTypewriterSB, SIGNAL(valueChanged(int)),
838 this, SLOT(change_adaptor()));
839 connect(fontModule->fontScCB, SIGNAL(clicked()),
840 this, SLOT(change_adaptor()));
841 connect(fontModule->fontScCB, SIGNAL(toggled(bool)),
842 this, SLOT(fontScToggled(bool)));
843 connect(fontModule->fontOsfCB, SIGNAL(clicked()),
844 this, SLOT(change_adaptor()));
845 connect(fontModule->fontOsfCB, SIGNAL(toggled(bool)),
846 this, SLOT(fontOsfToggled(bool)));
848 fontModule->fontencLE->setValidator(new NoNewLineValidator(
849 fontModule->fontencLE));
850 fontModule->cjkFontLE->setValidator(new NoNewLineValidator(
851 fontModule->cjkFontLE));
855 fontModule->fontsizeCO->addItem(qt_("Default"));
856 fontModule->fontsizeCO->addItem(qt_("10"));
857 fontModule->fontsizeCO->addItem(qt_("11"));
858 fontModule->fontsizeCO->addItem(qt_("12"));
860 fontModule->fontencCO->addItem(qt_("Default"), QString("global"));
861 fontModule->fontencCO->addItem(qt_("Custom"), QString("custom"));
862 fontModule->fontencCO->addItem(qt_("None (no fontenc)"), QString("default"));
864 for (int n = 0; GuiDocument::fontfamilies_gui[n][0]; ++n)
865 fontModule->fontsDefaultCO->addItem(
866 qt_(GuiDocument::fontfamilies_gui[n]));
868 if (!LaTeXFeatures::isAvailable("fontspec"))
869 fontModule->osFontsCB->setToolTip(
870 qt_("Use OpenType and TrueType fonts directly (requires XeTeX or LuaTeX)\n"
871 "You need to install the package \"fontspec\" to use this feature"));
875 pageLayoutModule = new UiWidget<Ui::PageLayoutUi>;
876 connect(pageLayoutModule->papersizeCO, SIGNAL(activated(int)),
877 this, SLOT(papersizeChanged(int)));
878 connect(pageLayoutModule->papersizeCO, SIGNAL(activated(int)),
879 this, SLOT(papersizeChanged(int)));
880 connect(pageLayoutModule->portraitRB, SIGNAL(clicked()),
881 this, SLOT(change_adaptor()));
882 connect(pageLayoutModule->papersizeCO, SIGNAL(activated(int)),
883 this, SLOT(change_adaptor()));
884 connect(pageLayoutModule->paperheightLE, SIGNAL(textChanged(const QString &)),
885 this, SLOT(change_adaptor()));
886 connect(pageLayoutModule->paperwidthLE, SIGNAL(textChanged(const QString &)),
887 this, SLOT(change_adaptor()));
888 connect(pageLayoutModule->paperwidthUnitCO, SIGNAL(activated(int)),
889 this, SLOT(change_adaptor()));
890 connect(pageLayoutModule->paperheightUnitCO, SIGNAL(activated(int)),
891 this, SLOT(change_adaptor()));
892 connect(pageLayoutModule->portraitRB, SIGNAL(clicked()),
893 this, SLOT(change_adaptor()));
894 connect(pageLayoutModule->landscapeRB, SIGNAL(clicked()),
895 this, SLOT(change_adaptor()));
896 connect(pageLayoutModule->facingPagesCB, SIGNAL(clicked()),
897 this, SLOT(change_adaptor()));
898 connect(pageLayoutModule->pagestyleCO, SIGNAL(activated(int)),
899 this, SLOT(change_adaptor()));
901 pageLayoutModule->pagestyleCO->addItem(qt_("Default"));
902 pageLayoutModule->pagestyleCO->addItem(qt_("empty"));
903 pageLayoutModule->pagestyleCO->addItem(qt_("plain"));
904 pageLayoutModule->pagestyleCO->addItem(qt_("headings"));
905 pageLayoutModule->pagestyleCO->addItem(qt_("fancy"));
906 bc().addCheckedLineEdit(pageLayoutModule->paperheightLE,
907 pageLayoutModule->paperheightL);
908 bc().addCheckedLineEdit(pageLayoutModule->paperwidthLE,
909 pageLayoutModule->paperwidthL);
911 QComboBox * cb = pageLayoutModule->papersizeCO;
912 cb->addItem(qt_("Default"));
913 cb->addItem(qt_("Custom"));
914 cb->addItem(qt_("US letter"));
915 cb->addItem(qt_("US legal"));
916 cb->addItem(qt_("US executive"));
917 cb->addItem(qt_("A0"));
918 cb->addItem(qt_("A1"));
919 cb->addItem(qt_("A2"));
920 cb->addItem(qt_("A3"));
921 cb->addItem(qt_("A4"));
922 cb->addItem(qt_("A5"));
923 cb->addItem(qt_("A6"));
924 cb->addItem(qt_("B0"));
925 cb->addItem(qt_("B1"));
926 cb->addItem(qt_("B2"));
927 cb->addItem(qt_("B3"));
928 cb->addItem(qt_("B4"));
929 cb->addItem(qt_("B5"));
930 cb->addItem(qt_("B6"));
931 cb->addItem(qt_("C0"));
932 cb->addItem(qt_("C1"));
933 cb->addItem(qt_("C2"));
934 cb->addItem(qt_("C3"));
935 cb->addItem(qt_("C4"));
936 cb->addItem(qt_("C5"));
937 cb->addItem(qt_("C6"));
938 cb->addItem(qt_("JIS B0"));
939 cb->addItem(qt_("JIS B1"));
940 cb->addItem(qt_("JIS B2"));
941 cb->addItem(qt_("JIS B3"));
942 cb->addItem(qt_("JIS B4"));
943 cb->addItem(qt_("JIS B5"));
944 cb->addItem(qt_("JIS B6"));
945 // remove the %-items from the unit choice
946 pageLayoutModule->paperwidthUnitCO->noPercents();
947 pageLayoutModule->paperheightUnitCO->noPercents();
948 pageLayoutModule->paperheightLE->setValidator(unsignedLengthValidator(
949 pageLayoutModule->paperheightLE));
950 pageLayoutModule->paperwidthLE->setValidator(unsignedLengthValidator(
951 pageLayoutModule->paperwidthLE));
955 marginsModule = new UiWidget<Ui::MarginsUi>;
956 connect(marginsModule->marginCB, SIGNAL(toggled(bool)),
957 this, SLOT(setCustomMargins(bool)));
958 connect(marginsModule->marginCB, SIGNAL(clicked()),
959 this, SLOT(change_adaptor()));
960 connect(marginsModule->topLE, SIGNAL(textChanged(QString)),
961 this, SLOT(change_adaptor()));
962 connect(marginsModule->topUnit, SIGNAL(activated(int)),
963 this, SLOT(change_adaptor()));
964 connect(marginsModule->bottomLE, SIGNAL(textChanged(QString)),
965 this, SLOT(change_adaptor()));
966 connect(marginsModule->bottomUnit, SIGNAL(activated(int)),
967 this, SLOT(change_adaptor()));
968 connect(marginsModule->innerLE, SIGNAL(textChanged(QString)),
969 this, SLOT(change_adaptor()));
970 connect(marginsModule->innerUnit, SIGNAL(activated(int)),
971 this, SLOT(change_adaptor()));
972 connect(marginsModule->outerLE, SIGNAL(textChanged(QString)),
973 this, SLOT(change_adaptor()));
974 connect(marginsModule->outerUnit, SIGNAL(activated(int)),
975 this, SLOT(change_adaptor()));
976 connect(marginsModule->headheightLE, SIGNAL(textChanged(QString)),
977 this, SLOT(change_adaptor()));
978 connect(marginsModule->headheightUnit, SIGNAL(activated(int)),
979 this, SLOT(change_adaptor()));
980 connect(marginsModule->headsepLE, SIGNAL(textChanged(QString)),
981 this, SLOT(change_adaptor()));
982 connect(marginsModule->headsepUnit, SIGNAL(activated(int)),
983 this, SLOT(change_adaptor()));
984 connect(marginsModule->footskipLE, SIGNAL(textChanged(QString)),
985 this, SLOT(change_adaptor()));
986 connect(marginsModule->footskipUnit, SIGNAL(activated(int)),
987 this, SLOT(change_adaptor()));
988 connect(marginsModule->columnsepLE, SIGNAL(textChanged(QString)),
989 this, SLOT(change_adaptor()));
990 connect(marginsModule->columnsepUnit, SIGNAL(activated(int)),
991 this, SLOT(change_adaptor()));
992 marginsModule->topLE->setValidator(new LengthValidator(
993 marginsModule->topLE));
994 marginsModule->bottomLE->setValidator(new LengthValidator(
995 marginsModule->bottomLE));
996 marginsModule->innerLE->setValidator(new LengthValidator(
997 marginsModule->innerLE));
998 marginsModule->outerLE->setValidator(new LengthValidator(
999 marginsModule->outerLE));
1000 marginsModule->headsepLE->setValidator(new LengthValidator(
1001 marginsModule->headsepLE));
1002 marginsModule->headheightLE->setValidator(new LengthValidator(
1003 marginsModule->headheightLE));
1004 marginsModule->footskipLE->setValidator(new LengthValidator(
1005 marginsModule->footskipLE));
1006 marginsModule->columnsepLE->setValidator(new LengthValidator(
1007 marginsModule->columnsepLE));
1009 bc().addCheckedLineEdit(marginsModule->topLE,
1010 marginsModule->topL);
1011 bc().addCheckedLineEdit(marginsModule->bottomLE,
1012 marginsModule->bottomL);
1013 bc().addCheckedLineEdit(marginsModule->innerLE,
1014 marginsModule->innerL);
1015 bc().addCheckedLineEdit(marginsModule->outerLE,
1016 marginsModule->outerL);
1017 bc().addCheckedLineEdit(marginsModule->headsepLE,
1018 marginsModule->headsepL);
1019 bc().addCheckedLineEdit(marginsModule->headheightLE,
1020 marginsModule->headheightL);
1021 bc().addCheckedLineEdit(marginsModule->footskipLE,
1022 marginsModule->footskipL);
1023 bc().addCheckedLineEdit(marginsModule->columnsepLE,
1024 marginsModule->columnsepL);
1028 langModule = new UiWidget<Ui::LanguageUi>;
1029 connect(langModule->languageCO, SIGNAL(activated(int)),
1030 this, SLOT(change_adaptor()));
1031 connect(langModule->languageCO, SIGNAL(activated(int)),
1032 this, SLOT(languageChanged(int)));
1033 connect(langModule->defaultencodingRB, SIGNAL(clicked()),
1034 this, SLOT(change_adaptor()));
1035 connect(langModule->otherencodingRB, SIGNAL(clicked()),
1036 this, SLOT(change_adaptor()));
1037 connect(langModule->encodingCO, SIGNAL(activated(int)),
1038 this, SLOT(change_adaptor()));
1039 connect(langModule->quoteStyleCO, SIGNAL(activated(int)),
1040 this, SLOT(change_adaptor()));
1041 connect(langModule->languagePackageCO, SIGNAL(activated(int)),
1042 this, SLOT(change_adaptor()));
1043 connect(langModule->languagePackageLE, SIGNAL(textChanged(QString)),
1044 this, SLOT(change_adaptor()));
1045 connect(langModule->languagePackageCO, SIGNAL(currentIndexChanged(int)),
1046 this, SLOT(languagePackageChanged(int)));
1048 langModule->languagePackageLE->setValidator(new NoNewLineValidator(
1049 langModule->languagePackageLE));
1051 QAbstractItemModel * language_model = guiApp->languageModel();
1052 // FIXME: it would be nice if sorting was enabled/disabled via a checkbox.
1053 language_model->sort(0);
1054 langModule->languageCO->setModel(language_model);
1055 langModule->languageCO->setModelColumn(0);
1057 // Always put the default encoding in the first position.
1058 langModule->encodingCO->addItem(qt_("Language Default (no inputenc)"));
1059 QStringList encodinglist;
1060 Encodings::const_iterator it = encodings.begin();
1061 Encodings::const_iterator const end = encodings.end();
1062 for (; it != end; ++it)
1064 encodinglist.append(qt_(it->guiName()));
1065 encodinglist.sort();
1066 langModule->encodingCO->addItems(encodinglist);
1068 langModule->quoteStyleCO->addItem(
1069 qt_("``text''"),InsetQuotes::EnglishQuotes);
1070 langModule->quoteStyleCO->addItem(
1071 qt_("''text''"), InsetQuotes::SwedishQuotes);
1072 langModule->quoteStyleCO->addItem
1073 (qt_(",,text``"), InsetQuotes::GermanQuotes);
1074 langModule->quoteStyleCO->addItem(
1075 qt_(",,text''"), InsetQuotes::PolishQuotes);
1076 langModule->quoteStyleCO->addItem(
1077 qt_("<<text>>"), InsetQuotes::FrenchQuotes);
1078 langModule->quoteStyleCO->addItem(
1079 qt_(">>text<<"), InsetQuotes::DanishQuotes);
1081 langModule->languagePackageCO->addItem(
1082 qt_("Default"), toqstr("default"));
1083 langModule->languagePackageCO->addItem(
1084 qt_("Automatic"), toqstr("auto"));
1085 langModule->languagePackageCO->addItem(
1086 qt_("Always Babel"), toqstr("babel"));
1087 langModule->languagePackageCO->addItem(
1088 qt_("Custom"), toqstr("custom"));
1089 langModule->languagePackageCO->addItem(
1090 qt_("None[[language package]]"), toqstr("none"));
1094 colorModule = new UiWidget<Ui::ColorUi>;
1095 connect(colorModule->fontColorPB, SIGNAL(clicked()),
1096 this, SLOT(changeFontColor()));
1097 connect(colorModule->delFontColorTB, SIGNAL(clicked()),
1098 this, SLOT(deleteFontColor()));
1099 connect(colorModule->noteFontColorPB, SIGNAL(clicked()),
1100 this, SLOT(changeNoteFontColor()));
1101 connect(colorModule->delNoteFontColorTB, SIGNAL(clicked()),
1102 this, SLOT(deleteNoteFontColor()));
1103 connect(colorModule->backgroundPB, SIGNAL(clicked()),
1104 this, SLOT(changeBackgroundColor()));
1105 connect(colorModule->delBackgroundTB, SIGNAL(clicked()),
1106 this, SLOT(deleteBackgroundColor()));
1107 connect(colorModule->boxBackgroundPB, SIGNAL(clicked()),
1108 this, SLOT(changeBoxBackgroundColor()));
1109 connect(colorModule->delBoxBackgroundTB, SIGNAL(clicked()),
1110 this, SLOT(deleteBoxBackgroundColor()));
1114 numberingModule = new UiWidget<Ui::NumberingUi>;
1115 connect(numberingModule->depthSL, SIGNAL(valueChanged(int)),
1116 this, SLOT(change_adaptor()));
1117 connect(numberingModule->tocSL, SIGNAL(valueChanged(int)),
1118 this, SLOT(change_adaptor()));
1119 connect(numberingModule->depthSL, SIGNAL(valueChanged(int)),
1120 this, SLOT(updateNumbering()));
1121 connect(numberingModule->tocSL, SIGNAL(valueChanged(int)),
1122 this, SLOT(updateNumbering()));
1123 numberingModule->tocTW->setColumnCount(3);
1124 numberingModule->tocTW->headerItem()->setText(0, qt_("Example"));
1125 numberingModule->tocTW->headerItem()->setText(1, qt_("Numbered"));
1126 numberingModule->tocTW->headerItem()->setText(2, qt_("Appears in TOC"));
1127 setSectionResizeMode(numberingModule->tocTW->header(), QHeaderView::ResizeToContents);
1130 biblioModule = new UiWidget<Ui::BiblioUi>;
1131 connect(biblioModule->citeDefaultRB, SIGNAL(toggled(bool)),
1132 this, SLOT(setNumerical(bool)));
1133 connect(biblioModule->citeJurabibRB, SIGNAL(toggled(bool)),
1134 this, SLOT(setAuthorYear(bool)));
1135 connect(biblioModule->citeNatbibRB, SIGNAL(toggled(bool)),
1136 biblioModule->citationStyleL, SLOT(setEnabled(bool)));
1137 connect(biblioModule->citeNatbibRB, SIGNAL(toggled(bool)),
1138 biblioModule->citeStyleCO, SLOT(setEnabled(bool)));
1139 connect(biblioModule->citeDefaultRB, SIGNAL(clicked()),
1140 this, SLOT(biblioChanged()));
1141 connect(biblioModule->citeNatbibRB, SIGNAL(clicked()),
1142 this, SLOT(biblioChanged()));
1143 connect(biblioModule->citeStyleCO, SIGNAL(activated(int)),
1144 this, SLOT(biblioChanged()));
1145 connect(biblioModule->citeJurabibRB, SIGNAL(clicked()),
1146 this, SLOT(biblioChanged()));
1147 connect(biblioModule->bibtopicCB, SIGNAL(clicked()),
1148 this, SLOT(biblioChanged()));
1149 connect(biblioModule->bibtexCO, SIGNAL(activated(int)),
1150 this, SLOT(bibtexChanged(int)));
1151 connect(biblioModule->bibtexOptionsLE, SIGNAL(textChanged(QString)),
1152 this, SLOT(biblioChanged()));
1153 connect(biblioModule->bibtexStyleLE, SIGNAL(textChanged(QString)),
1154 this, SLOT(biblioChanged()));
1156 biblioModule->bibtexOptionsLE->setValidator(new NoNewLineValidator(
1157 biblioModule->bibtexOptionsLE));
1158 biblioModule->bibtexStyleLE->setValidator(new NoNewLineValidator(
1159 biblioModule->bibtexStyleLE));
1161 biblioModule->citeStyleCO->addItem(qt_("Author-year"));
1162 biblioModule->citeStyleCO->addItem(qt_("Numerical"));
1163 biblioModule->citeStyleCO->setCurrentIndex(0);
1165 // NOTE: we do not provide "custom" here for security reasons!
1166 biblioModule->bibtexCO->clear();
1167 biblioModule->bibtexCO->addItem(qt_("Default"), QString("default"));
1168 for (set<string>::const_iterator it = lyxrc.bibtex_alternatives.begin();
1169 it != lyxrc.bibtex_alternatives.end(); ++it) {
1170 QString const command = toqstr(*it).left(toqstr(*it).indexOf(" "));
1171 biblioModule->bibtexCO->addItem(command, command);
1176 indicesModule = new GuiIndices;
1177 connect(indicesModule, SIGNAL(changed()),
1178 this, SLOT(change_adaptor()));
1182 mathsModule = new UiWidget<Ui::MathsUi>;
1183 QStringList headers;
1184 headers << qt_("Package") << qt_("Load automatically")
1185 << qt_("Load always") << qt_("Do not load");
1186 mathsModule->packagesTW->setHorizontalHeaderLabels(headers);
1187 setSectionResizeMode(mathsModule->packagesTW->horizontalHeader(), QHeaderView::Stretch);
1188 map<string, string> const & packages = BufferParams::auto_packages();
1189 mathsModule->packagesTW->setRowCount(packages.size());
1191 for (map<string, string>::const_iterator it = packages.begin();
1192 it != packages.end(); ++it) {
1193 docstring const package = from_ascii(it->first);
1194 QString autoTooltip = qt_(it->second);
1195 QString alwaysTooltip;
1196 if (package == "amsmath")
1198 qt_("The AMS LaTeX packages are always used");
1200 alwaysTooltip = toqstr(bformat(
1201 _("The LaTeX package %1$s is always used"),
1203 QString neverTooltip;
1204 if (package == "amsmath")
1206 qt_("The AMS LaTeX packages are never used");
1208 neverTooltip = toqstr(bformat(
1209 _("The LaTeX package %1$s is never used"),
1211 QRadioButton * autoRB = new QRadioButton(mathsModule);
1212 QRadioButton * alwaysRB = new QRadioButton(mathsModule);
1213 QRadioButton * neverRB = new QRadioButton(mathsModule);
1214 QButtonGroup * packageGroup = new QButtonGroup(mathsModule);
1215 packageGroup->addButton(autoRB);
1216 packageGroup->addButton(alwaysRB);
1217 packageGroup->addButton(neverRB);
1218 autoRB->setToolTip(autoTooltip);
1219 alwaysRB->setToolTip(alwaysTooltip);
1220 neverRB->setToolTip(neverTooltip);
1221 QTableWidgetItem * pack = new QTableWidgetItem(toqstr(package));
1222 mathsModule->packagesTW->setItem(i, 0, pack);
1223 mathsModule->packagesTW->setCellWidget(i, 1, autoRB);
1224 mathsModule->packagesTW->setCellWidget(i, 2, alwaysRB);
1225 mathsModule->packagesTW->setCellWidget(i, 3, neverRB);
1227 connect(autoRB, SIGNAL(clicked()),
1228 this, SLOT(change_adaptor()));
1229 connect(alwaysRB, SIGNAL(clicked()),
1230 this, SLOT(change_adaptor()));
1231 connect(neverRB, SIGNAL(clicked()),
1232 this, SLOT(change_adaptor()));
1235 connect(mathsModule->allPackagesAutoPB, SIGNAL(clicked()),
1236 this, SLOT(allPackagesAuto()));
1237 connect(mathsModule->allPackagesAlwaysPB, SIGNAL(clicked()),
1238 this, SLOT(allPackagesAlways()));
1239 connect(mathsModule->allPackagesNotPB, SIGNAL(clicked()),
1240 this, SLOT(allPackagesNot()));
1241 connect(mathsModule->allPackagesAutoPB, SIGNAL(clicked()),
1242 this, SLOT(change_adaptor()));
1243 connect(mathsModule->allPackagesAlwaysPB, SIGNAL(clicked()),
1244 this, SLOT(change_adaptor()));
1245 connect(mathsModule->allPackagesNotPB, SIGNAL(clicked()),
1246 this, SLOT(change_adaptor()));
1250 latexModule = new UiWidget<Ui::LaTeXUi>;
1251 connect(latexModule->optionsLE, SIGNAL(textChanged(QString)),
1252 this, SLOT(change_adaptor()));
1253 connect(latexModule->defaultOptionsCB, SIGNAL(clicked()),
1254 this, SLOT(change_adaptor()));
1255 connect(latexModule->psdriverCO, SIGNAL(activated(int)),
1256 this, SLOT(change_adaptor()));
1257 connect(latexModule->classCO, SIGNAL(activated(int)),
1258 this, SLOT(classChanged_adaptor()));
1259 connect(latexModule->classCO, SIGNAL(activated(int)),
1260 this, SLOT(change_adaptor()));
1261 connect(latexModule->layoutPB, SIGNAL(clicked()),
1262 this, SLOT(browseLayout()));
1263 connect(latexModule->layoutPB, SIGNAL(clicked()),
1264 this, SLOT(change_adaptor()));
1265 connect(latexModule->childDocGB, SIGNAL(clicked()),
1266 this, SLOT(change_adaptor()));
1267 connect(latexModule->childDocLE, SIGNAL(textChanged(QString)),
1268 this, SLOT(change_adaptor()));
1269 connect(latexModule->childDocPB, SIGNAL(clicked()),
1270 this, SLOT(browseMaster()));
1271 connect(latexModule->suppressDateCB, SIGNAL(clicked()),
1272 this, SLOT(change_adaptor()));
1273 connect(latexModule->refstyleCB, SIGNAL(clicked()),
1274 this, SLOT(change_adaptor()));
1276 latexModule->optionsLE->setValidator(new NoNewLineValidator(
1277 latexModule->optionsLE));
1278 latexModule->childDocLE->setValidator(new NoNewLineValidator(
1279 latexModule->childDocLE));
1281 // postscript drivers
1282 for (int n = 0; tex_graphics[n][0]; ++n) {
1283 QString enc = qt_(tex_graphics_gui[n]);
1284 latexModule->psdriverCO->addItem(enc);
1287 LayoutFileList const & bcl = LayoutFileList::get();
1288 vector<LayoutFileIndex> classList = bcl.classList();
1289 sort(classList.begin(), classList.end(), less_textclass_avail_desc());
1291 vector<LayoutFileIndex>::const_iterator cit = classList.begin();
1292 vector<LayoutFileIndex>::const_iterator cen = classList.end();
1293 for (int i = 0; cit != cen; ++cit, ++i) {
1294 LayoutFile const & tc = bcl[*cit];
1295 bool const available = tc.isTeXClassAvailable();
1296 docstring const guiname = translateIfPossible(from_utf8(tc.description()));
1297 // tooltip sensu "KOMA-Script Article [Class 'scrartcl']"
1298 QString tooltip = toqstr(bformat(_("%1$s [Class '%2$s']"), guiname, from_utf8(tc.latexname())));
1300 docstring const output_type = (tc.outputType() == lyx::DOCBOOK) ? _("DocBook") : _("LaTeX");
1301 tooltip += '\n' + toqstr(bformat(_("Class not found by LyX. "
1302 "Please check if you have the matching %1$s class "
1303 "and all required packages (%2$s) installed."),
1304 output_type, from_utf8(tc.prerequisites(", "))));
1306 latexModule->classCO->addItemSort(toqstr(tc.name()),
1308 toqstr(translateIfPossible(from_utf8(tc.category()))),
1310 true, true, true, available);
1315 branchesModule = new GuiBranches;
1316 connect(branchesModule, SIGNAL(changed()),
1317 this, SLOT(change_adaptor()));
1318 connect(branchesModule, SIGNAL(renameBranches(docstring const &, docstring const &)),
1319 this, SLOT(branchesRename(docstring const &, docstring const &)));
1320 connect(branchesModule, SIGNAL(okPressed()), this, SLOT(slotOK()));
1321 updateUnknownBranches();
1325 preambleModule = new PreambleModule;
1326 connect(preambleModule, SIGNAL(changed()),
1327 this, SLOT(change_adaptor()));
1329 localLayout = new LocalLayout;
1330 connect(localLayout, SIGNAL(changed()),
1331 this, SLOT(change_adaptor()));
1335 bulletsModule = new BulletsModule;
1336 connect(bulletsModule, SIGNAL(changed()),
1337 this, SLOT(change_adaptor()));
1341 modulesModule = new UiWidget<Ui::ModulesUi>;
1342 modulesModule->availableLV->header()->setVisible(false);
1343 setSectionResizeMode(modulesModule->availableLV->header(), QHeaderView::ResizeToContents);
1344 modulesModule->availableLV->header()->setStretchLastSection(false);
1346 new ModuleSelectionManager(modulesModule->availableLV,
1347 modulesModule->selectedLV,
1348 modulesModule->addPB, modulesModule->deletePB,
1349 modulesModule->upPB, modulesModule->downPB,
1350 availableModel(), selectedModel(), this);
1351 connect(selectionManager, SIGNAL(updateHook()),
1352 this, SLOT(updateModuleInfo()));
1353 connect(selectionManager, SIGNAL(selectionChanged()),
1354 this, SLOT(modulesChanged()));
1358 pdfSupportModule = new UiWidget<Ui::PDFSupportUi>;
1359 connect(pdfSupportModule->use_hyperrefGB, SIGNAL(toggled(bool)),
1360 this, SLOT(change_adaptor()));
1361 connect(pdfSupportModule->titleLE, SIGNAL(textChanged(QString)),
1362 this, SLOT(change_adaptor()));
1363 connect(pdfSupportModule->authorLE, SIGNAL(textChanged(QString)),
1364 this, SLOT(change_adaptor()));
1365 connect(pdfSupportModule->subjectLE, SIGNAL(textChanged(QString)),
1366 this, SLOT(change_adaptor()));
1367 connect(pdfSupportModule->keywordsLE, SIGNAL(textChanged(QString)),
1368 this, SLOT(change_adaptor()));
1369 connect(pdfSupportModule->bookmarksGB, SIGNAL(toggled(bool)),
1370 this, SLOT(change_adaptor()));
1371 connect(pdfSupportModule->bookmarksnumberedCB, SIGNAL(toggled(bool)),
1372 this, SLOT(change_adaptor()));
1373 connect(pdfSupportModule->bookmarksopenGB, SIGNAL(toggled(bool)),
1374 this, SLOT(change_adaptor()));
1375 connect(pdfSupportModule->bookmarksopenlevelSB, SIGNAL(valueChanged(int)),
1376 this, SLOT(change_adaptor()));
1377 connect(pdfSupportModule->breaklinksCB, SIGNAL(toggled(bool)),
1378 this, SLOT(change_adaptor()));
1379 connect(pdfSupportModule->pdfborderCB, SIGNAL(toggled(bool)),
1380 this, SLOT(change_adaptor()));
1381 connect(pdfSupportModule->colorlinksCB, SIGNAL(toggled(bool)),
1382 this, SLOT(change_adaptor()));
1383 connect(pdfSupportModule->backrefCO, SIGNAL(activated(int)),
1384 this, SLOT(change_adaptor()));
1385 connect(pdfSupportModule->pdfusetitleCB, SIGNAL(toggled(bool)),
1386 this, SLOT(change_adaptor()));
1387 connect(pdfSupportModule->fullscreenCB, SIGNAL(toggled(bool)),
1388 this, SLOT(change_adaptor()));
1389 connect(pdfSupportModule->optionsLE, SIGNAL(textChanged(QString)),
1390 this, SLOT(change_adaptor()));
1392 pdfSupportModule->titleLE->setValidator(new NoNewLineValidator(
1393 pdfSupportModule->titleLE));
1394 pdfSupportModule->authorLE->setValidator(new NoNewLineValidator(
1395 pdfSupportModule->authorLE));
1396 pdfSupportModule->subjectLE->setValidator(new NoNewLineValidator(
1397 pdfSupportModule->subjectLE));
1398 pdfSupportModule->keywordsLE->setValidator(new NoNewLineValidator(
1399 pdfSupportModule->keywordsLE));
1400 pdfSupportModule->optionsLE->setValidator(new NoNewLineValidator(
1401 pdfSupportModule->optionsLE));
1403 for (int i = 0; backref_opts[i][0]; ++i)
1404 pdfSupportModule->backrefCO->addItem(qt_(backref_opts_gui[i]));
1408 floatModule = new FloatPlacement;
1409 connect(floatModule, SIGNAL(changed()),
1410 this, SLOT(change_adaptor()));
1414 listingsModule = new UiWidget<Ui::ListingsSettingsUi>;
1415 connect(listingsModule->listingsED, SIGNAL(textChanged()),
1416 this, SLOT(change_adaptor()));
1417 connect(listingsModule->bypassCB, SIGNAL(clicked()),
1418 this, SLOT(change_adaptor()));
1419 connect(listingsModule->bypassCB, SIGNAL(clicked()),
1420 this, SLOT(setListingsMessage()));
1421 connect(listingsModule->listingsED, SIGNAL(textChanged()),
1422 this, SLOT(setListingsMessage()));
1423 listingsModule->listingsTB->setPlainText(
1424 qt_("Input listings parameters below. Enter ? for a list of parameters."));
1428 docPS->addPanel(latexModule, N_("Document Class"));
1429 docPS->addPanel(masterChildModule, N_("Child Documents"));
1430 docPS->addPanel(modulesModule, N_("Modules"));
1431 docPS->addPanel(localLayout, N_("Local Layout"));
1432 docPS->addPanel(fontModule, N_("Fonts"));
1433 docPS->addPanel(textLayoutModule, N_("Text Layout"));
1434 docPS->addPanel(pageLayoutModule, N_("Page Layout"));
1435 docPS->addPanel(marginsModule, N_("Page Margins"));
1436 docPS->addPanel(langModule, N_("Language"));
1437 docPS->addPanel(colorModule, N_("Colors"));
1438 docPS->addPanel(numberingModule, N_("Numbering & TOC"));
1439 docPS->addPanel(biblioModule, N_("Bibliography"));
1440 docPS->addPanel(indicesModule, N_("Indexes"));
1441 docPS->addPanel(pdfSupportModule, N_("PDF Properties"));
1442 docPS->addPanel(mathsModule, N_("Math Options"));
1443 docPS->addPanel(floatModule, N_("Float Placement"));
1444 docPS->addPanel(listingsModule, N_("Listings[[inset]]"));
1445 docPS->addPanel(bulletsModule, N_("Bullets"));
1446 docPS->addPanel(branchesModule, N_("Branches"));
1447 docPS->addPanel(outputModule, N_("Format"));
1448 docPS->addPanel(preambleModule, N_("LaTeX Preamble"));
1449 docPS->setCurrentPanel("Document Class");
1450 // FIXME: hack to work around resizing bug in Qt >= 4.2
1451 // bug verified with Qt 4.2.{0-3} (JSpitzm)
1452 #if QT_VERSION >= 0x040200
1453 docPS->updateGeometry();
1458 void GuiDocument::saveDefaultClicked()
1464 void GuiDocument::useDefaultsClicked()
1470 void GuiDocument::change_adaptor()
1472 nonModuleChanged_ = true;
1477 void GuiDocument::includeonlyClicked(QTreeWidgetItem * item, int)
1482 string child = fromqstr(item->text(0));
1486 if (std::find(includeonlys_.begin(),
1487 includeonlys_.end(), child) != includeonlys_.end())
1488 includeonlys_.remove(child);
1490 includeonlys_.push_back(child);
1492 updateIncludeonlys();
1497 QString GuiDocument::validateListingsParameters()
1499 // use a cache here to avoid repeated validation
1500 // of the same parameters
1502 static string param_cache;
1503 static QString msg_cache;
1505 if (listingsModule->bypassCB->isChecked())
1508 string params = fromqstr(listingsModule->listingsED->toPlainText());
1509 if (params != param_cache) {
1510 param_cache = params;
1511 msg_cache = toqstr(InsetListingsParams(params).validate());
1517 void GuiDocument::setListingsMessage()
1520 static bool isOK = true;
1521 QString msg = validateListingsParameters();
1522 if (msg.isEmpty()) {
1526 // listingsTB->setTextColor("black");
1527 listingsModule->listingsTB->setPlainText(
1528 qt_("Input listings parameters below. "
1529 "Enter ? for a list of parameters."));
1532 // listingsTB->setTextColor("red");
1533 listingsModule->listingsTB->setPlainText(msg);
1538 void GuiDocument::setLSpacing(int item)
1540 textLayoutModule->lspacingLE->setEnabled(item == 3);
1544 void GuiDocument::setIndent(int item)
1546 bool const enable = (item == 1);
1547 textLayoutModule->indentLE->setEnabled(enable);
1548 textLayoutModule->indentLengthCO->setEnabled(enable);
1549 textLayoutModule->skipLE->setEnabled(false);
1550 textLayoutModule->skipLengthCO->setEnabled(false);
1555 void GuiDocument::enableIndent(bool indent)
1557 textLayoutModule->skipLE->setEnabled(!indent);
1558 textLayoutModule->skipLengthCO->setEnabled(!indent);
1560 setIndent(textLayoutModule->indentCO->currentIndex());
1564 void GuiDocument::setSkip(int item)
1566 bool const enable = (item == 3);
1567 textLayoutModule->skipLE->setEnabled(enable);
1568 textLayoutModule->skipLengthCO->setEnabled(enable);
1573 void GuiDocument::enableSkip(bool skip)
1575 textLayoutModule->indentLE->setEnabled(!skip);
1576 textLayoutModule->indentLengthCO->setEnabled(!skip);
1578 setSkip(textLayoutModule->skipCO->currentIndex());
1582 void GuiDocument::setMargins()
1584 bool const extern_geometry =
1585 documentClass().provides("geometry");
1586 marginsModule->marginCB->setEnabled(!extern_geometry);
1587 if (extern_geometry) {
1588 marginsModule->marginCB->setChecked(false);
1589 setCustomMargins(true);
1591 marginsModule->marginCB->setChecked(!bp_.use_geometry);
1592 setCustomMargins(!bp_.use_geometry);
1597 void GuiDocument::papersizeChanged(int paper_size)
1599 setCustomPapersize(paper_size == 1);
1603 void GuiDocument::setCustomPapersize(bool custom)
1605 pageLayoutModule->paperwidthL->setEnabled(custom);
1606 pageLayoutModule->paperwidthLE->setEnabled(custom);
1607 pageLayoutModule->paperwidthUnitCO->setEnabled(custom);
1608 pageLayoutModule->paperheightL->setEnabled(custom);
1609 pageLayoutModule->paperheightLE->setEnabled(custom);
1610 pageLayoutModule->paperheightLE->setFocus();
1611 pageLayoutModule->paperheightUnitCO->setEnabled(custom);
1615 void GuiDocument::setColSep()
1617 setCustomMargins(marginsModule->marginCB->checkState() == Qt::Checked);
1621 void GuiDocument::setCustomMargins(bool custom)
1623 marginsModule->topL->setEnabled(!custom);
1624 marginsModule->topLE->setEnabled(!custom);
1625 marginsModule->topUnit->setEnabled(!custom);
1627 marginsModule->bottomL->setEnabled(!custom);
1628 marginsModule->bottomLE->setEnabled(!custom);
1629 marginsModule->bottomUnit->setEnabled(!custom);
1631 marginsModule->innerL->setEnabled(!custom);
1632 marginsModule->innerLE->setEnabled(!custom);
1633 marginsModule->innerUnit->setEnabled(!custom);
1635 marginsModule->outerL->setEnabled(!custom);
1636 marginsModule->outerLE->setEnabled(!custom);
1637 marginsModule->outerUnit->setEnabled(!custom);
1639 marginsModule->headheightL->setEnabled(!custom);
1640 marginsModule->headheightLE->setEnabled(!custom);
1641 marginsModule->headheightUnit->setEnabled(!custom);
1643 marginsModule->headsepL->setEnabled(!custom);
1644 marginsModule->headsepLE->setEnabled(!custom);
1645 marginsModule->headsepUnit->setEnabled(!custom);
1647 marginsModule->footskipL->setEnabled(!custom);
1648 marginsModule->footskipLE->setEnabled(!custom);
1649 marginsModule->footskipUnit->setEnabled(!custom);
1651 bool const enableColSep = !custom &&
1652 textLayoutModule->twoColumnCB->checkState() == Qt::Checked;
1653 marginsModule->columnsepL->setEnabled(enableColSep);
1654 marginsModule->columnsepLE->setEnabled(enableColSep);
1655 marginsModule->columnsepUnit->setEnabled(enableColSep);
1659 void GuiDocument::changeBackgroundColor()
1661 QColor const & newColor = QColorDialog::getColor(
1662 rgb2qcolor(set_backgroundcolor), asQWidget());
1663 if (!newColor.isValid())
1665 // set the button color and text
1666 colorModule->backgroundPB->setStyleSheet(
1667 colorButtonStyleSheet(newColor));
1668 colorModule->backgroundPB->setText(qt_("&Change..."));
1670 set_backgroundcolor = rgbFromHexName(fromqstr(newColor.name()));
1671 is_backgroundcolor = true;
1676 void GuiDocument::deleteBackgroundColor()
1678 // set the button color back to default by setting an empty StyleSheet
1679 colorModule->backgroundPB->setStyleSheet(QLatin1String(""));
1680 // change button text
1681 colorModule->backgroundPB->setText(qt_("&Default..."));
1682 // save default color (white)
1683 set_backgroundcolor = rgbFromHexName("#ffffff");
1684 is_backgroundcolor = false;
1689 void GuiDocument::changeFontColor()
1691 QColor const & newColor = QColorDialog::getColor(
1692 rgb2qcolor(set_fontcolor), asQWidget());
1693 if (!newColor.isValid())
1695 // set the button color and text
1696 colorModule->fontColorPB->setStyleSheet(
1697 colorButtonStyleSheet(newColor));
1698 colorModule->fontColorPB->setText(qt_("&Change..."));
1700 set_fontcolor = rgbFromHexName(fromqstr(newColor.name()));
1701 is_fontcolor = true;
1706 void GuiDocument::deleteFontColor()
1708 // set the button color back to default by setting an empty StyleSheet
1709 colorModule->fontColorPB->setStyleSheet(QLatin1String(""));
1710 // change button text
1711 colorModule->fontColorPB->setText(qt_("&Default..."));
1712 // save default color (black)
1713 set_fontcolor = rgbFromHexName("#000000");
1714 is_fontcolor = false;
1719 void GuiDocument::changeNoteFontColor()
1721 QColor const & newColor = QColorDialog::getColor(
1722 rgb2qcolor(set_notefontcolor), asQWidget());
1723 if (!newColor.isValid())
1725 // set the button color
1726 colorModule->noteFontColorPB->setStyleSheet(
1727 colorButtonStyleSheet(newColor));
1729 set_notefontcolor = rgbFromHexName(fromqstr(newColor.name()));
1734 void GuiDocument::deleteNoteFontColor()
1736 // set the button color back to pref
1737 theApp()->getRgbColor(Color_greyedouttext, set_notefontcolor);
1738 colorModule->noteFontColorPB->setStyleSheet(
1739 colorButtonStyleSheet(rgb2qcolor(set_notefontcolor)));
1744 void GuiDocument::changeBoxBackgroundColor()
1746 QColor const & newColor = QColorDialog::getColor(
1747 rgb2qcolor(set_boxbgcolor), asQWidget());
1748 if (!newColor.isValid())
1750 // set the button color
1751 colorModule->boxBackgroundPB->setStyleSheet(
1752 colorButtonStyleSheet(newColor));
1754 set_boxbgcolor = rgbFromHexName(fromqstr(newColor.name()));
1759 void GuiDocument::deleteBoxBackgroundColor()
1761 // set the button color back to pref
1762 theApp()->getRgbColor(Color_shadedbg, set_boxbgcolor);
1763 colorModule->boxBackgroundPB->setStyleSheet(
1764 colorButtonStyleSheet(rgb2qcolor(set_boxbgcolor)));
1769 void GuiDocument::languageChanged(int i)
1771 // some languages only work with polyglossia
1772 Language const * lang = lyx::languages.getLanguage(
1773 fromqstr(langModule->languageCO->itemData(i).toString()));
1774 if (lang->babel().empty() && !lang->polyglossia().empty()) {
1775 // If we force to switch fontspec on, store
1776 // current state (#8717)
1777 if (fontModule->osFontsCB->isEnabled())
1778 forced_fontspec_activation =
1779 !fontModule->osFontsCB->isChecked();
1780 fontModule->osFontsCB->setChecked(true);
1781 fontModule->osFontsCB->setEnabled(false);
1784 fontModule->osFontsCB->setEnabled(true);
1785 // If we have forced to switch fontspec on,
1786 // restore previous state (#8717)
1787 if (forced_fontspec_activation)
1788 fontModule->osFontsCB->setChecked(false);
1789 forced_fontspec_activation = false;
1792 // set appropriate quotation mark style
1793 if (!lang->quoteStyle().empty()) {
1794 langModule->quoteStyleCO->setCurrentIndex(
1795 bp_.getQuoteStyle(lang->quoteStyle()));
1800 void GuiDocument::osFontsChanged(bool nontexfonts)
1802 bool const tex_fonts = !nontexfonts;
1803 // store current fonts
1804 QString const font_roman = fontModule->fontsRomanCO->itemData(
1805 fontModule->fontsRomanCO->currentIndex()).toString();
1806 QString const font_sans = fontModule->fontsSansCO->itemData(
1807 fontModule->fontsSansCO->currentIndex()).toString();
1808 QString const font_typewriter = fontModule->fontsTypewriterCO->itemData(
1809 fontModule->fontsTypewriterCO->currentIndex()).toString();
1810 QString const font_math = fontModule->fontsMathCO->itemData(
1811 fontModule->fontsMathCO->currentIndex()).toString();
1812 int const font_sf_scale = fontModule->scaleSansSB->value();
1813 int const font_tt_scale = fontModule->scaleTypewriterSB->value();
1816 // store default format
1817 QString const dformat = outputModule->defaultFormatCO->itemData(
1818 outputModule->defaultFormatCO->currentIndex()).toString();
1819 updateDefaultFormat();
1820 // try to restore default format
1821 int index = outputModule->defaultFormatCO->findData(dformat);
1822 // set to default if format is not found
1825 outputModule->defaultFormatCO->setCurrentIndex(index);
1827 // try to restore fonts which were selected two toggles ago
1828 index = fontModule->fontsRomanCO->findData(fontModule->font_roman);
1830 fontModule->fontsRomanCO->setCurrentIndex(index);
1831 index = fontModule->fontsSansCO->findData(fontModule->font_sans);
1833 fontModule->fontsSansCO->setCurrentIndex(index);
1834 index = fontModule->fontsTypewriterCO->findData(fontModule->font_typewriter);
1836 fontModule->fontsTypewriterCO->setCurrentIndex(index);
1837 index = fontModule->fontsMathCO->findData(fontModule->font_math);
1839 fontModule->fontsMathCO->setCurrentIndex(index);
1840 // save fonts for next next toggle
1841 fontModule->font_roman = font_roman;
1842 fontModule->font_sans = font_sans;
1843 fontModule->font_typewriter = font_typewriter;
1844 fontModule->font_math = font_math;
1845 fontModule->font_sf_scale = font_sf_scale;
1846 fontModule->font_tt_scale = font_tt_scale;
1848 langModule->encodingCO->setEnabled(tex_fonts &&
1849 !langModule->defaultencodingRB->isChecked());
1850 langModule->defaultencodingRB->setEnabled(tex_fonts);
1851 langModule->otherencodingRB->setEnabled(tex_fonts);
1853 fontModule->fontsDefaultCO->setEnabled(tex_fonts);
1854 fontModule->fontsDefaultLA->setEnabled(tex_fonts);
1855 fontModule->cjkFontLE->setEnabled(tex_fonts);
1856 fontModule->cjkFontLA->setEnabled(tex_fonts);
1858 updateFontOptions();
1860 fontModule->fontencLA->setEnabled(tex_fonts);
1861 fontModule->fontencCO->setEnabled(tex_fonts);
1863 fontModule->fontencLE->setEnabled(false);
1865 fontencChanged(fontModule->fontencCO->currentIndex());
1869 void GuiDocument::mathFontChanged(int)
1871 updateFontOptions();
1875 void GuiDocument::fontOsfToggled(bool state)
1877 if (fontModule->osFontsCB->isChecked())
1879 QString font = fontModule->fontsRomanCO->itemData(
1880 fontModule->fontsRomanCO->currentIndex()).toString();
1881 if (hasMonolithicExpertSet(font))
1882 fontModule->fontScCB->setChecked(state);
1886 void GuiDocument::fontScToggled(bool state)
1888 if (fontModule->osFontsCB->isChecked())
1890 QString font = fontModule->fontsRomanCO->itemData(
1891 fontModule->fontsRomanCO->currentIndex()).toString();
1892 if (hasMonolithicExpertSet(font))
1893 fontModule->fontOsfCB->setChecked(state);
1897 void GuiDocument::updateFontOptions()
1899 bool const tex_fonts = !fontModule->osFontsCB->isChecked();
1902 font = fontModule->fontsSansCO->itemData(
1903 fontModule->fontsSansCO->currentIndex()).toString();
1904 bool scaleable = providesScale(font);
1905 fontModule->scaleSansSB->setEnabled(scaleable);
1906 fontModule->scaleSansLA->setEnabled(scaleable);
1908 font = fontModule->fontsTypewriterCO->itemData(
1909 fontModule->fontsTypewriterCO->currentIndex()).toString();
1910 scaleable = providesScale(font);
1911 fontModule->scaleTypewriterSB->setEnabled(scaleable);
1912 fontModule->scaleTypewriterLA->setEnabled(scaleable);
1914 font = fontModule->fontsRomanCO->itemData(
1915 fontModule->fontsRomanCO->currentIndex()).toString();
1916 fontModule->fontScCB->setEnabled(providesSC(font));
1917 fontModule->fontOsfCB->setEnabled(providesOSF(font));
1918 updateMathFonts(font);
1922 void GuiDocument::updateFontsize(string const & items, string const & sel)
1924 fontModule->fontsizeCO->clear();
1925 fontModule->fontsizeCO->addItem(qt_("Default"));
1927 for (int n = 0; !token(items,'|',n).empty(); ++n)
1928 fontModule->fontsizeCO->
1929 addItem(toqstr(token(items,'|',n)));
1931 for (int n = 0; n < fontModule->fontsizeCO->count(); ++n) {
1932 if (fromqstr(fontModule->fontsizeCO->itemText(n)) == sel) {
1933 fontModule->fontsizeCO->setCurrentIndex(n);
1940 bool GuiDocument::ot1() const
1942 QString const fontenc =
1943 fontModule->fontencCO->itemData(fontModule->fontencCO->currentIndex()).toString();
1944 return (fontenc == "default"
1945 || (fontenc == "global" && (lyxrc.fontenc == "default" || lyxrc.fontenc == "OT1"))
1946 || (fontenc == "custom" && fontModule->fontencLE->text() == "OT1"));
1950 bool GuiDocument::completeFontset() const
1952 return (fontModule->fontsSansCO->itemData(
1953 fontModule->fontsSansCO->currentIndex()).toString() == "default"
1954 && fontModule->fontsSansCO->itemData(
1955 fontModule->fontsTypewriterCO->currentIndex()).toString() == "default");
1959 bool GuiDocument::noMathFont() const
1961 return (fontModule->fontsMathCO->itemData(
1962 fontModule->fontsMathCO->currentIndex()).toString() == "default");
1966 void GuiDocument::updateTexFonts()
1968 LaTeXFonts::TexFontMap texfontmap = theLaTeXFonts().getLaTeXFonts();
1970 LaTeXFonts::TexFontMap::const_iterator it = texfontmap.begin();
1971 LaTeXFonts::TexFontMap::const_iterator end = texfontmap.end();
1972 for (; it != end; ++it) {
1973 LaTeXFont lf = it->second;
1974 if (lf.name().empty()) {
1975 LYXERR0("Error: Unnamed font: " << it->first);
1978 docstring const family = lf.family();
1979 docstring guiname = translateIfPossible(lf.guiname());
1980 if (!lf.available(ot1(), noMathFont()))
1981 guiname += _(" (not installed)");
1983 rmfonts_.insert(toqstr(guiname), toqstr(it->first));
1984 else if (family == "sf")
1985 sffonts_.insert(toqstr(guiname), toqstr(it->first));
1986 else if (family == "tt")
1987 ttfonts_.insert(toqstr(guiname), toqstr(it->first));
1988 else if (family == "math")
1989 mathfonts_.insert(toqstr(guiname), toqstr(it->first));
1994 void GuiDocument::updateFontlist()
1996 fontModule->fontsRomanCO->clear();
1997 fontModule->fontsSansCO->clear();
1998 fontModule->fontsTypewriterCO->clear();
1999 fontModule->fontsMathCO->clear();
2001 // With fontspec (XeTeX, LuaTeX), we have access to all system fonts, but not the LaTeX fonts
2002 if (fontModule->osFontsCB->isChecked()) {
2003 fontModule->fontsRomanCO->addItem(qt_("Default"), QString("default"));
2004 fontModule->fontsSansCO->addItem(qt_("Default"), QString("default"));
2005 fontModule->fontsTypewriterCO->addItem(qt_("Default"), QString("default"));
2006 QString unimath = qt_("Non-TeX Fonts Default");
2007 if (!LaTeXFeatures::isAvailable("unicode-math"))
2008 unimath += qt_(" (not available)");
2009 fontModule->fontsMathCO->addItem(qt_("Class Default (TeX Fonts)"), QString("auto"));
2010 fontModule->fontsMathCO->addItem(unimath, QString("default"));
2012 QFontDatabase fontdb;
2013 QStringList families(fontdb.families());
2014 for (QStringList::Iterator it = families.begin(); it != families.end(); ++it) {
2015 fontModule->fontsRomanCO->addItem(*it, *it);
2016 fontModule->fontsSansCO->addItem(*it, *it);
2017 fontModule->fontsTypewriterCO->addItem(*it, *it);
2022 if (rmfonts_.empty())
2025 fontModule->fontsRomanCO->addItem(qt_("Default"), QString("default"));
2026 QMap<QString, QString>::const_iterator rmi = rmfonts_.constBegin();
2027 while (rmi != rmfonts_.constEnd()) {
2028 fontModule->fontsRomanCO->addItem(rmi.key(), rmi.value());
2032 fontModule->fontsSansCO->addItem(qt_("Default"), QString("default"));
2033 QMap<QString, QString>::const_iterator sfi = sffonts_.constBegin();
2034 while (sfi != sffonts_.constEnd()) {
2035 fontModule->fontsSansCO->addItem(sfi.key(), sfi.value());
2039 fontModule->fontsTypewriterCO->addItem(qt_("Default"), QString("default"));
2040 QMap<QString, QString>::const_iterator tti = ttfonts_.constBegin();
2041 while (tti != ttfonts_.constEnd()) {
2042 fontModule->fontsTypewriterCO->addItem(tti.key(), tti.value());
2046 fontModule->fontsMathCO->addItem(qt_("Automatic"), QString("auto"));
2047 fontModule->fontsMathCO->addItem(qt_("Class Default"), QString("default"));
2048 QMap<QString, QString>::const_iterator mmi = mathfonts_.constBegin();
2049 while (mmi != mathfonts_.constEnd()) {
2050 fontModule->fontsMathCO->addItem(mmi.key(), mmi.value());
2056 void GuiDocument::fontencChanged(int item)
2058 fontModule->fontencLE->setEnabled(
2059 fontModule->fontencCO->itemData(item).toString() == "custom");
2060 // The availability of TeX fonts depends on the font encoding
2062 updateFontOptions();
2066 void GuiDocument::updateMathFonts(QString const & rm)
2068 if (fontModule->osFontsCB->isChecked())
2070 QString const math =
2071 fontModule->fontsMathCO->itemData(fontModule->fontsMathCO->currentIndex()).toString();
2072 int const i = fontModule->fontsMathCO->findData("default");
2073 if (providesNoMath(rm) && i == -1)
2074 fontModule->fontsMathCO->insertItem(1, qt_("Class Default"), QString("default"));
2075 else if (!providesNoMath(rm) && i != -1) {
2076 int const c = fontModule->fontsMathCO->currentIndex();
2077 fontModule->fontsMathCO->removeItem(i);
2079 fontModule->fontsMathCO->setCurrentIndex(0);
2084 void GuiDocument::romanChanged(int item)
2086 if (fontModule->osFontsCB->isChecked())
2088 QString const font =
2089 fontModule->fontsRomanCO->itemData(item).toString();
2090 fontModule->fontScCB->setEnabled(providesSC(font));
2091 fontModule->fontOsfCB->setEnabled(providesOSF(font));
2092 updateMathFonts(font);
2096 void GuiDocument::sansChanged(int item)
2098 if (fontModule->osFontsCB->isChecked())
2100 QString const font =
2101 fontModule->fontsSansCO->itemData(item).toString();
2102 bool scaleable = providesScale(font);
2103 fontModule->scaleSansSB->setEnabled(scaleable);
2104 fontModule->scaleSansLA->setEnabled(scaleable);
2108 void GuiDocument::ttChanged(int item)
2110 if (fontModule->osFontsCB->isChecked())
2112 QString const font =
2113 fontModule->fontsTypewriterCO->itemData(item).toString();
2114 bool scaleable = providesScale(font);
2115 fontModule->scaleTypewriterSB->setEnabled(scaleable);
2116 fontModule->scaleTypewriterLA->setEnabled(scaleable);
2120 void GuiDocument::updatePagestyle(string const & items, string const & sel)
2123 pageLayoutModule->pagestyleCO->clear();
2124 pageLayoutModule->pagestyleCO->addItem(qt_("Default"));
2126 for (int n = 0; !token(items, '|', n).empty(); ++n) {
2127 string style = token(items, '|', n);
2128 QString style_gui = qt_(style);
2129 pagestyles.push_back(pair<string, QString>(style, style_gui));
2130 pageLayoutModule->pagestyleCO->addItem(style_gui);
2133 if (sel == "default") {
2134 pageLayoutModule->pagestyleCO->setCurrentIndex(0);
2140 for (size_t i = 0; i < pagestyles.size(); ++i)
2141 if (pagestyles[i].first == sel)
2142 nn = pageLayoutModule->pagestyleCO->findText(pagestyles[i].second);
2145 pageLayoutModule->pagestyleCO->setCurrentIndex(nn);
2149 void GuiDocument::browseLayout()
2151 QString const label1 = qt_("Layouts|#o#O");
2152 QString const dir1 = toqstr(lyxrc.document_path);
2153 QStringList const filter(qt_("LyX Layout (*.layout)"));
2154 QString file = browseRelToParent(QString(), bufferFilePath(),
2155 qt_("Local layout file"), filter, false,
2158 if (!file.endsWith(".layout"))
2161 FileName layoutFile = support::makeAbsPath(fromqstr(file),
2162 fromqstr(bufferFilePath()));
2164 int const ret = Alert::prompt(_("Local layout file"),
2165 _("The layout file you have selected is a local layout\n"
2166 "file, not one in the system or user directory.\n"
2167 "Your document will not work with this layout if you\n"
2168 "move the layout file to a different directory."),
2169 1, 1, _("&Set Layout"), _("&Cancel"));
2173 // load the layout file
2174 LayoutFileList & bcl = LayoutFileList::get();
2175 string classname = layoutFile.onlyFileName();
2176 // this will update an existing layout if that layout has been loaded before.
2177 LayoutFileIndex name = support::onlyFileName(bcl.addLocalLayout(
2178 classname.substr(0, classname.size() - 7),
2179 layoutFile.onlyPath().absFileName()));
2182 Alert::error(_("Error"),
2183 _("Unable to read local layout file."));
2187 const_cast<Buffer &>(buffer()).setLayoutPos(layoutFile.onlyPath().absFileName());
2189 // do not trigger classChanged if there is no change.
2190 if (latexModule->classCO->currentText() == toqstr(name))
2194 bool const avail = latexModule->classCO->set(toqstr(name));
2196 LayoutFile const & tc = bcl[name];
2197 docstring const guiname = translateIfPossible(from_utf8(tc.description()));
2198 // tooltip sensu "KOMA-Script Article [Class 'scrartcl']"
2199 QString tooltip = toqstr(bformat(_("%1$s [Class '%2$s']"), guiname, from_utf8(tc.latexname())));
2200 tooltip += '\n' + qt_("This is a local layout file.");
2201 latexModule->classCO->addItemSort(toqstr(tc.name()), toqstr(guiname),
2202 toqstr(translateIfPossible(from_utf8(tc.category()))),
2204 true, true, true, true);
2205 latexModule->classCO->set(toqstr(name));
2212 void GuiDocument::browseMaster()
2214 QString const title = qt_("Select master document");
2215 QString const dir1 = toqstr(lyxrc.document_path);
2216 QString const old = latexModule->childDocLE->text();
2217 QString const docpath = toqstr(support::onlyPath(buffer().absFileName()));
2218 QStringList const filter(qt_("LyX Files (*.lyx)"));
2219 QString file = browseRelToSub(old, docpath, title, filter, false,
2220 qt_("Documents|#o#O"), toqstr(lyxrc.document_path));
2222 if (!file.isEmpty())
2223 latexModule->childDocLE->setText(file);
2227 void GuiDocument::classChanged_adaptor()
2229 const_cast<Buffer &>(buffer()).setLayoutPos(string());
2234 void GuiDocument::classChanged()
2236 int idx = latexModule->classCO->currentIndex();
2239 string const classname = fromqstr(latexModule->classCO->getData(idx));
2241 if (applyPB->isEnabled()) {
2242 int const ret = Alert::prompt(_("Unapplied changes"),
2243 _("Some changes in the dialog were not yet applied.\n"
2244 "If you do not apply now, they will be lost after this action."),
2245 1, 1, _("&Apply"), _("&Dismiss"));
2250 // We load the TextClass as soon as it is selected. This is
2251 // necessary so that other options in the dialog can be updated
2252 // according to the new class. Note, however, that, if you use
2253 // the scroll wheel when sitting on the combo box, we'll load a
2254 // lot of TextClass objects very quickly....
2255 if (!bp_.setBaseClass(classname)) {
2256 Alert::error(_("Error"), _("Unable to set document class."));
2259 if (lyxrc.auto_reset_options)
2260 bp_.useClassDefaults();
2262 // With the introduction of modules came a distinction between the base
2263 // class and the document class. The former corresponds to the main layout
2264 // file; the latter is that plus the modules (or the document-specific layout,
2265 // or whatever else there could be). Our parameters come from the document
2266 // class. So when we set the base class, we also need to recreate the document
2267 // class. Otherwise, we still have the old one.
2268 bp_.makeDocumentClass();
2273 void GuiDocument::languagePackageChanged(int i)
2275 langModule->languagePackageLE->setEnabled(
2276 langModule->languagePackageCO->itemData(i).toString() == "custom");
2280 void GuiDocument::biblioChanged()
2282 biblioChanged_ = true;
2287 void GuiDocument::bibtexChanged(int n)
2289 biblioModule->bibtexOptionsLE->setEnabled(
2290 biblioModule->bibtexCO->itemData(n).toString() != "default");
2295 void GuiDocument::setAuthorYear(bool authoryear)
2298 biblioModule->citeStyleCO->setCurrentIndex(0);
2303 void GuiDocument::setNumerical(bool numerical)
2306 biblioModule->citeStyleCO->setCurrentIndex(1);
2311 void GuiDocument::updateEngineType(string const & items, CiteEngineType const & sel)
2313 engine_types_.clear();
2317 for (int n = 0; !token(items, '|', n).empty(); ++n) {
2319 string style = token(items, '|', n);
2320 engine_types_.push_back(style);
2324 case ENGINE_TYPE_AUTHORYEAR:
2325 biblioModule->citeStyleCO->setCurrentIndex(0);
2327 case ENGINE_TYPE_NUMERICAL:
2328 case ENGINE_TYPE_DEFAULT:
2329 biblioModule->citeStyleCO->setCurrentIndex(1);
2333 biblioModule->citationStyleL->setEnabled(nn > 1);
2334 biblioModule->citeStyleCO->setEnabled(nn > 1);
2339 // If the textclass allows only one of authoryear or numerical,
2340 // we have no choice but to force that engine type.
2341 if (engine_types_[0] == "authoryear")
2342 biblioModule->citeStyleCO->setCurrentIndex(0);
2344 biblioModule->citeStyleCO->setCurrentIndex(1);
2350 // both of these should take a vector<docstring>
2352 // This is an insanely complicated attempt to make this sort of thing
2353 // work with RTL languages.
2354 docstring formatStrVec(vector<string> const & v, docstring const & s)
2356 //this mess formats the list as "v[0], v[1], ..., [s] v[n]"
2360 return translateIfPossible(from_utf8(v[0]));
2361 if (v.size() == 2) {
2362 docstring retval = _("%1$s and %2$s");
2363 retval = subst(retval, _("and"), s);
2364 return bformat(retval, translateIfPossible(from_utf8(v[0])),
2365 translateIfPossible(from_utf8(v[1])));
2367 // The idea here is to format all but the last two items...
2368 int const vSize = v.size();
2369 docstring t2 = _("%1$s, %2$s");
2370 docstring retval = translateIfPossible(from_utf8(v[0]));
2371 for (int i = 1; i < vSize - 2; ++i)
2372 retval = bformat(t2, retval, translateIfPossible(from_utf8(v[i])));
2373 //...and then to plug them, and the last two, into this schema
2374 docstring t = _("%1$s, %2$s, and %3$s");
2375 t = subst(t, _("and"), s);
2376 return bformat(t, retval, translateIfPossible(from_utf8(v[vSize - 2])),
2377 translateIfPossible(from_utf8(v[vSize - 1])));
2380 vector<string> idsToNames(vector<string> const & idList)
2382 vector<string> retval;
2383 vector<string>::const_iterator it = idList.begin();
2384 vector<string>::const_iterator end = idList.end();
2385 for (; it != end; ++it) {
2386 LyXModule const * const mod = theModuleList[*it];
2388 retval.push_back(to_utf8(bformat(_("%1$s (unavailable)"),
2389 translateIfPossible(from_utf8(*it)))));
2391 retval.push_back(mod->getName());
2395 } // end anonymous namespace
2398 void GuiDocument::modulesToParams(BufferParams & bp)
2400 // update list of loaded modules
2401 bp.clearLayoutModules();
2402 int const srows = modules_sel_model_.rowCount();
2403 for (int i = 0; i < srows; ++i)
2404 bp.addLayoutModule(modules_sel_model_.getIDString(i));
2406 // update the list of removed modules
2407 bp.clearRemovedModules();
2408 LayoutModuleList const & reqmods = bp.baseClass()->defaultModules();
2409 list<string>::const_iterator rit = reqmods.begin();
2410 list<string>::const_iterator ren = reqmods.end();
2412 // check each of the default modules
2413 for (; rit != ren; ++rit) {
2414 list<string>::const_iterator mit = bp.getModules().begin();
2415 list<string>::const_iterator men = bp.getModules().end();
2417 for (; mit != men; ++mit) {
2424 // the module isn't present so must have been removed by the user
2425 bp.addRemovedModule(*rit);
2430 void GuiDocument::modulesChanged()
2432 modulesToParams(bp_);
2434 if (applyPB->isEnabled() && nonModuleChanged_) {
2435 int const ret = Alert::prompt(_("Unapplied changes"),
2436 _("Some changes in the dialog were not yet applied.\n"
2437 "If you do not apply now, they will be lost after this action."),
2438 1, 1, _("&Apply"), _("&Dismiss"));
2443 bp_.makeDocumentClass();
2449 void GuiDocument::updateModuleInfo()
2451 selectionManager->update();
2453 //Module description
2454 bool const focus_on_selected = selectionManager->selectedFocused();
2455 QAbstractItemView * lv;
2456 if (focus_on_selected)
2457 lv = modulesModule->selectedLV;
2459 lv = modulesModule->availableLV;
2460 if (lv->selectionModel()->selectedIndexes().isEmpty()) {
2461 modulesModule->infoML->document()->clear();
2464 QModelIndex const & idx = lv->selectionModel()->currentIndex();
2465 GuiIdListModel const & id_model =
2466 focus_on_selected ? modules_sel_model_ : modules_av_model_;
2467 string const modName = id_model.getIDString(idx.row());
2468 docstring desc = getModuleDescription(modName);
2470 LayoutModuleList const & provmods = bp_.baseClass()->providedModules();
2471 if (std::find(provmods.begin(), provmods.end(), modName) != provmods.end()) {
2474 desc += _("Module provided by document class.");
2477 docstring cat = getModuleCategory(modName);
2481 desc += bformat(_("Category: %1$s."), cat);
2484 vector<string> pkglist = getPackageList(modName);
2485 docstring pkgdesc = formatStrVec(pkglist, _("and"));
2486 if (!pkgdesc.empty()) {
2489 desc += bformat(_("Package(s) required: %1$s."), pkgdesc);
2492 pkglist = getRequiredList(modName);
2493 if (!pkglist.empty()) {
2494 vector<string> const reqdescs = idsToNames(pkglist);
2495 pkgdesc = formatStrVec(reqdescs, _("or"));
2498 desc += bformat(_("Modules required: %1$s."), pkgdesc);
2501 pkglist = getExcludedList(modName);
2502 if (!pkglist.empty()) {
2503 vector<string> const reqdescs = idsToNames(pkglist);
2504 pkgdesc = formatStrVec(reqdescs, _( "and"));
2507 desc += bformat(_("Modules excluded: %1$s."), pkgdesc);
2510 if (!isModuleAvailable(modName)) {
2513 desc += _("WARNING: Some required packages are unavailable!");
2516 modulesModule->infoML->document()->setPlainText(toqstr(desc));
2520 void GuiDocument::updateNumbering()
2522 DocumentClass const & tclass = documentClass();
2524 numberingModule->tocTW->setUpdatesEnabled(false);
2525 numberingModule->tocTW->clear();
2527 int const depth = numberingModule->depthSL->value();
2528 int const toc = numberingModule->tocSL->value();
2529 QString const no = qt_("No");
2530 QString const yes = qt_("Yes");
2531 QTreeWidgetItem * item = 0;
2533 DocumentClass::const_iterator lit = tclass.begin();
2534 DocumentClass::const_iterator len = tclass.end();
2535 for (; lit != len; ++lit) {
2536 int const toclevel = lit->toclevel;
2537 if (toclevel != Layout::NOT_IN_TOC && !lit->counter.empty()) {
2538 item = new QTreeWidgetItem(numberingModule->tocTW);
2539 item->setText(0, toqstr(translateIfPossible(lit->name())));
2540 item->setText(1, (toclevel <= depth) ? yes : no);
2541 item->setText(2, (toclevel <= toc) ? yes : no);
2545 numberingModule->tocTW->setUpdatesEnabled(true);
2546 numberingModule->tocTW->update();
2550 void GuiDocument::updateDefaultFormat()
2554 // make a copy in order to consider unapplied changes
2555 BufferParams param_copy = buffer().params();
2556 param_copy.useNonTeXFonts = fontModule->osFontsCB->isChecked();
2557 int const idx = latexModule->classCO->currentIndex();
2559 string const classname = fromqstr(latexModule->classCO->getData(idx));
2560 param_copy.setBaseClass(classname);
2561 param_copy.makeDocumentClass(true);
2563 outputModule->defaultFormatCO->blockSignals(true);
2564 outputModule->defaultFormatCO->clear();
2565 outputModule->defaultFormatCO->addItem(qt_("Default"),
2566 QVariant(QString("default")));
2567 typedef vector<Format const *> Formats;
2568 Formats formats = param_copy.exportableFormats(true);
2569 sort(formats.begin(), formats.end(), Format::formatSorter);
2570 Formats::const_iterator cit = formats.begin();
2571 Formats::const_iterator end = formats.end();
2572 for (; cit != end; ++cit)
2573 outputModule->defaultFormatCO->addItem(qt_((*cit)->prettyname()),
2574 QVariant(toqstr((*cit)->name())));
2575 outputModule->defaultFormatCO->blockSignals(false);
2579 bool GuiDocument::isChildIncluded(string const & child)
2581 if (includeonlys_.empty())
2583 return (std::find(includeonlys_.begin(),
2584 includeonlys_.end(), child) != includeonlys_.end());
2588 void GuiDocument::applyView()
2591 preambleModule->apply(bp_);
2592 localLayout->apply(bp_);
2595 bp_.suppress_date = latexModule->suppressDateCB->isChecked();
2596 bp_.use_refstyle = latexModule->refstyleCB->isChecked();
2599 if (biblioModule->citeNatbibRB->isChecked())
2600 bp_.setCiteEngine("natbib");
2601 else if (biblioModule->citeJurabibRB->isChecked())
2602 bp_.setCiteEngine("jurabib");
2603 if (biblioModule->citeDefaultRB->isChecked()) {
2604 bp_.setCiteEngine("basic");
2605 bp_.setCiteEngineType(ENGINE_TYPE_DEFAULT);
2608 if (biblioModule->citeStyleCO->currentIndex())
2609 bp_.setCiteEngineType(ENGINE_TYPE_NUMERICAL);
2611 bp_.setCiteEngineType(ENGINE_TYPE_AUTHORYEAR);
2614 biblioModule->bibtopicCB->isChecked();
2616 bp_.biblio_style = fromqstr(biblioModule->bibtexStyleLE->text());
2618 string const bibtex_command =
2619 fromqstr(biblioModule->bibtexCO->itemData(
2620 biblioModule->bibtexCO->currentIndex()).toString());
2621 string const bibtex_options =
2622 fromqstr(biblioModule->bibtexOptionsLE->text());
2623 if (bibtex_command == "default" || bibtex_options.empty())
2624 bp_.bibtex_command = bibtex_command;
2626 bp_.bibtex_command = bibtex_command + " " + bibtex_options;
2628 if (biblioChanged_) {
2629 buffer().invalidateBibinfoCache();
2630 buffer().removeBiblioTempFiles();
2634 indicesModule->apply(bp_);
2636 // language & quotes
2637 if (langModule->defaultencodingRB->isChecked()) {
2638 bp_.inputenc = "auto";
2640 int i = langModule->encodingCO->currentIndex();
2642 bp_.inputenc = "default";
2644 QString const enc_gui =
2645 langModule->encodingCO->currentText();
2646 Encodings::const_iterator it = encodings.begin();
2647 Encodings::const_iterator const end = encodings.end();
2649 for (; it != end; ++it) {
2650 if (qt_(it->guiName()) == enc_gui &&
2652 bp_.inputenc = it->name();
2658 // should not happen
2659 lyxerr << "GuiDocument::apply: Unknown encoding! Resetting to default" << endl;
2660 bp_.inputenc = "default";
2665 bp_.quotes_language = (InsetQuotes::QuoteLanguage) langModule->quoteStyleCO->itemData(
2666 langModule->quoteStyleCO->currentIndex()).toInt();
2668 QString const langname = langModule->languageCO->itemData(
2669 langModule->languageCO->currentIndex()).toString();
2670 Language const * newlang = lyx::languages.getLanguage(fromqstr(langname));
2671 Cursor & cur = const_cast<BufferView *>(bufferview())->cursor();
2672 // If current cursor language was the document language, then update it too.
2673 if (cur.current_font.language() == bp_.language) {
2674 cur.current_font.setLanguage(newlang);
2675 cur.real_current_font.setLanguage(newlang);
2677 bp_.language = newlang;
2679 QString const pack = langModule->languagePackageCO->itemData(
2680 langModule->languagePackageCO->currentIndex()).toString();
2681 if (pack == "custom")
2683 fromqstr(langModule->languagePackageLE->text());
2685 bp_.lang_package = fromqstr(pack);
2688 bp_.backgroundcolor = set_backgroundcolor;
2689 bp_.isbackgroundcolor = is_backgroundcolor;
2690 bp_.fontcolor = set_fontcolor;
2691 bp_.isfontcolor = is_fontcolor;
2692 bp_.notefontcolor = set_notefontcolor;
2693 bp_.boxbgcolor = set_boxbgcolor;
2696 if (bp_.documentClass().hasTocLevels()) {
2697 bp_.tocdepth = numberingModule->tocSL->value();
2698 bp_.secnumdepth = numberingModule->depthSL->value();
2702 bp_.user_defined_bullet(0) = bulletsModule->bullet(0);
2703 bp_.user_defined_bullet(1) = bulletsModule->bullet(1);
2704 bp_.user_defined_bullet(2) = bulletsModule->bullet(2);
2705 bp_.user_defined_bullet(3) = bulletsModule->bullet(3);
2708 bp_.graphics_driver =
2709 tex_graphics[latexModule->psdriverCO->currentIndex()];
2712 int idx = latexModule->classCO->currentIndex();
2714 string const classname = fromqstr(latexModule->classCO->getData(idx));
2715 bp_.setBaseClass(classname);
2719 modulesToParams(bp_);
2722 map<string, string> const & packages = BufferParams::auto_packages();
2723 for (map<string, string>::const_iterator it = packages.begin();
2724 it != packages.end(); ++it) {
2725 QTableWidgetItem * item = mathsModule->packagesTW->findItems(toqstr(it->first), Qt::MatchExactly)[0];
2728 int row = mathsModule->packagesTW->row(item);
2729 QRadioButton * rb = (QRadioButton*)mathsModule->packagesTW->cellWidget(row, 1);
2730 if (rb->isChecked()) {
2731 bp_.use_package(it->first, BufferParams::package_auto);
2734 rb = (QRadioButton*)mathsModule->packagesTW->cellWidget(row, 2);
2735 if (rb->isChecked()) {
2736 bp_.use_package(it->first, BufferParams::package_on);
2739 rb = (QRadioButton*)mathsModule->packagesTW->cellWidget(row, 3);
2740 if (rb->isChecked())
2741 bp_.use_package(it->first, BufferParams::package_off);
2745 if (pageLayoutModule->pagestyleCO->currentIndex() == 0)
2746 bp_.pagestyle = "default";
2748 QString style_gui = pageLayoutModule->pagestyleCO->currentText();
2749 for (size_t i = 0; i != pagestyles.size(); ++i)
2750 if (pagestyles[i].second == style_gui)
2751 bp_.pagestyle = pagestyles[i].first;
2755 switch (textLayoutModule->lspacingCO->currentIndex()) {
2757 bp_.spacing().set(Spacing::Single);
2760 bp_.spacing().set(Spacing::Onehalf);
2763 bp_.spacing().set(Spacing::Double);
2766 string s = widgetToDoubleStr(textLayoutModule->lspacingLE);
2768 bp_.spacing().set(Spacing::Single);
2770 bp_.spacing().set(Spacing::Other, s);
2775 if (textLayoutModule->twoColumnCB->isChecked())
2780 bp_.justification = textLayoutModule->justCB->isChecked();
2782 if (textLayoutModule->indentRB->isChecked()) {
2783 // if paragraphs are separated by an indentation
2784 bp_.paragraph_separation = BufferParams::ParagraphIndentSeparation;
2785 switch (textLayoutModule->indentCO->currentIndex()) {
2787 bp_.setIndentation(HSpace(HSpace::DEFAULT));
2790 HSpace indent = HSpace(
2791 widgetsToLength(textLayoutModule->indentLE,
2792 textLayoutModule->indentLengthCO)
2794 bp_.setIndentation(indent);
2798 // this should never happen
2799 bp_.setIndentation(HSpace(HSpace::DEFAULT));
2803 // if paragraphs are separated by a skip
2804 bp_.paragraph_separation = BufferParams::ParagraphSkipSeparation;
2805 switch (textLayoutModule->skipCO->currentIndex()) {
2807 bp_.setDefSkip(VSpace(VSpace::SMALLSKIP));
2810 bp_.setDefSkip(VSpace(VSpace::MEDSKIP));
2813 bp_.setDefSkip(VSpace(VSpace::BIGSKIP));
2818 widgetsToLength(textLayoutModule->skipLE,
2819 textLayoutModule->skipLengthCO)
2825 // this should never happen
2826 bp_.setDefSkip(VSpace(VSpace::MEDSKIP));
2832 fromqstr(latexModule->optionsLE->text());
2834 bp_.use_default_options =
2835 latexModule->defaultOptionsCB->isChecked();
2837 if (latexModule->childDocGB->isChecked())
2839 fromqstr(latexModule->childDocLE->text());
2841 bp_.master = string();
2844 bp_.clearIncludedChildren();
2845 if (masterChildModule->includeonlyRB->isChecked()) {
2846 list<string>::const_iterator it = includeonlys_.begin();
2847 for (; it != includeonlys_.end() ; ++it) {
2848 bp_.addIncludedChildren(*it);
2851 bp_.maintain_unincluded_children =
2852 masterChildModule->maintainAuxCB->isChecked();
2855 bp_.float_placement = floatModule->get();
2858 // text should have passed validation
2859 bp_.listings_params =
2860 InsetListingsParams(fromqstr(listingsModule->listingsED->toPlainText())).params();
2863 bp_.default_output_format = fromqstr(outputModule->defaultFormatCO->itemData(
2864 outputModule->defaultFormatCO->currentIndex()).toString());
2866 bool const nontexfonts = fontModule->osFontsCB->isChecked();
2867 bp_.useNonTeXFonts = nontexfonts;
2869 bp_.output_sync = outputModule->outputsyncCB->isChecked();
2871 bp_.output_sync_macro = fromqstr(outputModule->synccustomCB->currentText());
2873 int mathfmt = outputModule->mathoutCB->currentIndex();
2876 BufferParams::MathOutput const mo =
2877 static_cast<BufferParams::MathOutput>(mathfmt);
2878 bp_.html_math_output = mo;
2879 bp_.html_be_strict = outputModule->strictCB->isChecked();
2880 bp_.html_css_as_file = outputModule->cssCB->isChecked();
2881 bp_.html_math_img_scale = outputModule->mathimgSB->value();
2882 bp_.display_pixel_ratio = theGuiApp()->pixelRatio();
2884 bp_.save_transient_properties =
2885 outputModule->saveTransientPropertiesCB->isChecked();
2888 bp_.fonts_roman[nontexfonts] =
2889 fromqstr(fontModule->fontsRomanCO->
2890 itemData(fontModule->fontsRomanCO->currentIndex()).toString());
2891 bp_.fonts_roman[!nontexfonts] = fromqstr(fontModule->font_roman);
2893 bp_.fonts_sans[nontexfonts] =
2894 fromqstr(fontModule->fontsSansCO->
2895 itemData(fontModule->fontsSansCO->currentIndex()).toString());
2896 bp_.fonts_sans[!nontexfonts] = fromqstr(fontModule->font_sans);
2898 bp_.fonts_typewriter[nontexfonts] =
2899 fromqstr(fontModule->fontsTypewriterCO->
2900 itemData(fontModule->fontsTypewriterCO->currentIndex()).toString());
2901 bp_.fonts_typewriter[!nontexfonts] = fromqstr(fontModule->font_typewriter);
2903 bp_.fonts_math[nontexfonts] =
2904 fromqstr(fontModule->fontsMathCO->
2905 itemData(fontModule->fontsMathCO->currentIndex()).toString());
2906 bp_.fonts_math[!nontexfonts] = fromqstr(fontModule->font_math);
2908 QString const fontenc =
2909 fontModule->fontencCO->itemData(fontModule->fontencCO->currentIndex()).toString();
2910 if (fontenc == "custom")
2911 bp_.fontenc = fromqstr(fontModule->fontencLE->text());
2913 bp_.fontenc = fromqstr(fontenc);
2916 fromqstr(fontModule->cjkFontLE->text());
2918 bp_.use_microtype = fontModule->microtypeCB->isChecked();
2920 bp_.fonts_sans_scale[nontexfonts] = fontModule->scaleSansSB->value();
2921 bp_.fonts_sans_scale[!nontexfonts] = fontModule->font_sf_scale;
2923 bp_.fonts_typewriter_scale[nontexfonts] = fontModule->scaleTypewriterSB->value();
2924 bp_.fonts_typewriter_scale[!nontexfonts] = fontModule->font_tt_scale;
2926 bp_.fonts_expert_sc = fontModule->fontScCB->isChecked();
2928 bp_.fonts_old_figures = fontModule->fontOsfCB->isChecked();
2931 bp_.fonts_default_family = "default";
2933 bp_.fonts_default_family = GuiDocument::fontfamilies[
2934 fontModule->fontsDefaultCO->currentIndex()];
2936 if (fontModule->fontsizeCO->currentIndex() == 0)
2937 bp_.fontsize = "default";
2940 fromqstr(fontModule->fontsizeCO->currentText());
2943 bp_.papersize = PAPER_SIZE(
2944 pageLayoutModule->papersizeCO->currentIndex());
2946 bp_.paperwidth = widgetsToLength(pageLayoutModule->paperwidthLE,
2947 pageLayoutModule->paperwidthUnitCO);
2949 bp_.paperheight = widgetsToLength(pageLayoutModule->paperheightLE,
2950 pageLayoutModule->paperheightUnitCO);
2952 if (pageLayoutModule->facingPagesCB->isChecked())
2953 bp_.sides = TwoSides;
2955 bp_.sides = OneSide;
2957 if (pageLayoutModule->landscapeRB->isChecked())
2958 bp_.orientation = ORIENTATION_LANDSCAPE;
2960 bp_.orientation = ORIENTATION_PORTRAIT;
2963 bp_.use_geometry = !marginsModule->marginCB->isChecked();
2965 Ui::MarginsUi const * m = marginsModule;
2967 bp_.leftmargin = widgetsToLength(m->innerLE, m->innerUnit);
2968 bp_.topmargin = widgetsToLength(m->topLE, m->topUnit);
2969 bp_.rightmargin = widgetsToLength(m->outerLE, m->outerUnit);
2970 bp_.bottommargin = widgetsToLength(m->bottomLE, m->bottomUnit);
2971 bp_.headheight = widgetsToLength(m->headheightLE, m->headheightUnit);
2972 bp_.headsep = widgetsToLength(m->headsepLE, m->headsepUnit);
2973 bp_.footskip = widgetsToLength(m->footskipLE, m->footskipUnit);
2974 bp_.columnsep = widgetsToLength(m->columnsepLE, m->columnsepUnit);
2977 branchesModule->apply(bp_);
2980 PDFOptions & pdf = bp_.pdfoptions();
2981 pdf.use_hyperref = pdfSupportModule->use_hyperrefGB->isChecked();
2982 pdf.title = fromqstr(pdfSupportModule->titleLE->text());
2983 pdf.author = fromqstr(pdfSupportModule->authorLE->text());
2984 pdf.subject = fromqstr(pdfSupportModule->subjectLE->text());
2985 pdf.keywords = fromqstr(pdfSupportModule->keywordsLE->text());
2987 pdf.bookmarks = pdfSupportModule->bookmarksGB->isChecked();
2988 pdf.bookmarksnumbered = pdfSupportModule->bookmarksnumberedCB->isChecked();
2989 pdf.bookmarksopen = pdfSupportModule->bookmarksopenGB->isChecked();
2990 pdf.bookmarksopenlevel = pdfSupportModule->bookmarksopenlevelSB->value();
2992 pdf.breaklinks = pdfSupportModule->breaklinksCB->isChecked();
2993 pdf.pdfborder = pdfSupportModule->pdfborderCB->isChecked();
2994 pdf.pdfusetitle = pdfSupportModule->pdfusetitleCB->isChecked();
2995 pdf.colorlinks = pdfSupportModule->colorlinksCB->isChecked();
2997 backref_opts[pdfSupportModule->backrefCO->currentIndex()];
2998 if (pdfSupportModule->fullscreenCB->isChecked())
2999 pdf.pagemode = pdf.pagemode_fullscreen;
3001 pdf.pagemode.clear();
3002 pdf.quoted_options = pdf.quoted_options_check(
3003 fromqstr(pdfSupportModule->optionsLE->text()));
3006 nonModuleChanged_ = false;
3010 void GuiDocument::paramsToDialog()
3012 // set the default unit
3013 Length::UNIT const default_unit = Length::defaultUnit();
3016 preambleModule->update(bp_, id());
3017 localLayout->update(bp_, id());
3020 latexModule->suppressDateCB->setChecked(bp_.suppress_date);
3021 latexModule->refstyleCB->setChecked(bp_.use_refstyle);
3024 string const cite_engine = bp_.citeEngine().list().front();
3026 biblioModule->citeDefaultRB->setChecked(
3027 cite_engine == "basic");
3029 biblioModule->citeJurabibRB->setChecked(
3030 cite_engine == "jurabib");
3032 biblioModule->citeNatbibRB->setChecked(
3033 cite_engine == "natbib");
3035 biblioModule->citeStyleCO->setCurrentIndex(
3036 bp_.citeEngineType() & ENGINE_TYPE_NUMERICAL);
3038 updateEngineType(documentClass().opt_enginetype(),
3039 bp_.citeEngineType());
3041 biblioModule->bibtopicCB->setChecked(
3044 biblioModule->bibtexStyleLE->setText(toqstr(bp_.biblio_style));
3048 split(bp_.bibtex_command, command, ' ');
3050 int const bpos = biblioModule->bibtexCO->findData(toqstr(command));
3052 biblioModule->bibtexCO->setCurrentIndex(bpos);
3053 biblioModule->bibtexOptionsLE->setText(toqstr(options).trimmed());
3055 // We reset to default if we do not know the specified compiler
3056 // This is for security reasons
3057 biblioModule->bibtexCO->setCurrentIndex(
3058 biblioModule->bibtexCO->findData(toqstr("default")));
3059 biblioModule->bibtexOptionsLE->clear();
3061 biblioModule->bibtexOptionsLE->setEnabled(
3062 biblioModule->bibtexCO->currentIndex() != 0);
3064 biblioChanged_ = false;
3067 // We may be called when there is no Buffer, e.g., when
3068 // the last view has just been closed.
3069 bool const isReadOnly = isBufferAvailable() ? buffer().isReadonly() : false;
3070 indicesModule->update(bp_, isReadOnly);
3072 // language & quotes
3073 int const pos = langModule->languageCO->findData(toqstr(
3074 bp_.language->lang()));
3075 langModule->languageCO->setCurrentIndex(pos);
3077 langModule->quoteStyleCO->setCurrentIndex(
3078 bp_.quotes_language);
3080 bool default_enc = true;
3081 if (bp_.inputenc != "auto") {
3082 default_enc = false;
3083 if (bp_.inputenc == "default") {
3084 langModule->encodingCO->setCurrentIndex(0);
3087 Encodings::const_iterator it = encodings.begin();
3088 Encodings::const_iterator const end = encodings.end();
3089 for (; it != end; ++it) {
3090 if (it->name() == bp_.inputenc &&
3092 enc_gui = it->guiName();
3096 int const i = langModule->encodingCO->findText(
3099 langModule->encodingCO->setCurrentIndex(i);
3101 // unknown encoding. Set to default.
3105 langModule->defaultencodingRB->setChecked(default_enc);
3106 langModule->otherencodingRB->setChecked(!default_enc);
3108 int const p = langModule->languagePackageCO->findData(toqstr(bp_.lang_package));
3110 langModule->languagePackageCO->setCurrentIndex(
3111 langModule->languagePackageCO->findData("custom"));
3112 langModule->languagePackageLE->setText(toqstr(bp_.lang_package));
3114 langModule->languagePackageCO->setCurrentIndex(p);
3115 langModule->languagePackageLE->clear();
3119 if (bp_.isfontcolor) {
3120 colorModule->fontColorPB->setStyleSheet(
3121 colorButtonStyleSheet(rgb2qcolor(bp_.fontcolor)));
3123 set_fontcolor = bp_.fontcolor;
3124 is_fontcolor = bp_.isfontcolor;
3126 colorModule->noteFontColorPB->setStyleSheet(
3127 colorButtonStyleSheet(rgb2qcolor(bp_.notefontcolor)));
3128 set_notefontcolor = bp_.notefontcolor;
3130 if (bp_.isbackgroundcolor) {
3131 colorModule->backgroundPB->setStyleSheet(
3132 colorButtonStyleSheet(rgb2qcolor(bp_.backgroundcolor)));
3134 set_backgroundcolor = bp_.backgroundcolor;
3135 is_backgroundcolor = bp_.isbackgroundcolor;
3137 colorModule->boxBackgroundPB->setStyleSheet(
3138 colorButtonStyleSheet(rgb2qcolor(bp_.boxbgcolor)));
3139 set_boxbgcolor = bp_.boxbgcolor;
3142 int const min_toclevel = documentClass().min_toclevel();
3143 int const max_toclevel = documentClass().max_toclevel();
3144 if (documentClass().hasTocLevels()) {
3145 numberingModule->setEnabled(true);
3146 numberingModule->depthSL->setMinimum(min_toclevel - 1);
3147 numberingModule->depthSL->setMaximum(max_toclevel);
3148 numberingModule->depthSL->setValue(bp_.secnumdepth);
3149 numberingModule->tocSL->setMaximum(min_toclevel - 1);
3150 numberingModule->tocSL->setMaximum(max_toclevel);
3151 numberingModule->tocSL->setValue(bp_.tocdepth);
3154 numberingModule->setEnabled(false);
3155 numberingModule->tocTW->clear();
3159 bulletsModule->setBullet(0, bp_.user_defined_bullet(0));
3160 bulletsModule->setBullet(1, bp_.user_defined_bullet(1));
3161 bulletsModule->setBullet(2, bp_.user_defined_bullet(2));
3162 bulletsModule->setBullet(3, bp_.user_defined_bullet(3));
3163 bulletsModule->init();
3166 int nitem = findToken(tex_graphics, bp_.graphics_driver);
3168 latexModule->psdriverCO->setCurrentIndex(nitem);
3171 map<string, string> const & packages = BufferParams::auto_packages();
3172 for (map<string, string>::const_iterator it = packages.begin();
3173 it != packages.end(); ++it) {
3174 QTableWidgetItem * item = mathsModule->packagesTW->findItems(toqstr(it->first), Qt::MatchExactly)[0];
3177 int row = mathsModule->packagesTW->row(item);
3178 switch (bp_.use_package(it->first)) {
3179 case BufferParams::package_off: {
3180 QRadioButton * rb = (QRadioButton*)mathsModule->packagesTW->cellWidget(row, 3);
3181 rb->setChecked(true);
3184 case BufferParams::package_on: {
3185 QRadioButton * rb = (QRadioButton*)mathsModule->packagesTW->cellWidget(row, 2);
3186 rb->setChecked(true);
3189 case BufferParams::package_auto: {
3190 QRadioButton * rb = (QRadioButton*)mathsModule->packagesTW->cellWidget(row, 1);
3191 rb->setChecked(true);
3197 switch (bp_.spacing().getSpace()) {
3198 case Spacing::Other: nitem = 3; break;
3199 case Spacing::Double: nitem = 2; break;
3200 case Spacing::Onehalf: nitem = 1; break;
3201 case Spacing::Default: case Spacing::Single: nitem = 0; break;
3205 string const & layoutID = bp_.baseClassID();
3206 setLayoutComboByIDString(layoutID);
3208 updatePagestyle(documentClass().opt_pagestyle(),
3211 textLayoutModule->lspacingCO->setCurrentIndex(nitem);
3212 if (bp_.spacing().getSpace() == Spacing::Other) {
3213 doubleToWidget(textLayoutModule->lspacingLE,
3214 bp_.spacing().getValueAsString());
3218 if (bp_.paragraph_separation == BufferParams::ParagraphIndentSeparation) {
3219 textLayoutModule->indentRB->setChecked(true);
3220 string indentation = bp_.getIndentation().asLyXCommand();
3222 if (indentation != "default") {
3223 lengthToWidgets(textLayoutModule->indentLE,
3224 textLayoutModule->indentLengthCO,
3225 indentation, default_unit);
3228 textLayoutModule->indentCO->setCurrentIndex(indent);
3231 textLayoutModule->skipRB->setChecked(true);
3233 switch (bp_.getDefSkip().kind()) {
3234 case VSpace::SMALLSKIP:
3237 case VSpace::MEDSKIP:
3240 case VSpace::BIGSKIP:
3243 case VSpace::LENGTH:
3246 string const length = bp_.getDefSkip().asLyXCommand();
3247 lengthToWidgets(textLayoutModule->skipLE,
3248 textLayoutModule->skipLengthCO,
3249 length, default_unit);
3256 textLayoutModule->skipCO->setCurrentIndex(skip);
3260 textLayoutModule->twoColumnCB->setChecked(
3262 textLayoutModule->justCB->setChecked(bp_.justification);
3264 if (!bp_.options.empty()) {
3265 latexModule->optionsLE->setText(
3266 toqstr(bp_.options));
3268 latexModule->optionsLE->setText(QString());
3272 latexModule->defaultOptionsCB->setChecked(
3273 bp_.use_default_options);
3274 updateSelectedModules();
3275 selectionManager->updateProvidedModules(
3276 bp_.baseClass()->providedModules());
3277 selectionManager->updateExcludedModules(
3278 bp_.baseClass()->excludedModules());
3280 if (!documentClass().options().empty()) {
3281 latexModule->defaultOptionsLE->setText(
3282 toqstr(documentClass().options()));
3284 latexModule->defaultOptionsLE->setText(
3285 toqstr(_("[No options predefined]")));
3288 latexModule->defaultOptionsLE->setEnabled(
3289 bp_.use_default_options
3290 && !documentClass().options().empty());
3292 latexModule->defaultOptionsCB->setEnabled(
3293 !documentClass().options().empty());
3295 if (!bp_.master.empty()) {
3296 latexModule->childDocGB->setChecked(true);
3297 latexModule->childDocLE->setText(
3298 toqstr(bp_.master));
3300 latexModule->childDocLE->setText(QString());
3301 latexModule->childDocGB->setChecked(false);
3305 if (!bufferview() || !buffer().hasChildren()) {
3306 masterChildModule->childrenTW->clear();
3307 includeonlys_.clear();
3308 docPS->showPanel("Child Documents", false);
3309 if (docPS->isCurrentPanel("Child Documents"))
3310 docPS->setCurrentPanel("Document Class");
3312 docPS->showPanel("Child Documents", true);
3313 masterChildModule->setEnabled(true);
3314 includeonlys_ = bp_.getIncludedChildren();
3315 updateIncludeonlys();
3317 masterChildModule->maintainAuxCB->setChecked(
3318 bp_.maintain_unincluded_children);
3321 floatModule->set(bp_.float_placement);
3324 // break listings_params to multiple lines
3326 InsetListingsParams(bp_.listings_params).separatedParams();
3327 listingsModule->listingsED->setPlainText(toqstr(lstparams));
3330 // some languages only work with polyglossia/XeTeX
3331 Language const * lang = lyx::languages.getLanguage(
3332 fromqstr(langModule->languageCO->itemData(
3333 langModule->languageCO->currentIndex()).toString()));
3334 bool const need_fontspec =
3335 lang->babel().empty() && !lang->polyglossia().empty();
3336 bool const os_fonts_available =
3337 bp_.baseClass()->outputType() == lyx::LATEX
3338 && LaTeXFeatures::isAvailable("fontspec");
3339 fontModule->osFontsCB->setEnabled(os_fonts_available && !need_fontspec);
3340 fontModule->osFontsCB->setChecked(
3341 (os_fonts_available && bp_.useNonTeXFonts) || need_fontspec);
3342 updateFontsize(documentClass().opt_fontsize(),
3345 QString font = toqstr(bp_.fontsRoman());
3346 int rpos = fontModule->fontsRomanCO->findData(font);
3348 rpos = fontModule->fontsRomanCO->count();
3349 fontModule->fontsRomanCO->addItem(font + qt_(" (not installed)"), font);
3351 fontModule->fontsRomanCO->setCurrentIndex(rpos);
3352 fontModule->font_roman = toqstr(bp_.fonts_roman[!bp_.useNonTeXFonts]);
3354 font = toqstr(bp_.fontsSans());
3355 int spos = fontModule->fontsSansCO->findData(font);
3357 spos = fontModule->fontsSansCO->count();
3358 fontModule->fontsSansCO->addItem(font + qt_(" (not installed)"), font);
3360 fontModule->fontsSansCO->setCurrentIndex(spos);
3361 fontModule->font_sans = toqstr(bp_.fonts_sans[!bp_.useNonTeXFonts]);
3363 font = toqstr(bp_.fontsTypewriter());
3364 int tpos = fontModule->fontsTypewriterCO->findData(font);
3366 tpos = fontModule->fontsTypewriterCO->count();
3367 fontModule->fontsTypewriterCO->addItem(font + qt_(" (not installed)"), font);
3369 fontModule->fontsTypewriterCO->setCurrentIndex(tpos);
3370 fontModule->font_typewriter = toqstr(bp_.fonts_typewriter[!bp_.useNonTeXFonts]);
3372 font = toqstr(bp_.fontsMath());
3373 int mpos = fontModule->fontsMathCO->findData(font);
3375 mpos = fontModule->fontsMathCO->count();
3376 fontModule->fontsMathCO->addItem(font + qt_(" (not installed)"), font);
3378 fontModule->fontsMathCO->setCurrentIndex(mpos);
3379 fontModule->font_math = toqstr(bp_.fonts_math[!bp_.useNonTeXFonts]);
3381 if (bp_.useNonTeXFonts && os_fonts_available) {
3382 fontModule->fontencLA->setEnabled(false);
3383 fontModule->fontencCO->setEnabled(false);
3384 fontModule->fontencLE->setEnabled(false);
3386 fontModule->fontencLA->setEnabled(true);
3387 fontModule->fontencCO->setEnabled(true);
3388 fontModule->fontencLE->setEnabled(true);
3394 if (!bp_.fonts_cjk.empty())
3395 fontModule->cjkFontLE->setText(
3396 toqstr(bp_.fonts_cjk));
3398 fontModule->cjkFontLE->setText(QString());
3400 fontModule->microtypeCB->setChecked(bp_.use_microtype);
3402 fontModule->fontScCB->setChecked(bp_.fonts_expert_sc);
3403 fontModule->fontOsfCB->setChecked(bp_.fonts_old_figures);
3404 fontModule->scaleSansSB->setValue(bp_.fontsSansScale());
3405 fontModule->font_sf_scale = bp_.fonts_sans_scale[!bp_.useNonTeXFonts];
3406 fontModule->scaleTypewriterSB->setValue(bp_.fontsTypewriterScale());
3407 fontModule->font_tt_scale = bp_.fonts_typewriter_scale[!bp_.useNonTeXFonts];
3409 int nn = findToken(GuiDocument::fontfamilies, bp_.fonts_default_family);
3411 fontModule->fontsDefaultCO->setCurrentIndex(nn);
3413 if (bp_.fontenc == "global" || bp_.fontenc == "default") {
3414 fontModule->fontencCO->setCurrentIndex(
3415 fontModule->fontencCO->findData(toqstr(bp_.fontenc)));
3416 fontModule->fontencLE->setEnabled(false);
3418 fontModule->fontencCO->setCurrentIndex(1);
3419 fontModule->fontencLE->setText(toqstr(bp_.fontenc));
3423 // This must be set _after_ fonts since updateDefaultFormat()
3424 // checks osFontsCB settings.
3425 // update combobox with formats
3426 updateDefaultFormat();
3427 int index = outputModule->defaultFormatCO->findData(toqstr(
3428 bp_.default_output_format));
3429 // set to default if format is not found
3432 outputModule->defaultFormatCO->setCurrentIndex(index);
3434 outputModule->outputsyncCB->setChecked(bp_.output_sync);
3435 outputModule->synccustomCB->setEditText(toqstr(bp_.output_sync_macro));
3437 outputModule->mathimgSB->setValue(bp_.html_math_img_scale);
3438 outputModule->mathoutCB->setCurrentIndex(bp_.html_math_output);
3439 outputModule->strictCB->setChecked(bp_.html_be_strict);
3440 outputModule->cssCB->setChecked(bp_.html_css_as_file);
3442 outputModule->saveTransientPropertiesCB
3443 ->setChecked(bp_.save_transient_properties);
3446 bool const extern_geometry =
3447 documentClass().provides("geometry");
3448 int const psize = bp_.papersize;
3449 pageLayoutModule->papersizeCO->setCurrentIndex(psize);
3450 setCustomPapersize(!extern_geometry && psize == 1);
3451 pageLayoutModule->papersizeCO->setEnabled(!extern_geometry);
3453 bool const landscape =
3454 bp_.orientation == ORIENTATION_LANDSCAPE;
3455 pageLayoutModule->landscapeRB->setChecked(landscape);
3456 pageLayoutModule->portraitRB->setChecked(!landscape);
3457 pageLayoutModule->landscapeRB->setEnabled(!extern_geometry);
3458 pageLayoutModule->portraitRB->setEnabled(!extern_geometry);
3460 pageLayoutModule->facingPagesCB->setChecked(
3461 bp_.sides == TwoSides);
3463 lengthToWidgets(pageLayoutModule->paperwidthLE,
3464 pageLayoutModule->paperwidthUnitCO, bp_.paperwidth, default_unit);
3465 lengthToWidgets(pageLayoutModule->paperheightLE,
3466 pageLayoutModule->paperheightUnitCO, bp_.paperheight, default_unit);
3469 Ui::MarginsUi * m = marginsModule;
3473 lengthToWidgets(m->topLE, m->topUnit,
3474 bp_.topmargin, default_unit);
3476 lengthToWidgets(m->bottomLE, m->bottomUnit,
3477 bp_.bottommargin, default_unit);
3479 lengthToWidgets(m->innerLE, m->innerUnit,
3480 bp_.leftmargin, default_unit);
3482 lengthToWidgets(m->outerLE, m->outerUnit,
3483 bp_.rightmargin, default_unit);
3485 lengthToWidgets(m->headheightLE, m->headheightUnit,
3486 bp_.headheight, default_unit);
3488 lengthToWidgets(m->headsepLE, m->headsepUnit,
3489 bp_.headsep, default_unit);
3491 lengthToWidgets(m->footskipLE, m->footskipUnit,
3492 bp_.footskip, default_unit);
3494 lengthToWidgets(m->columnsepLE, m->columnsepUnit,
3495 bp_.columnsep, default_unit);
3498 updateUnknownBranches();
3499 branchesModule->update(bp_);
3502 PDFOptions const & pdf = bp_.pdfoptions();
3503 pdfSupportModule->use_hyperrefGB->setChecked(pdf.use_hyperref);
3504 if (bp_.documentClass().provides("hyperref"))
3505 pdfSupportModule->use_hyperrefGB->setTitle(qt_("C&ustomize Hyperref Options"));
3507 pdfSupportModule->use_hyperrefGB->setTitle(qt_("&Use Hyperref Support"));
3508 pdfSupportModule->titleLE->setText(toqstr(pdf.title));
3509 pdfSupportModule->authorLE->setText(toqstr(pdf.author));
3510 pdfSupportModule->subjectLE->setText(toqstr(pdf.subject));
3511 pdfSupportModule->keywordsLE->setText(toqstr(pdf.keywords));
3513 pdfSupportModule->bookmarksGB->setChecked(pdf.bookmarks);
3514 pdfSupportModule->bookmarksnumberedCB->setChecked(pdf.bookmarksnumbered);
3515 pdfSupportModule->bookmarksopenGB->setChecked(pdf.bookmarksopen);
3517 pdfSupportModule->bookmarksopenlevelSB->setValue(pdf.bookmarksopenlevel);
3519 pdfSupportModule->breaklinksCB->setChecked(pdf.breaklinks);
3520 pdfSupportModule->pdfborderCB->setChecked(pdf.pdfborder);
3521 pdfSupportModule->pdfusetitleCB->setChecked(pdf.pdfusetitle);
3522 pdfSupportModule->colorlinksCB->setChecked(pdf.colorlinks);
3524 nn = findToken(backref_opts, pdf.backref);
3526 pdfSupportModule->backrefCO->setCurrentIndex(nn);
3528 pdfSupportModule->fullscreenCB->setChecked
3529 (pdf.pagemode == pdf.pagemode_fullscreen);
3531 pdfSupportModule->optionsLE->setText(
3532 toqstr(pdf.quoted_options));
3534 // Make sure that the bc is in the INITIAL state
3535 if (bc().policy().buttonStatus(ButtonPolicy::RESTORE))
3538 // clear changed branches cache
3539 changedBranches_.clear();
3542 nonModuleChanged_ = false;
3546 void GuiDocument::saveDocDefault()
3548 // we have to apply the params first
3554 void GuiDocument::updateAvailableModules()
3556 modules_av_model_.clear();
3557 list<modInfoStruct> modInfoList = getModuleInfo();
3558 // Sort names according to the locale
3559 modInfoList.sort([](modInfoStruct const & a, modInfoStruct const & b) {
3560 return 0 < b.name.localeAwareCompare(a.name);
3563 for (modInfoStruct const & m : modInfoList) {
3564 modules_av_model_.insertRow(i, m.name, m.id, m.description);
3570 void GuiDocument::updateSelectedModules()
3572 modules_sel_model_.clear();
3573 list<modInfoStruct> const selModList = getSelectedModules();
3575 for (modInfoStruct const & m : selModList) {
3576 modules_sel_model_.insertRow(i, m.name, m.id, m.description);
3582 void GuiDocument::updateIncludeonlys()
3584 masterChildModule->childrenTW->clear();
3585 QString const no = qt_("No");
3586 QString const yes = qt_("Yes");
3588 if (includeonlys_.empty()) {
3589 masterChildModule->includeallRB->setChecked(true);
3590 masterChildModule->childrenTW->setEnabled(false);
3591 masterChildModule->maintainAuxCB->setEnabled(false);
3593 masterChildModule->includeonlyRB->setChecked(true);
3594 masterChildModule->childrenTW->setEnabled(true);
3595 masterChildModule->maintainAuxCB->setEnabled(true);
3597 ListOfBuffers children = buffer().getChildren();
3598 ListOfBuffers::const_iterator it = children.begin();
3599 ListOfBuffers::const_iterator end = children.end();
3600 bool has_unincluded = false;
3601 bool all_unincluded = true;
3602 for (; it != end; ++it) {
3603 QTreeWidgetItem * item = new QTreeWidgetItem(masterChildModule->childrenTW);
3606 to_utf8(makeRelPath(from_utf8((*it)->fileName().absFileName()),
3607 from_utf8(buffer().filePath())));
3608 item->setText(0, toqstr(name));
3609 item->setText(1, isChildIncluded(name) ? yes : no);
3610 if (!isChildIncluded(name))
3611 has_unincluded = true;
3613 all_unincluded = false;
3615 // Both if all childs are included and if none is included
3616 // is equal to "include all" (i.e., ommit \includeonly).
3617 // Thus, reset the GUI.
3618 if (!has_unincluded || all_unincluded) {
3619 masterChildModule->includeallRB->setChecked(true);
3620 masterChildModule->childrenTW->setEnabled(false);
3621 includeonlys_.clear();
3623 // If all are included, we need to update again.
3624 if (!has_unincluded)
3625 updateIncludeonlys();
3629 void GuiDocument::updateContents()
3631 // Nothing to do here as the document settings is not cursor dependant.
3636 void GuiDocument::useClassDefaults()
3638 if (applyPB->isEnabled()) {
3639 int const ret = Alert::prompt(_("Unapplied changes"),
3640 _("Some changes in the dialog were not yet applied.\n"
3641 "If you do not apply now, they will be lost after this action."),
3642 1, 1, _("&Apply"), _("&Dismiss"));
3647 int idx = latexModule->classCO->currentIndex();
3648 string const classname = fromqstr(latexModule->classCO->getData(idx));
3649 if (!bp_.setBaseClass(classname)) {
3650 Alert::error(_("Error"), _("Unable to set document class."));
3653 bp_.useClassDefaults();
3658 void GuiDocument::setLayoutComboByIDString(string const & idString)
3660 if (!latexModule->classCO->set(toqstr(idString)))
3661 Alert::warning(_("Can't set layout!"),
3662 bformat(_("Unable to set layout for ID: %1$s"), from_utf8(idString)));
3666 bool GuiDocument::isValid()
3669 validateListingsParameters().isEmpty() &&
3670 localLayout->isValid() &&
3672 // if we're asking for skips between paragraphs
3673 !textLayoutModule->skipRB->isChecked() ||
3674 // then either we haven't chosen custom
3675 textLayoutModule->skipCO->currentIndex() != 3 ||
3676 // or else a length has been given
3677 !textLayoutModule->skipLE->text().isEmpty()
3680 // if we're asking for indentation
3681 !textLayoutModule->indentRB->isChecked() ||
3682 // then either we haven't chosen custom
3683 textLayoutModule->indentCO->currentIndex() != 1 ||
3684 // or else a length has been given
3685 !textLayoutModule->indentLE->text().isEmpty()
3690 char const * const GuiDocument::fontfamilies[5] = {
3691 "default", "rmdefault", "sfdefault", "ttdefault", ""
3695 char const * GuiDocument::fontfamilies_gui[5] = {
3696 N_("Default"), N_("Roman"), N_("Sans Serif"), N_("Typewriter"), ""
3700 bool GuiDocument::initialiseParams(string const &)
3702 BufferView const * view = bufferview();
3704 bp_ = BufferParams();
3708 bp_ = view->buffer().params();
3710 updateAvailableModules();
3711 //FIXME It'd be nice to make sure here that the selected
3712 //modules are consistent: That required modules are actually
3713 //selected, and that we don't have conflicts. If so, we could
3714 //at least pop up a warning.
3720 void GuiDocument::clearParams()
3722 bp_ = BufferParams();
3726 BufferId GuiDocument::id() const
3728 BufferView const * const view = bufferview();
3729 return view? &view->buffer() : 0;
3733 list<GuiDocument::modInfoStruct> const & GuiDocument::getModuleInfo()
3735 return moduleNames_;
3739 list<GuiDocument::modInfoStruct> const
3740 GuiDocument::makeModuleInfo(LayoutModuleList const & mods)
3742 list<modInfoStruct> mInfo;
3743 for (string const & name : mods) {
3745 LyXModule const * const mod = theModuleList[name];
3750 m.name = toqstr(name + " (") + qt_("Not Found") + toqstr(")");
3758 list<GuiDocument::modInfoStruct> const GuiDocument::getSelectedModules()
3760 return makeModuleInfo(params().getModules());
3764 list<GuiDocument::modInfoStruct> const GuiDocument::getProvidedModules()
3766 return makeModuleInfo(params().baseClass()->providedModules());
3770 DocumentClass const & GuiDocument::documentClass() const
3772 return bp_.documentClass();
3776 static void dispatch_bufferparams(Dialog const & dialog,
3777 BufferParams const & bp, FuncCode lfun, Buffer const * buf)
3780 ss << "\\begin_header\n";
3781 bp.writeFile(ss, buf);
3782 ss << "\\end_header\n";
3783 dialog.dispatch(FuncRequest(lfun, ss.str()));
3787 void GuiDocument::dispatchParams()
3789 // We need a non-const buffer object.
3790 Buffer & buf = const_cast<BufferView *>(bufferview())->buffer();
3791 // There may be several undo records; group them (bug #8998)
3792 buf.undo().beginUndoGroup();
3794 // This must come first so that a language change is correctly noticed
3797 // Apply the BufferParams. Note that this will set the base class
3798 // and then update the buffer's layout.
3799 dispatch_bufferparams(*this, params(), LFUN_BUFFER_PARAMS_APPLY, &buffer());
3801 if (!params().master.empty()) {
3802 FileName const master_file = support::makeAbsPath(params().master,
3803 support::onlyPath(buffer().absFileName()));
3804 if (isLyXFileName(master_file.absFileName())) {
3805 Buffer * master = checkAndLoadLyXFile(master_file);
3807 if (master->isChild(const_cast<Buffer *>(&buffer())))
3808 const_cast<Buffer &>(buffer()).setParent(master);
3810 Alert::warning(_("Assigned master does not include this file"),
3811 bformat(_("You must include this file in the document\n"
3812 "'%1$s' in order to use the master document\n"
3813 "feature."), from_utf8(params().master)));
3815 Alert::warning(_("Could not load master"),
3816 bformat(_("The master document '%1$s'\n"
3817 "could not be loaded."),
3818 from_utf8(params().master)));
3822 // Generate the colours requested by each new branch.
3823 BranchList & branchlist = params().branchlist();
3824 if (!branchlist.empty()) {
3825 BranchList::const_iterator it = branchlist.begin();
3826 BranchList::const_iterator const end = branchlist.end();
3827 for (; it != end; ++it) {
3828 docstring const & current_branch = it->branch();
3829 Branch const * branch = branchlist.find(current_branch);
3830 string const x11hexname = X11hexname(branch->color());
3831 // display the new color
3832 docstring const str = current_branch + ' ' + from_ascii(x11hexname);
3833 dispatch(FuncRequest(LFUN_SET_COLOR, str));
3836 // Open insets of selected branches, close deselected ones
3837 dispatch(FuncRequest(LFUN_INSET_FORALL,
3838 "Branch inset-toggle assign"));
3840 // rename branches in the document
3841 executeBranchRenaming();
3842 // and clear changed branches cache
3843 changedBranches_.clear();
3845 // Generate the colours requested by indices.
3846 IndicesList & indiceslist = params().indiceslist();
3847 if (!indiceslist.empty()) {
3848 IndicesList::const_iterator it = indiceslist.begin();
3849 IndicesList::const_iterator const end = indiceslist.end();
3850 for (; it != end; ++it) {
3851 docstring const & current_index = it->shortcut();
3852 Index const * index = indiceslist.findShortcut(current_index);
3853 string const x11hexname = X11hexname(index->color());
3854 // display the new color
3855 docstring const str = current_index + ' ' + from_ascii(x11hexname);
3856 dispatch(FuncRequest(LFUN_SET_COLOR, str));
3860 // If we used an LFUN, we would not need these two lines:
3861 BufferView * bv = const_cast<BufferView *>(bufferview());
3862 bv->processUpdateFlags(Update::Force | Update::FitCursor);
3864 // Don't forget to close the group. Note that it is important
3865 // to check that there is no early return in the method.
3866 buf.undo().endUndoGroup();
3870 void GuiDocument::setLanguage() const
3872 Language const * const newL = bp_.language;
3873 if (buffer().params().language == newL)
3876 string const & lang_name = newL->lang();
3877 dispatch(FuncRequest(LFUN_BUFFER_LANGUAGE, lang_name));
3881 void GuiDocument::saveAsDefault() const
3883 dispatch_bufferparams(*this, params(), LFUN_BUFFER_SAVE_AS_DEFAULT, &buffer());
3887 bool GuiDocument::providesOSF(QString const & font) const
3889 if (fontModule->osFontsCB->isChecked())
3890 // FIXME: we should check if the fonts really
3891 // have OSF support. But how?
3893 return theLaTeXFonts().getLaTeXFont(
3894 qstring_to_ucs4(font)).providesOSF(ot1(),
3900 bool GuiDocument::providesSC(QString const & font) const
3902 if (fontModule->osFontsCB->isChecked())
3904 return theLaTeXFonts().getLaTeXFont(
3905 qstring_to_ucs4(font)).providesSC(ot1(),
3911 bool GuiDocument::providesScale(QString const & font) const
3913 if (fontModule->osFontsCB->isChecked())
3915 return theLaTeXFonts().getLaTeXFont(
3916 qstring_to_ucs4(font)).providesScale(ot1(),
3922 bool GuiDocument::providesNoMath(QString const & font) const
3924 if (fontModule->osFontsCB->isChecked())
3926 return theLaTeXFonts().getLaTeXFont(
3927 qstring_to_ucs4(font)).providesNoMath(ot1(),
3932 bool GuiDocument::hasMonolithicExpertSet(QString const & font) const
3934 if (fontModule->osFontsCB->isChecked())
3936 return theLaTeXFonts().getLaTeXFont(
3937 qstring_to_ucs4(font)).hasMonolithicExpertSet(ot1(),
3944 GuiDocument::modInfoStruct GuiDocument::modInfo(LyXModule const & mod)
3946 // FIXME Unicode: docstrings would be better for these parameters but this
3947 // change requires a lot of others
3950 m.name = toqstr(translateIfPossible(from_utf8(mod.getName())));
3951 QString desc = toqstr(translateIfPossible(from_utf8(mod.getDescription())));
3952 // Find the first sentence of the description
3953 QTextBoundaryFinder bf(QTextBoundaryFinder::Sentence, desc);
3954 int pos = bf.toNextBoundary();
3957 QString modulename = QString(qt_("(Module name: %1)")).arg(toqstr(m.id));
3958 // Tooltip is the desc followed by the module name
3959 m.description = QString("%1<i>%2</i>")
3960 .arg(desc.isEmpty() ? QString() : QString("<p>%1</p>").arg(desc),
3966 void GuiDocument::loadModuleInfo()
3968 moduleNames_.clear();
3969 for (LyXModule const & mod : theModuleList)
3970 if (mod.category().substr(0, 8) != "Citation")
3971 moduleNames_.push_back(modInfo(mod));
3975 void GuiDocument::updateUnknownBranches()
3979 list<docstring> used_branches;
3980 buffer().getUsedBranches(used_branches);
3981 list<docstring>::const_iterator it = used_branches.begin();
3982 QStringList unknown_branches;
3983 for (; it != used_branches.end() ; ++it) {
3984 if (!buffer().params().branchlist().find(*it))
3985 unknown_branches.append(toqstr(*it));
3987 branchesModule->setUnknownBranches(unknown_branches);
3991 void GuiDocument::branchesRename(docstring const & oldname, docstring const & newname)
3993 map<docstring, docstring>::iterator it = changedBranches_.begin();
3994 for (; it != changedBranches_.end() ; ++it) {
3995 if (it->second == oldname) {
3996 // branch has already been renamed
3997 it->second = newname;
4002 changedBranches_[oldname] = newname;
4006 void GuiDocument::executeBranchRenaming() const
4008 map<docstring, docstring>::const_iterator it = changedBranches_.begin();
4009 for (; it != changedBranches_.end() ; ++it) {
4010 docstring const arg = '"' + it->first + '"' + " " + '"' + it->second + '"';
4011 dispatch(FuncRequest(LFUN_BRANCHES_RENAME, arg));
4016 void GuiDocument::allPackagesAuto()
4022 void GuiDocument::allPackagesAlways()
4028 void GuiDocument::allPackagesNot()
4034 void GuiDocument::allPackages(int col)
4036 for (int row = 0; row < mathsModule->packagesTW->rowCount(); ++row) {
4037 QRadioButton * rb = (QRadioButton*)mathsModule->packagesTW->cellWidget(row, col);
4038 rb->setChecked(true);
4043 Dialog * createGuiDocument(GuiView & lv) { return new GuiDocument(lv); }
4046 } // namespace frontend
4049 #include "moc_GuiDocument.cpp"