]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/GuiDocument.cpp
Move the default module loading from makeDocumentClass() to setBaseClass().
[lyx.git] / src / frontends / qt4 / GuiDocument.cpp
index 0e42f8f720690ecbef9a74a2a1b366bfd6447c67..c5be6ef4e5fdf3516114001065517c80627f9096 100644 (file)
 
 #include "GuiDocument.h"
 
+#include "GuiApplication.h"
+#include "GuiBranches.h"
+#include "LaTeXHighlighter.h"
+#include "LengthCombo.h"
+#include "PanelStack.h"
+#include "Validator.h"
+
 #include "LayoutFile.h"
 #include "BranchList.h"
 #include "buffer_funcs.h"
 #include "Encoding.h"
 #include "FloatPlacement.h"
 #include "FuncRequest.h"
-#include "support/gettext.h"
-#include "GuiBranches.h"
 #include "Language.h"
 #include "LaTeXFeatures.h"
-#include "LaTeXHighlighter.h"
 #include "Layout.h"
-#include "LengthCombo.h"
 #include "LyXRC.h" // defaultUnit
 #include "ModuleList.h"
 #include "OutputParams.h"
-#include "PanelStack.h"
 #include "PDFOptions.h"
 #include "qt_helpers.h"
 #include "Spacing.h"
-#include "Validator.h"
 
 #include "insets/InsetListingsParams.h"
 
 #include "support/debug.h"
 #include "support/FileName.h"
 #include "support/filetools.h"
+#include "support/gettext.h"
 #include "support/lstrings.h"
 
 #include "frontends/alert.h"
 
+#include <QAbstractItemModel>
 #include <QCloseEvent>
 #include <QScrollBar>
 #include <QTextCursor>
@@ -506,14 +509,10 @@ void PreambleModule::closeEvent(QCloseEvent * e)
 
 
 GuiDocument::GuiDocument(GuiView & lv)
-       : GuiDialog(lv, "document", qt_("Document Settings")), current_id_(0)
+       : GuiDialog(lv, "document", qt_("Document Settings"))
 {
        setupUi(this);
 
-       QList<LanguagePair> langs = languageData(false);        
-       for (int i = 0; i != langs.size(); ++i)
-               lang_.append(langs[i].second);
-
        connect(okPB, SIGNAL(clicked()), this, SLOT(slotOK()));
        connect(applyPB, SIGNAL(clicked()), this, SLOT(slotApply()));
        connect(closePB, SIGNAL(clicked()), this, SLOT(slotClose()));
@@ -606,6 +605,8 @@ GuiDocument::GuiDocument(GuiView & lv)
                this, SLOT(change_adaptor()));
        connect(fontModule->fontsizeCO, SIGNAL(activated(int)),
                this, SLOT(change_adaptor()));
+       connect(fontModule->cjkFontLE, SIGNAL(textChanged(const QString &)),
+               this, SLOT(change_adaptor()));
        connect(fontModule->scaleSansSB, SIGNAL(valueChanged(int)),
                this, SLOT(change_adaptor()));
        connect(fontModule->scaleTypewriterSB, SIGNAL(valueChanged(int)),
@@ -789,19 +790,20 @@ GuiDocument::GuiDocument(GuiView & lv)
        connect(langModule->quoteStyleCO, SIGNAL(activated(int)),
                this, SLOT(change_adaptor()));
        // language & quotes
-
-       QList<LanguagePair>::const_iterator lit  = langs.begin();
-       QList<LanguagePair>::const_iterator lend = langs.end();
-       for (; lit != lend; ++lit)
-               langModule->languageCO->addItem(lit->first);
+       QAbstractItemModel * language_model = guiApp->languageModel();
+       // FIXME: it would be nice if sorting was enabled/disabled via a checkbox.
+       language_model->sort(0);
+       langModule->languageCO->setModel(language_model);
 
        // Always put the default encoding in the first position.
-       // It is special because the displayed text is translated.
        langModule->encodingCO->addItem(qt_("LaTeX default"));
+       QStringList encodinglist;
        Encodings::const_iterator it = encodings.begin();
        Encodings::const_iterator const end = encodings.end();
        for (; it != end; ++it)
-               langModule->encodingCO->addItem(toqstr(it->latexName()));
+               encodinglist.append(qt_(it->guiName()));
+       encodinglist.sort();
+       langModule->encodingCO->addItems(encodinglist);
 
        langModule->quoteStyleCO->addItem(qt_("``text''"));
        langModule->quoteStyleCO->addItem(qt_("''text''"));
@@ -876,6 +878,8 @@ GuiDocument::GuiDocument(GuiView & lv)
                this, SLOT(change_adaptor()));
        connect(latexModule->layoutPB, SIGNAL(clicked()),
                this, SLOT(browseLayout()));
