]> git.lyx.org Git - lyx.git/blob - src/frontends/xforms/MathsSymbols.C
(John): translate dialog titles.
[lyx.git] / src / frontends / xforms / MathsSymbols.C
1 /**
2  * \file MathsSymbols.C
3  * Copyright 2001 the LyX Team
4  * Read the file COPYING
5  *
6  * \author Alejandro Aguilar Sierra
7  * \author John Levon, moz@compsoc.man.ac.uk
8  */
9
10 #include <config.h>
11 #include <algorithm>
12
13 #include XPM_H_LOCATION
14
15 #ifdef __GNUG__
16 #pragma implementation
17 #endif
18
19 #include "support/LAssert.h"
20 #include "support/lstrings.h"
21 #include "debug.h"
22 #include "MathsSymbols.h"
23 #include "GUIRunTime.h"
24
25 using std::max;
26 using std::endl;
27 using std::ostream;
28
29 #ifndef CXX_GLOBAL_CSTD
30 using std::strstr;
31 #endif
32
33 /* Latex code for those bitmaps */
34
35 #include "greek.xbm"
36 #include "arrows.xbm"
37 #include "brel.xbm"
38 #include "bop.xbm"
39 #include "misc.xbm"
40 #include "varsz.xbm"
41 #include "dots.xbm"
42
43 #include "ams_misc.xbm"
44 #include "ams_arrows.xbm"
45 #include "ams_rel.xbm"
46 #include "ams_nrel.xbm"
47 #include "ams_ops.xbm"
48
49 #include "mathed/math_parser.h"
50 #include "frac.xpm"
51 #include "sub.xpm"
52 #include "super.xpm"
53 #include "style.xpm"
54 #include "sqrt.xpm"
55 #include "delim.xbm"
56 #include "delim.xpm"
57 #include "deco.xbm"
58 #include "deco.xpm"
59 #include "space.xpm"
60 #include "matrix.xpm"
61 #include "equation.xpm"
62
63 char const * function_names[] = {
64         "arccos", "arcsin", "arctan", "arg", "bmod",
65         "cos", "cosh", "cot", "coth", "csc", "deg",
66         "det", "dim", "exp", "gcd", "hom", "inf", "ker",
67         "lg", "lim", "liminf", "limsup", "ln", "log",
68         "max", "min", "sec", "sin", "sinh", "sup",
69         "tan", "tanh"
70 };
71
72 int const nr_function_names = sizeof(function_names) / sizeof(char const *);
73
74 char const * latex_arrow[] = {
75         "downarrow", "leftarrow", "Downarrow", "Leftarrow",
76         "hookleftarrow", "rightarrow", "uparrow", "Rightarrow", "Uparrow",
77         "hookrightarrow", "updownarrow", "Leftrightarrow", "leftharpoonup",
78         "rightharpoonup", "rightleftharpoons", "leftrightarrow", "Updownarrow",
79         "leftharpoondown", "rightharpoondown", "mapsto",
80         "Longleftarrow", "Longrightarrow", "Longleftrightarrow",
81         "longleftrightarrow", "longleftarrow", "longrightarrow", "longmapsto",
82         "nwarrow", "nearrow", "swarrow", "searrow",  "",
83 };
84
85 int const nr_latex_arrow = sizeof(latex_arrow) / sizeof(char const *);
86
87 char const * latex_bop[] = {
88         "pm", "cap", "diamond", "oplus",
89         "mp", "cup", "bigtriangleup", "ominus",
90         "times", "uplus", "bigtriangledown", "otimes",
91         "div", "sqcap", "triangleright", "oslash",
92         "cdot", "sqcup", "triangleleft", "odot",
93         "star", "vee", "amalg", "bigcirc",
94         "setminus", "wedge", "dagger", "circ",
95         "bullet", "wr", "ddagger", ""
96 };
97
98 int const nr_latex_bop = sizeof(latex_bop) / sizeof(char const *);
99
100 char const * latex_brel[] = {
101         "leq", "geq", "equiv", "models",
102         "prec", "succ", "sim", "perp",
103         "preceq", "succeq", "simeq", "mid",
104         "ll", "gg", "asymp", "parallel",
105         "subset", "supset", "approx", "smile",
106         "subseteq", "supseteq", "cong", "frown",
107         "sqsubseteq", "sqsupseteq", "doteq", "neq",
108         "in", "ni", "propto", "notin",
109         "vdash", "dashv", "bowtie", ""
110 };
111
112 int const nr_latex_brel = sizeof(latex_brel) / sizeof(char const *);
113
114 char const * latex_dots[] = {
115         "ldots", "cdots", "vdots", "ddots"
116 };
117
118 int const nr_latex_dots = sizeof(latex_dots) / sizeof(char const *);
119
120 char const * latex_greek[] = {
121         "Gamma", "Delta", "Theta", "Lambda", "Xi", "Pi",
122         "Sigma", "Upsilon", "Phi", "Psi", "Omega",
123         "alpha", "beta", "gamma", "delta", "epsilon", "varepsilon", "zeta",
124         "eta", "theta", "vartheta", "iota", "kappa", "lambda", "mu",
125         "nu", "xi", "pi", "varpi", "rho", "sigma", "varsigma",
126         "tau", "upsilon", "phi", "varphi", "chi", "psi", "omega", ""
127 };
128
129 int const nr_latex_greek = sizeof(latex_greek) / sizeof(char const *);
130
131 char const * latex_misc[] = {
132         "nabla", "partial", "infty", "prime", "ell",
133         "emptyset", "exists", "forall", "imath",  "jmath",
134         "Re", "Im", "aleph", "wp", "hbar",
135         "angle", "top", "bot", "Vert", "neg",
136         "flat", "natural", "sharp", "surd", "triangle",
137         "diamondsuit", "heartsuit", "clubsuit", "spadesuit",
138         "textrm Å", "textrm Ø", "mathcircumflex", "_",
139         "mathrm T",
140         "mathbb N", "mathbb Z", "mathbb Q",
141         "mathbb R", "mathbb C", "mathbb H",
142         "mathcal F", "mathcal L",
143         "mathcal H", "mathcal O", ""
144 };
145
146 int const nr_latex_misc = sizeof(latex_misc) / sizeof(char const *);
147
148 char const * latex_varsz[] = {
149         "sum", "int", "oint",
150         "prod", "coprod", "bigsqcup",
151         "bigotimes", "bigodot", "bigoplus",
152         "bigcap", "bigcup", "biguplus",
153         "bigvee", "bigwedge", ""
154 };
155
156 int const nr_latex_varsz = sizeof(latex_varsz) / sizeof(char const *);
157
158 char const * latex_ams_misc[] = {
159         "digamma", "varkappa", "beth", "daleth", "gimel",
160         "ulcorner", "urcorner", "llcorner", "lrcorner",
161         "hbar", "hslash", "vartriangle",
162         "triangledown", "square", "lozenge",
163         "circledS", "angle", "measuredangle",
164         "nexists", "mho", "Finv",
165         "Game", "Bbbk", "backprime",
166         "varnothing", "blacktriangle", "blacktriangledown",
167         "blacksquare", "blacklozenge", "bigstar",
168         "sphericalangle", "complement", "eth",
169         "diagup", "diagdown", ""
170 };
171
172 int const nr_latex_ams_misc = sizeof(latex_ams_misc) / sizeof(char const *);
173
174 char const * latex_ams_arrows[] = {
175         "dashrightarrow", "dashleftarrow", "leftleftarrows",
176         "leftrightarrows", "Lleftarrow", "twoheadleftarrow",
177         "leftarrowtail", "looparrowleft", "leftrightharpoons",
178         "curvearrowleft", "circlearrowleft", "Lsh",
179         "upuparrows", "upharpoonleft", "downharpoonleft",
180         "multimap", "leftrightsquigarrow", "rightrightarrows",
181         "rightleftarrows", "rightrightarrows", "rightleftarrows",
182         "twoheadrightarrow", "rightarrowtail", "looparrowright",
183         "rightleftharpoons", "curvearrowright", "circlearrowright",
184         "Rsh", "downdownarrows", "upharpoonright",
185         "downharpoonright", "rightsquigarrow",
186         "nleftarrow", "nrightarrow", "nLeftarrow",
187         "nRightarrow", "nleftrightarrow", "nLeftrightarrow"
188 };
189
190 int const nr_latex_ams_arrows = sizeof(latex_ams_arrows) / sizeof(char const *);
191
192 char const * latex_ams_rel[] = {
193         "leqq", "leqslant", "eqslantless", "eqslantgtr", "gtrsim", "gtrapprox",
194         "lesssim", "lessapprox", "approxeq", "gtrdot", "ggg", "gtrless",
195         "lessdot", "lll", "lessgtr", "gtreqless", "gtreqqless", "eqcirc",
196         "lesseqgtr", "lesseqqgtr", "doteqdot", "circeq", "triangleq", "thicksim",
197         "risingdotseq", "fallingdotseq", "backsim", "thickapprox", "supseteqq", "Supset",
198         "backsimeq", "subseteqq", "Subset","sqsupset", "succcurlyeq", "curlyeqsucc",
199         "sqsubset", "preccurlyeq", "curlyeqprec", "succsim", "succapprox", "vartriangleright",
200         "precsim", "precapprox", "vartriangleleft", "trianglerighteq", "Vdash", "shortmid",
201         "trianglelefteq", "vDash", "Vvdash", "shortparallel", "between", "pitchfork",
202         "smallsmile", "smallfrown", "bumpeq", "varpropto", "blacktriangleleft", "therefore",
203         "Bumpeq", "geqq", "geqslant", "backepsilon", "blacktriangleright", "because"
204 };
205
206 int const nr_latex_ams_rel = sizeof(latex_ams_rel) / sizeof(char const *);
207
208 char const * latex_ams_nrel[] = {
209         "nless", "nleq", "nleqslant", "ngeqslant", "ngeqq", "gneq",
210         "nleqq", "lneq", "lneqq","gneqq", "gverteqq", "gnsim",
211         "lvertneqq", "lnsim", "lnapprox", "gnapprox", "nsucc", "nsucceq",
212         "nprec", "npreceq", "precnsim","succnsim", "succnapprox", "ncong",
213         "precnapprox", "nsim", "nshortmid", "nshortparallel", "nparallel", "nvDash",
214
215         "nmid", "nvdash", "nvDash","nVDash", "ntriangleright", "ntrianglerighteq",
216         "ntriangleleft", "ntrianglelefteq", "nsubseteq", "nsupseteq", "nsupseteqq", "supsetneq",
217         "subsetneq", "varsubsetneq", "subsetneqq", "varsupsetneq", "supsetneqq", "varsupsetneqq",
218         "varsubsetneqq", "ngtr", "ngeq","", "", ""
219 };
220
221 int const nr_latex_ams_nrel = sizeof(latex_ams_nrel) / sizeof(char const *);
222
223
224 char const * latex_ams_ops[] = {
225         "dotplus", "smallsetminus", "Cap",
226         "Cup", "barwedge", "veebar",
227         "doublebarwedge", "boxminus", "boxtimes",
228         "boxdot", "boxplus", "divideontimes",
229         "ltimes", "rtimes", "leftthreetimes",
230         "rightthreetimes", "curlywedge", "curlyvee",
231         "circleddash", "circledast", "circledcirc",
232         "centerdot", "intercal", ""
233 };
234
235 int const nr_latex_ams_ops = sizeof(latex_ams_ops) / sizeof(char const *);
236
237 static char const ** mathed_get_pixmap_from_icon(int d)
238 {
239         switch (d) {
240         case MM_FRAC: return frac;
241         case MM_SQRT: return sqrt_xpm;
242         case MM_SUPER: return super_xpm;
243         case MM_SUB: return sub_xpm;
244         case MM_STYLE: return style_xpm;
245         case MM_DELIM: return delim;
246         case MM_MATRIX: return matrix;
247         case MM_EQU: return equation;
248         case MM_DECO: return deco;
249         case MM_SPACE: return space_xpm;
250         default: return 0;
251         }
252 }
253
254 static char const ** pixmapFromBitmapData(char const * s, int wx, int hx)
255 {
256         char const ** data = 0;
257
258         int id = -1;
259
260         int i = 0;
261         for (; i < 11; ++i) {
262                 char const ** latex_str = 0;
263                 switch (i) {
264                 case 0: latex_str = latex_greek; break;
265                 case 1: latex_str = latex_bop; break;
266                 case 2: latex_str = latex_brel; break;
267                 case 3: latex_str = latex_arrow; break;
268                 case 4: latex_str = latex_varsz; break;
269                 case 5: latex_str = latex_misc; break;
270                 case 6: latex_str = latex_ams_misc; break;
271                 case 7: latex_str = latex_ams_arrows; break;
272                 case 8: latex_str = latex_ams_rel; break;
273                 case 9: latex_str = latex_ams_nrel; break;
274                 case 10: latex_str = latex_ams_ops; break;
275                         // Add AMS stuff here -- MV
276                 }
277
278                 for (int k = 0; latex_str[k][0] > ' '; ++k) {
279                         if (compare(latex_str[k], s) == 0) {
280                                 id = k;
281                                 break;
282                         }
283                 }
284                 if (id >= 0) break;
285         }
286         if (i < 11 && id >= 0) {
287                 unsigned char const * bdata = 0;
288                 int w = 0;
289                 int h = 0;
290                 int dw = 0;
291                 int dh = 0;
292
293                 lyxerr [Debug::MATHED] << "Imando " << i << ", " << id << endl;
294                 switch (i) {
295                 case 0:
296                         if (id <= 10) {
297                                 w = Greek_width;
298                                 h = Greek_height;
299                                 bdata = Greek_bits;
300                                 dw = 6;
301                                 dh = 2;
302                         } else {
303                                 w = greek_width;
304                                 h = greek_height;
305                                 bdata = greek_bits;
306                                 dw = 7;
307                                 dh = 4;
308                                 id -= 11;
309                         }
310                         break;
311                 case 1:
312                         w = bop_width;
313                         h = bop_height;
314                         bdata = bop_bits;
315                         dw = 4;
316                         dh = 8;
317                         break;
318                 case 2:
319                         w = brel_width;
320                         h = brel_height;
321                         bdata = brel_bits;
322                         dw = 4;
323                         dh = 9;
324                         break;
325                 case 3:
326                         if (id < 20) {
327                                 w = arrow_width;
328                                 h = arrow_height;
329                                 bdata = arrow_bits;
330                                 dw = 5;
331                                 dh = 4;
332                         } else if (id > 28) {
333                                 w = darrow_width;
334                                 h = darrow_height;
335                                 bdata = darrow_bits;
336                                 dw = 2;
337                                 dh = 2;
338                                 id -= 29;
339                         } else {
340                                 w = larrow_width;
341                                 h = larrow_height;
342                                 bdata = larrow_bits;
343                                 dw = 2;
344                                 dh = 4;
345                                 id -= 20;
346                         }
347                         break;
348                 case 4:
349                         w = varsz_width;
350                         h = varsz_height;
351                         bdata = varsz_bits;
352                         dw = 3;
353                         dh = 5;
354                         break;
355                 case 5:
356                         if (id < 29) {
357                                 w = misc_width;
358                                 h = misc_height;
359                                 bdata = misc_bits;
360                                 dw = 5;
361                                 dh = 6;
362                         } else if (id > 36) {
363                                 w = misc3_width;
364                                 h = misc3_height;
365                                 bdata = misc3_bits;
366                                 dw = 3;
367                                 dh = 2;
368                                 id -= 37;
369                         } else {
370                                 w = misc2_width;
371                                 h = misc2_height;
372                                 bdata = misc2_bits;
373                                 dw = 2;
374                                 dh = 2;
375                                 id -= 29;
376                         }
377                         break;
378                 case 7:
379                 case 8:
380                 case 9:
381                 case 10:
382                         // to be added -- MV
383                         break;
384                 }
385                 int ww = w / dw;
386                 int hh = h / dh;
387                 XImage * xima = XCreateImage(GUIRunTime::x11Display(), 0, 1, XYBitmap, 0,
388                                              const_cast<char*>(reinterpret_cast<char const *>(bdata)), w, h, 8, 0);
389                 xima->byte_order = LSBFirst;
390                 xima->bitmap_bit_order = LSBFirst;
391                 int x = (id % dw) * ww;
392                 int y = (id/dw) * hh;
393                 if (ww > wx) ww = wx;
394                 if (hh > hx) hh = hx;
395                 XImage * sbima = XSubImage(xima, x, y, ww, hh);
396                 XpmCreateDataFromImage(GUIRunTime::x11Display(), const_cast<char***>(&data), sbima, sbima, 0);
397
398                 // Dirty hack to get blue symbols quickly
399                 char * sx = const_cast<char*>(strstr(data[2], "FFFFFFFF"));
400                 if (sx) {
401                         for (int k = 0; k < 8; ++k) sx[k] = '0';
402                 }
403
404 //      XDestroyImage(xima);
405         }
406
407         return data;
408 }
409
410
411 char const ** get_pixmap_from_symbol(char const * arg, int wx, int hx)
412 {
413         lyx::Assert(arg);
414
415         char const ** data = 0;
416         latexkeys const * l = in_word_set(arg);
417         if (!l)
418                 return 0;
419
420         switch (l->token) {
421         case LM_TK_FRAC:
422                 data = mathed_get_pixmap_from_icon(MM_FRAC);
423                 break;
424         case LM_TK_SQRT:
425                 data = mathed_get_pixmap_from_icon(MM_SQRT);
426                 break;
427         case LM_TK_SYM:
428         case LM_TK_CMR:
429         case LM_TK_CMSY:
430         case LM_TK_CMEX:
431         case LM_TK_CMM:
432         case LM_TK_MSA:
433         case LM_TK_MSB:
434                 // I have to use directly the bitmap data since the
435                 // bitmap tables are not yet created when this
436                 // function is called.
437                 data = pixmapFromBitmapData(arg, wx, hx);
438                 break;
439         default:
440                 break;
441         }
442
443         return data;
444 }