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-09-17 16:44:51 +00:00
|
|
|
|
class LyXText;
|
2003-11-10 09:06:48 +00:00
|
|
|
|
class InsetTabular;
|
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 10:55:19 +00:00
|
|
|
|
/// create 'empty' cursor. REMOVE ME
|
|
|
|
|
LCursor();
|
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-13 10:37:38 +00:00
|
|
|
|
/// access to cursor 'tip'
|
2004-01-13 18:08:13 +00:00
|
|
|
|
CursorSlice & top() { return cursor_.back(); }
|
2004-01-13 10:37:38 +00:00
|
|
|
|
/// access to cursor 'tip'
|
2004-01-13 18:08:13 +00:00
|
|
|
|
CursorSlice const & top() const { return cursor_.back(); }
|
2004-01-16 12:36:23 +00:00
|
|
|
|
/// how many nested insets do we have?
|
|
|
|
|
size_t depth() const { return cursor_.size(); }
|
|
|
|
|
|
|
|
|
|
/// access to the topmost slice
|
|
|
|
|
/// the current inset
|
|
|
|
|
InsetBase * inset() const { return top().inset(); }
|
|
|
|
|
/// return the text-ed cell this cursor is in
|
|
|
|
|
idx_type idx() const { return top().idx(); }
|
|
|
|
|
/// return the text-ed cell this cursor is in
|
|
|
|
|
idx_type & idx() { return top().idx(); }
|
|
|
|
|
/// return the paragraph this cursor is in
|
|
|
|
|
par_type par() const { return top().par(); }
|
|
|
|
|
/// return the paragraph this cursor is in
|
|
|
|
|
par_type & par() { return top().par(); }
|
|
|
|
|
/// return the position within the paragraph
|
|
|
|
|
pos_type pos() const { return top().pos(); }
|
|
|
|
|
/// return the position within the paragraph
|
|
|
|
|
pos_type & pos() { return top().pos(); }
|
|
|
|
|
/// return the last position within the paragraph
|
|
|
|
|
pos_type lastpos() const { return top().lastpos(); }
|
|
|
|
|
/// return the number of embedded cells
|
|
|
|
|
size_t nargs() const { return top().nargs(); }
|
|
|
|
|
/// return the number of embedded cells
|
|
|
|
|
size_t ncols() const { return top().ncols(); }
|
|
|
|
|
/// return the number of embedded cells
|
|
|
|
|
size_t nrows() const { return top().nrows(); }
|
|
|
|
|
/// return the grid row of the current cell
|
|
|
|
|
row_type row() const { return top().row(); }
|
|
|
|
|
/// return the grid row of the current cell
|
|
|
|
|
col_type col() const { return top().col(); }
|
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
|
|
|
|
|
MathArray const & cell() const { return top().cell(); }
|
|
|
|
|
/// return the mathed cell this cursor is in
|
|
|
|
|
MathArray & cell() { return top().cell(); }
|
|
|
|
|
/// 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();
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// text-specific part
|
2003-11-04 12:36:59 +00:00
|
|
|
|
///
|
2003-11-10 09:06:48 +00:00
|
|
|
|
UpdatableInset * innerInset() const;
|
|
|
|
|
///
|
|
|
|
|
UpdatableInset * innerInsetOfType(int code) const;
|
|
|
|
|
///
|
|
|
|
|
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();
|
|
|
|
|
|
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;
|
2003-11-04 12:36:59 +00:00
|
|
|
|
///
|
|
|
|
|
friend std::ostream & operator<<(std::ostream &, LCursor const &);
|
2003-09-17 16:44:51 +00:00
|
|
|
|
public:
|
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_;
|
|
|
|
|
/// The
|
|
|
|
|
std::vector<CursorSlice> anchor_;
|
2003-11-04 12:36:59 +00:00
|
|
|
|
///
|
|
|
|
|
BufferView * bv_;
|
2003-11-11 09:06:41 +00:00
|
|
|
|
private:
|
|
|
|
|
///
|
|
|
|
|
int cached_y_;
|
2003-09-17 16:44:51 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
#endif // LYXCURSOR_H
|