]> git.lyx.org Git - lyx.git/blobdiff - src/BufferView.cpp
Trivial whitespace fix.
[lyx.git] / src / BufferView.cpp
index 62b91fae761b7a1cbe876776c844f488f0b46721..4f2fe0a334747319a2fb86844188b8ad3c4d3074 100644 (file)
@@ -39,9 +39,9 @@
 #include "LyX.h"
 #include "lyxfind.h"
 #include "LyXFunc.h"
-#include "LyXLayout.h"
-#include "LyXText.h"
-#include "LyXTextClass.h"
+#include "Layout.h"
+#include "Text.h"
+#include "TextClass.h"
 #include "LyXRC.h"
 #include "Session.h"
 #include "Paragraph.h"
@@ -107,7 +107,7 @@ namespace {
 
 /// Return an inset of this class if it exists at the current cursor position
 template <class T>
-T * getInsetByCode(Cursor & cur, InsetBase::Code code)
+T * getInsetByCode(Cursor & cur, Inset::Code code)
 {
        T * inset = 0;
        DocIterator it = cur;
@@ -183,14 +183,20 @@ void BufferView::setBuffer(Buffer * b)
                return;
        }
 
+       //FIXME Fix for bug 3440 is here.
        // If we are closing current buffer, switch to the first in
        // buffer list.
        if (!b) {
                LYXERR(Debug::INFO) << BOOST_CURRENT_FUNCTION
                                    << " No Buffer!" << endl;
                // We are closing the buffer, use the first buffer as current
+               //FIXME 3440
+               // if (last_buffer_) buffer_ = last_buffer_;
+               // also check that this is in theBufferList()?
                buffer_ = theBufferList().first();
        } else {
+               //FIXME 3440
+               // last_buffer = buffer_;
                // Set current buffer
                buffer_ = b;
        }
@@ -200,33 +206,36 @@ void BufferView::setBuffer(Buffer * b)
        anchor_ref_ = 0;
        offset_ref_ = 0;
 
-       if (buffer_) {
-               LYXERR(Debug::INFO) << BOOST_CURRENT_FUNCTION
-                                   << "Buffer addr: " << buffer_ << endl;
-               cursor_.push(buffer_->inset());
+       if (!buffer_)
+               return;
+
+       LYXERR(Debug::INFO) << BOOST_CURRENT_FUNCTION
+                                       << "Buffer addr: " << buffer_ << endl;
+       cursor_.push(buffer_->inset());
+       cursor_.resetAnchor();
+       buffer_->text().setCurrentFont(cursor_);
+       if (buffer_->getCursor().size() > 0 &&
+                       buffer_->getAnchor().size() > 0)
+       {
+               cursor_.setCursor(buffer_->getAnchor().asDocIterator(&(buffer_->inset())));
                cursor_.resetAnchor();
-               buffer_->text().setCurrentFont(cursor_);
-               if (buffer_->getCursor().size() > 0 &&
-                   buffer_->getAnchor().size() > 0)
-               {
-                       cursor_.setCursor(buffer_->getAnchor().asDocIterator(&(buffer_->inset())));
-                       cursor_.resetAnchor();
-                       cursor_.setCursor(buffer_->getCursor().asDocIterator(&(buffer_->inset())));
-                       cursor_.setSelection();
-                       // do not set selection to the new buffer because we
-                       // only paste recent selection.
-               }
+               cursor_.setCursor(buffer_->getCursor().asDocIterator(&(buffer_->inset())));
+               cursor_.setSelection();
+               // do not set selection to the new buffer because we
+               // only paste recent selection.
+
+               // Make sure that the restored cursor is not broken. This can happen for
+               // example if this Buffer has been modified by another view.
+               cursor_.fixIfBroken();
        }
-
-       if (buffer_)
-               updateMetrics(false);    
-
-       if (buffer_ && graphics::Previews::status() != LyXRC::PREVIEW_OFF)
+       updateMetrics(false);
+       if (graphics::Previews::status() != LyXRC::PREVIEW_OFF)
                graphics::Previews::get().generateBufferPreviews(*buffer_);
 }
 
-
-bool BufferView::loadLyXFile(FileName const & filename, bool tolastfiles)
+// FIXME There is now no need for this to be in BufferView. It should all
+// be moved to buffer_func.cpp. (Abdel)
+Buffer * BufferView::loadLyXFile(FileName const & filename, bool auto_open)
 {
        // File already open?
        if (theBufferList().exists(filename.absFilename())) {
@@ -238,12 +247,13 @@ bool BufferView::loadLyXFile(FileName const & filename, bool tolastfiles)
                        text, 0, 1,  _("&Revert"), _("&Switch to document"));
 
                if (ret != 0) {
-                       setBuffer(theBufferList().getBuffer(filename.absFilename()));
-                       return true;
+      Buffer * buf = theBufferList().getBuffer(filename.absFilename());
+                       setBuffer(buf);
+                       return buf;
                }
                // FIXME: should be LFUN_REVERT
                if (!theBufferList().close(theBufferList().getBuffer(filename.absFilename()), false))
-                       return false;
+                       return 0;
                // Fall through to new load. (Asger)
                buffer_ = 0;
        }
@@ -254,7 +264,7 @@ bool BufferView::loadLyXFile(FileName const & filename, bool tolastfiles)
                b = theBufferList().newBuffer(filename.absFilename());
                if (!lyx::loadLyXFile(b, filename)) {
                        theBufferList().release(b);
-                       return false;
+                       return 0;
                }
        } else {
                docstring text = bformat(_("The document %1$s does not yet "
@@ -266,34 +276,15 @@ bool BufferView::loadLyXFile(FileName const & filename, bool tolastfiles)
                if (ret == 0) {
                        b = newFile(filename.absFilename(), string(), true);
                        if (!b)
-                               return false;
+                               return 0;
                } else
-                       return false;
+                       return 0;
        }
 
-       setBuffer(b);
-       // Send the "errors" signal in case of parsing errors
-       b->errors("Parse");
+  if (!auto_open)
+       setBuffer(b);
 
-       // 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);
-               // if successfully move to pit (returned par_id is not zero), update metrics and reset font
-               if (moveToPosition(pit, pos, 0, 0).get<1>()) {
-                       if (fitCursor())
-                               updateMetrics(false);
-                       buffer_->text().setCurrentFont(cursor_);
-               }
-       }
-
-       if (tolastfiles)
-               LyX::ref().session().lastFiles().add(FileName(b->fileName()));
-
-       return true;
+       return b;
 }
 
 
