+2005-10-09 Georg Baum <Georg.Baum@post.rwth-aachen.de>
+
+ * CutAndPaste.C (nrOfParagraphs): remove (unused)
+ * CutAndPaste.C (cutSelection): Remove debug message
+ * CutAndPaste.C (cutSelection): Use the real cursor in mathed, record
+ undo information and only copy if this is a real cut
+ * CutAndPaste.C (pasteSelection): remove superflous cur.resetAnchor()
+ call
+ * CutAndPaste.C (pasteSelection): remove now superflous mathed warning
+ (bug 2059)
+ * CutAndPaste.C (eraseSelection): prevent cursor corruption
+ * CutAndPaste.C (grabAndEraseSelection, selDel): remove now
+ superflous cur.selection() setting
+ * CutAndPaste.[Ch] (grabSelection): take a const cursor
+ * cursor.C (selectionAsString): implement mathed case ((bug 2059)
+
2005-10-09 Georg Baum <Georg.Baum@post.rwth-aachen.de>
* text3.C (mathDispatch, dispatch): Dont' record undo steps that don't
return string();
string res = grabSelection(cur);
eraseSelection(cur);
- cur.selection() = false;
return res;
}
}
-int nrOfParagraphs()
+void cutSelection(LCursor & cur, bool doclear, bool realcut)
{
- return theCuts.empty() ? 0 : theCuts[0].first.size();
-}
+ // This doesn't make sense, if there is no selection
+ if (!cur.selection())
+ return;
+ // OK, we have a selection. This is always between cur.selBegin()
+ // and cur.selEnd()
-void cutSelection(LCursor & cur, bool doclear, bool realcut)
-{
if (cur.inTexted()) {
LyXText * text = cur.text();
BOOST_ASSERT(text);
// calls to stuffClipboard. (Lgb)
// cur.bv().stuffClipboard(cur.selectionAsString(true));
- // This doesn't make sense, if there is no selection
- if (!cur.selection())
- return;
-
- // OK, we have a selection. This is always between cur.selBegin()
- // and cur.selEnd()
-
// make sure that the depth behind the selection are restored, too
recordUndoSelection(cur);
pit_type begpit = cur.selBegin().pit();
}
if (cur.inMathed()) {
- lyxerr << "cutSelection in mathed" << endl;
- LCursor tmp = cur;
- copySelection(cur);
- cur.selection() = false;
- eraseSelection(tmp);
+ if (cur.selBegin().idx() != cur.selEnd().idx()) {
+ // The current selection spans more than one cell.
+ // Record all cells
+ recordUndoInset(cur);
+ } else {
+ // Record only the current cell to avoid a jumping
+ // cursor after undo
+ recordUndo(cur);
+ }
+ if (realcut)
+ copySelection(cur);
+ eraseSelection(cur);
}
}
cur.bv().showErrorList(_("Paste"));
cur.clearSelection();
- cur.resetAnchor();
text->setCursor(cur, ppp.first, ppp.second);
cur.setSelection();
updateCounters(cur.buffer());
}
- if (cur.inMathed()) {
- lyxerr << "### should be handled in MathNest/GridInset" << endl;
- }
+ // mathed is handled in MathNestInset/MathGridInset
+ BOOST_ASSERT(!cur.inMathed());
}
cur.top() = i1;
if (i1.idx() == i2.idx()) {
i1.cell().erase(i1.pos(), i2.pos());
+ // We may have deleted i1.cell(cur.pos()).
+ // Make sure that pos is valid.
+ if (cur.pos() > cur.lastpos())
+ cur.pos() = cur.lastpos();
} else {
MathInset * p = i1.asMathInset();
InsetBase::row_type r1, r2;
// We've deleted the whole cell. Only pos 0 is valid.
cur.pos() = 0;
}
- cur.resetAnchor();
+ // need a valid cursor. (Lgb)
+ cur.clearSelection();
} else {
lyxerr << "can't erase this selection 1" << endl;
}
void selDel(LCursor & cur)
{
//lyxerr << "LCursor::selDel" << endl;
- if (cur.selection()) {
+ if (cur.selection())
eraseSelection(cur);
- cur.selection() = false;
- }
}
}
-string grabSelection(LCursor & cur)
+string grabSelection(LCursor const & cur)
{
if (!cur.selection())
return string();
+ // FIXME: What is wrong with the following?
+#if 0
+ std::ostringstream os;
+ for (DocIterator dit = cur.selectionBegin();
+ dit != cur.selectionEnd(); dit.forwardPos())
+ os << asString(dit.cell());
+ return os.str();
+#endif
+
CursorSlice i1 = cur.selBegin();
CursorSlice i2 = cur.selEnd();
void replaceWord(LCursor & cur, std::string const & replacestring);
///
-std::string grabSelection(LCursor & cur);
+std::string grabSelection(LCursor const & cur);
///
void eraseSelection(LCursor & cur);
///
return result;
}
-#ifdef WITH_WARNINGS
-#warning and mathed?
-#endif
+ if (inMathed())
+ return lyx::cap::grabSelection(*this);
+
return string();
}
+2005-10-09 Georg Baum <Georg.Baum@post.rwth-aachen.de>
+
+ * math_gridinset.C (doDispatch): adjust paste to match paste in text
+ and math nest inset
+ * math_nestinset.C (doDispatch): implement paste (bug 2059)
+
2005-10-09 Georg Baum <Georg.Baum@post.rwth-aachen.de>
* math_nestinset.C (doDispatch): Don't record undo steps when
}
case LFUN_PASTE: {
- lyxerr << "MathGridInset: PASTE: " << cmd << std::endl;
+ cur.message(_("Paste"));
+ lyx::cap::replaceSelection(cur);
istringstream is(cmd.argument);
int n = 0;
is >> n;
for (col_type c = 0; c < grid.ncols(); ++c)
cell(i).append(grid.cell(grid.index(r, c)));
}
+ cur.clearSelection(); // bug 393
+ cur.bv().switchKeyMap();
+ finishUndo();
break;
}
size_t n = 0;
istringstream is(cmd.argument);
is >> n;
- pasteSelection(cur, n);
+ string const selection = lyx::cap::getSelection(cur.buffer(), n);
+ cur.niceInsert(selection);
cur.clearSelection(); // bug 393
cur.bv().switchKeyMap();
finishUndo();
cutSelection(cur, true, true);
cur.message(_("Cut"));
// Prevent stale position >= size crash
+ // Probably not necessary anymore, see eraseSelection (gb 2005-10-09)
cur.normalize();
break;
* end' of the range of changed paragraphs. So we give an inclusive range.
* This is called before you make the changes to the paragraph, and it
* will record the original information of the paragraphs in the undo stack.
+ *
+ * FIXME: We need something to record undo in partial grids for mathed.
+ * Right now we use recordUndoInset if more than one cell is changed,
+ * but that puts the cursor in front of the inset after undo. We would need
+ * something like
+ * recordUndoGrid(LCursor & cur, Undo::undo_kind kind, idx_type from, idx_type to);
+ * and store the cell information in class Undo.
*/
/// The general case: prepare undo for an arbitrary range.