]> git.lyx.org Git - lyx.git/blobdiff - src/rowpainter.C
hopefully fix tex2lyx linking.
[lyx.git] / src / rowpainter.C
index 4147a742bd5139bb488930252cae56d677ec95d1..fdb3450e6407679b09c51d90fc9ce9b2853d8b10 100644 (file)
@@ -156,6 +156,11 @@ int RowPainter::leftMargin() const
 }
 
 
+// If you want to debug inset metrics uncomment the following line:
+// #define DEBUG_METRICS
+// This draws green lines around each inset.
+
+
 void RowPainter::paintInset(pos_type const pos, LyXFont const & font)
 {
        InsetBase const * inset = par_.getInset(pos);
@@ -168,19 +173,53 @@ void RowPainter::paintInset(pos_type const pos, LyXFont const & font)
                font;
        pi.ltr_pos = (text_.bidi.level(pos) % 2 == 0);
        pi.erased_ = erased_ || par_.isDeleted(pos);
+#ifdef DEBUG_METRICS
+       int const x1 = int(x_);
+#endif
        bv_.coordCache().insets().add(inset, int(x_), yo_);
        InsetText const * const in = inset->asTextInset();
        // non-wide insets are painted completely. Recursive
        bool tmp = refreshInside;
-       if (!in || !in->Wide()) {
+       if (!in || !in->wide()) {
                refreshInside = true;
-               lyxerr[Debug::PAINTING] << endl << "Paint inset fully" << endl;
+               if (lyxerr.debugging(Debug::PAINTING)) { 
+                       lyxerr << endl << "Paint inset fully" << endl;
+               }
        }
        if (refreshInside)
                inset->drawSelection(pi, int(x_), yo_);
        inset->draw(pi, int(x_), yo_);
        refreshInside = tmp;
        x_ += inset->width();
+#ifdef DEBUG_METRICS
+       Dimension dim;
+       BOOST_ASSERT(text_.maxwidth_ > 0);
+       int const w = text_.maxwidth_ - leftMargin() - text_.rightMargin(*bv_.buffer(), par_);
+       MetricsInfo mi(&bv_, font, w);
+       inset->metrics(mi, dim);
+       if (inset->width() > dim.wid) 
+               lyxerr << "Error: inset " << to_ascii(inset->getInsetName())
+                      << " draw width " << inset->width()
+                      << "> metrics width " << dim.wid << "." << std::endl;
+       if (inset->ascent() > dim.asc) 
+               lyxerr << "Error: inset " << to_ascii(inset->getInsetName())
+                      << " draw ascent " << inset->ascent()
+                      << "> metrics ascent " << dim.asc << "." << std::endl;
+       if (inset->descent() > dim.des) 
+               lyxerr << "Error: inset " << to_ascii(inset->getInsetName())
+                      << " draw ascent " << inset->descent()
+                      << "> metrics descent " << dim.des << "." << std::endl;
+       BOOST_ASSERT(inset->width() <= dim.wid);
+       BOOST_ASSERT(inset->ascent() <= dim.asc);
+       BOOST_ASSERT(inset->descent() <= dim.des);
+       int const x2 = x1 + dim.wid;
+       int const y1 = yo_ + dim.des;
+       int const y2 = yo_ - dim.asc;
+       pi.pain.line(x1, y1, x1, y2, LColor::green);
+       pi.pain.line(x1, y1, x2, y1, LColor::green);
+       pi.pain.line(x2, y1, x2, y2, LColor::green);
+       pi.pain.line(x1, y2, x2, y2, LColor::green);
+#endif
 }
 
 
@@ -368,7 +407,13 @@ void RowPainter::paintFromPos(pos_type & vpos)
 void RowPainter::paintChangeBar()
 {
        pos_type const start = row_.pos();
-       pos_type const end = row_.endpos();
+       pos_type end = row_.endpos();
+
+       if (par_.size() == end) {
+               // this is the last row of the paragraph;
+               // thus, we must also consider the imaginary end-of-par character
+               end++;
+       }
 
        if (start == end || !par_.isChanged(start, end))
                return;
@@ -837,12 +882,17 @@ void paintPar
                        text);
 
                // If this is the only object on the row, we can make it wide
+               //
+               // FIXME: there is a const_cast here because paintPar() is not supposed
+               // to touch the paragraph contents. So either we move this "wide"
+               // property out of InsetText or we localize the feature to the painting
+               // done here.
                for (pos_type i = rit->pos() ; i != rit->endpos(); ++i) {
                        InsetBase const * const in = par.getInset(i);
                        if (in) {
-                               InsetText const * const t = in->asTextInset();
+                               InsetText * t = const_cast<InsetText *>(in->asTextInset());
                                if (t)
-                                       t->Wide() = in_inset_alone_on_row;
+                                       t->setWide(in_inset_alone_on_row);
                        }
                }
 
@@ -873,12 +923,14 @@ void paintPar
 
                        // Instrumentation for testing row cache (see also
                        // 12 lines lower):
-                       if (text.isMainText(*pi.base.bv->buffer()))
-                               lyxerr[Debug::PAINTING] << "#";
-                       else
-                               lyxerr[Debug::PAINTING] << "[" <<
-                                   repaintAll << row_has_changed <<
-                                   cursor_on_row << "]";
+                       if (lyxerr.debugging(Debug::PAINTING)) {
+                               if (text.isMainText(*pi.base.bv->buffer()))
+                                       lyxerr[Debug::PAINTING] << "#";
+                               else
+                                       lyxerr[Debug::PAINTING] << "[" <<
+                                               repaintAll << row_has_changed <<
+                                               cursor_on_row << "]";
+                       }
                        rp.paintAppendix();
                        rp.paintDepthBar();
                        rp.paintChangeBar();
@@ -895,7 +947,9 @@ void paintPar
        // Re-enable screen drawing for future use of the painter.
        pi.pain.setDrawingEnabled(true);
 
-       lyxerr[Debug::PAINTING] << "." << endl;
+       if (lyxerr.debugging(Debug::PAINTING)) {
+               lyxerr[Debug::PAINTING] << "." << endl;
+       }
 }
 
 } // namespace anon