]> git.lyx.org Git - lyx.git/blobdiff - src/Cursor.cpp
Get rid of all-insets-toggle and explain how to replace it with inset-forall.
[lyx.git] / src / Cursor.cpp
index 5e8843245f89ec0e298d3309ce5c5eb2b97cdd25..bcfbcf7e2ec37247236ff73119199a7624b84359 100644 (file)
@@ -27,7 +27,6 @@
 #include "FuncRequest.h"
 #include "Language.h"
 #include "LyXAction.h"
-#include "LyXFunc.h" // only for setMessage()
 #include "LyXRC.h"
 #include "Paragraph.h"
 #include "ParIterator.h"
@@ -254,8 +253,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)
 {}
 
 
@@ -315,6 +314,12 @@ bool Cursor::getStatus(FuncRequest const & cmd, FuncStatus & status) const
 }
 
 
+void Cursor::saveBeforeDispatchPosXY()
+{
+       getPos(beforeDispatchPosX_, beforeDispatchPosY_);
+}
+
+
 void Cursor::dispatch(FuncRequest const & cmd0)
 {
        LYXERR(Debug::DEBUG, "cmd: " << cmd0 << '\n' << *this);
@@ -336,8 +341,10 @@ void Cursor::dispatch(FuncRequest const & cmd0)
                LYXERR(Debug::DEBUG, "Cursor::dispatch: (AtPoint) cmd: "
                        << cmd0 << endl << *this);
                nextInset()->dispatch(*this, tmpcmd);
-               if (result().dispatched())
+               if (result().dispatched()) {
+                       buffer()->undo().endUndoGroup();
                        return;
+               }
        }
 
        // store some values to be used inside of the handlers
@@ -483,8 +490,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 +1072,7 @@ void Cursor::setSelection(DocIterator const & where, int n)
 void Cursor::clearSelection()
 {
        setSelection(false);
+       setWordSelection(false);
        setMark(false);
        resetAnchor();
 }
@@ -1303,7 +1317,7 @@ void Cursor::niceInsert(docstring const & t, Parse::flags f, bool enter)
 {
        MathData ar(buffer());
        asArray(t, ar, f);
-       if (ar.size() == 1 && (selection() || enter))
+       if (ar.size() == 1 && (enter || selection()))
                niceInsert(ar[0]);
        else
                insert(ar);
@@ -1336,6 +1350,8 @@ void Cursor::insert(MathData const & ar)
                cap::eraseSelection(*this);
        cell().insert(pos(), ar);
        pos() += ar.size();
+       // FIXME audit setBuffer/updateBuffer calls
+       inset().setBuffer(bv_->buffer());
 }
 
 
@@ -1651,8 +1667,8 @@ bool Cursor::upDownInMath(bool up)
        int xo = 0;
        int yo = 0;
        getPos(xo, yo);
-       xo = theLyXFunc().cursorBeforeDispatchX();
-       
+       xo = beforeDispatchPosX_;
+
        // check if we had something else in mind, if not, this is the future
        // target
        if (x_target_ == -1)
@@ -1701,7 +1717,7 @@ bool Cursor::upDownInMath(bool up)
                                int x;
                                int y;
                                getPos(x, y);
-                               int oy = theLyXFunc().cursorBeforeDispatchY();
+                               int oy = beforeDispatchPosY_;
                                if ((!up && y <= oy) ||
                                                (up && y >= oy))
                                        operator=(old);
@@ -1722,7 +1738,7 @@ bool Cursor::upDownInMath(bool up)
                                int x;
                                int y;
                                getPos(x, y);
-                               int oy = theLyXFunc().cursorBeforeDispatchY();
+                               int oy = beforeDispatchPosY_;
                                if ((!up && y <= oy) ||
                                                (up && y >= oy))
                                        operator=(old);
@@ -1746,7 +1762,7 @@ bool Cursor::upDownInMath(bool up)
                //lyxerr << "updown: popBackward succeeded" << endl;
                int xnew;
                int ynew;
-               int yold = theLyXFunc().cursorBeforeDispatchY();
+               int yold = beforeDispatchPosY_;
                getPos(xnew, ynew);
                if (up ? ynew < yold : ynew > yold)
                        return true;
@@ -1788,7 +1804,7 @@ bool Cursor::upDownInText(bool up, bool & updateNeeded)
        int xo = 0;
        int yo = 0;
        getPos(xo, yo);
-       xo = theLyXFunc().cursorBeforeDispatchX();
+       xo = beforeDispatchPosX_;
 
        // update the targetX - this is here before the "return false"
        // to set a new target which can be used by InsetTexts above
@@ -1972,13 +1988,14 @@ void Cursor::handleFont(string const & font)
 
 void Cursor::message(docstring const & msg) const
 {
-       theLyXFunc().setMessage(msg);
+       disp_.setMessage(msg);
 }
 
 
 void Cursor::errorMessage(docstring const & msg) const
 {
-       theLyXFunc().setErrorMessage(msg);
+       disp_.setMessage(msg);
+       disp_.setError(true);
 }
 
 
@@ -2135,9 +2152,12 @@ Font Cursor::getFont() const
 
 bool Cursor::fixIfBroken()
 {
-       if (DocIterator::fixIfBroken()) {
-                       clearSelection();
-                       return true;
+       bool const broken_cursor = DocIterator::fixIfBroken();
+       bool const broken_anchor = anchor_.fixIfBroken();
+       
+       if (broken_cursor || broken_anchor) {
+               clearSelection();
+               return true;
        }
        return false;
 }