2 * \file GuiDocument.cpp
3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
7 * \author Richard Heck (modules)
9 * Full author contact details are available in file CREDITS.
14 #include "GuiDocument.h"
16 #include "GuiApplication.h"
17 #include "GuiBranches.h"
18 #include "GuiIndices.h"
19 #include "GuiSelectionManager.h"
20 #include "LaTeXHighlighter.h"
21 #include "LengthCombo.h"
22 #include "PanelStack.h"
23 #include "Validator.h"
25 #include "LayoutFile.h"
26 #include "BranchList.h"
27 #include "buffer_funcs.h"
29 #include "BufferParams.h"
30 #include "BufferView.h"
32 #include "ColorCache.h"
34 #include "FloatPlacement.h"
36 #include "FuncRequest.h"
38 #include "IndicesList.h"
40 #include "LaTeXFeatures.h"
42 #include "LayoutModuleList.h"
44 #include "ModuleList.h"
45 #include "OutputParams.h"
46 #include "PDFOptions.h"
47 #include "qt_helpers.h"
50 #include "insets/InsetListingsParams.h"
52 #include "support/debug.h"
53 #include "support/FileName.h"
54 #include "support/filetools.h"
55 #include "support/gettext.h"
56 #include "support/lstrings.h"
58 #include "frontends/alert.h"
60 #include <QAbstractItemModel>
61 #include <QHeaderView>
63 #include <QColorDialog>
64 #include <QCloseEvent>
65 #include <QFontDatabase>
67 #include <QTextCursor>
77 // a style sheet for buttons
78 // this is for example used for the background color setting button
79 static inline QString colorButtonStyleSheet(QColor const & bgColor)
81 if (bgColor.isValid()) {
82 QString rc = QLatin1String("background-color:");
91 using namespace lyx::support;
96 char const * const tex_graphics[] =
98 "default", "dvialw", "dvilaser", "dvipdf", "dvipdfm", "dvipdfmx",
99 "dvips", "dvipsone", "dvitops", "dviwin", "dviwindo", "dvi2ps", "emtex",
100 "ln", "oztex", "pctexhp", "pctexps", "pctexwin", "pctex32", "pdftex",
101 "psprint", "pubps", "tcidvi", "textures", "truetex", "vtex", "xdvi",
106 char const * const tex_graphics_gui[] =
108 N_("Default"), "dvialw", "DviLaser", "dvipdf", "DVIPDFM", "DVIPDFMx",
109 "Dvips", "DVIPSONE", "DVItoPS", "DVIWIN", "DVIWindo", "dvi2ps", "EmTeX",
110 "LN", "OzTeX", "pctexhp", "pctexps", "pctexwin", "PCTeX32", "pdfTeX",
111 "psprint", "pubps", "tcidvi", "Textures", "TrueTeX", "VTeX", "xdvi",
112 "XeTeX", N_("None"), ""
116 char const * const tex_fonts_roman[] =
118 "default", "cmr", "lmodern", "ae", "times", "palatino",
119 "charter", "newcent", "bookman", "utopia", "beraserif",
120 "ccfonts", "chancery", ""
124 char const * tex_fonts_roman_gui[] =
126 N_("Default"), N_("Computer Modern Roman"), N_("Latin Modern Roman"),
127 N_("AE (Almost European)"), N_("Times Roman"), N_("Palatino"),
128 N_("Bitstream Charter"), N_("New Century Schoolbook"), N_("Bookman"),
129 N_("Utopia"), N_("Bera Serif"), N_("Concrete Roman"), N_("Zapf Chancery"),
134 char const * const tex_fonts_sans[] =
136 "default", "cmss", "lmss", "helvet", "avant", "berasans", "cmbr", ""
140 char const * tex_fonts_sans_gui[] =
142 N_("Default"), N_("Computer Modern Sans"), N_("Latin Modern Sans"),
143 N_("Helvetica"), N_("Avant Garde"), N_("Bera Sans"), N_("CM Bright"), ""
147 char const * const tex_fonts_monospaced[] =
149 "default", "cmtt", "lmtt", "courier", "beramono", "luximono", "cmtl", ""
153 char const * tex_fonts_monospaced_gui[] =
155 N_("Default"), N_("Computer Modern Typewriter"),
156 N_("Latin Modern Typewriter"), N_("Courier"), N_("Bera Mono"),
157 N_("LuxiMono"), N_("CM Typewriter Light"), ""
161 char const * backref_opts[] =
163 "false", "section", "slide", "page", ""
167 char const * backref_opts_gui[] =
169 N_("Off"), N_("Section"), N_("Slide"), N_("Page"), ""
173 vector<pair<string, QString> > pagestyles;
176 } // anonymous namespace
180 RGBColor set_backgroundcolor;
181 bool is_backgroundcolor;
182 RGBColor set_fontcolor;
184 RGBColor set_notefontcolor;
185 RGBColor set_boxbgcolor;
188 // used when sorting the textclass list.
189 class less_textclass_avail_desc
190 : public binary_function<string, string, int>
193 bool operator()(string const & lhs, string const & rhs) const
195 // Ordering criteria:
196 // 1. Availability of text class
197 // 2. Description (lexicographic)
198 LayoutFile const & tc1 = LayoutFileList::get()[lhs];
199 LayoutFile const & tc2 = LayoutFileList::get()[rhs];
200 int const order = compare_no_case(
201 translateIfPossible(from_utf8(tc1.description())),
202 translateIfPossible(from_utf8(tc2.description())));
203 return (tc1.isTeXClassAvailable() && !tc2.isTeXClassAvailable()) ||
204 (tc1.isTeXClassAvailable() == tc2.isTeXClassAvailable() && order < 0);
213 vector<string> getRequiredList(string const & modName)
215 LyXModule const * const mod = theModuleList[modName];
217 return vector<string>(); //empty such thing
218 return mod->getRequiredModules();
222 vector<string> getExcludedList(string const & modName)
224 LyXModule const * const mod = theModuleList[modName];
226 return vector<string>(); //empty such thing
227 return mod->getExcludedModules();
231 docstring getModuleDescription(string const & modName)
233 LyXModule const * const mod = theModuleList[modName];
235 return _("Module not found!");
237 return translateIfPossible(from_utf8(mod->getDescription()));
241 vector<string> getPackageList(string const & modName)
243 LyXModule const * const mod = theModuleList[modName];
245 return vector<string>(); //empty such thing
246 return mod->getPackageList();
250 bool isModuleAvailable(string const & modName)
252 LyXModule const * const mod = theModuleList[modName];
255 return mod->isAvailable();
258 } // anonymous namespace
261 /////////////////////////////////////////////////////////////////////
263 // ModuleSelectionManager
265 /////////////////////////////////////////////////////////////////////
267 /// SelectionManager for use with modules
268 class ModuleSelectionManager : public GuiSelectionManager
272 ModuleSelectionManager(
273 QTreeView * availableLV,
274 QListView * selectedLV,
278 QPushButton * downPB,
279 GuiIdListModel * availableModel,
280 GuiIdListModel * selectedModel,
281 GuiDocument const * container)
282 : GuiSelectionManager(availableLV, selectedLV, addPB, delPB,
283 upPB, downPB, availableModel, selectedModel), container_(container)
286 void updateProvidedModules(LayoutModuleList const & pm)
287 { provided_modules_ = pm.list(); }
289 void updateExcludedModules(LayoutModuleList const & em)
290 { excluded_modules_ = em.list(); }
293 virtual void updateAddPB();
295 virtual void updateUpPB();
297 virtual void updateDownPB();
299 virtual void updateDelPB();
300 /// returns availableModel as a GuiIdListModel
301 GuiIdListModel * getAvailableModel()
303 return dynamic_cast<GuiIdListModel *>(availableModel);
305 /// returns selectedModel as a GuiIdListModel
306 GuiIdListModel * getSelectedModel()
308 return dynamic_cast<GuiIdListModel *>(selectedModel);
310 /// keeps a list of the modules the text class provides
311 list<string> provided_modules_;
313 list<string> excluded_modules_;
315 GuiDocument const * container_;
318 void ModuleSelectionManager::updateAddPB()
320 int const arows = availableModel->rowCount();
321 QModelIndexList const avail_sels =
322 availableLV->selectionModel()->selectedIndexes();
324 // disable if there aren't any modules (?), if none of them is chosen
325 // in the dialog, or if the chosen one is already selected for use.
326 if (arows == 0 || avail_sels.isEmpty() || isSelected(avail_sels.first())) {
327 addPB->setEnabled(false);
331 QModelIndex const & idx = availableLV->selectionModel()->currentIndex();
332 string const modname = getAvailableModel()->getIDString(idx.row());
335 container_->params().moduleCanBeAdded(modname);
336 addPB->setEnabled(enable);
340 void ModuleSelectionManager::updateDownPB()
342 int const srows = selectedModel->rowCount();
344 downPB->setEnabled(false);
347 QModelIndex const & curidx = selectedLV->selectionModel()->currentIndex();
348 int const curRow = curidx.row();
349 if (curRow < 0 || curRow >= srows - 1) { // invalid or last item
350 downPB->setEnabled(false);
354 // determine whether immediately succeding element requires this one
355 string const curmodname = getSelectedModel()->getIDString(curRow);
356 string const nextmodname = getSelectedModel()->getIDString(curRow + 1);
358 vector<string> reqs = getRequiredList(nextmodname);
360 // if it doesn't require anything....
362 downPB->setEnabled(true);
366 // Enable it if this module isn't required.
367 // FIXME This should perhaps be more flexible and check whether, even
368 // if the next one is required, there is also an earlier one that will do.
370 find(reqs.begin(), reqs.end(), curmodname) == reqs.end());
373 void ModuleSelectionManager::updateUpPB()
375 int const srows = selectedModel->rowCount();
377 upPB->setEnabled(false);
381 QModelIndex const & curIdx = selectedLV->selectionModel()->currentIndex();
382 int curRow = curIdx.row();
383 if (curRow <= 0 || curRow > srows - 1) { // first item or invalid
384 upPB->setEnabled(false);
387 string const curmodname = getSelectedModel()->getIDString(curRow);
389 // determine whether immediately preceding element is required by this one
390 vector<string> reqs = getRequiredList(curmodname);
392 // if this one doesn't require anything....
394 upPB->setEnabled(true);
399 // Enable it if the preceding module isn't required.
400 // NOTE This is less flexible than it might be. We could check whether, even
401 // if the previous one is required, there is an earlier one that would do.
402 string const premod = getSelectedModel()->getIDString(curRow - 1);
403 upPB->setEnabled(find(reqs.begin(), reqs.end(), premod) == reqs.end());
406 void ModuleSelectionManager::updateDelPB()
408 int const srows = selectedModel->rowCount();
410 deletePB->setEnabled(false);
414 QModelIndex const & curidx =
415 selectedLV->selectionModel()->currentIndex();
416 int const curRow = curidx.row();
417 if (curRow < 0 || curRow >= srows) { // invalid index?
418 deletePB->setEnabled(false);
422 string const curmodname = getSelectedModel()->getIDString(curRow);
424 // We're looking here for a reason NOT to enable the button. If we
425 // find one, we disable it and return. If we don't, we'll end up at
426 // the end of the function, and then we enable it.
427 for (int i = curRow + 1; i < srows; ++i) {
428 string const thisMod = getSelectedModel()->getIDString(i);
429 vector<string> reqs = getRequiredList(thisMod);
430 //does this one require us?
431 if (find(reqs.begin(), reqs.end(), curmodname) == reqs.end())
435 // OK, so this module requires us
436 // is there an EARLIER module that also satisfies the require?
437 // NOTE We demand that it be earlier to keep the list of modules
438 // consistent with the rule that a module must be proceeded by a
439 // required module. There would be more flexible ways to proceed,
440 // but that would be a lot more complicated, and the logic here is
441 // already complicated. (That's why I've left the debugging code.)
442 // lyxerr << "Testing " << thisMod << endl;
443 bool foundone = false;
444 for (int j = 0; j < curRow; ++j) {
445 string const mod = getSelectedModel()->getIDString(j);
446 // lyxerr << "In loop: Testing " << mod << endl;
447 // do we satisfy the require?
448 if (find(reqs.begin(), reqs.end(), mod) != reqs.end()) {
449 // lyxerr << mod << " does the trick." << endl;
454 // did we find a module to satisfy the require?
456 // lyxerr << "No matching module found." << endl;
457 deletePB->setEnabled(false);
461 // lyxerr << "All's well that ends well." << endl;
462 deletePB->setEnabled(true);
466 /////////////////////////////////////////////////////////////////////
470 /////////////////////////////////////////////////////////////////////
472 PreambleModule::PreambleModule() : current_id_(0)
474 // This is not a memory leak. The object will be destroyed
476 (void) new LaTeXHighlighter(preambleTE->document());
477 setFocusProxy(preambleTE);
478 connect(preambleTE, SIGNAL(textChanged()), this, SIGNAL(changed()));
482 void PreambleModule::update(BufferParams const & params, BufferId id)
484 QString preamble = toqstr(params.preamble);
485 // Nothing to do if the params and preamble are unchanged.
486 if (id == current_id_
487 && preamble == preambleTE->document()->toPlainText())
490 QTextCursor cur = preambleTE->textCursor();
491 // Save the coords before switching to the new one.
492 preamble_coords_[current_id_] =
493 make_pair(cur.position(), preambleTE->verticalScrollBar()->value());
495 // Save the params address for further use.
497 preambleTE->document()->setPlainText(preamble);
498 Coords::const_iterator it = preamble_coords_.find(current_id_);
499 if (it == preamble_coords_.end())
500 // First time we open this one.
501 preamble_coords_[current_id_] = make_pair(0, 0);
503 // Restore saved coords.
504 QTextCursor cur = preambleTE->textCursor();
505 cur.setPosition(it->second.first);
506 preambleTE->setTextCursor(cur);
507 preambleTE->verticalScrollBar()->setValue(it->second.second);
512 void PreambleModule::apply(BufferParams & params)
514 params.preamble = fromqstr(preambleTE->document()->toPlainText());
518 void PreambleModule::closeEvent(QCloseEvent * e)
520 // Save the coords before closing.
521 QTextCursor cur = preambleTE->textCursor();
522 preamble_coords_[current_id_] =
523 make_pair(cur.position(), preambleTE->verticalScrollBar()->value());
528 /////////////////////////////////////////////////////////////////////
532 /////////////////////////////////////////////////////////////////////
535 GuiDocument::GuiDocument(GuiView & lv)
536 : GuiDialog(lv, "document", qt_("Document Settings"))
540 connect(okPB, SIGNAL(clicked()), this, SLOT(slotOK()));
541 connect(applyPB, SIGNAL(clicked()), this, SLOT(slotApply()));
542 connect(closePB, SIGNAL(clicked()), this, SLOT(slotClose()));
543 connect(restorePB, SIGNAL(clicked()), this, SLOT(slotRestore()));
545 connect(savePB, SIGNAL(clicked()), this, SLOT(saveDefaultClicked()));
546 connect(defaultPB, SIGNAL(clicked()), this, SLOT(useDefaultsClicked()));
548 // Manage the restore, ok, apply, restore and cancel/close buttons
549 bc().setPolicy(ButtonPolicy::NoRepeatedApplyReadOnlyPolicy);
551 bc().setApply(applyPB);
552 bc().setCancel(closePB);
553 bc().setRestore(restorePB);
557 textLayoutModule = new UiWidget<Ui::TextLayoutUi>;
558 connect(textLayoutModule->lspacingCO, SIGNAL(activated(int)),
559 this, SLOT(change_adaptor()));
560 connect(textLayoutModule->lspacingCO, SIGNAL(activated(int)),
561 this, SLOT(setLSpacing(int)));
562 connect(textLayoutModule->lspacingLE, SIGNAL(textChanged(const QString &)),
563 this, SLOT(change_adaptor()));
565 connect(textLayoutModule->indentRB, SIGNAL(clicked()),
566 this, SLOT(change_adaptor()));
567 connect(textLayoutModule->indentRB, SIGNAL(toggled(bool)),
568 textLayoutModule->indentCO, SLOT(setEnabled(bool)));
569 connect(textLayoutModule->indentCO, SIGNAL(activated(int)),
570 this, SLOT(change_adaptor()));
571 connect(textLayoutModule->indentCO, SIGNAL(activated(int)),
572 this, SLOT(setIndent(int)));
573 connect(textLayoutModule->indentLE, SIGNAL(textChanged(const QString &)),
574 this, SLOT(change_adaptor()));
575 connect(textLayoutModule->indentLengthCO, SIGNAL(activated(int)),
576 this, SLOT(change_adaptor()));
578 connect(textLayoutModule->skipRB, SIGNAL(clicked()),
579 this, SLOT(change_adaptor()));
580 connect(textLayoutModule->skipRB, SIGNAL(toggled(bool)),
581 textLayoutModule->skipCO, SLOT(setEnabled(bool)));
582 connect(textLayoutModule->skipCO, SIGNAL(activated(int)),
583 this, SLOT(change_adaptor()));
584 connect(textLayoutModule->skipCO, SIGNAL(activated(int)),
585 this, SLOT(setSkip(int)));
586 connect(textLayoutModule->skipLE, SIGNAL(textChanged(const QString &)),
587 this, SLOT(change_adaptor()));
588 connect(textLayoutModule->skipLengthCO, SIGNAL(activated(int)),
589 this, SLOT(change_adaptor()));
591 connect(textLayoutModule->indentRB, SIGNAL(toggled(bool)),
592 this, SLOT(enableIndent(bool)));
593 connect(textLayoutModule->skipRB, SIGNAL(toggled(bool)),
594 this, SLOT(enableSkip(bool)));
596 connect(textLayoutModule->twoColumnCB, SIGNAL(clicked()),
597 this, SLOT(change_adaptor()));
598 connect(textLayoutModule->twoColumnCB, SIGNAL(clicked()),
599 this, SLOT(setColSep()));
601 textLayoutModule->lspacingLE->setValidator(new QDoubleValidator(
602 textLayoutModule->lspacingLE));
603 textLayoutModule->indentLE->setValidator(unsignedLengthValidator(
604 textLayoutModule->indentLE));
605 textLayoutModule->skipLE->setValidator(unsignedGlueLengthValidator(
606 textLayoutModule->skipLE));
608 textLayoutModule->indentCO->addItem(qt_("Default"));
609 textLayoutModule->indentCO->addItem(qt_("Custom"));
610 textLayoutModule->skipCO->addItem(qt_("SmallSkip"));
611 textLayoutModule->skipCO->addItem(qt_("MedSkip"));
612 textLayoutModule->skipCO->addItem(qt_("BigSkip"));
613 textLayoutModule->skipCO->addItem(qt_("Custom"));
614 textLayoutModule->lspacingCO->insertItem(
615 Spacing::Single, qt_("Single"));
616 textLayoutModule->lspacingCO->insertItem(
617 Spacing::Onehalf, qt_("OneHalf"));
618 textLayoutModule->lspacingCO->insertItem(
619 Spacing::Double, qt_("Double"));
620 textLayoutModule->lspacingCO->insertItem(
621 Spacing::Other, qt_("Custom"));
622 // initialize the length validator
623 bc().addCheckedLineEdit(textLayoutModule->indentLE);
624 bc().addCheckedLineEdit(textLayoutModule->skipLE);
627 // master/child handling
628 masterChildModule = new UiWidget<Ui::MasterChildUi>;
630 connect(masterChildModule->childrenTW, SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)),
631 this, SLOT(includeonlyClicked(QTreeWidgetItem *, int)));
632 connect(masterChildModule->includeonlyRB, SIGNAL(toggled(bool)),
633 masterChildModule->childrenTW, SLOT(setEnabled(bool)));
634 connect(masterChildModule->includeonlyRB, SIGNAL(toggled(bool)),
635 masterChildModule->maintainAuxCB, SLOT(setEnabled(bool)));
636 connect(masterChildModule->includeallRB, SIGNAL(clicked()),
637 this, SLOT(change_adaptor()));
638 connect(masterChildModule->includeonlyRB, SIGNAL(clicked()),
639 this, SLOT(change_adaptor()));
640 connect(masterChildModule->maintainAuxCB, SIGNAL(clicked()),
641 this, SLOT(change_adaptor()));
642 masterChildModule->childrenTW->setColumnCount(2);
643 masterChildModule->childrenTW->headerItem()->setText(0, qt_("Child Document"));
644 masterChildModule->childrenTW->headerItem()->setText(1, qt_("Include to Output"));
645 masterChildModule->childrenTW->resizeColumnToContents(1);
646 masterChildModule->childrenTW->resizeColumnToContents(2);
650 outputModule = new UiWidget<Ui::OutputUi>;
652 connect(outputModule->xetexCB, SIGNAL(clicked()),
653 this, SLOT(change_adaptor()));
654 connect(outputModule->xetexCB, SIGNAL(toggled(bool)),
655 this, SLOT(xetexChanged(bool)));
656 connect(outputModule->defaultFormatCO, SIGNAL(activated(int)),
657 this, SLOT(change_adaptor()));
658 connect(outputModule->mathimgSB, SIGNAL(valueChanged(double)),
659 this, SLOT(change_adaptor()));
660 connect(outputModule->strictCB, SIGNAL(stateChanged(int)),
661 this, SLOT(change_adaptor()));
662 connect(outputModule->mathoutCB, SIGNAL(currentIndexChanged(int)),
663 this, SLOT(change_adaptor()));
667 fontModule = new UiWidget<Ui::FontUi>;
668 connect(fontModule->fontsRomanCO, SIGNAL(activated(int)),
669 this, SLOT(change_adaptor()));
670 connect(fontModule->fontsRomanCO, SIGNAL(activated(int)),
671 this, SLOT(romanChanged(int)));
672 connect(fontModule->fontsSansCO, SIGNAL(activated(int)),
673 this, SLOT(change_adaptor()));
674 connect(fontModule->fontsSansCO, SIGNAL(activated(int)),
675 this, SLOT(sansChanged(int)));
676 connect(fontModule->fontsTypewriterCO, SIGNAL(activated(int)),
677 this, SLOT(change_adaptor()));
678 connect(fontModule->fontsTypewriterCO, SIGNAL(activated(int)),
679 this, SLOT(ttChanged(int)));
680 connect(fontModule->fontsDefaultCO, SIGNAL(activated(int)),
681 this, SLOT(change_adaptor()));
682 connect(fontModule->fontencCO, SIGNAL(activated(int)),
683 this, SLOT(change_adaptor()));
684 connect(fontModule->fontencCO, SIGNAL(activated(int)),
685 this, SLOT(fontencChanged(int)));
686 connect(fontModule->fontencLE, SIGNAL(textChanged(const QString &)),
687 this, SLOT(change_adaptor()));
688 connect(fontModule->fontsizeCO, SIGNAL(activated(int)),
689 this, SLOT(change_adaptor()));
690 connect(fontModule->cjkFontLE, SIGNAL(textChanged(const QString &)),
691 this, SLOT(change_adaptor()));
692 connect(fontModule->scaleSansSB, SIGNAL(valueChanged(int)),
693 this, SLOT(change_adaptor()));
694 connect(fontModule->scaleTypewriterSB, SIGNAL(valueChanged(int)),
695 this, SLOT(change_adaptor()));
696 connect(fontModule->fontScCB, SIGNAL(clicked()),
697 this, SLOT(change_adaptor()));
698 connect(fontModule->fontOsfCB, SIGNAL(clicked()),
699 this, SLOT(change_adaptor()));
703 fontModule->fontsizeCO->addItem(qt_("Default"));
704 fontModule->fontsizeCO->addItem(qt_("10"));
705 fontModule->fontsizeCO->addItem(qt_("11"));
706 fontModule->fontsizeCO->addItem(qt_("12"));
708 fontModule->fontencCO->addItem(qt_("Default"));
709 fontModule->fontencCO->addItem(qt_("Custom"));
710 fontModule->fontencCO->addItem(qt_("None (no fontenc)"));
712 for (int n = 0; GuiDocument::fontfamilies_gui[n][0]; ++n)
713 fontModule->fontsDefaultCO->addItem(
714 qt_(GuiDocument::fontfamilies_gui[n]));
718 pageLayoutModule = new UiWidget<Ui::PageLayoutUi>;
719 connect(pageLayoutModule->papersizeCO, SIGNAL(activated(int)),
720 this, SLOT(papersizeChanged(int)));
721 connect(pageLayoutModule->papersizeCO, SIGNAL(activated(int)),
722 this, SLOT(papersizeChanged(int)));
723 connect(pageLayoutModule->portraitRB, SIGNAL(clicked()),
724 this, SLOT(change_adaptor()));
725 connect(pageLayoutModule->papersizeCO, SIGNAL(activated(int)),
726 this, SLOT(change_adaptor()));
727 connect(pageLayoutModule->paperheightLE, SIGNAL(textChanged(const QString &)),
728 this, SLOT(change_adaptor()));
729 connect(pageLayoutModule->paperwidthLE, SIGNAL(textChanged(const QString &)),
730 this, SLOT(change_adaptor()));
731 connect(pageLayoutModule->paperwidthUnitCO, SIGNAL(activated(int)),
732 this, SLOT(change_adaptor()));
733 connect(pageLayoutModule->paperheightUnitCO, SIGNAL(activated(int)),
734 this, SLOT(change_adaptor()));
735 connect(pageLayoutModule->portraitRB, SIGNAL(clicked()),
736 this, SLOT(change_adaptor()));
737 connect(pageLayoutModule->landscapeRB, SIGNAL(clicked()),
738 this, SLOT(change_adaptor()));
739 connect(pageLayoutModule->facingPagesCB, SIGNAL(clicked()),
740 this, SLOT(change_adaptor()));
741 connect(pageLayoutModule->pagestyleCO, SIGNAL(activated(int)),
742 this, SLOT(change_adaptor()));
744 pageLayoutModule->pagestyleCO->addItem(qt_("Default"));
745 pageLayoutModule->pagestyleCO->addItem(qt_("empty"));
746 pageLayoutModule->pagestyleCO->addItem(qt_("plain"));
747 pageLayoutModule->pagestyleCO->addItem(qt_("headings"));
748 pageLayoutModule->pagestyleCO->addItem(qt_("fancy"));
749 bc().addCheckedLineEdit(pageLayoutModule->paperheightLE,
750 pageLayoutModule->paperheightL);
751 bc().addCheckedLineEdit(pageLayoutModule->paperwidthLE,
752 pageLayoutModule->paperwidthL);
754 QComboBox * cb = pageLayoutModule->papersizeCO;
755 cb->addItem(qt_("Default"));
756 cb->addItem(qt_("Custom"));
757 cb->addItem(qt_("US letter"));
758 cb->addItem(qt_("US legal"));
759 cb->addItem(qt_("US executive"));
760 cb->addItem(qt_("A0"));
761 cb->addItem(qt_("A1"));
762 cb->addItem(qt_("A2"));
763 cb->addItem(qt_("A3"));
764 cb->addItem(qt_("A4"));
765 cb->addItem(qt_("A5"));
766 cb->addItem(qt_("A6"));
767 cb->addItem(qt_("B0"));
768 cb->addItem(qt_("B1"));
769 cb->addItem(qt_("B2"));
770 cb->addItem(qt_("B3"));
771 cb->addItem(qt_("B4"));
772 cb->addItem(qt_("B5"));
773 cb->addItem(qt_("B6"));
774 cb->addItem(qt_("JIS B0"));
775 cb->addItem(qt_("JIS B1"));
776 cb->addItem(qt_("JIS B2"));
777 cb->addItem(qt_("JIS B3"));
778 cb->addItem(qt_("JIS B4"));
779 cb->addItem(qt_("JIS B5"));
780 cb->addItem(qt_("JIS B6"));
781 // remove the %-items from the unit choice
782 pageLayoutModule->paperwidthUnitCO->noPercents();
783 pageLayoutModule->paperheightUnitCO->noPercents();
784 pageLayoutModule->paperheightLE->setValidator(unsignedLengthValidator(
785 pageLayoutModule->paperheightLE));
786 pageLayoutModule->paperwidthLE->setValidator(unsignedLengthValidator(
787 pageLayoutModule->paperwidthLE));
791 marginsModule = new UiWidget<Ui::MarginsUi>;
792 connect(marginsModule->marginCB, SIGNAL(toggled(bool)),
793 this, SLOT(setCustomMargins(bool)));
794 connect(marginsModule->marginCB, SIGNAL(clicked()),
795 this, SLOT(change_adaptor()));
796 connect(marginsModule->topLE, SIGNAL(textChanged(QString)),
797 this, SLOT(change_adaptor()));
798 connect(marginsModule->topUnit, SIGNAL(activated(int)),
799 this, SLOT(change_adaptor()));
800 connect(marginsModule->bottomLE, SIGNAL(textChanged(QString)),
801 this, SLOT(change_adaptor()));
802 connect(marginsModule->bottomUnit, SIGNAL(activated(int)),
803 this, SLOT(change_adaptor()));
804 connect(marginsModule->innerLE, SIGNAL(textChanged(QString)),
805 this, SLOT(change_adaptor()));
806 connect(marginsModule->innerUnit, SIGNAL(activated(int)),
807 this, SLOT(change_adaptor()));
808 connect(marginsModule->outerLE, SIGNAL(textChanged(QString)),
809 this, SLOT(change_adaptor()));
810 connect(marginsModule->outerUnit, SIGNAL(activated(int)),
811 this, SLOT(change_adaptor()));
812 connect(marginsModule->headheightLE, SIGNAL(textChanged(QString)),
813 this, SLOT(change_adaptor()));
814 connect(marginsModule->headheightUnit, SIGNAL(activated(int)),
815 this, SLOT(change_adaptor()));
816 connect(marginsModule->headsepLE, SIGNAL(textChanged(QString)),
817 this, SLOT(change_adaptor()));
818 connect(marginsModule->headsepUnit, SIGNAL(activated(int)),
819 this, SLOT(change_adaptor()));
820 connect(marginsModule->footskipLE, SIGNAL(textChanged(QString)),
821 this, SLOT(change_adaptor()));
822 connect(marginsModule->footskipUnit, SIGNAL(activated(int)),
823 this, SLOT(change_adaptor()));
824 connect(marginsModule->columnsepLE, SIGNAL(textChanged(QString)),
825 this, SLOT(change_adaptor()));
826 connect(marginsModule->columnsepUnit, SIGNAL(activated(int)),
827 this, SLOT(change_adaptor()));
828 marginsModule->topLE->setValidator(unsignedLengthValidator(
829 marginsModule->topLE));
830 marginsModule->bottomLE->setValidator(unsignedLengthValidator(
831 marginsModule->bottomLE));
832 marginsModule->innerLE->setValidator(unsignedLengthValidator(
833 marginsModule->innerLE));
834 marginsModule->outerLE->setValidator(unsignedLengthValidator(
835 marginsModule->outerLE));
836 marginsModule->headsepLE->setValidator(unsignedLengthValidator(
837 marginsModule->headsepLE));
838 marginsModule->headheightLE->setValidator(unsignedLengthValidator(
839 marginsModule->headheightLE));
840 marginsModule->footskipLE->setValidator(unsignedLengthValidator(
841 marginsModule->footskipLE));
842 marginsModule->columnsepLE->setValidator(unsignedLengthValidator(
843 marginsModule->columnsepLE));
845 bc().addCheckedLineEdit(marginsModule->topLE,
846 marginsModule->topL);
847 bc().addCheckedLineEdit(marginsModule->bottomLE,
848 marginsModule->bottomL);
849 bc().addCheckedLineEdit(marginsModule->innerLE,
850 marginsModule->innerL);
851 bc().addCheckedLineEdit(marginsModule->outerLE,
852 marginsModule->outerL);
853 bc().addCheckedLineEdit(marginsModule->headsepLE,
854 marginsModule->headsepL);
855 bc().addCheckedLineEdit(marginsModule->headheightLE,
856 marginsModule->headheightL);
857 bc().addCheckedLineEdit(marginsModule->footskipLE,
858 marginsModule->footskipL);
859 bc().addCheckedLineEdit(marginsModule->columnsepLE,
860 marginsModule->columnsepL);
864 langModule = new UiWidget<Ui::LanguageUi>;
865 connect(langModule->languageCO, SIGNAL(activated(int)),
866 this, SLOT(change_adaptor()));
867 connect(langModule->defaultencodingRB, SIGNAL(clicked()),
868 this, SLOT(change_adaptor()));
869 connect(langModule->otherencodingRB, SIGNAL(clicked()),
870 this, SLOT(change_adaptor()));
871 connect(langModule->encodingCO, SIGNAL(activated(int)),
872 this, SLOT(change_adaptor()));
873 connect(langModule->quoteStyleCO, SIGNAL(activated(int)),
874 this, SLOT(change_adaptor()));
876 QAbstractItemModel * language_model = guiApp->languageModel();
877 // FIXME: it would be nice if sorting was enabled/disabled via a checkbox.
878 language_model->sort(0);
879 langModule->languageCO->setModel(language_model);
880 langModule->languageCO->setModelColumn(0);
882 // Always put the default encoding in the first position.
883 langModule->encodingCO->addItem(qt_("Language Default (no inputenc)"));
884 QStringList encodinglist;
885 Encodings::const_iterator it = encodings.begin();
886 Encodings::const_iterator const end = encodings.end();
887 for (; it != end; ++it)
888 encodinglist.append(qt_(it->guiName()));
890 langModule->encodingCO->addItems(encodinglist);
892 langModule->quoteStyleCO->addItem(qt_("``text''"));
893 langModule->quoteStyleCO->addItem(qt_("''text''"));
894 langModule->quoteStyleCO->addItem(qt_(",,text``"));
895 langModule->quoteStyleCO->addItem(qt_(",,text''"));
896 langModule->quoteStyleCO->addItem(qt_("<<text>>"));
897 langModule->quoteStyleCO->addItem(qt_(">>text<<"));
901 colorModule = new UiWidget<Ui::ColorUi>;
902 connect(colorModule->fontColorPB, SIGNAL(clicked()),
903 this, SLOT(changeFontColor()));
904 connect(colorModule->delFontColorTB, SIGNAL(clicked()),
905 this, SLOT(deleteFontColor()));
906 connect(colorModule->noteFontColorPB, SIGNAL(clicked()),
907 this, SLOT(changeNoteFontColor()));
908 connect(colorModule->delNoteFontColorTB, SIGNAL(clicked()),
909 this, SLOT(deleteNoteFontColor()));
910 connect(colorModule->backgroundPB, SIGNAL(clicked()),
911 this, SLOT(changeBackgroundColor()));
912 connect(colorModule->delBackgroundTB, SIGNAL(clicked()),
913 this, SLOT(deleteBackgroundColor()));
914 connect(colorModule->boxBackgroundPB, SIGNAL(clicked()),
915 this, SLOT(changeBoxBackgroundColor()));
916 connect(colorModule->delBoxBackgroundTB, SIGNAL(clicked()),
917 this, SLOT(deleteBoxBackgroundColor()));
921 numberingModule = new UiWidget<Ui::NumberingUi>;
922 connect(numberingModule->depthSL, SIGNAL(valueChanged(int)),
923 this, SLOT(change_adaptor()));
924 connect(numberingModule->tocSL, SIGNAL(valueChanged(int)),
925 this, SLOT(change_adaptor()));
926 connect(numberingModule->depthSL, SIGNAL(valueChanged(int)),
927 this, SLOT(updateNumbering()));
928 connect(numberingModule->tocSL, SIGNAL(valueChanged(int)),
929 this, SLOT(updateNumbering()));
930 numberingModule->tocTW->setColumnCount(3);
931 numberingModule->tocTW->headerItem()->setText(0, qt_("Example"));
932 numberingModule->tocTW->headerItem()->setText(1, qt_("Numbered"));
933 numberingModule->tocTW->headerItem()->setText(2, qt_("Appears in TOC"));
937 biblioModule = new UiWidget<Ui::BiblioUi>;
938 connect(biblioModule->citeNatbibRB, SIGNAL(toggled(bool)),
939 biblioModule->citationStyleL, SLOT(setEnabled(bool)));
940 connect(biblioModule->citeNatbibRB, SIGNAL(toggled(bool)),
941 biblioModule->citeStyleCO, SLOT(setEnabled(bool)));
942 connect(biblioModule->citeDefaultRB, SIGNAL(clicked()),
943 this, SLOT(change_adaptor()));
944 connect(biblioModule->citeNatbibRB, SIGNAL(clicked()),
945 this, SLOT(change_adaptor()));
946 connect(biblioModule->citeStyleCO, SIGNAL(activated(int)),
947 this, SLOT(change_adaptor()));
948 connect(biblioModule->citeJurabibRB, SIGNAL(clicked()),
949 this, SLOT(change_adaptor()));
950 connect(biblioModule->bibtopicCB, SIGNAL(clicked()),
951 this, SLOT(change_adaptor()));
952 connect(biblioModule->bibtexCO, SIGNAL(activated(int)),
953 this, SLOT(bibtexChanged(int)));
954 connect(biblioModule->bibtexOptionsED, SIGNAL(textChanged(QString)),
955 this, SLOT(change_adaptor()));
957 biblioModule->citeStyleCO->addItem(qt_("Author-year"));
958 biblioModule->citeStyleCO->addItem(qt_("Numerical"));
959 biblioModule->citeStyleCO->setCurrentIndex(0);
961 biblioModule->bibtexCO->clear();
962 biblioModule->bibtexCO->addItem(qt_("Default"), QString("default"));
963 for (set<string>::const_iterator it = lyxrc.bibtex_alternatives.begin();
964 it != lyxrc.bibtex_alternatives.end(); ++it) {
965 QString const command = toqstr(*it).left(toqstr(*it).indexOf(" "));
966 biblioModule->bibtexCO->addItem(command, command);
971 indicesModule = new GuiIndices;
972 connect(indicesModule, SIGNAL(changed()),
973 this, SLOT(change_adaptor()));
977 mathsModule = new UiWidget<Ui::MathsUi>;
978 connect(mathsModule->amsautoCB, SIGNAL(toggled(bool)),
979 mathsModule->amsCB, SLOT(setDisabled(bool)));
980 connect(mathsModule->esintautoCB, SIGNAL(toggled(bool)),
981 mathsModule->esintCB, SLOT(setDisabled(bool)));
982 connect(mathsModule->mhchemautoCB, SIGNAL(toggled(bool)),
983 mathsModule->mhchemCB, SLOT(setDisabled(bool)));
985 connect(mathsModule->amsCB, SIGNAL(clicked()),
986 this, SLOT(change_adaptor()));
987 connect(mathsModule->amsautoCB, SIGNAL(clicked()),
988 this, SLOT(change_adaptor()));
989 connect(mathsModule->esintCB, SIGNAL(clicked()),
990 this, SLOT(change_adaptor()));
991 connect(mathsModule->esintautoCB, SIGNAL(clicked()),
992 this, SLOT(change_adaptor()));
993 connect(mathsModule->mhchemCB, SIGNAL(clicked()),
994 this, SLOT(change_adaptor()));
995 connect(mathsModule->mhchemautoCB, SIGNAL(clicked()),
996 this, SLOT(change_adaptor()));
1000 latexModule = new UiWidget<Ui::LaTeXUi>;
1001 connect(latexModule->optionsLE, SIGNAL(textChanged(QString)),
1002 this, SLOT(change_adaptor()));
1003 connect(latexModule->defaultOptionsCB, SIGNAL(clicked()),
1004 this, SLOT(change_adaptor()));
1005 connect(latexModule->psdriverCO, SIGNAL(activated(int)),
1006 this, SLOT(change_adaptor()));
1007 connect(latexModule->classCO, SIGNAL(activated(int)),
1008 this, SLOT(classChanged()));
1009 connect(latexModule->classCO, SIGNAL(activated(int)),
1010 this, SLOT(change_adaptor()));
1011 connect(latexModule->layoutPB, SIGNAL(clicked()),
1012 this, SLOT(browseLayout()));
1013 connect(latexModule->layoutPB, SIGNAL(clicked()),
1014 this, SLOT(change_adaptor()));
1015 connect(latexModule->childDocGB, SIGNAL(clicked()),
1016 this, SLOT(change_adaptor()));
1017 connect(latexModule->childDocLE, SIGNAL(textChanged(QString)),
1018 this, SLOT(change_adaptor()));
1019 connect(latexModule->childDocPB, SIGNAL(clicked()),
1020 this, SLOT(browseMaster()));
1021 connect(latexModule->suppressDateCB, SIGNAL(clicked()),
1022 this, SLOT(change_adaptor()));
1024 // postscript drivers
1025 for (int n = 0; tex_graphics[n][0]; ++n) {
1026 QString enc = qt_(tex_graphics_gui[n]);
1027 latexModule->psdriverCO->addItem(enc);
1030 latexModule->classCO->setModel(&classes_model_);
1031 LayoutFileList const & bcl = LayoutFileList::get();
1032 vector<LayoutFileIndex> classList = bcl.classList();
1033 sort(classList.begin(), classList.end(), less_textclass_avail_desc());
1035 vector<LayoutFileIndex>::const_iterator cit = classList.begin();
1036 vector<LayoutFileIndex>::const_iterator cen = classList.end();
1037 for (int i = 0; cit != cen; ++cit, ++i) {
1038 LayoutFile const & tc = bcl[*cit];
1039 docstring item = (tc.isTeXClassAvailable()) ?
1040 from_utf8(tc.description()) :
1041 bformat(_("Unavailable: %1$s"), from_utf8(tc.description()));
1042 classes_model_.insertRow(i, toqstr(item), *cit);
1047 branchesModule = new GuiBranches;
1048 connect(branchesModule, SIGNAL(changed()),
1049 this, SLOT(change_adaptor()));
1050 connect(branchesModule, SIGNAL(renameBranches(docstring const &, docstring const &)),
1051 this, SLOT(branchesRename(docstring const &, docstring const &)));
1052 updateUnknownBranches();
1056 preambleModule = new PreambleModule;
1057 connect(preambleModule, SIGNAL(changed()),
1058 this, SLOT(change_adaptor()));
1062 bulletsModule = new BulletsModule;
1063 connect(bulletsModule, SIGNAL(changed()),
1064 this, SLOT(change_adaptor()));
1068 modulesModule = new UiWidget<Ui::ModulesUi>;
1069 modulesModule->availableLV->header()->setVisible(false);
1071 new ModuleSelectionManager(modulesModule->availableLV,
1072 modulesModule->selectedLV,
1073 modulesModule->addPB, modulesModule->deletePB,
1074 modulesModule->upPB, modulesModule->downPB,
1075 availableModel(), selectedModel(), this);
1076 connect(selectionManager, SIGNAL(updateHook()),
1077 this, SLOT(updateModuleInfo()));
1078 connect(selectionManager, SIGNAL(updateHook()),
1079 this, SLOT(change_adaptor()));
1080 connect(selectionManager, SIGNAL(selectionChanged()),
1081 this, SLOT(modulesChanged()));
1085 pdfSupportModule = new UiWidget<Ui::PDFSupportUi>;
1086 connect(pdfSupportModule->use_hyperrefGB, SIGNAL(toggled(bool)),
1087 this, SLOT(change_adaptor()));
1088 connect(pdfSupportModule->titleLE, SIGNAL(textChanged(QString)),
1089 this, SLOT(change_adaptor()));
1090 connect(pdfSupportModule->authorLE, SIGNAL(textChanged(QString)),
1091 this, SLOT(change_adaptor()));
1092 connect(pdfSupportModule->subjectLE, SIGNAL(textChanged(QString)),
1093 this, SLOT(change_adaptor()));
1094 connect(pdfSupportModule->keywordsLE, SIGNAL(textChanged(QString)),
1095 this, SLOT(change_adaptor()));
1096 connect(pdfSupportModule->bookmarksGB, SIGNAL(toggled(bool)),
1097 this, SLOT(change_adaptor()));
1098 connect(pdfSupportModule->bookmarksnumberedCB, SIGNAL(toggled(bool)),
1099 this, SLOT(change_adaptor()));
1100 connect(pdfSupportModule->bookmarksopenGB, SIGNAL(toggled(bool)),
1101 this, SLOT(change_adaptor()));
1102 connect(pdfSupportModule->bookmarksopenlevelSB, SIGNAL(valueChanged(int)),
1103 this, SLOT(change_adaptor()));
1104 connect(pdfSupportModule->breaklinksCB, SIGNAL(toggled(bool)),
1105 this, SLOT(change_adaptor()));
1106 connect(pdfSupportModule->pdfborderCB, SIGNAL(toggled(bool)),
1107 this, SLOT(change_adaptor()));
1108 connect(pdfSupportModule->colorlinksCB, SIGNAL(toggled(bool)),
1109 this, SLOT(change_adaptor()));
1110 connect(pdfSupportModule->backrefCO, SIGNAL(activated(int)),
1111 this, SLOT(change_adaptor()));
1112 connect(pdfSupportModule->pdfusetitleCB, SIGNAL(toggled(bool)),
1113 this, SLOT(change_adaptor()));
1114 connect(pdfSupportModule->fullscreenCB, SIGNAL(toggled(bool)),
1115 this, SLOT(change_adaptor()));
1116 connect(pdfSupportModule->optionsLE, SIGNAL(textChanged(QString)),
1117 this, SLOT(change_adaptor()));
1119 for (int i = 0; backref_opts[i][0]; ++i)
1120 pdfSupportModule->backrefCO->addItem(qt_(backref_opts_gui[i]));
1124 floatModule = new FloatPlacement;
1125 connect(floatModule, SIGNAL(changed()),
1126 this, SLOT(change_adaptor()));
1130 listingsModule = new UiWidget<Ui::ListingsSettingsUi>;
1131 connect(listingsModule->listingsED, SIGNAL(textChanged()),
1132 this, SLOT(change_adaptor()));
1133 connect(listingsModule->bypassCB, SIGNAL(clicked()),
1134 this, SLOT(change_adaptor()));
1135 connect(listingsModule->bypassCB, SIGNAL(clicked()),
1136 this, SLOT(setListingsMessage()));
1137 connect(listingsModule->listingsED, SIGNAL(textChanged()),
1138 this, SLOT(setListingsMessage()));
1139 listingsModule->listingsTB->setPlainText(
1140 qt_("Input listings parameters below. Enter ? for a list of parameters."));
1144 docPS->addPanel(latexModule, qt_("Document Class"));
1145 docPS->addPanel(masterChildModule, qt_("Child Documents"));
1146 docPS->addPanel(modulesModule, qt_("Modules"));
1147 docPS->addPanel(fontModule, qt_("Fonts"));
1148 docPS->addPanel(textLayoutModule, qt_("Text Layout"));
1149 docPS->addPanel(pageLayoutModule, qt_("Page Layout"));
1150 docPS->addPanel(marginsModule, qt_("Page Margins"));
1151 docPS->addPanel(langModule, qt_("Language"));
1152 docPS->addPanel(colorModule, qt_("Colors"));
1153 docPS->addPanel(numberingModule, qt_("Numbering & TOC"));
1154 docPS->addPanel(biblioModule, qt_("Bibliography"));
1155 docPS->addPanel(indicesModule, qt_("Indexes"));
1156 docPS->addPanel(pdfSupportModule, qt_("PDF Properties"));
1157 docPS->addPanel(mathsModule, qt_("Math Options"));
1158 docPS->addPanel(floatModule, qt_("Float Placement"));
1159 docPS->addPanel(listingsModule, qt_("Listings"));
1160 docPS->addPanel(bulletsModule, qt_("Bullets"));
1161 docPS->addPanel(branchesModule, qt_("Branches"));
1162 docPS->addPanel(outputModule, qt_("Output"));
1163 docPS->addPanel(preambleModule, qt_("LaTeX Preamble"));
1164 docPS->setCurrentPanel(qt_("Document Class"));
1165 // FIXME: hack to work around resizing bug in Qt >= 4.2
1166 // bug verified with Qt 4.2.{0-3} (JSpitzm)
1167 #if QT_VERSION >= 0x040200
1168 docPS->updateGeometry();
1173 void GuiDocument::showPreamble()
1175 docPS->setCurrentPanel(qt_("LaTeX Preamble"));
1179 void GuiDocument::saveDefaultClicked()
1185 void GuiDocument::useDefaultsClicked()
1191 void GuiDocument::change_adaptor()
1197 void GuiDocument::includeonlyClicked(QTreeWidgetItem * item, int)
1202 string child = fromqstr(item->text(0));
1206 if (std::find(includeonlys_.begin(),
1207 includeonlys_.end(), child) != includeonlys_.end())
1208 includeonlys_.remove(child);
1210 includeonlys_.push_back(child);
1212 updateIncludeonlys();
1217 QString GuiDocument::validateListingsParameters()
1219 // use a cache here to avoid repeated validation
1220 // of the same parameters
1221 static string param_cache;
1222 static QString msg_cache;
1224 if (listingsModule->bypassCB->isChecked())
1227 string params = fromqstr(listingsModule->listingsED->toPlainText());
1228 if (params != param_cache) {
1229 param_cache = params;
1230 msg_cache = toqstr(InsetListingsParams(params).validate());
1236 void GuiDocument::setListingsMessage()
1238 static bool isOK = true;
1239 QString msg = validateListingsParameters();
1240 if (msg.isEmpty()) {
1244 // listingsTB->setTextColor("black");
1245 listingsModule->listingsTB->setPlainText(
1246 qt_("Input listings parameters below. "
1247 "Enter ? for a list of parameters."));
1250 // listingsTB->setTextColor("red");
1251 listingsModule->listingsTB->setPlainText(msg);
1256 void GuiDocument::setLSpacing(int item)
1258 textLayoutModule->lspacingLE->setEnabled(item == 3);
1262 void GuiDocument::setIndent(int item)
1264 bool const enable = (item == 1);
1265 textLayoutModule->indentLE->setEnabled(enable);
1266 textLayoutModule->indentLengthCO->setEnabled(enable);
1267 textLayoutModule->skipLE->setEnabled(false);
1268 textLayoutModule->skipLengthCO->setEnabled(false);
1273 void GuiDocument::enableIndent(bool indent)
1275 textLayoutModule->skipLE->setEnabled(!indent);
1276 textLayoutModule->skipLengthCO->setEnabled(!indent);
1278 setIndent(textLayoutModule->indentCO->currentIndex());
1282 void GuiDocument::setSkip(int item)
1284 bool const enable = (item == 3);
1285 textLayoutModule->skipLE->setEnabled(enable);
1286 textLayoutModule->skipLengthCO->setEnabled(enable);
1291 void GuiDocument::enableSkip(bool skip)
1293 textLayoutModule->indentLE->setEnabled(!skip);
1294 textLayoutModule->indentLengthCO->setEnabled(!skip);
1296 setSkip(textLayoutModule->skipCO->currentIndex());
1300 void GuiDocument::setMargins()
1302 bool const extern_geometry =
1303 documentClass().provides("geometry");
1304 marginsModule->marginCB->setEnabled(!extern_geometry);
1305 if (extern_geometry) {
1306 marginsModule->marginCB->setChecked(false);
1307 setCustomMargins(true);
1309 marginsModule->marginCB->setChecked(!bp_.use_geometry);
1310 setCustomMargins(!bp_.use_geometry);
1315 void GuiDocument::papersizeChanged(int paper_size)
1317 setCustomPapersize(paper_size == 1);
1321 void GuiDocument::setCustomPapersize(bool custom)
1323 pageLayoutModule->paperwidthL->setEnabled(custom);
1324 pageLayoutModule->paperwidthLE->setEnabled(custom);
1325 pageLayoutModule->paperwidthUnitCO->setEnabled(custom);
1326 pageLayoutModule->paperheightL->setEnabled(custom);
1327 pageLayoutModule->paperheightLE->setEnabled(custom);
1328 pageLayoutModule->paperheightLE->setFocus();
1329 pageLayoutModule->paperheightUnitCO->setEnabled(custom);
1333 void GuiDocument::setColSep()
1335 setCustomMargins(marginsModule->marginCB->checkState() == Qt::Checked);
1339 void GuiDocument::setCustomMargins(bool custom)
1341 marginsModule->topL->setEnabled(!custom);
1342 marginsModule->topLE->setEnabled(!custom);
1343 marginsModule->topUnit->setEnabled(!custom);
1345 marginsModule->bottomL->setEnabled(!custom);
1346 marginsModule->bottomLE->setEnabled(!custom);
1347 marginsModule->bottomUnit->setEnabled(!custom);
1349 marginsModule->innerL->setEnabled(!custom);
1350 marginsModule->innerLE->setEnabled(!custom);
1351 marginsModule->innerUnit->setEnabled(!custom);
1353 marginsModule->outerL->setEnabled(!custom);
1354 marginsModule->outerLE->setEnabled(!custom);
1355 marginsModule->outerUnit->setEnabled(!custom);
1357 marginsModule->headheightL->setEnabled(!custom);
1358 marginsModule->headheightLE->setEnabled(!custom);
1359 marginsModule->headheightUnit->setEnabled(!custom);
1361 marginsModule->headsepL->setEnabled(!custom);
1362 marginsModule->headsepLE->setEnabled(!custom);
1363 marginsModule->headsepUnit->setEnabled(!custom);
1365 marginsModule->footskipL->setEnabled(!custom);
1366 marginsModule->footskipLE->setEnabled(!custom);
1367 marginsModule->footskipUnit->setEnabled(!custom);
1369 bool const enableColSep = !custom &&
1370 textLayoutModule->twoColumnCB->checkState() == Qt::Checked;
1371 marginsModule->columnsepL->setEnabled(enableColSep);
1372 marginsModule->columnsepLE->setEnabled(enableColSep);
1373 marginsModule->columnsepUnit->setEnabled(enableColSep);
1377 void GuiDocument::changeBackgroundColor()
1379 QColor const & newColor = QColorDialog::getColor(
1380 rgb2qcolor(set_backgroundcolor), asQWidget());
1381 if (!newColor.isValid())
1383 // set the button color and text
1384 colorModule->backgroundPB->setStyleSheet(
1385 colorButtonStyleSheet(newColor));
1386 colorModule->backgroundPB->setText(toqstr("Change..."));
1388 set_backgroundcolor = rgbFromHexName(fromqstr(newColor.name()));
1389 is_backgroundcolor = true;
1394 void GuiDocument::deleteBackgroundColor()
1396 // set the button color back to default by setting an epmty StyleSheet
1397 colorModule->backgroundPB->setStyleSheet(QLatin1String(""));
1398 // change button text
1399 colorModule->backgroundPB->setText(toqstr("Default..."));
1400 // save default color (white)
1401 set_backgroundcolor = rgbFromHexName("#ffffff");
1402 is_backgroundcolor = false;
1407 void GuiDocument::changeFontColor()
1409 QColor const & newColor = QColorDialog::getColor(
1410 rgb2qcolor(set_fontcolor), asQWidget());
1411 if (!newColor.isValid())
1413 // set the button color and text
1414 colorModule->fontColorPB->setStyleSheet(
1415 colorButtonStyleSheet(newColor));
1416 colorModule->fontColorPB->setText(toqstr("Change..."));
1418 set_fontcolor = rgbFromHexName(fromqstr(newColor.name()));
1419 is_fontcolor = true;
1424 void GuiDocument::deleteFontColor()
1426 // set the button color back to default by setting an epmty StyleSheet
1427 colorModule->fontColorPB->setStyleSheet(QLatin1String(""));
1428 // change button text
1429 colorModule->fontColorPB->setText(toqstr("Default..."));
1430 // save default color (black)
1431 set_fontcolor = rgbFromHexName("#000000");
1432 is_fontcolor = false;
1437 void GuiDocument::changeNoteFontColor()
1439 QColor const & newColor = QColorDialog::getColor(
1440 rgb2qcolor(set_notefontcolor), asQWidget());
1441 if (!newColor.isValid())
1443 // set the button color
1444 colorModule->noteFontColorPB->setStyleSheet(
1445 colorButtonStyleSheet(newColor));
1447 set_notefontcolor = rgbFromHexName(fromqstr(newColor.name()));
1452 void GuiDocument::deleteNoteFontColor()
1454 // set the button color back to light gray
1455 colorModule->noteFontColorPB->setStyleSheet(
1456 colorButtonStyleSheet(QColor(204, 204, 204, 255)));
1457 // save light gray as the set color
1458 set_notefontcolor = rgbFromHexName("#cccccc");
1463 void GuiDocument::changeBoxBackgroundColor()
1465 QColor const & newColor = QColorDialog::getColor(
1466 rgb2qcolor(set_boxbgcolor), asQWidget());
1467 if (!newColor.isValid())
1469 // set the button color
1470 colorModule->boxBackgroundPB->setStyleSheet(
1471 colorButtonStyleSheet(newColor));
1473 set_boxbgcolor = rgbFromHexName(fromqstr(newColor.name()));
1478 void GuiDocument::deleteBoxBackgroundColor()
1480 // set the button color back to red
1481 colorModule->boxBackgroundPB->setStyleSheet(
1482 colorButtonStyleSheet(QColor(Qt::red)));
1483 // save red as the set color
1484 set_boxbgcolor = rgbFromHexName("#ff0000");
1489 void GuiDocument::xetexChanged(bool xetex)
1492 updateDefaultFormat();
1493 langModule->encodingCO->setEnabled(!xetex &&
1494 !langModule->defaultencodingRB->isChecked());
1495 langModule->defaultencodingRB->setEnabled(!xetex);
1496 langModule->otherencodingRB->setEnabled(!xetex);
1498 fontModule->fontsDefaultCO->setEnabled(!xetex);
1499 fontModule->fontsDefaultLA->setEnabled(!xetex);
1500 fontModule->cjkFontLE->setEnabled(!xetex);
1501 fontModule->cjkFontLA->setEnabled(!xetex);
1504 font = tex_fonts_sans[fontModule->fontsSansCO->currentIndex()];
1505 bool scaleable = providesScale(font);
1506 fontModule->scaleSansSB->setEnabled(scaleable);
1507 fontModule->scaleSansLA->setEnabled(scaleable);
1509 font = tex_fonts_monospaced[fontModule->fontsTypewriterCO->currentIndex()];
1510 scaleable = providesScale(font);
1511 fontModule->scaleTypewriterSB->setEnabled(scaleable);
1512 fontModule->scaleTypewriterLA->setEnabled(scaleable);
1514 font = tex_fonts_roman[fontModule->fontsRomanCO->currentIndex()];
1515 fontModule->fontScCB->setEnabled(providesSC(font));
1516 fontModule->fontOsfCB->setEnabled(providesOSF(font));
1518 fontModule->fontencLA->setEnabled(!xetex);
1519 fontModule->fontencCO->setEnabled(!xetex);
1520 fontModule->fontencLE->setEnabled(!xetex);
1524 void GuiDocument::updateFontsize(string const & items, string const & sel)
1526 fontModule->fontsizeCO->clear();
1527 fontModule->fontsizeCO->addItem(qt_("Default"));
1529 for (int n = 0; !token(items,'|',n).empty(); ++n)
1530 fontModule->fontsizeCO->
1531 addItem(toqstr(token(items,'|',n)));
1533 for (int n = 0; n < fontModule->fontsizeCO->count(); ++n) {
1534 if (fromqstr(fontModule->fontsizeCO->itemText(n)) == sel) {
1535 fontModule->fontsizeCO->setCurrentIndex(n);
1542 void GuiDocument::updateFontlist()
1544 fontModule->fontsRomanCO->clear();
1545 fontModule->fontsSansCO->clear();
1546 fontModule->fontsTypewriterCO->clear();
1548 // With XeTeX, we have access to all system fonts, but not the LaTeX fonts
1549 if (outputModule->xetexCB->isChecked()) {
1550 fontModule->fontsRomanCO->addItem(qt_("Default"));
1551 fontModule->fontsSansCO->addItem(qt_("Default"));
1552 fontModule->fontsTypewriterCO->addItem(qt_("Default"));
1554 QFontDatabase fontdb;
1555 QStringList families(fontdb.families());
1556 for (QStringList::Iterator it = families.begin(); it != families.end(); ++it) {
1557 fontModule->fontsRomanCO->addItem(*it);
1558 fontModule->fontsSansCO->addItem(*it);
1559 fontModule->fontsTypewriterCO->addItem(*it);
1564 for (int n = 0; tex_fonts_roman[n][0]; ++n) {
1565 QString font = qt_(tex_fonts_roman_gui[n]);
1566 if (!isFontAvailable(tex_fonts_roman[n]))
1567 font += qt_(" (not installed)");
1568 fontModule->fontsRomanCO->addItem(font);
1570 for (int n = 0; tex_fonts_sans[n][0]; ++n) {
1571 QString font = qt_(tex_fonts_sans_gui[n]);
1572 if (!isFontAvailable(tex_fonts_sans[n]))
1573 font += qt_(" (not installed)");
1574 fontModule->fontsSansCO->addItem(font);
1576 for (int n = 0; tex_fonts_monospaced[n][0]; ++n) {
1577 QString font = qt_(tex_fonts_monospaced_gui[n]);
1578 if (!isFontAvailable(tex_fonts_monospaced[n]))
1579 font += qt_(" (not installed)");
1580 fontModule->fontsTypewriterCO->addItem(font);
1585 void GuiDocument::fontencChanged(int item)
1587 fontModule->fontencLE->setEnabled(item == 1);
1591 void GuiDocument::romanChanged(int item)
1593 if (outputModule->xetexCB->isChecked())
1595 string const font = tex_fonts_roman[item];
1596 fontModule->fontScCB->setEnabled(providesSC(font));
1597 fontModule->fontOsfCB->setEnabled(providesOSF(font));
1601 void GuiDocument::sansChanged(int item)
1603 if (outputModule->xetexCB->isChecked())
1605 string const font = tex_fonts_sans[item];
1606 bool scaleable = providesScale(font);
1607 fontModule->scaleSansSB->setEnabled(scaleable);
1608 fontModule->scaleSansLA->setEnabled(scaleable);
1612 void GuiDocument::ttChanged(int item)
1614 if (outputModule->xetexCB->isChecked())
1616 string const font = tex_fonts_monospaced[item];
1617 bool scaleable = providesScale(font);
1618 fontModule->scaleTypewriterSB->setEnabled(scaleable);
1619 fontModule->scaleTypewriterLA->setEnabled(scaleable);
1623 void GuiDocument::updatePagestyle(string const & items, string const & sel)
1626 pageLayoutModule->pagestyleCO->clear();
1627 pageLayoutModule->pagestyleCO->addItem(qt_("Default"));
1629 for (int n = 0; !token(items, '|', n).empty(); ++n) {
1630 string style = token(items, '|', n);
1631 QString style_gui = qt_(style);
1632 pagestyles.push_back(pair<string, QString>(style, style_gui));
1633 pageLayoutModule->pagestyleCO->addItem(style_gui);
1636 if (sel == "default") {
1637 pageLayoutModule->pagestyleCO->setCurrentIndex(0);
1643 for (size_t i = 0; i < pagestyles.size(); ++i)
1644 if (pagestyles[i].first == sel)
1645 nn = pageLayoutModule->pagestyleCO->findText(pagestyles[i].second);
1648 pageLayoutModule->pagestyleCO->setCurrentIndex(nn);
1652 void GuiDocument::browseLayout()
1654 QString const label1 = qt_("Layouts|#o#O");
1655 QString const dir1 = toqstr(lyxrc.document_path);
1656 QStringList const filter(qt_("LyX Layout (*.layout)"));
1657 QString file = browseRelFile(QString(), bufferFilePath(),
1658 qt_("Local layout file"), filter, false,
1661 if (!file.endsWith(".layout"))
1664 FileName layoutFile = support::makeAbsPath(fromqstr(file),
1665 fromqstr(bufferFilePath()));
1667 int const ret = Alert::prompt(_("Local layout file"),
1668 _("The layout file you have selected is a local layout\n"
1669 "file, not one in the system or user directory. Your\n"
1670 "document may not work with this layout if you do not\n"
1671 "keep the layout file in the document directory."),
1672 1, 1, _("&Set Layout"), _("&Cancel"));
1676 // load the layout file
1677 LayoutFileList & bcl = LayoutFileList::get();
1678 string classname = layoutFile.onlyFileName();
1679 // this will update an existing layout if that layout has been loaded before.
1680 LayoutFileIndex name = bcl.addLocalLayout(
1681 classname.substr(0, classname.size() - 7),
1682 layoutFile.onlyPath().absFileName());
1685 Alert::error(_("Error"),
1686 _("Unable to read local layout file."));
1690 // do not trigger classChanged if there is no change.
1691 if (latexModule->classCO->currentText() == toqstr(name))
1695 int idx = latexModule->classCO->findText(toqstr(name));
1697 classes_model_.insertRow(0, toqstr(name), name);
1698 latexModule->classCO->setCurrentIndex(0);
1700 latexModule->classCO->setCurrentIndex(idx);
1706 void GuiDocument::browseMaster()
1708 QString const title = qt_("Select master document");
1709 QString const dir1 = toqstr(lyxrc.document_path);
1710 QString const old = latexModule->childDocLE->text();
1711 QString const docpath = toqstr(support::onlyPath(buffer().absFileName()));
1712 QStringList const filter(qt_("LyX Files (*.lyx)"));
1713 QString file = browseRelFile(old, docpath, title, filter, false,
1714 qt_("Documents|#o#O"), toqstr(lyxrc.document_path));
1716 if (!file.isEmpty())
1717 latexModule->childDocLE->setText(file);
1721 void GuiDocument::classChanged()
1723 int idx = latexModule->classCO->currentIndex();
1726 string const classname = classes_model_.getIDString(idx);
1728 // check whether the selected modules have changed.
1729 bool modules_changed = false;
1730 unsigned int const srows = selectedModel()->rowCount();
1731 if (srows != bp_.getModules().size())
1732 modules_changed = true;
1734 list<string>::const_iterator mit = bp_.getModules().begin();
1735 list<string>::const_iterator men = bp_.getModules().end();
1736 for (unsigned int i = 0; i < srows && mit != men; ++i, ++mit)
1737 if (selectedModel()->getIDString(i) != *mit) {
1738 modules_changed = true;
1743 if (modules_changed || lyxrc.auto_reset_options) {
1744 if (applyPB->isEnabled()) {
1745 int const ret = Alert::prompt(_("Unapplied changes"),
1746 _("Some changes in the dialog were not yet applied.\n"
1747 "If you do not apply now, they will be lost after this action."),
1748 1, 1, _("&Apply"), _("&Dismiss"));
1754 // We load the TextClass as soon as it is selected. This is
1755 // necessary so that other options in the dialog can be updated
1756 // according to the new class. Note, however, that, if you use
1757 // the scroll wheel when sitting on the combo box, we'll load a
1758 // lot of TextClass objects very quickly....
1759 if (!bp_.setBaseClass(classname)) {
1760 Alert::error(_("Error"), _("Unable to set document class."));
1763 if (lyxrc.auto_reset_options)
1764 bp_.useClassDefaults();
1766 // With the introduction of modules came a distinction between the base
1767 // class and the document class. The former corresponds to the main layout
1768 // file; the latter is that plus the modules (or the document-specific layout,
1769 // or whatever else there could be). Our parameters come from the document
1770 // class. So when we set the base class, we also need to recreate the document
1771 // class. Otherwise, we still have the old one.
1772 bp_.makeDocumentClass();
1777 void GuiDocument::bibtexChanged(int n)
1779 biblioModule->bibtexOptionsED->setEnabled(n != 0);
1785 // This is an insanely complicated attempt to make this sort of thing
1786 // work with RTL languages.
1787 docstring formatStrVec(vector<string> const & v, docstring const & s)
1789 //this mess formats the list as "v[0], v[1], ..., [s] v[n]"
1793 return from_utf8(v[0]);
1794 if (v.size() == 2) {
1795 docstring retval = _("%1$s and %2$s");
1796 retval = subst(retval, _("and"), s);
1797 return bformat(retval, from_utf8(v[0]), from_utf8(v[1]));
1799 // The idea here is to format all but the last two items...
1800 int const vSize = v.size();
1801 docstring t2 = _("%1$s, %2$s");
1802 docstring retval = from_utf8(v[0]);
1803 for (int i = 1; i < vSize - 2; ++i)
1804 retval = bformat(t2, retval, from_utf8(v[i]));
1805 //...and then to plug them, and the last two, into this schema
1806 docstring t = _("%1$s, %2$s, and %3$s");
1807 t = subst(t, _("and"), s);
1808 return bformat(t, retval, from_utf8(v[vSize - 2]), from_utf8(v[vSize - 1]));
1811 vector<string> idsToNames(vector<string> const & idList)
1813 vector<string> retval;
1814 vector<string>::const_iterator it = idList.begin();
1815 vector<string>::const_iterator end = idList.end();
1816 for (; it != end; ++it) {
1817 LyXModule const * const mod = theModuleList[*it];
1819 retval.push_back(*it + " (Unavailable)");
1821 retval.push_back(mod->getName());
1828 void GuiDocument::modulesToParams(BufferParams & bp)
1830 // update list of loaded modules
1831 bp.clearLayoutModules();
1832 int const srows = modules_sel_model_.rowCount();
1833 for (int i = 0; i < srows; ++i)
1834 bp.addLayoutModule(modules_sel_model_.getIDString(i));
1836 // update the list of removed modules
1837 bp.clearRemovedModules();
1838 LayoutModuleList const & reqmods = bp.baseClass()->defaultModules();
1839 list<string>::const_iterator rit = reqmods.begin();
1840 list<string>::const_iterator ren = reqmods.end();
1842 // check each of the default modules
1843 for (; rit != ren; rit++) {
1844 list<string>::const_iterator mit = bp.getModules().begin();
1845 list<string>::const_iterator men = bp.getModules().end();
1847 for (; mit != men; mit++) {
1854 // the module isn't present so must have been removed by the user
1855 bp.addRemovedModule(*rit);
1860 void GuiDocument::modulesChanged()
1862 modulesToParams(bp_);
1863 bp_.makeDocumentClass();
1868 void GuiDocument::updateModuleInfo()
1870 selectionManager->update();
1872 //Module description
1873 bool const focus_on_selected = selectionManager->selectedFocused();
1874 QAbstractItemView * lv;
1875 if (focus_on_selected)
1876 lv = modulesModule->selectedLV;
1878 lv= modulesModule->availableLV;
1879 if (lv->selectionModel()->selectedIndexes().isEmpty()) {
1880 modulesModule->infoML->document()->clear();
1883 QModelIndex const & idx = lv->selectionModel()->currentIndex();
1884 GuiIdListModel const & id_model =
1885 focus_on_selected ? modules_sel_model_ : modules_av_model_;
1886 string const modName = id_model.getIDString(idx.row());
1887 docstring desc = getModuleDescription(modName);
1889 LayoutModuleList const & provmods = bp_.baseClass()->providedModules();
1890 if (std::find(provmods.begin(), provmods.end(), modName) != provmods.end()) {
1893 desc += _("Module provided by document class.");
1896 vector<string> pkglist = getPackageList(modName);
1897 docstring pkgdesc = formatStrVec(pkglist, _("and"));
1898 if (!pkgdesc.empty()) {
1901 desc += bformat(_("Package(s) required: %1$s."), pkgdesc);
1904 pkglist = getRequiredList(modName);
1905 if (!pkglist.empty()) {
1906 vector<string> const reqdescs = idsToNames(pkglist);
1907 pkgdesc = formatStrVec(reqdescs, _("or"));
1910 desc += bformat(_("Module required: %1$s."), pkgdesc);
1913 pkglist = getExcludedList(modName);
1914 if (!pkglist.empty()) {
1915 vector<string> const reqdescs = idsToNames(pkglist);
1916 pkgdesc = formatStrVec(reqdescs, _( "and"));
1919 desc += bformat(_("Modules excluded: %1$s."), pkgdesc);
1922 if (!isModuleAvailable(modName)) {
1925 desc += _("WARNING: Some required packages are unavailable!");
1928 modulesModule->infoML->document()->setPlainText(toqstr(desc));
1932 void GuiDocument::updateNumbering()
1934 DocumentClass const & tclass = documentClass();
1936 numberingModule->tocTW->setUpdatesEnabled(false);
1937 numberingModule->tocTW->clear();
1939 int const depth = numberingModule->depthSL->value();
1940 int const toc = numberingModule->tocSL->value();
1941 QString const no = qt_("No");
1942 QString const yes = qt_("Yes");
1943 QTreeWidgetItem * item = 0;
1945 DocumentClass::const_iterator lit = tclass.begin();
1946 DocumentClass::const_iterator len = tclass.end();
1947 for (; lit != len; ++lit) {
1948 int const toclevel = lit->toclevel;
1949 if (toclevel != Layout::NOT_IN_TOC && lit->labeltype == LABEL_COUNTER) {
1950 item = new QTreeWidgetItem(numberingModule->tocTW);
1951 item->setText(0, toqstr(translateIfPossible(lit->name())));
1952 item->setText(1, (toclevel <= depth) ? yes : no);
1953 item->setText(2, (toclevel <= toc) ? yes : no);
1957 numberingModule->tocTW->setUpdatesEnabled(true);
1958 numberingModule->tocTW->update();
1962 void GuiDocument::updateDefaultFormat()
1966 // make a copy in order to consider unapplied changes
1967 Buffer * tmpbuf = buffer().clone();
1968 tmpbuf->params().useXetex = outputModule->xetexCB->isChecked();
1969 int idx = latexModule->classCO->currentIndex();
1971 string const classname = classes_model_.getIDString(idx);
1972 tmpbuf->params().setBaseClass(classname);
1973 tmpbuf->params().makeDocumentClass();
1975 outputModule->defaultFormatCO->blockSignals(true);
1976 outputModule->defaultFormatCO->clear();
1977 outputModule->defaultFormatCO->addItem(qt_("Default"),
1978 QVariant(QString("default")));
1979 typedef vector<Format const *> Formats;
1980 Formats formats = tmpbuf->exportableFormats(true);
1981 Formats::const_iterator cit = formats.begin();
1982 Formats::const_iterator end = formats.end();
1983 for (; cit != end; ++cit)
1984 outputModule->defaultFormatCO->addItem(qt_((*cit)->prettyname()),
1985 QVariant(toqstr((*cit)->name())));
1986 outputModule->defaultFormatCO->blockSignals(false);
1992 bool GuiDocument::isChildIncluded(string const & child)
1994 if (includeonlys_.empty())
1996 return (std::find(includeonlys_.begin(),
1997 includeonlys_.end(), child) != includeonlys_.end());
2001 void GuiDocument::applyView()
2004 preambleModule->apply(bp_);
2007 bp_.suppress_date = latexModule->suppressDateCB->isChecked();
2010 bp_.setCiteEngine(ENGINE_BASIC);
2012 if (biblioModule->citeNatbibRB->isChecked()) {
2013 bool const use_numerical_citations =
2014 biblioModule->citeStyleCO->currentIndex();
2015 if (use_numerical_citations)
2016 bp_.setCiteEngine(ENGINE_NATBIB_NUMERICAL);
2018 bp_.setCiteEngine(ENGINE_NATBIB_AUTHORYEAR);
2020 } else if (biblioModule->citeJurabibRB->isChecked())
2021 bp_.setCiteEngine(ENGINE_JURABIB);
2024 biblioModule->bibtopicCB->isChecked();
2026 string const bibtex_command =
2027 fromqstr(biblioModule->bibtexCO->itemData(
2028 biblioModule->bibtexCO->currentIndex()).toString());
2029 string const bibtex_options =
2030 fromqstr(biblioModule->bibtexOptionsED->text());
2031 if (bibtex_command == "default" || bibtex_options.empty())
2032 bp_.bibtex_command = bibtex_command;
2034 bp_.bibtex_command = bibtex_command + " " + bibtex_options;
2037 indicesModule->apply(bp_);
2039 // language & quotes
2040 if (langModule->defaultencodingRB->isChecked()) {
2041 bp_.inputenc = "auto";
2043 int i = langModule->encodingCO->currentIndex();
2045 bp_.inputenc = "default";
2047 QString const enc_gui =
2048 langModule->encodingCO->currentText();
2049 Encodings::const_iterator it = encodings.begin();
2050 Encodings::const_iterator const end = encodings.end();
2052 for (; it != end; ++it) {
2053 if (qt_(it->guiName()) == enc_gui) {
2054 bp_.inputenc = it->latexName();
2060 // should not happen
2061 lyxerr << "GuiDocument::apply: Unknown encoding! Resetting to default" << endl;
2062 bp_.inputenc = "default";
2067 InsetQuotes::QuoteLanguage lga = InsetQuotes::EnglishQuotes;
2068 switch (langModule->quoteStyleCO->currentIndex()) {
2070 lga = InsetQuotes::EnglishQuotes;
2073 lga = InsetQuotes::SwedishQuotes;
2076 lga = InsetQuotes::GermanQuotes;
2079 lga = InsetQuotes::PolishQuotes;
2082 lga = InsetQuotes::FrenchQuotes;
2085 lga = InsetQuotes::DanishQuotes;
2088 bp_.quotes_language = lga;
2090 QString const lang = langModule->languageCO->itemData(
2091 langModule->languageCO->currentIndex()).toString();
2092 bp_.language = lyx::languages.getLanguage(fromqstr(lang));
2095 bp_.backgroundcolor = set_backgroundcolor;
2096 bp_.isbackgroundcolor = is_backgroundcolor;
2097 bp_.fontcolor = set_fontcolor;
2098 bp_.isfontcolor = is_fontcolor;
2099 bp_.notefontcolor = set_notefontcolor;
2100 bp_.boxbgcolor = set_boxbgcolor;
2103 if (bp_.documentClass().hasTocLevels()) {
2104 bp_.tocdepth = numberingModule->tocSL->value();
2105 bp_.secnumdepth = numberingModule->depthSL->value();
2109 bp_.user_defined_bullet(0) = bulletsModule->bullet(0);
2110 bp_.user_defined_bullet(1) = bulletsModule->bullet(1);
2111 bp_.user_defined_bullet(2) = bulletsModule->bullet(2);
2112 bp_.user_defined_bullet(3) = bulletsModule->bullet(3);
2115 bp_.graphicsDriver =
2116 tex_graphics[latexModule->psdriverCO->currentIndex()];
2119 int idx = latexModule->classCO->currentIndex();
2121 string const classname = classes_model_.getIDString(idx);
2122 bp_.setBaseClass(classname);
2126 modulesToParams(bp_);
2129 if (mathsModule->amsautoCB->isChecked()) {
2130 bp_.use_amsmath = BufferParams::package_auto;
2132 if (mathsModule->amsCB->isChecked())
2133 bp_.use_amsmath = BufferParams::package_on;
2135 bp_.use_amsmath = BufferParams::package_off;
2137 if (mathsModule->esintautoCB->isChecked())
2138 bp_.use_esint = BufferParams::package_auto;
2140 if (mathsModule->esintCB->isChecked())
2141 bp_.use_esint = BufferParams::package_on;
2143 bp_.use_esint = BufferParams::package_off;
2145 if (mathsModule->mhchemautoCB->isChecked())
2146 bp_.use_mhchem = BufferParams::package_auto;
2148 if (mathsModule->mhchemCB->isChecked())
2149 bp_.use_mhchem = BufferParams::package_on;
2151 bp_.use_mhchem = BufferParams::package_off;
2155 if (pageLayoutModule->pagestyleCO->currentIndex() == 0)
2156 bp_.pagestyle = "default";
2158 QString style_gui = pageLayoutModule->pagestyleCO->currentText();
2159 for (size_t i = 0; i != pagestyles.size(); ++i)
2160 if (pagestyles[i].second == style_gui)
2161 bp_.pagestyle = pagestyles[i].first;
2165 switch (textLayoutModule->lspacingCO->currentIndex()) {
2167 bp_.spacing().set(Spacing::Single);
2170 bp_.spacing().set(Spacing::Onehalf);
2173 bp_.spacing().set(Spacing::Double);
2176 string s = widgetToDoubleStr(textLayoutModule->lspacingLE);
2178 bp_.spacing().set(Spacing::Single);
2180 bp_.spacing().set(Spacing::Other, s);
2185 if (textLayoutModule->twoColumnCB->isChecked())
2190 if (textLayoutModule->indentRB->isChecked()) {
2191 // if paragraphs are separated by an indentation
2192 bp_.paragraph_separation = BufferParams::ParagraphIndentSeparation;
2193 switch (textLayoutModule->indentCO->currentIndex()) {
2195 bp_.setIndentation(HSpace(HSpace::DEFAULT));
2198 HSpace indent = HSpace(
2199 widgetsToLength(textLayoutModule->indentLE,
2200 textLayoutModule->indentLengthCO)
2202 bp_.setIndentation(indent);
2206 // this should never happen
2207 bp_.setIndentation(HSpace(HSpace::DEFAULT));
2211 // if paragraphs are separated by a skip
2212 bp_.paragraph_separation = BufferParams::ParagraphSkipSeparation;
2213 switch (textLayoutModule->skipCO->currentIndex()) {
2215 bp_.setDefSkip(VSpace(VSpace::SMALLSKIP));
2218 bp_.setDefSkip(VSpace(VSpace::MEDSKIP));
2221 bp_.setDefSkip(VSpace(VSpace::BIGSKIP));
2226 widgetsToLength(textLayoutModule->skipLE,
2227 textLayoutModule->skipLengthCO)
2233 // this should never happen
2234 bp_.setDefSkip(VSpace(VSpace::MEDSKIP));
2240 fromqstr(latexModule->optionsLE->text());
2242 bp_.use_default_options =
2243 latexModule->defaultOptionsCB->isChecked();
2245 if (latexModule->childDocGB->isChecked())
2247 fromqstr(latexModule->childDocLE->text());
2249 bp_.master = string();
2252 bp_.clearIncludedChildren();
2253 if (masterChildModule->includeonlyRB->isChecked()) {
2254 list<string>::const_iterator it = includeonlys_.begin();
2255 for (; it != includeonlys_.end() ; ++it) {
2256 bp_.addIncludedChildren(*it);
2259 bp_.maintain_unincluded_children =
2260 masterChildModule->maintainAuxCB->isChecked();
2263 bp_.float_placement = floatModule->get();
2266 // text should have passed validation
2267 bp_.listings_params =
2268 InsetListingsParams(fromqstr(listingsModule->listingsED->toPlainText())).params();
2271 bp_.defaultOutputFormat = fromqstr(outputModule->defaultFormatCO->itemData(
2272 outputModule->defaultFormatCO->currentIndex()).toString());
2274 bool const xetex = outputModule->xetexCB->isChecked();
2275 bp_.useXetex = xetex;
2277 int mathfmt = outputModule->mathoutCB->currentIndex();
2280 BufferParams::MathOutput const mo =
2281 static_cast<BufferParams::MathOutput>(mathfmt);
2282 bp_.html_math_output = mo;
2283 bp_.html_be_strict = outputModule->strictCB->isChecked();
2284 bp_.html_math_img_scale = outputModule->mathimgSB->value();
2288 if (fontModule->fontsRomanCO->currentIndex() == 0)
2289 bp_.fontsRoman = "default";
2292 fromqstr(fontModule->fontsRomanCO->currentText());
2294 if (fontModule->fontsSansCO->currentIndex() == 0)
2295 bp_.fontsSans = "default";
2298 fromqstr(fontModule->fontsSansCO->currentText());
2300 if (fontModule->fontsTypewriterCO->currentIndex() == 0)
2301 bp_.fontsTypewriter = "default";
2303 bp_.fontsTypewriter =
2304 fromqstr(fontModule->fontsTypewriterCO->currentText());
2307 tex_fonts_roman[fontModule->fontsRomanCO->currentIndex()];
2310 tex_fonts_sans[fontModule->fontsSansCO->currentIndex()];
2312 bp_.fontsTypewriter =
2313 tex_fonts_monospaced[fontModule->fontsTypewriterCO->currentIndex()];
2316 if (fontModule->fontencCO->currentIndex() == 0)
2317 bp_.fontenc = "global";
2318 else if (fontModule->fontencCO->currentIndex() == 1)
2319 bp_.fontenc = fromqstr(fontModule->fontencLE->text());
2320 else if (fontModule->fontencCO->currentIndex() == 2)
2321 bp_.fontenc = "default";
2324 fromqstr(fontModule->cjkFontLE->text());
2326 bp_.fontsSansScale = fontModule->scaleSansSB->value();
2328 bp_.fontsTypewriterScale = fontModule->scaleTypewriterSB->value();
2330 bp_.fontsSC = fontModule->fontScCB->isChecked();
2332 bp_.fontsOSF = fontModule->fontOsfCB->isChecked();
2335 bp_.fontsDefaultFamily = "default";
2337 bp_.fontsDefaultFamily = GuiDocument::fontfamilies[
2338 fontModule->fontsDefaultCO->currentIndex()];
2340 if (fontModule->fontsizeCO->currentIndex() == 0)
2341 bp_.fontsize = "default";
2344 fromqstr(fontModule->fontsizeCO->currentText());
2347 bp_.papersize = PAPER_SIZE(
2348 pageLayoutModule->papersizeCO->currentIndex());
2350 bp_.paperwidth = widgetsToLength(pageLayoutModule->paperwidthLE,
2351 pageLayoutModule->paperwidthUnitCO);
2353 bp_.paperheight = widgetsToLength(pageLayoutModule->paperheightLE,
2354 pageLayoutModule->paperheightUnitCO);
2356 if (pageLayoutModule->facingPagesCB->isChecked())
2357 bp_.sides = TwoSides;
2359 bp_.sides = OneSide;
2361 if (pageLayoutModule->landscapeRB->isChecked())
2362 bp_.orientation = ORIENTATION_LANDSCAPE;
2364 bp_.orientation = ORIENTATION_PORTRAIT;
2367 bp_.use_geometry = !marginsModule->marginCB->isChecked();
2369 Ui::MarginsUi const * m = marginsModule;
2371 bp_.leftmargin = widgetsToLength(m->innerLE, m->innerUnit);
2372 bp_.topmargin = widgetsToLength(m->topLE, m->topUnit);
2373 bp_.rightmargin = widgetsToLength(m->outerLE, m->outerUnit);
2374 bp_.bottommargin = widgetsToLength(m->bottomLE, m->bottomUnit);
2375 bp_.headheight = widgetsToLength(m->headheightLE, m->headheightUnit);
2376 bp_.headsep = widgetsToLength(m->headsepLE, m->headsepUnit);
2377 bp_.footskip = widgetsToLength(m->footskipLE, m->footskipUnit);
2378 bp_.columnsep = widgetsToLength(m->columnsepLE, m->columnsepUnit);
2381 branchesModule->apply(bp_);
2384 PDFOptions & pdf = bp_.pdfoptions();
2385 pdf.use_hyperref = pdfSupportModule->use_hyperrefGB->isChecked();
2386 pdf.title = fromqstr(pdfSupportModule->titleLE->text());
2387 pdf.author = fromqstr(pdfSupportModule->authorLE->text());
2388 pdf.subject = fromqstr(pdfSupportModule->subjectLE->text());
2389 pdf.keywords = fromqstr(pdfSupportModule->keywordsLE->text());
2391 pdf.bookmarks = pdfSupportModule->bookmarksGB->isChecked();
2392 pdf.bookmarksnumbered = pdfSupportModule->bookmarksnumberedCB->isChecked();
2393 pdf.bookmarksopen = pdfSupportModule->bookmarksopenGB->isChecked();
2394 pdf.bookmarksopenlevel = pdfSupportModule->bookmarksopenlevelSB->value();
2396 pdf.breaklinks = pdfSupportModule->breaklinksCB->isChecked();
2397 pdf.pdfborder = pdfSupportModule->pdfborderCB->isChecked();
2398 pdf.pdfusetitle = pdfSupportModule->pdfusetitleCB->isChecked();
2399 pdf.colorlinks = pdfSupportModule->colorlinksCB->isChecked();
2401 backref_opts[pdfSupportModule->backrefCO->currentIndex()];
2402 if (pdfSupportModule->fullscreenCB->isChecked())
2403 pdf.pagemode = pdf.pagemode_fullscreen;
2405 pdf.pagemode.clear();
2406 pdf.quoted_options = pdf.quoted_options_check(
2407 fromqstr(pdfSupportModule->optionsLE->text()));
2411 void GuiDocument::paramsToDialog()
2413 // set the default unit
2414 Length::UNIT const defaultUnit = Length::defaultUnit();
2417 preambleModule->update(bp_, id());
2420 latexModule->suppressDateCB->setChecked(bp_.suppress_date);
2423 biblioModule->citeDefaultRB->setChecked(
2424 bp_.citeEngine() == ENGINE_BASIC);
2426 biblioModule->citeNatbibRB->setChecked(
2427 bp_.citeEngine() == ENGINE_NATBIB_NUMERICAL ||
2428 bp_.citeEngine() == ENGINE_NATBIB_AUTHORYEAR);
2430 biblioModule->citeStyleCO->setCurrentIndex(
2431 bp_.citeEngine() == ENGINE_NATBIB_NUMERICAL);
2433 biblioModule->citeJurabibRB->setChecked(
2434 bp_.citeEngine() == ENGINE_JURABIB);
2436 biblioModule->bibtopicCB->setChecked(
2441 split(bp_.bibtex_command, command, ' ');
2443 int const bpos = biblioModule->bibtexCO->findData(toqstr(command));
2445 biblioModule->bibtexCO->setCurrentIndex(bpos);
2446 biblioModule->bibtexOptionsED->setText(toqstr(options).trimmed());
2448 biblioModule->bibtexCO->setCurrentIndex(0);
2449 biblioModule->bibtexOptionsED->clear();
2451 biblioModule->bibtexOptionsED->setEnabled(
2452 biblioModule->bibtexCO->currentIndex() != 0);
2455 indicesModule->update(bp_);
2457 // language & quotes
2458 int const pos = langModule->languageCO->findData(toqstr(
2459 bp_.language->lang()));
2460 langModule->languageCO->setCurrentIndex(pos);
2462 langModule->quoteStyleCO->setCurrentIndex(
2463 bp_.quotes_language);
2465 bool default_enc = true;
2466 if (bp_.inputenc != "auto") {
2467 default_enc = false;
2468 if (bp_.inputenc == "default") {
2469 langModule->encodingCO->setCurrentIndex(0);
2472 Encodings::const_iterator it = encodings.begin();
2473 Encodings::const_iterator const end = encodings.end();
2474 for (; it != end; ++it) {
2475 if (it->latexName() == bp_.inputenc) {
2476 enc_gui = it->guiName();
2480 int const i = langModule->encodingCO->findText(
2483 langModule->encodingCO->setCurrentIndex(i);
2485 // unknown encoding. Set to default.
2489 langModule->defaultencodingRB->setChecked(default_enc);
2490 langModule->otherencodingRB->setChecked(!default_enc);
2493 if (bp_.isfontcolor) {
2494 colorModule->fontColorPB->setStyleSheet(
2495 colorButtonStyleSheet(rgb2qcolor(bp_.fontcolor)));
2497 set_fontcolor = bp_.fontcolor;
2498 is_fontcolor = bp_.isfontcolor;
2500 colorModule->noteFontColorPB->setStyleSheet(
2501 colorButtonStyleSheet(rgb2qcolor(bp_.notefontcolor)));
2502 set_notefontcolor = bp_.notefontcolor;
2504 if (bp_.isbackgroundcolor) {
2505 colorModule->backgroundPB->setStyleSheet(
2506 colorButtonStyleSheet(rgb2qcolor(bp_.backgroundcolor)));
2508 set_backgroundcolor = bp_.backgroundcolor;
2509 is_backgroundcolor = bp_.isbackgroundcolor;
2511 colorModule->boxBackgroundPB->setStyleSheet(
2512 colorButtonStyleSheet(rgb2qcolor(bp_.boxbgcolor)));
2513 set_boxbgcolor = bp_.boxbgcolor;
2516 int const min_toclevel = documentClass().min_toclevel();
2517 int const max_toclevel = documentClass().max_toclevel();
2518 if (documentClass().hasTocLevels()) {
2519 numberingModule->setEnabled(true);
2520 numberingModule->depthSL->setMinimum(min_toclevel - 1);
2521 numberingModule->depthSL->setMaximum(max_toclevel);
2522 numberingModule->depthSL->setValue(bp_.secnumdepth);
2523 numberingModule->tocSL->setMaximum(min_toclevel - 1);
2524 numberingModule->tocSL->setMaximum(max_toclevel);
2525 numberingModule->tocSL->setValue(bp_.tocdepth);
2528 numberingModule->setEnabled(false);
2529 numberingModule->tocTW->clear();
2533 bulletsModule->setBullet(0, bp_.user_defined_bullet(0));
2534 bulletsModule->setBullet(1, bp_.user_defined_bullet(1));
2535 bulletsModule->setBullet(2, bp_.user_defined_bullet(2));
2536 bulletsModule->setBullet(3, bp_.user_defined_bullet(3));
2537 bulletsModule->init();
2540 int nitem = findToken(tex_graphics, bp_.graphicsDriver);
2542 latexModule->psdriverCO->setCurrentIndex(nitem);
2545 mathsModule->amsCB->setChecked(
2546 bp_.use_amsmath == BufferParams::package_on);
2547 mathsModule->amsautoCB->setChecked(
2548 bp_.use_amsmath == BufferParams::package_auto);
2550 mathsModule->esintCB->setChecked(
2551 bp_.use_esint == BufferParams::package_on);
2552 mathsModule->esintautoCB->setChecked(
2553 bp_.use_esint == BufferParams::package_auto);
2555 mathsModule->mhchemCB->setChecked(
2556 bp_.use_mhchem == BufferParams::package_on);
2557 mathsModule->mhchemautoCB->setChecked(
2558 bp_.use_mhchem == BufferParams::package_auto);
2560 switch (bp_.spacing().getSpace()) {
2561 case Spacing::Other: nitem = 3; break;
2562 case Spacing::Double: nitem = 2; break;
2563 case Spacing::Onehalf: nitem = 1; break;
2564 case Spacing::Default: case Spacing::Single: nitem = 0; break;
2568 string const & layoutID = bp_.baseClassID();
2569 setLayoutComboByIDString(layoutID);
2571 updatePagestyle(documentClass().opt_pagestyle(),
2574 textLayoutModule->lspacingCO->setCurrentIndex(nitem);
2575 if (bp_.spacing().getSpace() == Spacing::Other) {
2576 doubleToWidget(textLayoutModule->lspacingLE,
2577 bp_.spacing().getValueAsString());
2581 if (bp_.paragraph_separation == BufferParams::ParagraphIndentSeparation) {
2582 textLayoutModule->indentRB->setChecked(true);
2583 string indentation = bp_.getIndentation().asLyXCommand();
2585 if (indentation != "default") {
2586 lengthToWidgets(textLayoutModule->indentLE,
2587 textLayoutModule->indentLengthCO,
2588 indentation, defaultUnit);
2591 textLayoutModule->indentCO->setCurrentIndex(indent);
2594 textLayoutModule->skipRB->setChecked(true);
2596 switch (bp_.getDefSkip().kind()) {
2597 case VSpace::SMALLSKIP:
2600 case VSpace::MEDSKIP:
2603 case VSpace::BIGSKIP:
2606 case VSpace::LENGTH:
2609 string const length = bp_.getDefSkip().asLyXCommand();
2610 lengthToWidgets(textLayoutModule->skipLE,
2611 textLayoutModule->skipLengthCO,
2612 length, defaultUnit);
2619 textLayoutModule->skipCO->setCurrentIndex(skip);
2623 textLayoutModule->twoColumnCB->setChecked(
2626 if (!bp_.options.empty()) {
2627 latexModule->optionsLE->setText(
2628 toqstr(bp_.options));
2630 latexModule->optionsLE->setText(QString());
2634 latexModule->defaultOptionsCB->setChecked(
2635 bp_.use_default_options);
2636 updateSelectedModules();
2637 selectionManager->updateProvidedModules(
2638 bp_.baseClass()->providedModules());
2639 selectionManager->updateExcludedModules(
2640 bp_.baseClass()->excludedModules());
2642 if (!documentClass().options().empty()) {
2643 latexModule->defaultOptionsLE->setText(
2644 toqstr(documentClass().options()));
2646 latexModule->defaultOptionsLE->setText(
2647 toqstr(_("[No options predefined]")));
2650 latexModule->defaultOptionsLE->setEnabled(
2651 bp_.use_default_options
2652 && !documentClass().options().empty());
2654 latexModule->defaultOptionsCB->setEnabled(
2655 !documentClass().options().empty());
2657 if (!bp_.master.empty()) {
2658 latexModule->childDocGB->setChecked(true);
2659 latexModule->childDocLE->setText(
2660 toqstr(bp_.master));
2662 latexModule->childDocLE->setText(QString());
2663 latexModule->childDocGB->setChecked(false);
2667 std::vector<Buffer *> children;
2669 children = buffer().getChildren(false);
2670 if (children.empty()) {
2671 masterChildModule->childrenTW->clear();
2672 includeonlys_.clear();
2673 docPS->showPanel(qt_("Child Documents"), false);
2674 if (docPS->isCurrentPanel(qt_("Child Documents")))
2675 docPS->setCurrentPanel(qt_("Document Class"));
2677 docPS->showPanel(qt_("Child Documents"), true);
2678 masterChildModule->setEnabled(true);
2679 includeonlys_ = bp_.getIncludedChildren();
2680 updateIncludeonlys();
2682 masterChildModule->maintainAuxCB->setChecked(
2683 bp_.maintain_unincluded_children);
2686 floatModule->set(bp_.float_placement);
2689 // break listings_params to multiple lines
2691 InsetListingsParams(bp_.listings_params).separatedParams();
2692 listingsModule->listingsED->setPlainText(toqstr(lstparams));
2695 // update combobox with formats
2696 updateDefaultFormat();
2697 int index = outputModule->defaultFormatCO->findData(toqstr(
2698 bp_.defaultOutputFormat));
2699 // set to default if format is not found
2702 outputModule->defaultFormatCO->setCurrentIndex(index);
2703 outputModule->xetexCB->setEnabled(bp_.baseClass()->outputType() == lyx::LATEX);
2704 outputModule->xetexCB->setChecked(
2705 bp_.baseClass()->outputType() == lyx::LATEX && bp_.useXetex);
2707 outputModule->mathimgSB->setValue(bp_.html_math_img_scale);
2708 outputModule->mathoutCB->setCurrentIndex(bp_.html_math_output);
2709 outputModule->strictCB->setChecked(bp_.html_be_strict);
2712 updateFontsize(documentClass().opt_fontsize(),
2716 fontModule->fontencLA->setEnabled(false);
2717 fontModule->fontencCO->setEnabled(false);
2718 fontModule->fontencLE->setEnabled(false);
2719 for (int i = 0; i < fontModule->fontsRomanCO->count(); ++i) {
2720 if (fontModule->fontsRomanCO->itemText(i) == toqstr(bp_.fontsRoman)) {
2721 fontModule->fontsRomanCO->setCurrentIndex(i);
2726 for (int i = 0; i < fontModule->fontsSansCO->count(); ++i) {
2727 if (fontModule->fontsSansCO->itemText(i) == toqstr(bp_.fontsSans)) {
2728 fontModule->fontsSansCO->setCurrentIndex(i);
2732 for (int i = 0; i < fontModule->fontsTypewriterCO->count(); ++i) {
2733 if (fontModule->fontsTypewriterCO->itemText(i) ==
2734 toqstr(bp_.fontsTypewriter)) {
2735 fontModule->fontsTypewriterCO->setCurrentIndex(i);
2740 fontModule->fontencLA->setEnabled(true);
2741 fontModule->fontencCO->setEnabled(true);
2742 fontModule->fontencLE->setEnabled(true);
2743 int n = findToken(tex_fonts_roman, bp_.fontsRoman);
2745 fontModule->fontsRomanCO->setCurrentIndex(n);
2749 n = findToken(tex_fonts_sans, bp_.fontsSans);
2751 fontModule->fontsSansCO->setCurrentIndex(n);
2755 n = findToken(tex_fonts_monospaced, bp_.fontsTypewriter);
2757 fontModule->fontsTypewriterCO->setCurrentIndex(n);
2762 if (!bp_.fontsCJK.empty())
2763 fontModule->cjkFontLE->setText(
2764 toqstr(bp_.fontsCJK));
2766 fontModule->cjkFontLE->setText(QString());
2768 fontModule->fontScCB->setChecked(bp_.fontsSC);
2769 fontModule->fontOsfCB->setChecked(bp_.fontsOSF);
2770 fontModule->scaleSansSB->setValue(bp_.fontsSansScale);
2771 fontModule->scaleTypewriterSB->setValue(bp_.fontsTypewriterScale);
2773 int nn = findToken(GuiDocument::fontfamilies, bp_.fontsDefaultFamily);
2775 fontModule->fontsDefaultCO->setCurrentIndex(nn);
2777 if (bp_.fontenc == "global")
2778 fontModule->fontencCO->setCurrentIndex(0);
2779 else if (bp_.fontenc == "default")
2780 fontModule->fontencCO->setCurrentIndex(2);
2782 fontModule->fontencCO->setCurrentIndex(1);
2783 fontModule->fontencLE->setText(toqstr(bp_.fontenc));
2787 bool const extern_geometry =
2788 documentClass().provides("geometry");
2789 int const psize = bp_.papersize;
2790 pageLayoutModule->papersizeCO->setCurrentIndex(psize);
2791 setCustomPapersize(!extern_geometry && psize == 1);
2792 pageLayoutModule->papersizeCO->setEnabled(!extern_geometry);
2794 bool const landscape =
2795 bp_.orientation == ORIENTATION_LANDSCAPE;
2796 pageLayoutModule->landscapeRB->setChecked(landscape);
2797 pageLayoutModule->portraitRB->setChecked(!landscape);
2798 pageLayoutModule->landscapeRB->setEnabled(!extern_geometry);
2799 pageLayoutModule->portraitRB->setEnabled(!extern_geometry);
2801 pageLayoutModule->facingPagesCB->setChecked(
2802 bp_.sides == TwoSides);
2804 lengthToWidgets(pageLayoutModule->paperwidthLE,
2805 pageLayoutModule->paperwidthUnitCO, bp_.paperwidth, defaultUnit);
2806 lengthToWidgets(pageLayoutModule->paperheightLE,
2807 pageLayoutModule->paperheightUnitCO, bp_.paperheight, defaultUnit);
2810 Ui::MarginsUi * m = marginsModule;
2814 lengthToWidgets(m->topLE, m->topUnit,
2815 bp_.topmargin, defaultUnit);
2817 lengthToWidgets(m->bottomLE, m->bottomUnit,
2818 bp_.bottommargin, defaultUnit);
2820 lengthToWidgets(m->innerLE, m->innerUnit,
2821 bp_.leftmargin, defaultUnit);
2823 lengthToWidgets(m->outerLE, m->outerUnit,
2824 bp_.rightmargin, defaultUnit);
2826 lengthToWidgets(m->headheightLE, m->headheightUnit,
2827 bp_.headheight, defaultUnit);
2829 lengthToWidgets(m->headsepLE, m->headsepUnit,
2830 bp_.headsep, defaultUnit);
2832 lengthToWidgets(m->footskipLE, m->footskipUnit,
2833 bp_.footskip, defaultUnit);
2835 lengthToWidgets(m->columnsepLE, m->columnsepUnit,
2836 bp_.columnsep, defaultUnit);
2839 updateUnknownBranches();
2840 branchesModule->update(bp_);
2843 PDFOptions const & pdf = bp_.pdfoptions();
2844 pdfSupportModule->use_hyperrefGB->setChecked(pdf.use_hyperref);
2845 pdfSupportModule->titleLE->setText(toqstr(pdf.title));
2846 pdfSupportModule->authorLE->setText(toqstr(pdf.author));
2847 pdfSupportModule->subjectLE->setText(toqstr(pdf.subject));
2848 pdfSupportModule->keywordsLE->setText(toqstr(pdf.keywords));
2850 pdfSupportModule->bookmarksGB->setChecked(pdf.bookmarks);
2851 pdfSupportModule->bookmarksnumberedCB->setChecked(pdf.bookmarksnumbered);
2852 pdfSupportModule->bookmarksopenGB->setChecked(pdf.bookmarksopen);
2854 pdfSupportModule->bookmarksopenlevelSB->setValue(pdf.bookmarksopenlevel);
2856 pdfSupportModule->breaklinksCB->setChecked(pdf.breaklinks);
2857 pdfSupportModule->pdfborderCB->setChecked(pdf.pdfborder);
2858 pdfSupportModule->pdfusetitleCB->setChecked(pdf.pdfusetitle);
2859 pdfSupportModule->colorlinksCB->setChecked(pdf.colorlinks);
2861 nn = findToken(backref_opts, pdf.backref);
2863 pdfSupportModule->backrefCO->setCurrentIndex(nn);
2865 pdfSupportModule->fullscreenCB->setChecked
2866 (pdf.pagemode == pdf.pagemode_fullscreen);
2868 pdfSupportModule->optionsLE->setText(
2869 toqstr(pdf.quoted_options));
2871 // Make sure that the bc is in the INITIAL state
2872 if (bc().policy().buttonStatus(ButtonPolicy::RESTORE))
2875 // clear changed branches cache
2876 changedBranches_.clear();
2880 void GuiDocument::saveDocDefault()
2882 // we have to apply the params first
2888 void GuiDocument::updateAvailableModules()
2890 modules_av_model_.clear();
2891 list<modInfoStruct> const & modInfoList = getModuleInfo();
2892 list<modInfoStruct>::const_iterator mit = modInfoList.begin();
2893 list<modInfoStruct>::const_iterator men = modInfoList.end();
2894 for (int i = 0; mit != men; ++mit, ++i)
2895 modules_av_model_.insertRow(i, mit->name, mit->id,
2900 void GuiDocument::updateSelectedModules()
2902 modules_sel_model_.clear();
2903 list<modInfoStruct> const selModList = getSelectedModules();
2904 list<modInfoStruct>::const_iterator mit = selModList.begin();
2905 list<modInfoStruct>::const_iterator men = selModList.end();
2906 for (int i = 0; mit != men; ++mit, ++i)
2907 modules_sel_model_.insertRow(i, mit->name, mit->id,
2912 void GuiDocument::updateIncludeonlys()
2914 masterChildModule->childrenTW->clear();
2915 QString const no = qt_("No");
2916 QString const yes = qt_("Yes");
2918 if (includeonlys_.empty()) {
2919 masterChildModule->includeallRB->setChecked(true);
2920 masterChildModule->childrenTW->setEnabled(false);
2921 masterChildModule->maintainAuxCB->setEnabled(false);
2923 masterChildModule->includeonlyRB->setChecked(true);
2924 masterChildModule->childrenTW->setEnabled(true);
2925 masterChildModule->maintainAuxCB->setEnabled(true);
2927 QTreeWidgetItem * item = 0;
2928 std::vector<Buffer *> children = buffer().getChildren(false);
2929 vector<Buffer *>::const_iterator it = children.begin();
2930 vector<Buffer *>::const_iterator end = children.end();
2931 bool has_unincluded = false;
2932 bool all_unincluded = true;
2933 for (; it != end; ++it) {
2934 item = new QTreeWidgetItem(masterChildModule->childrenTW);
2937 to_utf8(makeRelPath(from_utf8((*it)->fileName().absFileName()),
2938 from_utf8(buffer().filePath())));
2939 item->setText(0, toqstr(name));
2940 item->setText(1, isChildIncluded(name) ? yes : no);
2941 if (!isChildIncluded(name))
2942 has_unincluded = true;
2944 all_unincluded = false;
2946 // Both if all childs are included and if none is included
2947 // is equal to "include all" (i.e., ommit \includeonly).
2948 // Thus, reset the GUI.
2949 if (!has_unincluded || all_unincluded) {
2950 masterChildModule->includeallRB->setChecked(true);
2951 masterChildModule->childrenTW->setEnabled(false);
2952 includeonlys_.clear();
2954 // If all are included, we need to update again.
2955 if (!has_unincluded)
2956 updateIncludeonlys();
2960 void GuiDocument::updateContents()
2962 // Nothing to do here as the document settings is not cursor dependant.
2967 void GuiDocument::useClassDefaults()
2969 if (applyPB->isEnabled()) {
2970 int const ret = Alert::prompt(_("Unapplied changes"),
2971 _("Some changes in the dialog were not yet applied.\n"
2972 "If you do not apply now, they will be lost after this action."),
2973 1, 1, _("&Apply"), _("&Dismiss"));
2978 int idx = latexModule->classCO->currentIndex();
2979 string const classname = classes_model_.getIDString(idx);
2980 if (!bp_.setBaseClass(classname)) {
2981 Alert::error(_("Error"), _("Unable to set document class."));
2984 bp_.useClassDefaults();
2989 void GuiDocument::setLayoutComboByIDString(string const & idString)
2991 int idx = classes_model_.findIDString(idString);
2993 Alert::warning(_("Can't set layout!"),
2994 bformat(_("Unable to set layout for ID: %1$s"), from_utf8(idString)));
2996 latexModule->classCO->setCurrentIndex(idx);
3000 bool GuiDocument::isValid()
3002 return validateListingsParameters().isEmpty()
3003 && (textLayoutModule->skipCO->currentIndex() != 3
3004 || !textLayoutModule->skipLE->text().isEmpty()
3005 || textLayoutModule->indentRB->isChecked())
3006 && (textLayoutModule->indentCO->currentIndex() != 1
3007 || !textLayoutModule->indentLE->text().isEmpty()
3008 || textLayoutModule->skipRB->isChecked());
3012 char const * const GuiDocument::fontfamilies[5] = {
3013 "default", "rmdefault", "sfdefault", "ttdefault", ""
3017 char const * GuiDocument::fontfamilies_gui[5] = {
3018 N_("Default"), N_("Roman"), N_("Sans Serif"), N_("Typewriter"), ""
3022 bool GuiDocument::initialiseParams(string const &)
3024 BufferView const * view = bufferview();
3026 bp_ = BufferParams();
3030 bp_ = view->buffer().params();
3032 updateAvailableModules();
3033 //FIXME It'd be nice to make sure here that the selected
3034 //modules are consistent: That required modules are actually
3035 //selected, and that we don't have conflicts. If so, we could
3036 //at least pop up a warning.
3042 void GuiDocument::clearParams()
3044 bp_ = BufferParams();
3048 BufferId GuiDocument::id() const
3050 BufferView const * const view = bufferview();
3051 return view? &view->buffer() : 0;
3055 list<GuiDocument::modInfoStruct> const & GuiDocument::getModuleInfo()
3057 return moduleNames_;
3061 list<GuiDocument::modInfoStruct> const
3062 GuiDocument::makeModuleInfo(LayoutModuleList const & mods)
3064 LayoutModuleList::const_iterator it = mods.begin();
3065 LayoutModuleList::const_iterator end = mods.end();
3066 list<modInfoStruct> mInfo;
3067 for (; it != end; ++it) {
3070 LyXModule const * const mod = theModuleList[*it];
3073 m.name = toqstr(translateIfPossible(from_utf8(mod->getName())));
3075 m.name = toqstr(*it) + toqstr(" (") + qt_("Not Found") + toqstr(")");
3082 list<GuiDocument::modInfoStruct> const GuiDocument::getSelectedModules()
3084 return makeModuleInfo(params().getModules());
3088 list<GuiDocument::modInfoStruct> const GuiDocument::getProvidedModules()
3090 return makeModuleInfo(params().baseClass()->providedModules());
3094 DocumentClass const & GuiDocument::documentClass() const
3096 return bp_.documentClass();
3100 static void dispatch_bufferparams(Dialog const & dialog,
3101 BufferParams const & bp, FuncCode lfun)
3104 ss << "\\begin_header\n";
3106 ss << "\\end_header\n";
3107 dialog.dispatch(FuncRequest(lfun, ss.str()));
3111 void GuiDocument::dispatchParams()
3113 // This must come first so that a language change is correctly noticed
3116 // Apply the BufferParams. Note that this will set the base class
3117 // and then update the buffer's layout.
3118 dispatch_bufferparams(*this, params(), LFUN_BUFFER_PARAMS_APPLY);
3120 if (!params().master.empty()) {
3121 FileName const master_file = support::makeAbsPath(params().master,
3122 support::onlyPath(buffer().absFileName()));
3123 if (isLyXFileName(master_file.absFileName())) {
3124 Buffer * master = checkAndLoadLyXFile(master_file);
3126 if (master->isChild(const_cast<Buffer *>(&buffer())))
3127 const_cast<Buffer &>(buffer()).setParent(master);
3129 Alert::warning(_("Assigned master does not include this file"),
3130 bformat(_("You must include this file in the document\n"
3131 "'%1$s' in order to use the master document\n"
3132 "feature."), from_utf8(params().master)));
3134 Alert::warning(_("Could not load master"),
3135 bformat(_("The master document '%1$s'\n"
3136 "could not be loaded."),
3137 from_utf8(params().master)));
3141 // Generate the colours requested by each new branch.
3142 BranchList & branchlist = params().branchlist();
3143 if (!branchlist.empty()) {
3144 BranchList::const_iterator it = branchlist.begin();
3145 BranchList::const_iterator const end = branchlist.end();
3146 for (; it != end; ++it) {
3147 docstring const & current_branch = it->branch();
3148 Branch const * branch = branchlist.find(current_branch);
3149 string const x11hexname = X11hexname(branch->color());
3150 // display the new color
3151 docstring const str = current_branch + ' ' + from_ascii(x11hexname);
3152 dispatch(FuncRequest(LFUN_SET_COLOR, str));
3155 // Open insets of selected branches, close deselected ones
3156 dispatch(FuncRequest(LFUN_INSET_FORALL,
3157 "Branch inset-toggle assign"));
3159 // rename branches in the document
3160 executeBranchRenaming();
3161 // and clear changed branches cache
3162 changedBranches_.clear();
3164 // Generate the colours requested by indices.
3165 IndicesList & indiceslist = params().indiceslist();
3166 if (!indiceslist.empty()) {
3167 IndicesList::const_iterator it = indiceslist.begin();
3168 IndicesList::const_iterator const end = indiceslist.end();
3169 for (; it != end; ++it) {
3170 docstring const & current_index = it->shortcut();
3171 Index const * index = indiceslist.findShortcut(current_index);
3172 string const x11hexname = X11hexname(index->color());
3173 // display the new color
3174 docstring const str = current_index + ' ' + from_ascii(x11hexname);
3175 dispatch(FuncRequest(LFUN_SET_COLOR, str));
3178 // FIXME: If we used an LFUN, we would not need those two lines:
3179 BufferView * bv = const_cast<BufferView *>(bufferview());
3180 bv->processUpdateFlags(Update::Force | Update::FitCursor);
3184 void GuiDocument::setLanguage() const
3186 Language const * const newL = bp_.language;
3187 if (buffer().params().language == newL)
3190 string const & lang_name = newL->lang();
3191 dispatch(FuncRequest(LFUN_BUFFER_LANGUAGE, lang_name));
3195 void GuiDocument::saveAsDefault() const
3197 dispatch_bufferparams(*this, params(), LFUN_BUFFER_SAVE_AS_DEFAULT);
3201 bool GuiDocument::isFontAvailable(string const & font) const
3203 if (font == "default" || font == "cmr"
3204 || font == "cmss" || font == "cmtt")
3205 // these are standard
3207 if (font == "lmodern" || font == "lmss" || font == "lmtt")
3208 return LaTeXFeatures::isAvailable("lmodern");
3209 if (font == "times" || font == "palatino"
3210 || font == "helvet" || font == "courier")
3211 return LaTeXFeatures::isAvailable("psnfss");
3212 if (font == "cmbr" || font == "cmtl")
3213 return LaTeXFeatures::isAvailable("cmbright");
3214 if (font == "utopia")
3215 return LaTeXFeatures::isAvailable("utopia")
3216 || LaTeXFeatures::isAvailable("fourier");
3217 if (font == "beraserif" || font == "berasans"
3218 || font == "beramono")
3219 return LaTeXFeatures::isAvailable("bera");
3220 return LaTeXFeatures::isAvailable(font);
3224 bool GuiDocument::providesOSF(string const & font) const
3226 if (outputModule->xetexCB->isChecked())
3227 // FIXME: we should check if the fonts really
3228 // have OSF support. But how?
3231 return isFontAvailable("eco");
3232 if (font == "palatino")
3233 return isFontAvailable("mathpazo");
3238 bool GuiDocument::providesSC(string const & font) const
3240 if (outputModule->xetexCB->isChecked())
3242 if (font == "palatino")
3243 return isFontAvailable("mathpazo");
3244 if (font == "utopia")
3245 return isFontAvailable("fourier");
3250 bool GuiDocument::providesScale(string const & font) const
3252 if (outputModule->xetexCB->isChecked())
3254 return font == "helvet" || font == "luximono"
3255 || font == "berasans" || font == "beramono";
3259 void GuiDocument::loadModuleInfo()
3261 moduleNames_.clear();
3262 LyXModuleList::const_iterator it = theModuleList.begin();
3263 LyXModuleList::const_iterator end = theModuleList.end();
3264 for (; it != end; ++it) {
3268 m.name = toqstr(translateIfPossible(from_utf8(it->getName())));
3269 // this is supposed to give us the first sentence of the description
3272 toqstr(translateIfPossible(from_utf8(it->getDescription())));
3273 int const pos = desc.indexOf(".");
3275 desc.truncate(pos + 1);
3276 m.description = desc;
3277 moduleNames_.push_back(m);
3282 void GuiDocument::updateUnknownBranches()
3286 list<docstring> used_branches;
3287 buffer().getUsedBranches(used_branches);
3288 list<docstring>::const_iterator it = used_branches.begin();
3289 QStringList unknown_branches;
3290 for (; it != used_branches.end() ; ++it) {
3291 if (!buffer().params().branchlist().find(*it))
3292 unknown_branches.append(toqstr(*it));
3294 branchesModule->setUnknownBranches(unknown_branches);
3298 void GuiDocument::branchesRename(docstring const & oldname, docstring const & newname)
3300 map<docstring, docstring>::iterator it = changedBranches_.begin();
3301 for (; it != changedBranches_.end() ; ++it) {
3302 if (it->second == oldname) {
3303 // branch has already been renamed
3304 it->second = newname;
3309 changedBranches_[oldname] = newname;
3313 void GuiDocument::executeBranchRenaming() const
3315 map<docstring, docstring>::const_iterator it = changedBranches_.begin();
3316 for (; it != changedBranches_.end() ; ++it) {
3317 docstring const arg = '"' + it->first + '"' + " " + '"' + it->second + '"';
3318 dispatch(FuncRequest(LFUN_BRANCHES_RENAME, arg));
3323 Dialog * createGuiDocument(GuiView & lv) { return new GuiDocument(lv); }
3326 } // namespace frontend
3329 #include "moc_GuiDocument.cpp"