>>>>> "Martin" == Martin Vermeer <[EMAIL PROTECTED]> writes:
>> Searching the coordcache would be better. Martin> I'm sure it would be possible, but too risky now for 1.4.0. Here is what I have in mind. My assumptions here are that 1/ in a map, the elements are ordered wrt the key (pit_type here) 2/ the paragraphs in the cache are consecutive. I believe that both assumptions are true. The code that initializes the iterators looks a bit ugly, but it can be - factored out somewhere in bufferview.C - probably improved by someone who is better at STL than I am. I think it works, and would be interested by some testing. I believe the bruteFind function is exactly equivalent to what it was. I am not saying that this should go in 1.4.0. I say it is not as complicated as what one may imagine. JMarc
Index: src/cursor.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/cursor.C,v retrieving revision 1.142 diff -u -p -r1.142 cursor.C --- src/cursor.C 19 Jan 2006 15:49:20 -0000 1.142 +++ src/cursor.C 20 Jan 2006 13:49:08 -0000 @@ -122,16 +122,26 @@ namespace { BOOST_ASSERT(!cursor.empty()); InsetBase & inset = cursor[0].inset(); - DocIterator it = doc_iterator_begin(inset); - DocIterator const et = doc_iterator_end(inset); + CoordCache::InnerParPosCache const & cache = theCoords.getParPos().find(cursor.bottom().text())->second; + // Get an iterator on the first paragraph in the cache + DocIterator it(inset); + it.push_back(CursorSlice(inset)); + it.pit() = cache.begin()->first; + // Get an iterator after the last paragraph in the cache + DocIterator et(inset); + et.push_back(CursorSlice(inset)); + et.pit() = boost::prior(cache.end())->first; + if (et.pit() >= et.lastpit()) + et = doc_iterator_end(inset); + else + ++et.pit(); double best_dist = std::numeric_limits<double>::max();; DocIterator best_cursor = et; for ( ; it != et; it.forwardPos()) { // avoid invalid nesting when selecting - if (bv_funcs::status(&cursor.bv(), it) == bv_funcs::CUR_INSIDE - && (!cursor.selection() || positionable(it, cursor.anchor_))) { + if (!cursor.selection() || positionable(it, cursor.anchor_)) { Point p = bv_funcs::getPos(it, false); int xo = p.x_; int yo = p.y_; @@ -142,7 +152,7 @@ namespace { // '<=' in order to take the last possible position // this is important for clicking behind \sum in e.g. '\sum_i a' if (d <= best_dist) { - lyxerr << "*" << endl; + // lyxerr << "*" << endl; best_dist = d; best_cursor = it; }