]> git.lyx.org Git - lyx.git/blobdiff - src/insets/insetgraphics.C
Don't remove cell selections after fontchange.
[lyx.git] / src / insets / insetgraphics.C
index 6333d45e8336e0fb7a8a68d1c04958463f3c024c..1dc04a8530c0eea9948d5443e3762bdede8630ab 100644 (file)
@@ -3,22 +3,12 @@
  * 
  *           LyX, The Document Processor
  *      
- *           Copyright 1995-2001 the LyX Team.
+ *           Copyright 1995-2002 the LyX Team.
  *           
- *           This file Copyright 2000 Baruch Even.
+ * \author Baruch Even
+ * \author Herbert Voss <voss@lyx.org>
  * ====================================================== */
 
-/*
-Major tasks:
-       * Switch to convert the images in the background, this requires work on
-               the converter, the systemcontroller and the graphics cache.
-
-Minor tasks:
-    * Pop up a dialog if the widget version is higher than what we accept.
-       * Provide sed/awk/C code to downgrade from InsetGraphics to FigInset(?)
-        
-*/
-
 /*
 Known BUGS:
     
@@ -28,10 +18,15 @@ Known BUGS:
        We should probably use what the user asks to use... but when he chooses
        by the file dialog we normally get an absolute path and this may not be 
        what the user meant.
-    * Bug in FileDlg class (src/filedlg.[hC]) when selecting a file and then
-        pressing ok, it counts as if no real selection done. Apparently
-        when choosing a file it doesn't update the select file input line.
-               
+       [Note that browseRelFile in helper_funcs.* provides a file name
+        which is relative if it is at reference path (here puffer path)
+        level or below, and an absolute path if the file name is not a
+        `natural' relative file name. In any case,
+            MakeAbsPath(filename, buf->filePath())
+        is guaranteed to provide the correct absolute path. This is what is
+        done know for include insets. Feel free to ask me -- JMarc
+       14/01/2002]
+       
        * If we are trying to create a file in a read-only directory and there
                are graphics that need converting, the converting will fail because
                it is done in-place, into the same directory as the original image.
@@ -41,7 +36,7 @@ Known BUGS:
        * We do not dither or resize the image in a WYSIWYM way, we load it at
                its original size and color, resizing is done in the final output,
                but not in the LyX window.
-               
+
 TODO Before initial production release:
     * Replace insetfig everywhere
         * Search for comments of the form
@@ -49,13 +44,6 @@ TODO Before initial production release:
           And act upon them. Make sure not to remove InsetFig code for the 
                  1.2.0 release, only afterwards, after deployment shows InsetGraphics
                  to be ok.
-TODO Extended features:
-    * Advanced Latex tab folder.
-    * Add support for more features so that it will be better than insetfig.
-        * Keep aspect ratio radio button
-        * Support for complete control over the latex parameters for TeXperts
         * What advanced features the users want to do?
             Implement them in a non latex dependent way, but a logical way.
             LyX should translate it to latex or any other fitting format.
@@ -64,49 +52,22 @@ TODO Extended features:
        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.
+         it knows of, thus selection based on the image instead of based on
+         filename.
        * Add support for the 'picins' package.
        * Add support for the 'picinpar' package.
        * Improve support for 'subfigure' - Allow to set the various options
                that are possible.
-       * Add resizing by percentage of image size (50%, 150%) - usefull for two
-               images of different size to be resized where they both should have
-               the same scale compared to each other.
  */
 
 /* NOTES:
- *
- * Intentions:
- *  This is currently a moving target, I'm trying stuff and learning what
- *  is needed and how to accomplish it, since there is no predefined goal or
- *  way to go I invent it as I go.
- *
- *  My current intention is for seperation from LaTeX, the basic needs are 
- *  resizing and rotating, displaying on screen in various depths and printing
- *  conversion of depths (independent of the display depth). For this I'll 
- *  provide a simple interface.
- *
- *  The medium level includes clipping of the image, but in a limited way.
- *
- *  For the LaTeX gurus I'll provide a complete control over the output, but
- *  this is latex dependent and guru dependent so I'd rather avoid doing this
- *  for the normal user. This stuff includes clipping, special image size
- *  specifications (\textwidth\minus 2in) which I see no way to generalize
- *  to non-latex specific way.
- *
- * Used packages:
- *  'graphicx' for the graphics inclusion.
- *  'subfigure' for the subfigures.
- *
  * Fileformat:
- *
  * Current version is 1 (inset file format version), when changing it
  * it should be changed in the Write() function when writing in one place
  * and when reading one should change the version check and the error message.
- *
  * The filename is kept in  the lyx file in a relative way, so as to allow
  * moving the document file and its images with no problem.
+ * 
  *
  * Conversions:
  *   Postscript output means EPS figures.
@@ -116,6 +77,7 @@ TODO Extended features:
  *     Image format
  *     from        to
  *     EPS         epstopdf
+ *     PS          ps2pdf
  *     JPG/PNG     direct
  *     PDF         direct
  *     others      PNG
@@ -129,35 +91,51 @@ TODO Extended features:
 
 #include "insets/insetgraphics.h"
 #include "insets/insetgraphicsParams.h"
+
 #include "graphics/GraphicsCache.h"
 #include "graphics/GraphicsCacheItem.h"
 
-#include "frontends/Dialogs.h"
 #include "LyXView.h"
 #include "buffer.h"
 #include "BufferView.h"
 #include "converter.h"
-#include "frontends/support/LyXImage.h"
 #include "Painter.h"
 #include "lyx_gui_misc.h"
-#include "support/FileInfo.h"
-#include "support/filetools.h"
-#include "support/lyxlib.h"
 #include "lyxtext.h"
 #include "lyxrc.h"
-#include "font.h" // For the lyxfont class.
-#include <algorithm> // For the std::max
-#include "support/lyxmanip.h"
+#include "font.h"
 #include "debug.h"
 #include "gettext.h"
 
+#include "frontends/Dialogs.h"
+#include "frontends/Alert.h"
+#include "frontends/controllers/helper_funcs.h"
+#include "frontends/support/LyXImage.h"
+
+#include "support/FileInfo.h"
+#include "support/filetools.h"
+#include "support/lyxlib.h"
+#include "support/lyxmanip.h"
+#include "support/lyxalgo.h"
+
+#include <fstream>
+#include <algorithm>
+
 extern string system_tempdir;
 
+using std::ifstream;
 using std::ostream;
 using std::endl;
+using std::max;
+using std::vector;
+
 
+///////////////////////////////////////////////////////////////////////////
+int const VersionNumber = 1;
+///////////////////////////////////////////////////////////////////////////
 
 // This function is a utility function
+// ... that should be with ChangeExtension ...
 inline
 string const RemoveExtension(string const & filename)
 {
@@ -165,9 +143,25 @@ string const RemoveExtension(string const & filename)
 }
 
 
+namespace {
+
+string const unique_id()
+{
+       static unsigned int seed = 1000;
+
+       ostringstream ost;
+       ost << "graph" << ++seed;
+
+       // Needed if we use lyxstring.
+       return ost.str().c_str();
+}
+
+} // namespace anon
+
+
 // Initialize only those variables that do not have a constructor.
 InsetGraphics::InsetGraphics()
-       : cacheHandle(0), imageLoaded(false)
+       : cacheHandle(0), imageLoaded(false), graphic_label(unique_id())
 {}
 
 
@@ -175,6 +169,7 @@ InsetGraphics::InsetGraphics(InsetGraphics const & ig, bool same_id)
        : Inset(), SigC::Object()
        , cacheHandle(ig.cacheHandle)
        , imageLoaded(ig.imageLoaded)
+       , graphic_label(unique_id())
 {
        setParams(ig.getParams());
        if (same_id)
@@ -189,35 +184,31 @@ InsetGraphics::~InsetGraphics()
 }
 
 
-string const
-InsetGraphics::statusMessage() const
+string const InsetGraphics::statusMessage() const
 {
        string msg;
-
        if (cacheHandle.get()) {
                switch (cacheHandle->getImageStatus()) {
                case GraphicsCacheItem::UnknownError:
                        msg = _("Unknown Error");
                        break;
-
                case GraphicsCacheItem::Loading:
                        msg = _("Loading...");
                        break;
-
                case GraphicsCacheItem::ErrorReading:
                        msg = _("Error reading");
                        break;
-
+               case GraphicsCacheItem::Converting:
+                       msg = _("Converting Image");
+                       break;
                case GraphicsCacheItem::ErrorConverting:
                        msg = _("Error converting");
                        break;
-
                case GraphicsCacheItem::Loaded:
                        // No message to write.
                        break;
                }
        }
-
        return msg;
 }
 
@@ -246,13 +237,25 @@ int InsetGraphics::width(BufferView *, LyXFont const & font) const
        if (cacheHandle.get() && (pixmap = cacheHandle->getImage()))
                return pixmap->getWidth();
        else {
-               string const msg = statusMessage();
                int font_width = 0;
+
+               LyXFont msgFont(font);
+               msgFont.setFamily(LyXFont::SANS_FAMILY);
+
+               string const justname = OnlyFilename (params.filename);
+               if (!justname.empty()) {
+                       msgFont.setSize(LyXFont::SIZE_FOOTNOTE);
+                       font_width = lyxfont::width(justname, msgFont);
+               }
+
+               string const msg = statusMessage();
+               if (!msg.empty()) {
+                       msgFont.setSize(LyXFont::SIZE_TINY);
+                       int const msg_width = lyxfont::width(msg, msgFont);
+                       font_width = max(font_width, msg_width);
+               }
                
-               if (!msg.empty())
-                       font_width = lyxfont::width(msg, font);
-               
-               return std::max(50, font_width + 15);
+               return max(50, font_width + 15);
        }
 }
 
@@ -277,38 +280,35 @@ void InsetGraphics::draw(BufferView * bv, LyXFont const & font,
                paint.image(old_x + 2, baseline - lascent,
                            lwidth - 4, lascent + ldescent,
                            cacheHandle->getImage());
-       } else {
-               
+       } else {        
                // Get the image status, default to unknown error.
                GraphicsCacheItem::ImageStatus status = GraphicsCacheItem::UnknownError;
-               if (cacheHandle.get())
+               if (lyxrc.use_gui && params.display != InsetGraphicsParams::NONE &&
+                   cacheHandle.get())
                        status = cacheHandle->getImageStatus();
-               
                // Check if the image is now ready.
                if (status == GraphicsCacheItem::Loaded) {
                        imageLoaded = true;
-
                        // Tell BufferView we need to be updated!
                        bv->text->status(bv, LyXText::CHANGED_IN_DRAW);
                        return;
                }
-
-               
                paint.rectangle(old_x + 2, baseline - lascent,
                                lwidth - 4,
                                lascent + ldescent);
-
-               string const msg = statusMessage();
-               if (!msg.empty()) {
-                       // Print the message.
-                       LyXFont msgFont(font);
-                       msgFont.setFamily(LyXFont::SANS_FAMILY);
+               // Print the file name.
+               LyXFont msgFont(font);
+               msgFont.setFamily(LyXFont::SANS_FAMILY);
+               string const justname = OnlyFilename (params.filename);
+               if (!justname.empty()) {
                        msgFont.setSize(LyXFont::SIZE_FOOTNOTE);
-                       string const justname = OnlyFilename (params.filename);
                        paint.text(old_x + 8, 
-                                  baseline - lyxfont::maxAscent(msgFont) - 4,
-                                  justname, msgFont);
-
+                                  baseline - lyxfont::maxAscent(msgFont) - 4,
+                                  justname, msgFont);
+               }
+               // Print the message.
+               string const msg = statusMessage();
+               if (!msg.empty()) {
                        msgFont.setSize(LyXFont::SIZE_TINY);
                        paint.text(old_x + 8, baseline - 4, msg, msgFont);
                }
@@ -336,15 +336,14 @@ Inset::EDITABLE InsetGraphics::editable() const
 
 void InsetGraphics::write(Buffer const * buf, ostream & os) const
 {
-       os << "Graphics FormatVersion 1\n";
-
+       os << "Graphics FormatVersion " << VersionNumber << '\n';
        params.Write(buf, os);
 }
 
 
 void InsetGraphics::read(Buffer const * buf, LyXLex & lex)
 {
-       string const token = lex.GetString();
+       string const token = lex.getString();
 
        if (token == "Graphics")
                readInsetGraphics(buf, lex);
@@ -360,12 +359,12 @@ void InsetGraphics::readInsetGraphics(Buffer const * buf, LyXLex & lex)
 {
        bool finished = false;
 
-       while (lex.IsOK() && !finished) {
+       while (lex.isOK() && !finished) {
                lex.next();
 
-               string const token = lex.GetString();
+               string const token = lex.getString();
                lyxerr[Debug::INFO] << "Token: '" << token << '\'' 
-                                   << std::endl;
+                                   << endl;
 
                if (token.empty()) {
                        continue;
@@ -373,32 +372,42 @@ void InsetGraphics::readInsetGraphics(Buffer const * buf, LyXLex & lex)
                        finished = true;
                } else if (token == "FormatVersion") {
                        lex.next();
-                       int version = lex.GetInteger();
-                       if (version > 1)
+                       int version = lex.getInteger();
+                       if (version > VersionNumber)
                                lyxerr
                                << "This document was created with a newer Graphics widget"
                                ", You should use a newer version of LyX to read this"
                                " file."
-                               << std::endl;
+                               << endl;
                        // TODO: Possibly open up a dialog?
                }
                else {
                        if (! params.Read(buf, lex, token))
                                lyxerr << "Unknown token, " << token << ", skipping." 
-                                       << std::endl;
+                                       << endl;
                }
        }
 }
 
-
+// FormatVersion < 1.0  (LyX < 1.2)
 void InsetGraphics::readFigInset(Buffer const * buf, LyXLex & lex)
 {
+       vector<string> const oldUnits =
+               getVectorFromString("pt,cm,in,p%,c%");
        bool finished = false;
-       
-       while (lex.IsOK() && !finished) {
+       // 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();
+               string const token = lex.getString();
                lyxerr[Debug::INFO] << "Token: " << token << endl;
                
                if (token.empty())
@@ -407,148 +416,142 @@ void InsetGraphics::readFigInset(Buffer const * buf, LyXLex & lex)
                        finished = true;
                } else if (token == "file") {
                        if (lex.next()) {
-                               string const name = lex.GetString();
-                               string const path = OnlyPath(buf->fileName());
+                               string const name = lex.getString();
+                               string const path = buf->filePath();
                                params.filename = MakeAbsPath(name, path);
                        }
                } 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();
+                       if (lex.eatLine())
+                               params.subcaptionText = lex.getString();
+                       params.subcaption = true;
                } else if (token == "label") {
                        if (lex.next());
                        // kept for backwards compability. Delete in 0.13.x
                } else if (token == "angle") {
                        if (lex.next())
-                               params.rotateAngle = lex.GetFloat();
+                               params.rotate = true;
+                               params.rotateAngle = lex.getFloat();
                } else if (token == "size") {
-                       // Size of image on screen is ignored in InsetGraphics, just eat
-                       // the input.
                        if (lex.next())
-                               lex.GetInteger();
+                               params.lyxwidth = LyXLength(lex.getString()+"pt");
                        if (lex.next())
-                               lex.GetInteger();
+                               params.lyxheight = LyXLength(lex.getString()+"pt");
                } else if (token == "flags") {
-                       InsetGraphicsParams::DisplayType tmp = InsetGraphicsParams::COLOR;
                        if (lex.next())
-                               switch (lex.GetInteger()) {
-                               case 1: tmp = InsetGraphicsParams::MONOCHROME; break;
-                               case 2: tmp = InsetGraphicsParams::GRAYSCALE; break;
+                               switch (lex.getInteger()) {
+                               case 1: params.display = InsetGraphicsParams::MONOCHROME; 
+                                   break;
+                               case 2: params.display = InsetGraphicsParams::GRAYSCALE; 
+                                   break;
+                               case 3: params.display = InsetGraphicsParams::COLOR; 
+                                   break;
                                }
-                       params.display = tmp;
                } else if (token == "subfigure") {
                        params.subcaption = true;
                } else if (token == "width") {
-                       if (lex.next())
-                               params.widthResize = static_cast<InsetGraphicsParams::Resize>(lex.GetInteger());
-                       if (lex.next())
-                               params.widthSize = lex.GetFloat();
+                   if (lex.next()) {
+                       int i = lex.getInteger();
+                       if (lex.next()) {
+                           if (i == 5) {
+                               params.scale = lex.getInteger();
+                               params.size_type = InsetGraphicsParams::SCALE;
+                           } else {
+                               params.width = LyXLength(lex.getString()+oldUnits[i]);
+                               params.size_type = InsetGraphicsParams::WH;
+                           }
+                       }
+                   }
                } else if (token == "height") {
-                       if (lex.next())
-                               params.heightResize = static_cast<InsetGraphicsParams::Resize>(lex.GetInteger());
-                       if (lex.next())
-                               params.heightSize = lex.GetFloat();
+                   if (lex.next()) {
+                       int i = lex.getInteger();
+                       if (lex.next()) {
+                           params.height = LyXLength(lex.getString()+oldUnits[i]);
+                           params.size_type = InsetGraphicsParams::WH;
+                       }
+                   }
                }
        }
 }
 
-
-namespace {
-
-void formatResize(ostream & os, string const & key,
-                 InsetGraphicsParams::Resize resizeType, double size)
-{
-       switch (resizeType) {
-       case InsetGraphicsParams::DEFAULT_SIZE:
-               break;
-
-       case InsetGraphicsParams::CM:
-               os << key << '=' << size << "cm,";
-               break;
-
-       case InsetGraphicsParams::INCH:
-               os << key << '=' << size << "in,";
-               break;
-
-       case InsetGraphicsParams::PERCENT_PAGE:
-               os << key << '=' << size / 100 << "\\text" << key << ',';
-               break;
-
-       case InsetGraphicsParams::PERCENT_COLUMN:
-               os << key << '=' << size / 100 << "\\column" << key << ',';
-               break;
-
-       }
-}
-
-} // namespace anon
-
-
-string const
-InsetGraphics::createLatexOptions() const
+string const InsetGraphics::createLatexOptions() const
 {
        // Calculate the options part of the command, we must do it to a string
        // stream since we might have a trailing comma that we would like to remove
        // before writing it to the output stream.
        ostringstream options;
-
-       formatResize(options, "width", params.widthResize, params.widthSize);
-       formatResize(options, "height", params.heightResize, params.heightSize);
-
+       if (!params.bb.empty())
+           options << "  bb=" << strip(params.bb) << ",\n";
+       if (params.draft)
+           options << "  draft,\n";
+       if (params.clip)
+           options << "  clip,\n";
+       if (params.size_type == 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_type == InsetGraphicsParams::SCALE) {
+           if (params.scale > 0)
+               options << "  scale=" << double(params.scale)/100.0 << ",\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)) {
-               options << "angle="
-                       << params.rotateAngle << ',';
+       if (!lyx::float_equal(params.rotateAngle, 0, 0.001) && params.rotate) {
+           options << "  angle=" << params.rotateAngle << ",\n";
+           if (!params.rotateOrigin.empty()) {
+               options << "  origin=" << params.rotateOrigin[0];
+               if (contains(params.rotateOrigin,"Top"))
+                   options << 't';
+               else if (contains(params.rotateOrigin,"Bottom"))
+                   options << 'b';
+               else if (contains(params.rotateOrigin,"Baseline"))
+                   options << 'B';
+               options << ",\n";
+           }
        }
-
+       if (!params.special.empty())
+           options << params.special << ",\n";
        string opts = options.str().c_str();
-       opts = strip(opts, ',');
-
-       return opts;
+       return opts.substr(0,opts.size()-2);    // delete last ",\n"
 }
 
 namespace {
-       
-string decideOutputImageFormat(string const & in_fmt)
+string decideOutputImageFormat(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).
-       
+       // (Should actually mean, are we using latex or pdflatex).      
+       lyxerr[Debug::INFO] << "decideOutput::lyxrc.pdf_mode = " << lyxrc.pdf_mode << "\n";
        if (lyxrc.pdf_mode) {
-               if (in_fmt == "eps" || in_fmt == "epsi" || in_fmt == "pdf")
+               if (contains(suffix,"ps") || suffix == "pdf")
                        return "pdf";
-               else if (in_fmt == "jpg" || in_fmt == "jpeg")
-                       return in_fmt;
+               else if (suffix == "jpg")
+                       return suffix;
                else
                        return "png";
        }
-
        // If it's postscript, we always do eps.
-       // Garst has many eps files with various extensions, we just assume
-       // whatever goes in (except those we know to be otherwise) is eps
-       if (in_fmt == "gif" || in_fmt == "png" || in_fmt == "jpg")
-               return "eps";
-       return in_fmt;
+       lyxerr[Debug::INFO] << "decideOutput: we have PostScript mode\n";
+       if (suffix != "ps")
+           return "eps";
+       else
+           return "ps";
 }
 
 } // Anon. namespace
 
-string const 
-InsetGraphics::prepareFile(Buffer const *buf) const
+string const InsetGraphics::prepareFile(Buffer const *buf) const
 {
-
        // do_convert = Do we need to convert the file?
        // nice = Do we create a nice version?
        //        This is used when exporting the latex file only.
-       // 
-       // 
        // if (!do_convert)
        //   return original filename
-       // 
        // if (!nice)
        //   convert_place = temp directory
        //   return new filename in temp directory
@@ -556,34 +559,38 @@ InsetGraphics::prepareFile(Buffer const *buf) const
        //   convert_place = original file directory
        //   return original filename without the extension
        //
-       
+       // if it's a zipped one, than let LaTeX do the rest!!!
+       if ((zippedFile(params.filename) && params.noUnzip) || buf->niceFile) {
+           lyxerr[Debug::INFO] << "don't unzip file or export latex" 
+                   << params.filename << endl;
+           return params.filename;
+       }
+       string filename_ = params.filename;
+       if (zippedFile(filename_))
+           filename_ = unzipFile(filename_);
+       // now we have unzipped files
        // Get the extension (format) of the original file.
-       string const extension = GetExtension(params.filename);
-       
-       // Are we creating a PDF or a PS file?
-       // (Should actually mean, are we usind latex or pdflatex).
+       // we handle it like a virtual one, so we can have
+       // different extensions with the same type.
+       string const extension = getExtFromContents(filename_);
+       // are we usind latex ((e)ps) or pdflatex (pdf,jpg,png)
        string const image_target = decideOutputImageFormat(extension);
-
-       if (extension == image_target)
-               return params.filename;
-
+       if (extension == image_target)          // :-)
+               return filename_;
+//     commented out to check if the "not exist"bug is fixed.
+//     if (!IsFileReadable(filename_)) {       // :-(
+//             Alert::alert(_("File") + params.filename,
+//                        _("isn't readable or doesn't exists!"));
+//             return filename_;
+//     }
        string outfile;
-       if (!buf->niceFile) {
-               string const temp = AddName(buf->tmppath, params.filename);
-               outfile = RemoveExtension(temp);
-               
-               //lyxerr << "buf::tmppath = " << buf->tmppath << "\n";
-               //lyxerr << "filename = " << params.filename << "\n";
-               //lyxerr << "temp = " << temp << "\n";
-               //lyxerr << "outfile = " << outfile << endl;
-       } else {
-               string const path = OnlyPath(buf->fileName());
-               string const relname = MakeRelPath(params.filename, path);
-               outfile = RemoveExtension(relname);
-       }
-
-       converters.Convert(buf, params.filename, outfile, extension, image_target);
-       
+       string const temp = AddName(buf->tmppath, filename_);
+       outfile = RemoveExtension(temp);
+       lyxerr[Debug::INFO] << "tempname = " << temp << "\n";
+       lyxerr[Debug::INFO] << "buf::tmppath = " << buf->tmppath << "\n";
+       lyxerr[Debug::INFO] << "filename_ = " << filename_ << "\n";
+       lyxerr[Debug::INFO] << "outfile = " << outfile << endl;
+       converters.convert(buf, filename_, outfile, extension, image_target);
        return outfile;
 }
 
@@ -591,71 +598,51 @@ InsetGraphics::prepareFile(Buffer const *buf) const
 int InsetGraphics::latex(Buffer const *buf, ostream & os,
                         bool /*fragile*/, bool/*fs*/) const
 {
-       // MISSING: We have to decide how to do the order of the options
-       // that is dependent of order, like width, height, angle. Should
-       // we rotate before scale? Should we let the user decide?
-       // bool rot_before_scale; ?
-
-       // (BE) As a first step we should do a scale before rotate since this is
-       // more like the natural thought of how to do it.
-       // (BE) I believe that a priority list presented to the user with
-       // a default order would be the best, though it would be better to
-       // hide such a thing in an "Advanced options" dialog.
-       // (BE) This should go an advanced LaTeX options dialog.
-
        // If there is no file specified, just output a message about it in
        // the latex output.
        if (params.filename.empty()) {
                os  << "\\fbox{\\rule[-0.5in]{0pt}{1in}"
-                       << _("empty figure path")
-                       << "}\n";
-
+                       << _("empty figure path") << "}\n";
                return 1; // One end of line marker added to the stream.
        }
-
-       // Keep count of newlines that we issued.
-       int newlines = 0;
-
-       // This variables collect all the latex code that should be before and
+       // These variables collect all the latex code that should be before and
        // after the actual includegraphics command.
        string before;
        string after;
-
        // Do we want subcaptions?
        if (params.subcaption) {
                before += "\\subfigure[" + params.subcaptionText + "]{";
-               after = '}' + after;
+               after = '}';
        }
-
        // We never use the starred form, we use the "clip" option instead.
-       os << before << "\\includegraphics";
-
+       before += "\\includegraphics";
        // Write the options if there are any.
        string const opts = createLatexOptions();
        if (!opts.empty()) {
-               os << '[' << opts << ']';
+               before += ("[%\n" + opts +']');
        }
-
        // Make the filename relative to the lyx file
        // and remove the extension so the LaTeX will use whatever is
        // appropriate (when there are several versions in different formats)
-       string const filename = prepareFile(buf);
-       
-       os << '{' << filename << '}' << after;
-
+       string const latex_str = before + '{' + prepareFile(buf) + '}' + after;
+       os << latex_str;
        // Return how many newlines we issued.
+       int const newlines =
+               int(lyx::count(latex_str.begin(), latex_str.end(),'\n') + 1);
+       // lyxerr << "includegraphics: " << newlines << " lines of text"
+       //        << endl; 
        return newlines;
 }
 
 
