]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/xforms/FormSpellchecker.C
Yet more dialog tweaking from Rob.
[lyx.git] / src / frontends / xforms / FormSpellchecker.C
index 1f1ac9a37fdfe6863b6176e119e5cbcd756f90ad..ff70ad6bccecc5f293bb287ce31a988185745403 100644 (file)
@@ -1,9 +1,11 @@
 /**
  * \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>
 #pragma implementation
 #endif
 
+#include "Tooltips.h"
 #include "xformsBC.h"
 #include "xforms_helpers.h"
 #include "ControlSpellchecker.h"
 #include "FormSpellchecker.h"
-#include "form_spellchecker.h"
+#include "forms/form_spellchecker.h"
+#include FORMS_H_LOCATION
 
-typedef FormCB<ControlSpellchecker, FormDB<FD_form_spellchecker> > base_class;
+typedef FormCB<ControlSpellchecker, FormDB<FD_spellchecker> > base_class;
 
-FormSpellchecker::FormSpellchecker(ControlSpellchecker & c)
-       : base_class(c, _("LyX: Spellchecker")), clickline_(-1)
+FormSpellchecker::FormSpellchecker()
+       : base_class(_("Spellchecker"))
 {}
 
 
 void FormSpellchecker::build()
 {
-       dialog_.reset(build_spellchecker());
-       
+       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_->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().setCancel(dialog_->button_close);
+       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);
+
+       // set up the tooltips
+       string str = _("Type replacement for unknown word "
+                       " or select from suggestions.");
+       tooltips().init(dialog_->input, str);
+       str = _("List of replacement suggestions from dictionary.");
+       tooltips().init(dialog_->browser, str);
+       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);
 }
 
 void FormSpellchecker::update()
 {
-       string w = "";
-       fl_set_input(dialog_->input, w.c_str());
-       fl_set_object_label(dialog_->text, w.c_str());
+       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);
 }
 
-void FormSpellchecker::hide()
-{
-       clickline_ = -1;
-       
-       if (form() && form()->visible)
-               fl_hide_form(form());
-}
-
-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);
+       if (obj == dialog_->button_replace) {
+               string const tmp = getString(dialog_->input);
                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 (obj == dialog_->button_start) {
+               if (start())
+                       controller().check();
+               else
+                       controller().stop();
+
+       } else if (obj == dialog_->button_ignore) {
                controller().check();
-       } else if (obj == dialog_->accept) {
+
+       } else if (obj == dialog_->button_accept) {
                controller().ignoreAll();
-       } else if (obj == dialog_->insert) {
+
+       } else if (obj == dialog_->button_add) {
                controller().insert();
-       } 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 =
+                       getString(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;
@@ -105,33 +135,49 @@ void FormSpellchecker::partialUpdate(int id)
                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());
                }
        }
-               break;
+       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)
+bool FormSpellchecker::start(bool init)
 {
-       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);
+       static bool running = false;
+
+       if (init) {
+               running = false;
+       } else {
+               running = !running;
+       }
+
+       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;
 }