]> git.lyx.org Git - lyx.git/blobdiff - src/TextMetrics.cpp
grammar
[lyx.git] / src / TextMetrics.cpp
index 3154f0d6034804b00fdfccee106eb93b76d1f7dd..e95757c88b51be6e2063e35d87e4153ecc6025bb 100644 (file)
@@ -880,10 +880,6 @@ bool TextMetrics::breakRow(Row & row, int const right_margin) const
 {
        LATTEST(row.empty());
        Paragraph const & par = text_->getPar(row.pit());
-       Buffer const & buf = text_->inset().buffer();
-       BookmarksSection::BookmarkPosList bpl =
-               theSession().bookmarks().bookmarksInPar(buf.fileName(), par.id());
-
        pos_type const end = par.size();
        pos_type const pos = row.pos();
        pos_type const body_pos = par.beginOfBody();
@@ -910,23 +906,7 @@ bool TextMetrics::breakRow(Row & row, int const right_margin) const
        // or the end of the par, then build a representation of the row.
        pos_type i = pos;
        FontIterator fi = FontIterator(*this, par, row.pit(), pos);
-       // The real stopping condition is a few lines below.
-       while (true) {
-               // Firstly, check whether there is a bookmark here.
-               for (auto const & bp_p : bpl)
-                       if (bp_p.second == i) {
-                               Font f = *fi;
-                               f.fontInfo().setColor(Color_bookmark);
-                               // ❶ U+2776 DINGBAT NEGATIVE CIRCLED DIGIT ONE
-                               char_type const ch = 0x2775 + bp_p.first;
-                               row.addVirtual(i, docstring(1, ch), f, Change());
-                       }
-
-               // The stopping condition is here so that the display of a
-               // bookmark can take place at paragraph start too.
-               if (i >= end || (i != pos && row.width() > width))
-                       break;
-
+       while (i < end && (i == pos || row.width() <= width)) {
                char_type c = par.getChar(i);
                // The most special cases are handled first.
                if (par.isInset(i)) {
@@ -1020,7 +1000,9 @@ bool TextMetrics::breakRow(Row & row, int const right_margin) const
                // in the paragraph.
                Font f(text_->layoutFont(row.pit()));
                f.fontInfo().setColor(Color_paragraphmarker);
-               f.setLanguage(par.getParLanguage(buf.params()));
+               BufferParams const & bparams
+                       = text_->inset().buffer().params();
+               f.setLanguage(par.getParLanguage(bparams));
                // ¶ U+00B6 PILCROW SIGN
                row.addVirtual(end, docstring(1, char_type(0x00B6)), f, change);
        }
@@ -1185,6 +1167,9 @@ void TextMetrics::setRowHeight(Row & row) const
 
        row.dim().asc = maxasc;
        row.dim().des = maxdes;
+
+       // This is useful for selections
+       row.contents_dim() = row.dim();
 }
 
 
@@ -1618,8 +1603,9 @@ void TextMetrics::deleteLineForward(Cursor & cur)
 
 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());
 }
 
 
@@ -1632,7 +1618,7 @@ int TextMetrics::leftMargin(pit_type const pit, pos_type const pos) const
        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();
@@ -1872,6 +1858,9 @@ void TextMetrics::drawParagraph(PainterInfo & pi, pit_type const pit, int const
        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];
@@ -1960,6 +1949,11 @@ void TextMetrics::drawParagraph(PainterInfo & pi, pit_type const pit, int const
                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