]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/xforms/DropDown.C
Yet another tweak from J�rgen.
[lyx.git] / src / frontends / xforms / DropDown.C
index ebd3cac6fa0f78ebf6582f821208009336ed64d1..6d8791e12a78f0b6f658a236aca0ab2b6534f689 100644 (file)
@@ -6,23 +6,31 @@
  * \author John Levon <moz@compsoc.man.ac.uk>
  */
 
+#include <config.h>
+
 #include "DropDown.h"
+#include "xforms_helpers.h"
 
 #include <iostream>
+#include <cctype>
  
-extern "C" void C_DropDownCompletedCB(FL_OBJECT * ob, long)
+namespace {
+       
+extern "C" void C_CompletedCB(FL_OBJECT * ob, long)
 {
-       DropDown * d = static_cast<DropDown*>(ob->form->u_vdata);
+       DropDown * d = static_cast<DropDown*>(ob->u_vdata);
        d->completed();
 }
 
  
-extern "C" int C_DropDownPeekEventCB(FL_FORM * form, void *xev)
+extern "C" int C_PeekCB(FL_FORM * form, void *xev)
 {
        DropDown * d = static_cast<DropDown*>(form->u_vdata);
        return d->peek(static_cast<XEvent*>(xev));
 }
  
+} // namespace anon
+
  
 DropDown::DropDown(LyXView * lv, FL_OBJECT * ob)
        : lv_(lv)
@@ -31,8 +39,9 @@ DropDown::DropDown(LyXView * lv, FL_OBJECT * ob)
        fl_add_box(FL_UP_BOX, 0, 0, ob->w, 100, "");
        browser_ = fl_add_browser(FL_SELECT_BROWSER, 0, 0, ob->w, 100, "");
        form_->u_vdata = this;
-       fl_set_browser_dblclick_callback(browser_, C_DropDownCompletedCB, 0);
-       fl_register_raw_callback(form_, KeyPressMask|ButtonPressMask, C_DropDownPeekEventCB);
+        browser_->u_vdata = this;
+       fl_set_object_callback(browser_, C_CompletedCB, 0);
+       fl_register_raw_callback(form_, KeyPressMask|ButtonPressMask, C_PeekCB);
        fl_end_form();
 }
 
@@ -47,12 +56,16 @@ DropDown::~DropDown()
 
 void DropDown::select(std::vector<string> const & choices, int x, int y, int w)
 {
-       fl_set_form_geometry(form_, x, y, w, 100);
+       if (choices.empty())
+               return;
+
+       fl_set_form_geometry(form_, x, y-100, w, 100);
        fl_clear_browser(browser_);
        for (std::vector<string>::const_iterator cit = choices.begin();
                cit != choices.end(); ++cit) {
                fl_add_browser_line(browser_, cit->c_str());
        }
+       fl_select_browser_line(browser_, 1);
        fl_show_form(form_, FL_PLACE_POSITION, FL_NOBORDER, "");
        XGrabPointer(fl_get_display(), form_->window, false,
                     ButtonPressMask | ButtonReleaseMask | PointerMotionMask,
@@ -100,6 +113,7 @@ int DropDown::peek(XEvent * xev)
                        fl_hide_form(form_);
                        return 1;
                }
+               XUngrabPointer(fl_get_display(), CurrentTime);
        } else if (xev->type == KeyPress) {
                char s_r[10]; s_r[9] = '\0';
                KeySym keysym_return;
@@ -114,6 +128,22 @@ int DropDown::peek(XEvent * xev)
                        case XK_Return:
                                completed(); 
                                return 1;
+                       case XK_Escape:
+                               fl_deselect_browser(browser_);
+                               completed();
+                               return 1;
+                       default:
+                               // FIXME: if someone has a got a way to
+                               // convince the event to fall back to the
+                               // minibuffer, I'm glad to hear it.
+                               // fl_XPutBackEvent() doesn't work. 
+
+                               // This is a bit less elegant perhaps, but works
+                               // well enough. Angus 11 Jan 2002
+                               if (s_r[0] && isprint(s_r[0])) {
+                                       key_pressed(s_r[0]);
+                                       return 1;
+                               }
                }
        }
        return 0; 
@@ -122,13 +152,15 @@ int DropDown::peek(XEvent * xev)
  
 void DropDown::completed()
 {
-       string selection;
-       int i = fl_get_browser(browser_);
-       if (i == -1)
-               selection = "";
-       else
-               selection = fl_get_browser_line(browser_, i); 
+       XUngrabPointer(fl_get_display(), CurrentTime);
        fl_hide_form(form_);
+       result.emit(getSelectedStringFromBrowser(browser_));
+}
+
 
-       result.emit(selection);
+void DropDown::key_pressed(char c)
+{
+       XUngrabPointer(fl_get_display(), CurrentTime);
+       fl_hide_form(form_);
+       keypress.emit(c);
 }