]> git.lyx.org Git - lyx.git/blobdiff - src/text.C
Point fix, earlier forgotten
[lyx.git] / src / text.C
index 139d56ebf3435d9334d3c531176b0d17e587adaf..b558bd680bd85cf59d01cf5ed6777ffc78bb4f77 100644 (file)
@@ -1,12 +1,18 @@
-/* This file is part of
- * ======================================================
+/**
+ * \file text.C
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
  *
- *           LyX, The Document Processor
+ * \author Asger Alstrup
+ * \author Lars Gullik Bjønnes
+ * \author Jean-Marc Lasgouttes
+ * \author John Levon
+ * \author André Pönitz
+ * \author Dekel Tsur
+ * \author Jürgen Vigna
  *
- *           Copyright 1995 Matthias Ettrich
- *           Copyright 1995-2001 The LyX Team.
- *
- * ====================================================== */
+ * Full author contact details are available in file CREDITS.
+ */
 
 #include <config.h>
 
@@ -63,6 +69,8 @@ extern int const CHANGEBAR_MARGIN = 10;
 /// left margin
 extern int const LEFT_MARGIN = PAPER_MARGIN + CHANGEBAR_MARGIN;
 
+
+
 int bibitemMaxWidth(BufferView *, LyXFont const &);
 
 
