]> git.lyx.org Git - lyx.git/blob - src/insets/InsetPreview.cpp
Introduce InsetPreview.
[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 & ploader) 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                 graphics::PreviewImage const * pimage =\r
83                         preview_->getPreviewImage(bv->buffer());\r
84                 return pimage && pimage->image();\r
85         }\r
86         return false;\r
87 }\r
88 \r
89 \r
90 void InsetPreview::reloadPreview(DocIterator const & pos) const\r
91 {\r
92         preparePreview(pos);\r
93         preview_->startLoading(*pos.buffer());\r
94 }\r
95 \r
96 \r
97 void InsetPreview::draw(PainterInfo & pi, int x, int y) const\r
98 {\r
99         use_preview_ = previewState(pi.base.bv);\r
100 \r
101         if (use_preview_) {\r
102                 // one pixel gap in front\r
103                 preview_->draw(pi, x + 1 + TEXT_TO_INSET_OFFSET, y);\r
104                 setPosCache(pi, x, y);\r
105                 return;\r
106         }\r
107         InsetText::draw(pi, x, y);\r
108 }\r
109 \r
110 \r
111 void InsetPreview::edit(Cursor & cur, bool front, EntryDirection entry_from)\r
112 {\r
113         cur.push(*this);\r
114         InsetText::edit(cur, front, entry_from);\r
115 }\r
116 \r
117 \r
118 Inset * InsetPreview::editXY(Cursor & cur, int x, int y)\r
119 {\r
120         if (use_preview_) {\r
121                 edit(cur, true, ENTRY_DIRECTION_IGNORE);\r
122                 return this;\r
123         }\r
124         cur.push(*this);\r
125         return InsetText::editXY(cur, x, y);\r
126 }\r
127 \r
128 \r
129 void InsetPreview::metrics(MetricsInfo & mi, Dimension & dim) const\r
130 {\r
131         if (previewState(mi.base.bv)) {\r
132                 preview_->metrics(mi, dim);\r
133                 mi.base.textwidth += 2 * TEXT_TO_INSET_OFFSET;\r
134                 \r
135                 dim.wid = max(dim.wid, 4);\r
136                 dim.asc = max(dim.asc, 4);\r
137                 \r
138                 dim.asc += TEXT_TO_INSET_OFFSET;\r
139                 dim.des += TEXT_TO_INSET_OFFSET;\r
140                 dim.wid += TEXT_TO_INSET_OFFSET;\r
141                 dim_ = dim;\r
142                 dim.wid += TEXT_TO_INSET_OFFSET;\r
143                 // insert a one pixel gap\r
144                 dim.wid += 1;\r
145                 // Cache the inset dimension.\r
146                 setDimCache(mi, dim);\r
147                 Dimension dim_dummy;\r
148                 MetricsInfo mi_dummy = mi;\r
149                 InsetText::metrics(mi_dummy, dim_dummy);\r
150                 return;\r
151         }\r
152         InsetText::metrics(mi, dim);\r
153 }\r
154 \r
155 \r
156 bool InsetPreview::notifyCursorLeaves(Cursor const & old, Cursor & cur)\r
157 {\r
158         reloadPreview(old);\r
159         cur.updateFlags(Update::Force);\r
160         return InsetText::notifyCursorLeaves(old, cur);\r
161 }\r
162 \r
163 \r
164 } // namespace lyx\r