home *** CD-ROM | disk | FTP | other *** search
/ Dream 52 / Amiga_Dream_52.iso / Linux / Divers / lyx-0.13.2.tar.gz / lyx-0.13.2.tar / lyx-0.13.2 / src / math_panel.C < prev    next >
C/C++ Source or Header  |  1998-04-23  |  9KB  |  348 lines

  1. /*
  2.  *  File:        math_panel.C
  3.  *  Purpose:     Mathed GUI for lyx
  4.  *  Author:      Alejandro Aguilar Sierra <asierra@servidor.unam.mx>
  5.  *  Created:     March 28, 1996
  6.  * 
  7.  *  Dependencies: Xlib, Xpm, XForms, Lyx
  8.  *
  9.  *  Copyright: (c) 1996, Alejandro Aguilar Sierra 
  10.  *
  11.  *   You are free to use and modify it under the terms of
  12.  *   the GNU General Public Licence version 2 or later.
  13.  */
  14.  
  15. #include <config.h>
  16.  
  17. #include FORMS_H_LOCATION
  18. #include <stdio.h>
  19. #include <stdlib.h>
  20.  
  21. #include "math_panel.h"
  22. #include "symbol_def.h"
  23. #include "formula.h"
  24. #include "lyxfunc.h"
  25. #include "gettext.h"
  26.  
  27. /* Bitmaps */
  28. #include "delim.xbm"
  29. #include "delim0.xpm"
  30. #include "delim.xpm"
  31. #include "deco.xbm"
  32. #include "deco.xpm"
  33. #include "space.xpm"
  34. #include "sqrt.xpm"
  35. #include "frac.xpm"
  36. #include "matrix.xpm"
  37. #include "equation.xpm"
  38.  
  39. //     $Id: math_panel.C,v 1.1.1.1 1998/04/23 16:02:55 larsbj Exp $    
  40.  
  41. #if !defined(lint) && !defined(WITH_WARNINGS)
  42. static char vcid[] = "$Id: math_panel.C,v 1.1.1.1 1998/04/23 16:02:55 larsbj Exp $";
  43. #endif /* lint */
  44.  
  45. static LyXFunc *lyxfunc=0;
  46.  
  47. //static FD_panel* symb_form=0;
  48.  
  49. FD_panel  *fd_panel;
  50. FD_delim  *fd_delim;
  51. FD_deco   *fd_deco;
  52. FD_space  *fd_space;
  53. FD_matrix *fd_matrix;
  54.  
  55. int delim_code[] = {   
  56.    '(', ')', LM_lceil,  LM_rceil,  LM_uparrow,  LM_Uparrow,
  57.    '[', ']', LM_lfloor,  LM_rfloor,  LM_updownarrow, LM_Updownarrow,
  58.    '{', '}',  '/', LM_backslash,  LM_downarrow,  LM_Downarrow,
  59.    LM_langle,  LM_rangle, '|', LM_Vert, '.', 0
  60. };
  61.  
  62. static char const *deco_code[] = {
  63.    "widehat", "widetilde", "overbrace", "overleftarrow", "overrightarrow", 
  64.    "overline","underbrace", "underline"
  65. };
  66.  
  67.  
  68. static char const *func_code[] = {
  69.     "arccos", "arcsin", "arctan", "arg", "bmod",
  70.     "cos", "cosh", "cot", "coth", "csc", "deg",
  71.     "det", "dim", "exp", "gcd", "hom", "inf", "ker",
  72.     "lg", "lim", "liminf", "limsup", "ln", "log",
  73.     "max", "min", "sec", "sin", "sinh", "sup",
  74.     "tan", "tanh"
  75. };
  76.  
  77. static char h_align_str[80] = "c";
  78.  
  79. extern int CancelCloseBoxCB(FL_FORM *, void *);
  80.  
  81. /* callbacks for form panel */
  82. void button_cb(FL_OBJECT *ob, long data)
  83. {   
  84.    extern void free_symbols_form();
  85.    switch (data)  {
  86.     case MM_GREEK:
  87.     case MM_VARSIZE:
  88.     case MM_BRELATS:
  89.     case MM_ARROW:
  90.     case MM_BOP:
  91.     case MM_MISC: 
  92.       {       
  93.      BitmapMenu *menu = (BitmapMenu *)ob->u_vdata;
  94.      menu->Show();  
  95.      break;
  96.       }
  97.     case MM_FRAC:
  98.        lyxfunc->Dispatch(LFUN_INSERT_MATH, "frac");
  99.       break;
  100.     case MM_SQRT:
  101.        lyxfunc->Dispatch(LFUN_INSERT_MATH, "sqrt");
  102.       break;
  103.     case MM_DELIM:
  104.       fl_show_form(fd_delim->delim,FL_PLACE_MOUSE,FL_FULLBORDER, _("Delimiter"));
  105.        fl_set_form_atclose(fd_delim->delim, CancelCloseBoxCB, NULL);
  106.       break;
  107.     case MM_DECO:
  108.       fl_show_form(fd_deco->deco,FL_PLACE_MOUSE,FL_FULLBORDER,_("Decoration"));
  109.        fl_set_form_atclose(fd_deco->deco, CancelCloseBoxCB, NULL);
  110.       break;
  111.     case MM_SPACE:
  112.       fl_show_form(fd_space->space,FL_PLACE_MOUSE,FL_FULLBORDER,_("Spacing"));
  113.        fl_set_form_atclose(fd_space->space, CancelCloseBoxCB, NULL);
  114.       break;
  115.     case MM_MATRIX:
  116.       fl_show_form(fd_matrix->matrix,FL_PLACE_MOUSE,FL_FULLBORDER,_("Matrix"));
  117.        fl_set_form_atclose(fd_matrix->matrix, CancelCloseBoxCB, NULL);
  118.       break;
  119.     case MM_EQU:
  120.        lyxfunc->Dispatch(LFUN_MATH_DISPLAY);
  121.       break;
  122.     case MM_FUNC:
  123.       {
  124.       int i = fl_get_browser(fd_panel->func_browse) - 1;
  125.       lyxfunc->Dispatch(LFUN_INSERT_MATH, func_code[i]);
  126.       break;
  127.       }
  128.     case 100:
  129.       free_symbols_form();
  130.       break;
  131.    }
  132. }
  133.  
  134.  
  135. /* callbacks for form delim */
  136. void delim_cb(FL_OBJECT *, long data)
  137. {
  138.    int left=fd_delim->left->u_ldata, right=fd_delim->right->u_ldata;
  139.    int side=(fl_get_button(fd_delim->right)!=0);
  140.    Pixmap p1, p2;
  141.    
  142.    switch (data) {
  143.     case MM_APPLY:
  144.     case MM_OK:
  145.       {
  146.      char s[80];
  147.      sprintf(s, "%d %d", delim_code[left], delim_code[right]); 
  148.      lyxfunc->Dispatch(LFUN_MATH_DELIM, s);
  149.      if (data==MM_APPLY) break;
  150.       }
  151.     case MM_CLOSE: fl_hide_form(fd_delim->delim); break;
  152.     case 2: 
  153.       {
  154.       int i = fl_get_bmtable(fd_delim->menu);
  155.       if (i>=0) {
  156.           if (side || fl_get_bmtable_numb(fd_delim->menu)!=FL_LEFT_MOUSE) 
  157.         right = i;
  158.           else
  159.         left = i;
  160.       }
  161.       p1 = fl_get_pixmap_pixmap(fd_delim->pix, &p1, &p2);
  162.       fl_draw_bmtable_item(fd_delim->menu,left,p1,0,0);
  163.       fl_draw_bmtable_item(fd_delim->menu,right,p1,16,0);
  164.       fl_redraw_object(fd_delim->pix);
  165.       
  166.       fd_delim->left->u_ldata = left;
  167.       fd_delim->right->u_ldata = right;
  168.  
  169.       break;
  170.       }
  171.     case 3: break;
  172.     case 4: break;
  173.    }
  174. }
  175.  
  176. /* callbacks for form matrix */
  177. void matrix_cb(FL_OBJECT *, long data)
  178. {
  179.    int nx, ny;
  180.    static char v_align_c[] = "tcb";
  181.  
  182.    switch (data) {
  183.     case MM_APPLY:
  184.     case MM_OK: 
  185.       {
  186.      char s[80];
  187.      char c = v_align_c[fl_get_choice(fd_matrix->valign)-1];
  188.      char const *sh = fl_get_input(fd_matrix->halign);
  189.      nx = (int)(fl_get_slider_value(fd_matrix->columns)+0.5);
  190.      ny = (int)(fl_get_slider_value(fd_matrix->rows)+0.5);
  191.      sprintf(s, "%d %d %c%s", nx, ny, c, sh);      
  192.      if (data==MM_OK) fl_hide_form(fd_matrix->matrix);
  193.      lyxfunc->Dispatch(LFUN_INSERT_MATRIX, s);
  194.      break;
  195.       }
  196.     case MM_CLOSE: fl_hide_form(fd_matrix->matrix); break;
  197.     case 2: 
  198.       {
  199.      nx = (int)(fl_get_slider_value(fd_matrix->columns)+0.5);
  200.      for (int i=0; i<nx; i++) h_align_str[i] = 'c';
  201.      //memset(h_align_str, 'c', nx);
  202.      h_align_str[nx] = '\0';
  203. //     fl_freeze_form(fd_form_main->form_main);
  204. //    fl_addto_form(fd_form_main->form_main);
  205.  
  206.      fl_set_input(fd_matrix->halign, h_align_str);    
  207.      fl_redraw_object(fd_matrix->halign);      
  208.      break;
  209.       }
  210.    }
  211. }
  212.  
  213. /* callbacks for form deco */
  214. void deco_cb(FL_OBJECT *, long data)
  215. {
  216.    switch (data) {
  217.     case MM_APPLY:
  218.     case MM_OK:
  219.       { 
  220.      int i = fl_get_bmtable(fd_deco->menu);
  221.      lyxfunc->Dispatch(LFUN_INSERT_MATH, deco_code[i]);
  222.      if (data==MM_APPLY) break;
  223.       }
  224.     case MM_CLOSE: fl_hide_form(fd_deco->deco); break;
  225.    }
  226. }
  227.  
  228. /* callbacks for form space */
  229. void space_cb(FL_OBJECT *, long data)
  230. {
  231.    static short sp=-1;
  232.    extern char *latex_mathspace[];
  233.    
  234.    if (data>=0 && data<6) 
  235.       sp = (short)data;
  236.    else
  237.    switch (data) {
  238.     case MM_APPLY:
  239.     case MM_OK:
  240.       { 
  241.       if (sp>=0) 
  242.         lyxfunc->Dispatch(LFUN_INSERT_MATH, latex_mathspace[sp]);
  243.      if (data==MM_APPLY) break;
  244.       }
  245.     case MM_CLOSE: fl_hide_form(fd_space->space); break;
  246.    }
  247. }
  248.  
  249. int align_filter(FL_OBJECT *, char const *, char const *cur, int c)
  250. {
  251.    int n = (int)(fl_get_slider_value(fd_matrix->columns)+0.5) - strlen(cur);
  252.    return ((c=='c'||c=='l'||c=='r') && n>=0) ? FL_VALID: FL_INVALID;
  253. }
  254.  
  255. char** mathed_get_pixmap_from_icon(int d)
  256. {
  257.    switch (d) {
  258.     case MM_FRAC: return frac;
  259.     case MM_SQRT: return sqrt;
  260.     case MM_DELIM: return delim;
  261.     case MM_MATRIX: return matrix;
  262.     case MM_EQU: return equation; 
  263.     case MM_DECO: return deco; 
  264.     case MM_SPACE: return space_xpm; 
  265.     default: return NULL;
  266.    }
  267. }
  268.  
  269. FD_panel *create_math_panel( )
  270. {
  271.    fd_panel = create_form_panel();
  272.    fd_delim = create_form_delim();
  273.    fd_deco = create_form_deco();
  274.    fd_space = create_form_space();
  275.    fd_matrix = create_form_matrix();
  276.  
  277.    /* fill-in form initialization code */
  278.    fl_set_button(fd_delim->left, 1);
  279.    fl_set_pixmap_data(fd_delim->pix, delim0);
  280.    fl_set_bmtable_data(fd_delim->menu,6,4,delim_width,delim_height,
  281.                delim_bits);
  282.    fl_set_bmtable_maxitems(fd_delim->menu, 23);
  283.    
  284.    fl_set_pixmap_data(fd_panel->sqrt, sqrt);
  285.    fl_set_pixmap_data(fd_panel->frac, frac);
  286.    fl_set_pixmap_data(fd_panel->delim, delim);
  287.    fl_set_pixmap_data(fd_panel->deco, deco);
  288.    fl_set_pixmap_data(fd_panel->space, space_xpm);
  289.    fl_set_pixmap_data(fd_panel->matrix, matrix);
  290.    fl_set_pixmap_data(fd_panel->equation, equation);
  291.  
  292.    for (int i=0; i<32; i++) {
  293.        fl_add_browser_line(fd_panel->func_browse, func_code[i]);
  294.    }
  295.     
  296.    fl_addto_choice(fd_matrix->valign, _("Top | Center | Bottom"));
  297.    fl_set_choice(fd_matrix->valign, 2);
  298.    fl_set_input(fd_matrix->halign, h_align_str);
  299.    fl_set_input_filter(fd_matrix->halign, align_filter);
  300.    
  301.    fl_set_bmtable_data(fd_deco->menu,3,3,deco_width,deco_height,
  302.                deco_bits);
  303.    fl_set_bmtable_maxitems(fd_deco->menu, 8);
  304.  
  305.    fd_delim->left->u_ldata = 0;
  306.    fd_delim->right->u_ldata = 1;
  307.     
  308.    return fd_panel;
  309. }
  310.  
  311. extern BitmapMenu* sym_menu;
  312. extern void  create_symbol_menues(FD_panel *);
  313.  
  314. void free_symbols_form()
  315. {
  316.    if (fd_panel) {
  317.       fl_hide_form(fd_panel->panel);
  318.       fl_free_form(fd_panel->panel);
  319.       delete sym_menu;
  320.       delete fd_panel;
  321.       fd_panel = NULL;  
  322.    }
  323. }
  324.  
  325. int AtClose_symbols_form(FL_FORM *, void *)
  326. {
  327.   free_symbols_form();
  328.   return FL_IGNORE;
  329. }
  330.  
  331.  
  332. void show_symbols_form(LyXFunc *lf)
  333. {
  334.     lyxfunc = lf;
  335.     if (!fd_panel) {
  336.     fd_panel = create_math_panel();
  337.     fl_register_raw_callback(fd_panel->panel, 
  338.                  ButtonPressMask|KeyPressMask, peek_event);
  339.     create_symbol_menues(fd_panel);    
  340.     fl_set_form_atclose(fd_panel->panel, AtClose_symbols_form, NULL);
  341.     }
  342.     if (fd_panel->panel->visible) {
  343.     fl_raise_form(fd_panel->panel);
  344.     } else {
  345.       fl_show_form(fd_panel->panel, FL_PLACE_SIZE, FL_FULLBORDER, _("Math Panel"));
  346.     }
  347. }
  348.