X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fxforms%2FFormSpellchecker.C;h=04449d33cad844aa0f9b490f88e9bac93cbd510a;hb=4c6e0fe4226ce3b55d13726977f1e579f17c2ad1;hp=53ac06cdf5b94a394add7333b13d352bc20616fe;hpb=711b3e0c8a0cb245ca5715dfe6df319d5db6a0fd;p=lyx.git diff --git a/src/frontends/xforms/FormSpellchecker.C b/src/frontends/xforms/FormSpellchecker.C index 53ac06cdf5..04449d33ca 100644 --- a/src/frontends/xforms/FormSpellchecker.C +++ b/src/frontends/xforms/FormSpellchecker.C @@ -1,146 +1,151 @@ /** * \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 -#ifdef __GNUG__ -#pragma implementation -#endif +#include "FormSpellchecker.h" +#include "ControlSpellchecker.h" +#include "forms/form_spellchecker.h" -#include "xformsBC.h" +#include "Tooltips.h" #include "xforms_helpers.h" -#include "ControlSpellchecker.h" -#include "FormSpellchecker.h" -#include "form_spellchecker.h" +#include "xformsBC.h" + +#include "support/tostr.h" + +#include "lyx_forms.h" -typedef FormCB > base_class; -FormSpellchecker::FormSpellchecker(ControlSpellchecker & c) - : base_class(c, _("LyX: Spellchecker"), false), clickline_(-1) +typedef FormCB > base_class; + +FormSpellchecker::FormSpellchecker() + : base_class(_("Spell-check Document")) {} void FormSpellchecker::build() { - dialog_.reset(build_spellchecker()); - - fl_set_slider_bounds(dialog_->slider, 0.0, 100.0); - fl_set_slider_step(dialog_->slider, 1.0); + 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); - bc().addReadOnly(dialog_->browser); + 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_FormBaseInputCB, 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); -} -void FormSpellchecker::hide() +void FormSpellchecker::partialUpdate(int s) { - clickline_ = -1; - - if (form() && form()->visible) - fl_hide_form(form()); + ControlSpellchecker::State const state = + static_cast(s); + + switch (state) { + + case ControlSpellchecker::SPELL_FOUND_WORD: { + // Set suggestions. + string w = controller().getWord(); + 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()); + } + // 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; + } + + } } -ButtonPolicy::SMInput FormSpellchecker::input(FL_OBJECT * obj, long) + +ButtonPolicy::SMInput FormSpellchecker::input(FL_OBJECT * ob, long ob_value) { - if (obj == dialog_->replace) { - string const tmp = fl_get_input(dialog_->input); + if (ob == dialog_->button_replace) { + string const tmp = getString(dialog_->input_replacement); controller().replace(tmp); - } else if (obj == dialog_->start) { - controller().check(); - stop(false); - } else if (obj == dialog_->stop) { - controller().stop(); - stop(true); - } else if (obj == dialog_->ignore) { + + } else if (ob == dialog_->button_ignore) { controller().check(); - } else if (obj == dialog_->accept) { + + } else if (ob == dialog_->button_accept) { controller().ignoreAll(); - } else if (obj == dialog_->insert) { + + } else if (ob == dialog_->button_add) { controller().insert(); - } else if (obj == dialog_->options) { - controller().options(); - } else if (obj == dialog_->browser) { - int const sel = fl_get_browser(dialog_->browser); - if (sel < 1) + + } else if (ob == dialog_->browser_suggestions) { + string const tmp = getString(dialog_->browser_suggestions); + if (tmp.empty()) return ButtonPolicy::SMI_NOOP; - if (clickline_ == sel) { - string const tmp = fl_get_input(dialog_->input); + 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); } - - clickline_ = sel; - char const * cptmp = fl_get_browser_line(dialog_->browser, - clickline_); - string const tmp = (cptmp) ? cptmp : ""; - fl_set_input(dialog_->input, tmp.c_str()); } return ButtonPolicy::SMI_VALID; } - -void FormSpellchecker::partialUpdate(int id) -{ - switch (id) { - case 0: - // set progress bar - fl_set_slider_value(dialog_->slider, - controller().getProgress()); - break; - case 1: - { - // 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()); - } - } - break; - case 2: - // show exit message - fl_show_messages(controller().getMessage().c_str()); - hide(); - } - -} - - -void FormSpellchecker::showMessage(const char * msg) -{ - fl_show_message(msg, "", ""); -} - -void FormSpellchecker::stop(bool stop) -{ - setEnabled(dialog_->start, stop); - setEnabled(dialog_->replace, !stop); - setEnabled(dialog_->ignore, !stop); - setEnabled(dialog_->accept, !stop); - setEnabled(dialog_->insert, !stop); - setEnabled(dialog_->stop, !stop); - setEnabled(dialog_->browser, !stop); - setEnabled(dialog_->input, !stop); -}