/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sw.hxx" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // fuer die UndoIds #include #include #include #include #include #include #include using namespace ::com::sun::star; enum SwSplitDocType { SPLITDOC_TO_GLOBALDOC, SPLITDOC_TO_HTML }; sal_Bool SwDoc::GenerateGlobalDoc( const String& rPath, const SwTxtFmtColl* pSplitColl ) { return SplitDoc( SPLITDOC_TO_GLOBALDOC, rPath, pSplitColl ); } //#outline level,add by zhaojianwei sal_Bool SwDoc::GenerateGlobalDoc( const String& rPath, int nOutlineLevel ) { return SplitDoc( SPLITDOC_TO_GLOBALDOC, rPath, nOutlineLevel ); } sal_Bool SwDoc::GenerateHTMLDoc( const String& rPath, int nOutlineLevel ) { return SplitDoc( SPLITDOC_TO_HTML, rPath, nOutlineLevel ); } //<-end,zhaojianwei sal_Bool SwDoc::GenerateHTMLDoc( const String& rPath, const SwTxtFmtColl* pSplitColl ) { #ifdef JP_TEST if( !pSplitColl ) { sal_uInt8 nLvl = 1; const SwTxtFmtColls& rFmtColls =*GetTxtFmtColls(); for( sal_uInt16 n = rFmtColls.Count(); n; ) //if( nLvl == rFmtColls[ --n ]->GetOutlineLevel() )//#outline level,zhaojianwei if( nLvl == rFmtColls[ --n ]->GetAttrOutlineLevel() -1 )//<-end,zhaojianwei 0814 { pSplitColl = rFmtColls[ n ]; break; } if( !pSplitColl ) pSplitColl = GetTxtCollFromPool( RES_POOLCOLL_HEADLINE2 ); } #endif return SplitDoc( SPLITDOC_TO_HTML, rPath, pSplitColl ); } sal_Bool SwDoc::SplitDoc( sal_uInt16 eDocType, const String& rPath, const SwTxtFmtColl* pSplitColl ) { // ueber alle Node der Vorlage Iterieren und dafuer einzelne // Dokumente erzeugen und in diesem gegen // - gelinkte Bereiche (GlobalDoc) // - Links (HTML) // austauschen. // Am Ende wird dieses Doc als GlobalDoc/HTML-Doc gespreichert. if( !pDocShell || !pDocShell->GetMedium() || ( SPLITDOC_TO_GLOBALDOC == eDocType && get(IDocumentSettingAccess::GLOBAL_DOCUMENT) ) ) return sal_False; sal_uInt16 nOutl = 0; SwOutlineNodes* pOutlNds = (SwOutlineNodes*)&GetNodes().GetOutLineNds(); SwNodePtr pSttNd; if( pSplitColl ) { // wenn keine OutlineNumerierung ist, dann benutze eigenes Array // und sammel die Nodes zusammen. if( pSplitColl->GetAttrOutlineLevel() == 0 ) { pOutlNds = new SwOutlineNodes( 8, 8 ); SwIterator aIter( *pSplitColl ); for( SwTxtNode* pTNd = aIter.First(); pTNd; pTNd = aIter.Next() ) if( pTNd->GetNodes().IsDocNodes() ) pOutlNds->Insert( pTNd ); if( !pOutlNds->Count() ) { delete pOutlNds; return sal_False; } } } else { // dann suche die Gliederungs - Vorlage, der 1. Ebene const SwTxtFmtColls& rFmtColls =*GetTxtFmtColls(); for( sal_uInt16 n = rFmtColls.Count(); n; ) //if( !rFmtColls[ --n ]->GetOutlineLevel() )//#outline level,zhaojianwei if ( rFmtColls[ --n ]->GetAttrOutlineLevel() == 1 )//<-end,zhaojianwei { pSplitColl = rFmtColls[ n ]; break; } if( !pSplitColl ) return sal_False; } const SfxFilter* pFilter; switch( eDocType ) { case SPLITDOC_TO_HTML: pFilter = SwIoSystem::GetFilterOfFormat( String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "HTML" ))); break; default: // case SPLITDOC_TO_GLOBALDOC: pFilter = SwIoSystem::GetFilterOfFormat( String::CreateFromAscii( FILTER_XML )); eDocType = SPLITDOC_TO_GLOBALDOC; break; } if( !pFilter ) return sal_False; // Undo/Redline aufjedenfall abschalten GetIDocumentUndoRedo().DoUndo(false); SetRedlineMode_intern( (RedlineMode_t)(GetRedlineMode() & ~nsRedlineMode_t::REDLINE_ON)); String sExt( pFilter->GetSuffixes().GetToken(0, ',') ); if( !sExt.Len() ) sExt.AssignAscii( "sxw" ); if( '.' != sExt.GetChar( 0 ) ) sExt.Insert( '.', 0 ); INetURLObject aEntry(rPath); String sLeading(aEntry.GetBase()); aEntry.removeSegment(); String sPath = aEntry.GetMainURL( INetURLObject::NO_DECODE ); utl::TempFile aTemp(sLeading,&sExt,&sPath ); aTemp.EnableKillingFile(); DateTime aTmplDate; { Time a2Min( 0 ); a2Min.SetMin( 2 ); aTmplDate += a2Min; } // alle Ungueltigen ueberspringen while( nOutl < pOutlNds->Count() && pOutlNds->GetObject( nOutl )->GetIndex() < GetNodes().GetEndOfExtras().GetIndex() ) ++nOutl; do { pSttNd = 0; SwNodePtr pNd; for( ; nOutl < pOutlNds->Count(); ++nOutl ) if( ( pNd = pOutlNds->GetObject( nOutl ))->GetTxtNode()-> GetTxtColl() == pSplitColl && !pNd->FindTableNode() ) { pSttNd = pNd; break; } if( pSttNd ) { SwNodePtr pEndNd = 0; for( ++nOutl; nOutl < pOutlNds->Count(); ++nOutl ) { pNd = pOutlNds->GetObject( nOutl ); SwTxtFmtColl* pTColl = pNd->GetTxtNode()->GetTxtColl(); //if( ( pTColl == pSplitColl || //#outline level,zhaojianwei // ( NO_NUMBERING != pSplitColl->GetOutlineLevel() && // pTColl->GetOutlineLevel() < // pSplitColl->GetOutlineLevel() )) && // !pNd->FindTableNode() ) if( ( pTColl == pSplitColl || ( pSplitColl->GetAttrOutlineLevel() > 0 && pTColl->GetAttrOutlineLevel() > 0 && pTColl->GetAttrOutlineLevel() < pSplitColl->GetAttrOutlineLevel() )) && !pNd->FindTableNode() ) //<-end,zhaojianwei { pEndNd = pNd; break; } } SwNodeIndex aEndIdx( pEndNd ? *pEndNd : GetNodes().GetEndOfContent() ); // die Nodes komplett rausschreiben String sFileName; if( pSttNd->GetIndex() + 1 < aEndIdx.GetIndex() ) { SfxObjectShellLock xDocSh( new SwDocShell( SFX_CREATE_MODE_INTERNAL )); if( xDocSh->DoInitNew( 0 ) ) { SwDoc* pDoc = ((SwDocShell*)(&xDocSh))->GetDoc(); uno::Reference xDPS( ((SwDocShell*)(&xDocSh))->GetModel(), uno::UNO_QUERY_THROW); uno::Reference xDocProps( xDPS->getDocumentProperties()); DBG_ASSERT(xDocProps.is(), "Doc has no DocumentProperties"); // the GlobalDoc is the template xDocProps->setTemplateName(aEmptyStr); ::util::DateTime uDT(aTmplDate.Get100Sec(), aTmplDate.GetSec(), aTmplDate.GetMin(), aTmplDate.GetHour(), aTmplDate.GetDay(), aTmplDate.GetMonth(), aTmplDate.GetYear()); xDocProps->setTemplateDate(uDT); xDocProps->setTemplateURL(rPath); //JP 14.06.99: Set the text of the "split para" as title // from the new doc. Is the current doc has // a title, insert it at begin. String sTitle( xDocProps->getTitle() ); if( sTitle.Len() ) sTitle.AppendAscii( RTL_CONSTASCII_STRINGPARAM( ": " )); sTitle += ((SwTxtNode*)pSttNd)->GetExpandTxt(); xDocProps->setTitle( sTitle ); // Vorlagen ersetzen pDoc->ReplaceStyles( *this ); // KapitelNumerierung uebernehmen if( pOutlineRule ) pDoc->SetOutlineNumRule( *pOutlineRule ); SwNodeRange aRg( *pSttNd, 0, aEndIdx.GetNode() ); SwNodeIndex aTmpIdx( pDoc->GetNodes().GetEndOfContent() ); GetNodes()._Copy( aRg, aTmpIdx, sal_False ); // den initialen TextNode loeschen SwNodeIndex aIdx( pDoc->GetNodes().GetEndOfExtras(), 2 ); if( aIdx.GetIndex() + 1 != pDoc->GetNodes().GetEndOfContent().GetIndex() ) pDoc->GetNodes().Delete( aIdx, 1 ); // alle Flys in dem Bereich CopyFlyInFlyImpl( aRg, 0, aIdx ); // und noch alle Bookmarks // ????? utl::TempFile aTempFile2(sLeading,&sExt,&sPath ); sFileName = aTempFile2.GetURL(); SfxMedium* pTmpMed = new SfxMedium( sFileName, STREAM_STD_READWRITE, sal_True ); pTmpMed->SetFilter( pFilter ); // fuer den HTML-Filter mussen wir aber ein Layout // haben, damit Textrahmen/Controls/OLE-Objecte korrekt // als Grafik exportiert werden koennen. if( SPLITDOC_TO_HTML == eDocType && pDoc->GetSpzFrmFmts()->Count() ) { /* SfxViewFrame* pFrame = */ SfxViewFrame::LoadHiddenDocument( *xDocSh, 0 ); } xDocSh->DoSaveAs( *pTmpMed ); xDocSh->DoSaveCompleted( pTmpMed ); // beim Fehler wird keine FileLinkSection eingefuegt if( xDocSh->GetError() ) sFileName.Erase(); } xDocSh->DoClose(); } // dann koennen ja die Bereiche eingefuegt werden if( sFileName.Len() ) { switch( eDocType ) { case SPLITDOC_TO_HTML: { // loesche alle Nodes im Bereich und setze im "Start- // Node" den Link auf das gespeicherte Doc sal_uLong nNodeDiff = aEndIdx.GetIndex() - pSttNd->GetIndex() - 1; if( nNodeDiff ) { SwPaM aTmp( *pSttNd, aEndIdx.GetNode(), 1, -1 ); aTmp.GetPoint()->nContent.Assign( 0, 0 ); aTmp.GetMark()->nContent.Assign( 0, 0 ); SwNodeIndex aSIdx( aTmp.GetMark()->nNode ); SwNodeIndex aEIdx( aTmp.GetPoint()->nNode ); // versuche hinters Ende zu verschieben if( !aTmp.Move( fnMoveForward, fnGoNode ) ) { // na gut, dann an den Anfang aTmp.Exchange(); if( !aTmp.Move( fnMoveBackward, fnGoNode )) { ASSERT( sal_False, "kein Node mehr vorhanden" ); } } // Bookmarks usw. verschieben CorrAbs( aSIdx, aEIdx, *aTmp.GetPoint(), sal_True); // stehen noch FlyFrames rum, loesche auch diese for( sal_uInt16 n = 0; n < GetSpzFrmFmts()->Count(); ++n ) { SwFrmFmt* pFly = (*GetSpzFrmFmts())[n]; const SwFmtAnchor* pAnchor = &pFly->GetAnchor(); SwPosition const*const pAPos = pAnchor->GetCntntAnchor(); if (pAPos && ((FLY_AT_PARA == pAnchor->GetAnchorId()) || (FLY_AT_CHAR == pAnchor->GetAnchorId())) && aSIdx <= pAPos->nNode && pAPos->nNode < aEIdx ) { DelLayoutFmt( pFly ); --n; } } GetNodes().Delete( aSIdx, nNodeDiff ); } // dann setze im StartNode noch den Link: SwFmtINetFmt aINet( sFileName , aEmptyStr ); SwTxtNode* pTNd = (SwTxtNode*)pSttNd; pTNd->InsertItem( aINet, 0, pTNd->GetTxt().Len() ); // wenn der nicht mehr gefunden wird, kann das nur // ein Bug sein! if( !pOutlNds->Seek_Entry( pSttNd, &nOutl )) pSttNd = 0; ++nOutl; } break; default: { String sNm( INetURLObject( sFileName ).GetName() ); SwSectionData aSectData( FILE_LINK_SECTION, GetUniqueSectionName( &sNm )); SwSectionFmt* pFmt = MakeSectionFmt( 0 ); aSectData.SetLinkFileName(sFileName); aSectData.SetProtectFlag(true); aEndIdx--; // im InsertSection ist Ende inclusive while( aEndIdx.GetNode().IsStartNode() ) aEndIdx--; // JP 06.07.99 - Bug 67361 - is any Section ends or // starts in the new sectionrange, they must end or // start before or behind the range! SwSectionNode* pSectNd = pSttNd->FindSectionNode(); while( pSectNd && pSectNd->EndOfSectionIndex() <= aEndIdx.GetIndex() ) { const SwNode* pSectEnd = pSectNd->EndOfSectionNode(); if( pSectNd->GetIndex() + 1 == pSttNd->GetIndex() ) { sal_Bool bMvIdx = aEndIdx == *pSectEnd; DelSectionFmt( pSectNd->GetSection().GetFmt() ); if( bMvIdx ) aEndIdx--; } else { SwNodeRange aRg( *pSttNd, *pSectEnd ); SwNodeIndex aIdx( *pSectEnd, 1 ); GetNodes()._MoveNodes( aRg, GetNodes(), aIdx ); } pSectNd = pSttNd->FindSectionNode(); } pSectNd = aEndIdx.GetNode().FindSectionNode(); while( pSectNd && pSectNd->GetIndex() > pSttNd->GetIndex() ) { // #i15712# don't attempt to split sections if // they are fully enclosed in [pSectNd,aEndIdx]. if( aEndIdx < pSectNd->EndOfSectionIndex() ) { SwNodeRange aRg( *pSectNd, 1, aEndIdx, 1 ); SwNodeIndex aIdx( *pSectNd ); GetNodes()._MoveNodes( aRg, GetNodes(), aIdx ); } pSectNd = pSttNd->FindSectionNode(); } // -> #i26762# // Ensure order of start and end of section is sane. SwNodeIndex aStartIdx(*pSttNd); if (aEndIdx >= aStartIdx) { pSectNd = GetNodes().InsertTextSection(aStartIdx, *pFmt, aSectData, 0, &aEndIdx, false); } else { pSectNd = GetNodes().InsertTextSection(aEndIdx, *pFmt, aSectData, 0, &aStartIdx, false); } // <- #i26762# pSectNd->GetSection().CreateLink( CREATE_CONNECT ); } break; } } } } while( pSttNd ); // if( pOutlNds != (SwOutlineNodes*)&GetNodes().GetOutLineNds(); if( pOutlNds != &GetNodes().GetOutLineNds() ) delete pOutlNds; switch( eDocType ) { case SPLITDOC_TO_HTML: if( get(IDocumentSettingAccess::GLOBAL_DOCUMENT) ) { // dann alles verbliebenen Bereiche aufheben while( GetSections().Count() ) DelSectionFmt( GetSections()[ 0 ] ); SfxFilterContainer* pFCntnr = pDocShell->GetFactory().GetFilterContainer(); pFilter = pFCntnr->GetFilter4EA( pFilter->GetTypeName(), SFX_FILTER_EXPORT ); } break; // case SPLITDOC_TO_GLOBALDOC: default: // dann das Globaldoc speichern set(IDocumentSettingAccess::GLOBAL_DOCUMENT, true); set(IDocumentSettingAccess::GLOBAL_DOCUMENT_SAVE_LINKS, false); } // Medium istn't locked after reopen the document. Bug 91462 SfxRequest aReq( SID_SAVEASDOC, SFX_CALLMODE_SYNCHRON, GetAttrPool() ); aReq.AppendItem( SfxStringItem( SID_FILE_NAME, rPath ) ); aReq.AppendItem( SfxBoolItem( SID_SAVETO, sal_True ) ); if(pFilter) aReq.AppendItem( SfxStringItem( SID_FILTER_NAME, pFilter->GetName() ) ); const SfxBoolItem *pRet = (const SfxBoolItem*)pDocShell->ExecuteSlot( aReq ); return pRet && pRet->GetValue(); } //#outline level,add by zhaojianwei sal_Bool SwDoc::SplitDoc( sal_uInt16 eDocType, const String& rPath, int nOutlineLevel ) { if( !pDocShell || !pDocShell->GetMedium() || ( SPLITDOC_TO_GLOBALDOC == eDocType && get(IDocumentSettingAccess::GLOBAL_DOCUMENT) ) ) return sal_False; sal_uInt16 nOutl = 0; SwOutlineNodes* pOutlNds = (SwOutlineNodes*)&GetNodes().GetOutLineNds(); SwNodePtr pSttNd; const SfxFilter* pFilter; switch( eDocType ) { case SPLITDOC_TO_HTML: pFilter = SwIoSystem::GetFilterOfFormat( String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "HTML" ))); break; default: // case SPLITDOC_TO_GLOBALDOC: pFilter = SwIoSystem::GetFilterOfFormat( String::CreateFromAscii( FILTER_XML )); eDocType = SPLITDOC_TO_GLOBALDOC; break; } if( !pFilter ) return sal_False; // Undo/Redline aufjedenfall abschalten GetIDocumentUndoRedo().DoUndo(false); SetRedlineMode_intern( (RedlineMode_t)(GetRedlineMode() & ~nsRedlineMode_t::REDLINE_ON)); String sExt( pFilter->GetSuffixes().GetToken(0, ',') ); if( !sExt.Len() ) sExt.AssignAscii( "sxw" ); if( '.' != sExt.GetChar( 0 ) ) sExt.Insert( '.', 0 ); INetURLObject aEntry(rPath); String sLeading(aEntry.GetBase()); aEntry.removeSegment(); String sPath = aEntry.GetMainURL( INetURLObject::NO_DECODE ); utl::TempFile aTemp(sLeading,&sExt,&sPath ); aTemp.EnableKillingFile(); DateTime aTmplDate; { Time a2Min( 0 ); a2Min.SetMin( 2 ); aTmplDate += a2Min; } // alle Ungueltigen ueberspringen while( nOutl < pOutlNds->Count() && pOutlNds->GetObject( nOutl )->GetIndex() < GetNodes().GetEndOfExtras().GetIndex() ) ++nOutl; do { pSttNd = 0; SwNodePtr pNd; for( ; nOutl < pOutlNds->Count(); ++nOutl ) if( ( pNd = pOutlNds->GetObject( nOutl ))->GetTxtNode()->GetAttrOutlineLevel() == nOutlineLevel && !pNd->FindTableNode() ) { pSttNd = pNd; break; } if( pSttNd ) { SwNodePtr pEndNd = 0; for( ++nOutl; nOutl < pOutlNds->Count(); ++nOutl ) { pNd = pOutlNds->GetObject( nOutl ); const int nLevel = pNd->GetTxtNode()->GetAttrOutlineLevel(); if( ( 0 < nLevel && nLevel <= nOutlineLevel ) && !pNd->FindTableNode() ) { pEndNd = pNd; break; } } SwNodeIndex aEndIdx( pEndNd ? *pEndNd : GetNodes().GetEndOfContent() ); String sFileName; if( pSttNd->GetIndex() + 1 < aEndIdx.GetIndex() ) { SfxObjectShellLock xDocSh( new SwDocShell( SFX_CREATE_MODE_INTERNAL )); if( xDocSh->DoInitNew( 0 ) ) { SwDoc* pDoc = ((SwDocShell*)(&xDocSh))->GetDoc(); uno::Reference xDPS( ((SwDocShell*)(&xDocSh))->GetModel(), uno::UNO_QUERY_THROW); uno::Reference xDocProps( xDPS->getDocumentProperties()); DBG_ASSERT(xDocProps.is(), "Doc has no DocumentProperties"); // the GlobalDoc is the template xDocProps->setTemplateName(aEmptyStr); ::util::DateTime uDT(aTmplDate.Get100Sec(), aTmplDate.GetSec(), aTmplDate.GetMin(), aTmplDate.GetHour(), aTmplDate.GetDay(), aTmplDate.GetMonth(), aTmplDate.GetYear()); xDocProps->setTemplateDate(uDT); xDocProps->setTemplateURL(rPath); //JP 14.06.99: Set the text of the "split para" as title // from the new doc. Is the current doc has // a title, insert it at begin. String sTitle( xDocProps->getTitle() ); if( sTitle.Len() ) sTitle.AppendAscii( RTL_CONSTASCII_STRINGPARAM( ": " )); sTitle += ((SwTxtNode*)pSttNd)->GetExpandTxt(); xDocProps->setTitle( sTitle ); // Vorlagen ersetzen pDoc->ReplaceStyles( *this ); // KapitelNumerierung uebernehmen if( pOutlineRule ) pDoc->SetOutlineNumRule( *pOutlineRule ); SwNodeRange aRg( *pSttNd, 0, aEndIdx.GetNode() ); SwNodeIndex aTmpIdx( pDoc->GetNodes().GetEndOfContent() ); GetNodes()._Copy( aRg, aTmpIdx, sal_False ); // den initialen TextNode loeschen SwNodeIndex aIdx( pDoc->GetNodes().GetEndOfExtras(), 2 ); if( aIdx.GetIndex() + 1 != pDoc->GetNodes().GetEndOfContent().GetIndex() ) pDoc->GetNodes().Delete( aIdx, 1 ); // alle Flys in dem Bereich CopyFlyInFlyImpl( aRg, 0, aIdx ); // und noch alle Bookmarks // ????? utl::TempFile aTempFile2(sLeading,&sExt,&sPath ); sFileName = aTempFile2.GetURL(); SfxMedium* pTmpMed = new SfxMedium( sFileName, STREAM_STD_READWRITE, sal_True ); pTmpMed->SetFilter( pFilter ); // fuer den HTML-Filter mussen wir aber ein Layout // haben, damit Textrahmen/Controls/OLE-Objecte korrekt // als Grafik exportiert werden koennen. if( SPLITDOC_TO_HTML == eDocType && pDoc->GetSpzFrmFmts()->Count() ) { /* SfxViewFrame* pFrame = */ SfxViewFrame::LoadHiddenDocument( *xDocSh, 0 ); } xDocSh->DoSaveAs( *pTmpMed ); xDocSh->DoSaveCompleted( pTmpMed ); // beim Fehler wird keine FileLinkSection eingefuegt if( xDocSh->GetError() ) sFileName.Erase(); } xDocSh->DoClose(); } // dann koennen ja die Bereiche eingefuegt werden if( sFileName.Len() ) { switch( eDocType ) { case SPLITDOC_TO_HTML: { // loesche alle Nodes im Bereich und setze im "Start- // Node" den Link auf das gespeicherte Doc sal_uLong nNodeDiff = aEndIdx.GetIndex() - pSttNd->GetIndex() - 1; if( nNodeDiff ) { SwPaM aTmp( *pSttNd, aEndIdx.GetNode(), 1, -1 ); aTmp.GetPoint()->nContent.Assign( 0, 0 ); aTmp.GetMark()->nContent.Assign( 0, 0 ); SwNodeIndex aSIdx( aTmp.GetMark()->nNode ); SwNodeIndex aEIdx( aTmp.GetPoint()->nNode ); // versuche hinters Ende zu verschieben if( !aTmp.Move( fnMoveForward, fnGoNode ) ) { // na gut, dann an den Anfang aTmp.Exchange(); if( !aTmp.Move( fnMoveBackward, fnGoNode )) { ASSERT( sal_False, "kein Node mehr vorhanden" ); } } // Bookmarks usw. verschieben CorrAbs( aSIdx, aEIdx, *aTmp.GetPoint(), sal_True); // stehen noch FlyFrames rum, loesche auch diese for( sal_uInt16 n = 0; n < GetSpzFrmFmts()->Count(); ++n ) { SwFrmFmt* pFly = (*GetSpzFrmFmts())[n]; const SwFmtAnchor* pAnchor = &pFly->GetAnchor(); SwPosition const*const pAPos = pAnchor->GetCntntAnchor(); if (pAPos && ((FLY_AT_PARA == pAnchor->GetAnchorId()) || (FLY_AT_CHAR == pAnchor->GetAnchorId())) && aSIdx <= pAPos->nNode && pAPos->nNode < aEIdx ) { DelLayoutFmt( pFly ); --n; } } GetNodes().Delete( aSIdx, nNodeDiff ); } // dann setze im StartNode noch den Link: SwFmtINetFmt aINet( sFileName , aEmptyStr ); SwTxtNode* pTNd = (SwTxtNode*)pSttNd; pTNd->InsertItem( aINet, 0, pTNd->GetTxt().Len() ); // wenn der nicht mehr gefunden wird, kann das nur // ein Bug sein! if( !pOutlNds->Seek_Entry( pSttNd, &nOutl )) pSttNd = 0; ++nOutl; } break; default: { String sNm( INetURLObject( sFileName ).GetName() ); SwSectionData aSectData( FILE_LINK_SECTION, GetUniqueSectionName( &sNm )); SwSectionFmt* pFmt = MakeSectionFmt( 0 ); aSectData.SetLinkFileName(sFileName); aSectData.SetProtectFlag(true); aEndIdx--; // im InsertSection ist Ende inclusive while( aEndIdx.GetNode().IsStartNode() ) aEndIdx--; // JP 06.07.99 - Bug 67361 - is any Section ends or // starts in the new sectionrange, they must end or // start before or behind the range! SwSectionNode* pSectNd = pSttNd->FindSectionNode(); while( pSectNd && pSectNd->EndOfSectionIndex() <= aEndIdx.GetIndex() ) { const SwNode* pSectEnd = pSectNd->EndOfSectionNode(); if( pSectNd->GetIndex() + 1 == pSttNd->GetIndex() ) { sal_Bool bMvIdx = aEndIdx == *pSectEnd; DelSectionFmt( pSectNd->GetSection().GetFmt() ); if( bMvIdx ) aEndIdx--; } else { SwNodeRange aRg( *pSttNd, *pSectEnd ); SwNodeIndex aIdx( *pSectEnd, 1 ); GetNodes()._MoveNodes( aRg, GetNodes(), aIdx ); } pSectNd = pSttNd->FindSectionNode(); } pSectNd = aEndIdx.GetNode().FindSectionNode(); while( pSectNd && pSectNd->GetIndex() > pSttNd->GetIndex() ) { if( aEndIdx < pSectNd->EndOfSectionIndex() ) { SwNodeRange aRg( *pSectNd, 1, aEndIdx, 1 ); SwNodeIndex aIdx( *pSectNd ); GetNodes()._MoveNodes( aRg, GetNodes(), aIdx ); } pSectNd = pSttNd->FindSectionNode(); } SwNodeIndex aStartIdx(*pSttNd); if (aEndIdx >= aStartIdx) { pSectNd = GetNodes().InsertTextSection(aStartIdx, *pFmt, aSectData, 0, &aEndIdx, false); } else { pSectNd = GetNodes().InsertTextSection(aEndIdx, *pFmt, aSectData, 0, &aStartIdx, false); } pSectNd->GetSection().CreateLink( CREATE_CONNECT ); } break; } } } } while( pSttNd ); if( pOutlNds != &GetNodes().GetOutLineNds() ) delete pOutlNds; switch( eDocType ) { case SPLITDOC_TO_HTML: if( get(IDocumentSettingAccess::GLOBAL_DOCUMENT) ) { while( GetSections().Count() ) DelSectionFmt( GetSections()[ 0 ] ); SfxFilterContainer* pFCntnr = pDocShell->GetFactory().GetFilterContainer(); pFilter = pFCntnr->GetFilter4EA( pFilter->GetTypeName(), SFX_FILTER_EXPORT ); } break; // case SPLITDOC_TO_GLOBALDOC: default: set(IDocumentSettingAccess::GLOBAL_DOCUMENT, true); set(IDocumentSettingAccess::GLOBAL_DOCUMENT_SAVE_LINKS, false); } SfxRequest aReq( SID_SAVEASDOC, SFX_CALLMODE_SYNCHRON, GetAttrPool() ); aReq.AppendItem( SfxStringItem( SID_FILE_NAME, rPath ) ); aReq.AppendItem( SfxBoolItem( SID_SAVETO, sal_True ) ); if(pFilter) aReq.AppendItem( SfxStringItem( SID_FILTER_NAME, pFilter->GetName() ) ); const SfxBoolItem *pRet = (const SfxBoolItem*)pDocShell->ExecuteSlot( aReq ); return pRet && pRet->GetValue(); }//<-end,zhaojianwei