DocIterator dit = d->cursor_.selectionBegin();
// The selected content might have been changed (see #7685)
- while (dit.inMathed())
- // Find enclosing text cursor
- dit.pop_back();
+ dit = dit.getInnerText();
return dit.paragraph().lookupChange(dit.pos());
}
case LFUN_CHANGE_PREVIOUS:
case LFUN_ALL_CHANGES_ACCEPT:
case LFUN_ALL_CHANGES_REJECT:
- // TODO: context-sensitive enabling of LFUNs
- // In principle, these command should only be enabled if there
- // is a change in the document. However, without proper
- // optimizations, this will inevitably result in poor performance.
- flag.setEnabled(true);
+ flag.setEnabled(buffer_.areChangesPresent());
break;
case LFUN_SCREEN_UP:
}
- case LFUN_INSET_SELECT_ALL:
- if (cur.depth() > 1
+ case LFUN_INSET_SELECT_ALL: {
+ // true if all cells are selected
+ bool const all_selected = cur.depth() > 1
&& cur.selBegin().at_begin()
- && cur.selEnd().at_end()) {
- // All the contents of the inset if selected.
+ && cur.selEnd().at_end();
+ // true if some cells are selected
+ bool const cells_selected = cur.depth() > 1
+ && cur.selBegin().at_cell_begin()
+ && cur.selEnd().at_cell_end();
+ if (all_selected || (cells_selected && !cur.inset().isTable())) {
+ // All the contents of the inset if selected, or only at
+ // least one cell but inset is not a table.
// Select the inset from outside.
cur.pop();
cur.resetAnchor();
cur.setSelection(true);
cur.posForward();
- } else if (cur.selBegin().idx() != cur.selEnd().idx()
- || (cur.depth() > 1
- && cur.selBegin().at_cell_begin()
- && cur.selEnd().at_cell_end())) {
- // At least one complete cell is selected.
+ } else if (cells_selected) {
+ // At least one complete cell is selected and inset is a table.
// Select all cells
cur.idx() = 0;
cur.pos() = 0;
cur.setCurrentFont();
dr.screenUpdate(Update::Force);
break;
+ }
// This would be in Buffer class if only Cursor did not
if (!cur.nextInset() || cur.nextInset() == ins)
cur.forwardInset();
}
- cur.endUndoGroup();
cur = savecur;
cur.fixIfBroken();
+ /** This is a dummy undo record only to remember the cursor
+ * that has just been set; this will be used on a redo action
+ * (see ticket #10097)
+
+ * FIXME: a better fix would be to have a way to set the
+ * cursor value directly, but I am not sure it is worth it.
+ */
+ cur.recordUndo();
+ cur.endUndoGroup();
dr.screenUpdate(Update::Force);
dr.forceBufferUpdate();