]> git.lyx.org Git - lyx.git/blobdiff - src/BufferView.cpp
Let tm be a reference here as elsewhere
[lyx.git] / src / BufferView.cpp
index ed559b152493c06b08b944bd68c11201ebce3d4f..7edf9e25cfbb5610644e09ec9a55f28e90b65db1 100644 (file)
@@ -477,7 +477,8 @@ string flagsAsString(Update::flags flags)
        return string((flags & Update::FitCursor) ? "FitCursor " : "")
                + ((flags & Update::Force) ? "Force " : "")
                + ((flags & Update::ForceDraw) ? "ForceDraw " : "")
-               + ((flags & Update::SinglePar) ? "SinglePar " : "");
+               + ((flags & Update::SinglePar) ? "SinglePar " : "")
+               + ((flags & Update::Decoration) ? "Decoration " : "");
 }
 
 }
@@ -491,6 +492,14 @@ void BufferView::processUpdateFlags(Update::flags flags)
        if (flags == Update::None)
                return;
 
+       /* FIXME We would like to avoid doing this here, since it is very
+        * expensive and is called in updateBuffer already. However, even
+        * inserting a plain character can invalidate the overly fragile
+        * tables of child documents built by updateMacros. Some work is
+        * needed to avoid doing that when not necessary.
+        */
+       buffer_.updateMacros();
+
        // SinglePar is ignored for now (this should probably change). We
        // set it ourselves below, at the price of always rebreaking the
        // paragraph at cursor. This can be expensive for large tables.
@@ -503,6 +512,16 @@ void BufferView::processUpdateFlags(Update::flags flags)
                updateMetrics(flags);
        }
 
