]> git.lyx.org Git - features.git/commitdiff
Fix Bug 4053: Update other controls allows invalid listings parameters to be passed...
authorBo Peng <bpeng@lyx.org>
Fri, 27 Jul 2007 18:17:00 +0000 (18:17 +0000)
committerBo Peng <bpeng@lyx.org>
Fri, 27 Jul 2007 18:17:00 +0000 (18:17 +0000)
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@19224 a592a061-630c-0410-9148-cb99ea01b6c8

src/Text3.cpp
src/frontends/qt4/QDocument.cpp
src/frontends/qt4/QDocument.h
src/frontends/qt4/QInclude.cpp
src/frontends/qt4/QInclude.h
src/frontends/qt4/QListings.cpp
src/frontends/qt4/QListings.h
src/insets/InsetTabular.cpp

index 5a84381b49ce296f80b0f7dc1909292c90e0b366..18e915f6af19f66aa87d8cc943d76fd58d17ab69 100644 (file)
@@ -1586,6 +1586,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
        }
 
        needsUpdate |= (cur.pos() != cur.lastpos()) && cur.selection();
+       theSelection().haveSelection(bv->cursor().selection());
 
        // FIXME: The cursor flag is reset two lines below
        // so we need to check here if some of the LFUN did touch that.
index ca514aab139ba11007a84999839460345297acb9..baa3fad82eaf6dc6d7ef83239cf937c6c1172788 100644 (file)
@@ -225,9 +225,9 @@ QDocumentDialog::QDocumentDialog(QDocument * form)
        connect(textLayoutModule->bypassCB, SIGNAL(clicked()), 
                this, SLOT(change_adaptor()));
        connect(textLayoutModule->bypassCB, SIGNAL(clicked()), 
-               this, SLOT(validate_listings_params()));
+               this, SLOT(set_listings_msg()));
        connect(textLayoutModule->listingsED, SIGNAL(textChanged()),
-               this, SLOT(validate_listings_params()));
+               this, SLOT(set_listings_msg()));
        textLayoutModule->listingsTB->setPlainText(
                qt_("Input listings parameters on the right. Enter ? for a list of parameters."));
        textLayoutModule->lspacingLE->setValidator(new QDoubleValidator(
@@ -623,13 +623,29 @@ void QDocumentDialog::change_adaptor()
 }
 
 
-void QDocumentDialog::validate_listings_params()
+docstring QDocumentDialog::validate_listings_params()
+{
+       // use a cache here to avoid repeated validation
+       // of the same parameters
+       static string param_cache = string();
+       static docstring msg_cache = docstring();
+       
+       if (textLayoutModule->bypassCB->isChecked())
+               return docstring();
+
+       string params = fromqstr(textLayoutModule->listingsED->toPlainText());
+       if (params != param_cache) {
+               param_cache = params;
+               msg_cache = InsetListingsParams(params).validate();
+       }
+       return msg_cache;
+}
+
+
+void QDocumentDialog::set_listings_msg()
 {
        static bool isOK = true;
-       InsetListingsParams par(fromqstr(textLayoutModule->listingsED->toPlainText()));
-       docstring msg;
-       if (!textLayoutModule->bypassCB->isChecked())
-               msg = par.validate();
+       docstring msg = validate_listings_params();
        if (msg.empty()) {
                if (isOK)
                        return;
@@ -637,14 +653,10 @@ void QDocumentDialog::validate_listings_params()
                // listingsTB->setTextColor("black");
                textLayoutModule->listingsTB->setPlainText(
                        qt_("Input listings parameters on the right. Enter ? for a list of parameters."));
-               okPB->setEnabled(true);
-               applyPB->setEnabled(true);
        } else {
                isOK = false;
                // listingsTB->setTextColor("red");
                textLayoutModule->listingsTB->setPlainText(toqstr(msg));
-               okPB->setEnabled(false);
-               applyPB->setEnabled(false);
        }
 }
 
@@ -1449,6 +1461,13 @@ void QDocument::useClassDefaults()
        update_contents();
 }
 
+
+bool QDocument::isValid()
+{
+       return dialog_->validate_listings_params().empty();
+}
+
+
 } // namespace frontend
 } // namespace lyx
 
