On Mon, 2006-01-30 at 10:58 +0100, Georg Baum wrote:
> Martin Vermeer wrote:
> 
> > I would like to hear all of you interpret the following, though:
> > 
> > 
> > (document language Swedish)
> > 
> > \lang Norsk
> > 
> > (text a)
> > 
> > \begin_inset ...
> > 
> > (text b)
> > 
> > \lang Swedish
> > 
> > (text c)
> > 
> > \lang Norsk
> > 
> > (text d)
> > 
> > \end_inset
> > 
> > ...is (text b) supposed to be in Norwegian, or in the buffer language
> > (say, Swedish)? I.e., which language checking dictionary will be used
> > for it?
> 
> swedish if the inset is one with noFontChange() == true, else norwegian. At
> least I think that it works like that.

Yes, that's how I think it *ought* to work. What else is noFontChange
for. And you want to be able to change the language of a complete text
including insets with one select operation.

In the patch as proposed, it doesn't do that. I had to change
applyOuterFont in text2.C to make it so. Like this:


@@ -219,11 +221,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:
+       if (font.language() == bufferFont().language())
+               font.setLanguage(font_.language());
 }


Note that the reduce, realize operations on fonts do not work on the
language attribute.

A more serious problem: we do not have an inherit_language. I think we
should. In LyX as it is in CVS, default_language plays this role. With
the proposed patch, the role is taken over by the buffer language, which
is better, but in a way just as inappropriate. The roles of buffer
language and "no-defined-language flag" are mixed up. 

In the above solution for applyOuterFont it shows in the following way.
You can set font attributes on the outside of an inset and then unset
them for text on the inside, freely at will. No problem. You can also
set a non-buffer language on the outside of the inset and then for text
inside, set another non-buffer language.

What you cannot do is: set a non-buffer language for a whole inset, and
then inside the inset revert text to the buffer language. [Current CVS
has the same problem, but with default_language in the role of the
villain]

This is a direct result of the test

        if (font.language() == bufferFont().language())

which is necessary to propagate the outer font to the inside. What this
statement *tries* to do is: "if I don't have a language defined here at
this point, apply the inset's outer language". But what it *does* is:
"if I try to reset my language here to the buffer language, make it
fail." Not nice.

I think it is fundamentally impossible to solve this problem without
introducing an inherit_language. But that's a bit too big a piece for me
to chew now, especially for 1.4.0.

There is a simple workaround: remove any whole-inset language setting,
and apply the non-buffer language settings manually to the text inside
the inset. But it may cause some head-scratching...

Attached the modified patch. I also suppressed the blueline under
(through) the inset itself, as it is (as Helge correctly points out)
disturbing. We still have the L-cursor and the minibuffer text at that
point.

If we want this in 1.4.0, now is the time to commit.

- 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	26 Jan 2006 16:38:53 -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	26 Jan 2006 16:38:54 -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	26 Jan 2006 16:38:55 -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
@@ -1513,7 +1513,8 @@ bool Paragraph::isRightToLeftPar(BufferP
 void Paragraph::changeLanguage(BufferParams const & bparams,
 			       Language const * from, Language const * to)
 {
-	for (pos_type i = 0; i < size(); ++i) {
+	// <= to catch the dummy font change at end
+	for (pos_type i = 0; i <= size(); ++i) {
 		LyXFont font = getFontSettings(bparams, i);
 		if (font.language() == from) {
 			font.setLanguage(to);
@@ -1532,7 +1533,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	26 Jan 2006 16:38:56 -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 & bp) 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	26 Jan 2006 16:38:56 -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: 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	30 Jan 2006 14:21:19 -0000
@@ -306,14 +322,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 +673,7 @@ 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 +726,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	26 Jan 2006 16:38:58 -0000
@@ -1692,16 +1692,13 @@ 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);
+			bufferFont() : getFont(par, ii->pos);
 		MetricsInfo mi(bv(), font, w);
 		ii->inset->metrics(mi, dim);
 	}
@@ -2201,8 +2198,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	30 Jan 2006 14:21:19 -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)
@@ -206,7 +208,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 +221,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:
+	if (font.language() == bufferFont().language())
+		font.setLanguage(font_.language());
 }
 
 
@@ -237,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(bufferFont());
 
 	return font;
 }
@@ -252,7 +253,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 +289,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);
@@ -1281,6 +1287,16 @@ bool LyXText::deleteEmptyParagraphMechan
 
 	return false;
 }
+
+
+LyXFont LyXText::bufferFont() const
+{
+	LyXFont font =
+		bv()->buffer()->params().getLyXTextClass().defaultfont();
+	font.setLanguage(bv()->buffer()->params().language);
+	return font;
+}
+
 
 
 void LyXText::recUndo(pit_type first, pit_type last) const
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	26 Jan 2006 16:39:00 -0000
@@ -1114,12 +1122,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: 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	26 Jan 2006 16:39:01 -0000
@@ -135,8 +136,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;
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	26 Jan 2006 16:39:03 -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();
 }
 

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

Reply via email to