]> git.lyx.org Git - features.git/blobdiff - src/Text3.cpp
Add proper extension as needed in Save as and Export
[features.git] / src / Text3.cpp
index c75a9c3bcb6a4b10586467fd4a7b13e160260fcb..7422bea31249a1424740c694a5ce4f10e980f00b 100644 (file)
@@ -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();
@@ -321,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());
        }
 
@@ -341,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;
@@ -1861,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:
@@ -1930,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) {
@@ -2100,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
@@ -2520,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;
        }
 
@@ -2558,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");
@@ -3172,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;
@@ -3557,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;
        }