X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetExternal.cpp;h=9b9f85c3b43eb823ffdbebec7c78db09260ce066;hb=2047ea5eb436d98d485bed672ed218f9bd708ce6;hp=f3ea34c011eb735ea1cdfd329cdb190e23c6496e;hpb=d866717ef7503a1373dd1cb3925e1ac97b079192;p=features.git diff --git a/src/insets/InsetExternal.cpp b/src/insets/InsetExternal.cpp index f3ea34c011..9b9f85c3b4 100644 --- a/src/insets/InsetExternal.cpp +++ b/src/insets/InsetExternal.cpp @@ -30,24 +30,26 @@ #include "MetricsInfo.h" #include "OutputParams.h" #include "output_latex.h" +#include "TocBackend.h" #include "frontends/alert.h" #include "frontends/Application.h" #include "graphics/PreviewLoader.h" +#include "support/bind.h" #include "support/convert.h" #include "support/debug.h" #include "support/ExceptionMessage.h" #include "support/filetools.h" #include "support/gettext.h" +#include "support/lassert.h" #include "support/lstrings.h" #include "support/lyxlib.h" -#include "support/Translator.h" - -#include "support/bind.h" +#include "support/TempFile.h" #include +#include using namespace std; using namespace lyx::support; @@ -69,15 +71,20 @@ namespace external { TempName::TempName() { - FileName const tempname = FileName::tempName("lyxext"); // must have an extension for the converter code to work correctly. - tempname_ = FileName(tempname.absFileName() + ".tmp"); + 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 &) +TempName::TempName(TempName const & that) { - tempname_ = TempName()(); + *this = that; } @@ -89,16 +96,27 @@ TempName::~TempName() TempName & TempName::operator=(TempName const & other) { - if (this != &other) - tempname_ = TempName()(); + if (this != &other) { + tempname_.removeFile(); + support::TempFile f("lyxextXXXXXX.tmp"); + f.setAutoRemove(false); + tempname_ = f.name(); + } return *this; } + +support::FileName TempName::operator()() const +{ + return tempname_; +} + } // namespace external InsetExternalParams::InsetExternalParams() : display(true), + preview_mode(PREVIEW_OFF), lyxscale(defaultLyxScale), draft(false) { @@ -265,7 +283,7 @@ bool InsetExternalParams::read(Buffer const & buffer, Lexer & lex) case EX_FILENAME: { lex.eatLine(); string const name = lex.getString(); - filename.set(name, buffer.filePath()); + filename = buffer.getReferencedFileName(name); break; } @@ -286,13 +304,13 @@ bool InsetExternalParams::read(Buffer const & buffer, Lexer & lex) case EX_BOUNDINGBOX: lex.next(); - clipdata.bbox.xl = lex.getInteger(); + clipdata.bbox.xl = Length(lex.getString()); lex.next(); - clipdata.bbox.yb = lex.getInteger(); + clipdata.bbox.yb = Length(lex.getString()); lex.next(); - clipdata.bbox.xr = lex.getInteger(); + clipdata.bbox.xr = Length(lex.getString()); lex.next(); - clipdata.bbox.yt = lex.getInteger(); + clipdata.bbox.yt = Length(lex.getString()); break; case EX_CLIP: @@ -365,6 +383,33 @@ bool InsetExternalParams::read(Buffer const & buffer, Lexer & lex) } +namespace { + +docstring screenLabel(InsetExternalParams const & params, + Buffer const & buffer) +{ + external::Template const * const ptr = + external::getTemplatePtr(params); + if (!ptr) + // FIXME UNICODE + return bformat((_("External template %1$s is not installed")), + from_utf8(params.templatename())); + // FIXME UNICODE + docstring gui = _(ptr->guiName); + gui += ": "; + + if (params.filename.empty()) + gui += "???"; + else + gui += from_utf8(params.filename.relFileName(buffer.filePath())); + + return gui; +} + +} // namespace anon + + + InsetExternal::InsetExternal(Buffer * buf) : Inset(buf), renderer_(new RenderButton) { @@ -374,7 +419,7 @@ InsetExternal::InsetExternal(Buffer * buf) // Mouse hover is not copied and remains empty InsetExternal::InsetExternal(InsetExternal const & other) : Inset(other), - boost::signals::trackable(), + boost::signals2::trackable(), params_(other.params_), renderer_(other.renderer_->clone(this)) {} @@ -392,7 +437,7 @@ InsetExternal::~InsetExternal() } -bool InsetExternal::setMouseHover(BufferView const * bv, bool mouse_hover) +bool InsetExternal::setMouseHover(BufferView const * bv, bool mouse_hover) const { mouse_hover_[bv] = mouse_hover; return true; @@ -453,6 +498,17 @@ bool InsetExternal::getStatus(Cursor & cur, FuncRequest const & cmd, } +void InsetExternal::addToToc(DocIterator const & cpit, bool output_active, + UpdateType) 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)); +} + + bool InsetExternal::showInsetDialog(BufferView * bv) const { bv->showDialog("external", params2string(params(), bv->buffer()), @@ -491,22 +547,6 @@ graphics::Params get_grfx_params(InsetExternalParams const & eparams) return gparams; } - -docstring screenLabel(InsetExternalParams const & params, - Buffer const & buffer) -{ - external::Template const * const ptr = - external::getTemplatePtr(params); - if (!ptr) - // FIXME UNICODE - return bformat((_("External template %1$s is not installed")), - from_utf8(params.templatename())); - // FIXME UNICODE - docstring gui = _(ptr->guiName); - return from_utf8(external::doSubstitution(params, buffer, - to_utf8(gui), false)); -} - } // namespace anon @@ -536,8 +576,7 @@ static void add_preview_and_start_loading(RenderMonitoredPreview & renderer, { InsetExternalParams const & params = inset.params(); - if (RenderPreview::status() != LyXRC::PREVIEW_OFF && - isPreviewWanted(params)) { + if (RenderPreview::previewText() && isPreviewWanted(params)) { renderer.setAbsFile(params.filename); docstring const snippet = latexString(inset); renderer.addPreview(snippet, buffer); @@ -571,7 +610,7 @@ void InsetExternal::setParams(InsetExternalParams const & p) || !lyxrc.display_graphics || params_.preview_mode == PREVIEW_OFF || (params_.preview_mode == PREVIEW_INSTANT - && RenderPreview::status() == LyXRC::PREVIEW_OFF)) { + && !RenderPreview::previewText())) { RenderButton * button_ptr = renderer_->asButton(); if (!button_ptr) { renderer_.reset(new RenderButton); @@ -587,9 +626,8 @@ void InsetExternal::setParams(InsetExternalParams const & p) LASSERT(false, return); break; case PREVIEW_INSTANT: { - RenderMonitoredPreview * preview_ptr = renderer_->asMonitoredPreview(); renderer_.reset(new RenderMonitoredPreview(this)); - preview_ptr = renderer_->asMonitoredPreview(); + RenderMonitoredPreview * preview_ptr = renderer_->asMonitoredPreview(); preview_ptr->fileChanged(bind(&InsetExternal::fileChanged, this)); if (preview_ptr->monitoring()) preview_ptr->stopMonitoring(); @@ -616,7 +654,7 @@ void InsetExternal::fileChanged() const return; RenderMonitoredPreview * const ptr = renderer_->asMonitoredPreview(); - LASSERT(ptr, /**/); + LASSERT(ptr, return); ptr->removePreview(*buffer); add_preview_and_start_loading(*ptr, *this, *buffer); @@ -667,29 +705,33 @@ void InsetExternal::latex(otexstream & os, OutputParams const & runparams) const et.formats.find("PDFLaTeX"); if (cit != et.formats.end()) { - int l = external::writeExternal(params_, "PDFLaTeX", - buffer(), os.os(), - *(runparams.exportdata), - external_in_tmpdir, - dryrun); - os.texrow().newlines(l); + external::writeExternal(params_, "PDFLaTeX", + buffer(), os, + *(runparams.exportdata), + external_in_tmpdir, + dryrun); return; } } - int l = external::writeExternal(params_, "LaTeX", buffer(), os.os(), - *(runparams.exportdata), - external_in_tmpdir, - dryrun); - os.texrow().newlines(l); + external::writeExternal(params_, "LaTeX", buffer(), os, + *(runparams.exportdata), + external_in_tmpdir, + dryrun); } -int InsetExternal::plaintext(odocstream & os, - OutputParams const & runparams) const +int InsetExternal::plaintext(odocstringstream & os, + OutputParams const & runparams, size_t) const { - os << '\n'; // output external material on a new line - external::writeExternal(params_, "Ascii", buffer(), os, + // this is too slow for constant use + if (runparams.for_tooltip) + return 0; + + TexRow texrow; + otexstream ots(os, texrow); + ots << '\n'; // output external material on a new line + external::writeExternal(params_, "Ascii", buffer(), ots, *(runparams.exportdata), false, runparams.dryrun || runparams.inComment); return PLAINTEXT_NEWLINE; @@ -699,9 +741,14 @@ int InsetExternal::plaintext(odocstream & os, int InsetExternal::docbook(odocstream & os, OutputParams const & runparams) const { - return external::writeExternal(params_, "DocBook", buffer(), os, - *(runparams.exportdata), false, - runparams.dryrun || runparams.inComment); + TexRow texrow; + odocstringstream ods; + otexstream ots(ods, texrow); + external::writeExternal(params_, "DocBook", buffer(), ots, + *(runparams.exportdata), false, + runparams.dryrun || runparams.inComment); + os << ods.str(); + return int(count(ods.str().begin(), ods.str().end(), '\n')); } @@ -729,6 +776,7 @@ void InsetExternal::validate(LaTeXFeatures & features) const string format; switch (features.runparams().flavor) { case OutputParams::LATEX: + case OutputParams::DVILUATEX: format = "LaTeX"; break; case OutputParams::LUATEX: @@ -745,6 +793,9 @@ void InsetExternal::validate(LaTeXFeatures & features) const case OutputParams::TEXT: format = "text"; break; + case OutputParams::LYX: + format = "lyx"; + break; } external::Template::Formats::const_iterator cit = et.formats.find(format); @@ -760,7 +811,7 @@ void InsetExternal::validate(LaTeXFeatures & features) const return; } - // FIXME: We don't need that always + // FIXME: We don't need that always, see InsetGraphics features.require("lyxdot"); vector::const_iterator it = cit->second.requirements.begin(); @@ -795,9 +846,9 @@ void InsetExternal::addPreview(DocIterator const & /*inset_pos*/, } -docstring InsetExternal::contextMenuName() const +string InsetExternal::contextMenuName() const { - return from_ascii("context-external"); + return "context-external"; }