/************************************************************************* * * $RCSfile: swblocks.cxx,v $ * * $Revision: 1.15 $ * * last change: $Author: jp $ $Date: 2001-10-19 08:19:59 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses * * - GNU Lesser General Public License Version 2.1 * - Sun Industry Standards Source License Version 1.1 * * Sun Microsystems Inc., October, 2000 * * GNU Lesser General Public License Version 2.1 * ============================================= * Copyright 2000 by Sun Microsystems, Inc. * 901 San Antonio Road, Palo Alto, CA 94303, USA * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1, as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA * * * Sun Industry Standards Source License Version 1.1 * ================================================= * The contents of this file are subject to the Sun Industry Standards * Source License Version 1.1 (the "License"); You may not use this file * except in compliance with the License. You may obtain a copy of the * License at http://www.openoffice.org/license.html. * * Software provided under this License is provided on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. * See the License for the specific provisions governing your rights and * obligations concerning the Software. * * The Initial Developer of the Original Code is: Sun Microsystems, Inc. * * Copyright: 2000 by Sun Microsystems, Inc. * * All Rights Reserved. * * Contributor(s): _______________________________________ * * ************************************************************************/ #ifdef PRECOMPILED #include "core_pch.hxx" #endif #pragma hdrstop #ifndef _SFX_DOCFILT_HACK_HXX //autogen #include #endif #ifndef _SVSTOR_HXX //autogen #include #endif #ifndef _URLOBJ_HXX #include #endif #ifndef SVTOOLS_FSTATHELPER_HXX #include #endif #ifndef _SFXMACITEM_HXX #include #endif #ifndef _UNOTOOLS_CHARCLASS_HXX #include #endif #ifndef _FRMFMT_HXX //autogen #include #endif #ifndef _DOC_HXX #include #endif #ifndef _DOCARY_HXX #include #endif #ifndef _PAM_HXX #include #endif #ifndef _SHELLIO_HXX #include #endif #ifndef _SWBLOCKS_HXX #include #endif #ifndef _NDTXT_HXX #include #endif #ifndef _MDIEXP_HXX #include // Progress #endif #ifndef _SW_XMLTEXTBLOCKS_HXX #include #endif #ifndef _DOCSH_HXX #include #endif #ifndef _SWUNOHELPER_HXX #include #endif #ifndef _STATSTR_HRC #include #endif #ifndef _SWSWERROR_H #include #endif SV_IMPL_OP_PTRARR_SORT( SwBlockNames, SwBlockName* ); ////////////////////////////////////////////////////////////////////////// // Hash-Code errechnen (muss nicht eindeutig sein) USHORT SwImpBlocks::Hash( const String& r ) { USHORT n = 0; xub_StrLen nLen = r.Len(); if( nLen > 8 ) nLen = 8; const sal_Unicode* p = r.GetBuffer(); while( nLen-- ) n = ( n << 1 ) + *p++; return n; } SwBlockName::SwBlockName( const String& rShort, const String& rLong, long n ) : aShort( rShort ), aLong( rLong ), nPos( n ), aPackageName (rShort), bIsOnlyTxtFlagInit( FALSE ), bIsOnlyTxt( FALSE ) { nHashS = SwImpBlocks::Hash( rShort ); nHashL = SwImpBlocks::Hash( rLong ); } SwBlockName::SwBlockName( const String& rShort, const String& rLong, const String& rPackageName) : aShort( rShort ), aLong( rLong ), nPos( 0 ), aPackageName (rPackageName), bIsOnlyTxtFlagInit( FALSE ), bIsOnlyTxt( FALSE ) { nHashS = SwImpBlocks::Hash( rShort ); nHashL = SwImpBlocks::Hash( rLong ); } // Ist die angegebene Datei ein Storage oder gibt es sie nicht? short SwImpBlocks::GetFileType( const String& rFile ) { if( !FStatHelper::IsDocument( rFile ) ) return SWBLK_NO_FILE; if( SwXMLTextBlocks::IsFileUCBStorage( rFile ) ) return SWBLK_XML; if( SvStorage::IsStorageFile( rFile ) ) return SWBLK_SW3; // Kein Storage: Ist es eine SWG-Datei? const SfxFilter* pFltr = SwIoSystem::GetFileFilter( rFile, aEmptyStr ); return( pFltr && pFltr->GetUserData().EqualsAscii(FILTER_SWG) ) ? SWBLK_SW2 : SWBLK_NONE; } SwImpBlocks::SwImpBlocks( const String& rFile, BOOL bMake ) : aFile( rFile ), bReadOnly( TRUE ), bInPutMuchBlocks( FALSE ), nCur( (USHORT)-1 ), pDoc( 0 ) { FStatHelper::GetModifiedDateTimeOfFile( rFile, &aDateModified, &aTimeModified ); INetURLObject aObj(rFile); aObj.setExtension( aEmptyStr ); aName = aObj.GetBase(); } SwImpBlocks::~SwImpBlocks() { aNames.DeleteAndDestroy( 0, aNames.Count() ); } // Loeschen des Inhaltes des Dokuments void SwImpBlocks::ClearDoc() { pDoc->ClearDoc(); } ULONG SwImpBlocks::GetDocForConversion( USHORT n ) { return GetDoc( n ); } // Erzeugen eines PaMs, der das ganze Dokument umfasst SwPaM* SwImpBlocks::MakePaM() { SwPaM* pPam = new SwPaM( pDoc->GetNodes().GetEndOfContent() ); pPam->Move( fnMoveBackward, fnGoDoc ); pPam->SetMark(); pPam->Move( fnMoveForward, fnGoDoc ); pPam->Exchange(); return pPam; } USHORT SwImpBlocks::GetCount() const { return aNames.Count(); } // Case Insensitive USHORT SwImpBlocks::GetIndex( const String& rShort ) const { String s( GetAppCharClass().upper( rShort ) ); USHORT nHash = Hash( s ); for( USHORT i = 0; i < aNames.Count(); i++ ) { SwBlockName* pName = aNames[ i ]; if( pName->nHashS == nHash && pName->aShort == s ) return i; } return (USHORT) -1; } USHORT SwImpBlocks::GetLongIndex( const String& rLong ) const { USHORT nHash = Hash( rLong ); for( USHORT i = 0; i < aNames.Count(); i++ ) { SwBlockName* pName = aNames[ i ]; if( pName->nHashL == nHash && pName->aLong == rLong ) return i; } return (USHORT) -1; } const String& SwImpBlocks::GetShortName( USHORT n ) const { if( n < aNames.Count() ) return aNames[ n ]->aShort; return aEmptyStr; } const String& SwImpBlocks::GetLongName( USHORT n ) const { if( n < aNames.Count() ) return aNames[ n ]->aLong; return aEmptyStr; } const String& SwImpBlocks::GetPackageName( USHORT n ) const { if( n < aNames.Count() ) return aNames[ n ]->aPackageName; return aEmptyStr; } void SwImpBlocks::AddName( const String& rShort, const String& rLong, BOOL bOnlyTxt ) { USHORT nIdx = GetIndex( rShort ); if( nIdx != (USHORT) -1 ) aNames.DeleteAndDestroy( nIdx ); SwBlockName* pNew = new SwBlockName( rShort, rLong, 0L ); pNew->bIsOnlyTxtFlagInit = TRUE; pNew->bIsOnlyTxt = bOnlyTxt; aNames.C40_PTR_INSERT( SwBlockName, pNew ); } BOOL SwImpBlocks::IsFileChanged() const { Date aTempDateModified( aDateModified ); Time aTempTimeModified( aTimeModified ); return FStatHelper::GetModifiedDateTimeOfFile( aFile, &aTempDateModified, &aTempTimeModified ) && ( aDateModified != aTempDateModified || aTimeModified != aTempTimeModified ); } void SwImpBlocks::Touch() { FStatHelper::GetModifiedDateTimeOfFile( aFile, &aDateModified, &aTimeModified ); } BOOL SwImpBlocks::IsOnlyTextBlock( const String& ) const { return FALSE; } ULONG SwImpBlocks::GetMacroTable( USHORT, SvxMacroTableDtor&, sal_Bool ) { return 0; } ULONG SwImpBlocks::SetMacroTable( USHORT nIdx, const SvxMacroTableDtor& rMacroTbl, sal_Bool ) { return 0; } BOOL SwImpBlocks::PutMuchEntries( BOOL bOn ) { return FALSE; } //////////////////////////////////////////////////////////////////////////// SwTextBlocks::SwTextBlocks( const String& rFile ) : pImp( 0 ), nErr( 0 ) { INetURLObject aObj(rFile); String sFileName = aObj.GetMainURL( INetURLObject::NO_DECODE ); switch( SwImpBlocks::GetFileType( rFile ) ) { case SWBLK_SW2: pImp = new Sw2TextBlocks( sFileName ); break; case SWBLK_SW3: pImp = new Sw3TextBlocks( sFileName ); break; case SWBLK_XML: pImp = new SwXMLTextBlocks( sFileName ); break; case SWBLK_NO_FILE: pImp = new SwXMLTextBlocks( sFileName ); break; } if( !pImp ) nErr = ERR_SWG_FILE_FORMAT_ERROR; } SwTextBlocks::SwTextBlocks( SvStorage& rStg ) : nErr( 0 ) { pImp = new Sw3TextBlocks( rStg ); } SwTextBlocks::~SwTextBlocks() { delete pImp; } const String& SwTextBlocks::GetName() { return pImp ? pImp->aName : aEmptyStr; } void SwTextBlocks::SetName( const String& r ) { if( pImp ) pImp->SetName( r ); } BOOL SwTextBlocks::IsOld() const { if (pImp) { short nType = pImp->GetFileType(); if (SWBLK_SW3 == nType || SWBLK_SW2 == nType ) return TRUE; } return FALSE; } ULONG SwTextBlocks::ConvertToNew() { // Wir nehmen die aktuelle Datei, benennen diese in .BAK um // und kreieren den neuen Storage if( IsOld() ) { // Erst mal muessen wir die Datei freigeben short nType = pImp->GetFileType(); Sw2TextBlocks *pTwo = NULL; Sw3TextBlocks *pThree = NULL; SwImpBlocks *pOld = NULL; pImp->nCur = (USHORT) -1; String aName( pImp->aFile ); delete pImp; pImp = NULL; // Jetzt wird umbenannt INetURLObject aOldFull( aName ); INetURLObject aNewFull( aName ); aOldFull.SetExtension( String::CreateFromAscii("bak") ); String aOld( aOldFull.GetMainURL( INetURLObject::NO_DECODE ) ); String aNew( aNewFull.GetMainURL( INetURLObject::NO_DECODE ) ); BOOL bError = !SWUnoHelper::UCB_CopyFile( aNew, aOld, TRUE ); if( bError ) { if (nType == SWBLK_SW2) pImp = new Sw2TextBlocks( aOld ); else pImp = new Sw3TextBlocks( aOld ); return nErr = ERR_SWG_CANNOT_WRITE; } // Die Datei ist erfolgreich umbenannt. Jetzt wird der Storage // aufgesetzt if (nType == SWBLK_SW2) pOld = pTwo = new Sw2TextBlocks( aOld ); else pOld = pThree = new Sw3TextBlocks( aOld ); SwXMLTextBlocks* pNew = new SwXMLTextBlocks( aName ); pNew->SetName ( pOld->GetName()); // Wir kopieren den Doc-Ptr in das alte System // den alten SvPersist heben wir uns aber auf, // da dieser die ganze Zeit leben bleibt // und lesen die Dateivorlagen erneut ein SvPersist* pPersist2 = pOld->pDoc->GetPersist(); if (SWBLK_SW2 == nType ) { delete pOld->pDoc; pOld->pDoc = pNew->pDoc; nErr = pTwo->LoadDoc(); } else { nErr = pThree->OpenFile ( TRUE ); // Within this call, Sw3IoImp::SetDoc calls RemoveLink // on the old document, and deletes it if the // ref count is now zero pThree->SetDoc ( pNew->pDoc ); pOld->pDoc->AddLink(); } if( !nErr && 0 == ( nErr = pNew->OpenFile( FALSE )) ) { nErr = pNew->SetConvertMode( TRUE ); // jetzt werden die Bausteine einfach umkopiert! if( !nErr ) { if (SWBLK_SW2 == nType) pTwo->StatLineStartPercent(); USHORT nCount = pOld->GetCount(); for( USHORT i = 0; i < nCount; i++ ) { pNew->ClearDoc(); String aShort( pOld->GetShortName( i ) ); String aLong( pOld->GetLongName( i ) ); pNew->AddName( aShort, aLong ); if ( SWBLK_SW3 == nType && pThree->IsOnlyTextBlock(aShort) ) { String sText; pThree->GetText( aShort, sText ); pNew->PutText( aShort, aLong, sText ); } else { if (SWBLK_SW2 == nType ) { // I think this is how it should work (!!!!!!) mtg pNew->pDoc->SetPersist( pPersist2 ); } nErr = pOld->GetDocForConversion( i ); if( nErr ) break; nErr = pNew->BeginPutDoc( aShort, aLong ); if( nErr ) break; nErr = pNew->PutDoc(); if( nErr ) break; } // convert macros, too SvxMacroTableDtor aMacroTable; pOld->GetMacroTable( i, aMacroTable, sal_True ); pNew->SetMacroTable( i, aMacroTable, sal_True ); if (SWBLK_SW2 == nType ) pNew->pDoc->SetPersist( 0 ); } if (SWBLK_SW2 == nType ) ::EndProgress( pOld->pDoc->GetDocShell() ); } if( !nErr ) nErr = pNew->SetConvertMode( FALSE ); } if ( SWBLK_SW3 == nType ) { pThree->CloseFile(); } else { // Haben wir es geschafft? pOld->pDoc = NULL; } pNew->ClearDoc(); if( !nErr ) { delete pOld; pImp = pNew; SWUnoHelper::UCB_DeleteFile( aOld ); pNew->MakeBlockList(); } else { delete pOld; delete pNew; SWUnoHelper::UCB_DeleteFile( aNew ); SWUnoHelper::UCB_CopyFile( aOld, aNew, TRUE ); if ( SWBLK_SW2 == nType ) pImp = new Sw2TextBlocks( aOld ); else pImp = new Sw3TextBlocks( aOld ); } pNew->CloseFile(); FStatHelper::GetModifiedDateTimeOfFile( aNew, &pImp->aDateModified, &pImp->aTimeModified ); } return nErr; } USHORT SwTextBlocks::GetCount() const { return pImp ? pImp->GetCount() : 0; } USHORT SwTextBlocks::GetIndex( const String& r ) const { return pImp ? pImp->GetIndex( r ) : (USHORT) -1; } USHORT SwTextBlocks::GetLongIndex( const String& r ) const { return pImp ? (USHORT)(pImp->GetLongIndex( r )) : (USHORT) -1; } const String& SwTextBlocks::GetShortName( USHORT n ) const { if( pImp ) return pImp->GetShortName( n ); return aEmptyStr; } const String& SwTextBlocks::GetLongName( USHORT n ) const { if( pImp ) return pImp->GetLongName( n ); return aEmptyStr; } BOOL SwTextBlocks::Delete( USHORT n ) { if( pImp && !pImp->bInPutMuchBlocks ) { if( pImp->IsFileChanged() ) nErr = ERR_TXTBLOCK_NEWFILE_ERROR; else if( 0 == (nErr = pImp->OpenFile( FALSE ) )) { nErr = pImp->Delete( n ); if( !nErr ) pImp->aNames.DeleteAndDestroy( n ); if( n == pImp->nCur ) pImp->nCur = (USHORT) -1; if( !nErr ) nErr = pImp->MakeBlockList(); } pImp->CloseFile(); pImp->Touch(); return BOOL( nErr == 0 ); } return FALSE; } USHORT SwTextBlocks::Rename( USHORT n, const String* s, const String* l ) { USHORT nIdx = (USHORT)-1; if( pImp && !pImp->bInPutMuchBlocks ) { pImp->nCur = nIdx; String aNew, aLong; if( s ) aNew = aLong = *s; if( l ) aLong = *l; if( !aNew.Len() ) { ASSERT( !this, "Kein Kurzname in Rename angegeben" ); nErr = ERR_SWG_INTERNAL_ERROR; return (USHORT) -1; } if( pImp->IsFileChanged() ) nErr = ERR_TXTBLOCK_NEWFILE_ERROR; else if( 0 == ( nErr = pImp->OpenFile( FALSE ))) { // Vorher den neuen Eintrag in die Liste setzen! GetAppCharClass().toUpper( aNew ); nErr = pImp->Rename( n, aNew, aLong ); if( !nErr ) { BOOL bOnlyTxt = pImp->aNames[ n ]->bIsOnlyTxt; pImp->aNames.DeleteAndDestroy( n ); pImp->AddName( aNew, aLong, bOnlyTxt ); nErr = pImp->MakeBlockList(); } } pImp->CloseFile(); pImp->Touch(); if( !nErr ) nIdx = pImp->GetIndex( aNew ); } return nIdx; } ULONG SwTextBlocks::CopyBlock( SwTextBlocks& rSource, String& rSrcShort, const String& rLong ) { BOOL bIsOld = FALSE; if (rSource.pImp) { short nType = rSource.pImp->GetFileType(); if (SWBLK_SW2 == nType || SWBLK_SW3 == nType ) bIsOld = TRUE; } if( bIsOld ) //rSource.IsOld() ) nErr = ERR_SWG_OLD_GLOSSARY; else if( pImp->bInPutMuchBlocks ) nErr = ERR_SWG_INTERNAL_ERROR; else nErr = pImp->CopyBlock(*rSource.pImp, rSrcShort, rLong); return nErr; } BOOL SwTextBlocks::BeginGetDoc( USHORT n ) { if( pImp && !pImp->bInPutMuchBlocks ) { // diese Optimierierung darf es nicht mehr geben. OLE-Objecte muessen auf // ihre SubStorages zugreifem koennen! // if( n == pImp->nCur ) // return TRUE; if( pImp->IsFileChanged() ) nErr = ERR_TXTBLOCK_NEWFILE_ERROR; else if( 0 == ( nErr = pImp->OpenFile( TRUE ))) { pImp->ClearDoc(); nErr = pImp->GetDoc( n ); if( nErr ) pImp->nCur = (USHORT)-1; else pImp->nCur = n; } return BOOL( nErr == 0 ); } return FALSE; } void SwTextBlocks::EndGetDoc() { if( pImp && !pImp->bInPutMuchBlocks ) pImp->CloseFile(); } BOOL SwTextBlocks::BeginPutDoc( const String& s, const String& l ) { if( pImp ) { BOOL bOk = pImp->bInPutMuchBlocks; if( !bOk ) { if( pImp->IsFileChanged() ) nErr = ERR_TXTBLOCK_NEWFILE_ERROR; else nErr = pImp->OpenFile( FALSE ); bOk = 0 == nErr; } if( bOk ) { String aNew( s ); GetAppCharClass().toUpper( aNew ); nErr = pImp->BeginPutDoc( aNew, l ); } if( nErr ) pImp->CloseFile(); } return 0 == nErr; } USHORT SwTextBlocks::PutDoc() { USHORT nIdx = (USHORT)-1; if( pImp ) { nErr = pImp->PutDoc(); if( !nErr ) { pImp->nCur = GetIndex( pImp->aShort ); if( pImp->nCur != (USHORT) -1 ) pImp->aNames[ pImp->nCur ]->aLong = pImp->aLong; else { pImp->AddName( pImp->aShort, pImp->aLong ); pImp->nCur = pImp->GetIndex( pImp->aShort ); } if( !pImp->bInPutMuchBlocks ) nErr = pImp->MakeBlockList(); } if( !pImp->bInPutMuchBlocks ) { pImp->CloseFile(); pImp->Touch(); } nIdx = pImp->nCur; } return nIdx; } const String& SwTextBlocks::GetText( USHORT n ) { if( pImp && !pImp->bInPutMuchBlocks ) { if( pImp->IsFileChanged() ) nErr = ERR_TXTBLOCK_NEWFILE_ERROR; else if( 0 == ( nErr = pImp->OpenFile( TRUE ))) { nErr = pImp->GetText( n, pImp->aCur ); pImp->CloseFile(); if( !nErr ) return pImp->aCur; } } return aEmptyStr; } USHORT SwTextBlocks::PutText( const String& rShort, const String& rName, const String& rTxt ) { USHORT nIdx = (USHORT) -1; if( pImp ) { BOOL bOk = pImp->bInPutMuchBlocks; if( !bOk ) { if( pImp->IsFileChanged() ) nErr = ERR_TXTBLOCK_NEWFILE_ERROR; else nErr = pImp->OpenFile( FALSE ); bOk = 0 == nErr; } if( bOk ) { String aNew( rShort ); GetAppCharClass().toUpper( aNew ); nErr = pImp->PutText( aNew, rName, rTxt ); pImp->nCur = (USHORT) -1; if( !nErr ) { nIdx = GetIndex( pImp->aShort ); if( nIdx != (USHORT) -1 ) pImp->aNames[ nIdx ]->aLong = rName; else { pImp->AddName( pImp->aShort, rName, TRUE ); nIdx = pImp->GetIndex( pImp->aShort ); } if( !pImp->bInPutMuchBlocks ) nErr = pImp->MakeBlockList(); } } if( !pImp->bInPutMuchBlocks ) { pImp->CloseFile(); pImp->Touch(); } } return nIdx; } SwDoc* SwTextBlocks::GetDoc() { if( pImp ) return pImp->pDoc; return 0; } void SwTextBlocks::ClearDoc() { if( pImp ) pImp->ClearDoc(); pImp->nCur = (USHORT) -1; } const String& SwTextBlocks::GetFileName() const { return pImp->GetFileName(); } BOOL SwTextBlocks::IsReadOnly() const { return pImp->bReadOnly; } BOOL SwTextBlocks::IsOnlyTextBlock( USHORT nIdx ) const { BOOL bRet = FALSE; if( pImp && !pImp->bInPutMuchBlocks ) { SwBlockName* pBlkNm = pImp->aNames[ nIdx ]; if( !pBlkNm->bIsOnlyTxtFlagInit && !pImp->IsFileChanged() && !pImp->OpenFile( TRUE ) ) { pBlkNm->bIsOnlyTxt = pImp->IsOnlyTextBlock( pBlkNm->aShort ); pBlkNm->bIsOnlyTxtFlagInit = TRUE; pImp->CloseFile(); } bRet = pBlkNm->bIsOnlyTxt; } return bRet; } BOOL SwTextBlocks::IsOnlyTextBlock( const String& rShort ) const { USHORT nIdx = pImp->GetIndex( rShort ); if( USHRT_MAX != nIdx ) { if( pImp->aNames[ nIdx ]->bIsOnlyTxtFlagInit ) return pImp->aNames[ nIdx ]->bIsOnlyTxt; return IsOnlyTextBlock( nIdx ); } ASSERT( !this, "ungueltiger Name" ); return FALSE; } BOOL SwTextBlocks::GetMacroTable( USHORT nIdx, SvxMacroTableDtor& rMacroTbl ) { return ( pImp && !pImp->bInPutMuchBlocks ) ? 0 == pImp->GetMacroTable( nIdx, rMacroTbl ) : TRUE; } BOOL SwTextBlocks::SetMacroTable( USHORT nIdx, const SvxMacroTableDtor& rMacroTbl ) { return ( pImp && !pImp->bInPutMuchBlocks ) ? 0 == pImp->SetMacroTable( nIdx, rMacroTbl ) : TRUE; } String SwTextBlocks::GetValidShortCut( const String& rLong, BOOL bCheckInBlock ) const { String sRet; xub_StrLen nLen = rLong.Len(); if( nLen ) { xub_StrLen nStart = 0; while( ' ' == rLong.GetChar( nStart ) ) if( ++nStart < nLen ) break; if( nStart < nLen ) { sal_Unicode cCurr, cPrev = rLong.GetChar( nStart ); sRet = cPrev; for( ++nStart; nStart < nLen; ++nStart, cPrev = cCurr ) if( ' ' == cPrev && ' ' != ( cCurr = rLong.GetChar( nStart )) ) sRet += cCurr; } if( bCheckInBlock ) { USHORT nCurPos = GetIndex( sRet ); nStart = 0; nLen = sRet.Len(); while( (USHORT)-1 != nCurPos ) { sRet.Erase( nLen ) += String::CreateFromInt32( ++nStart );// add an Number to it nCurPos = GetIndex( sRet ); } } } return sRet; } BOOL SwTextBlocks::StartPutMuchBlockEntries() { BOOL bRet = FALSE; if( !IsOld() && pImp ) bRet = pImp->PutMuchEntries( TRUE ); return bRet; } void SwTextBlocks::EndPutMuchBlockEntries() { if( pImp ) pImp->PutMuchEntries( FALSE ); }