It is wrong to compute this at paint time. In general, painting a row
should not require any access to a paragraph object, but we are far
from there now.
(cherry picked from commit
4858bb3bb68aac142815b530a017e3776d1c7c11)
begin_margin_sel(false), end_margin_sel(false),
changed_(false), crc_(0),
pit_(0), pos_(0), end_(0),
- right_boundary_(false), flushed_(false), rtl_(false)
+ right_boundary_(false), flushed_(false), rtl_(false),
+ changebar_(false)
{}
if (elt.final)
return;
elt.final = true;
+ if (elt.change.changed())
+ changebar_ = true;
if (elt.type == STRING) {
dim_.wid -= elt.dim.wid;
void reverseRTL(bool rtl_par);
///
bool isRTL() const { return rtl_; }
+ ///
+ bool needsChangeBar() const { return changebar_; }
+ ///
+ void needsChangeBar(bool ncb) { changebar_ = ncb; }
+
/// Find row element that contains \c pos, and compute x offset.
const_iterator const findElement(pos_type pos, bool boundary, double & x) const;
Dimension dim_;
/// true when this row lives in a right-to-left paragraph
bool rtl_;
+ /// true when a changebar should be drawn in the margin
+ bool changebar_;
};
void RowPainter::paintChangeBar() const
{
- pos_type const start = row_.pos();
- pos_type end = row_.endpos();
-
- if (par_.size() == end) {
- // this is the last row of the paragraph;
- // thus, we must also consider the imaginary end-of-par character
- end++;
- }
-
- if (start == end || !par_.isChanged(start, end))
- return;
-
int const height = tm_.isLastRow(row_)
? row_.ascent()
: row_.height();
row.addVirtual(end, docstring(1, char_type(0x00B6)), f, Change());
}
+ // Is there a end-of-paragaph change?
+ if (i == end && par.lookupChange(end).changed() && !need_new_row)
+ row.needsChangeBar(true);
+
// if the row is too large, try to cut at last separator. In case
// of success, reset indication that the row was broken abruptly.
int const next_width = max_width_ - leftMargin(row.pit(), row.endpos())
rp.paintSelection();
rp.paintAppendix();
rp.paintDepthBar();
- rp.paintChangeBar();
+ if (row.needsChangeBar())
+ rp.paintChangeBar();
if (i == 0 && !row.isRTL())
rp.paintFirst();
if (i == nrows - 1 && row.isRTL())