implement missing bits of math cut and paste and fix bug 2059

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@10548 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Georg Baum 2005-10-12 18:44:53 +00:00
parent a2b40d9038
commit d7055d0a8e
8 changed files with 79 additions and 34 deletions

View File

@ -1,3 +1,19 @@
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

View File

@ -370,7 +370,6 @@ string grabAndEraseSelection(LCursor & cur)
return string();
string res = grabSelection(cur);
eraseSelection(cur);
cur.selection() = false;
return res;
}
@ -473,14 +472,15 @@ std::vector<string> const availableSelections(Buffer const & buffer)
}
int nrOfParagraphs()
{
return theCuts.empty() ? 0 : theCuts[0].first.size();
}
void cutSelection(LCursor & cur, bool doclear, bool realcut)
{
// 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()
if (cur.inTexted()) {
LyXText * text = cur.text();
BOOST_ASSERT(text);
@ -494,13 +494,6 @@ void cutSelection(LCursor & cur, bool doclear, bool realcut)
// 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();
@ -542,11 +535,18 @@ void cutSelection(LCursor & cur, bool doclear, bool realcut)
}
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);
}
}
@ -630,15 +630,13 @@ void pasteSelection(LCursor & cur, size_t sel_index)
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());
}
@ -710,6 +708,10 @@ void eraseSelection(LCursor & cur)
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;
@ -721,7 +723,8 @@ void eraseSelection(LCursor & cur)
// 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;
}
@ -732,10 +735,8 @@ void eraseSelection(LCursor & cur)
void selDel(LCursor & cur)
{
//lyxerr << "LCursor::selDel" << endl;
if (cur.selection()) {
if (cur.selection())
eraseSelection(cur);
cur.selection() = false;
}
}
@ -749,11 +750,20 @@ void selClearOrDel(LCursor & cur)
}
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();

View File

@ -67,7 +67,7 @@ void SwitchBetweenClasses(lyx::textclass_type c1,
void replaceWord(LCursor & cur, std::string const & replacestring);
///
std::string grabSelection(LCursor & cur);
std::string grabSelection(LCursor const & cur);
///
void eraseSelection(LCursor & cur);
///

View File

@ -1126,9 +1126,9 @@ string LCursor::selectionAsString(bool label) const
return result;
}
#ifdef WITH_WARNINGS
#warning and mathed?
#endif
if (inMathed())
return lyx::cap::grabSelection(*this);
return string();
}

View File

@ -1,3 +1,9 @@
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

View File

@ -1196,7 +1196,8 @@ void MathGridInset::doDispatch(LCursor & cur, FuncRequest & cmd)
}
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;
@ -1230,6 +1231,9 @@ void MathGridInset::doDispatch(LCursor & cur, FuncRequest & cmd)
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;
}

View File

@ -415,7 +415,8 @@ void MathNestInset::doDispatch(LCursor & cur, FuncRequest & cmd)
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();
@ -427,6 +428,7 @@ void MathNestInset::doDispatch(LCursor & cur, FuncRequest & cmd)
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;

View File

@ -105,6 +105,13 @@ void finishUndo();
* 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.