On Fri, Feb 24, 2006 at 02:21:04PM +0100, Georg Baum wrote:
> Jean-Marc Lasgouttes wrote:
 
> > It seems to me from your discussions with Martin that the complete fix
> > is not very clear yet :)
> 
> I think it is clear now. A combination of Martins and my patches would fix
> all problems. What is missing now is the actual patch and testing.

Attached your patch with the current_font/real_current_font thing moved
to the dispatcher. Tested as follows:

- entered an ERT, entered text. Changed (in multilingual doc) language.
OK, no blue line.

- entered ERT, entered text, deleted it, entered new text. Changed
language: OK.

- entered multi-paragraph ERT, where empty paragraphs were created by
two different methods:
1) press ENTER at end of paragraph
2) press ENTER at start of paragraph

Changed doc language -> no blue lines appearing.

- Saved the doc with ERT's in it, and reloaded -> no blue lines

- Changed again doc language -> still no blue lines.

The patch may be a bit overkill, but it certainly works.

- Martin

Index: src/lyxfont.C
===================================================================
--- src/lyxfont.C       (revision 13276)
+++ src/lyxfont.C       (working copy)
@@ -726,7 +726,8 @@
                if (col_str == "inherit") col_str = "default";
                os << "\\color " << col_str << "\n";
        }
-       if (orgfont.language() != language()) {
+       if (orgfont.language() != language() &&
+           language() != latex_language) {
                if (language())
                        os << "\\lang " << language()->lang() << "\n";
                else
Index: src/insets/insetert.C
===================================================================
--- src/insets/insetert.C       (revision 13276)
+++ src/insets/insetert.C       (working copy)
@@ -83,23 +83,19 @@
 }
 
 
+#if 0
 InsetERT::InsetERT(BufferParams const & bp,
                   Language const *, string const & contents, CollapseStatus 
status)
        : InsetCollapsable(bp, status)
 {
-       //LyXFont font(LyXFont::ALL_INHERIT, lang);
-       LyXFont font;
-       getDrawFont(font);
-       string::const_iterator cit = contents.begin();
-       string::const_iterator end = contents.end();
-       pos_type pos = 0;
-       for (; cit != end; ++cit)
-               paragraphs().begin()->insertChar(pos++, *cit, font);
+       LyXFont font(LyXFont::ALL_INHERIT, latex_language);
+       paragraphs().begin()->insert(0, contents, font);
 
        // the init has to be after the initialization of the paragraph
        // because of the label settings (draw_label for ert insets).
        init();
 }
+#endif
 
 
 InsetERT::~InsetERT()
@@ -115,6 +111,30 @@
 }
 
 
+void InsetERT::read(Buffer const & buf, LyXLex & lex)
+{
+       InsetCollapsable::read(buf, lex);
+
+       // Force default font
+       // This avoids paragraphs in buffer language that would have a
+       // foreign language after a document langauge change, and it ensures
+       // that all new text in ERT gets the "latex" language, since new text
+       // inherits the language from the last position of the existing text.
+       // As a side effect this makes us also robust against bugs in LyX
+       // that might lead to font changes in ERT in .lyx files.
+       LyXFont font(LyXFont::ALL_INHERIT, latex_language);
+       ParagraphList::iterator par = paragraphs().begin();
+       ParagraphList::iterator const end = paragraphs().end();
+       while (par != end) {
+               pos_type siz = par->size();
+               for (pos_type i = 0; i <= siz; ++i) {
+                       par->setFont(i, font);
+               }
+               ++par;
+       }
+}
+
+
 string const InsetERT::editMessage() const
 {
        return _("Opened ERT Inset");
@@ -222,8 +242,8 @@
                LyXLayout_ptr const layout =
                        bp.getLyXTextClass().defaultLayout();
                LyXFont font = layout->font;
-               // We need to set the language for non-english documents
-               font.setLanguage(bp.language);
+               // ERT contents has always latex_language
+               font.setLanguage(latex_language);
                ParagraphList::iterator const end = paragraphs().end();
                for (ParagraphList::iterator par = paragraphs().begin();
                     par != end; ++par) {
@@ -239,6 +259,9 @@
                break;
        }
        default:
+               // Force any new text to latex_language:
+               text_.current_font.setLanguage(latex_language);
+               text_.real_current_font.setLanguage(latex_language);
                InsetCollapsable::doDispatch(cur, cmd);
                break;
        }
@@ -390,8 +413,7 @@
 {
        LyXFont tmpfont = pi.base.font;
        getDrawFont(pi.base.font);
-       // I don't understand why the above .realize isn't needed, or
-       // even wanted, here. It just works. -- MV 10.04.2005
+       pi.base.font.realize(tmpfont);
        InsetCollapsable::draw(pi, x, y);
        pi.base.font = tmpfont;
 }
Index: src/insets/insetert.h
===================================================================
--- src/insets/insetert.h       (revision 13276)
+++ src/insets/insetert.h       (working copy)
@@ -31,9 +31,11 @@
 public:
        ///
        InsetERT(BufferParams const &, CollapseStatus status = Open);
+#if 0
        ///
        InsetERT(BufferParams const &,
                 Language const *, std::string const & contents, CollapseStatus 
status);
+#endif
        ///
        ~InsetERT();
        ///
@@ -41,6 +43,8 @@
        ///
        void write(Buffer const & buf, std::ostream & os) const;
        ///
+       void read(Buffer const & buf, LyXLex & lex);
+       ///
        std::string const editMessage() const;
        ///
        bool insetAllowed(InsetBase::Code code) const;

Attachment: pgp9UBDfXfGvS.pgp
Description: PGP signature

Reply via email to