]> git.lyx.org Git - lyx.git/blobdiff - src/rowpainter.C
minimal effort implementation of:
[lyx.git] / src / rowpainter.C
index 5971b39d4603beb591bacfd7106137449e10d8fe..45bae7438c8b98a0d038623f75ad8f8d609a3e18 100644 (file)
@@ -34,6 +34,8 @@
 
 #include "frontends/font_metrics.h"
 #include "frontends/nullpainter.h"
+#include "frontends/LyXView.h"
+#include "frontends/WorkArea.h"
 #include "frontends/Painter.h"
 
 #include "insets/insettext.h"
@@ -42,6 +44,9 @@
 
 #include <boost/crc.hpp>
 
+using lyx::docstring;
+using lyx::frontend::Painter;
+using lyx::frontend::NullPainter;
 using lyx::char_type;
 using lyx::pos_type;
 using lyx::pit_type;
@@ -54,6 +59,10 @@ using std::string;
 
 namespace {
 
+/// Flag: do a full redraw of inside text of inset
+/// Working variable indicating a full screen refresh
+bool refreshInside;
+
 /**
  * A class used for painting an individual row of text.
  */
@@ -167,15 +176,15 @@ void RowPainter::paintInset(pos_type const pos, LyXFont const & font)
        theCoords.insets().add(inset, int(x_), yo_);
        InsetText const * const in = inset->asTextInset();
        // non-wide insets are painted completely. Recursive
-       bool tmp = bv_.repaintAll();
+       bool tmp = refreshInside;
        if (!in || !in->Wide()) {
-               bv_.repaintAll(true);
+               refreshInside = true;
                lyxerr[Debug::PAINTING] << endl << "Paint inset fully" << endl;
        }
-       if (bv_.repaintAll())
+       if (refreshInside)
                inset->drawSelection(pi, int(x_), yo_);
        inset->draw(pi, int(x_), yo_);
-       bv_.repaintAll(tmp);
+       refreshInside = tmp;
        x_ += inset->width();
 }
 
@@ -210,7 +219,8 @@ void RowPainter::paintHebrewComposeChar(pos_type & vpos, LyXFont const & font)
        }
 
        // Draw nikud
-       pain_.text(int(x_) + dx, yo_, str, font);
+        docstring dstr(str.begin(), str.end());
+       pain_.text(int(x_) + dx, yo_, dstr, font);
 }
 
 
@@ -240,7 +250,8 @@ void RowPainter::paintArabicComposeChar(pos_type & vpos, LyXFont const & font)
                }
        }
        // Draw nikud
-       pain_.text(int(x_) + dx, yo_, str, font);
+        docstring dstr(str.begin(), str.end());
+       pain_.text(int(x_) + dx, yo_, dstr, font);
 }
 
 
