From 2a1a156f472953b50a242875709f4639140b72a8 Mon Sep 17 00:00:00 2001 From: Bo Peng Date: Sun, 9 Sep 2007 07:07:13 +0000 Subject: [PATCH] Embedding: store inset pointer instead of ParConstIterator to enable more accurate navigation in the Embedding dialog git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@20164 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/EmbeddedFiles.cpp | 67 ++++++++++++------- src/EmbeddedFiles.h | 17 +++-- .../controllers/ControlEmbeddedFiles.cpp | 4 +- src/insets/Inset.h | 3 +- src/insets/InsetExternal.cpp | 4 +- src/insets/InsetExternal.h | 3 +- src/insets/InsetGraphics.cpp | 6 +- src/insets/InsetGraphics.h | 2 +- src/insets/InsetInclude.cpp | 4 +- src/insets/InsetInclude.h | 3 +- 10 files changed, 65 insertions(+), 48 deletions(-) diff --git a/src/EmbeddedFiles.cpp b/src/EmbeddedFiles.cpp index bad37e7789..2680f4d563 100644 --- a/src/EmbeddedFiles.cpp +++ b/src/EmbeddedFiles.cpp @@ -16,7 +16,7 @@ #include "Buffer.h" #include "BufferParams.h" #include "Paragraph.h" -#include "ParIterator.h" +#include "InsetIterator.h" #include "debug.h" #include "gettext.h" #include "Format.h" @@ -31,6 +31,9 @@ #include "support/lyxlib.h" #include "support/lstrings.h" +#include "LyX.h" +#include "Session.h" + #include #include #include @@ -67,12 +70,12 @@ using support::makedir; 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); } @@ -82,17 +85,39 @@ string EmbeddedFile::embeddedFile(Buffer const * buf) const } -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); } @@ -107,8 +132,8 @@ string EmbeddedFile::availableFile(Buffer const * buf) const 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; } @@ -219,7 +244,7 @@ bool EmbeddedFiles::enable(bool flag) 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(); @@ -231,7 +256,7 @@ void EmbeddedFiles::registerFile(string const & filename, 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()) @@ -241,7 +266,7 @@ void EmbeddedFiles::registerFile(string const & filename, } // 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_))); } @@ -260,17 +285,9 @@ void EmbeddedFiles::update() 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; diff --git a/src/EmbeddedFiles.h b/src/EmbeddedFiles.h index c256484b40..df8915e6bb 100644 --- a/src/EmbeddedFiles.h +++ b/src/EmbeddedFiles.h @@ -112,7 +112,7 @@ class EmbeddedFile : public support::DocFileName { 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_; } @@ -121,14 +121,17 @@ public: /// 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_; } @@ -160,7 +163,7 @@ private: 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 par_it_; + std::vector inset_list_; }; @@ -186,7 +189,7 @@ public: * \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(); diff --git a/src/frontends/controllers/ControlEmbeddedFiles.cpp b/src/frontends/controllers/ControlEmbeddedFiles.cpp index e73d286642..9f8c948bfb 100644 --- a/src/frontends/controllers/ControlEmbeddedFiles.cpp +++ b/src/frontends/controllers/ControlEmbeddedFiles.cpp @@ -70,8 +70,8 @@ void ControlEmbeddedFiles::dispatchMessage(string const & msg) void ControlEmbeddedFiles::goTo(EmbeddedFile const & item, int idx) { BOOST_ASSERT(idx < item.refCount()); - string const tmp = convert(item.parID(idx)); - kernel().lyxview().dispatch(FuncRequest(LFUN_PARAGRAPH_GOTO, tmp)); + item.saveBookmark(&kernel().buffer(), idx); + kernel().lyxview().dispatch(FuncRequest(LFUN_BOOKMARK_GOTO, "0")); } diff --git a/src/insets/Inset.h b/src/insets/Inset.h index d8c9622fd0..6782a59622 100644 --- a/src/insets/Inset.h +++ b/src/insets/Inset.h @@ -440,8 +440,7 @@ public: /// 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; } diff --git a/src/insets/InsetExternal.cpp b/src/insets/InsetExternal.cpp index 0899229944..ef9afad5f2 100644 --- a/src/insets/InsetExternal.cpp +++ b/src/insets/InsetExternal.cpp @@ -494,9 +494,9 @@ bool InsetExternal::getStatus(Cursor & cur, FuncRequest const & cmd, 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); } diff --git a/src/insets/InsetExternal.h b/src/insets/InsetExternal.h index ac6cc991fa..c0e35531aa 100644 --- a/src/insets/InsetExternal.h +++ b/src/insets/InsetExternal.h @@ -149,8 +149,7 @@ public: /// 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 &); diff --git a/src/insets/InsetGraphics.cpp b/src/insets/InsetGraphics.cpp index 3ff0a61307..a54de14c98 100644 --- a/src/insets/InsetGraphics.cpp +++ b/src/insets/InsetGraphics.cpp @@ -231,11 +231,11 @@ bool InsetGraphics::getStatus(Cursor & cur, FuncRequest const & cmd, } -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); } diff --git a/src/insets/InsetGraphics.h b/src/insets/InsetGraphics.h index ee96bc3b62..98e44a5db2 100644 --- a/src/insets/InsetGraphics.h +++ b/src/insets/InsetGraphics.h @@ -79,7 +79,7 @@ public: /// 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 &); /// diff --git a/src/insets/InsetInclude.cpp b/src/insets/InsetInclude.cpp index ff09039219..1a8ec8713c 100644 --- a/src/insets/InsetInclude.cpp +++ b/src/insets/InsetInclude.cpp @@ -959,12 +959,12 @@ void InsetInclude::updateLabels(Buffer const & buffer, 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); } diff --git a/src/insets/InsetInclude.h b/src/insets/InsetInclude.h index 41d11ab126..c22b2cd61e 100644 --- a/src/insets/InsetInclude.h +++ b/src/insets/InsetInclude.h @@ -105,8 +105,7 @@ public: /// 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 &); /// -- 2.39.2