]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/controllers/ControlSpellchecker.C
Add a buffer_path arg to InsetGraphicsMailer's params2string, string2params.
[lyx.git] / src / frontends / controllers / ControlSpellchecker.C
index 4f0b6e9825c80c1ad7270bd3c94fe22291ff12a8..19c1acf035b26061234b2db86803c1b817fae122 100644 (file)
@@ -1,17 +1,15 @@
 /**
  * \file ControlSpellchecker.C
- * Copyright 2001 the LyX Team
- * Read the file COPYING
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
  *
- * \author Edwin Leuven <leuven@fee.uva.nl>
+ * \author Edwin Leuven
+ *
+ * Full author contact details are available in file CREDITS
  */
 
 #include <config.h>
 
-#ifdef __GNUG__
-#pragma implementation
-#endif
-
 #include "ControlSpellchecker.h"
 #include "ViewBase.h"
 #include "buffer.h"
 #include "language.h"
 #include "lyxrc.h"
 #include "lyxtext.h"
-#include "frontends/Alert.h"
-#include "support/lstrings.h"
+#include "debug.h"
 
 #include "ispell.h"
 #ifdef USE_PSPELL
 # include "pspell.h"
+#else
+#ifdef USE_ASPELL
+# include "aspell_local.h"
 #endif
+#endif
+
+#include "support/tostr.h"
+
+#include "frontends/Alert.h"
+
+using namespace lyx::support;
+
+using std::endl;
 
 
 ControlSpellchecker::ControlSpellchecker(LyXView & lv, Dialogs & d)
        : ControlDialogBD(lv, d),
