#include "Buffer.h"
#include "BufferParams.h"
#include "Paragraph.h"
-#include "ParIterator.h"
+#include "InsetIterator.h"
#include "debug.h"
#include "gettext.h"
#include "Format.h"
#include "support/lyxlib.h"
#include "support/lstrings.h"
+#include "LyX.h"
+#include "Session.h"
+
#include <sstream>
#include <fstream>
#include <utility>
EmbeddedFile::EmbeddedFile(string const & file, string const & inzip_name,
- bool embed, ParConstIterator const & pit)
+ bool embed, Inset const * inset)
: DocFileName(file, true), inzip_name_(inzip_name), embedded_(embed),
- valid_(true), par_it_()
+ valid_(true), inset_list_()
{
- if (pit != ParConstIterator())
- par_it_.push_back(pit);
+ if (inset != NULL)
+ inset_list_.push_back(inset);
}
}
-void EmbeddedFile::addParIter(ParConstIterator const & pit)
+void EmbeddedFile::addInset(Inset const * inset)
{
- par_it_.push_back(pit);
+ inset_list_.push_back(inset);
}
-int EmbeddedFile::parID(int idx) const
+Inset const * EmbeddedFile::inset(int idx) const
{
BOOST_ASSERT(idx < refCount());
// some embedded file do not have a valid par iterator
- return par_it_[idx]->id();
+ return inset_list_[idx];
+}
+
+
+void EmbeddedFile::saveBookmark(Buffer const * buf, int idx) const
+{
+ Inset const * ptr = inset(idx);
+ // This might not be the most efficient method ...
+ for (InsetIterator it = inset_iterator_begin(buf->inset()); it; ++it)
+ if (&(*it) == ptr) {
+ // this is basically BufferView::saveBookmark(0)
+ LyX::ref().session().bookmarks().save(
+ FileName(buf->fileName()),
+ it.bottom().pit(),
+ it.bottom().pos(),
+ it.paragraph().id(),
+ it.pos(),
+ 0
+ );
+ }
+ // this inset can not be located. There is something wrong that needs
+ // to be fixed.
+ BOOST_ASSERT(true);
}
void EmbeddedFile::invalidate()
{
- // Clear par_it_ because they will be registered again.
- par_it_.clear();
+ // Clear inset_list_ because they will be registered again.
+ inset_list_.clear();
valid_ = false;
}
void EmbeddedFiles::registerFile(string const & filename,
- bool embed, ParConstIterator const & pit)
+ bool embed, Inset const * inset)
{
// filename can be relative or absolute, translate to absolute filename
string abs_filename = makeAbsPath(filename, buffer_->filePath()).absFilename();
break;
// find this filename, keep the original embedding status
if (it != file_list_.end()) {
- it->addParIter(pit);
+ it->addInset(inset);
// if the file is embedded, the embedded file should have exist
// check for this to ensure that our logic is correct
if (it->embedded())
}
// try to be more careful
file_list_.push_back(EmbeddedFile(abs_filename,
- getInzipName(abs_filename), embed, pit));
+ getInzipName(abs_filename), embed, inset));
// validate if things are OK
BOOST_ASSERT(fs::exists(file_list_.back().availableFile(buffer_)));
}
if (it->refCount() > 0)
it->invalidate();
- ParIterator pit = buffer_->par_iterator_begin();
- ParIterator pit_end = buffer_->par_iterator_end();
- for (; pit != pit_end; ++pit) {
- // For each paragraph, traverse its insets and register embedded files
- InsetList::const_iterator iit = pit->insetlist.begin();
- InsetList::const_iterator iit_end = pit->insetlist.end();
- for (; iit != iit_end; ++iit) {
- Inset & inset = *iit->inset;
- inset.registerEmbeddedFiles(*buffer_, *this, pit);
- }
- }
+ for (InsetIterator it = inset_iterator_begin(buffer_->inset()); it; ++it)
+ it->registerEmbeddedFiles(*buffer_, *this);
+
LYXERR(Debug::FILES) << "Manifest updated: " << endl
<< *this
<< "End Manifest" << endl;
{
public:
EmbeddedFile(std::string const & file, std::string const & inzip_name,
- bool embedded, ParConstIterator const & pit);
+ bool embedded, Inset const * inset);
/// filename in the zip file, usually the relative path
std::string inzipName() const { return inzip_name_; }
/// embeddedFile() or absFilename() depending on embedding status
std::string availableFile(Buffer const * buf) const;
- /// paragraph id
- void addParIter(ParConstIterator const & pit);
- int parID(int idx) const;
+ /// add an inset that refers to this file
+ void addInset(Inset const * inset);
+ Inset const * inset(int idx) const;
+ /// save the location of this inset as bookmark so that
+ /// it can be located using LFUN_BOOKMARK_GOTO
+ void saveBookmark(Buffer const * buf, int idx) const;
/// Number of Insets this file item is referred
/// If refCount() == 0, this file must be manually inserted.
/// This fact is used by the update() function to skip updating
/// such items.
- int refCount() const { return par_it_.size(); }
+ int refCount() const { return inset_list_.size(); }
/// embedding status of this file
bool embedded() const { return embedded_; }
bool valid_;
/// Current position of the item, used to locate the files. Because one
/// file item can be referred by several Insets, a vector is used.
- std::vector<ParConstIterator> par_it_;
+ std::vector<Inset const *> inset_list_;
};
* \param pit paragraph id.
*/
void registerFile(std::string const & filename, bool embed = false,
- ParConstIterator const & pit = ParConstIterator());
+ Inset const * inset = NULL);
/// scan the buffer and get a list of EmbeddedFile
void update();
void ControlEmbeddedFiles::goTo(EmbeddedFile const & item, int idx)
{
BOOST_ASSERT(idx < item.refCount());
- string const tmp = convert<string>(item.parID(idx));
- kernel().lyxview().dispatch(FuncRequest(LFUN_PARAGRAPH_GOTO, tmp));
+ item.saveBookmark(&kernel().buffer(), idx);
+ kernel().lyxview().dispatch(FuncRequest(LFUN_BOOKMARK_GOTO, "0"));
}
/// pit is the ParConstIterator of the paragraph containing the inset
virtual void addToToc(TocList &, Buffer const &, ParConstIterator const &) const {}
/// report files that can be embedded with the lyx file
- virtual void registerEmbeddedFiles(Buffer const &, EmbeddedFiles &,
- ParConstIterator const &) const {};
+ virtual void registerEmbeddedFiles(Buffer const &, EmbeddedFiles &) const {};
/// Fill keys with BibTeX information
virtual void fillWithBibKeys(Buffer const &,
BiblioInfo &, InsetIterator const &) const { return; }
void InsetExternal::registerEmbeddedFiles(Buffer const &,
- EmbeddedFiles & files, ParConstIterator const & pit) const
+ EmbeddedFiles & files) const
{
- files.registerFile(params_.filename.absFilename(), false, pit);
+ files.registerFile(params_.filename.absFilename(), false, this);
}
///
bool getStatus(Cursor &, FuncRequest const &, FuncStatus &) const;
/// external file can be embedded
- void registerEmbeddedFiles(Buffer const &, EmbeddedFiles &,
- ParConstIterator const &) const;
+ void registerEmbeddedFiles(Buffer const &, EmbeddedFiles &) const;
protected:
InsetExternal(InsetExternal const &);
}
-void InsetGraphics::registerEmbeddedFiles(Buffer const &,
- EmbeddedFiles & files, ParConstIterator const & pit) const
+void InsetGraphics::registerEmbeddedFiles(Buffer const &,
+ EmbeddedFiles & files) const
{
files.registerFile(params().filename.absFilename(),
- false, pit);
+ false, this);
}
///
bool getStatus(Cursor &, FuncRequest const &, FuncStatus &) const;
/// all graphics can be embedded
- void registerEmbeddedFiles(Buffer const &, EmbeddedFiles &, ParConstIterator const &) const;
+ void registerEmbeddedFiles(Buffer const &, EmbeddedFiles &) const;
protected:
InsetGraphics(InsetGraphics const &);
///
void InsetInclude::registerEmbeddedFiles(Buffer const & buffer,
- EmbeddedFiles & files, ParConstIterator const & pit) const
+ EmbeddedFiles & files) const
{
// include and input are temprarily not considered.
if (isVerbatim(params_) || isListings(params_))
files.registerFile(includedFilename(buffer, params_).absFilename(),
- false, pit);
+ false, this);
}
///
void updateLabels(Buffer const & buffer, ParIterator const &);
/// child document can be embedded
- void registerEmbeddedFiles(Buffer const &, EmbeddedFiles &,
- ParConstIterator const &) const;
+ void registerEmbeddedFiles(Buffer const &, EmbeddedFiles &) const;
protected:
InsetInclude(InsetInclude const &);
///