Am 06.04.2011 um 21:29 schrieb LyX Ticket Tracker: > #7430: Spellchecker doesn't recognize document language > --------------------+------------------------------------------------------- > Reporter: klwy | Owner: lasgouttes > Type: defect | Status: new > Priority: normal | Milestone: 2.0.0 > Component: spell | Version: 2.0.0svn > Severity: normal | Keywords: patch > --------------------+------------------------------------------------------- > > Comment(by stwitt): > > It is in (r38294). > > To make it more reliable I've made another patch to re-add the test for > initial state of form. > > Currently there are more issues with the spell checker dialog/dock. > For example it goes wild if you click the Ignore button too fast.
As Abdel said, this dialog needs some attention. The attached patch 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 Stephan
Index: src/frontends/qt4/GuiSpellchecker.h =================================================================== --- src/frontends/qt4/GuiSpellchecker.h (Revision 38299) +++ src/frontends/qt4/GuiSpellchecker.h (Arbeitskopie) @@ -31,12 +31,12 @@ 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 @@ 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; } Index: src/frontends/qt4/GuiSpellchecker.cpp =================================================================== --- src/frontends/qt4/GuiSpellchecker.cpp (Revision 38299) +++ src/frontends/qt4/GuiSpellchecker.cpp (Arbeitskopie) @@ -59,8 +59,8 @@ 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 @@ 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 @@ { 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 @@ 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 @@ 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 @@ } +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 @@ 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 @@ : DockView(parent, "spellchecker", qt_("Spellchecker"), area, flags) { - widget_ = new SpellcheckerWidget(&parent); + widget_ = new SpellcheckerWidget(&parent, this); setWidget(widget_); setFocusProxy(widget_); }