]> git.lyx.org Git - lyx.git/blobdiff - src/mathed/InsetMathHull.cpp
Another warning.
[lyx.git] / src / mathed / InsetMathHull.cpp
index ae9511051cae6ccd5029c8d0e7f7ffa3b4c0f452..6bbd83a931653a17a0522ab6f105c0840b8f41d5 100644 (file)
@@ -141,7 +141,7 @@ docstring hullName(HullType type)
 static InsetLabel * dummy_pointer = 0;
 
 InsetMathHull::InsetMathHull(Buffer * buf)
-       : InsetMathGrid(buf, 1, 1), type_(hullNone), nonum_(1, false),
+       : InsetMathGrid(buf, 1, 1), type_(hullNone), numbered_(1, true),
          label_(1, dummy_pointer), preview_(new RenderPreview(this))
 {
        //lyxerr << "sizeof InsetMath: " << sizeof(InsetMath) << endl;
@@ -155,7 +155,7 @@ InsetMathHull::InsetMathHull(Buffer * buf)
 
 
 InsetMathHull::InsetMathHull(Buffer * buf, HullType type)
-       : InsetMathGrid(buf, getCols(type), 1), type_(type), nonum_(1, false),
+       : InsetMathGrid(buf, getCols(type), 1), type_(type), numbered_(1, true),
          label_(1, dummy_pointer), preview_(new RenderPreview(this))
 {
        buffer_ = buf;
@@ -189,7 +189,7 @@ InsetMathHull & InsetMathHull::operator=(InsetMathHull const & other)
                return *this;
        InsetMathGrid::operator=(other);
        type_  = other.type_;
-       nonum_ = other.nonum_;
+       numbered_ = other.numbered_;
        buffer_ = other.buffer_;
        for (size_t i = 0; i < label_.size(); ++i)
                delete label_[i];
@@ -244,7 +244,7 @@ void InsetMathHull::addToToc(DocIterator const & pit)
        Toc & toc = buffer().tocBackend().toc("equation");
 
        for (row_type row = 0; row != nrows(); ++row) {
-               if (nonum_[row])
+               if (!numbered_[row])
                        continue;
                if (label_[row])
                        label_[row]->addToToc(pit);
@@ -329,18 +329,16 @@ docstring InsetMathHull::standardFont() const
 }
 
 
-docstring InsetMathHull::standardColor() const
+ColorCode InsetMathHull::standardColor() const
 {
-       docstring color;
+       ColorCode color;
        switch (type_) {
        case hullRegexp:
-               color = from_ascii("foreground");
-               break;
        case hullNone:
-               color = from_ascii("foreground");
+               color = Color_foreground;
                break;
        default:
-               color = from_ascii("math");
+               color = Color_math;
        }
        return color;
 }
@@ -435,8 +433,10 @@ void InsetMathHull::draw(PainterInfo & pi, int x, int y) const
                return;
        }
 
+       ColorCode color = pi.selected && lyxrc.use_system_colors
+                               ? Color_selectiontext : standardColor();
        bool const really_change_color = pi.base.font.color() == Color_none;
-       ColorChanger dummy0(pi.base.font, standardColor(), really_change_color);
+       ColorChanger dummy0(pi.base.font, color, really_change_color);
        FontSetChanger dummy1(pi.base, standardFont());
        StyleChanger dummy2(pi.base, display() ? LM_ST_DISPLAY : LM_ST_TEXT);
 
@@ -605,8 +605,8 @@ void InsetMathHull::label(row_type row, docstring const & label)
 
 void InsetMathHull::numbered(row_type row, bool num)
 {
-       nonum_[row] = !num;
-       if (nonum_[row] && label_[row]) {
+       numbered_[row] = num;
+       if (!numbered_[row] && label_[row]) {
                delete label_[row];
                label_[row] = 0;
        }
@@ -615,7 +615,7 @@ void InsetMathHull::numbered(row_type row, bool num)
 
 bool InsetMathHull::numbered(row_type row) const
 {
-       return !nonum_[row];
+       return numbered_[row];
 }
 
 
@@ -649,7 +649,7 @@ bool InsetMathHull::numberedType() const
        if (type_ == hullRegexp)
                return false;
        for (row_type row = 0; row < nrows(); ++row)
-               if (!nonum_[row])
+               if (numbered_[row])
                        return true;
        return false;
 }
@@ -737,7 +737,7 @@ void InsetMathHull::header_write(WriteStream & os) const
                break;
 
        default:
-               os << "\\begin{unknown" << star(n) << '}';
+               os << "\\begin{unknown" << star(n) << "}\n";
                break;
        }
 }
