newfi.setSeries(INHERIT_SERIES);
FontShape newshp = newfi.shape();
- if (newshp != INHERIT_SHAPE && newshp != IGNORE_SHAPE &&
+ if (newshp != INHERIT_SHAPE && newshp != IGNORE_SHAPE &&
newshp == oldfi.shape())
newfi.setShape(INHERIT_SHAPE);
}
-void Text::setParagraphs(Cursor & cur, docstring arg, bool merge)
+void Text::setParagraphs(Cursor & cur, docstring arg, bool merge)
{
LBUFERR(cur.text());
}
-void Text::setParagraphs(Cursor & cur, ParagraphParameters const & p)
+void Text::setParagraphs(Cursor & cur, ParagraphParameters const & p)
{
LBUFERR(cur.text());
LBUFERR(this == cur.text());
LBUFERR(inset);
cur.paragraph().insertInset(cur.pos(), inset, cur.current_font,
- Change(cur.buffer()->params().trackChanges
+ Change(cur.buffer()->params().track_changes
? Change::INSERTED : Change::UNCHANGED));
}
bool const update_needed = !tm.contains(par);
Cursor old = cur;
setCursorIntern(cur, par, pos, setfont, boundary);
- // FIXME There is a chance that we'll miss a screen update here.
- // If so, then do DEPM and then check if cur wants an update and
- // go ahead and do it, if so.
return cur.bv().checkDepm(cur, old) || update_needed;
}
bool Text::checkAndActivateInset(Cursor & cur, bool front)
{
- if (cur.selection())
- return false;
if (front && cur.pos() == cur.lastpos())
return false;
if (!front && cur.pos() == 0)
Inset * inset = front ? cur.nextInset() : cur.prevInset();
if (!inset || !inset->editable())
return false;
+ if (cur.selection() && cur.realAnchor().find(inset) == -1)
+ return false;
/*
* Apparently, when entering an inset we are expected to be positioned
* *before* it in the containing paragraph, regardless of the direction
bool Text::checkAndActivateInsetVisual(Cursor & cur, bool movingForward, bool movingLeft)
{
- if (cur.selection())
- return false;
if (cur.pos() == -1)
return false;
if (cur.pos() == cur.lastpos())
Inset * inset = par.isInset(cur.pos()) ? par.getInset(cur.pos()) : 0;
if (!inset || !inset->editable())
return false;
+ if (cur.selection() && cur.realAnchor().find(inset) == -1)
+ return false;
inset->edit(cur, movingForward,
movingLeft ? Inset::ENTRY_DIRECTION_RIGHT : Inset::ENTRY_DIRECTION_LEFT);
return true;
cur.textRow().pos() == cur.pos() &&
!cur.paragraph().isLineSeparator(cur.pos() - 1) &&
!cur.paragraph().isNewline(cur.pos() - 1) &&
+ !cur.paragraph().isEnvSeparator(cur.pos() - 1) &&
!cur.paragraph().isSeparator(cur.pos() - 1)) {
return setCursor(cur, cur.pit(), cur.pos(), true, true);
}
}
// move to the previous paragraph or do nothing
- if (cur.pit() > 0)
- return setCursor(cur, cur.pit() - 1, getPar(cur.pit() - 1).size(), true, false);
+ if (cur.pit() > 0) {
+ Paragraph & par = getPar(cur.pit() - 1);
+ pos_type lastpos = par.size();
+ if (lastpos > 0 && par.isEnvSeparator(lastpos - 1))
+ return setCursor(cur, cur.pit() - 1, lastpos - 1, true, false);
+ else
+ return setCursor(cur, cur.pit() - 1, lastpos, true, false);
+ }
return false;
}
bool sep2 = cur.paragraph().isSeparator(cur.pos()+1);
}
#endif
- if (cur.textRow().endpos() == cur.pos() + 1 &&
- cur.textRow().endpos() != cur.lastpos() &&
- !cur.paragraph().isNewline(cur.pos()) &&
- !cur.paragraph().isLineSeparator(cur.pos()) &&
- !cur.paragraph().isSeparator(cur.pos())) {
- return setCursor(cur, cur.pit(), cur.pos() + 1, true, true);
+ if (cur.textRow().endpos() == cur.pos() + 1) {
+ if (cur.paragraph().isEnvSeparator(cur.pos()) &&
+ cur.pos() + 1 == cur.lastpos() &&
+ cur.pit() != cur.lastpit()) {
+ // move to next paragraph
+ return setCursor(cur, cur.pit() + 1, 0, true, false);
+ } else if (cur.textRow().endpos() != cur.lastpos() &&
+ !cur.paragraph().isNewline(cur.pos()) &&
+ !cur.paragraph().isEnvSeparator(cur.pos()) &&
+ !cur.paragraph().isLineSeparator(cur.pos()) &&
+ !cur.paragraph().isSeparator(cur.pos())) {
+ return setCursor(cur, cur.pit(), cur.pos() + 1, true, true);
+ }
}
// in front of RTL boundary? Stay on this side of the boundary because:
{
bool updated = false;
if (cur.pit() != cur.lastpit())
- updated = setCursor(cur, cur.pit() + 1, 0);
+ if (lyxrc.mac_like_cursor_movement)
+ if (cur.pos() == cur.lastpos())
+ updated = setCursor(cur, cur.pit() + 1, getPar(cur.pit() + 1).size());
+ else
+ updated = setCursor(cur, cur.pit(), cur.lastpos());
+ else
+ updated = setCursor(cur, cur.pit() + 1, 0);
else
updated = setCursor(cur, cur.pit(), cur.lastpos());
return updated;
&& oldpar.isLineSeparator(old.pos() - 1)
&& !oldpar.isDeleted(old.pos() - 1)
&& !oldpar.isDeleted(old.pos())) {
- oldpar.eraseChar(old.pos() - 1, cur.buffer()->params().trackChanges);
+ oldpar.eraseChar(old.pos() - 1, cur.buffer()->params().track_changes);
// FIXME: This will not work anymore when we have multiple views of the same buffer
// In this case, we will have to correct also the cursors held by
// other bufferviews. It will probably be easier to do that in a more
return true;
}
- if (oldpar.stripLeadingSpaces(cur.buffer()->params().trackChanges)) {
+ if (oldpar.stripLeadingSpaces(cur.buffer()->params().track_changes)) {
need_anchor_change = true;
// We return true here because the Paragraph contents changed and
// we need a redraw before further action is processed.