+       // Detect whether we can only repaint a single paragraph.
+       // We handle this before FitCursor because the later will require
+       // correct metrics at cursor position.
+       if (!(flags & Update::ForceDraw)) {
+               if (singleParUpdate())
+                       flags = flags | Update::SinglePar;
+               else
+                       updateMetrics(flags);
+       }
+
        // Then make sure that the screen contains the cursor if needed
        if (flags & Update::FitCursor) {
                if (needsFitCursor()) {
@@ -513,14 +532,6 @@ void BufferView::processUpdateFlags(Update::flags flags)
                flags = flags & ~Update::FitCursor;
        }
 
-       // Finally detect whether we can only repaint a single paragraph
-       if (!(flags & Update::ForceDraw)) {
-               if (singleParUpdate())
-                       flags = flags | Update::SinglePar;
-               else
-                       updateMetrics(flags);
-       }
-
        // Add flags to the the update flags. These will be reset to None
        // after the redraw is actually done
        d->update_flags_ = d->update_flags_ | flags;
@@ -857,7 +868,7 @@ bool BufferView::moveToPosition(pit_type bottom_pit, pos_type bottom_pos,
                d->cursor_.setCurrentFont();
                // Do not forget to reset the anchor (see #9912)
                d->cursor_.resetAnchor();
-               processUpdateFlags(Update::FitCursor);
+               processUpdateFlags(Update::Force | Update::FitCursor);
        }
 
        return success;
@@ -1154,7 +1165,7 @@ bool BufferView::getStatus(FuncRequest const & cmd, FuncStatus & flag)
                break;
 
        case LFUN_GRAPHICS_UNIFY:
-               flag.setEnabled(cur.selection());
+               flag.setEnabled(cur.countInsetsInSelection(GRAPHICS_CODE)>1);
                break;
 
        case LFUN_WORD_FINDADV: {
@@ -1253,7 +1264,10 @@ Inset * BufferView::editedInset(string const & name) const
 
 void BufferView::editInset(string const & name, Inset * inset)
 {
-       d->edited_insets_[name] = inset;
+       if (inset)
+               d->edited_insets_[name] = inset;
+       else
+               d->edited_insets_.erase(name);
 }
 
 
@@ -1355,7 +1369,7 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
                //  without calling recordUndo. Fix this before using
                //  recordUndoBufferParams().
                cur.recordUndoFullBuffer();
-               buffer_.params().setBaseClass(argument);
+               buffer_.params().setBaseClass(argument, buffer_.layoutPos());
                makeDocumentClass();
                dr.screenUpdate(Update::Force);
                dr.forceBufferUpdate();
@@ -1379,7 +1393,7 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
        case LFUN_LAYOUT_RELOAD: {
                LayoutFileIndex bc = buffer_.params().baseClassID();
                LayoutFileList::get().reset(bc);
-               buffer_.params().setBaseClass(bc);
+               buffer_.params().setBaseClass(bc, buffer_.layoutPos());
                makeDocumentClass();
                dr.screenUpdate(Update::Force);
                dr.forceBufferUpdate();
@@ -1392,14 +1406,14 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
                // We need to find out if the bibliography information
                // has changed. See bug #11055.
                // So these should not be references...
-               LayoutModuleList const engines = buffer().params().citeEngine();
+               string const engine = buffer().params().citeEngine();
                CiteEngineType const enginetype = buffer().params().citeEngineType();
-               if (!cur.textUndo())
+               if (!cur.undoAction())
                        dr.setMessage(_("No further undo information"));
                else {
                        dr.screenUpdate(Update::Force | Update::FitCursor);
                        dr.forceBufferUpdate();
-                       if (buffer().params().citeEngine() != engines ||
+                       if (buffer().params().citeEngine() != engine ||
                            buffer().params().citeEngineType() != enginetype)
                                buffer().invalidateCiteLabels();
                }
@@ -1412,14 +1426,14 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
                // We need to find out if the bibliography information
                // has changed. See bug #11055.
                // So these should not be references...
-               LayoutModuleList const engines = buffer().params().citeEngine();
+               string const engine = buffer().params().citeEngine();
                CiteEngineType const enginetype = buffer().params().citeEngineType();
-               if (!cur.textRedo())
+               if (!cur.redoAction())
                        dr.setMessage(_("No further redo information"));
                else {
                        dr.screenUpdate(Update::Force | Update::FitCursor);
                        dr.forceBufferUpdate();
-                       if (buffer().params().citeEngine() != engines ||
+                       if (buffer().params().citeEngine() != engine ||
                            buffer().params().citeEngineType() != enginetype)
                                buffer().invalidateCiteLabels();
                }
@@ -1890,10 +1904,12 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr)
                        // At least one complete cell is selected and inset is a table.
                        // Select all cells
                        cur.idx() = 0;
+                       cur.pit() = 0;
                        cur.pos() = 0;
                        cur.resetAnchor();
                        cur.selection(true);
                        cur.idx() = cur.lastidx();
+                       cur.pit() = cur.lastpit();
                        cur.pos() = cur.lastpos();
                } else {
                        // select current cell
@@ -2501,15 +2517,26 @@ bool BufferView::setCursorFromInset(Inset const * inset)
 
 void BufferView::gotoLabel(docstring const & label)
 {
+       FuncRequest action;
+       bool have_inactive = false;
        for (Buffer const * buf : buffer().allRelatives()) {
                // find label
                for (TocItem const & item : *buf->tocBackend().toc("label")) {
-                       if (label == item.str()) {
+                       if (label == item.str() && item.isOutput()) {
                                lyx::dispatch(item.action());
                                return;
                        }
+                       // If we find an inactive label, save it for the case
+                       // that no active one is there
+                       if (label == item.str() && !have_inactive) {
+                               have_inactive = true;
+                               action = item.action();
+                       }
                }
        }
+       // We only found an inactive label. Go there.
+       if (have_inactive)
+               lyx::dispatch(action);
 }
 
 
@@ -2581,7 +2608,7 @@ bool BufferView::checkDepm(Cursor & cur, Cursor & old)
                return false;
 
        bool need_anchor_change = false;
-       bool changed = d->cursor_.text()->deleteEmptyParagraphMechanism(cur, old,
+       bool changed = Text::deleteEmptyParagraphMechanism(cur, old,
                need_anchor_change);
 
        if (need_anchor_change)