]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/xforms/MathsSymbols.C
Bugfixes: checkboxes to radiobuttons (from J�rgen S) and remove a little
[lyx.git] / src / frontends / xforms / MathsSymbols.C
index 617f13a6f824aa7bc8d94259b8c3629c57f0296a..ff2a4b3d71dd084e7c32b6345af1bd3ec59fd24b 100644 (file)
 #pragma implementation
 #endif
 
-#include "support/lstrings.h"
 #include "support/LAssert.h" 
+#include "support/lstrings.h"
 #include "debug.h"
-
 #include "MathsSymbols.h"
-#include "FormMaths.h"
+#include "FormMathsPanel.h"
  
 using std::max;
 using std::endl;
 using std::ostream;
 
+#ifndef CXX_GLOBAL_CSTD
+using std::strstr;
+#endif
+
+
 /* Latex code for those bitmaps */
-static
-char const * latex_greek[] = {
-       "Gamma", "Delta", "Theta", "Lambda", "Xi", "Pi",
-       "Sigma", "Upsilon", "Phi", "Psi", "Omega",
-       "alpha", "beta", "gamma", "delta", "epsilon", "varepsilon", "zeta",
-       "eta", "theta", "vartheta", "iota", "kappa", "lambda", "mu",
-       "nu", "xi", "pi", "varpi", "rho", "sigma", "varsigma",
-       "tau", "upsilon", "phi", "varphi", "chi", "psi", "omega", ""
-};
 
