]> git.lyx.org Git - lyx.git/blob - src/insets/InsetPreview.cpp
Fix a bug in getFormattedReference().
[lyx.git] / src / insets / InsetPreview.cpp
1 /**\r
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
5  *\r
6  * \author Vincent van Ravesteijn\r
7  *\r
8  * Full author contact details are available in file CREDITS.\r
9  */\r
10 #include "config.h"\r
11 \r
12 #include "InsetPreview.h"\r
13 \r
14 #include "Buffer.h"\r
15 #include "BufferParams.h"\r
16 #include "BufferView.h"\r
17 #include "Cursor.h"\r
18 #include "Lexer.h"\r
19 #include "LyXRC.h"\r
20 #include "MetricsInfo.h"\r
21 #include "OutputParams.h"\r
22 #include "RenderPreview.h"\r
23 \r
24 #include "frontends/Painter.h"\r
25 \r
26 #include "graphics/PreviewImage.h"\r
27 \r
28 #include <sstream>\r
29 \r
30 using namespace std;\r
31 \r
32 namespace lyx {\r
33 \r
34 \r
35 InsetPreview::InsetPreview(Buffer * buf) \r
36         : InsetText(buf),\r
37           preview_(new RenderPreview(this)), use_preview_(true)\r
38 {\r
39         setAutoBreakRows(true);\r
40         setDrawFrame(true);\r
41         setFrameColor(Color_previewframe);\r
42 }\r
43 \r
44 \r
45 InsetPreview::~InsetPreview() \r
46 {}\r
47 \r
48 \r
49 InsetPreview::InsetPreview(InsetPreview const & other)\r
50         : InsetText(other)\r
51 {\r
52         preview_.reset(new RenderPreview(*other.preview_, this));\r
53 }\r
54 \r
55 \r
56 void InsetPreview::write(ostream & os) const\r
57 {\r
58         os << "Preview" << "\n";\r
59         text().write(os);\r
60 }\r
61 \r
62 \r
63 void InsetPreview::addPreview(DocIterator const & inset_pos,\r
64         graphics::PreviewLoader &) const\r
65 {\r
66         preparePreview(inset_pos);\r
67 }\r
68 \r
69 \r
70 void InsetPreview::preparePreview(DocIterator const & pos) const  \r
71 {\r
72         odocstringstream str;  \r
73         OutputParams runparams(&pos.buffer()->params().encoding());\r
74         latex(str, runparams);\r
75         docstring const snippet = str.str();\r
76         preview_->addPreview(snippet, *pos.buffer());  \r
77 }\r
78 \r
79 \r
80 bool InsetPreview::previewState(BufferView * bv) const\r
81 {\r
82         if (!editing(bv) && (RenderPreview::status() == LyXRC::PREVIEW_ON ||\r
83                              RenderPreview::status() == LyXRC::PREVIEW_NO_MATH)) {\r
84                 graphics::PreviewImage const * pimage =\r
85                         preview_->getPreviewImage(bv->buffer());\r
86                 return pimage && pimage->image();\r
87         }\r
88         return false;\r
89 }\r
90 \r
91 \r
92 void InsetPreview::reloadPreview(DocIterator const & pos) const\r
93 {\r
94         preparePreview(pos);\r
95         preview_->startLoading(*pos.buffer());\r
96 }\r
97 \r
98 \r
99 void InsetPreview::draw(PainterInfo & pi, int x, int y) const\r
100 {\r
101         use_preview_ = previewState(pi.base.bv);\r
102 \r
103         if (use_preview_) {\r
104                 // one pixel gap in front\r
105                 preview_->draw(pi, x + 1 + TEXT_TO_INSET_OFFSET, y);\r
106                 setPosCache(pi, x, y);\r
107                 return;\r
108         }\r
109         InsetText::draw(pi, x, y);\r
110 }\r
111 \r
112 \r
113 void InsetPreview::edit(Cursor & cur, bool front, EntryDirection entry_from)\r
114 {\r
115         cur.push(*this);\r
116         InsetText::edit(cur, front, entry_from);\r
117 }\r
118 \r
119 \r
120 Inset * InsetPreview::editXY(Cursor & cur, int x, int y)\r
121 {\r
122         if (use_preview_) {\r
123                 edit(cur, true, ENTRY_DIRECTION_IGNORE);\r
124                 return this;\r
125         }\r
126         cur.push(*this);\r
127         return InsetText::editXY(cur, x, y);\r
128 }\r
129 \r
130 \r
131 void InsetPreview::metrics(MetricsInfo & mi, Dimension & dim) const\r
132 {\r
133         if (previewState(mi.base.bv)) {\r
134                 preview_->metrics(mi, dim);\r
135                 mi.base.textwidth += 2 * TEXT_TO_INSET_OFFSET;\r
136                 \r
137                 dim.wid = max(dim.wid, 4);\r
138                 dim.asc = max(dim.asc, 4);\r
139                 \r
140                 dim.asc += TEXT_TO_INSET_OFFSET;\r
141                 dim.des += TEXT_TO_INSET_OFFSET;\r
142                 dim.wid += TEXT_TO_INSET_OFFSET;\r
143                 dim_ = dim;\r
144                 dim.wid += TEXT_TO_INSET_OFFSET;\r
145                 // insert a one pixel gap\r
146                 dim.wid += 1;\r
147                 // Cache the inset dimension.\r
148                 setDimCache(mi, dim);\r
149                 Dimension dim_dummy;\r
150                 MetricsInfo mi_dummy = mi;\r
151                 InsetText::metrics(mi_dummy, dim_dummy);\r
152                 return;\r
153         }\r
154         InsetText::metrics(mi, dim);\r
155 }\r
156 \r
157 \r
158 bool InsetPreview::notifyCursorLeaves(Cursor const & old, Cursor & cur)\r
159 {\r
160         reloadPreview(old);\r
161         cur.screenUpdateFlags(Update::Force);\r
162         return InsetText::notifyCursorLeaves(old, cur);\r
163 }\r
164 \r
165 \r
166 } // namespace lyx\r