]> git.lyx.org Git - lyx.git/blobdiff - src/Text3.cpp
Buffer: Rename function names:
[lyx.git] / src / Text3.cpp
index e9c08f403e12b08cd30c051fed0395cab7ab39fb..c132531bb7c5a738f54475d90b3ca584364823e7 100644 (file)
@@ -464,7 +464,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
        // FIXME: We use the update flag to indicates wether a singlePar or a
        // full screen update is needed. We reset it here but shall we restore it
        // at the end?
-       cur.noUpdate();
+       cur.noScreenUpdate();
 
        LASSERT(cur.text() == this, /**/);
        CursorSlice oldTopSlice = cur.top();
@@ -486,8 +486,8 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                recUndo(cur, pit, pit + 1);
                cur.finishUndo();
                pars_.swap(pit, pit + 1);
-               cur.buffer()->updateBuffer();
                needsUpdate = true;
+               cur.forceBufferUpdate();
                ++cur.pit();
                break;
        }
@@ -497,9 +497,9 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                recUndo(cur, pit - 1, pit);
                cur.finishUndo();
                pars_.swap(pit, pit - 1);
-               cur.buffer()->updateBuffer();
                --cur.pit();
                needsUpdate = true;
+               cur.forceBufferUpdate();
                break;
        }
 
@@ -523,7 +523,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                par.params().startOfAppendix(start);
 
                // we can set the refreshing parameters now
-               cur.buffer()->updateBuffer();
+               cur.forceBufferUpdate();
                break;
        }
 
@@ -558,7 +558,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                        needsUpdate |= cursorTop(cur);
                else
                        cur.undispatched();
-               cur.updateFlags(Update::FitCursor);
+               cur.screenUpdateFlags(Update::FitCursor);
                break;
 
        case LFUN_BUFFER_END:
@@ -568,7 +568,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                        needsUpdate |= cursorBottom(cur);
                else
                        cur.undispatched();
-               cur.updateFlags(Update::FitCursor);
+               cur.screenUpdateFlags(Update::FitCursor);
                break;
 
        case LFUN_INSET_BEGIN:
@@ -578,7 +578,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                        needsUpdate |= cursorTop(cur);
                else
                        cur.undispatched();
-               cur.updateFlags(Update::FitCursor);
+               cur.screenUpdateFlags(Update::FitCursor);
                break;
 
        case LFUN_INSET_END:
@@ -588,7 +588,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                        needsUpdate |= cursorBottom(cur);
                else
                        cur.undispatched();
-               cur.updateFlags(Update::FitCursor);
+               cur.screenUpdateFlags(Update::FitCursor);
                break;
 
        case LFUN_INSET_SELECT_ALL:
@@ -600,7 +600,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                        needsUpdate |= cursorBottom(cur);
                } else 
                        cur.undispatched();
-               cur.updateFlags(Update::FitCursor);
+               cur.screenUpdateFlags(Update::FitCursor);
                break;
 
        case LFUN_CHAR_FORWARD:
@@ -624,7 +624,8 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                                // provide it with two different cursors.
                                Cursor dummy = cur;
                                dummy.pos() = dummy.pit() = 0;
-                               cur.bv().checkDepm(dummy, cur);
+                               if (cur.bv().checkDepm(dummy, cur))
+                                       cur.forceBufferUpdate();;
                        }
                }
                break;
@@ -650,7 +651,8 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                                Cursor dummy = cur;
                                dummy.pos() = cur.lastpos();
                                dummy.pit() = cur.lastpit();
-                               cur.bv().checkDepm(dummy, cur);
+                               if (cur.bv().checkDepm(dummy, cur))
+                                       cur.forceBufferUpdate();
                        }
                }
                break;
@@ -817,6 +819,26 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
        case LFUN_WORD_FORWARD_SELECT:
                needsUpdate |= cur.selHandle(cmd.action() == LFUN_WORD_FORWARD_SELECT);
                needsUpdate |= cursorForwardOneWord(cur);
+
+               if (!needsUpdate && 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();;
+                       }
+               }
                break;
 
        case LFUN_WORD_LEFT:
@@ -846,6 +868,27 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
        case LFUN_WORD_BACKWARD_SELECT:
                needsUpdate |= cur.selHandle(cmd.action() == LFUN_WORD_BACKWARD_SELECT);
                needsUpdate |= cursorBackwardOneWord(cur);
