mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-11 21:49:51 +00:00
b1e1c598c4
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@5893 a592a061-630c-0410-9148-cb99ea01b6c8
227 lines
6.0 KiB
C
227 lines
6.0 KiB
C
/**
|
|
* \file FormSpellchecker.C
|
|
* 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 "xformsBC.h"
|
|
#include "ControlSpellchecker.h"
|
|
#include "FormSpellchecker.h"
|
|
#include "forms/form_spellchecker.h"
|
|
|
|
#include "forms_gettext.h"
|
|
#include "Tooltips.h"
|
|
#include "xforms_helpers.h"
|
|
#include "support/lstrings.h"
|
|
|
|
#include FORMS_H_LOCATION
|
|
|
|
typedef FormCB<ControlSpellchecker, FormDB<FD_spellchecker> > base_class;
|
|
|
|
|
|
FormSpellchecker::FormSpellchecker()
|
|
: base_class(_("Spellchecker")), state_(STOPPED)
|
|
{}
|
|
|
|
|
|
void FormSpellchecker::build()
|
|
{
|
|
dialog_.reset(build_spellchecker(this));
|
|
|
|
// Manage the buttons
|
|
bc().setCancel(dialog_->button_close);
|
|
|
|
// disable for read-only documents
|
|
bc().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 = _("Start the spellingchecker.");
|
|
tooltips().init(dialog_->button_start, str);
|
|
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::updateState(State state)
|
|
{
|
|
switch (state) {
|
|
case READY_TO_START:
|
|
fl_set_slider_value(dialog_->slider_progress, 0.0);
|
|
fl_set_object_label(dialog_->slider_progress, "0 %");
|
|
break;
|
|
|
|
case CHECKING:
|
|
{
|
|
// 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 STARTED:
|
|
{
|
|
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());
|
|
break;
|
|
}
|
|
|
|
case STOPPED:
|
|
{
|
|
controller().stop();
|
|
|
|
double const wordcount = controller().getCount();
|
|
|
|
fl_set_slider_bounds(dialog_->slider_progress, 0.0, wordcount);
|
|
fl_set_slider_value(dialog_->slider_progress, wordcount);
|
|
fl_set_object_label(dialog_->slider_progress, "100 %");
|
|
break;
|
|
}
|
|
}
|
|
|
|
bool const state_change = state_ != state;
|
|
state_ = state;
|
|
|
|
if (!state_change)
|
|
return;
|
|
|
|
bool const running = (state == STARTED || state == CHECKING);
|
|
string const label = running ? _("Stop|#S") : _("Start|#S");
|
|
|
|
fl_set_object_label(dialog_->button_start, idex(label).c_str());
|
|
fl_set_button_shortcut(dialog_->button_start, scex(label).c_str(), 1);
|
|
fl_redraw_object(dialog_->button_start);
|
|
|
|
string const tip = running ?
|
|
_("Stop the spellingchecker.") :
|
|
_("Start the spellingchecker.");
|
|
tooltips().init(dialog_->button_start, tip);
|
|
|
|
setEnabled(dialog_->button_replace, running);
|
|
setEnabled(dialog_->button_ignore, running);
|
|
setEnabled(dialog_->button_accept, running);
|
|
setEnabled(dialog_->button_add, running);
|
|
setEnabled(dialog_->browser_suggestions, running);
|
|
setEnabled(dialog_->input_replacement, running);
|
|
}
|
|
|
|
|
|
void FormSpellchecker::update()
|
|
{
|
|
// clear input fields
|
|
fl_set_input(dialog_->input_replacement, "");
|
|
fl_set_object_label(dialog_->text_unknown, "");
|
|
fl_clear_browser(dialog_->browser_suggestions);
|
|
|
|
// reset dialog and buttons into start condition
|
|
updateState(READY_TO_START);
|
|
}
|
|
|
|
|
|
ButtonPolicy::SMInput FormSpellchecker::input(FL_OBJECT * ob, long ob_value)
|
|
{
|
|
if (ob == dialog_->button_start) {
|
|
updateState(STARTED);
|
|
controller().check();
|
|
|
|
} else if (ob == dialog_->button_replace) {
|
|
string const tmp = getString(dialog_->input_replacement);
|
|
controller().replace(tmp);
|
|
|
|
} 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;
|
|
}
|
|
|
|
|
|
void FormSpellchecker::partialUpdate(int id)
|
|
{
|
|
switch (id) {
|
|
case 1:
|
|
// Set suggestions.
|
|
updateState(CHECKING);
|
|
break;
|
|
case 2:
|
|
// End of spell checking.
|
|
updateState(STOPPED);
|
|
break;
|
|
}
|
|
}
|