this patch - renames MetricsBase::textwidth -> maxwidth (easier for the non-LaTeX experts out here) - adds a MetricsInfo::remaining_width member - put children metrics calls into the rebreak loop again, passing this remaining_width.
It doesn't use it yet, so behaviour should be unchanged. Ok to go in? Alfredo
? ChangeLog-old ? PosIterator.C-save ? PosIterator.h-save ? bfri.C ? safe ? textcursor.C-save ? textcursor.h-save ? insets/insetcollapsable-save.C ? insets/insettext-save.C Index: metricsinfo.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/metricsinfo.C,v retrieving revision 1.12 diff -u -p -u -r1.12 metricsinfo.C --- metricsinfo.C 15 Dec 2003 09:17:04 -0000 1.12 +++ metricsinfo.C 21 Mar 2004 15:14:20 -0000 @@ -21,24 +21,25 @@ using std::string; MetricsBase::MetricsBase() : bv(0), font(), style(LM_ST_TEXT), fontname("mathnormal"), - textwidth(0) + maxwidth(0) {} MetricsBase::MetricsBase(BufferView * b, LyXFont const & f, int w) : bv(b), font(f), style(LM_ST_TEXT), fontname("mathnormal"), - textwidth(w) + maxwidth(w) {} -MetricsInfo::MetricsInfo() +MetricsInfo::MetricsInfo() : remaining_width(0) {} -MetricsInfo::MetricsInfo(BufferView * bv, LyXFont const & font, int textwidth) - : base(bv, font, textwidth) +MetricsInfo::MetricsInfo(BufferView * bv, LyXFont const & font, + int maxwidth, int remaining_width) + : base(bv, font, maxwidth), remaining_width(remaining_width) {} @@ -161,7 +162,7 @@ WidthChanger::WidthChanger(MetricsBase & : Changer<MetricsBase>(mb) { save_ = mb; - mb.textwidth = w; + mb.maxwidth = w; } Index: metricsinfo.h =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/metricsinfo.h,v retrieving revision 1.10 diff -u -p -u -r1.10 metricsinfo.h --- metricsinfo.h 6 Oct 2003 15:42:29 -0000 1.10 +++ metricsinfo.h 21 Mar 2004 15:14:20 -0000 @@ -40,7 +40,7 @@ struct MetricsBase { /// MetricsBase(); /// - MetricsBase(BufferView * bv, LyXFont const & font, int textwidth); + MetricsBase(BufferView * bv, LyXFont const & font, int maxwidth); /// the current view BufferView * bv; @@ -51,7 +51,7 @@ struct MetricsBase { /// name of current font - mathed specific std::string fontname; /// This is the width available in pixels - int textwidth; + int maxwidth; }; @@ -63,10 +63,13 @@ struct MetricsInfo { /// MetricsInfo(); /// - MetricsInfo(BufferView * bv, LyXFont const & font, int textwidth); + MetricsInfo(BufferView * bv, LyXFont const & font, int maxwidth, + int remaining_width); /// MetricsBase base; + /// + int remaining_width; }; Index: text.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/text.C,v retrieving revision 1.553 diff -u -p -u -r1.553 text.C --- text.C 18 Mar 2004 13:28:46 -0000 1.553 +++ text.C 21 Mar 2004 15:14:22 -0000 @@ -493,8 +493,15 @@ void LyXText::rowBreakPoint(ParagraphLis pos_type point = end; pos_type i = pos; for ( ; i < end; ++i, ++fi) { - char const c = pit->getChar(i); + if (pit->isInset(i)) { + Dimension dim; + int const w = width - left; + MetricsInfo mi(bv(), getFont(pit, i), w, width - x); + pit->getInset(i)->metrics(mi, dim); + } + + char const c = pit->getChar(i); { int thiswidth = singleWidth(pit, i, c, *fi); @@ -1549,14 +1556,14 @@ void LyXText::redoParagraphInternal(Para pit->width = 0; // redo insets - InsetList::iterator ii = pit->insetlist.begin(); - InsetList::iterator iend = pit->insetlist.end(); - for (; ii != iend; ++ii) { - Dimension dim; - int const w = maxwidth_ - leftMargin(pit) - rightMargin(*pit); - MetricsInfo mi(bv(), getFont(pit, ii->pos), w); - ii->inset->metrics(mi, dim); - } + //InsetList::iterator ii = pit->insetlist.begin(); + //InsetList::iterator iend = pit->insetlist.end(); + //for (; ii != iend; ++ii) { + // Dimension dim; + // int const w = maxwidth_ - leftMargin(pit) - rightMargin(*pit); + // MetricsInfo mi(bv(), getFont(pit, ii->pos), w); + // ii->inset->metrics(mi, dim); + //} // rebreak the paragraph pit->setBeginOfBody(); @@ -1603,10 +1610,10 @@ void LyXText::fullRebreak() void LyXText::metrics(MetricsInfo & mi, Dimension & dim) { - //BOOST_ASSERT(mi.base.textwidth); - if (mi.base.textwidth) - maxwidth_ = mi.base.textwidth; - //lyxerr << "LyXText::metrics: width: " << mi.base.textwidth + //BOOST_ASSERT(mi.base.maxwidth); + if (mi.base.maxwidth) + maxwidth_ = mi.base.maxwidth; + //lyxerr << "LyXText::metrics: width: " << mi.base.maxwidth //<< " maxWidth: " << maxwidth << "\nfont: " << mi.base.font //<< endl; Index: insets/insetbox.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/insets/insetbox.C,v retrieving revision 1.19 diff -u -p -u -r1.19 insetbox.C --- insets/insetbox.C 18 Mar 2004 12:53:38 -0000 1.19 +++ insets/insetbox.C 21 Mar 2004 15:14:24 -0000 @@ -154,7 +154,7 @@ void InsetBox::setButtonLabel() void InsetBox::metrics(MetricsInfo & m, Dimension & dim) const { MetricsInfo mi = m; - mi.base.textwidth = params_.width.inPixels(m.base.textwidth); + mi.base.maxwidth = params_.width.inPixels(m.base.maxwidth); InsetCollapsable::metrics(mi, dim); //if (params_.inner_box && isOpen()) // dim.wid = mi.base.textwidth; Index: insets/insetcollapsable.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/insets/insetcollapsable.C,v retrieving revision 1.247 diff -u -p -u -r1.247 insetcollapsable.C --- insets/insetcollapsable.C 18 Mar 2004 13:57:16 -0000 1.247 +++ insets/insetcollapsable.C 21 Mar 2004 15:14:24 -0000 @@ -136,7 +136,7 @@ void InsetCollapsable::metrics(MetricsIn if (status_ == Open) { Dimension insetdim; inset.metrics(mi, insetdim); - openinlined_ = (insetdim.wid + dim.wid <= mi.base.textwidth); + openinlined_ = (insetdim.wid + dim.wid <= mi.base.maxwidth); if (openinlined_) { dim.wid += insetdim.wid; dim.des = max(dim.des, insetdim.des); Index: insets/insetinclude.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/insets/insetinclude.C,v retrieving revision 1.185 diff -u -p -u -r1.185 insetinclude.C --- insets/insetinclude.C 18 Mar 2004 12:53:39 -0000 1.185 +++ insets/insetinclude.C 21 Mar 2004 15:14:24 -0000 @@ -535,11 +535,11 @@ void InsetInclude::metrics(MetricsInfo & button_.metrics(mi, dim); } int center_indent = type(params_) == INPUT ? - 0 : (mi.base.textwidth - dim.wid) / 2; + 0 : (mi.base.maxwidth - dim.wid) / 2; Box b(center_indent, center_indent + dim.wid, -dim.asc, dim.des); button_.setBox(b); - dim.wid = mi.base.textwidth; + dim.wid = mi.base.maxwidth; dim_ = dim; } Index: insets/insetline.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/insets/insetline.C,v retrieving revision 1.3 diff -u -p -u -r1.3 insetline.C --- insets/insetline.C 5 Nov 2003 12:06:16 -0000 1.3 +++ insets/insetline.C 21 Mar 2004 15:14:24 -0000 @@ -40,7 +40,7 @@ void InsetLine::metrics(MetricsInfo & mi { dim.asc = 3; dim.des = 3; - dim.wid = mi.base.textwidth; + dim.wid = mi.base.maxwidth; dim_ = dim; } Index: insets/insetpagebreak.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/insets/insetpagebreak.C,v retrieving revision 1.4 diff -u -p -u -r1.4 insetpagebreak.C --- insets/insetpagebreak.C 5 Nov 2003 12:06:16 -0000 1.4 +++ insets/insetpagebreak.C 21 Mar 2004 15:14:24 -0000 @@ -41,7 +41,7 @@ void InsetPagebreak::metrics(MetricsInfo { dim.asc = defaultRowHeight(); dim.des = defaultRowHeight(); - dim.wid = mi.base.textwidth; + dim.wid = mi.base.maxwidth; dim_ = dim; } Index: insets/insettabular.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/insets/insettabular.C,v retrieving revision 1.412 diff -u -p -u -r1.412 insettabular.C --- insets/insettabular.C 18 Mar 2004 13:57:16 -0000 1.412 +++ insets/insettabular.C 21 Mar 2004 15:14:26 -0000 @@ -225,7 +225,7 @@ void InsetTabular::read(Buffer const & b void InsetTabular::metrics(MetricsInfo & mi, Dimension & dim) const { //lyxerr << "InsetTabular::metrics: " << mi.base.bv << " width: " << - // mi.base.textwidth << "\n"; + // mi.base.maxwidth << "\n"; if (!mi.base.bv) { lyxerr << "InsetTabular::metrics: need bv" << endl; BOOST_ASSERT(false); @@ -240,8 +240,8 @@ void InsetTabular::metrics(MetricsInfo & ++cell; Dimension dim; MetricsInfo m = mi; - m.base.textwidth = - tabular.column_info[j].p_width.inPixels(mi.base.textwidth); + m.base.maxwidth = + tabular.column_info[j].p_width.inPixels(mi.base.maxwidth); tabular.getCellInset(cell).metrics(m, dim); maxAsc = max(maxAsc, dim.asc); maxDesc = max(maxDesc, dim.des); Index: insets/insettext.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/insets/insettext.C,v retrieving revision 1.585 diff -u -p -u -r1.585 insettext.C --- insets/insettext.C 18 Mar 2004 13:57:18 -0000 1.585 +++ insets/insettext.C 21 Mar 2004 15:14:26 -0000 @@ -173,14 +173,14 @@ void InsetText::read(Buffer const & buf, void InsetText::metrics(MetricsInfo & mi, Dimension & dim) const { - //lyxerr << "InsetText::metrics: width: " << mi.base.textwidth << endl; + //lyxerr << "InsetText::metrics: width: " << mi.base.maxwidth << endl; setViewCache(mi.base.bv); - mi.base.textwidth -= 2 * TEXT_TO_INSET_OFFSET; + mi.base.maxwidth -= 2 * TEXT_TO_INSET_OFFSET; text_.metrics(mi, dim); dim.asc += TEXT_TO_INSET_OFFSET; dim.des += TEXT_TO_INSET_OFFSET; dim.wid += 2 * TEXT_TO_INSET_OFFSET; - mi.base.textwidth += 2 * TEXT_TO_INSET_OFFSET; + mi.base.maxwidth += 2 * TEXT_TO_INSET_OFFSET; dim_ = dim; font_ = mi.base.font; text_.font_ = mi.base.font; Index: insets/insettheorem.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/insets/insettheorem.C,v retrieving revision 1.25 diff -u -p -u -r1.25 insettheorem.C --- insets/insettheorem.C 5 Nov 2003 12:06:18 -0000 1.25 +++ insets/insettheorem.C 21 Mar 2004 15:14:26 -0000 @@ -70,8 +70,8 @@ auto_ptr<InsetBase> InsetTheorem::clone( void InsetTheorem::metrics(MetricsInfo & mi, Dimension & dim) const { InsetCollapsable::metrics(mi, dim); - center_indent_ = (mi.base.textwidth - dim.wid) / 2; - dim.wid = mi.base.textwidth; + center_indent_ = (mi.base.maxwidth - dim.wid) / 2; + dim.wid = mi.base.maxwidth; dim_ = dim; } Index: mathed/math_textinset.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/mathed/math_textinset.C,v retrieving revision 1.22 diff -u -p -u -r1.22 math_textinset.C --- mathed/math_textinset.C 2 Feb 2004 17:32:56 -0000 1.22 +++ mathed/math_textinset.C 21 Mar 2004 15:14:27 -0000 @@ -122,7 +122,7 @@ void MathTextInset::metrics(MetricsInfo // This is a regular char. Go on if we either don't care for // the width limit or have not reached that limit. curr += cell(0)[i]->width(); - if (curr + safe <= mi.base.textwidth) + if (curr + safe <= mi.base.maxwidth) continue; }