mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-12-23 21:40:19 +00:00
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:
parent
7892c861f9
commit
bddfd8ff66
26
src/cursor.C
26
src/cursor.C
@ -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();
|
||||
|
@ -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()
|
||||
;
|
||||
}
|
||||
|
@ -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_;
|
||||
/**
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
||||
|
@ -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.
|
||||
|
@ -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;
|
||||
|
||||
|
45
src/undo.C
45
src/undo.C
@ -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,32 +150,28 @@ bool textUndoOrRedo(BufferView & bv,
|
||||
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;
|
||||
}
|
||||
|
||||
@ -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();
|
||||
|
Loading…
Reference in New Issue
Block a user