]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/GuiDocument.cpp
cosmetics
[lyx.git] / src / frontends / qt4 / GuiDocument.cpp
index 233fa65938e55f6901f184568bea22fddf3ceebc..4fc4c75c315e109aa6558e49e8307bfcc9e8df06 100644 (file)
@@ -50,9 +50,9 @@
 
 #include "frontends/alert.h"
 
+#include <QAbstractItemModel>
 #include <QCloseEvent>
 #include <QScrollBar>
-#include <QStandardItemModel.h>
 #include <QTextCursor>
 
 #include <sstream>
@@ -474,7 +474,7 @@ void PreambleModule::update(BufferParams const & params, BufferId id)
        Coords::const_iterator it = preamble_coords_.find(current_id_);
        if (it == preamble_coords_.end())
                // First time we open this one.
-               preamble_coords_[current_id_] = make_pair(0,0);
+               preamble_coords_[current_id_] = make_pair(0, 0);
        else {
                // Restore saved coords.
                QTextCursor cur = preambleTE->textCursor();
@@ -509,7 +509,7 @@ 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);
 
@@ -559,9 +559,9 @@ GuiDocument::GuiDocument(GuiView & lv)
        connect(textLayoutModule->bypassCB, SIGNAL(clicked()), 
                this, SLOT(change_adaptor()));
        connect(textLayoutModule->bypassCB, SIGNAL(clicked()), 
-               this, SLOT(set_listings_msg()));
+               this, SLOT(setListingsMessage()));
        connect(textLayoutModule->listingsED, SIGNAL(textChanged()),
-               this, SLOT(set_listings_msg()));
+               this, SLOT(setListingsMessage()));
        textLayoutModule->listingsTB->setPlainText(
                qt_("Input listings parameters on the right. Enter ? for a list of parameters."));
        textLayoutModule->lspacingLE->setValidator(new QDoubleValidator(
@@ -605,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)),
@@ -788,15 +790,20 @@ GuiDocument::GuiDocument(GuiView & lv)
        connect(langModule->quoteStyleCO, SIGNAL(activated(int)),
                this, SLOT(change_adaptor()));
        // language & quotes
-       langModule->languageCO->setModel(guiApp->languageModel());
+       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"));
+       langModule->encodingCO->addItem(qt_("Language Default (no inputenc)"));
+       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''"));
@@ -871,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 &)),
@@ -1014,40 +1023,41 @@ void GuiDocument::change_adaptor()
 }
 
 
-docstring GuiDocument::validate_listings_params()
+QString GuiDocument::validateListingsParameters()
 {
        // use a cache here to avoid repeated validation
        // of the same parameters
-       static string param_cache = string();
-       static docstring msg_cache = docstring();
+       static string param_cache;
+       static QString msg_cache;
        
        if (textLayoutModule->bypassCB->isChecked())
-               return docstring();
+               return QString();
 
        string params = fromqstr(textLayoutModule->listingsED->toPlainText());
        if (params != param_cache) {
                param_cache = params;
-               msg_cache = InsetListingsParams(params).validate();
+               msg_cache = toqstr(InsetListingsParams(params).validate());
        }
        return msg_cache;
 }
 
 
-void GuiDocument::set_listings_msg()
+void GuiDocument::setListingsMessage()
 {
        static bool isOK = true;
-       docstring msg = validate_listings_params();
-       if (msg.empty()) {
+       QString msg = validateListingsParameters();
+       if (msg.isEmpty()) {
                if (isOK)
                        return;
                isOK = true;
                // listingsTB->setTextColor("black");
                textLayoutModule->listingsTB->setPlainText(
-                       qt_("Input listings parameters on the right. Enter ? for a list of parameters."));
+                       qt_("Input listings parameters on the right. "
+                "Enter ? for a list of parameters."));
        } else {
                isOK = false;
                // listingsTB->setTextColor("red");
-               textLayoutModule->listingsTB->setPlainText(toqstr(msg));
+               textLayoutModule->listingsTB->setPlainText(msg);
        }
 }
 
@@ -1234,13 +1244,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"),
@@ -1259,6 +1278,7 @@ void GuiDocument::browseLayout()
                latexModule->classCO->setCurrentIndex(0);
        } else
                latexModule->classCO->setCurrentIndex(idx);
+       
        classChanged();
 }
 
@@ -1283,20 +1303,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
@@ -1315,8 +1322,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();
 }
 
 
@@ -1477,9 +1489,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;
@@ -1516,10 +1544,10 @@ void GuiDocument::apply(BufferParams & params)
        }
 
        // bullets
-       params.user_defined_bullet(0) = bulletsModule->getBullet(0);
-       params.user_defined_bullet(1) = bulletsModule->getBullet(1);
-       params.user_defined_bullet(2) = bulletsModule->getBullet(2);
-       params.user_defined_bullet(3) = bulletsModule->getBullet(3);
+       params.user_defined_bullet(0) = bulletsModule->bullet(0);
+       params.user_defined_bullet(1) = bulletsModule->bullet(1);
+       params.user_defined_bullet(2) = bulletsModule->bullet(2);
+       params.user_defined_bullet(3) = bulletsModule->bullet(3);
 
        // packages
        params.graphicsDriver =
@@ -1538,6 +1566,27 @@ void GuiDocument::apply(BufferParams & params)
        vector<string> selModList;
        for (int i = 0; i < srows; ++i)
                params.addLayoutModule(modules_sel_model_.getIDString(i));
+       // update the list of removed modules
+       params.clearRemovedModules();
+       set<string> const & reqmods = params.baseClass()->defaultModules();
+       set<string>::const_iterator rit = reqmods.begin();
+       set<string>::const_iterator ren = reqmods.end();
+       // check each of the required modules
+       for (; rit != ren; rit++) {
+               vector<string>::const_iterator mit = params.getModules().begin();
+               vector<string>::const_iterator men = params.getModules().end();
+               bool found = false;
+               for (; mit != men; mit++) {
+                       if (*rit == *mit) {
+                               found = true;
+                               break;
+                       }
+               }
+               if (!found) {
+                       // the module isn't present so must have been removed by the user
+                       params.addRemovedModule(*rit);
+               }
+       }
 
        if (mathsModule->amsautoCB->isChecked()) {
                params.use_amsmath = BufferParams::package_auto;
@@ -1644,6 +1693,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();
@@ -1730,13 +1782,7 @@ void GuiDocument::apply(BufferParams & params)
 }
 
 
-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,8 +1841,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
@@ -1948,6 +2003,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);
@@ -2078,26 +2139,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;
 }
 
 
@@ -2119,7 +2162,7 @@ void GuiDocument::useClassDefaults()
                return;
        }
        bp_.useClassDefaults();
-       forceUpdate();
+       paramsToDialog(bp_);
 }
 
 
@@ -2136,7 +2179,7 @@ void GuiDocument::setLayoutComboByIDString(std::string const & idString)
 
 bool GuiDocument::isValid()
 {
-       return validate_listings_params().empty()
+       return validateListingsParameters().isEmpty()
                && (textLayoutModule->skipCO->currentIndex() != 3
                        || !textLayoutModule->skipLE->text().isEmpty());
 }
@@ -2154,10 +2197,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;
 }
 
@@ -2170,7 +2224,8 @@ void GuiDocument::clearParams()
 
 BufferId GuiDocument::id() const
 {
-       return &buffer();
+       BufferView const * const view = bufferview();
+       return view? &view->buffer() : 0;
 }