X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBufferList.cpp;h=0aac272208aa1f14764be006f0d5b766751e6d63;hb=cca78e3c8ae27431323746abd64f9d7db017099d;hp=c95616907a2f6cb9069eba5f97be1f34fceac521;hpb=f2c9b56fb4e4abd5183858984dd9329453004c96;p=lyx.git diff --git a/src/BufferList.cpp b/src/BufferList.cpp index c95616907a..0aac272208 100644 --- a/src/BufferList.cpp +++ b/src/BufferList.cpp @@ -24,12 +24,14 @@ #include "support/ExceptionMessage.h" #include "support/debug.h" +#include "support/FileName.h" +#include "support/FileNameList.h" #include "support/filetools.h" #include "support/gettext.h" #include "support/lstrings.h" #include "support/Package.h" -#include +#include "support/lassert.h" #include #include @@ -81,12 +83,12 @@ BufferList::const_iterator BufferList::end() const void BufferList::release(Buffer * buf) { - BOOST_ASSERT(buf); + LASSERT(buf, /**/); BufferStorage::iterator const it = find(bstore.begin(), bstore.end(), buf); if (it != bstore.end()) { Buffer * tmp = (*it); - BOOST_ASSERT(tmp); + LASSERT(tmp, /**/); bstore.erase(it); delete tmp; } @@ -121,12 +123,13 @@ void BufferList::closeAll() } -vector const BufferList::getFileNames() const +FileNameList const & BufferList::fileNames() const { - vector nvec; + static FileNameList nvec; + nvec.clear(); transform(bstore.begin(), bstore.end(), back_inserter(nvec), - boost::bind(&Buffer::absFileName, _1)); + boost::bind(&Buffer::fileName, _1)); return nvec; } @@ -157,13 +160,13 @@ Buffer * BufferList::getBuffer(unsigned int choice) Buffer * BufferList::next(Buffer const * buf) const { - BOOST_ASSERT(buf); + LASSERT(buf, /**/); if (bstore.empty()) return 0; BufferStorage::const_iterator it = find(bstore.begin(), bstore.end(), buf); - BOOST_ASSERT(it != bstore.end()); + LASSERT(it != bstore.end(), /**/); ++it; if (it == bstore.end()) return bstore.front(); @@ -174,13 +177,13 @@ Buffer * BufferList::next(Buffer const * buf) const Buffer * BufferList::previous(Buffer const * buf) const { - BOOST_ASSERT(buf); + LASSERT(buf, /**/); if (bstore.empty()) return 0; BufferStorage::const_iterator it = find(bstore.begin(), bstore.end(), buf); - BOOST_ASSERT(it != bstore.end()); + LASSERT(it != bstore.end(), /**/); if (it == bstore.begin()) return bstore.back(); else @@ -273,33 +276,25 @@ docstring BufferList::emergencyWrite(Buffer * buf) } -bool BufferList::exists(string const & s) const +bool BufferList::exists(FileName const & fname) const { - return find_if(bstore.begin(), bstore.end(), - bind(equal_to(), - bind(&Buffer::absFileName, _1), - s)) - != bstore.end(); + return getBuffer(fname) != 0; } bool BufferList::isLoaded(Buffer const * b) const { - BOOST_ASSERT(b); + LASSERT(b, /**/); BufferStorage::const_iterator cit = find(bstore.begin(), bstore.end(), b); return cit != bstore.end(); } -Buffer * BufferList::getBuffer(string const & s) +Buffer * BufferList::getBuffer(support::FileName const & fname) const { - BufferStorage::iterator it = - find_if(bstore.begin(), bstore.end(), - bind(equal_to(), - bind(&Buffer::absFileName, _1), - s)); - + BufferStorage::const_iterator it = find_if(bstore.begin(), bstore.end(), + bind(equal_to(), bind(&Buffer::fileName, _1), fname)); return it != bstore.end() ? (*it) : 0; } @@ -324,15 +319,39 @@ void BufferList::setCurrentAuthor(docstring const & name, docstring const & emai } -int BufferList::bufferNum(string const & name) const +int BufferList::bufferNum(FileName const & fname) const { - vector buffers = getFileNames(); - vector::const_iterator cit = - find(buffers.begin(), buffers.end(), name); + FileNameList const & buffers = fileNames(); + FileNameList::const_iterator cit = + find(buffers.begin(), buffers.end(), fname); if (cit == buffers.end()) return 0; return int(cit - buffers.begin()); } +bool BufferList::releaseChild(Buffer * parent, Buffer * child) +{ + LASSERT(parent, return false); + LASSERT(child, return false); + LASSERT(parent->isChild(child), return false); + + // Child document has a different parent, don't close it. + if (child->parent() != parent) + return false; + + BufferStorage::iterator it = bstore.begin(); + BufferStorage::iterator end = bstore.end(); + for (; it != end; ++it) { + Buffer * buf = *it; + if (buf != parent && buf->isChild(child)) { + child->setParent(0); + return false; + } + } + release(child); + return true; +} + + } // namespace lyx