namespace {
- int getCols(MathInsetTypes type)
+ int getCols(string const & type)
{
- switch (type) {
- case LM_OT_EQNARRAY:
- return 3;
- case LM_OT_ALIGN:
- case LM_OT_ALIGNAT:
- case LM_OT_XALIGNAT:
- case LM_OT_XXALIGNAT:
- return 2;
- default:;
- }
+ if (type == "eqnarray")
+ return 3;
+ if (type == "align")
+ return 2;
+ if (type == "alignat")
+ return 2;
+ if (type == "xalignat")
+ return 2;
+ if (type == "xxalignat")
+ return 2;
return 1;
}
return numbered ? "" : "*";
}
- MathInsetTypes typecode(string const & s)
+
+ int typecode(string const & s)
{
- if (s == "inline") return LM_OT_SIMPLE;
- if (s == "simple") return LM_OT_SIMPLE;
- if (s == "equation") return LM_OT_EQUATION;
- if (s == "display") return LM_OT_EQUATION;
- if (s == "eqnarray") return LM_OT_EQNARRAY;
- if (s == "align") return LM_OT_ALIGN;
- if (s == "alignat") return LM_OT_ALIGNAT;
- if (s == "xalignat") return LM_OT_XALIGNAT;
- if (s == "xxalignat") return LM_OT_XXALIGNAT;
- if (s == "multline") return LM_OT_MULTLINE;
- if (s == "gather") return LM_OT_GATHER;
- return LM_OT_NONE;
+ if (s == "none") return 0;
+ if (s == "simple") return 1;
+ if (s == "equation") return 2;
+ if (s == "eqnarray") return 3;
+ if (s == "align") return 4;
+ if (s == "alignat") return 5;
+ if (s == "xalignat") return 6;
+ if (s == "xxalignat") return 7;
+ if (s == "multline") return 8;
+ if (s == "gather") return 9;
+ lyxerr << "unknown hull type '" << s << "'\n";
+ return 0;
}
-
- string normalName(MathInsetTypes t)
+ bool smaller(string const & s, string const & t)
{
- switch (t) {
- case LM_OT_EQUATION: return "equation";
- case LM_OT_EQNARRAY: return "eqnarray";
- case LM_OT_ALIGN: return "align";
- case LM_OT_ALIGNAT: return "alignat";
- case LM_OT_XALIGNAT: return "xalignat";
- case LM_OT_XXALIGNAT: return "xxalignat";
- case LM_OT_MULTLINE: return "multline";
- case LM_OT_GATHER: return "gather";
- case LM_OT_SIMPLE: return "simple";
- default: break;
- }
- return "unknown";
+ return typecode(s) < typecode(t);
}
+
} // end anon namespace
MathHullInset::MathHullInset()
- : MathGridInset(1, 1), objtype_(LM_OT_NONE), nonum_(1), label_(1)
+ : MathGridInset(1, 1), type_("none"), nonum_(1), label_(1)
{
setDefaults();
}
-MathHullInset::MathHullInset(MathInsetTypes t)
- : MathGridInset(getCols(t), 1), objtype_(t), nonum_(1), label_(1)
+MathHullInset::MathHullInset(string const & type)
+ : MathGridInset(getCols(type), 1), type_(type), nonum_(1), label_(1)
{
setDefaults();
}
-MathHullInset::MathHullInset(MathInsetTypes t, MathGridInset const & grid)
- : MathGridInset(grid), objtype_(t), nonum_(1), label_(1)
+MathHullInset::MathHullInset(string const & type, MathGridInset const & grid)
+ : MathGridInset(grid), type_(type), nonum_(1), label_(1)
{
setDefaults();
}
-MathHullInset::MathHullInset(MathInsetTypes t, col_type cols)
- : MathGridInset(cols, 1), objtype_(t), nonum_(1), label_(1)
+MathHullInset::MathHullInset(string const & type, col_type cols)
+ : MathGridInset(cols, 1), type_(type), nonum_(1), label_(1)
{
setDefaults();
}
char MathHullInset::defaultColAlign(col_type col)
{
- switch (getType()) {
- case LM_OT_ALIGN:
- case LM_OT_ALIGNAT:
- case LM_OT_XALIGNAT:
- case LM_OT_XXALIGNAT:
- return "rl"[col & 1];
- case LM_OT_EQNARRAY:
- return "rcl"[col];
- default:;
- }
+ if (type_ == "eqnarray")
+ return "rcl"[col];
+ if (typecode(type_) >= typecode("align"))
+ return "rl"[col & 1];
return 'c';
}
int MathHullInset::defaultColSpace(col_type col)
{
- switch (getType()) {
- case LM_OT_ALIGN:
- case LM_OT_ALIGNAT:
- return 0;
- case LM_OT_XALIGNAT:
- return (col & 1) ? 20 : 0;
- case LM_OT_XXALIGNAT:
- return (col & 1) ? 40 : 0;
- default:;
- }
+ if (type_ == "align" || type_ == "alignat")
+ return 0;
+ if (type_ == "xalignat")
+ return (col & 1) ? 20 : 0;
+ if (type_ == "xxalignat")
+ return (col & 1) ? 40 : 0;
return 0;
}
char const * MathHullInset::standardFont() const
{
- if (getType() == LM_OT_NONE)
+ if (type_ == "none")
return "lyxnochange";
return "mathnormal";
}
MathGridInset::metrics(mi);
if (display()) {
- ascent_ += 12;
- descent_ += 12;
+ dim_.a += 12;
+ dim_.d += 12;
}
if (numberedType()) {
l = max(l, mathed_string_width(mi.base.font, nicelabel(row)));
if (l)
- width_ += 30 + l;
+ dim_.w += 30 + l;
}
// make it at least as high as the current font
int asc = 0;
int des = 0;
math_font_max_dim(mi.base.font, asc, des);
- ascent_ = max(ascent_, asc);
- descent_ = max(descent_, des);
+ dim_.a = max(dim_.a, asc);
+ dim_.d = max(dim_.d, des);
+
+ // for markers
+ metricsMarkers2();
}
void MathHullInset::draw(MathPainterInfo & pi, int x, int y) const
{
MathFontSetChanger dummy(pi.base, standardFont());
- MathGridInset::draw(pi, x, y);
+ MathGridInset::draw(pi, x + 1, y);
if (numberedType()) {
int const xx = x + colinfo_.back().offset_ + colinfo_.back().width_ + 20;
drawStr(pi, pi.base.font, xx, yy, nicelabel(row));
}
}
+
+ drawMarkers2(pi, x, y);
}
-void MathHullInset::metricsT(TextMetricsInfo const &) const
+void MathHullInset::metricsT(TextMetricsInfo const & mi) const
{
-#if 0
if (display()) {
MathGridInset::metricsT(mi);
- } else
-#endif
- {
+ } else {
ostringstream os;
WriteStream wi(os, false, true);
write(wi);
- width_ = os.str().size();
- ascent_ = 1;
- descent_ = 0;
+ dim_.w = os.str().size();
+ dim_.a = 1;
+ dim_.d = 0;
}
}
void MathHullInset::drawT(TextPainter & pain, int x, int y) const
{
-#if 0
if (display()) {
MathGridInset::drawT(pain, x, y);
- } else
-#endif
- {
+ } else {
ostringstream os;
WriteStream wi(os, false, true);
write(wi);
void MathHullInset::label(row_type row, string const & label)
{
+ lyxerr << "setting label '" << label << "' for row " << row << endl;
label_[row] = label;
}
bool MathHullInset::ams() const
{
return
- objtype_ == LM_OT_ALIGN ||
- objtype_ == LM_OT_MULTLINE ||
- objtype_ == LM_OT_GATHER ||
- objtype_ == LM_OT_ALIGNAT ||
- objtype_ == LM_OT_XALIGNAT ||
- objtype_ == LM_OT_XXALIGNAT;
+ type_ == "align" ||
+ type_ == "multline" ||
+ type_ == "gather" ||
+ type_ == "alignat" ||
+ type_ == "xalignat" ||
+ type_ == "xxalignat";
}
bool MathHullInset::display() const
{
- return getType() != LM_OT_SIMPLE && getType() != LM_OT_NONE;
+ return type_ != "simple" && type_ != "none";
}
-vector<string> const MathHullInset::getLabelList() const
+vector<string> MathHullInset::getLabelList() const
{
vector<string> res;
for (row_type row = 0; row < nrows(); ++row)
bool MathHullInset::numberedType() const
{
- if (getType() == LM_OT_NONE)
+ if (type_ == "none")
return false;
- if (getType() == LM_OT_SIMPLE)
+ if (type_ == "simple")
return false;
- if (getType() == LM_OT_XXALIGNAT)
+ if (type_ == "xxalignat")
return false;
for (row_type row = 0; row < nrows(); ++row)
if (!nonum_[row])
{
bool n = numberedType();
- switch (getType()) {
- case LM_OT_NONE:
- break;
-
- case LM_OT_SIMPLE:
- os << '$';
- if (cell(0).empty())
- os << ' ';
- break;
-
- case LM_OT_EQUATION:
- if (n)
- os << "\\begin{equation" << star(n) << "}\n";
- else
- os << "\\[\n";
- break;
-
- case LM_OT_EQNARRAY:
- os << "\\begin{eqnarray" << star(n) << "}\n";
- break;
-
- case LM_OT_ALIGN:
- os << "\\begin{align" << star(n) << "}\n";
- break;
-
- case LM_OT_ALIGNAT:
- os << "\\begin{alignat" << star(n) << "}"
- << "{" << static_cast<unsigned int>(ncols()/2) << "}\n";
- break;
-
- case LM_OT_XALIGNAT:
- os << "\\begin{xalignat" << star(n) << "}"
- << "{" << static_cast<unsigned int>(ncols()/2) << "}\n";
- break;
-
- case LM_OT_XXALIGNAT:
- os << "\\begin{xxalignat}"
- << "{" << static_cast<unsigned int>(ncols()/2) << "}\n";
- break;
-
- case LM_OT_MULTLINE:
- os << "\\begin{multline}\n";
- break;
-
- case LM_OT_GATHER:
- os << "\\begin{gather}\n";
- break;
-
- default:
- os << "\\begin{unknown" << star(n) << "}";
- }
-}
+ if (type_ == "none")
+ ;
+ else if (type_ == "simple") {
+ os << '$';
+ if (cell(0).empty())
+ os << ' ';
+ }
-void MathHullInset::footer_write(WriteStream & os) const
-{
- bool n = numberedType();
+ else if (type_ == "equation") {
+ if (n)
+ os << "\\begin{equation" << star(n) << "}\n";
+ else
+ os << "\\[\n";
+ }
- switch (getType()) {
- case LM_OT_NONE:
- os << "\n";
- break;
+ else if (type_ == "eqnarray" || type_ == "align")
+ os << "\\begin{" << type_ << star(n) << "}\n";
- case LM_OT_SIMPLE:
- os << '$';
- break;
+ else if (type_ == "alignat" || type_ == "xalignat")
+ os << "\\begin{" << type_ << star(n) << "}"
+ << "{" << static_cast<unsigned int>(ncols()/2) << "}\n";
+
+ else if (type_ == "xxalignat")
+ os << "\\begin{" << type_ << "}"
+ << "{" << static_cast<unsigned int>(ncols()/2) << "}\n";
+
+ else if (type_ == "multline" || type_ == "gather")
+ os << "\\begin{" << type_ << "}\n";
- case LM_OT_EQUATION:
- if (n)
- os << "\\end{equation" << star(n) << "}\n";
- else
- os << "\\]\n";
- break;
+ else
+ os << "\\begin{unknown" << star(n) << "}";
+}
- case LM_OT_EQNARRAY:
- os << "\n\\end{eqnarray" << star(n) << "}\n";
- break;
- case LM_OT_ALIGN:
- os << "\n\\end{align" << star(n) << "}\n";
- break;
+void MathHullInset::footer_write(WriteStream & os) const
+{
+ bool n = numberedType();
- case LM_OT_ALIGNAT:
- os << "\n\\end{alignat" << star(n) << "}\n";
- break;
+ if (type_ == "none")
+ os << "\n";
- case LM_OT_XALIGNAT:
- os << "\n\\end{xalignat" << star(n) << "}\n";
- break;
+ else if (type_ == "simple")
+ os << '$';
- case LM_OT_XXALIGNAT:
- os << "\n\\end{xxalignat}\n";
- break;
+ else if (type_ == "equation")
+ if (n)
+ os << "\\end{equation" << star(n) << "}\n";
+ else
+ os << "\\]\n";
- case LM_OT_MULTLINE:
- os << "\n\\end{multline}\n";
- break;
+ else if (type_ == "eqnarray" || type_ == "align" || type_ == "alignat"
+ || type_ == "xalignat")
+ os << "\n\\end{" << type_ << star(n) << "}\n";
- case LM_OT_GATHER:
- os << "\n\\end{gather}\n";
- break;
+ else if (type_ == "xxalignat" || type_ == "multline" || type_ == "gather")
+ os << "\n\\end{" << type_ << "}\n";
- default:
- os << "\\end{unknown" << star(n) << "}";
- }
+ else
+ os << "\\end{unknown" << star(n) << "}";
}
void MathHullInset::addFancyCol(col_type col)
{
- switch (getType()) {
- case LM_OT_EQUATION:
- mutate(LM_OT_EQNARRAY);
- break;
-
- case LM_OT_EQNARRAY:
- mutate(LM_OT_ALIGN);
- addFancyCol(col);
- break;
-
- case LM_OT_ALIGN:
- mutate(LM_OT_ALIGNAT);
- addFancyCol(col);
- break;
-
- case LM_OT_ALIGNAT:
- case LM_OT_XALIGNAT:
- case LM_OT_XXALIGNAT:
- MathGridInset::addCol(col);
- MathGridInset::addCol(col + 1);
- break;
-
- default:
- break;
+ if (type_ == "equation")
+ mutate("eqnarray");
+
+ else if (type_ == "eqnarray") {
+ mutate("align");
+ addFancyCol(col);
+ }
+
+ else if (type_ == "align") {
+ mutate("alignat");
+ addFancyCol(col);
+ }
+
+ else if (type_ == "alignat" || type_ == "xalignat" || type_ == "xxalignat") {
+ MathGridInset::addCol(col);
+ MathGridInset::addCol(col + 1);
}
}
void MathHullInset::delFancyCol(col_type col)
{
- switch (getType()) {
- case LM_OT_ALIGNAT:
- case LM_OT_XALIGNAT:
- case LM_OT_XXALIGNAT:
- MathGridInset::delCol(col + 1);
- MathGridInset::delCol(col);
- break;
- default:
- break;
+ if (type_ == "alignat" || type_ == "xalignat" || type_ == "xxalignat") {
+ MathGridInset::delCol(col + 1);
+ MathGridInset::delCol(col);
}
}
}
-void MathHullInset::mutate(string const & newtype)
-{
- if (newtype == "dump") {
- dump();
- return;
- }
- //lyxerr << "mutating from '" << getType() << "' to '" << newtype << "'\n";
- mutate(typecode(newtype));
-}
-
-
void MathHullInset::glueall()
{
MathArray ar;
for (idx_type i = 0; i < nargs(); ++i)
ar.push_back(cell(i));
- *this = MathHullInset(LM_OT_SIMPLE);
+ *this = MathHullInset("simple");
cell(0) = ar;
+ setDefaults();
}
-MathInsetTypes MathHullInset::getType() const
+string const & MathHullInset::getType() const
{
- return objtype_;
+ return type_;
}
-void MathHullInset::setType(MathInsetTypes t)
+void MathHullInset::setType(string const & type)
{
- objtype_ = t;
+ type_ = type;
setDefaults();
}
-void MathHullInset::mutate(MathInsetTypes newtype)
+void MathHullInset::mutate(string const & newtype)
{
- //lyxerr << "mutating from '" << getType() << "' to '" << newtype << "'\n";
-
- if (newtype == getType())
- return;
+ //lyxerr << "mutating from '" << type_ << "' to '" << newtype << "'\n";
- switch (getType()) {
- case LM_OT_NONE:
- setType(LM_OT_SIMPLE);
- numbered(0, false);
- mutate(newtype);
- break;
+ // we try to move along the chain
+ // none <-> simple <-> equation <-> eqnarray
- case LM_OT_SIMPLE:
- switch (newtype) {
- case LM_OT_NONE:
- setType(LM_OT_NONE);
- break;
- default:
- setType(LM_OT_EQUATION);
- numbered(0, false);
- mutate(newtype);
- }
- break;
-
- case LM_OT_EQUATION:
- switch (newtype) {
- case LM_OT_NONE:
- case LM_OT_SIMPLE:
- setType(LM_OT_SIMPLE);
- mutate(newtype);
- break;
-
- case LM_OT_ALIGN:
- case LM_OT_ALIGNAT:
- case LM_OT_XALIGNAT:
- case LM_OT_XXALIGNAT: {
-
- MathGridInset::addCol(1);
-
- // split it "nicely"
- pos_type pos = firstRelOp(cell(0));
- cell(1) = cell(0);
- cell(0).erase(pos, cell(0).size());
- cell(1).erase(0, pos);
- setType(LM_OT_ALIGN);
- mutate(newtype);
- break;
- }
+ if (newtype == "dump") {
+ dump();
+ }
- case LM_OT_EQNARRAY:
- default:
- MathGridInset::addCol(1);
- MathGridInset::addCol(1);
+ else if (newtype == type_) {
+ // done
+ }
- // split it "nicely" on the firest relop
- pos_type pos = firstRelOp(cell(0));
- cell(1) = MathArray(cell(0), pos, cell(0).size());
- cell(0).erase(pos, cell(0).size());
+ else if (type_ == "none") {
+ setType("simple");
+ numbered(0, false);
+ mutate(newtype);
+ }
- if (cell(1).size()) {
- cell(2) = MathArray(cell(1), 1, cell(1).size());
- cell(1).erase(1, cell(1).size());
- }
+ else if (type_ == "simple") {
+ if (newtype == "none") {
+ setType("none");
+ } else {
+ setType("equation");
+ numbered(0, false);
+ mutate(newtype);
+ }
+ }
- setType(LM_OT_EQNARRAY);
- mutate(newtype);
- break;
- }
- break;
-
- case LM_OT_EQNARRAY:
- switch (newtype) {
- case LM_OT_SIMPLE:
- case LM_OT_EQUATION: {
- // set correct (no)numbering
- bool allnonum = true;
- for (row_type row = 0; row < nrows(); ++row) {
- if (!nonum_[row])
- allnonum = false;
- }
-
- // set first non-empty label
- string label;
- for (row_type row = 0; row < nrows(); ++row) {
- if (!label_[row].empty()) {
- label = label_[row];
- break;
- }
- }
-
- glueall();
-
- nonum_[0] = allnonum;
- label_[0] = label;
- mutate(newtype);
- break;
- }
+ else if (type_ == "equation") {
+ if (smaller(newtype, type_)) {
+ setType("simple");
+ mutate(newtype);
+ } else if (newtype == "eqnarray") {
+ MathGridInset::addCol(1);
+ MathGridInset::addCol(1);
+
+ // split it "nicely" on the firest relop
+ pos_type pos = firstRelOp(cell(0));
+ cell(1) = MathArray(cell(0), pos, cell(0).size());
+ cell(0).erase(pos, cell(0).size());
+
+ if (cell(1).size()) {
+ cell(2) = MathArray(cell(1), 1, cell(1).size());
+ cell(1).erase(1, cell(1).size());
+ }
+ setType("eqnarray");
+ mutate(newtype);
+ } else {
+ MathGridInset::addCol(1);
+ // split it "nicely"
+ pos_type pos = firstRelOp(cell(0));
+ cell(1) = cell(0);
+ cell(0).erase(pos, cell(0).size());
+ cell(1).erase(0, pos);
+ setType("align");
+ mutate(newtype);
+ }
+ }
- case LM_OT_ALIGN:
- case LM_OT_ALIGNAT:
- case LM_OT_XALIGNAT:
- case LM_OT_XXALIGNAT:
- default: {
- for (row_type row = 0; row < nrows(); ++row) {
- idx_type c = 3 * row + 1;
- cell(c).push_back(cell(c + 1));
- }
- MathGridInset::delCol(2);
- setType(LM_OT_ALIGN);
- mutate(newtype);
+ else if (type_ == "eqnarray") {
+ if (smaller(newtype, type_)) {
+ // set correct (no)numbering
+ bool allnonum = true;
+ for (row_type row = 0; row < nrows(); ++row)
+ if (!nonum_[row])
+ allnonum = false;
+
+ // set first non-empty label
+ string label;
+ for (row_type row = 0; row < nrows(); ++row) {
+ if (!label_[row].empty()) {
+ label = label_[row];
break;
}
}
- break;
-
- case LM_OT_ALIGN:
- switch (newtype) {
- case LM_OT_SIMPLE:
- case LM_OT_EQUATION:
- case LM_OT_EQNARRAY:
- MathGridInset::addCol(1);
- setType(LM_OT_EQNARRAY);
- mutate(newtype);
- break;
- case LM_OT_ALIGNAT:
- case LM_OT_XALIGNAT:
- case LM_OT_XXALIGNAT:
- setType(newtype);
- break;
-
- default:
- lyxerr << "mutation from '" << getType()
- << "' to '" << newtype << "' not implemented"
- << endl;
- break;
+ glueall();
+ nonum_[0] = allnonum;
+ label_[0] = label;
+ mutate(newtype);
+ } else { // align & Co.
+ for (row_type row = 0; row < nrows(); ++row) {
+ idx_type c = 3 * row + 1;
+ cell(c).push_back(cell(c + 1));
}
- break;
+ MathGridInset::delCol(2);
+ setType("align");
+ mutate(newtype);
+ }
+ }
- case LM_OT_MULTLINE:
- switch (newtype) {
- case LM_OT_GATHER:
- setType(LM_OT_GATHER);
- break;
- default:
- lyxerr << "mutation from '" << getType()
- << "' to '" << newtype << "' not implemented"
- << endl;
- break;
- }
+ else if (type_ == "align") {
+ if (smaller(newtype, type_)) {
+ MathGridInset::addCol(1);
+ setType("eqnarray");
+ mutate(newtype);
+ } else {
+ setType(newtype);
+ }
+ }
- case LM_OT_GATHER:
- switch (newtype) {
- case LM_OT_MULTLINE:
- setType(LM_OT_MULTLINE);
- break;
- default:
- lyxerr << "mutation from '" << getType()
- << "' to '" << newtype << "' not implemented"
- << endl;
- break;
- }
+ else if (type_ == "multline") {
+ if (newtype == "gather") {
+ setType("gather");
+ } else {
+ lyxerr << "mutation from '" << type_
+ << "' to '" << newtype << "' not implemented"
+ << endl;
+ }
+ }
- default:
- lyxerr << "mutation from '" << getType()
- << "' to '" << newtype << "' not implemented"
- << endl;
- break;
+ else if (type_ == "gather") {
+ if (newtype == "multline") {
+ setType("multline");
+ } else {
+ lyxerr << "mutation from '" << type_
+ << "' to '" << newtype << "' not implemented" << endl;
+ }
+ }
+
+ else {
+ lyxerr << "mutation from '" << type_
+ << "' to '" << newtype << "' not implemented" << endl;
}
}
void MathHullInset::normalize(NormalStream & os) const
{
- os << "[formula " << normalName(getType()) << " ";
+ os << "[formula " << type_ << " ";
MathGridInset::normalize(os);
os << "] ";
}
void MathHullInset::infoize(std::ostream & os) const
{
- os << "Type: " << normalName(getType());
+ os << "Type: " << type_;
}
lyx::Assert(nonum_.size() == nrows());
lyx::Assert(label_.size() == nrows());
}
-
-
-
-
-
-//
-// MathParInset
-//
-
-MathParInset::MathParInset()
-{
- lyxerr << "constructing MathParInset\n";
-}
-
-
-void MathParInset::metrics(MathMetricsInfo & mi) const
-{
- MathFontSetChanger dummy(mi.base, "textnormal");
- MathGridInset::metrics(mi);
-}
-
-
-void MathParInset::draw(MathPainterInfo & pi, int x, int y) const
-{
- MathFontSetChanger dummy(pi.base, "textnormal");
- MathGridInset::draw(pi, x, y);
-}
-
-
-void MathParInset::write(WriteStream & os) const
-{
- for (idx_type i = 0; i < nargs(); ++i)
- os << cell(i) << "\n";
-}
-
-
-void MathParInset::infoize(std::ostream & os) const
-{
- os << "Type: Paragraph ";
-}
-