X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2Finsetcommand.C;h=6d5248844b923d5650941ffb563ea74feb0313ae;hb=e28331ed63062dea10d0a21b9ec12034b4b17b9a;hp=37d321b6206be8479f7b0d2e12db65d1243560e9;hpb=ccce6b9662e3a753d8864b1832d766a8f4ceef02;p=lyx.git diff --git a/src/insets/insetcommand.C b/src/insets/insetcommand.C index 37d321b620..6d5248844b 100644 --- a/src/insets/insetcommand.C +++ b/src/insets/insetcommand.C @@ -6,91 +6,166 @@ * \author Angus Leeming * \author Lars Gullik Bjønnes * - * Full author contact details are available in file CREDITS + * Full author contact details are available in file CREDITS. */ #include #include "insetcommand.h" + #include "BufferView.h" -#include "debug.h" +#include "dispatchresult.h" #include "funcrequest.h" +#include "FuncStatus.h" #include "lyxlex.h" +#include "metricsinfo.h" -#include "frontends/Painter.h" +#include -#include "support/lstrings.h" -#include "Lsstream.h" +namespace lyx { +using std::string; +using std::istringstream; using std::ostream; +using std::ostringstream; -InsetCommand::InsetCommand(InsetCommandParams const & p, bool) - : p_(p.getCmdName(), p.getContents(), p.getOptions()) +InsetCommand::InsetCommand(InsetCommandParams const & p, + string const & mailer_name) + : p_(p), + mailer_name_(mailer_name), + mouse_hover_(false), + updateButtonLabel_(true) {} -void InsetCommand::setParams(InsetCommandParams const & p) +InsetCommand::~InsetCommand() { - p_.setCmdName(p.getCmdName()); - p_.setContents(p.getContents()); - p_.setOptions(p.getOptions()); + if (!mailer_name_.empty()) + InsetCommandMailer(mailer_name_, *this).hideDialog(); } -int InsetCommand::latex(Buffer const *, ostream & os, LatexRunParams const &, - bool /*fragile*/, bool/*fs*/) const +bool InsetCommand::metrics(MetricsInfo & mi, Dimension & dim) const { - os << getCommand(); - return 0; + if (updateButtonLabel_) { + updateButtonLabel_ = false; + button_.update(getScreenLabel(*mi.base.bv->buffer()), + editable() != NOT_EDITABLE); + } + button_.metrics(mi, dim); + bool const changed = dim_ != dim; + dim_ = dim; + return changed; } -int InsetCommand::ascii(Buffer const *, ostream &, int) const +bool InsetCommand::setMouseHover(bool mouse_hover) { + mouse_hover_ = mouse_hover; + return true; +} + + +void InsetCommand::draw(PainterInfo & pi, int x, int y) const +{ + setPosCache(pi, x, y); + button_.setRenderState(mouse_hover_); + button_.draw(pi, x, y); +} + + +void InsetCommand::setParams(InsetCommandParams const & p) +{ + p_ = p; + updateButtonLabel_ = true; +} + + +int InsetCommand::latex(Buffer const &, odocstream & os, + OutputParams const &) const +{ + os << getCommand(); return 0; } -int InsetCommand::linuxdoc(Buffer const *, ostream &) const +int InsetCommand::plaintext(Buffer const &, odocstream &, + OutputParams const &) const { return 0; } -int InsetCommand::docbook(Buffer const *, ostream &, bool) const +int InsetCommand::docbook(Buffer const &, odocstream &, + OutputParams const &) const { return 0; } -dispatch_result InsetCommand::localDispatch(FuncRequest const & cmd) +void InsetCommand::doDispatch(LCursor & cur, FuncRequest & cmd) { - lyxerr << "InsetCommand::localDispatch: " << cmd.action << "\n"; switch (cmd.action) { + case LFUN_INSET_REFRESH: + updateButtonLabel_ = true; + break; + case LFUN_INSET_MODIFY: { - InsetCommandParams p; - InsetCommandMailer::string2params(cmd.argument, p); + InsetCommandParams p(p_.getCmdName()); + InsetCommandMailer::string2params(mailer_name_, to_utf8(cmd.argument()), p); if (p.getCmdName().empty()) - return UNDISPATCHED; + cur.noUpdate(); + else + setParams(p); + break; + } - setParams(p); - cmd.view()->updateInset(this); - return DISPATCHED; + case LFUN_INSET_DIALOG_UPDATE: { + string const name = to_utf8(cmd.argument()); + InsetCommandMailer(name, *this).updateDialog(&cur.bv()); + break; } - case LFUN_INSET_DIALOG_UPDATE: - InsetCommandMailer(cmd.argument, *this).updateDialog(cmd.view()); - return DISPATCHED; + case LFUN_MOUSE_RELEASE: { + if (!mailer_name_.empty()) + InsetCommandMailer(mailer_name_, *this).showDialog(&cur.bv()); + break; + } + + default: + InsetBase::doDispatch(cur, cmd); + break; + } - case LFUN_MOUSE_RELEASE: - return localDispatch(FuncRequest(cmd.view(), LFUN_INSET_EDIT)); +} + +bool InsetCommand::getStatus(LCursor & cur, FuncRequest const & cmd, + FuncStatus & status) const +{ + switch (cmd.action) { + // suppress these + case LFUN_ERT_INSERT: + status.enabled(false); + return true; + // we handle these + case LFUN_INSET_REFRESH: + case LFUN_INSET_MODIFY: + case LFUN_INSET_DIALOG_UPDATE: + status.enabled(true); + return true; default: - return UNDISPATCHED; + return InsetBase::getStatus(cur, cmd, status); } +} + +void InsetCommand::replaceContents(std::string const & from, string const & to) +{ + if (getContents() == from) + setContents(to); } @@ -100,51 +175,50 @@ InsetCommandMailer::InsetCommandMailer(string const & name, {} -string const InsetCommandMailer::inset2string() const +string const InsetCommandMailer::inset2string(Buffer const &) const { return params2string(name(), inset_.params()); } -void InsetCommandMailer::string2params(string const & in, +void InsetCommandMailer::string2params(string const & name, + string const & in, InsetCommandParams & params) { - params.setCmdName(string()); - params.setContents(string()); - params.setOptions(string()); - + params.clear(); if (in.empty()) return; - - istringstream data(STRCONV(in)); + + istringstream data(in); LyXLex lex(0,0); lex.setStream(data); - if (lex.isOK()) { - lex.next(); - string const name = lex.getString(); - } + string n; + lex >> n; + if (!lex || n != name) + return print_mailer_error("InsetCommandMailer", in, 1, name); // This is part of the inset proper that is usually swallowed - // by Buffer::readInset - if (lex.isOK()) { - lex.next(); - string const token = lex.getString(); - if (token != "LatexCommand") - return; - } - if (lex.isOK()) { - params.read(lex); - } + // by LyXText::readInset + string id; + lex >> id; + if (!lex || id != "LatexCommand") + return print_mailer_error("InsetCommandMailer", in, 2, "LatexCommand"); + + params.read(lex); } -string const InsetCommandMailer::params2string(string const & name, +string const +InsetCommandMailer::params2string(string const & name, InsetCommandParams const & params) { ostringstream data; data << name << ' '; params.write(data); data << "\\end_inset\n"; - return STRCONV(data.str()); + return data.str(); } + + +} // namespace lyx