]> git.lyx.org Git - lyx.git/blobdiff - src/rowpainter.C
fix crash when collapsing ert with cursor inside
[lyx.git] / src / rowpainter.C
index b807d3361ae95e9c99708acf8bd6d8742f2a7999..68034fe0f35f6ee2d05e7a11e5533007b29b2096 100644 (file)
@@ -58,7 +58,7 @@ class RowPainter {
 public:
        /// initialise and run painter
        RowPainter(PainterInfo & pi, LyXText const & text,
-               pit_type pit, Row & row, int x, int y);
+               pit_type pit, Row const & row, int x, int y);
 
        // paint various parts
        void paintAppendix();
@@ -101,7 +101,7 @@ private:
        ParagraphList & pars_;
 
        /// The row to paint
-       Row & row_;
+       Row const & row_;
 
        /// Row's paragraph
        pit_type const pit_;
@@ -119,7 +119,7 @@ private:
 
 
 RowPainter::RowPainter(PainterInfo & pi,
-       LyXText const & text, pit_type pit, Row & row, int x, int y)
+       LyXText const & text, pit_type pit, Row const & row, int x, int y)
        : bv_(*pi.base.bv), pain_(pi.pain), text_(text), pars_(text.paragraphs()),
          row_(row), pit_(pit), par_(text.paragraphs()[pit]),
          xo_(x), yo_(y), width_(text_.width())
