X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2Finsetspecialchar.C;h=0c03dde33cea8adad5b0a3fd02d71bdd545a99de;hb=4a5b7a5952ad2381fcdf4830511293e184c7c5a1;hp=2e61e5f20b90d8ec2b852d9e3c1eb72a3bbefbd4;hpb=35584afc1162dec2cf9fff79305e95cb3b75aefb;p=lyx.git diff --git a/src/insets/insetspecialchar.C b/src/insets/insetspecialchar.C index 2e61e5f20b..0c03dde33c 100644 --- a/src/insets/insetspecialchar.C +++ b/src/insets/insetspecialchar.C @@ -5,7 +5,7 @@ * * Copyright 1997 Asger Alstrup * - * ======================================================*/ + * ====================================================== */ #include @@ -14,197 +14,335 @@ #endif #include "insetspecialchar.h" -#include "lyxdraw.h" #include "debug.h" #include "LaTeXFeatures.h" +#include "BufferView.h" +#include "Painter.h" +#include "font.h" +#include "lyxlex.h" +#include "lyxfont.h" -InsetSpecialChar::InsetSpecialChar() -{ -} - +using std::ostream; +using std::max; InsetSpecialChar::InsetSpecialChar(Kind k) - : kind(k) -{ -} + : kind_(k) +{} -InsetSpecialChar::~InsetSpecialChar() +InsetSpecialChar::Kind InsetSpecialChar::kind() const { + return kind_; } - -int InsetSpecialChar::Ascent(LyXFont const&font) const +int InsetSpecialChar::ascent(BufferView *, LyXFont const & font) const { - return font.maxAscent(); + return lyxfont::maxAscent(font); } -int InsetSpecialChar::Descent(LyXFont const&font) const +int InsetSpecialChar::descent(BufferView *, LyXFont const & font) const { - return font.maxDescent(); + return lyxfont::maxDescent(font); } -int InsetSpecialChar::Width(LyXFont const&font) const +int InsetSpecialChar::width(BufferView *, LyXFont const & font) const { - LyXFont f = font; - switch (kind) { + switch (kind_) { case HYPHENATION: { - int w = f.textWidth("-", 1); + int w = lyxfont::width('-', font); if (w > 5) w -= 2; // to make it look shorter return w; } + case LIGATURE_BREAK: + { + return lyxfont::width('|', font); + } case END_OF_SENTENCE: { - return f.textWidth(".", 1); + return lyxfont::width('.', font); } case LDOTS: { - return f.textWidth(". . .", 5); + return lyxfont::width(". . .", font); } - case MENU_SEPARATOR: { - return f.textWidth(" x ", 3); + case MENU_SEPARATOR: + { + return lyxfont::width(" x ", font); } + case PROTECTED_SEPARATOR: + { + return lyxfont::width('x', font); + } + } return 1; // To shut up gcc } -void InsetSpecialChar::Draw(LyXFont font, LyXScreen &scr, - int baseline, float &x) +void InsetSpecialChar::draw(BufferView * bv, LyXFont const & f, + int baseline, float & x, bool) const { - switch (kind) { + Painter & pain = bv->painter(); + LyXFont font(f); + + switch (kind_) { case HYPHENATION: { - font.setColor(LyXFont::MAGENTA); - scr.drawText(font, "-", 1, baseline, int(x)); - x += Width(font); + font.setColor(LColor::special); + pain.text(int(x), baseline, "-", font); + x += width(bv, font); + break; + } + case LIGATURE_BREAK: + { + font.setColor(LColor::special); + pain.text(int(x), baseline, "|", font); + x += width(bv, font); break; } case END_OF_SENTENCE: { - font.setColor(LyXFont::MAGENTA); - scr.drawText(font, ".", 1, baseline, int(x)); - x += Width(font); + font.setColor(LColor::special); + pain.text(int(x), baseline, ".", font); + x += width(bv, font); break; } case LDOTS: { - font.setColor(LyXFont::MAGENTA); - scr.drawText(font, ". . .", 5, baseline, int(x)); - x += Width(font); + font.setColor(LColor::special); + pain.text(int(x), baseline, ". . .", font); + x += width(bv, font); break; } case MENU_SEPARATOR: { // 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'); - XPoint p[4]; - p[0].x = ox; p[0].y = baseline; - p[1].x = ox; p[1].y = baseline - h; - p[2].x = ox + w;p[2].y = baseline - h/2; - p[3].x = ox; p[3].y = baseline; - scr.drawLines(getGC(gc_copy), p, 4); - x += Width(font); + int w = lyxfont::width('x', font); + int ox = lyxfont::width(' ', font) + int(x); + int h = lyxfont::ascent('x', font); + 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(bv, font); + break; + } + case PROTECTED_SEPARATOR: + { + float w = width(bv, font); + int h = lyxfont::ascent('x', font); + 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[3] = int(x + w); + yp[3] = baseline - max(h / 4, 1); + + pain.lines(xp, yp, 4, LColor::special); + x += w; + break; } } } // In lyxf3 this will be just LaTeX -void InsetSpecialChar::Write(FILE *file) +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; + 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; + case PROTECTED_SEPARATOR: + //command = "\\protected_separator"; + command = "~"; + break; } - fprintf(file, "\\SpecialChar %s\n", command.c_str()); + os << "\\SpecialChar " << command << "\n"; } // This function will not be necessary when lyx3 -void InsetSpecialChar::Read(LyXLex &lex) +void InsetSpecialChar::read(Buffer const *, LyXLex & lex) { lex.nextToken(); - string command = lex.GetString(); - - if (command=="\\-") - kind = HYPHENATION; - else if (command=="\\@.") - kind = END_OF_SENTENCE; - else if (command=="\\ldots{}") - kind = LDOTS; - else if (command=="\\menuseparator") - kind = MENU_SEPARATOR; + string const command = lex.getString(); + + if (command == "\\-") + kind_ = HYPHENATION; + else if (command == "\\textcompwordmark{}") + kind_ = LIGATURE_BREAK; + else if (command == "\\@.") + kind_ = END_OF_SENTENCE; + else if (command == "\\ldots{}") + kind_ = LDOTS; + else if (command == "\\menuseparator") + kind_ = MENU_SEPARATOR; + else if (command == "\\protected_separator" + || command == "~") + kind_ = PROTECTED_SEPARATOR; else lex.printError("InsetSpecialChar: Unknown kind: `$$Token'"); } -int InsetSpecialChar::Latex(FILE *file, signed char /*fragile*/) +int InsetSpecialChar::latex(Buffer const *, ostream & os, bool /*fragile*/, + bool free_space) const { - string command; - signed char dummy = 0; - Latex(command, dummy); - fprintf(file, "%s", command.c_str()); + 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; + case PROTECTED_SEPARATOR: + os << (free_space ? " " : "~"); + break; + } return 0; } -int InsetSpecialChar::Latex(string &file, signed char /*fragile*/) +int InsetSpecialChar::ascii(Buffer const *, ostream & os, int) const { - switch (kind) { - case HYPHENATION: file += "\\-"; break; - case END_OF_SENTENCE: file += "\\@."; break; - case LDOTS: file += "\\ldots{}"; break; - case MENU_SEPARATOR: file += "\\lyxarrow{}"; break; + switch (kind_) { + case HYPHENATION: + case LIGATURE_BREAK: + break; + case END_OF_SENTENCE: + os << "."; + break; + case LDOTS: + os << "..."; + break; + case MENU_SEPARATOR: + os << "->"; + break; + case PROTECTED_SEPARATOR: + os << " "; + break; } return 0; } -int InsetSpecialChar::Linuxdoc(string &file) +int InsetSpecialChar::linuxdoc(Buffer const *, ostream & os) const { - switch (kind) { - case HYPHENATION: file += ""; break; - case END_OF_SENTENCE: file += ""; break; - case LDOTS: file += "..."; break; - case MENU_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; + case PROTECTED_SEPARATOR: + os << " "; + break; } return 0; } -int InsetSpecialChar::DocBook(string &file) +int InsetSpecialChar::docbook(Buffer const *, ostream & os) const { - switch (kind) { - case HYPHENATION: file += ""; break; - case END_OF_SENTENCE: file += ""; break; - case LDOTS: file += "..."; break; - case MENU_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; + case PROTECTED_SEPARATOR: + os << " "; + break; } return 0; } -Inset* InsetSpecialChar::Clone() +Inset * InsetSpecialChar::clone(Buffer const &, bool) const { - InsetSpecialChar *result = new InsetSpecialChar(kind); - return result; + return 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::isSpace() const +{ + return kind_ == PROTECTED_SEPARATOR; +} + + +bool InsetSpecialChar::isLineSeparator() const +{ + return kind_ == HYPHENATION || kind_ == MENU_SEPARATOR; +}