]> git.lyx.org Git - lyx.git/blobdiff - src/text.C
Fix working of the spellchecker dialog with ispell when there are no
[lyx.git] / src / text.C
index bda7eb5ce3d6665498090c0611a079b41d265569..6ad71787f855a3821ac3757f1348fa97d89957db 100644 (file)
@@ -17,6 +17,8 @@
 #include "layout.h"
 #include "paragraph.h"
 #include "support/textutils.h"
+#include "support/LAssert.h"
+#include "support/lstrings.h"
 #include "insets/insetbib.h"
 #include "insets/insettext.h"
 #include "insets/insetspecialchar.h"
@@ -136,7 +138,7 @@ int LyXText::singleWidth(BufferView * bview, Paragraph * par,
 
 
 int LyXText::singleWidth(BufferView * bview, Paragraph * par,
-                        Paragraph::size_type pos, char c) const
+                         Paragraph::size_type pos, char c) const
 {
        LyXFont const font = getFont(bview->buffer(), par, pos);
 
@@ -251,7 +253,7 @@ void LyXText::computeBidiTables(Buffer const * buf, Row * row) const
                LyXFont font = row->par()->getFontSettings(buf->params, pos);
                if (pos != lpos && 0 < lpos && rtl0 && font.isRightToLeft() &&
                    font.number() == LyXFont::ON &&
-                   row->par()->getFontSettings(buf->params, lpos-1).number()
+                   row->par()->getFontSettings(buf->params, lpos - 1).number()
                    == LyXFont::ON) {
                        font = row->par()->getFontSettings(buf->params, lpos);
                        is_space = false;
@@ -438,17 +440,19 @@ void LyXText::draw(BufferView * bview, Row const * row,
                        tmpinset->update(bview, font, false);
                        tmpinset->draw(bview, font, offset+row->baseline(), x,
                                       cleared);
-#ifdef SEEMS_TO_BE_NOT_NEEDED
-                       if (status_ == CHANGED_IN_DRAW) {
-                               UpdateInset(bview, tmpinset);
-                               status(bview, CHANGED_IN_DRAW);
+                       if (!need_break_row && !inset_owner &&
+                           bview->text->status() == CHANGED_IN_DRAW)
+                       {
+                               if (row->previous() && row->previous()->par() == row->par())
+                                       breakAgainOneRow(bview, row->previous());
+                               setCursor(bview, cursor.par(), cursor.pos());
+                               need_break_row = const_cast<Row *>(row);
                        }
-#endif
                }
                ++vpos;
 
                if (lyxrc.mark_foreign_language &&
-                       font.language() != ignore_language &&
+                       font.language() != latex_language &&
                    font.language() != bview->buffer()->params.language) {
                        int const y = offset + row->height() - 1;
                        pain.line(int(tmpx), y, int(x), y, LColor::language);
@@ -564,12 +568,15 @@ void LyXText::draw(BufferView * bview, Row const * row,
                x += lyxfont::width(textstring, font);
        }
 
+#ifdef INHERIT_LANGUAGE
 #ifdef WITH_WARNINGS
        if ((font.language() == inherit_language) ||
                (font.language() == ignore_language))
                lyxerr << "No this shouldn't happen!\n";
+#endif
 #endif
        if (lyxrc.mark_foreign_language &&
+           font.language() != latex_language &&
            font.language() != bview->buffer()->params.language) {
                int const y = offset + row->height() - 1;
                pain.line(int(tmpx), y, int(x), y,
@@ -655,7 +662,7 @@ int LyXText::leftMargin(BufferView * bview, Row const * row) const
                
        }
        
-       LyXFont const labelfont = getFont(bview->buffer(), row->par(), -2);
+       LyXFont const labelfont = getLabelFont(bview->buffer(), row->par());
        switch (layout.margintype) {
        case MARGIN_DYNAMIC:
                if (!layout.leftmargin.empty()) {
@@ -940,7 +947,7 @@ LyXText::nextBreakPoint(BufferView * bview, Row const * row, int width) const
                        ++i;
                        if (i == main_body) {
                                x += lyxfont::width(layout.labelsep,
-                                                   getFont(bview->buffer(), par, -2));
+                                                   getLabelFont(bview->buffer(), par));
                                if (par->isLineSeparator(i - 1))
                                        x-= singleWidth(bview, par, i - 1);
                                int left_margin = labelEnd(bview, row);
@@ -971,7 +978,7 @@ LyXText::nextBreakPoint(BufferView * bview, Row const * row, int width) const
 int LyXText::fill(BufferView * bview, Row * row, int paper_width) const
 {
        if (paper_width < 0)
-               return 20;
+               return 0;
 
        int w;
        // get the pure distance
@@ -996,7 +1003,7 @@ int LyXText::fill(BufferView * bview, Row * row, int paper_width) const
 
        while (i <= last) {
                if (main_body > 0 && i == main_body) {
-                       w += lyxfont::width(layout.labelsep, getFont(bview->buffer(), row->par(), -2));
+                       w += lyxfont::width(layout.labelsep, getLabelFont(bview->buffer(), row->par()));
                        if (row->par()->isLineSeparator(i - 1))
                                w -= singleWidth(bview, row->par(), i - 1);
                        int left_margin = labelEnd(bview, row);
@@ -1007,7 +1014,7 @@ int LyXText::fill(BufferView * bview, Row * row, int paper_width) const
                ++i;
        }
        if (main_body > 0 && main_body > last) {
-               w += lyxfont::width(layout.labelsep, getFont(bview->buffer(), row->par(), -2));
+               w += lyxfont::width(layout.labelsep, getLabelFont(bview->buffer(), row->par()));
                if (last >= 0 && row->par()->isLineSeparator(last))
                        w -= singleWidth(bview, row->par(), last);
                int const left_margin = labelEnd(bview, row);
@@ -1055,7 +1062,7 @@ int LyXText::labelFill(BufferView * bview, Row const * row) const
        int fill = 0;
        if (!row->par()->params().labelWidthString().empty()) {
                fill = max(lyxfont::width(row->par()->params().labelWidthString(),
-                                         getFont(bview->buffer(), row->par(), -2)) - w,
+                                         getLabelFont(bview->buffer(), row->par())) - w,
                           0);
        }
        
@@ -1130,7 +1137,7 @@ int LyXText::numberOfLabelHfills(Buffer const * buf, Row const * row) const
 // returns true, if a expansion is needed.
 // Rules are given by LaTeX
 bool LyXText::hfillExpansion(Buffer const * buf, Row const * row_ptr,
-                            Paragraph::size_type pos) const
+                             Paragraph::size_type pos) const
 {
        // by the way, is it a hfill?
        if (!row_ptr->par()->isHfill(pos))
@@ -1175,307 +1182,319 @@ LColor::color LyXText::backgroundColor()
 void LyXText::setHeightOfRow(BufferView * bview, Row * row_ptr) const
 {
     /* get the maximum ascent and the maximum descent */
-   int asc = 0;
-   int desc = 0;
-   float layoutasc = 0;
-   float layoutdesc = 0;
-   float tmptop = 0;
-   LyXFont tmpfont;
-   Inset * tmpinset = 0;
-
-   /* this must not happen before the currentrow for clear reasons.
-      so the trick is just to set the current row onto this row */
-   int unused_y;
-   getRow(row_ptr->par(), row_ptr->pos(), unused_y);
-
-   /* ok , let us initialize the maxasc and maxdesc value. 
-    * This depends in LaTeX of the font of the last character
-    * in the paragraph. The hack below is necessary because
-    * of the possibility of open footnotes */
-
-   /* Correction: only the fontsize count. The other properties
-      are taken from the layoutfont. Nicer on the screen :) */
-   Paragraph * par = row_ptr->par();
-   Paragraph * firstpar = row_ptr->par();
+       int asc = 0;
+       int desc = 0;
+       float layoutasc = 0;
+       float layoutdesc = 0;
+       float tmptop = 0;
+       LyXFont tmpfont;
+       Inset * tmpinset = 0;
+
+       /* this must not happen before the currentrow for clear reasons.
+          so the trick is just to set the current row onto this row */
+       int unused_y;
+       getRow(row_ptr->par(), row_ptr->pos(), unused_y);
+
+       /* ok , let us initialize the maxasc and maxdesc value. 
+        * This depends in LaTeX of the font of the last character
+        * in the paragraph. The hack below is necessary because
+        * of the possibility of open footnotes */
+       
+       /* Correction: only the fontsize count. The other properties
+          are taken from the layoutfont. Nicer on the screen :) */
+       Paragraph * par = row_ptr->par();
+       Paragraph * firstpar = row_ptr->par();
    
-   LyXLayout const & layout = textclasslist.Style(bview->buffer()->params.textclass,
-                                                 firstpar->getLayout());
-
-   LyXFont font = getFont(bview->buffer(), par, par->size() - 1);
-   LyXFont::FONT_SIZE const size = font.size();
-   font = getFont(bview->buffer(), par, -1);
-   font.setSize(size);
-
-   LyXFont labelfont = getFont(bview->buffer(), par, -2);
-
-   float spacing_val = 1.0;
-   if (!row_ptr->par()->params().spacing().isDefault()) {
-          spacing_val = row_ptr->par()->params().spacing().getValue();
-   } else {
-          spacing_val = bview->buffer()->params.spacing.getValue();
-   }
-   //lyxerr << "spacing_val = " << spacing_val << endl;
+       LyXLayout const & layout = textclasslist.Style(bview->buffer()->params.textclass,
+                                                      firstpar->getLayout());
+
+       // as max get the first character of this row then it can increes but not
+       // decrees the height. Just some point to start with so we don't have to
+       // do the assignment below too often.
+       LyXFont font = getFont(bview->buffer(), par, row_ptr->pos());
+       LyXFont::FONT_SIZE const tmpsize = font.size();
+       font = getLayoutFont(bview->buffer(), par);
+       LyXFont::FONT_SIZE const size = font.size();
+       font.setSize(tmpsize);
+
+       LyXFont labelfont = getLabelFont(bview->buffer(), par);
+
+       float spacing_val = 1.0;
+       if (!row_ptr->par()->params().spacing().isDefault()) {
+               spacing_val = row_ptr->par()->params().spacing().getValue();
+       } else {
+               spacing_val = bview->buffer()->params.spacing.getValue();
+       }
+       //lyxerr << "spacing_val = " << spacing_val << endl;
    
-   int maxasc = int(lyxfont::maxAscent(font) *
-                  layout.spacing.getValue() *
-                  spacing_val);
-   int maxdesc = int(lyxfont::maxDescent(font) *
-                   layout.spacing.getValue() *
-                   spacing_val);
-   int const pos_end = rowLast(row_ptr);
-   int labeladdon = 0;
-   int maxwidth = 0;
-
-   // Check if any insets are larger
-   for (int pos = row_ptr->pos(); pos <= pos_end; ++pos) {
-          if (row_ptr->par()->getChar(pos) == Paragraph::META_INSET) {
-                  tmpfont = getFont(bview->buffer(), row_ptr->par(), pos);
-                  tmpinset = row_ptr->par()->getInset(pos);
-                  if (tmpinset) {
+       int maxasc = int(lyxfont::maxAscent(font) *
+                        layout.spacing.getValue() *
+                        spacing_val);
+       int maxdesc = int(lyxfont::maxDescent(font) *
+                         layout.spacing.getValue() *
+                         spacing_val);
+       int const pos_end = rowLast(row_ptr);
+       int labeladdon = 0;
+       int maxwidth = 0;
+
+       // Check if any insets are larger
+       for (int pos = row_ptr->pos(); pos <= pos_end; ++pos) {
+               if (row_ptr->par()->getChar(pos) == Paragraph::META_INSET) {
+                       tmpfont = getFont(bview->buffer(), row_ptr->par(), pos);
+                       tmpinset = row_ptr->par()->getInset(pos);
+                       if (tmpinset) {
 #if 1 // this is needed for deep update on initialitation
-                          tmpinset->update(bview, tmpfont);
+                               tmpinset->update(bview, tmpfont);
 #endif
-                          asc = tmpinset->ascent(bview, tmpfont);
-                          desc = tmpinset->descent(bview, tmpfont);
-                          maxwidth += tmpinset->width(bview, tmpfont);
-                          maxasc = max(maxasc, asc);
-                          maxdesc = max(maxdesc, desc);
-                  }
-          } else {
-                  maxwidth += singleWidth(bview, row_ptr->par(), pos);
-          }
-   }
+                               asc = tmpinset->ascent(bview, tmpfont);
+                               desc = tmpinset->descent(bview, tmpfont);
+                               maxwidth += tmpinset->width(bview, tmpfont);
+                               maxasc = max(maxasc, asc);
+                               maxdesc = max(maxdesc, desc);
+                       }
+               } else {
+                       maxwidth += singleWidth(bview, row_ptr->par(), pos);
+               }
+       }
 
-   // Check if any custom fonts are larger (Asger)
-   // This is not completely correct, but we can live with the small,
-   // cosmetic error for now.
-   LyXFont::FONT_SIZE const maxsize =
-          row_ptr->par()->highestFontInRange(row_ptr->pos(),
-                                             pos_end);
-   if (maxsize > font.size()) {
-       font.setSize(maxsize);
-
-       asc = lyxfont::maxAscent(font);
-       desc = lyxfont::maxDescent(font);
-       if (asc > maxasc) 
-               maxasc = asc;
-       if (desc > maxdesc)
-               maxdesc = desc;
-   }
+       // Check if any custom fonts are larger (Asger)
+       // This is not completely correct, but we can live with the small,
+       // cosmetic error for now.
+       LyXFont::FONT_SIZE maxsize =
+               row_ptr->par()->highestFontInRange(row_ptr->pos(), pos_end, size);
+       if (maxsize > font.size()) {
+               font.setSize(maxsize);
 
-   // This is nicer with box insets:
-   ++maxasc;
-   ++maxdesc;
+               asc = lyxfont::maxAscent(font);
+               desc = lyxfont::maxDescent(font);
+               if (asc > maxasc) 
+                       maxasc = asc;
+               if (desc > maxdesc)
+                       maxdesc = desc;
+       }
 
-   row_ptr->ascent_of_text(maxasc);
+       // This is nicer with box insets:
+       ++maxasc;
+       ++maxdesc;
+
+       row_ptr->ascent_of_text(maxasc);
    
-   // is it a top line?
-   if (!row_ptr->pos() && (row_ptr->par() == firstpar)) {
+       // is it a top line?
+       if (!row_ptr->pos() && (row_ptr->par() == firstpar)) {
       
-          // some parksips VERY EASY IMPLEMENTATION
-      if (bview->buffer()->params.paragraph_separation ==
-         BufferParams::PARSEP_SKIP) {
-        if (layout.isParagraph()
-            && firstpar->getDepth() == 0
-            && firstpar->previous())
-           maxasc += bview->buffer()->params.getDefSkip().inPixels(bview);
-        else if (firstpar->previous()
-                 && textclasslist.Style(bview->buffer()->params.textclass,
-                          firstpar->previous()->getLayout()).isParagraph()
-                 && firstpar->previous()->getDepth() == 0)
-          // is it right to use defskip here too? (AS)
-          maxasc += bview->buffer()->params.getDefSkip().inPixels(bview);
-      }
+               // some parksips VERY EASY IMPLEMENTATION
+               if (bview->buffer()->params.paragraph_separation ==
+                       BufferParams::PARSEP_SKIP)
+               {
+                       if (layout.isParagraph()
+                               && firstpar->getDepth() == 0
+                               && firstpar->previous())
+                       {
+                               maxasc += bview->buffer()->params.getDefSkip().inPixels(bview);
+                       } else if (firstpar->previous() &&
+                                  textclasslist.Style(bview->buffer()->params.textclass,
+                                                      firstpar->previous()->
+                                                      getLayout()).isParagraph() &&
+                                  firstpar->previous()->getDepth() == 0)
+                       {
+                               // is it right to use defskip here too? (AS)
+                               maxasc += bview->buffer()->params.getDefSkip().inPixels(bview);
+                       }
+               }
       
-      // the paper margins
-      if (!row_ptr->par()->previous() && bv_owner)
-        maxasc += LYX_PAPER_MARGIN;
+               // the paper margins
+               if (!row_ptr->par()->previous() && bv_owner)
+                       maxasc += LYX_PAPER_MARGIN;
       
-      // add the vertical spaces, that the user added
-      if (firstpar->params().spaceTop().kind() != VSpace::NONE)
-        maxasc += int(firstpar->params().spaceTop().inPixels(bview));
+               // add the vertical spaces, that the user added
+               if (firstpar->params().spaceTop().kind() != VSpace::NONE)
+                       maxasc += int(firstpar->params().spaceTop().inPixels(bview));
       
-      // do not forget the DTP-lines!
-      // there height depends on the font of the nearest character
-      if (firstpar->params().lineTop())
-        maxasc += 2 * lyxfont::ascent('x', getFont(bview->buffer(),
-                                                   firstpar, 0));
+               // do not forget the DTP-lines!
+               // there height depends on the font of the nearest character
+               if (firstpar->params().lineTop())
+                       maxasc += 2 * lyxfont::ascent('x', getFont(bview->buffer(),
+                                                                  firstpar, 0));
       
-      // and now the pagebreaks
-      if (firstpar->params().pagebreakTop())
-        maxasc += 3 * defaultHeight();
+               // and now the pagebreaks
+               if (firstpar->params().pagebreakTop())
+                       maxasc += 3 * defaultHeight();
       
-      // This is special code for the chapter, since the label of this
-      // layout is printed in an extra row
-      if (layout.labeltype == LABEL_COUNTER_CHAPTER
-         && bview->buffer()->params.secnumdepth >= 0) {
-             float spacing_val = 1.0;
-             if (!row_ptr->par()->params().spacing().isDefault()) {
-                     spacing_val = row_ptr->par()->params().spacing().getValue();
-             } else {
-                     spacing_val = bview->buffer()->params.spacing.getValue();
-             }
+               // This is special code for the chapter, since the label of this
+               // layout is printed in an extra row
+               if (layout.labeltype == LABEL_COUNTER_CHAPTER
+                       && bview->buffer()->params.secnumdepth >= 0)
+               {
+                       float spacing_val = 1.0;
+                       if (!row_ptr->par()->params().spacing().isDefault()) {
+                               spacing_val = row_ptr->par()->params().spacing().getValue();
+                       } else {
+                               spacing_val = bview->buffer()->params.spacing.getValue();
+                       }
              
-             labeladdon = int(lyxfont::maxDescent(labelfont) *
-                              layout.spacing.getValue() *
-                              spacing_val)
-                     + int(lyxfont::maxAscent(labelfont) *
-                           layout.spacing.getValue() *
-                           spacing_val);
-      }
+                       labeladdon = int(lyxfont::maxDescent(labelfont) *
+                                        layout.spacing.getValue() *
+                                        spacing_val)
+                               + int(lyxfont::maxAscent(labelfont) *
+                                     layout.spacing.getValue() *
+                                     spacing_val);
+               }
       
-      // special code for the top label
-      if ((layout.labeltype == LABEL_TOP_ENVIRONMENT
-          || layout.labeltype == LABEL_BIBLIO
-          || layout.labeltype == LABEL_CENTERED_TOP_ENVIRONMENT)
-         && row_ptr->par()->isFirstInSequence()
-         && !row_ptr->par()->getLabelstring().empty()) {
-             float spacing_val = 1.0;
-             if (!row_ptr->par()->params().spacing().isDefault()) {
-                     spacing_val = row_ptr->par()->params().spacing().getValue();
-             } else {
-                     spacing_val = bview->buffer()->params.spacing.getValue();
-             }
+               // special code for the top label
+               if ((layout.labeltype == LABEL_TOP_ENVIRONMENT
+                    || layout.labeltype == LABEL_BIBLIO
+                    || layout.labeltype == LABEL_CENTERED_TOP_ENVIRONMENT)
+                   && row_ptr->par()->isFirstInSequence()
+                   && !row_ptr->par()->getLabelstring().empty())
+               {
+                       float spacing_val = 1.0;
+                       if (!row_ptr->par()->params().spacing().isDefault()) {
+                               spacing_val = row_ptr->par()->params().spacing().getValue();
+                       } else {
+                               spacing_val = bview->buffer()->params.spacing.getValue();
+                       }
              
-             labeladdon = int(
-                     (lyxfont::maxAscent(labelfont) *
-                      layout.spacing.getValue() *
-                      spacing_val)
-                     +(lyxfont::maxDescent(labelfont) *
-                       layout.spacing.getValue() *
-                       spacing_val)
-                     + layout.topsep * defaultHeight()
-                     + layout.labelbottomsep *  defaultHeight());
-      }
+                       labeladdon = int(
+                               (lyxfont::maxAscent(labelfont) *
+                                layout.spacing.getValue() *
+                                spacing_val)
+                               +(lyxfont::maxDescent(labelfont) *
+                                 layout.spacing.getValue() *
+                                 spacing_val)
+                               + layout.topsep * defaultHeight()
+                               + layout.labelbottomsep *  defaultHeight());
+               }
    
-      // and now the layout spaces, for example before and after a section, 
-      // or between the items of a itemize or enumerate environment
+               // and now the layout spaces, for example before and after a section, 
+               // or between the items of a itemize or enumerate environment
       
-      if (!firstpar->params().pagebreakTop()) {
-        Paragraph * prev = row_ptr->par()->previous();
-        if (prev)
-           prev = row_ptr->par()->depthHook(row_ptr->par()->getDepth());
-        if (prev && prev->getLayout() == firstpar->getLayout()
-            && prev->getDepth() == firstpar->getDepth()
-            && prev->getLabelWidthString() == firstpar->getLabelWidthString())
-          {
-             layoutasc = (layout.itemsep * defaultHeight());
-          }
-        else if (row_ptr->previous()) {
-           tmptop = layout.topsep;
+               if (!firstpar->params().pagebreakTop()) {
+                       Paragraph * prev = row_ptr->par()->previous();
+                       if (prev)
+                               prev = row_ptr->par()->depthHook(row_ptr->par()->getDepth());
+                       if (prev && prev->getLayout() == firstpar->getLayout() &&
+                               prev->getDepth() == firstpar->getDepth() &&
+                               prev->getLabelWidthString() == firstpar->getLabelWidthString())
+                       {
+                               layoutasc = (layout.itemsep * defaultHeight());
+                       } else if (row_ptr->previous()) {
+                               tmptop = layout.topsep;
            
-           if (row_ptr->previous()->par()->getDepth() >= row_ptr->par()->getDepth())
-              tmptop -= textclasslist.Style(bview->buffer()->params.textclass,
-                                            row_ptr->previous()->par()->
-                                            getLayout()).bottomsep;
+                               if (row_ptr->previous()->par()->getDepth() >= row_ptr->par()->getDepth())
+                                       tmptop -= textclasslist.Style(bview->buffer()->params.textclass,
+                                                                     row_ptr->previous()->par()->
+                                                                     getLayout()).bottomsep;
            
-           if (tmptop > 0)
-              layoutasc = (tmptop * defaultHeight());
-        }
-        else if (row_ptr->par()->params().lineTop()) {
-           tmptop = layout.topsep;
+                               if (tmptop > 0)
+                                       layoutasc = (tmptop * defaultHeight());
+                       } else if (row_ptr->par()->params().lineTop()) {
+                               tmptop = layout.topsep;
            
-           if (tmptop > 0)
-              layoutasc = (tmptop * defaultHeight());
-        }
+                               if (tmptop > 0)
+                                       layoutasc = (tmptop * defaultHeight());
+                       }
         
-        prev = row_ptr->par()->outerHook();
-        if (prev)  {
-           maxasc += int(textclasslist.Style(bview->buffer()->params.textclass,
-                                        prev->getLayout()).parsep * defaultHeight());
-        }
-        else {
-               if (firstpar->previous()
-                   && firstpar->previous()->getDepth() == 0
-                   && firstpar->previous()->getLayout() != firstpar->getLayout()) {
-                       // avoid parsep
-               }
-           else if (firstpar->previous()){
-              maxasc += int(layout.parsep * defaultHeight());
-           }
-        }
-      }
-   }
+                       prev = row_ptr->par()->outerHook();
+                       if (prev)  {
+                               maxasc += int(textclasslist.Style(bview->buffer()->params.textclass,
+                                             prev->getLayout()).parsep * defaultHeight());
+                       } else {
+                               if (firstpar->previous() &&
+                                       firstpar->previous()->getDepth() == 0 &&
+                                       firstpar->previous()->getLayout() !=
+                                       firstpar->getLayout())
+                               {
+                                       // avoid parsep
+                               } else if (firstpar->previous()) {
+                                       maxasc += int(layout.parsep * defaultHeight());
+                               }
+                       }
+               }
+       }
    
-   // is it a bottom line?
-   if (row_ptr->par() == par
-       && (!row_ptr->next() || row_ptr->next()->par() != row_ptr->par())) {
-         
-          // the paper margins
-         if (!par->next() && bv_owner)
-           maxdesc += LYX_PAPER_MARGIN;
+       // is it a bottom line?
+       if (row_ptr->par() == par
+               && (!row_ptr->next() || row_ptr->next()->par() != row_ptr->par()))
+       {
+               // the paper margins
+               if (!par->next() && bv_owner)
+                       maxdesc += LYX_PAPER_MARGIN;
          
-         // add the vertical spaces, that the user added
-         if (firstpar->params().spaceBottom().kind() != VSpace::NONE)
-                 maxdesc += int(firstpar->params().spaceBottom().inPixels(bview));
+               // add the vertical spaces, that the user added
+               if (firstpar->params().spaceBottom().kind() != VSpace::NONE)
+                       maxdesc += int(firstpar->params().spaceBottom().inPixels(bview));
          
-         // do not forget the DTP-lines!
-         // there height depends on the font of the nearest character
-         if (firstpar->params().lineBottom())
-                 maxdesc += 2 * lyxfont::ascent('x',
-                                                getFont(bview->buffer(),
-                                                        par, par->size() - 1));
+               // do not forget the DTP-lines!
+               // there height depends on the font of the nearest character
+               if (firstpar->params().lineBottom())
+                       maxdesc += 2 * lyxfont::ascent('x',
+                                                      getFont(bview->buffer(),
+                                                              par,
+                                                              max(Paragraph::size_type(0), par->size() - 1)));
          
-         // and now the pagebreaks
-         if (firstpar->params().pagebreakBottom())
-           maxdesc += 3 * defaultHeight();
+               // and now the pagebreaks
+               if (firstpar->params().pagebreakBottom())
+                       maxdesc += 3 * defaultHeight();
          
-         // and now the layout spaces, for example before and after
-         // a section, or between the items of a itemize or enumerate
-         // environment
-         if (!firstpar->params().pagebreakBottom() && row_ptr->par()->next()) {
-            Paragraph * nextpar = row_ptr->par()->next();
-            Paragraph * comparepar = row_ptr->par();
-            float usual = 0;
-            float unusual = 0;
+               // and now the layout spaces, for example before and after
+               // a section, or between the items of a itemize or enumerate
+               // environment
+               if (!firstpar->params().pagebreakBottom() && row_ptr->par()->next()) {
+                       Paragraph * nextpar = row_ptr->par()->next();
+                       Paragraph * comparepar = row_ptr->par();
+                       float usual = 0;
+                       float unusual = 0;
             
-            if (comparepar->getDepth() > nextpar->getDepth()) {
-               usual = (textclasslist.Style(bview->buffer()->params.textclass, comparepar->getLayout()).bottomsep * defaultHeight());
-               comparepar = comparepar->depthHook(nextpar->getDepth());
-               if (comparepar->getLayout()!= nextpar->getLayout()
-                   || nextpar->getLabelWidthString() != 
-                       comparepar->getLabelWidthString())
-                 unusual = (textclasslist.Style(bview->buffer()->params.textclass, comparepar->getLayout()).bottomsep * defaultHeight());
-               
-               if (unusual > usual)
-                 layoutdesc = unusual;
-               else
-                 layoutdesc = usual;
-            }
-            else if (comparepar->getDepth() ==  nextpar->getDepth()) {
-               
-               if (comparepar->getLayout()!= nextpar->getLayout()
-                   || nextpar->getLabelWidthString() != 
-                       comparepar->getLabelWidthString())
-                 layoutdesc = int(textclasslist.Style(bview->buffer()->params.textclass, comparepar->getLayout()).bottomsep * defaultHeight());
-            }
-         }
-       }
-   
-   // incalculate the layout spaces
-   maxasc += int(layoutasc * 2 / (2 + firstpar->getDepth()));
-   maxdesc += int(layoutdesc * 2 / (2 + firstpar->getDepth()));
-
-   // calculate the new height of the text
-   height -= row_ptr->height();
-   
-   row_ptr->height(maxasc + maxdesc + labeladdon);
-   row_ptr->baseline(maxasc + labeladdon);
-   
-   height += row_ptr->height();
-   float x;
-   float dummy;
-   prepareToPrint(bview, row_ptr, x, dummy, dummy, dummy, false);
-   row_ptr->width(int(maxwidth + x));
-   if (inset_owner) {
-          Row * r = firstrow;
-          width = max(0,workWidth(bview));
-          while(r) {
-                  if (r->width() > width)
-                          width = r->width();
-                  r = r->next();
-          }
-   }
+                       if (comparepar->getDepth() > nextpar->getDepth()) {
+                               usual = (textclasslist.Style(bview->buffer()->params.textclass,
+                                        comparepar->getLayout()).bottomsep * defaultHeight());
+                               comparepar = comparepar->depthHook(nextpar->getDepth());
+                               if (comparepar->getLayout()!= nextpar->getLayout()
+                                       || nextpar->getLabelWidthString() != 
+                                       comparepar->getLabelWidthString())
+                               {
+                                       unusual = (textclasslist.Style(bview->buffer()->params.textclass,
+                                                  comparepar->getLayout()).bottomsep * defaultHeight());
+                               }
+                               if (unusual > usual)
+                                       layoutdesc = unusual;
+                               else
+                                       layoutdesc = usual;
+                       } else if (comparepar->getDepth() ==  nextpar->getDepth()) {
+                               
+                               if (comparepar->getLayout()!= nextpar->getLayout()
+                                       || nextpar->getLabelWidthString() != 
+                                       comparepar->getLabelWidthString())
+                                       layoutdesc = int(textclasslist.Style(bview->buffer()->params.textclass,
+                                                                                                                comparepar->getLayout()).bottomsep * defaultHeight());
+                       }
+               }
+       }
+       
+       // incalculate the layout spaces
+       maxasc += int(layoutasc * 2 / (2 + firstpar->getDepth()));
+       maxdesc += int(layoutdesc * 2 / (2 + firstpar->getDepth()));
+       
+       // calculate the new height of the text
+       height -= row_ptr->height();
+       
+       row_ptr->height(maxasc + maxdesc + labeladdon);
+       row_ptr->baseline(maxasc + labeladdon);
+       
+       height += row_ptr->height();
+       float x;
+       float dummy;
+       prepareToPrint(bview, row_ptr, x, dummy, dummy, dummy, false);
+       row_ptr->width(int(maxwidth + x));
+       if (inset_owner) {
+               Row * r = firstrow;
+               width = max(0,workWidth(bview));
+               while(r) {
+                       if (r->width() > width)
+                               width = r->width();
+                       r = r->next();
+               }
+       }
 }
 
 
@@ -1694,7 +1713,7 @@ void LyXText::breakParagraph(BufferView * bview, char keep_layout)
 // Just a macro to make some thing easier. 
 void LyXText::redoParagraph(BufferView * bview) const
 {
-       clearSelection(bview);
+       clearSelection();
        redoParagraphs(bview, cursor, cursor.par()->next());
        setCursorIntern(bview, cursor.par(), cursor.pos());
 }
@@ -1730,12 +1749,12 @@ void LyXText::insertChar(BufferView * bview, char c)
                                      cursor.pos()).number() == LyXFont::ON &&
                              getFont(bview->buffer(),
                                      cursor.par(),
-                                     cursor.pos()-1).number() == LyXFont::ON)
+                                     cursor.pos() - 1).number() == LyXFont::ON)
                            )
-                               Number(bview); // Set current_font.number to OFF
+                               number(bview); // Set current_font.number to OFF
                } else if (isdigit(c) &&
                           real_current_font.isVisibleRightToLeft()) {
-                       Number(bview); // Set current_font.number to ON
+                       number(bview); // Set current_font.number to ON
 
                        if (cursor.pos() > 0) {
                                char const c = cursor.par()->getChar(cursor.pos() - 1);
@@ -1752,7 +1771,7 @@ void LyXText::insertChar(BufferView * bview, char c)
                                           cursor.pos() >= 2 &&
                                           getFont(bview->buffer(),
                                                   cursor.par(),
-                                                  cursor.pos()-2).number() == LyXFont::ON) {
+                                                  cursor.pos() - 2).number() == LyXFont::ON) {
                                        setCharFont(bview->buffer(),
                                                    cursor.par(),
                                                    cursor.pos() - 1,
@@ -1976,11 +1995,11 @@ void LyXText::charInserted()
 
 
 void LyXText::prepareToPrint(BufferView * bview,
-                            Row * row, float & x,
-                            float & fill_separator, 
-                            float & fill_hfill,
-                            float & fill_label_hfill,
-                            bool bidi) const
+                             Row * row, float & x,
+                             float & fill_separator, 
+                             float & fill_hfill,
+                             float & fill_label_hfill,
+                             bool bidi) const
 {
        float nlh;
        float ns;
@@ -2015,45 +2034,49 @@ void LyXText::prepareToPrint(BufferView * bview,
        // are there any hfills in the row?
        float const nh = numberOfHfills(bview->buffer(), row);
 
-       if (nh)
-         fill_hfill = w / nh;
-       else  {
+       if (nh) {
+               if (w > 0)
+                       fill_hfill = w / nh;
+       } else  {
                // is it block, flushleft or flushright? 
                // set x how you need it
-       int align;
-       if (row->par()->params().align() == LYX_ALIGN_LAYOUT)
-         align = textclasslist.Style(bview->buffer()->params.textclass, row->par()->getLayout()).align;
-       else
-         align = row->par()->params().align();
-          
-       // center displayed insets 
-       Inset * inset;
-          if (row->par()->getChar(row->pos()) == Paragraph::META_INSET
-              && (inset=row->par()->getInset(row->pos()))
-              && (inset->display())) // || (inset->scroll() < 0)))
-            align = (inset->lyxCode() == Inset::MATHMACRO_CODE)
-                    ? LYX_ALIGN_BLOCK : LYX_ALIGN_CENTER;
-
-          switch (align) {
+               int align;
+               if (row->par()->params().align() == LYX_ALIGN_LAYOUT) {
+                       align = textclasslist.Style(bview->buffer()->params.textclass, row->par()->getLayout()).align;
+               } else {
+                       align = row->par()->params().align();
+               }
+               
+               // center displayed insets 
+               Inset * inset;
+               if (row->par()->getChar(row->pos()) == Paragraph::META_INSET
+                   && (inset=row->par()->getInset(row->pos()))
+                   && (inset->display())) // || (inset->scroll() < 0)))
+                   align = (inset->lyxCode() == Inset::MATHMACRO_CODE)
+                       ? LYX_ALIGN_BLOCK : LYX_ALIGN_CENTER;
+               
+               switch (align) {
            case LYX_ALIGN_BLOCK:
-             ns = numberOfSeparators(bview->buffer(), row);
-             if (ns && row->next() && row->next()->par() == row->par() &&
-                 !(row->next()->par()->isNewline(row->next()->pos() - 1))
-                 && !(row->next()->par()->getChar(row->next()->pos()) == Paragraph::META_INSET
-                      && row->next()->par()->getInset(row->next()->pos())
-                      && row->next()->par()->getInset(row->next()->pos())->display())
-                 )
-               fill_separator = w / ns;
-             else if (is_rtl)
-               x += w;
-             break;
+                       ns = numberOfSeparators(bview->buffer(), row);
+                       if (ns && row->next() && row->next()->par() == row->par() &&
+                           !(row->next()->par()->isNewline(row->next()->pos() - 1))
+                           && !(row->next()->par()->getChar(row->next()->pos()) == Paragraph::META_INSET
+                                && row->next()->par()->getInset(row->next()->pos())
+                                && row->next()->par()->getInset(row->next()->pos())->display())
+                               )
+                       {
+                               fill_separator = w / ns;
+                       } else if (is_rtl) {
+                               x += w;
+                       }
+                       break;
            case LYX_ALIGN_RIGHT:
-             x += w;
-             break;
+                       x += w;
+                       break;
            case LYX_ALIGN_CENTER:
-             x += w / 2;
-             break;
-          }
+                       x += w / 2;
+                       break;
+               }
        }
        if (!bidi)
                return;
@@ -2071,7 +2094,7 @@ void LyXText::prepareToPrint(BufferView * bview,
                                textclasslist.Style(bview->buffer()->params.textclass,
                                                    row->par()->getLayout());
                        x += lyxfont::width(layout.labelsep,
-                                           getFont(bview->buffer(), row->par(), -2));
+                                           getLabelFont(bview->buffer(), row->par()));
                        if (main_body-1 <= last)
                                x += fill_label_hfill;
                }
@@ -2248,16 +2271,17 @@ bool LyXText::selectWordWhenUnderCursor(BufferView * bview,
 
 // This function is only used by the spellchecker for NextWord().
 // It doesn't handle LYX_ACCENTs and probably never will.
-string const LyXText::selectNextWord(BufferView * bview,
-                                    float & value) const
+string const LyXText::selectNextWordToSpellcheck(BufferView * bview,
+                                     float & value) const
 {
        if (the_locking_inset) {
-               string str = the_locking_inset->selectNextWord(bview, value);
+               string str = the_locking_inset->selectNextWordToSpellcheck(bview, value);
                if (!str.empty()) {
                        value += float(cursor.y())/float(height);
                        return str;
                }
 #warning Dekel please have a look on this one RTL? (Jug)
+#warning DEKEL!
                // we have to go on checking so move cusor to the right
                if (cursor.pos() == cursor.par()->size()) {
                        if (!cursor.par()->next())
@@ -2280,17 +2304,12 @@ string const LyXText::selectNextWord(BufferView * bview,
        
        // Now, skip until we have real text (will jump paragraphs)
        while ((cursor.par()->size() > cursor.pos()
-              && (!cursor.par()->isLetter(cursor.pos())
-#ifndef NO_LATEX
-                   || cursor.par()->getFont(bview->buffer()->params, cursor.pos())
-                   .latex() == LyXFont::ON
-#endif
-                       )
+              && (!cursor.par()->isLetter(cursor.pos()))
               && (!cursor.par()->isInset(cursor.pos()) ||
                   !cursor.par()->getInset(cursor.pos())->isTextInset()))
               || (cursor.par()->size() == cursor.pos()
                   && cursor.par()->next()))
-       {
+       {      
                if (cursor.pos() == cursor.par()->size()) {
                        cursor.par(cursor.par()->next());
                        cursor.pos(0);
@@ -2300,13 +2319,13 @@ string const LyXText::selectNextWord(BufferView * bview,
 
        // now check if we hit an inset so it has to be a inset containing text!
        if (cursor.pos() < cursor.par()->size() &&
-               cursor.par()->isInset(cursor.pos()))
+           cursor.par()->isInset(cursor.pos()))
        {
                // lock the inset!
                cursor.par()->getInset(cursor.pos())->edit(bview);
                // now call us again to do the above trick
                // but obviously we have to start from down below ;)
-               return bview->text->selectNextWord(bview, value);
+               return bview->text->selectNextWordToSpellcheck(bview, value);
        }               
   
        // Update the value if we changed paragraphs
@@ -2390,10 +2409,10 @@ void LyXText::deleteWordForward(BufferView * bview)
                setCursor(bview, tmpcursor, tmpcursor.par(), tmpcursor.pos());
                selection.cursor = cursor;
                cursor = tmpcursor;
-               setSelection(bview); 
+               setSelection(bview);
                
                /* -----> Great, CutSelection() gets rid of multiple spaces. */
-               cutSelection(bview);
+               cutSelection(bview, true, false);
        }
 }
 
@@ -2412,7 +2431,7 @@ void LyXText::deleteWordBackward(BufferView * bview)
               selection.cursor = cursor;
               cursor = tmpcursor;
               setSelection(bview);
-              cutSelection(bview);
+              cutSelection(bview, true, false);
        }
 }
 
@@ -2438,7 +2457,7 @@ void LyXText::deleteLineForward(BufferView * bview)
                if (!selection.set()) {
                        deleteWordForward(bview);
                } else {
-                       cutSelection(bview);
+                       cutSelection(bview, true, false);
                }
        }
 }
@@ -2566,7 +2585,9 @@ void LyXText::Delete(BufferView * bview)
        if ((cursor.par()->previous() ? cursor.par()->previous()->id() : 0)
            == old_cur_par_prev_id
            && cursor.par()->id() != old_cur_par_id)
+       {
                return; // delete-empty-paragraph-mechanism has done it
+       }
 
        // if you had success make a backspace
        if (old_cursor.par() != cursor.par() || old_cursor.pos() != cursor.pos()) {
@@ -2629,8 +2650,7 @@ void LyXText::backspace(BufferView * bview)
 
                if (cursor.par()->previous()) {
                        setUndo(bview, Undo::DELETE,
-                               cursor.par()->previous(),
-                               cursor.par()->next());
+                               cursor.par()->previous(), cursor.par()->next());
                }
                
                Paragraph * tmppar = cursor.par();
@@ -2643,8 +2663,8 @@ void LyXText::backspace(BufferView * bview)
                if (cursor.par()->previous()) { 
                        // steps into the above paragraph.
                        setCursorIntern(bview, cursor.par()->previous(),
-                                       cursor.par()->previous()->size(),
-                                       false);
+                                       cursor.par()->previous()->size(),
+                                       false);
                }
 
                /* Pasting is not allowed, if the paragraphs have different
@@ -2660,8 +2680,8 @@ void LyXText::backspace(BufferView * bview)
                if (cursor.par() != tmppar
                    && (cursor.par()->getLayout() == tmppar->getLayout()
                        || tmppar->getLayout() == 0 /*standard*/)
-                   && cursor.par()->getAlign() == tmppar->getAlign()) {
-
+                   && cursor.par()->getAlign() == tmppar->getAlign())
+               {
                        removeParagraph(tmprow);
                        removeRow(tmprow);
                        cursor.par()->pasteParagraph(bview->buffer()->params);
@@ -2698,13 +2718,13 @@ void LyXText::backspace(BufferView * bview)
                /* this is the code for a normal backspace, not pasting
                 * any paragraphs */ 
                setUndo(bview, Undo::DELETE,
-                       cursor.par(), cursor.par()->next()); 
+                       cursor.par(), cursor.par()->next()); 
                // We used to do cursorLeftIntern() here, but it is
                // not a good idea since it triggers the auto-delete
                // mechanism. So we do a cursorLeftIntern()-lite,
                // without the dreaded mechanism. (JMarc)
                setCursorIntern(bview, cursor.par(), cursor.pos()- 1,
-                               false, cursor.boundary());
+                               false, cursor.boundary());
                
                // some insets are undeletable here
                if (cursor.par()->getChar(cursor.pos()) == Paragraph::META_INSET) {
@@ -2728,8 +2748,8 @@ void LyXText::backspace(BufferView * bview)
                if (cursor.pos() < rowLast(row) ||
                    !cursor.par()->isLineSeparator(cursor.pos())) {
                        row->fill(row->fill() + singleWidth(bview,
-                                                           cursor.par(),
-                                                           cursor.pos()));
+                                                           cursor.par(),
+                                                           cursor.pos()));
                }
                
                /* some special code when deleting a newline. This is similar
@@ -2949,45 +2969,47 @@ void LyXText::getVisibleRow(BufferView * bview, int y_offset, int x_offset,
        if (cleared) {
                clear_area = true;
        } else if (clear_area) {
-#ifdef WITH_WARNINGS
-#warning Should be fixed with a lyxinset::clear_width(bv, font) function! (Jug)
-#warning Should we not fix this in the Painter, please have a look Lars! (Jug)
-#endif
                int const y = y_offset < 0 ? 0 : y_offset;
                int const h = y_offset < 0 ?
                        row_ptr->height() + y_offset : row_ptr->height();
                int const w = inset_owner ?
-                       inset_owner->width(bview, font) - 2 : ww;
+                       inset_owner->textWidth(bview, true) : ww;
                int const x = x_offset;
                pain.fillRectangle(x, y, w, h, backgroundColor());
        } else if (inset != 0) {
                int h = row_ptr->baseline() - inset->ascent(bview, font);
+               // first clear the whole row above the inset!
                if (h > 0) {
                        int const w = (inset_owner ?
-                                inset_owner->width(bview, font) : ww);
+                                inset_owner->textWidth(bview, true) : ww);
                        pain.fillRectangle(x_offset, y_offset, w, h,
-                                          backgroundColor());
+                                          backgroundColor());
                }
                h += inset->ascent(bview, font) + inset->descent(bview, font);
+               // clear the space below the inset!
                if ((row_ptr->height() - h) > 0) {
                        int const w = (inset_owner ?
-                                inset_owner->width(bview, font) : ww);
+                                      inset_owner->textWidth(bview, true) : ww);
                        pain.fillRectangle(x_offset, y_offset + h,
-                                          w, row_ptr->height() - h,
-                                          backgroundColor());
+                                          w, row_ptr->height() - h,
+                                          backgroundColor());
                }
-               if (!inset_owner && !inset->display() && !inset->needFullRow())
-               {
-                       int const w = inset->width(bview, font) + int(x);
-                       pain.fillRectangle(w, y_offset, 
-                                          ww - w, row_ptr->height(),
-                                          backgroundColor());
+               // clear the space behind the inset, if needed
+               if (!inset->display() && !inset->needFullRow()) {
+                       int const w = (inset_owner ?
+                                      inset_owner->textWidth(bview, true) : ww);
+                       int const xp = int(x) + inset->width(bview, font);
+                       if (w-xp > 0) {
+                               pain.fillRectangle(xp, y_offset,
+                                                  w-xp, row_ptr->height(),
+                                                  backgroundColor());
+                       }
                }
        }
 
        if (selection.set()) {
                int const w = (inset_owner ?
-                              inset_owner->width(bview, font) : ww);
+                              inset_owner->textWidth(bview, true) : ww);
                // selection code
                if (bidi_same_direction) {
                        if (selection.start.row() == row_ptr &&
@@ -3061,7 +3083,7 @@ void LyXText::getVisibleRow(BufferView * bview, int y_offset, int x_offset,
                                        tmpx += fill_label_hfill +
                                                lyxfont::width(textclasslist.Style(bview->buffer()->params.textclass,
                                                                                   row_ptr->par()->getLayout()).labelsep,
-                                                              getFont(bview->buffer(),row_ptr->par(), -2));
+                                                              getLabelFont(bview->buffer(),row_ptr->par()));
                                        if (row_ptr->par()->isLineSeparator(main_body-1))
                                                tmpx -= singleWidth(bview, row_ptr->par(), main_body-1);
                                }
@@ -3177,19 +3199,9 @@ void LyXText::getVisibleRow(BufferView * bview, int y_offset, int x_offset,
                                  ww, 
                                  y_offset + y_top + 2 * defaultHeight(),
                                  LColor::pagebreak, 
-                                 Painter::line_onoffdash)
-#if 0
-                               .rectText(0,
-                                         0,
-                                         _("Page Break (top)"),
-                                         pb_font,
-                                         backgroundColor(),
-                                         backgroundColor(), false, w, a, d);
-#else
-                       ;
+                                 Painter::line_onoffdash);
                        lyxfont::rectText(_("Page Break (top)"), pb_font,
                                          w, a, d);
-#endif
                        pain.rectText((ww - w)/2,
                                      y_offset + y_top + 2 * defaultHeight() + d,
                                      _("Page Break (top)"),
@@ -3259,7 +3271,7 @@ void LyXText::getVisibleRow(BufferView * bview, int y_offset, int x_offset,
                    && (layout.labeltype != LABEL_STATIC
                        || layout.latextype != LATEX_ENVIRONMENT
                        || row_ptr->par()->isFirstInSequence())) {
-                       font = getFont(bview->buffer(), row_ptr->par(), -2);
+                       font = getLabelFont(bview->buffer(), row_ptr->par());
                        if (!row_ptr->par()->getLabelstring().empty()) {
                                tmpx = x;
                                string const tmpstring =
@@ -3308,8 +3320,8 @@ void LyXText::getVisibleRow(BufferView * bview, int y_offset, int x_offset,
                           layout.labeltype == LABEL_BIBLIO ||
                           layout.labeltype == LABEL_CENTERED_TOP_ENVIRONMENT) {
                        if (row_ptr->par()->isFirstInSequence()) {
-                               font = getFont(bview->buffer(),
-                                              row_ptr->par(), -2);
+                               font = getLabelFont(bview->buffer(),
+                                                   row_ptr->par());
                                if (!row_ptr->par()->getLabelstring().empty()) {
                                        string const tmpstring =
                                                row_ptr->par()->getLabelstring();
@@ -3340,7 +3352,7 @@ void LyXText::getVisibleRow(BufferView * bview, int y_offset, int x_offset,
                        }
                }
                if (layout.labeltype == LABEL_BIBLIO && row_ptr->par()->bibkey) {
-                       font = getFont(bview->buffer(), row_ptr->par(), -1);
+                       font = getLayoutFont(bview->buffer(), row_ptr->par());
                        if (is_rtl)
                                tmpx = ww - leftMargin(bview, row_ptr)
                                        + lyxfont::width(layout.labelsep, font);
@@ -3374,18 +3386,9 @@ void LyXText::getVisibleRow(BufferView * bview, int y_offset, int x_offset,
                        pain
                                .line(0, y_place, ww, y_place,
                                      LColor::pagebreak,
-                                     Painter::line_onoffdash)
-#if 0
-                               .rectText(0, 0,
-                                         _("Page Break (bottom)"),
-                                         pb_font,
-                                         backgroundColor(),
-                                         backgroundColor(), false, w, a, d);
-#else
-                       ;
+                                     Painter::line_onoffdash);
                        lyxfont::rectText(_("Page Break (bottom)"), pb_font,
                                          w, a, d);
-#endif
                        pain.rectText((ww - w) / 2, y_place + d,
                                      _("Page Break (bottom)"),
                                      pb_font,
@@ -3422,7 +3425,7 @@ void LyXText::getVisibleRow(BufferView * bview, int y_offset, int x_offset,
                        y_bottom -= lyxfont::ascent('x',
                                                    getFont(bview->buffer(),
                                                            par,
-                                                           par->size() - 1));
+                                                           max(Paragraph::size_type(0), par->size() - 1)));
                        int const w = (inset_owner ?
                                       inset_owner->width(bview, font) : ww);
                        int const xp = static_cast<int>(inset_owner ? x : 0);
@@ -3433,7 +3436,7 @@ void LyXText::getVisibleRow(BufferView * bview, int y_offset, int x_offset,
                        y_bottom -= lyxfont::ascent('x',
                                                    getFont(bview->buffer(),
                                                            par,
-                                                           par->size() - 1));
+                                                           max(Paragraph::size_type(0), par->size() - 1)));
                }
 
                // draw an endlabel
@@ -3472,7 +3475,7 @@ void LyXText::getVisibleRow(BufferView * bview, int y_offset, int x_offset,
                        string const tmpstring = textclasslist.
                                Style(bview->buffer()->params.textclass,
                                      layout).endlabelstring();
-                       font = getFont(bview->buffer(), row_ptr->par(), -2);
+                       font = getLabelFont(bview->buffer(), row_ptr->par());
                        int const tmpx = is_rtl ?
                                int(x) - lyxfont::width(tmpstring, font)
                                : ww - rightMargin(bview->buffer(), row_ptr) - row_ptr->fill();
@@ -3500,8 +3503,8 @@ void LyXText::getVisibleRow(BufferView * bview, int y_offset, int x_offset,
                if (main_body > 0 && pos == main_body - 1) {
                        x += fill_label_hfill
                                + lyxfont::width(layout.labelsep,
-                                                getFont(bview->buffer(),
-                                                        row_ptr->par(), -2))
+                                                getLabelFont(bview->buffer(),
+                                                             row_ptr->par()))
                                - singleWidth(bview,
                                              row_ptr->par(),
                                              main_body - 1);
@@ -3598,7 +3601,7 @@ int LyXText::getColumnNearX(BufferView * bview, Row * row, int & x,
                if (main_body > 0 && c == main_body-1) {
                        tmpx += fill_label_hfill +
                                lyxfont::width(layout.labelsep,
-                                              getFont(bview->buffer(), row->par(), -2));
+                                              getLabelFont(bview->buffer(), row->par()));
                        if (row->par()->isLineSeparator(main_body - 1))
                                tmpx -= singleWidth(bview, row->par(), main_body-1);
                }