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);
}
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";
}
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;
{
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();
return 0;
MathGridInset * p = m->asGridInset();
if (p) {
- idx = operator[](i).idx_;
+ idx = operator[](i).idx();
return p;
}
}
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;
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();
CursorSlice::CursorSlice(InsetBase & p)
: inset_(&p), idx_(0), par_(0), pos_(0), boundary_(false)
{
- ///BOOST_ASSERT(inset_);
+ BOOST_ASSERT(inset_);
}
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();
}
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()
;
}
#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;
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
///
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_;
/**
#include <boost/assert.hpp>
+DocumentIterator::DocumentIterator()
+{}
+
+
+DocumentIterator::DocumentIterator(InsetBase & inset)
+{
+ push_back(CursorSlice(inset));
+}
+
+
InsetBase * DocumentIterator::nextInset()
{
if (pos() == lastpos())
pop_back();
// 'top' is invalid now...
if (size())
- ++back().pos_;
+ ++back().pos();
//else
// lyxerr << "... no slice left" << std::endl;
}
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();
}
typedef CursorSlice::col_type col_type;
public:
+ ///
+ DocumentIterator();
+ ///
+ explicit DocumentIterator(InsetBase & inset);
+
//
// access to slice at tip
//
};
-///
-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.
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;
namespace {
-/// Whether actions are not added to the undo stacks.
-bool undo_frozen;
-
/// The flag used by finishUndo().
bool undo_finished;
finishUndo();
// this implements redo
- if (!undo_frozen) {
- otherstack.push(undo);
- DocumentIterator dit =
- undo.cursor.asDocumentIterator(&bv.buffer()->inset());
- if (dit.inMathed()) {
- // not much to be done
- } else {
- otherstack.top().pars.clear();
- LyXText * text = dit.text();
- BOOST_ASSERT(text);
- ParagraphList & plist = text->paragraphs();
- if (undo.from + undo.end <= int(plist.size())) {
- ParagraphList::iterator first = plist.begin();
- advance(first, undo.from);
- ParagraphList::iterator last = plist.begin();
- advance(last, plist.size() - undo.end);
- otherstack.top().pars.insert(otherstack.top().pars.begin(), first, last);
- }
+ otherstack.push(undo);
+ DocumentIterator dit =
+ undo.cursor.asDocumentIterator(&bv.buffer()->inset());
+ if (dit.inMathed()) {
+ // not much to be done
+ } else {
+ otherstack.top().pars.clear();
+ LyXText * text = dit.text();
+ BOOST_ASSERT(text);
+ ParagraphList & plist = text->paragraphs();
+ if (undo.from + undo.end <= int(plist.size())) {
+ ParagraphList::iterator first = plist.begin();
+ advance(first, undo.from);
+ ParagraphList::iterator last = plist.begin();
+ advance(last, plist.size() - undo.end);
+ otherstack.top().pars.insert(otherstack.top().pars.begin(), first, last);
}
- otherstack.top().cursor = bv.cursor();
- //lyxerr << " undo other: " << otherstack.top() << std::endl;
}
+ otherstack.top().cursor = bv.cursor();
+ //lyxerr << " undo other: " << otherstack.top() << std::endl;
- undo_frozen = true;
performUndoOrRedo(bv, undo);
- undo_frozen = false;
return true;
}
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();