3 * Copyright 2001 the LyX Team
4 * Read the file COPYING
6 * \author John Levon <moz@compsoc.man.ac.uk>
15 extern "C" void C_DropDownCompletedCB(FL_OBJECT * ob, long)
17 DropDown * d = static_cast<DropDown*>(ob->form->u_vdata);
22 extern "C" int C_DropDownPeekEventCB(FL_FORM * form, void *xev)
24 DropDown * d = static_cast<DropDown*>(form->u_vdata);
25 return d->peek(static_cast<XEvent*>(xev));
29 DropDown::DropDown(LyXView * lv, FL_OBJECT * ob)
32 form_ = fl_bgn_form(FL_NO_BOX, ob->w, 100);
33 fl_add_box(FL_UP_BOX, 0, 0, ob->w, 100, "");
34 browser_ = fl_add_browser(FL_SELECT_BROWSER, 0, 0, ob->w, 100, "");
35 form_->u_vdata = this;
36 fl_set_browser_dblclick_callback(browser_, C_DropDownCompletedCB, 0);
37 fl_register_raw_callback(form_, KeyPressMask|ButtonPressMask, C_DropDownPeekEventCB);
50 void DropDown::select(std::vector<string> const & choices, int x, int y, int w)
52 fl_set_form_geometry(form_, x, y, w, 100);
53 fl_clear_browser(browser_);
54 for (std::vector<string>::const_iterator cit = choices.begin();
55 cit != choices.end(); ++cit) {
56 fl_add_browser_line(browser_, cit->c_str());
58 fl_show_form(form_, FL_PLACE_POSITION, FL_NOBORDER, "");
59 XGrabPointer(fl_get_display(), form_->window, false,
60 ButtonPressMask | ButtonReleaseMask | PointerMotionMask,
61 GrabModeAsync, GrabModeAsync, 0, 0, 0);
62 XFlush(fl_get_display());
66 void DropDown::line_up()
68 if (fl_get_browser(browser_) > 1)
69 fl_select_browser_line(browser_, fl_get_browser(browser_) - 1);
70 if (fl_get_browser(browser_) >= fl_get_browser_topline(browser_) +
71 fl_get_browser_screenlines(browser_))
72 fl_set_browser_topline(browser_, fl_get_browser(browser_)
73 - fl_get_browser_screenlines(browser_) + 1);
74 if (fl_get_browser(browser_) < fl_get_browser_topline(browser_))
75 fl_set_browser_topline(browser_, fl_get_browser(browser_));
79 void DropDown::line_down()
81 if (fl_get_browser(browser_) < fl_get_browser_maxline(browser_))
82 fl_select_browser_line(browser_, fl_get_browser(browser_) + 1);
83 if (fl_get_browser(browser_) >= fl_get_browser_topline(browser_) +
84 fl_get_browser_screenlines(browser_))
85 fl_set_browser_topline(browser_, fl_get_browser(browser_)
86 - fl_get_browser_screenlines(browser_) + 1);
87 if (fl_get_browser(browser_) < fl_get_browser_topline(browser_))
88 fl_set_browser_topline(browser_, fl_get_browser(browser_));
92 int DropDown::peek(XEvent * xev)
97 fl_get_mouse(&x, &y, &keymask);
99 if (xev->type == ButtonPress) {
100 if (!(x >= form_->x && x <= (form_->x + form_->w) &&
101 y >= form_->y && y << (form_->y + form_->h))) {
105 XUngrabPointer(fl_get_display(), CurrentTime);
106 } else if (xev->type == KeyPress) {
107 char s_r[10]; s_r[9] = '\0';
108 KeySym keysym_return;
109 XLookupString(&xev->xkey, s_r, 10, &keysym_return, 0);
110 switch (keysym_return) {
121 fl_select_browser_line(browser_, 0);
125 // FIXME: if someone has a got a way to
126 // convince the event to fall back to the
127 // minibuffer, I'm glad to hear it.
128 // fl_XPutBackEvent() doesn't work.
129 fl_select_browser_line(browser_, 0);
138 void DropDown::completed()
140 XUngrabPointer(fl_get_display(), CurrentTime);
142 int i = fl_get_browser(browser_);
146 selection = fl_get_browser_line(browser_, i);
149 result.emit(selection);