]> git.lyx.org Git - features.git/commitdiff
make endpos behave
authorAlfredo Braunstein <abraunst@lyx.org>
Fri, 24 Oct 2003 15:04:17 +0000 (15:04 +0000)
committerAlfredo Braunstein <abraunst@lyx.org>
Fri, 24 Oct 2003 15:04:17 +0000 (15:04 +0000)
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@7977 a592a061-630c-0410-9148-cb99ea01b6c8

src/ChangeLog
src/lyxrow_funcs.C
src/paragraph.C
src/text.C
src/text2.C

index 754c2b34f1dc0eae0c231fcb2e516165a8dff384..b0b7519cf0cb60821a42c2d7a97e2a99f705f39c 100644 (file)
@@ -1,3 +1,11 @@
+2003-10-24  Alfredo Braunstein  <abraunst@libero.it>
+
+       * paragraph.C (getChar): add strong asserts
+
+       * lyxrow_funcs.C (lastPos): remove hideous hack
+
+       * text.C (addressBreakPoint, rowBreakPoint): put endpos in place
+       (fill): adjust to that (avoid an infinite loop)
 
 2003-10-23  Alfredo Braunstein  <abraunst@libero.it>
 
index 4510855ef9fe5ae54403ab4fc01f2779c546500c..e33b86f14897ceb20b48ba99332226303cd8084e 100644 (file)
@@ -29,8 +29,8 @@ pos_type lastPos(Paragraph const & par, Row const & row)
        if (par.empty())
                return 0;
        pos_type pos = row.endpos() - 1;
-       if (pos == par.size())
-               --pos;
+//     if (pos == par.size())
+//             --pos;
        return pos;
 }
 
index 8c640b6d6277b22f9e39b896d7357106507d54e6..5b4658b5be7cbafafb67424a81809937c61e14eb 100644 (file)
@@ -1327,12 +1327,13 @@ Paragraph::value_type Paragraph::getChar(pos_type pos) const
        // This is in the critical path!
        pos_type const siz = text_.size();
 
-       BOOST_ASSERT(pos <= siz);
+       BOOST_ASSERT(0 <= pos && pos <= siz);
 
        if (pos == siz) {
                lyxerr << "getChar() on pos " << pos << " in par id "
                       << id() << " of size " << siz
                       << "  is a bit silly !" << endl;
+               BOOST_ASSERT(false);
                return '\0';
        }
 
index 4c562e1da57dfbfa96e38129b79551bcada79a3d..d7403097e2508622dbb9c779d56bba4349828ed4 100644 (file)
@@ -456,7 +456,7 @@ pos_type addressBreakPoint(pos_type i, Paragraph const & par)
 {
        for (; i < par.size(); ++i)
                if (par.isNewline(i))
-                       return i;
+                       return i + 1;
 
        return par.size();
 }
