]> git.lyx.org Git - lyx.git/blobdiff - src/Cursor.cpp
compil fix for Qt-4.2
[lyx.git] / src / Cursor.cpp
index a1a078df0a5cb342b82ba3f0c3defa65243300e3..38ec3e4ebe2c1412368513a61f3413a4db13edaf 100644 (file)
 #include <config.h>
 
 #include "Bidi.h"
-#include "BufferView.h"
 #include "Buffer.h"
-#include "Cursor.h"
+#include "BufferView.h"
 #include "CoordCache.h"
+#include "Cursor.h"
 #include "CutAndPaste.h"
 #include "DispatchResult.h"
 #include "Encoding.h"
+#include "Font.h"
 #include "FuncRequest.h"
 #include "Language.h"
 #include "lfuns.h"
-#include "Font.h"
 #include "LyXFunc.h" // only for setMessage()
 #include "LyXRC.h"
-#include "Row.h"
-#include "Text.h"
-#include "Paragraph.h"
 #include "paragraph_funcs.h"
+#include "Paragraph.h"
 #include "ParIterator.h"
+#include "Row.h"
+#include "Text.h"
 #include "TextMetrics.h"
+#include "TocBackend.h"
 
 #include "support/debug.h"
 #include "support/docstream.h"
@@ -296,7 +297,6 @@ void Cursor::dispatch(FuncRequest const & cmd0)
        Cursor safe = *this;
        
        // store some values to be used inside of the handlers
-       getPos(beforeDispX_, beforeDispY_);
        beforeDispatchCursor_ = *this;
        for (; depth(); pop()) {
                LYXERR(Debug::DEBUG, "Cursor::dispatch: cmd: "
@@ -420,7 +420,8 @@ void Cursor::getPos(int & x, int & y) const
 
 Row const & Cursor::textRow() const
 {
-       ParagraphMetrics const & pm = bv().parMetrics(text(), pit());
+       CursorSlice const & cs = innerTextSlice();
+       ParagraphMetrics const & pm = bv().parMetrics(cs.text(), cs.pit());
        BOOST_ASSERT(!pm.rows().empty());
        return pm.getRow(pos(), boundary());
 }
@@ -578,6 +579,8 @@ void Cursor::info(odocstream & os) const
 bool Cursor::selHandle(bool sel)
 {
        //lyxerr << "Cursor::selHandle" << endl;
+       if (mark())
+               sel = true;
        if (sel == selection())
                return false;
 
@@ -643,7 +646,7 @@ namespace lyx {
 //#define FILEDEBUG 1
 
 
-bool Cursor::isInside(Inset const * p)
+bool Cursor::isInside(Inset const * p) const
 {
        for (size_t i = 0; i != depth(); ++i)
                if (&operator[](i).inset() == p)
@@ -1074,8 +1077,8 @@ bool Cursor::upDownInMath(bool up)
        int xo = 0;
        int yo = 0;
        getPos(xo, yo);
-       xo = beforeDispX_;
-
+       xo = theLyXFunc().cursorBeforeDispatchX();
+       
        // check if we had something else in mind, if not, this is the future
        // target
        if (x_target_ == -1)
@@ -1124,8 +1127,9 @@ bool Cursor::upDownInMath(bool up)
                                int x;
                                int y;
                                getPos(x, y);
-                               if ((!up && y <= beforeDispY_) ||
-                                               (up && y >= beforeDispY_))
+                               int oy = theLyXFunc().cursorBeforeDispatchY();
+                               if ((!up && y <= oy) ||
+                                               (up && y >= oy))
                                        operator=(old);
                                else
                                        return true;
@@ -1144,8 +1148,9 @@ bool Cursor::upDownInMath(bool up)
                                int x;
                                int y;
                                getPos(x, y);
-                               if ((!up && y <= beforeDispY_) ||
-                                               (up && y >= beforeDispY_))
+                               int oy = theLyXFunc().cursorBeforeDispatchY();
+                               if ((!up && y <= oy) ||
+                                               (up && y >= oy))
                                        operator=(old);
                                else
                                        return true;
@@ -1167,8 +1172,9 @@ bool Cursor::upDownInMath(bool up)
                //lyxerr << "updown: popBackward succeeded" << endl;
                int xnew;
                int ynew;
+               int yold = theLyXFunc().cursorBeforeDispatchY();
                getPos(xnew, ynew);
-               if (up ? ynew < beforeDispY_ : ynew > beforeDispY_)
+               if (up ? ynew < yold : ynew > yold)
                        return true;
        }
        
@@ -1186,8 +1192,8 @@ bool Cursor::upDownInText(bool up, bool & updateNeeded)
        int xo = 0;
        int yo = 0;
        getPos(xo, yo);
-       xo = beforeDispX_;
-       
+       xo = theLyXFunc().cursorBeforeDispatchX();
+
        // update the targetX - this is here before the "return false"
        // to set a new target which can be used by InsetTexts above
        // if we cannot move up/down inside this inset anymore
@@ -1407,13 +1413,7 @@ Encoding const * Cursor::getEncoding() const
 {
        if (empty())
                return 0;
-       int s = 0;
-       // go up until first non-0 text is hit
-       // (innermost text is 0 in mathed)
-       for (s = depth() - 1; s >= 0; --s)
-               if (operator[](s).text())
-                       break;
-       CursorSlice const & sl = operator[](s);
+       CursorSlice const & sl = innerTextSlice();
        Text const & text = *sl.text();
        Font font = text.getPar(sl.pit()).getFont(
                bv().buffer().params(), sl.pos(), outerFont(sl.pit(), text.paragraphs()));
@@ -1452,13 +1452,8 @@ Font Cursor::getFont() const
        // if a character is entered.
        
        // HACK. far from being perfect...
-       // go up until first non-0 text is hit
-       // (innermost text is 0 in mathed)
-       int s = 0;
-       for (s = depth() - 1; s >= 0; --s)
-               if (operator[](s).text())
-                       break;
-       CursorSlice const & sl = operator[](s);
+
+       CursorSlice const & sl = innerTextSlice();
        Text const & text = *sl.text();
        Paragraph const & par = text.getPar(sl.pit());
        
@@ -1634,4 +1629,14 @@ void Cursor::recordUndoSelection()
 }
 
 
+void Cursor::checkBufferStructure()
+{
+       if (paragraph().layout()->toclevel == Layout::NOT_IN_TOC)
+               return;
+       Buffer const * master = buffer().masterBuffer();
+       master->tocBackend().updateItem(ParConstIterator(*this));
+       master->structureChanged();
+}
+
+
 } // namespace lyx