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