X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fmathed%2FInsetMathGrid.cpp;h=291e11de8fcc97d3b56abd4fa7d27564ebcb8514;hb=4c724a6072013247ac178f0acec06825585c6c55;hp=7676420d940871d812f6509b17218b906ee19cf0;hpb=0f1fdaaa97e9fe01f0e97ca56f0e2380ba248a7e;p=lyx.git diff --git a/src/mathed/InsetMathGrid.cpp b/src/mathed/InsetMathGrid.cpp index 7676420d94..291e11de8f 100644 --- a/src/mathed/InsetMathGrid.cpp +++ b/src/mathed/InsetMathGrid.cpp @@ -26,6 +26,7 @@ #include "FuncStatus.h" #include "Cursor.h" #include "FuncRequest.h" +#include "LaTeXFeatures.h" #include "frontends/Clipboard.h" #include "frontends/Painter.h" @@ -81,7 +82,7 @@ static void resetGrid(InsetMathGrid & grid) InsetMathGrid::CellInfo::CellInfo() - : multi_(CELL_NORMAL) + : multi_(CELL_NORMAL), glue_(0), begin_(0), end_(0) {} @@ -90,7 +91,8 @@ InsetMathGrid::CellInfo::CellInfo() InsetMathGrid::RowInfo::RowInfo() - : lines_(0), skip_(0), allow_newpage_(true) + : descent_(0), ascent_(0), offset_(0), lines_(0), skip_(0), + allow_newpage_(true) {} @@ -106,7 +108,7 @@ int InsetMathGrid::RowInfo::skipPixels(MetricsInfo const & mi) const InsetMathGrid::ColInfo::ColInfo() - : align_('c'), lines_(0) + : align_('c'), width_(0), offset_(0), lines_(0), skip_(0) {} @@ -180,7 +182,7 @@ void InsetMathGrid::setDefaults() bool InsetMathGrid::interpretString(Cursor & cur, docstring const & str) { if (str == "\\hline") { - FuncRequest fr = FuncRequest(LFUN_INSET_MODIFY, "tabular add-hline-above"); + FuncRequest fr = FuncRequest(LFUN_TABULAR_FEATURE, "add-hline-above"); FuncStatus status; if (getStatus(cur, fr, status)) { if (status.enabled()) { @@ -485,7 +487,7 @@ void InsetMathGrid::metrics(MetricsInfo & mi, Dimension & dim) const colinfo_[col].offset_ = colinfo_[col - 1].offset_ + colinfo_[col - 1].width_ + - colinfo_[col - 1].skip_ + + displayColSpace(col - 1) + colsep() + colinfo_[col].lines_ * vlinesep(); } @@ -507,7 +509,7 @@ void InsetMathGrid::metrics(MetricsInfo & mi, Dimension & dim) const int const nextoffset = colinfo_[first].offset_ + wid + - colinfo_[last].skip_ + + displayColSpace(last) + colsep() + colinfo_[last+1].lines_ * vlinesep(); int const dx = nextoffset - colinfo_[last+1].offset_; @@ -616,7 +618,7 @@ void InsetMathGrid::drawWithMargin(PainterInfo & pi, int x, int y, col_type const c = col(idx); if (r > 0 && r < nrows()) { for (unsigned int i = 0; i < rowinfo_[r].lines_; ++i) { - int yy = y + rowinfo_[r].offset_ + int const yy = y + rowinfo_[r].offset_ - rowinfo_[r].ascent_ - i * hlinesep() - hlinesep()/2 - rowsep()/2; @@ -629,14 +631,17 @@ void InsetMathGrid::drawWithMargin(PainterInfo & pi, int x, int y, } if (c > 0 && c < ncols()) { for (unsigned int i = 0; i < colinfo_[c].lines_; ++i) { - int xx = x + lmargin + int const xx = x + lmargin + colinfo_[c].offset_ - i * vlinesep() - vlinesep()/2 - colsep()/2; - pi.pain.line(xx, - rowinfo_[r].offset_ - rowinfo_[r].ascent_, - xx, - rowinfo_[r].offset_ + rowinfo_[r].descent_, + int top_offset; + if (r > 0) + top_offset = rowinfo_[r - 1].offset_ + rowinfo_[r - 1].descent_; + else + top_offset = rowinfo_[0].offset_- rowinfo_[0].ascent_; + pi.pain.line(xx, y + top_offset, + xx, y + rowinfo_[r].offset_ + rowinfo_[r].descent_, Color_foreground); } } @@ -740,7 +745,7 @@ void InsetMathGrid::metricsT(TextMetricsInfo const & mi, Dimension & dim) const colinfo_[col].offset_ = colinfo_[col - 1].offset_ + colinfo_[col - 1].width_ + - colinfo_[col - 1].skip_ + + displayColSpace(col - 1) + 1 ; //colsep() + //colinfo_[col].lines_ * vlinesep(); } @@ -952,7 +957,7 @@ int InsetMathGrid::cellWidth(idx_type idx) const col_type c2 = c1 + ncellcols(idx); return colinfo_[c2].offset_ - colinfo_[c1].offset_ - - colinfo_[c2].skip_ + - displayColSpace(c2) - colsep() - colinfo_[c2].lines_ * vlinesep(); } @@ -1236,6 +1241,20 @@ void InsetMathGrid::htmlize(HtmlStream & os) const } +void InsetMathGrid::validate(LaTeXFeatures & features) const +{ + if (features.runparams().math_flavor == OutputParams::MathAsHTML + && (nrows() > 1 || ncols() > 1)) { + // CSS taken from InsetMathCases + features.addCSSSnippet( + "table.mathtable{display: inline-block; text-align: center; border: none;" + "border-left: thin solid black; vertical-align: middle; padding-left: 0.5ex;}\n" + "table.mathtable td {text-align: left; border: none;}"); + } + InsetMathNest::validate(features); +} + + void InsetMathGrid::write(WriteStream & os) const { write(os, 0, 0, nrows(), ncols()); @@ -1256,19 +1275,25 @@ void InsetMathGrid::write(WriteStream & os, bool last_eoln = true; for (col_type col = beg_col; col < end_col; ++col) { idx_type const idx = index(row, col); - if (cellinfo_[idx].multi_ == CELL_PART_OF_MULTICOLUMN) - continue; bool const empty_cell = cell(idx).empty(); - if (!empty_cell) + if (!empty_cell || cellinfo_[idx].multi_ != CELL_NORMAL) last_eoln = false; - if (!empty_cell || colinfo_[col + 1].lines_) { + if (!empty_cell || cellinfo_[idx].multi_ != CELL_NORMAL || + colinfo_[col + 1].lines_) { lastcol = col + 1; emptyline = false; } } - for (col_type col = beg_col; col < lastcol;) { + for (col_type col = beg_col; col < end_col;) { int nccols = 1; idx_type const idx = index(row, col); + TexRow::RowEntry entry = os.texrow().mathEntry(id(),idx); + os.texrow().startMath(id(),idx); + if (col >= lastcol) { + ++col; + continue; + } + os.pushRowEntry(entry); if (cellinfo_[idx].multi_ == CELL_BEGIN_OF_MULTICOLUMN) { size_t s = col + 1; while (s < ncols() && @@ -1284,8 +1309,9 @@ void InsetMathGrid::write(WriteStream & os, ModeSpecifier specifier(os, TEXT_MODE); if (cellinfo_[idx].multi_ == CELL_BEGIN_OF_MULTICOLUMN) os << '}'; - os << eocString(col, lastcol); + os << eocString(col + nccols - 1, lastcol); col += nccols; + os.popRowEntry(); } eol = eolString(row, os.fragile(), os.latex(), last_eoln); os << eol; @@ -1370,6 +1396,11 @@ char InsetMathGrid::displayColAlign(idx_type idx) const } +int InsetMathGrid::displayColSpace(col_type col) const +{ + return colinfo_[col].skip_; +} + void InsetMathGrid::doDispatch(Cursor & cur, FuncRequest & cmd) { //lyxerr << "*** InsetMathGrid: request: " << cmd << endl; @@ -1431,7 +1462,8 @@ void InsetMathGrid::doDispatch(Cursor & cur, FuncRequest & cmd) // split cell splitCell(cur); - swap(cell(cur.idx()), cell(cur.idx() + ncols() - 1)); + if (ncols() > 1) + swap(cell(cur.idx()), cell(cur.idx() + ncols() - 1)); if (cur.idx() > 0) --cur.idx(); cur.pos() = cur.lastpos(); @@ -1441,17 +1473,12 @@ void InsetMathGrid::doDispatch(Cursor & cur, FuncRequest & cmd) break; } - case LFUN_INSET_MODIFY: { + case LFUN_TABULAR_FEATURE: { 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") @@ -1588,7 +1615,7 @@ void InsetMathGrid::doDispatch(Cursor & cur, FuncRequest & cmd) } bool hline_enabled = false; - FuncRequest fr = FuncRequest(LFUN_INSET_MODIFY, "tabular add-hline-above"); + FuncRequest fr = FuncRequest(LFUN_TABULAR_FEATURE, "add-hline-above"); FuncStatus status; if (getStatus(cur, fr, status)) hline_enabled = status.enabled(); @@ -1659,6 +1686,7 @@ void InsetMathGrid::doDispatch(Cursor & cur, FuncRequest & cmd) case LFUN_WORD_BACKWARD: case LFUN_WORD_LEFT: cur.screenUpdateFlags(Update::Decoration | Update::FitCursor); + // fall through case LFUN_LINE_BEGIN_SELECT: case LFUN_WORD_BACKWARD_SELECT: case LFUN_WORD_LEFT_SELECT: @@ -1684,6 +1712,7 @@ void InsetMathGrid::doDispatch(Cursor & cur, FuncRequest & cmd) case LFUN_WORD_RIGHT: case LFUN_LINE_END: cur.screenUpdateFlags(Update::Decoration | Update::FitCursor); + // fall through case LFUN_WORD_FORWARD_SELECT: case LFUN_WORD_RIGHT_SELECT: case LFUN_LINE_END_SELECT: @@ -1716,14 +1745,8 @@ bool InsetMathGrid::getStatus(Cursor & cur, FuncRequest const & cmd, FuncStatus & status) const { 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; - } + case LFUN_TABULAR_FEATURE: { + string s = cmd.getArg(0); if (&cur.inset() != this) { // Table actions requires that the cursor is _inside_ the // table. @@ -1731,7 +1754,6 @@ bool InsetMathGrid::getStatus(Cursor & cur, FuncRequest const & cmd, 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"))); @@ -1786,7 +1808,8 @@ bool InsetMathGrid::getStatus(Cursor & cur, FuncRequest const & cmd, } else { status.setEnabled(false); status.message(bformat( - from_utf8(N_("Unknown tabular feature '%1$s'")), lyx::from_ascii(s))); + from_utf8(N_("Unknown tabular feature '%1$s'")), + from_utf8(s))); } #if 0 @@ -1827,4 +1850,69 @@ bool InsetMathGrid::getStatus(Cursor & cur, FuncRequest const & cmd, } +// static +char InsetMathGrid::colAlign(HullType type, col_type col) +{ + switch (type) { + case hullEqnArray: + return "rcl"[col % 3]; + + case hullMultline: + case hullGather: + return 'c'; + + case hullAlign: + case hullAlignAt: + case hullXAlignAt: + case hullXXAlignAt: + case hullFlAlign: + return "rl"[col & 1]; + + case hullUnknown: + case hullNone: + case hullSimple: + case hullEquation: + case hullRegexp: + return 'c'; + } + // avoid warning + return 'c'; +} + + +//static +int InsetMathGrid::colSpace(HullType type, col_type col) +{ + int alignInterSpace = 0; + switch (type) { + case hullUnknown: + case hullNone: + case hullSimple: + case hullEquation: + case hullMultline: + case hullGather: + case hullRegexp: + return 0; + + case hullEqnArray: + return 5; + + case hullAlign: + alignInterSpace = 20; + break; + case hullAlignAt: + alignInterSpace = 0; + break; + case hullXAlignAt: + alignInterSpace = 40; + break; + case hullXXAlignAt: + case hullFlAlign: + alignInterSpace = 60; + break; + } + return (col % 2) ? alignInterSpace : 0; +} + + } // namespace lyx