/**
* \file FormSpellchecker.C
- * Copyright 2001 The LyX Team.
- * See the file COPYING.
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
*
* \author Edwin Leuven
+ *
+ * Full author contact details are available in file CREDITS.
*/
#include <config.h>
-#ifdef __GNUG__
-#pragma implementation
-#endif
+#include "FormSpellchecker.h"
+#include "forms/form_spellchecker.h"
+
+#include "controllers/ControlSpellchecker.h"
+#include "Tooltips.h"
+#include "xforms_helpers.h"
#include "xformsBC.h"
-#include "ControlSpellchecker.h"
-#include "FormSpellchecker.h"
-#include "form_spellchecker.h"
-typedef FormCB<ControlSpellchecker, FormDB<FD_form_spellchecker> > base_class;
+#include "support/tostr.h"
+
+#include "lyx_forms.h"
+
+using std::string;
-FormSpellchecker::FormSpellchecker(ControlSpellchecker & c)
- : base_class(c, _("LyX: Spellchecker")), clickline_(-1)
+namespace lyx {
+namespace frontend {
+
+typedef FormController<ControlSpellchecker, FormView<FD_spellchecker> > base_class;
+
+FormSpellchecker::FormSpellchecker(Dialog & parent)
+ : base_class(parent, _("Spell-check document"))
{}
void FormSpellchecker::build()
{
- dialog_.reset(build_spellchecker());
-
+ dialog_.reset(build_spellchecker(this));
+
// Manage the buttons
- bc().setCancel(dialog_->done);
- bc().addReadOnly(dialog_->replace);
- bc().addReadOnly(dialog_->accept);
- bc().addReadOnly(dialog_->insert);
- bc().addReadOnly(dialog_->ignore);
- bc().addReadOnly(dialog_->start);
- bc().addReadOnly(dialog_->stop);
+ bcview().setCancel(dialog_->button_close);
+
+ // disable for read-only documents
+ bcview().addReadOnly(dialog_->button_replace);
+
+ // trigger an input event for cut&paste with middle mouse button.
+ setPrehandler(dialog_->input_replacement);
+
+ fl_set_input_return(dialog_->input_replacement, FL_RETURN_CHANGED);
+
+ // callback for double click in browser
+ fl_set_browser_dblclick_callback(dialog_->browser_suggestions,
+ C_FormDialogView_InputCB, 2);
+
+ // do not allow setting of slider by the mouse
+ fl_deactivate_object(dialog_->slider_progress);
+
+ // set up the tooltips
+ string str = _("Type replacement for unknown word "
+ "or select from suggestions.");
+ tooltips().init(dialog_->input_replacement, str);
+ str = _("List of replacement suggestions from dictionary.");
+ tooltips().init(dialog_->browser_suggestions, str);
+ // Work-around xforms' bug; enable tooltips for browser widgets.
+ setPrehandler(dialog_->browser_suggestions);
+ str = _("Replace unknown word.");
+ tooltips().init(dialog_->button_replace, str);
+ str = _("Ignore unknown word.");
+ tooltips().init(dialog_->button_ignore, str);
+ str = _("Accept unknown word as known in this session.");
+ tooltips().init(dialog_->button_accept, str);
+ str = _("Add unknown word to personal dictionary.");
+ tooltips().init(dialog_->button_add, str);
+ str = _("Shows word count and progress on spell check.");
+ tooltips().init(dialog_->slider_progress, str);
}
+
void FormSpellchecker::update()
{
- string w = "";
- fl_set_input(dialog_->input, w.c_str());
- fl_set_object_label(dialog_->text, w.c_str());
- fl_clear_browser(dialog_->browser);
- fl_set_slider_value(dialog_->slider, 0);
- clickline_ = -1 ;
+ controller().check();
}
-ButtonPolicy::SMInput FormSpellchecker::input(FL_OBJECT * obj, long)
+void FormSpellchecker::partialUpdate(int s)
{
- if (obj == dialog_->replace) {
- string tmp = fl_get_input(dialog_->input);
- controller().replace(tmp);
- } else if (obj == dialog_->start) {
- controller().check();
- fl_deactivate_object(dialog_->start);
- fl_set_object_lcol(dialog_->start, FL_INACTIVE);
- } else if (obj == dialog_->ignore) {
- controller().check();
- } else if (obj == dialog_->accept) {
- controller().ignoreAll();
- } else if (obj == dialog_->insert) {
- controller().insert();
- } else if (obj == dialog_->done) {
- controller().quit();
- } else if (obj == dialog_->options) {
- controller().options();
- } else if (obj == dialog_->browser) {
- int sel = fl_get_browser(dialog_->browser);
- if (clickline_==sel) {
- string tmp = fl_get_input(dialog_->input);
- controller().replace(tmp);
- }
- clickline_ = sel;
- string tmp = fl_get_browser_line(dialog_->browser, clickline_);
- fl_set_input(dialog_->input, tmp.c_str());
- }
+ ControlSpellchecker::State const state =
+ static_cast<ControlSpellchecker::State>(s);
- return ButtonPolicy::SMI_VALID;
-}
+ switch (state) {
-void FormSpellchecker::partialUpdate(int id)
-{
- // set suggestions
- if (id==0) {
- // set progress bar (always)
- fl_set_slider_value(dialog_->slider,
- controller().getProgress());
- } else if (id==1) {
+ case ControlSpellchecker::SPELL_FOUND_WORD: {
+ // Set suggestions.
string w = controller().getWord();
- fl_set_input(dialog_->input, w.c_str());
- fl_set_object_label(dialog_->text, w.c_str());
- fl_clear_browser(dialog_->browser);
- while (!(w = controller().getSuggestion()).empty() ) {
- fl_add_browser_line(dialog_->browser, w.c_str());
+ fl_set_input(dialog_->input_replacement, w.c_str());
+ fl_set_object_label(dialog_->text_unknown, w.c_str());
+ fl_clear_browser(dialog_->browser_suggestions);
+ while (!(w = controller().getSuggestion()).empty()) {
+ fl_add_browser_line(dialog_->browser_suggestions,
+ w.c_str());
}
- } else if (id==2) {
- fl_show_messages(controller().getMessage().c_str());
+ // Fall through...
+ }
+
+ case ControlSpellchecker::SPELL_PROGRESSED: {
+ int const progress = controller().getProgress();
+ if (progress == 0)
+ break;
+
+ double const wordcount = controller().getCount();
+ double const total = 100.0 * wordcount / progress;
+ string const label = tostr(progress) + " %";
+
+ fl_set_slider_bounds(dialog_->slider_progress, 0.0, total);
+ fl_set_slider_value(dialog_->slider_progress, wordcount);
+ fl_set_object_label(dialog_->slider_progress, label.c_str());
+ fl_redraw_object(dialog_->slider_progress);
+ break;
+ }
+
}
}
-
-void FormSpellchecker::showMessage(const char * msg)
+
+ButtonPolicy::SMInput FormSpellchecker::input(FL_OBJECT * ob, long ob_value)
{
- fl_show_message(msg, "", "");
-}
+ if (ob == dialog_->button_replace) {
+ string const tmp = getString(dialog_->input_replacement);
+ controller().replace(tmp);
-// note there is a button accept in session
-// it is not clear whether this is ingoreall or replaceall
+ } else if (ob == dialog_->button_ignore) {
+ controller().check();
+
+ } else if (ob == dialog_->button_accept) {
+ controller().ignoreAll();
+ } else if (ob == dialog_->button_add) {
+ controller().insert();
+
+ } else if (ob == dialog_->browser_suggestions) {
+ string const tmp = getString(dialog_->browser_suggestions);
+ if (tmp.empty())
+ return ButtonPolicy::SMI_NOOP;
+
+ if (ob_value != 2) {
+ // single-click
+ // place the chosen string in the input as feedback
+ fl_set_input(dialog_->input_replacement, tmp.c_str());
+
+ } else {
+ // double-click
+ controller().replace(tmp);
+ // reset the browser so that the following
+ // single-click callback doesn't do anything
+ fl_deselect_browser(dialog_->browser_suggestions);
+ }
+ }
+
+ return ButtonPolicy::SMI_VALID;
+}
+} // namespace frontend
+} // namespace lyx