#include "support/convert.h"
#include "frontends/Alert.h"
-#include "frontends/font_metrics.h"
-#include "frontends/Gui.h"
-#include "frontends/LyXView.h"
#include "frontends/Clipboard.h"
#include "frontends/Painter.h"
#include "frontends/Selection.h"
-#include "frontends/nullpainter.h"
#include <sstream>
#include <iostream>
#include <limits>
-using lyx::docstring;
-using lyx::cap::dirtyTabularStack;
-using lyx::cap::tabularStackDirty;
+namespace lyx {
-using lyx::graphics::PreviewLoader;
+using cap::dirtyTabularStack;
+using cap::tabularStackDirty;
-using lyx::support::ltrim;
+using graphics::PreviewLoader;
-using lyx::frontend::Painter;
-using lyx::frontend::Gui;
-using lyx::frontend::Clipboard;
+using support::ltrim;
+
+using frontend::Painter;
+using frontend::Clipboard;
using boost::shared_ptr;
using std::swap;
using std::vector;
+namespace Alert = frontend::Alert;
+
namespace {
{ LyXTabular::APPEND_COLUMN, "append-column" },
{ LyXTabular::DELETE_ROW, "delete-row" },
{ LyXTabular::DELETE_COLUMN, "delete-column" },
+ { LyXTabular::COPY_ROW, "copy-row" },
+ { LyXTabular::COPY_COLUMN, "copy-column" },
{ LyXTabular::TOGGLE_LINE_TOP, "toggle-line-top" },
{ LyXTabular::TOGGLE_LINE_BOTTOM, "toggle-line-bottom" },
{ LyXTabular::TOGGLE_LINE_LEFT, "toggle-line-left" },
//lyxerr << "InsetTabular::draw: " << x << " " << y << endl;
BufferView * bv = pi.base.bv;
- static lyx::frontend::NullPainter nop;
- static PainterInfo nullpi(bv, nop);
-
- //resetPos(bv->cursor());
+ resetPos(bv->cursor());
x += scx_;
x += ADD_TO_TABULAR_WIDTH;
|| nx > bv->workWidth()
|| y + d < 0
|| y - a > bv->workHeight()) {
- cell(idx)->draw(nullpi, cx, y);
- drawCellLines(nop, nx, y, i, idx, pi.erased_);
+ pi.pain.setDrawingEnabled(false);
+ cell(idx)->draw(pi, cx, y);
+ drawCellLines(pi.pain, nx, y, i, idx, pi.erased_);
+ pi.pain.setDrawingEnabled(true);
} else {
cell(idx)->draw(pi, cx, y);
drawCellLines(pi.pain, nx, y, i, idx, pi.erased_);
cur.pit() = 0;
cur.pos() = cur.lastpos(); // FIXME crude guess
}
- // this accesses the position cache before it is initialized
+ // FIXME: this accesses the position cache before it is initialized
//resetPos(cur);
//cur.bv().fitCursor();
}
cur.idx() = tabular.getCellBelow(cur.idx());
cur.pit() = 0;
cur.pos() = cell(cur.idx())->getText(0)->x2pos(
- cur.pit(), 0, cur.targetX());
+ cur.bv(), cur.pit(), 0, cur.targetX());
}
if (sl == cur.top()) {
// we trick it to go to the RIGHT after leaving the
cur.pit() = cur.lastpit();
LyXText const * text = cell(cur.idx())->getText(0);
cur.pos() = text->x2pos(
+ cur.bv(),
cur.pit(),
text->paragraphs().back().rows().size()-1,
cur.targetX());
break;
case LFUN_TABULAR_FEATURE:
- if (!tabularFeatures(cur, lyx::to_utf8(cmd.argument())))
+ if (!tabularFeatures(cur, to_utf8(cmd.argument())))
cur.undispatched();
break;
case LFUN_FILE_INSERT_ASCII_PARA:
case LFUN_FILE_INSERT_ASCII: {
// FIXME: We don't know the encoding of filenames
- string const tmpstr = getContentsOfAsciiFile(&cur.bv(), lyx::to_utf8(cmd.argument()), false);
+ string const tmpstr = getContentsOfAsciiFile(&cur.bv(), to_utf8(cmd.argument()), false);
// FIXME: We don't know the encoding of the file
- if (!tmpstr.empty() && !insertAsciiString(cur.bv(), lyx::from_utf8(tmpstr), false))
+ if (!tmpstr.empty() && !insertAsciiString(cur.bv(), from_utf8(tmpstr), false))
cur.undispatched();
break;
}
case LFUN_CLIPBOARD_PASTE:
case LFUN_PRIMARY_SELECTION_PASTE: {
docstring const clip = (cmd.action == LFUN_CLIPBOARD_PASTE) ?
- cur.bv().owner()->gui().clipboard().get() :
- cur.bv().owner()->gui().selection().get();
+ theClipboard().get() :
+ theSelection().get();
if (clip.empty())
break;
// pass to InsertAsciiString, but
// only if we have multi-cell content
- if (clip.find_first_of(lyx::from_ascii("\t\n")) != docstring::npos) {
+ if (clip.find_first_of(from_ascii("\t\n")) != docstring::npos) {
if (insertAsciiString(cur.bv(), clip, false)) {
// content has been replaced,
// so cursor might be invalid
row_type rs, re;
col_type cs, ce;
getSelection(cur, rs, re, cs, ce);
+ LCursor tmpcur = cur;
for (row_type i = rs; i <= re; ++i) {
for (col_type j = cs; j <= ce; ++j) {
// cursor follows cell:
- cur.idx() = tabular.getCellNumber(i, j);
+ tmpcur.idx() = tabular.getCellNumber(i, j);
// select this cell only:
- cur.pos() = 0;
- cur.resetAnchor();
- cur.pos() = cur.top().lastpos();
- cur.setCursor(cur);
- cur.setSelection();
- cell(cur.idx())->dispatch(cur, cmd);
+ tmpcur.pit() = 0;
+ tmpcur.pos() = 0;
+ tmpcur.resetAnchor();
+ tmpcur.pit() = tmpcur.lastpit();
+ tmpcur.pos() = tmpcur.top().lastpos();
+ tmpcur.setCursor(tmpcur);
+ tmpcur.setSelection();
+ cell(tmpcur.idx())->dispatch(tmpcur, cmd);
}
}
- // Restore original selection
- cur.idx() = tabular.getCellNumber(rs, cs);
- cur.pos() = 0;
- cur.resetAnchor();
- cur.idx() = tabular.getCellNumber(re, ce);
- cur.pos() = cur.top().lastpos();
- cur.setCursor(cur);
- cur.setSelection();
break;
} else {
cell(cur.idx())->dispatch(cur, cmd);
break;
}
- resetPos(cur);
+ // FIXME: this accesses the position cache before it is initialized
+ //resetPos(cur);
InsetTabularMailer(*this).updateDialog(&cur.bv());
}
int i = 0;
for (; tabularFeature[i].action != LyXTabular::LAST_ACTION; ++i) {
string const tmp = tabularFeature[i].feature;
- if (tmp == lyx::to_utf8(cmd.argument()).substr(0, tmp.length())) {
+ if (tmp == to_utf8(cmd.argument()).substr(0, tmp.length())) {
action = tabularFeature[i].action;
break;
}
}
string const argument
- = ltrim(lyx::to_utf8(cmd.argument()).substr(tabularFeature[i].feature.length()));
+ = ltrim(to_utf8(cmd.argument()).substr(tabularFeature[i].feature.length()));
row_type sel_row_start = 0;
row_type sel_row_end = 0;
case LyXTabular::APPEND_COLUMN:
case LyXTabular::DELETE_ROW:
case LyXTabular::DELETE_COLUMN:
+ case LyXTabular::COPY_ROW:
+ case LyXTabular::COPY_COLUMN:
case LyXTabular::SET_ALL_LINES:
case LyXTabular::UNSET_ALL_LINES:
case LyXTabular::SET_TOP_SPACE:
}
-int InsetTabular::latex(Buffer const & buf, ostream & os,
+int InsetTabular::latex(Buffer const & buf, odocstream & os,
OutputParams const & runparams) const
{
return tabular.latex(buf, os, runparams);
}
-int InsetTabular::plaintext(Buffer const & buf, ostream & os,
+int InsetTabular::plaintext(Buffer const & buf, odocstream & os,
OutputParams const & runparams) const
{
int const dp = runparams.linelen ? runparams.depth : 0;
}
-int InsetTabular::docbook(Buffer const & buf, ostream & os,
+int InsetTabular::docbook(Buffer const & buf, odocstream & os,
OutputParams const & runparams) const
{
int ret = 0;
}
-void InsetTabular::cursorPos
- (CursorSlice const & sl, bool boundary, int & x, int & y) const
+void InsetTabular::cursorPos(BufferView const & bv,
+ CursorSlice const & sl, bool boundary, int & x, int & y) const
{
- cell(sl.idx())->cursorPos(sl, boundary, x, y);
+ cell(sl.idx())->cursorPos(bv, sl, boundary, x, y);
// y offset correction
int const row = tabular.row_of_cell(sl.idx());
}
-int InsetTabular::dist(idx_type const cell, int x, int y) const
+int InsetTabular::dist(BufferView & bv, idx_type const cell, int x, int y) const
{
int xx = 0;
int yy = 0;
InsetBase const & inset = *tabular.getCellInset(cell);
- Point o = theCoords.getInsets().xy(&inset);
+ Point o = bv.coordCache().getInsets().xy(&inset);
int const xbeg = o.x_ - tabular.getBeginningOfTextInCell(cell);
int const xend = xbeg + tabular.getWidthOfColumn(cell);
row_type const row = tabular.row_of_cell(cell);
//lyxerr << "InsetTabular::editXY: " << this << endl;
cur.selection() = false;
cur.push(*this);
- cur.idx() = getNearestCell(x, y);
+ cur.idx() = getNearestCell(cur.bv(), x, y);
resetPos(cur);
return cell(cur.idx())->text_.editXY(cur, x, y);
}
void InsetTabular::setCursorFromCoordinates(LCursor & cur, int x, int y) const
{
- cur.idx() = getNearestCell(x, y);
+ cur.idx() = getNearestCell(cur.bv(), x, y);
cell(cur.idx())->text_.setCursorFromCoordinates(cur, x, y);
}
-InsetTabular::idx_type InsetTabular::getNearestCell(int x, int y) const
+InsetTabular::idx_type InsetTabular::getNearestCell(BufferView & bv, int x, int y) const
{
idx_type idx_min = 0;
int dist_min = std::numeric_limits<int>::max();
for (idx_type i = 0, n = nargs(); i != n; ++i) {
- if (theCoords.getInsets().has(tabular.getCellInset(i).get())) {
- int const d = dist(i, x, y);
+ if (bv.coordCache().getInsets().has(tabular.getCellInset(i).get())) {
+ int const d = dist(bv, i, x, y);
if (d < dist_min) {
dist_min = d;
idx_min = i;
int const X1 = 0;
int const X2 = maxwidth;
int const offset = ADD_TO_TABULAR_WIDTH + 2;
- int const x1 = xo() + getCellXPos(cur.idx()) + offset;
+ int const x1 = xo(cur.bv()) + getCellXPos(cur.idx()) + offset;
int const x2 = x1 + tabular.getWidthOfColumn(cur.idx());
if (x1 < X1)
scx_ = 0;
}
- cur.needsUpdate();
+ cur.updateFlags(Update::Force | Update::FitCursor);
InsetTabularMailer(*this).updateDialog(&bv);
}
}
cur.pit() = cur.lastpit();
cur.pos() = cur.lastpos();
- resetPos(cur);
+
+ // FIXME: this accesses the position cache before it is initialized
+ //resetPos(cur);
}
cur.selection() = false;
break;
+ case LyXTabular::COPY_ROW:
+ tabular.copyRow(bv.buffer()->params(), row);
+ break;
+
+ case LyXTabular::COPY_COLUMN:
+ tabular.copyColumn(bv.buffer()->params(), column);
+ cur.idx() = tabular.getCellNumber(row, column);
+ break;
+
case LyXTabular::M_TOGGLE_LINE_TOP:
flag = false;
case LyXTabular::TOGGLE_LINE_TOP: {
paste_tabular->setRightLine(paste_tabular->getLastCellInRow(0),
true, true);
- ostringstream os;
+ odocstringstream os;
OutputParams const runparams;
paste_tabular->plaintext(cur.buffer(), os, runparams, 0, true, '\t');
- cur.bv().owner()->gui().clipboard().put(lyx::from_utf8(os.str()));
+ theClipboard().put(os.str());
// mark tabular stack dirty
// FIXME: this is a workaround for bug 1919. Should be removed for 1.5,
// when we (hopefully) have a one-for-all paste mechanism.
- lyx::cap::dirtyTabularStack(true);
+ cap::dirtyTabularStack(true);
return true;
}
shared_ptr<InsetText> inset(
new InsetText(*paste_tabular->getCellInset(r1, c1)));
tabular.setCellInset(r2, c2, inset);
- inset->markNew();
+ // FIXME: change tracking (MG)
+ inset->setChange(Change(cur.buffer().params().trackChanges ?
+ Change::INSERTED : Change::UNCHANGED));
cur.pos() = 0;
}
}
for (col_type j = cs; j <= ce; ++j) {
shared_ptr<InsetText> t
= cell(tabular.getCellNumber(i, j));
- if (cur.buffer().params().tracking_changes)
- t->markErased(true);
+ if (cur.buffer().params().trackChanges)
+ // FIXME: Change tracking (MG)
+ t->setChange(Change(Change::DELETED));
else
t->clear();
}
{
BOOST_ASSERT(cur.depth() > 1);
Paragraph const & parentpar = cur[cur.depth() - 2].paragraph();
- LCursor::pos_type const parentpos = cur[cur.depth() - 2].pos();
+ pos_type const parentpos = cur[cur.depth() - 2].pos();
return parentpar.getFontSettings(cur.bv().buffer()->params(),
parentpos).language()->rightToLeft();
}
}
-void InsetTabular::markErased(bool erased)
+void InsetTabular::setChange(Change const & change)
+{
+ for (idx_type idx = 0; idx < nargs(); ++idx)
+ cell(idx)->setChange(change);
+}
+
+
+void InsetTabular::acceptChanges()
{
for (idx_type idx = 0; idx < nargs(); ++idx)
- cell(idx)->markErased(erased);
+ cell(idx)->acceptChanges();
+}
+
+
+void InsetTabular::rejectChanges()
+{
+ for (idx_type idx = 0; idx < nargs(); ++idx)
+ cell(idx)->rejectChanges();
}
if (buf.length() <= 0)
return true;
+ Buffer const & buffer = *bv.buffer();
+
col_type cols = 1;
row_type rows = 1;
col_type maxCols = 1;
docstring::size_type p = 0;
while (p < len &&
- (p = buf.find_first_of(lyx::from_ascii("\t\n"), p)) != docstring::npos) {
+ (p = buf.find_first_of(from_ascii("\t\n"), p)) != docstring::npos) {
switch (buf[p]) {
case '\t':
++cols;
row_type row = 0;
if (usePaste) {
paste_tabular.reset(
- new LyXTabular(bv.buffer()->params(), rows, maxCols));
+ new LyXTabular(buffer.params(), rows, maxCols));
loctab = paste_tabular.get();
cols = 0;
dirtyTabularStack(true);
col_type const columns = loctab->columns();
while (cell < cells && p < len && row < rows &&
- (p = buf.find_first_of(lyx::from_ascii("\t\n"), p)) != docstring::npos)
+ (p = buf.find_first_of(from_ascii("\t\n"), p)) != docstring::npos)
{
if (p >= len)
break;
// we can only set this if we are not too far right
if (cols < columns) {
shared_ptr<InsetText> inset = loctab->getCellInset(cell);
- inset->setViewCache(&bv);
Paragraph & par = inset->text_.getPar(0);
- LyXFont const font = inset->text_.getFont(par, 0);
- inset->setText(buf.substr(op, p - op), font);
+ LyXFont const font = inset->text_.getFont(buffer, par, 0);
+ inset->setText(buf.substr(op, p - op), font,
+ buffer.params().trackChanges);
++cols;
++cell;
}
// we can only set this if we are not too far right
if (cols < columns) {
shared_ptr<InsetText> inset = tabular.getCellInset(cell);
- inset->setViewCache(&bv);
Paragraph & par = inset->text_.getPar(0);
- LyXFont const font = inset->text_.getFont(par, 0);
- inset->setText(buf.substr(op, p - op), font);
+ LyXFont const font = inset->text_.getFont(buffer, par, 0);
+ inset->setText(buf.substr(op, p - op), font,
+ buffer.params().trackChanges);
}
cols = ocol;
++row;
// check for the last cell if there is no trailing '\n'
if (cell < cells && op < len) {
shared_ptr<InsetText> inset = loctab->getCellInset(cell);
- inset->setViewCache(&bv);
Paragraph & par = inset->text_.getPar(0);
- LyXFont const font = inset->text_.getFont(par, 0);
- inset->setText(buf.substr(op, len - op), font);
+ LyXFont const font = inset->text_.getFont(buffer, par, 0);
+ inset->setText(buf.substr(op, len - op), font,
+ buffer.params().trackChanges);
}
return true;
}
data << "\\end_inset\n";
return data.str();
}
+
+
+} // namespace lyx