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 <QAbstractItemModel>
54 #include <QCloseEvent>
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"))
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->cjkFontLE, SIGNAL(textChanged(const QString &)),
609 this, SLOT(change_adaptor()));
610 connect(fontModule->scaleSansSB, SIGNAL(valueChanged(int)),
611 this, SLOT(change_adaptor()));
612 connect(fontModule->scaleTypewriterSB, SIGNAL(valueChanged(int)),
613 this, SLOT(change_adaptor()));
614 connect(fontModule->fontScCB, SIGNAL(clicked()),
615 this, SLOT(change_adaptor()));
616 connect(fontModule->fontOsfCB, SIGNAL(clicked()),
617 this, SLOT(change_adaptor()));
619 for (int n = 0; tex_fonts_roman[n][0]; ++n) {
620 QString font = qt_(tex_fonts_roman_gui[n]);
621 if (!isFontAvailable(tex_fonts_roman[n]))
622 font += qt_(" (not installed)");
623 fontModule->fontsRomanCO->addItem(font);
625 for (int n = 0; tex_fonts_sans[n][0]; ++n) {
626 QString font = qt_(tex_fonts_sans_gui[n]);
627 if (!isFontAvailable(tex_fonts_sans[n]))
628 font += qt_(" (not installed)");
629 fontModule->fontsSansCO->addItem(font);
631 for (int n = 0; tex_fonts_monospaced[n][0]; ++n) {
632 QString font = qt_(tex_fonts_monospaced_gui[n]);
633 if (!isFontAvailable(tex_fonts_monospaced[n]))
634 font += qt_(" (not installed)");
635 fontModule->fontsTypewriterCO->addItem(font);
638 fontModule->fontsizeCO->addItem(qt_("Default"));
639 fontModule->fontsizeCO->addItem(qt_("10"));
640 fontModule->fontsizeCO->addItem(qt_("11"));
641 fontModule->fontsizeCO->addItem(qt_("12"));
643 for (int n = 0; GuiDocument::fontfamilies_gui[n][0]; ++n)
644 fontModule->fontsDefaultCO->addItem(
645 qt_(GuiDocument::fontfamilies_gui[n]));
648 pageLayoutModule = new UiWidget<Ui::PageLayoutUi>;
650 connect(pageLayoutModule->papersizeCO, SIGNAL(activated(int)),
651 this, SLOT(setCustomPapersize(int)));
652 connect(pageLayoutModule->papersizeCO, SIGNAL(activated(int)),
653 this, SLOT(setCustomPapersize(int)));
654 connect(pageLayoutModule->portraitRB, SIGNAL(clicked()),
655 this, SLOT(portraitChanged()));
656 connect(pageLayoutModule->papersizeCO, SIGNAL(activated(int)),
657 this, SLOT(change_adaptor()));
658 connect(pageLayoutModule->paperheightLE, SIGNAL(textChanged(const QString &)),
659 this, SLOT(change_adaptor()));
660 connect(pageLayoutModule->paperwidthLE, SIGNAL(textChanged(const QString &)),
661 this, SLOT(change_adaptor()));
662 connect(pageLayoutModule->paperwidthUnitCO, SIGNAL(activated(int)),
663 this, SLOT(change_adaptor()));
664 connect(pageLayoutModule->paperheightUnitCO, SIGNAL(activated(int)),
665 this, SLOT(change_adaptor()));
666 connect(pageLayoutModule->portraitRB, SIGNAL(clicked()),
667 this, SLOT(change_adaptor()));
668 connect(pageLayoutModule->landscapeRB, SIGNAL(clicked()),
669 this, SLOT(change_adaptor()));
670 connect(pageLayoutModule->facingPagesCB, SIGNAL(clicked()),
671 this, SLOT(change_adaptor()));
672 connect(pageLayoutModule->pagestyleCO, SIGNAL(activated(int)),
673 this, SLOT(change_adaptor()));
675 pageLayoutModule->pagestyleCO->addItem(qt_("Default"));
676 pageLayoutModule->pagestyleCO->addItem(qt_("empty"));
677 pageLayoutModule->pagestyleCO->addItem(qt_("plain"));
678 pageLayoutModule->pagestyleCO->addItem(qt_("headings"));
679 pageLayoutModule->pagestyleCO->addItem(qt_("fancy"));
680 bc().addCheckedLineEdit(pageLayoutModule->paperheightLE,
681 pageLayoutModule->paperheightL);
682 bc().addCheckedLineEdit(pageLayoutModule->paperwidthLE,
683 pageLayoutModule->paperwidthL);
686 QComboBox * cb = pageLayoutModule->papersizeCO;
687 cb->addItem(qt_("Default"));
688 cb->addItem(qt_("Custom"));
689 cb->addItem(qt_("US letter"));
690 cb->addItem(qt_("US legal"));
691 cb->addItem(qt_("US executive"));
692 cb->addItem(qt_("A3"));
693 cb->addItem(qt_("A4"));
694 cb->addItem(qt_("A5"));
695 cb->addItem(qt_("B3"));
696 cb->addItem(qt_("B4"));
697 cb->addItem(qt_("B5"));
698 // remove the %-items from the unit choice
699 pageLayoutModule->paperwidthUnitCO->noPercents();
700 pageLayoutModule->paperheightUnitCO->noPercents();
701 pageLayoutModule->paperheightLE->setValidator(unsignedLengthValidator(
702 pageLayoutModule->paperheightLE));
703 pageLayoutModule->paperwidthLE->setValidator(unsignedLengthValidator(
704 pageLayoutModule->paperwidthLE));
707 marginsModule = new UiWidget<Ui::MarginsUi>;
709 connect(marginsModule->marginCB, SIGNAL(toggled(bool)),
710 this, SLOT(setCustomMargins(bool)));
711 connect(marginsModule->marginCB, SIGNAL(clicked()),
712 this, SLOT(change_adaptor()));
713 connect(marginsModule->topLE, SIGNAL(textChanged(const QString &)),
714 this, SLOT(change_adaptor()));
715 connect(marginsModule->topUnit, SIGNAL(activated(int)),
716 this, SLOT(change_adaptor()));
717 connect(marginsModule->bottomLE, SIGNAL(textChanged(const QString &)),
718 this, SLOT(change_adaptor()));
719 connect(marginsModule->bottomUnit, SIGNAL(activated(int)),
720 this, SLOT(change_adaptor()));
721 connect(marginsModule->innerLE, SIGNAL(textChanged(const QString &)),
722 this, SLOT(change_adaptor()));
723 connect(marginsModule->innerUnit, SIGNAL(activated(int)),
724 this, SLOT(change_adaptor()));
725 connect(marginsModule->outerLE, SIGNAL(textChanged(const QString &)),
726 this, SLOT(change_adaptor()));
727 connect(marginsModule->outerUnit, SIGNAL(activated(int)),
728 this, SLOT(change_adaptor()));
729 connect(marginsModule->headheightLE, SIGNAL(textChanged(const QString &)),
730 this, SLOT(change_adaptor()));
731 connect(marginsModule->headheightUnit, SIGNAL(activated(int)),
732 this, SLOT(change_adaptor()));
733 connect(marginsModule->headsepLE, SIGNAL(textChanged(const QString &)),
734 this, SLOT(change_adaptor()));
735 connect(marginsModule->headsepUnit, SIGNAL(activated(int)),
736 this, SLOT(change_adaptor()));
737 connect(marginsModule->footskipLE, SIGNAL(textChanged(const QString&)),
738 this, SLOT(change_adaptor()));
739 connect(marginsModule->footskipUnit, SIGNAL(activated(int)),
740 this, SLOT(change_adaptor()));
741 connect(marginsModule->columnsepLE, SIGNAL(textChanged(const QString&)),
742 this, SLOT(change_adaptor()));
743 connect(marginsModule->columnsepUnit, SIGNAL(activated(int)),
744 this, SLOT(change_adaptor()));
745 marginsModule->topLE->setValidator(unsignedLengthValidator(
746 marginsModule->topLE));
747 marginsModule->bottomLE->setValidator(unsignedLengthValidator(
748 marginsModule->bottomLE));
749 marginsModule->innerLE->setValidator(unsignedLengthValidator(
750 marginsModule->innerLE));
751 marginsModule->outerLE->setValidator(unsignedLengthValidator(
752 marginsModule->outerLE));
753 marginsModule->headsepLE->setValidator(unsignedLengthValidator(
754 marginsModule->headsepLE));
755 marginsModule->headheightLE->setValidator(unsignedLengthValidator(
756 marginsModule->headheightLE));
757 marginsModule->footskipLE->setValidator(unsignedLengthValidator(
758 marginsModule->footskipLE));
759 marginsModule->columnsepLE->setValidator(unsignedLengthValidator(
760 marginsModule->columnsepLE));
762 bc().addCheckedLineEdit(marginsModule->topLE,
763 marginsModule->topL);
764 bc().addCheckedLineEdit(marginsModule->bottomLE,
765 marginsModule->bottomL);
766 bc().addCheckedLineEdit(marginsModule->innerLE,
767 marginsModule->innerL);
768 bc().addCheckedLineEdit(marginsModule->outerLE,
769 marginsModule->outerL);
770 bc().addCheckedLineEdit(marginsModule->headsepLE,
771 marginsModule->headsepL);
772 bc().addCheckedLineEdit(marginsModule->headheightLE,
773 marginsModule->headheightL);
774 bc().addCheckedLineEdit(marginsModule->footskipLE,
775 marginsModule->footskipL);
776 bc().addCheckedLineEdit(marginsModule->columnsepLE,
777 marginsModule->columnsepL);
780 langModule = new UiWidget<Ui::LanguageUi>;
782 connect(langModule->languageCO, SIGNAL(activated(int)),
783 this, SLOT(change_adaptor()));
784 connect(langModule->defaultencodingRB, SIGNAL(clicked()),
785 this, SLOT(change_adaptor()));
786 connect(langModule->otherencodingRB, SIGNAL(clicked()),
787 this, SLOT(change_adaptor()));
788 connect(langModule->encodingCO, SIGNAL(activated(int)),
789 this, SLOT(change_adaptor()));
790 connect(langModule->quoteStyleCO, SIGNAL(activated(int)),
791 this, SLOT(change_adaptor()));
793 QAbstractItemModel * language_model = guiApp->languageModel();
794 // FIXME: it would be nice if sorting was enabled/disabled via a checkbox.
795 language_model->sort(0);
796 langModule->languageCO->setModel(language_model);
798 // Always put the default encoding in the first position.
799 // It is special because the displayed text is translated.
800 langModule->encodingCO->addItem(qt_("LaTeX default"));
801 Encodings::const_iterator it = encodings.begin();
802 Encodings::const_iterator const end = encodings.end();
803 for (; it != end; ++it)
804 langModule->encodingCO->addItem(toqstr(it->latexName()));
806 langModule->quoteStyleCO->addItem(qt_("``text''"));
807 langModule->quoteStyleCO->addItem(qt_("''text''"));
808 langModule->quoteStyleCO->addItem(qt_(",,text``"));
809 langModule->quoteStyleCO->addItem(qt_(",,text''"));
810 langModule->quoteStyleCO->addItem(qt_("<<text>>"));
811 langModule->quoteStyleCO->addItem(qt_(">>text<<"));
814 numberingModule = new UiWidget<Ui::NumberingUi>;
816 connect(numberingModule->depthSL, SIGNAL(valueChanged(int)),
817 this, SLOT(change_adaptor()));
818 connect(numberingModule->tocSL, SIGNAL(valueChanged(int)),
819 this, SLOT(change_adaptor()));
820 connect(numberingModule->depthSL, SIGNAL(valueChanged(int)),
821 this, SLOT(updateNumbering()));
822 connect(numberingModule->tocSL, SIGNAL(valueChanged(int)),
823 this, SLOT(updateNumbering()));
824 numberingModule->tocTW->setColumnCount(3);
825 numberingModule->tocTW->headerItem()->setText(0, qt_("Example"));
826 numberingModule->tocTW->headerItem()->setText(1, qt_("Numbered"));
827 numberingModule->tocTW->headerItem()->setText(2, qt_("Appears in TOC"));
830 biblioModule = new UiWidget<Ui::BiblioUi>;
831 connect(biblioModule->citeNatbibRB, SIGNAL(toggled(bool)),
832 biblioModule->citationStyleL, SLOT(setEnabled(bool)));
833 connect(biblioModule->citeNatbibRB, SIGNAL(toggled(bool)),
834 biblioModule->citeStyleCO, SLOT(setEnabled(bool)));
836 connect(biblioModule->citeDefaultRB, SIGNAL(clicked()),
837 this, SLOT(change_adaptor()));
838 connect(biblioModule->citeNatbibRB, SIGNAL(clicked()),
839 this, SLOT(change_adaptor()));
840 connect(biblioModule->citeStyleCO, SIGNAL(activated(int)),
841 this, SLOT(change_adaptor()));
842 connect(biblioModule->citeJurabibRB, SIGNAL(clicked()),
843 this, SLOT(change_adaptor()));
844 connect(biblioModule->bibtopicCB, SIGNAL(clicked()),
845 this, SLOT(change_adaptor()));
847 biblioModule->citeStyleCO->addItem(qt_("Author-year"));
848 biblioModule->citeStyleCO->addItem(qt_("Numerical"));
849 biblioModule->citeStyleCO->setCurrentIndex(0);
852 mathsModule = new UiWidget<Ui::MathsUi>;
853 connect(mathsModule->amsautoCB, SIGNAL(toggled(bool)),
854 mathsModule->amsCB, SLOT(setDisabled(bool)));
855 connect(mathsModule->esintautoCB, SIGNAL(toggled(bool)),
856 mathsModule->esintCB, SLOT(setDisabled(bool)));
858 connect(mathsModule->amsCB, SIGNAL(clicked()),
859 this, SLOT(change_adaptor()));
860 connect(mathsModule->amsautoCB, SIGNAL(clicked()),
861 this, SLOT(change_adaptor()));
862 connect(mathsModule->esintCB, SIGNAL(clicked()),
863 this, SLOT(change_adaptor()));
864 connect(mathsModule->esintautoCB, SIGNAL(clicked()),
865 this, SLOT(change_adaptor()));
867 latexModule = new UiWidget<Ui::LaTeXUi>;
869 connect(latexModule->optionsLE, SIGNAL(textChanged(const QString &)),
870 this, SLOT(change_adaptor()));
871 connect(latexModule->psdriverCO, SIGNAL(activated(int)),
872 this, SLOT(change_adaptor()));
873 connect(latexModule->classCO, SIGNAL(activated(int)),
874 this, SLOT(classChanged()));
875 connect(latexModule->classCO, SIGNAL(activated(int)),
876 this, SLOT(change_adaptor()));
877 connect(latexModule->layoutPB, SIGNAL(clicked()),
878 this, SLOT(browseLayout()));
879 connect(latexModule->childDocGB, SIGNAL(clicked()),
880 this, SLOT(change_adaptor()));
881 connect(latexModule->childDocLE, SIGNAL(textChanged(const QString &)),
882 this, SLOT(change_adaptor()));
883 connect(latexModule->childDocPB, SIGNAL(clicked()),
884 this, SLOT(browseMaster()));
887 new ModuleSelMan(latexModule->availableLV, latexModule->selectedLV,
888 latexModule->addPB, latexModule->deletePB,
889 latexModule->upPB, latexModule->downPB,
890 availableModel(), selectedModel());
891 connect(selectionManager, SIGNAL(updateHook()),
892 this, SLOT(updateModuleInfo()));
893 connect(selectionManager, SIGNAL(updateHook()),
894 this, SLOT(change_adaptor()));
896 // postscript drivers
897 for (int n = 0; tex_graphics[n][0]; ++n) {
898 QString enc = qt_(tex_graphics_gui[n]);
899 latexModule->psdriverCO->addItem(enc);
902 // FIXME hide local layout button due to bug 4812.
903 latexModule->layoutPB->hide();
904 latexModule->classCO->setModel(&classes_model_);
905 LayoutFileList const & bcl = LayoutFileList::get();
906 vector<LayoutFileIndex> classList = bcl.classList();
907 sort(classList.begin(), classList.end(), less_textclass_avail_desc());
909 vector<LayoutFileIndex>::const_iterator cit = classList.begin();
910 vector<LayoutFileIndex>::const_iterator cen = classList.end();
911 for (int i = 0; cit != cen; ++cit, ++i) {
912 LayoutFile const & tc = bcl[*cit];
913 docstring item = (tc.isTeXClassAvailable()) ?
914 from_utf8(tc.description()) :
915 bformat(_("Unavailable: %1$s"), from_utf8(tc.description()));
916 classes_model_.insertRow(i, toqstr(item), *cit);
920 branchesModule = new GuiBranches;
921 connect(branchesModule, SIGNAL(changed()),
922 this, SLOT(change_adaptor()));
925 preambleModule = new PreambleModule;
926 connect(preambleModule, SIGNAL(changed()),
927 this, SLOT(change_adaptor()));
930 bulletsModule = new BulletsModule;
931 connect(bulletsModule, SIGNAL(changed()),
932 this, SLOT(change_adaptor()));
935 pdfSupportModule = new UiWidget<Ui::PDFSupportUi>;
937 connect(pdfSupportModule->use_hyperrefGB, SIGNAL(toggled(bool)),
938 this, SLOT(change_adaptor()));
939 connect(pdfSupportModule->titleLE, SIGNAL(textChanged(const QString &)),
940 this, SLOT(change_adaptor()));
941 connect(pdfSupportModule->authorLE, SIGNAL(textChanged(const QString &)),
942 this, SLOT(change_adaptor()));
943 connect(pdfSupportModule->subjectLE, SIGNAL(textChanged(const QString &)),
944 this, SLOT(change_adaptor()));
945 connect(pdfSupportModule->keywordsLE, SIGNAL(textChanged(const QString &)),
946 this, SLOT(change_adaptor()));
947 connect(pdfSupportModule->bookmarksGB, SIGNAL(toggled(bool)),
948 this, SLOT(change_adaptor()));
949 connect(pdfSupportModule->bookmarksnumberedCB, SIGNAL(toggled(bool)),
950 this, SLOT(change_adaptor()));
951 connect(pdfSupportModule->bookmarksopenGB, SIGNAL(toggled(bool)),
952 this, SLOT(change_adaptor()));
953 connect(pdfSupportModule->bookmarksopenlevelSB, SIGNAL(valueChanged(int)),
954 this, SLOT(change_adaptor()));
955 connect(pdfSupportModule->breaklinksCB, SIGNAL(toggled(bool)),
956 this, SLOT(change_adaptor()));
957 connect(pdfSupportModule->pdfborderCB, SIGNAL(toggled(bool)),
958 this, SLOT(change_adaptor()));
959 connect(pdfSupportModule->colorlinksCB, SIGNAL(toggled(bool)),
960 this, SLOT(change_adaptor()));
961 connect(pdfSupportModule->backrefCB, SIGNAL(toggled(bool)),
962 this, SLOT(change_adaptor()));
963 connect(pdfSupportModule->pdfusetitleCB, SIGNAL(toggled(bool)),
964 this, SLOT(change_adaptor()));
965 connect(pdfSupportModule->pagebackrefCB, SIGNAL(toggled(bool)),
966 this, SLOT(change_adaptor()));
967 connect(pdfSupportModule->fullscreenCB, SIGNAL(toggled(bool)),
968 this, SLOT(change_adaptor()));
969 connect(pdfSupportModule->optionsLE, SIGNAL(textChanged(const QString &)),
970 this, SLOT(change_adaptor()));
973 floatModule = new FloatPlacement;
974 connect(floatModule, SIGNAL(changed()),
975 this, SLOT(change_adaptor()));
977 docPS->addPanel(latexModule, qt_("Document Class"));
978 docPS->addPanel(fontModule, qt_("Fonts"));
979 docPS->addPanel(textLayoutModule, qt_("Text Layout"));
980 docPS->addPanel(pageLayoutModule, qt_("Page Layout"));
981 docPS->addPanel(marginsModule, qt_("Page Margins"));
982 docPS->addPanel(langModule, qt_("Language"));
983 docPS->addPanel(numberingModule, qt_("Numbering & TOC"));
984 docPS->addPanel(biblioModule, qt_("Bibliography"));
985 docPS->addPanel(pdfSupportModule, qt_("PDF Properties"));
986 docPS->addPanel(mathsModule, qt_("Math Options"));
987 docPS->addPanel(floatModule, qt_("Float Placement"));
988 docPS->addPanel(bulletsModule, qt_("Bullets"));
989 docPS->addPanel(branchesModule, qt_("Branches"));
990 docPS->addPanel(preambleModule, qt_("LaTeX Preamble"));
991 docPS->setCurrentPanel(qt_("Document Class"));
992 // FIXME: hack to work around resizing bug in Qt >= 4.2
993 // bug verified with Qt 4.2.{0-3} (JSpitzm)
994 #if QT_VERSION >= 0x040200
995 docPS->updateGeometry();
1000 void GuiDocument::showPreamble()
1002 docPS->setCurrentPanel(qt_("LaTeX Preamble"));
1006 void GuiDocument::saveDefaultClicked()
1012 void GuiDocument::useDefaultsClicked()
1018 void GuiDocument::change_adaptor()
1024 docstring GuiDocument::validate_listings_params()
1026 // use a cache here to avoid repeated validation
1027 // of the same parameters
1028 static string param_cache = string();
1029 static docstring msg_cache = docstring();
1031 if (textLayoutModule->bypassCB->isChecked())
1034 string params = fromqstr(textLayoutModule->listingsED->toPlainText());
1035 if (params != param_cache) {
1036 param_cache = params;
1037 msg_cache = InsetListingsParams(params).validate();
1043 void GuiDocument::set_listings_msg()
1045 static bool isOK = true;
1046 docstring msg = validate_listings_params();
1051 // listingsTB->setTextColor("black");
1052 textLayoutModule->listingsTB->setPlainText(
1053 qt_("Input listings parameters on the right. Enter ? for a list of parameters."));
1056 // listingsTB->setTextColor("red");
1057 textLayoutModule->listingsTB->setPlainText(toqstr(msg));
1062 void GuiDocument::setLSpacing(int item)
1064 textLayoutModule->lspacingLE->setEnabled(item == 3);
1068 void GuiDocument::setSkip(int item)
1070 bool const enable = (item == 3);
1071 textLayoutModule->skipLE->setEnabled(enable);
1072 textLayoutModule->skipLengthCO->setEnabled(enable);
1076 void GuiDocument::enableSkip(bool skip)
1078 textLayoutModule->skipCO->setEnabled(skip);
1079 textLayoutModule->skipLE->setEnabled(skip);
1080 textLayoutModule->skipLengthCO->setEnabled(skip);
1082 setSkip(textLayoutModule->skipCO->currentIndex());
1085 void GuiDocument::portraitChanged()
1087 setMargins(pageLayoutModule->papersizeCO->currentIndex());
1090 void GuiDocument::setMargins(bool custom)
1092 marginsModule->marginCB->setChecked(custom);
1093 setCustomMargins(custom);
1097 void GuiDocument::setCustomPapersize(int papersize)
1099 bool const custom = (papersize == 1);
1101 pageLayoutModule->paperwidthL->setEnabled(custom);
1102 pageLayoutModule->paperwidthLE->setEnabled(custom);
1103 pageLayoutModule->paperwidthUnitCO->setEnabled(custom);
1104 pageLayoutModule->paperheightL->setEnabled(custom);
1105 pageLayoutModule->paperheightLE->setEnabled(custom);
1106 pageLayoutModule->paperheightLE->setFocus();
1107 pageLayoutModule->paperheightUnitCO->setEnabled(custom);
1111 void GuiDocument::setColSep()
1113 setCustomMargins(marginsModule->marginCB->checkState() == Qt::Checked);
1117 void GuiDocument::setCustomMargins(bool custom)
1119 marginsModule->topL->setEnabled(!custom);
1120 marginsModule->topLE->setEnabled(!custom);
1121 marginsModule->topUnit->setEnabled(!custom);
1123 marginsModule->bottomL->setEnabled(!custom);
1124 marginsModule->bottomLE->setEnabled(!custom);
1125 marginsModule->bottomUnit->setEnabled(!custom);
1127 marginsModule->innerL->setEnabled(!custom);
1128 marginsModule->innerLE->setEnabled(!custom);
1129 marginsModule->innerUnit->setEnabled(!custom);
1131 marginsModule->outerL->setEnabled(!custom);
1132 marginsModule->outerLE->setEnabled(!custom);
1133 marginsModule->outerUnit->setEnabled(!custom);
1135 marginsModule->headheightL->setEnabled(!custom);
1136 marginsModule->headheightLE->setEnabled(!custom);
1137 marginsModule->headheightUnit->setEnabled(!custom);
1139 marginsModule->headsepL->setEnabled(!custom);
1140 marginsModule->headsepLE->setEnabled(!custom);
1141 marginsModule->headsepUnit->setEnabled(!custom);
1143 marginsModule->footskipL->setEnabled(!custom);
1144 marginsModule->footskipLE->setEnabled(!custom);
1145 marginsModule->footskipUnit->setEnabled(!custom);
1147 bool const enableColSep = !custom &&
1148 textLayoutModule->twoColumnCB->checkState() == Qt::Checked;
1149 marginsModule->columnsepL->setEnabled(enableColSep);
1150 marginsModule->columnsepLE->setEnabled(enableColSep);
1151 marginsModule->columnsepUnit->setEnabled(enableColSep);
1155 void GuiDocument::updateFontsize(string const & items, string const & sel)
1157 fontModule->fontsizeCO->clear();
1158 fontModule->fontsizeCO->addItem(qt_("Default"));
1160 for (int n = 0; !token(items,'|',n).empty(); ++n)
1161 fontModule->fontsizeCO->
1162 addItem(toqstr(token(items,'|',n)));
1164 for (int n = 0; n < fontModule->fontsizeCO->count(); ++n) {
1165 if (fromqstr(fontModule->fontsizeCO->itemText(n)) == sel) {
1166 fontModule->fontsizeCO->setCurrentIndex(n);
1173 void GuiDocument::romanChanged(int item)
1175 string const font = tex_fonts_roman[item];
1176 fontModule->fontScCB->setEnabled(providesSC(font));
1177 fontModule->fontOsfCB->setEnabled(providesOSF(font));
1181 void GuiDocument::sansChanged(int item)
1183 string const font = tex_fonts_sans[item];
1184 bool scaleable = providesScale(font);
1185 fontModule->scaleSansSB->setEnabled(scaleable);
1186 fontModule->scaleSansLA->setEnabled(scaleable);
1190 void GuiDocument::ttChanged(int item)
1192 string const font = tex_fonts_monospaced[item];
1193 bool scaleable = providesScale(font);
1194 fontModule->scaleTypewriterSB->setEnabled(scaleable);
1195 fontModule->scaleTypewriterLA->setEnabled(scaleable);
1199 void GuiDocument::updatePagestyle(string const & items, string const & sel)
1202 pageLayoutModule->pagestyleCO->clear();
1203 pageLayoutModule->pagestyleCO->addItem(qt_("Default"));
1205 for (int n = 0; !token(items,'|',n).empty(); ++n) {
1206 string style = token(items, '|', n);
1207 docstring style_gui = _(style);
1208 pagestyles.push_back(pair<string, docstring>(style, style_gui));
1209 pageLayoutModule->pagestyleCO->addItem(toqstr(style_gui));
1212 if (sel == "default") {
1213 pageLayoutModule->pagestyleCO->setCurrentIndex(0);
1219 for (size_t i = 0; i < pagestyles.size(); ++i)
1220 if (pagestyles[i].first == sel)
1221 nn = pageLayoutModule->pagestyleCO->findText(
1222 toqstr(pagestyles[i].second));
1225 pageLayoutModule->pagestyleCO->setCurrentIndex(nn);
1229 void GuiDocument::browseLayout()
1231 QString const label1 = qt_("Layouts|#o#O");
1232 QString const dir1 = toqstr(lyxrc.document_path);
1233 QStringList const filter(qt_("LyX Layout (*.layout)"));
1234 QString file = browseRelFile(QString(), bufferFilepath(),
1235 qt_("Local layout file"), filter, false,
1238 if (!file.endsWith(".layout"))
1241 FileName layoutFile = support::makeAbsPath(fromqstr(file),
1242 fromqstr(bufferFilepath()));
1244 // load the layout file
1245 LayoutFileList & bcl = LayoutFileList::get();
1246 string classname = layoutFile.onlyFileName();
1247 LayoutFileIndex name = bcl.addLayoutFile(
1248 classname.substr(0, classname.size() - 7),
1249 layoutFile.onlyPath().absFilename(),
1250 LayoutFileList::Local);
1253 Alert::error(_("Error"),
1254 _("Unable to read local layout file."));
1258 // do not trigger classChanged if there is no change.
1259 if (latexModule->classCO->currentText() == toqstr(name))
1263 int idx = latexModule->classCO->findText(toqstr(name));
1265 classes_model_.insertRow(0, toqstr(name), name);
1266 latexModule->classCO->setCurrentIndex(0);
1268 latexModule->classCO->setCurrentIndex(idx);
1273 void GuiDocument::browseMaster()
1275 QString const title = qt_("Select master document");
1276 QString const dir1 = toqstr(lyxrc.document_path);
1277 QString const old = latexModule->childDocLE->text();
1278 QString const docpath = toqstr(support::onlyPath(buffer().absFileName()));
1279 QStringList const filter(qt_("LyX Files (*.lyx)"));
1280 QString file = browseRelFile(old, docpath, title, filter, false,
1281 qt_("Documents|#o#O"), toqstr(lyxrc.document_path));
1283 latexModule->childDocLE->setText(file);
1287 void GuiDocument::classChanged()
1289 int idx = latexModule->classCO->currentIndex();
1292 string const classname = classes_model_.getIDString(idx);
1293 // check if this is a local layout file
1294 if (prefixIs(classname, LayoutFileList::localPrefix)) {
1295 int const ret = Alert::prompt(_("Local layout file"),
1296 _("The layout file you have selected is a local layout\n"
1297 "file, not one in the system or user directory. Your\n"
1298 "document may not work with this layout if you do not\n"
1299 "keep the layout file in the same directory."),
1300 1, 1, _("&Set Layout"), _("&Cancel"));
1302 // try to reset the layout combo
1303 setLayoutComboByIDString(bp_.baseClassID());
1307 // FIXME Note that by doing things this way, we load the TextClass
1308 // as soon as it is selected. So, if you use the scroll wheel when
1309 // sitting on the combo box, we'll load a lot of TextClass objects
1310 // very quickly. This could be changed.
1311 if (!bp_.setBaseClass(classname)) {
1312 Alert::error(_("Error"), _("Unable to set document class."));
1315 if (lyxrc.auto_reset_options) {
1316 if (applyPB->isEnabled()) {
1317 int const ret = Alert::prompt(_("Unapplied changes"),
1318 _("Some changes in the dialog were not yet applied.\n"
1319 "If you do not apply now, they will be lost after this action."),
1320 1, 1, _("&Apply"), _("&Dismiss"));
1324 bp_.useClassDefaults();
1325 paramsToDialog(bp_);
1331 // This is an insanely complicated attempt to make this sort of thing
1332 // work with RTL languages.
1333 docstring formatStrVec(vector<string> const & v, docstring const & s)
1335 //this mess formats the list as "v[0], v[1], ..., [s] v[n]"
1336 int const vSize = v.size();
1339 else if (v.size() == 1)
1340 return from_ascii(v[0]);
1341 else if (v.size() == 2) {
1342 docstring retval = _("%1$s and %2$s");
1343 retval = subst(retval, _("and"), s);
1344 return bformat(retval, from_ascii(v[0]), from_ascii(v[1]));
1346 //The idea here is to format all but the last two items...
1347 docstring t2 = _("%1$s, %2$s");
1348 docstring retval = from_ascii(v[0]);
1349 for (int i = 1; i < vSize - 2; ++i)
1350 retval = bformat(t2, retval, from_ascii(v[i]));
1351 //...and then to plug them, and the last two, into this schema
1352 docstring t = _("%1$s, %2$s, and %3$s");
1353 t = subst(t, _("and"), s);
1354 return bformat(t, retval, from_ascii(v[vSize - 2]), from_ascii(v[vSize - 1]));
1357 vector<string> idsToNames(vector<string> const & idList)
1359 vector<string> retval;
1360 vector<string>::const_iterator it = idList.begin();
1361 vector<string>::const_iterator end = idList.end();
1362 for (; it != end; ++it) {
1363 LyXModule const * const mod = moduleList[*it];
1365 retval.push_back(*it + " (Unavailable)");
1367 retval.push_back(mod->getName());
1374 void GuiDocument::updateModuleInfo()
1376 selectionManager->update();
1378 //Module description
1379 bool const focusOnSelected = selectionManager->selectedFocused();
1380 QListView const * const lv =
1381 focusOnSelected ? latexModule->selectedLV : latexModule->availableLV;
1382 if (lv->selectionModel()->selectedIndexes().isEmpty()) {
1383 latexModule->infoML->document()->clear();
1386 QModelIndex const & idx = lv->selectionModel()->currentIndex();
1387 GuiIdListModel const & idModel =
1388 focusOnSelected ? modules_sel_model_ : modules_av_model_;
1389 string const modName = idModel.getIDString(idx.row());
1390 docstring desc = getModuleDescription(modName);
1392 vector<string> pkgList = getPackageList(modName);
1393 docstring pkgdesc = formatStrVec(pkgList, _("and"));
1394 if (!pkgdesc.empty()) {
1397 desc += bformat(_("Package(s) required: %1$s."), pkgdesc);
1400 pkgList = getRequiredList(modName);
1401 if (!pkgList.empty()) {
1402 vector<string> const reqDescs = idsToNames(pkgList);
1403 pkgdesc = formatStrVec(reqDescs, _("or"));
1406 desc += bformat(_("Module required: %1$s."), pkgdesc);
1409 pkgList = getExcludedList(modName);
1410 if (!pkgList.empty()) {
1411 vector<string> const reqDescs = idsToNames(pkgList);
1412 pkgdesc = formatStrVec(reqDescs, _( "and"));
1415 desc += bformat(_("Modules excluded: %1$s."), pkgdesc);
1418 if (!isModuleAvailable(modName)) {
1421 desc += _("WARNING: Some packages are unavailable!");
1424 latexModule->infoML->document()->setPlainText(toqstr(desc));
1428 void GuiDocument::updateNumbering()
1430 DocumentClass const & tclass = bp_.documentClass();
1432 numberingModule->tocTW->setUpdatesEnabled(false);
1433 numberingModule->tocTW->clear();
1435 int const depth = numberingModule->depthSL->value();
1436 int const toc = numberingModule->tocSL->value();
1437 QString const no = qt_("No");
1438 QString const yes = qt_("Yes");
1439 QTreeWidgetItem * item = 0;
1441 DocumentClass::const_iterator lit = tclass.begin();
1442 DocumentClass::const_iterator len = tclass.end();
1443 for (; lit != len; ++lit) {
1444 int const toclevel = lit->toclevel;
1445 if (toclevel != Layout::NOT_IN_TOC && lit->labeltype == LABEL_COUNTER) {
1446 item = new QTreeWidgetItem(numberingModule->tocTW);
1447 item->setText(0, toqstr(translateIfPossible(lit->name())));
1448 item->setText(1, (toclevel <= depth) ? yes : no);
1449 item->setText(2, (toclevel <= toc) ? yes : no);
1453 numberingModule->tocTW->setUpdatesEnabled(true);
1454 numberingModule->tocTW->update();
1458 void GuiDocument::apply(BufferParams & params)
1461 preambleModule->apply(params);
1464 params.setCiteEngine(ENGINE_BASIC);
1466 if (biblioModule->citeNatbibRB->isChecked()) {
1467 bool const use_numerical_citations =
1468 biblioModule->citeStyleCO->currentIndex();
1469 if (use_numerical_citations)
1470 params.setCiteEngine(ENGINE_NATBIB_NUMERICAL);
1472 params.setCiteEngine(ENGINE_NATBIB_AUTHORYEAR);
1474 } else if (biblioModule->citeJurabibRB->isChecked())
1475 params.setCiteEngine(ENGINE_JURABIB);
1477 params.use_bibtopic =
1478 biblioModule->bibtopicCB->isChecked();
1480 // language & quotes
1481 if (langModule->defaultencodingRB->isChecked()) {
1482 params.inputenc = "auto";
1484 int i = langModule->encodingCO->currentIndex();
1486 params.inputenc = "default";
1489 fromqstr(langModule->encodingCO->currentText());
1492 InsetQuotes::QuoteLanguage lga = InsetQuotes::EnglishQuotes;
1493 switch (langModule->quoteStyleCO->currentIndex()) {
1495 lga = InsetQuotes::EnglishQuotes;
1498 lga = InsetQuotes::SwedishQuotes;
1501 lga = InsetQuotes::GermanQuotes;
1504 lga = InsetQuotes::PolishQuotes;
1507 lga = InsetQuotes::FrenchQuotes;
1510 lga = InsetQuotes::DanishQuotes;
1513 params.quotes_language = lga;
1515 QString const lang = langModule->languageCO->itemData(
1516 langModule->languageCO->currentIndex()).toString();
1517 params.language = lyx::languages.getLanguage(fromqstr(lang));
1520 if (params.documentClass().hasTocLevels()) {
1521 params.tocdepth = numberingModule->tocSL->value();
1522 params.secnumdepth = numberingModule->depthSL->value();
1526 params.user_defined_bullet(0) = bulletsModule->getBullet(0);
1527 params.user_defined_bullet(1) = bulletsModule->getBullet(1);
1528 params.user_defined_bullet(2) = bulletsModule->getBullet(2);
1529 params.user_defined_bullet(3) = bulletsModule->getBullet(3);
1532 params.graphicsDriver =
1533 tex_graphics[latexModule->psdriverCO->currentIndex()];
1536 int idx = latexModule->classCO->currentIndex();
1538 string const classname = classes_model_.getIDString(idx);
1539 params.setBaseClass(classname);
1543 params.clearLayoutModules();
1544 int const srows = modules_sel_model_.rowCount();
1545 vector<string> selModList;
1546 for (int i = 0; i < srows; ++i)
1547 params.addLayoutModule(modules_sel_model_.getIDString(i));
1549 if (mathsModule->amsautoCB->isChecked()) {
1550 params.use_amsmath = BufferParams::package_auto;
1552 if (mathsModule->amsCB->isChecked())
1553 params.use_amsmath = BufferParams::package_on;
1555 params.use_amsmath = BufferParams::package_off;
1558 if (mathsModule->esintautoCB->isChecked())
1559 params.use_esint = BufferParams::package_auto;
1561 if (mathsModule->esintCB->isChecked())
1562 params.use_esint = BufferParams::package_on;
1564 params.use_esint = BufferParams::package_off;
1567 if (pageLayoutModule->pagestyleCO->currentIndex() == 0)
1568 params.pagestyle = "default";
1570 docstring style_gui =
1571 qstring_to_ucs4(pageLayoutModule->pagestyleCO->currentText());
1572 for (size_t i = 0; i < pagestyles.size(); ++i)
1573 if (pagestyles[i].second == style_gui)
1574 params.pagestyle = pagestyles[i].first;
1577 switch (textLayoutModule->lspacingCO->currentIndex()) {
1579 params.spacing().set(Spacing::Single);
1582 params.spacing().set(Spacing::Onehalf);
1585 params.spacing().set(Spacing::Double);
1588 params.spacing().set(Spacing::Other,
1589 fromqstr(textLayoutModule->lspacingLE->text()));
1593 if (textLayoutModule->twoColumnCB->isChecked())
1598 // text should have passed validation
1599 params.listings_params =
1600 InsetListingsParams(fromqstr(textLayoutModule->listingsED->toPlainText())).params();
1602 if (textLayoutModule->indentRB->isChecked())
1603 params.paragraph_separation = BufferParams::ParagraphIndentSeparation;
1605 params.paragraph_separation = BufferParams::ParagraphSkipSeparation;
1607 switch (textLayoutModule->skipCO->currentIndex()) {
1609 params.setDefSkip(VSpace(VSpace::SMALLSKIP));
1612 params.setDefSkip(VSpace(VSpace::MEDSKIP));
1615 params.setDefSkip(VSpace(VSpace::BIGSKIP));
1620 widgetsToLength(textLayoutModule->skipLE,
1621 textLayoutModule->skipLengthCO)
1623 params.setDefSkip(vs);
1627 // DocumentDefskipCB assures that this never happens
1628 // so Assert then !!! - jbl
1629 params.setDefSkip(VSpace(VSpace::MEDSKIP));
1634 fromqstr(latexModule->optionsLE->text());
1636 if (latexModule->childDocGB->isChecked())
1638 fromqstr(latexModule->childDocLE->text());
1640 params.master = string();
1642 params.float_placement = floatModule->get();
1646 tex_fonts_roman[fontModule->fontsRomanCO->currentIndex()];
1649 tex_fonts_sans[fontModule->fontsSansCO->currentIndex()];
1651 params.fontsTypewriter =
1652 tex_fonts_monospaced[fontModule->fontsTypewriterCO->currentIndex()];
1655 fromqstr(fontModule->cjkFontLE->text());
1657 params.fontsSansScale = fontModule->scaleSansSB->value();
1659 params.fontsTypewriterScale = fontModule->scaleTypewriterSB->value();
1661 params.fontsSC = fontModule->fontScCB->isChecked();
1663 params.fontsOSF = fontModule->fontOsfCB->isChecked();
1665 params.fontsDefaultFamily = GuiDocument::fontfamilies[
1666 fontModule->fontsDefaultCO->currentIndex()];
1668 if (fontModule->fontsizeCO->currentIndex() == 0)
1669 params.fontsize = "default";
1672 fromqstr(fontModule->fontsizeCO->currentText());
1675 params.papersize = PAPER_SIZE(
1676 pageLayoutModule->papersizeCO->currentIndex());
1678 // custom, A3, B3 and B4 paper sizes need geometry
1679 int psize = pageLayoutModule->papersizeCO->currentIndex();
1680 bool geom_papersize = (psize == 1 || psize == 5 || psize == 8 || psize == 9);
1682 params.paperwidth = widgetsToLength(pageLayoutModule->paperwidthLE,
1683 pageLayoutModule->paperwidthUnitCO);
1685 params.paperheight = widgetsToLength(pageLayoutModule->paperheightLE,
1686 pageLayoutModule->paperheightUnitCO);
1688 if (pageLayoutModule->facingPagesCB->isChecked())
1689 params.sides = TwoSides;
1691 params.sides = OneSide;
1693 if (pageLayoutModule->landscapeRB->isChecked())
1694 params.orientation = ORIENTATION_LANDSCAPE;
1696 params.orientation = ORIENTATION_PORTRAIT;
1699 params.use_geometry = !marginsModule->marginCB->isChecked()
1702 Ui::MarginsUi const * m = marginsModule;
1704 params.leftmargin = widgetsToLength(m->innerLE, m->innerUnit);
1705 params.topmargin = widgetsToLength(m->topLE, m->topUnit);
1706 params.rightmargin = widgetsToLength(m->outerLE, m->outerUnit);
1707 params.bottommargin = widgetsToLength(m->bottomLE, m->bottomUnit);
1708 params.headheight = widgetsToLength(m->headheightLE, m->headheightUnit);
1709 params.headsep = widgetsToLength(m->headsepLE, m->headsepUnit);
1710 params.footskip = widgetsToLength(m->footskipLE, m->footskipUnit);
1711 params.columnsep = widgetsToLength(m->columnsepLE, m->columnsepUnit);
1713 branchesModule->apply(params);
1716 PDFOptions & pdf = params.pdfoptions();
1717 pdf.use_hyperref = pdfSupportModule->use_hyperrefGB->isChecked();
1718 pdf.title = fromqstr(pdfSupportModule->titleLE->text());
1719 pdf.author = fromqstr(pdfSupportModule->authorLE->text());
1720 pdf.subject = fromqstr(pdfSupportModule->subjectLE->text());
1721 pdf.keywords = fromqstr(pdfSupportModule->keywordsLE->text());
1723 pdf.bookmarks = pdfSupportModule->bookmarksGB->isChecked();
1724 pdf.bookmarksnumbered = pdfSupportModule->bookmarksnumberedCB->isChecked();
1725 pdf.bookmarksopen = pdfSupportModule->bookmarksopenGB->isChecked();
1726 pdf.bookmarksopenlevel = pdfSupportModule->bookmarksopenlevelSB->value();
1728 pdf.breaklinks = pdfSupportModule->breaklinksCB->isChecked();
1729 pdf.pdfborder = pdfSupportModule->pdfborderCB->isChecked();
1730 pdf.pdfusetitle = pdfSupportModule->pdfusetitleCB->isChecked();
1731 pdf.colorlinks = pdfSupportModule->colorlinksCB->isChecked();
1732 pdf.backref = pdfSupportModule->backrefCB->isChecked();
1733 pdf.pagebackref = pdfSupportModule->pagebackrefCB->isChecked();
1734 if (pdfSupportModule->fullscreenCB->isChecked())
1735 pdf.pagemode = pdf.pagemode_fullscreen;
1737 pdf.pagemode.clear();
1738 pdf.quoted_options = pdf.quoted_options_check(
1739 fromqstr(pdfSupportModule->optionsLE->text()));
1743 void GuiDocument::paramsToDialog(BufferParams const & params)
1745 // set the default unit
1746 Length::UNIT defaultUnit = Length::CM;
1747 switch (lyxrc.default_papersize) {
1748 case PAPER_DEFAULT: break;
1750 case PAPER_USLETTER:
1752 case PAPER_USEXECUTIVE:
1753 defaultUnit = Length::IN;
1762 defaultUnit = Length::CM;
1769 preambleModule->update(params, id());
1772 biblioModule->citeDefaultRB->setChecked(
1773 params.citeEngine() == ENGINE_BASIC);
1775 biblioModule->citeNatbibRB->setChecked(
1776 params.citeEngine() == ENGINE_NATBIB_NUMERICAL ||
1777 params.citeEngine() == ENGINE_NATBIB_AUTHORYEAR);
1779 biblioModule->citeStyleCO->setCurrentIndex(
1780 params.citeEngine() == ENGINE_NATBIB_NUMERICAL);
1782 biblioModule->citeJurabibRB->setChecked(
1783 params.citeEngine() == ENGINE_JURABIB);
1785 biblioModule->bibtopicCB->setChecked(
1786 params.use_bibtopic);
1788 // language & quotes
1789 int const pos = langModule->languageCO->findData(toqstr(
1790 params.language->lang()));
1791 langModule->languageCO->setCurrentIndex(pos);
1793 langModule->quoteStyleCO->setCurrentIndex(
1794 params.quotes_language);
1796 bool default_enc = true;
1797 if (params.inputenc != "auto") {
1798 default_enc = false;
1799 if (params.inputenc == "default") {
1800 langModule->encodingCO->setCurrentIndex(0);
1802 int const i = langModule->encodingCO->findText(
1803 toqstr(params.inputenc));
1805 langModule->encodingCO->setCurrentIndex(i);
1807 // unknown encoding. Set to default.
1811 langModule->defaultencodingRB->setChecked(default_enc);
1812 langModule->otherencodingRB->setChecked(!default_enc);
1815 int const min_toclevel = documentClass().min_toclevel();
1816 int const max_toclevel = documentClass().max_toclevel();
1817 if (documentClass().hasTocLevels()) {
1818 numberingModule->setEnabled(true);
1819 numberingModule->depthSL->setMinimum(min_toclevel - 1);
1820 numberingModule->depthSL->setMaximum(max_toclevel);
1821 numberingModule->depthSL->setValue(params.secnumdepth);
1822 numberingModule->tocSL->setMaximum(min_toclevel - 1);
1823 numberingModule->tocSL->setMaximum(max_toclevel);
1824 numberingModule->tocSL->setValue(params.tocdepth);
1827 numberingModule->setEnabled(false);
1828 numberingModule->tocTW->clear();
1832 bulletsModule->setBullet(0, params.user_defined_bullet(0));
1833 bulletsModule->setBullet(1, params.user_defined_bullet(1));
1834 bulletsModule->setBullet(2, params.user_defined_bullet(2));
1835 bulletsModule->setBullet(3, params.user_defined_bullet(3));
1836 bulletsModule->init();
1839 int nitem = findToken(tex_graphics, params.graphicsDriver);
1841 latexModule->psdriverCO->setCurrentIndex(nitem);
1844 mathsModule->amsCB->setChecked(
1845 params.use_amsmath == BufferParams::package_on);
1846 mathsModule->amsautoCB->setChecked(
1847 params.use_amsmath == BufferParams::package_auto);
1849 mathsModule->esintCB->setChecked(
1850 params.use_esint == BufferParams::package_on);
1851 mathsModule->esintautoCB->setChecked(
1852 params.use_esint == BufferParams::package_auto);
1854 switch (params.spacing().getSpace()) {
1855 case Spacing::Other: nitem = 3; break;
1856 case Spacing::Double: nitem = 2; break;
1857 case Spacing::Onehalf: nitem = 1; break;
1858 case Spacing::Default: case Spacing::Single: nitem = 0; break;
1862 string const & layoutID = params.baseClassID();
1863 setLayoutComboByIDString(layoutID);
1865 updatePagestyle(documentClass().opt_pagestyle(),
1868 textLayoutModule->lspacingCO->setCurrentIndex(nitem);
1869 if (params.spacing().getSpace() == Spacing::Other) {
1870 textLayoutModule->lspacingLE->setText(
1871 toqstr(params.spacing().getValueAsString()));
1875 if (params.paragraph_separation == BufferParams::ParagraphIndentSeparation)
1876 textLayoutModule->indentRB->setChecked(true);
1878 textLayoutModule->skipRB->setChecked(true);
1881 switch (params.getDefSkip().kind()) {
1882 case VSpace::SMALLSKIP:
1885 case VSpace::MEDSKIP:
1888 case VSpace::BIGSKIP:
1891 case VSpace::LENGTH:
1894 string const length = params.getDefSkip().asLyXCommand();
1895 lengthToWidgets(textLayoutModule->skipLE,
1896 textLayoutModule->skipLengthCO,
1897 length, defaultUnit);
1904 textLayoutModule->skipCO->setCurrentIndex(skip);
1907 textLayoutModule->twoColumnCB->setChecked(
1908 params.columns == 2);
1910 // break listings_params to multiple lines
1912 InsetListingsParams(params.listings_params).separatedParams();
1913 textLayoutModule->listingsED->setPlainText(toqstr(lstparams));
1915 if (!params.options.empty()) {
1916 latexModule->optionsLE->setText(
1917 toqstr(params.options));
1919 latexModule->optionsLE->setText(QString());
1922 if (!params.master.empty()) {
1923 latexModule->childDocGB->setChecked(true);
1924 latexModule->childDocLE->setText(
1925 toqstr(params.master));
1927 latexModule->childDocLE->setText(QString());
1928 latexModule->childDocGB->setChecked(false);
1931 floatModule->set(params.float_placement);
1934 updateFontsize(documentClass().opt_fontsize(),
1937 int n = findToken(tex_fonts_roman, params.fontsRoman);
1939 fontModule->fontsRomanCO->setCurrentIndex(n);
1943 n = findToken(tex_fonts_sans, params.fontsSans);
1945 fontModule->fontsSansCO->setCurrentIndex(n);
1949 n = findToken(tex_fonts_monospaced, params.fontsTypewriter);
1951 fontModule->fontsTypewriterCO->setCurrentIndex(n);
1955 if (!params.fontsCJK.empty())
1956 fontModule->cjkFontLE->setText(
1957 toqstr(params.fontsCJK));
1959 fontModule->cjkFontLE->setText(QString());
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 // Nothing to do here as the document settings is not cursor dependant.
2096 void GuiDocument::useClassDefaults()
2098 if (applyPB->isEnabled()) {
2099 int const ret = Alert::prompt(_("Unapplied changes"),
2100 _("Some changes in the dialog were not yet applied.\n"
2101 "If you do not apply now, they will be lost after this action."),
2102 1, 1, _("&Apply"), _("&Dismiss"));
2107 int idx = latexModule->classCO->currentIndex();
2108 string const classname = classes_model_.getIDString(idx);
2109 if (!bp_.setBaseClass(classname)) {
2110 Alert::error(_("Error"), _("Unable to set document class."));
2113 bp_.useClassDefaults();
2114 paramsToDialog(bp_);
2118 void GuiDocument::setLayoutComboByIDString(std::string const & idString)
2120 int idx = classes_model_.findIDString(idString);
2122 Alert::warning(_("Can't set layout!"),
2123 bformat(_("Unable to set layout for ID: %1$s"), from_utf8(idString)));
2125 latexModule->classCO->setCurrentIndex(idx);
2129 bool GuiDocument::isValid()
2131 return validate_listings_params().empty()
2132 && (textLayoutModule->skipCO->currentIndex() != 3
2133 || !textLayoutModule->skipLE->text().isEmpty());
2137 char const * const GuiDocument::fontfamilies[5] = {
2138 "default", "rmdefault", "sfdefault", "ttdefault", ""
2142 char const * GuiDocument::fontfamilies_gui[5] = {
2143 N_("Default"), N_("Roman"), N_("Sans Serif"), N_("Typewriter"), ""
2147 bool GuiDocument::initialiseParams(string const &)
2149 BufferView * view = bufferview();
2151 bp_ = BufferParams();
2152 paramsToDialog(bp_);
2155 bp_ = view->buffer().params();
2157 updateAvailableModules();
2158 updateSelectedModules();
2159 //FIXME It'd be nice to make sure here that the selected
2160 //modules are consistent: That required modules are actually
2161 //selected, and that we don't have conflicts. If so, we could
2162 //at least pop up a warning.
2163 paramsToDialog(bp_);
2168 void GuiDocument::clearParams()
2170 bp_ = BufferParams();
2174 BufferId GuiDocument::id() const
2176 BufferView const * const view = bufferview();
2177 return view? &view->buffer() : 0;
2181 vector<GuiDocument::modInfoStruct> const & GuiDocument::getModuleInfo()
2183 return moduleNames_;
2187 vector<GuiDocument::modInfoStruct> const GuiDocument::getSelectedModules()
2189 vector<string> const & mods = params().getModules();
2190 vector<string>::const_iterator it = mods.begin();
2191 vector<string>::const_iterator end = mods.end();
2192 vector<modInfoStruct> mInfo;
2193 for (; it != end; ++it) {
2196 LyXModule * mod = moduleList[*it];
2198 m.name = qt_(mod->getName());
2200 m.name = toqstr(*it) + toqstr(" (") + qt_("Not Found") + toqstr(")");
2207 DocumentClass const & GuiDocument::documentClass() const
2209 return bp_.documentClass();
2213 static void dispatch_bufferparams(Dialog const & dialog,
2214 BufferParams const & bp, FuncCode lfun)
2217 ss << "\\begin_header\n";
2219 ss << "\\end_header\n";
2220 dialog.dispatch(FuncRequest(lfun, ss.str()));
2224 void GuiDocument::dispatchParams()
2226 // This must come first so that a language change is correctly noticed
2229 // Apply the BufferParams. Note that this will set the base class
2230 // and then update the buffer's layout.
2231 dispatch_bufferparams(*this, params(), LFUN_BUFFER_PARAMS_APPLY);
2233 if (!params().master.empty()) {
2234 FileName const master_file = support::makeAbsPath(params().master,
2235 support::onlyPath(buffer().absFileName()));
2236 if (isLyXFilename(master_file.absFilename())) {
2237 Buffer * master = checkAndLoadLyXFile(master_file);
2238 buffer().setParent(master);
2242 // Generate the colours requested by each new branch.
2243 BranchList & branchlist = params().branchlist();
2244 if (!branchlist.empty()) {
2245 BranchList::const_iterator it = branchlist.begin();
2246 BranchList::const_iterator const end = branchlist.end();
2247 for (; it != end; ++it) {
2248 docstring const & current_branch = it->getBranch();
2249 Branch const * branch = branchlist.find(current_branch);
2250 string const x11hexname = X11hexname(branch->getColor());
2251 // display the new color
2252 docstring const str = current_branch + ' ' + from_ascii(x11hexname);
2253 dispatch(FuncRequest(LFUN_SET_COLOR, str));
2256 // Open insets of selected branches, close deselected ones
2257 dispatch(FuncRequest(LFUN_ALL_INSETS_TOGGLE,
2260 // FIXME: If we used an LFUN, we would not need those two lines:
2261 bufferview()->processUpdateFlags(Update::Force | Update::FitCursor);
2265 void GuiDocument::setLanguage() const
2267 Language const * const newL = bp_.language;
2268 if (buffer().params().language == newL)
2271 string const & lang_name = newL->lang();
2272 dispatch(FuncRequest(LFUN_BUFFER_LANGUAGE, lang_name));
2276 void GuiDocument::saveAsDefault() const
2278 dispatch_bufferparams(*this, params(), LFUN_BUFFER_SAVE_AS_DEFAULT);
2282 bool GuiDocument::isFontAvailable(string const & font) const
2284 if (font == "default" || font == "cmr"
2285 || font == "cmss" || font == "cmtt")
2286 // these are standard
2288 if (font == "lmodern" || font == "lmss" || font == "lmtt")
2289 return LaTeXFeatures::isAvailable("lmodern");
2290 if (font == "times" || font == "palatino"
2291 || font == "helvet" || font == "courier")
2292 return LaTeXFeatures::isAvailable("psnfss");
2293 if (font == "cmbr" || font == "cmtl")
2294 return LaTeXFeatures::isAvailable("cmbright");
2295 if (font == "utopia")
2296 return LaTeXFeatures::isAvailable("utopia")
2297 || LaTeXFeatures::isAvailable("fourier");
2298 if (font == "beraserif" || font == "berasans"
2299 || font == "beramono")
2300 return LaTeXFeatures::isAvailable("bera");
2301 return LaTeXFeatures::isAvailable(font);
2305 bool GuiDocument::providesOSF(string const & font) const
2308 return isFontAvailable("eco");
2309 if (font == "palatino")
2310 return isFontAvailable("mathpazo");
2315 bool GuiDocument::providesSC(string const & font) const
2317 if (font == "palatino")
2318 return isFontAvailable("mathpazo");
2319 if (font == "utopia")
2320 return isFontAvailable("fourier");
2325 bool GuiDocument::providesScale(string const & font) const
2327 return font == "helvet" || font == "luximono"
2328 || font == "berasans" || font == "beramono";
2332 void GuiDocument::loadModuleInfo()
2334 moduleNames_.clear();
2335 LyXModuleList::const_iterator it = moduleList.begin();
2336 LyXModuleList::const_iterator end = moduleList.end();
2337 for (; it != end; ++it) {
2340 m.name = qt_(it->getName());
2341 // this is supposed to give us the first sentence of the description
2342 QString desc = qt_(it->getDescription());
2343 int const pos = desc.indexOf(".");
2345 desc.truncate(pos + 1);
2346 m.description = desc;
2347 moduleNames_.push_back(m);
2352 Dialog * createGuiDocument(GuiView & lv) { return new GuiDocument(lv); }
2355 } // namespace frontend
2358 #include "GuiDocument_moc.cpp"