]> git.lyx.org Git - lyx.git/blobdiff - src/mathed/InsetMathGrid.cpp
de.po
[lyx.git] / src / mathed / InsetMathGrid.cpp
index 07a67c75cca90d4ddd4f2f5880b3642c4105781b..4ce79bd6196d6c0ed7c7779f53c5a630cb69c743 100644 (file)
@@ -22,6 +22,7 @@
 #include "Buffer.h"
 #include "BufferParams.h"
 #include "BufferView.h"
+#include "CoordCache.h"
 #include "Cursor.h"
 #include "CutAndPaste.h"
 #include "FuncRequest.h"
@@ -99,7 +100,7 @@ InsetMathGrid::RowInfo::RowInfo()
 
 int InsetMathGrid::RowInfo::skipPixels(MetricsInfo const & mi) const
 {
-       return crskip_.inPixels(mi.base);
+       return mi.base.inPixels(crskip_);
 }
 
 
@@ -397,7 +398,8 @@ void InsetMathGrid::metrics(MetricsInfo & mi, Dimension & dim) const
        for (idx_type i = 0; i < nargs(); ++i) {
                if (cellinfo_[i].multi_ != CELL_PART_OF_MULTICOLUMN) {
                        Dimension dimc;
-                       cell(i).metrics(mi, dimc);
+                       // the 'false' is to make sure that the cell is tall enough
+                       cell(i).metrics(mi, dimc, false);
                }
        }
 
@@ -588,7 +590,6 @@ void InsetMathGrid::metrics(MetricsInfo & mi, Dimension & dim) const
        }
 */
        dim.wid += leftMargin() + rightMargin();
-       metricsMarkers2(mi, dim);
 }
 
 
@@ -653,8 +654,6 @@ void InsetMathGrid::draw(PainterInfo & pi, int x, int y) const
                        pi.pain.line(xx1, yy, xx2, yy, Color_foreground);
                }
        }
-
-       drawMarkers2(pi, x, y);
 }
 
 
@@ -810,7 +809,7 @@ void InsetMathGrid::addRow(row_type row)
 {
        rowinfo_.insert(rowinfo_.begin() + row + 1, RowInfo());
        cells_.insert
-               (cells_.begin() + (row + 1) * ncols(), ncols(), MathData());
+               (cells_.begin() + (row + 1) * ncols(), ncols(), MathData(buffer_));
        cellinfo_.insert
                (cellinfo_.begin() + (row + 1) * ncols(), ncols(), CellInfo());
 }
@@ -834,8 +833,11 @@ void InsetMathGrid::delRow(row_type row)
 void InsetMathGrid::copyRow(row_type row)
 {
        addRow(row);
-       for (col_type col = 0; col < ncols(); ++col)
+       for (col_type col = 0; col < ncols(); ++col) {
                cells_[(row + 1) * ncols() + col] = cells_[row * ncols() + col];
+               // copying the cell does not set the buffer
+               cells_[(row + 1) * ncols() + col].setBuffer(*buffer_);
+       }
 }
 
 
@@ -865,6 +867,8 @@ void InsetMathGrid::addCol(col_type newcol)
                                = cellinfo_[row * nc + col];
                }
        swap(cells_, new_cells);
+       // copying cells loses the buffer reference
+       setBuffer(*buffer_);
        swap(cellinfo_, new_cellinfo);
 
        ColInfo inf;
@@ -896,8 +900,11 @@ void InsetMathGrid::delCol(col_type col)
 void InsetMathGrid::copyCol(col_type col)
 {
        addCol(col+1);
-       for (row_type row = 0; row < nrows(); ++row)
+       for (row_type row = 0; row < nrows(); ++row) {
                cells_[row * ncols() + col + 1] = cells_[row * ncols() + col];
+               // copying the cell does not set the buffer
+               cells_[row * ncols() + col + 1].setBuffer(*buffer_);
+       }
 }
 
 
@@ -971,7 +978,14 @@ bool InsetMathGrid::idxUpDown(Cursor & cur, bool up) const
                LASSERT(cur.idx() > 0, return false);
                --cur.idx();
        }
