}
-int TextMetrics::getAlign(Paragraph const & par, pos_type const pos) const
+LyXAlignment TextMetrics::getAlign(Paragraph const & par, pos_type const pos) const
{
Layout const & layout = par.layout();
- int align;
+ LyXAlignment align;
if (par.params().align() == LYX_ALIGN_LAYOUT)
align = layout.align;
else
Paragraph const & par = text_->getPar(pit);
- double const w = width - row.right_margin - row.width();
+ int const w = width - row.right_margin - row.width();
// FIXME: put back this assertion when the crash on new doc is solved.
//LASSERT(w >= 0, /**/);
bool const is_rtl = text_->isRTL(par);
if (is_rtl)
- row.x = rightMargin(pit);
+ row.left_margin = rightMargin(pit);
else
- row.x = leftMargin(max_width_, pit, row.pos());
+ row.left_margin = leftMargin(max_width_, pit, row.pos());
// is there a manual margin with a manual label
Layout const & layout = par.layout();
// are there any hfills in the row?
if (int const nh = numberOfHfills(row, par.beginOfBody())) {
if (w > 0)
- hfill = w / double(nh);
+ hfill = double(w) / nh;
// we don't have to look at the alignment if it is ALIGN_LEFT and
// if the row is already larger then the permitted width as then
// we force the LEFT_ALIGN'edness!
* or newline, then stretch it */
if (ns && !row.right_boundary()
&& row.endpos() != par.size()) {
- setSeparatorWidth(row, w / ns);
+ setSeparatorWidth(row, double(w) / ns);
row.dimension().wid = width;
} else if (is_rtl) {
row.dimension().wid = width;
- row.x += w;
+ row.left_margin += w;
}
break;
}
case LYX_ALIGN_RIGHT:
- row.x += w;
+ row.left_margin += w;
break;
case LYX_ALIGN_CENTER:
row.dimension().wid = width - w / 2;
- row.x += w / 2;
+ row.left_margin += w / 2;
+ break;
+ case LYX_ALIGN_LEFT:
+ case LYX_ALIGN_NONE:
+ case LYX_ALIGN_LAYOUT:
+ case LYX_ALIGN_SPECIAL:
+ case LYX_ALIGN_DECIMAL:
break;
}
}
-#if 0
- if (is_rtl) {
- pos_type body_pos = par.beginOfBody();
- pos_type end = row.endpos();
-
- if (body_pos > 0
- && (body_pos > end || !par.isLineSeparator(body_pos - 1))) {
- row.x += theFontMetrics(text_->labelFont(par)).
- width(layout.labelsep);
- if (body_pos <= end)
- row.x += row.label_hfill;
- }
- }
-#endif
-
// Finally, handle hfill insets
pos_type const endpos = row.endpos();
pos_type body_pos = par.beginOfBody();
for ( ; cit != cend; ++cit) {
if (row.label_hfill && cit->endpos == body_pos
&& cit->type == Row::SPACE)
- cit->dim.wid -= row.label_hfill * (nlh - 1);
+ cit->dim.wid -= int(row.label_hfill * (nlh - 1));
if (!cit->inset || !cit->inset->isHfill())
continue;
if (pm.hfillExpansion(row, cit->pos))
// iterate over elements before main body (except the last one,
// which is extra space).
while (cit!= end && cit->endpos < par.beginOfBody()) {
- w += cit->width();
+ w += cit->dim.wid;
++cit;
}
int const width = max_width_ - right_margin;
pos_type const body_pos = par.beginOfBody();
row.clear();
- row.dimension().wid = leftMargin(max_width_, pit, pos);
+ // This make get changed in computeRowMetrics depending on RTL
+ row.left_margin = leftMargin(max_width_, pit, pos);
+ row.dimension().wid = row.left_margin;
row.right_margin = right_margin;
if (pos >= end || row.width() > width) {
- row.dimension().wid += right_margin;
row.endpos(end);
return;
}
// before body_pos. Instead, insert some spacing to
// align text
FontMetrics const & fm = theFontMetrics(text_->labelFont(par));
+ // this is needed to make sure that the row width is correct
+ row.finalizeLast();
int const add = max(fm.width(par.layout().labelsep),
labelEnd(pit) - row.width());
row.addSpace(i, add, *fi, par.lookupChange(i));
pos_type pos = row.pos();
boundary = false;
if (row.empty())
- x = row.x;
- else if (x <= row.x) {
+ x = row.left_margin;
+ else if (x <= row.left_margin) {
pos = row.front().left_pos();
- x = row.x;
- } else if (x >= row.width() - row.right_margin) {
+ x = row.left_margin;
+ } else if (x >= row.width()) {
pos = row.back().right_pos();
- x = row.width() - row.right_margin;
+ x = row.width();
} else {
- double w = row.x;
+ double w = row.left_margin;
Row::const_iterator cit = row.begin();
Row::const_iterator cend = row.end();
for ( ; cit != cend; ++cit) {
- if (w <= x && w + cit->width() > x) {
- double x_offset = x - w;
+ if (w <= x && w + cit->full_width() > x) {
+ int x_offset = int(x - w);
pos = cit->x2pos(x_offset);
- x = x_offset + w;
+ x = int(x_offset + w);
break;
}
- w += cit->width();
+ w += cit->full_width();
}
if (cit == row.end()) {
pos = row.back().right_pos();
- x = row.width() - row.right_margin;
+ x = row.width();
}
/** This tests for the case where the cursor is placed
* just before a font direction change. See comment on
}
/** This tests for the case where the cursor is set at the end
- * of a row which has been broken due to a display inset on
- * next row. This is indicated by Row::right_boundary.
+ * of a row which has been broken due something else than a
+ * separator (a display inset or a forced breaking of the
+ * row). We know that there is a separator when the end of the
+ * row is larger than the end of its last element.
*/
if (!row.empty() && pos == row.back().endpos
&& row.back().endpos == row.endpos())
- boundary = row.right_boundary();
+ boundary = true;
x += xo;
return pos;
if (row.empty()
|| (pos == row.begin()->left_pos()
&& pos != row.begin()->right_pos()))
- return int(row.x);
+ return row.left_margin;
Row::const_iterator cit = row.begin();
- double x = row.x;
+ double x = row.left_margin;
for ( ; cit != row.end() ; ++cit) {
/** Look whether the cursor is inside the element's
* span. Note that it is necessary to take the
x += cit->pos2x(pos);
break;
}
- x += cit->width();
+ x += cit->full_width();
}
return int(x);
}
-void TextMetrics::drawParagraph(PainterInfo & pi, pit_type pit, int x, int y) const
+void TextMetrics::drawParagraph(PainterInfo & pi, pit_type const pit, int const x, int y) const
{
BufferParams const & bparams = bv_->buffer().params();
ParagraphMetrics const & pm = par_metrics_[pit];
for (size_t i = 0; i != nrows; ++i) {
Row const & row = pm.rows()[i];
+ int row_x = x;
if (i)
y += row.ascent();
// Adapt to cursor row scroll offset if applicable.
if (bv_->currentRowSlice() == rowSlice)
- x -= bv_->horizScrollOffset();
+ row_x -= bv_->horizScrollOffset();
// It is not needed to draw on screen if we are not inside.
pi.pain.setDrawingEnabled(inside && original_drawing_state);
- RowPainter rp(pi, *text_, pit, row, x, y);
+ RowPainter rp(pi, *text_, pit, row, row_x, y);
if (selection)
row.setSelectionAndMargins(sel_beg_par, sel_end_par);
// Clear background of this row if paragraph background was not
// already cleared because of a full repaint.
if (!pi.full_repaint && row_has_changed) {
- LYXERR(Debug::PAINTING, "Clear rect@("
- << max(x, 0) << ", " << y-row.ascent() << ")="
+ LYXERR(Debug::PAINTING, "Clear rect@("
+ << max(row_x, 0) << ", " << y - row.ascent() << ")="
<< width() << " x " << row.height());
- pi.pain.fillRectangle(max(x, 0), y - row.ascent(),
+ pi.pain.fillRectangle(max(row_x, 0), y - row.ascent(),
width(), row.height(), pi.background_color);
}
rp.paintLast();
if (i == 0 && is_rtl)
rp.paintFirst();
+ rp.paintTooLargeMarks(row_x < 0,
+ row_x + row.width() > bv_->workWidth());
y += row.descent();
// Restore full_repaint status.