#include <fstream>
#include <iomanip>
#include <map>
+#include <set>
#include <sstream>
#include <stack>
#include <vector>
// Do not remove the comment below, so we get merge conflict in
// independent branches. Instead add your own.
-int const LYX_FORMAT = 345; // jamatos: xml elements
+int const LYX_FORMAT = 346; // jspitzm: Swiss German
typedef map<string, bool> DepClean;
typedef map<docstring, pair<InsetLabel const *, Buffer::References> > RefCache;
} // namespace anon
+class BufferSet : public std::set<Buffer const *> {};
+
class Buffer::Impl
{
public:
FileName const master_file = makeAbsPath(params().master,
onlyPath(absFileName()));
if (isLyXFilename(master_file.absFilename())) {
- Buffer * master = checkAndLoadLyXFile(master_file);
+ Buffer * master = checkAndLoadLyXFile(master_file, true);
d->parent_buffer = master;
}
}
{
FileName fname(filename);
+ params().compressed = fname.isZippedFile();
+
// remove dummy empty par
paragraphs().clear();
Lexer lex;
DocIterator Buffer::getParFromID(int const id) const
{
+ Buffer * buf = const_cast<Buffer *>(this);
if (id < 0) {
// John says this is called with id == -1 from undo
lyxerr << "getParFromID(), id: " << id << endl;
- return doc_iterator_end(inset());
+ return doc_iterator_end(buf);
}
- for (DocIterator it = doc_iterator_begin(inset()); !it.atEnd(); it.forwardPar())
+ for (DocIterator it = doc_iterator_begin(buf); !it.atEnd(); it.forwardPar())
if (it.paragraph().id() == id)
return it;
- return doc_iterator_end(inset());
+ return doc_iterator_end(buf);
}
ParIterator Buffer::par_iterator_begin()
{
- return ParIterator(doc_iterator_begin(inset()));
+ return ParIterator(doc_iterator_begin(this));
}
ParIterator Buffer::par_iterator_end()
{
- return ParIterator(doc_iterator_end(inset()));
+ return ParIterator(doc_iterator_end(this));
}
ParConstIterator Buffer::par_iterator_begin() const
{
- return lyx::par_const_iterator_begin(inset());
+ return ParConstIterator(doc_iterator_begin(this));
}
ParConstIterator Buffer::par_iterator_end() const
{
- return lyx::par_const_iterator_end(inset());
+ return ParConstIterator(doc_iterator_end(this));
}
}
-Buffer const * Buffer::parent()
+Buffer const * Buffer::parent() const
{
return d->parent_buffer;
}
+void Buffer::collectRelatives(BufferSet & bufs) const
+{
+ bufs.insert(this);
+ if (parent())
+ parent()->collectRelatives(bufs);
+
+ // loop over children
+ Impl::BufferPositionMap::iterator it = d->children_positions.begin();
+ Impl::BufferPositionMap::iterator end = d->children_positions.end();
+ for (; it != end; ++it)
+ bufs.insert(const_cast<Buffer *>(it->first));
+}
+
+
+std::vector<Buffer const *> Buffer::allRelatives() const
+{
+ BufferSet bufs;
+ collectRelatives(bufs);
+ BufferSet::iterator it = bufs.begin();
+ std::vector<Buffer const *> ret;
+ for (; it != bufs.end(); ++it)
+ ret.push_back(*it);
+ return ret;
+}
+
+
Buffer const * Buffer::masterBuffer() const
{
if (!d->parent_buffer)
}
+DocIterator Buffer::firstChildPosition(Buffer const * child)
+{
+ Impl::BufferPositionMap::iterator it;
+ it = d->children_positions.find(child);
+ if (it == d->children_positions.end())
+ return DocIterator(this);
+ return it->second;
+}
+
+
template<typename M>
typename M::iterator greatest_below(M & m, typename M::key_type const & x)
{
// find macro definitions for name
Impl::NamePositionScopeMacroMap::iterator nameIt
- = d->macros.find(name);
+ = d->macros.find(name);
if (nameIt != d->macros.end()) {
// find last definition in front of pos or at pos itself
Impl::PositionScopeMacroMap::const_iterator it
- = greatest_below(nameIt->second, pos);
+ = greatest_below(nameIt->second, pos);
if (it != nameIt->second.end()) {
while (true) {
// scope ends behind pos?
// find macros in included files
Impl::PositionScopeBufferMap::const_iterator it
- = greatest_below(d->position_to_children, pos);
+ = greatest_below(d->position_to_children, pos);
if (it == d->position_to_children.end())
// no children before
return bestData;
// is it an external file?
if (iit->inset->lyxCode() == INCLUDE_CODE) {
// get buffer of external file
- InsetCommand const & inset
- = static_cast<InsetCommand const &>(*iit->inset);
- InsetCommandParams const & ip = inset.params();
+ InsetInclude const & inset
+ = static_cast<InsetInclude const &>(*iit->inset);
d->macro_lock = true;
- Buffer * child = loadIfNeeded(*this, ip);
+ Buffer * child = inset.loadIfNeeded(*this);
d->macro_lock = false;
if (!child)
continue;
{
LYXERR(Debug::MACROS, "updateMacroInstances for "
<< d->filename.onlyFileName());
- DocIterator it = doc_iterator_begin(inset());
- DocIterator end = doc_iterator_end(inset());
+ DocIterator it = doc_iterator_begin(this);
+ DocIterator end = doc_iterator_end(this);
for (; it != end; it.forwardPos()) {
// look for MathData cells in InsetMathNest insets
Inset * inset = it.nextInset();
}
-// FIXME: buf should should be const because updateLabels() modifies
-// the contents of the paragraphs.
void Buffer::updateLabels(bool childonly) const
{
// Use the master text class also for child documents