mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-22 10:00:33 +00:00
Fixes the following issues:
* updateView() should start a spell check only on first call after init * at the end of document the dialog should hide itself when user said "no" to continue spell check * when the last word of a note inset is misspelled forward() wrongly think it's the end of doc * when the user clicks the buttons fast, recursive calls are possible git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@38307 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
parent
e0baae5091
commit
c694f6cdf5
@ -59,8 +59,8 @@ namespace frontend {
|
||||
|
||||
struct SpellcheckerWidget::Private
|
||||
{
|
||||
Private(SpellcheckerWidget * parent)
|
||||
: p(parent) {}
|
||||
Private(SpellcheckerWidget * parent, DockView * dv)
|
||||
: p(parent), dv_(dv), start_(true), incheck_(false) {}
|
||||
/// update from controller
|
||||
void updateSuggestions(docstring_list & words);
|
||||
/// move to next position after current word
|
||||
@ -71,19 +71,33 @@ struct SpellcheckerWidget::Private
|
||||
bool continueFromBeginning();
|
||||
///
|
||||
void setLanguage(Language const * lang);
|
||||
/// test and set guard flag
|
||||
bool inCheck() {
|
||||
if (incheck_)
|
||||
return true;
|
||||
incheck_ = true;
|
||||
return false;
|
||||
}
|
||||
void canCheck() { incheck_ = false; }
|
||||
///
|
||||
Ui::SpellcheckerUi ui;
|
||||
///
|
||||
SpellcheckerWidget * p;
|
||||
///
|
||||
GuiView * gv_;
|
||||
///
|
||||
DockView * dv_;
|
||||
/// current word being checked and lang code
|
||||
WordLangTuple word_;
|
||||
///
|
||||
bool start_;
|
||||
///
|
||||
bool incheck_;
|
||||
};
|
||||
|
||||
|
||||
SpellcheckerWidget::SpellcheckerWidget(GuiView * gv, QWidget * parent)
|
||||
: QTabWidget(parent), d(new Private(this))
|
||||
SpellcheckerWidget::SpellcheckerWidget(GuiView * gv, DockView * dv, QWidget * parent)
|
||||
: QTabWidget(parent), d(new Private(this, dv))
|
||||
{
|
||||
d->ui.setupUi(this);
|
||||
d->gv_ = gv;
|
||||
@ -161,7 +175,8 @@ void SpellcheckerWidget::updateView()
|
||||
{
|
||||
BufferView * bv = d->gv_->documentBufferView();
|
||||
setEnabled(bv != 0);
|
||||
if (bv && hasFocus()) {
|
||||
if (bv && hasFocus() && d->start_) {
|
||||
d->start_ = false;
|
||||
|
||||
BufferView * bv = d->gv_->documentBufferView();
|
||||
std::set<Language const *> languages =
|
||||
@ -181,8 +196,10 @@ bool SpellcheckerWidget::Private::continueFromBeginning()
|
||||
qt_("We reached the end of the document, would you like to "
|
||||
"continue from the beginning?"),
|
||||
QMessageBox::Yes | QMessageBox::No, QMessageBox::No);
|
||||
if (answer == QMessageBox::No)
|
||||
if (answer == QMessageBox::No) {
|
||||
dv_->hide();
|
||||
return false;
|
||||
}
|
||||
dispatch(FuncRequest(LFUN_BUFFER_BEGIN));
|
||||
return true;
|
||||
}
|
||||
@ -195,7 +212,7 @@ void SpellcheckerWidget::Private::forward()
|
||||
|
||||
dispatch(FuncRequest(LFUN_ESCAPE));
|
||||
dispatch(FuncRequest(LFUN_CHAR_FORWARD));
|
||||
if (bv->cursor().atLastPos()) {
|
||||
if (bv->cursor().depth() <= 1 && bv->cursor().atLastPos()) {
|
||||
continueFromBeginning();
|
||||
return;
|
||||
}
|
||||
@ -218,64 +235,96 @@ void SpellcheckerWidget::on_languageCO_activated(int index)
|
||||
}
|
||||
|
||||
|
||||
bool SpellcheckerWidget::initialiseParams(std::string const &)
|
||||
{
|
||||
d->start_ = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void SpellcheckerWidget::on_ignoreAllPB_clicked()
|
||||
{
|
||||
/// replace all occurrences of word
|
||||
/// ignore all occurrences of word
|
||||
if (d->inCheck())
|
||||
return;
|
||||
LYXERR(Debug::GUI, "Spellchecker: ignore all button");
|
||||
if (d->word_.lang() && !d->word_.word().empty())
|
||||
theSpellChecker()->accept(d->word_);
|
||||
d->forward();
|
||||
d->check();
|
||||
d->canCheck();
|
||||
}
|
||||
|
||||
|
||||
void SpellcheckerWidget::on_addPB_clicked()
|
||||
{
|
||||
/// insert word in personal dictionary
|
||||
if (d->inCheck())
|
||||
return;
|
||||
LYXERR(Debug::GUI, "Spellchecker: add word button");
|
||||
theSpellChecker()->insert(d->word_);
|
||||
d->forward();
|
||||
d->check();
|
||||
d->canCheck();
|
||||
}
|
||||
|
||||
|
||||
void SpellcheckerWidget::on_ignorePB_clicked()
|
||||
{
|
||||
/// ignore this occurrence of word
|
||||
if (d->inCheck())
|
||||
return;
|
||||
LYXERR(Debug::GUI, "Spellchecker: ignore button");
|
||||
d->forward();
|
||||
d->check();
|
||||
d->canCheck();
|
||||
}
|
||||
|
||||
|
||||
void SpellcheckerWidget::on_findNextPB_clicked()
|
||||
{
|
||||
docstring const data = find2string(
|
||||
qstring_to_ucs4(d->ui.wordED->text()),
|
||||
if (d->inCheck())
|
||||
return;
|
||||
docstring const textfield = qstring_to_ucs4(d->ui.wordED->text());
|
||||
docstring const datastring = find2string(textfield,
|
||||
true, true, true);
|
||||
dispatch(FuncRequest(LFUN_WORD_FIND, data));
|
||||
LYXERR(Debug::GUI, "Spellchecker: find next (" << textfield << ")");
|
||||
dispatch(FuncRequest(LFUN_WORD_FIND, datastring));
|
||||
d->canCheck();
|
||||
}
|
||||
|
||||
|
||||
void SpellcheckerWidget::on_replacePB_clicked()
|
||||
{
|
||||
if (d->inCheck())
|
||||
return;
|
||||
docstring const textfield = qstring_to_ucs4(d->ui.wordED->text());
|
||||
docstring const replacement = qstring_to_ucs4(d->ui.replaceCO->currentText());
|
||||
docstring const data = replace2string(
|
||||
replacement, qstring_to_ucs4(d->ui.wordED->text()),
|
||||
docstring const datastring = replace2string(replacement, textfield,
|
||||
true, true, false, false);
|
||||
|
||||
LYXERR(Debug::GUI, "Replace (" << replacement << ")");
|
||||
dispatch(FuncRequest(LFUN_WORD_REPLACE, data));
|
||||
dispatch(FuncRequest(LFUN_WORD_REPLACE, datastring));
|
||||
d->forward();
|
||||
d->check();
|
||||
d->canCheck();
|
||||
}
|
||||
|
||||
|
||||
void SpellcheckerWidget::on_replaceAllPB_clicked()
|
||||
{
|
||||
docstring const data = replace2string(
|
||||
qstring_to_ucs4(d->ui.replaceCO->currentText()),
|
||||
qstring_to_ucs4(d->ui.wordED->text()),
|
||||
if (d->inCheck())
|
||||
return;
|
||||
docstring const textfield = qstring_to_ucs4(d->ui.wordED->text());
|
||||
docstring const replacement = qstring_to_ucs4(d->ui.replaceCO->currentText());
|
||||
docstring const datastring = replace2string(replacement, textfield,
|
||||
true, true, true, true);
|
||||
dispatch(FuncRequest(LFUN_WORD_REPLACE, data));
|
||||
|
||||
LYXERR(Debug::GUI, "Replace all (" << replacement << ")");
|
||||
dispatch(FuncRequest(LFUN_WORD_REPLACE, datastring));
|
||||
d->forward();
|
||||
d->check(); // continue spellchecking
|
||||
d->canCheck();
|
||||
}
|
||||
|
||||
|
||||
@ -317,6 +366,7 @@ void SpellcheckerWidget::Private::check()
|
||||
WordLangTuple word_lang;
|
||||
docstring_list suggestions;
|
||||
|
||||
LYXERR(Debug::GUI, "Spellchecker: start check at " << from);
|
||||
int progress;
|
||||
try {
|
||||
progress = bv->buffer().spellCheck(from, to, word_lang, suggestions);
|
||||
@ -355,7 +405,7 @@ GuiSpellchecker::GuiSpellchecker(GuiView & parent,
|
||||
: DockView(parent, "spellchecker", qt_("Spellchecker"),
|
||||
area, flags)
|
||||
{
|
||||
widget_ = new SpellcheckerWidget(&parent);
|
||||
widget_ = new SpellcheckerWidget(&parent, this);
|
||||
setWidget(widget_);
|
||||
setFocusProxy(widget_);
|
||||
}
|
||||
|
@ -31,12 +31,12 @@ class SpellcheckerWidget : public QTabWidget
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
SpellcheckerWidget(GuiView * gv, QWidget * parent = 0);
|
||||
SpellcheckerWidget(GuiView * gv, DockView * dv, QWidget * parent = 0);
|
||||
~SpellcheckerWidget();
|
||||
///
|
||||
void updateView();
|
||||
///
|
||||
bool initialiseParams(std::string const & data);
|
||||
bool initialiseParams(std::string const &);
|
||||
|
||||
private Q_SLOTS:
|
||||
void on_findNextPB_clicked();
|
||||
@ -71,7 +71,7 @@ public:
|
||||
private:
|
||||
///{
|
||||
void updateView();
|
||||
bool initialiseParams(std::string const &) { return true; }
|
||||
bool initialiseParams(std::string const & data) { return widget_->initialiseParams(data); }
|
||||
void clearParams() {}
|
||||
void dispatchParams() {}
|
||||
bool isBufferDependent() const { return false; }
|
||||
|
Loading…
Reference in New Issue
Block a user