+ //lyxerr << "mutating from '" << getType() << "' to '" << newtype << "'\n";
+ mutate(typecode(newtype));
+}
+
+
+void MathMatrixInset::glueall()
+{
+ MathArray ar;
+ for (idx_type i = 0; i < nargs(); ++i)
+ ar.push_back(cell(i));
+ *this = MathMatrixInset(LM_OT_SIMPLE);
+ cell(0) = ar;
+}
+
+
+MathInsetTypes MathMatrixInset::getType() const
+{
+ return objtype_;
+}
+
+
+void MathMatrixInset::setType(MathInsetTypes t)
+{
+ objtype_ = t;
+ setDefaults();
+}
+
+
+
+void MathMatrixInset::mutate(MathInsetTypes newtype)
+{
+ //lyxerr << "mutating from '" << getType() << "' to '" << newtype << "'\n";
+
+ if (newtype == getType())
+ return;
+
+ switch (getType()) {
+ case LM_OT_SIMPLE:
+ setType(LM_OT_EQUATION);
+ numbered(0, false);
+ mutate(newtype);
+ break;
+
+ case LM_OT_EQUATION:
+ switch (newtype) {
+ case LM_OT_SIMPLE:
+ setType(LM_OT_SIMPLE);
+ 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;
+ }
+
+ case LM_OT_EQNARRAY:
+ default:
+ MathGridInset::addCol(1);
+ MathGridInset::addCol(1);
+
+ // split it "nicely" on the firest relop
+ pos_type pos = firstRelOp(cell(0));
+ cell(1) = cell(0);
+ cell(0).erase(pos, cell(0).size());
+ cell(1).erase(0, pos);
+
+ if (cell(1).size()) {
+ cell(2) = cell(1);
+ cell(1).erase(1, cell(1).size());
+ cell(2).erase(0);
+ }
+
+ 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;
+ }
+
+ 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);
+ 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\n";
+ break;
+ }
+ break;
+
+ case LM_OT_MULTLINE:
+ switch (newtype) {
+ case LM_OT_GATHER:
+ setType(LM_OT_GATHER);
+ break;
+ default:
+ lyxerr << "mutation from '" << getType()
+ << "' to '" << newtype << "' not implemented\n";
+ break;
+ }
+
+ case LM_OT_GATHER:
+ switch (newtype) {
+ case LM_OT_MULTLINE:
+ setType(LM_OT_MULTLINE);
+ break;
+ default:
+ lyxerr << "mutation from '" << getType()
+ << "' to '" << newtype << "' not implemented\n";
+ break;
+ }
+
+ default:
+ lyxerr << "mutation from '" << getType()
+ << "' to '" << newtype << "' not implemented\n";