]> git.lyx.org Git - features.git/blobdiff - src/insets/InsetTabular.cpp
move more stuff from buffer_func to Buffer
[features.git] / src / insets / InsetTabular.cpp
index 433d22fbd9740f6553e4ab1752cb0e7e60c6f822..e9e2c31033efaa5c81c21966cc7ce4fef80edb2a 100644 (file)
@@ -3,14 +3,14 @@
  * This file is part of LyX, the document processor.
  * Licence details can be found in the file COPYING.
  *
- * \author Lars Gullik Bjønnes
+ * \author Lars Gullik Bjønnes
  * \author Matthias Ettrich
- * \author José Matos
+ * \author José Matos
  * \author Jean-Marc Lasgouttes
  * \author Angus Leeming
  * \author John Levon
- * \author André Pönitz
- * \author Jürgen Vigna
+ * \author André Pönitz
+ * \author Jürgen Vigna
  *
  * Full author contact details are available in file CREDITS.
  */
@@ -2996,11 +2996,37 @@ void InsetTabular::metrics(MetricsInfo & mi, Dimension & dim) const
        dim.wid = tabular.width() + 2 * ADD_TO_TABULAR_WIDTH;
 }
 
+bool InsetTabular::isCellSelected(Cursor & cur, row_type row, col_type col) 
+       const
+{
+       if (&cur.inset() == this && cur.selection()) {
+               if (cur.selIsMultiCell()) {
+                       row_type rs, re;
+                       col_type cs, ce;
+                       getSelection(cur, rs, re, cs, ce);
+                       
+                       if (col >= cs && col <= ce && row >= rs && row <= re)
+                               return true;
+               } else 
+                       if (col == tabular.cellColumn(cur.idx()) 
+                               && row == tabular.cellRow(cur.idx())) {
+                       CursorSlice const & beg = cur.selBegin();
+                       CursorSlice const & end = cur.selEnd();
+
+                       if (end.lastpos() > 0 && end.pos() == end.lastpos() 
+                                 && beg.pos() == 0)
+                               return true;
+               }
+       }
+       return false;
+}
+
 
 void InsetTabular::draw(PainterInfo & pi, int x, int y) const
 {
        //lyxerr << "InsetTabular::draw: " << x << " " << y << endl;
        BufferView * bv = pi.base.bv;
+       Cursor & cur = pi.base.bv->cursor();
 
        // FIXME: As the full backrgound is painted in drawSelection(),
        // we have no choice but to do a full repaint for the Text cells.
@@ -3012,6 +3038,7 @@ void InsetTabular::draw(PainterInfo & pi, int x, int y) const
        x += ADD_TO_TABULAR_WIDTH;
 
        bool const original_drawing_state = pi.pain.isDrawingEnabled();
+       bool const original_selection_state = pi.selected;
 
        idx_type idx = 0;
        first_visible_cell = Tabular::npos;
@@ -3026,6 +3053,7 @@ void InsetTabular::draw(PainterInfo & pi, int x, int y) const
                        if (first_visible_cell == Tabular::npos)
                                first_visible_cell = idx;
 
+                       pi.selected |= isCellSelected(cur, i, j);
                        int const cx = nx + tabular.getBeginningOfTextInCell(idx);
                        // Cache the Inset position.
                        bv->coordCache().insets().add(cell(idx).get(), cx, y);
@@ -3043,6 +3071,7 @@ void InsetTabular::draw(PainterInfo & pi, int x, int y) const
                        }
                        nx += tabular.columnWidth(idx);
                        ++idx;
+                       pi.selected = original_selection_state;
                }
 
                if (i + 1 < tabular.row_info.size())
@@ -3065,7 +3094,7 @@ void InsetTabular::drawSelection(PainterInfo & pi, int x, int y) const
        int const w = tabular.width();
        int const h = tabular.height();
        int yy = y - tabular.rowAscent(0);
-       pi.pain.fillRectangle(x, yy, w, h, backgroundColor());
+       pi.pain.fillRectangle(x, yy, w, h, pi.backgroundColor(this));
 
        if (!cur.selection())
                return;