@@ -305,7 +296,6 @@ void BufferView::resize()
        LYXERR(Debug::DEBUG) << BOOST_CURRENT_FUNCTION << endl;
 
        updateMetrics(false);
-       switchKeyMap();
 }
 
 
@@ -376,7 +366,7 @@ bool BufferView::update(Update::flags flags)
                return true;
        }
 
-       if (flags == Update::FitCursor 
+       if (flags == Update::FitCursor
                || flags == (Update::Decoration | Update::FitCursor)) {
                bool const fit_cursor = fitCursor();
                // tell the frontend to update the screen if needed.
@@ -417,7 +407,7 @@ void BufferView::updateScrollbar()
                return;
        }
 
-       LyXText & t = buffer_->text();
+       Text & t = buffer_->text();
        TextMetrics & tm = text_metrics_[&t];
 
        int const parsize = int(t.paragraphs().size() - 1);
@@ -485,7 +475,7 @@ void BufferView::scrollDocView(int value)
        if (!buffer_)
                return;
 
-       LyXText & t = buffer_->text();
+       Text & t = buffer_->text();
        TextMetrics & tm = text_metrics_[&t];
 
        float const bar = value / float(wh_ * t.paragraphs().size());
@@ -506,7 +496,7 @@ void BufferView::setCursorFromScrollbar()
        if (!buffer_)
                return;
 
-       LyXText & t = buffer_->text();
+       Text & t = buffer_->text();
 
        int const height = 2 * defaultRowHeight();
        int const first = height;
@@ -555,7 +545,7 @@ void BufferView::saveBookmark(unsigned int idx)
 {
        // tenatively save bookmark, id and pos will be used to
        // acturately locate a bookmark in a 'live' lyx session.
-       // pit and pos will be updated with bottom level pit/pos 
+       // pit and pos will be updated with bottom level pit/pos
        // when lyx exits.
        LyX::ref().session().bookmarks().save(
                FileName(buffer_->fileName()),
@@ -583,12 +573,15 @@ boost::tuple<pit_type, pos_type, int> BufferView::moveToPosition(pit_type bottom
                ParIterator par = buffer_->getParFromID(top_id);
                if (par != buffer_->par_iterator_end()) {
                        DocIterator dit = makeDocIterator(par, min(par->size(), top_pos));
-                       // Some slices of the iterator may not be reachable (e.g. closed collapsable inset)
-                       // so the dociterator may need to be shortened. Otherwise, setCursor may
-                       // crash lyx when the cursor can not be set to these insets.
+                       // Some slices of the iterator may not be
+                       // reachable (e.g. closed collapsable inset)
+                       // so the dociterator may need to be
+                       // shortened. Otherwise, setCursor may crash
+                       // lyx when the cursor can not be set to these
+                       // insets.
                        size_t const n = dit.depth();
                        for (size_t i = 0; i < n; ++i)
-                               if (dit[i].inset().editable() != InsetBase::HIGHLY_EDITABLE) {
+                               if (dit[i].inset().editable() != Inset::HIGHLY_EDITABLE) {
                                        dit.resize(i);
                                        break;
                                }
@@ -598,38 +591,37 @@ boost::tuple<pit_type, pos_type, int> BufferView::moveToPosition(pit_type bottom
                }
        }
        // if top_id == 0, or searching through top_id failed
-       // This is the case for a 'restored' bookmark when only bottom 
+       // This is the case for a 'restored' bookmark when only bottom
        // (document level) pit was saved. Because of this, bookmark
        // restoration is inaccurate. If a bookmark was within an inset,
        // it will be restored to the left of the outmost inset that contains
        // the bookmark.
        if (static_cast<size_t>(bottom_pit) < buffer_->paragraphs().size()) {
-               ParIterator it = buffer_->par_iterator_begin();
-               ParIterator const end = buffer_->par_iterator_end();
-               for (; it != end; ++it)
-                       if (it.pit() == bottom_pit) {
-                               // restored pos may be bigger than it->size
-                               setCursor(makeDocIterator(it, min(bottom_pos, it->size())));
-                               return boost::make_tuple(bottom_pit, bottom_pos, it->id());
-                       }
+               DocIterator it = doc_iterator_begin(buffer_->inset());
+               it.pit() = bottom_pit;
+               it.pos() = min(bottom_pos, it.paragraph().size());
+               setCursor(it);
+               return boost::make_tuple(it.pit(), it.pos(),
+                                        it.paragraph().id());
        }
        // both methods fail
        return boost::make_tuple(pit_type(0), pos_type(0), 0);
 }
 
 
-void BufferView::switchKeyMap()
+void BufferView::translateAndInsert(char_type c, Text * t, Cursor & cur)
 {
-       if (!lyxrc.rtl_support)
-               return;
-
-       if (cursor_.innerText()->real_current_font.isRightToLeft()) {
-               if (intl_->keymap == Intl::PRIMARY)
-                       intl_->keyMapSec();
-       } else {
-               if (intl_->keymap == Intl::SECONDARY)
-                       intl_->keyMapPrim();
+       if (lyxrc.rtl_support) {
+               if (cursor_.innerText()->real_current_font.isRightToLeft()) {
+                       if (intl_->keymap == Intl::PRIMARY)
+                               intl_->keyMapSec();
+               } else {
+                       if (intl_->keymap == Intl::SECONDARY)
+                               intl_->keyMapPrim();
+               }
        }
+       
+       intl_->getTransManager().translateAndInsert(c, t, cur);
 }
 
 
@@ -656,6 +648,8 @@ FuncStatus BufferView::getStatus(FuncRequest const & cmd)
 {
        FuncStatus flag;
 
+       Cursor & cur = cursor_;
+
        switch (cmd.action) {
 
        case LFUN_UNDO:
@@ -668,8 +662,8 @@ FuncStatus BufferView::getStatus(FuncRequest const & cmd)
        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());
+               // FIXME: Actually, these LFUNS should be moved to Text
+               flag.enabled(cur.inTexted());
                break;
        case LFUN_FONT_STATE:
        case LFUN_LABEL_INSERT:
@@ -682,7 +676,6 @@ FuncStatus BufferView::getStatus(FuncRequest const & cmd)
        case LFUN_NOTE_NEXT:
        case LFUN_REFERENCE_NEXT:
        case LFUN_WORD_FIND:
-       case LFUN_WORD_REPLACE:
        case LFUN_MARK_OFF:
        case LFUN_MARK_ON:
        case LFUN_MARK_TOGGLE:
@@ -694,9 +687,13 @@ FuncStatus BufferView::getStatus(FuncRequest const & cmd)
                flag.enabled(true);
                break;
 
+       case LFUN_WORD_REPLACE:
+               flag.enabled(!cur.paragraph().isDeleted(cur.pos()));
+               break;
+
        case LFUN_LABEL_GOTO: {
                flag.enabled(!cmd.argument().empty()
-                   || getInsetByCode<InsetRef>(cursor_, InsetBase::REF_CODE));
+                   || getInsetByCode<InsetRef>(cur, Inset::REF_CODE));
                break;
        }
 
@@ -706,7 +703,7 @@ FuncStatus BufferView::getStatus(FuncRequest const & cmd)
                break;
 
        case LFUN_CHANGES_OUTPUT:
-               flag.enabled(buffer_ && LaTeXFeatures::isAvailable("dvipost"));
+               flag.enabled(buffer_);
                flag.setOnOff(buffer_->params().outputChanges);
                break;
 
@@ -765,7 +762,6 @@ Update::flags BufferView::dispatch(FuncRequest const & cmd)
                        cur.message(_("No further undo information"));
                        updateFlags = Update::None;
                }
-               switchKeyMap();
                break;
 
        case LFUN_REDO:
@@ -775,7 +771,6 @@ Update::flags BufferView::dispatch(FuncRequest const & cmd)
                        cur.message(_("No further redo information"));
                        updateFlags = Update::None;
                }
-               switchKeyMap();
                break;
 
        case LFUN_FILE_INSERT:
@@ -806,7 +801,7 @@ Update::flags BufferView::dispatch(FuncRequest const & cmd)
                if (label.empty()) {
                        InsetRef * inset =
                                getInsetByCode<InsetRef>(cursor_,
-                                                        InsetBase::REF_CODE);
+                                                        Inset::REF_CODE);
                        if (inset) {
                                label = inset->getParam("reference");
                                // persistent=false: use temp_bookmark
@@ -837,7 +832,6 @@ Update::flags BufferView::dispatch(FuncRequest const & cmd)
                                if (b == buffer_) {
                                        // Set the cursor
                                        setCursor(makeDocIterator(par, 0));
-                                       switchKeyMap();
                                } else {
                                        // Switch to other buffer view and resend cmd
                                        theLyXFunc().dispatch(FuncRequest(
@@ -872,13 +866,13 @@ Update::flags BufferView::dispatch(FuncRequest const & cmd)
                break;
 
        case LFUN_NOTE_NEXT:
-               bv_funcs::gotoInset(this, InsetBase::NOTE_CODE, false);
+               bv_funcs::gotoInset(this, Inset::NOTE_CODE, false);
                break;
 
        case LFUN_REFERENCE_NEXT: {
-               vector<InsetBase_code> tmp;
-               tmp.push_back(InsetBase::LABEL_CODE);
-               tmp.push_back(InsetBase::REF_CODE);
+               vector<Inset_code> tmp;
+               tmp.push_back(Inset::LABEL_CODE);
+               tmp.push_back(Inset::REF_CODE);
                bv_funcs::gotoInset(this, tmp, true);
                break;
        }
@@ -889,6 +883,25 @@ Update::flags BufferView::dispatch(FuncRequest const & cmd)
 
        case LFUN_CHANGES_OUTPUT:
                buffer_->params().outputChanges = !buffer_->params().outputChanges;
+               if (buffer_->params().outputChanges) {
+                       bool dvipost    = LaTeXFeatures::isAvailable("dvipost");
+                       bool xcolorsoul = LaTeXFeatures::isAvailable("soul") &&
+                                         LaTeXFeatures::isAvailable("xcolor");
+
+                       if (!dvipost && !xcolorsoul) {
+                               Alert::warning(_("Changes not shown in LaTeX output"),
+                                              _("Changes will not be highlighted in LaTeX output, "
+                                                "because neither dvipost nor xcolor/soul are installed.\n"
+                                                "Please install these packages or redefine "
+                                                "\\lyxadded and \\lyxdeleted in the LaTeX preamble."));
+                       } else if (!xcolorsoul) {
+                               Alert::warning(_("Changes not shown in LaTeX output"),
+                                              _("Changes will not be highlighted in LaTeX output "
+                                                "when using pdflatex, because xcolor and soul are not installed.\n"
+                                                "Please install both packages or redefine "
+                                                "\\lyxadded and \\lyxdeleted in the LaTeX preamble."));
+                       }
+               }
                break;
 
        case LFUN_CHANGE_NEXT:
@@ -906,7 +919,7 @@ Update::flags BufferView::dispatch(FuncRequest const & cmd)
                cursor_.selHandle(true);
                buffer_->text().cursorBottom(cursor_);
                // accept everything in a single step to support atomic undo
-               buffer_->text().acceptOrRejectChanges(cursor_, LyXText::ACCEPT);
+               buffer_->text().acceptOrRejectChanges(cursor_, Text::ACCEPT);
                break;
 
        case LFUN_ALL_CHANGES_REJECT:
@@ -916,7 +929,7 @@ Update::flags BufferView::dispatch(FuncRequest const & cmd)
                buffer_->text().cursorBottom(cursor_);
                // reject everything in a single step to support atomic undo
                // Note: reject does not work recursively; the user may have to repeat the operation
-               buffer_->text().acceptOrRejectChanges(cursor_, LyXText::REJECT);
+               buffer_->text().acceptOrRejectChanges(cursor_, Text::REJECT);
                break;
 
        case LFUN_WORD_FIND:
@@ -958,9 +971,9 @@ Update::flags BufferView::dispatch(FuncRequest const & cmd)
 
        case LFUN_BIBTEX_DATABASE_ADD: {
                Cursor tmpcur = cursor_;
-               bv_funcs::findInset(tmpcur, InsetBase::BIBTEX_CODE, false);
+               bv_funcs::findInset(tmpcur, Inset::BIBTEX_CODE, false);
                InsetBibtex * inset = getInsetByCode<InsetBibtex>(tmpcur,
-                                               InsetBase::BIBTEX_CODE);
+                                               Inset::BIBTEX_CODE);
                if (inset) {
                        if (inset->addDatabase(to_utf8(cmd.argument())))
                                buffer_->updateBibfilesCache();
@@ -970,9 +983,9 @@ Update::flags BufferView::dispatch(FuncRequest const & cmd)
 
        case LFUN_BIBTEX_DATABASE_DEL: {
                Cursor tmpcur = cursor_;
-               bv_funcs::findInset(tmpcur, InsetBase::BIBTEX_CODE, false);
+               bv_funcs::findInset(tmpcur, Inset::BIBTEX_CODE, false);
                InsetBibtex * inset = getInsetByCode<InsetBibtex>(tmpcur,
-                                               InsetBase::BIBTEX_CODE);
+                                               Inset::BIBTEX_CODE);
                if (inset) {
                        if (inset->delDatabase(to_utf8(cmd.argument())))
                                buffer_->updateBibfilesCache();
@@ -1020,7 +1033,7 @@ Update::flags BufferView::dispatch(FuncRequest const & cmd)
                FuncRequest tmpcmd = FuncRequest(LFUN_INSET_TOGGLE, cmd.origin);
                // if there is an inset at cursor, see whether it
                // wants to toggle.
-               InsetBase * inset = cur.nextInset();
+               Inset * inset = cur.nextInset();
                if (inset && inset->isActive()) {
                        Cursor tmpcur = cur;
                        tmpcur.pushLeft(*inset);
@@ -1102,7 +1115,7 @@ void BufferView::workAreaResize(int width, int height)
 }
 
 
-InsetBase const * BufferView::getCoveringInset(LyXText const & text, int x, int y)
+Inset const * BufferView::getCoveringInset(Text const & text, int x, int y)
 {
        pit_type pit = text.getPitNearY(*this, y);
        BOOST_ASSERT(pit != -1);
@@ -1117,20 +1130,20 @@ InsetBase const * BufferView::getCoveringInset(LyXText const & text, int x, int
        InsetList::const_iterator iit = par.insetlist.begin();
        InsetList::const_iterator iend = par.insetlist.end();
        for (; iit != iend; ++iit) {
-               InsetBase * const inset = iit->inset;
+               Inset * const inset = iit->inset;
                if (inset->covers(*this, x, y)) {
                        if (!inset->descendable())
-                               // No need to go further down if the inset is not 
+                               // No need to go further down if the inset is not
                                // descendable.
                                return inset;
 
                        size_t cell_number = inset->nargs();
                        // Check all the inner cell.
                        for (size_t i = 0; i != cell_number; ++i) {
-                               LyXText const * inner_text = inset->getText(i);
+                               Text const * inner_text = inset->getText(i);
                                if (inner_text) {
                                        // Try deeper.
-                                       InsetBase const * inset_deeper = 
+                                       Inset const * inset_deeper =
                                                getCoveringInset(*inner_text, x, y);
                                        if (inset_deeper)
                                                return inset_deeper;
@@ -1167,15 +1180,15 @@ bool BufferView::workAreaDispatch(FuncRequest const & cmd0)
        cur.selection() = cursor_.selection();
 
        // Either the inset under the cursor or the
-       // surrounding LyXText will handle this event.
+       // surrounding Text will handle this event.
 
        // make sure we stay within the screen...
        cmd.y = min(max(cmd.y, -1), height_);
-       
+
        if (cmd.action == LFUN_MOUSE_MOTION && cmd.button() == mouse_button::none) {
-               
+
                // Get inset under mouse, if there is one.
-               InsetBase const * covering_inset = 
+               Inset const * covering_inset =
                        getCoveringInset(buffer_->text(), cmd.x, cmd.y);
                if (covering_inset == last_inset_)
                        // Same inset, no need to do anything...
@@ -1183,7 +1196,7 @@ bool BufferView::workAreaDispatch(FuncRequest const & cmd0)
 
                bool need_redraw = false;
                // const_cast because of setMouseHover().
-               InsetBase * inset = const_cast<InsetBase *>(covering_inset);
+               Inset * inset = const_cast<Inset *>(covering_inset);
                if (last_inset_)
                        // Remove the hint on the last hovered inset (if any).
                        need_redraw |= last_inset_->setMouseHover(false);
@@ -1196,9 +1209,9 @@ 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 
+               if (need_redraw
                        && metrics_info_.update_strategy == SingleParUpdate) {
-                       // FIXME: It should be possible to redraw only the area around 
+                       // FIXME: It should be possible to redraw only the area around
                        // the button by doing this:
                        //
                        //metrics_info_.singlepar = false;
@@ -1209,7 +1222,7 @@ bool BufferView::workAreaDispatch(FuncRequest const & cmd0)
                        // between background updates and text updates. So we use the hammer
                        // solution for now. We could also avoid the updateMetrics() below
                        // by using the first and last pit of the CoordCache. Have a look
-                       // at LyXText::getPitNearY() to see what I mean.
+                       // at Text::getPitNearY() to see what I mean.
                        //
                        //metrics_info_.pit1 = first pit of CoordCache;
                        //metrics_info_.pit2 = last pit of CoordCache;
@@ -1224,9 +1237,9 @@ bool BufferView::workAreaDispatch(FuncRequest const & cmd0)
                // This should be changed if it is further utilized.
                return need_redraw;
        }
-       
+
        // Build temporary cursor.
-       InsetBase * inset = buffer_->text().editXY(cur, cmd.x, cmd.y);
+       Inset * inset = buffer_->text().editXY(cur, cmd.x, cmd.y);
 
        // Put anchor at the same position.
        cur.resetAnchor();
@@ -1257,7 +1270,7 @@ void BufferView::scroll(int /*lines*/)
 //     if (!buffer_)
 //             return;
 //
-//     LyXText const * t = &buffer_->text();
+//     Text const * t = &buffer_->text();
 //     int const line_height = defaultRowHeight();
 //
 //     // The new absolute coordinate
@@ -1300,24 +1313,24 @@ void BufferView::gotoLabel(docstring const & label)
 }
 
 
-TextMetrics const & BufferView::textMetrics(LyXText const * t) const
+TextMetrics const & BufferView::textMetrics(Text const * t) const
 {
        return const_cast<BufferView *>(this)->textMetrics(t);
 }
 
 
-TextMetrics & BufferView::textMetrics(LyXText const * t)
+TextMetrics & BufferView::textMetrics(Text const * t)
 {
        TextMetricsCache::iterator tmc_it  = text_metrics_.find(t);
        if (tmc_it == text_metrics_.end()) {
                tmc_it = text_metrics_.insert(
-                       make_pair(t, TextMetrics(this, const_cast<LyXText *>(t)))).first;
-       }       
+                       make_pair(t, TextMetrics(this, const_cast<Text *>(t)))).first;
+       }
        return tmc_it->second;
 }
 
 
-ParagraphMetrics const & BufferView::parMetrics(LyXText const * t,
+ParagraphMetrics const & BufferView::parMetrics(Text const * t,
                pit_type pit) const
 {
        return textMetrics(t).parMetrics(pit);
@@ -1353,7 +1366,7 @@ bool BufferView::checkDepm(Cursor & cur, Cursor & old)
 
        if (need_anchor_change)
                cur.resetAnchor();
-       
+
        if (!changed)
                return false;
 
@@ -1387,8 +1400,8 @@ bool BufferView::mouseSetCursor(Cursor & cur)
        // 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
+       // 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());
@@ -1401,6 +1414,7 @@ bool BufferView::mouseSetCursor(Cursor & cur)
        //lyxerr << "5 cur after" << dit <<std::endl;
 
        cursor_.setCursor(dit);
+       cursor_.boundary(cur.boundary());
        cursor_.clearSelection();
        finishUndo();
        return update;
@@ -1452,7 +1466,7 @@ ViewMetricsInfo const & BufferView::viewMetricsInfo()
 // FIXME: We should split-up updateMetrics() for the singlepar case.
 void BufferView::updateMetrics(bool singlepar)
 {
-       LyXText & buftext = buffer_->text();
+       Text & buftext = buffer_->text();
        TextMetrics & tm = textMetrics(&buftext);
        pit_type size = int(buftext.paragraphs().size());
 
@@ -1460,7 +1474,7 @@ void BufferView::updateMetrics(bool singlepar)
                anchor_ref_ = int(buftext.paragraphs().size() - 1);
                offset_ref_ = 0;
        }
-       
+
        // If the paragraph metrics has changed, we can not
        // use the singlepar optimisation.
        if (singlepar
@@ -1479,7 +1493,7 @@ void BufferView::updateMetrics(bool singlepar)
        // Rebreak anchor paragraph.
        if (!singlepar)
                tm.redoParagraph(pit);
-       
+
        // Clear out the position cache in case of full screen redraw.
        if (!singlepar)
                coord_cache_.clear();
@@ -1557,7 +1571,7 @@ void BufferView::updateMetrics(bool singlepar)
                << "size: " << size
                << endl;
 
-       metrics_info_ = ViewMetricsInfo(pit1, pit2, y1, y2, 
+       metrics_info_ = ViewMetricsInfo(pit1, pit2, y1, y2,
                singlepar? SingleParUpdate: FullScreenUpdate, size);
 
        if (lyxerr.debugging(Debug::WORKAREA)) {
@@ -1588,7 +1602,9 @@ void BufferView::menuInsertLyXFile(string const & filenm)
                FileDialog fileDlg(_("Select LyX document to insert"),
                        LFUN_FILE_INSERT,
                        make_pair(_("Documents|#o#O"), from_utf8(lyxrc.document_path)),
-                       make_pair(_("Examples|#E#e"), from_utf8(addPath(package().system_support().absFilename(), "examples"))));
+                       make_pair(_("Examples|#E#e"),
+                                   from_utf8(addPath(package().system_support().absFilename(),
+                                   "examples"))));
 
                FileDialog::Result result =
                        fileDlg.open(from_utf8(initpath),