]> git.lyx.org Git - lyx.git/blobdiff - src/Text3.cpp
Added Liviu Andronic, and modified generate_contributions.py to match what was in...
[lyx.git] / src / Text3.cpp
index 798336c678d0271c06093c9056b9cf46723b64f3..bcb13e1e3b17cbd8ba3c8ed0111679078b1ced16 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,23 +220,28 @@ 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()
-                       ->setEmptyOrDefaultLayout(bparams.documentClass());
+                       ->setPlainOrDefaultLayout(bparams.documentClass());
                cur.pos() = 0;
                cur.pit() = 0;
                // 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->useEmptyLayout()
-                       ? 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);
        }
 
@@ -731,21 +737,6 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                moveCursor(cur, false);
                break;
 
-       case LFUN_DELETE_FORWARD_SKIP:
-               // Reverse the effect of LFUN_BREAK_PARAGRAPH_SKIP.
-               if (!cur.selection()) {
-                       if (cur.pos() == cur.lastpos()) {
-                               cursorForward(cur);
-                               cursorBackward(cur);
-                       }
-                       erase(cur);
-                       cur.resetAnchor();
-               } else {
-                       cutSelection(cur, true, false);
-               }
-               break;
-
-
        case LFUN_CHAR_DELETE_BACKWARD:
                if (!cur.selection()) {
                        if (bv->getIntl().getTransManager().backspace()) {
@@ -763,36 +754,12 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                }
                break;
 
-       case LFUN_DELETE_BACKWARD_SKIP:
-               // Reverse the effect of LFUN_BREAK_PARAGRAPH_SKIP.
-               if (!cur.selection()) {
-                       // FIXME: look here
-                       //CursorSlice cur = cursor();
-                       backspace(cur);
-                       //anchor() = cur;
-               } else {
-                       cutSelection(cur, true, false);
-               }
-               break;
-
        case LFUN_BREAK_PARAGRAPH:
                cap::replaceSelection(cur);
                breakParagraph(cur, cmd.argument() == "inverse");
                cur.resetAnchor();
                break;
 
-       case LFUN_BREAK_PARAGRAPH_SKIP: {
-               // When at the beginning of a paragraph, remove
-               // indentation.  Otherwise, do the same as LFUN_BREAK_PARAGRAPH.
-               cap::replaceSelection(cur);
-               if (cur.pos() == 0)
-                       cur.paragraph().params().labelWidthString(docstring());
-               else
-                       breakParagraph(cur, false);
-               cur.resetAnchor();
-               break;
-       }
-
        // TODO
        // With the creation of LFUN_PARAGRAPH_PARAMS, this is now redundant,
        // as its duties can be performed there. Should it be removed??
@@ -893,14 +860,14 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
        }
 
        case LFUN_SET_GRAPHICS_GROUP: {
-               InsetGraphics * ins = InsetGraphics::getCurrentGraphicsInset(cur);
+               InsetGraphics * ins = graphics::getCurrentGraphicsInset(cur);
                if (!ins)
                        break;
 
                cur.recordUndoFullDocument();
 
                string id = to_utf8(cmd.argument());
-               string grp = InsetGraphics::getGroupParams(bv->buffer(), id);
+               string grp = graphics::getGroupParams(bv->buffer(), id);
                InsetGraphicsParams tmp, inspar = ins->getParams();
 
                if (id.empty())
@@ -965,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?
@@ -1046,16 +1014,16 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                if (layout.empty())
                        layout = tclass.defaultLayoutName();
 
-               if (para.forceEmptyLayout()) 
+               if (para.forcePlainLayout()) 
                        // in this case only the empty layout is allowed
-                       layout = tclass.emptyLayoutName();
-               else if (para.useEmptyLayout()) {
+                       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();
                }
 
@@ -1192,6 +1160,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
 
                case mouse_button::button2:
                        // Middle mouse pasting.
+                       bv->mouseSetCursor(cur);
                        if (!cap::selection()) {                        
                                // There is no local selection in the current buffer, so try to
                                // paste primary selection instead.
@@ -1211,23 +1180,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())
@@ -1284,10 +1250,11 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                        // otherwise, single click does not clear persistent selection
                        // buffer.
                        if (cur.selection()) {
-                               // Finish selection.
-                               // If double click, cur is moved to the end of word by selectWord
-                               // but bvcur is current mouse position.
-                               cur.bv().cursor().selection() = true;
+                               // Finish selection. If double click,
+                               // cur is moved to the end of word by
+                               // selectWord but bvcur is current
+                               // mouse position.
+                               cur.bv().cursor().setSelection();
                        }
                        // FIXME: We could try to handle drag and drop of selection here.
                        cur.noUpdate();
@@ -1377,37 +1344,32 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
        }
 
        case LFUN_INFO_INSERT: {
-               Inset * inset = createInset(cur.bv().buffer(), cmd);
-               if (!inset)
-                       break;
-               // if an empty inset is created (cmd.argument() is empty)
-               // use current selection as parameter.
+               Inset * inset;
                if (cmd.argument().empty() && cur.selection()) {
-                       // use selected text as info to avoid a separate UI
+                       // if command argument is empty use current selection as parameter.
                        docstring ds = cur.selectionAsString(false);
                        cutSelection(cur, true, false);
-                       static_cast<InsetInfo *>(inset)->setInfo(to_utf8(ds));
-                       static_cast<InsetInfo *>(inset)->updateInfo();
+                       FuncRequest cmd0(cmd, ds);
+                       inset = createInset(cur.bv().buffer(), cmd0);
+               } else {
+                       inset = createInset(cur.bv().buffer(), cmd);
                }
+               if (!inset)
+                       break;
                insertInset(cur, inset);
                cur.posForward();
                break;
        }
