* Licence details can be found in the file COPYING.
*
* \author various
- * \author André Pönitz
+ * \author André Pönitz
*
* Full author contact details are available in file CREDITS.
*/
#include "InsetVSpace.h"
#include "Buffer.h"
+#include "BufferView.h"
#include "Cursor.h"
#include "Dimension.h"
#include "DispatchResult.h"
#include "FuncRequest.h"
-#include "support/gettext.h"
+#include "FuncStatus.h"
#include "Lexer.h"
-#include "Text.h"
#include "MetricsInfo.h"
-#include "OutputParams.h"
+#include "xml.h"
+#include "texstream.h"
+#include "Text.h"
+
+#include "support/debug.h"
+#include "support/docstream.h"
+#include "support/gettext.h"
+#include "support/lassert.h"
+#include "frontends/Application.h"
#include "frontends/FontMetrics.h"
#include "frontends/Painter.h"
int const ADD_TO_VSPACE_WIDTH = 5;
-} // namespace anon
+} // namespace
InsetVSpace::InsetVSpace(VSpace const & space)
- : space_(space)
+ : Inset(nullptr), space_(space)
{}
-InsetVSpace::~InsetVSpace()
-{
- InsetVSpaceMailer(*this).hideDialog();
-}
-
-
-Inset * InsetVSpace::clone() const
-{
- return new InsetVSpace(*this);
-}
-
-
void InsetVSpace::doDispatch(Cursor & cur, FuncRequest & cmd)
{
- switch (cmd.action) {
+ switch (cmd.action()) {
case LFUN_INSET_MODIFY: {
- InsetVSpaceMailer::string2params(to_utf8(cmd.argument()), space_);
+ cur.recordUndo();
+ string arg = to_utf8(cmd.argument());
+ if (arg == "vspace custom")
+ arg = (space_.kind() == VSpace::LENGTH)
+ ? "vspace " + space_.length().asString()
+ : "vspace 1" + string(stringFromUnit(Length::defaultUnit()));
+ InsetVSpace::string2params(arg, space_);
break;
}
- case LFUN_MOUSE_RELEASE:
- if (!cur.selection())
- InsetVSpaceMailer(*this).showDialog(&cur.bv());
- break;
-
default:
Inset::doDispatch(cur, cmd);
break;
}
+bool InsetVSpace::getStatus(Cursor & cur, FuncRequest const & cmd,
+ FuncStatus & status) const
+{
+ switch (cmd.action()) {
+ // we handle these
+ case LFUN_INSET_MODIFY:
+ if (cmd.getArg(0) == "vspace") {
+ VSpace vspace;
+ string arg = to_utf8(cmd.argument());
+ if (arg == "vspace custom")
+ arg = (space_.kind() == VSpace::LENGTH)
+ ? "vspace " + space_.length().asString()
+ : "vspace 1" + string(stringFromUnit(Length::defaultUnit()));
+ InsetVSpace::string2params(arg, vspace);
+ status.setOnOff(vspace == space_);
+ }
+ status.setEnabled(true);
+ return true;
+
+ default:
+ return Inset::getStatus(cur, cmd, status);
+ }
+}
+
+
void InsetVSpace::read(Lexer & lex)
{
- BOOST_ASSERT(lex.isOK());
+ LASSERT(lex.isOK(), return);
string vsp;
lex >> vsp;
if (lex)
space_ = VSpace(vsp);
-
- string end_token;
- lex >> end_token;
- if (end_token != "\\end_inset")
- lex.printError("Missing \\end_inset at this point. "
- "Read: `$$Token'");
+ lex >> "\\end_inset";
}
namespace {
-int const arrow_size = 4;
+int const vspace_arrow_size = 4;
}
void InsetVSpace::metrics(MetricsInfo & mi, Dimension & dim) const
{
- int height = 3 * arrow_size;
+ int height = 3 * vspace_arrow_size;
if (space_.length().len().value() >= 0.0)
height = max(height, space_.inPixels(*mi.base.bv));
dim.asc = height / 2 + (a - d) / 2; // align cursor with the
dim.des = height - dim.asc; // label text
- dim.wid = ADD_TO_VSPACE_WIDTH + 2 * arrow_size + 5 + w;
- // Cache the inset dimension.
- setDimCache(mi, dim);
+ dim.wid = ADD_TO_VSPACE_WIDTH + 2 * vspace_arrow_size + 5 + w;
}
// adding or removing space
bool const added = space_.kind() != VSpace::LENGTH ||
space_.length().len().value() >= 0.0;
- ty1 = added ? (start + arrow_size) : start;
- ty2 = added ? start : (start + arrow_size);
- by1 = added ? (end - arrow_size) : end;
- by2 = added ? end : (end - arrow_size);
+ ty1 = added ? (start + vspace_arrow_size) : start;
+ ty2 = added ? start : (start + vspace_arrow_size);
+ by1 = added ? (end - vspace_arrow_size) : end;
+ by2 = added ? end : (end - vspace_arrow_size);
}
- int const midx = x + arrow_size;
- int const rightx = midx + arrow_size;
+ int const midx = x + vspace_arrow_size;
+ int const rightx = midx + vspace_arrow_size;
// first the string
int w = 0;
docstring const lab = label();
theFontMetrics(font).rectText(lab, w, a, d);
- pi.pain.rectText(x + 2 * arrow_size + 5,
+ pi.pain.rectText(x + 2 * vspace_arrow_size + 5,
start + (end - start) / 2 + (a - d) / 2,
lab, font, Color_none, Color_none);
}
-int InsetVSpace::latex(odocstream & os, OutputParams const &) const
+void InsetVSpace::latex(otexstream & os, OutputParams const & rp) const
{
- os << from_ascii(space_.asLatexCommand(buffer().params())) << '\n';
- return 1;
+ os << from_ascii(space_.asLatexCommand(buffer().params())) << breakln;
+ if (rp.need_noindent) {
+ // If the paragraph starts with a vspace and has more than that
+ // content, the \\noindent needs to come after that
+ // (as \\noindent leaves vmode).
+ os << "\\noindent" << termcmd;
+ }
}
-int InsetVSpace::plaintext(odocstream & os, OutputParams const &) const
+int InsetVSpace::plaintext(odocstringstream & os,
+ OutputParams const &, size_t) const
{
os << "\n\n";
return PLAINTEXT_NEWLINE;
}
-int InsetVSpace::docbook(odocstream & os, OutputParams const &) const
+void InsetVSpace::docbook(XMLStream & xs, OutputParams const &) const
{
- os << '\n';
- return 1;
+ xs << xml::CR();
}
-string const InsetVSpaceMailer::name_ = "vspace";
-
-
-InsetVSpaceMailer::InsetVSpaceMailer(InsetVSpace & inset)
- : inset_(inset)
-{}
+docstring InsetVSpace::xhtml(XMLStream & os, OutputParams const &) const
+{
+ string const len = space_.asHTMLLength();
+ string const attr = "style='height:" + (len.empty() ? "1em" : len) + "'";
+ os << xml::StartTag("div", attr, true) << xml::EndTag("div");
+ return docstring();
+}
-string const InsetVSpaceMailer::inset2string(Buffer const &) const
+string InsetVSpace::contextMenuName() const
{
- return params2string(inset_.space());
+ return "context-vspace";
}
-void InsetVSpaceMailer::string2params(string const & in, VSpace & vspace)
+void InsetVSpace::string2params(string const & in, VSpace & vspace)
{
vspace = VSpace();
if (in.empty())
return;
istringstream data(in);
- Lexer lex(0,0);
+ Lexer lex;
lex.setStream(data);
-
- string name;
- lex >> name;
- if (!lex || name != name_)
- return print_mailer_error("InsetVSpaceMailer", in, 1, name_);
-
- string vsp;
- lex >> vsp;
- if (lex)
- vspace = VSpace(vsp);
+ lex.setContext("InsetVSpace::string2params");
+ lex >> "vspace" >> vspace;
}
-string const InsetVSpaceMailer::params2string(VSpace const & vspace)
+string InsetVSpace::params2string(VSpace const & vspace)
{
ostringstream data;
- data << name_ << ' ' << vspace.asLyXCommand();
+ data << "vspace" << ' ' << vspace.asLyXCommand();
return data.str();
}