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 "GuiSelectionManager.h"
19 #include "LaTeXHighlighter.h"
20 #include "LengthCombo.h"
21 #include "PanelStack.h"
22 #include "Validator.h"
24 #include "LayoutFile.h"
25 #include "BranchList.h"
26 #include "buffer_funcs.h"
28 #include "BufferParams.h"
29 #include "BufferView.h"
32 #include "FloatPlacement.h"
33 #include "FuncRequest.h"
35 #include "LaTeXFeatures.h"
37 #include "LyXRC.h" // defaultUnit
38 #include "ModuleList.h"
39 #include "OutputParams.h"
40 #include "PDFOptions.h"
41 #include "qt_helpers.h"
44 #include "insets/InsetListingsParams.h"
46 #include "support/debug.h"
47 #include "support/FileName.h"
48 #include "support/filetools.h"
49 #include "support/gettext.h"
50 #include "support/lstrings.h"
52 #include "frontends/alert.h"
54 #include <QAbstractItemModel>
55 #include <QCloseEvent>
57 #include <QTextCursor>
68 using namespace lyx::support;
73 char const * const tex_graphics[] =
75 "default", "dvialw", "dvilaser", "dvipdf", "dvipdfm", "dvipdfmx",
76 "dvips", "dvipsone", "dvitops", "dviwin", "dviwindo", "dvi2ps", "emtex",
77 "ln", "oztex", "pctexhp", "pctexps", "pctexwin", "pctex32", "pdftex",
78 "psprint", "pubps", "tcidvi", "textures", "truetex", "vtex", "xdvi",
83 char const * const tex_graphics_gui[] =
85 N_("Default"), "dvialw", "DviLaser", "dvipdf", "DVIPDFM", "DVIPDFMx",
86 "Dvips", "DVIPSONE", "DVItoPS", "DVIWIN", "DVIWindo", "dvi2ps", "EmTeX",
87 "LN", "OzTeX", "pctexhp", "pctexps", "pctexwin", "PCTeX32", "pdfTeX",
88 "psprint", "pubps", "tcidvi", "Textures", "TrueTeX", "VTeX", "xdvi",
89 "XeTeX", N_("None"), ""
93 char const * const tex_fonts_roman[] =
95 "default", "cmr", "lmodern", "ae", "times", "palatino",
96 "charter", "newcent", "bookman", "utopia", "beraserif",
97 "ccfonts", "chancery", ""
101 char const * tex_fonts_roman_gui[] =
103 N_("Default"), N_("Computer Modern Roman"), N_("Latin Modern Roman"),
104 N_("AE (Almost European)"), N_("Times Roman"), N_("Palatino"),
105 N_("Bitstream Charter"), N_("New Century Schoolbook"), N_("Bookman"),
106 N_("Utopia"), N_("Bera Serif"), N_("Concrete Roman"), N_("Zapf Chancery"),
111 char const * const tex_fonts_sans[] =
113 "default", "cmss", "lmss", "helvet", "avant", "berasans", "cmbr", ""
117 char const * tex_fonts_sans_gui[] =
119 N_("Default"), N_("Computer Modern Sans"), N_("Latin Modern Sans"),
120 N_("Helvetica"), N_("Avant Garde"), N_("Bera Sans"), N_("CM Bright"), ""
124 char const * const tex_fonts_monospaced[] =
126 "default", "cmtt", "lmtt", "courier", "beramono", "luximono", "cmtl", ""
130 char const * tex_fonts_monospaced_gui[] =
132 N_("Default"), N_("Computer Modern Typewriter"),
133 N_("Latin Modern Typewriter"), N_("Courier"), N_("Bera Mono"),
134 N_("LuxiMono"), N_("CM Typewriter Light"), ""
138 char const * backref_opts[] =
140 "false", "section", "slide", "page", ""
144 char const * backref_opts_gui[] =
146 N_("Off"), N_("Section"), N_("Slide"), N_("Page"), ""
150 vector<pair<string, QString> > pagestyles;
153 } // anonymous namespace
158 // used when sorting the textclass list.
159 class less_textclass_avail_desc
160 : public binary_function<string, string, int>
163 bool operator()(string const & lhs, string const & rhs) const
165 // Ordering criteria:
166 // 1. Availability of text class
167 // 2. Description (lexicographic)
168 LayoutFile const & tc1 = LayoutFileList::get()[lhs];
169 LayoutFile const & tc2 = LayoutFileList::get()[rhs];
170 return (tc1.isTeXClassAvailable() && !tc2.isTeXClassAvailable()) ||
171 (tc1.isTeXClassAvailable() == tc2.isTeXClassAvailable() &&
172 _(tc1.description()) < _(tc2.description()));
181 vector<string> getRequiredList(string const & modName)
183 LyXModule const * const mod = moduleList[modName];
185 return vector<string>(); //empty such thing
186 return mod->getRequiredModules();
190 vector<string> getExcludedList(string const & modName)
192 LyXModule const * const mod = moduleList[modName];
194 return vector<string>(); //empty such thing
195 return mod->getExcludedModules();
199 docstring getModuleDescription(string const & modName)
201 LyXModule const * const mod = moduleList[modName];
203 return _("Module not found!");
204 return _(mod->getDescription());
208 vector<string> getPackageList(string const & modName)
210 LyXModule const * const mod = moduleList[modName];
212 return vector<string>(); //empty such thing
213 return mod->getPackageList();
217 bool isModuleAvailable(string const & modName)
219 LyXModule * mod = moduleList[modName];
222 return mod->isAvailable();
225 } // anonymous namespace
228 /////////////////////////////////////////////////////////////////////
230 // ModuleSelectionManager
232 /////////////////////////////////////////////////////////////////////
234 /// SelectionManager for use with modules
235 class ModuleSelectionManager : public GuiSelectionManager
239 ModuleSelectionManager(
240 QListView * availableLV,
241 QListView * selectedLV,
245 QPushButton * downPB,
246 GuiIdListModel * availableModel,
247 GuiIdListModel * selectedModel,
248 GuiDocument const * container)
249 : GuiSelectionManager(availableLV, selectedLV, addPB, delPB,
250 upPB, downPB, availableModel, selectedModel), container_(container)
254 virtual void updateAddPB();
256 virtual void updateUpPB();
258 virtual void updateDownPB();
260 virtual void updateDelPB();
261 /// returns availableModel as a GuiIdListModel
262 GuiIdListModel * getAvailableModel()
264 return dynamic_cast<GuiIdListModel *>(availableModel);
266 /// returns selectedModel as a GuiIdListModel
267 GuiIdListModel * getSelectedModel()
269 return dynamic_cast<GuiIdListModel *>(selectedModel);
272 GuiDocument const * container_;
275 void ModuleSelectionManager::updateAddPB()
277 int const arows = availableModel->rowCount();
278 QModelIndexList const avail_sels =
279 availableLV->selectionModel()->selectedIndexes();
281 // disable if there aren't any modules (?), if none of them is chosen
282 // in the dialog, or if the chosen one is already selected for use.
283 if (arows == 0 || avail_sels.isEmpty() || isSelected(avail_sels.first())) {
284 addPB->setEnabled(false);
288 QModelIndex const & idx = availableLV->selectionModel()->currentIndex();
289 string const modname = getAvailableModel()->getIDString(idx.row());
292 container_->params().moduleCanBeAdded(modname);
293 addPB->setEnabled(enable);
297 void ModuleSelectionManager::updateDownPB()
299 int const srows = selectedModel->rowCount();
301 downPB->setEnabled(false);
304 QModelIndex const & curidx = selectedLV->selectionModel()->currentIndex();
305 int const curRow = curidx.row();
306 if (curRow < 0 || curRow >= srows - 1) { // invalid or last item
307 downPB->setEnabled(false);
311 // determine whether immediately succeding element requires this one
312 string const curmodname = getSelectedModel()->getIDString(curRow);
313 string const nextmodname = getSelectedModel()->getIDString(curRow + 1);
315 vector<string> reqs = getRequiredList(nextmodname);
317 // if it doesn't require anything....
319 downPB->setEnabled(true);
323 // Enable it if this module isn't required.
324 // FIXME This should perhaps be more flexible and check whether, even
325 // if the next one is required, there is also an earlier one that will do.
327 find(reqs.begin(), reqs.end(), curmodname) == reqs.end());
330 void ModuleSelectionManager::updateUpPB()
332 int const srows = selectedModel->rowCount();
334 upPB->setEnabled(false);
338 QModelIndex const & curIdx = selectedLV->selectionModel()->currentIndex();
339 int curRow = curIdx.row();
340 if (curRow <= 0 || curRow > srows - 1) { // first item or invalid
341 upPB->setEnabled(false);
344 string const curmodname = getSelectedModel()->getIDString(curRow);
346 // determine whether immediately preceding element is required by this one
347 vector<string> reqs = getRequiredList(curmodname);
349 // if this one doesn't require anything....
351 upPB->setEnabled(true);
356 // Enable it if the preceding module isn't required.
357 // NOTE This is less flexible than it might be. We could check whether, even
358 // if the previous one is required, there is an earlier one that would do.
359 string const premod = getSelectedModel()->getIDString(curRow - 1);
360 upPB->setEnabled(find(reqs.begin(), reqs.end(), premod) == reqs.end());
363 void ModuleSelectionManager::updateDelPB()
365 int const srows = selectedModel->rowCount();
367 deletePB->setEnabled(false);
371 QModelIndex const & curidx =
372 selectedLV->selectionModel()->currentIndex();
373 int const curRow = curidx.row();
374 if (curRow < 0 || curRow >= srows) { // invalid index?
375 deletePB->setEnabled(false);
379 string const curmodname = getSelectedModel()->getIDString(curRow);
381 // We're looking here for a reason NOT to enable the button. If we
382 // find one, we disable it and return. If we don't, we'll end up at
383 // the end of the function, and then we enable it.
384 for (int i = curRow + 1; i < srows; ++i) {
385 string const thisMod = getSelectedModel()->getIDString(i);
386 vector<string> reqs = getRequiredList(thisMod);
387 //does this one require us?
388 if (find(reqs.begin(), reqs.end(), curmodname) == reqs.end())
392 // OK, so this module requires us
393 // is there an EARLIER module that also satisfies the require?
394 // NOTE We demand that it be earlier to keep the list of modules
395 // consistent with the rule that a module must be proceeded by a
396 // required module. There would be more flexible ways to proceed,
397 // but that would be a lot more complicated, and the logic here is
398 // already complicated. (That's why I've left the debugging code.)
399 // lyxerr << "Testing " << thisMod << std::endl;
400 bool foundone = false;
401 for (int j = 0; j < curRow; ++j) {
402 string const mod = getSelectedModel()->getIDString(j);
403 // lyxerr << "In loop: Testing " << mod << std::endl;
404 // do we satisfy the require?
405 if (find(reqs.begin(), reqs.end(), mod) != reqs.end()) {
406 // lyxerr << mod << " does the trick." << std::endl;
411 // did we find a module to satisfy the require?
413 // lyxerr << "No matching module found." << std::endl;
414 deletePB->setEnabled(false);
418 // lyxerr << "All's well that ends well." << std::endl;
419 deletePB->setEnabled(true);
423 /////////////////////////////////////////////////////////////////////
427 /////////////////////////////////////////////////////////////////////
429 PreambleModule::PreambleModule() : current_id_(0)
431 // This is not a memory leak. The object will be destroyed
433 (void) new LaTeXHighlighter(preambleTE->document());
434 setFocusProxy(preambleTE);
435 connect(preambleTE, SIGNAL(textChanged()), this, SIGNAL(changed()));
439 void PreambleModule::update(BufferParams const & params, BufferId id)
441 QString preamble = toqstr(params.preamble);
442 // Nothing to do if the params and preamble are unchanged.
443 if (id == current_id_
444 && preamble == preambleTE->document()->toPlainText())
447 QTextCursor cur = preambleTE->textCursor();
448 // Save the coords before switching to the new one.
449 preamble_coords_[current_id_] =
450 make_pair(cur.position(), preambleTE->verticalScrollBar()->value());
452 // Save the params address for further use.
454 preambleTE->document()->setPlainText(preamble);
455 Coords::const_iterator it = preamble_coords_.find(current_id_);
456 if (it == preamble_coords_.end())
457 // First time we open this one.
458 preamble_coords_[current_id_] = make_pair(0, 0);
460 // Restore saved coords.
461 QTextCursor cur = preambleTE->textCursor();
462 cur.setPosition(it->second.first);
463 preambleTE->setTextCursor(cur);
464 preambleTE->verticalScrollBar()->setValue(it->second.second);
469 void PreambleModule::apply(BufferParams & params)
471 params.preamble = fromqstr(preambleTE->document()->toPlainText());
475 void PreambleModule::closeEvent(QCloseEvent * e)
477 // Save the coords before closing.
478 QTextCursor cur = preambleTE->textCursor();
479 preamble_coords_[current_id_] =
480 make_pair(cur.position(), preambleTE->verticalScrollBar()->value());
485 /////////////////////////////////////////////////////////////////////
489 /////////////////////////////////////////////////////////////////////
492 GuiDocument::GuiDocument(GuiView & lv)
493 : GuiDialog(lv, "document", qt_("Document Settings"))
497 connect(okPB, SIGNAL(clicked()), this, SLOT(slotOK()));
498 connect(applyPB, SIGNAL(clicked()), this, SLOT(slotApply()));
499 connect(closePB, SIGNAL(clicked()), this, SLOT(slotClose()));
500 connect(restorePB, SIGNAL(clicked()), this, SLOT(slotRestore()));
502 connect(savePB, SIGNAL(clicked()), this, SLOT(saveDefaultClicked()));
503 connect(defaultPB, SIGNAL(clicked()), this, SLOT(useDefaultsClicked()));
505 // Manage the restore, ok, apply, restore and cancel/close buttons
506 bc().setPolicy(ButtonPolicy::NoRepeatedApplyReadOnlyPolicy);
508 bc().setApply(applyPB);
509 bc().setCancel(closePB);
510 bc().setRestore(restorePB);
512 textLayoutModule = new UiWidget<Ui::TextLayoutUi>;
514 connect(textLayoutModule->lspacingCO, SIGNAL(activated(int)),
515 this, SLOT(change_adaptor()));
516 connect(textLayoutModule->lspacingCO, SIGNAL(activated(int)),
517 this, SLOT(setLSpacing(int)));
518 connect(textLayoutModule->lspacingLE, SIGNAL(textChanged(const QString &)),
519 this, SLOT(change_adaptor()));
520 connect(textLayoutModule->skipRB, SIGNAL(clicked()),
521 this, SLOT(change_adaptor()));
522 connect(textLayoutModule->indentRB, SIGNAL(clicked()),
523 this, SLOT(change_adaptor()));
524 connect(textLayoutModule->skipCO, SIGNAL(activated(int)),
525 this, SLOT(change_adaptor()));
526 connect(textLayoutModule->skipLE, SIGNAL(textChanged(const QString &)),
527 this, SLOT(change_adaptor()));
528 connect(textLayoutModule->skipLengthCO, SIGNAL(activated(int)),
529 this, SLOT(change_adaptor()));
530 connect(textLayoutModule->skipCO, SIGNAL(activated(int)),
531 this, SLOT(setSkip(int)));
532 connect(textLayoutModule->skipRB, SIGNAL(toggled(bool)),
533 this, SLOT(enableSkip(bool)));
534 connect(textLayoutModule->twoColumnCB, SIGNAL(clicked()),
535 this, SLOT(change_adaptor()));
536 connect(textLayoutModule->twoColumnCB, SIGNAL(clicked()),
537 this, SLOT(setColSep()));
538 connect(textLayoutModule->listingsED, SIGNAL(textChanged()),
539 this, SLOT(change_adaptor()));
540 connect(textLayoutModule->bypassCB, SIGNAL(clicked()),
541 this, SLOT(change_adaptor()));
542 connect(textLayoutModule->bypassCB, SIGNAL(clicked()),
543 this, SLOT(setListingsMessage()));
544 connect(textLayoutModule->listingsED, SIGNAL(textChanged()),
545 this, SLOT(setListingsMessage()));
546 textLayoutModule->listingsTB->setPlainText(
547 qt_("Input listings parameters on the right. Enter ? for a list of parameters."));
548 textLayoutModule->lspacingLE->setValidator(new QDoubleValidator(
549 textLayoutModule->lspacingLE));
550 textLayoutModule->skipLE->setValidator(unsignedLengthValidator(
551 textLayoutModule->skipLE));
553 textLayoutModule->skipCO->addItem(qt_("SmallSkip"));
554 textLayoutModule->skipCO->addItem(qt_("MedSkip"));
555 textLayoutModule->skipCO->addItem(qt_("BigSkip"));
556 textLayoutModule->skipCO->addItem(qt_("Length"));
557 // remove the %-items from the unit choice
558 textLayoutModule->skipLengthCO->noPercents();
559 textLayoutModule->lspacingCO->insertItem(
560 Spacing::Single, qt_("Single"));
561 textLayoutModule->lspacingCO->insertItem(
562 Spacing::Onehalf, qt_("OneHalf"));
563 textLayoutModule->lspacingCO->insertItem(
564 Spacing::Double, qt_("Double"));
565 textLayoutModule->lspacingCO->insertItem(
566 Spacing::Other, qt_("Custom"));
568 // initialize the length validator
569 bc().addCheckedLineEdit(textLayoutModule->skipLE);
571 fontModule = new UiWidget<Ui::FontUi>;
573 connect(fontModule->fontsRomanCO, SIGNAL(activated(int)),
574 this, SLOT(change_adaptor()));
575 connect(fontModule->fontsRomanCO, SIGNAL(activated(int)),
576 this, SLOT(romanChanged(int)));
577 connect(fontModule->fontsSansCO, SIGNAL(activated(int)),
578 this, SLOT(change_adaptor()));
579 connect(fontModule->fontsSansCO, SIGNAL(activated(int)),
580 this, SLOT(sansChanged(int)));
581 connect(fontModule->fontsTypewriterCO, SIGNAL(activated(int)),
582 this, SLOT(change_adaptor()));
583 connect(fontModule->fontsTypewriterCO, SIGNAL(activated(int)),
584 this, SLOT(ttChanged(int)));
585 connect(fontModule->fontsDefaultCO, SIGNAL(activated(int)),
586 this, SLOT(change_adaptor()));
587 connect(fontModule->fontsizeCO, SIGNAL(activated(int)),
588 this, SLOT(change_adaptor()));
589 connect(fontModule->cjkFontLE, SIGNAL(textChanged(const QString &)),
590 this, SLOT(change_adaptor()));
591 connect(fontModule->scaleSansSB, SIGNAL(valueChanged(int)),
592 this, SLOT(change_adaptor()));
593 connect(fontModule->scaleTypewriterSB, SIGNAL(valueChanged(int)),
594 this, SLOT(change_adaptor()));
595 connect(fontModule->fontScCB, SIGNAL(clicked()),
596 this, SLOT(change_adaptor()));
597 connect(fontModule->fontOsfCB, SIGNAL(clicked()),
598 this, SLOT(change_adaptor()));
600 for (int n = 0; tex_fonts_roman[n][0]; ++n) {
601 QString font = qt_(tex_fonts_roman_gui[n]);
602 if (!isFontAvailable(tex_fonts_roman[n]))
603 font += qt_(" (not installed)");
604 fontModule->fontsRomanCO->addItem(font);
606 for (int n = 0; tex_fonts_sans[n][0]; ++n) {
607 QString font = qt_(tex_fonts_sans_gui[n]);
608 if (!isFontAvailable(tex_fonts_sans[n]))
609 font += qt_(" (not installed)");
610 fontModule->fontsSansCO->addItem(font);
612 for (int n = 0; tex_fonts_monospaced[n][0]; ++n) {
613 QString font = qt_(tex_fonts_monospaced_gui[n]);
614 if (!isFontAvailable(tex_fonts_monospaced[n]))
615 font += qt_(" (not installed)");
616 fontModule->fontsTypewriterCO->addItem(font);
619 fontModule->fontsizeCO->addItem(qt_("Default"));
620 fontModule->fontsizeCO->addItem(qt_("10"));
621 fontModule->fontsizeCO->addItem(qt_("11"));
622 fontModule->fontsizeCO->addItem(qt_("12"));
624 for (int n = 0; GuiDocument::fontfamilies_gui[n][0]; ++n)
625 fontModule->fontsDefaultCO->addItem(
626 qt_(GuiDocument::fontfamilies_gui[n]));
629 pageLayoutModule = new UiWidget<Ui::PageLayoutUi>;
631 connect(pageLayoutModule->papersizeCO, SIGNAL(activated(int)),
632 this, SLOT(setCustomPapersize(int)));
633 connect(pageLayoutModule->papersizeCO, SIGNAL(activated(int)),
634 this, SLOT(setCustomPapersize(int)));
635 connect(pageLayoutModule->portraitRB, SIGNAL(clicked()),
636 this, SLOT(portraitChanged()));
637 connect(pageLayoutModule->papersizeCO, SIGNAL(activated(int)),
638 this, SLOT(change_adaptor()));
639 connect(pageLayoutModule->paperheightLE, SIGNAL(textChanged(const QString &)),
640 this, SLOT(change_adaptor()));
641 connect(pageLayoutModule->paperwidthLE, SIGNAL(textChanged(const QString &)),
642 this, SLOT(change_adaptor()));
643 connect(pageLayoutModule->paperwidthUnitCO, SIGNAL(activated(int)),
644 this, SLOT(change_adaptor()));
645 connect(pageLayoutModule->paperheightUnitCO, SIGNAL(activated(int)),
646 this, SLOT(change_adaptor()));
647 connect(pageLayoutModule->portraitRB, SIGNAL(clicked()),
648 this, SLOT(change_adaptor()));
649 connect(pageLayoutModule->landscapeRB, SIGNAL(clicked()),
650 this, SLOT(change_adaptor()));
651 connect(pageLayoutModule->facingPagesCB, SIGNAL(clicked()),
652 this, SLOT(change_adaptor()));
653 connect(pageLayoutModule->pagestyleCO, SIGNAL(activated(int)),
654 this, SLOT(change_adaptor()));
656 pageLayoutModule->pagestyleCO->addItem(qt_("Default"));
657 pageLayoutModule->pagestyleCO->addItem(qt_("empty"));
658 pageLayoutModule->pagestyleCO->addItem(qt_("plain"));
659 pageLayoutModule->pagestyleCO->addItem(qt_("headings"));
660 pageLayoutModule->pagestyleCO->addItem(qt_("fancy"));
661 bc().addCheckedLineEdit(pageLayoutModule->paperheightLE,
662 pageLayoutModule->paperheightL);
663 bc().addCheckedLineEdit(pageLayoutModule->paperwidthLE,
664 pageLayoutModule->paperwidthL);
667 QComboBox * cb = pageLayoutModule->papersizeCO;
668 cb->addItem(qt_("Default"));
669 cb->addItem(qt_("Custom"));
670 cb->addItem(qt_("US letter"));
671 cb->addItem(qt_("US legal"));
672 cb->addItem(qt_("US executive"));
673 cb->addItem(qt_("A3"));
674 cb->addItem(qt_("A4"));
675 cb->addItem(qt_("A5"));
676 cb->addItem(qt_("B3"));
677 cb->addItem(qt_("B4"));
678 cb->addItem(qt_("B5"));
679 // remove the %-items from the unit choice
680 pageLayoutModule->paperwidthUnitCO->noPercents();
681 pageLayoutModule->paperheightUnitCO->noPercents();
682 pageLayoutModule->paperheightLE->setValidator(unsignedLengthValidator(
683 pageLayoutModule->paperheightLE));
684 pageLayoutModule->paperwidthLE->setValidator(unsignedLengthValidator(
685 pageLayoutModule->paperwidthLE));
688 marginsModule = new UiWidget<Ui::MarginsUi>;
690 connect(marginsModule->marginCB, SIGNAL(toggled(bool)),
691 this, SLOT(setCustomMargins(bool)));
692 connect(marginsModule->marginCB, SIGNAL(clicked()),
693 this, SLOT(change_adaptor()));
694 connect(marginsModule->topLE, SIGNAL(textChanged(QString)),
695 this, SLOT(change_adaptor()));
696 connect(marginsModule->topUnit, SIGNAL(activated(int)),
697 this, SLOT(change_adaptor()));
698 connect(marginsModule->bottomLE, SIGNAL(textChanged(QString)),
699 this, SLOT(change_adaptor()));
700 connect(marginsModule->bottomUnit, SIGNAL(activated(int)),
701 this, SLOT(change_adaptor()));
702 connect(marginsModule->innerLE, SIGNAL(textChanged(QString)),
703 this, SLOT(change_adaptor()));
704 connect(marginsModule->innerUnit, SIGNAL(activated(int)),
705 this, SLOT(change_adaptor()));
706 connect(marginsModule->outerLE, SIGNAL(textChanged(QString)),
707 this, SLOT(change_adaptor()));
708 connect(marginsModule->outerUnit, SIGNAL(activated(int)),
709 this, SLOT(change_adaptor()));
710 connect(marginsModule->headheightLE, SIGNAL(textChanged(QString)),
711 this, SLOT(change_adaptor()));
712 connect(marginsModule->headheightUnit, SIGNAL(activated(int)),
713 this, SLOT(change_adaptor()));
714 connect(marginsModule->headsepLE, SIGNAL(textChanged(QString)),
715 this, SLOT(change_adaptor()));
716 connect(marginsModule->headsepUnit, SIGNAL(activated(int)),
717 this, SLOT(change_adaptor()));
718 connect(marginsModule->footskipLE, SIGNAL(textChanged(QString)),
719 this, SLOT(change_adaptor()));
720 connect(marginsModule->footskipUnit, SIGNAL(activated(int)),
721 this, SLOT(change_adaptor()));
722 connect(marginsModule->columnsepLE, SIGNAL(textChanged(QString)),
723 this, SLOT(change_adaptor()));
724 connect(marginsModule->columnsepUnit, SIGNAL(activated(int)),
725 this, SLOT(change_adaptor()));
726 marginsModule->topLE->setValidator(unsignedLengthValidator(
727 marginsModule->topLE));
728 marginsModule->bottomLE->setValidator(unsignedLengthValidator(
729 marginsModule->bottomLE));
730 marginsModule->innerLE->setValidator(unsignedLengthValidator(
731 marginsModule->innerLE));
732 marginsModule->outerLE->setValidator(unsignedLengthValidator(
733 marginsModule->outerLE));
734 marginsModule->headsepLE->setValidator(unsignedLengthValidator(
735 marginsModule->headsepLE));
736 marginsModule->headheightLE->setValidator(unsignedLengthValidator(
737 marginsModule->headheightLE));
738 marginsModule->footskipLE->setValidator(unsignedLengthValidator(
739 marginsModule->footskipLE));
740 marginsModule->columnsepLE->setValidator(unsignedLengthValidator(
741 marginsModule->columnsepLE));
743 bc().addCheckedLineEdit(marginsModule->topLE,
744 marginsModule->topL);
745 bc().addCheckedLineEdit(marginsModule->bottomLE,
746 marginsModule->bottomL);
747 bc().addCheckedLineEdit(marginsModule->innerLE,
748 marginsModule->innerL);
749 bc().addCheckedLineEdit(marginsModule->outerLE,
750 marginsModule->outerL);
751 bc().addCheckedLineEdit(marginsModule->headsepLE,
752 marginsModule->headsepL);
753 bc().addCheckedLineEdit(marginsModule->headheightLE,
754 marginsModule->headheightL);
755 bc().addCheckedLineEdit(marginsModule->footskipLE,
756 marginsModule->footskipL);
757 bc().addCheckedLineEdit(marginsModule->columnsepLE,
758 marginsModule->columnsepL);
761 langModule = new UiWidget<Ui::LanguageUi>;
763 connect(langModule->languageCO, SIGNAL(activated(int)),
764 this, SLOT(change_adaptor()));
765 connect(langModule->defaultencodingRB, SIGNAL(clicked()),
766 this, SLOT(change_adaptor()));
767 connect(langModule->otherencodingRB, SIGNAL(clicked()),
768 this, SLOT(change_adaptor()));
769 connect(langModule->encodingCO, SIGNAL(activated(int)),
770 this, SLOT(change_adaptor()));
771 connect(langModule->quoteStyleCO, SIGNAL(activated(int)),
772 this, SLOT(change_adaptor()));
774 QAbstractItemModel * language_model = guiApp->languageModel();
775 // FIXME: it would be nice if sorting was enabled/disabled via a checkbox.
776 language_model->sort(0);
777 langModule->languageCO->setModel(language_model);
779 // Always put the default encoding in the first position.
780 langModule->encodingCO->addItem(qt_("Language Default (no inputenc)"));
781 QStringList encodinglist;
782 Encodings::const_iterator it = encodings.begin();
783 Encodings::const_iterator const end = encodings.end();
784 for (; it != end; ++it)
785 encodinglist.append(qt_(it->guiName()));
787 langModule->encodingCO->addItems(encodinglist);
789 langModule->quoteStyleCO->addItem(qt_("``text''"));
790 langModule->quoteStyleCO->addItem(qt_("''text''"));
791 langModule->quoteStyleCO->addItem(qt_(",,text``"));
792 langModule->quoteStyleCO->addItem(qt_(",,text''"));
793 langModule->quoteStyleCO->addItem(qt_("<<text>>"));
794 langModule->quoteStyleCO->addItem(qt_(">>text<<"));
797 numberingModule = new UiWidget<Ui::NumberingUi>;
799 connect(numberingModule->depthSL, SIGNAL(valueChanged(int)),
800 this, SLOT(change_adaptor()));
801 connect(numberingModule->tocSL, SIGNAL(valueChanged(int)),
802 this, SLOT(change_adaptor()));
803 connect(numberingModule->depthSL, SIGNAL(valueChanged(int)),
804 this, SLOT(updateNumbering()));
805 connect(numberingModule->tocSL, SIGNAL(valueChanged(int)),
806 this, SLOT(updateNumbering()));
807 numberingModule->tocTW->setColumnCount(3);
808 numberingModule->tocTW->headerItem()->setText(0, qt_("Example"));
809 numberingModule->tocTW->headerItem()->setText(1, qt_("Numbered"));
810 numberingModule->tocTW->headerItem()->setText(2, qt_("Appears in TOC"));
813 biblioModule = new UiWidget<Ui::BiblioUi>;
814 connect(biblioModule->citeNatbibRB, SIGNAL(toggled(bool)),
815 biblioModule->citationStyleL, SLOT(setEnabled(bool)));
816 connect(biblioModule->citeNatbibRB, SIGNAL(toggled(bool)),
817 biblioModule->citeStyleCO, SLOT(setEnabled(bool)));
819 connect(biblioModule->citeDefaultRB, SIGNAL(clicked()),
820 this, SLOT(change_adaptor()));
821 connect(biblioModule->citeNatbibRB, SIGNAL(clicked()),
822 this, SLOT(change_adaptor()));
823 connect(biblioModule->citeStyleCO, SIGNAL(activated(int)),
824 this, SLOT(change_adaptor()));
825 connect(biblioModule->citeJurabibRB, SIGNAL(clicked()),
826 this, SLOT(change_adaptor()));
827 connect(biblioModule->bibtopicCB, SIGNAL(clicked()),
828 this, SLOT(change_adaptor()));
830 biblioModule->citeStyleCO->addItem(qt_("Author-year"));
831 biblioModule->citeStyleCO->addItem(qt_("Numerical"));
832 biblioModule->citeStyleCO->setCurrentIndex(0);
835 mathsModule = new UiWidget<Ui::MathsUi>;
836 connect(mathsModule->amsautoCB, SIGNAL(toggled(bool)),
837 mathsModule->amsCB, SLOT(setDisabled(bool)));
838 connect(mathsModule->esintautoCB, SIGNAL(toggled(bool)),
839 mathsModule->esintCB, SLOT(setDisabled(bool)));
841 connect(mathsModule->amsCB, SIGNAL(clicked()),
842 this, SLOT(change_adaptor()));
843 connect(mathsModule->amsautoCB, SIGNAL(clicked()),
844 this, SLOT(change_adaptor()));
845 connect(mathsModule->esintCB, SIGNAL(clicked()),
846 this, SLOT(change_adaptor()));
847 connect(mathsModule->esintautoCB, SIGNAL(clicked()),
848 this, SLOT(change_adaptor()));
850 latexModule = new UiWidget<Ui::LaTeXUi>;
852 connect(latexModule->optionsLE, SIGNAL(textChanged(QString)),
853 this, SLOT(change_adaptor()));
854 connect(latexModule->defaultOptionsCB, SIGNAL(clicked()),
855 this, SLOT(change_adaptor()));
856 connect(latexModule->psdriverCO, SIGNAL(activated(int)),
857 this, SLOT(change_adaptor()));
858 connect(latexModule->classCO, SIGNAL(activated(int)),
859 this, SLOT(classChanged()));
860 connect(latexModule->classCO, SIGNAL(activated(int)),
861 this, SLOT(change_adaptor()));
862 connect(latexModule->layoutPB, SIGNAL(clicked()),
863 this, SLOT(browseLayout()));
864 connect(latexModule->layoutPB, SIGNAL(clicked()),
865 this, SLOT(change_adaptor()));
866 connect(latexModule->childDocGB, SIGNAL(clicked()),
867 this, SLOT(change_adaptor()));
868 connect(latexModule->childDocLE, SIGNAL(textChanged(QString)),
869 this, SLOT(change_adaptor()));
870 connect(latexModule->childDocPB, SIGNAL(clicked()),
871 this, SLOT(browseMaster()));
873 // postscript drivers
874 for (int n = 0; tex_graphics[n][0]; ++n) {
875 QString enc = qt_(tex_graphics_gui[n]);
876 latexModule->psdriverCO->addItem(enc);
879 latexModule->classCO->setModel(&classes_model_);
880 LayoutFileList const & bcl = LayoutFileList::get();
881 vector<LayoutFileIndex> classList = bcl.classList();
882 sort(classList.begin(), classList.end(), less_textclass_avail_desc());
884 vector<LayoutFileIndex>::const_iterator cit = classList.begin();
885 vector<LayoutFileIndex>::const_iterator cen = classList.end();
886 for (int i = 0; cit != cen; ++cit, ++i) {
887 LayoutFile const & tc = bcl[*cit];
888 docstring item = (tc.isTeXClassAvailable()) ?
889 from_utf8(tc.description()) :
890 bformat(_("Unavailable: %1$s"), from_utf8(tc.description()));
891 classes_model_.insertRow(i, toqstr(item), *cit);
895 branchesModule = new GuiBranches;
896 connect(branchesModule, SIGNAL(changed()),
897 this, SLOT(change_adaptor()));
900 preambleModule = new PreambleModule;
901 connect(preambleModule, SIGNAL(changed()),
902 this, SLOT(change_adaptor()));
905 bulletsModule = new BulletsModule;
906 connect(bulletsModule, SIGNAL(changed()),
907 this, SLOT(change_adaptor()));
910 modulesModule = new UiWidget<Ui::ModulesUi>;
913 new ModuleSelectionManager(modulesModule->availableLV,
914 modulesModule->selectedLV,
915 modulesModule->addPB, modulesModule->deletePB,
916 modulesModule->upPB, modulesModule->downPB,
917 availableModel(), selectedModel(), this);
918 connect(selectionManager, SIGNAL(updateHook()),
919 this, SLOT(updateModuleInfo()));
920 connect(selectionManager, SIGNAL(updateHook()),
921 this, SLOT(change_adaptor()));
922 connect(selectionManager, SIGNAL(selectionChanged()),
923 this, SLOT(modulesChanged()));
926 pdfSupportModule = new UiWidget<Ui::PDFSupportUi>;
928 connect(pdfSupportModule->use_hyperrefGB, SIGNAL(toggled(bool)),
929 this, SLOT(change_adaptor()));
930 connect(pdfSupportModule->titleLE, SIGNAL(textChanged(QString)),
931 this, SLOT(change_adaptor()));
932 connect(pdfSupportModule->authorLE, SIGNAL(textChanged(QString)),
933 this, SLOT(change_adaptor()));
934 connect(pdfSupportModule->subjectLE, SIGNAL(textChanged(QString)),
935 this, SLOT(change_adaptor()));
936 connect(pdfSupportModule->keywordsLE, SIGNAL(textChanged(QString)),
937 this, SLOT(change_adaptor()));
938 connect(pdfSupportModule->bookmarksGB, SIGNAL(toggled(bool)),
939 this, SLOT(change_adaptor()));
940 connect(pdfSupportModule->bookmarksnumberedCB, SIGNAL(toggled(bool)),
941 this, SLOT(change_adaptor()));
942 connect(pdfSupportModule->bookmarksopenGB, SIGNAL(toggled(bool)),
943 this, SLOT(change_adaptor()));
944 connect(pdfSupportModule->bookmarksopenlevelSB, SIGNAL(valueChanged(int)),
945 this, SLOT(change_adaptor()));
946 connect(pdfSupportModule->breaklinksCB, SIGNAL(toggled(bool)),
947 this, SLOT(change_adaptor()));
948 connect(pdfSupportModule->pdfborderCB, SIGNAL(toggled(bool)),
949 this, SLOT(change_adaptor()));
950 connect(pdfSupportModule->colorlinksCB, SIGNAL(toggled(bool)),
951 this, SLOT(change_adaptor()));
952 connect(pdfSupportModule->backrefCO, SIGNAL(activated(int)),
953 this, SLOT(change_adaptor()));
954 connect(pdfSupportModule->pdfusetitleCB, SIGNAL(toggled(bool)),
955 this, SLOT(change_adaptor()));
956 connect(pdfSupportModule->fullscreenCB, SIGNAL(toggled(bool)),
957 this, SLOT(change_adaptor()));
958 connect(pdfSupportModule->optionsLE, SIGNAL(textChanged(QString)),
959 this, SLOT(change_adaptor()));
961 for (int i = 0; backref_opts[i][0]; ++i)
962 pdfSupportModule->backrefCO->addItem(qt_(backref_opts_gui[i]));
965 floatModule = new FloatPlacement;
966 connect(floatModule, SIGNAL(changed()),
967 this, SLOT(change_adaptor()));
969 docPS->addPanel(latexModule, qt_("Document Class"));
970 docPS->addPanel(modulesModule, qt_("Modules"));
971 docPS->addPanel(fontModule, qt_("Fonts"));
972 docPS->addPanel(textLayoutModule, qt_("Text Layout"));
973 docPS->addPanel(pageLayoutModule, qt_("Page Layout"));
974 docPS->addPanel(marginsModule, qt_("Page Margins"));
975 docPS->addPanel(langModule, qt_("Language"));
976 docPS->addPanel(numberingModule, qt_("Numbering & TOC"));
977 docPS->addPanel(biblioModule, qt_("Bibliography"));
978 docPS->addPanel(pdfSupportModule, qt_("PDF Properties"));
979 docPS->addPanel(mathsModule, qt_("Math Options"));
980 docPS->addPanel(floatModule, qt_("Float Placement"));
981 docPS->addPanel(bulletsModule, qt_("Bullets"));
982 docPS->addPanel(branchesModule, qt_("Branches"));
983 docPS->addPanel(preambleModule, qt_("LaTeX Preamble"));
984 docPS->setCurrentPanel(qt_("Document Class"));
985 // FIXME: hack to work around resizing bug in Qt >= 4.2
986 // bug verified with Qt 4.2.{0-3} (JSpitzm)
987 #if QT_VERSION >= 0x040200
988 docPS->updateGeometry();
993 void GuiDocument::showPreamble()
995 docPS->setCurrentPanel(qt_("LaTeX Preamble"));
999 void GuiDocument::saveDefaultClicked()
1005 void GuiDocument::useDefaultsClicked()
1011 void GuiDocument::change_adaptor()
1017 QString GuiDocument::validateListingsParameters()
1019 // use a cache here to avoid repeated validation
1020 // of the same parameters
1021 static string param_cache;
1022 static QString msg_cache;
1024 if (textLayoutModule->bypassCB->isChecked())
1027 string params = fromqstr(textLayoutModule->listingsED->toPlainText());
1028 if (params != param_cache) {
1029 param_cache = params;
1030 msg_cache = toqstr(InsetListingsParams(params).validate());
1036 void GuiDocument::setListingsMessage()
1038 static bool isOK = true;
1039 QString msg = validateListingsParameters();
1040 if (msg.isEmpty()) {
1044 // listingsTB->setTextColor("black");
1045 textLayoutModule->listingsTB->setPlainText(
1046 qt_("Input listings parameters on the right. "
1047 "Enter ? for a list of parameters."));
1050 // listingsTB->setTextColor("red");
1051 textLayoutModule->listingsTB->setPlainText(msg);
1056 void GuiDocument::setLSpacing(int item)
1058 textLayoutModule->lspacingLE->setEnabled(item == 3);
1062 void GuiDocument::setSkip(int item)
1064 bool const enable = (item == 3);
1065 textLayoutModule->skipLE->setEnabled(enable);
1066 textLayoutModule->skipLengthCO->setEnabled(enable);
1070 void GuiDocument::enableSkip(bool skip)
1072 textLayoutModule->skipCO->setEnabled(skip);
1073 textLayoutModule->skipLE->setEnabled(skip);
1074 textLayoutModule->skipLengthCO->setEnabled(skip);
1076 setSkip(textLayoutModule->skipCO->currentIndex());
1079 void GuiDocument::portraitChanged()
1081 setMargins(pageLayoutModule->papersizeCO->currentIndex());
1084 void GuiDocument::setMargins(bool custom)
1086 marginsModule->marginCB->setChecked(custom);
1087 setCustomMargins(custom);
1091 void GuiDocument::setCustomPapersize(int papersize)
1093 bool const custom = (papersize == 1);
1095 pageLayoutModule->paperwidthL->setEnabled(custom);
1096 pageLayoutModule->paperwidthLE->setEnabled(custom);
1097 pageLayoutModule->paperwidthUnitCO->setEnabled(custom);
1098 pageLayoutModule->paperheightL->setEnabled(custom);
1099 pageLayoutModule->paperheightLE->setEnabled(custom);
1100 pageLayoutModule->paperheightLE->setFocus();
1101 pageLayoutModule->paperheightUnitCO->setEnabled(custom);
1105 void GuiDocument::setColSep()
1107 setCustomMargins(marginsModule->marginCB->checkState() == Qt::Checked);
1111 void GuiDocument::setCustomMargins(bool custom)
1113 marginsModule->topL->setEnabled(!custom);
1114 marginsModule->topLE->setEnabled(!custom);
1115 marginsModule->topUnit->setEnabled(!custom);
1117 marginsModule->bottomL->setEnabled(!custom);
1118 marginsModule->bottomLE->setEnabled(!custom);
1119 marginsModule->bottomUnit->setEnabled(!custom);
1121 marginsModule->innerL->setEnabled(!custom);
1122 marginsModule->innerLE->setEnabled(!custom);
1123 marginsModule->innerUnit->setEnabled(!custom);
1125 marginsModule->outerL->setEnabled(!custom);
1126 marginsModule->outerLE->setEnabled(!custom);
1127 marginsModule->outerUnit->setEnabled(!custom);
1129 marginsModule->headheightL->setEnabled(!custom);
1130 marginsModule->headheightLE->setEnabled(!custom);
1131 marginsModule->headheightUnit->setEnabled(!custom);
1133 marginsModule->headsepL->setEnabled(!custom);
1134 marginsModule->headsepLE->setEnabled(!custom);
1135 marginsModule->headsepUnit->setEnabled(!custom);
1137 marginsModule->footskipL->setEnabled(!custom);
1138 marginsModule->footskipLE->setEnabled(!custom);
1139 marginsModule->footskipUnit->setEnabled(!custom);
1141 bool const enableColSep = !custom &&
1142 textLayoutModule->twoColumnCB->checkState() == Qt::Checked;
1143 marginsModule->columnsepL->setEnabled(enableColSep);
1144 marginsModule->columnsepLE->setEnabled(enableColSep);
1145 marginsModule->columnsepUnit->setEnabled(enableColSep);
1149 void GuiDocument::updateFontsize(string const & items, string const & sel)
1151 fontModule->fontsizeCO->clear();
1152 fontModule->fontsizeCO->addItem(qt_("Default"));
1154 for (int n = 0; !token(items,'|',n).empty(); ++n)
1155 fontModule->fontsizeCO->
1156 addItem(toqstr(token(items,'|',n)));
1158 for (int n = 0; n < fontModule->fontsizeCO->count(); ++n) {
1159 if (fromqstr(fontModule->fontsizeCO->itemText(n)) == sel) {
1160 fontModule->fontsizeCO->setCurrentIndex(n);
1167 void GuiDocument::romanChanged(int item)
1169 string const font = tex_fonts_roman[item];
1170 fontModule->fontScCB->setEnabled(providesSC(font));
1171 fontModule->fontOsfCB->setEnabled(providesOSF(font));
1175 void GuiDocument::sansChanged(int item)
1177 string const font = tex_fonts_sans[item];
1178 bool scaleable = providesScale(font);
1179 fontModule->scaleSansSB->setEnabled(scaleable);
1180 fontModule->scaleSansLA->setEnabled(scaleable);
1184 void GuiDocument::ttChanged(int item)
1186 string const font = tex_fonts_monospaced[item];
1187 bool scaleable = providesScale(font);
1188 fontModule->scaleTypewriterSB->setEnabled(scaleable);
1189 fontModule->scaleTypewriterLA->setEnabled(scaleable);
1193 void GuiDocument::updatePagestyle(string const & items, string const & sel)
1196 pageLayoutModule->pagestyleCO->clear();
1197 pageLayoutModule->pagestyleCO->addItem(qt_("Default"));
1199 for (int n = 0; !token(items, '|', n).empty(); ++n) {
1200 string style = token(items, '|', n);
1201 QString style_gui = qt_(style);
1202 pagestyles.push_back(pair<string, QString>(style, style_gui));
1203 pageLayoutModule->pagestyleCO->addItem(style_gui);
1206 if (sel == "default") {
1207 pageLayoutModule->pagestyleCO->setCurrentIndex(0);
1213 for (size_t i = 0; i < pagestyles.size(); ++i)
1214 if (pagestyles[i].first == sel)
1215 nn = pageLayoutModule->pagestyleCO->findText(pagestyles[i].second);
1218 pageLayoutModule->pagestyleCO->setCurrentIndex(nn);
1222 void GuiDocument::browseLayout()
1224 QString const label1 = qt_("Layouts|#o#O");
1225 QString const dir1 = toqstr(lyxrc.document_path);
1226 QStringList const filter(qt_("LyX Layout (*.layout)"));
1227 QString file = browseRelFile(QString(), bufferFilepath(),
1228 qt_("Local layout file"), filter, false,
1231 if (!file.endsWith(".layout"))
1234 FileName layoutFile = support::makeAbsPath(fromqstr(file),
1235 fromqstr(bufferFilepath()));
1237 int const ret = Alert::prompt(_("Local layout file"),
1238 _("The layout file you have selected is a local layout\n"
1239 "file, not one in the system or user directory. Your\n"
1240 "document may not work with this layout if you do not\n"
1241 "keep the layout file in the document directory."),
1242 1, 1, _("&Set Layout"), _("&Cancel"));
1246 // load the layout file
1247 LayoutFileList & bcl = LayoutFileList::get();
1248 string classname = layoutFile.onlyFileName();
1249 // this will update an existing layout if that layout has been loaded before.
1250 LayoutFileIndex name = bcl.addLocalLayout(
1251 classname.substr(0, classname.size() - 7),
1252 layoutFile.onlyPath().absFilename());
1255 Alert::error(_("Error"),
1256 _("Unable to read local layout file."));
1260 // do not trigger classChanged if there is no change.
1261 if (latexModule->classCO->currentText() == toqstr(name))
1265 int idx = latexModule->classCO->findText(toqstr(name));
1267 classes_model_.insertRow(0, toqstr(name), name);
1268 latexModule->classCO->setCurrentIndex(0);
1270 latexModule->classCO->setCurrentIndex(idx);
1276 void GuiDocument::browseMaster()
1278 QString const title = qt_("Select master document");
1279 QString const dir1 = toqstr(lyxrc.document_path);
1280 QString const old = latexModule->childDocLE->text();
1281 QString const docpath = toqstr(support::onlyPath(buffer().absFileName()));
1282 QStringList const filter(qt_("LyX Files (*.lyx)"));
1283 QString file = browseRelFile(old, docpath, title, filter, false,
1284 qt_("Documents|#o#O"), toqstr(lyxrc.document_path));
1286 latexModule->childDocLE->setText(file);
1290 void GuiDocument::classChanged()
1292 int idx = latexModule->classCO->currentIndex();
1295 string const classname = classes_model_.getIDString(idx);
1297 // check whether the selected modules have changed.
1298 bool modules_changed = false;
1299 unsigned int const srows = selectedModel()->rowCount();
1300 if (srows != bp_.getModules().size())
1301 modules_changed = true;
1303 list<string>::const_iterator mit = bp_.getModules().begin();
1304 list<string>::const_iterator men = bp_.getModules().end();
1305 for (unsigned int i = 0; i < srows && mit != men; ++i, ++mit)
1306 if (selectedModel()->getIDString(i) != *mit) {
1307 modules_changed = true;
1312 if (modules_changed || lyxrc.auto_reset_options) {
1313 if (applyPB->isEnabled()) {
1314 int const ret = Alert::prompt(_("Unapplied changes"),
1315 _("Some changes in the dialog were not yet applied.\n"
1316 "If you do not apply now, they will be lost after this action."),
1317 1, 1, _("&Apply"), _("&Dismiss"));
1323 // We load the TextClass as soon as it is selected. This is
1324 // necessary so that other options in the dialog can be updated
1325 // according to the new class. Note, however, that, if you use
1326 // the scroll wheel when sitting on the combo box, we'll load a
1327 // lot of TextClass objects very quickly....
1328 if (!bp_.setBaseClass(classname)) {
1329 Alert::error(_("Error"), _("Unable to set document class."));
1332 if (lyxrc.auto_reset_options)
1333 bp_.useClassDefaults();
1335 // With the introduction of modules came a distinction between the base
1336 // class and the document class. The former corresponds to the main layout
1337 // file; the latter is that plus the modules (or the document-specific layout,
1338 // or whatever else there could be). Our parameters come from the document
1339 // class. So when we set the base class, we also need to recreate the document
1340 // class. Otherwise, we still have the old one.
1341 bp_.makeDocumentClass();
1342 // the new class may require some default modules.
1343 updateSelectedModules();
1349 // This is an insanely complicated attempt to make this sort of thing
1350 // work with RTL languages.
1351 docstring formatStrVec(vector<string> const & v, docstring const & s)
1353 //this mess formats the list as "v[0], v[1], ..., [s] v[n]"
1357 return from_ascii(v[0]);
1358 if (v.size() == 2) {
1359 docstring retval = _("%1$s and %2$s");
1360 retval = subst(retval, _("and"), s);
1361 return bformat(retval, from_ascii(v[0]), from_ascii(v[1]));
1363 // The idea here is to format all but the last two items...
1364 int const vSize = v.size();
1365 docstring t2 = _("%1$s, %2$s");
1366 docstring retval = from_ascii(v[0]);
1367 for (int i = 1; i < vSize - 2; ++i)
1368 retval = bformat(t2, retval, from_ascii(v[i]));
1369 //...and then to plug them, and the last two, into this schema
1370 docstring t = _("%1$s, %2$s, and %3$s");
1371 t = subst(t, _("and"), s);
1372 return bformat(t, retval, from_ascii(v[vSize - 2]), from_ascii(v[vSize - 1]));
1375 vector<string> idsToNames(vector<string> const & idList)
1377 vector<string> retval;
1378 vector<string>::const_iterator it = idList.begin();
1379 vector<string>::const_iterator end = idList.end();
1380 for (; it != end; ++it) {
1381 LyXModule const * const mod = moduleList[*it];
1383 retval.push_back(*it + " (Unavailable)");
1385 retval.push_back(mod->getName());
1392 void GuiDocument::modulesToParams(BufferParams & bp)
1394 // update list of loaded modules
1395 bp.clearLayoutModules();
1396 int const srows = modules_sel_model_.rowCount();
1397 for (int i = 0; i < srows; ++i)
1398 bp.addLayoutModule(modules_sel_model_.getIDString(i));
1400 // update the list of removed modules
1401 bp.clearRemovedModules();
1402 list<string> const & reqmods = bp.baseClass()->defaultModules();
1403 list<string>::const_iterator rit = reqmods.begin();
1404 list<string>::const_iterator ren = reqmods.end();
1406 // check each of the default modules
1407 for (; rit != ren; rit++) {
1408 list<string>::const_iterator mit = bp.getModules().begin();
1409 list<string>::const_iterator men = bp.getModules().end();
1411 for (; mit != men; mit++) {
1418 // the module isn't present so must have been removed by the user
1419 bp.addRemovedModule(*rit);
1424 void GuiDocument::modulesChanged()
1426 modulesToParams(bp_);
1427 bp_.makeDocumentClass();
1432 void GuiDocument::updateModuleInfo()
1434 selectionManager->update();
1436 //Module description
1437 bool const focus_on_selected = selectionManager->selectedFocused();
1438 QListView const * const lv =
1439 focus_on_selected ? modulesModule->selectedLV : modulesModule->availableLV;
1440 if (lv->selectionModel()->selectedIndexes().isEmpty()) {
1441 modulesModule->infoML->document()->clear();
1444 QModelIndex const & idx = lv->selectionModel()->currentIndex();
1445 GuiIdListModel const & id_model =
1446 focus_on_selected ? modules_sel_model_ : modules_av_model_;
1447 string const modName = id_model.getIDString(idx.row());
1448 docstring desc = getModuleDescription(modName);
1450 vector<string> pkglist = getPackageList(modName);
1451 docstring pkgdesc = formatStrVec(pkglist, _("and"));
1452 if (!pkgdesc.empty()) {
1455 desc += bformat(_("Package(s) required: %1$s."), pkgdesc);
1458 pkglist = getRequiredList(modName);
1459 if (!pkglist.empty()) {
1460 vector<string> const reqdescs = idsToNames(pkglist);
1461 pkgdesc = formatStrVec(reqdescs, _("or"));
1464 desc += bformat(_("Module required: %1$s."), pkgdesc);
1467 pkglist = getExcludedList(modName);
1468 if (!pkglist.empty()) {
1469 vector<string> const reqdescs = idsToNames(pkglist);
1470 pkgdesc = formatStrVec(reqdescs, _( "and"));
1473 desc += bformat(_("Modules excluded: %1$s."), pkgdesc);
1476 if (!isModuleAvailable(modName)) {
1479 desc += _("WARNING: Some required packages are unavailable!");
1482 modulesModule->infoML->document()->setPlainText(toqstr(desc));
1486 void GuiDocument::updateNumbering()
1488 DocumentClass const & tclass = documentClass();
1490 numberingModule->tocTW->setUpdatesEnabled(false);
1491 numberingModule->tocTW->clear();
1493 int const depth = numberingModule->depthSL->value();
1494 int const toc = numberingModule->tocSL->value();
1495 QString const no = qt_("No");
1496 QString const yes = qt_("Yes");
1497 QTreeWidgetItem * item = 0;
1499 DocumentClass::const_iterator lit = tclass.begin();
1500 DocumentClass::const_iterator len = tclass.end();
1501 for (; lit != len; ++lit) {
1502 int const toclevel = lit->toclevel;
1503 if (toclevel != Layout::NOT_IN_TOC && lit->labeltype == LABEL_COUNTER) {
1504 item = new QTreeWidgetItem(numberingModule->tocTW);
1505 item->setText(0, toqstr(translateIfPossible(lit->name())));
1506 item->setText(1, (toclevel <= depth) ? yes : no);
1507 item->setText(2, (toclevel <= toc) ? yes : no);
1511 numberingModule->tocTW->setUpdatesEnabled(true);
1512 numberingModule->tocTW->update();
1516 void GuiDocument::apply(BufferParams & params)
1519 preambleModule->apply(params);
1522 params.setCiteEngine(ENGINE_BASIC);
1524 if (biblioModule->citeNatbibRB->isChecked()) {
1525 bool const use_numerical_citations =
1526 biblioModule->citeStyleCO->currentIndex();
1527 if (use_numerical_citations)
1528 params.setCiteEngine(ENGINE_NATBIB_NUMERICAL);
1530 params.setCiteEngine(ENGINE_NATBIB_AUTHORYEAR);
1532 } else if (biblioModule->citeJurabibRB->isChecked())
1533 params.setCiteEngine(ENGINE_JURABIB);
1535 params.use_bibtopic =
1536 biblioModule->bibtopicCB->isChecked();
1538 // language & quotes
1539 if (langModule->defaultencodingRB->isChecked()) {
1540 params.inputenc = "auto";
1542 int i = langModule->encodingCO->currentIndex();
1544 params.inputenc = "default";
1546 QString const enc_gui =
1547 langModule->encodingCO->currentText();
1548 Encodings::const_iterator it = encodings.begin();
1549 Encodings::const_iterator const end = encodings.end();
1551 for (; it != end; ++it) {
1552 if (qt_(it->guiName()) == enc_gui) {
1553 params.inputenc = it->latexName();
1559 // should not happen
1560 lyxerr << "GuiDocument::apply: Unknown encoding! Resetting to default" << endl;
1561 params.inputenc = "default";
1566 InsetQuotes::QuoteLanguage lga = InsetQuotes::EnglishQuotes;
1567 switch (langModule->quoteStyleCO->currentIndex()) {
1569 lga = InsetQuotes::EnglishQuotes;
1572 lga = InsetQuotes::SwedishQuotes;
1575 lga = InsetQuotes::GermanQuotes;
1578 lga = InsetQuotes::PolishQuotes;
1581 lga = InsetQuotes::FrenchQuotes;
1584 lga = InsetQuotes::DanishQuotes;
1587 params.quotes_language = lga;
1589 QString const lang = langModule->languageCO->itemData(
1590 langModule->languageCO->currentIndex()).toString();
1591 params.language = lyx::languages.getLanguage(fromqstr(lang));
1594 if (params.documentClass().hasTocLevels()) {
1595 params.tocdepth = numberingModule->tocSL->value();
1596 params.secnumdepth = numberingModule->depthSL->value();
1600 params.user_defined_bullet(0) = bulletsModule->bullet(0);
1601 params.user_defined_bullet(1) = bulletsModule->bullet(1);
1602 params.user_defined_bullet(2) = bulletsModule->bullet(2);
1603 params.user_defined_bullet(3) = bulletsModule->bullet(3);
1606 params.graphicsDriver =
1607 tex_graphics[latexModule->psdriverCO->currentIndex()];
1610 int idx = latexModule->classCO->currentIndex();
1612 string const classname = classes_model_.getIDString(idx);
1613 params.setBaseClass(classname);
1617 modulesToParams(params);
1619 if (mathsModule->amsautoCB->isChecked()) {
1620 params.use_amsmath = BufferParams::package_auto;
1622 if (mathsModule->amsCB->isChecked())
1623 params.use_amsmath = BufferParams::package_on;
1625 params.use_amsmath = BufferParams::package_off;
1628 if (mathsModule->esintautoCB->isChecked())
1629 params.use_esint = BufferParams::package_auto;
1631 if (mathsModule->esintCB->isChecked())
1632 params.use_esint = BufferParams::package_on;
1634 params.use_esint = BufferParams::package_off;
1637 if (pageLayoutModule->pagestyleCO->currentIndex() == 0)
1638 params.pagestyle = "default";
1640 QString style_gui = pageLayoutModule->pagestyleCO->currentText();
1641 for (size_t i = 0; i != pagestyles.size(); ++i)
1642 if (pagestyles[i].second == style_gui)
1643 params.pagestyle = pagestyles[i].first;
1646 switch (textLayoutModule->lspacingCO->currentIndex()) {
1648 params.spacing().set(Spacing::Single);
1651 params.spacing().set(Spacing::Onehalf);
1654 params.spacing().set(Spacing::Double);
1657 params.spacing().set(Spacing::Other,
1658 fromqstr(textLayoutModule->lspacingLE->text()));
1662 if (textLayoutModule->twoColumnCB->isChecked())
1667 // text should have passed validation
1668 params.listings_params =
1669 InsetListingsParams(fromqstr(textLayoutModule->listingsED->toPlainText())).params();
1671 if (textLayoutModule->indentRB->isChecked())
1672 params.paragraph_separation = BufferParams::ParagraphIndentSeparation;
1674 params.paragraph_separation = BufferParams::ParagraphSkipSeparation;
1676 switch (textLayoutModule->skipCO->currentIndex()) {
1678 params.setDefSkip(VSpace(VSpace::SMALLSKIP));
1681 params.setDefSkip(VSpace(VSpace::MEDSKIP));
1684 params.setDefSkip(VSpace(VSpace::BIGSKIP));
1689 widgetsToLength(textLayoutModule->skipLE,
1690 textLayoutModule->skipLengthCO)
1692 params.setDefSkip(vs);
1696 // DocumentDefskipCB assures that this never happens
1697 // so Assert then !!! - jbl
1698 params.setDefSkip(VSpace(VSpace::MEDSKIP));
1703 fromqstr(latexModule->optionsLE->text());
1705 params.use_default_options =
1706 latexModule->defaultOptionsCB->isChecked();
1708 if (latexModule->childDocGB->isChecked())
1710 fromqstr(latexModule->childDocLE->text());
1712 params.master = string();
1714 params.float_placement = floatModule->get();
1718 tex_fonts_roman[fontModule->fontsRomanCO->currentIndex()];
1721 tex_fonts_sans[fontModule->fontsSansCO->currentIndex()];
1723 params.fontsTypewriter =
1724 tex_fonts_monospaced[fontModule->fontsTypewriterCO->currentIndex()];
1727 fromqstr(fontModule->cjkFontLE->text());
1729 params.fontsSansScale = fontModule->scaleSansSB->value();
1731 params.fontsTypewriterScale = fontModule->scaleTypewriterSB->value();
1733 params.fontsSC = fontModule->fontScCB->isChecked();
1735 params.fontsOSF = fontModule->fontOsfCB->isChecked();
1737 params.fontsDefaultFamily = GuiDocument::fontfamilies[
1738 fontModule->fontsDefaultCO->currentIndex()];
1740 if (fontModule->fontsizeCO->currentIndex() == 0)
1741 params.fontsize = "default";
1744 fromqstr(fontModule->fontsizeCO->currentText());
1747 params.papersize = PAPER_SIZE(
1748 pageLayoutModule->papersizeCO->currentIndex());
1750 // custom, A3, B3 and B4 paper sizes need geometry
1751 int psize = pageLayoutModule->papersizeCO->currentIndex();
1752 bool geom_papersize = (psize == 1 || psize == 5 || psize == 8 || psize == 9);
1754 params.paperwidth = widgetsToLength(pageLayoutModule->paperwidthLE,
1755 pageLayoutModule->paperwidthUnitCO);
1757 params.paperheight = widgetsToLength(pageLayoutModule->paperheightLE,
1758 pageLayoutModule->paperheightUnitCO);
1760 if (pageLayoutModule->facingPagesCB->isChecked())
1761 params.sides = TwoSides;
1763 params.sides = OneSide;
1765 if (pageLayoutModule->landscapeRB->isChecked())
1766 params.orientation = ORIENTATION_LANDSCAPE;
1768 params.orientation = ORIENTATION_PORTRAIT;
1771 params.use_geometry = !marginsModule->marginCB->isChecked()
1774 Ui::MarginsUi const * m = marginsModule;
1776 params.leftmargin = widgetsToLength(m->innerLE, m->innerUnit);
1777 params.topmargin = widgetsToLength(m->topLE, m->topUnit);
1778 params.rightmargin = widgetsToLength(m->outerLE, m->outerUnit);
1779 params.bottommargin = widgetsToLength(m->bottomLE, m->bottomUnit);
1780 params.headheight = widgetsToLength(m->headheightLE, m->headheightUnit);
1781 params.headsep = widgetsToLength(m->headsepLE, m->headsepUnit);
1782 params.footskip = widgetsToLength(m->footskipLE, m->footskipUnit);
1783 params.columnsep = widgetsToLength(m->columnsepLE, m->columnsepUnit);
1785 branchesModule->apply(params);
1788 PDFOptions & pdf = params.pdfoptions();
1789 pdf.use_hyperref = pdfSupportModule->use_hyperrefGB->isChecked();
1790 pdf.title = fromqstr(pdfSupportModule->titleLE->text());
1791 pdf.author = fromqstr(pdfSupportModule->authorLE->text());
1792 pdf.subject = fromqstr(pdfSupportModule->subjectLE->text());
1793 pdf.keywords = fromqstr(pdfSupportModule->keywordsLE->text());
1795 pdf.bookmarks = pdfSupportModule->bookmarksGB->isChecked();
1796 pdf.bookmarksnumbered = pdfSupportModule->bookmarksnumberedCB->isChecked();
1797 pdf.bookmarksopen = pdfSupportModule->bookmarksopenGB->isChecked();
1798 pdf.bookmarksopenlevel = pdfSupportModule->bookmarksopenlevelSB->value();
1800 pdf.breaklinks = pdfSupportModule->breaklinksCB->isChecked();
1801 pdf.pdfborder = pdfSupportModule->pdfborderCB->isChecked();
1802 pdf.pdfusetitle = pdfSupportModule->pdfusetitleCB->isChecked();
1803 pdf.colorlinks = pdfSupportModule->colorlinksCB->isChecked();
1805 backref_opts[pdfSupportModule->backrefCO->currentIndex()];
1806 if (pdfSupportModule->fullscreenCB->isChecked())
1807 pdf.pagemode = pdf.pagemode_fullscreen;
1809 pdf.pagemode.clear();
1810 pdf.quoted_options = pdf.quoted_options_check(
1811 fromqstr(pdfSupportModule->optionsLE->text()));
1815 void GuiDocument::paramsToDialog()
1817 // set the default unit
1818 Length::UNIT defaultUnit = Length::CM;
1819 switch (lyxrc.default_papersize) {
1820 case PAPER_DEFAULT: break;
1822 case PAPER_USLETTER:
1824 case PAPER_USEXECUTIVE:
1825 defaultUnit = Length::IN;
1834 defaultUnit = Length::CM;
1841 preambleModule->update(bp_, id());
1844 biblioModule->citeDefaultRB->setChecked(
1845 bp_.citeEngine() == ENGINE_BASIC);
1847 biblioModule->citeNatbibRB->setChecked(
1848 bp_.citeEngine() == ENGINE_NATBIB_NUMERICAL ||
1849 bp_.citeEngine() == ENGINE_NATBIB_AUTHORYEAR);
1851 biblioModule->citeStyleCO->setCurrentIndex(
1852 bp_.citeEngine() == ENGINE_NATBIB_NUMERICAL);
1854 biblioModule->citeJurabibRB->setChecked(
1855 bp_.citeEngine() == ENGINE_JURABIB);
1857 biblioModule->bibtopicCB->setChecked(
1860 // language & quotes
1861 int const pos = langModule->languageCO->findData(toqstr(
1862 bp_.language->lang()));
1863 langModule->languageCO->setCurrentIndex(pos);
1865 langModule->quoteStyleCO->setCurrentIndex(
1866 bp_.quotes_language);
1868 bool default_enc = true;
1869 if (bp_.inputenc != "auto") {
1870 default_enc = false;
1871 if (bp_.inputenc == "default") {
1872 langModule->encodingCO->setCurrentIndex(0);
1875 Encodings::const_iterator it = encodings.begin();
1876 Encodings::const_iterator const end = encodings.end();
1877 for (; it != end; ++it) {
1878 if (it->latexName() == bp_.inputenc) {
1879 enc_gui = it->guiName();
1883 int const i = langModule->encodingCO->findText(
1886 langModule->encodingCO->setCurrentIndex(i);
1888 // unknown encoding. Set to default.
1892 langModule->defaultencodingRB->setChecked(default_enc);
1893 langModule->otherencodingRB->setChecked(!default_enc);
1896 int const min_toclevel = documentClass().min_toclevel();
1897 int const max_toclevel = documentClass().max_toclevel();
1898 if (documentClass().hasTocLevels()) {
1899 numberingModule->setEnabled(true);
1900 numberingModule->depthSL->setMinimum(min_toclevel - 1);
1901 numberingModule->depthSL->setMaximum(max_toclevel);
1902 numberingModule->depthSL->setValue(bp_.secnumdepth);
1903 numberingModule->tocSL->setMaximum(min_toclevel - 1);
1904 numberingModule->tocSL->setMaximum(max_toclevel);
1905 numberingModule->tocSL->setValue(bp_.tocdepth);
1908 numberingModule->setEnabled(false);
1909 numberingModule->tocTW->clear();
1913 bulletsModule->setBullet(0, bp_.user_defined_bullet(0));
1914 bulletsModule->setBullet(1, bp_.user_defined_bullet(1));
1915 bulletsModule->setBullet(2, bp_.user_defined_bullet(2));
1916 bulletsModule->setBullet(3, bp_.user_defined_bullet(3));
1917 bulletsModule->init();
1920 int nitem = findToken(tex_graphics, bp_.graphicsDriver);
1922 latexModule->psdriverCO->setCurrentIndex(nitem);
1925 mathsModule->amsCB->setChecked(
1926 bp_.use_amsmath == BufferParams::package_on);
1927 mathsModule->amsautoCB->setChecked(
1928 bp_.use_amsmath == BufferParams::package_auto);
1930 mathsModule->esintCB->setChecked(
1931 bp_.use_esint == BufferParams::package_on);
1932 mathsModule->esintautoCB->setChecked(
1933 bp_.use_esint == BufferParams::package_auto);
1935 switch (bp_.spacing().getSpace()) {
1936 case Spacing::Other: nitem = 3; break;
1937 case Spacing::Double: nitem = 2; break;
1938 case Spacing::Onehalf: nitem = 1; break;
1939 case Spacing::Default: case Spacing::Single: nitem = 0; break;
1943 string const & layoutID = bp_.baseClassID();
1944 setLayoutComboByIDString(layoutID);
1946 updatePagestyle(documentClass().opt_pagestyle(),
1949 textLayoutModule->lspacingCO->setCurrentIndex(nitem);
1950 if (bp_.spacing().getSpace() == Spacing::Other) {
1951 textLayoutModule->lspacingLE->setText(
1952 toqstr(bp_.spacing().getValueAsString()));
1956 if (bp_.paragraph_separation == BufferParams::ParagraphIndentSeparation)
1957 textLayoutModule->indentRB->setChecked(true);
1959 textLayoutModule->skipRB->setChecked(true);
1962 switch (bp_.getDefSkip().kind()) {
1963 case VSpace::SMALLSKIP:
1966 case VSpace::MEDSKIP:
1969 case VSpace::BIGSKIP:
1972 case VSpace::LENGTH:
1975 string const length = bp_.getDefSkip().asLyXCommand();
1976 lengthToWidgets(textLayoutModule->skipLE,
1977 textLayoutModule->skipLengthCO,
1978 length, defaultUnit);
1985 textLayoutModule->skipCO->setCurrentIndex(skip);
1988 textLayoutModule->twoColumnCB->setChecked(
1991 // break listings_params to multiple lines
1993 InsetListingsParams(bp_.listings_params).separatedParams();
1994 textLayoutModule->listingsED->setPlainText(toqstr(lstparams));
1996 if (!bp_.options.empty()) {
1997 latexModule->optionsLE->setText(
1998 toqstr(bp_.options));
2000 latexModule->optionsLE->setText(QString());
2004 latexModule->defaultOptionsCB->setChecked(
2005 bp_.use_default_options);
2007 if (!documentClass().options().empty()) {
2008 latexModule->defaultOptionsLE->setText(
2009 toqstr(documentClass().options()));
2011 latexModule->defaultOptionsLE->setText(
2012 toqstr(_("[No options predefined]")));
2015 latexModule->defaultOptionsLE->setEnabled(
2016 bp_.use_default_options
2017 && !documentClass().options().empty());
2019 latexModule->defaultOptionsCB->setEnabled(
2020 !documentClass().options().empty());
2022 if (!bp_.master.empty()) {
2023 latexModule->childDocGB->setChecked(true);
2024 latexModule->childDocLE->setText(
2025 toqstr(bp_.master));
2027 latexModule->childDocLE->setText(QString());
2028 latexModule->childDocGB->setChecked(false);
2031 floatModule->set(bp_.float_placement);
2034 updateFontsize(documentClass().opt_fontsize(),
2037 int n = findToken(tex_fonts_roman, bp_.fontsRoman);
2039 fontModule->fontsRomanCO->setCurrentIndex(n);
2043 n = findToken(tex_fonts_sans, bp_.fontsSans);
2045 fontModule->fontsSansCO->setCurrentIndex(n);
2049 n = findToken(tex_fonts_monospaced, bp_.fontsTypewriter);
2051 fontModule->fontsTypewriterCO->setCurrentIndex(n);
2055 if (!bp_.fontsCJK.empty())
2056 fontModule->cjkFontLE->setText(
2057 toqstr(bp_.fontsCJK));
2059 fontModule->cjkFontLE->setText(QString());
2061 fontModule->fontScCB->setChecked(bp_.fontsSC);
2062 fontModule->fontOsfCB->setChecked(bp_.fontsOSF);
2063 fontModule->scaleSansSB->setValue(bp_.fontsSansScale);
2064 fontModule->scaleTypewriterSB->setValue(bp_.fontsTypewriterScale);
2065 n = findToken(GuiDocument::fontfamilies, bp_.fontsDefaultFamily);
2067 fontModule->fontsDefaultCO->setCurrentIndex(n);
2070 int const psize = bp_.papersize;
2071 pageLayoutModule->papersizeCO->setCurrentIndex(psize);
2072 setCustomPapersize(psize);
2074 bool const landscape =
2075 bp_.orientation == ORIENTATION_LANDSCAPE;
2076 pageLayoutModule->landscapeRB->setChecked(landscape);
2077 pageLayoutModule->portraitRB->setChecked(!landscape);
2079 pageLayoutModule->facingPagesCB->setChecked(
2080 bp_.sides == TwoSides);
2083 lengthToWidgets(pageLayoutModule->paperwidthLE,
2084 pageLayoutModule->paperwidthUnitCO, bp_.paperwidth, defaultUnit);
2086 lengthToWidgets(pageLayoutModule->paperheightLE,
2087 pageLayoutModule->paperheightUnitCO, bp_.paperheight, defaultUnit);
2090 Ui::MarginsUi * m = marginsModule;
2092 setMargins(!bp_.use_geometry);
2094 lengthToWidgets(m->topLE, m->topUnit,
2095 bp_.topmargin, defaultUnit);
2097 lengthToWidgets(m->bottomLE, m->bottomUnit,
2098 bp_.bottommargin, defaultUnit);
2100 lengthToWidgets(m->innerLE, m->innerUnit,
2101 bp_.leftmargin, defaultUnit);
2103 lengthToWidgets(m->outerLE, m->outerUnit,
2104 bp_.rightmargin, defaultUnit);
2106 lengthToWidgets(m->headheightLE, m->headheightUnit,
2107 bp_.headheight, defaultUnit);
2109 lengthToWidgets(m->headsepLE, m->headsepUnit,
2110 bp_.headsep, defaultUnit);
2112 lengthToWidgets(m->footskipLE, m->footskipUnit,
2113 bp_.footskip, defaultUnit);
2115 lengthToWidgets(m->columnsepLE, m->columnsepUnit,
2116 bp_.columnsep, defaultUnit);
2118 branchesModule->update(bp_);
2121 PDFOptions const & pdf = bp_.pdfoptions();
2122 pdfSupportModule->use_hyperrefGB->setChecked(pdf.use_hyperref);
2123 pdfSupportModule->titleLE->setText(toqstr(pdf.title));
2124 pdfSupportModule->authorLE->setText(toqstr(pdf.author));
2125 pdfSupportModule->subjectLE->setText(toqstr(pdf.subject));
2126 pdfSupportModule->keywordsLE->setText(toqstr(pdf.keywords));
2128 pdfSupportModule->bookmarksGB->setChecked(pdf.bookmarks);
2129 pdfSupportModule->bookmarksnumberedCB->setChecked(pdf.bookmarksnumbered);
2130 pdfSupportModule->bookmarksopenGB->setChecked(pdf.bookmarksopen);
2132 pdfSupportModule->bookmarksopenlevelSB->setValue(pdf.bookmarksopenlevel);
2134 pdfSupportModule->breaklinksCB->setChecked(pdf.breaklinks);
2135 pdfSupportModule->pdfborderCB->setChecked(pdf.pdfborder);
2136 pdfSupportModule->pdfusetitleCB->setChecked(pdf.pdfusetitle);
2137 pdfSupportModule->colorlinksCB->setChecked(pdf.colorlinks);
2139 n = findToken(backref_opts, pdf.backref);
2141 pdfSupportModule->backrefCO->setCurrentIndex(n);
2143 pdfSupportModule->fullscreenCB->setChecked
2144 (pdf.pagemode == pdf.pagemode_fullscreen);
2146 pdfSupportModule->optionsLE->setText(
2147 toqstr(pdf.quoted_options));
2151 void GuiDocument::applyView()
2157 void GuiDocument::saveDocDefault()
2159 // we have to apply the params first
2165 void GuiDocument::updateAvailableModules()
2167 modules_av_model_.clear();
2168 list<modInfoStruct> const & modInfoList = getModuleInfo();
2169 list<modInfoStruct>::const_iterator mit = modInfoList.begin();
2170 list<modInfoStruct>::const_iterator men = modInfoList.end();
2171 for (int i = 0; mit != men; ++mit, ++i)
2172 modules_av_model_.insertRow(i, mit->name, mit->id,
2177 void GuiDocument::updateSelectedModules()
2179 modules_sel_model_.clear();
2180 list<modInfoStruct> const selModList = getSelectedModules();
2181 list<modInfoStruct>::const_iterator mit = selModList.begin();
2182 list<modInfoStruct>::const_iterator men = selModList.end();
2183 for (int i = 0; mit != men; ++mit, ++i)
2184 modules_sel_model_.insertRow(i, mit->name, mit->id,
2189 void GuiDocument::updateContents()
2191 // Nothing to do here as the document settings is not cursor dependant.
2196 void GuiDocument::useClassDefaults()
2198 if (applyPB->isEnabled()) {
2199 int const ret = Alert::prompt(_("Unapplied changes"),
2200 _("Some changes in the dialog were not yet applied.\n"
2201 "If you do not apply now, they will be lost after this action."),
2202 1, 1, _("&Apply"), _("&Dismiss"));
2207 int idx = latexModule->classCO->currentIndex();
2208 string const classname = classes_model_.getIDString(idx);
2209 if (!bp_.setBaseClass(classname)) {
2210 Alert::error(_("Error"), _("Unable to set document class."));
2213 bp_.useClassDefaults();
2218 void GuiDocument::setLayoutComboByIDString(string const & idString)
2220 int idx = classes_model_.findIDString(idString);
2222 Alert::warning(_("Can't set layout!"),
2223 bformat(_("Unable to set layout for ID: %1$s"), from_utf8(idString)));
2225 latexModule->classCO->setCurrentIndex(idx);
2229 bool GuiDocument::isValid()
2231 return validateListingsParameters().isEmpty()
2232 && (textLayoutModule->skipCO->currentIndex() != 3
2233 || !textLayoutModule->skipLE->text().isEmpty());
2237 char const * const GuiDocument::fontfamilies[5] = {
2238 "default", "rmdefault", "sfdefault", "ttdefault", ""
2242 char const * GuiDocument::fontfamilies_gui[5] = {
2243 N_("Default"), N_("Roman"), N_("Sans Serif"), N_("Typewriter"), ""
2247 bool GuiDocument::initialiseParams(string const &)
2249 BufferView const * view = bufferview();
2251 bp_ = BufferParams();
2255 bp_ = view->buffer().params();
2257 updateAvailableModules();
2258 updateSelectedModules();
2259 //FIXME It'd be nice to make sure here that the selected
2260 //modules are consistent: That required modules are actually
2261 //selected, and that we don't have conflicts. If so, we could
2262 //at least pop up a warning.
2268 void GuiDocument::clearParams()
2270 bp_ = BufferParams();
2274 BufferId GuiDocument::id() const
2276 BufferView const * const view = bufferview();
2277 return view? &view->buffer() : 0;
2281 list<GuiDocument::modInfoStruct> const & GuiDocument::getModuleInfo()
2283 return moduleNames_;
2287 list<GuiDocument::modInfoStruct> const GuiDocument::getSelectedModules()
2289 list<string> const & mods = params().getModules();
2290 list<string>::const_iterator it = mods.begin();
2291 list<string>::const_iterator end = mods.end();
2292 list<modInfoStruct> mInfo;
2293 for (; it != end; ++it) {
2296 LyXModule * mod = moduleList[*it];
2298 m.name = qt_(mod->getName());
2300 m.name = toqstr(*it) + toqstr(" (") + qt_("Not Found") + toqstr(")");
2307 DocumentClass const & GuiDocument::documentClass() const
2309 return bp_.documentClass();
2313 static void dispatch_bufferparams(Dialog const & dialog,
2314 BufferParams const & bp, FuncCode lfun)
2317 ss << "\\begin_header\n";
2319 ss << "\\end_header\n";
2320 dialog.dispatch(FuncRequest(lfun, ss.str()));
2324 void GuiDocument::dispatchParams()
2326 // This must come first so that a language change is correctly noticed
2329 // Apply the BufferParams. Note that this will set the base class
2330 // and then update the buffer's layout.
2331 dispatch_bufferparams(*this, params(), LFUN_BUFFER_PARAMS_APPLY);
2333 if (!params().master.empty()) {
2334 FileName const master_file = support::makeAbsPath(params().master,
2335 support::onlyPath(buffer().absFileName()));
2336 if (isLyXFilename(master_file.absFilename())) {
2337 Buffer * master = checkAndLoadLyXFile(master_file);
2338 const_cast<Buffer &>(buffer()).setParent(master);
2342 // Generate the colours requested by each new branch.
2343 BranchList & branchlist = params().branchlist();
2344 if (!branchlist.empty()) {
2345 BranchList::const_iterator it = branchlist.begin();
2346 BranchList::const_iterator const end = branchlist.end();
2347 for (; it != end; ++it) {
2348 docstring const & current_branch = it->branch();
2349 Branch const * branch = branchlist.find(current_branch);
2350 string const x11hexname = X11hexname(branch->color());
2351 // display the new color
2352 docstring const str = current_branch + ' ' + from_ascii(x11hexname);
2353 dispatch(FuncRequest(LFUN_SET_COLOR, str));
2356 // Open insets of selected branches, close deselected ones
2357 dispatch(FuncRequest(LFUN_ALL_INSETS_TOGGLE,
2360 // FIXME: If we used an LFUN, we would not need those two lines:
2361 BufferView * bv = const_cast<BufferView *>(bufferview());
2362 bv->processUpdateFlags(Update::Force | Update::FitCursor);
2366 void GuiDocument::setLanguage() const
2368 Language const * const newL = bp_.language;
2369 if (buffer().params().language == newL)
2372 string const & lang_name = newL->lang();
2373 dispatch(FuncRequest(LFUN_BUFFER_LANGUAGE, lang_name));
2377 void GuiDocument::saveAsDefault() const
2379 dispatch_bufferparams(*this, params(), LFUN_BUFFER_SAVE_AS_DEFAULT);
2383 bool GuiDocument::isFontAvailable(string const & font) const
2385 if (font == "default" || font == "cmr"
2386 || font == "cmss" || font == "cmtt")
2387 // these are standard
2389 if (font == "lmodern" || font == "lmss" || font == "lmtt")
2390 return LaTeXFeatures::isAvailable("lmodern");
2391 if (font == "times" || font == "palatino"
2392 || font == "helvet" || font == "courier")
2393 return LaTeXFeatures::isAvailable("psnfss");
2394 if (font == "cmbr" || font == "cmtl")
2395 return LaTeXFeatures::isAvailable("cmbright");
2396 if (font == "utopia")
2397 return LaTeXFeatures::isAvailable("utopia")
2398 || LaTeXFeatures::isAvailable("fourier");
2399 if (font == "beraserif" || font == "berasans"
2400 || font == "beramono")
2401 return LaTeXFeatures::isAvailable("bera");
2402 return LaTeXFeatures::isAvailable(font);
2406 bool GuiDocument::providesOSF(string const & font) const
2409 return isFontAvailable("eco");
2410 if (font == "palatino")
2411 return isFontAvailable("mathpazo");
2416 bool GuiDocument::providesSC(string const & font) const
2418 if (font == "palatino")
2419 return isFontAvailable("mathpazo");
2420 if (font == "utopia")
2421 return isFontAvailable("fourier");
2426 bool GuiDocument::providesScale(string const & font) const
2428 return font == "helvet" || font == "luximono"
2429 || font == "berasans" || font == "beramono";
2433 void GuiDocument::loadModuleInfo()
2435 moduleNames_.clear();
2436 LyXModuleList::const_iterator it = moduleList.begin();
2437 LyXModuleList::const_iterator end = moduleList.end();
2438 for (; it != end; ++it) {
2441 m.name = qt_(it->getName());
2442 // this is supposed to give us the first sentence of the description
2443 QString desc = qt_(it->getDescription());
2444 int const pos = desc.indexOf(".");
2446 desc.truncate(pos + 1);
2447 m.description = desc;
2448 moduleNames_.push_back(m);
2453 Dialog * createGuiDocument(GuiView & lv) { return new GuiDocument(lv); }
2456 } // namespace frontend
2459 #include "GuiDocument_moc.cpp"