]> git.lyx.org Git - lyx.git/blobdiff - src/mathed/InsetMathHull.cpp
add busy.gif to resources (in line with cmake)
[lyx.git] / src / mathed / InsetMathHull.cpp
index 8129508774b50f650424f646a49d7fba9b518c12..f06f7eba22204005958d69e93843dc6d1925238e 100644 (file)
@@ -224,6 +224,12 @@ void InsetMathHull::setBuffer(Buffer & buffer)
 }
 
 
+namespace {
+       const char * counters_to_save[] = {"section", "chapter"};
+       unsigned int const numcnts = sizeof(counters_to_save)/sizeof(char *);
+}
+
+
 void InsetMathHull::updateBuffer(ParIterator const & it, UpdateType utype)
 {
        if (!buffer_) {
@@ -233,18 +239,40 @@ void InsetMathHull::updateBuffer(ParIterator const & it, UpdateType utype)
                return;
        }
 
-       BufferParams const & bp = buffer_->params();
-       string const & lang = it->getParLanguage(bp)->code();
-       Counters & cnts = bp.documentClass().counters();
-       // so we don't have to write it ten times...
-       docstring const eqstr = from_ascii("equation");
+       // if any of the equations are numbered, then we want to save the values
+       // of some of the counters.
+       if (haveNumbers()) {
+               BufferParams const & bp = buffer_->params();
+               string const & lang = it->getParLanguage(bp)->code();
+               Counters & cnts = bp.documentClass().counters();
+
+               // right now, we only need to do this at export time
+               if (utype == OutputUpdate) {
+                       for (size_t i = 0; i < numcnts; ++i) {
+                               docstring const cnt = from_ascii(counters_to_save[i]);
+                               if (cnts.hasCounter(cnt))
+                                       counter_map[cnt] = cnts.value(cnt);
+                       }
+               }
+
+               // this has to be done separately
+               docstring const eqstr = from_ascii("equation");
+               if (cnts.hasCounter(eqstr)) {
+                       if (utype == OutputUpdate) {
+                               counter_map[eqstr] = cnts.value(eqstr);
+                       LYXERR0(counter_map[eqstr]);}
+                       for (size_t i = 0; i != label_.size(); ++i) {
+                               if (numbered(i)) {
+                                       cnts.step(eqstr, utype);
+                                       numbers_[i] = cnts.theCounter(eqstr, lang);
+                               } else
+                                       numbers_[i] = empty_docstring();
+                       }
+               }
+       }
 
+       // now the labels
        for (size_t i = 0; i != label_.size(); ++i) {
-               if (numbered(i) && cnts.hasCounter(eqstr)) {
-                       cnts.step(eqstr, utype);
-                       numbers_[i] = cnts.theCounter(eqstr, lang);
-               } else
-                       numbers_[i] = empty_docstring();
                if (label_[i])
                        label_[i]->updateBuffer(it, utype);
        }
@@ -253,7 +281,7 @@ void InsetMathHull::updateBuffer(ParIterator const & it, UpdateType utype)
 }
 
 
-void InsetMathHull::addToToc(DocIterator const & pit)
+void InsetMathHull::addToToc(DocIterator const & pit) const
 {
        if (!buffer_) {
                //FIXME: buffer_ should be set at creation for this inset! Problem is
@@ -561,7 +589,29 @@ void InsetMathHull::preparePreview(DocIterator const & pos,
                }
        }
 
-       docstring const snippet = macro_preamble.str() + latexString(*this);
+       docstring setcnt;
+       if (forexport && haveNumbers()) {
+               docstring eqstr = from_ascii("equation");
+               CounterMap::const_iterator it = counter_map.find(eqstr);
+               if (it != counter_map.end()) {
+                       int num = it->second;
+                       if (num >= 0)
+                               setcnt += from_ascii("\\setcounter{") + eqstr + '}' +
+                                         '{' + convert<docstring>(num) + '}' + '\n';
+               }
+               for (size_t i = 0; i != numcnts; ++i) {
+                       docstring cnt = from_ascii(counters_to_save[i]);
+                       it = counter_map.find(cnt);
+                       if (it == counter_map.end())
+                                       continue;
+                       int num = it->second;
+                       if (num > 0)
+                               setcnt += from_ascii("\\setcounter{") + cnt + '}' +
+                                         '{' + convert<docstring>(num) + '}';
+               }
+       }
+       docstring const snippet = macro_preamble.str() +
+           setcnt + latexString(*this);
        LYXERR(Debug::MACROS, "Preview snippet: " << snippet);
        preview_->addPreview(snippet, *buffer, forexport);
 }
