]> git.lyx.org Git - lyx.git/blobdiff - src/BufferView.C
* src/frontends/qt4/QTocDialog.C (updateGui):
[lyx.git] / src / BufferView.C
index d5adcc3bf0e9733a355fa3e80da4900b179a08b5..7e084ad54836f7c737edac637fdb4838020ca745 100644 (file)
@@ -63,6 +63,7 @@
 #include "frontends/Alert.h"
 #include "frontends/FileDialog.h"
 #include "frontends/FontMetrics.h"
+#include "frontends/Selection.h"
 
 #include "graphics/Previews.h"
 
@@ -196,6 +197,7 @@ void BufferView::setBuffer(Buffer * b)
                        cursor_.resetAnchor();
                        cursor_.setCursor(buffer_->getCursor().asDocIterator(&(buffer_->inset())));
                        cursor_.setSelection();
+                       theSelection().haveSelection(cursor_.selection());
                }
        }
 
@@ -1016,20 +1018,20 @@ void BufferView::clearSelection()
        if (buffer_) {
                cursor_.clearSelection();
                xsel_cache_.set = false;
+               // The buffer did not really change, but this causes the
+               // redraw we need because we cleared the selection above.
+               buffer_->changed();
        }
 }
 
 
 void BufferView::workAreaResize(int width, int height)
 {
-       // A resize is triggered whenever a window gets focus,
-       // because of the shared rows() of a buffer in multiple
-       // buffer views.
-       
        // Update from work area
        width_ = width;
        height_ = height;
 
+       // The complete text metrics will be redone.
        text_metrics_.clear();
 
        if (buffer_)
@@ -1152,8 +1154,6 @@ void BufferView::scroll(int /*lines*/)
 //
 //     scrollDocView(new_top_y);
 //
-//     // Update the scrollbar.
-//     workArea_->setScrollbarParams(t->height(), top_y(), defaultRowHeight());}
 }
 
 
@@ -1300,6 +1300,7 @@ void BufferView::putSelectionAt(DocIterator const & cur,
                        cursor_.setSelection(cursor_, -length);
                } else
                        cursor_.setSelection(cursor_, length);
+               theSelection().haveSelection(cursor_.selection());
        }
 }
 
@@ -1328,6 +1329,7 @@ ViewMetricsInfo const & BufferView::viewMetricsInfo()
 }
 
 
+// FIXME: We should split-up updateMetrics() for the singlepar case.
 void BufferView::updateMetrics(bool singlepar)
 {
        LyXText & buftext = buffer_->text();
@@ -1338,19 +1340,25 @@ void BufferView::updateMetrics(bool singlepar)
                anchor_ref_ = int(buftext.paragraphs().size() - 1);
                offset_ref_ = 0;
        }
+       
+       // If the paragraph metrics has changed, we can not
+       // use the singlepar optimisation.
+       if (singlepar
+               // In Single Paragraph mode, rebreak only
+               // the (main text, not inset!) paragraph containing the cursor.
+               // (if this paragraph contains insets etc., rebreaking will
+               // recursively descend)
+               && tm.redoParagraph(cursor_.bottom().pit()))
+               singlepar = false;
 
        pit_type const pit = anchor_ref_;
        int pit1 = pit;
        int pit2 = pit;
        size_t const npit = buftext.paragraphs().size();
 
-       // Rebreak anchor paragraph. In Single Paragraph mode, rebreak only
-       // the (main text, not inset!) paragraph containing the cursor.
-       // (if this paragraph contains insets etc., rebreaking will
-       // recursively descend)
-       if (!singlepar || pit == cursor_.bottom().pit())
-               if (tm.redoParagraph(pit))
-                       singlepar = false;
+       // Rebreak anchor paragraph.
+       if (!singlepar)
+               tm.redoParagraph(pit);
        
        // Clear out the position cache in case of full screen redraw.
        if (!singlepar)
@@ -1358,13 +1366,12 @@ void BufferView::updateMetrics(bool singlepar)
 
        int y0 = tm.parMetrics(pit).ascent() - offset_ref_;
 
-       // Redo paragraphs above anchor if necessary; again, in Single Par
-       // mode, only if we encounter the (main text) one having the cursor.
+       // Redo paragraphs above anchor if necessary.
        int y1 = y0;
        while (y1 > 0 && pit1 > 0) {
                y1 -= tm.parMetrics(pit1).ascent();
                --pit1;
-               if (!singlepar || pit1 == cursor_.bottom().pit())
+               if (!singlepar)
                        tm.redoParagraph(pit1);
                y1 -= tm.parMetrics(pit1).descent();
        }
@@ -1384,13 +1391,12 @@ void BufferView::updateMetrics(bool singlepar)
                anchor_ref_ = 0;
        }
 
-       // Redo paragraphs below the anchor if necessary. Single par mode:
-       // only the one containing the cursor if encountered.
+       // Redo paragraphs below the anchor if necessary.
        int y2 = y0;
        while (y2 < height_ && pit2 < int(npit) - 1) {
                y2 += tm.parMetrics(pit2).descent();
                ++pit2;
-               if (!singlepar || pit2 == cursor_.bottom().pit())
+               if (!singlepar)
                        tm.redoParagraph(pit2);
                y2 += tm.parMetrics(pit2).ascent();
        }