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"
19 #include "MetricsInfo.h"
21 #include "texstream.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"
32 #include "support/Lexer.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");
241 case InsetNewpageParams::PAGEBREAK:
242 return _("Page Break");
243 case InsetNewpageParams::CLEARPAGE:
244 return _("Clear Page");
245 case InsetNewpageParams::CLEARDOUBLEPAGE:
246 return _("Clear Double Page");
247 case InsetNewpageParams::NOPAGEBREAK:
248 return _("No Page Break");
250 return _("New Page");
255 ColorCode InsetNewpage::ColorName() const
257 switch (params_.kind) {
258 case InsetNewpageParams::PAGEBREAK:
259 case InsetNewpageParams::NOPAGEBREAK:
260 return Color_pagebreak;
261 case InsetNewpageParams::NEWPAGE:
262 case InsetNewpageParams::CLEARPAGE:
263 case InsetNewpageParams::CLEARDOUBLEPAGE:
264 return Color_newpage;
266 // not really useful, but to avoids gcc complaints
267 return Color_newpage;
271 void InsetNewpage::latex(otexstream & os, OutputParams const & runparams) const
273 if (runparams.inDeletedInset) {
274 os << "\\mbox{}\\\\\\makebox[\\columnwidth]{\\dotfill\\ "
275 << insetLabel() << "\\ \\dotfill}";
277 switch (params_.kind) {
278 case InsetNewpageParams::NEWPAGE:
279 os << "\\newpage" << termcmd;
281 case InsetNewpageParams::PAGEBREAK:
282 if (runparams.moving_arg)
284 os << "\\pagebreak" << termcmd;
286 case InsetNewpageParams::CLEARPAGE:
287 os << "\\clearpage" << termcmd;
289 case InsetNewpageParams::CLEARDOUBLEPAGE:
290 os << "\\cleardoublepage" << termcmd;
292 case InsetNewpageParams::NOPAGEBREAK:
293 os << "\\nopagebreak" << termcmd;
296 os << "\\newpage" << termcmd;
303 int InsetNewpage::plaintext(odocstringstream & os,
304 OutputParams const &, size_t) const
306 if (params_.kind == InsetNewpageParams::NOPAGEBREAK)
309 return PLAINTEXT_NEWLINE;
313 void InsetNewpage::docbook(XMLStream & os, OutputParams const &) const
315 if (params_.kind != InsetNewpageParams::NOPAGEBREAK)
320 docstring InsetNewpage::xhtml(XMLStream & xs, OutputParams const &) const
322 if (params_.kind != InsetNewpageParams::NOPAGEBREAK)
323 xs << xml::CompTag("br");
328 string InsetNewpage::contextMenuName() const
330 return "context-newpage";
334 void InsetNewpage::string2params(string const & in, InsetNewpageParams & params)
336 params = InsetNewpageParams();
340 istringstream data(in);
346 if (!lex || name != "newpage") {
347 LYXERR0("Expected arg 2 to be \"wrap\" in " << in);
355 string InsetNewpage::params2string(InsetNewpageParams const & params)
358 data << "newpage" << ' ';