]> git.lyx.org Git - lyx.git/blobdiff - src/TextMetrics.cpp
Try to deal with one of the big problems here, namely, that we
[lyx.git] / src / TextMetrics.cpp
index 3c2312eb047de4dcf8dd918246d2a1d2f85e1b4a..a3f7550468dda2cae6c7d654d16c6aa6f2c0a426 100644 (file)
@@ -831,11 +831,24 @@ pos_type TextMetrics::rowBreakPoint(int width, pit_type const pit,
        // pixel width since last breakpoint
        int chunkwidth = 0;
 
+       docstring const s(1, char_type(0x00B6));
+       Font f;
+       int par_marker_width = theFontMetrics(f).width(s);
+
        FontIterator fi = FontIterator(*this, par, pit, pos);
        pos_type point = end;
        pos_type i = pos;
+
+       ParagraphList const & pars_ = text_->paragraphs();
+       bool const draw_par_end_marker = lyxrc.paragraph_markers
+               && size_type(pit + 1) < pars_.size();
+                               
        for ( ; i < end; ++i, ++fi) {
                int thiswidth = pm.singleWidth(i, *fi);
+               
+               if (draw_par_end_marker && i == end - 1)
+                       // enlarge the last character to hold the end-of-par marker
+                       thiswidth += par_marker_width;
 
                // add inline completion width
                if (inlineCompletionLPos == i) {
@@ -965,6 +978,18 @@ int TextMetrics::rowWidth(int right_margin, pit_type const pit,
                }
        }
 
+       // count the paragraph end marker.
+       if (end == par.size() && lyxrc.paragraph_markers) {
+               ParagraphList const & pars_ = text_->paragraphs();
+               if (size_type(pit + 1) < pars_.size()) {
+                       // enlarge the last character to hold the
+                       // end-of-par marker
+                       docstring const s(1, char_type(0x00B6));
+                       Font f;
+                       w += theFontMetrics(f).width(s);
+               }
+       }
+
        if (body_pos > 0 && body_pos >= end) {
                FontMetrics const & fm = theFontMetrics(
                        text_->labelFont(par));
@@ -1406,7 +1431,7 @@ pit_type TextMetrics::getPitNearY(int y)
 }
 
 
-Row const & TextMetrics::getPitAndRowNearY(int y, pit_type & pit,
+Row const & TextMetrics::getPitAndRowNearY(int y, pit_type & pit,
        bool assert_in_view, bool up)
 {
        ParagraphMetrics const & pm = par_metrics_[pit];
@@ -1422,23 +1447,27 @@ Row const & TextMetrics::getPitAndRowNearY(int y, pit_type & pit,
 
        if (assert_in_view && yy + rit->height() != y) {
                if (!up) {
-                       if (rit != pm.rows().begin())
+                       if (rit != pm.rows().begin()) {
+                               y = yy;
                                --rit;
-                       else if (pit != 0) {
+                       else if (pit != 0) {
                                --pit;
                                newParMetricsUp();
                                ParagraphMetrics const & pm2 = par_metrics_[pit];
                                rit = pm2.rows().end();
                                --rit;
+                               y = yy;
                        }
                } else  {
-                       if (rit != rlast)
+                       if (rit != rlast) {
+                               y = yy + rit->height();
                                ++rit;
-                       else if (pit != int(par_metrics_.size())) {
+                       else if (pit != int(par_metrics_.size())) {
                                ++pit;
                                newParMetricsDown();
                                ParagraphMetrics const & pm2 = par_metrics_[pit];
                                rit = pm2.rows().begin();
+                               y = pm2.position();
                        }
                }
        }
@@ -1457,8 +1486,9 @@ Inset * TextMetrics::editXY(Cursor & cur, int x, int y,
        }
        pit_type pit = getPitNearY(y);
        LASSERT(pit != -1, return 0);
-
-       Row const & row = getPitAndRowNearY(y, pit, assert_in_view, up);
+       
+       int yy = y; // is modified by getPitAndRowNearY
+       Row const & row = getPitAndRowNearY(yy, pit, assert_in_view, up);
        bool bound = false;
 
        int xx = x; // is modified by getColumnNearX
@@ -1470,7 +1500,7 @@ Inset * TextMetrics::editXY(Cursor & cur, int x, int y,
        cur.setTargetX(x);
 
        // try to descend into nested insets
-       Inset * inset = checkInsetHit(x, y);
+       Inset * inset = checkInsetHit(x, yy);
        //lyxerr << "inset " << inset << " hit at x: " << x << " y: " << y << endl;
        if (!inset) {
                // Either we deconst editXY or better we move current_font
@@ -1498,7 +1528,7 @@ Inset * TextMetrics::editXY(Cursor & cur, int x, int y,
        }
 
        // Try to descend recursively inside the inset.
-       inset = inset->editXY(cur, x, y);
+       inset = inset->editXY(cur, x, yy);
 
        if (cur.top().text() == text_)
                cur.setCurrentFont();
@@ -1659,6 +1689,15 @@ int TextMetrics::cursorX(CursorSlice const & sl,
        if (end > 0 && end < par.size() && par.isSeparator(end - 1))
                skipped_sep_vpos = bidi.log2vis(end - 1);
 
+       if (lyxrc.paragraph_markers && text_->isRTL(par)) {
+               ParagraphList const & pars_ = text_->paragraphs();
+               if (size_type(pit + 1) < pars_.size()) {
+                       FontInfo f;
+                       docstring const s = docstring(1, char_type(0x00B6));
+                       x += theFontMetrics(f).width(s);
+               }
+       }
+
        // Inline completion RTL special case row_pos == cursor_pos:
        // "__|b" => cursor_pos is right of __
        if (row_pos == inlineCompletionVPos && row_pos == cursor_vpos) {
@@ -2148,11 +2187,16 @@ void TextMetrics::drawParagraph(PainterInfo & pi, pit_type pit, int x, int y) co
                rp.paintAppendix();
                rp.paintDepthBar();
                rp.paintChangeBar();
-               if (i == 0)
+               bool const is_rtl = text_->isRTL(text_->getPar(pit));
+               if (i == 0 && !is_rtl)
                        rp.paintFirst();
+               if (i == nrows - 1 && is_rtl)
+                       rp.paintLast();
                rp.paintText();
-               if (i == nrows - 1)
+               if (i == nrows - 1 && !is_rtl)
                        rp.paintLast();
+               if (i == 0 && is_rtl)
+                       rp.paintFirst();
                y += row.descent();
                // Restore full_repaint status.
                pi.full_repaint = tmp;