Index: InsetERT.h
===================================================================
--- InsetERT.h	(revision 32440)
+++ InsetERT.h	(working copy)
@@ -14,7 +14,10 @@
 #define INSETERT_H
 
 #include "InsetCollapsable.h"
+#include "RenderPreview.h"
+#include "graphics/PreviewLoader.h"
 
+#include <boost/scoped_ptr.hpp>
 
 namespace lyx {
 
@@ -34,11 +37,32 @@
 	///
 	InsetERT(Buffer *, CollapseStatus status = Open);
 	///
+	InsetERT(InsetERT const & other);
+	///
 	~InsetERT();
+	//
+	InsetERT & operator=(InsetERT const & other);
 	///
 	static CollapseStatus string2params(std::string const &);
 	///
 	static std::string params2string(CollapseStatus);
+	///
+	void addPreview(DocIterator const & inset_pos,
+		graphics::PreviewLoader & ploader) const;
+	///
+	void preparePreview(DocIterator const & pos) const;
+	///
+	void reloadPreview(DocIterator const & pos) const;
+	///
+	bool notifyCursorLeaves(Cursor const & old, Cursor & cur);
+	///
+	void draw(PainterInfo & pi, int x, int y) const;
+	///
+	Inset * editXY(Cursor & cur, int x, int y);
+	///
+	void metrics(MetricsInfo & mi, Dimension & dim) const;
+	///
+	bool previewState(BufferView * bv) const;
 private:
 	///
 	InsetCode lyxCode() const { return ERT_CODE; }
@@ -68,6 +92,10 @@
 	docstring const buttonLabel(BufferView const & bv) const;
 	///
 	bool allowSpellCheck() const { return false; }
+	///
+	boost::scoped_ptr<RenderPreview> preview_;
+	///
+	mutable bool use_preview_;
 };
 
 
Index: InsetERT.cpp
===================================================================
--- InsetERT.cpp	(revision 32440)
+++ InsetERT.cpp	(working copy)
@@ -23,6 +23,7 @@
 #include "Language.h"
 #include "Layout.h"
 #include "Lexer.h"
+#include "LyXRC.h"
 #include "LyXAction.h"
 #include "MetricsInfo.h"
 #include "OutputParams.h"
@@ -30,6 +31,10 @@
 #include "Paragraph.h"
 #include "TextClass.h"
 
+#include "graphics/PreviewImage.h"
+
+#include "insets/RenderPreview.h"
+
 #include "frontends/alert.h"
 #include "frontends/Application.h"
 
@@ -45,12 +50,29 @@
 namespace lyx {
 
 InsetERT::InsetERT(Buffer * buf, CollapseStatus status)
-	: InsetCollapsable(buf)
+	: InsetCollapsable(buf), preview_(new RenderPreview(this))
 {
 	status_ = status;
 }
 
 
+InsetERT::InsetERT(InsetERT const & other) : InsetCollapsable(other)
+{
+	operator=(other);
+}
+
+InsetERT & InsetERT::operator=(InsetERT const & other)
+{
+	if (this == &other)
+		return *this;
+	InsetCollapsable::operator=(other);
+	buffer_ = other.buffer_;
+	preview_.reset(new RenderPreview(*other.preview_, this));
+
+	return *this;
+}
+
+
 InsetERT::~InsetERT()
 {
 	hideDialogs("ert", this);
@@ -189,4 +211,86 @@
 	return docstring();
 }
 
+
+bool InsetERT::previewState(BufferView * bv) const
+{
+	if (!editing(bv) && RenderPreview::status() == LyXRC::PREVIEW_ON) {
+		graphics::PreviewImage const * pimage =
+			preview_->getPreviewImage(bv->buffer());
+		return pimage && pimage->image();
+	}
+	return false;
+}
+
+
+void InsetERT::addPreview(DocIterator const & inset_pos,
+	graphics::PreviewLoader & ploader) const
+{
+	preparePreview(inset_pos);
+}
+
+
+void InsetERT::preparePreview(DocIterator const & pos) const  
+{
+	odocstringstream str;  
+	OutputParams runparams(&pos.buffer()->params().encoding());
+	latex(str, runparams);
+	docstring const snippet = str.str();
+	LYXERR(Debug::MACROS, "Preview snippet: " << snippet);  
+	preview_->addPreview(snippet, *pos.buffer());  
+}
+
+
+void InsetERT::reloadPreview(DocIterator const & pos) const
+{
+	preparePreview(pos);
+	preview_->startLoading(*pos.buffer());
+}
+
+
+bool InsetERT::notifyCursorLeaves(Cursor const & old, Cursor & cur)
+{
+	reloadPreview(old);
+	cur.updateFlags(Update::Force);
+	return InsetCollapsable::notifyCursorLeaves(old, cur);
+}
+
+
+void InsetERT::draw(PainterInfo & pi, int x, int y) const
+{
+	use_preview_ = previewState(pi.base.bv);
+
+	if (use_preview_) {
+		// one pixel gap in front
+		preview_->draw(pi, x + 1, y);
+		setPosCache(pi, x, y);
+		return;
+	}
+	InsetCollapsable::draw(pi, x, y);
+}
+
+
+Inset * InsetERT::editXY(Cursor & cur, int x, int y)
+{
+	if (use_preview_) {
+		edit(cur, true);
+		return this;
+	}
+	return InsetCollapsable::editXY(cur, x, y);
+}
+
+
+void InsetERT::metrics(MetricsInfo & mi, Dimension & dim) const
+{
+	if (previewState(mi.base.bv)) {
+		preview_->metrics(mi, dim);
+		// insert a one pixel gap in front of the formula
+		dim.wid += 1;
+		// Cache the inset dimension.
+		setDimCache(mi, dim);
+		return;
+	}
+	InsetCollapsable::metrics(mi, dim);
+}
+
 } // namespace lyx
