]> git.lyx.org Git - lyx.git/blobdiff - src/rowpainter.C
Fix bug 886 and others not reported related with the document paper size.
[lyx.git] / src / rowpainter.C
index 80e40158a181fb03a84cb1c52c81b53f7d88a310..d3c4a718f4b197ebc84c3ff009f718614ebf2d14 100644 (file)
@@ -69,13 +69,14 @@ public:
        void paintText();
 
 private:
-       void paintForeignMark(double 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);
+       void paintForeignMark(double orig_x, LyXFont const & font);
+       void paintHebrewComposeChar(lyx::pos_type & vpos, LyXFont const & font);
+       void paintArabicComposeChar(lyx::pos_type & vpos, LyXFont const & font);
+       void paintChars(lyx::pos_type & vpos, LyXFont font, 
+                       bool hebrew, bool arabic);
        int paintAppendixStart(int y);
        void paintFromPos(lyx::pos_type & vpos);
-       void paintInset(lyx::pos_type const pos);
+       void paintInset(lyx::pos_type const pos, LyXFont const & font);
 
        /// return left margin
        int leftMargin() const;
@@ -173,12 +174,12 @@ int RowPainter::leftMargin() const
 }
 
 
-void RowPainter::paintInset(pos_type const pos)
+void RowPainter::paintInset(pos_type const pos, LyXFont const & font)
 {
        InsetBase const * inset = par_.getInset(pos);
        BOOST_ASSERT(inset);
        PainterInfo pi(const_cast<BufferView *>(&bv_), pain_);
-       pi.base.font = getFont(pos);
+       pi.base.font = font;
        pi.ltr_pos = (text_.bidi.level(pos) % 2 == 0);
        theCoords.insets().add(inset, int(x_), yo_);
        inset->drawSelection(pi, int(x_), yo_);
@@ -187,7 +188,7 @@ void RowPainter::paintInset(pos_type const pos)
 }
 
 
-void RowPainter::paintHebrewComposeChar(pos_type & vpos)
+void RowPainter::paintHebrewComposeChar(pos_type & vpos, LyXFont const & font)
 {
        pos_type pos = text_.bidi.vis2log(vpos);
 
@@ -198,7 +199,6 @@ void RowPainter::paintHebrewComposeChar(pos_type & vpos)
        str += c;
        ++vpos;
 
-       LyXFont const & font = getFont(pos);
        int const width = font_metrics::width(c, font);
        int dx = 0;
 
@@ -221,7 +221,7 @@ void RowPainter::paintHebrewComposeChar(pos_type & vpos)
 }
 
 
-void RowPainter::paintArabicComposeChar(pos_type & vpos)
+void RowPainter::paintArabicComposeChar(pos_type & vpos, LyXFont const & font)
 {
        pos_type pos = text_.bidi.vis2log(vpos);
        string str;
@@ -232,7 +232,6 @@ void RowPainter::paintArabicComposeChar(pos_type & vpos)
        str += c;
        ++vpos;
 
-       LyXFont const & font = getFont(pos);
        int const width = font_metrics::width(c, font);
        int dx = 0;
 
@@ -251,11 +250,14 @@ void RowPainter::paintArabicComposeChar(pos_type & vpos)
 }
 
 
-void RowPainter::paintChars(pos_type & vpos, bool hebrew, bool arabic)
+void RowPainter::paintChars(pos_type & vpos, LyXFont font, 
+                           bool hebrew, bool arabic)
 {
        pos_type pos = text_.bidi.vis2log(vpos);
        pos_type const end = row_.endpos();
-       LyXFont orig_font = getFont(pos);
+       std::pair<lyx::pos_type, lyx::pos_type> const font_span 
+               = par_.getFontSpan(pos);
+       Change::Type const prev_change = par_.lookupChange(pos);
 
        // first character
        string str;
@@ -265,20 +267,18 @@ void RowPainter::paintChars(pos_type & vpos, bool hebrew, bool arabic)
                str[0] = par_.transformChar(c, pos);
        }
 
-       bool prev_struckout = isDeletedText(par_, pos);
-       bool prev_newtext = isInsertedText(par_, pos);
-
        // collect as much similar chars as we can
-       for (++vpos; vpos < end && (pos = text_.bidi.vis2log(vpos)) >= 0; ++vpos) {
-               char c = par_.getChar(pos);
-
-               if (!IsPrintableNonspace(c))
+       for (++vpos ; vpos < end ; ++vpos) {
+               pos = text_.bidi.vis2log(vpos);
+               if (pos < font_span.first || pos > font_span.second)
                        break;
 
-               if (prev_struckout != isDeletedText(par_, pos))
+               if (prev_change != par_.lookupChange(pos))
                        break;
 
-               if (prev_newtext != isInsertedText(par_, pos))
+               char c = par_.getChar(pos);
+
+               if (!IsPrintableNonspace(c))
                        break;
 
                if (arabic && Encodings::IsComposeChar_arabic(c))
@@ -287,34 +287,31 @@ void RowPainter::paintChars(pos_type & vpos, bool hebrew, bool arabic)
                if (hebrew && Encodings::IsComposeChar_hebrew(c))
                        break;
 
-               if (orig_font != getFont(pos))
-                       break;
-
                if (arabic)
                        c = par_.transformChar(c, pos);
 
                str += c;
        }
 
-       if (prev_struckout)
-               orig_font.setColor(LColor::strikeout);
-       else if (prev_newtext)
-               orig_font.setColor(LColor::newtext);
+       if (prev_change == Change::DELETED)
+               font.setColor(LColor::strikeout);
+       else if (prev_change == Change::INSERTED)
+               font.setColor(LColor::newtext);
 
        // Draw text and set the new x position
        //lyxerr << "paint row: yo_ " << yo_ << "\n";
-       pain_.text(int(x_), yo_, str, orig_font);
-       x_ += font_metrics::width(str, orig_font);
+       pain_.text(int(x_), yo_, str, font);
+       x_ += font_metrics::width(str, font);
 }
 
 
