#include "MetricsInfo.h"
#include "ParagraphParameters.h"
#include "RowPainter.h"
+#include "Session.h"
#include "Text.h"
#include "TextClass.h"
#include "VSpace.h"
}
// The space above and below the paragraph.
- int const top = parTopSpacing(pit);
- pm.rows().front().dim().asc += top;
- int const bottom = parBottomSpacing(pit);
- pm.rows().back().dim().des += bottom;
- pm.dim().des += top + bottom;
-
- pm.dim().asc += pm.rows()[0].ascent();
- pm.dim().des -= pm.rows()[0].ascent();
+ int top = parTopSpacing(pit);
+ int bottom = parBottomSpacing(pit);
// Top and bottom margin of the document (only at top-level)
// FIXME: It might be better to move this in another method
// specially tailored for the main text.
if (text_->isMainText()) {
if (pit == 0)
- pm.dim().asc += bv_->topMargin();
- ParagraphList const & pars = text_->paragraphs();
- if (pit + 1 == pit_type(pars.size())) {
- pm.dim().des += bv_->bottomMargin();
+ top += bv_->topMargin();
+ if (pit + 1 == pit_type(text_->paragraphs().size())) {
+ bottom += bv_->bottomMargin();
}
}
+ // Add the top/bottom space to rows and paragraph metrics
+ pm.rows().front().dim().asc += top;
+ pm.rows().back().dim().des += bottom;
+ pm.dim().des += top + bottom;
+
+ // Move the pm ascent to be the same as the first row ascent
+ pm.dim().asc += pm.rows().front().ascent();
+ pm.dim().des -= pm.rows().front().ascent();
+
changed |= old_dim.height() != pm.dim().height();
return changed;
row.dim().asc = maxasc;
row.dim().des = maxdes;
+
+ // This is useful for selections
+ row.contents_dim() = row.dim();
}
{
ParagraphMetrics const & pm = par_metrics_[pit];
- int yy = pm.position() - pm.rows().front().ascent();
+ int yy = pm.position() - pm.ascent();
LBUFERR(!pm.rows().empty());
RowList::const_iterator rit = pm.rows().begin();
RowList::const_iterator rlast = pm.rows().end();
int TextMetrics::leftMargin(pit_type pit) const
{
- // the + 1 is useful when the paragraph is empty
- return leftMargin(pit, text_->paragraphs()[pit].size() + 1);
+ // FIXME: what is the semantics? It depends on whether the
+ // paragraph is empty!
+ return leftMargin(pit, text_->paragraphs()[pit].size());
}
Paragraph const & par = pars[pit];
LASSERT(pos >= 0, return 0);
// We do not really care whether pos > par.size(), since we do not
- // access the data. It can be actially useful, when querying the
+ // access the data. It can be actually useful, when querying the
// margin without indentation (see leftMargin(pit_type).
Buffer const & buffer = bv_->buffer();
if (text_->isRTL(pit))
swap(pi.leftx, pi.rightx);
+ BookmarksSection::BookmarkPosList bpl =
+ theSession().bookmarks().bookmarksInPar(bv_->buffer().fileName(), pm.par().id());
+
for (size_t i = 0; i != nrows; ++i) {
Row const & row = pm.rows()[i];
rp.paintText();
rp.paintTooLargeMarks(row_x + row.left_x() < 0,
row_x + row.right_x() > bv_->workWidth());
+ // indicate bookmarks presence in margin
+ for (auto const & bp_p : bpl)
+ if (bp_p.second >= row.pos() && bp_p.second < row.endpos())
+ rp.paintBookmark(bp_p.first);
+
y += row.descent();
#if 0