@@ -250,13 +261,18 @@ void RowPainter::paintChars(pos_type & vpos, LyXFont font,
        pos_type pos = text_.bidi.vis2log(vpos);
        pos_type const end = row_.endpos();
        FontSpan const font_span = par_.fontSpan(pos);
-       Change::Type const prev_change = par_.lookupChange(pos);
+       Change::Type const prev_change = par_.lookupChange(pos).type;
 
        // first character
+#if 0
        string str;
        str += par_.getChar(pos);
+#else
+       std::vector<char_type> str;
+       str.push_back(par_.getChar(pos));
+#endif
        if (arabic) {
-               unsigned char c = str[0];
+               char_type c = str[0];
                str[0] = par_.transformChar(c, pos);
        }
 
@@ -283,7 +299,11 @@ void RowPainter::paintChars(pos_type & vpos, LyXFont font,
                if (arabic)
                        c = par_.transformChar(c, pos);
 
+#if 0
                str += c;
+#else
+               str.push_back(c);
+#endif
        }
 
        if (prev_change == Change::DELETED)
@@ -293,8 +313,13 @@ void RowPainter::paintChars(pos_type & vpos, LyXFont font,
 
        // Draw text and set the new x position
        //lyxerr << "paint row: yo_ " << yo_ << "\n";
+#if 0
        pain_.text(int(x_), yo_, str, font);
        x_ += font_metrics::width(str, font);
+#else
+       pain_.text(int(x_), yo_, &str[0], str.size(), font);
+       x_ += font_metrics::width(&str[0], str.size(), font);
+#endif
 }
 
 
@@ -436,12 +461,13 @@ int RowPainter::paintAppendixStart(int y)
        int w = 0;
        int a = 0;
        int d = 0;
-       font_metrics::rectText(label, pb_font, w, a, d);
+        docstring dlab(label.begin(), label.end());
+       font_metrics::rectText(dlab, 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_.rectText(text_start, y + d, dlab, pb_font, LColor::none, LColor::none);
 
        pain_.line(int(xo_ + 1), y, text_start, y, LColor::appendix);
        pain_.line(text_end, y, int(xo_ + width_ - 2), y, LColor::appendix);
@@ -494,6 +520,7 @@ void RowPainter::paintFirst()
                string const str = par_.getLabelstring();
                if (!str.empty()) {
                        double x = x_;
+                        docstring dstr(str.begin(), str.end());
 
                        // this is special code for the chapter layout. This is
                        // printed in an extra row and has a pagebreak at
@@ -513,20 +540,22 @@ void RowPainter::paintFirst()
 
                                if (is_rtl) {
                                        x = width_ - leftMargin() -
-                                               font_metrics::width(str, font);
+                                               font_metrics::width(dstr, font);
                                }
 
-                               pain_.text(int(x), yo_ - maxdesc - labeladdon, str, font);
+                               pain_.text(int(x), yo_ - maxdesc - labeladdon, dstr, font);
                        } else {
+                                string lab = layout->labelsep;
+                                docstring dlab(lab.begin(), lab.end());
                                if (is_rtl) {
                                        x = width_ - leftMargin()
-                                               + font_metrics::width(layout->labelsep, font);
+                                               + font_metrics::width(dlab, font);
                                } else {
-                                       x = x_ - font_metrics::width(layout->labelsep, font)
-                                               - font_metrics::width(str, font);
+                                       x = x_ - font_metrics::width(dlab, font)
+                                               - font_metrics::width(dstr, font);
                                }
 
-                               pain_.text(int(x), yo_, str, font);
+                               pain_.text(int(x), yo_, dstr, font);
                        }
                }
 
@@ -539,6 +568,7 @@ void RowPainter::paintFirst()
                LyXFont font = getLabelFont();
                if (!par_.getLabelstring().empty()) {
                        string const str = par_.getLabelstring();
+                        docstring dstr(str.begin(), str.end());
                        double spacing_val = 1.0;
                        if (!parparams.spacing().isDefault())
                                spacing_val = parparams.spacing().getValue();
@@ -556,12 +586,12 @@ void RowPainter::paintFirst()
                                if (is_rtl)
                                        x = leftMargin();
                                x += (width_ - text_.rightMargin(par_) - leftMargin()) / 2;
-                               x -= font_metrics::width(str, font) / 2;
+                               x -= font_metrics::width(dstr, font) / 2;
                        } else if (is_rtl) {
                                x = width_ - leftMargin() -
-                                       font_metrics::width(str, font);
+                                       font_metrics::width(dstr, font);
                        }
-                       pain_.text(int(x), yo_ - maxdesc - labeladdon, str, font);
+                       pain_.text(int(x), yo_ - maxdesc - labeladdon, dstr, font);
                }
        }
 }
@@ -594,10 +624,11 @@ void RowPainter::paintLast()
        case END_LABEL_STATIC: {
                LyXFont font = getLabelFont();
                string const & str = par_.layout()->endlabelstring();
+                docstring dstr(str.begin(), str.end());
                double const x = is_rtl ?
-                       x_ - font_metrics::width(str, font)
+                       x_ - font_metrics::width(dstr, font)
                        : - text_.rightMargin(par_) - row_.width();
-               pain_.text(int(x), yo_, str, font);
+               pain_.text(int(x), yo_, dstr, font);
                break;
        }
 
