]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/GuiSpellchecker.cpp
Complete the removal of the embedding stuff. Maybe. It's hard to be sure we got every...
[lyx.git] / src / frontends / qt4 / GuiSpellchecker.cpp
index c44a598ded36f9f1147689507ad721403ca24142..561b99168f61460ca75be644ed489e0572427259 100644 (file)
 #include "BufferView.h"
 #include "Cursor.h"
 #include "CutAndPaste.h"
-#include "debug.h"
-#include "gettext.h"
 #include "Language.h"
 #include "LyXRC.h"
 #include "Paragraph.h"
 
-#include "support/textutils.h"
-#include "support/convert.h"
+#include "support/debug.h"
 #include "support/docstring.h"
+#include "support/gettext.h"
+#include "support/lstrings.h"
+#include "support/textutils.h"
 
-#include <QProgressBar>
-#include <QLineEdit>
-#include <QPushButton>
-#include <QListWidget>
 #include <QListWidgetItem>
-#include <QCloseEvent>
-#include <QSyntaxHighlighter>
-#include <QTextCharFormat>
-#include <QTextDocument>
 
 #if defined(USE_ASPELL)
 # include "ASpell_local.h"
 #endif
 
 #include "frontends/alert.h"
-// FIXME: those two headers are needed because of the
-// WorkArea::redraw() call below.
-#include "frontends/LyXView.h"
-#include "frontends/WorkArea.h"
-
-using std::advance;
-using std::distance;
-using std::endl;
-using std::string;
 
