X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetGraphics.cpp;h=70cfe9767d719a3d35a8a24788fe9cca231b2310;hb=3189e7b5dd438876016091463b8e66b134295fb5;hp=23dda7899f7412f2b29b301108857d39868afaea;hpb=e499a5428e56e3e46c05da69a860012f92f25a7b;p=lyx.git diff --git a/src/insets/InsetGraphics.cpp b/src/insets/InsetGraphics.cpp index 23dda7899f..70cfe9767d 100644 --- a/src/insets/InsetGraphics.cpp +++ b/src/insets/InsetGraphics.cpp @@ -58,6 +58,7 @@ TODO #include "Cursor.h" #include "debug.h" #include "DispatchResult.h" +#include "ErrorList.h" #include "Exporter.h" #include "Format.h" #include "FuncRequest.h" @@ -70,12 +71,12 @@ TODO #include "Mover.h" #include "OutputParams.h" #include "sgml.h" +#include "EmbeddedFiles.h" #include "frontends/alert.h" #include "support/convert.h" #include "support/filetools.h" -#include "support/lyxalgo.h" // count #include "support/lyxlib.h" // sum #include "support/lstrings.h" #include "support/os.h" @@ -84,6 +85,7 @@ TODO #include #include +#include #include @@ -98,18 +100,19 @@ using support::FileName; using support::float_equal; using support::getExtension; using support::isFileReadable; +using support::isValidLaTeXFilename; using support::latex_path; using support::onlyFilename; using support::removeExtension; using support::rtrim; using support::subst; +using support::suffixIs; using support::Systemcall; using support::unzipFile; using support::unzippedFileName; using std::endl; using std::string; -using std::auto_ptr; using std::istringstream; using std::ostream; using std::ostringstream; @@ -162,9 +165,9 @@ InsetGraphics::InsetGraphics(InsetGraphics const & ig) } -auto_ptr InsetGraphics::doClone() const +Inset * InsetGraphics::clone() const { - return auto_ptr(new InsetGraphics(*this)); + return new InsetGraphics(*this); } @@ -178,7 +181,7 @@ void InsetGraphics::doDispatch(Cursor & cur, FuncRequest & cmd) { switch (cmd.action) { case LFUN_GRAPHICS_EDIT: { - Buffer const & buffer = *cur.bv().buffer(); + Buffer const & buffer = cur.bv().buffer(); InsetGraphicsParams p; InsetGraphicsMailer::string2params(to_utf8(cmd.argument()), buffer, p); editGraphics(p, buffer); @@ -228,6 +231,14 @@ bool InsetGraphics::getStatus(Cursor & cur, FuncRequest const & cmd, } +void InsetGraphics::registerEmbeddedFiles(Buffer const &, + EmbeddedFiles & files) const +{ + files.registerFile(params().filename.absFilename(), + false, this); +} + + void InsetGraphics::edit(Cursor & cur, bool) { InsetGraphicsMailer(*this).showDialog(&cur.bv()); @@ -259,7 +270,7 @@ Inset::EDITABLE InsetGraphics::editable() const void InsetGraphics::write(Buffer const & buf, ostream & os) const { os << "Graphics\n"; - params().Write(os, buf.filePath()); + params().Write(os, buf); } @@ -272,6 +283,16 @@ void InsetGraphics::read(Buffer const & buf, Lexer & lex) else LYXERR(Debug::GRAPHICS) << "Not a Graphics inset!" << endl; + // InsetGraphics is read, with filename in params_. We do not know if this file actually + // exists or is embedded so we need to get the 'availableFile' from buf.embeddedFiles() + if (buf.embeddedFiles().enabled()) { + EmbeddedFiles::EmbeddedFileList::const_iterator it = + buf.embeddedFiles().find(params_.filename.toFilesystemEncoding()); + if (it != buf.embeddedFiles().end()) + // using available file, embedded or external, depending on file availability and + // embedding status. + params_.filename = DocFileName(it->availableFile(&buf)); + } graphic_->update(params().as_grfxParams()); } @@ -312,18 +333,21 @@ string const InsetGraphics::createLatexOptions() const options << "draft,"; if (params().clip) options << "clip,"; + ostringstream size; double const scl = convert(params().scale); if (!params().scale.empty() && !float_equal(scl, 0.0, 0.05)) { if (!float_equal(scl, 100.0, 0.05)) - options << "scale=" << scl / 100.0 << ','; + size << "scale=" << scl / 100.0 << ','; } else { if (!params().width.zero()) - options << "width=" << params().width.asLatexString() << ','; + size << "width=" << params().width.asLatexString() << ','; if (!params().height.zero()) - options << "height=" << params().height.asLatexString() << ','; + size << "height=" << params().height.asLatexString() << ','; if (params().keepAspectRatio) - options << "keepaspectratio,"; + size << "keepaspectratio,"; } + if (params().scaleBeforeRotation && !size.str().empty()) + options << size.str(); // Make sure rotation angle is not very close to zero; // a float can be effectively zero but not exactly zero. @@ -341,13 +365,18 @@ string const InsetGraphics::createLatexOptions() const options << ','; } } + if (!params().scaleBeforeRotation && !size.str().empty()) + options << size.str(); if (!params().special.empty()) options << params().special << ','; string opts = options.str(); // delete last ',' - return opts.substr(0, opts.size() - 1); + if (suffixIs(opts, ',')) + opts = opts.substr(0, opts.size() - 1); + + return opts; } @@ -597,6 +626,14 @@ string const InsetGraphics::prepareFile(Buffer const & buf, string output_file = support::os::external_path(runparams.nice ? params().filename.outputFilename(m_buffer->filePath()) : onlyFilename(temp_file.absFilename())); + + if (runparams.nice && !isValidLaTeXFilename(output_file)) { + frontend::Alert::warning(_("Invalid filename"), + _("The following filename is likely to cause trouble " + "when running the exported file through LaTeX: ") + + from_utf8(output_file)); + } + FileName source_file = runparams.nice ? FileName(params().filename) : temp_file; string const tex_format = (runparams.flavor == OutputParams::LATEX) ? "latex" : "pdflatex"; @@ -726,8 +763,8 @@ string const InsetGraphics::prepareFile(Buffer const & buf, // FIXME (Abdel 12/08/06): Is there a need to show these errors? ErrorList el; if (theConverters().convert(&buf, temp_file, to_file, params().filename, - from, to, el, - Converters::try_default | Converters::try_cache)) { + from, to, el, + Converters::try_default | Converters::try_cache)) { runparams.exportdata->addExternalFile(tex_format, to_file, output_to_file); runparams.exportdata->addExternalFile("dvi", @@ -739,7 +776,7 @@ string const InsetGraphics::prepareFile(Buffer const & buf, int InsetGraphics::latex(Buffer const & buf, odocstream & os, - OutputParams const & runparams) const + OutputParams const & runparams) const { // If there is no file specified or not existing, // just output a message about it in the latex output. @@ -751,7 +788,7 @@ int InsetGraphics::latex(Buffer const & buf, odocstream & os, params().filename.relFilename(buf.filePath()); bool const file_exists = !params().filename.empty() && - isFileReadable(params().filename); + isFileReadable(params().filename); string const message = file_exists ? string() : string("bb = 0 0 200 100, draft, type=eps"); // if !message.empty() then there was no existing file @@ -804,12 +841,12 @@ int InsetGraphics::latex(Buffer const & buf, odocstream & os, LYXERR(Debug::GRAPHICS) << "InsetGraphics::latex outputting:\n" << latex_str << endl; // Return how many newlines we issued. - return int(lyx::count(latex_str.begin(), latex_str.end(),'\n')); + return int(std::count(latex_str.begin(), latex_str.end(),'\n')); } int InsetGraphics::plaintext(Buffer const & buf, odocstream & os, - OutputParams const &) const + OutputParams const &) const { // No graphics in ascii output. Possible to use gifscii to convert // images to ascii approximation. @@ -820,7 +857,7 @@ int InsetGraphics::plaintext(Buffer const & buf, odocstream & os, // FIXME: We have no idea what the encoding of the filename is docstring const str = bformat(buf.B_("Graphics file: %1$s"), - from_utf8(params().filename.absFilename())); + from_utf8(params().filename.absFilename())); os << '<' << str << '>'; return 2 + str.size(); @@ -829,21 +866,24 @@ int InsetGraphics::plaintext(Buffer const & buf, odocstream & os, namespace { -int writeImageObject(char * format, odocstream & os, OutputParams const & runparams, - docstring const graphic_label, docstring const attributes) +int writeImageObject(char const * format, + odocstream & os, + OutputParams const & runparams, + docstring const & graphic_label, + docstring const & attributes) { if (runparams.flavor != OutputParams::XML) { os << "" ; } @@ -986,7 +1026,7 @@ InsetGraphicsMailer::params2string(InsetGraphicsParams const & params, { ostringstream data; data << name_ << ' '; - params.Write(data, buffer.filePath()); + params.Write(data, buffer); data << "\\end_inset\n"; return data.str(); }