]> git.lyx.org Git - features.git/commitdiff
spellcheck cleanup
authorAlfredo Braunstein <abraunst@lyx.org>
Tue, 4 Nov 2003 00:26:50 +0000 (00:26 +0000)
committerAlfredo Braunstein <abraunst@lyx.org>
Tue, 4 Nov 2003 00:26:50 +0000 (00:26 +0000)
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@8024 a592a061-630c-0410-9148-cb99ea01b6c8

src/frontends/controllers/ChangeLog
src/frontends/controllers/ControlSpellchecker.C
src/frontends/controllers/ControlSpellchecker.h

index 381b4087c0cdbd044652608a9033bb93c2613b74..8b2dcc9531cd61ff76f71b69efebd32c9319225f 100644 (file)
@@ -1,3 +1,8 @@
+2003-11-04  Alfredo Braunstein  <abraunst@libero.it>
+
+       * ControlSpellchecker.[Ch] (nextWord, check): rewrite of the text 
+       handling parts
+
 2003-10-27  Juergen Spitzmueller  <j.spitzmueller@gmx.de>
 
        * ControlDocument.[Ch]: add method setBranchColor().
index 5d9ac92a34d8a9c9476d5ae6db7d0a4e328fad97..cb81403b01e6439e6c27fd47fd98cd0329d93b2f 100644 (file)
 #include "buffer.h"
 #include "bufferparams.h"
 #include "BufferView.h"
+#include "bufferview_funcs.h"
 #include "debug.h"
 #include "gettext.h"
 #include "language.h"
 #include "lyxrc.h"
 
+#include "PosIterator.h"
+#include "paragraph.h"
+
 #include "ispell.h"
 #ifdef USE_PSPELL
 # include "pspell.h"
@@ -43,7 +47,7 @@ using std::string;
 
 ControlSpellchecker::ControlSpellchecker(LyXView & lv, Dialogs & d)
        : ControlDialogBD(lv, d),
-         newval_(0.0), oldval_(0), newvalue_(0), count_(0)
+         oldval_(0), newvalue_(0), count_(0)
 {}
 
 
@@ -67,6 +71,7 @@ void ControlSpellchecker::clearParams()
 
 namespace {
 
+
 SpellBase * getSpeller(BufferParams const & bp)
 {
        string lang = (lyxrc.isp_use_alt_lang)
@@ -104,7 +109,6 @@ void ControlSpellchecker::startSession()
        speller_.reset(getSpeller(buffer()->params()));
 
        // reset values to initial
-       newval_ = 0.0;
        oldval_ = 0;
        newvalue_ = 0;
        count_ = 0;
@@ -131,8 +135,6 @@ void ControlSpellchecker::endSession()
 {
        lyxerr[Debug::GUI] << "spell endSession" << endl;
 
-       bufferview()->endOfSpellCheck();
-
        emergency_exit_ = true;
 
        if (!speller_.get()) {
@@ -144,17 +146,61 @@ void ControlSpellchecker::endSession()
 }
 
 
+namespace {
+
+
+bool isLetter(PosIterator & cur)
+{
+       return !cur.at_end()
+               && cur.pit()->isLetter(cur.pos())
+               && !isDeletedText(*cur.pit(), cur.pos());
+}
+
+
+WordLangTuple nextWord(PosIterator & cur, PosIterator const & end,
+                      int & progress, BufferParams & bp)
+{
+       // skip until we have real text (will jump paragraphs)
+       for (; cur != end && !isLetter(cur); ++cur, ++progress);
+       
+       if (cur == end)
+               return WordLangTuple(string(), string());
+
+       string lang_code = cur.pit()->getFontSettings(bp, cur.pos()).language()->code();
+       string str;
+       // and find the end of the word (insets like optional hyphens
+       // and ligature break are part of a word)
+       for (; cur != end && isLetter(cur); ++cur, ++progress)
+               str += cur.pit()->getChar(cur.pos());
+
+       return WordLangTuple(str, lang_code);
+}
+
+
+} //namespace anon
+
+
+
+
 void ControlSpellchecker::check()
 {
        lyxerr[Debug::GUI] << "spell check a word" << endl;
 
        SpellBase::Result res = SpellBase::OK;
 
-       // clear any old selection
-       bufferview()->update();
+       PosIterator cur(*bufferview());
+       PosIterator const beg = buffer()->pos_iterator_begin();
+       PosIterator const end = buffer()->pos_iterator_end();
+
+       int start = distance(beg, cur);
+       int const total = start + distance(cur, end);
+
+       if (cur != buffer()->pos_iterator_begin())
+               for (; cur != end && isLetter(cur); ++cur, ++start);
 
+       
        while (res == SpellBase::OK || res == SpellBase::IGNORE) {
-               word_ = bufferview()->nextWord(newval_);
+               word_ = nextWord(cur, end, start, buffer()->params());
 
                // end of document
                if (word_.word().empty())
@@ -163,7 +209,8 @@ void ControlSpellchecker::check()
                ++count_;
 
                // Update slider if and only if value has changed
-               newvalue_ = int(100.0 * newval_);
+               float progress = total ? float(start)/total : 1;
+               newvalue_ = int(100.0 * progress);
                if (newvalue_!= oldval_) {
                        lyxerr[Debug::GUI] << "Updating spell progress." << endl;
                        oldval_ = newvalue_;
@@ -183,11 +230,12 @@ void ControlSpellchecker::check()
        }
 
        lyxerr[Debug::GUI] << "Found word \"" << word_.word() << "\"" << endl;
-       lyxerr << "Found word \"" << word_.word() << "\"" << endl;
 
        if (!word_.word().empty()) {
-               bufferview()->selectLastWord();
-               bufferview()->fitCursor();
+               int const size = word_.word().size();
+               advance(cur, -size);
+               bv_funcs::put_selection_at(bufferview(), cur, size, false);
+               advance(cur, size);
        } else {
                showSummary();
                endSession();
index f8f68b547b8ce0c744ee7c582b78b6ef3b05b2c5..19c24d3271a6249a4656b905b16bd278840f6a89 100644 (file)
@@ -85,7 +85,6 @@ private:
        WordLangTuple word_;
 
        /// values for progress
-       float newval_;
        int oldval_;
        int newvalue_;