X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FCursor.cpp;h=ac230a15e003cb2ca9ad18163e97f0e583bbce02;hb=09df753df4c24470617c64d25eae6df2db85dfed;hp=363114ef5a0afe5e1b9c1cc055da79e812307be0;hpb=d35d25460b57c14e67a26c593881dfff31b35da5;p=lyx.git diff --git a/src/Cursor.cpp b/src/Cursor.cpp index 363114ef5a..ac230a15e0 100644 --- a/src/Cursor.cpp +++ b/src/Cursor.cpp @@ -15,7 +15,6 @@ #include "Bidi.h" #include "BufferView.h" -#include "bufferview_funcs.h" #include "Buffer.h" #include "Cursor.h" #include "CoordCache.h" @@ -34,16 +33,16 @@ #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 #include @@ -97,9 +96,9 @@ namespace { int xo; int yo; Inset const * inset = &it.inset(); - std::map const & data = + std::map const & data = c.bv().coordCache().getInsets().getData(); - std::map::const_iterator I = data.find(inset); + std::map::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_; @@ -132,6 +131,7 @@ namespace { } + /* /// moves position closest to (x, y) in given box bool bruteFind(Cursor & cursor, int x, int y, int xlow, int xhigh, int ylow, int yhigh) @@ -161,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) { @@ -186,6 +186,7 @@ namespace { return false; } + */ /// moves position closest to (x, y) in given box @@ -216,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) { @@ -253,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(); } @@ -266,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) {} @@ -417,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_; } @@ -673,17 +675,17 @@ 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; } -void Cursor::setScreenPos(int x, int y) +void Cursor::setScreenPos(int x, int /*y*/) { setTargetX(x); - bruteFind(*this, x, y, 0, bv().workWidth(), 0, bv().workHeight()); + //bruteFind(*this, x, y, 0, bv().workWidth(), 0, bv().workHeight()); } @@ -942,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; } @@ -1233,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) @@ -1461,8 +1469,8 @@ Font Cursor::getFont() const if (pos > 0) { TextMetrics const & tm = bv().textMetrics(&text); if (pos == sl.lastpos() - || (par.isSeparator(pos) && - !tm.isRTLBoundary(par, pos))) + || (par.isSeparator(pos) + && !tm.isRTLBoundary(sl.pit(), pos))) --pos; } @@ -1507,9 +1515,11 @@ bool notifyCursorLeaves(DocIterator const & old, Cursor & cur) void Cursor::setCurrentFont() { - pos_type cpos = pos(); - Paragraph & par = paragraph(); - Text const & ctext = *text(); + CursorSlice const & cs = innerTextSlice(); + Paragraph const & par = cs.paragraph(); + pos_type cpit = cs.pit(); + pos_type cpos = cs.pos(); + Text const & ctext = *cs.text(); TextMetrics const & tm = bv().textMetrics(&ctext); // are we behind previous char in fact? -> go to that char @@ -1526,7 +1536,7 @@ void Cursor::setCurrentFont() // abc| def -> font of c // abc |[WERBEH], i.e. boundary==true -> font of c // abc [WERBEH]| def, font of the space - if (!tm.isRTLBoundary(par, cpos)) + if (!tm.isRTLBoundary(cpit, cpos)) --cpos; } } @@ -1534,18 +1544,92 @@ void Cursor::setCurrentFont() // get font BufferParams const & bufparams = buffer().params(); current_font = par.getFontSettings(bufparams, cpos); - real_current_font = tm.getDisplayFont(par, cpos); + real_current_font = tm.getDisplayFont(cpit, cpos); // special case for paragraph end - if (pos() == lastpos() - && tm.isRTLBoundary(par, pos()) + if (cs.pos() == lastpos() + && tm.isRTLBoundary(cpit, cs.pos()) && !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