diff --git a/src/frontends/qt4/GuiExternal.cpp b/src/frontends/qt4/GuiExternal.cpp index 0c0f178ba1..49fbdeadb7 100644 --- a/src/frontends/qt4/GuiExternal.cpp +++ b/src/frontends/qt4/GuiExternal.cpp @@ -110,6 +110,8 @@ GuiExternal::GuiExternal(GuiView & lv) this, SLOT(change_adaptor())); connect(browsePB, SIGNAL(clicked()), this, SLOT(browseClicked())); + connect(embedCB, SIGNAL(toggled(bool)), + this, SLOT(change_adaptor())); connect(editPB, SIGNAL(clicked()), this, SLOT(editClicked())); connect(externalCO, SIGNAL(activated(QString)), @@ -557,6 +559,7 @@ void GuiExternal::updateContents() string const name = params_.filename.outputFilename(bufferFilepath()); fileED->setText(toqstr(name)); + embedCB->setCheckState(params_.filename.embedded() ? Qt::Checked : Qt::Unchecked); externalCO->setCurrentIndex(getTemplateNumber(params_.templatename())); updateTemplate(); @@ -639,6 +642,7 @@ void GuiExternal::updateTemplate() void GuiExternal::applyView() { params_.filename.set(fromqstr(fileED->text()), bufferFilepath()); + params_.filename.setEmbed(embedCB->checkState() == Qt::Checked); params_.settemplate(getTemplate(externalCO->currentIndex()).lyxName); diff --git a/src/insets/ExternalSupport.cpp b/src/insets/ExternalSupport.cpp index 0ce66a42e7..0d2615883b 100644 --- a/src/insets/ExternalSupport.cpp +++ b/src/insets/ExternalSupport.cpp @@ -50,7 +50,7 @@ Template const * getTemplatePtr(InsetExternalParams const & params) void editExternal(InsetExternalParams const & params, Buffer const & buffer) { - formats.edit(buffer, params.filename, + formats.edit(buffer, params.filename.availableFile(), formats.getFormatFromFile(params.filename)); } @@ -254,7 +254,7 @@ void updateExternal(InsetExternalParams const & params, if (from_checksum != temp_checksum) { Mover const & mover = getMover(from_format); - if (!mover.copy(params.filename, temp_file)) { + if (!mover.copy(params.filename.availableFile(), temp_file)) { LYXERR(Debug::EXTERNAL, "external::updateExternal. " << "Unable to copy " << params.filename << " to " << temp_file); return; // FAILURE @@ -310,7 +310,7 @@ void updateExternal(InsetExternalParams const & params, ErrorList el; bool const success = theConverters().convert(&buffer, temp_file, abs_to_file, - params.filename, from_format, to_format, el, + params.filename.availableFile(), from_format, to_format, el, Converters::try_default | Converters::try_cache); if (!success) { diff --git a/src/insets/InsetExternal.cpp b/src/insets/InsetExternal.cpp index 5e04597b3a..38801381fb 100644 --- a/src/insets/InsetExternal.cpp +++ b/src/insets/InsetExternal.cpp @@ -31,8 +31,11 @@ #include "MetricsInfo.h" #include "OutputParams.h" +#include "frontends/alert.h" + #include "graphics/PreviewLoader.h" +#include "support/ExceptionMessage.h" #include "support/filetools.h" #include "support/lstrings.h" #include "support/lyxlib.h" @@ -59,6 +62,8 @@ string defaultTemplateName; namespace lyx { +namespace Alert = frontend::Alert; + extern bool use_gui; namespace external { @@ -182,9 +187,10 @@ void InsetExternalParams::write(Buffer const & buffer, ostream & os) const os << "External\n" << "\ttemplate " << templatename() << '\n'; - if (!filename.empty()) + if (!filename.empty()) { os << "\tfilename " << filename.outputFilename(buffer.filePath()) << '\n'; - + os << "\tembed " << (filename.embedded() ? "true" : "false") << '\n'; + } if (display != defaultDisplayType) os << "\tdisplay " << external::displayTranslator().find(display) @@ -241,6 +247,7 @@ bool InsetExternalParams::read(Buffer const & buffer, Lexer & lex) enum ExternalTags { EX_TEMPLATE = 1, EX_FILENAME, + EX_EMBED, EX_DISPLAY, EX_LYXSCALE, EX_DRAFT, @@ -264,6 +271,7 @@ bool InsetExternalParams::read(Buffer const & buffer, Lexer & lex) { "draft", EX_DRAFT}, { "extra", EX_EXTRA }, { "filename", EX_FILENAME}, + { "embed", EX_EMBED}, { "height", EX_HEIGHT }, { "keepAspectRatio", EX_KEEPASPECTRATIO }, { "lyxscale", EX_LYXSCALE}, @@ -292,6 +300,12 @@ bool InsetExternalParams::read(Buffer const & buffer, Lexer & lex) filename.set(name, buffer.filePath()); break; } + + case EX_EMBED: { + lex.next(); + filename.setEmbed(lex.getBool()); + break; + } case EX_DISPLAY: { lex.next(); @@ -437,6 +451,15 @@ void InsetExternal::doDispatch(Cursor & cur, FuncRequest & cmd) Buffer const & buffer = cur.buffer(); InsetExternalParams p; InsetExternalMailer::string2params(to_utf8(cmd.argument()), buffer, p); + if (!p.filename.empty()) { + try { + p.filename.enable(buffer.embeddedFiles().enabled(), &buffer); + } catch (ExceptionMessage const & message) { + Alert::error(message.title_, message.details_); + // do not set parameter if an error happens + break; + } + } setParams(p, buffer); break; } @@ -476,8 +499,18 @@ bool InsetExternal::getStatus(Cursor & cur, FuncRequest const & cmd, void InsetExternal::registerEmbeddedFiles(Buffer const &, EmbeddedFiles & files) const { - // temporarily disable embedding for this inset - /* files.registerFile(params_.filename, this); */ + files.registerFile(params_.filename, this); +} + + +void InsetExternal::updateEmbeddedFile(Buffer const & buf, + EmbeddedFile const & file) +{ + // when embedding is enabled, change of embedding status leads to actions + EmbeddedFile temp = file; + temp.enable(buf.embeddedFiles().enabled(), &buf); + // this will not be set if an exception is thorwn in enable() + params_.filename = temp; } @@ -532,7 +565,8 @@ graphics::Params get_grfx_params(InsetExternalParams const & eparams) { graphics::Params gparams; - gparams.filename = eparams.filename; + gparams.filename = eparams.filename.availableFile(); + gparams.icon = eparams.filename.embedded() ? "pin.png" : ""; gparams.scale = eparams.lyxscale; if (eparams.clipdata.clip) gparams.bb = eparams.clipdata.bbox; @@ -671,8 +705,11 @@ void InsetExternal::write(Buffer const & buffer, ostream & os) const void InsetExternal::read(Buffer const & buffer, Lexer & lex) { InsetExternalParams params; - if (params.read(buffer, lex)) + if (params.read(buffer, lex)) { + // exception handling is not needed as long as embedded files are in place. + params.filename.enable(buffer.embeddedFiles().enabled(), & buffer); setParams(params, buffer); + } } diff --git a/src/insets/InsetExternal.h b/src/insets/InsetExternal.h index 993354d328..533eeb92b9 100644 --- a/src/insets/InsetExternal.h +++ b/src/insets/InsetExternal.h @@ -80,7 +80,7 @@ public: std::string const & templatename() const { return templatename_; } /// The external file. - support::DocFileName filename; + EmbeddedFile filename; /// How the inset is to be displayed by LyX. external::DisplayType display; /// The scale of the displayed graphic (if shown). @@ -150,6 +150,8 @@ public: bool getStatus(Cursor &, FuncRequest const &, FuncStatus &) const; /// external file can be embedded void registerEmbeddedFiles(Buffer const &, EmbeddedFiles &) const; + /// + void updateEmbeddedFile(Buffer const &, EmbeddedFile const &); protected: InsetExternal(InsetExternal const &);