+       connect(latexModule->layoutPB, SIGNAL(clicked()),
+               this, SLOT(change_adaptor()));
        connect(latexModule->childDocGB, SIGNAL(clicked()),
                this, SLOT(change_adaptor()));
        connect(latexModule->childDocLE, SIGNAL(textChanged(const QString &)),
@@ -1239,13 +1243,22 @@ void GuiDocument::browseLayout()
        FileName layoutFile = support::makeAbsPath(fromqstr(file),
                fromqstr(bufferFilepath()));
        
+       int const ret = Alert::prompt(_("Local layout file"),
+               _("The layout file you have selected is a local layout\n"
+                 "file, not one in the system or user directory. Your\n"
+                 "document may not work with this layout if you do not\n"
+                 "keep the layout file in the document directory."),
+                 1, 1, _("&Set Layout"), _("&Cancel"));
+       if (ret == 1)
+               return;
+
        // load the layout file
        LayoutFileList & bcl = LayoutFileList::get();
        string classname = layoutFile.onlyFileName();
-       LayoutFileIndex name = bcl.addLayoutFile(
+       // this will update an existing layout if that layout has been loaded before.
+       LayoutFileIndex name = bcl.addLocalLayout(
                classname.substr(0, classname.size() - 7),
-               layoutFile.onlyPath().absFilename(),
-               LayoutFileList::Local);
+               layoutFile.onlyPath().absFilename());
 
        if (name.empty()) {
                Alert::error(_("Error"),
@@ -1264,6 +1277,7 @@ void GuiDocument::browseLayout()
                latexModule->classCO->setCurrentIndex(0);
        } else
                latexModule->classCO->setCurrentIndex(idx);
+       
        classChanged();
 }
 
@@ -1288,20 +1302,7 @@ void GuiDocument::classChanged()
        if (idx < 0) 
                return;
        string const classname = classes_model_.getIDString(idx);
-       // check if this is a local layout file
-       if (prefixIs(classname, LayoutFileList::localPrefix)) {
-               int const ret = Alert::prompt(_("Local layout file"),
-                               _("The layout file you have selected is a local layout\n"
-                                 "file, not one in the system or user directory. Your\n"
-                                 "document may not work with this layout if you do not\n"
-                                 "keep the layout file in the same directory."),
-                                 1, 1, _("&Set Layout"), _("&Cancel"));
-               if (ret == 1) {
-                       // try to reset the layout combo
-                       setLayoutComboByIDString(bp_.baseClassID());
-                       return;
-               }
-       }
+
        // FIXME Note that by doing things this way, we load the TextClass
        // as soon as it is selected. So, if you use the scroll wheel when
        // sitting on the combo box, we'll load a lot of TextClass objects
@@ -1320,8 +1321,13 @@ void GuiDocument::classChanged()
                                applyView();
                }
                bp_.useClassDefaults();
-               forceUpdate();
+               paramsToDialog(bp_);
        }
+       // FIXME There's a little bug here connected with auto_reset, namely,
+       // that, if the preceding is skipped and the user has changed the
+       // modules before changing the class, those changes will be lost on
+       // update. But maybe that's what we want?
+       updateSelectedModules();
 }
 
 
@@ -1482,9 +1488,25 @@ void GuiDocument::apply(BufferParams & params)
                int i = langModule->encodingCO->currentIndex();
                if (i == 0)
                        params.inputenc = "default";
-               else
-                       params.inputenc =
-                               fromqstr(langModule->encodingCO->currentText());
+               else {
+                       QString const enc_gui =
+                               langModule->encodingCO->currentText();
+                       Encodings::const_iterator it = encodings.begin();
+                       Encodings::const_iterator const end = encodings.end();
+                       bool found = false;
+                       for (; it != end; ++it) {
+                               if (qt_(it->guiName()) == enc_gui) {
+                                       params.inputenc = it->latexName();
+                                       found = true;
+                                       break;
+                               }
+                       }
+                       if (!found) {
+                               // should not happen
+                               lyxerr << "GuiDocument::apply: Unknown encoding! Resetting to default" << endl;
+                               params.inputenc = "default";
+                       }
+               }
        }
 
        InsetQuotes::QuoteLanguage lga = InsetQuotes::EnglishQuotes;
@@ -1510,8 +1532,9 @@ void GuiDocument::apply(BufferParams & params)
        }
        params.quotes_language = lga;
 
