2 * \file GuiDocument.cpp
3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
7 * \author Richard Heck (modules)
9 * Full author contact details are available in file CREDITS.
14 #include "GuiDocument.h"
16 #include "GuiApplication.h"
17 #include "GuiBranches.h"
18 #include "GuiIndices.h"
19 #include "GuiSelectionManager.h"
20 #include "LaTeXHighlighter.h"
21 #include "LengthCombo.h"
22 #include "PanelStack.h"
23 #include "Validator.h"
25 #include "LayoutFile.h"
26 #include "BranchList.h"
27 #include "buffer_funcs.h"
29 #include "BufferParams.h"
30 #include "BufferView.h"
32 #include "ColorCache.h"
34 #include "FloatPlacement.h"
36 #include "FuncRequest.h"
38 #include "IndicesList.h"
40 #include "LaTeXFeatures.h"
42 #include "LayoutModuleList.h"
44 #include "ModuleList.h"
45 #include "OutputParams.h"
46 #include "PDFOptions.h"
47 #include "qt_helpers.h"
49 #include "TextClass.h"
51 #include "insets/InsetListingsParams.h"
53 #include "support/debug.h"
54 #include "support/FileName.h"
55 #include "support/filetools.h"
56 #include "support/gettext.h"
57 #include "support/lstrings.h"
59 #include "frontends/alert.h"
61 #include <QAbstractItemModel>
62 #include <QHeaderView>
64 #include <QColorDialog>
65 #include <QCloseEvent>
66 #include <QFontDatabase>
68 #include <QTextCursor>
78 // a style sheet for buttons
79 // this is for example used for the background color setting button
80 static inline QString colorButtonStyleSheet(QColor const & bgColor)
82 if (bgColor.isValid()) {
83 QString rc = QLatin1String("background-color:");
92 using namespace lyx::support;
97 char const * const tex_graphics[] =
99 "default", "dvialw", "dvilaser", "dvipdf", "dvipdfm", "dvipdfmx",
100 "dvips", "dvipsone", "dvitops", "dviwin", "dviwindo", "dvi2ps", "emtex",
101 "ln", "oztex", "pctexhp", "pctexps", "pctexwin", "pctex32", "pdftex",
102 "psprint", "pubps", "tcidvi", "textures", "truetex", "vtex", "xdvi",
107 char const * const tex_graphics_gui[] =
109 N_("Default"), "dvialw", "DviLaser", "dvipdf", "DVIPDFM", "DVIPDFMx",
110 "Dvips", "DVIPSONE", "DVItoPS", "DVIWIN", "DVIWindo", "dvi2ps", "EmTeX",
111 "LN", "OzTeX", "pctexhp", "pctexps", "pctexwin", "PCTeX32", "pdfTeX",
112 "psprint", "pubps", "tcidvi", "Textures", "TrueTeX", "VTeX", "xdvi",
113 "XeTeX", N_("None"), ""
117 char const * const tex_fonts_roman[] =
119 "default", "cmr", "lmodern", "ae", "times", "palatino",
120 "charter", "newcent", "bookman", "utopia", "beraserif",
121 "ccfonts", "chancery", ""
125 char const * tex_fonts_roman_gui[] =
127 N_("Default"), N_("Computer Modern Roman"), N_("Latin Modern Roman"),
128 N_("AE (Almost European)"), N_("Times Roman"), N_("Palatino"),
129 N_("Bitstream Charter"), N_("New Century Schoolbook"), N_("Bookman"),
130 N_("Utopia"), N_("Bera Serif"), N_("Concrete Roman"), N_("Zapf Chancery"),
135 char const * const tex_fonts_sans[] =
137 "default", "cmss", "lmss", "helvet", "avant", "berasans", "cmbr", ""
141 char const * tex_fonts_sans_gui[] =
143 N_("Default"), N_("Computer Modern Sans"), N_("Latin Modern Sans"),
144 N_("Helvetica"), N_("Avant Garde"), N_("Bera Sans"), N_("CM Bright"), ""
148 char const * const tex_fonts_monospaced[] =
150 "default", "cmtt", "lmtt", "courier", "beramono", "luximono", "cmtl", ""
154 char const * tex_fonts_monospaced_gui[] =
156 N_("Default"), N_("Computer Modern Typewriter"),
157 N_("Latin Modern Typewriter"), N_("Courier"), N_("Bera Mono"),
158 N_("LuxiMono"), N_("CM Typewriter Light"), ""
162 char const * backref_opts[] =
164 "false", "section", "slide", "page", ""
168 char const * backref_opts_gui[] =
170 N_("Off"), N_("Section"), N_("Slide"), N_("Page"), ""
174 vector<pair<string, QString> > pagestyles;
177 } // anonymous namespace
181 RGBColor set_backgroundcolor;
182 bool is_backgroundcolor;
183 RGBColor set_fontcolor;
185 RGBColor set_notefontcolor;
186 RGBColor set_boxbgcolor;
189 // used when sorting the textclass list.
190 class less_textclass_avail_desc
191 : public binary_function<string, string, int>
194 bool operator()(string const & lhs, string const & rhs) const
196 // Ordering criteria:
197 // 1. Availability of text class
198 // 2. Description (lexicographic)
199 LayoutFile const & tc1 = LayoutFileList::get()[lhs];
200 LayoutFile const & tc2 = LayoutFileList::get()[rhs];
201 int const order = compare_no_case(
202 translateIfPossible(from_utf8(tc1.description())),
203 translateIfPossible(from_utf8(tc2.description())));
204 return (tc1.isTeXClassAvailable() && !tc2.isTeXClassAvailable()) ||
205 (tc1.isTeXClassAvailable() == tc2.isTeXClassAvailable() && order < 0);
214 vector<string> getRequiredList(string const & modName)
216 LyXModule const * const mod = theModuleList[modName];
218 return vector<string>(); //empty such thing
219 return mod->getRequiredModules();
223 vector<string> getExcludedList(string const & modName)
225 LyXModule const * const mod = theModuleList[modName];
227 return vector<string>(); //empty such thing
228 return mod->getExcludedModules();
232 docstring getModuleDescription(string const & modName)
234 LyXModule const * const mod = theModuleList[modName];
236 return _("Module not found!");
238 return translateIfPossible(from_utf8(mod->getDescription()));
242 vector<string> getPackageList(string const & modName)
244 LyXModule const * const mod = theModuleList[modName];
246 return vector<string>(); //empty such thing
247 return mod->getPackageList();
251 bool isModuleAvailable(string const & modName)
253 LyXModule const * const mod = theModuleList[modName];
256 return mod->isAvailable();
259 } // anonymous namespace
262 /////////////////////////////////////////////////////////////////////
264 // ModuleSelectionManager
266 /////////////////////////////////////////////////////////////////////
268 /// SelectionManager for use with modules
269 class ModuleSelectionManager : public GuiSelectionManager
273 ModuleSelectionManager(
274 QTreeView * availableLV,
275 QListView * selectedLV,
279 QPushButton * downPB,
280 GuiIdListModel * availableModel,
281 GuiIdListModel * selectedModel,
282 GuiDocument const * container)
283 : GuiSelectionManager(availableLV, selectedLV, addPB, delPB,
284 upPB, downPB, availableModel, selectedModel), container_(container)
287 void updateProvidedModules(LayoutModuleList const & pm)
288 { provided_modules_ = pm.list(); }
290 void updateExcludedModules(LayoutModuleList const & em)
291 { excluded_modules_ = em.list(); }
294 virtual void updateAddPB();
296 virtual void updateUpPB();
298 virtual void updateDownPB();
300 virtual void updateDelPB();
301 /// returns availableModel as a GuiIdListModel
302 GuiIdListModel * getAvailableModel()
304 return dynamic_cast<GuiIdListModel *>(availableModel);
306 /// returns selectedModel as a GuiIdListModel
307 GuiIdListModel * getSelectedModel()
309 return dynamic_cast<GuiIdListModel *>(selectedModel);
311 /// keeps a list of the modules the text class provides
312 list<string> provided_modules_;
314 list<string> excluded_modules_;
316 GuiDocument const * container_;
319 void ModuleSelectionManager::updateAddPB()
321 int const arows = availableModel->rowCount();
322 QModelIndexList const avail_sels =
323 availableLV->selectionModel()->selectedIndexes();
325 // disable if there aren't any modules (?), if none of them is chosen
326 // in the dialog, or if the chosen one is already selected for use.
327 if (arows == 0 || avail_sels.isEmpty() || isSelected(avail_sels.first())) {
328 addPB->setEnabled(false);
332 QModelIndex const & idx = availableLV->selectionModel()->currentIndex();
333 string const modname = getAvailableModel()->getIDString(idx.row());
336 container_->params().moduleCanBeAdded(modname);
337 addPB->setEnabled(enable);
341 void ModuleSelectionManager::updateDownPB()
343 int const srows = selectedModel->rowCount();
345 downPB->setEnabled(false);
348 QModelIndex const & curidx = selectedLV->selectionModel()->currentIndex();
349 int const curRow = curidx.row();
350 if (curRow < 0 || curRow >= srows - 1) { // invalid or last item
351 downPB->setEnabled(false);
355 // determine whether immediately succeding element requires this one
356 string const curmodname = getSelectedModel()->getIDString(curRow);
357 string const nextmodname = getSelectedModel()->getIDString(curRow + 1);
359 vector<string> reqs = getRequiredList(nextmodname);
361 // if it doesn't require anything....
363 downPB->setEnabled(true);
367 // Enable it if this module isn't required.
368 // FIXME This should perhaps be more flexible and check whether, even
369 // if the next one is required, there is also an earlier one that will do.
371 find(reqs.begin(), reqs.end(), curmodname) == reqs.end());
374 void ModuleSelectionManager::updateUpPB()
376 int const srows = selectedModel->rowCount();
378 upPB->setEnabled(false);
382 QModelIndex const & curIdx = selectedLV->selectionModel()->currentIndex();
383 int curRow = curIdx.row();
384 if (curRow <= 0 || curRow > srows - 1) { // first item or invalid
385 upPB->setEnabled(false);
388 string const curmodname = getSelectedModel()->getIDString(curRow);
390 // determine whether immediately preceding element is required by this one
391 vector<string> reqs = getRequiredList(curmodname);
393 // if this one doesn't require anything....
395 upPB->setEnabled(true);
400 // Enable it if the preceding module isn't required.
401 // NOTE This is less flexible than it might be. We could check whether, even
402 // if the previous one is required, there is an earlier one that would do.
403 string const premod = getSelectedModel()->getIDString(curRow - 1);
404 upPB->setEnabled(find(reqs.begin(), reqs.end(), premod) == reqs.end());
407 void ModuleSelectionManager::updateDelPB()
409 int const srows = selectedModel->rowCount();
411 deletePB->setEnabled(false);
415 QModelIndex const & curidx =
416 selectedLV->selectionModel()->currentIndex();
417 int const curRow = curidx.row();
418 if (curRow < 0 || curRow >= srows) { // invalid index?
419 deletePB->setEnabled(false);
423 string const curmodname = getSelectedModel()->getIDString(curRow);
425 // We're looking here for a reason NOT to enable the button. If we
426 // find one, we disable it and return. If we don't, we'll end up at
427 // the end of the function, and then we enable it.
428 for (int i = curRow + 1; i < srows; ++i) {
429 string const thisMod = getSelectedModel()->getIDString(i);
430 vector<string> reqs = getRequiredList(thisMod);
431 //does this one require us?
432 if (find(reqs.begin(), reqs.end(), curmodname) == reqs.end())
436 // OK, so this module requires us
437 // is there an EARLIER module that also satisfies the require?
438 // NOTE We demand that it be earlier to keep the list of modules
439 // consistent with the rule that a module must be proceeded by a
440 // required module. There would be more flexible ways to proceed,
441 // but that would be a lot more complicated, and the logic here is
442 // already complicated. (That's why I've left the debugging code.)
443 // lyxerr << "Testing " << thisMod << endl;
444 bool foundone = false;
445 for (int j = 0; j < curRow; ++j) {
446 string const mod = getSelectedModel()->getIDString(j);
447 // lyxerr << "In loop: Testing " << mod << endl;
448 // do we satisfy the require?
449 if (find(reqs.begin(), reqs.end(), mod) != reqs.end()) {
450 // lyxerr << mod << " does the trick." << endl;
455 // did we find a module to satisfy the require?
457 // lyxerr << "No matching module found." << endl;
458 deletePB->setEnabled(false);
462 // lyxerr << "All's well that ends well." << endl;
463 deletePB->setEnabled(true);
467 /////////////////////////////////////////////////////////////////////
471 /////////////////////////////////////////////////////////////////////
473 PreambleModule::PreambleModule() : current_id_(0)
475 // This is not a memory leak. The object will be destroyed
477 (void) new LaTeXHighlighter(preambleTE->document());
478 setFocusProxy(preambleTE);
479 connect(preambleTE, SIGNAL(textChanged()), this, SIGNAL(changed()));
483 void PreambleModule::update(BufferParams const & params, BufferId id)
485 QString preamble = toqstr(params.preamble);
486 // Nothing to do if the params and preamble are unchanged.
487 if (id == current_id_
488 && preamble == preambleTE->document()->toPlainText())
491 QTextCursor cur = preambleTE->textCursor();
492 // Save the coords before switching to the new one.
493 preamble_coords_[current_id_] =
494 make_pair(cur.position(), preambleTE->verticalScrollBar()->value());
496 // Save the params address for further use.
498 preambleTE->document()->setPlainText(preamble);
499 Coords::const_iterator it = preamble_coords_.find(current_id_);
500 if (it == preamble_coords_.end())
501 // First time we open this one.
502 preamble_coords_[current_id_] = make_pair(0, 0);
504 // Restore saved coords.
505 QTextCursor cur = preambleTE->textCursor();
506 cur.setPosition(it->second.first);
507 preambleTE->setTextCursor(cur);
508 preambleTE->verticalScrollBar()->setValue(it->second.second);
513 void PreambleModule::apply(BufferParams & params)
515 params.preamble = fromqstr(preambleTE->document()->toPlainText());
519 void PreambleModule::closeEvent(QCloseEvent * e)
521 // Save the coords before closing.
522 QTextCursor cur = preambleTE->textCursor();
523 preamble_coords_[current_id_] =
524 make_pair(cur.position(), preambleTE->verticalScrollBar()->value());
529 /////////////////////////////////////////////////////////////////////
533 /////////////////////////////////////////////////////////////////////
536 LocalLayout::LocalLayout() : current_id_(0), is_valid_(false)
538 connect(locallayoutTE, SIGNAL(textChanged()), this, SLOT(textChanged()));
539 connect(validatePB, SIGNAL(clicked()), this, SLOT(validatePressed()));
543 void LocalLayout::update(BufferParams const & params, BufferId id)
545 QString layout = toqstr(params.local_layout);
546 // Nothing to do if the params and preamble are unchanged.
547 if (id == current_id_
548 && layout == locallayoutTE->document()->toPlainText())
551 // Save the params address for further use.
553 locallayoutTE->document()->setPlainText(layout);
558 void LocalLayout::apply(BufferParams & params)
560 string const layout = fromqstr(locallayoutTE->document()->toPlainText());
561 params.local_layout = layout;
565 void LocalLayout::textChanged()
567 static const QString unknown = qt_("Press button to check validity...");
570 infoLB->setText(unknown);
571 validatePB->setEnabled(true);
576 void LocalLayout::validate() {
577 static const QString valid = qt_("Layout is valid!");
578 static const QString vtext =
579 toqstr("<p style=\"font-weight: bold; \">")
580 + valid + toqstr("</p>");
581 static const QString invalid = qt_("Layout is invalid!");
582 static const QString ivtext =
583 toqstr("<p style=\"color: #c00000; font-weight: bold; \">")
584 + invalid + toqstr("</p>");
586 string const layout = fromqstr(locallayoutTE->document()->toPlainText());
590 is_valid_ = TextClass::validate(layout);
591 infoLB->setText(is_valid_ ? vtext : ivtext);
592 validatePB->setEnabled(false);
596 void LocalLayout::validatePressed() {
602 /////////////////////////////////////////////////////////////////////
606 /////////////////////////////////////////////////////////////////////
609 GuiDocument::GuiDocument(GuiView & lv)
610 : GuiDialog(lv, "document", qt_("Document Settings"))
614 connect(okPB, SIGNAL(clicked()), this, SLOT(slotOK()));
615 connect(applyPB, SIGNAL(clicked()), this, SLOT(slotApply()));
616 connect(closePB, SIGNAL(clicked()), this, SLOT(slotClose()));
617 connect(restorePB, SIGNAL(clicked()), this, SLOT(slotRestore()));
619 connect(savePB, SIGNAL(clicked()), this, SLOT(saveDefaultClicked()));
620 connect(defaultPB, SIGNAL(clicked()), this, SLOT(useDefaultsClicked()));
622 // Manage the restore, ok, apply, restore and cancel/close buttons
623 bc().setPolicy(ButtonPolicy::NoRepeatedApplyReadOnlyPolicy);
625 bc().setApply(applyPB);
626 bc().setCancel(closePB);
627 bc().setRestore(restorePB);
631 textLayoutModule = new UiWidget<Ui::TextLayoutUi>;
632 connect(textLayoutModule->lspacingCO, SIGNAL(activated(int)),
633 this, SLOT(change_adaptor()));
634 connect(textLayoutModule->lspacingCO, SIGNAL(activated(int)),
635 this, SLOT(setLSpacing(int)));
636 connect(textLayoutModule->lspacingLE, SIGNAL(textChanged(const QString &)),
637 this, SLOT(change_adaptor()));
639 connect(textLayoutModule->indentRB, SIGNAL(clicked()),
640 this, SLOT(change_adaptor()));
641 connect(textLayoutModule->indentRB, SIGNAL(toggled(bool)),
642 textLayoutModule->indentCO, SLOT(setEnabled(bool)));
643 connect(textLayoutModule->indentCO, SIGNAL(activated(int)),
644 this, SLOT(change_adaptor()));
645 connect(textLayoutModule->indentCO, SIGNAL(activated(int)),
646 this, SLOT(setIndent(int)));
647 connect(textLayoutModule->indentLE, SIGNAL(textChanged(const QString &)),
648 this, SLOT(change_adaptor()));
649 connect(textLayoutModule->indentLengthCO, SIGNAL(activated(int)),
650 this, SLOT(change_adaptor()));
652 connect(textLayoutModule->skipRB, SIGNAL(clicked()),
653 this, SLOT(change_adaptor()));
654 connect(textLayoutModule->skipRB, SIGNAL(toggled(bool)),
655 textLayoutModule->skipCO, SLOT(setEnabled(bool)));
656 connect(textLayoutModule->skipCO, SIGNAL(activated(int)),
657 this, SLOT(change_adaptor()));
658 connect(textLayoutModule->skipCO, SIGNAL(activated(int)),
659 this, SLOT(setSkip(int)));
660 connect(textLayoutModule->skipLE, SIGNAL(textChanged(const QString &)),
661 this, SLOT(change_adaptor()));
662 connect(textLayoutModule->skipLengthCO, SIGNAL(activated(int)),
663 this, SLOT(change_adaptor()));
665 connect(textLayoutModule->indentRB, SIGNAL(toggled(bool)),
666 this, SLOT(enableIndent(bool)));
667 connect(textLayoutModule->skipRB, SIGNAL(toggled(bool)),
668 this, SLOT(enableSkip(bool)));
670 connect(textLayoutModule->twoColumnCB, SIGNAL(clicked()),
671 this, SLOT(change_adaptor()));
672 connect(textLayoutModule->twoColumnCB, SIGNAL(clicked()),
673 this, SLOT(setColSep()));
675 textLayoutModule->lspacingLE->setValidator(new QDoubleValidator(
676 textLayoutModule->lspacingLE));
677 textLayoutModule->indentLE->setValidator(unsignedLengthValidator(
678 textLayoutModule->indentLE));
679 textLayoutModule->skipLE->setValidator(unsignedGlueLengthValidator(
680 textLayoutModule->skipLE));
682 textLayoutModule->indentCO->addItem(qt_("Default"));
683 textLayoutModule->indentCO->addItem(qt_("Custom"));
684 textLayoutModule->skipCO->addItem(qt_("SmallSkip"));
685 textLayoutModule->skipCO->addItem(qt_("MedSkip"));
686 textLayoutModule->skipCO->addItem(qt_("BigSkip"));
687 textLayoutModule->skipCO->addItem(qt_("Custom"));
688 textLayoutModule->lspacingCO->insertItem(
689 Spacing::Single, qt_("Single"));
690 textLayoutModule->lspacingCO->insertItem(
691 Spacing::Onehalf, qt_("OneHalf"));
692 textLayoutModule->lspacingCO->insertItem(
693 Spacing::Double, qt_("Double"));
694 textLayoutModule->lspacingCO->insertItem(
695 Spacing::Other, qt_("Custom"));
696 // initialize the length validator
697 bc().addCheckedLineEdit(textLayoutModule->indentLE);
698 bc().addCheckedLineEdit(textLayoutModule->skipLE);
701 // master/child handling
702 masterChildModule = new UiWidget<Ui::MasterChildUi>;
704 connect(masterChildModule->childrenTW, SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)),
705 this, SLOT(includeonlyClicked(QTreeWidgetItem *, int)));
706 connect(masterChildModule->includeonlyRB, SIGNAL(toggled(bool)),
707 masterChildModule->childrenTW, SLOT(setEnabled(bool)));
708 connect(masterChildModule->includeonlyRB, SIGNAL(toggled(bool)),
709 masterChildModule->maintainAuxCB, SLOT(setEnabled(bool)));
710 connect(masterChildModule->includeallRB, SIGNAL(clicked()),
711 this, SLOT(change_adaptor()));
712 connect(masterChildModule->includeonlyRB, SIGNAL(clicked()),
713 this, SLOT(change_adaptor()));
714 connect(masterChildModule->maintainAuxCB, SIGNAL(clicked()),
715 this, SLOT(change_adaptor()));
716 masterChildModule->childrenTW->setColumnCount(2);
717 masterChildModule->childrenTW->headerItem()->setText(0, qt_("Child Document"));
718 masterChildModule->childrenTW->headerItem()->setText(1, qt_("Include to Output"));
719 masterChildModule->childrenTW->resizeColumnToContents(1);
720 masterChildModule->childrenTW->resizeColumnToContents(2);
724 outputModule = new UiWidget<Ui::OutputUi>;
726 connect(outputModule->xetexCB, SIGNAL(clicked()),
727 this, SLOT(change_adaptor()));
728 connect(outputModule->xetexCB, SIGNAL(toggled(bool)),
729 this, SLOT(xetexChanged(bool)));
730 connect(outputModule->defaultFormatCO, SIGNAL(activated(int)),
731 this, SLOT(change_adaptor()));
732 connect(outputModule->mathimgSB, SIGNAL(valueChanged(double)),
733 this, SLOT(change_adaptor()));
734 connect(outputModule->strictCB, SIGNAL(stateChanged(int)),
735 this, SLOT(change_adaptor()));
736 connect(outputModule->mathoutCB, SIGNAL(currentIndexChanged(int)),
737 this, SLOT(change_adaptor()));
739 connect(outputModule->outputsyncCB, SIGNAL(clicked()),
740 this, SLOT(change_adaptor()));
741 connect(outputModule->synccustomCB, SIGNAL(editTextChanged(QString)),
742 this, SLOT(change_adaptor()));
743 outputModule->synccustomCB->addItem("");
744 outputModule->synccustomCB->addItem("\\synctex=1");
745 outputModule->synccustomCB->addItem("\\synctex=-1");
746 outputModule->synccustomCB->addItem("\\usepackage[active]{srcltx}");
749 fontModule = new UiWidget<Ui::FontUi>;
750 connect(fontModule->fontsRomanCO, SIGNAL(activated(int)),
751 this, SLOT(change_adaptor()));
752 connect(fontModule->fontsRomanCO, SIGNAL(activated(int)),
753 this, SLOT(romanChanged(int)));
754 connect(fontModule->fontsSansCO, SIGNAL(activated(int)),
755 this, SLOT(change_adaptor()));
756 connect(fontModule->fontsSansCO, SIGNAL(activated(int)),
757 this, SLOT(sansChanged(int)));
758 connect(fontModule->fontsTypewriterCO, SIGNAL(activated(int)),
759 this, SLOT(change_adaptor()));
760 connect(fontModule->fontsTypewriterCO, SIGNAL(activated(int)),
761 this, SLOT(ttChanged(int)));
762 connect(fontModule->fontsDefaultCO, SIGNAL(activated(int)),
763 this, SLOT(change_adaptor()));
764 connect(fontModule->fontencCO, SIGNAL(activated(int)),
765 this, SLOT(change_adaptor()));
766 connect(fontModule->fontencCO, SIGNAL(activated(int)),
767 this, SLOT(fontencChanged(int)));
768 connect(fontModule->fontencLE, SIGNAL(textChanged(const QString &)),
769 this, SLOT(change_adaptor()));
770 connect(fontModule->fontsizeCO, SIGNAL(activated(int)),
771 this, SLOT(change_adaptor()));
772 connect(fontModule->cjkFontLE, SIGNAL(textChanged(const QString &)),
773 this, SLOT(change_adaptor()));
774 connect(fontModule->scaleSansSB, SIGNAL(valueChanged(int)),
775 this, SLOT(change_adaptor()));
776 connect(fontModule->scaleTypewriterSB, SIGNAL(valueChanged(int)),
777 this, SLOT(change_adaptor()));
778 connect(fontModule->fontScCB, SIGNAL(clicked()),
779 this, SLOT(change_adaptor()));
780 connect(fontModule->fontOsfCB, SIGNAL(clicked()),
781 this, SLOT(change_adaptor()));
785 fontModule->fontsizeCO->addItem(qt_("Default"));
786 fontModule->fontsizeCO->addItem(qt_("10"));
787 fontModule->fontsizeCO->addItem(qt_("11"));
788 fontModule->fontsizeCO->addItem(qt_("12"));
790 fontModule->fontencCO->addItem(qt_("Default"));
791 fontModule->fontencCO->addItem(qt_("Custom"));
792 fontModule->fontencCO->addItem(qt_("None (no fontenc)"));
794 for (int n = 0; GuiDocument::fontfamilies_gui[n][0]; ++n)
795 fontModule->fontsDefaultCO->addItem(
796 qt_(GuiDocument::fontfamilies_gui[n]));
800 pageLayoutModule = new UiWidget<Ui::PageLayoutUi>;
801 connect(pageLayoutModule->papersizeCO, SIGNAL(activated(int)),
802 this, SLOT(papersizeChanged(int)));
803 connect(pageLayoutModule->papersizeCO, SIGNAL(activated(int)),
804 this, SLOT(papersizeChanged(int)));
805 connect(pageLayoutModule->portraitRB, SIGNAL(clicked()),
806 this, SLOT(change_adaptor()));
807 connect(pageLayoutModule->papersizeCO, SIGNAL(activated(int)),
808 this, SLOT(change_adaptor()));
809 connect(pageLayoutModule->paperheightLE, SIGNAL(textChanged(const QString &)),
810 this, SLOT(change_adaptor()));
811 connect(pageLayoutModule->paperwidthLE, SIGNAL(textChanged(const QString &)),
812 this, SLOT(change_adaptor()));
813 connect(pageLayoutModule->paperwidthUnitCO, SIGNAL(activated(int)),
814 this, SLOT(change_adaptor()));
815 connect(pageLayoutModule->paperheightUnitCO, SIGNAL(activated(int)),
816 this, SLOT(change_adaptor()));
817 connect(pageLayoutModule->portraitRB, SIGNAL(clicked()),
818 this, SLOT(change_adaptor()));
819 connect(pageLayoutModule->landscapeRB, SIGNAL(clicked()),
820 this, SLOT(change_adaptor()));
821 connect(pageLayoutModule->facingPagesCB, SIGNAL(clicked()),
822 this, SLOT(change_adaptor()));
823 connect(pageLayoutModule->pagestyleCO, SIGNAL(activated(int)),
824 this, SLOT(change_adaptor()));
826 pageLayoutModule->pagestyleCO->addItem(qt_("Default"));
827 pageLayoutModule->pagestyleCO->addItem(qt_("empty"));
828 pageLayoutModule->pagestyleCO->addItem(qt_("plain"));
829 pageLayoutModule->pagestyleCO->addItem(qt_("headings"));
830 pageLayoutModule->pagestyleCO->addItem(qt_("fancy"));
831 bc().addCheckedLineEdit(pageLayoutModule->paperheightLE,
832 pageLayoutModule->paperheightL);
833 bc().addCheckedLineEdit(pageLayoutModule->paperwidthLE,
834 pageLayoutModule->paperwidthL);
836 QComboBox * cb = pageLayoutModule->papersizeCO;
837 cb->addItem(qt_("Default"));
838 cb->addItem(qt_("Custom"));
839 cb->addItem(qt_("US letter"));
840 cb->addItem(qt_("US legal"));
841 cb->addItem(qt_("US executive"));
842 cb->addItem(qt_("A0"));
843 cb->addItem(qt_("A1"));
844 cb->addItem(qt_("A2"));
845 cb->addItem(qt_("A3"));
846 cb->addItem(qt_("A4"));
847 cb->addItem(qt_("A5"));
848 cb->addItem(qt_("A6"));
849 cb->addItem(qt_("B0"));
850 cb->addItem(qt_("B1"));
851 cb->addItem(qt_("B2"));
852 cb->addItem(qt_("B3"));
853 cb->addItem(qt_("B4"));
854 cb->addItem(qt_("B5"));
855 cb->addItem(qt_("B6"));
856 cb->addItem(qt_("C0"));
857 cb->addItem(qt_("C1"));
858 cb->addItem(qt_("C2"));
859 cb->addItem(qt_("C3"));
860 cb->addItem(qt_("C4"));
861 cb->addItem(qt_("C5"));
862 cb->addItem(qt_("C6"));
863 cb->addItem(qt_("JIS B0"));
864 cb->addItem(qt_("JIS B1"));
865 cb->addItem(qt_("JIS B2"));
866 cb->addItem(qt_("JIS B3"));
867 cb->addItem(qt_("JIS B4"));
868 cb->addItem(qt_("JIS B5"));
869 cb->addItem(qt_("JIS B6"));
870 // remove the %-items from the unit choice
871 pageLayoutModule->paperwidthUnitCO->noPercents();
872 pageLayoutModule->paperheightUnitCO->noPercents();
873 pageLayoutModule->paperheightLE->setValidator(unsignedLengthValidator(
874 pageLayoutModule->paperheightLE));
875 pageLayoutModule->paperwidthLE->setValidator(unsignedLengthValidator(
876 pageLayoutModule->paperwidthLE));
880 marginsModule = new UiWidget<Ui::MarginsUi>;
881 connect(marginsModule->marginCB, SIGNAL(toggled(bool)),
882 this, SLOT(setCustomMargins(bool)));
883 connect(marginsModule->marginCB, SIGNAL(clicked()),
884 this, SLOT(change_adaptor()));
885 connect(marginsModule->topLE, SIGNAL(textChanged(QString)),
886 this, SLOT(change_adaptor()));
887 connect(marginsModule->topUnit, SIGNAL(activated(int)),
888 this, SLOT(change_adaptor()));
889 connect(marginsModule->bottomLE, SIGNAL(textChanged(QString)),
890 this, SLOT(change_adaptor()));
891 connect(marginsModule->bottomUnit, SIGNAL(activated(int)),
892 this, SLOT(change_adaptor()));
893 connect(marginsModule->innerLE, SIGNAL(textChanged(QString)),
894 this, SLOT(change_adaptor()));
895 connect(marginsModule->innerUnit, SIGNAL(activated(int)),
896 this, SLOT(change_adaptor()));
897 connect(marginsModule->outerLE, SIGNAL(textChanged(QString)),
898 this, SLOT(change_adaptor()));
899 connect(marginsModule->outerUnit, SIGNAL(activated(int)),
900 this, SLOT(change_adaptor()));
901 connect(marginsModule->headheightLE, SIGNAL(textChanged(QString)),
902 this, SLOT(change_adaptor()));
903 connect(marginsModule->headheightUnit, SIGNAL(activated(int)),
904 this, SLOT(change_adaptor()));
905 connect(marginsModule->headsepLE, SIGNAL(textChanged(QString)),
906 this, SLOT(change_adaptor()));
907 connect(marginsModule->headsepUnit, SIGNAL(activated(int)),
908 this, SLOT(change_adaptor()));
909 connect(marginsModule->footskipLE, SIGNAL(textChanged(QString)),
910 this, SLOT(change_adaptor()));
911 connect(marginsModule->footskipUnit, SIGNAL(activated(int)),
912 this, SLOT(change_adaptor()));
913 connect(marginsModule->columnsepLE, SIGNAL(textChanged(QString)),
914 this, SLOT(change_adaptor()));
915 connect(marginsModule->columnsepUnit, SIGNAL(activated(int)),
916 this, SLOT(change_adaptor()));
917 marginsModule->topLE->setValidator(unsignedLengthValidator(
918 marginsModule->topLE));
919 marginsModule->bottomLE->setValidator(unsignedLengthValidator(
920 marginsModule->bottomLE));
921 marginsModule->innerLE->setValidator(unsignedLengthValidator(
922 marginsModule->innerLE));
923 marginsModule->outerLE->setValidator(unsignedLengthValidator(
924 marginsModule->outerLE));
925 marginsModule->headsepLE->setValidator(unsignedLengthValidator(
926 marginsModule->headsepLE));
927 marginsModule->headheightLE->setValidator(unsignedLengthValidator(
928 marginsModule->headheightLE));
929 marginsModule->footskipLE->setValidator(unsignedLengthValidator(
930 marginsModule->footskipLE));
931 marginsModule->columnsepLE->setValidator(unsignedLengthValidator(
932 marginsModule->columnsepLE));
934 bc().addCheckedLineEdit(marginsModule->topLE,
935 marginsModule->topL);
936 bc().addCheckedLineEdit(marginsModule->bottomLE,
937 marginsModule->bottomL);
938 bc().addCheckedLineEdit(marginsModule->innerLE,
939 marginsModule->innerL);
940 bc().addCheckedLineEdit(marginsModule->outerLE,
941 marginsModule->outerL);
942 bc().addCheckedLineEdit(marginsModule->headsepLE,
943 marginsModule->headsepL);
944 bc().addCheckedLineEdit(marginsModule->headheightLE,
945 marginsModule->headheightL);
946 bc().addCheckedLineEdit(marginsModule->footskipLE,
947 marginsModule->footskipL);
948 bc().addCheckedLineEdit(marginsModule->columnsepLE,
949 marginsModule->columnsepL);
953 langModule = new UiWidget<Ui::LanguageUi>;
954 connect(langModule->languageCO, SIGNAL(activated(int)),
955 this, SLOT(change_adaptor()));
956 connect(langModule->defaultencodingRB, SIGNAL(clicked()),
957 this, SLOT(change_adaptor()));
958 connect(langModule->otherencodingRB, SIGNAL(clicked()),
959 this, SLOT(change_adaptor()));
960 connect(langModule->encodingCO, SIGNAL(activated(int)),
961 this, SLOT(change_adaptor()));
962 connect(langModule->quoteStyleCO, SIGNAL(activated(int)),
963 this, SLOT(change_adaptor()));
965 QAbstractItemModel * language_model = guiApp->languageModel();
966 // FIXME: it would be nice if sorting was enabled/disabled via a checkbox.
967 language_model->sort(0);
968 langModule->languageCO->setModel(language_model);
969 langModule->languageCO->setModelColumn(0);
971 // Always put the default encoding in the first position.
972 langModule->encodingCO->addItem(qt_("Language Default (no inputenc)"));
973 QStringList encodinglist;
974 Encodings::const_iterator it = encodings.begin();
975 Encodings::const_iterator const end = encodings.end();
976 for (; it != end; ++it)
977 encodinglist.append(qt_(it->guiName()));
979 langModule->encodingCO->addItems(encodinglist);
981 langModule->quoteStyleCO->addItem(qt_("``text''"));
982 langModule->quoteStyleCO->addItem(qt_("''text''"));
983 langModule->quoteStyleCO->addItem(qt_(",,text``"));
984 langModule->quoteStyleCO->addItem(qt_(",,text''"));
985 langModule->quoteStyleCO->addItem(qt_("<<text>>"));
986 langModule->quoteStyleCO->addItem(qt_(">>text<<"));
990 colorModule = new UiWidget<Ui::ColorUi>;
991 connect(colorModule->fontColorPB, SIGNAL(clicked()),
992 this, SLOT(changeFontColor()));
993 connect(colorModule->delFontColorTB, SIGNAL(clicked()),
994 this, SLOT(deleteFontColor()));
995 connect(colorModule->noteFontColorPB, SIGNAL(clicked()),
996 this, SLOT(changeNoteFontColor()));
997 connect(colorModule->delNoteFontColorTB, SIGNAL(clicked()),
998 this, SLOT(deleteNoteFontColor()));
999 connect(colorModule->backgroundPB, SIGNAL(clicked()),
1000 this, SLOT(changeBackgroundColor()));
1001 connect(colorModule->delBackgroundTB, SIGNAL(clicked()),
1002 this, SLOT(deleteBackgroundColor()));
1003 connect(colorModule->boxBackgroundPB, SIGNAL(clicked()),
1004 this, SLOT(changeBoxBackgroundColor()));
1005 connect(colorModule->delBoxBackgroundTB, SIGNAL(clicked()),
1006 this, SLOT(deleteBoxBackgroundColor()));
1010 numberingModule = new UiWidget<Ui::NumberingUi>;
1011 connect(numberingModule->depthSL, SIGNAL(valueChanged(int)),
1012 this, SLOT(change_adaptor()));
1013 connect(numberingModule->tocSL, SIGNAL(valueChanged(int)),
1014 this, SLOT(change_adaptor()));
1015 connect(numberingModule->depthSL, SIGNAL(valueChanged(int)),
1016 this, SLOT(updateNumbering()));
1017 connect(numberingModule->tocSL, SIGNAL(valueChanged(int)),
1018 this, SLOT(updateNumbering()));
1019 numberingModule->tocTW->setColumnCount(3);
1020 numberingModule->tocTW->headerItem()->setText(0, qt_("Example"));
1021 numberingModule->tocTW->headerItem()->setText(1, qt_("Numbered"));
1022 numberingModule->tocTW->headerItem()->setText(2, qt_("Appears in TOC"));
1026 biblioModule = new UiWidget<Ui::BiblioUi>;
1027 connect(biblioModule->citeNatbibRB, SIGNAL(toggled(bool)),
1028 biblioModule->citationStyleL, SLOT(setEnabled(bool)));
1029 connect(biblioModule->citeNatbibRB, SIGNAL(toggled(bool)),
1030 biblioModule->citeStyleCO, SLOT(setEnabled(bool)));
1031 connect(biblioModule->citeDefaultRB, SIGNAL(clicked()),
1032 this, SLOT(change_adaptor()));
1033 connect(biblioModule->citeNatbibRB, SIGNAL(clicked()),
1034 this, SLOT(change_adaptor()));
1035 connect(biblioModule->citeStyleCO, SIGNAL(activated(int)),
1036 this, SLOT(change_adaptor()));
1037 connect(biblioModule->citeJurabibRB, SIGNAL(clicked()),
1038 this, SLOT(change_adaptor()));
1039 connect(biblioModule->bibtopicCB, SIGNAL(clicked()),
1040 this, SLOT(change_adaptor()));
1041 connect(biblioModule->bibtexCO, SIGNAL(activated(int)),
1042 this, SLOT(bibtexChanged(int)));
1043 connect(biblioModule->bibtexOptionsED, SIGNAL(textChanged(QString)),
1044 this, SLOT(change_adaptor()));
1046 biblioModule->citeStyleCO->addItem(qt_("Author-year"));
1047 biblioModule->citeStyleCO->addItem(qt_("Numerical"));
1048 biblioModule->citeStyleCO->setCurrentIndex(0);
1050 biblioModule->bibtexCO->clear();
1051 biblioModule->bibtexCO->addItem(qt_("Default"), QString("default"));
1052 for (set<string>::const_iterator it = lyxrc.bibtex_alternatives.begin();
1053 it != lyxrc.bibtex_alternatives.end(); ++it) {
1054 QString const command = toqstr(*it).left(toqstr(*it).indexOf(" "));
1055 biblioModule->bibtexCO->addItem(command, command);
1060 indicesModule = new GuiIndices;
1061 connect(indicesModule, SIGNAL(changed()),
1062 this, SLOT(change_adaptor()));
1066 mathsModule = new UiWidget<Ui::MathsUi>;
1067 connect(mathsModule->amsautoCB, SIGNAL(toggled(bool)),
1068 mathsModule->amsCB, SLOT(setDisabled(bool)));
1069 connect(mathsModule->esintautoCB, SIGNAL(toggled(bool)),
1070 mathsModule->esintCB, SLOT(setDisabled(bool)));
1071 connect(mathsModule->mhchemautoCB, SIGNAL(toggled(bool)),
1072 mathsModule->mhchemCB, SLOT(setDisabled(bool)));
1074 connect(mathsModule->amsCB, SIGNAL(clicked()),
1075 this, SLOT(change_adaptor()));
1076 connect(mathsModule->amsautoCB, SIGNAL(clicked()),
1077 this, SLOT(change_adaptor()));
1078 connect(mathsModule->esintCB, SIGNAL(clicked()),
1079 this, SLOT(change_adaptor()));
1080 connect(mathsModule->esintautoCB, SIGNAL(clicked()),
1081 this, SLOT(change_adaptor()));
1082 connect(mathsModule->mhchemCB, SIGNAL(clicked()),
1083 this, SLOT(change_adaptor()));
1084 connect(mathsModule->mhchemautoCB, SIGNAL(clicked()),
1085 this, SLOT(change_adaptor()));
1089 latexModule = new UiWidget<Ui::LaTeXUi>;
1090 connect(latexModule->optionsLE, SIGNAL(textChanged(QString)),
1091 this, SLOT(change_adaptor()));
1092 connect(latexModule->defaultOptionsCB, SIGNAL(clicked()),
1093 this, SLOT(change_adaptor()));
1094 connect(latexModule->psdriverCO, SIGNAL(activated(int)),
1095 this, SLOT(change_adaptor()));
1096 connect(latexModule->classCO, SIGNAL(activated(int)),
1097 this, SLOT(classChanged()));
1098 connect(latexModule->classCO, SIGNAL(activated(int)),
1099 this, SLOT(change_adaptor()));
1100 connect(latexModule->layoutPB, SIGNAL(clicked()),
1101 this, SLOT(browseLayout()));
1102 connect(latexModule->layoutPB, SIGNAL(clicked()),
1103 this, SLOT(change_adaptor()));
1104 connect(latexModule->childDocGB, SIGNAL(clicked()),
1105 this, SLOT(change_adaptor()));
1106 connect(latexModule->childDocLE, SIGNAL(textChanged(QString)),
1107 this, SLOT(change_adaptor()));
1108 connect(latexModule->childDocPB, SIGNAL(clicked()),
1109 this, SLOT(browseMaster()));
1110 connect(latexModule->suppressDateCB, SIGNAL(clicked()),
1111 this, SLOT(change_adaptor()));
1113 // postscript drivers
1114 for (int n = 0; tex_graphics[n][0]; ++n) {
1115 QString enc = qt_(tex_graphics_gui[n]);
1116 latexModule->psdriverCO->addItem(enc);
1119 latexModule->classCO->setModel(&classes_model_);
1120 LayoutFileList const & bcl = LayoutFileList::get();
1121 vector<LayoutFileIndex> classList = bcl.classList();
1122 sort(classList.begin(), classList.end(), less_textclass_avail_desc());
1124 vector<LayoutFileIndex>::const_iterator cit = classList.begin();
1125 vector<LayoutFileIndex>::const_iterator cen = classList.end();
1126 for (int i = 0; cit != cen; ++cit, ++i) {
1127 LayoutFile const & tc = bcl[*cit];
1128 docstring item = (tc.isTeXClassAvailable()) ?
1129 from_utf8(tc.description()) :
1130 bformat(_("Unavailable: %1$s"), from_utf8(tc.description()));
1131 classes_model_.insertRow(i, toqstr(item), *cit);
1136 branchesModule = new GuiBranches;
1137 connect(branchesModule, SIGNAL(changed()),
1138 this, SLOT(change_adaptor()));
1139 connect(branchesModule, SIGNAL(renameBranches(docstring const &, docstring const &)),
1140 this, SLOT(branchesRename(docstring const &, docstring const &)));
1141 updateUnknownBranches();
1145 preambleModule = new PreambleModule;
1146 connect(preambleModule, SIGNAL(changed()),
1147 this, SLOT(change_adaptor()));
1149 localLayout = new LocalLayout;
1150 connect(localLayout, SIGNAL(changed()),
1151 this, SLOT(change_adaptor()));
1155 bulletsModule = new BulletsModule;
1156 connect(bulletsModule, SIGNAL(changed()),
1157 this, SLOT(change_adaptor()));
1161 modulesModule = new UiWidget<Ui::ModulesUi>;
1162 modulesModule->availableLV->header()->setVisible(false);
1164 new ModuleSelectionManager(modulesModule->availableLV,
1165 modulesModule->selectedLV,
1166 modulesModule->addPB, modulesModule->deletePB,
1167 modulesModule->upPB, modulesModule->downPB,
1168 availableModel(), selectedModel(), this);
1169 connect(selectionManager, SIGNAL(updateHook()),
1170 this, SLOT(updateModuleInfo()));
1171 connect(selectionManager, SIGNAL(updateHook()),
1172 this, SLOT(change_adaptor()));
1173 connect(selectionManager, SIGNAL(selectionChanged()),
1174 this, SLOT(modulesChanged()));
1178 pdfSupportModule = new UiWidget<Ui::PDFSupportUi>;
1179 connect(pdfSupportModule->use_hyperrefGB, SIGNAL(toggled(bool)),
1180 this, SLOT(change_adaptor()));
1181 connect(pdfSupportModule->titleLE, SIGNAL(textChanged(QString)),
1182 this, SLOT(change_adaptor()));
1183 connect(pdfSupportModule->authorLE, SIGNAL(textChanged(QString)),
1184 this, SLOT(change_adaptor()));
1185 connect(pdfSupportModule->subjectLE, SIGNAL(textChanged(QString)),
1186 this, SLOT(change_adaptor()));
1187 connect(pdfSupportModule->keywordsLE, SIGNAL(textChanged(QString)),
1188 this, SLOT(change_adaptor()));
1189 connect(pdfSupportModule->bookmarksGB, SIGNAL(toggled(bool)),
1190 this, SLOT(change_adaptor()));
1191 connect(pdfSupportModule->bookmarksnumberedCB, SIGNAL(toggled(bool)),
1192 this, SLOT(change_adaptor()));
1193 connect(pdfSupportModule->bookmarksopenGB, SIGNAL(toggled(bool)),
1194 this, SLOT(change_adaptor()));
1195 connect(pdfSupportModule->bookmarksopenlevelSB, SIGNAL(valueChanged(int)),
1196 this, SLOT(change_adaptor()));
1197 connect(pdfSupportModule->breaklinksCB, SIGNAL(toggled(bool)),
1198 this, SLOT(change_adaptor()));
1199 connect(pdfSupportModule->pdfborderCB, SIGNAL(toggled(bool)),
1200 this, SLOT(change_adaptor()));
1201 connect(pdfSupportModule->colorlinksCB, SIGNAL(toggled(bool)),
1202 this, SLOT(change_adaptor()));
1203 connect(pdfSupportModule->backrefCO, SIGNAL(activated(int)),
1204 this, SLOT(change_adaptor()));
1205 connect(pdfSupportModule->pdfusetitleCB, SIGNAL(toggled(bool)),
1206 this, SLOT(change_adaptor()));
1207 connect(pdfSupportModule->fullscreenCB, SIGNAL(toggled(bool)),
1208 this, SLOT(change_adaptor()));
1209 connect(pdfSupportModule->optionsLE, SIGNAL(textChanged(QString)),
1210 this, SLOT(change_adaptor()));
1212 for (int i = 0; backref_opts[i][0]; ++i)
1213 pdfSupportModule->backrefCO->addItem(qt_(backref_opts_gui[i]));
1217 floatModule = new FloatPlacement;
1218 connect(floatModule, SIGNAL(changed()),
1219 this, SLOT(change_adaptor()));
1223 listingsModule = new UiWidget<Ui::ListingsSettingsUi>;
1224 connect(listingsModule->listingsED, SIGNAL(textChanged()),
1225 this, SLOT(change_adaptor()));
1226 connect(listingsModule->bypassCB, SIGNAL(clicked()),
1227 this, SLOT(change_adaptor()));
1228 connect(listingsModule->bypassCB, SIGNAL(clicked()),
1229 this, SLOT(setListingsMessage()));
1230 connect(listingsModule->listingsED, SIGNAL(textChanged()),
1231 this, SLOT(setListingsMessage()));
1232 listingsModule->listingsTB->setPlainText(
1233 qt_("Input listings parameters below. Enter ? for a list of parameters."));
1237 docPS->addPanel(latexModule, qt_("Document Class"));
1238 docPS->addPanel(masterChildModule, qt_("Child Documents"));
1239 docPS->addPanel(modulesModule, qt_("Modules"));
1240 docPS->addPanel(fontModule, qt_("Fonts"));
1241 docPS->addPanel(textLayoutModule, qt_("Text Layout"));
1242 docPS->addPanel(pageLayoutModule, qt_("Page Layout"));
1243 docPS->addPanel(marginsModule, qt_("Page Margins"));
1244 docPS->addPanel(langModule, qt_("Language"));
1245 docPS->addPanel(colorModule, qt_("Colors"));
1246 docPS->addPanel(numberingModule, qt_("Numbering & TOC"));
1247 docPS->addPanel(biblioModule, qt_("Bibliography"));
1248 docPS->addPanel(indicesModule, qt_("Indexes"));
1249 docPS->addPanel(pdfSupportModule, qt_("PDF Properties"));
1250 docPS->addPanel(mathsModule, qt_("Math Options"));
1251 docPS->addPanel(floatModule, qt_("Float Placement"));
1252 docPS->addPanel(listingsModule, qt_("Listings"));
1253 docPS->addPanel(bulletsModule, qt_("Bullets"));
1254 docPS->addPanel(branchesModule, qt_("Branches"));
1255 docPS->addPanel(outputModule, qt_("Output"));
1256 docPS->addPanel(preambleModule, qt_("LaTeX Preamble"));
1257 docPS->addPanel(localLayout, qt_("Local Layout"));
1258 docPS->setCurrentPanel(qt_("Document Class"));
1259 // FIXME: hack to work around resizing bug in Qt >= 4.2
1260 // bug verified with Qt 4.2.{0-3} (JSpitzm)
1261 #if QT_VERSION >= 0x040200
1262 docPS->updateGeometry();
1267 void GuiDocument::saveDefaultClicked()
1273 void GuiDocument::useDefaultsClicked()
1279 void GuiDocument::change_adaptor()
1285 void GuiDocument::includeonlyClicked(QTreeWidgetItem * item, int)
1290 string child = fromqstr(item->text(0));
1294 if (std::find(includeonlys_.begin(),
1295 includeonlys_.end(), child) != includeonlys_.end())
1296 includeonlys_.remove(child);
1298 includeonlys_.push_back(child);
1300 updateIncludeonlys();
1305 QString GuiDocument::validateListingsParameters()
1307 // use a cache here to avoid repeated validation
1308 // of the same parameters
1309 static string param_cache;
1310 static QString msg_cache;
1312 if (listingsModule->bypassCB->isChecked())
1315 string params = fromqstr(listingsModule->listingsED->toPlainText());
1316 if (params != param_cache) {
1317 param_cache = params;
1318 msg_cache = toqstr(InsetListingsParams(params).validate());
1324 void GuiDocument::setListingsMessage()
1326 static bool isOK = true;
1327 QString msg = validateListingsParameters();
1328 if (msg.isEmpty()) {
1332 // listingsTB->setTextColor("black");
1333 listingsModule->listingsTB->setPlainText(
1334 qt_("Input listings parameters below. "
1335 "Enter ? for a list of parameters."));
1338 // listingsTB->setTextColor("red");
1339 listingsModule->listingsTB->setPlainText(msg);
1344 void GuiDocument::setLSpacing(int item)
1346 textLayoutModule->lspacingLE->setEnabled(item == 3);
1350 void GuiDocument::setIndent(int item)
1352 bool const enable = (item == 1);
1353 textLayoutModule->indentLE->setEnabled(enable);
1354 textLayoutModule->indentLengthCO->setEnabled(enable);
1355 textLayoutModule->skipLE->setEnabled(false);
1356 textLayoutModule->skipLengthCO->setEnabled(false);
1361 void GuiDocument::enableIndent(bool indent)
1363 textLayoutModule->skipLE->setEnabled(!indent);
1364 textLayoutModule->skipLengthCO->setEnabled(!indent);
1366 setIndent(textLayoutModule->indentCO->currentIndex());
1370 void GuiDocument::setSkip(int item)
1372 bool const enable = (item == 3);
1373 textLayoutModule->skipLE->setEnabled(enable);
1374 textLayoutModule->skipLengthCO->setEnabled(enable);
1379 void GuiDocument::enableSkip(bool skip)
1381 textLayoutModule->indentLE->setEnabled(!skip);
1382 textLayoutModule->indentLengthCO->setEnabled(!skip);
1384 setSkip(textLayoutModule->skipCO->currentIndex());
1388 void GuiDocument::setMargins()
1390 bool const extern_geometry =
1391 documentClass().provides("geometry");
1392 marginsModule->marginCB->setEnabled(!extern_geometry);
1393 if (extern_geometry) {
1394 marginsModule->marginCB->setChecked(false);
1395 setCustomMargins(true);
1397 marginsModule->marginCB->setChecked(!bp_.use_geometry);
1398 setCustomMargins(!bp_.use_geometry);
1403 void GuiDocument::papersizeChanged(int paper_size)
1405 setCustomPapersize(paper_size == 1);
1409 void GuiDocument::setCustomPapersize(bool custom)
1411 pageLayoutModule->paperwidthL->setEnabled(custom);
1412 pageLayoutModule->paperwidthLE->setEnabled(custom);
1413 pageLayoutModule->paperwidthUnitCO->setEnabled(custom);
1414 pageLayoutModule->paperheightL->setEnabled(custom);
1415 pageLayoutModule->paperheightLE->setEnabled(custom);
1416 pageLayoutModule->paperheightLE->setFocus();
1417 pageLayoutModule->paperheightUnitCO->setEnabled(custom);
1421 void GuiDocument::setColSep()
1423 setCustomMargins(marginsModule->marginCB->checkState() == Qt::Checked);
1427 void GuiDocument::setCustomMargins(bool custom)
1429 marginsModule->topL->setEnabled(!custom);
1430 marginsModule->topLE->setEnabled(!custom);
1431 marginsModule->topUnit->setEnabled(!custom);
1433 marginsModule->bottomL->setEnabled(!custom);
1434 marginsModule->bottomLE->setEnabled(!custom);
1435 marginsModule->bottomUnit->setEnabled(!custom);
1437 marginsModule->innerL->setEnabled(!custom);
1438 marginsModule->innerLE->setEnabled(!custom);
1439 marginsModule->innerUnit->setEnabled(!custom);
1441 marginsModule->outerL->setEnabled(!custom);
1442 marginsModule->outerLE->setEnabled(!custom);
1443 marginsModule->outerUnit->setEnabled(!custom);
1445 marginsModule->headheightL->setEnabled(!custom);
1446 marginsModule->headheightLE->setEnabled(!custom);
1447 marginsModule->headheightUnit->setEnabled(!custom);
1449 marginsModule->headsepL->setEnabled(!custom);
1450 marginsModule->headsepLE->setEnabled(!custom);
1451 marginsModule->headsepUnit->setEnabled(!custom);
1453 marginsModule->footskipL->setEnabled(!custom);
1454 marginsModule->footskipLE->setEnabled(!custom);
1455 marginsModule->footskipUnit->setEnabled(!custom);
1457 bool const enableColSep = !custom &&
1458 textLayoutModule->twoColumnCB->checkState() == Qt::Checked;
1459 marginsModule->columnsepL->setEnabled(enableColSep);
1460 marginsModule->columnsepLE->setEnabled(enableColSep);
1461 marginsModule->columnsepUnit->setEnabled(enableColSep);
1465 void GuiDocument::changeBackgroundColor()
1467 QColor const & newColor = QColorDialog::getColor(
1468 rgb2qcolor(set_backgroundcolor), asQWidget());
1469 if (!newColor.isValid())
1471 // set the button color and text
1472 colorModule->backgroundPB->setStyleSheet(
1473 colorButtonStyleSheet(newColor));
1474 colorModule->backgroundPB->setText(toqstr("Change..."));
1476 set_backgroundcolor = rgbFromHexName(fromqstr(newColor.name()));
1477 is_backgroundcolor = true;
1482 void GuiDocument::deleteBackgroundColor()
1484 // set the button color back to default by setting an epmty StyleSheet
1485 colorModule->backgroundPB->setStyleSheet(QLatin1String(""));
1486 // change button text
1487 colorModule->backgroundPB->setText(toqstr("Default..."));
1488 // save default color (white)
1489 set_backgroundcolor = rgbFromHexName("#ffffff");
1490 is_backgroundcolor = false;
1495 void GuiDocument::changeFontColor()
1497 QColor const & newColor = QColorDialog::getColor(
1498 rgb2qcolor(set_fontcolor), asQWidget());
1499 if (!newColor.isValid())
1501 // set the button color and text
1502 colorModule->fontColorPB->setStyleSheet(
1503 colorButtonStyleSheet(newColor));
1504 colorModule->fontColorPB->setText(toqstr("Change..."));
1506 set_fontcolor = rgbFromHexName(fromqstr(newColor.name()));
1507 is_fontcolor = true;
1512 void GuiDocument::deleteFontColor()
1514 // set the button color back to default by setting an epmty StyleSheet
1515 colorModule->fontColorPB->setStyleSheet(QLatin1String(""));
1516 // change button text
1517 colorModule->fontColorPB->setText(toqstr("Default..."));
1518 // save default color (black)
1519 set_fontcolor = rgbFromHexName("#000000");
1520 is_fontcolor = false;
1525 void GuiDocument::changeNoteFontColor()
1527 QColor const & newColor = QColorDialog::getColor(
1528 rgb2qcolor(set_notefontcolor), asQWidget());
1529 if (!newColor.isValid())
1531 // set the button color
1532 colorModule->noteFontColorPB->setStyleSheet(
1533 colorButtonStyleSheet(newColor));
1535 set_notefontcolor = rgbFromHexName(fromqstr(newColor.name()));
1540 void GuiDocument::deleteNoteFontColor()
1542 // set the button color back to light gray
1543 colorModule->noteFontColorPB->setStyleSheet(
1544 colorButtonStyleSheet(QColor(204, 204, 204, 255)));
1545 // save light gray as the set color
1546 set_notefontcolor = rgbFromHexName("#cccccc");
1551 void GuiDocument::changeBoxBackgroundColor()
1553 QColor const & newColor = QColorDialog::getColor(
1554 rgb2qcolor(set_boxbgcolor), asQWidget());
1555 if (!newColor.isValid())
1557 // set the button color
1558 colorModule->boxBackgroundPB->setStyleSheet(
1559 colorButtonStyleSheet(newColor));
1561 set_boxbgcolor = rgbFromHexName(fromqstr(newColor.name()));
1566 void GuiDocument::deleteBoxBackgroundColor()
1568 // set the button color back to red
1569 colorModule->boxBackgroundPB->setStyleSheet(
1570 colorButtonStyleSheet(QColor(Qt::red)));
1571 // save red as the set color
1572 set_boxbgcolor = rgbFromHexName("#ff0000");
1577 void GuiDocument::xetexChanged(bool xetex)
1580 updateDefaultFormat();
1581 langModule->encodingCO->setEnabled(!xetex &&
1582 !langModule->defaultencodingRB->isChecked());
1583 langModule->defaultencodingRB->setEnabled(!xetex);
1584 langModule->otherencodingRB->setEnabled(!xetex);
1586 fontModule->fontsDefaultCO->setEnabled(!xetex);
1587 fontModule->fontsDefaultLA->setEnabled(!xetex);
1588 fontModule->cjkFontLE->setEnabled(!xetex);
1589 fontModule->cjkFontLA->setEnabled(!xetex);
1592 font = tex_fonts_sans[fontModule->fontsSansCO->currentIndex()];
1593 bool scaleable = providesScale(font);
1594 fontModule->scaleSansSB->setEnabled(scaleable);
1595 fontModule->scaleSansLA->setEnabled(scaleable);
1597 font = tex_fonts_monospaced[fontModule->fontsTypewriterCO->currentIndex()];
1598 scaleable = providesScale(font);
1599 fontModule->scaleTypewriterSB->setEnabled(scaleable);
1600 fontModule->scaleTypewriterLA->setEnabled(scaleable);
1602 font = tex_fonts_roman[fontModule->fontsRomanCO->currentIndex()];
1603 fontModule->fontScCB->setEnabled(providesSC(font));
1604 fontModule->fontOsfCB->setEnabled(providesOSF(font));
1606 fontModule->fontencLA->setEnabled(!xetex);
1607 fontModule->fontencCO->setEnabled(!xetex);
1609 fontModule->fontencLE->setEnabled(false);
1611 fontencChanged(fontModule->fontencCO->currentIndex());
1615 void GuiDocument::updateFontsize(string const & items, string const & sel)
1617 fontModule->fontsizeCO->clear();
1618 fontModule->fontsizeCO->addItem(qt_("Default"));
1620 for (int n = 0; !token(items,'|',n).empty(); ++n)
1621 fontModule->fontsizeCO->
1622 addItem(toqstr(token(items,'|',n)));
1624 for (int n = 0; n < fontModule->fontsizeCO->count(); ++n) {
1625 if (fromqstr(fontModule->fontsizeCO->itemText(n)) == sel) {
1626 fontModule->fontsizeCO->setCurrentIndex(n);
1633 void GuiDocument::updateFontlist()
1635 fontModule->fontsRomanCO->clear();
1636 fontModule->fontsSansCO->clear();
1637 fontModule->fontsTypewriterCO->clear();
1639 // With XeTeX, we have access to all system fonts, but not the LaTeX fonts
1640 if (outputModule->xetexCB->isChecked()) {
1641 fontModule->fontsRomanCO->addItem(qt_("Default"));
1642 fontModule->fontsSansCO->addItem(qt_("Default"));
1643 fontModule->fontsTypewriterCO->addItem(qt_("Default"));
1645 QFontDatabase fontdb;
1646 QStringList families(fontdb.families());
1647 for (QStringList::Iterator it = families.begin(); it != families.end(); ++it) {
1648 fontModule->fontsRomanCO->addItem(*it);
1649 fontModule->fontsSansCO->addItem(*it);
1650 fontModule->fontsTypewriterCO->addItem(*it);
1655 for (int n = 0; tex_fonts_roman[n][0]; ++n) {
1656 QString font = qt_(tex_fonts_roman_gui[n]);
1657 if (!isFontAvailable(tex_fonts_roman[n]))
1658 font += qt_(" (not installed)");
1659 fontModule->fontsRomanCO->addItem(font);
1661 for (int n = 0; tex_fonts_sans[n][0]; ++n) {
1662 QString font = qt_(tex_fonts_sans_gui[n]);
1663 if (!isFontAvailable(tex_fonts_sans[n]))
1664 font += qt_(" (not installed)");
1665 fontModule->fontsSansCO->addItem(font);
1667 for (int n = 0; tex_fonts_monospaced[n][0]; ++n) {
1668 QString font = qt_(tex_fonts_monospaced_gui[n]);
1669 if (!isFontAvailable(tex_fonts_monospaced[n]))
1670 font += qt_(" (not installed)");
1671 fontModule->fontsTypewriterCO->addItem(font);
1676 void GuiDocument::fontencChanged(int item)
1678 fontModule->fontencLE->setEnabled(item == 1);
1682 void GuiDocument::romanChanged(int item)
1684 if (outputModule->xetexCB->isChecked())
1686 string const font = tex_fonts_roman[item];
1687 fontModule->fontScCB->setEnabled(providesSC(font));
1688 fontModule->fontOsfCB->setEnabled(providesOSF(font));
1692 void GuiDocument::sansChanged(int item)
1694 if (outputModule->xetexCB->isChecked())
1696 string const font = tex_fonts_sans[item];
1697 bool scaleable = providesScale(font);
1698 fontModule->scaleSansSB->setEnabled(scaleable);
1699 fontModule->scaleSansLA->setEnabled(scaleable);
1703 void GuiDocument::ttChanged(int item)
1705 if (outputModule->xetexCB->isChecked())
1707 string const font = tex_fonts_monospaced[item];
1708 bool scaleable = providesScale(font);
1709 fontModule->scaleTypewriterSB->setEnabled(scaleable);
1710 fontModule->scaleTypewriterLA->setEnabled(scaleable);
1714 void GuiDocument::updatePagestyle(string const & items, string const & sel)
1717 pageLayoutModule->pagestyleCO->clear();
1718 pageLayoutModule->pagestyleCO->addItem(qt_("Default"));
1720 for (int n = 0; !token(items, '|', n).empty(); ++n) {
1721 string style = token(items, '|', n);
1722 QString style_gui = qt_(style);
1723 pagestyles.push_back(pair<string, QString>(style, style_gui));
1724 pageLayoutModule->pagestyleCO->addItem(style_gui);
1727 if (sel == "default") {
1728 pageLayoutModule->pagestyleCO->setCurrentIndex(0);
1734 for (size_t i = 0; i < pagestyles.size(); ++i)
1735 if (pagestyles[i].first == sel)
1736 nn = pageLayoutModule->pagestyleCO->findText(pagestyles[i].second);
1739 pageLayoutModule->pagestyleCO->setCurrentIndex(nn);
1743 void GuiDocument::browseLayout()
1745 QString const label1 = qt_("Layouts|#o#O");
1746 QString const dir1 = toqstr(lyxrc.document_path);
1747 QStringList const filter(qt_("LyX Layout (*.layout)"));
1748 QString file = browseRelFile(QString(), bufferFilePath(),
1749 qt_("Local layout file"), filter, false,
1752 if (!file.endsWith(".layout"))
1755 FileName layoutFile = support::makeAbsPath(fromqstr(file),
1756 fromqstr(bufferFilePath()));
1758 int const ret = Alert::prompt(_("Local layout file"),
1759 _("The layout file you have selected is a local layout\n"
1760 "file, not one in the system or user directory. Your\n"
1761 "document may not work with this layout if you do not\n"
1762 "keep the layout file in the document directory."),
1763 1, 1, _("&Set Layout"), _("&Cancel"));
1767 // load the layout file
1768 LayoutFileList & bcl = LayoutFileList::get();
1769 string classname = layoutFile.onlyFileName();
1770 // this will update an existing layout if that layout has been loaded before.
1771 LayoutFileIndex name = bcl.addLocalLayout(
1772 classname.substr(0, classname.size() - 7),
1773 layoutFile.onlyPath().absFileName());
1776 Alert::error(_("Error"),
1777 _("Unable to read local layout file."));
1781 // do not trigger classChanged if there is no change.
1782 if (latexModule->classCO->currentText() == toqstr(name))
1786 int idx = latexModule->classCO->findText(toqstr(name));
1788 classes_model_.insertRow(0, toqstr(name), name);
1789 latexModule->classCO->setCurrentIndex(0);
1791 latexModule->classCO->setCurrentIndex(idx);
1797 void GuiDocument::browseMaster()
1799 QString const title = qt_("Select master document");
1800 QString const dir1 = toqstr(lyxrc.document_path);
1801 QString const old = latexModule->childDocLE->text();
1802 QString const docpath = toqstr(support::onlyPath(buffer().absFileName()));
1803 QStringList const filter(qt_("LyX Files (*.lyx)"));
1804 QString file = browseRelFile(old, docpath, title, filter, false,
1805 qt_("Documents|#o#O"), toqstr(lyxrc.document_path));
1807 if (!file.isEmpty())
1808 latexModule->childDocLE->setText(file);
1812 void GuiDocument::classChanged()
1814 int idx = latexModule->classCO->currentIndex();
1817 string const classname = classes_model_.getIDString(idx);
1819 // check whether the selected modules have changed.
1820 bool modules_changed = false;
1821 unsigned int const srows = selectedModel()->rowCount();
1822 if (srows != bp_.getModules().size())
1823 modules_changed = true;
1825 list<string>::const_iterator mit = bp_.getModules().begin();
1826 list<string>::const_iterator men = bp_.getModules().end();
1827 for (unsigned int i = 0; i < srows && mit != men; ++i, ++mit)
1828 if (selectedModel()->getIDString(i) != *mit) {
1829 modules_changed = true;
1834 if (modules_changed || lyxrc.auto_reset_options) {
1835 if (applyPB->isEnabled()) {
1836 int const ret = Alert::prompt(_("Unapplied changes"),
1837 _("Some changes in the dialog were not yet applied.\n"
1838 "If you do not apply now, they will be lost after this action."),
1839 1, 1, _("&Apply"), _("&Dismiss"));
1845 // We load the TextClass as soon as it is selected. This is
1846 // necessary so that other options in the dialog can be updated
1847 // according to the new class. Note, however, that, if you use
1848 // the scroll wheel when sitting on the combo box, we'll load a
1849 // lot of TextClass objects very quickly....
1850 if (!bp_.setBaseClass(classname)) {
1851 Alert::error(_("Error"), _("Unable to set document class."));
1854 if (lyxrc.auto_reset_options)
1855 bp_.useClassDefaults();
1857 // With the introduction of modules came a distinction between the base
1858 // class and the document class. The former corresponds to the main layout
1859 // file; the latter is that plus the modules (or the document-specific layout,
1860 // or whatever else there could be). Our parameters come from the document
1861 // class. So when we set the base class, we also need to recreate the document
1862 // class. Otherwise, we still have the old one.
1863 bp_.makeDocumentClass();
1868 void GuiDocument::bibtexChanged(int n)
1870 biblioModule->bibtexOptionsED->setEnabled(n != 0);
1876 // This is an insanely complicated attempt to make this sort of thing
1877 // work with RTL languages.
1878 docstring formatStrVec(vector<string> const & v, docstring const & s)
1880 //this mess formats the list as "v[0], v[1], ..., [s] v[n]"
1884 return from_utf8(v[0]);
1885 if (v.size() == 2) {
1886 docstring retval = _("%1$s and %2$s");
1887 retval = subst(retval, _("and"), s);
1888 return bformat(retval, from_utf8(v[0]), from_utf8(v[1]));
1890 // The idea here is to format all but the last two items...
1891 int const vSize = v.size();
1892 docstring t2 = _("%1$s, %2$s");
1893 docstring retval = from_utf8(v[0]);
1894 for (int i = 1; i < vSize - 2; ++i)
1895 retval = bformat(t2, retval, from_utf8(v[i]));
1896 //...and then to plug them, and the last two, into this schema
1897 docstring t = _("%1$s, %2$s, and %3$s");
1898 t = subst(t, _("and"), s);
1899 return bformat(t, retval, from_utf8(v[vSize - 2]), from_utf8(v[vSize - 1]));
1902 vector<string> idsToNames(vector<string> const & idList)
1904 vector<string> retval;
1905 vector<string>::const_iterator it = idList.begin();
1906 vector<string>::const_iterator end = idList.end();
1907 for (; it != end; ++it) {
1908 LyXModule const * const mod = theModuleList[*it];
1910 retval.push_back(to_utf8(bformat(_("%1$s (unavailable)"), from_utf8(*it))));
1912 retval.push_back(mod->getName());
1916 } // end anonymous namespace
1919 void GuiDocument::modulesToParams(BufferParams & bp)
1921 // update list of loaded modules
1922 bp.clearLayoutModules();
1923 int const srows = modules_sel_model_.rowCount();
1924 for (int i = 0; i < srows; ++i)
1925 bp.addLayoutModule(modules_sel_model_.getIDString(i));
1927 // update the list of removed modules
1928 bp.clearRemovedModules();
1929 LayoutModuleList const & reqmods = bp.baseClass()->defaultModules();
1930 list<string>::const_iterator rit = reqmods.begin();
1931 list<string>::const_iterator ren = reqmods.end();
1933 // check each of the default modules
1934 for (; rit != ren; rit++) {
1935 list<string>::const_iterator mit = bp.getModules().begin();
1936 list<string>::const_iterator men = bp.getModules().end();
1938 for (; mit != men; mit++) {
1945 // the module isn't present so must have been removed by the user
1946 bp.addRemovedModule(*rit);
1951 void GuiDocument::modulesChanged()
1953 modulesToParams(bp_);
1954 bp_.makeDocumentClass();
1959 void GuiDocument::updateModuleInfo()
1961 selectionManager->update();
1963 //Module description
1964 bool const focus_on_selected = selectionManager->selectedFocused();
1965 QAbstractItemView * lv;
1966 if (focus_on_selected)
1967 lv = modulesModule->selectedLV;
1969 lv= modulesModule->availableLV;
1970 if (lv->selectionModel()->selectedIndexes().isEmpty()) {
1971 modulesModule->infoML->document()->clear();
1974 QModelIndex const & idx = lv->selectionModel()->currentIndex();
1975 GuiIdListModel const & id_model =
1976 focus_on_selected ? modules_sel_model_ : modules_av_model_;
1977 string const modName = id_model.getIDString(idx.row());
1978 docstring desc = getModuleDescription(modName);
1980 LayoutModuleList const & provmods = bp_.baseClass()->providedModules();
1981 if (std::find(provmods.begin(), provmods.end(), modName) != provmods.end()) {
1984 desc += _("Module provided by document class.");
1987 vector<string> pkglist = getPackageList(modName);
1988 docstring pkgdesc = formatStrVec(pkglist, _("and"));
1989 if (!pkgdesc.empty()) {
1992 desc += bformat(_("Package(s) required: %1$s."), pkgdesc);
1995 pkglist = getRequiredList(modName);
1996 if (!pkglist.empty()) {
1997 vector<string> const reqdescs = idsToNames(pkglist);
1998 pkgdesc = formatStrVec(reqdescs, _("or"));
2001 desc += bformat(_("Module required: %1$s."), pkgdesc);
2004 pkglist = getExcludedList(modName);
2005 if (!pkglist.empty()) {
2006 vector<string> const reqdescs = idsToNames(pkglist);
2007 pkgdesc = formatStrVec(reqdescs, _( "and"));
2010 desc += bformat(_("Modules excluded: %1$s."), pkgdesc);
2013 if (!isModuleAvailable(modName)) {
2016 desc += _("WARNING: Some required packages are unavailable!");
2019 modulesModule->infoML->document()->setPlainText(toqstr(desc));
2023 void GuiDocument::updateNumbering()
2025 DocumentClass const & tclass = documentClass();
2027 numberingModule->tocTW->setUpdatesEnabled(false);
2028 numberingModule->tocTW->clear();
2030 int const depth = numberingModule->depthSL->value();
2031 int const toc = numberingModule->tocSL->value();
2032 QString const no = qt_("No");
2033 QString const yes = qt_("Yes");
2034 QTreeWidgetItem * item = 0;
2036 DocumentClass::const_iterator lit = tclass.begin();
2037 DocumentClass::const_iterator len = tclass.end();
2038 for (; lit != len; ++lit) {
2039 int const toclevel = lit->toclevel;
2040 if (toclevel != Layout::NOT_IN_TOC && lit->labeltype == LABEL_COUNTER) {
2041 item = new QTreeWidgetItem(numberingModule->tocTW);
2042 item->setText(0, toqstr(translateIfPossible(lit->name())));
2043 item->setText(1, (toclevel <= depth) ? yes : no);
2044 item->setText(2, (toclevel <= toc) ? yes : no);
2048 numberingModule->tocTW->setUpdatesEnabled(true);
2049 numberingModule->tocTW->update();
2053 void GuiDocument::updateDefaultFormat()
2057 // make a copy in order to consider unapplied changes
2058 Buffer * tmpbuf = buffer().clone();
2059 tmpbuf->params().useXetex = outputModule->xetexCB->isChecked();
2060 int idx = latexModule->classCO->currentIndex();
2062 string const classname = classes_model_.getIDString(idx);
2063 tmpbuf->params().setBaseClass(classname);
2064 tmpbuf->params().makeDocumentClass();
2066 outputModule->defaultFormatCO->blockSignals(true);
2067 outputModule->defaultFormatCO->clear();
2068 outputModule->defaultFormatCO->addItem(qt_("Default"),
2069 QVariant(QString("default")));
2070 typedef vector<Format const *> Formats;
2071 Formats formats = tmpbuf->exportableFormats(true);
2072 Formats::const_iterator cit = formats.begin();
2073 Formats::const_iterator end = formats.end();
2074 for (; cit != end; ++cit)
2075 outputModule->defaultFormatCO->addItem(qt_((*cit)->prettyname()),
2076 QVariant(toqstr((*cit)->name())));
2077 outputModule->defaultFormatCO->blockSignals(false);
2083 bool GuiDocument::isChildIncluded(string const & child)
2085 if (includeonlys_.empty())
2087 return (std::find(includeonlys_.begin(),
2088 includeonlys_.end(), child) != includeonlys_.end());
2092 void GuiDocument::applyView()
2095 preambleModule->apply(bp_);
2096 localLayout->apply(bp_);
2099 bp_.suppress_date = latexModule->suppressDateCB->isChecked();
2102 bp_.setCiteEngine(ENGINE_BASIC);
2104 if (biblioModule->citeNatbibRB->isChecked()) {
2105 bool const use_numerical_citations =
2106 biblioModule->citeStyleCO->currentIndex();
2107 if (use_numerical_citations)
2108 bp_.setCiteEngine(ENGINE_NATBIB_NUMERICAL);
2110 bp_.setCiteEngine(ENGINE_NATBIB_AUTHORYEAR);
2112 } else if (biblioModule->citeJurabibRB->isChecked())
2113 bp_.setCiteEngine(ENGINE_JURABIB);
2116 biblioModule->bibtopicCB->isChecked();
2118 string const bibtex_command =
2119 fromqstr(biblioModule->bibtexCO->itemData(
2120 biblioModule->bibtexCO->currentIndex()).toString());
2121 string const bibtex_options =
2122 fromqstr(biblioModule->bibtexOptionsED->text());
2123 if (bibtex_command == "default" || bibtex_options.empty())
2124 bp_.bibtex_command = bibtex_command;
2126 bp_.bibtex_command = bibtex_command + " " + bibtex_options;
2129 indicesModule->apply(bp_);
2131 // language & quotes
2132 if (langModule->defaultencodingRB->isChecked()) {
2133 bp_.inputenc = "auto";
2135 int i = langModule->encodingCO->currentIndex();
2137 bp_.inputenc = "default";
2139 QString const enc_gui =
2140 langModule->encodingCO->currentText();
2141 Encodings::const_iterator it = encodings.begin();
2142 Encodings::const_iterator const end = encodings.end();
2144 for (; it != end; ++it) {
2145 if (qt_(it->guiName()) == enc_gui) {
2146 bp_.inputenc = it->latexName();
2152 // should not happen
2153 lyxerr << "GuiDocument::apply: Unknown encoding! Resetting to default" << endl;
2154 bp_.inputenc = "default";
2159 InsetQuotes::QuoteLanguage lga = InsetQuotes::EnglishQuotes;
2160 switch (langModule->quoteStyleCO->currentIndex()) {
2162 lga = InsetQuotes::EnglishQuotes;
2165 lga = InsetQuotes::SwedishQuotes;
2168 lga = InsetQuotes::GermanQuotes;
2171 lga = InsetQuotes::PolishQuotes;
2174 lga = InsetQuotes::FrenchQuotes;
2177 lga = InsetQuotes::DanishQuotes;
2180 bp_.quotes_language = lga;
2182 QString const lang = langModule->languageCO->itemData(
2183 langModule->languageCO->currentIndex()).toString();
2184 bp_.language = lyx::languages.getLanguage(fromqstr(lang));
2187 bp_.backgroundcolor = set_backgroundcolor;
2188 bp_.isbackgroundcolor = is_backgroundcolor;
2189 bp_.fontcolor = set_fontcolor;
2190 bp_.isfontcolor = is_fontcolor;
2191 bp_.notefontcolor = set_notefontcolor;
2192 bp_.boxbgcolor = set_boxbgcolor;
2195 if (bp_.documentClass().hasTocLevels()) {
2196 bp_.tocdepth = numberingModule->tocSL->value();
2197 bp_.secnumdepth = numberingModule->depthSL->value();
2201 bp_.user_defined_bullet(0) = bulletsModule->bullet(0);
2202 bp_.user_defined_bullet(1) = bulletsModule->bullet(1);
2203 bp_.user_defined_bullet(2) = bulletsModule->bullet(2);
2204 bp_.user_defined_bullet(3) = bulletsModule->bullet(3);
2207 bp_.graphicsDriver =
2208 tex_graphics[latexModule->psdriverCO->currentIndex()];
2211 int idx = latexModule->classCO->currentIndex();
2213 string const classname = classes_model_.getIDString(idx);
2214 bp_.setBaseClass(classname);
2218 modulesToParams(bp_);
2221 if (mathsModule->amsautoCB->isChecked()) {
2222 bp_.use_amsmath = BufferParams::package_auto;
2224 if (mathsModule->amsCB->isChecked())
2225 bp_.use_amsmath = BufferParams::package_on;
2227 bp_.use_amsmath = BufferParams::package_off;
2229 if (mathsModule->esintautoCB->isChecked())
2230 bp_.use_esint = BufferParams::package_auto;
2232 if (mathsModule->esintCB->isChecked())
2233 bp_.use_esint = BufferParams::package_on;
2235 bp_.use_esint = BufferParams::package_off;
2237 if (mathsModule->mhchemautoCB->isChecked())
2238 bp_.use_mhchem = BufferParams::package_auto;
2240 if (mathsModule->mhchemCB->isChecked())
2241 bp_.use_mhchem = BufferParams::package_on;
2243 bp_.use_mhchem = BufferParams::package_off;
2247 if (pageLayoutModule->pagestyleCO->currentIndex() == 0)
2248 bp_.pagestyle = "default";
2250 QString style_gui = pageLayoutModule->pagestyleCO->currentText();
2251 for (size_t i = 0; i != pagestyles.size(); ++i)
2252 if (pagestyles[i].second == style_gui)
2253 bp_.pagestyle = pagestyles[i].first;
2257 switch (textLayoutModule->lspacingCO->currentIndex()) {
2259 bp_.spacing().set(Spacing::Single);
2262 bp_.spacing().set(Spacing::Onehalf);
2265 bp_.spacing().set(Spacing::Double);
2268 string s = widgetToDoubleStr(textLayoutModule->lspacingLE);
2270 bp_.spacing().set(Spacing::Single);
2272 bp_.spacing().set(Spacing::Other, s);
2277 if (textLayoutModule->twoColumnCB->isChecked())
2282 if (textLayoutModule->indentRB->isChecked()) {
2283 // if paragraphs are separated by an indentation
2284 bp_.paragraph_separation = BufferParams::ParagraphIndentSeparation;
2285 switch (textLayoutModule->indentCO->currentIndex()) {
2287 bp_.setIndentation(HSpace(HSpace::DEFAULT));
2290 HSpace indent = HSpace(
2291 widgetsToLength(textLayoutModule->indentLE,
2292 textLayoutModule->indentLengthCO)
2294 bp_.setIndentation(indent);
2298 // this should never happen
2299 bp_.setIndentation(HSpace(HSpace::DEFAULT));
2303 // if paragraphs are separated by a skip
2304 bp_.paragraph_separation = BufferParams::ParagraphSkipSeparation;
2305 switch (textLayoutModule->skipCO->currentIndex()) {
2307 bp_.setDefSkip(VSpace(VSpace::SMALLSKIP));
2310 bp_.setDefSkip(VSpace(VSpace::MEDSKIP));
2313 bp_.setDefSkip(VSpace(VSpace::BIGSKIP));
2318 widgetsToLength(textLayoutModule->skipLE,
2319 textLayoutModule->skipLengthCO)
2325 // this should never happen
2326 bp_.setDefSkip(VSpace(VSpace::MEDSKIP));
2332 fromqstr(latexModule->optionsLE->text());
2334 bp_.use_default_options =
2335 latexModule->defaultOptionsCB->isChecked();
2337 if (latexModule->childDocGB->isChecked())
2339 fromqstr(latexModule->childDocLE->text());
2341 bp_.master = string();
2344 bp_.clearIncludedChildren();
2345 if (masterChildModule->includeonlyRB->isChecked()) {
2346 list<string>::const_iterator it = includeonlys_.begin();
2347 for (; it != includeonlys_.end() ; ++it) {
2348 bp_.addIncludedChildren(*it);
2351 bp_.maintain_unincluded_children =
2352 masterChildModule->maintainAuxCB->isChecked();
2355 bp_.float_placement = floatModule->get();
2358 // text should have passed validation
2359 bp_.listings_params =
2360 InsetListingsParams(fromqstr(listingsModule->listingsED->toPlainText())).params();
2363 bp_.defaultOutputFormat = fromqstr(outputModule->defaultFormatCO->itemData(
2364 outputModule->defaultFormatCO->currentIndex()).toString());
2366 bool const xetex = outputModule->xetexCB->isChecked();
2367 bp_.useXetex = xetex;
2369 bp_.output_sync = outputModule->outputsyncCB->isChecked();
2370 bp_.output_sync_macro = fromqstr(outputModule->synccustomCB->currentText());
2372 int mathfmt = outputModule->mathoutCB->currentIndex();
2375 BufferParams::MathOutput const mo =
2376 static_cast<BufferParams::MathOutput>(mathfmt);
2377 bp_.html_math_output = mo;
2378 bp_.html_be_strict = outputModule->strictCB->isChecked();
2379 bp_.html_math_img_scale = outputModule->mathimgSB->value();
2383 if (fontModule->fontsRomanCO->currentIndex() == 0)
2384 bp_.fontsRoman = "default";
2387 fromqstr(fontModule->fontsRomanCO->currentText());
2389 if (fontModule->fontsSansCO->currentIndex() == 0)
2390 bp_.fontsSans = "default";
2393 fromqstr(fontModule->fontsSansCO->currentText());
2395 if (fontModule->fontsTypewriterCO->currentIndex() == 0)
2396 bp_.fontsTypewriter = "default";
2398 bp_.fontsTypewriter =
2399 fromqstr(fontModule->fontsTypewriterCO->currentText());
2402 tex_fonts_roman[fontModule->fontsRomanCO->currentIndex()];
2405 tex_fonts_sans[fontModule->fontsSansCO->currentIndex()];
2407 bp_.fontsTypewriter =
2408 tex_fonts_monospaced[fontModule->fontsTypewriterCO->currentIndex()];
2411 if (fontModule->fontencCO->currentIndex() == 0)
2412 bp_.fontenc = "global";
2413 else if (fontModule->fontencCO->currentIndex() == 1)
2414 bp_.fontenc = fromqstr(fontModule->fontencLE->text());
2415 else if (fontModule->fontencCO->currentIndex() == 2)
2416 bp_.fontenc = "default";
2419 fromqstr(fontModule->cjkFontLE->text());
2421 bp_.fontsSansScale = fontModule->scaleSansSB->value();
2423 bp_.fontsTypewriterScale = fontModule->scaleTypewriterSB->value();
2425 bp_.fontsSC = fontModule->fontScCB->isChecked();
2427 bp_.fontsOSF = fontModule->fontOsfCB->isChecked();
2430 bp_.fontsDefaultFamily = "default";
2432 bp_.fontsDefaultFamily = GuiDocument::fontfamilies[
2433 fontModule->fontsDefaultCO->currentIndex()];
2435 if (fontModule->fontsizeCO->currentIndex() == 0)
2436 bp_.fontsize = "default";
2439 fromqstr(fontModule->fontsizeCO->currentText());
2442 bp_.papersize = PAPER_SIZE(
2443 pageLayoutModule->papersizeCO->currentIndex());
2445 bp_.paperwidth = widgetsToLength(pageLayoutModule->paperwidthLE,
2446 pageLayoutModule->paperwidthUnitCO);
2448 bp_.paperheight = widgetsToLength(pageLayoutModule->paperheightLE,
2449 pageLayoutModule->paperheightUnitCO);
2451 if (pageLayoutModule->facingPagesCB->isChecked())
2452 bp_.sides = TwoSides;
2454 bp_.sides = OneSide;
2456 if (pageLayoutModule->landscapeRB->isChecked())
2457 bp_.orientation = ORIENTATION_LANDSCAPE;
2459 bp_.orientation = ORIENTATION_PORTRAIT;
2462 bp_.use_geometry = !marginsModule->marginCB->isChecked();
2464 Ui::MarginsUi const * m = marginsModule;
2466 bp_.leftmargin = widgetsToLength(m->innerLE, m->innerUnit);
2467 bp_.topmargin = widgetsToLength(m->topLE, m->topUnit);
2468 bp_.rightmargin = widgetsToLength(m->outerLE, m->outerUnit);
2469 bp_.bottommargin = widgetsToLength(m->bottomLE, m->bottomUnit);
2470 bp_.headheight = widgetsToLength(m->headheightLE, m->headheightUnit);
2471 bp_.headsep = widgetsToLength(m->headsepLE, m->headsepUnit);
2472 bp_.footskip = widgetsToLength(m->footskipLE, m->footskipUnit);
2473 bp_.columnsep = widgetsToLength(m->columnsepLE, m->columnsepUnit);
2476 branchesModule->apply(bp_);
2479 PDFOptions & pdf = bp_.pdfoptions();
2480 pdf.use_hyperref = pdfSupportModule->use_hyperrefGB->isChecked();
2481 pdf.title = fromqstr(pdfSupportModule->titleLE->text());
2482 pdf.author = fromqstr(pdfSupportModule->authorLE->text());
2483 pdf.subject = fromqstr(pdfSupportModule->subjectLE->text());
2484 pdf.keywords = fromqstr(pdfSupportModule->keywordsLE->text());
2486 pdf.bookmarks = pdfSupportModule->bookmarksGB->isChecked();
2487 pdf.bookmarksnumbered = pdfSupportModule->bookmarksnumberedCB->isChecked();
2488 pdf.bookmarksopen = pdfSupportModule->bookmarksopenGB->isChecked();
2489 pdf.bookmarksopenlevel = pdfSupportModule->bookmarksopenlevelSB->value();
2491 pdf.breaklinks = pdfSupportModule->breaklinksCB->isChecked();
2492 pdf.pdfborder = pdfSupportModule->pdfborderCB->isChecked();
2493 pdf.pdfusetitle = pdfSupportModule->pdfusetitleCB->isChecked();
2494 pdf.colorlinks = pdfSupportModule->colorlinksCB->isChecked();
2496 backref_opts[pdfSupportModule->backrefCO->currentIndex()];
2497 if (pdfSupportModule->fullscreenCB->isChecked())
2498 pdf.pagemode = pdf.pagemode_fullscreen;
2500 pdf.pagemode.clear();
2501 pdf.quoted_options = pdf.quoted_options_check(
2502 fromqstr(pdfSupportModule->optionsLE->text()));
2506 void GuiDocument::paramsToDialog()
2508 // set the default unit
2509 Length::UNIT const defaultUnit = Length::defaultUnit();
2512 preambleModule->update(bp_, id());
2513 localLayout->update(bp_, id());
2516 latexModule->suppressDateCB->setChecked(bp_.suppress_date);
2519 biblioModule->citeDefaultRB->setChecked(
2520 bp_.citeEngine() == ENGINE_BASIC);
2522 biblioModule->citeNatbibRB->setChecked(
2523 bp_.citeEngine() == ENGINE_NATBIB_NUMERICAL ||
2524 bp_.citeEngine() == ENGINE_NATBIB_AUTHORYEAR);
2526 biblioModule->citeStyleCO->setCurrentIndex(
2527 bp_.citeEngine() == ENGINE_NATBIB_NUMERICAL);
2529 biblioModule->citeJurabibRB->setChecked(
2530 bp_.citeEngine() == ENGINE_JURABIB);
2532 biblioModule->bibtopicCB->setChecked(
2537 split(bp_.bibtex_command, command, ' ');
2539 int const bpos = biblioModule->bibtexCO->findData(toqstr(command));
2541 biblioModule->bibtexCO->setCurrentIndex(bpos);
2542 biblioModule->bibtexOptionsED->setText(toqstr(options).trimmed());
2544 biblioModule->bibtexCO->setCurrentIndex(0);
2545 biblioModule->bibtexOptionsED->clear();
2547 biblioModule->bibtexOptionsED->setEnabled(
2548 biblioModule->bibtexCO->currentIndex() != 0);
2551 indicesModule->update(bp_);
2553 // language & quotes
2554 int const pos = langModule->languageCO->findData(toqstr(
2555 bp_.language->lang()));
2556 langModule->languageCO->setCurrentIndex(pos);
2558 langModule->quoteStyleCO->setCurrentIndex(
2559 bp_.quotes_language);
2561 bool default_enc = true;
2562 if (bp_.inputenc != "auto") {
2563 default_enc = false;
2564 if (bp_.inputenc == "default") {
2565 langModule->encodingCO->setCurrentIndex(0);
2568 Encodings::const_iterator it = encodings.begin();
2569 Encodings::const_iterator const end = encodings.end();
2570 for (; it != end; ++it) {
2571 if (it->latexName() == bp_.inputenc) {
2572 enc_gui = it->guiName();
2576 int const i = langModule->encodingCO->findText(
2579 langModule->encodingCO->setCurrentIndex(i);
2581 // unknown encoding. Set to default.
2585 langModule->defaultencodingRB->setChecked(default_enc);
2586 langModule->otherencodingRB->setChecked(!default_enc);
2589 if (bp_.isfontcolor) {
2590 colorModule->fontColorPB->setStyleSheet(
2591 colorButtonStyleSheet(rgb2qcolor(bp_.fontcolor)));
2593 set_fontcolor = bp_.fontcolor;
2594 is_fontcolor = bp_.isfontcolor;
2596 colorModule->noteFontColorPB->setStyleSheet(
2597 colorButtonStyleSheet(rgb2qcolor(bp_.notefontcolor)));
2598 set_notefontcolor = bp_.notefontcolor;
2600 if (bp_.isbackgroundcolor) {
2601 colorModule->backgroundPB->setStyleSheet(
2602 colorButtonStyleSheet(rgb2qcolor(bp_.backgroundcolor)));
2604 set_backgroundcolor = bp_.backgroundcolor;
2605 is_backgroundcolor = bp_.isbackgroundcolor;
2607 colorModule->boxBackgroundPB->setStyleSheet(
2608 colorButtonStyleSheet(rgb2qcolor(bp_.boxbgcolor)));
2609 set_boxbgcolor = bp_.boxbgcolor;
2612 int const min_toclevel = documentClass().min_toclevel();
2613 int const max_toclevel = documentClass().max_toclevel();
2614 if (documentClass().hasTocLevels()) {
2615 numberingModule->setEnabled(true);
2616 numberingModule->depthSL->setMinimum(min_toclevel - 1);
2617 numberingModule->depthSL->setMaximum(max_toclevel);
2618 numberingModule->depthSL->setValue(bp_.secnumdepth);
2619 numberingModule->tocSL->setMaximum(min_toclevel - 1);
2620 numberingModule->tocSL->setMaximum(max_toclevel);
2621 numberingModule->tocSL->setValue(bp_.tocdepth);
2624 numberingModule->setEnabled(false);
2625 numberingModule->tocTW->clear();
2629 bulletsModule->setBullet(0, bp_.user_defined_bullet(0));
2630 bulletsModule->setBullet(1, bp_.user_defined_bullet(1));
2631 bulletsModule->setBullet(2, bp_.user_defined_bullet(2));
2632 bulletsModule->setBullet(3, bp_.user_defined_bullet(3));
2633 bulletsModule->init();
2636 int nitem = findToken(tex_graphics, bp_.graphicsDriver);
2638 latexModule->psdriverCO->setCurrentIndex(nitem);
2641 mathsModule->amsCB->setChecked(
2642 bp_.use_amsmath == BufferParams::package_on);
2643 mathsModule->amsautoCB->setChecked(
2644 bp_.use_amsmath == BufferParams::package_auto);
2646 mathsModule->esintCB->setChecked(
2647 bp_.use_esint == BufferParams::package_on);
2648 mathsModule->esintautoCB->setChecked(
2649 bp_.use_esint == BufferParams::package_auto);
2651 mathsModule->mhchemCB->setChecked(
2652 bp_.use_mhchem == BufferParams::package_on);
2653 mathsModule->mhchemautoCB->setChecked(
2654 bp_.use_mhchem == BufferParams::package_auto);
2656 switch (bp_.spacing().getSpace()) {
2657 case Spacing::Other: nitem = 3; break;
2658 case Spacing::Double: nitem = 2; break;
2659 case Spacing::Onehalf: nitem = 1; break;
2660 case Spacing::Default: case Spacing::Single: nitem = 0; break;
2664 string const & layoutID = bp_.baseClassID();
2665 setLayoutComboByIDString(layoutID);
2667 updatePagestyle(documentClass().opt_pagestyle(),
2670 textLayoutModule->lspacingCO->setCurrentIndex(nitem);
2671 if (bp_.spacing().getSpace() == Spacing::Other) {
2672 doubleToWidget(textLayoutModule->lspacingLE,
2673 bp_.spacing().getValueAsString());
2677 if (bp_.paragraph_separation == BufferParams::ParagraphIndentSeparation) {
2678 textLayoutModule->indentRB->setChecked(true);
2679 string indentation = bp_.getIndentation().asLyXCommand();
2681 if (indentation != "default") {
2682 lengthToWidgets(textLayoutModule->indentLE,
2683 textLayoutModule->indentLengthCO,
2684 indentation, defaultUnit);
2687 textLayoutModule->indentCO->setCurrentIndex(indent);
2690 textLayoutModule->skipRB->setChecked(true);
2692 switch (bp_.getDefSkip().kind()) {
2693 case VSpace::SMALLSKIP:
2696 case VSpace::MEDSKIP:
2699 case VSpace::BIGSKIP:
2702 case VSpace::LENGTH:
2705 string const length = bp_.getDefSkip().asLyXCommand();
2706 lengthToWidgets(textLayoutModule->skipLE,
2707 textLayoutModule->skipLengthCO,
2708 length, defaultUnit);
2715 textLayoutModule->skipCO->setCurrentIndex(skip);
2719 textLayoutModule->twoColumnCB->setChecked(
2722 if (!bp_.options.empty()) {
2723 latexModule->optionsLE->setText(
2724 toqstr(bp_.options));
2726 latexModule->optionsLE->setText(QString());
2730 latexModule->defaultOptionsCB->setChecked(
2731 bp_.use_default_options);
2732 updateSelectedModules();
2733 selectionManager->updateProvidedModules(
2734 bp_.baseClass()->providedModules());
2735 selectionManager->updateExcludedModules(
2736 bp_.baseClass()->excludedModules());
2738 if (!documentClass().options().empty()) {
2739 latexModule->defaultOptionsLE->setText(
2740 toqstr(documentClass().options()));
2742 latexModule->defaultOptionsLE->setText(
2743 toqstr(_("[No options predefined]")));
2746 latexModule->defaultOptionsLE->setEnabled(
2747 bp_.use_default_options
2748 && !documentClass().options().empty());
2750 latexModule->defaultOptionsCB->setEnabled(
2751 !documentClass().options().empty());
2753 if (!bp_.master.empty()) {
2754 latexModule->childDocGB->setChecked(true);
2755 latexModule->childDocLE->setText(
2756 toqstr(bp_.master));
2758 latexModule->childDocLE->setText(QString());
2759 latexModule->childDocGB->setChecked(false);
2763 std::vector<Buffer *> children;
2765 children = buffer().getChildren(false);
2766 if (children.empty()) {
2767 masterChildModule->childrenTW->clear();
2768 includeonlys_.clear();
2769 docPS->showPanel(qt_("Child Documents"), false);
2770 if (docPS->isCurrentPanel(qt_("Child Documents")))
2771 docPS->setCurrentPanel(qt_("Document Class"));
2773 docPS->showPanel(qt_("Child Documents"), true);
2774 masterChildModule->setEnabled(true);
2775 includeonlys_ = bp_.getIncludedChildren();
2776 updateIncludeonlys();
2778 masterChildModule->maintainAuxCB->setChecked(
2779 bp_.maintain_unincluded_children);
2782 floatModule->set(bp_.float_placement);
2785 // break listings_params to multiple lines
2787 InsetListingsParams(bp_.listings_params).separatedParams();
2788 listingsModule->listingsED->setPlainText(toqstr(lstparams));
2791 // update combobox with formats
2792 updateDefaultFormat();
2793 int index = outputModule->defaultFormatCO->findData(toqstr(
2794 bp_.defaultOutputFormat));
2795 // set to default if format is not found
2798 outputModule->defaultFormatCO->setCurrentIndex(index);
2799 outputModule->xetexCB->setEnabled(bp_.baseClass()->outputType() == lyx::LATEX);
2800 outputModule->xetexCB->setChecked(
2801 bp_.baseClass()->outputType() == lyx::LATEX && bp_.useXetex);
2803 outputModule->outputsyncCB->setChecked(bp_.output_sync);
2804 outputModule->synccustomCB->setEditText(toqstr(bp_.output_sync_macro));
2806 outputModule->mathimgSB->setValue(bp_.html_math_img_scale);
2807 outputModule->mathoutCB->setCurrentIndex(bp_.html_math_output);
2808 outputModule->strictCB->setChecked(bp_.html_be_strict);
2811 updateFontsize(documentClass().opt_fontsize(),
2815 fontModule->fontencLA->setEnabled(false);
2816 fontModule->fontencCO->setEnabled(false);
2817 fontModule->fontencLE->setEnabled(false);
2818 for (int i = 0; i < fontModule->fontsRomanCO->count(); ++i) {
2819 if (fontModule->fontsRomanCO->itemText(i) == toqstr(bp_.fontsRoman)) {
2820 fontModule->fontsRomanCO->setCurrentIndex(i);
2825 for (int i = 0; i < fontModule->fontsSansCO->count(); ++i) {
2826 if (fontModule->fontsSansCO->itemText(i) == toqstr(bp_.fontsSans)) {
2827 fontModule->fontsSansCO->setCurrentIndex(i);
2831 for (int i = 0; i < fontModule->fontsTypewriterCO->count(); ++i) {
2832 if (fontModule->fontsTypewriterCO->itemText(i) ==
2833 toqstr(bp_.fontsTypewriter)) {
2834 fontModule->fontsTypewriterCO->setCurrentIndex(i);
2839 fontModule->fontencLA->setEnabled(true);
2840 fontModule->fontencCO->setEnabled(true);
2841 fontModule->fontencLE->setEnabled(true);
2842 int n = findToken(tex_fonts_roman, bp_.fontsRoman);
2844 fontModule->fontsRomanCO->setCurrentIndex(n);
2848 n = findToken(tex_fonts_sans, bp_.fontsSans);
2850 fontModule->fontsSansCO->setCurrentIndex(n);
2854 n = findToken(tex_fonts_monospaced, bp_.fontsTypewriter);
2856 fontModule->fontsTypewriterCO->setCurrentIndex(n);
2861 if (!bp_.fontsCJK.empty())
2862 fontModule->cjkFontLE->setText(
2863 toqstr(bp_.fontsCJK));
2865 fontModule->cjkFontLE->setText(QString());
2867 fontModule->fontScCB->setChecked(bp_.fontsSC);
2868 fontModule->fontOsfCB->setChecked(bp_.fontsOSF);
2869 fontModule->scaleSansSB->setValue(bp_.fontsSansScale);
2870 fontModule->scaleTypewriterSB->setValue(bp_.fontsTypewriterScale);
2872 int nn = findToken(GuiDocument::fontfamilies, bp_.fontsDefaultFamily);
2874 fontModule->fontsDefaultCO->setCurrentIndex(nn);
2876 if (bp_.fontenc == "global") {
2877 fontModule->fontencCO->setCurrentIndex(0);
2878 fontModule->fontencLE->setEnabled(false);
2879 } else if (bp_.fontenc == "default") {
2880 fontModule->fontencCO->setCurrentIndex(2);
2881 fontModule->fontencLE->setEnabled(false);
2883 fontModule->fontencCO->setCurrentIndex(1);
2884 fontModule->fontencLE->setText(toqstr(bp_.fontenc));
2888 bool const extern_geometry =
2889 documentClass().provides("geometry");
2890 int const psize = bp_.papersize;
2891 pageLayoutModule->papersizeCO->setCurrentIndex(psize);
2892 setCustomPapersize(!extern_geometry && psize == 1);
2893 pageLayoutModule->papersizeCO->setEnabled(!extern_geometry);
2895 bool const landscape =
2896 bp_.orientation == ORIENTATION_LANDSCAPE;
2897 pageLayoutModule->landscapeRB->setChecked(landscape);
2898 pageLayoutModule->portraitRB->setChecked(!landscape);
2899 pageLayoutModule->landscapeRB->setEnabled(!extern_geometry);
2900 pageLayoutModule->portraitRB->setEnabled(!extern_geometry);
2902 pageLayoutModule->facingPagesCB->setChecked(
2903 bp_.sides == TwoSides);
2905 lengthToWidgets(pageLayoutModule->paperwidthLE,
2906 pageLayoutModule->paperwidthUnitCO, bp_.paperwidth, defaultUnit);
2907 lengthToWidgets(pageLayoutModule->paperheightLE,
2908 pageLayoutModule->paperheightUnitCO, bp_.paperheight, defaultUnit);
2911 Ui::MarginsUi * m = marginsModule;
2915 lengthToWidgets(m->topLE, m->topUnit,
2916 bp_.topmargin, defaultUnit);
2918 lengthToWidgets(m->bottomLE, m->bottomUnit,
2919 bp_.bottommargin, defaultUnit);
2921 lengthToWidgets(m->innerLE, m->innerUnit,
2922 bp_.leftmargin, defaultUnit);
2924 lengthToWidgets(m->outerLE, m->outerUnit,
2925 bp_.rightmargin, defaultUnit);
2927 lengthToWidgets(m->headheightLE, m->headheightUnit,
2928 bp_.headheight, defaultUnit);
2930 lengthToWidgets(m->headsepLE, m->headsepUnit,
2931 bp_.headsep, defaultUnit);
2933 lengthToWidgets(m->footskipLE, m->footskipUnit,
2934 bp_.footskip, defaultUnit);
2936 lengthToWidgets(m->columnsepLE, m->columnsepUnit,
2937 bp_.columnsep, defaultUnit);
2940 updateUnknownBranches();
2941 branchesModule->update(bp_);
2944 PDFOptions const & pdf = bp_.pdfoptions();
2945 pdfSupportModule->use_hyperrefGB->setChecked(pdf.use_hyperref);
2946 pdfSupportModule->titleLE->setText(toqstr(pdf.title));
2947 pdfSupportModule->authorLE->setText(toqstr(pdf.author));
2948 pdfSupportModule->subjectLE->setText(toqstr(pdf.subject));
2949 pdfSupportModule->keywordsLE->setText(toqstr(pdf.keywords));
2951 pdfSupportModule->bookmarksGB->setChecked(pdf.bookmarks);
2952 pdfSupportModule->bookmarksnumberedCB->setChecked(pdf.bookmarksnumbered);
2953 pdfSupportModule->bookmarksopenGB->setChecked(pdf.bookmarksopen);
2955 pdfSupportModule->bookmarksopenlevelSB->setValue(pdf.bookmarksopenlevel);
2957 pdfSupportModule->breaklinksCB->setChecked(pdf.breaklinks);
2958 pdfSupportModule->pdfborderCB->setChecked(pdf.pdfborder);
2959 pdfSupportModule->pdfusetitleCB->setChecked(pdf.pdfusetitle);
2960 pdfSupportModule->colorlinksCB->setChecked(pdf.colorlinks);
2962 nn = findToken(backref_opts, pdf.backref);
2964 pdfSupportModule->backrefCO->setCurrentIndex(nn);
2966 pdfSupportModule->fullscreenCB->setChecked
2967 (pdf.pagemode == pdf.pagemode_fullscreen);
2969 pdfSupportModule->optionsLE->setText(
2970 toqstr(pdf.quoted_options));
2972 // Make sure that the bc is in the INITIAL state
2973 if (bc().policy().buttonStatus(ButtonPolicy::RESTORE))
2976 // clear changed branches cache
2977 changedBranches_.clear();
2981 void GuiDocument::saveDocDefault()
2983 // we have to apply the params first
2989 void GuiDocument::updateAvailableModules()
2991 modules_av_model_.clear();
2992 list<modInfoStruct> const & modInfoList = getModuleInfo();
2993 list<modInfoStruct>::const_iterator mit = modInfoList.begin();
2994 list<modInfoStruct>::const_iterator men = modInfoList.end();
2995 for (int i = 0; mit != men; ++mit, ++i)
2996 modules_av_model_.insertRow(i, mit->name, mit->id,
3001 void GuiDocument::updateSelectedModules()
3003 modules_sel_model_.clear();
3004 list<modInfoStruct> const selModList = getSelectedModules();
3005 list<modInfoStruct>::const_iterator mit = selModList.begin();
3006 list<modInfoStruct>::const_iterator men = selModList.end();
3007 for (int i = 0; mit != men; ++mit, ++i)
3008 modules_sel_model_.insertRow(i, mit->name, mit->id,
3013 void GuiDocument::updateIncludeonlys()
3015 masterChildModule->childrenTW->clear();
3016 QString const no = qt_("No");
3017 QString const yes = qt_("Yes");
3019 if (includeonlys_.empty()) {
3020 masterChildModule->includeallRB->setChecked(true);
3021 masterChildModule->childrenTW->setEnabled(false);
3022 masterChildModule->maintainAuxCB->setEnabled(false);
3024 masterChildModule->includeonlyRB->setChecked(true);
3025 masterChildModule->childrenTW->setEnabled(true);
3026 masterChildModule->maintainAuxCB->setEnabled(true);
3028 QTreeWidgetItem * item = 0;
3029 std::vector<Buffer *> children = buffer().getChildren(false);
3030 vector<Buffer *>::const_iterator it = children.begin();
3031 vector<Buffer *>::const_iterator end = children.end();
3032 bool has_unincluded = false;
3033 bool all_unincluded = true;
3034 for (; it != end; ++it) {
3035 item = new QTreeWidgetItem(masterChildModule->childrenTW);
3038 to_utf8(makeRelPath(from_utf8((*it)->fileName().absFileName()),
3039 from_utf8(buffer().filePath())));
3040 item->setText(0, toqstr(name));
3041 item->setText(1, isChildIncluded(name) ? yes : no);
3042 if (!isChildIncluded(name))
3043 has_unincluded = true;
3045 all_unincluded = false;
3047 // Both if all childs are included and if none is included
3048 // is equal to "include all" (i.e., ommit \includeonly).
3049 // Thus, reset the GUI.
3050 if (!has_unincluded || all_unincluded) {
3051 masterChildModule->includeallRB->setChecked(true);
3052 masterChildModule->childrenTW->setEnabled(false);
3053 includeonlys_.clear();
3055 // If all are included, we need to update again.
3056 if (!has_unincluded)
3057 updateIncludeonlys();
3061 void GuiDocument::updateContents()
3063 // Nothing to do here as the document settings is not cursor dependant.
3068 void GuiDocument::useClassDefaults()
3070 if (applyPB->isEnabled()) {
3071 int const ret = Alert::prompt(_("Unapplied changes"),
3072 _("Some changes in the dialog were not yet applied.\n"
3073 "If you do not apply now, they will be lost after this action."),
3074 1, 1, _("&Apply"), _("&Dismiss"));
3079 int idx = latexModule->classCO->currentIndex();
3080 string const classname = classes_model_.getIDString(idx);
3081 if (!bp_.setBaseClass(classname)) {
3082 Alert::error(_("Error"), _("Unable to set document class."));
3085 bp_.useClassDefaults();
3090 void GuiDocument::setLayoutComboByIDString(string const & idString)
3092 int idx = classes_model_.findIDString(idString);
3094 Alert::warning(_("Can't set layout!"),
3095 bformat(_("Unable to set layout for ID: %1$s"), from_utf8(idString)));
3097 latexModule->classCO->setCurrentIndex(idx);
3101 bool GuiDocument::isValid()
3104 validateListingsParameters().isEmpty() &&
3105 localLayout->isValid() &&
3107 // if we're asking for skips between paragraphs
3108 !textLayoutModule->skipRB->isChecked() ||
3109 // then either we haven't chosen custom
3110 textLayoutModule->skipCO->currentIndex() != 3 ||
3111 // or else a length has been given
3112 !textLayoutModule->skipLE->text().isEmpty()
3115 // if we're asking for indentation
3116 !textLayoutModule->indentRB->isChecked() ||
3117 // then either we haven't chosen custom
3118 textLayoutModule->indentCO->currentIndex() != 1 ||
3119 // or else a length has been given
3120 !textLayoutModule->indentLE->text().isEmpty()
3125 char const * const GuiDocument::fontfamilies[5] = {
3126 "default", "rmdefault", "sfdefault", "ttdefault", ""
3130 char const * GuiDocument::fontfamilies_gui[5] = {
3131 N_("Default"), N_("Roman"), N_("Sans Serif"), N_("Typewriter"), ""
3135 bool GuiDocument::initialiseParams(string const &)
3137 BufferView const * view = bufferview();
3139 bp_ = BufferParams();
3143 bp_ = view->buffer().params();
3145 updateAvailableModules();
3146 //FIXME It'd be nice to make sure here that the selected
3147 //modules are consistent: That required modules are actually
3148 //selected, and that we don't have conflicts. If so, we could
3149 //at least pop up a warning.
3155 void GuiDocument::clearParams()
3157 bp_ = BufferParams();
3161 BufferId GuiDocument::id() const
3163 BufferView const * const view = bufferview();
3164 return view? &view->buffer() : 0;
3168 list<GuiDocument::modInfoStruct> const & GuiDocument::getModuleInfo()
3170 return moduleNames_;
3174 list<GuiDocument::modInfoStruct> const
3175 GuiDocument::makeModuleInfo(LayoutModuleList const & mods)
3177 LayoutModuleList::const_iterator it = mods.begin();
3178 LayoutModuleList::const_iterator end = mods.end();
3179 list<modInfoStruct> mInfo;
3180 for (; it != end; ++it) {
3183 LyXModule const * const mod = theModuleList[*it];
3186 m.name = toqstr(translateIfPossible(from_utf8(mod->getName())));
3188 m.name = toqstr(*it) + toqstr(" (") + qt_("Not Found") + toqstr(")");
3195 list<GuiDocument::modInfoStruct> const GuiDocument::getSelectedModules()
3197 return makeModuleInfo(params().getModules());
3201 list<GuiDocument::modInfoStruct> const GuiDocument::getProvidedModules()
3203 return makeModuleInfo(params().baseClass()->providedModules());
3207 DocumentClass const & GuiDocument::documentClass() const
3209 return bp_.documentClass();
3213 static void dispatch_bufferparams(Dialog const & dialog,
3214 BufferParams const & bp, FuncCode lfun)
3217 ss << "\\begin_header\n";
3219 ss << "\\end_header\n";
3220 dialog.dispatch(FuncRequest(lfun, ss.str()));
3224 void GuiDocument::dispatchParams()
3226 // This must come first so that a language change is correctly noticed
3229 // Apply the BufferParams. Note that this will set the base class
3230 // and then update the buffer's layout.
3231 dispatch_bufferparams(*this, params(), LFUN_BUFFER_PARAMS_APPLY);
3233 if (!params().master.empty()) {
3234 FileName const master_file = support::makeAbsPath(params().master,
3235 support::onlyPath(buffer().absFileName()));
3236 if (isLyXFileName(master_file.absFileName())) {
3237 Buffer * master = checkAndLoadLyXFile(master_file);
3239 if (master->isChild(const_cast<Buffer *>(&buffer())))
3240 const_cast<Buffer &>(buffer()).setParent(master);
3242 Alert::warning(_("Assigned master does not include this file"),
3243 bformat(_("You must include this file in the document\n"
3244 "'%1$s' in order to use the master document\n"
3245 "feature."), from_utf8(params().master)));
3247 Alert::warning(_("Could not load master"),
3248 bformat(_("The master document '%1$s'\n"
3249 "could not be loaded."),
3250 from_utf8(params().master)));
3254 // Generate the colours requested by each new branch.
3255 BranchList & branchlist = params().branchlist();
3256 if (!branchlist.empty()) {
3257 BranchList::const_iterator it = branchlist.begin();
3258 BranchList::const_iterator const end = branchlist.end();
3259 for (; it != end; ++it) {
3260 docstring const & current_branch = it->branch();
3261 Branch const * branch = branchlist.find(current_branch);
3262 string const x11hexname = X11hexname(branch->color());
3263 // display the new color
3264 docstring const str = current_branch + ' ' + from_ascii(x11hexname);
3265 dispatch(FuncRequest(LFUN_SET_COLOR, str));
3268 // Open insets of selected branches, close deselected ones
3269 dispatch(FuncRequest(LFUN_INSET_FORALL,
3270 "Branch inset-toggle assign"));
3272 // rename branches in the document
3273 executeBranchRenaming();
3274 // and clear changed branches cache
3275 changedBranches_.clear();
3277 // Generate the colours requested by indices.
3278 IndicesList & indiceslist = params().indiceslist();
3279 if (!indiceslist.empty()) {
3280 IndicesList::const_iterator it = indiceslist.begin();
3281 IndicesList::const_iterator const end = indiceslist.end();
3282 for (; it != end; ++it) {
3283 docstring const & current_index = it->shortcut();
3284 Index const * index = indiceslist.findShortcut(current_index);
3285 string const x11hexname = X11hexname(index->color());
3286 // display the new color
3287 docstring const str = current_index + ' ' + from_ascii(x11hexname);
3288 dispatch(FuncRequest(LFUN_SET_COLOR, str));
3291 // FIXME: If we used an LFUN, we would not need those two lines:
3292 BufferView * bv = const_cast<BufferView *>(bufferview());
3293 bv->processUpdateFlags(Update::Force | Update::FitCursor);
3297 void GuiDocument::setLanguage() const
3299 Language const * const newL = bp_.language;
3300 if (buffer().params().language == newL)
3303 string const & lang_name = newL->lang();
3304 dispatch(FuncRequest(LFUN_BUFFER_LANGUAGE, lang_name));
3308 void GuiDocument::saveAsDefault() const
3310 dispatch_bufferparams(*this, params(), LFUN_BUFFER_SAVE_AS_DEFAULT);
3314 bool GuiDocument::isFontAvailable(string const & font) const
3316 if (font == "default" || font == "cmr"
3317 || font == "cmss" || font == "cmtt")
3318 // these are standard
3320 if (font == "lmodern" || font == "lmss" || font == "lmtt")
3321 return LaTeXFeatures::isAvailable("lmodern");
3322 if (font == "times" || font == "palatino"
3323 || font == "helvet" || font == "courier")
3324 return LaTeXFeatures::isAvailable("psnfss");
3325 if (font == "cmbr" || font == "cmtl")
3326 return LaTeXFeatures::isAvailable("cmbright");
3327 if (font == "utopia")
3328 return LaTeXFeatures::isAvailable("utopia")
3329 || LaTeXFeatures::isAvailable("fourier");
3330 if (font == "beraserif" || font == "berasans"
3331 || font == "beramono")
3332 return LaTeXFeatures::isAvailable("bera");
3333 return LaTeXFeatures::isAvailable(font);
3337 bool GuiDocument::providesOSF(string const & font) const
3339 if (outputModule->xetexCB->isChecked())
3340 // FIXME: we should check if the fonts really
3341 // have OSF support. But how?
3344 return isFontAvailable("eco");
3345 if (font == "palatino")
3346 return isFontAvailable("mathpazo");
3351 bool GuiDocument::providesSC(string const & font) const
3353 if (outputModule->xetexCB->isChecked())
3355 if (font == "palatino")
3356 return isFontAvailable("mathpazo");
3357 if (font == "utopia")
3358 return isFontAvailable("fourier");
3363 bool GuiDocument::providesScale(string const & font) const
3365 if (outputModule->xetexCB->isChecked())
3367 return font == "helvet" || font == "luximono"
3368 || font == "berasans" || font == "beramono";
3372 void GuiDocument::loadModuleInfo()
3374 moduleNames_.clear();
3375 LyXModuleList::const_iterator it = theModuleList.begin();
3376 LyXModuleList::const_iterator end = theModuleList.end();
3377 for (; it != end; ++it) {
3381 m.name = toqstr(translateIfPossible(from_utf8(it->getName())));
3382 // this is supposed to give us the first sentence of the description
3385 toqstr(translateIfPossible(from_utf8(it->getDescription())));
3386 int const pos = desc.indexOf(".");
3388 desc.truncate(pos + 1);
3389 m.description = desc;
3390 moduleNames_.push_back(m);
3395 void GuiDocument::updateUnknownBranches()
3399 list<docstring> used_branches;
3400 buffer().getUsedBranches(used_branches);
3401 list<docstring>::const_iterator it = used_branches.begin();
3402 QStringList unknown_branches;
3403 for (; it != used_branches.end() ; ++it) {
3404 if (!buffer().params().branchlist().find(*it))
3405 unknown_branches.append(toqstr(*it));
3407 branchesModule->setUnknownBranches(unknown_branches);
3411 void GuiDocument::branchesRename(docstring const & oldname, docstring const & newname)
3413 map<docstring, docstring>::iterator it = changedBranches_.begin();
3414 for (; it != changedBranches_.end() ; ++it) {
3415 if (it->second == oldname) {
3416 // branch has already been renamed
3417 it->second = newname;
3422 changedBranches_[oldname] = newname;
3426 void GuiDocument::executeBranchRenaming() const
3428 map<docstring, docstring>::const_iterator it = changedBranches_.begin();
3429 for (; it != changedBranches_.end() ; ++it) {
3430 docstring const arg = '"' + it->first + '"' + " " + '"' + it->second + '"';
3431 dispatch(FuncRequest(LFUN_BRANCHES_RENAME, arg));
3436 Dialog * createGuiDocument(GuiView & lv) { return new GuiDocument(lv); }
3439 } // namespace frontend
3442 #include "moc_GuiDocument.cpp"