X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetIPA.cpp;h=c811cf6ff8fa3e34cea92cd3ba6b40067790092b;hb=22e6659780390a19174d1bf896317a5baf9e40d7;hp=482938a844935f743b85c13de447144f75956b0b;hpb=f626cfb7a302f08dc828dfc3156838e26b0bbd3e;p=lyx.git diff --git a/src/insets/InsetIPA.cpp b/src/insets/InsetIPA.cpp index 482938a844..c811cf6ff8 100644 --- a/src/insets/InsetIPA.cpp +++ b/src/insets/InsetIPA.cpp @@ -15,12 +15,14 @@ #include "BufferParams.h" #include "BufferView.h" #include "Cursor.h" +#include "FuncRequest.h" +#include "FuncStatus.h" #include "LaTeXFeatures.h" #include "Lexer.h" -#include "LyXRC.h" #include "MetricsInfo.h" #include "OutputParams.h" #include "RenderPreview.h" +#include "texstream.h" #include "frontends/Painter.h" @@ -33,17 +35,16 @@ using namespace std; namespace lyx { -InsetIPA::InsetIPA(Buffer * buf) +InsetIPA::InsetIPA(Buffer * buf) : InsetText(buf), - preview_(new RenderPreview(this)), use_preview_(true) + preview_(new RenderPreview(this)) { - setAutoBreakRows(true); setDrawFrame(true); setFrameColor(Color_insetframe); } -InsetIPA::~InsetIPA() +InsetIPA::~InsetIPA() {} @@ -54,6 +55,18 @@ InsetIPA::InsetIPA(InsetIPA const & other) } +InsetIPA & InsetIPA::operator=(InsetIPA const & other) +{ + if (&other == this) + return *this; + + InsetText::operator=(other); + preview_.reset(new RenderPreview(*other.preview_, this)); + + return *this; +} + + void InsetIPA::write(ostream & os) const { os << "IPA" << "\n"; @@ -61,6 +74,44 @@ void InsetIPA::write(ostream & os) const } +void InsetIPA::doDispatch(Cursor & cur, FuncRequest & cmd) +{ + switch (cmd.action()) { + case LFUN_QUOTE_INSERT: { + FuncRequest fr(LFUN_SELF_INSERT, "\""); + InsetText::doDispatch(cur, fr); + break; + } + default: + InsetText::doDispatch(cur, cmd); + break; + } + +} + + +bool InsetIPA::getStatus(Cursor & cur, FuncRequest const & cmd, + FuncStatus & flag) const +{ + switch (cmd.action()) { + case LFUN_SCRIPT_INSERT: { + if (cmd.argument() == "subscript") { + flag.setEnabled(false); + return true; + } + break; + } + case LFUN_IN_IPA: + flag.setEnabled(true); + return true; + break; + default: + break; + } + return InsetText::getStatus(cur, cmd, flag); +} + + void InsetIPA::addPreview(DocIterator const & inset_pos, graphics::PreviewLoader &) const { @@ -68,22 +119,20 @@ void InsetIPA::addPreview(DocIterator const & inset_pos, } -void InsetIPA::preparePreview(DocIterator const & pos) const +void InsetIPA::preparePreview(DocIterator const & pos) const { - TexRow texrow; - odocstringstream str; - otexstream os(str, texrow); + odocstringstream str; + otexstream os(str); OutputParams runparams(&pos.buffer()->params().encoding()); latex(os, runparams); docstring const snippet = str.str(); - preview_->addPreview(snippet, *pos.buffer()); + preview_->addPreview(snippet, *pos.buffer()); } bool InsetIPA::previewState(BufferView * bv) const { - if (!editing(bv) && (RenderPreview::status() == LyXRC::PREVIEW_ON || - RenderPreview::status() == LyXRC::PREVIEW_NO_MATH)) { + if (!editing(bv) && RenderPreview::previewText()) { graphics::PreviewImage const * pimage = preview_->getPreviewImage(bv->buffer()); return pimage && pimage->image(); @@ -101,11 +150,8 @@ void InsetIPA::reloadPreview(DocIterator const & pos) const void InsetIPA::draw(PainterInfo & pi, int x, int y) const { - use_preview_ = previewState(pi.base.bv); - - if (use_preview_) { - preview_->draw(pi, x + TEXT_TO_INSET_OFFSET, y); - setPosCache(pi, x, y); + if (previewState(pi.base.bv)) { + preview_->draw(pi, x, y); return; } InsetText::draw(pi, x, y); @@ -121,7 +167,7 @@ void InsetIPA::edit(Cursor & cur, bool front, EntryDirection entry_from) Inset * InsetIPA::editXY(Cursor & cur, int x, int y) { - if (use_preview_) { + if (previewState(&cur.bv())) { edit(cur, true, ENTRY_DIRECTION_IGNORE); return this; } @@ -134,20 +180,14 @@ void InsetIPA::metrics(MetricsInfo & mi, Dimension & dim) const { if (previewState(mi.base.bv)) { preview_->metrics(mi, dim); - mi.base.textwidth += 2 * TEXT_TO_INSET_OFFSET; - + dim.wid = max(dim.wid, 4); dim.asc = max(dim.asc, 4); - + dim.asc += TEXT_TO_INSET_OFFSET; dim.des += TEXT_TO_INSET_OFFSET; - dim.wid += TEXT_TO_INSET_OFFSET; - dim_ = dim; - dim.wid += TEXT_TO_INSET_OFFSET; // insert a one pixel gap dim.wid += 1; - // Cache the inset dimension. - setDimCache(mi, dim); Dimension dim_dummy; MetricsInfo mi_dummy = mi; InsetText::metrics(mi_dummy, dim_dummy); @@ -169,30 +209,50 @@ void InsetIPA::validate(LaTeXFeatures & features) const { features.require("tipa"); features.require("tipx"); + + InsetText::validate(features); } -void InsetIPA::latex(otexstream & os, OutputParams const & runparams) const +void InsetIPA::latex(otexstream & os, OutputParams const & runparams_in) const { + OutputParams runparams(runparams_in); + runparams.inIPA = true; bool const multipar = (text().paragraphs().size() > 1); - if (multipar) + // fontspec knows \textipa, but not the IPA environment + bool const nontexfonts = buffer_->params().useNonTeXFonts; + if (multipar && !nontexfonts) os << "\\begin{IPA}\n"; else os << "\\textipa{"; InsetText::latex(os, runparams); - if (multipar) + if (multipar && !nontexfonts) os << "\n\\end{IPA}"; else os << "}"; } +docstring InsetIPA::xhtml(XHTMLStream & xs, OutputParams const & runparams_in) const +{ + OutputParams runparams(runparams_in); + runparams.inIPA = true; + return InsetText::xhtml(xs, runparams); +} + + bool InsetIPA::insetAllowed(InsetCode code) const { - if (code == ERT_CODE) + switch (code) { + // code that is allowed + case ERT_CODE: + case IPACHAR_CODE: + case IPADECO_CODE: + case SCRIPT_CODE: return true; - else + default: return false; + } }