]> git.lyx.org Git - lyx.git/blobdiff - src/Text3.cpp
Tooltips for collapsables and branches
[lyx.git] / src / Text3.cpp
index 0c7c759c8fd593b4d6d79ea2c502bcbfab2d4761..40cf65b70251cb5059ad052ad13235c18adb61a8 100644 (file)
 #include "BufferView.h"
 #include "Cursor.h"
 #include "CutAndPaste.h"
-#include "support/debug.h"
 #include "DispatchResult.h"
 #include "ErrorList.h"
 #include "factory.h"
 #include "FuncRequest.h"
-#include "support/gettext.h"
 #include "InsetList.h"
 #include "Intl.h"
 #include "Language.h"
@@ -44,7 +42,6 @@
 #include "Paragraph.h"
 #include "paragraph_funcs.h"
 #include "ParagraphParameters.h"
-#include "ParIterator.h"
 #include "TextClass.h"
 #include "TextMetrics.h"
 #include "VSpace.h"
 #include "insets/InsetText.h"
 #include "insets/InsetInfo.h"
 
-#include "support/lstrings.h"
 #include "support/convert.h"
+#include "support/debug.h"
+#include "support/gettext.h"
+#include "support/lstrings.h"
 #include "support/lyxtime.h"
 
 #include "mathed/InsetMathHull.h"
@@ -198,42 +197,44 @@ static bool doInsertInset(Cursor & cur, Text * text,
                        inset->edit(cur, true);
                // Now put this into inset
                static_cast<InsetCollapsable *>(inset)->text_.insertStringAsParagraphs(cur, ds);
-       } else {
-               bool gotsel = false;
-               if (cur.selection()) {
-                       lyx::dispatch(FuncRequest(LFUN_CUT));
-                       gotsel = true;
-               }
-               text->insertInset(cur, inset);
+               return true;
+       }
 
-               if (edit)
-                       inset->edit(cur, true);
+       bool gotsel = false;
+       if (cur.selection()) {
+               lyx::dispatch(FuncRequest(LFUN_CUT));
+               gotsel = true;
+       }
+       text->insertInset(cur, inset);
 
-               if (gotsel && pastesel) {
-                       lyx::dispatch(FuncRequest(LFUN_PASTE, "0"));
-                       InsetText * insetText = dynamic_cast<InsetText *>(inset);
-                       if (insetText && !insetText->allowMultiPar() 
-                           || cur.lastpit() == 0) {
-                               // reset first par to default
-                               LayoutPtr const layout =
-                                       cur.buffer().params().getTextClass().defaultLayout();
-                               cur.text()->paragraphs().begin()->layout(layout);
-                               cur.pos() = 0;
-                               cur.pit() = 0;
-                               // Merge multiple paragraphs -- hack
-                               while (cur.lastpit() > 0) {
-                                       mergeParagraph(cur.buffer().params(),
-                                               cur.text()->paragraphs(), 0);
-                               }
-                       } else {
-                               // reset surrounding par to default
-                               docstring const layoutname = 
-                                       cur.buffer().params().getTextClass().defaultLayoutName();
-                               cur.leaveInset(*inset);
-                               text->setLayout(cur, layoutname);
+       if (edit)
+               inset->edit(cur, true);
+
+       if (!gotsel || !pastesel)
+               return true;
+
+       lyx::dispatch(FuncRequest(LFUN_PASTE, "0"));
+       InsetText * insetText = dynamic_cast<InsetText *>(inset);
+       if (insetText && !insetText->allowMultiPar() || cur.lastpit() == 0) {
+                       // reset first par to default
+                       LayoutPtr const layout =
+                               cur.buffer().params().getTextClass().defaultLayout();
+                       cur.text()->paragraphs().begin()->layout(layout);
+                       cur.pos() = 0;
+                       cur.pit() = 0;
+                       // Merge multiple paragraphs -- hack
+                       while (cur.lastpit() > 0) {
+                               mergeParagraph(cur.buffer().params(),
+                                       cur.text()->paragraphs(), 0);
                        }
-               }
+       } else {
+               // reset surrounding par to default
+               docstring const layoutname = 
+                       cur.buffer().params().getTextClass().defaultLayoutName();
+               cur.leaveInset(*inset);
+               text->setLayout(cur, layoutname);
        }
+
        return true;
 }
 
@@ -530,29 +531,50 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
 
        case LFUN_CHAR_LEFT:
        case LFUN_CHAR_LEFT_SELECT:
