-/* This file is part of
- * ======================================================
- *
- * LyX, The Document Processor
- *
- * Copyright 1995-2002 the LyX Team.
+/**
+ * \file insetgraphics.C
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
*
* \author Baruch Even
- * \author Herbert Voss <voss@lyx.org>
- * ====================================================== */
+ * \author Herbert Voss
+ *
+ * Full author contact details are available in file CREDITS
+ */
/*
TODO
* Add a way to roll the image file into the file format.
* When loading, if the image is not found in the expected place, try
to find it in the clipart, or in the same directory with the image.
- * Keep a tab on the image file, if it changes, update the lyx view.
* The image choosing dialog could show thumbnails of the image formats
it knows of, thus selection based on the image instead of based on
filename.
#include "support/LAssert.h"
#include "support/filetools.h"
#include "support/lyxalgo.h" // lyx::count
+#include "support/lyxlib.h" // float_equal
#include "support/path.h"
#include "support/systemcall.h"
#include "support/os.h"
#include <boost/weak_ptr.hpp>
#include <boost/bind.hpp>
#include <boost/signals/trackable.hpp>
+#include "BoostFormat.h"
#include <algorithm> // For the std::max
using std::ostream;
using std::endl;
+
+namespace {
+
///////////////////////////////////////////////////////////////////////////
int const VersionNumber = 1;
///////////////////////////////////////////////////////////////////////////
-namespace {
-
// This function is a utility function
// ... that should be with ChangeExtension ...
inline
return ChangeExtension(filename, string());
}
-} // namespace anon
-
-
-namespace {
string const uniqueID()
{
ost << "graph" << ++seed;
// Needed if we use lyxstring.
- return ost.str().c_str();
+ return STRCONV(ost.str());
+}
+
+
+string findTargetFormat(string const & suffix)
+{
+ // lyxrc.pdf_mode means:
+ // Are we creating a PDF or a PS file?
+ // (Should actually mean, are we using latex or pdflatex).
+ if (lyxrc.pdf_mode) {
+ lyxerr[Debug::GRAPHICS] << "findTargetFormat: PDF mode\n";
+ if (contains(suffix, "ps") || suffix == "pdf")
+ return "pdf";
+ else if (suffix == "jpg") // pdflatex can use jpeg
+ return suffix;
+ else
+ return "png"; // and also png
+ }
+ // If it's postscript, we always do eps.
+ lyxerr[Debug::GRAPHICS] << "findTargetFormat: PostScript mode\n";
+ if (suffix != "ps") // any other than ps
+ return "eps"; // is changed to eps
+ else
+ return suffix; // let ps untouched
}
} // namespace anon
void InsetGraphics::draw(BufferView * bv, LyXFont const & font,
int baseline, float & x, bool) const
{
+ // MakeAbsPath returns params().filename unchanged if it absolute
+ // already.
+ string const file_with_path =
+ MakeAbsPath(params().filename, bv->buffer()->filePath());
+
+ // A 'paste' operation creates a new inset with the correct filepath,
+ // but then the 'old' inset stored in the 'copy' operation is actually
+ // added to the buffer.
+ // Thus, we should ensure that the filepath is correct.
+ if (file_with_path != cache_->loader.filename())
+ cache_->update(file_with_path);
+
cache_->view = bv->owner()->view();
int oasc = cache_->old_ascent;
options << " draft,\n";
if (params().clip)
options << " clip,\n";
-
- if (params().scale) {
- if (params().scale != 100)
- options << " scale=" << params().scale / 100.0 << ",\n";
+ if (!lyx::float_equal(params().scale, 0.0, 0.05)) {
+ if (!lyx::float_equal(params().scale, 100.0, 0.05))
+ options << " scale=" << params().scale / 100.0
+ << ",\n";
} else {
if (!params().width.zero())
options << " width=" << params().width.asLatexString() << ",\n";
if (!params().height.zero())
options << " height=" << params().height.asLatexString() << ",\n";
if (params().keepAspectRatio)
- options << " keepaspectratio,\n";
+ options << " keepaspectratio,\n";
}
// Make sure rotation angle is not very close to zero;
if (!params().special.empty())
options << params().special << ",\n";
- string opts = options.str().c_str();
- return opts.substr(0,opts.size()-2); // delete last ",\n"
-}
-
-namespace {
-string findTargetFormat(string const & suffix)
-{
- // lyxrc.pdf_mode means:
- // Are we creating a PDF or a PS file?
- // (Should actually mean, are we using latex or pdflatex).
- if (lyxrc.pdf_mode) {
- lyxerr[Debug::GRAPHICS] << "findTargetFormat: PDF mode\n";
- if (contains(suffix, "ps") || suffix == "pdf")
- return "pdf";
- else if (suffix == "jpg") // pdflatex can use jpeg
- return suffix;
- else
- return "png"; // and also png
- }
- // If it's postscript, we always do eps.
- lyxerr[Debug::GRAPHICS] << "findTargetFormat: PostScript mode\n";
- if (suffix != "ps") // any other than ps
- return "eps"; // is changed to eps
- else
- return suffix; // let ps untouched
+ string opts = STRCONV(options.str());
+ // delete last ",\n"
+ return opts.substr(0, opts.size() - 2);
}
-} // Anon. namespace
-
-string const InsetGraphics::prepareFile(Buffer const *buf) const
+string const InsetGraphics::prepareFile(Buffer const * buf) const
{
// LaTeX can cope if the graphics file doesn't exist, so just return the
// filename.
Systemcall one;
one.startscript(Systemcall::Wait, command);
if (!IsFileReadable(ChangeExtension(outfile_base, to)))
+#if USE_BOOST_FORMAT
+ Alert::alert(_("Cannot convert Image (not existing file?)"),
+ boost::io::str(boost::format(_("No information for converting from %1$s to %2$s"))
+ % from % to));
+#else
Alert::alert(_("Cannot convert Image (not existing file?)"),
- _("No information for converting from ")
- + from + _(" to ") + to);
+ _("No information for converting from ") + from + " to " + to);
+#endif
}
return RemoveExtension(temp_file);
// 1. Convert file to ascii using gifscii
// 2. Read ascii output file and add it to the output stream.
// at least we send the filename
- os << '<' << _("Graphic file:") << params().filename << ">\n";
+#if USE_BOOST_FORMAT
+ os << '<'
+ << boost::format(_("Graphic file: %1$s")) % params().filename
+ << ">\n";
+#else
+ os << '<'
+ << _("Graphic file: ") << params().filename
+ << ">\n";
+#endif
return 0;
}