-#if 0
-       case LFUN_LIST_INSERT:
-#endif
        case LFUN_CAPTION_INSERT:
        case LFUN_FOOTNOTE_INSERT:
        case LFUN_NOTE_INSERT:
        case LFUN_FLEX_INSERT:
        case LFUN_BOX_INSERT:
        case LFUN_BRANCH_INSERT:
-       case LFUN_BIBITEM_INSERT:
        case LFUN_ERT_INSERT:
        case LFUN_LISTING_INSERT:
        case LFUN_MARGINALNOTE_INSERT:
        case LFUN_OPTIONAL_INSERT:
-       case LFUN_ENVIRONMENT_INSERT:
        case LFUN_INDEX_INSERT:
                // Open the inset, and move the current selection
                // inside it.
@@ -1441,7 +1403,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                // add a separate paragraph for the caption inset
                pars.push_back(Paragraph());
                pars.back().setInsetOwner(pars[0].inInset());
-               pars.back().setEmptyOrDefaultLayout(tclass);
+               pars.back().setPlainOrDefaultLayout(tclass);
                int cap_pit = pars.size() - 1;
 
                // if an empty inset was created, we create an additional empty
@@ -1450,7 +1412,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                if (!content) {
                        pars.push_back(Paragraph());
                        pars.back().setInsetOwner(pars[0].inInset());
-                       pars.back().setEmptyOrDefaultLayout(tclass);
+                       pars.back().setPlainOrDefaultLayout(tclass);
                }
 
                // reposition the cursor to the caption
@@ -1469,21 +1431,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;
        }
 
@@ -1509,7 +1463,6 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                mathDispatch(cur, cmd, true);
                break;
 
-       case LFUN_MATH_IMPORT_SELECTION:
        case LFUN_MATH_MODE:
                if (cmd.argument() == "on")
                        // don't pass "on" as argument
@@ -1546,6 +1499,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
        case LFUN_MATH_MATRIX:
        case LFUN_MATH_DELIM:
        case LFUN_MATH_BIGDELIM: {
+               cur.recordUndo();
                cap::replaceSelection(cur);
                cur.insert(new InsetMathHull(hullSimple));
                checkAndActivateInset(cur, true);
@@ -1625,14 +1579,14 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                break;
        }
 
-       case LFUN_FONT_FREE_APPLY:
+       case LFUN_TEXTSTYLE_APPLY:
                toggleAndShow(cur, this, freefont, toggleall);
                cur.message(_("Character set"));
                break;
 
        // Set the freefont using the contents of \param data dispatched from
        // the frontends and apply it at the current cursor location.
