X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2Finsettabular.C;h=fd5c283bf5ec97c75b41791d0ca0e9d53f7248d0;hb=4acce5c117e0d6101113f38e2e058d284b866de9;hp=cd13bcc1e2e7cd4c338641173228ca3c17c14e11;hpb=691594432dd49a952c52e2540fc3993414f051a2;p=lyx.git diff --git a/src/insets/insettabular.C b/src/insets/insettabular.C index cd13bcc1e2..fd5c283bf5 100644 --- a/src/insets/insettabular.C +++ b/src/insets/insettabular.C @@ -37,8 +37,7 @@ #include "frontends/LyXView.h" #include "frontends/Painter.h" -#include "support/std_sstream.h" - +#include #include using lyx::graphics::PreviewLoader; @@ -47,14 +46,15 @@ using lyx::support::ltrim; using lyx::support::strToInt; using lyx::support::strToDbl; +using std::auto_ptr; using std::endl; using std::max; -using std::swap; using std::string; -using std::auto_ptr; using std::istringstream; using std::ostream; using std::ostringstream; +using std::swap; +using std::vector; namespace { @@ -154,22 +154,14 @@ bool InsetTabular::hasPasteBuffer() const InsetTabular::InsetTabular(Buffer const & buf, int rows, int columns) : tabular(buf.params(), max(rows, 1), max(columns, 1)), - buffer_(&buf), cursorx_(0), cursory_(0), tablemode(false) -{ - tabular.setOwner(this); - clearSelection(); - in_reset_pos = 0; -} + buffer_(&buf), cursorx_(0) +{} InsetTabular::InsetTabular(InsetTabular const & tab) : UpdatableInset(tab), tabular(tab.tabular), - buffer_(tab.buffer_), cursorx_(0), cursory_(0), tablemode(false) -{ - tabular.setOwner(this); - clearSelection(); - in_reset_pos = 0; -} + buffer_(tab.buffer_), cursorx_(0) +{} InsetTabular::~InsetTabular() @@ -190,7 +182,7 @@ Buffer const & InsetTabular::buffer() const } -void InsetTabular::buffer(Buffer * b) +void InsetTabular::buffer(Buffer const * b) { buffer_ = b; } @@ -212,10 +204,10 @@ void InsetTabular::read(Buffer const & buf, LyXLex & lex) if (old_format) return; - lex.nextToken(); + lex.next(); string token = lex.getString(); while (lex.isOK() && (token != "\\end_inset")) { - lex.nextToken(); + lex.next(); token = lex.getString(); } if (token != "\\end_inset") { @@ -234,7 +226,27 @@ void InsetTabular::metrics(MetricsInfo & mi, Dimension & dim) const BOOST_ASSERT(false); } - calculate_dimensions_of_cells(mi); + for (int i = 0, cell = -1; i < tabular.rows(); ++i) { + int maxAsc = 0; + int maxDesc = 0; + for (int j = 0; j < tabular.columns(); ++j) { + if (tabular.isPartOfMultiColumn(i, j)) + continue; + ++cell; + Dimension dim; + MetricsInfo m = mi; + LyXLength p_width = tabular.column_info[j].p_width; + if (!p_width.zero()) { + m.base.textwidth = p_width.inPixels(mi.base.textwidth); + } + tabular.getCellInset(cell).metrics(m, dim); + maxAsc = max(maxAsc, dim.asc); + maxDesc = max(maxDesc, dim.des); + tabular.setWidthOfCell(cell, dim.wid); + } + tabular.setAscentOfRow(i, maxAsc + ADD_TO_HEIGHT); + tabular.setDescentOfRow(i, maxDesc + ADD_TO_HEIGHT); + } dim.asc = tabular.getAscentOfRow(0); dim.des = tabular.getHeightOfTabular() - tabular.getAscentOfRow(0) + 1; @@ -248,25 +260,21 @@ void InsetTabular::draw(PainterInfo & pi, int x, int y) const //lyxerr << "InsetTabular::draw: " << x << " " << y << endl; BufferView * bv = pi.base.bv; + setPosCache(pi, x, y); - if (!owner()) - x += scroll(); - - xo_ = x; - yo_ = y; + x += scroll(); x += ADD_TO_TABULAR_WIDTH; - int cell = 0; + int idx = 0; first_visible_cell = -1; for (int i = 0; i < tabular.rows(); ++i) { int nx = x; - cell = tabular.getCellNumber(i, 0); - if (y + tabular.getDescentOfRow(i) <= 0 && - y - tabular.getAscentOfRow(i) < pi.pain.paperHeight()) - { - y += tabular.getDescentOfRow(i) + - tabular.getAscentOfRow(i + 1) + - tabular.getAdditionalHeight(i + 1); + idx = tabular.getCellNumber(i, 0); + if (y + tabular.getDescentOfRow(i) <= 0 + && y - tabular.getAscentOfRow(i) < pi.pain.paperHeight()) { + y += tabular.getDescentOfRow(i) + + tabular.getAscentOfRow(i + 1) + + tabular.getAdditionalHeight(i + 1); continue; } for (int j = 0; j < tabular.columns(); ++j) { @@ -275,15 +283,15 @@ void InsetTabular::draw(PainterInfo & pi, int x, int y) const if (tabular.isPartOfMultiColumn(i, j)) continue; if (first_visible_cell < 0) - first_visible_cell = cell; - if (hasSelection()) - drawCellSelection(pi.pain, nx, y, i, j, cell); - - int const cx = nx + tabular.getBeginningOfTextInCell(cell); - tabular.getCellInset(cell).draw(pi, cx, y); - drawCellLines(pi.pain, nx, y, i, cell); - nx += tabular.getWidthOfColumn(cell); - ++cell; + first_visible_cell = idx; + if (bv->cursor().selection()) + drawCellSelection(pi, nx, y, i, j, idx); + + int const cx = nx + tabular.getBeginningOfTextInCell(idx); + cell(idx).draw(pi, cx, y); + drawCellLines(pi.pain, nx, y, i, idx); + nx += tabular.getWidthOfColumn(idx); + ++idx; } // Would be nice, but for some completely unfathomable reason, @@ -339,32 +347,20 @@ void InsetTabular::drawCellLines(Painter & pain, int x, int y, } -void InsetTabular::drawCellSelection(Painter & pain, int x, int y, +void InsetTabular::drawCellSelection(PainterInfo & pi, int x, int y, int row, int column, int cell) const { - if (!tablemode) - return; - - BOOST_ASSERT(hasSelection()); - int cs = tabular.column_of_cell(sel_cell_start); - int ce = tabular.column_of_cell(sel_cell_end); - if (cs > ce) { - ce = cs; - cs = tabular.column_of_cell(sel_cell_end); - } else { - ce = tabular.right_column_of_cell(sel_cell_end); - } - - int rs = tabular.row_of_cell(sel_cell_start); - int re = tabular.row_of_cell(sel_cell_end); - if (rs > re) - swap(rs, re); - - if (column >= cs && column <= ce && row >= rs && row <= re) { - int w = tabular.getWidthOfColumn(cell); - int h = tabular.getAscentOfRow(row) + tabular.getDescentOfRow(row)-1; - pain.fillRectangle(x, y - tabular.getAscentOfRow(row) + 1, - w, h, LColor::selection); + LCursor & cur = pi.base.bv->cursor(); + BOOST_ASSERT(cur.selection()); + if (tablemode(cur)) { + int rs, re, cs, ce; + getSelection(cur, rs, re, cs, ce); + if (column >= cs && column <= ce && row >= rs && row <= re) { + int w = tabular.getWidthOfColumn(cell); + int h = tabular.getAscentOfRow(row) + tabular.getDescentOfRow(row)-1; + pi.pain.fillRectangle(x, y - tabular.getAscentOfRow(row) + 1, + w, h, LColor::selection); + } } } @@ -375,523 +371,514 @@ string const InsetTabular::editMessage() const } -void InsetTabular::updateLocal(BufferView * bv) const -{ - bv->update(); - resetPos(bv); -} - -extern LCursor theTempCursor; - - - -void InsetTabular::lfunMousePress(FuncRequest const & cmd) -{ - if (hasSelection() && cmd.button() == mouse_button::button3) - return; - - BufferView * bv = cmd.view(); - - int cell = getCell(cmd.x + xo_, cmd.y + yo_); - clearSelection(); - - lyxerr << "# InsetTabular::lfunMousePress cell: " << cell << endl; - if (cell == -1) { - tablemode = true; - bv->fullCursor(theTempCursor); - bv->fullCursor().push(this); - bv->fullCursor().cell(cell); - } else { - tablemode = false; - setPos(bv, cmd.x, cmd.y); - bv->fullCursor(theTempCursor); - bv->fullCursor().cell(cell); - } - lyxerr << bv->cursor() << endl; - - if (cmd.button() == mouse_button::button2) - dispatch(FuncRequest(bv, LFUN_PASTESELECTION, "paragraph")); -} - - -void InsetTabular::lfunMouseMotion(FuncRequest const & cmd) -{ - BufferView * bv = cmd.view(); - int const actcell = getCell(cmd.x + xo_, cmd.y + yo_); - lyxerr << "# InsetTabular::lfunMouseMotion cell: " << actcell << endl; - - setPos(bv, cmd.x, cmd.y); - if (!hasSelection()) { - setSelection(actcell, actcell); - bv->setSelection(); - } else { - bv->cursor().cell(actcell); - setSelection(sel_cell_start, actcell); - tablemode = (sel_cell_start != actcell); - } -} - - -void InsetTabular::lfunMouseRelease(FuncRequest const & cmd) -{ - int const actcell = getCell(cmd.x + xo_, cmd.y + yo_); - lyxerr << "# InsetTabular::lfunMouseRelease cell: " << actcell << endl; - if (cmd.button() == mouse_button::button3) - InsetTabularMailer(*this).showDialog(cmd.view()); -} - - -void InsetTabular::edit(BufferView * bv, bool left) +void InsetTabular::edit(LCursor & cur, bool left) { lyxerr << "InsetTabular::edit: " << this << endl; finishUndo(); - //tablemode = false; int cell; + cur.push(*this); if (left) { - if (isRightToLeft(bv)) + if (isRightToLeft(cur)) cell = tabular.getLastCellInRow(0); else cell = 0; } else { - if (isRightToLeft(bv)) + if (isRightToLeft(cur)) cell = tabular.getFirstCellInRow(tabular.rows()-1); else cell = tabular.getNumberOfCells() - 1; } - clearSelection(); - resetPos(bv); - bv->fitCursor(); - bv->fullCursor().push(this); - bv->fullCursor().cell(cell); - lyxerr << bv->cursor() << endl; + cur.selection() = false; + // this accesses the position cache before it is initialized + //resetPos(cur); + //cur.bv().fitCursor(); + cur.idx() = cell; } -void InsetTabular::edit(BufferView * bv, int x, int y) +InsetBase * InsetTabular::editXY(LCursor & cur, int x, int y) const { - lyxerr << "InsetTabular::edit: " << this << " first cell " - << &tabular.cell_info[0][0].inset << endl; - - finishUndo(); - setPos(bv, x, y); - clearSelection(); - finishUndo(); - //int xx = cursorx_ - xo_ + tabular.getBeginningOfTextInCell(actcell); - bv->fullCursor().push(this); - //if (x > xx) - // activateCellInset(bv, cell, x - xx, y - cursory_); + //lyxerr << "InsetTabular::editXY: " << this << endl; + cur.selection() = false; + cur.push(const_cast(*this)); + return setPos(cur, x, y); + //int xx = cursorx_ - xo() + tabular.getBeginningOfTextInCell(actcell); } -DispatchResult -InsetTabular::priv_dispatch(FuncRequest const & cmd, - idx_type & idx, pos_type & pos) +void InsetTabular::priv_dispatch(LCursor & cur, FuncRequest & cmd) { - lyxerr << "# InsetTabular::dispatch: " << cmd - << " tablemode: " << tablemode << endl; - - DispatchResult result(true, true); - BufferView * bv = cmd.view(); + lyxerr << "# InsetTabular::dispatch: cmd: " << cmd << endl; + //lyxerr << " cur:\n" << cur << endl; + CursorSlice sl = cur.top(); + LCursor & bvcur = cur.bv().cursor(); switch (cmd.action) { case LFUN_MOUSE_PRESS: - lfunMousePress(cmd); - return DispatchResult(true, true); + lyxerr << "# InsetTabular::MousePress\n" << cur.bv().cursor() << endl; + + if (cmd.button() == mouse_button::button1) { + cur.selection() = false; + setPos(cur, cmd.x, cmd.y); + cur.resetAnchor(); + bvcur = cur; + break; + } + + //if (cmd.button() == mouse_button::button2) + // dispatch(cur, FuncRequest(LFUN_PASTESELECTION, "paragraph")); + + // we'll pop up the table dialog on release + if (cmd.button() == mouse_button::button3) + break; + break; case LFUN_MOUSE_MOTION: - lfunMouseMotion(cmd); - return DispatchResult(true, true); + lyxerr << "# InsetTabular::MouseMotion\n" << bvcur << endl; + if (cmd.button() == mouse_button::button1) { + // only accept motions to places not deeper nested than the real anchor + if (bvcur.anchor_.hasPart(cur)) { + setPos(cur, cmd.x, cmd.y); + bvcur.setCursor(cur); + bvcur.selection() = true; + } + } + break; case LFUN_MOUSE_RELEASE: - lfunMouseRelease(cmd); - return DispatchResult(true, true); - - default: + lyxerr << "# InsetTabular::MouseRelease\n" << bvcur << endl; + if (cmd.button() == mouse_button::button3) + InsetTabularMailer(*this).showDialog(&cur.bv()); break; - } - CursorSlice & cur = bv->cursor(); + case LFUN_CELL_BACKWARD: + movePrevCell(cur); + cur.selection() = false; + break; - if (!tablemode) { - - int cell = cur.idx_; - lyxerr << "# InsetTabular::dispatch: A " << cur << endl; - result = tabular.getCellInset(cell).dispatch(cmd, idx, pos); + case LFUN_CELL_FORWARD: + moveNextCell(cur); + cur.selection() = false; + break; - switch (result.val()) { - case FINISHED: - if (movePrevCell(bv, cur)) - result = DispatchResult(true, true); - else - result = DispatchResult(false, FINISHED); + case LFUN_SCROLL_INSET: + if (cmd.argument.empty()) break; + if (cmd.argument.find('.') != cmd.argument.npos) + scroll(cur.bv(), static_cast(strToDbl(cmd.argument))); + else + scroll(cur.bv(), strToInt(cmd.argument)); + break; - case FINISHED_RIGHT: - if (moveNextCell(bv, cur)) - result = DispatchResult(true, true); - else - result = DispatchResult(false, FINISHED_RIGHT); - break; + case LFUN_RIGHTSEL: + case LFUN_RIGHT: + cell(cur.idx()).dispatch(cur, cmd); + cur.dispatched(); // override the cell's decision + if (sl == cur.top()) + isRightToLeft(cur) ? movePrevCell(cur) : moveNextCell(cur); + if (sl == cur.top()) { + cmd = FuncRequest(LFUN_FINISHED_RIGHT); + cur.undispatched(); + } + break; + + case LFUN_LEFTSEL: + case LFUN_LEFT: + cell(cur.idx()).dispatch(cur, cmd); + cur.dispatched(); // override the cell's decision + if (sl == cur.top()) + isRightToLeft(cur) ? moveNextCell(cur) : movePrevCell(cur); + if (sl == cur.top()) { + cmd = FuncRequest(LFUN_FINISHED_LEFT); + cur.undispatched(); + } + break; + + case LFUN_DOWNSEL: + case LFUN_DOWN: + cell(cur.idx()).dispatch(cur, cmd); + cur.dispatched(); // override the cell's decision + if (sl == cur.top()) + if (tabular.row_of_cell(cur.idx()) != tabular.rows() - 1) { + cur.idx() = tabular.getCellBelow(cur.idx()); + cur.par() = 0; + cur.pos() = 0; + resetPos(cur); + } + if (sl == cur.top()) { + cmd = FuncRequest(LFUN_FINISHED_DOWN); + cur.undispatched(); + } + break; + + case LFUN_UPSEL: + case LFUN_UP: + cell(cur.idx()).dispatch(cur, cmd); + cur.dispatched(); // override the cell's decision + if (sl == cur.top()) + if (tabular.row_of_cell(cur.idx()) != 0) { + cur.idx() = tabular.getCellAbove(cur.idx()); + cur.par() = cur.lastpar(); + cur.pos() = cur.lastpos(); + resetPos(cur); + } + if (sl == cur.top()) { + cmd = FuncRequest(LFUN_FINISHED_UP); + cur.undispatched(); + } + break; - case FINISHED_UP: - if (moveUpLock(bv, cur)) - result = DispatchResult(true, true); + case LFUN_NEXT: { + //if (hasSelection()) + // cur.selection() = false; + int actcell = cur.idx(); + int actcol = tabular.column_of_cell(actcell); + int column = actcol; + if (cur.bv().top_y() + cur.bv().painter().paperHeight() + < yo() + tabular.getHeightOfTabular()) + { + cur.bv().scrollDocView( + cur.bv().top_y() + cur.bv().painter().paperHeight()); + cur.idx() = tabular.getCellBelow(first_visible_cell) + column; + } else { + cur.idx() = tabular.getFirstCellInRow(tabular.rows() - 1) + column; + } + resetPos(cur); + break; + } + + case LFUN_PRIOR: { + //if (hasSelection()) + // cur.selection() = false; + int column = tabular.column_of_cell(cur.idx()); + if (yo() < 0) { + cur.bv().scrollDocView( + cur.bv().top_y() - cur.bv().painter().paperHeight()); + if (yo() > 0) + cur.idx() = column; else - result = DispatchResult(false, FINISHED_UP); + cur.idx() = tabular.getCellBelow(first_visible_cell) + column; + } else { + cur.idx() = column; + } + resetPos(cur); + break; + } + + case LFUN_LAYOUT_TABULAR: + InsetTabularMailer(*this).showDialog(&cur.bv()); + break; + + case LFUN_INSET_DIALOG_UPDATE: + InsetTabularMailer(*this).updateDialog(&cur.bv()); + break; + + case LFUN_TABULAR_FEATURE: + if (!tabularFeatures(cur, cmd.argument)) + cur.undispatched(); + break; + + // insert file functions + case LFUN_FILE_INSERT_ASCII_PARA: + case LFUN_FILE_INSERT_ASCII: { + string tmpstr = getContentsOfAsciiFile(&cur.bv(), cmd.argument, false); + if (!tmpstr.empty() && !insertAsciiString(cur.bv(), tmpstr, false)) + cur.undispatched(); + break; + } + + case LFUN_CUT: + if (copySelection(cur)) { + recordUndo(cur, Undo::DELETE); + cutSelection(cur); + } + break; + + case LFUN_BACKSPACE: + case LFUN_DELETE: + recordUndo(cur, Undo::DELETE); + if (tablemode(cur)) + cutSelection(cur); + else + cell(cur.idx()).dispatch(cur, cmd); + break; + + case LFUN_COPY: + if (!cur.selection()) break; + finishUndo(); + copySelection(cur); + break; - case FINISHED_DOWN: - if (moveDownLock(bv, cur)) - result = DispatchResult(true, true); - else - result = DispatchResult(false, FINISHED_UP); + case LFUN_PASTESELECTION: { + string const clip = cur.bv().getClipboard(); + if (clip.empty()) break; + if (clip.find('\t') != string::npos) { + int cols = 1; + int rows = 1; + int maxCols = 1; + size_t len = clip.length(); + for (size_t p = 0; p < len; ++p) { + p = clip.find_first_of("\t\n", p); + if (p == string::npos) + break; + switch (clip[p]) { + case '\t': + ++cols; + break; + case '\n': + if (p + 1 < len) + ++rows; + maxCols = max(cols, maxCols); + cols = 1; + break; + } + } + maxCols = max(cols, maxCols); - default: - lyxerr << "# don't handle dispatch" << endl; + paste_tabular.reset( + new LyXTabular(cur.buffer().params(), rows, maxCols)); + + string::size_type op = 0; + int cell = 0; + int cells = paste_tabular->getNumberOfCells(); + cols = 0; + LyXFont font; + for (size_t p = 0; cell < cells && p < len; ++p) { + p = clip.find_first_of("\t\n", p); + if (p == string::npos || p >= len) + break; + switch (clip[p]) { + case '\t': + paste_tabular->getCellInset(cell). + setText(clip.substr(op, p - op), font); + ++cols; + ++cell; + break; + case '\n': + paste_tabular->getCellInset(cell). + setText(clip.substr(op, p - op), font); + while (cols++ < maxCols) + ++cell; + cols = 0; + break; + } + op = p + 1; + } + // check for the last cell if there is no trailing '\n' + if (cell < cells && op < len) + paste_tabular->getCellInset(cell). + setText(clip.substr(op, len - op), font); + } else if (!insertAsciiString(cur.bv(), clip, true)) { + // so that the clipboard is used and it goes on + // to default + // and executes LFUN_PASTESELECTION in insettext! + paste_tabular.reset(); + } + // fall through + } + + case LFUN_PASTE: + if (hasPasteBuffer()) { + recordUndo(cur, Undo::INSERT); + pasteSelection(cur); break; } + cell(cur.idx()).dispatch(cur, cmd); + break; - lyxerr << "# InsetTabular::dispatch: B " << cur << endl; - } else { + default: + // we try to handle this event in the insets dispatch function. + cell(cur.idx()).dispatch(cur, cmd); + break; + } - lyxerr << "# InsetTabular::dispatch 3: " << cmd << endl; - switch (cmd.action) { + InsetTabularMailer(*this).updateDialog(&cur.bv()); +} - case LFUN_CELL_BACKWARD: - case LFUN_CELL_FORWARD: - if (cmd.action == LFUN_CELL_FORWARD) - moveNextCell(bv, cur); - else - movePrevCell(bv, cur); - clearSelection(); - return result; - - case LFUN_SCROLL_INSET: - if (!cmd.argument.empty()) { - if (cmd.argument.find('.') != cmd.argument.npos) - scroll(cmd.view(), static_cast(strToDbl(cmd.argument))); - else - scroll(cmd.view(), strToInt(cmd.argument)); - cmd.view()->update(); - return DispatchResult(true, true); - } - case LFUN_RIGHTSEL: { - int const start = hasSelection() ? sel_cell_start : cur.idx_; - if (tabular.isLastCellInRow(cur.idx_)) { - setSelection(start, cur.idx_); +// function sets an object as defined in func_status.h: +// states OK, Unknown, Disabled, On, Off. +bool InsetTabular::getStatus(LCursor & cur, FuncRequest const & cmd, + FuncStatus & status) const +{ + switch (cmd.action) { + case LFUN_TABULAR_FEATURE: { + int actcell = cur.idx(); + int action = LyXTabular::LAST_ACTION; + int i = 0; + for (; tabularFeature[i].action != LyXTabular::LAST_ACTION; ++i) { + string const tmp = tabularFeature[i].feature; + if (tmp == cmd.argument.substr(0, tmp.length())) { + action = tabularFeature[i].action; break; } + } + if (action == LyXTabular::LAST_ACTION) { + status.clear(); + status.unknown(true); + return true; + } - int end = cur.idx_; - // if we are starting a selection, only select - // the current cell at the beginning - if (hasSelection()) { - moveRight(bv, cur); - end = cur.idx_; - } - setSelection(start, end); + string const argument + = ltrim(cmd.argument.substr(tabularFeature[i].feature.length())); + + int sel_row_start = 0; + int sel_row_end = 0; + int dummy; + LyXTabular::ltType dummyltt; + bool flag = true; + + getSelection(cur, sel_row_start, sel_row_end, dummy, dummy); + + switch (action) { + case LyXTabular::SET_PWIDTH: + case LyXTabular::SET_MPWIDTH: + case LyXTabular::SET_SPECIAL_COLUMN: + case LyXTabular::SET_SPECIAL_MULTI: + case LyXTabular::APPEND_ROW: + case LyXTabular::APPEND_COLUMN: + case LyXTabular::DELETE_ROW: + case LyXTabular::DELETE_COLUMN: + case LyXTabular::SET_ALL_LINES: + case LyXTabular::UNSET_ALL_LINES: + status.clear(); + return true; + + case LyXTabular::MULTICOLUMN: + status.setOnOff(tabular.isMultiColumn(actcell)); break; - } - case LFUN_RIGHT: - if (!moveRightLock(bv, cur)) - result = DispatchResult(false, FINISHED_RIGHT); - clearSelection(); + case LyXTabular::M_TOGGLE_LINE_TOP: + flag = false; + case LyXTabular::TOGGLE_LINE_TOP: + status.setOnOff(tabular.topLine(actcell, flag)); break; - case LFUN_LEFTSEL: { - int const start = hasSelection() ? sel_cell_start : cur.idx_; - if (tabular.isFirstCellInRow(cur.idx_)) { - setSelection(start, cur.idx_); - break; - } + case LyXTabular::M_TOGGLE_LINE_BOTTOM: + flag = false; + case LyXTabular::TOGGLE_LINE_BOTTOM: + status.setOnOff(tabular.bottomLine(actcell, flag)); + break; - int end = cur.idx_; - // if we are starting a selection, only select - // the current cell at the beginning - if (hasSelection()) { - moveLeft(bv, cur); - end = cur.idx_; - } - setSelection(start, end); + case LyXTabular::M_TOGGLE_LINE_LEFT: + flag = false; + case LyXTabular::TOGGLE_LINE_LEFT: + status.setOnOff(tabular.leftLine(actcell, flag)); break; - } - case LFUN_LEFT: - if (!moveLeftLock(bv, cur)) - result = DispatchResult(false, FINISHED); - clearSelection(); + case LyXTabular::M_TOGGLE_LINE_RIGHT: + flag = false; + case LyXTabular::TOGGLE_LINE_RIGHT: + status.setOnOff(tabular.rightLine(actcell, flag)); break; - case LFUN_DOWNSEL: { - int const start = hasSelection() ? sel_cell_start : cur.idx_; - int const ocell = cur.idx_; - // if we are starting a selection, only select - // the current cell at the beginning - if (hasSelection()) { - moveDown(bv, cur); - if (ocell == sel_cell_end || - tabular.column_of_cell(ocell) > tabular.column_of_cell(cur.idx_)) - setSelection(start, tabular.getCellBelow(sel_cell_end)); - else - setSelection(start, tabular.getLastCellBelow(sel_cell_end)); - } else { - setSelection(start, start); - } + case LyXTabular::M_ALIGN_LEFT: + flag = false; + case LyXTabular::ALIGN_LEFT: + status.setOnOff(tabular.getAlignment(actcell, flag) == LYX_ALIGN_LEFT); break; - } - case LFUN_DOWN: - if (!moveDown(bv, cur)) - result = DispatchResult(false, FINISHED_DOWN); - clearSelection(); + case LyXTabular::M_ALIGN_RIGHT: + flag = false; + case LyXTabular::ALIGN_RIGHT: + status.setOnOff(tabular.getAlignment(actcell, flag) == LYX_ALIGN_RIGHT); break; - case LFUN_UPSEL: { - int const start = hasSelection() ? sel_cell_start : cur.idx_; - int const ocell = cur.idx_; - // if we are starting a selection, only select - // the current cell at the beginning - if (hasSelection()) { - moveUp(bv, cur); - if (ocell == sel_cell_end || - tabular.column_of_cell(ocell) > tabular.column_of_cell(cur.idx_)) - setSelection(start, tabular.getCellAbove(sel_cell_end)); - else - setSelection(start, tabular.getLastCellAbove(sel_cell_end)); - } else { - setSelection(start, start); - } + case LyXTabular::M_ALIGN_CENTER: + flag = false; + case LyXTabular::ALIGN_CENTER: + status.setOnOff(tabular.getAlignment(actcell, flag) == LYX_ALIGN_CENTER); break; - } - case LFUN_UP: - if (!moveUp(bv, cur)) - result = DispatchResult(false, FINISHED_DOWN); - clearSelection(); + case LyXTabular::ALIGN_BLOCK: + status.enabled(!tabular.getPWidth(actcell).zero()); + status.setOnOff(tabular.getAlignment(actcell, flag) == LYX_ALIGN_BLOCK); break; - case LFUN_NEXT: { - if (hasSelection()) - clearSelection(); - int actcell = bv->cursor().idx(); - int actcol = tabular.column_of_cell(actcell); - int column = actcol; - if (bv->top_y() + bv->painter().paperHeight() - < yo_ + tabular.getHeightOfTabular()) - { - bv->scrollDocView(bv->top_y() + bv->painter().paperHeight()); - cur.idx_ = tabular.getCellBelow(first_visible_cell) + column; - } else { - cur.idx_ = tabular.getFirstCellInRow(tabular.rows() - 1) + column; - } - resetPos(bv); + case LyXTabular::M_VALIGN_TOP: + flag = false; + case LyXTabular::VALIGN_TOP: + status.setOnOff( + tabular.getVAlignment(actcell, flag) == LyXTabular::LYX_VALIGN_TOP); break; - } - case LFUN_PRIOR: { - if (hasSelection()) - clearSelection(); - int actcell = bv->cursor().idx(); - int actcol = tabular.column_of_cell(actcell); - int column = actcol; - if (yo_ < 0) { - bv->scrollDocView(bv->top_y() - bv->painter().paperHeight()); - if (yo_ > 0) - cur.idx_ = column; - else - cur.idx_ = tabular.getCellBelow(first_visible_cell) + column; - } else { - cur.idx_ = column; - } - resetPos(bv); + case LyXTabular::M_VALIGN_BOTTOM: + flag = false; + case LyXTabular::VALIGN_BOTTOM: + status.setOnOff( + tabular.getVAlignment(actcell, flag) == LyXTabular::LYX_VALIGN_BOTTOM); break; - } - // none of these make sense for insettabular, - // but we must catch them to prevent any - // selection from being confused - case LFUN_PRIORSEL: - case LFUN_NEXTSEL: - case LFUN_WORDLEFT: - case LFUN_WORDLEFTSEL: - case LFUN_WORDRIGHT: - case LFUN_WORDRIGHTSEL: - case LFUN_WORDSEL: - case LFUN_DOWN_PARAGRAPH: - case LFUN_DOWN_PARAGRAPHSEL: - case LFUN_UP_PARAGRAPH: - case LFUN_UP_PARAGRAPHSEL: - case LFUN_BACKSPACE: - case LFUN_HOME: - case LFUN_HOMESEL: - case LFUN_END: - case LFUN_ENDSEL: - case LFUN_BEGINNINGBUF: - case LFUN_BEGINNINGBUFSEL: - case LFUN_ENDBUF: - case LFUN_ENDBUFSEL: + case LyXTabular::M_VALIGN_MIDDLE: + flag = false; + case LyXTabular::VALIGN_MIDDLE: + status.setOnOff( + tabular.getVAlignment(actcell, flag) == LyXTabular::LYX_VALIGN_MIDDLE); break; - case LFUN_LAYOUT_TABULAR: - InsetTabularMailer(*this).showDialog(bv); + case LyXTabular::SET_LONGTABULAR: + status.setOnOff(tabular.isLongTabular()); break; - case LFUN_INSET_DIALOG_UPDATE: - InsetTabularMailer(*this).updateDialog(bv); + case LyXTabular::UNSET_LONGTABULAR: + status.setOnOff(!tabular.isLongTabular()); break; - case LFUN_TABULAR_FEATURE: - if (!tabularFeatures(bv, cmd.argument)) - result = DispatchResult(false); + case LyXTabular::SET_ROTATE_TABULAR: + status.setOnOff(tabular.getRotateTabular()); break; - // insert file functions - case LFUN_FILE_INSERT_ASCII_PARA: - case LFUN_FILE_INSERT_ASCII: { - string tmpstr = getContentsOfAsciiFile(bv, cmd.argument, false); - if (!tmpstr.empty() && !insertAsciiString(bv, tmpstr, false)) - result = DispatchResult(false); + case LyXTabular::UNSET_ROTATE_TABULAR: + status.setOnOff(!tabular.getRotateTabular()); break; - } - case LFUN_LANGUAGE: - case LFUN_EMPH: - case LFUN_BOLD: - case LFUN_NOUN: - case LFUN_CODE: - case LFUN_SANS: - case LFUN_ROMAN: - case LFUN_DEFAULT: - case LFUN_UNDERLINE: - case LFUN_FONT_SIZE: - lyxerr << "font changes not re-implemented for tables after LOCK" << endl; + case LyXTabular::SET_ROTATE_CELL: + status.setOnOff(tabular.getRotateCell(actcell)); break; - case LFUN_CUT: - if (copySelection(bv)) { - recordUndo(bv, Undo::DELETE); - cutSelection(bv->buffer()->params()); - } + case LyXTabular::UNSET_ROTATE_CELL: + status.setOnOff(!tabular.getRotateCell(actcell)); break; - case LFUN_DELETE: - recordUndo(bv, Undo::DELETE); - cutSelection(bv->buffer()->params()); + case LyXTabular::SET_USEBOX: + status.setOnOff(strToInt(argument) == tabular.getUsebox(actcell)); break; - case LFUN_COPY: - if (!hasSelection()) - break; - finishUndo(); - copySelection(bv); + case LyXTabular::SET_LTFIRSTHEAD: + status.setOnOff(tabular.getRowOfLTHead(sel_row_start, dummyltt)); break; - case LFUN_PASTESELECTION: { - string const clip = bv->getClipboard(); - if (clip.empty()) - break; - if (clip.find('\t') != string::npos) { - int cols = 1; - int rows = 1; - int maxCols = 1; - string::size_type len = clip.length(); - string::size_type p = 0; - - while (p < len && - (p = clip.find_first_of("\t\n", p)) != string::npos) { - switch (clip[p]) { - case '\t': - ++cols; - break; - case '\n': - if (p + 1 < len) - ++rows; - maxCols = max(cols, maxCols); - cols = 1; - break; - } - ++p; - } - maxCols = max(cols, maxCols); - - paste_tabular.reset( - new LyXTabular(bv->buffer()->params(), rows, maxCols)); - - string::size_type op = 0; - int cell = 0; - int cells = paste_tabular->getNumberOfCells(); - p = 0; - cols = 0; - LyXFont font; - while (cell < cells && p < len && - (p = clip.find_first_of("\t\n", p)) != string::npos) { - if (p >= len) - break; - switch (clip[p]) { - case '\t': - paste_tabular->getCellInset(cell). - setText(clip.substr(op, p-op), font); - ++cols; - ++cell; - break; - case '\n': - paste_tabular->getCellInset(cell). - setText(clip.substr(op, p-op), font); - while (cols++ < maxCols) - ++cell; - cols = 0; - break; - } - ++p; - op = p; - } - // check for the last cell if there is no trailing '\n' - if (cell < cells && op < len) - paste_tabular->getCellInset(cell). - setText(clip.substr(op, len-op), font); - } else if (!insertAsciiString(bv, clip, true)) - { - // so that the clipboard is used and it goes on - // to default - // and executes LFUN_PASTESELECTION in insettext! - paste_tabular.reset(); - } - // fall through - } + case LyXTabular::SET_LTHEAD: + status.setOnOff(tabular.getRowOfLTHead(sel_row_start, dummyltt)); + break; - case LFUN_PASTE: - if (hasPasteBuffer()) { - recordUndo(bv, Undo::INSERT); - pasteSelection(bv); - break; - } - // fall through + case LyXTabular::SET_LTFOOT: + status.setOnOff(tabular.getRowOfLTFoot(sel_row_start, dummyltt)); + break; - // ATTENTION: the function above has to be PASTE and PASTESELECTION!!! + case LyXTabular::SET_LTLASTFOOT: + status.setOnOff(tabular.getRowOfLTFoot(sel_row_start, dummyltt)); + break; + + case LyXTabular::SET_LTNEWPAGE: + status.setOnOff(tabular.getLTNewPage(sel_row_start)); + break; default: - // handle font changing stuff on selection before we lock the inset - // in the default part! - result = DispatchResult(false); - // we try to activate the actual inset and put this event down to - // the insets dispatch function. + status.clear(); + status.enabled(false); break; } - - updateLocal(bv); - InsetTabularMailer(*this).updateDialog(bv); + return true; } - if (cmd.action == LFUN_INSET_TOGGLE) { - tablemode = !tablemode; - result = DispatchResult(true, true); + default: + // we try to handle this event in the insets dispatch function. + return cell(cur.idx()).getStatus(cur, cmd, status); } - - return result; } @@ -905,7 +892,7 @@ int InsetTabular::latex(Buffer const & buf, ostream & os, int InsetTabular::plaintext(Buffer const & buf, ostream & os, OutputParams const & runparams) const { - int dp = runparams.linelen ? ownerPar(buf, this).params().depth() : 0; + int dp = runparams.linelen ? runparams.depth : 0; return tabular.plaintext(buf, os, runparams, dp, false, 0); } @@ -921,13 +908,18 @@ int InsetTabular::docbook(Buffer const & buf, ostream & os, OutputParams const & runparams) const { int ret = 0; - InsetOld * master; + InsetOld * master = 0; +#ifdef WITH_WARNINGS +#warning Why not pass a proper DocIterator here? +#endif +#if 0 // if the table is inside a float it doesn't need the informaltable // wrapper. Search for it. for (master = owner(); master; master = master->owner()) if (master->lyxCode() == InsetOld::FLOAT_CODE) break; +#endif if (!master) { os << ""; @@ -952,73 +944,40 @@ void InsetTabular::validate(LaTeXFeatures & features) const } -void InsetTabular::calculate_dimensions_of_cells(MetricsInfo & mi) const +InsetText const & InsetTabular::cell(int idx) const { - for (int i = 0, cell = -1; i < tabular.rows(); ++i) { - int maxAsc = 0; - int maxDesc = 0; - for (int j = 0; j < tabular.columns(); ++j) { - if (tabular.isPartOfMultiColumn(i, j)) - continue; - ++cell; - Dimension dim; - MetricsInfo m = mi; - m.base.textwidth = - tabular.column_info[j].p_width.inPixels(mi.base.textwidth); - tabular.getCellInset(cell).metrics(m, dim); - maxAsc = max(maxAsc, dim.asc); - maxDesc = max(maxDesc, dim.des); - tabular.setWidthOfCell(cell, dim.wid); - } - tabular.setAscentOfRow(i, maxAsc + ADD_TO_HEIGHT); - tabular.setDescentOfRow(i, maxDesc + ADD_TO_HEIGHT); - } + return tabular.getCellInset(idx); } -void InsetTabular::getCursorPos(int cell, int & x, int & y) const +InsetText & InsetTabular::cell(int idx) { - InsetText const & inset = tabular.getCellInset(cell); - inset.getCursorPos(cell, x, y); - x += inset.x() - xo_; - y += inset.y() - yo_; + return tabular.getCellInset(idx); } -void InsetTabular::setPos(BufferView * bv, int x, int y) const +void InsetTabular::getCursorPos(LCursor const & cur, int & x, int & y) const { - int const cell = getCell(x + xo_, y + yo_); - lyxerr << "# InsetTabular::setPos() cell: " << cell << endl; - InsetText const & inset = tabular.getCellInset(cell); - inset.text_.setCursorFromCoordinates(x, y); -#if 0 - cursory_ = 0; - int actcell = 0; - int actrow = 0; - int actcol = 0; - int ly = tabular.getDescentOfRow(actrow); - - // first search the right row - while (ly < y && actrow + 1 < tabular.rows()) { - cursory_ += tabular.getDescentOfRow(actrow) + - tabular.getAscentOfRow(actrow + 1) + - tabular.getAdditionalHeight(actrow + 1); - ++actrow; - ly = cursory_ + tabular.getDescentOfRow(actrow); - } - actcell = tabular.getCellNumber(actrow, actcol); - - // now search the right column - int lx = tabular.getWidthOfColumn(actcell) - - tabular.getAdditionalWidth(actcell); + cell(cur.idx()).getCursorPos(cur, x, y); +} - for (; !tabular.isLastCellInRow(actcell) && lx < x; ++actcell) - lx += tabular.getWidthOfColumn(actcell + 1) - + tabular.getAdditionalWidth(actcell); - cursorx_ = lx - tabular.getWidthOfColumn(actcell) + xo_ + 2; -#endif - resetPos(bv); +InsetBase * InsetTabular::setPos(LCursor & cur, int x, int y) const +{ + lyxerr << "# InsetTabular::setPos() x=" << x << " y=" << y << endl; + int idx_min = 0; + int dist_min = 1000000; + for (idx_type i = 0; i < nargs(); ++i) { + int d = getText(i)->dist(x, y); + if (d < dist_min) { + dist_min = d; + idx_min = i; + } + } + cur.idx() = idx_min; + InsetBase * inset = cell(cur.idx()).text_.editXY(cur, x, y); + //lyxerr << "# InsetTabular::setPos()\n" << cur << endl; + return inset; } @@ -1032,202 +991,95 @@ int InsetTabular::getCellXPos(int cell) const for (; c < cell; ++c) lx += tabular.getWidthOfColumn(c); - return lx - tabular.getWidthOfColumn(cell) + xo_; + return lx - tabular.getWidthOfColumn(cell) + xo(); } -void InsetTabular::resetPos(BufferView *) const +void InsetTabular::resetPos(LCursor & cur) const { -#if 0 -#ifdef WITH_WARNINGS -#warning This should be fixed in the right manner (20011128 Jug) -#endif - // fast hack to fix infinite repaintings! - if (in_reset_pos > 0) - return; - - int cell = 0; - int actcell = bv->cursor().cell(); + BufferView & bv = cur.bv(); + int actcell = cur.idx(); int actcol = tabular.column_of_cell(actcell); - int actrow = 0; - cursory_ = 0; - for (; cell < actcell && !tabular.isLastRow(cell); ++cell) { - if (tabular.isLastCellInRow(cell)) { - cursory_ += tabular.getDescentOfRow(actrow) + - tabular.getAscentOfRow(actrow + 1) + - tabular.getAdditionalHeight(actrow + 1); - ++actrow; - } - } - // we need this only from here on!!! - ++in_reset_pos; int const offset = ADD_TO_TABULAR_WIDTH + 2; int new_x = getCellXPos(actcell) + offset; int old_x = cursorx_; cursorx_ = new_x; // cursor.x(getCellXPos(actcell) + offset); if (actcol < tabular.columns() - 1 && scroll(false) && - tabular.getWidthOfTabular() < bv->workWidth()-20) + tabular.getWidthOfTabular() < bv.workWidth()-20) { scroll(bv, 0.0F); - updateLocal(bv); } else if (cursorx_ - offset > 20 && cursorx_ - offset + tabular.getWidthOfColumn(actcell) - > bv->workWidth() - 20) { + > bv.workWidth() - 20) { scroll(bv, - tabular.getWidthOfColumn(actcell) - 20); - updateLocal(bv); } else if (cursorx_ - offset < 20) { scroll(bv, 20 - cursorx_ + offset); - updateLocal(bv); - } else if (scroll() && xo_ > 20 && - xo_ + tabular.getWidthOfTabular() > bv->workWidth() - 20) { + } else if (scroll() && xo() > 20 && + xo() + tabular.getWidthOfTabular() > bv.workWidth() - 20) { scroll(bv, old_x - cursorx_); - updateLocal(bv); } - InsetTabularMailer(*this).updateDialog(bv); - in_reset_pos = 0; -#endif -} - - -bool InsetTabular::moveRight(BufferView * bv, CursorSlice & cur) -{ - bool moved = isRightToLeft(bv) - ? movePrevCell(bv, cur) : moveNextCell(bv, cur); - if (!moved) - return false; - resetPos(bv); - return true; -} - - -bool InsetTabular::moveRightLock(BufferView * bv, CursorSlice & cur) -{ - bool moved = isRightToLeft(bv) - ? movePrevCell(bv, cur) : moveNextCell(bv, cur); - if (!moved) - return false; - activateCellInset(bv, cur.idx_, false); - return true; -} - - -bool InsetTabular::moveLeft(BufferView * bv, CursorSlice & cur) -{ - bool moved = isRightToLeft(bv) - ? moveNextCell(bv, cur) : movePrevCell(bv, cur); - if (!moved) - return false; - resetPos(bv); - return true; -} - -bool InsetTabular::moveLeftLock(BufferView * bv, CursorSlice & cur) -{ - bool moved = isRightToLeft(bv) - ? moveNextCell(bv, cur) : movePrevCell(bv, cur); - if (!moved) - return false; - activateCellInset(bv, cur.idx_, true); - return true; -} - - -bool InsetTabular::moveUp(BufferView * bv, CursorSlice & cur) -{ - if (tabular.row_of_cell(cur.idx_) == 0) - return false; - cur.idx_ = tabular.getCellAbove(cur.idx_); - resetPos(bv); - return true; -} - - -bool InsetTabular::moveUpLock(BufferView * bv, CursorSlice & cur) -{ - if (tabular.row_of_cell(cur.idx_) == 0) - return false; - cur.idx_ = tabular.getCellAbove(cur.idx_); - resetPos(bv); - activateCellInset(bv, cur.idx_, bv->x_target(), 0); - return true; -} - - -bool InsetTabular::moveDown(BufferView * bv, CursorSlice & cur) -{ - if (tabular.row_of_cell(cur.idx_) == tabular.rows() - 1) - return false; - cur.idx_ = tabular.getCellBelow(cur.idx_); - resetPos(bv); - return true; -} - - -bool InsetTabular::moveDownLock(BufferView * bv, CursorSlice & cur) -{ - if (tabular.row_of_cell(cur.idx_) == tabular.rows() - 1) - return false; - cur.idx_ = tabular.getCellBelow(cur.idx_); - resetPos(bv); - activateCellInset(bv, cur.idx_, bv->x_target()); - return true; + InsetTabularMailer(*this).updateDialog(&bv); } -bool InsetTabular::moveNextCell(BufferView * bv, CursorSlice & cur) +void InsetTabular::moveNextCell(LCursor & cur) { - lyxerr << "InsetTabular::moveNextCell 1 cur: " << cur << endl; - if (isRightToLeft(bv)) { - if (tabular.isFirstCellInRow(cur.idx_)) { - int row = tabular.row_of_cell(cur.idx_); + lyxerr << "InsetTabular::moveNextCell 1 cur: " << cur.top() << endl; + if (isRightToLeft(cur)) { + lyxerr << "InsetTabular::moveNextCell A cur: " << endl; + if (tabular.isFirstCellInRow(cur.idx())) { + int row = tabular.row_of_cell(cur.idx()); if (row == tabular.rows() - 1) - return false; - cur.idx_ = tabular.getLastCellInRow(row); - cur.idx_ = tabular.getCellBelow(cur.idx_); + return; + cur.idx() = tabular.getLastCellInRow(row); + cur.idx() = tabular.getCellBelow(cur.idx()); } else { - if (cur.idx_ == 0) - return false; - --cur.idx_; + if (cur.idx() == 0) + return; + --cur.idx(); } } else { - if (tabular.isLastCell(cur.idx_)) - return false; - ++cur.idx_; + lyxerr << "InsetTabular::moveNextCell B cur: " << endl; + if (tabular.isLastCell(cur.idx())) + return; + ++cur.idx(); } - lyxerr << "InsetTabular::moveNextCell 2 cur: " << cur << endl; - resetPos(bv); - return true; + cur.par() = 0; + cur.pos() = 0; + lyxerr << "InsetTabular::moveNextCell 2 cur: " << cur.top() << endl; + resetPos(cur); } -bool InsetTabular::movePrevCell(BufferView * bv, CursorSlice & cur) +void InsetTabular::movePrevCell(LCursor & cur) { - if (isRightToLeft(bv)) { - if (tabular.isLastCellInRow(cur.idx_)) { - int row = tabular.row_of_cell(cur.idx_); + if (isRightToLeft(cur)) { + if (tabular.isLastCellInRow(cur.idx())) { + int row = tabular.row_of_cell(cur.idx()); if (row == 0) - return false; - cur.idx_ = tabular.getFirstCellInRow(row); - cur.idx_ = tabular.getCellAbove(cur.idx_); + return; + cur.idx() = tabular.getFirstCellInRow(row); + cur.idx() = tabular.getCellAbove(cur.idx()); } else { - if (tabular.isLastCell(cur.idx_)) - return false; - ++cur.idx_; + if (tabular.isLastCell(cur.idx())) + return; + ++cur.idx(); } } else { - if (cur.idx_ == 0) // first cell - return false; - --cur.idx_; + if (cur.idx() == 0) // first cell + return; + --cur.idx(); } - resetPos(bv); - return true; + cur.par() = 0; + cur.pos() = 0; + resetPos(cur); } -bool InsetTabular::tabularFeatures(BufferView * bv, string const & what) +bool InsetTabular::tabularFeatures(LCursor & cur, string const & what) { LyXTabular::Feature action = LyXTabular::LAST_ACTION; @@ -1247,7 +1099,7 @@ bool InsetTabular::tabularFeatures(BufferView * bv, string const & what) string const val = ltrim(what.substr(tabularFeature[i].feature.length())); - tabularFeatures(bv, action, val); + tabularFeatures(cur, action, val); return true; } @@ -1275,10 +1127,11 @@ void checkLongtableSpecial(LyXTabular::ltType & ltt, } // anon namespace -void InsetTabular::tabularFeatures(BufferView * bv, +void InsetTabular::tabularFeatures(LCursor & cur, LyXTabular::Feature feature, string const & value) { - int actcell = bv->cursor().idx(); + BufferView & bv = cur.bv(); + int actcell = cur.idx(); int sel_col_start; int sel_col_end; int sel_row_start; @@ -1327,14 +1180,9 @@ void InsetTabular::tabularFeatures(BufferView * bv, break; } - if (hasSelection()) { - getSelection(actcell, sel_row_start, sel_row_end, sel_col_start, sel_col_end); - } else { - sel_col_start = sel_col_end = tabular.column_of_cell(actcell); - sel_row_start = sel_row_end = tabular.row_of_cell(actcell); - } - recordUndo(bv, Undo::ATOMIC); + recordUndo(cur, Undo::ATOMIC); + getSelection(cur, sel_row_start, sel_row_end, sel_col_start, sel_col_end); int row = tabular.row_of_cell(actcell); int column = tabular.column_of_cell(actcell); bool flag = true; @@ -1347,10 +1195,10 @@ void InsetTabular::tabularFeatures(BufferView * bv, tabular.setColumnPWidth(actcell, len); if (len.zero() && tabular.getAlignment(actcell, true) == LYX_ALIGN_BLOCK) - tabularFeatures(bv, LyXTabular::ALIGN_CENTER, string()); + tabularFeatures(cur, LyXTabular::ALIGN_CENTER, string()); else if (!len.zero() && tabular.getAlignment(actcell, true) != LYX_ALIGN_BLOCK) - tabularFeatures(bv, LyXTabular::ALIGN_BLOCK, string()); + tabularFeatures(cur, LyXTabular::ALIGN_BLOCK, string()); break; } @@ -1365,14 +1213,12 @@ void InsetTabular::tabularFeatures(BufferView * bv, case LyXTabular::APPEND_ROW: // append the row into the tabular - tabular.appendRow(bv->buffer()->params(), actcell); - tabular.setOwner(this); + tabular.appendRow(bv.buffer()->params(), actcell); break; case LyXTabular::APPEND_COLUMN: // append the column into the tabular - tabular.appendColumn(bv->buffer()->params(), actcell); - tabular.setOwner(this); + tabular.appendColumn(bv.buffer()->params(), actcell); actcell = tabular.getCellNumber(row, column); break; @@ -1382,7 +1228,7 @@ void InsetTabular::tabularFeatures(BufferView * bv, if (sel_row_start >= tabular.rows()) --sel_row_start; actcell = tabular.getCellNumber(sel_row_start, column); - clearSelection(); + cur.selection() = false; break; case LyXTabular::DELETE_COLUMN: @@ -1391,7 +1237,7 @@ void InsetTabular::tabularFeatures(BufferView * bv, if (sel_col_start >= tabular.columns()) --sel_col_start; actcell = tabular.getCellNumber(row, sel_col_start); - clearSelection(); + cur.selection() = false; break; case LyXTabular::M_TOGGLE_LINE_TOP: @@ -1484,13 +1330,14 @@ void InsetTabular::tabularFeatures(BufferView * bv, _("You cannot set multicolumn vertically.")); return; } +#if 0 // just multicol for one Single Cell if (!hasSelection()) { - // check wether we are completly in a multicol + // check whether we are completly in a multicol if (tabular.isMultiColumn(actcell)) tabular.unsetMultiColumn(actcell); else - tabular.setMultiColumn(bv->buffer(), actcell, 1); + tabular.setMultiColumn(bv.buffer(), actcell, 1); break; } // we have a selection so this means we just add all this @@ -1505,19 +1352,22 @@ void InsetTabular::tabularFeatures(BufferView * bv, s_start = sel_cell_start; s_end = sel_cell_end; } - tabular.setMultiColumn(bv->buffer(), s_start, s_end - s_start + 1); + tabular.setMultiColumn(bv.buffer(), s_start, s_end - s_start + 1); actcell = s_start; - clearSelection(); +#endif + cur.selection() = false; break; } case LyXTabular::SET_ALL_LINES: setLines = true; case LyXTabular::UNSET_ALL_LINES: +#if 0 for (int i = sel_row_start; i <= sel_row_end; ++i) for (int j = sel_col_start; j <= sel_col_end; ++j) tabular.setAllLines( tabular.getCellNumber(i,j), setLines); +#endif break; case LyXTabular::SET_LONGTABULAR: @@ -1601,24 +1451,7 @@ void InsetTabular::tabularFeatures(BufferView * bv, break; } - updateLocal(bv); - InsetTabularMailer(*this).updateDialog(bv); -} - - -void InsetTabular::activateCellInset(BufferView * bv, int cell, int x, int y) -{ - tabular.getCellInset(cell).edit(bv, x, y); - bv->cursor().cell(cell); - updateLocal(bv); -} - - -void InsetTabular::activateCellInset(BufferView * bv, int cell, bool behind) -{ - tabular.getCellInset(cell).edit(bv, behind); - bv->cursor().cell(cell); - updateLocal(bv); + InsetTabularMailer(*this).updateDialog(&bv); } @@ -1635,221 +1468,27 @@ void InsetTabular::openLayoutDialog(BufferView * bv) const } -// -// function returns an object as defined in func_status.h: -// states OK, Unknown, Disabled, On, Off. -// -FuncStatus InsetTabular::getStatus(string const & what, int actcell) const -{ - FuncStatus status; - int action = LyXTabular::LAST_ACTION; - - int i = 0; - for (; tabularFeature[i].action != LyXTabular::LAST_ACTION; ++i) { - string const tmp = tabularFeature[i].feature; - if (tmp == what.substr(0, tmp.length())) { - //if (!compare(tabularFeatures[i].feature.c_str(), what.c_str(), - // tabularFeatures[i].feature.length())) - action = tabularFeature[i].action; - break; - } - } - if (action == LyXTabular::LAST_ACTION) { - status.clear(); - status.unknown(true); - return status; - } - - string const argument - = ltrim(what.substr(tabularFeature[i].feature.length())); - - int sel_row_start; - int sel_row_end; - int dummy; - LyXTabular::ltType dummyltt; - bool flag = true; - - if (hasSelection()) - getSelection(actcell, sel_row_start, sel_row_end, dummy, dummy); - else - sel_row_start = sel_row_end = tabular.row_of_cell(actcell); - - switch (action) { - case LyXTabular::SET_PWIDTH: - case LyXTabular::SET_MPWIDTH: - case LyXTabular::SET_SPECIAL_COLUMN: - case LyXTabular::SET_SPECIAL_MULTI: - case LyXTabular::APPEND_ROW: - case LyXTabular::APPEND_COLUMN: - case LyXTabular::DELETE_ROW: - case LyXTabular::DELETE_COLUMN: - case LyXTabular::SET_ALL_LINES: - case LyXTabular::UNSET_ALL_LINES: - status.clear(); - return status; - - case LyXTabular::MULTICOLUMN: - status.setOnOff(tabular.isMultiColumn(actcell)); - break; - - case LyXTabular::M_TOGGLE_LINE_TOP: - flag = false; - case LyXTabular::TOGGLE_LINE_TOP: - status.setOnOff(tabular.topLine(actcell, flag)); - break; - - case LyXTabular::M_TOGGLE_LINE_BOTTOM: - flag = false; - case LyXTabular::TOGGLE_LINE_BOTTOM: - status.setOnOff(tabular.bottomLine(actcell, flag)); - break; - - case LyXTabular::M_TOGGLE_LINE_LEFT: - flag = false; - case LyXTabular::TOGGLE_LINE_LEFT: - status.setOnOff(tabular.leftLine(actcell, flag)); - break; - - case LyXTabular::M_TOGGLE_LINE_RIGHT: - flag = false; - case LyXTabular::TOGGLE_LINE_RIGHT: - status.setOnOff(tabular.rightLine(actcell, flag)); - break; - - case LyXTabular::M_ALIGN_LEFT: - flag = false; - case LyXTabular::ALIGN_LEFT: - status.setOnOff(tabular.getAlignment(actcell, flag) == LYX_ALIGN_LEFT); - break; - - case LyXTabular::M_ALIGN_RIGHT: - flag = false; - case LyXTabular::ALIGN_RIGHT: - status.setOnOff(tabular.getAlignment(actcell, flag) == LYX_ALIGN_RIGHT); - break; - - case LyXTabular::M_ALIGN_CENTER: - flag = false; - case LyXTabular::ALIGN_CENTER: - status.setOnOff(tabular.getAlignment(actcell, flag) == LYX_ALIGN_CENTER); - break; - - case LyXTabular::ALIGN_BLOCK: - status.disabled(tabular.getPWidth(actcell).zero()); - status.setOnOff(tabular.getAlignment(actcell, flag) == LYX_ALIGN_BLOCK); - break; - - case LyXTabular::M_VALIGN_TOP: - flag = false; - case LyXTabular::VALIGN_TOP: - status.setOnOff( - tabular.getVAlignment(actcell, flag) == LyXTabular::LYX_VALIGN_TOP); - break; - - case LyXTabular::M_VALIGN_BOTTOM: - flag = false; - case LyXTabular::VALIGN_BOTTOM: - status.setOnOff( - tabular.getVAlignment(actcell, flag) == LyXTabular::LYX_VALIGN_BOTTOM); - break; - - case LyXTabular::M_VALIGN_MIDDLE: - flag = false; - case LyXTabular::VALIGN_MIDDLE: - status.setOnOff( - tabular.getVAlignment(actcell, flag) == LyXTabular::LYX_VALIGN_MIDDLE); - break; - - case LyXTabular::SET_LONGTABULAR: - status.setOnOff(tabular.isLongTabular()); - break; - - case LyXTabular::UNSET_LONGTABULAR: - status.setOnOff(!tabular.isLongTabular()); - break; - - case LyXTabular::SET_ROTATE_TABULAR: - status.setOnOff(tabular.getRotateTabular()); - break; - - case LyXTabular::UNSET_ROTATE_TABULAR: - status.setOnOff(!tabular.getRotateTabular()); - break; - - case LyXTabular::SET_ROTATE_CELL: - status.setOnOff(tabular.getRotateCell(actcell)); - break; - - case LyXTabular::UNSET_ROTATE_CELL: - status.setOnOff(!tabular.getRotateCell(actcell)); - break; - - case LyXTabular::SET_USEBOX: - status.setOnOff(strToInt(argument) == tabular.getUsebox(actcell)); - break; - - case LyXTabular::SET_LTFIRSTHEAD: - status.setOnOff(tabular.getRowOfLTHead(sel_row_start, dummyltt)); - break; - - case LyXTabular::SET_LTHEAD: - status.setOnOff(tabular.getRowOfLTHead(sel_row_start, dummyltt)); - break; - - case LyXTabular::SET_LTFOOT: - status.setOnOff(tabular.getRowOfLTFoot(sel_row_start, dummyltt)); - break; - - case LyXTabular::SET_LTLASTFOOT: - status.setOnOff(tabular.getRowOfLTFoot(sel_row_start, dummyltt)); - break; - - case LyXTabular::SET_LTNEWPAGE: - status.setOnOff(tabular.getLTNewPage(sel_row_start)); - break; - - default: - status.clear(); - status.disabled(true); - break; - } - return status; -} - - void InsetTabular::getLabelList(Buffer const & buffer, - std::vector & list) const + vector & list) const { tabular.getLabelList(buffer, list); } -bool InsetTabular::copySelection(BufferView * bv) +bool InsetTabular::copySelection(LCursor & cur) { - if (!hasSelection()) + if (!cur.selection()) return false; - int sel_col_start = tabular.column_of_cell(sel_cell_start); - int sel_col_end = tabular.column_of_cell(sel_cell_end); - if (sel_col_start > sel_col_end) { - sel_col_start = sel_col_end; - sel_col_end = tabular.right_column_of_cell(sel_cell_start); - } else { - sel_col_end = tabular.right_column_of_cell(sel_cell_end); - } - - int sel_row_start = tabular.row_of_cell(sel_cell_start); - int sel_row_end = tabular.row_of_cell(sel_cell_end); - if (sel_row_start > sel_row_end) - swap(sel_row_start, sel_row_end); + int rs, re, cs, ce; + getSelection(cur, rs, re, cs, ce); paste_tabular.reset(new LyXTabular(tabular)); - paste_tabular->setOwner(this); - for (int i = 0; i < sel_row_start; ++i) + for (int i = 0; i < rs; ++i) paste_tabular->deleteRow(0); - int const rows = sel_row_end - sel_row_start + 1; + int const rows = re - rs + 1; while (paste_tabular->rows() > rows) paste_tabular->deleteRow(rows); @@ -1857,10 +1496,10 @@ bool InsetTabular::copySelection(BufferView * bv) paste_tabular->setBottomLine(paste_tabular->getFirstCellInRow(rows - 1), true, true); - for (int i = 0; i < sel_col_start; ++i) + for (int i = 0; i < cs; ++i) paste_tabular->deleteColumn(0); - int const columns = sel_col_end - sel_col_start + 1; + int const columns = ce - cs + 1; while (paste_tabular->columns() > columns) paste_tabular->deleteColumn(columns); @@ -1870,18 +1509,17 @@ bool InsetTabular::copySelection(BufferView * bv) ostringstream os; OutputParams const runparams; - paste_tabular->plaintext(*bv->buffer(), os, runparams, - ownerPar(*bv->buffer(), this).params().depth(), true, '\t'); - bv->stuffClipboard(os.str()); + paste_tabular->plaintext(cur.buffer(), os, runparams, 0, true, '\t'); + cur.bv().stuffClipboard(os.str()); return true; } -bool InsetTabular::pasteSelection(BufferView * bv) +bool InsetTabular::pasteSelection(LCursor & cur) { if (!paste_tabular) return false; - int actcell = bv->cursor().idx(); + int actcell = cur.idx(); int actcol = tabular.column_of_cell(actcell); int actrow = tabular.row_of_cell(actcell); for (int r1 = 0, r2 = actrow; @@ -1903,7 +1541,6 @@ bool InsetTabular::pasteSelection(BufferView * bv) } InsetText & inset = tabular.getCellInset(r2, c2); inset = paste_tabular->getCellInset(r1, c1); - inset.setOwner(this); inset.markNew(); } } @@ -1911,86 +1548,73 @@ bool InsetTabular::pasteSelection(BufferView * bv) } -bool InsetTabular::cutSelection(BufferParams const & bp) +void InsetTabular::cutSelection(LCursor & cur) { - if (!hasSelection()) - return false; - - int sel_col_start = tabular.column_of_cell(sel_cell_start); - int sel_col_end = tabular.column_of_cell(sel_cell_end); - if (sel_col_start > sel_col_end) { - sel_col_start = sel_col_end; - sel_col_end = tabular.right_column_of_cell(sel_cell_start); - } else { - sel_col_end = tabular.right_column_of_cell(sel_cell_end); - } - - int sel_row_start = tabular.row_of_cell(sel_cell_start); - int sel_row_end = tabular.row_of_cell(sel_cell_end); - - if (sel_row_start > sel_row_end) - swap(sel_row_start, sel_row_end); - - if (sel_cell_start > sel_cell_end) - swap(sel_cell_start, sel_cell_end); + if (!cur.selection()) + return; - for (int i = sel_row_start; i <= sel_row_end; ++i) - for (int j = sel_col_start; j <= sel_col_end; ++j) - tabular.getCellInset(tabular.getCellNumber(i, j)) - .clear(bp.tracking_changes); - return true; + bool const track = cur.buffer().params().tracking_changes; + int rs, re, cs, ce; + getSelection(cur, rs, re, cs, ce); + for (int i = rs; i <= re; ++i) + for (int j = cs; j <= ce; ++j) + cell(tabular.getCellNumber(i, j)).clear(track); } -bool InsetTabular::isRightToLeft(BufferView * bv) +bool InsetTabular::isRightToLeft(LCursor & cur) const { - return bv->getParentLanguage(this)->RightToLeft(); + BOOST_ASSERT(cur.size() > 1); + Paragraph const & parentpar = cur[cur.size() - 2].paragraph(); + LCursor::pos_type const parentpos = cur[cur.size() - 2].pos(); + return parentpar.getFontSettings(cur.bv().buffer()->params(), + parentpos).language()->RightToLeft(); } -void InsetTabular::getSelection(int actcell, - int & srow, int & erow, int & scol, int & ecol) const +void InsetTabular::getSelection(LCursor & cur, + int & rs, int & re, int & cs, int & ce) const { - int const start = hasSelection() ? sel_cell_start : actcell; - int const end = hasSelection() ? sel_cell_end : actcell; - - srow = tabular.row_of_cell(start); - erow = tabular.row_of_cell(end); - if (srow > erow) - swap(srow, erow); - - scol = tabular.column_of_cell(start); - ecol = tabular.column_of_cell(end); - if (scol > ecol) - swap(scol, ecol); - else - ecol = tabular.right_column_of_cell(end); + CursorSlice const & beg = cur.selBegin(); + CursorSlice const & end = cur.selEnd(); + cs = tabular.column_of_cell(beg.idx()); + ce = tabular.column_of_cell(end.idx()); + if (cs > ce) { + ce = cs; + cs = tabular.column_of_cell(end.idx()); + } else { + ce = tabular.right_column_of_cell(end.idx()); + } + + rs = tabular.row_of_cell(beg.idx()); + re = tabular.row_of_cell(end.idx()); + if (rs > re) + swap(rs, re); } -int InsetTabular::numParagraphs() const +size_t InsetTabular::nargs() const { return tabular.getNumberOfCells(); } -LyXText * InsetTabular::getText(int i) const +LyXText * InsetTabular::getText(int idx) const { - return i < tabular.getNumberOfCells() - ? tabular.getCellInset(i).getText(0) - : 0; + return size_t(idx) < nargs() ? cell(idx).getText(0) : 0; } void InsetTabular::markErased() { - for (int cell = 0; cell < tabular.getNumberOfCells(); ++cell) - tabular.getCellInset(cell).markErased(); + for (idx_type idx = 0; idx < nargs(); ++idx) + cell(idx).markErased(); } -bool InsetTabular::forceDefaultParagraphs(InsetOld const * in) const +bool InsetTabular::forceDefaultParagraphs(InsetBase const *) const { +#if 0 const int cell = tabular.getCellFromInset(in); if (cell != -1) @@ -2004,10 +1628,12 @@ bool InsetTabular::forceDefaultParagraphs(InsetOld const * in) const // well we didn't obviously find it so maybe our owner knows more BOOST_ASSERT(owner()); return owner()->forceDefaultParagraphs(in); +#endif + return false; } -bool InsetTabular::insertAsciiString(BufferView * bv, string const & buf, +bool InsetTabular::insertAsciiString(BufferView & bv, string const & buf, bool usePaste) { if (buf.length() <= 0) @@ -2019,7 +1645,7 @@ bool InsetTabular::insertAsciiString(BufferView * bv, string const & buf, string::size_type len = buf.length(); string::size_type p = 0; - int actcell = bv->cursor().idx(); + int actcell = bv.cursor().idx(); int actcol = tabular.column_of_cell(actcell); int actrow = tabular.row_of_cell(actcell); @@ -2044,10 +1670,7 @@ bool InsetTabular::insertAsciiString(BufferView * bv, string const & buf, int row = 0; if (usePaste) { paste_tabular.reset( - new LyXTabular(bv->buffer()->params(), rows, maxCols) - ); - - paste_tabular->setOwner(this); + new LyXTabular(bv.buffer()->params(), rows, maxCols)); loctab = paste_tabular.get(); cols = 0; } else { @@ -2074,8 +1697,8 @@ bool InsetTabular::insertAsciiString(BufferView * bv, string const & buf, // we can only set this if we are not too far right if (cols < columns) { InsetText & inset = loctab->getCellInset(cell); - LyXFont const font = inset.text_. - getFont(inset.paragraphs().begin(), 0); + Paragraph & par = inset.text_.getPar(0); + LyXFont const font = inset.text_.getFont(par, 0); inset.setText(buf.substr(op, p - op), font); ++cols; ++cell; @@ -2085,8 +1708,8 @@ bool InsetTabular::insertAsciiString(BufferView * bv, string const & buf, // we can only set this if we are not too far right if (cols < columns) { InsetText & inset = tabular.getCellInset(cell); - LyXFont const font = inset.text_. - getFont(inset.paragraphs().begin(), 0); + Paragraph & par = inset.text_.getPar(0); + LyXFont const font = inset.text_.getFont(par, 0); inset.setText(buf.substr(op, p - op), font); } cols = ocol; @@ -2101,7 +1724,8 @@ bool InsetTabular::insertAsciiString(BufferView * bv, string const & buf, // check for the last cell if there is no trailing '\n' if (cell < cells && op < len) { InsetText & inset = loctab->getCellInset(cell); - LyXFont const font = inset.text_.getFont(inset.paragraphs().begin(), 0); + Paragraph & par = inset.text_.getPar(0); + LyXFont const font = inset.text_.getFont(par, 0); inset.setText(buf.substr(op, len - op), font); } return true; @@ -2119,21 +1743,13 @@ void InsetTabular::addPreview(PreviewLoader & loader) const } - -void InsetTabular::clearSelection() const +bool InsetTabular::tablemode(LCursor & cur) const { - sel_cell_start = 0; - sel_cell_end = 0; - has_selection = false; + return cur.selection() && cur.selBegin().idx() != cur.selEnd().idx(); } -void InsetTabular::setSelection(int start, int end) const -{ - sel_cell_start = start; - sel_cell_end = end; - has_selection = true; -} + string const InsetTabularMailer::name_("tabular"); @@ -2155,7 +1771,9 @@ int InsetTabularMailer::string2params(string const & in, InsetTabular & inset) LyXLex lex(0,0); lex.setStream(data); +#ifdef WITH_WARNINGS #warning CHECK verify that this is a sane value to return. +#endif if (in.empty()) return -1; @@ -2200,7 +1818,9 @@ int InsetTabularMailer::string2params(string const & in, InsetTabular & inset) string const InsetTabularMailer::params2string(InsetTabular const & inset) { ostringstream data; +#ifdef WITH_WARNINGS #warning wrong! +#endif //data << name_ << " \\active_cell " << inset.getActCell() << '\n'; data << name_ << " \\active_cell " << 0 << '\n'; inset.write(inset.buffer(), data);