]> git.lyx.org Git - lyx.git/blobdiff - src/insets/InsetCommand.cpp
Inset::addToToc(): change signature. Use DocIterator instead of ParConstIterator...
[lyx.git] / src / insets / InsetCommand.cpp
index 30c944abaad5d506f5a8476d70e3bc798d5277e0..bbe81841338d323d46584a85032ed8db0f1e9df3 100644 (file)
 #include "DispatchResult.h"
 #include "FuncRequest.h"
 #include "FuncStatus.h"
-#include "support/gettext.h"
 #include "Lexer.h"
 #include "MetricsInfo.h"
 
+#include "support/debug.h"
+#include "support/gettext.h"
+
+#include "frontends/Application.h"
+
 #include <sstream>
 
 using namespace std;
 
-namespace lyx {
 
+namespace lyx {
 
 // FIXME Would it now be possible to use the InsetCode in 
 // place of the mailer name and recover that information?
@@ -42,7 +46,7 @@ InsetCommand::InsetCommand(InsetCommandParams const & p,
 InsetCommand::~InsetCommand()
 {
        if (!mailer_name_.empty())
-               InsetCommandMailer(mailer_name_, *this).hideDialog();
+               hideDialogs(mailer_name_, this);
 }
 
 
@@ -67,6 +71,18 @@ void InsetCommand::draw(PainterInfo & pi, int x, int y) const
 }
 
 
+void InsetCommand::setParam(std::string const & name, docstring const & value)
+{
+       p_[name] = value;
+}
+
+
+docstring const & InsetCommand::getParam(std::string const & name) const
+{
+       return p_[name];
+}
+
+
 void InsetCommand::setParams(InsetCommandParams const & p)
 {
        p_ = p;
@@ -99,12 +115,14 @@ int InsetCommand::docbook(odocstream &, OutputParams const &) const
 void InsetCommand::doDispatch(Cursor & cur, FuncRequest & cmd)
 {
        switch (cmd.action) {
-       case LFUN_INSET_REFRESH:
-               break;
-
        case LFUN_INSET_MODIFY: {
+               if (cmd.getArg(0) == "changetype") {
+                       p_.setCmdName(cmd.getArg(1));
+                       initView();
+                       break;
+               }
                InsetCommandParams p(p_.code());
-               InsetCommandMailer::string2params(mailer_name_, to_utf8(cmd.argument()), p);
+               InsetCommand::string2params(mailer_name_, to_utf8(cmd.argument()), p);
                if (p.getCmdName().empty())
                        cur.noUpdate();
                else
@@ -114,12 +132,12 @@ void InsetCommand::doDispatch(Cursor & cur, FuncRequest & cmd)
 
        case LFUN_INSET_DIALOG_UPDATE: {
                string const name = to_utf8(cmd.argument());
-               InsetCommandMailer(name, *this).updateDialog(&cur.bv());
+               cur.bv().updateDialog(name, params2string(name, params()));
                break;
        }
 
        case LFUN_MOUSE_RELEASE: {
-               if (!cur.selection())
+               if (!cur.selection() && cmd.button() != mouse_button::button3)
                        edit(cur, true);
                break;
        }
@@ -141,8 +159,14 @@ bool InsetCommand::getStatus(Cursor & cur, FuncRequest const & cmd,
                status.enabled(false);
                return true;
        // we handle these
-       case LFUN_INSET_REFRESH:
        case LFUN_INSET_MODIFY:
+               if (cmd.getArg(0) == "changetype") {
+                       string const newtype = cmd.getArg(1);
+                       status.enabled(p_.isCompatibleCommand(p_.code(), newtype));
+                       status.setOnOff(newtype == p_.getCmdName());
+               } else
+                       status.enabled(true);
+               return true;
        case LFUN_INSET_DIALOG_UPDATE:
                status.enabled(true);
                return true;
@@ -152,61 +176,39 @@ bool InsetCommand::getStatus(Cursor & cur, FuncRequest const & cmd,
 }
 
 
-void InsetCommand::edit(Cursor & cur, bool, EntryDirection)
+docstring InsetCommand::contextMenu(BufferView const &, int, int) const
 {
-       if (!mailer_name_.empty())
-               InsetCommandMailer(mailer_name_, *this).showDialog(&cur.bv());
+       return from_ascii("context-") + from_ascii(mailer_name_);
 }
 
 
-InsetCommandMailer::InsetCommandMailer(
-       string const & name, InsetCommand & inset)
-       : name_(name), inset_(inset)
-{}
-
-
-string const InsetCommandMailer::inset2string(Buffer const &) const
+void InsetCommand::edit(Cursor & cur, bool, EntryDirection)
 {
-       return params2string(name(), inset_.params());
+       if (!mailer_name_.empty())
+               cur.bv().showDialog(mailer_name_, params2string(mailer_name_, p_), this);
 }
 
 
-//FIXME This could take an InsetCode instead of a string
-bool InsetCommandMailer::string2params(
-       string const & name, string const & in, InsetCommandParams & params)
+// FIXME This could take an InsetCode instead of a string
+bool InsetCommand::string2params(string const & name, string const & in,
+       InsetCommandParams & params)
 {
        params.clear();
        if (in.empty())
                return false;
-
        istringstream data(in);
-       Lexer lex(0,0);
+       Lexer lex;
        lex.setStream(data);
-
-       string n;
-       lex >> n;
-       if (!lex || n != name) {
-               print_mailer_error("InsetCommandMailer", in, 1, name);
-               return false;
-       }
-
-       // This is part of the inset proper that is usually swallowed
-       // by Text::readInset
-       string id;
-       lex >> id;
-       if (!lex || id != "CommandInset") {
-               print_mailer_error("InsetCommandMailer", in, 2, "LatexCommand");
-               return false;
-       }
-
+       lex.setContext("InsetCommand::string2params");
+       lex >> name.c_str(); // check for name
+       lex >> "CommandInset";
        params.read(lex);
        return true;
 }
 
 
-//FIXME This could take an InsetCode instead of a string
-string const
-InsetCommandMailer::params2string(string const & name,
+// FIXME This could take an InsetCode instead of a string
+string InsetCommand::params2string(string const & name,
                                  InsetCommandParams const & params)
 {
        ostringstream data;