more privacy for CursorSlice members

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@8505 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
André Pönitz 2004-03-18 16:41:45 +00:00
parent 7892c861f9
commit bddfd8ff66
7 changed files with 90 additions and 87 deletions

View File

@ -67,12 +67,12 @@ void region(CursorSlice const & i1, CursorSlice const & i2,
LCursor::col_type & c1, LCursor::col_type & c2)
{
InsetBase & p = i1.inset();
c1 = p.col(i1.idx_);
c2 = p.col(i2.idx_);
c1 = p.col(i1.idx());
c2 = p.col(i2.idx());
if (c1 > c2)
swap(c1, c2);
r1 = p.row(i1.idx_);
r2 = p.row(i2.idx_);
r1 = p.row(i1.idx());
r2 = p.row(i2.idx());
if (r1 > r2)
swap(r1, r2);
}
@ -418,10 +418,10 @@ string LCursor::grabSelection()
CursorSlice i1 = selBegin();
CursorSlice i2 = selEnd();
if (i1.idx_ == i2.idx_) {
if (i1.idx() == i2.idx()) {
if (i1.inset().asMathInset()) {
MathArray::const_iterator it = i1.cell().begin();
return asString(MathArray(it + i1.pos_, it + i2.pos_));
return asString(MathArray(it + i1.pos(), it + i2.pos()));
} else {
return "unknown selection 1";
}
@ -456,8 +456,8 @@ void LCursor::eraseSelection()
CursorSlice const & i2 = selEnd();
#warning FIXME
if (i1.inset().asMathInset()) {
if (i1.idx_ == i2.idx_) {
i1.cell().erase(i1.pos_, i2.pos_);
if (i1.idx() == i2.idx()) {
i1.cell().erase(i1.pos(), i2.pos());
} else {
MathInset * p = i1.asMathInset();
row_type r1, r2;
@ -895,8 +895,8 @@ void LCursor::adjust(pos_type from, int diff)
{
if (pos() > from)
pos() += diff;
if (anchor().pos_ > from)
anchor().pos_ += diff;
if (anchor().pos() > from)
anchor().pos() += diff;
// just to be on the safe side
// theoretically unecessary
normalize();
@ -932,7 +932,7 @@ MathGridInset * LCursor::enclosingGrid(idx_type & idx) const
return 0;
MathGridInset * p = m->asGridInset();
if (p) {
idx = operator[](i).idx_;
idx = operator[](i).idx();
return p;
}
}
@ -1100,7 +1100,7 @@ bool LCursor::bruteFind(int x, int y, int xlow, int xhigh, int ylow, int yhigh)
BOOST_ASSERT(text);
getParsInRange(text->paragraphs(), ylow, yhigh, beg, end);
DocumentIterator it = insetBegin(bv().buffer()->inset());
DocumentIterator it(bv().buffer()->inset());
DocumentIterator et;
lyxerr << "x: " << x << " y: " << y << endl;
lyxerr << "xlow: " << xlow << " ylow: " << ylow << endl;
@ -1146,7 +1146,7 @@ void LCursor::bruteFind2(int x, int y)
DocumentIterator it = *this;
it.back().pos() = 0;
DocumentIterator et = *this;
et.back().pos() = et.back().asMathInset()->cell(et.back().idx_).size();
et.back().pos() = et.back().asMathInset()->cell(et.back().idx()).size();
for (int i = 0; ; ++i) {
int xo, yo;
CursorSlice & cur = it.back();

View File

@ -37,7 +37,7 @@ CursorSlice::CursorSlice()
CursorSlice::CursorSlice(InsetBase & p)
: inset_(&p), idx_(0), par_(0), pos_(0), boundary_(false)
{
///BOOST_ASSERT(inset_);
BOOST_ASSERT(inset_);
}
@ -177,34 +177,34 @@ Paragraph const & CursorSlice::paragraph() const
bool operator==(CursorSlice const & p, CursorSlice const & q)
{
return p.inset_ == q.inset_
&& p.idx_ == q.idx_
&& p.par_ == q.par_
&& p.pos_ == q.pos_;
return &p.inset() == &q.inset()
&& p.idx() == q.idx()
&& p.par() == q.par()
&& p.pos() == q.pos();
}
bool operator!=(CursorSlice const & p, CursorSlice const & q)
{
return p.inset_ != q.inset_
|| p.idx_ != q.idx_
|| p.par_ != q.par_
|| p.pos_ != q.pos_;
return &p.inset() != &q.inset()
|| p.idx() != q.idx()
|| p.par() != q.par()
|| p.pos() != q.pos();
}
bool operator<(CursorSlice const & p, CursorSlice const & q)
{
if (p.inset_ != q.inset_) {
if (&p.inset() != &q.inset()) {
lyxerr << "can't compare cursor and anchor in different insets\n"
<< "p: " << p << '\n' << "q: " << q << endl;
return true;
}
if (p.idx_ != q.idx_)
return p.idx_ < q.idx_;
if (p.par_ != q.par_)
return p.par_ < q.par_;
return p.pos_ < q.pos_;
if (p.idx() != q.idx())
return p.idx() < q.idx();
if (p.par() != q.par())
return p.par() < q.par();
return p.pos() < q.pos();
}
@ -217,12 +217,12 @@ bool operator>(CursorSlice const & p, CursorSlice const & q)
std::ostream & operator<<(std::ostream & os, CursorSlice const & item)
{
return os
<< "inset: " << item.inset_
<< "inset: " << &item.inset()
// << " text: " << item.text()
<< " idx: " << item.idx_
<< " par: " << item.par_
<< " pos: " << item.pos_
// << " x: " << item.inset_->x()
// << " y: " << item.inset_->y()
<< " idx: " << item.idx()
<< " par: " << item.par()
<< " pos: " << item.pos()
// << " x: " << item.inset().x()
// << " y: " << item.inset().y()
;
}

View File

@ -17,11 +17,13 @@
#ifndef CURSORSLICE_H
#define CURSORSLICE_H
#include <cstddef>
#include <iosfwd>
#include "ParagraphList_fwd.h"
#include "support/types.h"
#include <cstddef>
#include <iosfwd>
class BufferView;
class InsetBase;
class MathInset;
@ -66,8 +68,12 @@ public:
idx_type lastidx() const { return nargs() - 1; }
/// return the paragraph this cursor is in
par_type par() const;
/// return the paragraph this cursor is in
/// set the paragraph this cursor is in
par_type & par();
/// increments the paragraph this cursor is in
void incrementPar();
/// increments the paragraph this cursor is in
void decrementPar();
/// return the position within the paragraph
pos_type pos() const;
/// return the position within the paragraph
@ -112,12 +118,15 @@ public:
///
friend std::ostream & operator<<(std::ostream &, CursorSlice const &);
public:
/// pointer to 'owning' inset
/// pointer to 'owning' inset. This is some kind of cache.
InsetBase * inset_;
private:
/// cell index of a position in this inset
idx_type idx_;
/// paragraph in this cell (used by texted)
par_type par_;
/// true of 'pit' was properly initialized
bool pit_valid_;
/// position in this cell
pos_type pos_;
/**

View File

@ -12,6 +12,16 @@
#include <boost/assert.hpp>
DocumentIterator::DocumentIterator()
{}
DocumentIterator::DocumentIterator(InsetBase & inset)
{
push_back(CursorSlice(inset));
}
InsetBase * DocumentIterator::nextInset()
{
if (pos() == lastpos())
@ -270,7 +280,7 @@ void DocumentIterator::forwardPos()
pop_back();
// 'top' is invalid now...
if (size())
++back().pos_;
++back().pos();
//else
// lyxerr << "... no slice left" << std::endl;
}
@ -332,21 +342,7 @@ void DocumentIterator::forwardPar()
pop_back();
// 'top' is invalid now...
if (size())
++back().pos_;
}
DocumentIterator insetBegin(InsetBase & inset)
{
DocumentIterator it;
it.push_back(CursorSlice(inset));
return it;
}
DocumentIterator insetEnd()
{
return DocumentIterator();
++back().pos();
}

View File

@ -49,6 +49,11 @@ public:
typedef CursorSlice::col_type col_type;
public:
///
DocumentIterator();
///
explicit DocumentIterator(InsetBase & inset);
//
// access to slice at tip
//
@ -164,12 +169,6 @@ public:
};
///
DocumentIterator insetBegin(InsetBase & inset);
///
DocumentIterator insetEnd();
// The difference to a ('non stable') DocumentIterator is the removed
// (overwritte by 0...) part of the CursorSlice data items. So this thing
// is suitable for external storage, but not for iteration as such.

View File

@ -695,6 +695,14 @@ void LyXFunc::dispatch(FuncRequest const & cmd, bool verbose)
break;
case LFUN_QUIT:
#if 0
// test speed of DocumentIterator
lyxerr << "start" << endl;
for (DocumentIterator it(owner->buffer()->inset()), end;
it != end; it.forwardPos())
;
lyxerr << "end" << endl;
#endif
QuitLyX();
break;

View File

@ -32,9 +32,6 @@ using lyx::paroffset_type;
namespace {
/// Whether actions are not added to the undo stacks.
bool undo_frozen;
/// The flag used by finishUndo().
bool undo_finished;
@ -153,7 +150,6 @@ bool textUndoOrRedo(BufferView & bv,
finishUndo();
// this implements redo
if (!undo_frozen) {
otherstack.push(undo);
DocumentIterator dit =
undo.cursor.asDocumentIterator(&bv.buffer()->inset());
@ -174,11 +170,8 @@ bool textUndoOrRedo(BufferView & bv,
}
otherstack.top().cursor = bv.cursor();
//lyxerr << " undo other: " << otherstack.top() << std::endl;
}
undo_frozen = true;
performUndoOrRedo(bv, undo);
undo_frozen = false;
return true;
}
@ -209,8 +202,6 @@ bool textRedo(BufferView & bv)
void recordUndo(Undo::undo_kind kind,
LCursor & cur, paroffset_type first, paroffset_type last)
{
if (undo_frozen)
return;
Buffer * buf = cur.bv().buffer();
recordUndo(kind, cur, first, last, buf->undostack());
buf->redostack().clear();