X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2Finsetexternal.C;h=522ccc6081e87c501425601b03f114922b1ad5ab;hb=342cdf432246110db37bee4e0aebb4b72c933ddb;hp=c07713af02fd7a8c4d833e99e90d804ae28b6129;hpb=afc9aaf6eb68127aecbbade60bcf101d502285df;p=lyx.git diff --git a/src/insets/insetexternal.C b/src/insets/insetexternal.C index c07713af02..522ccc6081 100644 --- a/src/insets/insetexternal.C +++ b/src/insets/insetexternal.C @@ -19,15 +19,18 @@ #include "buffer.h" #include "BufferView.h" +#include "cursor.h" #include "debug.h" +#include "dispatchresult.h" +#include "exporter.h" #include "funcrequest.h" #include "gettext.h" #include "LaTeXFeatures.h" -#include "latexrunparams.h" #include "lyx_main.h" #include "lyxlex.h" #include "lyxrc.h" #include "metricsinfo.h" +#include "outputparams.h" #include "frontends/lyx_gui.h" #include "frontends/LyXView.h" @@ -38,12 +41,12 @@ #include "support/filetools.h" #include "support/lstrings.h" #include "support/lyxlib.h" -#include "support/tostr.h" +#include "support/convert.h" #include "support/translator.h" #include -#include "support/std_sstream.h" +#include namespace support = lyx::support; namespace external = lyx::external; @@ -62,7 +65,9 @@ namespace { external::DisplayType const defaultDisplayType = external::NoDisplay; -unsigned int defaultLyxScale = 100; +unsigned int const defaultLyxScale = 100; + +string defaultTemplateName = "RasterImage"; } // namespace anon @@ -73,6 +78,7 @@ namespace external { TempName::TempName() { tempname_ = support::tempName(string(), "lyxext"); + // FIXME: This is unsafe support::unlink(tempname_); // must have an extension for the converter code to work correctly. tempname_ += ".tmp"; @@ -120,7 +126,7 @@ Translator const initTranslator() } // namespace anon -Translator const & displayTranslator() +Translator const & displayTranslator() { static Translator const translator = initTranslator(); @@ -133,7 +139,9 @@ Translator const & displayTranslator() InsetExternalParams::InsetExternalParams() : display(defaultDisplayType), - lyxscale(defaultLyxScale) + lyxscale(defaultLyxScale), + draft(false), + templatename_(defaultTemplateName) {} @@ -193,7 +201,10 @@ void InsetExternalParams::write(Buffer const & buffer, ostream & os) const << '\n'; if (lyxscale != defaultLyxScale) - os << "\tlyxscale " << tostr(lyxscale) << '\n'; + os << "\tlyxscale " << convert(lyxscale) << '\n'; + + if (draft) + os << "\tdraft\n"; if (!clipdata.bbox.empty()) os << "\tboundingBox " << clipdata.bbox << '\n'; @@ -209,7 +220,7 @@ void InsetExternalParams::write(Buffer const & buffer, ostream & os) const } if (!rotationdata.no_rotation()) { - os << "\trotateAngle " << rotationdata.angle() << '\n'; + os << "\trotateAngle " << rotationdata.adjAngle() << '\n'; if (rotationdata.origin() != external::RotationData::DEFAULT) os << "\trotateOrigin " << rotationdata.originString() << '\n'; @@ -217,9 +228,9 @@ void InsetExternalParams::write(Buffer const & buffer, ostream & os) const if (!resizedata.no_resize()) { using support::float_equal; - - if (!float_equal(resizedata.scale, 0.0, 0.05)) { - if (!float_equal(resizedata.scale, 100.0, 0.05)) + double const scl = convert(resizedata.scale); + if (!float_equal(scl, 0.0, 0.05)) { + if (!float_equal(scl, 100.0, 0.05)) os << "\tscale " << resizedata.scale << '\n'; } else { @@ -243,6 +254,7 @@ bool InsetExternalParams::read(Buffer const & buffer, LyXLex & lex) EX_FILENAME, EX_DISPLAY, EX_LYXSCALE, + EX_DRAFT, EX_BOUNDINGBOX, EX_CLIP, EX_EXTRA, @@ -260,6 +272,7 @@ bool InsetExternalParams::read(Buffer const & buffer, LyXLex & lex) { "boundingBox", EX_BOUNDINGBOX }, { "clip", EX_CLIP }, { "display", EX_DISPLAY}, + { "draft", EX_DRAFT}, { "extra", EX_EXTRA }, { "filename", EX_FILENAME}, { "height", EX_HEIGHT }, @@ -303,6 +316,10 @@ bool InsetExternalParams::read(Buffer const & buffer, LyXLex & lex) lyxscale = lex.getInteger(); break; + case EX_DRAFT: + draft = true; + break; + case EX_BOUNDINGBOX: lex.next(); clipdata.bbox.xl = lex.getInteger(); @@ -337,7 +354,7 @@ bool InsetExternalParams::read(Buffer const & buffer, LyXLex & lex) case EX_ROTATEANGLE: lex.next(); - rotationdata.angle(lex.getFloat()); + rotationdata.angle = lex.getString(); break; case EX_ROTATEORIGIN: @@ -347,7 +364,7 @@ bool InsetExternalParams::read(Buffer const & buffer, LyXLex & lex) case EX_SCALE: lex.next(); - resizedata.scale = lex.getFloat(); + resizedata.scale = lex.getString(); break; case EX_WIDTH: @@ -371,7 +388,7 @@ bool InsetExternalParams::read(Buffer const & buffer, LyXLex & lex) } if (!found_end) - lex.printError("ExternalInset::read: Missing \\end_inset."); + lex.printError("ExternalInsetParams::read: Missing \\end_inset."); // This is a trick to make sure that the data are self-consistent. settemplate(templatename_); @@ -394,21 +411,11 @@ InsetExternal::InsetExternal(InsetExternal const & other) : InsetOld(other), boost::signals::trackable(), params_(other.params_), - renderer_(other.renderer_->clone()) -{ - if (renderer_->asMonitoredPreview() != 0) { - RenderMonitoredPreview * const ptr = renderer_->asMonitoredPreview(); - ptr->connect(boost::bind(&InsetExternal::statusChanged, this)); - ptr->fileChanged(boost::bind(&InsetExternal::fileChanged, this)); - - } else if (renderer_->asGraphic() != 0 ) { - RenderGraphic * const ptr = renderer_->asGraphic(); - ptr->connect(boost::bind(&InsetExternal::statusChanged, this)); - } -} + renderer_(other.renderer_->clone(this)) +{} -auto_ptr InsetExternal::clone() const +auto_ptr InsetExternal::doClone() const { return auto_ptr(new InsetExternal(*this)); } @@ -426,47 +433,46 @@ void InsetExternal::statusChanged() const } -dispatch_result -InsetExternal::priv_dispatch(FuncRequest const & cmd, idx_type &, pos_type &) +void InsetExternal::doDispatch(LCursor & cur, FuncRequest & cmd) { switch (cmd.action) { case LFUN_EXTERNAL_EDIT: { - BOOST_ASSERT(cmd.view()); - - Buffer const & buffer = *cmd.view()->buffer(); + Buffer const & buffer = cur.buffer(); InsetExternalParams p; InsetExternalMailer::string2params(cmd.argument, buffer, p); external::editExternal(p, buffer); - return DISPATCHED_NOUPDATE; + break; } case LFUN_INSET_MODIFY: { - BOOST_ASSERT(cmd.view()); - - Buffer const & buffer = *cmd.view()->buffer(); + Buffer const & buffer = cur.buffer(); InsetExternalParams p; InsetExternalMailer::string2params(cmd.argument, buffer, p); setParams(p, buffer); - cmd.view()->updateInset(this); - return DISPATCHED; + break; } case LFUN_INSET_DIALOG_UPDATE: - InsetExternalMailer(*this).updateDialog(cmd.view()); - return DISPATCHED; + InsetExternalMailer(*this).updateDialog(&cur.bv()); + break; case LFUN_MOUSE_RELEASE: - case LFUN_INSET_EDIT: - InsetExternalMailer(*this).showDialog(cmd.view()); - return DISPATCHED; + InsetExternalMailer(*this).showDialog(&cur.bv()); + break; default: - return UNDISPATCHED; + InsetBase::doDispatch(cur, cmd); } } +void InsetExternal::edit(LCursor & cur, bool) +{ + InsetExternalMailer(*this).showDialog(&cur.bv()); +} + + void InsetExternal::metrics(MetricsInfo & mi, Dimension & dim) const { renderer_->metrics(mi, dim); @@ -476,6 +482,7 @@ void InsetExternal::metrics(MetricsInfo & mi, Dimension & dim) const void InsetExternal::draw(PainterInfo & pi, int x, int y) const { + setPosCache(pi, x, y); renderer_->draw(pi, x, y); } @@ -497,7 +504,7 @@ RenderType getRenderType(InsetExternalParams const & p) return RENDERBUTTON; if (p.display == external::PreviewDisplay) { - if (RenderPreview::activated()) + if (RenderPreview::status() != LyXRC::PREVIEW_OFF) return RENDERPREVIEW; return RENDERBUTTON; } @@ -517,7 +524,7 @@ graphics::Params get_grfx_params(InsetExternalParams const & eparams) gparams.scale = eparams.lyxscale; if (eparams.clipdata.clip) gparams.bb = eparams.clipdata.bbox; - gparams.angle = eparams.rotationdata.angle(); + gparams.angle = convert(eparams.rotationdata.adjAngle()); switch (eparams.display) { case external::DefaultDisplay: @@ -559,7 +566,9 @@ string const getScreenLabel(InsetExternalParams const & params, return external::doSubstitution(params, buffer, ptr->guiName); } -void add_preview(RenderMonitoredPreview &, InsetExternal const &, Buffer const &); +void add_preview_and_start_loading(RenderMonitoredPreview &, + InsetExternal const &, + Buffer const &); } // namespace anon @@ -575,12 +584,16 @@ void InsetExternal::setParams(InsetExternalParams const & p, { params_ = p; + // Subsequent calls to the InsetExternal::Params default constructor + // will use this. + defaultTemplateName = params_.templatename(); + switch (getRenderType(params_)) { case RENDERBUTTON: { RenderButton * button_ptr = renderer_->asButton(); if (!button_ptr) { - button_ptr = new RenderButton; - renderer_.reset(button_ptr); + renderer_.reset(new RenderButton); + button_ptr = renderer_->asButton(); } button_ptr->update(getScreenLabel(params_, buffer), true); @@ -589,10 +602,8 @@ void InsetExternal::setParams(InsetExternalParams const & p, } case RENDERGRAPHIC: { RenderGraphic * graphic_ptr = renderer_->asGraphic(); if (!graphic_ptr) { - graphic_ptr = new RenderGraphic; - graphic_ptr->connect( - boost::bind(&InsetExternal::statusChanged, this)); - renderer_.reset(graphic_ptr); + renderer_.reset(new RenderGraphic(this)); + graphic_ptr = renderer_->asGraphic(); } graphic_ptr->update(get_grfx_params(params_)); @@ -603,17 +614,15 @@ void InsetExternal::setParams(InsetExternalParams const & p, RenderMonitoredPreview * preview_ptr = renderer_->asMonitoredPreview(); if (!preview_ptr) { - preview_ptr = new RenderMonitoredPreview; - preview_ptr->connect( - boost::bind(&InsetExternal::statusChanged, this)); + renderer_.reset(new RenderMonitoredPreview(this)); + preview_ptr = renderer_->asMonitoredPreview(); preview_ptr->fileChanged( boost::bind(&InsetExternal::fileChanged, this)); - renderer_.reset(preview_ptr); } if (preview_ptr->monitoring()) preview_ptr->stopMonitoring(); - add_preview(*preview_ptr, *this, buffer); + add_preview_and_start_loading(*preview_ptr, *this, buffer); break; } @@ -632,8 +641,7 @@ void InsetExternal::fileChanged() const Buffer const & buffer = *buffer_ptr; ptr->removePreview(buffer); - add_preview(*ptr, *this, buffer); - ptr->startLoading(buffer); + add_preview_and_start_loading(*ptr, *this, buffer); } @@ -652,18 +660,24 @@ void InsetExternal::read(Buffer const & buffer, LyXLex & lex) int InsetExternal::latex(Buffer const & buf, ostream & os, - LatexRunParams const & runparams) const + OutputParams const & runparams) const { + if (params_.draft) { + os << "\\fbox{\\ttfamily{}" + << params_.filename.outputFilename(buf.filePath()) + << "}\n"; + return 1; + } + // "nice" means that the buffer is exported to LaTeX format but not // run through the LaTeX compiler. // If we're running through the LaTeX compiler, we should write the // generated files in the bufer's temporary directory. - bool const external_in_tmpdir = - lyxrc.use_tempdir && !buf.temppath().empty() && !runparams.nice; + bool const external_in_tmpdir = !runparams.nice; // If the template has specified a PDFLaTeX output, then we try and // use that. - if (runparams.flavor == LatexRunParams::PDFLATEX) { + if (runparams.flavor == OutputParams::PDFLATEX) { external::Template const * const et_ptr = external::getTemplatePtr(params_); if (!et_ptr) @@ -674,34 +688,45 @@ int InsetExternal::latex(Buffer const & buf, ostream & os, et.formats.find("PDFLaTeX"); if (cit != et.formats.end()) return external::writeExternal(params_, "PDFLaTeX", - buf, os, external_in_tmpdir); + buf, os, + *(runparams.exportdata), + external_in_tmpdir); } - - return external::writeExternal(params_, "LaTeX", - buf, os, external_in_tmpdir); + return external::writeExternal(params_, "LaTeX", buf, os, + *(runparams.exportdata), + external_in_tmpdir); } -int InsetExternal::ascii(Buffer const & buf, ostream & os, int) const +int InsetExternal::plaintext(Buffer const & buf, ostream & os, + OutputParams const & runparams) const { - return external::writeExternal(params_, "Ascii", buf, os); + return external::writeExternal(params_, "Ascii", buf, os, + *(runparams.exportdata)); } -int InsetExternal::linuxdoc(Buffer const & buf, ostream & os) const +int InsetExternal::linuxdoc(Buffer const & buf, ostream & os, + OutputParams const & runparams) const { - return external::writeExternal(params_, "LinuxDoc", buf, os); + return external::writeExternal(params_, "LinuxDoc", buf, os, + *(runparams.exportdata)); } -int InsetExternal::docbook(Buffer const & buf, ostream & os, bool) const +int InsetExternal::docbook(Buffer const & buf, ostream & os, + OutputParams const & runparams) const { - return external::writeExternal(params_, "DocBook", buf, os); + return external::writeExternal(params_, "DocBook", buf, os, + *(runparams.exportdata)); } void InsetExternal::validate(LaTeXFeatures & features) const { + if (params_.draft) + return; + external::Template const * const et_ptr = external::getTemplatePtr(params_); if (!et_ptr) @@ -746,22 +771,26 @@ bool preview_wanted(InsetExternalParams const & params) string const latex_string(InsetExternal const & inset, Buffer const & buffer) { ostringstream os; - LatexRunParams runparams; - runparams.flavor = LatexRunParams::LATEX; + OutputParams runparams; + runparams.flavor = OutputParams::LATEX; inset.latex(buffer, os, runparams); return os.str(); } -void add_preview(RenderMonitoredPreview & renderer, InsetExternal const & inset, - Buffer const & buffer) +void add_preview_and_start_loading(RenderMonitoredPreview & renderer, + InsetExternal const & inset, + Buffer const & buffer) { InsetExternalParams const & params = inset.params(); - if (RenderPreview::activated() && preview_wanted(params)) { + + if (RenderPreview::status() != LyXRC::PREVIEW_OFF && + preview_wanted(params)) { renderer.setAbsFile(params.filename.absFilename()); string const snippet = latex_string(inset, buffer); renderer.addPreview(snippet, buffer); + renderer.startLoading(buffer); } } @@ -802,7 +831,6 @@ void InsetExternalMailer::string2params(string const & in, InsetExternalParams & params) { params = InsetExternalParams(); - if (in.empty()) return; @@ -810,25 +838,19 @@ void InsetExternalMailer::string2params(string const & in, LyXLex lex(0,0); lex.setStream(data); - if (lex.isOK()) { - lex.next(); - string const token = lex.getString(); - if (token != name_) - return; - } + string name; + lex >> name; + if (!lex || name != name_) + return print_mailer_error("InsetExternalMailer", in, 1, name_); // This is part of the inset proper that is usually swallowed - // by Buffer::readInset - if (lex.isOK()) { - lex.next(); - string const token = lex.getString(); - if (token != "External") - return; - } + // by LyXText::readInset + string id; + lex >> id; + if (!lex || id != "External") + return print_mailer_error("InsetBoxMailer", in, 2, "External"); - if (lex.isOK()) { - params.read(buffer, lex); - } + params.read(buffer, lex); }