diff --git a/src/Text3.cpp b/src/Text3.cpp index 5a84381b49..18e915f6af 100644 --- a/src/Text3.cpp +++ b/src/Text3.cpp @@ -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. diff --git a/src/frontends/qt4/QDocument.cpp b/src/frontends/qt4/QDocument.cpp index ca514aab13..baa3fad82e 100644 --- a/src/frontends/qt4/QDocument.cpp +++ b/src/frontends/qt4/QDocument.cpp @@ -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 diff --git a/src/frontends/qt4/QDocument.h b/src/frontends/qt4/QDocument.h index 58a1754bc5..113c57c0b6 100644 --- a/src/frontends/qt4/QDocument.h +++ b/src/frontends/qt4/QDocument.h @@ -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(); }; diff --git a/src/frontends/qt4/QInclude.cpp b/src/frontends/qt4/QInclude.cpp index c4f650f4b6..9908edd344 100644 --- a/src/frontends/qt4/QInclude.cpp +++ b/src/frontends/qt4/QInclude.cpp @@ -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 diff --git a/src/frontends/qt4/QInclude.h b/src/frontends/qt4/QInclude.h index bc7244058d..6d4a3ba09f 100644 --- a/src/frontends/qt4/QInclude.h +++ b/src/frontends/qt4/QInclude.h @@ -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: diff --git a/src/frontends/qt4/QListings.cpp b/src/frontends/qt4/QListings.cpp index 67be99fb58..373eba9e37 100644 --- a/src/frontends/qt4/QListings.cpp +++ b/src/frontends/qt4/QListings.cpp @@ -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 diff --git a/src/frontends/qt4/QListings.h b/src/frontends/qt4/QListings.h index 134df30636..730efccc42 100644 --- a/src/frontends/qt4/QListings.h +++ b/src/frontends/qt4/QListings.h @@ -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 diff --git a/src/insets/InsetTabular.cpp b/src/insets/InsetTabular.cpp index d2545eea34..3cc40d46bd 100644 --- a/src/insets/InsetTabular.cpp +++ b/src/insets/InsetTabular.cpp @@ -3490,6 +3490,7 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd) cell(cur.idx())->dispatch(cur, cmd); break; } + theSelection().haveSelection(bvcur.selection()); }