]> git.lyx.org Git - lyx.git/blobdiff - src/insets/InsetIPAMacro.cpp
Properly terminate command
[lyx.git] / src / insets / InsetIPAMacro.cpp
index 6e0591f7dd8f6c3fede40ee19f4579851bacf412..4b2369b3796741fb6177bd1f876da9313146f893 100644 (file)
@@ -23,6 +23,7 @@
 #include "Lexer.h"
 #include "MetricsInfo.h"
 #include "output_xhtml.h"
+#include "texstream.h"
 
 #include "frontends/FontMetrics.h"
 #include "frontends/Painter.h"
@@ -59,14 +60,16 @@ IPADecoTranslatorLoc const init_ipadecotranslator_loc()
 
 IPADecoTranslator const & ipadecotranslator()
 {
-       static IPADecoTranslator decotranslator = init_ipadecotranslator();
+       static IPADecoTranslator const decotranslator =
+                       init_ipadecotranslator();
        return decotranslator;
 }
 
 
 IPADecoTranslatorLoc const & ipadecotranslator_loc()
 {
-       static IPADecoTranslatorLoc translator = init_ipadecotranslator_loc();
+       static IPADecoTranslatorLoc const translator =
+           init_ipadecotranslator_loc();
        return translator;
 }
 
@@ -86,11 +89,12 @@ IPACharTranslator const init_ipachartranslator()
 
 IPACharTranslator const & ipachartranslator()
 {
-       static IPACharTranslator chartranslator = init_ipachartranslator();
+       static IPACharTranslator const chartranslator =
+           init_ipachartranslator();
        return chartranslator;
 }
 
-} // anon
+} // namespace
 
 
 InsetIPADecoParams::InsetIPADecoParams()
@@ -121,7 +125,7 @@ void InsetIPADecoParams::read(Lexer & lex)
 /////////////////////////////////////////////////////////////////////
 
 InsetIPADeco::InsetIPADeco(Buffer * buf, string const & label)
