#include "MetricsInfo.h"
#include "OutputParams.h"
#include "RenderPreview.h"
+#include "texstream.h"
#include "frontends/Painter.h"
#include "graphics/PreviewImage.h"
+#include "mathed/InsetMathHull.h"
#include "mathed/MacroTable.h"
-#include "support/lstrings.h"
-
#include <sstream>
using namespace std;
namespace lyx {
-using support::prefixIs;
-
-InsetPreview::InsetPreview(Buffer * buf)
- : InsetText(buf),
- preview_(new RenderPreview(this)), use_preview_(true)
+InsetPreview::InsetPreview(Buffer * buf)
+ : InsetText(buf), preview_(new RenderPreview(this))
{
setDrawFrame(true);
setFrameColor(Color_previewframe);
}
-InsetPreview::~InsetPreview()
+InsetPreview::~InsetPreview()
{}
}
+InsetPreview & InsetPreview::operator=(InsetPreview const & other)
+{
+ if (&other == this)
+ return *this;
+
+ InsetText::operator=(other);
+ preview_.reset(new RenderPreview(*other.preview_, this));
+
+ return *this;
+}
+
+
void InsetPreview::write(ostream & os) const
{
os << "Preview" << "\n";
}
-void InsetPreview::preparePreview(DocIterator const & pos) const
+void InsetPreview::preparePreview(DocIterator const & pos) const
{
- TexRow texrow;
odocstringstream str;
- otexstream os(str, texrow);
- Buffer const * buffer = pos.buffer();
- OutputParams runparams(&buffer->params().encoding());
+ otexstream os(str);
+ OutputParams runparams(&pos.buffer()->params().encoding());
latex(os, runparams);
- // collect macros at this position in case they are used in a math inset
+
+ // collect macros at this position
MacroNameSet macros;
- buffer->listMacroNames(macros);
- MacroNameSet::iterator it = macros.begin();
- MacroNameSet::iterator end = macros.end();
- docstring macro_preamble;
- for (; it != end; ++it) {
- MacroData const * data = buffer->getMacro(*it, pos, true);
- if (data) {
- odocstringstream macro_def;
- data->write(macro_def, false);
- docstring const md = macro_def.str();
- macro_def << endl;
- bool is_newcomm = prefixIs(md, from_ascii("\\newcomm"));
- // assure that \newcommand defs are only added once
- if (!is_newcomm || !preview_->hasMacroDef(md, *buffer)) {
- if (is_newcomm)
- preview_->addMacroDef(md, *buffer);
- macro_preamble.append(macro_def.str());
- }
- }
+ pos.buffer()->listMacroNames(macros);
+
+ // look for math insets and collect definitions for the used macros
+ MacroNameSet defs;
+ DocIterator dit = doc_iterator_begin(pos.buffer(), this);
+ DocIterator const dend = doc_iterator_end(pos.buffer(), this);
+ if (!dit.nextInset())
+ dit.forwardInset();
+ for (; dit != dend; dit.forwardInset()) {
+ InsetMath * im = dit.nextInset()->asInsetMath();
+ InsetMathHull * hull = im ? im->asHullInset() : nullptr;
+ if (!hull)
+ continue;
+ for (idx_type idx = 0; idx < hull->nargs(); ++idx)
+ hull->usedMacros(hull->cell(idx), pos, macros, defs);
}
+ MacroNameSet::iterator it = defs.begin();
+ MacroNameSet::iterator end = defs.end();
+ docstring macro_preamble;
+ for (; it != end; ++it)
+ macro_preamble.append(*it);
+
docstring const snippet = macro_preamble + str.str();
- preview_->addPreview(snippet, *buffer);
+ preview_->addPreview(snippet, *pos.buffer());
}
void InsetPreview::draw(PainterInfo & pi, int x, int y) const
{
- use_preview_ = previewState(pi.base.bv);
-
- if (use_preview_) {
+ if (previewState(pi.base.bv)) {
// one pixel gap in front
- preview_->draw(pi, x + 1 + TEXT_TO_INSET_OFFSET, y);
- setPosCache(pi, x, y);
- return;
- }
- InsetText::draw(pi, x, y);
+ preview_->draw(pi, x + 1, y);
+ } else
+ InsetText::draw(pi, x, y);
}
Inset * InsetPreview::editXY(Cursor & cur, int x, int y)
{
- if (use_preview_) {
+ if (previewState(&cur.bv())) {
edit(cur, true, ENTRY_DIRECTION_IGNORE);
return this;
}
{
if (previewState(mi.base.bv)) {
preview_->metrics(mi, dim);
- mi.base.textwidth += 2 * TEXT_TO_INSET_OFFSET;
-
+
dim.wid = max(dim.wid, 4);
dim.asc = max(dim.asc, 4);
-
- dim.asc += TEXT_TO_INSET_OFFSET;
- dim.des += TEXT_TO_INSET_OFFSET;
- dim.wid += TEXT_TO_INSET_OFFSET;
- dim_ = dim;
- dim.wid += TEXT_TO_INSET_OFFSET;
+
+ dim.asc += topOffset(mi.base.bv);
+ dim.des += bottomOffset(mi.base.bv);
// insert a one pixel gap
dim.wid += 1;
- // Cache the inset dimension.
- setDimCache(mi, dim);
Dimension dim_dummy;
MetricsInfo mi_dummy = mi;
InsetText::metrics(mi_dummy, dim_dummy);