using std::endl;
using std::string;
-using std::auto_ptr;
using std::istringstream;
using std::ostream;
using std::ostringstream;
InsetInclude::InsetInclude(InsetCommandParams const & p)
: params_(p), include_label(uniqueID()),
preview_(new RenderMonitoredPreview(this)),
- set_label_(false), counter_(0)
+ set_label_(false)
{
preview_->fileChanged(boost::bind(&InsetInclude::fileChanged, this));
}
params_(other.params_),
include_label(other.include_label),
preview_(new RenderMonitoredPreview(this)),
- set_label_(false), counter_(0)
+ set_label_(false)
{
preview_->fileChanged(boost::bind(&InsetInclude::fileChanged, this));
}
if (par_old.getParamValue("label") !=
par_new.getParamValue("label")
&& !par_new.getParamValue("label").empty())
- cur.bv().buffer()->changeRefsIfUnique(
+ cur.bv().buffer().changeRefsIfUnique(
from_utf8(par_old.getParamValue("label")),
from_utf8(par_new.getParamValue("label")),
Inset::REF_CODE);
}
-auto_ptr<Inset> InsetInclude::doClone() const
+Inset * InsetInclude::clone() const
{
- return auto_ptr<Inset>(new InsetInclude(*this));
+ return new InsetInclude(*this);
}
switch (type(params_)) {
case INPUT:
- temp += buf.B_("Input");
+ temp = buf.B_("Input");
break;
case VERB:
- temp += buf.B_("Verbatim Input");
+ temp = buf.B_("Verbatim Input");
break;
case VERBAST:
- temp += buf.B_("Verbatim Input*");
+ temp = buf.B_("Verbatim Input*");
break;
case INCLUDE:
- temp += buf.B_("Include");
+ temp = buf.B_("Include");
break;
case LISTINGS: {
- if (counter_ > 0)
- temp += buf.B_("Program Listing ") + convert<docstring>(counter_);
- else
- temp += buf.B_("Program Listing");
- break;
+ temp = listings_label_;
}
}
return childBuffer;
}
+} // namespace anon
/// return true if the file is or got loaded.
-bool loadIfNeeded(Buffer const & buffer, InsetCommandParams const & params)
+Buffer * loadIfNeeded(Buffer const & parent, InsetCommandParams const & params)
{
if (isVerbatim(params) || isListings(params))
- return false;
+ return 0;
+
+ string const parent_filename = parent.fileName();
+ FileName const included_file = makeAbsPath(to_utf8(params["filename"]),
+ onlyPath(parent_filename));
- FileName const included_file = includedFilename(buffer, params);
if (!isLyXFilename(included_file.absFilename()))
- return false;
+ return 0;
- Buffer * buf = theBufferList().getBuffer(included_file.absFilename());
- if (!buf) {
+ Buffer * child = theBufferList().getBuffer(included_file.absFilename());
+ if (!child) {
// the readonly flag can/will be wrong, not anymore I think.
if (!fs::exists(included_file.toFilesystemEncoding()))
- return false;
- if (use_gui) {
- lyx::dispatch(FuncRequest(LFUN_BUFFER_CHILD_OPEN,
- included_file.absFilename() + "|true"));
- buf = theBufferList().getBuffer(included_file.absFilename());
- }
- else {
- buf = theBufferList().newBuffer(included_file.absFilename());
- if (!loadLyXFile(buf, included_file)) {
- //close the buffer we just opened
- theBufferList().close(buf, false);
- return false;
- }
+ return 0;
+
+ child = theBufferList().newBuffer(included_file.absFilename());
+ if (!loadLyXFile(child, included_file)) {
+ //close the buffer we just opened
+ theBufferList().close(child, false);
+ return 0;
}
- return buf;
}
- buf->setParentName(parentFilename(buffer));
- return true;
+ child->setParentName(parent_filename);
+ return child;
}
-} // namespace anon
-
-
int InsetInclude::latex(Buffer const & buffer, odocstream & os,
OutputParams const & runparams) const
{
Buffer * tmp = theBufferList().getBuffer(included_file.absFilename());
- if (tmp->params().textclass != m_buffer->params().textclass) {
+ if (tmp->params().getBaseClass() != m_buffer->params().getBaseClass()) {
// FIXME UNICODE
docstring text = bformat(_("Included file `%1$s'\n"
"has textclass `%2$s'\n"
Alert::warning(_("Different textclasses"), text);
//return 0;
}
+
+ // Make sure modules used in child are all included in master
+ //FIXME It might be worth loading the children's modules into the master
+ //over in BufferParams rather than doing this check.
+ vector<string> const masterModules = m_buffer->params().getModules();
+ vector<string> const childModules = tmp->params().getModules();
+ vector<string>::const_iterator it = childModules.begin();
+ vector<string>::const_iterator end = childModules.end();
+ for (; it != end; ++it) {
+ string const module = *it;
+ vector<string>::const_iterator found =
+ find(masterModules.begin(), masterModules.end(), module);
+ if (found != masterModules.end()) {
+ docstring text = bformat(_("Included file `%1$s'\n"
+ "uses module `%2$s'\n"
+ "which is not used in parent file."),
+ makeDisplayPath(included_file.absFilename()), from_utf8(module));
+ Alert::warning(_("Module not found"), text);
+ }
+ }
tmp->markDepClean(m_buffer->temppath());
-#ifdef WITH_WARNINGS
-#warning handle non existing files
-#warning Second argument is irrelevant!
+// FIXME: handle non existing files
+// FIXME: Second argument is irrelevant!
// since only_body is true, makeLaTeXFile will not look at second
// argument. Should we set it to string(), or should makeLaTeXFile
// make use of it somehow? (JMarc 20031002)
-#endif
// The included file might be written in a different encoding
Encoding const * const oldEnc = runparams.encoding;
runparams.encoding = &tmp->params().encoding();
void InsetInclude::fillWithBibKeys(Buffer const & buffer,
- std::vector<std::pair<string, docstring> > & keys) const
+ BiblioInfo & keys, InsetIterator const & /*di*/) const
{
if (loadIfNeeded(buffer, params_)) {
string const included_file = includedFilename(buffer, params_).absFilename();
Buffer * tmp = theBufferList().getBuffer(included_file);
+ //FIXME This is kind of a dirty hack and should be made reasonable.
tmp->setParentName("");
- tmp->fillWithBibKeys(keys);
+ keys.fillWithBibKeys(tmp);
tmp->setParentName(parentFilename(buffer));
}
}
bool InsetInclude::metrics(MetricsInfo & mi, Dimension & dim) const
{
- BOOST_ASSERT(mi.base.bv && mi.base.bv->buffer());
+ BOOST_ASSERT(mi.base.bv);
bool use_preview = false;
if (RenderPreview::status() != LyXRC::PREVIEW_OFF) {
graphics::PreviewImage const * pimage =
- preview_->getPreviewImage(*mi.base.bv->buffer());
+ preview_->getPreviewImage(mi.base.bv->buffer());
use_preview = pimage && pimage->image();
}
} else {
if (!set_label_) {
set_label_ = true;
- button_.update(getScreenLabel(*mi.base.bv->buffer()),
+ button_.update(getScreenLabel(mi.base.bv->buffer()),
true);
}
button_.metrics(mi, dim);
{
setPosCache(pi, x, y);
- BOOST_ASSERT(pi.base.bv && pi.base.bv->buffer());
+ BOOST_ASSERT(pi.base.bv);
bool use_preview = false;
if (RenderPreview::status() != LyXRC::PREVIEW_OFF) {
graphics::PreviewImage const * pimage =
- preview_->getPreviewImage(*pi.base.bv->buffer());
+ preview_->getPreviewImage(pi.base.bv->buffer());
use_preview = pimage && pimage->image();
}
}
-void InsetInclude::updateLabels(Buffer const & buffer) const
+void InsetInclude::updateLabels(Buffer const & buffer,
+ ParIterator const &)
{
Buffer const * const childbuffer = getChildBuffer(buffer, params_);
- if (!childbuffer)
- return;
-
- lyx::updateLabels(*childbuffer, true);
+ if (childbuffer)
+ lyx::updateLabels(*childbuffer, true);
+ else if (isListings(params_)) {
+ InsetListingsParams const par = params_.getOptions();
+ if (par.getParamValue("caption").empty())
+ listings_label_.clear();
+ else {
+ Counters & counters = buffer.params().getTextClass().counters();
+ docstring const cnt = from_ascii("listing");
+ if (counters.hasCounter(cnt)) {
+ counters.step(cnt);
+ listings_label_ = buffer.B_("Program Listing ") + convert<docstring>(counters.value(cnt));
+ } else
+ listings_label_ = buffer.B_("Program Listing");
+ }
+ }
}
-void InsetInclude::updateCounter(Counters & counters)
+void InsetInclude::registerEmbeddedFiles(Buffer const & buffer,
+ EmbeddedFiles & files, ParConstIterator const & pit) const
{
- if (!isListings(params_))
- return;
-
- InsetListingsParams const par = params_.getOptions();
- if (par.getParamValue("caption").empty())
- counter_ = 0;
- else {
- counters.step(from_ascii("listing"));
- counter_ = counters.value(from_ascii("listing"));
- }
+ // include and input are temprarily not considered.
+ if (isVerbatim(params_) || isListings(params_))
+ files.registerFile(includedFilename(buffer, params_).absFilename(),
+ EmbeddedFile::AUTO, pit);
}