2 * \file InsetPreview.cpp
\r
3 * This file is part of LyX, the document processor.
\r
4 * Licence details can be found in the file COPYING.
\r
6 * \author Vincent van Ravesteijn
\r
8 * Full author contact details are available in file CREDITS.
\r
12 #include "InsetPreview.h"
\r
15 #include "BufferParams.h"
\r
16 #include "BufferView.h"
\r
20 #include "MetricsInfo.h"
\r
21 #include "OutputParams.h"
\r
23 #include "frontends/Painter.h"
\r
25 #include "graphics/PreviewImage.h"
\r
29 using namespace std;
\r
34 InsetPreview::InsetPreview(Buffer * buf)
\r
36 preview_(new RenderPreview(this)), use_preview_(true)
\r
38 setAutoBreakRows(true);
\r
40 setFrameColor(Color_previewframe);
\r
44 InsetPreview::~InsetPreview()
\r
48 InsetPreview::InsetPreview(InsetPreview const & other)
\r
51 preview_.reset(new RenderPreview(*other.preview_, this));
\r
55 void InsetPreview::write(ostream & os) const
\r
57 os << "Preview" << "\n";
\r
62 void InsetPreview::addPreview(DocIterator const & inset_pos,
\r
63 graphics::PreviewLoader &) const
\r
65 preparePreview(inset_pos);
\r
69 void InsetPreview::preparePreview(DocIterator const & pos) const
\r
71 odocstringstream str;
\r
72 OutputParams runparams(&pos.buffer()->params().encoding());
\r
73 latex(str, runparams);
\r
74 docstring const snippet = str.str();
\r
75 preview_->addPreview(snippet, *pos.buffer());
\r
79 bool InsetPreview::previewState(BufferView * bv) const
\r
81 if (!editing(bv) && (RenderPreview::status() == LyXRC::PREVIEW_ON ||
\r
82 RenderPreview::status() == LyXRC::PREVIEW_NO_MATH)) {
\r
83 graphics::PreviewImage const * pimage =
\r
84 preview_->getPreviewImage(bv->buffer());
\r
85 return pimage && pimage->image();
\r
91 void InsetPreview::reloadPreview(DocIterator const & pos) const
\r
93 preparePreview(pos);
\r
94 preview_->startLoading(*pos.buffer());
\r
98 void InsetPreview::draw(PainterInfo & pi, int x, int y) const
\r
100 use_preview_ = previewState(pi.base.bv);
\r
102 if (use_preview_) {
\r
103 // one pixel gap in front
\r
104 preview_->draw(pi, x + 1 + TEXT_TO_INSET_OFFSET, y);
\r
105 setPosCache(pi, x, y);
\r
108 InsetText::draw(pi, x, y);
\r
112 void InsetPreview::edit(Cursor & cur, bool front, EntryDirection entry_from)
\r
115 InsetText::edit(cur, front, entry_from);
\r
119 Inset * InsetPreview::editXY(Cursor & cur, int x, int y)
\r
121 if (use_preview_) {
\r
122 edit(cur, true, ENTRY_DIRECTION_IGNORE);
\r
126 return InsetText::editXY(cur, x, y);
\r
130 void InsetPreview::metrics(MetricsInfo & mi, Dimension & dim) const
\r
132 if (previewState(mi.base.bv)) {
\r
133 preview_->metrics(mi, dim);
\r
134 mi.base.textwidth += 2 * TEXT_TO_INSET_OFFSET;
\r
136 dim.wid = max(dim.wid, 4);
\r
137 dim.asc = max(dim.asc, 4);
\r
139 dim.asc += TEXT_TO_INSET_OFFSET;
\r
140 dim.des += TEXT_TO_INSET_OFFSET;
\r
141 dim.wid += TEXT_TO_INSET_OFFSET;
\r
143 dim.wid += TEXT_TO_INSET_OFFSET;
\r
144 // insert a one pixel gap
\r
146 // Cache the inset dimension.
\r
147 setDimCache(mi, dim);
\r
148 Dimension dim_dummy;
\r
149 MetricsInfo mi_dummy = mi;
\r
150 InsetText::metrics(mi_dummy, dim_dummy);
\r
153 InsetText::metrics(mi, dim);
\r
157 bool InsetPreview::notifyCursorLeaves(Cursor const & old, Cursor & cur)
\r
159 reloadPreview(old);
\r
160 cur.screenUpdateFlags(Update::Force);
\r
161 return InsetText::notifyCursorLeaves(old, cur);
\r