]> git.lyx.org Git - lyx.git/blobdiff - src/insets/InsetTabular.cpp
* InsetTabular.{cpp, h}:
[lyx.git] / src / insets / InsetTabular.cpp
index 2678cd9d76d50040c2e1a1652790a99a3f122c16..e8db353e8e75135fa53c48e2b7948425cabac7b6 100644 (file)
@@ -38,6 +38,7 @@
 #include "LyXRC.h"
 #include "MetricsInfo.h"
 #include "OutputParams.h"
+#include "output_xhtml.h"
 #include "Paragraph.h"
 #include "ParagraphParameters.h"
 #include "ParIterator.h"
@@ -2632,6 +2633,74 @@ int Tabular::docbook(odocstream & os, OutputParams const & runparams) const
 }
 
 
+docstring Tabular::xhtmlRow(XHTMLStream & xs, row_type row,
+                          OutputParams const & runparams) const
+{
+       docstring ret;
+       idx_type cell = getFirstCellInRow(row);
+
+       xs << html::StartTag("tr");
+       for (col_type j = 0; j < column_info.size(); ++j) {
+               if (isPartOfMultiColumn(row, j))
+                       continue;
+
+               stringstream attr;
+               attr << "align='";
+               switch (getAlignment(cell)) {
+               case LYX_ALIGN_LEFT:
+                       attr << "left";
+                       break;
+               case LYX_ALIGN_RIGHT:
+                       attr << "right";
+                       break;
+               default:
+                       attr << "center";
+                       break;
+               }
+               attr << "'";
+               attr << " valign='";
+               switch (getVAlignment(cell)) {
+               case LYX_VALIGN_TOP:
+                       attr << "top";
+                       break;
+               case LYX_VALIGN_BOTTOM:
+                       attr << "bottom";
+                       break;
+               case LYX_VALIGN_MIDDLE:
+                       attr << "middle";
+               }
+               attr << "'";
+
+               if (isMultiColumn(cell))
+                       attr << " colspan='" << columnSpan(cell) << "'";
+
+               xs << html::StartTag("td", attr.str());
+               ret += cellInset(cell)->xhtml(xs, runparams);
+               xs << html::EndTag("td");
+               ++cell;
+       }
+       xs << html::EndTag("tr");
+       return ret;
+}
+
+
+docstring Tabular::xhtml(XHTMLStream & xs, OutputParams const & runparams) const
+{
+       docstring ret;
+       // It's unclear to me if we need to mess with the long table stuff. 
+       // We can borrow that too from docbook, if so.
+
+       xs << html::StartTag("tbody");
+       for (row_type i = 0; i < row_info.size(); ++i) {
+               if (isValidRow(i)) {
+                       ret += xhtmlRow(xs, i, runparams);
+               }
+       }
+       xs << html::EndTag("tbody");
+       return ret;
+}
+
+
 bool Tabular::plaintextTopHLine(odocstream & os, row_type row,
                                   vector<unsigned int> const & clen) const
 {
@@ -2956,6 +3025,14 @@ docstring InsetTableCell::asString(bool intoInsets)
 }
 
 
+docstring InsetTableCell::xhtml(XHTMLStream & xs, OutputParams const & rp) const
+{
+       if (!isFixedWidth)
+               return InsetText::insetAsXHTML(xs, rp, InsetText::JustText);
+       return InsetText::xhtml(xs, rp);
+}
+
+
 
 /////////////////////////////////////////////////////////////////////
 //
@@ -3314,13 +3391,14 @@ void InsetTabular::edit(Cursor & cur, bool front, EntryDirection)
                cur.pit() = 0;
                cur.pos() = cur.lastpos(); // FIXME crude guess
        }
+       cur.setCurrentFont();
        // FIXME: this accesses the position cache before it is initialized
        //resetPos(cur);
        //cur.bv().fitCursor();
 }
 
 
