need_break_row = 0;
return true;
}
- return false;
+ return true;
}
{
if (!cursor.par()->insetAllowed(inset->lyxCode()))
return;
- // I don't know if this is necessary here (Jug 20020102)
- setUndo(bview, Undo::INSERT, cursor.par(), cursor.par()->next());
+ setUndo(bview, Undo::FINISH, cursor.par(), cursor.par()->next());
+ freezeUndo();
cursor.par()->insertInset(cursor.pos(), inset);
// Just to rebreak and refresh correctly.
// The character will not be inserted a second time
insertChar(bview, Paragraph::META_INSET);
-#if 1
// If we enter a highly editable inset the cursor should be to before
// the inset. This couldn't happen before as Undo was not handled inside
// inset now after the Undo LyX tries to call inset->Edit(...) again
if (isHighlyEditableInset(inset)) {
cursorLeft(bview, true);
}
-#endif
+ unFreezeUndo();
}
cur.pos(pos);
cur.boundary(boundary);
-#if 0
- if (pos && par->getChar(pos) == Paragraph::META_INSET &&
- par->getInset(pos)) {
- Inset * ins = par->getInset(pos);
- if (ins->needFullRow() || ins->display()) {
- --pos;
- boundary = true;
- }
- }
-#endif
-
// get the cursor y position in text
int y = 0;
Row * row = getRow(par, pos, y);
+ Row * old_row = row;
+ // if we are before the first char of this row and are still in the
+ // same paragraph and there is a previous row then put the cursor on
+ // the end of the previous row
+ cur.iy(y + row->baseline());
+ Inset * ins;
+ if (row->previous() && pos &&
+ par->getChar(pos) == Paragraph::META_INSET &&
+ (ins=par->getInset(pos)) && (ins->needFullRow() || ins->display()))
+ {
+ row = row->previous();
+ y -= row->height();
+ }
+
+ cur.row(row);
// y is now the beginning of the cursor row
y += row->baseline();
// y is now the cursor baseline
prepareToPrint(bview, row, x, fill_separator, fill_hfill,
fill_label_hfill);
pos_type cursor_vpos = 0;
- pos_type last = rowLastPrintable(row);
+ pos_type last = rowLastPrintable(old_row);
if (pos > last + 1) {
// This shouldn't happen.
cur.x(int(x));
cur.x_fix(cur.x());
- cur.row(row);
}
cur.pos(row->pos() + column);
cur.x(x);
cur.y(y + row->baseline());
+ Inset * ins;
+ if (row->next() && cur.pos() &&
+ cur.par()->getChar(cur.pos()) == Paragraph::META_INSET &&
+ (ins=cur.par()->getInset(cur.pos())) &&
+ (ins->needFullRow() || ins->display()))
+ {
+ cur.iy(y + row->height() + row->next()->baseline());
+ } else {
+ cur.iy(cur.y());
+ }
cur.row(row);
cur.boundary(bound);
}