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