]> git.lyx.org Git - lyx.git/blobdiff - src/mathed/ref_inset.C
Jean-Marc's fix for wrong descent
[lyx.git] / src / mathed / ref_inset.C
index c607d198121245ad87c79ea1065121d092415bf5..ca7d8e67ec39a63b2f78c3e26fa7e32bd436c7f0 100644 (file)
@@ -1,7 +1,8 @@
 
+#include <config.h>
+
 #include "ref_inset.h"
-#include "math_cursor.h"
-#include "commandtags.h"
+#include "funcrequest.h"
 #include "formulabase.h"
 #include "BufferView.h"
 #include "frontends/LyXView.h"
 #include "lyxfunc.h"
 #include "gettext.h"
 #include "LaTeXFeatures.h"
+#include "debug.h"
+#include "math_mathmlstream.h"
+#include "Lsstream.h"
+#include "math_parser.h"
+#include "support/lstrings.h"
+
 
 RefInset::RefInset()
        : CommandInset("ref")
@@ -33,24 +40,39 @@ void RefInset::infoize(std::ostream & os) const
 }
 
 
-int RefInset::dispatch(string const & cmd, idx_type, pos_type) 
+dispatch_result
+RefInset::dispatch(FuncRequest const & cmd, idx_type & idx, pos_type & pos)
 {
-       if (cmd == "mouse 3") {
-               cerr << "trying to goto ref" << cell(0) << "\n";
-               mathcursor->formula()->view()->owner()->getLyXFunc()->
-                       dispatch(LFUN_REF_GOTO, asString(cell(0)));
-               return 1; // dispatched
-       }
-       
-       if (cmd == "mouse 1") {
-               cerr << "trying to open ref" << cell(0) << "\n";
-               // Eventually trigger dialog with button 3 not 1
-//             mathcursor->formula()->view()->owner()->getDialogs()
-//                     ->showRef(this);
-               return 1; // dispatched
+       switch (cmd.action) {
+               case LFUN_MOUSE_RELEASE:
+                       if (cmd.button() == mouse_button::button3) {
+                               lyxerr << "trying to goto ref" << cell(0) << "\n";
+                               cmd.view()->dispatch(FuncRequest(LFUN_REF_GOTO, asString(cell(0))));
+                               return DISPATCHED;
+                       }
+                       if (cmd.button() == mouse_button::button1) {
+                               // Eventually trigger dialog with button 3
+                               // not 1
+                               ostringstream data;
+                               data << "ref LatexCommand ";
+                               WriteStream wsdata(data);
+                               write(wsdata);
+                               wsdata << "\n\\end_inset\n\n";
+
+                               cmd.view()->owner()->getDialogs().
+                                       show("ref", data.str(), this);
+                               return DISPATCHED;
+                       }
+                       break;
+               case LFUN_MOUSE_PRESS:
+               case LFUN_MOUSE_MOTION:
+                       // eat other mouse commands
+                       return DISPATCHED;
+               default:
+                       return CommandInset::dispatch(cmd, idx, pos);
        }
-
-       return 0; // undispatched
+       // not our business
+       return UNDISPATCHED;
 }
 
 
@@ -83,7 +105,7 @@ void RefInset::validate(LaTeXFeatures & features) const
 
 int RefInset::ascii(std::ostream & os, int) const
 {
-       os << "[" << asString(cell(0)) << "]";
+       os << '[' << asString(cell(0)) << ']';
        return 0;
 }
 
@@ -108,7 +130,48 @@ int RefInset::docbook(std::ostream & os, bool) const
        return 0;
 }
 
-RefInset::type_info RefInset::types[] = {
+
+dispatch_result RefInset::localDispatch(FuncRequest const & cmd)
+{
+       if (cmd.action != LFUN_INSET_MODIFY || cmd.getArg(0) != "ref")
+               return UNDISPATCHED;
+
+       MathArray ar;
+       if (!string2RefInset(cmd.argument, ar))
+               return UNDISPATCHED;
+
+       *this = *ar[0].nucleus()->asRefInset();
+//     if (cmd.view())
+//                 // This does not compile because updateInset expects
+//                 // an Inset* and 'this' isn't.
+//             cmd.view()->updateInset(this, true);
+       return DISPATCHED;
+}
+
+
+bool string2RefInset(string const & str, MathArray & ar)
+{
+       string name;
+       string body = split(str, name, ' ');
+
+       if (name != "ref")
+               return false;
+
+       // body comes with a head "LatexCommand " and a
+       // tail "\nend_inset\n\n". Strip them off.
+       string trimmed;
+       body = split(body, trimmed, ' ');
+       split(body, trimmed, '\n');
+
+       mathed_parse_cell(ar, trimmed);
+       if (ar.size() != 1)
+               return false;
+
+       return ar[0].nucleus()->asRefInset();
+}
+
+
+RefInset::ref_type_info RefInset::types[] = {
        { "ref",        N_("Standard"),                 N_("Ref: ")},
        { "pageref",    N_("Page Number"),              N_("Page: ")},
        { "vpageref",   N_("Textual Page Number"),      N_("TextPage: ")},