On Thu, 2006-02-02 at 11:13 +0100, Helge Hafting wrote:
> Martin Vermeer wrote:
> 
> >Attached. Hopefully more luck this time.
> >  
> >
> This is much better!
> I have tested with text, footnote, marginal note, branch, ERT, float, 
> table and minipage.
> All of them uses correct language now, there are no wrong blue lines or L-
> cursors.
> 
> There is still the smaller issue of changing language on a big selection.
> The language change will propagate into minipages and branches found in 
> the selection,
> as I expect.  The language inside floats, table cells, footnotes and 
> margin notes
> is not updated though, so I have to change those one by one.
> 
> It may make sense not to update the font inside a footnote in a 
> selection, seeing
> how footnotes are typeset out of the main text with their own formatting 
> rules.
> (Footnote in a heading don't get a big font either.)  But language is 
> different.

Hmmm. Actually this is straightforwardly fixable. It's just a policy
choice, how we understand noFontChange(). See attached. Only text.C and
rowpainter.C were changed. Works for me... 1.3 does it this way too (in
fact, it has *only* noFontChange-type insets; but language is inherited
into all of them. So I guess this is a regression fix.)

> I wouldn't want to hold up 1.4.0 for this, it is only an ease of use thing.
> But I hope it can be fixed later.

- Martin

Index: buffer.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/buffer.C,v
retrieving revision 1.630
diff -u -p -r1.630 buffer.C
--- buffer.C	29 Nov 2005 15:08:34 -0000	1.630
+++ buffer.C	2 Feb 2006 12:05:46 -0000
@@ -1307,6 +1307,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: 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
--- lyxtext.h	1 Jan 2006 20:28:03 -0000	1.334
+++ lyxtext.h	2 Feb 2006 12:05:48 -0000
@@ -53,7 +53,7 @@ public:
 	typedef lyx::pit_type pit_type;
 
 	/// constructor
-	explicit LyXText(BufferView *);
+	explicit LyXText(BufferView *, Language const * bp = 0);
 	///
 	void init(BufferView *);
 
@@ -329,6 +329,9 @@ public:
 	/// delete double space or empty paragraphs around old cursor
 	bool deleteEmptyParagraphMechanism(LCursor & cur, LCursor & old);
 
+	/// Get buffer's font from textclass, language from buffer parms
+	LyXFont bufferFont() const;
+
 	///
 	friend class LyXScreen;
 
@@ -341,10 +344,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: 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
--- paragraph.C	30 Dec 2005 19:02:52 -0000	1.418
+++ paragraph.C	2 Feb 2006 12:05:49 -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(Language const * lang) const
 {
 	if (!empty() && !pimpl_->fontlist.empty())
 		return pimpl_->fontlist[0].font();
 
-	return LyXFont(LyXFont::ALL_INHERIT);
+	return LyXFont(LyXFont::ALL_INHERIT, lang);
 }
 
 
@@ -1494,7 +1494,7 @@ Language const *
 Paragraph::getParLanguage(BufferParams const & bparams) const
 {
 	if (!empty())
-		return getFirstFontSettings().language();
+		return getFirstFontSettings(bparams.language).language();
 #ifdef WITH_WARNINGS
 #warning FIXME we should check the prev par as well (Lgb)
 #endif
@@ -1532,7 +1532,8 @@ bool Paragraph::isMultiLingual(BufferPar
 	for (; cit != end; ++cit)
 		if (cit->font().language() != ignore_language &&
 		    cit->font().language() != latex_language &&
-		    cit->font().language() != doc_language)
+		    cit->font().language() != doc_language &&
+		    cit->font().language() != default_language)
 			return true;
 	return false;
 }
Index: 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
--- paragraph.h	1 Jan 2006 20:28:03 -0000	1.159
+++ paragraph.h	2 Feb 2006 12:05:49 -0000
@@ -273,7 +273,7 @@ public:
 	LyXFont const
 	getFontSettings(BufferParams const &, lyx::pos_type pos) const;
 	///
-	LyXFont const getFirstFontSettings() const;
+	LyXFont const getFirstFontSettings(Language const * lang) const;
 
 	/** Get fully instantiated font. If pos == -1, use the layout
 	    font attached to this paragraph.
Index: 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
--- paragraph_funcs.C	16 Jul 2005 12:02:30 -0000	1.117
+++ paragraph_funcs.C	2 Feb 2006 12:05:49 -0000
@@ -157,7 +157,8 @@ 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.language);
 			LyXFont old = par.getFontSettings(bparams, par.size());
 			changed.setLanguage(old.language());
 			tmp->setFont(0, changed);
Index: rowpainter.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/rowpainter.C,v
retrieving revision 1.163
diff -u -p -r1.163 rowpainter.C
--- rowpainter.C	16 Jan 2006 15:17:17 -0000	1.163
+++ rowpainter.C	2 Feb 2006 12:05:50 -0000
@@ -159,8 +159,10 @@ 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() :
+		text_.bufferFont() :
 		font;
+	// Force language inheritance even for noFontChange insets:
+	pi.base.font.setLanguage(font.language());
 	pi.ltr_pos = (text_.bidi.level(pos) % 2 == 0);
 	pi.erased_ = erased_ || isDeletedText(par_, pos);
 	theCoords.insets().add(inset, int(x_), yo_);
@@ -306,14 +308,14 @@ void RowPainter::paintFromPos(pos_type &
 {
 	pos_type const pos = text_.bidi.vis2log(vpos);
 	LyXFont orig_font = text_.getFont(par_, pos);
-	text_.applyOuterFont(orig_font);
 
 	double const orig_x = x_;
 
 	if (par_.isInset(pos)) {
 		paintInset(pos, orig_font);
 		++vpos;
-		paintForeignMark(orig_x, orig_font);
+		// Better not; confusing over insets
+		//paintForeignMark(orig_x, orig_font);
 		return;
 	}
 
@@ -657,7 +659,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(text_.bufferFont()) / 3;
 			pain_.line(last_strikeout_x, middle, int(x_), middle,
 				LColor::strikeout, Painter::line_solid, Painter::line_thin);
 			running_strikeout = false;
@@ -710,7 +713,7 @@ 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(text_.bufferFont()) / 3;
 		pain_.line(last_strikeout_x, middle, int(x_), middle,
 			LColor::strikeout, Painter::line_solid, Painter::line_thin);
 		running_strikeout = false;
Index: 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
--- text.C	19 Dec 2005 12:30:33 -0000	1.639
+++ text.C	2 Feb 2006 12:05:52 -0000
@@ -1692,16 +1692,16 @@ 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();
 	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 :
-			getFont(par, ii->pos);
+		LyXFont f = getFont(par, ii->pos);
+		LyXFont font = ii->inset->noFontChange() ?
+			bufferFont() : f ;
+		// language inherited even by "noFontChange" insets:
+		font.setLanguage(f.language());
 		MetricsInfo mi(bv(), font, w);
 		ii->inset->metrics(mi, dim);
 	}
@@ -2201,8 +2201,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(bufferFont());
 
 	// avoid _(...) re-entrance problem
 	string const s = font.stateText(&buf.params());
Index: text2.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/text2.C,v
retrieving revision 1.639
diff -u -p -r1.639 text2.C
--- text2.C	28 Jan 2006 12:39:22 -0000	1.639
+++ text2.C	2 Feb 2006 12:05:53 -0000
@@ -66,9 +66,11 @@ using std::string;
 using std::min;
 
 
-LyXText::LyXText(BufferView * bv)
+LyXText::LyXText(BufferView * bv, Language const * lang)
 	: maxwidth_(bv ? bv->workWidth() : 100),
-	  current_font(LyXFont::ALL_INHERIT),
+	  current_font(LyXFont::ALL_INHERIT,
+		( bv ? bv->buffer()->params().language 
+			: (lang ? lang : default_language))),
 	  background_color_(LColor::background),
 	  bv_owner(bv),
 	  autoBreakRows_(false)
@@ -77,6 +79,7 @@ LyXText::LyXText(BufferView * bv)
 
 void LyXText::init(BufferView * bv)
 {
+	// Someone document what this method does
 	BOOST_ASSERT(bv);
 	bv_owner = bv;
 	maxwidth_ = bv->workWidth();
@@ -206,7 +209,7 @@ LyXFont LyXText::getFont(Paragraph const
 		font.realize(outerFont(pit, pars_));
 
 	// Realize with the fonts of lesser depth.
-	font.realize(defaultfont_);
+	font.realize(bufferFont());
 
 	return font;
 }
@@ -219,11 +222,10 @@ LyXFont LyXText::getFont(Paragraph const
 // This is where the two are integrated in the final fully realized
 // font.
 void LyXText::applyOuterFont(LyXFont & font) const {
-	LyXFont lf(font_);
-	lf.reduce(defaultfont_);
-	lf.realize(font);
-	lf.setLanguage(font.language());
-	font = lf;
+	font.realize(font_);
+	// "Realize" language, for 1.3 behavioural compatability:
+	if (font.language() == bv()->buffer()->params().language)
+		font.setLanguage(font_.language());
 }
 
 
@@ -237,7 +239,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(bufferFont());
 
 	return font;
 }
@@ -252,7 +254,7 @@ LyXFont LyXText::getLabelFont(Paragraph 
 
 	LyXFont font = layout->labelfont;
 	// Realize with the fonts of lesser depth.
-	font.realize(defaultfont_);
+	font.realize(bufferFont());
 
 	return font;
 }
@@ -288,7 +290,7 @@ void LyXText::setCharFont(pit_type pit, 
 	if (!isMainText())
 		layoutfont.realize(font_);
 
-	layoutfont.realize(defaultfont_);
+	layoutfont.realize(bufferFont());
 
 	// Now, reduce font against full layout font
 	font.reduce(layoutfont);
@@ -1280,6 +1282,14 @@ bool LyXText::deleteEmptyParagraphMechan
 		cur.resetAnchor();
 
 	return false;
+}
+
+
+LyXFont LyXText::bufferFont() const
+{
+	LyXFont font = bv()->buffer()->params().getLyXTextClass().defaultfont();
+	font.setLanguage(bv()->buffer()->params().language);
+	return font;
 }
 
 
Index: 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
--- text3.C	31 Dec 2005 11:40:32 -0000	1.323
+++ text3.C	2 Feb 2006 12:05:54 -0000
@@ -256,7 +256,7 @@ bool doInsertInset(LCursor & cur, LyXTex
 		cur.bv().owner()->dispatch(FuncRequest(LFUN_CUT));
 		gotsel = true;
 	}
-	text->insertInset(cur, inset);
+	cur.paragraph().insertInset(cur.pos(), inset, text->current_font);
 
 	if (edit)
 		inset->edit(cur, true);
@@ -1113,12 +1113,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();
Index: insets/insetcharstyle.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/insets/insetcharstyle.C,v
retrieving revision 1.39
diff -u -p -r1.39 insetcharstyle.C
--- insets/insetcharstyle.C	25 Nov 2005 14:40:32 -0000	1.39
+++ insets/insetcharstyle.C	2 Feb 2006 12:05:55 -0000
@@ -135,8 +135,9 @@ void InsetCharStyle::metrics(MetricsInfo
 {
 	LyXFont tmpfont = mi.base.font;
 	getDrawFont(mi.base.font);
-	mi.base.font.reduce(LyXFont(LyXFont::ALL_SANE));
 	mi.base.font.realize(tmpfont);
+	// Needed to propagate doc language (infamous blueline)
+	mi.base.font.setLanguage(tmpfont.language());
 	mi.base.textwidth -= 2 * TEXT_TO_INSET_OFFSET;
 	InsetText::metrics(mi, dim);
 	mi.base.font = tmpfont;
@@ -171,6 +172,8 @@ void InsetCharStyle::draw(PainterInfo & 
 
 	LyXFont tmpfont = pi.base.font;
 	getDrawFont(pi.base.font);
+	pi.base.font.realize(tmpfont);
+	pi.base.font.setLanguage(tmpfont.language());
 	// I don't understand why the above .reduce and .realize aren't
 	//needed, or even wanted, here. It just works. -- MV 10.04.2005
 	InsetText::draw(pi, x, y);
Index: insets/insetfootlike.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/insets/insetfootlike.C,v
retrieving revision 1.33
diff -u -p -r1.33 insetfootlike.C
--- insets/insetfootlike.C	10 Apr 2005 14:07:33 -0000	1.33
+++ insets/insetfootlike.C	2 Feb 2006 12:05:56 -0000
@@ -45,7 +45,7 @@ InsetFootlike::InsetFootlike(InsetFootli
 void InsetFootlike::metrics(MetricsInfo & mi, Dimension & dim) const
 {
 	LyXFont tmpfont = mi.base.font;
-	mi.base.font = LyXFont(LyXFont::ALL_SANE);
+	mi.base.font = LyXFont(LyXFont::ALL_SANE, tmpfont.language());
 	InsetCollapsable::metrics(mi, dim);
 	mi.base.font = tmpfont;
 	dim_ = dim;
@@ -55,7 +55,7 @@ void InsetFootlike::metrics(MetricsInfo 
 void InsetFootlike::draw(PainterInfo & pi, int x, int y) const
 {
 	LyXFont tmpfont = pi.base.font;
-	pi.base.font = LyXFont(LyXFont::ALL_SANE);
+	pi.base.font = LyXFont(LyXFont::ALL_SANE, tmpfont.language());
 	InsetCollapsable::draw(pi, x, y);
 	pi.base.font = tmpfont;
 }
Index: 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
--- insets/insettext.C	11 Jan 2006 14:22:10 -0000	1.623
+++ insets/insettext.C	2 Feb 2006 12:05:57 -0000
@@ -74,12 +74,16 @@ int InsetText::border_ = 2;
 
 
 InsetText::InsetText(BufferParams const & bp)
-	: drawFrame_(false), frame_color_(LColor::insetframe), text_(0)
+	: drawFrame_(false), frame_color_(LColor::insetframe), 
+		text_(0, bp.language)
 {
 	paragraphs().push_back(Paragraph());
 	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 +95,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 +184,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_;

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to