]> git.lyx.org Git - lyx.git/blobdiff - src/rowpainter.C
the spellcheck cleanup
[lyx.git] / src / rowpainter.C
index accc12d899efd3dbb19c75ee89ff587c81047b25..6e1909b1f35547c00d3ae8cc6dccb919895950a9 100644 (file)
@@ -81,7 +81,6 @@ private:
        void paintHebrewComposeChar(lyx::pos_type & vpos);
        void paintArabicComposeChar(lyx::pos_type & vpos);
        void paintChars(lyx::pos_type & vpos, bool hebrew, bool arabic);
-       int paintPageBreak(string const & label, int y);
        int paintAppendixStart(int y);
        int paintLengthMarker(string const & prefix, VSpace const & vsp, int start);
        void paintText();
@@ -97,8 +96,6 @@ private:
        /// return the label font for this row
        LyXFont const getLabelFont() const;
 
-       char const transformChar(char c, lyx::pos_type pos) const;
-
        /// return pixel width for the given pos
        int singleWidth(lyx::pos_type pos) const;
        int singleWidth(lyx::pos_type pos, char c) const;
@@ -135,7 +132,12 @@ RowPainter::RowPainter(BufferView const & bv, LyXText const & text,
      ParagraphList::iterator pit, RowList::iterator rit,
      int y_offset, int x_offset, int y)
        : bv_(bv), pain_(bv_.painter()), text_(text), rit_(rit), row_(*rit),
-         pit_(pit), xo_(x_offset), yo_(y_offset), y_(y)
+         pit_(pit), xo_(x_offset), yo_(y_offset),
+               x_(row_.x()), y_(y),
+               width_(text_.workWidth()),
+               separator_(row_.fill_separator()),
+               hfill_(row_.fill_hfill()),
+               label_hfill_(row_.fill_label_hfill())
 {}
 
 
@@ -165,12 +167,6 @@ LyXFont const RowPainter::getLabelFont() const
 }
 
 
