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:");
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;
183 // used when sorting the textclass list.
184 class less_textclass_avail_desc
185 : public binary_function<string, string, int>
188 bool operator()(string const & lhs, string const & rhs) const
190 // Ordering criteria:
191 // 1. Availability of text class
192 // 2. Description (lexicographic)
193 LayoutFile const & tc1 = LayoutFileList::get()[lhs];
194 LayoutFile const & tc2 = LayoutFileList::get()[rhs];
195 int const order = compare_no_case(
196 translateIfPossible(from_utf8(tc1.description())),
197 translateIfPossible(from_utf8(tc2.description())));
198 return (tc1.isTeXClassAvailable() && !tc2.isTeXClassAvailable()) ||
199 (tc1.isTeXClassAvailable() == tc2.isTeXClassAvailable() && order < 0);
208 vector<string> getRequiredList(string const & modName)
210 LyXModule const * const mod = theModuleList[modName];
212 return vector<string>(); //empty such thing
213 return mod->getRequiredModules();
217 vector<string> getExcludedList(string const & modName)
219 LyXModule const * const mod = theModuleList[modName];
221 return vector<string>(); //empty such thing
222 return mod->getExcludedModules();
226 docstring getModuleDescription(string const & modName)
228 LyXModule const * const mod = theModuleList[modName];
230 return _("Module not found!");
232 return translateIfPossible(from_utf8(mod->getDescription()));
236 vector<string> getPackageList(string const & modName)
238 LyXModule const * const mod = theModuleList[modName];
240 return vector<string>(); //empty such thing
241 return mod->getPackageList();
245 bool isModuleAvailable(string const & modName)
247 LyXModule const * const mod = theModuleList[modName];
250 return mod->isAvailable();
253 } // anonymous namespace
256 /////////////////////////////////////////////////////////////////////
258 // ModuleSelectionManager
260 /////////////////////////////////////////////////////////////////////
262 /// SelectionManager for use with modules
263 class ModuleSelectionManager : public GuiSelectionManager
267 ModuleSelectionManager(
268 QTreeView * availableLV,
269 QListView * selectedLV,
273 QPushButton * downPB,
274 GuiIdListModel * availableModel,
275 GuiIdListModel * selectedModel,
276 GuiDocument const * container)
277 : GuiSelectionManager(availableLV, selectedLV, addPB, delPB,
278 upPB, downPB, availableModel, selectedModel), container_(container)
281 void updateProvidedModules(LayoutModuleList const & pm)
282 { provided_modules_ = pm.list(); }
284 void updateExcludedModules(LayoutModuleList const & em)
285 { excluded_modules_ = em.list(); }
288 virtual void updateAddPB();
290 virtual void updateUpPB();
292 virtual void updateDownPB();
294 virtual void updateDelPB();
295 /// returns availableModel as a GuiIdListModel
296 GuiIdListModel * getAvailableModel()
298 return dynamic_cast<GuiIdListModel *>(availableModel);
300 /// returns selectedModel as a GuiIdListModel
301 GuiIdListModel * getSelectedModel()
303 return dynamic_cast<GuiIdListModel *>(selectedModel);
305 /// keeps a list of the modules the text class provides
306 list<string> provided_modules_;
308 list<string> excluded_modules_;
310 GuiDocument const * container_;
313 void ModuleSelectionManager::updateAddPB()
315 int const arows = availableModel->rowCount();
316 QModelIndexList const avail_sels =
317 availableLV->selectionModel()->selectedIndexes();
319 // disable if there aren't any modules (?), if none of them is chosen
320 // in the dialog, or if the chosen one is already selected for use.
321 if (arows == 0 || avail_sels.isEmpty() || isSelected(avail_sels.first())) {
322 addPB->setEnabled(false);
326 QModelIndex const & idx = availableLV->selectionModel()->currentIndex();
327 string const modname = getAvailableModel()->getIDString(idx.row());
330 container_->params().moduleCanBeAdded(modname);
331 addPB->setEnabled(enable);
335 void ModuleSelectionManager::updateDownPB()
337 int const srows = selectedModel->rowCount();
339 downPB->setEnabled(false);
342 QModelIndex const & curidx = selectedLV->selectionModel()->currentIndex();
343 int const curRow = curidx.row();
344 if (curRow < 0 || curRow >= srows - 1) { // invalid or last item
345 downPB->setEnabled(false);
349 // determine whether immediately succeding element requires this one
350 string const curmodname = getSelectedModel()->getIDString(curRow);
351 string const nextmodname = getSelectedModel()->getIDString(curRow + 1);
353 vector<string> reqs = getRequiredList(nextmodname);
355 // if it doesn't require anything....
357 downPB->setEnabled(true);
361 // Enable it if this module isn't required.
362 // FIXME This should perhaps be more flexible and check whether, even
363 // if the next one is required, there is also an earlier one that will do.
365 find(reqs.begin(), reqs.end(), curmodname) == reqs.end());
368 void ModuleSelectionManager::updateUpPB()
370 int const srows = selectedModel->rowCount();
372 upPB->setEnabled(false);
376 QModelIndex const & curIdx = selectedLV->selectionModel()->currentIndex();
377 int curRow = curIdx.row();
378 if (curRow <= 0 || curRow > srows - 1) { // first item or invalid
379 upPB->setEnabled(false);
382 string const curmodname = getSelectedModel()->getIDString(curRow);
384 // determine whether immediately preceding element is required by this one
385 vector<string> reqs = getRequiredList(curmodname);
387 // if this one doesn't require anything....
389 upPB->setEnabled(true);
394 // Enable it if the preceding module isn't required.
395 // NOTE This is less flexible than it might be. We could check whether, even
396 // if the previous one is required, there is an earlier one that would do.
397 string const premod = getSelectedModel()->getIDString(curRow - 1);
398 upPB->setEnabled(find(reqs.begin(), reqs.end(), premod) == reqs.end());
401 void ModuleSelectionManager::updateDelPB()
403 int const srows = selectedModel->rowCount();
405 deletePB->setEnabled(false);
409 QModelIndex const & curidx =
410 selectedLV->selectionModel()->currentIndex();
411 int const curRow = curidx.row();
412 if (curRow < 0 || curRow >= srows) { // invalid index?
413 deletePB->setEnabled(false);
417 string const curmodname = getSelectedModel()->getIDString(curRow);
419 // We're looking here for a reason NOT to enable the button. If we
420 // find one, we disable it and return. If we don't, we'll end up at
421 // the end of the function, and then we enable it.
422 for (int i = curRow + 1; i < srows; ++i) {
423 string const thisMod = getSelectedModel()->getIDString(i);
424 vector<string> reqs = getRequiredList(thisMod);
425 //does this one require us?
426 if (find(reqs.begin(), reqs.end(), curmodname) == reqs.end())
430 // OK, so this module requires us
431 // is there an EARLIER module that also satisfies the require?
432 // NOTE We demand that it be earlier to keep the list of modules
433 // consistent with the rule that a module must be proceeded by a
434 // required module. There would be more flexible ways to proceed,
435 // but that would be a lot more complicated, and the logic here is
436 // already complicated. (That's why I've left the debugging code.)
437 // lyxerr << "Testing " << thisMod << endl;
438 bool foundone = false;
439 for (int j = 0; j < curRow; ++j) {
440 string const mod = getSelectedModel()->getIDString(j);
441 // lyxerr << "In loop: Testing " << mod << endl;
442 // do we satisfy the require?
443 if (find(reqs.begin(), reqs.end(), mod) != reqs.end()) {
444 // lyxerr << mod << " does the trick." << endl;
449 // did we find a module to satisfy the require?
451 // lyxerr << "No matching module found." << endl;
452 deletePB->setEnabled(false);
456 // lyxerr << "All's well that ends well." << endl;
457 deletePB->setEnabled(true);
461 /////////////////////////////////////////////////////////////////////
465 /////////////////////////////////////////////////////////////////////
467 PreambleModule::PreambleModule() : current_id_(0)
469 // This is not a memory leak. The object will be destroyed
471 (void) new LaTeXHighlighter(preambleTE->document());
472 setFocusProxy(preambleTE);
473 connect(preambleTE, SIGNAL(textChanged()), this, SIGNAL(changed()));
477 void PreambleModule::update(BufferParams const & params, BufferId id)
479 QString preamble = toqstr(params.preamble);
480 // Nothing to do if the params and preamble are unchanged.
481 if (id == current_id_
482 && preamble == preambleTE->document()->toPlainText())
485 QTextCursor cur = preambleTE->textCursor();
486 // Save the coords before switching to the new one.
487 preamble_coords_[current_id_] =
488 make_pair(cur.position(), preambleTE->verticalScrollBar()->value());
490 // Save the params address for further use.
492 preambleTE->document()->setPlainText(preamble);
493 Coords::const_iterator it = preamble_coords_.find(current_id_);
494 if (it == preamble_coords_.end())
495 // First time we open this one.
496 preamble_coords_[current_id_] = make_pair(0, 0);
498 // Restore saved coords.
499 QTextCursor cur = preambleTE->textCursor();
500 cur.setPosition(it->second.first);
501 preambleTE->setTextCursor(cur);
502 preambleTE->verticalScrollBar()->setValue(it->second.second);
507 void PreambleModule::apply(BufferParams & params)
509 params.preamble = fromqstr(preambleTE->document()->toPlainText());
513 void PreambleModule::closeEvent(QCloseEvent * e)
515 // Save the coords before closing.
516 QTextCursor cur = preambleTE->textCursor();
517 preamble_coords_[current_id_] =
518 make_pair(cur.position(), preambleTE->verticalScrollBar()->value());
523 /////////////////////////////////////////////////////////////////////
527 /////////////////////////////////////////////////////////////////////
530 GuiDocument::GuiDocument(GuiView & lv)
531 : GuiDialog(lv, "document", qt_("Document Settings"))
535 connect(okPB, SIGNAL(clicked()), this, SLOT(slotOK()));
536 connect(applyPB, SIGNAL(clicked()), this, SLOT(slotApply()));
537 connect(closePB, SIGNAL(clicked()), this, SLOT(slotClose()));
538 connect(restorePB, SIGNAL(clicked()), this, SLOT(slotRestore()));
540 connect(savePB, SIGNAL(clicked()), this, SLOT(saveDefaultClicked()));
541 connect(defaultPB, SIGNAL(clicked()), this, SLOT(useDefaultsClicked()));
543 // Manage the restore, ok, apply, restore and cancel/close buttons
544 bc().setPolicy(ButtonPolicy::NoRepeatedApplyReadOnlyPolicy);
546 bc().setApply(applyPB);
547 bc().setCancel(closePB);
548 bc().setRestore(restorePB);
550 textLayoutModule = new UiWidget<Ui::TextLayoutUi>;
552 connect(textLayoutModule->lspacingCO, SIGNAL(activated(int)),
553 this, SLOT(change_adaptor()));
554 connect(textLayoutModule->lspacingCO, SIGNAL(activated(int)),
555 this, SLOT(setLSpacing(int)));
556 connect(textLayoutModule->lspacingLE, SIGNAL(textChanged(const QString &)),
557 this, SLOT(change_adaptor()));
559 connect(textLayoutModule->indentRB, SIGNAL(clicked()),
560 this, SLOT(change_adaptor()));
561 connect(textLayoutModule->indentRB, SIGNAL(toggled(bool)),
562 textLayoutModule->indentCO, SLOT(setEnabled(bool)));
563 connect(textLayoutModule->indentCO, SIGNAL(activated(int)),
564 this, SLOT(change_adaptor()));
565 connect(textLayoutModule->indentCO, SIGNAL(activated(int)),
566 this, SLOT(setIndent(int)));
567 connect(textLayoutModule->indentLE, SIGNAL(textChanged(const QString &)),
568 this, SLOT(change_adaptor()));
569 connect(textLayoutModule->indentLengthCO, SIGNAL(activated(int)),
570 this, SLOT(change_adaptor()));
572 connect(textLayoutModule->skipRB, SIGNAL(clicked()),
573 this, SLOT(change_adaptor()));
574 connect(textLayoutModule->skipRB, SIGNAL(toggled(bool)),
575 textLayoutModule->skipCO, SLOT(setEnabled(bool)));
576 connect(textLayoutModule->skipCO, SIGNAL(activated(int)),
577 this, SLOT(change_adaptor()));
578 connect(textLayoutModule->skipCO, SIGNAL(activated(int)),
579 this, SLOT(setSkip(int)));
580 connect(textLayoutModule->skipLE, SIGNAL(textChanged(const QString &)),
581 this, SLOT(change_adaptor()));
582 connect(textLayoutModule->skipLengthCO, SIGNAL(activated(int)),
583 this, SLOT(change_adaptor()));
585 connect(textLayoutModule->indentRB, SIGNAL(toggled(bool)),
586 this, SLOT(enableIndent(bool)));
587 connect(textLayoutModule->skipRB, SIGNAL(toggled(bool)),
588 this, SLOT(enableSkip(bool)));
590 connect(textLayoutModule->twoColumnCB, SIGNAL(clicked()),
591 this, SLOT(change_adaptor()));
592 connect(textLayoutModule->twoColumnCB, SIGNAL(clicked()),
593 this, SLOT(setColSep()));
595 textLayoutModule->lspacingLE->setValidator(new QDoubleValidator(
596 textLayoutModule->lspacingLE));
597 textLayoutModule->indentLE->setValidator(unsignedLengthValidator(
598 textLayoutModule->indentLE));
599 textLayoutModule->skipLE->setValidator(unsignedGlueLengthValidator(
600 textLayoutModule->skipLE));
602 textLayoutModule->indentCO->addItem(qt_("Default"));
603 textLayoutModule->indentCO->addItem(qt_("Custom"));
604 textLayoutModule->skipCO->addItem(qt_("SmallSkip"));
605 textLayoutModule->skipCO->addItem(qt_("MedSkip"));
606 textLayoutModule->skipCO->addItem(qt_("BigSkip"));
607 textLayoutModule->skipCO->addItem(qt_("Custom"));
608 textLayoutModule->lspacingCO->insertItem(
609 Spacing::Single, qt_("Single"));
610 textLayoutModule->lspacingCO->insertItem(
611 Spacing::Onehalf, qt_("OneHalf"));
612 textLayoutModule->lspacingCO->insertItem(
613 Spacing::Double, qt_("Double"));
614 textLayoutModule->lspacingCO->insertItem(
615 Spacing::Other, qt_("Custom"));
616 // initialize the length validator
617 bc().addCheckedLineEdit(textLayoutModule->indentLE);
618 bc().addCheckedLineEdit(textLayoutModule->skipLE);
620 // master/child handling
621 masterChildModule = new UiWidget<Ui::MasterChildUi>;
623 connect(masterChildModule->childrenTW, SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)),
624 this, SLOT(includeonlyClicked(QTreeWidgetItem *, int)));
625 connect(masterChildModule->includeonlyRB, SIGNAL(toggled(bool)),
626 masterChildModule->childrenTW, SLOT(setEnabled(bool)));
627 connect(masterChildModule->includeonlyRB, SIGNAL(toggled(bool)),
628 masterChildModule->maintainAuxCB, SLOT(setEnabled(bool)));
629 connect(masterChildModule->includeallRB, SIGNAL(clicked()),
630 this, SLOT(change_adaptor()));
631 connect(masterChildModule->includeonlyRB, SIGNAL(clicked()),
632 this, SLOT(change_adaptor()));
633 connect(masterChildModule->maintainAuxCB, SIGNAL(clicked()),
634 this, SLOT(change_adaptor()));
635 masterChildModule->childrenTW->setColumnCount(2);
636 masterChildModule->childrenTW->headerItem()->setText(0, qt_("Child Document"));
637 masterChildModule->childrenTW->headerItem()->setText(1, qt_("Include to Output"));
638 masterChildModule->childrenTW->resizeColumnToContents(1);
639 masterChildModule->childrenTW->resizeColumnToContents(2);
642 outputModule = new UiWidget<Ui::OutputUi>;
644 connect(outputModule->xetexCB, SIGNAL(clicked()),
645 this, SLOT(change_adaptor()));
646 connect(outputModule->xetexCB, SIGNAL(toggled(bool)),
647 this, SLOT(xetexChanged(bool)));
648 connect(outputModule->defaultFormatCO, SIGNAL(activated(int)),
649 this, SLOT(change_adaptor()));
652 fontModule = new UiWidget<Ui::FontUi>;
653 connect(fontModule->fontsRomanCO, SIGNAL(activated(int)),
654 this, SLOT(change_adaptor()));
655 connect(fontModule->fontsRomanCO, SIGNAL(activated(int)),
656 this, SLOT(romanChanged(int)));
657 connect(fontModule->fontsSansCO, SIGNAL(activated(int)),
658 this, SLOT(change_adaptor()));
659 connect(fontModule->fontsSansCO, SIGNAL(activated(int)),
660 this, SLOT(sansChanged(int)));
661 connect(fontModule->fontsTypewriterCO, SIGNAL(activated(int)),
662 this, SLOT(change_adaptor()));
663 connect(fontModule->fontsTypewriterCO, SIGNAL(activated(int)),
664 this, SLOT(ttChanged(int)));
665 connect(fontModule->fontsDefaultCO, SIGNAL(activated(int)),
666 this, SLOT(change_adaptor()));
667 connect(fontModule->fontencCO, SIGNAL(activated(int)),
668 this, SLOT(change_adaptor()));
669 connect(fontModule->fontencCO, SIGNAL(activated(int)),
670 this, SLOT(fontencChanged(int)));
671 connect(fontModule->fontencLE, SIGNAL(textChanged(const QString &)),
672 this, SLOT(change_adaptor()));
673 connect(fontModule->fontsizeCO, SIGNAL(activated(int)),
674 this, SLOT(change_adaptor()));
675 connect(fontModule->cjkFontLE, SIGNAL(textChanged(const QString &)),
676 this, SLOT(change_adaptor()));
677 connect(fontModule->scaleSansSB, SIGNAL(valueChanged(int)),
678 this, SLOT(change_adaptor()));
679 connect(fontModule->scaleTypewriterSB, SIGNAL(valueChanged(int)),
680 this, SLOT(change_adaptor()));
681 connect(fontModule->fontScCB, SIGNAL(clicked()),
682 this, SLOT(change_adaptor()));
683 connect(fontModule->fontOsfCB, SIGNAL(clicked()),
684 this, SLOT(change_adaptor()));
688 fontModule->fontsizeCO->addItem(qt_("Default"));
689 fontModule->fontsizeCO->addItem(qt_("10"));
690 fontModule->fontsizeCO->addItem(qt_("11"));
691 fontModule->fontsizeCO->addItem(qt_("12"));
693 fontModule->fontencCO->addItem(qt_("Default"));
694 fontModule->fontencCO->addItem(qt_("Custom"));
695 fontModule->fontencCO->addItem(qt_("None (no fontenc)"));
697 for (int n = 0; GuiDocument::fontfamilies_gui[n][0]; ++n)
698 fontModule->fontsDefaultCO->addItem(
699 qt_(GuiDocument::fontfamilies_gui[n]));
702 pageLayoutModule = new UiWidget<Ui::PageLayoutUi>;
704 connect(pageLayoutModule->papersizeCO, SIGNAL(activated(int)),
705 this, SLOT(papersizeChanged(int)));
706 connect(pageLayoutModule->papersizeCO, SIGNAL(activated(int)),
707 this, SLOT(papersizeChanged(int)));
708 connect(pageLayoutModule->portraitRB, SIGNAL(clicked()),
709 this, SLOT(portraitChanged()));
710 connect(pageLayoutModule->papersizeCO, SIGNAL(activated(int)),
711 this, SLOT(change_adaptor()));
712 connect(pageLayoutModule->paperheightLE, SIGNAL(textChanged(const QString &)),
713 this, SLOT(change_adaptor()));
714 connect(pageLayoutModule->paperwidthLE, SIGNAL(textChanged(const QString &)),
715 this, SLOT(change_adaptor()));
716 connect(pageLayoutModule->paperwidthUnitCO, SIGNAL(activated(int)),
717 this, SLOT(change_adaptor()));
718 connect(pageLayoutModule->paperheightUnitCO, SIGNAL(activated(int)),
719 this, SLOT(change_adaptor()));
720 connect(pageLayoutModule->portraitRB, SIGNAL(clicked()),
721 this, SLOT(change_adaptor()));
722 connect(pageLayoutModule->landscapeRB, SIGNAL(clicked()),
723 this, SLOT(change_adaptor()));
724 connect(pageLayoutModule->facingPagesCB, SIGNAL(clicked()),
725 this, SLOT(change_adaptor()));
726 connect(pageLayoutModule->pagestyleCO, SIGNAL(activated(int)),
727 this, SLOT(change_adaptor()));
728 connect(pageLayoutModule->backgroundPB, SIGNAL(clicked()),
729 this, SLOT(changeBackgroundColor()));
730 connect(pageLayoutModule->delbackgroundTB, SIGNAL(clicked()),
731 this, SLOT(deleteBackgroundColor()));
733 pageLayoutModule->pagestyleCO->addItem(qt_("Default"));
734 pageLayoutModule->pagestyleCO->addItem(qt_("empty"));
735 pageLayoutModule->pagestyleCO->addItem(qt_("plain"));
736 pageLayoutModule->pagestyleCO->addItem(qt_("headings"));
737 pageLayoutModule->pagestyleCO->addItem(qt_("fancy"));
738 bc().addCheckedLineEdit(pageLayoutModule->paperheightLE,
739 pageLayoutModule->paperheightL);
740 bc().addCheckedLineEdit(pageLayoutModule->paperwidthLE,
741 pageLayoutModule->paperwidthL);
744 QComboBox * cb = pageLayoutModule->papersizeCO;
745 cb->addItem(qt_("Default"));
746 cb->addItem(qt_("Custom"));
747 cb->addItem(qt_("US letter"));
748 cb->addItem(qt_("US legal"));
749 cb->addItem(qt_("US executive"));
750 cb->addItem(qt_("A3"));
751 cb->addItem(qt_("A4"));
752 cb->addItem(qt_("A5"));
753 cb->addItem(qt_("B3"));
754 cb->addItem(qt_("B4"));
755 cb->addItem(qt_("B5"));
756 // remove the %-items from the unit choice
757 pageLayoutModule->paperwidthUnitCO->noPercents();
758 pageLayoutModule->paperheightUnitCO->noPercents();
759 pageLayoutModule->paperheightLE->setValidator(unsignedLengthValidator(
760 pageLayoutModule->paperheightLE));
761 pageLayoutModule->paperwidthLE->setValidator(unsignedLengthValidator(
762 pageLayoutModule->paperwidthLE));
765 marginsModule = new UiWidget<Ui::MarginsUi>;
767 connect(marginsModule->marginCB, SIGNAL(toggled(bool)),
768 this, SLOT(setCustomMargins(bool)));
769 connect(marginsModule->marginCB, SIGNAL(clicked()),
770 this, SLOT(change_adaptor()));
771 connect(marginsModule->topLE, SIGNAL(textChanged(QString)),
772 this, SLOT(change_adaptor()));
773 connect(marginsModule->topUnit, SIGNAL(activated(int)),
774 this, SLOT(change_adaptor()));
775 connect(marginsModule->bottomLE, SIGNAL(textChanged(QString)),
776 this, SLOT(change_adaptor()));
777 connect(marginsModule->bottomUnit, SIGNAL(activated(int)),
778 this, SLOT(change_adaptor()));
779 connect(marginsModule->innerLE, SIGNAL(textChanged(QString)),
780 this, SLOT(change_adaptor()));
781 connect(marginsModule->innerUnit, SIGNAL(activated(int)),
782 this, SLOT(change_adaptor()));
783 connect(marginsModule->outerLE, SIGNAL(textChanged(QString)),
784 this, SLOT(change_adaptor()));
785 connect(marginsModule->outerUnit, SIGNAL(activated(int)),
786 this, SLOT(change_adaptor()));
787 connect(marginsModule->headheightLE, SIGNAL(textChanged(QString)),
788 this, SLOT(change_adaptor()));
789 connect(marginsModule->headheightUnit, SIGNAL(activated(int)),
790 this, SLOT(change_adaptor()));
791 connect(marginsModule->headsepLE, SIGNAL(textChanged(QString)),
792 this, SLOT(change_adaptor()));
793 connect(marginsModule->headsepUnit, SIGNAL(activated(int)),
794 this, SLOT(change_adaptor()));
795 connect(marginsModule->footskipLE, SIGNAL(textChanged(QString)),
796 this, SLOT(change_adaptor()));
797 connect(marginsModule->footskipUnit, SIGNAL(activated(int)),
798 this, SLOT(change_adaptor()));
799 connect(marginsModule->columnsepLE, SIGNAL(textChanged(QString)),
800 this, SLOT(change_adaptor()));
801 connect(marginsModule->columnsepUnit, SIGNAL(activated(int)),
802 this, SLOT(change_adaptor()));
803 marginsModule->topLE->setValidator(unsignedLengthValidator(
804 marginsModule->topLE));
805 marginsModule->bottomLE->setValidator(unsignedLengthValidator(
806 marginsModule->bottomLE));
807 marginsModule->innerLE->setValidator(unsignedLengthValidator(
808 marginsModule->innerLE));
809 marginsModule->outerLE->setValidator(unsignedLengthValidator(
810 marginsModule->outerLE));
811 marginsModule->headsepLE->setValidator(unsignedLengthValidator(
812 marginsModule->headsepLE));
813 marginsModule->headheightLE->setValidator(unsignedLengthValidator(
814 marginsModule->headheightLE));
815 marginsModule->footskipLE->setValidator(unsignedLengthValidator(
816 marginsModule->footskipLE));
817 marginsModule->columnsepLE->setValidator(unsignedLengthValidator(
818 marginsModule->columnsepLE));
820 bc().addCheckedLineEdit(marginsModule->topLE,
821 marginsModule->topL);
822 bc().addCheckedLineEdit(marginsModule->bottomLE,
823 marginsModule->bottomL);
824 bc().addCheckedLineEdit(marginsModule->innerLE,
825 marginsModule->innerL);
826 bc().addCheckedLineEdit(marginsModule->outerLE,
827 marginsModule->outerL);
828 bc().addCheckedLineEdit(marginsModule->headsepLE,
829 marginsModule->headsepL);
830 bc().addCheckedLineEdit(marginsModule->headheightLE,
831 marginsModule->headheightL);
832 bc().addCheckedLineEdit(marginsModule->footskipLE,
833 marginsModule->footskipL);
834 bc().addCheckedLineEdit(marginsModule->columnsepLE,
835 marginsModule->columnsepL);
838 langModule = new UiWidget<Ui::LanguageUi>;
840 connect(langModule->languageCO, SIGNAL(activated(int)),
841 this, SLOT(change_adaptor()));
842 connect(langModule->defaultencodingRB, SIGNAL(clicked()),
843 this, SLOT(change_adaptor()));
844 connect(langModule->otherencodingRB, SIGNAL(clicked()),
845 this, SLOT(change_adaptor()));
846 connect(langModule->encodingCO, SIGNAL(activated(int)),
847 this, SLOT(change_adaptor()));
848 connect(langModule->quoteStyleCO, SIGNAL(activated(int)),
849 this, SLOT(change_adaptor()));
851 QAbstractItemModel * language_model = guiApp->languageModel();
852 // FIXME: it would be nice if sorting was enabled/disabled via a checkbox.
853 language_model->sort(0);
854 langModule->languageCO->setModel(language_model);
855 langModule->languageCO->setModelColumn(0);
857 // Always put the default encoding in the first position.
858 langModule->encodingCO->addItem(qt_("Language Default (no inputenc)"));
859 QStringList encodinglist;
860 Encodings::const_iterator it = encodings.begin();
861 Encodings::const_iterator const end = encodings.end();
862 for (; it != end; ++it)
863 encodinglist.append(qt_(it->guiName()));
865 langModule->encodingCO->addItems(encodinglist);
867 langModule->quoteStyleCO->addItem(qt_("``text''"));
868 langModule->quoteStyleCO->addItem(qt_("''text''"));
869 langModule->quoteStyleCO->addItem(qt_(",,text``"));
870 langModule->quoteStyleCO->addItem(qt_(",,text''"));
871 langModule->quoteStyleCO->addItem(qt_("<<text>>"));
872 langModule->quoteStyleCO->addItem(qt_(">>text<<"));
875 numberingModule = new UiWidget<Ui::NumberingUi>;
877 connect(numberingModule->depthSL, SIGNAL(valueChanged(int)),
878 this, SLOT(change_adaptor()));
879 connect(numberingModule->tocSL, SIGNAL(valueChanged(int)),
880 this, SLOT(change_adaptor()));
881 connect(numberingModule->depthSL, SIGNAL(valueChanged(int)),
882 this, SLOT(updateNumbering()));
883 connect(numberingModule->tocSL, SIGNAL(valueChanged(int)),
884 this, SLOT(updateNumbering()));
885 numberingModule->tocTW->setColumnCount(3);
886 numberingModule->tocTW->headerItem()->setText(0, qt_("Example"));
887 numberingModule->tocTW->headerItem()->setText(1, qt_("Numbered"));
888 numberingModule->tocTW->headerItem()->setText(2, qt_("Appears in TOC"));
891 biblioModule = new UiWidget<Ui::BiblioUi>;
892 connect(biblioModule->citeNatbibRB, SIGNAL(toggled(bool)),
893 biblioModule->citationStyleL, SLOT(setEnabled(bool)));
894 connect(biblioModule->citeNatbibRB, SIGNAL(toggled(bool)),
895 biblioModule->citeStyleCO, SLOT(setEnabled(bool)));
897 connect(biblioModule->citeDefaultRB, SIGNAL(clicked()),
898 this, SLOT(change_adaptor()));
899 connect(biblioModule->citeNatbibRB, SIGNAL(clicked()),
900 this, SLOT(change_adaptor()));
901 connect(biblioModule->citeStyleCO, SIGNAL(activated(int)),
902 this, SLOT(change_adaptor()));
903 connect(biblioModule->citeJurabibRB, SIGNAL(clicked()),
904 this, SLOT(change_adaptor()));
905 connect(biblioModule->bibtopicCB, SIGNAL(clicked()),
906 this, SLOT(change_adaptor()));
907 connect(biblioModule->bibtexCO, SIGNAL(activated(int)),
908 this, SLOT(bibtexChanged(int)));
909 connect(biblioModule->bibtexOptionsED, SIGNAL(textChanged(QString)),
910 this, SLOT(change_adaptor()));
912 biblioModule->citeStyleCO->addItem(qt_("Author-year"));
913 biblioModule->citeStyleCO->addItem(qt_("Numerical"));
914 biblioModule->citeStyleCO->setCurrentIndex(0);
916 biblioModule->bibtexCO->clear();
918 biblioModule->bibtexCO->addItem(qt_("Default"), QString("default"));
919 for (set<string>::const_iterator it = lyxrc.bibtex_alternatives.begin();
920 it != lyxrc.bibtex_alternatives.end(); ++it) {
921 QString const command = toqstr(*it).left(toqstr(*it).indexOf(" "));
922 biblioModule->bibtexCO->addItem(command, command);
926 indicesModule = new GuiIndices;
927 connect(indicesModule, SIGNAL(changed()),
928 this, SLOT(change_adaptor()));
931 mathsModule = new UiWidget<Ui::MathsUi>;
932 connect(mathsModule->amsautoCB, SIGNAL(toggled(bool)),
933 mathsModule->amsCB, SLOT(setDisabled(bool)));
934 connect(mathsModule->esintautoCB, SIGNAL(toggled(bool)),
935 mathsModule->esintCB, SLOT(setDisabled(bool)));
936 connect(mathsModule->mhchemautoCB, SIGNAL(toggled(bool)),
937 mathsModule->mhchemCB, SLOT(setDisabled(bool)));
939 connect(mathsModule->amsCB, SIGNAL(clicked()),
940 this, SLOT(change_adaptor()));
941 connect(mathsModule->amsautoCB, SIGNAL(clicked()),
942 this, SLOT(change_adaptor()));
943 connect(mathsModule->esintCB, SIGNAL(clicked()),
944 this, SLOT(change_adaptor()));
945 connect(mathsModule->esintautoCB, SIGNAL(clicked()),
946 this, SLOT(change_adaptor()));
947 connect(mathsModule->mhchemCB, SIGNAL(clicked()),
948 this, SLOT(change_adaptor()));
949 connect(mathsModule->mhchemautoCB, SIGNAL(clicked()),
950 this, SLOT(change_adaptor()));
952 latexModule = new UiWidget<Ui::LaTeXUi>;
954 connect(latexModule->optionsLE, SIGNAL(textChanged(QString)),
955 this, SLOT(change_adaptor()));
956 connect(latexModule->defaultOptionsCB, SIGNAL(clicked()),
957 this, SLOT(change_adaptor()));
958 connect(latexModule->psdriverCO, SIGNAL(activated(int)),
959 this, SLOT(change_adaptor()));
960 connect(latexModule->classCO, SIGNAL(activated(int)),
961 this, SLOT(classChanged()));
962 connect(latexModule->classCO, SIGNAL(activated(int)),
963 this, SLOT(change_adaptor()));
964 connect(latexModule->layoutPB, SIGNAL(clicked()),
965 this, SLOT(browseLayout()));
966 connect(latexModule->layoutPB, SIGNAL(clicked()),
967 this, SLOT(change_adaptor()));
968 connect(latexModule->childDocGB, SIGNAL(clicked()),
969 this, SLOT(change_adaptor()));
970 connect(latexModule->childDocLE, SIGNAL(textChanged(QString)),
971 this, SLOT(change_adaptor()));
972 connect(latexModule->childDocPB, SIGNAL(clicked()),
973 this, SLOT(browseMaster()));
974 connect(latexModule->suppressDateCB, SIGNAL(clicked()),
975 this, SLOT(change_adaptor()));
977 // postscript drivers
978 for (int n = 0; tex_graphics[n][0]; ++n) {
979 QString enc = qt_(tex_graphics_gui[n]);
980 latexModule->psdriverCO->addItem(enc);
983 latexModule->classCO->setModel(&classes_model_);
984 LayoutFileList const & bcl = LayoutFileList::get();
985 vector<LayoutFileIndex> classList = bcl.classList();
986 sort(classList.begin(), classList.end(), less_textclass_avail_desc());
988 vector<LayoutFileIndex>::const_iterator cit = classList.begin();
989 vector<LayoutFileIndex>::const_iterator cen = classList.end();
990 for (int i = 0; cit != cen; ++cit, ++i) {
991 LayoutFile const & tc = bcl[*cit];
992 docstring item = (tc.isTeXClassAvailable()) ?
993 from_utf8(tc.description()) :
994 bformat(_("Unavailable: %1$s"), from_utf8(tc.description()));
995 classes_model_.insertRow(i, toqstr(item), *cit);
999 branchesModule = new GuiBranches;
1000 connect(branchesModule, SIGNAL(changed()),
1001 this, SLOT(change_adaptor()));
1002 connect(branchesModule, SIGNAL(renameBranches(docstring const &, docstring const &)),
1003 this, SLOT(branchesRename(docstring const &, docstring const &)));
1004 updateUnknownBranches();
1007 preambleModule = new PreambleModule;
1008 connect(preambleModule, SIGNAL(changed()),
1009 this, SLOT(change_adaptor()));
1012 bulletsModule = new BulletsModule;
1013 connect(bulletsModule, SIGNAL(changed()),
1014 this, SLOT(change_adaptor()));
1017 modulesModule = new UiWidget<Ui::ModulesUi>;
1018 modulesModule->availableLV->header()->setVisible(false);
1020 new ModuleSelectionManager(modulesModule->availableLV,
1021 modulesModule->selectedLV,
1022 modulesModule->addPB, modulesModule->deletePB,
1023 modulesModule->upPB, modulesModule->downPB,
1024 availableModel(), selectedModel(), this);
1025 connect(selectionManager, SIGNAL(updateHook()),
1026 this, SLOT(updateModuleInfo()));
1027 connect(selectionManager, SIGNAL(updateHook()),
1028 this, SLOT(change_adaptor()));
1029 connect(selectionManager, SIGNAL(selectionChanged()),
1030 this, SLOT(modulesChanged()));
1033 pdfSupportModule = new UiWidget<Ui::PDFSupportUi>;
1035 connect(pdfSupportModule->use_hyperrefGB, SIGNAL(toggled(bool)),
1036 this, SLOT(change_adaptor()));
1037 connect(pdfSupportModule->titleLE, SIGNAL(textChanged(QString)),
1038 this, SLOT(change_adaptor()));
1039 connect(pdfSupportModule->authorLE, SIGNAL(textChanged(QString)),
1040 this, SLOT(change_adaptor()));
1041 connect(pdfSupportModule->subjectLE, SIGNAL(textChanged(QString)),
1042 this, SLOT(change_adaptor()));
1043 connect(pdfSupportModule->keywordsLE, SIGNAL(textChanged(QString)),
1044 this, SLOT(change_adaptor()));
1045 connect(pdfSupportModule->bookmarksGB, SIGNAL(toggled(bool)),
1046 this, SLOT(change_adaptor()));
1047 connect(pdfSupportModule->bookmarksnumberedCB, SIGNAL(toggled(bool)),
1048 this, SLOT(change_adaptor()));
1049 connect(pdfSupportModule->bookmarksopenGB, SIGNAL(toggled(bool)),
1050 this, SLOT(change_adaptor()));
1051 connect(pdfSupportModule->bookmarksopenlevelSB, SIGNAL(valueChanged(int)),
1052 this, SLOT(change_adaptor()));
1053 connect(pdfSupportModule->breaklinksCB, SIGNAL(toggled(bool)),
1054 this, SLOT(change_adaptor()));
1055 connect(pdfSupportModule->pdfborderCB, SIGNAL(toggled(bool)),
1056 this, SLOT(change_adaptor()));
1057 connect(pdfSupportModule->colorlinksCB, SIGNAL(toggled(bool)),
1058 this, SLOT(change_adaptor()));
1059 connect(pdfSupportModule->backrefCO, SIGNAL(activated(int)),
1060 this, SLOT(change_adaptor()));
1061 connect(pdfSupportModule->pdfusetitleCB, SIGNAL(toggled(bool)),
1062 this, SLOT(change_adaptor()));
1063 connect(pdfSupportModule->fullscreenCB, SIGNAL(toggled(bool)),
1064 this, SLOT(change_adaptor()));
1065 connect(pdfSupportModule->optionsLE, SIGNAL(textChanged(QString)),
1066 this, SLOT(change_adaptor()));
1068 for (int i = 0; backref_opts[i][0]; ++i)
1069 pdfSupportModule->backrefCO->addItem(qt_(backref_opts_gui[i]));
1072 floatModule = new FloatPlacement;
1073 connect(floatModule, SIGNAL(changed()),
1074 this, SLOT(change_adaptor()));
1077 listingsModule = new UiWidget<Ui::ListingsSettingsUi>;
1078 connect(listingsModule->listingsED, SIGNAL(textChanged()),
1079 this, SLOT(change_adaptor()));
1080 connect(listingsModule->bypassCB, SIGNAL(clicked()),
1081 this, SLOT(change_adaptor()));
1082 connect(listingsModule->bypassCB, SIGNAL(clicked()),
1083 this, SLOT(setListingsMessage()));
1084 connect(listingsModule->listingsED, SIGNAL(textChanged()),
1085 this, SLOT(setListingsMessage()));
1086 listingsModule->listingsTB->setPlainText(
1087 qt_("Input listings parameters below. Enter ? for a list of parameters."));
1089 docPS->addPanel(latexModule, qt_("Document Class"));
1090 docPS->addPanel(masterChildModule, qt_("Child Documents"));
1091 docPS->addPanel(modulesModule, qt_("Modules"));
1092 docPS->addPanel(fontModule, qt_("Fonts"));
1093 docPS->addPanel(textLayoutModule, qt_("Text Layout"));
1094 docPS->addPanel(pageLayoutModule, qt_("Page Layout"));
1095 docPS->addPanel(marginsModule, qt_("Page Margins"));
1096 docPS->addPanel(langModule, qt_("Language"));
1097 docPS->addPanel(numberingModule, qt_("Numbering & TOC"));
1098 docPS->addPanel(biblioModule, qt_("Bibliography"));
1099 docPS->addPanel(indicesModule, qt_("Indexes"));
1100 docPS->addPanel(pdfSupportModule, qt_("PDF Properties"));
1101 docPS->addPanel(mathsModule, qt_("Math Options"));
1102 docPS->addPanel(floatModule, qt_("Float Placement"));
1103 docPS->addPanel(listingsModule, qt_("Listings"));
1104 docPS->addPanel(bulletsModule, qt_("Bullets"));
1105 docPS->addPanel(branchesModule, qt_("Branches"));
1106 docPS->addPanel(outputModule, qt_("Output"));
1107 docPS->addPanel(preambleModule, qt_("LaTeX Preamble"));
1108 docPS->setCurrentPanel(qt_("Document Class"));
1109 // FIXME: hack to work around resizing bug in Qt >= 4.2
1110 // bug verified with Qt 4.2.{0-3} (JSpitzm)
1111 #if QT_VERSION >= 0x040200
1112 docPS->updateGeometry();
1117 void GuiDocument::showPreamble()
1119 docPS->setCurrentPanel(qt_("LaTeX Preamble"));
1123 void GuiDocument::saveDefaultClicked()
1129 void GuiDocument::useDefaultsClicked()
1135 void GuiDocument::change_adaptor()
1141 void GuiDocument::includeonlyClicked(QTreeWidgetItem * item, int)
1146 string child = fromqstr(item->text(0));
1150 if (std::find(includeonlys_.begin(),
1151 includeonlys_.end(), child) != includeonlys_.end())
1152 includeonlys_.remove(child);
1154 includeonlys_.push_back(child);
1156 updateIncludeonlys();
1161 QString GuiDocument::validateListingsParameters()
1163 // use a cache here to avoid repeated validation
1164 // of the same parameters
1165 static string param_cache;
1166 static QString msg_cache;
1168 if (listingsModule->bypassCB->isChecked())
1171 string params = fromqstr(listingsModule->listingsED->toPlainText());
1172 if (params != param_cache) {
1173 param_cache = params;
1174 msg_cache = toqstr(InsetListingsParams(params).validate());
1180 void GuiDocument::setListingsMessage()
1182 static bool isOK = true;
1183 QString msg = validateListingsParameters();
1184 if (msg.isEmpty()) {
1188 // listingsTB->setTextColor("black");
1189 listingsModule->listingsTB->setPlainText(
1190 qt_("Input listings parameters below. "
1191 "Enter ? for a list of parameters."));
1194 // listingsTB->setTextColor("red");
1195 listingsModule->listingsTB->setPlainText(msg);
1200 void GuiDocument::setLSpacing(int item)
1202 textLayoutModule->lspacingLE->setEnabled(item == 3);
1206 void GuiDocument::setIndent(int item)
1208 bool const enable = (item == 1);
1209 textLayoutModule->indentLE->setEnabled(enable);
1210 textLayoutModule->indentLengthCO->setEnabled(enable);
1211 textLayoutModule->skipLE->setEnabled(false);
1212 textLayoutModule->skipLengthCO->setEnabled(false);
1217 void GuiDocument::enableIndent(bool indent)
1219 textLayoutModule->skipLE->setEnabled(!indent);
1220 textLayoutModule->skipLengthCO->setEnabled(!indent);
1222 setIndent(textLayoutModule->indentCO->currentIndex());
1226 void GuiDocument::setSkip(int item)
1228 bool const enable = (item == 3);
1229 textLayoutModule->skipLE->setEnabled(enable);
1230 textLayoutModule->skipLengthCO->setEnabled(enable);
1235 void GuiDocument::enableSkip(bool skip)
1237 textLayoutModule->indentLE->setEnabled(!skip);
1238 textLayoutModule->indentLengthCO->setEnabled(!skip);
1240 setSkip(textLayoutModule->skipCO->currentIndex());
1244 void GuiDocument::portraitChanged()
1246 setMargins(pageLayoutModule->papersizeCO->currentIndex());
1250 void GuiDocument::setMargins(bool custom)
1252 bool const extern_geometry =
1253 documentClass().provides("geometry");
1254 marginsModule->marginCB->setEnabled(!extern_geometry);
1255 if (extern_geometry) {
1256 marginsModule->marginCB->setChecked(false);
1257 setCustomMargins(true);
1260 marginsModule->marginCB->setChecked(custom);
1261 setCustomMargins(custom);
1265 void GuiDocument::papersizeChanged(int paper_size)
1267 setCustomPapersize(paper_size == 1);
1271 void GuiDocument::setCustomPapersize(bool custom)
1273 pageLayoutModule->paperwidthL->setEnabled(custom);
1274 pageLayoutModule->paperwidthLE->setEnabled(custom);
1275 pageLayoutModule->paperwidthUnitCO->setEnabled(custom);
1276 pageLayoutModule->paperheightL->setEnabled(custom);
1277 pageLayoutModule->paperheightLE->setEnabled(custom);
1278 pageLayoutModule->paperheightLE->setFocus();
1279 pageLayoutModule->paperheightUnitCO->setEnabled(custom);
1283 void GuiDocument::setColSep()
1285 setCustomMargins(marginsModule->marginCB->checkState() == Qt::Checked);
1289 void GuiDocument::setCustomMargins(bool custom)
1291 marginsModule->topL->setEnabled(!custom);
1292 marginsModule->topLE->setEnabled(!custom);
1293 marginsModule->topUnit->setEnabled(!custom);
1295 marginsModule->bottomL->setEnabled(!custom);
1296 marginsModule->bottomLE->setEnabled(!custom);
1297 marginsModule->bottomUnit->setEnabled(!custom);
1299 marginsModule->innerL->setEnabled(!custom);
1300 marginsModule->innerLE->setEnabled(!custom);
1301 marginsModule->innerUnit->setEnabled(!custom);
1303 marginsModule->outerL->setEnabled(!custom);
1304 marginsModule->outerLE->setEnabled(!custom);
1305 marginsModule->outerUnit->setEnabled(!custom);
1307 marginsModule->headheightL->setEnabled(!custom);
1308 marginsModule->headheightLE->setEnabled(!custom);
1309 marginsModule->headheightUnit->setEnabled(!custom);
1311 marginsModule->headsepL->setEnabled(!custom);
1312 marginsModule->headsepLE->setEnabled(!custom);
1313 marginsModule->headsepUnit->setEnabled(!custom);
1315 marginsModule->footskipL->setEnabled(!custom);
1316 marginsModule->footskipLE->setEnabled(!custom);
1317 marginsModule->footskipUnit->setEnabled(!custom);
1319 bool const enableColSep = !custom &&
1320 textLayoutModule->twoColumnCB->checkState() == Qt::Checked;
1321 marginsModule->columnsepL->setEnabled(enableColSep);
1322 marginsModule->columnsepLE->setEnabled(enableColSep);
1323 marginsModule->columnsepUnit->setEnabled(enableColSep);
1326 void GuiDocument::changeBackgroundColor()
1328 QColor const & newColor = QColorDialog::getColor(
1329 rgb2qcolor(set_backgroundcolor), asQWidget());
1330 if (!newColor.isValid())
1332 // set the button color
1333 pageLayoutModule->backgroundPB->setStyleSheet(
1334 colorButtonStyleSheet(newColor));
1336 set_backgroundcolor = rgbFromHexName(fromqstr(newColor.name()));
1341 void GuiDocument::deleteBackgroundColor()
1343 // set the button color back to white
1344 pageLayoutModule->backgroundPB->setStyleSheet(
1345 colorButtonStyleSheet(QColor(Qt::white)));
1346 // save white as the set color
1347 set_backgroundcolor = rgbFromHexName("#ffffff");
1352 void GuiDocument::xetexChanged(bool xetex)
1355 updateDefaultFormat();
1356 langModule->encodingCO->setEnabled(!xetex &&
1357 !langModule->defaultencodingRB->isChecked());
1358 langModule->defaultencodingRB->setEnabled(!xetex);
1359 langModule->otherencodingRB->setEnabled(!xetex);
1361 fontModule->fontsDefaultCO->setEnabled(!xetex);
1362 fontModule->fontsDefaultLA->setEnabled(!xetex);
1363 fontModule->cjkFontLE->setEnabled(!xetex);
1364 fontModule->cjkFontLA->setEnabled(!xetex);
1367 font = tex_fonts_sans[fontModule->fontsSansCO->currentIndex()];
1368 bool scaleable = providesScale(font);
1369 fontModule->scaleSansSB->setEnabled(scaleable);
1370 fontModule->scaleSansLA->setEnabled(scaleable);
1372 font = tex_fonts_monospaced[fontModule->fontsTypewriterCO->currentIndex()];
1373 scaleable = providesScale(font);
1374 fontModule->scaleTypewriterSB->setEnabled(scaleable);
1375 fontModule->scaleTypewriterLA->setEnabled(scaleable);
1377 font = tex_fonts_roman[fontModule->fontsRomanCO->currentIndex()];
1378 fontModule->fontScCB->setEnabled(providesSC(font));
1379 fontModule->fontOsfCB->setEnabled(providesOSF(font));
1381 fontModule->fontencLA->setEnabled(!xetex);
1382 fontModule->fontencCO->setEnabled(!xetex);
1383 fontModule->fontencLE->setEnabled(!xetex);
1387 void GuiDocument::updateFontsize(string const & items, string const & sel)
1389 fontModule->fontsizeCO->clear();
1390 fontModule->fontsizeCO->addItem(qt_("Default"));
1392 for (int n = 0; !token(items,'|',n).empty(); ++n)
1393 fontModule->fontsizeCO->
1394 addItem(toqstr(token(items,'|',n)));
1396 for (int n = 0; n < fontModule->fontsizeCO->count(); ++n) {
1397 if (fromqstr(fontModule->fontsizeCO->itemText(n)) == sel) {
1398 fontModule->fontsizeCO->setCurrentIndex(n);
1405 void GuiDocument::updateFontlist()
1407 fontModule->fontsRomanCO->clear();
1408 fontModule->fontsSansCO->clear();
1409 fontModule->fontsTypewriterCO->clear();
1411 // With XeTeX, we have access to all system fonts, but not the LaTeX fonts
1412 if (outputModule->xetexCB->isChecked()) {
1413 fontModule->fontsRomanCO->addItem(qt_("Default"));
1414 fontModule->fontsSansCO->addItem(qt_("Default"));
1415 fontModule->fontsTypewriterCO->addItem(qt_("Default"));
1417 QFontDatabase fontdb;
1418 QStringList families(fontdb.families());
1419 for (QStringList::Iterator it = families.begin(); it != families.end(); ++it) {
1420 fontModule->fontsRomanCO->addItem(*it);
1421 fontModule->fontsSansCO->addItem(*it);
1422 fontModule->fontsTypewriterCO->addItem(*it);
1427 for (int n = 0; tex_fonts_roman[n][0]; ++n) {
1428 QString font = qt_(tex_fonts_roman_gui[n]);
1429 if (!isFontAvailable(tex_fonts_roman[n]))
1430 font += qt_(" (not installed)");
1431 fontModule->fontsRomanCO->addItem(font);
1433 for (int n = 0; tex_fonts_sans[n][0]; ++n) {
1434 QString font = qt_(tex_fonts_sans_gui[n]);
1435 if (!isFontAvailable(tex_fonts_sans[n]))
1436 font += qt_(" (not installed)");
1437 fontModule->fontsSansCO->addItem(font);
1439 for (int n = 0; tex_fonts_monospaced[n][0]; ++n) {
1440 QString font = qt_(tex_fonts_monospaced_gui[n]);
1441 if (!isFontAvailable(tex_fonts_monospaced[n]))
1442 font += qt_(" (not installed)");
1443 fontModule->fontsTypewriterCO->addItem(font);
1448 void GuiDocument::fontencChanged(int item)
1450 fontModule->fontencLE->setEnabled(item == 1);
1454 void GuiDocument::romanChanged(int item)
1456 if (outputModule->xetexCB->isChecked())
1458 string const font = tex_fonts_roman[item];
1459 fontModule->fontScCB->setEnabled(providesSC(font));
1460 fontModule->fontOsfCB->setEnabled(providesOSF(font));
1464 void GuiDocument::sansChanged(int item)
1466 if (outputModule->xetexCB->isChecked())
1468 string const font = tex_fonts_sans[item];
1469 bool scaleable = providesScale(font);
1470 fontModule->scaleSansSB->setEnabled(scaleable);
1471 fontModule->scaleSansLA->setEnabled(scaleable);
1475 void GuiDocument::ttChanged(int item)
1477 if (outputModule->xetexCB->isChecked())
1479 string const font = tex_fonts_monospaced[item];
1480 bool scaleable = providesScale(font);
1481 fontModule->scaleTypewriterSB->setEnabled(scaleable);
1482 fontModule->scaleTypewriterLA->setEnabled(scaleable);
1486 void GuiDocument::updatePagestyle(string const & items, string const & sel)
1489 pageLayoutModule->pagestyleCO->clear();
1490 pageLayoutModule->pagestyleCO->addItem(qt_("Default"));
1492 for (int n = 0; !token(items, '|', n).empty(); ++n) {
1493 string style = token(items, '|', n);
1494 QString style_gui = qt_(style);
1495 pagestyles.push_back(pair<string, QString>(style, style_gui));
1496 pageLayoutModule->pagestyleCO->addItem(style_gui);
1499 if (sel == "default") {
1500 pageLayoutModule->pagestyleCO->setCurrentIndex(0);
1506 for (size_t i = 0; i < pagestyles.size(); ++i)
1507 if (pagestyles[i].first == sel)
1508 nn = pageLayoutModule->pagestyleCO->findText(pagestyles[i].second);
1511 pageLayoutModule->pagestyleCO->setCurrentIndex(nn);
1515 void GuiDocument::browseLayout()
1517 QString const label1 = qt_("Layouts|#o#O");
1518 QString const dir1 = toqstr(lyxrc.document_path);
1519 QStringList const filter(qt_("LyX Layout (*.layout)"));
1520 QString file = browseRelFile(QString(), bufferFilepath(),
1521 qt_("Local layout file"), filter, false,
1524 if (!file.endsWith(".layout"))
1527 FileName layoutFile = support::makeAbsPath(fromqstr(file),
1528 fromqstr(bufferFilepath()));
1530 int const ret = Alert::prompt(_("Local layout file"),
1531 _("The layout file you have selected is a local layout\n"
1532 "file, not one in the system or user directory. Your\n"
1533 "document may not work with this layout if you do not\n"
1534 "keep the layout file in the document directory."),
1535 1, 1, _("&Set Layout"), _("&Cancel"));
1539 // load the layout file
1540 LayoutFileList & bcl = LayoutFileList::get();
1541 string classname = layoutFile.onlyFileName();
1542 // this will update an existing layout if that layout has been loaded before.
1543 LayoutFileIndex name = bcl.addLocalLayout(
1544 classname.substr(0, classname.size() - 7),
1545 layoutFile.onlyPath().absFilename());
1548 Alert::error(_("Error"),
1549 _("Unable to read local layout file."));
1553 // do not trigger classChanged if there is no change.
1554 if (latexModule->classCO->currentText() == toqstr(name))
1558 int idx = latexModule->classCO->findText(toqstr(name));
1560 classes_model_.insertRow(0, toqstr(name), name);
1561 latexModule->classCO->setCurrentIndex(0);
1563 latexModule->classCO->setCurrentIndex(idx);
1569 void GuiDocument::browseMaster()
1571 QString const title = qt_("Select master document");
1572 QString const dir1 = toqstr(lyxrc.document_path);
1573 QString const old = latexModule->childDocLE->text();
1574 QString const docpath = toqstr(support::onlyPath(buffer().absFileName()));
1575 QStringList const filter(qt_("LyX Files (*.lyx)"));
1576 QString file = browseRelFile(old, docpath, title, filter, false,
1577 qt_("Documents|#o#O"), toqstr(lyxrc.document_path));
1579 if (!file.isEmpty())
1580 latexModule->childDocLE->setText(file);
1584 void GuiDocument::classChanged()
1586 int idx = latexModule->classCO->currentIndex();
1589 string const classname = classes_model_.getIDString(idx);
1591 // check whether the selected modules have changed.
1592 bool modules_changed = false;
1593 unsigned int const srows = selectedModel()->rowCount();
1594 if (srows != bp_.getModules().size())
1595 modules_changed = true;
1597 list<string>::const_iterator mit = bp_.getModules().begin();
1598 list<string>::const_iterator men = bp_.getModules().end();
1599 for (unsigned int i = 0; i < srows && mit != men; ++i, ++mit)
1600 if (selectedModel()->getIDString(i) != *mit) {
1601 modules_changed = true;
1606 if (modules_changed || lyxrc.auto_reset_options) {
1607 if (applyPB->isEnabled()) {
1608 int const ret = Alert::prompt(_("Unapplied changes"),
1609 _("Some changes in the dialog were not yet applied.\n"
1610 "If you do not apply now, they will be lost after this action."),
1611 1, 1, _("&Apply"), _("&Dismiss"));
1617 // We load the TextClass as soon as it is selected. This is
1618 // necessary so that other options in the dialog can be updated
1619 // according to the new class. Note, however, that, if you use
1620 // the scroll wheel when sitting on the combo box, we'll load a
1621 // lot of TextClass objects very quickly....
1622 if (!bp_.setBaseClass(classname)) {
1623 Alert::error(_("Error"), _("Unable to set document class."));
1626 if (lyxrc.auto_reset_options)
1627 bp_.useClassDefaults();
1629 // With the introduction of modules came a distinction between the base
1630 // class and the document class. The former corresponds to the main layout
1631 // file; the latter is that plus the modules (or the document-specific layout,
1632 // or whatever else there could be). Our parameters come from the document
1633 // class. So when we set the base class, we also need to recreate the document
1634 // class. Otherwise, we still have the old one.
1635 bp_.makeDocumentClass();
1640 void GuiDocument::bibtexChanged(int n)
1642 biblioModule->bibtexOptionsED->setEnabled(n != 0);
1648 // This is an insanely complicated attempt to make this sort of thing
1649 // work with RTL languages.
1650 docstring formatStrVec(vector<string> const & v, docstring const & s)
1652 //this mess formats the list as "v[0], v[1], ..., [s] v[n]"
1656 return from_utf8(v[0]);
1657 if (v.size() == 2) {
1658 docstring retval = _("%1$s and %2$s");
1659 retval = subst(retval, _("and"), s);
1660 return bformat(retval, from_utf8(v[0]), from_utf8(v[1]));
1662 // The idea here is to format all but the last two items...
1663 int const vSize = v.size();
1664 docstring t2 = _("%1$s, %2$s");
1665 docstring retval = from_utf8(v[0]);
1666 for (int i = 1; i < vSize - 2; ++i)
1667 retval = bformat(t2, retval, from_utf8(v[i]));
1668 //...and then to plug them, and the last two, into this schema
1669 docstring t = _("%1$s, %2$s, and %3$s");
1670 t = subst(t, _("and"), s);
1671 return bformat(t, retval, from_utf8(v[vSize - 2]), from_utf8(v[vSize - 1]));
1674 vector<string> idsToNames(vector<string> const & idList)
1676 vector<string> retval;
1677 vector<string>::const_iterator it = idList.begin();
1678 vector<string>::const_iterator end = idList.end();
1679 for (; it != end; ++it) {
1680 LyXModule const * const mod = theModuleList[*it];
1682 retval.push_back(*it + " (Unavailable)");
1684 retval.push_back(mod->getName());
1691 void GuiDocument::modulesToParams(BufferParams & bp)
1693 // update list of loaded modules
1694 bp.clearLayoutModules();
1695 int const srows = modules_sel_model_.rowCount();
1696 for (int i = 0; i < srows; ++i)
1697 bp.addLayoutModule(modules_sel_model_.getIDString(i));
1699 // update the list of removed modules
1700 bp.clearRemovedModules();
1701 LayoutModuleList const & reqmods = bp.baseClass()->defaultModules();
1702 list<string>::const_iterator rit = reqmods.begin();
1703 list<string>::const_iterator ren = reqmods.end();
1705 // check each of the default modules
1706 for (; rit != ren; rit++) {
1707 list<string>::const_iterator mit = bp.getModules().begin();
1708 list<string>::const_iterator men = bp.getModules().end();
1710 for (; mit != men; mit++) {
1717 // the module isn't present so must have been removed by the user
1718 bp.addRemovedModule(*rit);
1723 void GuiDocument::modulesChanged()
1725 modulesToParams(bp_);
1726 bp_.makeDocumentClass();
1731 void GuiDocument::updateModuleInfo()
1733 selectionManager->update();
1735 //Module description
1736 bool const focus_on_selected = selectionManager->selectedFocused();
1737 QAbstractItemView * lv;
1738 if (focus_on_selected)
1739 lv = modulesModule->selectedLV;
1741 lv= modulesModule->availableLV;
1742 if (lv->selectionModel()->selectedIndexes().isEmpty()) {
1743 modulesModule->infoML->document()->clear();
1746 QModelIndex const & idx = lv->selectionModel()->currentIndex();
1747 GuiIdListModel const & id_model =
1748 focus_on_selected ? modules_sel_model_ : modules_av_model_;
1749 string const modName = id_model.getIDString(idx.row());
1750 docstring desc = getModuleDescription(modName);
1752 LayoutModuleList const & provmods = bp_.baseClass()->providedModules();
1753 if (std::find(provmods.begin(), provmods.end(), modName) != provmods.end()) {
1756 desc += _("Module provided by document class.");
1759 vector<string> pkglist = getPackageList(modName);
1760 docstring pkgdesc = formatStrVec(pkglist, _("and"));
1761 if (!pkgdesc.empty()) {
1764 desc += bformat(_("Package(s) required: %1$s."), pkgdesc);
1767 pkglist = getRequiredList(modName);
1768 if (!pkglist.empty()) {
1769 vector<string> const reqdescs = idsToNames(pkglist);
1770 pkgdesc = formatStrVec(reqdescs, _("or"));
1773 desc += bformat(_("Module required: %1$s."), pkgdesc);
1776 pkglist = getExcludedList(modName);
1777 if (!pkglist.empty()) {
1778 vector<string> const reqdescs = idsToNames(pkglist);
1779 pkgdesc = formatStrVec(reqdescs, _( "and"));
1782 desc += bformat(_("Modules excluded: %1$s."), pkgdesc);
1785 if (!isModuleAvailable(modName)) {
1788 desc += _("WARNING: Some required packages are unavailable!");
1791 modulesModule->infoML->document()->setPlainText(toqstr(desc));
1795 void GuiDocument::updateNumbering()
1797 DocumentClass const & tclass = documentClass();
1799 numberingModule->tocTW->setUpdatesEnabled(false);
1800 numberingModule->tocTW->clear();
1802 int const depth = numberingModule->depthSL->value();
1803 int const toc = numberingModule->tocSL->value();
1804 QString const no = qt_("No");
1805 QString const yes = qt_("Yes");
1806 QTreeWidgetItem * item = 0;
1808 DocumentClass::const_iterator lit = tclass.begin();
1809 DocumentClass::const_iterator len = tclass.end();
1810 for (; lit != len; ++lit) {
1811 int const toclevel = lit->toclevel;
1812 if (toclevel != Layout::NOT_IN_TOC && lit->labeltype == LABEL_COUNTER) {
1813 item = new QTreeWidgetItem(numberingModule->tocTW);
1814 item->setText(0, toqstr(translateIfPossible(lit->name())));
1815 item->setText(1, (toclevel <= depth) ? yes : no);
1816 item->setText(2, (toclevel <= toc) ? yes : no);
1820 numberingModule->tocTW->setUpdatesEnabled(true);
1821 numberingModule->tocTW->update();
1825 void GuiDocument::updateDefaultFormat()
1829 // make a copy in order to consider unapplied changes
1830 Buffer * tmpbuf = buffer().clone();
1831 tmpbuf->params().useXetex = outputModule->xetexCB->isChecked();
1832 int idx = latexModule->classCO->currentIndex();
1834 string const classname = classes_model_.getIDString(idx);
1835 tmpbuf->params().setBaseClass(classname);
1836 tmpbuf->params().makeDocumentClass();
1838 outputModule->defaultFormatCO->blockSignals(true);
1839 outputModule->defaultFormatCO->clear();
1840 outputModule->defaultFormatCO->addItem(qt_("Default"),
1841 QVariant(QString("default")));
1842 typedef vector<Format const *> Formats;
1843 Formats formats = tmpbuf->exportableFormats(true);
1844 Formats::const_iterator cit = formats.begin();
1845 Formats::const_iterator end = formats.end();
1846 for (; cit != end; ++cit)
1847 outputModule->defaultFormatCO->addItem(qt_((*cit)->prettyname()),
1848 QVariant(toqstr((*cit)->name())));
1849 outputModule->defaultFormatCO->blockSignals(false);
1855 bool GuiDocument::isChildIncluded(string const & child)
1857 if (includeonlys_.empty())
1859 return (std::find(includeonlys_.begin(),
1860 includeonlys_.end(), child) != includeonlys_.end());
1864 void GuiDocument::applyView()
1867 preambleModule->apply(bp_);
1870 bp_.suppress_date = latexModule->suppressDateCB->isChecked();
1873 bp_.setCiteEngine(ENGINE_BASIC);
1875 if (biblioModule->citeNatbibRB->isChecked()) {
1876 bool const use_numerical_citations =
1877 biblioModule->citeStyleCO->currentIndex();
1878 if (use_numerical_citations)
1879 bp_.setCiteEngine(ENGINE_NATBIB_NUMERICAL);
1881 bp_.setCiteEngine(ENGINE_NATBIB_AUTHORYEAR);
1883 } else if (biblioModule->citeJurabibRB->isChecked())
1884 bp_.setCiteEngine(ENGINE_JURABIB);
1887 biblioModule->bibtopicCB->isChecked();
1889 string const bibtex_command =
1890 fromqstr(biblioModule->bibtexCO->itemData(
1891 biblioModule->bibtexCO->currentIndex()).toString());
1892 string const bibtex_options =
1893 fromqstr(biblioModule->bibtexOptionsED->text());
1894 if (bibtex_command == "default" || bibtex_options.empty())
1895 bp_.bibtex_command = bibtex_command;
1897 bp_.bibtex_command = bibtex_command + " " + bibtex_options;
1900 indicesModule->apply(bp_);
1902 // language & quotes
1903 if (langModule->defaultencodingRB->isChecked()) {
1904 bp_.inputenc = "auto";
1906 int i = langModule->encodingCO->currentIndex();
1908 bp_.inputenc = "default";
1910 QString const enc_gui =
1911 langModule->encodingCO->currentText();
1912 Encodings::const_iterator it = encodings.begin();
1913 Encodings::const_iterator const end = encodings.end();
1915 for (; it != end; ++it) {
1916 if (qt_(it->guiName()) == enc_gui) {
1917 bp_.inputenc = it->latexName();
1923 // should not happen
1924 lyxerr << "GuiDocument::apply: Unknown encoding! Resetting to default" << endl;
1925 bp_.inputenc = "default";
1930 InsetQuotes::QuoteLanguage lga = InsetQuotes::EnglishQuotes;
1931 switch (langModule->quoteStyleCO->currentIndex()) {
1933 lga = InsetQuotes::EnglishQuotes;
1936 lga = InsetQuotes::SwedishQuotes;
1939 lga = InsetQuotes::GermanQuotes;
1942 lga = InsetQuotes::PolishQuotes;
1945 lga = InsetQuotes::FrenchQuotes;
1948 lga = InsetQuotes::DanishQuotes;
1951 bp_.quotes_language = lga;
1953 QString const lang = langModule->languageCO->itemData(
1954 langModule->languageCO->currentIndex()).toString();
1955 bp_.language = lyx::languages.getLanguage(fromqstr(lang));
1958 if (bp_.documentClass().hasTocLevels()) {
1959 bp_.tocdepth = numberingModule->tocSL->value();
1960 bp_.secnumdepth = numberingModule->depthSL->value();
1964 bp_.user_defined_bullet(0) = bulletsModule->bullet(0);
1965 bp_.user_defined_bullet(1) = bulletsModule->bullet(1);
1966 bp_.user_defined_bullet(2) = bulletsModule->bullet(2);
1967 bp_.user_defined_bullet(3) = bulletsModule->bullet(3);
1970 bp_.graphicsDriver =
1971 tex_graphics[latexModule->psdriverCO->currentIndex()];
1974 int idx = latexModule->classCO->currentIndex();
1976 string const classname = classes_model_.getIDString(idx);
1977 bp_.setBaseClass(classname);
1981 modulesToParams(bp_);
1984 if (mathsModule->amsautoCB->isChecked()) {
1985 bp_.use_amsmath = BufferParams::package_auto;
1987 if (mathsModule->amsCB->isChecked())
1988 bp_.use_amsmath = BufferParams::package_on;
1990 bp_.use_amsmath = BufferParams::package_off;
1992 if (mathsModule->esintautoCB->isChecked())
1993 bp_.use_esint = BufferParams::package_auto;
1995 if (mathsModule->esintCB->isChecked())
1996 bp_.use_esint = BufferParams::package_on;
1998 bp_.use_esint = BufferParams::package_off;
2000 if (mathsModule->mhchemautoCB->isChecked())
2001 bp_.use_mhchem = BufferParams::package_auto;
2003 if (mathsModule->mhchemCB->isChecked())
2004 bp_.use_mhchem = BufferParams::package_on;
2006 bp_.use_mhchem = BufferParams::package_off;
2010 if (pageLayoutModule->pagestyleCO->currentIndex() == 0)
2011 bp_.pagestyle = "default";
2013 QString style_gui = pageLayoutModule->pagestyleCO->currentText();
2014 for (size_t i = 0; i != pagestyles.size(); ++i)
2015 if (pagestyles[i].second == style_gui)
2016 bp_.pagestyle = pagestyles[i].first;
2020 switch (textLayoutModule->lspacingCO->currentIndex()) {
2022 bp_.spacing().set(Spacing::Single);
2025 bp_.spacing().set(Spacing::Onehalf);
2028 bp_.spacing().set(Spacing::Double);
2031 bp_.spacing().set(Spacing::Other,
2032 widgetToDoubleStr(textLayoutModule->lspacingLE));
2036 if (textLayoutModule->twoColumnCB->isChecked())
2041 if (textLayoutModule->indentRB->isChecked()) {
2042 // if paragraphs are separated by an indentation
2043 bp_.paragraph_separation = BufferParams::ParagraphIndentSeparation;
2044 switch (textLayoutModule->indentCO->currentIndex()) {
2046 bp_.setIndentation(HSpace(HSpace::DEFAULT));
2049 HSpace indent = HSpace(
2050 widgetsToLength(textLayoutModule->indentLE,
2051 textLayoutModule->indentLengthCO)
2053 bp_.setIndentation(indent);
2057 // this should never happen
2058 bp_.setIndentation(HSpace(HSpace::DEFAULT));
2062 // if paragraphs are separated by a skip
2063 bp_.paragraph_separation = BufferParams::ParagraphSkipSeparation;
2064 switch (textLayoutModule->skipCO->currentIndex()) {
2066 bp_.setDefSkip(VSpace(VSpace::SMALLSKIP));
2069 bp_.setDefSkip(VSpace(VSpace::MEDSKIP));
2072 bp_.setDefSkip(VSpace(VSpace::BIGSKIP));
2077 widgetsToLength(textLayoutModule->skipLE,
2078 textLayoutModule->skipLengthCO)
2084 // this should never happen
2085 bp_.setDefSkip(VSpace(VSpace::MEDSKIP));
2091 fromqstr(latexModule->optionsLE->text());
2093 bp_.use_default_options =
2094 latexModule->defaultOptionsCB->isChecked();
2096 if (latexModule->childDocGB->isChecked())
2098 fromqstr(latexModule->childDocLE->text());
2100 bp_.master = string();
2103 bp_.clearIncludedChildren();
2104 if (masterChildModule->includeonlyRB->isChecked()) {
2105 list<string>::const_iterator it = includeonlys_.begin();
2106 for (; it != includeonlys_.end() ; ++it) {
2107 bp_.addIncludedChildren(*it);
2110 bp_.maintain_unincluded_children =
2111 masterChildModule->maintainAuxCB->isChecked();
2114 bp_.float_placement = floatModule->get();
2117 // text should have passed validation
2118 bp_.listings_params =
2119 InsetListingsParams(fromqstr(listingsModule->listingsED->toPlainText())).params();
2122 bp_.defaultOutputFormat = fromqstr(outputModule->defaultFormatCO->itemData(
2123 outputModule->defaultFormatCO->currentIndex()).toString());
2125 bool const xetex = outputModule->xetexCB->isChecked();
2126 bp_.useXetex = xetex;
2130 if (fontModule->fontsRomanCO->currentIndex() == 0)
2131 bp_.fontsRoman = "default";
2134 fromqstr(fontModule->fontsRomanCO->currentText());
2136 if (fontModule->fontsSansCO->currentIndex() == 0)
2137 bp_.fontsSans = "default";
2140 fromqstr(fontModule->fontsSansCO->currentText());
2142 if (fontModule->fontsTypewriterCO->currentIndex() == 0)
2143 bp_.fontsTypewriter = "default";
2145 bp_.fontsTypewriter =
2146 fromqstr(fontModule->fontsTypewriterCO->currentText());
2149 tex_fonts_roman[fontModule->fontsRomanCO->currentIndex()];
2152 tex_fonts_sans[fontModule->fontsSansCO->currentIndex()];
2154 bp_.fontsTypewriter =
2155 tex_fonts_monospaced[fontModule->fontsTypewriterCO->currentIndex()];
2158 if (fontModule->fontencCO->currentIndex() == 0)
2159 bp_.fontenc = "global";
2160 else if (fontModule->fontencCO->currentIndex() == 1)
2161 bp_.fontenc = fromqstr(fontModule->fontencLE->text());
2162 else if (fontModule->fontencCO->currentIndex() == 2)
2163 bp_.fontenc = "default";
2166 fromqstr(fontModule->cjkFontLE->text());
2168 bp_.fontsSansScale = fontModule->scaleSansSB->value();
2170 bp_.fontsTypewriterScale = fontModule->scaleTypewriterSB->value();
2172 bp_.fontsSC = fontModule->fontScCB->isChecked();
2174 bp_.fontsOSF = fontModule->fontOsfCB->isChecked();
2177 bp_.fontsDefaultFamily = "default";
2179 bp_.fontsDefaultFamily = GuiDocument::fontfamilies[
2180 fontModule->fontsDefaultCO->currentIndex()];
2182 if (fontModule->fontsizeCO->currentIndex() == 0)
2183 bp_.fontsize = "default";
2186 fromqstr(fontModule->fontsizeCO->currentText());
2189 bp_.papersize = PAPER_SIZE(
2190 pageLayoutModule->papersizeCO->currentIndex());
2192 // custom, A3, B3 and B4 paper sizes need geometry
2193 int psize = pageLayoutModule->papersizeCO->currentIndex();
2194 bool geom_papersize = (psize == 1 || psize == 5 || psize == 8 || psize == 9);
2196 bp_.paperwidth = widgetsToLength(pageLayoutModule->paperwidthLE,
2197 pageLayoutModule->paperwidthUnitCO);
2199 bp_.paperheight = widgetsToLength(pageLayoutModule->paperheightLE,
2200 pageLayoutModule->paperheightUnitCO);
2202 if (pageLayoutModule->facingPagesCB->isChecked())
2203 bp_.sides = TwoSides;
2205 bp_.sides = OneSide;
2207 if (pageLayoutModule->landscapeRB->isChecked())
2208 bp_.orientation = ORIENTATION_LANDSCAPE;
2210 bp_.orientation = ORIENTATION_PORTRAIT;
2212 bp_.backgroundcolor = set_backgroundcolor;
2215 bp_.use_geometry = !marginsModule->marginCB->isChecked()
2218 Ui::MarginsUi const * m = marginsModule;
2220 bp_.leftmargin = widgetsToLength(m->innerLE, m->innerUnit);
2221 bp_.topmargin = widgetsToLength(m->topLE, m->topUnit);
2222 bp_.rightmargin = widgetsToLength(m->outerLE, m->outerUnit);
2223 bp_.bottommargin = widgetsToLength(m->bottomLE, m->bottomUnit);
2224 bp_.headheight = widgetsToLength(m->headheightLE, m->headheightUnit);
2225 bp_.headsep = widgetsToLength(m->headsepLE, m->headsepUnit);
2226 bp_.footskip = widgetsToLength(m->footskipLE, m->footskipUnit);
2227 bp_.columnsep = widgetsToLength(m->columnsepLE, m->columnsepUnit);
2230 branchesModule->apply(bp_);
2233 PDFOptions & pdf = bp_.pdfoptions();
2234 pdf.use_hyperref = pdfSupportModule->use_hyperrefGB->isChecked();
2235 pdf.title = fromqstr(pdfSupportModule->titleLE->text());
2236 pdf.author = fromqstr(pdfSupportModule->authorLE->text());
2237 pdf.subject = fromqstr(pdfSupportModule->subjectLE->text());
2238 pdf.keywords = fromqstr(pdfSupportModule->keywordsLE->text());
2240 pdf.bookmarks = pdfSupportModule->bookmarksGB->isChecked();
2241 pdf.bookmarksnumbered = pdfSupportModule->bookmarksnumberedCB->isChecked();
2242 pdf.bookmarksopen = pdfSupportModule->bookmarksopenGB->isChecked();
2243 pdf.bookmarksopenlevel = pdfSupportModule->bookmarksopenlevelSB->value();
2245 pdf.breaklinks = pdfSupportModule->breaklinksCB->isChecked();
2246 pdf.pdfborder = pdfSupportModule->pdfborderCB->isChecked();
2247 pdf.pdfusetitle = pdfSupportModule->pdfusetitleCB->isChecked();
2248 pdf.colorlinks = pdfSupportModule->colorlinksCB->isChecked();
2250 backref_opts[pdfSupportModule->backrefCO->currentIndex()];
2251 if (pdfSupportModule->fullscreenCB->isChecked())
2252 pdf.pagemode = pdf.pagemode_fullscreen;
2254 pdf.pagemode.clear();
2255 pdf.quoted_options = pdf.quoted_options_check(
2256 fromqstr(pdfSupportModule->optionsLE->text()));
2260 void GuiDocument::paramsToDialog()
2262 // set the default unit
2263 Length::UNIT const defaultUnit = Length::defaultUnit();
2266 preambleModule->update(bp_, id());
2269 latexModule->suppressDateCB->setChecked(bp_.suppress_date);
2272 biblioModule->citeDefaultRB->setChecked(
2273 bp_.citeEngine() == ENGINE_BASIC);
2275 biblioModule->citeNatbibRB->setChecked(
2276 bp_.citeEngine() == ENGINE_NATBIB_NUMERICAL ||
2277 bp_.citeEngine() == ENGINE_NATBIB_AUTHORYEAR);
2279 biblioModule->citeStyleCO->setCurrentIndex(
2280 bp_.citeEngine() == ENGINE_NATBIB_NUMERICAL);
2282 biblioModule->citeJurabibRB->setChecked(
2283 bp_.citeEngine() == ENGINE_JURABIB);
2285 biblioModule->bibtopicCB->setChecked(
2290 split(bp_.bibtex_command, command, ' ');
2292 int const bpos = biblioModule->bibtexCO->findData(toqstr(command));
2294 biblioModule->bibtexCO->setCurrentIndex(bpos);
2295 biblioModule->bibtexOptionsED->setText(toqstr(options).trimmed());
2297 biblioModule->bibtexCO->setCurrentIndex(0);
2298 biblioModule->bibtexOptionsED->clear();
2300 biblioModule->bibtexOptionsED->setEnabled(
2301 biblioModule->bibtexCO->currentIndex() != 0);
2304 indicesModule->update(bp_);
2306 // language & quotes
2307 int const pos = langModule->languageCO->findData(toqstr(
2308 bp_.language->lang()));
2309 langModule->languageCO->setCurrentIndex(pos);
2311 langModule->quoteStyleCO->setCurrentIndex(
2312 bp_.quotes_language);
2314 bool default_enc = true;
2315 if (bp_.inputenc != "auto") {
2316 default_enc = false;
2317 if (bp_.inputenc == "default") {
2318 langModule->encodingCO->setCurrentIndex(0);
2321 Encodings::const_iterator it = encodings.begin();
2322 Encodings::const_iterator const end = encodings.end();
2323 for (; it != end; ++it) {
2324 if (it->latexName() == bp_.inputenc) {
2325 enc_gui = it->guiName();
2329 int const i = langModule->encodingCO->findText(
2332 langModule->encodingCO->setCurrentIndex(i);
2334 // unknown encoding. Set to default.
2338 langModule->defaultencodingRB->setChecked(default_enc);
2339 langModule->otherencodingRB->setChecked(!default_enc);
2342 int const min_toclevel = documentClass().min_toclevel();
2343 int const max_toclevel = documentClass().max_toclevel();
2344 if (documentClass().hasTocLevels()) {
2345 numberingModule->setEnabled(true);
2346 numberingModule->depthSL->setMinimum(min_toclevel - 1);
2347 numberingModule->depthSL->setMaximum(max_toclevel);
2348 numberingModule->depthSL->setValue(bp_.secnumdepth);
2349 numberingModule->tocSL->setMaximum(min_toclevel - 1);
2350 numberingModule->tocSL->setMaximum(max_toclevel);
2351 numberingModule->tocSL->setValue(bp_.tocdepth);
2354 numberingModule->setEnabled(false);
2355 numberingModule->tocTW->clear();
2359 bulletsModule->setBullet(0, bp_.user_defined_bullet(0));
2360 bulletsModule->setBullet(1, bp_.user_defined_bullet(1));
2361 bulletsModule->setBullet(2, bp_.user_defined_bullet(2));
2362 bulletsModule->setBullet(3, bp_.user_defined_bullet(3));
2363 bulletsModule->init();
2366 int nitem = findToken(tex_graphics, bp_.graphicsDriver);
2368 latexModule->psdriverCO->setCurrentIndex(nitem);
2371 mathsModule->amsCB->setChecked(
2372 bp_.use_amsmath == BufferParams::package_on);
2373 mathsModule->amsautoCB->setChecked(
2374 bp_.use_amsmath == BufferParams::package_auto);
2376 mathsModule->esintCB->setChecked(
2377 bp_.use_esint == BufferParams::package_on);
2378 mathsModule->esintautoCB->setChecked(
2379 bp_.use_esint == BufferParams::package_auto);
2381 mathsModule->mhchemCB->setChecked(
2382 bp_.use_mhchem == BufferParams::package_on);
2383 mathsModule->mhchemautoCB->setChecked(
2384 bp_.use_mhchem == BufferParams::package_auto);
2386 switch (bp_.spacing().getSpace()) {
2387 case Spacing::Other: nitem = 3; break;
2388 case Spacing::Double: nitem = 2; break;
2389 case Spacing::Onehalf: nitem = 1; break;
2390 case Spacing::Default: case Spacing::Single: nitem = 0; break;
2394 string const & layoutID = bp_.baseClassID();
2395 setLayoutComboByIDString(layoutID);
2397 updatePagestyle(documentClass().opt_pagestyle(),
2400 textLayoutModule->lspacingCO->setCurrentIndex(nitem);
2401 if (bp_.spacing().getSpace() == Spacing::Other) {
2402 doubleToWidget(textLayoutModule->lspacingLE,
2403 bp_.spacing().getValueAsString());
2407 if (bp_.paragraph_separation == BufferParams::ParagraphIndentSeparation) {
2408 textLayoutModule->indentRB->setChecked(true);
2409 string indentation = bp_.getIndentation().asLyXCommand();
2411 if (indentation != "default") {
2412 lengthToWidgets(textLayoutModule->indentLE,
2413 textLayoutModule->indentLengthCO,
2414 indentation, defaultUnit);
2417 textLayoutModule->indentCO->setCurrentIndex(indent);
2420 textLayoutModule->skipRB->setChecked(true);
2422 switch (bp_.getDefSkip().kind()) {
2423 case VSpace::SMALLSKIP:
2426 case VSpace::MEDSKIP:
2429 case VSpace::BIGSKIP:
2432 case VSpace::LENGTH:
2435 string const length = bp_.getDefSkip().asLyXCommand();
2436 lengthToWidgets(textLayoutModule->skipLE,
2437 textLayoutModule->skipLengthCO,
2438 length, defaultUnit);
2445 textLayoutModule->skipCO->setCurrentIndex(skip);
2449 textLayoutModule->twoColumnCB->setChecked(
2452 if (!bp_.options.empty()) {
2453 latexModule->optionsLE->setText(
2454 toqstr(bp_.options));
2456 latexModule->optionsLE->setText(QString());
2460 latexModule->defaultOptionsCB->setChecked(
2461 bp_.use_default_options);
2462 updateSelectedModules();
2463 selectionManager->updateProvidedModules(
2464 bp_.baseClass()->providedModules());
2465 selectionManager->updateExcludedModules(
2466 bp_.baseClass()->excludedModules());
2468 if (!documentClass().options().empty()) {
2469 latexModule->defaultOptionsLE->setText(
2470 toqstr(documentClass().options()));
2472 latexModule->defaultOptionsLE->setText(
2473 toqstr(_("[No options predefined]")));
2476 latexModule->defaultOptionsLE->setEnabled(
2477 bp_.use_default_options
2478 && !documentClass().options().empty());
2480 latexModule->defaultOptionsCB->setEnabled(
2481 !documentClass().options().empty());
2483 if (!bp_.master.empty()) {
2484 latexModule->childDocGB->setChecked(true);
2485 latexModule->childDocLE->setText(
2486 toqstr(bp_.master));
2488 latexModule->childDocLE->setText(QString());
2489 latexModule->childDocGB->setChecked(false);
2493 std::vector<Buffer *> children;
2495 children = buffer().getChildren(false);
2496 if (children.empty()) {
2497 masterChildModule->childrenTW->clear();
2498 includeonlys_.clear();
2499 docPS->showPanel(qt_("Child Documents"), false);
2500 if (docPS->isCurrentPanel(qt_("Child Documents")))
2501 docPS->setCurrentPanel(qt_("Document Class"));
2503 docPS->showPanel(qt_("Child Documents"), true);
2504 masterChildModule->setEnabled(true);
2505 includeonlys_ = bp_.getIncludedChildren();
2506 updateIncludeonlys();
2508 masterChildModule->maintainAuxCB->setChecked(
2509 bp_.maintain_unincluded_children);
2512 floatModule->set(bp_.float_placement);
2515 // break listings_params to multiple lines
2517 InsetListingsParams(bp_.listings_params).separatedParams();
2518 listingsModule->listingsED->setPlainText(toqstr(lstparams));
2521 // update combobox with formats
2522 updateDefaultFormat();
2523 int index = outputModule->defaultFormatCO->findData(toqstr(
2524 bp_.defaultOutputFormat));
2525 // set to default if format is not found
2528 outputModule->defaultFormatCO->setCurrentIndex(index);
2529 outputModule->xetexCB->setEnabled(bp_.baseClass()->outputType() == lyx::LATEX);
2530 outputModule->xetexCB->setChecked(
2531 bp_.baseClass()->outputType() == lyx::LATEX && bp_.useXetex);
2534 updateFontsize(documentClass().opt_fontsize(),
2538 fontModule->fontencLA->setEnabled(false);
2539 fontModule->fontencCO->setEnabled(false);
2540 fontModule->fontencLE->setEnabled(false);
2541 for (int i = 0; i < fontModule->fontsRomanCO->count(); ++i) {
2542 if (fontModule->fontsRomanCO->itemText(i) == toqstr(bp_.fontsRoman)) {
2543 fontModule->fontsRomanCO->setCurrentIndex(i);
2548 for (int i = 0; i < fontModule->fontsSansCO->count(); ++i) {
2549 if (fontModule->fontsSansCO->itemText(i) == toqstr(bp_.fontsSans)) {
2550 fontModule->fontsSansCO->setCurrentIndex(i);
2554 for (int i = 0; i < fontModule->fontsTypewriterCO->count(); ++i) {
2555 if (fontModule->fontsTypewriterCO->itemText(i) ==
2556 toqstr(bp_.fontsTypewriter)) {
2557 fontModule->fontsTypewriterCO->setCurrentIndex(i);
2562 fontModule->fontencLA->setEnabled(true);
2563 fontModule->fontencCO->setEnabled(true);
2564 fontModule->fontencLE->setEnabled(true);
2565 int n = findToken(tex_fonts_roman, bp_.fontsRoman);
2567 fontModule->fontsRomanCO->setCurrentIndex(n);
2571 n = findToken(tex_fonts_sans, bp_.fontsSans);
2573 fontModule->fontsSansCO->setCurrentIndex(n);
2577 n = findToken(tex_fonts_monospaced, bp_.fontsTypewriter);
2579 fontModule->fontsTypewriterCO->setCurrentIndex(n);
2584 if (!bp_.fontsCJK.empty())
2585 fontModule->cjkFontLE->setText(
2586 toqstr(bp_.fontsCJK));
2588 fontModule->cjkFontLE->setText(QString());
2590 fontModule->fontScCB->setChecked(bp_.fontsSC);
2591 fontModule->fontOsfCB->setChecked(bp_.fontsOSF);
2592 fontModule->scaleSansSB->setValue(bp_.fontsSansScale);
2593 fontModule->scaleTypewriterSB->setValue(bp_.fontsTypewriterScale);
2595 int nn = findToken(GuiDocument::fontfamilies, bp_.fontsDefaultFamily);
2597 fontModule->fontsDefaultCO->setCurrentIndex(nn);
2599 if (bp_.fontenc == "global")
2600 fontModule->fontencCO->setCurrentIndex(0);
2601 else if (bp_.fontenc == "default")
2602 fontModule->fontencCO->setCurrentIndex(2);
2604 fontModule->fontencCO->setCurrentIndex(1);
2605 fontModule->fontencLE->setText(toqstr(bp_.fontenc));
2609 bool const extern_geometry =
2610 documentClass().provides("geometry");
2611 int const psize = bp_.papersize;
2612 pageLayoutModule->papersizeCO->setCurrentIndex(psize);
2613 setCustomPapersize(!extern_geometry && psize == 1);
2614 pageLayoutModule->papersizeCO->setEnabled(!extern_geometry);
2616 bool const landscape =
2617 bp_.orientation == ORIENTATION_LANDSCAPE;
2618 pageLayoutModule->landscapeRB->setChecked(landscape);
2619 pageLayoutModule->portraitRB->setChecked(!landscape);
2620 pageLayoutModule->landscapeRB->setEnabled(!extern_geometry);
2621 pageLayoutModule->portraitRB->setEnabled(!extern_geometry);
2623 pageLayoutModule->facingPagesCB->setChecked(
2624 bp_.sides == TwoSides);
2626 pageLayoutModule->backgroundPB->setStyleSheet(
2627 colorButtonStyleSheet(rgb2qcolor(bp_.backgroundcolor)));
2628 set_backgroundcolor = bp_.backgroundcolor;
2630 lengthToWidgets(pageLayoutModule->paperwidthLE,
2631 pageLayoutModule->paperwidthUnitCO, bp_.paperwidth, defaultUnit);
2632 lengthToWidgets(pageLayoutModule->paperheightLE,
2633 pageLayoutModule->paperheightUnitCO, bp_.paperheight, defaultUnit);
2636 Ui::MarginsUi * m = marginsModule;
2638 setMargins(!bp_.use_geometry);
2640 lengthToWidgets(m->topLE, m->topUnit,
2641 bp_.topmargin, defaultUnit);
2643 lengthToWidgets(m->bottomLE, m->bottomUnit,
2644 bp_.bottommargin, defaultUnit);
2646 lengthToWidgets(m->innerLE, m->innerUnit,
2647 bp_.leftmargin, defaultUnit);
2649 lengthToWidgets(m->outerLE, m->outerUnit,
2650 bp_.rightmargin, defaultUnit);
2652 lengthToWidgets(m->headheightLE, m->headheightUnit,
2653 bp_.headheight, defaultUnit);
2655 lengthToWidgets(m->headsepLE, m->headsepUnit,
2656 bp_.headsep, defaultUnit);
2658 lengthToWidgets(m->footskipLE, m->footskipUnit,
2659 bp_.footskip, defaultUnit);
2661 lengthToWidgets(m->columnsepLE, m->columnsepUnit,
2662 bp_.columnsep, defaultUnit);
2665 updateUnknownBranches();
2666 branchesModule->update(bp_);
2669 PDFOptions const & pdf = bp_.pdfoptions();
2670 pdfSupportModule->use_hyperrefGB->setChecked(pdf.use_hyperref);
2671 pdfSupportModule->titleLE->setText(toqstr(pdf.title));
2672 pdfSupportModule->authorLE->setText(toqstr(pdf.author));
2673 pdfSupportModule->subjectLE->setText(toqstr(pdf.subject));
2674 pdfSupportModule->keywordsLE->setText(toqstr(pdf.keywords));
2676 pdfSupportModule->bookmarksGB->setChecked(pdf.bookmarks);
2677 pdfSupportModule->bookmarksnumberedCB->setChecked(pdf.bookmarksnumbered);
2678 pdfSupportModule->bookmarksopenGB->setChecked(pdf.bookmarksopen);
2680 pdfSupportModule->bookmarksopenlevelSB->setValue(pdf.bookmarksopenlevel);
2682 pdfSupportModule->breaklinksCB->setChecked(pdf.breaklinks);
2683 pdfSupportModule->pdfborderCB->setChecked(pdf.pdfborder);
2684 pdfSupportModule->pdfusetitleCB->setChecked(pdf.pdfusetitle);
2685 pdfSupportModule->colorlinksCB->setChecked(pdf.colorlinks);
2687 nn = findToken(backref_opts, pdf.backref);
2689 pdfSupportModule->backrefCO->setCurrentIndex(nn);
2691 pdfSupportModule->fullscreenCB->setChecked
2692 (pdf.pagemode == pdf.pagemode_fullscreen);
2694 pdfSupportModule->optionsLE->setText(
2695 toqstr(pdf.quoted_options));
2697 // Make sure that the bc is in the INITIAL state
2698 if (bc().policy().buttonStatus(ButtonPolicy::RESTORE))
2701 // clear changed branches cache
2702 changedBranches_.clear();
2706 void GuiDocument::saveDocDefault()
2708 // we have to apply the params first
2714 void GuiDocument::updateAvailableModules()
2716 modules_av_model_.clear();
2717 list<modInfoStruct> const & modInfoList = getModuleInfo();
2718 list<modInfoStruct>::const_iterator mit = modInfoList.begin();
2719 list<modInfoStruct>::const_iterator men = modInfoList.end();
2720 for (int i = 0; mit != men; ++mit, ++i)
2721 modules_av_model_.insertRow(i, mit->name, mit->id,
2726 void GuiDocument::updateSelectedModules()
2728 modules_sel_model_.clear();
2729 list<modInfoStruct> const selModList = getSelectedModules();
2730 list<modInfoStruct>::const_iterator mit = selModList.begin();
2731 list<modInfoStruct>::const_iterator men = selModList.end();
2732 for (int i = 0; mit != men; ++mit, ++i)
2733 modules_sel_model_.insertRow(i, mit->name, mit->id,
2738 void GuiDocument::updateIncludeonlys()
2740 masterChildModule->childrenTW->clear();
2741 QString const no = qt_("No");
2742 QString const yes = qt_("Yes");
2744 if (includeonlys_.empty()) {
2745 masterChildModule->includeallRB->setChecked(true);
2746 masterChildModule->childrenTW->setEnabled(false);
2747 masterChildModule->maintainAuxCB->setEnabled(false);
2749 masterChildModule->includeonlyRB->setChecked(true);
2750 masterChildModule->childrenTW->setEnabled(true);
2751 masterChildModule->maintainAuxCB->setEnabled(true);
2753 QTreeWidgetItem * item = 0;
2754 std::vector<Buffer *> children = buffer().getChildren(false);
2755 vector<Buffer *>::const_iterator it = children.begin();
2756 vector<Buffer *>::const_iterator end = children.end();
2757 bool has_unincluded = false;
2758 bool all_unincluded = true;
2759 for (; it != end; ++it) {
2760 item = new QTreeWidgetItem(masterChildModule->childrenTW);
2763 to_utf8(makeRelPath(from_utf8((*it)->fileName().absFilename()),
2764 from_utf8(buffer().filePath())));
2765 item->setText(0, toqstr(name));
2766 item->setText(1, isChildIncluded(name) ? yes : no);
2767 if (!isChildIncluded(name))
2768 has_unincluded = true;
2770 all_unincluded = false;
2772 // Both if all childs are included and if none is included
2773 // is equal to "include all" (i.e., ommit \includeonly).
2774 // Thus, reset the GUI.
2775 if (!has_unincluded || all_unincluded) {
2776 masterChildModule->includeallRB->setChecked(true);
2777 masterChildModule->childrenTW->setEnabled(false);
2778 includeonlys_.clear();
2780 // If all are included, we need to update again.
2781 if (!has_unincluded)
2782 updateIncludeonlys();
2786 void GuiDocument::updateContents()
2788 // Nothing to do here as the document settings is not cursor dependant.
2793 void GuiDocument::useClassDefaults()
2795 if (applyPB->isEnabled()) {
2796 int const ret = Alert::prompt(_("Unapplied changes"),
2797 _("Some changes in the dialog were not yet applied.\n"
2798 "If you do not apply now, they will be lost after this action."),
2799 1, 1, _("&Apply"), _("&Dismiss"));
2804 int idx = latexModule->classCO->currentIndex();
2805 string const classname = classes_model_.getIDString(idx);
2806 if (!bp_.setBaseClass(classname)) {
2807 Alert::error(_("Error"), _("Unable to set document class."));
2810 bp_.useClassDefaults();
2815 void GuiDocument::setLayoutComboByIDString(string const & idString)
2817 int idx = classes_model_.findIDString(idString);
2819 Alert::warning(_("Can't set layout!"),
2820 bformat(_("Unable to set layout for ID: %1$s"), from_utf8(idString)));
2822 latexModule->classCO->setCurrentIndex(idx);
2826 bool GuiDocument::isValid()
2828 return validateListingsParameters().isEmpty()
2829 && (textLayoutModule->skipCO->currentIndex() != 3
2830 || !textLayoutModule->skipLE->text().isEmpty()
2831 || textLayoutModule->indentRB->isChecked())
2832 && (textLayoutModule->indentCO->currentIndex() != 1
2833 || !textLayoutModule->indentLE->text().isEmpty()
2834 || textLayoutModule->skipRB->isChecked());
2838 char const * const GuiDocument::fontfamilies[5] = {
2839 "default", "rmdefault", "sfdefault", "ttdefault", ""
2843 char const * GuiDocument::fontfamilies_gui[5] = {
2844 N_("Default"), N_("Roman"), N_("Sans Serif"), N_("Typewriter"), ""
2848 bool GuiDocument::initialiseParams(string const &)
2850 BufferView const * view = bufferview();
2852 bp_ = BufferParams();
2856 bp_ = view->buffer().params();
2858 updateAvailableModules();
2859 //FIXME It'd be nice to make sure here that the selected
2860 //modules are consistent: That required modules are actually
2861 //selected, and that we don't have conflicts. If so, we could
2862 //at least pop up a warning.
2868 void GuiDocument::clearParams()
2870 bp_ = BufferParams();
2874 BufferId GuiDocument::id() const
2876 BufferView const * const view = bufferview();
2877 return view? &view->buffer() : 0;
2881 list<GuiDocument::modInfoStruct> const & GuiDocument::getModuleInfo()
2883 return moduleNames_;
2887 list<GuiDocument::modInfoStruct> const
2888 GuiDocument::makeModuleInfo(LayoutModuleList const & mods)
2890 LayoutModuleList::const_iterator it = mods.begin();
2891 LayoutModuleList::const_iterator end = mods.end();
2892 list<modInfoStruct> mInfo;
2893 for (; it != end; ++it) {
2896 LyXModule const * const mod = theModuleList[*it];
2899 m.name = toqstr(translateIfPossible(from_utf8(mod->getName())));
2901 m.name = toqstr(*it) + toqstr(" (") + qt_("Not Found") + toqstr(")");
2908 list<GuiDocument::modInfoStruct> const GuiDocument::getSelectedModules()
2910 return makeModuleInfo(params().getModules());
2914 list<GuiDocument::modInfoStruct> const GuiDocument::getProvidedModules()
2916 return makeModuleInfo(params().baseClass()->providedModules());
2920 DocumentClass const & GuiDocument::documentClass() const
2922 return bp_.documentClass();
2926 static void dispatch_bufferparams(Dialog const & dialog,
2927 BufferParams const & bp, FuncCode lfun)
2930 ss << "\\begin_header\n";
2932 ss << "\\end_header\n";
2933 dialog.dispatch(FuncRequest(lfun, ss.str()));
2937 void GuiDocument::dispatchParams()
2939 // This must come first so that a language change is correctly noticed
2942 // Apply the BufferParams. Note that this will set the base class
2943 // and then update the buffer's layout.
2944 dispatch_bufferparams(*this, params(), LFUN_BUFFER_PARAMS_APPLY);
2946 if (!params().master.empty()) {
2947 FileName const master_file = support::makeAbsPath(params().master,
2948 support::onlyPath(buffer().absFileName()));
2949 if (isLyXFilename(master_file.absFilename())) {
2950 Buffer * master = checkAndLoadLyXFile(master_file);
2952 if (master->isChild(const_cast<Buffer *>(&buffer())))
2953 const_cast<Buffer &>(buffer()).setParent(master);
2955 Alert::warning(_("Assigned master does not include this file"),
2956 bformat(_("You must include this file in the document\n"
2957 "'%1$s' in order to use the master document\n"
2958 "feature."), from_utf8(params().master)));
2960 Alert::warning(_("Could not load master"),
2961 bformat(_("The master document '%1$s'\n"
2962 "could not be loaded."),
2963 from_utf8(params().master)));
2967 // Generate the colours requested by each new branch.
2968 BranchList & branchlist = params().branchlist();
2969 if (!branchlist.empty()) {
2970 BranchList::const_iterator it = branchlist.begin();
2971 BranchList::const_iterator const end = branchlist.end();
2972 for (; it != end; ++it) {
2973 docstring const & current_branch = it->branch();
2974 Branch const * branch = branchlist.find(current_branch);
2975 string const x11hexname = X11hexname(branch->color());
2976 // display the new color
2977 docstring const str = current_branch + ' ' + from_ascii(x11hexname);
2978 dispatch(FuncRequest(LFUN_SET_COLOR, str));
2981 // Open insets of selected branches, close deselected ones
2982 dispatch(FuncRequest(LFUN_ALL_INSETS_TOGGLE,
2985 // rename branches in the document
2986 executeBranchRenaming();
2987 // and clear changed branches cache
2988 changedBranches_.clear();
2990 // Generate the colours requested by indices.
2991 IndicesList & indiceslist = params().indiceslist();
2992 if (!indiceslist.empty()) {
2993 IndicesList::const_iterator it = indiceslist.begin();
2994 IndicesList::const_iterator const end = indiceslist.end();
2995 for (; it != end; ++it) {
2996 docstring const & current_index = it->shortcut();
2997 Index const * index = indiceslist.findShortcut(current_index);
2998 string const x11hexname = X11hexname(index->color());
2999 // display the new color
3000 docstring const str = current_index + ' ' + from_ascii(x11hexname);
3001 dispatch(FuncRequest(LFUN_SET_COLOR, str));
3004 // FIXME: If we used an LFUN, we would not need those two lines:
3005 BufferView * bv = const_cast<BufferView *>(bufferview());
3006 bv->processUpdateFlags(Update::Force | Update::FitCursor);
3010 void GuiDocument::setLanguage() const
3012 Language const * const newL = bp_.language;
3013 if (buffer().params().language == newL)
3016 string const & lang_name = newL->lang();
3017 dispatch(FuncRequest(LFUN_BUFFER_LANGUAGE, lang_name));
3021 void GuiDocument::saveAsDefault() const
3023 dispatch_bufferparams(*this, params(), LFUN_BUFFER_SAVE_AS_DEFAULT);
3027 bool GuiDocument::isFontAvailable(string const & font) const
3029 if (font == "default" || font == "cmr"
3030 || font == "cmss" || font == "cmtt")
3031 // these are standard
3033 if (font == "lmodern" || font == "lmss" || font == "lmtt")
3034 return LaTeXFeatures::isAvailable("lmodern");
3035 if (font == "times" || font == "palatino"
3036 || font == "helvet" || font == "courier")
3037 return LaTeXFeatures::isAvailable("psnfss");
3038 if (font == "cmbr" || font == "cmtl")
3039 return LaTeXFeatures::isAvailable("cmbright");
3040 if (font == "utopia")
3041 return LaTeXFeatures::isAvailable("utopia")
3042 || LaTeXFeatures::isAvailable("fourier");
3043 if (font == "beraserif" || font == "berasans"
3044 || font == "beramono")
3045 return LaTeXFeatures::isAvailable("bera");
3046 return LaTeXFeatures::isAvailable(font);
3050 bool GuiDocument::providesOSF(string const & font) const
3052 if (outputModule->xetexCB->isChecked())
3053 // FIXME: we should check if the fonts really
3054 // have OSF support. But how?
3057 return isFontAvailable("eco");
3058 if (font == "palatino")
3059 return isFontAvailable("mathpazo");
3064 bool GuiDocument::providesSC(string const & font) const
3066 if (outputModule->xetexCB->isChecked())
3068 if (font == "palatino")
3069 return isFontAvailable("mathpazo");
3070 if (font == "utopia")
3071 return isFontAvailable("fourier");
3076 bool GuiDocument::providesScale(string const & font) const
3078 if (outputModule->xetexCB->isChecked())
3080 return font == "helvet" || font == "luximono"
3081 || font == "berasans" || font == "beramono";
3085 void GuiDocument::loadModuleInfo()
3087 moduleNames_.clear();
3088 LyXModuleList::const_iterator it = theModuleList.begin();
3089 LyXModuleList::const_iterator end = theModuleList.end();
3090 for (; it != end; ++it) {
3094 m.name = toqstr(translateIfPossible(from_utf8(it->getName())));
3095 // this is supposed to give us the first sentence of the description
3098 toqstr(translateIfPossible(from_utf8(it->getDescription())));
3099 int const pos = desc.indexOf(".");
3101 desc.truncate(pos + 1);
3102 m.description = desc;
3103 moduleNames_.push_back(m);
3108 void GuiDocument::updateUnknownBranches()
3112 list<docstring> used_branches;
3113 buffer().getUsedBranches(used_branches);
3114 list<docstring>::const_iterator it = used_branches.begin();
3115 QStringList unknown_branches;
3116 for (; it != used_branches.end() ; ++it) {
3117 if (!buffer().params().branchlist().find(*it))
3118 unknown_branches.append(toqstr(*it));
3120 branchesModule->setUnknownBranches(unknown_branches);
3124 void GuiDocument::branchesRename(docstring const & oldname, docstring const & newname)
3126 map<docstring, docstring>::iterator it = changedBranches_.begin();
3127 for (; it != changedBranches_.end() ; ++it) {
3128 if (it->second == oldname) {
3129 // branch has already been renamed
3130 it->second = newname;
3135 changedBranches_[oldname] = newname;
3139 void GuiDocument::executeBranchRenaming() const
3141 map<docstring, docstring>::const_iterator it = changedBranches_.begin();
3142 for (; it != changedBranches_.end() ; ++it) {
3143 docstring const arg = '"' + it->first + '"' + " " + '"' + it->second + '"';
3144 dispatch(FuncRequest(LFUN_BRANCHES_RENAME, arg));
3149 Dialog * createGuiDocument(GuiView & lv) { return new GuiDocument(lv); }
3152 } // namespace frontend
3155 #include "moc_GuiDocument.cpp"