X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FText3.cpp;h=20f3b6bd1ac13372d3284c874b46ec754c133a8f;hb=35361d7af41921b0951085072c738848adf6aaff;hp=9d63fa78b785b6041b062723b61ed67f5b4246e1;hpb=29d849f251c45e99a6dc06b634cb026726454e70;p=lyx.git diff --git a/src/Text3.cpp b/src/Text3.cpp index 9d63fa78b7..20f3b6bd1a 100644 --- a/src/Text3.cpp +++ b/src/Text3.cpp @@ -245,7 +245,8 @@ static bool doInsertInset(Cursor & cur, Text * text, if (edit) inset->edit(cur, true); // Now put this into inset - cur.text()->insertStringAsLines(cur, ds, cur.current_font); + Font const f(inherit_font, cur.current_font.language()); + cur.text()->insertStringAsLines(cur, ds, f); cur.leaveInset(*inset); return true; } @@ -467,9 +468,9 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) cur.noScreenUpdate(); LASSERT(cur.text() == this, /**/); - CursorSlice oldTopSlice = cur.top(); - bool oldBoundary = cur.boundary(); - bool sel = cur.selection(); + CursorSlice const oldTopSlice = cur.top(); + bool const oldBoundary = cur.boundary(); + bool const oldSelection = cur.selection(); // Signals that, even if needsUpdate == false, an update of the // cursor paragraph is required bool singleParUpdate = lyxaction.funcHasFlag(cmd.action(), @@ -477,9 +478,8 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) // Signals that a full-screen update is required bool needsUpdate = !(lyxaction.funcHasFlag(cmd.action(), LyXAction::NoUpdate) || singleParUpdate); - int const last_pid = cur.paragraph().id(); - pos_type const last_pos = cur.pos(); - bool const last_misspelled = lyxrc.spellcheck_continuously && cur.paragraph().isMisspelled(cur.pos()); + bool const last_misspelled = lyxrc.spellcheck_continuously + && cur.paragraph().isMisspelled(cur.pos(), true); FuncCode const act = cmd.action(); switch (act) { @@ -839,7 +839,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) Cursor dummy = cur; dummy.pos() = dummy.pit() = 0; if (cur.bv().checkDepm(dummy, cur)) - cur.forceBufferUpdate();; + cur.forceBufferUpdate(); } } break; @@ -1348,33 +1348,34 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) } case LFUN_QUOTE_INSERT: { - Paragraph & par = cur.paragraph(); + // this avoids a double undo + // FIXME: should not be needed, ideally + if (!cur.selection()) + cur.recordUndo(); + cap::replaceSelection(cur); + + Paragraph const & par = cur.paragraph(); pos_type pos = cur.pos(); + BufferParams const & bufparams = bv->buffer().params(); - Layout const & style = par.layout(); - InsetLayout const & ilayout = cur.inset().getLayout(); - if (!style.pass_thru && !ilayout.isPassThru() - && par.getFontSettings(bufparams, pos).language()->lang() != "hebrew") { - // this avoids a double undo - // FIXME: should not be needed, ideally - if (!cur.selection()) - cur.recordUndo(); - cap::replaceSelection(cur); - pos = cur.pos(); - char_type c; - if (pos == 0) - c = ' '; - else if (cur.prevInset() && cur.prevInset()->isSpace()) - c = ' '; - else + bool const hebrew = + par.getFontSettings(bufparams, pos).language()->lang() == "hebrew"; + bool const allow_inset_quote = !(par.isPassThru() || hebrew); + + if (allow_inset_quote) { + char_type c = ' '; + if (pos > 0 && (!cur.prevInset() || !cur.prevInset()->isSpace())) c = par.getChar(pos - 1); - string arg = to_utf8(cmd.argument()); - cur.insert(new InsetQuotes(cur.buffer(), c, (arg == "single") - ? InsetQuotes::SingleQuotes : InsetQuotes::DoubleQuotes)); + string const arg = to_utf8(cmd.argument()); + InsetQuotes::QuoteTimes const quote_type = (arg == "single") + ? InsetQuotes::SingleQuotes : InsetQuotes::DoubleQuotes; + cur.insert(new InsetQuotes(cur.buffer(), c, quote_type)); cur.posForward(); - } - else + } else { + // The cursor might have been invalidated by the replaceSelection. + cur.buffer()->changed(true); lyx::dispatch(FuncRequest(LFUN_SELF_INSERT, "\"")); + } break; } @@ -1551,6 +1552,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) cur.resetAnchor(); moveCursor(cur, false); + cur.markNewWordPosition(); bv->bookmarkEditPosition(); break; } @@ -1750,6 +1752,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) if (cmd.argument().empty()) cur.errorMessage(from_utf8(N_("Missing argument"))); else { + cur.recordUndo(); string s = to_utf8(cmd.argument()); string const s1 = token(s, ' ', 1); int const nargs = s1.empty() ? 0 : convert(s1); @@ -1888,6 +1891,7 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) Language const * lang = languages.getLanguage(to_utf8(cmd.argument())); if (!lang) break; + selectWordWhenUnderCursor(cur, WHOLE_WORD_STRICT); Font font(ignore_font, lang); toggleAndShow(cur, this, font); break; @@ -2182,9 +2186,10 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) if (!cur.inTexted()) { // move from regular text to math needsUpdate = last_misspelled; - } else if (cur.paragraph().id() != last_pid || cur.pos() != last_pos) { + } else if (oldTopSlice != cur.top() || oldBoundary != cur.boundary()) { // move inside regular text - needsUpdate = last_misspelled || cur.paragraph().isMisspelled(cur.pos()); + needsUpdate = last_misspelled + || cur.paragraph().isMisspelled(cur.pos(), true); } } @@ -2207,11 +2212,10 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) cur.screenUpdateFlags(Update::SinglePar | Update::FitCursor); return; } - if (!needsUpdate && &oldTopSlice.inset() == &cur.inset() && oldTopSlice.idx() == cur.idx() - && !sel // sel is a backup of cur.selection() at the beginning of the function. + && !oldSelection // oldSelection is a backup of cur.selection() at the beginning of the function. && !cur.selection()) // FIXME: it would be better if we could just do this // @@ -2372,7 +2376,7 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd, // make sure we know about such floats if (cit == floats.end() || // and that we know how to generate a list of them - (!cit->second.needsFloatPkg() && cit->second.listCommand().empty())) { + (!cit->second.usesFloatPkg() && cit->second.listCommand().empty())) { flag.setUnknown(true); // probably not necessary, but... enable = false; @@ -2504,38 +2508,38 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd, case LFUN_FONT_EMPH: flag.setOnOff(fontinfo.emph() == FONT_ON); - enable = !cur.inset().getLayout().isPassThru(); + enable = !cur.paragraph().isPassThru(); break; case LFUN_FONT_ITAL: flag.setOnOff(fontinfo.shape() == ITALIC_SHAPE); - enable = !cur.inset().getLayout().isPassThru(); + enable = !cur.paragraph().isPassThru(); break; case LFUN_FONT_NOUN: flag.setOnOff(fontinfo.noun() == FONT_ON); - enable = !cur.inset().getLayout().isPassThru(); + enable = !cur.paragraph().isPassThru(); break; case LFUN_FONT_BOLD: case LFUN_FONT_BOLDSYMBOL: flag.setOnOff(fontinfo.series() == BOLD_SERIES); - enable = !cur.inset().getLayout().isPassThru(); + enable = !cur.paragraph().isPassThru(); break; case LFUN_FONT_SANS: flag.setOnOff(fontinfo.family() == SANS_FAMILY); - enable = !cur.inset().getLayout().isPassThru(); + enable = !cur.paragraph().isPassThru(); break; case LFUN_FONT_ROMAN: flag.setOnOff(fontinfo.family() == ROMAN_FAMILY); - enable = !cur.inset().getLayout().isPassThru(); + enable = !cur.paragraph().isPassThru(); break; case LFUN_FONT_TYPEWRITER: flag.setOnOff(fontinfo.family() == TYPEWRITER_FAMILY); - enable = !cur.inset().getLayout().isPassThru(); + enable = !cur.paragraph().isPassThru(); break; case LFUN_CUT: @@ -2629,7 +2633,7 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd, case LFUN_TAB_INSERT: case LFUN_TAB_DELETE: - enable = cur.inset().getLayout().isPassThru(); + enable = cur.paragraph().isPassThru(); break; case LFUN_SET_GRAPHICS_GROUP: { @@ -2655,7 +2659,7 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd, } case LFUN_LANGUAGE: - enable = !cur.inset().getLayout().isPassThru(); + enable = !cur.paragraph().isPassThru(); flag.setOnOff(to_utf8(cmd.argument()) == cur.real_current_font.language()->lang()); break; @@ -2707,7 +2711,7 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd, case LFUN_FONT_UWAVE: case LFUN_TEXTSTYLE_APPLY: case LFUN_TEXTSTYLE_UPDATE: - enable = !cur.inset().getLayout().isPassThru(); + enable = !cur.paragraph().isPassThru(); break; case LFUN_WORD_DELETE_FORWARD: