X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FInsetList.cpp;h=56401a4ba6d37112c555174a5da44e487c482702;hb=7a7b9abf1b3f4bcd81b4faaad4ef2363a4121848;hp=27e59280f31b6673846fdbfbf3fb455441029368;hpb=f630be890494c849981e4fb52ea4740506e92bed;p=lyx.git diff --git a/src/InsetList.cpp b/src/InsetList.cpp index 27e59280f3..56401a4ba6 100644 --- a/src/InsetList.cpp +++ b/src/InsetList.cpp @@ -3,36 +3,36 @@ * This file is part of LyX, the document processor. * Licence details can be found in the file COPYING. * - * \author Lars Gullik Bjønnes + * \author Lars Gullik Bjønnes * \author Martin Vermeer * * Full author contact details are available in file CREDITS. */ #include +#include #include "InsetList.h" #include "Buffer.h" #include "BufferParams.h" #include "BranchList.h" -#include "debug.h" #include "insets/InsetBranch.h" +#include "support/debug.h" -namespace lyx { +using namespace std; -using std::endl; -using std::lower_bound; +namespace lyx { namespace { typedef InsetList::InsetTable Table; -class InsetTablePosLess : public std::binary_function { -public: +struct InsetTablePosLess +{ bool operator()(Table const & t1, Table const & t2) const { return t1.pos < t2.pos; @@ -42,16 +42,46 @@ public: } // namespace anon +InsetList::InsetList(InsetList const & il) +{ + list_ = il.list_; + List::iterator it = list_.begin(); + List::iterator end = list_.end(); + for (; it != end; ++it) + it->inset = it->inset->clone(); +} + + +InsetList::InsetList(InsetList const & il, pos_type beg, pos_type end) +{ + InsetList::const_iterator cit = il.begin(); + InsetList::const_iterator cend = il.end(); + for (; cit != cend; ++cit) { + if (cit->pos < beg) + continue; + if (cit->pos >= end) + break; + // Add a new entry in the insetlist_. + insert(cit->inset->clone(), cit->pos - beg); + } +} + InsetList::~InsetList() { - // If we begin storing a shared_ptr in the List - // this code can be removed. (Lgb) List::iterator it = list_.begin(); List::iterator end = list_.end(); - for (; it != end; ++it) { + for (; it != end; ++it) delete it->inset; - } +} + + +void InsetList::setBuffer(Buffer & b) +{ + List::iterator it = list_.begin(); + List::iterator end = list_.end(); + for (; it != end; ++it) + it->inset->setBuffer(b); } @@ -71,13 +101,13 @@ InsetList::const_iterator InsetList::insetIterator(pos_type pos) const } -void InsetList::insert(InsetBase * inset, pos_type pos) +void InsetList::insert(Inset * inset, pos_type pos) { List::iterator end = list_.end(); List::iterator it = insetIterator(pos); if (it != end && it->pos == pos) { - lyxerr << "ERROR (InsetList::insert): " - << "There is an inset in position: " << pos << endl; + LYXERR0("ERROR (InsetList::insert): " + << "There is an inset in position: " << pos); } else { list_.insert(it, InsetTable(pos, inset)); } @@ -95,12 +125,12 @@ void InsetList::erase(pos_type pos) } -InsetBase * InsetList::release(pos_type pos) +Inset * InsetList::release(pos_type pos) { List::iterator end = list_.end(); List::iterator it = insetIterator(pos); if (it != end && it->pos == pos) { - InsetBase * tmp = it->inset; + Inset * tmp = it->inset; it->inset = 0; return tmp; } @@ -108,7 +138,7 @@ InsetBase * InsetList::release(pos_type pos) } -InsetBase * InsetList::get(pos_type pos) const +Inset * InsetList::get(pos_type pos) const { List::const_iterator end = list_.end(); List::const_iterator it = insetIterator(pos); @@ -122,9 +152,8 @@ void InsetList::increasePosAfterPos(pos_type pos) { List::iterator end = list_.end(); List::iterator it = insetIterator(pos); - for (; it != end; ++it) { + for (; it != end; ++it) ++it->pos; - } } @@ -132,10 +161,33 @@ void InsetList::decreasePosAfterPos(pos_type pos) { List::iterator end = list_.end(); List::iterator it = insetIterator(pos); - for (; it != end; ++it) { + for (; it != end; ++it) --it->pos; +} + + +pos_type InsetList::find(InsetCode code, pos_type startpos) const +{ + List::const_iterator it = insetIterator(startpos); + List::const_iterator end = list_.end(); + for (; it != end ; ++it) { + if (it->inset->lyxCode() == code) + return it->pos; } + return -1; } +int InsetList::count(InsetCode code, pos_type startpos) const +{ + int num = 0; + List::const_iterator it = insetIterator(startpos); + List::const_iterator end = list_.end(); + for (; it != end ; ++it) { + if (it->inset->lyxCode() == code) + ++num; + } + return num; +} + } // namespace lyx