-char const RowPainter::transformChar(char c, lyx::pos_type pos) const
-{
-       return text_.transformChar(c, *pit_, pos);
-}
-
-
 int RowPainter::leftMargin() const
 {
        return text_.leftMargin(pit_, row_);
@@ -231,7 +227,7 @@ void RowPainter::paintArabicComposeChar(pos_type & vpos)
 
        // first char
        char c = pit_->getChar(pos);
-       c = transformChar(c, pos);
+       c = pit_->transformChar(c, pos);
        str +=c;
        ++vpos;
 
@@ -257,7 +253,7 @@ void RowPainter::paintArabicComposeChar(pos_type & vpos)
 void RowPainter::paintChars(pos_type & vpos, bool hebrew, bool arabic)
 {
        pos_type pos = text_.bidi.vis2log(vpos);
-       pos_type const last = lastPos(*pit_, row_);
+       pos_type const end = row_.endpos();
        LyXFont orig_font = getFont(pos);
 
        // first character
@@ -265,16 +261,14 @@ void RowPainter::paintChars(pos_type & vpos, bool hebrew, bool arabic)
        str += pit_->getChar(pos);
        if (arabic) {
                unsigned char c = str[0];
-               str[0] = transformChar(c, pos);
+               str[0] = pit_->transformChar(c, pos);
        }
 
        bool prev_struckout = isDeletedText(*pit_, pos);
        bool prev_newtext = isInsertedText(*pit_, pos);
 
-       ++vpos;
-
        // collect as much similar chars as we can
-       while (vpos <= last && (pos = text_.bidi.vis2log(vpos)) >= 0) {
+       for (++vpos; vpos < end && (pos = text_.bidi.vis2log(vpos)) >= 0; ++vpos) {
                char c = pit_->getChar(pos);
 
                if (!IsPrintableNonspace(c))
@@ -296,16 +290,15 @@ void RowPainter::paintChars(pos_type & vpos, bool hebrew, bool arabic)
                        break;
 
                if (arabic)
-                       c = transformChar(c, pos);
+                       c = pit_->transformChar(c, pos);
+
                str += c;
-               ++vpos;
        }
 
-       if (prev_struckout) {
+       if (prev_struckout)
                orig_font.setColor(LColor::strikeout);
-       } else if (prev_newtext) {
+       else if (prev_newtext)
                orig_font.setColor(LColor::newtext);
-       }
 
        // Draw text and set the new x position
        //lyxerr << "paint row: yo_ " << yo_ << " baseline: " << row_.baseline()
@@ -390,25 +383,26 @@ void RowPainter::paintSelection()
        int const endx = text_.selection.end.x();
        int const starty = text_.selection.start.y();
        int const endy = text_.selection.end.y();
-       RowList::iterator startrow = text_.getRow(text_.selection.start);
-       RowList::iterator endrow = text_.getRow(text_.selection.end);
+       ParagraphList::iterator startpit = text_.getPar(text_.selection.start);
+       ParagraphList::iterator endpit = text_.getPar(text_.selection.end);
+       RowList::iterator startrow = startpit->getRow(text_.selection.start.pos());
+       RowList::iterator endrow = endpit->getRow(text_.selection.end.pos());
+       int const h = row_.height();
 
        if (text_.bidi.same_direction()) {
                int x;
                int y = yo_;
                int w;
-               int h = row_.height();
 
                if (startrow == rit_ && endrow == rit_) {
                        if (startx < endx) {
                                x = int(xo_) + startx;
                                w = endx - startx;
-                               pain_.fillRectangle(x, y, w, h, LColor::selection);
                        } else {
                                x = int(xo_) + endx;
                                w = startx - endx;
-                               pain_.fillRectangle(x, y, w, h, LColor::selection);
                        }
+                       pain_.fillRectangle(x, y, w, h, LColor::selection);
                } else if (startrow == rit_) {
                        int const x = is_rtl ? int(xo_) : int(xo_ + startx);
                        int const w = is_rtl ? startx : (width_ - startx);
@@ -421,10 +415,11 @@ void RowPainter::paintSelection()
                        pain_.fillRectangle(int(xo_), y, width_, h, LColor::selection);
                }
                return;
-       } else if (startrow != rit_ && endrow != rit_) {
+       }
+
+       if (startrow != rit_ && endrow != rit_) {
                if (y_ > starty && y_ < endy) {
                        int w = width_;
-                       int h = row_.height();
                        pain_.fillRectangle(int(xo_), yo_, w, h, LColor::selection);
                }
                return;
@@ -432,13 +427,13 @@ void RowPainter::paintSelection()
 
        if ((startrow != rit_ && !is_rtl) || (endrow != rit_ && is_rtl))
                pain_.fillRectangle(int(xo_), yo_,
-                       int(x_), row_.height(), LColor::selection);
+                       int(x_), h, LColor::selection);
 
        pos_type const body_pos = pit_->beginningOfBody();
-       pos_type const last = lastPos(*pit_, row_);
+       pos_type const end = row_.endpos();
        double tmpx = x_;
 
-       for (pos_type vpos = row_.pos(); vpos <= last; ++vpos)  {
+       for (pos_type vpos = row_.pos(); vpos < end; ++vpos)  {
                pos_type pos = text_.bidi.vis2log(vpos);
                double const old_tmpx = tmpx;
                if (body_pos > 0 && pos == body_pos - 1) {
@@ -471,15 +466,13 @@ void RowPainter::paintSelection()
                        (endrow != rit_ || pos < text_.selection.end.pos())) {
                        // Here we do not use x_ as xo_ was added to x_.
                        pain_.fillRectangle(int(old_tmpx), yo_,
-                               int(tmpx - old_tmpx + 1),
-                               row_.height(), LColor::selection);
+                               int(tmpx - old_tmpx + 1), h, LColor::selection);
                }
        }
 
        if ((startrow != rit_ && is_rtl) || (endrow != rit_ && !is_rtl)) {
                pain_.fillRectangle(int(xo_ + tmpx),
-                                     yo_, int(bv_.workWidth() - tmpx),
-                                     row_.height(), LColor::selection);
+                       yo_, int(bv_.workWidth() - tmpx), h, LColor::selection);
        }
 }
 
@@ -487,9 +480,9 @@ void RowPainter::paintSelection()
 void RowPainter::paintChangeBar()
 {
        pos_type const start = row_.pos();
-       pos_type const end = lastPos(*pit_, row_);
+       pos_type const end = row_.endpos();
 
-       if (!pit_->isChanged(start, end))
+       if (start == end || !pit_->isChanged(start, end - 1))
                return;
 
        int const height = text_.isLastRow(pit_, row_)
@@ -545,7 +538,7 @@ void RowPainter::paintDepthBar()
                int const w = PAPER_MARGIN / 5;
                int x = int(w * i + xo_);
                // only consider the changebar space if we're drawing outer left
-               if (!xo_)
+               if (xo_ == 0)
                        x += CHANGEBAR_MARGIN;
                int const h = yo_ + row_.height() - 1 - (i - next_depth - 1) * 3;
 
@@ -559,7 +552,8 @@ void RowPainter::paintDepthBar()
 }
 
 
-int RowPainter::paintLengthMarker(string const & prefix, VSpace const & vsp, int start)
+int RowPainter::paintLengthMarker(string const & prefix, VSpace const & vsp,
+       int start)
 {
        if (vsp.kind() == VSpace::NONE)
                return 0;
@@ -625,31 +619,6 @@ int RowPainter::paintLengthMarker(string const & prefix, VSpace const & vsp, int
 }
 
 
-int RowPainter::paintPageBreak(string const & label, int y)
-{
-       LyXFont pb_font;
-       pb_font.setColor(LColor::pagebreak);
-       pb_font.decSize();
-
-       int w = 0;
-       int a = 0;
-       int d = 0;
-       font_metrics::rectText(label, pb_font, w, a, d);
-
-       int const text_start = int(xo_ + (width_ - w) / 2);
-       int const text_end = text_start + w;
-
-       pain_.rectText(text_start, y + d, label, pb_font, LColor::none, LColor::none);
-
-       pain_.line(int(xo_), y, text_start, y,
-                  LColor::pagebreak, Painter::line_onoffdash);
-       pain_.line(text_end, y, int(xo_ + width_), y,
-                  LColor::pagebreak, Painter::line_onoffdash);
-
-       return 3 * defaultRowHeight();
-}
-
-
 int RowPainter::paintAppendixStart(int y)
 {
        LyXFont pb_font;
@@ -688,11 +657,6 @@ void RowPainter::paintFirst()
        if (text_.isFirstRow(pit_, row_) && !text_.isInInset())
                y_top += PAPER_MARGIN;
 
-       // draw a top pagebreak
-       if (parparams.pagebreakTop())
-               y_top += paintPageBreak(_("Page Break (top)"),
-                       yo_ + y_top + 2 * defaultRowHeight());
-
        // draw the additional space if needed:
        y_top += paintLengthMarker(_("Space above"), parparams.spaceTop(),
                        yo_ + y_top);
@@ -720,21 +684,6 @@ void RowPainter::paintFirst()
 
        int const ww = bv_.workWidth();
 
-       // draw a top line
-       if (parparams.lineTop()) {
-               int const asc = font_metrics::ascent('x', getFont(0));
-
-               y_top += asc;
-
-               int const w = (text_.isInInset() ? text_.inset_owner->width() : ww);
-               int const xp = static_cast<int>(text_.isInInset() ? xo_ : 0);
-               pain_.line(xp, yo_ + y_top, xp + w, yo_ + y_top,
-                       LColor::topline, Painter::line_solid,
-                       Painter::line_thick);
-
-               y_top += asc;
-       }
-
        bool const is_rtl = pit_->isRightToLeftPar(bv_.buffer()->params());
        bool const is_seq = isFirstInSequence(pit_, text_.ownerParagraphs());
        //lyxerr << "paintFirst: " << pit_->id() << " is_seq: " << is_seq << std::endl;
@@ -812,7 +761,7 @@ void RowPainter::paintFirst()
                        double x = x_;
                        if (layout->labeltype == LABEL_CENTERED_TOP_ENVIRONMENT) {
                                x = ((is_rtl ? leftMargin() : x_)
-                                        + ww - text_.rightMargin(*pit_, *bv_.buffer(), row_)) / 2;
+                                        + ww - text_.rightMargin(*pit_, *bv_.buffer())) / 2;
                                x -= font_metrics::width(str, font) / 2;
                        } else if (is_rtl) {
                                x = ww - leftMargin() -
@@ -837,44 +786,21 @@ void RowPainter::paintLast()
 
        int const ww = bv_.workWidth();
 
-       // draw a bottom pagebreak
-       if (parparams.pagebreakBottom()) {
-               y_bottom -= paintPageBreak(_("Page Break (bottom)"),
-                       yo_ + y_bottom - 2 * defaultRowHeight());
-       }
-
        // draw the additional space if needed:
        int const height = getLengthMarkerHeight(bv_, parparams.spaceBottom());
        y_bottom -= paintLengthMarker(_("Space below"), parparams.spaceBottom(),
                             yo_ + y_bottom - height);
 
-       // draw a bottom line
-       if (parparams.lineBottom()) {
-               int const asc = font_metrics::ascent('x',
-                       getFont(max(pos_type(0), pit_->size() - 1)));
-
-               y_bottom -= asc;
-
-               int const w = text_.isInInset() ? text_.inset_owner->width() : ww;
-               int const xp = int(text_.isInInset() ? xo_ : 0);
-               int const y = yo_ + y_bottom;
-               pain_.line(xp, y, xp + w, y, LColor::topline, Painter::line_solid,
-                         Painter::line_thick);
-
-               y_bottom -= asc;
-       }
-
        bool const is_rtl = pit_->isRightToLeftPar(bv_.buffer()->params());
        int const endlabel = getEndLabel(pit_, text_.ownerParagraphs());
 
        // draw an endlabel
        switch (endlabel) {
        case END_LABEL_BOX:
-       case END_LABEL_FILLED_BOX:
-       {
+       case END_LABEL_FILLED_BOX: {
                LyXFont const font = getLabelFont();
                int const size = int(0.75 * font_metrics::maxAscent(font));
-               int const y = (yo_ + row_.baseline()) - size;
+               int const y = yo_ + row_.baseline() - size;
                int x = is_rtl ? LEFT_MARGIN : ww - PAPER_MARGIN - size;
 
                if (row_.fill() <= size)
@@ -886,16 +812,17 @@ void RowPainter::paintLast()
                        pain_.fillRectangle(x, y, size, size, LColor::eolmarker);
                break;
        }
-       case END_LABEL_STATIC:
-       {
+
+       case END_LABEL_STATIC: {
                LyXFont font = getLabelFont();
                string const & str = pit_->layout()->endlabelstring();
                double const x = is_rtl ?
                        x_ - font_metrics::width(str, font)
-                       : ww - text_.rightMargin(*pit_, *bv_.buffer(), row_) - row_.fill();
+                       : ww - text_.rightMargin(*pit_, *bv_.buffer()) - row_.fill();
                pain_.text(int(x), yo_ + row_.baseline(), str, font);
                break;
        }
+
        case END_LABEL_NO_LABEL:
                break;
        }
@@ -904,10 +831,10 @@ void RowPainter::paintLast()
 
 void RowPainter::paintText()
 {
-       pos_type const last = lastPos(*pit_, row_);
+       pos_type const end = row_.endpos();
        pos_type body_pos = pit_->beginningOfBody();
        if (body_pos > 0 &&
-               (body_pos - 1 > last || !pit_->isLineSeparator(body_pos - 1))) {
+               (body_pos > end || !pit_->isLineSeparator(body_pos - 1))) {
                body_pos = 0;
        }
 
@@ -917,10 +844,10 @@ void RowPainter::paintText()
        bool is_struckout = false;
        int last_strikeout_x = 0;
 
-       pos_type vpos = row_.pos();
-       while (vpos <= last) {
+       for (pos_type vpos = row_.pos(); vpos < end; ) {
                if (x_ > bv_.workWidth())
                        break;
+
                pos_type pos = text_.bidi.vis2log(vpos);
 
                if (pos >= pit_->size()) {
@@ -947,8 +874,7 @@ 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)) {
-                       int const middle = yo_ + row_.top_of_text()
-                               + (row_.baseline() - row_.top_of_text()) / 2;
+                       int const middle = yo_ + (row_.baseline() + row_.top_of_text()) / 2;
                        pain_.line(last_strikeout_x, middle, int(x_), middle,
                                LColor::strikeout, Painter::line_solid, Painter::line_thin);
                        running_strikeout = false;
@@ -999,8 +925,7 @@ void RowPainter::paintText()
 
        // if we reach the end of a struck out range, paint it
        if (running_strikeout) {
-               int const middle = yo_ + row_.top_of_text()
-                       + ((row_.baseline() - row_.top_of_text()) / 2);
+               int const middle = yo_ + (row_.baseline() + row_.top_of_text()) / 2;
                pain_.line(last_strikeout_x, middle, int(x_), middle,
                        LColor::strikeout, Painter::line_solid, Painter::line_thin);
                running_strikeout = false;
@@ -1010,18 +935,11 @@ void RowPainter::paintText()
 
 void RowPainter::paint()
 {
-       width_       = text_.workWidth();
-       x_           = row_.x();
-       separator_   = row_.fill_separator();
-       hfill_       = row_.fill_hfill();
-       label_hfill_ = row_.fill_label_hfill();
-
        // FIXME: what is this fixing ?
        if (text_.isInInset() && x_ < 0)
                x_ = 0;
        x_ += xo_;
 
-       // If we're *not* at the top-level of rows, then the
        // background has already been cleared.
        if (&text_ == bv_.text)
                paintBackground();
@@ -1055,7 +973,6 @@ int paintRows(BufferView const & bv, LyXText const & text,
        int xo, int y, int yf, int yo)
 {
        //lyxerr << "  paintRows: rit: " << &*rit << endl;
-       //const_cast<LyXText&>(text).updateRowPositions();
        int const yy = yf - y;
        int const y2 = bv.painter().paperHeight();
 
@@ -1126,9 +1043,7 @@ int getLengthMarkerHeight(BufferView const & bv, VSpace const & vsp)
 
        LyXFont font;
        font.decSize();
-       int const min_size = max(3 * arrow_size,
-               font_metrics::maxAscent(font)
-               + font_metrics::maxDescent(font));
+       int const min_size = max(3 * arrow_size, font_metrics::maxHeight(font));
 
        if (vsp.length().len().value() < 0.0)
                return min_size;