#include <iosfwd>
#include <vector>
-class UpdatableInset;
-class DispatchResult;
+
+namespace lyx {
+
+class Buffer;
+class BufferView;
class FuncStatus;
class FuncRequest;
-class InsetTabular;
+class LyXFont;
+class Row;
// these should go
-class MathHullInset;
-class MathUnknownInset;
-class MathGridInset;
+class InsetMathUnknown;
+class Encoding;
/// The cursor class describes the position of a cursor within a document.
// The public inheritance should go in favour of a suitable data member
// (or maybe private inheritance) at some point of time.
-class LCursor : public DocumentIterator {
+class LCursor : public DocIterator {
public:
-
/// create the cursor of a BufferView
explicit LCursor(BufferView & bv);
- /// dispatch from innermost inset upwards
- DispatchResult dispatch(FuncRequest const & cmd);
- /// are we willing to handle this event?
- bool getStatus(FuncRequest const & cmd, FuncStatus & flag);
+ /// dispatch from innermost inset upwards
+ void dispatch(FuncRequest const & cmd);
+ /// get the resut of the last dispatch
+ DispatchResult result() const;
/// add a new cursor slice
- void push(InsetBase * inset);
+ void push(InsetBase & inset);
/// add a new cursor slice, place cursor on left end
- void pushLeft(InsetBase * inset);
+ void pushLeft(InsetBase & inset);
/// pop one level off the cursor
void pop();
/// pop one slice off the cursor stack and go left
bool popLeft();
/// pop one slice off the cursor stack and go right
bool popRight();
+ /// make sure we are outside of given inset
+ void leaveInset(InsetBase const & inset);
/// sets cursor part
- void setCursor(DocumentIterator const & it, bool sel);
+ void setCursor(DocIterator const & it);
//
// selection
///
void setSelection();
/// set selection at given position
- void setSelection(DocumentIterator const & where, size_t n);
+ void setSelection(DocIterator const & where, int n);
///
void clearSelection();
/// access start of selection
- CursorSlice & selBegin();
- /// access start of selection
- CursorSlice const & selBegin() const;
+ CursorSlice selBegin() const;
/// access end of selection
- CursorSlice & selEnd();
- /// access end of selection
- CursorSlice const & selEnd() const;
- ///
- std::string grabSelection();
- ///
- void eraseSelection();
- ///
- std::string grabAndEraseSelection();
- // other selection methods
- ///
- void selCopy();
- ///
- void selCut();
- ///
- void selDel();
- /// pastes n-th element of cut buffer
- void selPaste(size_t n);
+ CursorSlice selEnd() const;
+ /// access start of selection
+ DocIterator selectionBegin() const;
+ /// access start of selection
+ DocIterator selectionEnd() const;
///
- void selHandle(bool selecting);
- /// start selection
- void selStart();
- /// clear selection
- void selClear();
- /// clears or deletes selection depending on lyxrc setting
- void selClearOrDel();
+ bool selHandle(bool selecting);
//
- std::string selectionAsString(bool label) const;
- ///
- void paste(std::string const & data);
+ docstring selectionAsString(bool label) const;
///
std::string currentState();
bool & macromode() { return macromode_; }
/// returns x,y position
void getPos(int & x, int & y) const;
- /// returns cursor dimension
- void getDim(int & asc, int & desc) const;
+ /// the row in the paragraph we're in
+ Row & textRow();
+ /// the row in the paragraph we're in
+ Row const & textRow() const;
//
// common part
/// insert an inset
void insert(InsetBase *);
/// insert a single char
- void insert(char c);
+ void insert(char_type c);
/// insert a string
- void insert(std::string const & str);
+ void insert(docstring const & str);
+ /// in pixels from left of screen
+ int targetX() const;
/// write acess to target x position of cursor
int & x_target();
/// return target x position of cursor
int x_target() const;
+ /// set targetX in current position
+ void setTargetX();
/// clear target x position of cursor
void clearTargetX();
- /// access to selection anchor
- CursorSlice & anchor();
- /// access to selection anchor
- CursorSlice const & anchor() const;
- /// cache the absolute coordinate from the top inset
- void updatePos();
+ /// access to normalized selection anchor
+ CursorSlice anchor() const;
/// sets anchor to cursor position
- void resetAnchor();
+ void resetAnchor();
/// access to owning BufferView
- BufferView & bv() const;
+ BufferView & bv() const;
+ /// access to owning Buffer
+ Buffer & buffer() const;
/// get some interesting description of top position
- void info(std::ostream & os) const;
+ void info(odocstream & os) const;
/// are we in math mode (2), text mode (1) or unsure (0)?
int currentMode();
- /// reset cursor
- void reset();
+ /// reset cursor bottom to the beginning of the given inset
+ // (sort of 'chroot' environment...)
+ void reset(InsetBase &);
/// for spellchecking
void replaceWord(std::string const & replacestring);
- /// update our view
- void update();
- /// set dispatch result
- void dispatched(dispatch_result_t res);
- /// assume event was not (yet) dispatched
+ /**
+ * the event was not (yet) dispatched.
+ *
+ * Should only be called by an inset's doDispatch() method. It means:
+ * I, the doDispatch() method of InsetFoo, hereby declare that I am
+ * not able to handle that request and trust my parent will do the
+ * Right Thing (even if my getStatus partner said that I can do it).
+ * It is sort of a kludge that should be used only rarely...
+ */
void undispatched();
- /// don't call update() when done
+ /// the event was already dispatched
+ void dispatched();
+ /// Set which update should be done
+ void updateFlags(Update::flags f);
+ /**
+ * don't call update() when done
+ *
+ * Should only be called by an inset's doDispatch() method. It means:
+ * I handled that request and I can reassure you that the screen does
+ * not need to be re-drawn and all entries in the coord cache stay
+ * valid (and there are no other things to put in the coord cache).
+ * This is a fairly rare event as well and only some optimization.
+ * Not using noUpdate() should never be wrong.
+ */
void noUpdate();
- /// don't pop cursor to the level where the LFUN was handled
- void noPop();
+ /// fix cursor in circumstances that should never happen
+ void fixIfBroken();
/// output
friend std::ostream & operator<<(std::ostream & os, LCursor const & cur);
+
public:
+ ///
+ BufferView * bv_;
//private:
/// the anchor position
- DocumentIterator anchor_;
-
- ///
+ DocIterator anchor_;
+
+ ///
DispatchResult disp_;
+
private:
- ///
- int cached_y_;
/**
* The target x position of the cursor. This is used for when
* we have text like :
* shorter than x()
*/
int x_target_;
- // do we have a selection?
+ /// do we have a selection?
bool selection_;
- // are we on the way to get one?
+ /// are we on the way to get one?
bool mark_;
- ///
- bool nopop_;
+ /// If true, we are behind the previous char, otherwise we are in front
+ // of the next char. This only make a difference when we are in front
+ // of a big inset spanning a whole row and computing coordinates for
+ // displaying the cursor.
+ bool logicalpos_;
+
+private:
//
// math specific stuff that could be promoted to "global" later
///
void niceInsert(MathAtom const & at);
///
- void niceInsert(std::string const & str);
+ void niceInsert(docstring const & str);
/// in pixels from top of screen
void setScreenPos(int x, int y);
- /// in pixels from left of screen
- int targetX() const;
- /// return the next enclosing grid inset and the cursor's index in it
- MathGridInset * enclosingGrid(idx_type & idx) const;
- /// adjust anchor position after deletions/insertions
- void adjust(pos_type from, int diff);
- ///
- MathHullInset * formula() const;
/// current offset in the top cell
- /// interpret name a name of a macro
- void macroModeClose();
+
+ /// interpret name a name of a macro. Returns true if
+ /// something got inserted.
+ bool macroModeClose();
/// are we currently typing the name of a macro?
bool inMacroMode() const;
/// get access to the macro we are currently typing
- MathUnknownInset * activeMacro();
- /// are we currently typing '#1' or '#2' or...?
- bool inMacroArgMode() const;
+ InsetMathUnknown * activeMacro();
/// replace selected stuff with at, placing the former
// selection in given cell of atom
void handleNest(MathAtom const & at, int cell = 0);
- /// remove this as soon as LyXFunc::getStatus is "localized"
- //inline std::string getLastCode() { return "mathnormal"; }
///
bool isInside(InsetBase const *);
- ///
- char valign();
- ///
- char halign();
/// make sure cursor position is valid
void normalize();
/// mark current cursor trace for redraw
void touch();
- /// returns the normalized anchor of the selection
- CursorSlice normalAnchor();
-
/// hack for reveal codes
void markInsert();
void markErase();
void handleFont(std::string const & font);
/// display a message
- void message(std::string const & msg) const;
+ void message(docstring const & msg) const;
/// display an error message
- void errorMessage(std::string const & msg) const;
+ void errorMessage(docstring const & msg) const;
///
- std::string getPossibleLabel();
+ docstring getPossibleLabel();
/// moves position somehow up or down
bool goUpDown(bool up);
- /// moves position closest to (x, y) in given box
- bool bruteFind(int x, int y, int xlow, int xhigh, int ylow, int yhigh);
- /// moves position closest to (x, y) in current cell
- void bruteFind2(int x, int y);
/// the name of the macro we are currently inputting
- std::string macroName();
+ docstring macroName();
/// where in the curent cell does the macro name start?
int macroNamePos();
/// can we enter the inset?
bool openable(MathAtom const &) const;
+ ///
+ Encoding const * getEncoding() const;
+ /// font at cursor position
+ LyXFont getFont() const;
};
+
+
+} // namespace lyx
+
#endif // LYXCURSOR_H