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 "LaTeXHighlighter.h"
19 #include "LengthCombo.h"
20 #include "PanelStack.h"
21 #include "Validator.h"
23 #include "LayoutFile.h"
24 #include "BranchList.h"
25 #include "buffer_funcs.h"
27 #include "BufferParams.h"
28 #include "BufferView.h"
31 #include "FloatPlacement.h"
32 #include "FuncRequest.h"
34 #include "LaTeXFeatures.h"
36 #include "LyXRC.h" // defaultUnit
37 #include "ModuleList.h"
38 #include "OutputParams.h"
39 #include "PDFOptions.h"
40 #include "qt_helpers.h"
43 #include "insets/InsetListingsParams.h"
45 #include "support/debug.h"
46 #include "support/FileName.h"
47 #include "support/filetools.h"
48 #include "support/gettext.h"
49 #include "support/lstrings.h"
51 #include "frontends/alert.h"
53 #include <QCloseEvent>
55 #include <QStandardItemModel.h>
56 #include <QTextCursor>
66 using namespace lyx::support;
71 char const * const tex_graphics[] =
73 "default", "dvips", "dvitops", "emtex",
74 "ln", "oztex", "textures", "none", ""
78 char const * const tex_graphics_gui[] =
80 N_("Default"), "Dvips", "DVItoPS", "EmTeX",
81 "LN", "OzTeX", "Textures", N_("None"), ""
85 char const * const tex_fonts_roman[] =
87 "default", "cmr", "lmodern", "ae", "times", "palatino",
88 "charter", "newcent", "bookman", "utopia", "beraserif",
89 "ccfonts", "chancery", ""
93 char const * tex_fonts_roman_gui[] =
95 N_("Default"), N_("Computer Modern Roman"), N_("Latin Modern Roman"),
96 N_("AE (Almost European)"), N_("Times Roman"), N_("Palatino"),
97 N_("Bitstream Charter"), N_("New Century Schoolbook"), N_("Bookman"),
98 N_("Utopia"), N_("Bera Serif"), N_("Concrete Roman"), N_("Zapf Chancery"),
103 char const * const tex_fonts_sans[] =
105 "default", "cmss", "lmss", "helvet", "avant", "berasans", "cmbr", ""
109 char const * tex_fonts_sans_gui[] =
111 N_("Default"), N_("Computer Modern Sans"), N_("Latin Modern Sans"),
112 N_("Helvetica"), N_("Avant Garde"), N_("Bera Sans"), N_("CM Bright"), ""
116 char const * const tex_fonts_monospaced[] =
118 "default", "cmtt", "lmtt", "courier", "beramono", "luximono", "cmtl", ""
122 char const * tex_fonts_monospaced_gui[] =
124 N_("Default"), N_("Computer Modern Typewriter"),
125 N_("Latin Modern Typewriter"), N_("Courier"), N_("Bera Mono"),
126 N_("LuxiMono"), N_("CM Typewriter Light"), ""
130 vector<pair<string, lyx::docstring> > pagestyles;
133 } // anonymous namespace
138 // used when sorting the textclass list.
139 class less_textclass_avail_desc
140 : public binary_function<string, string, int>
143 int operator()(string const & lhs, string const & rhs) const
145 // Ordering criteria:
146 // 1. Availability of text class
147 // 2. Description (lexicographic)
148 LayoutFile const & tc1 = LayoutFileList::get()[lhs];
149 LayoutFile const & tc2 = LayoutFileList::get()[rhs];
150 return (tc1.isTeXClassAvailable() && !tc2.isTeXClassAvailable()) ||
151 (tc1.isTeXClassAvailable() == tc2.isTeXClassAvailable() &&
152 _(tc1.description()) < _(tc2.description()));
162 QModelIndex getSelectedIndex(QListView * lv)
164 QModelIndex retval = QModelIndex();
165 QModelIndexList selIdx =
166 lv->selectionModel()->selectedIndexes();
168 retval = selIdx.first();
174 vector<string> getRequiredList(string const & modName)
176 LyXModule const * const mod = moduleList[modName];
178 return vector<string>(); //empty such thing
179 return mod->getRequiredModules();
183 vector<string> getExcludedList(string const & modName)
185 LyXModule const * const mod = moduleList[modName];
187 return vector<string>(); //empty such thing
188 return mod->getExcludedModules();
192 docstring getModuleDescription(string const & modName)
194 LyXModule const * const mod = moduleList[modName];
196 return _("Module not found!");
197 return _(mod->getDescription());
201 vector<string> getPackageList(string const & modName)
203 LyXModule const * const mod = moduleList[modName];
205 return vector<string>(); //empty such thing
206 return mod->getPackageList();
210 bool isModuleAvailable(string const & modName)
212 LyXModule * mod = moduleList[modName];
215 return mod->isAvailable();
217 } //anonymous namespace
220 ModuleSelMan::ModuleSelMan(
221 QListView * availableLV,
222 QListView * selectedLV,
226 QPushButton * downPB,
227 GuiIdListModel * availableModel,
228 GuiIdListModel * selectedModel) :
229 GuiSelectionManager(availableLV, selectedLV, addPB, delPB,
230 upPB, downPB, availableModel, selectedModel)
234 void ModuleSelMan::updateAddPB()
236 int const arows = availableModel->rowCount();
237 QModelIndexList const availSels =
238 availableLV->selectionModel()->selectedIndexes();
239 if (arows == 0 || availSels.isEmpty() || isSelected(availSels.first())) {
240 addPB->setEnabled(false);
244 QModelIndex const & idx = availableLV->selectionModel()->currentIndex();
245 string const modName = getAvailableModel()->getIDString(idx.row());
246 vector<string> reqs = getRequiredList(modName);
247 vector<string> excl = getExcludedList(modName);
249 if (reqs.empty() && excl.empty()) {
250 addPB->setEnabled(true);
254 int const srows = selectedModel->rowCount();
255 vector<string> selModList;
256 for (int i = 0; i < srows; ++i)
257 selModList.push_back(getSelectedModel()->getIDString(i));
259 vector<string>::const_iterator selModStart = selModList.begin();
260 vector<string>::const_iterator selModEnd = selModList.end();
262 //Check whether some required module is available
264 bool foundOne = false;
265 vector<string>::const_iterator it = reqs.begin();
266 vector<string>::const_iterator end = reqs.end();
267 for (; it != end; ++it) {
268 if (find(selModStart, selModEnd, *it) != selModEnd) {
274 addPB->setEnabled(false);
279 //Check whether any excluded module is being used
281 vector<string>::const_iterator it = excl.begin();
282 vector<string>::const_iterator end = excl.end();
283 for (; it != end; ++it) {
284 if (find(selModStart, selModEnd, *it) != selModEnd) {
285 addPB->setEnabled(false);
291 addPB->setEnabled(true);
295 void ModuleSelMan::updateDownPB()
297 int const srows = selectedModel->rowCount();
299 downPB->setEnabled(false);
302 QModelIndexList const selSels =
303 selectedLV->selectionModel()->selectedIndexes();
304 //disable if empty or last item is selected
305 if (selSels.empty() || selSels.first().row() == srows - 1) {
306 downPB->setEnabled(false);
309 //determine whether immediately succeding element requires this one
310 QModelIndex const & curIdx = selectedLV->selectionModel()->currentIndex();
311 int curRow = curIdx.row();
312 if (curRow < 0 || curRow >= srows - 1) { //this shouldn't happen...
313 downPB->setEnabled(false);
316 string const curModName = getSelectedModel()->getIDString(curRow);
317 string const nextModName = getSelectedModel()->getIDString(curRow + 1);
319 vector<string> reqs = getRequiredList(nextModName);
321 //if it doesn't require anything....
323 downPB->setEnabled(true);
327 //FIXME This should perhaps be more flexible and check whether, even
328 //if this one is required, there is also an earlier one that is required.
329 //enable it if this module isn't required
331 find(reqs.begin(), reqs.end(), curModName) == reqs.end());
334 void ModuleSelMan::updateUpPB()
336 int const srows = selectedModel->rowCount();
338 upPB->setEnabled(false);
341 QModelIndexList const selSels =
342 selectedLV->selectionModel()->selectedIndexes();
343 //disable if empty or first item is selected
344 if (selSels.empty() || selSels.first().row() == 0) {
345 upPB->setEnabled(false);
349 //determine whether immediately preceding element is required by this one
350 QModelIndex const & curIdx = selectedLV->selectionModel()->currentIndex();
351 int curRow = curIdx.row();
352 if (curRow <= -1 || curRow > srows - 1) { //sanity check
353 downPB->setEnabled(false);
356 string const curModName = getSelectedModel()->getIDString(curRow);
357 vector<string> reqs = getRequiredList(curModName);
359 //if this one doesn't require anything....
361 upPB->setEnabled(true);
365 string preModName = getSelectedModel()->getIDString(curRow - 1);
367 //NOTE This is less flexible than it might be. You could check whether, even
368 //if this one is required, there is also an earlier one that is required.
369 //enable it if the preceding module isn't required
370 upPB->setEnabled(find(reqs.begin(), reqs.end(), preModName) == reqs.end());
373 void ModuleSelMan::updateDelPB()
375 int const srows = selectedModel->rowCount();
377 deletePB->setEnabled(false);
380 QModelIndexList const selSels =
381 selectedLV->selectionModel()->selectedIndexes();
382 if (selSels.empty() || selSels.first().row() < 0) {
383 deletePB->setEnabled(false);
387 //determine whether some LATER module requires this one
388 //NOTE Things are arranged so that this is the only way there
389 //can be a problem. At least, we hope so.
390 QModelIndex const & curIdx =
391 selectedLV->selectionModel()->currentIndex();
392 int const curRow = curIdx.row();
393 if (curRow < 0 || curRow >= srows) { //this shouldn't happen
394 deletePB->setEnabled(false);
398 QString const curModName = curIdx.data().toString();
400 //We're looking here for a reason NOT to enable the button. If we
401 //find one, we disable it and return. If we don't, we'll end up at
402 //the end of the function, and then we enable it.
403 for (int i = curRow + 1; i < srows; ++i) {
404 string const thisMod = getSelectedModel()->getIDString(i);
405 vector<string> reqs = getRequiredList(thisMod);
406 //does this one require us?
407 if (find(reqs.begin(), reqs.end(), fromqstr(curModName)) == reqs.end())
411 //OK, so this module requires us
412 //is there an EARLIER module that also satisfies the require?
413 //NOTE We demand that it be earlier to keep the list of modules
414 //consistent with the rule that a module must be proceeded by a
415 //required module. There would be more flexible ways to proceed,
416 //but that would be a lot more complicated, and the logic here is
417 //already complicated. (That's why I've left the debugging code.)
418 //lyxerr << "Testing " << thisMod << std::endl;
419 bool foundOne = false;
420 for (int j = 0; j < curRow; ++j) {
421 string const mod = getSelectedModel()->getIDString(j);
422 //lyxerr << "In loop: Testing " << mod << std::endl;
423 //do we satisfy the require?
424 if (find(reqs.begin(), reqs.end(), mod) != reqs.end()) {
425 //lyxerr << mod << " does the trick." << std::endl;
430 //did we find a module to satisfy the require?
432 //lyxerr << "No matching module found." << std::endl;
433 deletePB->setEnabled(false);
437 //lyxerr << "All's well that ends well." << std::endl;
438 deletePB->setEnabled(true);
442 /////////////////////////////////////////////////////////////////////
446 /////////////////////////////////////////////////////////////////////
448 PreambleModule::PreambleModule(): current_id_(0)
450 // This is not a memory leak. The object will be destroyed
452 (void) new LaTeXHighlighter(preambleTE->document());
453 setFocusProxy(preambleTE);
454 connect(preambleTE, SIGNAL(textChanged()), this, SIGNAL(changed()));
458 void PreambleModule::update(BufferParams const & params, BufferId id)
460 QString preamble = toqstr(params.preamble);
461 // Nothing to do if the params and preamble are unchanged.
462 if (id == current_id_
463 && preamble == preambleTE->document()->toPlainText())
466 QTextCursor cur = preambleTE->textCursor();
467 // Save the coords before switching to the new one.
468 preamble_coords_[current_id_] =
469 make_pair(cur.position(), preambleTE->verticalScrollBar()->value());
471 // Save the params address for further use.
473 preambleTE->document()->setPlainText(preamble);
474 Coords::const_iterator it = preamble_coords_.find(current_id_);
475 if (it == preamble_coords_.end())
476 // First time we open this one.
477 preamble_coords_[current_id_] = make_pair(0,0);
479 // Restore saved coords.
480 QTextCursor cur = preambleTE->textCursor();
481 cur.setPosition(it->second.first);
482 preambleTE->setTextCursor(cur);
483 preambleTE->verticalScrollBar()->setValue(it->second.second);
488 void PreambleModule::apply(BufferParams & params)
490 params.preamble = fromqstr(preambleTE->document()->toPlainText());
494 void PreambleModule::closeEvent(QCloseEvent * e)
496 // Save the coords before closing.
497 QTextCursor cur = preambleTE->textCursor();
498 preamble_coords_[current_id_] =
499 make_pair(cur.position(), preambleTE->verticalScrollBar()->value());
504 /////////////////////////////////////////////////////////////////////
508 /////////////////////////////////////////////////////////////////////
511 GuiDocument::GuiDocument(GuiView & lv)
512 : GuiDialog(lv, "document", qt_("Document Settings")), current_id_(0)
516 connect(okPB, SIGNAL(clicked()), this, SLOT(slotOK()));
517 connect(applyPB, SIGNAL(clicked()), this, SLOT(slotApply()));
518 connect(closePB, SIGNAL(clicked()), this, SLOT(slotClose()));
519 connect(restorePB, SIGNAL(clicked()), this, SLOT(slotRestore()));
521 connect(savePB, SIGNAL(clicked()), this, SLOT(saveDefaultClicked()));
522 connect(defaultPB, SIGNAL(clicked()), this, SLOT(useDefaultsClicked()));
524 // Manage the restore, ok, apply, restore and cancel/close buttons
525 bc().setPolicy(ButtonPolicy::NoRepeatedApplyReadOnlyPolicy);
527 bc().setApply(applyPB);
528 bc().setCancel(closePB);
529 bc().setRestore(restorePB);
531 textLayoutModule = new UiWidget<Ui::TextLayoutUi>;
533 connect(textLayoutModule->lspacingCO, SIGNAL(activated(int)),
534 this, SLOT(change_adaptor()));
535 connect(textLayoutModule->lspacingCO, SIGNAL(activated(int)),
536 this, SLOT(setLSpacing(int)));
537 connect(textLayoutModule->lspacingLE, SIGNAL(textChanged(const QString &)),
538 this, SLOT(change_adaptor()));
539 connect(textLayoutModule->skipRB, SIGNAL(clicked()),
540 this, SLOT(change_adaptor()));
541 connect(textLayoutModule->indentRB, SIGNAL(clicked()),
542 this, SLOT(change_adaptor()));
543 connect(textLayoutModule->skipCO, SIGNAL(activated(int)),
544 this, SLOT(change_adaptor()));
545 connect(textLayoutModule->skipLE, SIGNAL(textChanged(const QString &)),
546 this, SLOT(change_adaptor()));
547 connect(textLayoutModule->skipLengthCO, SIGNAL(activated(int)),
548 this, SLOT(change_adaptor()));
549 connect(textLayoutModule->skipCO, SIGNAL(activated(int)),
550 this, SLOT(setSkip(int)));
551 connect(textLayoutModule->skipRB, SIGNAL(toggled(bool)),
552 this, SLOT(enableSkip(bool)));
553 connect(textLayoutModule->twoColumnCB, SIGNAL(clicked()),
554 this, SLOT(change_adaptor()));
555 connect(textLayoutModule->twoColumnCB, SIGNAL(clicked()),
556 this, SLOT(setColSep()));
557 connect(textLayoutModule->listingsED, SIGNAL(textChanged()),
558 this, SLOT(change_adaptor()));
559 connect(textLayoutModule->bypassCB, SIGNAL(clicked()),
560 this, SLOT(change_adaptor()));
561 connect(textLayoutModule->bypassCB, SIGNAL(clicked()),
562 this, SLOT(set_listings_msg()));
563 connect(textLayoutModule->listingsED, SIGNAL(textChanged()),
564 this, SLOT(set_listings_msg()));
565 textLayoutModule->listingsTB->setPlainText(
566 qt_("Input listings parameters on the right. Enter ? for a list of parameters."));
567 textLayoutModule->lspacingLE->setValidator(new QDoubleValidator(
568 textLayoutModule->lspacingLE));
569 textLayoutModule->skipLE->setValidator(unsignedLengthValidator(
570 textLayoutModule->skipLE));
572 textLayoutModule->skipCO->addItem(qt_("SmallSkip"));
573 textLayoutModule->skipCO->addItem(qt_("MedSkip"));
574 textLayoutModule->skipCO->addItem(qt_("BigSkip"));
575 textLayoutModule->skipCO->addItem(qt_("Length"));
576 // remove the %-items from the unit choice
577 textLayoutModule->skipLengthCO->noPercents();
578 textLayoutModule->lspacingCO->insertItem(
579 Spacing::Single, qt_("Single"));
580 textLayoutModule->lspacingCO->insertItem(
581 Spacing::Onehalf, qt_("OneHalf"));
582 textLayoutModule->lspacingCO->insertItem(
583 Spacing::Double, qt_("Double"));
584 textLayoutModule->lspacingCO->insertItem(
585 Spacing::Other, qt_("Custom"));
587 // initialize the length validator
588 bc().addCheckedLineEdit(textLayoutModule->skipLE);
590 fontModule = new UiWidget<Ui::FontUi>;
592 connect(fontModule->fontsRomanCO, SIGNAL(activated(int)),
593 this, SLOT(change_adaptor()));
594 connect(fontModule->fontsRomanCO, SIGNAL(activated(int)),
595 this, SLOT(romanChanged(int)));
596 connect(fontModule->fontsSansCO, SIGNAL(activated(int)),
597 this, SLOT(change_adaptor()));
598 connect(fontModule->fontsSansCO, SIGNAL(activated(int)),
599 this, SLOT(sansChanged(int)));
600 connect(fontModule->fontsTypewriterCO, SIGNAL(activated(int)),
601 this, SLOT(change_adaptor()));
602 connect(fontModule->fontsTypewriterCO, SIGNAL(activated(int)),
603 this, SLOT(ttChanged(int)));
604 connect(fontModule->fontsDefaultCO, SIGNAL(activated(int)),
605 this, SLOT(change_adaptor()));
606 connect(fontModule->fontsizeCO, SIGNAL(activated(int)),
607 this, SLOT(change_adaptor()));
608 connect(fontModule->scaleSansSB, SIGNAL(valueChanged(int)),
609 this, SLOT(change_adaptor()));
610 connect(fontModule->scaleTypewriterSB, SIGNAL(valueChanged(int)),
611 this, SLOT(change_adaptor()));
612 connect(fontModule->fontScCB, SIGNAL(clicked()),
613 this, SLOT(change_adaptor()));
614 connect(fontModule->fontOsfCB, SIGNAL(clicked()),
615 this, SLOT(change_adaptor()));
617 for (int n = 0; tex_fonts_roman[n][0]; ++n) {
618 QString font = qt_(tex_fonts_roman_gui[n]);
619 if (!isFontAvailable(tex_fonts_roman[n]))
620 font += qt_(" (not installed)");
621 fontModule->fontsRomanCO->addItem(font);
623 for (int n = 0; tex_fonts_sans[n][0]; ++n) {
624 QString font = qt_(tex_fonts_sans_gui[n]);
625 if (!isFontAvailable(tex_fonts_sans[n]))
626 font += qt_(" (not installed)");
627 fontModule->fontsSansCO->addItem(font);
629 for (int n = 0; tex_fonts_monospaced[n][0]; ++n) {
630 QString font = qt_(tex_fonts_monospaced_gui[n]);
631 if (!isFontAvailable(tex_fonts_monospaced[n]))
632 font += qt_(" (not installed)");
633 fontModule->fontsTypewriterCO->addItem(font);
636 fontModule->fontsizeCO->addItem(qt_("Default"));
637 fontModule->fontsizeCO->addItem(qt_("10"));
638 fontModule->fontsizeCO->addItem(qt_("11"));
639 fontModule->fontsizeCO->addItem(qt_("12"));
641 for (int n = 0; GuiDocument::fontfamilies_gui[n][0]; ++n)
642 fontModule->fontsDefaultCO->addItem(
643 qt_(GuiDocument::fontfamilies_gui[n]));
646 pageLayoutModule = new UiWidget<Ui::PageLayoutUi>;
648 connect(pageLayoutModule->papersizeCO, SIGNAL(activated(int)),
649 this, SLOT(setCustomPapersize(int)));
650 connect(pageLayoutModule->papersizeCO, SIGNAL(activated(int)),
651 this, SLOT(setCustomPapersize(int)));
652 connect(pageLayoutModule->portraitRB, SIGNAL(clicked()),
653 this, SLOT(portraitChanged()));
654 connect(pageLayoutModule->papersizeCO, SIGNAL(activated(int)),
655 this, SLOT(change_adaptor()));
656 connect(pageLayoutModule->paperheightLE, SIGNAL(textChanged(const QString &)),
657 this, SLOT(change_adaptor()));
658 connect(pageLayoutModule->paperwidthLE, SIGNAL(textChanged(const QString &)),
659 this, SLOT(change_adaptor()));
660 connect(pageLayoutModule->paperwidthUnitCO, SIGNAL(activated(int)),
661 this, SLOT(change_adaptor()));
662 connect(pageLayoutModule->paperheightUnitCO, SIGNAL(activated(int)),
663 this, SLOT(change_adaptor()));
664 connect(pageLayoutModule->portraitRB, SIGNAL(clicked()),
665 this, SLOT(change_adaptor()));
666 connect(pageLayoutModule->landscapeRB, SIGNAL(clicked()),
667 this, SLOT(change_adaptor()));
668 connect(pageLayoutModule->facingPagesCB, SIGNAL(clicked()),
669 this, SLOT(change_adaptor()));
670 connect(pageLayoutModule->pagestyleCO, SIGNAL(activated(int)),
671 this, SLOT(change_adaptor()));
673 pageLayoutModule->pagestyleCO->addItem(qt_("Default"));
674 pageLayoutModule->pagestyleCO->addItem(qt_("empty"));
675 pageLayoutModule->pagestyleCO->addItem(qt_("plain"));
676 pageLayoutModule->pagestyleCO->addItem(qt_("headings"));
677 pageLayoutModule->pagestyleCO->addItem(qt_("fancy"));
678 bc().addCheckedLineEdit(pageLayoutModule->paperheightLE,
679 pageLayoutModule->paperheightL);
680 bc().addCheckedLineEdit(pageLayoutModule->paperwidthLE,
681 pageLayoutModule->paperwidthL);
684 QComboBox * cb = pageLayoutModule->papersizeCO;
685 cb->addItem(qt_("Default"));
686 cb->addItem(qt_("Custom"));
687 cb->addItem(qt_("US letter"));
688 cb->addItem(qt_("US legal"));
689 cb->addItem(qt_("US executive"));
690 cb->addItem(qt_("A3"));
691 cb->addItem(qt_("A4"));
692 cb->addItem(qt_("A5"));
693 cb->addItem(qt_("B3"));
694 cb->addItem(qt_("B4"));
695 cb->addItem(qt_("B5"));
696 // remove the %-items from the unit choice
697 pageLayoutModule->paperwidthUnitCO->noPercents();
698 pageLayoutModule->paperheightUnitCO->noPercents();
699 pageLayoutModule->paperheightLE->setValidator(unsignedLengthValidator(
700 pageLayoutModule->paperheightLE));
701 pageLayoutModule->paperwidthLE->setValidator(unsignedLengthValidator(
702 pageLayoutModule->paperwidthLE));
705 marginsModule = new UiWidget<Ui::MarginsUi>;
707 connect(marginsModule->marginCB, SIGNAL(toggled(bool)),
708 this, SLOT(setCustomMargins(bool)));
709 connect(marginsModule->marginCB, SIGNAL(clicked()),
710 this, SLOT(change_adaptor()));
711 connect(marginsModule->topLE, SIGNAL(textChanged(const QString &)),
712 this, SLOT(change_adaptor()));
713 connect(marginsModule->topUnit, SIGNAL(activated(int)),
714 this, SLOT(change_adaptor()));
715 connect(marginsModule->bottomLE, SIGNAL(textChanged(const QString &)),
716 this, SLOT(change_adaptor()));
717 connect(marginsModule->bottomUnit, SIGNAL(activated(int)),
718 this, SLOT(change_adaptor()));
719 connect(marginsModule->innerLE, SIGNAL(textChanged(const QString &)),
720 this, SLOT(change_adaptor()));
721 connect(marginsModule->innerUnit, SIGNAL(activated(int)),
722 this, SLOT(change_adaptor()));
723 connect(marginsModule->outerLE, SIGNAL(textChanged(const QString &)),
724 this, SLOT(change_adaptor()));
725 connect(marginsModule->outerUnit, SIGNAL(activated(int)),
726 this, SLOT(change_adaptor()));
727 connect(marginsModule->headheightLE, SIGNAL(textChanged(const QString &)),
728 this, SLOT(change_adaptor()));
729 connect(marginsModule->headheightUnit, SIGNAL(activated(int)),
730 this, SLOT(change_adaptor()));
731 connect(marginsModule->headsepLE, SIGNAL(textChanged(const QString &)),
732 this, SLOT(change_adaptor()));
733 connect(marginsModule->headsepUnit, SIGNAL(activated(int)),
734 this, SLOT(change_adaptor()));
735 connect(marginsModule->footskipLE, SIGNAL(textChanged(const QString&)),
736 this, SLOT(change_adaptor()));
737 connect(marginsModule->footskipUnit, SIGNAL(activated(int)),
738 this, SLOT(change_adaptor()));
739 connect(marginsModule->columnsepLE, SIGNAL(textChanged(const QString&)),
740 this, SLOT(change_adaptor()));
741 connect(marginsModule->columnsepUnit, SIGNAL(activated(int)),
742 this, SLOT(change_adaptor()));
743 marginsModule->topLE->setValidator(unsignedLengthValidator(
744 marginsModule->topLE));
745 marginsModule->bottomLE->setValidator(unsignedLengthValidator(
746 marginsModule->bottomLE));
747 marginsModule->innerLE->setValidator(unsignedLengthValidator(
748 marginsModule->innerLE));
749 marginsModule->outerLE->setValidator(unsignedLengthValidator(
750 marginsModule->outerLE));
751 marginsModule->headsepLE->setValidator(unsignedLengthValidator(
752 marginsModule->headsepLE));
753 marginsModule->headheightLE->setValidator(unsignedLengthValidator(
754 marginsModule->headheightLE));
755 marginsModule->footskipLE->setValidator(unsignedLengthValidator(
756 marginsModule->footskipLE));
757 marginsModule->columnsepLE->setValidator(unsignedLengthValidator(
758 marginsModule->columnsepLE));
760 bc().addCheckedLineEdit(marginsModule->topLE,
761 marginsModule->topL);
762 bc().addCheckedLineEdit(marginsModule->bottomLE,
763 marginsModule->bottomL);
764 bc().addCheckedLineEdit(marginsModule->innerLE,
765 marginsModule->innerL);
766 bc().addCheckedLineEdit(marginsModule->outerLE,
767 marginsModule->outerL);
768 bc().addCheckedLineEdit(marginsModule->headsepLE,
769 marginsModule->headsepL);
770 bc().addCheckedLineEdit(marginsModule->headheightLE,
771 marginsModule->headheightL);
772 bc().addCheckedLineEdit(marginsModule->footskipLE,
773 marginsModule->footskipL);
774 bc().addCheckedLineEdit(marginsModule->columnsepLE,
775 marginsModule->columnsepL);
778 langModule = new UiWidget<Ui::LanguageUi>;
780 connect(langModule->languageCO, SIGNAL(activated(int)),
781 this, SLOT(change_adaptor()));
782 connect(langModule->defaultencodingRB, SIGNAL(clicked()),
783 this, SLOT(change_adaptor()));
784 connect(langModule->otherencodingRB, SIGNAL(clicked()),
785 this, SLOT(change_adaptor()));
786 connect(langModule->encodingCO, SIGNAL(activated(int)),
787 this, SLOT(change_adaptor()));
788 connect(langModule->quoteStyleCO, SIGNAL(activated(int)),
789 this, SLOT(change_adaptor()));
791 langModule->languageCO->setModel(guiApp->languageModel());
793 // Always put the default encoding in the first position.
794 // It is special because the displayed text is translated.
795 langModule->encodingCO->addItem(qt_("LaTeX default"));
796 Encodings::const_iterator it = encodings.begin();
797 Encodings::const_iterator const end = encodings.end();
798 for (; it != end; ++it)
799 langModule->encodingCO->addItem(toqstr(it->latexName()));
801 langModule->quoteStyleCO->addItem(qt_("``text''"));
802 langModule->quoteStyleCO->addItem(qt_("''text''"));
803 langModule->quoteStyleCO->addItem(qt_(",,text``"));
804 langModule->quoteStyleCO->addItem(qt_(",,text''"));
805 langModule->quoteStyleCO->addItem(qt_("<<text>>"));
806 langModule->quoteStyleCO->addItem(qt_(">>text<<"));
809 numberingModule = new UiWidget<Ui::NumberingUi>;
811 connect(numberingModule->depthSL, SIGNAL(valueChanged(int)),
812 this, SLOT(change_adaptor()));
813 connect(numberingModule->tocSL, SIGNAL(valueChanged(int)),
814 this, SLOT(change_adaptor()));
815 connect(numberingModule->depthSL, SIGNAL(valueChanged(int)),
816 this, SLOT(updateNumbering()));
817 connect(numberingModule->tocSL, SIGNAL(valueChanged(int)),
818 this, SLOT(updateNumbering()));
819 numberingModule->tocTW->setColumnCount(3);
820 numberingModule->tocTW->headerItem()->setText(0, qt_("Example"));
821 numberingModule->tocTW->headerItem()->setText(1, qt_("Numbered"));
822 numberingModule->tocTW->headerItem()->setText(2, qt_("Appears in TOC"));
825 biblioModule = new UiWidget<Ui::BiblioUi>;
826 connect(biblioModule->citeNatbibRB, SIGNAL(toggled(bool)),
827 biblioModule->citationStyleL, SLOT(setEnabled(bool)));
828 connect(biblioModule->citeNatbibRB, SIGNAL(toggled(bool)),
829 biblioModule->citeStyleCO, SLOT(setEnabled(bool)));
831 connect(biblioModule->citeDefaultRB, SIGNAL(clicked()),
832 this, SLOT(change_adaptor()));
833 connect(biblioModule->citeNatbibRB, SIGNAL(clicked()),
834 this, SLOT(change_adaptor()));
835 connect(biblioModule->citeStyleCO, SIGNAL(activated(int)),
836 this, SLOT(change_adaptor()));
837 connect(biblioModule->citeJurabibRB, SIGNAL(clicked()),
838 this, SLOT(change_adaptor()));
839 connect(biblioModule->bibtopicCB, SIGNAL(clicked()),
840 this, SLOT(change_adaptor()));
842 biblioModule->citeStyleCO->addItem(qt_("Author-year"));
843 biblioModule->citeStyleCO->addItem(qt_("Numerical"));
844 biblioModule->citeStyleCO->setCurrentIndex(0);
847 mathsModule = new UiWidget<Ui::MathsUi>;
848 connect(mathsModule->amsautoCB, SIGNAL(toggled(bool)),
849 mathsModule->amsCB, SLOT(setDisabled(bool)));
850 connect(mathsModule->esintautoCB, SIGNAL(toggled(bool)),
851 mathsModule->esintCB, SLOT(setDisabled(bool)));
853 connect(mathsModule->amsCB, SIGNAL(clicked()),
854 this, SLOT(change_adaptor()));
855 connect(mathsModule->amsautoCB, SIGNAL(clicked()),
856 this, SLOT(change_adaptor()));
857 connect(mathsModule->esintCB, SIGNAL(clicked()),
858 this, SLOT(change_adaptor()));
859 connect(mathsModule->esintautoCB, SIGNAL(clicked()),
860 this, SLOT(change_adaptor()));
862 latexModule = new UiWidget<Ui::LaTeXUi>;
864 connect(latexModule->optionsLE, SIGNAL(textChanged(const QString &)),
865 this, SLOT(change_adaptor()));
866 connect(latexModule->psdriverCO, SIGNAL(activated(int)),
867 this, SLOT(change_adaptor()));
868 connect(latexModule->classCO, SIGNAL(activated(int)),
869 this, SLOT(classChanged()));
870 connect(latexModule->classCO, SIGNAL(activated(int)),
871 this, SLOT(change_adaptor()));
872 connect(latexModule->layoutPB, SIGNAL(clicked()),
873 this, SLOT(browseLayout()));
874 connect(latexModule->childDocGB, SIGNAL(clicked()),
875 this, SLOT(change_adaptor()));
876 connect(latexModule->childDocLE, SIGNAL(textChanged(const QString &)),
877 this, SLOT(change_adaptor()));
878 connect(latexModule->childDocPB, SIGNAL(clicked()),
879 this, SLOT(browseMaster()));
882 new ModuleSelMan(latexModule->availableLV, latexModule->selectedLV,
883 latexModule->addPB, latexModule->deletePB,
884 latexModule->upPB, latexModule->downPB,
885 availableModel(), selectedModel());
886 connect(selectionManager, SIGNAL(updateHook()),
887 this, SLOT(updateModuleInfo()));
888 connect(selectionManager, SIGNAL(updateHook()),
889 this, SLOT(change_adaptor()));
891 // postscript drivers
892 for (int n = 0; tex_graphics[n][0]; ++n) {
893 QString enc = qt_(tex_graphics_gui[n]);
894 latexModule->psdriverCO->addItem(enc);
897 latexModule->classCO->setModel(&classes_model_);
898 LayoutFileList const & bcl = LayoutFileList::get();
899 vector<LayoutFileIndex> classList = bcl.classList();
900 sort(classList.begin(), classList.end(), less_textclass_avail_desc());
902 vector<LayoutFileIndex>::const_iterator cit = classList.begin();
903 vector<LayoutFileIndex>::const_iterator cen = classList.end();
904 for (int i = 0; cit != cen; ++cit, ++i) {
905 LayoutFile const & tc = bcl[*cit];
906 docstring item = (tc.isTeXClassAvailable()) ?
907 from_utf8(tc.description()) :
908 bformat(_("Unavailable: %1$s"), from_utf8(tc.description()));
909 classes_model_.insertRow(i, toqstr(item), *cit);
913 branchesModule = new GuiBranches;
914 connect(branchesModule, SIGNAL(changed()),
915 this, SLOT(change_adaptor()));
918 preambleModule = new PreambleModule;
919 connect(preambleModule, SIGNAL(changed()),
920 this, SLOT(change_adaptor()));
923 bulletsModule = new BulletsModule;
924 connect(bulletsModule, SIGNAL(changed()),
925 this, SLOT(change_adaptor()));
928 pdfSupportModule = new UiWidget<Ui::PDFSupportUi>;
930 connect(pdfSupportModule->use_hyperrefGB, SIGNAL(toggled(bool)),
931 this, SLOT(change_adaptor()));
932 connect(pdfSupportModule->titleLE, SIGNAL(textChanged(const QString &)),
933 this, SLOT(change_adaptor()));
934 connect(pdfSupportModule->authorLE, SIGNAL(textChanged(const QString &)),
935 this, SLOT(change_adaptor()));
936 connect(pdfSupportModule->subjectLE, SIGNAL(textChanged(const QString &)),
937 this, SLOT(change_adaptor()));
938 connect(pdfSupportModule->keywordsLE, SIGNAL(textChanged(const QString &)),
939 this, SLOT(change_adaptor()));
940 connect(pdfSupportModule->bookmarksGB, SIGNAL(toggled(bool)),
941 this, SLOT(change_adaptor()));
942 connect(pdfSupportModule->bookmarksnumberedCB, SIGNAL(toggled(bool)),
943 this, SLOT(change_adaptor()));
944 connect(pdfSupportModule->bookmarksopenGB, SIGNAL(toggled(bool)),
945 this, SLOT(change_adaptor()));
946 connect(pdfSupportModule->bookmarksopenlevelSB, SIGNAL(valueChanged(int)),
947 this, SLOT(change_adaptor()));
948 connect(pdfSupportModule->breaklinksCB, SIGNAL(toggled(bool)),
949 this, SLOT(change_adaptor()));
950 connect(pdfSupportModule->pdfborderCB, SIGNAL(toggled(bool)),
951 this, SLOT(change_adaptor()));
952 connect(pdfSupportModule->colorlinksCB, SIGNAL(toggled(bool)),
953 this, SLOT(change_adaptor()));
954 connect(pdfSupportModule->backrefCB, SIGNAL(toggled(bool)),
955 this, SLOT(change_adaptor()));
956 connect(pdfSupportModule->pdfusetitleCB, SIGNAL(toggled(bool)),
957 this, SLOT(change_adaptor()));
958 connect(pdfSupportModule->pagebackrefCB, SIGNAL(toggled(bool)),
959 this, SLOT(change_adaptor()));
960 connect(pdfSupportModule->fullscreenCB, SIGNAL(toggled(bool)),
961 this, SLOT(change_adaptor()));
962 connect(pdfSupportModule->optionsLE, SIGNAL(textChanged(const QString &)),
963 this, SLOT(change_adaptor()));
966 floatModule = new FloatPlacement;
967 connect(floatModule, SIGNAL(changed()),
968 this, SLOT(change_adaptor()));
970 docPS->addPanel(latexModule, qt_("Document Class"));
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 docstring GuiDocument::validate_listings_params()
1019 // use a cache here to avoid repeated validation
1020 // of the same parameters
1021 static string param_cache = string();
1022 static docstring msg_cache = docstring();
1024 if (textLayoutModule->bypassCB->isChecked())
1027 string params = fromqstr(textLayoutModule->listingsED->toPlainText());
1028 if (params != param_cache) {
1029 param_cache = params;
1030 msg_cache = InsetListingsParams(params).validate();
1036 void GuiDocument::set_listings_msg()
1038 static bool isOK = true;
1039 docstring msg = validate_listings_params();
1044 // listingsTB->setTextColor("black");
1045 textLayoutModule->listingsTB->setPlainText(
1046 qt_("Input listings parameters on the right. Enter ? for a list of parameters."));
1049 // listingsTB->setTextColor("red");
1050 textLayoutModule->listingsTB->setPlainText(toqstr(msg));
1055 void GuiDocument::setLSpacing(int item)
1057 textLayoutModule->lspacingLE->setEnabled(item == 3);
1061 void GuiDocument::setSkip(int item)
1063 bool const enable = (item == 3);
1064 textLayoutModule->skipLE->setEnabled(enable);
1065 textLayoutModule->skipLengthCO->setEnabled(enable);
1069 void GuiDocument::enableSkip(bool skip)
1071 textLayoutModule->skipCO->setEnabled(skip);
1072 textLayoutModule->skipLE->setEnabled(skip);
1073 textLayoutModule->skipLengthCO->setEnabled(skip);
1075 setSkip(textLayoutModule->skipCO->currentIndex());
1078 void GuiDocument::portraitChanged()
1080 setMargins(pageLayoutModule->papersizeCO->currentIndex());
1083 void GuiDocument::setMargins(bool custom)
1085 marginsModule->marginCB->setChecked(custom);
1086 setCustomMargins(custom);
1090 void GuiDocument::setCustomPapersize(int papersize)
1092 bool const custom = (papersize == 1);
1094 pageLayoutModule->paperwidthL->setEnabled(custom);
1095 pageLayoutModule->paperwidthLE->setEnabled(custom);
1096 pageLayoutModule->paperwidthUnitCO->setEnabled(custom);
1097 pageLayoutModule->paperheightL->setEnabled(custom);
1098 pageLayoutModule->paperheightLE->setEnabled(custom);
1099 pageLayoutModule->paperheightLE->setFocus();
1100 pageLayoutModule->paperheightUnitCO->setEnabled(custom);
1104 void GuiDocument::setColSep()
1106 setCustomMargins(marginsModule->marginCB->checkState() == Qt::Checked);
1110 void GuiDocument::setCustomMargins(bool custom)
1112 marginsModule->topL->setEnabled(!custom);
1113 marginsModule->topLE->setEnabled(!custom);
1114 marginsModule->topUnit->setEnabled(!custom);
1116 marginsModule->bottomL->setEnabled(!custom);
1117 marginsModule->bottomLE->setEnabled(!custom);
1118 marginsModule->bottomUnit->setEnabled(!custom);
1120 marginsModule->innerL->setEnabled(!custom);
1121 marginsModule->innerLE->setEnabled(!custom);
1122 marginsModule->innerUnit->setEnabled(!custom);
1124 marginsModule->outerL->setEnabled(!custom);
1125 marginsModule->outerLE->setEnabled(!custom);
1126 marginsModule->outerUnit->setEnabled(!custom);
1128 marginsModule->headheightL->setEnabled(!custom);
1129 marginsModule->headheightLE->setEnabled(!custom);
1130 marginsModule->headheightUnit->setEnabled(!custom);
1132 marginsModule->headsepL->setEnabled(!custom);
1133 marginsModule->headsepLE->setEnabled(!custom);
1134 marginsModule->headsepUnit->setEnabled(!custom);
1136 marginsModule->footskipL->setEnabled(!custom);
1137 marginsModule->footskipLE->setEnabled(!custom);
1138 marginsModule->footskipUnit->setEnabled(!custom);
1140 bool const enableColSep = !custom &&
1141 textLayoutModule->twoColumnCB->checkState() == Qt::Checked;
1142 marginsModule->columnsepL->setEnabled(enableColSep);
1143 marginsModule->columnsepLE->setEnabled(enableColSep);
1144 marginsModule->columnsepUnit->setEnabled(enableColSep);
1148 void GuiDocument::updateFontsize(string const & items, string const & sel)
1150 fontModule->fontsizeCO->clear();
1151 fontModule->fontsizeCO->addItem(qt_("Default"));
1153 for (int n = 0; !token(items,'|',n).empty(); ++n)
1154 fontModule->fontsizeCO->
1155 addItem(toqstr(token(items,'|',n)));
1157 for (int n = 0; n < fontModule->fontsizeCO->count(); ++n) {
1158 if (fromqstr(fontModule->fontsizeCO->itemText(n)) == sel) {
1159 fontModule->fontsizeCO->setCurrentIndex(n);
1166 void GuiDocument::romanChanged(int item)
1168 string const font = tex_fonts_roman[item];
1169 fontModule->fontScCB->setEnabled(providesSC(font));
1170 fontModule->fontOsfCB->setEnabled(providesOSF(font));
1174 void GuiDocument::sansChanged(int item)
1176 string const font = tex_fonts_sans[item];
1177 bool scaleable = providesScale(font);
1178 fontModule->scaleSansSB->setEnabled(scaleable);
1179 fontModule->scaleSansLA->setEnabled(scaleable);
1183 void GuiDocument::ttChanged(int item)
1185 string const font = tex_fonts_monospaced[item];
1186 bool scaleable = providesScale(font);
1187 fontModule->scaleTypewriterSB->setEnabled(scaleable);
1188 fontModule->scaleTypewriterLA->setEnabled(scaleable);
1192 void GuiDocument::updatePagestyle(string const & items, string const & sel)
1195 pageLayoutModule->pagestyleCO->clear();
1196 pageLayoutModule->pagestyleCO->addItem(qt_("Default"));
1198 for (int n = 0; !token(items,'|',n).empty(); ++n) {
1199 string style = token(items, '|', n);
1200 docstring style_gui = _(style);
1201 pagestyles.push_back(pair<string, docstring>(style, style_gui));
1202 pageLayoutModule->pagestyleCO->addItem(toqstr(style_gui));
1205 if (sel == "default") {
1206 pageLayoutModule->pagestyleCO->setCurrentIndex(0);
1212 for (size_t i = 0; i < pagestyles.size(); ++i)
1213 if (pagestyles[i].first == sel)
1214 nn = pageLayoutModule->pagestyleCO->findText(
1215 toqstr(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 // load the layout file
1238 LayoutFileList & bcl = LayoutFileList::get();
1239 string classname = layoutFile.onlyFileName();
1240 LayoutFileIndex name = bcl.addLayoutFile(
1241 classname.substr(0, classname.size() - 7),
1242 layoutFile.onlyPath().absFilename(),
1243 LayoutFileList::Local);
1246 Alert::error(_("Error"),
1247 _("Unable to read local layout file."));
1251 // do not trigger classChanged if there is no change.
1252 if (latexModule->classCO->currentText() == toqstr(name))
1256 int idx = latexModule->classCO->findText(toqstr(name));
1258 classes_model_.insertRow(0, toqstr(name), name);
1259 latexModule->classCO->setCurrentIndex(0);
1261 latexModule->classCO->setCurrentIndex(idx);
1266 void GuiDocument::browseMaster()
1268 QString const title = qt_("Select master document");
1269 QString const dir1 = toqstr(lyxrc.document_path);
1270 QString const old = latexModule->childDocLE->text();
1271 QString const docpath = toqstr(support::onlyPath(buffer().absFileName()));
1272 QStringList const filter(qt_("LyX Files (*.lyx)"));
1273 QString file = browseRelFile(old, docpath, title, filter, false,
1274 qt_("Documents|#o#O"), toqstr(lyxrc.document_path));
1276 latexModule->childDocLE->setText(file);
1280 void GuiDocument::classChanged()
1282 int idx = latexModule->classCO->currentIndex();
1285 string const classname = classes_model_.getIDString(idx);
1286 // check if this is a local layout file
1287 if (prefixIs(classname, LayoutFileList::localPrefix)) {
1288 int const ret = Alert::prompt(_("Local layout file"),
1289 _("The layout file you have selected is a local layout\n"
1290 "file, not one in the system or user directory. Your\n"
1291 "document may not work with this layout if you do not\n"
1292 "keep the layout file in the same directory."),
1293 1, 1, _("&Set Layout"), _("&Cancel"));
1295 // try to reset the layout combo
1296 setLayoutComboByIDString(bp_.baseClassID());
1300 // FIXME Note that by doing things this way, we load the TextClass
1301 // as soon as it is selected. So, if you use the scroll wheel when
1302 // sitting on the combo box, we'll load a lot of TextClass objects
1303 // very quickly. This could be changed.
1304 if (!bp_.setBaseClass(classname)) {
1305 Alert::error(_("Error"), _("Unable to set document class."));
1308 if (lyxrc.auto_reset_options) {
1309 if (applyPB->isEnabled()) {
1310 int const ret = Alert::prompt(_("Unapplied changes"),
1311 _("Some changes in the dialog were not yet applied.\n"
1312 "If you do not apply now, they will be lost after this action."),
1313 1, 1, _("&Apply"), _("&Dismiss"));
1317 bp_.useClassDefaults();
1324 // This is an insanely complicated attempt to make this sort of thing
1325 // work with RTL languages.
1326 docstring formatStrVec(vector<string> const & v, docstring const & s)
1328 //this mess formats the list as "v[0], v[1], ..., [s] v[n]"
1329 int const vSize = v.size();
1332 else if (v.size() == 1)
1333 return from_ascii(v[0]);
1334 else if (v.size() == 2) {
1335 docstring retval = _("%1$s and %2$s");
1336 retval = subst(retval, _("and"), s);
1337 return bformat(retval, from_ascii(v[0]), from_ascii(v[1]));
1339 //The idea here is to format all but the last two items...
1340 docstring t2 = _("%1$s, %2$s");
1341 docstring retval = from_ascii(v[0]);
1342 for (int i = 1; i < vSize - 2; ++i)
1343 retval = bformat(t2, retval, from_ascii(v[i]));
1344 //...and then to plug them, and the last two, into this schema
1345 docstring t = _("%1$s, %2$s, and %3$s");
1346 t = subst(t, _("and"), s);
1347 return bformat(t, retval, from_ascii(v[vSize - 2]), from_ascii(v[vSize - 1]));
1350 vector<string> idsToNames(vector<string> const & idList)
1352 vector<string> retval;
1353 vector<string>::const_iterator it = idList.begin();
1354 vector<string>::const_iterator end = idList.end();
1355 for (; it != end; ++it) {
1356 LyXModule const * const mod = moduleList[*it];
1358 retval.push_back(*it + " (Unavailable)");
1360 retval.push_back(mod->getName());
1367 void GuiDocument::updateModuleInfo()
1369 selectionManager->update();
1371 //Module description
1372 bool const focusOnSelected = selectionManager->selectedFocused();
1373 QListView const * const lv =
1374 focusOnSelected ? latexModule->selectedLV : latexModule->availableLV;
1375 if (lv->selectionModel()->selectedIndexes().isEmpty()) {
1376 latexModule->infoML->document()->clear();
1379 QModelIndex const & idx = lv->selectionModel()->currentIndex();
1380 GuiIdListModel const & idModel =
1381 focusOnSelected ? modules_sel_model_ : modules_av_model_;
1382 string const modName = idModel.getIDString(idx.row());
1383 docstring desc = getModuleDescription(modName);
1385 vector<string> pkgList = getPackageList(modName);
1386 docstring pkgdesc = formatStrVec(pkgList, _("and"));
1387 if (!pkgdesc.empty()) {
1390 desc += bformat(_("Package(s) required: %1$s."), pkgdesc);
1393 pkgList = getRequiredList(modName);
1394 if (!pkgList.empty()) {
1395 vector<string> const reqDescs = idsToNames(pkgList);
1396 pkgdesc = formatStrVec(reqDescs, _("or"));
1399 desc += bformat(_("Module required: %1$s."), pkgdesc);
1402 pkgList = getExcludedList(modName);
1403 if (!pkgList.empty()) {
1404 vector<string> const reqDescs = idsToNames(pkgList);
1405 pkgdesc = formatStrVec(reqDescs, _( "and"));
1408 desc += bformat(_("Modules excluded: %1$s."), pkgdesc);
1411 if (!isModuleAvailable(modName)) {
1414 desc += _("WARNING: Some packages are unavailable!");
1417 latexModule->infoML->document()->setPlainText(toqstr(desc));
1421 void GuiDocument::updateNumbering()
1423 DocumentClass const & tclass = bp_.documentClass();
1425 numberingModule->tocTW->setUpdatesEnabled(false);
1426 numberingModule->tocTW->clear();
1428 int const depth = numberingModule->depthSL->value();
1429 int const toc = numberingModule->tocSL->value();
1430 QString const no = qt_("No");
1431 QString const yes = qt_("Yes");
1432 QTreeWidgetItem * item = 0;
1434 DocumentClass::const_iterator lit = tclass.begin();
1435 DocumentClass::const_iterator len = tclass.end();
1436 for (; lit != len; ++lit) {
1437 int const toclevel = lit->toclevel;
1438 if (toclevel != Layout::NOT_IN_TOC && lit->labeltype == LABEL_COUNTER) {
1439 item = new QTreeWidgetItem(numberingModule->tocTW);
1440 item->setText(0, toqstr(translateIfPossible(lit->name())));
1441 item->setText(1, (toclevel <= depth) ? yes : no);
1442 item->setText(2, (toclevel <= toc) ? yes : no);
1446 numberingModule->tocTW->setUpdatesEnabled(true);
1447 numberingModule->tocTW->update();
1451 void GuiDocument::apply(BufferParams & params)
1454 preambleModule->apply(params);
1457 params.setCiteEngine(ENGINE_BASIC);
1459 if (biblioModule->citeNatbibRB->isChecked()) {
1460 bool const use_numerical_citations =
1461 biblioModule->citeStyleCO->currentIndex();
1462 if (use_numerical_citations)
1463 params.setCiteEngine(ENGINE_NATBIB_NUMERICAL);
1465 params.setCiteEngine(ENGINE_NATBIB_AUTHORYEAR);
1467 } else if (biblioModule->citeJurabibRB->isChecked())
1468 params.setCiteEngine(ENGINE_JURABIB);
1470 params.use_bibtopic =
1471 biblioModule->bibtopicCB->isChecked();
1473 // language & quotes
1474 if (langModule->defaultencodingRB->isChecked()) {
1475 params.inputenc = "auto";
1477 int i = langModule->encodingCO->currentIndex();
1479 params.inputenc = "default";
1482 fromqstr(langModule->encodingCO->currentText());
1485 InsetQuotes::QuoteLanguage lga = InsetQuotes::EnglishQuotes;
1486 switch (langModule->quoteStyleCO->currentIndex()) {
1488 lga = InsetQuotes::EnglishQuotes;
1491 lga = InsetQuotes::SwedishQuotes;
1494 lga = InsetQuotes::GermanQuotes;
1497 lga = InsetQuotes::PolishQuotes;
1500 lga = InsetQuotes::FrenchQuotes;
1503 lga = InsetQuotes::DanishQuotes;
1506 params.quotes_language = lga;
1508 QString const lang = langModule->languageCO->itemData(
1509 langModule->languageCO->currentIndex()).toString();
1510 params.language = lyx::languages.getLanguage(fromqstr(lang));
1513 if (params.documentClass().hasTocLevels()) {
1514 params.tocdepth = numberingModule->tocSL->value();
1515 params.secnumdepth = numberingModule->depthSL->value();
1519 params.user_defined_bullet(0) = bulletsModule->getBullet(0);
1520 params.user_defined_bullet(1) = bulletsModule->getBullet(1);
1521 params.user_defined_bullet(2) = bulletsModule->getBullet(2);
1522 params.user_defined_bullet(3) = bulletsModule->getBullet(3);
1525 params.graphicsDriver =
1526 tex_graphics[latexModule->psdriverCO->currentIndex()];
1529 int idx = latexModule->classCO->currentIndex();
1531 string const classname = classes_model_.getIDString(idx);
1532 params.setBaseClass(classname);
1536 params.clearLayoutModules();
1537 int const srows = modules_sel_model_.rowCount();
1538 vector<string> selModList;
1539 for (int i = 0; i < srows; ++i)
1540 params.addLayoutModule(modules_sel_model_.getIDString(i));
1542 if (mathsModule->amsautoCB->isChecked()) {
1543 params.use_amsmath = BufferParams::package_auto;
1545 if (mathsModule->amsCB->isChecked())
1546 params.use_amsmath = BufferParams::package_on;
1548 params.use_amsmath = BufferParams::package_off;
1551 if (mathsModule->esintautoCB->isChecked())
1552 params.use_esint = BufferParams::package_auto;
1554 if (mathsModule->esintCB->isChecked())
1555 params.use_esint = BufferParams::package_on;
1557 params.use_esint = BufferParams::package_off;
1560 if (pageLayoutModule->pagestyleCO->currentIndex() == 0)
1561 params.pagestyle = "default";
1563 docstring style_gui =
1564 qstring_to_ucs4(pageLayoutModule->pagestyleCO->currentText());
1565 for (size_t i = 0; i < pagestyles.size(); ++i)
1566 if (pagestyles[i].second == style_gui)
1567 params.pagestyle = pagestyles[i].first;
1570 switch (textLayoutModule->lspacingCO->currentIndex()) {
1572 params.spacing().set(Spacing::Single);
1575 params.spacing().set(Spacing::Onehalf);
1578 params.spacing().set(Spacing::Double);
1581 params.spacing().set(Spacing::Other,
1582 fromqstr(textLayoutModule->lspacingLE->text()));
1586 if (textLayoutModule->twoColumnCB->isChecked())
1591 // text should have passed validation
1592 params.listings_params =
1593 InsetListingsParams(fromqstr(textLayoutModule->listingsED->toPlainText())).params();
1595 if (textLayoutModule->indentRB->isChecked())
1596 params.paragraph_separation = BufferParams::ParagraphIndentSeparation;
1598 params.paragraph_separation = BufferParams::ParagraphSkipSeparation;
1600 switch (textLayoutModule->skipCO->currentIndex()) {
1602 params.setDefSkip(VSpace(VSpace::SMALLSKIP));
1605 params.setDefSkip(VSpace(VSpace::MEDSKIP));
1608 params.setDefSkip(VSpace(VSpace::BIGSKIP));
1613 widgetsToLength(textLayoutModule->skipLE,
1614 textLayoutModule->skipLengthCO)
1616 params.setDefSkip(vs);
1620 // DocumentDefskipCB assures that this never happens
1621 // so Assert then !!! - jbl
1622 params.setDefSkip(VSpace(VSpace::MEDSKIP));
1627 fromqstr(latexModule->optionsLE->text());
1629 if (latexModule->childDocGB->isChecked())
1631 fromqstr(latexModule->childDocLE->text());
1633 params.master = string();
1635 params.float_placement = floatModule->get();
1639 tex_fonts_roman[fontModule->fontsRomanCO->currentIndex()];
1642 tex_fonts_sans[fontModule->fontsSansCO->currentIndex()];
1644 params.fontsTypewriter =
1645 tex_fonts_monospaced[fontModule->fontsTypewriterCO->currentIndex()];
1647 params.fontsSansScale = fontModule->scaleSansSB->value();
1649 params.fontsTypewriterScale = fontModule->scaleTypewriterSB->value();
1651 params.fontsSC = fontModule->fontScCB->isChecked();
1653 params.fontsOSF = fontModule->fontOsfCB->isChecked();
1655 params.fontsDefaultFamily = GuiDocument::fontfamilies[
1656 fontModule->fontsDefaultCO->currentIndex()];
1658 if (fontModule->fontsizeCO->currentIndex() == 0)
1659 params.fontsize = "default";
1662 fromqstr(fontModule->fontsizeCO->currentText());
1665 params.papersize = PAPER_SIZE(
1666 pageLayoutModule->papersizeCO->currentIndex());
1668 // custom, A3, B3 and B4 paper sizes need geometry
1669 int psize = pageLayoutModule->papersizeCO->currentIndex();
1670 bool geom_papersize = (psize == 1 || psize == 5 || psize == 8 || psize == 9);
1672 params.paperwidth = widgetsToLength(pageLayoutModule->paperwidthLE,
1673 pageLayoutModule->paperwidthUnitCO);
1675 params.paperheight = widgetsToLength(pageLayoutModule->paperheightLE,
1676 pageLayoutModule->paperheightUnitCO);
1678 if (pageLayoutModule->facingPagesCB->isChecked())
1679 params.sides = TwoSides;
1681 params.sides = OneSide;
1683 if (pageLayoutModule->landscapeRB->isChecked())
1684 params.orientation = ORIENTATION_LANDSCAPE;
1686 params.orientation = ORIENTATION_PORTRAIT;
1689 params.use_geometry = !marginsModule->marginCB->isChecked()
1692 Ui::MarginsUi const * m = marginsModule;
1694 params.leftmargin = widgetsToLength(m->innerLE, m->innerUnit);
1695 params.topmargin = widgetsToLength(m->topLE, m->topUnit);
1696 params.rightmargin = widgetsToLength(m->outerLE, m->outerUnit);
1697 params.bottommargin = widgetsToLength(m->bottomLE, m->bottomUnit);
1698 params.headheight = widgetsToLength(m->headheightLE, m->headheightUnit);
1699 params.headsep = widgetsToLength(m->headsepLE, m->headsepUnit);
1700 params.footskip = widgetsToLength(m->footskipLE, m->footskipUnit);
1701 params.columnsep = widgetsToLength(m->columnsepLE, m->columnsepUnit);
1703 branchesModule->apply(params);
1706 PDFOptions & pdf = params.pdfoptions();
1707 pdf.use_hyperref = pdfSupportModule->use_hyperrefGB->isChecked();
1708 pdf.title = fromqstr(pdfSupportModule->titleLE->text());
1709 pdf.author = fromqstr(pdfSupportModule->authorLE->text());
1710 pdf.subject = fromqstr(pdfSupportModule->subjectLE->text());
1711 pdf.keywords = fromqstr(pdfSupportModule->keywordsLE->text());
1713 pdf.bookmarks = pdfSupportModule->bookmarksGB->isChecked();
1714 pdf.bookmarksnumbered = pdfSupportModule->bookmarksnumberedCB->isChecked();
1715 pdf.bookmarksopen = pdfSupportModule->bookmarksopenGB->isChecked();
1716 pdf.bookmarksopenlevel = pdfSupportModule->bookmarksopenlevelSB->value();
1718 pdf.breaklinks = pdfSupportModule->breaklinksCB->isChecked();
1719 pdf.pdfborder = pdfSupportModule->pdfborderCB->isChecked();
1720 pdf.pdfusetitle = pdfSupportModule->pdfusetitleCB->isChecked();
1721 pdf.colorlinks = pdfSupportModule->colorlinksCB->isChecked();
1722 pdf.backref = pdfSupportModule->backrefCB->isChecked();
1723 pdf.pagebackref = pdfSupportModule->pagebackrefCB->isChecked();
1724 if (pdfSupportModule->fullscreenCB->isChecked())
1725 pdf.pagemode = pdf.pagemode_fullscreen;
1727 pdf.pagemode.clear();
1728 pdf.quoted_options = pdf.quoted_options_check(
1729 fromqstr(pdfSupportModule->optionsLE->text()));
1733 void GuiDocument::updateParams()
1739 void GuiDocument::updateParams(BufferParams const & params)
1741 // set the default unit
1742 Length::UNIT defaultUnit = Length::CM;
1743 switch (lyxrc.default_papersize) {
1744 case PAPER_DEFAULT: break;
1746 case PAPER_USLETTER:
1748 case PAPER_USEXECUTIVE:
1749 defaultUnit = Length::IN;
1758 defaultUnit = Length::CM;
1765 preambleModule->update(params, id());
1768 biblioModule->citeDefaultRB->setChecked(
1769 params.citeEngine() == ENGINE_BASIC);
1771 biblioModule->citeNatbibRB->setChecked(
1772 params.citeEngine() == ENGINE_NATBIB_NUMERICAL ||
1773 params.citeEngine() == ENGINE_NATBIB_AUTHORYEAR);
1775 biblioModule->citeStyleCO->setCurrentIndex(
1776 params.citeEngine() == ENGINE_NATBIB_NUMERICAL);
1778 biblioModule->citeJurabibRB->setChecked(
1779 params.citeEngine() == ENGINE_JURABIB);
1781 biblioModule->bibtopicCB->setChecked(
1782 params.use_bibtopic);
1784 // language & quotes
1785 int const pos = langModule->languageCO->findData(toqstr(
1786 params.language->lang()));
1787 langModule->languageCO->setCurrentIndex(pos);
1789 langModule->quoteStyleCO->setCurrentIndex(
1790 params.quotes_language);
1792 bool default_enc = true;
1793 if (params.inputenc != "auto") {
1794 default_enc = false;
1795 if (params.inputenc == "default") {
1796 langModule->encodingCO->setCurrentIndex(0);
1798 int const i = langModule->encodingCO->findText(
1799 toqstr(params.inputenc));
1801 langModule->encodingCO->setCurrentIndex(i);
1803 // unknown encoding. Set to default.
1807 langModule->defaultencodingRB->setChecked(default_enc);
1808 langModule->otherencodingRB->setChecked(!default_enc);
1811 int const min_toclevel = documentClass().min_toclevel();
1812 int const max_toclevel = documentClass().max_toclevel();
1813 if (documentClass().hasTocLevels()) {
1814 numberingModule->setEnabled(true);
1815 numberingModule->depthSL->setMinimum(min_toclevel - 1);
1816 numberingModule->depthSL->setMaximum(max_toclevel);
1817 numberingModule->depthSL->setValue(params.secnumdepth);
1818 numberingModule->tocSL->setMaximum(min_toclevel - 1);
1819 numberingModule->tocSL->setMaximum(max_toclevel);
1820 numberingModule->tocSL->setValue(params.tocdepth);
1823 numberingModule->setEnabled(false);
1824 numberingModule->tocTW->clear();
1828 bulletsModule->setBullet(0, params.user_defined_bullet(0));
1829 bulletsModule->setBullet(1, params.user_defined_bullet(1));
1830 bulletsModule->setBullet(2, params.user_defined_bullet(2));
1831 bulletsModule->setBullet(3, params.user_defined_bullet(3));
1832 bulletsModule->init();
1835 int nitem = findToken(tex_graphics, params.graphicsDriver);
1837 latexModule->psdriverCO->setCurrentIndex(nitem);
1840 mathsModule->amsCB->setChecked(
1841 params.use_amsmath == BufferParams::package_on);
1842 mathsModule->amsautoCB->setChecked(
1843 params.use_amsmath == BufferParams::package_auto);
1845 mathsModule->esintCB->setChecked(
1846 params.use_esint == BufferParams::package_on);
1847 mathsModule->esintautoCB->setChecked(
1848 params.use_esint == BufferParams::package_auto);
1850 switch (params.spacing().getSpace()) {
1851 case Spacing::Other: nitem = 3; break;
1852 case Spacing::Double: nitem = 2; break;
1853 case Spacing::Onehalf: nitem = 1; break;
1854 case Spacing::Default: case Spacing::Single: nitem = 0; break;
1858 string const & layoutID = params.baseClassID();
1859 setLayoutComboByIDString(layoutID);
1861 updatePagestyle(documentClass().opt_pagestyle(),
1864 textLayoutModule->lspacingCO->setCurrentIndex(nitem);
1865 if (params.spacing().getSpace() == Spacing::Other) {
1866 textLayoutModule->lspacingLE->setText(
1867 toqstr(params.spacing().getValueAsString()));
1871 if (params.paragraph_separation == BufferParams::ParagraphIndentSeparation)
1872 textLayoutModule->indentRB->setChecked(true);
1874 textLayoutModule->skipRB->setChecked(true);
1877 switch (params.getDefSkip().kind()) {
1878 case VSpace::SMALLSKIP:
1881 case VSpace::MEDSKIP:
1884 case VSpace::BIGSKIP:
1887 case VSpace::LENGTH:
1890 string const length = params.getDefSkip().asLyXCommand();
1891 lengthToWidgets(textLayoutModule->skipLE,
1892 textLayoutModule->skipLengthCO,
1893 length, defaultUnit);
1900 textLayoutModule->skipCO->setCurrentIndex(skip);
1903 textLayoutModule->twoColumnCB->setChecked(
1904 params.columns == 2);
1906 // break listings_params to multiple lines
1908 InsetListingsParams(params.listings_params).separatedParams();
1909 textLayoutModule->listingsED->setPlainText(toqstr(lstparams));
1911 if (!params.options.empty()) {
1912 latexModule->optionsLE->setText(
1913 toqstr(params.options));
1915 latexModule->optionsLE->setText(QString());
1918 if (!params.master.empty()) {
1919 latexModule->childDocGB->setChecked(true);
1920 latexModule->childDocLE->setText(
1921 toqstr(params.master));
1923 latexModule->childDocLE->setText(QString());
1924 latexModule->childDocGB->setChecked(false);
1927 floatModule->set(params.float_placement);
1930 updateFontsize(documentClass().opt_fontsize(),
1933 int n = findToken(tex_fonts_roman, params.fontsRoman);
1935 fontModule->fontsRomanCO->setCurrentIndex(n);
1939 n = findToken(tex_fonts_sans, params.fontsSans);
1941 fontModule->fontsSansCO->setCurrentIndex(n);
1945 n = findToken(tex_fonts_monospaced, params.fontsTypewriter);
1947 fontModule->fontsTypewriterCO->setCurrentIndex(n);
1951 fontModule->fontScCB->setChecked(params.fontsSC);
1952 fontModule->fontOsfCB->setChecked(params.fontsOSF);
1953 fontModule->scaleSansSB->setValue(params.fontsSansScale);
1954 fontModule->scaleTypewriterSB->setValue(params.fontsTypewriterScale);
1955 n = findToken(GuiDocument::fontfamilies, params.fontsDefaultFamily);
1957 fontModule->fontsDefaultCO->setCurrentIndex(n);
1960 int const psize = params.papersize;
1961 pageLayoutModule->papersizeCO->setCurrentIndex(psize);
1962 setCustomPapersize(psize);
1964 bool const landscape =
1965 params.orientation == ORIENTATION_LANDSCAPE;
1966 pageLayoutModule->landscapeRB->setChecked(landscape);
1967 pageLayoutModule->portraitRB->setChecked(!landscape);
1969 pageLayoutModule->facingPagesCB->setChecked(
1970 params.sides == TwoSides);
1973 lengthToWidgets(pageLayoutModule->paperwidthLE,
1974 pageLayoutModule->paperwidthUnitCO, params.paperwidth, defaultUnit);
1976 lengthToWidgets(pageLayoutModule->paperheightLE,
1977 pageLayoutModule->paperheightUnitCO, params.paperheight, defaultUnit);
1980 Ui::MarginsUi * m = marginsModule;
1982 setMargins(!params.use_geometry);
1984 lengthToWidgets(m->topLE, m->topUnit,
1985 params.topmargin, defaultUnit);
1987 lengthToWidgets(m->bottomLE, m->bottomUnit,
1988 params.bottommargin, defaultUnit);
1990 lengthToWidgets(m->innerLE, m->innerUnit,
1991 params.leftmargin, defaultUnit);
1993 lengthToWidgets(m->outerLE, m->outerUnit,
1994 params.rightmargin, defaultUnit);
1996 lengthToWidgets(m->headheightLE, m->headheightUnit,
1997 params.headheight, defaultUnit);
1999 lengthToWidgets(m->headsepLE, m->headsepUnit,
2000 params.headsep, defaultUnit);
2002 lengthToWidgets(m->footskipLE, m->footskipUnit,
2003 params.footskip, defaultUnit);
2005 lengthToWidgets(m->columnsepLE, m->columnsepUnit,
2006 params.columnsep, defaultUnit);
2008 branchesModule->update(params);
2011 PDFOptions const & pdf = params.pdfoptions();
2012 pdfSupportModule->use_hyperrefGB->setChecked(pdf.use_hyperref);
2013 pdfSupportModule->titleLE->setText(toqstr(pdf.title));
2014 pdfSupportModule->authorLE->setText(toqstr(pdf.author));
2015 pdfSupportModule->subjectLE->setText(toqstr(pdf.subject));
2016 pdfSupportModule->keywordsLE->setText(toqstr(pdf.keywords));
2018 pdfSupportModule->bookmarksGB->setChecked(pdf.bookmarks);
2019 pdfSupportModule->bookmarksnumberedCB->setChecked(pdf.bookmarksnumbered);
2020 pdfSupportModule->bookmarksopenGB->setChecked(pdf.bookmarksopen);
2022 pdfSupportModule->bookmarksopenlevelSB->setValue(pdf.bookmarksopenlevel);
2024 pdfSupportModule->breaklinksCB->setChecked(pdf.breaklinks);
2025 pdfSupportModule->pdfborderCB->setChecked(pdf.pdfborder);
2026 pdfSupportModule->pdfusetitleCB->setChecked(pdf.pdfusetitle);
2027 pdfSupportModule->colorlinksCB->setChecked(pdf.colorlinks);
2028 pdfSupportModule->backrefCB->setChecked(pdf.backref);
2029 pdfSupportModule->pagebackrefCB->setChecked(pdf.pagebackref);
2030 pdfSupportModule->fullscreenCB->setChecked
2031 (pdf.pagemode == pdf.pagemode_fullscreen);
2033 pdfSupportModule->optionsLE->setText(
2034 toqstr(pdf.quoted_options));
2038 void GuiDocument::applyView()
2044 void GuiDocument::saveDocDefault()
2046 // we have to apply the params first
2052 void GuiDocument::updateAvailableModules()
2054 modules_av_model_.clear();
2055 vector<modInfoStruct> const & modInfoList = getModuleInfo();
2056 int const mSize = modInfoList.size();
2057 for (int i = 0; i != mSize; ++i) {
2058 modInfoStruct const & modInfo = modInfoList[i];
2059 modules_av_model_.insertRow(i, modInfo.name, modInfo.id,
2060 modInfo.description);
2065 void GuiDocument::updateSelectedModules()
2067 // and selected ones, too
2068 modules_sel_model_.clear();
2069 vector<modInfoStruct> const selModList = getSelectedModules();
2070 int const sSize = selModList.size();
2071 for (int i = 0; i != sSize; ++i) {
2072 modInfoStruct const & modInfo = selModList[i];
2073 modules_sel_model_.insertRow(i, modInfo.name, modInfo.id,
2074 modInfo.description);
2079 void GuiDocument::updateContents()
2081 if (id() == current_id_)
2084 updateAvailableModules();
2085 updateSelectedModules();
2087 //FIXME It'd be nice to make sure here that the selected
2088 //modules are consistent: That required modules are actually
2089 //selected, and that we don't have conflicts. If so, we could
2090 //at least pop up a warning.
2096 void GuiDocument::forceUpdate()
2098 // reset to force dialog update
2104 void GuiDocument::useClassDefaults()
2106 if (applyPB->isEnabled()) {
2107 int const ret = Alert::prompt(_("Unapplied changes"),
2108 _("Some changes in the dialog were not yet applied.\n"
2109 "If you do not apply now, they will be lost after this action."),
2110 1, 1, _("&Apply"), _("&Dismiss"));
2115 int idx = latexModule->classCO->currentIndex();
2116 string const classname = classes_model_.getIDString(idx);
2117 if (!bp_.setBaseClass(classname)) {
2118 Alert::error(_("Error"), _("Unable to set document class."));
2121 bp_.useClassDefaults();
2126 void GuiDocument::setLayoutComboByIDString(std::string const & idString)
2128 int idx = classes_model_.findIDString(idString);
2130 Alert::warning(_("Can't set layout!"),
2131 bformat(_("Unable to set layout for ID: %1$s"), from_utf8(idString)));
2133 latexModule->classCO->setCurrentIndex(idx);
2137 bool GuiDocument::isValid()
2139 return validate_listings_params().empty()
2140 && (textLayoutModule->skipCO->currentIndex() != 3
2141 || !textLayoutModule->skipLE->text().isEmpty());
2145 char const * const GuiDocument::fontfamilies[5] = {
2146 "default", "rmdefault", "sfdefault", "ttdefault", ""
2150 char const * GuiDocument::fontfamilies_gui[5] = {
2151 N_("Default"), N_("Roman"), N_("Sans Serif"), N_("Typewriter"), ""
2155 bool GuiDocument::initialiseParams(string const &)
2157 bp_ = buffer().params();
2158 // Force update on next updateContent() round.
2165 void GuiDocument::clearParams()
2167 bp_ = BufferParams();
2171 BufferId GuiDocument::id() const
2177 vector<GuiDocument::modInfoStruct> const & GuiDocument::getModuleInfo()
2179 return moduleNames_;
2183 vector<GuiDocument::modInfoStruct> const GuiDocument::getSelectedModules()
2185 vector<string> const & mods = params().getModules();
2186 vector<string>::const_iterator it = mods.begin();
2187 vector<string>::const_iterator end = mods.end();
2188 vector<modInfoStruct> mInfo;
2189 for (; it != end; ++it) {
2192 LyXModule * mod = moduleList[*it];
2194 m.name = qt_(mod->getName());
2196 m.name = toqstr(*it) + toqstr(" (") + qt_("Not Found") + toqstr(")");
2203 DocumentClass const & GuiDocument::documentClass() const
2205 return bp_.documentClass();
2209 static void dispatch_bufferparams(Dialog const & dialog,
2210 BufferParams const & bp, FuncCode lfun)
2213 ss << "\\begin_header\n";
2215 ss << "\\end_header\n";
2216 dialog.dispatch(FuncRequest(lfun, ss.str()));
2220 void GuiDocument::dispatchParams()
2222 // This must come first so that a language change is correctly noticed
2225 // Apply the BufferParams. Note that this will set the base class
2226 // and then update the buffer's layout.
2227 dispatch_bufferparams(*this, params(), LFUN_BUFFER_PARAMS_APPLY);
2229 if (!params().master.empty()) {
2230 FileName const master_file = support::makeAbsPath(params().master,
2231 support::onlyPath(buffer().absFileName()));
2232 if (isLyXFilename(master_file.absFilename())) {
2233 Buffer * master = checkAndLoadLyXFile(master_file);
2234 buffer().setParent(master);
2238 // Generate the colours requested by each new branch.
2239 BranchList & branchlist = params().branchlist();
2240 if (!branchlist.empty()) {
2241 BranchList::const_iterator it = branchlist.begin();
2242 BranchList::const_iterator const end = branchlist.end();
2243 for (; it != end; ++it) {
2244 docstring const & current_branch = it->getBranch();
2245 Branch const * branch = branchlist.find(current_branch);
2246 string const x11hexname = X11hexname(branch->getColor());
2247 // display the new color
2248 docstring const str = current_branch + ' ' + from_ascii(x11hexname);
2249 dispatch(FuncRequest(LFUN_SET_COLOR, str));
2252 // Open insets of selected branches, close deselected ones
2253 dispatch(FuncRequest(LFUN_ALL_INSETS_TOGGLE,
2256 // FIXME: If we used an LFUN, we would not need those two lines:
2257 bufferview()->processUpdateFlags(Update::Force | Update::FitCursor);
2261 void GuiDocument::setLanguage() const
2263 Language const * const newL = bp_.language;
2264 if (buffer().params().language == newL)
2267 string const & lang_name = newL->lang();
2268 dispatch(FuncRequest(LFUN_BUFFER_LANGUAGE, lang_name));
2272 void GuiDocument::saveAsDefault() const
2274 dispatch_bufferparams(*this, params(), LFUN_BUFFER_SAVE_AS_DEFAULT);
2278 bool GuiDocument::isFontAvailable(string const & font) const
2280 if (font == "default" || font == "cmr"
2281 || font == "cmss" || font == "cmtt")
2282 // these are standard
2284 if (font == "lmodern" || font == "lmss" || font == "lmtt")
2285 return LaTeXFeatures::isAvailable("lmodern");
2286 if (font == "times" || font == "palatino"
2287 || font == "helvet" || font == "courier")
2288 return LaTeXFeatures::isAvailable("psnfss");
2289 if (font == "cmbr" || font == "cmtl")
2290 return LaTeXFeatures::isAvailable("cmbright");
2291 if (font == "utopia")
2292 return LaTeXFeatures::isAvailable("utopia")
2293 || LaTeXFeatures::isAvailable("fourier");
2294 if (font == "beraserif" || font == "berasans"
2295 || font == "beramono")
2296 return LaTeXFeatures::isAvailable("bera");
2297 return LaTeXFeatures::isAvailable(font);
2301 bool GuiDocument::providesOSF(string const & font) const
2304 return isFontAvailable("eco");
2305 if (font == "palatino")
2306 return isFontAvailable("mathpazo");
2311 bool GuiDocument::providesSC(string const & font) const
2313 if (font == "palatino")
2314 return isFontAvailable("mathpazo");
2315 if (font == "utopia")
2316 return isFontAvailable("fourier");
2321 bool GuiDocument::providesScale(string const & font) const
2323 return font == "helvet" || font == "luximono"
2324 || font == "berasans" || font == "beramono";
2328 void GuiDocument::loadModuleInfo()
2330 moduleNames_.clear();
2331 LyXModuleList::const_iterator it = moduleList.begin();
2332 LyXModuleList::const_iterator end = moduleList.end();
2333 for (; it != end; ++it) {
2336 m.name = qt_(it->getName());
2337 // this is supposed to give us the first sentence of the description
2338 QString desc = qt_(it->getDescription());
2339 int const pos = desc.indexOf(".");
2341 desc.truncate(pos + 1);
2342 m.description = desc;
2343 moduleNames_.push_back(m);
2348 Dialog * createGuiDocument(GuiView & lv) { return new GuiDocument(lv); }
2351 } // namespace frontend
2354 #include "GuiDocument_moc.cpp"