X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetExternal.cpp;h=1f0f5f2b770d271dbcedfd52514849cf6c6932f0;hb=22e6659780390a19174d1bf896317a5baf9e40d7;hp=cb86df4fc71a54ec6bc504e2ee7e7177532bdb1e;hpb=3602baa40c283f32fea3dcfde08b12306afe3dab;p=lyx.git diff --git a/src/insets/InsetExternal.cpp b/src/insets/InsetExternal.cpp index cb86df4fc7..1f0f5f2b77 100644 --- a/src/insets/InsetExternal.cpp +++ b/src/insets/InsetExternal.cpp @@ -30,6 +30,8 @@ #include "MetricsInfo.h" #include "OutputParams.h" #include "output_latex.h" +#include "output_xhtml.h" +#include "texstream.h" #include "TocBackend.h" #include "frontends/alert.h" @@ -37,7 +39,6 @@ #include "graphics/PreviewLoader.h" -#include "support/bind.h" #include "support/convert.h" #include "support/debug.h" #include "support/ExceptionMessage.h" @@ -60,7 +61,7 @@ unsigned int const defaultLyxScale = 100; string defaultTemplateName; -} // namespace anon +} // namespace namespace lyx { @@ -69,13 +70,20 @@ namespace Alert = frontend::Alert; namespace external { -TempName::TempName() : tempfile_(new support::TempFile("lyxextXXXXXX.tmp")) +TempName::TempName() { // must have an extension for the converter code to work correctly. + support::TempFile f("lyxextXXXXXX.tmp"); + // Let f go out of scope here and delete the file ourselves in + // ~TempName(), since otherwise external processes would not be able + // to use the file on windows (bug 9925). This is not as safe as + // keeping a support::TempFile member would be, but the best we can do. + f.setAutoRemove(false); + tempname_ = f.name(); } -TempName::TempName(TempName const & that) : tempfile_(0) +TempName::TempName(TempName const & that) { *this = that; } @@ -83,15 +91,18 @@ TempName::TempName(TempName const & that) : tempfile_(0) TempName::~TempName() { - delete tempfile_; + tempname_.removeFile(); } TempName & TempName::operator=(TempName const & other) { if (this != &other) { - delete tempfile_; - tempfile_ = new support::TempFile("lyxextXXXXXX.tmp"); + if (!tempname_.empty()) + tempname_.removeFile(); + support::TempFile f("lyxextXXXXXX.tmp"); + f.setAutoRemove(false); + tempname_ = f.name(); } return *this; } @@ -99,7 +110,7 @@ TempName & TempName::operator=(TempName const & other) support::FileName TempName::operator()() const { - return tempfile_->name(); + return tempname_; } } // namespace external @@ -107,6 +118,7 @@ support::FileName TempName::operator()() const InsetExternalParams::InsetExternalParams() : display(true), + preview_mode(PREVIEW_OFF), lyxscale(defaultLyxScale), draft(false) { @@ -136,7 +148,7 @@ void clearIfNotFound(T & data, external::TransformID value, data = T(); } -} // namespace anon +} // namespace void InsetExternalParams::settemplate(string const & name) @@ -158,7 +170,7 @@ void InsetExternalParams::settemplate(string const & name) clearIfNotFound(resizedata, external::Resize, ids); clearIfNotFound(rotationdata, external::Rotate, ids); - // + // preview_mode = et->preview_mode; } @@ -273,20 +285,26 @@ bool InsetExternalParams::read(Buffer const & buffer, Lexer & lex) case EX_FILENAME: { lex.eatLine(); string const name = lex.getString(); - filename.set(name, buffer.originFilePath()); + filename = buffer.getReferencedFileName(name); break; } - + case EX_DISPLAY: { lex.next(); display = lex.getString() != "false"; break; } - case EX_LYXSCALE: + case EX_LYXSCALE: { lex.next(); - lyxscale = lex.getInteger(); + int const ls = lex.getInteger(); + // negative values are not accepted. + if (ls >= 0) + lyxscale = ls; + else + lex.printError("ExternalInset::read: Wrong lyxscale: $$Token"); break; + } case EX_DRAFT: draft = true; @@ -396,8 +414,7 @@ docstring screenLabel(InsetExternalParams const & params, return gui; } -} // namespace anon - +} // namespace InsetExternal::InsetExternal(Buffer * buf) @@ -409,7 +426,6 @@ InsetExternal::InsetExternal(Buffer * buf) // Mouse hover is not copied and remains empty InsetExternal::InsetExternal(InsetExternal const & other) : Inset(other), - boost::signals::trackable(), params_(other.params_), renderer_(other.renderer_->clone(this)) {} @@ -489,13 +505,12 @@ bool InsetExternal::getStatus(Cursor & cur, FuncRequest const & cmd, void InsetExternal::addToToc(DocIterator const & cpit, bool output_active, - UpdateType) const + UpdateType, TocBackend & backend) const { - DocIterator pit = cpit; - pit.push_back(CursorSlice(const_cast(*this))); - shared_ptr toc = buffer().tocBackend().toc("external"); docstring str = screenLabel(params_, buffer()); - toc->push_back(TocItem(pit, 0, str, output_active)); + TocBuilder & b = backend.builder("external"); + b.pushItem(cpit, str, output_active); + b.pop(); } @@ -509,12 +524,18 @@ bool InsetExternal::showInsetDialog(BufferView * bv) const void InsetExternal::metrics(MetricsInfo & mi, Dimension & dim) const { + if (!isRendererValid()) + updatePreview(); + renderer_->metrics(mi, dim); } void InsetExternal::draw(PainterInfo & pi, int x, int y) const { + if (!isRendererValid()) + updatePreview(); + if (renderer_->asButton()) renderer_->setRenderState(mouse_hover_[pi.base.bv]); renderer_->draw(pi, x, y); @@ -537,7 +558,7 @@ graphics::Params get_grfx_params(InsetExternalParams const & eparams) return gparams; } -} // namespace anon +} // namespace static bool isPreviewWanted(InsetExternalParams const & params) @@ -548,9 +569,8 @@ static bool isPreviewWanted(InsetExternalParams const & params) static docstring latexString(InsetExternal const & inset) { - TexRow texrow; odocstringstream ods; - otexstream os(ods, texrow); + otexstream os(ods); // We don't need to set runparams.encoding since it is not used by // latex(). OutputParams runparams(0); @@ -581,9 +601,22 @@ InsetExternalParams const & InsetExternal::params() const } -void InsetExternal::updatePreview() +bool InsetExternal::isPreviewed() const { - setParams(params_); + return (external::getTemplatePtr(params_) && !params_.filename.empty() + && params_.display + && lyxrc.display_graphics + && params_.preview_mode != PREVIEW_OFF + && (params_.preview_mode != PREVIEW_INSTANT + || RenderPreview::previewText())); +} + + +bool InsetExternal::isRendererValid() const +{ + if (!renderer_->asButton()) + return isPreviewed(); + return !isPreviewed(); } @@ -595,18 +628,19 @@ void InsetExternal::setParams(InsetExternalParams const & p) // will use this. defaultTemplateName = params_.templatename(); - if (!external::getTemplatePtr(params_) || params_.filename.empty() - || !params_.display - || !lyxrc.display_graphics - || params_.preview_mode == PREVIEW_OFF - || (params_.preview_mode == PREVIEW_INSTANT - && !RenderPreview::previewText())) { + updatePreview(); +} + + +void InsetExternal::updatePreview() const +{ + if (!isPreviewed()) { RenderButton * button_ptr = renderer_->asButton(); if (!button_ptr) { renderer_.reset(new RenderButton); button_ptr = renderer_->asButton(); } - button_ptr->update(screenLabel(params_, buffer()), true); + button_ptr->update(screenLabel(params_, buffer()), true, false); return; } @@ -616,14 +650,13 @@ void InsetExternal::setParams(InsetExternalParams const & p) LASSERT(false, return); break; case PREVIEW_INSTANT: { - renderer_.reset(new RenderMonitoredPreview(this)); + renderer_ = make_unique(this); RenderMonitoredPreview * preview_ptr = renderer_->asMonitoredPreview(); - preview_ptr->fileChanged(bind(&InsetExternal::fileChanged, this)); - if (preview_ptr->monitoring()) - preview_ptr->stopMonitoring(); + // This connection is closed at the same time as this is destroyed. + preview_ptr->connect([=]() { fileChanged(); }); add_preview_and_start_loading(*preview_ptr, *this, buffer()); break; - } + } case PREVIEW_GRAPHICS: { RenderGraphic * graphic_ptr = renderer_->asGraphic(); if (!graphic_ptr) { @@ -718,12 +751,12 @@ int InsetExternal::plaintext(odocstringstream & os, if (runparams.for_tooltip) return 0; - TexRow texrow; - otexstream ots(os, texrow); + bool const external_in_tmpdir = !runparams.nice; + bool const dryrun = runparams.dryrun || runparams.inComment; + otexstream ots(os); ots << '\n'; // output external material on a new line external::writeExternal(params_, "Ascii", buffer(), ots, - *(runparams.exportdata), false, - runparams.dryrun || runparams.inComment); + *(runparams.exportdata), external_in_tmpdir, dryrun); return PLAINTEXT_NEWLINE; } @@ -731,23 +764,27 @@ int InsetExternal::plaintext(odocstringstream & os, int InsetExternal::docbook(odocstream & os, OutputParams const & runparams) const { - TexRow texrow; + bool const external_in_tmpdir = !runparams.nice; + bool const dryrun = runparams.dryrun || runparams.inComment; odocstringstream ods; - otexstream ots(ods, texrow); + otexstream ots(ods); external::writeExternal(params_, "DocBook", buffer(), ots, - *(runparams.exportdata), false, - runparams.dryrun || runparams.inComment); + *(runparams.exportdata), external_in_tmpdir, dryrun); os << ods.str(); return int(count(ods.str().begin(), ods.str().end(), '\n')); } -docstring InsetExternal::xhtml(XHTMLStream & /*xs*/, - OutputParams const & /*rp*/) const +docstring InsetExternal::xhtml(XHTMLStream & xs, + OutputParams const & runparams) const { -// external::writeExternal(params_, "XHTML", buffer(), os, -// *(runparams.exportdata), false, -// runparams.dryrun || runparams.inComment); + bool const external_in_tmpdir = !runparams.nice; + bool const dryrun = runparams.dryrun || runparams.inComment; + odocstringstream ods; + otexstream ots(ods); + external::writeExternal(params_, "XHTML", buffer(), ots, + *(runparams.exportdata), external_in_tmpdir, dryrun); + xs << XHTMLStream::ESCAPE_NONE << ods.str(); return docstring(); } @@ -811,10 +848,8 @@ void InsetExternal::validate(LaTeXFeatures & features) const external::TemplateManager & etm = external::TemplateManager::get(); - it = cit->second.preambleNames.begin(); - end = cit->second.preambleNames.end(); - for (; it != end; ++it) { - string const preamble = etm.getPreambleDefByName(*it); + for (string const & name : cit->second.preambleNames) { + docstring const preamble = etm.getPreambleDefByName(name); if (!preamble.empty()) features.addPreambleSnippet(preamble); } @@ -822,7 +857,7 @@ void InsetExternal::validate(LaTeXFeatures & features) const void InsetExternal::addPreview(DocIterator const & /*inset_pos*/, - graphics::PreviewLoader & ploader) const + graphics::PreviewLoader & ploader) const { RenderMonitoredPreview * const ptr = renderer_->asMonitoredPreview(); if (!ptr)