]> git.lyx.org Git - lyx.git/blobdiff - src/Text.cpp
Fix functions that used functions but did not defined it
[lyx.git] / src / Text.cpp
index 9fb59b5ec9a0758ae7243fa8b7360c56ee0964c2..8b50d9e9cd98a479a07e622b617c1a16c4cf0832 100644 (file)
@@ -45,7 +45,6 @@
 #include "Intl.h"
 #include "Language.h"
 #include "Layout.h"
-#include "Lexer.h"
 #include "LyX.h"
 #include "LyXAction.h"
 #include "lyxfind.h"
@@ -95,6 +94,7 @@
 #include "support/filetools.h"
 #include "support/gettext.h"
 #include "support/lassert.h"
+#include "support/Lexer.h"
 #include "support/limited_stack.h"
 #include "support/lstrings.h"
 #include "support/lyxtime.h"
@@ -1127,12 +1127,15 @@ void Text::insertChar(Cursor & cur, char_type c)
        if (!cur.paragraph().isPassThru() && owner_->lyxCode() != IPA_CODE &&
            cur.real_current_font.fontInfo().family() != TYPEWRITER_FAMILY &&
            c == '-' && pos > 0) {
-               if (par.getChar(pos - 1) == '-') {
+               pos_type prev_pos = pos - 1;
+               while (prev_pos > 0 && par.isDeleted(prev_pos))
+                       --prev_pos;
+               if (!par.isDeleted(prev_pos) && par.getChar(prev_pos) == '-') {
                        // convert "--" to endash
-                       par.eraseChar(pos - 1, cur.buffer()->params().track_changes);
+                       par.eraseChar(prev_pos, cur.buffer()->params().track_changes);
                        c = 0x2013;
                        pos--;
-               } else if (par.getChar(pos - 1) == 0x2013) {
+               } else if (!par.isDeleted(prev_pos) && par.getChar(prev_pos) == 0x2013) {
                        // convert "---" to emdash
                        par.eraseChar(pos - 1, cur.buffer()->params().track_changes);
                        c = 0x2014;
@@ -4333,7 +4336,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
 
                if (!atFirstOrLastRow) {
                        needsUpdate |= cur.selHandle(select);
-                       cur.upDownInText(up, needsUpdate);
+                       needsUpdate |= cur.upDownInText(up);
                        needsUpdate |= cur.beforeDispatchCursor().inMathed();
                } else {
                        pos_type newpos = up ? 0 : cur.lastpos();
@@ -4341,10 +4344,11 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                                needsUpdate |= cur.selHandle(select);
                                // we do not reset the targetx of the cursor
                                cur.pos() = newpos;
-                               needsUpdate |= bv->checkDepm(cur, bv->cursor());
-                               cur.updateTextTargetOffset();
-                               if (needsUpdate)
+                               if (bv->checkDepm(cur, bv->cursor())) {
+                                       needsUpdate = true;
                                        cur.forceBufferUpdate();
+                               }
+                               cur.updateTextTargetOffset();
                                break;
                        }
 
@@ -4352,7 +4356,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                        // the selection right now, but wait for the next dispatch.
                        if (select)
                                needsUpdate |= cur.selHandle(select);
-                       cur.upDownInText(up, needsUpdate);
+                       needsUpdate |= cur.upDownInText(up);
                        cur.undispatched();
                }
 
@@ -5720,12 +5724,27 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
        }
 
        case LFUN_NOMENCL_PRINT:
-       case LFUN_NEWPAGE_INSERT:
                // do nothing fancy
                doInsertInset(cur, this, cmd, false, false);
                cur.posForward();
                break;
 
+       case LFUN_NEWPAGE_INSERT: {
+               // When we are in a heading, put the page break in a standard
+               // paragraph before the heading (if cur.pos() == 0) or after
+               // (if cur.pos() == cur.lastpos())
+               if (cur.text()->getTocLevel(cur.pit()) != Layout::NOT_IN_TOC) {
+                       lyx::dispatch(FuncRequest(LFUN_PARAGRAPH_BREAK));
+                       DocumentClass const & tc = bv->buffer().params().documentClass();
+                       lyx::dispatch(FuncRequest(LFUN_LAYOUT, from_ascii("\"") + tc.plainLayout().name()
+                                                 + from_ascii("\" ignoreautonests")));
+               }
+               // do nothing fancy
+               doInsertInset(cur, this, cmd, false, false);
+               cur.posForward();
+               break;
+       }
+
        case LFUN_SEPARATOR_INSERT: {
                doInsertInset(cur, this, cmd, false, false);
                cur.posForward();
@@ -5799,7 +5818,8 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                                cur.resetAnchor();
                                cur.selection(true);
                                cur.top().pos() = 0;
-                       }
+                       } else
+                               delete inset;
                }
                break;
 
