X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetPreview.cpp;h=c306ae91d21ea3678bf31f7ec935e96073f74a5d;hb=239b9919ffe28338d789e6dc9122228f77ab77a7;hp=36e866c37cfa142f887299773c3aed22d067fa6a;hpb=ad0d0f6d69a7acd6e99f7858f08b427a28d8f8cc;p=lyx.git diff --git a/src/insets/InsetPreview.cpp b/src/insets/InsetPreview.cpp index 36e866c37c..c306ae91d2 100644 --- a/src/insets/InsetPreview.cpp +++ b/src/insets/InsetPreview.cpp @@ -19,34 +19,31 @@ #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 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() {} @@ -57,6 +54,18 @@ InsetPreview::InsetPreview(InsetPreview const & other) } +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"; @@ -71,38 +80,39 @@ void InsetPreview::addPreview(DocIterator const & inset_pos, } -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() : 0; + 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()); } @@ -126,15 +136,11 @@ void InsetPreview::reloadPreview(DocIterator const & pos) const 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); } @@ -147,7 +153,7 @@ void InsetPreview::edit(Cursor & cur, bool front, EntryDirection entry_from) Inset * InsetPreview::editXY(Cursor & cur, int x, int y) { - if (use_preview_) { + if (previewState(&cur.bv())) { edit(cur, true, ENTRY_DIRECTION_IGNORE); return this; } @@ -160,20 +166,14 @@ void InsetPreview::metrics(MetricsInfo & mi, Dimension & dim) const { 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; // 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);