2003-09-17 16:44:51 +00:00
|
|
|
|
// -*- C++ -*-
|
|
|
|
|
/**
|
|
|
|
|
* \file cursor.h
|
|
|
|
|
* This file is part of LyX, the document processor.
|
|
|
|
|
* Licence details can be found in the file COPYING.
|
|
|
|
|
*
|
|
|
|
|
* \author Andr<EFBFBD> P<EFBFBD>nitz
|
|
|
|
|
*
|
|
|
|
|
* Full author contact details are available in file CREDITS.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#ifndef CURSOR_H
|
|
|
|
|
#define CURSOR_H
|
|
|
|
|
|
2003-12-15 11:36:19 +00:00
|
|
|
|
#include "cursor_slice.h"
|
2003-09-17 16:44:51 +00:00
|
|
|
|
|
2003-11-10 09:40:14 +00:00
|
|
|
|
#include <iosfwd>
|
2003-09-17 16:44:51 +00:00
|
|
|
|
#include <vector>
|
|
|
|
|
|
2003-09-18 11:21:53 +00:00
|
|
|
|
class BufferView;
|
2003-11-10 09:06:48 +00:00
|
|
|
|
class UpdatableInset;
|
2004-01-16 13:35:10 +00:00
|
|
|
|
class MathAtom;
|
2003-09-18 11:21:53 +00:00
|
|
|
|
class DispatchResult;
|
|
|
|
|
class FuncRequest;
|
2003-11-10 09:06:48 +00:00
|
|
|
|
class InsetTabular;
|
2004-01-20 14:25:24 +00:00
|
|
|
|
class LyXText;
|
|
|
|
|
class Paragraph;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// this is used for traversing math insets
|
|
|
|
|
typedef std::vector<CursorSlice> CursorBase;
|
|
|
|
|
/// move on one step
|
|
|
|
|
void increment(CursorBase &);
|
|
|
|
|
///
|
|
|
|
|
CursorBase ibegin(InsetBase * p);
|
|
|
|
|
///
|
|
|
|
|
CursorBase iend(InsetBase * p);
|
2003-09-17 16:44:51 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* The cursor class describes the position of a cursor within a document.
|
|
|
|
|
*/
|
|
|
|
|
|
2003-11-04 12:36:59 +00:00
|
|
|
|
class LCursor {
|
2003-09-17 16:44:51 +00:00
|
|
|
|
public:
|
2004-01-13 12:28:35 +00:00
|
|
|
|
/// type for cell number in inset
|
|
|
|
|
typedef CursorSlice::idx_type idx_type;
|
|
|
|
|
/// type for paragraph numbers positions within a cell
|
|
|
|
|
typedef CursorSlice::par_type par_type;
|
|
|
|
|
/// type for cursor positions within a cell
|
|
|
|
|
typedef CursorSlice::pos_type pos_type;
|
2004-01-16 12:36:23 +00:00
|
|
|
|
/// type for row indices
|
|
|
|
|
typedef CursorSlice::row_type row_type;
|
|
|
|
|
/// type for col indices
|
|
|
|
|
typedef CursorSlice::col_type col_type;
|
2004-01-13 12:28:35 +00:00
|
|
|
|
|
2004-01-16 12:36:23 +00:00
|
|
|
|
/// create the cursor of a BufferView
|
2004-01-16 10:55:19 +00:00
|
|
|
|
explicit LCursor(BufferView & bv);
|
2003-11-06 10:30:43 +00:00
|
|
|
|
/// dispatch from innermost inset upwards
|
2003-09-18 11:21:53 +00:00
|
|
|
|
DispatchResult dispatch(FuncRequest const & cmd);
|
2003-11-04 12:36:59 +00:00
|
|
|
|
///
|
2004-01-15 17:34:44 +00:00
|
|
|
|
void push(InsetBase * inset);
|
2003-11-10 09:06:48 +00:00
|
|
|
|
/// restrict cursor nesting to given size
|
|
|
|
|
void pop(int depth);
|
|
|
|
|
/// pop one level off the cursor
|
2003-11-04 12:36:59 +00:00
|
|
|
|
void pop();
|
2004-01-20 14:25:24 +00:00
|
|
|
|
/// access to current cursor slice
|
|
|
|
|
CursorSlice & current();
|
|
|
|
|
/// access to current cursor slice
|
|
|
|
|
CursorSlice const & current() const;
|
2004-01-16 12:36:23 +00:00
|
|
|
|
/// how many nested insets do we have?
|
|
|
|
|
size_t depth() const { return cursor_.size(); }
|
|
|
|
|
|
2004-01-20 14:25:24 +00:00
|
|
|
|
//
|
|
|
|
|
// selection
|
|
|
|
|
//
|
|
|
|
|
/// selection active?
|
|
|
|
|
bool selection() const { return selection_; }
|
|
|
|
|
/// selection active?
|
|
|
|
|
bool & selection() { return selection_; }
|
|
|
|
|
/// did we place the anchor?
|
|
|
|
|
bool mark() const { return mark_; }
|
|
|
|
|
/// did we place the anchor?
|
|
|
|
|
bool & mark() { return mark_; }
|
|
|
|
|
///
|
|
|
|
|
void setSelection();
|
|
|
|
|
///
|
|
|
|
|
void clearSelection();
|
|
|
|
|
///
|
|
|
|
|
CursorSlice & selStart();
|
|
|
|
|
///
|
|
|
|
|
CursorSlice const & selStart() const;
|
|
|
|
|
///
|
|
|
|
|
CursorSlice & selEnd();
|
|
|
|
|
///
|
|
|
|
|
CursorSlice const & selEnd() const;
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// access to the 'current' cursor slice
|
|
|
|
|
//
|
2004-01-16 12:36:23 +00:00
|
|
|
|
/// the current inset
|
2004-01-20 14:25:24 +00:00
|
|
|
|
InsetBase * inset() const { return current().inset(); }
|
2004-01-16 12:36:23 +00:00
|
|
|
|
/// return the text-ed cell this cursor is in
|
2004-01-20 14:25:24 +00:00
|
|
|
|
idx_type idx() const { return current().idx(); }
|
2004-01-16 12:36:23 +00:00
|
|
|
|
/// return the text-ed cell this cursor is in
|
2004-01-20 14:25:24 +00:00
|
|
|
|
idx_type & idx() { return current().idx(); }
|
2004-01-16 12:36:23 +00:00
|
|
|
|
/// return the paragraph this cursor is in
|
2004-01-20 14:25:24 +00:00
|
|
|
|
par_type par() const { return current().par(); }
|
2004-01-16 12:36:23 +00:00
|
|
|
|
/// return the paragraph this cursor is in
|
2004-01-20 14:25:24 +00:00
|
|
|
|
par_type & par() { return current().par(); }
|
2004-01-16 12:36:23 +00:00
|
|
|
|
/// return the position within the paragraph
|
2004-01-20 14:25:24 +00:00
|
|
|
|
pos_type pos() const { return current().pos(); }
|
2004-01-16 12:36:23 +00:00
|
|
|
|
/// return the position within the paragraph
|
2004-01-20 14:25:24 +00:00
|
|
|
|
pos_type & pos() { return current().pos(); }
|
2004-01-16 12:36:23 +00:00
|
|
|
|
/// return the last position within the paragraph
|
2004-01-20 14:25:24 +00:00
|
|
|
|
pos_type lastpos() const;
|
2004-01-16 12:36:23 +00:00
|
|
|
|
/// return the number of embedded cells
|
2004-01-20 14:25:24 +00:00
|
|
|
|
size_t nargs() const;
|
2004-01-16 12:36:23 +00:00
|
|
|
|
/// return the number of embedded cells
|
2004-01-20 14:25:24 +00:00
|
|
|
|
size_t ncols() const;
|
2004-01-16 12:36:23 +00:00
|
|
|
|
/// return the number of embedded cells
|
2004-01-20 14:25:24 +00:00
|
|
|
|
size_t nrows() const;
|
2004-01-16 12:36:23 +00:00
|
|
|
|
/// return the grid row of the current cell
|
2004-01-20 14:25:24 +00:00
|
|
|
|
row_type row() const;
|
2004-01-16 12:36:23 +00:00
|
|
|
|
/// return the grid row of the current cell
|
2004-01-20 14:25:24 +00:00
|
|
|
|
col_type col() const;
|
2004-01-13 10:37:38 +00:00
|
|
|
|
|
2004-01-16 13:35:10 +00:00
|
|
|
|
//
|
|
|
|
|
// math-specific part
|
|
|
|
|
//
|
|
|
|
|
/// return the mathed cell this cursor is in
|
2004-01-20 14:25:24 +00:00
|
|
|
|
MathArray const & cell() const;
|
2004-01-16 13:35:10 +00:00
|
|
|
|
/// return the mathed cell this cursor is in
|
2004-01-20 14:25:24 +00:00
|
|
|
|
MathArray & cell();
|
2004-01-16 13:35:10 +00:00
|
|
|
|
/// the mathatom left of the cursor
|
|
|
|
|
MathAtom const & prevAtom() const;
|
|
|
|
|
/// the mathatom left of the cursor
|
|
|
|
|
MathAtom & prevAtom();
|
|
|
|
|
/// the mathatom right of the cursor
|
|
|
|
|
MathAtom const & nextAtom() const;
|
|
|
|
|
/// the mathatom right of the cursor
|
|
|
|
|
MathAtom & nextAtom();
|
2004-01-20 14:25:24 +00:00
|
|
|
|
/// auto-correct mode
|
|
|
|
|
bool autocorrect() const { return autocorrect_; }
|
|
|
|
|
/// auto-correct mode
|
|
|
|
|
bool & autocorrect() { return autocorrect_; }
|
|
|
|
|
/// are we entering a macro name?
|
|
|
|
|
bool macromode() const { return macromode_; }
|
|
|
|
|
/// are we entering a macro name?
|
|
|
|
|
bool & macromode() { return macromode_; }
|
2004-01-16 13:35:10 +00:00
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// text-specific part
|
2003-11-04 12:36:59 +00:00
|
|
|
|
///
|
2004-01-20 14:25:24 +00:00
|
|
|
|
bool boundary() const { return current().boundary(); }
|
|
|
|
|
///
|
|
|
|
|
Paragraph & paragraph();
|
|
|
|
|
///
|
|
|
|
|
Paragraph const & paragraph() const;
|
2003-11-10 09:06:48 +00:00
|
|
|
|
///
|
2004-01-20 14:25:24 +00:00
|
|
|
|
InsetBase * innerInsetOfType(int code) const;
|
2003-11-10 09:06:48 +00:00
|
|
|
|
///
|
|
|
|
|
InsetTabular * innerInsetTabular() const;
|
2003-11-04 12:36:59 +00:00
|
|
|
|
///
|
|
|
|
|
LyXText * innerText() const;
|
2003-11-10 09:06:48 +00:00
|
|
|
|
/// returns x,y position
|
|
|
|
|
void getPos(int & x, int & y) const;
|
2003-11-13 08:50:26 +00:00
|
|
|
|
/// returns cursor dimension
|
|
|
|
|
void getDim(int & asc, int & desc) const;
|
2004-01-16 13:35:10 +00:00
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// common part
|
|
|
|
|
//
|
|
|
|
|
/// move one step to the left
|
|
|
|
|
bool posLeft();
|
|
|
|
|
/// move one step to the right
|
|
|
|
|
bool posRight();
|
|
|
|
|
|
2004-01-20 14:25:24 +00:00
|
|
|
|
/// set target x position of cursor
|
|
|
|
|
void x_target(int x);
|
|
|
|
|
/// return target x position of cursor
|
|
|
|
|
int x_target() const;
|
|
|
|
|
|
|
|
|
|
/// access to selection anchor
|
|
|
|
|
CursorSlice & anchor();
|
|
|
|
|
/// access to selection anchor
|
|
|
|
|
CursorSlice const & anchor() const;
|
2003-11-11 13:17:28 +00:00
|
|
|
|
/// cache the absolute coordinate from the top inset
|
|
|
|
|
void updatePos();
|
2004-01-13 18:08:13 +00:00
|
|
|
|
/// sets anchor to cursor position
|
|
|
|
|
void resetAnchor();
|
2004-01-16 12:36:23 +00:00
|
|
|
|
/// access to owning BufferView
|
2004-01-16 10:55:19 +00:00
|
|
|
|
BufferView & bv() const;
|
2004-01-20 14:25:24 +00:00
|
|
|
|
/// get some interesting description of current position
|
|
|
|
|
void info(std::ostream & os);
|
|
|
|
|
|
|
|
|
|
/// output
|
|
|
|
|
friend std::ostream & operator<<(std::ostream & os, LCursor const & cur);
|
2003-09-17 16:44:51 +00:00
|
|
|
|
public:
|
2004-01-20 14:25:24 +00:00
|
|
|
|
//private:
|
2003-11-04 12:36:59 +00:00
|
|
|
|
/// mainly used as stack, but wee need random access
|
2004-01-13 18:08:13 +00:00
|
|
|
|
std::vector<CursorSlice> cursor_;
|
2004-01-20 14:25:24 +00:00
|
|
|
|
/// the anchor position
|
2004-01-13 18:08:13 +00:00
|
|
|
|
std::vector<CursorSlice> anchor_;
|
2004-01-20 14:25:24 +00:00
|
|
|
|
|
2003-11-11 09:06:41 +00:00
|
|
|
|
private:
|
2004-01-20 14:25:24 +00:00
|
|
|
|
/// don't implement this
|
|
|
|
|
void operator=(LCursor const &);
|
|
|
|
|
/// don't implement this
|
|
|
|
|
LCursor(LCursor const &);
|
|
|
|
|
|
|
|
|
|
///
|
|
|
|
|
BufferView * const bv_;
|
|
|
|
|
/// current slice
|
|
|
|
|
int current_;
|
2003-11-11 09:06:41 +00:00
|
|
|
|
///
|
|
|
|
|
int cached_y_;
|
2004-01-20 14:25:24 +00:00
|
|
|
|
/**
|
|
|
|
|
* The target x position of the cursor. This is used for when
|
|
|
|
|
* we have text like :
|
|
|
|
|
*
|
|
|
|
|
* blah blah blah blah| blah blah blah
|
|
|
|
|
* blah blah blah
|
|
|
|
|
* blah blah blah blah blah blah
|
|
|
|
|
*
|
|
|
|
|
* When we move onto row 3, we would like to be vertically aligned
|
|
|
|
|
* with where we were in row 1, despite the fact that row 2 is
|
|
|
|
|
* shorter than x()
|
|
|
|
|
*/
|
|
|
|
|
int x_target_;
|
|
|
|
|
// do we have a selection?
|
|
|
|
|
bool selection_;
|
|
|
|
|
// are we on the way to get one?
|
|
|
|
|
bool mark_;
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// math specific stuff that could be promoted to "global" later
|
|
|
|
|
//
|
|
|
|
|
/// do we allow autocorrection
|
|
|
|
|
bool autocorrect_;
|
|
|
|
|
/// are we entering a macro name?
|
|
|
|
|
bool macromode_;
|
2003-09-17 16:44:51 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
#endif // LYXCURSOR_H
|