]> git.lyx.org Git - lyx.git/blobdiff - src/mathed/InsetMathHull.cpp
* InsetMathHull:
[lyx.git] / src / mathed / InsetMathHull.cpp
index cd2d5c42cc16391418a3749bc43abd50335566b1..0f5fbb3989a1c2d00ee8e5f92afd8925e83faaf4 100644 (file)
@@ -26,6 +26,7 @@
 #include "InsetMathRef.h"
 
 #include "Buffer.h"
+#include "buffer_funcs.h"
 #include "BufferParams.h"
 #include "BufferView.h"
 #include "CutAndPaste.h"
@@ -50,6 +51,7 @@
 
 #include "frontends/Painter.h"
 
+#include "support/lassert.h"
 #include "support/debug.h"
 #include "support/gettext.h"
 #include "support/lstrings.h"
@@ -140,10 +142,11 @@ docstring hullName(HullType type)
        }
 }
 
+static InsetLabel * dummy_pointer = 0;
 
 InsetMathHull::InsetMathHull()
-       : InsetMathGrid(1, 1), type_(hullNone), nonum_(1, false), label_(1, 0),
-         preview_(new RenderPreview(this))
+       : InsetMathGrid(1, 1), type_(hullNone), nonum_(1, false),
+         label_(1, dummy_pointer), preview_(new RenderPreview(this))
 {
        //lyxerr << "sizeof InsetMath: " << sizeof(InsetMath) << endl;
        //lyxerr << "sizeof MetricsInfo: " << sizeof(MetricsInfo) << endl;
@@ -155,8 +158,8 @@ InsetMathHull::InsetMathHull()
 
 
 InsetMathHull::InsetMathHull(HullType type)
-       : InsetMathGrid(getCols(type), 1), type_(type), nonum_(1, false), label_(1, 0),
-         preview_(new RenderPreview(this))
+       : InsetMathGrid(getCols(type), 1), type_(type), nonum_(1, false),
+         label_(1, dummy_pointer), preview_(new RenderPreview(this))
 {
        initMath();
        setDefaults();
@@ -171,10 +174,8 @@ InsetMathHull::InsetMathHull(InsetMathHull const & other)
 
 InsetMathHull::~InsetMathHull()
 {
-       for (size_t i = 0; i < label_.size(); ++i) {
-               if (label_[i])
-                       delete label_[i];
-       }
+       for (size_t i = 0; i < label_.size(); ++i)
+               delete label_[i];
 }
 
 
@@ -191,10 +192,8 @@ InsetMathHull & InsetMathHull::operator=(InsetMathHull const & other)
        InsetMathGrid::operator=(other);
        type_  = other.type_;
        nonum_ = other.nonum_;
-       for (size_t i = 0; i < label_.size(); ++i) {
-               if (label_[i])
-                       delete label_[i];
-       }
+       for (size_t i = 0; i < label_.size(); ++i)
+               delete label_[i];
        label_ = other.label_;
        for (size_t i = 0; i != label_.size(); ++i) {
                if (label_[i])
@@ -209,6 +208,12 @@ InsetMathHull & InsetMathHull::operator=(InsetMathHull const & other)
 void InsetMathHull::setBuffer(Buffer & buffer)
 {
        buffer_ = &buffer;
+       for (idx_type i = 0, n = nargs(); i != n; ++i) {
+               MathData & data = cell(i);
+               for (size_t j = 0; j != data.size(); ++j)
+                       data[j].nucleus()->setBuffer(buffer);
+       }
+
        for (size_t i = 0; i != label_.size(); ++i) {
                if (label_[i])
                        label_[i]->setBuffer(buffer);
@@ -441,9 +446,7 @@ void InsetMathHull::drawT(TextPainter & pain, int x, int y) const
 }
 
 
-namespace {
-
-docstring const latex_string(InsetMathHull const & inset)
+static docstring latexString(InsetMathHull const & inset)
 {
        odocstringstream ls;
        WriteStream wi(ls, false, false);
@@ -451,13 +454,11 @@ docstring const latex_string(InsetMathHull const & inset)
        return ls.str();
 }
 
-} // namespace anon
-
 
 void InsetMathHull::addPreview(graphics::PreviewLoader & ploader) const
 {
        if (RenderPreview::status() == LyXRC::PREVIEW_ON) {
-               docstring const snippet = latex_string(*this);
+               docstring const snippet = latexString(*this);
                preview_->addPreview(snippet, ploader);
        }
 }
@@ -467,7 +468,7 @@ bool InsetMathHull::notifyCursorLeaves(Cursor const & /*old*/, Cursor & cur)
 {
        if (RenderPreview::status() == LyXRC::PREVIEW_ON) {
                Buffer const & buffer = cur.buffer();
-               docstring const snippet = latex_string(*this);
+               docstring const snippet = latexString(*this);
                preview_->addPreview(snippet, buffer);
                preview_->startLoading(buffer);
                cur.updateFlags(Update::Force);
@@ -478,7 +479,7 @@ bool InsetMathHull::notifyCursorLeaves(Cursor const & /*old*/, Cursor & cur)
 
 docstring InsetMathHull::label(row_type row) const
 {
-       BOOST_ASSERT(row < nrows());
+       LASSERT(row < nrows(), /**/);
        if (InsetLabel * il = label_[row])
                return il->screenLabel();
        return docstring();
@@ -489,7 +490,11 @@ void InsetMathHull::label(row_type row, docstring const & label)
 {
        //lyxerr << "setting label '" << label << "' for row " << row << endl;
        if (label_[row]) {
-               label_[row]->updateCommand(label);
+               if (label.empty()) {
+                       delete label_[row];
+                       label_[row] = dummy_pointer;
+               } else
+                       label_[row]->updateCommand(label);
                return;
        }
        InsetCommandParams p(LABEL_CODE);
@@ -535,14 +540,6 @@ Inset::DisplayType InsetMathHull::display() const
 }
 
 
-void InsetMathHull::getLabelList(vector<docstring> & labels) const
-{
-       for (row_type row = 0; row < nrows(); ++row)
-               if (label_[row] && !nonum_[row])
-                       labels.push_back(label_[row]->screenLabel());
-}
-
-
 bool InsetMathHull::numberedType() const
 {
        if (type_ == hullNone)
@@ -569,7 +566,6 @@ void InsetMathHull::validate(LaTeXFeatures & features) const
        //if (features.amsstyle)
        //  return;
 
-       features.require("boldsymbol");
        //features.binom      = true;
 
        InsetMathGrid::validate(features);
@@ -686,8 +682,21 @@ void InsetMathHull::addRow(row_type row)
 {
        if (!rowChangeOK())
                return;
-       nonum_.insert(nonum_.begin() + row + 1, !numberedType());
-       label_.insert(label_.begin() + row + 1, 0);
+
+       bool numbered = numberedType();
+       docstring lab;
+       if (type_ == hullMultline) {
+               if (row + 1 == nrows())  {
+                       nonum_[row] = true;
+                       lab = label(row);
+               } else
+                       numbered = false;
+       }
+
+       nonum_.insert(nonum_.begin() + row + 1, !numbered);
+       label_.insert(label_.begin() + row + 1, dummy_pointer);
+       if (!lab.empty())
+               label(row + 1, lab);
        InsetMathGrid::addRow(row);
 }
 
@@ -698,7 +707,14 @@ void InsetMathHull::swapRow(row_type row)
                return;
        if (row + 1 == nrows())
                --row;
-       swap(nonum_[row], nonum_[row + 1]);
+       // gcc implements the standard std::vector<bool> which is *not* a container:
+       //   http://www.gotw.ca/publications/N1185.pdf
+       // As a results, it doesn't like this:
+       //      swap(nonum_[row], nonum_[row + 1]);
+       // so we do it manually:
+       bool const b = nonum_[row];
+       nonum_[row] = nonum_[row + 1];
+       nonum_[row + 1] = b;
        swap(label_[row], label_[row + 1]);
        InsetMathGrid::swapRow(row);
 }
@@ -708,14 +724,21 @@ void InsetMathHull::delRow(row_type row)
 {
        if (nrows() <= 1 || !rowChangeOK())
                return;
+       if (row + 1 == nrows() && type_ == hullMultline) {
+               bool const b = nonum_[row - 1];
+               nonum_[row - 1] = nonum_[row];
+               nonum_[row] = b;
+               swap(label_[row - 1], label_[row]);
+               InsetMathGrid::delRow(row);
+               return;
+       }
        InsetMathGrid::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);
-       if (label_[row])
-               delete label_[row];
+       delete label_[row];
        label_.erase(label_.begin() + row);
 }
 
@@ -742,7 +765,7 @@ docstring InsetMathHull::nicelabel(row_type row) const
                return docstring();
        if (!label_[row])
                return from_ascii("(#)");
-       return '(' + label_[row]->screenLabel() + ')';
+       return '(' + label_[row]->screenLabel() + from_ascii(", #)");
 }
 
 
@@ -759,7 +782,7 @@ void InsetMathHull::glueall()
 
 void InsetMathHull::splitTo2Cols()
 {
-       BOOST_ASSERT(ncols() == 1);
+       LASSERT(ncols() == 1, /**/);
        InsetMathGrid::addCol(1);
        for (row_type row = 0; row < nrows(); ++row) {
                idx_type const i = 2 * row;
@@ -772,7 +795,7 @@ void InsetMathHull::splitTo2Cols()
 
 void InsetMathHull::splitTo3Cols()
 {
-       BOOST_ASSERT(ncols() < 3);
+       LASSERT(ncols() < 3, /**/);
        if (ncols() < 2)
                splitTo2Cols();
        InsetMathGrid::addCol(2);
@@ -979,7 +1002,7 @@ docstring InsetMathHull::eolString(row_type row, bool emptyline, bool fragile) c
        docstring res;
        if (numberedType()) {
                if (label_[row] && !nonum_[row])
-                       res += "\\label{" + label_[row]->screenLabel() + '}';
+                       res += "\\label{" + label_[row]->getParam("name") + '}';
                if (nonum_[row] && (type_ != hullMultline))
                        res += "\\nonumber ";
        }
@@ -1017,8 +1040,8 @@ void InsetMathHull::infoize(odocstream & os) const
 
 void InsetMathHull::check() const
 {
-       BOOST_ASSERT(nonum_.size() == nrows());
-       BOOST_ASSERT(label_.size() == nrows());
+       LASSERT(nonum_.size() == nrows(), /**/);
+       LASSERT(label_.size() == nrows(), /**/);
 }
 
 
@@ -1116,7 +1139,7 @@ void InsetMathHull::doDispatch(Cursor & cur, FuncRequest & cmd)
                // just swallow this
                break;
 
-       case LFUN_NEW_LINE:
+       case LFUN_NEWLINE_INSERT:
                // some magic for the common case
                if (type_ == hullSimple || type_ == hullEquation) {
                        cur.recordUndoInset();
@@ -1163,7 +1186,7 @@ void InsetMathHull::doDispatch(Cursor & cur, FuncRequest & cmd)
 
                InsetCommandParams p(LABEL_CODE);
                p["name"] = cmd.argument().empty() ? old_label : cmd.argument();
-               string const data = InsetCommandMailer::params2string("label", p);
+               string const data = InsetCommand::params2string("label", p);
 
                if (cmd.argument().empty())
                        cur.bv().showDialog("label", data);
@@ -1174,13 +1197,33 @@ void InsetMathHull::doDispatch(Cursor & cur, FuncRequest & cmd)
                break;
        }
 
+       case LFUN_WORD_DELETE_FORWARD:
+       case LFUN_CHAR_DELETE_FORWARD:
+               if (col(cur.idx()) + 1 == ncols()
+                   && cur.pos() == cur.lastpos()) {
+                       if (!label(row(cur.idx())).empty()) {
+                               cur.recordUndoInset();
+                               label(row(cur.idx()), docstring());
+                       } else if (numbered(row(cur.idx()))) {
+                               cur.recordUndoInset();
+                               numbered(row(cur.idx()), false);
+                       } else {
+                               InsetMathGrid::doDispatch(cur, cmd);
+                               return;
+                       }
+               } else {
+                       InsetMathGrid::doDispatch(cur, cmd);
+                       return;
+               }
+               break;
+
        case LFUN_INSET_INSERT: {
                //lyxerr << "arg: " << to_utf8(cmd.argument()) << endl;
                // FIXME: this should be cleaned up to use InsetLabel methods directly.
                string const name = cmd.getArg(0);
                if (name == "label") {
                        InsetCommandParams p(LABEL_CODE);
-                       InsetCommandMailer::string2params(name, to_utf8(cmd.argument()), p);
+                       InsetCommand::string2params(name, to_utf8(cmd.argument()), p);
                        docstring str = p["name"];
                        cur.recordUndoInset();
                        row_type const r = (type_ == hullMultline) ? nrows() - 1 : cur.row();
@@ -1255,7 +1298,7 @@ bool InsetMathHull::getStatus(Cursor & cur, FuncRequest const & cmd,
        case LFUN_FINISHED_LEFT:
        case LFUN_UP:
        case LFUN_DOWN:
-       case LFUN_NEW_LINE:
+       case LFUN_NEWLINE_INSERT:
        case LFUN_MATH_EXTERN:
        case LFUN_MATH_MUTATE:
        case LFUN_MATH_DISPLAY:
@@ -1271,8 +1314,10 @@ bool InsetMathHull::getStatus(Cursor & cur, FuncRequest const & cmd,
        case LFUN_MATH_NUMBER_LINE_TOGGLE: {
                // FIXME: what is the right test, this or the one of
                // LABEL_INSERT?
-               status.enabled(display());
+               bool const enable = (type_ == hullMultline) ?
+                       (nrows() - 1 == cur.row()) : display();
                row_type const r = (type_ == hullMultline) ? nrows() - 1 : cur.row();
+               status.enabled(enable);
                status.setOnOff(numbered(r));
                return true;
        }
@@ -1353,7 +1398,7 @@ void InsetMathHull::mutateToText()
 #if 0
        // translate to latex
        ostringstream os;
-       latex(NULL, os, false, false);
+       latex(os, false, false);
        string str = os.str();
 
        // insert this text
@@ -1428,7 +1473,7 @@ void InsetMathHull::revealCodes(Cursor & cur) const
        // translate to latex
        cur.markInsert(bv);
        ostringstream os;
-       write(NULL, os);
+       write(os);
        string str = os.str();
        cur.markErase(bv);
        string::size_type pos = 0;
@@ -1605,4 +1650,10 @@ void InsetMathHull::textString(odocstream & os) const
 }
 
 
+docstring InsetMathHull::contextMenu(BufferView const &, int, int) const
+{
+       return from_ascii("context-math");
+}
+
+
 } // namespace lyx