On Sat, Apr 21, 2007 at 10:03:38AM +0200, Jürgen Spitzmüller wrote: > Jürgen Spitzmüller wrote: > > Attached is an almost-working solution > > The attached patch fixes all remaining issues. > > Opinions? José? > > Jürgen
Hmmm, I shudder at your tinkering with the rectangle arguments in insettext. I know that if I did this, I would introduce 17 new intractable rendering bugs in the wide() handling ;-/ Please make _really_ sure that this has no side effects. - Martin > Index: src/insets/insetbase.h > =================================================================== > --- src/insets/insetbase.h (Revision 17877) > +++ src/insets/insetbase.h (Arbeitskopie) > @@ -357,6 +357,8 @@ > /// if this inset has paragraphs should they be output all as default > /// paragraphs with the default layout of the text class? > virtual bool forceDefaultParagraphs(idx_type) const { return false; } > + /// Is the width forced to some value? > + virtual bool hasFixedWidth() const { return false; } > > /// > virtual docstring const & getInsetName() const; > Index: src/insets/insetcollapsable.C > =================================================================== > --- src/insets/insetcollapsable.C (Revision 17877) > +++ src/insets/insetcollapsable.C (Arbeitskopie) > @@ -173,6 +173,8 @@ > } else { > dim.des += textdim_.height() + > TEXT_TO_BOTTOM_OFFSET; > dim.wid = max(dim.wid, textdim_.wid); > + if (hasFixedWidth()) > + dim.wid = max(dim.wid, > mi.base.textwidth); > } > } > } > Index: src/insets/insettext.h > =================================================================== > --- src/insets/insettext.h (Revision 17877) > +++ src/insets/insettext.h (Arbeitskopie) > @@ -159,14 +159,14 @@ > /// > mutable pit_type old_pit; > /// > - static int border_; > - /// > bool wide_inset_; > public: > /// > mutable LyXText text_; > /// > mutable LyXFont font_; > + /// > + static int border_; > }; > > } // namespace lyx > Index: src/insets/insetcollapsable.h > =================================================================== > --- src/insets/insetcollapsable.h (Revision 17877) > +++ src/insets/insetcollapsable.h (Arbeitskopie) > @@ -98,8 +98,6 @@ > InsetBase * editXY(LCursor & cur, int x, int y); > /// > void setInlined() { status_ = Inlined; } > - /// Is the width forced to some value? > - virtual bool hasFixedWidth() const { return false; } > /// > docstring floatName(std::string const & type, BufferParams const &) > const; > > Index: src/insets/insetbox.C > =================================================================== > --- src/insets/insetbox.C (Revision 17877) > +++ src/insets/insetbox.C (Arbeitskopie) > @@ -14,6 +14,7 @@ > > #include "insetbox.h" > > +#include "BufferView.h" > #include "cursor.h" > #include "dispatchresult.h" > #include "debug.h" > @@ -25,6 +26,7 @@ > #include "lyxlex.h" > #include "metricsinfo.h" > #include "paragraph.h" > +#include "TextMetrics.h" > > #include "support/translator.h" > > @@ -177,8 +179,13 @@ > bool InsetBox::metrics(MetricsInfo & m, Dimension & dim) const > { > MetricsInfo mi = m; > + // first round in order to know the minimum size. > + InsetCollapsable::metrics(mi, dim); > + TextMetrics & tm = mi.base.bv->textMetrics(&text_); > if (hasFixedWidth()) > - mi.base.textwidth = params_.width.inPixels(m.base.textwidth); > + mi.base.textwidth = > + std::max(tm.width() + 2 * border_ + (int) (2.5 * > TEXT_TO_INSET_OFFSET), > + params_.width.inPixels(m.base.textwidth)); > InsetCollapsable::metrics(mi, dim); > bool const changed = dim_ != dim; > dim_ = dim; > Index: src/insets/insettext.C > =================================================================== > --- src/insets/insettext.C (Revision 17877) > +++ src/insets/insettext.C (Arbeitskopie) > @@ -198,8 +198,9 @@ > int const w = tm.width() + 2 * border_; > int const a = tm.ascent() + border_; > int const h = a + tm.descent() + border_; > - pi.pain.rectangle(x, y - a, (wide() ? tm.maxWidth() : w), h, > - frameColor()); > + pi.pain.rectangle(x, y - a, > + ((wide() || hasFixedWidth()) ? tm.maxWidth() > : w), > + h, frameColor()); > } > } > > @@ -211,8 +212,9 @@ > int const w = tm.width() + 2 * border_; > int const a = tm.ascent() + border_; > int const h = a + tm.descent() + border_; > - pi.pain.fillRectangle(x, y - a, (wide() ? tm.maxWidth() : w), h, > - backgroundColor()); > + pi.pain.fillRectangle(x, y - a, > + ((wide() || hasFixedWidth()) ? tm.maxWidth() : w), > + h, backgroundColor()); > text_.drawSelection(pi, x + border_, y); > } >