+       
+               if (!needsUpdate && 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();
+                       }
+               }
                break;
 
        case LFUN_WORD_SELECT: {
@@ -909,24 +952,22 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                        pit_type const pit_end = cur.selEnd().pit();
                        for (pit_type pit = cur.selBegin().pit(); pit <= pit_end; pit++) {
                                Paragraph & par = paragraphs()[pit];
-                               if (par.getChar(0) == '\t') {
-                                       if (cur.pit() == pit)
-                                               cur.posBackward();
-                                       if (cur.realAnchor().pit() == pit && cur.realAnchor().pos() > 0 )
-                                               cur.realAnchor().backwardPos();
-                                       
-                                       par.eraseChar(0, tc);
-                               } else 
-                                       // If no tab was present, try to remove up to four spaces.
-                                       for (int n_spaces = 0;
-                                            par.getChar(0) == ' ' && n_spaces < 4; ++n_spaces) {
+                               if (par.empty())
+                                       continue;
+                               char_type const c = par.getChar(0);
+                               if (c == '\t' || c == ' ') {
+                                       // remove either 1 tab or 4 spaces.
+                                       int const n = (c == ' ' ? 4 : 1);
+                                       for (int i = 0; i < n 
+                                                 && !par.empty() && par.getChar(0) == c; ++i) {
                                                if (cur.pit() == pit)
                                                        cur.posBackward();
-                                               if (cur.realAnchor().pit() == pit && cur.realAnchor().pos() > 0 )
+                                               if (cur.realAnchor().pit() == pit 
+                                                         && cur.realAnchor().pos() > 0 )
                                                        cur.realAnchor().backwardPos();
-                                               
                                                par.eraseChar(0, tc);
                                        }
+                               }
                        }
                        cur.finishUndo();
                } else {
@@ -971,6 +1012,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                        singleParUpdate = false;
                }
                moveCursor(cur, false);
+               cur.forceBufferUpdate();
                break;
 
        case LFUN_CHAR_DELETE_BACKWARD:
@@ -988,6 +1030,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                        cutSelection(cur, true, false);
                        singleParUpdate = false;
                }
+               cur.forceBufferUpdate();
                break;
 
        case LFUN_BREAK_PARAGRAPH:
@@ -1046,8 +1089,10 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
        }
 
        case LFUN_INSET_DISSOLVE: {
-               if (dissolveInset(cur))
+               if (dissolveInset(cur)) {
                        needsUpdate = true;
+                       cur.forceBufferUpdate();
+               }
                break;
        }
 
@@ -1363,7 +1408,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                case mouse_button::button1:
                        // Set the cursor
                        if (!bv->mouseSetCursor(cur, cmd.argument() == "region-select"))
-                               cur.updateFlags(Update::SinglePar | Update::FitCursor);
+                               cur.screenUpdateFlags(Update::SinglePar | Update::FitCursor);
                        if (bvcur.wordSelection())
                                selectWord(bvcur, WHOLE_WORD);
                        break;
@@ -1374,7 +1419,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                        lyx::dispatch(
                                FuncRequest(LFUN_COMMAND_ALTERNATIVES,
                                            "selection-paste ; primary-selection-paste paragraph"));
-                       cur.noUpdate();
+                       cur.noScreenUpdate();
                        break;
 
                case mouse_button::button3: {
@@ -1382,11 +1427,11 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                        // selection, a context menu will popup.
                        if (bvcur.selection() && cur >= bvcur.selectionBegin()
                            && cur < bvcur.selectionEnd()) {
-                               cur.noUpdate();
+                               cur.noScreenUpdate();
                                return;
                        }
                        if (!bv->mouseSetCursor(cur, false))
-                               cur.updateFlags(Update::SinglePar | Update::FitCursor);
+                               cur.screenUpdateFlags(Update::SinglePar | Update::FitCursor);
                        break;
                }
 
@@ -1398,7 +1443,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
        case LFUN_MOUSE_MOTION: {
                // Mouse motion with right or middle mouse do nothing for now.
                if (cmd.button() != mouse_button::button1) {
-                       cur.noUpdate();
+                       cur.noScreenUpdate();
                        return;
                }
                // ignore motions deeper nested than the real anchor
@@ -1431,8 +1476,8 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                bvcur.setSelection(true);
                if (cur.top() == old) {
                        // We didn't move one iota, so no need to update the screen.
-                       cur.updateFlags(Update::SinglePar | Update::FitCursor);
-                       //cur.noUpdate();
+                       cur.screenUpdateFlags(Update::SinglePar | Update::FitCursor);
+                       //cur.noScreenUpdate();
                        return;
                }
                break;
@@ -1453,23 +1498,23 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                                cur.bv().cursor().setSelection();
                                // We might have removed an empty but drawn selection
                                // (probably a margin)
-                               cur.updateFlags(Update::SinglePar | Update::FitCursor);
+                               cur.screenUpdateFlags(Update::SinglePar | Update::FitCursor);
                        } else