@@ -729,9 +779,9 @@ void InsetMathHull::header_write(WriteStream & os) const
 
        case hullEquation:
                if (n)
-                       os << "\\begin{equation" << star(n) << "}\n";
+                       os << "\n\\begin{equation" << star(n) << "}\n";
                else
-                       os << "\\[\n";
+                       os << "\n\\[\n";
                break;
 
        case hullEqnArray:
@@ -739,17 +789,17 @@ void InsetMathHull::header_write(WriteStream & os) const
        case hullFlAlign:
        case hullGather:
        case hullMultline:
-               os << "\\begin{" << hullName(type_) << star(n) << "}\n";
+               os << "\n\\begin{" << hullName(type_) << star(n) << "}\n";
                break;
 
        case hullAlignAt:
        case hullXAlignAt:
-               os << "\\begin{" << hullName(type_) << star(n) << '}'
+               os << "\n\\begin{" << hullName(type_) << star(n) << '}'
                  << '{' << static_cast<unsigned int>((ncols() + 1)/2) << "}\n";
                break;
 
        case hullXXAlignAt:
-               os << "\\begin{" << hullName(type_) << '}'
+               os << "\n\\begin{" << hullName(type_) << '}'
                  << '{' << static_cast<unsigned int>((ncols() + 1)/2) << "}\n";
                break;
 
@@ -758,7 +808,7 @@ void InsetMathHull::header_write(WriteStream & os) const
                break;
 
        default:
-               os << "\\begin{unknown" << star(n) << "}\n";
+               os << "\n\\begin{unknown" << star(n) << "}\n";
                break;
        }
 }
@@ -1344,8 +1394,6 @@ void InsetMathHull::doDispatch(Cursor & cur, FuncRequest & cmd)
                cur.recordUndoInset();
                row_type r = (type_ == hullMultline) ? nrows() - 1 : cur.row();
                docstring old_label = label(r);
-               // FIXME refstyle
-               // Allow customization of this separator
                docstring const default_label = from_ascii("eq:");
                if (old_label.empty())
                        old_label = default_label;
@@ -1872,6 +1920,7 @@ int InsetMathHull::docbook(odocstream & os, OutputParams const & runparams) cons
        ++ms.tab(); ms.cr(); ms.os() << '<' << bname << '>';
 
        odocstringstream ls;
+       otexstream ols(ls);
        if (runparams.flavor == OutputParams::XML) {
                ms << MTag("alt role='tex' ");
                // Workaround for db2latex: db2latex always includes equations with
@@ -1888,7 +1937,7 @@ int InsetMathHull::docbook(odocstream & os, OutputParams const & runparams) cons
                ms << ETag("math");
        } else {
                ms << MTag("alt role='tex'");
-               res = latex(ls, runparams);
+               res = latex(ols, runparams);
                ms << from_utf8(subst(subst(to_utf8(ls.str()), "&", "&amp;"), "<", "&lt;"));
                ms << ETag("alt");
        }
@@ -1910,10 +1959,7 @@ int InsetMathHull::docbook(odocstream & os, OutputParams const & runparams) cons
 }
 
 
-// this duplicates code from InsetMathGrid, but
-// we need access here to label and number information,
-// and we simply do not have that in InsetMathGrid.
-void InsetMathHull::mathmlize(MathStream & os) const
+bool InsetMathHull::haveNumbers() const
 {
        bool havenumbers = false;
        for (size_t i = 0; i != numbered_.size(); ++i) {
@@ -1922,6 +1968,53 @@ void InsetMathHull::mathmlize(MathStream & os) const
                        break;
                }
        }