+using namespace std;
+using namespace lyx::support;
 
 namespace lyx {
 namespace frontend {
 
-using support::bformat;
-using support::contains;
 
-GuiSpellchecker::GuiSpellchecker(LyXView & lv)
-       : GuiDialog(lv, "spellchecker"), exitEarly_(false),
+GuiSpellchecker::GuiSpellchecker(GuiView & lv)
+       : GuiDialog(lv, "spellchecker", qt_("Spellchecker")), exitEarly_(false),
          oldval_(0), newvalue_(0), count_(0), speller_(0)
 {
        setupUi(this);
-       setViewTitle(_("Spellchecker"));
 
        connect(closePB, SIGNAL(clicked()), this, SLOT(slotClose()));
-       connect(replacePB, SIGNAL(clicked()), this, SLOT(replaceClicked()));
-       connect(ignorePB, SIGNAL(clicked()), this, SLOT(ignoreClicked()));
-       connect(replacePB_3, SIGNAL(clicked()), this, SLOT(acceptClicked()));
-       connect(addPB, SIGNAL(clicked()), this, SLOT(addClicked()));
+       connect(replacePB, SIGNAL(clicked()), this, SLOT(replace()));
+       connect(ignorePB, SIGNAL(clicked()), this, SLOT(ignore()));
+       connect(replacePB_3, SIGNAL(clicked()), this, SLOT(accept()));
+       connect(addPB, SIGNAL(clicked()), this, SLOT(add()));
 
        connect(replaceCO, SIGNAL(highlighted(QString)),
                this, SLOT(replaceChanged(QString)));
        connect(suggestionsLW, SIGNAL(itemDoubleClicked(QListWidgetItem*)),
-               this, SLOT(replaceClicked()));
+               this, SLOT(replace()));
        connect(suggestionsLW, SIGNAL(itemClicked(QListWidgetItem*)),
                this, SLOT(suggestionChanged(QListWidgetItem*)));
 
@@ -128,13 +110,6 @@ void GuiSpellchecker::replaceChanged(const QString & str)
 }
 
 
-void GuiSpellchecker::closeEvent(QCloseEvent * e)
-{
-       slotClose();
-       GuiDialog::closeEvent(e);
-}
-
-
 void GuiSpellchecker::reject()
 {
        slotClose();
@@ -144,8 +119,31 @@ void GuiSpellchecker::reject()
 
 void GuiSpellchecker::updateContents()
 {
-       if (isVisibleView() || exitEarly())
+       // The clauses below are needed because the spellchecker
+       // has many flaws (see bugs 1950, 2218).
+       // Basically, we have to distinguish the case where a
+       // spellcheck has already been performed for the whole
+       // document (exitEarly() == true, isVisible() == false) 
+       // from the rest (exitEarly() == false, isVisible() == true).
+       // FIXME: rewrite the whole beast!
+       static bool check_after_early_exit;
+       if (exitEarly()) {
+               // a spellcheck has already been performed,
                check();
+               check_after_early_exit = true;
+       }
+       else if (isVisible()) {
+               // the above check triggers a second update,
+               // and isVisible() is true then. Prevent a
+               // second check that skips the first word
+               if (check_after_early_exit)
+                       // don't check, but reset the bool.
+                       // business as usual after this.
+                       check_after_early_exit = false;
+               else
+                       // perform spellcheck (default case)
+                       check();
+       }
 }
 
 
@@ -200,7 +198,7 @@ void GuiSpellchecker::partialUpdate(int state)
 }
 
 
-static SpellBase * getSpeller(BufferParams const & bp)
+static SpellBase * createSpeller(BufferParams const & bp)
 {
        string lang = (lyxrc.isp_use_alt_lang)
                      ? lyxrc.isp_alt_lang
@@ -225,11 +223,11 @@ static SpellBase * getSpeller(BufferParams const & bp)
 }
 
 
-bool GuiSpellchecker::initialiseParams(std::string const &)
+bool GuiSpellchecker::initialiseParams(string const &)
 {
-       LYXERR(Debug::GUI) << "Spellchecker::initialiseParams" << endl;
+       LYXERR(Debug::GUI, "Spellchecker::initialiseParams");
 
-       speller_ = getSpeller(buffer().params());
+       speller_ = createSpeller(buffer().params());
        if (!speller_)
                return false;
 
@@ -254,7 +252,7 @@ bool GuiSpellchecker::initialiseParams(std::string const &)
 
 void GuiSpellchecker::clearParams()
 {
-       LYXERR(Debug::GUI) << "Spellchecker::clearParams" << endl;
+       LYXERR(Debug::GUI, "Spellchecker::clearParams");
        delete speller_;
        speller_ = 0;
 }
@@ -318,7 +316,7 @@ static WordLangTuple nextWord(Cursor & cur, ptrdiff_t & progress)
 
 void GuiSpellchecker::check()
 {
-       LYXERR(Debug::GUI) << "Check the spelling of a word" << endl;
+       LYXERR(Debug::GUI, "Check the spelling of a word");
 
        SpellBase::Result res = SpellBase::OK;
 
@@ -328,8 +326,8 @@ void GuiSpellchecker::check()
 
        ptrdiff_t start = 0;
        ptrdiff_t total = 0;
-       DocIterator it = DocIterator(buffer().inset());
-       for (start = 0; it != cur; it.forwardPos())
+       DocIterator it = doc_iterator_begin(buffer().inset());
+       for (start = 1; it != cur; it.forwardPos())
                ++start;
 
        for (total = start; it; it.forwardPos())
@@ -353,10 +351,10 @@ void GuiSpellchecker::check()
                float progress = total ? float(start)/total : 1;
                newvalue_ = int(100.0 * progress);
                if (newvalue_!= oldval_) {
-                       LYXERR(Debug::GUI) << "Updating spell progress." << endl;
+                       LYXERR(Debug::GUI, "Updating spell progress.");
                        oldval_ = newvalue_;
                        // set progress bar
-                       partialUpdateView(SPELL_PROGRESSED);
+                       partialUpdate(SPELL_PROGRESSED);
                }
 
                // speller might be dead ...
@@ -370,7 +368,7 @@ void GuiSpellchecker::check()
                        return;
        }
 
-       LYXERR(Debug::GUI) << "Found word \"" << to_utf8(getWord()) << "\"" << endl;
+       LYXERR(Debug::GUI, "Found word \"" << to_utf8(getWord()) << "\"");
 
        int const size = cur.selEnd().pos() - cur.selBegin().pos();
        cur.pos() -= size;
@@ -382,8 +380,8 @@ void GuiSpellchecker::check()
 
        // set suggestions
        if (res != SpellBase::OK && res != SpellBase::IGNORED_WORD) {
-               LYXERR(Debug::GUI) << "Found a word needing checking." << endl;
-               partialUpdateView(SPELL_FOUND_WORD);
+               LYXERR(Debug::GUI, "Found a word needing checking.");
+               partialUpdate(SPELL_FOUND_WORD);
        }
 }
 
@@ -427,8 +425,8 @@ void GuiSpellchecker::showSummary()
 
 void GuiSpellchecker::replace(docstring const & replacement)
 {
-       LYXERR(Debug::GUI) << "GuiSpellchecker::replace("
-                          << to_utf8(replacement) << ")" << std::endl;
+       LYXERR(Debug::GUI, "GuiSpellchecker::replace("
+                          << to_utf8(replacement) << ")");
        cap::replaceSelectionWithString(bufferview()->cursor(), replacement, true);
        buffer().markDirty();
        // If we used an LFUN, we would not need that
@@ -472,7 +470,7 @@ void GuiSpellchecker::ignoreAll()
 }
 
 
-Dialog * createGuiSpellchecker(LyXView & lv) { return new GuiSpellchecker(lv); }
+Dialog * createGuiSpellchecker(GuiView & lv) { return new GuiSpellchecker(lv); }
 
 } // namespace frontend
 } // namespace lyx