]> git.lyx.org Git - lyx.git/blobdiff - src/lyxrow_funcs.C
Point fix, earlier forgotten
[lyx.git] / src / lyxrow_funcs.C
index f2ed678408783bb38c7862ed178af4fc38b18bab..9dacc2aa219f9d206caac418c910fc0c10eb0e4d 100644 (file)
@@ -1,81 +1,88 @@
+/**
+ * \file lyxrow_funcs.C
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Lars Gullik Bjønnes
+ * \author André Pönitz
+ *
+ * Full author contact details are available in file CREDITS.
+ */
+
 #include <config.h>
 
 #include "lyxrow_funcs.h"
 #include "lyxtext.h"
 #include "paragraph.h"
 #include "lyxlayout.h"
+#include "debug.h"
+
+#include "support/LAssert.h"
 
 #include <boost/next_prior.hpp>
 #include <algorithm>
 
 using lyx::pos_type;
+using lyx::support::Assert;
+
 using std::max;
 using std::min;
+using std::endl;
 
 
-bool isParEnd(LyXText const & lt, RowList::iterator rit)
+bool isParEnd(Paragraph const & par, RowList::iterator rit)
 {
-       RowList::iterator next_row = boost::next(rit);
-       return next_row == lt.rows().end() || next_row->par() != rit->par();
+#if 0
+       if ((boost::next(rit) == par.rows.end()) != (rit->end() >= par.size())) {
+               lyxerr << endl;
+               lyxerr << "broken row 1: end: " << rit->end() << " next: "
+                       << boost::next(rit)->pos() << endl;
+               lyxerr << endl;
+               Assert(false);
+       }
+#endif
+       return boost::next(rit) == par.rows.end();
 }
 
 
-pos_type lastPos(LyXText const & lt, RowList::iterator rit)
+pos_type lastPos(Paragraph const & par, RowList::iterator rit)
 {
-       if (rit->par()->empty())
+       if (par.empty())
                return 0;
 
-       if (isParEnd(lt, rit))
-               return rit->par()->size() - 1;
+       if (isParEnd(par, rit))
+               return par.size() - 1;
 
+       if (1 && boost::next(rit)->pos() != rit->end()) {
+               lyxerr << endl;
+               lyxerr << "broken row 2: end: " << rit->end() << " next: "
+                       << boost::next(rit)->pos() << endl;
+               lyxerr << endl;
+               Assert(false);
+       }
        return boost::next(rit)->pos() - 1;
 }
 
 
-namespace {
-
-bool nextRowIsAllInset(Row const & row, pos_type last)
-{
-       ParagraphList::iterator pit = row.par();
-
-       if (last + 1 >= pit->size())
-               return false;
-
-       if (!pit->isInset(last + 1))
-               return false;
-
-       InsetOld const * i = pit->getInset(last + 1);
-       return i->needFullRow() || i->display();
-}
-
-} // anon namespace
-
-
-pos_type lastPrintablePos(LyXText const & lt, RowList::iterator rit)
+pos_type lastPrintablePos(Paragraph const & par, RowList::iterator rit)
 {
-       pos_type const last = lastPos(lt, rit);
+       pos_type const last = lastPos(par, rit);
 
        // if this row is an end of par, just act like lastPos()
-       if (isParEnd(lt, rit))
+       if (isParEnd(par, rit))
                return last;
 
-       bool const nextrownotinset = !nextRowIsAllInset(*rit, last);
-
-       if (nextrownotinset && rit->par()->isSeparator(last))
-               return last - 1;
-
        return last;
 }
 
 
-int numberOfSeparators(LyXText const & lt, RowList::iterator rit)
+int numberOfSeparators(Paragraph const & par, RowList::iterator rit)
 {
-       pos_type const last = lastPrintablePos(lt, rit);
-       ParagraphList::iterator pit = rit->par();
+       pos_type const last = lastPrintablePos(par, rit);
        int n = 0;
-       pos_type p = max(rit->pos(), pit->beginningOfBody());
+       pos_type p = max(rit->pos(), par.beginningOfBody());
        for ( ; p < last; ++p)
-               if (pit->isSeparator(p))
+               if (par.isSeparator(p))
                        ++n;
        return n;
 }
