]> git.lyx.org Git - lyx.git/blobdiff - src/RowPainter.cpp
Makefile for Arabi beamer
[lyx.git] / src / RowPainter.cpp
index 2216b2107781046cf0548952de937380871add98..e378f433e8ebc6d09b8d3c3012f9fd861d365dc4 100644 (file)
@@ -10,7 +10,6 @@
  */
 
 #include <config.h>
-#include <algorithm>
 
 #include "RowPainter.h"
 
 #include "Row.h"
 #include "MetricsInfo.h"
 #include "Paragraph.h"
+#include "ParagraphList.h"
 #include "ParagraphParameters.h"
+#include "Text.h"
 #include "TextMetrics.h"
-#include "VSpace.h"
 
 #include "frontends/FontMetrics.h"
 #include "frontends/Painter.h"
 
-#include "insets/InsetText.h"
-
-#include "mathed/InsetMath.h"
-
 #include "support/debug.h"
 #include "support/gettext.h"
-#include "support/textutils.h"
-
 #include "support/lassert.h"
-#include <boost/crc.hpp>
 
-#include <stdlib.h>
+#include <algorithm>
 
 using namespace std;
 
@@ -58,9 +51,7 @@ RowPainter::RowPainter(PainterInfo & pi,
        Text const & text, Row const & row, int x, int y)
        : pi_(pi), text_(text),
          tm_(pi_.base.bv->textMetrics(&text)),
-         pars_(text.paragraphs()),
          row_(row), par_(text.paragraphs()[row.pit()]),
-         change_(pi_.change_),
          xo_(x), yo_(y)
 {
        x_ = row_.left_margin + xo_;
@@ -103,12 +94,12 @@ void RowPainter::paintInset(Row::Element const & e) const
        // requires a full repaint
        bool const pi_full_repaint = pi_.full_repaint;
        bool const pi_do_spellcheck = pi_.do_spellcheck;
-       Change const pi_change = pi_.change_;
+       Change const pi_change = pi_.change;
 
        pi_.base.font = e.inset->inheritFont() ? e.font.fontInfo() :
                pi_.base.bv->buffer().params().getFont().fontInfo();
        pi_.ltr_pos = !e.font.isVisibleRightToLeft();
-       pi_.change_ = change_.changed() ? change_ : e.change;
+       pi_.change = pi_.change.changed() ? pi_.change : e.change;
        pi_.do_spellcheck &= e.inset->allowSpellCheck();
 
        int const x1 = int(x_);
@@ -123,7 +114,7 @@ void RowPainter::paintInset(Row::Element const & e) const
 
        // Restore full_repaint status.
        pi_.full_repaint = pi_full_repaint;
-       pi_.change_ = pi_change;
+       pi_.change = pi_change;
        pi_.do_spellcheck = pi_do_spellcheck;
        pi_.selected = pi_selected;
 
@@ -177,10 +168,13 @@ void RowPainter::paintNoSpellingMark(Row::Element const & e) const
        // We at the same voffset than the misspelled mark, since
        // these two are mutually exclusive
        int const desc = e.inset ? e.dim.descent() : 0;
-       int const y = yo_ + pi_.base.solidLineOffset() + desc
+       int y = yo_ + pi_.base.solidLineOffset() + desc
                + pi_.base.solidLineThickness()
                + (e.change.changed() ? pi_.base.solidLineThickness() + 1 : 0)
                + 1;
+       // Make sure that the mark does not go below the row rectangle
+       y = min(y, yo_ + row_.descent() - 1);
+
        pi_.pain.line(int(x_), y, int(x_ + e.full_width()), y, Color_language,
                      Painter::line_onoffdash, pi_.base.solidLineThickness());
 }
@@ -194,9 +188,11 @@ void RowPainter::paintMisspelledMark(Row::Element const & e) const
        // to avoid drawing at the same vertical offset
        FontMetrics const & fm = theFontMetrics(e.font);
        int const thickness = max(fm.lineWidth(), 2);
-       int const y = yo_ + pi_.base.solidLineOffset() + pi_.base.solidLineThickness()
+       int y = yo_ + pi_.base.solidLineOffset() + pi_.base.solidLineThickness()
                + (e.change.changed() ? pi_.base.solidLineThickness() + 1 : 0)
                + 1 + thickness / 2;
+       // Make sure that the mark does not go below the row rectangle
+       y = min(y, yo_ + row_.descent() - 1);
 
        //FIXME: this could be computed only once, it is probably not costly.
        // check for cursor position
@@ -316,6 +312,7 @@ void RowPainter::paintAppendix() const
 void RowPainter::paintDepthBar() const
 {
        depth_type const depth = par_.getDepth();
+       ParagraphList const & pars = text_.paragraphs();
 
        if (depth <= 0)
                return;
@@ -325,15 +322,15 @@ void RowPainter::paintDepthBar() const
                pit_type pit2 = row_.pit();
                if (row_.pos() == 0)
                        --pit2;
-               prev_depth = pars_[pit2].getDepth();
+               prev_depth = pars[pit2].getDepth();
        }
 
        depth_type next_depth = 0;
        if (!tm_.isLastRow(row_)) {
                pit_type pit2 = row_.pit();
-               if (row_.endpos() >= pars_[pit2].size())
+               if (row_.endpos() >= pars[pit2].size())
                        ++pit2;
-               next_depth = pars_[pit2].getDepth();
+               next_depth = pars[pit2].getDepth();
        }
 
        for (depth_type i = 1; i <= depth; ++i) {
@@ -460,8 +457,16 @@ void RowPainter::paintTopLevelLabel() const
 
        double x = x_;
        if (layout.labeltype == LABEL_CENTERED) {
-               x += (tm_.width() - row_.left_margin - row_.right_margin) / 2;
-               x -= fm.width(str) / 2;
+               /* Currently, x points at row_.left_margin (which contains the
+                * indent). First remove that, and then center the title with
+                * respect to the left and right margins.
+                */
+               int const leftm = row_.isRTL() ? tm_.rightMargin(row_.pit())
+                                              : tm_.leftMargin(row_.pit());
+               int const rightm = row_.isRTL() ? tm_.leftMargin(row_.pit())
+                                                   : tm_.rightMargin(row_.pit());
+               x += leftm - row_.left_margin + (tm_.width() - leftm -rightm) / 2
+                       - fm.width(str) / 2;
        } else if (row_.isRTL()) {
                x = xo_ + tm_.width() - row_.right_margin - fm.width(str);
        }
@@ -486,10 +491,10 @@ void RowPainter::paintLast() const
                int x = 0;
                if (row_.isRTL()) {
                        int const normal_x = nestMargin() + changebarMargin();
-                       x = min(normal_x, row_.left_margin - size - Inset::TEXT_TO_INSET_OFFSET);
+                       x = min(normal_x, row_.left_margin - size - Inset::textOffset(pi_.base.bv));
                } else {
                        int const normal_x = tm_.width() - row_.right_margin
-                               - size - Inset::TEXT_TO_INSET_OFFSET;
+                               - size - Inset::textOffset(pi_.base.bv);
                        x = max(normal_x, row_.width());
                }