@@ -5942,7 +5962,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                // Argument?
                if (!arg.empty()) {
                        if (isStrUnsignedInt(arg)) {
-                               num = convert<uint>(arg);
+                               num = convert<unsigned int>(arg);
                                if (num >= freeFonts.size()) {
                                        cur.message(_("Invalid argument (number exceeds stack size)!"));
                                        break;
@@ -5969,7 +5989,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                        toggleAndShow(cur, this, font, toggleall);
                        cur.message(bformat(_("Text properties applied: %1$s"), props));
                } else
-                       LYXERR0("Invalid argument of textstyle-update");
+                       cur.message(_("Invalid argument of textstyle-update"));
                break;
        }
 
@@ -6358,42 +6378,33 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                }
        }
 
-       // FIXME: The cursor flag is reset two lines below
-       // so we need to check here if some of the LFUN did touch that.
-       // 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().screenUpdate() & Update::Force) {
-               singleParUpdate = false;
-               needsUpdate = true;
-       }
-
        // FIXME: the following code should go in favor of fine grained
        // update flag treatment.
-       if (singleParUpdate) {
+       if (needsUpdate || cur.result().screenUpdate() & Update::Force)
+               cur.screenUpdateFlags(Update::Force | Update::FitCursor);
+       else if (singleParUpdate || cur.result().screenUpdate() & Update::SinglePar) {
                // 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.screenUpdateFlags(Update::SinglePar | Update::FitCursor);
                return;
        }
-       if (!needsUpdate
-           && &oldTopSlice.inset() == &cur.inset()
-           && oldTopSlice.idx() == cur.idx()
-           && !oldSelection // oldSelection is a backup of cur.selection() at the beginning of the function.
-           && !cur.selection())
-               // FIXME: it would be better if we could just do this
-               //
-               //if (cur.result().update() != Update::FitCursor)
-               //      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.screenUpdateFlags(Update::FitCursor);
-       else
-               cur.screenUpdateFlags(Update::Force | Update::FitCursor);
+       else {
+               // oldSelection is a backup of cur.selection() at the beginning of the function.
+           if (!oldSelection && !cur.selection())
+                       // FIXME: it would be better if we could just do this
+                       //
+                       //if (cur.result().update() != Update::FitCursor)
+                       //      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.screenUpdateFlags(Update::FitCursor);
+               else
+                       cur.screenUpdateFlags(Update::ForceDraw | Update::FitCursor);
+       }
 }
 
 
@@ -6955,9 +6966,11 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
        }
 
        case LFUN_NEWPAGE_INSERT:
-               // not allowed in description items
+               // not allowed in description items and in the midst of sections
                code = NEWPAGE_CODE;
-               enable = !inDescriptionItem(cur);
+               enable = !inDescriptionItem(cur)
+                       && (cur.text()->getTocLevel(cur.pit()) == Layout::NOT_IN_TOC
+                           || cur.pos() == 0 || cur.pos() == cur.lastpos());
                break;
 
        case LFUN_LANGUAGE: