int xo;
int yo;
Inset const * inset = &it.inset();
- map<Inset const *, Geometry> const & data =
- c.bv().coordCache().getInsets().getData();
- map<Inset const *, Geometry>::const_iterator I = data.find(inset);
+ CoordCache const & cache = c.bv().coordCache();
// 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
// we don't do elaborate search and we just return the forwarded
// DocIterator at its beginning.
- if (I == data.end()) {
+ if (!cache.getInsets().has(inset)) {
it.top().pos() = 0;
return it;
}
- Point o = I->second.pos;
+ Point const o = cache.getInsets().xy(inset);
inset->cursorPos(c.bv(), it.top(), c.boundary(), xo, yo);
// Convert to absolute
xo += o.x_;
Cursor old = *this;
disp_ = DispatchResult();
- buffer()->undo().beginUndoGroup();
+ beginUndoGroup();
// Is this a function that acts on inset at point?
if (lyxaction.funcHasFlag(cmd.action(), LyXAction::AtPoint)
<< cmd0 << endl << *this);
nextInset()->dispatch(*this, tmpcmd);
if (disp_.dispatched()) {
- buffer()->undo().endUndoGroup();
+ endUndoGroup();
return;
}
}
// are possible which would change it
beforeDispatchCursor_ = safe.beforeDispatchCursor_;
}
- buffer()->undo().endUndoGroup();
+ endUndoGroup();
// notify insets we just left
if (*this != old) {
bool badcursor = notifyCursorLeavesOrEnters(old, *this);
if (badcursor) {
fixIfBroken();
- bv().fixInlineCompletionPos();
+ bv().resetInlineCompletionPos();
}
old.endUndoGroup();
}
}
-void Cursor::markEditPosition()
+void Cursor::markNewWordPosition()
{
- if (inTexted() && new_word_.empty()) {
- FontSpan ow = locateWord(WHOLE_WORD);
- if (ow.size() == 1) {
+ if (lyxrc.spellcheck_continuously && inTexted() && new_word_.empty()) {
+ FontSpan nw = locateWord(WHOLE_WORD);
+ if (nw.size() == 1) {
LYXERR(Debug::DEBUG, "start new word: "
<< " par: " << pit()
- << " pos: " << ow.first);
+ << " pos: " << nw.first);
new_word_ = *this;
}
}
void Cursor::checkNewWordPosition()
{
- if (new_word_.empty())
+ if (!lyxrc.spellcheck_continuously || new_word_.empty())
return ;
if (!inTexted())
clearNewWordPosition();
else {
- if (paragraph().id() != new_word_.paragraph().id())
+ // forget the position of the current new word if
+ // 1) the paragraph changes or
+ // 2) the count of nested insets changes or
+ // 3) the cursor pos is out of paragraph bound
+ if (pit() != new_word_.pit() ||
+ depth() != new_word_.depth() ||
+ new_word_.pos() > new_word_.lastpos()) {
+ clearNewWordPosition();
+ } else if (new_word_.fixIfBroken())
+ // 4) or the remembered position was "broken"
clearNewWordPosition();
else {
- FontSpan ow = new_word_.locateWord(WHOLE_WORD);
FontSpan nw = locateWord(WHOLE_WORD);
- if (nw.intersect(ow).empty())
+ if (nw.size()) {
+ FontSpan ow = new_word_.locateWord(WHOLE_WORD);
+ if (nw.intersect(ow).empty())
+ clearNewWordPosition();
+ else
+ LYXERR(Debug::DEBUG, "new word: "
+ << " par: " << pit()
+ << " pos: " << nw.first << ".." << nw.last);
+ } else {
clearNewWordPosition();
- else
- LYXERR(Debug::DEBUG, "new word: "
- << " par: " << pit()
- << " pos: " << nw.first << ".." << nw.last);
+ }
}
}
}
docstring const name = s.substr(1);
InsetMathNest * const in = inset().asInsetMath()->asNestInset();
- if (in && in->interpretString(*this, s))
+ if (in && in->interpretString(*this, s)) {
+ // end undo group that was opened before in was created
+ endUndoGroup();
return true;
+ }
MathAtom atom = buffer()->getMacro(name, *this, false) ?
MathAtom(new MathMacro(buffer(), name)) : createInsetMath(name, buffer());
else
insert(selection);
}
-
+
+ // end undo group that was opened before in was created
+ endUndoGroup();
return true;
}
updateNeeded |= bv().checkDepm(dummy, *this);
updateTextTargetOffset();
- if (updateNeeded)
+ if (updateNeeded) {
forceBufferUpdate();
+ // DEPM may have requested a screen update
+ this->screenUpdateFlags(
+ this->screenUpdate() | dummy.screenUpdate());
+ }
}
return false;
}
++dummy.pos();
if (bv().checkDepm(dummy, old)) {
updateNeeded = true;
- // Make sure that cur gets back whatever happened to dummy (Lgb)
+ // Make sure that cur gets back whatever happened to dummy (Lgb)
+ // This will include any screen update requested by DEPM
operator=(dummy);
}
} else {
bool const broken_anchor = anchor_.fixIfBroken();
if (broken_cursor || broken_anchor) {
+ clearNewWordPosition();
clearSelection();
return true;
}
void Cursor::endUndoGroup() const
{
- buffer()->undo().endUndoGroup();
+ buffer()->undo().endUndoGroup(*this);
}