-int InsetGraphics::ascii(Buffer const *, ostream &, int) const
+int InsetGraphics::ascii(Buffer const *, ostream & os, int) const
 {
        // No graphics in ascii output. Possible to use gifscii to convert
        // images to ascii approximation.
-       
        // 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 << '<' << _("Graphicfile:") << params.filename << ">\n";
        return 0;
 }
 
@@ -670,17 +657,12 @@ int InsetGraphics::linuxdoc(Buffer const *, ostream &) const
 // For explanation on inserting graphics into DocBook checkout:
 // http://linuxdoc.org/LDP/LDP-Author-Guide/inserting-pictures.html
 // See also the docbook guide at http://www.docbook.org/
-int InsetGraphics::docBook(Buffer const * buf, ostream & os) const
+int InsetGraphics::docbook(Buffer const *, ostream & os) const
 {
-       // Change the path to be relative to the main file.
-       string const buffer_dir = OnlyPath(buf->fileName());
-       string const filename = RemoveExtension(
-                                  MakeRelPath(params.filename, buffer_dir));
-
        // In DocBook v5.0, the graphic tag will be eliminated from DocBook, will 
        // need to switch to MediaObject. However, for now this is sufficient and 
        // easier to use.
-       os << "<graphic fileref=\"" << filename << "\"></graphic>";
+       os << "<graphic fileref=\"&" << graphic_label << ";\">";
        return 0;
 }
 