+       return havenumbers;
+}
+
+
+// FIXME XHTML
+// We need to do something about alignment here.
+//
+// This duplicates code from InsetMathGrid, but
+// we need access here to number information,
+// and we simply do not have that in InsetMathGrid.
+void InsetMathHull::htmlize(HtmlStream & os) const
+{
+       bool const havenumbers = haveNumbers();
+       bool const havetable = havenumbers || nrows() > 1 || ncols() > 1;
+
+       if (!havetable) {
+               os << cell(index(0, 0));
+               return;
+       }
+
+       os << MTag("table", "class='mathtable'");
+       for (row_type row = 0; row < nrows(); ++row) {
+               os << MTag("tr");
+               for (col_type col = 0; col < ncols(); ++col) {
+                       os << MTag("td");
+                       os << cell(index(row, col));
+                       os << ETag("td");
+               }
+               if (havenumbers) {
+                       os << MTag("td");
+                       docstring const & num = numbers_[row];
+                       if (!num.empty())
+                               os << '(' << num << ')';
+                 os << ETag("td");
+               }
+               os << ETag("tr");
+       }
+       os << ETag("table");
+}
+
+
+// this duplicates code from InsetMathGrid, but
+// we need access here to number information,
+// and we simply do not have that in InsetMathGrid.
+void InsetMathHull::mathmlize(MathStream & os) const
+{
+       bool const havenumbers = haveNumbers();
        bool const havetable = havenumbers || nrows() > 1 || ncols() > 1;
 
        if (havetable)
@@ -1955,12 +2048,54 @@ void InsetMathHull::mathmlize(MathStream & os) const
 }
 
 
+void InsetMathHull::mathAsLatex(WriteStream & os) const
+{
+       MathEnsurer ensurer(os, false);
+       bool havenumbers = haveNumbers();
+       bool const havetable = havenumbers || nrows() > 1 || ncols() > 1;
+
+       if (!havetable) {
+               os << cell(index(0, 0));
+               return;
+       }
+
+       os << "<table class='mathtable'>";
+       for (row_type row = 0; row < nrows(); ++row) {
+               os << "<tr>";
+               for (col_type col = 0; col < ncols(); ++col) {
+                       os << "<td class='math'>";
+                       os << cell(index(row, col));
+                       os << "</td>";
+               }
+               if (havenumbers) {
+                       os << "<td>";
+                       docstring const & num = numbers_[row];
+                       if (!num.empty())
+                               os << '(' << num << ')';
+                 os << "</td>";
+               }
+               os << "</tr>";
+       }
+       os << "</table>";
+}
+
+
 docstring InsetMathHull::xhtml(XHTMLStream & xs, OutputParams const & op) const
 {
        BufferParams::MathOutput const mathtype = 
                buffer().params().html_math_output;
-       
+
        bool success = false;
+
+       // we output all the labels just at the beginning of the equation.
+       // this should be fine.
+       for (size_t i = 0; i != label_.size(); ++i) {
+               InsetLabel const * const il = label_[i];
+               if (!il)
+                       continue;
+               il->xhtml(xs, op);
+       }
+
        // FIXME Eventually we would like to do this inset by inset.
        if (mathtype == BufferParams::MathML) {
                odocstringstream os;
@@ -1984,7 +2119,7 @@ docstring InsetMathHull::xhtml(XHTMLStream & xs, OutputParams const & op) const
                odocstringstream os;
                HtmlStream ms(os);
                try {
-                       InsetMathGrid::htmlize(ms);
+                       htmlize(ms);
                        success = true;
                } catch (MathExportException const &) {}
                if (success) {
@@ -2026,20 +2161,21 @@ docstring InsetMathHull::xhtml(XHTMLStream & xs, OutputParams const & op) const
        // 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.
                odocstringstream ls;
                WriteStream wi(ls, false, true, WriteStream::wsPreview);
                ModeSpecifier specifier(wi, MATH_MODE);
-               InsetMathGrid::write(wi);
+               mathAsLatex(wi);
                docstring const latex = ls.str();
                
                // class='math' allows for use of jsMath
                // http://www.math.union.edu/~dpvc/jsMath/
                // FIXME XHTML
                // probably should allow for some kind of customization here
-               xs << html::StartTag(tag, "class='math'") 
+               string const tag = (getType() == hullSimple) ? "span" : "div";
+               xs << html::StartTag(tag, "class='math'")
+                  << XHTMLStream::ESCAPE_AND
                   << latex 
                   << html::EndTag(tag);
                xs.cr();