X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fqt4%2FGuiDocument.cpp;h=0a96469935b7f29f82ae6c92a6cb962ae837c754;hb=bbfc419c10010c1ebf6ab59adf2eaf6f63104a9e;hp=12812649c64de8b46cc71296a77bd9bcac54bac2;hpb=57e1ab3e63a6425f1b96f744c33056e85f4206d4;p=features.git diff --git a/src/frontends/qt4/GuiDocument.cpp b/src/frontends/qt4/GuiDocument.cpp index 12812649c6..0a96469935 100644 --- a/src/frontends/qt4/GuiDocument.cpp +++ b/src/frontends/qt4/GuiDocument.cpp @@ -15,6 +15,7 @@ #include "GuiApplication.h" #include "GuiBranches.h" +#include "GuiIndices.h" #include "GuiSelectionManager.h" #include "LaTeXHighlighter.h" #include "LengthCombo.h" @@ -28,13 +29,17 @@ #include "BufferParams.h" #include "BufferView.h" #include "Color.h" +#include "ColorCache.h" #include "Encoding.h" #include "FloatPlacement.h" +#include "Format.h" #include "FuncRequest.h" +#include "IndicesList.h" #include "Language.h" #include "LaTeXFeatures.h" #include "Layout.h" -#include "LyXRC.h" // defaultUnit +#include "LayoutModuleList.h" +#include "LyXRC.h" #include "ModuleList.h" #include "OutputParams.h" #include "PDFOptions.h" @@ -52,7 +57,10 @@ #include "frontends/alert.h" #include +#include +#include #include +#include #include #include @@ -64,6 +72,19 @@ #endif +// a style sheet for buttons +// this is for example used for the background color setting button +static inline QString colorButtonStyleSheet(QColor const & bgColor) +{ + if (bgColor.isValid()) { + QString rc = QLatin1String("background:"); + rc += bgColor.name(); + return rc; + } + return QString(); +} + + using namespace std; using namespace lyx::support; @@ -154,6 +175,8 @@ vector > pagestyles; namespace lyx { +RGBColor set_backgroundcolor; + namespace { // used when sorting the textclass list. class less_textclass_avail_desc @@ -167,10 +190,11 @@ public: // 2. Description (lexicographic) LayoutFile const & tc1 = LayoutFileList::get()[lhs]; LayoutFile const & tc2 = LayoutFileList::get()[rhs]; + int const rel = compare_no_case( + translateIfPossible(from_utf8(tc1.description())), + translateIfPossible(from_utf8(tc2.description()))); return (tc1.isTeXClassAvailable() && !tc2.isTeXClassAvailable()) || - (tc1.isTeXClassAvailable() == tc2.isTeXClassAvailable() && - translateIfPossible(from_utf8(tc1.description())) - < translateIfPossible(from_utf8(tc2.description()))); + (tc1.isTeXClassAvailable() == tc2.isTeXClassAvailable() && rel < 0); } }; @@ -202,7 +226,8 @@ docstring getModuleDescription(string const & modName) LyXModule const * const mod = moduleList[modName]; if (!mod) return _("Module not found!"); - return _(mod->getDescription()); + // FIXME Unicode + return translateIfPossible(from_utf8(mod->getDescription())); } @@ -251,11 +276,11 @@ public: upPB, downPB, availableModel, selectedModel), container_(container) {} /// - void updateProvidedModules(std::list const & pm) - { provided_modules_ = pm; } + void updateProvidedModules(LayoutModuleList const & pm) + { provided_modules_ = pm.list(); } /// - void updateExcludedModules(std::list const & em) - { excluded_modules_ = em; } + void updateExcludedModules(LayoutModuleList const & em) + { excluded_modules_ = em.list(); } private: /// virtual void updateAddPB(); @@ -579,8 +604,18 @@ GuiDocument::GuiDocument(GuiView & lv) // initialize the length validator bc().addCheckedLineEdit(textLayoutModule->skipLE); - fontModule = new UiWidget; + // output + outputModule = new UiWidget; + + connect(outputModule->xetexCB, SIGNAL(clicked()), + this, SLOT(change_adaptor())); + connect(outputModule->xetexCB, SIGNAL(toggled(bool)), + this, SLOT(xetexChanged(bool))); + connect(outputModule->defaultFormatCO, SIGNAL(activated(int)), + this, SLOT(change_adaptor())); + // fonts + fontModule = new UiWidget; connect(fontModule->fontsRomanCO, SIGNAL(activated(int)), this, SLOT(change_adaptor())); connect(fontModule->fontsRomanCO, SIGNAL(activated(int)), @@ -608,24 +643,7 @@ GuiDocument::GuiDocument(GuiView & lv) connect(fontModule->fontOsfCB, SIGNAL(clicked()), this, SLOT(change_adaptor())); - for (int n = 0; tex_fonts_roman[n][0]; ++n) { - QString font = qt_(tex_fonts_roman_gui[n]); - if (!isFontAvailable(tex_fonts_roman[n])) - font += qt_(" (not installed)"); - fontModule->fontsRomanCO->addItem(font); - } - for (int n = 0; tex_fonts_sans[n][0]; ++n) { - QString font = qt_(tex_fonts_sans_gui[n]); - if (!isFontAvailable(tex_fonts_sans[n])) - font += qt_(" (not installed)"); - fontModule->fontsSansCO->addItem(font); - } - for (int n = 0; tex_fonts_monospaced[n][0]; ++n) { - QString font = qt_(tex_fonts_monospaced_gui[n]); - if (!isFontAvailable(tex_fonts_monospaced[n])) - font += qt_(" (not installed)"); - fontModule->fontsTypewriterCO->addItem(font); - } + updateFontlist(); fontModule->fontsizeCO->addItem(qt_("Default")); fontModule->fontsizeCO->addItem(qt_("10")); @@ -663,6 +681,10 @@ GuiDocument::GuiDocument(GuiView & lv) this, SLOT(change_adaptor())); connect(pageLayoutModule->pagestyleCO, SIGNAL(activated(int)), this, SLOT(change_adaptor())); + connect(pageLayoutModule->backgroundPB, SIGNAL(clicked()), + this, SLOT(changeBackgroundColor())); + connect(pageLayoutModule->delbackgroundTB, SIGNAL(clicked()), + this, SLOT(deleteBackgroundColor())); pageLayoutModule->pagestyleCO->addItem(qt_("Default")); pageLayoutModule->pagestyleCO->addItem(qt_("empty")); @@ -837,10 +859,28 @@ GuiDocument::GuiDocument(GuiView & lv) this, SLOT(change_adaptor())); connect(biblioModule->bibtopicCB, SIGNAL(clicked()), this, SLOT(change_adaptor())); + connect(biblioModule->bibtexCO, SIGNAL(activated(int)), + this, SLOT(bibtexChanged(int))); + connect(biblioModule->bibtexOptionsED, SIGNAL(textChanged(QString)), + this, SLOT(change_adaptor())); // biblio biblioModule->citeStyleCO->addItem(qt_("Author-year")); biblioModule->citeStyleCO->addItem(qt_("Numerical")); biblioModule->citeStyleCO->setCurrentIndex(0); + + biblioModule->bibtexCO->clear(); + + biblioModule->bibtexCO->addItem(qt_("Default"), QString("default")); + for (set::const_iterator it = lyxrc.bibtex_alternatives.begin(); + it != lyxrc.bibtex_alternatives.end(); ++it) { + QString const command = toqstr(*it).left(toqstr(*it).indexOf(" ")); + biblioModule->bibtexCO->addItem(command, command); + } + + // indices + indicesModule = new GuiIndices; + connect(indicesModule, SIGNAL(changed()), + this, SLOT(change_adaptor())); mathsModule = new UiWidget; @@ -906,6 +946,9 @@ GuiDocument::GuiDocument(GuiView & lv) branchesModule = new GuiBranches; connect(branchesModule, SIGNAL(changed()), this, SLOT(change_adaptor())); + connect(branchesModule, SIGNAL(renameBranches(docstring const &, docstring const &)), + this, SLOT(branchesRename(docstring const &, docstring const &))); + updateUnknownBranches(); // preamble preambleModule = new PreambleModule; @@ -986,11 +1029,13 @@ GuiDocument::GuiDocument(GuiView & lv) docPS->addPanel(langModule, qt_("Language")); docPS->addPanel(numberingModule, qt_("Numbering & TOC")); docPS->addPanel(biblioModule, qt_("Bibliography")); + docPS->addPanel(indicesModule, qt_("Indexes")); docPS->addPanel(pdfSupportModule, qt_("PDF Properties")); docPS->addPanel(mathsModule, qt_("Math Options")); docPS->addPanel(floatModule, qt_("Float Placement")); docPS->addPanel(bulletsModule, qt_("Bullets")); docPS->addPanel(branchesModule, qt_("Branches")); + docPS->addPanel(outputModule, qt_("Output")); docPS->addPanel(preambleModule, qt_("LaTeX Preamble")); docPS->setCurrentPanel(qt_("Document Class")); // FIXME: hack to work around resizing bug in Qt >= 4.2 @@ -1087,13 +1132,23 @@ void GuiDocument::enableSkip(bool skip) setSkip(textLayoutModule->skipCO->currentIndex()); } + void GuiDocument::portraitChanged() { setMargins(pageLayoutModule->papersizeCO->currentIndex()); } + void GuiDocument::setMargins(bool custom) { + bool const extern_geometry = + documentClass().provides("geometry"); + marginsModule->marginCB->setEnabled(!extern_geometry); + if (extern_geometry) { + marginsModule->marginCB->setChecked(false); + setCustomMargins(true); + return; + } marginsModule->marginCB->setChecked(custom); setCustomMargins(custom); } @@ -1156,6 +1211,62 @@ void GuiDocument::setCustomMargins(bool custom) marginsModule->columnsepUnit->setEnabled(enableColSep); } +void GuiDocument::changeBackgroundColor() +{ + QColor const & newColor = QColorDialog::getColor( + rgb2qcolor(set_backgroundcolor), asQWidget()); + if (!newColor.isValid()) + return; + // set the button color + pageLayoutModule->backgroundPB->setStyleSheet( + colorButtonStyleSheet(newColor)); + // save color + set_backgroundcolor = rgbFromHexName(fromqstr(newColor.name())); + changed(); +} + + +void GuiDocument::deleteBackgroundColor() +{ + // set the button color back to white + pageLayoutModule->backgroundPB->setStyleSheet( + colorButtonStyleSheet(QColor(Qt::white))); + // save white as the set color + set_backgroundcolor = rgbFromHexName("#ffffff"); + changed(); +} + + +void GuiDocument::xetexChanged(bool xetex) +{ + updateFontlist(); + updateDefaultFormat(); + langModule->encodingCO->setEnabled(!xetex && + !langModule->defaultencodingRB->isChecked()); + langModule->defaultencodingRB->setEnabled(!xetex); + langModule->otherencodingRB->setEnabled(!xetex); + + fontModule->fontsDefaultCO->setEnabled(!xetex); + fontModule->fontsDefaultLA->setEnabled(!xetex); + fontModule->cjkFontLE->setEnabled(!xetex); + fontModule->cjkFontLA->setEnabled(!xetex); + string font; + if (!xetex) + font = tex_fonts_sans[fontModule->fontsSansCO->currentIndex()]; + bool scaleable = providesScale(font); + fontModule->scaleSansSB->setEnabled(scaleable); + fontModule->scaleSansLA->setEnabled(scaleable); + if (!xetex) + font = tex_fonts_monospaced[fontModule->fontsTypewriterCO->currentIndex()]; + scaleable = providesScale(font); + fontModule->scaleTypewriterSB->setEnabled(scaleable); + fontModule->scaleTypewriterLA->setEnabled(scaleable); + if (!xetex) + font = tex_fonts_roman[fontModule->fontsRomanCO->currentIndex()]; + fontModule->fontScCB->setEnabled(providesSC(font)); + fontModule->fontOsfCB->setEnabled(providesOSF(font)); +} + void GuiDocument::updateFontsize(string const & items, string const & sel) { @@ -1175,8 +1286,53 @@ void GuiDocument::updateFontsize(string const & items, string const & sel) } +void GuiDocument::updateFontlist() +{ + fontModule->fontsRomanCO->clear(); + fontModule->fontsSansCO->clear(); + fontModule->fontsTypewriterCO->clear(); + + // With XeTeX, we have access to all system fonts, but not the LaTeX fonts + if (outputModule->xetexCB->isChecked()) { + fontModule->fontsRomanCO->addItem(qt_("Default")); + fontModule->fontsSansCO->addItem(qt_("Default")); + fontModule->fontsTypewriterCO->addItem(qt_("Default")); + + QFontDatabase fontdb; + QStringList families(fontdb.families()); + for (QStringList::Iterator it = families.begin(); it != families.end(); ++it) { + fontModule->fontsRomanCO->addItem(*it); + fontModule->fontsSansCO->addItem(*it); + fontModule->fontsTypewriterCO->addItem(*it); + } + return; + } + + for (int n = 0; tex_fonts_roman[n][0]; ++n) { + QString font = qt_(tex_fonts_roman_gui[n]); + if (!isFontAvailable(tex_fonts_roman[n])) + font += qt_(" (not installed)"); + fontModule->fontsRomanCO->addItem(font); + } + for (int n = 0; tex_fonts_sans[n][0]; ++n) { + QString font = qt_(tex_fonts_sans_gui[n]); + if (!isFontAvailable(tex_fonts_sans[n])) + font += qt_(" (not installed)"); + fontModule->fontsSansCO->addItem(font); + } + for (int n = 0; tex_fonts_monospaced[n][0]; ++n) { + QString font = qt_(tex_fonts_monospaced_gui[n]); + if (!isFontAvailable(tex_fonts_monospaced[n])) + font += qt_(" (not installed)"); + fontModule->fontsTypewriterCO->addItem(font); + } +} + + void GuiDocument::romanChanged(int item) { + if (outputModule->xetexCB->isChecked()) + return; string const font = tex_fonts_roman[item]; fontModule->fontScCB->setEnabled(providesSC(font)); fontModule->fontOsfCB->setEnabled(providesOSF(font)); @@ -1185,6 +1341,8 @@ void GuiDocument::romanChanged(int item) void GuiDocument::sansChanged(int item) { + if (outputModule->xetexCB->isChecked()) + return; string const font = tex_fonts_sans[item]; bool scaleable = providesScale(font); fontModule->scaleSansSB->setEnabled(scaleable); @@ -1194,6 +1352,8 @@ void GuiDocument::sansChanged(int item) void GuiDocument::ttChanged(int item) { + if (outputModule->xetexCB->isChecked()) + return; string const font = tex_fonts_monospaced[item]; bool scaleable = providesScale(font); fontModule->scaleTypewriterSB->setEnabled(scaleable); @@ -1354,6 +1514,13 @@ void GuiDocument::classChanged() } +void GuiDocument::bibtexChanged(int n) +{ + biblioModule->bibtexOptionsED->setEnabled(n != 0); + changed(); +} + + namespace { // This is an insanely complicated attempt to make this sort of thing // work with RTL languages. @@ -1363,22 +1530,22 @@ namespace { if (v.size() == 0) return docstring(); if (v.size() == 1) - return from_ascii(v[0]); + return from_utf8(v[0]); if (v.size() == 2) { docstring retval = _("%1$s and %2$s"); retval = subst(retval, _("and"), s); - return bformat(retval, from_ascii(v[0]), from_ascii(v[1])); + return bformat(retval, from_utf8(v[0]), from_utf8(v[1])); } // The idea here is to format all but the last two items... int const vSize = v.size(); docstring t2 = _("%1$s, %2$s"); - docstring retval = from_ascii(v[0]); + docstring retval = from_utf8(v[0]); for (int i = 1; i < vSize - 2; ++i) - retval = bformat(t2, retval, from_ascii(v[i])); + retval = bformat(t2, retval, from_utf8(v[i])); //...and then to plug them, and the last two, into this schema docstring t = _("%1$s, %2$s, and %3$s"); t = subst(t, _("and"), s); - return bformat(t, retval, from_ascii(v[vSize - 2]), from_ascii(v[vSize - 1])); + return bformat(t, retval, from_utf8(v[vSize - 2]), from_utf8(v[vSize - 1])); } vector idsToNames(vector const & idList) @@ -1408,7 +1575,7 @@ void GuiDocument::modulesToParams(BufferParams & bp) // update the list of removed modules bp.clearRemovedModules(); - list const & reqmods = bp.baseClass()->defaultModules(); + LayoutModuleList const & reqmods = bp.baseClass()->defaultModules(); list::const_iterator rit = reqmods.begin(); list::const_iterator ren = reqmods.end(); @@ -1456,7 +1623,7 @@ void GuiDocument::updateModuleInfo() string const modName = id_model.getIDString(idx.row()); docstring desc = getModuleDescription(modName); - list const & provmods = bp_.baseClass()->providedModules(); + LayoutModuleList const & provmods = bp_.baseClass()->providedModules(); if (std::find(provmods.begin(), provmods.end(), modName) != provmods.end()) { if (!desc.empty()) desc += "\n"; @@ -1529,6 +1696,32 @@ void GuiDocument::updateNumbering() } +void GuiDocument::updateDefaultFormat() +{ + // make a copy in order to consider unapplied changes + Buffer * tmpbuf = const_cast(&buffer()); + tmpbuf->params().useXetex = outputModule->xetexCB->isChecked(); + int idx = latexModule->classCO->currentIndex(); + if (idx >= 0) { + string const classname = classes_model_.getIDString(idx); + tmpbuf->params().setBaseClass(classname); + tmpbuf->params().makeDocumentClass(); + } + outputModule->defaultFormatCO->blockSignals(true); + outputModule->defaultFormatCO->clear(); + outputModule->defaultFormatCO->addItem(qt_("Default"), + QVariant(QString("default"))); + typedef vector Formats; + Formats formats = tmpbuf->exportableFormats(true); + Formats::const_iterator cit = formats.begin(); + Formats::const_iterator end = formats.end(); + for (; cit != end; ++cit) + outputModule->defaultFormatCO->addItem(qt_((*cit)->prettyname()), + QVariant(toqstr((*cit)->name()))); + outputModule->defaultFormatCO->blockSignals(false); +} + + void GuiDocument::applyView() { // preamble @@ -1551,6 +1744,19 @@ void GuiDocument::applyView() bp_.use_bibtopic = biblioModule->bibtopicCB->isChecked(); + string const bibtex_command = + fromqstr(biblioModule->bibtexCO->itemData( + biblioModule->bibtexCO->currentIndex()).toString()); + string const bibtex_options = + fromqstr(biblioModule->bibtexOptionsED->text()); + if (bibtex_command == "default" || bibtex_options.empty()) + bp_.bibtex_command = bibtex_command; + else + bp_.bibtex_command = bibtex_command + " " + bibtex_options; + + // Indices + indicesModule->apply(bp_); + // language & quotes if (langModule->defaultencodingRB->isChecked()) { bp_.inputenc = "auto"; @@ -1604,7 +1810,7 @@ void GuiDocument::applyView() QString const lang = langModule->languageCO->itemData( langModule->languageCO->currentIndex()).toString(); - bp_.language = lyx::languages.getLanguage(fromqstr(lang)); + bp_.language = languages.getLanguage(fromqstr(lang)); // numbering if (bp_.documentClass().hasTocLevels()) { @@ -1671,7 +1877,7 @@ void GuiDocument::applyView() break; case 3: bp_.spacing().set(Spacing::Other, - fromqstr(textLayoutModule->lspacingLE->text())); + widgetToDoubleStr(textLayoutModule->lspacingLE)); break; } @@ -1729,15 +1935,42 @@ void GuiDocument::applyView() bp_.float_placement = floatModule->get(); - // fonts - bp_.fontsRoman = - tex_fonts_roman[fontModule->fontsRomanCO->currentIndex()]; + // output + bp_.defaultOutputFormat = fromqstr(outputModule->defaultFormatCO->itemData( + outputModule->defaultFormatCO->currentIndex()).toString()); - bp_.fontsSans = - tex_fonts_sans[fontModule->fontsSansCO->currentIndex()]; + bool const xetex = outputModule->xetexCB->isChecked(); + bp_.useXetex = xetex; - bp_.fontsTypewriter = - tex_fonts_monospaced[fontModule->fontsTypewriterCO->currentIndex()]; + // fonts + if (xetex) { + if (fontModule->fontsRomanCO->currentIndex() == 0) + bp_.fontsRoman = "default"; + else + bp_.fontsRoman = + fromqstr(fontModule->fontsRomanCO->currentText()); + + if (fontModule->fontsSansCO->currentIndex() == 0) + bp_.fontsSans = "default"; + else + bp_.fontsSans = + fromqstr(fontModule->fontsSansCO->currentText()); + + if (fontModule->fontsTypewriterCO->currentIndex() == 0) + bp_.fontsTypewriter = "default"; + else + bp_.fontsTypewriter = + fromqstr(fontModule->fontsTypewriterCO->currentText()); + } else { + bp_.fontsRoman = + tex_fonts_roman[fontModule->fontsRomanCO->currentIndex()]; + + bp_.fontsSans = + tex_fonts_sans[fontModule->fontsSansCO->currentIndex()]; + + bp_.fontsTypewriter = + tex_fonts_monospaced[fontModule->fontsTypewriterCO->currentIndex()]; + } bp_.fontsCJK = fromqstr(fontModule->cjkFontLE->text()); @@ -1750,8 +1983,11 @@ void GuiDocument::applyView() bp_.fontsOSF = fontModule->fontOsfCB->isChecked(); - bp_.fontsDefaultFamily = GuiDocument::fontfamilies[ - fontModule->fontsDefaultCO->currentIndex()]; + if (xetex) + bp_.fontsDefaultFamily = "default"; + else + bp_.fontsDefaultFamily = GuiDocument::fontfamilies[ + fontModule->fontsDefaultCO->currentIndex()]; if (fontModule->fontsizeCO->currentIndex() == 0) bp_.fontsize = "default"; @@ -1783,6 +2019,8 @@ void GuiDocument::applyView() else bp_.orientation = ORIENTATION_PORTRAIT; + bp_.backgroundcolor = set_backgroundcolor; + // margins bp_.use_geometry = !marginsModule->marginCB->isChecked() || geom_papersize; @@ -1798,6 +2036,7 @@ void GuiDocument::applyView() bp_.footskip = widgetsToLength(m->footskipLE, m->footskipUnit); bp_.columnsep = widgetsToLength(m->columnsepLE, m->columnsepUnit); + // branches branchesModule->apply(bp_); // PDF support @@ -1831,27 +2070,7 @@ void GuiDocument::applyView() void GuiDocument::paramsToDialog() { // set the default unit - Length::UNIT defaultUnit = Length::CM; - switch (lyxrc.default_papersize) { - case PAPER_DEFAULT: break; - - case PAPER_USLETTER: - case PAPER_USLEGAL: - case PAPER_USEXECUTIVE: - defaultUnit = Length::IN; - break; - - case PAPER_A3: - case PAPER_A4: - case PAPER_A5: - case PAPER_B3: - case PAPER_B4: - case PAPER_B5: - defaultUnit = Length::CM; - break; - case PAPER_CUSTOM: - break; - } + Length::UNIT const defaultUnit = Length::defaultUnit(); // preamble preambleModule->update(bp_, id()); @@ -1873,6 +2092,24 @@ void GuiDocument::paramsToDialog() biblioModule->bibtopicCB->setChecked( bp_.use_bibtopic); + string command; + string options = + split(bp_.bibtex_command, command, ' '); + + int const bpos = biblioModule->bibtexCO->findData(toqstr(command)); + if (bpos != -1) { + biblioModule->bibtexCO->setCurrentIndex(bpos); + biblioModule->bibtexOptionsED->setText(toqstr(options).trimmed()); + } else { + biblioModule->bibtexCO->setCurrentIndex(0); + biblioModule->bibtexOptionsED->clear(); + } + biblioModule->bibtexOptionsED->setEnabled( + biblioModule->bibtexCO->currentIndex() != 0); + + // indices + indicesModule->update(bp_); + // language & quotes int const pos = langModule->languageCO->findData(toqstr( bp_.language->lang())); @@ -1964,8 +2201,8 @@ void GuiDocument::paramsToDialog() textLayoutModule->lspacingCO->setCurrentIndex(nitem); if (bp_.spacing().getSpace() == Spacing::Other) { - textLayoutModule->lspacingLE->setText( - toqstr(bp_.spacing().getValueAsString())); + doubleToWidget(textLayoutModule->lspacingLE, + bp_.spacing().getValueAsString()); } setLSpacing(nitem); @@ -2051,26 +2288,62 @@ void GuiDocument::paramsToDialog() floatModule->set(bp_.float_placement); + // Output + // update combobox with formats + updateDefaultFormat(); + int index = outputModule->defaultFormatCO->findData(toqstr( + bp_.defaultOutputFormat)); + // set to default if format is not found + if (index == -1) + index = 0; + outputModule->defaultFormatCO->setCurrentIndex(index); + outputModule->xetexCB->setEnabled(bp_.baseClass()->outputType() == lyx::LATEX); + outputModule->xetexCB->setChecked( + bp_.baseClass()->outputType() == lyx::LATEX && bp_.useXetex); + // Fonts updateFontsize(documentClass().opt_fontsize(), bp_.fontsize); - int n = findToken(tex_fonts_roman, bp_.fontsRoman); - if (n >= 0) { - fontModule->fontsRomanCO->setCurrentIndex(n); - romanChanged(n); - } - - n = findToken(tex_fonts_sans, bp_.fontsSans); - if (n >= 0) { - fontModule->fontsSansCO->setCurrentIndex(n); - sansChanged(n); - } - - n = findToken(tex_fonts_monospaced, bp_.fontsTypewriter); - if (n >= 0) { - fontModule->fontsTypewriterCO->setCurrentIndex(n); - ttChanged(n); + if (bp_.useXetex) { + for (int i = 0; i < fontModule->fontsRomanCO->count(); ++i) { + if (fontModule->fontsRomanCO->itemText(i) == toqstr(bp_.fontsRoman)) { + fontModule->fontsRomanCO->setCurrentIndex(i); + return; + } + } + + for (int i = 0; i < fontModule->fontsSansCO->count(); ++i) { + if (fontModule->fontsSansCO->itemText(i) == toqstr(bp_.fontsSans)) { + fontModule->fontsSansCO->setCurrentIndex(i); + return; + } + } + for (int i = 0; i < fontModule->fontsTypewriterCO->count(); ++i) { + if (fontModule->fontsTypewriterCO->itemText(i) == + toqstr(bp_.fontsTypewriter)) { + fontModule->fontsTypewriterCO->setCurrentIndex(i); + return; + } + } + } else { + int n = findToken(tex_fonts_roman, bp_.fontsRoman); + if (n >= 0) { + fontModule->fontsRomanCO->setCurrentIndex(n); + romanChanged(n); + } + + n = findToken(tex_fonts_sans, bp_.fontsSans); + if (n >= 0) { + fontModule->fontsSansCO->setCurrentIndex(n); + sansChanged(n); + } + + n = findToken(tex_fonts_monospaced, bp_.fontsTypewriter); + if (n >= 0) { + fontModule->fontsTypewriterCO->setCurrentIndex(n); + ttChanged(n); + } } if (!bp_.fontsCJK.empty()) @@ -2083,27 +2356,35 @@ void GuiDocument::paramsToDialog() fontModule->fontOsfCB->setChecked(bp_.fontsOSF); fontModule->scaleSansSB->setValue(bp_.fontsSansScale); fontModule->scaleTypewriterSB->setValue(bp_.fontsTypewriterScale); - n = findToken(GuiDocument::fontfamilies, bp_.fontsDefaultFamily); - if (n >= 0) - fontModule->fontsDefaultCO->setCurrentIndex(n); + + int nn = findToken(GuiDocument::fontfamilies, bp_.fontsDefaultFamily); + if (nn >= 0) + fontModule->fontsDefaultCO->setCurrentIndex(nn); // paper + bool const extern_geometry = + documentClass().provides("geometry"); int const psize = bp_.papersize; pageLayoutModule->papersizeCO->setCurrentIndex(psize); - setCustomPapersize(psize); + setCustomPapersize(!extern_geometry && psize); + pageLayoutModule->papersizeCO->setEnabled(!extern_geometry); bool const landscape = bp_.orientation == ORIENTATION_LANDSCAPE; pageLayoutModule->landscapeRB->setChecked(landscape); pageLayoutModule->portraitRB->setChecked(!landscape); + pageLayoutModule->landscapeRB->setEnabled(!extern_geometry); + pageLayoutModule->portraitRB->setEnabled(!extern_geometry); pageLayoutModule->facingPagesCB->setChecked( bp_.sides == TwoSides); + pageLayoutModule->backgroundPB->setStyleSheet( + colorButtonStyleSheet(rgb2qcolor(bp_.backgroundcolor))); + set_backgroundcolor = bp_.backgroundcolor; lengthToWidgets(pageLayoutModule->paperwidthLE, pageLayoutModule->paperwidthUnitCO, bp_.paperwidth, defaultUnit); - lengthToWidgets(pageLayoutModule->paperheightLE, pageLayoutModule->paperheightUnitCO, bp_.paperheight, defaultUnit); @@ -2136,6 +2417,8 @@ void GuiDocument::paramsToDialog() lengthToWidgets(m->columnsepLE, m->columnsepUnit, bp_.columnsep, defaultUnit); + // branches + updateUnknownBranches(); branchesModule->update(bp_); // PDF support @@ -2157,15 +2440,22 @@ void GuiDocument::paramsToDialog() pdfSupportModule->pdfusetitleCB->setChecked(pdf.pdfusetitle); pdfSupportModule->colorlinksCB->setChecked(pdf.colorlinks); - n = findToken(backref_opts, pdf.backref); - if (n >= 0) - pdfSupportModule->backrefCO->setCurrentIndex(n); + nn = findToken(backref_opts, pdf.backref); + if (nn >= 0) + pdfSupportModule->backrefCO->setCurrentIndex(nn); pdfSupportModule->fullscreenCB->setChecked (pdf.pagemode == pdf.pagemode_fullscreen); pdfSupportModule->optionsLE->setText( toqstr(pdf.quoted_options)); + + // Make sure that the bc is in the INITIAL state + if (bc().policy().buttonStatus(ButtonPolicy::RESTORE)) + bc().restore(); + + // clear changed branches cache + changedBranches_.clear(); } @@ -2299,17 +2589,18 @@ list const & GuiDocument::getModuleInfo() list const - GuiDocument::makeModuleInfo(list const & mods) + GuiDocument::makeModuleInfo(LayoutModuleList const & mods) { - list::const_iterator it = mods.begin(); - list::const_iterator end = mods.end(); + LayoutModuleList::const_iterator it = mods.begin(); + LayoutModuleList::const_iterator end = mods.end(); list mInfo; for (; it != end; ++it) { modInfoStruct m; m.id = *it; LyXModule * mod = moduleList[*it]; if (mod) - m.name = qt_(mod->getName()); + // FIXME Unicode + m.name = toqstr(translateIfPossible(from_utf8(mod->getName()))); else m.name = toqstr(*it) + toqstr(" (") + qt_("Not Found") + toqstr(")"); mInfo.push_back(m); @@ -2361,7 +2652,19 @@ void GuiDocument::dispatchParams() support::onlyPath(buffer().absFileName())); if (isLyXFilename(master_file.absFilename())) { Buffer * master = checkAndLoadLyXFile(master_file); - const_cast(buffer()).setParent(master); + if (master) { + if (master->isChild(const_cast(&buffer()))) + const_cast(buffer()).setParent(master); + else + Alert::warning(_("Assigned master does not include this file"), + bformat(_("You must include this file in the document\n" + "'%1$s' in order to use the master document\n" + "feature."), from_utf8(params().master))); + } else + Alert::warning(_("Could not load master"), + bformat(_("The master document '%1$s'\n" + "could not be loaded."), + from_utf8(params().master))); } } @@ -2383,6 +2686,25 @@ void GuiDocument::dispatchParams() dispatch(FuncRequest(LFUN_ALL_INSETS_TOGGLE, "assign branch")); } + // rename branches in the document + executeBranchRenaming(); + // and clear changed branches cache + changedBranches_.clear(); + + // Generate the colours requested by indices. + IndicesList & indiceslist = params().indiceslist(); + if (!indiceslist.empty()) { + IndicesList::const_iterator it = indiceslist.begin(); + IndicesList::const_iterator const end = indiceslist.end(); + for (; it != end; ++it) { + docstring const & current_index = it->shortcut(); + Index const * index = indiceslist.findShortcut(current_index); + string const x11hexname = X11hexname(index->color()); + // display the new color + docstring const str = current_index + ' ' + from_ascii(x11hexname); + dispatch(FuncRequest(LFUN_SET_COLOR, str)); + } + } // FIXME: If we used an LFUN, we would not need those two lines: BufferView * bv = const_cast(bufferview()); bv->processUpdateFlags(Update::Force | Update::FitCursor); @@ -2431,6 +2753,10 @@ bool GuiDocument::isFontAvailable(string const & font) const bool GuiDocument::providesOSF(string const & font) const { + if (outputModule->xetexCB->isChecked()) + // FIXME: we should check if the fonts really + // have OSF support. But how? + return true; if (font == "cmr") return isFontAvailable("eco"); if (font == "palatino") @@ -2441,6 +2767,8 @@ bool GuiDocument::providesOSF(string const & font) const bool GuiDocument::providesSC(string const & font) const { + if (outputModule->xetexCB->isChecked()) + return false; if (font == "palatino") return isFontAvailable("mathpazo"); if (font == "utopia") @@ -2451,6 +2779,8 @@ bool GuiDocument::providesSC(string const & font) const bool GuiDocument::providesScale(string const & font) const { + if (outputModule->xetexCB->isChecked()) + return true; return font == "helvet" || font == "luximono" || font == "berasans" || font == "beramono"; } @@ -2464,9 +2794,12 @@ void GuiDocument::loadModuleInfo() for (; it != end; ++it) { modInfoStruct m; m.id = it->getID(); - m.name = qt_(it->getName()); + // FIXME Unicode + m.name = toqstr(translateIfPossible(from_utf8(it->getName()))); // this is supposed to give us the first sentence of the description - QString desc = qt_(it->getDescription()); + // FIXME Unicode + QString desc = + toqstr(translateIfPossible(from_utf8(it->getDescription()))); int const pos = desc.indexOf("."); if (pos > 0) desc.truncate(pos + 1); @@ -2476,10 +2809,49 @@ void GuiDocument::loadModuleInfo() } +void GuiDocument::updateUnknownBranches() +{ + list used_branches; + buffer().getUsedBranches(used_branches); + list::const_iterator it = used_branches.begin(); + QStringList unknown_branches; + for (; it != used_branches.end() ; ++it) { + if (!buffer().params().branchlist().find(*it)) + unknown_branches.append(toqstr(*it)); + } + branchesModule->setUnknownBranches(unknown_branches); +} + + +void GuiDocument::branchesRename(docstring const & oldname, docstring const & newname) +{ + map::iterator it = changedBranches_.begin(); + for (; it != changedBranches_.end() ; ++it) { + if (it->second == oldname) { + // branch has already been renamed + it->second = newname; + return; + } + } + // store new name + changedBranches_[oldname] = newname; +} + + +void GuiDocument::executeBranchRenaming() const +{ + map::const_iterator it = changedBranches_.begin(); + for (; it != changedBranches_.end() ; ++it) { + docstring const arg = '"' + it->first + '"' + " " + '"' + it->second + '"'; + dispatch(FuncRequest(LFUN_BRANCHES_RENAME, arg)); + } +} + + Dialog * createGuiDocument(GuiView & lv) { return new GuiDocument(lv); } } // namespace frontend } // namespace lyx -#include "GuiDocument_moc.cpp" +#include "moc_GuiDocument.cpp"