-               //FIXME: for visual cursor, really move left
-               if (reverseDirectionNeeded(cur)) {
-                       cmd.action = cmd.action == LFUN_CHAR_LEFT_SELECT ? 
-                                       LFUN_CHAR_FORWARD_SELECT : LFUN_CHAR_FORWARD;
+               if (lyxrc.visual_cursor) {
+                       needsUpdate |= cur.selHandle(cmd.action == LFUN_CHAR_LEFT_SELECT);
+                       needsUpdate |= cursorVisLeft(cur);
+                       if (!needsUpdate && oldTopSlice == cur.top()
+                                       && cur.boundary() == oldBoundary) {
+                               cur.undispatched();
+                               cmd = FuncRequest(LFUN_FINISHED_LEFT);
+                       }
                } else {
-                       cmd.action = cmd.action == LFUN_CHAR_LEFT_SELECT ? 
+                       if (reverseDirectionNeeded(cur)) {
+                               cmd.action = cmd.action == LFUN_CHAR_LEFT_SELECT ? 
+                                       LFUN_CHAR_FORWARD_SELECT : LFUN_CHAR_FORWARD;
+                       } else {
+                               cmd.action = cmd.action == LFUN_CHAR_LEFT_SELECT ? 
                                        LFUN_CHAR_BACKWARD_SELECT : LFUN_CHAR_BACKWARD;
+                       }
+                       dispatch(cur, cmd);
+                       return;
                }
-               dispatch(cur, cmd);
-               return;
+               break;
 
        case LFUN_CHAR_RIGHT:
        case LFUN_CHAR_RIGHT_SELECT:
-               //FIXME: for visual cursor, really move right
-               if (reverseDirectionNeeded(cur)) {
-                       cmd.action = cmd.action == LFUN_CHAR_RIGHT_SELECT ? 
-                                       LFUN_CHAR_BACKWARD_SELECT : LFUN_CHAR_BACKWARD;
+               if (lyxrc.visual_cursor) {
+                       needsUpdate |= cur.selHandle(cmd.action == LFUN_CHAR_RIGHT_SELECT);
+                       needsUpdate |= cursorVisRight(cur);
+                       if (!needsUpdate && oldTopSlice == cur.top()
+                                       && cur.boundary() == oldBoundary) {
+                               cur.undispatched();
+                               cmd = FuncRequest(LFUN_FINISHED_RIGHT);
+                       }
                } else {
-                       cmd.action = cmd.action == LFUN_CHAR_RIGHT_SELECT ? 
+                       if (reverseDirectionNeeded(cur)) {
+                               cmd.action = cmd.action == LFUN_CHAR_RIGHT_SELECT ? 
+                                       LFUN_CHAR_BACKWARD_SELECT : LFUN_CHAR_BACKWARD;
+                       } else {
+                               cmd.action = cmd.action == LFUN_CHAR_RIGHT_SELECT ? 
                                        LFUN_CHAR_FORWARD_SELECT : LFUN_CHAR_FORWARD;
+                       }
+                       dispatch(cur, cmd);
+                       return;
                }
-               dispatch(cur, cmd);
-               return;
+               break;
+               
 
        case LFUN_UP_SELECT:
        case LFUN_DOWN_SELECT:
@@ -1581,18 +1603,24 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
 
        case LFUN_FINISHED_LEFT:
                LYXERR(Debug::DEBUG, "handle LFUN_FINISHED_LEFT:\n" << cur);
-               if (reverseDirectionNeeded(cur)) {
-                       ++cur.pos();
-                       cur.setCurrentFont();
-               }
+               // We're leaving an inset, going left. If the inset is LTR, we're 
+               // leaving from the front, so we should not move (remain at --- but
+               // not in --- the inset). If the inset is RTL, move left, without 
+               // entering the inset itself; i.e., move to after the inset.
+               if (cur.paragraph().getFontSettings(
+                               cur.bv().buffer().params(), cur.pos()).isRightToLeft())
+                       cursorVisLeft(cur, true);
                break;
 
        case LFUN_FINISHED_RIGHT:
                LYXERR(Debug::DEBUG, "handle LFUN_FINISHED_RIGHT:\n" << cur);
-               if (!reverseDirectionNeeded(cur)) {
-                       ++cur.pos();
-                       cur.setCurrentFont();
-               }
+               // We're leaving an inset, going right. If the inset is RTL, we're 
+               // leaving from the front, so we should not move (remain at --- but
+               // not in --- the inset). If the inset is LTR, move right, without 
+               // entering the inset itself; i.e., move to after the inset.
+               if (!cur.paragraph().getFontSettings(
+                               cur.bv().buffer().params(), cur.pos()).isRightToLeft())
+                       cursorVisRight(cur, true);
                break;
 
        case LFUN_FINISHED_BACKWARD: