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"
22 #include "texstream.h"
24 #include "TextMetrics.h"
26 #include "frontends/FontMetrics.h"
27 #include "frontends/Painter.h"
29 #include "support/debug.h"
30 #include "support/docstring.h"
31 #include "support/docstream.h"
32 #include "support/gettext.h"
39 InsetNewpage::InsetNewpage() : Inset(nullptr)
43 InsetNewpage::InsetNewpage(InsetNewpageParams const & params)
44 : Inset(nullptr), params_(params)
48 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";
63 case InsetNewpageParams::NOPAGEBREAK:
70 void InsetNewpageParams::read(Lexer & lex)
72 lex.setContext("InsetNewpageParams::read");
76 if (token == "newpage")
77 kind = InsetNewpageParams::NEWPAGE;
78 else if (token == "pagebreak")
79 kind = InsetNewpageParams::PAGEBREAK;
80 else if (token == "clearpage")
81 kind = InsetNewpageParams::CLEARPAGE;
82 else if (token == "cleardoublepage")
83 kind = InsetNewpageParams::CLEARDOUBLEPAGE;
84 else if (token == "nopagebreak")
85 kind = InsetNewpageParams::NOPAGEBREAK;
87 lex.printError("Unknown kind");
91 void InsetNewpage::write(ostream & os) const
98 void InsetNewpage::read(Lexer & lex)
101 lex >> "\\end_inset";
105 void InsetNewpage::metrics(MetricsInfo & mi, Dimension & dim) const
107 if (params_.kind == InsetNewpageParams::NOPAGEBREAK) {
108 frontend::FontMetrics const & fm = theFontMetrics(mi.base.font);
109 dim.asc = fm.maxAscent();
110 dim.des = fm.maxDescent();
111 dim.wid = 3 * fm.width('n');
115 dim.asc = defaultRowHeight();
116 dim.des = defaultRowHeight();
117 dim.wid = mi.base.textwidth;
121 void InsetNewpage::draw(PainterInfo & pi, int x, int y) const
123 if (params_.kind == InsetNewpageParams::NOPAGEBREAK) {
126 font.setColor(ColorName());
128 frontend::FontMetrics const & fm = theFontMetrics(pi.base.font);
129 int const wid = 3 * fm.width('n');
130 int const asc = fm.maxAscent();
136 yp[0] = int(y - 0.875 * asc * 0.75);
137 yp[1] = int(y - 0.500 * asc * 0.75);
138 yp[2] = int(y - 0.125 * asc * 0.75);
139 xp[0] = int(x + wid * 0.25);
140 xp[1] = int(x + wid * 0.4);
141 xp[2] = int(x + wid * 0.25);
142 pi.pain.lines(xp, yp, 3, ColorName());
144 yp[0] = yp[1] = int(y - 0.500 * asc * 0.75);
145 xp[0] = int(x + wid * 0.03);
146 xp[1] = int(x + wid * 0.4);
147 pi.pain.lines(xp, yp, 2, ColorName());
150 yp[0] = int(y - 0.875 * asc * 0.75);
151 yp[1] = int(y - 0.500 * asc * 0.75);
152 yp[2] = int(y - 0.125 * asc * 0.75);
153 xp[0] = int(x + wid * 0.75);
154 xp[1] = int(x + wid * 0.6);
155 xp[2] = int(x + wid * 0.75);
156 pi.pain.lines(xp, yp, 3, ColorName());
158 yp[0] = yp[1] = int(y - 0.500 * asc * 0.75);
159 xp[0] = int(x + wid * 0.97);
160 xp[1] = int(x + wid * 0.6);
161 pi.pain.lines(xp, yp, 2, ColorName());
164 xp[0] = xp[1] = int(x + wid * 0.5);
165 yp[0] = int(y - 0.875 * asc * 0.75);
166 yp[1] = int(y - 0.125 * asc * 0.75);
167 pi.pain.lines(xp, yp, 2, ColorName());
171 using frontend::Painter;
174 font.setColor(ColorName());
177 Dimension const dim = dimension(*pi.base.bv);
182 theFontMetrics(font).rectText(insetLabel(), w, a, d);
184 int const text_start = int(x + (dim.wid - w) / 2);
185 int const text_end = text_start + w;
187 pi.pain.rectText(text_start, y + d, insetLabel(), font,
188 Color_none, Color_none);
190 pi.pain.line(x, y, text_start, y,
191 ColorName(), Painter::line_onoffdash);
192 pi.pain.line(text_end, y, int(x + dim.wid), y,
193 ColorName(), Painter::line_onoffdash);
197 void InsetNewpage::doDispatch(Cursor & cur, FuncRequest & cmd)
199 switch (cmd.action()) {
201 case LFUN_INSET_MODIFY: {
202 InsetNewpageParams params;
204 string2params(to_utf8(cmd.argument()), params);
205 params_.kind = params.kind;
210 Inset::doDispatch(cur, cmd);
216 bool InsetNewpage::getStatus(Cursor & cur, FuncRequest const & cmd,
217 FuncStatus & status) const
219 switch (cmd.action()) {
221 case LFUN_INSET_MODIFY:
222 if (cmd.getArg(0) == "newpage") {
223 InsetNewpageParams params;
224 string2params(to_utf8(cmd.argument()), params);
225 status.setOnOff(params_.kind == params.kind);
227 status.setEnabled(true);
230 return Inset::getStatus(cur, cmd, status);
235 docstring InsetNewpage::insetLabel() const
237 switch (params_.kind) {
238 case InsetNewpageParams::NEWPAGE:
239 return _("New Page");
240 case InsetNewpageParams::PAGEBREAK:
241 return _("Page Break");
242 case InsetNewpageParams::CLEARPAGE:
243 return _("Clear Page");
244 case InsetNewpageParams::CLEARDOUBLEPAGE:
245 return _("Clear Double Page");
246 case InsetNewpageParams::NOPAGEBREAK:
247 return _("No Page Break");
249 return _("New Page");
254 ColorCode InsetNewpage::ColorName() const
256 switch (params_.kind) {
257 case InsetNewpageParams::PAGEBREAK:
258 case InsetNewpageParams::NOPAGEBREAK:
259 return Color_pagebreak;
260 case InsetNewpageParams::NEWPAGE:
261 case InsetNewpageParams::CLEARPAGE:
262 case InsetNewpageParams::CLEARDOUBLEPAGE:
263 return Color_newpage;
265 // not really useful, but to avoids gcc complaints
266 return Color_newpage;
270 void InsetNewpage::latex(otexstream & os, OutputParams const & runparams) const
272 if (runparams.inDeletedInset) {
273 os << "\\mbox{}\\\\\\makebox[\\columnwidth]{\\dotfill\\ "
274 << insetLabel() << "\\ \\dotfill}";
276 switch (params_.kind) {
277 case InsetNewpageParams::NEWPAGE:
278 os << "\\newpage" << termcmd;
280 case InsetNewpageParams::PAGEBREAK:
281 if (runparams.moving_arg)
283 os << "\\pagebreak" << termcmd;
285 case InsetNewpageParams::CLEARPAGE:
286 os << "\\clearpage" << termcmd;
288 case InsetNewpageParams::CLEARDOUBLEPAGE:
289 os << "\\cleardoublepage" << termcmd;
291 case InsetNewpageParams::NOPAGEBREAK:
292 os << "\\nopagebreak" << termcmd;
295 os << "\\newpage" << termcmd;
302 int InsetNewpage::plaintext(odocstringstream & os,
303 OutputParams const &, size_t) const
305 if (params_.kind == InsetNewpageParams::NOPAGEBREAK)
308 return PLAINTEXT_NEWLINE;
312 void InsetNewpage::docbook(XMLStream & os, OutputParams const &) const
314 if (params_.kind != InsetNewpageParams::NOPAGEBREAK)
319 docstring InsetNewpage::xhtml(XMLStream & xs, OutputParams const &) const
321 if (params_.kind != InsetNewpageParams::NOPAGEBREAK)
322 xs << xml::CompTag("br");
327 string InsetNewpage::contextMenuName() const
329 return "context-newpage";
333 void InsetNewpage::string2params(string const & in, InsetNewpageParams & params)
335 params = InsetNewpageParams();
339 istringstream data(in);
345 if (!lex || name != "newpage") {
346 LYXERR0("Expected arg 2 to be \"wrap\" in " << in);
354 string InsetNewpage::params2string(InsetNewpageParams const & params)
357 data << "newpage" << ' ';