From: André Pönitz Date: Tue, 17 Jul 2001 07:38:41 +0000 (+0000) Subject: rename math_(root|grid).[Ch] to math_(root|grid)inset.[Ch] X-Git-Tag: 1.6.10~21066 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;ds=sidebyside;h=5c40a062b2034f48f5b79079017bbaac8ba9363c;p=lyx.git rename math_(root|grid).[Ch] to math_(root|grid)inset.[Ch] git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@2259 a592a061-630c-0410-9148-cb99ea01b6c8 --- diff --git a/src/mathed/ChangeLog b/src/mathed/ChangeLog index b437db23f6..a14639c957 100644 --- a/src/mathed/ChangeLog +++ b/src/mathed/ChangeLog @@ -1,10 +1,15 @@ +2001-07-16 André Pönitz + + * math_grid.[Ch] -> math_gridinset.[Ch] + math_root.[Ch] -> math_rootinset.[Ch]: more consistent names + 2001-07-16 Lars Gullik Bjønnes * math_cursor.C (operator==): moved ouf of struct (operator<): ditto (normalAnchor): reversed one test (but shouldn't it really be >= ?) -2001-07-12 André Pönitz +2001-07-16 André Pönitz * math_cursor.[hC]: multicell selection (multicell pasete still defunct) diff --git a/src/mathed/Makefile.am b/src/mathed/Makefile.am index 5c1d408dce..d2e13830f7 100644 --- a/src/mathed/Makefile.am +++ b/src/mathed/Makefile.am @@ -35,8 +35,8 @@ libmathed_la_SOURCES = \ math_fracinset.h \ math_funcinset.C \ math_funcinset.h \ - math_grid.C \ - math_grid.h \ + math_gridinset.C \ + math_gridinset.h \ math_hash.C \ math_inset.C \ math_inset.h \ @@ -52,8 +52,8 @@ libmathed_la_SOURCES = \ math_matrixinset.h \ math_parser.C \ math_parser.h \ - math_root.C \ - math_root.h \ + math_rootinset.C \ + math_rootinset.h \ math_scriptinset.C \ math_scriptinset.h \ math_sizeinset.C \ diff --git a/src/mathed/math_arrayinset.h b/src/mathed/math_arrayinset.h index 8661877c37..71888145c8 100644 --- a/src/mathed/math_arrayinset.h +++ b/src/mathed/math_arrayinset.h @@ -2,7 +2,7 @@ #ifndef MATH_ARRAYINSET_H #define MATH_ARRAYINSET_H -#include "math_grid.h" +#include "math_gridinset.h" #ifdef __GNUG__ #pragma interface diff --git a/src/mathed/math_cursor.C b/src/mathed/math_cursor.C index 6da2f7bbee..51fe37089e 100644 --- a/src/mathed/math_cursor.C +++ b/src/mathed/math_cursor.C @@ -23,33 +23,31 @@ #include #include -#include "math_inset.h" -#include "math_arrayinset.h" -#include "math_parser.h" -#include "math_cursor.h" -#include "math_macro.h" -#include "math_macroarg.h" -#include "math_macrotable.h" -#include "math_root.h" -#include "support/lstrings.h" #include "debug.h" #include "LColor.h" #include "Painter.h" -#include "math_matrixinset.h" -#include "math_grid.h" -#include "math_spaceinset.h" -#include "math_funcinset.h" +#include "mathed/support.h" +#include "formulabase.h" +#include "math_cursor.h" +#include "math_arrayinset.h" #include "math_bigopinset.h" -#include "math_fracinset.h" #include "math_decorationinset.h" -#include "math_dotsinset.h" #include "math_deliminset.h" +#include "math_dotsinset.h" +#include "math_fracinset.h" +#include "math_funcinset.h" +#include "math_gridinset.h" +#include "math_macro.h" +#include "math_macroarg.h" +#include "math_macrotable.h" #include "math_macrotemplate.h" +#include "math_matrixinset.h" +#include "math_rootinset.h" +#include "math_spaceinset.h" #include "math_sqrtinset.h" +#include "support/lstrings.h" #include "math_scriptinset.h" -#include "mathed/support.h" -#include "formulabase.h" - +#include "math_parser.h" using std::endl; using std::min; diff --git a/src/mathed/math_grid.C b/src/mathed/math_grid.C deleted file mode 100644 index 5070ba661b..0000000000 --- a/src/mathed/math_grid.C +++ /dev/null @@ -1,428 +0,0 @@ -#ifdef __GNUG__ -#pragma implementation -#endif - -#include "math_grid.h" -#include "support/LOstream.h" -#include "debug.h" - - -namespace { - -/// -int const MATH_COLSEP = 10; -/// -int const MATH_ROWSEP = 10; -/// -int const MATH_BORDER = 2; - -} - - -MathGridInset::RowInfo::RowInfo() - : upperline_(false), lowerline_(false) -{} - - -MathGridInset::ColInfo::ColInfo() - : h_align_('c'), leftline_(false), rightline_(false) -{} - - -MathGridInset::MathGridInset(int m, int n, string const & nm, MathInsetTypes ot) - : MathInset(m * n, nm, ot), rowinfo_(n), colinfo_(m), v_align_('c') -{ - if (m <= 0) - lyxerr << "positve number of columns expected\n"; - if (n <= 0) - lyxerr << "positve number of rows expected\n"; -} - - -int MathGridInset::index(int row, int col) const -{ - return col + ncols() * row; -} - - -void MathGridInset::halign(string const & hh) -{ - int n = hh.size(); - if (n > ncols()) - n = ncols(); - for (int i = 0; i < n; ++i) - colinfo_[i].h_align_ = hh[i]; -} - -void MathGridInset::halign(char h, int col) -{ - colinfo_[col].h_align_ = h; -} - -char MathGridInset::halign(int col) const -{ - return colinfo_[col].h_align_; -} - -void MathGridInset::valign(char c) -{ - v_align_ = c; -} - -char MathGridInset::valign() const -{ - return v_align_; -} - -void MathGridInset::Metrics(MathStyles st, int, int) -{ - // let the cells adjust themselves - MathInset::Metrics(st); - size_ = st; - - // adjust vertical structure - for (int row = 0; row < nrows(); ++row) { - int asc = 0; - int desc = 0; - for (int col = 0; col < ncols(); ++col) { - MathXArray const & c = xcell(index(row, col)); - asc = std::max(asc, c.ascent()); - desc = std::max(desc, c.descent()); - } - rowinfo_[row].ascent_ = asc; - rowinfo_[row].descent_ = desc; - - if (row) - rowinfo_[row].offset_ = - rowinfo_[row - 1].offset_ + - rowinfo_[row - 1].descent_ + - MATH_ROWSEP + - rowinfo_[row].ascent_; - else - rowinfo_[row].offset_ = 0; - } - - // adjust vertical offset - int h = 0; - switch (v_align_) { - case 't': - h = 0; - break; - case 'b': - h = rowinfo_.back().offset_; - break; - default: - h = rowinfo_.back().offset_ / 2; - } - - for (int row = 0; row < nrows(); ++row) { - rowinfo_[row].offset_ -= h; - rowinfo_[row].offset_ += MATH_BORDER; - } - - // adjust horizontal structure - for (int col = 0; col < ncols(); ++col) { - int wid = 0; - for (int row = 0; row < nrows(); ++row) - wid = std::max(wid, xcell(index(row, col)).width()); - colinfo_[col].width_ = wid; - colinfo_[col].offset_ = colinfo_[col].width_; - - if (col) - colinfo_[col].offset_ = - colinfo_[col - 1].offset_ + colinfo_[col - 1].width_ + MATH_COLSEP; - else - colinfo_[col].offset_ = 0; - - colinfo_[col].offset_ += MATH_BORDER; - } - - width_ = colinfo_.back().offset_ + colinfo_.back().width_; - ascent_ = - rowinfo_.front().offset_ + rowinfo_.front().ascent_; - descent_ = rowinfo_.back().offset_ + rowinfo_.back().descent_; - -/* - // Increase ws_[i] for 'R' columns (except the first one) - for (int 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 - width = MATH_COLSEP; - for (cxrow = row_.begin(); cxrow; ++cxrow) { - int rg = MATH_COLSEP; - int lf = 0; - for (int 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_.begin()) - lf = 0; - else if (cxrow.is_last()) - lf = ws_[i] - cxrow->getTab(i); - else - lf = (ws_[i] - cxrow->getTab(i))/2; - break; - } - int const ww = (isvoid) ? lf : lf + cxrow->getTab(i); - cxrow->setTab(i, lf + rg); - rg = ws_[i] - ww + MATH_COLSEP; - if (cxrow == row_.begin()) - width += ws_[i] + MATH_COLSEP; - } - cxrow->setBaseline(cxrow->getBaseline() - ascent); - } -*/ -} - -void MathGridInset::draw(Painter & pain, int x, int y) -{ - xo(x); - yo(y); - for (int row = 0; row < nrows(); ++row) { - int yy = y + rowinfo_[row].offset_; - for (int col = 0; col < ncols(); ++col) { - int xx = x + colinfo_[col].offset_; - char align = colinfo_[col].h_align_; - if (align == 'r' || align == 'R') - xx += colinfo_[col].width_ - xcell(index(row, col)).width(); - if (align == 'c' || align == 'C') - xx += (colinfo_[col].width_ - xcell(index(row, col)).width()) / 2; - xcell(index(row, col)).draw(pain, xx, yy); - } - } -} - - -void MathGridInset::Write(std::ostream & os, bool fragile) const -{ - for (int row = 0; row < nrows(); ++row) { - if (row) - os << " \\\\\n"; - for (int col = 0; col < ncols(); ++col) { - if (col) - os << " & "; - cell(index(row, col)).Write(os, fragile); - } - } -} - - -void MathGridInset::addRow(int row) -{ - rowinfo_.insert(rowinfo_.begin() + row + 1, RowInfo()); - cells_.insert(cells_.begin() + (row + 1) * ncols(), ncols(), MathXArray()); -} - -void MathGridInset::appendRow() -{ - rowinfo_.push_back(RowInfo()); - for (int i = 0; i < ncols(); ++i) - cells_.push_back(cells_type::value_type()); -} - - -void MathGridInset::delRow(int row) -{ - if (nrows() == 1) - return; - - cells_type::iterator it = cells_.begin() + row * ncols(); - cells_.erase(it, it + ncols()); - - rowinfo_.erase(rowinfo_.begin() + row); -} - - -void MathGridInset::addCol(int newcol) -{ - int const nc = ncols(); - int const nr = nrows(); - cells_type new_cells((nc + 1) * nr); - - for (int row = 0; row < nr; ++row) - for (int col = 0; col < nc; ++col) - new_cells[row * (nc + 1) + col + (col > newcol)] - = cells_[row * nc + col]; - std::swap(cells_, new_cells); - - colinfo_.insert(colinfo_.begin() + newcol, ColInfo()); -} - - -void MathGridInset::delCol(int col) -{ - if (ncols() == 1) - return; - - cells_type tmpcells; - for (int i = 0; i < nargs(); ++i) - if (i % ncols() != col) - tmpcells.push_back(cells_[i]); - std::swap(cells_, tmpcells); - - colinfo_.erase(colinfo_.begin() + col); -} - - -bool MathGridInset::idxUp(int & idx, int & pos) const -{ - if (idx < ncols()) - return false; - idx -= ncols(); - pos = 0; - return true; -} - - -bool MathGridInset::idxDown(int & idx, int & pos) const -{ - if (idx >= ncols() * (nrows() - 1)) - return false; - idx += ncols(); - pos = 0; - return true; -} - - -bool MathGridInset::idxLeft(int & idx, int & pos) const -{ - // leave matrix if on the left hand edge - if (col(idx) == 0) - return false; - idx--; - pos = cell(idx).size(); - return true; -} - - -bool MathGridInset::idxRight(int & idx, int & pos) const -{ - // leave matrix if on the right hand edge - if (col(idx) == ncols() - 1) - return false; - idx++; - pos = 0; - return true; -} - - -bool MathGridInset::idxFirst(int & idx, int & pos) const -{ - switch (v_align_) { - case 't': - idx = 0; - break; - case 'b': - idx = (nrows() - 1) * ncols(); - break; - default: - idx = (nrows() / 2) * ncols(); - } - pos = 0; - return true; -} - - -bool MathGridInset::idxLast(int & idx, int & pos) const -{ - switch (v_align_) { - case 't': - idx = ncols() - 1; - break; - case 'b': - idx = nargs() - 1; - break; - default: - idx = (nrows() / 2 + 1) * ncols() - 1; - } - pos = cell(idx).size(); - return true; -} - - -void MathGridInset::idxDelete(int & idx, bool & popit, bool & deleteit) -{ - popit = false; - deleteit = false; - - // delete entire row if in first cell of empty row - if (col(idx) == 0 && nrows() > 1) { - bool deleterow = true; - for (int i = idx; i < idx + ncols(); ++i) - if (cell(i).size()) { - deleterow = false; - break; - } - if (deleterow) - delRow(row(idx)); - - if (idx >= nargs()) - idx = nargs() - 1; - return; - } - - // undo effect of Ctrl-Tab (i.e. pull next cell) - //if (idx != nargs() - 1) - // cell(idx).swap(cell(idx + 1)); -} - - -void MathGridInset::idxDeleteRange(int from, int to) -{ -// leave this unimplemented unless someone wants to have it. -/* - int n = (to - from) / ncols(); - int r = from / ncols(); - - if (n >= 1) { - cells_type::iterator it = cells_.begin() + from; - cells_.erase(it, it + n * ncols()); - rowinfo_.erase(rowinfo_.begin() + r, rowinfo_.begin() + r + n); - } -*/ -} - - -MathGridInset::RowInfo const & MathGridInset::rowinfo(int i) const -{ - return rowinfo_[i]; -} - - -MathGridInset::RowInfo & MathGridInset::rowinfo(int i) -{ - return rowinfo_[i]; -} - - -std::vector MathGridInset::idxBetween(int from, int to) const -{ - int r1 = std::min(row(from), row(to)); - int r2 = std::max(row(from), row(to)); - int c1 = std::min(col(from), col(to)); - int c2 = std::max(col(from), col(to)); - std::vector res; - for (int i = r1; i <= r2; ++i) - for (int j = c1; j <= c2; ++j) - res.push_back(index(i, j)); - return res; -} diff --git a/src/mathed/math_grid.h b/src/mathed/math_grid.h deleted file mode 100644 index cb58ebfd2d..0000000000 --- a/src/mathed/math_grid.h +++ /dev/null @@ -1,131 +0,0 @@ -// -*- C++ -*- -#ifndef MATH_GRID_H -#define MATH_GRID_H - -#include "math_inset.h" - -#ifdef __GNUG__ -#pragma interface -#endif - -/** Gridded math inset base class. - This is the base to all grid-like editable math objects - like array and eqnarray. - \author André Pönitz 2001 -*/ - -class MathGridInset : public MathInset { - - /// additional per-row information - struct RowInfo { - /// - RowInfo(); - /// - int descent_; - /// - int ascent_; - /// - int offset_; - /// - bool upperline_; - /// - bool lowerline_; - }; - - // additional per-row information - struct ColInfo { - /// - ColInfo(); - /// - char h_align_; - /// cache for drawing - int h_offset; - /// - int width_; - /// - int offset_; - /// - bool leftline_; - /// - bool rightline_; - }; - -public: - /// - MathGridInset(int m, int n, string const & nm, MathInsetTypes ot); - /// - virtual MathInset * clone() const = 0; - /// - void Write(std::ostream &, bool fragile) const; - /// - void Metrics(MathStyles st, int asc = 0, int des = 0); - /// - void draw(Painter &, int, int); - /// - void halign(string const &); - /// - void halign(char c, int col); - /// - char halign(int col) const; - /// - void valign(char c); - /// - char valign() const; - /// - void resize(short int type, int cols); - /// - const RowInfo & rowinfo(int row) const; - /// - RowInfo & rowinfo(int row); - - /// - int ncols() const { return colinfo_.size(); } - /// - int nrows() const { return rowinfo_.size(); } - /// - int col(int idx) const { return idx % ncols(); } - /// - int row(int idx) const { return idx / ncols(); } - - /// - bool idxUp(int &, int &) const; - /// - bool idxDown(int &, int &) const; - /// - bool idxLeft(int &, int &) const; - /// - bool idxRight(int &, int &) const; - /// - bool idxFirst(int &, int &) const; - /// - bool idxLast(int &, int &) const; - /// - void idxDelete(int &, bool &, bool &); - /// - void idxDeleteRange(int, int); - - /// - void addRow(int); - /// - void delRow(int); - /// - void addCol(int); - /// - void delCol(int); - /// - virtual void appendRow(); - /// - int index(int row, int col) const; - /// - std::vector idxBetween(int from, int to) const; - -protected: - /// row info - std::vector rowinfo_; - /// column info - std::vector colinfo_; - /// - char v_align_; // add approp. type -}; - -#endif diff --git a/src/mathed/math_gridinset.C b/src/mathed/math_gridinset.C new file mode 100644 index 0000000000..5b4afb14e2 --- /dev/null +++ b/src/mathed/math_gridinset.C @@ -0,0 +1,428 @@ +#ifdef __GNUG__ +#pragma implementation +#endif + +#include "math_gridinset.h" +#include "support/LOstream.h" +#include "debug.h" + + +namespace { + +/// +int const MATH_COLSEP = 10; +/// +int const MATH_ROWSEP = 10; +/// +int const MATH_BORDER = 2; + +} + + +MathGridInset::RowInfo::RowInfo() + : upperline_(false), lowerline_(false) +{} + + +MathGridInset::ColInfo::ColInfo() + : h_align_('c'), leftline_(false), rightline_(false) +{} + + +MathGridInset::MathGridInset(int m, int n, string const & nm, MathInsetTypes ot) + : MathInset(m * n, nm, ot), rowinfo_(n), colinfo_(m), v_align_('c') +{ + if (m <= 0) + lyxerr << "positve number of columns expected\n"; + if (n <= 0) + lyxerr << "positve number of rows expected\n"; +} + + +int MathGridInset::index(int row, int col) const +{ + return col + ncols() * row; +} + + +void MathGridInset::halign(string const & hh) +{ + int n = hh.size(); + if (n > ncols()) + n = ncols(); + for (int i = 0; i < n; ++i) + colinfo_[i].h_align_ = hh[i]; +} + +void MathGridInset::halign(char h, int col) +{ + colinfo_[col].h_align_ = h; +} + +char MathGridInset::halign(int col) const +{ + return colinfo_[col].h_align_; +} + +void MathGridInset::valign(char c) +{ + v_align_ = c; +} + +char MathGridInset::valign() const +{ + return v_align_; +} + +void MathGridInset::Metrics(MathStyles st, int, int) +{ + // let the cells adjust themselves + MathInset::Metrics(st); + size_ = st; + + // adjust vertical structure + for (int row = 0; row < nrows(); ++row) { + int asc = 0; + int desc = 0; + for (int col = 0; col < ncols(); ++col) { + MathXArray const & c = xcell(index(row, col)); + asc = std::max(asc, c.ascent()); + desc = std::max(desc, c.descent()); + } + rowinfo_[row].ascent_ = asc; + rowinfo_[row].descent_ = desc; + + if (row) + rowinfo_[row].offset_ = + rowinfo_[row - 1].offset_ + + rowinfo_[row - 1].descent_ + + MATH_ROWSEP + + rowinfo_[row].ascent_; + else + rowinfo_[row].offset_ = 0; + } + + // adjust vertical offset + int h = 0; + switch (v_align_) { + case 't': + h = 0; + break; + case 'b': + h = rowinfo_.back().offset_; + break; + default: + h = rowinfo_.back().offset_ / 2; + } + + for (int row = 0; row < nrows(); ++row) { + rowinfo_[row].offset_ -= h; + rowinfo_[row].offset_ += MATH_BORDER; + } + + // adjust horizontal structure + for (int col = 0; col < ncols(); ++col) { + int wid = 0; + for (int row = 0; row < nrows(); ++row) + wid = std::max(wid, xcell(index(row, col)).width()); + colinfo_[col].width_ = wid; + colinfo_[col].offset_ = colinfo_[col].width_; + + if (col) + colinfo_[col].offset_ = + colinfo_[col - 1].offset_ + colinfo_[col - 1].width_ + MATH_COLSEP; + else + colinfo_[col].offset_ = 0; + + colinfo_[col].offset_ += MATH_BORDER; + } + + width_ = colinfo_.back().offset_ + colinfo_.back().width_; + ascent_ = - rowinfo_.front().offset_ + rowinfo_.front().ascent_; + descent_ = rowinfo_.back().offset_ + rowinfo_.back().descent_; + +/* + // Increase ws_[i] for 'R' columns (except the first one) + for (int 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 + width = MATH_COLSEP; + for (cxrow = row_.begin(); cxrow; ++cxrow) { + int rg = MATH_COLSEP; + int lf = 0; + for (int 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_.begin()) + lf = 0; + else if (cxrow.is_last()) + lf = ws_[i] - cxrow->getTab(i); + else + lf = (ws_[i] - cxrow->getTab(i))/2; + break; + } + int const ww = (isvoid) ? lf : lf + cxrow->getTab(i); + cxrow->setTab(i, lf + rg); + rg = ws_[i] - ww + MATH_COLSEP; + if (cxrow == row_.begin()) + width += ws_[i] + MATH_COLSEP; + } + cxrow->setBaseline(cxrow->getBaseline() - ascent); + } +*/ +} + +void MathGridInset::draw(Painter & pain, int x, int y) +{ + xo(x); + yo(y); + for (int row = 0; row < nrows(); ++row) { + int yy = y + rowinfo_[row].offset_; + for (int col = 0; col < ncols(); ++col) { + int xx = x + colinfo_[col].offset_; + char align = colinfo_[col].h_align_; + if (align == 'r' || align == 'R') + xx += colinfo_[col].width_ - xcell(index(row, col)).width(); + if (align == 'c' || align == 'C') + xx += (colinfo_[col].width_ - xcell(index(row, col)).width()) / 2; + xcell(index(row, col)).draw(pain, xx, yy); + } + } +} + + +void MathGridInset::Write(std::ostream & os, bool fragile) const +{ + for (int row = 0; row < nrows(); ++row) { + if (row) + os << " \\\\\n"; + for (int col = 0; col < ncols(); ++col) { + if (col) + os << " & "; + cell(index(row, col)).Write(os, fragile); + } + } +} + + +void MathGridInset::addRow(int row) +{ + rowinfo_.insert(rowinfo_.begin() + row + 1, RowInfo()); + cells_.insert(cells_.begin() + (row + 1) * ncols(), ncols(), MathXArray()); +} + +void MathGridInset::appendRow() +{ + rowinfo_.push_back(RowInfo()); + for (int i = 0; i < ncols(); ++i) + cells_.push_back(cells_type::value_type()); +} + + +void MathGridInset::delRow(int row) +{ + if (nrows() == 1) + return; + + cells_type::iterator it = cells_.begin() + row * ncols(); + cells_.erase(it, it + ncols()); + + rowinfo_.erase(rowinfo_.begin() + row); +} + + +void MathGridInset::addCol(int newcol) +{ + int const nc = ncols(); + int const nr = nrows(); + cells_type new_cells((nc + 1) * nr); + + for (int row = 0; row < nr; ++row) + for (int col = 0; col < nc; ++col) + new_cells[row * (nc + 1) + col + (col > newcol)] + = cells_[row * nc + col]; + std::swap(cells_, new_cells); + + colinfo_.insert(colinfo_.begin() + newcol, ColInfo()); +} + + +void MathGridInset::delCol(int col) +{ + if (ncols() == 1) + return; + + cells_type tmpcells; + for (int i = 0; i < nargs(); ++i) + if (i % ncols() != col) + tmpcells.push_back(cells_[i]); + std::swap(cells_, tmpcells); + + colinfo_.erase(colinfo_.begin() + col); +} + + +bool MathGridInset::idxUp(int & idx, int & pos) const +{ + if (idx < ncols()) + return false; + idx -= ncols(); + pos = 0; + return true; +} + + +bool MathGridInset::idxDown(int & idx, int & pos) const +{ + if (idx >= ncols() * (nrows() - 1)) + return false; + idx += ncols(); + pos = 0; + return true; +} + + +bool MathGridInset::idxLeft(int & idx, int & pos) const +{ + // leave matrix if on the left hand edge + if (col(idx) == 0) + return false; + idx--; + pos = cell(idx).size(); + return true; +} + + +bool MathGridInset::idxRight(int & idx, int & pos) const +{ + // leave matrix if on the right hand edge + if (col(idx) == ncols() - 1) + return false; + idx++; + pos = 0; + return true; +} + + +bool MathGridInset::idxFirst(int & idx, int & pos) const +{ + switch (v_align_) { + case 't': + idx = 0; + break; + case 'b': + idx = (nrows() - 1) * ncols(); + break; + default: + idx = (nrows() / 2) * ncols(); + } + pos = 0; + return true; +} + + +bool MathGridInset::idxLast(int & idx, int & pos) const +{ + switch (v_align_) { + case 't': + idx = ncols() - 1; + break; + case 'b': + idx = nargs() - 1; + break; + default: + idx = (nrows() / 2 + 1) * ncols() - 1; + } + pos = cell(idx).size(); + return true; +} + + +void MathGridInset::idxDelete(int & idx, bool & popit, bool & deleteit) +{ + popit = false; + deleteit = false; + + // delete entire row if in first cell of empty row + if (col(idx) == 0 && nrows() > 1) { + bool deleterow = true; + for (int i = idx; i < idx + ncols(); ++i) + if (cell(i).size()) { + deleterow = false; + break; + } + if (deleterow) + delRow(row(idx)); + + if (idx >= nargs()) + idx = nargs() - 1; + return; + } + + // undo effect of Ctrl-Tab (i.e. pull next cell) + //if (idx != nargs() - 1) + // cell(idx).swap(cell(idx + 1)); +} + + +void MathGridInset::idxDeleteRange(int /*from*/, int /*to*/) +{ +// leave this unimplemented unless someone wants to have it. +/* + int n = (to - from) / ncols(); + int r = from / ncols(); + + if (n >= 1) { + cells_type::iterator it = cells_.begin() + from; + cells_.erase(it, it + n * ncols()); + rowinfo_.erase(rowinfo_.begin() + r, rowinfo_.begin() + r + n); + } +*/ +} + + +MathGridInset::RowInfo const & MathGridInset::rowinfo(int i) const +{ + return rowinfo_[i]; +} + + +MathGridInset::RowInfo & MathGridInset::rowinfo(int i) +{ + return rowinfo_[i]; +} + + +std::vector MathGridInset::idxBetween(int from, int to) const +{ + int r1 = std::min(row(from), row(to)); + int r2 = std::max(row(from), row(to)); + int c1 = std::min(col(from), col(to)); + int c2 = std::max(col(from), col(to)); + std::vector res; + for (int i = r1; i <= r2; ++i) + for (int j = c1; j <= c2; ++j) + res.push_back(index(i, j)); + return res; +} diff --git a/src/mathed/math_gridinset.h b/src/mathed/math_gridinset.h new file mode 100644 index 0000000000..cb58ebfd2d --- /dev/null +++ b/src/mathed/math_gridinset.h @@ -0,0 +1,131 @@ +// -*- C++ -*- +#ifndef MATH_GRID_H +#define MATH_GRID_H + +#include "math_inset.h" + +#ifdef __GNUG__ +#pragma interface +#endif + +/** Gridded math inset base class. + This is the base to all grid-like editable math objects + like array and eqnarray. + \author André Pönitz 2001 +*/ + +class MathGridInset : public MathInset { + + /// additional per-row information + struct RowInfo { + /// + RowInfo(); + /// + int descent_; + /// + int ascent_; + /// + int offset_; + /// + bool upperline_; + /// + bool lowerline_; + }; + + // additional per-row information + struct ColInfo { + /// + ColInfo(); + /// + char h_align_; + /// cache for drawing + int h_offset; + /// + int width_; + /// + int offset_; + /// + bool leftline_; + /// + bool rightline_; + }; + +public: + /// + MathGridInset(int m, int n, string const & nm, MathInsetTypes ot); + /// + virtual MathInset * clone() const = 0; + /// + void Write(std::ostream &, bool fragile) const; + /// + void Metrics(MathStyles st, int asc = 0, int des = 0); + /// + void draw(Painter &, int, int); + /// + void halign(string const &); + /// + void halign(char c, int col); + /// + char halign(int col) const; + /// + void valign(char c); + /// + char valign() const; + /// + void resize(short int type, int cols); + /// + const RowInfo & rowinfo(int row) const; + /// + RowInfo & rowinfo(int row); + + /// + int ncols() const { return colinfo_.size(); } + /// + int nrows() const { return rowinfo_.size(); } + /// + int col(int idx) const { return idx % ncols(); } + /// + int row(int idx) const { return idx / ncols(); } + + /// + bool idxUp(int &, int &) const; + /// + bool idxDown(int &, int &) const; + /// + bool idxLeft(int &, int &) const; + /// + bool idxRight(int &, int &) const; + /// + bool idxFirst(int &, int &) const; + /// + bool idxLast(int &, int &) const; + /// + void idxDelete(int &, bool &, bool &); + /// + void idxDeleteRange(int, int); + + /// + void addRow(int); + /// + void delRow(int); + /// + void addCol(int); + /// + void delCol(int); + /// + virtual void appendRow(); + /// + int index(int row, int col) const; + /// + std::vector idxBetween(int from, int to) const; + +protected: + /// row info + std::vector rowinfo_; + /// column info + std::vector colinfo_; + /// + char v_align_; // add approp. type +}; + +#endif diff --git a/src/mathed/math_matrixinset.h b/src/mathed/math_matrixinset.h index c2daa85dad..950caa9e17 100644 --- a/src/mathed/math_matrixinset.h +++ b/src/mathed/math_matrixinset.h @@ -2,9 +2,7 @@ #ifndef MATH_MATRIXINSET_H #define MATH_MATRIXINSET_H -#include - -#include "math_grid.h" +#include "math_gridinset.h" #ifdef __GNUG__ #pragma interface diff --git a/src/mathed/math_parser.C b/src/mathed/math_parser.C index 69bd62cb2f..c0e7a41653 100644 --- a/src/mathed/math_parser.C +++ b/src/mathed/math_parser.C @@ -28,22 +28,22 @@ #include "math_parser.h" #include "array.h" #include "math_inset.h" +#include "math_arrayinset.h" +#include "math_bigopinset.h" +#include "math_dotsinset.h" +#include "math_decorationinset.h" +#include "math_deliminset.h" +#include "math_fracinset.h" +#include "math_funcinset.h" #include "math_macro.h" #include "math_macrotable.h" #include "math_macrotemplate.h" -#include "math_root.h" -#include "math_arrayinset.h" -#include "math_sqrtinset.h" #include "math_matrixinset.h" -#include "math_bigopinset.h" -#include "math_funcinset.h" -#include "math_spaceinset.h" -#include "math_sizeinset.h" +#include "math_rootinset.h" #include "math_scriptinset.h" -#include "math_dotsinset.h" -#include "math_fracinset.h" -#include "math_deliminset.h" -#include "math_decorationinset.h" +#include "math_sizeinset.h" +#include "math_spaceinset.h" +#include "math_sqrtinset.h" #include "debug.h" #include "mathed/support.h" #include "lyxlex.h" diff --git a/src/mathed/math_root.C b/src/mathed/math_root.C deleted file mode 100644 index e440b798af..0000000000 --- a/src/mathed/math_root.C +++ /dev/null @@ -1,98 +0,0 @@ -/* - * File: math_root.C - * Purpose: Implementation of the root object - * Author: Alejandro Aguilar Sierra - * Created: January 1999 - * Description: Root math object - * - * Copyright: 1999 Alejandro Aguilar Sierra - * - * You are free to use and modify this code under the terms of - * the GNU General Public Licence version 2 or later. - */ - -#ifdef __GNUG__ -#pragma implementation -#endif - -#include "math_root.h" -#include "support/LOstream.h" -#include "Painter.h" - -MathRootInset::MathRootInset() - : MathInset(2) -{} - - -MathInset * MathRootInset::clone() const -{ - return new MathRootInset(*this); -} - - -void MathRootInset::Metrics(MathStyles st, int, int) -{ - MathInset::Metrics(st); - size_ = st; - ascent_ = std::max(xcell(0).ascent() + 5, xcell(1).ascent()) + 2; - descent_ = std::max(xcell(1).descent() + 5, xcell(0).descent()) + 2; - width_ = xcell(0).width() + xcell(1).width() + 10; -} - - -void MathRootInset::draw(Painter & pain, int x, int y) -{ - xo(x); - yo(y); - int const w = xcell(0).width(); - xcell(0).draw(pain, x, y - 5 - xcell(0).descent()); // the "exponent" - xcell(1).draw(pain, x + w + 8, y); // the "base" - int const a = ascent(); - int const d = descent(); - int xp[5]; - int yp[5]; - xp[0] = x + width_; yp[0] = y - a + 1; - xp[1] = x + w + 4; yp[1] = y - a + 1; - xp[2] = x + w; yp[2] = y + d; - xp[3] = x + w - 2; yp[3] = y + (d - a)/2 + 2; - xp[4] = x; yp[4] = y + (d - a)/2 + 2; - pain.lines(xp, yp, 5, LColor::mathline); -} - - -void MathRootInset::Write(std::ostream & os, bool fragile) const -{ - os << "\\sqrt["; - cell(0).Write(os, fragile); - os << "]{"; - cell(1).Write(os, fragile); - os << '}'; -} - - -void MathRootInset::WriteNormal(std::ostream & os) const -{ - os << "[root "; - cell(1).WriteNormal(os); - os << " "; - cell(0).WriteNormal(os); - os << "] "; -} - -bool MathRootInset::idxUp(int & idx, int & pos) const -{ - if (idx == 0) - return false; - idx = 0; - pos = 0; - return true; -} - -bool MathRootInset::idxDown(int & idx, int & pos) const -{ - if (idx == 1) - return false; - idx = 1; - pos = 0; - return true; -} diff --git a/src/mathed/math_root.h b/src/mathed/math_root.h deleted file mode 100644 index cae5cfb93a..0000000000 --- a/src/mathed/math_root.h +++ /dev/null @@ -1,49 +0,0 @@ -// -*- C++ -*- -/* - * File: math_root.h - * Purpose: Declaration of the root object - * Author: Alejandro Aguilar Sierra - * Created: January 1999 - * Description: Root math object - * - * Copyright: 1999 Alejandro Aguilar Sierra - * - * You are free to use and modify this code under the terms of - * the GNU General Public Licence version 2 or later. - */ - -#ifndef MATH_ROOT_H -#define MATH_ROOT_H - -#include "math_inset.h" -#include "symbol_def.h" - -#ifdef __GNUG__ -#pragma interface -#endif - -/** The general n-th root inset. - \author Alejandro Aguilar Sierra - \version January 1999 - */ -class MathRootInset : public MathInset { -public: - /// - MathRootInset(); - /// - MathInset * clone() const; - /// - void draw(Painter &, int x, int baseline); - /// - void Write(std::ostream &, bool fragile) const; - /// - void WriteNormal(std::ostream &) const; - /// - void Metrics(MathStyles st, int asc = 0, int des = 0); - /// - bool idxUp(int & idx, int & pos) const; - /// - bool idxDown(int & idx, int & pos) const; -}; - -#endif diff --git a/src/mathed/math_rootinset.C b/src/mathed/math_rootinset.C new file mode 100644 index 0000000000..427af7150e --- /dev/null +++ b/src/mathed/math_rootinset.C @@ -0,0 +1,98 @@ +/* + * File: math_root.C + * Purpose: Implementation of the root object + * Author: Alejandro Aguilar Sierra + * Created: January 1999 + * Description: Root math object + * + * Copyright: 1999 Alejandro Aguilar Sierra + * + * You are free to use and modify this code under the terms of + * the GNU General Public Licence version 2 or later. + */ + +#ifdef __GNUG__ +#pragma implementation +#endif + +#include "math_rootinset.h" +#include "support/LOstream.h" +#include "Painter.h" + +MathRootInset::MathRootInset() + : MathInset(2) +{} + + +MathInset * MathRootInset::clone() const +{ + return new MathRootInset(*this); +} + + +void MathRootInset::Metrics(MathStyles st, int, int) +{ + MathInset::Metrics(st); + size_ = st; + ascent_ = std::max(xcell(0).ascent() + 5, xcell(1).ascent()) + 2; + descent_ = std::max(xcell(1).descent() + 5, xcell(0).descent()) + 2; + width_ = xcell(0).width() + xcell(1).width() + 10; +} + + +void MathRootInset::draw(Painter & pain, int x, int y) +{ + xo(x); + yo(y); + int const w = xcell(0).width(); + xcell(0).draw(pain, x, y - 5 - xcell(0).descent()); // the "exponent" + xcell(1).draw(pain, x + w + 8, y); // the "base" + int const a = ascent(); + int const d = descent(); + int xp[5]; + int yp[5]; + xp[0] = x + width_; yp[0] = y - a + 1; + xp[1] = x + w + 4; yp[1] = y - a + 1; + xp[2] = x + w; yp[2] = y + d; + xp[3] = x + w - 2; yp[3] = y + (d - a)/2 + 2; + xp[4] = x; yp[4] = y + (d - a)/2 + 2; + pain.lines(xp, yp, 5, LColor::mathline); +} + + +void MathRootInset::Write(std::ostream & os, bool fragile) const +{ + os << "\\sqrt["; + cell(0).Write(os, fragile); + os << "]{"; + cell(1).Write(os, fragile); + os << '}'; +} + + +void MathRootInset::WriteNormal(std::ostream & os) const +{ + os << "[root "; + cell(1).WriteNormal(os); + os << " "; + cell(0).WriteNormal(os); + os << "] "; +} + +bool MathRootInset::idxUp(int & idx, int & pos) const +{ + if (idx == 0) + return false; + idx = 0; + pos = 0; + return true; +} + +bool MathRootInset::idxDown(int & idx, int & pos) const +{ + if (idx == 1) + return false; + idx = 1; + pos = 0; + return true; +} diff --git a/src/mathed/math_rootinset.h b/src/mathed/math_rootinset.h new file mode 100644 index 0000000000..cae5cfb93a --- /dev/null +++ b/src/mathed/math_rootinset.h @@ -0,0 +1,49 @@ +// -*- C++ -*- +/* + * File: math_root.h + * Purpose: Declaration of the root object + * Author: Alejandro Aguilar Sierra + * Created: January 1999 + * Description: Root math object + * + * Copyright: 1999 Alejandro Aguilar Sierra + * + * You are free to use and modify this code under the terms of + * the GNU General Public Licence version 2 or later. + */ + +#ifndef MATH_ROOT_H +#define MATH_ROOT_H + +#include "math_inset.h" +#include "symbol_def.h" + +#ifdef __GNUG__ +#pragma interface +#endif + +/** The general n-th root inset. + \author Alejandro Aguilar Sierra + \version January 1999 + */ +class MathRootInset : public MathInset { +public: + /// + MathRootInset(); + /// + MathInset * clone() const; + /// + void draw(Painter &, int x, int baseline); + /// + void Write(std::ostream &, bool fragile) const; + /// + void WriteNormal(std::ostream &) const; + /// + void Metrics(MathStyles st, int asc = 0, int des = 0); + /// + bool idxUp(int & idx, int & pos) const; + /// + bool idxDown(int & idx, int & pos) const; +}; + +#endif