X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetExternal.cpp;h=ea51664978c33fca4dee8ea53e9d1791182b3240;hb=dbb1ac30e9a87007af7c53f0f93ec9e21826f90b;hp=63f7b7d96af293a52fd6af7c19f12e1854314e0f;hpb=c778f093ea51c0e5089543573ad7b431f9c310e8;p=lyx.git diff --git a/src/insets/InsetExternal.cpp b/src/insets/InsetExternal.cpp index 63f7b7d96a..ea51664978 100644 --- a/src/insets/InsetExternal.cpp +++ b/src/insets/InsetExternal.cpp @@ -12,7 +12,6 @@ #include "InsetExternal.h" #include "insets/ExternalSupport.h" -#include "insets/ExternalTemplate.h" #include "insets/RenderButton.h" #include "insets/RenderGraphic.h" #include "insets/RenderPreview.h" @@ -30,32 +29,31 @@ #include "LyXRC.h" #include "MetricsInfo.h" #include "OutputParams.h" +#include "output_latex.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/convert.h" -#include "support/Translator.h" - -#include #include +#include using namespace std; using namespace lyx::support; namespace { -lyx::external::DisplayType const defaultDisplayType = lyx::external::NoDisplay; - unsigned int const defaultLyxScale = 100; string defaultTemplateName; @@ -72,10 +70,8 @@ namespace external { TempName::TempName() { FileName const tempname = FileName::tempName("lyxext"); - // FIXME: This is unsafe - tempname.removeFile(); // must have an extension for the converter code to work correctly. - tempname_ = FileName(tempname.absFilename() + ".tmp"); + tempname_ = FileName(tempname.absFileName() + ".tmp"); } @@ -98,46 +94,19 @@ TempName & TempName::operator=(TempName const & other) return *this; } - -namespace { - -/// The translator between the Display enum and corresponding lyx string. -Translator const initTranslator() -{ - Translator translator(DefaultDisplay, "default"); - - // Fill the display translator - translator.addPair(MonochromeDisplay, "monochrome"); - translator.addPair(GrayscaleDisplay, "grayscale"); - translator.addPair(ColorDisplay, "color"); - translator.addPair(PreviewDisplay, "preview"); - translator.addPair(NoDisplay, "none"); - - return translator; -} - -} // namespace anon - - -Translator const & displayTranslator() -{ - static Translator const translator = - initTranslator(); - return translator; -} - } // namespace external InsetExternalParams::InsetExternalParams() - : display(defaultDisplayType), + : display(true), lyxscale(defaultLyxScale), draft(false) { if (defaultTemplateName.empty()) { external::TemplateManager const & etm = external::TemplateManager::get(); - templatename_ = etm.getTemplates().begin()->first; + if (!etm.getTemplates().empty()) + templatename_ = etm.getTemplates().begin()->first; } else templatename_ = defaultTemplateName; } @@ -180,6 +149,9 @@ void InsetExternalParams::settemplate(string const & name) clearIfNotFound(extradata, external::Extra, ids); clearIfNotFound(resizedata, external::Resize, ids); clearIfNotFound(rotationdata, external::Rotate, ids); + + // + preview_mode = et->preview_mode; } @@ -189,12 +161,10 @@ void InsetExternalParams::write(Buffer const & buf, ostream & os) const << "\ttemplate " << templatename() << '\n'; if (!filename.empty()) - os << "\tfilename " << filename.outputFilename(buf.filePath()) << '\n'; + os << "\tfilename " << filename.outputFileName(buf.filePath()) << '\n'; - if (display != defaultDisplayType) - os << "\tdisplay " - << external::displayTranslator().find(display) - << '\n'; + if (!display) + os << "\tdisplay false\n"; if (lyxscale != defaultLyxScale) os << "\tlyxscale " << convert(lyxscale) << '\n'; @@ -301,8 +271,7 @@ bool InsetExternalParams::read(Buffer const & buffer, Lexer & lex) case EX_DISPLAY: { lex.next(); - string const name = lex.getString(); - display = external::displayTranslator().find(name); + display = lex.getString() != "false"; break; } @@ -396,13 +365,13 @@ bool InsetExternalParams::read(Buffer const & buffer, Lexer & lex) } -InsetExternal::InsetExternal(Buffer & buf) - : renderer_(new RenderButton) +InsetExternal::InsetExternal(Buffer * buf) + : Inset(buf), renderer_(new RenderButton) { - Inset::setBuffer(buf); } +// Mouse hover is not copied and remains empty InsetExternal::InsetExternal(InsetExternal const & other) : Inset(other), boost::signals::trackable(), @@ -414,6 +383,19 @@ InsetExternal::InsetExternal(InsetExternal const & other) InsetExternal::~InsetExternal() { hideDialogs("external", this); + + map::iterator it = mouse_hover_.begin(); + map::iterator end = mouse_hover_.end(); + for (; it != end; ++it) + if (it->second) + it->first->clearLastInset(this); +} + + +bool InsetExternal::setMouseHover(BufferView const * bv, bool mouse_hover) +{ + mouse_hover_[bv] = mouse_hover; + return true; } @@ -425,7 +407,7 @@ void InsetExternal::statusChanged() const void InsetExternal::doDispatch(Cursor & cur, FuncRequest & cmd) { - switch (cmd.action) { + switch (cmd.action()) { case LFUN_INSET_EDIT: { InsetExternalParams p = params(); @@ -438,6 +420,7 @@ void InsetExternal::doDispatch(Cursor & cur, FuncRequest & cmd) case LFUN_INSET_MODIFY: { InsetExternalParams p; string2params(to_utf8(cmd.argument()), buffer(), p); + cur.recordUndo(); setParams(p); break; } @@ -447,13 +430,6 @@ void InsetExternal::doDispatch(Cursor & cur, FuncRequest & cmd) params2string(params(), cur.bv().buffer())); break; - case LFUN_MOUSE_RELEASE: - if (!cur.selection() && cmd.button() == mouse_button::button1) - cur.bv().showDialog("external", - params2string(params(), cur.bv().buffer()), - this); - break; - default: Inset::doDispatch(cur, cmd); } @@ -463,12 +439,12 @@ void InsetExternal::doDispatch(Cursor & cur, FuncRequest & cmd) bool InsetExternal::getStatus(Cursor & cur, FuncRequest const & cmd, FuncStatus & flag) const { - switch (cmd.action) { + switch (cmd.action()) { case LFUN_INSET_EDIT: case LFUN_INSET_MODIFY: case LFUN_INSET_DIALOG_UPDATE: - flag.enabled(true); + flag.setEnabled(true); return true; default: @@ -477,11 +453,11 @@ bool InsetExternal::getStatus(Cursor & cur, FuncRequest const & cmd, } -void InsetExternal::edit(Cursor & cur, bool, EntryDirection) +bool InsetExternal::showInsetDialog(BufferView * bv) const { - cur.bv().showDialog("external", - params2string(params(), cur.bv().buffer()), - this); + bv->showDialog("external", params2string(params(), bv->buffer()), + const_cast(this)); + return true; } @@ -493,39 +469,14 @@ void InsetExternal::metrics(MetricsInfo & mi, Dimension & dim) const void InsetExternal::draw(PainterInfo & pi, int x, int y) const { + if (renderer_->asButton()) + renderer_->setRenderState(mouse_hover_[pi.base.bv]); renderer_->draw(pi, x, y); } namespace { -enum RenderType { - RENDERBUTTON, - RENDERGRAPHIC, - RENDERPREVIEW -}; - - -RenderType getRenderType(InsetExternalParams const & p) -{ - if (!external::getTemplatePtr(p) || - p.filename.empty() || - p.display == external::NoDisplay) - return RENDERBUTTON; - - if (p.display == external::PreviewDisplay) { - if (RenderPreview::status() != LyXRC::PREVIEW_OFF) - return RENDERPREVIEW; - return RENDERBUTTON; - } - - if (p.display == external::DefaultDisplay && - lyxrc.display_graphics == graphics::NoDisplay) - return RENDERBUTTON; - return RENDERGRAPHIC; -} - - graphics::Params get_grfx_params(InsetExternalParams const & eparams) { graphics::Params gparams; @@ -535,31 +486,7 @@ graphics::Params get_grfx_params(InsetExternalParams const & eparams) if (eparams.clipdata.clip) gparams.bb = eparams.clipdata.bbox; gparams.angle = convert(eparams.rotationdata.adjAngle()); - - switch (eparams.display) { - case external::DefaultDisplay: - gparams.display = graphics::DefaultDisplay; - break; - case external::MonochromeDisplay: - gparams.display = graphics::MonochromeDisplay; - break; - case external::GrayscaleDisplay: - gparams.display = graphics::GrayscaleDisplay; - break; - case external::ColorDisplay: - gparams.display = graphics::ColorDisplay; - break; - case external::NoDisplay: - gparams.display = graphics::NoDisplay; - break; - default: - LASSERT(false, /**/); - } - if (gparams.display == graphics::DefaultDisplay) - gparams.display = graphics::DisplayType(lyxrc.display_graphics); - // Override the above if we're not using a gui - if (!use_gui) - gparams.display = graphics::NoDisplay; + gparams.display = eparams.display; return gparams; } @@ -576,8 +503,14 @@ docstring screenLabel(InsetExternalParams const & params, from_utf8(params.templatename())); // FIXME UNICODE docstring gui = _(ptr->guiName); - return from_utf8(external::doSubstitution(params, buffer, - to_utf8(gui), false)); + gui += ": "; + + if (params.filename.empty()) + gui += "???"; + else + gui += from_utf8(params.filename.relFileName(buffer.filePath())); + + return gui; } } // namespace anon @@ -585,20 +518,21 @@ docstring screenLabel(InsetExternalParams const & params, static bool isPreviewWanted(InsetExternalParams const & params) { - return params.display == external::PreviewDisplay && - params.filename.isReadableFile(); + return params.display && params.filename.isReadableFile(); } static docstring latexString(InsetExternal const & inset) { - odocstringstream os; + TexRow texrow; + odocstringstream ods; + otexstream os(ods, texrow); // We don't need to set runparams.encoding since it is not used by // latex(). OutputParams runparams(0); runparams.flavor = OutputParams::LATEX; inset.latex(os, runparams); - return os.str(); + return ods.str(); } @@ -624,6 +558,12 @@ InsetExternalParams const & InsetExternal::params() const } +void InsetExternal::updatePreview() +{ + setParams(params_); +} + + void InsetExternal::setParams(InsetExternalParams const & p) { params_ = p; @@ -632,44 +572,43 @@ void InsetExternal::setParams(InsetExternalParams const & p) // will use this. defaultTemplateName = params_.templatename(); - switch (getRenderType(params_)) { - case RENDERBUTTON: { + if (!external::getTemplatePtr(params_) || params_.filename.empty() + || !params_.display + || !lyxrc.display_graphics + || params_.preview_mode == PREVIEW_OFF + || (params_.preview_mode == PREVIEW_INSTANT + && RenderPreview::status() == LyXRC::PREVIEW_OFF)) { RenderButton * button_ptr = renderer_->asButton(); if (!button_ptr) { renderer_.reset(new RenderButton); button_ptr = renderer_->asButton(); } - button_ptr->update(screenLabel(params_, buffer()), true); - break; + return; } - case RENDERGRAPHIC: { + switch (params_.preview_mode) { + case PREVIEW_OFF: + // Already taken care of above. + LASSERT(false, return); + break; + case PREVIEW_INSTANT: { + RenderMonitoredPreview * preview_ptr = renderer_->asMonitoredPreview(); + renderer_.reset(new RenderMonitoredPreview(this)); + preview_ptr = renderer_->asMonitoredPreview(); + preview_ptr->fileChanged(bind(&InsetExternal::fileChanged, this)); + if (preview_ptr->monitoring()) + preview_ptr->stopMonitoring(); + add_preview_and_start_loading(*preview_ptr, *this, buffer()); + break; + } + case PREVIEW_GRAPHICS: { RenderGraphic * graphic_ptr = renderer_->asGraphic(); if (!graphic_ptr) { renderer_.reset(new RenderGraphic(this)); graphic_ptr = renderer_->asGraphic(); } - graphic_ptr->update(get_grfx_params(params_)); - - break; - } - - case RENDERPREVIEW: { - RenderMonitoredPreview * preview_ptr = - renderer_->asMonitoredPreview(); - if (!preview_ptr) { - renderer_.reset(new RenderMonitoredPreview(this)); - preview_ptr = renderer_->asMonitoredPreview(); - preview_ptr->fileChanged( - boost::bind(&InsetExternal::fileChanged, this)); - } - - if (preview_ptr->monitoring()) - preview_ptr->stopMonitoring(); - add_preview_and_start_loading(*preview_ptr, *this, buffer()); - break; } } @@ -704,14 +643,14 @@ void InsetExternal::read(Lexer & lex) } -int InsetExternal::latex(odocstream & os, OutputParams const & runparams) const +void InsetExternal::latex(otexstream & os, OutputParams const & runparams) const { if (params_.draft) { // FIXME UNICODE os << "\\fbox{\\ttfamily{}" - << from_utf8(params_.filename.outputFilename(buffer().filePath())) + << from_utf8(params_.filename.outputFileName(buffer().filePath())) << "}\n"; - return 1; + return; } // "nice" means that the buffer is exported to LaTeX format but not @@ -727,25 +666,28 @@ int InsetExternal::latex(odocstream & os, OutputParams const & runparams) const external::Template const * const et_ptr = external::getTemplatePtr(params_); if (!et_ptr) - return 0; + return; external::Template const & et = *et_ptr; external::Template::Formats::const_iterator cit = et.formats.find("PDFLaTeX"); if (cit != et.formats.end()) { - return external::writeExternal(params_, "PDFLaTeX", - buffer(), os, - *(runparams.exportdata), - external_in_tmpdir, - dryrun); + int l = external::writeExternal(params_, "PDFLaTeX", + buffer(), os.os(), + *(runparams.exportdata), + external_in_tmpdir, + dryrun); + os.texrow().newlines(l); + return; } } - return external::writeExternal(params_, "LaTeX", buffer(), os, - *(runparams.exportdata), - external_in_tmpdir, - dryrun); + int l = external::writeExternal(params_, "LaTeX", buffer(), os.os(), + *(runparams.exportdata), + external_in_tmpdir, + dryrun); + os.texrow().newlines(l); } @@ -769,6 +711,16 @@ int InsetExternal::docbook(odocstream & os, } +docstring InsetExternal::xhtml(XHTMLStream & /*xs*/, + OutputParams const & /*rp*/) const +{ +// external::writeExternal(params_, "XHTML", buffer(), os, +// *(runparams.exportdata), false, +// runparams.dryrun || runparams.inComment); + return docstring(); +} + + void InsetExternal::validate(LaTeXFeatures & features) const { if (params_.draft) @@ -783,14 +735,26 @@ void InsetExternal::validate(LaTeXFeatures & features) const string format; switch (features.runparams().flavor) { case OutputParams::LATEX: + case OutputParams::DVILUATEX: format = "LaTeX"; break; + case OutputParams::LUATEX: case OutputParams::PDFLATEX: + case OutputParams::XETEX: format = "PDFLaTeX"; break; case OutputParams::XML: format = "DocBook"; break; + case OutputParams::HTML: + format = "html"; + break; + case OutputParams::TEXT: + format = "text"; + break; + case OutputParams::LYX: + format = "lyx"; + break; } external::Template::Formats::const_iterator cit = et.formats.find(format); @@ -806,7 +770,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(); @@ -826,7 +790,8 @@ void InsetExternal::validate(LaTeXFeatures & features) const } -void InsetExternal::addPreview(graphics::PreviewLoader & ploader) const +void InsetExternal::addPreview(DocIterator const & /*inset_pos*/, + graphics::PreviewLoader & ploader) const { RenderMonitoredPreview * const ptr = renderer_->asMonitoredPreview(); if (!ptr) @@ -840,9 +805,9 @@ void InsetExternal::addPreview(graphics::PreviewLoader & ploader) const } -docstring InsetExternal::contextMenu(BufferView const &, int, int) const +string InsetExternal::contextMenuName() const { - return from_ascii("context-external"); + return "context-external"; }