]> git.lyx.org Git - features.git/blobdiff - src/Text3.cpp
Always remove selection after cursor left/right
[features.git] / src / Text3.cpp
index 5c623fec9e54fabf053004ba0d9b2fc80bba528f..ffc5d758dfaac80af426c07403a0e73d4de0a843 100644 (file)
@@ -313,6 +313,14 @@ static bool doInsertInset(Cursor & cur, Text * text,
        }
        text->insertInset(cur, inset);
 
+       InsetText * inset_text = inset->asInsetText();
+       if (inset_text) {
+               Font const & font = inset->inheritFont()
+                       ? cur.bv().textMetrics(text).displayFont(cur.pit(), cur.pos())
+                       : buffer.params().getFont();
+               inset_text->setOuterFont(cur.bv(), font.fontInfo());
+       }
+
        if (edit)
                inset->edit(cur, true);
 
@@ -323,7 +331,6 @@ static bool doInsertInset(Cursor & cur, Text * text,
        cur.buffer()->errors("Paste");
        cur.clearSelection(); // bug 393
        cur.finishUndo();
-       InsetText * inset_text = inset->asInsetText();
        if (inset_text) {
                inset_text->fixParagraphsFont();
                cur.pos() = 0;
@@ -787,24 +794,20 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                bool const cur_moved = cursorForward(cur);
                needsUpdate |= cur_moved;
 
-               if (!cur_moved && oldTopSlice == cur.top()
-                              && cur.boundary() == oldBoundary) {
+               if (!cur_moved && cur.depth() > 1
+                    && oldTopSlice == cur.top() && cur.boundary() == oldBoundary) {
                        cur.undispatched();
                        cmd = FuncRequest(LFUN_FINISHED_FORWARD);
 
-                       // we will probably be moving out the inset, so we should execute
-                       // the depm-mechanism, but only when the cursor has a place to
-                       // go outside this inset, i.e. in a slice above.
-                       if (cur.depth() > 1 && cur.pos() == cur.lastpos()
-                                 && cur.pit() == cur.lastpit()) {
-                               // The cursor hasn't changed yet. To give the
-                               // DEPM the possibility of doing something we must
-                               // provide it with two different cursors.
-                               Cursor dummy = cur;
-                               dummy.pos() = dummy.pit() = 0;
-                               if (cur.bv().checkDepm(dummy, cur))
-                                       cur.forceBufferUpdate();
-                       }
+                       // we will be moving out the inset, so we should execute
+                       // the depm-mechanism.
+                       // The cursor hasn't changed yet. To give the DEPM the
+                       // possibility of doing something we must provide it with
+                       // two different cursors.
+                       Cursor dummy = cur;
+                       dummy.pos() = dummy.pit() = 0;
+                       if (cur.bv().checkDepm(dummy, cur))
+                               cur.forceBufferUpdate();
                }
                break;
        }
@@ -816,24 +819,21 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                bool const cur_moved = cursorBackward(cur);
                needsUpdate |= cur_moved;
 
-               if (!cur_moved && oldTopSlice == cur.top()
-                              && cur.boundary() == oldBoundary) {
+               if (!cur_moved && cur.depth() > 1
+                    && oldTopSlice == cur.top() && cur.boundary() == oldBoundary) {
                        cur.undispatched();
                        cmd = FuncRequest(LFUN_FINISHED_BACKWARD);
 
-                       // we will probably be moving out the inset, so we should execute
-                       // the depm-mechanism, but only when the cursor has a place to
-                       // go outside this inset, i.e. in a slice above.
-                       if (cur.depth() > 1 && cur.pos() == 0 && cur.pit() == 0) {
-                               // The cursor hasn't changed yet. To give the
-                               // DEPM the possibility of doing something we must
-                               // provide it with two different cursors.
-                               Cursor dummy = cur;
-                               dummy.pos() = cur.lastpos();
-                               dummy.pit() = cur.lastpit();
-                               if (cur.bv().checkDepm(dummy, cur))
-                                       cur.forceBufferUpdate();
-                       }
+                       // we will be moving out the inset, so we should execute
+                       // the depm-mechanism.
+                       // The cursor hasn't changed yet. To give the DEPM the
+                       // possibility of doing something we must provide it with
+                       // two different cursors.
+                       Cursor dummy = cur;
+                       dummy.pos() = cur.lastpos();
+                       dummy.pit() = cur.lastpit();
+                       if (cur.bv().checkDepm(dummy, cur))
+                               cur.forceBufferUpdate();
                }
                break;
        }
@@ -844,8 +844,8 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                        needsUpdate |= cur.selHandle(act == LFUN_CHAR_LEFT_SELECT);
                        bool const cur_moved = cursorVisLeft(cur);
                        needsUpdate |= cur_moved;
-                       if (!cur_moved && oldTopSlice == cur.top()
-                                      && cur.boundary() == oldBoundary) {
+                       if (!cur_moved && cur.depth() > 1
+                            && oldTopSlice == cur.top() && cur.boundary() == oldBoundary) {
                                cur.undispatched();
                                cmd = FuncRequest(LFUN_FINISHED_LEFT);
                        }
@@ -868,8 +868,8 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                        needsUpdate |= cur.selHandle(cmd.action() == LFUN_CHAR_RIGHT_SELECT);
                        bool const cur_moved = cursorVisRight(cur);
                        needsUpdate |= cur_moved;
-                       if (!cur_moved && oldTopSlice == cur.top()
-                                      && cur.boundary() == oldBoundary) {
+                       if (!cur_moved && cur.depth() > 1
+                            && oldTopSlice == cur.top() && cur.boundary() == oldBoundary) {
                                cur.undispatched();
                                cmd = FuncRequest(LFUN_FINISHED_RIGHT);
                        }
@@ -1002,8 +1002,8 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                        needsUpdate |= cur.selHandle(cmd.action() == LFUN_WORD_RIGHT_SELECT);
                        bool const cur_moved = cursorVisRightOneWord(cur);
                        needsUpdate |= cur_moved;
-                       if (!cur_moved && oldTopSlice == cur.top()
-                                      && cur.boundary() == oldBoundary) {
+                       if (!cur_moved && cur.depth() > 1
+                            && oldTopSlice == cur.top() && cur.boundary() == oldBoundary) {
                                cur.undispatched();
                                cmd = FuncRequest(LFUN_FINISHED_RIGHT);
                        }
@@ -1026,24 +1026,20 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                bool const cur_moved = cursorForwardOneWord(cur);
                needsUpdate |= cur_moved;
 
-               if (!cur_moved && oldTopSlice == cur.top()
-                              && cur.boundary() == oldBoundary) {
+               if (!cur_moved && cur.depth() > 1
+                    && oldTopSlice == cur.top() && cur.boundary() == oldBoundary) {
                        cur.undispatched();
                        cmd = FuncRequest(LFUN_FINISHED_FORWARD);
 
-                       // we will probably be moving out the inset, so we should execute
-                       // the depm-mechanism, but only when the cursor has a place to
-                       // go outside this inset, i.e. in a slice above.
-                       if (cur.depth() > 1 && cur.pos() == cur.lastpos()
-                                 && cur.pit() == cur.lastpit()) {
-                               // The cursor hasn't changed yet. To give the
-                               // DEPM the possibility of doing something we must
-                               // provide it with two different cursors.
-                               Cursor dummy = cur;
-                               dummy.pos() = dummy.pit() = 0;
-                               if (cur.bv().checkDepm(dummy, cur))
-                                       cur.forceBufferUpdate();
-                       }
+                       // we will be moving out the inset, so we should execute
+                       // the depm-mechanism.
+                       // The cursor hasn't changed yet. To give the DEPM the
+                       // possibility of doing something we must provide it with
+                       // two different cursors.
+                       Cursor dummy = cur;
+                       dummy.pos() = dummy.pit() = 0;
+                       if (cur.bv().checkDepm(dummy, cur))
+                               cur.forceBufferUpdate();
                }
                break;
        }
@@ -1054,8 +1050,8 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                        needsUpdate |= cur.selHandle(cmd.action() == LFUN_WORD_LEFT_SELECT);
                        bool const cur_moved = cursorVisLeftOneWord(cur);
                        needsUpdate |= cur_moved;
-                       if (!cur_moved && oldTopSlice == cur.top()
-                                      && cur.boundary() == oldBoundary) {
+                       if (!cur_moved && cur.depth() > 1
+                            && oldTopSlice == cur.top() && cur.boundary() == oldBoundary) {
                                cur.undispatched();
                                cmd = FuncRequest(LFUN_FINISHED_LEFT);
                        }
@@ -1078,25 +1074,21 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                bool const cur_moved = cursorBackwardOneWord(cur);
                needsUpdate |= cur_moved;
 
-               if (!cur_moved && oldTopSlice == cur.top()
-                              && cur.boundary() == oldBoundary) {
+               if (!cur_moved && cur.depth() > 1
+                    && oldTopSlice == cur.top() && cur.boundary() == oldBoundary) {
                        cur.undispatched();
                        cmd = FuncRequest(LFUN_FINISHED_BACKWARD);
 
-                       // we will probably be moving out the inset, so we should execute
-                       // the depm-mechanism, but only when the cursor has a place to
-                       // go outside this inset, i.e. in a slice above.
-                       if (cur.depth() > 1 && cur.pos() == 0
-                                 && cur.pit() == 0) {
-                               // The cursor hasn't changed yet. To give the
-                               // DEPM the possibility of doing something we must
-                               // provide it with two different cursors.
-                               Cursor dummy = cur;
-                               dummy.pos() = cur.lastpos();
-                               dummy.pit() = cur.lastpit();
-                               if (cur.bv().checkDepm(dummy, cur))
-                                       cur.forceBufferUpdate();
-                       }
+                       // we will be moving out the inset, so we should execute
+                       // the depm-mechanism.
+                       // The cursor hasn't changed yet. To give the DEPM the
+                       // possibility of doing something we must provide it with
+                       // two different cursors.
+                       Cursor dummy = cur;
+                       dummy.pos() = cur.lastpos();
+                       dummy.pit() = cur.lastpit();
+                       if (cur.bv().checkDepm(dummy, cur))
+                               cur.forceBufferUpdate();
                }
                break;
        }
@@ -2083,12 +2075,6 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                // inside it.
                doInsertInset(cur, this, cmd, true, true);
                cur.posForward();
-               /* The font of the inset is computed in metrics(), and this is
-                * used to compute the height of the caret (because the font
-                * is stored in TextMetrics::font_). When we insert, we have
-                * to make sure that metrics are computed so that the caret
-                * height is correct. Arguably, this is hackish.*/
-               bv->processUpdateFlags(Update::SinglePar);
                cur.setCurrentFont();
                // Some insets are numbered, others are shown in the outline pane so
                // let's update the labels and the toc backend.
@@ -2732,6 +2718,35 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
        }
 
        case LFUN_SPELLING_ADD_LOCAL: {
+               Language const * language = getLanguage(cur, cmd.getArg(1));
+               docstring word = from_utf8(cmd.getArg(0));
+               if (word.empty()) {
+                       word = cur.selectionAsString(false);
+                       if (word.size() > 100)
+                               break;
+                       if (word.empty()) {
+                               // Get word or selection
+                               selectWordWhenUnderCursor(cur, WHOLE_WORD);
+                               word = cur.selectionAsString(false);
+                       }
+               }
+               WordLangTuple wl(word, language);
+               if (!bv->buffer().params().spellignored(wl)) {
+                       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);
+               }
+               break;
+       }
+
+       case LFUN_SPELLING_REMOVE_LOCAL: {
                Language const * language = getLanguage(cur, cmd.getArg(1));
                docstring word = from_utf8(cmd.getArg(0));
                if (word.empty()) {
@@ -2746,9 +2761,8 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                }
                WordLangTuple wl(word, language);
                bool has_item = false;
-               vector<WordLangTuple> il = bv->buffer().params().spellignore();
-               vector<WordLangTuple>::const_iterator it = il.begin();
-               for (; it != il.end(); ++it) {
+               vector<WordLangTuple>::const_iterator it = bv->buffer().params().spellignore().begin();
+               for (; it != bv->buffer().params().spellignore().end(); ++it) {
                        if (it->lang()->code() != wl.lang()->code())
                                continue;
                        if (it->word() == wl.word()) {
@@ -2756,9 +2770,9 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                                break;
                        }
                }
-               if (!has_item) {
+               if (has_item) {
                        cur.recordUndoBufferParams();
-                       bv->buffer().params().spellignore().push_back(wl);
+                       bv->buffer().params().spellignore().erase(it);
                        cur.recordUndo();
                        // trigger re-check
                        WordLangTuple wl;
@@ -2770,7 +2784,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                }
                break;
        }
-       
+
 
        case LFUN_SPELLING_IGNORE: {
                Language const * language = getLanguage(cur, cmd.getArg(1));
@@ -2998,6 +3012,8 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
                        code = BRANCH_CODE;
                else if (cmd.argument() == "citation")
                        code = CITE_CODE;
+               else if (cmd.argument() == "counter")
+                       code = COUNTER_CODE;
                else if (cmd.argument() == "ert")
                        code = ERT_CODE;
                else if (cmd.argument() == "external")
@@ -3502,6 +3518,7 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
 
        case LFUN_SPELLING_ADD:
        case LFUN_SPELLING_ADD_LOCAL:
+       case LFUN_SPELLING_REMOVE_LOCAL:
        case LFUN_SPELLING_IGNORE:
        case LFUN_SPELLING_REMOVE:
                enable = theSpellChecker() != nullptr;
@@ -3519,7 +3536,7 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
                docstring const layout = resolveLayout(req_layout, cur);
 
                enable = !owner_->forcePlainLayout() && !layout.empty();
-               status.setOnOff(isAlreadyLayout(layout, cur));
+               status.setOnOff(!owner_->forcePlainLayout() && isAlreadyLayout(layout, cur));
                break;
        }