@@ -3076,9 +3105,6 @@ void InsetTabular::drawSelection(PainterInfo & pi, int x, int y) const
 
 
        if (cur.selIsMultiCell()) {
-               row_type rs, re;
-               col_type cs, ce;
-               getSelection(cur, rs, re, cs, ce);
                y -= tabular.rowAscent(0);
                for (row_type j = 0; j < tabular.row_info.size(); ++j) {
                        int const a = tabular.rowAscent(j);
@@ -3091,7 +3117,7 @@ void InsetTabular::drawSelection(PainterInfo & pi, int x, int y) const
                                idx_type const cell =
                                        tabular.cellIndex(j, i);
                                int const w = tabular.columnWidth(cell);
-                               if (i >= cs && i <= ce && j >= rs && j <= re)
+                               if (isCellSelected(cur, j, i))
                                        pi.pain.fillRectangle(xx, y, w, h,
                                                              Color_selection);
                                xx += w;
@@ -3185,7 +3211,7 @@ void InsetTabular::edit(Cursor & cur, bool front, EntryDirection)
 void InsetTabular::updateLabels(ParIterator const & it)
 {
        // In a longtable, tell captions what the current float is
-       Counters & cnts = buffer().params().documentClass().counters();
+       Counters & cnts = buffer().masterBuffer()->params().documentClass().counters();
        string const saveflt = cnts.current_float();
        if (tabular.is_long_tabular)
                cnts.current_float("table");
@@ -3194,7 +3220,7 @@ void InsetTabular::updateLabels(ParIterator const & it)
        it2.forwardPos();
        size_t const end = it2.nargs();
        for ( ; it2.idx() < end; it2.top().forwardIdx())
-               lyx::updateLabels(buffer(), it2);
+               buffer().updateLabels(it2);
 
        //reset afterwards
        if (tabular.is_long_tabular)
@@ -3295,8 +3321,8 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd)
                        // if this is a multicell selection, we just set the cursor to
                        // the beginning of the cell's text.
                        if (bvcur.selIsMultiCell()) {
-                               bvcur.pit() = 0;
-                               bvcur.pos() = 0;
+                               bvcur.pit() = bvcur.lastpit();
+                               bvcur.pos() = bvcur.lastpos();
                        }
                }
                break;
@@ -3409,6 +3435,11 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd)
                        cmd = FuncRequest(LFUN_FINISHED_FORWARD);
                        cur.undispatched();
                }
+               if (cur.selIsMultiCell()) {
+                       cur.pit() = cur.lastpit();
+                       cur.pos() = cur.lastpos();
+                       return;
+               }
                break;
 
        case LFUN_UP_SELECT:
@@ -3432,6 +3463,11 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd)
                        cmd = FuncRequest(LFUN_UP);
                        cur.undispatched();
                }
+               if (cur.selIsMultiCell()) {
+                       cur.pit() = cur.lastpit();
+                       cur.pos() = cur.lastpos();
+                       return;
+               }
                break;
 
 //     case LFUN_SCREEN_DOWN: {
@@ -3513,6 +3549,14 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd)
                        cell(cur.idx())->dispatch(cur, cmd);
                break;
 
+       case LFUN_SELF_INSERT:
+               if (cur.selIsMultiCell()) {
+                       cur.recordUndoInset(DELETE_UNDO);
+                       cutSelection(cur);
+               }
+               cell(cur.idx())->dispatch(cur, cmd);
+               break;
+
        case LFUN_CHAR_DELETE_BACKWARD:
        case LFUN_CHAR_DELETE_FORWARD:
                if (cur.selIsMultiCell()) {
@@ -4126,9 +4170,18 @@ void InsetTabular::moveNextCell(Cursor & cur, EntryDirection entry_from)
                        return;
                ++cur.idx();
        }
+
+       cur.boundary(false);
+
+       if (cur.selIsMultiCell()) {
+               cur.pit() = cur.lastpit();
+               cur.pos() = cur.lastpos();
+               resetPos(cur);
+               return;
+       }
+
        cur.pit() = 0;
        cur.pos() = 0;
-       cur.boundary(false);
 
        // in visual mode, place cursor at extreme left or right
        
@@ -4169,6 +4222,14 @@ void InsetTabular::movePrevCell(Cursor & cur, EntryDirection entry_from)
                        return;
                --cur.idx();
        }
+
+       if (cur.selIsMultiCell()) {
+               cur.pit() = cur.lastpit();
+               cur.pos() = cur.lastpos();
+               resetPos(cur);
+               return;
+       }
+
        cur.pit() = cur.lastpit();
        cur.pos() = cur.lastpos();