Hi all,
        Ok, I've got the hang of stepping through a document, and now I've
successfully made changes to its piecetable.  The missing link is
re-displaying the document.

The following code works, but I can only see the changes if I save and
re-load the document.  Otherwise the display doesn't get updated.
Any hints gratefully received.

Best wishes,
                Bill.

PS: Note that I added PT_BufIndex::changeBufIndex(), but it just does
what you would expect.




void replace_first_text_frag( char* str, int length )
{
  XAP_Frame *pFrame = XAP_App::getApp()->getLastFocussedFrame();
  FV_View* myview = static_cast<FV_View*>(pFrame->getCurrentView());
  PD_Document* mydoc = myiew->getDocument();
  pt_PieceTable* mypt = mydoc->getPieceTable();
  pf_Fragments* myfrags = &(mypt->getFragments());

  for( pf_Frag* pf = myfrags->getFirst(); (pf); pf=pf->getNext() )
    {
      if( pf->getType() == pf_Frag::PFT_Text )
          {
            pf_Frag_Text* pfText = static_cast<pf_Frag_Text*>(pf);
            printf( "Replacing first text frag with %s (length is %d)\n",
                    str, length );
            PT_BufIndex* newIndex = AbiInternString( asciiToUcs( str, length ),
                                                     length );
            if( newIndex )
              {
                pfText->changeLength( length );
                pfText->changeBufIndex( *newIndex );
              }
            // Try to redraw the document...
            (myview->getLayout())->updateLayout(); // please work
            myview->updateLayout();                // pretty please
            myview->_generalUpdate();              // I'm begging now
            updateScreen();                        // don't make me cry
            return;
          }
    }
}


inline static PT_BufIndex* AbiInternString( const UT_UCSChar* stringBuffer,
                                            UT_uint32 length )
{
  PT_BufIndex* toret = new PT_BufIndex();
  pt_VarSet* myVarSet = &(((getCurrentDocument())->getPieceTable())->getVarSet());
  if( myVarSet->appendBuf( stringBuffer, length, toret ) )
    return toret;
  else
    {
      delete toret;
      return NULL;
    }
}

Reply via email to