X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBufferView.cpp;h=cb06810f7aaafa248eab7cd0b858a32f0feb336e;hb=0a7705a6736a85c3c751f7b4e9998833cdb71fc9;hp=46b3e079b451d3fba7010efde633d895f593119d;hpb=da47dc051e9ceb385b783424a86a21695657c811;p=lyx.git diff --git a/src/BufferView.cpp b/src/BufferView.cpp index 46b3e079b4..cb06810f7a 100644 --- a/src/BufferView.cpp +++ b/src/BufferView.cpp @@ -646,7 +646,7 @@ void BufferView::setCursorFromScrollbar() // We reset the cursor because cursorStatus() does not // work when the cursor is within mathed. Cursor cur(*this); - cur.reset(buffer_.inset()); + cur.reset(); tm.setCursorFromCoordinates(cur, 0, newy); // update the bufferview cursor and notify insets @@ -939,35 +939,6 @@ static Change::Type lookupChangeType(DocIterator const & dit, bool outer = false } -static bool getLocalStatus(Cursor cursor, FuncRequest const & cmd, FuncStatus & status) -{ - // Try to fix cursor in case it is broken. - cursor.fixIfBroken(); - - // This is, of course, a mess. Better create a new doc iterator and use - // this in Inset::getStatus. This might require an additional - // BufferView * arg, though (which should be avoided) - //Cursor safe = *this; - bool res = false; - for ( ; cursor.depth(); cursor.pop()) { - //lyxerr << "\nCursor::getStatus: cmd: " << cmd << endl << *this << endl; - LASSERT(cursor.idx() <= cursor.lastidx(), /**/); - LASSERT(cursor.pit() <= cursor.lastpit(), /**/); - LASSERT(cursor.pos() <= cursor.lastpos(), /**/); - - // The inset's getStatus() will return 'true' if it made - // a definitive decision on whether it want to handle the - // request or not. The result of this decision is put into - // the 'status' parameter. - if (cursor.inset().getStatus(cursor, cmd, status)) { - res = true; - break; - } - } - return res; -} - - bool BufferView::getStatus(FuncRequest const & cmd, FuncStatus & flag) { // Can we use a readonly buffer? @@ -989,13 +960,7 @@ bool BufferView::getStatus(FuncRequest const & cmd, FuncStatus & flag) Cursor & cur = d->cursor_; - // Is this a function that acts on inset at point? - Inset * inset = cur.nextInset(); - if (lyxaction.funcHasFlag(cmd.action, LyXAction::AtPoint) - && inset && inset->getStatus(cur, cmd, flag)) - return true; - - if (getLocalStatus(cur, cmd, flag)) + if (cur.getStatus(cmd, flag)) return true; switch (cmd.action) { @@ -1211,9 +1176,14 @@ bool BufferView::dispatch(FuncRequest const & cmd) Cursor & cur = d->cursor_; // Don't dispatch function that does not apply to internal buffers. - if (buffer_.isInternal() && lyxaction.funcHasFlag(cmd.action, LyXAction::NoInternal)) + if (buffer_.isInternal() + && lyxaction.funcHasFlag(cmd.action, LyXAction::NoInternal)) return false; + // We'll set this back to false if need be. + bool dispatched = true; + buffer_.undo().beginUndoGroup(); + switch (cmd.action) { case LFUN_BUFFER_PARAMS_APPLY: { @@ -1458,7 +1428,7 @@ bool BufferView::dispatch(FuncRequest const & cmd) case LFUN_ALL_CHANGES_ACCEPT: // select complete document - cur.reset(buffer_.inset()); + cur.reset(); cur.selHandle(true); buffer_.text().cursorBottom(cur); // accept everything in a single step to support atomic undo @@ -1469,7 +1439,7 @@ bool BufferView::dispatch(FuncRequest const & cmd) case LFUN_ALL_CHANGES_REJECT: // select complete document - cur.reset(buffer_.inset()); + cur.reset(); cur.selHandle(true); buffer_.text().cursorBottom(cur); // reject everything in a single step to support atomic undo @@ -1696,7 +1666,7 @@ bool BufferView::dispatch(FuncRequest const & cmd) p = Point(width_, height_); Cursor old = cur; bool const in_texted = cur.inTexted(); - cur.reset(buffer_.inset()); + cur.reset(); updateMetrics(); buffer_.changed(); d->text_metrics_[&buffer_.text()].editXY(cur, p.x_, p.y_, @@ -1795,11 +1765,6 @@ bool BufferView::dispatch(FuncRequest const & cmd) Alert::warning(_("Branch already exists"), drtmp.message()); break; } - BranchList & branch_list = buffer_.params().branchlist(); - Branch const * branch = branch_list.find(branch_name); - string const x11hexname = X11hexname(branch->color()); - docstring const str = branch_name + ' ' + from_ascii(x11hexname); - lyx::dispatch(FuncRequest(LFUN_SET_COLOR, str)); lyx::dispatch(FuncRequest(LFUN_BRANCH_INSERT, branch_name)); break; } @@ -1868,22 +1833,20 @@ bool BufferView::dispatch(FuncRequest const & cmd) if (!setCursorFromInset(inset)) { LASSERT(false, break); } - // useful if we are called from a dialog. - cur.beginUndoGroup(); cur.recordUndo(); FuncRequest fr(LFUN_INSET_MODIFY, cmd.argument()); inset->dispatch(cur, fr); - cur.endUndoGroup(); processUpdateFlags(Update::SinglePar | Update::FitCursor); break; } - default: - return false; + dispatched = false; + break; } - return true; + buffer_.undo().endUndoGroup(); + return dispatched; } @@ -1946,7 +1909,7 @@ Inset const * BufferView::getCoveringInset(Text const & text, if (!inset) return 0; - if (!inset->descendable()) + if (!inset->descendable(*this)) // No need to go further down if the inset is not // descendable. return inset; @@ -2153,7 +2116,7 @@ void BufferView::setCursorFromRow(int row) buffer_.texrow().getIdFromRow(row, tmpid, tmppos); - d->cursor_.reset(buffer_.inset()); + d->cursor_.reset(); if (tmpid == -1) buffer_.text().setCursor(d->cursor_, 0, 0); else @@ -2170,7 +2133,7 @@ bool BufferView::setCursorFromInset(Inset const * inset) // Inset is not at cursor position. Find it in the document. Cursor cur(*this); - cur.reset(buffer().inset()); + cur.reset(); while (cur && cur.nextInset() != inset) cur.forwardInset(); @@ -2235,7 +2198,7 @@ int BufferView::workHeight() const void BufferView::setCursor(DocIterator const & dit) { - d->cursor_.reset(buffer().inset()); + d->cursor_.reset(); size_t const n = dit.depth(); for (size_t i = 0; i < n; ++i) dit[i].inset().edit(d->cursor_, true); @@ -2280,6 +2243,8 @@ bool BufferView::mouseSetCursor(Cursor & cur, bool select) // persistent selection cap::saveSelection(cursor()); + d->cursor_.macroModeClose(); + // Has the cursor just left the inset? bool leftinset = (&d->cursor_.inset() != &cur.inset()); if (leftinset) @@ -2295,9 +2260,9 @@ bool BufferView::mouseSetCursor(Cursor & cur, bool select) bool update = leftinset; if (!do_selection && d->cursor_.inTexted()) update |= checkDepm(cur, d->cursor_); - d->cursor_.macroModeClose(); - d->cursor_.resetAnchor(); + if (!do_selection) + d->cursor_.resetAnchor(); d->cursor_.setCursor(cur); d->cursor_.boundary(cur.boundary()); if (do_selection)