]> git.lyx.org Git - lyx.git/blobdiff - src/BufferView.cpp
* cosmetic
[lyx.git] / src / BufferView.cpp
index 540ba866dd73e54404e85a9f6baa2ad2d421020b..d5ee51739c26aa8ffddf2034d4a96cdb706857d8 100644 (file)
@@ -768,7 +768,7 @@ void BufferView::showCursor(DocIterator const & dit)
        else if (bot_pit == tm.last().first + 1)
                tm.newParMetricsDown();
 
-       if (tm.has(bot_pit)) {
+       if (tm.contains(bot_pit)) {
                ParagraphMetrics const & pm = tm.parMetrics(bot_pit);
                BOOST_ASSERT(!pm.rows().empty());
                // FIXME: smooth scrolling doesn't work in mathed.
@@ -1417,6 +1417,7 @@ void BufferView::mouseEventDispatch(FuncRequest const & cmd0)
        // LFUN_FILE_OPEN generated by drag-and-drop.
        FuncRequest cmd = cmd0;
 
+       Cursor old = cursor();
        Cursor cur(*this);
        cur.push(buffer_.inset());
        cur.selection() = d->cursor_.selection();
@@ -1478,13 +1479,19 @@ void BufferView::mouseEventDispatch(FuncRequest const & cmd0)
        if (!cur.result().dispatched())
                cur.dispatch(cmd);
 
-       //Do we have a selection?
+       // Notify left insets
+       if (cur != old) {
+               old.fixIfBroken();
+               bool badcursor = notifyCursorLeaves(old, cur);
+               if (badcursor)
+                       cursor().fixIfBroken();
+       }
+       
+       // Do we have a selection?
        theSelection().haveSelection(cursor().selection());
 
        // If the command has been dispatched,
-       if (cur.result().dispatched()
-               // an update is asked,
-               && cur.result().update())
+       if (cur.result().dispatched() || cur.result().update())
                processUpdateFlags(cur.result().update());
 }
 
@@ -1586,7 +1593,7 @@ void BufferView::gotoLabel(docstring const & label)
 {
        for (InsetIterator it = inset_iterator_begin(buffer_.inset()); it; ++it) {
                vector<docstring> labels;
-               it->getLabelList(buffer_, labels);
+               it->getLabelList(labels);
                if (std::find(labels.begin(), labels.end(), label) != labels.end()) {
                        setCursor(it);
                        showCursor();
@@ -1675,8 +1682,12 @@ bool BufferView::mouseSetCursor(Cursor & cur, bool select)
        // Has the cursor just left the inset?
        bool badcursor = false;
        bool leftinset = (&d->cursor_.inset() != &cur.inset());
-       if (leftinset)
+       if (leftinset) {
+               d->cursor_.fixIfBroken();
                badcursor = notifyCursorLeaves(d->cursor_, cur);
+               if (badcursor)
+                       cur.fixIfBroken();
+       }
 
        // FIXME: shift-mouse selection doesn't work well across insets.
        bool do_selection = select && &d->cursor_.anchor().inset() == &cur.inset();
@@ -1689,24 +1700,7 @@ bool BufferView::mouseSetCursor(Cursor & cur, bool select)
        if (!do_selection && !badcursor && d->cursor_.inTexted())
                update |= checkDepm(cur, d->cursor_);
 
-       // if the cursor was in an empty script inset and the new
-       // position is in the nucleus of the inset, notifyCursorLeaves
-       // will kill the script inset itself. So we check all the
-       // elements of the cursor to make sure that they are correct.
-       // For an example, see bug 2933:
-       // http://bugzilla.lyx.org/show_bug.cgi?id=2933
-       // The code below could maybe be moved to a DocIterator method.
-       //lyxerr << "cur before " << cur << endl;
-       DocIterator dit = doc_iterator_begin(cur.inset());
-       dit.bottom() = cur.bottom();
-       size_t i = 1;
-       while (i < cur.depth() && dit.nextInset() == &cur[i].inset()) {
-               dit.push_back(cur[i]);
-               ++i;
-       }
-       //lyxerr << "5 cur after" << dit <<endl;
-
-       d->cursor_.setCursor(dit);
+       d->cursor_.setCursor(cur);
        d->cursor_.boundary(cur.boundary());
        if (do_selection)
                d->cursor_.setSelection();
@@ -1808,6 +1802,10 @@ void BufferView::updateMetrics()
        if (d->inlineCompletionPos.fixIfBroken())
                d->inlineCompletionPos = DocIterator();
        
+       if (d->anchor_pit_ >= npit)
+               // The anchor pit must have been deleted...
+               d->anchor_pit_ = npit - 1;
+
        // Rebreak anchor paragraph.
        tm.redoParagraph(d->anchor_pit_);
        ParagraphMetrics & anchor_pm = tm.par_metrics_[d->anchor_pit_];
@@ -1893,7 +1891,7 @@ void BufferView::insertLyXFile(FileName const & fname)
                el = buf.errorList("Parse");
                buffer_.undo().recordUndo(d->cursor_);
                cap::pasteParagraphList(d->cursor_, buf.paragraphs(),
-                                            buf.params().getTextClassPtr(), el);
+                                            buf.params().documentClassPtr(), el);
                res = _("Document %1$s inserted.");
        } else {
                res = _("Could not insert document %1$s");
@@ -2001,7 +1999,7 @@ Point BufferView::getPos(DocIterator const & dit, bool boundary) const
 {
        CursorSlice const & bot = dit.bottom();
        TextMetrics const & tm = textMetrics(bot.text());
-       if (!tm.has(bot.pit()))
+       if (!tm.contains(bot.pit()))
                return Point(-1, -1);
 
        Point p = coordOffset(dit, boundary); // offset from outer paragraph
@@ -2210,30 +2208,27 @@ void BufferView::setInlineCompletion(Cursor & cur, DocIterator const & pos,
        d->inlineCompletion = completion;
        d->inlineCompletionUniqueChars = min(completion.size(), uniqueChars);
        
-       lyxerr << "setInlineCompletion pos=" << pos << " completion=" << completion << " uniqueChars=" << uniqueChars << std::endl;
+       //lyxerr << "setInlineCompletion pos=" << pos << " completion=" << completion << " uniqueChars=" << uniqueChars << std::endl;
        
        // at new position?
        DocIterator const & old = d->inlineCompletionPos;
        if (old != pos) {
-               lyxerr << "inlineCompletionPos changed" << std::endl;
+               //lyxerr << "inlineCompletionPos changed" << std::endl;
                // old or pos are in another paragraph?
                if ((!samePar(cur, pos) && !pos.empty())
                    || (!samePar(cur, old) && !old.empty())) {
                        singlePar = false;
-                       lyxerr << "different paragraph" << std::endl;
+                       //lyxerr << "different paragraph" << std::endl;
                }
                d->inlineCompletionPos = pos;
        }
        
        // set update flags
        if (changed) {
-               lyxerr << "inlineCompletion changed" << std::endl;
-               
-               Update::flags flags
-               = cur.disp_.update() | Update::Force;
-               if (singlePar && !(flags | Update::SinglePar))
-                   flags = flags | Update::SinglePar;
-               cur.updateFlags(flags);
+               if (singlePar && !(cur.disp_.update() & Update::Force))
+                       cur.updateFlags(cur.disp_.update() | Update::SinglePar);
+               else
+                       cur.updateFlags(cur.disp_.update() | Update::Force);
        }
 }