#include "MathStream.h"
#include "MetricsInfo.h"
+#include "Buffer.h"
#include "BufferView.h"
#include "CutAndPaste.h"
#include "FuncStatus.h"
}
+void InsetMathGrid::updateBuffer(ParIterator const & it, UpdateType utype)
+{
+ // pass down
+ for (idx_type idx = 0; idx < nargs(); ++idx)
+ cell(idx).updateBuffer(it, utype);
+}
+
+
docstring InsetMathGrid::eolString(row_type row, bool fragile) const
{
docstring eol;
}
-// FIXME We might want to check here if we actually have any
-// kind of table structure, and only output the surrounding
-// tags if we do, otherwise just outputting <mrow>.
void InsetMathGrid::mathmlize(MathStream & os) const
{
- os << MTag("mtable");
+ bool const havetable = nrows() > 1 || ncols() > 1;
+ if (havetable)
+ os << MTag("mtable");
+ char const * const celltag = havetable ? "mtd" : "mrow";
for (row_type row = 0; row < nrows(); ++row) {
- os << MTag("mtr");
- for (col_type col = 0; col < ncols(); ++col)
+ if (havetable)
+ os << MTag("mtr");;
+ for (col_type col = 0; col < ncols(); ++col) {
+ os << MTag(celltag);
os << cell(index(row, col));
- os << ETag("mtr");
+ os << ETag(celltag);
+ }
+ if (havetable)
+ os << ETag("mtr");;
}
- os << ETag("mtable");
+ if (havetable)
+ os << ETag("mtable");
+}
+
+
+// FIXME XHTML
+// We need to do something about alignment here.
+void InsetMathGrid::htmlize(HtmlStream & os, string attrib) const
+{
+ bool const havetable = nrows() > 1 || ncols() > 1;
+ if (!havetable) {
+ os << cell(index(0, 0));
+ return;
+ }
+ os << MTag("table", attrib);
+ 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");
+ }
+ os << ETag("tr");;
+ }
+ os << ETag("table");
+}
+
+
+void InsetMathGrid::htmlize(HtmlStream & os) const
+{
+ htmlize(os, "class='mathtable'");
}
docstring eol;
for (row_type row = beg_row; row < end_row; ++row) {
os << verboseHLine(rowinfo_[row].lines_);
- // don't write & and empty cells at end of line
+ // don't write & and empty cells at end of line,
+ // unless there are vertical lines
col_type lastcol = 0;
bool emptyline = true;
for (col_type col = beg_col; col < end_col; ++col)
- if (!cell(index(row, col)).empty()) {
+ if (!cell(index(row, col)).empty()
+ || colinfo_[col + 1].lines_) {
lastcol = col + 1;
emptyline = false;
}
Parse::flags parseflg = Parse::QUIET | Parse::USETEXT;
- switch (cmd.action) {
+ FuncCode const act = cmd.action();
+ switch (act) {
// insert file functions
case LFUN_LINE_DELETE:
break;
}
- case LFUN_TABULAR_FEATURE: {
+ case LFUN_INSET_MODIFY: {
cur.recordUndoInset();
//lyxerr << "handling tabular-feature " << to_utf8(cmd.argument()) << endl;
istringstream is(to_utf8(cmd.argument()));
string s;
is >> s;
+ if (s != "tabular") {
+ InsetMathNest::doDispatch(cur, cmd);
+ return;
+ }
+ is >> s;
if (s == "valign-top")
setVerticalAlignment('t');
else if (s == "valign-middle")
cell(i).append(grid.cell(grid.index(r, c)));
}
cur.clearSelection(); // bug 393
+ // FIXME audit setBuffer/updateBuffer calls
+ cur.inset().setBuffer(*buffer_);
+ // FIXME audit setBuffer/updateBuffer calls
+ cur.buffer()->updateBuffer();
cur.finishUndo();
break;
}
case LFUN_WORD_BACKWARD:
case LFUN_WORD_LEFT_SELECT:
case LFUN_WORD_LEFT:
- cur.selHandle(cmd.action == LFUN_WORD_BACKWARD_SELECT ||
- cmd.action == LFUN_WORD_LEFT_SELECT ||
- cmd.action == LFUN_LINE_BEGIN_SELECT);
+ cur.selHandle(act == LFUN_WORD_BACKWARD_SELECT ||
+ act == LFUN_WORD_LEFT_SELECT ||
+ act == LFUN_LINE_BEGIN_SELECT);
cur.macroModeClose();
if (cur.pos() != 0) {
cur.pos() = 0;
case LFUN_WORD_RIGHT:
case LFUN_LINE_END_SELECT:
case LFUN_LINE_END:
- cur.selHandle(cmd.action == LFUN_WORD_FORWARD_SELECT ||
- cmd.action == LFUN_WORD_RIGHT_SELECT ||
- cmd.action == LFUN_LINE_END_SELECT);
+ cur.selHandle(act == LFUN_WORD_FORWARD_SELECT ||
+ act == LFUN_WORD_RIGHT_SELECT ||
+ act == LFUN_LINE_END_SELECT);
cur.macroModeClose();
cur.clearTargetX();
if (cur.pos() != cur.lastpos()) {
bool InsetMathGrid::getStatus(Cursor & cur, FuncRequest const & cmd,
FuncStatus & status) const
{
- switch (cmd.action) {
- case LFUN_TABULAR_FEATURE: {
- string const s = cmd.getArg(0);
+ switch (cmd.action()) {
+ case LFUN_INSET_MODIFY: {
+ istringstream is(to_utf8(cmd.argument()));
+ string s;
+ is >> s;
+ if (s != "tabular") {
+ // We only now about table actions here.
+ break;
+ }
+ if (&cur.inset() != this) {
+ // Table actions requires that the cursor is _inside_ the
+ // table.
+ status.setEnabled(false);
+ status.message(from_utf8(N_("Cursor not in table")));
+ return true;
+ }
+ is >> s;
if (nrows() <= 1 && (s == "delete-row" || s == "swap-row")) {
status.setEnabled(false);
status.message(from_utf8(N_("Only one row")));
return true;
default:
- return InsetMathNest::getStatus(cur, cmd, status);
+ break;
}
+ return InsetMathNest::getStatus(cur, cmd, status);
}