]> git.lyx.org Git - features.git/blobdiff - src/Text3.cpp
Next runtime messages to be ommitted if compiled with clang using flag '-fsanitize'.
[features.git] / src / Text3.cpp
index ffc5d758dfaac80af426c07403a0e73d4de0a843..a87169b9344a4efefb20eb8950a0876802e425c8 100644 (file)
@@ -252,7 +252,7 @@ static bool doInsertInset(Cursor & cur, Text * text,
        cur.recordUndo();
        if (cmd.action() == LFUN_ARGUMENT_INSERT) {
                bool cotextinsert = false;
-               InsetArgument const * const ia = static_cast<InsetArgument const *>(inset);
+               InsetArgument * const ia = static_cast<InsetArgument *>(inset);
                Layout const & lay = cur.paragraph().layout();
                Layout::LaTeXArgMap args = lay.args();
                Layout::LaTeXArgMap::const_iterator const lait = args.find(ia->name());
@@ -275,6 +275,7 @@ static bool doInsertInset(Cursor & cur, Text * text,
                        else
                                ds = cur.paragraph().asString();
                        text->insertInset(cur, inset);
+                       ia->init(cur.paragraph());
                        if (edit)
                                inset->edit(cur, true);
                        // Now put co-text into inset
@@ -321,6 +322,11 @@ static bool doInsertInset(Cursor & cur, Text * text,
                inset_text->setOuterFont(cur.bv(), font.fontInfo());
        }
 
+       if (cmd.action() == LFUN_ARGUMENT_INSERT) {
+               InsetArgument * const ia = static_cast<InsetArgument *>(inset);
+               ia->init(cur.paragraph());
+       }
+
        if (edit)
                inset->edit(cur, true);
 
@@ -892,14 +898,12 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
        case LFUN_UP:
        case LFUN_DOWN: {
                // stop/start the selection
-               bool select = cmd.action() == LFUN_DOWN_SELECT ||
-                       cmd.action() == LFUN_UP_SELECT;
-
+               bool const select = cmd.action() == LFUN_DOWN_SELECT
+                                       || cmd.action() == LFUN_UP_SELECT;
                // move cursor up/down
-               bool up = cmd.action() == LFUN_UP_SELECT || cmd.action() == LFUN_UP;
-               bool const atFirstOrLastRow = cur.atFirstOrLastRow(up);
+               bool const up = cmd.action() == LFUN_UP_SELECT || cmd.action() == LFUN_UP;
 
-               if (!atFirstOrLastRow) {
+               if (!cur.atFirstOrLastRow(up)) {
                        needsUpdate |= cur.selHandle(select);
                        cur.upDownInText(up, needsUpdate);
                        needsUpdate |= cur.beforeDispatchCursor().inMathed();
@@ -915,13 +919,35 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                                        cur.forceBufferUpdate();
                                break;
                        }
+                       needsUpdate |= cur.selHandle(select);
+                       bool const can_move = cur.upDownInText(up, needsUpdate);
+                       // if the cursor can be moved up or down at an upper level,
+                       // delegate the dispatch to next level. Otherwise, we are
+                       // done.
+                       if (can_move) {
+                               cmd = FuncRequest(up ? LFUN_FINISHED_UP : LFUN_FINISHED_DOWN);
+                               cur.undispatched();
+                       }
+               }
 
-                       // if the cursor cannot be moved up or down do not remove
-                       // the selection right now, but wait for the next dispatch.
-                       if (select)
-                               needsUpdate |= cur.selHandle(select);
+               break;
+       }
+
+       case LFUN_FINISHED_UP:
+       case LFUN_FINISHED_DOWN: {
+               // move cursor up/down
+               bool const up = cmd.action() == LFUN_FINISHED_UP;
+
+               if (!cur.atFirstOrLastRow(up)) {
                        cur.upDownInText(up, needsUpdate);
-                       cur.undispatched();
+                       needsUpdate |= cur.beforeDispatchCursor().inMathed();
+               } else {
+                       bool const can_move = cur.upDownInText(up, needsUpdate);
+                       // if the cursor can be moved up or down and we are not
+                       // moving cusor at top level, wait for the next dispatch.
+                       // Otherwise, we are done.
+                       if (can_move)
+                               cur.undispatched();
                }
 
                break;
@@ -1495,7 +1521,8 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                                pasteFromStack(cur, bv->buffer().errorList("Paste"), 0);
                        else if (theClipboard().hasTextContents()) {
                                if (pasteClipboardText(cur, bv->buffer().errorList("Paste"),
-                                                      true, Clipboard::AnyTextType))
+                                                      !cur.paragraph().parbreakIsNewline(),
+                                                          Clipboard::AnyTextType))
                                        tryGraphics = false;
                        }
                        if (tryGraphics && theClipboard().hasGraphicsContents())
@@ -2735,13 +2762,8 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                        cur.recordUndoBufferParams();
                        bv->buffer().params().spellignore().push_back(wl);
                        cur.recordUndo();
-                       // trigger re-check
-                       WordLangTuple wl;
-                       docstring_list suggestions;
-                       Paragraph const & par = cur.paragraph();
-                       pos_type from = cur.pos();
-                       pos_type to = from;
-                       par.spellCheck(from, to, wl, suggestions, true, true);
+                       // trigger re-check of whole buffer
+                       bv->buffer().requestSpellcheck();
                }
                break;
        }
@@ -2774,13 +2796,8 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                        cur.recordUndoBufferParams();
                        bv->buffer().params().spellignore().erase(it);
                        cur.recordUndo();
-                       // trigger re-check
-                       WordLangTuple wl;
-                       docstring_list suggestions;
-                       Paragraph const & par = cur.paragraph();
-                       pos_type from = cur.pos();
-                       pos_type to = from;
-                       par.spellCheck(from, to, wl, suggestions, true, true);
+                       // trigger re-check of whole buffer
+                       bv->buffer().requestSpellcheck();
                }
                break;
        }
@@ -3413,6 +3430,7 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
                break;
 
        case LFUN_PRIMARY_SELECTION_PASTE:
+               status.setUnknown(!theSelection().supported());
                enable = cur.selection() || !theSelection().empty();
                break;