index 58a1754bc59e5a7515c8630fcf72d92faa9b0f28..113c57c0b6ae69016fbb885b891541186df2b32c 100644 (file)
@@ -68,11 +68,13 @@ public:
        void updatePagestyle(std::string const &, std::string const &);
 
        void showPreamble();
+       /// validate listings parameters and return an error message, if any
+       docstring validate_listings_params();
 
 public Q_SLOTS:
        void updateNumbering();
        void change_adaptor();
-       void validate_listings_params();
+       void set_listings_msg();
        void saveDefaultClicked();
        void useDefaultsClicked();
 
@@ -141,6 +143,9 @@ private:
        void saveDocDefault();
        /// reset to default params
        void useClassDefaults();
+protected:
+       /// return false if validate_listings_params returns error
+       virtual bool isValid();
 };
 
 
index c4f650f4b6fbc1aca3e732fd475b86ed024ed22d..9908edd3442930fa26460a0753461d88a3858342 100644 (file)
@@ -64,9 +64,9 @@ QIncludeDialog::QIncludeDialog(QInclude * form)
        connect(captionLE, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
        connect(labelLE, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
        connect(listingsED, SIGNAL(textChanged()), this, SLOT(change_adaptor()));
-       connect(listingsED, SIGNAL(textChanged()), this, SLOT(validate_listings_params()));
+       connect(listingsED, SIGNAL(textChanged()), this, SLOT(set_listings_msg()));
        connect(bypassCB, SIGNAL(clicked()), this, SLOT(change_adaptor()));
-       connect(bypassCB, SIGNAL(clicked()), this, SLOT(validate_listings_params()));
+       connect(bypassCB, SIGNAL(clicked()), this, SLOT(set_listings_msg()));
 
        setFocusProxy(filenameED);
 }
@@ -84,24 +84,38 @@ void QIncludeDialog::change_adaptor()
 }
 
 
-void QIncludeDialog::validate_listings_params()
+docstring QIncludeDialog::validate_listings_params()
+{
+       // use a cache here to avoid repeated validation
+       // of the same parameters
+       static string param_cache = string();
+       static docstring msg_cache = docstring();
+       
+       if (typeCO->currentIndex() != 3 || bypassCB->isChecked())
+               return docstring();
+
+       string params = fromqstr(listingsED->toPlainText());
+       if (params != param_cache) {
+               param_cache = params;
+               msg_cache = InsetListingsParams(params).validate();
+       }
+       return msg_cache;
+}
+
+
+void QIncludeDialog::set_listings_msg()
 {
        static bool isOK = true;
-       InsetListingsParams par(fromqstr(listingsED->toPlainText()));
-       docstring msg;
-       if (!bypassCB->isChecked())
-               msg = par.validate();
+       docstring msg = validate_listings_params();
        if (msg.empty()) {
                if (isOK)
                        return;
                isOK = true;
                listingsTB->setPlainText(
                        qt_("Input listing parameters on the right. Enter ? for a list of parameters."));
-               okPB->setEnabled(true);
        } else {
                isOK = false;
                listingsTB->setPlainText(toqstr(msg));
-               okPB->setEnabled(false);
        }
 }
 
@@ -334,7 +348,8 @@ void QInclude::load()
 
 bool QInclude::isValid()
 {
-       return !dialog_->filenameED->text().isEmpty();
+       return !dialog_->filenameED->text().isEmpty() &&
+               dialog_->validate_listings_params().empty();
 }
 
 } // namespace frontend
index bc7244058d12e11b4a4a24501e6f95ee502cbb86..6d4a3ba09f6707c0162fe6fbbfa492a6849b1e59 100644 (file)
@@ -31,12 +31,18 @@ public:
        void updateLists();
 
        virtual void show();
+       /// validate listings parameters and return an error message, if any
+       docstring validate_listings_params();
 protected Q_SLOTS:
        virtual void change_adaptor();
-       void validate_listings_params();
        virtual void loadClicked();
        virtual void browseClicked();
        virtual void typeChanged(int v);
+       /// AFAIK, QValidator only works for QLineEdit so
+       /// I have to validate listingsED (QTextEdit) manually.
+       /// This function displays a hint or error message returned by
+       /// validate_listings_params
+       void set_listings_msg();
 protected:
        virtual void closeEvent(QCloseEvent * e);
 private:
index 67be99fb588c9d923c1f9518a167ad76164c40d6..373eba9e37bab0f3f7c5e0ffdf730d7e56cff87f 100644 (file)
@@ -190,9 +190,9 @@ QListingsDialog::QListingsDialog(QListings * form)
        connect(extendedcharsCB, SIGNAL(clicked()), this, SLOT(change_adaptor()));
 
        connect(listingsED,  SIGNAL(textChanged()), this, SLOT(change_adaptor()));
-       connect(listingsED,  SIGNAL(textChanged()), this, SLOT(validate_listings_params()));
+       connect(listingsED,  SIGNAL(textChanged()), this, SLOT(set_listings_msg()));
        connect(bypassCB, SIGNAL(clicked()), this, SLOT(change_adaptor()));
-       connect(bypassCB, SIGNAL(clicked()), this, SLOT(validate_listings_params()));
+       connect(bypassCB, SIGNAL(clicked()), this, SLOT(set_listings_msg()));
 
        for (int n = 0; languages[n][0]; ++n)
                languageCO->addItem(qt_(languages_gui[n]));
@@ -319,26 +319,38 @@ string QListingsDialog::construct_params()
 }
 
 
-void QListingsDialog::validate_listings_params()
+docstring QListingsDialog::validate_listings_params()
+{
+       // use a cache here to avoid repeated validation
+       // of the same parameters
+       static string param_cache = string();
+       static docstring msg_cache = docstring();
+       
+       if (bypassCB->isChecked())
+               return docstring();
+
+       string params = construct_params();
+       if (params != param_cache) {
+               param_cache = params;
+               msg_cache = InsetListingsParams(params).validate();
+       }
+       return msg_cache;
+}
+
+
+void QListingsDialog::set_listings_msg()
 {
        static bool isOK = true;
-       InsetListingsParams par(construct_params());
-       docstring msg;
-       if (!bypassCB->isChecked())
-               msg = par.validate();
+       docstring msg = validate_listings_params();
        if (msg.empty()) {
                if (isOK)
                        return;
                isOK = true;
                listingsTB->setPlainText(
                        qt_("Input listing parameters on the right. Enter ? for a list of parameters."));
-               okPB->setEnabled(true);
-               applyPB->setEnabled(true);
        } else {
                isOK = false;
                listingsTB->setPlainText(toqstr(msg));
-               okPB->setEnabled(false);
-               applyPB->setEnabled(false);
        }
 }
 
@@ -601,6 +613,12 @@ void QListings::update_contents()
 }
 
 
+bool QListings::isValid()
+{
+       return dialog_->validate_listings_params().empty();
+}
+
+
 } // namespace frontend
 } // namespace lyx
 
index 134df30636eb153a02293b288339c7dc4fc4b36d..730efccc42d5d033790bc14271e5ee93c0dbf751 100644 (file)
@@ -29,11 +29,15 @@ public:
        QListingsDialog(QListings * form);
        /// get values from all the widgets and form a string
        std::string construct_params();
+       /// validate listings parameters and return an error message, if any
+       docstring validate_listings_params();
 protected Q_SLOTS:
        virtual void change_adaptor();
        /// AFAIK, QValidator only works for QLineEdit so
        /// I have to validate listingsED (QTextEdit) manually.
-       void validate_listings_params();
+       /// This function displays a hint or error message returned by
+       /// validate_listings_params
+       void set_listings_msg();
        /// turn off inline when float is clicked
        void on_floatCB_stateChanged(int state);
        /// turn off float when inline is clicked
@@ -63,6 +67,9 @@ private:
        virtual void update_contents();
        /// build the dialog
        virtual void build_dialog();
+protected:
+       /// return false if validate_listings_params returns error
+       virtual bool isValid();
 };
 
 } // namespace frontend
index d2545eea34a945704166b812431054cfb8117193..3cc40d46bddafb0bf890d318e715b3f020c51c50 100644 (file)
@@ -3490,6 +3490,7 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd)
                cell(cur.idx())->dispatch(cur, cmd);
                break;
        }
+       theSelection().haveSelection(bvcur.selection());
 }