X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2Finsetspecialchar.C;h=0c03dde33cea8adad5b0a3fd02d71bdd545a99de;hb=4a5b7a5952ad2381fcdf4830511293e184c7c5a1;hp=f8705ec5120ac0511c7ac66e6007d040c5ce1c50;hpb=d0950acedaa91320340af398bb06d790486a2207;p=lyx.git diff --git a/src/insets/insetspecialchar.C b/src/insets/insetspecialchar.C index f8705ec512..0c03dde33c 100644 --- a/src/insets/insetspecialchar.C +++ b/src/insets/insetspecialchar.C @@ -16,32 +16,40 @@ #include "insetspecialchar.h" #include "debug.h" #include "LaTeXFeatures.h" +#include "BufferView.h" #include "Painter.h" #include "font.h" +#include "lyxlex.h" +#include "lyxfont.h" using std::ostream; using std::max; InsetSpecialChar::InsetSpecialChar(Kind k) - : kind(k) + : kind_(k) {} -int InsetSpecialChar::ascent(Painter &, LyXFont const & font) const +InsetSpecialChar::Kind InsetSpecialChar::kind() const +{ + return kind_; +} + +int InsetSpecialChar::ascent(BufferView *, LyXFont const & font) const { return lyxfont::maxAscent(font); } -int InsetSpecialChar::descent(Painter &, LyXFont const & font) const +int InsetSpecialChar::descent(BufferView *, LyXFont const & font) const { return lyxfont::maxDescent(font); } -int InsetSpecialChar::width(Painter &, LyXFont const & font) const +int InsetSpecialChar::width(BufferView *, LyXFont const & font) const { - switch (kind) { + switch (kind_) { case HYPHENATION: { int w = lyxfont::width('-', font); @@ -49,6 +57,10 @@ int InsetSpecialChar::width(Painter &, LyXFont const & font) const w -= 2; // to make it look shorter return w; } + case LIGATURE_BREAK: + { + return lyxfont::width('|', font); + } case END_OF_SENTENCE: { return lyxfont::width('.', font); @@ -71,30 +83,39 @@ int InsetSpecialChar::width(Painter &, LyXFont const & font) const } -void InsetSpecialChar::draw(Painter & pain, LyXFont const & f, - int baseline, float & x) const +void InsetSpecialChar::draw(BufferView * bv, LyXFont const & f, + int baseline, float & x, bool) const { + Painter & pain = bv->painter(); LyXFont font(f); - switch (kind) { + + switch (kind_) { case HYPHENATION: { font.setColor(LColor::special); pain.text(int(x), baseline, "-", font); - x += width(pain, 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(LColor::special); pain.text(int(x), baseline, ".", font); - x += width(pain, font); + x += width(bv, font); break; } case LDOTS: { font.setColor(LColor::special); pain.text(int(x), baseline, ". . .", font); - x += width(pain, font); + x += width(bv, font); break; } case MENU_SEPARATOR: @@ -111,12 +132,12 @@ void InsetSpecialChar::draw(Painter & pain, LyXFont const & f, xp[3] = ox; yp[3] = baseline; pain.lines(xp, yp, 4, LColor::special); - x += width(pain, font); + x += width(bv, font); break; } case PROTECTED_SEPARATOR: { - float w = width(pain, font); + float w = width(bv, font); int h = lyxfont::ascent('x', font); int xp[4], yp[4]; @@ -141,91 +162,187 @@ 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; + 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"; break; + //command = "\\protected_separator"; + command = "~"; + break; } 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(); + 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 if (command == "\\protected_separator" + || command == "~") + kind_ = PROTECTED_SEPARATOR; else lex.printError("InsetSpecialChar: Unknown kind: `$$Token'"); } -int InsetSpecialChar::Latex(ostream & os, bool /*fragile*/, +int InsetSpecialChar::latex(Buffer const *, ostream & os, bool /*fragile*/, bool free_space) const { - 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 << (free_space ? " " : "~"); 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; + case PROTECTED_SEPARATOR: + os << (free_space ? " " : "~"); + break; } return 0; } -int InsetSpecialChar::Linuxdoc(ostream & os) const +int InsetSpecialChar::ascii(Buffer const *, ostream & os, int) const { - switch (kind) { - case HYPHENATION: os << ""; break; - case END_OF_SENTENCE: os << ""; break; - case LDOTS: os << "..."; break; - case MENU_SEPARATOR: os << "->"; break; - case PROTECTED_SEPARATOR: os << " "; 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::DocBook(ostream & os) const +int InsetSpecialChar::linuxdoc(Buffer const *, ostream & os) const { - switch (kind) { - case HYPHENATION: os << ""; break; - case END_OF_SENTENCE: os << ""; break; - case LDOTS: os << "..."; break; - case MENU_SEPARATOR: os << "->"; break; - case PROTECTED_SEPARATOR: os << " "; 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() const +int InsetSpecialChar::docbook(Buffer const *, ostream & os) const { - return new InsetSpecialChar(kind); + 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; } -void InsetSpecialChar::Validate(LaTeXFeatures & features) const +Inset * InsetSpecialChar::clone(Buffer const &, bool) const { - if (kind == MENU_SEPARATOR) { - features.lyxarrow = true; + return new InsetSpecialChar(kind_); +} + + +void InsetSpecialChar::validate(LaTeXFeatures & features) const +{ + 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; +}