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 Kimberly Heck (modules)
9 * Full author contact details are available in file CREDITS.
14 #include "GuiDocument.h"
16 #include "BulletsModule.h"
17 #include "CategorizedCombo.h"
18 #include "FancyLineEdit.h"
19 #include "GuiApplication.h"
20 #include "GuiBranches.h"
21 #include "GuiIndices.h"
22 #include "GuiSelectionManager.h"
23 #include "LaTeXHighlighter.h"
24 #include "Validator.h"
26 #include "LayoutFile.h"
27 #include "BranchList.h"
28 #include "buffer_funcs.h"
30 #include "BufferView.h"
31 #include "CiteEnginesList.h"
33 #include "ColorCache.h"
34 #include "Converter.h"
37 #include "FloatPlacement.h"
39 #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 "PDFOptions.h"
50 #include "qt_helpers.h"
53 #include "TextClass.h"
57 #include "insets/InsetListingsParams.h"
58 #include "insets/InsetQuotes.h"
60 #include "support/debug.h"
61 #include "support/docstream.h"
62 #include "support/FileName.h"
63 #include "support/filetools.h"
64 #include "support/gettext.h"
65 #include "support/lassert.h"
66 #include "support/lstrings.h"
67 #include "support/Package.h"
68 #include "support/TempFile.h"
70 #include "frontends/alert.h"
72 #include <QAbstractItemModel>
73 #include <QButtonGroup>
75 #include <QColorDialog>
76 #include <QCloseEvent>
77 #include <QDirIterator>
78 #include <QFontDatabase>
79 #include <QHeaderView>
82 #include <QTextBoundaryFinder>
83 #include <QTextCursor>
89 // a style sheet for buttons
90 // this is for example used for the background color setting button
91 static inline QString colorButtonStyleSheet(QColor const & bgColor)
93 if (bgColor.isValid()) {
94 QString rc = QLatin1String("background-color:");
103 using namespace lyx::support;
108 char const * const tex_graphics[] =
110 "default", "dvialw", "dvilaser", "dvipdf", "dvipdfm", "dvipdfmx",
111 "dvips", "dvipsone", "dvitops", "dviwin", "dviwindo", "dvi2ps", "emtex",
112 "ln", "oztex", "pctexhp", "pctexps", "pctexwin", "pctex32", "pdftex",
113 "psprint", "pubps", "tcidvi", "textures", "truetex", "vtex", "xdvi",
118 char const * const tex_graphics_gui[] =
120 N_("Default"), "dvialw", "DviLaser", "dvipdf", "DVIPDFM", "DVIPDFMx",
121 "Dvips", "DVIPSONE", "DVItoPS", "DVIWIN", "DVIWindo", "dvi2ps", "EmTeX",
122 "LN", "OzTeX", "pctexhp", "pctexps", "pctexwin", "PCTeX32", "pdfTeX",
123 "psprint", "pubps", "tcidvi", "Textures", "TrueTeX", "VTeX", "xdvi",
124 "XeTeX", N_("None"), ""
128 char const * backref_opts[] =
130 "false", "section", "slide", "page", ""
134 char const * backref_opts_gui[] =
136 N_("Off"), N_("Section"), N_("Slide"), N_("Page"), ""
140 char const * lst_packages[] =
142 "Listings", "Minted", ""
146 vector<string> engine_types_;
147 vector<pair<string, QString> > pagestyles;
149 QMap<QString, QString> rmfonts_;
150 QMap<QString, QString> sffonts_;
151 QMap<QString, QString> ttfonts_;
152 QMap<QString, QString> mathfonts_;
160 lyx::RGBColor set_backgroundcolor;
161 bool is_backgroundcolor;
162 lyx::RGBColor set_fontcolor;
164 lyx::RGBColor set_notefontcolor;
165 bool is_notefontcolor;
166 lyx::RGBColor set_boxbgcolor;
168 bool forced_fontspec_activation;
170 } // anonymous namespace
175 // used when sorting the textclass list.
176 class less_textclass_avail_desc
179 bool operator()(string const & lhs, string const & rhs) const
181 // Ordering criteria:
182 // 1. Availability of text class
183 // 2. Description (lexicographic)
184 LayoutFile const & tc1 = LayoutFileList::get()[lhs];
185 LayoutFile const & tc2 = LayoutFileList::get()[rhs];
186 int const order = compare_no_case(
187 translateIfPossible(from_utf8(tc1.description())),
188 translateIfPossible(from_utf8(tc2.description())));
189 return (tc1.isTeXClassAvailable() && !tc2.isTeXClassAvailable()) ||
190 (tc1.isTeXClassAvailable() == tc2.isTeXClassAvailable() && order < 0);
199 vector<string> getRequiredList(string const & modName)
201 LyXModule const * const mod = theModuleList[modName];
203 return vector<string>(); //empty such thing
204 return mod->getRequiredModules();
208 vector<string> getExcludedList(string const & modName)
210 LyXModule const * const mod = theModuleList[modName];
212 return vector<string>(); //empty such thing
213 return mod->getExcludedModules();
217 docstring getModuleCategory(string const & modName)
219 LyXModule const * const mod = theModuleList[modName];
222 return from_utf8(mod->category());
226 docstring getModuleDescription(string const & modName)
228 LyXModule const * const mod = theModuleList[modName];
230 return _("Module not found!");
232 return translateIfPossible(from_utf8(mod->getDescription()));
236 vector<string> getPackageList(string const & modName)
238 LyXModule const * const mod = theModuleList[modName];
240 return vector<string>(); //empty such thing
241 return mod->getPackageList();
245 bool isModuleAvailable(string const & modName)
247 LyXModule const * const mod = theModuleList[modName];
250 return mod->isAvailable();
253 } // anonymous namespace
256 /////////////////////////////////////////////////////////////////////
258 // ModuleSelectionManager
260 /////////////////////////////////////////////////////////////////////
262 /// SelectionManager for use with modules
263 class ModuleSelectionManager : public GuiSelectionManager
267 ModuleSelectionManager(QObject * parent,
268 QTreeView * availableLVarg,
269 QTreeView * selectedLVarg,
270 QPushButton * addPBarg,
271 QPushButton * delPBarg,
272 QPushButton * upPBarg,
273 QPushButton * downPBarg,
274 QStandardItemModel * availableModelarg,
275 GuiIdListModel * selectedModelarg,
276 GuiDocument const * container)
277 : GuiSelectionManager(parent, availableLVarg, selectedLVarg, addPBarg, delPBarg,
278 upPBarg, downPBarg, availableModelarg, selectedModelarg),
279 container_(container)
282 void updateProvidedModules(LayoutModuleList const & pm)
283 { provided_modules_ = pm.list(); }
285 void updateExcludedModules(LayoutModuleList const & em)
286 { excluded_modules_ = em.list(); }
289 void updateAddPB() override;
291 void updateUpPB() override;
293 void updateDownPB() override;
295 void updateDelPB() override;
296 /// returns availableModel as a GuiIdListModel
297 QStandardItemModel * getAvailableModel()
299 return dynamic_cast<QStandardItemModel *>(availableModel);
301 /// returns selectedModel as a GuiIdListModel
302 GuiIdListModel * getSelectedModel()
304 return dynamic_cast<GuiIdListModel *>(selectedModel);
306 /// keeps a list of the modules the text class provides
307 list<string> provided_modules_;
309 list<string> excluded_modules_;
311 GuiDocument const * container_;
314 void ModuleSelectionManager::updateAddPB()
316 int const arows = availableModel->rowCount();
317 QModelIndexList const avail_sels =
318 availableLV->selectionModel()->selectedRows(0);
320 // disable if there aren't any modules (?), if none of them is chosen
321 // in the dialog, or if the chosen one is already selected for use.
322 if (arows == 0 || avail_sels.isEmpty() || isSelected(avail_sels.first())) {
323 addPB->setEnabled(false);
327 QModelIndex const & idx = availableLV->selectionModel()->currentIndex();
329 if (getAvailableModel()->itemFromIndex(idx)->hasChildren()) {
330 // This is a category header
331 addPB->setEnabled(false);
335 string const modname = fromqstr(getAvailableModel()->data(idx, Qt::UserRole).toString());
338 container_->params().layoutModuleCanBeAdded(modname);
339 addPB->setEnabled(enable);
343 void ModuleSelectionManager::updateDownPB()
345 int const srows = selectedModel->rowCount();
347 downPB->setEnabled(false);
350 QModelIndex const & curidx = selectedLV->selectionModel()->currentIndex();
351 int const curRow = curidx.row();
352 if (curRow < 0 || curRow >= srows - 1) { // invalid or last item
353 downPB->setEnabled(false);
357 // determine whether immediately succeeding element requires this one
358 string const curmodname = getSelectedModel()->getIDString(curRow);
359 string const nextmodname = getSelectedModel()->getIDString(curRow + 1);
361 vector<string> reqs = getRequiredList(nextmodname);
363 // if it doesn't require anything....
365 downPB->setEnabled(true);
369 // Enable it if this module isn't required.
370 // FIXME This should perhaps be more flexible and check whether, even
371 // if the next one is required, there is also an earlier one that will do.
373 find(reqs.begin(), reqs.end(), curmodname) == reqs.end());
376 void ModuleSelectionManager::updateUpPB()
378 int const srows = selectedModel->rowCount();
380 upPB->setEnabled(false);
384 QModelIndex const & curIdx = selectedLV->selectionModel()->currentIndex();
385 int curRow = curIdx.row();
386 if (curRow <= 0 || curRow > srows - 1) { // first item or invalid
387 upPB->setEnabled(false);
390 string const curmodname = getSelectedModel()->getIDString(curRow);
392 // determine whether immediately preceding element is required by this one
393 vector<string> reqs = getRequiredList(curmodname);
395 // if this one doesn't require anything....
397 upPB->setEnabled(true);
402 // Enable it if the preceding module isn't required.
403 // NOTE This is less flexible than it might be. We could check whether, even
404 // if the previous one is required, there is an earlier one that would do.
405 string const premod = getSelectedModel()->getIDString(curRow - 1);
406 upPB->setEnabled(find(reqs.begin(), reqs.end(), premod) == reqs.end());
409 void ModuleSelectionManager::updateDelPB()
411 int const srows = selectedModel->rowCount();
413 deletePB->setEnabled(false);
417 QModelIndex const & curidx =
418 selectedLV->selectionModel()->currentIndex();
419 int const curRow = curidx.row();
420 if (curRow < 0 || curRow >= srows) { // invalid index?
421 deletePB->setEnabled(false);
425 string const curmodname = getSelectedModel()->getIDString(curRow);
427 // We're looking here for a reason NOT to enable the button. If we
428 // find one, we disable it and return. If we don't, we'll end up at
429 // the end of the function, and then we enable it.
430 for (int i = curRow + 1; i < srows; ++i) {
431 string const thisMod = getSelectedModel()->getIDString(i);
432 vector<string> reqs = getRequiredList(thisMod);
433 //does this one require us?
434 if (find(reqs.begin(), reqs.end(), curmodname) == reqs.end())
438 // OK, so this module requires us
439 // is there an EARLIER module that also satisfies the require?
440 // NOTE We demand that it be earlier to keep the list of modules
441 // consistent with the rule that a module must be proceeded by a
442 // required module. There would be more flexible ways to proceed,
443 // but that would be a lot more complicated, and the logic here is
444 // already complicated. (That's why I've left the debugging code.)
445 // lyxerr << "Testing " << thisMod << endl;
446 bool foundone = false;
447 for (int j = 0; j < curRow; ++j) {
448 string const mod = getSelectedModel()->getIDString(j);
449 // lyxerr << "In loop: Testing " << mod << endl;
450 // do we satisfy the require?
451 if (find(reqs.begin(), reqs.end(), mod) != reqs.end()) {
452 // lyxerr << mod << " does the trick." << endl;
457 // did we find a module to satisfy the require?
459 // lyxerr << "No matching module found." << endl;
460 deletePB->setEnabled(false);
464 // lyxerr << "All's well that ends well." << endl;
465 deletePB->setEnabled(true);
469 /////////////////////////////////////////////////////////////////////
473 /////////////////////////////////////////////////////////////////////
475 PreambleModule::PreambleModule(QWidget * parent)
476 : UiWidget<Ui::PreambleUi>(parent), current_id_(nullptr)
478 // This is not a memory leak. The object will be destroyed
480 // @ is letter in the LyX user preamble
481 (void) new LaTeXHighlighter(preambleTE->document(), true);
482 preambleTE->setFont(guiApp->typewriterSystemFont());
483 preambleTE->setWordWrapMode(QTextOption::NoWrap);
484 setFocusProxy(preambleTE);
485 connect(preambleTE, SIGNAL(textChanged()), this, SIGNAL(changed()));
486 connect(findLE, SIGNAL(textEdited(const QString &)), this, SLOT(checkFindButton()));
487 connect(findButtonPB, SIGNAL(clicked()), this, SLOT(findText()));
488 connect(editPB, SIGNAL(clicked()), this, SLOT(editExternal()));
489 connect(findLE, SIGNAL(returnPressed()), this, SLOT(findText()));
491 int const tabStop = 4;
492 QFontMetrics metrics(preambleTE->currentFont());
493 #if (QT_VERSION >= QT_VERSION_CHECK(5, 11, 0))
494 // horizontalAdvance() is available starting in 5.11.0
495 // setTabStopDistance() is available starting in 5.10.0
496 preambleTE->setTabStopDistance(tabStop * metrics.horizontalAdvance(' '));
498 preambleTE->setTabStopWidth(tabStop * metrics.width(' '));
503 void PreambleModule::checkFindButton()
505 findButtonPB->setEnabled(!findLE->text().isEmpty());
509 void PreambleModule::findText()
511 bool const found = preambleTE->find(findLE->text());
514 QTextCursor qtcur = preambleTE->textCursor();
515 qtcur.movePosition(QTextCursor::Start);
516 preambleTE->setTextCursor(qtcur);
517 preambleTE->find(findLE->text());
522 void PreambleModule::update(BufferParams const & params, BufferId id)
524 QString preamble = toqstr(params.preamble);
525 // Nothing to do if the params and preamble are unchanged.
526 if (id == current_id_
527 && preamble == preambleTE->document()->toPlainText())
530 QTextCursor cur = preambleTE->textCursor();
531 // Save the coords before switching to the new one.
532 preamble_coords_[current_id_] =
533 make_pair(cur.position(), preambleTE->verticalScrollBar()->value());
535 // Save the params address for further use.
537 preambleTE->document()->setPlainText(preamble);
538 Coords::const_iterator it = preamble_coords_.find(current_id_);
539 if (it == preamble_coords_.end())
540 // First time we open this one.
541 preamble_coords_[current_id_] = make_pair(0, 0);
543 // Restore saved coords.
544 cur = preambleTE->textCursor();
545 cur.setPosition(it->second.first);
546 preambleTE->setTextCursor(cur);
547 preambleTE->verticalScrollBar()->setValue(it->second.second);
552 void PreambleModule::apply(BufferParams & params)
554 params.preamble = qstring_to_ucs4(preambleTE->document()->toPlainText());
558 void PreambleModule::closeEvent(QCloseEvent * e)
560 // Save the coords before closing.
561 QTextCursor cur = preambleTE->textCursor();
562 preamble_coords_[current_id_] =
563 make_pair(cur.position(), preambleTE->verticalScrollBar()->value());
568 void PreambleModule::editExternal() {
573 preambleTE->setReadOnly(false);
574 FileName const tempfilename = tempfile_->name();
575 docstring const s = tempfilename.fileContents("UTF-8");
576 preambleTE->document()->setPlainText(toqstr(s));
578 editPB->setText(qt_("&Edit"));
583 string const format =
584 current_id_->params().documentClass().outputFormat();
585 string const ext = theFormats().extension(format);
586 tempfile_.reset(new TempFile("preamble_editXXXXXX." + ext));
587 FileName const tempfilename = tempfile_->name();
588 string const name = tempfilename.toFilesystemEncoding();
589 ofdocstream os(name.c_str());
590 os << qstring_to_ucs4(preambleTE->document()->toPlainText());
592 preambleTE->setReadOnly(true);
593 theFormats().edit(*current_id_, tempfilename, format);
594 editPB->setText(qt_("&End Edit"));
598 /////////////////////////////////////////////////////////////////////
602 /////////////////////////////////////////////////////////////////////
605 LocalLayout::LocalLayout(QWidget * parent)
606 : UiWidget<Ui::LocalLayoutUi>(parent), current_id_(nullptr), validated_(false)
608 locallayoutTE->setFont(guiApp->typewriterSystemFont());
609 locallayoutTE->setWordWrapMode(QTextOption::NoWrap);
610 connect(locallayoutTE, SIGNAL(textChanged()), this, SLOT(textChanged()));
611 connect(validatePB, SIGNAL(clicked()), this, SLOT(validatePressed()));
612 connect(convertPB, SIGNAL(clicked()), this, SLOT(convertPressed()));
613 connect(editPB, SIGNAL(clicked()), this, SLOT(editExternal()));
614 int const tabStop = 4;
615 QFontMetrics metrics(locallayoutTE->currentFont());
616 #if (QT_VERSION >= QT_VERSION_CHECK(5, 11, 0))
617 // horizontalAdvance() is available starting in 5.11.0
618 // setTabStopDistance() is available starting in 5.10.0
619 locallayoutTE->setTabStopDistance(tabStop * metrics.horizontalAdvance(' '));
621 locallayoutTE->setTabStopWidth(tabStop * metrics.width(' '));
626 void LocalLayout::update(BufferParams const & params, BufferId id)
628 QString layout = toqstr(params.getLocalLayout(false));
629 // Nothing to do if the params and preamble are unchanged.
630 if (id == current_id_
631 && layout == locallayoutTE->document()->toPlainText())
634 // Save the params address for further use.
636 locallayoutTE->document()->setPlainText(layout);
641 void LocalLayout::apply(BufferParams & params)
643 docstring const layout =
644 qstring_to_ucs4(locallayoutTE->document()->toPlainText());
645 params.setLocalLayout(layout, false);
649 void LocalLayout::hideConvert()
651 convertPB->setEnabled(false);
652 convertLB->setText("");
658 void LocalLayout::textChanged()
660 validLB->setText("");
661 string const layout =
662 fromqstr(locallayoutTE->document()->toPlainText().trimmed());
664 if (layout.empty()) {
666 validatePB->setEnabled(false);
669 } else if (!validatePB->isEnabled()) {
670 // if that's already enabled, we shouldn't need to do anything.
672 validatePB->setEnabled(true);
679 void LocalLayout::convert() {
680 string const layout =
681 fromqstr(locallayoutTE->document()->toPlainText().trimmed());
682 string const newlayout = TextClass::convert(layout);
683 if (!newlayout.empty())
684 locallayoutTE->setPlainText(toqstr(newlayout));
689 void LocalLayout::convertPressed() {
696 void LocalLayout::validate() {
698 static const QString vpar("<p style=\"font-weight: bold; text-align:left\">%1</p>");
699 // Flashy red bold text
700 static const QString ivpar("<p style=\"color: #c00000; font-weight: bold; text-align:left\">"
702 string const layout =
703 fromqstr(locallayoutTE->document()->toPlainText().trimmed());
704 if (!layout.empty()) {
705 TextClass::ReturnValues const ret = TextClass::validate(layout);
706 validated_ = (ret == TextClass::OK) || (ret == TextClass::OK_OLDFORMAT);
707 validatePB->setEnabled(false);
708 validLB->setText(validated_ ? vpar.arg(qt_("Layout is valid!"))
709 : ivpar.arg(qt_("Layout is invalid!")));
710 if (ret == TextClass::OK_OLDFORMAT) {
712 // Testing conversion to LYXFILE_LAYOUT_FORMAT at this point
714 if (TextClass::convert(layout).empty()) {
715 // Conversion failed. If LAYOUT_FORMAT > LYXFILE_LAYOUT_FORMAT,
716 // then maybe the layout is still valid, but its format is more
717 // recent than LYXFILE_LAYOUT_FORMAT. However, if LAYOUT_FORMAT
718 // == LYXFILE_LAYOUT_FORMAT then something is definitely wrong.
719 convertPB->setEnabled(false);
720 const QString text = (LAYOUT_FORMAT == LYXFILE_LAYOUT_FORMAT)
721 ? ivpar.arg(qt_("Conversion to current format impossible!"))
722 : vpar.arg(qt_("Conversion to current stable format "
724 convertLB->setText(text);
726 convertPB->setEnabled(true);
727 convertLB->setText(qt_("Convert to current format"));
738 void LocalLayout::validatePressed() {
744 void LocalLayout::editExternal() {
749 locallayoutTE->setReadOnly(false);
750 FileName const tempfilename = tempfile_->name();
751 docstring const s = tempfilename.fileContents("UTF-8");
752 locallayoutTE->document()->setPlainText(toqstr(s));
754 editPB->setText(qt_("&Edit"));
759 string const format =
760 current_id_->params().documentClass().outputFormat();
761 string const ext = theFormats().extension(format);
762 tempfile_.reset(new TempFile("preamble_editXXXXXX." + ext));
763 FileName const tempfilename = tempfile_->name();
764 string const name = tempfilename.toFilesystemEncoding();
765 ofdocstream os(name.c_str());
766 os << qstring_to_ucs4(locallayoutTE->document()->toPlainText());
768 locallayoutTE->setReadOnly(true);
769 theFormats().edit(*current_id_, tempfilename, format);
770 editPB->setText(qt_("&End Edit"));
771 validatePB->setEnabled(false);
776 /////////////////////////////////////////////////////////////////////
780 /////////////////////////////////////////////////////////////////////
783 GuiDocument::GuiDocument(GuiView & lv)
784 : GuiDialog(lv, "document", qt_("Document Settings")),
785 biblioChanged_(false), nonModuleChanged_(false),
786 modulesChanged_(false), shellescapeChanged_(false)
790 connect(buttonBox, SIGNAL(clicked(QAbstractButton *)),
791 this, SLOT(slotButtonBox(QAbstractButton *)));
793 connect(savePB, SIGNAL(clicked()), this, SLOT(saveDefaultClicked()));
794 connect(defaultPB, SIGNAL(clicked()), this, SLOT(useDefaultsClicked()));
796 // Manage the restore, ok, apply, restore and cancel/close buttons
797 bc().setPolicy(ButtonPolicy::NoRepeatedApplyReadOnlyPolicy);
798 bc().setOK(buttonBox->button(QDialogButtonBox::Ok));
799 bc().setApply(buttonBox->button(QDialogButtonBox::Apply));
800 bc().setCancel(buttonBox->button(QDialogButtonBox::Cancel));
801 bc().setRestore(buttonBox->button(QDialogButtonBox::Reset));
805 textLayoutModule = new UiWidget<Ui::TextLayoutUi>(this);
806 connect(textLayoutModule->lspacingCO, SIGNAL(activated(int)),
807 this, SLOT(change_adaptor()));
808 connect(textLayoutModule->lspacingCO, SIGNAL(activated(int)),
809 this, SLOT(setLSpacing(int)));
810 connect(textLayoutModule->lspacingLE, SIGNAL(textChanged(const QString &)),
811 this, SLOT(change_adaptor()));
813 connect(textLayoutModule->indentRB, SIGNAL(clicked()),
814 this, SLOT(change_adaptor()));
815 connect(textLayoutModule->indentRB, SIGNAL(toggled(bool)),
816 textLayoutModule->indentCO, SLOT(setEnabled(bool)));
817 connect(textLayoutModule->indentCO, SIGNAL(activated(int)),
818 this, SLOT(change_adaptor()));
819 connect(textLayoutModule->indentCO, SIGNAL(activated(int)),
820 this, SLOT(setIndent(int)));
821 connect(textLayoutModule->indentLE, SIGNAL(textChanged(const QString &)),
822 this, SLOT(change_adaptor()));
823 connect(textLayoutModule->indentLengthCO, SIGNAL(activated(int)),
824 this, SLOT(change_adaptor()));
826 connect(textLayoutModule->skipRB, SIGNAL(clicked()),
827 this, SLOT(change_adaptor()));
828 connect(textLayoutModule->skipRB, SIGNAL(toggled(bool)),
829 textLayoutModule->skipCO, SLOT(setEnabled(bool)));
830 connect(textLayoutModule->skipCO, SIGNAL(activated(int)),
831 this, SLOT(change_adaptor()));
832 connect(textLayoutModule->skipCO, SIGNAL(activated(int)),
833 this, SLOT(setSkip(int)));
834 connect(textLayoutModule->skipLE, SIGNAL(textChanged(const QString &)),
835 this, SLOT(change_adaptor()));
836 connect(textLayoutModule->skipLengthCO, SIGNAL(activated(int)),
837 this, SLOT(change_adaptor()));
839 connect(textLayoutModule->indentRB, SIGNAL(toggled(bool)),
840 this, SLOT(enableIndent(bool)));
841 connect(textLayoutModule->skipRB, SIGNAL(toggled(bool)),
842 this, SLOT(enableSkip(bool)));
844 connect(textLayoutModule->twoColumnCB, SIGNAL(clicked()),
845 this, SLOT(change_adaptor()));
846 connect(textLayoutModule->twoColumnCB, SIGNAL(clicked()),
847 this, SLOT(setColSep()));
848 connect(textLayoutModule->justCB, SIGNAL(clicked()),
849 this, SLOT(change_adaptor()));
851 connect(textLayoutModule->tableStyleCO, SIGNAL(activated(int)),
852 this, SLOT(change_adaptor()));
854 textLayoutModule->lspacingLE->setValidator(new QDoubleValidator(
855 textLayoutModule->lspacingLE));
856 textLayoutModule->indentLE->setValidator(new LengthValidator(
857 textLayoutModule->indentLE));
858 textLayoutModule->skipLE->setValidator(new LengthValidator(
859 textLayoutModule->skipLE));
861 textLayoutModule->indentCO->addItem(qt_("Default"), toqstr("default"));
862 textLayoutModule->indentCO->addItem(qt_("Custom"), toqstr("custom"));
863 textLayoutModule->skipCO->addItem(qt_("Half line height"), VSpace::HALFLINE);
864 textLayoutModule->skipCO->addItem(qt_("Line height"), VSpace::FULLLINE);
865 textLayoutModule->skipCO->addItem(qt_("Small Skip"), VSpace::SMALLSKIP);
866 textLayoutModule->skipCO->addItem(qt_("Medium Skip"), VSpace::MEDSKIP);
867 textLayoutModule->skipCO->addItem(qt_("Big Skip"), VSpace::BIGSKIP);
868 textLayoutModule->skipCO->addItem(qt_("Custom"), VSpace::LENGTH);
869 textLayoutModule->lspacingCO->insertItem(
870 Spacing::Single, qt_("Single"));
871 textLayoutModule->lspacingCO->insertItem(
872 Spacing::Onehalf, qt_("OneHalf"));
873 textLayoutModule->lspacingCO->insertItem(
874 Spacing::Double, qt_("Double"));
875 textLayoutModule->lspacingCO->insertItem(
876 Spacing::Other, qt_("Custom"));
877 // initialize the length validator
878 bc().addCheckedLineEdit(textLayoutModule->indentLE);
879 bc().addCheckedLineEdit(textLayoutModule->skipLE);
881 textLayoutModule->tableStyleCO->addItem(qt_("Default"), toqstr("default"));
885 // master/child handling
886 masterChildModule = new UiWidget<Ui::MasterChildUi>(this);
888 connect(masterChildModule->childrenTW, SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)),
889 this, SLOT(includeonlyClicked(QTreeWidgetItem *, int)));
890 connect(masterChildModule->includeonlyRB, SIGNAL(toggled(bool)),
891 masterChildModule->childrenTW, SLOT(setEnabled(bool)));
892 connect(masterChildModule->includeonlyRB, SIGNAL(toggled(bool)),
893 masterChildModule->maintainGB, SLOT(setEnabled(bool)));
894 connect(masterChildModule->includeallRB, SIGNAL(clicked()),
895 this, SLOT(change_adaptor()));
896 connect(masterChildModule->includeonlyRB, SIGNAL(clicked()),
897 this, SLOT(change_adaptor()));
898 connect(masterChildModule->maintainCRNoneRB, SIGNAL(clicked()),
899 this, SLOT(change_adaptor()));
900 connect(masterChildModule->maintainCRMostlyRB, SIGNAL(clicked()),
901 this, SLOT(change_adaptor()));
902 connect(masterChildModule->maintainCRStrictRB, SIGNAL(clicked()),
903 this, SLOT(change_adaptor()));
904 masterChildModule->childrenTW->setColumnCount(2);
905 masterChildModule->childrenTW->headerItem()->setText(0, qt_("Child Document"));
906 masterChildModule->childrenTW->headerItem()->setText(1, qt_("Include to Output"));
907 masterChildModule->childrenTW->header()->setSectionResizeMode(0, QHeaderView::ResizeToContents);
908 masterChildModule->childrenTW->header()->setSectionResizeMode(1, QHeaderView::ResizeToContents);
911 outputModule = new UiWidget<Ui::OutputUi>(this);
913 connect(outputModule->defaultFormatCO, SIGNAL(activated(int)),
914 this, SLOT(change_adaptor()));
915 connect(outputModule->mathimgSB, SIGNAL(valueChanged(double)),
916 this, SLOT(change_adaptor()));
917 connect(outputModule->strictCB, SIGNAL(stateChanged(int)),
918 this, SLOT(change_adaptor()));
919 connect(outputModule->cssCB, SIGNAL(stateChanged(int)),
920 this, SLOT(change_adaptor()));
921 connect(outputModule->mathoutCB, SIGNAL(currentIndexChanged(int)),
922 this, SLOT(change_adaptor()));
923 connect(outputModule->tableoutCB, SIGNAL(currentIndexChanged(int)),
924 this, SLOT(change_adaptor()));
925 connect(outputModule->mathmlprefixCB, SIGNAL(currentIndexChanged(int)),
926 this, SLOT(change_adaptor()));
928 connect(outputModule->shellescapeCB, SIGNAL(stateChanged(int)),
929 this, SLOT(shellescapeChanged()));
930 connect(outputModule->outputsyncCB, SIGNAL(toggled(bool)),
931 this, SLOT(setOutputSync(bool)));
932 connect(outputModule->synccustomCB, SIGNAL(editTextChanged(QString)),
933 this, SLOT(change_adaptor()));
934 outputModule->synccustomCB->addItem("");
935 outputModule->synccustomCB->addItem("\\synctex=1");
936 outputModule->synccustomCB->addItem("\\synctex=-1");
937 outputModule->synccustomCB->addItem("\\usepackage[active]{srcltx}");
939 outputModule->synccustomCB->setValidator(new NoNewLineValidator(
940 outputModule->synccustomCB));
942 connect(outputModule->saveTransientPropertiesCB, SIGNAL(clicked()),
943 this, SLOT(change_adaptor()));
944 connect(outputModule->postponeFragileCB, SIGNAL(clicked()),
945 this, SLOT(change_adaptor()));
949 // this must precede font, since fonts depend on this
950 langModule = new UiWidget<Ui::LanguageUi>(this);
951 connect(langModule->languageCO, SIGNAL(activated(int)),
952 this, SLOT(change_adaptor()));
953 connect(langModule->languageCO, SIGNAL(activated(int)),
954 this, SLOT(languageChanged(int)));
955 connect(langModule->encodingCO, SIGNAL(activated(int)),
956 this, SLOT(change_adaptor()));
957 connect(langModule->encodingCO, SIGNAL(activated(int)),
958 this, SLOT(encodingSwitched(int)));
959 connect(langModule->unicodeEncodingCO, SIGNAL(activated(int)),
960 this, SLOT(change_adaptor()));
961 connect(langModule->autoEncodingCO, SIGNAL(activated(int)),
962 this, SLOT(change_adaptor()));
963 connect(langModule->customEncodingCO, SIGNAL(activated(int)),
964 this, SLOT(change_adaptor()));
965 connect(langModule->quoteStyleCO, SIGNAL(activated(int)),
966 this, SLOT(change_adaptor()));
967 connect(langModule->languagePackageCO, SIGNAL(activated(int)),
968 this, SLOT(change_adaptor()));
969 connect(langModule->languagePackageLE, SIGNAL(textChanged(QString)),
970 this, SLOT(change_adaptor()));
971 connect(langModule->languagePackageCO, SIGNAL(currentIndexChanged(int)),
972 this, SLOT(languagePackageChanged(int)));
973 connect(langModule->dynamicQuotesCB, SIGNAL(clicked()),
974 this, SLOT(change_adaptor()));
976 langModule->languagePackageLE->setValidator(new NoNewLineValidator(
977 langModule->languagePackageLE));
979 QAbstractItemModel * language_model = guiApp->languageModel();
980 // FIXME: it would be nice if sorting was enabled/disabled via a checkbox.
981 language_model->sort(0);
982 langModule->languageCO->setModel(language_model);
983 langModule->languageCO->setModelColumn(0);
985 langModule->encodingCO->addItem(qt_("Unicode (utf8)"));
986 langModule->encodingCO->addItem(qt_("Traditional (auto-selected)"));
987 langModule->encodingCO->addItem(qt_("Custom"));
988 langModule->encodingCO->setItemData(EncodingSets::unicode,
989 qt_("Select Unicode (utf8) encoding."), Qt::ToolTipRole);
990 langModule->encodingCO->setItemData(EncodingSets::legacy,
991 qt_("Use language-dependent traditional encodings."), Qt::ToolTipRole);
992 langModule->encodingCO->setItemData(EncodingSets::custom,
993 qt_("Select a custom, document-wide encoding."), Qt::ToolTipRole);
995 // basic Unicode encodings: keep order
996 const QStringList utf8_base_encodings = {"utf8", "utf8-plain", "utf8x"};
997 for (auto const & i : utf8_base_encodings) {
998 langModule->unicodeEncodingCO->addItem(
999 qt_(encodings.fromLyXName(fromqstr(i))->guiName()), i);
1001 langModule->unicodeEncodingCO->setItemData(0,
1002 qt_("Standard Unicode support by the ``inputenc'' package."),
1004 langModule->unicodeEncodingCO->setItemData(1,
1005 qt_("Use UTF-8 'as-is': do not load any supporting packages, "
1006 "do not convert any characters to LaTeX macros. "
1007 "For use with non-TeX fonts (XeTeX/LuaTeX) or custom preamble code."),
1009 langModule->unicodeEncodingCO->setItemData(2,
1010 qt_("Load ``inputenc'' with option 'utf8x' "
1011 "for extended Unicode support by the ``ucs'' package."),
1013 langModule->autoEncodingCO->addItem(qt_("Language Default"), toqstr("auto-legacy"));
1014 langModule->autoEncodingCO->addItem(qt_("Language Default (no inputenc)"), toqstr("auto-legacy-plain"));
1015 langModule->autoEncodingCO->setItemData(0,
1016 qt_("Use the traditional default encoding of the text language. Switch encoding "
1017 "if a text part is set to a language with different default."),
1019 langModule->autoEncodingCO->setItemData(1,
1020 qt_("Do not load the 'inputenc' package. Switch encoding if required "
1021 "but do not write input encoding switch commands to the source."),
1024 QMap<QString,QString> encodingmap;
1025 QMap<QString,QString> encodingmap_utf8;
1026 for (auto const & encvar : encodings) {
1027 if (encvar.unsafe() ||encvar.guiName().empty()
1028 || utf8_base_encodings.contains(toqstr(encvar.name())))
1030 if (encvar.name().find("utf8") == 0)
1031 encodingmap_utf8.insert(qt_(encvar.guiName()), toqstr(encvar.name()));
1033 encodingmap.insert(qt_(encvar.guiName()), toqstr(encvar.name()));
1035 for (auto const & i : encodingmap_utf8.keys()) {
1036 langModule->unicodeEncodingCO->addItem(i, encodingmap_utf8.value(i));
1038 for (auto const & i : encodingmap.keys()) {
1039 langModule->customEncodingCO->addItem(i, encodingmap.value(i));
1041 // equalise the width of encoding selectors
1042 langModule->autoEncodingCO->setMinimumSize(
1043 langModule->unicodeEncodingCO->minimumSizeHint());
1044 langModule->customEncodingCO->setMinimumSize(
1045 langModule->unicodeEncodingCO->minimumSizeHint());
1047 langModule->languagePackageCO->addItem(
1048 qt_("Default"), toqstr("default"));
1049 langModule->languagePackageCO->addItem(
1050 qt_("Automatic"), toqstr("auto"));
1051 langModule->languagePackageCO->addItem(
1052 qt_("Always Babel"), toqstr("babel"));
1053 langModule->languagePackageCO->addItem(
1054 qt_("Custom"), toqstr("custom"));
1055 langModule->languagePackageCO->addItem(
1056 qt_("None[[language package]]"), toqstr("none"));
1060 fontModule = new FontModule(this);
1061 connect(fontModule->osFontsCB, SIGNAL(clicked()),
1062 this, SLOT(change_adaptor()));
1063 connect(fontModule->osFontsCB, SIGNAL(toggled(bool)),
1064 this, SLOT(osFontsChanged(bool)));
1065 connect(fontModule->fontsRomanCO, SIGNAL(activated(int)),
1066 this, SLOT(change_adaptor()));
1067 connect(fontModule->fontsRomanCO, SIGNAL(activated(int)),
1068 this, SLOT(romanChanged(int)));
1069 connect(fontModule->fontsSansCO, SIGNAL(activated(int)),
1070 this, SLOT(change_adaptor()));
1071 connect(fontModule->fontsSansCO, SIGNAL(activated(int)),
1072 this, SLOT(sansChanged(int)));
1073 connect(fontModule->fontsTypewriterCO, SIGNAL(activated(int)),
1074 this, SLOT(change_adaptor()));
1075 connect(fontModule->fontsTypewriterCO, SIGNAL(activated(int)),
1076 this, SLOT(ttChanged(int)));
1077 connect(fontModule->fontsMathCO, SIGNAL(activated(int)),
1078 this, SLOT(change_adaptor()));
1079 connect(fontModule->fontsMathCO, SIGNAL(activated(int)),
1080 this, SLOT(mathFontChanged(int)));
1081 connect(fontModule->fontsDefaultCO, SIGNAL(activated(int)),
1082 this, SLOT(change_adaptor()));
1083 connect(fontModule->fontencCO, SIGNAL(activated(int)),
1084 this, SLOT(change_adaptor()));
1085 connect(fontModule->fontencCO, SIGNAL(activated(int)),
1086 this, SLOT(fontencChanged(int)));
1087 connect(fontModule->fontencLE, SIGNAL(textChanged(const QString &)),
1088 this, SLOT(change_adaptor()));
1089 connect(fontModule->fontsizeCO, SIGNAL(activated(int)),
1090 this, SLOT(change_adaptor()));
1091 connect(fontModule->cjkFontLE, SIGNAL(textChanged(const QString &)),
1092 this, SLOT(change_adaptor()));
1093 connect(fontModule->microtypeCB, SIGNAL(clicked()),
1094 this, SLOT(change_adaptor()));
1095 connect(fontModule->dashesCB, SIGNAL(clicked()),
1096 this, SLOT(change_adaptor()));
1097 connect(fontModule->scaleSansSB, SIGNAL(valueChanged(int)),
1098 this, SLOT(change_adaptor()));
1099 connect(fontModule->scaleTypewriterSB, SIGNAL(valueChanged(int)),
1100 this, SLOT(change_adaptor()));
1101 connect(fontModule->fontScCB, SIGNAL(clicked()),
1102 this, SLOT(change_adaptor()));
1103 connect(fontModule->fontScCB, SIGNAL(toggled(bool)),
1104 this, SLOT(fontScToggled(bool)));
1105 connect(fontModule->fontOsfCB, SIGNAL(clicked()),
1106 this, SLOT(change_adaptor()));
1107 connect(fontModule->fontOsfCB, SIGNAL(toggled(bool)),
1108 this, SLOT(fontOsfToggled(bool)));
1109 connect(fontModule->fontSansOsfCB, SIGNAL(clicked()),
1110 this, SLOT(change_adaptor()));
1111 connect(fontModule->fontTypewriterOsfCB, SIGNAL(clicked()),
1112 this, SLOT(change_adaptor()));
1113 connect(fontModule->fontspecRomanLE, SIGNAL(textChanged(const QString &)),
1114 this, SLOT(change_adaptor()));
1115 connect(fontModule->fontspecSansLE, SIGNAL(textChanged(const QString &)),
1116 this, SLOT(change_adaptor()));
1117 connect(fontModule->fontspecTypewriterLE, SIGNAL(textChanged(const QString &)),
1118 this, SLOT(change_adaptor()));
1120 fontModule->fontencLE->setValidator(new NoNewLineValidator(
1121 fontModule->fontencLE));
1122 fontModule->cjkFontLE->setValidator(new NoNewLineValidator(
1123 fontModule->cjkFontLE));
1124 fontModule->fontspecRomanLE->setValidator(new NoNewLineValidator(
1125 fontModule->fontspecRomanLE));
1126 fontModule->fontspecSansLE->setValidator(new NoNewLineValidator(
1127 fontModule->fontspecSansLE));
1128 fontModule->fontspecTypewriterLE->setValidator(new NoNewLineValidator(
1129 fontModule->fontspecTypewriterLE));
1133 fontModule->fontsizeCO->addItem(qt_("Default"));
1134 fontModule->fontsizeCO->addItem(qt_("10"));
1135 fontModule->fontsizeCO->addItem(qt_("11"));
1136 fontModule->fontsizeCO->addItem(qt_("12"));
1138 fontModule->fontencCO->addItem(qt_("Automatic[[encoding]]"), QString("auto"));
1139 fontModule->fontencCO->addItem(qt_("Class Default"), QString("default"));
1140 fontModule->fontencCO->addItem(qt_("Custom"), QString("custom"));
1142 for (int n = 0; GuiDocument::fontfamilies_gui[n][0]; ++n)
1143 fontModule->fontsDefaultCO->addItem(
1144 qt_(GuiDocument::fontfamilies_gui[n]));
1146 if (!LaTeXFeatures::isAvailable("fontspec"))
1147 fontModule->osFontsCB->setToolTip(
1148 qt_("Use OpenType and TrueType fonts directly (requires XeTeX or LuaTeX)\n"
1149 "You need to install the package \"fontspec\" to use this feature"));
1153 pageLayoutModule = new UiWidget<Ui::PageLayoutUi>(this);
1154 connect(pageLayoutModule->papersizeCO, SIGNAL(activated(int)),
1155 this, SLOT(papersizeChanged(int)));
1156 connect(pageLayoutModule->papersizeCO, SIGNAL(activated(int)),
1157 this, SLOT(papersizeChanged(int)));
1158 connect(pageLayoutModule->portraitRB, SIGNAL(clicked()),
1159 this, SLOT(change_adaptor()));
1160 connect(pageLayoutModule->papersizeCO, SIGNAL(activated(int)),
1161 this, SLOT(change_adaptor()));
1162 connect(pageLayoutModule->paperheightLE, SIGNAL(textChanged(const QString &)),
1163 this, SLOT(change_adaptor()));
1164 connect(pageLayoutModule->paperwidthLE, SIGNAL(textChanged(const QString &)),
1165 this, SLOT(change_adaptor()));
1166 connect(pageLayoutModule->paperwidthUnitCO, SIGNAL(activated(int)),
1167 this, SLOT(change_adaptor()));
1168 connect(pageLayoutModule->paperheightUnitCO, SIGNAL(activated(int)),
1169 this, SLOT(change_adaptor()));
1170 connect(pageLayoutModule->portraitRB, SIGNAL(clicked()),
1171 this, SLOT(change_adaptor()));
1172 connect(pageLayoutModule->landscapeRB, SIGNAL(clicked()),
1173 this, SLOT(change_adaptor()));
1174 connect(pageLayoutModule->facingPagesCB, SIGNAL(clicked()),
1175 this, SLOT(change_adaptor()));
1176 connect(pageLayoutModule->pagestyleCO, SIGNAL(activated(int)),
1177 this, SLOT(change_adaptor()));
1179 pageLayoutModule->pagestyleCO->addItem(qt_("Default"));
1180 pageLayoutModule->pagestyleCO->addItem(qt_("empty"));
1181 pageLayoutModule->pagestyleCO->addItem(qt_("plain"));
1182 pageLayoutModule->pagestyleCO->addItem(qt_("headings"));
1183 pageLayoutModule->pagestyleCO->addItem(qt_("fancy"));
1184 bc().addCheckedLineEdit(pageLayoutModule->paperheightLE,
1185 pageLayoutModule->paperheightL);
1186 bc().addCheckedLineEdit(pageLayoutModule->paperwidthLE,
1187 pageLayoutModule->paperwidthL);
1189 QComboBox * cb = pageLayoutModule->papersizeCO;
1190 cb->addItem(qt_("Default"));
1191 cb->addItem(qt_("Custom"));
1192 cb->addItem(qt_("US letter"));
1193 cb->addItem(qt_("US legal"));
1194 cb->addItem(qt_("US executive"));
1195 cb->addItem(qt_("A0"));
1196 cb->addItem(qt_("A1"));
1197 cb->addItem(qt_("A2"));
1198 cb->addItem(qt_("A3"));
1199 cb->addItem(qt_("A4"));
1200 cb->addItem(qt_("A5"));
1201 cb->addItem(qt_("A6"));
1202 cb->addItem(qt_("B0"));
1203 cb->addItem(qt_("B1"));
1204 cb->addItem(qt_("B2"));
1205 cb->addItem(qt_("B3"));
1206 cb->addItem(qt_("B4"));
1207 cb->addItem(qt_("B5"));
1208 cb->addItem(qt_("B6"));
1209 cb->addItem(qt_("C0"));
1210 cb->addItem(qt_("C1"));
1211 cb->addItem(qt_("C2"));
1212 cb->addItem(qt_("C3"));
1213 cb->addItem(qt_("C4"));
1214 cb->addItem(qt_("C5"));
1215 cb->addItem(qt_("C6"));
1216 cb->addItem(qt_("JIS B0"));
1217 cb->addItem(qt_("JIS B1"));
1218 cb->addItem(qt_("JIS B2"));
1219 cb->addItem(qt_("JIS B3"));
1220 cb->addItem(qt_("JIS B4"));
1221 cb->addItem(qt_("JIS B5"));
1222 cb->addItem(qt_("JIS B6"));
1223 // remove the %-items from the unit choice
1224 pageLayoutModule->paperwidthUnitCO->noPercents();
1225 pageLayoutModule->paperheightUnitCO->noPercents();
1226 pageLayoutModule->paperheightLE->setValidator(unsignedLengthValidator(
1227 pageLayoutModule->paperheightLE));
1228 pageLayoutModule->paperwidthLE->setValidator(unsignedLengthValidator(
1229 pageLayoutModule->paperwidthLE));
1233 marginsModule = new UiWidget<Ui::MarginsUi>(this);
1234 connect(marginsModule->marginCB, SIGNAL(toggled(bool)),
1235 this, SLOT(setCustomMargins(bool)));
1236 connect(marginsModule->marginCB, SIGNAL(clicked()),
1237 this, SLOT(change_adaptor()));
1238 connect(marginsModule->topLE, SIGNAL(textChanged(QString)),
1239 this, SLOT(change_adaptor()));
1240 connect(marginsModule->topUnit, SIGNAL(activated(int)),
1241 this, SLOT(change_adaptor()));
1242 connect(marginsModule->bottomLE, SIGNAL(textChanged(QString)),
1243 this, SLOT(change_adaptor()));
1244 connect(marginsModule->bottomUnit, SIGNAL(activated(int)),
1245 this, SLOT(change_adaptor()));
1246 connect(marginsModule->innerLE, SIGNAL(textChanged(QString)),
1247 this, SLOT(change_adaptor()));
1248 connect(marginsModule->innerUnit, SIGNAL(activated(int)),
1249 this, SLOT(change_adaptor()));
1250 connect(marginsModule->outerLE, SIGNAL(textChanged(QString)),
1251 this, SLOT(change_adaptor()));
1252 connect(marginsModule->outerUnit, SIGNAL(activated(int)),
1253 this, SLOT(change_adaptor()));
1254 connect(marginsModule->headheightLE, SIGNAL(textChanged(QString)),
1255 this, SLOT(change_adaptor()));
1256 connect(marginsModule->headheightUnit, SIGNAL(activated(int)),
1257 this, SLOT(change_adaptor()));
1258 connect(marginsModule->headsepLE, SIGNAL(textChanged(QString)),
1259 this, SLOT(change_adaptor()));
1260 connect(marginsModule->headsepUnit, SIGNAL(activated(int)),
1261 this, SLOT(change_adaptor()));
1262 connect(marginsModule->footskipLE, SIGNAL(textChanged(QString)),
1263 this, SLOT(change_adaptor()));
1264 connect(marginsModule->footskipUnit, SIGNAL(activated(int)),
1265 this, SLOT(change_adaptor()));
1266 connect(marginsModule->columnsepLE, SIGNAL(textChanged(QString)),
1267 this, SLOT(change_adaptor()));
1268 connect(marginsModule->columnsepUnit, SIGNAL(activated(int)),
1269 this, SLOT(change_adaptor()));
1270 marginsModule->topLE->setValidator(new LengthValidator(
1271 marginsModule->topLE));
1272 marginsModule->bottomLE->setValidator(new LengthValidator(
1273 marginsModule->bottomLE));
1274 marginsModule->innerLE->setValidator(new LengthValidator(
1275 marginsModule->innerLE));
1276 marginsModule->outerLE->setValidator(new LengthValidator(
1277 marginsModule->outerLE));
1278 marginsModule->headsepLE->setValidator(new LengthValidator(
1279 marginsModule->headsepLE));
1280 marginsModule->headheightLE->setValidator(new LengthValidator(
1281 marginsModule->headheightLE));
1282 marginsModule->footskipLE->setValidator(new LengthValidator(
1283 marginsModule->footskipLE));
1284 marginsModule->columnsepLE->setValidator(new LengthValidator(
1285 marginsModule->columnsepLE));
1287 bc().addCheckedLineEdit(marginsModule->topLE,
1288 marginsModule->topL);
1289 bc().addCheckedLineEdit(marginsModule->bottomLE,
1290 marginsModule->bottomL);
1291 bc().addCheckedLineEdit(marginsModule->innerLE,
1292 marginsModule->innerL);
1293 bc().addCheckedLineEdit(marginsModule->outerLE,
1294 marginsModule->outerL);
1295 bc().addCheckedLineEdit(marginsModule->headsepLE,
1296 marginsModule->headsepL);
1297 bc().addCheckedLineEdit(marginsModule->headheightLE,
1298 marginsModule->headheightL);
1299 bc().addCheckedLineEdit(marginsModule->footskipLE,
1300 marginsModule->footskipL);
1301 bc().addCheckedLineEdit(marginsModule->columnsepLE,
1302 marginsModule->columnsepL);
1306 colorModule = new UiWidget<Ui::ColorUi>(this);
1307 connect(colorModule->fontColorPB, SIGNAL(clicked()),
1308 this, SLOT(changeFontColor()));
1309 connect(colorModule->delFontColorTB, SIGNAL(clicked()),
1310 this, SLOT(deleteFontColor()));
1311 connect(colorModule->noteFontColorPB, SIGNAL(clicked()),
1312 this, SLOT(changeNoteFontColor()));
1313 connect(colorModule->delNoteFontColorTB, SIGNAL(clicked()),
1314 this, SLOT(deleteNoteFontColor()));
1315 connect(colorModule->backgroundPB, SIGNAL(clicked()),
1316 this, SLOT(changeBackgroundColor()));
1317 connect(colorModule->delBackgroundTB, SIGNAL(clicked()),
1318 this, SLOT(deleteBackgroundColor()));
1319 connect(colorModule->boxBackgroundPB, SIGNAL(clicked()),
1320 this, SLOT(changeBoxBackgroundColor()));
1321 connect(colorModule->delBoxBackgroundTB, SIGNAL(clicked()),
1322 this, SLOT(deleteBoxBackgroundColor()));
1326 changesModule = new UiWidget<Ui::ChangeTrackingUi>(this);
1327 connect(changesModule->trackChangesCB, SIGNAL(clicked()),
1328 this, SLOT(change_adaptor()));
1329 connect(changesModule->outputChangesCB, SIGNAL(toggled(bool)),
1330 this, SLOT(outputChangesToggled(bool)));
1331 connect(changesModule->changeBarsCB, SIGNAL(clicked()),
1332 this, SLOT(change_adaptor()));
1336 numberingModule = new UiWidget<Ui::NumberingUi>(this);
1337 connect(numberingModule->depthSL, SIGNAL(valueChanged(int)),
1338 this, SLOT(change_adaptor()));
1339 connect(numberingModule->tocSL, SIGNAL(valueChanged(int)),
1340 this, SLOT(change_adaptor()));
1341 connect(numberingModule->depthSL, SIGNAL(valueChanged(int)),
1342 this, SLOT(updateNumbering()));
1343 connect(numberingModule->tocSL, SIGNAL(valueChanged(int)),
1344 this, SLOT(updateNumbering()));
1345 numberingModule->tocTW->setColumnCount(3);
1346 numberingModule->tocTW->headerItem()->setText(0, qt_("Example"));
1347 numberingModule->tocTW->headerItem()->setText(1, qt_("Numbered"));
1348 numberingModule->tocTW->headerItem()->setText(2, qt_("Appears in TOC"));
1349 numberingModule->tocTW->header()->setSectionResizeMode(QHeaderView::ResizeToContents);
1350 connect(numberingModule->linenoCB, SIGNAL(toggled(bool)),
1351 this, SLOT(linenoToggled(bool)));
1352 connect(numberingModule->linenoCB, SIGNAL(clicked()),
1353 this, SLOT(change_adaptor()));
1354 connect(numberingModule->linenoLE, SIGNAL(textChanged(QString)),
1355 this, SLOT(change_adaptor()));
1359 biblioModule = new UiWidget<Ui::BiblioUi>(this);
1360 connect(biblioModule->citeEngineCO, SIGNAL(activated(int)),
1361 this, SLOT(citeEngineChanged(int)));
1362 connect(biblioModule->citeStyleCO, SIGNAL(activated(int)),
1363 this, SLOT(citeStyleChanged()));
1364 connect(biblioModule->bibtopicCB, SIGNAL(clicked()),
1365 this, SLOT(biblioChanged()));
1366 connect(biblioModule->bibunitsCO, SIGNAL(activated(int)),
1367 this, SLOT(biblioChanged()));
1368 connect(biblioModule->bibtexCO, SIGNAL(activated(int)),
1369 this, SLOT(bibtexChanged(int)));
1370 connect(biblioModule->bibtexOptionsLE, SIGNAL(textChanged(QString)),
1371 this, SLOT(biblioChanged()));
1372 connect(biblioModule->citePackageOptionsLE, SIGNAL(textChanged(QString)),
1373 this, SLOT(biblioChanged()));
1374 connect(biblioModule->defaultBiblioCO, SIGNAL(activated(int)),
1375 this, SLOT(biblioChanged()));
1376 connect(biblioModule->defaultBiblioCO, SIGNAL(editTextChanged(QString)),
1377 this, SLOT(biblioChanged()));
1378 connect(biblioModule->defaultBiblioCO, SIGNAL(editTextChanged(QString)),
1379 this, SLOT(updateResetDefaultBiblio()));
1380 connect(biblioModule->biblatexBbxCO, SIGNAL(activated(int)),
1381 this, SLOT(biblioChanged()));
1382 connect(biblioModule->biblatexBbxCO, SIGNAL(editTextChanged(QString)),
1383 this, SLOT(biblioChanged()));
1384 connect(biblioModule->biblatexBbxCO, SIGNAL(editTextChanged(QString)),
1385 this, SLOT(updateResetDefaultBiblio()));
1386 connect(biblioModule->biblatexCbxCO, SIGNAL(activated(int)),
1387 this, SLOT(biblioChanged()));
1388 connect(biblioModule->biblatexCbxCO, SIGNAL(editTextChanged(QString)),
1389 this, SLOT(biblioChanged()));
1390 connect(biblioModule->biblatexCbxCO, SIGNAL(editTextChanged(QString)),
1391 this, SLOT(updateResetDefaultBiblio()));
1392 connect(biblioModule->rescanBibliosPB, SIGNAL(clicked()),
1393 this, SLOT(rescanBibFiles()));
1394 connect(biblioModule->resetDefaultBiblioPB, SIGNAL(clicked()),
1395 this, SLOT(resetDefaultBibfile()));
1396 connect(biblioModule->resetCbxPB, SIGNAL(clicked()),
1397 this, SLOT(resetDefaultCbxBibfile()));
1398 connect(biblioModule->resetBbxPB, SIGNAL(clicked()),
1399 this, SLOT(resetDefaultBbxBibfile()));
1400 connect(biblioModule->matchBbxPB, SIGNAL(clicked()),
1401 this, SLOT(matchBiblatexStyles()));
1403 biblioModule->citeEngineCO->clear();
1404 for (LyXCiteEngine const & cet : theCiteEnginesList) {
1405 biblioModule->citeEngineCO->addItem(qt_(cet.getName()), toqstr(cet.getID()));
1406 int const i = biblioModule->citeEngineCO->findData(toqstr(cet.getID()));
1407 biblioModule->citeEngineCO->setItemData(i, qt_(cet.getDescription()),
1411 biblioModule->bibtexOptionsLE->setValidator(new NoNewLineValidator(
1412 biblioModule->bibtexOptionsLE));
1413 biblioModule->defaultBiblioCO->lineEdit()->setValidator(new NoNewLineValidator(
1414 biblioModule->defaultBiblioCO->lineEdit()));
1415 biblioModule->citePackageOptionsLE->setValidator(new NoNewLineValidator(
1416 biblioModule->citePackageOptionsLE));
1418 // NOTE: we do not provide "custom" here for security reasons!
1419 biblioModule->bibtexCO->clear();
1420 biblioModule->bibtexCO->addItem(qt_("Default"), QString("default"));
1421 for (auto const & alts : lyxrc.bibtex_alternatives) {
1422 QString const command = toqstr(alts).left(toqstr(alts).indexOf(" "));
1423 biblioModule->bibtexCO->addItem(command, command);
1428 indicesModule = new GuiIndices;
1429 connect(indicesModule, SIGNAL(changed()),
1430 this, SLOT(change_adaptor()));
1434 mathsModule = new UiWidget<Ui::MathsUi>(this);
1435 QStringList headers;
1436 headers << qt_("Package") << qt_("Load automatically")
1437 << qt_("Load always") << qt_("Do not load");
1438 mathsModule->packagesTW->setHorizontalHeaderLabels(headers);
1439 mathsModule->packagesTW->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
1440 map<string, string> const & packages = BufferParams::auto_packages();
1441 mathsModule->packagesTW->setRowCount(packages.size());
1443 for (auto const & pkgvar : packages) {
1444 docstring const package = from_ascii(pkgvar.first);
1445 QString autoTooltip = qt_(pkgvar.second);
1446 QString alwaysTooltip;
1447 if (package == "amsmath")
1449 qt_("The AMS LaTeX packages are always used");
1451 alwaysTooltip = toqstr(bformat(
1452 _("The LaTeX package %1$s is always used"),
1454 QString neverTooltip;
1455 if (package == "amsmath")
1457 qt_("The AMS LaTeX packages are never used");
1459 neverTooltip = toqstr(bformat(
1460 _("The LaTeX package %1$s is never used"),
1462 QRadioButton * autoRB = new QRadioButton(mathsModule);
1463 QRadioButton * alwaysRB = new QRadioButton(mathsModule);
1464 QRadioButton * neverRB = new QRadioButton(mathsModule);
1465 QButtonGroup * packageGroup = new QButtonGroup(mathsModule);
1466 packageGroup->addButton(autoRB);
1467 packageGroup->addButton(alwaysRB);
1468 packageGroup->addButton(neverRB);
1469 autoRB->setToolTip(autoTooltip);
1470 alwaysRB->setToolTip(alwaysTooltip);
1471 neverRB->setToolTip(neverTooltip);
1473 // Pack the buttons in a layout in order to get proper alignment
1474 QWidget * autoRBWidget = new QWidget();
1475 QHBoxLayout * autoRBLayout = new QHBoxLayout(autoRBWidget);
1476 autoRBLayout->addWidget(autoRB);
1477 autoRBLayout->setAlignment(Qt::AlignCenter);
1478 autoRBLayout->setContentsMargins(0, 0, 0, 0);
1479 autoRBWidget->setLayout(autoRBLayout);
1481 QWidget * alwaysRBWidget = new QWidget();
1482 QHBoxLayout * alwaysRBLayout = new QHBoxLayout(alwaysRBWidget);
1483 alwaysRBLayout->addWidget(alwaysRB);
1484 alwaysRBLayout->setAlignment(Qt::AlignCenter);
1485 alwaysRBLayout->setContentsMargins(0, 0, 0, 0);
1486 alwaysRBWidget->setLayout(alwaysRBLayout);
1488 QWidget * neverRBWidget = new QWidget();
1489 QHBoxLayout * neverRBLayout = new QHBoxLayout(neverRBWidget);
1490 neverRBLayout->addWidget(neverRB);
1491 neverRBLayout->setAlignment(Qt::AlignCenter);
1492 neverRBLayout->setContentsMargins(0, 0, 0, 0);
1493 neverRBWidget->setLayout(neverRBLayout);
1495 QTableWidgetItem * pack = new QTableWidgetItem(toqstr(package));
1496 mathsModule->packagesTW->setItem(packnum, 0, pack);
1497 mathsModule->packagesTW->setCellWidget(packnum, 1, autoRBWidget);
1498 mathsModule->packagesTW->setCellWidget(packnum, 2, alwaysRBWidget);
1499 mathsModule->packagesTW->setCellWidget(packnum, 3, neverRBWidget);
1501 connect(autoRB, SIGNAL(clicked()),
1502 this, SLOT(change_adaptor()));
1503 connect(alwaysRB, SIGNAL(clicked()),
1504 this, SLOT(change_adaptor()));
1505 connect(neverRB, SIGNAL(clicked()),
1506 this, SLOT(change_adaptor()));
1509 connect(mathsModule->allPackagesAutoPB, SIGNAL(clicked()),
1510 this, SLOT(allPackagesAuto()));
1511 connect(mathsModule->allPackagesAlwaysPB, SIGNAL(clicked()),
1512 this, SLOT(allPackagesAlways()));
1513 connect(mathsModule->allPackagesNotPB, SIGNAL(clicked()),
1514 this, SLOT(allPackagesNot()));
1515 connect(mathsModule->allPackagesAutoPB, SIGNAL(clicked()),
1516 this, SLOT(change_adaptor()));
1517 connect(mathsModule->allPackagesAlwaysPB, SIGNAL(clicked()),
1518 this, SLOT(change_adaptor()));
1519 connect(mathsModule->allPackagesNotPB, SIGNAL(clicked()),
1520 this, SLOT(change_adaptor()));
1521 connect(mathsModule->MathNumberingPosCO, SIGNAL(activated(int)),
1522 this, SLOT(change_adaptor()));
1524 connect(mathsModule->MathIndentCB, SIGNAL(toggled(bool)),
1525 this, SLOT(change_adaptor()));
1526 connect(mathsModule->MathIndentCB, SIGNAL(toggled(bool)),
1527 this, SLOT(allowMathIndent()));
1528 connect(mathsModule->MathIndentCO, SIGNAL(activated(int)),
1529 this, SLOT(change_adaptor()));
1530 connect(mathsModule->MathIndentCO, SIGNAL(activated(int)),
1531 this, SLOT(enableMathIndent(int)));
1532 connect(mathsModule->MathIndentLE, SIGNAL(textChanged(const QString &)),
1533 this, SLOT(change_adaptor()));
1534 connect(mathsModule->MathIndentLengthCO, SIGNAL(activated(int)),
1535 this, SLOT(change_adaptor()));
1538 mathsModule->MathIndentCO->addItem(qt_("Default"), toqstr("default"));
1539 mathsModule->MathIndentCO->addItem(qt_("Custom"), toqstr("custom"));
1540 mathsModule->MathIndentLE->setValidator(new LengthValidator(
1541 mathsModule->MathIndentLE));
1542 // initialize the length validator
1543 bc().addCheckedLineEdit(mathsModule->MathIndentLE);
1544 mathsModule->MathNumberingPosCO->addItem(qt_("Left"));
1545 mathsModule->MathNumberingPosCO->addItem(qt_("Default"));
1546 mathsModule->MathNumberingPosCO->addItem(qt_("Right"));
1547 mathsModule->MathNumberingPosCO->setCurrentIndex(1);
1551 latexModule = new UiWidget<Ui::LaTeXUi>(this);
1552 connect(latexModule->optionsLE, SIGNAL(textChanged(QString)),
1553 this, SLOT(change_adaptor()));
1554 connect(latexModule->defaultOptionsCB, SIGNAL(clicked()),
1555 this, SLOT(change_adaptor()));
1556 connect(latexModule->psdriverCO, SIGNAL(activated(int)),
1557 this, SLOT(change_adaptor()));
1558 connect(latexModule->classCO, SIGNAL(activated(int)),
1559 this, SLOT(classChanged_adaptor()));
1560 connect(latexModule->classCO, SIGNAL(activated(int)),
1561 this, SLOT(change_adaptor()));
1562 connect(latexModule->layoutPB, SIGNAL(clicked()),
1563 this, SLOT(browseLayout()));
1564 connect(latexModule->layoutPB, SIGNAL(clicked()),
1565 this, SLOT(change_adaptor()));
1566 connect(latexModule->childDocGB, SIGNAL(clicked()),
1567 this, SLOT(change_adaptor()));
1568 connect(latexModule->childDocLE, SIGNAL(textChanged(QString)),
1569 this, SLOT(change_adaptor()));
1570 connect(latexModule->childDocPB, SIGNAL(clicked()),
1571 this, SLOT(browseMaster()));
1572 connect(latexModule->suppressDateCB, SIGNAL(clicked()),
1573 this, SLOT(change_adaptor()));
1574 connect(latexModule->refstyleCB, SIGNAL(clicked()),
1575 this, SLOT(change_adaptor()));
1577 latexModule->optionsLE->setValidator(new NoNewLineValidator(
1578 latexModule->optionsLE));
1579 latexModule->childDocLE->setValidator(new NoNewLineValidator(
1580 latexModule->childDocLE));
1582 // postscript drivers
1583 for (int n = 0; tex_graphics[n][0]; ++n) {
1584 QString enc = qt_(tex_graphics_gui[n]);
1585 latexModule->psdriverCO->addItem(enc);
1588 LayoutFileList const & bcl = LayoutFileList::get();
1589 vector<LayoutFileIndex> classList = bcl.classList();
1590 sort(classList.begin(), classList.end(), less_textclass_avail_desc());
1592 for (auto const & cvar : classList) {
1593 LayoutFile const & tc = bcl[cvar];
1594 bool const available = tc.isTeXClassAvailable();
1595 docstring const guiname = translateIfPossible(from_utf8(tc.description()));
1596 // tooltip sensu "KOMA-Script Article [Class 'scrartcl']"
1597 QString tooltip = toqstr(bformat(_("%1$s [Class '%2$s']"), guiname, from_utf8(tc.latexname())));
1599 docstring const output_type = _("LaTeX");
1600 tooltip += '\n' + toqstr(bformat(_("Class not found by LyX. "
1601 "Please check if you have the matching %1$s class "
1602 "and all required packages (%2$s) installed."),
1603 output_type, from_utf8(tc.prerequisites(", "))));
1605 latexModule->classCO->addItemSort(toqstr(tc.name()),
1607 toqstr(translateIfPossible(from_utf8(tc.category()))),
1609 true, true, true, available);
1614 branchesModule = new GuiBranches(this);
1615 connect(branchesModule, SIGNAL(changed()),
1616 this, SLOT(change_adaptor()));
1617 connect(branchesModule, SIGNAL(renameBranches(docstring const &, docstring const &)),
1618 this, SLOT(branchesRename(docstring const &, docstring const &)));
1619 connect(branchesModule, SIGNAL(okPressed()), this, SLOT(slotOK()));
1620 updateUnknownBranches();
1624 preambleModule = new PreambleModule(this);
1625 connect(preambleModule, SIGNAL(changed()),
1626 this, SLOT(change_adaptor()));
1628 localLayout = new LocalLayout(this);
1629 connect(localLayout, SIGNAL(changed()),
1630 this, SLOT(change_adaptor()));
1634 bulletsModule = new BulletsModule(this);
1635 connect(bulletsModule, SIGNAL(changed()),
1636 this, SLOT(change_adaptor()));
1640 modulesModule = new UiWidget<Ui::ModulesUi>(this);
1641 modulesModule->availableLV->header()->setVisible(false);
1642 modulesModule->availableLV->header()->setSectionResizeMode(QHeaderView::ResizeToContents);
1643 modulesModule->availableLV->header()->setStretchLastSection(false);
1644 modulesModule->selectedLV->header()->setVisible(false);
1645 modulesModule->selectedLV->header()->setSectionResizeMode(QHeaderView::ResizeToContents);
1646 modulesModule->selectedLV->header()->setStretchLastSection(false);
1648 new ModuleSelectionManager(this, modulesModule->availableLV,
1649 modulesModule->selectedLV,
1650 modulesModule->addPB,
1651 modulesModule->deletePB,
1652 modulesModule->upPB,
1653 modulesModule->downPB,
1654 availableModel(), selectedModel(), this);
1655 connect(selectionManager, SIGNAL(updateHook()),
1656 this, SLOT(updateModuleInfo()));
1657 connect(selectionManager, SIGNAL(selectionChanged()),
1658 this, SLOT(modulesChanged()));
1660 filter_ = new FancyLineEdit(this);
1661 filter_->setClearButton(true);
1662 filter_->setPlaceholderText(qt_("All avail. modules"));
1663 modulesModule->moduleFilterBarL->addWidget(filter_, 0);
1664 modulesModule->findModulesLA->setBuddy(filter_);
1666 connect(filter_, SIGNAL(rightButtonClicked()),
1667 this, SLOT(resetModuleFilter()));
1668 connect(filter_, SIGNAL(textEdited(QString)),
1669 this, SLOT(moduleFilterChanged(QString)));
1670 connect(filter_, SIGNAL(returnPressed()),
1671 this, SLOT(moduleFilterPressed()));
1672 connect(filter_, &FancyLineEdit::downPressed,
1673 modulesModule->availableLV, [this](){ focusAndHighlight(modulesModule->availableLV); });
1677 pdfSupportModule = new UiWidget<Ui::PDFSupportUi>(this);
1678 connect(pdfSupportModule->use_hyperrefGB, SIGNAL(toggled(bool)),
1679 this, SLOT(change_adaptor()));
1680 connect(pdfSupportModule->titleLE, SIGNAL(textChanged(QString)),
1681 this, SLOT(change_adaptor()));
1682 connect(pdfSupportModule->authorLE, SIGNAL(textChanged(QString)),
1683 this, SLOT(change_adaptor()));
1684 connect(pdfSupportModule->subjectLE, SIGNAL(textChanged(QString)),
1685 this, SLOT(change_adaptor()));
1686 connect(pdfSupportModule->keywordsLE, SIGNAL(textChanged(QString)),
1687 this, SLOT(change_adaptor()));
1688 connect(pdfSupportModule->bookmarksGB, SIGNAL(toggled(bool)),
1689 this, SLOT(change_adaptor()));
1690 connect(pdfSupportModule->bookmarksnumberedCB, SIGNAL(toggled(bool)),
1691 this, SLOT(change_adaptor()));
1692 connect(pdfSupportModule->bookmarksopenGB, SIGNAL(toggled(bool)),
1693 this, SLOT(change_adaptor()));
1694 connect(pdfSupportModule->bookmarksopenGB, SIGNAL(toggled(bool)),
1695 this, SLOT(bookmarksopenChanged(bool)));
1696 connect(pdfSupportModule->bookmarksopenlevelSB, SIGNAL(valueChanged(int)),
1697 this, SLOT(change_adaptor()));
1698 connect(pdfSupportModule->breaklinksCB, SIGNAL(toggled(bool)),
1699 this, SLOT(change_adaptor()));
1700 connect(pdfSupportModule->pdfborderCB, SIGNAL(toggled(bool)),
1701 this, SLOT(change_adaptor()));
1702 connect(pdfSupportModule->colorlinksCB, SIGNAL(toggled(bool)),
1703 this, SLOT(change_adaptor()));
1704 connect(pdfSupportModule->backrefCO, SIGNAL(activated(int)),
1705 this, SLOT(change_adaptor()));
1706 connect(pdfSupportModule->pdfusetitleCB, SIGNAL(toggled(bool)),
1707 this, SLOT(change_adaptor()));
1708 connect(pdfSupportModule->fullscreenCB, SIGNAL(toggled(bool)),
1709 this, SLOT(change_adaptor()));
1710 connect(pdfSupportModule->optionsTE, SIGNAL(textChanged()),
1711 this, SLOT(change_adaptor()));
1712 connect(pdfSupportModule->metadataTE, SIGNAL(textChanged()),
1713 this, SLOT(change_adaptor()));
1715 pdfSupportModule->titleLE->setValidator(new NoNewLineValidator(
1716 pdfSupportModule->titleLE));
1717 pdfSupportModule->authorLE->setValidator(new NoNewLineValidator(
1718 pdfSupportModule->authorLE));
1719 pdfSupportModule->subjectLE->setValidator(new NoNewLineValidator(
1720 pdfSupportModule->subjectLE));
1721 pdfSupportModule->keywordsLE->setValidator(new NoNewLineValidator(
1722 pdfSupportModule->keywordsLE));
1723 (void) new LaTeXHighlighter(pdfSupportModule->optionsTE->document(), true, true);
1724 (void) new LaTeXHighlighter(pdfSupportModule->metadataTE->document(), true, true);
1726 for (int i = 0; backref_opts[i][0]; ++i)
1727 pdfSupportModule->backrefCO->addItem(qt_(backref_opts_gui[i]));
1731 floatModule = new FloatPlacement;
1732 connect(floatModule, SIGNAL(changed()),
1733 this, SLOT(change_adaptor()));
1737 listingsModule = new UiWidget<Ui::ListingsSettingsUi>(this);
1738 connect(listingsModule->listingsED, SIGNAL(textChanged()),
1739 this, SLOT(change_adaptor()));
1740 connect(listingsModule->bypassCB, SIGNAL(clicked()),
1741 this, SLOT(change_adaptor()));
1742 connect(listingsModule->bypassCB, SIGNAL(clicked()),
1743 this, SLOT(setListingsMessage()));
1744 connect(listingsModule->packageCO, SIGNAL(activated(int)),
1745 this, SLOT(change_adaptor()));
1746 connect(listingsModule->packageCO, SIGNAL(activated(int)),
1747 this, SLOT(listingsPackageChanged(int)));
1748 connect(listingsModule->listingsED, SIGNAL(textChanged()),
1749 this, SLOT(setListingsMessage()));
1750 listingsModule->listingsTB->setPlainText(
1751 qt_("Input listings parameters below. Enter ? for a list of parameters."));
1753 for (int i = 0; lst_packages[i][0]; ++i)
1754 listingsModule->packageCO->addItem(lst_packages[i]);
1758 docPS->addPanel(latexModule, N_("Document Class"));
1759 docPS->addPanel(masterChildModule, N_("Child Documents"));
1760 docPS->addPanel(modulesModule, N_("Modules"));
1761 docPS->addPanel(localLayout, N_("Local Layout"));
1762 docPS->addPanel(fontModule, N_("Fonts"));
1763 docPS->addPanel(textLayoutModule, N_("Text Layout"));
1764 docPS->addPanel(pageLayoutModule, N_("Page Layout"));
1765 docPS->addPanel(marginsModule, N_("Page Margins"));
1766 docPS->addPanel(langModule, N_("Language"));
1767 docPS->addPanel(colorModule, N_("Colors"));
1768 docPS->addPanel(changesModule, N_("Change Tracking"));
1769 docPS->addPanel(numberingModule, N_("Numbering & TOC"));
1770 docPS->addPanel(biblioModule, N_("Bibliography"));
1771 docPS->addPanel(indicesModule, N_("Indexes"));
1772 docPS->addPanel(pdfSupportModule, N_("PDF Properties"));
1773 docPS->addPanel(mathsModule, N_("Math Options"));
1774 docPS->addPanel(floatModule, N_("Float Settings"));
1775 docPS->addPanel(listingsModule, N_("Listings[[inset]]"));
1776 docPS->addPanel(bulletsModule, N_("Bullets"));
1777 docPS->addPanel(branchesModule, N_("Branches"));
1778 docPS->addPanel(outputModule, N_("Formats[[output]]"));
1779 docPS->addPanel(preambleModule, N_("LaTeX Preamble"));
1780 docPS->setCurrentPanel("Document Class");
1784 void GuiDocument::onBufferViewChanged()
1786 if (isVisibleView())
1787 initialiseParams("");
1791 void GuiDocument::saveDefaultClicked()
1797 void GuiDocument::useDefaultsClicked()
1803 void GuiDocument::change_adaptor()
1805 nonModuleChanged_ = true;
1810 void GuiDocument::shellescapeChanged()
1812 shellescapeChanged_ = true;
1816 void GuiDocument::bookmarksopenChanged(bool state)
1818 pdfSupportModule->bookmarksopenlevelSB->setEnabled(state);
1819 pdfSupportModule->bookmarksopenlevelLA->setEnabled(state);
1823 void GuiDocument::slotApply()
1825 bool only_shellescape_changed = !nonModuleChanged_ && !modulesChanged_;
1826 bool wasclean = buffer().isClean();
1827 GuiDialog::slotApply();
1828 if (wasclean && only_shellescape_changed)
1829 buffer().markClean();
1830 modulesChanged_ = false;
1834 void GuiDocument::slotOK()
1836 bool only_shellescape_changed = !nonModuleChanged_ && !modulesChanged_;
1837 bool wasclean = buffer().isClean();
1838 GuiDialog::slotOK();
1839 if (wasclean && only_shellescape_changed)
1840 buffer().markClean();
1841 modulesChanged_ = false;
1845 void GuiDocument::slotButtonBox(QAbstractButton * button)
1847 switch (buttonBox->standardButton(button)) {
1848 case QDialogButtonBox::Ok:
1851 case QDialogButtonBox::Apply:
1854 case QDialogButtonBox::Cancel:
1857 case QDialogButtonBox::Reset:
1858 case QDialogButtonBox::RestoreDefaults:
1867 void GuiDocument::filterModules(QString const & str)
1869 updateAvailableModules();
1873 modules_av_model_.clear();
1874 list<modInfoStruct> modInfoList = getModuleInfo();
1875 // Sort names according to the locale
1876 modInfoList.sort([](modInfoStruct const & a, modInfoStruct const & b) {
1877 return 0 < b.name.localeAwareCompare(a.name);
1880 QIcon user_icon(getPixmap("images/", "lyxfiles-user", "svgz,png"));
1881 QIcon system_icon(getPixmap("images/", "lyxfiles-system", "svgz,png"));
1884 for (modInfoStruct const & m : modInfoList) {
1885 if (m.name.contains(str, Qt::CaseInsensitive) || contains(m.id, fromqstr(str))) {
1886 QStandardItem * item = new QStandardItem();
1887 item->setData(m.name, Qt::DisplayRole);
1888 item->setData(toqstr(m.id), Qt::UserRole);
1889 item->setData(m.description, Qt::ToolTipRole);
1890 item->setEditable(false);
1892 item->setIcon(user_icon);
1894 item->setIcon(system_icon);
1895 modules_av_model_.insertRow(i, item);
1902 void GuiDocument::moduleFilterChanged(const QString & text)
1904 if (!text.isEmpty()) {
1905 filterModules(filter_->text());
1908 filterModules(filter_->text());
1909 filter_->setFocus();
1913 void GuiDocument::moduleFilterPressed()
1915 filterModules(filter_->text());
1919 void GuiDocument::resetModuleFilter()
1921 filter_->setText(QString());
1922 filterModules(filter_->text());
1926 void GuiDocument::includeonlyClicked(QTreeWidgetItem * item, int)
1928 if (item == nullptr)
1931 string child = fromqstr(item->text(0));
1935 if (std::find(includeonlys_.begin(),
1936 includeonlys_.end(), child) != includeonlys_.end())
1937 includeonlys_.remove(child);
1939 includeonlys_.push_back(child);
1941 updateIncludeonlys();
1946 QString GuiDocument::validateListingsParameters()
1948 if (listingsModule->bypassCB->isChecked())
1950 string const package =
1951 lst_packages[listingsModule->packageCO->currentIndex()];
1952 string params = fromqstr(listingsModule->listingsED->toPlainText());
1953 InsetListingsParams lstparams(params);
1954 lstparams.setMinted(package == "Minted");
1955 return toqstr(lstparams.validate());
1959 void GuiDocument::setListingsMessage()
1962 static bool isOK = true;
1963 QString msg = validateListingsParameters();
1964 if (msg.isEmpty()) {
1968 // listingsModule->listingsTB->setTextColor("black");
1969 listingsModule->listingsTB->setPlainText(
1970 qt_("Input listings parameters below. "
1971 "Enter ? for a list of parameters."));
1974 // listingsModule->listingsTB->setTextColor("red");
1975 listingsModule->listingsTB->setPlainText(msg);
1980 void GuiDocument::listingsPackageChanged(int index)
1982 string const package = lst_packages[index];
1983 if (package == "Minted" && lyxrc.pygmentize_command.empty()) {
1984 Alert::warning(_("Pygments driver command not found!"),
1985 _("The driver command necessary to use the minted package\n"
1986 "(pygmentize) has not been found. Make sure you have\n"
1987 "the python-pygments module installed or, if the driver\n"
1988 "is named differently, to add the following line to the\n"
1989 "document preamble:\n\n"
1990 "\\AtBeginDocument{\\renewcommand{\\MintedPygmentize}{driver}}\n\n"
1991 "where 'driver' is name of the driver command."));
1996 void GuiDocument::setLSpacing(int item)
1998 textLayoutModule->lspacingLE->setEnabled(item == 3);
2002 void GuiDocument::setIndent(int item)
2004 bool const enable = (textLayoutModule->indentCO->itemData(item) == "custom");
2005 textLayoutModule->indentLE->setEnabled(enable);
2006 textLayoutModule->indentLengthCO->setEnabled(enable);
2007 textLayoutModule->skipLE->setEnabled(false);
2008 textLayoutModule->skipLengthCO->setEnabled(false);
2013 void GuiDocument::enableIndent(bool indent)
2015 textLayoutModule->skipLE->setEnabled(!indent);
2016 textLayoutModule->skipLengthCO->setEnabled(!indent);
2018 setIndent(textLayoutModule->indentCO->currentIndex());
2022 void GuiDocument::setSkip(int item)
2024 VSpace::VSpaceKind kind =
2025 VSpace::VSpaceKind(textLayoutModule->skipCO->itemData(item).toInt());
2026 bool const enable = (kind == VSpace::LENGTH);
2027 textLayoutModule->skipLE->setEnabled(enable);
2028 textLayoutModule->skipLengthCO->setEnabled(enable);
2033 void GuiDocument::enableSkip(bool skip)
2035 textLayoutModule->indentLE->setEnabled(!skip);
2036 textLayoutModule->indentLengthCO->setEnabled(!skip);
2038 setSkip(textLayoutModule->skipCO->currentIndex());
2041 void GuiDocument::allowMathIndent() {
2042 // only disable when not checked, checked does not always allow enabling
2043 if (!mathsModule->MathIndentCB->isChecked()) {
2044 mathsModule->MathIndentLE->setEnabled(false);
2045 mathsModule->MathIndentLengthCO->setEnabled(false);
2047 if (mathsModule->MathIndentCB->isChecked()
2048 && mathsModule->MathIndentCO->itemData(mathsModule->MathIndentCO->currentIndex()) == "custom") {
2049 mathsModule->MathIndentLE->setEnabled(true);
2050 mathsModule->MathIndentLengthCO->setEnabled(true);
2055 void GuiDocument::enableMathIndent(int item)
2057 bool const enable = (item == 1);
2058 mathsModule->MathIndentLE->setEnabled(enable);
2059 mathsModule->MathIndentLengthCO->setEnabled(enable);
2064 void GuiDocument::setMargins()
2066 bool const extern_geometry =
2067 documentClass().provides("geometry");
2068 marginsModule->marginCB->setEnabled(!extern_geometry);
2069 if (extern_geometry) {
2070 marginsModule->marginCB->setChecked(false);
2071 setCustomMargins(true);
2073 marginsModule->marginCB->setChecked(!bp_.use_geometry);
2074 setCustomMargins(!bp_.use_geometry);
2077 // set some placeholder text that hint on defaults
2078 QString const placeholder = marginsModule->marginCB->isChecked() ?
2079 qt_("Class defaults") : qt_("Package defaults");
2080 // set tooltip depending on gemoetry state
2081 QString const tooltip = marginsModule->marginCB->isChecked() ?
2082 qt_("If no value is given, the defaults as set by the class are used.")
2083 : qt_("If no value is given, the defaults as set by the geometry package or a package/class overriding geometry's defaults are used.");
2084 marginsModule->topLE->setPlaceholderText(placeholder);
2085 marginsModule->bottomLE->setPlaceholderText(placeholder);
2086 marginsModule->innerLE->setPlaceholderText(placeholder);
2087 marginsModule->outerLE->setPlaceholderText(placeholder);
2088 marginsModule->headheightLE->setPlaceholderText(placeholder);
2089 marginsModule->headsepLE->setPlaceholderText(placeholder);
2090 marginsModule->footskipLE->setPlaceholderText(placeholder);
2091 marginsModule->columnsepLE->setPlaceholderText(placeholder);
2092 marginsModule->topLE->setToolTip(tooltip);
2093 marginsModule->bottomLE->setToolTip(tooltip);
2094 marginsModule->innerLE->setToolTip(tooltip);
2095 marginsModule->outerLE->setToolTip(tooltip);
2096 marginsModule->headheightLE->setToolTip(tooltip);
2097 marginsModule->headsepLE->setToolTip(tooltip);
2098 marginsModule->footskipLE->setToolTip(tooltip);
2099 marginsModule->columnsepLE->setToolTip(tooltip);
2103 void GuiDocument::papersizeChanged(int paper_size)
2105 setCustomPapersize(paper_size == 1);
2109 void GuiDocument::setCustomPapersize(bool custom)
2111 pageLayoutModule->paperwidthL->setEnabled(custom);
2112 pageLayoutModule->paperwidthLE->setEnabled(custom);
2113 pageLayoutModule->paperwidthUnitCO->setEnabled(custom);
2114 pageLayoutModule->paperheightL->setEnabled(custom);
2115 pageLayoutModule->paperheightLE->setEnabled(custom);
2116 pageLayoutModule->paperheightLE->setFocus();
2117 pageLayoutModule->paperheightUnitCO->setEnabled(custom);
2121 void GuiDocument::setColSep()
2123 setCustomMargins(marginsModule->marginCB->checkState() == Qt::Checked);
2127 void GuiDocument::setCustomMargins(bool custom)
2129 marginsModule->topL->setEnabled(!custom);
2130 marginsModule->topLE->setEnabled(!custom);
2131 marginsModule->topUnit->setEnabled(!custom);
2133 marginsModule->bottomL->setEnabled(!custom);
2134 marginsModule->bottomLE->setEnabled(!custom);
2135 marginsModule->bottomUnit->setEnabled(!custom);
2137 marginsModule->innerL->setEnabled(!custom);
2138 marginsModule->innerLE->setEnabled(!custom);
2139 marginsModule->innerUnit->setEnabled(!custom);
2141 marginsModule->outerL->setEnabled(!custom);
2142 marginsModule->outerLE->setEnabled(!custom);
2143 marginsModule->outerUnit->setEnabled(!custom);
2145 marginsModule->headheightL->setEnabled(!custom);
2146 marginsModule->headheightLE->setEnabled(!custom);
2147 marginsModule->headheightUnit->setEnabled(!custom);
2149 marginsModule->headsepL->setEnabled(!custom);
2150 marginsModule->headsepLE->setEnabled(!custom);
2151 marginsModule->headsepUnit->setEnabled(!custom);
2153 marginsModule->footskipL->setEnabled(!custom);
2154 marginsModule->footskipLE->setEnabled(!custom);
2155 marginsModule->footskipUnit->setEnabled(!custom);
2157 bool const enableColSep = !custom &&
2158 textLayoutModule->twoColumnCB->checkState() == Qt::Checked;
2159 marginsModule->columnsepL->setEnabled(enableColSep);
2160 marginsModule->columnsepLE->setEnabled(enableColSep);
2161 marginsModule->columnsepUnit->setEnabled(enableColSep);
2163 // set some placeholder text that hint on defaults
2164 QString const placeholder = marginsModule->marginCB->isChecked() ?
2165 qt_("Class defaults") : qt_("Package defaults");
2166 // set tooltip depending on gemoetry state
2167 QString const tooltip = marginsModule->marginCB->isChecked() ?
2168 qt_("If no value is given, the defaults as set by the class are used.")
2169 : qt_("If no value is given, the defaults as set by the geometry package or a package/class overriding geometry's defaults are used.");
2170 marginsModule->topLE->setPlaceholderText(placeholder);
2171 marginsModule->bottomLE->setPlaceholderText(placeholder);
2172 marginsModule->innerLE->setPlaceholderText(placeholder);
2173 marginsModule->outerLE->setPlaceholderText(placeholder);
2174 marginsModule->headheightLE->setPlaceholderText(placeholder);
2175 marginsModule->headsepLE->setPlaceholderText(placeholder);
2176 marginsModule->footskipLE->setPlaceholderText(placeholder);
2177 marginsModule->columnsepLE->setPlaceholderText(placeholder);
2178 marginsModule->topLE->setToolTip(tooltip);
2179 marginsModule->bottomLE->setToolTip(tooltip);
2180 marginsModule->innerLE->setToolTip(tooltip);
2181 marginsModule->outerLE->setToolTip(tooltip);
2182 marginsModule->headheightLE->setToolTip(tooltip);
2183 marginsModule->headsepLE->setToolTip(tooltip);
2184 marginsModule->footskipLE->setToolTip(tooltip);
2185 marginsModule->columnsepLE->setToolTip(tooltip);
2190 void GuiDocument::changeBackgroundColor()
2192 QColor const & newColor = QColorDialog::getColor(
2193 rgb2qcolor(set_backgroundcolor), asQWidget());
2194 if (!newColor.isValid())
2196 // set the button color and text
2197 colorModule->backgroundPB->setStyleSheet(
2198 colorButtonStyleSheet(newColor));
2199 colorModule->backgroundPB->setText(qt_("&Change..."));
2201 set_backgroundcolor = rgbFromHexName(fromqstr(newColor.name()));
2202 is_backgroundcolor = true;
2207 void GuiDocument::deleteBackgroundColor()
2209 // set the button color back to default by setting an empty StyleSheet
2210 colorModule->backgroundPB->setStyleSheet(QLatin1String(""));
2211 // change button text
2212 colorModule->backgroundPB->setText(qt_("&Default..."));
2213 // save default color (white)
2214 set_backgroundcolor = rgbFromHexName("#ffffff");
2215 is_backgroundcolor = false;
2220 void GuiDocument::changeFontColor()
2222 QColor const & newColor = QColorDialog::getColor(
2223 rgb2qcolor(set_fontcolor), asQWidget());
2224 if (!newColor.isValid())
2226 // set the button color and text
2227 colorModule->fontColorPB->setStyleSheet(
2228 colorButtonStyleSheet(newColor));
2229 colorModule->fontColorPB->setText(qt_("&Change..."));
2231 set_fontcolor = rgbFromHexName(fromqstr(newColor.name()));
2232 is_fontcolor = true;
2237 void GuiDocument::deleteFontColor()
2239 // set the button color back to default by setting an empty StyleSheet
2240 colorModule->fontColorPB->setStyleSheet(QLatin1String(""));
2241 // change button text
2242 colorModule->fontColorPB->setText(qt_("&Default..."));
2243 // save default color (black)
2244 set_fontcolor = rgbFromHexName("#000000");
2245 is_fontcolor = false;
2250 void GuiDocument::changeNoteFontColor()
2252 QColor const & newColor = QColorDialog::getColor(
2253 rgb2qcolor(set_notefontcolor), asQWidget());
2254 if (!newColor.isValid())
2256 // set the button color
2257 colorModule->noteFontColorPB->setStyleSheet(
2258 colorButtonStyleSheet(newColor));
2260 set_notefontcolor = rgbFromHexName(fromqstr(newColor.name()));
2261 is_notefontcolor = true;
2266 void GuiDocument::deleteNoteFontColor()
2268 // set the button color back to pref
2269 theApp()->getRgbColor(Color_greyedouttext, set_notefontcolor);
2270 colorModule->noteFontColorPB->setStyleSheet(
2271 colorButtonStyleSheet(rgb2qcolor(set_notefontcolor)));
2272 is_notefontcolor = false;
2277 void GuiDocument::changeBoxBackgroundColor()
2279 QColor const & newColor = QColorDialog::getColor(
2280 rgb2qcolor(set_boxbgcolor), asQWidget());
2281 if (!newColor.isValid())
2283 // set the button color
2284 colorModule->boxBackgroundPB->setStyleSheet(
2285 colorButtonStyleSheet(newColor));
2287 set_boxbgcolor = rgbFromHexName(fromqstr(newColor.name()));
2288 is_boxbgcolor = true;
2293 void GuiDocument::deleteBoxBackgroundColor()
2295 // set the button color back to pref
2296 theApp()->getRgbColor(Color_shadedbg, set_boxbgcolor);
2297 colorModule->boxBackgroundPB->setStyleSheet(
2298 colorButtonStyleSheet(rgb2qcolor(set_boxbgcolor)));
2299 is_boxbgcolor = false;
2304 void GuiDocument::updateQuoteStyles(bool const set)
2306 Language const * lang = lyx::languages.getLanguage(
2307 fromqstr(langModule->languageCO->itemData(
2308 langModule->languageCO->currentIndex()).toString()));
2310 QuoteStyle def = bp_.getQuoteStyle(lang->quoteStyle());
2312 langModule->quoteStyleCO->clear();
2314 bool has_default = false;
2315 for (int i = 0; i < quoteparams.stylescount(); ++i) {
2316 QuoteStyle qs = QuoteStyle(i);
2317 if (qs == QuoteStyle::Dynamic)
2319 bool const langdef = (qs == def);
2321 // add the default style on top
2322 langModule->quoteStyleCO->insertItem(0,
2323 toqstr(quoteparams.getGuiLabel(qs, langdef)), static_cast<int>(qs));
2327 langModule->quoteStyleCO->addItem(
2328 toqstr(quoteparams.getGuiLabel(qs, langdef)), static_cast<int>(qs));
2330 if (set && has_default)
2331 // (re)set to the default style
2332 langModule->quoteStyleCO->setCurrentIndex(0);
2336 void GuiDocument::languageChanged(int i)
2338 // some languages only work with Polyglossia
2339 Language const * lang = lyx::languages.getLanguage(
2340 fromqstr(langModule->languageCO->itemData(i).toString()));
2341 if (lang->babel().empty() && !lang->polyglossia().empty()
2342 && lang->required() != "CJK" && lang->required() != "japanese") {
2343 // If we force to switch fontspec on, store
2344 // current state (#8717)
2345 if (fontModule->osFontsCB->isEnabled())
2346 forced_fontspec_activation =
2347 !fontModule->osFontsCB->isChecked();
2348 fontModule->osFontsCB->setChecked(true);
2349 fontModule->osFontsCB->setEnabled(false);
2352 fontModule->osFontsCB->setEnabled(true);
2353 // If we have forced to switch fontspec on,
2354 // restore previous state (#8717)
2355 if (forced_fontspec_activation)
2356 fontModule->osFontsCB->setChecked(false);
2357 forced_fontspec_activation = false;
2360 // set appropriate quotation mark style
2361 updateQuoteStyles(true);
2365 void GuiDocument::osFontsChanged(bool nontexfonts)
2367 bool const tex_fonts = !nontexfonts;
2368 // store current fonts
2369 QString const font_roman = fontModule->fontsRomanCO->itemData(
2370 fontModule->fontsRomanCO->currentIndex()).toString();
2371 QString const font_sans = fontModule->fontsSansCO->itemData(
2372 fontModule->fontsSansCO->currentIndex()).toString();
2373 QString const font_typewriter = fontModule->fontsTypewriterCO->itemData(
2374 fontModule->fontsTypewriterCO->currentIndex()).toString();
2375 QString const font_math = fontModule->fontsMathCO->itemData(
2376 fontModule->fontsMathCO->currentIndex()).toString();
2377 int const font_sf_scale = fontModule->scaleSansSB->value();
2378 int const font_tt_scale = fontModule->scaleTypewriterSB->value();
2381 // store default format
2382 QString const dformat = outputModule->defaultFormatCO->itemData(
2383 outputModule->defaultFormatCO->currentIndex()).toString();
2384 updateDefaultFormat();
2385 // try to restore default format
2386 int index = outputModule->defaultFormatCO->findData(dformat);
2387 // set to default if format is not found
2390 outputModule->defaultFormatCO->setCurrentIndex(index);
2392 // try to restore fonts which were selected two toggles ago
2393 index = fontModule->fontsRomanCO->findData(fontModule->font_roman);
2395 fontModule->fontsRomanCO->setCurrentIndex(index);
2396 index = fontModule->fontsSansCO->findData(fontModule->font_sans);
2398 fontModule->fontsSansCO->setCurrentIndex(index);
2399 index = fontModule->fontsTypewriterCO->findData(fontModule->font_typewriter);
2401 fontModule->fontsTypewriterCO->setCurrentIndex(index);
2402 index = fontModule->fontsMathCO->findData(fontModule->font_math);
2404 fontModule->fontsMathCO->setCurrentIndex(index);
2405 // save fonts for next next toggle
2406 fontModule->font_roman = font_roman;
2407 fontModule->font_sans = font_sans;
2408 fontModule->font_typewriter = font_typewriter;
2409 fontModule->font_math = font_math;
2410 fontModule->font_sf_scale = font_sf_scale;
2411 fontModule->font_tt_scale = font_tt_scale;
2413 // non-tex fonts override the "\inputencoding" option with "utf8-plain"
2414 langModule->encodingCO->setEnabled(tex_fonts);
2415 inputencodingToDialog();
2417 fontModule->fontsDefaultCO->setEnabled(tex_fonts);
2418 fontModule->fontsDefaultLA->setEnabled(tex_fonts);
2419 fontModule->cjkFontLE->setEnabled(tex_fonts);
2420 fontModule->cjkFontLA->setEnabled(tex_fonts);
2422 updateFontOptions();
2424 fontModule->fontencLA->setEnabled(tex_fonts);
2425 fontModule->fontencCO->setEnabled(tex_fonts);
2427 fontModule->fontencLE->setEnabled(false);
2429 fontencChanged(fontModule->fontencCO->currentIndex());
2433 void GuiDocument::encodingSwitched(int i)
2435 bool const tex_fonts = !fontModule->osFontsCB->isChecked();
2436 langModule->unicodeEncodingCO->setEnabled(tex_fonts);
2437 langModule->customEncodingCO->setEnabled(tex_fonts);
2438 langModule->autoEncodingCO->setEnabled(tex_fonts);
2439 langModule->unicodeEncodingCO->setVisible(i == EncodingSets::unicode);
2440 langModule->autoEncodingCO->setVisible(i == EncodingSets::legacy);
2441 langModule->customEncodingCO->setVisible(i == EncodingSets::custom);
2443 langModule->unicodeEncodingCO->setItemText(1, qt_("Direct (No inputenc)"));
2445 langModule->unicodeEncodingCO->setItemText(1, qt_("Direct (XeTeX/LuaTeX)"));
2448 void GuiDocument::inputencodingToDialog()
2450 QString inputenc = toqstr(bp_.inputenc);
2452 if (fontModule->osFontsCB->isChecked()) { // non-tex fonts require utf8-plain
2453 langModule->encodingCO->setCurrentIndex(EncodingSets::unicode);
2454 langModule->unicodeEncodingCO->setCurrentIndex(
2455 langModule->unicodeEncodingCO->findData("utf8-plain"));
2456 } else if (inputenc.startsWith("utf8")) {
2457 langModule->encodingCO->setCurrentIndex(EncodingSets::unicode);
2458 p = langModule->unicodeEncodingCO->findData(inputenc);
2461 langModule->unicodeEncodingCO->setCurrentIndex(p);
2462 langModule->autoEncodingCO->setCurrentIndex(0);
2463 langModule->customEncodingCO->setCurrentIndex(0);
2464 } else if (inputenc.startsWith("auto")) {
2465 langModule->encodingCO->setCurrentIndex(EncodingSets::legacy);
2466 p = langModule->autoEncodingCO->findData(inputenc);
2469 langModule->unicodeEncodingCO->setCurrentIndex(0);
2470 langModule->autoEncodingCO->setCurrentIndex(p);
2471 langModule->customEncodingCO->setCurrentIndex(0);
2473 langModule->encodingCO->setCurrentIndex(EncodingSets::custom);
2474 p = langModule->customEncodingCO->findData(inputenc);
2477 langModule->encodingCO->setCurrentIndex(EncodingSets::unicode);
2479 langModule->unicodeEncodingCO->setCurrentIndex(0);
2480 langModule->autoEncodingCO->setCurrentIndex(0);
2481 langModule->customEncodingCO->setCurrentIndex(p);
2483 encodingSwitched(langModule->encodingCO->currentIndex());
2487 void GuiDocument::mathFontChanged(int)
2489 updateFontOptions();
2492 void GuiDocument::fontOsfToggled(bool state)
2494 if (fontModule->osFontsCB->isChecked())
2496 QString font = fontModule->fontsRomanCO->itemData(
2497 fontModule->fontsRomanCO->currentIndex()).toString();
2498 if (hasMonolithicExpertSet(font))
2499 fontModule->fontScCB->setChecked(state);
2503 void GuiDocument::fontScToggled(bool state)
2505 if (fontModule->osFontsCB->isChecked())
2507 QString font = fontModule->fontsRomanCO->itemData(
2508 fontModule->fontsRomanCO->currentIndex()).toString();
2509 if (hasMonolithicExpertSet(font))
2510 fontModule->fontOsfCB->setChecked(state);
2514 void GuiDocument::updateExtraOpts()
2516 bool const tex_fonts = !fontModule->osFontsCB->isChecked();
2519 font = fontModule->fontsRomanCO->itemData(
2520 fontModule->fontsRomanCO->currentIndex()).toString();
2521 bool const rm_opts = providesExtraOpts(font);
2523 font = fontModule->fontsSansCO->itemData(
2524 fontModule->fontsSansCO->currentIndex()).toString();
2525 bool const sf_opts = providesExtraOpts(font);
2527 font = fontModule->fontsTypewriterCO->itemData(
2528 fontModule->fontsTypewriterCO->currentIndex()).toString();
2529 bool const tt_opts = providesExtraOpts(font);
2530 fontModule->fontspecRomanLA->setEnabled(!tex_fonts || rm_opts);
2531 fontModule->fontspecRomanLE->setEnabled(!tex_fonts || rm_opts);
2532 fontModule->fontspecSansLA->setEnabled(!tex_fonts || sf_opts);
2533 fontModule->fontspecSansLE->setEnabled(!tex_fonts || sf_opts);
2534 fontModule->fontspecTypewriterLA->setEnabled(!tex_fonts || tt_opts);
2535 fontModule->fontspecTypewriterLE->setEnabled(!tex_fonts || tt_opts);
2539 void GuiDocument::updateFontOptions()
2541 bool const tex_fonts = !fontModule->osFontsCB->isChecked();
2544 font = fontModule->fontsSansCO->itemData(
2545 fontModule->fontsSansCO->currentIndex()).toString();
2546 bool scalable = providesScale(font);
2547 fontModule->scaleSansSB->setEnabled(scalable);
2548 fontModule->scaleSansLA->setEnabled(scalable);
2549 fontModule->fontSansOsfCB->setEnabled(providesOSF(font));
2551 font = fontModule->fontsTypewriterCO->itemData(
2552 fontModule->fontsTypewriterCO->currentIndex()).toString();
2553 scalable = providesScale(font);
2554 fontModule->scaleTypewriterSB->setEnabled(scalable);
2555 fontModule->scaleTypewriterLA->setEnabled(scalable);
2556 fontModule->fontTypewriterOsfCB->setEnabled(providesOSF(font));
2558 font = fontModule->fontsRomanCO->itemData(
2559 fontModule->fontsRomanCO->currentIndex()).toString();
2560 fontModule->fontScCB->setEnabled(providesSC(font));
2561 fontModule->fontOsfCB->setEnabled(providesOSF(font));
2563 updateMathFonts(font);
2567 void GuiDocument::updateFontsize(string const & items, string const & sel)
2569 fontModule->fontsizeCO->clear();
2570 fontModule->fontsizeCO->addItem(qt_("Default"));
2572 for (int n = 0; !token(items,'|',n).empty(); ++n)
2573 fontModule->fontsizeCO->
2574 addItem(toqstr(token(items,'|',n)));
2576 for (int n = 0; n < fontModule->fontsizeCO->count(); ++n) {
2577 if (fromqstr(fontModule->fontsizeCO->itemText(n)) == sel) {
2578 fontModule->fontsizeCO->setCurrentIndex(n);
2585 bool GuiDocument::ot1() const
2587 QString const fontenc =
2588 fontModule->fontencCO->itemData(fontModule->fontencCO->currentIndex()).toString();
2589 int const i = langModule->languageCO->currentIndex();
2592 QString const langname = langModule->languageCO->itemData(i).toString();
2593 Language const * newlang = lyx::languages.getLanguage(fromqstr(langname));
2594 return (fontenc == "default"
2595 || (fontenc == "auto" && newlang->fontenc(buffer().params()) == "OT1")
2596 || (fontenc == "custom" && fontModule->fontencLE->text() == "OT1"));
2600 bool GuiDocument::completeFontset() const
2602 return (fontModule->fontsSansCO->itemData(
2603 fontModule->fontsSansCO->currentIndex()).toString() == "default"
2604 && fontModule->fontsSansCO->itemData(
2605 fontModule->fontsTypewriterCO->currentIndex()).toString() == "default");
2609 bool GuiDocument::noMathFont() const
2611 return (fontModule->fontsMathCO->itemData(
2612 fontModule->fontsMathCO->currentIndex()).toString() == "default");
2616 void GuiDocument::updateTexFonts()
2618 LaTeXFonts::TexFontMap texfontmap = theLaTeXFonts().getLaTeXFonts();
2620 LaTeXFonts::TexFontMap::const_iterator it = texfontmap.begin();
2621 LaTeXFonts::TexFontMap::const_iterator end = texfontmap.end();
2622 for (; it != end; ++it) {
2623 LaTeXFont lf = it->second;
2624 if (lf.name().empty()) {
2625 LYXERR0("Error: Unnamed font: " << it->first);
2628 docstring const family = lf.family();
2629 docstring guiname = translateIfPossible(lf.guiname());
2630 if (!lf.available(ot1(), noMathFont()))
2631 guiname += _(" (not installed)");
2633 rmfonts_.insert(toqstr(guiname), toqstr(it->first));
2634 else if (family == "sf")
2635 sffonts_.insert(toqstr(guiname), toqstr(it->first));
2636 else if (family == "tt")
2637 ttfonts_.insert(toqstr(guiname), toqstr(it->first));
2638 else if (family == "math")
2639 mathfonts_.insert(toqstr(guiname), toqstr(it->first));
2644 void GuiDocument::updateFontlist()
2646 // reset the filters of the CategorizedCombos
2647 fontModule->fontsRomanCO->resetFilter();
2648 fontModule->fontsSansCO->resetFilter();
2649 fontModule->fontsTypewriterCO->resetFilter();
2650 fontModule->fontsRomanCO->clear();
2651 fontModule->fontsSansCO->clear();
2652 fontModule->fontsTypewriterCO->clear();
2653 fontModule->fontsMathCO->clear();
2655 // With fontspec (XeTeX, LuaTeX), we have access to all system fonts, but not the LaTeX fonts
2656 if (fontModule->osFontsCB->isChecked()) {
2657 fontModule->fontsRomanCO->addItem(qt_("Default"), QString("default"));
2658 fontModule->fontsSansCO->addItem(qt_("Default"), QString("default"));
2659 fontModule->fontsTypewriterCO->addItem(qt_("Default"), QString("default"));
2660 QString unimath = qt_("Non-TeX Fonts Default");
2661 if (!LaTeXFeatures::isAvailable("unicode-math"))
2662 unimath += qt_(" (not available)");
2663 fontModule->fontsMathCO->addItem(qt_("Class Default (TeX Fonts)"), QString("auto"));
2664 fontModule->fontsMathCO->addItem(unimath, QString("default"));
2666 #if QT_VERSION >= 0x060000
2667 const QStringList families(QFontDatabase::families());
2669 QFontDatabase fontdb;
2670 const QStringList families(fontdb.families());
2672 for (auto const & family : families) {
2673 fontModule->fontsRomanCO->addItem(family, family);
2674 fontModule->fontsSansCO->addItem(family, family);
2675 fontModule->fontsTypewriterCO->addItem(family, family);
2680 if (rmfonts_.empty())
2683 fontModule->fontsRomanCO->addItem(qt_("Default"), QString("default"));
2684 QMap<QString, QString>::const_iterator rmi = rmfonts_.constBegin();
2685 while (rmi != rmfonts_.constEnd()) {
2686 fontModule->fontsRomanCO->addItem(rmi.key(), rmi.value());
2690 fontModule->fontsSansCO->addItem(qt_("Default"), QString("default"));
2691 QMap<QString, QString>::const_iterator sfi = sffonts_.constBegin();
2692 while (sfi != sffonts_.constEnd()) {
2693 fontModule->fontsSansCO->addItem(sfi.key(), sfi.value());
2697 fontModule->fontsTypewriterCO->addItem(qt_("Default"), QString("default"));
2698 QMap<QString, QString>::const_iterator tti = ttfonts_.constBegin();
2699 while (tti != ttfonts_.constEnd()) {
2700 fontModule->fontsTypewriterCO->addItem(tti.key(), tti.value());
2704 fontModule->fontsMathCO->addItem(qt_("Automatic"), QString("auto"));
2705 fontModule->fontsMathCO->addItem(qt_("Class Default"), QString("default"));
2706 QMap<QString, QString>::const_iterator mmi = mathfonts_.constBegin();
2707 while (mmi != mathfonts_.constEnd()) {
2708 fontModule->fontsMathCO->addItem(mmi.key(), mmi.value());
2714 void GuiDocument::fontencChanged(int item)
2716 fontModule->fontencLE->setEnabled(
2717 fontModule->fontencCO->itemData(item).toString() == "custom");
2718 // The availability of TeX fonts depends on the font encoding
2720 updateFontOptions();
2724 void GuiDocument::updateMathFonts(QString const & rm)
2726 if (fontModule->osFontsCB->isChecked())
2728 QString const math =
2729 fontModule->fontsMathCO->itemData(fontModule->fontsMathCO->currentIndex()).toString();
2730 int const i = fontModule->fontsMathCO->findData("default");
2731 if (providesNoMath(rm) && i == -1)
2732 fontModule->fontsMathCO->insertItem(1, qt_("Class Default"), QString("default"));
2733 else if (!providesNoMath(rm) && i != -1) {
2734 int const c = fontModule->fontsMathCO->currentIndex();
2735 fontModule->fontsMathCO->removeItem(i);
2737 fontModule->fontsMathCO->setCurrentIndex(0);
2742 void GuiDocument::romanChanged(int item)
2744 if (fontModule->osFontsCB->isChecked())
2746 QString const font =
2747 fontModule->fontsRomanCO->itemData(item).toString();
2748 fontModule->fontScCB->setEnabled(providesSC(font));
2749 fontModule->fontOsfCB->setEnabled(providesOSF(font));
2751 updateMathFonts(font);
2755 void GuiDocument::sansChanged(int item)
2757 if (fontModule->osFontsCB->isChecked())
2759 QString const font =
2760 fontModule->fontsSansCO->itemData(item).toString();
2761 bool const scalable = providesScale(font);
2762 fontModule->scaleSansSB->setEnabled(scalable);
2763 fontModule->scaleSansLA->setEnabled(scalable);
2764 fontModule->fontSansOsfCB->setEnabled(providesOSF(font));
2769 void GuiDocument::ttChanged(int item)
2771 if (fontModule->osFontsCB->isChecked())
2773 QString const font =
2774 fontModule->fontsTypewriterCO->itemData(item).toString();
2775 bool scalable = providesScale(font);
2776 fontModule->scaleTypewriterSB->setEnabled(scalable);
2777 fontModule->scaleTypewriterLA->setEnabled(scalable);
2778 fontModule->fontTypewriterOsfCB->setEnabled(providesOSF(font));
2783 void GuiDocument::updatePagestyle(string const & items, string const & sel)
2786 pageLayoutModule->pagestyleCO->clear();
2787 pageLayoutModule->pagestyleCO->addItem(qt_("Default"));
2789 for (int n = 0; !token(items, '|', n).empty(); ++n) {
2790 string style = token(items, '|', n);
2791 QString style_gui = qt_(style);
2792 pagestyles.push_back(pair<string, QString>(style, style_gui));
2793 pageLayoutModule->pagestyleCO->addItem(style_gui);
2796 if (sel == "default") {
2797 pageLayoutModule->pagestyleCO->setCurrentIndex(0);
2803 for (auto const & pagestyle : pagestyles)
2804 if (pagestyle.first == sel)
2805 nn = pageLayoutModule->pagestyleCO->findText(pagestyle.second);
2808 pageLayoutModule->pagestyleCO->setCurrentIndex(nn);
2812 void GuiDocument::browseLayout()
2814 QString const label1 = qt_("Lay&outs");
2815 QString const dir1 = toqstr(lyxrc.document_path);
2816 QStringList const filter(qt_("LyX Layout (*.layout)"));
2817 QString file = browseRelToParent(QString(), bufferFilePath(),
2818 qt_("Local layout file"), filter, false,
2821 if (!file.endsWith(".layout"))
2824 FileName layoutFile = support::makeAbsPath(fromqstr(file),
2825 fromqstr(bufferFilePath()));
2827 int const ret = Alert::prompt(_("Local layout file"),
2828 _("The layout file you have selected is a local layout\n"
2829 "file, not one in the system or user directory.\n"
2830 "Your document will not work with this layout if you\n"
2831 "move the layout file to a different directory."),
2832 1, 1, _("&Set Layout"), _("&Cancel"));
2836 // load the layout file
2837 LayoutFileList & bcl = LayoutFileList::get();
2838 string classname = layoutFile.onlyFileName();
2839 // this will update an existing layout if that layout has been loaded before.
2840 LayoutFileIndex name = support::onlyFileName(bcl.addLocalLayout(
2841 classname.substr(0, classname.size() - 7),
2842 layoutFile.onlyPath().absFileName()));
2845 Alert::error(_("Error"),
2846 _("Unable to read local layout file."));
2850 const_cast<Buffer &>(buffer()).setLayoutPos(layoutFile.onlyPath().absFileName());
2852 // do not trigger classChanged if there is no change.
2853 if (latexModule->classCO->currentText() == toqstr(name))
2857 bool const avail = latexModule->classCO->set(toqstr(name));
2859 LayoutFile const & tc = bcl[name];
2860 docstring const guiname = translateIfPossible(from_utf8(tc.description()));
2861 // tooltip sensu "KOMA-Script Article [Class 'scrartcl']"
2862 QString tooltip = toqstr(bformat(_("%1$s [Class '%2$s']"), guiname, from_utf8(tc.latexname())));
2863 tooltip += '\n' + qt_("This is a local layout file.");
2864 latexModule->classCO->addItemSort(toqstr(tc.name()), toqstr(guiname),
2865 toqstr(translateIfPossible(from_utf8(tc.category()))),
2867 true, true, true, true);
2868 latexModule->classCO->set(toqstr(name));
2875 void GuiDocument::browseMaster()
2877 QString const title = qt_("Select master document");
2878 QString const dir1 = toqstr(lyxrc.document_path);
2879 QString const old = latexModule->childDocLE->text();
2880 QString const docpath = toqstr(support::onlyPath(buffer().absFileName()));
2881 QStringList const filter(qt_("LyX Files (*.lyx)"));
2882 QString file = browseRelToSub(old, docpath, title, filter, false,
2883 qt_("D&ocuments"), toqstr(lyxrc.document_path));
2885 if (!file.isEmpty())
2886 latexModule->childDocLE->setText(file);
2890 void GuiDocument::classChanged_adaptor()
2892 const_cast<Buffer &>(buffer()).setLayoutPos(string());
2897 void GuiDocument::classChanged()
2899 int idx = latexModule->classCO->currentIndex();
2902 string const classname = fromqstr(latexModule->classCO->getData(idx));
2904 if (buttonBox->button(QDialogButtonBox::Apply)->isEnabled()) {
2905 int const ret = Alert::prompt(_("Unapplied changes"),
2906 _("Some changes in the dialog were not yet applied.\n"
2907 "If you do not apply now, they will be lost after this action."),
2908 1, 1, _("&Apply"), _("&Dismiss"));
2913 // We load the TextClass as soon as it is selected. This is
2914 // necessary so that other options in the dialog can be updated
2915 // according to the new class. Note, however, that, if you use
2916 // the scroll wheel when sitting on the combo box, we'll load a
2917 // lot of TextClass objects very quickly....
2918 if (!bp_.setBaseClass(classname, buffer().layoutPos())) {
2919 Alert::error(_("Error"), _("Unable to set document class."));
2922 if (lyxrc.auto_reset_options)
2923 bp_.useClassDefaults();
2925 // With the introduction of modules came a distinction between the base
2926 // class and the document class. The former corresponds to the main layout
2927 // file; the latter is that plus the modules (or the document-specific layout,
2928 // or whatever else there could be). Our parameters come from the document
2929 // class. So when we set the base class, we also need to recreate the document
2930 // class. Otherwise, we still have the old one.
2931 bp_.makeDocumentClass();
2936 void GuiDocument::languagePackageChanged(int i)
2938 langModule->languagePackageLE->setEnabled(
2939 langModule->languagePackageCO->itemData(i).toString() == "custom");
2943 void GuiDocument::biblioChanged()
2945 biblioChanged_ = true;
2950 void GuiDocument::checkPossibleCiteEngines()
2952 // Check if the class provides a specific engine,
2953 // and if so, enforce this.
2954 string force_engine;
2955 if (documentClass().provides("natbib")
2956 || documentClass().provides("natbib-internal"))
2957 force_engine = "natbib";
2958 else if (documentClass().provides("jurabib"))
2959 force_engine = "jurabib";
2960 else if (documentClass().provides("biblatex"))
2961 force_engine = "biblatex";
2962 else if (documentClass().provides("biblatex-natbib"))
2963 force_engine = "biblatex-natbib";
2965 if (!force_engine.empty())
2966 biblioModule->citeEngineCO->setCurrentIndex(
2967 biblioModule->citeEngineCO->findData(toqstr(force_engine)));
2968 biblioModule->citeEngineCO->setEnabled(force_engine.empty());
2972 void GuiDocument::rescanBibFiles()
2975 rescanTexStyles("bbx cbx");
2977 rescanTexStyles("bst");
2981 void GuiDocument::resetDefaultBibfile(string const & which)
2983 QString const engine =
2984 biblioModule->citeEngineCO->itemData(
2985 biblioModule->citeEngineCO->currentIndex()).toString();
2987 CiteEngineType const cet =
2988 CiteEngineType(biblioModule->citeStyleCO->itemData(
2989 biblioModule->citeStyleCO->currentIndex()).toInt());
2991 updateDefaultBiblio(theCiteEnginesList[fromqstr(engine)]->getDefaultBiblio(cet), which);
2995 void GuiDocument::resetDefaultBbxBibfile()
2997 resetDefaultBibfile("bbx");
3001 void GuiDocument::resetDefaultCbxBibfile()
3003 resetDefaultBibfile("cbx");
3007 void GuiDocument::citeEngineChanged(int n)
3009 QString const engine =
3010 biblioModule->citeEngineCO->itemData(n).toString();
3012 vector<string> const engs =
3013 theCiteEnginesList[fromqstr(engine)]->getEngineType();
3015 updateCiteStyles(engs);
3016 updateEngineDependends();
3017 resetDefaultBibfile();
3022 void GuiDocument::updateEngineDependends()
3024 bool const biblatex = isBiblatex();
3026 // These are only useful with BibTeX
3027 biblioModule->defaultBiblioCO->setEnabled(!biblatex);
3028 biblioModule->bibtexStyleLA->setEnabled(!biblatex);
3029 biblioModule->resetDefaultBiblioPB->setEnabled(!biblatex);
3030 biblioModule->bibtopicCB->setEnabled(!biblatex);
3032 // These are only useful with Biblatex
3033 biblioModule->biblatexBbxCO->setEnabled(biblatex);
3034 biblioModule->biblatexBbxLA->setEnabled(biblatex);
3035 biblioModule->biblatexCbxCO->setEnabled(biblatex);
3036 biblioModule->biblatexCbxLA->setEnabled(biblatex);
3037 biblioModule->resetBbxPB->setEnabled(biblatex);
3038 biblioModule->resetCbxPB->setEnabled(biblatex);
3039 biblioModule->matchBbxPB->setEnabled(biblatex);
3041 // These are useful with biblatex, jurabib and natbib
3042 QString const engine =
3043 biblioModule->citeEngineCO->itemData(
3044 biblioModule->citeEngineCO->currentIndex()).toString();
3045 LyXCiteEngine const * ce = theCiteEnginesList[fromqstr(engine)];
3047 bool const citepack = ce->required("biblatex.sty") || ce->required("jurabib.sty")
3048 || ce->required("natbib.sty");
3049 biblioModule->citePackageOptionsLE->setEnabled(citepack);
3050 biblioModule->citePackageOptionsL->setEnabled(citepack);
3054 void GuiDocument::citeStyleChanged()
3056 QString const engine =
3057 biblioModule->citeEngineCO->itemData(
3058 biblioModule->citeEngineCO->currentIndex()).toString();
3059 QString const currentDef = isBiblatex() ?
3060 biblioModule->biblatexBbxCO->currentText()
3061 : biblioModule->defaultBiblioCO->currentText();
3062 if (theCiteEnginesList[fromqstr(engine)]->isDefaultBiblio(fromqstr(currentDef)))
3063 resetDefaultBibfile();
3069 void GuiDocument::bibtexChanged(int n)
3071 biblioModule->bibtexOptionsLE->setEnabled(
3072 biblioModule->bibtexCO->itemData(n).toString() != "default");
3077 void GuiDocument::updateCiteStyles(vector<string> const & engs, CiteEngineType const & sel)
3079 biblioModule->citeStyleCO->clear();
3081 vector<string>::const_iterator it = engs.begin();
3082 vector<string>::const_iterator end = engs.end();
3083 for (; it != end; ++it) {
3084 if (*it == "default")
3085 biblioModule->citeStyleCO->addItem(qt_("Basic numerical"),
3086 ENGINE_TYPE_DEFAULT);
3087 else if (*it == "authoryear")
3088 biblioModule->citeStyleCO->addItem(qt_("Author-year"),
3089 ENGINE_TYPE_AUTHORYEAR);
3090 else if (*it == "numerical")
3091 biblioModule->citeStyleCO->addItem(qt_("Author-number"),
3092 ENGINE_TYPE_NUMERICAL);
3094 int i = biblioModule->citeStyleCO->findData(sel);
3095 if (biblioModule->citeStyleCO->findData(sel) == -1)
3097 biblioModule->citeStyleCO->setCurrentIndex(i);
3099 biblioModule->citationStyleL->setEnabled(engs.size() > 1);
3100 biblioModule->citeStyleCO->setEnabled(engs.size() > 1);
3104 void GuiDocument::updateEngineType(string const & items, CiteEngineType const & sel)
3106 engine_types_.clear();
3108 for (int n = 0; !token(items, '|', n).empty(); ++n) {
3109 string style = token(items, '|', n);
3110 engine_types_.push_back(style);
3113 updateCiteStyles(engine_types_, sel);
3119 // both of these should take a vector<docstring>
3121 // This is an insanely complicated attempt to make this sort of thing
3122 // work with RTL languages.
3123 docstring formatStrVec(vector<string> const & v, docstring const & s)
3125 //this mess formats the list as "v[0], v[1], ..., [s] v[n]"
3129 return translateIfPossible(from_utf8(v[0]));
3130 if (v.size() == 2) {
3131 docstring retval = _("%1$s and %2$s");
3132 retval = subst(retval, _("and"), s);
3133 return bformat(retval, translateIfPossible(from_utf8(v[0])),
3134 translateIfPossible(from_utf8(v[1])));
3136 // The idea here is to format all but the last two items...
3137 int const vSize = v.size();
3138 docstring t2 = _("%1$s, %2$s");
3139 docstring retval = translateIfPossible(from_utf8(v[0]));
3140 for (int i = 1; i < vSize - 2; ++i)
3141 retval = bformat(t2, retval, translateIfPossible(from_utf8(v[i])));
3142 //...and then to plug them, and the last two, into this schema
3143 docstring t = _("%1$s, %2$s, and %3$s");
3144 t = subst(t, _("and"), s);
3145 return bformat(t, retval, translateIfPossible(from_utf8(v[vSize - 2])),
3146 translateIfPossible(from_utf8(v[vSize - 1])));
3149 vector<string> idsToNames(vector<string> const & idList)
3151 vector<string> retval;
3152 vector<string>::const_iterator it = idList.begin();
3153 vector<string>::const_iterator end = idList.end();
3154 for (; it != end; ++it) {
3155 LyXModule const * const mod = theModuleList[*it];
3157 retval.push_back(to_utf8(bformat(_("%1$s (unavailable)"),
3158 translateIfPossible(from_utf8(*it)))));
3160 retval.push_back(mod->getName());
3164 } // end anonymous namespace
3167 void GuiDocument::modulesToParams(BufferParams & bp)
3169 // update list of loaded modules
3170 bp.clearLayoutModules();
3171 int const srows = modules_sel_model_.rowCount();
3172 for (int i = 0; i < srows; ++i)
3173 bp.addLayoutModule(modules_sel_model_.getIDString(i));
3174 updateSelectedModules();
3176 // update the list of removed modules
3177 bp.clearRemovedModules();
3178 LayoutModuleList const & reqmods = bp.baseClass()->defaultModules();
3179 list<string>::const_iterator rit = reqmods.begin();
3180 list<string>::const_iterator ren = reqmods.end();
3182 // check each of the default modules
3183 for (; rit != ren; ++rit) {
3184 list<string>::const_iterator mit = bp.getModules().begin();
3185 list<string>::const_iterator men = bp.getModules().end();
3187 for (; mit != men; ++mit) {
3194 // the module isn't present so must have been removed by the user
3195 bp.addRemovedModule(*rit);
3200 void GuiDocument::modulesChanged()
3202 modulesToParams(bp_);
3204 if (buttonBox->button(QDialogButtonBox::Apply)->isEnabled()
3205 && (nonModuleChanged_ || shellescapeChanged_)) {
3206 int const ret = Alert::prompt(_("Unapplied changes"),
3207 _("Some changes in the dialog were not yet applied.\n"
3208 "If you do not apply now, they will be lost after this action."),
3209 1, 1, _("&Apply"), _("&Dismiss"));
3214 modulesChanged_ = true;
3215 bp_.makeDocumentClass();
3221 void GuiDocument::updateModuleInfo()
3223 selectionManager->update();
3225 //Module description
3226 bool const focus_on_selected = selectionManager->selectedFocused();
3227 QAbstractItemView * lv;
3228 bool category = false;
3229 if (focus_on_selected) {
3230 lv = modulesModule->selectedLV;
3233 lv = modulesModule->availableLV;
3234 if (lv->selectionModel()->selectedIndexes().isEmpty()) {
3235 modulesModule->infoML->document()->clear();
3238 QModelIndex const & idx = lv->selectionModel()->currentIndex();
3240 if (!focus_on_selected
3241 && modules_av_model_.itemFromIndex(idx)->hasChildren()) {
3242 // This is a category header
3243 modulesModule->infoML->document()->clear();
3247 string const modName = focus_on_selected ?
3248 modules_sel_model_.getIDString(idx.row())
3249 : fromqstr(modules_av_model_.data(idx, Qt::UserRole).toString());
3250 docstring desc = getModuleDescription(modName);
3252 LayoutModuleList const & provmods = bp_.baseClass()->providedModules();
3253 if (std::find(provmods.begin(), provmods.end(), modName) != provmods.end()) {
3256 desc += _("Module provided by document class.");
3260 docstring cat = getModuleCategory(modName);
3264 desc += bformat(_("<p><b>Category:</b> %1$s.</p>"),
3265 translateIfPossible(cat));
3269 vector<string> pkglist = getPackageList(modName);
3270 docstring pkgdesc = formatStrVec(pkglist, _("and"));
3271 if (!pkgdesc.empty()) {
3274 desc += bformat(_("<p><b>Package(s) required:</b> %1$s.</p>"), pkgdesc);
3277 pkglist = getRequiredList(modName);
3278 if (!pkglist.empty()) {
3279 vector<string> const reqdescs = idsToNames(pkglist);
3280 pkgdesc = formatStrVec(reqdescs, _("or"));
3283 desc += bformat(_("<p><b>Modules required:</b> %1$s.</p>"), pkgdesc);
3286 pkglist = getExcludedList(modName);
3287 if (!pkglist.empty()) {
3288 vector<string> const reqdescs = idsToNames(pkglist);
3289 pkgdesc = formatStrVec(reqdescs, _( "and"));
3292 desc += bformat(_("<p><b>Modules excluded:</b> %1$s.</p>"), pkgdesc);
3297 desc += bformat(_("<p><b>Filename:</b> <tt>%1$s.module</tt>.</p>"), from_utf8(modName));
3299 if (!isModuleAvailable(modName)) {
3302 desc += _("<p><font color=red><b>WARNING: Some required packages are unavailable!</b></font></p>");
3305 modulesModule->infoML->document()->setHtml(toqstr(desc));
3309 void GuiDocument::updateNumbering()
3311 DocumentClass const & tclass = documentClass();
3313 numberingModule->tocTW->setUpdatesEnabled(false);
3314 numberingModule->tocTW->clear();
3316 int const depth = numberingModule->depthSL->value();
3317 int const toc = numberingModule->tocSL->value();
3318 QString const no = qt_("No");
3319 QString const yes = qt_("Yes");
3320 QTreeWidgetItem * item = nullptr;
3322 DocumentClass::const_iterator lit = tclass.begin();
3323 DocumentClass::const_iterator len = tclass.end();
3324 for (; lit != len; ++lit) {
3325 int const toclevel = lit->toclevel;
3326 if (toclevel != Layout::NOT_IN_TOC && !lit->counter.empty()) {
3327 item = new QTreeWidgetItem(numberingModule->tocTW);
3328 item->setText(0, toqstr(translateIfPossible(lit->name())));
3329 item->setText(1, (toclevel <= depth) ? yes : no);
3330 item->setText(2, (toclevel <= toc) ? yes : no);
3334 numberingModule->tocTW->setUpdatesEnabled(true);
3335 numberingModule->tocTW->update();
3339 void GuiDocument::getTableStyles()
3341 // We look for lyx files in the subdirectory dir of
3343 // 2) build_lyxdir (if not empty)
3345 // in this order. Files with a given sub-hierarchy will
3346 // only be listed once.
3347 // We also consider i18n subdirectories and store them separately.
3350 // The three locations to look at.
3351 string const user = addPath(package().user_support().absFileName(), "tabletemplates");
3352 string const build = addPath(package().build_support().absFileName(), "tabletemplates");
3353 string const system = addPath(package().system_support().absFileName(), "tabletemplates");
3355 dirs << toqstr(user)
3359 for (int i = 0; i < dirs.size(); ++i) {
3360 QString const & dir = dirs.at(i);
3361 QDirIterator it(dir, QDir::Files, QDirIterator::Subdirectories);
3362 while (it.hasNext()) {
3363 QString fn = QFileInfo(it.next()).fileName();
3364 if (!fn.endsWith(".lyx") || fn.contains("_1x"))
3366 QString data = fn.left(fn.lastIndexOf(".lyx"));
3367 QString guiname = data;
3368 guiname = toqstr(translateIfPossible(qstring_to_ucs4(guiname.replace('_', ' '))));
3369 QString relpath = toqstr(makeRelPath(qstring_to_ucs4(fn),
3370 qstring_to_ucs4(dir)));
3371 if (textLayoutModule->tableStyleCO->findData(data) == -1)
3372 textLayoutModule->tableStyleCO->addItem(guiname, data);
3378 void GuiDocument::updateDefaultFormat()
3382 // make a copy in order to consider unapplied changes
3383 BufferParams param_copy = buffer().params();
3384 param_copy.useNonTeXFonts = fontModule->osFontsCB->isChecked();
3385 int const idx = latexModule->classCO->currentIndex();
3387 string const classname = fromqstr(latexModule->classCO->getData(idx));
3388 param_copy.setBaseClass(classname, buffer().layoutPos());
3389 param_copy.makeDocumentClass(true);
3391 outputModule->defaultFormatCO->blockSignals(true);
3392 outputModule->defaultFormatCO->clear();
3393 outputModule->defaultFormatCO->addItem(qt_("Default"),
3394 QVariant(QString("default")));
3395 FormatList const & formats =
3396 param_copy.exportableFormats(true);
3397 for (Format const * f : formats)
3398 outputModule->defaultFormatCO->addItem
3399 (toqstr(translateIfPossible(f->prettyname())),
3400 QVariant(toqstr(f->name())));
3401 outputModule->defaultFormatCO->blockSignals(false);
3405 bool GuiDocument::isChildIncluded(string const & child)
3407 if (includeonlys_.empty())
3409 return (std::find(includeonlys_.begin(),
3410 includeonlys_.end(), child) != includeonlys_.end());
3414 void GuiDocument::applyView()
3416 // auto-validate local layout
3417 if (!localLayout->isValid()) {
3418 localLayout->validate();
3419 if (!localLayout->isValid()) {
3420 setApplyStopped(true);
3421 docPS->setCurrentPanel(N_("Local Layout"));
3427 preambleModule->apply(bp_);
3428 localLayout->apply(bp_);
3431 bp_.suppress_date = latexModule->suppressDateCB->isChecked();
3432 bp_.use_refstyle = latexModule->refstyleCB->isChecked();
3435 string const engine =
3436 fromqstr(biblioModule->citeEngineCO->itemData(
3437 biblioModule->citeEngineCO->currentIndex()).toString());
3438 bp_.setCiteEngine(engine);
3440 CiteEngineType const style = CiteEngineType(biblioModule->citeStyleCO->itemData(
3441 biblioModule->citeStyleCO->currentIndex()).toInt());
3442 if (theCiteEnginesList[engine]->hasEngineType(style))
3443 bp_.setCiteEngineType(style);
3445 bp_.setCiteEngineType(ENGINE_TYPE_DEFAULT);
3447 bp_.splitbib(biblioModule->bibtopicCB->isChecked());
3449 bp_.multibib = fromqstr(biblioModule->bibunitsCO->itemData(
3450 biblioModule->bibunitsCO->currentIndex()).toString());
3452 bp_.setDefaultBiblioStyle(fromqstr(biblioModule->defaultBiblioCO->currentText()));
3454 bp_.biblatex_bibstyle = fromqstr(biblioModule->biblatexBbxCO->currentText());
3455 bp_.biblatex_citestyle = fromqstr(biblioModule->biblatexCbxCO->currentText());
3456 bp_.biblio_opts = fromqstr(biblioModule->citePackageOptionsLE->text());
3458 string const bibtex_command =
3459 fromqstr(biblioModule->bibtexCO->itemData(
3460 biblioModule->bibtexCO->currentIndex()).toString());
3461 string const bibtex_options =
3462 fromqstr(biblioModule->bibtexOptionsLE->text());
3463 if (bibtex_command == "default" || bibtex_options.empty())
3464 bp_.bibtex_command = bibtex_command;
3466 bp_.bibtex_command = bibtex_command + " " + bibtex_options;
3468 if (biblioChanged_) {
3469 buffer().invalidateBibinfoCache();
3470 buffer().removeBiblioTempFiles();
3474 indicesModule->apply(bp_);
3476 // language & quotes
3477 switch (langModule->encodingCO->currentIndex()) {
3478 case EncodingSets::unicode: {
3479 if (!fontModule->osFontsCB->isChecked())
3480 bp_.inputenc = fromqstr(langModule->unicodeEncodingCO->itemData(
3481 langModule->unicodeEncodingCO->currentIndex()).toString());
3484 case EncodingSets::legacy: {
3485 bp_.inputenc = "auto-legacy";
3486 bp_.inputenc = fromqstr(langModule->autoEncodingCO->itemData(
3487 langModule->autoEncodingCO->currentIndex()).toString());
3490 case EncodingSets::custom: {
3491 bp_.inputenc = fromqstr(langModule->customEncodingCO->itemData(
3492 langModule->customEncodingCO->currentIndex()).toString());
3496 // this should never happen
3497 bp_.inputenc = "utf8";
3499 bp_.quotes_style = QuoteStyle(langModule->quoteStyleCO->itemData(
3500 langModule->quoteStyleCO->currentIndex()).toInt());
3501 bp_.dynamic_quotes = langModule->dynamicQuotesCB->isChecked();
3503 QString const langname = langModule->languageCO->itemData(
3504 langModule->languageCO->currentIndex()).toString();
3505 Language const * newlang = lyx::languages.getLanguage(fromqstr(langname));
3506 Cursor & cur = const_cast<BufferView *>(bufferview())->cursor();
3507 // If current cursor language was the document language, then update it too.
3508 if (cur.current_font.language() == bp_.language) {
3509 cur.current_font.setLanguage(newlang);
3510 cur.real_current_font.setLanguage(newlang);
3512 bp_.language = newlang;
3514 QString const pack = langModule->languagePackageCO->itemData(
3515 langModule->languagePackageCO->currentIndex()).toString();
3516 if (pack == "custom")
3518 fromqstr(langModule->languagePackageLE->text());
3520 bp_.lang_package = fromqstr(pack);
3523 bp_.backgroundcolor = set_backgroundcolor;
3524 bp_.isbackgroundcolor = is_backgroundcolor;
3525 bp_.fontcolor = set_fontcolor;
3526 bp_.isfontcolor = is_fontcolor;
3527 bp_.notefontcolor = set_notefontcolor;
3528 bp_.isnotefontcolor = is_notefontcolor;
3529 if (is_notefontcolor) {
3530 // Set information used in statusbar (#12130)
3531 lcolor.setColor("notefontcolor", lyx::X11hexname(set_notefontcolor));
3532 lcolor.setGUIName("notefontcolor", N_("greyedout inset text"));
3534 bp_.boxbgcolor = set_boxbgcolor;
3535 bp_.isboxbgcolor = is_boxbgcolor;
3538 if (bp_.documentClass().hasTocLevels()) {
3539 bp_.tocdepth = numberingModule->tocSL->value();
3540 bp_.secnumdepth = numberingModule->depthSL->value();
3542 bp_.use_lineno = numberingModule->linenoCB->isChecked();
3543 bp_.lineno_opts = fromqstr(numberingModule->linenoLE->text());
3546 bp_.user_defined_bullet(0) = bulletsModule->bullet(0);
3547 bp_.user_defined_bullet(1) = bulletsModule->bullet(1);
3548 bp_.user_defined_bullet(2) = bulletsModule->bullet(2);
3549 bp_.user_defined_bullet(3) = bulletsModule->bullet(3);
3552 bp_.graphics_driver =
3553 tex_graphics[latexModule->psdriverCO->currentIndex()];
3556 int idx = latexModule->classCO->currentIndex();
3558 string const classname = fromqstr(latexModule->classCO->getData(idx));
3559 bp_.setBaseClass(classname, buffer().layoutPos());
3563 modulesToParams(bp_);
3566 map<string, string> const & packages = BufferParams::auto_packages();
3567 for (map<string, string>::const_iterator it = packages.begin();
3568 it != packages.end(); ++it) {
3569 QTableWidgetItem * item = mathsModule->packagesTW->findItems(toqstr(it->first), Qt::MatchExactly)[0];
3572 int row = mathsModule->packagesTW->row(item);
3575 (QRadioButton*)mathsModule->packagesTW->cellWidget(row, 1)->layout()->itemAt(0)->widget();
3576 if (rb->isChecked()) {
3577 bp_.use_package(it->first, BufferParams::package_auto);
3580 rb = (QRadioButton*)mathsModule->packagesTW->cellWidget(row, 2)->layout()->itemAt(0)->widget();
3581 if (rb->isChecked()) {
3582 bp_.use_package(it->first, BufferParams::package_on);
3585 rb = (QRadioButton*)mathsModule->packagesTW->cellWidget(row, 3)->layout()->itemAt(0)->widget();
3586 if (rb->isChecked())
3587 bp_.use_package(it->first, BufferParams::package_off);
3589 // if math is indented
3590 bp_.is_math_indent = mathsModule->MathIndentCB->isChecked();
3591 if (bp_.is_math_indent) {
3592 // if formulas are indented
3593 if (mathsModule->MathIndentCO->itemData(mathsModule->MathIndentCO->currentIndex()) == "custom") {
3594 Length mathindent(widgetsToLength(mathsModule->MathIndentLE,
3595 mathsModule->MathIndentLengthCO));
3596 bp_.setMathIndent(mathindent);
3599 bp_.setMathIndent(Length());
3601 switch (mathsModule->MathNumberingPosCO->currentIndex()) {
3603 bp_.math_numbering_side = BufferParams::LEFT;
3606 bp_.math_numbering_side = BufferParams::DEFAULT;
3609 bp_.math_numbering_side = BufferParams::RIGHT;
3612 // this should never happen
3613 bp_.math_numbering_side = BufferParams::DEFAULT;
3618 if (pageLayoutModule->pagestyleCO->currentIndex() == 0)
3619 bp_.pagestyle = "default";
3621 QString style_gui = pageLayoutModule->pagestyleCO->currentText();
3622 for (size_t i = 0; i != pagestyles.size(); ++i)
3623 if (pagestyles[i].second == style_gui)
3624 bp_.pagestyle = pagestyles[i].first;
3628 switch (textLayoutModule->lspacingCO->currentIndex()) {
3630 bp_.spacing().set(Spacing::Single);
3633 bp_.spacing().set(Spacing::Onehalf);
3636 bp_.spacing().set(Spacing::Double);
3639 string s = widgetToDoubleStr(textLayoutModule->lspacingLE);
3641 bp_.spacing().set(Spacing::Single);
3643 bp_.spacing().set(Spacing::Other, s);
3648 if (textLayoutModule->twoColumnCB->isChecked())
3653 bp_.justification = textLayoutModule->justCB->isChecked();
3655 if (textLayoutModule->indentRB->isChecked()) {
3656 // if paragraphs are separated by an indentation
3657 bp_.paragraph_separation = BufferParams::ParagraphIndentSeparation;
3658 if (textLayoutModule->indentCO->itemData(textLayoutModule->indentCO->currentIndex()) == "custom") {
3659 Length parindent(widgetsToLength(textLayoutModule->indentLE,
3660 textLayoutModule->indentLengthCO));
3661 bp_.setParIndent(parindent);
3664 bp_.setParIndent(Length());
3666 // if paragraphs are separated by a skip
3667 bp_.paragraph_separation = BufferParams::ParagraphSkipSeparation;
3668 VSpace::VSpaceKind spacekind =
3669 VSpace::VSpaceKind(textLayoutModule->skipCO->itemData(textLayoutModule->skipCO->currentIndex()).toInt());
3670 switch (spacekind) {
3671 case VSpace::SMALLSKIP:
3672 case VSpace::MEDSKIP:
3673 case VSpace::BIGSKIP:
3674 case VSpace::HALFLINE:
3675 case VSpace::FULLLINE:
3676 bp_.setDefSkip(VSpace(spacekind));
3678 case VSpace::LENGTH: {
3680 widgetsToLength(textLayoutModule->skipLE,
3681 textLayoutModule->skipLengthCO)
3687 // this should never happen
3688 bp_.setDefSkip(VSpace(VSpace::MEDSKIP));
3692 bp_.tablestyle = fromqstr(textLayoutModule->tableStyleCO->itemData(
3693 textLayoutModule->tableStyleCO->currentIndex()).toString());
3696 fromqstr(latexModule->optionsLE->text());
3698 bp_.use_default_options =
3699 latexModule->defaultOptionsCB->isChecked();
3701 if (latexModule->childDocGB->isChecked())
3703 fromqstr(latexModule->childDocLE->text());
3705 bp_.master = string();
3708 bp_.clearIncludedChildren();
3709 if (masterChildModule->includeonlyRB->isChecked()) {
3710 list<string>::const_iterator it = includeonlys_.begin();
3711 for (; it != includeonlys_.end() ; ++it) {
3712 bp_.addIncludedChildren(*it);
3715 if (masterChildModule->maintainCRNoneRB->isChecked())
3716 bp_.maintain_unincluded_children =
3717 BufferParams::CM_None;
3718 else if (masterChildModule->maintainCRMostlyRB->isChecked())
3719 bp_.maintain_unincluded_children =
3720 BufferParams::CM_Mostly;
3722 bp_.maintain_unincluded_children =
3723 BufferParams::CM_Strict;
3724 updateIncludeonlyDisplay();
3727 bp_.float_placement = floatModule->getPlacement();
3728 bp_.float_alignment = floatModule->getAlignment();
3731 // text should have passed validation
3732 idx = listingsModule->packageCO->currentIndex();
3733 bp_.use_minted = string(lst_packages[idx]) == "Minted";
3734 bp_.listings_params =
3735 InsetListingsParams(fromqstr(listingsModule->listingsED->toPlainText())).params();
3738 bp_.default_output_format = fromqstr(outputModule->defaultFormatCO->itemData(
3739 outputModule->defaultFormatCO->currentIndex()).toString());
3741 bool const nontexfonts = fontModule->osFontsCB->isChecked();
3742 bp_.useNonTeXFonts = nontexfonts;
3744 bp_.shell_escape = outputModule->shellescapeCB->isChecked();
3745 if (!bp_.shell_escape)
3746 theSession().shellescapeFiles().remove(buffer().absFileName());
3747 else if (!theSession().shellescapeFiles().find(buffer().absFileName()))
3748 theSession().shellescapeFiles().insert(buffer().absFileName());
3749 Buffer & buf = const_cast<Buffer &>(buffer());
3750 buf.params().shell_escape = bp_.shell_escape;
3752 bp_.output_sync = outputModule->outputsyncCB->isChecked();
3754 bp_.output_sync_macro = fromqstr(outputModule->synccustomCB->currentText());
3756 int mathfmt = outputModule->mathoutCB->currentIndex();
3759 BufferParams::MathOutput const mo =
3760 static_cast<BufferParams::MathOutput>(mathfmt);
3761 bp_.html_math_output = mo;
3762 bp_.html_be_strict = outputModule->strictCB->isChecked();
3763 bp_.html_css_as_file = outputModule->cssCB->isChecked();
3764 bp_.html_math_img_scale = outputModule->mathimgSB->value();
3765 bp_.display_pixel_ratio = theGuiApp()->pixelRatio();
3767 int tablefmt = outputModule->tableoutCB->currentIndex();
3770 auto const to = static_cast<BufferParams::TableOutput>(tablefmt);
3771 bp_.docbook_table_output = to;
3773 int mathmlprefix = outputModule->mathmlprefixCB->currentIndex();
3774 if (mathmlprefix == -1)
3776 auto const mp = static_cast<BufferParams::MathMLNameSpacePrefix>(mathmlprefix);
3777 bp_.docbook_mathml_prefix = mp;
3779 bp_.save_transient_properties =
3780 outputModule->saveTransientPropertiesCB->isChecked();
3781 bp_.postpone_fragile_content =
3782 outputModule->postponeFragileCB->isChecked();
3785 bp_.fonts_roman[nontexfonts] =
3786 fromqstr(fontModule->fontsRomanCO->
3787 itemData(fontModule->fontsRomanCO->currentIndex()).toString());
3788 bp_.fonts_roman[!nontexfonts] = fromqstr(fontModule->font_roman);
3789 bp_.font_roman_opts = fromqstr(fontModule->fontspecRomanLE->text());
3791 bp_.fonts_sans[nontexfonts] =
3792 fromqstr(fontModule->fontsSansCO->
3793 itemData(fontModule->fontsSansCO->currentIndex()).toString());
3794 bp_.fonts_sans[!nontexfonts] = fromqstr(fontModule->font_sans);
3795 bp_.font_sans_opts = fromqstr(fontModule->fontspecSansLE->text());
3797 bp_.fonts_typewriter[nontexfonts] =
3798 fromqstr(fontModule->fontsTypewriterCO->
3799 itemData(fontModule->fontsTypewriterCO->currentIndex()).toString());
3800 bp_.fonts_typewriter[!nontexfonts] = fromqstr(fontModule->font_typewriter);
3801 bp_.font_typewriter_opts = fromqstr(fontModule->fontspecTypewriterLE->text());
3803 bp_.fonts_math[nontexfonts] =
3804 fromqstr(fontModule->fontsMathCO->
3805 itemData(fontModule->fontsMathCO->currentIndex()).toString());
3806 bp_.fonts_math[!nontexfonts] = fromqstr(fontModule->font_math);
3808 QString const fontenc =
3809 fontModule->fontencCO->itemData(fontModule->fontencCO->currentIndex()).toString();
3810 if (fontenc == "custom")
3811 bp_.fontenc = fromqstr(fontModule->fontencLE->text());
3813 bp_.fontenc = fromqstr(fontenc);
3816 fromqstr(fontModule->cjkFontLE->text());
3818 bp_.use_microtype = fontModule->microtypeCB->isChecked();
3819 bp_.use_dash_ligatures = !fontModule->dashesCB->isChecked();
3821 bp_.fonts_sans_scale[nontexfonts] = fontModule->scaleSansSB->value();
3822 bp_.fonts_sans_scale[!nontexfonts] = fontModule->font_sf_scale;
3824 bp_.fonts_typewriter_scale[nontexfonts] = fontModule->scaleTypewriterSB->value();
3825 bp_.fonts_typewriter_scale[!nontexfonts] = fontModule->font_tt_scale;
3827 bp_.fonts_expert_sc = fontModule->fontScCB->isChecked();
3829 bp_.fonts_roman_osf = fontModule->fontOsfCB->isChecked();
3830 bp_.fonts_sans_osf = fontModule->fontSansOsfCB->isChecked();
3831 bp_.fonts_typewriter_osf = fontModule->fontTypewriterOsfCB->isChecked();
3834 bp_.fonts_default_family = "default";
3836 bp_.fonts_default_family = GuiDocument::fontfamilies[
3837 fontModule->fontsDefaultCO->currentIndex()];
3839 if (fontModule->fontsizeCO->currentIndex() == 0)
3840 bp_.fontsize = "default";
3843 fromqstr(fontModule->fontsizeCO->currentText());
3846 bp_.papersize = PAPER_SIZE(
3847 pageLayoutModule->papersizeCO->currentIndex());
3849 bp_.paperwidth = widgetsToLength(pageLayoutModule->paperwidthLE,
3850 pageLayoutModule->paperwidthUnitCO);
3852 bp_.paperheight = widgetsToLength(pageLayoutModule->paperheightLE,
3853 pageLayoutModule->paperheightUnitCO);
3855 if (pageLayoutModule->facingPagesCB->isChecked())
3856 bp_.sides = TwoSides;
3858 bp_.sides = OneSide;
3860 if (pageLayoutModule->landscapeRB->isChecked())
3861 bp_.orientation = ORIENTATION_LANDSCAPE;
3863 bp_.orientation = ORIENTATION_PORTRAIT;
3866 bp_.use_geometry = !marginsModule->marginCB->isChecked();
3868 Ui::MarginsUi const * m = marginsModule;
3870 bp_.leftmargin = widgetsToLength(m->innerLE, m->innerUnit);
3871 bp_.topmargin = widgetsToLength(m->topLE, m->topUnit);
3872 bp_.rightmargin = widgetsToLength(m->outerLE, m->outerUnit);
3873 bp_.bottommargin = widgetsToLength(m->bottomLE, m->bottomUnit);
3874 bp_.headheight = widgetsToLength(m->headheightLE, m->headheightUnit);
3875 bp_.headsep = widgetsToLength(m->headsepLE, m->headsepUnit);
3876 bp_.footskip = widgetsToLength(m->footskipLE, m->footskipUnit);
3877 bp_.columnsep = widgetsToLength(m->columnsepLE, m->columnsepUnit);
3880 branchesModule->apply(bp_);
3883 PDFOptions & pdf = bp_.pdfoptions();
3884 pdf.use_hyperref = pdfSupportModule->use_hyperrefGB->isChecked();
3885 pdf.title = fromqstr(pdfSupportModule->titleLE->text());
3886 pdf.author = fromqstr(pdfSupportModule->authorLE->text());
3887 pdf.subject = fromqstr(pdfSupportModule->subjectLE->text());
3888 pdf.keywords = fromqstr(pdfSupportModule->keywordsLE->text());
3890 pdf.bookmarks = pdfSupportModule->bookmarksGB->isChecked();
3891 pdf.bookmarksnumbered = pdfSupportModule->bookmarksnumberedCB->isChecked();
3892 pdf.bookmarksopen = pdfSupportModule->bookmarksopenGB->isChecked();
3893 pdf.bookmarksopenlevel = pdfSupportModule->bookmarksopenlevelSB->value();
3895 pdf.breaklinks = pdfSupportModule->breaklinksCB->isChecked();
3896 pdf.pdfborder = pdfSupportModule->pdfborderCB->isChecked();
3897 pdf.pdfusetitle = pdfSupportModule->pdfusetitleCB->isChecked();
3898 pdf.colorlinks = pdfSupportModule->colorlinksCB->isChecked();
3900 backref_opts[pdfSupportModule->backrefCO->currentIndex()];
3901 if (pdfSupportModule->fullscreenCB->isChecked())
3902 pdf.pagemode = pdf.pagemode_fullscreen;
3904 pdf.pagemode.clear();
3905 pdf.quoted_options = pdf.quoted_options_check(
3906 fromqstr(pdfSupportModule->optionsTE->toPlainText()));
3907 #if QT_VERSION < 0x060000
3908 bp_.document_metadata = qstring_to_ucs4(pdfSupportModule->metadataTE->toPlainText()
3909 .trimmed().replace(QRegExp("\n+"), "\n"));
3911 bp_.document_metadata = qstring_to_ucs4(pdfSupportModule->metadataTE->toPlainText()
3912 .trimmed().replace(QRegularExpression("\n+"), "\n"));
3916 bp_.track_changes = changesModule->trackChangesCB->isChecked();
3917 bp_.output_changes = changesModule->outputChangesCB->isChecked();
3918 bool const cb_switched_off = (bp_.change_bars
3919 && !changesModule->changeBarsCB->isChecked());
3920 bp_.change_bars = changesModule->changeBarsCB->isChecked();
3921 if (cb_switched_off)
3922 // if change bars have been switched off,
3923 // we need to ditch the aux file
3924 buffer().requireFreshStart(true);
3927 nonModuleChanged_ = false;
3928 shellescapeChanged_ = false;
3932 void GuiDocument::paramsToDialog()
3934 // set the default unit
3935 Length::UNIT const default_unit = Length::defaultUnit();
3938 preambleModule->update(bp_, id());
3939 localLayout->update(bp_, id());
3942 latexModule->suppressDateCB->setChecked(bp_.suppress_date);
3943 latexModule->refstyleCB->setChecked(bp_.use_refstyle);
3946 string const cite_engine = bp_.citeEngine();
3948 biblioModule->citeEngineCO->setCurrentIndex(
3949 biblioModule->citeEngineCO->findData(toqstr(cite_engine)));
3951 updateEngineType(documentClass().opt_enginetype(),
3952 bp_.citeEngineType());
3954 checkPossibleCiteEngines();
3956 biblioModule->citeStyleCO->setCurrentIndex(
3957 biblioModule->citeStyleCO->findData(bp_.citeEngineType()));
3959 biblioModule->bibtopicCB->setChecked(bp_.splitbib());
3961 biblioModule->bibunitsCO->clear();
3962 biblioModule->bibunitsCO->addItem(qt_("No"), QString());
3963 if (documentClass().hasLaTeXLayout("part"))
3964 biblioModule->bibunitsCO->addItem(qt_("per part"), toqstr("part"));
3965 if (documentClass().hasLaTeXLayout("chapter"))
3966 biblioModule->bibunitsCO->addItem(qt_("per chapter"), toqstr("chapter"));
3967 if (documentClass().hasLaTeXLayout("section"))
3968 biblioModule->bibunitsCO->addItem(qt_("per section"), toqstr("section"));
3969 if (documentClass().hasLaTeXLayout("subsection"))
3970 biblioModule->bibunitsCO->addItem(qt_("per subsection"), toqstr("subsection"));
3971 biblioModule->bibunitsCO->addItem(qt_("per child document"), toqstr("child"));
3973 int const mbpos = biblioModule->bibunitsCO->findData(toqstr(bp_.multibib));
3975 biblioModule->bibunitsCO->setCurrentIndex(mbpos);
3977 biblioModule->bibunitsCO->setCurrentIndex(0);
3979 updateEngineDependends();
3982 updateDefaultBiblio(bp_.biblatex_bibstyle, "bbx");
3983 updateDefaultBiblio(bp_.biblatex_citestyle, "cbx");
3985 updateDefaultBiblio(bp_.defaultBiblioStyle());
3987 biblioModule->citePackageOptionsLE->setText(toqstr(bp_.biblio_opts));
3991 split(bp_.bibtex_command, command, ' ');
3993 int bpos = biblioModule->bibtexCO->findData(toqstr(command));
3995 // We add and set the unknown compiler, indicating that it is unavailable
3996 // to assure document compilation and for security reasons, a fallback
3997 // will be used on document processing stage
3998 biblioModule->bibtexCO->addItem(toqstr(bformat(_("%1$s (not available)"),
3999 from_utf8(command))), toqstr(command));
4000 bpos = biblioModule->bibtexCO->findData(toqstr(command));
4002 biblioModule->bibtexCO->setCurrentIndex(bpos);
4003 biblioModule->bibtexOptionsLE->setText(toqstr(options).trimmed());
4004 biblioModule->bibtexOptionsLE->setEnabled(
4005 biblioModule->bibtexCO->currentIndex() != 0);
4007 biblioChanged_ = false;
4010 // We may be called when there is no Buffer, e.g., when
4011 // the last view has just been closed.
4012 bool const isReadOnly = isBufferAvailable() ? buffer().isReadonly() : false;
4013 indicesModule->update(bp_, isReadOnly);
4015 // language & quotes
4016 int const pos = langModule->languageCO->findData(toqstr(
4017 bp_.language->lang()));
4018 langModule->languageCO->setCurrentIndex(pos);
4020 updateQuoteStyles();
4022 langModule->quoteStyleCO->setCurrentIndex(
4023 langModule->quoteStyleCO->findData(static_cast<int>(bp_.quotes_style)));
4024 langModule->dynamicQuotesCB->setChecked(bp_.dynamic_quotes);
4026 // LaTeX input encoding: set after the fonts (see below)
4028 int p = langModule->languagePackageCO->findData(toqstr(bp_.lang_package));
4030 langModule->languagePackageCO->setCurrentIndex(
4031 langModule->languagePackageCO->findData("custom"));
4032 langModule->languagePackageLE->setText(toqstr(bp_.lang_package));
4034 langModule->languagePackageCO->setCurrentIndex(p);
4035 langModule->languagePackageLE->clear();
4039 if (bp_.isfontcolor) {
4040 colorModule->fontColorPB->setStyleSheet(
4041 colorButtonStyleSheet(rgb2qcolor(bp_.fontcolor)));
4043 set_fontcolor = bp_.fontcolor;
4044 is_fontcolor = bp_.isfontcolor;
4046 colorModule->noteFontColorPB->setStyleSheet(
4047 colorButtonStyleSheet(rgb2qcolor(bp_.notefontcolor)));
4048 set_notefontcolor = bp_.notefontcolor;
4049 is_notefontcolor = bp_.isnotefontcolor;
4051 if (bp_.isbackgroundcolor) {
4052 colorModule->backgroundPB->setStyleSheet(
4053 colorButtonStyleSheet(rgb2qcolor(bp_.backgroundcolor)));
4055 set_backgroundcolor = bp_.backgroundcolor;
4056 is_backgroundcolor = bp_.isbackgroundcolor;
4058 colorModule->boxBackgroundPB->setStyleSheet(
4059 colorButtonStyleSheet(rgb2qcolor(bp_.boxbgcolor)));
4060 set_boxbgcolor = bp_.boxbgcolor;
4061 is_boxbgcolor = bp_.isboxbgcolor;
4064 int const min_toclevel = documentClass().min_toclevel();
4065 int const max_toclevel = documentClass().max_toclevel();
4066 if (documentClass().hasTocLevels()) {
4067 numberingModule->setEnabled(true);
4068 numberingModule->depthSL->setMinimum(min_toclevel - 1);
4069 numberingModule->depthSL->setMaximum(max_toclevel);
4070 numberingModule->depthSL->setValue(bp_.secnumdepth);
4071 numberingModule->tocSL->setMaximum(min_toclevel - 1);
4072 numberingModule->tocSL->setMaximum(max_toclevel);
4073 numberingModule->tocSL->setValue(bp_.tocdepth);
4076 numberingModule->setEnabled(false);
4077 numberingModule->tocTW->clear();
4080 numberingModule->linenoCB->setChecked(bp_.use_lineno);
4081 numberingModule->linenoLE->setEnabled(bp_.use_lineno);
4082 numberingModule->linenoLA->setEnabled(bp_.use_lineno);
4083 numberingModule->linenoLE->setText(toqstr(bp_.lineno_opts));
4086 bulletsModule->setBullet(0, bp_.user_defined_bullet(0));
4087 bulletsModule->setBullet(1, bp_.user_defined_bullet(1));
4088 bulletsModule->setBullet(2, bp_.user_defined_bullet(2));
4089 bulletsModule->setBullet(3, bp_.user_defined_bullet(3));
4090 bulletsModule->init();
4093 int nitem = findToken(tex_graphics, bp_.graphics_driver);
4095 latexModule->psdriverCO->setCurrentIndex(nitem);
4099 mathsModule->MathIndentCB->setChecked(bp_.is_math_indent);
4100 if (bp_.is_math_indent) {
4101 Length const mathindent = bp_.getMathIndent();
4103 if (!mathindent.empty()) {
4104 lengthToWidgets(mathsModule->MathIndentLE,
4105 mathsModule->MathIndentLengthCO,
4106 mathindent, default_unit);
4109 mathsModule->MathIndentCO->setCurrentIndex(indent);
4110 enableMathIndent(indent);
4112 switch(bp_.math_numbering_side) {
4113 case BufferParams::LEFT:
4114 mathsModule->MathNumberingPosCO->setCurrentIndex(0);
4116 case BufferParams::DEFAULT:
4117 mathsModule->MathNumberingPosCO->setCurrentIndex(1);
4119 case BufferParams::RIGHT:
4120 mathsModule->MathNumberingPosCO->setCurrentIndex(2);
4123 map<string, string> const & packages = BufferParams::auto_packages();
4124 for (map<string, string>::const_iterator it = packages.begin();
4125 it != packages.end(); ++it) {
4126 QTableWidgetItem * item = mathsModule->packagesTW->findItems(toqstr(it->first), Qt::MatchExactly)[0];
4129 int row = mathsModule->packagesTW->row(item);
4130 switch (bp_.use_package(it->first)) {
4131 case BufferParams::package_off: {
4133 (QRadioButton*)mathsModule->packagesTW->cellWidget(row, 3)->layout()->itemAt(0)->widget();
4134 rb->setChecked(true);
4137 case BufferParams::package_on: {
4139 (QRadioButton*)mathsModule->packagesTW->cellWidget(row, 2)->layout()->itemAt(0)->widget();
4140 rb->setChecked(true);
4143 case BufferParams::package_auto: {
4145 (QRadioButton*)mathsModule->packagesTW->cellWidget(row, 1)->layout()->itemAt(0)->widget();
4146 rb->setChecked(true);
4152 switch (bp_.spacing().getSpace()) {
4153 case Spacing::Other: nitem = 3; break;
4154 case Spacing::Double: nitem = 2; break;
4155 case Spacing::Onehalf: nitem = 1; break;
4156 case Spacing::Default: case Spacing::Single: nitem = 0; break;
4160 string const & layoutID = bp_.baseClassID();
4161 setLayoutComboByIDString(layoutID);
4163 updatePagestyle(documentClass().opt_pagestyle(),
4166 textLayoutModule->lspacingCO->setCurrentIndex(nitem);
4167 if (bp_.spacing().getSpace() == Spacing::Other) {
4168 doubleToWidget(textLayoutModule->lspacingLE,
4169 bp_.spacing().getValueAsString());
4172 int ts = textLayoutModule->tableStyleCO->findData(toqstr(bp_.tablestyle));
4174 textLayoutModule->tableStyleCO->setCurrentIndex(ts);
4176 if (bp_.paragraph_separation == BufferParams::ParagraphIndentSeparation) {
4177 textLayoutModule->indentRB->setChecked(true);
4178 string parindent = bp_.getParIndent().asString();
4179 QString indent = toqstr("default");
4180 if (!parindent.empty()) {
4181 lengthToWidgets(textLayoutModule->indentLE,
4182 textLayoutModule->indentLengthCO,
4183 parindent, default_unit);
4184 indent = toqstr("custom");
4186 textLayoutModule->indentCO->setCurrentIndex(textLayoutModule->indentCO->findData(indent));
4187 setIndent(textLayoutModule->indentCO->currentIndex());
4189 textLayoutModule->skipRB->setChecked(true);
4190 VSpace::VSpaceKind skip = bp_.getDefSkip().kind();
4191 textLayoutModule->skipCO->setCurrentIndex(textLayoutModule->skipCO->findData(skip));
4192 if (skip == VSpace::LENGTH) {
4193 string const length = bp_.getDefSkip().asLyXCommand();
4194 lengthToWidgets(textLayoutModule->skipLE,
4195 textLayoutModule->skipLengthCO,
4196 length, default_unit);
4198 setSkip(textLayoutModule->skipCO->currentIndex());
4201 textLayoutModule->twoColumnCB->setChecked(
4203 textLayoutModule->justCB->setChecked(bp_.justification);
4205 if (!bp_.options.empty()) {
4206 latexModule->optionsLE->setText(
4207 toqstr(bp_.options));
4209 latexModule->optionsLE->setText(QString());
4213 latexModule->defaultOptionsCB->setChecked(
4214 bp_.use_default_options);
4215 updateSelectedModules();
4216 selectionManager->updateProvidedModules(
4217 bp_.baseClass()->providedModules());
4218 selectionManager->updateExcludedModules(
4219 bp_.baseClass()->excludedModules());
4221 if (!documentClass().options().empty()) {
4222 latexModule->defaultOptionsLE->setText(
4223 toqstr(documentClass().options()));
4225 latexModule->defaultOptionsLE->setText(
4226 toqstr(_("[No options predefined]")));
4229 latexModule->defaultOptionsLE->setEnabled(
4230 bp_.use_default_options
4231 && !documentClass().options().empty());
4233 latexModule->defaultOptionsCB->setEnabled(
4234 !documentClass().options().empty());
4236 if (!bp_.master.empty()) {
4237 latexModule->childDocGB->setChecked(true);
4238 latexModule->childDocLE->setText(
4239 toqstr(bp_.master));
4241 latexModule->childDocLE->setText(QString());
4242 latexModule->childDocGB->setChecked(false);
4246 if (!bufferview() || !buffer().hasChildren()) {
4247 masterChildModule->childrenTW->clear();
4248 includeonlys_.clear();
4249 docPS->showPanel("Child Documents", false);
4250 if (docPS->isCurrentPanel("Child Documents"))
4251 docPS->setCurrentPanel("Document Class");
4253 docPS->showPanel("Child Documents", true);
4254 masterChildModule->setEnabled(true);
4255 includeonlys_ = bp_.getIncludedChildren();
4256 updateIncludeonlys();
4257 updateIncludeonlyDisplay();
4259 switch (bp_.maintain_unincluded_children) {
4260 case BufferParams::CM_None:
4261 masterChildModule->maintainCRNoneRB->setChecked(true);
4263 case BufferParams::CM_Mostly:
4264 masterChildModule->maintainCRMostlyRB->setChecked(true);
4266 case BufferParams::CM_Strict:
4268 masterChildModule->maintainCRStrictRB->setChecked(true);
4273 floatModule->setPlacement(bp_.float_placement);
4274 floatModule->setAlignment(bp_.float_alignment);
4277 // break listings_params to multiple lines
4279 InsetListingsParams(bp_.listings_params).separatedParams();
4280 listingsModule->listingsED->setPlainText(toqstr(lstparams));
4281 int nn = findToken(lst_packages, bp_.use_minted ? "Minted" : "Listings");
4283 listingsModule->packageCO->setCurrentIndex(nn);
4286 // some languages only work with Polyglossia (which requires non-TeX fonts)
4287 Language const * lang = lyx::languages.getLanguage(
4288 fromqstr(langModule->languageCO->itemData(
4289 langModule->languageCO->currentIndex()).toString()));
4290 bool const need_fontspec =
4291 lang->babel().empty() && !lang->polyglossia().empty()
4292 && lang->required() != "CJK" && lang->required() != "japanese";
4293 bool const os_fonts_available =
4294 bp_.baseClass()->outputType() == lyx::LATEX
4295 && LaTeXFeatures::isAvailable("fontspec");
4296 fontModule->osFontsCB->setEnabled(os_fonts_available && !need_fontspec);
4297 fontModule->osFontsCB->setChecked(
4298 (os_fonts_available && bp_.useNonTeXFonts) || need_fontspec);
4299 updateFontsize(documentClass().opt_fontsize(),
4302 QString font = toqstr(bp_.fontsRoman());
4303 int rpos = fontModule->fontsRomanCO->findData(font);
4305 rpos = fontModule->fontsRomanCO->count();
4306 fontModule->fontsRomanCO->addItem(font + qt_(" (not installed)"), font);
4308 fontModule->fontsRomanCO->setCurrentIndex(rpos);
4309 fontModule->font_roman = toqstr(bp_.fonts_roman[!bp_.useNonTeXFonts]);
4311 font = toqstr(bp_.fontsSans());
4312 int spos = fontModule->fontsSansCO->findData(font);
4314 spos = fontModule->fontsSansCO->count();
4315 fontModule->fontsSansCO->addItem(font + qt_(" (not installed)"), font);
4317 fontModule->fontsSansCO->setCurrentIndex(spos);
4318 fontModule->font_sans = toqstr(bp_.fonts_sans[!bp_.useNonTeXFonts]);
4320 font = toqstr(bp_.fontsTypewriter());
4321 int tpos = fontModule->fontsTypewriterCO->findData(font);
4323 tpos = fontModule->fontsTypewriterCO->count();
4324 fontModule->fontsTypewriterCO->addItem(font + qt_(" (not installed)"), font);
4326 fontModule->fontsTypewriterCO->setCurrentIndex(tpos);
4327 fontModule->font_typewriter = toqstr(bp_.fonts_typewriter[!bp_.useNonTeXFonts]);
4329 font = toqstr(bp_.fontsMath());
4330 int mpos = fontModule->fontsMathCO->findData(font);
4332 mpos = fontModule->fontsMathCO->count();
4333 fontModule->fontsMathCO->addItem(font + qt_(" (not installed)"), font);
4335 fontModule->fontsMathCO->setCurrentIndex(mpos);
4336 fontModule->font_math = toqstr(bp_.fonts_math[!bp_.useNonTeXFonts]);
4338 if (bp_.useNonTeXFonts && os_fonts_available) {
4339 fontModule->fontencLA->setEnabled(false);
4340 fontModule->fontencCO->setEnabled(false);
4341 fontModule->fontencLE->setEnabled(false);
4343 fontModule->fontencLA->setEnabled(true);
4344 fontModule->fontencCO->setEnabled(true);
4345 fontModule->fontencLE->setEnabled(true);
4351 if (!bp_.fonts_cjk.empty())
4352 fontModule->cjkFontLE->setText(
4353 toqstr(bp_.fonts_cjk));
4355 fontModule->cjkFontLE->setText(QString());
4357 fontModule->microtypeCB->setChecked(bp_.use_microtype);
4358 fontModule->dashesCB->setChecked(!bp_.use_dash_ligatures);
4360 fontModule->fontScCB->setChecked(bp_.fonts_expert_sc);
4361 fontModule->fontOsfCB->setChecked(bp_.fonts_roman_osf);
4362 fontModule->fontSansOsfCB->setChecked(bp_.fonts_sans_osf);
4363 fontModule->fontTypewriterOsfCB->setChecked(bp_.fonts_typewriter_osf);
4364 fontModule->scaleSansSB->setValue(bp_.fontsSansScale());
4365 fontModule->font_sf_scale = bp_.fonts_sans_scale[!bp_.useNonTeXFonts];
4366 fontModule->scaleTypewriterSB->setValue(bp_.fontsTypewriterScale());
4367 fontModule->font_tt_scale = bp_.fonts_typewriter_scale[!bp_.useNonTeXFonts];
4368 if (!bp_.font_roman_opts.empty())
4369 fontModule->fontspecRomanLE->setText(
4370 toqstr(bp_.font_roman_opts));
4372 fontModule->fontspecRomanLE->setText(QString());
4373 if (!bp_.font_sans_opts.empty())
4374 fontModule->fontspecSansLE->setText(
4375 toqstr(bp_.font_sans_opts));
4377 fontModule->fontspecSansLE->setText(QString());
4378 if (!bp_.font_typewriter_opts.empty())
4379 fontModule->fontspecTypewriterLE->setText(
4380 toqstr(bp_.font_typewriter_opts));
4382 fontModule->fontspecTypewriterLE->setText(QString());
4384 nn = findToken(GuiDocument::fontfamilies, bp_.fonts_default_family);
4386 fontModule->fontsDefaultCO->setCurrentIndex(nn);
4388 if (bp_.fontenc == "auto" || bp_.fontenc == "default") {
4389 fontModule->fontencCO->setCurrentIndex(
4390 fontModule->fontencCO->findData(toqstr(bp_.fontenc)));
4391 fontModule->fontencLE->setEnabled(false);
4393 fontModule->fontencCO->setCurrentIndex(
4394 fontModule->fontencCO->findData("custom"));
4395 fontModule->fontencLE->setText(toqstr(bp_.fontenc));
4398 // LaTeX input encoding
4399 // Set after fonts because non-tex fonts override "\inputencoding".
4400 inputencodingToDialog();
4403 // This must be set _after_ fonts since updateDefaultFormat()
4404 // checks osFontsCB settings.
4405 // update combobox with formats
4406 updateDefaultFormat();
4407 int index = outputModule->defaultFormatCO->findData(toqstr(
4408 bp_.default_output_format));
4409 // set to default if format is not found
4412 outputModule->defaultFormatCO->setCurrentIndex(index);
4414 outputModule->shellescapeCB->setChecked(bp_.shell_escape);
4415 outputModule->outputsyncCB->setChecked(bp_.output_sync);
4416 outputModule->synccustomCB->setEditText(toqstr(bp_.output_sync_macro));
4417 outputModule->synccustomCB->setEnabled(bp_.output_sync);
4418 outputModule->synccustomLA->setEnabled(bp_.output_sync);
4420 outputModule->mathimgSB->setValue(bp_.html_math_img_scale);
4421 outputModule->mathoutCB->setCurrentIndex(bp_.html_math_output);
4422 outputModule->strictCB->setChecked(bp_.html_be_strict);
4423 outputModule->cssCB->setChecked(bp_.html_css_as_file);
4425 outputModule->tableoutCB->setCurrentIndex(bp_.docbook_table_output);
4426 outputModule->mathmlprefixCB->setCurrentIndex(bp_.docbook_mathml_prefix);
4428 outputModule->saveTransientPropertiesCB
4429 ->setChecked(bp_.save_transient_properties);
4430 outputModule->postponeFragileCB
4431 ->setChecked(bp_.postpone_fragile_content);
4434 bool const extern_geometry =
4435 documentClass().provides("geometry");
4436 int const psize = bp_.papersize;
4437 pageLayoutModule->papersizeCO->setCurrentIndex(psize);
4438 setCustomPapersize(!extern_geometry && psize == 1);
4439 pageLayoutModule->papersizeCO->setEnabled(!extern_geometry);
4441 bool const landscape =
4442 bp_.orientation == ORIENTATION_LANDSCAPE;
4443 pageLayoutModule->landscapeRB->setChecked(landscape);
4444 pageLayoutModule->portraitRB->setChecked(!landscape);
4445 pageLayoutModule->landscapeRB->setEnabled(!extern_geometry);
4446 pageLayoutModule->portraitRB->setEnabled(!extern_geometry);
4448 pageLayoutModule->facingPagesCB->setChecked(
4449 bp_.sides == TwoSides);
4451 lengthToWidgets(pageLayoutModule->paperwidthLE,
4452 pageLayoutModule->paperwidthUnitCO, bp_.paperwidth, default_unit);
4453 lengthToWidgets(pageLayoutModule->paperheightLE,
4454 pageLayoutModule->paperheightUnitCO, bp_.paperheight, default_unit);
4457 Ui::MarginsUi * m = marginsModule;
4461 lengthToWidgets(m->topLE, m->topUnit,
4462 bp_.topmargin, default_unit);
4464 lengthToWidgets(m->bottomLE, m->bottomUnit,
4465 bp_.bottommargin, default_unit);
4467 lengthToWidgets(m->innerLE, m->innerUnit,
4468 bp_.leftmargin, default_unit);
4470 lengthToWidgets(m->outerLE, m->outerUnit,
4471 bp_.rightmargin, default_unit);
4473 lengthToWidgets(m->headheightLE, m->headheightUnit,
4474 bp_.headheight, default_unit);
4476 lengthToWidgets(m->headsepLE, m->headsepUnit,
4477 bp_.headsep, default_unit);
4479 lengthToWidgets(m->footskipLE, m->footskipUnit,
4480 bp_.footskip, default_unit);
4482 lengthToWidgets(m->columnsepLE, m->columnsepUnit,
4483 bp_.columnsep, default_unit);
4486 updateUnknownBranches();
4487 branchesModule->update(bp_);
4490 PDFOptions const & pdf = bp_.pdfoptions();
4491 pdfSupportModule->use_hyperrefGB->setChecked(pdf.use_hyperref);
4492 if (bp_.documentClass().provides("hyperref"))
4493 pdfSupportModule->use_hyperrefGB->setTitle(qt_("C&ustomize Hyperref Options"));
4495 pdfSupportModule->use_hyperrefGB->setTitle(qt_("&Use Hyperref Support"));
4496 pdfSupportModule->titleLE->setText(toqstr(pdf.title));
4497 pdfSupportModule->authorLE->setText(toqstr(pdf.author));
4498 pdfSupportModule->subjectLE->setText(toqstr(pdf.subject));
4499 pdfSupportModule->keywordsLE->setText(toqstr(pdf.keywords));
4501 pdfSupportModule->bookmarksGB->setChecked(pdf.bookmarks);
4502 pdfSupportModule->bookmarksnumberedCB->setChecked(pdf.bookmarksnumbered);
4503 pdfSupportModule->bookmarksopenGB->setChecked(pdf.bookmarksopen);
4505 pdfSupportModule->bookmarksopenlevelSB->setValue(pdf.bookmarksopenlevel);
4506 pdfSupportModule->bookmarksopenlevelSB->setEnabled(pdf.bookmarksopen);
4507 pdfSupportModule->bookmarksopenlevelLA->setEnabled(pdf.bookmarksopen);
4509 pdfSupportModule->breaklinksCB->setChecked(pdf.breaklinks);
4510 pdfSupportModule->pdfborderCB->setChecked(pdf.pdfborder);
4511 pdfSupportModule->pdfusetitleCB->setChecked(pdf.pdfusetitle);
4512 pdfSupportModule->colorlinksCB->setChecked(pdf.colorlinks);
4514 nn = findToken(backref_opts, pdf.backref);
4516 pdfSupportModule->backrefCO->setCurrentIndex(nn);
4518 pdfSupportModule->fullscreenCB->setChecked
4519 (pdf.pagemode == pdf.pagemode_fullscreen);
4521 pdfSupportModule->optionsTE->setPlainText(
4522 toqstr(pdf.quoted_options));
4524 pdfSupportModule->metadataTE->setPlainText(
4525 toqstr(bp_.document_metadata));
4528 changesModule->trackChangesCB->setChecked(bp_.track_changes);
4529 changesModule->outputChangesCB->setChecked(bp_.output_changes);
4530 changesModule->changeBarsCB->setChecked(bp_.change_bars);
4531 changesModule->changeBarsCB->setEnabled(bp_.output_changes);
4533 // Make sure that the bc is in the INITIAL state
4534 if (bc().policy().buttonStatus(ButtonPolicy::RESTORE))
4537 // clear changed branches cache
4538 changedBranches_.clear();
4540 // re-initiate module filter
4541 if (!filter_->text().isEmpty())
4542 moduleFilterPressed();
4545 nonModuleChanged_ = false;
4546 shellescapeChanged_ = false;
4550 void GuiDocument::saveDocDefault()
4552 // we have to apply the params first
4558 void GuiDocument::updateAvailableModules()
4560 modules_av_model_.clear();
4561 list<modInfoStruct> modInfoList = getModuleInfo();
4562 // Sort names according to the locale
4563 modInfoList.sort([](modInfoStruct const & a, modInfoStruct const & b) {
4564 return 0 < b.name.localeAwareCompare(a.name);
4566 QIcon user_icon(getPixmap("images/", "lyxfiles-user", "svgz,png"));
4567 QIcon system_icon(getPixmap("images/", "lyxfiles-system", "svgz,png"));
4570 catfont.setBold(true);
4572 unavbrush.setColor(Qt::gray);
4573 for (modInfoStruct const & m : modInfoList) {
4574 QStandardItem * item = new QStandardItem();
4575 QStandardItem * catItem;
4576 QString const catname = m.category;
4577 QList<QStandardItem *> fcats = modules_av_model_.findItems(catname, Qt::MatchExactly);
4579 catItem = fcats.first();
4581 catItem = new QStandardItem();
4582 catItem->setText(catname);
4583 catItem->setFont(catfont);
4584 modules_av_model_.insertRow(i, catItem);
4587 item->setEditable(false);
4588 catItem->setEditable(false);
4589 item->setData(m.name, Qt::DisplayRole);
4591 item->setForeground(unavbrush);
4592 item->setData(toqstr(m.id), Qt::UserRole);
4593 item->setData(m.description, Qt::ToolTipRole);
4595 item->setIcon(user_icon);
4597 item->setIcon(system_icon);
4598 catItem->appendRow(item);
4600 modules_av_model_.sort(0);
4604 void GuiDocument::updateSelectedModules()
4606 modules_sel_model_.clear();
4607 list<modInfoStruct> const selModList = getSelectedModules();
4609 for (modInfoStruct const & m : selModList) {
4610 modules_sel_model_.insertRow(i, m.name, m.id, m.description);
4616 void GuiDocument::updateIncludeonlyDisplay()
4618 if (includeonlys_.empty()) {
4619 masterChildModule->includeallRB->setChecked(true);
4620 masterChildModule->childrenTW->setEnabled(false);
4621 masterChildModule->maintainGB->setEnabled(false);
4623 masterChildModule->includeonlyRB->setChecked(true);
4624 masterChildModule->childrenTW->setEnabled(true);
4625 masterChildModule->maintainGB->setEnabled(true);
4630 void GuiDocument::updateIncludeonlys()
4632 masterChildModule->childrenTW->clear();
4633 QString const no = qt_("No");
4634 QString const yes = qt_("Yes");
4636 ListOfBuffers children = buffer().getChildren();
4637 ListOfBuffers::const_iterator it = children.begin();
4638 ListOfBuffers::const_iterator end = children.end();
4639 bool has_unincluded = false;
4640 bool all_unincluded = true;
4641 for (; it != end; ++it) {
4642 QTreeWidgetItem * item = new QTreeWidgetItem(masterChildModule->childrenTW);
4645 to_utf8(makeRelPath(from_utf8((*it)->fileName().absFileName()),
4646 from_utf8(buffer().filePath())));
4647 item->setText(0, toqstr(name));
4648 item->setText(1, isChildIncluded(name) ? yes : no);
4649 if (!isChildIncluded(name))
4650 has_unincluded = true;
4652 all_unincluded = false;
4654 // Both if all children are included and if none is included
4655 // is equal to "include all" (i.e., omit \includeonly).
4656 if (!has_unincluded || all_unincluded)
4657 includeonlys_.clear();
4661 bool GuiDocument::isBiblatex() const
4663 QString const engine =
4664 biblioModule->citeEngineCO->itemData(
4665 biblioModule->citeEngineCO->currentIndex()).toString();
4667 // this can happen if the cite engine is unknown, which can happen
4668 // if one is using a file that came from someone else, etc. in that
4669 // case, we crash if we proceed.
4670 if (engine.isEmpty())
4673 return theCiteEnginesList[fromqstr(engine)]->getCiteFramework() == "biblatex";
4677 void GuiDocument::updateDefaultBiblio(string const & style,
4678 string const & which)
4680 QString const bibstyle = toqstr(style);
4681 biblioModule->defaultBiblioCO->clear();
4686 if (which != "cbx") {
4687 // First the bbx styles
4688 biblioModule->biblatexBbxCO->clear();
4689 QStringList str = texFileList("bbxFiles.lst");
4690 // test whether we have a valid list, otherwise run rescan
4691 if (str.isEmpty()) {
4692 rescanTexStyles("bbx");
4693 str = texFileList("bbxFiles.lst");
4695 for (int i = 0; i != str.size(); ++i)
4696 str[i] = onlyFileName(str[i]);
4697 // sort on filename only (no path)
4700 for (int i = 0; i != str.count(); ++i) {
4701 QString item = changeExtension(str[i], "");
4702 if (item == bibstyle)
4704 biblioModule->biblatexBbxCO->addItem(item);
4707 if (item_nr == -1 && !bibstyle.isEmpty()) {
4708 biblioModule->biblatexBbxCO->addItem(bibstyle);
4709 item_nr = biblioModule->biblatexBbxCO->count() - 1;
4713 biblioModule->biblatexBbxCO->setCurrentIndex(item_nr);
4715 biblioModule->biblatexBbxCO->clearEditText();
4718 if (which != "bbx") {
4719 // now the cbx styles
4720 biblioModule->biblatexCbxCO->clear();
4721 QStringList str = texFileList("cbxFiles.lst");
4722 // test whether we have a valid list, otherwise run rescan
4723 if (str.isEmpty()) {
4724 rescanTexStyles("cbx");
4725 str = texFileList("cbxFiles.lst");
4727 for (int i = 0; i != str.size(); ++i)
4728 str[i] = onlyFileName(str[i]);
4729 // sort on filename only (no path)
4732 for (int i = 0; i != str.count(); ++i) {
4733 QString item = changeExtension(str[i], "");
4734 if (item == bibstyle)
4736 biblioModule->biblatexCbxCO->addItem(item);
4739 if (item_nr == -1 && !bibstyle.isEmpty()) {
4740 biblioModule->biblatexCbxCO->addItem(bibstyle);
4741 item_nr = biblioModule->biblatexCbxCO->count() - 1;
4745 biblioModule->biblatexCbxCO->setCurrentIndex(item_nr);
4747 biblioModule->biblatexCbxCO->clearEditText();
4750 biblioModule->biblatexBbxCO->clear();
4751 biblioModule->biblatexCbxCO->clear();
4752 QStringList str = texFileList("bstFiles.lst");
4753 // test whether we have a valid list, otherwise run rescan
4754 if (str.isEmpty()) {
4755 rescanTexStyles("bst");
4756 str = texFileList("bstFiles.lst");
4758 for (int i = 0; i != str.size(); ++i)
4759 str[i] = onlyFileName(str[i]);
4760 // sort on filename only (no path)
4763 for (int i = 0; i != str.count(); ++i) {
4764 QString item = changeExtension(str[i], "");
4765 if (item == bibstyle)
4767 biblioModule->defaultBiblioCO->addItem(item);
4770 if (item_nr == -1 && !bibstyle.isEmpty()) {
4771 biblioModule->defaultBiblioCO->addItem(bibstyle);
4772 item_nr = biblioModule->defaultBiblioCO->count() - 1;
4776 biblioModule->defaultBiblioCO->setCurrentIndex(item_nr);
4778 biblioModule->defaultBiblioCO->clearEditText();
4781 updateResetDefaultBiblio();
4785 void GuiDocument::updateResetDefaultBiblio()
4787 QString const engine =
4788 biblioModule->citeEngineCO->itemData(
4789 biblioModule->citeEngineCO->currentIndex()).toString();
4790 CiteEngineType const cet =
4791 CiteEngineType(biblioModule->citeStyleCO->itemData(
4792 biblioModule->citeStyleCO->currentIndex()).toInt());
4794 string const defbib = theCiteEnginesList[fromqstr(engine)]->getDefaultBiblio(cet);
4796 QString const bbx = biblioModule->biblatexBbxCO->currentText();
4797 QString const cbx = biblioModule->biblatexCbxCO->currentText();
4798 biblioModule->resetCbxPB->setEnabled(defbib != fromqstr(cbx));
4799 biblioModule->resetBbxPB->setEnabled(defbib != fromqstr(bbx));
4800 biblioModule->matchBbxPB->setEnabled(bbx != cbx && !cbx.isEmpty()
4801 && biblioModule->biblatexBbxCO->findText(cbx) != -1);
4803 biblioModule->resetDefaultBiblioPB->setEnabled(
4804 defbib != fromqstr(biblioModule->defaultBiblioCO->currentText()));
4808 void GuiDocument::matchBiblatexStyles()
4810 updateDefaultBiblio(fromqstr(biblioModule->biblatexCbxCO->currentText()), "bbx");
4815 void GuiDocument::updateContents()
4817 // Nothing to do here as the document settings is not cursor dependent.
4822 void GuiDocument::useClassDefaults()
4824 if (buttonBox->button(QDialogButtonBox::Apply)->isEnabled()) {
4825 int const ret = Alert::prompt(_("Unapplied changes"),
4826 _("Some changes in the dialog were not yet applied.\n"
4827 "If you do not apply now, they will be lost after this action."),
4828 1, 1, _("&Apply"), _("&Dismiss"));
4833 int idx = latexModule->classCO->currentIndex();
4834 string const classname = fromqstr(latexModule->classCO->getData(idx));
4835 if (!bp_.setBaseClass(classname, buffer().layoutPos())) {
4836 Alert::error(_("Error"), _("Unable to set document class."));
4839 bp_.useClassDefaults();
4845 void GuiDocument::setLayoutComboByIDString(string const & idString)
4847 if (!latexModule->classCO->set(toqstr(idString)))
4848 Alert::warning(_("Can't set layout!"),
4849 bformat(_("Unable to set layout for ID: %1$s"), from_utf8(idString)));
4853 bool GuiDocument::isValid()
4856 validateListingsParameters().isEmpty() &&
4857 !localLayout->editing() &&
4858 !preambleModule->editing() &&
4860 // if we're asking for skips between paragraphs
4861 !textLayoutModule->skipRB->isChecked() ||
4862 // then either we haven't chosen custom
4864 textLayoutModule->skipCO->itemData(
4865 textLayoutModule->skipCO->currentIndex()).toInt())
4866 != VSpace::LENGTH ||
4867 // or else a length has been given
4868 !textLayoutModule->skipLE->text().isEmpty()
4871 // if we're asking for indentation
4872 !textLayoutModule->indentRB->isChecked() ||
4873 // then either we haven't chosen custom
4874 (textLayoutModule->indentCO->itemData(
4875 textLayoutModule->indentCO->currentIndex()) != "custom") ||
4876 // or else a length has been given
4877 !textLayoutModule->indentLE->text().isEmpty()
4880 // if we're asking for math indentation
4881 !mathsModule->MathIndentCB->isChecked() ||
4882 // then either we haven't chosen custom
4883 (mathsModule->MathIndentCO->itemData(
4884 mathsModule->MathIndentCO->currentIndex()) != "custom") ||
4885 // or else a length has been given
4886 !mathsModule->MathIndentLE->text().isEmpty()
4891 char const * const GuiDocument::fontfamilies[5] = {
4892 "default", "rmdefault", "sfdefault", "ttdefault", ""
4896 char const * GuiDocument::fontfamilies_gui[5] = {
4897 N_("Default"), N_("Roman"), N_("Sans Serif"), N_("Typewriter"), ""
4901 bool GuiDocument::initialiseParams(string const &)
4903 BufferView const * view = bufferview();
4905 bp_ = BufferParams();
4909 bp_ = view->buffer().params();
4911 updateAvailableModules();
4912 //FIXME It'd be nice to make sure here that the selected
4913 //modules are consistent: That required modules are actually
4914 //selected, and that we don't have conflicts. If so, we could
4915 //at least pop up a warning.
4921 void GuiDocument::clearParams()
4923 bp_ = BufferParams();
4927 BufferId GuiDocument::id() const
4929 BufferView const * const view = bufferview();
4930 return view? &view->buffer() : nullptr;
4934 list<GuiDocument::modInfoStruct> const & GuiDocument::getModuleInfo()
4936 return moduleNames_;
4940 list<GuiDocument::modInfoStruct> const
4941 GuiDocument::makeModuleInfo(LayoutModuleList const & mods)
4943 list<modInfoStruct> mInfo;
4944 for (string const & name : mods) {
4946 LyXModule const * const mod = theModuleList[name];
4951 m.name = toqstr(name + " (") + qt_("Not Found") + toqstr(")");
4953 m.missingreqs = true;
4961 list<GuiDocument::modInfoStruct> const GuiDocument::getSelectedModules()
4963 return makeModuleInfo(params().getModules());
4967 list<GuiDocument::modInfoStruct> const GuiDocument::getProvidedModules()
4969 return makeModuleInfo(params().baseClass()->providedModules());
4973 DocumentClass const & GuiDocument::documentClass() const
4975 return bp_.documentClass();
4979 static void dispatch_bufferparams(Dialog const & dialog,
4980 BufferParams const & bp, FuncCode lfun, Buffer const * buf)
4983 ss << "\\begin_header\n";
4984 bp.writeFile(ss, buf);
4985 ss << "\\end_header\n";
4986 dialog.dispatch(FuncRequest(lfun, ss.str()));
4990 void GuiDocument::dispatchParams()
4992 // We need a non-const buffer object.
4993 Buffer & buf = const_cast<BufferView *>(bufferview())->buffer();
4994 // There may be several undo records; group them (bug #8998)
4995 // This handles undo groups automagically
4996 UndoGroupHelper ugh(&buf);
4998 // This must come first so that a language change is correctly noticed
5001 // We need to load the master before we formally update the params,
5002 // since otherwise we run updateBuffer, etc, before the child's master
5004 if (!params().master.empty()) {
5005 FileName const master_file = support::makeAbsPath(params().master,
5006 support::onlyPath(buffer().absFileName()));
5007 if (isLyXFileName(master_file.absFileName())) {
5008 Buffer * master = checkAndLoadLyXFile(master_file, true);
5010 if (master->isChild(const_cast<Buffer *>(&buffer())))
5011 const_cast<Buffer &>(buffer()).setParent(master);
5013 Alert::warning(_("Assigned master does not include this file"),
5014 bformat(_("You must include this file in the document\n"
5015 "'%1$s' in order to use the master document\n"
5016 "feature."), from_utf8(params().master)));
5018 Alert::warning(_("Could not load master"),
5019 bformat(_("The master document '%1$s'\n"
5020 "could not be loaded."),
5021 from_utf8(params().master)));
5025 // Apply the BufferParams. Note that this will set the base class
5026 // and then update the buffer's layout.
5027 dispatch_bufferparams(*this, params(), LFUN_BUFFER_PARAMS_APPLY, &buffer());
5029 // Generate the colours requested by each new branch.
5030 BranchList & branchlist = params().branchlist();
5031 if (!branchlist.empty()) {
5032 BranchList::const_iterator it = branchlist.begin();
5033 BranchList::const_iterator const end = branchlist.end();
5034 for (; it != end; ++it) {
5035 docstring const & current_branch = it->branch();
5036 Branch const * branch = branchlist.find(current_branch);
5037 string const bcolor = branch->color();
5039 if (bcolor.size() == 7 && bcolor[0] == '#')
5040 rgbcol = lyx::rgbFromHexName(bcolor);
5042 guiApp->getRgbColor(lcolor.getFromLyXName(bcolor), rgbcol);
5043 string const x11hexname = X11hexname(rgbcol);
5044 // display the new color
5045 docstring const str = current_branch + ' ' + from_ascii(x11hexname);
5046 dispatch(FuncRequest(LFUN_SET_COLOR, str));
5049 // rename branches in the document
5050 executeBranchRenaming();
5051 // and clear changed branches cache
5052 changedBranches_.clear();
5054 // Generate the colours requested by indices.
5055 IndicesList & indiceslist = params().indiceslist();
5056 if (!indiceslist.empty()) {
5057 IndicesList::const_iterator it = indiceslist.begin();
5058 IndicesList::const_iterator const end = indiceslist.end();
5059 for (; it != end; ++it) {
5060 docstring const & current_index = it->shortcut();
5061 Index const * index = indiceslist.findShortcut(current_index);
5062 string const x11hexname = X11hexname(index->color());
5063 // display the new color
5064 docstring const str = current_index + ' ' + from_ascii(x11hexname);
5065 dispatch(FuncRequest(LFUN_SET_COLOR, str));
5069 // If we used an LFUN, we would not need these two lines:
5070 BufferView * bv = const_cast<BufferView *>(bufferview());
5071 bv->processUpdateFlags(Update::Force | Update::FitCursor);
5075 void GuiDocument::setLanguage() const
5077 Language const * const newL = bp_.language;
5078 if (buffer().params().language == newL)
5081 string const & lang_name = newL->lang();
5082 dispatch(FuncRequest(LFUN_BUFFER_LANGUAGE, lang_name));
5086 void GuiDocument::saveAsDefault() const
5088 dispatch_bufferparams(*this, params(), LFUN_BUFFER_SAVE_AS_DEFAULT, &buffer());
5092 bool GuiDocument::providesOSF(QString const & font) const
5094 if (fontModule->osFontsCB->isChecked())
5095 // FIXME: we should check if the fonts really
5096 // have OSF support. But how?
5098 return theLaTeXFonts().getLaTeXFont(
5099 qstring_to_ucs4(font)).providesOSF(ot1(),
5105 bool GuiDocument::providesSC(QString const & font) const
5107 if (fontModule->osFontsCB->isChecked())
5109 return theLaTeXFonts().getLaTeXFont(
5110 qstring_to_ucs4(font)).providesSC(ot1(),
5116 bool GuiDocument::providesScale(QString const & font) const
5118 if (fontModule->osFontsCB->isChecked())
5120 return theLaTeXFonts().getLaTeXFont(
5121 qstring_to_ucs4(font)).providesScale(ot1(),
5127 bool GuiDocument::providesExtraOpts(QString const & font) const
5129 if (fontModule->osFontsCB->isChecked())
5131 return theLaTeXFonts().getLaTeXFont(
5132 qstring_to_ucs4(font)).providesMoreOptions(ot1(),
5138 bool GuiDocument::providesNoMath(QString const & font) const
5140 if (fontModule->osFontsCB->isChecked())
5142 return theLaTeXFonts().getLaTeXFont(
5143 qstring_to_ucs4(font)).providesNoMath(ot1(),
5148 bool GuiDocument::hasMonolithicExpertSet(QString const & font) const
5150 if (fontModule->osFontsCB->isChecked())
5152 return theLaTeXFonts().getLaTeXFont(
5153 qstring_to_ucs4(font)).hasMonolithicExpertSet(ot1(),
5160 GuiDocument::modInfoStruct GuiDocument::modInfo(LyXModule const & mod)
5162 // FIXME Unicode: docstrings would be better for these parameters but this
5163 // change requires a lot of others
5166 QString const guiname = toqstr(translateIfPossible(from_utf8(mod.getName())));
5167 m.missingreqs = !isModuleAvailable(mod.getID());
5168 if (m.missingreqs) {
5169 m.name = qt_("%1 (missing req.)").arg(guiname);
5172 m.category = mod.category().empty() ? qt_("Miscellaneous")
5173 : toqstr(translateIfPossible(from_utf8(mod.category())));
5174 QString desc = toqstr(translateIfPossible(from_utf8(mod.getDescription())));
5175 // Find the first sentence of the description
5176 QTextBoundaryFinder bf(QTextBoundaryFinder::Sentence, desc);
5177 int pos = bf.toNextBoundary();
5180 m.local = mod.isLocal();
5181 QString const mtype = m.local ? qt_("personal module") : qt_("distributed module");
5182 QString modulename = qt_("<b>Module name:</b> <i>%1</i> (%2)").arg(toqstr(m.id)).arg(mtype);
5183 // Tooltip is the desc followed by the module name and the type
5184 m.description = QString("%1%2")
5185 .arg(desc.isEmpty() ? QString() : QString("<p>%1</p>").arg(desc),
5188 m.description += QString("<p>%1</p>").arg(qt_("<b>Note:</b> Some requirements for this module are missing!"));
5193 void GuiDocument::loadModuleInfo()
5195 moduleNames_.clear();
5196 for (LyXModule const & mod : theModuleList)
5197 moduleNames_.push_back(modInfo(mod));
5201 void GuiDocument::updateUnknownBranches()
5205 list<docstring> used_branches;
5206 buffer().getUsedBranches(used_branches);
5207 list<docstring>::const_iterator it = used_branches.begin();
5208 QStringList unknown_branches;
5209 for (; it != used_branches.end() ; ++it) {
5210 if (!buffer().params().branchlist().find(*it))
5211 unknown_branches.append(toqstr(*it));
5213 branchesModule->setUnknownBranches(unknown_branches);
5217 void GuiDocument::branchesRename(docstring const & oldname, docstring const & newname)
5219 map<docstring, docstring>::iterator it = changedBranches_.begin();
5220 for (; it != changedBranches_.end() ; ++it) {
5221 if (it->second == oldname) {
5222 // branch has already been renamed
5223 it->second = newname;
5228 changedBranches_[oldname] = newname;
5232 void GuiDocument::executeBranchRenaming() const
5234 map<docstring, docstring>::const_iterator it = changedBranches_.begin();
5235 for (; it != changedBranches_.end() ; ++it) {
5236 docstring const arg = '"' + it->first + '"' + " " + '"' + it->second + '"';
5237 dispatch(FuncRequest(LFUN_BRANCHES_RENAME, arg));
5242 void GuiDocument::allPackagesAuto()
5248 void GuiDocument::allPackagesAlways()
5254 void GuiDocument::allPackagesNot()
5260 void GuiDocument::allPackages(int col)
5262 for (int row = 0; row < mathsModule->packagesTW->rowCount(); ++row) {
5264 (QRadioButton*)mathsModule->packagesTW->cellWidget(row, col)->layout()->itemAt(0)->widget();
5265 rb->setChecked(true);
5270 void GuiDocument::linenoToggled(bool on)
5272 numberingModule->linenoLE->setEnabled(on);
5273 numberingModule->linenoLA->setEnabled(on);
5277 void GuiDocument::outputChangesToggled(bool on)
5279 changesModule->changeBarsCB->setEnabled(on);
5283 void GuiDocument::setOutputSync(bool on)
5285 outputModule->synccustomCB->setEnabled(on);
5286 outputModule->synccustomLA->setEnabled(on);
5291 } // namespace frontend
5294 #include "moc_GuiDocument.cpp"