3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
6 * \author Jürgen Spitzmüller
8 * Full author contact details are available in file CREDITS.
15 #include "BufferParams.h"
16 #include "BufferView.h"
18 #include "LaTeXFeatures.h"
21 #include "MetricsInfo.h"
22 #include "OutputParams.h"
23 #include "RenderPreview.h"
25 #include "frontends/Painter.h"
27 #include "graphics/PreviewImage.h"
36 InsetIPA::InsetIPA(Buffer * buf)
38 preview_(new RenderPreview(this)), use_preview_(true)
40 setAutoBreakRows(true);
42 setFrameColor(Color_insetframe);
50 InsetIPA::InsetIPA(InsetIPA const & other)
53 preview_.reset(new RenderPreview(*other.preview_, this));
57 void InsetIPA::write(ostream & os) const
64 void InsetIPA::addPreview(DocIterator const & inset_pos,
65 graphics::PreviewLoader &) const
67 preparePreview(inset_pos);
71 void InsetIPA::preparePreview(DocIterator const & pos) const
75 otexstream os(str, texrow);
76 OutputParams runparams(&pos.buffer()->params().encoding());
78 docstring const snippet = str.str();
79 preview_->addPreview(snippet, *pos.buffer());
83 bool InsetIPA::previewState(BufferView * bv) const
85 if (!editing(bv) && (RenderPreview::status() == LyXRC::PREVIEW_ON ||
86 RenderPreview::status() == LyXRC::PREVIEW_NO_MATH)) {
87 graphics::PreviewImage const * pimage =
88 preview_->getPreviewImage(bv->buffer());
89 return pimage && pimage->image();
95 void InsetIPA::reloadPreview(DocIterator const & pos) const
98 preview_->startLoading(*pos.buffer());
102 void InsetIPA::draw(PainterInfo & pi, int x, int y) const
104 use_preview_ = previewState(pi.base.bv);
107 preview_->draw(pi, x + TEXT_TO_INSET_OFFSET, y);
108 setPosCache(pi, x, y);
111 InsetText::draw(pi, x, y);
115 void InsetIPA::edit(Cursor & cur, bool front, EntryDirection entry_from)
118 InsetText::edit(cur, front, entry_from);
122 Inset * InsetIPA::editXY(Cursor & cur, int x, int y)
125 edit(cur, true, ENTRY_DIRECTION_IGNORE);
129 return InsetText::editXY(cur, x, y);
133 void InsetIPA::metrics(MetricsInfo & mi, Dimension & dim) const
135 if (previewState(mi.base.bv)) {
136 preview_->metrics(mi, dim);
137 mi.base.textwidth += 2 * TEXT_TO_INSET_OFFSET;
139 dim.wid = max(dim.wid, 4);
140 dim.asc = max(dim.asc, 4);
142 dim.asc += TEXT_TO_INSET_OFFSET;
143 dim.des += TEXT_TO_INSET_OFFSET;
144 dim.wid += TEXT_TO_INSET_OFFSET;
146 dim.wid += TEXT_TO_INSET_OFFSET;
147 // insert a one pixel gap
149 // Cache the inset dimension.
150 setDimCache(mi, dim);
152 MetricsInfo mi_dummy = mi;
153 InsetText::metrics(mi_dummy, dim_dummy);
156 InsetText::metrics(mi, dim);
160 bool InsetIPA::notifyCursorLeaves(Cursor const & old, Cursor & cur)
163 cur.screenUpdateFlags(Update::Force);
164 return InsetText::notifyCursorLeaves(old, cur);
168 void InsetIPA::validate(LaTeXFeatures & features) const
170 features.require("tipa");
171 features.require("tipx");
175 void InsetIPA::latex(otexstream & os, OutputParams const & runparams) const
177 bool const multipar = (text().paragraphs().size() > 1);
179 os << "\\begin{IPA}\n";
182 InsetText::latex(os, runparams);
184 os << "\n\\end{IPA}";
190 bool InsetIPA::insetAllowed(InsetCode code) const
192 if (code == ERT_CODE)