]> git.lyx.org Git - lyx.git/blobdiff - src/BufferView.cpp
Paragraph::inInset() shall not be used if the owner inset was not initialized. Make...
[lyx.git] / src / BufferView.cpp
index ddbe14789a39fbdfbff8c2da58f9985a34d32fbe..2620dd65f730ee44aace1187eaf4a8165c609707 100644 (file)
@@ -533,6 +533,10 @@ docstring BufferView::toolTip(int x, int y) const
 
 docstring BufferView::contextMenu(int x, int y) const
 {
+       //If there is a selection, return the containing inset menu
+       if (d->cursor_.selection())
+               return d->cursor_.inset().contextMenu(*this, x, y);
+
        // Get inset under mouse, if there is one.
        Inset const * covering_inset = getCoveringInset(buffer_.text(), x, y);
        if (covering_inset)
@@ -602,31 +606,28 @@ void BufferView::setCursorFromScrollbar()
        int const height = 2 * defaultRowHeight();
        int const first = height;
        int const last = height_ - height;
-       Cursor & cur = d->cursor_;
+       int newy = 0;
+       Cursor const & oldcur = d->cursor_;
 
-       switch (cursorStatus(cur)) {
+       switch (cursorStatus(oldcur)) {
        case CUR_ABOVE:
-               // We reset the cursor because cursorStatus() does not
-               // work when the cursor is within mathed.
-               cur.reset(buffer_.inset());
-               tm.setCursorFromCoordinates(cur, 0, first);
-               cur.clearSelection();
+               newy = first;
                break;
        case CUR_BELOW:
-               // We reset the cursor because cursorStatus() does not
-               // work when the cursor is within mathed.
-               cur.reset(buffer_.inset());
-               tm.setCursorFromCoordinates(cur, 0, last);
-               cur.clearSelection();
+               newy = last;
                break;
        case CUR_INSIDE:
-               int const y = getPos(cur, cur.boundary()).y_;
-               int const newy = min(last, max(y, first));
-               if (y != newy) {
-                       cur.reset(buffer_.inset());
-                       tm.setCursorFromCoordinates(cur, 0, newy);
-               }
+               int const y = getPos(oldcur, oldcur.boundary()).y_;
+               newy = min(last, max(y, first));
+               if (y == newy) 
+                       return;
        }
+       // We reset the cursor because cursorStatus() does not
+       // work when the cursor is within mathed.
+       Cursor cur(*this);
+       cur.reset(buffer_.inset());
+       tm.setCursorFromCoordinates(cur, 0, newy);
+       mouseSetCursor(cur);
 }
 
 
@@ -1072,9 +1073,12 @@ bool BufferView::dispatch(FuncRequest const & cmd)
                if (!inset || !cur.result().dispatched())
                        cur.dispatch(cmd);
 
+               // FIXME I'm adding the last break to solve a crash,
+               // but that is obviously not right.
                if (!cur.result().dispatched())
                        // It did not work too; no action needed.
                        break;
+               break;
        }
 
        case LFUN_PARAGRAPH_GOTO: {
@@ -1456,15 +1460,12 @@ bool BufferView::dispatch(FuncRequest const & cmd)
                InsetIterator it  = inset_iterator_begin(inset);
                InsetIterator const end = inset_iterator_end(inset);
                for (; it != end; ++it) {
-                       if (!it->asInsetMath()
+                       if (it->asInsetCollapsable()
                            && (inset_code == NO_CODE
                            || inset_code == it->lyxCode())) {
                                Cursor tmpcur = cur;
                                tmpcur.pushBackward(*it);
-                               FuncStatus flag;
-                               it->getStatus(tmpcur, fr, flag);
-                               if (flag.enabled())
-                                       it->dispatch(tmpcur, fr);
+                               it->dispatch(tmpcur, fr);
                        }
                }
                processUpdateFlags(Update::Force | Update::FitCursor);
@@ -1483,6 +1484,7 @@ docstring const BufferView::requestSelection()
 {
        Cursor & cur = d->cursor_;
 
+       LYXERR(Debug::SELECTION, "requestSelection: cur.selection: " << cur.selection());
        if (!cur.selection()) {
                d->xsel_cache_.set = false;
                return docstring();