X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetNewpage.cpp;h=e062e8bbecf583f1a8610b487c35c81bf64978fb;hb=14dbaa76083a4fdd2bd52aaf67d8da6d60557633;hp=f9c75b1128c82eb64af81e24011fd8f6f052ee2c;hpb=0cb39e6f8b5f48a2da892f0f515e8ccfd7aa5921;p=features.git diff --git a/src/insets/InsetNewpage.cpp b/src/insets/InsetNewpage.cpp index f9c75b1128..e062e8bbec 100644 --- a/src/insets/InsetNewpage.cpp +++ b/src/insets/InsetNewpage.cpp @@ -3,7 +3,8 @@ * This file is part of LyX, the document processor. * Licence details can be found in the file COPYING. * - * \author André Pönitz + * \author André Pönitz + * \author Jürgen Spitzmüller * * Full author contact details are available in file CREDITS. */ @@ -12,9 +13,15 @@ #include "InsetNewpage.h" -#include "Text.h" +#include "Cursor.h" +#include "FuncRequest.h" +#include "FuncStatus.h" +#include "Lexer.h" #include "MetricsInfo.h" #include "OutputParams.h" +#include "output_xhtml.h" +#include "texstream.h" +#include "Text.h" #include "TextMetrics.h" #include "frontends/FontMetrics.h" @@ -30,15 +37,64 @@ using namespace std; namespace lyx { -void InsetNewpage::read( Lexer &) + InsetNewpage::InsetNewpage() : Inset(0) +{} + + +InsetNewpage::InsetNewpage(InsetNewpageParams const & params) + : Inset(0), params_(params) +{} + + +void InsetNewpageParams::write(ostream & os) const +{ + switch (kind) { + case InsetNewpageParams::NEWPAGE: + os << "newpage"; + break; + case InsetNewpageParams::PAGEBREAK: + os << "pagebreak"; + break; + case InsetNewpageParams::CLEARPAGE: + os << "clearpage"; + break; + case InsetNewpageParams::CLEARDOUBLEPAGE: + os << "cleardoublepage"; + break; + } +} + + +void InsetNewpageParams::read(Lexer & lex) { - /* Nothing to read */ + lex.setContext("InsetNewpageParams::read"); + string token; + lex >> token; + + if (token == "newpage") + kind = InsetNewpageParams::NEWPAGE; + else if (token == "pagebreak") + kind = InsetNewpageParams::PAGEBREAK; + else if (token == "clearpage") + kind = InsetNewpageParams::CLEARPAGE; + else if (token == "cleardoublepage") + kind = InsetNewpageParams::CLEARDOUBLEPAGE; + else + lex.printError("Unknown kind"); } void InsetNewpage::write(ostream & os) const { - os << "\n" << getCmdName() << '\n'; + os << "Newpage "; + params_.write(os); +} + + +void InsetNewpage::read(Lexer & lex) +{ + params_.read(lex); + lex >> "\\end_inset"; } @@ -47,8 +103,6 @@ void InsetNewpage::metrics(MetricsInfo & mi, Dimension & dim) const dim.asc = defaultRowHeight(); dim.des = defaultRowHeight(); dim.wid = mi.base.textwidth; - // Cache the inset dimension. - setDimCache(mi, dim); } @@ -80,14 +134,109 @@ void InsetNewpage::draw(PainterInfo & pi, int x, int y) const } -int InsetNewpage::latex(odocstream & os, OutputParams const &) const +void InsetNewpage::doDispatch(Cursor & cur, FuncRequest & cmd) { - os << from_ascii(getCmdName()) << "{}"; - return 0; + switch (cmd.action()) { + + case LFUN_INSET_MODIFY: { + InsetNewpageParams params; + cur.recordUndo(); + string2params(to_utf8(cmd.argument()), params); + params_.kind = params.kind; + break; + } + + default: + Inset::doDispatch(cur, cmd); + break; + } } -int InsetNewpage::plaintext(odocstream & os, OutputParams const &) const +bool InsetNewpage::getStatus(Cursor & cur, FuncRequest const & cmd, + FuncStatus & status) const +{ + 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: + return Inset::getStatus(cur, cmd, status); + } +} + + +docstring InsetNewpage::insetLabel() const +{ + switch (params_.kind) { + case InsetNewpageParams::NEWPAGE: + return _("New Page"); + break; + case InsetNewpageParams::PAGEBREAK: + return _("Page Break"); + break; + case InsetNewpageParams::CLEARPAGE: + return _("Clear Page"); + break; + case InsetNewpageParams::CLEARDOUBLEPAGE: + return _("Clear Double Page"); + break; + default: + return _("New Page"); + break; + } +} + + +ColorCode InsetNewpage::ColorName() const +{ + switch (params_.kind) { + case InsetNewpageParams::PAGEBREAK: + return Color_pagebreak; + break; + case InsetNewpageParams::NEWPAGE: + case InsetNewpageParams::CLEARPAGE: + case InsetNewpageParams::CLEARDOUBLEPAGE: + return Color_newpage; + break; + } + // not really useful, but to avoids gcc complaints + return Color_newpage; +} + + +void InsetNewpage::latex(otexstream & os, OutputParams const & runparams) const +{ + switch (params_.kind) { + case InsetNewpageParams::NEWPAGE: + os << "\\newpage" << termcmd; + break; + case InsetNewpageParams::PAGEBREAK: + if (runparams.moving_arg) + os << "\\protect"; + os << "\\pagebreak" << termcmd; + break; + case InsetNewpageParams::CLEARPAGE: + os << "\\clearpage" << termcmd; + break; + case InsetNewpageParams::CLEARDOUBLEPAGE: + os << "\\cleardoublepage" << termcmd; + break; + default: + os << "\\newpage" << termcmd; + break; + } +} + + +int InsetNewpage::plaintext(odocstringstream & os, + OutputParams const &, size_t) const { os << '\n'; return PLAINTEXT_NEWLINE; @@ -101,4 +250,47 @@ int InsetNewpage::docbook(odocstream & os, OutputParams const &) const } +docstring InsetNewpage::xhtml(XHTMLStream & xs, OutputParams const &) const +{ + xs << html::CompTag("br"); + return docstring(); +} + + +string InsetNewpage::contextMenuName() const +{ + return "context-newpage"; +} + + +void InsetNewpage::string2params(string const & in, InsetNewpageParams & params) +{ + params = InsetNewpageParams(); + if (in.empty()) + return; + + istringstream data(in); + Lexer lex; + lex.setStream(data); + + string name; + lex >> name; + if (!lex || name != "newpage") { + LYXERR0("Expected arg 2 to be \"wrap\" in " << in); + return; + } + + params.read(lex); +} + + +string InsetNewpage::params2string(InsetNewpageParams const & params) +{ + ostringstream data; + data << "newpage" << ' '; + params.write(data); + return data.str(); +} + + } // namespace lyx