-       : InsetCollapsable(buf)
+       : InsetCollapsible(buf)
 {
        setDrawFrame(true);
        setFrameColor(Color_insetframe);
@@ -142,7 +146,7 @@ docstring InsetIPADeco::layoutName() const
 void InsetIPADeco::metrics(MetricsInfo & mi, Dimension & dim) const
 {
        InsetText::metrics(mi, dim);
-       
+
        if (params_.type == InsetIPADecoParams::Toptiebar) {
                // consider width of the inset label
                FontInfo font(getLayout().labelfont());
@@ -154,7 +158,7 @@ void InsetIPADeco::metrics(MetricsInfo & mi, Dimension & dim) const
                int d = 0;
                docstring const label(1, char_type(0x2040));
                theFontMetrics(font).rectText(label, w, a, d);
-               dim.asc += a * 0.5;
+               dim.asc += int(a * 0.5);
        }
        if (params_.type == InsetIPADecoParams::Bottomtiebar) {
                // consider width of the inset label
@@ -167,23 +171,20 @@ void InsetIPADeco::metrics(MetricsInfo & mi, Dimension & dim) const
                int d = 0;
                docstring const label(1, char_type(0x203f));
                theFontMetrics(font).rectText(label, w, a, d);
-               dim.des += d * 1.5;
+               dim.des += int(d * 1.5);
        }
-
-       // cache the inset dimension
-       setDimCache(mi, dim);
 }
 
 
 void InsetIPADeco::draw(PainterInfo & pi, int x, int y) const
 {
        // draw the text
-       InsetCollapsable::draw(pi, x, y);
+       InsetCollapsible::draw(pi, x, y);
 
        // draw the inset marker
        drawMarkers(pi, x, y);
 
-       Dimension const dim = Inset::dimension(*pi.base.bv);
+       Dimension const dim = dimension(*pi.base.bv);
 
        if (params_.type == InsetIPADecoParams::Toptiebar) {
                FontInfo font(getLayout().labelfont());
@@ -197,7 +198,7 @@ void InsetIPADeco::draw(PainterInfo & pi, int x, int y) const
                docstring const label(1, char_type(0x2040));
                theFontMetrics(font).rectText(label, w, a, d);
                int const ww = max(dim.wid, w);
-               pi.pain.rectText(x + (ww - w) / 2, y - (asc / 2.5),
+               pi.pain.rectText(x + (ww - w) / 2, y - int(asc / 2.5),
                        label, font, Color_none, Color_none);
        }
 
@@ -213,7 +214,7 @@ void InsetIPADeco::draw(PainterInfo & pi, int x, int y) const
                docstring const label(1, char_type(0x203f));
                theFontMetrics(font).rectText(label, w, a, d);
                int const ww = max(dim.wid, w);
-               pi.pain.rectText(x + (ww - w) / 2, y + (desc / 1.5),
+               pi.pain.rectText(x + (ww - w) / 2, y + int(desc / 1.5),
                        label, font, Color_none, Color_none);
        }
 }
@@ -222,14 +223,14 @@ void InsetIPADeco::draw(PainterInfo & pi, int x, int y) const
 void InsetIPADeco::write(ostream & os) const
 {
        params_.write(os);
-       InsetCollapsable::write(os);
+       InsetCollapsible::write(os);
 }
 
 
 void InsetIPADeco::read(Lexer & lex)
 {
        params_.read(lex);
-       InsetCollapsable::read(lex);
+       InsetCollapsible::read(lex);
 }
 
 
@@ -276,30 +277,47 @@ void InsetIPADeco::latex(otexstream & os, OutputParams const & runparams) const
                os << "\\texttoptiebar{";
        else if (params_.type == InsetIPADecoParams::Bottomtiebar)
                os << "\\textbottomtiebar{";
-       InsetCollapsable::latex(os, runparams);
+       InsetCollapsible::latex(os, runparams);
        os << "}";
 }
 
 
-int InsetIPADeco::plaintext(odocstream & os,
-                           OutputParams const & runparams) const
+int InsetIPADeco::plaintext(odocstringstream & os,
+                           OutputParams const & runparams, size_t max_length) const
 {
-       // FIXME: Any plaintext option here?
-       return InsetCollapsable::plaintext(os, runparams);
+       odocstringstream ods;
+       int h = (int)(InsetCollapsible::plaintext(ods, runparams, max_length) / 2);
+       docstring result = ods.str();
+       docstring const before = result.substr(0, h);
+       docstring const after = result.substr(h, result.size());
+
+       if (params_.type == InsetIPADecoParams::Toptiebar) {
+               os << before;
+               os.put(0x0361);
+               os << after;
+       }
+       else if (params_.type == InsetIPADecoParams::Bottomtiebar) {
+               os << before;
+               os.put(0x035c);
+               os << after;
+       }
+       return result.size();
 }
 
 
 int InsetIPADeco::docbook(odocstream & os, OutputParams const & runparams) const
 {
        // FIXME: Any docbook option here?
-       return InsetCollapsable::docbook(os, runparams);
+       return InsetCollapsible::docbook(os, runparams);
 }
 
 
 docstring InsetIPADeco::xhtml(XHTMLStream & xs, OutputParams const & runparams) const
 {
-       // FIXME: Any xhtml option here?
-       return InsetCollapsable::xhtml(xs, runparams);
+       // FIXME: Like in plaintext, the combining characters "&#x361;" (toptiebar)
+       // or "&#x35c;" (bottomtiebar) would need to be inserted just in the mid
+       // of the text string. (How) can this be done with the xhtml stream?
+       return InsetCollapsible::xhtml(xs, runparams);
 }
 
 
@@ -337,8 +355,7 @@ void InsetIPADeco::string2params(string const & in, InsetIPADecoParams & params)
 
 void InsetIPADeco::validate(LaTeXFeatures & features) const
 {
-       if (!buffer_->params().useNonTeXFonts)
-               features.require("tipa");
+       features.require("tipa");
        InsetText::validate(features);
 }
 
@@ -393,7 +410,6 @@ void InsetIPAChar::metrics(MetricsInfo & mi, Dimension & dim) const
        }
        docstring ds(s.begin(), s.end());
        dim.wid = fm.width(ds);
