]> git.lyx.org Git - lyx.git/blobdiff - src/insets/insetinclude.C
Final touch 'inset display()'; fix 'is a bit silly' bug
[lyx.git] / src / insets / insetinclude.C
index 9d756470268cfb6a36066557a43b0bea6f33a06c..5a02886a53564a4e42acb938db38f3edd0bcd55b 100644 (file)
 #include "gettext.h"
 #include "LaTeXFeatures.h"
 #include "latexrunparams.h"
+#include "lyx_main.h"
 #include "lyxlex.h"
 #include "metricsinfo.h"
 
+#include "frontends/LyXView.h"
 #include "frontends/Painter.h"
 
-#include "graphics/PreviewedInset.h"
-#include "graphics/PreviewImage.h"
+#include "graphics/PreviewLoader.h"
+
+#include "insets/render_preview.h"
 
 #include "support/FileInfo.h"
-#include "support/FileMonitor.h"
 #include "support/filetools.h"
 #include "support/lstrings.h" // contains
 #include "support/tostr.h"
 
 #include <boost/bind.hpp>
 
+#include "support/std_ostream.h"
 #include "support/std_sstream.h"
 
 using lyx::support::AddName;
 using lyx::support::ChangeExtension;
 using lyx::support::contains;
 using lyx::support::FileInfo;
-using lyx::support::FileMonitor;
 using lyx::support::GetFileContents;
 using lyx::support::IsFileReadable;
 using lyx::support::IsLyXFilename;
 using lyx::support::MakeAbsPath;
 using lyx::support::MakeDisplayPath;
+using lyx::support::OnlyFilename;
 using lyx::support::OnlyPath;
 using lyx::support::subst;
 
 using std::endl;
-
+using std::string;
 using std::auto_ptr;
 using std::istringstream;
 using std::ostream;
@@ -64,35 +67,6 @@ using std::ostringstream;
 extern BufferList bufferlist;
 
 
-class InsetInclude::PreviewImpl : public lyx::graphics::PreviewedInset {
-public:
-       ///
-       PreviewImpl(InsetInclude & p) : PreviewedInset(p) {}
-
-       ///
-       bool previewWanted() const;
-       ///
-       string const latexString() const;
-       ///
-       InsetInclude & parent() const {
-               return *static_cast<InsetInclude*>(inset());
-       }
-
-       ///
-       bool monitoring() const { return monitor_.get(); }
-       ///
-       void startMonitoring();
-       ///
-       void stopMonitoring() { monitor_.reset(); }
-
-private:
-       /// Invoked by monitor_ should the parent file change.
-       void restartLoading();
-       ///
-       boost::scoped_ptr<FileMonitor> monitor_;
-};
-
-
 namespace {
 
 string const uniqueID()
@@ -104,20 +78,13 @@ string const uniqueID()
 } // namespace anon
 
 
-InsetInclude::InsetInclude(Params const & p)
+InsetInclude::InsetInclude(InsetCommandParams const & p)
        : params_(p), include_label(uniqueID()),
-         preview_(new PreviewImpl(*this)),
-         set_label_(false)
-{}
-
-
-InsetInclude::InsetInclude(InsetCommandParams const & p, Buffer const & b)
-       : include_label(uniqueID()),
-         preview_(new PreviewImpl(*this)),
+         preview_(new RenderMonitoredPreview),
          set_label_(false)
 {
-       params_.cparams = p;
-       params_.masterFilename_ = b.fileName();
+       preview_->connect(boost::bind(&InsetInclude::statusChanged, this));
+       preview_->fileChanged(boost::bind(&InsetInclude::fileChanged, this));
 }
 
 
@@ -125,9 +92,12 @@ InsetInclude::InsetInclude(InsetInclude const & other)
        : InsetOld(other),
          params_(other.params_),
          include_label(other.include_label),
-         preview_(new PreviewImpl(*this)),
+         preview_(new RenderMonitoredPreview),
          set_label_(other.set_label_)
