2 * \file InsetNewpage.cpp
3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
7 * \author Jürgen Spitzmüller
9 * Full author contact details are available in file CREDITS.
14 #include "InsetNewpage.h"
16 #include "FuncRequest.h"
17 #include "FuncStatus.h"
19 #include "MetricsInfo.h"
20 #include "OutputParams.h"
21 #include "output_xhtml.h"
23 #include "TextMetrics.h"
25 #include "frontends/FontMetrics.h"
26 #include "frontends/Painter.h"
28 #include "support/debug.h"
29 #include "support/docstring.h"
30 #include "support/docstream.h"
31 #include "support/gettext.h"
38 InsetNewpage::InsetNewpage() : Inset(0)
42 InsetNewpage::InsetNewpage(InsetNewpageParams const & params)
43 : Inset(0), params_(params)
47 void InsetNewpageParams::write(ostream & os) const
51 case InsetNewpageParams::NEWPAGE:
54 case InsetNewpageParams::PAGEBREAK:
57 case InsetNewpageParams::CLEARPAGE:
60 case InsetNewpageParams::CLEARDOUBLEPAGE:
61 os << "cleardoublepage";
67 void InsetNewpageParams::read(Lexer & lex)
69 lex.setContext("InsetNewpageParams::read");
73 if (token == "newpage")
74 kind = InsetNewpageParams::NEWPAGE;
75 else if (token == "pagebreak")
76 kind = InsetNewpageParams::PAGEBREAK;
77 else if (token == "clearpage")
78 kind = InsetNewpageParams::CLEARPAGE;
79 else if (token == "cleardoublepage")
80 kind = InsetNewpageParams::CLEARDOUBLEPAGE;
82 lex.printError("Unknown kind");
86 void InsetNewpage::write(ostream & os) const
93 void InsetNewpage::read(Lexer & lex)
100 void InsetNewpage::metrics(MetricsInfo & mi, Dimension & dim) const
102 dim.asc = defaultRowHeight();
103 dim.des = defaultRowHeight();
104 dim.wid = mi.base.textwidth;
105 // Cache the inset dimension.
106 setDimCache(mi, dim);
110 void InsetNewpage::draw(PainterInfo & pi, int x, int y) const
112 using frontend::Painter;
115 font.setColor(ColorName());
118 Dimension const dim = dimension(*pi.base.bv);
123 theFontMetrics(font).rectText(insetLabel(), w, a, d);
125 int const text_start = int(x + (dim.wid - w) / 2);
126 int const text_end = text_start + w;
128 pi.pain.rectText(text_start, y + d, insetLabel(), font,
129 Color_none, Color_none);
131 pi.pain.line(x, y, text_start, y,
132 ColorName(), Painter::line_onoffdash);
133 pi.pain.line(text_end, y, int(x + dim.wid), y,
134 ColorName(), Painter::line_onoffdash);
138 void InsetNewpage::doDispatch(Cursor & cur, FuncRequest & cmd)
140 switch (cmd.action()) {
142 case LFUN_INSET_MODIFY: {
143 InsetNewpageParams params;
144 string2params(to_utf8(cmd.argument()), params);
145 params_.kind = params.kind;
150 Inset::doDispatch(cur, cmd);
156 bool InsetNewpage::getStatus(Cursor & cur, FuncRequest const & cmd,
157 FuncStatus & status) const
159 switch (cmd.action()) {
161 case LFUN_INSET_MODIFY:
162 if (cmd.getArg(0) == "newpage") {
163 InsetNewpageParams params;
164 string2params(to_utf8(cmd.argument()), params);
165 status.setOnOff(params_.kind == params.kind);
167 status.setEnabled(true);
170 return Inset::getStatus(cur, cmd, status);
175 docstring InsetNewpage::insetLabel() const
177 switch (params_.kind) {
178 case InsetNewpageParams::NEWPAGE:
179 return _("New Page");
181 case InsetNewpageParams::PAGEBREAK:
182 return _("Page Break");
184 case InsetNewpageParams::CLEARPAGE:
185 return _("Clear Page");
187 case InsetNewpageParams::CLEARDOUBLEPAGE:
188 return _("Clear Double Page");
191 return _("New Page");
197 ColorCode InsetNewpage::ColorName() const
199 switch (params_.kind) {
200 case InsetNewpageParams::PAGEBREAK:
201 return Color_pagebreak;
203 case InsetNewpageParams::NEWPAGE:
204 case InsetNewpageParams::CLEARPAGE:
205 case InsetNewpageParams::CLEARDOUBLEPAGE:
206 return Color_newpage;
209 // not really useful, but to avoids gcc complaints
210 return Color_newpage;
214 int InsetNewpage::latex(odocstream & os, OutputParams const &) const
216 switch (params_.kind) {
217 case InsetNewpageParams::NEWPAGE:
220 case InsetNewpageParams::PAGEBREAK:
221 os << "\\pagebreak{}";
223 case InsetNewpageParams::CLEARPAGE:
224 os << "\\clearpage{}";
226 case InsetNewpageParams::CLEARDOUBLEPAGE:
227 os << "\\cleardoublepage{}";
237 int InsetNewpage::plaintext(odocstream & os, OutputParams const &) const
240 return PLAINTEXT_NEWLINE;
244 int InsetNewpage::docbook(odocstream & os, OutputParams const &) const
251 docstring InsetNewpage::xhtml(XHTMLStream & xs, OutputParams const &) const
253 xs << html::CompTag("br");
258 docstring InsetNewpage::contextMenu(BufferView const &, int, int) const
260 return from_ascii("context-newpage");
264 void InsetNewpage::string2params(string const & in, InsetNewpageParams & params)
266 params = InsetNewpageParams();
270 istringstream data(in);
276 if (!lex || name != "newpage") {
277 LYXERR0("Expected arg 2 to be \"wrap\" in " << in);
285 string InsetNewpage::params2string(InsetNewpageParams const & params)
288 data << "newpage" << ' ';