]> git.lyx.org Git - lyx.git/blobdiff - src/insets/InsetQuotes.cpp
Some things did not need to be mutable after all
[lyx.git] / src / insets / InsetQuotes.cpp
index 8586ce18d5372382689ae1cbcacbb93ddede55f5..1a6c925bf7cd9fcd478f5844553ae27ebc9a0fce 100644 (file)
@@ -24,6 +24,7 @@
 #include "MetricsInfo.h"
 #include "OutputParams.h"
 #include "output_xhtml.h"
+#include "texstream.h"
 
 #include "frontends/FontMetrics.h"
 #include "frontends/Painter.h"
@@ -95,21 +96,14 @@ InsetQuotes::InsetQuotes(Buffer * buf, string const & str) : Inset(buf)
        parseString(str);
 }
 
-InsetQuotes::InsetQuotes(Buffer * buf, char_type c) : Inset(buf)
-{
-       if (buf) {
-               language_ = buf->params().quotes_language;
-               times_ = buf->params().quotes_times;
-       }
-       setSide(c);
-}
-
-
 InsetQuotes::InsetQuotes(Buffer * buf, char_type c, QuoteTimes t)
        : Inset(buf), times_(t)
 {
        if (buf)
                language_ = buf->params().quotes_language;
+       else
+               language_ = EnglishQuotes;
+
        setSide(c);
 }
 
@@ -184,20 +178,23 @@ void InsetQuotes::parseString(string const & s)
 }
 
 
+// FIXME: should we add a language or a font parameter member?
 docstring InsetQuotes::displayString() const
 {
-       Language const * loclang = 
+       Language const * loclang =
                isBufferValid() ? buffer().params().language : 0;
        int const index = quote_index[side_][language_];
        docstring retdisp = docstring(1, display_quote_char[times_][index]);
 
-       // in french, spaces are added inside double quotes
+       // in french, thin spaces are added inside double quotes
        // FIXME: this should be done by a separate quote type.
        if (times_ == DoubleQuotes && loclang && prefixIs(loclang->code(), "fr")) {
+               // THIN SPACE (U+2009)
+               char_type const thin_space = 0x2009;
                if (side_ == LeftQuote)
-                       retdisp += ' ';
+                       retdisp += thin_space;
                else
-                       retdisp.insert(size_t(0), 1, ' ');
+                       retdisp = thin_space + retdisp;
        }
 
        return retdisp;
@@ -207,38 +204,18 @@ docstring InsetQuotes::displayString() const
 void InsetQuotes::metrics(MetricsInfo & mi, Dimension & dim) const
 {
        FontInfo & font = mi.base.font;
-       frontend::FontMetrics const & fm =
-               theFontMetrics(font);
+       frontend::FontMetrics const & fm = theFontMetrics(font);
        dim.asc = fm.maxAscent();
        dim.des = fm.maxDescent();
-       dim.wid = 0;
-
-       // FIXME: should we add a language or a font parameter member?
-       docstring const text = displayString();
-       for (string::size_type i = 0; i < text.length(); ++i) {
-               if (text[i] == ' ')
-                       dim.wid += fm.width('i');
-               else if (i == 0 || text[i] != text[i - 1])
-                       dim.wid += fm.width(text[i]);
-               else
-                       dim.wid += fm.width(',');
-       }
+       dim.wid = fm.width(displayString());
 }
 
 
 void InsetQuotes::draw(PainterInfo & pi, int x, int y) const
 {
-       // FIXME: should we add a language or a font parameter member?
-       docstring const text = displayString();
-
-       if (text.length() == 2 && text[0] == text[1]) {
-               pi.pain.text(x, y, text[0], pi.base.font);
-               int const t = theFontMetrics(pi.base.font)
-                       .width(',');
-               pi.pain.text(x + t, y, text[0], pi.base.font);
-       } else {
-               pi.pain.text(x, y, text, pi.base.font);
-       }
+       FontInfo font = pi.base.font;
+       font.setPaintColor(pi.textColor(font.realColor()));
+       pi.pain.text(x, y, displayString(), font);
 }
 
 
@@ -297,7 +274,8 @@ void InsetQuotes::latex(otexstream & os, OutputParams const & runparams) const
 }
 
 
-int InsetQuotes::plaintext(odocstream & os, OutputParams const &) const
+int InsetQuotes::plaintext(odocstringstream & os, 
+        OutputParams const &, size_t) const
 {
        docstring const str = displayString();
        os << str;
@@ -305,26 +283,30 @@ int InsetQuotes::plaintext(odocstream & os, OutputParams const &) const
 }
 
 
-int InsetQuotes::docbook(odocstream & os, OutputParams const &) const
-{
+docstring InsetQuotes::getQuoteEntity() const {
        if (times_ == DoubleQuotes) {
                if (side_ == LeftQuote)
-                       os << "&ldquo;";
-               else
-                       os << "&rdquo;";
-       } else {
-               if (side_ == LeftQuote)
-                       os << "&lsquo;";
+                       return from_ascii("&ldquo;");
                else
-                       os << "&rsquo;";
+                       return from_ascii("&rdquo;");
        }
+       if (side_ == LeftQuote)
+               return from_ascii("&lsquo;");
+       else
+               return from_ascii("&rsquo;");
+}
+
+
+int InsetQuotes::docbook(odocstream & os, OutputParams const &) const
+{
+       os << getQuoteEntity();
        return 0;
 }
 
 
-docstring InsetQuotes::xhtml(XHTMLStream & xs, OutputParams const & op) const
+docstring InsetQuotes::xhtml(XHTMLStream & xs, OutputParams const &) const
 {
-       docbook(xs.os(), op);
+       xs << XHTMLStream::ESCAPE_NONE << getQuoteEntity();
        return docstring();
 }
 
@@ -335,7 +317,7 @@ void InsetQuotes::toString(odocstream & os) const
 }
 
 
-void InsetQuotes::forToc(docstring & os, size_t) const
+void InsetQuotes::forOutliner(docstring & os, size_t const, bool const) const
 {
        os += displayString();
 }
@@ -343,13 +325,12 @@ void InsetQuotes::forToc(docstring & os, size_t) const
 
 void InsetQuotes::validate(LaTeXFeatures & features) const
 {
-       bool const use_babel = features.useBabel();
        char type = quote_char[quote_index[side_][language_]];
 
 #ifdef DO_USE_DEFAULT_LANGUAGE
        if (features.bufferParams().language->lang() == "default"
 #else
-       if (!use_babel
+       if (!features.useBabel()
 #endif
            && lyxrc.fontenc != "T1") {
                if (times_ == SingleQuotes)