]> git.lyx.org Git - lyx.git/blobdiff - src/insets/insetgraphics.C
Make it compile when USE_BOOST_FORMAT is unset
[lyx.git] / src / insets / insetgraphics.C
index 67a5bd0e536210836a6f6291e3896d5fce798908..79bb4f0a93f4bd036ed947056dba2301390f22dd 100644 (file)
@@ -1,13 +1,13 @@
-/* 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
@@ -18,7 +18,6 @@ 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.
@@ -64,7 +63,6 @@ TODO
 #include "graphics/GraphicsImage.h"
 #include "graphics/GraphicsParams.h"
 
-#include "frontends/LyXView.h"
 #include "lyxtext.h"
 #include "buffer.h"
 #include "BufferView.h"
@@ -77,36 +75,39 @@ TODO
 #include "LaTeXFeatures.h"
 #include "lyxlex.h"
 
-#include "frontends/Dialogs.h"
 #include "frontends/Alert.h"
+#include "frontends/Dialogs.h"
+#include "frontends/LyXView.h"
+
 #include "frontends/controllers/helper_funcs.h" // getVectorFromString
 
 #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
 
-// Very, Very UGLY!
-extern BufferView * current_view;
-
 extern string system_tempdir;
 
 using std::ostream;
 using std::endl;
 
+
+namespace {
+
 ///////////////////////////////////////////////////////////////////////////
 int const VersionNumber = 1;
 ///////////////////////////////////////////////////////////////////////////
 
-namespace {
-
 // This function is a utility function
 // ... that should be with ChangeExtension ...
 inline
@@ -115,10 +116,6 @@ string const RemoveExtension(string const & filename)
        return ChangeExtension(filename, string());
 }
 
-} // namespace anon
-
-
-namespace {
 
 string const uniqueID()
 {
@@ -128,7 +125,30 @@ 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
@@ -147,6 +167,8 @@ struct InsetGraphics::Cache : boost::signals::trackable
        grfx::Loader loader;
        ///
        unsigned long checksum;
+       ///
+       boost::weak_ptr<BufferView> view;
 
 private:
        ///
@@ -293,6 +315,19 @@ int InsetGraphics::width(BufferView *, LyXFont const & font) const
 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;
 
        int ldescent = descent(bv, font);
@@ -371,7 +406,7 @@ void InsetGraphics::draw(BufferView * bv, LyXFont const & font,
 
 void InsetGraphics::edit(BufferView *bv, int, int, mouse_button::state)
 {
-       bv->owner()->getDialogs()->showGraphics(this);
+       bv->owner()->getDialogs().showGraphics(this);
 }
 
 
@@ -389,7 +424,7 @@ Inset::EDITABLE InsetGraphics::editable() const
 
 void InsetGraphics::write(Buffer const *, ostream & os) const
 {
-       os << "Graphics FormatVersion " << VersionNumber << '\n';
+       os << "Graphics\n";
        params().Write(os);
 }
 
@@ -400,10 +435,8 @@ void InsetGraphics::read(Buffer const * buf, LyXLex & lex)
 
        if (token == "Graphics")
                readInsetGraphics(lex);
-       else if (token == "Figure") // Compatibility reading of FigInset figures.
-               readFigInset(lex);
        else
-               lyxerr[Debug::GRAPHICS] << "Not a Graphics or Figure inset!\n";
+               lyxerr[Debug::GRAPHICS] << "Not a Graphics inset!\n";
 
        cache_->update(MakeAbsPath(params().filename, buf->filePath()));
 }
@@ -443,105 +476,6 @@ void InsetGraphics::readInsetGraphics(LyXLex & lex)
        }
 }
 
-// FormatVersion < 1.0  (LyX < 1.2)
-void InsetGraphics::readFigInset(LyXLex & lex)
-{
-       std::vector<string> const oldUnitsWidth =
-               getVectorFromString("pt, cm, in, text%, col%");
-       std::vector<string> const oldUnitsHeight =
-               getVectorFromString("pt, cm, in, theight%");
-       bool finished = false;
-       // set the display default
-       if (lyxrc.display_graphics == "mono")
-           params_.display = InsetGraphicsParams::MONOCHROME;
-       else if (lyxrc.display_graphics == "gray")
-           params_.display = InsetGraphicsParams::GRAYSCALE;
-       else if (lyxrc.display_graphics == "color")
-           params_.display = InsetGraphicsParams::COLOR;
-       else
-           params_.display = InsetGraphicsParams::NONE;
-       while (lex.isOK() && !finished) {
-               lex.next();
-
-               string const token = lex.getString();
-               lyxerr[Debug::GRAPHICS] << "Token: " << token << endl;
-
-               if (token.empty())
-                       continue;
-               else if (token == "\\end_inset") {
-                       finished = true;
-               } else if (token == "file") {
-                       if (lex.next()) {
-                               params_.filename = lex.getString();
-                       }
-               } else if (token == "extra") {
-                       if (lex.next());
-                       // kept for backwards compability. Delete in 0.13.x
-               } else if (token == "subcaption") {
-                       if (lex.eatLine())
-                               params_.subcaptionText = lex.getString();
-               } else if (token == "label") {
-                       if (lex.next());
-                       // kept for backwards compability. Delete in 0.13.x
-               } else if (token == "angle") {
-                       if (lex.next()) {
-                               params_.rotate = true;
-                               params_.rotateAngle = lex.getFloat();
-                       }
-               } else if (token == "size") {
-                       if (lex.next())
-                               params_.lyxwidth = LyXLength(lex.getString()+"pt");
-                       if (lex.next())
-                               params_.lyxheight = LyXLength(lex.getString()+"pt");
-                       params_.lyxsize_kind = InsetGraphicsParams::WH;
-               } else if (token == "flags") {
-                       if (lex.next())
-                               switch (lex.getInteger()) {
-                               case 1: params_.display = InsetGraphicsParams::MONOCHROME;
-                                   break;
-                               case 2: params_.display = InsetGraphicsParams::GRAYSCALE;
-                                   break;
-                               case 3: params_.display = InsetGraphicsParams::COLOR;
-                                   break;
-                               case 8: params_.display = InsetGraphicsParams::NONE;
-                                   break;
-                               }
-               } else if (token == "subfigure") {
-                       params_.subcaption = true;
-               } else if (token == "width") {
-                   if (lex.next()) {
-                       int i = lex.getInteger();
-                       if (lex.next()) {
-                           if (i == 5) {
-                               params_.scale = lex.getInteger();
-                               params_.size_kind = InsetGraphicsParams::SCALE;
-                           } else {
-                               string const value = lex.getString();
-                               lyxerr[Debug::GRAPHICS] << "readFiginset::oldWidth: "
-                                       << value << oldUnitsWidth[i] << endl;
-                               params_.width = LyXLength(value + oldUnitsWidth[i]);
-                               lyxerr[Debug::GRAPHICS] << "readFiginset::newWidth: "
-                                       << params_.width.asString() << endl;
-                               params_.size_kind = InsetGraphicsParams::WH;
-                           }
-                       }
-                   }
-               } else if (token == "height") {
-                   if (lex.next()) {
-                       int i = lex.getInteger();
-                       if (lex.next()) {
-                               string const value = lex.getString();
-                               lyxerr[Debug::GRAPHICS] << "readFiginset::oldHeight: "
-                                       << value << oldUnitsHeight[i] << endl;
-                               params_.height = LyXLength(value + oldUnitsHeight[i]);
-                               lyxerr[Debug::GRAPHICS] << "readFiginset::newHeight: "
-                                       << params_.height.asString() << endl;
-                           params_.size_kind = InsetGraphicsParams::WH;
-                       }
-                   }
-               }
-       }
-}
 
 string const InsetGraphics::createLatexOptions() const
 {
@@ -555,20 +489,22 @@ string const InsetGraphics::createLatexOptions() const
            options << "  draft,\n";
        if (params().clip)
            options << "  clip,\n";
-       if (params().size_kind == InsetGraphicsParams::WH) {
-           if (!params().width.zero())
-               options << "  width=" << params().width.asLatexString() << ",\n";
-           if (!params().height.zero())
-               options << "  height=" << params().height.asLatexString() << ",\n";
-       } else if (params().size_kind == InsetGraphicsParams::SCALE) {
-           if (params().scale > 0)
-               options << "  scale=" << double(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";
        }
-       if (params().keepAspectRatio)
-           options << "  keepaspectratio,\n";
-       // Make sure it's not very close to zero, a float can be effectively
-       // zero but not exactly zero.
-       if (!lyx::float_equal(params().rotateAngle, 0, 0.001) && params().rotate) {
+
+       // Make sure rotation angle is not very close to zero;
+       // a float can be effectively zero but not exactly zero.
+       if (!lyx::float_equal(params().rotateAngle, 0, 0.001)) {
            options << "  angle=" << params().rotateAngle << ",\n";
            if (!params().rotateOrigin.empty()) {
                options << "  origin=" << params().rotateOrigin[0];
@@ -581,39 +517,17 @@ string const InsetGraphics::createLatexOptions() const
                options << ",\n";
            }
        }
+
        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.
@@ -752,9 +666,14 @@ string const InsetGraphics::prepareFile(Buffer const *buf) const
                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);
@@ -779,7 +698,7 @@ int InsetGraphics::latex(Buffer const *buf, ostream & os,
                 IsFileReadable(file_ + ".eps") ||      // original.eps
                 IsFileReadable(file_ + ".ps"));        // original.ps
        string const message = file_exists ?
-               string() : string("bb = 0 0 200 100, draft, type=eps]");
+               string() : string("bb = 0 0 200 100, draft, type=eps");
        // if !message.empty() than there was no existing file
        // "filename(.(e)ps)" found. In this case LaTeX
        // draws only a rectangle with the above bb and the
@@ -804,11 +723,9 @@ int InsetGraphics::latex(Buffer const *buf, ostream & os,
        lyxerr[Debug::GRAPHICS] << "\tOpts = " << opts << endl;
 
        if (!opts.empty() && !message.empty())
-               before += ("[%\n" + opts + ',' + message);
-       else if (!message.empty())
-               before += ("[%\n" + message);
-       else if (!opts.empty())
-               before += ("[%\n" + opts + ']');
+               before += ("[%\n" + opts + ',' + message + ']');
+       else if (!opts.empty() || !message.empty())
+               before += ("[%\n" + opts + message + ']');
 
        lyxerr[Debug::GRAPHICS]
                << "\tBefore = " << before
@@ -845,7 +762,15 @@ int InsetGraphics::ascii(Buffer const *, ostream & os, int) const
        // 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;
 }
 
@@ -888,7 +813,8 @@ void InsetGraphics::validate(LaTeXFeatures & features) const
 
 void InsetGraphics::statusChanged()
 {
-       current_view->updateInset(this, false);
+       if (cache_->view.get())
+               cache_->view.get()->updateInset(this, false);
 }