-{}
+{
+       preview_->connect(boost::bind(&InsetInclude::statusChanged, this));
+       preview_->fileChanged(boost::bind(&InsetInclude::fileChanged, this));
+}
 
 
 InsetInclude::~InsetInclude()
@@ -137,16 +107,16 @@ InsetInclude::~InsetInclude()
 }
 
 
-dispatch_result InsetInclude::localDispatch(FuncRequest const & cmd)
+dispatch_result
+InsetInclude::priv_dispatch(FuncRequest const & cmd, idx_type &, pos_type &)
 {
        switch (cmd.action) {
 
        case LFUN_INSET_MODIFY: {
-               InsetInclude::Params p;
+               InsetCommandParams p;
                InsetIncludeMailer::string2params(cmd.argument, p);
-               if (!p.cparams.getCmdName().empty()) {
-                       set(p);
-                       params_.masterFilename_ = cmd.view()->buffer()->fileName();
+               if (!p.getCmdName().empty()) {
+                       set(p, *cmd.view()->buffer());
                        cmd.view()->updateInset(this);
                }
                return DISPATCHED;
@@ -166,68 +136,85 @@ dispatch_result InsetInclude::localDispatch(FuncRequest const & cmd)
                return DISPATCHED;
 
        default:
-               return InsetOld::localDispatch(cmd);
+               return UNDISPATCHED;
        }
 }
 
 
-InsetInclude::Params const & InsetInclude::params() const
+InsetCommandParams const & InsetInclude::params() const
 {
        return params_;
 }
 
 
-bool InsetInclude::Params::operator==(Params const & o) const
+namespace {
+
+/// the type of inclusion
+enum Types {
+       INCLUDE = 0,
+       VERB = 1,
+       INPUT = 2,
+       VERBAST = 3
+};
+
+
+Types type(InsetCommandParams const & params)
+{
+       string const command_name = params.getCmdName();
+
+       if (command_name == "input")
+               return INPUT;
+       if  (command_name == "verbatiminput")
+               return VERB;
+       if  (command_name == "verbatiminput*")
+               return VERBAST;
+       return INCLUDE;
+}
+
+
+bool isVerbatim(InsetCommandParams const & params)
 {
-       return cparams == o.cparams && flag == o.flag &&
-           masterFilename_ == o.masterFilename_;
+       string const command_name = params.getCmdName();
+       return command_name == "verbatiminput" ||
+               command_name == "verbatiminput*";
 }
 
 
-bool InsetInclude::Params::operator!=(Params const & o) const
+string const masterFilename(Buffer const & buffer)
 {
-       return !(*this == o);
+       return buffer.fileName();
 }
 
 
-void InsetInclude::set(Params const & p)
+string const includedFilename(Buffer const & buffer,
+                             InsetCommandParams const & params)
 {
-       params_ = p;
+       return MakeAbsPath(params.getContents(),
+                          OnlyPath(masterFilename(buffer)));
+}
 
-       string command;
-
-       switch (params_.flag) {
-               case INCLUDE:
-                       command="include";
-                       break;
-               case VERB:
-                       command="verbatiminput";
-                       break;
-               case INPUT:
-                       command="input";
-                       break;
-               case VERBAST:
-                       command="verbatiminput*";
-                       break;
-       }
 
-       params_.cparams.setCmdName(command);
+void generate_preview(RenderPreview &, InsetInclude const &, Buffer const &);
+
+} // namespace anon
+
+
+void InsetInclude::set(InsetCommandParams const & p, Buffer const & buffer)
+{
+       params_ = p;
+       set_label_ = false;
 
        if (preview_->monitoring())
                preview_->stopMonitoring();
 
-       if (lyx::graphics::PreviewedInset::activated() && params_.flag == INPUT)
-               preview_->generatePreview();
+       if (type(params_) == INPUT)
+               generate_preview(*preview_, *this, buffer);
 }
 
 
 auto_ptr<InsetBase> InsetInclude::clone() const
 {
-       //Params p(params_);
-       //p.masterFilename_ = buffer.fileName();
-#warning FIXME: broken cross-doc copy/paste - must fix
-
-       return auto_ptr<InsetBase>(new InsetInclude(params_));
+       return auto_ptr<InsetBase>(new InsetInclude(*this));
 }
 
 
@@ -239,8 +226,8 @@ void InsetInclude::write(Buffer const &, ostream & os) const
 
 void InsetInclude::write(ostream & os) const
 {
-       os << "Include " << params_.cparams.getCommand() << '\n'
-          << "preview " << tostr(params_.cparams.preview()) << '\n';
+       os << "Include " << params_.getCommand() << '\n'
+          << "preview " << tostr(params_.preview()) << '\n';
 }
 
 
@@ -252,18 +239,7 @@ void InsetInclude::read(Buffer const &, LyXLex & lex)
 
 void InsetInclude::read(LyXLex & lex)
 {
-       params_.cparams.read(lex);
-
-       if (params_.cparams.getCmdName() == "include")
-               params_.flag = INCLUDE;
-       else if (params_.cparams.getCmdName() == "input")
-               params_.flag = INPUT;
-       /* FIXME: is this logic necessary now ? */
-       else if (contains(params_.cparams.getCmdName(), "verbatim")) {
-               params_.flag = VERB;
-               if (params_.cparams.getCmdName() == "verbatiminput*")
-                       params_.flag = VERBAST;
-       }
+       params_.read(lex);
 }
 
 
@@ -271,7 +247,7 @@ string const InsetInclude::getScreenLabel(Buffer const &) const
 {
        string temp;
 
-       switch (params_.flag) {
+       switch (type(params_)) {
                case INPUT: temp += _("Input"); break;
                case VERB: temp += _("Verbatim Input"); break;
                case VERBAST: temp += _("Verbatim Input*"); break;
@@ -280,64 +256,60 @@ string const InsetInclude::getScreenLabel(Buffer const &) const
 
        temp += ": ";
 
-       if (params_.cparams.getContents().empty())
+       if (params_.getContents().empty())
                temp += "???";
        else
-               temp += params_.cparams.getContents();
+               temp += OnlyFilename(params_.getContents());
 
        return temp;
 }
 
 
-string const InsetInclude::getFileName() const
-{
-       return MakeAbsPath(params_.cparams.getContents(),
-                          OnlyPath(getMasterFilename()));
-}
-
-
-string const InsetInclude::getMasterFilename() const
-{
-       return params_.masterFilename_;
-}
-
+namespace {
 
-bool InsetInclude::loadIfNeeded() const
+/// return true if the file is or got loaded.
+bool loadIfNeeded(Buffer const & buffer, InsetCommandParams const & params)
 {
-       if (isVerbatim())
+       if (isVerbatim(params))
                return false;
 
-       if (!IsLyXFilename(getFileName()))
+       string const included_file = includedFilename(buffer, params);
+       if (!IsLyXFilename(included_file))
                return false;
 
-       if (bufferlist.exists(getFileName()))
+       if (bufferlist.exists(included_file))
                return true;
 
        // the readonly flag can/will be wrong, not anymore I think.
-       FileInfo finfo(getFileName());
+       FileInfo finfo(included_file);
        if (!finfo.isOK())
                return false;
-       return loadLyXFile(bufferlist.newBuffer(getFileName()),
-                          getFileName());
+       return loadLyXFile(bufferlist.newBuffer(included_file),
+                          included_file);
 }
 
 
+} // namespace anon
+
+
 int InsetInclude::latex(Buffer const & buffer, ostream & os,
                        LatexRunParams const & runparams) const
 {
-       string incfile(params_.cparams.getContents());
+       string incfile(params_.getContents());
 
        // Do nothing if no file name has been specified
        if (incfile.empty())
                return 0;
 
-       if (loadIfNeeded()) {
-               Buffer * tmp = bufferlist.getBuffer(getFileName());
+       string const included_file = includedFilename(buffer, params_);
+
+       if (loadIfNeeded(buffer, params_)) {
+               Buffer * tmp = bufferlist.getBuffer(included_file);
 
                // FIXME: this should be a GUI warning
                if (tmp->params().textclass != buffer.params().textclass) {
                        lyxerr << "WARNING: Included file `"
-                              << MakeDisplayPath(getFileName())
+                              << MakeDisplayPath(included_file)
                               << "' has textclass `"
                               << tmp->params().getLyXTextClass().name()
                               << "' while parent file has textclass `"
@@ -347,7 +319,7 @@ int InsetInclude::latex(Buffer const & buffer, ostream & os,
                }
 
                // write it to a file (so far the complete file)
-               string writefile = ChangeExtension(getFileName(), ".tex");
+               string writefile = ChangeExtension(included_file, ".tex");
 
                if (!buffer.temppath().empty() && !runparams.nice) {
                        incfile = subst(incfile, '/','@');
@@ -356,32 +328,33 @@ int InsetInclude::latex(Buffer const & buffer, ostream & os,
 #endif
                        writefile = AddName(buffer.temppath(), incfile);
                } else
-                       writefile = getFileName();
+                       writefile = included_file;
                writefile = ChangeExtension(writefile, ".tex");
                lyxerr[Debug::LATEX] << "incfile:" << incfile << endl;
                lyxerr[Debug::LATEX] << "writefile:" << writefile << endl;
 
                tmp->markDepClean(buffer.temppath());
 
-               tmp->makeLaTeXFile(writefile, OnlyPath(getMasterFilename()),
+               tmp->makeLaTeXFile(writefile,
+                                  OnlyPath(masterFilename(buffer)),
                                   runparams, false);
        }
 
-       if (isVerbatim()) {
-               os << '\\' << params_.cparams.getCmdName() << '{' << incfile << '}';
-       } else if (params_.flag == INPUT) {
+       if (isVerbatim(params_)) {
+               os << '\\' << params_.getCmdName() << '{' << incfile << '}';
+       } else if (type(params_) == INPUT) {
                // \input wants file with extension (default is .tex)
-               if (!IsLyXFilename(getFileName())) {
-                       os << '\\' << params_.cparams.getCmdName() << '{' << incfile << '}';
+               if (!IsLyXFilename(included_file)) {
+                       os << '\\' << params_.getCmdName() << '{' << incfile << '}';
                } else {
-                       os << '\\' << params_.cparams.getCmdName() << '{'
+                       os << '\\' << params_.getCmdName() << '{'
                           << ChangeExtension(incfile, ".tex")
                           <<  '}';
                }
        } else {
                // \include don't want extension and demands that the
                // file really have .tex
-               os << '\\' << params_.cparams.getCmdName() << '{'
+               os << '\\' << params_.getCmdName() << '{'
                   << ChangeExtension(incfile, string())
                   << '}';
        }
@@ -390,34 +363,36 @@ int InsetInclude::latex(Buffer const & buffer, ostream & os,
 }
 
 
-int InsetInclude::ascii(Buffer const &, ostream & os, int) const
+int InsetInclude::ascii(Buffer const & buffer, ostream & os, int) const
 {
-       if (isVerbatim())
-               os << GetFileContents(getFileName());
+       if (isVerbatim(params_))
+               os << GetFileContents(includedFilename(buffer, params_));
        return 0;
 }
 
 
 int InsetInclude::linuxdoc(Buffer const & buffer, ostream & os) const
 {
-       string incfile(params_.cparams.getContents());
+       string incfile(params_.getContents());
 
        // Do nothing if no file name has been specified
        if (incfile.empty())
                return 0;
 
-       if (loadIfNeeded()) {
-               Buffer * tmp = bufferlist.getBuffer(getFileName());
+       string const included_file = includedFilename(buffer, params_);
+
+       if (loadIfNeeded(buffer, params_)) {
+               Buffer * tmp = bufferlist.getBuffer(included_file);
 
                // write it to a file (so far the complete file)
-               string writefile = ChangeExtension(getFileName(), ".sgml");
+               string writefile = ChangeExtension(included_file, ".sgml");
                if (!buffer.temppath().empty() && !buffer.niceFile()) {
                        incfile = subst(incfile, '/','@');
                        writefile = AddName(buffer.temppath(), incfile);
                } else
-                       writefile = getFileName();
+                       writefile = included_file;
 
-               if (IsLyXFilename(getFileName()))
+               if (IsLyXFilename(included_file))
                        writefile = ChangeExtension(writefile, ".sgml");
 
                lyxerr[Debug::LATEX] << "incfile:" << incfile << endl;
@@ -426,9 +401,9 @@ int InsetInclude::linuxdoc(Buffer const & buffer, ostream & os) const
                tmp->makeLinuxDocFile(writefile, buffer.niceFile(), true);
        }
 
-       if (isVerbatim()) {
+       if (isVerbatim(params_)) {
                os << "<![CDATA["
-                  << GetFileContents(getFileName())
+                  << GetFileContents(included_file)
                   << "]]>";
        } else
                os << '&' << include_label << ';';
@@ -440,23 +415,25 @@ int InsetInclude::linuxdoc(Buffer const & buffer, ostream & os) const
 int InsetInclude::docbook(Buffer const & buffer, ostream & os,
                          bool /*mixcont*/) const
 {
-       string incfile(params_.cparams.getContents());
+       string incfile(params_.getContents());
 
        // Do nothing if no file name has been specified
        if (incfile.empty())
                return 0;
 
-       if (loadIfNeeded()) {
-               Buffer * tmp = bufferlist.getBuffer(getFileName());
+       string const included_file = includedFilename(buffer, params_);
+
+       if (loadIfNeeded(buffer, params_)) {
+               Buffer * tmp = bufferlist.getBuffer(included_file);
 
                // write it to a file (so far the complete file)
-               string writefile = ChangeExtension(getFileName(), ".sgml");
+               string writefile = ChangeExtension(included_file, ".sgml");
                if (!buffer.temppath().empty() && !buffer.niceFile()) {
                        incfile = subst(incfile, '/','@');
                        writefile = AddName(buffer.temppath(), incfile);
                } else
-                       writefile = getFileName();
-               if (IsLyXFilename(getFileName()))
+                       writefile = included_file;
+               if (IsLyXFilename(included_file))
                        writefile = ChangeExtension(writefile, ".sgml");
 
                lyxerr[Debug::LATEX] << "incfile:" << incfile << endl;
@@ -465,7 +442,7 @@ int InsetInclude::docbook(Buffer const & buffer, ostream & os,
                tmp->makeDocBookFile(writefile, buffer.niceFile(), true);
        }
 
-       if (isVerbatim()) {
+       if (isVerbatim(params_)) {
                os << "<inlinegraphic fileref=\""
                   << '&' << include_label << ';'
                   << "\" format=\"linespecific\">";
@@ -478,68 +455,73 @@ int InsetInclude::docbook(Buffer const & buffer, ostream & os,
 
 void InsetInclude::validate(LaTeXFeatures & features) const
 {
-
-       string incfile(params_.cparams.getContents());
+       string incfile(params_.getContents());
        string writefile;
 
-       Buffer const & b = *bufferlist.getBuffer(getMasterFilename());
+       Buffer const & buffer = features.buffer();
+
+       string const included_file = includedFilename(buffer, params_);
 
-       if (!b.temppath().empty() && !b.niceFile() && !isVerbatim()) {
+       if (!buffer.temppath().empty() &&
+           !buffer.niceFile() &&
+           !isVerbatim(params_)) {
                incfile = subst(incfile, '/','@');
-               writefile = AddName(b.temppath(), incfile);
+               writefile = AddName(buffer.temppath(), incfile);
        } else
-               writefile = getFileName();
+               writefile = included_file;
 
-       if (IsLyXFilename(getFileName()))
+       if (IsLyXFilename(included_file))
                writefile = ChangeExtension(writefile, ".sgml");
 
        features.includeFile(include_label, writefile);
 
-       if (isVerbatim())
+       if (isVerbatim(params_))
                features.require("verbatim");
 
        // Here we must do the fun stuff...
        // Load the file in the include if it needs
        // to be loaded:
-       if (loadIfNeeded()) {
+       if (loadIfNeeded(buffer, params_)) {
                // a file got loaded
-               Buffer * const tmp = bufferlist.getBuffer(getFileName());
+               Buffer * const tmp = bufferlist.getBuffer(included_file);
                if (tmp) {
-                       tmp->niceFile() = b.niceFile();
+                       tmp->niceFile() = buffer.niceFile();
                        tmp->validate(features);
                }
        }
 }
 
 
-void InsetInclude::getLabelList(std::vector<string> & list) const
+void InsetInclude::getLabelList(Buffer const & buffer,
+                               std::vector<string> & list) const
 {
-       if (loadIfNeeded()) {
-               Buffer * tmp = bufferlist.getBuffer(getFileName());
+       if (loadIfNeeded(buffer, params_)) {
+               string const included_file = includedFilename(buffer, params_);
+               Buffer * tmp = bufferlist.getBuffer(included_file);
                tmp->setParentName("");
                tmp->getLabelList(list);
-               tmp->setParentName(getMasterFilename());
+               tmp->setParentName(masterFilename(buffer));
        }
 }
 
 
-void InsetInclude::fillWithBibKeys(std::vector<std::pair<string,string> > & keys) const
+void InsetInclude::fillWithBibKeys(Buffer const & buffer,
+                                  std::vector<std::pair<string,string> > & keys) const
 {
-       if (loadIfNeeded()) {
-               Buffer * tmp = bufferlist.getBuffer(getFileName());
+       if (loadIfNeeded(buffer, params_)) {
+               string const included_file = includedFilename(buffer, params_);
+               Buffer * tmp = bufferlist.getBuffer(included_file);
                tmp->setParentName("");
                tmp->fillWithBibKeys(keys);
-               tmp->setParentName(getMasterFilename());
+               tmp->setParentName(masterFilename(buffer));
        }
 }
 
 
 void InsetInclude::metrics(MetricsInfo & mi, Dimension & dim) const
 {
-       if (preview_->previewReady()) {
-               dim.asc = preview_->pimage()->ascent();
-               dim.des = preview_->pimage()->descent();
-               dim.wid = preview_->pimage()->width();
+       if (RenderPreview::activated() && preview_->previewReady()) {
+               preview_->metrics(mi, dim);
        } else {
                if (!set_label_) {
                        set_label_ = true;
@@ -548,8 +530,8 @@ void InsetInclude::metrics(MetricsInfo & mi, Dimension & dim) const
                }
                button_.metrics(mi, dim);
        }
-       int center_indent = (params_.flag == INPUT ? 0 :
-               (mi.base.textwidth - dim.wid) / 2);
+       int center_indent = type(params_) == INPUT ?
+               0 : (mi.base.textwidth - dim.wid) / 2;
        Box b(center_indent, center_indent + dim.wid, -dim.asc, dim.des);
        button_.setBox(b);
 
@@ -560,23 +542,19 @@ void InsetInclude::metrics(MetricsInfo & mi, Dimension & dim) const
 
 void InsetInclude::draw(PainterInfo & pi, int x, int y) const
 {
-       cache(pi.base.bv);
-       if (!preview_->previewReady()) {
+       if (!RenderPreview::activated() || !preview_->previewReady()) {
                button_.draw(pi, x + button_.box().x1, y);
                return;
        }
 
-       if (!preview_->monitoring())
-               preview_->startMonitoring();
-
-       pi.pain.image(x + button_.box().x1, y - dim_.asc, dim_.wid, dim_.height(),
-                           *(preview_->pimage()->image()));
-}
-
+       BOOST_ASSERT(pi.base.bv);
+       Buffer const * const buffer = pi.base.bv->buffer();
+       if (!preview_->monitoring() && buffer) {
+               string const included_file = includedFilename(*buffer, params_);
+               preview_->startMonitoring(included_file);
+       }
 
-BufferView * InsetInclude::view() const
-{
-       return button_.view();
+       preview_->draw(pi, x + button_.box().x1, y);
 }
 
 
@@ -584,49 +562,66 @@ BufferView * InsetInclude::view() const
 // preview stuff
 //
 
-void InsetInclude::addPreview(lyx::graphics::PreviewLoader & ploader) const
+void InsetInclude::statusChanged() const
 {
-       preview_->addPreview(ploader);
+       LyX::cref().updateInset(this);
 }
 
 
-bool InsetInclude::PreviewImpl::previewWanted() const
+void InsetInclude::fileChanged() const
 {
-       return parent().params_.flag == InsetInclude::INPUT &&
-               parent().params_.cparams.preview() &&
-               IsFileReadable(parent().getFileName());
+       Buffer const * const buffer_ptr = LyX::cref().updateInset(this);
+       if (!buffer_ptr)
+               return;
+
+       Buffer const & buffer = *buffer_ptr;
+       preview_->removePreview(buffer);
+       generate_preview(*preview_.get(), *this, buffer);
 }
 
 
-string const InsetInclude::PreviewImpl::latexString() const
+namespace {
+
+bool preview_wanted(InsetCommandParams const & params, Buffer const & buffer)
 {
-       if (!view() || !view()->buffer())
-               return string();
+       string const included_file = includedFilename(buffer, params);
 
+       return type(params) == INPUT && params.preview() &&
+               IsFileReadable(included_file);
+}
+
+
+string const latex_string(InsetInclude const & inset, Buffer const & buffer)
+{
        ostringstream os;
        LatexRunParams runparams;
        runparams.flavor = LatexRunParams::LATEX;
-       parent().latex(*view()->buffer(), os, runparams);
+       inset.latex(buffer, os, runparams);
 
-       return STRCONV(os.str());
+       return os.str();
 }
 
 
-void InsetInclude::PreviewImpl::startMonitoring()
+void generate_preview(RenderPreview & renderer,
+                     InsetInclude const & inset,
+                     Buffer const & buffer)
 {
-       monitor_.reset(new FileMonitor(parent().getFileName(), 2000));
-       monitor_->connect(boost::bind(&PreviewImpl::restartLoading, this));
-       monitor_->start();
+       InsetCommandParams const & params = inset.params();
+       if (RenderPreview::activated() && preview_wanted(params, buffer)) {
+               string const snippet = latex_string(inset, buffer);
+               renderer.generatePreview(snippet, buffer);
+       }
 }
 
+} // namespace anon
+
 
-void InsetInclude::PreviewImpl::restartLoading()
+void InsetInclude::addPreview(lyx::graphics::PreviewLoader & ploader) const
 {
-       lyxerr << "restartLoading()" << std::endl;
-       removePreview();
-       if (view())
-               view()->updateInset(&parent());
-       generatePreview();
+       if (preview_wanted(params(), ploader.buffer())) {
+               string const snippet = latex_string(*this, ploader.buffer());
+               preview_->addPreview(snippet, ploader);
+       }
 }
 
 
@@ -644,14 +639,14 @@ string const InsetIncludeMailer::inset2string(Buffer const &) const
 
 
 void InsetIncludeMailer::string2params(string const & in,
-                                      InsetInclude::Params & params)
+                                      InsetCommandParams & params)
 {
-       params = InsetInclude::Params();
+       params = InsetCommandParams();
 
        if (in.empty())
                return;
 
-       istringstream data(STRCONV(in));
+       istringstream data(in);
        LyXLex lex(0,0);
        lex.setStream(data);
 
@@ -680,13 +675,12 @@ void InsetIncludeMailer::string2params(string const & in,
 
 
 string const
-InsetIncludeMailer::params2string(InsetInclude::Params const & params)
+InsetIncludeMailer::params2string(InsetCommandParams const & params)
 {
        InsetInclude inset(params);
-       inset.set(params);
        ostringstream data;
        data << name_ << ' ';
        inset.write(data);
        data << "\\end_inset\n";
-       return STRCONV(data.str());
+       return data.str();
 }