]> git.lyx.org Git - lyx.git/blobdiff - src/rowpainter.C
cosmetic fix
[lyx.git] / src / rowpainter.C
index 92000456b58ea31dff02c4d341d093be039bf86c..e4cdfb3e856c6af17a50d1f7687cb843ba41cb86 100644 (file)
@@ -21,6 +21,7 @@
 
 #include "insets/insettext.h"
 #include "ParagraphParameters.h"
+#include "debug.h"
 #include "BufferView.h"
 #include "buffer.h"
 #include "gettext.h"
@@ -74,7 +75,7 @@ private:
        void paintChangeBar();
        void paintFirst();
        void paintLast();
-       void paintForeignMark(float const orig_x, LyXFont const & orig_font);
+       void paintForeignMark(int orig_x, LyXFont const & orig_font);
        void paintHebrewComposeChar(lyx::pos_type & vpos);
        void paintArabicComposeChar(lyx::pos_type & vpos);
        void paintChars(lyx::pos_type & vpos, bool hebrew, bool arabic);
@@ -118,19 +119,19 @@ private:
        // Looks ugly - is
        int xo_;
        int yo_;
-       float x_;
+       int x_;
        int y_;
        int width_;
-       float separator_;
-       float hfill_;
-       float label_hfill_;
+       int separator_;
+       int hfill_;
+       int label_hfill_;
 };
 
 RowPainter::RowPainter(BufferView const & bv, LyXText const & text,
      RowList::iterator rit,
      int y_offset, int x_offset, int y)
        : bv_(bv), pain_(bv_.painter()), text_(text), row_(rit),
-         pit_(rit->par()), 
+         pit_(rit->par()),
                xo_(x_offset), yo_(y_offset), y_(y)
 {}
 
@@ -174,15 +175,15 @@ int RowPainter::leftMargin() const
 
 void RowPainter::paintInset(pos_type const pos)
 {
-       Inset * inset = const_cast<Inset*>(pit_->getInset(pos));
+       InsetOld * inset = const_cast<InsetOld*>(pit_->getInset(pos));
 
        Assert(inset);
 
        PainterInfo pi(perv(bv_));
        pi.base.font = getFont(pos);
-       int const w = inset->width(perv(bv_), pi.base.font);
+#warning metrics?
        inset->draw(pi, int(x_), yo_ + row_->baseline());
-       x_ += w;
+       x_ += inset->width();
 }
 
 
@@ -305,12 +306,14 @@ void RowPainter::paintChars(pos_type & vpos, bool hebrew, bool arabic)
        }
 
        // Draw text and set the new x position
+       //lyxerr << "paint row: yo_ " << yo_ << " baseline: " << row_->baseline()
+       //      << "\n";
        pain_.text(int(x_), yo_ + row_->baseline(), str, orig_font);
        x_ += font_metrics::width(str, orig_font);
 }
 
 
