* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
- * \author André Pönitz
+ * \author André Pönitz
* \author Alfredo Braunstein
*
* Full author contact details are available in file CREDITS.
#include "DocIterator.h"
+#include "Buffer.h"
#include "InsetList.h"
#include "Paragraph.h"
+#include "LyXRC.h"
#include "Text.h"
#include "mathed/MathData.h"
#include "mathed/InsetMath.h"
+#include "mathed/InsetMathHull.h"
#include "insets/InsetTabular.h"
#include "support/debug.h"
-
-#include <boost/assert.hpp>
+#include "support/lassert.h"
+#include "support/lstrings.h"
#include <ostream>
using namespace std;
+using namespace lyx::support;
namespace lyx {
+DocIterator::DocIterator()
+ : boundary_(false), inset_(0), buffer_(0)
+{}
+
// We could be able to get rid of this if only every BufferView were
// associated to a buffer on construction.
-DocIterator::DocIterator()
- : boundary_(false), inset_(0)
+DocIterator::DocIterator(Buffer * buf)
+ : boundary_(false), inset_(0), buffer_(buf)
{}
-DocIterator::DocIterator(Inset & inset)
- : boundary_(false), inset_(&inset)
+DocIterator::DocIterator(Buffer * buf, Inset * inset)
+ : boundary_(false), inset_(inset), buffer_(buf)
{}
-DocIterator doc_iterator_begin(Inset & inset)
+DocIterator doc_iterator_begin(const Buffer * buf0, const Inset * inset0)
{
- DocIterator dit(inset);
+ Buffer * buf = const_cast<Buffer *>(buf0);
+ Inset * inset = const_cast<Inset *>(inset0);
+ DocIterator dit(buf, inset ? inset : &buf->inset());
dit.forwardPos();
return dit;
}
-DocIterator doc_iterator_end(Inset & inset)
+DocIterator doc_iterator_end(const Buffer * buf0, const Inset * inset0)
+{
+ Buffer * buf = const_cast<Buffer *>(buf0);
+ Inset * inset = const_cast<Inset *>(inset0);
+ return DocIterator(buf, inset ? inset : &buf->inset());
+}
+
+
+bool DocIterator::inRegexped() const
{
- return DocIterator(inset);
+ InsetMathHull * i = dynamic_cast<InsetMathHull *>(inset().asInsetMath());
+ return i && i->getType() == hullRegexp;
}
Inset * DocIterator::nextInset() const
{
- BOOST_ASSERT(!empty());
+ LASSERT(!empty(), return 0);
if (pos() == lastpos())
return 0;
if (pos() > lastpos()) {
- LYXERR0("Should not happen, but it does. ");
+ LYXERR0("Should not happen, but it does: pos() = "
+ << pos() << ", lastpos() = " << lastpos());
return 0;
}
if (inMathed())
Inset * DocIterator::prevInset() const
{
- BOOST_ASSERT(!empty());
+ LASSERT(!empty(), return 0);
if (pos() == 0)
return 0;
if (inMathed()) {
if (cell().empty())
// FIXME: this should not happen but it does.
// See bug 3189
- // http://bugzilla.lyx.org/show_bug.cgi?id=3189
+ // http://www.lyx.org/trac/ticket/3189
return 0;
else
return prevAtom().nucleus();
Inset * DocIterator::realInset() const
{
- BOOST_ASSERT(inTexted());
+ LASSERT(inTexted(), /**/);
// if we are in a tabular, we need the cell
if (inset().lyxCode() == TABULAR_CODE) {
InsetTabular & tabular = static_cast<InsetTabular&>(inset());
MathAtom & DocIterator::prevAtom() const
{
- BOOST_ASSERT(!empty());
- BOOST_ASSERT(pos() > 0);
+ LASSERT(!empty(), /**/);
+ LASSERT(pos() > 0, /**/);
return cell()[pos() - 1];
}
MathAtom & DocIterator::nextAtom() const
{
- BOOST_ASSERT(!empty());
+ LASSERT(!empty(), /**/);
//lyxerr << "lastpos: " << lastpos() << " next atom:\n" << *this << endl;
- BOOST_ASSERT(pos() < lastpos());
+ LASSERT(pos() < lastpos(), /**/);
return cell()[pos()];
}
Text * DocIterator::text() const
{
- BOOST_ASSERT(!empty());
+ LASSERT(!empty(), /**/);
return top().text();
}
{
if (!inTexted())
LYXERR0(*this);
- BOOST_ASSERT(inTexted());
+ LASSERT(inTexted(), /**/);
return top().paragraph();
}
Paragraph & DocIterator::innerParagraph() const
{
- BOOST_ASSERT(!empty());
+ LASSERT(!empty(), /**/);
return innerTextSlice().paragraph();
}
CursorSlice const & DocIterator::innerTextSlice() const
{
- BOOST_ASSERT(!empty());
+ LASSERT(!empty(), /**/);
// go up until first non-0 text is hit
// (innermost text is 0 in mathed)
for (int i = depth() - 1; i >= 0; --i)
// This case is in principe not possible. We _must_
// be inside a Text.
- BOOST_ASSERT(false);
+ LASSERT(false, /**/);
static CursorSlice dummy;
return dummy;
}
MathData & DocIterator::cell() const
{
-// BOOST_ASSERT(inMathed());
+// LASSERT(inMathed(), /**/);
return top().cell();
}
Text * DocIterator::innerText() const
{
- BOOST_ASSERT(!empty());
- // go up until first non-0 text is hit
- // (innermost text is 0 in mathed)
- for (int i = depth() - 1; i >= 0; --i)
- if (slices_[i].text())
- return slices_[i].text();
- return 0;
+ LASSERT(!empty(), /**/);
+ return innerTextSlice().text();
}
// FIXME: the check for asInsetMath() shouldn't be necessary
// but math insets do not return a sensible editable() state yet.
if (nextinset && !nextinset->asInsetMath()
- && nextinset->editable() != Inset::HIGHLY_EDITABLE) {
+ && !nextinset->editable()) {
++top().pos();
return;
}
size_t const n = slices_.size();
slices_.resize(0);
for (size_t i = 0 ; i < n; ++i) {
- BOOST_ASSERT(inset);
+ LASSERT(inset, /**/);
push_back(dit[i]);
top().inset_ = inset;
if (i + 1 != n)
}
-DocIterator StableDocIterator::asDocIterator(Inset * inset) const
+DocIterator StableDocIterator::asDocIterator(Buffer * buf) const
{
// this function re-creates the cache of inset pointers
//lyxerr << "converting:\n" << *this << endl;
- DocIterator dit = DocIterator(*inset);
+ Inset * inset = &buf->inset();
+ DocIterator dit = DocIterator(buf, inset);
for (size_t i = 0, n = data_.size(); i != n; ++i) {
if (inset == 0) {
// FIXME