+void Paragraph::deregisterWords()
+{
+ Private::Words::const_iterator it;
+ WordList & wl = theWordList();
+ for (it = d->words_.begin(); it != d->words_.end(); ++it)
+ wl.remove(*it);
+ d->words_.clear();
+}
+
+
+void Paragraph::collectWords(CursorSlice const & sl)
+{
+ // find new words
+ bool inword = false;
+
+ //lyxerr << "Words: ";
+ pos_type n = size();
+ for (pos_type pos = 0; pos != n; ++pos) {
+ if (isDeleted(pos))
+ continue;
+
+ if (!isLetter(pos)) {
+ inword = false;
+ continue;
+ }
+
+ if (inword)
+ continue;
+
+ inword = true;
+ CursorSlice from = sl;
+ CursorSlice to = sl;
+ from.pos() = pos;
+ to.pos() = pos;
+ from.text()->getWord(from, to, WHOLE_WORD);
+ if (to.pos() - from.pos() < 6)
+ continue;
+ docstring word = asString(from.pos(), to.pos(), false);
+ d->words_.insert(word);
+ //lyxerr << word << " ";
+ }
+ //lyxerr << std::endl;
+}
+
+
+void Paragraph::registerWords()
+{
+ Private::Words::const_iterator it;
+ WordList & wl = theWordList();
+ for (it = d->words_.begin(); it != d->words_.end(); ++it)
+ wl.insert(*it);
+}
+
+
+void Paragraph::updateWords(CursorSlice const & sl)
+{
+ LASSERT(&sl.paragraph() == this, /**/);
+ deregisterWords();
+ collectWords(sl);
+ registerWords();
+}
+