]> git.lyx.org Git - lyx.git/blobdiff - src/BufferView_pimpl.C
reduce number of calls to LyXText::getFont
[lyx.git] / src / BufferView_pimpl.C
index 2527b900449661f1b3802714004e85400b2ca28d..bf2bc7a40d6ebfa73b88e47395049fca36efc028 100644 (file)
 #include "support/types.h"
 
 #include <boost/bind.hpp>
+#include <boost/current_function.hpp>
 
 #include <functional>
+#include <vector>
 
 using lyx::pos_type;
 
@@ -96,6 +98,7 @@ using std::min;
 using std::max;
 using std::string;
 using std::mem_fun_ref;
+using std::vector;
 
 
 extern BufferList bufferlist;
@@ -132,7 +135,6 @@ T * getInsetByCode(LCursor & cur, InsetBase::Code code)
        return inset;
 }
 
-
 } // anon namespace
 
 
@@ -518,10 +520,8 @@ void BufferView::Pimpl::workAreaKeyPress(LyXKeySymPtr key,
         * of the cursor. Note we cannot do this inside
         * dispatch() itself, because that's called recursively.
         */
-       if (available()) {
-               cursor_timeout.restart();
+       if (available())
                screen().showCursor(*bv_);
-       }
 }
 
 
@@ -604,34 +604,41 @@ bool BufferView::Pimpl::fitCursor()
 }
 
 
