Index: abi/src/text/fmt/xp/fl_AutoNum.cpp diff -u abi/src/text/fmt/xp/fl_AutoNum.cpp:1.20 abi/src/text/fmt/xp/fl_AutoNum.cpp:1.21 --- abi/src/text/fmt/xp/fl_AutoNum.cpp:1.20 Wed Oct 4 20:30:43 2000 +++ abi/src/text/fmt/xp/fl_AutoNum.cpp Fri Oct 27 02:25:29 2000 @@ -127,6 +127,11 @@ *insPoint = 0; return; } + if(depth > 0 && m_List_Type >= BULLETED_LIST) + { + *insPoint = 0; + return; + } // TODO This is a bit of a hack to split the delim string. It would be // TODO nice to clear it up. @@ -150,13 +155,13 @@ i++; } rightDelim[i - rTmp] = '\0'; - UT_DEBUGMSG(("Left Delim: %s, Right Delim: %s\n", leftDelim, rightDelim)); + //UT_DEBUGMSG(("Left Delim: %s, Right Delim: %s\n", leftDelim, rightDelim)); if(m_pParent != NULL && m_List_Type < BULLETED_LIST) { m_pParent->_getLabelstr( labelStr, insPoint, depth+1,getFirstItem()); - UT_DEBUGMSG(("JORDAN: Parent Label: %s\n", labelStr)); + // UT_DEBUGMSG(("JORDAN: Parent Label: %s\n", labelStr)); if(*insPoint != 0) { psz = UT_XML_strlen(m_pszDecimal); @@ -527,7 +532,7 @@ void fl_AutoNum::update(UT_uint32 start) { - UT_DEBUGMSG(("Entering update\n")); + // UT_DEBUGMSG(("Entering update\n")); if(isUpdating()) return; //_calculateLabelStr(0); @@ -541,11 +546,11 @@ inline void fl_AutoNum::_updateItems(UT_uint32 start) { - UT_DEBUGMSG(("Entering _updateItems\n")); + // UT_DEBUGMSG(("Entering _updateItems\n")); m_bUpdatingItems = UT_TRUE; for (UT_uint32 i = start; i < m_pItems.getItemCount(); i++) { - UT_DEBUGMSG(("Entering _updateItems for loop\n")); + // UT_DEBUGMSG(("Entering _updateItems for loop\n")); fl_Layout * pTmp = (fl_Layout *)m_pItems.getNthItem(i); pTmp->listUpdate(); } Index: abi/src/text/fmt/xp/fl_BlockLayout.cpp diff -u abi/src/text/fmt/xp/fl_BlockLayout.cpp:1.197 abi/src/text/fmt/xp/fl_BlockLayout.cpp:1.198 --- abi/src/text/fmt/xp/fl_BlockLayout.cpp:1.197 Tue Oct 10 01:22:08 2000 +++ abi/src/text/fmt/xp/fl_BlockLayout.cpp Fri Oct 27 02:25:29 2000 @@ -894,6 +894,14 @@ { // When loading a document, there may not have been created // lines yet. Get a first one created and hope for the best... + // Sevior: Ah here is one source of the multi-level list bug we + // need a last line from the previous block before we call this. + if(getPrev()!= NULL && getPrev()->getLastLine()==NULL) + { + UT_DEBUGMSG(("SEVIOR: in _breakLineAfterRun no LastLine \n")); + UT_DEBUGMSG(("SEVIOR getPrev = %d this = %d \n",getPrev(),this)); + //UT_ASSERT(UT_SHOULD_NOT_HAPPEN); + } if (!m_pFirstLine) _stuffAllRunsOnALine(); @@ -1115,7 +1123,8 @@ { // Previous block exists but doesn't have a last line. // This is a BUG. Try a work around for now. TODO Fix this elsewhere - UT_DEBUGMSG(("SEVIOR: BUG!! Previous block exists with no last line, try to reformat the block \n")); + UT_DEBUGMSG(("SEVIOR: BUG!!! Previous block exists with no last line, try to reformat the block \n")); + //abort(); m_pPrev->format(); } } @@ -2203,6 +2212,13 @@ if(pView) pView->eraseInsertionPoint(); PT_BufIndex bi = pcrs->getBufIndex(); + if(getPrev()!= NULL && getPrev()->getLastLine()==NULL) + { + UT_DEBUGMSG(("SEVIOR: in _breakLineAfterRun no LastLine \n")); + UT_DEBUGMSG(("SEVIOR getPrev = %d this = %d \n",getPrev(),this)); + // UT_ASSERT(UT_SHOULD_NOT_HAPPEN); + } + const UT_UCSChar* pChars = m_pDoc->getPointer(bi); /* @@ -2341,6 +2357,12 @@ { fp_Run* pNewRun = new fp_ForcedPageBreakRun(this, m_pLayout->getGraphics(), blockOffset, 1); UT_ASSERT(pNewRun); // TODO check for outofmem + if(getPrev()!= NULL && getPrev()->getLastLine()==NULL) + { + UT_DEBUGMSG(("SEVIOR: in _breakLineAfterRun no LastLine \n")); + UT_DEBUGMSG(("SEVIOR getPrev = %d this = %d \n",getPrev(),this)); + //UT_ASSERT(UT_SHOULD_NOT_HAPPEN); + } UT_Bool bResult = _doInsertRun(pNewRun); if (bResult) Index: abi/src/text/fmt/xp/fl_DocListener.cpp diff -u abi/src/text/fmt/xp/fl_DocListener.cpp:1.79 abi/src/text/fmt/xp/fl_DocListener.cpp:1.80 --- abi/src/text/fmt/xp/fl_DocListener.cpp:1.79 Tue Aug 1 00:38:30 2000 +++ abi/src/text/fmt/xp/fl_DocListener.cpp Fri Oct 27 02:25:29 2000 @@ -78,10 +78,26 @@ fl_Layout * pL = (fl_Layout *)sfh; UT_ASSERT(pL->getType() == PTX_Block); fl_BlockLayout * pBL = static_cast(pL); + if(pBL->getPrev()!= NULL && pBL->getPrev()->getLastLine()==NULL) + { + UT_DEBUGMSG(("SEVIOR: in DocListner before no LastLine \n")); + UT_DEBUGMSG(("SEVIOR getPrev = %d this = %d \n",pBL->getPrev(),pBL)); + pBL->getPrev()->format(); + + } + PT_BlockOffset blockOffset = pcrs->getBlockOffset(); UT_uint32 len = pcrs->getLength(); fl_SectionLayout* pBLSL = pBL->getSectionLayout(); bResult = pBLSL->bl_doclistener_populateSpan(pBL, pcrs, blockOffset, len); + if(pBL->getLastLine()==NULL) + { + UT_DEBUGMSG(("SEVIOR: in DocListner after no LastLine \n")); + UT_DEBUGMSG(("SEVIOR getPrev = %d this = %d \n",pBL->getPrev(),pBL)); + pBL->format(); + //UT_ASSERT(UT_SHOULD_NOT_HAPPEN); + } + goto finish_up; } Index: abi/src/text/fmt/xp/fl_SectionLayout.cpp diff -u abi/src/text/fmt/xp/fl_SectionLayout.cpp:1.60 abi/src/text/fmt/xp/fl_SectionLayout.cpp:1.62 --- abi/src/text/fmt/xp/fl_SectionLayout.cpp:1.60 Tue Aug 1 00:38:30 2000 +++ abi/src/text/fmt/xp/fl_SectionLayout.cpp Fri Oct 27 02:25:29 2000 @@ -260,6 +260,13 @@ UT_Bool fl_SectionLayout::bl_doclistener_populateSpan(fl_BlockLayout* pBL, const PX_ChangeRecord_Span * pcrs, PT_BlockOffset blockOffset, UT_uint32 len) { + if(pBL->getPrev()!= NULL && pBL->getPrev()->getLastLine()==NULL) + { + UT_DEBUGMSG(("SEVIOR: in bl_doclistner_pop no LastLine \n")); + UT_DEBUGMSG(("SEVIOR getPrev = %d this = %d \n",pBL->getPrev(),pBL)); + // UT_ASSERT(UT_SHOULD_NOT_HAPPEN); + } + return pBL->doclistener_populateSpan(pcrs, blockOffset, len); } @@ -573,6 +580,18 @@ while (pBL) { pBL->format(); + UT_sint32 count = 0; + while(pBL->getLastLine() == NULL || pBL->getFirstLine()==NULL) + { + UT_DEBUGMSG(("Error formatting a block try again \n")); + count = count + 1; + pBL->format(); + if(count > 3) + { + UT_DEBUGMSG(("Give up trying to format. Hope for the best :-( \n")); + break; + } + } pBL = pBL->getNext(); } @@ -1109,7 +1128,6 @@ fp_Line* pCurrentLine = pFirstBlock->getFirstLine(); fp_Column* pCurColumn = (fp_Column*) getFirstContainer(); - UT_ASSERT(pCurColumn); while (pCurColumn) {