#include "Buffer.h"
#include "BufferParams.h"
#include "BufferView.h"
-#include "Color.h"
#include "CoordCache.h"
#include "Counters.h"
#include "Cursor.h"
#include "Language.h"
#include "LaTeXFeatures.h"
#include "Lexer.h"
+#include "LyXFunc.h"
#include "MetricsInfo.h"
#include "OutputParams.h"
#include "paragraph_funcs.h"
#include "Paragraph.h"
#include "ParagraphParameters.h"
#include "ParIterator.h"
-#include "Undo.h"
+#include "TextClass.h"
+#include "TextMetrics.h"
#include "support/convert.h"
+#include "support/docstream.h"
#include "support/lstrings.h"
#include "frontends/alert.h"
#include "frontends/Painter.h"
#include "frontends/Selection.h"
+#include <boost/scoped_ptr.hpp>
+
#include <sstream>
#include <iostream>
#include <limits>
void Tabular::plaintext(Buffer const & buf, odocstream & os,
OutputParams const & runparams, int const depth,
- bool onlydata, unsigned char delim) const
+ bool onlydata, char_type delim) const
{
// first calculate the width of the single columns
vector<unsigned int> clen(columnCount());
if (isPartOfMultiColumn(i, j))
continue;
if (onlydata && j > 0)
- os << delim;
+ // we don't use operator<< for single UCS4 character.
+ // see explanation in docstream.h
+ os.put(delim);
plaintextPrintCell(buf, os, runparams,
cell, i, j, clen, onlydata);
++cell;
for (idx_type cell = 0, n = cellCount(); cell < n; ++cell)
if (getCellInset(cell).get() == inset) {
- LYXERR(Debug::INSETTEXT) << "Tabular::getCellFromInset: "
- << "cell=" << cell << endl;
+ LYXERR(Debug::INSETTEXT, "Tabular::getCellFromInset: "
+ << "cell=" << cell);
return cell;
}
x += scx_;
x += ADD_TO_TABULAR_WIDTH;
+ bool const original_drawing_state = pi.pain.isDrawingEnabled();
+
idx_type idx = 0;
first_visible_cell = Tabular::npos;
for (row_type i = 0; i < tabular.rowCount(); ++i) {
pi.pain.setDrawingEnabled(false);
cell(idx)->draw(pi, cx, y);
drawCellLines(pi.pain, nx, y, i, idx, pi.erased_);
- pi.pain.setDrawingEnabled(true);
+ pi.pain.setDrawingEnabled(original_drawing_state);
} else {
cell(idx)->draw(pi, cx, y);
drawCellLines(pi.pain, nx, y, i, idx, pi.erased_);
if (!cur.selection())
return;
- if (!ptr_cmp(&cur.inset(), this))
+ if (&cur.inset() != this)
return;
//resetPos(cur);
int const w = tabular.columnWidth(cell);
if (i >= cs && i <= ce && j >= rs && j <= re)
pi.pain.fillRectangle(xx, y, w, h,
- Color::selection);
+ Color_selection);
xx += w;
}
y += h;
{
int x2 = x + tabular.columnWidth(cell);
bool on_off = false;
- Color::color col = Color::tabularline;
- Color::color onoffcol = Color::tabularonoffline;
+ ColorCode col = Color_tabularline;
+ ColorCode onoffcol = Color_tabularonoffline;
if (erased) {
- col = Color::deletedtext;
- onoffcol = Color::deletedtext;
+ col = Color_deletedtext;
+ onoffcol = Color_deletedtext;
}
if (!tabular.topAlreadyDrawn(cell)) {
void InsetTabular::edit(Cursor & cur, bool left)
{
//lyxerr << "InsetTabular::edit: " << this << endl;
- finishUndo();
+ cur.finishUndo();
cur.selection() = false;
cur.push(*this);
if (left) {
void InsetTabular::doDispatch(Cursor & cur, FuncRequest & cmd)
{
- LYXERR(Debug::DEBUG) << "# InsetTabular::doDispatch: cmd: " << cmd
- << "\n cur:" << cur << endl;
+ LYXERR(Debug::DEBUG, "# InsetTabular::doDispatch: cmd: " << cmd
+ << "\n cur:" << cur);
CursorSlice sl = cur.top();
Cursor & bvcur = cur.bv().cursor();
case LFUN_CHAR_FORWARD:
cell(cur.idx())->dispatch(cur, cmd);
if (!cur.result().dispatched()) {
- isRightToLeft(cur) ? movePrevCell(cur) : moveNextCell(cur);
+ moveNextCell(cur);
if (sl == cur.top())
- cmd = FuncRequest(LFUN_FINISHED_RIGHT);
+ cmd = FuncRequest(LFUN_FINISHED_FORWARD);
else
cur.dispatched();
}
case LFUN_CHAR_BACKWARD:
cell(cur.idx())->dispatch(cur, cmd);
if (!cur.result().dispatched()) {
- isRightToLeft(cur) ? moveNextCell(cur) : movePrevCell(cur);
+ movePrevCell(cur);
if (sl == cur.top())
- cmd = FuncRequest(LFUN_FINISHED_LEFT);
+ cmd = FuncRequest(LFUN_FINISHED_BACKWARD);
else
cur.dispatched();
}
break;
+ case LFUN_CHAR_RIGHT_SELECT:
+ case LFUN_CHAR_RIGHT:
+ //FIXME: for visual cursor, really move right
+ if (isRightToLeft(cur))
+ lyx::dispatch(FuncRequest(
+ cmd.action == LFUN_CHAR_RIGHT_SELECT ?
+ LFUN_CHAR_BACKWARD_SELECT : LFUN_CHAR_BACKWARD));
+ else
+ lyx::dispatch(FuncRequest(
+ cmd.action == LFUN_CHAR_RIGHT_SELECT ?
+ LFUN_CHAR_FORWARD_SELECT : LFUN_CHAR_FORWARD));
+ break;
+
+ case LFUN_CHAR_LEFT_SELECT:
+ case LFUN_CHAR_LEFT:
+ //FIXME: for visual cursor, really move left
+ if (isRightToLeft(cur))
+ lyx::dispatch(FuncRequest(
+ cmd.action == LFUN_CHAR_LEFT_SELECT ?
+ LFUN_CHAR_FORWARD_SELECT : LFUN_CHAR_FORWARD));
+ else
+ lyx::dispatch(FuncRequest(
+ cmd.action == LFUN_CHAR_LEFT_SELECT ?
+ LFUN_CHAR_BACKWARD_SELECT : LFUN_CHAR_BACKWARD));
+ break;
+
case LFUN_DOWN_SELECT:
case LFUN_DOWN:
cell(cur.idx())->dispatch(cur, cmd);
cur.pos() = tm.x2pos(cur.pit(), 0, cur.targetX());
}
if (sl == cur.top()) {
- // we trick it to go to the RIGHT after leaving the
+ // we trick it to go to forward after leaving the
// tabular.
- cmd = FuncRequest(LFUN_FINISHED_RIGHT);
+ cmd = FuncRequest(LFUN_FINISHED_FORWARD);
cur.undispatched();
}
break;
case LFUN_CUT:
if (tablemode(cur)) {
if (copySelection(cur)) {
- recordUndoInset(cur, Undo::DELETE);
+ cur.recordUndoInset(DELETE_UNDO);
cutSelection(cur);
}
}
case LFUN_CHAR_DELETE_BACKWARD:
case LFUN_CHAR_DELETE_FORWARD:
if (tablemode(cur)) {
- recordUndoInset(cur, Undo::DELETE);
+ cur.recordUndoInset(DELETE_UNDO);
cutSelection(cur);
}
else
if (!cur.selection())
break;
if (tablemode(cur)) {
- finishUndo();
+ cur.finishUndo();
copySelection(cur);
} else
cell(cur.idx())->dispatch(cur, cmd);
case LFUN_PASTE:
if (tabularStackDirty() && theClipboard().isInternal()) {
- recordUndoInset(cur, Undo::INSERT);
+ cur.recordUndoInset(INSERT_UNDO);
pasteClipboard(cur);
break;
}
// disable in non-fixed-width cells
case LFUN_BREAK_LINE:
case LFUN_BREAK_PARAGRAPH:
- case LFUN_BREAK_PARAGRAPH_KEEP_LAYOUT:
case LFUN_BREAK_PARAGRAPH_SKIP: {
if (tabular.getPWidth(cur.idx()).zero()) {
status.enabled(false);
return cell(cur.idx())->getStatus(cur, cmd, status);
case LFUN_INSET_MODIFY:
- if (translate(cmd.getArg(0)) == TABULAR_CODE) {
+ if (insetCode(cmd.getArg(0)) == TABULAR_CODE) {
status.enabled(true);
return true;
}
// 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() == Inset::FLOAT_CODE)
+ if (master->lyxCode() == FLOAT_CODE)
break;
#endif
break;
}
- recordUndoInset(cur, Undo::ATOMIC);
+ cur.recordUndoInset(ATOMIC_UNDO);
getSelection(cur, sel_row_start, sel_row_end, sel_col_start, sel_col_end);
row_type const row = tabular.cellRow(cur.idx());