Author: switt
Date: Fri Jan  7 16:20:58 2011
New Revision: 37146
URL: http://www.lyx.org/trac/changeset/37146

Log:
#7220 correct spell check state ranges for word splits

Modified:
   lyx-devel/trunk/src/Paragraph.cpp
   lyx-devel/trunk/src/Paragraph.h

Modified: lyx-devel/trunk/src/Paragraph.cpp
==============================================================================
--- lyx-devel/trunk/src/Paragraph.cpp   Fri Jan  7 02:09:23 2011        (r37145)
+++ lyx-devel/trunk/src/Paragraph.cpp   Fri Jan  7 16:20:58 2011        (r37146)
@@ -137,7 +137,30 @@
 
        void setRange(FontSpan const fp, SpellChecker::Result state)
        {
-               eraseCoveredRanges(fp);
+               Ranges result;
+               RangesIterator et = ranges_.end();
+               RangesIterator it = ranges_.begin();
+               for (; it != et; ++it) {
+                       if (!it->covered(fp))
+                               result.push_back(SpellResultRange(it->range(), 
it->result()));
+                       else if (state == SpellChecker::WORD_OK) {
+                               // trim or split the current misspelled range
+                               // store misspelled ranges only
+                               FontSpan range = it->range();
+                               if (fp.first > range.first) {
+                                       // misspelled area in front of WORD_OK
+                                       range.last = fp.first - 1;
+                                       
result.push_back(SpellResultRange(range, it->result()));
+                                       range = it->range();
+                               }
+                               if (fp.last < range.last) {
+                                       // misspelled area after WORD_OK range
+                                       range.first = fp.last + 1;
+                                       
result.push_back(SpellResultRange(range, it->result()));
+                               }
+                       }
+               }
+               ranges_ = result;
                if (state != SpellChecker::WORD_OK)
                        ranges_.push_back(SpellResultRange(fp, state));
        }
@@ -207,8 +230,10 @@
                        if (pos > refresh_.last)
                                refresh_.last = pos;
                } else if (pos != -1) {
-                       refresh_.first = pos;
-                       refresh_.last = pos;
+                       // init request check for neighbour positions too
+                       refresh_.first = pos > 0 ? pos - 1 : 0;
+                       // no need for special end of paragraph check
+                       refresh_.last = pos + 1;
                }
                needs_refresh_ = pos != -1;
        }
@@ -231,18 +256,6 @@
        SpellChecker::ChangeNumber current_change_number_;
 
 
-       void eraseCoveredRanges(FontSpan const fp)
-       {
-               Ranges result;
-               RangesIterator et = ranges_.end();
-               RangesIterator it = ranges_.begin();
-               for (; it != et; ++it) {
-                       if (!it->covered(fp))
-                               result.push_back(SpellResultRange(it->range(), 
it->result()));
-               }
-               ranges_ = result;
-       }
-
        void correctRangesAfterPos(pos_type pos, int offset)
        {
                RangesIterator et = ranges_.end();

Modified: lyx-devel/trunk/src/Paragraph.h
==============================================================================
--- lyx-devel/trunk/src/Paragraph.h     Fri Jan  7 02:09:23 2011        (r37145)
+++ lyx-devel/trunk/src/Paragraph.h     Fri Jan  7 16:20:58 2011        (r37146)
@@ -82,6 +82,10 @@
                return first <= p && p <= last;
        }
 
+       inline bool empty() const
+       {
+               return first > last;
+       }
 };
 
 ///

Reply via email to