-                               cur.noUpdate();
+                               cur.noScreenUpdate();
                        // FIXME: We could try to handle drag and drop of selection here.
                        return;
 
                case mouse_button::button2:
                        // Middle mouse pasting is handled at mouse press time,
                        // see LFUN_MOUSE_PRESS.
-                       cur.noUpdate();
+                       cur.noScreenUpdate();
                        return;
 
                case mouse_button::button3:
                        // Cursor was set at LFUN_MOUSE_PRESS time.
                        // FIXME: If there is a selection we could try to handle a special
                        // drag & drop context menu.
-                       cur.noUpdate();
+                       cur.noScreenUpdate();
                        return;
 
                case mouse_button::none:
@@ -1570,7 +1615,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
        case LFUN_ERT_INSERT:
        case LFUN_LISTING_INSERT:
        case LFUN_MARGINALNOTE_INSERT:
-       case LFUN_OPTIONAL_INSERT:
+       case LFUN_ARGUMENT_INSERT:
        case LFUN_INDEX_INSERT:
        case LFUN_PREVIEW_INSERT:
                // Open the inset, and move the current selection
@@ -1579,7 +1624,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                cur.posForward();
                // Some insets are numbered, others are shown in the outline pane so
                // let's update the labels and the toc backend.
-               bv->buffer().updateBuffer();
+               cur.forceBufferUpdate();
                break;
 
        case LFUN_TABULAR_INSERT:
@@ -1633,8 +1678,8 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                // date metrics.
                FuncRequest cmd_caption(LFUN_CAPTION_INSERT);
                doInsertInset(cur, cur.text(), cmd_caption, true, false);
-               bv->buffer().updateBuffer();
-               cur.updateFlags(Update::Force);
+               cur.forceBufferUpdate();
+               cur.screenUpdateFlags(Update::Force);
                // FIXME: When leaving the Float (or Wrap) inset we should
                // delete any empty paragraph left above or below the
                // caption.
@@ -1665,8 +1710,6 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
        }
        
        case LFUN_NOMENCL_PRINT:
-       case LFUN_TOC_INSERT:
-       case LFUN_LINE_INSERT:
        case LFUN_NEWPAGE_INSERT:
                // do nothing fancy
                doInsertInset(cur, this, cmd, false, false);
@@ -1938,6 +1981,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                if (!cmd.argument().empty())
                        // FIXME: Are all these characters encoded in one byte in utf8?
                        bv->translateAndInsert(cmd.argument()[0], this, cur);
+               cur.screenUpdateFlags(Update::FitCursor);
                break;
 
        case LFUN_FLOAT_LIST_INSERT: {
@@ -2038,6 +2082,25 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                break;
        }
 
