X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FText3.cpp;h=70453620ac9251541b382b1614aa453fb365ed3e;hb=4db3e641ed6765e005343010cb90ee8af26f8f99;hp=421d8f428dc37255400d5a215f568a8a936aacb7;hpb=dcaab11b09d9be2c7b561f9028d30d5a624ecbb9;p=lyx.git diff --git a/src/Text3.cpp b/src/Text3.cpp index 421d8f428d..70453620ac 100644 --- a/src/Text3.cpp +++ b/src/Text3.cpp @@ -148,7 +148,7 @@ static void mathDispatch(Cursor & cur, FuncRequest const & cmd, bool display) #endif cur.insert(new InsetMathHull(cur.buffer(), hullSimple)); #ifdef ENABLE_ASSERTIONS - LASSERT(old_pos == cur.pos(), /**/); + LATTEST(old_pos == cur.pos()); #endif cur.nextInset()->edit(cur, true); // don't do that also for LFUN_MATH_MODE @@ -295,6 +295,8 @@ static bool doInsertInset(Cursor & cur, Text * text, // Merge multiple paragraphs -- hack while (cur.lastpit() > 0) mergeParagraph(bparams, cur.text()->paragraphs(), 0); + if (cmd.action() == LFUN_FLEX_INSERT) + return true; Cursor old = cur; cur.leaveInset(*inset); if (cmd.action() == LFUN_PREVIEW_INSERT @@ -486,7 +488,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) // at the end? cur.noScreenUpdate(); - LASSERT(cur.text() == this, /**/); + LBUFERR(this == cur.text()); CursorSlice const oldTopSlice = cur.top(); bool const oldBoundary = cur.boundary(); bool const oldSelection = cur.selection(); @@ -646,12 +648,8 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) // provide it with two different cursors. Cursor dummy = cur; dummy.pos() = dummy.pit() = 0; - if (cur.bv().checkDepm(dummy, cur)) { + if (cur.bv().checkDepm(dummy, cur)) cur.forceBufferUpdate(); - // DEPM may have requested a screen update - cur.screenUpdateFlags( - cur.screenUpdate() | dummy.screenUpdate()); - } } } break; @@ -677,12 +675,8 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) Cursor dummy = cur; dummy.pos() = cur.lastpos(); dummy.pit() = cur.lastpit(); - if (cur.bv().checkDepm(dummy, cur)) { + if (cur.bv().checkDepm(dummy, cur)) cur.forceBufferUpdate(); - // DEPM may have requested a screen update - cur.screenUpdateFlags( - cur.screenUpdate() | dummy.screenUpdate()); - } } } break; @@ -865,12 +859,8 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) // provide it with two different cursors. Cursor dummy = cur; dummy.pos() = dummy.pit() = 0; - if (cur.bv().checkDepm(dummy, cur)) { + if (cur.bv().checkDepm(dummy, cur)) cur.forceBufferUpdate(); - // DEPM may have requested a screen update - cur.screenUpdateFlags( - cur.screenUpdate() | dummy.screenUpdate()); - } } } break; @@ -919,12 +909,8 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) Cursor dummy = cur; dummy.pos() = cur.lastpos(); dummy.pit() = cur.lastpit(); - if (cur.bv().checkDepm(dummy, cur)) { + if (cur.bv().checkDepm(dummy, cur)) cur.forceBufferUpdate(); - // DEPM may have requested a screen update - cur.screenUpdateFlags( - cur.screenUpdate() | dummy.screenUpdate()); - } } } break; @@ -938,15 +924,12 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) case LFUN_NEWLINE_INSERT: { InsetNewlineParams inp; docstring arg = cmd.argument(); - // this avoids a double undo - // FIXME: should not be needed, ideally - if (!cur.selection()) - cur.recordUndo(); - cap::replaceSelection(cur); if (arg == "linebreak") inp.kind = InsetNewlineParams::LINEBREAK; else inp.kind = InsetNewlineParams::NEWLINE; + cap::replaceSelection(cur); + cur.recordUndo(); cur.insert(new InsetNewline(inp)); cur.posForward(); moveCursor(cur, false); @@ -1098,7 +1081,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) /* Paragraph & par = pars_[cur.pit()]; if (inset->lyxCode() == LABEL_CODE - && par.layout().labeltype == LABEL_COUNTER) { + && !par.layout().counter.empty() { // Go to the end of the paragraph // Warning: Because of Change-Tracking, the last // position is 'size()' and not 'size()-1': @@ -1237,7 +1220,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) case LFUN_PASTE: { cur.message(_("Paste")); - LASSERT(cur.selBegin().idx() == cur.selEnd().idx(), /**/); + LASSERT(cur.selBegin().idx() == cur.selEnd().idx(), break); cap::replaceSelection(cur); // without argument? @@ -1249,11 +1232,15 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) && !theClipboard().hasTextContents()) pasteClipboardGraphics(cur, bv->buffer().errorList("Paste")); else - pasteClipboardText(cur, bv->buffer().errorList("Paste")); + pasteClipboardText(cur, bv->buffer().errorList("Paste"), true); } else if (isStrUnsignedInt(arg)) { // we have a numerical argument pasteFromStack(cur, bv->buffer().errorList("Paste"), convert(arg)); + } else if (arg == "html" || arg == "latex") { + Clipboard::TextType type = (arg == "html") ? + Clipboard::HtmlTextType : Clipboard::LaTeXTextType; + pasteClipboardText(cur, bv->buffer().errorList("Paste"), true, type); } else { Clipboard::GraphicsType type = Clipboard::AnyGraphicsType; if (arg == "pdf") @@ -1268,9 +1255,10 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) type = Clipboard::EmfGraphicsType; else if (arg == "wmf") type = Clipboard::WmfGraphicsType; - else - LASSERT(false, /**/); + // We used to assert, but couldn't the argument come from, say, the + // minibuffer and just be mistyped? + LYXERR0("Unrecognized graphics type: " << arg); pasteClipboardGraphics(cur, bv->buffer().errorList("Paste"), type); } @@ -1372,6 +1360,32 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) if (change_layout) setLayout(cur, layout); + Layout::LaTeXArgMap args = tclass[layout].args(); + Layout::LaTeXArgMap::const_iterator lait = args.begin(); + Layout::LaTeXArgMap::const_iterator const laend = args.end(); + for (; lait != laend; ++lait) { + Layout::latexarg arg = (*lait).second; + if (arg.autoinsert) { + FuncRequest cmd(LFUN_ARGUMENT_INSERT, (*lait).first); + lyx::dispatch(cmd); + } + } + + break; + } + + case LFUN_ENVIRONMENT_SPLIT: { + Paragraph const & para = cur.paragraph(); + docstring const layout = para.layout().name(); + if (cur.pos() > 0) + lyx::dispatch(FuncRequest(LFUN_PARAGRAPH_BREAK)); + bool const morecont = cur.lastpos() > cur.pos(); + lyx::dispatch(FuncRequest(LFUN_LAYOUT, "Separator")); + lyx::dispatch(FuncRequest(LFUN_PARAGRAPH_BREAK, "inverse")); + if (morecont) + lyx::dispatch(FuncRequest(LFUN_DOWN)); + lyx::dispatch(FuncRequest(LFUN_LAYOUT, layout)); + break; } @@ -1419,14 +1433,14 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) } case LFUN_QUOTE_INSERT: { - // this avoids a double undo - // FIXME: should not be needed, ideally - if (!cur.selection()) - cur.recordUndo(); cap::replaceSelection(cur); + cur.recordUndo(); Paragraph const & par = cur.paragraph(); pos_type pos = cur.pos(); + // Ignore deleted text before cursor + while (pos > 0 && par.isDeleted(pos - 1)) + --pos; BufferParams const & bufparams = bv->buffer().params(); bool const hebrew = @@ -1685,7 +1699,6 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) 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_PHANTOM_INSERT: @@ -1706,6 +1719,37 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) cur.forceBufferUpdate(); break; + case LFUN_FLEX_INSERT: { + // Open the inset, and move the current selection + // inside it. + bool const sel = cur.selection(); + doInsertInset(cur, this, cmd, true, true); + // Insert auto-insert arguments + bool autoargs = false; + Layout::LaTeXArgMap args = cur.inset().getLayout().latexargs(); + Layout::LaTeXArgMap::const_iterator lait = args.begin(); + Layout::LaTeXArgMap::const_iterator const laend = args.end(); + for (; lait != laend; ++lait) { + Layout::latexarg arg = (*lait).second; + if (arg.autoinsert) { + // The cursor might have been invalidated by the replaceSelection. + cur.buffer()->changed(true); + FuncRequest cmd(LFUN_ARGUMENT_INSERT, (*lait).first); + lyx::dispatch(cmd); + autoargs = true; + } + } + if (!autoargs) { + if (sel) + cur.leaveInset(cur.inset()); + cur.posForward(); + } + // Some insets are numbered, others are shown in the outline pane so + // let's update the labels and the toc backend. + cur.forceBufferUpdate(); + break; + } + case LFUN_TABULAR_INSERT: // if there were no arguments, just open the dialog if (doInsertInset(cur, this, cmd, false, true)) @@ -1866,7 +1910,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) cap::replaceSelection(cur); cur.insert(new InsetMathHull(cur.buffer(), hullSimple)); checkAndActivateInset(cur, true); - LASSERT(cur.inMathed(), /**/); + LASSERT(cur.inMathed(), break); cur.dispatch(cmd); break; } @@ -2317,7 +2361,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) bool Text::getStatus(Cursor & cur, FuncRequest const & cmd, FuncStatus & flag) const { - LASSERT(cur.text() == this, /**/); + LBUFERR(this == cur.text()); FontInfo const & fontinfo = cur.real_current_font.fontInfo(); bool enable = true; @@ -2470,11 +2514,20 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd, } break; } - case LFUN_CAPTION_INSERT: + case LFUN_CAPTION_INSERT: { code = CAPTION_CODE; - // not allowed in description items - enable = !inDescriptionItem(cur); + string arg = cmd.getArg(0); + bool varia = arg != "LongTableNoNumber"; + if (cur.depth() > 0) { + if (&cur[cur.depth() - 1].inset()) + varia = cur[cur.depth() - 1].inset().allowsCaptionVariation(arg); + } + // not allowed in description items, + // and in specific insets + enable = !inDescriptionItem(cur) + && (varia || arg.empty() || arg == "Standard"); break; + } case LFUN_NOTE_INSERT: code = NOTE_CODE; // in commands (sections etc.) and description items, @@ -2525,10 +2578,7 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd, break; } Layout const & lay = cur.paragraph().layout(); - Layout::LaTeXArgMap args = lay.latexargs(); - Layout::LaTeXArgMap itemargs = lay.itemargs(); - if (!itemargs.empty()) - args.insert(itemargs.begin(), itemargs.end()); + Layout::LaTeXArgMap args = lay.args(); Layout::LaTeXArgMap::const_iterator const lait = args.find(arg); if (lait != args.end()) { @@ -2711,6 +2761,20 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd, break; } + // explicit text type? + if (arg == "html") { + // Do not enable for PlainTextType, since some tidying in the + // frontend is needed for HTML, which is too unsafe for plain text. + enable = theClipboard().hasTextContents(Clipboard::HtmlTextType); + break; + } else if (arg == "latex") { + // LaTeX is usually not available on the clipboard with + // the correct MIME type, but in plain text. + enable = theClipboard().hasTextContents(Clipboard::PlainTextType) || + theClipboard().hasTextContents(Clipboard::LaTeXTextType); + break; + } + // explicit graphics type? Clipboard::GraphicsType type = Clipboard::AnyGraphicsType; if ((arg == "pdf" && (type = Clipboard::PdfGraphicsType)) @@ -2823,7 +2887,17 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd, case LFUN_LAYOUT: enable = !cur.inset().forcePlainLayout(); break; - + + case LFUN_ENVIRONMENT_SPLIT: { + if (cur.paragraph().layout().isEnvironment() + && cur.buffer()->params().documentClass().hasLayout(from_ascii("Separator"))) { + enable = true; + break; + } + enable = false; + break; + } + case LFUN_LAYOUT_PARAGRAPH: case LFUN_PARAGRAPH_PARAMS: case LFUN_PARAGRAPH_PARAMS_APPLY: