3 * Copyright 2001 the LyX Team
4 * Read the file COPYING
6 * \author John Levon, moz@compsoc.man.ac.uk
12 #pragma implementation
16 #include "xforms_helpers.h"
18 #include FORMS_H_LOCATION
24 #ifndef CXX_GLOBAL_CSTD
33 extern "C" void C_CompletedCB(FL_OBJECT * ob, long)
35 DropDown * d = static_cast<DropDown*>(ob->u_vdata);
40 extern "C" int C_PeekCB(FL_FORM * form, void *xev)
42 DropDown * d = static_cast<DropDown*>(form->u_vdata);
43 return d->peek(static_cast<XEvent*>(xev));
49 DropDown::DropDown(LyXView * lv, FL_OBJECT * ob)
52 form_ = fl_bgn_form(FL_NO_BOX, ob->w, 100);
53 fl_add_box(FL_UP_BOX, 0, 0, ob->w, 100, "");
54 browser_ = fl_add_browser(FL_SELECT_BROWSER, 0, 0, ob->w, 100, "");
55 form_->u_vdata = this;
56 browser_->u_vdata = this;
57 fl_set_object_callback(browser_, C_CompletedCB, 0);
58 fl_register_raw_callback(form_, KeyPressMask|ButtonPressMask, C_PeekCB);
71 void DropDown::select(vector<string> const & choices, int x, int y, int w)
76 fl_set_form_geometry(form_, x, y-100, w, 100);
77 fl_clear_browser(browser_);
79 vector<string>::const_iterator cit = choices.begin();
80 vector<string>::const_iterator end = choices.end();
81 for (; cit != end; ++cit) {
82 fl_add_browser_line(browser_, cit->c_str());
84 fl_select_browser_line(browser_, 1);
85 fl_show_form(form_, FL_PLACE_POSITION, FL_NOBORDER, "");
86 XGrabPointer(fl_get_display(), form_->window, false,
87 ButtonPressMask | ButtonReleaseMask | PointerMotionMask,
88 GrabModeAsync, GrabModeAsync, 0, 0, 0);
89 XFlush(fl_get_display());
93 void DropDown::line_up()
95 if (fl_get_browser(browser_) > 1)
96 fl_select_browser_line(browser_, fl_get_browser(browser_) - 1);
97 if (fl_get_browser(browser_) >= fl_get_browser_topline(browser_) +
98 fl_get_browser_screenlines(browser_))
99 fl_set_browser_topline(browser_, fl_get_browser(browser_)
100 - fl_get_browser_screenlines(browser_) + 1);
101 if (fl_get_browser(browser_) < fl_get_browser_topline(browser_))
102 fl_set_browser_topline(browser_, fl_get_browser(browser_));
106 void DropDown::line_down()
108 if (fl_get_browser(browser_) < fl_get_browser_maxline(browser_))
109 fl_select_browser_line(browser_, fl_get_browser(browser_) + 1);
110 if (fl_get_browser(browser_) >= fl_get_browser_topline(browser_) +
111 fl_get_browser_screenlines(browser_))
112 fl_set_browser_topline(browser_, fl_get_browser(browser_)
113 - fl_get_browser_screenlines(browser_) + 1);
114 if (fl_get_browser(browser_) < fl_get_browser_topline(browser_))
115 fl_set_browser_topline(browser_, fl_get_browser(browser_));
119 int DropDown::peek(XEvent * xev)
122 unsigned int keymask;
124 fl_get_mouse(&x, &y, &keymask);
126 if (xev->type == ButtonPress) {
127 if (!(x >= form_->x && x <= (form_->x + form_->w) &&
128 y >= form_->y && y << (form_->y + form_->h))) {
132 XUngrabPointer(fl_get_display(), CurrentTime);
133 } else if (xev->type == KeyPress) {
134 char s_r[10]; s_r[9] = '\0';
135 KeySym keysym_return;
136 XLookupString(&xev->xkey, s_r, 10, &keysym_return, 0);
137 switch (keysym_return) {
148 fl_deselect_browser(browser_);
152 // FIXME: if someone has a got a way to
153 // convince the event to fall back to the
154 // minibuffer, I'm glad to hear it.
155 // fl_XPutBackEvent() doesn't work.
157 // This is a bit less elegant perhaps, but works
158 // well enough. Angus 11 Jan 2002
159 if (s_r[0] && isprint(s_r[0])) {
169 void DropDown::completed()
171 XUngrabPointer(fl_get_display(), CurrentTime);
173 result(getSelectedStringFromBrowser(browser_));
177 void DropDown::key_pressed(char c)
179 XUngrabPointer(fl_get_display(), CurrentTime);