X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetNewpage.cpp;h=7acd3a01a018af28c29ddb7a18cfb1a64414fda2;hb=8793c2eed949cd925a933724ead36326d8cc549c;hp=46ad3bdbd5ba8ac634e7b443fe2f90a863c147de;hpb=4c7a5d00245799695ea81aa0192151eed8f9c5fb;p=lyx.git diff --git a/src/insets/InsetNewpage.cpp b/src/insets/InsetNewpage.cpp index 46ad3bdbd5..7acd3a01a0 100644 --- a/src/insets/InsetNewpage.cpp +++ b/src/insets/InsetNewpage.cpp @@ -13,12 +13,14 @@ #include "InsetNewpage.h" +#include "Cursor.h" #include "FuncRequest.h" #include "FuncStatus.h" #include "Lexer.h" #include "MetricsInfo.h" #include "OutputParams.h" -#include "output_xhtml.h" +#include "xml.h" +#include "texstream.h" #include "Text.h" #include "TextMetrics.h" @@ -35,18 +37,17 @@ using namespace std; namespace lyx { - InsetNewpage::InsetNewpage() : Inset(0) + InsetNewpage::InsetNewpage() : Inset(nullptr) {} InsetNewpage::InsetNewpage(InsetNewpageParams const & params) - : Inset(0), params_(params) + : Inset(nullptr), params_(params) {} void InsetNewpageParams::write(ostream & os) const { - string command; switch (kind) { case InsetNewpageParams::NEWPAGE: os << "newpage"; @@ -60,6 +61,9 @@ void InsetNewpageParams::write(ostream & os) const case InsetNewpageParams::CLEARDOUBLEPAGE: os << "cleardoublepage"; break; + case InsetNewpageParams::NOPAGEBREAK: + os << "nopagebreak"; + break; } } @@ -78,6 +82,8 @@ void InsetNewpageParams::read(Lexer & lex) kind = InsetNewpageParams::CLEARPAGE; else if (token == "cleardoublepage") kind = InsetNewpageParams::CLEARDOUBLEPAGE; + else if (token == "nopagebreak") + kind = InsetNewpageParams::NOPAGEBREAK; else lex.printError("Unknown kind"); } @@ -99,16 +105,70 @@ void InsetNewpage::read(Lexer & lex) void InsetNewpage::metrics(MetricsInfo & mi, Dimension & dim) const { + if (params_.kind == InsetNewpageParams::NOPAGEBREAK) { + frontend::FontMetrics const & fm = theFontMetrics(mi.base.font); + dim.asc = fm.maxAscent(); + dim.des = fm.maxDescent(); + dim.wid = 3 * fm.width('n'); + return; + } + dim.asc = defaultRowHeight(); dim.des = defaultRowHeight(); dim.wid = mi.base.textwidth; - // Cache the inset dimension. - setDimCache(mi, dim); } void InsetNewpage::draw(PainterInfo & pi, int x, int y) const { + if (params_.kind == InsetNewpageParams::NOPAGEBREAK) { + + FontInfo font; + font.setColor(ColorName()); + + frontend::FontMetrics const & fm = theFontMetrics(pi.base.font); + int const wid = 3 * fm.width('n'); + int const asc = fm.maxAscent(); + + int xp[3]; + int yp[3]; + + //left side arrow + 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); + xp[0] = int(x + wid * 0.25); + xp[1] = int(x + wid * 0.4); + xp[2] = int(x + wid * 0.25); + pi.pain.lines(xp, yp, 3, ColorName()); + + yp[0] = yp[1] = int(y - 0.500 * asc * 0.75); + xp[0] = int(x + wid * 0.03); + xp[1] = int(x + wid * 0.4); + pi.pain.lines(xp, yp, 2, ColorName()); + + //right side arrow + 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); + xp[0] = int(x + wid * 0.75); + xp[1] = int(x + wid * 0.6); + xp[2] = int(x + wid * 0.75); + pi.pain.lines(xp, yp, 3, ColorName()); + + yp[0] = yp[1] = int(y - 0.500 * asc * 0.75); + xp[0] = int(x + wid * 0.97); + xp[1] = int(x + wid * 0.6); + pi.pain.lines(xp, yp, 2, ColorName()); + + //mid-rule + xp[0] = xp[1] = int(x + wid * 0.5); + yp[0] = int(y - 0.875 * asc * 0.75); + yp[1] = int(y - 0.125 * asc * 0.75); + pi.pain.lines(xp, yp, 2, ColorName()); + return; + } + using frontend::Painter; FontInfo font; @@ -137,10 +197,11 @@ void InsetNewpage::draw(PainterInfo & pi, int x, int y) const void InsetNewpage::doDispatch(Cursor & cur, FuncRequest & cmd) { - switch (cmd.action_) { + switch (cmd.action()) { case LFUN_INSET_MODIFY: { InsetNewpageParams params; + cur.recordUndo(); string2params(to_utf8(cmd.argument()), params); params_.kind = params.kind; break; @@ -156,14 +217,14 @@ void InsetNewpage::doDispatch(Cursor & cur, FuncRequest & cmd) bool InsetNewpage::getStatus(Cursor & cur, FuncRequest const & cmd, FuncStatus & status) const { - switch (cmd.action_) { + switch (cmd.action()) { // we handle these case LFUN_INSET_MODIFY: if (cmd.getArg(0) == "newpage") { InsetNewpageParams params; string2params(to_utf8(cmd.argument()), params); status.setOnOff(params_.kind == params.kind); - } + } status.setEnabled(true); return true; default: @@ -187,6 +248,9 @@ docstring InsetNewpage::insetLabel() const case InsetNewpageParams::CLEARDOUBLEPAGE: return _("Clear Double Page"); break; + case InsetNewpageParams::NOPAGEBREAK: + return _("No Page Break"); + break; default: return _("New Page"); break; @@ -198,6 +262,7 @@ ColorCode InsetNewpage::ColorName() const { switch (params_.kind) { case InsetNewpageParams::PAGEBREAK: + case InsetNewpageParams::NOPAGEBREAK: return Color_pagebreak; break; case InsetNewpageParams::NEWPAGE: @@ -211,53 +276,66 @@ ColorCode InsetNewpage::ColorName() const } -int InsetNewpage::latex(odocstream & os, OutputParams const &) const +void InsetNewpage::latex(otexstream & os, OutputParams const & runparams) const { - switch (params_.kind) { + if (runparams.inDeletedInset) { + os << "\\mbox{}\\\\\\makebox[\\columnwidth]{\\dotfill\\ " + << insetLabel() << "\\ \\dotfill}"; + } else { + switch (params_.kind) { case InsetNewpageParams::NEWPAGE: - os << "\\newpage{}"; + os << "\\newpage" << termcmd; break; case InsetNewpageParams::PAGEBREAK: - os << "\\pagebreak{}"; + if (runparams.moving_arg) + os << "\\protect"; + os << "\\pagebreak" << termcmd; break; case InsetNewpageParams::CLEARPAGE: - os << "\\clearpage{}"; + os << "\\clearpage" << termcmd; break; case InsetNewpageParams::CLEARDOUBLEPAGE: - os << "\\cleardoublepage{}"; + os << "\\cleardoublepage" << termcmd; + break; + case InsetNewpageParams::NOPAGEBREAK: + os << "\\nopagebreak" << termcmd; break; default: - os << "\\newpage{}"; + os << "\\newpage" << termcmd; break; + } } - return 0; } -int InsetNewpage::plaintext(odocstream & os, OutputParams const &) const +int InsetNewpage::plaintext(odocstringstream & os, + OutputParams const &, size_t) const { + if (params_.kind == InsetNewpageParams::NOPAGEBREAK) + return 0; os << '\n'; return PLAINTEXT_NEWLINE; } -int InsetNewpage::docbook(odocstream & os, OutputParams const &) const +void InsetNewpage::docbook(XMLStream & os, OutputParams const &) const { - os << '\n'; - return 0; + if (params_.kind != InsetNewpageParams::NOPAGEBREAK) + os << xml::CR(); } -docstring InsetNewpage::xhtml(XHTMLStream & xs, OutputParams const &) const +docstring InsetNewpage::xhtml(XMLStream & xs, OutputParams const &) const { - xs << html::CompTag("br"); + if (params_.kind != InsetNewpageParams::NOPAGEBREAK) + xs << xml::CompTag("br"); return docstring(); } -docstring InsetNewpage::contextMenu(BufferView const &, int, int) const +string InsetNewpage::contextMenuName() const { - return from_ascii("context-newpage"); + return "context-newpage"; }