@@ -466,6 +466,11 @@ pos_type addressBreakPoint(pos_type i, Paragraph const & par)
 
 void LyXText::rowBreakPoint(ParagraphList::iterator pit, Row & row) const
 {
+       if (pit->empty()) {
+               row.endpos(pit->size());
+               return;
+       }
+       
        // maximum pixel width of a row.
        int width = workWidth()
                - rightMargin(*pit, *bv()->buffer(), row)
@@ -474,24 +479,24 @@ void LyXText::rowBreakPoint(ParagraphList::iterator pit, Row & row) const
        // inset->textWidth() returns -1 via workWidth(),
        // but why ?
        if (width < 0) {
-               row.endpos(pit->size() + 1);
+               row.endpos(pit->size());
                return;
        }
 
        LyXLayout_ptr const & layout = pit->layout();
 
        if (layout->margintype == MARGIN_RIGHT_ADDRESS_BOX) {
-               row.endpos(addressBreakPoint(row.pos(), *pit) + 1);
+               row.endpos(addressBreakPoint(row.pos(), *pit));
                return;
        }
 
        pos_type const pos = row.pos();
        pos_type const body_pos = pit->beginningOfBody();
-       pos_type const last = pit->size();
-       pos_type point = last;
+       pos_type const end = pit->size();
+       pos_type point = end - 1;
 
-       if (pos == last) {
-               row.endpos(last + 1);
+       if (pos == end) {
+               row.endpos(end);
                return;
        }
 
@@ -511,13 +516,13 @@ void LyXText::rowBreakPoint(ParagraphList::iterator pit, Row & row) const
        LyXFont font = getFont(pit, i);
        lyx::pos_type endPosOfFontSpan = pit->getEndPosOfFontSpan(i);
 
-       for ( ; i < last; ++i) {
+       for ( ; i < end; ++i) {
                if (pit->isNewline(i)) {
                        point = i;
                        break;
                }
                // Break before...      
-               if (i + 1 < last) {
+               if (i + 1 < end) {
                        InsetOld * in = pit->getInset(i + 1);
                        if (in && in->display()) {
                                point = i;
@@ -560,7 +565,7 @@ void LyXText::rowBreakPoint(ParagraphList::iterator pit, Row & row) const
                // the right of the row
                if (x >= width) {
                        // if no break before, break here
-                       if (point == last || chunkwidth >= width - left) {
+                       if (point == end || chunkwidth >= width - left) {
                                if (pos < i) {
                                        point = i - 1;
                                        // exit on last registered breakpoint:
@@ -568,7 +573,7 @@ void LyXText::rowBreakPoint(ParagraphList::iterator pit, Row & row) const
                                }
                        }
                        // emergency exit:
-                       if (i + 1 < last)               
+                       if (i + 1 < end)
                                break;  
                }
 
@@ -583,13 +588,13 @@ void LyXText::rowBreakPoint(ParagraphList::iterator pit, Row & row) const
                }
        }
 
-       if (point == last && x >= width) {
+       if (point == end && x >= width) {
                // didn't find one, break at the point we reached the edge
                point = i;
-       } else if (i == last && x < width) {
+       } else if (i == end && x < width) {
                // found one, but we fell off the end of the par, so prefer
                // that.
-               point = last;
+               point = end - 1;
        }
 
        // manual labels cannot be broken in LaTeX. But we
@@ -1227,8 +1232,10 @@ void LyXText::prepareToPrint(ParagraphList::iterator pit, Row & row) const
                // The test on pit->size() is to catch zero-size pars, which
                // would trigger the assert in Paragraph::getInset().
                //inset = pit->size() ? pit->getInset(row.pos()) : 0;
-               inset = pit->isInset(row.pos()) ? pit->getInset(row.pos()) : 0;
-               if (inset && inset->display()) {
+               if (!pit->empty()
+                   && pit->isInset(row.pos())
+                   && pit->getInset(row.pos())->display())
+               {
                        align = LYX_ALIGN_CENTER;
                }
                
@@ -1895,7 +1902,8 @@ void LyXText::redoParagraphInternal(ParagraphList::iterator pit)
 
        // rebreak the paragraph
        int const ww = workWidth();
-       for (pos_type z = 0; z < pit->size() + 1; ) {
+       pos_type z = 0;
+       do {
                Row row(z);
                rowBreakPoint(pit, row);
                z = row.endpos();
@@ -1906,7 +1914,8 @@ void LyXText::redoParagraphInternal(ParagraphList::iterator pit)
                pit->rows.push_back(row);
                pit->width = std::max(pit->width, row.width());
                pit->height += row.height();
-       }
+       } while (z < pit->size());
+
        height += pit->height;
        //lyxerr << "redoParagraph: " << pit->rows.size() << " rows\n";
 }
index 72f8171aa633a764575d0f2955cc8cb348a3f75b..e39146ac60e0c52b7a32f4d32b8d4e1826ab9741 100644 (file)
@@ -1311,18 +1311,27 @@ void LyXText::setCursor(LyXCursor & cur, paroffset_type par,
 
        // None of these should happen, but we're scaredy-cats
        if (pos > pit->size()) {
-               lyxerr << "dont like 1, pos: " << pos << " size: " << pit->size() << endl;
+               lyxerr << "dont like 1, pos: " << pos
+                      << " size: " << pit->size()
+                      << " row.pos():" << row.pos()
+                      << " paroffset: " << par << endl;
                pos = 0;
                cur.pos(0);
+               BOOST_ASSERT(false);
        } else if (pos > last + 1) {
                lyxerr << "dont like 2 please report" << endl;
                // This shouldn't happen.
                pos = last + 1;
                cur.pos(pos);
+               BOOST_ASSERT(false);
        } else if (pos < row.pos()) {
-               lyxerr << "dont like 3 please report" << endl;
+               lyxerr << "dont like 3 please report pos:" << pos
+                      << " size: " << pit->size()
+                      << " row.pos():" << row.pos()
+                      << " paroffset: " << par << endl;
                pos = row.pos();
                cur.pos(pos);
+               BOOST_ASSERT(false);
        }
 
        // now get the cursors x position