]> git.lyx.org Git - lyx.git/blobdiff - src/TextMetrics.cpp
empty file format change due to r29840.
[lyx.git] / src / TextMetrics.cpp
index 3baf705c026725bcc7978197d1f92e2f658d6655..d93870d9ca22f56c742ca8a6c476809d80741a90 100644 (file)
@@ -1341,7 +1341,7 @@ pit_type TextMetrics::getPitNearY(int y)
 
        if (y >= last->second.position() + int(pm_last.descent())) {
                // We are looking for a position that is after the last paragraph in
-               // the cache (which is in priciple off-screen, that is before the
+               // the cache (which is in priciple off-screen), that is before the
                // visible part.
                pit = last->first + 1;
                if (pit == int(text_->paragraphs().size()))
@@ -1370,7 +1370,8 @@ pit_type TextMetrics::getPitNearY(int y)
 }
 
 
-Row const & TextMetrics::getRowNearY(int y, pit_type pit) const
+Row const & TextMetrics::getPitAndRowNearY(int y, pit_type & pit,
+       bool assert_in_view, bool up)
 {
        ParagraphMetrics const & pm = par_metrics_[pit];
 
@@ -1382,13 +1383,37 @@ Row const & TextMetrics::getRowNearY(int y, pit_type pit) const
        for (; rit != rlast; yy += rit->height(), ++rit)
                if (yy + rit->height() > y)
                        break;
+
+       if (assert_in_view && yy + rit->height() != y) {
+               if (!up) {
+                       if (rit != pm.rows().begin())
+                               --rit;
+                       else if (pit != 0) {
+                               --pit;
+                               newParMetricsUp();
+                               ParagraphMetrics const & pm2 = par_metrics_[pit];
+                               rit = pm2.rows().end();
+                               --rit;
+                       }
+               } else  {
+                       if (rit != rlast)
+                               ++rit;
+                       else if (pit != int(par_metrics_.size())) {
+                               ++pit;
+                               newParMetricsDown();
+                               ParagraphMetrics const & pm2 = par_metrics_[pit];
+                               rit = pm2.rows().begin();
+                       }
+               }
+       }
        return *rit;
 }
 
 
 // x,y are absolute screen coordinates
 // sets cursor recursively descending into nested editable insets
-Inset * TextMetrics::editXY(Cursor & cur, int x, int y)
+Inset * TextMetrics::editXY(Cursor & cur, int x, int y,
+       bool assert_in_view, bool up)
 {
        if (lyxerr.debugging(Debug::WORKAREA)) {
                LYXERR0("TextMetrics::editXY(cur, " << x << ", " << y << ")");
@@ -1397,7 +1422,7 @@ Inset * TextMetrics::editXY(Cursor & cur, int x, int y)
        pit_type pit = getPitNearY(y);
        LASSERT(pit != -1, return 0);
 
-       Row const & row = getRowNearY(y, pit);
+       Row const & row = getPitAndRowNearY(y, pit, assert_in_view, up);
        bool bound = false;
 
        int xx = x; // is modified by getColumnNearX
@@ -1421,7 +1446,7 @@ Inset * TextMetrics::editXY(Cursor & cur, int x, int y)
        }
 
        ParagraphList const & pars = text_->paragraphs();
-       Inset const * insetBefore = pos? pars[pit].getInset(pos - 1): 0;
+       Inset const * insetBefore = pos ? pars[pit].getInset(pos - 1) : 0;
        //Inset * insetBehind = pars[pit].getInset(pos);
 
        // This should be just before or just behind the