This unifies a few types used in LCursor and the math cursor. Note that this unifies on the 'wrong side': paroffset_type should be unsigned in the long run but there seems to be a place or two where the core code relies on signedness (a downward counting loop most likely).
It works as-is and could be corrected later by hunting down that loop and setting paroffset_type to size_type in support/types.h. Andre'
Index: cursor.h =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/cursor.h,v retrieving revision 1.14 diff -u -p -r1.14 cursor.h --- cursor.h 13 Jan 2004 10:37:34 -0000 1.14 +++ cursor.h 13 Jan 2004 11:58:31 -0000 @@ -15,8 +15,6 @@ #include "textcursor.h" #include "cursor_slice.h" -#include "support/types.h" - #include <iosfwd> #include <vector> @@ -35,6 +33,13 @@ class InsetTabular; class LCursor { public: + /// 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; + /// create 'empty' cursor explicit LCursor(BufferView * bv); /// dispatch from innermost inset upwards Index: cursor_slice.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/cursor_slice.C,v retrieving revision 1.1 diff -u -p -r1.1 cursor_slice.C --- cursor_slice.C 15 Dec 2003 11:36:13 -0000 1.1 +++ cursor_slice.C 13 Jan 2004 11:58:31 -0000 @@ -3,7 +3,10 @@ * This file is part of LyX, the document processor. * Licence details can be found in the file COPYING. * + * \author Lars Gullik Bjønnes + * \author Matthias Ettrich * \author André Pönitz + * \author Jürgen Vigna * * Full author contact details are available in file CREDITS. */ @@ -22,14 +25,50 @@ using std::endl; CursorSlice::CursorSlice() - : inset_(0), idx_(0), par_(0), pos_(0) + : inset_(0), idx_(0), par_(0), pos_(0), boundary_(false) {} CursorSlice::CursorSlice(InsetBase * p) - : inset_(p), idx_(0), par_(0), pos_(0) + : inset_(p), idx_(0), par_(0), pos_(0), boundary_(false) { ///BOOST_ASSERT(inset_); +} + + +void CursorSlice::par(lyx::paroffset_type par) +{ + par_ = par; +} + + +lyx::paroffset_type CursorSlice::par() const +{ + return par_; +} + + +void CursorSlice::pos(lyx::pos_type pos) +{ + pos_ = pos; +} + + +lyx::pos_type CursorSlice::pos() const +{ + return pos_; +} + + +void CursorSlice::boundary(bool boundary) +{ + boundary_ = boundary; +} + + +bool CursorSlice::boundary() const +{ + return boundary_; } Index: cursor_slice.h =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/cursor_slice.h,v retrieving revision 1.1 diff -u -p -r1.1 cursor_slice.h --- cursor_slice.h 15 Dec 2003 11:36:13 -0000 1.1 +++ cursor_slice.h 13 Jan 2004 11:58:31 -0000 @@ -4,7 +4,12 @@ * This file is part of LyX, the document processor. * Licence details can be found in the file COPYING. * + * \author Lars Gullik Bjønnes + * \author Matthias Ettrich + * \author John Levon * \author André Pönitz + * \author Dekel Tsur + * \author Jürgen Vigna * * Full author contact details are available in file CREDITS. */ @@ -15,6 +20,8 @@ #include <iosfwd> #include <cstddef> +#include "support/types.h" + class InsetBase; class UpdatableInset; class MathInset; @@ -34,15 +41,28 @@ public: /// type for cell number in inset typedef size_t idx_type; /// type for paragraph numbers positions within a cell - typedef size_t par_type; + typedef lyx::paroffset_type par_type; /// type for cursor positions within a cell - typedef size_t pos_type; + typedef lyx::pos_type pos_type; /// CursorSlice(); /// explicit CursorSlice(InsetBase *); + /// set the paragraph that contains this cursor + void par(par_type pit); + /// return the paragraph this cursor is in + par_type par() const; + /// set the position within the paragraph + void pos(pos_type p); + /// return the position within the paragraph + pos_type pos() const; + + /// FIXME + void boundary(bool b); + /// FIXME + bool boundary() const; /// /// texted specific stuff /// @@ -76,6 +96,22 @@ public: par_type par_; /// position in this cell 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_; }; /// test for equality @@ -84,5 +120,7 @@ bool operator==(CursorSlice const &, Cur bool operator!=(CursorSlice const &, CursorSlice const &); /// test for order bool operator<(CursorSlice const &, CursorSlice const &); +/// test for order +bool operator>(CursorSlice const &, CursorSlice const &); #endif Index: insets/insetbase.h =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/insets/insetbase.h,v retrieving revision 1.19 diff -u -p -r1.19 insetbase.h --- insets/insetbase.h 1 Dec 2003 13:35:45 -0000 1.19 +++ insets/insetbase.h 13 Jan 2004 11:58:31 -0000 @@ -29,17 +29,17 @@ class DispatchResult; class InsetBase { public: /// - typedef int difference_type; + typedef ptrdiff_t difference_type; /// short of anything else reasonable - typedef size_t size_type; + typedef size_t size_type; /// type for cell indices - typedef size_t idx_type; + typedef size_t idx_type; /// type for cursor positions - typedef size_t pos_type; + typedef ptrdiff_t pos_type; /// type for row numbers - typedef size_t row_type; + typedef size_t row_type; /// type for column numbers - typedef size_t col_type; + typedef size_t col_type; /// virtual base class destructor virtual ~InsetBase() {} Index: mathed/math_cursor.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/mathed/math_cursor.C,v retrieving revision 1.372 diff -u -p -r1.372 math_cursor.C --- mathed/math_cursor.C 15 Dec 2003 11:36:19 -0000 1.372 +++ mathed/math_cursor.C 13 Jan 2004 11:58:31 -0000 @@ -814,7 +814,7 @@ void MathCursor::normalize() lyxerr << endl; dump("error 4"); } - pos() = min(pos(), size()); + pos() = pos() < size() ? pos() : size(); } Index: mathed/math_cursor.h =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/mathed/math_cursor.h,v retrieving revision 1.154 diff -u -p -r1.154 math_cursor.h --- mathed/math_cursor.h 15 Dec 2003 11:36:19 -0000 1.154 +++ mathed/math_cursor.h 13 Jan 2004 11:58:31 -0000 @@ -16,6 +16,7 @@ #include "math_inset.h" #include "math_data.h" #include "math_iterator.h" +#include "support/types.h" #include <string> @@ -40,17 +41,17 @@ this formula's MathHullInset to the curr class MathCursor { public: /// short of anything else reasonable - typedef MathInset::size_type size_type; + typedef size_t size_type; /// type for column numbers - typedef MathArray::difference_type difference_type; + typedef ptrdiff_t difference_type; /// type for cursor positions within a cell - typedef MathInset::pos_type pos_type; + typedef lyx::pos_type pos_type; /// type for cell indices - typedef MathInset::idx_type idx_type; + typedef size_t idx_type; /// type for row numbers - typedef MathInset::row_type row_type; + typedef size_t row_type; /// type for column numbers - typedef MathInset::col_type col_type; + typedef size_t col_type; /// explicit MathCursor(InsetFormulaBase *, bool left);