#include "BufferView.h"
#include "lfuns.h"
#include "debug.h"
+#include "dimension.h"
#include "funcrequest.h"
#include "gettext.h"
#include "language.h"
#include "LaTeXFeatures.h"
+#include "Lsstream.h"
#include "lyx_cb.h"
#include "lyxfunc.h"
#include "lyxlength.h"
#include "ParagraphParameters.h"
#include "undo_funcs.h"
#include "WordLangTuple.h"
-#include "Lsstream.h"
+#include "metricsinfo.h"
#include "frontends/Alert.h"
#include "frontends/Dialogs.h"
InsetTabular::InsetTabular(Buffer const & buf, int rows, int columns)
- : buffer(&buf)
+ : buffer_(&buf)
{
if (rows <= 0)
rows = 1;
}
-InsetTabular::InsetTabular(InsetTabular const & tab, Buffer const & buf,
- bool same_id)
- : UpdatableInset(tab, same_id), buffer(&buf)
+InsetTabular::InsetTabular(InsetTabular const & tab)
+ : UpdatableInset(tab), buffer_(tab.buffer_)
{
- tabular.reset(new LyXTabular(buf.params,
- this, *(tab.tabular), same_id));
+ tabular.reset(new LyXTabular(buffer_->params,
+ this, *(tab.tabular)));
the_locking_inset = 0;
old_locking_inset = 0;
locked = false;
}
-Inset * InsetTabular::clone(Buffer const & buf, bool same_id) const
+Inset * InsetTabular::clone() const
{
- return new InsetTabular(*this, buf, same_id);
+ return new InsetTabular(*this);
}
BufferView * InsetTabular::view() const
{
- return buffer->getUser();
+ return buffer_->getUser();
+}
+
+
+void InsetTabular::buffer(Buffer * b)
+{
+ buffer_ = b;
}
}
-int InsetTabular::ascent(BufferView *, LyXFont const &) const
-{
- return tabular->GetAscentOfRow(0);
-}
-
-
-int InsetTabular::descent(BufferView *, LyXFont const &) const
+void InsetTabular::metrics(MetricsInfo &,
+ Dimension & dim) const
{
- return tabular->GetHeightOfTabular() - tabular->GetAscentOfRow(0) + 1;
+ dim.asc = tabular->GetAscentOfRow(0);
+ dim.des = tabular->GetHeightOfTabular() - tabular->GetAscentOfRow(0) + 1;
+ dim.wid = tabular->GetWidthOfTabular() + 2 * ADD_TO_TABULAR_WIDTH;
}
-int InsetTabular::width(BufferView *, LyXFont const &) const
-{
- return tabular->GetWidthOfTabular() + (2 * ADD_TO_TABULAR_WIDTH);
-}
-
-
-void InsetTabular::draw(BufferView * bv, LyXFont const & font, int baseline,
- float & x) const
+void InsetTabular::draw(PainterInfo & pi, int x, int y) const
{
if (nodraw()) {
need_update = FULL;
return;
}
- Painter & pain = bv->painter();
+ BufferView * bv = pi.base.bv;
int i;
int j;
int nx;
#if 0
- UpdatableInset::draw(bv, font, baseline, x);
+ UpdatableInset::draw(pi, x, y);
#else
if (!owner())
- x += static_cast<float>(scroll());
+ x += scroll();
#endif
- top_x = int(x);
- top_baseline = baseline;
+ top_x = x;
+ top_baseline = y;
x += ADD_TO_TABULAR_WIDTH;
int cell = 0;
- float cx;
+ int cx;
first_visible_cell = -1;
for (i = 0; i < tabular->rows(); ++i) {
- nx = int(x);
+ nx = x;
cell = tabular->GetCellNumber(i, 0);
- if (!((baseline + tabular->GetDescentOfRow(i)) > 0) &&
- (baseline - tabular->GetAscentOfRow(i))<pain.paperHeight())
+ if (!((y + tabular->GetDescentOfRow(i)) > 0) &&
+ (y - tabular->GetAscentOfRow(i)) < pi.pain.paperHeight())
{
- baseline += tabular->GetDescentOfRow(i) +
+ y += tabular->GetDescentOfRow(i) +
tabular->GetAscentOfRow(i + 1) +
tabular->GetAdditionalHeight(i + 1);
continue;
if (first_visible_cell < 0)
first_visible_cell = cell;
if (hasSelection()) {
- drawCellSelection(pain, nx, baseline, i, j, cell);
+ drawCellSelection(pi.pain, nx, y, i, j, cell);
}
- tabular->GetCellInset(cell)->draw(bv, font, baseline, cx);
- drawCellLines(pain, nx, baseline, i, cell);
+ tabular->GetCellInset(cell)->draw(pi, cx, y);
+ drawCellLines(pi.pain, nx, y, i, cell);
nx += tabular->GetWidthOfColumn(cell);
++cell;
}
- baseline += tabular->GetDescentOfRow(i) +
+
+// Would be nice, but for some completely unfathomable reason,
+// on a col resize to a new fixed width, even though the insettexts
+// are resized, the cell isn't, but drawing all cells in a tall table
+// has the desired effect somehow. Complete dark magic.
+#if 0
+ // avoiding drawing the rest of a long table is
+ // a pretty big speedup
+ if (y > bv->workHeight())
+ break;
+#endif
+
+ y += tabular->GetDescentOfRow(i) +
tabular->GetAscentOfRow(i + 1) +
tabular->GetAdditionalHeight(i + 1);
}
- x -= ADD_TO_TABULAR_WIDTH;
- x += width(bv, font);
need_update = NONE;
}
-void InsetTabular::drawCellLines(Painter & pain, int x, int baseline,
+void InsetTabular::drawCellLines(Painter & pain, int x, int y,
int row, int cell) const
{
int x2 = x + tabular->GetWidthOfColumn(cell);
if (!tabular->topAlreadyDrawn(cell)) {
on_off = !tabular->TopLine(cell);
- pain.line(x, baseline - tabular->GetAscentOfRow(row),
- x2, baseline - tabular->GetAscentOfRow(row),
+ pain.line(x, y - tabular->GetAscentOfRow(row),
+ x2, y - tabular->GetAscentOfRow(row),
on_off ? LColor::tabularonoffline : LColor::tabularline,
on_off ? Painter::line_onoffdash : Painter::line_solid);
}
on_off = !tabular->BottomLine(cell);
- pain.line(x, baseline + tabular->GetDescentOfRow(row),
- x2, baseline + tabular->GetDescentOfRow(row),
+ pain.line(x, y + tabular->GetDescentOfRow(row),
+ x2, y + tabular->GetDescentOfRow(row),
on_off ? LColor::tabularonoffline : LColor::tabularline,
on_off ? Painter::line_onoffdash : Painter::line_solid);
if (!tabular->leftAlreadyDrawn(cell)) {
on_off = !tabular->LeftLine(cell);
- pain.line(x, baseline - tabular->GetAscentOfRow(row),
- x, baseline + tabular->GetDescentOfRow(row),
+ pain.line(x, y - tabular->GetAscentOfRow(row),
+ x, y + tabular->GetDescentOfRow(row),
on_off ? LColor::tabularonoffline : LColor::tabularline,
on_off ? Painter::line_onoffdash : Painter::line_solid);
}
on_off = !tabular->RightLine(cell);
pain.line(x2 - tabular->GetAdditionalWidth(cell),
- baseline - tabular->GetAscentOfRow(row),
+ y - tabular->GetAscentOfRow(row),
x2 - tabular->GetAdditionalWidth(cell),
- baseline + tabular->GetDescentOfRow(row),
+ y + tabular->GetDescentOfRow(row),
on_off ? LColor::tabularonoffline : LColor::tabularline,
on_off ? Painter::line_onoffdash : Painter::line_solid);
}
-void InsetTabular::drawCellSelection(Painter & pain, int x, int baseline,
+void InsetTabular::drawCellSelection(Painter & pain, int x, int y,
int row, int column, int cell) const
{
lyx::Assert(hasSelection());
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, baseline - tabular->GetAscentOfRow(row) + 1,
+ pain.fillRectangle(x, y - tabular->GetAscentOfRow(row) + 1,
w, h, LColor::selection);
}
}
}
-void InsetTabular::edit(BufferView * bv, int x, int y, mouse_button::state button)
-{
- UpdatableInset::edit(bv, x, y, button);
-
- if (!bv->lockInset(this)) {
- lyxerr[Debug::INSETTEXT] << "InsetTabular::Cannot lock inset" << endl;
- return;
- }
- locked = true;
- the_locking_inset = 0;
- inset_x = 0;
- inset_y = 0;
- setPos(bv, x, y);
- clearSelection();
- finishUndo();
- if (insetHit(bv, x, y) && (button != mouse_button::button3)) {
- activateCellInsetAbs(bv, x, y, button);
- }
-}
-
-
-void InsetTabular::edit(BufferView * bv, bool front)
-{
- UpdatableInset::edit(bv, front);
-
- if (!bv->lockInset(this)) {
- lyxerr[Debug::INSETTEXT] << "InsetTabular::Cannot lock inset" << endl;
- return;
- }
- finishUndo();
- locked = true;
- the_locking_inset = 0;
- inset_x = 0;
- inset_y = 0;
- if (front) {
- if (isRightToLeft(bv))
- actcell = tabular->GetLastCellInRow(0);
- else
- actcell = 0;
- } else {
- if (isRightToLeft(bv))
- actcell = tabular->GetFirstCellInRow(tabular->rows()-1);
- else
- actcell = tabular->GetNumberOfCells() - 1;
- }
- clearSelection();
- resetPos(bv);
- bv->fitCursor();
-}
-
-
void InsetTabular::insetUnlock(BufferView * bv)
{
if (the_locking_inset) {
}
if (in->getInsetFromID(id)) {
actcell = i;
- in->edit(bv);
+ in->localDispatch(FuncRequest(bv, LFUN_INSET_EDIT));
return the_locking_inset->lockInsetInInset(bv, inset);
}
}
ret = the_locking_inset->localDispatch(cmd1);
}
if (cmd.button() == mouse_button::button3 && !ret) {
- InsetTabularMailer mailer(*this);
- mailer.showDialog(cmd.view());
+ InsetTabularMailer(*this).showDialog(cmd.view());
return true;
}
return ret;
// the_locking_inset->localDispatch might unlock it.
old_locking_inset = the_locking_inset;
RESULT result = UpdatableInset::localDispatch(cmd);
-
BufferView * bv = cmd.view();
+
+ if (cmd.action == LFUN_INSET_EDIT) {
+
+ if (!bv->lockInset(this)) {
+ lyxerr[Debug::INSETTEXT] << "InsetTabular::Cannot lock inset" << endl;
+ return DISPATCHED;
+ }
+
+ finishUndo();
+ locked = true;
+ the_locking_inset = 0;
+ inset_x = 0;
+ inset_y = 0;
+
+ if (cmd.argument.size()) {
+ if (cmd.argument == "left") {
+ if (isRightToLeft(bv))
+ actcell = tabular->GetLastCellInRow(0);
+ else
+ actcell = 0;
+ } else {
+ if (isRightToLeft(bv))
+ actcell = tabular->GetFirstCellInRow(tabular->rows()-1);
+ else
+ actcell = tabular->GetNumberOfCells() - 1;
+ }
+ clearSelection();
+ resetPos(bv);
+ bv->fitCursor();
+ }
+
+ else {
+ setPos(bv, cmd.x, cmd.y);
+ clearSelection();
+ finishUndo();
+ if (insetHit(bv, cmd.x, cmd.y) && cmd.button() != mouse_button::button3) {
+ activateCellInsetAbs(bv, cmd.x, cmd.y, cmd.button());
+ }
+ }
+ return DISPATCHED;
+ }
+
if (result == DISPATCHED || result == DISPATCHED_NOUPDATE) {
resetPos(bv);
return result;
break;
// no break here!
case LFUN_DELETE:
- setUndo(bv, Undo::DELETE,
- bv->text->cursor.par(),
- boost::next(bv->text->cursor.par()));
+ setUndo(bv, Undo::DELETE, bv->text->cursor.par());
cutSelection(bv->buffer()->params);
updateLocal(bv, INIT);
break;
}
case LFUN_PASTE:
if (hasPasteBuffer()) {
- setUndo(bv, Undo::INSERT,
- bv->text->cursor.par(),
- boost::next(bv->text->cursor.par()));
+ setUndo(bv, Undo::INSERT, bv->text->cursor.par());
pasteSelection(bv);
updateLocal(bv, INIT);
break;
int InsetTabular::latex(Buffer const * buf, ostream & os,
- bool fragile, bool fp) const
+ LatexRunParams const & runparams) const
{
- return tabular->latex(buf, os, fragile, fp);
+ return tabular->latex(buf, os, runparams);
}
setSelection(0, tabular->GetNumberOfCells() - 1);
}
if (hasSelection()) {
- setUndo(bv, Undo::EDIT,
- bv->text->cursor.par(),
- boost::next(bv->text->cursor.par()));
+ setUndo(bv, Undo::EDIT, bv->text->cursor.par());
bool const frozen = undo_frozen;
if (!frozen)
freezeUndo();
sel_col_start = sel_col_end = tabular->column_of_cell(actcell);
sel_row_start = sel_row_end = tabular->row_of_cell(actcell);
}
- setUndo(bv, Undo::FINISH,
- bv->text->cursor.par(),
- boost::next(bv->text->cursor.par()));
+ setUndo(bv, Undo::FINISH, bv->text->cursor.par());
int row = tabular->row_of_cell(actcell);
int column = tabular->column_of_cell(actcell);
bool const update = (tmplen != vallen);
tabular->SetColumnPWidth(actcell, vallen);
if (update) {
+ // We need this otherwise we won't resize
+ // the insettext of the active cell (if any)
+ // until later (see InsetText::do_resize)
+ unlockInsetInInset(bv, the_locking_inset);
+
int cell;
for (int i = 0; i < tabular->rows(); ++i) {
cell = tabular->GetCellNumber(i,column);
bool const update = (tmplen != vallen);
tabular->SetMColumnPWidth(actcell, vallen);
if (update) {
+ // We need this otherwise we won't resize
+ // the insettext of the active cell (if any)
+ // until later (see InsetText::do_resize)
+ unlockInsetInInset(bv, the_locking_inset);
+
for (int i = 0; i < tabular->rows(); ++i) {
tabular->GetCellInset(tabular->GetCellNumber(i, column))->
resizeLyXText(bv);
}
//inset_x = cursor.x() - top_x + tabular->GetBeginningOfTextInCell(actcell);
//inset_y = cursor.y();
- inset->edit(bv, x, y, button);
+ inset->localDispatch(FuncRequest(bv, LFUN_INSET_EDIT, x, y, button));
if (!the_locking_inset)
return false;
updateLocal(bv, CELL);
// otherwise we have to lock the next inset and ask for it's selecttion
UpdatableInset * inset =
static_cast<UpdatableInset*>(tabular->GetCellInset(actcell));
- inset->edit(bv, 0, 0, mouse_button::none);
+ inset->localDispatch(FuncRequest(bv, LFUN_INSET_EDIT));
WordLangTuple word(selectNextWordInt(bv, value));
nodraw(false);
if (!word.word().empty())
// otherwise we have to lock the next inset and ask for it's selecttion
UpdatableInset * inset =
static_cast<UpdatableInset*>(tabular->GetCellInset(++actcell));
- inset->edit(bv);
+ inset->localDispatch(FuncRequest(bv, LFUN_INSET_EDIT));
return selectNextWordInt(bv, value);
}
if (cols < columns) {
InsetText * ti = loctab->GetCellInset(cell);
LyXFont const font = ti->getLyXText(bv)->
- getFont(bv->buffer(), &*ti->paragraphs.begin(), 0);
+ getFont(bv->buffer(), ti->paragraphs.begin(), 0);
ti->setText(buf.substr(op, p - op), font);
++cols;
++cell;
if (cols < columns) {
InsetText * ti = loctab->GetCellInset(cell);
LyXFont const font = ti->getLyXText(bv)->
- getFont(bv->buffer(), &*ti->paragraphs.begin(), 0);
+ getFont(bv->buffer(), ti->paragraphs.begin(), 0);
ti->setText(buf.substr(op, p - op), font);
}
cols = ocol;
if ((cell < cells) && (op < len)) {
InsetText * ti = loctab->GetCellInset(cell);
LyXFont const font = ti->getLyXText(bv)->
- getFont(bv->buffer(), &*ti->paragraphs.begin(), 0);
+ getFont(bv->buffer(), ti->paragraphs.begin(), 0);
ti->setText(buf.substr(op, len - op), font);
}
if (!lex.isOK())
return -1;
+ // FIXME: even current_view would be better than this.
BufferView * const bv = inset.view();
Buffer const * const buffer = bv ? bv->buffer() : 0;
if (buffer)
string const InsetTabularMailer::params2string(InsetTabular const & inset)
{
+ // FIXME: even current_view would be better than this.
BufferView * const bv = inset.view();
Buffer const * const buffer = bv ? bv->buffer() : 0;
if (!buffer)