X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBufferView.C;h=008f03e4aa11e10347289ed7911525d6fbb5aa85;hb=3f8fa07c6ed38218d6a4048f2993a512aa942c96;hp=31bb27145ce238f4f79380c002ba8f66c251fd5e;hpb=31cbae750d98c65de43af2e6c19a86e706998e73;p=lyx.git diff --git a/src/BufferView.C b/src/BufferView.C index 31bb27145c..008f03e4aa 100644 --- a/src/BufferView.C +++ b/src/BufferView.C @@ -188,7 +188,6 @@ void BufferView::setBuffer(Buffer * b) << "Buffer addr: " << buffer_ << endl; cursor_.push(buffer_->inset()); cursor_.resetAnchor(); - updateLabels(*buffer_); buffer_->text().setCurrentFont(cursor_); if (buffer_->getCursor().size() > 0 && buffer_->getAnchor().size() > 0) @@ -258,27 +257,17 @@ bool BufferView::loadLyXFile(FileName const & filename, bool tolastfiles) // Send the "errors" signal in case of parsing errors b->errors("Parse"); + // Update the labels and section numbering. + updateLabels(*buffer_); // scroll to the position when the file was last closed if (lyxrc.use_lastfilepos) { pit_type pit; pos_type pos; boost::tie(pit, pos) = LyX::ref().session().lastFilePos().load(filename); - // I am not sure how to separate the following part to a function - // so I will leave this to Lars. - // - // check pit since the document may be externally changed. - if ( static_cast(pit) < b->paragraphs().size() ) { - ParIterator it = b->par_iterator_begin(); - ParIterator const end = b->par_iterator_end(); - for (; it != end; ++it) - if (it.pit() == pit) { - // restored pos may be bigger than it->size - setCursor(makeDocIterator(it, min(pos, it->size()))); - // No need to update the metrics if fitCursor returns false. - if (fitCursor()) - updateMetrics(false); - break; - } + // if successfully move to pit (returned par_id is not zero), update metrics + if (moveToPosition(pit, 0, pos).get<1>()) { + if (fitCursor()) + updateMetrics(false); } } @@ -289,13 +278,6 @@ bool BufferView::loadLyXFile(FileName const & filename, bool tolastfiles) } -void BufferView::reload() -{ - if (theBufferList().close(buffer_, false)) - loadLyXFile(FileName(buffer_->fileName())); -} - - void BufferView::resize() { if (!buffer_) @@ -369,15 +351,30 @@ bool BufferView::update(Update::flags flags) // Case when no explicit update is requested. if (!flags) { // no need to redraw anything. + metrics_info_.update_strategy = NoScreenUpdate; return false; } - if (flags == Update::FitCursor) { + if (flags == Update::Decoration) { + metrics_info_.update_strategy = DecorationUpdate; + return true; + } + + if (flags == Update::FitCursor + || flags == (Update::Decoration | Update::FitCursor)) { bool const fit_cursor = fitCursor(); - if (fit_cursor) - updateMetrics(false); // tell the frontend to update the screen if needed. - return fit_cursor; + if (fit_cursor) { + updateMetrics(false); + return true; + } + if (flags & Update::Decoration) { + metrics_info_.update_strategy = DecorationUpdate; + return true; + } + // no screen update is needed. + metrics_info_.update_strategy = NoScreenUpdate; + return false; } bool full_metrics = flags & Update::Force; @@ -535,6 +532,7 @@ void BufferView::saveBookmark(bool persistent) { LyX::ref().session().bookmarks().save( FileName(buffer_->fileName()), + cursor_.pit(), cursor_.paragraph().id(), cursor_.pos(), persistent @@ -545,15 +543,31 @@ void BufferView::saveBookmark(bool persistent) } -void BufferView::moveToPosition(int par_id, pos_type par_pos) +boost::tuple BufferView::moveToPosition(pit_type par_pit, int par_id, pos_type par_pos) { cursor_.clearSelection(); - ParIterator par = buffer_->getParFromID(par_id); - if (par == buffer_->par_iterator_end()) - return; - - setCursor(makeDocIterator(par, min(par->size(), par_pos))); + // if a valid par_id is given, try it first + if (par_id > 0) { + ParIterator par = buffer_->getParFromID(par_id); + if (par != buffer_->par_iterator_end()) { + setCursor(makeDocIterator(par, min(par->size(), par_pos))); + return boost::make_tuple(cursor_.pit(), par_id); + } + } + // if par_id == 0, or searching through par_id failed + if (static_cast(par_pit) < buffer_->paragraphs().size()) { + ParIterator it = buffer_->par_iterator_begin(); + ParIterator const end = buffer_->par_iterator_end(); + for (; it != end; ++it) + if (it.pit() == par_pit) { + // restored pos may be bigger than it->size + setCursor(makeDocIterator(it, min(par_pos, it->size()))); + return boost::make_tuple(par_pit, it->id()); + } + } + // both methods fail + return boost::make_tuple(pit_type(0), 0); } @@ -604,8 +618,8 @@ FuncStatus BufferView::getStatus(FuncRequest const & cmd) flag.enabled(!buffer_->redostack().empty()); break; case LFUN_FILE_INSERT: - case LFUN_FILE_INSERT_ASCII_PARA: - case LFUN_FILE_INSERT_ASCII: + case LFUN_FILE_INSERT_PLAINTEXT_PARA: + case LFUN_FILE_INSERT_PLAINTEXT: case LFUN_BOOKMARK_SAVE: // FIXME: Actually, these LFUNS should be moved to LyXText flag.enabled(cursor_.inTexted()); @@ -721,14 +735,14 @@ bool BufferView::dispatch(FuncRequest const & cmd) menuInsertLyXFile(to_utf8(cmd.argument())); break; - case LFUN_FILE_INSERT_ASCII_PARA: + case LFUN_FILE_INSERT_PLAINTEXT_PARA: // FIXME UNICODE - insertAsciiFile(this, to_utf8(cmd.argument()), true); + insertPlaintextFile(this, to_utf8(cmd.argument()), true); break; - case LFUN_FILE_INSERT_ASCII: + case LFUN_FILE_INSERT_PLAINTEXT: // FIXME UNICODE - insertAsciiFile(this, to_utf8(cmd.argument()), false); + insertPlaintextFile(this, to_utf8(cmd.argument()), false); break; case LFUN_FONT_STATE: @@ -845,7 +859,7 @@ bool BufferView::dispatch(FuncRequest const & cmd) #warning FIXME changes #endif while (findNextChange(this)) - getLyXText()->acceptChange(cursor_); + getLyXText()->acceptOrRejectChange(cursor_, true); update(); break; } @@ -856,7 +870,7 @@ bool BufferView::dispatch(FuncRequest const & cmd) #warning FIXME changes #endif while (findNextChange(this)) - getLyXText()->rejectChange(cursor_); + getLyXText()->acceptOrRejectChange(cursor_, false); break; } @@ -1085,7 +1099,8 @@ bool BufferView::workAreaDispatch(FuncRequest const & cmd0) // not expose the button for redraw. We adjust here the metrics dimension // to enable a full redraw. // FIXME: It is possible to redraw only the area around the button! - if (need_redraw && metrics_info_.singlepar) { + if (need_redraw + && metrics_info_.update_strategy == SingleParUpdate) { // FIXME: It should be possible to redraw only the area around // the button by doing this: // @@ -1238,8 +1253,6 @@ void BufferView::setCursor(DocIterator const & dit) dit[i].inset().edit(cursor_, true); cursor_.setCursor(dit); - // remember new position. - cursor_.setTargetX(); cursor_.selection() = false; } @@ -1281,7 +1294,24 @@ bool BufferView::mouseSetCursor(LCursor & cur) if (!badcursor && cursor_.inTexted()) checkDepm(cur, cursor_); - cursor_ = cur; + // if the cursor was in an empty script inset and the new + // position is in the nucleus of the inset, notifyCursorLeaves + // will kill the script inset itself. So we check all the + // elements of the cursor to make sure that they are correct. + // For an example, see bug 2933: + // http://bugzilla.lyx.org/show_bug.cgi?id=2933 + // The code below could maybe be moved to a DocIterator method. + //lyxerr << "cur before " << cur <