#include "DocIterator.h"
#include "debug.h"
-#include "Text.h"
+#include "InsetList.h"
#include "Paragraph.h"
+#include "Text.h"
#include "mathed/MathData.h"
#include "mathed/InsetMath.h"
BOOST_ASSERT(!empty());
if (pos() == 0)
return 0;
- if (inMathed())
+ if (inMathed()) {
if (cell().empty())
// FIXME: this should not happen but it does.
// See bug 3189
return 0;
else
return prevAtom().nucleus();
+ }
return paragraph().isInset(pos() - 1) ? paragraph().getInset(pos() - 1) : 0;
}
{
BOOST_ASSERT(inTexted());
// if we are in a tabular, we need the cell
- if (inset().lyxCode() == Inset::TABULAR_CODE) {
+ if (inset().lyxCode() == TABULAR_CODE) {
InsetTabular & tabular = static_cast<InsetTabular&>(inset());
return tabular.cell(idx()).get();
}
pos_type const lastp = lastpos();
Paragraph const & par = paragraph();
pos_type & pos = top().pos();
- if (par.insetlist.empty())
+ if (par.insetList().empty())
pos = lastp;
else
while (pos < lastp && !par.isInset(pos))
void DocIterator::updateInsets(Inset * inset)
{
// this function re-creates the cache of inset pointers.
- // code taken in part from StableDocIterator::asDocIterator.
//lyxerr << "converting:\n" << *this << endl;
- DocIterator dit = DocIterator(*inset);
+ DocIterator dit = *this;
size_t const n = slices_.size();
+ slices_.resize(0);
for (size_t i = 0 ; i < n; ++i) {
BOOST_ASSERT(inset);
- dit.push_back(slices_[i]);
- dit.top().inset_ = inset;
+ push_back(dit[i]);
+ top().inset_ = inset;
if (i + 1 != n)
- inset = dit.nextInset();
+ inset = nextInset();
}
//lyxerr << "converted:\n" << *this << endl;
- operator=(dit);
}
}
+DocIterator::idx_type DocIterator::find(MathData const & cell) const
+{
+ for (size_t l = 0; l != slices_.size(); ++l) {
+ if (slices_[l].asInsetMath() && &slices_[l].cell() == &cell)
+ return l;
+ }
+ return -1;
+}
+
+
+DocIterator::idx_type DocIterator::find(InsetMath const * inset) const
+{
+ for (size_t l = 0; l != slices_.size(); ++l) {
+ if (slices_[l].asInsetMath() == inset)
+ return l;
+ }
+ return -1;
+}
+
+
+void DocIterator::cutOff(DocIterator::idx_type above, std::vector<CursorSlice> & cut)
+{
+ cut = std::vector<CursorSlice>(slices_.begin() + above + 1, slices_.end());
+ slices_.resize(above + 1);
+}
+
+
+void DocIterator::cutOff(DocIterator::idx_type above)
+{
+ slices_.resize(above + 1);
+}
+
+
+void DocIterator::append(std::vector<CursorSlice> const & x)
+{
+ slices_.insert(slices_.end(), x.begin(), x.end());
+}
+
+
+void DocIterator::append(DocIterator::idx_type idx, pos_type pos)
+{
+ slices_.push_back(CursorSlice());
+ top().idx() = idx;
+ top().pos() = pos;
+}
+
+
std::ostream & operator<<(std::ostream & os, DocIterator const & dit)
{
for (size_t i = 0, n = dit.depth(); i != n; ++i)