]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/xforms/FormSpellchecker.C
Bugfixes: checkboxes to radiobuttons (from J�rgen S) and remove a little
[lyx.git] / src / frontends / xforms / FormSpellchecker.C
index 8e1cde6f0f8b5e986f0ffa3ef901fd62f35c6048..396c1399ebb6545af6d55713333660abee1687b7 100644 (file)
@@ -13,6 +13,7 @@
 #endif
 
 #include "xformsBC.h"
+#include "xforms_helpers.h"
 #include "ControlSpellchecker.h"
 #include "FormSpellchecker.h"
 #include "form_spellchecker.h"
@@ -20,7 +21,7 @@
 typedef FormCB<ControlSpellchecker, FormDB<FD_form_spellchecker> > base_class;
 
 FormSpellchecker::FormSpellchecker(ControlSpellchecker & c)
-       : base_class(c, _("LyX: Spellchecker")), clickline_(-1)
+       : base_class(c, _("LyX: Spellchecker"), false)
 {}
 
 
@@ -28,6 +29,12 @@ 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);
+
+       fl_set_browser_dblclick_callback(dialog_->browser,
+                                        C_FormBaseInputCB, 2);
+
        // Manage the buttons
        bc().setCancel(dialog_->done);
        bc().addReadOnly(dialog_->replace);
@@ -36,47 +43,63 @@ void FormSpellchecker::build()
        bc().addReadOnly(dialog_->ignore);
        bc().addReadOnly(dialog_->start);
        bc().addReadOnly(dialog_->stop);
+       bc().addReadOnly(dialog_->browser);
 }
 
 void FormSpellchecker::update()
 {
-       string w = "";
+       string const 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 ;
 }
 
-
-ButtonPolicy::SMInput FormSpellchecker::input(FL_OBJECT * obj, long)
+ButtonPolicy::SMInput FormSpellchecker::input(FL_OBJECT * obj, long val)
 {
        if (obj == dialog_->replace) {
-               string tmp = fl_get_input(dialog_->input);
+               string const tmp = getStringFromInput(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);
+               stop(false);
+
+       } else if (obj == dialog_->stop) {
+               controller().stop();
+               stop(true);
+
        } 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);
+               int const line = fl_get_browser(dialog_->browser);
+               string const tmp =
+                       getStringFromBrowser(dialog_->browser, line);
+               if (tmp.empty())
+                       return ButtonPolicy::SMI_NOOP;
+
+               if (val != 2) {
+                       // single-click
+                       // place the chosen string in the input as feedback
+                       fl_set_input(dialog_->input, 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);
                }
-               clickline_ = sel;
-               string tmp = fl_get_browser_line(dialog_->browser, clickline_);
-               fl_set_input(dialog_->input, tmp.c_str());
        }
 
        return ButtonPolicy::SMI_VALID;
@@ -84,22 +107,30 @@ ButtonPolicy::SMInput FormSpellchecker::input(FL_OBJECT * obj, long)
 
 void FormSpellchecker::partialUpdate(int id)
 {
-       // set suggestions
-       if (id==0) {
-               // set progress bar (always)
+       switch (id) {
+       case 0:
+               // set progress bar
                fl_set_slider_value(dialog_->slider,
                                    controller().getProgress());
-       } else if (id==1) {
+               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() ) {
+               while ( !(w = controller().getSuggestion()).empty() ) {
                        fl_add_browser_line(dialog_->browser, w.c_str());
                }
-       } else if (id==2) {
+       }
+               break;
+       case 2:
+               // show exit message
                fl_show_messages(controller().getMessage().c_str());
+               hide();
        }
+       
 }
 
                
@@ -108,7 +139,14 @@ void FormSpellchecker::showMessage(const char * msg)
        fl_show_message(msg, "", "");
 }
 
-// note there is a button accept in session
-// it is not clear whether this is ingoreall or replaceall
-
-
+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);
+}