X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2Finsetquotes.C;h=eb7c87e454086a3daf03fd07dfb4d88d9e4f1ca6;hb=e28331ed63062dea10d0a21b9ec12034b4b17b9a;hp=571adbf73b1e90f26170e509f592cb3f7fcfd1e9;hpb=453f294074a588ac62886d512e97619ff219c766;p=lyx.git diff --git a/src/insets/insetquotes.C b/src/insets/insetquotes.C index 571adbf73b..eb7c87e454 100644 --- a/src/insets/insetquotes.C +++ b/src/insets/insetquotes.C @@ -5,7 +5,7 @@ * * \author Jean-Marc Lasgouttes * - * Full author contact details are available in file CREDITS + * Full author contact details are available in file CREDITS. */ #include @@ -13,27 +13,44 @@ #include "insetquotes.h" #include "buffer.h" -#include "BufferView.h" +#include "bufferparams.h" #include "debug.h" -#include "dimension.h" #include "language.h" #include "LaTeXFeatures.h" -#include "latexrunparams.h" -#include "lyxfont.h" #include "lyxlex.h" #include "lyxrc.h" +#include "metricsinfo.h" +#include "outputparams.h" #include "paragraph.h" -#include "frontends/font_metrics.h" +#include "paragraph_funcs.h" + +#include "frontends/FontMetrics.h" #include "frontends/Painter.h" -#include "support/LAssert.h" + #include "support/lstrings.h" -using std::ostream; + +namespace lyx { + +using support::prefixIs; + using std::endl; +using std::string; +using std::auto_ptr; +using std::ostream; + namespace { -// codes used to read/write quotes to LyX files +/* codes used to read/write quotes to LyX files + * e ``english'' + * s ''spanish'' + * g ,,german`` + * p ,,polish'' + * f <> + * a >>danish<< + */ + char const * const language_char = "esgpfa"; char const * const side_char = "lr" ; char const * const times_char = "sd"; @@ -68,23 +85,38 @@ char const * const latex_quote_babel[2][5] = InsetQuotes::InsetQuotes(string const & str) { parseString(str); + setInsetName(from_utf8("InsetQuotes")); } InsetQuotes::InsetQuotes(quote_language l, quote_side s, quote_times t) : language_(l), side_(s), times_(t) -{} +{ + setInsetName(from_utf8("InsetQuotes")); +} -InsetQuotes::InsetQuotes(char c, BufferParams const & params) +InsetQuotes::InsetQuotes(char_type c, BufferParams const & params) : language_(params.quotes_language), times_(params.quotes_times) +{ + getPosition(c); + setInsetName(from_utf8("InsetQuotes")); +} + + +InsetQuotes::InsetQuotes(char_type c, quote_language l, quote_times t) + : language_(l), times_(t) +{ + getPosition(c); + setInsetName(from_utf8("InsetQuotes")); +} + + +void InsetQuotes::getPosition(char_type c) { // Decide whether left or right switch (c) { - case ' ': case '(': -#warning eh ? I am lost here ... - //case Paragraph::META_HFILL: - // case Paragraph::META_NEWLINE: + case ' ': case '(': case '[': side_ = LeftQ; // left quote break; default: @@ -142,50 +174,74 @@ void InsetQuotes::parseString(string const & s) } -string const InsetQuotes::dispString(Language const * loclang) const +docstring const InsetQuotes::dispString(Language const * loclang) const { string disp; disp += quote_char[quote_index[side_][language_]]; if (times_ == DoubleQ) disp += disp; - if (lyxrc.font_norm_type == LyXRC::ISO_8859_1 - || lyxrc.font_norm_type == LyXRC::ISO_8859_9 - || lyxrc.font_norm_type == LyXRC::ISO_8859_15) { - if (disp == "<<") - disp = '«'; - else if (disp == ">>") - disp = '»'; - } + docstring retdisp; + if (disp == "<<") + retdisp = docstring(1, 0x00ab); //'«'; + else if (disp == ">>") + retdisp = docstring(1, 0x00bb); //'»'; +#if 0 + // The below are supposed to work, but something fails. + else if (disp == ",,") + retdisp = docstring(1, 0x201e); + else if (disp == "''") + retdisp == docstring(1, 0x201d); + else if (disp == "``") + retdisp == docstring(1, 0x201c); + else if (disp == "<") + retdisp = docstring(1, 0x2039); + else if (disp == ">") + retdisp = docstring(1, 0x203a); + else if (disp == ",") + retdisp = docstring(1, 0x201a); + else if (disp == "'") + retdisp = docstring(1, 0x2019); + else if (disp == "`") + retdisp = docstring(1, 0x2018); +#endif + else + retdisp = lyx::from_ascii(disp); + // in french, spaces are added inside double quotes if (times_ == DoubleQ && prefixIs(loclang->code(), "fr")) { if (side_ == LeftQ) - disp += ' '; + retdisp += ' '; else - disp.insert(string::size_type(0), 1, ' '); + retdisp.insert(docstring::size_type(0), 1, ' '); } - return disp; + return retdisp; } -void InsetQuotes::dimension(BufferView *, LyXFont const & font, - Dimension & dim) const +bool InsetQuotes::metrics(MetricsInfo & mi, Dimension & dim) const { - dim.a = font_metrics::maxAscent(font); - dim.d = font_metrics::maxDescent(font); - dim.w = 0; - - string const text = dispString(font.language()); + LyXFont & font = mi.base.font; + frontend::FontMetrics const & fm = + theFontMetrics(font); + dim.asc = fm.maxAscent(); + dim.des = fm.maxDescent(); + dim.wid = 0; + + docstring const text = dispString(font.language()); for (string::size_type i = 0; i < text.length(); ++i) { if (text[i] == ' ') - dim.w += font_metrics::width('i', font); + dim.wid += fm.width('i'); else if (i == 0 || text[i] != text[i - 1]) - dim.w += font_metrics::width(text[i], font); + dim.wid += fm.width(text[i]); else - dim.w += font_metrics::width(',', font); + dim.wid += fm.width(','); } + bool const changed = dim_ != dim; + dim_ = dim; + return changed; } @@ -202,22 +258,23 @@ LyXFont const InsetQuotes::convertFont(LyXFont const & f) const #endif -void InsetQuotes::draw(BufferView * bv, LyXFont const & font, - int baseline, float & x) const +void InsetQuotes::draw(PainterInfo & pi, int x, int y) const { - string const text = dispString(font.language()); + docstring const text = dispString(pi.base.font.language()); if (text.length() == 2 && text[0] == text[1]) { - bv->painter().text(int(x), baseline, text[0], font); - int x2 = int(x + font_metrics::width(',', font)); - bv->painter().text(x2, baseline, text[0], font); - } else - bv->painter().text(int(x), baseline, text, font); - x += width(bv, font); + 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); + } + setPosCache(pi, x, y); } -void InsetQuotes::write(Buffer const *, ostream & os) const +void InsetQuotes::write(Buffer const &, ostream & os) const { string text; text += language_char[language_]; @@ -227,9 +284,9 @@ void InsetQuotes::write(Buffer const *, ostream & os) const } -void InsetQuotes::read(Buffer const *, LyXLex & lex) +void InsetQuotes::read(Buffer const &, LyXLex & lex) { - lex.nextToken(); + lex.next(); parseString(lex.getString()); lex.next(); if (lex.getString() != "\\end_inset") { @@ -238,38 +295,18 @@ void InsetQuotes::read(Buffer const *, LyXLex & lex) } -int InsetQuotes::latex(Buffer const * buf, ostream & os, - LatexRunParams const & runparams) const +int InsetQuotes::latex(Buffer const &, odocstream & os, + OutputParams const & runparams) const { - // How do we get the local language here?? - lyx::pos_type curr_pos = parOwner()->getPositionOfInset(this); - lyx::Assert(curr_pos != -1); - -#warning FIXME. We _must_ find another way to get the language. (Lgb) -#if 0 - // This cannot be used. (Lgb) - string const curr_lang = - parOwner()->getFont(buf->params, - curr_pos).language()->babel(); -#else - // And this is not the way... (Lgb) - string const curr_lang = buf->params.language->lang(); -#endif const int quoteind = quote_index[side_][language_]; string qstr; if (language_ == FrenchQ && times_ == DoubleQ - && curr_lang == "frenchb") { + && prefixIs(runparams.local_font->language()->code(), "fr")) { if (side_ == LeftQ) qstr = "\\og "; //the spaces are important here else qstr = " \\fg{}"; //and here - } else if (language_ == FrenchQ && times_ == DoubleQ - && curr_lang == "french") { - if (side_ == LeftQ) - qstr = "<< "; //the spaces are important here - else - qstr = " >>"; //and here } else if (lyxrc.fontenc == "T1") { qstr = latex_quote_t1[times_][quoteind]; #ifdef DO_USE_DEFAULT_LANGUAGE @@ -286,26 +323,21 @@ int InsetQuotes::latex(Buffer const * buf, ostream & os, if (prefixIs(qstr, "`")) qstr.insert(0, "{}"); - os << qstr; + os << from_ascii(qstr); return 0; } -int InsetQuotes::ascii(Buffer const *, ostream & os, int) const +int InsetQuotes::plaintext(Buffer const & buf, odocstream & os, + OutputParams const &) const { - os << '"'; + os << dispString(buf.params().language); return 0; } -int InsetQuotes::linuxdoc(Buffer const *, ostream & os) const -{ - os << '"'; - return 0; -} - - -int InsetQuotes::docbook(Buffer const *, ostream & os, bool) const +int InsetQuotes::docbook(Buffer const &, odocstream & os, + OutputParams const &) const { if (times_ == DoubleQ) { if (side_ == LeftQ) @@ -322,10 +354,15 @@ int InsetQuotes::docbook(Buffer const *, ostream & os, bool) const } -extern bool use_babel; +void InsetQuotes::textString(Buffer const & buf, odocstream & os) const +{ + os << dispString(buf.params().language); +} + 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 @@ -336,7 +373,7 @@ void InsetQuotes::validate(LaTeXFeatures & features) const && lyxrc.fontenc != "T1") { if (times_ == SingleQ) switch (type) { - case ',': features.require("quotesinglbase"); break; + case ',': features.require("quotesinglbase"); break; case '<': features.require("guilsinglleft"); break; case '>': features.require("guilsinglright"); break; default: break; @@ -352,13 +389,16 @@ void InsetQuotes::validate(LaTeXFeatures & features) const } -Inset * InsetQuotes::clone(Buffer const &, bool) const +auto_ptr InsetQuotes::doClone() const { - return new InsetQuotes(language_, side_, times_); + return auto_ptr(new InsetQuotes(language_, side_, times_)); } -Inset::Code InsetQuotes::lyxCode() const +InsetBase::Code InsetQuotes::lyxCode() const { - return Inset::QUOTE_CODE; + return InsetBase::QUOTE_CODE; } + + +} // namespace lyx