]> git.lyx.org Git - lyx.git/blobdiff - src/BufferView.C
get rid of MSVC warning (signed/unsigned comparison)
[lyx.git] / src / BufferView.C
index 31bb27145ce238f4f79380c002ba8f66c251fd5e..008f03e4aa11e10347289ed7911525d6fbb5aa85 100644 (file)
@@ -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<size_t>(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<pit_type, int> 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<size_t>(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 <<std::endl;
+       DocIterator dit(cur.inset());
+       dit.push_back(cur.bottom());
+       size_t i = 1;
+       while (i < cur.depth() && dit.nextInset() == &cur[i].inset()) {
+               dit.push_back(cur[i]);
+               ++i;
+       }
+       //lyxerr << "5 cur after" << dit <<std::endl;
+
+       cursor_.setCursor(dit);
        cursor_.clearSelection();
        // remember new position.
        cursor_.setTargetX();
@@ -1440,7 +1470,8 @@ void BufferView::updateMetrics(bool singlepar)
                << "size: " << size
                << endl;
 
-       metrics_info_ = ViewMetricsInfo(pit1, pit2, y1, y2, singlepar, size);
+       metrics_info_ = ViewMetricsInfo(pit1, pit2, y1, y2, 
+               singlepar? SingleParUpdate: FullScreenUpdate, size);
 
        if (lyxerr.debugging(Debug::WORKAREA)) {
                lyxerr[Debug::WORKAREA] << "BufferView::updateMetrics" << endl;