]> git.lyx.org Git - lyx.git/blob - src/insets/InsetPreview.cpp
InsetTabular.cpp: fix #6585 also for wrapped floats - thanks Vincent
[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 \r
23 #include "frontends/Painter.h"\r
24 \r
25 #include "graphics/PreviewImage.h"\r
26 \r
27 #include <sstream>\r
28 \r
29 using namespace std;\r
30 \r
31 namespace lyx {\r
32 \r
33 \r
34 InsetPreview::InsetPreview(Buffer * buf) \r
35         : InsetText(buf),\r
36           preview_(new RenderPreview(this)), use_preview_(true)\r
37 {\r
38         setAutoBreakRows(true);\r
39         setDrawFrame(true);\r
40         setFrameColor(Color_previewframe);\r
41 }\r
42 \r
43 \r
44 InsetPreview::~InsetPreview() \r
45 {}\r
46 \r
47 \r
48 InsetPreview::InsetPreview(InsetPreview const & other)\r
49         : InsetText(other)\r
50 {\r
51         preview_.reset(new RenderPreview(*other.preview_, this));\r
52 }\r
53 \r
54 \r
55 void InsetPreview::write(ostream & os) const\r
56 {\r
57         os << "Preview" << "\n";\r
58         text().write(os);\r
59 }\r
60 \r
61 \r
62 void InsetPreview::addPreview(DocIterator const & inset_pos,\r
63         graphics::PreviewLoader &) const\r
64 {\r
65         preparePreview(inset_pos);\r
66 }\r
67 \r
68 \r
69 void InsetPreview::preparePreview(DocIterator const & pos) const  \r
70 {\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
76 }\r
77 \r
78 \r
79 bool InsetPreview::previewState(BufferView * bv) const\r
80 {\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
86         }\r
87         return false;\r
88 }\r
89 \r
90 \r
91 void InsetPreview::reloadPreview(DocIterator const & pos) const\r
92 {\r
93         preparePreview(pos);\r
94         preview_->startLoading(*pos.buffer());\r
95 }\r
96 \r
97 \r
98 void InsetPreview::draw(PainterInfo & pi, int x, int y) const\r
99 {\r
100         use_preview_ = previewState(pi.base.bv);\r
101 \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
106                 return;\r
107         }\r
108         InsetText::draw(pi, x, y);\r
109 }\r
110 \r
111 \r
112 void InsetPreview::edit(Cursor & cur, bool front, EntryDirection entry_from)\r
113 {\r
114         cur.push(*this);\r
115         InsetText::edit(cur, front, entry_from);\r
116 }\r
117 \r
118 \r
119 Inset * InsetPreview::editXY(Cursor & cur, int x, int y)\r
120 {\r
121         if (use_preview_) {\r
122                 edit(cur, true, ENTRY_DIRECTION_IGNORE);\r
123                 return this;\r
124         }\r
125         cur.push(*this);\r
126         return InsetText::editXY(cur, x, y);\r
127 }\r
128 \r
129 \r
130 void InsetPreview::metrics(MetricsInfo & mi, Dimension & dim) const\r
131 {\r
132         if (previewState(mi.base.bv)) {\r
133                 preview_->metrics(mi, dim);\r
134                 mi.base.textwidth += 2 * TEXT_TO_INSET_OFFSET;\r
135                 \r
136                 dim.wid = max(dim.wid, 4);\r
137                 dim.asc = max(dim.asc, 4);\r
138                 \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
142                 dim_ = dim;\r
143                 dim.wid += TEXT_TO_INSET_OFFSET;\r
144                 // insert a one pixel gap\r
145                 dim.wid += 1;\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
151                 return;\r
152         }\r
153         InsetText::metrics(mi, dim);\r
154 }\r
155 \r
156 \r
157 bool InsetPreview::notifyCursorLeaves(Cursor const & old, Cursor & cur)\r
158 {\r
159         reloadPreview(old);\r
160         cur.screenUpdateFlags(Update::Force);\r
161         return InsetText::notifyCursorLeaves(old, cur);\r
162 }\r
163 \r
164 \r
165 } // namespace lyx\r