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