]> git.lyx.org Git - lyx.git/blobdiff - src/text2.C
bug 1987: Crash when switching to different document class
[lyx.git] / src / text2.C
index 4e9b9fd00a8cfde0d332fdab40bc1f422ac2edff..e8001c7c7bd1dfdead898756c8b05a440739ffed 100644 (file)
@@ -481,7 +481,9 @@ void LyXText::setFont(LCursor & cur, LyXFont const & font, bool toggleall)
 void LyXText::cursorHome(LCursor & cur)
 {
        BOOST_ASSERT(this == cur.text());
-       setCursor(cur, cur.pit(), cur.textRow().pos());
+       Row const & row = cur.paragraph().getRow(cur.pos(),cur.boundary());
+
+       setCursor(cur, cur.pit(), row.pos());
 }
 
 
@@ -489,10 +491,21 @@ void LyXText::cursorEnd(LCursor & cur)
 {
        BOOST_ASSERT(this == cur.text());
        // if not on the last row of the par, put the cursor before
-       // the final space
-// FIXME: does this final space exist?
-       pos_type const end = cur.textRow().endpos();
-       setCursor(cur, cur.pit(), end == cur.lastpos() ? end : end - 1);
+       // the final space exept if I have a spanning inset or one string
+       // is so long that we force a break.
+       pos_type end = cur.textRow().endpos();
+       if (end == 0)
+               // empty text, end-1 is no valid position
+               return;
+       bool boundary = false;
+       if (end != cur.lastpos()) {
+               if (!cur.paragraph().isLineSeparator(end-1) 
+                       && !cur.paragraph().isNewline(end-1))
+                       boundary = true;
+               else
+                       --end;
+       }
+       setCursor(cur, cur.pit(), end, true, boundary);
 }
 
 
@@ -613,18 +626,8 @@ void LyXText::insertInset(LCursor & cur, InsetBase * inset)
 // needed to insert the selection
 void LyXText::insertStringAsLines(LCursor & cur, string const & str)
 {
-       pit_type pit = cur.pit();
-       pos_type pos = cur.pos();
-       recordUndo(cur);
-
-       // only to be sure, should not be neccessary
-       cur.clearSelection();
-       cur.buffer().insertStringAsLines(pars_, pit, pos, current_font, str,
-               autoBreakRows_);
-
-       cur.resetAnchor();
-       setCursor(cur, cur.pit(), pos);
-       cur.setSelection();
+       cur.buffer().insertStringAsLines(pars_, cur.pit(), cur.pos(), 
+               current_font, str, autoBreakRows_);
 }
 
 
@@ -830,6 +833,8 @@ pos_type LyXText::getColumnNearX(pit_type const pit,
                }
        }
 
+// I believe this code is not needed anymore (Jug 20050717)
+#if 0
        // The following code is necessary because the cursor position past
        // the last char in a row is logically equivalent to that before
        // the first char in the next row. That's why insets causing row
@@ -854,14 +859,15 @@ pos_type LyXText::getColumnNearX(pit_type const pit,
            && par.getInset(end - 1)->display()) {
                c = end - 1;
        }
+#endif
 
        x = int(tmpx) + xo;
-       int const col = c - row.pos();
+       pos_type const col = c - row.pos();
 
-        if (end == par.size())
+        if (!c || end == par.size())
                 return col;
 
-       if (!col && !par.isLineSeparator(c-1) && !par.isNewline(c-1)) {
+       if (c==end && !par.isLineSeparator(c-1) && !par.isNewline(c-1)) {
                boundary = true;
                return col;
        }
@@ -979,6 +985,13 @@ bool LyXText::checkAndActivateInset(LCursor & cur, bool front)
 
 bool LyXText::cursorLeft(LCursor & cur)
 {
+       if (!cur.boundary() && cur.pos() > 0 &&
+           cur.textRow().pos() == cur.pos() &&
+           !cur.paragraph().isLineSeparator(cur.pos()-1) &&
+           !cur.paragraph().isNewline(cur.pos()-1))
+       {
+               return setCursor(cur, cur.pit(), cur.pos(), true, true);
+       }
        if (cur.pos() != 0) {
                bool boundary = cur.boundary();
                bool updateNeeded = setCursor(cur, cur.pit(), cur.pos() - 1, true, false);
@@ -1008,7 +1021,14 @@ bool LyXText::cursorRight(LCursor & cur)
        if (cur.pos() != cur.lastpos()) {
                bool updateNeeded = false;
                if (!checkAndActivateInset(cur, true)) {
-                       updateNeeded |= setCursor(cur, cur.pit(), cur.pos() + 1, true, false);
+                       if (cur.textRow().endpos() == cur.pos() + 1 &&
+                           cur.textRow().endpos() != cur.lastpos() &&
+                           !cur.paragraph().isLineSeparator(cur.pos()) &&
+                           !cur.paragraph().isNewline(cur.pos()))
+                       {
+                               cur.boundary(true);
+                       }
+                       updateNeeded |= setCursor(cur, cur.pit(), cur.pos() + 1, true, cur.boundary());
                        if (false && bidi.isBoundary(cur.buffer(), cur.paragraph(),
                                                         cur.pos()))
                                updateNeeded |= setCursor(cur, cur.pit(), cur.pos(), true, true);
@@ -1057,7 +1077,8 @@ bool LyXText::cursorUp(LCursor & cur)
        } else if (cur.pit() > 0) {
                --cur.pit();
                //cannot use 'par' now
-               updateNeeded |= setCursor(cur, cur.pit(), x2pos(cur.pit(), cur.paragraph().rows().size() - 1, x));
+               updateNeeded |= setCursor(cur, cur.pit(),
+      x2pos(cur.pit(), cur.paragraph().rows().size() - 1, x));
        }
 
        cur.x_target() = x;
@@ -1202,7 +1223,8 @@ bool LyXText::deleteEmptyParagraphMechanism(LCursor & cur, LCursor const & old)
                if (old.pos() > 0
                    && old.pos() < oldpar.size()
                    && oldpar.isLineSeparator(old.pos())
-                   && oldpar.isLineSeparator(old.pos() - 1)) {
+                   && oldpar.isLineSeparator(old.pos() - 1)
+                   && oldpar.lookupChange(old.pos() - 1) != Change::DELETED) {
                        // We need to set the text to Change::INSERTED to
                        // get it erased properly
                        pars_[old.pit()].setChange(old.pos() -1,
@@ -1271,8 +1293,10 @@ bool LyXText::deleteEmptyParagraphMechanism(LCursor & cur, LCursor const & old)
                }
        }
 
-       if (deleted)
+       if (deleted) {
+               updateCounters(cur.buffer());
                return true;
+       }
 
        if (pars_[old.pit()].stripLeadingSpaces())
                cur.resetAnchor();
@@ -1281,12 +1305,6 @@ bool LyXText::deleteEmptyParagraphMechanism(LCursor & cur, LCursor const & old)
 }
 
 
-ParagraphList & LyXText::paragraphs() const
-{
-       return const_cast<ParagraphList &>(pars_);
-}
-
-
 void LyXText::recUndo(pit_type first, pit_type last) const
 {
        recordUndo(bv()->cursor(), Undo::ATOMIC, first, last);