]> git.lyx.org Git - lyx.git/blobdiff - src/text2.C
Scons: handle the case when qt4 is in system directories
[lyx.git] / src / text2.C
index 0513d5181c24454afdcd574ff0d8553f070b2c41..9a9057c39112bad1352a30a498548c37af6350fa 100644 (file)
@@ -102,7 +102,7 @@ bool LyXText::isMainText(Buffer const & buffer) const
 
 
 //takes screen x,y coordinates
-InsetBase * LyXText::checkInsetHit(BufferView const & bv, int x, int y) const
+InsetBase * LyXText::checkInsetHit(BufferView & bv, int x, int y)
 {
        pit_type pit = getPitNearY(bv, y);
        BOOST_ASSERT(pit != -1);
@@ -904,7 +904,7 @@ pos_type LyXText::getColumnNearX(BufferView const & bv, pit_type const pit,
 
 
 // y is screen coordinate
-pit_type LyXText::getPitNearY(BufferView const & bv, int y) const
+pit_type LyXText::getPitNearY(BufferView & bv, int y)
 {
        BOOST_ASSERT(!paragraphs().empty());
        BOOST_ASSERT(bv.coordCache().getParPos().find(this) != bv.coordCache().getParPos().end());
@@ -919,6 +919,40 @@ pit_type LyXText::getPitNearY(BufferView const & bv, int y) const
        int yy = -1;
        CoordCache::InnerParPosCache::const_iterator it = cc.begin();
        CoordCache::InnerParPosCache::const_iterator et = cc.end();
+       CoordCache::InnerParPosCache::const_iterator last = et; last--;
+
+       // If we are off-screen (before the visible part)
+       if (y < 0
+               // and even before the first paragraph in the cache.
+               && y < it->second.y_ - int(pars_[it->first].ascent())) {
+               //  and we are not at the first paragraph in the inset.
+               if (it->first == 0)
+                       return 0;
+               // then this is the paragraph we are looking for.
+               pit = it->first - 1;
+               // rebreak it and update the CoordCache.
+               redoParagraph(bv, pit);
+               bv.coordCache().parPos()[this][pit] =
+                       Point(0, it->second.y_ - pars_[it->first].descent());
+               return pit;
+       }
+
+       // If we are off-screen (after the visible part)
+       if (y > bv.workHeight()
+               // and even after the first paragraph in the cache.
+               && y >= last->second.y_ + int(pars_[last->first].descent())) {
+               pit = last->first + 1;
+               //  and we are not at the last paragraph in the inset.
+               if (pit == int(pars_.size()))
+                       return last->first;
+               // then this is the paragraph we are looking for.
+               // rebreak it and update the CoordCache.
+               redoParagraph(bv, pit);
+               bv.coordCache().parPos()[this][pit] =
+                       Point(0, last->second.y_ + pars_[last->first].ascent());
+               return pit;
+       }
+
        for (; it != et; ++it) {
                lyxerr[Debug::DEBUG]
                        << BOOST_CURRENT_FUNCTION
@@ -965,6 +999,12 @@ InsetBase * LyXText::editXY(LCursor & cur, int x, int y)
        }
        pit_type pit = getPitNearY(cur.bv(), y);
        BOOST_ASSERT(pit != -1);
+       // When another window is opened with the same document, rows()
+       // will be cleared so pars_[pit].rows() might be empty when switching
+       // between windwos. A better solution is that each buffer view
+       // has its own rows() for the same buffer.
+       if (pars_[pit].rows().empty())
+               redoParagraph(cur.bv(), pit);
        Row const & row = getRowNearY(cur.bv(), y, pit);
        bool bound = false;
 
@@ -1024,6 +1064,9 @@ bool LyXText::checkAndActivateInset(LCursor & cur, bool front)
 
 bool LyXText::cursorLeft(LCursor & cur)
 {
+       // Tell BufferView to test for FitCursor in any case!
+       cur.updateFlags(Update::FitCursor);
+
        if (!cur.boundary() && cur.pos() > 0 &&
            cur.textRow().pos() == cur.pos() &&
            !cur.paragraph().isLineSeparator(cur.pos()-1) &&
@@ -1052,6 +1095,9 @@ bool LyXText::cursorLeft(LCursor & cur)
 
 bool LyXText::cursorRight(LCursor & cur)
 {
+       // Tell BufferView to test for FitCursor in any case!
+       cur.updateFlags(Update::FitCursor);
+
        if (cur.pos() != cur.lastpos()) {
                if (cur.boundary())
                        return setCursor(cur, cur.pit(), cur.pos(),
@@ -1081,6 +1127,9 @@ bool LyXText::cursorRight(LCursor & cur)
 
 bool LyXText::cursorUp(LCursor & cur)
 {
+       // Tell BufferView to test for FitCursor in any case!
+       cur.updateFlags(Update::FitCursor);
+
        Paragraph const & par = cur.paragraph();
        int row;
        int const x = cur.targetX();
@@ -1130,6 +1179,9 @@ bool LyXText::cursorUp(LCursor & cur)
 
 bool LyXText::cursorDown(LCursor & cur)
 {
+       // Tell BufferView to test for FitCursor in any case!
+       cur.updateFlags(Update::FitCursor);
+
        Paragraph const & par = cur.paragraph();
        int row;
        int const x = cur.targetX();
@@ -1269,6 +1321,8 @@ bool LyXText::deleteEmptyParagraphMechanism(LCursor & cur, LCursor & old)
                    && oldpar.isLineSeparator(old.pos() - 1)
                    && !oldpar.isDeleted(old.pos() - 1)) {
                        oldpar.eraseChar(old.pos() - 1, false); // do not track changes in DEPM
+                       // rebreak it and update the CoordCache.
+                       redoParagraph(cur.bv(), old.pit());
 #ifdef WITH_WARNINGS
 #warning This will not work anymore when we have multiple views of the same buffer
 // In this case, we will have to correct also the cursors held by