]> git.lyx.org Git - lyx.git/blobdiff - src/Text3.cpp
Fix uninitialized value revealed by Coverity
[lyx.git] / src / Text3.cpp
index 9d0e8ffd52f3d45f9233354e8ddb17b480601da4..918064c3363728a5306a07689724b399eb21fe77 100644 (file)
@@ -60,6 +60,7 @@
 #include "insets/InsetFloatList.h"
 #include "insets/InsetGraphics.h"
 #include "insets/InsetGraphicsParams.h"
+#include "insets/InsetInfo.h"
 #include "insets/InsetIPAMacro.h"
 #include "insets/InsetNewline.h"
 #include "insets/InsetQuotes.h"
@@ -292,7 +293,7 @@ static bool doInsertInset(Cursor & cur, Text * text,
                if (cmd.action() == LFUN_INDEX_INSERT)
                        copySelectionToTemp(cur);
                else
-                       cutSelectionToTemp(cur, false, pastesel);
+                       cutSelectionToTemp(cur, pastesel);
                cur.clearSelection();
                gotsel = true;
        } else if (cmd.action() == LFUN_INDEX_INSERT) {
@@ -572,16 +573,16 @@ Language const * getLanguage(Cursor const & cur, string const & lang)
 }
 
 
-docstring resolveLayout(docstring layout, Cursor const & cur)
+docstring resolveLayout(docstring layout, DocIterator const & dit)
 {
-       Paragraph const & par = cur.paragraph();
+       Paragraph const & par = dit.paragraph();
        docstring const old_layout = par.layout().name();
-       DocumentClass const & tclass = cur.buffer()->params().documentClass();
+       DocumentClass const & tclass = dit.buffer()->params().documentClass();
 
        if (layout.empty())
                layout = tclass.defaultLayoutName();
 
-       if (cur.inset().forcePlainLayout(cur.idx()))
+       if (dit.inset().forcePlainLayout(dit.idx()))
                // in this case only the empty layout is allowed
                layout = tclass.plainLayoutName();
        else if (par.usePlainLayout()) {
@@ -606,7 +607,7 @@ docstring resolveLayout(docstring layout, Cursor const & cur)
 }
 
 
-bool isAlreadyLayout(docstring const & layout, Cursor const & cur)
+bool isAlreadyLayout(docstring const & layout, CursorData const & cur)
 {
        ParagraphList const & pars = cur.text()->paragraphs();
 
@@ -713,7 +714,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
 
        case LFUN_WORD_DELETE_FORWARD:
                if (cur.selection())
-                       cutSelection(cur, true, false);
+                       cutSelection(cur, false);
                else
                        deleteWordForward(cur, cmd.getArg(0) == "force");
                finishChange(cur, false);
@@ -721,7 +722,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
 
        case LFUN_WORD_DELETE_BACKWARD:
                if (cur.selection())
-                       cutSelection(cur, true, false);
+                       cutSelection(cur, false);
                else
                        deleteWordBackward(cur, cmd.getArg(0) == "force");
                finishChange(cur, false);
@@ -729,7 +730,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
 
        case LFUN_LINE_DELETE_FORWARD:
                if (cur.selection())
-                       cutSelection(cur, true, false);
+                       cutSelection(cur, false);
                else
                        tm->deleteLineForward(cur);
                finishChange(cur, false);
@@ -1207,7 +1208,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                        needsUpdate |= erase(cur);
                        cur.resetAnchor();
                } else {
-                       cutSelection(cur, true, false);
+                       cutSelection(cur, false);
                        singleParUpdate = false;
                }
                moveCursor(cur, false);
@@ -1237,7 +1238,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                                }
                        }
                } else {
-                       cutSelection(cur, true, false);
+                       cutSelection(cur, false);
                        singleParUpdate = false;
                }
                break;
@@ -1322,7 +1323,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                        }
                        */
                        if (cur.selection())
-                               cutSelection(cur, true, false);
+                               cutSelection(cur, false);
                        cur.insert(inset);
                        cur.forceBufferUpdate();
                        if (inset->editable() && inset->asInsetText())
@@ -1514,7 +1515,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
        }
 
        case LFUN_CUT:
-               cutSelection(cur, true, true);
+               cutSelection(cur, true);
                cur.message(_("Cut"));
                break;
 
@@ -1546,7 +1547,8 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                cur.message(cur.paragraph().layout().name());
                break;
 