@@ -83,68 +90,64 @@ int numberOfSeparators(LyXText const & lt, RowList::iterator rit)
 
 // This is called _once_ from LyXText and should at least be moved into
 // an anonymous namespace there. (Lgb)
-int numberOfHfills(LyXText const & lt, RowList::iterator rit)
+int numberOfHfills(Paragraph const & par, RowList::iterator rit)
 {
-       pos_type const last = lastPos(lt, rit);
+       pos_type const last = lastPos(par, rit);
        pos_type first = rit->pos();
-       ParagraphList::iterator pit = rit->par();
 
        // hfill *DO* count at the beginning of paragraphs!
        if (first) {
-               while (first < last && pit->isHfill(first))
+               while (first < last && par.isHfill(first))
                        ++first;
        }
 
-       first = max(first, pit->beginningOfBody());
+       first = max(first, par.beginningOfBody());
 
        int n = 0;
 
        // last, because the end is ignored!
-       for (pos_type p = first; p < last; ++p) {
-               if (pit->isHfill(p))
+       for (pos_type p = first; p < last; ++p)
+               if (par.isHfill(p))
                        ++n;
-       }
+
        return n;
 }
 
 
 // This is called _once_ from LyXText and should at least be moved into
 // an anonymous namespace there. (Lgb)
-int numberOfLabelHfills(LyXText const & lt, RowList::iterator rit)
+int numberOfLabelHfills(Paragraph const & par, RowList::iterator rit)
 {
-       pos_type last = lastPos(lt, rit);
+       pos_type last = lastPos(par, rit);
        pos_type first = rit->pos();
-       ParagraphList::iterator pit = rit->par();
 
        // hfill *DO* count at the beginning of paragraphs!
        if (first) {
-               while (first < last && pit->isHfill(first))
+               while (first < last && par.isHfill(first))
                        ++first;
        }
 
-       last = min(last, pit->beginningOfBody());
+       last = min(last, par.beginningOfBody());
        int n = 0;
 
        // last, because the end is ignored!
        for (pos_type p = first; p < last; ++p) {
-               if (pit->isHfill(p))
+               if (par.isHfill(p))
                        ++n;
        }
        return n;
 }
 
 
-bool hfillExpansion(LyXText const & lt, RowList::iterator rit, pos_type pos)
+bool hfillExpansion(Paragraph const & par, RowList::iterator rit, pos_type pos)
 {
-       ParagraphList::iterator pit = rit->par();
-
-       if (!pit->isHfill(pos))
+       if (!par.isHfill(pos))
                return false;
 
        // at the end of a row it does not count
        // unless another hfill exists on the line
-       if (pos >= lastPos(lt, rit))
-               for (pos_type i = rit->pos(); i < pos && !pit->isHfill(i); ++i)
+       if (pos >= lastPos(par, rit))
+               for (pos_type i = rit->pos(); i < pos && !par.isHfill(i); ++i)
                        return false;
 
        // at the beginning of a row it does not count, if it is not
@@ -153,15 +156,15 @@ bool hfillExpansion(LyXText const & lt, RowList::iterator rit, pos_type pos)
                return true;
 
        // in some labels it does not count
-       if (pit->layout()->margintype != MARGIN_MANUAL
-           && pos < pit->beginningOfBody())
+       if (par.layout()->margintype != MARGIN_MANUAL
+           && pos < par.beginningOfBody())
                return false;
 
        // if there is anything between the first char of the row and
        // the specified position that is not a newline and not a hfill,
        // the hfill will count, otherwise not
        pos_type i = rit->pos();
-       while (i < pos && (pit->isNewline(i) || pit->isHfill(i)))
+       while (i < pos && (par.isNewline(i) || par.isHfill(i)))
                ++i;
 
        return i != pos;