]> git.lyx.org Git - lyx.git/blobdiff - src/Cursor.cpp
Update notes.
[lyx.git] / src / Cursor.cpp
index b652c035ef66901bde3a892ebf8b4e121b637717..0017e1ae149576b29cdc42ccf9475156691dc127 100644 (file)
@@ -254,8 +254,8 @@ bool bruteFind3(Cursor & cur, int x, int y, bool up)
 Cursor::Cursor(BufferView & bv)
        : DocIterator(&bv.buffer()), bv_(&bv), anchor_(),
          x_target_(-1), textTargetOffset_(0),
-         selection_(false), mark_(false), logicalpos_(false),
-         current_font(inherit_font)
+         selection_(false), mark_(false), word_selection_(false),
+         logicalpos_(false), current_font(inherit_font)
 {}
 
 
@@ -483,8 +483,14 @@ void Cursor::resetAnchor()
 
 void Cursor::setCursorToAnchor()
 {
-       if (selection())
-               setCursor(anchor_);
+       if (selection()) {
+               DocIterator normal = anchor_;
+               while (depth() < normal.depth())
+                       normal.pop_back();
+               if (depth() < anchor_.depth() && top() <= anchor_[depth() - 1])
+                       ++normal.pos();
+               setCursor(normal);
+       }
 }
 
 
@@ -1059,6 +1065,7 @@ void Cursor::setSelection(DocIterator const & where, int n)
 void Cursor::clearSelection()
 {
        setSelection(false);
+       setWordSelection(false);
        setMark(false);
        resetAnchor();
 }
@@ -1299,11 +1306,11 @@ void Cursor::insert(Inset * inset0)
 }
 
 
-void Cursor::niceInsert(docstring const & t, Parse::flags f)
+void Cursor::niceInsert(docstring const & t, Parse::flags f, bool enter)
 {
-       MathData ar;
+       MathData ar(buffer());
        asArray(t, ar, f);
-       if (ar.size() == 1)
+       if (ar.size() == 1 && (enter || selection()))
                niceInsert(ar[0]);
        else
                insert(ar);
@@ -1315,14 +1322,14 @@ void Cursor::niceInsert(MathAtom const & t)
        macroModeClose();
        docstring const safe = cap::grabAndEraseSelection(*this);
        plainInsert(t);
-       // enter the new inset and move the contents of the selection if possible
+       // If possible, enter the new inset and move the contents of the selection
        if (t->isActive()) {
                posBackward();
                // be careful here: don't use 'pushBackward(t)' as this we need to
                // push the clone, not the original
                pushBackward(*nextInset());
                // We may not use niceInsert here (recursion)
-               MathData ar;
+               MathData ar(buffer());
                asArray(safe, ar);
                insert(ar);
        }
@@ -1473,7 +1480,7 @@ bool Cursor::macroModeClose()
                return false;
        InsetMathUnknown * p = activeMacro();
        p->finalize();
-       MathData selection;
+       MathData selection(buffer());
        asArray(p->selection(), selection);
        docstring const s = p->name();
        --pos();
@@ -1914,8 +1921,16 @@ bool Cursor::upDownInText(bool up, bool & updateNeeded)
                }
                top().pos() = min(tm.x2pos(pit(), next_row, xo), top().lastpos());
 
-               boundary(tm.x2pos(pit(), next_row, xo) 
-                       == tm.x2pos(pit(), next_row, tm.width()));
+               int const xpos = tm.x2pos(pit(), next_row, xo);
+               bool const at_end_row = xpos == tm.x2pos(pit(), next_row, tm.width());
+               bool const at_beg_row = xpos == tm.x2pos(pit(), next_row, 0);
+
+               if (at_end_row && at_beg_row)
+                       // make sure the cursor ends up on this row
+                       boundary(false);
+               else
+                       boundary(at_end_row);
+
                updateNeeded |= bv().checkDepm(*this, old);
        }
 
@@ -2155,9 +2170,9 @@ bool notifyCursorLeavesOrEnters(Cursor const & old, Cursor & cur)
        // notify everything on top of the common part in old cursor,
        // but stop if the inset claims the cursor to be invalid now
        for (size_type j = i; j < old.depth(); ++j) {
-               Cursor insetPos = old;
-               insetPos.cutOff(j);
-               if (old[j].inset().notifyCursorLeaves(insetPos, cur))
+               Cursor inset_pos = old;
+               inset_pos.cutOff(j);
+               if (old[j].inset().notifyCursorLeaves(inset_pos, cur))
                        return true;
        }