]> git.lyx.org Git - lyx.git/blobdiff - src/mathed/math_scriptinset.C
fix #1073
[lyx.git] / src / mathed / math_scriptinset.C
index f0023d9f66c9a02513ae6f1ea14dc064ae6d3a32..c118f4be3c59bda1e7979cf7b28012a40811c16f 100644 (file)
@@ -1,11 +1,9 @@
-#ifdef __GNUG__
-#pragma implementation
-#endif
 
 #include "math_scriptinset.h"
 #include "math_support.h"
 #include "math_symbolinset.h"
 #include "math_mathmlstream.h"
+#include "funcrequest.h"
 #include "support/LAssert.h"
 #include "debug.h"
 
@@ -182,10 +180,10 @@ int MathScriptInset::ndes() const
 }
 
 
-void MathScriptInset::metrics(MathMetricsInfo & mi) const
+void MathScriptInset::metrics(MetricsInfo & mi) const
 {
        cell(2).metrics(mi);
-       MathScriptChanger dummy(mi.base);
+       ScriptChanger dummy(mi.base);
        cell(0).metrics(mi);
        cell(1).metrics(mi);
        dim_.w = 0;
@@ -208,13 +206,16 @@ void MathScriptInset::metrics(MathMetricsInfo & mi) const
 }
 
 
-void MathScriptInset::draw(MathPainterInfo & pi, int x, int y) const
+void MathScriptInset::draw(PainterInfo & pi, int x, int y) const
 {
        if (nuc().size())
                nuc().draw(pi, x + dxx(), y);
-       else if (editing())
-               drawStr(pi, pi.base.font, x + dxx(), y, ".");
-       MathScriptChanger dummy(pi.base);
+       else {
+               nuc().setXY(x + dxx(), y);
+               if (editing())
+                       drawStr(pi, pi.base.font, x + dxx(), y, ".");
+       }
+       ScriptChanger dummy(pi.base);
        if (hasUp())
                up().draw(pi, x + dx1(), y - dy1());
        if (hasDown())
@@ -269,16 +270,6 @@ bool MathScriptInset::hasLimits() const
 }
 
 
-void MathScriptInset::removeEmptyScripts()
-{
-       for (int i = 0; i <= 1; ++i)
-               if (script_[i] && cell(i).size() == 0) {
-                       cell(i).clear();
-                       script_[i] = false;
-               }
-}
-
-
 void MathScriptInset::removeScript(bool up)
 {
        cell(up).clear();
@@ -292,12 +283,6 @@ bool MathScriptInset::has(bool up) const
 }
 
 
-bool MathScriptInset::empty() const
-{
-       return !script_[0] && !script_[1] && cell(2).empty();
-}
-
-
 bool MathScriptInset::hasUp() const
 {
        return script_[1];
@@ -325,16 +310,36 @@ bool MathScriptInset::idxLeft(idx_type &, pos_type &) const
 bool MathScriptInset::idxUpDown(idx_type & idx, pos_type & pos, bool up,
        int) const
 {
-       if ((idx == 1 && up) || (idx == 0 && !up))
-               return false;
+       if (idx == 1) {
+               // if we are 'up' we can't go further up
+               if (up)
+                       return false;
+               // otherwise go to last base position
+               idx = 2;
+               pos = cell(2).size();
+       }
 
-       // in nuclues?
-       if (idx == 2) {
-               idx = up;
-               pos = 0;
-       } else {
+       else if (idx == 0) {
+               // if we are 'down' we can't go further down
+               if (!up)
+                       return false;
                idx = 2;
-               pos = cell(2).size();   
+               pos = cell(2).size();
+       }
+
+       else {
+               // in nucleus
+               // don't go up/down if there is no cell.
+               if (!has(up))
+                       return false;
+               // go up/down only if in the last position
+               // or in the first position of something with displayed limits
+               if (pos == cell(2).size() || (pos == 0 && hasLimits())) {
+                       idx = up;
+                       pos = 0;
+                       return true;
+               }
+               return false;
        }
        return true;
 }
@@ -344,12 +349,12 @@ void MathScriptInset::write(WriteStream & os) const
 {
        if (nuc().size()) {
                os << nuc();
-               if (nuc().back()->takesLimits()) {
+               //if (nuc().back()->takesLimits()) {
                        if (limits_ == -1)
                                os << "\\nolimits ";
                        if (limits_ == 1)
                                os << "\\limits ";
-               }
+               //}
        } else {
                if (os.firstitem())
                        lyxerr[Debug::MATHED] << "suppressing {} when writing\n";
@@ -394,7 +399,7 @@ void MathScriptInset::normalize(NormalStream & os) const
 }
 
 
-void MathScriptInset::maplize(MapleStream & os) const
+void MathScriptInset::maple(MapleStream & os) const
 {
        if (nuc().size())
                os << nuc();
@@ -405,24 +410,24 @@ void MathScriptInset::maplize(MapleStream & os) const
 }
 
 
-void MathScriptInset::mathematicize(MathematicaStream & os) const
+void MathScriptInset::mathematica(MathematicaStream & os) const
 {
        bool d = hasDown() && down().size();
        bool u = hasUp() && up().size();
 
        if (nuc().size()) {
-               if (d) 
+               if (d)
                        os << "Subscript[" << nuc();
                else
                        os << nuc();
        }
 
        if (u)
-               os << "^(" << up() << ")";
+               os << "^(" << up() << ')';
 
        if (nuc().size())
                if (d)
-                       os << "," << down() << "]"; 
+                       os << ',' << down() << ']';
 }
 
 
@@ -452,7 +457,7 @@ void MathScriptInset::mathmlize( MathMLStream & os) const
 }
 
 
-void MathScriptInset::octavize(OctaveStream & os) const
+void MathScriptInset::octave(OctaveStream & os) const
 {
        if (nuc().size())
                os << nuc();
@@ -466,6 +471,45 @@ void MathScriptInset::octavize(OctaveStream & os) const
 void MathScriptInset::infoize(std::ostream & os) const
 {
        os << "Scripts";
+}
+
+
+void MathScriptInset::infoize2(std::ostream & os) const
+{
        if (limits_)
                os << (limits_ == 1 ? ", Displayed limits" : ", Inlined limits");
 }
+
+
+void MathScriptInset::notifyCursorLeaves(idx_type idx)
+{
+       MathNestInset::notifyCursorLeaves(idx);
+
+       // remove empty scripts if possible
+       if (idx != 2 && script_[idx] && cell(idx).empty()) {
+               cell(idx).clear();
+               script_[idx] = false;
+       }
+}
+
+
+dispatch_result MathScriptInset::dispatch
+       (FuncRequest const & cmd, idx_type & idx, pos_type & pos)
+{
+       if (cmd.action == LFUN_MATH_LIMITS) {
+               if (!cmd.argument.empty()) {
+                       if (cmd.argument == "limits")
+                               limits_ = 1;
+                       else if (cmd.argument == "nolimits")
+                               limits_ = -1;
+                       else
+                               limits_ = 0;
+               } else if (limits_ == 0)
+                       limits_ =  (hasLimits()) ? -1 : 1;
+               else
+                       limits_ = 0;
+               return DISPATCHED;
+       }
+
+       return MathNestInset::dispatch(cmd, idx, pos);
+}