+       case LFUN_SPELLING_REMOVE: {
+               docstring word = from_utf8(cmd.getArg(0));
+               Language * lang;
+               if (word.empty()) {
+                       word = cur.selectionAsString(false);
+                       // FIXME
+                       if (word.size() > 100 || word.empty()) {
+                               // Get word or selection
+                               selectWordWhenUnderCursor(cur, WHOLE_WORD);
+                               word = cur.selectionAsString(false);
+                       }
+                       lang = const_cast<Language *>(cur.getFont().language());
+               } else
+                       lang = const_cast<Language *>(languages.getLanguage(cmd.getArg(1)));
+               WordLangTuple wl(word, lang);
+               theSpellChecker()->remove(wl);
+               break;
+       }
+
        case LFUN_PARAGRAPH_PARAMS_APPLY: {
                // Given data, an encoding of the ParagraphParameters
                // generated in the Paragraph dialog, this function sets
@@ -2074,26 +2137,26 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
        case LFUN_OUTLINE_UP:
                outline(OutlineUp, cur);
                setCursor(cur, cur.pit(), 0);
-               cur.buffer()->updateBuffer();
+               cur.forceBufferUpdate();
                needsUpdate = true;
                break;
 
        case LFUN_OUTLINE_DOWN:
                outline(OutlineDown, cur);
                setCursor(cur, cur.pit(), 0);
-               cur.buffer()->updateBuffer();
+               cur.forceBufferUpdate();
                needsUpdate = true;
                break;
 
        case LFUN_OUTLINE_IN:
                outline(OutlineIn, cur);
-               cur.buffer()->updateBuffer();
+               cur.forceBufferUpdate();
                needsUpdate = true;
                break;
 
        case LFUN_OUTLINE_OUT:
                outline(OutlineOut, cur);
-               cur.buffer()->updateBuffer();
+               cur.forceBufferUpdate();
                needsUpdate = true;
                break;
 
@@ -2110,7 +2173,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
        // for now only Text::erase() and Text::backspace() do that.
        // The plan is to verify all the LFUNs and then to remove this
        // singleParUpdate boolean altogether.
-       if (cur.result().update() & Update::Force) {
+       if (cur.result().screenUpdate() & Update::Force) {
                singleParUpdate = false;
                needsUpdate = true;
        }
@@ -2121,7 +2184,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                // Inserting characters does not change par height in general. So, try
                // to update _only_ this paragraph. BufferView will detect if a full
                // metrics update is needed anyway.
-               cur.updateFlags(Update::SinglePar | Update::FitCursor);
+               cur.screenUpdateFlags(Update::SinglePar | Update::FitCursor);
                return;
        }
 
@@ -2133,15 +2196,15 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                // FIXME: it would be better if we could just do this
                //
                //if (cur.result().update() != Update::FitCursor)
-               //      cur.noUpdate();
+               //      cur.noScreenUpdate();
                //
                // But some LFUNs do not set Update::FitCursor when needed, so we
                // do it for all. This is not very harmfull as FitCursor will provoke
                // a full redraw only if needed but still, a proper review of all LFUN
                // should be done and this needsUpdate boolean can then be removed.
-               cur.updateFlags(Update::FitCursor);
+               cur.screenUpdateFlags(Update::FitCursor);
        else
-               cur.updateFlags(Update::Force | Update::FitCursor);
+               cur.screenUpdateFlags(Update::Force | Update::FitCursor);
 }
 
 
@@ -2204,6 +2267,8 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
                        code = NOMENCL_PRINT_CODE;
                else if (cmd.argument() == "label")
                        code = LABEL_CODE;
+               else if (cmd.argument() == "line")
+                       code = LINE_CODE;
                else if (cmd.argument() == "note")
                        code = NOTE_CODE;
                else if (cmd.argument() == "phantom")
@@ -2335,17 +2400,14 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
        case LFUN_LABEL_INSERT:
                code = LABEL_CODE;
                break;
-       case LFUN_LINE_INSERT:
-               code = LINE_CODE;
-               break;
        case LFUN_INFO_INSERT:
                code = INFO_CODE;
                break;
-       case LFUN_OPTIONAL_INSERT: {
-               code = OPTARG_CODE;
+       case LFUN_ARGUMENT_INSERT: {
+               code = ARG_CODE;
                Layout const & lay = cur.paragraph().layout();
                int const numargs = lay.reqargs + lay.optargs;
-               enable = cur.paragraph().insetList().count(OPTARG_CODE) < numargs;
+               enable = cur.paragraph().insetList().count(ARG_CODE) < numargs;
                break;
        }
        case LFUN_INDEX_INSERT:
@@ -2368,11 +2430,6 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
                // not allowed in description items
                enable = !inDescriptionItem(cur);
                break;
-       case LFUN_TOC_INSERT:
-               code = TOC_CODE;
-               // not allowed in description items
-               enable = !inDescriptionItem(cur);
-               break;
        case LFUN_HYPERLINK_INSERT:
                if (cur.selIsMultiCell() || cur.selIsMultiLine()) {
                        enable = false;
@@ -2585,6 +2642,7 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
        
        case LFUN_SPELLING_ADD:
        case LFUN_SPELLING_IGNORE:
+       case LFUN_SPELLING_REMOVE:
                enable = theSpellChecker();
                break;
 
@@ -2673,7 +2731,6 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
        case LFUN_LINE_END:
        case LFUN_CHAR_DELETE_FORWARD:
        case LFUN_CHAR_DELETE_BACKWARD:
-       case LFUN_INSET_INSERT:
        case LFUN_WORD_UPCASE:
        case LFUN_WORD_LOWCASE:
        case LFUN_WORD_CAPITALIZE:
@@ -2689,6 +2746,19 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
                enable = true;
                break;
 
+       case LFUN_INSET_INSERT: {
+               string const type = cmd.getArg(0);
+               if (type == "toc") {
+                       code = TOC_CODE;
+                       // not allowed in description items
+                       //FIXME: couldn't this be merged in Inset::insetAllowed()?
+                       enable = !inDescriptionItem(cur);
+               } else {
+                       enable = true;
+               }
+               break;
+       }
+
        default:
                return false;
        }