2 * \file InsetPreview.cpp
3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
6 * \author Vincent van Ravesteijn
8 * Full author contact details are available in file CREDITS.
12 #include "InsetPreview.h"
15 #include "BufferParams.h"
16 #include "BufferView.h"
19 #include "MetricsInfo.h"
20 #include "OutputParams.h"
21 #include "RenderPreview.h"
23 #include "frontends/Painter.h"
25 #include "graphics/PreviewImage.h"
27 #include "mathed/MacroTable.h"
29 #include "support/lstrings.h"
37 using support::prefixIs;
40 InsetPreview::InsetPreview(Buffer * buf)
42 preview_(new RenderPreview(this)), use_preview_(true)
45 setFrameColor(Color_previewframe);
49 InsetPreview::~InsetPreview()
53 InsetPreview::InsetPreview(InsetPreview const & other)
56 preview_.reset(new RenderPreview(*other.preview_, this));
60 void InsetPreview::write(ostream & os) const
62 os << "Preview" << "\n";
67 void InsetPreview::addPreview(DocIterator const & inset_pos,
68 graphics::PreviewLoader &) const
70 preparePreview(inset_pos);
74 void InsetPreview::preparePreview(DocIterator const & pos) const
78 otexstream os(str, texrow);
79 Buffer const * buffer = pos.buffer();
80 OutputParams runparams(&buffer->params().encoding());
82 // collect macros at this position in case they are used in a math inset
84 buffer->listMacroNames(macros);
85 MacroNameSet::iterator it = macros.begin();
86 MacroNameSet::iterator end = macros.end();
87 docstring macro_preamble;
88 for (; it != end; ++it) {
89 MacroData const * data = buffer->getMacro(*it, pos, true);
91 odocstringstream macro_def;
92 data->write(macro_def, false);
93 docstring const md = macro_def.str();
95 bool is_newcomm = prefixIs(md, from_ascii("\\newcomm"));
96 // assure that \newcommand defs are only added once
97 if (!is_newcomm || !preview_->hasMacroDef(md, *buffer)) {
99 preview_->addMacroDef(md, *buffer);
100 macro_preamble.append(macro_def.str());
104 docstring const snippet = macro_preamble + str.str();
105 preview_->addPreview(snippet, *buffer);
109 bool InsetPreview::previewState(BufferView * bv) const
111 if (!editing(bv) && RenderPreview::previewText()) {
112 graphics::PreviewImage const * pimage =
113 preview_->getPreviewImage(bv->buffer());
114 return pimage && pimage->image();
120 void InsetPreview::reloadPreview(DocIterator const & pos) const
123 preview_->startLoading(*pos.buffer());
127 void InsetPreview::draw(PainterInfo & pi, int x, int y) const
129 use_preview_ = previewState(pi.base.bv);
132 // one pixel gap in front
133 preview_->draw(pi, x + 1 + TEXT_TO_INSET_OFFSET, y);
134 setPosCache(pi, x, y);
137 InsetText::draw(pi, x, y);
141 void InsetPreview::edit(Cursor & cur, bool front, EntryDirection entry_from)
144 InsetText::edit(cur, front, entry_from);
148 Inset * InsetPreview::editXY(Cursor & cur, int x, int y)
151 edit(cur, true, ENTRY_DIRECTION_IGNORE);
155 return InsetText::editXY(cur, x, y);
159 void InsetPreview::metrics(MetricsInfo & mi, Dimension & dim) const
161 if (previewState(mi.base.bv)) {
162 preview_->metrics(mi, dim);
163 mi.base.textwidth += 2 * TEXT_TO_INSET_OFFSET;
165 dim.wid = max(dim.wid, 4);
166 dim.asc = max(dim.asc, 4);
168 dim.asc += TEXT_TO_INSET_OFFSET;
169 dim.des += TEXT_TO_INSET_OFFSET;
170 dim.wid += TEXT_TO_INSET_OFFSET;
172 dim.wid += TEXT_TO_INSET_OFFSET;
173 // insert a one pixel gap
175 // Cache the inset dimension.
176 setDimCache(mi, dim);
178 MetricsInfo mi_dummy = mi;
179 InsetText::metrics(mi_dummy, dim_dummy);
182 InsetText::metrics(mi, dim);
186 bool InsetPreview::notifyCursorLeaves(Cursor const & old, Cursor & cur)
189 cur.screenUpdateFlags(Update::Force);
190 return InsetText::notifyCursorLeaves(old, cur);