X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetExternal.cpp;h=102fb5398d0f38a320e900dc9048cecbce50b8a2;hb=2c357c1d23b7b83839a9beb8225d4f1ae4f793b4;hp=38b0d6b079320b1c7d4ac4a86afef2ba27452674;hpb=b89cc942eb458284f40f4d4e7db58890c3288979;p=lyx.git diff --git a/src/insets/InsetExternal.cpp b/src/insets/InsetExternal.cpp index 38b0d6b079..102fb5398d 100644 --- a/src/insets/InsetExternal.cpp +++ b/src/insets/InsetExternal.cpp @@ -19,21 +19,25 @@ #include "Buffer.h" #include "Cursor.h" -#include "support/debug.h" #include "DispatchResult.h" #include "Exporter.h" #include "FuncStatus.h" #include "FuncRequest.h" -#include "support/gettext.h" #include "LaTeXFeatures.h" #include "Lexer.h" +#include "LyX.h" // use_gui #include "LyXRC.h" #include "MetricsInfo.h" #include "OutputParams.h" +#include "frontends/alert.h" + #include "graphics/PreviewLoader.h" +#include "support/debug.h" +#include "support/ExceptionMessage.h" #include "support/filetools.h" +#include "support/gettext.h" #include "support/lstrings.h" #include "support/lyxlib.h" #include "support/convert.h" @@ -59,17 +63,17 @@ string defaultTemplateName; namespace lyx { -extern bool use_gui; +namespace Alert = frontend::Alert; namespace external { TempName::TempName() { - support::FileName const tempname(support::tempName(support::FileName(), "lyxext")); + FileName const tempname = FileName::tempName("lyxext"); // FIXME: This is unsafe tempname.removeFile(); // must have an extension for the converter code to work correctly. - tempname_ = support::FileName(tempname.absFilename() + ".tmp"); + tempname_ = FileName(tempname.absFilename() + ".tmp"); } @@ -148,7 +152,7 @@ void clearIfNotFound(T & data, external::TransformID value, const_iterator it = ids.begin(); const_iterator end = ids.end(); - it = std::find(it, end, value); + it = find(it, end, value); if (it == end) data = T(); } @@ -183,15 +187,9 @@ void InsetExternalParams::write(Buffer const & buffer, ostream & os) const << "\ttemplate " << templatename() << '\n'; if (!filename.empty()) { - // when we save, we still use the original filename - EmbeddedFiles::EmbeddedFileList::const_iterator it = - buffer.embeddedFiles().find(filename.toFilesystemEncoding()); - if (it != buffer.embeddedFiles().end()) - os << "\tfilename " << DocFileName(it->absFilename()).outputFilename(buffer.filePath()) << '\n'; - else - os << "\tfilename " << filename.outputFilename(buffer.filePath()) << '\n'; - } - + os << "\tfilename " << filename.outputFilename(buffer.filePath()) << '\n'; + os << "\tembed " << (filename.embedded() ? filename.inzipName() : "\"\"") << '\n'; + } if (display != defaultDisplayType) os << "\tdisplay " << external::displayTranslator().find(display) @@ -224,7 +222,6 @@ void InsetExternalParams::write(Buffer const & buffer, ostream & os) const } if (!resizedata.no_resize()) { - using support::float_equal; double const scl = convert(resizedata.scale); if (!float_equal(scl, 0.0, 0.05)) { if (!float_equal(scl, 100.0, 0.05)) @@ -249,6 +246,7 @@ bool InsetExternalParams::read(Buffer const & buffer, Lexer & lex) enum ExternalTags { EX_TEMPLATE = 1, EX_FILENAME, + EX_EMBED, EX_DISPLAY, EX_LYXSCALE, EX_DRAFT, @@ -270,6 +268,7 @@ bool InsetExternalParams::read(Buffer const & buffer, Lexer & lex) { "clip", EX_CLIP }, { "display", EX_DISPLAY}, { "draft", EX_DRAFT}, + { "embed", EX_EMBED}, { "extra", EX_EXTRA }, { "filename", EX_FILENAME}, { "height", EX_HEIGHT }, @@ -298,12 +297,14 @@ bool InsetExternalParams::read(Buffer const & buffer, Lexer & lex) lex.eatLine(); string const name = lex.getString(); filename.set(name, buffer.filePath()); - // maybe this file is embedded - EmbeddedFiles::EmbeddedFileList::const_iterator it = buffer.embeddedFiles().find(filename.toFilesystemEncoding()); - if (it != buffer.embeddedFiles().end()) - // using available file, embedded or external, depending on file availability and - // embedding status. - filename = DocFileName(it->availableFile(&buffer)); + break; + } + + case EX_EMBED: { + lex.next(); + string const name = lex.getString(); + filename.setInzipName(name); + filename.setEmbed(!name.empty()); break; } @@ -451,6 +452,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.embedded(), &buffer); + } catch (ExceptionMessage const & message) { + Alert::error(message.title_, message.details_); + // do not set parameter if an error happens + break; + } + } setParams(p, buffer); break; } @@ -487,14 +497,25 @@ bool InsetExternal::getStatus(Cursor & cur, FuncRequest const & cmd, } -void InsetExternal::registerEmbeddedFiles(Buffer const &, - EmbeddedFiles & files) const +void InsetExternal::registerEmbeddedFiles(Buffer const & buffer, + EmbeddedFileList & files) const +{ + files.registerFile(params_.filename, this, buffer); +} + + +void InsetExternal::updateEmbeddedFile(Buffer const & buf, + EmbeddedFile const & file) { - files.registerFile(params_.filename.absFilename(), false, this); + // when embedding is enabled, change of embedding status leads to actions + EmbeddedFile temp = file; + temp.enable(buf.embedded(), &buf); + // this will not be set if an exception is thorwn in enable() + params_.filename = temp; } -void InsetExternal::edit(Cursor & cur, bool) +void InsetExternal::edit(Cursor & cur, bool, EntryDirection) { InsetExternalMailer(*this).showDialog(&cur.bv()); } @@ -545,7 +566,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; @@ -587,7 +609,7 @@ docstring const getScreenLabel(InsetExternalParams const & params, external::getTemplatePtr(params); if (!ptr) // FIXME UNICODE - return support::bformat((_("External template %1$s is not installed")), + return bformat((_("External template %1$s is not installed")), from_utf8(params.templatename())); // FIXME UNICODE docstring gui = _(ptr->guiName); @@ -684,8 +706,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.embedded(), & buffer); setParams(params, buffer); + } }