mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-09 18:31:04 +00:00
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
This commit is contained in:
parent
8ea9c5a440
commit
2a1a156f47
@ -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 <sstream>
|
||||
#include <fstream>
|
||||
#include <utility>
|
||||
@ -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;
|
||||
|
@ -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<ParConstIterator> par_it_;
|
||||
std::vector<Inset const *> 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();
|
||||
|
@ -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<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"));
|
||||
}
|
||||
|
||||
|
||||
|
@ -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; }
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
@ -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 &);
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
@ -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 &);
|
||||
///
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
@ -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 &);
|
||||
///
|
||||
|
Loading…
Reference in New Issue
Block a user