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(); }
signature.asc
Description: This is a digitally signed message part