]> git.lyx.org Git - lyx.git/blobdiff - src/Text3.cpp
Fix bug 4166: Crash when middle button click on inset label
[lyx.git] / src / Text3.cpp
index 04d43915b1681e0f009605ffa0ccccca59df14d6..a34dde66e6b76d00fc33c389b092b1a0ebfc6ec6 100644 (file)
@@ -202,13 +202,14 @@ static bool doInsertInset(Cursor & cur, Text * text,
                if (edit)
                        inset->edit(cur, true);
                // Now put this into inset
-               static_cast<InsetCollapsable *>(inset)->text_.insertStringAsParagraphs(cur, ds);
+               static_cast<InsetCollapsable *>(inset)->text().insertStringAsParagraphs(cur, ds);
                return true;
        }
 
        bool gotsel = false;
        if (cur.selection()) {
-               lyx::dispatch(FuncRequest(LFUN_CUT));
+               cutSelection(cur, false, pastesel);
+               cur.clearSelection();
                gotsel = true;
        }
        text->insertInset(cur, inset);
@@ -219,9 +220,12 @@ static bool doInsertInset(Cursor & cur, Text * text,
        if (!gotsel || !pastesel)
                return true;
 
-       lyx::dispatch(FuncRequest(LFUN_PASTE, "0"));
+       pasteFromStack(cur, cur.buffer().errorList("Paste"), 0);
+       cur.buffer().errors("Paste");
+       cur.clearSelection(); // bug 393
+       cur.finishUndo();
        InsetText * insetText = dynamic_cast<InsetText *>(inset);
-       if (insetText && !insetText->allowMultiPar() || cur.lastpit() == 0) {
+       if (insetText && (!insetText->allowMultiPar() || cur.lastpit() == 0)) {
                // reset first par to default
                cur.text()->paragraphs().begin()
                        ->setPlainOrDefaultLayout(bparams.documentClass());
@@ -230,12 +234,14 @@ static bool doInsertInset(Cursor & cur, Text * text,
                // Merge multiple paragraphs -- hack
                while (cur.lastpit() > 0)
                        mergeParagraph(bparams, cur.text()->paragraphs(), 0);
+               cur.leaveInset(*inset);
        } else {
-               // reset surrounding par to default
-               docstring const layoutname = insetText->usePlainLayout()
-                       ? bparams.documentClass().emptyLayoutName()
-                       : bparams.documentClass().defaultLayoutName();
                cur.leaveInset(*inset);
+               // reset surrounding par to default
+               DocumentClass const & dc = bparams.documentClass();
+               docstring const layoutname = inset->usePlainLayout()
+                       ? dc.plainLayoutName()
+                       : dc.defaultLayoutName();
                text->setLayout(cur, layoutname);
        }
 
@@ -926,6 +932,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
 
        case LFUN_PASTE: {
                cur.message(_("Paste"));
+               LASSERT(cur.selBegin().idx() == cur.selEnd().idx(), /**/);
                cap::replaceSelection(cur);
 
                // without argument?
@@ -1009,14 +1016,14 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
 
                if (para.forcePlainLayout()) 
                        // in this case only the empty layout is allowed
-                       layout = tclass.emptyLayoutName();
+                       layout = tclass.plainLayoutName();
                else if (para.usePlainLayout()) {
                        // in this case, default layout maps to empty layout 
                        if (layout == tclass.defaultLayoutName())
-                               layout = tclass.emptyLayoutName();
+                               layout = tclass.plainLayoutName();
                } else { 
                        // otherwise, the empty layout maps to the default
-                       if (layout == tclass.emptyLayoutName())
+                       if (layout == tclass.plainLayoutName())
                                layout = tclass.defaultLayoutName();
                }
 
@@ -1172,23 +1179,20 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                        bv->cursor().finishUndo();
                        break;
 
-               case mouse_button::button3:
-                       if (cur.selection()) {
-                               DocIterator const selbeg = cur.selectionBegin();
-                               DocIterator const selend = cur.selectionEnd();
-                               Cursor tmpcur = cur;
-                               tm.setCursorFromCoordinates(tmpcur, cmd.x, cmd.y);
-                               // Don't do anything if we right-click a selection, a selection
-                               // context menu should popup instead.
-                               if (tmpcur < selbeg || tmpcur >= selend) {
-                                       cur.noUpdate();
-                                       return;
-                               }
+               case mouse_button::button3: {
+                       Cursor const & bvcur = cur.bv().cursor();
+                       // Don't do anything if we right-click a
+                       // selection, a context menu will popup.
+                       if (bvcur.selection() && cur >= bvcur.selectionBegin()
+                           && cur <= bvcur.selectionEnd()) {
+                               cur.noUpdate();
+                               return;
                        }
-                       if (!bv->mouseSetCursor(cur, false)) {
+                       if (!bv->mouseSetCursor(cur, false))
                                cur.updateFlags(Update::SinglePar | Update::FitCursor);
-                               break;                  
-                       }
+                       break;                  
+               }
+
                default:
                        break;
                } // switch (cmd.button())
@@ -1425,21 +1429,13 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
        }
 
        case LFUN_NOMENCL_INSERT: {
-               FuncRequest cmd1 = cmd;
+               InsetCommandParams p(NOMENCL_CODE);
                if (cmd.argument().empty())
-                       cmd1 = FuncRequest(cmd,
-                               bv->cursor().innerText()->getStringToIndex(bv->cursor()));
-               Inset * inset = createInset(cur.bv().buffer(), cmd1);
-               if (!inset)
-                       break;
-               cur.recordUndo();
-               cur.clearSelection();
-               insertInset(cur, inset);
-               // Show the dialog for the nomenclature entry, since the
-               // description entry still needs to be filled in.
-               if (cmd.action == LFUN_NOMENCL_INSERT)
-                       inset->edit(cur, true);
-               cur.posForward();
+                       p["symbol"] = bv->cursor().innerText()->getStringToIndex(bv->cursor());
+               else
+                       p["symbol"] = cmd.argument();
+               string const data = InsetCommand::params2string("nomenclature", p);
+               bv->showDialog("nomenclature", data);   
                break;
        }
 
@@ -1690,7 +1686,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                        }
 
                        docstring const laystr = cur.inset().usePlainLayout() ?
-                               tclass.emptyLayoutName() :
+                               tclass.plainLayoutName() :
                                tclass.defaultLayoutName();
                        setLayout(cur, laystr);
                        ParagraphParameters p;
@@ -1981,6 +1977,10 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
                code = INDEX_PRINT_CODE;
                break;
        case LFUN_NOMENCL_INSERT:
+               if (cur.selIsMultiCell() || cur.selIsMultiLine()) {
+                       enable = false;
+                       break;
+               }
                code = NOMENCL_CODE;
                break;
        case LFUN_NOMENCL_PRINT:
@@ -1990,6 +1990,10 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
                code = TOC_CODE;
                break;
        case LFUN_HYPERLINK_INSERT:
+               if (cur.selIsMultiCell() || cur.selIsMultiLine()) {
+                       enable = false;
+                       break;
+               }
                code = HYPERLINK_CODE;
                break;
        case LFUN_QUOTE_INSERT:
@@ -2116,7 +2120,9 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
        case LFUN_OUTLINE_DOWN:
        case LFUN_OUTLINE_IN:
        case LFUN_OUTLINE_OUT:
-               enable = (cur.paragraph().layout().toclevel != Layout::NOT_IN_TOC);
+               // FIXME: LyX is not ready for outlining within inset.
+               enable = isMainText(cur.bv().buffer())
+                       && cur.paragraph().layout().toclevel != Layout::NOT_IN_TOC;
                break;
 
        case LFUN_NEWLINE_INSERT: