Remove embedding stuff from InsetBibtex.

There might be some header cleanup that can be done here, or some uses of forward declarations and such. This was pretty quick and dirty, just to get it done.



git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@24357 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Richard Heck 2008-04-19 15:52:35 +00:00
parent 31808dd993
commit 5cadecf3f6
11 changed files with 101 additions and 211 deletions

View File

@ -207,7 +207,7 @@ public:
/// A cache for the bibfiles (including bibfiles of loaded child
/// documents), needed for appropriate update of natbib labels.
mutable EmbeddedFileList bibfilesCache_;
mutable support::FileNameList bibfilesCache_;
mutable RefCache ref_cache_;
@ -1388,7 +1388,7 @@ void Buffer::updateBibfilesCache() const
if (it->lyxCode() == BIBTEX_CODE) {
InsetBibtex const & inset =
static_cast<InsetBibtex const &>(*it);
EmbeddedFileList const bibfiles = inset.getBibFiles();
support::FileNameList const bibfiles = inset.getBibFiles();
d->bibfilesCache_.insert(d->bibfilesCache_.end(),
bibfiles.begin(),
bibfiles.end());
@ -1396,7 +1396,7 @@ void Buffer::updateBibfilesCache() const
InsetInclude & inset =
static_cast<InsetInclude &>(*it);
inset.updateBibfilesCache();
EmbeddedFileList const & bibfiles =
support::FileNameList const & bibfiles =
inset.getBibfilesCache(*this);
d->bibfilesCache_.insert(d->bibfilesCache_.end(),
bibfiles.begin(),
@ -1406,7 +1406,7 @@ void Buffer::updateBibfilesCache() const
}
EmbeddedFileList const & Buffer::getBibfilesCache() const
support::FileNameList const & Buffer::getBibfilesCache() const
{
// If this is a child document, use the parent's cache instead.
if (d->parent_buffer)

View File

@ -61,6 +61,7 @@ class WorkAreaManager;
namespace support {
class FileName;
class FileNameList;
}
/** The buffer object.
@ -307,7 +308,7 @@ public:
void updateBibfilesCache() const;
/// Return the cache with all bibfiles in use (including bibfiles
/// of loaded child documents).
EmbeddedFileList const & getBibfilesCache() const;
support::FileNameList const & getBibfilesCache() const;
///
void getLabelList(std::vector<docstring> &) const;

View File

@ -208,9 +208,7 @@ void GuiBibtex::addDatabase()
if (matches.empty()) {
QString label = item->text();
QListWidgetItem * db = new QListWidgetItem(label);
db->setFlags(db->flags() | Qt::ItemIsSelectable
| Qt::ItemIsUserCheckable);
db->setCheckState(Qt::Checked);
db->setFlags(db->flags() | Qt::ItemIsSelectable);
databaseLW->addItem(db);
}
}
@ -223,9 +221,7 @@ void GuiBibtex::addDatabase()
databaseLW->findItems(f, Qt::MatchExactly);
if (matches.empty()) {
QListWidgetItem * db = new QListWidgetItem(f);
db->setFlags(db->flags() | Qt::ItemIsSelectable
| Qt::ItemIsUserCheckable);
db->setCheckState(Qt::Checked);
db->setFlags(db->flags() | Qt::ItemIsSelectable);
databaseLW->addItem(db);
}
}
@ -290,19 +286,14 @@ void GuiBibtex::updateContents()
databaseLW->clear();
docstring bibs = params_["bibfiles"];
docstring embs = params_["embed"];
docstring bib;
docstring emb;
while (!bibs.empty()) {
bibs = split(bibs, bib, ',');
embs = split(embs, emb, ',');
bib = trim(bib);
if (!bib.empty()) {
QListWidgetItem * db = new QListWidgetItem(toqstr(bib));
db->setFlags(db->flags() | Qt::ItemIsSelectable
| Qt::ItemIsUserCheckable);
db->setCheckState(emb.empty() ? Qt::Unchecked : Qt::Checked);
db->setFlags(db->flags() | Qt::ItemIsSelectable);
databaseLW->addItem(db);
}
}
@ -360,28 +351,17 @@ void GuiBibtex::updateContents()
void GuiBibtex::applyView()
{
docstring dbs;
docstring emb;
unsigned int maxCount = databaseLW->count();
Buffer & buf = buffer();
for (unsigned int i = 0; i < maxCount; i++) {
if (i != 0) {
if (i != 0)
dbs += ',';
emb += ',';
}
QString item = databaseLW->item(i)->text();
docstring bibfile = qstring_to_ucs4(item);
dbs += bibfile;
if (databaseLW->item(i)->checkState() == Qt::Checked) {
FileName bibfilepath = InsetBibtex::getBibTeXPath(bibfile, buf);
string inzipName = EmbeddedFile(bibfilepath.absFilename(),
buf.filePath()).inzipName();
emb += from_utf8(inzipName);
}
}
params_["bibfiles"] = dbs;
params_["embed"] = emb;
docstring const bibstyle = qstring_to_ucs4(styleCB->currentText());
bool const bibtotoc = bibtocCB->isChecked();

View File

@ -176,7 +176,7 @@
<string>BibTeX database to use</string>
</property>
<property name="text" >
<string>Databa&amp;ses (select to embed when saved in bundled format)</string>
<string>Databa&amp;ses</string>
</property>
<property name="alignment" >
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>

View File

@ -16,7 +16,6 @@
#include "Buffer.h"
#include "BufferParams.h"
#include "DispatchResult.h"
#include "EmbeddedFiles.h"
#include "Encoding.h"
#include "FuncRequest.h"
#include "LaTeXFeatures.h"
@ -48,30 +47,10 @@ namespace os = support::os;
InsetBibtex::InsetBibtex(InsetCommandParams const & p)
: InsetCommand(p, "bibtex"), bibfiles_()
: InsetCommand(p, "bibtex")
{}
void InsetBibtex::setBuffer(Buffer & buffer)
{
// FIXME We ought to have a buffer.
if (buffer_) {
EmbeddedFileList::iterator it = bibfiles_.begin();
EmbeddedFileList::iterator en = bibfiles_.end();
for (; it != en; ++it) {
try {
*it = it->copyTo(buffer);
} catch (ExceptionMessage const & message) {
Alert::error(message.title_, message.details_);
// failed to embed
it->setEmbed(false);
}
}
}
InsetCommand::setBuffer(buffer);
}
ParamInfo const & InsetBibtex::findInfo(string const & /* cmdName */)
{
static ParamInfo param_info_;
@ -106,8 +85,6 @@ void InsetBibtex::doDispatch(Cursor & cur, FuncRequest & cmd)
}
//
setParams(p);
updateBibFiles();
updateParam();
buffer().updateBibfilesCache();
break;
}
@ -162,11 +139,14 @@ int InsetBibtex::latex(odocstream & os, OutputParams const & runparams) const
// use such filenames.)
// Otherwise, store the (maybe absolute) path to the original,
// unmangled database name.
EmbeddedFileList::const_iterator it = bibfiles_.begin();
EmbeddedFileList::const_iterator it_end = bibfiles_.end();
vector<docstring> bibfilelist = getVectorFromString(getParam("bibfiles"));
vector<docstring>::const_iterator it = bibfilelist.begin();
vector<docstring>::const_iterator en = bibfilelist.end();
odocstringstream dbs;
for (; it != it_end; ++it) {
string utf8input = removeExtension(it->availableFile().absFilename());
bool didone = false;
for (; it != en; ++it) {
string utf8input = to_utf8(*it);
string database =
normalizeName(buffer(), runparams, utf8input, ".bib");
FileName const try_in_file =
@ -196,8 +176,10 @@ int InsetBibtex::latex(odocstream & os, OutputParams const & runparams) const
from_utf8(database));
}
if (it != bibfiles_.begin())
if (didone)
dbs << ',';
else
didone =- true;
// FIXME UNICODE
dbs << from_utf8(latex_path(database));
}
@ -305,9 +287,27 @@ int InsetBibtex::latex(odocstream & os, OutputParams const & runparams) const
}
EmbeddedFileList const & InsetBibtex::getBibFiles() const
support::FileNameList InsetBibtex::getBibFiles() const
{
return bibfiles_;
FileName path(buffer().filePath());
support::PathChanger p(path);
FileNameList vec;
vector<docstring> bibfilelist = getVectorFromString(getParam("bibfiles"));
vector<docstring>::const_iterator it = bibfilelist.begin();
vector<docstring>::const_iterator en = bibfilelist.end();
for (; it != en; ++it) {
FileName const file =
findtexfile(changeExtension(to_utf8(*it), "bib"), "bib");
// If we didn't find a matching file name just fail silently
if (!file.empty())
vec.push_back(file);
}
return vec;
}
namespace {
@ -570,11 +570,11 @@ void InsetBibtex::fillWithBibKeys(BiblioInfo & keylist,
// We don't restrict keys to ASCII in LyX, since our own
// InsetBibitem can generate non-ASCII keys, and nonstandard
// 8bit clean bibtex forks exist.
EmbeddedFileList const & files = getBibFiles();
EmbeddedFileList::const_iterator it = files.begin();
EmbeddedFileList::const_iterator en = files.end();
support::FileNameList const & files = getBibFiles();
support::FileNameList::const_iterator it = files.begin();
support::FileNameList::const_iterator en = files.end();
for (; it != en; ++ it) {
idocfstream ifs(it->availableFile().toFilesystemEncoding().c_str(),
idocfstream ifs(it->toFilesystemEncoding().c_str(),
ios_base::in, buffer().params().encoding().iconvName());
char_type ch;
@ -718,31 +718,33 @@ FileName InsetBibtex::getBibTeXPath(docstring const & filename, Buffer const & b
bool InsetBibtex::addDatabase(docstring const & db)
{
FileName const texPath = getBibTeXPath(db, buffer());
EmbeddedFileList::const_iterator efp =
bibfiles_.findFile(texPath.absFilename());
if (efp != bibfiles_.end())
//already have it
return false;
EmbeddedFile file(texPath.absFilename(), buffer().filePath());
bibfiles_.push_back(file);
updateParam();
docstring bibfiles = getParam("bibfiles");
if (tokenPos(bibfiles, ',', db) == -1) {
if (!bibfiles.empty())
bibfiles += ',';
setParam("bibfiles", bibfiles + db);
return true;
}
return false;
}
bool InsetBibtex::delDatabase(docstring const & db)
{
FileName const texPath = getBibTeXPath(db, buffer());
EmbeddedFileList::iterator efp =
bibfiles_.findFile(texPath.absFilename());
if (efp == bibfiles_.end())
// don't have it
docstring bibfiles = getParam("bibfiles");
if (contains(bibfiles, db)) {
int const n = tokenPos(bibfiles, ',', db);
docstring bd = db;
if (n > 0) {
// this is not the first database
docstring tmp = ',' + bd;
setParam("bibfiles", subst(bibfiles, tmp, docstring()));
} else if (n == 0)
// this is the first (or only) database
setParam("bibfiles", split(bibfiles, bd, ','));
else
return false;
bibfiles_.erase(efp);
updateParam();
}
return true;
}
@ -754,103 +756,4 @@ void InsetBibtex::validate(LaTeXFeatures & features) const
}
void InsetBibtex::updateBibFiles() const
{
// need to do this to keep old info while also not
// copying over any files that have been deleted.
EmbeddedFileList oldlist = bibfiles_;
bibfiles_.clear();
docstring bibfile;
docstring embfile;
docstring bibfiles = getParam("bibfiles");
docstring embfiles = getParam("embed");
bibfiles = split(bibfiles, bibfile, ',');
embfiles = split(embfiles, embfile, ',');
while (!bibfile.empty()) {
FileName bib = getBibTeXPath(bibfile, buffer());
EmbeddedFileList::iterator efp = oldlist.findFile(bib.absFilename());
if (efp != oldlist.end()) {
// already have this one, but embedding status may have been changed
bool old_status = efp->embedded();
bool new_status = !embfile.empty();
efp->setEmbed(new_status);
try {
// copy file if embedding status changed.
efp->enable(buffer().embedded(), buffer(), old_status != new_status);
} catch (ExceptionMessage const & message) {
Alert::error(message.title_, message.details_);
// failed to change embeddeing status
efp->setEmbed(old_status);
}
bibfiles_.push_back(*efp);
} else {
EmbeddedFile file(bib.absFilename(), buffer().filePath());
file.setEmbed(!embfile.empty());
try {
file.enable(buffer().embedded(), buffer(), true);
} catch (ExceptionMessage const & message) {
Alert::error(message.title_, message.details_);
// failed to embed
file.setEmbed(false);
}
bibfiles_.push_back(file);
}
// Get next file name
bibfiles = split(bibfiles, bibfile, ',');
embfiles = split(embfiles, embfile, ',');
}
}
void InsetBibtex::updateParam()
{
docstring bibfiles;
docstring embed;
bool first = true;
EmbeddedFileList::iterator it = bibfiles_.begin();
EmbeddedFileList::iterator en = bibfiles_.end();
for (; it != en; ++it) {
if (!first) {
bibfiles += ',';
embed += ',';
} else
first = false;
bibfiles += from_utf8(it->outputFilename(buffer().filePath()));
if (it->embedded())
embed += from_utf8(it->inzipName());
}
setParam("bibfiles", bibfiles);
}
void InsetBibtex::registerEmbeddedFiles(EmbeddedFileList & files) const
{
if (bibfiles_.empty())
updateBibFiles();
EmbeddedFileList::const_iterator it = bibfiles_.begin();
EmbeddedFileList::const_iterator en = bibfiles_.end();
for (; it != en; ++it)
files.registerFile(*it, this, buffer());
}
void InsetBibtex::updateEmbeddedFile(EmbeddedFile const & file)
{
// look for the item and update status
string const filename = file.absFilename();
EmbeddedFileList::iterator it = bibfiles_.findFile(filename);
if (it == bibfiles_.end())
return;
*it = file;
updateParam();
}
} // namespace lyx

View File

@ -16,6 +16,8 @@
#include "EmbeddedFiles.h"
#include "InsetCommand.h"
#include "support/FileNameList.h"
#include <map>
namespace lyx {
@ -28,8 +30,6 @@ public:
///
InsetBibtex(InsetCommandParams const &);
///
virtual void setBuffer(Buffer & buffer);
///
docstring screenLabel() const;
///
EDITABLE editable() const { return IS_EDITABLE; }
@ -42,7 +42,7 @@ public:
///
void fillWithBibKeys(BiblioInfo &, InsetIterator const &) const;
///
EmbeddedFileList const & getBibFiles() const;
support::FileNameList getBibFiles() const;
///
bool addDatabase(docstring const &);
///
@ -56,24 +56,14 @@ public:
///
static bool isCompatibleCommand(std::string const & s)
{ return s == "bibtex"; }
/// update bibfiles and embed from bibfiles_
void updateParam();
/// look up the path to the file using TeX
static support::FileName
getBibTeXPath(docstring const & filename, Buffer const & buf);
private:
///
void updateBibFiles() const;
///
void registerEmbeddedFiles(EmbeddedFileList &) const;
///
void updateEmbeddedFile(EmbeddedFile const & file);
///
void doDispatch(Cursor & cur, FuncRequest & cmd);
///
Inset * clone() const { return new InsetBibtex(*this); }
/// embedded bib files
mutable EmbeddedFileList bibfiles_;
};

View File

@ -17,7 +17,6 @@
#include "buffer_funcs.h"
#include "BufferParams.h"
#include "DispatchResult.h"
#include "EmbeddedFiles.h"
#include "FuncRequest.h"
#include "LaTeXFeatures.h"
#include "ParIterator.h"
@ -25,6 +24,7 @@
#include "support/debug.h"
#include "support/docstream.h"
#include "support/FileNameList.h"
#include "support/gettext.h"
#include "support/lstrings.h"
@ -142,15 +142,15 @@ docstring complexLabel(Buffer const & buffer,
static CachedMap cached_keys;
// and cache the timestamp of the bibliography files.
static map<EmbeddedFile, time_t> bibfileStatus;
static map<FileName, time_t> bibfileStatus;
BiblioInfo biblist;
EmbeddedFileList const & bibfilesCache = buffer.getBibfilesCache();
support::FileNameList const & bibfilesCache = buffer.getBibfilesCache();
// compare the cached timestamps with the actual ones.
bool changed = false;
EmbeddedFileList::const_iterator ei = bibfilesCache.begin();
EmbeddedFileList::const_iterator en = bibfilesCache.end();
support::FileNameList::const_iterator ei = bibfilesCache.begin();
support::FileNameList::const_iterator en = bibfilesCache.end();
for (; ei != en; ++ ei) {
time_t lastw = ei->lastModified();
if (lastw != bibfileStatus[*ei]) {

View File

@ -704,17 +704,17 @@ void InsetInclude::updateBibfilesCache()
}
EmbeddedFileList const &
support::FileNameList const &
InsetInclude::getBibfilesCache(Buffer const & buffer) const
{
Buffer * const tmp = getChildBuffer(buffer, params());
if (tmp) {
tmp->setParent(0);
EmbeddedFileList const & cache = tmp->getBibfilesCache();
support::FileNameList const & cache = tmp->getBibfilesCache();
tmp->setParent(&buffer);
return cache;
}
static EmbeddedFileList const empty;
static support::FileNameList const empty;
return empty;
}

View File

@ -19,7 +19,8 @@
#include "Counters.h"
#include "InsetCommandParams.h"
#include "RenderButton.h"
#include "EmbeddedFiles.h"
#include "support/FileNameList.h"
#include <boost/scoped_ptr.hpp>
@ -31,10 +32,6 @@ class InsetLabel;
class LaTeXFeatures;
class RenderMonitoredPreview;
namespace support {
class FileNameList;
}
/// for including tex/lyx files
class InsetInclude : public InsetCommand {
public:
@ -72,7 +69,7 @@ public:
* Return an empty vector if the child doc is not loaded.
* \param buffer the Buffer containing this inset.
*/
EmbeddedFileList const &
support::FileNameList const &
getBibfilesCache(Buffer const & buffer) const;
///
EDITABLE editable() const { return IS_EDITABLE; }

View File

@ -592,6 +592,24 @@ int tokenPos(string const & a, char delim, string const & tok)
}
// this could probably be faster and/or cleaner, but it seems to work (JMarc)
// rewritten to use new string (Lgb)
int tokenPos(docstring const & a, char_type delim, docstring const & tok)
{
int i = 0;
docstring str = a;
docstring tmptok;
while (!str.empty()) {
str = split(str, tmptok, delim);
if (tok == tmptok)
return i;
++i;
}
return -1;
}
namespace {
/// Substitute all \a oldchar with \a newchar

View File

@ -152,6 +152,7 @@ docstring const token(docstring const & a, char_type delim, int n);
\endcode
*/
int tokenPos(std::string const & a, char delim, std::string const & tok);
int tokenPos(docstring const & a, char_type delim, docstring const & tok);
/// Substitute all \a oldchar with \a newchar