}
-bool InsetTabular::hasPasteBuffer() const
-{
- return (paste_tabular.get() != 0);
-}
-
-
InsetTabular::InsetTabular(Buffer const & buf, row_type rows,
col_type columns)
: tabular(buf.params(), max(rows, row_type(1)),
}
-void InsetTabular::metrics(MetricsInfo & mi, Dimension & dim) const
+bool InsetTabular::metrics(MetricsInfo & mi, Dimension & dim) const
{
//lyxerr << "InsetTabular::metrics: " << mi.base.bv << " width: " <<
// mi.base.textwidth << "\n";
dim.asc = tabular.getAscentOfRow(0);
dim.des = tabular.getHeightOfTabular() - dim.asc;
dim.wid = tabular.getWidthOfTabular() + 2 * ADD_TO_TABULAR_WIDTH;
+ bool const changed = dim_ != dim;
dim_ = dim;
+ return changed;
}
case LFUN_MOUSE_PRESS:
//lyxerr << "# InsetTabular::MousePress\n" << cur.bv().cursor() << endl;
- if (cmd.button() == mouse_button::button1
- || cmd.button() == mouse_button::button3) {
+ if (cmd.button() == mouse_button::button1
+ || (cmd.button() == mouse_button::button3
+ && (&bvcur.selBegin().inset() != this || !tablemode(bvcur)))) {
+ if (!bvcur.selection() && !cur.bv().mouseSetCursor(cur))
+ cur.noUpdate();
cur.selection() = false;
setCursorFromCoordinates(cur, cmd.x, cmd.y);
- cur.resetAnchor();
- bvcur = cur;
+ cur.bv().mouseSetCursor(cur);
break;
}
if (cmd.button() == mouse_button::button2) {
- cmd = FuncRequest(LFUN_PRIMARY_SELECTION_PASTE, "paragraph");
+ if (bvcur.selection()) {
+ // See comment in LyXText::dispatch why we
+ // do this
+ // FIXME This does not use paste_tabular,
+ // another reason why paste_tabular should go.
+ cap::copySelectionToStack(bvcur);
+ cmd = FuncRequest(LFUN_PASTE, "0");
+ } else {
+ cmd = FuncRequest(LFUN_PRIMARY_SELECTION_PASTE,
+ "paragraph");
+ }
doDispatch(cur, cmd);
}
break;
if (cmd.button() == mouse_button::button1) {
// only accept motions to places not deeper nested than the real anchor
if (bvcur.anchor_.hasPart(cur)) {
+ // only update if selection changes
+ if (bvcur.idx() == cur.idx() &&
+ !(bvcur.anchor_.idx() == cur.idx() && bvcur.pos() != cur.pos()))
+ cur.noUpdate();
setCursorFromCoordinates(cur, cmd.x, cmd.y);
bvcur.setCursor(cur);
bvcur.selection() = true;
case LFUN_MOUSE_RELEASE:
//lyxerr << "# InsetTabular::MouseRelease\n" << bvcur << endl;
- if (cmd.button() == mouse_button::button3)
+ if (cmd.button() == mouse_button::button1) {
+ if (bvcur.selection())
+ theSelection().haveSelection(true);
+ } else if (cmd.button() == mouse_button::button3)
InsetTabularMailer(*this).showDialog(&cur.bv());
break;
cell(cur.idx())->dispatch(cur, cmd);
if (!cur.result().dispatched()) {
isRightToLeft(cur) ? movePrevCell(cur) : moveNextCell(cur);
+ if (cmd.action == LFUN_CHAR_FORWARD_SELECT)
+ theSelection().haveSelection(cur.selection());
if (sl == cur.top())
cmd = FuncRequest(LFUN_FINISHED_RIGHT);
else
cell(cur.idx())->dispatch(cur, cmd);
if (!cur.result().dispatched()) {
isRightToLeft(cur) ? moveNextCell(cur) : movePrevCell(cur);
+ if (cmd.action == LFUN_CHAR_BACKWARD_SELECT)
+ theSelection().haveSelection(cur.selection());
if (sl == cur.top())
cmd = FuncRequest(LFUN_FINISHED_LEFT);
else
if (tabular.row_of_cell(cur.idx()) != tabular.rows() - 1) {
cur.idx() = tabular.getCellBelow(cur.idx());
cur.pit() = 0;
- cur.pos() = cell(cur.idx())->getText(0)->x2pos(
- cur.bv(), cur.pit(), 0, cur.targetX());
+ TextMetrics const & tm =
+ cur.bv().textMetrics(cell(cur.idx())->getText(0));
+ cur.pos() = tm.x2pos(cur.pit(), 0, cur.targetX());
+ if (cmd.action == LFUN_DOWN_SELECT)
+ theSelection().haveSelection(cur.selection());
}
if (sl == cur.top()) {
// we trick it to go to the RIGHT after leaving the
cur.idx() = tabular.getCellAbove(cur.idx());
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());
+ TextMetrics const & tm = cur.bv().textMetrics(text);
+ ParagraphMetrics const & pm =
+ tm.parMetrics(cur.lastpit());
+ cur.pos() = tm.x2pos(cur.pit(), pm.rows().size()-1, cur.targetX());
+ if (cmd.action == LFUN_UP_SELECT)
+ theSelection().haveSelection(cur.selection());
}
if (sl == cur.top()) {
cmd = FuncRequest(LFUN_FINISHED_UP);
break;
// insert file functions
- 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(), to_utf8(cmd.argument()), false);
+ case LFUN_FILE_INSERT_PLAINTEXT_PARA:
+ case LFUN_FILE_INSERT_PLAINTEXT: {
+ // FIXME UNICODE
+ string const tmpstr = getContentsOfPlaintextFile(&cur.bv(), to_utf8(cmd.argument()), false);
// FIXME: We don't know the encoding of the file
- if (!tmpstr.empty() && !insertAsciiString(cur.bv(), from_utf8(tmpstr), false))
+ if (!tmpstr.empty() && !insertPlaintextString(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) ?
- theClipboard().get() :
+ theClipboard().getAsText() :
theSelection().get();
if (clip.empty())
break;
- // pass to InsertAsciiString, but
+ // pass to InsertPlaintextString, but
// only if we have multi-cell content
if (clip.find_first_of(from_ascii("\t\n")) != docstring::npos) {
- if (insertAsciiString(cur.bv(), clip, false)) {
+ if (insertPlaintextString(cur.bv(), clip, false)) {
// content has been replaced,
// so cursor might be invalid
cur.pos() = cur.lastpos();
bvcur.setCursor(cur);
break;
}
- } else {
- // so that the clipboard is used and it goes on
- // to default
- // and executes LFUN_PRIMARY_SELECTION_PASTE in insettext!
- paste_tabular.reset();
- dirtyTabularStack(false);
}
- // fall through
+ // Let the cell handle normal text
+ cell(cur.idx())->dispatch(cur, cmd);
+ break;
}
case LFUN_PASTE:
- if (hasPasteBuffer() && tabularStackDirty()) {
+ if (tabularStackDirty() && theClipboard().isInternal()) {
recordUndoInset(cur, Undo::INSERT);
pasteSelection(cur);
break;
}
case LFUN_PASTE:
- if (tabularStackDirty()) {
+ if (tabularStackDirty() && theClipboard().isInternal()) {
status.enabled(true);
return true;
- }
+ } else
+ return cell(cur.idx())->getStatus(cur, cmd, status);
case LFUN_INSET_MODIFY:
if (translate(cmd.getArg(0)) == TABULAR_CODE) {
}
cur.updateFlags(Update::Force | Update::FitCursor);
-
- InsetTabularMailer(*this).updateDialog(&bv);
}
case LyXTabular::SET_SPECIAL_COLUMN:
case LyXTabular::SET_SPECIAL_MULTI:
- tabular.setAlignSpecial(cur.idx(),value,feature);
+ tabular.setAlignSpecial(cur.idx(), from_utf8(value), feature);
break;
case LyXTabular::APPEND_ROW:
case LyXTabular::LAST_ACTION:
break;
}
-
- InsetTabularMailer(*this).updateDialog(&bv);
}
odocstringstream os;
OutputParams const runparams;
paste_tabular->plaintext(cur.buffer(), os, runparams, 0, true, '\t');
- theClipboard().put(os.str());
+ // Needed for the "Edit->Paste recent" menu and the system clipboard.
+ cap::copySelection(cur, 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.
- cap::dirtyTabularStack(true);
+ // This must be called after cap::copySelection.
+ dirtyTabularStack(true);
return true;
}
if (cur.pos() > cur.lastpos())
cur.pos() = cur.lastpos();
cur.clearSelection();
+ theSelection().haveSelection(false);
}
}
-bool InsetTabular::insertAsciiString(BufferView & bv, docstring const & buf,
+bool InsetTabular::insertPlaintextString(BufferView & bv, docstring const & buf,
bool usePaste)
{
if (buf.length() <= 0)