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"
17 #include "FuncRequest.h"
18 #include "FuncStatus.h"
20 #include "MetricsInfo.h"
21 #include "OutputParams.h"
23 #include "texstream.h"
25 #include "TextMetrics.h"
27 #include "frontends/FontMetrics.h"
28 #include "frontends/Painter.h"
30 #include "support/debug.h"
31 #include "support/docstring.h"
32 #include "support/docstream.h"
33 #include "support/gettext.h"
40 InsetNewpage::InsetNewpage() : Inset(nullptr)
44 InsetNewpage::InsetNewpage(InsetNewpageParams const & params)
45 : Inset(nullptr), params_(params)
49 void InsetNewpageParams::write(ostream & os) const
52 case InsetNewpageParams::NEWPAGE:
55 case InsetNewpageParams::PAGEBREAK:
58 case InsetNewpageParams::CLEARPAGE:
61 case InsetNewpageParams::CLEARDOUBLEPAGE:
62 os << "cleardoublepage";
64 case InsetNewpageParams::NOPAGEBREAK:
71 void InsetNewpageParams::read(Lexer & lex)
73 lex.setContext("InsetNewpageParams::read");
77 if (token == "newpage")
78 kind = InsetNewpageParams::NEWPAGE;
79 else if (token == "pagebreak")
80 kind = InsetNewpageParams::PAGEBREAK;
81 else if (token == "clearpage")
82 kind = InsetNewpageParams::CLEARPAGE;
83 else if (token == "cleardoublepage")
84 kind = InsetNewpageParams::CLEARDOUBLEPAGE;
85 else if (token == "nopagebreak")
86 kind = InsetNewpageParams::NOPAGEBREAK;
88 lex.printError("Unknown kind");
92 void InsetNewpage::write(ostream & os) const
99 void InsetNewpage::read(Lexer & lex)
102 lex >> "\\end_inset";
106 void InsetNewpage::metrics(MetricsInfo & mi, Dimension & dim) const
108 if (params_.kind == InsetNewpageParams::NOPAGEBREAK) {
109 frontend::FontMetrics const & fm = theFontMetrics(mi.base.font);
110 dim.asc = fm.maxAscent();
111 dim.des = fm.maxDescent();
112 dim.wid = 3 * fm.width('n');
116 dim.asc = defaultRowHeight();
117 dim.des = defaultRowHeight();
118 dim.wid = mi.base.textwidth;
122 void InsetNewpage::draw(PainterInfo & pi, int x, int y) const
124 if (params_.kind == InsetNewpageParams::NOPAGEBREAK) {
127 font.setColor(ColorName());
129 frontend::FontMetrics const & fm = theFontMetrics(pi.base.font);
130 int const wid = 3 * fm.width('n');
131 int const asc = fm.maxAscent();
137 yp[0] = int(y - 0.875 * asc * 0.75);
138 yp[1] = int(y - 0.500 * asc * 0.75);
139 yp[2] = int(y - 0.125 * asc * 0.75);
140 xp[0] = int(x + wid * 0.25);
141 xp[1] = int(x + wid * 0.4);
142 xp[2] = int(x + wid * 0.25);
143 pi.pain.lines(xp, yp, 3, ColorName());
145 yp[0] = yp[1] = int(y - 0.500 * asc * 0.75);
146 xp[0] = int(x + wid * 0.03);
147 xp[1] = int(x + wid * 0.4);
148 pi.pain.lines(xp, yp, 2, ColorName());
151 yp[0] = int(y - 0.875 * asc * 0.75);
152 yp[1] = int(y - 0.500 * asc * 0.75);
153 yp[2] = int(y - 0.125 * asc * 0.75);
154 xp[0] = int(x + wid * 0.75);
155 xp[1] = int(x + wid * 0.6);
156 xp[2] = int(x + wid * 0.75);
157 pi.pain.lines(xp, yp, 3, ColorName());
159 yp[0] = yp[1] = int(y - 0.500 * asc * 0.75);
160 xp[0] = int(x + wid * 0.97);
161 xp[1] = int(x + wid * 0.6);
162 pi.pain.lines(xp, yp, 2, ColorName());
165 xp[0] = xp[1] = int(x + wid * 0.5);
166 yp[0] = int(y - 0.875 * asc * 0.75);
167 yp[1] = int(y - 0.125 * asc * 0.75);
168 pi.pain.lines(xp, yp, 2, ColorName());
172 using frontend::Painter;
175 font.setColor(ColorName());
178 Dimension const dim = dimension(*pi.base.bv);
183 theFontMetrics(font).rectText(insetLabel(), w, a, d);
185 int const text_start = int(x + (dim.wid - w) / 2);
186 int const text_end = text_start + w;
188 pi.pain.rectText(text_start, y + d, insetLabel(), font,
189 Color_none, Color_none);
191 pi.pain.line(x, y, text_start, y,
192 ColorName(), Painter::line_onoffdash);
193 pi.pain.line(text_end, y, int(x + dim.wid), y,
194 ColorName(), Painter::line_onoffdash);
198 void InsetNewpage::doDispatch(Cursor & cur, FuncRequest & cmd)
200 switch (cmd.action()) {
202 case LFUN_INSET_MODIFY: {
203 InsetNewpageParams params;
205 string2params(to_utf8(cmd.argument()), params);
206 params_.kind = params.kind;
211 Inset::doDispatch(cur, cmd);
217 bool InsetNewpage::getStatus(Cursor & cur, FuncRequest const & cmd,
218 FuncStatus & status) const
220 switch (cmd.action()) {
222 case LFUN_INSET_MODIFY:
223 if (cmd.getArg(0) == "newpage") {
224 InsetNewpageParams params;
225 string2params(to_utf8(cmd.argument()), params);
226 status.setOnOff(params_.kind == params.kind);
228 status.setEnabled(true);
231 return Inset::getStatus(cur, cmd, status);
236 docstring InsetNewpage::insetLabel() const
238 switch (params_.kind) {
239 case InsetNewpageParams::NEWPAGE:
240 return _("New Page");
242 case InsetNewpageParams::PAGEBREAK:
243 return _("Page Break");
245 case InsetNewpageParams::CLEARPAGE:
246 return _("Clear Page");
248 case InsetNewpageParams::CLEARDOUBLEPAGE:
249 return _("Clear Double Page");
251 case InsetNewpageParams::NOPAGEBREAK:
252 return _("No Page Break");
255 return _("New Page");
261 ColorCode InsetNewpage::ColorName() const
263 switch (params_.kind) {
264 case InsetNewpageParams::PAGEBREAK:
265 case InsetNewpageParams::NOPAGEBREAK:
266 return Color_pagebreak;
268 case InsetNewpageParams::NEWPAGE:
269 case InsetNewpageParams::CLEARPAGE:
270 case InsetNewpageParams::CLEARDOUBLEPAGE:
271 return Color_newpage;
274 // not really useful, but to avoids gcc complaints
275 return Color_newpage;
279 void InsetNewpage::latex(otexstream & os, OutputParams const & runparams) const
281 if (runparams.inDeletedInset) {
282 os << "\\mbox{}\\\\\\makebox[\\columnwidth]{\\dotfill\\ "
283 << insetLabel() << "\\ \\dotfill}";
285 switch (params_.kind) {
286 case InsetNewpageParams::NEWPAGE:
287 os << "\\newpage" << termcmd;
289 case InsetNewpageParams::PAGEBREAK:
290 if (runparams.moving_arg)
292 os << "\\pagebreak" << termcmd;
294 case InsetNewpageParams::CLEARPAGE:
295 os << "\\clearpage" << termcmd;
297 case InsetNewpageParams::CLEARDOUBLEPAGE:
298 os << "\\cleardoublepage" << termcmd;
300 case InsetNewpageParams::NOPAGEBREAK:
301 os << "\\nopagebreak" << termcmd;
304 os << "\\newpage" << termcmd;
311 int InsetNewpage::plaintext(odocstringstream & os,
312 OutputParams const &, size_t) const
314 if (params_.kind == InsetNewpageParams::NOPAGEBREAK)
317 return PLAINTEXT_NEWLINE;
321 void InsetNewpage::docbook(XMLStream & os, OutputParams const &) const
323 if (params_.kind != InsetNewpageParams::NOPAGEBREAK)
328 docstring InsetNewpage::xhtml(XMLStream & xs, OutputParams const &) const
330 if (params_.kind != InsetNewpageParams::NOPAGEBREAK)
331 xs << xml::CompTag("br");
336 string InsetNewpage::contextMenuName() const
338 return "context-newpage";
342 void InsetNewpage::string2params(string const & in, InsetNewpageParams & params)
344 params = InsetNewpageParams();
348 istringstream data(in);
354 if (!lex || name != "newpage") {
355 LYXERR0("Expected arg 2 to be \"wrap\" in " << in);
363 string InsetNewpage::params2string(InsetNewpageParams const & params)
366 data << "newpage" << ' ';