]> git.lyx.org Git - lyx.git/blobdiff - src/Paragraph.cpp
Accelerators
[lyx.git] / src / Paragraph.cpp
index 6c90297e07d4cd8d1400b13b0231528e94b93f58..2465cc4101e88c425c616bd3152965fa69fa52e6 100644 (file)
@@ -1033,10 +1033,10 @@ void Paragraph::Private::latexInset(BufferParams const & bparams,
                close = true;
        }
 
-       if (open_font && (!inset->inheritFont() || fontswitch_inset)) {
+       if (open_font && fontswitch_inset) {
                bool lang_closed = false;
                // Close language if needed
-               if (closeLanguage) {
+               if (closeLanguage && !lang_switched_at_inset) {
                        // We need prev_font here as language changes directly at inset
                        // will only be started inside the inset.
                        Font const prev_font = (i > 0) ?
@@ -1087,6 +1087,12 @@ void Paragraph::Private::latexInset(BufferParams const & bparams,
                        runparams.local_font = &basefont;
        }
 
+       if (fontswitch_inset && !closeLanguage && fontswitch_inset) {
+               // The directionality has been switched at inset.
+               // Force markup inside.
+               runparams.local_font = &basefont;
+       }
+
        size_t const previous_row_count = os.texrow().rows();
 
        try {
@@ -2609,6 +2615,7 @@ void Paragraph::latex(BufferParams const & bparams,
                }
 
                // Do we need to close the previous font?
+               bool langClosed = false;
                if (open_font &&
                    ((current_font != running_font
                      || current_font.language() != running_font.language())
@@ -2644,6 +2651,7 @@ void Paragraph::latex(BufferParams const & bparams,
                        }
                        running_font = basefont;
                        open_font = false;
+                       langClosed = true;
                }
 
                // if necessary, close language environment before opening CJK
@@ -2660,7 +2668,8 @@ void Paragraph::latex(BufferParams const & bparams,
                }
 
                // Switch file encoding if necessary (and allowed)
-               if (!runparams.pass_thru && !style.pass_thru &&
+               if ((!fontswitch_inset || closeLanguage)
+                   && !runparams.pass_thru && !style.pass_thru &&
                    runparams.encoding->package() != Encoding::none &&
                    current_font.language()->encoding()->package() != Encoding::none) {
                        pair<bool, int> const enc_switch =
@@ -2686,59 +2695,63 @@ void Paragraph::latex(BufferParams const & bparams,
                }
 
                // Do we need to change font?
-               if (!fontswitch_inset &&
-                   (current_font != running_font ||
+               if ((current_font != running_font ||
                     current_font.language() != running_font.language())
                    && i != body_pos - 1)
                {
-                       if (in_ct_deletion) {
-                               // We have to close and then reopen \lyxdeleted,
-                               // as strikeout needs to be on lowest level.
-                               bool needPar = false;
-                               OutputParams rp = runparams;
-                               column += running_font.latexWriteEndChanges(
-                                       os, bparams, rp, basefont,
-                                       basefont, needPar);
-                               os << '}';
-                               column += 1;
-                       }
-                       otexstringstream ots;
-                       InsetText const * textinset = inInset().asInsetText();
-                       bool const cprotect = textinset
-                               ? textinset->hasCProtectContent(runparams.moving_arg)
-                                 && !textinset->text().isMainText()
-                               : false;
-                       column += current_font.latexWriteStartChanges(ots, bparams,
-                                                                     runparams, basefont, last_font, false,
-                                                                     cprotect);
-                       // Check again for display math in ulem commands as a
-                       // font change may also occur just before a math inset.
-                       if (runparams.inDisplayMath && !deleted_display_math
-                           && runparams.inulemcmd) {
-                               if (os.afterParbreak())
-                                       os << "\\noindent";
-                               else
-                                       os << "\\\\\n";
-                       }
-                       running_font = current_font;
-                       open_font = true;
-                       docstring fontchange = ots.str();
-                       os << fontchange;
-                       // check whether the fontchange ends with a \\textcolor
-                       // modifier and the text starts with a space. If so we
-                       // need to add } in order to prevent \\textcolor from gobbling
-                       // the space (bug 4473).
-                       docstring const last_modifier = rsplit(fontchange, '\\');
-                       if (prefixIs(last_modifier, from_ascii("textcolor")) && c == ' ')
-                               os << from_ascii("{}");
-                       else if (ots.terminateCommand())
-                               os << termcmd;
-                       if (in_ct_deletion) {
-                               // We have to close and then reopen \lyxdeleted,
-                               // as strikeout needs to be on lowest level.
-                               OutputParams rp = runparams;
-                               column += Changes::latexMarkChange(os, bparams,
-                                       Change(Change::UNCHANGED), change, rp);
+                       if (!fontswitch_inset) {
+                               if (in_ct_deletion) {
+                                       // We have to close and then reopen \lyxdeleted,
+                                       // as strikeout needs to be on lowest level.
+                                       bool needPar = false;
+                                       OutputParams rp = runparams;
+                                       column += running_font.latexWriteEndChanges(
+                                               os, bparams, rp, basefont,
+                                               basefont, needPar);
+                                       os << '}';
+                                       column += 1;
+                               }
+                               otexstringstream ots;
+                               InsetText const * textinset = inInset().asInsetText();
+                               bool const cprotect = textinset
+                                       ? textinset->hasCProtectContent(runparams.moving_arg)
+                                         && !textinset->text().isMainText()
+                                       : false;
+                               column += current_font.latexWriteStartChanges(ots, bparams,
+                                                                             runparams, basefont, last_font, false,
+                                                                             cprotect);
+                               // Check again for display math in ulem commands as a
+                               // font change may also occur just before a math inset.
+                               if (runparams.inDisplayMath && !deleted_display_math
+                                   && runparams.inulemcmd) {
+                                       if (os.afterParbreak())
+                                               os << "\\noindent";
+                                       else
+                                               os << "\\\\\n";
+                               }
+                               running_font = current_font;
+                               open_font = true;
+                               docstring fontchange = ots.str();
+                               os << fontchange;
+                               // check whether the fontchange ends with a \\textcolor
+                               // modifier and the text starts with a space. If so we
+                               // need to add } in order to prevent \\textcolor from gobbling
+                               // the space (bug 4473).
+                               docstring const last_modifier = rsplit(fontchange, '\\');
+                               if (prefixIs(last_modifier, from_ascii("textcolor")) && c == ' ')
+                                       os << from_ascii("{}");
+                               else if (ots.terminateCommand())
+                                       os << termcmd;
+                               if (in_ct_deletion) {
+                                       // We have to close and then reopen \lyxdeleted,
+                                       // as strikeout needs to be on lowest level.
+                                       OutputParams rp = runparams;
+                                       column += Changes::latexMarkChange(os, bparams,
+                                               Change(Change::UNCHANGED), change, rp);
+                               }
+                       } else {
+                               running_font = current_font;
+                               open_font = !langClosed;
                        }
                }
 
@@ -4531,7 +4544,7 @@ Language * Paragraph::Private::locateSpellRange(
                // hop to end of word
                while (last < to && !owner_->isWordSeparator(last)) {
                        Inset const * inset = owner_->getInset(last);
-                       if (inset && inset->lyxCode() == SPECIALCHAR_CODE) {
+                       if (inset && dynamic_cast<const InsetSpecialChar *>(inset)) {
                                // check for "invisible" letters such as ligature breaks
                                odocstringstream os;
                                inset->toString(os);