fix table crash;

selection by mouse


git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@8617 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
André Pönitz 2004-04-07 08:07:26 +00:00
parent 9b35643f8e
commit 6c9b23105c
12 changed files with 63 additions and 51 deletions

View File

@ -861,7 +861,6 @@ bool BufferView::Pimpl::workAreaDispatch(FuncRequest const & cmd0)
//lyxerr << "*** workAreaDispatch: request: " << cmd << std::endl; //lyxerr << "*** workAreaDispatch: request: " << cmd << std::endl;
LCursor cur(*bv_); LCursor cur(*bv_);
cur.push(bv_->buffer()->inset()); cur.push(bv_->buffer()->inset());
cur.resetAnchor();
cur.selection() = bv_->cursor().selection(); cur.selection() = bv_->cursor().selection();
// Doesn't go through lyxfunc, so we need to update // Doesn't go through lyxfunc, so we need to update
@ -873,14 +872,17 @@ bool BufferView::Pimpl::workAreaDispatch(FuncRequest const & cmd0)
screen().hideCursor(); screen().hideCursor();
// either the inset under the cursor or the // Either the inset under the cursor or the
// surrounding LyXText will handle this event. // surrounding LyXText will handle this event.
// built temporary path to inset // Build temporary cursor.
InsetBase * inset = bv_->text()->editXY(cur, cmd.x, cmd.y); InsetBase * inset = bv_->text()->editXY(cur, cmd.x, cmd.y);
lyxerr << "hit inset at tip: " << inset << endl; lyxerr << "hit inset at tip: " << inset << endl;
lyxerr << "created temp cursor:\n" << cur << endl; lyxerr << "created temp cursor:\n" << cur << endl;
// Put anchor at the same position.
cur.resetAnchor();
// Try to dispatch to an non-editable inset near this position // Try to dispatch to an non-editable inset near this position
// via the temp cursor. If the inset wishes to change the real // via the temp cursor. If the inset wishes to change the real
// cursor it has to do so explicitly by using // cursor it has to do so explicitly by using
@ -889,16 +891,11 @@ bool BufferView::Pimpl::workAreaDispatch(FuncRequest const & cmd0)
if (inset) if (inset)
inset->dispatch(cur, cmd); inset->dispatch(cur, cmd);
// Now dispatch to the real cursor. Any change to the cursor // Now dispatch to the temporary cursor. If the real cursor should
// is immediate. // be modified, the inset's dispatch has to do so explicitly.
if (!res.dispatched()) if (!res.dispatched())
res = cur.dispatch(cmd); res = cur.dispatch(cmd);
// If the request was dispatched the temp cursor should have been
// in a way to be used as new 'real' cursor.
if (res.dispatched())
bv_->cursor() = cur;
// Redraw if requested or necessary. // Redraw if requested or necessary.
if (res.update()) if (res.update())
update(); update();

View File

