#include "Language.h"
#include "Layout.h"
#include "Lexer.h"
+#include "LyXRC.h"
#include "LyXAction.h"
#include "MetricsInfo.h"
#include "OutputParams.h"
#include "Paragraph.h"
#include "TextClass.h"
+#include "graphics/PreviewImage.h"
+
+#include "insets/RenderPreview.h"
+
#include "frontends/alert.h"
#include "frontends/Application.h"
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);
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);
+ Dimension dim_dummy = dim;
+ MetricsInfo mi_dummy = mi;
+ InsetCollapsable::metrics(mi_dummy, dim_dummy);
+ return;
+ }
+ InsetCollapsable::metrics(mi, dim);
+}
+
} // namespace lyx
#define INSETERT_H
#include "InsetCollapsable.h"
+#include "RenderPreview.h"
+#include "graphics/PreviewLoader.h"
+#include <boost/scoped_ptr.hpp>
namespace lyx {
///
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; }
docstring const buttonLabel(BufferView const & bv) const;
///
bool allowSpellCheck() const { return false; }
+ ///
+ boost::scoped_ptr<RenderPreview> preview_;
+ ///
+ mutable bool use_preview_;
};