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"
20 #include "MetricsInfo.h"
21 #include "OutputParams.h"
22 #include "RenderPreview.h"
24 #include "frontends/Painter.h"
26 #include "graphics/PreviewImage.h"
35 InsetPreview::InsetPreview(Buffer * buf)
37 preview_(new RenderPreview(this)), use_preview_(true)
39 setAutoBreakRows(true);
41 setFrameColor(Color_previewframe);
45 InsetPreview::~InsetPreview()
49 InsetPreview::InsetPreview(InsetPreview const & other)
52 preview_.reset(new RenderPreview(*other.preview_, this));
56 void InsetPreview::write(ostream & os) const
58 os << "Preview" << "\n";
63 void InsetPreview::addPreview(DocIterator const & inset_pos,
64 graphics::PreviewLoader &) const
66 preparePreview(inset_pos);
70 void InsetPreview::preparePreview(DocIterator const & pos) const
74 OutputParams runparams(&pos.buffer()->params().encoding());
76 docstring const snippet = str.str();
77 preview_->addPreview(snippet, *pos.buffer());
81 bool InsetPreview::previewState(BufferView * bv) const
83 if (!editing(bv) && (RenderPreview::status() == LyXRC::PREVIEW_ON ||
84 RenderPreview::status() == LyXRC::PREVIEW_NO_MATH)) {
85 graphics::PreviewImage const * pimage =
86 preview_->getPreviewImage(bv->buffer());
87 return pimage && pimage->image();
93 void InsetPreview::reloadPreview(DocIterator const & pos) const
96 preview_->startLoading(*pos.buffer());
100 void InsetPreview::draw(PainterInfo & pi, int x, int y) const
102 use_preview_ = previewState(pi.base.bv);
105 // one pixel gap in front
106 preview_->draw(pi, x + 1 + TEXT_TO_INSET_OFFSET, y);
107 setPosCache(pi, x, y);
110 InsetText::draw(pi, x, y);
114 void InsetPreview::edit(Cursor & cur, bool front, EntryDirection entry_from)
117 InsetText::edit(cur, front, entry_from);
121 Inset * InsetPreview::editXY(Cursor & cur, int x, int y)
124 edit(cur, true, ENTRY_DIRECTION_IGNORE);
128 return InsetText::editXY(cur, x, y);
132 void InsetPreview::metrics(MetricsInfo & mi, Dimension & dim) const
134 if (previewState(mi.base.bv)) {
135 preview_->metrics(mi, dim);
136 mi.base.textwidth += 2 * TEXT_TO_INSET_OFFSET;
138 dim.wid = max(dim.wid, 4);
139 dim.asc = max(dim.asc, 4);
141 dim.asc += TEXT_TO_INSET_OFFSET;
142 dim.des += TEXT_TO_INSET_OFFSET;
143 dim.wid += TEXT_TO_INSET_OFFSET;
145 dim.wid += TEXT_TO_INSET_OFFSET;
146 // insert a one pixel gap
148 // Cache the inset dimension.
149 setDimCache(mi, dim);
151 MetricsInfo mi_dummy = mi;
152 InsetText::metrics(mi_dummy, dim_dummy);
155 InsetText::metrics(mi, dim);
159 bool InsetPreview::notifyCursorLeaves(Cursor const & old, Cursor & cur)
162 cur.screenUpdateFlags(Update::Force);
163 return InsetText::notifyCursorLeaves(old, cur);