#include "InsetCommand.h"
#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 <sstream>
using namespace std;
+using namespace lyx::support;
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)
{}
p_ = rhs.p_;
mouse_hover_.clear();
button_ = RenderButton();
+ broken_ = false;
return *this;
}
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);
}
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;
}
}
-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().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::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);
}
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.
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;
break;
}
case ERT_CODE: {
- data = InsetERT::params2string(InsetCollapsable::Open);
+ data = InsetERT::params2string(InsetCollapsible::Open);
break;
}
case EXTERNAL_CODE: {