X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetCommand.cpp;h=fcda3cd2b984175a7cf24169adffb322c2a74095;hb=57b69a5efddf9f3c148007322f00dad6c253a2ed;hp=d4a03317a2a0b73f4c57d2614f87c5b14fd781d7;hpb=9b111ea5a6b245464f77a095b050d846e807a21a;p=lyx.git diff --git a/src/insets/InsetCommand.cpp b/src/insets/InsetCommand.cpp index d4a03317a2..fcda3cd2b9 100644 --- a/src/insets/InsetCommand.cpp +++ b/src/insets/InsetCommand.cpp @@ -15,12 +15,30 @@ #include "Buffer.h" #include "BufferView.h" +#include "Cursor.h" #include "DispatchResult.h" #include "FuncRequest.h" #include "FuncStatus.h" #include "Lexer.h" #include "MetricsInfo.h" +#include "insets/InsetBox.h" +#include "insets/InsetBranch.h" +#include "insets/InsetCommand.h" +#include "insets/InsetERT.h" +#include "insets/InsetExternal.h" +#include "insets/InsetFloat.h" +#include "insets/InsetGraphics.h" +#include "insets/InsetIndex.h" +#include "insets/InsetLine.h" +#include "insets/InsetListings.h" +#include "insets/InsetNote.h" +#include "insets/InsetPhantom.h" +#include "insets/InsetSpace.h" +#include "insets/InsetTabular.h" +#include "insets/InsetVSpace.h" +#include "insets/InsetWrap.h" + #include "support/debug.h" #include "support/gettext.h" @@ -33,51 +51,76 @@ using namespace std; namespace lyx { -// FIXME Would it now be possible to use the InsetCode in +// FIXME Would it now be possible to use the InsetCode in // place of the mailer name and recover that information? -InsetCommand::InsetCommand(InsetCommandParams const & p, - string const & mailer_name) - : p_(p), - mailer_name_(mailer_name), - mouse_hover_(false) +InsetCommand::InsetCommand(Buffer * buf, InsetCommandParams const & p) + : Inset(buf), p_(p) +{} + + +// The sole purpose of this copy constructor is to make sure +// that the mouse_hover_ map is not copied and remains empty. +InsetCommand::InsetCommand(InsetCommand const & rhs) + : Inset(rhs), p_(rhs.p_) {} +InsetCommand & InsetCommand::operator=(InsetCommand const & rhs) +{ + if (&rhs == this) + return *this; + + Inset::operator=(rhs); + p_ = rhs.p_; + mouse_hover_.clear(); + button_ = RenderButton(); + + return *this; +} + + InsetCommand::~InsetCommand() { - if (!mailer_name_.empty()) - hideDialogs(mailer_name_, this); + if (p_.code() != NO_CODE) + hideDialogs(insetName(p_.code()), this); + + map::iterator it = mouse_hover_.begin(); + map::iterator end = mouse_hover_.end(); + for (; it != end; ++it) + if (it->second) + it->first->clearLastInset(this); } void InsetCommand::metrics(MetricsInfo & mi, Dimension & dim) const { - button_.update(screenLabel(), editable() != NOT_EDITABLE); + button_.update(screenLabel(), editable() || clickable(*mi.base.bv, 0, 0)); button_.metrics(mi, dim); } -bool InsetCommand::setMouseHover(bool mouse_hover) +bool InsetCommand::setMouseHover(BufferView const * bv, bool mouse_hover) + const { - mouse_hover_ = mouse_hover; + mouse_hover_[bv] = mouse_hover; return true; } void InsetCommand::draw(PainterInfo & pi, int x, int y) const { - button_.setRenderState(mouse_hover_); + button_.setRenderState(mouse_hover_[pi.base.bv]); button_.draw(pi, x, y); } -void InsetCommand::setParam(std::string const & name, docstring const & value) +void InsetCommand::setParam(string const & name, docstring const & value) { p_[name] = value; } -docstring const & InsetCommand::getParam(std::string const & name) const +docstring const & InsetCommand::getParam(string const & name) const { return p_[name]; } @@ -90,14 +133,15 @@ void InsetCommand::setParams(InsetCommandParams const & p) } -int InsetCommand::latex(odocstream & os, OutputParams const &) const +void InsetCommand::latex(otexstream & os, OutputParams const & runparams_in) const { - os << getCommand(); - return 0; + OutputParams runparams = runparams_in; + os << getCommand(runparams); } -int InsetCommand::plaintext(odocstream & os, OutputParams const &) const +int InsetCommand::plaintext(odocstringstream & os, + OutputParams const &, size_t) const { docstring const str = "[" + buffer().B_("LaTeX Command: ") + from_utf8(getCmdName()) + "]"; @@ -114,31 +158,33 @@ int InsetCommand::docbook(odocstream &, OutputParams const &) const void InsetCommand::doDispatch(Cursor & cur, FuncRequest & cmd) { - switch (cmd.action) { + switch (cmd.action()) { case LFUN_INSET_MODIFY: { if (cmd.getArg(0) == "changetype") { + cur.recordUndo(); p_.setCmdName(cmd.getArg(1)); + cur.forceBufferUpdate(); initView(); break; } InsetCommandParams p(p_.code()); - InsetCommand::string2params(mailer_name_, to_utf8(cmd.argument()), p); + InsetCommand::string2params(to_utf8(cmd.argument()), p); if (p.getCmdName().empty()) - cur.noUpdate(); - else + cur.noScreenUpdate(); + else { + cur.recordUndo(); setParams(p); + } + // FIXME We might also want to check here if this one is in the TOC. + // But I think most of those are labeled. + if (isLabeled()) + cur.forceBufferUpdate(); break; } case LFUN_INSET_DIALOG_UPDATE: { string const name = to_utf8(cmd.argument()); - cur.bv().updateDialog(name, params2string(name, params())); - break; - } - - case LFUN_MOUSE_RELEASE: { - if (!cur.selection() && cmd.button() != mouse_button::button3) - edit(cur, true); + cur.bv().updateDialog(name, params2string(params())); break; } @@ -153,64 +199,62 @@ void InsetCommand::doDispatch(Cursor & cur, FuncRequest & cmd) bool InsetCommand::getStatus(Cursor & cur, FuncRequest const & cmd, FuncStatus & status) const { - switch (cmd.action) { + switch (cmd.action()) { // suppress these case LFUN_ERT_INSERT: status.setEnabled(false); return true; - + // we handle these case LFUN_INSET_MODIFY: if (cmd.getArg(0) == "changetype") { string const newtype = cmd.getArg(1); status.setEnabled(p_.isCompatibleCommand(p_.code(), newtype)); status.setOnOff(newtype == p_.getCmdName()); - } + } status.setEnabled(true); return true; - - case LFUN_INSET_SETTINGS: + case LFUN_INSET_DIALOG_UPDATE: status.setEnabled(true); return true; - + default: return Inset::getStatus(cur, cmd, status); } } -docstring InsetCommand::contextMenu(BufferView const &, int, int) const -{ - return from_ascii("context-") + from_ascii(mailer_name_); -} - - -void InsetCommand::edit(Cursor & cur, bool, EntryDirection) +string InsetCommand::contextMenuName() const { - showInsetDialog(&cur.bv()); + return "context-" + insetName(p_.code()); } bool InsetCommand::showInsetDialog(BufferView * bv) const { - if (!mailer_name_.empty()) - bv->showDialog(mailer_name_, params2string(mailer_name_, p_), + if (p_.code() != NO_CODE) + bv->showDialog(insetName(p_.code()), params2string(p_), const_cast(this)); return true; } -// FIXME This could take an InsetCode instead of a string -bool InsetCommand::string2params(string const & name, string const & in, +bool InsetCommand::string2params(string const & data, InsetCommandParams & params) { params.clear(); - if (in.empty()) + if (data.empty()) return false; - istringstream data(in); + // This happens when inset-insert is called without argument except for the + // inset type; ex: + // "inset-insert toc" + string const name = insetName(params.code()); + if (data == name) + return true; + istringstream dstream(data); Lexer lex; - lex.setStream(data); + lex.setStream(dstream); lex.setContext("InsetCommand::string2params"); lex >> name.c_str(); // check for name lex >> "CommandInset"; @@ -219,16 +263,124 @@ bool InsetCommand::string2params(string const & name, string const & in, } -// FIXME This could take an InsetCode instead of a string -string InsetCommand::params2string(string const & name, - InsetCommandParams const & params) +string InsetCommand::params2string(InsetCommandParams const & params) { ostringstream data; - data << name << ' '; + data << insetName(params.code()) << ' '; params.write(data); data << "\\end_inset\n"; return data.str(); } +bool decodeInsetParam(string const & name, string & data, + Buffer const & buffer) +{ + InsetCode const code = insetCode(name); + switch (code) { + case BIBITEM_CODE: + case BIBTEX_CODE: + case INDEX_PRINT_CODE: + case LABEL_CODE: + case LINE_CODE: + case NOMENCL_CODE: + case NOMENCL_PRINT_CODE: + case REF_CODE: + case TOC_CODE: + case HYPERLINK_CODE: { + InsetCommandParams p(code); + data = InsetCommand::params2string(p); + break; + } + case INCLUDE_CODE: { + // data is the include type: one of "include", + // "input", "verbatiminput" or "verbatiminput*" + if (data.empty()) + // default type is requested + data = "include"; + InsetCommandParams p(INCLUDE_CODE, data); + data = InsetCommand::params2string(p); + break; + } + case BOX_CODE: { + // \c data == "Boxed" || "Frameless" etc + InsetBoxParams p(data); + data = InsetBox::params2string(p); + break; + } + case BRANCH_CODE: { + InsetBranchParams p; + data = InsetBranch::params2string(p); + break; + } + case CITE_CODE: { + InsetCommandParams p(CITE_CODE); + data = InsetCommand::params2string(p); + break; + } + case ERT_CODE: { + data = InsetERT::params2string(InsetCollapsable::Open); + break; + } + case EXTERNAL_CODE: { + InsetExternalParams p; + data = InsetExternal::params2string(p, buffer); + break; + } + case FLOAT_CODE: { + InsetFloatParams p; + data = InsetFloat::params2string(p); + break; + } + case INDEX_CODE: { + InsetIndexParams p; + data = InsetIndex::params2string(p); + break; + } + case LISTINGS_CODE: { + InsetListingsParams p; + data = InsetListings::params2string(p); + break; + } + case GRAPHICS_CODE: { + InsetGraphicsParams p; + data = InsetGraphics::params2string(p, buffer); + break; + } + case MATH_SPACE_CODE: { + InsetSpaceParams p(true); + data = InsetSpace::params2string(p); + break; + } + case NOTE_CODE: { + InsetNoteParams p; + data = InsetNote::params2string(p); + break; + } + case PHANTOM_CODE: { + InsetPhantomParams p; + data = InsetPhantom::params2string(p); + break; + } + case SPACE_CODE: { + InsetSpaceParams p; + data = InsetSpace::params2string(p); + break; + } + case VSPACE_CODE: { + VSpace space; + data = InsetVSpace::params2string(space); + break; + } + case WRAP_CODE: { + InsetWrapParams p; + data = InsetWrap::params2string(p); + break; + } + default: + return false; + } // end switch(code) + return true; +} + } // namespace lyx