-       case LFUN_LAYOUT: {
+       case LFUN_LAYOUT:
+       case LFUN_LAYOUT_TOGGLE: {
                bool const ignoreautonests = cmd.getArg(1) == "ignoreautonests";
                docstring req_layout = ignoreautonests ? from_utf8(cmd.getArg(0)) : cmd.argument();
                LYXERR(Debug::INFO, "LFUN_LAYOUT: (arg) " << to_utf8(req_layout));
@@ -1561,6 +1563,11 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                docstring const old_layout = cur.paragraph().layout().name();
                bool change_layout = !isAlreadyLayout(layout, cur);
 
+               if (cmd.action() == LFUN_LAYOUT_TOGGLE && !change_layout) {
+                       change_layout = true;
+                       layout = resolveLayout(docstring(), cur);
+               }
+
                if (change_layout) {
                        setLayout(cur, layout);
                        if (cur.pit() > 0 && !ignoreautonests) {
@@ -1743,14 +1750,6 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                break;
        }
 
-       case LFUN_DATE_INSERT: {
-               string const format = cmd.argument().empty()
-                       ? lyxrc.date_insert_format : to_utf8(cmd.argument());
-               string const time = formatted_time(current_time(), format);
-               lyx::dispatch(FuncRequest(LFUN_SELF_INSERT, time));
-               break;
-       }
-
        case LFUN_MOUSE_TRIPLE:
                if (cmd.button() == mouse_button::button1) {
                        tm->cursorHome(cur);
@@ -1913,14 +1912,11 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                // true (on).
 
                if (lyxrc.auto_region_delete && cur.selection())
-                       cutSelection(cur, false, false);
-
+                       cutSelection(cur, false);
                cur.clearSelection();
 
-               docstring::const_iterator cit = cmd.argument().begin();
-               docstring::const_iterator const end = cmd.argument().end();
-               for (; cit != end; ++cit)
-                       bv->translateAndInsert(*cit, this, cur);
+               for (char_type c : cmd.argument())
+                       bv->translateAndInsert(c, this, cur);
 
                cur.resetAnchor();
                moveCursor(cur, false);
@@ -1993,22 +1989,18 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
        }
 
        case LFUN_INFO_INSERT: {
-               Inset * inset;
-               if (cmd.argument().empty() && cur.selection()) {
-                       // if command argument is empty use current selection as parameter.
-                       docstring ds = cur.selectionAsString(false);
-                       cutSelection(cur, true, false);
-                       FuncRequest cmd0(cmd, ds);
-                       inset = createInset(cur.buffer(), cmd0);
+               if (cmd.argument().empty()) {
+                       bv->showDialog("info", cur.current_font.language()->lang());
                } else {
+                       Inset * inset;
                        inset = createInset(cur.buffer(), cmd);
+                       if (!inset)
+                               break;
+                       cur.recordUndo();
+                       insertInset(cur, inset);
+                       cur.forceBufferUpdate();
+                       cur.posForward();
                }
-               if (!inset)
-                       break;
-               cur.recordUndo();
-               insertInset(cur, inset);
-               cur.forceBufferUpdate();
-               cur.posForward();
                break;
        }
        case LFUN_CAPTION_INSERT:
@@ -2359,6 +2351,10 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                selectWordWhenUnderCursor(cur, WHOLE_WORD_STRICT);
                Font font(ignore_font, lang);
                toggleAndShow(cur, this, font, toggle);
+               // We need a buffer update if we change the language
+               // of an info inset
+               if (cur.insetInSelection(INFO_CODE))
+                       cur.forceBufferUpdate();
                break;
        }
 
@@ -2376,6 +2372,10 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                        freefont = font;
                        toggleall = toggle;
                        toggleAndShow(cur, this, freefont, toggleall);
+                       // We need a buffer update if we change the language
+                       // of an info inset
+                       if (cur.insetInSelection(INFO_CODE))
+                               cur.forceBufferUpdate();
                        cur.message(_("Character set"));
                } else {
                        lyxerr << "Argument not ok";
@@ -2466,7 +2466,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                if (tclass.floats().typeExist(to_utf8(cmd.argument()))) {
                        cur.recordUndo();
                        if (cur.selection())
-                               cutSelection(cur, true, false);
+                               cutSelection(cur, false);
                        breakParagraph(cur);
 
                        if (cur.lastpos() != 0) {
@@ -2942,6 +2942,7 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
                break;
        case LFUN_INFO_INSERT:
                code = INFO_CODE;
+               enable = infoparams.validateArgument(cur.buffer(), cmd.argument(), true);
                break;
        case LFUN_ARGUMENT_INSERT: {
                code = ARG_CODE;
@@ -3204,17 +3205,20 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
                        if (!cur.buffer()->areChangesPresent())
                                break;
 
-                       for (DocIterator it = cur.selectionBegin(); it < cur.selectionEnd(); it.forwardPar()) {
+                       for (DocIterator it = cur.selectionBegin(); ; it.forwardPar()) {
                                pos_type const beg = it.pos();
                                pos_type end;
-                               if (it.paragraph().id() == cur.selectionEnd().paragraph().id())
+                               bool const in_last_par = (it.pit() == cur.selectionEnd().pit());
+                               if (in_last_par)
                                        end = cur.selectionEnd().pos();
                                else
-                                       end = it.paragraph().size();
+                                       end = it.lastpos();
                                if (beg != end && it.paragraph().isChanged(beg, end)) {
                                        enable = true;
                                        break;
                                }
+                               if (in_last_par)
+                                       break;
                        }
                }
                break;
@@ -3259,13 +3263,6 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
                enable = !inDescriptionItem(cur);
                break;
 
-       case LFUN_DATE_INSERT: {
-               string const format = cmd.argument().empty()
-                       ? lyxrc.date_insert_format : to_utf8(cmd.argument());
-               enable = support::os::is_valid_strftime(format);
-               break;
-       }
-
        case LFUN_LANGUAGE:
                enable = !cur.paragraph().isPassThru();
                flag.setOnOff(cmd.getArg(0) == cur.real_current_font.language()->lang());
@@ -3286,7 +3283,8 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
                }
                break;
 
-       case LFUN_LAYOUT: {
+       case LFUN_LAYOUT:
+       case LFUN_LAYOUT_TOGGLE: {
                bool const ignoreautonests = cmd.getArg(1) == "ignoreautonests";
                docstring const req_layout = ignoreautonests ? from_utf8(cmd.getArg(0)) : cmd.argument();
                docstring const layout = resolveLayout(req_layout, cur);