X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2Finsetspecialchar.C;h=7ed1ea8489cbae9250b301601e10480647e119c3;hb=e28331ed63062dea10d0a21b9ec12034b4b17b9a;hp=2db0639952729161b8e0c490c524d9d2fef18f71;hpb=a9b448a027036c65c40b372bd19e02f243d1f1ab;p=lyx.git diff --git a/src/insets/insetspecialchar.C b/src/insets/insetspecialchar.C index 2db0639952..7ed1ea8489 100644 --- a/src/insets/insetspecialchar.C +++ b/src/insets/insetspecialchar.C @@ -1,146 +1,120 @@ -/* This file is part of - * ====================================================== - * - * LyX, The Document Processor - * - * Copyright 1997 Asger Alstrup +/** + * \file insetspecialchar.C + * This file is part of LyX, the document processor. + * Licence details can be found in the file COPYING. * - * ====================================================== */ + * \author Asger Alstrup Nielsen + * \author Jean-Marc Lasgouttes + * \author Lars Gullik Bjønnes + * + * Full author contact details are available in file CREDITS. + */ #include -#ifdef __GNUG__ -#pragma implementation -#endif - #include "insetspecialchar.h" + #include "debug.h" #include "LaTeXFeatures.h" -#include "Painter.h" +#include "LColor.h" +#include "lyxlex.h" +#include "metricsinfo.h" + +#include "frontends/FontMetrics.h" +#include "frontends/Painter.h" + + +namespace lyx { + +using std::string; +using std::auto_ptr; +using std::ostream; InsetSpecialChar::InsetSpecialChar(Kind k) - : kind(k) + : kind_(k) {} -int InsetSpecialChar::ascent(Painter &, LyXFont const & font) const +InsetSpecialChar::Kind InsetSpecialChar::kind() const { - return font.maxAscent(); + return kind_; } -int InsetSpecialChar::descent(Painter &, LyXFont const & font) const +bool InsetSpecialChar::metrics(MetricsInfo & mi, Dimension & dim) const { - return font.maxDescent(); + frontend::FontMetrics const & fm = + theFontMetrics(mi.base.font); + dim.asc = fm.maxAscent(); + dim.des = fm.maxDescent(); + + string s; + switch (kind_) { + case LIGATURE_BREAK: s = "|"; break; + case END_OF_SENTENCE: s = "."; break; + case LDOTS: s = ". . ."; break; + case MENU_SEPARATOR: s = " x "; break; + case HYPHENATION: s = "-"; break; + } + docstring ds(s.begin(), s.end()); + dim.wid = fm.width(ds); + if (kind_ == HYPHENATION && dim.wid > 5) + dim.wid -= 2; // to make it look shorter + bool const changed = dim_ != dim; + dim_ = dim; + return changed; } -int InsetSpecialChar::width(Painter &, LyXFont const & font) const +void InsetSpecialChar::draw(PainterInfo & pi, int x, int y) const { - switch (kind) { + LyXFont font = pi.base.font; + + switch (kind_) { case HYPHENATION: { - int w = font.textWidth("-", 1); - if (w > 5) - w -= 2; // to make it look shorter - return w; - } - case END_OF_SENTENCE: - { - return font.textWidth(".", 1); - } - case LDOTS: - { - return font.textWidth(". . .", 5); - } - case MENU_SEPARATOR: - { - return font.textWidth(" x ", 3); - } -#if 0 - case NEWLINE: - { - } -#endif - case PROTECTED_SEPARATOR: - { - return font.textWidth("x", 1); - } - + font.setColor(LColor::special); + pi.pain.text(x, y, char_type('-'), font); + break; } - return 1; // To shut up gcc -} - - -void InsetSpecialChar::draw(Painter & pain, LyXFont const & f, - int baseline, float & x) const -{ - LyXFont font(f); - switch (kind) { - case HYPHENATION: + case LIGATURE_BREAK: { font.setColor(LColor::special); - pain.text(int(x), baseline, "-", font); - x += width(pain, font); + pi.pain.text(x, y, char_type('|'), font); break; } case END_OF_SENTENCE: { font.setColor(LColor::special); - pain.text(int(x), baseline, ".", font); - x += width(pain, font); + pi.pain.text(x, y, char_type('.'), font); break; } case LDOTS: { font.setColor(LColor::special); - pain.text(int(x), baseline, ". . .", font); - x += width(pain, font); + string ell = ". . . "; + docstring dell(ell.begin(), ell.end()); + pi.pain.text(x, y, dell, font); break; } case MENU_SEPARATOR: { + frontend::FontMetrics const & fm = + theFontMetrics(font); + // A triangle the width and height of an 'x' - int w = font.textWidth("x", 1); - int ox = font.textWidth(" ", 1) + int(x); - int h = font.ascent('x'); - int xp[4], yp[4]; - - xp[0] = ox; yp[0] = baseline; - xp[1] = ox; yp[1] = baseline - h; - xp[2] = ox + w; yp[2] = baseline - h/2; - xp[3] = ox; yp[3] = baseline; - - pain.lines(xp, yp, 4, LColor::special); - x += width(pain, font); - break; - } -#if 0 - case NEWLINE: - { - } -#endif - case PROTECTED_SEPARATOR: - { - float w = width(pain, font); - int h = font.ascent('x'); + int w = fm.width(char_type('x')); + int ox = fm.width(char_type(' ')) + x; + int h = fm.ascent(char_type('x')); int xp[4], yp[4]; - - xp[0] = int(x); - yp[0] = baseline - max(h / 4, 1); - - xp[1] = int(x); - yp[1] = baseline; - xp[2] = int(x + w); - yp[2] = baseline; + xp[0] = ox; yp[0] = y; + xp[1] = ox; yp[1] = y - h; + xp[2] = ox + w; yp[2] = y - h/2; + xp[3] = ox; yp[3] = y; - xp[3] = int(x + w); - yp[3] = baseline - max(h / 4, 1); - - pain.lines(xp, yp, 4, LColor::special); - x += w; + pi.pain.lines(xp, yp, 4, LColor::special); break; } } @@ -148,116 +122,162 @@ void InsetSpecialChar::draw(Painter & pain, LyXFont const & f, // In lyxf3 this will be just LaTeX -void InsetSpecialChar::Write(ostream & os) const +void InsetSpecialChar::write(Buffer const &, ostream & os) const { string command; - switch (kind) { - case HYPHENATION: command = "\\-"; break; - case END_OF_SENTENCE: command = "\\@."; break; - case LDOTS: command = "\\ldots{}"; break; - case MENU_SEPARATOR: command = "\\menuseparator"; break; -#if 0 - case NEWLINE: command = "\\newline"; break; -#endif - case PROTECTED_SEPARATOR: - command = "\\protected_separator"; break; + switch (kind_) { + case HYPHENATION: + command = "\\-"; + break; + case LIGATURE_BREAK: + command = "\\textcompwordmark{}"; + break; + case END_OF_SENTENCE: + command = "\\@."; + break; + case LDOTS: + command = "\\ldots{}"; + break; + case MENU_SEPARATOR: + command = "\\menuseparator"; + break; } os << "\\SpecialChar " << command << "\n"; } // This function will not be necessary when lyx3 -void InsetSpecialChar::Read(LyXLex & lex) -{ - lex.nextToken(); - string command = lex.GetString(); +void InsetSpecialChar::read(Buffer const &, LyXLex & lex) +{ + lex.next(); + string const command = lex.getString(); if (command == "\\-") - kind = HYPHENATION; + kind_ = HYPHENATION; + else if (command == "\\textcompwordmark{}") + kind_ = LIGATURE_BREAK; else if (command == "\\@.") - kind = END_OF_SENTENCE; + kind_ = END_OF_SENTENCE; else if (command == "\\ldots{}") - kind = LDOTS; + kind_ = LDOTS; else if (command == "\\menuseparator") - kind = MENU_SEPARATOR; - else if (command == "\\protected_separator") - kind = PROTECTED_SEPARATOR; + kind_ = MENU_SEPARATOR; else lex.printError("InsetSpecialChar: Unknown kind: `$$Token'"); } -int InsetSpecialChar::Latex(ostream & os, signed char /*fragile*/) const +int InsetSpecialChar::latex(Buffer const &, odocstream & os, + OutputParams const &) const { -#ifdef USE_OSTREAM_ONLY - switch (kind) { - case HYPHENATION: os << "\\-"; break; - case END_OF_SENTENCE: os << "\\@."; break; - case LDOTS: os << "\\ldots{}"; break; - case MENU_SEPARATOR: os << "\\lyxarrow{}"; break; - case PROTECTED_SEPARATOR: os << "~"; break; + switch (kind_) { + case HYPHENATION: + os << "\\-"; + break; + case LIGATURE_BREAK: + os << "\\textcompwordmark{}"; + break; + case END_OF_SENTENCE: + os << "\\@."; + break; + case LDOTS: + os << "\\ldots{}"; + break; + case MENU_SEPARATOR: + os << "\\lyxarrow{}"; + break; } return 0; -#else - string command; - signed char dummy = 0; - Latex(command, dummy); - os << command; - return 0; -#endif } -#ifndef USE_OSTREAM_ONLY -int InsetSpecialChar::Latex(string & file, signed char /*fragile*/) const +int InsetSpecialChar::plaintext(Buffer const &, odocstream & os, + OutputParams const &) const { - switch (kind) { - case HYPHENATION: file += "\\-"; break; - case END_OF_SENTENCE: file += "\\@."; break; - case LDOTS: file += "\\ldots{}"; break; - case MENU_SEPARATOR: file += "\\lyxarrow{}"; break; - case PROTECTED_SEPARATOR: file += "~"; break; + switch (kind_) { + case HYPHENATION: + case LIGATURE_BREAK: + break; + case END_OF_SENTENCE: + os << '.'; + break; + case LDOTS: + os << "..."; + break; + case MENU_SEPARATOR: + os << "->"; + break; } return 0; } -#endif -int InsetSpecialChar::Linuxdoc(string & file) const +int InsetSpecialChar::docbook(Buffer const &, odocstream & os, + OutputParams const &) const { - switch (kind) { - case HYPHENATION: file += ""; break; - case END_OF_SENTENCE: file += ""; break; - case LDOTS: file += "..."; break; - case MENU_SEPARATOR: file += "->"; break; - case PROTECTED_SEPARATOR: file += " "; break; + switch (kind_) { + case HYPHENATION: + case LIGATURE_BREAK: + break; + case END_OF_SENTENCE: + os << '.'; + break; + case LDOTS: + os << "..."; + break; + case MENU_SEPARATOR: + os << "&lyxarrow;"; + break; } return 0; } -int InsetSpecialChar::DocBook(string & file) const +int InsetSpecialChar::textString(Buffer const & buf, odocstream & os, + OutputParams const & op) const { - switch (kind) { - case HYPHENATION: file += ""; break; - case END_OF_SENTENCE: file += ""; break; - case LDOTS: file += "..."; break; - case MENU_SEPARATOR: file += "->"; break; - case PROTECTED_SEPARATOR: file += " "; break; - } - return 0; + return plaintext(buf, os, op); } -Inset * InsetSpecialChar::Clone() const +auto_ptr InsetSpecialChar::doClone() const { - return new InsetSpecialChar(kind); + return auto_ptr(new InsetSpecialChar(kind_)); } -void InsetSpecialChar::Validate(LaTeXFeatures & features) const +void InsetSpecialChar::validate(LaTeXFeatures & features) const { - if (kind == MENU_SEPARATOR) { - features.lyxarrow = true; + if (kind_ == MENU_SEPARATOR) { + features.require("lyxarrow"); } } + + +bool InsetSpecialChar::isChar() const +{ + return true; +} + + +bool InsetSpecialChar::isLetter() const +{ + return kind_ == HYPHENATION || kind_ == LIGATURE_BREAK; +} + + +bool InsetSpecialChar::isLineSeparator() const +{ +#if 0 + // this would be nice, but it does not work, since + // Paragraph::stripLeadingSpaces nukes the characters which + // have this property. I leave the code here, since it should + // eventually be made to work. (JMarc 20020327) + return kind_ == HYPHENATION || kind_ == MENU_SEPARATOR; +#else + return false; +#endif +} + + +} // namespace lyx