X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fcursor.C;h=d8cc1ba53a760d2670e17386c4d9cb9a5a3aabda;hb=0ea524145a00c57df49ab1bebafdc74b19a23813;hp=abcb92017dcac21bad3545859f329d49f04f47e6;hpb=1b3f5ee46ff2924c4b374f52ad6317b5fd7ac9a5;p=lyx.git diff --git a/src/cursor.C b/src/cursor.C index abcb92017d..d8cc1ba53a 100644 --- a/src/cursor.C +++ b/src/cursor.C @@ -15,11 +15,11 @@ #include "BufferView.h" #include "buffer.h" #include "cursor.h" +#include "CutAndPaste.h" #include "debug.h" #include "dispatchresult.h" #include "encoding.h" #include "funcrequest.h" -#include "iterators.h" #include "language.h" #include "lfuns.h" #include "lyxfont.h" @@ -29,14 +29,17 @@ #include "lyxtext.h" #include "paragraph.h" #include "paragraph_funcs.h" +#include "pariterator.h" #include "insets/updatableinset.h" #include "insets/insettabular.h" #include "insets/insettext.h" #include "mathed/math_data.h" -#include "mathed/math_hullinset.h" #include "mathed/math_support.h" +#include "mathed/math_inset.h" +#include "mathed/math_braceinset.h" +#include "mathed/math_macrotable.h" #include "support/limited_stack.h" #include "support/std_sstream.h" @@ -45,6 +48,8 @@ #include +using lyx::par_type; + using std::string; using std::vector; using std::endl; @@ -60,119 +65,132 @@ using std::swap; limited_stack theCutBuffer; +namespace { + +void region(CursorSlice const & i1, CursorSlice const & i2, + LCursor::row_type & r1, LCursor::row_type & r2, + LCursor::col_type & c1, LCursor::col_type & c2) +{ + InsetBase & p = i1.inset(); + c1 = p.col(i1.idx()); + c2 = p.col(i2.idx()); + if (c1 > c2) + swap(c1, c2); + r1 = p.row(i1.idx()); + r2 = p.row(i2.idx()); + if (r1 > r2) + swap(r1, r2); +} + +} + + LCursor::LCursor(BufferView & bv) - : DocumentIterator(), bv_(&bv), anchor_(), - cached_y_(0), x_target_(-1), selection_(false), mark_(false) + : DocIterator(), bv_(&bv), anchor_(), x_target_(-1), + selection_(false), mark_(false) {} -void LCursor::reset() +void LCursor::reset(InsetBase & inset) { clear(); - push_back(CursorSlice()); - anchor_.clear(); - anchor_.push_back(CursorSlice()); - cached_y_ = 0; + push_back(CursorSlice(inset)); + anchor_ = DocIterator(inset); clearTargetX(); selection_ = false; mark_ = false; } -void LCursor::setCursor(DocumentIterator const & cur, bool sel) +void LCursor::setCursor(DocIterator const & cur, bool sel) { // this (intentionally) does not touch the anchor - DocumentIterator::operator=(cur); + DocIterator::operator=(cur); selection() = sel; } DispatchResult LCursor::dispatch(FuncRequest const & cmd0) { - //lyxerr << "\nLCursor::dispatch: cmd: " << cmd0 << endl << *this << endl; + lyxerr << "\nLCursor::dispatch: cmd: " << cmd0 << endl << *this << endl; if (empty()) - return DispatchResult(false); + return DispatchResult(); - BOOST_ASSERT(pos() <= lastpos()); - BOOST_ASSERT(idx() <= lastidx()); - BOOST_ASSERT(par() <= lastpar()); FuncRequest cmd = cmd0; - nopop_ = false; - DocumentIterator orig = *this; - disp_.update(true); - disp_.val(NONE); - - // the inset's dispatch() is supposed to reset the update and - // val flags if necessary - inset().dispatch(*this, cmd); - - // "Mutate" the request for semi-handled requests that need - // additional handling in outer levels. - switch (disp_.val()) { - case NONE: - // the inset handled the event fully - return DispatchResult(true, true); - case FINISHED_LEFT: - // the inset handled the event partially - cmd = FuncRequest(LFUN_FINISHED_LEFT); - break; - case FINISHED_RIGHT: - cmd = FuncRequest(LFUN_FINISHED_RIGHT); - break; - case FINISHED_UP: - cmd = FuncRequest(LFUN_FINISHED_UP); - break; - case FINISHED_DOWN: - cmd = FuncRequest(LFUN_FINISHED_DOWN); - break; - default: - //lyxerr << "not handled on level " << depth() - // << " val: " << disp_.val() << endl; + LCursor safe = *this; + + for ( ; size(); pop()) { + //lyxerr << "\nLCursor::dispatch: cmd: " << cmd0 << endl << *this << endl; + BOOST_ASSERT(pos() <= lastpos()); + BOOST_ASSERT(idx() <= lastidx()); + BOOST_ASSERT(par() <= lastpar()); + + // The common case is 'LFUN handled, need update', so make the + // LFUN handler's life easier by assuming this as default value. + // The handler can reset the update and val flags if necessary. + disp_.update(true); + disp_.dispatched(true); + inset().dispatch(*this, cmd); + if (disp_.dispatched()) break; } - pop(); - if (nopop_) - setCursor(orig, false); - //lyxerr << " result: " << res.val() << endl; + // it completely to get a 'bomb early' behaviour in case this + // object will be used again. + if (!disp_.dispatched()) { + lyxerr << "RESTORING OLD CURSOR!" << endl; + operator=(safe); + disp_.dispatched(false); + } return disp_; } bool LCursor::getStatus(FuncRequest const & cmd, FuncStatus & status) { - lyxerr << "\nLCursor::getStatus: cmd: " << cmd << endl << *this << endl; - DocumentIterator orig = *this; - BOOST_ASSERT(pos() <= lastpos()); - BOOST_ASSERT(idx() <= lastidx()); - BOOST_ASSERT(par() <= lastpar()); - for ( ; size() != 0; pop_back()) { - // the inset's getStatus() will return 'true' if it made + // This is, of course, a mess. Better create a new doc iterator and use + // this in Inset::getStatus. This might require an additional + // BufferView * arg, though (which should be avoided) + LCursor safe = *this; + bool res = false; + for ( ; size(); pop()) { + //lyxerr << "\nLCursor::getStatus: cmd: " << cmd << endl << *this << endl; + BOOST_ASSERT(pos() <= lastpos()); + BOOST_ASSERT(idx() <= lastidx()); + BOOST_ASSERT(par() <= lastpar()); + + // The inset's getStatus() will return 'true' if it made // a definitive decision on whether it want to handle the // request or not. The result of this decision is put into // the 'status' parameter. - bool const res = inset().getStatus(*this, cmd, status); - if (res) { - setCursor(orig, false); - return true; + if (inset().getStatus(*this, cmd, status)) { + res = true; + break; } } - bool const res = bv().text()->getStatus(*this, cmd, status); - setCursor(orig, false); + operator=(safe); return res; } BufferView & LCursor::bv() const { + BOOST_ASSERT(bv_); return *bv_; } +Buffer & LCursor::buffer() const +{ + BOOST_ASSERT(bv_); + BOOST_ASSERT(bv_->buffer()); + return *bv_->buffer(); +} + + void LCursor::pop() { BOOST_ASSERT(size() >= 1); pop_back(); - anchor_.pop_back(); } @@ -195,12 +213,9 @@ bool LCursor::popLeft() { BOOST_ASSERT(!empty()); //lyxerr << "Leaving inset to the left" << endl; - if (depth() <= 1) { - if (depth() == 1) - inset().notifyCursorLeaves(idx()); + inset().notifyCursorLeaves(*this); + if (depth() == 1) return false; - } - inset().notifyCursorLeaves(idx()); pop(); return true; } @@ -210,12 +225,9 @@ bool LCursor::popRight() { BOOST_ASSERT(!empty()); //lyxerr << "Leaving inset to the right" << endl; - if (depth() <= 1) { - if (depth() == 1) - inset().notifyCursorLeaves(idx()); + inset().notifyCursorLeaves(*this); + if (depth() == 1) return false; - } - inset().notifyCursorLeaves(idx()); pop(); ++pos(); return true; @@ -225,63 +237,40 @@ bool LCursor::popRight() int LCursor::currentMode() { BOOST_ASSERT(!empty()); - for (int i = size() - 1; i >= 1; --i) { + for (int i = size() - 1; i >= 0; --i) { int res = operator[](i).inset().currentMode(); - if (res != MathInset::UNDECIDED_MODE) + if (res != InsetBase::UNDECIDED_MODE) return res; } - return MathInset::TEXT_MODE; -} - - -void LCursor::updatePos() -{ - BOOST_ASSERT(!empty()); - if (size() > 1) - cached_y_ = bv().top_y() + back().inset().yo(); - //cached_y_ = back().inset().yo(); + return InsetBase::TEXT_MODE; } void LCursor::getDim(int & asc, int & des) const { - BOOST_ASSERT(!empty()); if (inMathed()) { BOOST_ASSERT(inset().asMathInset()); //inset().asMathInset()->getCursorDim(asc, des); asc = 10; des = 10; - } else { + } else if (inTexted()) { Row const & row = textRow(); asc = row.baseline(); des = row.height() - asc; + } else { + lyxerr << "should this happen?" << endl; + asc = 10; + des = 10; } } void LCursor::getPos(int & x, int & y) const { - BOOST_ASSERT(!empty()); x = 0; y = 0; - if (size() == 1) { - x = bv().text()->cursorX(front()); - y = bv().text()->cursorY(front()); - } else { - inset().getCursorPos(back(), x, y); - // getCursorPos gives _screen_ coordinates. We need to add - // top_y to get document coordinates. This is hidden in cached_y_. - //y += cached_y_ - inset().yo(); - // The rest is non-obvious. The reason we have to have these - // extra computation is that the getCursorPos() calls rely - // on the inset's own knowledge of its screen position. - // If we scroll up or down in a big enough increment, - // inset->draw() is not called: this doesn't update - // inset.yo_, so getCursor() returns an old value. - // Ugly as you like. - } - //lyxerr << "#### LCursor::getPos: " << *this - // << " x: " << x << " y: " << y << endl; + if (!empty()) + inset().getCursorPos(*this, x, y); } @@ -316,19 +305,19 @@ bool LCursor::posRight() } -CursorSlice & LCursor::anchor() -{ - return anchor_.back(); -} - - -CursorSlice const & LCursor::anchor() const +CursorSlice LCursor::anchor() const { - return anchor_.back(); + BOOST_ASSERT(anchor_.size() >= size()); + CursorSlice normal = anchor_[size() - 1]; + if (size() < anchor_.size() && back() <= normal) { + // anchor is behind cursor -> move anchor behind the inset + ++normal.pos(); + } + return normal; } -CursorSlice const & LCursor::selBegin() const +CursorSlice LCursor::selBegin() const { if (!selection()) return back(); @@ -336,29 +325,27 @@ CursorSlice const & LCursor::selBegin() const } -CursorSlice & LCursor::selBegin() +CursorSlice LCursor::selEnd() const { if (!selection()) return back(); - // can't use std::min as this returns a const ref - return anchor() < back() ? anchor() : back(); + return anchor() > back() ? anchor() : back(); } -CursorSlice const & LCursor::selEnd() const +DocIterator LCursor::selectionBegin() const { if (!selection()) - return back(); - return anchor() > back() ? anchor() : back(); + return *this; + return anchor() < back() ? anchor_ : *this; } -CursorSlice & LCursor::selEnd() +DocIterator LCursor::selectionEnd() const { if (!selection()) - return back(); - // can't use std::min as this returns a const ref - return anchor() > back() ? anchor() : back(); + return *this; + return anchor() > back() ? anchor_ : *this; } @@ -366,15 +353,15 @@ void LCursor::setSelection() { selection() = true; // a selection with no contents is not a selection +#warning doesnt look ok if (par() == anchor().par() && pos() == anchor().pos()) selection() = false; } -void LCursor::setSelection(DocumentIterator const & where, size_t n) +void LCursor::setSelection(DocIterator const & where, size_t n) { - selection() = true; - setCursor(where, false); + setCursor(where, true); anchor_ = where; pos() += n; } @@ -421,26 +408,6 @@ void LCursor::info(std::ostream & os) const } -namespace { - -void region(CursorSlice const & i1, CursorSlice const & i2, - LCursor::row_type & r1, LCursor::row_type & r2, - LCursor::col_type & c1, LCursor::col_type & c2) -{ - InsetBase & p = i1.inset(); - c1 = p.col(i1.idx_); - c2 = p.col(i2.idx_); - if (c1 > c2) - swap(c1, c2); - r1 = p.row(i1.idx_); - r2 = p.row(i2.idx_); - if (r1 > r2) - swap(r1, r2); -} - -} - - string LCursor::grabSelection() { if (!selection()) @@ -449,10 +416,10 @@ string LCursor::grabSelection() CursorSlice i1 = selBegin(); CursorSlice i2 = selEnd(); - if (i1.idx_ == i2.idx_) { + if (i1.idx() == i2.idx()) { if (i1.inset().asMathInset()) { MathArray::const_iterator it = i1.cell().begin(); - return asString(MathArray(it + i1.pos_, it + i2.pos_)); + return asString(MathArray(it + i1.pos(), it + i2.pos())); } else { return "unknown selection 1"; } @@ -485,10 +452,12 @@ void LCursor::eraseSelection() //lyxerr << "LCursor::eraseSelection" << endl; CursorSlice const & i1 = selBegin(); CursorSlice const & i2 = selEnd(); +#ifdef WITH_WARNINGS #warning FIXME +#endif if (i1.inset().asMathInset()) { - if (i1.idx_ == i2.idx_) { - i1.cell().erase(i1.pos_, i2.pos_); + if (i1.idx() == i2.idx()) { + i1.cell().erase(i1.pos(), i2.pos()); } else { MathInset * p = i1.asMathInset(); row_type r1, r2; @@ -517,13 +486,6 @@ string LCursor::grabAndEraseSelection() } -void LCursor::selClear() -{ - resetAnchor(); - clearSelection(); -} - - void LCursor::selCopy() { if (selection()) { @@ -564,8 +526,13 @@ void LCursor::selPaste(size_t n) void LCursor::selHandle(bool sel) { //lyxerr << "LCursor::selHandle" << endl; - if (sel == selection()) + if (sel == selection()) { +#warning Alfredo: This is too strong (Andre) + //if (!sel) + // noUpdate(); return; + } + resetAnchor(); selection() = sel; } @@ -583,9 +550,19 @@ void LCursor::selClearOrDel() std::ostream & operator<<(std::ostream & os, LCursor const & cur) { - for (size_t i = 0, n = cur.size(); i != n; ++i) - os << " " << cur.operator[](i) << " | " << cur.anchor_[i] << "\n"; - os << " selection: " << cur.selection_ << endl; + for (size_t i = 0, n = cur.size(); i != n; ++i) { + os << " " << cur.operator[](i) << " | "; + if (i < cur.anchor_.size()) + os << cur.anchor_[i]; + else + os << "-------------------------------"; + os << "\n"; + } + for (size_t i = cur.size(), n = cur.anchor_.size(); i < n; ++i) { + os << "------------------------------- | " << cur.anchor_[i] << "\n"; + } + os << " selection: " << cur.selection_ + << " x_target: " << cur.x_target_ << endl; return os; } @@ -604,7 +581,6 @@ std::ostream & operator<<(std::ostream & os, LCursor const & cur) #include "mathed/math_factory.h" #include "mathed/math_gridinset.h" #include "mathed/math_macroarg.h" -#include "mathed/math_macrotemplate.h" #include "mathed/math_mathmlstream.h" #include "mathed/math_scriptinset.h" #include "mathed/math_support.h" @@ -634,7 +610,7 @@ bool LCursor::openable(MathAtom const & t) const return true; // we can't move into anything new during selection - if (depth() == anchor_.size()) + if (depth() >= anchor_.size()) return false; if (!ptr_cmp(t.nucleus(), &anchor_[depth()].inset())) return false; @@ -643,8 +619,8 @@ bool LCursor::openable(MathAtom const & t) const } -bool positionable(DocumentIterator const & cursor, - DocumentIterator const & anchor) +bool positionable(DocIterator const & cursor, + DocIterator const & anchor) { // avoid deeper nested insets when selecting if (cursor.size() > anchor.size()) @@ -662,14 +638,8 @@ bool positionable(DocumentIterator const & cursor, void LCursor::setScreenPos(int x, int y) { - bool res = bruteFind(x, y, formula()->xlow(), formula()->xhigh(), - formula()->ylow(), formula()->yhigh()); - if (!res) { - // this can happen on creation of "math-display" - idx() = 0; - pos() = 0; - } - clearTargetX(); + x_target() = x; + bruteFind(x, y, 0, bv().workWidth(), 0, bv().workHeight()); } @@ -682,7 +652,7 @@ void LCursor::plainErase() void LCursor::markInsert() { - cell().insert(pos(), MathAtom(new MathCharInset(0))); + insert(char(0)); } @@ -701,24 +671,22 @@ void LCursor::plainInsert(MathAtom const & t) void LCursor::insert(string const & str) { - lyxerr << "LCursor::insert str '" << str << "'" << endl; - selClearOrDel(); -#if 0 + //lyxerr << "LCursor::insert str '" << str << "'" << endl; for (string::const_iterator it = str.begin(); it != str.end(); ++it) - plainInsert(MathAtom(new MathCharInset(*it))); -#else - MathArray ar; - asArray(str, ar); - insert(ar); -#endif + insert(*it); } void LCursor::insert(char c) { //lyxerr << "LCursor::insert char '" << c << "'" << endl; - selClearOrDel(); - plainInsert(MathAtom(new MathCharInset(c))); + BOOST_ASSERT(!empty()); + if (inMathed()) { + selClearOrDel(); + insert(new MathCharInset(c)); + } else { + text()->insertChar(*this, c); + } } @@ -728,6 +696,7 @@ void LCursor::insert(MathAtom const & t) macroModeClose(); selClearOrDel(); plainInsert(t); + lyxerr << "LCursor::insert MathAtom: cur:\n" << *this << endl; } @@ -804,6 +773,7 @@ bool LCursor::backspace() if (pos() != 0 && prevAtom()->nargs() > 0) { // let's require two backspaces for 'big stuff' and // highlight on the first + resetAnchor(); selection() = true; --pos(); } else { @@ -842,7 +812,9 @@ bool LCursor::erase() return true; } + // 'clever' UI hack: only erase large items if previously slected if (pos() != lastpos() && inset().nargs() > 0) { + resetAnchor(); selection() = true; ++pos(); } else { @@ -856,7 +828,7 @@ bool LCursor::erase() bool LCursor::up() { macroModeClose(); - DocumentIterator save = *this; + DocIterator save = *this; if (goUpDown(true)) return true; setCursor(save, false); @@ -868,7 +840,7 @@ bool LCursor::up() bool LCursor::down() { macroModeClose(); - DocumentIterator save = *this; + DocIterator save = *this; if (goUpDown(false)) return true; setCursor(save, false); @@ -898,7 +870,7 @@ void LCursor::macroModeClose() if (macro && macro->getInsetName() == name) lyxerr << "can't enter recursive macro" << endl; - niceInsert(createMathInset(name)); + niceInsert(createMathInset(name)); } @@ -930,29 +902,6 @@ int LCursor::targetX() const } -MathHullInset * LCursor::formula() const -{ - for (int i = size() - 1; i >= 1; --i) { - MathInset * inset = operator[](i).inset().asMathInset(); - if (inset && inset->asHullInset()) - return static_cast(inset); - } - return 0; -} - - -void LCursor::adjust(pos_type from, int diff) -{ - if (pos() > from) - pos() += diff; - if (anchor().pos_ > from) - anchor().pos_ += diff; - // just to be on the safe side - // theoretically unecessary - normalize(); -} - - bool LCursor::inMacroMode() const { if (!pos() != 0) @@ -968,31 +917,11 @@ MathUnknownInset * LCursor::activeMacro() } -bool LCursor::inMacroArgMode() const -{ - return pos() > 0 && prevAtom()->getChar() == '#'; -} - - -MathGridInset * LCursor::enclosingGrid(idx_type & idx) const -{ - for (MathInset::difference_type i = depth() - 1; i >= 0; --i) { - MathInset * m = operator[](i).inset().asMathInset(); - if (!m) - return 0; - MathGridInset * p = m->asGridInset(); - if (p) { - idx = operator[](i).idx_; - return p; - } - } - return 0; -} - - void LCursor::pullArg() { +#ifdef WITH_WARNINGS #warning Look here +#endif MathArray ar = cell(); if (popLeft() && inMathed()) { plainErase(); @@ -1006,10 +935,12 @@ void LCursor::pullArg() void LCursor::touch() { +#ifdef WITH_WARNINGS #warning look here +#endif #if 0 - DocumentIterator::const_iterator it = begin(); - DocumentIterator::const_iterator et = end(); + DocIterator::const_iterator it = begin(); + DocIterator::const_iterator et = end(); for ( ; it != et; ++it) it->cell().touch(); #endif @@ -1037,28 +968,13 @@ void LCursor::normalize() } -char LCursor::valign() -{ - idx_type idx; - MathGridInset * p = enclosingGrid(idx); - return p ? p->valign() : '\0'; -} - - -char LCursor::halign() -{ - idx_type idx; - MathGridInset * p = enclosingGrid(idx); - return p ? p->halign(idx % p->ncols()) : '\0'; -} - - bool LCursor::goUpDown(bool up) { // Be warned: The 'logic' implemented in this function is highly // fragile. A distance of one pixel or a '<' vs '<=' _really // matters. So fiddle around with it only if you think you know // what you are doing! + int xo = 0; int yo = 0; getPos(xo, yo); @@ -1125,13 +1041,9 @@ bool LCursor::goUpDown(bool up) // no such inset found, just take something "above" //lyxerr << "updown: handled by strange case" << endl; if (!popLeft()) { - return - bruteFind(xo, yo, - formula()->xlow(), - formula()->xhigh(), - up ? formula()->ylow() : yo + 4, - up ? yo - 4 : formula()->yhigh() - ); + int ylow = up ? 0 : yo + 1; + int yhigh = up ? yo - 1 : bv().workHeight(); + return bruteFind(xo, yo, 0, bv().workWidth(), ylow, yhigh); } // any improvement so far? @@ -1145,34 +1057,47 @@ bool LCursor::goUpDown(bool up) bool LCursor::bruteFind(int x, int y, int xlow, int xhigh, int ylow, int yhigh) { - DocumentIterator best_cursor; - double best_dist = 1e10; + BOOST_ASSERT(!empty()); + par_type beg, end; + CursorSlice bottom = operator[](0); + LyXText * text = bottom.text(); + BOOST_ASSERT(text); + getParsInRange(text->paragraphs(), ylow, yhigh, beg, end); - DocumentIterator it = insetBegin(bv().buffer()->inset()); - DocumentIterator et = insetEnd(); - while (1) { + DocIterator it = doc_iterator_begin(bv().buffer()->inset()); + DocIterator et = doc_iterator_end(bv().buffer()->inset()); + //lyxerr << "x: " << x << " y: " << y << endl; + //lyxerr << "xlow: " << xlow << " ylow: " << ylow << endl; + //lyxerr << "xhigh: " << xhigh << " yhigh: " << yhigh << endl; + + it.par() = beg; + //et.par() = text->parOffset(end); + + double best_dist = 10e10; + DocIterator best_cursor = it; + + for ( ; it != et; it.forwardPos()) { // avoid invalid nesting when selecting if (!selection() || positionable(it, anchor_)) { - int xo, yo; - CursorSlice & cur = it.back(); + int xo = 0, yo = 0; + LCursor cur = *this; + cur.setCursor(it, false); cur.inset().getCursorPos(cur, xo, yo); if (xlow <= xo && xo <= xhigh && ylow <= yo && yo <= yhigh) { double d = (x - xo) * (x - xo) + (y - yo) * (y - yo); - //lyxerr << "x: " << x << " y: " << y << " d: " << endl; + //lyxerr << "xo: " << xo << " yo: " << yo << " d: " << d << endl; // '<=' in order to take the last possible position // this is important for clicking behind \sum in e.g. '\sum_i a' if (d <= best_dist) { + //lyxerr << "*" << endl; best_dist = d; best_cursor = it; } } } - - if (it == et) - break; - it.forwardPos(); } + //lyxerr << "best_dist: " << best_dist << " cur:\n" << best_cursor << endl; if (best_dist < 1e10) setCursor(best_cursor, false); return best_dist < 1e10; @@ -1183,13 +1108,14 @@ void LCursor::bruteFind2(int x, int y) { double best_dist = 1e10; - DocumentIterator it = *this; + DocIterator it = *this; it.back().pos() = 0; - DocumentIterator et = *this; - et.back().pos() = et.back().asMathInset()->cell(et.back().idx_).size(); + DocIterator et = *this; + et.back().pos() = et.back().asMathInset()->cell(et.back().idx()).size(); for (int i = 0; ; ++i) { int xo, yo; - CursorSlice & cur = it.back(); + LCursor cur = *this; + cur.setCursor(it, false); cur.inset().getCursorPos(cur, xo, yo); double d = (x - xo) * (x - xo) + (y - yo) * (y - yo); // '<=' in order to take the last possible position @@ -1206,25 +1132,6 @@ void LCursor::bruteFind2(int x, int y) } -CursorSlice LCursor::normalAnchor() -{ - if (anchor_.size() < depth()) { - resetAnchor(); - lyxerr << "unusual Anchor size" << endl; - } - //lyx::BOOST_ASSERT(Anchor_.size() >= cursor.depth()); - // use Anchor on the same level as Cursor - CursorSlice normal = anchor_[size() - 1]; -#if 0 - if (depth() < anchor_.size() && !(normal < xx())) { - // anchor is behind cursor -> move anchor behind the inset - ++normal.pos_; - } -#endif - return normal; -} - - void LCursor::handleFont(string const & font) { lyxerr << "LCursor::handleFont: " << font << endl; @@ -1279,32 +1186,36 @@ string LCursor::selectionAsString(bool label) const if (inTexted()) { Buffer const & buffer = *bv().buffer(); + ParagraphList & pars = text()->paragraphs(); // should be const ... - ParagraphList::iterator startpit = text()->getPar(selBegin()); - ParagraphList::iterator endpit = text()->getPar(selEnd()); + par_type startpit = selBegin().par(); + par_type endpit = selEnd().par(); size_t const startpos = selBegin().pos(); size_t const endpos = selEnd().pos(); if (startpit == endpit) - return startpit->asString(buffer, startpos, endpos, label); + return pars[startpit].asString(buffer, startpos, endpos, label); // First paragraph in selection - string result = - startpit->asString(buffer, startpos, startpit->size(), label) + "\n\n"; + string result = pars[startpit]. + asString(buffer, startpos, pars[startpit].size(), label) + "\n\n"; // The paragraphs in between (if any) - ParagraphList::iterator pit = startpit; - for (++pit; pit != endpit; ++pit) - result += pit->asString(buffer, 0, pit->size(), label) + "\n\n"; + for (par_type pit = startpit + 1; pit != endpit; ++pit) { + Paragraph & par = pars[pit]; + result += par.asString(buffer, 0, par.size(), label) + "\n\n"; + } // Last paragraph in selection - result += endpit->asString(buffer, 0, endpos, label); + result += pars[endpit].asString(buffer, 0, endpos, label); return result; } +#ifdef WITH_WARNINGS #warning and mathed? +#endif return string(); } @@ -1324,27 +1235,6 @@ string LCursor::currentState() } -// only used by the spellchecker -void LCursor::replaceWord(string const & replacestring) -{ - LyXText * t = text(); - BOOST_ASSERT(t); - - t->replaceSelectionWithString(*this, replacestring); - t->setSelectionRange(*this, replacestring.length()); - - // Go back so that replacement string is also spellchecked - for (string::size_type i = 0; i < replacestring.length() + 1; ++i) - t->cursorLeft(*this); -} - - -void LCursor::update() -{ - bv().update(); -} - - string LCursor::getPossibleLabel() { return inMathed() ? "eq:" : text()->getPossibleLabel(*this); @@ -1365,9 +1255,8 @@ Encoding const * LCursor::getEncoding() const break; CursorSlice const & sl = operator[](s); LyXText & text = *sl.text(); - ParagraphList::iterator pit = text.getPar(sl.par()); - LyXFont font = pit->getFont( - bv().buffer()->params(), sl.pos(), outerFont(pit, text.paragraphs())); + LyXFont font = text.getPar(sl.par()).getFont( + bv().buffer()->params(), sl.pos(), outerFont(sl.par(), text.paragraphs())); return font.language()->encoding(); } @@ -1378,9 +1267,9 @@ void LCursor::undispatched() } -void LCursor::dispatched(dispatch_result_t res) +void LCursor::dispatched() { - disp_.val(res); + disp_.dispatched(true); } @@ -1388,9 +1277,3 @@ void LCursor::noUpdate() { disp_.update(false); } - - -void LCursor::noPop() -{ - nopop_ = true; -}