X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FText3.cpp;h=7422bea31249a1424740c694a5ce4f10e980f00b;hb=61d68d05bd0f2172ab9406f23dc2640e6b9ac56b;hp=1623996ec665aa052bc49ec173e349a3bb079438;hpb=e366dba9bfb702a83f697e9eb75aa0a1ad5ef3ce;p=features.git diff --git a/src/Text3.cpp b/src/Text3.cpp index 1623996ec6..7422bea312 100644 --- a/src/Text3.cpp +++ b/src/Text3.cpp @@ -118,6 +118,11 @@ static void toggleAndShow(Cursor & cur, Text * text, cur.real_current_font)) text->setCursor(cur, cur.pit(), cur.pos(), false, !cur.boundary()); + if (font.language() != ignore_language) + // We need a buffer update if we change the language + // (e.g., with info insets or if the selection contains + // a par label) + cur.forceBufferUpdate(); } } @@ -238,7 +243,8 @@ static void ipaChar(Cursor & cur, InsetIPAChar::Kind kind) static bool doInsertInset(Cursor & cur, Text * text, - FuncRequest const & cmd, bool edit, bool pastesel) + FuncRequest const & cmd, bool edit, + bool pastesel, bool resetfont = false) { Buffer & buffer = cur.bv().buffer(); BufferParams const & bparams = buffer.params(); @@ -299,8 +305,11 @@ static bool doInsertInset(Cursor & cur, Text * text, * paragraph and the inset allows setting layout * FIXME: this does not work as expected when change tracking is on * However, we do not really know what to do in this case. + * FIXME: figure out a good test in the environment case (see #12251). */ - if (cur.paragraph().empty() && !inset->forcePlainLayout()) { + if (cur.paragraph().layout().isCommand() + && cur.paragraph().empty() + && !inset->forcePlainLayout()) { cur.paragraph().setPlainOrDefaultLayout(bparams.documentClass()); move_layout = true; } @@ -318,7 +327,7 @@ static bool doInsertInset(Cursor & cur, Text * text, if (inset_text) { Font const & font = inset->inheritFont() ? cur.bv().textMetrics(text).displayFont(cur.pit(), cur.pos()) - : buffer.params().getFont(); + : bparams.getFont(); inset_text->setOuterFont(cur.bv(), font.fontInfo()); } @@ -338,6 +347,13 @@ static bool doInsertInset(Cursor & cur, Text * text, cur.clearSelection(); // bug 393 cur.finishUndo(); if (inset_text) { + if (resetfont) { + // Reset of font (not language) is requested. + // Used by InsetIndex (#11961). + Language const * lang = cur.getFont().language(); + Font font(bparams.getFont().fontInfo(), lang); + cur.paragraph().resetFonts(font); + } inset_text->fixParagraphsFont(); cur.pos() = 0; cur.pit() = 0; @@ -1521,7 +1537,8 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) pasteFromStack(cur, bv->buffer().errorList("Paste"), 0); else if (theClipboard().hasTextContents()) { if (pasteClipboardText(cur, bv->buffer().errorList("Paste"), - true, Clipboard::AnyTextType)) + !cur.paragraph().parbreakIsNewline(), + Clipboard::AnyTextType)) tryGraphics = false; } if (tryGraphics && theClipboard().hasGraphicsContents()) @@ -1857,8 +1874,9 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) bvcur.resetAnchor(); if (!bv->mouseSetCursor(cur, cmd.modifier() == ShiftModifier)) cur.screenUpdateFlags(Update::SinglePar | Update::FitCursor); - if (bvcur.wordSelection()) - selectWord(bvcur, WHOLE_WORD); + // FIXME: move this to mouseSetCursor? + if (bvcur.wordSelection() && bvcur.inTexted()) + expandWordSel(bvcur); break; case mouse_button::button2: @@ -1926,6 +1944,8 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) // We continue with our existing selection or start a new one, so don't // reset the anchor. bvcur.setCursor(cur); + if (bvcur.wordSelection() && bvcur.inTexted()) + expandWordSel(bvcur); bvcur.selection(true); bvcur.setCurrentFont(); if (cur.top() == old) { @@ -2096,16 +2116,19 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) case LFUN_INDEX_INSERT: case LFUN_PREVIEW_INSERT: case LFUN_SCRIPT_INSERT: - case LFUN_IPA_INSERT: + case LFUN_IPA_INSERT: { + // Indexes reset font formatting (#11961) + bool const resetfont = cmd.action() == LFUN_INDEX_INSERT; // Open the inset, and move the current selection // inside it. - doInsertInset(cur, this, cmd, true, true); + doInsertInset(cur, this, cmd, true, true, resetfont); cur.posForward(); cur.setCurrentFont(); // 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_FLEX_INSERT: { // Open the inset, and move the current selection @@ -2128,6 +2151,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) // leave this now in order to insert the next one. if (inautoarg) { cur.leaveInset(cur.inset()); + cur.setCurrentFont(); cur.posForward(); if (arg.insertonnewline && cur.pos() > 0) { FuncRequest cmd2(LFUN_PARAGRAPH_BREAK); @@ -2515,10 +2539,6 @@ 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; } @@ -2553,10 +2573,6 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) freeFonts.push(make_pair(props, font)); toggleall = toggle; toggleAndShow(cur, this, font, toggleall); - // We need a buffer update if we change the language - // of an info inset - if (cur.insetInSelection(INFO_CODE)) - cur.forceBufferUpdate(); cur.message(bformat(_("Text properties applied: %1$s"), props)); } else LYXERR0("Invalid argument of textstyle-update"); @@ -3167,13 +3183,17 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd, case LFUN_FLEX_INSERT: { code = FLEX_CODE; string s = cmd.getArg(0); - InsetLayout il = - cur.buffer()->params().documentClass().insetLayout(from_utf8(s)); - if (il.lyxtype() != InsetLyXType::CHARSTYLE && - il.lyxtype() != InsetLyXType::CUSTOM && - il.lyxtype ()!= InsetLyXType::STANDARD) + if (!cur.buffer()->params().documentClass().hasInsetLayout(from_utf8(s))) enable = false; - break; + else { + InsetLayout il = + cur.buffer()->params().documentClass().insetLayout(from_utf8(s)); + if (il.lyxtype() != InsetLyXType::CHARSTYLE && + il.lyxtype() != InsetLyXType::CUSTOM && + il.lyxtype ()!= InsetLyXType::STANDARD) + enable = false; + } + break; } case LFUN_BOX_INSERT: code = BOX_CODE; @@ -3552,8 +3572,10 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd, docstring const req_layout = ignoreautonests ? from_utf8(cmd.getArg(0)) : cmd.argument(); docstring const layout = resolveLayout(req_layout, cur); - enable = !owner_->forcePlainLayout() && !layout.empty(); - status.setOnOff(!owner_->forcePlainLayout() && isAlreadyLayout(layout, cur)); + // FIXME: make this work in multicell selection case + enable = !owner_->forcePlainLayout() && !layout.empty() && !cur.selIsMultiCell(); + status.setOnOff(!owner_->forcePlainLayout() && !cur.selIsMultiCell() + && isAlreadyLayout(layout, cur)); break; }