]> git.lyx.org Git - lyx.git/blobdiff - src/Cursor.cpp
pimpl not needed here
[lyx.git] / src / Cursor.cpp
index 60598573d6432c6f4cebbbb1914f311a180b6a42..ac230a15e003cb2ca9ad18163e97f0e583bbce02 100644 (file)
@@ -15,7 +15,6 @@
 
 #include "Bidi.h"
 #include "BufferView.h"
-#include "bufferview_funcs.h"
 #include "Buffer.h"
 #include "Cursor.h"
 #include "CoordCache.h"
 #include "Paragraph.h"
 #include "paragraph_funcs.h"
 #include "ParIterator.h"
+#include "TextMetrics.h"
 
 #include "insets/InsetTabular.h"
 #include "insets/InsetText.h"
 
-#include "mathed/MathData.h"
 #include "mathed/InsetMath.h"
 #include "mathed/InsetMathScript.h"
 #include "mathed/MacroTable.h"
-
-#include "support/limited_stack.h"
+#include "mathed/MathData.h"
+#include "mathed/MathMacro.h"
 
 #include <boost/assert.hpp>
 #include <boost/bind.hpp>
@@ -97,9 +96,9 @@ namespace {
                        int xo;
                        int yo;
                        Inset const * inset = &it.inset();
-                       std::map<Inset const *, Point> const & data =
+                       std::map<Inset const *, Geometry> const & data =
                                c.bv().coordCache().getInsets().getData();
-                       std::map<Inset const *, Point>::const_iterator I = data.find(inset);
+                       std::map<Inset const *, Geometry>::const_iterator I = data.find(inset);
 
                        // FIXME: in the case where the inset is not in the cache, this
                        // means that no part of it is visible on screen. In this case
@@ -110,7 +109,7 @@ namespace {
                                return it;
                        }
 
-                       Point o = I->second;
+                       Point o = I->second.pos;
                        inset->cursorPos(c.bv(), it.top(), c.boundary(), xo, yo);
                        // Convert to absolute
                        xo += o.x_;
@@ -162,7 +161,7 @@ namespace {
                for ( ; it != et; it.forwardPos(true)) {
                        // avoid invalid nesting when selecting
                        if (!cursor.selection() || positionable(it, cursor.anchor_)) {
-                               Point p = bv_funcs::getPos(bv, it, false);
+                               Point p = bv.getPos(it, false);
                                int xo = p.x_;
                                int yo = p.y_;
                                if (xlow <= xo && xo <= xhigh && ylow <= yo && yo <= yhigh) {
@@ -218,9 +217,9 @@ namespace {
 
                for ( ; it != et; it.forwardPos()) {
                        // avoid invalid nesting when selecting
-                       if (bv_funcs::status(&bv, it) == bv_funcs::CUR_INSIDE
+                       if (bv.cursorStatus(it) == CUR_INSIDE
                            && (!cur.selection() || positionable(it, cur.anchor_))) {
-                               Point p = bv_funcs::getPos(bv, it, false);
+                               Point p = bv.getPos(it, false);
                                int xo = p.x_;
                                int yo = p.y_;
                                if (xlow <= xo && xo <= xhigh && ylow <= yo && yo <= yhigh) {
@@ -255,8 +254,8 @@ namespace {
                odocstringstream ods;
                ods << '\n';
                // only add blank line if we're not in an ERT or Listings inset
-               if (par.ownerCode() != Inset::ERT_CODE
-                   && par.ownerCode() != Inset::LISTINGS_CODE)
+               if (par.ownerCode() != ERT_CODE
+                   && par.ownerCode() != LISTINGS_CODE)
                        ods << '\n';
                return ods.str();
        }
@@ -268,7 +267,8 @@ namespace {
 // bv functions are not yet available!
 Cursor::Cursor(BufferView & bv)
        : DocIterator(), bv_(&bv), anchor_(), x_target_(-1), textTargetOffset_(0),
-         selection_(false), mark_(false), logicalpos_(false), current_font(Font::ALL_INHERIT)
+         selection_(false), mark_(false), logicalpos_(false),
+         current_font(inherit_font)
 {}
 
 
@@ -419,7 +419,7 @@ int Cursor::currentMode()
 
 void Cursor::getPos(int & x, int & y) const
 {
-       Point p = bv_funcs::getPos(bv(), *this, boundary());
+       Point p = bv().getPos(*this, boundary());
        x = p.x_;
        y = p.y_;
 }
@@ -675,7 +675,7 @@ bool Cursor::openable(MathAtom const & t) const
        // we can't move into anything new during selection
        if (depth() >= anchor_.depth())
                return false;
-       if (!ptr_cmp(t.nucleus(), &anchor_[depth()].inset()))
+       if (t.nucleus() != &anchor_[depth()].inset())
                return false;
 
        return true;
@@ -944,7 +944,13 @@ bool Cursor::macroModeClose()
        InsetMathNest * const in = inset().asInsetMath()->asNestInset();
        if (in && in->interpretString(*this, s))
                return true;
-       plainInsert(createInsetMath(name));
+       MathAtom atom = createInsetMath(name);
+       MathMacro * atomAsMacro = atom.nucleus()->asMacro();
+       if (atomAsMacro) {
+               // make non-greedy, i.e. don't eat parameters from the right
+               atomAsMacro->setDisplayMode(MathMacro::DISPLAY_NONGREEDY_INIT);
+       }
+       plainInsert(atom);
        return true;
 }
 
@@ -1235,7 +1241,7 @@ bool Cursor::upDownInText(bool up, bool & updateNeeded)
 
        // with and without selection are handled differently
        if (!selection()) {
-               int yo = bv_funcs::getPos(bv(), *this, boundary()).y_;
+               int yo = bv().getPos(*this, boundary()).y_;
                Cursor old = *this;
                // To next/previous row
                if (up)
@@ -1546,10 +1552,84 @@ void Cursor::setCurrentFont()
            && !boundary()) {
                Language const * lang = par.getParLanguage(bufparams);
                current_font.setLanguage(lang);
-               current_font.setNumber(Font::OFF);
+               current_font.fontInfo().setNumber(FONT_OFF);
                real_current_font.setLanguage(lang);
-               real_current_font.setNumber(Font::OFF);
+               real_current_font.fontInfo().setNumber(FONT_OFF);
        }
 }
 
+
+bool Cursor::textUndo()
+{
+       DocIterator dit = *this;
+       // Undo::textUndo() will modify dit.
+       if (!bv_->buffer().undo().textUndo(dit))
+               return false;
+       // Set cursor
+       setCursor(dit);
+       selection() = false;
+       resetAnchor();
+       fixIfBroken();
+       return true;
+}
+
+
+bool Cursor::textRedo()
+{
+       DocIterator dit = *this;
+       // Undo::textRedo() will modify dit.
+       if (!bv_->buffer().undo().textRedo(dit))
+               return false;
+       // Set cursor
+       setCursor(dit);
+       selection() = false;
+       resetAnchor();
+       fixIfBroken();
+       return true;
+}
+
+
+void Cursor::finishUndo()
+{
+       bv_->buffer().undo().finishUndo();
+}
+
+
+void Cursor::recordUndo(UndoKind kind, pit_type from, pit_type to)
+{
+       bv_->buffer().undo().recordUndo(*this, kind, from, to);
+}
+
+
+void Cursor::recordUndo(UndoKind kind, pit_type from)
+{
+       bv_->buffer().undo().recordUndo(*this, kind, from);
+}
+
+
+void Cursor::recordUndo(UndoKind kind)
+{
+       bv_->buffer().undo().recordUndo(*this, kind);
+}
+
+
+void Cursor::recordUndoInset(UndoKind kind)
+{
+       bv_->buffer().undo().recordUndoInset(*this, kind);
+}
+
+
+void Cursor::recordUndoFullDocument()
+{
+       bv_->buffer().undo().recordUndoFullDocument(*this);
+}
+
+
+void Cursor::recordUndoSelection()
+{
+       bv_->buffer().undo().recordUndo(*this, ATOMIC_UNDO,
+               selBegin().pit(), selEnd().pit());
+}
+
+
 } // namespace lyx