-void InsetTabular::updateLabels(ParIterator const & it, bool out)
+void InsetTabular::updateLabels(ParIterator const & it, UpdateType utype)
 {
        // In a longtable, tell captions what the current float is
        Counters & cnts = buffer().masterBuffer()->params().documentClass().counters();
@@ -3332,7 +3410,7 @@ void InsetTabular::updateLabels(ParIterator const & it, bool out)
        it2.forwardPos();
        size_t const end = it2.nargs();
        for ( ; it2.idx() < end; it2.top().forwardIdx())
-               buffer().updateLabels(it2, out);
+               buffer().updateLabels(it2, utype);
 
        //reset afterwards
        if (tabular.is_long_tabular)
@@ -3340,6 +3418,16 @@ void InsetTabular::updateLabels(ParIterator const & it, bool out)
 }
 
 
+void InsetTabular::addToToc(DocIterator const & cpit)
+{
+       DocIterator dit = cpit;
+       dit.forwardPos();
+       size_t const end = dit.nargs();
+       for ( ; dit.idx() < end; dit.top().forwardIdx())
+               cell(dit.idx())->addToToc(cpit);
+}
+
+
 void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd)
 {
        LYXERR(Debug::DEBUG, "# InsetTabular::doDispatch: cmd: " << cmd
@@ -3564,6 +3652,7 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd)
                                TextMetrics const & tm =
                                        cur.bv().textMetrics(cell(cur.idx())->getText(0));
                                cur.pos() = tm.x2pos(cur.pit(), 0, cur.targetX());
+                               cur.setCurrentFont();
                        }
                }
                if (sl == cur.top()) {
@@ -3575,6 +3664,7 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd)
                if (cur.selIsMultiCell()) {
                        cur.pit() = cur.lastpit();
                        cur.pos() = cur.lastpos();
+                       cur.setCurrentFont();
                        return;
                }
                break;
@@ -3597,6 +3687,7 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd)
                                ParagraphMetrics const & pm =
                                        tm.parMetrics(cur.lastpit());
                                cur.pos() = tm.x2pos(cur.pit(), pm.rows().size()-1, cur.targetX());
+                               cur.setCurrentFont();
                        }
                }
                if (sl == cur.top()) {
@@ -3606,6 +3697,7 @@ void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd)
                if (cur.selIsMultiCell()) {
                        cur.pit() = 0;
                        cur.pos() = cur.lastpos();
+                       cur.setCurrentFont();
                        return;
                }
                break;
@@ -4218,9 +4310,29 @@ int InsetTabular::docbook(odocstream & os, OutputParams const & runparams) const
 }
 
 
+docstring InsetTabular::xhtml(XHTMLStream & xs, OutputParams const & rp) const
+{
+       // FIXME XHTML
+       // It'd be better to be able to get this from an InsetLayout, but at present
+       // InsetLayouts do not seem really to work for things that aren't InsetTexts.
+       xs << html::StartTag("table");
+       docstring ret = tabular.xhtml(xs, rp);
+       xs << html::EndTag("table");
+       return ret;
+}
+
+
 void InsetTabular::validate(LaTeXFeatures & features) const
 {
        tabular.validate(features);
+       // FIXME XHTML
+       // It'd be better to be able to get this from an InsetLayout, but at present
+       // InsetLayouts do not seem really to work for things that aren't InsetTexts.
+       if (features.runparams().flavor == OutputParams::HTML)
+               features.addPreambleSnippet("<style type=\"text/css\">\n"
+      "table { border: 1px solid black; display: inline-block; }\n"
+      "td { border: 1px solid black; padding: 0.5ex; }\n"
+      "</style>");
 }
 
 
@@ -4423,7 +4535,7 @@ void InsetTabular::moveNextCell(Cursor & cur, EntryDirection entry_from)
                break;
 
        }
-
+       cur.setCurrentFont();
        resetPos(cur);
 }
 
@@ -4473,7 +4585,7 @@ void InsetTabular::movePrevCell(Cursor & cur, EntryDirection entry_from)
                break;
 
        }
-
+       cur.setCurrentFont();
        resetPos(cur);
 }