#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*)));
}
-void GuiSpellchecker::closeEvent(QCloseEvent * e)
-{
- slotClose();
- GuiDialog::closeEvent(e);
-}
-
-
void GuiSpellchecker::reject()
{
slotClose();
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();
+ }
}
}
-static SpellBase * getSpeller(BufferParams const & bp)
+static SpellBase * createSpeller(BufferParams const & bp)
{
string lang = (lyxrc.isp_use_alt_lang)
? lyxrc.isp_alt_lang
}
-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;
void GuiSpellchecker::clearParams()
{
- LYXERR(Debug::GUI) << "Spellchecker::clearParams" << endl;
+ LYXERR(Debug::GUI, "Spellchecker::clearParams");
delete speller_;
speller_ = 0;
}
// Insets like optional hyphens and ligature
// break are part of a word.
if (!cur.paragraph().isInset(cur.pos())) {
- Paragraph::value_type const c =
- cur.paragraph().getChar(cur.pos());
+ char_type const c = cur.paragraph().getChar(cur.pos());
word += c;
if (isDigit(c))
ignoreword = true;
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;
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())
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 ...
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;
// 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);
}
}
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
}
-Dialog * createGuiSpellchecker(LyXView & lv) { return new GuiSpellchecker(lv); }
+Dialog * createGuiSpellchecker(GuiView & lv) { return new GuiSpellchecker(lv); }
} // namespace frontend
} // namespace lyx