@@ -84,30 +92,17 @@ void LyXText::updateRowPositions()
 {
        ParagraphList::iterator pit = ownerParagraphs().begin();
        ParagraphList::iterator end = ownerParagraphs().end();
-       for (int y = 0; pit != end; ++pit) {
+       for (height = 0; pit != end; ++pit) {
                RowList::iterator rit = pit->rows.begin();
                RowList::iterator rend = pit->rows.end();
                for ( ; rit != rend ; rit = ++rit) {
-                       rit->y(y);
-                       y += rit->height();
+                       rit->y(height);
+                       height += rit->height();
                }
        }
 }
 
 
-int LyXText::top_y() const
-{
-       return anchor_y_;
-}
-
-
-void LyXText::top_y(int newy)
-{
-       anchor_y_ = newy;
-       lyxerr[Debug::GUI] << "changing reference to offset: " << anchor_y_ << endl;
-}
-
-
 int LyXText::workWidth() const
 {
        return inset_owner ? inset_owner->textWidth() : bv()->workWidth();
@@ -275,7 +270,7 @@ bool LyXText::bidi_InRange(lyx::pos_type pos) const
 
 
 void LyXText::computeBidiTables(ParagraphList::iterator pit,
-   Buffer const * buf, RowList::iterator row) const
+   Buffer const & buf, RowList::iterator row) const
 {
        bidi_same_direction = true;
        if (!lyxrc.rtl_support) {
@@ -313,7 +308,7 @@ void LyXText::computeBidiTables(ParagraphList::iterator pit,
 
        pos_type stack[2];
        bool const rtl_par =
-               pit->isRightToLeftPar(buf->params);
+               pit->isRightToLeftPar(buf.params);
        int level = 0;
        bool rtl = false;
        bool rtl0 = false;
@@ -326,12 +321,12 @@ void LyXText::computeBidiTables(ParagraphList::iterator pit,
                         !pit->isLineSeparator(lpos + 1) &&
                         !pit->isNewline(lpos + 1))
                        ? lpos + 1 : lpos;
-               LyXFont font = pit->getFontSettings(buf->params, pos);
+               LyXFont font = pit->getFontSettings(buf.params, pos);
                if (pos != lpos && 0 < lpos && rtl0 && font.isRightToLeft() &&
                    font.number() == LyXFont::ON &&
-                   pit->getFontSettings(buf->params, lpos - 1).number()
+                   pit->getFontSettings(buf.params, lpos - 1).number()
                    == LyXFont::ON) {
-                       font = pit->getFontSettings(buf->params, lpos);
+                       font = pit->getFontSettings(buf.params, lpos);
                        is_space = false;
                }
 
@@ -402,7 +397,7 @@ void LyXText::computeBidiTables(ParagraphList::iterator pit,
 
 
 // This method requires a previous call to ComputeBidiTables()
-bool LyXText::isBoundary(Buffer const * buf, Paragraph const & par,
+bool LyXText::isBoundary(Buffer const & buf, Paragraph const & par,
                         pos_type pos) const
 {
        if (!lyxrc.rtl_support || pos == 0)
@@ -417,12 +412,12 @@ bool LyXText::isBoundary(Buffer const * buf, Paragraph const & par,
        bool const rtl = bidi_level(pos - 1) % 2;
        bool const rtl2 = bidi_InRange(pos)
                ? bidi_level(pos) % 2
-               : par.isRightToLeftPar(buf->params);
+               : par.isRightToLeftPar(buf.params);
        return rtl != rtl2;
 }
 
 
-bool LyXText::isBoundary(Buffer const * buf, Paragraph const & par,
+bool LyXText::isBoundary(Buffer const & buf, Paragraph const & par,
                         pos_type pos, LyXFont const & font) const
 {
        if (!lyxrc.rtl_support)
@@ -431,21 +426,13 @@ bool LyXText::isBoundary(Buffer const * buf, Paragraph const & par,
        bool const rtl = font.isVisibleRightToLeft();
        bool const rtl2 = bidi_InRange(pos)
                ? bidi_level(pos) % 2
-               : par.isRightToLeftPar(buf->params);
+               : par.isRightToLeftPar(buf.params);
        return rtl != rtl2;
 }
 
 
 int LyXText::leftMargin(ParagraphList::iterator pit, Row const & row) const
-{      
-       InsetOld * ins;
-
-       if (row.pos() < pit->size())
-               if (pit->getChar(row.pos()) == Paragraph::META_INSET &&
-                   (ins = pit->getInset(row.pos())) &&
-                   (ins->needFullRow() || ins->display()))
-                       return LEFT_MARGIN;
-
+{
        LyXTextClass const & tclass =
                bv()->buffer()->params.getLyXTextClass();
        LyXLayout_ptr const & layout = pit->layout();
@@ -620,16 +607,8 @@ int LyXText::leftMargin(ParagraphList::iterator pit, Row const & row) const
 
 
 int LyXText::rightMargin(ParagraphList::iterator pit,
-       Buffer const & buf, Row const & row) const
+       Buffer const & buf, Row const &) const
 {
-       InsetOld * ins;
-
-       if (row.pos() < pit->size())
-               if ((pit->getChar(row.pos()) == Paragraph::META_INSET) &&
-                   (ins = pit->getInset(row.pos())) &&
-                   (ins->needFullRow() || ins->display()))
-                       return PAPER_MARGIN;
-
        LyXTextClass const & tclass = buf.params.getLyXTextClass();
        LyXLayout_ptr const & layout = pit->layout();
 
@@ -677,7 +656,8 @@ pos_type LyXText::rowBreakPoint(ParagraphList::iterator pit,
        Row const & row) const
 {
        // maximum pixel width of a row.
-       int width = workWidth() - rightMargin(pit, *bv()->buffer(), row);
+       int width = workWidth()
+               - rightMargin(pit, *bv()->buffer(), row);
 
        // inset->textWidth() returns -1 via workWidth(),
        // but why ?
@@ -706,7 +686,6 @@ pos_type LyXText::rowBreakPoint(ParagraphList::iterator pit,
 
        // pixel width since last breakpoint
        int chunkwidth = 0;
-       bool fullrow = false;
 
        pos_type i = pos;
 
@@ -745,14 +724,12 @@ pos_type LyXText::rowBreakPoint(ParagraphList::iterator pit,
                chunkwidth += thiswidth;
 
                InsetOld * in = pit->isInset(i) ? pit->getInset(i) : 0;
-               fullrow = in && (in->display() || in->needFullRow());
 
                // break before a character that will fall off
                // the right of the row
                if (x >= width) {
-                       // if no break before or we are at an inset
-                       // that will take up a row, break here
-                       if (point == last || fullrow || chunkwidth >= (width - left)) {
+                       // if no break before, break here
+                       if (point == last || chunkwidth >= (width - left)) {
                                if (pos < i)
                                        point = i - 1;
                                else
@@ -770,24 +747,7 @@ pos_type LyXText::rowBreakPoint(ParagraphList::iterator pit,
                        continue;
                }
 
-               if (!fullrow)
-                       continue;
-
-               // full row insets start at a new row
-               if (i == pos) {
-                       if (pos < last - 1) {
-                               point = i;
-                               if (pit->isLineSeparator(i + 1))
-                                       ++point;
-                       } else {
-                               // to avoid extra rows
-                               point = last;
-                       }
-               } else {
-                       point = i - 1;
-               }
-
-               return point;
+               continue;
        }
 
        if (point == last && x >= width) {
@@ -802,7 +762,7 @@ pos_type LyXText::rowBreakPoint(ParagraphList::iterator pit,
        // manual labels cannot be broken in LaTeX. But we
        // want to make our on-screen rendering of footnotes
        // etc. still break
-       if (!fullrow && body_pos && point < body_pos)
+       if (body_pos && point < body_pos)
                point = body_pos - 1;
 
        return point;
@@ -853,7 +813,7 @@ int LyXText::fill(ParagraphList::iterator pit,
                                font = getFont(pit, i);
                                endPosOfFontSpan = pit->getEndPosOfFontSpan(i);
                        }
-                       w += singleWidth(pit, i, c, font); 
+                       w += singleWidth(pit, i, c, font);
                        ++i;
                }
        }
@@ -999,21 +959,9 @@ void LyXText::setHeightOfRow(ParagraphList::iterator pit, RowList::iterator rit)
                                if (par.isInset(pos)) {
                                        InsetOld const * tmpinset = par.getInset(pos);
                                        if (tmpinset) {
-#if 1 // this is needed for deep update on initialitation
-#warning inset->update FIXME
-                                               //tmpinset->update(bv());
-                                               LyXFont const tmpfont = getFont(pit, pos);
-                                               Dimension dim;
-                                               MetricsInfo mi(bv(), tmpfont, workWidth());
-                                               tmpinset->metrics(mi, dim);
-                                               maxwidth += dim.wid;
-                                               maxasc = max(maxasc, dim.asc);
-                                               maxdesc = max(maxdesc, dim.des);
-#else
                                                maxwidth += tmpinset->width();
                                                maxasc = max(maxasc, tmpinset->ascent());
                                                maxdesc = max(maxdesc, tmpinset->descent());
-#endif
                                        }
                                } else {
                                        // Fall-back to normal case
@@ -1222,23 +1170,11 @@ void LyXText::setHeightOfRow(ParagraphList::iterator pit, RowList::iterator rit)
        maxasc += int(layoutasc * 2 / (2 + pit->getDepth()));
        maxdesc += int(layoutdesc * 2 / (2 + pit->getDepth()));
 
-       // calculate the new height of the text
-       height -= rit->height();
-
        rit->height(maxasc + maxdesc + labeladdon);
        rit->baseline(maxasc + labeladdon);
-
-       height += rit->height();
-
        rit->top_of_text(rit->baseline() - font_metrics::maxAscent(font));
 
        double x = 0;
-#if 0
-               // this IS needed
-               rit->width(maxwidth);
-               double dummy;
-               prepareToPrint(pit, rit, x, dummy, dummy, dummy, false);
-#endif
        rit->width(int(maxwidth + x));
        if (inset_owner) {
                width = max(0, workWidth());
@@ -1520,15 +1456,7 @@ void LyXText::prepareToPrint(ParagraphList::iterator pit,
                } else {
                        align = pit->params().align();
                }
-
-               // center displayed insets
                InsetOld * inset = 0;
-               if (rit->pos() < pit->size()
-                   && pit->isInset(rit->pos())
-                   && (inset = pit->getInset(rit->pos()))
-                   && (inset->display())) // || (inset->scroll() < 0)))
-                   align = (inset->lyxCode() == InsetOld::MATHMACRO_CODE)
-                       ? LYX_ALIGN_BLOCK : LYX_ALIGN_CENTER;
                // ERT insets should always be LEFT ALIGNED on screen
                inset = pit->inInset();
                if (inset && inset->owner() &&
@@ -1539,17 +1467,14 @@ void LyXText::prepareToPrint(ParagraphList::iterator pit,
 
                switch (align) {
            case LYX_ALIGN_BLOCK:
-           {
+               {
                        int const ns = numberOfSeparators(*pit, rit);
                        RowList::iterator next_row = boost::next(rit);
                        if (ns
                                && next_row != pit->rows.end()
                                && !pit->isNewline(next_row->pos() - 1)
-                         && !(pit->isInset(next_row->pos())
-                                    && pit->getInset(next_row->pos())
-                                    && pit->getInset(next_row->pos())->display())
                                ) {
-                               fill_separator = w / ns;
+                                       fill_separator = w / ns;
                        } else if (is_rtl) {
                                x += w;
                        }
@@ -1564,7 +1489,7 @@ void LyXText::prepareToPrint(ParagraphList::iterator pit,
                }
        }
 
-       computeBidiTables(pit, bv()->buffer(), rit);
+       computeBidiTables(pit, *bv()->buffer(), rit);
        if (is_rtl) {
                pos_type body_pos = pit->beginningOfBody();
                pos_type last = lastPos(*pit, rit);
@@ -1984,7 +1909,7 @@ void LyXText::backspace()
                                cursorLeft(bv());
 
                                // the layout things can change the height of a row !
-                               setHeightOfRow(cursor.par(), cursorRow());
+                               redoParagraph();
                                return;
                        }
                }
@@ -2010,7 +1935,7 @@ void LyXText::backspace()
                // 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.
-               //Correction: Pasting is always allowed with standard-layout
+               // Correction: Pasting is always allowed with standard-layout
                LyXTextClass const & tclass =
                        bv()->buffer()->params.getLyXTextClass();
 
@@ -2065,46 +1990,11 @@ RowList::iterator LyXText::getRow(LyXCursor const & cur) const
 RowList::iterator
 LyXText::getRow(ParagraphList::iterator pit, pos_type pos) const
 {
-       RowList::iterator rit = pit->rows.begin();
-       RowList::iterator end = pit->rows.end();
+       RowList::iterator rit = boost::prior(pit->rows.end());
+       RowList::iterator const begin = pit->rows.begin();
 
-#warning Why is this next thing needed? (Andre)
-       while (rit != end
-                    && rit->pos() < pos
-                    && boost::next(rit) != end
-                    && boost::next(rit)->pos() <= pos)
-               ++rit;
-
-       return rit;
-}
-
-
-// returns pointer to a specified row
-RowList::iterator
-LyXText::getRow(ParagraphList::iterator pit, pos_type pos, int & y) const
-{
-       y = 0;
-
-       if (noRows())
-               return firstRow();
-
-       ParagraphList::iterator it = ownerParagraphs().begin();
-       for ( ; it != pit; ++it) {
-               RowList::iterator beg = it->rows.begin();
-               RowList::iterator end = it->rows.end();
-               for (RowList::iterator rit = beg; rit != end; ++rit)
-                       y += rit->height();
-       }
-
-       RowList::iterator rit = pit->rows.begin();
-       RowList::iterator end = pit->rows.end();
-       while (rit != end
-              && rit->pos() < pos
-              && boost::next(rit) != end
-              && boost::next(rit)->pos() <= pos) {
-               y += rit->height();
-               ++rit;
-       }
+       while (rit != begin && rit->pos() > pos)
+               --rit;
 
        return rit;
 }
@@ -2113,25 +2003,23 @@ LyXText::getRow(ParagraphList::iterator pit, pos_type pos, int & y) const
 // returns pointer to some fancy row 'below' specified row
 RowList::iterator LyXText::cursorIRow() const
 {
-       int y = 0;
-       return getRow(cursor.par(), cursor.pos(), y);
+       return getRow(cursor.par(), cursor.pos());
 }
 
 
-RowList::iterator LyXText::getRowNearY(int y,
+RowList::iterator LyXText::getRowNearY(int y,
        ParagraphList::iterator & pit) const
 {
        //lyxerr << "getRowNearY: y " << y << endl;
-       pit = ownerParagraphs().begin();
-       RowList::iterator rit = firstRow();
-       RowList::iterator rend = endRow();
 
-       for (; rit != rend; nextRow(pit, rit))
-               if (rit->y() > y)
-                       break;
+       pit = boost::prior(ownerParagraphs().end());
+
+       RowList::iterator rit = lastRow();
+       RowList::iterator rbegin = firstRow();
+
+       while (rit != rbegin && static_cast<int>(rit->y()) > y)
+               previousRow(pit, rit);
 
-       previousRow(pit, rit);
-       y = rit->y();
        return rit;
 }