]> git.lyx.org Git - lyx.git/blobdiff - src/mathed/math_hullinset.C
Fix to bug 2362: Deleting superscript also deletes subscript.
[lyx.git] / src / mathed / math_hullinset.C
index 5539190a96d590fbced946fd1db3694fab4197ad..da192918b999b6b0467740723169a9dcd515c0e4 100644 (file)
@@ -14,6 +14,7 @@
 #include "math_colorinset.h"
 #include "math_data.h"
 #include "math_extern.h"
+#include "math_factory.h"
 #include "math_hullinset.h"
 #include "math_mathmlstream.h"
 #include "math_streamstr.h"
@@ -142,6 +143,7 @@ MathHullInset::MathHullInset()
        //lyxerr << "sizeof MetricsInfo: " << sizeof(MetricsInfo) << endl;
        //lyxerr << "sizeof MathCharInset: " << sizeof(MathCharInset) << endl;
        //lyxerr << "sizeof LyXFont: " << sizeof(LyXFont) << endl;
+       initMath();
        setDefaults();
 }
 
@@ -150,6 +152,7 @@ MathHullInset::MathHullInset(string const & type)
        : MathGridInset(getCols(type), 1), type_(type), nonum_(1), label_(1),
          preview_(new RenderPreview(this))
 {
+       initMath();
        setDefaults();
 }
 
@@ -588,6 +591,10 @@ void MathHullInset::delRow(row_type row)
        if (nrows() <= 1 || !rowChangeOK())
                return;
        MathGridInset::delRow(row);
+       // The last dummy row has no number info nor a label.
+       // Test nrows() + 1 because we have already erased the row.
+       if (row == nrows() + 1)
+               row--;
        nonum_.erase(nonum_.begin() + row);
        label_.erase(label_.begin() + row);
 }
@@ -850,7 +857,7 @@ void MathHullInset::mutate(string const & newtype)
 }
 
 
-string MathHullInset::eolString(row_type row, bool fragile) const
+string MathHullInset::eolString(row_type row, bool emptyline, bool fragile) const
 {
        string res;
        if (numberedType()) {
@@ -859,7 +866,7 @@ string MathHullInset::eolString(row_type row, bool fragile) const
                if (nonum_[row] && (type_ != "multline"))
                        res += "\\nonumber ";
        }
-       return res + MathGridInset::eolString(row, fragile);
+       return res + MathGridInset::eolString(row, emptyline, fragile);
 }
 
 
@@ -979,14 +986,17 @@ void MathHullInset::doExtern(LCursor & cur, FuncRequest & func)
 
 void MathHullInset::doDispatch(LCursor & cur, FuncRequest & cmd)
 {
+       //lyxerr << "action: " << cmd.action << endl;
        switch (cmd.action) {
 
        case LFUN_FINISHED_LEFT:
        case LFUN_FINISHED_RIGHT:
        case LFUN_FINISHED_UP:
        case LFUN_FINISHED_DOWN:
+               //lyxerr << "action: " << cmd.action << endl;
                MathGridInset::doDispatch(cur, cmd);
                notifyCursorLeaves(cur);
+               cur.undispatched();
                break;
 
        case LFUN_BREAKPARAGRAPH:
@@ -1036,8 +1046,10 @@ void MathHullInset::doDispatch(LCursor & cur, FuncRequest & cmd)
                string old_label = label(r);
                string const default_label =
                        (lyxrc.label_init_length >= 0) ? "eq:" : "";
+               if (old_label.empty())
+                       old_label = default_label;
                string const contents = cmd.argument.empty() ?
-                       label(r) : cmd.argument;
+                       old_label : cmd.argument;
 
                InsetCommandParams p("label", contents);
                string const data = InsetCommandMailer::params2string("label", p);
@@ -1068,7 +1080,14 @@ void MathHullInset::doDispatch(LCursor & cur, FuncRequest & cmd)
                                cur.bv().buffer()->changeRefsIfUnique(old, str);
                                label(r, str);
                        }
+                       break;
                }
+               MathArray ar;
+               if (createMathInset_fromDialogStr(cmd.argument, ar)) {
+                       recordUndo(cur);
+                       cur.insert(ar);
+               } else
+                       cur.undispatched();
                break;
        }
 
@@ -1113,7 +1132,12 @@ bool MathHullInset::getStatus(LCursor & cur, FuncRequest const & cmd,
                FuncStatus & status) const
 {
        switch (cmd.action) {
-       // These are only enabled inside tabular
+       case LFUN_FINISHED_LEFT:
+       case LFUN_FINISHED_RIGHT:
+       case LFUN_FINISHED_UP:
+       case LFUN_FINISHED_DOWN:
+               status.enabled(true);
+               return true;
        case LFUN_BREAKLINE:
        case LFUN_MATH_NUMBER:
        case LFUN_MATH_NONUMBER:
@@ -1126,6 +1150,15 @@ bool MathHullInset::getStatus(LCursor & cur, FuncRequest const & cmd,
        case LFUN_INSERT_LABEL:
                status.enabled(type_ != "simple");
                return true;
+       case LFUN_INSET_INSERT: {
+               // Don't test createMathInset_fromDialogStr(), since
+               // getStatus is not called with a valid reference and the
+               // dialog would not be applyable.
+               string const name = cmd.getArg(0);
+               status.enabled(name == "ref" ||
+                              (name == "label" && type_ != "simple"));
+               break;
+       }
        case LFUN_TABULAR_FEATURE: {
                istringstream is(cmd.argument);
                string s;
@@ -1178,6 +1211,9 @@ bool MathHullInset::getStatus(LCursor & cur, FuncRequest const & cmd,
        default:
                return MathGridInset::getStatus(cur, cmd, status);
        }
+
+       // This cannot really happen, but inserted to shut-up gcc
+       return MathGridInset::getStatus(cur, cmd, status);
 }
 
 
@@ -1433,9 +1469,9 @@ int MathHullInset::docbook(Buffer const & buf, ostream & os,
        ms <<  "<graphic fileref=\"eqn/";
        if ( !label(0).empty())
                ms << sgml::cleanID(buf, runparams, label(0));
-       else {
+       else
                ms << sgml::uniqueID("anon");
-       }
+
        if (runparams.flavor == OutputParams::XML)
                ms << "\"/>";
        else
@@ -1444,3 +1480,10 @@ int MathHullInset::docbook(Buffer const & buf, ostream & os,
        ms << ETag(name.c_str());
        return ms.line() + res;
 }
+
+
+int MathHullInset::textString(Buffer const & buf, ostream & os,
+                      OutputParams const & op) const
+{
+       return plaintext(buf, os, op);
+}