]> git.lyx.org Git - lyx.git/blobdiff - src/combox.C
small changes to ButtonController usage
[lyx.git] / src / combox.C
index 92a10323084e1741f96a7cde61c9cba3fff93f98..400e3da44d6051e719d3e2cc95e65515358185d9 100644 (file)
@@ -4,7 +4,7 @@
  *          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.
 #include "combox.h"
 #include <cstring>
 
-#include "error.h"
+#include "debug.h"
+
+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)
 {
@@ -73,20 +81,20 @@ void Combox::clear()
 
 void Combox::remove()
 {
-       //lyxerr.print(string("Button: ") + int(button));
+       lyxerr.debug() << "Button: " << button << endl;
        if (button) {
                fl_delete_object(button);
                fl_free_object(button); 
        }
        
-       //lyxerr.print(string("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(string("Form: ") + int(form));
-       //lyxerr.print(string("Browser: ") + int(browser));
+       lyxerr.debug() << "Form: " << form << endl;
+       lyxerr.debug() << "Browser: " << browser << endl;
        if (form && browser) {
           fl_delete_object(browser);
           fl_free_object(browser);
@@ -121,7 +129,7 @@ void Combox::addline(char const* text)
 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;
@@ -134,7 +142,7 @@ bool Combox::select_text(char const* t)
 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)
@@ -153,46 +161,46 @@ void Combox::add(int x, int y, int w, int hmin, int hmax)
        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
@@ -201,18 +209,20 @@ void Combox::add(int x, int y, int w, int hmin, int hmax)
        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);
@@ -250,7 +260,7 @@ void Combox::Show()
        XGrabPointer(fl_display, form->window, false,
                     ButtonPressMask | ButtonReleaseMask | PointerMotionMask,
                     GrabModeAsync, GrabModeAsync,
-                    0, 0,0);
+                    0, 0, 0);
        XFlush(fl_display);
 }
 
@@ -264,7 +274,7 @@ void Combox::Hide(int who)
                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);
@@ -301,18 +311,23 @@ void Combox::deactivate()
 
 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:
        {  
@@ -344,34 +359,34 @@ void Combox::combo_cb(FL_OBJECT *ob, long data)
        }
 }
 
+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, 
+       num_bytes = XLookupString(&static_cast<XEvent*>(xev)->xkey, s_r, 10, 
                                  &keysym_return, 0);
        XFlush(fl_display);
        switch (keysym_return) {
@@ -380,7 +395,7 @@ int Combox::peek_event(FL_FORM * form, void *xev)
                    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,
@@ -395,7 +410,7 @@ int Combox::peek_event(FL_FORM * form, void *xev)
                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,
@@ -416,6 +431,11 @@ int Combox::peek_event(FL_FORM * form, void *xev)
        return 0;  
 }
        
+extern "C" int C_Combox_peek_event(FL_FORM * form, void *xev)
+{
+       return Combox::peek_event(form, xev);
+}
+
 
 #ifdef TESTCOMBO
 typedef struct {
@@ -436,10 +456,10 @@ FD_test *create_form_test(void)
    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;
@@ -488,7 +508,7 @@ int main(int argc, char *argv[])
 //   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;
 }