X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FText3.cpp;h=70453620ac9251541b382b1614aa453fb365ed3e;hb=4db3e641ed6765e005343010cb90ee8af26f8f99;hp=cdc1bd488bc4d0c45f7fe2ae55ccd534050f0b07;hpb=3e8bfd8bd6e2ce6c1293cfe178a847a79ea32d49;p=lyx.git diff --git a/src/Text3.cpp b/src/Text3.cpp index cdc1bd488b..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 @@ -488,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(); @@ -648,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; @@ -679,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; @@ -867,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; @@ -921,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; @@ -940,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); @@ -1100,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': @@ -1239,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? @@ -1251,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") @@ -1270,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); } @@ -1391,21 +1377,14 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) case LFUN_ENVIRONMENT_SPLIT: { Paragraph const & para = cur.paragraph(); docstring const layout = para.layout().name(); - if (cur.pos() > 0) { - FuncRequest cmd(LFUN_PARAGRAPH_BREAK); - lyx::dispatch(cmd); - } + if (cur.pos() > 0) + lyx::dispatch(FuncRequest(LFUN_PARAGRAPH_BREAK)); bool const morecont = cur.lastpos() > cur.pos(); - FuncRequest cmd2(LFUN_LAYOUT, "Separator"); - lyx::dispatch(cmd2); - FuncRequest cmd3(LFUN_PARAGRAPH_BREAK, "inverse"); - lyx::dispatch(cmd3); - if (morecont) { - FuncRequest cmd4(LFUN_DOWN); - lyx::dispatch(cmd4); - } - FuncRequest cmd5(LFUN_LAYOUT, layout); - lyx::dispatch(cmd5); + 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; } @@ -1454,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 = @@ -1931,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; } @@ -2382,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; @@ -2535,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, @@ -2773,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)) @@ -2887,12 +2889,12 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd, break; case LFUN_ENVIRONMENT_SPLIT: { - if (!cur.buffer()->params().documentClass().hasLayout(from_ascii("Separator")) - || !cur.paragraph().layout().isEnvironment()) { - enable = false; + if (cur.paragraph().layout().isEnvironment() + && cur.buffer()->params().documentClass().hasLayout(from_ascii("Separator"))) { + enable = true; break; } - enable = true; + enable = false; break; }