]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/xforms/DropDown.C
Yet more dialog tweaking from Rob.
[lyx.git] / src / frontends / xforms / DropDown.C
index 455b20e22023efd97ee089d596654e9275f0fa87..8fc54eb6773677852d27a1e1465b9cf43e670660 100644 (file)
@@ -1,58 +1,87 @@
 /**
  * \file DropDown.C
- * Copyright 2001 the LyX Team
- * Read the file COPYING
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
  *
- * \author John Levon <moz@compsoc.man.ac.uk>
+ * \author John Levon
+ *
+ * Full author contact details are available in file CREDITS
  */
 
+#include <config.h>
+
+#ifdef __GNUG__
+#pragma implementation
+#endif
+
 #include "DropDown.h"
+#include "xforms_helpers.h"
+
+#include FORMS_H_LOCATION
 
 #include <iostream>
-extern "C" void C_DropDownCompletedCB(FL_OBJECT * ob, long)
+#include <cctype>
+
+#ifndef CXX_GLOBAL_CSTD
+using std::isprint;
+#endif
+
+using std::vector;
+
+
+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));
 }
-DropDown::DropDown(LyXView * lv, FL_OBJECT * ob)
-       : lv_(lv)
+
+} // namespace anon
+
+
+DropDown::DropDown(FL_OBJECT * ob)
 {
        form_ = fl_bgn_form(FL_NO_BOX, ob->w, 100);
        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();
 }
 
+
 DropDown::~DropDown()
 {
-       if (form_->visible) 
+       if (form_->visible)
                fl_hide_form(form_);
        fl_free_form(form_);
 }
 
-void DropDown::select(std::vector<string> const & choices, int x, int y, int w)
+
+void DropDown::select(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) {
+
+       vector<string>::const_iterator cit = choices.begin();
+       vector<string>::const_iterator end = choices.end();
+       for (; cit != 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,
@@ -66,9 +95,9 @@ void DropDown::line_up()
        if (fl_get_browser(browser_) > 1)
                fl_select_browser_line(browser_, fl_get_browser(browser_) - 1);
        if (fl_get_browser(browser_) >= fl_get_browser_topline(browser_) +
-               fl_get_browser_screenlines(browser_))
-                       fl_set_browser_topline(browser_, fl_get_browser(browser_)
-                               - fl_get_browser_screenlines(browser_) + 1);
+           fl_get_browser_screenlines(browser_))
+               fl_set_browser_topline(browser_, fl_get_browser(browser_)
+                                      - fl_get_browser_screenlines(browser_) + 1);
        if (fl_get_browser(browser_) < fl_get_browser_topline(browser_))
                fl_set_browser_topline(browser_, fl_get_browser(browser_));
 }
@@ -79,13 +108,13 @@ void DropDown::line_down()
        if (fl_get_browser(browser_) < fl_get_browser_maxline(browser_))
                fl_select_browser_line(browser_, fl_get_browser(browser_) + 1);
        if (fl_get_browser(browser_) >= fl_get_browser_topline(browser_) +
-               fl_get_browser_screenlines(browser_))
-                       fl_set_browser_topline(browser_, fl_get_browser(browser_)
-                               - fl_get_browser_screenlines(browser_) + 1);
+           fl_get_browser_screenlines(browser_))
+               fl_set_browser_topline(browser_, fl_get_browser(browser_)
+                                      - fl_get_browser_screenlines(browser_) + 1);
        if (fl_get_browser(browser_) < fl_get_browser_topline(browser_))
                fl_set_browser_topline(browser_, fl_get_browser(browser_));
 }
+
 
 int DropDown::peek(XEvent * xev)
 {
@@ -93,10 +122,10 @@ int DropDown::peek(XEvent * xev)
        unsigned int keymask;
 
        fl_get_mouse(&x, &y, &keymask);
+
        if (xev->type == ButtonPress) {
                if (!(x >= form_->x && x <= (form_->x + form_->w) &&
-                       y >= form_->y && y << (form_->y + form_->h))) {
+                     y >= form_->y && y << (form_->y + form_->h))) {
                        fl_hide_form(form_);
                        return 1;
                }
@@ -106,43 +135,57 @@ int DropDown::peek(XEvent * xev)
                KeySym keysym_return;
                XLookupString(&xev->xkey, s_r, 10, &keysym_return, 0);
                switch (keysym_return) {
-                       case XK_Down:
-                               line_down();
-                               return 1;
-                       case XK_Up:
-                               line_up();
-                               return 1;
-                       case XK_Return:
-                               completed(); 
-                               return 1;
-                       case XK_Escape:
-                               fl_select_browser_line(browser_, 0);
-                               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. 
-                               fl_select_browser_line(browser_, 0);
-                               completed();
+               case XK_Down:
+#ifdef XK_KP_Down
+               case XK_KP_Down:
+#endif
+                       line_down();
+                       return 1;
+               case XK_Up:
+#ifdef XK_KP_Up
+               case XK_KP_Up:
+#endif
+                       line_up();
+                       return 1;
+               case XK_Return:
+#ifdef XK_KP_Enter
+               case XK_KP_Enter:
+#endif
+                       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; 
+       return 0;
 }
 
+
 void DropDown::completed()
 {
        XUngrabPointer(fl_get_display(), CurrentTime);
-       string selection;
-       int i = fl_get_browser(browser_);
-       if (i < 1)
-               selection = "";
-       else
-               selection = fl_get_browser_line(browser_, i); 
        fl_hide_form(form_);
+       result(getString(browser_));
+}
 
-       result.emit(selection);
+
+void DropDown::key_pressed(char c)
+{
+       XUngrabPointer(fl_get_display(), CurrentTime);
+       fl_hide_form(form_);
+       keypress(c);
 }