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_;

Reply via email to