@@ -691,10 +673,12 @@ void InsetGraphics::validate(LaTeXFeatures & features) const
        if (params.filename.empty())
                return ;
 
-       features.graphicx = true;
+       features.includeFile(graphic_label, RemoveExtension(params.filename));
+
+       features.require("graphicx");
 
        if (params.subcaption)
-               features.subfigure = true;
+               features.require("subfigure");
 }
 
 
@@ -707,7 +691,20 @@ void InsetGraphics::updateInset() const
 
        // We do it this way so that in the face of some error, we will still
        // be in a valid state.
-       if (!params.filename.empty()) {
+       InsetGraphicsParams::DisplayType local_display = params.display;
+       if (local_display == InsetGraphicsParams::DEFAULT) {
+               if (lyxrc.display_graphics == "mono")
+                       local_display = InsetGraphicsParams::MONOCHROME;
+               else if (lyxrc.display_graphics == "gray")
+                       local_display = InsetGraphicsParams::GRAYSCALE;
+               else if (lyxrc.display_graphics == "color")
+                       local_display = InsetGraphicsParams::COLOR;
+               else
+                       local_display = InsetGraphicsParams::NONE;
+       }
+
+       if (!params.filename.empty() && lyxrc.use_gui &&
+           local_display != InsetGraphicsParams::NONE) {
                temp = gc.addFile(params.filename);
        }
 
@@ -745,3 +742,4 @@ Inset * InsetGraphics::clone(Buffer const &, bool same_id) const
 {
        return new InsetGraphics(*this, same_id);
 }
+