-void RowPainter::paintForeignMark(float const orig_x, LyXFont const & orig_font)
+void RowPainter::paintForeignMark(int orig_x, LyXFont const & orig_font)
 {
        if (!lyxrc.mark_foreign_language)
                return;
@@ -330,7 +333,7 @@ void RowPainter::paintFromPos(pos_type & vpos)
 
        LyXFont const & orig_font = getFont(pos);
 
-       float const orig_x = x_;
+       int const orig_x = x_;
 
        char const c = pit_->getChar(pos);
 
@@ -430,11 +433,11 @@ void RowPainter::paintSelection()
 
        pos_type const body_pos = pit_->beginningOfBody();
        pos_type const last = lastPrintablePos(text_, row_);
-       float tmpx = x_;
+       int tmpx = x_;
 
        for (pos_type vpos = row_->pos(); vpos <= last; ++vpos)  {
                pos_type pos = text_.vis2log(vpos);
-               float const old_tmpx = tmpx;
+               int const old_tmpx = tmpx;
                if (body_pos > 0 && pos == body_pos - 1) {
                        LyXLayout_ptr const & layout = pit_->layout();
                        LyXFont const lfont = getLabelFont();
@@ -709,12 +712,11 @@ void RowPainter::paintFirst()
 
        // draw a top line
        if (parparams.lineTop()) {
-               LyXFont font(LyXFont::ALL_SANE);
                int const asc = font_metrics::ascent('x', getFont(0));
 
                y_top += asc;
 
-               int const w = (text_.isInInset() ? text_.inset_owner->width(perv(bv_), font) : ww);
+               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,
@@ -733,7 +735,7 @@ void RowPainter::paintFirst()
 
                LyXFont font = getLabelFont();
                if (!pit_->getLabelstring().empty()) {
-                       float x = x_;
+                       int x = x_;
                        string const str = pit_->getLabelstring();
 
                        // this is special code for the chapter layout. This is
@@ -757,7 +759,7 @@ void RowPainter::paintFirst()
                                                        font_metrics::width(str, font);
                                        }
 
-                                       pain_.text(int(x),
+                                       pain_.text(x,
                                                yo_ + row_->baseline() -
                                                row_->ascent_of_text() - maxdesc,
                                                str, font);
@@ -771,7 +773,7 @@ void RowPainter::paintFirst()
                                                - font_metrics::width(str, font);
                                }
 
-                               pain_.text(int(x), yo_ + row_->baseline(), str, font);
+                               pain_.text(x, yo_ + row_->baseline(), str, font);
                        }
                }
 
@@ -795,7 +797,7 @@ void RowPainter::paintFirst()
                                int(font_metrics::maxDescent(font) * layout->spacing.getValue() * spacing_val
                                + (layout->labelbottomsep * defaultRowHeight()));
 
-                       float x = x_;
+                       int x = x_;
                        if (layout->labeltype == LABEL_CENTERED_TOP_ENVIRONMENT) {
                                x = ((is_rtl ? leftMargin() : x_)
                                         + ww - text_.rightMargin(*bv_.buffer(), *row_)) / 2;
@@ -804,7 +806,7 @@ void RowPainter::paintFirst()
                                x = ww - leftMargin() -
                                        font_metrics::width(str, font);
                        }
-                       pain_.text(int(x), yo_ + row_->baseline()
+                       pain_.text(x, yo_ + row_->baseline()
                                  - row_->ascent_of_text() - maxdesc,
                                  str, font);
                }
@@ -836,13 +838,12 @@ void RowPainter::paintLast()
 
        // draw a bottom line
        if (parparams.lineBottom()) {
-               LyXFont font(LyXFont::ALL_SANE);
                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(perv(bv_), font) : ww);
+               int const w = text_.isInInset() ? text_.inset_owner->width() : ww;
                int const xp = static_cast<int>(text_.isInInset() ? xo_ : 0);
                int const y = yo_ + y_bottom;
                pain_.line(xp, y, xp + w, y, LColor::topline, Painter::line_solid,
@@ -879,7 +880,7 @@ void RowPainter::paintLast()
                LyXFont font = getLabelFont();
                string const & str = pit_->layout()->endlabelstring();
                int const x = is_rtl ?
-                       int(x_) - font_metrics::width(str, font)
+                       x_ - font_metrics::width(str, font)
                        : ww - text_.rightMargin(*bv_.buffer(), *row_) - row_->fill();
                pain_.text(x, yo_ + row_->baseline(), str, font);
                break;
@@ -904,7 +905,7 @@ void RowPainter::paintText()
 
        bool running_strikeout = false;
        bool is_struckout = false;
-       float last_strikeout_x = 0.0;
+       int last_strikeout_x = 0;
 
        pos_type vpos = row_->pos();
        while (vpos <= last) {
@@ -938,7 +939,7 @@ void RowPainter::paintText()
                if (running_strikeout && (highly_editable_inset || !is_struckout)) {
                        int const middle = yo_ + row_->top_of_text()
                                + ((row_->baseline() - row_->top_of_text()) / 2);
-                       pain_.line(int(last_strikeout_x), middle, int(x_), middle,
+                       pain_.line(last_strikeout_x, middle, x_, middle,
                                LColor::strikeout, Painter::line_solid, Painter::line_thin);
                        running_strikeout = false;
                }
@@ -947,8 +948,7 @@ void RowPainter::paintText()
                        int const lwidth = font_metrics::width(layout->labelsep,
                                getLabelFont());
 
-                       x_ += label_hfill_ + lwidth
-                               - singleWidth(body_pos - 1);
+                       x_ += label_hfill_ + lwidth - singleWidth(body_pos - 1);
                }
 
                if (pit_->isHfill(pos)) {
@@ -957,28 +957,24 @@ void RowPainter::paintText()
                        int const y0 = yo_ + row_->baseline();
                        int const y1 = y0 - defaultRowHeight() / 2;
 
-                       pain_.line(int(x_), y1, int(x_), y0,
-                                    LColor::added_space);
+                       pain_.line(x_, y1, x_, y0, LColor::added_space);
 
                        if (hfillExpansion(text_, row_, pos)) {
                                int const y2 = (y0 + y1) / 2;
 
                                if (pos >= body_pos) {
-                                       pain_.line(int(x_), y2,
-                                                 int(x_ + hfill_), y2,
+                                       pain_.line(x_, y2, x_ + hfill_, y2,
                                                  LColor::added_space,
                                                  Painter::line_onoffdash);
                                        x_ += hfill_;
                                } else {
-                                       pain_.line(int(x_), y2,
-                                                 int(x_ + label_hfill_), y2,
+                                       pain_.line(x_, y2,
+                                                 x_ + label_hfill_, y2,
                                                  LColor::added_space,
                                                  Painter::line_onoffdash);
                                        x_ += label_hfill_;
                                }
-                               pain_.line(int(x_), y1,
-                                            int(x_), y0,
-                                            LColor::added_space);
+                               pain_.line(x_, y1, x_, y0, LColor::added_space);
                        }
                        x_ += 2;
                        ++vpos;
@@ -996,7 +992,7 @@ void RowPainter::paintText()
        if (running_strikeout) {
                int const middle = yo_ + row_->top_of_text()
                        + ((row_->baseline() - row_->top_of_text()) / 2);
-               pain_.line(int(last_strikeout_x), middle, int(x_), middle,
+               pain_.line(last_strikeout_x, middle, x_, middle,
                        LColor::strikeout, Painter::line_solid, Painter::line_thin);
                running_strikeout = false;
        }
@@ -1006,15 +1002,14 @@ void RowPainter::paintText()
 
 void RowPainter::paint()
 {
-       width_ = text_.isInInset()
-               ? text_.inset_owner->textWidth(perv(bv_), true) : bv_.workWidth();
+       width_ = text_.workWidth();
 
        // FIXME: must be a cleaner way here. Aren't these calculations
        // belonging to row metrics ?
        text_.prepareToPrint(row_, x_, separator_, hfill_, label_hfill_);
 
        // FIXME: what is this fixing ?
-       if (text_.isInInset() && (x_ < 0))
+       if (text_.isInInset() && x_ < 0)
                x_ = 0;
        x_ += xo_;
 
@@ -1059,7 +1054,7 @@ int getLengthMarkerHeight(BufferView const & bv, VSpace const & vsp)
                return 0;
 
        int const arrow_size = 4;
-       int const space_size = int(vsp.inPixels(bv));
+       int const space_size = vsp.inPixels(bv);
 
        LyXFont font;
        font.decSize();
@@ -1077,6 +1072,34 @@ int getLengthMarkerHeight(BufferView const & bv, VSpace const & vsp)
 void paintRows(BufferView const & bv, LyXText const & text,
        RowList::iterator rit, int y_offset, int x_offset, int y)
 {
+       // fix up missing metrics() call for main LyXText
+       // calling metrics() directly is (a) slow and (b) crashs
+       if (&text == bv.text) {
+#if 1
+               // make sure all insets are updated
+               ParagraphList::iterator pit = text.ownerParagraphs().begin();
+               ParagraphList::iterator end = text.ownerParagraphs().end();
+
+               // compute inset metrics
+               for (; pit != end; ++pit) {
+                       InsetList & insetList = pit->insetlist;
+                       InsetList::iterator ii = insetList.begin();
+                       InsetList::iterator iend = insetList.end();
+                       for (; ii != iend; ++ii) {
+                               Dimension dim;
+                               LyXFont font;
+                               MetricsInfo mi(perv(bv), font, text.workWidth());
+                               ii->inset->metrics(mi, dim);
+                       }
+               }
+#else
+               LyXFont font;
+               Dimension dim;
+               MetricsInfo mi(perv(bv), font, text.workWidth());
+               const_cast<LyXText&>(text).metrics(mi, dim);
+#endif
+       }
+
        RowPainter painter(bv, text, rit, y_offset, x_offset, y);
        painter.paint();
 }