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 "LayoutFile.h"
17 #include "BranchList.h"
18 #include "buffer_funcs.h"
20 #include "BufferParams.h"
21 #include "BufferView.h"
24 #include "FloatPlacement.h"
25 #include "FuncRequest.h"
26 #include "support/gettext.h"
27 #include "GuiBranches.h"
29 #include "LaTeXFeatures.h"
30 #include "LaTeXHighlighter.h"
32 #include "LengthCombo.h"
33 #include "LyXRC.h" // defaultUnit
34 #include "ModuleList.h"
35 #include "OutputParams.h"
36 #include "PanelStack.h"
37 #include "PDFOptions.h"
38 #include "qt_helpers.h"
40 #include "Validator.h"
42 #include "insets/InsetListingsParams.h"
44 #include "support/debug.h"
45 #include "support/FileName.h"
46 #include "support/filetools.h"
47 #include "support/lstrings.h"
49 #include "frontends/alert.h"
51 #include <QCloseEvent>
53 #include <QTextCursor>
63 using namespace lyx::support;
68 char const * const tex_graphics[] =
70 "default", "dvips", "dvitops", "emtex",
71 "ln", "oztex", "textures", "none", ""
75 char const * const tex_graphics_gui[] =
77 N_("Default"), "Dvips", "DVItoPS", "EmTeX",
78 "LN", "OzTeX", "Textures", N_("None"), ""
82 char const * const tex_fonts_roman[] =
84 "default", "cmr", "lmodern", "ae", "times", "palatino",
85 "charter", "newcent", "bookman", "utopia", "beraserif",
86 "ccfonts", "chancery", ""
90 char const * tex_fonts_roman_gui[] =
92 N_("Default"), N_("Computer Modern Roman"), N_("Latin Modern Roman"),
93 N_("AE (Almost European)"), N_("Times Roman"), N_("Palatino"),
94 N_("Bitstream Charter"), N_("New Century Schoolbook"), N_("Bookman"),
95 N_("Utopia"), N_("Bera Serif"), N_("Concrete Roman"), N_("Zapf Chancery"),
100 char const * const tex_fonts_sans[] =
102 "default", "cmss", "lmss", "helvet", "avant", "berasans", "cmbr", ""
106 char const * tex_fonts_sans_gui[] =
108 N_("Default"), N_("Computer Modern Sans"), N_("Latin Modern Sans"),
109 N_("Helvetica"), N_("Avant Garde"), N_("Bera Sans"), N_("CM Bright"), ""
113 char const * const tex_fonts_monospaced[] =
115 "default", "cmtt", "lmtt", "courier", "beramono", "luximono", "cmtl", ""
119 char const * tex_fonts_monospaced_gui[] =
121 N_("Default"), N_("Computer Modern Typewriter"),
122 N_("Latin Modern Typewriter"), N_("Courier"), N_("Bera Mono"),
123 N_("LuxiMono"), N_("CM Typewriter Light"), ""
127 vector<pair<string, lyx::docstring> > pagestyles;
130 } // anonymous namespace
135 // used when sorting the textclass list.
136 class less_textclass_avail_desc
137 : public binary_function<string, string, int>
140 int operator()(string const & lhs, string const & rhs) const
142 // Ordering criteria:
143 // 1. Availability of text class
144 // 2. Description (lexicographic)
145 LayoutFile const & tc1 = LayoutFileList::get()[lhs];
146 LayoutFile const & tc2 = LayoutFileList::get()[rhs];
147 return (tc1.isTeXClassAvailable() && !tc2.isTeXClassAvailable()) ||
148 (tc1.isTeXClassAvailable() == tc2.isTeXClassAvailable() &&
149 _(tc1.description()) < _(tc2.description()));
159 QModelIndex getSelectedIndex(QListView * lv)
161 QModelIndex retval = QModelIndex();
162 QModelIndexList selIdx =
163 lv->selectionModel()->selectedIndexes();
165 retval = selIdx.first();
171 vector<string> getRequiredList(string const & modName)
173 LyXModule const * const mod = moduleList[modName];
175 return vector<string>(); //empty such thing
176 return mod->getRequiredModules();
180 vector<string> getExcludedList(string const & modName)
182 LyXModule const * const mod = moduleList[modName];
184 return vector<string>(); //empty such thing
185 return mod->getExcludedModules();
189 docstring getModuleDescription(string const & modName)
191 LyXModule const * const mod = moduleList[modName];
193 return _("Module not found!");
194 return _(mod->getDescription());
198 vector<string> getPackageList(string const & modName)
200 LyXModule const * const mod = moduleList[modName];
202 return vector<string>(); //empty such thing
203 return mod->getPackageList();
207 bool isModuleAvailable(string const & modName)
209 LyXModule * mod = moduleList[modName];
212 return mod->isAvailable();
214 } //anonymous namespace
217 ModuleSelMan::ModuleSelMan(
218 QListView * availableLV,
219 QListView * selectedLV,
223 QPushButton * downPB,
224 GuiIdListModel * availableModel,
225 GuiIdListModel * selectedModel) :
226 GuiSelectionManager(availableLV, selectedLV, addPB, delPB,
227 upPB, downPB, availableModel, selectedModel)
231 void ModuleSelMan::updateAddPB()
233 int const arows = availableModel->rowCount();
234 QModelIndexList const availSels =
235 availableLV->selectionModel()->selectedIndexes();
236 if (arows == 0 || availSels.isEmpty() || isSelected(availSels.first())) {
237 addPB->setEnabled(false);
241 QModelIndex const & idx = availableLV->selectionModel()->currentIndex();
242 string const modName = getAvailableModel()->getIDString(idx.row());
243 vector<string> reqs = getRequiredList(modName);
244 vector<string> excl = getExcludedList(modName);
246 if (reqs.empty() && excl.empty()) {
247 addPB->setEnabled(true);
251 int const srows = selectedModel->rowCount();
252 vector<string> selModList;
253 for (int i = 0; i < srows; ++i)
254 selModList.push_back(getSelectedModel()->getIDString(i));
256 vector<string>::const_iterator selModStart = selModList.begin();
257 vector<string>::const_iterator selModEnd = selModList.end();
259 //Check whether some required module is available
261 bool foundOne = false;
262 vector<string>::const_iterator it = reqs.begin();
263 vector<string>::const_iterator end = reqs.end();
264 for (; it != end; ++it) {
265 if (find(selModStart, selModEnd, *it) != selModEnd) {
271 addPB->setEnabled(false);
276 //Check whether any excluded module is being used
278 vector<string>::const_iterator it = excl.begin();
279 vector<string>::const_iterator end = excl.end();
280 for (; it != end; ++it) {
281 if (find(selModStart, selModEnd, *it) != selModEnd) {
282 addPB->setEnabled(false);
288 addPB->setEnabled(true);
292 void ModuleSelMan::updateDownPB()
294 int const srows = selectedModel->rowCount();
296 downPB->setEnabled(false);
299 QModelIndexList const selSels =
300 selectedLV->selectionModel()->selectedIndexes();
301 //disable if empty or last item is selected
302 if (selSels.empty() || selSels.first().row() == srows - 1) {
303 downPB->setEnabled(false);
306 //determine whether immediately succeding element requires this one
307 QModelIndex const & curIdx = selectedLV->selectionModel()->currentIndex();
308 int curRow = curIdx.row();
309 if (curRow < 0 || curRow >= srows - 1) { //this shouldn't happen...
310 downPB->setEnabled(false);
313 string const curModName = getSelectedModel()->getIDString(curRow);
314 string const nextModName = getSelectedModel()->getIDString(curRow + 1);
316 vector<string> reqs = getRequiredList(nextModName);
318 //if it doesn't require anything....
320 downPB->setEnabled(true);
324 //FIXME This should perhaps be more flexible and check whether, even
325 //if this one is required, there is also an earlier one that is required.
326 //enable it if this module isn't required
328 find(reqs.begin(), reqs.end(), curModName) == reqs.end());
331 void ModuleSelMan::updateUpPB()
333 int const srows = selectedModel->rowCount();
335 upPB->setEnabled(false);
338 QModelIndexList const selSels =
339 selectedLV->selectionModel()->selectedIndexes();
340 //disable if empty or first item is selected
341 if (selSels.empty() || selSels.first().row() == 0) {
342 upPB->setEnabled(false);
346 //determine whether immediately preceding element is required by this one
347 QModelIndex const & curIdx = selectedLV->selectionModel()->currentIndex();
348 int curRow = curIdx.row();
349 if (curRow <= -1 || curRow > srows - 1) { //sanity check
350 downPB->setEnabled(false);
353 string const curModName = getSelectedModel()->getIDString(curRow);
354 vector<string> reqs = getRequiredList(curModName);
356 //if this one doesn't require anything....
358 upPB->setEnabled(true);
362 string preModName = getSelectedModel()->getIDString(curRow - 1);
364 //NOTE This is less flexible than it might be. You could check whether, even
365 //if this one is required, there is also an earlier one that is required.
366 //enable it if the preceding module isn't required
367 upPB->setEnabled(find(reqs.begin(), reqs.end(), preModName) == reqs.end());
370 void ModuleSelMan::updateDelPB()
372 int const srows = selectedModel->rowCount();
374 deletePB->setEnabled(false);
377 QModelIndexList const selSels =
378 selectedLV->selectionModel()->selectedIndexes();
379 if (selSels.empty() || selSels.first().row() < 0) {
380 deletePB->setEnabled(false);
384 //determine whether some LATER module requires this one
385 //NOTE Things are arranged so that this is the only way there
386 //can be a problem. At least, we hope so.
387 QModelIndex const & curIdx =
388 selectedLV->selectionModel()->currentIndex();
389 int const curRow = curIdx.row();
390 if (curRow < 0 || curRow >= srows) { //this shouldn't happen
391 deletePB->setEnabled(false);
395 QString const curModName = curIdx.data().toString();
397 //We're looking here for a reason NOT to enable the button. If we
398 //find one, we disable it and return. If we don't, we'll end up at
399 //the end of the function, and then we enable it.
400 for (int i = curRow + 1; i < srows; ++i) {
401 string const thisMod = getSelectedModel()->getIDString(i);
402 vector<string> reqs = getRequiredList(thisMod);
403 //does this one require us?
404 if (find(reqs.begin(), reqs.end(), fromqstr(curModName)) == reqs.end())
408 //OK, so this module requires us
409 //is there an EARLIER module that also satisfies the require?
410 //NOTE We demand that it be earlier to keep the list of modules
411 //consistent with the rule that a module must be proceeded by a
412 //required module. There would be more flexible ways to proceed,
413 //but that would be a lot more complicated, and the logic here is
414 //already complicated. (That's why I've left the debugging code.)
415 //lyxerr << "Testing " << thisMod << std::endl;
416 bool foundOne = false;
417 for (int j = 0; j < curRow; ++j) {
418 string const mod = getSelectedModel()->getIDString(j);
419 //lyxerr << "In loop: Testing " << mod << std::endl;
420 //do we satisfy the require?
421 if (find(reqs.begin(), reqs.end(), mod) != reqs.end()) {
422 //lyxerr << mod << " does the trick." << std::endl;
427 //did we find a module to satisfy the require?
429 //lyxerr << "No matching module found." << std::endl;
430 deletePB->setEnabled(false);
434 //lyxerr << "All's well that ends well." << std::endl;
435 deletePB->setEnabled(true);
439 /////////////////////////////////////////////////////////////////////
443 /////////////////////////////////////////////////////////////////////
445 PreambleModule::PreambleModule(): current_id_(0)
447 // This is not a memory leak. The object will be destroyed
449 (void) new LaTeXHighlighter(preambleTE->document());
450 setFocusProxy(preambleTE);
451 connect(preambleTE, SIGNAL(textChanged()), this, SIGNAL(changed()));
455 void PreambleModule::update(BufferParams const & params, BufferId id)
457 QString preamble = toqstr(params.preamble);
458 // Nothing to do if the params and preamble are unchanged.
459 if (id == current_id_
460 && preamble == preambleTE->document()->toPlainText())
463 QTextCursor cur = preambleTE->textCursor();
464 // Save the coords before switching to the new one.
465 preamble_coords_[current_id_] =
466 make_pair(cur.position(), preambleTE->verticalScrollBar()->value());
468 // Save the params address for further use.
470 preambleTE->document()->setPlainText(preamble);
471 Coords::const_iterator it = preamble_coords_.find(current_id_);
472 if (it == preamble_coords_.end())
473 // First time we open this one.
474 preamble_coords_[current_id_] = make_pair(0,0);
476 // Restore saved coords.
477 QTextCursor cur = preambleTE->textCursor();
478 cur.setPosition(it->second.first);
479 preambleTE->setTextCursor(cur);
480 preambleTE->verticalScrollBar()->setValue(it->second.second);
485 void PreambleModule::apply(BufferParams & params)
487 params.preamble = fromqstr(preambleTE->document()->toPlainText());
491 void PreambleModule::closeEvent(QCloseEvent * e)
493 // Save the coords before closing.
494 QTextCursor cur = preambleTE->textCursor();
495 preamble_coords_[current_id_] =
496 make_pair(cur.position(), preambleTE->verticalScrollBar()->value());
501 /////////////////////////////////////////////////////////////////////
505 /////////////////////////////////////////////////////////////////////
508 GuiDocument::GuiDocument(GuiView & lv)
509 : GuiDialog(lv, "document", qt_("Document Settings")), current_id_(0)
513 connect(okPB, SIGNAL(clicked()), this, SLOT(slotOK()));
514 connect(applyPB, SIGNAL(clicked()), this, SLOT(slotApply()));
515 connect(closePB, SIGNAL(clicked()), this, SLOT(slotClose()));
516 connect(restorePB, SIGNAL(clicked()), this, SLOT(slotRestore()));
518 connect(savePB, SIGNAL(clicked()), this, SLOT(saveDefaultClicked()));
519 connect(defaultPB, SIGNAL(clicked()), this, SLOT(useDefaultsClicked()));
521 // Manage the restore, ok, apply, restore and cancel/close buttons
522 bc().setPolicy(ButtonPolicy::NoRepeatedApplyReadOnlyPolicy);
524 bc().setApply(applyPB);
525 bc().setCancel(closePB);
526 bc().setRestore(restorePB);
528 textLayoutModule = new UiWidget<Ui::TextLayoutUi>;
530 connect(textLayoutModule->lspacingCO, SIGNAL(activated(int)),
531 this, SLOT(change_adaptor()));
532 connect(textLayoutModule->lspacingCO, SIGNAL(activated(int)),
533 this, SLOT(setLSpacing(int)));
534 connect(textLayoutModule->lspacingLE, SIGNAL(textChanged(const QString &)),
535 this, SLOT(change_adaptor()));
536 connect(textLayoutModule->skipRB, SIGNAL(clicked()),
537 this, SLOT(change_adaptor()));
538 connect(textLayoutModule->indentRB, SIGNAL(clicked()),
539 this, SLOT(change_adaptor()));
540 connect(textLayoutModule->skipCO, SIGNAL(activated(int)),
541 this, SLOT(change_adaptor()));
542 connect(textLayoutModule->skipLE, SIGNAL(textChanged(const QString &)),
543 this, SLOT(change_adaptor()));
544 connect(textLayoutModule->skipLengthCO, SIGNAL(activated(int)),
545 this, SLOT(change_adaptor()));
546 connect(textLayoutModule->skipCO, SIGNAL(activated(int)),
547 this, SLOT(setSkip(int)));
548 connect(textLayoutModule->skipRB, SIGNAL(toggled(bool)),
549 this, SLOT(enableSkip(bool)));
550 connect(textLayoutModule->twoColumnCB, SIGNAL(clicked()),
551 this, SLOT(change_adaptor()));
552 connect(textLayoutModule->twoColumnCB, SIGNAL(clicked()),
553 this, SLOT(setColSep()));
554 connect(textLayoutModule->listingsED, SIGNAL(textChanged()),
555 this, SLOT(change_adaptor()));
556 connect(textLayoutModule->bypassCB, SIGNAL(clicked()),
557 this, SLOT(change_adaptor()));
558 connect(textLayoutModule->bypassCB, SIGNAL(clicked()),
559 this, SLOT(set_listings_msg()));
560 connect(textLayoutModule->listingsED, SIGNAL(textChanged()),
561 this, SLOT(set_listings_msg()));
562 textLayoutModule->listingsTB->setPlainText(
563 qt_("Input listings parameters on the right. Enter ? for a list of parameters."));
564 textLayoutModule->lspacingLE->setValidator(new QDoubleValidator(
565 textLayoutModule->lspacingLE));
566 textLayoutModule->skipLE->setValidator(unsignedLengthValidator(
567 textLayoutModule->skipLE));
569 textLayoutModule->skipCO->addItem(qt_("SmallSkip"));
570 textLayoutModule->skipCO->addItem(qt_("MedSkip"));
571 textLayoutModule->skipCO->addItem(qt_("BigSkip"));
572 textLayoutModule->skipCO->addItem(qt_("Length"));
573 // remove the %-items from the unit choice
574 textLayoutModule->skipLengthCO->noPercents();
575 textLayoutModule->lspacingCO->insertItem(
576 Spacing::Single, qt_("Single"));
577 textLayoutModule->lspacingCO->insertItem(
578 Spacing::Onehalf, qt_("OneHalf"));
579 textLayoutModule->lspacingCO->insertItem(
580 Spacing::Double, qt_("Double"));
581 textLayoutModule->lspacingCO->insertItem(
582 Spacing::Other, qt_("Custom"));
584 // initialize the length validator
585 bc().addCheckedLineEdit(textLayoutModule->skipLE);
587 fontModule = new UiWidget<Ui::FontUi>;
589 connect(fontModule->fontsRomanCO, SIGNAL(activated(int)),
590 this, SLOT(change_adaptor()));
591 connect(fontModule->fontsRomanCO, SIGNAL(activated(int)),
592 this, SLOT(romanChanged(int)));
593 connect(fontModule->fontsSansCO, SIGNAL(activated(int)),
594 this, SLOT(change_adaptor()));
595 connect(fontModule->fontsSansCO, SIGNAL(activated(int)),
596 this, SLOT(sansChanged(int)));
597 connect(fontModule->fontsTypewriterCO, SIGNAL(activated(int)),
598 this, SLOT(change_adaptor()));
599 connect(fontModule->fontsTypewriterCO, SIGNAL(activated(int)),
600 this, SLOT(ttChanged(int)));
601 connect(fontModule->fontsDefaultCO, SIGNAL(activated(int)),
602 this, SLOT(change_adaptor()));
603 connect(fontModule->fontsizeCO, SIGNAL(activated(int)),
604 this, SLOT(change_adaptor()));
605 connect(fontModule->scaleSansSB, SIGNAL(valueChanged(int)),
606 this, SLOT(change_adaptor()));
607 connect(fontModule->scaleTypewriterSB, SIGNAL(valueChanged(int)),
608 this, SLOT(change_adaptor()));
609 connect(fontModule->fontScCB, SIGNAL(clicked()),
610 this, SLOT(change_adaptor()));
611 connect(fontModule->fontOsfCB, SIGNAL(clicked()),
612 this, SLOT(change_adaptor()));
614 for (int n = 0; tex_fonts_roman[n][0]; ++n) {
615 QString font = qt_(tex_fonts_roman_gui[n]);
616 if (!isFontAvailable(tex_fonts_roman[n]))
617 font += qt_(" (not installed)");
618 fontModule->fontsRomanCO->addItem(font);
620 for (int n = 0; tex_fonts_sans[n][0]; ++n) {
621 QString font = qt_(tex_fonts_sans_gui[n]);
622 if (!isFontAvailable(tex_fonts_sans[n]))
623 font += qt_(" (not installed)");
624 fontModule->fontsSansCO->addItem(font);
626 for (int n = 0; tex_fonts_monospaced[n][0]; ++n) {
627 QString font = qt_(tex_fonts_monospaced_gui[n]);
628 if (!isFontAvailable(tex_fonts_monospaced[n]))
629 font += qt_(" (not installed)");
630 fontModule->fontsTypewriterCO->addItem(font);
633 fontModule->fontsizeCO->addItem(qt_("Default"));
634 fontModule->fontsizeCO->addItem(qt_("10"));
635 fontModule->fontsizeCO->addItem(qt_("11"));
636 fontModule->fontsizeCO->addItem(qt_("12"));
638 for (int n = 0; GuiDocument::fontfamilies_gui[n][0]; ++n)
639 fontModule->fontsDefaultCO->addItem(
640 qt_(GuiDocument::fontfamilies_gui[n]));
643 pageLayoutModule = new UiWidget<Ui::PageLayoutUi>;
645 connect(pageLayoutModule->papersizeCO, SIGNAL(activated(int)),
646 this, SLOT(setCustomPapersize(int)));
647 connect(pageLayoutModule->papersizeCO, SIGNAL(activated(int)),
648 this, SLOT(setCustomPapersize(int)));
649 connect(pageLayoutModule->portraitRB, SIGNAL(clicked()),
650 this, SLOT(portraitChanged()));
651 connect(pageLayoutModule->papersizeCO, SIGNAL(activated(int)),
652 this, SLOT(change_adaptor()));
653 connect(pageLayoutModule->paperheightLE, SIGNAL(textChanged(const QString &)),
654 this, SLOT(change_adaptor()));
655 connect(pageLayoutModule->paperwidthLE, SIGNAL(textChanged(const QString &)),
656 this, SLOT(change_adaptor()));
657 connect(pageLayoutModule->paperwidthUnitCO, SIGNAL(activated(int)),
658 this, SLOT(change_adaptor()));
659 connect(pageLayoutModule->paperheightUnitCO, SIGNAL(activated(int)),
660 this, SLOT(change_adaptor()));
661 connect(pageLayoutModule->portraitRB, SIGNAL(clicked()),
662 this, SLOT(change_adaptor()));
663 connect(pageLayoutModule->landscapeRB, SIGNAL(clicked()),
664 this, SLOT(change_adaptor()));
665 connect(pageLayoutModule->facingPagesCB, SIGNAL(clicked()),
666 this, SLOT(change_adaptor()));
667 connect(pageLayoutModule->pagestyleCO, SIGNAL(activated(int)),
668 this, SLOT(change_adaptor()));
670 pageLayoutModule->pagestyleCO->addItem(qt_("Default"));
671 pageLayoutModule->pagestyleCO->addItem(qt_("empty"));
672 pageLayoutModule->pagestyleCO->addItem(qt_("plain"));
673 pageLayoutModule->pagestyleCO->addItem(qt_("headings"));
674 pageLayoutModule->pagestyleCO->addItem(qt_("fancy"));
675 bc().addCheckedLineEdit(pageLayoutModule->paperheightLE,
676 pageLayoutModule->paperheightL);
677 bc().addCheckedLineEdit(pageLayoutModule->paperwidthLE,
678 pageLayoutModule->paperwidthL);
681 QComboBox * cb = pageLayoutModule->papersizeCO;
682 cb->addItem(qt_("Default"));
683 cb->addItem(qt_("Custom"));
684 cb->addItem(qt_("US letter"));
685 cb->addItem(qt_("US legal"));
686 cb->addItem(qt_("US executive"));
687 cb->addItem(qt_("A3"));
688 cb->addItem(qt_("A4"));
689 cb->addItem(qt_("A5"));
690 cb->addItem(qt_("B3"));
691 cb->addItem(qt_("B4"));
692 cb->addItem(qt_("B5"));
693 // remove the %-items from the unit choice
694 pageLayoutModule->paperwidthUnitCO->noPercents();
695 pageLayoutModule->paperheightUnitCO->noPercents();
696 pageLayoutModule->paperheightLE->setValidator(unsignedLengthValidator(
697 pageLayoutModule->paperheightLE));
698 pageLayoutModule->paperwidthLE->setValidator(unsignedLengthValidator(
699 pageLayoutModule->paperwidthLE));
702 marginsModule = new UiWidget<Ui::MarginsUi>;
704 connect(marginsModule->marginCB, SIGNAL(toggled(bool)),
705 this, SLOT(setCustomMargins(bool)));
706 connect(marginsModule->marginCB, SIGNAL(clicked()),
707 this, SLOT(change_adaptor()));
708 connect(marginsModule->topLE, SIGNAL(textChanged(const QString &)),
709 this, SLOT(change_adaptor()));
710 connect(marginsModule->topUnit, SIGNAL(activated(int)),
711 this, SLOT(change_adaptor()));
712 connect(marginsModule->bottomLE, SIGNAL(textChanged(const QString &)),
713 this, SLOT(change_adaptor()));
714 connect(marginsModule->bottomUnit, SIGNAL(activated(int)),
715 this, SLOT(change_adaptor()));
716 connect(marginsModule->innerLE, SIGNAL(textChanged(const QString &)),
717 this, SLOT(change_adaptor()));
718 connect(marginsModule->innerUnit, SIGNAL(activated(int)),
719 this, SLOT(change_adaptor()));
720 connect(marginsModule->outerLE, SIGNAL(textChanged(const QString &)),
721 this, SLOT(change_adaptor()));
722 connect(marginsModule->outerUnit, SIGNAL(activated(int)),
723 this, SLOT(change_adaptor()));
724 connect(marginsModule->headheightLE, SIGNAL(textChanged(const QString &)),
725 this, SLOT(change_adaptor()));
726 connect(marginsModule->headheightUnit, SIGNAL(activated(int)),
727 this, SLOT(change_adaptor()));
728 connect(marginsModule->headsepLE, SIGNAL(textChanged(const QString &)),
729 this, SLOT(change_adaptor()));
730 connect(marginsModule->headsepUnit, SIGNAL(activated(int)),
731 this, SLOT(change_adaptor()));
732 connect(marginsModule->footskipLE, SIGNAL(textChanged(const QString&)),
733 this, SLOT(change_adaptor()));
734 connect(marginsModule->footskipUnit, SIGNAL(activated(int)),
735 this, SLOT(change_adaptor()));
736 connect(marginsModule->columnsepLE, SIGNAL(textChanged(const QString&)),
737 this, SLOT(change_adaptor()));
738 connect(marginsModule->columnsepUnit, SIGNAL(activated(int)),
739 this, SLOT(change_adaptor()));
740 marginsModule->topLE->setValidator(unsignedLengthValidator(
741 marginsModule->topLE));
742 marginsModule->bottomLE->setValidator(unsignedLengthValidator(
743 marginsModule->bottomLE));
744 marginsModule->innerLE->setValidator(unsignedLengthValidator(
745 marginsModule->innerLE));
746 marginsModule->outerLE->setValidator(unsignedLengthValidator(
747 marginsModule->outerLE));
748 marginsModule->headsepLE->setValidator(unsignedLengthValidator(
749 marginsModule->headsepLE));
750 marginsModule->headheightLE->setValidator(unsignedLengthValidator(
751 marginsModule->headheightLE));
752 marginsModule->footskipLE->setValidator(unsignedLengthValidator(
753 marginsModule->footskipLE));
754 marginsModule->columnsepLE->setValidator(unsignedLengthValidator(
755 marginsModule->columnsepLE));
757 bc().addCheckedLineEdit(marginsModule->topLE,
758 marginsModule->topL);
759 bc().addCheckedLineEdit(marginsModule->bottomLE,
760 marginsModule->bottomL);
761 bc().addCheckedLineEdit(marginsModule->innerLE,
762 marginsModule->innerL);
763 bc().addCheckedLineEdit(marginsModule->outerLE,
764 marginsModule->outerL);
765 bc().addCheckedLineEdit(marginsModule->headsepLE,
766 marginsModule->headsepL);
767 bc().addCheckedLineEdit(marginsModule->headheightLE,
768 marginsModule->headheightL);
769 bc().addCheckedLineEdit(marginsModule->footskipLE,
770 marginsModule->footskipL);
771 bc().addCheckedLineEdit(marginsModule->columnsepLE,
772 marginsModule->columnsepL);
775 langModule = new UiWidget<Ui::LanguageUi>;
777 connect(langModule->languageCO, SIGNAL(activated(int)),
778 this, SLOT(change_adaptor()));
779 connect(langModule->defaultencodingRB, SIGNAL(clicked()),
780 this, SLOT(change_adaptor()));
781 connect(langModule->otherencodingRB, SIGNAL(clicked()),
782 this, SLOT(change_adaptor()));
783 connect(langModule->encodingCO, SIGNAL(activated(int)),
784 this, SLOT(change_adaptor()));
785 connect(langModule->quoteStyleCO, SIGNAL(activated(int)),
786 this, SLOT(change_adaptor()));
789 Languages::const_iterator lit = languages.begin();
790 Languages::const_iterator lend = languages.end();
791 for (; lit != lend; ++lit) {
792 lang_.append(toqstr(lit->second.lang()));
793 langModule->languageCO->addItem(qt_(lit->second.display()));
796 // Always put the default encoding in the first position.
797 // It is special because the displayed text is translated.
798 langModule->encodingCO->addItem(qt_("LaTeX default"));
799 Encodings::const_iterator it = encodings.begin();
800 Encodings::const_iterator const end = encodings.end();
801 for (; it != end; ++it)
802 langModule->encodingCO->addItem(toqstr(it->latexName()));
804 langModule->quoteStyleCO->addItem(qt_("``text''"));
805 langModule->quoteStyleCO->addItem(qt_("''text''"));
806 langModule->quoteStyleCO->addItem(qt_(",,text``"));
807 langModule->quoteStyleCO->addItem(qt_(",,text''"));
808 langModule->quoteStyleCO->addItem(qt_("<<text>>"));
809 langModule->quoteStyleCO->addItem(qt_(">>text<<"));
812 numberingModule = new UiWidget<Ui::NumberingUi>;
814 connect(numberingModule->depthSL, SIGNAL(valueChanged(int)),
815 this, SLOT(change_adaptor()));
816 connect(numberingModule->tocSL, SIGNAL(valueChanged(int)),
817 this, SLOT(change_adaptor()));
818 connect(numberingModule->depthSL, SIGNAL(valueChanged(int)),
819 this, SLOT(updateNumbering()));
820 connect(numberingModule->tocSL, SIGNAL(valueChanged(int)),
821 this, SLOT(updateNumbering()));
822 numberingModule->tocTW->setColumnCount(3);
823 numberingModule->tocTW->headerItem()->setText(0, qt_("Example"));
824 numberingModule->tocTW->headerItem()->setText(1, qt_("Numbered"));
825 numberingModule->tocTW->headerItem()->setText(2, qt_("Appears in TOC"));
828 biblioModule = new UiWidget<Ui::BiblioUi>;
829 connect(biblioModule->citeNatbibRB, SIGNAL(toggled(bool)),
830 biblioModule->citationStyleL, SLOT(setEnabled(bool)));
831 connect(biblioModule->citeNatbibRB, SIGNAL(toggled(bool)),
832 biblioModule->citeStyleCO, SLOT(setEnabled(bool)));
834 connect(biblioModule->citeDefaultRB, SIGNAL(clicked()),
835 this, SLOT(change_adaptor()));
836 connect(biblioModule->citeNatbibRB, SIGNAL(clicked()),
837 this, SLOT(change_adaptor()));
838 connect(biblioModule->citeStyleCO, SIGNAL(activated(int)),
839 this, SLOT(change_adaptor()));
840 connect(biblioModule->citeJurabibRB, SIGNAL(clicked()),
841 this, SLOT(change_adaptor()));
842 connect(biblioModule->bibtopicCB, SIGNAL(clicked()),
843 this, SLOT(change_adaptor()));
845 biblioModule->citeStyleCO->addItem(qt_("Author-year"));
846 biblioModule->citeStyleCO->addItem(qt_("Numerical"));
847 biblioModule->citeStyleCO->setCurrentIndex(0);
850 mathsModule = new UiWidget<Ui::MathsUi>;
851 connect(mathsModule->amsautoCB, SIGNAL(toggled(bool)),
852 mathsModule->amsCB, SLOT(setDisabled(bool)));
853 connect(mathsModule->esintautoCB, SIGNAL(toggled(bool)),
854 mathsModule->esintCB, SLOT(setDisabled(bool)));
856 connect(mathsModule->amsCB, SIGNAL(clicked()),
857 this, SLOT(change_adaptor()));
858 connect(mathsModule->amsautoCB, SIGNAL(clicked()),
859 this, SLOT(change_adaptor()));
860 connect(mathsModule->esintCB, SIGNAL(clicked()),
861 this, SLOT(change_adaptor()));
862 connect(mathsModule->esintautoCB, SIGNAL(clicked()),
863 this, SLOT(change_adaptor()));
865 latexModule = new UiWidget<Ui::LaTeXUi>;
867 connect(latexModule->optionsLE, SIGNAL(textChanged(const QString &)),
868 this, SLOT(change_adaptor()));
869 connect(latexModule->psdriverCO, SIGNAL(activated(int)),
870 this, SLOT(change_adaptor()));
871 connect(latexModule->classCO, SIGNAL(activated(int)),
872 this, SLOT(classChanged()));
873 connect(latexModule->classCO, SIGNAL(activated(int)),
874 this, SLOT(change_adaptor()));
875 connect(latexModule->layoutPB, SIGNAL(clicked()),
876 this, SLOT(browseLayout()));
877 connect(latexModule->childDocGB, SIGNAL(clicked()),
878 this, SLOT(change_adaptor()));
879 connect(latexModule->childDocLE, SIGNAL(textChanged(const QString &)),
880 this, SLOT(change_adaptor()));
881 connect(latexModule->childDocPB, SIGNAL(clicked()),
882 this, SLOT(browseMaster()));
885 new ModuleSelMan(latexModule->availableLV, latexModule->selectedLV,
886 latexModule->addPB, latexModule->deletePB,
887 latexModule->upPB, latexModule->downPB,
888 availableModel(), selectedModel());
889 connect(selectionManager, SIGNAL(updateHook()),
890 this, SLOT(updateModuleInfo()));
891 connect(selectionManager, SIGNAL(updateHook()),
892 this, SLOT(change_adaptor()));
894 // postscript drivers
895 for (int n = 0; tex_graphics[n][0]; ++n) {
896 QString enc = qt_(tex_graphics_gui[n]);
897 latexModule->psdriverCO->addItem(enc);
900 latexModule->classCO->setModel(&classes_model_);
901 LayoutFileList const & bcl = LayoutFileList::get();
902 vector<LayoutFileIndex> classList = bcl.classList();
903 sort(classList.begin(), classList.end(), less_textclass_avail_desc());
905 vector<LayoutFileIndex>::const_iterator cit = classList.begin();
906 vector<LayoutFileIndex>::const_iterator cen = classList.end();
907 for (int i = 0; cit != cen; ++cit, ++i) {
908 LayoutFile const & tc = bcl[*cit];
909 docstring item = (tc.isTeXClassAvailable()) ?
910 from_utf8(tc.description()) :
911 bformat(_("Unavailable: %1$s"), from_utf8(tc.description()));
912 classes_model_.insertRow(i, toqstr(item), *cit);
916 branchesModule = new GuiBranches;
917 connect(branchesModule, SIGNAL(changed()),
918 this, SLOT(change_adaptor()));
921 preambleModule = new PreambleModule;
922 connect(preambleModule, SIGNAL(changed()),
923 this, SLOT(change_adaptor()));
926 bulletsModule = new BulletsModule;
927 connect(bulletsModule, SIGNAL(changed()),
928 this, SLOT(change_adaptor()));
931 pdfSupportModule = new UiWidget<Ui::PDFSupportUi>;
933 connect(pdfSupportModule->use_hyperrefGB, SIGNAL(toggled(bool)),
934 this, SLOT(change_adaptor()));
935 connect(pdfSupportModule->titleLE, SIGNAL(textChanged(const QString &)),
936 this, SLOT(change_adaptor()));
937 connect(pdfSupportModule->authorLE, SIGNAL(textChanged(const QString &)),
938 this, SLOT(change_adaptor()));
939 connect(pdfSupportModule->subjectLE, SIGNAL(textChanged(const QString &)),
940 this, SLOT(change_adaptor()));
941 connect(pdfSupportModule->keywordsLE, SIGNAL(textChanged(const QString &)),
942 this, SLOT(change_adaptor()));
943 connect(pdfSupportModule->bookmarksGB, SIGNAL(toggled(bool)),
944 this, SLOT(change_adaptor()));
945 connect(pdfSupportModule->bookmarksnumberedCB, SIGNAL(toggled(bool)),
946 this, SLOT(change_adaptor()));
947 connect(pdfSupportModule->bookmarksopenGB, SIGNAL(toggled(bool)),
948 this, SLOT(change_adaptor()));
949 connect(pdfSupportModule->bookmarksopenlevelSB, SIGNAL(valueChanged(int)),
950 this, SLOT(change_adaptor()));
951 connect(pdfSupportModule->breaklinksCB, SIGNAL(toggled(bool)),
952 this, SLOT(change_adaptor()));
953 connect(pdfSupportModule->pdfborderCB, SIGNAL(toggled(bool)),
954 this, SLOT(change_adaptor()));
955 connect(pdfSupportModule->colorlinksCB, SIGNAL(toggled(bool)),
956 this, SLOT(change_adaptor()));
957 connect(pdfSupportModule->backrefCB, SIGNAL(toggled(bool)),
958 this, SLOT(change_adaptor()));
959 connect(pdfSupportModule->pdfusetitleCB, SIGNAL(toggled(bool)),
960 this, SLOT(change_adaptor()));
961 connect(pdfSupportModule->pagebackrefCB, SIGNAL(toggled(bool)),
962 this, SLOT(change_adaptor()));
963 connect(pdfSupportModule->fullscreenCB, SIGNAL(toggled(bool)),
964 this, SLOT(change_adaptor()));
965 connect(pdfSupportModule->optionsLE, SIGNAL(textChanged(const QString &)),
966 this, SLOT(change_adaptor()));
969 floatModule = new FloatPlacement;
970 connect(floatModule, SIGNAL(changed()),
971 this, SLOT(change_adaptor()));
973 docPS->addPanel(latexModule, qt_("Document Class"));
974 docPS->addPanel(fontModule, qt_("Fonts"));
975 docPS->addPanel(textLayoutModule, qt_("Text Layout"));
976 docPS->addPanel(pageLayoutModule, qt_("Page Layout"));
977 docPS->addPanel(marginsModule, qt_("Page Margins"));
978 docPS->addPanel(langModule, qt_("Language"));
979 docPS->addPanel(numberingModule, qt_("Numbering & TOC"));
980 docPS->addPanel(biblioModule, qt_("Bibliography"));
981 docPS->addPanel(pdfSupportModule, qt_("PDF Properties"));
982 docPS->addPanel(mathsModule, qt_("Math Options"));
983 docPS->addPanel(floatModule, qt_("Float Placement"));
984 docPS->addPanel(bulletsModule, qt_("Bullets"));
985 docPS->addPanel(branchesModule, qt_("Branches"));
986 docPS->addPanel(preambleModule, qt_("LaTeX Preamble"));
987 docPS->setCurrentPanel(qt_("Document Class"));
988 // FIXME: hack to work around resizing bug in Qt >= 4.2
989 // bug verified with Qt 4.2.{0-3} (JSpitzm)
990 #if QT_VERSION >= 0x040200
991 docPS->updateGeometry();
996 void GuiDocument::showPreamble()
998 docPS->setCurrentPanel(qt_("LaTeX Preamble"));
1002 void GuiDocument::saveDefaultClicked()
1008 void GuiDocument::useDefaultsClicked()
1014 void GuiDocument::change_adaptor()
1020 docstring GuiDocument::validate_listings_params()
1022 // use a cache here to avoid repeated validation
1023 // of the same parameters
1024 static string param_cache = string();
1025 static docstring msg_cache = docstring();
1027 if (textLayoutModule->bypassCB->isChecked())
1030 string params = fromqstr(textLayoutModule->listingsED->toPlainText());
1031 if (params != param_cache) {
1032 param_cache = params;
1033 msg_cache = InsetListingsParams(params).validate();
1039 void GuiDocument::set_listings_msg()
1041 static bool isOK = true;
1042 docstring msg = validate_listings_params();
1047 // listingsTB->setTextColor("black");
1048 textLayoutModule->listingsTB->setPlainText(
1049 qt_("Input listings parameters on the right. Enter ? for a list of parameters."));
1052 // listingsTB->setTextColor("red");
1053 textLayoutModule->listingsTB->setPlainText(toqstr(msg));
1058 void GuiDocument::setLSpacing(int item)
1060 textLayoutModule->lspacingLE->setEnabled(item == 3);
1064 void GuiDocument::setSkip(int item)
1066 bool const enable = (item == 3);
1067 textLayoutModule->skipLE->setEnabled(enable);
1068 textLayoutModule->skipLengthCO->setEnabled(enable);
1072 void GuiDocument::enableSkip(bool skip)
1074 textLayoutModule->skipCO->setEnabled(skip);
1075 textLayoutModule->skipLE->setEnabled(skip);
1076 textLayoutModule->skipLengthCO->setEnabled(skip);
1078 setSkip(textLayoutModule->skipCO->currentIndex());
1081 void GuiDocument::portraitChanged()
1083 setMargins(pageLayoutModule->papersizeCO->currentIndex());
1086 void GuiDocument::setMargins(bool custom)
1088 marginsModule->marginCB->setChecked(custom);
1089 setCustomMargins(custom);
1093 void GuiDocument::setCustomPapersize(int papersize)
1095 bool const custom = (papersize == 1);
1097 pageLayoutModule->paperwidthL->setEnabled(custom);
1098 pageLayoutModule->paperwidthLE->setEnabled(custom);
1099 pageLayoutModule->paperwidthUnitCO->setEnabled(custom);
1100 pageLayoutModule->paperheightL->setEnabled(custom);
1101 pageLayoutModule->paperheightLE->setEnabled(custom);
1102 pageLayoutModule->paperheightLE->setFocus();
1103 pageLayoutModule->paperheightUnitCO->setEnabled(custom);
1107 void GuiDocument::setColSep()
1109 setCustomMargins(marginsModule->marginCB->checkState() == Qt::Checked);
1113 void GuiDocument::setCustomMargins(bool custom)
1115 marginsModule->topL->setEnabled(!custom);
1116 marginsModule->topLE->setEnabled(!custom);
1117 marginsModule->topUnit->setEnabled(!custom);
1119 marginsModule->bottomL->setEnabled(!custom);
1120 marginsModule->bottomLE->setEnabled(!custom);
1121 marginsModule->bottomUnit->setEnabled(!custom);
1123 marginsModule->innerL->setEnabled(!custom);
1124 marginsModule->innerLE->setEnabled(!custom);
1125 marginsModule->innerUnit->setEnabled(!custom);
1127 marginsModule->outerL->setEnabled(!custom);
1128 marginsModule->outerLE->setEnabled(!custom);
1129 marginsModule->outerUnit->setEnabled(!custom);
1131 marginsModule->headheightL->setEnabled(!custom);
1132 marginsModule->headheightLE->setEnabled(!custom);
1133 marginsModule->headheightUnit->setEnabled(!custom);
1135 marginsModule->headsepL->setEnabled(!custom);
1136 marginsModule->headsepLE->setEnabled(!custom);
1137 marginsModule->headsepUnit->setEnabled(!custom);
1139 marginsModule->footskipL->setEnabled(!custom);
1140 marginsModule->footskipLE->setEnabled(!custom);
1141 marginsModule->footskipUnit->setEnabled(!custom);
1143 bool const enableColSep = !custom &&
1144 textLayoutModule->twoColumnCB->checkState() == Qt::Checked;
1145 marginsModule->columnsepL->setEnabled(enableColSep);
1146 marginsModule->columnsepLE->setEnabled(enableColSep);
1147 marginsModule->columnsepUnit->setEnabled(enableColSep);
1151 void GuiDocument::updateFontsize(string const & items, string const & sel)
1153 fontModule->fontsizeCO->clear();
1154 fontModule->fontsizeCO->addItem(qt_("Default"));
1156 for (int n = 0; !token(items,'|',n).empty(); ++n)
1157 fontModule->fontsizeCO->
1158 addItem(toqstr(token(items,'|',n)));
1160 for (int n = 0; n < fontModule->fontsizeCO->count(); ++n) {
1161 if (fromqstr(fontModule->fontsizeCO->itemText(n)) == sel) {
1162 fontModule->fontsizeCO->setCurrentIndex(n);
1169 void GuiDocument::romanChanged(int item)
1171 string const font = tex_fonts_roman[item];
1172 fontModule->fontScCB->setEnabled(providesSC(font));
1173 fontModule->fontOsfCB->setEnabled(providesOSF(font));
1177 void GuiDocument::sansChanged(int item)
1179 string const font = tex_fonts_sans[item];
1180 bool scaleable = providesScale(font);
1181 fontModule->scaleSansSB->setEnabled(scaleable);
1182 fontModule->scaleSansLA->setEnabled(scaleable);
1186 void GuiDocument::ttChanged(int item)
1188 string const font = tex_fonts_monospaced[item];
1189 bool scaleable = providesScale(font);
1190 fontModule->scaleTypewriterSB->setEnabled(scaleable);
1191 fontModule->scaleTypewriterLA->setEnabled(scaleable);
1195 void GuiDocument::updatePagestyle(string const & items, string const & sel)
1198 pageLayoutModule->pagestyleCO->clear();
1199 pageLayoutModule->pagestyleCO->addItem(qt_("Default"));
1201 for (int n = 0; !token(items,'|',n).empty(); ++n) {
1202 string style = token(items, '|', n);
1203 docstring style_gui = _(style);
1204 pagestyles.push_back(pair<string, docstring>(style, style_gui));
1205 pageLayoutModule->pagestyleCO->addItem(toqstr(style_gui));
1208 if (sel == "default") {
1209 pageLayoutModule->pagestyleCO->setCurrentIndex(0);
1215 for (size_t i = 0; i < pagestyles.size(); ++i)
1216 if (pagestyles[i].first == sel)
1217 nn = pageLayoutModule->pagestyleCO->findText(
1218 toqstr(pagestyles[i].second));
1221 pageLayoutModule->pagestyleCO->setCurrentIndex(nn);
1225 void GuiDocument::browseLayout()
1227 QString const label1 = qt_("Layouts|#o#O");
1228 QString const dir1 = toqstr(lyxrc.document_path);
1229 QStringList const filter(qt_("LyX Layout (*.layout)"));
1230 QString file = browseRelFile(QString(), bufferFilepath(),
1231 qt_("Local layout file"), filter, false,
1234 if (!file.endsWith(".layout"))
1237 FileName layoutFile = support::makeAbsPath(fromqstr(file),
1238 fromqstr(bufferFilepath()));
1240 // load the layout file
1241 LayoutFileList & bcl = LayoutFileList::get();
1242 string classname = layoutFile.onlyFileName();
1243 LayoutFileIndex name = bcl.addLayoutFile(
1244 classname.substr(0, classname.size() - 7),
1245 layoutFile.onlyPath().absFilename(),
1246 LayoutFileList::Local);
1249 Alert::error(_("Error"),
1250 _("Unable to read local layout file."));
1254 // do not trigger classChanged if there is no change.
1255 if (latexModule->classCO->currentText() == toqstr(name))
1259 int idx = latexModule->classCO->findText(toqstr(name));
1261 classes_model_.insertRow(0, toqstr(name), name);
1262 latexModule->classCO->setCurrentIndex(0);
1264 latexModule->classCO->setCurrentIndex(idx);
1269 void GuiDocument::browseMaster()
1271 QString const title = qt_("Select master document");
1272 QString const dir1 = toqstr(lyxrc.document_path);
1273 QString const old = latexModule->childDocLE->text();
1274 QString const docpath = toqstr(support::onlyPath(buffer().absFileName()));
1275 QStringList const filter(qt_("LyX Files (*.lyx)"));
1276 QString file = browseRelFile(old, docpath, title, filter, false,
1277 qt_("Documents|#o#O"), toqstr(lyxrc.document_path));
1279 latexModule->childDocLE->setText(file);
1283 void GuiDocument::classChanged()
1285 int idx = latexModule->classCO->currentIndex();
1288 string const classname = classes_model_.getIDString(idx);
1289 // check if this is a local layout file
1290 if (prefixIs(classname, LayoutFileList::localPrefix)) {
1291 int const ret = Alert::prompt(_("Local layout file"),
1292 _("The layout file you have selected is a local layout\n"
1293 "file, not one in the system or user directory. Your\n"
1294 "document may not work with this layout if you do not\n"
1295 "keep the layout file in the same directory."),
1296 1, 1, _("&Set Layout"), _("&Cancel"));
1298 // try to reset the layout combo
1299 setLayoutComboByIDString(bp_.baseClassID());
1303 // FIXME Note that by doing things this way, we load the TextClass
1304 // as soon as it is selected. So, if you use the scroll wheel when
1305 // sitting on the combo box, we'll load a lot of TextClass objects
1306 // very quickly. This could be changed.
1307 if (!bp_.setBaseClass(classname)) {
1308 Alert::error(_("Error"), _("Unable to set document class."));
1311 if (lyxrc.auto_reset_options) {
1312 if (applyPB->isEnabled()) {
1313 int const ret = Alert::prompt(_("Unapplied changes"),
1314 _("Some changes in the dialog were not yet applied.\n"
1315 "If you do not apply now, they will be lost after this action."),
1316 1, 1, _("&Apply"), _("&Dismiss"));
1320 bp_.useClassDefaults();
1327 // This is an insanely complicated attempt to make this sort of thing
1328 // work with RTL languages.
1329 docstring formatStrVec(vector<string> const & v, docstring const & s)
1331 //this mess formats the list as "v[0], v[1], ..., [s] v[n]"
1332 int const vSize = v.size();
1335 else if (v.size() == 1)
1336 return from_ascii(v[0]);
1337 else if (v.size() == 2) {
1338 docstring retval = _("%1$s and %2$s");
1339 retval = subst(retval, _("and"), s);
1340 return bformat(retval, from_ascii(v[0]), from_ascii(v[1]));
1342 //The idea here is to format all but the last two items...
1343 docstring t2 = _("%1$s, %2$s");
1344 docstring retval = from_ascii(v[0]);
1345 for (int i = 1; i < vSize - 2; ++i)
1346 retval = bformat(t2, retval, from_ascii(v[i]));
1347 //...and then to plug them, and the last two, into this schema
1348 docstring t = _("%1$s, %2$s, and %3$s");
1349 t = subst(t, _("and"), s);
1350 return bformat(t, retval, from_ascii(v[vSize - 2]), from_ascii(v[vSize - 1]));
1353 vector<string> idsToNames(vector<string> const & idList)
1355 vector<string> retval;
1356 vector<string>::const_iterator it = idList.begin();
1357 vector<string>::const_iterator end = idList.end();
1358 for (; it != end; ++it) {
1359 LyXModule const * const mod = moduleList[*it];
1361 retval.push_back(*it + " (Unavailable)");
1363 retval.push_back(mod->getName());
1370 void GuiDocument::updateModuleInfo()
1372 selectionManager->update();
1374 //Module description
1375 bool const focusOnSelected = selectionManager->selectedFocused();
1376 QListView const * const lv =
1377 focusOnSelected ? latexModule->selectedLV : latexModule->availableLV;
1378 if (lv->selectionModel()->selectedIndexes().isEmpty()) {
1379 latexModule->infoML->document()->clear();
1382 QModelIndex const & idx = lv->selectionModel()->currentIndex();
1383 GuiIdListModel const & idModel =
1384 focusOnSelected ? modules_sel_model_ : modules_av_model_;
1385 string const modName = idModel.getIDString(idx.row());
1386 docstring desc = getModuleDescription(modName);
1388 vector<string> pkgList = getPackageList(modName);
1389 docstring pkgdesc = formatStrVec(pkgList, _("and"));
1390 if (!pkgdesc.empty()) {
1393 desc += bformat(_("Package(s) required: %1$s."), pkgdesc);
1396 pkgList = getRequiredList(modName);
1397 if (!pkgList.empty()) {
1398 vector<string> const reqDescs = idsToNames(pkgList);
1399 pkgdesc = formatStrVec(reqDescs, _("or"));
1402 desc += bformat(_("Module required: %1$s."), pkgdesc);
1405 pkgList = getExcludedList(modName);
1406 if (!pkgList.empty()) {
1407 vector<string> const reqDescs = idsToNames(pkgList);
1408 pkgdesc = formatStrVec(reqDescs, _( "and"));
1411 desc += bformat(_("Modules excluded: %1$s."), pkgdesc);
1414 if (!isModuleAvailable(modName)) {
1417 desc += _("WARNING: Some packages are unavailable!");
1420 latexModule->infoML->document()->setPlainText(toqstr(desc));
1424 void GuiDocument::updateNumbering()
1426 DocumentClass const & tclass = bp_.documentClass();
1428 numberingModule->tocTW->setUpdatesEnabled(false);
1429 numberingModule->tocTW->clear();
1431 int const depth = numberingModule->depthSL->value();
1432 int const toc = numberingModule->tocSL->value();
1433 QString const no = qt_("No");
1434 QString const yes = qt_("Yes");
1435 QTreeWidgetItem * item = 0;
1437 DocumentClass::const_iterator lit = tclass.begin();
1438 DocumentClass::const_iterator len = tclass.end();
1439 for (; lit != len; ++lit) {
1440 int const toclevel = lit->toclevel;
1441 if (toclevel != Layout::NOT_IN_TOC && lit->labeltype == LABEL_COUNTER) {
1442 item = new QTreeWidgetItem(numberingModule->tocTW);
1443 item->setText(0, toqstr(translateIfPossible(lit->name())));
1444 item->setText(1, (toclevel <= depth) ? yes : no);
1445 item->setText(2, (toclevel <= toc) ? yes : no);
1449 numberingModule->tocTW->setUpdatesEnabled(true);
1450 numberingModule->tocTW->update();
1454 void GuiDocument::apply(BufferParams & params)
1457 preambleModule->apply(params);
1460 params.setCiteEngine(ENGINE_BASIC);
1462 if (biblioModule->citeNatbibRB->isChecked()) {
1463 bool const use_numerical_citations =
1464 biblioModule->citeStyleCO->currentIndex();
1465 if (use_numerical_citations)
1466 params.setCiteEngine(ENGINE_NATBIB_NUMERICAL);
1468 params.setCiteEngine(ENGINE_NATBIB_AUTHORYEAR);
1470 } else if (biblioModule->citeJurabibRB->isChecked())
1471 params.setCiteEngine(ENGINE_JURABIB);
1473 params.use_bibtopic =
1474 biblioModule->bibtopicCB->isChecked();
1476 // language & quotes
1477 if (langModule->defaultencodingRB->isChecked()) {
1478 params.inputenc = "auto";
1480 int i = langModule->encodingCO->currentIndex();
1482 params.inputenc = "default";
1485 fromqstr(langModule->encodingCO->currentText());
1488 InsetQuotes::QuoteLanguage lga = InsetQuotes::EnglishQuotes;
1489 switch (langModule->quoteStyleCO->currentIndex()) {
1491 lga = InsetQuotes::EnglishQuotes;
1494 lga = InsetQuotes::SwedishQuotes;
1497 lga = InsetQuotes::GermanQuotes;
1500 lga = InsetQuotes::PolishQuotes;
1503 lga = InsetQuotes::FrenchQuotes;
1506 lga = InsetQuotes::DanishQuotes;
1509 params.quotes_language = lga;
1511 int const pos = langModule->languageCO->currentIndex();
1512 params.language = lyx::languages.getLanguage(fromqstr(lang_[pos]));
1515 if (params.documentClass().hasTocLevels()) {
1516 params.tocdepth = numberingModule->tocSL->value();
1517 params.secnumdepth = numberingModule->depthSL->value();
1521 params.user_defined_bullet(0) = bulletsModule->getBullet(0);
1522 params.user_defined_bullet(1) = bulletsModule->getBullet(1);
1523 params.user_defined_bullet(2) = bulletsModule->getBullet(2);
1524 params.user_defined_bullet(3) = bulletsModule->getBullet(3);
1527 params.graphicsDriver =
1528 tex_graphics[latexModule->psdriverCO->currentIndex()];
1531 int idx = latexModule->classCO->currentIndex();
1533 string const classname = classes_model_.getIDString(idx);
1534 params.setBaseClass(classname);
1538 params.clearLayoutModules();
1539 int const srows = modules_sel_model_.rowCount();
1540 vector<string> selModList;
1541 for (int i = 0; i < srows; ++i)
1542 params.addLayoutModule(modules_sel_model_.getIDString(i));
1544 if (mathsModule->amsautoCB->isChecked()) {
1545 params.use_amsmath = BufferParams::package_auto;
1547 if (mathsModule->amsCB->isChecked())
1548 params.use_amsmath = BufferParams::package_on;
1550 params.use_amsmath = BufferParams::package_off;
1553 if (mathsModule->esintautoCB->isChecked())
1554 params.use_esint = BufferParams::package_auto;
1556 if (mathsModule->esintCB->isChecked())
1557 params.use_esint = BufferParams::package_on;
1559 params.use_esint = BufferParams::package_off;
1562 if (pageLayoutModule->pagestyleCO->currentIndex() == 0)
1563 params.pagestyle = "default";
1565 docstring style_gui =
1566 qstring_to_ucs4(pageLayoutModule->pagestyleCO->currentText());
1567 for (size_t i = 0; i < pagestyles.size(); ++i)
1568 if (pagestyles[i].second == style_gui)
1569 params.pagestyle = pagestyles[i].first;
1572 switch (textLayoutModule->lspacingCO->currentIndex()) {
1574 params.spacing().set(Spacing::Single);
1577 params.spacing().set(Spacing::Onehalf);
1580 params.spacing().set(Spacing::Double);
1583 params.spacing().set(Spacing::Other,
1584 fromqstr(textLayoutModule->lspacingLE->text()));
1588 if (textLayoutModule->twoColumnCB->isChecked())
1593 // text should have passed validation
1594 params.listings_params =
1595 InsetListingsParams(fromqstr(textLayoutModule->listingsED->toPlainText())).params();
1597 if (textLayoutModule->indentRB->isChecked())
1598 params.paragraph_separation = BufferParams::ParagraphIndentSeparation;
1600 params.paragraph_separation = BufferParams::ParagraphSkipSeparation;
1602 switch (textLayoutModule->skipCO->currentIndex()) {
1604 params.setDefSkip(VSpace(VSpace::SMALLSKIP));
1607 params.setDefSkip(VSpace(VSpace::MEDSKIP));
1610 params.setDefSkip(VSpace(VSpace::BIGSKIP));
1615 widgetsToLength(textLayoutModule->skipLE,
1616 textLayoutModule->skipLengthCO)
1618 params.setDefSkip(vs);
1622 // DocumentDefskipCB assures that this never happens
1623 // so Assert then !!! - jbl
1624 params.setDefSkip(VSpace(VSpace::MEDSKIP));
1629 fromqstr(latexModule->optionsLE->text());
1631 if (latexModule->childDocGB->isChecked())
1633 fromqstr(latexModule->childDocLE->text());
1635 params.master = string();
1637 params.float_placement = floatModule->get();
1641 tex_fonts_roman[fontModule->fontsRomanCO->currentIndex()];
1644 tex_fonts_sans[fontModule->fontsSansCO->currentIndex()];
1646 params.fontsTypewriter =
1647 tex_fonts_monospaced[fontModule->fontsTypewriterCO->currentIndex()];
1649 params.fontsSansScale = fontModule->scaleSansSB->value();
1651 params.fontsTypewriterScale = fontModule->scaleTypewriterSB->value();
1653 params.fontsSC = fontModule->fontScCB->isChecked();
1655 params.fontsOSF = fontModule->fontOsfCB->isChecked();
1657 params.fontsDefaultFamily = GuiDocument::fontfamilies[
1658 fontModule->fontsDefaultCO->currentIndex()];
1660 if (fontModule->fontsizeCO->currentIndex() == 0)
1661 params.fontsize = "default";
1664 fromqstr(fontModule->fontsizeCO->currentText());
1667 params.papersize = PAPER_SIZE(
1668 pageLayoutModule->papersizeCO->currentIndex());
1670 // custom, A3, B3 and B4 paper sizes need geometry
1671 int psize = pageLayoutModule->papersizeCO->currentIndex();
1672 bool geom_papersize = (psize == 1 || psize == 5 || psize == 8 || psize == 9);
1674 params.paperwidth = widgetsToLength(pageLayoutModule->paperwidthLE,
1675 pageLayoutModule->paperwidthUnitCO);
1677 params.paperheight = widgetsToLength(pageLayoutModule->paperheightLE,
1678 pageLayoutModule->paperheightUnitCO);
1680 if (pageLayoutModule->facingPagesCB->isChecked())
1681 params.sides = TwoSides;
1683 params.sides = OneSide;
1685 if (pageLayoutModule->landscapeRB->isChecked())
1686 params.orientation = ORIENTATION_LANDSCAPE;
1688 params.orientation = ORIENTATION_PORTRAIT;
1691 params.use_geometry = !marginsModule->marginCB->isChecked()
1694 Ui::MarginsUi const * m = marginsModule;
1696 params.leftmargin = widgetsToLength(m->innerLE, m->innerUnit);
1697 params.topmargin = widgetsToLength(m->topLE, m->topUnit);
1698 params.rightmargin = widgetsToLength(m->outerLE, m->outerUnit);
1699 params.bottommargin = widgetsToLength(m->bottomLE, m->bottomUnit);
1700 params.headheight = widgetsToLength(m->headheightLE, m->headheightUnit);
1701 params.headsep = widgetsToLength(m->headsepLE, m->headsepUnit);
1702 params.footskip = widgetsToLength(m->footskipLE, m->footskipUnit);
1703 params.columnsep = widgetsToLength(m->columnsepLE, m->columnsepUnit);
1705 branchesModule->apply(params);
1708 PDFOptions & pdf = params.pdfoptions();
1709 pdf.use_hyperref = pdfSupportModule->use_hyperrefGB->isChecked();
1710 pdf.title = fromqstr(pdfSupportModule->titleLE->text());
1711 pdf.author = fromqstr(pdfSupportModule->authorLE->text());
1712 pdf.subject = fromqstr(pdfSupportModule->subjectLE->text());
1713 pdf.keywords = fromqstr(pdfSupportModule->keywordsLE->text());
1715 pdf.bookmarks = pdfSupportModule->bookmarksGB->isChecked();
1716 pdf.bookmarksnumbered = pdfSupportModule->bookmarksnumberedCB->isChecked();
1717 pdf.bookmarksopen = pdfSupportModule->bookmarksopenGB->isChecked();
1718 pdf.bookmarksopenlevel = pdfSupportModule->bookmarksopenlevelSB->value();
1720 pdf.breaklinks = pdfSupportModule->breaklinksCB->isChecked();
1721 pdf.pdfborder = pdfSupportModule->pdfborderCB->isChecked();
1722 pdf.pdfusetitle = pdfSupportModule->pdfusetitleCB->isChecked();
1723 pdf.colorlinks = pdfSupportModule->colorlinksCB->isChecked();
1724 pdf.backref = pdfSupportModule->backrefCB->isChecked();
1725 pdf.pagebackref = pdfSupportModule->pagebackrefCB->isChecked();
1726 if (pdfSupportModule->fullscreenCB->isChecked())
1727 pdf.pagemode = pdf.pagemode_fullscreen;
1729 pdf.pagemode.clear();
1730 pdf.quoted_options = pdf.quoted_options_check(
1731 fromqstr(pdfSupportModule->optionsLE->text()));
1735 static int findPos(QStringList const & vec, QString const & val)
1737 for (int i = 0; i != vec.size(); ++i)
1744 void GuiDocument::updateParams()
1750 void GuiDocument::updateParams(BufferParams const & params)
1752 // set the default unit
1753 Length::UNIT defaultUnit = Length::CM;
1754 switch (lyxrc.default_papersize) {
1755 case PAPER_DEFAULT: break;
1757 case PAPER_USLETTER:
1759 case PAPER_USEXECUTIVE:
1760 defaultUnit = Length::IN;
1769 defaultUnit = Length::CM;
1776 preambleModule->update(params, id());
1779 biblioModule->citeDefaultRB->setChecked(
1780 params.citeEngine() == ENGINE_BASIC);
1782 biblioModule->citeNatbibRB->setChecked(
1783 params.citeEngine() == ENGINE_NATBIB_NUMERICAL ||
1784 params.citeEngine() == ENGINE_NATBIB_AUTHORYEAR);
1786 biblioModule->citeStyleCO->setCurrentIndex(
1787 params.citeEngine() == ENGINE_NATBIB_NUMERICAL);
1789 biblioModule->citeJurabibRB->setChecked(
1790 params.citeEngine() == ENGINE_JURABIB);
1792 biblioModule->bibtopicCB->setChecked(
1793 params.use_bibtopic);
1795 // language & quotes
1796 int const pos = findPos(lang_, toqstr(params.language->lang()));
1797 langModule->languageCO->setCurrentIndex(pos);
1799 langModule->quoteStyleCO->setCurrentIndex(
1800 params.quotes_language);
1802 bool default_enc = true;
1803 if (params.inputenc != "auto") {
1804 default_enc = false;
1805 if (params.inputenc == "default") {
1806 langModule->encodingCO->setCurrentIndex(0);
1808 int const i = langModule->encodingCO->findText(
1809 toqstr(params.inputenc));
1811 langModule->encodingCO->setCurrentIndex(i);
1813 // unknown encoding. Set to default.
1817 langModule->defaultencodingRB->setChecked(default_enc);
1818 langModule->otherencodingRB->setChecked(!default_enc);
1821 int const min_toclevel = documentClass().min_toclevel();
1822 int const max_toclevel = documentClass().max_toclevel();
1823 if (documentClass().hasTocLevels()) {
1824 numberingModule->setEnabled(true);
1825 numberingModule->depthSL->setMinimum(min_toclevel - 1);
1826 numberingModule->depthSL->setMaximum(max_toclevel);
1827 numberingModule->depthSL->setValue(params.secnumdepth);
1828 numberingModule->tocSL->setMaximum(min_toclevel - 1);
1829 numberingModule->tocSL->setMaximum(max_toclevel);
1830 numberingModule->tocSL->setValue(params.tocdepth);
1833 numberingModule->setEnabled(false);
1834 numberingModule->tocTW->clear();
1838 bulletsModule->setBullet(0, params.user_defined_bullet(0));
1839 bulletsModule->setBullet(1, params.user_defined_bullet(1));
1840 bulletsModule->setBullet(2, params.user_defined_bullet(2));
1841 bulletsModule->setBullet(3, params.user_defined_bullet(3));
1842 bulletsModule->init();
1845 int nitem = findToken(tex_graphics, params.graphicsDriver);
1847 latexModule->psdriverCO->setCurrentIndex(nitem);
1850 mathsModule->amsCB->setChecked(
1851 params.use_amsmath == BufferParams::package_on);
1852 mathsModule->amsautoCB->setChecked(
1853 params.use_amsmath == BufferParams::package_auto);
1855 mathsModule->esintCB->setChecked(
1856 params.use_esint == BufferParams::package_on);
1857 mathsModule->esintautoCB->setChecked(
1858 params.use_esint == BufferParams::package_auto);
1860 switch (params.spacing().getSpace()) {
1861 case Spacing::Other: nitem = 3; break;
1862 case Spacing::Double: nitem = 2; break;
1863 case Spacing::Onehalf: nitem = 1; break;
1864 case Spacing::Default: case Spacing::Single: nitem = 0; break;
1868 string const & layoutID = params.baseClassID();
1869 setLayoutComboByIDString(layoutID);
1871 updatePagestyle(documentClass().opt_pagestyle(),
1874 textLayoutModule->lspacingCO->setCurrentIndex(nitem);
1875 if (params.spacing().getSpace() == Spacing::Other) {
1876 textLayoutModule->lspacingLE->setText(
1877 toqstr(params.spacing().getValueAsString()));
1881 if (params.paragraph_separation == BufferParams::ParagraphIndentSeparation)
1882 textLayoutModule->indentRB->setChecked(true);
1884 textLayoutModule->skipRB->setChecked(true);
1887 switch (params.getDefSkip().kind()) {
1888 case VSpace::SMALLSKIP:
1891 case VSpace::MEDSKIP:
1894 case VSpace::BIGSKIP:
1897 case VSpace::LENGTH:
1900 string const length = params.getDefSkip().asLyXCommand();
1901 lengthToWidgets(textLayoutModule->skipLE,
1902 textLayoutModule->skipLengthCO,
1903 length, defaultUnit);
1910 textLayoutModule->skipCO->setCurrentIndex(skip);
1913 textLayoutModule->twoColumnCB->setChecked(
1914 params.columns == 2);
1916 // break listings_params to multiple lines
1918 InsetListingsParams(params.listings_params).separatedParams();
1919 textLayoutModule->listingsED->setPlainText(toqstr(lstparams));
1921 if (!params.options.empty()) {
1922 latexModule->optionsLE->setText(
1923 toqstr(params.options));
1925 latexModule->optionsLE->setText(QString());
1928 if (!params.master.empty()) {
1929 latexModule->childDocGB->setChecked(true);
1930 latexModule->childDocLE->setText(
1931 toqstr(params.master));
1933 latexModule->childDocLE->setText(QString());
1934 latexModule->childDocGB->setChecked(false);
1937 floatModule->set(params.float_placement);
1940 updateFontsize(documentClass().opt_fontsize(),
1943 int n = findToken(tex_fonts_roman, params.fontsRoman);
1945 fontModule->fontsRomanCO->setCurrentIndex(n);
1949 n = findToken(tex_fonts_sans, params.fontsSans);
1951 fontModule->fontsSansCO->setCurrentIndex(n);
1955 n = findToken(tex_fonts_monospaced, params.fontsTypewriter);
1957 fontModule->fontsTypewriterCO->setCurrentIndex(n);
1961 fontModule->fontScCB->setChecked(params.fontsSC);
1962 fontModule->fontOsfCB->setChecked(params.fontsOSF);
1963 fontModule->scaleSansSB->setValue(params.fontsSansScale);
1964 fontModule->scaleTypewriterSB->setValue(params.fontsTypewriterScale);
1965 n = findToken(GuiDocument::fontfamilies, params.fontsDefaultFamily);
1967 fontModule->fontsDefaultCO->setCurrentIndex(n);
1970 int const psize = params.papersize;
1971 pageLayoutModule->papersizeCO->setCurrentIndex(psize);
1972 setCustomPapersize(psize);
1974 bool const landscape =
1975 params.orientation == ORIENTATION_LANDSCAPE;
1976 pageLayoutModule->landscapeRB->setChecked(landscape);
1977 pageLayoutModule->portraitRB->setChecked(!landscape);
1979 pageLayoutModule->facingPagesCB->setChecked(
1980 params.sides == TwoSides);
1983 lengthToWidgets(pageLayoutModule->paperwidthLE,
1984 pageLayoutModule->paperwidthUnitCO, params.paperwidth, defaultUnit);
1986 lengthToWidgets(pageLayoutModule->paperheightLE,
1987 pageLayoutModule->paperheightUnitCO, params.paperheight, defaultUnit);
1990 Ui::MarginsUi * m = marginsModule;
1992 setMargins(!params.use_geometry);
1994 lengthToWidgets(m->topLE, m->topUnit,
1995 params.topmargin, defaultUnit);
1997 lengthToWidgets(m->bottomLE, m->bottomUnit,
1998 params.bottommargin, defaultUnit);
2000 lengthToWidgets(m->innerLE, m->innerUnit,
2001 params.leftmargin, defaultUnit);
2003 lengthToWidgets(m->outerLE, m->outerUnit,
2004 params.rightmargin, defaultUnit);
2006 lengthToWidgets(m->headheightLE, m->headheightUnit,
2007 params.headheight, defaultUnit);
2009 lengthToWidgets(m->headsepLE, m->headsepUnit,
2010 params.headsep, defaultUnit);
2012 lengthToWidgets(m->footskipLE, m->footskipUnit,
2013 params.footskip, defaultUnit);
2015 lengthToWidgets(m->columnsepLE, m->columnsepUnit,
2016 params.columnsep, defaultUnit);
2018 branchesModule->update(params);
2021 PDFOptions const & pdf = params.pdfoptions();
2022 pdfSupportModule->use_hyperrefGB->setChecked(pdf.use_hyperref);
2023 pdfSupportModule->titleLE->setText(toqstr(pdf.title));
2024 pdfSupportModule->authorLE->setText(toqstr(pdf.author));
2025 pdfSupportModule->subjectLE->setText(toqstr(pdf.subject));
2026 pdfSupportModule->keywordsLE->setText(toqstr(pdf.keywords));
2028 pdfSupportModule->bookmarksGB->setChecked(pdf.bookmarks);
2029 pdfSupportModule->bookmarksnumberedCB->setChecked(pdf.bookmarksnumbered);
2030 pdfSupportModule->bookmarksopenGB->setChecked(pdf.bookmarksopen);
2032 pdfSupportModule->bookmarksopenlevelSB->setValue(pdf.bookmarksopenlevel);
2034 pdfSupportModule->breaklinksCB->setChecked(pdf.breaklinks);
2035 pdfSupportModule->pdfborderCB->setChecked(pdf.pdfborder);
2036 pdfSupportModule->pdfusetitleCB->setChecked(pdf.pdfusetitle);
2037 pdfSupportModule->colorlinksCB->setChecked(pdf.colorlinks);
2038 pdfSupportModule->backrefCB->setChecked(pdf.backref);
2039 pdfSupportModule->pagebackrefCB->setChecked(pdf.pagebackref);
2040 pdfSupportModule->fullscreenCB->setChecked
2041 (pdf.pagemode == pdf.pagemode_fullscreen);
2043 pdfSupportModule->optionsLE->setText(
2044 toqstr(pdf.quoted_options));
2048 void GuiDocument::applyView()
2054 void GuiDocument::saveDocDefault()
2056 // we have to apply the params first
2062 void GuiDocument::updateAvailableModules()
2064 modules_av_model_.clear();
2065 vector<modInfoStruct> const & modInfoList = getModuleInfo();
2066 int const mSize = modInfoList.size();
2067 for (int i = 0; i != mSize; ++i) {
2068 modInfoStruct const & modInfo = modInfoList[i];
2069 modules_av_model_.insertRow(i, modInfo.name, modInfo.id,
2070 modInfo.description);
2075 void GuiDocument::updateSelectedModules()
2077 // and selected ones, too
2078 modules_sel_model_.clear();
2079 vector<modInfoStruct> const selModList = getSelectedModules();
2080 int const sSize = selModList.size();
2081 for (int i = 0; i != sSize; ++i) {
2082 modInfoStruct const & modInfo = selModList[i];
2083 modules_sel_model_.insertRow(i, modInfo.name, modInfo.id,
2084 modInfo.description);
2089 void GuiDocument::updateContents()
2091 if (id() == current_id_)
2094 updateAvailableModules();
2095 updateSelectedModules();
2097 //FIXME It'd be nice to make sure here that the selected
2098 //modules are consistent: That required modules are actually
2099 //selected, and that we don't have conflicts. If so, we could
2100 //at least pop up a warning.
2106 void GuiDocument::forceUpdate()
2108 // reset to force dialog update
2114 void GuiDocument::useClassDefaults()
2116 if (applyPB->isEnabled()) {
2117 int const ret = Alert::prompt(_("Unapplied changes"),
2118 _("Some changes in the dialog were not yet applied.\n"
2119 "If you do not apply now, they will be lost after this action."),
2120 1, 1, _("&Apply"), _("&Dismiss"));
2125 int idx = latexModule->classCO->currentIndex();
2126 string const classname = classes_model_.getIDString(idx);
2127 if (!bp_.setBaseClass(classname)) {
2128 Alert::error(_("Error"), _("Unable to set document class."));
2131 bp_.useClassDefaults();
2136 void GuiDocument::setLayoutComboByIDString(std::string const & idString)
2138 int idx = classes_model_.findIDString(idString);
2140 Alert::warning(_("Can't set layout!"),
2141 bformat(_("Unable to set layout for ID: %1$s"), from_utf8(idString)));
2143 latexModule->classCO->setCurrentIndex(idx);
2147 bool GuiDocument::isValid()
2149 return validate_listings_params().empty()
2150 && (textLayoutModule->skipCO->currentIndex() != 3
2151 || !textLayoutModule->skipLE->text().isEmpty());
2155 char const * const GuiDocument::fontfamilies[5] = {
2156 "default", "rmdefault", "sfdefault", "ttdefault", ""
2160 char const * GuiDocument::fontfamilies_gui[5] = {
2161 N_("Default"), N_("Roman"), N_("Sans Serif"), N_("Typewriter"), ""
2165 bool GuiDocument::initialiseParams(string const &)
2167 bp_ = buffer().params();
2168 // Force update on next updateContent() round.
2175 void GuiDocument::clearParams()
2177 bp_ = BufferParams();
2181 BufferId GuiDocument::id() const
2187 vector<GuiDocument::modInfoStruct> const & GuiDocument::getModuleInfo()
2189 return moduleNames_;
2193 vector<GuiDocument::modInfoStruct> const GuiDocument::getSelectedModules()
2195 vector<string> const & mods = params().getModules();
2196 vector<string>::const_iterator it = mods.begin();
2197 vector<string>::const_iterator end = mods.end();
2198 vector<modInfoStruct> mInfo;
2199 for (; it != end; ++it) {
2202 LyXModule * mod = moduleList[*it];
2204 m.name = qt_(mod->getName());
2206 m.name = toqstr(*it) + toqstr(" (") + qt_("Not Found") + toqstr(")");
2213 DocumentClass const & GuiDocument::documentClass() const
2215 return bp_.documentClass();
2219 static void dispatch_bufferparams(Dialog const & dialog,
2220 BufferParams const & bp, FuncCode lfun)
2223 ss << "\\begin_header\n";
2225 ss << "\\end_header\n";
2226 dialog.dispatch(FuncRequest(lfun, ss.str()));
2230 void GuiDocument::dispatchParams()
2232 // This must come first so that a language change is correctly noticed
2235 // Apply the BufferParams. Note that this will set the base class
2236 // and then update the buffer's layout.
2237 dispatch_bufferparams(*this, params(), LFUN_BUFFER_PARAMS_APPLY);
2239 if (!params().master.empty()) {
2240 FileName const master_file = support::makeAbsPath(params().master,
2241 support::onlyPath(buffer().absFileName()));
2242 if (isLyXFilename(master_file.absFilename())) {
2243 Buffer * master = checkAndLoadLyXFile(master_file);
2244 buffer().setParent(master);
2248 // Generate the colours requested by each new branch.
2249 BranchList & branchlist = params().branchlist();
2250 if (!branchlist.empty()) {
2251 BranchList::const_iterator it = branchlist.begin();
2252 BranchList::const_iterator const end = branchlist.end();
2253 for (; it != end; ++it) {
2254 docstring const & current_branch = it->getBranch();
2255 Branch const * branch = branchlist.find(current_branch);
2256 string const x11hexname = X11hexname(branch->getColor());
2257 // display the new color
2258 docstring const str = current_branch + ' ' + from_ascii(x11hexname);
2259 dispatch(FuncRequest(LFUN_SET_COLOR, str));
2262 // Open insets of selected branches, close deselected ones
2263 dispatch(FuncRequest(LFUN_ALL_INSETS_TOGGLE,
2266 // FIXME: If we used an LFUN, we would not need those two lines:
2267 bufferview()->processUpdateFlags(Update::Force | Update::FitCursor);
2271 void GuiDocument::setLanguage() const
2273 Language const * const newL = bp_.language;
2274 if (buffer().params().language == newL)
2277 string const & lang_name = newL->lang();
2278 dispatch(FuncRequest(LFUN_BUFFER_LANGUAGE, lang_name));
2282 void GuiDocument::saveAsDefault() const
2284 dispatch_bufferparams(*this, params(), LFUN_BUFFER_SAVE_AS_DEFAULT);
2288 bool GuiDocument::isFontAvailable(string const & font) const
2290 if (font == "default" || font == "cmr"
2291 || font == "cmss" || font == "cmtt")
2292 // these are standard
2294 if (font == "lmodern" || font == "lmss" || font == "lmtt")
2295 return LaTeXFeatures::isAvailable("lmodern");
2296 if (font == "times" || font == "palatino"
2297 || font == "helvet" || font == "courier")
2298 return LaTeXFeatures::isAvailable("psnfss");
2299 if (font == "cmbr" || font == "cmtl")
2300 return LaTeXFeatures::isAvailable("cmbright");
2301 if (font == "utopia")
2302 return LaTeXFeatures::isAvailable("utopia")
2303 || LaTeXFeatures::isAvailable("fourier");
2304 if (font == "beraserif" || font == "berasans"
2305 || font == "beramono")
2306 return LaTeXFeatures::isAvailable("bera");
2307 return LaTeXFeatures::isAvailable(font);
2311 bool GuiDocument::providesOSF(string const & font) const
2314 return isFontAvailable("eco");
2315 if (font == "palatino")
2316 return isFontAvailable("mathpazo");
2321 bool GuiDocument::providesSC(string const & font) const
2323 if (font == "palatino")
2324 return isFontAvailable("mathpazo");
2325 if (font == "utopia")
2326 return isFontAvailable("fourier");
2331 bool GuiDocument::providesScale(string const & font) const
2333 return font == "helvet" || font == "luximono"
2334 || font == "berasans" || font == "beramono";
2338 void GuiDocument::loadModuleInfo()
2340 moduleNames_.clear();
2341 LyXModuleList::const_iterator it = moduleList.begin();
2342 LyXModuleList::const_iterator end = moduleList.end();
2343 for (; it != end; ++it) {
2346 m.name = qt_(it->getName());
2347 // this is supposed to give us the first sentence of the description
2348 QString desc = qt_(it->getDescription());
2349 int const pos = desc.indexOf(".");
2351 desc.truncate(pos + 1);
2352 m.description = desc;
2353 moduleNames_.push_back(m);
2358 Dialog * createGuiDocument(GuiView & lv) { return new GuiDocument(lv); }
2361 } // namespace frontend
2364 #include "GuiDocument_moc.cpp"