X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fmathed%2Fmath_matrixinset.C;h=f1343b47362f52326f42b1c13c21dc6d57cbf230;hb=3e93baac3cd18e27db3eb2a1fcaf90b25e0918a6;hp=8c05eb7fc6029f916b8a343d55fc4a53662692e0;hpb=b906c06db6ecd4b63bb5cdb5781ab05029303e25;p=lyx.git diff --git a/src/mathed/math_matrixinset.C b/src/mathed/math_matrixinset.C index 8c05eb7fc6..f1343b4736 100644 --- a/src/mathed/math_matrixinset.C +++ b/src/mathed/math_matrixinset.C @@ -1,261 +1,91 @@ +/** + * \file math_matrixinset.C + * This file is part of LyX, the document processor. + * Licence details can be found in the file COPYING. + * + * \author André Pönitz + * + * Full author contact details are available in file CREDITS. + */ + #include #include "math_matrixinset.h" -#include "math_rowst.h" -#include "math_xiter.h" - -extern int number_of_newlines; +#include "math_data.h" +#include "math_mathmlstream.h" -MathMatrixInset::MathMatrixInset(int m, int n, short st) - : MathParInset(st, "array", LM_OT_MATRIX), nc(m), nr(0), ws_(m), - v_align(0), h_align(nc, 'c') -{ - row = 0; - flag = 15; - if (n > 0) { - row = new MathedRowSt(nc+1); - MathedXIter it(this); - for (int j = 1; j < n; ++j) it.addRow(); - nr = n; - if (nr == 1 && nc > 1) { - for (int j = 0; j < nc - 1; ++j) - it.Insert('T', LM_TC_TAB); - } - } else if (n < 0) { - row = new MathedRowSt(nc + 1); - nr = 1; - } -} +using std::auto_ptr; -MathMatrixInset::MathMatrixInset(MathMatrixInset * mt) - : MathParInset(mt->GetStyle(), mt->GetName(), mt->GetType()), - nc(mt->nc), nr(0), ws_(mt->nc), v_align(mt->v_align), h_align(mt->h_align) -{ - MathedIter it; - it.SetData(mt->GetData()); - array = it.Copy(); - if (mt->row != 0) { - MathedRowSt * r, * ro= 0, * mrow = mt->row; - //mrow = mt->row; // This must be redundant... - while (mrow) { - r = new MathedRowSt(nc + 1); - r->setNumbered(mrow->isNumbered()); - //if (mrow->label) - r->setLabel(mrow->getLabel()); - if (!ro) - row = r; - else - ro->setNext(r); - mrow = mrow->getNext(); - ro = r; - ++nr; - } - } else - row = 0; - flag = mt->flag; -} +MathMatrixInset::MathMatrixInset(MathGridInset const & p) + : MathGridInset(p) +{} -MathMatrixInset::~MathMatrixInset() +auto_ptr MathMatrixInset::clone() const { - MathedRowSt * r = row; - while (r) { - MathedRowSt * q = r->getNext(); - delete r; - r = q; - } + return auto_ptr(new MathMatrixInset(*this)); } -MathedInset * MathMatrixInset::Clone() +void MathMatrixInset::write(WriteStream & os) const { - return new MathMatrixInset(this); + MathGridInset::write(os); } -void MathMatrixInset::SetAlign(char vv, string const & hh) +void MathMatrixInset::normalize(NormalStream & os) const { - v_align = vv; - h_align = hh.substr(0, nc); // usr just h_align = hh; perhaps + MathGridInset::normalize(os); } -// Check the number of tabs and crs -void MathMatrixInset::SetData(MathedArray * a) +void MathMatrixInset::maple(MapleStream & os) const { - if (!a) return; - MathedIter it(a); - int nn = nc - 1; - nr = 1; - // count tabs per row - while (it.OK()) { - if (it.IsTab()) { - if (nn < 0) { - it.Delete(); - continue; - } else { -// it.Next(); - --nn; - } - } - if (it.IsCR()) { - while (nn > 0) { - it.Insert(' ', LM_TC_TAB); - --nn; - } - nn = nc - 1; - ++nr; + os << "matrix(" << int(nrows()) << ',' << int(ncols()) << ",["; + for (idx_type idx = 0; idx < nargs(); ++idx) { + if (idx) + os << ','; + os << cell(idx); } - it.Next(); - } - it.Reset(); - - // Automatically inserts tabs around bops - // DISABLED because it's very easy to insert tabs - array = a; + os << "])"; } -void MathMatrixInset::draw(Painter & pain, int x, int baseline) +void MathMatrixInset::maxima(MaximaStream & os) const { - MathParInset::draw(pain, x, baseline); + os << "matrix("; + for (row_type row = 0; row < nrows(); ++row) { + if (row) + os << ','; + os << '['; + for (col_type col = 0; col < ncols(); ++col) { + if (col) + os << ','; + os << cell(index(row, col)); + } + os << ']'; + } + os << ')'; } - -void MathMatrixInset::Metrics() +void MathMatrixInset::mathmlize(MathMLStream & os) const { - int i, hl, h = 0; - MathedRowSt * cprow= 0; - - if (!row) { -// lyxerr << " MIDA "; - MathedXIter it(this); - row = it.adjustVerticalSt(); - } - - // Clean the arrays - MathedRowSt * cxrow = row; - while (cxrow) { - for (i = 0; i <= nc; ++i) cxrow->setTab(i, 0); - cxrow = cxrow->getNext(); - } - - // Basic metrics - MathParInset::Metrics(); - - if (nc <= 1 && !row->getNext()) { - row->ascent(ascent); - row->descent(descent); - } - - // Vertical positions of each row - cxrow = row; - while (cxrow) { - for (i = 0; i < nc; ++i) { - if (cxrow == row || ws_[i] < cxrow->getTab(i)) - ws_[i] = cxrow->getTab(i); - if (cxrow->getNext() == 0 && ws_[i] == 0) ws_[i] = df_width; - } - - cxrow->setBaseline((cxrow == row) ? - cxrow->ascent() : - cxrow->ascent() + cprow->descent() - + MATH_ROWSEP + cprow->getBaseline()); - h += cxrow->ascent() + cxrow->descent() + MATH_ROWSEP; - cprow = cxrow; - cxrow = cxrow->getNext(); - } - - hl = Descent(); - h -= MATH_ROWSEP; - - // Compute vertical align - switch (v_align) { - case 't': ascent = row->getBaseline(); break; - case 'b': ascent = h - hl; break; - default: ascent = (row->getNext()) ? h / 2: h - hl; break; - } - descent = h - ascent + 2; - - // Increase ws_[i] for 'R' columns (except the first one) - for (i = 1; i < nc; ++i) - if (h_align[i] == 'R') - ws_[i] += 10*df_width; - // Increase ws_[i] for 'C' column - if (h_align[0] == 'C') - if (ws_[0] < 7*workWidth/8) - ws_[0] = 7*workWidth/8; - - // Adjust local tabs - cxrow = row; - width = MATH_COLSEP; - while (cxrow) { - int rg = MATH_COLSEP, ww, lf = 0; //, * w = cxrow->w; - for (i = 0; i < nc; ++i) { - bool isvoid = false; - if (cxrow->getTab(i) <= 0) { - cxrow->setTab(i, df_width); - isvoid = true; - } - switch (h_align[i]) { - case 'l': - lf = 0; - break; - case 'c': - lf = (ws_[i] - cxrow->getTab(i))/2; - break; - case 'r': - case 'R': - lf = ws_[i] - cxrow->getTab(i); - break; - case 'C': - if (cxrow == row) - lf = 0; - else if (!cxrow->getNext()) - lf = ws_[i] - cxrow->getTab(i); - else - lf = (ws_[i] - cxrow->getTab(i))/2; - break; - } - ww = (isvoid) ? lf : lf + cxrow->getTab(i); - cxrow->setTab(i, lf + rg); - rg = ws_[i] - ww + MATH_COLSEP; - if (cxrow == row) width += ws_[i] + MATH_COLSEP; - } - cxrow->setBaseline(cxrow->getBaseline() - ascent); - cxrow = cxrow->getNext(); - } + MathGridInset::mathmlize(os); } -void MathMatrixInset::Write(ostream & os, bool fragile) +void MathMatrixInset::octave(OctaveStream & os) const { - if (GetType() == LM_OT_MATRIX){ - if (fragile) - os << "\\protect"; - os << "\\begin{" - << name - << '}'; - if (v_align == 't' || v_align == 'b') { - os << '[' - << char(v_align) - << ']'; - } - os << '{' - << h_align - << "}\n"; - ++number_of_newlines; - } - MathParInset::Write(os, fragile); - if (GetType() == LM_OT_MATRIX){ - os << "\n"; - if (fragile) - os << "\\protect"; - os << "\\end{" - << name - << '}'; - ++number_of_newlines; + os << '['; + for (row_type row = 0; row < nrows(); ++row) { + if (row) + os << ';'; + os << '['; + for (col_type col = 0; col < ncols(); ++col) + os << cell(index(row, col)) << ' '; + os << ']'; } + os << ']'; }