]> git.lyx.org Git - features.git/blobdiff - src/frontends/xforms/FormSpellchecker.C
(Rob Lahaye): updates to the xforms print, spellchecker, texinfo and wrap
[features.git] / src / frontends / xforms / FormSpellchecker.C
index ff70ad6bccecc5f293bb287ce31a988185745403..48464e88b541bccd840f62a38b0169965a53785c 100644 (file)
 #include "ControlSpellchecker.h"
 #include "FormSpellchecker.h"
 #include "forms/form_spellchecker.h"
+#include "support/lstrings.h"
+
 #include FORMS_H_LOCATION
 
 typedef FormCB<ControlSpellchecker, FormDB<FD_spellchecker> > base_class;
 
+
 FormSpellchecker::FormSpellchecker()
        : base_class(_("Spellchecker"))
 {}
@@ -33,27 +36,30 @@ void FormSpellchecker::build()
 {
        dialog_.reset(build_spellchecker(this));
 
-       fl_set_browser_dblclick_callback(dialog_->browser,
-                                        C_FormBaseInputCB, 2);
-
-       fl_set_input_return(dialog_->input, FL_RETURN_CHANGED);
-       setPrehandler(dialog_->input);
-
        // Manage the buttons
        bc().setCancel(dialog_->button_close);
+
+       // disable for read-only documents
        bc().addReadOnly(dialog_->button_replace);
-       bc().addReadOnly(dialog_->button_accept);
-       bc().addReadOnly(dialog_->button_add);
-       bc().addReadOnly(dialog_->button_ignore);
-       bc().addReadOnly(dialog_->button_start);
-       bc().addReadOnly(dialog_->browser);
+
+       // 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, str);
+       tooltips().init(dialog_->input_replacement, str);
        str = _("List of replacement suggestions from dictionary.");
-       tooltips().init(dialog_->browser, str);
+       tooltips().init(dialog_->browser_suggestions, str);
        str = _("Start the spellingchecker.");
        tooltips().init(dialog_->button_start, str);
        str = _("Replace unknown word.");
@@ -64,120 +70,134 @@ void FormSpellchecker::build()
        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()
 {
-       fl_set_input(dialog_->input, "");
-       fl_set_object_label(dialog_->text, "");
-       fl_clear_browser(dialog_->browser);
-       fl_set_slider_value(dialog_->slider, 0);
-       start(true);
+       // 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
+       input(0, 0);
+
+       // reset slider to zero count
+       fl_set_slider_value(dialog_->slider_progress, 0.0);
+       fl_set_object_label(dialog_->slider_progress, "0 %");
 }
 
-ButtonPolicy::SMInput FormSpellchecker::input(FL_OBJECT * obj, long val)
+
+ButtonPolicy::SMInput FormSpellchecker::input(FL_OBJECT * ob, long ob_value)
 {
-       if (obj == dialog_->button_replace) {
-               string const tmp = getString(dialog_->input);
-               controller().replace(tmp);
+       if (!ob || ob == dialog_->button_start) {
+               static bool running = false;
+
+               // update running status of spellingchecker
+               running = !running && ob == dialog_->button_start;
+
+               // modify text of Start/Stop button according to running status
+               string const labeltext = running ? _("Stop") : _("Start");
+               fl_set_object_label(dialog_->button_start, labeltext.c_str());  
+               fl_set_button_shortcut(dialog_->button_start, "#S", 1);
+               fl_show_object(dialog_->button_start);
+
+               // adjust tooltips to modified Start/Stop button
+               string const str = (running ? _("Stop the spellingchecker.") :
+                                       _("Start the spellingchecker."));
+               tooltips().init(dialog_->button_start, str);
+
+               // enable buttons according to running status
+               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);
+
+               // call controller if Start/Stop button is pressed
+               if (ob) {
+                       if (running)
+                               controller().check();
+                       else
+                               controller().stop();
+               }
 
-       } else if (obj == dialog_->button_start) {
-               if (start())
-                       controller().check();
-               else
-                       controller().stop();
+       } else if (ob == dialog_->button_replace) {
+               string const tmp = getString(dialog_->input_replacement);
+               controller().replace(tmp);
 
-       } else if (obj == dialog_->button_ignore) {
+       } else if (ob == dialog_->button_ignore) {
                controller().check();
 
-       } else if (obj == dialog_->button_accept) {
+       } else if (ob == dialog_->button_accept) {
                controller().ignoreAll();
 
-       } else if (obj == dialog_->button_add) {
+       } else if (ob == dialog_->button_add) {
                controller().insert();
 
-       } else if (obj == dialog_->browser) {
-               int const line = fl_get_browser(dialog_->browser);
-               string const tmp =
-                       getString(dialog_->browser, line);
+       } else if (ob == dialog_->browser_suggestions) {
+               string const tmp = getString(dialog_->browser_suggestions);
                if (tmp.empty())
                        return ButtonPolicy::SMI_NOOP;
 
-               if (val != 2) {
+               if (ob_value != 2) {
                        // single-click
                        // place the chosen string in the input as feedback
-                       fl_set_input(dialog_->input, tmp.c_str());
+                       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_line(dialog_->browser, line);
+                       fl_deselect_browser(dialog_->browser_suggestions);
                }
        }
 
+       // update slider with word count and progress
+       double const wordcount = controller().getCount();
+       if (wordcount > 0.0) {
+               int const progress = controller().getProgress();
+               double const total = 100.0 * wordcount / 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,
+                                       (tostr(progress) + " %").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
+       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);
+               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, w.c_str());
+                       fl_add_browser_line(dialog_->browser_suggestions, w.c_str());
                }
-       }
-       break;
-       case 2:
-               // show exit message
-               fl_show_messages(controller().getMessage().c_str());
-               hide();
-       }
-}
-
+               }
+               break;
+       case 2: // end of spell checking
 
-void FormSpellchecker::showMessage(const char * msg)
-{
-       fl_show_message(msg, "", "");
-}
+               // reset dialog and buttons into start condition
+               input(0, 0);
 
-bool FormSpellchecker::start(bool init)
-{
-       static bool running = false;
+               // set slider 'finished' status
+               fl_set_slider_bounds(dialog_->slider_progress, 0.0, controller().getCount());
+               fl_set_slider_value(dialog_->slider_progress, controller().getCount());
+               fl_set_object_label(dialog_->slider_progress, "100 %");
 
-       if (init) {
-               running = false;
-       } else {
-               running = !running;
+               break;
        }
-
-       fl_set_object_label(dialog_->button_start,
-                       (running ? _("Stop") : _("Start")));    
-       fl_set_button_shortcut(dialog_->button_start, "#S", 1);
-       fl_show_object(dialog_->button_start);
-
-       string const str = (running ? _("Stop the spellingchecker.") :
-                                       _("Start the spellingchecker."));
-       tooltips().init(dialog_->button_start, str);
-
-       setEnabled(dialog_->button_replace, running);
-       setEnabled(dialog_->button_ignore, running);
-       setEnabled(dialog_->button_accept, running);
-       setEnabled(dialog_->button_add, running);
-       setEnabled(dialog_->browser, running);
-       setEnabled(dialog_->input, running);
-       
-       return running;
 }