]> git.lyx.org Git - lyx.git/blobdiff - src/mathed/math_gridinset.C
enable direct input of #1...#9; some whitespace changes
[lyx.git] / src / mathed / math_gridinset.C
index 8ca134842eb055d93923ac885098b568795b9048..d18713b0ec4a754cc2cdaf1acafc775a24ad1969 100644 (file)
@@ -4,6 +4,7 @@
 
 #include "math_gridinset.h"
 #include "math_mathmlstream.h"
+#include "math_streamstr.h"
 #include "lyxfont.h"
 #include "Painter.h"
 #include "debug.h"
@@ -38,7 +39,7 @@ string verboseHLine(int n)
 
 
 MathGridInset::RowInfo::RowInfo()
-       : skip_(0), lines_(0)
+       : lines_(0), skip_(0)
 {}
 
 
@@ -89,6 +90,12 @@ MathGridInset::MathGridInset(col_type m, row_type n, char v, string const & h)
 }
 
 
+MathInset * MathGridInset::clone() const
+{
+       return new MathGridInset(*this);
+}
+
+
 MathInset::idx_type MathGridInset::index(row_type row, col_type col) const
 {
        return col + ncols() * row;
@@ -220,8 +227,7 @@ void MathGridInset::metrics(MathMetricsInfo const & mi) const
        // 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;
@@ -232,17 +238,22 @@ void MathGridInset::metrics(MathMetricsInfo const & mi) const
                }
                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;
@@ -251,33 +262,34 @@ void MathGridInset::metrics(MathMetricsInfo const & mi) const
                        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_      
@@ -358,7 +370,6 @@ void MathGridInset::draw(Painter & pain, int x, int y) const
                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);
                }
 
@@ -366,7 +377,6 @@ void MathGridInset::draw(Painter & pain, int x, int y) const
                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);
                }
 }
@@ -376,7 +386,7 @@ string MathGridInset::eolString(row_type row) const
 {
        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
@@ -483,24 +493,20 @@ int MathGridInset::cellYOffset(idx_type idx) const
 }
 
 
-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;
 }
        
@@ -510,7 +516,7 @@ bool MathGridInset::idxLeft(idx_type & idx, pos_type & pos) const
        // leave matrix if on the left hand edge
        if (col(idx) == 0)
                return false;
-       idx--;
+       --idx;
        pos = cell(idx).size();
        return true;
 }
@@ -521,7 +527,7 @@ bool MathGridInset::idxRight(idx_type & idx, pos_type & pos) const
        // leave matrix if on the right hand edge
        if (col(idx) + 1 == ncols())
                return false;
-       idx++;
+       ++idx;
        pos = 0;
        return true;
 }
@@ -537,7 +543,7 @@ bool MathGridInset::idxFirst(idx_type & idx, pos_type & pos) const
                        idx = (nrows() - 1) * ncols();
                        break;
                default: 
-                       idx = (nrows() / 2) * ncols();
+                       idx = ((nrows() - 1) / 2) * ncols();
        }
        pos = 0;
        return true;
@@ -554,7 +560,7 @@ bool MathGridInset::idxLast(idx_type & idx, pos_type & pos) const
                        idx = nargs() - 1;
                        break;
                default:
-                       idx = (nrows() / 2 + 1) * ncols() - 1;
+                       idx = ((nrows() - 1) / 2 + 1) * ncols() - 1;
        }
        pos = cell(idx).size();
        return true;
@@ -703,14 +709,13 @@ void MathGridInset::mathmlize(MathMLStream & os) const
 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;
 }
 
-