]> git.lyx.org Git - lyx.git/blobdiff - src/TextMetrics.cpp
Cleanup bruteFind.
[lyx.git] / src / TextMetrics.cpp
index e9303503a759e15d7dcad812668e4f6501613b64..39eb2d441b4de05b945db46010ea838c61402519 100644 (file)
@@ -200,13 +200,13 @@ bool TextMetrics::metrics(MetricsInfo & mi, Dimension & dim, int min_width)
 
 int TextMetrics::rightMargin(ParagraphMetrics const & pm) const
 {
-       return main_text_? pm.rightMargin(*bv_) : 0;
+       return text_->isMainText() ? pm.rightMargin(*bv_) : 0;
 }
 
 
 int TextMetrics::rightMargin(pit_type const pit) const
 {
-       return main_text_? par_metrics_[pit].rightMargin(*bv_) : 0;
+       return text_->isMainText() ? par_metrics_[pit].rightMargin(*bv_) : 0;
 }
 
 
@@ -353,7 +353,6 @@ bool TextMetrics::redoParagraph(pit_type const pit)
        pm.reset(par);
 
        Buffer & buffer = bv_->buffer();
-       main_text_ = (text_ == &buffer.text());
        bool changed = false;
 
        // Check whether there are InsetBibItems that need fixing
@@ -443,12 +442,13 @@ bool TextMetrics::redoParagraph(pit_type const pit)
                if (row_index == pm.rows().size())
                        pm.rows().push_back(Row());
                Row & row = pm.rows()[row_index];
+               row.pit(pit);
                row.pos(first);
                breakRow(row, right_margin, pit);
                setRowHeight(row, pit);
                row.setChanged(false);
                if (row_index || row.endpos() < par.size()
-                       || (row.right_boundary() && par.inInset().lyxCode() != CELL_CODE))
+                   || (row.right_boundary() && par.inInset().lyxCode() != CELL_CODE)) {
                        /* If there is more than one row or the row has been
                         * broken by a display inset or a newline, expand the text
                         * to the full allowable width. This setting here is
@@ -458,7 +458,9 @@ bool TextMetrics::redoParagraph(pit_type const pit)
                         * that, and it triggers when using a caption in a
                         * longtable (see bugs #9945 and #9757).
                         */
-                       dim_.wid = max_width_;
+                       if (dim_.wid < max_width_)
+                               dim_.wid = max_width_;
+               }
                int const max_row_width = max(dim_.wid, row.width());
                computeRowMetrics(pit, row, max_row_width);
                first = row.endpos();
@@ -791,6 +793,7 @@ void TextMetrics::breakRow(Row & row, int const right_margin, pit_type const pit
        pos_type const pos = row.pos();
        pos_type const body_pos = par.beginOfBody();
        bool const is_rtl = text_->isRTL(par);
+       bool need_new_row = false;
 
        row.clear();
        row.left_margin = leftMargin(max_width_, pit, pos);
@@ -803,11 +806,6 @@ void TextMetrics::breakRow(Row & row, int const right_margin, pit_type const pit
        // the width available for the row.
        int const width = max_width_ - row.right_margin;
 
-       if (pos >= end) {
-               row.endpos(end);
-               return;
-       }
-
        ParagraphList const & pars = text_->paragraphs();
 
 #if 0
@@ -829,6 +827,9 @@ void TextMetrics::breakRow(Row & row, int const right_margin, pit_type const pit
        pos_type i = pos;
        FontIterator fi = FontIterator(*this, par, pit, pos);
        do {
+               // this can happen for an empty row after a newline
+               if (i >= end)
+                       break;
                char_type c = par.getChar(i);
                // The most special cases are handled first.
                if (par.isInset(i)) {
@@ -887,6 +888,7 @@ void TextMetrics::breakRow(Row & row, int const right_margin, pit_type const pit
                    || (!row.empty() && row.back().inset
                        && row.back().inset->display())) {
                        row.right_boundary(true);
+                       need_new_row = par.isNewline(i);
                        ++i;
                        break;
                }
@@ -898,7 +900,7 @@ void TextMetrics::breakRow(Row & row, int const right_margin, pit_type const pit
        row.endpos(i);
 
        // End of paragraph marker
-       if (lyxrc.paragraph_markers
+       if (lyxrc.paragraph_markers && !need_new_row
            && i == end && size_type(pit + 1) < pars.size()) {
                // add a virtual element for the end-of-paragraph
                // marker; it is shown on screen, but does not exist
@@ -1084,7 +1086,7 @@ void TextMetrics::setRowHeight(Row & row, pit_type const pit,
        // following code in another method specially tailored for the
        // main Text. The following test is thus bogus.
        // Top and bottom margin of the document (only at top-level)
-       if (main_text_ && topBottomSpace) {
+       if (text_->isMainText() && topBottomSpace) {
                if (pit == 0 && row.pos() == 0)
                        maxasc += 20;
                if (pit + 1 == pit_type(pars.size()) &&
@@ -1111,6 +1113,16 @@ pos_type TextMetrics::getPosNearX(Row const & row, int & x,
        int const xo = origin_.x_;
        x -= xo;
 
+       int offset = 0;
+       CursorSlice rowSlice(const_cast<InsetText &>(text_->inset()));
+       rowSlice.pit() = row.pit();
+       rowSlice.pos() = row.pos();
+
+       // Adapt to cursor row scroll offset if applicable.
+       if (bv_->currentRowSlice() == rowSlice)
+               offset = bv_->horizScrollOffset();
+       x += offset;
+
        pos_type pos = row.pos();
        boundary = false;
        if (row.empty())
@@ -1164,8 +1176,10 @@ pos_type TextMetrics::getPosNearX(Row const & row, int & x,
                else
                        boundary = row.right_boundary();
        }
-       x += xo;
+
+       x += xo - offset;
        //LYXERR0("getPosNearX ==> pos=" << pos << ", boundary=" << boundary);
+
        return pos;
 }
 
@@ -1594,7 +1608,8 @@ bool TextMetrics::cursorEnd(Cursor & cur)
                        boundary = true;
                else
                        --end;
-       }
+       } else if (cur.paragraph().isEnvSeparator(end-1))
+               --end;
        return text_->setCursor(cur, cur.pit(), end, true, boundary);
 }