-         rtl_(false), newval_(0.0), oldval_(0), newvalue_(0), count_(0),
-         stop_(false), speller_(0)
+         newval_(0.0), oldval_(0), newvalue_(0), count_(0)
+{}
+
+
+ControlSpellchecker::~ControlSpellchecker()
 {}
 
 
 void ControlSpellchecker::setParams()
 {
-       if (!speller_) {
-               // create spell object
-               string tmp;
-#ifdef USE_PSPELL
-               if (lyxrc.use_pspell) {
-                       tmp = (lyxrc.isp_use_alt_lang) ?
-                               lyxrc.isp_alt_lang : buffer()->params.language->code();
+       lyxerr[Debug::GUI] << "spell setParams" << endl;
+       startSession();
+}
 
-                       speller_ = new PSpell(buffer()->params, tmp);
-               } else {
-#endif
-                       tmp = (lyxrc.isp_use_alt_lang) ?
-                               lyxrc.isp_alt_lang : buffer()->params.language->lang();
 
-                       speller_ = new ISpell(buffer()->params, tmp);
+void ControlSpellchecker::clearParams()
+{
+       lyxerr[Debug::GUI] << "spell clearParams" << endl;
+       endSession();
+}
+
+namespace {
+
+SpellBase * getSpeller(BufferParams const & bp)
+{
+       string lang = (lyxrc.isp_use_alt_lang)
+                     ? lyxrc.isp_alt_lang
+                     : bp.language->code();
+
+#ifdef USE_ASPELL
+       if (lyxrc.use_spell_lib)
+               return new ASpell(bp, lang);
+#endif
 #ifdef USE_PSPELL
-               }
+       if (lyxrc.use_spell_lib)
+               return new PSpell(bp, lang);
 #endif
 
-               if (lyxrc.isp_use_alt_lang) {
-                       Language const * lang = languages.getLanguage(tmp);
-                       if (lang)
-                               rtl_ = lang->RightToLeft();
-               } else {
-                       rtl_ = buffer()->params.language->RightToLeft();
-               }
+       lang = (lyxrc.isp_use_alt_lang) ?
+               lyxrc.isp_alt_lang : bp.language->lang();
 
-               if (!speller_->error().empty()) {
-                       emergency_exit_ = true;
-                       Alert::alert("The spellchecker has failed", speller_->error());
-                       clearParams();
-                       return;
-               }
+       return new ISpell(bp, lang);
+}
+
+}
+
+void ControlSpellchecker::startSession()
+{
+       lyxerr[Debug::GUI] << "spell startSession" << endl;
+
+       if (speller_.get()) {
+               lyxerr[Debug::GUI] << "startSession: speller exists" << endl;
+               speller_.reset(0);
+               return;
+       }
+
+       speller_.reset(getSpeller(buffer()->params));
+
+       // reset values to initial
+       newval_ = 0.0;
+       oldval_ = 0;
+       newvalue_ = 0;
+       count_ = 0;
+       emergency_exit_ = false;
+
+       // start off the check
+       if (speller_->error().empty()) {
+               check();
+               return;
+       }
+
+       emergency_exit_ = true;
+       string message = speller_->error();
+       if (message.empty())
+               message = _("The spell-checker could not be started.\n"
+                        "Maybe it is mis-configured.");
+
+       Alert::error(_("The spell-checker has failed"), message);
+       speller_.reset(0);
+}
+
+
+void ControlSpellchecker::endSession()
+{
+       lyxerr[Debug::GUI] << "spell endSession" << endl;
+
+       bufferview()->endOfSpellCheck();
+
+       emergency_exit_ = true;
+
+       if (!speller_.get()) {
+               lyxerr[Debug::GUI] << "endSession with no speller" << endl;
+               return;
        }
+
+       speller_.reset(0);
 }
 
 
 void ControlSpellchecker::check()
 {
+       lyxerr[Debug::GUI] << "spell check a word" << endl;
+
        SpellBase::Result res = SpellBase::OK;
-       stop_ = false;
 
        // clear any old selection
        LyXText * text = bufferview()->getLyXText();
        bufferview()->toggleSelection(true);
        bufferview()->update(text, BufferView::SELECT);
 
-       while ((res == SpellBase::OK || res == SpellBase::IGNORE) && !stop_) {
+       while ((res == SpellBase::OK || res == SpellBase::IGNORE)) {
                word_ = bufferview()->nextWord(newval_);
 
-               if (word_.word().empty()) {
-                       clearParams();
+               // end of document
+               if (word_.word().empty())
                        break;
-               }
 
                ++count_;
 
                // Update slider if and only if value has changed
                newvalue_ = int(100.0 * newval_);
                if (newvalue_!= oldval_) {
+                       lyxerr[Debug::GUI] << "Updating spell progress." << endl;
                        oldval_ = newvalue_;
                        // set progress bar
-                       view().partialUpdate(0);
+                       view().partialUpdate(SPELL_PROGRESSED);
                }
 
-               if (!speller_->alive()) {
-                       clearParams();
-                       stop();
+               // speller might be dead ...
+               if (!checkAlive())
                        return;
-               }
 
                res = speller_->check(word_);
+
+               // ... or it might just be reporting an error
+               if (!checkAlive())
+                       return;
        }
 
-       if (!stop_ && !word_.word().empty())
+       lyxerr[Debug::GUI] << "Found word \"" << word_.word() << "\"" << endl;
+
+       if (!word_.word().empty()) {
                bufferview()->selectLastWord();
+       } else {
+               showSummary();
+               endSession();
+               return;
+       }
 
        // set suggestions
        if (res != SpellBase::OK && res != SpellBase::IGNORE) {
-               view().partialUpdate(1);
+               lyxerr[Debug::GUI] << "Found a word needing checking." << endl;
+               view().partialUpdate(SPELL_FOUND_WORD);
+       }
+}
+
+
+bool ControlSpellchecker::checkAlive()
+{
+       if (speller_->alive() && speller_->error().empty())
+               return true;
+
+       string message = speller_->error();
+       if (message.empty())
+               message = _("The spell-checker has died for some reason.\n"
+                        "Maybe it has been killed.");
+
+       view().hide();
+       speller_.reset(0);
+
+       Alert::error(_("The spell-checker has failed"), message);
+       return false;
+}
+
+
+void ControlSpellchecker::showSummary()
+{
+       if (!checkAlive() || count_ == 0) {
+               view().hide();
+               return;
        }
+
+       string message;
+       if (count_ != 1)
+               message = bformat(_("%1$s words checked."), tostr(count_));
+       else
+               message = _("One word checked.");
+
+       view().hide();
+       Alert::information(_("Spell-checking is complete"), message);
 }
 
 
@@ -126,7 +237,7 @@ void ControlSpellchecker::replace(string const & replacement)
 {
        bufferview()->replaceWord(replacement);
        // fix up the count
-       --count_;
+       --count_;
        check();
 }
 
@@ -145,23 +256,15 @@ void ControlSpellchecker::insert()
 }
 
 
-string ControlSpellchecker::getSuggestion()
+string const ControlSpellchecker::getSuggestion() const
 {
-       string miss(speller_->nextMiss());
-
-       if (rtl_)
-               std::reverse(miss.begin(), miss.end());
-
-       return miss;
+       return speller_->nextMiss();
 }
 
 
-string ControlSpellchecker::getWord()
+string const ControlSpellchecker::getWord() const
 {
-       string tmp = word_.word();
-       if (rtl_)
-               std::reverse(tmp.begin(), tmp.end());
-       return tmp;
+       return word_.word();
 }
 
 
@@ -170,58 +273,3 @@ void ControlSpellchecker::ignoreAll()
        speller_->accept(word_);
        check();
 }
-
-
-void ControlSpellchecker::stop()
-{
-       stop_ = true;
-       bufferview()->endOfSpellCheck();
-}
-
-
-void ControlSpellchecker::clearParams()
-{
-       if (!speller_)
-               return;
-
-       if (speller_->alive()) {
-               speller_->close();
-               message_ = tostr(count_);
-               if (count_ != 1) {
-                       message_ += _(" words checked.");
-               } else {
-                       message_ += _(" word checked.");
-               }
-               message_ = "\n" + message_;
-               message_ = _("Spellchecking completed! ") + message_;
-
-       } else {
-               message_ = speller_->error();
-               speller_->cleanUp();
-               if (message_.empty())
-                   message_ = _("The spell checker has died for some reason.\n"
-                                "Maybe it has been killed.");
-
-               // make sure that the dialog is not launched
-               emergency_exit_ = true;
-               Alert::alert("The spellchecker has failed", message_);
-       }
-
-       delete speller_;
-
-       bufferview()->endOfSpellCheck();
-
-       // show closing message if any words were checked.
-       if (count_ > 0)
-               view().partialUpdate(2);
-
-       // reset values to initial
-       rtl_ = false;
-       newval_ = 0.0;
-       oldval_ = 0;
-       newvalue_ = 0;
-       count_ = 0;
-       message_.erase();
-       stop_ = false;
-       speller_ = 0;
-}