@ -316,15 +316,27 @@ bool LCursor::posRight()
CursorSlice & LCursor::anchor() CursorSlice & LCursor::anchor()
{ {
if (anchor_.size() < size()) {
lyxerr << "anchor_.size() < cursor_.size() "
"should not happen when accessing the anchor" << endl;
BOOST_ASSERT(false);
}
BOOST_ASSERT(!anchor_.empty()); BOOST_ASSERT(!anchor_.empty());
return anchor_.back(); // this size is cursor_.size()
return anchor_[size() - 1];
} }
CursorSlice const & LCursor::anchor() const CursorSlice const & LCursor::anchor() const
{ {
if (anchor_.size() < size()) {
lyxerr << "anchor_.size() < cursor_.size() "
"should not happen when accessing the anchor" << endl;
BOOST_ASSERT(false);
}
// this size is cursor_.size()
BOOST_ASSERT(!anchor_.empty()); BOOST_ASSERT(!anchor_.empty());
return anchor_.back(); return anchor_[size() - 1];
} }
@ -364,6 +376,7 @@ void LCursor::setSelection()
{ {
selection() = true; selection() = true;
// a selection with no contents is not a selection // a selection with no contents is not a selection
#warning doesnt look ok
if (par() == anchor().par() && pos() == anchor().pos()) if (par() == anchor().par() && pos() == anchor().pos())
selection() = false; selection() = false;
} }
@ -496,13 +509,6 @@ string LCursor::grabAndEraseSelection()
} }
void LCursor::selClear()
{
resetAnchor();
clearSelection();
}
void LCursor::selCopy() void LCursor::selCopy()
{ {
if (selection()) { if (selection()) {

View File

@ -96,10 +96,6 @@ public:
void selPaste(size_t n); void selPaste(size_t n);
/// ///
void selHandle(bool selecting); void selHandle(bool selecting);
/// start selection
void selStart();
/// clear selection
void selClear();
/// clears or deletes selection depending on lyxrc setting /// clears or deletes selection depending on lyxrc setting
void selClearOrDel(); void selClearOrDel();
// //

View File

@ -150,7 +150,7 @@ bool operator<(CursorSlice const & p, CursorSlice const & q)
if (&p.inset() != &q.inset()) { if (&p.inset() != &q.inset()) {
lyxerr << "can't compare cursor and anchor in different insets\n" lyxerr << "can't compare cursor and anchor in different insets\n"
<< "p: " << p << '\n' << "q: " << q << endl; << "p: " << p << '\n' << "q: " << q << endl;
return true; BOOST_ASSERT(false);
} }
if (p.idx() != q.idx()) if (p.idx() != q.idx())
return p.idx() < q.idx(); return p.idx() < q.idx();

View File

@ -103,6 +103,7 @@ MathAtom & DocIterator::prevAtom()
MathAtom const & DocIterator::nextAtom() const MathAtom const & DocIterator::nextAtom() const
{ {
BOOST_ASSERT(!empty()); BOOST_ASSERT(!empty());
lyxerr << "lastpos: " << lastpos() << " next atom:\n" << *this << endl;
BOOST_ASSERT(pos() < lastpos()); BOOST_ASSERT(pos() < lastpos());
return cell()[pos()]; return cell()[pos()];
} }
@ -111,6 +112,7 @@ MathAtom const & DocIterator::nextAtom() const
MathAtom & DocIterator::nextAtom() MathAtom & DocIterator::nextAtom()
{ {
BOOST_ASSERT(!empty()); BOOST_ASSERT(!empty());
lyxerr << "lastpos: " << lastpos() << " next atom:\n" << *this << endl;
BOOST_ASSERT(pos() < lastpos()); BOOST_ASSERT(pos() < lastpos());
return cell()[pos()]; return cell()[pos()];
} }

View File

@ -410,6 +410,7 @@ void InsetTabular::priv_dispatch(LCursor & cur, FuncRequest & cmd)
lyxerr << "# InsetTabular::dispatch: cmd: " << cmd << endl; lyxerr << "# InsetTabular::dispatch: cmd: " << cmd << endl;
//lyxerr << " cur:\n" << cur << endl; //lyxerr << " cur:\n" << cur << endl;
CursorSlice sl = cur.top(); CursorSlice sl = cur.top();
LCursor & bvcur = cur.bv().cursor();
switch (cmd.action) { switch (cmd.action) {
@ -420,7 +421,7 @@ void InsetTabular::priv_dispatch(LCursor & cur, FuncRequest & cmd)
cur.selection() = false; cur.selection() = false;
setPos(cur, cmd.x, cmd.y); setPos(cur, cmd.x, cmd.y);
cur.resetAnchor(); cur.resetAnchor();
cur.bv().cursor().setCursor(cur, false); bvcur = cur;
//if (cmd.button() == mouse_button::button2) //if (cmd.button() == mouse_button::button2)
// dispatch(cur, FuncRequest(LFUN_PASTESELECTION, "paragraph")); // dispatch(cur, FuncRequest(LFUN_PASTESELECTION, "paragraph"));
//lyxerr << "# InsetTabular::MousePress\n" << cur.bv().cursor() << endl; //lyxerr << "# InsetTabular::MousePress\n" << cur.bv().cursor() << endl;
@ -429,13 +430,16 @@ void InsetTabular::priv_dispatch(LCursor & cur, FuncRequest & cmd)
case LFUN_MOUSE_MOTION: case LFUN_MOUSE_MOTION:
if (cmd.button() != mouse_button::button1) if (cmd.button() != mouse_button::button1)
break; break;
// ignore motions deeper nested than the real anchor
if (bvcur.selection() && bvcur.anchor_.size() < cur.size())
break;
setPos(cur, cmd.x, cmd.y); setPos(cur, cmd.x, cmd.y);
cur.bv().cursor().setCursor(cur, true); bvcur.setCursor(cur, true);
//lyxerr << "# InsetTabular::MouseMotion\n" << cur.bv().cursor() << endl; //lyxerr << "# InsetTabular::MouseMotion\n" << bvcur << endl;
break; break;
case LFUN_MOUSE_RELEASE: case LFUN_MOUSE_RELEASE:
//lyxerr << "# InsetTabular::MouseRelease\n" << cur.bv().cursor() << endl; //lyxerr << "# InsetTabular::MouseRelease\n" << bvcur << endl;
if (cmd.button() == mouse_button::button3) if (cmd.button() == mouse_button::button3)
InsetTabularMailer(*this).showDialog(&cur.bv()); InsetTabularMailer(*this).showDialog(&cur.bv());
break; break;
@ -1725,7 +1729,7 @@ void InsetTabular::addPreview(PreviewLoader & loader) const
bool InsetTabular::tablemode(LCursor & cur) const bool InsetTabular::tablemode(LCursor & cur) const
{ {
return cur.selBegin().idx() != cur.selEnd().idx(); return cur.selection() && cur.selBegin().idx() != cur.selEnd().idx();
} }

View File

@ -511,6 +511,7 @@ FuncStatus LyXFunc::getStatus(FuncRequest const & cmd) const
flag.enabled(false); flag.enabled(false);
} }
//lyxerr << "LyXFunc::getStatus: got: " << flag.enabled() << endl;
return flag; return flag;
} }
@ -1257,13 +1258,6 @@ void LyXFunc::dispatch(FuncRequest const & cmd, bool verbose)
break; break;
} }
case LFUN_BREAKLINE: {
#ifdef WITH_WARNINGS
#warning swallow 'Return' if the minibuffer is focused. But how?
#endif
break;
}
case LFUN_ALL_INSETS_TOGGLE: { case LFUN_ALL_INSETS_TOGGLE: {
string action; string action;
string const name = split(argument, action, ' '); string const name = split(argument, action, ' ');

View File

@ -783,7 +783,7 @@ void MathHullInset::doExtern(LCursor & cur, FuncRequest & func)
void MathHullInset::priv_dispatch(LCursor & cur, FuncRequest & cmd) void MathHullInset::priv_dispatch(LCursor & cur, FuncRequest & cmd)
{ {
lyxerr << "*** MathHullInset: request: " << cmd << endl; //lyxerr << "*** MathHullInset: request: " << cmd << endl;
switch (cmd.action) { switch (cmd.action) {
case LFUN_BREAKLINE: case LFUN_BREAKLINE:

View File

@ -571,7 +571,7 @@ void MathNestInset::priv_dispatch(LCursor & cur, FuncRequest & cmd)
case LFUN_ESCAPE: case LFUN_ESCAPE:
if (cur.selection()) if (cur.selection())
cur.selClear(); cur.clearSelection();
else else
cmd = FuncRequest(LFUN_FINISHED_LEFT); cmd = FuncRequest(LFUN_FINISHED_LEFT);
break; break;
@ -964,7 +964,7 @@ void MathNestInset::lfunMouseRelease(LCursor & cur, FuncRequest & cmd)
if (cmd.button() == mouse_button::button2) { if (cmd.button() == mouse_button::button2) {
MathArray ar; MathArray ar;
asArray(cur.bv().getClipboard(), ar); asArray(cur.bv().getClipboard(), ar);
cur.selClear(); cur.clearSelection();
cur.setScreenPos(cmd.x, cmd.y); cur.setScreenPos(cmd.x, cmd.y);
cur.insert(ar); cur.insert(ar);
cur.bv().update(); cur.bv().update();
@ -987,9 +987,9 @@ void MathNestInset::lfunMousePress(LCursor & cur, FuncRequest & cmd)
if (cmd.button() == mouse_button::button1) { if (cmd.button() == mouse_button::button1) {
first_x = cmd.x; first_x = cmd.x;
first_y = cmd.y; first_y = cmd.y;
cur.selClear();
//cur.setScreenPos(cmd.x + xo_, cmd.y + yo_); //cur.setScreenPos(cmd.x + xo_, cmd.y + yo_);
lyxerr << "lfunMousePress: setting cursor to: " << cur << endl; lyxerr << "lfunMousePress: setting cursor to: " << cur << endl;
cur.resetAnchor();
cur.bv().cursor() = cur; cur.bv().cursor() = cur;
} }
@ -1011,10 +1011,6 @@ void MathNestInset::lfunMouseMotion(LCursor & cur, FuncRequest & cmd)
first_x = cmd.x; first_x = cmd.x;
first_y = cmd.y; first_y = cmd.y;
if (!cur.selection())
cur.selBegin();
//cur.setScreenPos(cmd.x + xo_, cmd.y + yo_);
cur.bv().cursor().setCursor(cur, true); cur.bv().cursor().setCursor(cur, true);
} }

View File

@ -1671,14 +1671,14 @@ void Paragraph::cleanChanges()
Change::Type Paragraph::lookupChange(lyx::pos_type pos) const Change::Type Paragraph::lookupChange(lyx::pos_type pos) const
{ {
BOOST_ASSERT(!size() || pos < size()); BOOST_ASSERT(empty() || pos < size());
return pimpl_->lookupChange(pos); return pimpl_->lookupChange(pos);
} }
Change const Paragraph::lookupChangeFull(lyx::pos_type pos) const Change const Paragraph::lookupChangeFull(lyx::pos_type pos) const
{ {
BOOST_ASSERT(!size() || pos < size()); BOOST_ASSERT(empty() || pos < size());
return pimpl_->lookupChangeFull(pos); return pimpl_->lookupChangeFull(pos);
} }

View File

@ -417,13 +417,19 @@ void LyXText::setFont(LCursor & cur, LyXFont const & font, bool toggleall)
DocIterator pos = cur.selectionBegin(); DocIterator pos = cur.selectionBegin();
DocIterator posend = cur.selectionEnd(); DocIterator posend = cur.selectionEnd();
lyxerr << "pos: " << pos << " posend: " << posend << endl;
BufferParams const & params = bv()->buffer()->params(); BufferParams const & params = bv()->buffer()->params();
for (; pos != posend; pos.forwardChar()) { // Don't use forwardChar here as posend might have
// pos() == lastpos() and forwardChar would miss it.
for (; pos != posend; pos.forwardPos()) {
if (pos.pos() != pos.lastpos()) {
LyXFont f = getFont(pos.par(), pos.pos()); LyXFont f = getFont(pos.par(), pos.pos());
f.update(font, params.language, toggleall); f.update(font, params.language, toggleall);
setCharFont(pos.par(), pos.pos(), f); setCharFont(pos.par(), pos.pos(), f);
} }
}
redoParagraphs(beg, end + 1); redoParagraphs(beg, end + 1);
} }

View File

@ -138,7 +138,7 @@ namespace {
if (sel.empty()) { if (sel.empty()) {
cur.insert(new MathHullInset); cur.insert(new MathHullInset);
cur.dispatch(FuncRequest(LFUN_RIGHT)); cur.nextInset()->edit(cur, true);
cur.dispatch(FuncRequest(LFUN_MATH_MUTATE, "simple")); cur.dispatch(FuncRequest(LFUN_MATH_MUTATE, "simple"));
// don't do that also for LFUN_MATH_MODE unless you want end up with // don't do that also for LFUN_MATH_MODE unless you want end up with
// always changing to mathrm when opening an inlined inset // always changing to mathrm when opening an inlined inset
@ -1079,6 +1079,12 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
lyxerr << "BufferView::Pimpl::dispatch: no selection possible\n"; lyxerr << "BufferView::Pimpl::dispatch: no selection possible\n";
break; break;
} }
// ignore motions deeper nested than the real anchor
LCursor & bvcur = cur.bv().cursor();
if (bvcur.selection() && bvcur.anchor_.size() < cur.size())
break;
CursorSlice old = cur.top(); CursorSlice old = cur.top();
setCursorFromCoordinates(cur, cmd.x, cmd.y); setCursorFromCoordinates(cur, cmd.x, cmd.y);
@ -1140,6 +1146,10 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
finishUndo(); finishUndo();
cur.x_target() = cursorX(cur.top()); cur.x_target() = cursorX(cur.top());
// Set cursor here.
bv->cursor() = cur;
// Don't allow selection after a big jump.
if (bv->fitCursor()) if (bv->fitCursor())
selection_possible = false; selection_possible = false;
@ -1153,6 +1163,7 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
bv->owner()->dispatch(FuncRequest(LFUN_PASTESELECTION, "paragraph")); bv->owner()->dispatch(FuncRequest(LFUN_PASTESELECTION, "paragraph"));
selection_possible = false; selection_possible = false;
} }
break; break;
} }