José Matos wrote:
On Saturday 29 September 2007 12:29:00 [EMAIL PROTECTED] wrote:
I'd say we wait with this until 1.5.2 is out and do
the change for 1.5.3. Then this has enough time for testing.
+1
+1
JMarc
PS: Abdel please don't be discouraged with this. If you finish the patch
soon I(/we) would not mind to have it as the first patch applied for 1.5.3.
OK, then here is the latest patch. I ended up backporting some stuff
from trunk. It seems to work well but needs some more testing WRT Box
insets I guess...
Abdel.
Index: insets/InsetCaption.h
===================================================================
--- insets/InsetCaption.h (revision 20564)
+++ insets/InsetCaption.h (working copy)
@@ -59,8 +59,6 @@
///
virtual bool getStatus(Cursor & cur, FuncRequest const & cmd,
FuncStatus &) const;
///
- virtual bool wide() const { return false; }
- ///
int latex(Buffer const & buf, odocstream & os,
OutputParams const &) const;
///
Index: insets/InsetCollapsable.cpp
===================================================================
--- insets/InsetCollapsable.cpp (revision 20564)
+++ insets/InsetCollapsable.cpp (working copy)
@@ -158,13 +158,10 @@
dim = dimensionCollapsed();
if (status() == Open) {
InsetText::metrics(mi, textdim_);
- // This expression should not contain mi.base.texwidth
openinlined_ = !hasFixedWidth()
- && textdim_.wid < 0.5 * mi.base.bv->workWidth();
+ && (textdim_.wid + dim.wid) <=
mi.base.textwidth;
if (openinlined_) {
- // Correct for button width, and re-fit
- mi.base.textwidth -= dim.wid;
- InsetText::metrics(mi, textdim_);
+ // Correct for button width
dim.wid += textdim_.wid;
dim.des = max(dim.des - textdim_.asc + dim.asc,
textdim_.des);
dim.asc = textdim_.asc;
Index: insets/InsetFloat.h
===================================================================
--- insets/InsetFloat.h (revision 20564)
+++ insets/InsetFloat.h (working copy)
@@ -61,8 +61,6 @@
///
Inset::Code lyxCode() const { return Inset::FLOAT_CODE; }
///
- virtual bool wide() const { return false; }
- ///
int latex(Buffer const &, odocstream &,
OutputParams const &) const;
///
Index: insets/InsetOptArg.h
===================================================================
--- insets/InsetOptArg.h (revision 20564)
+++ insets/InsetOptArg.h (working copy)
@@ -31,8 +31,6 @@
Inset::Code lyxCode() const { return Inset::OPTARG_CODE; }
/// return an message upon editing
virtual docstring const editMessage() const;
- ///
- virtual bool wide() const { return false; }
/// Standard LaTeX output -- short-circuited
int latex(Buffer const &, odocstream &,
Index: insets/InsetText.cpp
===================================================================
--- insets/InsetText.cpp (revision 20564)
+++ insets/InsetText.cpp (working copy)
@@ -78,7 +78,7 @@
InsetText::InsetText(BufferParams const & bp)
- : drawFrame_(false), frame_color_(Color::insetframe)
+ : drawFrame_(false), frame_color_(Color::insetframe),
fixed_width_(false)
{
paragraphs().push_back(Paragraph());
paragraphs().back().layout(bp.getTextClass().defaultLayout());
@@ -90,7 +90,7 @@
InsetText::InsetText(InsetText const & in)
- : Inset(in), text_()
+ : Inset(in), text_(), fixed_width_(fixed_width_)
{
text_.autoBreakRows_ = in.text_.autoBreakRows_;
drawFrame_ = in.drawFrame_;
@@ -174,10 +174,13 @@
font_ = mi.base.font;
// Hand font through to contained lyxtext:
text_.font_ = mi.base.font;
+ // Expand the inset if
+ fixed_width_ = text_.paragraphs().size() > 1;
if (hasFixedWidth())
tm.metrics(mi, dim, mi.base.textwidth);
else
tm.metrics(mi, dim);
+ fixed_width_ |= tm.parMetrics(0).rows().size() > 1;
dim.asc += border_;
dim.des += border_;
dim.wid += 2 * border_;
@@ -203,7 +206,7 @@
int const a = tm.ascent() + border_;
int const h = a + tm.descent() + border_;
pi.pain.rectangle(x, y - a,
- ((wide() || hasFixedWidth()) ? tm.maxWidth()
: w),
+ (hasFixedWidth() ? tm.maxWidth() : w),
h, frameColor());
}
}
@@ -217,24 +220,12 @@
int const a = tm.ascent() + border_;
int const h = a + tm.descent() + border_;
pi.pain.fillRectangle(x, y - a,
- ((wide() || hasFixedWidth()) ? tm.maxWidth() : w),
+ (hasFixedWidth() ? tm.maxWidth() : w),
h, backgroundColor());
text_.drawSelection(pi, x + border_, y);
}
-bool InsetText::covers(BufferView const & bv, int x, int y) const
-{
- TextMetrics const & tm = bv.textMetrics(&text_);
-
- return bv.coordCache().getInsets().has(this)
- && x >= xo(bv)
- && x <= xo(bv) + width() + (wide() ? tm.maxWidth() : 0)
- && y >= yo(bv) - ascent()
- && y <= yo(bv) + descent();
-}
-
-
docstring const InsetText::editMessage() const
{
return _("Opened Text Inset");
@@ -347,13 +338,6 @@
}
-bool InsetText::notifyCursorLeaves(Cursor & cur) {
- if(wide())
- cur.updateFlags(cur.disp_.update() | Update::Force);
- return false;
-}
-
-
void InsetText::cursorPos(BufferView const & bv,
CursorSlice const & sl, bool boundary, int & x, int & y) const
{
Index: insets/InsetText.h
===================================================================
--- insets/InsetText.h (revision 20564)
+++ insets/InsetText.h (working copy)
@@ -42,6 +42,8 @@
explicit InsetText(BufferParams const &);
///
InsetText();
+ ///
+ bool hasFixedWidth() const { return fixed_width_; }
/// empty inset to empty par
void clear();
@@ -55,8 +57,6 @@
void draw(PainterInfo & pi, int x, int y) const;
/// draw inset selection
void drawSelection(PainterInfo & pi, int x, int y) const;
- /// are we inside the area covered by the inset?
- virtual bool covers(BufferView const & bv, int x, int y) const;
///
virtual docstring const editMessage() const;
///
@@ -75,9 +75,6 @@
int docbook(Buffer const &, odocstream &, OutputParams const &) const;
///
void validate(LaTeXFeatures & features) const;
- //FIXME The following should be removed when wide is.
- /// Overridden to force an update if the inset was wide().
- virtual bool notifyCursorLeaves(Cursor & cur);
/// return x,y of given position relative to the inset's baseline
void cursorPos(BufferView const & bv, CursorSlice const & sl,
@@ -137,10 +134,6 @@
bool neverIndent(Buffer const &) const;
///
InsetText(InsetText const &);
- ///
- virtual bool wide() const { return wide_inset_; }
- ///
- void setWide(bool wide_inset) { wide_inset_ = wide_inset; }
protected:
///
@@ -160,8 +153,9 @@
int frame_color_;
///
mutable pit_type old_pit;
- ///
- bool wide_inset_;
+ /// Does the inset has fixed width?
+ /// Allow horizontal maximization of the inset.
+ mutable bool fixed_width_;
public:
///
Index: ParagraphMetrics.cpp
===================================================================
--- ParagraphMetrics.cpp (revision 20564)
+++ ParagraphMetrics.cpp (working copy)
@@ -88,18 +88,27 @@
}
-size_type ParagraphMetrics::calculateRowSignature(Row const & row)
+size_type ParagraphMetrics::calculateRowSignature(Row const & row,
+ BufferParams const & bparams) const
{
boost::crc_32_type crc;
for (pos_type i = row.pos(); i < row.endpos(); ++i) {
char_type const b[] = { par_->getChar(i) };
crc.process_bytes(b, 1);
+ if (bparams.trackChanges) {
+ Change change = par_->lookupChange(i);
+ char_type const b[] = { change.type };
+ crc.process_bytes(b, 1);
+ }
}
+ char_type const b[] = { row.width(), row.ascent(), row.descent()};
+ crc.process_bytes(b, 3);
return crc.checksum();
}
-void ParagraphMetrics::updateRowChangeStatus()
+void ParagraphMetrics::updateRowChangeStatus(
+ BufferParams const & bparams) const
{
size_t const size = rows_.size();
row_change_status_.resize(size);
@@ -107,7 +116,7 @@
for (size_t i = 0; i != size; ++i) {
// Row signature; has row changed since last update?
- size_type const row_sig = calculateRowSignature(rows_[i]);
+ size_type const row_sig = calculateRowSignature(rows_[i],
bparams);
row_change_status_[i] = row_signature_[i] != row_sig;
row_signature_[i] = row_sig;
}
Index: ParagraphMetrics.h
===================================================================
--- ParagraphMetrics.h (revision 20564)
+++ ParagraphMetrics.h (working copy)
@@ -71,7 +71,7 @@
std::vector<bool> const & rowChangeStatus() const
{ return row_change_status_; }
///
- void updateRowChangeStatus();
+ void updateRowChangeStatus(BufferParams const &) const;
///
int rightMargin(Buffer const & buffer) const;
@@ -82,13 +82,13 @@
///
typedef std::vector<size_type> RowSignature;
///
- size_type calculateRowSignature(Row const &);
+ size_type calculateRowSignature(Row const &, BufferParams const &)
const;
///
mutable RowList rows_;
///
- RowSignature row_signature_;
+ mutable RowSignature row_signature_;
///
- std::vector<bool> row_change_status_;
+ mutable std::vector<bool> row_change_status_;
/// cached dimensions of paragraph
Dimension dim_;
///
Index: rowpainter.cpp
===================================================================
--- rowpainter.cpp (revision 20568)
+++ rowpainter.cpp (working copy)
@@ -75,6 +75,7 @@
void paintChangeBar();
void paintFirst();
void paintLast();
+ void paintOnlyInsets();
void paintText();
int maxWidth() { return max_width_; }
@@ -193,15 +194,16 @@
int const x1 = int(x_);
#endif
bv_.coordCache().insets().add(inset, int(x_), yo_);
- InsetText const * const in = inset->asTextInset();
- // non-wide insets are painted completely. Recursive
+ // Backup refreshInside (modified recursively below)
bool tmp = refreshInside;
- if (!in || !in->wide()) {
+ InsetText const * in = inset->asTextInset();
+ // non fixed-width text insets are painted completely.
+ if (!in || !in->hasFixedWidth())
refreshInside = true;
- }
if (refreshInside)
inset->drawSelection(pi, int(x_), yo_);
inset->draw(pi, int(x_), yo_);
+ // Restore refreshInside.
refreshInside = tmp;
x_ += inset->width();
#ifdef DEBUG_METRICS
@@ -731,6 +733,25 @@
}
+void RowPainter::paintOnlyInsets()
+{
+ pos_type const end = row_.endpos();
+ for (pos_type pos = row_.pos(); pos != end; ++pos) {
+ if (!par_.isInset(pos))
+ continue;
+
+ if (x_ > bv_.workWidth())
+ continue;
+
+ // If outer row has changed, nested insets are repaint
completely.
+ Inset const * inset = par_.getInset(pos);
+ x_ = bv_.coordCache().getInsets().x(inset);
+ pos_type vpos = pos;
+ paintFromPos(vpos); // vpos is modified by paintFromPos.
+ }
+}
+
+
void RowPainter::paintText()
{
pos_type const end = row_.endpos();
@@ -876,68 +897,6 @@
}
-bool CursorOnRow(PainterInfo & pi, pit_type const pit,
- RowList::const_iterator rit, Text const & text)
-{
- // Is there a cursor on this row (or inside inset on row)
- Cursor & cur = pi.base.bv->cursor();
- for (size_type d = 0; d < cur.depth(); ++d) {
- CursorSlice const & sl = cur[d];
- if (sl.text() == &text
- && sl.pit() == pit
- && sl.pos() >= rit->pos()
- && sl.pos() <= rit->endpos())
- return true;
- }
- return false;
-}
-
-
-bool innerCursorOnRow(PainterInfo & pi, pit_type pit,
- RowList::const_iterator rit, Text const & text)
-{
- // Is there a cursor inside an inset on this row, and is this inset
- // the only "character" on this row
- Cursor & cur = pi.base.bv->cursor();
- if (rit->pos() + 1 != rit->endpos())
- return false;
- for (size_type d = 0; d < cur.depth(); d++) {
- CursorSlice const & sl = cur[d];
- if (sl.text() == &text
- && sl.pit() == pit
- && sl.pos() == rit->pos())
- return d < cur.depth() - 1;
- }
- return false;
-}
-
-
-// FIXME: once wide() is obsolete, remove this as well!
-bool inNarrowInset(PainterInfo & pi)
-{
- // check whether the current inset is nested in a non-wide inset
- Cursor & cur = pi.base.bv->cursor();
- Inset const * cur_in = &cur.inset();
- // check all higher nested insets
- for (size_type i = 1; i < cur.depth(); ++i) {
- Inset * const in = &cur[i].inset();
- if (in == cur_in)
- // we reached the level of the current inset, so stop
- return false;
- else if (in) {
- if (in->hasFixedWidth())
- return true;
- InsetText * t =
- const_cast<InsetText *>(in->asTextInset());
- if (t && !t->wide())
- // OK, we are in a non-wide() inset
- return true;
- }
- }
- return false;
-}
-
-
void paintPar
(PainterInfo & pi, Text const & text, pit_type pit, int x, int y,
bool repaintAll)
@@ -947,10 +906,12 @@
pi.base.bv->coordCache().parPos()[&text][pit] = Point(x, y);
- Paragraph const & par = text.paragraphs()[pit];
ParagraphMetrics const & pm = pi.base.bv->parMetrics(&text, pit);
if (pm.rows().empty())
return;
+ // Update the row change statuses. The painter will need that info
+ // in order to know which row has to be repainted.
+ pm.updateRowChangeStatus(pi.base.bv->buffer()->params());
RowList::const_iterator const rb = pm.rows().begin();
RowList::const_iterator const re = pm.rows().end();
@@ -968,49 +929,20 @@
// Row signature; has row changed since last paint?
bool row_has_changed = pm.rowChangeStatus()[rowno];
- bool cursor_on_row = CursorOnRow(pi, pit, rit, text);
- bool in_inset_alone_on_row =
- innerCursorOnRow(pi, pit, rit, text);
- bool leftEdgeFixed =
- (par.getAlign() == LYX_ALIGN_LEFT ||
- par.getAlign() == LYX_ALIGN_BLOCK);
- bool inNarrowIns = inNarrowInset(pi);
+ bool const inside = (y + rit->descent() >= 0
+ && y - rit->ascent() < ww);
+ // it is not needed to draw on screen if we are not inside.
+ pi.pain.setDrawingEnabled(inside);
+ RowPainter rp(pi, text, pit, *rit, bidi, x, y);
- // If this is the only object on the row, we can make it wide
- //
- // FIXME: there is a const_cast here because paintPar() is not
supposed
- // to touch the paragraph contents. So either we move this
"wide"
- // property out of InsetText or we localize the feature to the
painting
- // done here.
- // JSpitzm: We should aim at removing wide() altogether while
retaining
- // typing speed within insets.
- for (pos_type i = rit->pos() ; i != rit->endpos(); ++i) {
- Inset const * const in = par.getInset(i);
- if (in) {
- InsetText * t = const_cast<InsetText
*>(in->asTextInset());
- if (t)
- t->setWide(in_inset_alone_on_row
- && leftEdgeFixed
- && !inNarrowIns);
- }
- }
-
- // If selection is on, the current row signature differs
- // from cache, or cursor is inside an inset _on this row_,
- // then paint the row
- if (repaintAll || row_has_changed || cursor_on_row) {
- bool const inside = (y + rit->descent() >= 0
- && y - rit->ascent() < ww);
- // it is not needed to draw on screen if we are not
inside.
- pi.pain.setDrawingEnabled(inside);
- RowPainter rp(pi, text, pit, *rit, bidi, x, y);
+ // If selection is on if the current row signature differs
+ // from cache, then paint the row.
+ if (repaintAll || row_has_changed) {
// Clear background of this row
// (if paragraph background was not cleared)
- if (!repaintAll &&
- (!(in_inset_alone_on_row && leftEdgeFixed &&
!inNarrowIns)
- || row_has_changed)) {
+ if (!repaintAll && row_has_changed) {
pi.pain.fillRectangle(x, y - rit->ascent(),
- rp.maxWidth(), rit->height(),
+ rp.maxWidth(), rit->height(),
text.backgroundColor());
// If outer row has changed, force nested
// insets to repaint completely
@@ -1037,7 +969,9 @@
rp.paintText();
if (rit + 1 == re)
rp.paintLast();
- }
+ } else
+ rp.paintOnlyInsets();
+
y += rit->descent();
// Restore, see above
refreshInside = tmp;
Index: TextMetrics.cpp
===================================================================
--- TextMetrics.cpp (revision 20564)
+++ TextMetrics.cpp (working copy)
@@ -263,14 +263,10 @@
// redoParagraph() recursively inside parMetrics.
Dimension old_dim = parMetrics(pit, false).dim();
- changed |= old_dim.height() != pm.dim().height();
+ changed |= old_dim != pm.dim();
par_metrics_[pit] = pm;
- // Update the row change statuses. The painter will need that info
- // in order to know which row has to be repainted.
- par_metrics_[pit].updateRowChangeStatus();
-
return changed;
}