@@ -758,9 +758,9 @@ void InsetMathHull::footer_write(WriteStream & os) const
 
        case hullEquation:
                if (n)
-                       os << "\\end{equation" << star(n) << "}\n";
+                       os << "\n\\end{equation" << star(n) << "}\n";
                else
-                       os << "\\]\n";
+                       os << "\n\\]\n";
                break;
 
        case hullEqnArray:
@@ -770,11 +770,11 @@ void InsetMathHull::footer_write(WriteStream & os) const
        case hullXAlignAt:
        case hullGather:
        case hullMultline:
-               os << "\\end{" << hullName(type_) << star(n) << "}\n";
+               os << "\n\\end{" << hullName(type_) << star(n) << "}\n";
                break;
 
        case hullXXAlignAt:
-               os << "\\end{" << hullName(type_) << "}\n";
+               os << "\n\\end{" << hullName(type_) << "}\n";
                break;
 
        case hullRegexp:
@@ -782,7 +782,7 @@ void InsetMathHull::footer_write(WriteStream & os) const
                break;
 
        default:
-               os << "\\end{unknown" << star(n) << '}';
+               os << "\n\\end{unknown" << star(n) << "}\n";
                break;
        }
 }
@@ -815,13 +815,13 @@ void InsetMathHull::addRow(row_type row)
        docstring lab;
        if (type_ == hullMultline) {
                if (row + 1 == nrows())  {
-                       nonum_[row] = true;
+                       numbered_[row] = false;
                        lab = label(row);
                } else
                        numbered = false;
        }
 
-       nonum_.insert(nonum_.begin() + row + 1, !numbered);
+       numbered_.insert(numbered_.begin() + row + 1, numbered);
        label_.insert(label_.begin() + row + 1, dummy_pointer);
        if (!lab.empty())
                label(row + 1, lab);
@@ -838,11 +838,11 @@ void InsetMathHull::swapRow(row_type row)
        // 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]);
+       //      swap(numbered_[row], numbered_[row + 1]);
        // so we do it manually:
-       bool const b = nonum_[row];
-       nonum_[row] = nonum_[row + 1];
-       nonum_[row + 1] = b;
+       bool const b = numbered_[row];
+       numbered_[row] = numbered_[row + 1];
+       numbered_[row + 1] = b;
        swap(label_[row], label_[row + 1]);
        InsetMathGrid::swapRow(row);
 }
@@ -853,9 +853,9 @@ 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;
+               bool const b = numbered_[row - 1];
+               numbered_[row - 1] = numbered_[row];
+               numbered_[row] = b;
                swap(label_[row - 1], label_[row]);
                InsetMathGrid::delRow(row);
                return;
@@ -865,7 +865,7 @@ void InsetMathHull::delRow(row_type row)
        // Test nrows() + 1 because we have already erased the row.
        if (row == nrows() + 1)
                row--;
-       nonum_.erase(nonum_.begin() + row);
+       numbered_.erase(numbered_.begin() + row);
        delete label_[row];
        label_.erase(label_.begin() + row);
 }
@@ -889,7 +889,7 @@ void InsetMathHull::delCol(col_type col)
 
 docstring InsetMathHull::nicelabel(row_type row) const
 {
-       if (nonum_[row])
+       if (!numbered_[row])
                return docstring();
        if (!label_[row])
                return from_ascii("(#)");
@@ -897,12 +897,24 @@ docstring InsetMathHull::nicelabel(row_type row) const
 }
 
 
-void InsetMathHull::glueall()
+void InsetMathHull::glueall(HullType type)
 {
        MathData ar;
        for (idx_type i = 0; i < nargs(); ++i)
                ar.append(cell(i));
+       InsetLabel * label = 0;
+       if (type == hullEquation) {
+               // preserve first non-empty label
+               for (row_type row = 0; row < nrows(); ++row) {
+                       if (label_[row]) {
+                               label = label_[row];
+                               label_[row] = 0;
+                               break;
+                       }
+               }
+       }
        *this = InsetMathHull(buffer_, hullSimple);
+       label_[0] = label;
        cell(0) = ar;
        setDefaults();
 }
@@ -1013,7 +1025,7 @@ void InsetMathHull::mutate(HullType newtype)
                        numbered(0, false);
                } else {
                        setType(hullEquation);
-                       numbered(0, false);
+                       numbered(0, label_[0] ? true : false);
                        mutate(newtype);
                }
        }
