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 "FuncRequest.h"
19 #include "FuncStatus.h"
20 #include "LaTeXFeatures.h"
22 #include "MetricsInfo.h"
23 #include "OutputParams.h"
24 #include "RenderPreview.h"
26 #include "frontends/Painter.h"
28 #include "graphics/PreviewImage.h"
37 InsetIPA::InsetIPA(Buffer * buf)
39 preview_(new RenderPreview(this)), use_preview_(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::doDispatch(Cursor & cur, FuncRequest & cmd)
66 switch (cmd.action()) {
67 case LFUN_QUOTE_INSERT: {
68 FuncRequest fr(LFUN_SELF_INSERT, "\"");
69 InsetText::doDispatch(cur, fr);
73 InsetText::doDispatch(cur, cmd);
80 bool InsetIPA::getStatus(Cursor & cur, FuncRequest const & cmd,
81 FuncStatus & flag) const
83 switch (cmd.action()) {
84 case LFUN_SCRIPT_INSERT: {
85 if (cmd.argument() == "subscript") {
86 flag.setEnabled(false);
92 flag.setEnabled(true);
98 return InsetText::getStatus(cur, cmd, flag);
102 void InsetIPA::addPreview(DocIterator const & inset_pos,
103 graphics::PreviewLoader &) const
105 preparePreview(inset_pos);
109 void InsetIPA::preparePreview(DocIterator const & pos) const
112 odocstringstream str;
113 otexstream os(str, texrow);
114 OutputParams runparams(&pos.buffer()->params().encoding());
115 latex(os, runparams);
116 docstring const snippet = str.str();
117 preview_->addPreview(snippet, *pos.buffer());
121 bool InsetIPA::previewState(BufferView * bv) const
123 if (!editing(bv) && RenderPreview::previewText()) {
124 graphics::PreviewImage const * pimage =
125 preview_->getPreviewImage(bv->buffer());
126 return pimage && pimage->image();
132 void InsetIPA::reloadPreview(DocIterator const & pos) const
135 preview_->startLoading(*pos.buffer());
139 void InsetIPA::draw(PainterInfo & pi, int x, int y) const
141 use_preview_ = previewState(pi.base.bv);
144 preview_->draw(pi, x + TEXT_TO_INSET_OFFSET, y);
145 setPosCache(pi, x, y);
148 InsetText::draw(pi, x, y);
152 void InsetIPA::edit(Cursor & cur, bool front, EntryDirection entry_from)
155 InsetText::edit(cur, front, entry_from);
159 Inset * InsetIPA::editXY(Cursor & cur, int x, int y)
162 edit(cur, true, ENTRY_DIRECTION_IGNORE);
166 return InsetText::editXY(cur, x, y);
170 void InsetIPA::metrics(MetricsInfo & mi, Dimension & dim) const
172 if (previewState(mi.base.bv)) {
173 preview_->metrics(mi, dim);
174 mi.base.textwidth += 2 * TEXT_TO_INSET_OFFSET;
176 dim.wid = max(dim.wid, 4);
177 dim.asc = max(dim.asc, 4);
179 dim.asc += TEXT_TO_INSET_OFFSET;
180 dim.des += TEXT_TO_INSET_OFFSET;
181 dim.wid += TEXT_TO_INSET_OFFSET;
183 dim.wid += TEXT_TO_INSET_OFFSET;
184 // insert a one pixel gap
186 // Cache the inset dimension.
187 setDimCache(mi, dim);
189 MetricsInfo mi_dummy = mi;
190 InsetText::metrics(mi_dummy, dim_dummy);
193 InsetText::metrics(mi, dim);
197 bool InsetIPA::notifyCursorLeaves(Cursor const & old, Cursor & cur)
200 cur.screenUpdateFlags(Update::Force);
201 return InsetText::notifyCursorLeaves(old, cur);
205 void InsetIPA::validate(LaTeXFeatures & features) const
207 features.require("tipa");
208 features.require("tipx");
210 InsetText::validate(features);
214 void InsetIPA::latex(otexstream & os, OutputParams const & runparams_in) const
216 OutputParams runparams(runparams_in);
217 runparams.inIPA = true;
218 bool const multipar = (text().paragraphs().size() > 1);
219 // fontspec knows \textipa, but not the IPA environment
220 bool const nontexfonts = buffer_->params().useNonTeXFonts;
221 if (multipar && !nontexfonts)
222 os << "\\begin{IPA}\n";
225 InsetText::latex(os, runparams);
226 if (multipar && !nontexfonts)
227 os << "\n\\end{IPA}";
233 docstring InsetIPA::xhtml(XHTMLStream & xs, OutputParams const & runparams_in) const
235 OutputParams runparams(runparams_in);
236 runparams.inIPA = true;
237 return InsetText::xhtml(xs, runparams);
241 bool InsetIPA::insetAllowed(InsetCode code) const
244 // code that is allowed