X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetCommand.cpp;h=9ca958b5f880857c6195614fa93dcdf9d14cc50c;hb=3a949b32f08ce4884906a9c5d47c4d7031c794b2;hp=2e24d4d4e1d213f3d232fe6ee711f6c865099295;hpb=e15a8f3551f86a2ffa835c344256f2b4703fefb2;p=lyx.git diff --git a/src/insets/InsetCommand.cpp b/src/insets/InsetCommand.cpp index 2e24d4d4e1..9ca958b5f8 100644 --- a/src/insets/InsetCommand.cpp +++ b/src/insets/InsetCommand.cpp @@ -15,40 +15,39 @@ #include "Buffer.h" #include "BufferEncodings.h" +#include "BufferParams.h" #include "BufferView.h" #include "Cursor.h" -#include "DispatchResult.h" #include "FuncRequest.h" #include "FuncStatus.h" #include "Lexer.h" +#include "LyX.h" #include "MetricsInfo.h" #include "texstream.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" +#include "support/lstrings.h" #include "frontends/Application.h" #include using namespace std; +using namespace lyx::support; namespace lyx { @@ -56,14 +55,14 @@ namespace lyx { // 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) - : Inset(buf), p_(p) + : Inset(buf), p_(p), broken_(false) {} // 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_) + : Inset(rhs), p_(rhs.p_), broken_(false) {} @@ -76,6 +75,7 @@ InsetCommand & InsetCommand::operator=(InsetCommand const & rhs) p_ = rhs.p_; mouse_hover_.clear(); button_ = RenderButton(); + broken_ = false; return *this; } @@ -96,7 +96,8 @@ InsetCommand::~InsetCommand() void InsetCommand::metrics(MetricsInfo & mi, Dimension & dim) const { - button_.update(screenLabel(), editable() || clickable(*mi.base.bv, 0, 0)); + button_.update(screenLabel(), editable() || clickable(*mi.base.bv, 0, 0), + inheritFont(), broken_); button_.metrics(mi, dim); } @@ -138,7 +139,11 @@ void InsetCommand::setParams(InsetCommandParams const & p) void InsetCommand::latex(otexstream & os, OutputParams const & runparams_in) const { OutputParams runparams = runparams_in; - os << getCommand(runparams); + docstring command = getCommand(runparams); + if (buffer().params().use_minted + && prefixIs(command, from_ascii("\\lstlistoflistings"))) + command.erase(1, 3); + os << command; } @@ -152,15 +157,16 @@ int InsetCommand::plaintext(odocstringstream & os, } -int InsetCommand::docbook(odocstream &, OutputParams const &) const +void InsetCommand::docbook(XMLStream &, OutputParams const &) const { - return 0; + return; } void InsetCommand::validate(LaTeXFeatures & features) const { - if (params()["literal"] == "true") + if (params().info().hasParam("literal") + && params()["literal"] == "true") return; ParamInfo::const_iterator it = params().info().begin(); @@ -177,24 +183,56 @@ void InsetCommand::validate(LaTeXFeatures & features) const } +void InsetCommand::changeCmdName(string const & new_name) +{ + string const & old_name = getCmdName(); + if (old_name == new_name) + return; + + if (buffer().masterParams().track_changes) { + // With change tracking, we insert a new inset and + // delete the old one + InsetCommandParams p(p_.code()); + p = p_; + p.setCmdName(new_name); + string const data = InsetCommand::params2string(p); + lyx::dispatch(FuncRequest(LFUN_INSET_INSERT, data)); + lyx::dispatch(FuncRequest(LFUN_CHAR_DELETE_FORWARD)); + } else + p_.setCmdName(new_name); +} + + 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)); + changeCmdName(cmd.getArg(1)); cur.forceBufferUpdate(); initView(); break; } InsetCommandParams p(p_.code()); InsetCommand::string2params(to_utf8(cmd.argument()), p); + if (p == p_) + // no change + break; if (p.getCmdName().empty()) cur.noScreenUpdate(); else { cur.recordUndo(); - setParams(p); + if (buffer().masterParams().track_changes) { + // With change tracking, we insert a new inset and + // delete the old one + string const data = InsetCommand::params2string(p); + lyx::dispatch(FuncRequest(LFUN_INSET_INSERT, data)); + lyx::dispatch(FuncRequest(LFUN_CHAR_DELETE_FORWARD)); + cur.forceBufferUpdate(); + break; + } else + 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. @@ -308,7 +346,8 @@ bool decodeInsetParam(string const & name, string & data, case NOMENCL_PRINT_CODE: case REF_CODE: case TOC_CODE: - case HYPERLINK_CODE: { + case HYPERLINK_CODE: + case COUNTER_CODE: { InsetCommandParams p(code); data = InsetCommand::params2string(p); break; @@ -340,7 +379,7 @@ bool decodeInsetParam(string const & name, string & data, break; } case ERT_CODE: { - data = InsetERT::params2string(InsetCollapsable::Open); + data = InsetERT::params2string(InsetCollapsible::Open); break; } case EXTERNAL_CODE: {