bool selection() const { return selection_; }
/// selection active?
bool & selection() { return selection_; }
+ /// do we have a multicell selection?
+ bool selIsMultiCell() const
+ { return selection_ && selBegin().idx() != selEnd().idx(); }
+ /// do we have a multiline selection?
+ bool selIsMultiLine() const
+ { return selection_ && selBegin().pit() != selEnd().pit(); }
/// did we place the anchor?
bool mark() const { return mark_; }
/// did we place the anchor?
DocIterator selectionBegin() const;
/// access start of selection
DocIterator selectionEnd() const;
- /// FIXME: document this
+ /**
+ * Update the selection status and save permanent
+ * selection if needed.
+ * @param selecting the new selection status
+ * @return whether the selection status has changed
+ */
bool selHandle(bool selecting);
///
docstring selectionAsString(bool label) const;
///
- docstring currentState();
+ docstring currentState() const;
/// auto-correct mode
bool autocorrect() const { return autocorrect_; }
bool posBackward();
/// move one step forward
bool posForward();
+ /// move visually one step to the right
+ /**
+ * @note: This method may move into an inset unless skip_inset == true.
+ * @note: This method may move into a new paragraph.
+ * @note: This method may move out of the current slice.
+ * @return: true if moved, false if not moved
+ */
+ bool posVisRight(bool skip_inset = false);
+ /// move visually one step to the left
+ /**
+ * @note: This method may move into an inset unless skip_inset == true.
+ * @note: This method may move into a new paragraph.
+ * @note: This method may move out of the current slice.
+ * @return: true if moved, false if not moved
+ */
+ bool posVisLeft(bool skip_inset = false);
/// move visually to next/previous row
/**
* Assuming we were to keep moving left (right) from the current cursor
bool textRedo();
/// makes sure the next operation will be stored
- void finishUndo();
+ void finishUndo() const;
+
+ /// open a new group of undo operations. Groups can be nested.
+ void beginUndoGroup() const;
+
+ /// end the current undo group
+ void endUndoGroup() const;
/// The general case: prepare undo for an arbitrary range.
- void recordUndo(UndoKind kind, pit_type from, pit_type to);
+ void recordUndo(UndoKind kind, pit_type from, pit_type to) const;
/// Convenience: prepare undo for the range between 'from' and cursor.
- void recordUndo(UndoKind kind, pit_type from);
+ void recordUndo(UndoKind kind, pit_type from) const;
/// Convenience: prepare undo for the single paragraph or cell
/// containing the cursor
- void recordUndo(UndoKind kind = ATOMIC_UNDO);
+ void recordUndo(UndoKind kind = ATOMIC_UNDO) const;
/// Convenience: prepare undo for the inset containing the cursor
- void recordUndoInset(UndoKind kind = ATOMIC_UNDO);
+ void recordUndoInset(UndoKind kind = ATOMIC_UNDO) const;
/// Convenience: prepare undo for the whole buffer
- void recordUndoFullDocument();
+ void recordUndoFullDocument() const;
/// Convenience: prepare undo for the selected paragraphs or cells
- void recordUndoSelection();
+ void recordUndoSelection() const;
///
void checkBufferStructure();
/// display an error message
void errorMessage(docstring const & msg) const;
///
- docstring getPossibleLabel();
+ docstring getPossibleLabel() const;
/// the name of the macro we are currently inputting
docstring macroName();