]> git.lyx.org Git - features.git/blobdiff - src/mathed/InsetMathScript.cpp
Introduce a return value for mathmlize(). We will need this to be able
[features.git] / src / mathed / InsetMathScript.cpp
index 6bf53dd79900d4af5cd4a30c212e29013962b9ea..74420279cb8d5ee23abe7fe3b55ad29129e7f12b 100644 (file)
@@ -3,7 +3,7 @@
  * This file is part of LyX, the document processor.
  * Licence details can be found in the file COPYING.
  *
- * \author André Pönitz
+ * \author André Pönitz
  *
  * Full author contact details are available in file CREDITS.
  */
@@ -18,6 +18,7 @@
 #include "InsetMathScript.h"
 #include "InsetMathSymbol.h"
 #include "MathData.h"
+#include "MathExtern.h"
 #include "MathStream.h"
 #include "MathSupport.h"
 
@@ -32,18 +33,18 @@ using namespace std;
 namespace lyx {
 
 
-InsetMathScript::InsetMathScript()
-       : InsetMathNest(1), cell_1_is_up_(false), limits_(0)
+InsetMathScript::InsetMathScript(Buffer * buf)
+       : InsetMathNest(buf, 1), cell_1_is_up_(false), limits_(0)
 {}
 
 
-InsetMathScript::InsetMathScript(bool up)
-       : InsetMathNest(2), cell_1_is_up_(up), limits_(0)
+InsetMathScript::InsetMathScript(Buffer * buf, bool up)
+       : InsetMathNest(buf, 2), cell_1_is_up_(up), limits_(0)
 {}
 
 
-InsetMathScript::InsetMathScript(MathAtom const & at, bool up)
-       : InsetMathNest(2), cell_1_is_up_(up), limits_(0)
+InsetMathScript::InsetMathScript(Buffer * buf, MathAtom const & at, bool up)
+       : InsetMathNest(buf, 2), cell_1_is_up_(up), limits_(0)
 {
        LASSERT(nargs() >= 1, /**/);
        cell(0).push_back(at);
@@ -525,13 +526,7 @@ bool InsetMathScript::idxUpDown(Cursor & cur, bool up) const
 
 void InsetMathScript::write(WriteStream & os) const
 {
-       bool brace = os.pendingBrace();
-       os.pendingBrace(false);
-       if (os.latex() && os.textMode()) {
-               os << "\\ensuremath{";
-               os.textMode(false);
-               brace = true;
-       }
+       MathEnsurer ensurer(os);
 
        if (nuc().size()) {
                os << nuc();
@@ -556,8 +551,6 @@ void InsetMathScript::write(WriteStream & os) const
 
        if (lock_ && !os.latex())
                os << "\\lyxlock ";
-
-       os.pendingBrace(brace);
 }
 
 
@@ -620,7 +613,11 @@ void InsetMathScript::mathematica(MathematicaStream & os) const
 }
 
 
-void InsetMathScript::mathmlize(MathStream & os) const
+// FIXME XHTML
+// It may be worth trying to output munder, mover, and munderover
+// in certain cases, e.g., for display formulas. But then we would
+// need to know if we're in a display formula.
+docstring InsetMathScript::mathmlize(MathStream & os) const
 {
        bool d = hasDown() && down().size();
        bool u = hasUp() && up().size();
@@ -632,17 +629,23 @@ void InsetMathScript::mathmlize(MathStream & os) const
        else if (d)
                os << MTag("msub");
 
-       if (nuc().size())
-               os << nuc();
-       else
-               os << "<mrow/>";
+       docstring rv;
+       if (nuc().size()) {
+               os << MTag("mrow");
+               rv = lyx::mathmlize(nuc(), os);
+               os << ETag("mrow");
+       } else
+               os << "<mrow />";
 
        if (u && d)
-               os << down() << up() << ETag("msubsup");
+               os << MTag("mrow") << down() << ETag("mrow") 
+                  << MTag("mrow") << up() << ETag("mrow") 
+                  << ETag("msubsup");
        else if (u)
-               os << up() << ETag("msup");
+               os << MTag("mrow") << up() << ETag("mrow") << ETag("msup");
        else if (d)
-               os << down() << ETag("msub");
+               os << MTag("mrow") << down() << ETag("mrow") << ETag("msub");
+       return rv;
 }
 
 
@@ -683,11 +686,13 @@ bool InsetMathScript::notifyCursorLeaves(Cursor const & old, Cursor & cur)
        if (nargs() > 2 && (!cell(1).empty() || !cell(2).empty())) {
                if (cell(2).empty()) {
                        // must be a subscript...
+                       old.recordUndoInset();
                        removeScript(false);
                        cur.updateFlags(cur.disp_.update() | Update::SinglePar);
                        return true;
                } else if (cell(1).empty()) {
                        // must be a superscript...
+                       old.recordUndoInset();
                        removeScript(true);
                        cur.updateFlags(cur.disp_.update() | Update::SinglePar);
                        return true;