-void BufferView::Pimpl::update(bool fitcursor, bool forceupdate)
+void BufferView::Pimpl::update(Update::flags flags)
 {
        lyxerr << BOOST_CURRENT_FUNCTION
-              << "[fitcursor = " << fitcursor << ','
-              << " forceupdate = " << forceupdate
+              << "[fitcursor = " << (flags & Update::FitCursor)
+              << ", forceupdate = " << (flags & Update::Force)
+              << ", singlepar = " << (flags & Update::SinglePar)
               << "]  buffer: " << buffer_ << endl;
 
        // Check needed to survive LyX startup
        if (buffer_) {
                // Update macro store
                buffer_->buildMacros();
-               // First drawing step
 
                CoordCache backup;
                std::swap(theCoords, backup);
+
+               // This, together with doneUpdating(), verifies (using
+               // asserts) that screen redraw is not called from
+               // within itself.
                theCoords.startUpdating();
 
+               // First drawing step
                ViewMetricsInfo vi = metrics();
+               bool forceupdate(flags & Update::Force);
 
-               if (fitcursor && fitCursor()) {
+               if ((flags & Update::FitCursor) && fitCursor()) {
                        forceupdate = true;
-                       vi = metrics();
+                       vi = metrics(flags & Update::SinglePar);
                }
                if (forceupdate) {
                        // Second drawing step
                        screen().redraw(*bv_, vi);
                } else {
-                       // Abort updating of the coord cache - just restore the old one
+                       // Abort updating of the coord
+                       // cache - just restore the old one
                        std::swap(theCoords, backup);
                }
        } else
@@ -653,8 +660,7 @@ void BufferView::Pimpl::cursorToggle()
                // have finished but are waiting to communicate this fact
                // to the rest of LyX.
                ForkedcallsController & fcc = ForkedcallsController::get();
-               if (fcc.processesCompleted())
-                       fcc.handleCompletedProcesses();
+               fcc.handleCompletedProcesses();
        }
 
        cursor_timeout.restart();
@@ -722,8 +728,7 @@ void BufferView::Pimpl::restorePosition(unsigned int i)
        if (par == buffer_->par_iterator_end())
                return;
 
-       bv_->text()->setCursor(cursor_, par.pit(),
-               min(par->size(), saved_positions[i].par_pos));
+       bv_->setCursor(makeDocIterator(par, min(par->size(), saved_positions[i].par_pos)));
 
        if (i > 0)
                owner_->message(bformat(_("Moved to bookmark %1$d"), i));
@@ -925,7 +930,10 @@ bool BufferView::Pimpl::workAreaDispatch(FuncRequest const & cmd0)
 
        if (cur.result().dispatched()) {
                // Redraw if requested or necessary.
-               update(cur.result().update(), cur.result().update());
+               if (cur.result().update())
+                       update(Update::FitCursor | Update::Force);
+               else
+                       update();
        }
 
        // See workAreaKeyPress
@@ -964,8 +972,10 @@ FuncStatus BufferView::Pimpl::getStatus(FuncRequest const & cmd)
        case LFUN_FONT_STATE:
        case LFUN_INSERT_LABEL:
        case LFUN_BOOKMARK_SAVE:
-       case LFUN_REF_GOTO:
        case LFUN_GOTO_PARAGRAPH:
+       case LFUN_GOTOERROR:
+       case LFUN_GOTONOTE:
+       case LFUN_REFERENCE_GOTO:
        case LFUN_WORD_FIND:
        case LFUN_WORD_REPLACE:
        case LFUN_MARK_OFF:
@@ -976,6 +986,12 @@ FuncStatus BufferView::Pimpl::getStatus(FuncRequest const & cmd)
                flag.enabled(true);
                break;
 
+       case LFUN_LABEL_GOTO: {
+               flag.enabled(!cmd.argument.empty()
+                   || getInsetByCode<InsetRef>(cursor_, InsetBase::REF_CODE));
+               break;
+       }
+
        case LFUN_BOOKMARK_GOTO:
                flag.enabled(isSavedPosition(convert<unsigned int>(cmd.argument)));
                break;
@@ -1072,7 +1088,7 @@ bool BufferView::Pimpl::dispatch(FuncRequest const & cmd)
                restorePosition(convert<unsigned int>(cmd.argument));
                break;
 
-       case LFUN_REF_GOTO: {
+       case LFUN_LABEL_GOTO: {
                string label = cmd.argument;
                if (label.empty()) {
                        InsetRef * inset =
@@ -1102,13 +1118,29 @@ bool BufferView::Pimpl::dispatch(FuncRequest const & cmd)
                }
 
                // Set the cursor
-               bv_->setCursor(par, 0);
+               bv_->setCursor(makeDocIterator(par, 0));
 
                update();
                switchKeyMap();
                break;
        }
 
+       case LFUN_GOTOERROR:
+               bv_funcs::gotoInset(bv_, InsetBase::ERROR_CODE, false);
+               break;
+
+       case LFUN_GOTONOTE:
+               bv_funcs::gotoInset(bv_, InsetBase::NOTE_CODE, false);
+               break;
+
+       case LFUN_REFERENCE_GOTO: {
+               vector<InsetBase_code> tmp;
+               tmp.push_back(InsetBase::LABEL_CODE);
+               tmp.push_back(InsetBase::REF_CODE);
+               bv_funcs::gotoInset(bv_, tmp, true);
+               break;
+       }
+
        case LFUN_TRACK_CHANGES:
                trackChanges();
                break;
@@ -1218,7 +1250,7 @@ bool BufferView::Pimpl::dispatch(FuncRequest const & cmd)
 }
 
 
-ViewMetricsInfo BufferView::Pimpl::metrics()
+ViewMetricsInfo BufferView::Pimpl::metrics(bool singlepar)
 {
        // Remove old position cache
        theCoords.clear();
@@ -1246,7 +1278,7 @@ ViewMetricsInfo BufferView::Pimpl::metrics()
 
        // Redo paragraphs above cursor if necessary
        int y1 = y0;
-       while (y1 > 0 && pit1 > 0) {
+       while (!singlepar && y1 > 0 && pit1 > 0) {
                y1 -= text->getPar(pit1).ascent();
                --pit1;
                text->redoParagraph(pit1);
@@ -1270,7 +1302,7 @@ ViewMetricsInfo BufferView::Pimpl::metrics()
 
        // Redo paragraphs below cursor if necessary
        int y2 = y0;
-       while (y2 < bv.workHeight() && pit2 < int(npit) - 1) {
+       while (!singlepar && y2 < bv.workHeight() && pit2 < int(npit) - 1) {
                y2 += text->getPar(pit2).descent();
                ++pit2;
                text->redoParagraph(pit2);
@@ -1293,5 +1325,5 @@ ViewMetricsInfo BufferView::Pimpl::metrics()
               << " y2: " << y2
               << endl;
 
-       return ViewMetricsInfo(pit1, pit2, y1, y2);
+       return ViewMetricsInfo(pit1, pit2, y1, y2, singlepar);
 }