]> git.lyx.org Git - lyx.git/blobdiff - src/text3.C
bug 2298: cursorTop/Bottom/Home/End does not redraw after dEPM
[lyx.git] / src / text3.C
index 65e803f4d2876a557c945ddf97a2037ea123080f..f34b24ab10557bd252a2c50804a54a987362078d 100644 (file)
@@ -135,6 +135,9 @@ namespace {
                string sel = cur.selectionAsString(false);
                //lyxerr << "selection is: '" << sel << "'" << endl;
 
+               // It may happen that sel is empty but there is a selection
+               replaceSelection(cur);
+
                if (sel.empty()) {
                        const int old_pos = cur.pos();
                        cur.insert(new MathHullInset("simple"));
@@ -155,17 +158,21 @@ namespace {
                        // create a macro if we see "\\newcommand"
                        // somewhere, and an ordinary formula
                        // otherwise
-                       cutSelection(cur, true, true);
+                       istringstream is(sel);
                        if (sel.find("\\newcommand") == string::npos
                            && sel.find("\\def") == string::npos)
                        {
-                               cur.insert(new MathHullInset("simple"));
-                               cur.dispatch(FuncRequest(LFUN_RIGHT));
-                               cur.dispatch(FuncRequest(LFUN_INSERT_MATH, sel));
-                       } else {
-                               istringstream is(sel);
+                               MathHullInset * formula = new MathHullInset;
+                               LyXLex lex(0, 0);
+                               lex.setStream(is);
+                               formula->read(cur.buffer(), lex);
+                               if (formula->getType() == "none")
+                                       // Don't create pseudo formulas if
+                                       // delimiters are left out
+                                       formula->mutate("simple");
+                               cur.insert(formula);
+                       } else
                                cur.insert(new MathMacroTemplate(is));
-                       }
                }
                cur.message(N_("Math editor mode"));
        }
@@ -308,8 +315,8 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
        // Signals that a full-screen update is required
        bool needsUpdate = !(lyxaction.funcHasFlag(cmd.action, 
                LyXAction::NoUpdate) || singleParUpdate);