-       cur.pos() = cur.cell().x2pos(&cur.bv(), cur.x_target() - cur.cell().xo(cur.bv()));
+       // FIXME: this is only a workaround to avoid a crash if the inset
+       // in not in coord cache. The best would be to force a FitCursor
+       // operation.
+       CoordCache::Arrays const & arraysCache = cur.bv().coordCache().arrays();
+       if (arraysCache.has(&cur.cell()))
+               cur.pos() = cur.cell().x2pos(&cur.bv(), cur.x_target() - cur.cell().xo(cur.bv()));
+       else
+               cur.pos() = 0;
        return true;
 }
 
@@ -1010,47 +1024,47 @@ bool InsetMathGrid::idxForward(Cursor & cur) const
 }
 
 
-bool InsetMathGrid::idxFirst(Cursor & cur) const
+idx_type InsetMathGrid::firstIdx() const
 {
+       size_type idx = 0;
        switch (v_align_) {
                case 't':
-                       cur.idx() = 0;
+                       //idx = 0;
                        break;
                case 'b':
-                       cur.idx() = (nrows() - 1) * ncols();
+                       idx = (nrows() - 1) * ncols();
                        break;
                default:
-                       cur.idx() = ((nrows() - 1) / 2) * ncols();
+                       idx = ((nrows() - 1) / 2) * ncols();
        }
        // If we are in a multicolumn cell, move to the "real" cell
-       while (cellinfo_[cur.idx()].multi_ == CELL_PART_OF_MULTICOLUMN) {
-               LASSERT(cur.idx() > 0, return false);
-               --cur.idx();
+       while (cellinfo_[idx].multi_ == CELL_PART_OF_MULTICOLUMN) {
+               LASSERT(idx > 0, return 0);
+               --idx;
        }
-       cur.pos() = 0;
-       return true;
+       return idx;
 }
 
 
-bool InsetMathGrid::idxLast(Cursor & cur) const
+idx_type InsetMathGrid::lastIdx() const
 {
+       size_type idx = 0;
        switch (v_align_) {
                case 't':
-                       cur.idx() = ncols() - 1;
+                       idx = ncols() - 1;
                        break;
                case 'b':
-                       cur.idx() = nargs() - 1;
+                       idx = nargs() - 1;
                        break;
                default:
-                       cur.idx() = ((nrows() - 1) / 2 + 1) * ncols() - 1;
+                       idx = ((nrows() - 1) / 2 + 1) * ncols() - 1;
        }
        // If we are in a multicolumn cell, move to the "real" cell
-       while (cellinfo_[cur.idx()].multi_ == CELL_PART_OF_MULTICOLUMN) {
-               LASSERT(cur.idx() > 0, return false);
-               --cur.idx();
+       while (cellinfo_[idx].multi_ == CELL_PART_OF_MULTICOLUMN) {
+               LASSERT(idx > 0, return false);
+               --idx;
        }
-       cur.pos() = cur.lastpos();
-       return true;
+       return idx;
 }
 
 
@@ -1418,25 +1432,6 @@ void InsetMathGrid::doDispatch(Cursor & cur, FuncRequest & cmd)
                splitCell(cur);
                break;
 
-       case LFUN_CELL_BACKWARD:
-               // See below.
-               cur.selection(false);
-               if (!idxPrev(cur)) {
-                       cmd = FuncRequest(LFUN_FINISHED_BACKWARD);
-                       cur.undispatched();
-               }
-               break;
-
-       case LFUN_CELL_FORWARD:
-               // Can't handle selection by additional 'shift' as this is
-               // hard bound to LFUN_CELL_BACKWARD
-               cur.selection(false);
-               if (!idxNext(cur)) {
-                       cmd = FuncRequest(LFUN_FINISHED_FORWARD);
-                       cur.undispatched();
-               }
-               break;
-
        case LFUN_NEWLINE_INSERT: {
                cur.recordUndoInset();
                row_type const r = cur.row();
@@ -1829,15 +1824,19 @@ bool InsetMathGrid::getStatus(Cursor & cur, FuncRequest const & cmd,
 
 
 // static
-char InsetMathGrid::colAlign(HullType type, col_type col)
+char InsetMathGrid::colAlign(HullType type, col_type col, BufferParams const & bp)
 {
        switch (type) {
        case hullEqnArray:
                return "rcl"[col % 3];
 
        case hullMultline:
-       case hullGather:
                return 'c';
+       case hullGather:
+               if (!bp.is_math_indent)
+                       return 'c';
+               else
+                       return 'l';
 
        case hullAlign:
        case hullAlignAt: