X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetNewpage.cpp;h=85e8d14dd394d02539d1963015f389613f141ddf;hb=9914f21bceef9610bd1822f96eff0aa6d1a8df7c;hp=1afdf5c2b6b6c62e6d583a607493adf850a028b7;hpb=9d0ea8aeff32833a90b3fe64df0c5518a9e241be;p=lyx.git diff --git a/src/insets/InsetNewpage.cpp b/src/insets/InsetNewpage.cpp index 1afdf5c2b6..85e8d14dd3 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,31 +13,88 @@ #include "InsetNewpage.h" -#include "support/debug.h" -#include "support/gettext.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 "Text.h" #include "TextMetrics.h" #include "frontends/FontMetrics.h" #include "frontends/Painter.h" +#include "support/debug.h" #include "support/docstring.h" #include "support/docstream.h" +#include "support/gettext.h" + +using namespace std; namespace lyx { -void InsetNewpage::read(Buffer const &, Lexer &) + InsetNewpage::InsetNewpage() : Inset(0) +{} + + +InsetNewpage::InsetNewpage(InsetNewpageParams const & params) + : Inset(0), params_(params) +{} + + +void InsetNewpageParams::write(ostream & os) const { - /* Nothing to read */ + string command; + 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 InsetNewpage::write(Buffer const &, std::ostream & os) const +void InsetNewpageParams::read(Lexer & lex) { - os << "\n" << getCmdName() << '\n'; + 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 << "Newpage "; + params_.write(os); +} + + +void InsetNewpage::read(Lexer & lex) +{ + params_.read(lex); + lex >> "\\end_inset"; } @@ -78,28 +136,160 @@ void InsetNewpage::draw(PainterInfo & pi, int x, int y) const } -int InsetNewpage::latex(Buffer const &, 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; + } +} + + +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; } -int InsetNewpage::plaintext(Buffer const &, odocstream & os, - OutputParams const &) const +void InsetNewpage::latex(otexstream & os, OutputParams const &) const +{ + switch (params_.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; + default: + os << "\\newpage{}"; + break; + } +} + + +int InsetNewpage::plaintext(odocstream & os, OutputParams const &) const { os << '\n'; return PLAINTEXT_NEWLINE; } -int InsetNewpage::docbook(Buffer const &, odocstream & os, - OutputParams const &) const +int InsetNewpage::docbook(odocstream & os, OutputParams const &) const { os << '\n'; return 0; } +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