-       case LFUN_FONT_FREE_UPDATE: {
+       case LFUN_TEXTSTYLE_UPDATE: {
                Font font;
                bool toggle;
                if (font.fromString(to_utf8(cmd.argument()), toggle)) {
@@ -1721,7 +1675,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                        bv->translateAndInsert(cmd.argument()[0], this, cur);
                break;
 
-       case LFUN_FLOAT_LIST: {
+       case LFUN_FLOAT_LIST_INSERT: {
                DocumentClass const & tclass = bv->buffer().params().documentClass();
                if (tclass.floats().typeExist(to_utf8(cmd.argument()))) {
                        cur.recordUndo();
@@ -1734,11 +1688,13 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
                                breakParagraph(cur);
                        }
 
-                       docstring const laystr = cur.inset().useEmptyLayout() ?
-                               tclass.emptyLayoutName() :
+                       docstring const laystr = cur.inset().usePlainLayout() ?
+                               tclass.plainLayoutName() :
                                tclass.defaultLayoutName();
                        setLayout(cur, laystr);
                        ParagraphParameters p;
+                       // FIXME If this call were replaced with one to clearParagraphParams(),
+                       // then we could get rid of this method altogether.
                        setParagraphs(cur, p);
                        // FIXME This should be simplified when InsetFloatList takes a 
                        // Buffer in its constructor.
@@ -1907,11 +1863,6 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
 
        case LFUN_APPENDIX:
                flag.setOnOff(cur.paragraph().params().startOfAppendix());
-               return true;
-
-       case LFUN_BIBITEM_INSERT:
-               enable = (cur.paragraph().layout().labeltype == LABEL_BIBLIO
-                         && cur.pos() == 0);
                break;
 
        case LFUN_DIALOG_SHOW_NEW_INSET:
@@ -1981,14 +1932,9 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
        case LFUN_WRAP_INSERT:
                code = WRAP_CODE;
                break;
-       case LFUN_FLOAT_LIST:
+       case LFUN_FLOAT_LIST_INSERT:
                code = FLOAT_LIST_CODE;
                break;
-#if 0
-       case LFUN_LIST_INSERT:
-               code = LIST_CODE;
-               break;
-#endif
        case LFUN_CAPTION_INSERT:
                code = CAPTION_CODE;
                break;
@@ -2029,9 +1975,6 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
                enable = cur.paragraph().insetList().count(OPTARG_CODE)
                        < cur.paragraph().layout().optionalargs;
                break;
-       case LFUN_ENVIRONMENT_INSERT:
-               code = BOX_CODE;
-               break;
        case LFUN_INDEX_INSERT:
                code = INDEX_CODE;
                break;
@@ -2039,6 +1982,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:
@@ -2048,6 +1995,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:
@@ -2174,7 +2125,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:
@@ -2182,6 +2135,15 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
                enable = (cur.pos() > cur.paragraph().beginOfBody());
                break;
 
+       case LFUN_SET_GRAPHICS_GROUP: {
+               InsetGraphics * ins = graphics::getCurrentGraphicsInset(cur);
+               if (!ins) 
+                       enable = false;
+               else
+                       flag.setOnOff(to_utf8(cmd.argument()) == ins->getParams().groupId);
+               break;
+       }
+
        case LFUN_WORD_DELETE_FORWARD:
        case LFUN_WORD_DELETE_BACKWARD:
        case LFUN_LINE_DELETE:
@@ -2215,11 +2177,8 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
        case LFUN_LINE_BEGIN:
        case LFUN_LINE_END:
        case LFUN_CHAR_DELETE_FORWARD:
-       case LFUN_DELETE_FORWARD_SKIP:
        case LFUN_CHAR_DELETE_BACKWARD:
-       case LFUN_DELETE_BACKWARD_SKIP:
        case LFUN_BREAK_PARAGRAPH:
-       case LFUN_BREAK_PARAGRAPH_SKIP:
        case LFUN_PARAGRAPH_SPACING:
        case LFUN_INSET_INSERT:
        case LFUN_WORD_UPCASE:
@@ -2235,7 +2194,6 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
        case LFUN_LINE_INSERT:
        case LFUN_NEWPAGE_INSERT:
        case LFUN_MATH_DISPLAY:
-       case LFUN_MATH_IMPORT_SELECTION:
        case LFUN_MATH_MODE:
        case LFUN_MATH_MACRO:
        case LFUN_MATH_MATRIX:
@@ -2248,8 +2206,8 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
        case LFUN_FONT_UNDERLINE:
        case LFUN_FONT_SIZE:
        case LFUN_LANGUAGE:
-       case LFUN_FONT_FREE_APPLY:
-       case LFUN_FONT_FREE_UPDATE:
+       case LFUN_TEXTSTYLE_APPLY:
+       case LFUN_TEXTSTYLE_UPDATE:
        case LFUN_LAYOUT_PARAGRAPH:
        case LFUN_PARAGRAPH_UPDATE:
        case LFUN_ACCENT_UMLAUT:
@@ -2289,7 +2247,7 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd,
            && (cur.empty() || !cur.inset().insetAllowed(code)))
                enable = false;
 
-       flag.enabled(enable);
+       flag.setEnabled(enable);
        return true;
 }