]> git.lyx.org Git - lyx.git/blobdiff - src/text.C
Painter and scrollbar API patches
[lyx.git] / src / text.C
index 217398f890a7b39ae556b028f6b2fefa8544aeec..6ee09775462a58457e15366198ffa605fd1ef4c3 100644 (file)
 #include "buffer.h"
 #include "debug.h"
 #include "lyxrc.h"
-#include "LyXView.h"
-#include "Painter.h"
-#include "tracer.h"
-#include "font.h"
 #include "encoding.h"
-#include "lyxscreen.h"
+#include "frontends/LyXView.h"
+#include "frontends/Painter.h"
+#include "frontends/font_metrics.h"
+#include "frontends/screen.h"
 #include "bufferview_funcs.h"
 #include "BufferView.h"
 #include "language.h"
 #include "ParagraphParameters.h"
 #include "undo_funcs.h"
-#include "font.h"
 
 #include "insets/insetbib.h"
 #include "insets/insettext.h"
@@ -214,11 +212,11 @@ int LyXText::singleWidth(BufferView * bview, Paragraph * par,
                                 Encodings::IsComposeChar_hebrew(c))
                                return 0;
                }
-               return lyxfont::width(c, font);
+               return font_metrics::width(c, font);
 
        } else if (IsHfillChar(c)) {
-               return 3;       /* Because of the representation
-                                * as vertical lines */
+               // Because of the representation as vertical lines 
+               return 3;
        } else if (c == Paragraph::META_INSET) {
                Inset * tmpinset = par->getInset(pos);
                if (tmpinset) {
@@ -236,7 +234,7 @@ int LyXText::singleWidth(BufferView * bview, Paragraph * par,
                c = ' ';
        else if (IsNewlineChar(c))
                c = 'n';
-       return lyxfont::width(c, font);
+       return font_metrics::width(c, font);
 }
 
 
@@ -283,6 +281,13 @@ void LyXText::computeBidiTables(Buffer const * buf, Row * row) const
                return;
        }
 
+       Inset * inset = row->par()->inInset();
+       if (inset && inset->owner() &&
+           inset->owner()->lyxCode() == Inset::ERT_CODE) {
+               bidi_start = -1;
+               return;
+       }
+
        bidi_start = row->pos();
        bidi_end = rowLastPrintable(row);
 
@@ -306,14 +311,13 @@ void LyXText::computeBidiTables(Buffer const * buf, Row * row) const
 
        pos_type stack[2];
        bool const rtl_par =
-               row->par()->getParLanguage(buf->params)->RightToLeft();
+               row->par()->isRightToLeftPar(buf->params);
        int level = 0;
        bool rtl = false;
        bool rtl0 = false;
        pos_type const main_body = beginningOfMainBody(buf, row->par());
 
-       for (pos_type lpos = bidi_start;
-            lpos <= bidi_end; ++lpos) {
+       for (pos_type lpos = bidi_start; lpos <= bidi_end; ++lpos) {
                bool is_space = row->par()->isLineSeparator(lpos);
                pos_type const pos =
                        (is_space && lpos + 1 <= bidi_end &&
@@ -429,12 +433,13 @@ bool LyXText::isBoundary(Buffer const * buf, Paragraph * par,
        return rtl != rtl2;
 }
 
+
 void LyXText::drawNewline(DrawRowParams & p, pos_type const pos)
 {
        // Draw end-of-line marker
        LyXFont const font = getFont(p.bv->buffer(), p.row->par(), pos);
-       int const wid = lyxfont::width('n', font);
-       int const asc = lyxfont::maxAscent(font);
+       int const wid = font_metrics::width('n', font);
+       int const asc = font_metrics::maxAscent(font);
        int const y = p.yo + p.row->baseline();
        int xp[3];
        int yp[3];
@@ -475,23 +480,25 @@ void LyXText::drawNewline(DrawRowParams & p, pos_type const pos)
 }
 
 
-void LyXText::drawInset(DrawRowParams & p, pos_type const pos)
+bool LyXText::drawInset(DrawRowParams & p, pos_type const pos)
 {
        Inset * inset = p.row->par()->getInset(pos);
 
        // FIXME: shouldn't happen
        if (!inset) {
-               return;
+               return true;
        }
 
        LyXFont const & font = getFont(p.bv->buffer(), p.row->par(), pos);
+       // we need this here as the row pointer may be illegal
+       // at a later time (Jug20020502)
+       Row * prev = p.row->previous();
 
        inset->update(p.bv, font, false);
        inset->draw(p.bv, font, p.yo + p.row->baseline(), p.x, p.cleared);
 
        if (!need_break_row && !inset_owner
            && p.bv->text->status() == CHANGED_IN_DRAW) {
-               Row * prev = p.row->previous();
                if (prev && prev->par() == p.row->par()) {
                        breakAgainOneRow(p.bv, prev);
                        if (prev->next() != p.row) {
@@ -501,11 +508,15 @@ void LyXText::drawInset(DrawRowParams & p, pos_type const pos)
                        } else {
                                need_break_row = p.row;
                        }
+               } else if (!prev) {
+                       need_break_row = firstrow;
                } else {
-                       need_break_row = p.row;
+                       need_break_row = prev->next();
                }
                setCursor(p.bv, cursor.par(), cursor.pos());
+               return false;
        }
+       return true;
 }
 
 
@@ -535,7 +546,7 @@ void LyXText::drawHebrewComposeChar(DrawRowParams & p, pos_type & vpos)
        ++vpos;
 
        LyXFont const & font = getFont(p.bv->buffer(), p.row->par(), pos);
-       int const width = lyxfont::width(c, font);
+       int const width = font_metrics::width(c, font);
        int dx = 0;
 
        for (pos_type i = pos-1; i >= 0; --i) {
@@ -570,7 +581,7 @@ void LyXText::drawArabicComposeChar(DrawRowParams & p, pos_type & vpos)
        ++vpos;
 
        LyXFont const & font = getFont(p.bv->buffer(), p.row->par(), pos);
-       int const width = lyxfont::width(c, font);
+       int const width = font_metrics::width(c, font);
        int dx = 0;
 
        for (pos_type i = pos-1; i >= 0; --i) {
@@ -626,11 +637,11 @@ void LyXText::drawChars(DrawRowParams & p, pos_type & vpos,
 
        // Draw text and set the new x position
        p.pain->text(int(p.x), p.yo + p.row->baseline(), str, orig_font);
-       p.x += lyxfont::width(str, orig_font);
+       p.x += font_metrics::width(str, orig_font);
 }
 
 
-void LyXText::draw(DrawRowParams & p, pos_type & vpos)
+bool LyXText::draw(DrawRowParams & p, pos_type & vpos)
 {
        pos_type const pos = vis2log(vpos);
        Paragraph * par = p.row->par();
@@ -644,12 +655,13 @@ void LyXText::draw(DrawRowParams & p, pos_type & vpos)
        if (IsNewlineChar(c)) {
                ++vpos;
                drawNewline(p, pos);
-               return;
+               return true;
        } else if (IsInsetChar(c)) {
-               drawInset(p, pos);
+               if (!drawInset(p, pos))
+                       return false;
                ++vpos;
                drawForeignMark(p, orig_x, orig_font);
-               return;
+               return true;
        }
 
        // usual characters, no insets
@@ -681,13 +693,10 @@ void LyXText::draw(DrawRowParams & p, pos_type & vpos)
                lyxerr << "No this shouldn't happen!\n";
 #endif
 #endif
+       return true;
 }
 
 
-// Returns the left beginning of the text.
-// This information cannot be taken from the layouts-objekt, because in
-// LaTeX the beginning of the text fits in some cases (for example sections)
-// exactly the label-width.
 int LyXText::leftMargin(BufferView * bview, Row const * row) const
 {
        Inset * ins;
@@ -703,8 +712,8 @@ int LyXText::leftMargin(BufferView * bview, Row const * row) const
        string parindent = layout.parindent;
 
        int x = LYX_PAPER_MARGIN;
-
-       x += lyxfont::signedWidth(tclass.leftmargin(), tclass.defaultfont());
+       
+       x += font_metrics::signedWidth(tclass.leftmargin(), tclass.defaultfont());
 
        // this is the way, LyX handles the LaTeX-Environments.
        // I have had this idea very late, so it seems to be a
@@ -754,38 +763,38 @@ int LyXText::leftMargin(BufferView * bview, Row const * row) const
        switch (layout.margintype) {
        case MARGIN_DYNAMIC:
                if (!layout.leftmargin.empty()) {
-                       x += lyxfont::signedWidth(layout.leftmargin,
+                       x += font_metrics::signedWidth(layout.leftmargin,
                                                  tclass.defaultfont());
                }
                if (!row->par()->getLabelstring().empty()) {
-                       x += lyxfont::signedWidth(layout.labelindent,
+                       x += font_metrics::signedWidth(layout.labelindent,
                                                  labelfont);
-                       x += lyxfont::width(row->par()->getLabelstring(),
+                       x += font_metrics::width(row->par()->getLabelstring(),
                                            labelfont);
-                       x += lyxfont::width(layout.labelsep, labelfont);
+                       x += font_metrics::width(layout.labelsep, labelfont);
                }
                break;
        case MARGIN_MANUAL:
-               x += lyxfont::signedWidth(layout.labelindent, labelfont);
+               x += font_metrics::signedWidth(layout.labelindent, labelfont);
                if (row->pos() >= beginningOfMainBody(bview->buffer(), row->par())) {
                        if (!row->par()->getLabelWidthString().empty()) {
-                               x += lyxfont::width(row->par()->getLabelWidthString(),
+                               x += font_metrics::width(row->par()->getLabelWidthString(),
                                               labelfont);
-                               x += lyxfont::width(layout.labelsep, labelfont);
+                               x += font_metrics::width(layout.labelsep, labelfont);
                        }
                }
                break;
        case MARGIN_STATIC:
-               x += lyxfont::signedWidth(layout.leftmargin, tclass.defaultfont()) * 4
+               x += font_metrics::signedWidth(layout.leftmargin, tclass.defaultfont()) * 4
                        / (row->par()->getDepth() + 4);
                break;
        case MARGIN_FIRST_DYNAMIC:
                if (layout.labeltype == LABEL_MANUAL) {
                        if (row->pos() >= beginningOfMainBody(bview->buffer(), row->par())) {
-                               x += lyxfont::signedWidth(layout.leftmargin,
+                               x += font_metrics::signedWidth(layout.leftmargin,
                                                          labelfont);
                        } else {
-                               x += lyxfont::signedWidth(layout.labelindent,
+                               x += font_metrics::signedWidth(layout.labelindent,
                                                          labelfont);
                        }
                } else if (row->pos()
@@ -794,16 +803,16 @@ int LyXText::leftMargin(BufferView * bview, Row const * row) const
                           || (layout.labeltype == LABEL_STATIC
                               && layout.latextype == LATEX_ENVIRONMENT
                               && ! row->par()->isFirstInSequence())) {
-                       x += lyxfont::signedWidth(layout.leftmargin,
+                       x += font_metrics::signedWidth(layout.leftmargin,
                                                  labelfont);
                } else if (layout.labeltype != LABEL_TOP_ENVIRONMENT
                           && layout.labeltype != LABEL_BIBLIO
                           && layout.labeltype !=
                           LABEL_CENTERED_TOP_ENVIRONMENT) {
-                       x += lyxfont::signedWidth(layout.labelindent,
+                       x += font_metrics::signedWidth(layout.labelindent,
                                                  labelfont);
-                       x += lyxfont::width(layout.labelsep, labelfont);
-                       x += lyxfont::width(row->par()->getLabelstring(),
+                       x += font_metrics::width(layout.labelsep, labelfont);
+                       x += font_metrics::width(row->par()->getLabelstring(),
                                            labelfont);
                }
                break;
@@ -826,14 +835,23 @@ int LyXText::leftMargin(BufferView * bview, Row const * row) const
                        if (tmprow->fill() < minfill)
                                minfill = tmprow->fill();
                }
-
-               x += lyxfont::signedWidth(layout.leftmargin,
-                                         tclass.defaultfont());
+               
+               x += font_metrics::signedWidth(layout.leftmargin,
+                       tclass.defaultfont());
                x += minfill;
        }
        break;
        }
 
+       if ((workWidth(bview) > 0) &&
+               !row->par()->params().leftIndent().zero())
+       {
+               LyXLength const len = row->par()->params().leftIndent();
+               int const tw = inset_owner ?
+                       inset_owner->latexTextWidth(bview) : workWidth(bview);
+               x += len.inPixels(tw, bview->text->defaultHeight());
+       }
+
        LyXAlignment align; // wrong type
 
        if (row->par()->params().align() == LYX_ALIGN_LAYOUT)
@@ -858,7 +876,7 @@ int LyXText::leftMargin(BufferView * bview, Row const * row) const
                    && (row->par()->layout() != tclass.defaultLayoutName() ||
                        bview->buffer()->params.paragraph_separation ==
                        BufferParams::PARSEP_INDENT)) {
-                       x += lyxfont::signedWidth(parindent,
+                       x += font_metrics::signedWidth(parindent,
                                                  tclass.defaultfont());
                } else if (layout.labeltype == LABEL_BIBLIO) {
                        // ale970405 Right width for bibitems
@@ -882,7 +900,7 @@ int LyXText::rightMargin(Buffer const * buf, Row const * row) const
        LyXLayout const & layout = tclass[row->par()->layout()];
 
        int x = LYX_PAPER_MARGIN
-               + lyxfont::signedWidth(tclass.rightmargin(),
+               + font_metrics::signedWidth(tclass.rightmargin(),
                                       tclass.defaultfont());
 
        // this is the way, LyX handles the LaTeX-Environments.
@@ -916,7 +934,7 @@ int LyXText::rightMargin(Buffer const * buf, Row const * row) const
        }
 
        //lyxerr << "rightmargin: " << layout->rightmargin << endl;
-       x += lyxfont::signedWidth(layout.rightmargin, tclass.defaultfont())
+       x += font_metrics::signedWidth(layout.rightmargin, tclass.defaultfont())
                * 4 / (row->par()->getDepth() + 4);
        return x;
 }
@@ -929,12 +947,13 @@ int LyXText::labelEnd(BufferView * bview, Row const * row) const
                Row tmprow;
                tmprow = *row;
                tmprow.pos(row->par()->size());
-               return leftMargin(bview, &tmprow);  /* just the beginning
-                                               of the main body */
-       } else
-               return 0;  /* LabelEnd is only needed, if the
-                             layout fills a flushleft
-                             label. */
+               // just the beginning of the main body 
+               return leftMargin(bview, &tmprow);
+       } else {
+               // LabelEnd is only needed,
+               // if the layout fills a flushleft label. 
+               return 0; 
+       }
 }
 
 
@@ -961,7 +980,7 @@ LyXText::nextBreakPoint(BufferView * bview, Row const * row, int width) const
        pos_type i = pos;
 
        if (layout.margintype == MARGIN_RIGHT_ADDRESS_BOX) {
-               /* special code for right address boxes, only newlines count */
+               // special code for right address boxes, only newlines count
                while (i < par->size()) {
                        if (par->isNewline(i)) {
                                last_separator = i;
@@ -975,8 +994,7 @@ LyXText::nextBreakPoint(BufferView * bview, Row const * row, int width) const
                }
        } else {
                // Last position is an invariant
-               pos_type const last =
-                       par->size();
+               pos_type const last = par->size();
                // this is the usual handling
                int x = leftMargin(bview, row);
                bool doitonetime = true;
@@ -1033,7 +1051,7 @@ LyXText::nextBreakPoint(BufferView * bview, Row const * row, int width) const
                        }
                        ++i;
                        if (i == main_body) {
-                               x += lyxfont::width(layout.labelsep,
+                               x += font_metrics::width(layout.labelsep,
                                                    getLabelFont(bview->buffer(), par));
                                if (par->isLineSeparator(i - 1))
                                        x-= singleWidth(bview, par, i - 1);
@@ -1093,7 +1111,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, getLabelFont(bview->buffer(), row->par()));
+                       w += font_metrics::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);
@@ -1104,7 +1122,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, getLabelFont(bview->buffer(), row->par()));
+               w += font_metrics::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);
@@ -1131,8 +1149,8 @@ int LyXText::labelFill(BufferView * bview, Row const * row) const
        // environment with a manual label. (Asger)
        if (last < 0) last = 0;
 
-       if (row->par()->isLineSeparator(last)) /* a sepearator at this end
-                                               does not count */
+       // a separator at this end does not count
+       if (row->par()->isLineSeparator(last))
                --last;
 
        int w = 0;
@@ -1144,7 +1162,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(),
+               fill = max(font_metrics::width(row->par()->params().labelWidthString(),
                                          getLabelFont(bview->buffer(), row->par())) - w,
                           0);
        }
@@ -1159,7 +1177,7 @@ int LyXText::numberOfSeparators(Buffer const * buf, Row const * row) const
 {
        pos_type last = rowLastPrintable(row);
        pos_type p = max(row->pos(), beginningOfMainBody(buf, row->par()));
-               
+
        int n = 0;
        for (; p <= last; ++p) {
                if (row->par()->isSeparator(p)) {
@@ -1178,8 +1196,8 @@ int LyXText::numberOfHfills(Buffer const * buf, Row const * row) const
        pos_type const last = rowLast(row);
        pos_type first = row->pos();
 
-       if (first) { /* hfill *DO* count at the beginning
-                     * of paragraphs! */
+       if (first) {
+               // hfill *DO* count at the beginning of paragraphs!
                while (first <= last && row->par()->isHfill(first)) {
                        ++first;
                }
@@ -1203,8 +1221,8 @@ int LyXText::numberOfLabelHfills(Buffer const * buf, Row const * row) const
 {
        pos_type last = rowLast(row);
        pos_type first = row->pos();
-       if (first) { /* hfill *DO* count at the beginning
-                     * of paragraphs! */
+       if (first) {
+               // hfill *DO* count at the beginning of paragraphs!
                while (first < last && row->par()->isHfill(first))
                        ++first;
        }
@@ -1275,7 +1293,7 @@ LColor::color LyXText::backgroundColor()
 
 void LyXText::setHeightOfRow(BufferView * bview, Row * row_ptr) const
 {
-       /* get the maximum ascent and the maximum descent */
+       // get the maximum ascent and the maximum descent
        int asc = 0;
        int desc = 0;
        float layoutasc = 0;
@@ -1284,17 +1302,18 @@ void LyXText::setHeightOfRow(BufferView * bview, Row * row_ptr) const
        LyXFont tmpfont;
        Inset * tmpinset = 0;
 
-       /* 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 */
+       // 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 :) */
+       // 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[bview->buffer()->params.textclass][firstpar->layout()];
+       LyXLayout const & layout
+               = textclasslist[bview->buffer()->params.textclass][firstpar->layout()];
 
        // 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
@@ -1315,12 +1334,13 @@ void LyXText::setHeightOfRow(BufferView * bview, Row * row_ptr) const
        }
        //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 maxasc = int(font_metrics::maxAscent(font) *
+                        layout.spacing.getValue() *
+                        spacing_val);
+       int maxdesc = int(font_metrics::maxDescent(font) *
+                         layout.spacing.getValue() *
+                         spacing_val);
+
        pos_type const pos_end = rowLast(row_ptr);
        int labeladdon = 0;
        int maxwidth = 0;
@@ -1353,8 +1373,8 @@ void LyXText::setHeightOfRow(BufferView * bview, Row * row_ptr) const
        if (maxsize > font.size()) {
                font.setSize(maxsize);
 
-               asc = lyxfont::maxAscent(font);
-               desc = lyxfont::maxDescent(font);
+               asc = font_metrics::maxAscent(font);
+               desc = font_metrics::maxDescent(font);
                if (asc > maxasc)
                        maxasc = asc;
                if (desc > maxdesc)
@@ -1398,9 +1418,9 @@ void LyXText::setHeightOfRow(BufferView * bview, Row * row_ptr) const
                // 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));
 
+                       maxasc += 2 * font_metrics::ascent('x', getFont(bview->buffer(),
+                                       firstpar, 0));
                // and now the pagebreaks
                if (firstpar->params().pagebreakTop())
                        maxasc += 3 * defaultHeight();
@@ -1417,10 +1437,10 @@ void LyXText::setHeightOfRow(BufferView * bview, Row * row_ptr) const
                                spacing_val = bview->buffer()->params.spacing.getValue();
                        }
 
-                       labeladdon = int(lyxfont::maxDescent(labelfont) *
-                                        layout.spacing.getValue() *
-                                        spacing_val)
-                               + int(lyxfont::maxAscent(labelfont) *
+                       labeladdon = int(font_metrics::maxDescent(labelfont) *
+                                        layout.spacing.getValue() *
+                                        spacing_val)
+                               + int(font_metrics::maxAscent(labelfont) *
                                      layout.spacing.getValue() *
                                      spacing_val);
                }
@@ -1440,10 +1460,10 @@ void LyXText::setHeightOfRow(BufferView * bview, Row * row_ptr) const
                        }
 
                        labeladdon = int(
-                               (lyxfont::maxAscent(labelfont) *
+                               (font_metrics::maxAscent(labelfont) *
                                 layout.spacing.getValue() *
                                 spacing_val)
-                               +(lyxfont::maxDescent(labelfont) *
+                               +(font_metrics::maxDescent(labelfont) *
                                  layout.spacing.getValue() *
                                  spacing_val)
                                + layout.topsep * defaultHeight()
@@ -1508,8 +1528,8 @@ void LyXText::setHeightOfRow(BufferView * bview, Row * row_ptr) const
                // 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(),
+                       maxdesc += 2 * font_metrics::ascent('x',
+                                                      getFont(bview->buffer(),
                                                               par,
                                                               max(pos_type(0), par->size() - 1)));
 
@@ -1581,8 +1601,8 @@ void LyXText::setHeightOfRow(BufferView * bview, Row * row_ptr) const
 }
 
 
-/* Appends the implicit specified paragraph behind the specified row,
- * start at the implicit given position */
+// Appends the implicit specified paragraph behind the specified row,
+// start at the implicit given position 
 void LyXText::appendParagraph(BufferView * bview, Row * row) const
 {
        bool not_ready = true;
@@ -1642,8 +1662,8 @@ void LyXText::breakAgain(BufferView * bview, Row * row) const
                                }
                        }
                } else {
-                       /* if there are some rows too much, delete them */
-                       /* only if you broke the whole paragraph! */
+                       // if there are some rows too much, delete them
+                       // only if you broke the whole paragraph!
                        Row * tmprow2 = row;
                        while (tmprow2->next() && tmprow2->next()->par() == row->par()) {
                                tmprow2 = tmprow2->next();
@@ -1655,7 +1675,7 @@ void LyXText::breakAgain(BufferView * bview, Row * row) const
                        not_ready = false;
                }
 
-               /* set the dimensions of the row */
+               // set the dimensions of the row 
                tmprow->fill(fill(bview, tmprow, workWidth(bview)));
                setHeightOfRow(bview, tmprow);
        } while (not_ready);
@@ -1672,7 +1692,7 @@ void LyXText::breakAgainOneRow(BufferView * bview, Row * row)
        if (z < row->par()->size()) {
                if (!row->next()
                    || (row->next() && row->next()->par() != row->par())) {
-                       /* insert a new row */
+                       // insert a new row 
                        ++z;
                        insertRow(row, row->par(), z);
                        row = row->next();
@@ -1707,91 +1727,98 @@ void LyXText::breakParagraph(BufferView * bview, char keep_layout)
 {
        LyXTextClass const & tclass =
                textclasslist[bview->buffer()->params.textclass];
-   LyXLayout const & layout = tclass[cursor.par()->layout()];
+       LyXLayout const & layout = tclass[cursor.par()->layout()];
 
-   // this is only allowed, if the current paragraph is not empty or caption
-   // and if it has not the keepempty flag aktive
-   if ((cursor.par()->size() <= 0)
-       && layout.labeltype != LABEL_SENSITIVE
+       // this is only allowed, if the current paragraph is not empty or caption
+       // and if it has not the keepempty flag aktive
+       if ((cursor.par()->size() <= 0)
+          && layout.labeltype != LABEL_SENSITIVE
           && !layout.keepempty)
-          return;
+               return;
 
-   setUndo(bview, Undo::FINISH, cursor.par(), cursor.par()->next());
+       setUndo(bview, Undo::FINISH, cursor.par(), cursor.par()->next());
 
-   // Always break behind a space
-   //
-   // It is better to erase the space (Dekel)
-   if (cursor.pos() < cursor.par()->size()
-       && cursor.par()->isLineSeparator(cursor.pos()))
+       // Always break behind a space
+       //
+       // It is better to erase the space (Dekel)
+       if (cursor.pos() < cursor.par()->size()
+            && cursor.par()->isLineSeparator(cursor.pos()))
           cursor.par()->erase(cursor.pos());
-          // cursor.pos(cursor.pos() + 1);
-
-   // break the paragraph
-   if (keep_layout)
-     keep_layout = 2;
-   else
-     keep_layout = layout.isEnvironment();
-   cursor.par()->breakParagraph(bview->buffer()->params, cursor.pos(),
+       // cursor.pos(cursor.pos() + 1);
+
+       // break the paragraph
+       if (keep_layout)
+               keep_layout = 2;
+       else
+               keep_layout = layout.isEnvironment();
+
+       // we need to set this before we insert the paragraph. IMO the
+       // breakParagraph call should return a bool if it inserts the
+       // paragraph before or behind and we should react on that one
+       // but we can fix this in 1.3.0 (Jug 20020509)
+       bool const isempty = (layout.keepempty && !cursor.par()->size());
+       cursor.par()->breakParagraph(bview->buffer()->params, cursor.pos(),
                                keep_layout);
 
-   // well this is the caption hack since one caption is really enough
-   if (layout.labeltype == LABEL_SENSITIVE) {
-     if (!cursor.pos())
-            // set to standard-layout
-            cursor.par()->applyLayout(tclass.defaultLayoutName());
-     else
-            // set to standard-layout
-            cursor.par()->next()->applyLayout(tclass.defaultLayoutName());
-   }
-
-   /* if the cursor is at the beginning of a row without prior newline,
-    * move one row up!
-    * This touches only the screen-update. Otherwise we would may have
-    * an empty row on the screen */
-   if (cursor.pos() && !cursor.row()->par()->isNewline(cursor.row()->pos() - 1)
-       && cursor.row()->pos() == cursor.pos())
-   {
-          cursorLeft(bview);
-   }
-
-   status(bview, LyXText::NEED_MORE_REFRESH);
-   refresh_row = cursor.row();
-   refresh_y = cursor.y() - cursor.row()->baseline();
-
-   // Do not forget the special right address boxes
-   if (layout.margintype == MARGIN_RIGHT_ADDRESS_BOX) {
-      while (refresh_row->previous() &&
-            refresh_row->previous()->par() == refresh_row->par()) {
-             refresh_row = refresh_row->previous();
-             refresh_y -= refresh_row->height();
-      }
-   }
-   removeParagraph(cursor.row());
-
-   // set the dimensions of the cursor row
-   cursor.row()->fill(fill(bview, cursor.row(), workWidth(bview)));
-
-   setHeightOfRow(bview, cursor.row());
-
-   while (cursor.par()->next()->size()
+       // well this is the caption hack since one caption is really enough
+       if (layout.labeltype == LABEL_SENSITIVE) {
+               if (!cursor.pos())
+                       // set to standard-layout
+                       cursor.par()->applyLayout(tclass.defaultLayoutName());
+               else
+                       // set to standard-layout
+                       cursor.par()->next()->applyLayout(tclass.defaultLayoutName());
+       }
+
+       // if the cursor is at the beginning of a row without prior newline,
+       // move one row up!
+       // This touches only the screen-update. Otherwise we would may have
+       // an empty row on the screen 
+       if (cursor.pos() && !cursor.row()->par()->isNewline(cursor.row()->pos() - 1)
+                        && cursor.row()->pos() == cursor.pos())
+       {
+               cursorLeft(bview);
+       }
+
+       status(bview, LyXText::NEED_MORE_REFRESH);
+       refresh_row = cursor.row();
+       refresh_y = cursor.y() - cursor.row()->baseline();
+
+       // Do not forget the special right address boxes
+       if (layout.margintype == MARGIN_RIGHT_ADDRESS_BOX) {
+               while (refresh_row->previous() &&
+                      refresh_row->previous()->par() == refresh_row->par())
+               {
+                       refresh_row = refresh_row->previous();
+                       refresh_y -= refresh_row->height();
+               }
+       }
+       removeParagraph(cursor.row());
+
+       // set the dimensions of the cursor row
+       cursor.row()->fill(fill(bview, cursor.row(), workWidth(bview)));
+
+       setHeightOfRow(bview, cursor.row());
+
+       while (cursor.par()->next()->size()
          && cursor.par()->next()->isNewline(0))
           cursor.par()->next()->erase(0);
 
-   insertParagraph(bview, cursor.par()->next(), cursor.row());
+       insertParagraph(bview, cursor.par()->next(), cursor.row());
 
-   updateCounters(bview, cursor.row()->previous());
+       updateCounters(bview, cursor.row()->previous());
 
-   /* This check is necessary. Otherwise the new empty paragraph will
-    * be deleted automatically. And it is more friendly for the user! */
-   if (cursor.pos() || layout.keepempty)
-          setCursor(bview, cursor.par()->next(), 0);
-   else
-          setCursor(bview, cursor.par(), 0);
+       // This check is necessary. Otherwise the new empty paragraph will
+       // be deleted automatically. And it is more friendly for the user!
+       if (cursor.pos() || isempty)
+               setCursor(bview, cursor.par()->next(), 0);
+       else
+               setCursor(bview, cursor.par(), 0);
 
-   if (cursor.row()->next())
-          breakAgain(bview, cursor.row()->next());
+       if (cursor.row()->next())
+               breakAgain(bview, cursor.row()->next());
 
-   need_break_row = 0;
+       need_break_row = 0;
 }
 
 
@@ -1804,8 +1831,8 @@ void LyXText::redoParagraph(BufferView * bview) const
 }
 
 
-/* insert a character, moves all the following breaks in the
- * same Paragraph one to the right and make a rebreak */
+// insert a character, moves all the following breaks in the
+// same Paragraph one to the right and make a rebreak 
 void LyXText::insertChar(BufferView * bview, char c)
 {
        setUndo(bview, Undo::INSERT, cursor.par(), cursor.par()->next());
@@ -1865,11 +1892,11 @@ void LyXText::insertChar(BufferView * bview, char c)
        }
 
 
-       /* First check, if there will be two blanks together or a blank at
-         the beginning of a paragraph.
-         I decided to handle blanks like normal characters, the main
-         difference are the special checks when calculating the row.fill
-         (blank does not count at the end of a row) and the check here */
+       // First check, if there will be two blanks together or a blank at
+       // the beginning of a paragraph.
+       // I decided to handle blanks like normal characters, the main
+       // difference are the special checks when calculating the row.fill
+       // (blank does not count at the end of a row) and the check here
 
        // The bug is triggered when we type in a description environment:
        // The current_font is not changed when we go from label to main text
@@ -1877,11 +1904,9 @@ void LyXText::insertChar(BufferView * bview, char c)
        // CHECK There is a bug here! (Asger)
 
        LyXFont realtmpfont = real_current_font;
-       LyXFont rawtmpfont = current_font;  /* store the current font.
-                                    * This is because of the use
-                                    * of cursor movements. The moving
-                                    * cursor would refresh the
-                                    * current font */
+       LyXFont rawtmpfont = current_font; 
+       // store the current font.  This is because of the use of cursor
+       // movements. The moving cursor would refresh the current font 
 
        // Get the font that is used to calculate the baselineskip
        pos_type const lastpos = cursor.par()->size();
@@ -1915,9 +1940,8 @@ void LyXText::insertChar(BufferView * bview, char c)
                        charInserted();
                        return;
                }
-               /* No newline at first position
-                * of a paragraph or behind labels.
-                * TeX does not allow that */
+               // No newline at first position of a paragraph or behind labels.
+               // TeX does not allow that
 
                if (cursor.pos() < cursor.par()->size() &&
                    cursor.par()->isLineSeparator(cursor.pos()))
@@ -1938,9 +1962,10 @@ void LyXText::insertChar(BufferView * bview, char c)
        // get the cursor row fist
        Row * row = cursor.row();
        int y = cursor.y() - row->baseline();
-       if (c != Paragraph::META_INSET) /* Here case LyXText::InsertInset
-                                        * already insertet the character */
+       if (c != Paragraph::META_INSET) {
+               // Here case LyXText::InsertInset  already insertet the character
                cursor.par()->insertChar(cursor.pos(), c);
+       }
        setCharFont(bview->buffer(), cursor.par(), cursor.pos(), rawtmpfont);
 
        if (!jumped_over_space) {
@@ -1955,10 +1980,10 @@ void LyXText::insertChar(BufferView * bview, char c)
        // Is there a break one row above
        if (row->previous() && row->previous()->par() == row->par()
            && (cursor.par()->isLineSeparator(cursor.pos())
-               || cursor.par()->isNewline(cursor.pos())
-               || ((cursor.pos() < cursor.par()->size()) &&
-                   cursor.par()->isInset(cursor.pos()+1))
-               || cursor.row()->fill() == -1))
+               || cursor.par()->isNewline(cursor.pos())
+               || ((cursor.pos() < cursor.par()->size()) &&
+                   cursor.par()->isInset(cursor.pos()+1))
+               || cursor.row()->fill() == -1))
        {
                pos_type z = nextBreakPoint(bview,
                                                           row->previous(),
@@ -2002,10 +2027,11 @@ void LyXText::insertChar(BufferView * bview, char c)
        }
 
        // recalculate the fill of the row
-       if (row->fill() >= 0)  /* needed because a newline
-                               * will set fill to -1. Otherwise
-                               * we would not get a rebreak! */
+       if (row->fill() >= 0) {
+               // needed because a newline will set fill to -1. Otherwise
+               // we would not get a rebreak!
                row->fill(fill(bview, row, workWidth(bview)));
+       }
        if (c == Paragraph::META_INSET || row->fill() < 0) {
                refresh_y = y;
                refresh_row = row;
@@ -2189,7 +2215,7 @@ void LyXText::prepareToPrint(BufferView * bview,
                if (main_body > 0 &&
                    (main_body - 1 > last ||
                     !row->par()->isLineSeparator(main_body - 1))) {
-                       x += lyxfont::width(layout.labelsep,
+                       x += font_metrics::width(layout.labelsep,
                                            getLabelFont(bview->buffer(), row->par()));
                        if (main_body - 1 <= last)
                                x += fill_label_hfill;
@@ -2197,12 +2223,13 @@ void LyXText::prepareToPrint(BufferView * bview,
        }
 }
 
-/* important for the screen */
+
+// important for the screen 
 
 
-/* the cursor set functions have a special mechanism. When they
-* realize, that you left an empty paragraph, they will delete it.
-* They also delete the corresponding row */
+// the cursor set functions have a special mechanism. When they
+// realize, that you left an empty paragraph, they will delete it.
+// They also delete the corresponding row 
 
 void LyXText::cursorRightOneWord(BufferView * bview) const
 {
@@ -2238,25 +2265,24 @@ void LyXText::cursorRightOneWord(BufferView * bview) const
 
 void LyXText::cursorTab(BufferView * bview) const
 {
-    LyXCursor tmpcursor = cursor;
-    while (tmpcursor.pos() < tmpcursor.par()->size()
+       LyXCursor tmpcursor = cursor;
+       while (tmpcursor.pos() < tmpcursor.par()->size()
           && !tmpcursor.par()->isNewline(tmpcursor.pos()))
        tmpcursor.pos(tmpcursor.pos() + 1);
 
-    if (tmpcursor.pos() == tmpcursor.par()->size()) {
-       if (tmpcursor.par()->next()) {
-           tmpcursor.par(tmpcursor.par()->next());
-           tmpcursor.pos(0);
-       }
-    } else
-       tmpcursor.pos(tmpcursor.pos() + 1);
-    setCursor(bview, tmpcursor.par(), tmpcursor.pos());
+       if (tmpcursor.pos() == tmpcursor.par()->size()) {
+               if (tmpcursor.par()->next()) {
+                       tmpcursor.par(tmpcursor.par()->next());
+                       tmpcursor.pos(0);
+               }
+       } else
+               tmpcursor.pos(tmpcursor.pos() + 1);
+       setCursor(bview, tmpcursor.par(), tmpcursor.pos());
 }
 
 
-/* -------> Skip initial whitespace at end of word and move cursor to *start*
-           of prior word, not to end of next prior word. */
-
+// Skip initial whitespace at end of word and move cursor to *start*
+// of prior word, not to end of next prior word. 
 void LyXText::cursorLeftOneWord(BufferView * bview)  const
 {
        LyXCursor tmpcursor = cursor;
@@ -2264,6 +2290,7 @@ void LyXText::cursorLeftOneWord(BufferView * bview)  const
        setCursor(bview, tmpcursor.par(), tmpcursor.pos());
 }
 
+
 void LyXText::cursorLeftOneWord(LyXCursor  & cur)  const
 {
        // treat HFills, floats and Insets as words
@@ -2291,8 +2318,9 @@ void LyXText::cursorLeftOneWord(LyXCursor  & cur)  const
        }
 }
 
-/* -------> Select current word. This depends on behaviour of
-CursorLeftOneWord(), so it is patched as well. */
+
+// Select current word. This depends on behaviour of
+// CursorLeftOneWord(), so it is patched as well. 
 void LyXText::getWord(LyXCursor & from, LyXCursor & to,
                      word_location const loc) const
 {
@@ -2352,8 +2380,8 @@ void LyXText::selectWord(BufferView * bview, word_location const loc)
 }
 
 
-/* -------> Select the word currently under the cursor when no
-       selection is currently set */
+// Select the word currently under the cursor when no
+// selection is currently set 
 bool LyXText::selectWordWhenUnderCursor(BufferView * bview,
                                        word_location const loc)
 {
@@ -2475,7 +2503,7 @@ void LyXText::selectSelectedWord(BufferView * bview)
 }
 
 
-/* -------> Delete from cursor up to the end of the current or next word. */
+// Delete from cursor up to the end of the current or next word.
 void LyXText::deleteWordForward(BufferView * bview)
 {
        if (!cursor.par()->size())
@@ -2490,32 +2518,32 @@ void LyXText::deleteWordForward(BufferView * bview)
                cursor = tmpcursor;
                setSelection(bview);
 
-               /* -----> Great, CutSelection() gets rid of multiple spaces. */
+               // Great, CutSelection() gets rid of multiple spaces.
                cutSelection(bview, true, false);
        }
 }
 
 
-/* -------> Delete from cursor to start of current or prior word. */
+// Delete from cursor to start of current or prior word.
 void LyXText::deleteWordBackward(BufferView * bview)
 {
-       if (!cursor.par()->size())
-              cursorLeft(bview);
-       else {
-              LyXCursor tmpcursor = cursor;
-              tmpcursor.row(0); // ??
-              selection.set(true); // to avoid deletion
-              cursorLeftOneWord(bview);
-              setCursor(bview, tmpcursor, tmpcursor.par(), tmpcursor.pos());
-              selection.cursor = cursor;
-              cursor = tmpcursor;
-              setSelection(bview);
-              cutSelection(bview, true, false);
-       }
+       if (!cursor.par()->size())
+               cursorLeft(bview);
+       else {
+               LyXCursor tmpcursor = cursor;
+               tmpcursor.row(0); // ??
+               selection.set(true); // to avoid deletion
+               cursorLeftOneWord(bview);
+               setCursor(bview, tmpcursor, tmpcursor.par(), tmpcursor.pos());
+               selection.cursor = cursor;
+               cursor = tmpcursor;
+               setSelection(bview);
+               cutSelection(bview, true, false);
+       }
 }
 
 
-/* -------> Kill to end of line. */
+// Kill to end of line. 
 void LyXText::deleteLineForward(BufferView * bview)
 {
        if (!cursor.par()->size())
@@ -2745,16 +2773,15 @@ void LyXText::backspace(BufferView * bview)
                                        false);
                }
 
-               /* Pasting is not allowed, if the paragraphs have different
-                  layout. I think it is a real bug of all other
-                  word processors to allow it. It confuses the user.
-                  Even so with a footnote paragraph and a non-footnote
-                  paragraph. I will not allow pasting in this case,
-                  because the user would be confused if the footnote behaves
-                  different wether it is open or closed.
+               // Pasting is not allowed, if the paragraphs have different
+               // layout. I think it is a real bug of all other
+               // word processors to allow it. It confuses the user.
+               // Even so with a footnote paragraph and a non-footnote
+               // paragraph. I will not allow pasting in this case,
+               // because the user would be confused if the footnote behaves
+               // different wether it is open or closed.
 
-                  Correction: Pasting is always allowed with standard-layout
-               */
+               //      Correction: Pasting is always allowed with standard-layout
                LyXTextClass const & tclass = textclasslist[bview->buffer()->params.textclass];
 
                if (cursor.par() != tmppar
@@ -2794,8 +2821,8 @@ void LyXText::backspace(BufferView * bview)
                        setCursor(bview, cursor.par(), cursor.pos(), false);
                }
        } else {
-               /* this is the code for a normal backspace, not pasting
-                * any paragraphs */
+               // this is the code for a normal backspace, not pasting
+               // any paragraphs 
                setUndo(bview, Undo::DELETE,
                        cursor.par(), cursor.par()->next());
                // We used to do cursorLeftIntern() here, but it is
@@ -2822,8 +2849,8 @@ void LyXText::backspace(BufferView * bview)
                Row * row = cursor.row();
                int y = cursor.y() - row->baseline();
                pos_type z;
-               /* remember that a space at the end of a row doesnt count
-                * when calculating the fill */
+               // remember that a space at the end of a row doesnt count
+               // when calculating the fill 
                if (cursor.pos() < rowLast(row) ||
                    !cursor.par()->isLineSeparator(cursor.pos())) {
                        row->fill(row->fill() + singleWidth(bview,
@@ -2831,8 +2858,8 @@ void LyXText::backspace(BufferView * bview)
                                                            cursor.pos()));
                }
 
-               /* some special code when deleting a newline. This is similar
-                * to the behavior when pasting paragraphs */
+               // some special code when deleting a newline. This is similar
+               // to the behavior when pasting paragraphs 
                if (cursor.pos() && cursor.par()->isNewline(cursor.pos())) {
                        cursor.par()->erase(cursor.pos());
                        // refresh the positions
@@ -2932,10 +2959,10 @@ void LyXText::backspace(BufferView * bview)
                    (rowLast(row) == row->par()->size() - 1 ||
                     nextBreakPoint(bview, row, workWidth(bview)) != rowLast(row))) {
 
-                       /* it can happen that a paragraph loses one row
-                        * without a real breakup. This is when a word
-                        * is to long to be broken. Well, I don t care this
-                        * hack ;-) */
+                       // it can happen that a paragraph loses one row
+                       // without a real breakup. This is when a word
+                       // is to long to be broken. Well, I don t care this
+                       // hack ;-) 
                        if (rowLast(row) == row->par()->size() - 1)
                                removeRow(row->next());
 
@@ -3007,7 +3034,7 @@ bool LyXText::paintRowBackground(DrawRowParams & p)
 
        pos_type const last = rowLastPrintable(p.row);
 
-       if (!p.bv->screen()->forceClear() && last == p.row->pos()
+       if (!p.bv->screen().forceClear() && last == p.row->pos()
                && p.row->par()->isInset(p.row->pos())) {
                inset = p.row->par()->getInset(p.row->pos());
                if (inset) {
@@ -3131,8 +3158,7 @@ void LyXText::paintRowSelection(DrawRowParams & p)
                                [par->layout()];
                        LyXFont const lfont = getLabelFont(buffer, par);
 
-
-                       tmpx += p.label_hfill + lyxfont::width(layout.labelsep, lfont);
+                       tmpx += p.label_hfill + font_metrics::width(layout.labelsep, lfont);
 
                        if (par->isLineSeparator(main_body - 1))
                                tmpx -= singleWidth(p.bv, par, main_body - 1);
@@ -3228,8 +3254,8 @@ int LyXText::getLengthMarkerHeight(BufferView * bv, VSpace const & vsp) const
        LyXFont font;
        font.decSize();
        int const min_size = max(3 * arrow_size,
-                                     lyxfont::maxAscent(font)
-                                     + lyxfont::maxDescent(font));
+                                     font_metrics::maxAscent(font)
+                                     + font_metrics::maxDescent(font));
 
        if (vsp.length().len().value() < 0.0)
                return min_size;
@@ -3284,7 +3310,7 @@ int LyXText::drawLengthMarker(DrawRowParams & p, string const & prefix,
 
        LyXFont font;
        font.setColor(LColor::added_space).decSize();
-       lyxfont::rectText(str, font, w, a, d);
+       font_metrics::rectText(str, font, w, a, d);
 
        p.pain->rectText(leftx + 2 * arrow_size + 5,
                         start + ((end - start) / 2) + d,
@@ -3335,7 +3361,7 @@ void LyXText::paintFirstRow(DrawRowParams & p)
 
                LyXFont pb_font;
                pb_font.setColor(LColor::pagebreak).decSize();
-               lyxfont::rectText(_("Page Break (top)"), pb_font, w, a, d);
+               font_metrics::rectText(_("Page Break (top)"), pb_font, w, a, d);
                p.pain->rectText((p.width - w)/2, y + d,
                              _("Page Break (top)"), pb_font,
                              backgroundColor(),
@@ -3376,7 +3402,7 @@ void LyXText::paintFirstRow(DrawRowParams & p)
        // draw a top line
        if (parparams.lineTop()) {
                LyXFont font(LyXFont::ALL_SANE);
-               int const asc = lyxfont::ascent('x', getFont(buffer, par, 0));
+               int const asc = font_metrics::ascent('x', getFont(buffer, par, 0));
 
                y_top += asc;
 
@@ -3415,12 +3441,12 @@ void LyXText::paintFirstRow(DrawRowParams & p)
                                        }
 
                                        int const maxdesc =
-                                               int(lyxfont::maxDescent(font) * layout.spacing.getValue() * spacing_val)
+                                               int(font_metrics::maxDescent(font) * layout.spacing.getValue() * spacing_val)
                                                + int(layout.parsep) * defaultHeight();
 
                                        if (is_rtl) {
                                                x = ww - leftMargin(p.bv, p.row) -
-                                                       lyxfont::width(str, font);
+                                                       font_metrics::width(str, font);
                                        }
 
                                        p.pain->text(int(x),
@@ -3431,10 +3457,10 @@ void LyXText::paintFirstRow(DrawRowParams & p)
                        } else {
                                if (is_rtl) {
                                        x = ww - leftMargin(p.bv, p.row)
-                                               + lyxfont::width(layout.labelsep, font);
+                                               + font_metrics::width(layout.labelsep, font);
                                } else {
-                                       x = p.x - lyxfont::width(layout.labelsep, font)
-                                               - lyxfont::width(str, font);
+                                       x = p.x - font_metrics::width(layout.labelsep, font)
+                                               - font_metrics::width(str, font);
                                }
 
                                p.pain->text(int(x), p.yo + p.row->baseline(), str, font);
@@ -3457,17 +3483,17 @@ void LyXText::paintFirstRow(DrawRowParams & p)
                        }
 
                        int maxdesc =
-                               int(lyxfont::maxDescent(font) * layout.spacing.getValue() * spacing_val
+                               int(font_metrics::maxDescent(font) * layout.spacing.getValue() * spacing_val
                                + (layout.labelbottomsep * defaultHeight()));
 
                        float x = p.x;
                        if (layout.labeltype == LABEL_CENTERED_TOP_ENVIRONMENT) {
                                x = ((is_rtl ? leftMargin(p.bv, p.row) : p.x)
                                         + ww - rightMargin(buffer, p.row)) / 2;
-                               x -= lyxfont::width(str, font) / 2;
+                               x -= font_metrics::width(str, font) / 2;
                        } else if (is_rtl) {
                                x = ww - leftMargin(p.bv, p.row) -
-                                       lyxfont::width(str, font);
+                                       font_metrics::width(str, font);
                        }
                        p.pain->text(int(x), p.yo + p.row->baseline()
                                  - p.row->ascent_of_text() - maxdesc,
@@ -3480,9 +3506,9 @@ void LyXText::paintFirstRow(DrawRowParams & p)
                float x;
                if (is_rtl) {
                        x = ww - leftMargin(p.bv, p.row)
-                               + lyxfont::width(layout.labelsep, font);
+                               + font_metrics::width(layout.labelsep, font);
                } else {
-                       x = p.x - lyxfont::width(layout.labelsep, font)
+                       x = p.x - font_metrics::width(layout.labelsep, font)
                                - par->bibkey->width(p.bv, font);
                }
                par->bibkey->draw(p.bv, font, p.yo + p.row->baseline(), x, p.cleared);
@@ -3514,7 +3540,7 @@ void LyXText::paintLastRow(DrawRowParams & p)
                int w = 0;
                int a = 0;
                int d = 0;
-               lyxfont::rectText(_("Page Break (bottom)"), pb_font, w, a, d);
+               font_metrics::rectText(_("Page Break (bottom)"), pb_font, w, a, d);
                p.pain->rectText((ww - w) / 2, y + d,
                        _("Page Break (bottom)"),
                        pb_font, backgroundColor(), backgroundColor());
@@ -3534,7 +3560,7 @@ void LyXText::paintLastRow(DrawRowParams & p)
        // draw a bottom line
        if (parparams.lineBottom()) {
                LyXFont font(LyXFont::ALL_SANE);
-               int const asc = lyxfont::ascent('x',
+               int const asc = font_metrics::ascent('x',
                        getFont(buffer, par,
                        max(pos_type(0), par->size() - 1)));
 
@@ -3558,7 +3584,7 @@ void LyXText::paintLastRow(DrawRowParams & p)
        case END_LABEL_FILLED_BOX:
        {
                LyXFont const font = getLabelFont(buffer, par);
-               int const size = int(0.75 * lyxfont::maxAscent(font));
+               int const size = int(0.75 * font_metrics::maxAscent(font));
                int const y = (p.yo + p.row->baseline()) - size;
                int x = is_rtl ? LYX_PAPER_MARGIN : ww - LYX_PAPER_MARGIN - size;
 
@@ -3580,7 +3606,7 @@ void LyXText::paintLastRow(DrawRowParams & p)
                string const str = textclasslist[buffer->params.textclass][layout].endlabelstring();
                font = getLabelFont(buffer, par);
                int const x = is_rtl ?
-                       int(p.x) - lyxfont::width(str, font)
+                       int(p.x) - font_metrics::width(str, font)
                        : ww - rightMargin(buffer, p.row) - p.row->fill();
                p.pain->text(x, p.yo + p.row->baseline(), str, font);
                break;
@@ -3618,7 +3644,7 @@ void LyXText::paintRowText(DrawRowParams & p)
                        continue;
                }
                if (main_body > 0 && pos == main_body - 1) {
-                       int const lwidth = lyxfont::width(layout.labelsep,
+                       int const lwidth = font_metrics::width(layout.labelsep,
                                getLabelFont(buffer, par));
 
                        p.x += p.label_hfill + lwidth
@@ -3662,7 +3688,8 @@ void LyXText::paintRowText(DrawRowParams & p)
                                p.x += p.separator;
                        ++vpos;
                } else {
-                       draw(p, vpos);
+                       if (!draw(p, vpos))
+                               break;
                }
        }
 }
@@ -3727,12 +3754,13 @@ void LyXText::getVisibleRow(BufferView * bv, int y_offset, int x_offset,
 int LyXText::defaultHeight() const
 {
        LyXFont font(LyXFont::ALL_SANE);
-       return int(lyxfont::maxAscent(font) + lyxfont::maxDescent(font) * 1.5);
+       return int(font_metrics::maxAscent(font)
+                + font_metrics::maxDescent(font) * 1.5);
 }
 
 
-/* returns the column near the specified x-coordinate of the row
-* x is set to the real beginning of this column  */
+// returns the column near the specified x-coordinate of the row
+// x is set to the real beginning of this column 
 pos_type
 LyXText::getColumnNearX(BufferView * bview, Row * row, int & x,
                        bool & boundary) const
@@ -3766,7 +3794,7 @@ LyXText::getColumnNearX(BufferView * bview, Row * row, int & x,
                last_tmpx = tmpx;
                if (main_body > 0 && c == main_body-1) {
                        tmpx += fill_label_hfill +
-                               lyxfont::width(layout.labelsep,
+                               font_metrics::width(layout.labelsep,
                                               getLabelFont(bview->buffer(), row->par()));
                        if (row->par()->isLineSeparator(main_body - 1))
                                tmpx -= singleWidth(bview, row->par(), main_body-1);