-       // Remember the old paragraph metric
-       Dimension olddim = cur.paragraph().dim();
+       // Remember the old paragraph metric (_outer_ paragraph!)
+       Dimension olddim = cur.bottom().paragraph().dim();
 
        switch (cmd.action) {
 
@@ -380,7 +387,7 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
                if (cur.depth() == 1) {
                        if (!cur.mark())
                                cur.clearSelection();
-                       cursorTop(cur);
+                       needsUpdate = cursorTop(cur);
                        finishChange(cur, false);
                } else {
                        cur.undispatched();
@@ -391,7 +398,7 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
                if (cur.depth() == 1) {
                        if (!cur.selection())
                                cur.resetAnchor();
-                       cursorTop(cur);
+                       needsUpdate = cursorTop(cur);
                        finishChange(cur, true);
                } else {
                        cur.undispatched();
@@ -402,7 +409,7 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
                if (cur.depth() == 1) {
                        if (!cur.mark())
                                cur.clearSelection();
-                       cursorBottom(cur);
+                       needsUpdate = cursorBottom(cur);
                        finishChange(cur, false);
                } else {
                        cur.undispatched();
@@ -413,7 +420,7 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
                if (cur.depth() == 1) {
                        if (!cur.selection())
                                cur.resetAnchor();
-                       cursorBottom(cur);
+                       needsUpdate = cursorBottom(cur);
                        finishChange(cur, true);
                } else {
                        cur.undispatched();
@@ -513,7 +520,7 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
                update(cur);
                if (!cur.selection())
                        cur.resetAnchor();
-               cursorPrevious(cur);
+               needsUpdate = cursorPrevious(cur);
                finishChange(cur, true);
                break;
 
@@ -521,7 +528,7 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
                update(cur);
                if (!cur.selection())
                        cur.resetAnchor();
-               cursorNext(cur);
+               needsUpdate = cursorNext(cur);
                finishChange(cur, true);
                break;
 
@@ -529,7 +536,7 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
                update(cur);
                if (!cur.selection())
                        cur.resetAnchor();
-               cursorHome(cur);
+               needsUpdate = cursorHome(cur);
                finishChange(cur, true);
                break;
 
@@ -537,7 +544,7 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
                update(cur);
                if (!cur.selection())
                        cur.resetAnchor();
-               cursorEnd(cur);
+               needsUpdate = cursorEnd(cur);
                finishChange(cur, true);
                break;
 
@@ -597,14 +604,14 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
        case LFUN_HOME:
                if (!cur.mark())
                        cur.clearSelection();
-               cursorHome(cur);
+               needsUpdate = cursorHome(cur);
                finishChange(cur, false);
                break;
 
        case LFUN_END:
                if (!cur.mark())
                        cur.clearSelection();
-               cursorEnd(cur);
+               needsUpdate = cursorEnd(cur);
                finishChange(cur, false);
                break;
 
@@ -621,12 +628,16 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
 
        case LFUN_DELETE:
                if (!cur.selection()) {
-                       Delete(cur);
+                       if (cur.pos() == cur.paragraph().size())
+                               // Par boundary, force full-screen update
+                               singleParUpdate = false;
+                       needsUpdate = Delete(cur);
                        cur.resetAnchor();
                        // It is possible to make it a lot faster still
                        // just comment out the line below...
                } else {
                        cutSelection(cur, true, false);
+                       singleParUpdate = false;
                }
                moveCursor(cur, false);
                break;
@@ -649,13 +660,17 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
        case LFUN_BACKSPACE:
                if (!cur.selection()) {
                        if (bv->owner()->getIntl().getTransManager().backspace()) {
-                               backspace(cur);
+                               // Par boundary, full-screen update
+                               if (cur.pos() == 0)
+                                       singleParUpdate = false;
+                               needsUpdate = backspace(cur);
                                cur.resetAnchor();
                                // It is possible to make it a lot faster still
                                // just comment out the line below...
                        }
                } else {
                        cutSelection(cur, true, false);
+                       singleParUpdate = false;
                }
                bv->switchKeyMap();
                break;
@@ -825,9 +840,6 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
        case LFUN_PASTE:
                cur.message(_("Paste"));
                lyx::cap::replaceSelection(cur);
-#ifdef WITH_WARNINGS
-#warning FIXME Check if the arg is in the domain of available selections.
-#endif
                if (isStrUnsignedInt(cmd.argument))
                        pasteSelection(cur, convert<unsigned int>(cmd.argument));
                else
@@ -1028,20 +1040,7 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
                        paste_internally = true;
                }
 
-               // Clear the selection
-               cur.clearSelection();
-
-               setCursorFromCoordinates(cur, cmd.x, cmd.y);
-               cur.resetAnchor();
-               finishUndo();
-               cur.setTargetX();
-
-               // Has the cursor just left the inset?
-               if (bv->cursor().inMathed() && !cur.inMathed())
-                       bv->cursor().inset().notifyCursorLeaves(bv->cursor());
-
-               // Set cursor here.
-               bv->cursor() = cur;
+               bv->mouseSetCursor(cur);
 
                // Insert primary selection with middle mouse
                // if there is a local selection in the current buffer,
@@ -1130,12 +1129,6 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
                cur.clearSelection();
                LyXFont const old_font = real_current_font;
 
-               // Prevents language turds in new lyxtexts under non-english
-               BufferParams const & bufparams = cur.buffer().params();
-               Language const * lang = cur.paragraph().getParLanguage(bufparams);
-               current_font.setLanguage(lang);
-               real_current_font.setLanguage(lang);
-
                string::const_iterator cit = cmd.argument.begin();
                string::const_iterator end = cmd.argument.end();
                for (; cit != end; ++cit)
@@ -1547,10 +1540,14 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd)
 
        if (singleParUpdate)
                // Inserting characters does not change par height
-               if (cur.paragraph().dim().asc == olddim.asc
-                && cur.paragraph().dim().des == olddim.des) {
+               if (cur.bottom().paragraph().dim().height() 
+                   == olddim.height()) {
                        // if so, update _only_ this paragraph
-                       cur.bv().update(Update::SinglePar | Update::Force);
+                       cur.bv().update(Update::SinglePar |
+                                       Update::FitCursor |
+                                       Update::MultiParSel);
+                       cur.noUpdate();
+                       return;
                } else
                        needsUpdate = true;
        if (!needsUpdate