#include "math_gridinset.h"
#include "math_mathmlstream.h"
+#include "math_streamstr.h"
#include "lyxfont.h"
#include "Painter.h"
#include "debug.h"
MathGridInset::RowInfo::RowInfo()
- : skip_(0), lines_(0)
+ : lines_(0), skip_(0)
{}
}
+MathInset * MathGridInset::clone() const
+{
+ return new MathGridInset(*this);
+}
+
+
MathInset::idx_type MathGridInset::index(row_type row, col_type col) const
{
return col + ncols() * row;
// let the cells adjust themselves
MathNestInset::metrics(mi);
- // adjust vertical structure
- rowinfo_[0].offset_ = 0;
+ // compute absolute sizes of vertical structure
for (row_type row = 0; row < nrows(); ++row) {
int asc = 0;
int desc = 0;
}
rowinfo_[row].ascent_ = asc;
rowinfo_[row].descent_ = desc;
- rowinfo_[row].offset_ += asc + HLINESEP * rowinfo_[row].lines_;
-
- rowinfo_[row + 1].offset_ =
- rowinfo_[row].offset_ +
- rowinfo_[row].descent_ +
- rowinfo_[row].skipPixels() +
- ROWSEP;
}
+ rowinfo_[0].ascent_ += HLINESEP * rowinfo_[0].lines_;
rowinfo_[nrows()].ascent_ = 0;
rowinfo_[nrows()].descent_ = 0;
- rowinfo_[nrows()].offset_ += HLINESEP * rowinfo_[nrows()].lines_;
+
+ // compute vertical offsets
+ rowinfo_[0].offset_ = 0;
+ for (row_type row = 1; row <= nrows(); ++row) {
+ rowinfo_[row].offset_ =
+ rowinfo_[row - 1].offset_ +
+ rowinfo_[row - 1].descent_ +
+ rowinfo_[row - 1].skipPixels() +
+ ROWSEP +
+ rowinfo_[row].lines_ * HLINESEP +
+ rowinfo_[row].ascent_;
+ }
// adjust vertical offset
int h = 0;
h = 0;
break;
case 'b':
- h = rowinfo_[nrows()].offset_;
+ h = rowinfo_[nrows() - 1].offset_;
break;
default:
- h = rowinfo_[nrows()].offset_ / 2;
- //lyxerr << "\nnrows: " << nrows() << ' ' << ncols() << '\n';
+ h = rowinfo_[nrows() - 1].offset_ / 2;
}
for (row_type row = 0; row <= nrows(); ++row)
rowinfo_[row].offset_ -= h;
-
- // adjust horizontal structure
- colinfo_[0].offset_ = BORDER;
+
+ // compute absolute sizes of horizontal structure
for (col_type col = 0; col < ncols(); ++col) {
int wid = 0;
for (row_type row = 0; row < nrows(); ++row)
wid = std::max(wid, xcell(index(row, col)).width());
- colinfo_[col].width_ = wid;
- colinfo_[col].offset_ += VLINESEP * colinfo_[col].lines_;
-
- colinfo_[col + 1].offset_ =
- colinfo_[col].offset_ +
- colinfo_[col].width_ +
- colinfo_[col].skip_ +
- COLSEP;
+ colinfo_[col].width_ = wid;
}
colinfo_[ncols()].width_ = 0;
- colinfo_[ncols()].offset_ += VLINESEP * colinfo_[ncols()].lines_;
+
+ // compute horizontal offsets
+ colinfo_[0].offset_ = BORDER;
+ for (col_type col = 1; col <= ncols(); ++col) {
+ colinfo_[col].offset_ =
+ colinfo_[col - 1].offset_ +
+ colinfo_[col - 1].width_ +
+ colinfo_[col - 1].skip_ +
+ COLSEP +
+ colinfo_[col].lines_ * VLINESEP;
+ }
width_ = colinfo_[ncols() - 1].offset_
for (int i = 0; i < rowinfo_[row].lines_; ++i) {
int yy = y + rowinfo_[row].offset_ - rowinfo_[row].ascent_
- i * HLINESEP - HLINESEP/2 - ROWSEP/2;
- //lyxerr << "i: " << i << " yy: " << yy << '\n';
pain.line(x + 1, yy, x + width_ - 1, yy);
}
for (int i = 0; i < colinfo_[col].lines_; ++i) {
int xx = x + colinfo_[col].offset_
- i * VLINESEP - VLINESEP/2 - COLSEP/2;
- //lyxerr << "i: " << i << " xx: " << xx << '\n';
pain.line(xx, y - ascent_ + 1, xx, y + descent_ - 1);
}
}
{
string eol;
- if (rowinfo_[row].crskip_.value() != 0)
+ if (!rowinfo_[row].crskip_.zero())
eol += "[" + rowinfo_[row].crskip_.asLatexString() + "]";
// make sure an upcoming '[' does not break anything
}
-bool MathGridInset::idxUp(idx_type & idx, pos_type & pos) const
+bool MathGridInset::idxUp(idx_type & idx) const
{
if (idx < ncols())
return false;
- int x = cellXOffset(idx) + xcell(idx).pos2x(pos);
idx -= ncols();
- pos = xcell(idx).x2pos(x - cellXOffset(idx));
return true;
}
-bool MathGridInset::idxDown(idx_type & idx, pos_type & pos) const
+bool MathGridInset::idxDown(idx_type & idx) const
{
if (idx >= ncols() * (nrows() - 1))
return false;
- int x = cellXOffset(idx) + xcell(idx).pos2x(pos);
idx += ncols();
- pos = xcell(idx).x2pos(x - cellXOffset(idx));
return true;
}
// leave matrix if on the left hand edge
if (col(idx) == 0)
return false;
- idx--;
+ --idx;
pos = cell(idx).size();
return true;
}
// leave matrix if on the right hand edge
if (col(idx) + 1 == ncols())
return false;
- idx++;
+ ++idx;
pos = 0;
return true;
}
idx = (nrows() - 1) * ncols();
break;
default:
- idx = (nrows() / 2) * ncols();
+ idx = ((nrows() - 1) / 2) * ncols();
}
pos = 0;
return true;
idx = nargs() - 1;
break;
default:
- idx = (nrows() / 2 + 1) * ncols() - 1;
+ idx = ((nrows() - 1) / 2 + 1) * ncols() - 1;
}
pos = cell(idx).size();
return true;
void MathGridInset::write(WriteStream & os) const
{
for (row_type row = 0; row < nrows(); ++row) {
- os << verboseHLine(rowinfo_[row].lines_).c_str();
+ os << verboseHLine(rowinfo_[row].lines_);
for (col_type col = 0; col < ncols(); ++col)
- os << cell(index(row, col)) << eocString(col).c_str();
- os << eolString(row).c_str();
+ os << cell(index(row, col)) << eocString(col);
+ os << eolString(row);
}
- string s = verboseHLine(rowinfo_[nrows()].lines_);
- if (s.size())
- os << "\\\\" << s.c_str();
+ string const s = verboseHLine(rowinfo_[nrows()].lines_);
+ if (!s.empty())
+ os << "\\\\" << s;
}
-