@@ -142,7 +142,9 @@ RowPainter::RowPainter(PainterInfo & pi,
 /// "temporary"
 LyXFont const RowPainter::getFont(pos_type pos) const
 {
-       return text_.getFont(par_, pos);
+       LyXFont pf(text_.getFont(par_, pos));
+       text_.applyOuterFont(pf);
+       return pf;
 }
 
 
@@ -178,7 +180,7 @@ void RowPainter::paintInset(pos_type const pos)
        PainterInfo pi(const_cast<BufferView *>(&bv_), pain_);
        pi.base.font = getFont(pos);
        pi.ltr_pos = (text_.bidi.level(pos) % 2 == 0);
-       theCoords.insets_.add(inset, int(x_), yo_);
+       theCoords.insets().add(inset, int(x_), yo_);
        inset->drawSelection(pi, int(x_), yo_);
        inset->draw(pi, int(x_), yo_);
        x_ += inset->width();
@@ -467,7 +469,7 @@ void RowPainter::paintFirst()
 
        // start of appendix?
        if (parparams.startOfAppendix())
-               y_top += paintAppendixStart(yo_ + y_top + 2 * defaultRowHeight());
+               y_top += paintAppendixStart(yo_ - row_.ascent() + 2 * defaultRowHeight());
 
        Buffer const & buffer = *bv_.buffer();
 
@@ -499,35 +501,35 @@ void RowPainter::paintFirst()
                      || layout->latextype != LATEX_ENVIRONMENT
                      || is_seq)) {
 
-               LyXFont font = getLabelFont();
-               if (!par_.getLabelstring().empty()) {
+               LyXFont const font = getLabelFont();
+               string const str = par_.getLabelstring();
+               if (!str.empty()) {
                        double x = x_;
-                       string const str = par_.getLabelstring();
 
                        // this is special code for the chapter layout. This is
                        // printed in an extra row and has a pagebreak at
                        // the top.
                        if (layout->counter == "chapter") {
-                               if (buffer.params().secnumdepth >= 0) {
-                                       double spacing_val = 1.0;
-                                       if (!parparams.spacing().isDefault()) {
-                                               spacing_val = parparams.spacing().getValue();
-                                       } else {
-                                               spacing_val = buffer.params().spacing().getValue();
-                                       }
+                               double spacing_val = 1.0;
+                               if (!parparams.spacing().isDefault()) {
+                                       spacing_val = parparams.spacing().getValue();
+                               } else {
+                                       spacing_val = buffer.params().spacing().getValue();
+                               }
+#ifdef WITH_WARNINGS
 #warning Look is this correct?
-                                       int const labeladdon = int(font_metrics::maxHeight(font) * layout->spacing.getValue() * spacing_val);
-
-                                       int const maxdesc = int(font_metrics::maxDescent(font) * layout->spacing.getValue() * spacing_val)
-                                               + int(layout->parsep) * defaultRowHeight();
+#endif
+                               int const labeladdon = int(font_metrics::maxHeight(font) * layout->spacing.getValue() * spacing_val);
 
-                                       if (is_rtl) {
-                                               x = width_ - leftMargin() -
-                                                       font_metrics::width(str, font);
-                                       }
+                               int const maxdesc = int(font_metrics::maxDescent(font) * layout->spacing.getValue() * spacing_val)
+                                       + int(layout->parsep) * defaultRowHeight();
 
-                                       pain_.text(int(x), yo_ - maxdesc - labeladdon, str, font);
+                               if (is_rtl) {
+                                       x = width_ - leftMargin() -
+                                               font_metrics::width(str, font);
                                }
+
+                               pain_.text(int(x), yo_ - maxdesc - labeladdon, str, font);
                        } else {
                                if (is_rtl) {
                                        x = width_ - leftMargin()
@@ -662,10 +664,9 @@ void RowPainter::paintText()
                // if we reach the end of a struck out range, paint it
                // we also don't paint across things like tables
                if (running_strikeout && (highly_editable_inset || !is_struckout)) {
-                       // FIXME this should take real text height into account, not
-                       // the whole row including padding whitespace
-                       //int const middle = yo_ + (- row_.ascent() + row_.top_of_text()) / 2;
-                       int const middle = yo_ - row_.ascent() / 2;
+                       // calculate 1/3 height of the buffer's default font
+                       int const middle =
+                               yo_ - font_metrics::maxAscent(text_.defaultfont_) / 3;
                        pain_.line(last_strikeout_x, middle, int(x_), middle,
                                LColor::strikeout, Painter::line_solid, Painter::line_thin);
                        running_strikeout = false;
@@ -716,9 +717,9 @@ void RowPainter::paintText()
 
        // if we reach the end of a struck out range, paint it
        if (running_strikeout) {
-               //top_of_text = font_metrics::maxAscent(font);
-               //int const middle = yo_ - top_of_text() / 2;
-               int const middle = yo_ - row_.ascent() / 2;
+               // calculate 1/3 height of the buffer's default font
+               int const middle =
+                       yo_ - font_metrics::maxAscent(text_.defaultfont_) / 3;
                pain_.line(last_strikeout_x, middle, int(x_), middle,
                        LColor::strikeout, Painter::line_solid, Painter::line_thin);
                running_strikeout = false;
@@ -736,12 +737,12 @@ void paintPar
 
        Paragraph & par = text.paragraphs()[pit];
 
-       RowList::iterator const rb = par.rows().begin();
-       RowList::iterator const re = par.rows().end();
-       theCoords.pars_[&text][pit] = Point(x, y);
+       RowList::const_iterator const rb = par.rows().begin();
+       RowList::const_iterator const re = par.rows().end();
+       theCoords.parPos()[&text][pit] = Point(x, y);
 
        y -= rb->ascent();
-       for (RowList::iterator rit = rb; rit != re; ++rit) {
+       for (RowList::const_iterator rit = rb; rit != re; ++rit) {
                y += rit->ascent();
                bool const inside = (y + rit->descent() >= 0
                                       && y - rit->ascent() < ww);
@@ -792,19 +793,19 @@ void paintText(BufferView const & bv, ViewMetricsInfo const & vi)
                         vi.y1 -  text->getPar(vi.p1 - 1).descent());
        }
 
-       if (vi.p2 < text->paragraphs().size() - 1) {
+       if (vi.p2 < lyx::pit_type(text->paragraphs().size()) - 1) {
                text->redoParagraph(vi.p2 + 1);
                paintPar(pi, *bv.text(), vi.p2 + 1, 0,
                         vi.y2 + text->getPar(vi.p2 + 1).ascent());
        }
 
        // and grey out above (should not happen later)
-       lyxerr << "par ascent: " << text->getPar(vi.p1).ascent() << endl;
+//     lyxerr << "par ascent: " << text->getPar(vi.p1).ascent() << endl;
        if (vi.y1 > 0)
                pain.fillRectangle(0, 0, bv.workWidth(), vi.y1, LColor::bottomarea);
 
        // and possibly grey out below
-       lyxerr << "par descent: " << text->getPar(vi.p1).ascent() << endl;
+//     lyxerr << "par descent: " << text->getPar(vi.p1).ascent() << endl;
        if (vi.y2 < bv.workHeight())
                pain.fillRectangle(0, vi.y2, bv.workWidth(), bv.workHeight() - vi.y2, LColor::bottomarea);
 }