]> git.lyx.org Git - lyx.git/blobdiff - src/mathed/math_panel.C
Hopefully fix the problem with stateText() in lyxfont.C
[lyx.git] / src / mathed / math_panel.C
index d3dadc97473e592c3162137b40b67206789e5a57..6c10630a86b5cbaa0287ecfb66e533c19ac096ed 100644 (file)
@@ -6,7 +6,7 @@
  * 
  *  Dependencies: Xlib, Xpm, XForms, Lyx
  *
- *  Copyright: (c) 1996, Alejandro Aguilar Sierra 
+ *  Copyright: 1996, Alejandro Aguilar Sierra 
  *
  *   You are free to use and modify it under the terms of
  *   the GNU General Public Licence version 2 or later.
@@ -15,8 +15,6 @@
 #include <config.h>
 
 #include FORMS_H_LOCATION
-#include <cstdio>
-#include <cstdlib>
 
 #include "lyx_gui_misc.h" 
 #include "math_panel.h"
@@ -54,6 +52,18 @@ int delim_code[] = {
    LM_langle,  LM_rangle, '|', LM_Vert, '.', 0
 };
 
+// indexes to get the left and right versions of each delimiter
+// Contributed by Pablo De Napoli (pdenapo@dm.uba.ar)
+int delim_lversion[] = { 0,0,2,2,4,5,
+                         6,6,8,8,10,11,
+                         12,12,14,15,16,17,
+                         18,18,20,21,22,23 };
+
+int delim_rversion[] = { 1,1,3,3,4,5,
+                        7,7,9,9,10,11,
+                        13,13,14,15,16,17,
+                        19,19,20,21,22,23 };
+
 
 static char const * deco_code[] = {
    "widehat", "widetilde", "overbrace", "overleftarrow", "overrightarrow", 
@@ -131,32 +141,41 @@ void delim_cb(FL_OBJECT *, long data)
 {
    int left= fd_delim->left->u_ldata, right= fd_delim->right->u_ldata;
    int side= (fl_get_button(fd_delim->right)!= 0);
-   Pixmap p1, p2;
    
    switch (data) {
     case MM_APPLY:
     case MM_OK:
       {
-        char s[80];
-        sprintf(s, "%d %d", delim_code[left], delim_code[right]); 
-        lyxfunc->Dispatch(LFUN_MATH_DELIM, s);
-        if (data == MM_APPLY) break;
+#ifdef HAVE_SSTREAM
+             std::ostringstream ost;
+             ost << delim_code[left] << ' ' << delim_code[right];
+             lyxfunc->Dispatch(LFUN_MATH_DELIM, ost.str().c_str());
+#else
+             char s[80];
+             ostrstream ost(s, 80);
+             ost << delim_code[left] << ' ' << delim_code[right] << '\0';
+             lyxfunc->Dispatch(LFUN_MATH_DELIM, ost.str());
+#endif
+             if (data == MM_APPLY) break;
       }
     case MM_CLOSE: fl_hide_form(fd_delim->delim); break;
     case 2: 
       {
          int i = fl_get_bmtable(fd_delim->menu);
+         int button = fl_get_bmtable_numb(fd_delim->menu);
+         bool both = (button==FL_MIDDLE_MOUSE);
+         
          if (i>= 0) {
-#if FL_REVISION > 85
-             if (side || (fl_get_bmtable_numb(fd_delim->menu)!= FL_LEFT_MOUSE)) 
-#else
-             if (side || (fl_get_bmtable_numb(fd_delim->menu)!= 1))
-       
-#endif
-               right = i;
-             else
-               left = i;
+
+             if (side || (button== FL_RIGHT_MOUSE)) {
+                 right = i;
+             } else {
+                 left = i;
+                 if (both)
+                   right = delim_rversion[i];
+             }   
          }
+         Pixmap p1, p2;
          p1 = fl_get_pixmap_pixmap(fd_delim->pix, &p1, &p2);
          fl_draw_bmtable_item(fd_delim->menu, left, p1, 0, 0);
          fl_draw_bmtable_item(fd_delim->menu, right, p1, 16, 0);
@@ -175,28 +194,34 @@ void delim_cb(FL_OBJECT *, long data)
 /* callbacks for form matrix */
 void matrix_cb(FL_OBJECT *, long data)
 {
-   int nx, ny;
    static char v_align_c[] = "tcb";
  
    switch (data) {
     case MM_APPLY:
     case MM_OK: 
       {
-        char s[80];
         char c = v_align_c[fl_get_choice(fd_matrix->valign)-1];
         char const * sh = fl_get_input(fd_matrix->halign);
-        nx = int(fl_get_slider_value(fd_matrix->columns)+0.5);
-        ny = int(fl_get_slider_value(fd_matrix->rows)+0.5);
-        sprintf(s, "%d %d %c%s", nx, ny, c, sh);      
+        int nx = int(fl_get_slider_value(fd_matrix->columns)+0.5);
+        int ny = int(fl_get_slider_value(fd_matrix->rows)+0.5);
         if (data == MM_OK) fl_hide_form(fd_matrix->matrix);
-        lyxfunc->Dispatch(LFUN_INSERT_MATRIX, s);
+#ifdef HAVE_SSTREAM
+        std::ostringstream ost;
+        ost << nx << ' ' << ny << ' ' << c << sh;
+        lyxfunc->Dispatch(LFUN_INSERT_MATRIX, ost.str().c_str());
+#else
+        char s[80];
+        ostrstream ost(s, 80);
+        ost << nx << ' ' << ny << ' ' << c << sh << '\0';
+        lyxfunc->Dispatch(LFUN_INSERT_MATRIX, ost.str());
+#endif
         break;
       }
     case MM_CLOSE: fl_hide_form(fd_matrix->matrix); break;
     case 2: 
       {
-        nx = int(fl_get_slider_value(fd_matrix->columns)+0.5);
-        for (int i= 0; i<nx; i++) h_align_str[i] = 'c';
+        int nx = int(fl_get_slider_value(fd_matrix->columns)+0.5);
+        for (int i = 0; i < nx; ++i) h_align_str[i] = 'c';
         //memset(h_align_str, 'c', nx);
         h_align_str[nx] = '\0';
 //      fl_freeze_form(fd_form_main->form_main);
@@ -254,11 +279,11 @@ extern "C" int align_filter(FL_OBJECT *, char const *, char const * cur, int c)
 }
 
 
-char ** mathed_get_pixmap_from_icon(int d)
+char const ** mathed_get_pixmap_from_icon(int d)
 {
    switch (d) {
     case MM_FRAC: return frac;
-    case MM_SQRT: return sqrt;
+    case MM_SQRT: return sqrt_xpm;
     case MM_DELIM: return delim;
     case MM_MATRIX: return matrix;
     case MM_EQU: return equation; 
@@ -279,20 +304,20 @@ FD_panel * create_math_panel( )
 
    /* fill-in form initialization code */
    fl_set_button(fd_delim->left, 1);
-   fl_set_pixmap_data(fd_delim->pix, delim0);
+   fl_set_pixmap_data(fd_delim->pix, const_cast<char**>(delim0));
    fl_set_bmtable_data(fd_delim->menu, 6, 4, delim_width, delim_height,
                       delim_bits);
    fl_set_bmtable_maxitems(fd_delim->menu, 23);
    
-   fl_set_pixmap_data(fd_panel->sqrt, sqrt);
-   fl_set_pixmap_data(fd_panel->frac, frac);
-   fl_set_pixmap_data(fd_panel->delim, delim);
-   fl_set_pixmap_data(fd_panel->deco, deco);
-   fl_set_pixmap_data(fd_panel->space, space_xpm);
-   fl_set_pixmap_data(fd_panel->matrix, matrix);
-   fl_set_pixmap_data(fd_panel->equation, equation);
-
-   for (int i= 0; i<32; i++) {
+   fl_set_pixmap_data(fd_panel->sqrt, const_cast<char**>(sqrt_xpm));
+   fl_set_pixmap_data(fd_panel->frac, const_cast<char**>(frac));
+   fl_set_pixmap_data(fd_panel->delim, const_cast<char**>(delim));
+   fl_set_pixmap_data(fd_panel->deco, const_cast<char**>(deco));
+   fl_set_pixmap_data(fd_panel->space, const_cast<char**>(space_xpm));
+   fl_set_pixmap_data(fd_panel->matrix, const_cast<char**>(matrix));
+   fl_set_pixmap_data(fd_panel->equation, const_cast<char**>(equation));
+
+   for (int i = 0; i < 32; ++i) {
        fl_add_browser_line(fd_panel->func_browse, func_code[i]);
    }
     
@@ -311,7 +336,7 @@ FD_panel * create_math_panel( )
    return fd_panel;
 }
 
-extern BitmapMenu* sym_menu;
+extern BitmapMenu * sym_menu;
 extern void  create_symbol_menues(FD_panel *);
 
 
@@ -321,7 +346,7 @@ void free_symbols_form()
       fl_hide_form(fd_panel->panel);
       fl_free_form(fd_panel->panel);
       delete sym_menu;
-      delete fd_panel;
+      free(fd_panel);
       fd_panel = 0;  
    }
 }