]> git.lyx.org Git - lyx.git/blobdiff - src/text2.C
move some selection related stuff over to textcursor.C
[lyx.git] / src / text2.C
index 311f6e345835f2eb3ba915c0cfaf0a72c0ba6772..1b805a51404aef41b2217bba9009971372ed94a4 100644 (file)
@@ -18,6 +18,7 @@
 #include "frontends/LyXView.h"
 #include "undo_funcs.h"
 #include "buffer.h"
+#include "buffer_funcs.h"
 #include "bufferparams.h"
 #include "errorlist.h"
 #include "gettext.h"
@@ -529,7 +530,6 @@ bool LyXText::changeDepth(bv_funcs::DEPTH_CHANGE type, bool test_only)
        LyXCursor tmpcursor;
        setCursor(tmpcursor, start, 0);
 
-       //redoParagraphs(tmpcursor, &(*pastend));
        redoParagraphs(tmpcursor, pastend);
 
        // We need to actually move the text->cursor. I don't
@@ -622,7 +622,7 @@ void LyXText::setFont(LyXFont const & font, bool toggleall)
 
 void LyXText::redoHeightOfParagraph()
 {
-       RowList::iterator tmprow = cursor.row();
+       RowList::iterator tmprow = cursorRow();
        int y = cursor.y() - tmprow->baseline();
 
        setHeightOfRow(tmprow);
@@ -642,7 +642,7 @@ void LyXText::redoHeightOfParagraph()
 
 void LyXText::redoDrawingOfParagraph(LyXCursor const & cur)
 {
-       RowList::iterator tmprow = cur.row();
+       RowList::iterator tmprow = getRow(cur);
 
        int y = cur.y() - tmprow->baseline();
        setHeightOfRow(tmprow);
@@ -664,7 +664,7 @@ void LyXText::redoDrawingOfParagraph(LyXCursor const & cur)
 void LyXText::redoParagraphs(LyXCursor const & cur,
                             ParagraphList::iterator endpit)
 {
-       RowList::iterator tmprit = cur.row();
+       RowList::iterator tmprit = getRow(cur);
        int y = cur.y() - tmprit->baseline();
 
        ParagraphList::iterator first_phys_pit;
@@ -722,6 +722,14 @@ void LyXText::redoParagraphs(LyXCursor const & cur,
 
 
 void LyXText::fullRebreak()
+{
+       need_break_row = rows().begin();
+       partialRebreak();
+       setCursorIntern(cursor.par(), cursor.pos());
+}
+
+
+void LyXText::partialRebreak()
 {
        if (rows().empty()) {
                init(bv());
@@ -748,98 +756,18 @@ void LyXText::fullRebreak()
 // need the selection cursor:
 void LyXText::setSelection()
 {
-       bool const lsel = selection.set();
-
-       if (!selection.set()) {
-               last_sel_cursor = selection.cursor;
-               selection.start = selection.cursor;
-               selection.end = selection.cursor;
-       }
-
-       selection.set(true);
-
-       // first the toggling area
-       if (cursor.y() < last_sel_cursor.y()
-           || (cursor.y() == last_sel_cursor.y()
-               && cursor.x() < last_sel_cursor.x())) {
-               toggle_end_cursor = last_sel_cursor;
-               toggle_cursor = cursor;
-       } else {
-               toggle_end_cursor = cursor;
-               toggle_cursor = last_sel_cursor;
-       }
-
-       last_sel_cursor = cursor;
-
-       // and now the whole selection
-
-       if (selection.cursor.par() == cursor.par())
-               if (selection.cursor.pos() < cursor.pos()) {
-                       selection.end = cursor;
-                       selection.start = selection.cursor;
-               } else {
-                       selection.end = selection.cursor;
-                       selection.start = cursor;
-               }
-       else if (selection.cursor.y() < cursor.y() ||
-                (selection.cursor.y() == cursor.y()
-                 && selection.cursor.x() < cursor.x())) {
-               selection.end = cursor;
-               selection.start = selection.cursor;
-       }
-       else {
-               selection.end = selection.cursor;
-               selection.start = cursor;
-       }
-
-       // a selection with no contents is not a selection
-       if (selection.start.par() == selection.end.par() &&
-           selection.start.pos() == selection.end.pos())
-               selection.set(false);
+       bool const lsel = TextCursor::setSelection();
 
        if (inset_owner && (selection.set() || lsel))
                inset_owner->setUpdateStatus(bv(), InsetText::SELECTION);
 }
 
 
-string const LyXText::selectionAsString(Buffer const * buffer,
-                                       bool label) const
-{
-       if (!selection.set()) return string();
-
-       // should be const ...
-       ParagraphList::iterator startpit = selection.start.par();
-       ParagraphList::iterator endpit = selection.end.par();
-       pos_type const startpos(selection.start.pos());
-       pos_type const endpos(selection.end.pos());
-
-       if (startpit == endpit) {
-               return startpit->asString(buffer, startpos, endpos, label);
-       }
-
-       string result;
-
-       // First paragraph in selection
-       result += startpit->asString(buffer, startpos, startpit->size(), label) + "\n\n";
-
-       // The paragraphs in between (if any)
-       ParagraphList::iterator pit = boost::next(startpit);
-       for (; pit != endpit; ++pit) {
-               result += pit->asString(buffer, 0, pit->size(), label) + "\n\n";
-       }
-
-       // Last paragraph in selection
-       result += endpit->asString(buffer, 0, endpos, label);
-
-       return result;
-}
-
 
 void LyXText::clearSelection()
 {
-       selection.set(false);
-       selection.mark(false);
-       last_sel_cursor = selection.end = selection.start = selection.cursor = cursor;
+       TextCursor::clearSelection();
+
        // reset this in the bv_owner!
        if (bv_owner && bv_owner->text)
                bv_owner->text->xsel_cache.set(false);
@@ -848,7 +776,7 @@ void LyXText::clearSelection()
 
 void LyXText::cursorHome()
 {
-       setCursor(cursor.par(), cursor.row()->pos());
+       setCursor(cursor.par(), cursorRow()->pos());
 }
 
 
@@ -857,7 +785,7 @@ void LyXText::cursorEnd()
        if (cursor.par()->empty())
                return;
 
-       RowList::iterator rit = cursor.row();
+       RowList::iterator rit = cursorRow();
        RowList::iterator next_rit = boost::next(rit);
        ParagraphList::iterator pit = rit->par();
        pos_type last_pos = lastPos(*this, rit);
@@ -995,7 +923,7 @@ void LyXText::setParagraph(bool line_top, bool line_bottom,
 
        while (tmppit != boost::prior(selection.start.par())) {
                setCursor(tmppit, 0);
-               postPaint(cursor.y() - cursor.row()->baseline());
+               postPaint(cursor.y() - cursorRow()->baseline());
 
                ParagraphList::iterator pit = cursor.par();
                ParagraphParameters & params = pit->params();
@@ -1415,7 +1343,7 @@ void LyXText::pasteSelection(size_t sel_index)
                                            cursor.par(), cursor.pos(),
                                            bv()->buffer()->params.textclass,
                                            sel_index, el);
-       bv()->setErrorList(el);
+       parseErrors(*bv()->buffer(), el);
        bv()->showErrorList(_("Paste"));
 
        redoParagraphs(cursor, endpit);
@@ -1566,7 +1494,6 @@ void LyXText::checkParagraph(ParagraphList::iterator pit, pos_type pos)
        // check the special right address boxes
        if (pit->layout()->margintype == MARGIN_RIGHT_ADDRESS_BOX) {
                tmpcursor.par(pit);
-               tmpcursor.row(row);
                tmpcursor.y(y);
                tmpcursor.x(0);
                tmpcursor.x_fix(0);
@@ -1669,7 +1596,6 @@ void LyXText::setCursor(LyXCursor & cur, ParagraphList::iterator pit,
                }
        }
 
-       cur.row(row);
        // y is now the beginning of the cursor row
        y += row->baseline();
        // y is now the cursor baseline
@@ -1826,7 +1752,7 @@ void LyXText::setCurrentFont()
                        --pos;
                else // potentional bug... BUG (Lgb)
                        if (pit->isSeparator(pos)) {
-                               if (pos > cursor.row()->pos() &&
+                               if (pos > cursorRow()->pos() &&
                                    bidi_level(pos) % 2 ==
                                    bidi_level(pos - 1) % 2)
                                        --pos;
@@ -1988,7 +1914,7 @@ namespace {
         */
        bool beforeFullRowInset(LyXText & lt, LyXCursor const & cur)
        {
-               RowList::iterator row = cur.row();
+               RowList::iterator row = lt.getRow(cur);
                if (boost::next(row) == lt.rows().end())
                        return false;
 
@@ -2021,7 +1947,6 @@ void LyXText::setCursorFromCoordinates(LyXCursor & cur, int x, int y)
        cur.pos(row->pos() + column);
        cur.x(x);
        cur.y(y + row->baseline());
-       cur.row(row);
 
        if (beforeFullRowInset(*this, cur)) {
                pos_type const last = lastPrintablePos(*this, row);
@@ -2077,7 +2002,7 @@ void LyXText::cursorUp(bool selecting)
 {
 #if 1
        int x = cursor.x_fix();
-       int y = cursor.y() - cursor.row()->baseline() - 1;
+       int y = cursor.y() - cursorRow()->baseline() - 1;
        setCursorFromCoordinates(x, y);
        if (!selecting) {
                int topy = top_y();
@@ -2092,7 +2017,7 @@ void LyXText::cursorUp(bool selecting)
        }
 #else
        setCursorFromCoordinates(bv(), cursor.x_fix(),
-                                cursor.y() - cursor.row()->baseline() - 1);
+                                cursor.y() - cursorRow()->baseline() - 1);
 #endif
 }
 
@@ -2101,10 +2026,10 @@ void LyXText::cursorDown(bool selecting)
 {
 #if 1
        int x = cursor.x_fix();
-       int y = cursor.y() - cursor.row()->baseline() +
-               cursor.row()->height() + 1;
+       int y = cursor.y() - cursorRow()->baseline() +
+               cursorRow()->height() + 1;
        setCursorFromCoordinates(x, y);
-       if (!selecting && cursor.row() == cursor.irow()) {
+       if (!selecting && cursorRow() == cursor.irow()) {
                int topy = top_y();
                int y1 = cursor.iy() - topy;
                int y2 = y1;
@@ -2117,8 +2042,8 @@ void LyXText::cursorDown(bool selecting)
        }
 #else
        setCursorFromCoordinates(bv(), cursor.x_fix(),
-                                cursor.y() - cursor.row()->baseline()
-                                + cursor.row()->height() + 1);
+                                cursor.y() - cursorRow()->baseline()
+                                + cursorRow()->height() + 1);
 #endif
 }
 
@@ -2268,10 +2193,10 @@ bool LyXText::deleteEmptyParagraphMechanism(LyXCursor const & old_cursor)
                        selection.cursor.par()  == old_cursor.par()
                        && selection.cursor.pos() == old_cursor.pos());
 
-               if (old_cursor.row() != rows().begin()) {
+               if (getRow(old_cursor) != rows().begin()) {
                        RowList::iterator
-                               prevrow = boost::prior(old_cursor.row());
-                       const_cast<LyXText *>(this)->postPaint(old_cursor.y() - old_cursor.row()->baseline() - prevrow->height());
+                               prevrow = boost::prior(getRow(old_cursor));
+                       postPaint(old_cursor.y() - getRow(old_cursor)->baseline() - prevrow->height());
                        tmpcursor = cursor;
                        cursor = old_cursor; // that undo can restore the right cursor position
                        #warning FIXME. --end() iterator is usable here
@@ -2286,7 +2211,7 @@ bool LyXText::deleteEmptyParagraphMechanism(LyXCursor const & old_cursor)
                        cursor = tmpcursor;
 
                        // delete old row
-                       removeRow(old_cursor.row());
+                       removeRow(getRow(old_cursor));
                        // delete old par
                        ownerParagraphs().erase(old_cursor.par());
 
@@ -2301,9 +2226,8 @@ bool LyXText::deleteEmptyParagraphMechanism(LyXCursor const & old_cursor)
                        }
                        setHeightOfRow(prevrow);
                } else {
-                       RowList::iterator nextrow = boost::next(old_cursor.row());
-                       const_cast<LyXText *>(this)->postPaint(
-                               old_cursor.y() - old_cursor.row()->baseline());
+                       RowList::iterator nextrow = boost::next(getRow(old_cursor));
+                       postPaint(old_cursor.y() - getRow(old_cursor)->baseline());
 
                        tmpcursor = cursor;
                        cursor = old_cursor; // that undo can restore the right cursor position
@@ -2318,7 +2242,7 @@ bool LyXText::deleteEmptyParagraphMechanism(LyXCursor const & old_cursor)
                        cursor = tmpcursor;
 
                        // delete old row
-                       removeRow(old_cursor.row());
+                       removeRow(getRow(old_cursor));
                        // delete old par
                        ownerParagraphs().erase(old_cursor.par());
 
@@ -2393,7 +2317,7 @@ void LyXText::postPaint(int start_y)
        // We are an inset's lyxtext. Tell the top-level lyxtext
        // it needs to update the row we're in.
        LyXText * t = bv()->text;
-       t->postRowPaint(t->cursor.row(), t->cursor.y() - t->cursor.row()->baseline());
+       t->postRowPaint(t->cursorRow(), t->cursor.y() - t->cursorRow()->baseline());
 }
 
 
@@ -2420,7 +2344,7 @@ void LyXText::postRowPaint(RowList::iterator rit, int start_y)
        // We are an inset's lyxtext. Tell the top-level lyxtext
        // it needs to update the row we're in.
        LyXText * t = bv()->text;
-       t->postRowPaint(t->cursor.row(), t->cursor.y() - t->cursor.row()->baseline());
+       t->postRowPaint(t->cursorRow(), t->cursor.y() - t->cursorRow()->baseline());
 }