lyx_mirror/src/lyxcursor.h
Dekel Tsur 2622efcc14 Add explanation of boundary_
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@5190 a592a061-630c-0410-9148-cb99ea01b6c8
2002-09-02 12:10:26 +00:00

180 lines
4.4 KiB
C++

// -*- C++ -*-
/**
* \file lyxcursor.h
* Copyright 1995-2001 the LyX Team
* Read the file COPYING
*
* \author Matthias Ettrich
*/
#ifndef LYXCURSOR_H
#define LYXCURSOR_H
#ifdef __GNUG__
#pragma interface
#endif
#include "support/types.h"
class Paragraph;
class Row;
/**
* The cursor class describes the position of a cursor within a document.
* Several cursors exist within LyX; for example, when locking an inset,
* the position of the cursor in the containing inset is stored.
*
* FIXME: true ?
*/
class LyXCursor {
public:
LyXCursor();
/// set the paragraph that contains this cursor
void par(Paragraph * p);
/// return the paragraph this cursor is in
Paragraph * par() const;
/// set the position within the paragraph
void pos(lyx::pos_type p);
/// return the position within the paragraph
lyx::pos_type pos() const;
/// FIXME
void boundary(bool b);
/// FIXME
bool boundary() const;
/// set the x position in pixels
void x(int i);
/// return the x position in pixels
int x() const;
/// set the stored next-line position when at the end of a row
void ix(int i);
/**
* Return the x position of the start of the next row, when this
* cursor is at the end of the previous row, for insets that take
* a full row.
*
* FIXME: explain why we need this ?
*/
int ix() const;
/// set the cached x position
void x_fix(int i);
/**
* Return the cached 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_fix() const;
/// set the y position in pixels
void y(int i);
/// return the y position in pixels
int y() const;
/// set the stored next-line y position when at the end of a row
void iy(int i);
/**
* Return the y position of the start of the next row, when this
* cursor is at the end of the previous row, for insets that take
* a full row.
*
* FIXME: explain why we need this ? especially for y...
*/
int iy() const;
/// set the row of the paragraph the cursor is in
void row(Row * r);
/// return the row of the paragraph this cursor is in
Row * row() const;
/// set the stored next row
void irow(Row * r);
/**
* Return the next row, when this
* cursor is at the end of the previous row, for insets that take
* a full row.
*
* FIXME: explain why we need this ? especially for y...
*/
Row * irow() const;
private:
/// The paragraph the cursor is in.
Paragraph * par_;
/// The position inside the paragraph
lyx::pos_type pos_;
/**
* When the cursor position is i, is the cursor is after the i-th char
* or before the i+1-th char ? Normally, these two interpretations are
* equivalent, except when the fonts of the i-th and i+1-th char
* differ.
* We use boundary_ to distinguish between the two options:
* If boundary_=true, then the cursor is after the i-th char
* and if boundary_=false, then the cursor is before the i+1-th char.
*
* We currently use the boundary only when the language direction of
* the i-th char is different than the one of the i+1-th char.
* In this case it is important to distinguish between the two
* cursor interpretations, in order to give a reasonable behavior to
* the user.
*/
bool boundary_;
/// the pixel x position
int x_;
/// the stored next-row x position
int ix_;
/// the cached x position
int x_fix_;
/// the pixel y position
int y_;
/// the stored next-row y position
int iy_;
/// the containing row
Row * row_;
/// the containing row for the next line
Row * irow_;
};
/// these three dictate the others
inline
bool operator==(LyXCursor const & a, LyXCursor const & b)
{
return (a.par() == b.par())
&& (a.pos() == b.pos())
&& a.boundary() == b.boundary();
}
inline
bool operator!=(LyXCursor const & a, LyXCursor const & b)
{
return !(a == b);
}
/// only compares y() and pos(). Can this be done in another way?
inline
bool operator<(LyXCursor const & a, LyXCursor const & b)
{
return (a.y() < b.y() && a.pos() < b.pos());
}
inline
bool operator>(LyXCursor const & a, LyXCursor const & b)
{
return b < a;
}
inline
bool operator>=(LyXCursor const & a, LyXCursor const & b)
{
return !(a < b);
}
inline
bool operator<=(LyXCursor const & a, LyXCursor const & b)
{
return !(a > b);
}
#endif // LYXCURSOR_H