Fix Bug 4053: Update other controls allows invalid listings parameters to be passed in listings-related dialogs.

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@19224 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Bo Peng 2007-07-27 18:17:00 +00:00
parent 09e05ccf85
commit 3ac3578e2d
8 changed files with 107 additions and 35 deletions

View 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.

View 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

View 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();
};

View 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

View 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:

View 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

View 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

View File

@ -3490,6 +3490,7 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd)
cell(cur.idx())->dispatch(cur, cmd);
break;
}
theSelection().haveSelection(bvcur.selection());
}