-/*
-* File: formula.C
-* Purpose: Implementation of formula inset
-* Author: Alejandro Aguilar Sierra <asierra@servidor.unam.mx>
-* Created: January 1996
-* Description: Allows the edition of math paragraphs inside Lyx.
-*
-* Copyright: 1996-1998 Alejandro Aguilar Sierra
-*
-* Version: 0.4, Lyx project.
-*
-* You are free to use and modify this code under the terms of
-* the GNU General Public Licence version 2 or later.
-*/
+/**
+ * \file formula.C
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Alejandro Aguilar Sierra
+ * \author André Pönitz
+ *
+ * Full author contact details are available in file CREDITS.
+ */
#include <config.h>
#include "formula.h"
#include "math_cursor.h"
#include "math_parser.h"
-#include "math_charinset.h"
-#include "math_arrayinset.h"
-#include "metricsinfo.h"
-#include "math_deliminset.h"
#include "math_hullinset.h"
-#include "math_support.h"
#include "math_mathmlstream.h"
#include "textpainter.h"
#include "BufferView.h"
-#include "gettext.h"
#include "debug.h"
-#include "latexrunparams.h"
-#include "lyxrc.h"
-#include "funcrequest.h"
-#include "Lsstream.h"
-
-#include "support/LOstream.h"
-#include "support/LAssert.h"
-#include "support/lyxlib.h"
-#include "support/systemcall.h"
-#include "support/filetools.h"
-
-#include "frontends/Alert.h"
-#include "frontends/LyXView.h"
+#include "LColor.h"
+#include "lyx_main.h"
+#include "outputparams.h"
+
#include "frontends/Painter.h"
-#include "graphics/PreviewedInset.h"
-#include "graphics/PreviewImage.h"
+#include "graphics/PreviewLoader.h"
+
+#include "insets/render_preview.h"
+#include "support/std_sstream.h"
+#include <boost/bind.hpp>
+
+using std::string;
using std::ostream;
+using std::ostringstream;
using std::vector;
using std::auto_ptr;
using std::endl;
-class InsetFormula::PreviewImpl : public lyx::graphics::PreviewedInset {
-public:
- ///
- PreviewImpl(InsetFormula & p) : PreviewedInset(p) {}
-
-private:
- ///
- bool previewWanted() const;
- ///
- string const latexString() const;
- ///
- InsetFormula & parent() const
- {
- return *static_cast<InsetFormula*>(inset());
- }
-};
-
-
-
InsetFormula::InsetFormula(bool chemistry)
: par_(MathAtom(new MathHullInset)),
- preview_(new PreviewImpl(*this))
+ preview_(new RenderPreview)
{
+ preview_->connect(boost::bind(&InsetFormula::statusChanged, this));
if (chemistry)
mutate("chemistry");
}
InsetFormula::InsetFormula(InsetFormula const & other)
: InsetFormulaBase(other),
par_(other.par_),
- preview_(new PreviewImpl(*this))
-{}
+ preview_(new RenderPreview)
+{
+ preview_->connect(boost::bind(&InsetFormula::statusChanged, this));
+}
InsetFormula::InsetFormula(BufferView *)
: par_(MathAtom(new MathHullInset)),
- preview_(new PreviewImpl(*this))
+ preview_(new RenderPreview)
{
- //view_ = bv->owner()->view();
+ preview_->connect(boost::bind(&InsetFormula::statusChanged, this));
}
InsetFormula::InsetFormula(string const & data)
: par_(MathAtom(new MathHullInset)),
- preview_(new PreviewImpl(*this))
+ preview_(new RenderPreview)
{
+ preview_->connect(boost::bind(&InsetFormula::statusChanged, this));
if (!data.size())
return;
if (!mathed_parse_normal(par_, data))
}
-
InsetFormula::~InsetFormula()
{}
}
-void InsetFormula::write(Buffer const *, ostream & os) const
+void InsetFormula::write(Buffer const &, ostream & os) const
{
WriteStream wi(os, false, false);
os << par_->fileInsetLabel() << ' ';
}
-int InsetFormula::latex(Buffer const *, ostream & os,
- LatexRunParams const & runparams) const
+int InsetFormula::latex(Buffer const &, ostream & os,
+ OutputParams const & runparams) const
{
WriteStream wi(os, runparams.moving_arg, true);
par_->write(wi);
}
-int InsetFormula::ascii(Buffer const *, ostream & os, int) const
+int InsetFormula::plaintext(Buffer const &, ostream & os,
+ OutputParams const &) const
{
if (0 && display()) {
Dimension dim;
}
-int InsetFormula::linuxdoc(Buffer const * buf, ostream & os) const
+int InsetFormula::linuxdoc(Buffer const & buf, ostream & os,
+ OutputParams const & runparams) const
{
- return docbook(buf, os, false);
+ return docbook(buf, os, runparams);
}
-int InsetFormula::docbook(Buffer const * buf, ostream & os, bool) const
+int InsetFormula::docbook(Buffer const & buf, ostream & os,
+ OutputParams const & runparams) const
{
MathMLStream ms(os);
ms << MTag("equation");
ms << MTag("alt");
ms << "<[CDATA[";
- int res = ascii(buf, ms.os(), 0);
+ int res = plaintext(buf, ms.os(), runparams);
ms << "]]>";
ms << ETag("alt");
ms << MTag("math");
}
-void InsetFormula::read(Buffer const *, LyXLex & lex)
+void InsetFormula::read(Buffer const &, LyXLex & lex)
{
mathed_parse_normal(par_, lex);
// remove extra 'mathrm' for chemistry stuff.
}
-//ostream & operator<<(ostream & os, LyXCursor const & c)
-//{
-// os << '[' << c.x() << ' ' << c.y() << ' ' << c.pos() << ']';
-// return os;
-//}
+namespace {
+
+bool editing_inset(InsetFormula const * inset)
+{
+ return mathcursor &&
+ (const_cast<InsetFormulaBase const *>(mathcursor->formula()) ==
+ inset);
+}
+
+} // namespace anon
void InsetFormula::draw(PainterInfo & pi, int x, int y) const
{
- cache(pi.base.bv);
- // This initiates the loading of the preview, so should come
- // before the metrics are computed.
- bool const use_preview = preview_->previewReady();
+ xo_ = x;
+ yo_ = y;
+
+ // The previews are drawn only when we're not editing the inset.
+ bool const use_preview = !editing_inset(this)
+ && RenderPreview::activated()
+ && preview_->previewReady();
int const w = dim_.wid;
int const d = dim_.des;
int const h = a + d;
if (use_preview) {
- pi.pain.image(x + 1, y - a, w, h, // one pixel gap in front
- *(preview_->pimage()->image()));
+ // one pixel gap in front
+ preview_->draw(pi, x + 1, y);
} else {
PainterInfo p(pi.base.bv);
p.base.style = LM_ST_TEXT;
!= lcolor.getX11Name(LColor::background))
p.pain.fillRectangle(x, y - a, w, h, LColor::mathbg);
- if (mathcursor &&
- const_cast<InsetFormulaBase const *>(mathcursor->formula()) == this)
- {
+ if (editing_inset(this)) {
mathcursor->drawSelection(pi);
//p.pain.rectangle(x, y - a, w, h, LColor::mathframe);
}
par_->draw(p, x, y);
}
-
- xo_ = x;
- yo_ = y;
}
-void InsetFormula::getLabelList(vector<string> & res) const
+void InsetFormula::getLabelList(Buffer const & buffer,
+ vector<string> & res) const
{
- par()->getLabelList(res);
+ par()->getLabelList(buffer, res);
}
void InsetFormula::metrics(MetricsInfo & m, Dimension & dim) const
{
- view_ = m.base.bv;
- if (preview_->previewReady()) {
- dim.asc = preview_->pimage()->ascent();
- dim.des = preview_->pimage()->descent();
+ bool const use_preview = !editing_inset(this)
+ && RenderPreview::activated()
+ && preview_->previewReady();
+
+ if (use_preview) {
+ preview_->metrics(m, dim);
// insert a one pixel gap in front of the formula
- dim.wid = 1 + preview_->pimage()->width();
+ dim.wid += 1;
if (display())
dim.des += 12;
} else {
dim.asc += 1;
dim.des += 1;
}
+
dim_ = dim;
}
// preview stuff
//
-void InsetFormula::addPreview(lyx::graphics::PreviewLoader & ploader) const
+void InsetFormula::statusChanged() const
{
- preview_->addPreview(ploader);
+ LyX::cref().updateInset(this);
}
-void InsetFormula::generatePreview() const
+namespace {
+
+string const latex_string(InsetFormula const & inset, Buffer const &)
{
- preview_->generatePreview();
+ ostringstream os;
+ WriteStream wi(os, false, false);
+ inset.par()->write(wi);
+ return os.str();
}
+} // namespace anon
+
-bool InsetFormula::PreviewImpl::previewWanted() const
+void InsetFormula::addPreview(lyx::graphics::PreviewLoader & ploader) const
{
- return !parent().par_->asNestInset()->editing();
+ string const snippet = latex_string(*this, ploader.buffer());
+ preview_->addPreview(snippet, ploader);
}
-string const InsetFormula::PreviewImpl::latexString() const
+void InsetFormula::generatePreview(Buffer const & buffer) const
{
- ostringstream ls;
- WriteStream wi(ls, false, false);
- parent().par_->write(wi);
- return STRCONV(ls.str());
+ string const snippet = latex_string(*this, buffer);
+ preview_->addPreview(snippet, buffer);
+ preview_->startLoading(buffer);
}