? squiggle.patch ? src/text/fmt/xp/squiggle.patch Index: src/text/fmt/xp/fl_DocLayout.cpp =================================================================== RCS file: /cvsroot/abi/src/text/fmt/xp/fl_DocLayout.cpp,v retrieving revision 1.267 diff -n -a -u -r1.267 fl_DocLayout.cpp --- src/text/fmt/xp/fl_DocLayout.cpp 16 Nov 2004 16:10:57 -0000 1.267 +++ src/text/fmt/xp/fl_DocLayout.cpp 21 Feb 2005 03:13:30 -0000 @@ -2475,6 +2475,7 @@ UT_ASSERT(m_pPendingWordForSpell); bUpdate = m_pPendingBlockForSpell->checkWord(m_pPendingWordForSpell); + m_pPendingWordForSpell = NULL; // NB: already freed by checkWord // Not pending any more Index: src/text/fmt/xp/fl_Squiggles.cpp =================================================================== RCS file: /cvsroot/abi/src/text/fmt/xp/fl_Squiggles.cpp,v retrieving revision 1.20 diff -n -a -u -r1.20 fl_Squiggles.cpp --- src/text/fmt/xp/fl_Squiggles.cpp 1 May 2004 17:21:26 -0000 1.20 +++ src/text/fmt/xp/fl_Squiggles.cpp 21 Feb 2005 03:13:30 -0000 @@ -24,6 +24,7 @@ #include "ut_string.h" #include "fv_View.h" #include "pd_Document.h" +#include "fp_Run.h" /*! \page squiggle_overview Squiggles @@ -273,6 +274,7 @@ // "gest's" the entire >gest's< is squiggled. pPrev->setLength(pPOB->getLength()); _deleteNth(iIndex--); + markForRedraw(pPrev); } else if (pPOB->getOffset() == pPrev->getOffset() + pPrev->getLength()) { @@ -281,7 +283,17 @@ // typing a character ' between them. pPrev->setLength(pPrev->getLength() + pPOB->getLength()); _deleteNth(iIndex--); + markForRedraw(pPrev); } + else + { + markForRedraw(pPOB); + } + + } + else + { + markForRedraw(pPOB); } #if UT_DEBUG UT_sint32 iSquiggles = _getCount(); @@ -310,8 +322,8 @@ { xxx_UT_DEBUGMSG(("fl_Squiggles::delelteNth(%d)\n", iIndex)); fl_PartOfBlock* pPOB = getNth(iIndex); - clear(pPOB); m_vecSquiggles.deleteNthItem(iIndex); + clear(pPOB); delete pPOB; } @@ -378,6 +390,27 @@ } /*! + * Mark all the runs overlapping with the POB for Redraw. + */ +void fl_Squiggles::markForRedraw(fl_PartOfBlock* pPOB) +{ + PT_DocPosition pos1 = pPOB->getOffset(); + PT_DocPosition pos2 = pos1 + pPOB->getLength(); + // + // Make sure the runs in this POB get redrawn. + // + fp_Run * pRun = m_pOwner->getFirstRun(); + while(pRun && (pRun->getBlockOffset() <= pos2)) + { + if((pRun->getBlockOffset() + pRun->getLength() >= pos1)) + { + pRun->markAsDirty(); + } + pRun = pRun->getNextRun(); + } +} + +/*! Clear squiggle \param pPOB Part of block to clear squiggle for This clears the squiggle graphics from the screen. @@ -391,12 +424,16 @@ return; } FV_View* pView = m_pOwner->getDocLayout()->getView(); + PT_DocPosition pos1 = m_pOwner->getPosition() + pPOB->getOffset(); + PT_DocPosition pos2 = pos1 + pPOB->getLength(); if(pView->getDocument()->isPieceTableChanging()) { - return; + // + // Make sure the runs in this POB get redrawn. + // + markForRedraw(pPOB); + return; } - PT_DocPosition pos1 = m_pOwner->getPosition() + pPOB->getOffset(); - PT_DocPosition pos2 = pos1 + pPOB->getLength(); PT_DocPosition posEOD = 0; m_pOwner->getDocument()->getBounds(true,posEOD); if(pos2 > posEOD) @@ -448,7 +485,7 @@ // offset according to the change if (pPending->getOffset() > iOffset) pPending->setOffset(pPending->getOffset() + chg); - + #if 0 m_pOwner->getDocLayout()->checkPendingWordForSpell(); #else Index: src/text/fmt/xp/fl_Squiggles.h =================================================================== RCS file: /cvsroot/abi/src/text/fmt/xp/fl_Squiggles.h,v retrieving revision 1.4 diff -n -a -u -r1.4 fl_Squiggles.h --- src/text/fmt/xp/fl_Squiggles.h 28 Dec 2002 20:26:15 -0000 1.4 +++ src/text/fmt/xp/fl_Squiggles.h 21 Feb 2005 03:13:30 -0000 @@ -29,6 +29,7 @@ ~fl_Squiggles(void); void add(fl_PartOfBlock* pPOB); + void markForRedraw(fl_PartOfBlock* pPOB); bool deleteAll(void);