X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetCommand.cpp;h=f4f169232b2a8cfb50f55547348f843543b28c57;hb=50060053e36b3e9dfe03bc33ed3abac1eacc54b0;hp=9cebc11942527dec8d13ae61eb9e08e52e3e0d81;hpb=c4faeb75db7c2b04ed4a9bd3918c4cd2cbd55f29;p=lyx.git diff --git a/src/insets/InsetCommand.cpp b/src/insets/InsetCommand.cpp index 9cebc11942..f4f169232b 100644 --- a/src/insets/InsetCommand.cpp +++ b/src/insets/InsetCommand.cpp @@ -14,12 +14,15 @@ #include "InsetCommand.h" #include "Buffer.h" +#include "BufferEncodings.h" #include "BufferView.h" +#include "Cursor.h" #include "DispatchResult.h" #include "FuncRequest.h" #include "FuncStatus.h" #include "Lexer.h" #include "MetricsInfo.h" +#include "texstream.h" #include "insets/InsetBox.h" #include "insets/InsetBranch.h" @@ -28,7 +31,7 @@ #include "insets/InsetExternal.h" #include "insets/InsetFloat.h" #include "insets/InsetGraphics.h" -#include "insets/InsetInclude.h" +#include "insets/InsetIndex.h" #include "insets/InsetLine.h" #include "insets/InsetListings.h" #include "insets/InsetNote.h" @@ -50,25 +53,38 @@ 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(Buffer * buf, InsetCommandParams const & p, - string const & mailer_name) - : Inset(buf), p_(p), mailer_name_(mailer_name) +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_), mailer_name_(rhs.mailer_name_) + : 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(); @@ -80,7 +96,7 @@ InsetCommand::~InsetCommand() void InsetCommand::metrics(MetricsInfo & mi, Dimension & dim) const { - button_.update(screenLabel(), editable() || hasSettings()); + button_.update(screenLabel(), editable() || clickable(*mi.base.bv, 0, 0)); button_.metrics(mi, dim); } @@ -100,13 +116,13 @@ void InsetCommand::draw(PainterInfo & pi, int x, int y) const } -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]; } @@ -119,15 +135,15 @@ void InsetCommand::setParams(InsetCommandParams const & p) } -int InsetCommand::latex(odocstream & os, OutputParams const & runparams_in) const +void InsetCommand::latex(otexstream & os, OutputParams const & runparams_in) const { OutputParams runparams = runparams_in; os << getCommand(runparams); - return 0; } -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()) + "]"; @@ -142,21 +158,45 @@ int InsetCommand::docbook(odocstream &, OutputParams const &) const } +void InsetCommand::validate(LaTeXFeatures & features) const +{ + if (params().info().hasParam("literal") + && params()["literal"] == "true") + return; + + ParamInfo::const_iterator it = params().info().begin(); + ParamInfo::const_iterator end = params().info().end(); + for (; it != end; ++it) { + if (it->handling() == ParamInfo::HANDLING_LATEXIFY) { + docstring const text = params()[it->name()]; + // Validate the contents (if we LaTeXify, specific + // macros might require packages) + for (pos_type i = 0; i < int(text.size()) ; ++i) + BufferEncodings::validate(text[i], features); + } + } +} + + void InsetCommand::doDispatch(Cursor & cur, FuncRequest & cmd) { 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.noScreenUpdate(); - else + 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()) @@ -166,7 +206,7 @@ void InsetCommand::doDispatch(Cursor & cur, FuncRequest & cmd) case LFUN_INSET_DIALOG_UPDATE: { string const name = to_utf8(cmd.argument()); - cur.bv().updateDialog(name, params2string(name, params())); + cur.bv().updateDialog(name, params2string(params())); break; } @@ -186,44 +226,43 @@ bool InsetCommand::getStatus(Cursor & cur, FuncRequest const & cmd, 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_DIALOG_UPDATE: status.setEnabled(true); return true; - + default: return Inset::getStatus(cur, cmd, status); } } -docstring InsetCommand::contextMenu(BufferView const &, int, int) const +string InsetCommand::contextMenuName() const { - return from_ascii("context-") + from_ascii(mailer_name_); + 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 & data, +bool InsetCommand::string2params(string const & data, InsetCommandParams & params) { params.clear(); @@ -232,6 +271,7 @@ bool InsetCommand::string2params(string const & name, string const & data, // 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); @@ -245,12 +285,10 @@ bool InsetCommand::string2params(string const & name, string const & data, } -// 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(); @@ -264,7 +302,7 @@ bool decodeInsetParam(string const & name, string & data, switch (code) { case BIBITEM_CODE: case BIBTEX_CODE: - case INDEX_CODE: + case INDEX_PRINT_CODE: case LABEL_CODE: case LINE_CODE: case NOMENCL_CODE: @@ -273,7 +311,7 @@ bool decodeInsetParam(string const & name, string & data, case TOC_CODE: case HYPERLINK_CODE: { InsetCommandParams p(code); - data = InsetCommand::params2string(name, p); + data = InsetCommand::params2string(p); break; } case INCLUDE_CODE: { @@ -283,7 +321,7 @@ bool decodeInsetParam(string const & name, string & data, // default type is requested data = "include"; InsetCommandParams p(INCLUDE_CODE, data); - data = InsetCommand::params2string("include", p); + data = InsetCommand::params2string(p); break; } case BOX_CODE: { @@ -299,7 +337,7 @@ bool decodeInsetParam(string const & name, string & data, } case CITE_CODE: { InsetCommandParams p(CITE_CODE); - data = InsetCommand::params2string(name, p); + data = InsetCommand::params2string(p); break; } case ERT_CODE: { @@ -316,6 +354,11 @@ bool decodeInsetParam(string const & name, string & data, data = InsetFloat::params2string(p); break; } + case INDEX_CODE: { + InsetIndexParams p; + data = InsetIndex::params2string(p); + break; + } case LISTINGS_CODE: { InsetListingsParams p; data = InsetListings::params2string(p); @@ -326,6 +369,11 @@ bool decodeInsetParam(string const & name, string & data, 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);