-       int const pos = langModule->languageCO->currentIndex();
-       params.language = lyx::languages.getLanguage(fromqstr(lang_[pos]));
+       QString const lang = langModule->languageCO->itemData(
+               langModule->languageCO->currentIndex()).toString();
+       params.language = lyx::languages.getLanguage(fromqstr(lang));
 
        // numbering
        if (params.documentClass().hasTocLevels()) {
@@ -1648,6 +1671,9 @@ void GuiDocument::apply(BufferParams & params)
        params.fontsTypewriter =
                tex_fonts_monospaced[fontModule->fontsTypewriterCO->currentIndex()];
 
+       params.fontsCJK =
+               fromqstr(fontModule->cjkFontLE->text());
+
        params.fontsSansScale = fontModule->scaleSansSB->value();
 
        params.fontsTypewriterScale = fontModule->scaleTypewriterSB->value();
@@ -1734,22 +1760,7 @@ void GuiDocument::apply(BufferParams & params)
 }
 
 
-static int findPos(QStringList const & vec, QString const & val)
-{
-       for (int i = 0; i != vec.size(); ++i)
-               if (vec[i] == val)
-                       return i;
-       return 0;
-}
-
-
-void GuiDocument::updateParams()
-{
-       updateParams(bp_);
-}
-
-
-void GuiDocument::updateParams(BufferParams const & params)
+void GuiDocument::paramsToDialog(BufferParams const & params)
 {
        // set the default unit
        Length::UNIT defaultUnit = Length::CM;
@@ -1795,7 +1806,8 @@ void GuiDocument::updateParams(BufferParams const & params)
                params.use_bibtopic);
 
        // language & quotes
-       int const pos = findPos(lang_, toqstr(params.language->lang()));
+       int const pos = langModule->languageCO->findData(toqstr(
+               params.language->lang()));
        langModule->languageCO->setCurrentIndex(pos);
 
        langModule->quoteStyleCO->setCurrentIndex(
@@ -1807,8 +1819,17 @@ void GuiDocument::updateParams(BufferParams const & params)
                if (params.inputenc == "default") {
                        langModule->encodingCO->setCurrentIndex(0);
                } else {
+                       string enc_gui;
+                       Encodings::const_iterator it = encodings.begin();
+                       Encodings::const_iterator const end = encodings.end();
+                       for (; it != end; ++it) {
+                               if (it->latexName() == params.inputenc) {
+                                       enc_gui = it->guiName();
+                                       break;
+                               }
+                       }
                        int const i = langModule->encodingCO->findText(
-                                       toqstr(params.inputenc));
+                                       qt_(enc_gui));
                        if (i >= 0)
                                langModule->encodingCO->setCurrentIndex(i);
                        else
@@ -1960,6 +1981,12 @@ void GuiDocument::updateParams(BufferParams const & params)
                ttChanged(n);
        }
 
+       if (!params.fontsCJK.empty())
+               fontModule->cjkFontLE->setText(
+                       toqstr(params.fontsCJK));
+       else
+               fontModule->cjkFontLE->setText(QString());
+
        fontModule->fontScCB->setChecked(params.fontsSC);
        fontModule->fontOsfCB->setChecked(params.fontsOSF);
        fontModule->scaleSansSB->setValue(params.fontsSansScale);
@@ -2090,26 +2117,8 @@ void GuiDocument::updateSelectedModules()
 
 void GuiDocument::updateContents()
 {
-       if (id() == current_id_)
-               return;
-
-       updateAvailableModules();
-       updateSelectedModules();
-       
-       //FIXME It'd be nice to make sure here that the selected
-       //modules are consistent: That required modules are actually
-       //selected, and that we don't have conflicts. If so, we could
-       //at least pop up a warning.
-       updateParams(bp_);
-       current_id_ = id();
-}
-
-
-void GuiDocument::forceUpdate()
-{
-       // reset to force dialog update
-       current_id_ = 0;
-       updateContents();
+       // Nothing to do here as the document settings is not cursor dependant.
+       return;
 }
 
 
@@ -2131,7 +2140,7 @@ void GuiDocument::useClassDefaults()
                return;
        }
        bp_.useClassDefaults();
-       forceUpdate();
+       paramsToDialog(bp_);
 }
 
 
@@ -2166,10 +2175,21 @@ char const * GuiDocument::fontfamilies_gui[5] = {
 
 bool GuiDocument::initialiseParams(string const &)
 {
-       bp_ = buffer().params();
-       // Force update on next updateContent() round.
-       current_id_ = 0;
+       BufferView * view = bufferview();
+       if (!view) {
+               bp_ = BufferParams();
+               paramsToDialog(bp_);
+               return true;
+       }
+       bp_ = view->buffer().params();
        loadModuleInfo();
+       updateAvailableModules();
+       updateSelectedModules();
+       //FIXME It'd be nice to make sure here that the selected
+       //modules are consistent: That required modules are actually
+       //selected, and that we don't have conflicts. If so, we could
+       //at least pop up a warning.
+       paramsToDialog(bp_);
        return true;
 }
 
@@ -2182,7 +2202,8 @@ void GuiDocument::clearParams()
 
 BufferId GuiDocument::id() const
 {
-       return &buffer();
+       BufferView const * const view = bufferview();
+       return view? &view->buffer() : 0;
 }