Am Freitag, 3. Februar 2006 10:34 schrieb Martin Vermeer: > OK in principle... but could you list in detail which pieces of the > patch you want included and which excluded?
Here is the patch. It is IMO safe for 1.4.0, and it fixes all language related problems I could think of except changing language inside insets as part of a selection (the stuff related to bug 1973). Note that my replacement for LyXText::bufferFont() still uses LyXText::bv() in some places, so it is only marginal better. Georg
Index: src/buffer.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/buffer.C,v retrieving revision 1.631 diff -u -p -r1.631 buffer.C --- src/buffer.C 26 Jan 2006 10:37:31 -0000 1.631 +++ src/buffer.C 3 Feb 2006 21:40:04 -0000 @@ -1305,6 +1305,9 @@ void Buffer::changeLanguage(Language con for_each(par_iterator_begin(), par_iterator_end(), bind(&Paragraph::changeLanguage, _1, params(), from, to)); + + text().current_font.setLanguage(to); + text().real_current_font.setLanguage(to); } Index: src/bufferparams.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/bufferparams.C,v retrieving revision 1.102 diff -u -p -r1.102 bufferparams.C --- src/bufferparams.C 25 Oct 2005 15:21:47 -0000 1.102 +++ src/bufferparams.C 3 Feb 2006 21:40:04 -0000 @@ -1092,6 +1092,14 @@ LyXTextClass const & BufferParams::getLy } +LyXFont const BufferParams::getFont() const +{ + LyXFont f = getLyXTextClass().defaultfont(); + f.setLanguage(language); + return f; +} + + void BufferParams::readPreamble(LyXLex & lex) { if (lex.getString() != "\\begin_preamble") Index: src/bufferparams.h =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/bufferparams.h,v retrieving revision 1.57 diff -u -p -r1.57 bufferparams.h --- src/bufferparams.h 17 Jul 2005 11:17:12 -0000 1.57 +++ src/bufferparams.h 3 Feb 2006 21:40:04 -0000 @@ -115,6 +115,9 @@ public: /// LyXTextClass const & getLyXTextClass() const; + /// returns the main font for the buffer (document) + LyXFont const getFont() const; + /* this are for the PaperLayout */ /// the papersize PAPER_SIZE papersize; Index: src/lyxtext.h =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/lyxtext.h,v retrieving revision 1.334 diff -u -p -r1.334 lyxtext.h --- src/lyxtext.h 1 Jan 2006 20:28:03 -0000 1.334 +++ src/lyxtext.h 3 Feb 2006 21:40:04 -0000 @@ -341,10 +341,6 @@ public: LyXFont current_font; /// the current font LyXFont real_current_font; - /// our buffer's default layout font. This is textclass specific - /* This is actually never initialized! Should be replaced by a - * defaultfont() method that looks at the textclass (easy). [JMarc]*/ - LyXFont defaultfont_; /// int background_color_; Index: src/paragraph.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/paragraph.C,v retrieving revision 1.418 diff -u -p -r1.418 paragraph.C --- src/paragraph.C 30 Dec 2005 19:02:52 -0000 1.418 +++ src/paragraph.C 3 Feb 2006 21:40:04 -0000 @@ -356,12 +356,12 @@ FontSpan Paragraph::fontSpan(lyx::pos_ty // Gets uninstantiated font setting at position 0 -LyXFont const Paragraph::getFirstFontSettings() const +LyXFont const Paragraph::getFirstFontSettings(BufferParams const & bparams) const { if (!empty() && !pimpl_->fontlist.empty()) return pimpl_->fontlist[0].font(); - return LyXFont(LyXFont::ALL_INHERIT); + return LyXFont(LyXFont::ALL_INHERIT, bparams.language); } @@ -1494,7 +1494,7 @@ Language const * Paragraph::getParLanguage(BufferParams const & bparams) const { if (!empty()) - return getFirstFontSettings().language(); + return getFirstFontSettings(bparams).language(); #ifdef WITH_WARNINGS #warning FIXME we should check the prev par as well (Lgb) #endif Index: src/paragraph.h =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/paragraph.h,v retrieving revision 1.159 diff -u -p -r1.159 paragraph.h --- src/paragraph.h 1 Jan 2006 20:28:03 -0000 1.159 +++ src/paragraph.h 3 Feb 2006 21:40:04 -0000 @@ -273,7 +273,7 @@ public: LyXFont const getFontSettings(BufferParams const &, lyx::pos_type pos) const; /// - LyXFont const getFirstFontSettings() const; + LyXFont const getFirstFontSettings(BufferParams const &) const; /** Get fully instantiated font. If pos == -1, use the layout font attached to this paragraph. Index: src/paragraph_funcs.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/paragraph_funcs.C,v retrieving revision 1.117 diff -u -p -r1.117 paragraph_funcs.C --- src/paragraph_funcs.C 16 Jul 2005 12:02:30 -0000 1.117 +++ src/paragraph_funcs.C 3 Feb 2006 21:40:04 -0000 @@ -157,7 +157,7 @@ void breakParagraph(BufferParams const & // Make sure that we keep the language when // breaking paragrpah. if (tmp->empty()) { - LyXFont changed = tmp->getFirstFontSettings(); + LyXFont changed = tmp->getFirstFontSettings(bparams); LyXFont old = par.getFontSettings(bparams, par.size()); changed.setLanguage(old.language()); tmp->setFont(0, changed); Index: src/rowpainter.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/rowpainter.C,v retrieving revision 1.164 diff -u -p -r1.164 rowpainter.C --- src/rowpainter.C 3 Feb 2006 17:21:51 -0000 1.164 +++ src/rowpainter.C 3 Feb 2006 21:40:05 -0000 @@ -159,7 +159,7 @@ void RowPainter::paintInset(pos_type con // FIXME: We should always use font, see documentation of // noFontChange() in insetbase.h. pi.base.font = inset->noFontChange() ? - bv_.buffer()->params().getLyXTextClass().defaultfont() : + bv_.buffer()->params().getFont() : font; pi.ltr_pos = (text_.bidi.level(pos) % 2 == 0); pi.erased_ = erased_ || isDeletedText(par_, pos); @@ -658,7 +658,8 @@ void RowPainter::paintText() if (running_strikeout && (highly_editable_inset || !is_struckout)) { // Calculate 1/3 height of the buffer's default font int const middle = - yo_ - font_metrics::maxAscent(text_.defaultfont_) / 3; + yo_ - + font_metrics::maxAscent(bv_.buffer()->params().getFont()) / 3; pain_.line(last_strikeout_x, middle, int(x_), middle, LColor::strikeout, Painter::line_solid, Painter::line_thin); running_strikeout = false; @@ -711,7 +712,8 @@ void RowPainter::paintText() if (running_strikeout) { // calculate 1/3 height of the buffer's default font int const middle = - yo_ - font_metrics::maxAscent(text_.defaultfont_) / 3; + yo_ - + font_metrics::maxAscent(bv_.buffer()->params().getFont()) / 3; pain_.line(last_strikeout_x, middle, int(x_), middle, LColor::strikeout, Painter::line_solid, Painter::line_thin); running_strikeout = false; Index: src/text.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/text.C,v retrieving revision 1.639 diff -u -p -r1.639 text.C --- src/text.C 19 Dec 2005 12:30:33 -0000 1.639 +++ src/text.C 3 Feb 2006 21:40:05 -0000 @@ -1692,15 +1692,14 @@ bool LyXText::redoParagraph(pit_type con // redo insets // FIXME: We should always use getFont(), see documentation of // noFontChange() in insetbase.h. - LyXFont const tclassfont = - bv()->buffer()->params().getLyXTextClass().defaultfont(); + LyXFont const bufferfont = bv()->buffer()->params().getFont(); InsetList::iterator ii = par.insetlist.begin(); InsetList::iterator iend = par.insetlist.end(); for (; ii != iend; ++ii) { Dimension dim; int const w = maxwidth_ - leftMargin(pit, ii->pos) - rightMargin(par); LyXFont const & font = ii->inset->noFontChange() ? - tclassfont : + bufferfont : getFont(par, ii->pos); MetricsInfo mi(bv(), font, w); ii->inset->metrics(mi, dim); @@ -2201,8 +2200,9 @@ string LyXText::currentState(LCursor & c // I think we should only show changes from the default // font. (Asger) + // No, from the document font (MV) LyXFont font = real_current_font; - font.reduce(buf.params().getLyXTextClass().defaultfont()); + font.reduce(buf.params().getFont()); // avoid _(...) re-entrance problem string const s = font.stateText(&buf.params()); Index: src/text2.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/text2.C,v retrieving revision 1.640 diff -u -p -r1.640 text2.C --- src/text2.C 30 Jan 2006 16:34:30 -0000 1.640 +++ src/text2.C 3 Feb 2006 21:40:06 -0000 @@ -207,7 +207,7 @@ LyXFont LyXText::getFont(Paragraph const font.realize(outerFont(pit, pars_)); // Realize with the fonts of lesser depth. - font.realize(defaultfont_); + font.realize(params.getFont()); return font; } @@ -221,7 +221,7 @@ LyXFont LyXText::getFont(Paragraph const // font. void LyXText::applyOuterFont(LyXFont & font) const { LyXFont lf(font_); - lf.reduce(defaultfont_); + lf.reduce(bv()->buffer()->params().getFont()); lf.realize(font); lf.setLanguage(font.language()); font = lf; @@ -238,7 +238,7 @@ LyXFont LyXText::getLayoutFont(pit_type LyXFont font = layout->font; // Realize with the fonts of lesser depth. //font.realize(outerFont(pit, paragraphs())); - font.realize(defaultfont_); + font.realize(bv()->buffer()->params().getFont()); return font; } @@ -253,7 +253,7 @@ LyXFont LyXText::getLabelFont(Paragraph LyXFont font = layout->labelfont; // Realize with the fonts of lesser depth. - font.realize(defaultfont_); + font.realize(bv()->buffer()->params().getFont()); return font; } @@ -289,7 +289,7 @@ void LyXText::setCharFont(pit_type pit, if (!isMainText()) layoutfont.realize(font_); - layoutfont.realize(defaultfont_); + layoutfont.realize(bv()->buffer()->params().getFont()); // Now, reduce font against full layout font font.reduce(layoutfont); Index: src/text3.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/text3.C,v retrieving revision 1.323 diff -u -p -r1.323 text3.C --- src/text3.C 31 Dec 2005 11:40:32 -0000 1.323 +++ src/text3.C 3 Feb 2006 21:40:06 -0000 @@ -1114,12 +1114,6 @@ void LyXText::dispatch(LCursor & cur, Fu cur.clearSelection(); LyXFont const old_font = real_current_font; - // Prevents language turds in new lyxtexts under non-english - BufferParams const & bufparams = cur.buffer().params(); - Language const * lang = cur.paragraph().getParLanguage(bufparams); - current_font.setLanguage(lang); - real_current_font.setLanguage(lang); - string::const_iterator cit = cmd.argument.begin(); string::const_iterator end = cmd.argument.end(); for (; cit != end; ++cit) Index: src/insets/insettext.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/insets/insettext.C,v retrieving revision 1.623 diff -u -p -r1.623 insettext.C --- src/insets/insettext.C 11 Jan 2006 14:22:10 -0000 1.623 +++ src/insets/insettext.C 3 Feb 2006 21:40:07 -0000 @@ -80,6 +80,9 @@ InsetText::InsetText(BufferParams const paragraphs().back().layout(bp.getLyXTextClass().defaultLayout()); if (bp.tracking_changes) paragraphs().back().trackChanges(); + // Dispose of the infamous L-shaped cursor. + text_.current_font.setLanguage(bp.language); + text_.real_current_font.setLanguage(bp.language); init(); } @@ -91,6 +94,10 @@ InsetText::InsetText(InsetText const & i drawFrame_ = in.drawFrame_; frame_color_ = in.frame_color_; text_.paragraphs() = in.text_.paragraphs(); + // Hand current buffer language down to "cloned" textinsets + // e.g. tabular cells + text_.current_font = in.text_.current_font; + text_.real_current_font = in.text_.real_current_font; init(); } @@ -176,6 +183,7 @@ void InsetText::metrics(MetricsInfo & mi setViewCache(mi.base.bv); mi.base.textwidth -= 2 * border_; font_ = mi.base.font; + // Hand font through to contained lyxtext: text_.font_ = mi.base.font; text_.metrics(mi, dim); dim.asc += border_;