* encapsulated to get a combobox-like object. All XForms
* functions are hidden.
*
- * GNU Copyleft (C) 1996 Alejandro Aguilar Sierra <asierra@servidor.unam.mx>
+ * GNU Copyleft 1996 Alejandro Aguilar Sierra <asierra@servidor.unam.mx>
* and the LyX Team.
*
* Dependencies: Only XForms, but created to be used with LyX.
#endif
#include "combox.h"
-#include <string.h>
+#include <cstring>
-#include "error.h"
+#include "debug.h"
-// $Id: combox.C,v 1.1 1999/09/27 18:44:37 larsbj Exp $
-
-#if !defined(lint) && !defined(WITH_WARNINGS)
-static char vcid[] = "$Id: combox.C,v 1.1 1999/09/27 18:44:37 larsbj Exp $";
-#endif /* lint */
+using std::endl;
+// These are C wrappers around static members of Combox, used as
+// callbacks for xforms.
+extern "C" void C_Combox_input_cb(FL_OBJECT *ob, long);
+extern "C" void C_Combox_combo_cb(FL_OBJECT *ob, long data) ;
+extern "C" int C_Combox_peek_event(FL_FORM * form, void *xev);
Combox::Combox(combox_type t): type(t)
{
void Combox::remove()
{
- //lyxerr.print(LString("Button: ") + int(button));
+ lyxerr.debug() << "Button: " << button << endl;
if (button) {
fl_delete_object(button);
fl_free_object(button);
}
- //lyxerr.print(LString("Label: ") + int(label));
- if (label && label!=button) {
+ lyxerr.debug() << "Label: " << label << endl;
+ if (label && label!= button) {
fl_delete_object(label);
fl_free_object(label);
}
- //lyxerr.print(LString("Form: ") + int(form));
- //lyxerr.print(LString("Browser: ") + int(browser));
+ lyxerr.debug() << "Form: " << form << endl;
+ lyxerr.debug() << "Browser: " << browser << endl;
if (form && browser) {
fl_delete_object(browser);
fl_free_object(browser);
bool Combox::select_text(char const* t)
{
if (!browser || !t) return false;
- for (int i=1; i<=fl_get_browser_maxline(browser); i++) {
+ for (int i = 1; i <= fl_get_browser_maxline(browser); ++i) {
if (!strcmp(t, fl_get_browser_line(browser, i))) {
select(i);
return true;
void Combox::select(int i)
{
if (!browser || !button) return;
- if (i>0 && i<=fl_get_browser_maxline(browser)) sel = i;
+ if (i>0 && i<= fl_get_browser_maxline(browser)) sel = i;
fl_deactivate_object(button);
if (type == FL_COMBOX_INPUT)
case FL_COMBOX_DROPLIST:
{
button = obj = fl_add_button(FL_NORMAL_BUTTON,
- x+w-22,y,22,hmin,"@2->");
- fl_set_object_color(obj,FL_MCOL, FL_MCOL);
+ x+w-22, y, 22, hmin, "@2->");
+ fl_set_object_color(obj, FL_MCOL, FL_MCOL);
fl_set_object_dblbuffer(obj, 1);
- fl_set_object_callback(obj,combo_cb,0);
- label = obj = fl_add_button(FL_NORMAL_TEXT,x,y,w-22,hmin,"");
- fl_set_object_boxtype(obj,FL_DOWN_BOX);
- fl_set_object_color(obj,FL_MCOL,FL_BLACK);
- fl_set_object_lalign(obj,FL_ALIGN_CENTER|FL_ALIGN_INSIDE);
+ fl_set_object_callback(obj, C_Combox_combo_cb, 0);
+ label = obj = fl_add_button(FL_NORMAL_TEXT, x, y, w-22, hmin, "");
+ fl_set_object_boxtype(obj, FL_DOWN_BOX);
+ fl_set_object_color(obj, FL_MCOL, FL_BLACK);
+ fl_set_object_lalign(obj, FL_ALIGN_CENTER|FL_ALIGN_INSIDE);
fl_set_object_dblbuffer(obj, 1);
- fl_set_object_callback(obj,combo_cb,0);
+ fl_set_object_callback(obj, C_Combox_combo_cb, 0);
break;
}
case FL_COMBOX_NORMAL:
{
- button = obj = fl_add_button(FL_NORMAL_BUTTON,x,y,w,hmin,"");
- fl_set_object_color(obj,FL_MCOL, FL_MCOL);
- fl_set_object_boxtype(obj,FL_DOWN_BOX);
- fl_set_object_callback(obj,combo_cb,0);
- fl_set_object_color(obj,FL_MCOL,FL_BLACK);
+ button = obj = fl_add_button(FL_NORMAL_BUTTON, x, y, w, hmin, "");
+ fl_set_object_color(obj, FL_MCOL, FL_MCOL);
+ fl_set_object_boxtype(obj, FL_DOWN_BOX);
+ fl_set_object_callback(obj, C_Combox_combo_cb, 0);
+ fl_set_object_color(obj, FL_MCOL, FL_BLACK);
label = button;
break;
}
case FL_COMBOX_INPUT:
{
button = obj = fl_add_button(FL_NORMAL_BUTTON,
- x+w-22,y,22,hmin,"@2->");
- fl_set_object_color(obj,FL_MCOL, FL_MCOL);
- fl_set_object_callback(obj,combo_cb,0);
- label = obj = fl_add_input(FL_NORMAL_INPUT,x,y,w-22,hmin,"");
- fl_set_object_boxtype(obj,FL_DOWN_BOX);
+ x+w-22, y, 22, hmin, "@2->");
+ fl_set_object_color(obj, FL_MCOL, FL_MCOL);
+ fl_set_object_callback(obj, C_Combox_combo_cb, 0);
+ label = obj = fl_add_input(FL_NORMAL_INPUT, x, y, w-22, hmin, "");
+ fl_set_object_boxtype(obj, FL_DOWN_BOX);
fl_set_object_return(obj, FL_RETURN_END_CHANGED);
- fl_set_object_callback(obj,input_cb,0);
- //fl_set_object_color(obj,FL_MCOL,FL_BLACK);
+ fl_set_object_callback(obj, C_Combox_input_cb, 0);
+ //fl_set_object_color(obj, FL_MCOL, FL_BLACK);
//fl_set_object_lalign(obj,FL_ALIGN_CENTER|FL_ALIGN_INSIDE);
break;
}
} // end of switch
- label->u_vdata = (void*)this;
- button->u_vdata = (void*)this;
+ label->u_vdata = this;
+ button->u_vdata = this;
// Hmm, it seems fl_create_browser is broken in xforms 0.86.
// We have to work around that by creating the dropped browser form
FL_FORM * current_form = fl_current_form;
fl_end_form();
- bw = w+20; bh = hmax-hmin-12;
+ bw = w + 20; bh = hmax - hmin - 12;
form = fl_bgn_form(FL_NO_BOX, bw, bh);
- browser = obj = fl_add_browser(FL_HOLD_BROWSER, 0, 0, bw,bh,"");
- fl_set_object_boxtype(obj,FL_UP_BOX);
- fl_set_object_color(obj,FL_MCOL, FL_YELLOW);
+ browser = obj = fl_add_browser(FL_HOLD_BROWSER, 0, 0, bw, bh, "");
+ fl_set_object_boxtype(obj, FL_UP_BOX);
+ fl_set_object_color(obj, FL_MCOL, FL_YELLOW);
fl_set_object_gravity(obj, NorthWestGravity, NorthWestGravity);
- fl_set_object_callback(obj,combo_cb,2);
+ fl_set_object_callback(obj, C_Combox_combo_cb, 2);
fl_end_form();
- browser->u_vdata = (void*)this;
+ browser->u_vdata = this;
form->u_vdata = browser;
- fl_register_raw_callback(form, ButtonPressMask|KeyPressMask,peek_event);
+ fl_register_raw_callback(form,
+ ButtonPressMask|KeyPressMask,
+ C_Combox_peek_event);
// And revert to adding to the old form (Asger)
fl_addto_form(current_form);
XGrabPointer(fl_display, form->window, false,
ButtonPressMask | ButtonReleaseMask | PointerMotionMask,
GrabModeAsync, GrabModeAsync,
- 0, 0,0);
+ 0, 0, 0);
XFlush(fl_display);
}
else
fl_set_object_label(label,
fl_get_browser_line(browser, sel));
- if (callback) callback(sel,cb_arg);
+ if (callback) callback(sel, cb_arg);
}
XUngrabPointer(fl_display, 0);
XFlush(fl_display);
void Combox::input_cb(FL_OBJECT *ob, long)
{
- Combox *combo = (Combox*)ob->u_vdata;
+ Combox * combo = static_cast<Combox*>(ob->u_vdata);
- char const *text = fl_get_input(ob);
+ char const * text = fl_get_input(ob);
combo->addto(text);
combo->is_empty = false;
}
+extern "C" void C_Combox_input_cb(FL_OBJECT * ob, long data)
+{
+ Combox::input_cb(ob, data);
+}
+
-void Combox::combo_cb(FL_OBJECT *ob, long data)
+void Combox::combo_cb(FL_OBJECT * ob, long data)
{
- Combox *combo = (Combox*)ob->u_vdata;
+ Combox * combo = static_cast<Combox*>(ob->u_vdata);
switch (data) {
case 0:
{
}
}
+extern "C" void C_Combox_combo_cb(FL_OBJECT * ob, long data)
+{
+ Combox::combo_cb(ob, data);
+}
+
-int Combox::peek_event(FL_FORM * form, void *xev)
+int Combox::peek_event(FL_FORM * form, void * xev)
{
- FL_OBJECT *ob = (FL_OBJECT *)form->u_vdata;
- Combox *combo = (Combox*)ob->u_vdata;
+ FL_OBJECT * ob = static_cast<FL_OBJECT *>(form->u_vdata);
+ Combox * combo = static_cast<Combox*>(ob->u_vdata);
-#if FL_REVISION < 86
- if(((XEvent *)xev)->type==ButtonPress && !ob->belowmouse)
-#endif
-#if FL_REVISION > 85
-// I don't know why belowmouse does not work, but it doesn't. (Asger)
- if (((XEvent *) xev)->type == ButtonPress && (
- ((XEvent *)xev)->xbutton.x - ob->x < 0 ||
- ((XEvent *)xev)->xbutton.x - ob->x > ob->w ||
- ((XEvent *)xev)->xbutton.y - ob->y < 0 ||
- ((XEvent *)xev)->xbutton.y - ob->y > ob->h))
-#endif
- {
+ // I don't know why belowmouse does not work, but it doesn't. (Asger)
+ // Are we sure? Please verify. (Lgb)
+ if (static_cast<XEvent *>(xev)->type == ButtonPress && (
+ static_cast<XEvent *>(xev)->xbutton.x - ob->x < 0 ||
+ static_cast<XEvent *>(xev)->xbutton.x - ob->x > ob->w ||
+ static_cast<XEvent *>(xev)->xbutton.y - ob->y < 0 ||
+ static_cast<XEvent *>(xev)->xbutton.y - ob->y > ob->h)) {
combo->Hide(1);
return 1;
}
- if (((XEvent*)xev)->type != KeyPress) return 0;
+ if (static_cast<XEvent*>(xev)->type != KeyPress) return 0;
- char s_r[10];
+ char s_r[10]; s_r[9] = '\0';
static int num_bytes;
KeySym keysym_return;
- num_bytes = XLookupString(&((XEvent*)xev)->xkey, s_r, 10,
- &keysym_return, NULL);
+ num_bytes = XLookupString(&static_cast<XEvent*>(xev)->xkey, s_r, 10,
+ &keysym_return, 0);
XFlush(fl_display);
switch (keysym_return) {
case XK_Down:
fl_get_browser_maxline(combo->browser))
fl_select_browser_line(combo->browser,
fl_get_browser(combo->browser)+1);
- if (fl_get_browser(combo->browser)>=
+ if (fl_get_browser(combo->browser)>=
fl_get_browser_topline(combo->browser) +
fl_get_browser_screenlines(combo->browser))
fl_set_browser_topline(combo->browser,
if (fl_get_browser(combo->browser) > 1)
fl_select_browser_line(combo->browser,
fl_get_browser(combo->browser)-1);
- if (fl_get_browser(combo->browser)>=
+ if (fl_get_browser(combo->browser)>=
fl_get_browser_topline(combo->browser) +
fl_get_browser_screenlines(combo->browser))
fl_set_browser_topline(combo->browser,
return 0;
}
+extern "C" int C_Combox_peek_event(FL_FORM * form, void *xev)
+{
+ return Combox::peek_event(form, xev);
+}
+
#ifdef TESTCOMBO
typedef struct {
FD_test *fdui = (FD_test *) fl_calloc(1, sizeof(*fdui));
fdui->test = fl_bgn_form(FL_NO_BOX, 320, 190);
- obj = fl_add_box(FL_UP_BOX,0,0,320,190,"");
- obj = fl_add_box(FL_DOWN_BOX,10,50,300,110,"");
- obj = fl_add_button(FL_NORMAL_BUTTON,250,10,50,30,_("Done"));
- combo.add(10,15,120,25,135);
+ obj = fl_add_box(FL_UP_BOX, 0, 0, 320, 190, "");
+ obj = fl_add_box(FL_DOWN_BOX, 10, 50, 300, 110, "");
+ obj = fl_add_button(FL_NORMAL_BUTTON, 250, 10, 50, 30, _("Done"));
+ combo.add(10, 15, 120, 25, 135);
fl_end_form();
return fdui;
// combo.select(4);
/* show the first form */
- fl_show_form(fd_test->test,FL_PLACE_CENTER,FL_FULLBORDER,"test");
+ fl_show_form(fd_test->test, FL_PLACE_CENTER, FL_FULLBORDER, "test");
fl_do_forms();
return 0;
}