* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
- * \author Alejandro Aguilar Sierra
- * \author John Levon
+ * \author Angus Leeming
*
- * Full author contact details are available in file CREDITS
+ * Full author contact details are available in file CREDITS.
*/
+#include <config.h>
+
#include "ControlMath.h"
+#include "debug.h"
+#include "funcrequest.h"
+
+#include "support/lyxalgo.h" // sorted
+#include "support/lstrings.h"
+#include "support/filetools.h"
+
+#include <functional>
+
+using std::string;
+
+namespace lyx {
+
+using support::compare;
+using support::LibFileSearch;
+using support::subst;
+
+namespace frontend {
+
+ControlMath::ControlMath(Dialog & dialog)
+ : Dialog::Controller(dialog)
+{}
+
+
+void ControlMath::dispatchFunc(kb_action action, string const & arg) const
+{
+ kernel().dispatch(FuncRequest(action, arg));
+}
+
+
+void ControlMath::dispatchInsert(string const & name) const
+{
+ dispatchFunc(LFUN_INSERT_MATH, '\\' + name);
+}
+
+
+void ControlMath::dispatchSubscript() const
+{
+ dispatchFunc(LFUN_INSERT_MATH, "_");
+ dispatchFunc(LFUN_DOWN);
+}
+
+
+void ControlMath::dispatchSuperscript() const
+{
+ dispatchFunc(LFUN_INSERT_MATH, "^");
+ dispatchFunc(LFUN_UP);
+}
+
+
+void ControlMath::dispatchCubeRoot() const
+{
+ dispatchFunc(LFUN_INSERT_MATH, "\\root");
+ dispatchFunc(LFUN_SELFINSERT, "3");
+ dispatchFunc(LFUN_RIGHT);
+}
+
+
+void ControlMath::dispatchMatrix(string const & str) const
+{
+ dispatchFunc(LFUN_INSERT_MATRIX, str);
+}
+
+
+void ControlMath::dispatchDelim(string const & str) const
+{
+ dispatchFunc(LFUN_MATH_DELIM, str);
+}
+
+
+void ControlMath::dispatchToggleDisplay() const
+{
+ dispatchFunc(LFUN_MATH_DISPLAY);
+}
+
+
+void ControlMath::showDialog(string const & name) const
+{
+ dispatchFunc(LFUN_DIALOG_SHOW, name);
+}
+
char const * function_names[] = {
"arccos", "arcsin", "arctan", "arg", "bmod",
"det", "dim", "exp", "gcd", "hom", "inf", "ker",
"lg", "lim", "liminf", "limsup", "ln", "log",
"max", "min", "sec", "sin", "sinh", "sup",
- "tan", "tanh", ""
+ "tan", "tanh", "Pr", ""
};
int const nr_function_names = sizeof(function_names) / sizeof(char const *) - 1;
"angle", "top", "bot", "Vert", "neg",
"flat", "natural", "sharp", "surd", "triangle",
"diamondsuit", "heartsuit", "clubsuit", "spadesuit",
- "textrm Å", "textrm Ø", "mathcircumflex", "_",
+ "textrm \\AA", "textrm \\O", "mathcircumflex", "_",
"mathrm T",
"mathbb N", "mathbb Z", "mathbb Q",
"mathbb R", "mathbb C", "mathbb H",
"lessdot", "lll", "lessgtr", "gtreqless", "gtreqqless", "eqcirc",
"lesseqgtr", "lesseqqgtr", "doteqdot", "circeq", "triangleq", "thicksim",
"risingdotseq", "fallingdotseq", "backsim", "thickapprox", "supseteqq", "Supset",
- "backsimeq", "subseteqq", "Subset","sqsupset", "succcurlyeq", "curlyeqsucc",
+ "backsimeq", "subseteqq", "Subset", "sqsupset", "succcurlyeq", "curlyeqsucc",
"sqsubset", "preccurlyeq", "curlyeqprec", "succsim", "succapprox", "vartriangleright",
"precsim", "precapprox", "vartriangleleft", "trianglerighteq", "Vdash", "shortmid",
"trianglelefteq", "vDash", "Vvdash", "shortparallel", "between", "pitchfork",
char const * latex_ams_nrel[] = {
"nless", "nleq", "nleqslant", "ngeqslant", "ngeqq", "gneq",
- "nleqq", "lneq", "lneqq","gneqq", "gvertneqq", "gnsim",
+ "nleqq", "lneq", "lneqq", "gneqq", "gvertneqq", "gnsim",
"lvertneqq", "lnsim", "lnapprox", "gnapprox", "nsucc", "nsucceq",
"nprec", "npreceq", "precnsim","succnsim", "succnapprox", "ncong",
"precnapprox", "nsim", "nshortmid", "nshortparallel", "nparallel", "nvDash",
- "nmid", "nvdash", "nvDash","nVDash", "ntriangleright", "ntrianglerighteq",
+ "nmid", "nvdash", "nvDash", "nVDash", "ntriangleright", "ntrianglerighteq",
"ntriangleleft", "ntrianglelefteq", "nsubseteq", "nsupseteq", "nsupseteqq", "supsetneq",
"subsetneq", "varsubsetneq", "subsetneqq", "varsupsetneq", "supsetneqq", "varsupsetneqq",
- "varsubsetneqq", "ngtr", "ngeq","", "", ""
+ "varsubsetneqq", "ngtr", "ngeq", "", "", ""
};
int const nr_latex_ams_nrel = sizeof(latex_ams_nrel) / sizeof(char const *);
};
int const nr_latex_ams_ops = sizeof(latex_ams_ops) / sizeof(char const *);
+
+
+namespace {
+
+struct XPMmap {
+ char const * key;
+ char const * value;
+};
+
+
+bool operator<(XPMmap const & lhs, XPMmap const & rhs)
+{
+ return compare(lhs.key, rhs.key) < 0;
+}
+
+
+class CompareKey : public std::unary_function<XPMmap, bool> {
+public:
+ CompareKey(string const & name) : name_(name) {}
+ bool operator()(XPMmap const & other) const {
+ return other.key == name_;
+ }
+private:
+ string const name_;
+};
+
+
+XPMmap sorted_xpm_map[] = {
+ { "Bumpeq", "bumpeq2" },
+ { "Cap", "cap2" },
+ { "Cup", "cup2" },
+ { "Delta", "delta2" },
+ { "Downarrow", "downarrow2" },
+ { "Gamma", "gamma2" },
+ { "Lambda", "lambda2" },
+ { "Leftarrow", "leftarrow2" },
+ { "Leftrightarrow", "leftrightarrow2" },
+ { "Longleftarrow", "longleftarrow2" },
+ { "Longleftrightarrow", "longleftrightarrow2" },
+ { "Longrightarrow", "longrightarrow2" },
+ { "Omega", "omega2" },
+ { "Phi", "phi2" },
+ { "Pi", "pi2" },
+ { "Psi", "psi2" },
+ { "Rightarrow", "rightarrow2" },
+ { "Sigma", "sigma2" },
+ { "Subset", "subset2" },
+ { "Supset", "supset2" },
+ { "Theta", "theta2" },
+ { "Uparrow", "uparrow2" },
+ { "Updownarrow", "updownarrow2" },
+ { "Upsilon", "upsilon2" },
+ { "Vdash", "vdash3" },
+ { "Xi", "xi2" },
+ { "nLeftarrow", "nleftarrow2" },
+ { "nLeftrightarrow", "nleftrightarrow2" },
+ { "nRightarrow", "nrightarrow2" },
+ { "nVDash", "nvdash3" },
+ { "nvDash", "nvdash2" },
+ { "textrm \\AA", "textrm_AA"},
+ { "textrm \\O", "textrm_Oe"},
+ { "vDash", "vdash2" }
+};
+
+size_t const nr_sorted_xpm_map = sizeof(sorted_xpm_map) / sizeof(XPMmap);
+
+} // namespace anon
+
+
+string const find_xpm(string const & name)
+{
+ XPMmap const * const begin = sorted_xpm_map;
+ XPMmap const * const end = begin + nr_sorted_xpm_map;
+ BOOST_ASSERT(sorted(begin, end));
+
+ XPMmap const * const it =
+ std::find_if(begin, end, CompareKey(name));
+
+ string xpm_name;
+ if (it != end)
+ xpm_name = it->value;
+ else {
+ xpm_name = subst(name, "_", "underscore");
+ xpm_name = subst(xpm_name, ' ', '_');
+
+ // This way we can have "math-delim { }" on the toolbar.
+ xpm_name = subst(xpm_name, "(", "lparen");
+ xpm_name = subst(xpm_name, ")", "rparen");
+ xpm_name = subst(xpm_name, "[", "lbracket");
+ xpm_name = subst(xpm_name, "]", "rbracket");
+ xpm_name = subst(xpm_name, "{", "lbrace");
+ xpm_name = subst(xpm_name, "}", "rbrace");
+ xpm_name = subst(xpm_name, "|", "bars");
+ }
+
+ lyxerr[Debug::GUI] << "find_xpm(" << name << ")\n"
+ << "Looking for math XPM called \""
+ << xpm_name << '"' << std::endl;
+
+ return LibFileSearch("images/math/", xpm_name, "xpm");
+}
+
+} // namespace frontend
+} // namespace lyx