]> git.lyx.org Git - lyx.git/blobdiff - src/insets/InsetPreview.cpp
Get rid of Qt resources
[lyx.git] / src / insets / InsetPreview.cpp
index 36e866c37cfa142f887299773c3aed22d067fa6a..1a70b1e17a2b1ece64adf280bcf5fbc451c5d034 100644 (file)
 #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()
 {}
 
 
@@ -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() : 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());
 }
 
 
@@ -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;
+
+               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);