@@ -675,7 +706,9 @@ void RowPainter::paintText()
                }
 
                if (body_pos > 0 && pos == body_pos - 1) {
-                       int const lwidth = font_metrics::width(layout->labelsep,
+                        string lab = layout->labelsep;
+                        docstring dlab(lab.begin(), lab.end());
+                       int const lwidth = font_metrics::width(dlab,
                                getLabelFont());
 
                        x_ += label_hfill_ + lwidth - width_pos;
@@ -789,19 +822,22 @@ void paintPar
        static PainterInfo nullpi(pi.base.bv, nop);
        int const ww = pi.base.bv->workHeight();
 
+       theCoords.parPos()[&text][pit] = Point(x, y);
+
        Paragraph const & par = text.paragraphs()[pit];
+       if (par.rows().empty())
+               return;
 
        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();
        lyx::size_type rowno(0);
        for (RowList::const_iterator rit = rb; rit != re; ++rit, ++rowno) {
                y += rit->ascent();
-               // Allow setting of bv->repaintAll() for nested insets in
+               // Allow setting of refreshInside for nested insets in
                // this row only
-               bool tmp = pi.base.bv->repaintAll();
+               bool tmp = refreshInside;
 
                // Row signature; has row changed since last paint?
                lyx::size_type const row_sig = calculateRowSignature(*rit, par, x, y);
@@ -817,8 +853,7 @@ void paintPar
                        if (in) {
                                InsetText const * const t = in->asTextInset();
                                if (t)
-                                       t->Wide() = in_inset_alone_on_row &&
-                                                   t->Tall();
+                                       t->Wide() = in_inset_alone_on_row;
                        }
                }
 
@@ -836,13 +871,13 @@ void paintPar
                        // (if paragraph background was not cleared)
                        if (!repaintAll &&
                            (!in_inset_alone_on_row || row_has_changed)) {
-                               pi.pain.fillRectangle(( rowno ? 0 : x - 10 ), y - rit->ascent(),
-                                   pi.base.bv->workWidth(), rit->height(),
+                               pi.pain.fillRectangle(x, y - rit->ascent(),
+                                   text.maxwidth_, rit->height(),
                                    text.backgroundColor());
                                // If outer row has changed, force nested
                                // insets to repaint completely
                                if (row_has_changed)
-                                       pi.base.bv->repaintAll(true);
+                                       refreshInside = true;
                        }
 
                        // Instrumentation for testing row cache (see also
@@ -864,7 +899,7 @@ void paintPar
                }
                y += rit->descent();
                // Restore, see above
-               pi.base.bv->repaintAll(tmp);
+               refreshInside = tmp;
        }
        lyxerr[Debug::PAINTING] << "." << endl;
 }
@@ -872,15 +907,15 @@ void paintPar
 } // namespace anon
 
 
-void paintText(BufferView const & bv, ViewMetricsInfo const & vi)
+void paintText(BufferView const & bv, ViewMetricsInfo const & vi,
+              Painter & pain)
 {
-       Painter & pain = bv.painter();
        LyXText * const text = bv.text();
        bool const select = bv.cursor().selection();
 
        PainterInfo pi(const_cast<BufferView *>(&bv), pain);
        // Should the whole screen, including insets, be refreshed?
-       bool repaintAll(select || !vi.singlepar);
+       bool repaintAll = select || !vi.singlepar;
 
        if (repaintAll) {
                // Clear background (if not delegated to rows)
@@ -894,7 +929,7 @@ void paintText(BufferView const & bv, ViewMetricsInfo const & vi)
        int yy = vi.y1;
        // draw contents
        for (pit_type pit = vi.p1; pit <= vi.p2; ++pit) {
-               bv.repaintAll(repaintAll);
+               refreshInside = repaintAll;
                Paragraph const & par = text->getPar(pit);
                yy += par.ascent();
                paintPar(pi, *bv.text(), pit, 0, yy, repaintAll);
@@ -935,7 +970,7 @@ void paintTextInset(LyXText const & text, PainterInfo & pi, int x, int y)
 
        y -= text.getPar(0).ascent();
        // This flag can not be set from within same inset:
-       bool repaintAll = pi.base.bv->repaintAll();
+       bool repaintAll = refreshInside;
        for (int pit = 0; pit < int(text.paragraphs().size()); ++pit) {
                y += text.getPar(pit).ascent();
                paintPar(pi, text, pit, x, y, repaintAll);