-       setDimCache(mi, dim);
 }
 
 
@@ -432,7 +448,7 @@ void InsetIPAChar::draw(PainterInfo & pi, int x, int y) const
                int h = fm.ascent(char_type('M'));
                int x2 = x + w;
                int y2 = y - h;
-               int y3 = y - (h * 0.75);
+               int y3 = y - int(h * 0.75);
 
                pi.pain.line(x2, y, x2, y2, Color_foreground);
                pi.pain.line(x2, y2, x, y3, Color_foreground);
@@ -444,7 +460,7 @@ void InsetIPAChar::draw(PainterInfo & pi, int x, int y) const
                int h = fm.ascent(char_type('M'));
                int x2 = x + w;
                int y2 = y - h;
-               int y3 = y - (h * 0.25);
+               int y3 = y - int(h * 0.25);
 
                pi.pain.line(x2, y, x2, y2, Color_foreground);
                pi.pain.line(x2, y3, x, y, Color_foreground);
@@ -456,8 +472,8 @@ void InsetIPAChar::draw(PainterInfo & pi, int x, int y) const
                int h = fm.ascent(char_type('M'));
                int x2 = x + w;
                int y2 = y - h;
-               int x3 = x + (w * 0.5);
-               int y3 = y - (h * 0.75);
+               int x3 = x + int(w * 0.5);
+               int y3 = y - int(h * 0.75);
 
                pi.pain.line(x2, y, x2, y2, Color_foreground);
                pi.pain.line(x2, y3, x3, y2, Color_foreground);
@@ -495,7 +511,7 @@ void InsetIPAChar::latex(otexstream & os,
 }
 
 
-int InsetIPAChar::plaintext(odocstream & os, OutputParams const &) const
+int InsetIPAChar::plaintext(odocstringstream & os, OutputParams const &, size_t) const
 {
        switch (kind_) {
        case TONE_FALLING:
@@ -527,12 +543,13 @@ int InsetIPAChar::plaintext(odocstream & os, OutputParams const &) const
 int InsetIPAChar::docbook(odocstream & /*os*/, OutputParams const &) const
 {
        switch (kind_) {
-       // FIXME
        case TONE_FALLING:
        case TONE_RISING:
        case TONE_HIGH_RISING:
        case TONE_LOW_RISING:
        case TONE_HIGH_RISING_FALLING:
+               // FIXME
+               LYXERR0("IPA tone macros not yet implemented with DocBook!");
                break;
        }
        return 0;
@@ -570,11 +587,13 @@ docstring InsetIPAChar::xhtml(XHTMLStream & xs, OutputParams const &) const
 
 void InsetIPAChar::toString(odocstream & os) const
 {
-       plaintext(os, OutputParams(0));
+       odocstringstream ods;
+       plaintext(ods, OutputParams(0));
+       os << ods.str();
 }
 
 
-void InsetIPAChar::forToc(docstring & os, size_t) const
+void InsetIPAChar::forOutliner(docstring & os, size_t const, bool const) const
 {
        odocstringstream ods;
        plaintext(ods, OutputParams(0));
@@ -590,8 +609,7 @@ void InsetIPAChar::validate(LaTeXFeatures & features) const
        case TONE_HIGH_RISING:
        case TONE_LOW_RISING:
        case TONE_HIGH_RISING_FALLING:
-               if (!buffer_->params().useNonTeXFonts)
-                       features.require("tone");
+               features.require("tone");
                break;
        default:
                break;
@@ -599,16 +617,4 @@ void InsetIPAChar::validate(LaTeXFeatures & features) const
 }
 
 
-bool InsetIPAChar::isLetter() const
-{
-       return true;
-}
-
-
-bool InsetIPAChar::isLineSeparator() const
-{
-       return false;
-}
-
-
 } // namespace lyx