]> git.lyx.org Git - lyx.git/blobdiff - src/BufferView.cpp
EmbeddedObjects.lyx: add hint how to force a rotation direction for rotated floats
[lyx.git] / src / BufferView.cpp
index 3fdfd2b6dbdda9eab98bc2738af6e0186ebeb51f..3ee75cffdce1745ab82783a2997195fc59731ea7 100644 (file)
@@ -208,9 +208,9 @@ void BufferView::setBuffer(Buffer * b)
 
        if (!buffer_)
                return;
-       
+
                LYXERR(Debug::INFO) << BOOST_CURRENT_FUNCTION
-                                   << "Buffer addr: " << buffer_ << endl;
+                                   << "Buffer addr: " << buffer_ << endl;
                cursor_.push(buffer_->inset());
                cursor_.resetAnchor();
                buffer_->text().setCurrentFont(cursor_);
@@ -228,7 +228,7 @@ void BufferView::setBuffer(Buffer * b)
                        // example if this Buffer has been modified by another view.
                        cursor_.fixIfBroken();
                }
-               updateMetrics(false);    
+               updateMetrics(false);
        if (graphics::Previews::status() != LyXRC::PREVIEW_OFF)
                graphics::Previews::get().generateBufferPreviews(*buffer_);
 }
@@ -313,7 +313,6 @@ void BufferView::resize()
        LYXERR(Debug::DEBUG) << BOOST_CURRENT_FUNCTION << endl;
 
        updateMetrics(false);
-       switchKeyMap();
 }
 
 
@@ -384,7 +383,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.
@@ -563,7 +562,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()),
@@ -609,7 +608,7 @@ 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
@@ -619,7 +618,7 @@ boost::tuple<pit_type, pos_type, int> BufferView::moveToPosition(pit_type bottom
                it.pit() = bottom_pit;
                it.pos() = min(bottom_pos, it.paragraph().size());
                setCursor(it);
-               return boost::make_tuple(it.pit(), it.pos(), 
+               return boost::make_tuple(it.pit(), it.pos(),
                                         it.paragraph().id());
        }
        // both methods fail
@@ -627,18 +626,19 @@ boost::tuple<pit_type, pos_type, int> BufferView::moveToPosition(pit_type bottom
 }
 
 
-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);
 }
 
 
@@ -665,6 +665,8 @@ FuncStatus BufferView::getStatus(FuncRequest const & cmd)
 {
        FuncStatus flag;
 
+       Cursor & cur = cursor_;
+
        switch (cmd.action) {
 
        case LFUN_UNDO:
@@ -678,7 +680,7 @@ FuncStatus BufferView::getStatus(FuncRequest const & cmd)
        case LFUN_FILE_INSERT_PLAINTEXT:
        case LFUN_BOOKMARK_SAVE:
                // FIXME: Actually, these LFUNS should be moved to Text
-               flag.enabled(cursor_.inTexted());
+               flag.enabled(cur.inTexted());
                break;
        case LFUN_FONT_STATE:
        case LFUN_LABEL_INSERT:
@@ -691,7 +693,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:
@@ -703,9 +704,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_, Inset::REF_CODE));
+                   || getInsetByCode<InsetRef>(cur, Inset::REF_CODE));
                break;
        }
 
@@ -774,7 +779,6 @@ Update::flags BufferView::dispatch(FuncRequest const & cmd)
                        cur.message(_("No further undo information"));
                        updateFlags = Update::None;
                }
-               switchKeyMap();
                break;
 
        case LFUN_REDO:
@@ -784,7 +788,6 @@ Update::flags BufferView::dispatch(FuncRequest const & cmd)
                        cur.message(_("No further redo information"));
                        updateFlags = Update::None;
                }
-               switchKeyMap();
                break;
 
        case LFUN_FILE_INSERT:
@@ -846,7 +849,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(
@@ -901,20 +903,20 @@ Update::flags BufferView::dispatch(FuncRequest const & cmd)
                if (buffer_->params().outputChanges) {
                        bool dvipost    = LaTeXFeatures::isAvailable("dvipost");
                        bool xcolorsoul = LaTeXFeatures::isAvailable("soul") &&
-                                         LaTeXFeatures::isAvailable("xcolor");
-               
+                                         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."));
+                                              _("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."));
+                                              _("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;
@@ -1148,7 +1150,7 @@ Inset const * BufferView::getCoveringInset(Text const & text, int x, int y)
                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;
 
@@ -1158,7 +1160,7 @@ Inset const * BufferView::getCoveringInset(Text const & text, int x, int y)
                                Text const * inner_text = inset->getText(i);
                                if (inner_text) {
                                        // Try deeper.
-                                       Inset const * inset_deeper = 
+                                       Inset const * inset_deeper =
                                                getCoveringInset(*inner_text, x, y);
                                        if (inset_deeper)
                                                return inset_deeper;
@@ -1199,11 +1201,11 @@ bool BufferView::workAreaDispatch(FuncRequest const & cmd0)
 
        // 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.
-               Inset 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...
@@ -1224,9 +1226,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;
@@ -1252,7 +1254,7 @@ bool BufferView::workAreaDispatch(FuncRequest const & cmd0)
                // This should be changed if it is further utilized.
                return need_redraw;
        }
-       
+
        // Build temporary cursor.
        Inset * inset = buffer_->text().editXY(cur, cmd.x, cmd.y);
 
@@ -1340,7 +1342,7 @@ TextMetrics & BufferView::textMetrics(Text const * t)
        if (tmc_it == text_metrics_.end()) {
                tmc_it = text_metrics_.insert(
                        make_pair(t, TextMetrics(this, const_cast<Text *>(t)))).first;
-       }       
+       }
        return tmc_it->second;
 }
 
@@ -1381,7 +1383,7 @@ bool BufferView::checkDepm(Cursor & cur, Cursor & old)
 
        if (need_anchor_change)
                cur.resetAnchor();
-       
+
        if (!changed)
                return false;
 
@@ -1415,8 +1417,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());
@@ -1429,6 +1431,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;
@@ -1488,7 +1491,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
@@ -1507,7 +1510,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();
@@ -1585,7 +1588,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)) {
@@ -1616,7 +1619,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),