+void eraseSelection(LCursor & cur)
+{
+ //lyxerr << "LCursor::eraseSelection begin: " << cur << endl;
+ CursorSlice const & i1 = cur.selBegin();
+ CursorSlice const & i2 = cur.selEnd();
+ if (i1.inset().asMathInset()) {
+ if (i1.idx() == i2.idx()) {
+ i1.cell().erase(i1.pos(), i2.pos());
+ } else {
+ MathInset * p = i1.asMathInset();
+ InsetBase::row_type r1, r2;
+ InsetBase::col_type c1, c2;
+ region(i1, i2, r1, r2, c1, c2);
+ for (InsetBase::row_type row = r1; row <= r2; ++row)
+ for (InsetBase::col_type col = c1; col <= c2; ++col)
+ p->cell(p->index(row, col)).clear();
+ }
+ cur.top() = i1;
+ cur.pos() = 0; // We've deleted the whole cell. Only pos 0 is valid.
+ cur.resetAnchor();
+ } else {
+ lyxerr << "can't erase this selection 1" << endl;
+ }
+ //lyxerr << "LCursor::eraseSelection end: " << cur << endl;
+}
+
+
+void selDel(LCursor & cur)
+{
+ //lyxerr << "LCursor::selDel" << endl;
+ if (cur.selection()) {
+ eraseSelection(cur);
+ cur.selection() = false;
+ }
+}
+
+
+void selClearOrDel(LCursor & cur)
+{
+ //lyxerr << "LCursor::selClearOrDel" << endl;
+ if (lyxrc.auto_region_delete)
+ selDel(cur);
+ else
+ cur.selection() = false;
+}
+
+
+string grabSelection(LCursor & cur)
+{
+ if (!cur.selection())
+ return string();
+
+ CursorSlice i1 = cur.selBegin();
+ CursorSlice i2 = cur.selEnd();
+
+ if (i1.idx() == i2.idx()) {
+ if (i1.inset().asMathInset()) {
+ MathArray::const_iterator it = i1.cell().begin();
+ return asString(MathArray(it + i1.pos(), it + i2.pos()));
+ } else {
+ return "unknown selection 1";
+ }
+ }
+
+ InsetBase::row_type r1, r2;
+ InsetBase::col_type c1, c2;
+ region(i1, i2, r1, r2, c1, c2);
+
+ string data;
+ if (i1.inset().asMathInset()) {
+ for (InsetBase::row_type row = r1; row <= r2; ++row) {
+ if (row > r1)
+ data += "\\\\";
+ for (InsetBase::col_type col = c1; col <= c2; ++col) {
+ if (col > c1)
+ data += '&';
+ data += asString(i1.asMathInset()->
+ cell(i1.asMathInset()->index(row, col)));
+ }
+ }
+ } else {
+ data = "unknown selection 2";
+ }
+ return data;
+}
+
+