-void RowPainter::paintForeignMark(double orig_x, LyXFont const & orig_font)
+void RowPainter::paintForeignMark(double orig_x, LyXFont const & font)
 {
        if (!lyxrc.mark_foreign_language)
                return;
-       if (orig_font.language() == latex_language)
+       if (font.language() == latex_language)
                return;
-       if (orig_font.language() == bv_.buffer()->params().language)
+       if (font.language() == bv_.buffer()->params().language)
                return;
 
        int const y = yo_ + 1;
@@ -333,7 +330,7 @@ void RowPainter::paintFromPos(pos_type & vpos)
        char const c = par_.getChar(pos);
 
        if (c == Paragraph::META_INSET) {
-               paintInset(pos);
+               paintInset(pos, orig_font);
                ++vpos;
                paintForeignMark(orig_x, orig_font);
                return;
@@ -352,11 +349,11 @@ void RowPainter::paintFromPos(pos_type & vpos)
        if ((!hebrew && !arabic)
                || (hebrew && !Encodings::IsComposeChar_hebrew(c))
                || (arabic && !Encodings::IsComposeChar_arabic(c))) {
-               paintChars(vpos, hebrew, arabic);
+               paintChars(vpos, orig_font, hebrew, arabic);
        } else if (hebrew) {
-               paintHebrewComposeChar(vpos);
+               paintHebrewComposeChar(vpos, orig_font);
        } else if (arabic) {
-               paintArabicComposeChar(vpos);
+               paintArabicComposeChar(vpos, orig_font);
        }
 
        paintForeignMark(orig_x, orig_font);
@@ -469,7 +466,7 @@ void RowPainter::paintFirst()
 
        // start of appendix?
        if (parparams.startOfAppendix())
-               y_top += paintAppendixStart(yo_ + y_top + 2 * defaultRowHeight());
+               y_top += paintAppendixStart(yo_ - row_.ascent() + 2 * defaultRowHeight());
 
        Buffer const & buffer = *bv_.buffer();
 
@@ -501,37 +498,35 @@ void RowPainter::paintFirst()
                      || layout->latextype != LATEX_ENVIRONMENT
                      || is_seq)) {
 
-               LyXFont font = getLabelFont();
-               if (!par_.getLabelstring().empty()) {
+               LyXFont const font = getLabelFont();
+               string const str = par_.getLabelstring();
+               if (!str.empty()) {
                        double x = x_;
-                       string const str = par_.getLabelstring();
 
                        // this is special code for the chapter layout. This is
                        // printed in an extra row and has a pagebreak at
                        // the top.
                        if (layout->counter == "chapter") {
-                               if (buffer.params().secnumdepth >= 0) {
-                                       double spacing_val = 1.0;
-                                       if (!parparams.spacing().isDefault()) {
-                                               spacing_val = parparams.spacing().getValue();
-                                       } else {
-                                               spacing_val = buffer.params().spacing().getValue();
-                                       }
+                               double spacing_val = 1.0;
+                               if (!parparams.spacing().isDefault()) {
+                                       spacing_val = parparams.spacing().getValue();
+                               } else {
+                                       spacing_val = buffer.params().spacing().getValue();
+                               }
 #ifdef WITH_WARNINGS
 #warning Look is this correct?
 #endif
-                                       int const labeladdon = int(font_metrics::maxHeight(font) * layout->spacing.getValue() * spacing_val);
-
-                                       int const maxdesc = int(font_metrics::maxDescent(font) * layout->spacing.getValue() * spacing_val)
-                                               + int(layout->parsep) * defaultRowHeight();
+                               int const labeladdon = int(font_metrics::maxHeight(font) * layout->spacing.getValue() * spacing_val);
 
-                                       if (is_rtl) {
-                                               x = width_ - leftMargin() -
-                                                       font_metrics::width(str, font);
-                                       }
+                               int const maxdesc = int(font_metrics::maxDescent(font) * layout->spacing.getValue() * spacing_val)
+                                       + int(layout->parsep) * defaultRowHeight();
 
-                                       pain_.text(int(x), yo_ - maxdesc - labeladdon, str, font);
+                               if (is_rtl) {
+                                       x = width_ - leftMargin() -
+                                               font_metrics::width(str, font);
                                }
+
+                               pain_.text(int(x), yo_ - maxdesc - labeladdon, str, font);
                        } else {
                                if (is_rtl) {
                                        x = width_ - leftMargin()
@@ -789,6 +784,8 @@ void paintText(BufferView const & bv, ViewMetricsInfo const & vi)
 
 
        // paint one paragraph above and one below
+       // Note MV: this cannot be suppressed even for singlepar.
+       // Try viewing the User Guide Mobius figure
        if (vi.p1 > 0) {
                text->redoParagraph(vi.p1 - 1);
                paintPar(pi, *bv.text(), vi.p1 - 1, 0,