]> git.lyx.org Git - lyx.git/blobdiff - src/TextMetrics.cpp
Shortcut for LyX HTML output. (Makes my life easier!)
[lyx.git] / src / TextMetrics.cpp
index 9f0261be0b440038d457f09ae57c57ec02dfc1c3..2c74a8c8b6a3a991adb6362d0eeacb38f71a7018 100644 (file)
@@ -447,7 +447,7 @@ bool TextMetrics::redoParagraph(pit_type const pit)
                        - right_margin;
                Font const & font = ii->inset->noFontChange() ?
                        bufferfont : displayFont(pit, ii->pos);
-               MacroContext mc(buffer, parPos);
+               MacroContext mc(&buffer, parPos);
                MetricsInfo mi(bv_, font.fontInfo(), w, mc);
                ii->inset->metrics(mi, dim);
                Dimension const old_dim = pm.insetDimension(ii->inset);
@@ -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));
@@ -1420,8 +1445,8 @@ Row const & TextMetrics::getPitAndRowNearY(int & y, pit_type & pit,
                if (yy + rit->height() > y)
                        break;
 
-       if (assert_in_view && yy + rit->height() != y) {
-               if (!up) {
+       if (assert_in_view) {
+               if (!up && yy + rit->height() > y) {
                        if (rit != pm.rows().begin()) {
                                y = yy;
                                --rit;
@@ -1433,11 +1458,11 @@ Row const & TextMetrics::getPitAndRowNearY(int & y, pit_type & pit,
                                --rit;
                                y = yy;
                        }
-               } else  {
+               } else if (up && yy != y) {
                        if (rit != rlast) {
                                y = yy + rit->height();
                                ++rit;
-                       } else if (pit != int(par_metrics_.size())) {
+                       } else if (pit < int(text_->paragraphs().size()) - 1) {
                                ++pit;
                                newParMetricsDown();
                                ParagraphMetrics const & pm2 = par_metrics_[pit];
@@ -1630,6 +1655,8 @@ int TextMetrics::cursorX(CursorSlice const & sl,
        else if (ppos >= end)
                cursor_vpos = text_->isRTL(par) ? row_pos : end;
        else if (ppos > row_pos && ppos >= end)
+               //FIXME: this code is never reached!
+               //       (see http://www.lyx.org/trac/changeset/8251)
                // Place cursor after char at (logical) position pos - 1
                cursor_vpos = (bidi.level(ppos - 1) % 2 == 0)
                        ? bidi.log2vis(ppos - 1) + 1 : bidi.log2vis(ppos - 1);
@@ -1664,6 +1691,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) {