-static
-char const * latex_brel[] = {
-       "leq", "geq", "equiv", "models",
-       "prec", "succ", "sim", "perp",
-       "preceq", "succeq", "simeq", "mid",
-       "ll", "gg", "asymp", "parallel",
-       "subset", "supset", "approx", "smile",
-       "subseteq", "supseteq", "cong", "frown",
-       "sqsubseteq", "sqsupseteq", "doteq", "neq",
-       "in", "ni", "propto", "notin",
-       "vdash", "dashv", "bowtie", ""
+#include "greek.xbm"
+#include "arrows.xbm"
+#include "brel.xbm"
+#include "bop.xbm"
+#include "misc.xbm"
+#include "varsz.xbm"
+#include "dots.xbm"
+
+#include "ams_misc.xbm"
+#include "ams_arrows.xbm"
+#include "ams_rel.xbm"
+#include "ams_nrel.xbm"
+#include "ams_ops.xbm"
+
+#include "mathed/math_parser.h"
+#include "frac.xpm"
+#include "sub.xpm"
+#include "super.xpm"
+#include "style.xpm"
+#include "sqrt.xpm"
+#include "delim.xbm"
+#include "delim.xpm"
+#include "deco.xbm"
+#include "deco.xpm"
+#include "space.xpm"
+#include "matrix.xpm"
+#include "equation.xpm"
+
+char const * function_names[] = {
+       "arccos", "arcsin", "arctan", "arg", "bmod",
+       "cos", "cosh", "cot", "coth", "csc", "deg",
+       "det", "dim", "exp", "gcd", "hom", "inf", "ker",
+       "lg", "lim", "liminf", "limsup", "ln", "log",
+       "max", "min", "sec", "sin", "sinh", "sup",
+       "tan", "tanh"
 };
 
-static
+int const nr_function_names = sizeof(function_names) /
+                                    sizeof(char const *);
+
 char const * latex_arrow[] = {
        "downarrow", "leftarrow", "Downarrow", "Leftarrow",
        "hookleftarrow", "rightarrow", "uparrow", "Rightarrow", "Uparrow",
@@ -63,15 +84,8 @@ char const * latex_arrow[] = {
        "nwarrow", "nearrow", "swarrow", "searrow",  "",
 };
 
-char const * latex_varsz[] = {
-       "sum", "int", "oint",
-       "prod", "coprod", "bigsqcup",
-       "bigotimes", "bigodot", "bigoplus",
-       "bigcap", "bigcup", "biguplus",
-       "bigvee", "bigwedge", ""
-};
+int const nr_latex_arrow = sizeof(latex_arrow) / sizeof(char const *);
 
-static
 char const * latex_bop[] = {
        "pm", "cap", "diamond", "oplus",
        "mp", "cup", "bigtriangleup", "ominus",
@@ -83,228 +97,169 @@ char const * latex_bop[] = {
        "bullet", "wr", "ddagger", ""
 };
 
-static
-char const * latex_misc[] = {
-       "nabla", "partial", "infty", "prime", "ell",
-       "emptyset", "exists", "forall", "imath",  "jmath",
-       "Re", "Im", "aleph", "wp", "hbar",
-       "angle", "top", "bot", "Vert", "neg",
-       "flat", "natural", "sharp", "surd", "triangle",
-       "diamondsuit", "heartsuit", "clubsuit", "spadesuit", ""
+int const nr_latex_bop = sizeof(latex_bop) / sizeof(char const *);
+
+char const * latex_brel[] = {
+       "leq", "geq", "equiv", "models",
+       "prec", "succ", "sim", "perp",
+       "preceq", "succeq", "simeq", "mid",
+       "ll", "gg", "asymp", "parallel",
+       "subset", "supset", "approx", "smile",
+       "subseteq", "supseteq", "cong", "frown",
+       "sqsubseteq", "sqsupseteq", "doteq", "neq",
+       "in", "ni", "propto", "notin",
+       "vdash", "dashv", "bowtie", ""
 };
 
-static
+int const nr_latex_brel = sizeof(latex_brel) / sizeof(char const *);
+
 char const * latex_dots[] = {
        "ldots", "cdots", "vdots", "ddots"
 };
 
-BitmapMenu * BitmapMenu::active = 0;
-
-extern "C" void C_MathsSymbolsBitmapCB(FL_OBJECT * ob, long data)
-{
-       BitmapMenu * menu = static_cast<BitmapMenu*>(ob->u_vdata);
-       int const i = menu->GetIndex(ob);
-       string str;
-
-       lyxerr[Debug::GUI] << "Bitmap callback value " << data << endl;
-       if (i < 0) 
-               return;
-       switch (data) {
-               case MM_GREEK:
-                       str = latex_greek[i];
-                       break;
-               case MM_ARROW:
-                       str = latex_arrow[i];
-                       break;
-               case MM_BRELATS:
-                       str = latex_brel[i];
-                       break;
-               case MM_BOP:
-                       str = latex_bop[i];
-                       break;
-               case MM_VARSIZE:
-                       str = latex_varsz[i];
-                       break;
-               case MM_MISC:
-                       str = latex_misc[i];
-                       break;
-               case MM_DOTS:
-                       /* ewww */
-                       str = latex_dots[i - 29];
-                       break;
-               default:
-                       Assert(false);
-                       break;
-       }
-
-       menu->form_->insertSymbol(str);
-       menu->hide();
-}
+int const nr_latex_dots = sizeof(latex_dots) / sizeof(char const *);
 
-extern "C" int C_MathsSymbolsPeekCB(FL_FORM *, void * xev)
-{
-       if (!BitmapMenu::active)
-               return 0;
-
-       if (static_cast<XEvent *>(xev)->type == ButtonPress) {
-               BitmapMenu::active->hide();
-               return 1;
-       }
-       if (static_cast<XEvent *>(xev)->type != KeyPress)
-               return 0;
-
-       /* yuck */
-       char c[5];
-       KeySym keysym;
-       XLookupString(&static_cast<XEvent *>(xev)->xkey, &c[0], 5, &keysym, 0);
-       if (keysym == XK_Left)
-               BitmapMenu::active->prev(); 
-       else if (keysym == XK_Right)
-               BitmapMenu::active->next();
-       else
-               BitmapMenu::active->hide();
-       return 1;
-}
-
-
-BitmapMenu::BitmapMenu(FormMaths * f, int n,  FL_OBJECT * bt, BitmapMenu * prevx)
-       : current_(0), bitmaps_(n), form_(f)
-{
-       w = h = 0;
-       form = 0;
-       ww = 2 * FL_abs(FL_BOUND_WIDTH);
-       x = y = ww;
-       y += 8;
-       button = bt;
-       button->u_vdata = this;
-       prev_ = prevx;
-       next_ = 0;
-       if (prev_)
-               prev_->next_ = this;
-}
-
-
-BitmapMenu::~BitmapMenu()
-{
-       delete next_;
-       if (form->visible) 
-               hide();
-       fl_free_form(form);
-}
+char const * latex_greek[] = {
+       "Gamma", "Delta", "Theta", "Lambda", "Xi", "Pi",
+       "Sigma", "Upsilon", "Phi", "Psi", "Omega",
+       "alpha", "beta", "gamma", "delta", "epsilon", "varepsilon", "zeta",
+       "eta", "theta", "vartheta", "iota", "kappa", "lambda", "mu",
+       "nu", "xi", "pi", "varpi", "rho", "sigma", "varsigma",
+       "tau", "upsilon", "phi", "varphi", "chi", "psi", "omega", ""
+};
 
+int const nr_latex_greek = sizeof(latex_greek) / sizeof(char const *);
 
-void BitmapMenu::hide()
-{
-       fl_hide_form(form);
-       fl_set_button(button, 0);
-       active = 0;
-}
+char const * latex_misc[] = {
+       "nabla", "partial", "infty", "prime", "ell",
+       "emptyset", "exists", "forall", "imath",  "jmath",
+       "Re", "Im", "aleph", "wp", "hbar",
+       "angle", "top", "bot", "Vert", "neg",
+       "flat", "natural", "sharp", "surd", "triangle",
+       "diamondsuit", "heartsuit", "clubsuit", "spadesuit", 
+       "mathbb N", "mathbb Z", "mathbb Q", 
+       "mathbb R", "mathbb C", "mathbb H",
+       "mathcal F", "mathcal L", 
+       "mathcal H", "mathcal O",""
+};
 
+int const nr_latex_misc = sizeof(latex_misc) / sizeof(char const *);
 
-void BitmapMenu::show()
-{
-       if (active)
-               active->hide();
-       active = this;
-       fl_set_button(button, 1);
-       fl_show_form(form, FL_PLACE_MOUSE, FL_NOBORDER, "");
-}
+char const * latex_varsz[] = {
+       "sum", "int", "oint",
+       "prod", "coprod", "bigsqcup",
+       "bigotimes", "bigodot", "bigoplus",
+       "bigcap", "bigcup", "biguplus",
+       "bigvee", "bigwedge", ""
+};
 
+int const nr_latex_varsz = sizeof(latex_varsz) / sizeof(char const *);
+
+char const * latex_ams_misc[] = {
+       "digamma", "varkappa", "beth", "daleth", "gimel",
+       "ulcorner", "urcorner", "llcorner", "lrcorner",
+       "hbar", "hslash", "vartriangle",
+       "triangledown", "square", "lozenge",
+       "circledS", "angle", "measuredangle",
+       "nexists", "mho", "Finv",
+       "Game", "Bbbk", "backprime",
+       "varnothing", "blacktriangle", "blacktriangledown",
+       "blacksquare", "blacklozenge", "bigstar",
+       "sphericalangle", "complement", "eth",
+       "diagup", "diagdown", ""
+};
 
-FL_OBJECT *
-BitmapMenu::AddBitmap(int id, int nx, int ny, int bw, int bh,
-                     unsigned char const * data, bool vert)
-{
-       if (current_ >= bitmaps_.size())
-               return 0;
-       int wx = bw + ww / 2;
-       int wy = bh + ww / 2;
-       wx += (wx % nx);
-       wy += (wy % ny);
-       FL_OBJECT * obj = fl_create_bmtable(1, x, y, wx, wy, "");
-       fl_set_object_callback(obj, C_MathsSymbolsBitmapCB, id);
-       fl_set_object_lcol(obj, FL_BLUE);
-       fl_set_object_boxtype(obj, FL_UP_BOX);
-       fl_set_bmtable_data(obj, nx, ny, bw, bh, data);
-       if (vert) {
-               y += wy + 8;
-               h = max(y, h);
-               w = max(x + wx + ww, w);
-       } else  {
-               x += wx + 8;
-               w = max(x, w);
-               h = max(y + wy + ww, h);
-       }
-       bitmaps_[current_++] = obj;
-       return obj;
-}
+int const nr_latex_ams_misc = sizeof(latex_ams_misc) / sizeof(char const *);
+
+char const * latex_ams_arrows[] = {
+       "dashrightarrow", "dashleftarrow", "leftleftarrows",
+       "leftrightarrows", "Lleftarrow", "twoheadleftarrow",
+       "leftarrowtail", "looparrowleft", "leftrightharpoons",
+       "curvearrowleft", "circlearrowleft", "Lsh",
+       "upuparrows", "upharpoonleft", "downharpoonleft",
+       "multimap", "leftrightsquigarrow", "rightrightarrows",
+       "rightleftarrows", "rightrightarrows", "rightleftarrows",
+       "twoheadrightarrow", "rightarrowtail", "looparrowright",
+       "rightleftharpoons", "curvearrowright", "circlearrowright",
+       "Rsh", "downdownarrows", "upharpoonright", 
+       "downharpoonright", "rightsquigarrow",
+       "nleftarrow", "nrightarrow", "nLeftarrow",
+       "nRightarrow", "nleftrightarrow", "nLeftrightarrow"
+};
 
+int const nr_latex_ams_arrows = sizeof(latex_ams_arrows) / sizeof(char const *);
+
+char const * latex_ams_rel[] = {
+       "leqq", "leqslant", "eqslantless",
+       "lesssim", "lessapprox", "approxeq",
+       "lessdot", "lll", "lessgtr",
+       "lesseqgtr", "lesseqqgtr", "doteqdot",
+       "risingdotseq", "fallingdotseq", "backsim",
+       "backsimeq", "subseteqq", "Subset",
+       "sqsubset", "preccurlyeq", "curlyeqprec",
+       "precsim", "precapprox", "vartriangleleft",
+       "trianglelefteq", "vDash", "Vvdash",
+       "smallsmile", "smallfrown", "bumpeq",
+       "Bumpeq", "geqq", "geqslant",
+       "eqslantgtr", "gtrsim", "gtrapprox",
+       "gtrdot", "ggg", "gtrless", 
+       "gtreqless", "gtreqqless", "eqcirc",
+       "circeq", "triangleq", "thicksim",
+       "thickapprox", "supseteqq", "Supset",
+       "sqsupset", "succcurlyeq", "curlyeqsucc",
+       "succsim", "succapprox", "vartriangleright",
+       "trianglerighteq", "Vdash", "shortmid",
+       "shortparallel", "between", "pitchfork", 
+       "varpropto", "blacktriangleleft", "therefore",
+       "backepsilon", "blacktriangleright", "because"
+};
 
-void BitmapMenu::create()
-{
-       Assert(current_ >= bitmaps_.size());
-       form = fl_bgn_form(FL_UP_BOX, w, h);
-       for (current_ = 0; current_ < bitmaps_.size(); ++current_) {
-               fl_add_object(form, bitmaps_[current_]);
-               bitmaps_[current_]->u_vdata = this;
-       }
-       fl_end_form();
-       fl_register_raw_callback(form, KeyPressMask, C_MathsSymbolsPeekCB);
-}
+int const nr_latex_ams_rel = sizeof(latex_ams_rel) / sizeof(char const *);
+
+char const * latex_ams_nrel[] = {
+       "nless", "nleq", "nleqslant",
+       "nleqq", "lneq", "lneqq",
+       "lvertneqq", "lnsim", "lnapprox", 
+       "nprec", "npreceq", "precnsim",
+       "precnapprox", "nsim", "nshortmid",
+       "nmid", "nvdash", "nvDash",
+       "ntriangleleft", "ntrianglelefteq", "nsubseteq",
+       "subsetneq", "varsubsetneq", "subsetneqq",
+       "varsubsetneqq", "ngtr", "ngeq",
+       "ngeqslant", "ngeqq", "gneq",
+       "gneqq", "gverteqq", "gnsim",
+       "gnapprox", "nsucc", "nsucceq",
+       "succnsim", "succnapprox", "ncong",
+       "nshortparallel", "nparallel", "nvDash",
+       "nVDash", "ntriangleright", "ntrianglerighteq",
+       "nsupseteq", "nsupseteqq", "supsetneq",
+       "varsupsetneq", "supsetneqq", "varsupsetneqq"
+};
 
+int const nr_latex_ams_nrel = sizeof(latex_ams_nrel) / sizeof(char const *);
 
-int BitmapMenu::GetIndex(FL_OBJECT * ob)
-{
-       if (active == this) {
-               int k = 0;
-               for (current_ = 0; current_ < bitmaps_.size(); ++current_) {
-                       if (bitmaps_[current_] == ob)
-                               return k + fl_get_bmtable(ob);
-                       k += fl_get_bmtable_maxitems(bitmaps_[current_]);
-               }
-       }
-       return -1;
-}
 
-/* the below is stuff used by Toolbar to make icons. It should be elsewhere
- * but depends on the name arrays above ...
- */
+char const * latex_ams_ops[] = {
+       "dotplus", "smallsetminus", "Cap",
+       "Cup", "barwedge", "veebar",
+       "doublebarwedge", "boxminus", "boxtimes",
+       "boxdot", "boxplus", "divideontimes",
+       "ltimes", "rtimes", "leftthreetimes",
+       "rightthreetimes", "curlywedge", "curlyvee",
+       "circleddash", "circledast", "circledcirc",
+       "centerdot", "intercal", ""
+};
 
-#include "greek.xbm"
-#include "arrows.xbm"
-#include "brel.xbm"
-#include "bop.xbm"
-#include "misc.xbm"
-#include "varsz.xbm"
-#include "dots.xbm"
-#include "mathed/math_parser.h"
-#include "frac.xpm"
-#include "sqrt.xpm"
-#include "delim.xbm"
-#include "delim.xpm"
-#include "deco.xbm"
-#include "deco.xpm"
-#include "space.xpm"
-#include "matrix.xpm"
-#include "equation.xpm"
+int const nr_latex_ams_ops = sizeof(latex_ams_ops) / sizeof(char const *);
 
 static char const ** mathed_get_pixmap_from_icon(int d)
 {
        switch (d) {
                case MM_FRAC: return frac;
                case MM_SQRT: return sqrt_xpm;
+               case MM_SUPER: return super_xpm;
+               case MM_SUB: return sub_xpm;
+               case MM_STYLE: return style_xpm;
                case MM_DELIM: return delim;
                case MM_MATRIX: return matrix;
                case MM_EQU: return equation;
@@ -321,7 +276,7 @@ static char const ** pixmapFromBitmapData(char const * s, int wx, int hx)
        int id = -1;
 
        int i = 0;
-       for (; i < 6; ++i) {
+       for (; i < 11; ++i) {
                char const ** latex_str = 0;
                switch (i) {
                case 0: latex_str = latex_greek; break;
@@ -330,6 +285,12 @@ static char const ** pixmapFromBitmapData(char const * s, int wx, int hx)
                case 3: latex_str = latex_arrow; break;
                case 4: latex_str = latex_varsz; break;
                case 5: latex_str = latex_misc; break;
+               case 6: latex_str = latex_ams_misc; break;
+               case 7: latex_str = latex_ams_arrows; break;
+               case 8: latex_str = latex_ams_rel; break;
+               case 9: latex_str = latex_ams_nrel; break;
+               case 10: latex_str = latex_ams_ops; break;
+               // Add AMS stuff here -- MV
                }
 
                for (int k = 0; latex_str[k][0] > ' '; ++k) {
@@ -340,14 +301,14 @@ static char const ** pixmapFromBitmapData(char const * s, int wx, int hx)
                }
                if (id >= 0) break;
        }
-       if (i < 6 && id >= 0) {
+       if (i < 11 && id >= 0) {
                unsigned char const * bdata = 0;
                int w = 0;
                int h = 0;
                int dw = 0;
                int dh = 0;
 
-               lyxerr[Debug::MATHED] << "Imando " << i << ", " << id << endl;
+               lyxerr [Debug::MATHED] << "Imando " << i << ", " << id << endl;
                switch (i) {
                case 0:
                        if (id <= 10) {
@@ -410,16 +371,37 @@ static char const ** pixmapFromBitmapData(char const * s, int wx, int hx)
                        dh = 5;
                        break;
                case 5:
-                       w = misc_width;
-                       h = misc_height;
-                       bdata = misc_bits;
-                       dw = 5;
-                       dh = 6;
+                       if (id < 29) {
+                               w = misc_width;
+                               h = misc_height;
+                               bdata = misc_bits;
+                               dw = 5;
+                               dh = 6;
+                       } else if (id > 36) {
+                               w = misc3_width;
+                               h = misc3_height;
+                               bdata = misc3_bits;
+                               dw = 3;
+                               dh = 2;
+                               id -= 37;
+                       } else {
+                               w = misc2_width;
+                               h = misc2_height;
+                               bdata = misc2_bits;
+                               dw = 2;
+                               dh = 2;
+                               id -= 29;
+                       }
+                       break;
+               case 7:
+               case 8:
+               case 9:
+               case 10:
+                       // to be added -- MV
                        break;
                }
                int ww = w / dw;
                int hh = h / dh;
-
                XImage * xima = XCreateImage(fl_get_display(), 0, 1, XYBitmap, 0,
                                             const_cast<char*>(reinterpret_cast<char const *>(bdata)), w, h, 8, 0);
                xima->byte_order = LSBFirst;
@@ -446,8 +428,10 @@ static char const ** pixmapFromBitmapData(char const * s, int wx, int hx)
  
 char const ** get_pixmap_from_symbol(char const * arg, int wx, int hx)
 {
+       lyx::Assert(arg);
+       
        char const ** data = 0;
-       latexkeys const * l = in_word_set (arg, strlen(arg));
+       latexkeys const * l = in_word_set(arg);
        if (!l)
                return 0;
 
@@ -458,13 +442,20 @@ char const ** get_pixmap_from_symbol(char const * arg, int wx, int hx)
        case LM_TK_SQRT:
                data = mathed_get_pixmap_from_icon(MM_SQRT);
                break;
-       case LM_TK_BIGSYM:
        case LM_TK_SYM:
+       case LM_TK_CMR:
+       case LM_TK_CMSY:
+       case LM_TK_CMEX:
+       case LM_TK_CMM:
+       case LM_TK_MSA:
+       case LM_TK_MSB:
                // I have to use directly the bitmap data since the
                // bitmap tables are not yet created when this
                // function is called.
                data = pixmapFromBitmapData(arg, wx, hx);
                break;
+       default:
+               break;
        }
 
        return data;