X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetNewline.cpp;h=b10954d4da659210f8192c273c7b47273bd2d87d;hb=59e6610d8ad4d5c5a81d9a6b4ef73ae36231489a;hp=b016ed3447d53c80b62eb661c243d65612944422;hpb=237c132c1e6fc720b87f2fea6deb18a8395cbe0a;p=lyx.git diff --git a/src/insets/InsetNewline.cpp b/src/insets/InsetNewline.cpp index b016ed3447..b10954d4da 100644 --- a/src/insets/InsetNewline.cpp +++ b/src/insets/InsetNewline.cpp @@ -4,6 +4,7 @@ * Licence details can be found in the file COPYING. * * \author John Levon + * \author Jürgen Spitzmüller * * Full author contact details are available in file CREDITS. */ @@ -12,29 +13,70 @@ #include "InsetNewline.h" -#include "debug.h" +#include "Cursor.h" +#include "Dimension.h" +#include "FuncRequest.h" +#include "FuncStatus.h" +#include "Lexer.h" #include "MetricsInfo.h" #include "OutputParams.h" +#include "output_xhtml.h" +#include "texstream.h" +#include "frontends/Application.h" #include "frontends/FontMetrics.h" #include "frontends/Painter.h" +#include "support/debug.h" +#include "support/docstream.h" +#include "support/docstring.h" + +using namespace std; namespace lyx { -using std::endl; -using std::ostream; +InsetNewline::InsetNewline() : Inset(0) +{} + + +void InsetNewlineParams::write(ostream & os) const +{ + switch (kind) { + case InsetNewlineParams::NEWLINE: + os << "newline"; + break; + case InsetNewlineParams::LINEBREAK: + os << "linebreak"; + break; + } +} -void InsetNewline::read(Buffer const &, Lexer &) +void InsetNewlineParams::read(Lexer & lex) { - /* Nothing to read */ + string token; + lex.setContext("InsetNewlineParams::read"); + lex >> token; + if (token == "newline") + kind = InsetNewlineParams::NEWLINE; + else if (token == "linebreak") + kind = InsetNewlineParams::LINEBREAK; + else + lex.printError("Unknown kind: `$$Token'"); } -void InsetNewline::write(Buffer const &, ostream & os) const +void InsetNewline::write(ostream & os) const { - os << "\n\\newline\n"; + os << "Newline "; + params_.write(os); +} + + +void InsetNewline::read(Lexer & lex) +{ + params_.read(lex); + lex >> "\\end_inset"; } @@ -47,32 +89,105 @@ void InsetNewline::metrics(MetricsInfo & mi, Dimension & dim) const } -int InsetNewline::latex(Buffer const &, odocstream &, - OutputParams const &) const +void InsetNewline::doDispatch(Cursor & cur, FuncRequest & cmd) { - lyxerr << "Eek, calling InsetNewline::latex !" << endl; - return 0; + switch (cmd.action()) { + + case LFUN_INSET_MODIFY: { + InsetNewlineParams params; + cur.recordUndo(); + string2params(to_utf8(cmd.argument()), params); + params_.kind = params.kind; + break; + } + + default: + Inset::doDispatch(cur, cmd); + break; + } } -int InsetNewline::plaintext(Buffer const &, odocstream & os, - OutputParams const &) const +bool InsetNewline::getStatus(Cursor & cur, FuncRequest const & cmd, + FuncStatus & status) const +{ + switch (cmd.action()) { + // we handle these + case LFUN_INSET_MODIFY: + if (cmd.getArg(0) == "newline") { + InsetNewlineParams params; + string2params(to_utf8(cmd.argument()), params); + status.setOnOff(params_.kind == params.kind); + } + status.setEnabled(true); + return true; + default: + return Inset::getStatus(cur, cmd, status); + } +} + + +ColorCode InsetNewline::ColorName() const +{ + switch (params_.kind) { + case InsetNewlineParams::NEWLINE: + return Color_eolmarker; + break; + case InsetNewlineParams::LINEBREAK: + return Color_pagebreak; + break; + } + // not really useful, but to avoids gcc complaints + return Color_eolmarker; +} + + +void InsetNewline::latex(otexstream & os, OutputParams const & rp) const +{ + switch (params_.kind) { + case InsetNewlineParams::NEWLINE: + if (rp.inTableCell == OutputParams::PLAIN) + os << "\\newline\n"; + else + os << "\\\\\n"; + break; + case InsetNewlineParams::LINEBREAK: + os << "\\linebreak{}\n"; + break; + default: + os << "\\\\\n"; + break; + } +} + + +int InsetNewline::plaintext(odocstringstream & os, + OutputParams const &, size_t) const { os << '\n'; return PLAINTEXT_NEWLINE; } -int InsetNewline::docbook(Buffer const &, odocstream & os, - OutputParams const &) const +int InsetNewline::docbook(odocstream & os, OutputParams const &) const { os << '\n'; return 0; } +docstring InsetNewline::xhtml(XHTMLStream & xs, OutputParams const &) const +{ + xs << html::CR() << html::CompTag("br") << html::CR(); + return docstring(); +} + + void InsetNewline::draw(PainterInfo & pi, int x, int y) const { + FontInfo font; + font.setColor(ColorName()); + frontend::FontMetrics const & fm = theFontMetrics(pi.base.font); int const wid = fm.width('n'); int const asc = fm.maxAscent(); @@ -94,7 +209,7 @@ void InsetNewline::draw(PainterInfo & pi, int x, int y) const xp[2] = int(x + wid * 0.625); } - pi.pain.lines(xp, yp, 3, Color::eolmarker); + pi.pain.lines(xp, yp, 3, ColorName()); yp[0] = int(y - 0.500 * asc * 0.75); yp[1] = int(y - 0.500 * asc * 0.75); @@ -110,13 +225,67 @@ void InsetNewline::draw(PainterInfo & pi, int x, int y) const xp[2] = int(x); } - pi.pain.lines(xp, yp, 3, Color::eolmarker); + pi.pain.lines(xp, yp, 3, ColorName()); + + if (params_.kind == InsetNewlineParams::LINEBREAK) { + + yp[2] = int(y - 0.500 * asc * 0.75); + + if (pi.ltr_pos) { + xp[0] = int(x + 1.3 * wid); + xp[1] = int(x + 2 * wid); + xp[2] = int(x + 2 * wid); + } else { + xp[0] = int(x - 0.3 * wid); + xp[1] = int(x - wid); + xp[2] = int(x - wid); + } + pi.pain.lines(xp, yp, 3, ColorName()); + + yp[0] = int(y - 0.875 * asc * 0.75); + yp[1] = int(y - 0.500 * asc * 0.75); + yp[2] = int(y - 0.125 * asc * 0.75); + + if (pi.ltr_pos) { + xp[0] = int(x + 2 * wid * 0.813); + xp[1] = int(x + 2 * wid); + xp[2] = int(x + 2 * wid * 0.813); + } else { + xp[0] = int(x - wid * 0.625); + xp[1] = int(x - wid); + xp[2] = int(x - wid * 0.625); + } + pi.pain.lines(xp, yp, 3, ColorName()); + } +} + + +string InsetNewline::contextMenuName() const +{ + return "context-newline"; +} + + +void InsetNewline::string2params(string const & in, InsetNewlineParams & params) +{ + params = InsetNewlineParams(); + if (in.empty()) + return; + istringstream data(in); + Lexer lex; + lex.setStream(data); + lex.setContext("InsetNewline::string2params"); + lex >> "newline"; + params.read(lex); } -bool InsetNewline::isSpace() const +string InsetNewline::params2string(InsetNewlineParams const & params) { - return true; + ostringstream data; + data << "newline" << ' '; + params.write(data); + return data.str(); }