@@ -1039,24 +1051,7 @@ void InsetMathHull::mutate(HullType newtype)
 
        else if (type_ == hullEqnArray) {
                if (newtype < type_) {
-                       // set correct (no)numbering
-                       nonum_[0] = true;
-                       for (row_type row = 0; row < nrows(); ++row) {
-                               if (!nonum_[row]) {
-                                       nonum_[0] = false;
-                                       break;
-                               }
-                       }
-
-                       // set first non-empty label
-                       for (row_type row = 0; row < nrows(); ++row) {
-                               if (label_[row]) {
-                                       label_[0] = label_[row];
-                                       break;
-                               }
-                       }
-
-                       glueall();
+                       glueall(newtype);
                        mutate(newtype);
                } else { // align & Co.
                        changeCols(2);
@@ -1125,19 +1120,23 @@ void InsetMathHull::mutate(HullType newtype)
 }
 
 
-docstring InsetMathHull::eolString(row_type row, bool fragile, bool last_eoln) const
+docstring InsetMathHull::eolString(row_type row, bool fragile, bool latex,
+               bool last_eoln) const
 {
        docstring res;
        if (numberedType()) {
-               if (label_[row] && !nonum_[row])
-                       res += "\\label{" +
-                           escape(label_[row]->getParam("name")) + '}';
-               if (nonum_[row] && (type_ != hullMultline))
+               if (label_[row] && numbered_[row]) {
+                       docstring const name =
+                               latex ? escape(label_[row]->getParam("name"))
+                                     : label_[row]->getParam("name");
+                       res += "\\label{" + name + '}';
+               }
+               if (!numbered_[row] && (type_ != hullMultline))
                        res += "\\nonumber ";
        }
        // Never add \\ on the last empty line of eqnarray and friends
        last_eoln = false;
-       return res + InsetMathGrid::eolString(row, fragile, last_eoln);
+       return res + InsetMathGrid::eolString(row, fragile, latex, last_eoln);
 }
 
 
@@ -1172,7 +1171,7 @@ void InsetMathHull::infoize(odocstream & os) const
 
 void InsetMathHull::check() const
 {
-       LASSERT(nonum_.size() == nrows(), /**/);
+       LASSERT(numbered_.size() == nrows(), /**/);
        LASSERT(label_.size() == nrows(), /**/);
 }
 
@@ -1323,7 +1322,7 @@ void InsetMathHull::doDispatch(Cursor & cur, FuncRequest & cmd)
 
                InsetCommandParams p(LABEL_CODE);
                p["name"] = cmd.argument().empty() ? old_label : cmd.argument();
-               string const data = InsetCommand::params2string("label", p);
+               string const data = InsetCommand::params2string(p);
 
                if (cmd.argument().empty())
                        cur.bv().showDialog("label", data);
@@ -1344,7 +1343,7 @@ void InsetMathHull::doDispatch(Cursor & cur, FuncRequest & cmd)
                        // if there is an argument, find the corresponding label, else
                        // check whether there is at least one label.
                        for (row = 0; row != nrows(); ++row)
-                               if (!nonum_[row] && label_[row]
+                               if (numbered_[row] && label_[row]
                                          && (cmd.argument().empty() || label(row) == cmd.argument()))
                                        break;
                }
@@ -1387,7 +1386,7 @@ void InsetMathHull::doDispatch(Cursor & cur, FuncRequest & cmd)
                string const name = cmd.getArg(0);
                if (name == "label") {
                        InsetCommandParams p(LABEL_CODE);
-                       InsetCommand::string2params(name, to_utf8(cmd.argument()), p);
+                       InsetCommand::string2params(to_utf8(cmd.argument()), p);
                        docstring str = p["name"];
                        cur.recordUndoInset();
                        row_type const r = (type_ == hullMultline) ? nrows() - 1 : cur.row();
@@ -1508,12 +1507,12 @@ bool InsetMathHull::getStatus(Cursor & cur, FuncRequest const & cmd,
                        // if there is no argument and we're inside math, we retrieve
                        // the row number from the cursor position.
                        row = (type_ == hullMultline) ? nrows() - 1 : cur.row();
-                       enabled = numberedType() && label_[row] && !nonum_[row];
+                       enabled = numberedType() && label_[row] && numbered_[row];
                } else {
                        // if there is an argument, find the corresponding label, else
                        // check whether there is at least one label.
                        for (row_type row = 0; row != nrows(); ++row) {
-                               if (!nonum_[row] && label_[row] && 
+                               if (numbered_[row] && label_[row] && 
                                        (cmd.argument().empty() || label(row) == cmd.argument())) {
                                                enabled = true;
                                                break;
@@ -1854,37 +1853,55 @@ int InsetMathHull::docbook(odocstream & os, OutputParams const & runparams) cons
 
 docstring InsetMathHull::xhtml(XHTMLStream & xs, OutputParams const & op) const
 {
-       BufferParams::MathOutput mathtype = buffer().params().html_math_output;
+       BufferParams::MathOutput const mathtype = 
+               buffer().params().html_math_output;
        
+       bool success = false;
        // FIXME Eventually we would like to do this inset by inset.
-       switch (mathtype) {
-       case BufferParams::MathML: {
+       if (mathtype == BufferParams::MathML) {
                odocstringstream os;
                MathStream ms(os);
-               InsetMathGrid::mathmlize(ms);
-               if (getType() == hullSimple)
-                       xs << html::StartTag("math", 
-                             "xmlns=\"http://www.w3.org/1998/Math/MathML\"", true);
-               else 
-                       xs << html::StartTag("math", 
-                             "display=\"block\" xmlns=\"http://www.w3.org/1998/Math/MathML\"", true);
-               xs << XHTMLStream::NextRaw() 
-                  << os.str()
-                  << html::EndTag("math");
-               break;
-       } 
-       case BufferParams::HTML: {
+               try {
+                       InsetMathGrid::mathmlize(ms);
+                       success = true;
+               } catch (MathExportException const &) {}
+               if (success) {
+                       if (getType() == hullSimple)
+                               xs << html::StartTag("math", 
+                                                       "xmlns=\"http://www.w3.org/1998/Math/MathML\"", true);
+                       else 
+                               xs << html::StartTag("math", 
+                                                       "display=\"block\" xmlns=\"http://www.w3.org/1998/Math/MathML\"", true);
+                       xs << XHTMLStream::NextRaw() 
+                                << os.str()
+                                << html::EndTag("math");
+               }
+       } else if (mathtype == BufferParams::HTML) {
                odocstringstream os;
                HtmlStream ms(os);
-               InsetMathGrid::htmlize(ms);
-               string const tag = (getType() == hullSimple) ? "span" : "div";
-               xs << html::StartTag(tag, "class='formula'", true)
-                  << XHTMLStream::NextRaw()
-                  << os.str()
-                  << html::EndTag(tag);
-               break;
-       } 
-       case BufferParams::Images: {
+               try {
+                       InsetMathGrid::htmlize(ms);
+                       success = true;
+               } catch (MathExportException const &) {}
+               if (success) {
+                       string const tag = (getType() == hullSimple) ? "span" : "div";
+                       xs << html::StartTag(tag, "class='formula'", true)
+                                << XHTMLStream::NextRaw()
+                                << os.str()
+                                << html::EndTag(tag);
+               }
+       }
+       
+       // what we actually want is this:
+       // if (
+       //     ((mathtype == BufferParams::MathML || mathtype == BufferParams::HTML) 
+       //       && !success)
+       //     || mathtype == BufferParams::Images
+       //    )
+       // but what follows is equivalent, since we'll enter only if either (a) we 
+       // tried and failed with MathML or HTML or (b) didn't try yet at all but
+       // aren't doing LaTeX, in which case we are doing Images.
+       if (!success && mathtype != BufferParams::LaTeX) {
                loadPreview(docit_);
                graphics::PreviewImage const * pimage = preview_->getPreviewImage(buffer());
                if (pimage) {
@@ -1897,11 +1914,14 @@ docstring InsetMathHull::xhtml(XHTMLStream & xs, OutputParams const & op) const
                        xs.cr();
                        // add the file to the list of files to be exported
                        op.exportdata->addExternalFile("xhtml", mathimg);
-                       break;
+                       success = true;
                }
-               LYXERR0("Unable to generate image. Falling through to LaTeX output.");
-       } 
-       case BufferParams::LaTeX: {
+       }
+       
+       // so we'll pass this test if we've failed everything else, or
+       // if mathtype was LaTeX, since we won't have entered any of the
+       // earlier branches
+       if (!success /* || mathtype != BufferParams::LaTeX */) {
                string const tag = (getType() == hullSimple) ? "span" : "div";
                // Unfortunately, we cannot use latexString() because we do not want
                // $...$ or whatever.
@@ -1920,7 +1940,6 @@ docstring InsetMathHull::xhtml(XHTMLStream & xs, OutputParams const & op) const
                   << html::EndTag(tag);
                xs.cr();
        }
-       } // end switch
        return docstring();
 }