sw/source/uibase/dbui/dbmgr.cxx | 171 ++++++++++++++++++++-------------------- 1 file changed, 89 insertions(+), 82 deletions(-)
New commits: commit 1f9b3d0dab74687773f8a6e0e949a6fdda5a6bdb Author: Jan-Marek Glogowski <glo...@fbihome.de> Date: Tue Jul 1 21:42:30 2014 +0200 Normalize SwDBManager::Merge{MailFiles,Documents} There is still a difference, if run mail merge throught one or the other function (MM wizard or UNO). Change-Id: Ia372bd3edea4c8dfb58e045fc8fed2efcb2a4fde diff --git a/sw/source/uibase/dbui/dbmgr.cxx b/sw/source/uibase/dbui/dbmgr.cxx index 61bfd68..0601873 100644 --- a/sw/source/uibase/dbui/dbmgr.cxx +++ b/sw/source/uibase/dbui/dbmgr.cxx @@ -942,21 +942,23 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell, //copy the styles from the source to the target document pTargetView->GetDocShell()->_LoadStyles( *pSourceDocSh, true ); + //determine the page style and number used at the start of the source document pSourceShell->SttEndDoc(true); nStartingPageNo = pSourceShell->GetVirtPageNum(); sStartingPageDesc = sModifiedStartingPageDesc = pSourceShell->GetPageDesc( pSourceShell->GetCurPageDesc()).GetName(); - // copy compatibility options - lcl_CopyCompatibilityOptions( *pSourceShell, *pTargetShell); - // #72821# copy dynamic defaults - lcl_CopyDynamicDefaults( *pSourceShell->GetDoc(), *pTargetShell->GetDoc() ); + // #i72517# const SwPageDesc* pSourcePageDesc = pSourceShell->FindPageDescByName( sStartingPageDesc ); const SwFrmFmt& rMaster = pSourcePageDesc->GetMaster(); bPageStylesWithHeaderFooter = rMaster.GetHeader().IsActive() || rMaster.GetFooter().IsActive(); + // copy compatibility options + lcl_CopyCompatibilityOptions( *pSourceShell, *pTargetShell); + // #72821# copy dynamic defaults + lcl_CopyDynamicDefaults( *pSourceShell->GetDoc(), *pTargetShell->GetDoc() ); } PrintMonitor aPrtMonDlg(&pSourceShell->GetView().GetEditWin(), PrintMonitor::MONITOR_TYPE_PRINT); @@ -1046,18 +1048,25 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell, lcl_SaveDoc( xWorkDocSh, "WorkDoc", nDocNo ); #endif - { //create a view frame for the document - SfxViewFrame* pWorkFrame = SfxViewFrame::LoadHiddenDocument( *xWorkDocSh, 0 ); + SwView* pWorkView = static_cast< SwView* >( SfxViewFrame::LoadHiddenDocument( *xWorkDocSh, 0 )->GetViewShell() ); //request the layout calculation - SwWrtShell& rWorkShell = - static_cast< SwView* >(pWorkFrame->GetViewShell())->GetWrtShell(); - rWorkShell.CalcLayout(); - SwDoc* pWorkDoc = ((SwDocShell*)(&xWorkDocSh))->GetDoc(); + SwWrtShell& rWorkShell = pWorkView->GetWrtShell(); + pWorkView->AttrChangedNotify( &rWorkShell );// in order for SelectShell to be called + + SwDoc* pWorkDoc = rWorkShell.GetDoc(); SwDBManager* pOldDBManager = pWorkDoc->GetDBManager(); pWorkDoc->SetDBManager( this ); + pWorkDoc->EmbedAllLinks(); + + // #i69485# lock fields to prevent access to the result set while calculating layout + rWorkShell.LockExpFlds(); + rWorkShell.CalcLayout(); + rWorkShell.UnlockExpFlds(); + SfxGetpApp()->NotifyEvent(SfxEventHint(SW_EVENT_FIELD_MERGE, SwDocShell::GetEventName(STR_SW_EVENT_FIELD_MERGE), xWorkDocSh)); - pWorkDoc->UpdateFlds(NULL, false); +// pWorkDoc->UpdateFlds(NULL, false); + rWorkShell.SwViewShell::UpdateFlds(); SfxGetpApp()->NotifyEvent(SfxEventHint(SW_EVENT_FIELD_MERGE_FINISHED, SwDocShell::GetEventName(STR_SW_EVENT_FIELD_MERGE_FINISHED), xWorkDocSh)); pWorkDoc->RemoveInvisibleContent(); @@ -1226,7 +1235,7 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell, } } pWorkDoc->SetDBManager( pOldDBManager ); - } + xWorkDocSh->DoClose(); } } @@ -2728,7 +2737,8 @@ sal_Int32 SwDBManager::MergeDocuments( SwMailMergeConfigItem& rMMConfig, SwWrtShell& rSourceShell = rSourceView.GetWrtShell(); bool bSynchronizedDoc = rSourceShell.IsLabelDoc() && rSourceShell.GetSectionFmtCount() > 1; - //save the settings of the first + + //determine the page style and number used at the start of the source document rSourceShell.SttEndDoc(true); sal_uInt16 nStartingPageNo = rSourceShell.GetVirtPageNum(); OUString sModifiedStartingPageDesc; @@ -2752,11 +2762,13 @@ sal_Int32 SwDBManager::MergeDocuments( SwMailMergeConfigItem& rMMConfig, SwView* pTargetView = static_cast<SwView*>( pTargetFrame->GetViewShell() ); rMMConfig.SetTargetView(pTargetView); + //initiate SelectShell() to create sub shells pTargetView->AttrChangedNotify( &pTargetView->GetWrtShell() ); SwWrtShell* pTargetShell = pTargetView->GetWrtShellPtr(); SwDoc* pTargetDoc = pTargetShell->GetDoc(); + //copy the styles from the source to the target document pTargetView->GetDocShell()->_LoadStyles( *rSourceView.GetDocShell(), true ); // #i63806# @@ -2807,6 +2819,7 @@ sal_Int32 SwDBManager::MergeDocuments( SwMailMergeConfigItem& rMMConfig, SwDBManager* pWorkDBManager = pWorkDoc->GetDBManager(); pWorkDoc->SetDBManager( this ); pWorkDoc->EmbedAllLinks(); + SwUndoId nLastUndoId(UNDO_EMPTY); if (rWorkShell.GetLastUndoInfo(0, & nLastUndoId)) { @@ -2815,14 +2828,16 @@ sal_Int32 SwDBManager::MergeDocuments( SwMailMergeConfigItem& rMMConfig, rWorkShell.Undo(); } } + // #i69485# lock fields to prevent access to the result set while calculating layout rWorkShell.LockExpFlds(); // create a layout rWorkShell.CalcLayout(); rWorkShell.UnlockExpFlds(); - SfxGetpApp()->NotifyEvent(SfxEventHint(SW_EVENT_FIELD_MERGE, SwDocShell::GetEventName(STR_SW_EVENT_FIELD_MERGE), rWorkShell.GetView().GetViewFrame()->GetObjectShell())); + + SfxGetpApp()->NotifyEvent(SfxEventHint(SW_EVENT_FIELD_MERGE, SwDocShell::GetEventName(STR_SW_EVENT_FIELD_MERGE), rWorkShell.GetView().GetViewFrame()->GetObjectShell())); rWorkShell.SwViewShell::UpdateFlds(); - SfxGetpApp()->NotifyEvent(SfxEventHint(SW_EVENT_FIELD_MERGE_FINISHED, SwDocShell::GetEventName(STR_SW_EVENT_FIELD_MERGE_FINISHED), rWorkShell.GetView().GetViewFrame()->GetObjectShell())); + SfxGetpApp()->NotifyEvent(SfxEventHint(SW_EVENT_FIELD_MERGE_FINISHED, SwDocShell::GetEventName(STR_SW_EVENT_FIELD_MERGE_FINISHED), rWorkShell.GetView().GetViewFrame()->GetObjectShell())); // strip invisible content and convert fields to text rWorkShell.RemoveInvisibleContent(); @@ -2843,7 +2858,7 @@ sal_Int32 SwDBManager::MergeDocuments( SwMailMergeConfigItem& rMMConfig, //create a new pagestyle //copy the pagedesc from the current document to the new document and change the name of the to-be-applied style OUString sNewPageDescName = lcl_FindUniqueName(pTargetShell, sStartingPageDesc, nDocNo ); - pTargetShell->GetDoc()->MakePageDesc( sNewPageDescName ); + pTargetDoc->MakePageDesc( sNewPageDescName ); pTargetPageDesc = pTargetShell->FindPageDescByName( sNewPageDescName ); const SwPageDesc* pWorkPageDesc = rWorkShell.FindPageDescByName( sStartingPageDesc ); @@ -2857,9 +2872,6 @@ sal_Int32 SwDBManager::MergeDocuments( SwMailMergeConfigItem& rMMConfig, else pTargetPageDesc = pTargetShell->FindPageDescByName( sModifiedStartingPageDesc ); - if(nDocNo == 1) - pTargetShell->SetPageStyle( sModifiedStartingPageDesc ); - sal_uInt16 nPageCountBefore = pTargetShell->GetPageCnt(); OSL_ENSURE(!pTargetShell->GetTableFmt(),"target document ends with a table - paragraph should be appended"); commit 4ac327494dffbefdc29349d00b2cd1731f273489 Author: Jan-Marek Glogowski <glo...@fbihome.de> Date: Tue Jul 1 21:37:11 2014 +0200 MM: Use SwDoc::Append for SwFeShell::Paste Same as the SwDBManager::MergeDocuments change. Change-Id: I44684bce187bb949dafc35a49b0aea9b46465cda diff --git a/sw/source/uibase/dbui/dbmgr.cxx b/sw/source/uibase/dbui/dbmgr.cxx index 4bc0d0e..61bfd68 100644 --- a/sw/source/uibase/dbui/dbmgr.cxx +++ b/sw/source/uibase/dbui/dbmgr.cxx @@ -921,6 +921,8 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell, OUString sStartingPageDesc; sal_uInt16 nStartingPageNo = 0; bool bPageStylesWithHeaderFooter = false; + SwDoc* pTargetDoc; + if(bAsSingleFile || rMergeDescriptor.bCreateSingleFile) { // create a target docshell to put the merged document into @@ -936,6 +938,8 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell, //initiate SelectShell() to create sub shells pTargetView->AttrChangedNotify( &pTargetView->GetWrtShell() ); pTargetShell = pTargetView->GetWrtShellPtr(); + pTargetDoc = pTargetShell->GetDoc(); + //copy the styles from the source to the target document pTargetView->GetDocShell()->_LoadStyles( *pSourceDocSh, true ); //determine the page style and number used at the start of the source document @@ -1079,62 +1083,37 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell, } // insert the document into the target document - rWorkShell.SttEndDoc(false); - rWorkShell.SttEndDoc(true); - rWorkShell.SelAll(); - pTargetShell->SwCrsrShell::SttEndDoc( false ); - //#i72517# the headers and footers are still those from the source - update in case of fields inside header/footer - if( !nDocNo && bPageStylesWithHeaderFooter ) - pTargetShell->GetView().GetDocShell()->_LoadStyles( *rWorkShell.GetView().GetDocShell(), true ); + //#i72517# put the styles to the target document //if the source uses headers or footers each new copy need to copy a new page styles + SwPageDesc* pTargetPageDesc; if(bPageStylesWithHeaderFooter) { //create a new pagestyle //copy the pagedesc from the current document to the new document and change the name of the to-be-applied style - - SwDoc* pTargetDoc = pTargetShell->GetDoc(); - SwPageDesc* pSourcePageDesc = rWorkShell.FindPageDescByName( sStartingPageDesc ); OUString sNewPageDescName = lcl_FindUniqueName(pTargetShell, sStartingPageDesc, nDocNo ); pTargetDoc->MakePageDesc( sNewPageDescName ); - SwPageDesc* pTargetPageDesc = pTargetShell->FindPageDescByName( sNewPageDescName ); - if(pSourcePageDesc && pTargetPageDesc) + pTargetPageDesc = pTargetShell->FindPageDescByName( sNewPageDescName ); + const SwPageDesc* pWorkPageDesc = rWorkShell.FindPageDescByName( sStartingPageDesc ); + + if(pWorkPageDesc && pTargetPageDesc) { - pTargetDoc->CopyPageDesc( *pSourcePageDesc, *pTargetPageDesc, false ); + pTargetDoc->CopyPageDesc( *pWorkPageDesc, *pTargetPageDesc, false ); sModifiedStartingPageDesc = sNewPageDescName; - lcl_CopyFollowPageDesc( *pTargetShell, *pSourcePageDesc, *pTargetPageDesc, nDocNo ); + lcl_CopyFollowPageDesc( *pTargetShell, *pWorkPageDesc, *pTargetPageDesc, nDocNo ); } } - - if(nDocNo > 1) - pTargetShell->InsertPageBreak( &sModifiedStartingPageDesc, nStartingPageNo ); else - pTargetShell->SetPageStyle(sModifiedStartingPageDesc); - OSL_ENSURE(!pTargetShell->GetTableFmt(),"target document ends with a table - paragraph should be appended"); - //#i51359# add a second paragraph in case there's only one - { - SwNodeIndex aIdx( pWorkDoc->GetNodes().GetEndOfExtras(), 2 ); - SwPosition aTestPos( aIdx ); - SwCursor aTestCrsr(aTestPos,0,false); - if(!aTestCrsr.MovePara(fnParaNext, fnParaStart)) - { - //append a paragraph - pWorkDoc->AppendTxtNode( aTestPos ); - } - } + pTargetPageDesc = pTargetShell->FindPageDescByName( sModifiedStartingPageDesc ); #ifdef DBG_UTIL if ( nDocNo <= MAX_DOC_DUMP ) lcl_SaveDoc( xWorkDocSh, "WorkDoc", nDocNo ); #endif - pTargetShell->Paste( rWorkShell.GetDoc(), true ); + pTargetDoc->Append( *(rWorkShell.GetDoc()), nStartingPageNo, pTargetPageDesc, nDocNo == 1 ); //convert fields in page styles (header/footer - has to be done after the first document has been pasted - if(1 == nDocNo) - { - pTargetShell->CalcLayout(); - pTargetShell->ConvertFieldsToText(); - } + pTargetShell->CalcLayout(); #ifdef DBG_UTIL if ( nDocNo <= MAX_DOC_DUMP ) lcl_SaveDoc( xTargetDocShell, "MergeDoc" ); commit 58373eb7af324da284664a58192ecc60b4d003ab Author: Jan-Marek Glogowski <glo...@fbihome.de> Date: Tue Jul 1 21:31:35 2014 +0200 Add debug documents to SwDBManager::MergeMailFiles Just like the debug documents in SwDBManager::MergeDocuments. Change-Id: I275575853c80d4e19d6df5ba9d8dc689353d7c85 diff --git a/sw/source/uibase/dbui/dbmgr.cxx b/sw/source/uibase/dbui/dbmgr.cxx index 71b51af..4bc0d0e 100644 --- a/sw/source/uibase/dbui/dbmgr.cxx +++ b/sw/source/uibase/dbui/dbmgr.cxx @@ -808,6 +808,33 @@ static void lcl_RemoveSectionLinks( SwWrtShell& rWorkShell ) rWorkShell.SetLabelDoc( false ); } +#ifdef DBG_UTIL + +#define MAX_DOC_DUMP 3 + +static void lcl_SaveDoc( SfxObjectShell *xTargetDocShell, + const char *name, int no = 0 ) +{ + boost::scoped_ptr< utl::TempFile > aTempFile; + OUString sExt( ".odt" ); + OUString basename = OUString::createFromAscii( name ); + if (no > 0 ) + basename += OUString::number(no) + "-"; + aTempFile.reset( new utl::TempFile( basename, true, &sExt ) ); + OSL_ENSURE( aTempFile.get(), "Temporary file not available" ); + INetURLObject aTempFileURL( aTempFile->GetURL() ); + SfxMedium* pDstMed = new SfxMedium( + aTempFileURL.GetMainURL( INetURLObject::NO_DECODE ), + STREAM_STD_READWRITE ); + xTargetDocShell->DoSaveAs( *pDstMed ); + xTargetDocShell->DoSaveCompleted( pDstMed ); + if( xTargetDocShell->GetError() ) + SAL_WARN( "sw.mailmerge", "Error saving: " << aTempFile->GetURL() ); + else + SAL_INFO( "sw.mailmerge", "Saved doc as: " << aTempFile->GetURL() ); +} +#endif + bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell, const SwMergeDescriptor& rMergeDescriptor) { @@ -899,6 +926,9 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell, // create a target docshell to put the merged document into xTargetDocShell = new SwDocShell( SFX_CREATE_MODE_STANDARD ); xTargetDocShell->DoInitNew( 0 ); +#ifdef DBG_UTIL + lcl_SaveDoc( xTargetDocShell, "MergeDoc" ); +#endif SfxViewFrame* pTargetFrame = SfxViewFrame::LoadHiddenDocument( *xTargetDocShell, 0 ); pTargetView = static_cast<SwView*>( pTargetFrame->GetViewShell() ); @@ -1007,6 +1037,10 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell, // The SfxObjectShell will be closed explicitly later but it is more safe to use SfxObjectShellLock here // copy the source document SfxObjectShellLock xWorkDocSh = pSourceDocSh->GetDoc()->CreateCopy( true ); +#ifdef DBG_UTIL + if ( nDocNo <= MAX_DOC_DUMP ) + lcl_SaveDoc( xWorkDocSh, "WorkDoc", nDocNo ); +#endif { //create a view frame for the document @@ -1088,6 +1122,11 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell, pWorkDoc->AppendTxtNode( aTestPos ); } } + +#ifdef DBG_UTIL + if ( nDocNo <= MAX_DOC_DUMP ) + lcl_SaveDoc( xWorkDocSh, "WorkDoc", nDocNo ); +#endif pTargetShell->Paste( rWorkShell.GetDoc(), true ); //convert fields in page styles (header/footer - has to be done after the first document has been pasted @@ -1096,6 +1135,10 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell, pTargetShell->CalcLayout(); pTargetShell->ConvertFieldsToText(); } +#ifdef DBG_UTIL + if ( nDocNo <= MAX_DOC_DUMP ) + lcl_SaveDoc( xTargetDocShell, "MergeDoc" ); +#endif } else { @@ -2648,33 +2691,6 @@ uno::Reference<XResultSet> SwDBManager::createCursor(const OUString& _sDataSourc return xResultSet; } -#ifdef DBG_UTIL - -#define MAX_DOC_DUMP 3 - -static void lcl_SaveDoc( SfxObjectShell *xTargetDocShell, - const char *name, int no = 0 ) -{ - boost::scoped_ptr< utl::TempFile > aTempFile; - OUString sExt( ".odt" ); - OUString basename = OUString::createFromAscii( name ); - if (no > 0 ) - basename += OUString::number(no) + "-"; - aTempFile.reset( new utl::TempFile( basename, true, &sExt ) ); - OSL_ENSURE( aTempFile.get(), "Temporary file not available" ); - INetURLObject aTempFileURL( aTempFile->GetURL() ); - SfxMedium* pDstMed = new SfxMedium( - aTempFileURL.GetMainURL( INetURLObject::NO_DECODE ), - STREAM_STD_READWRITE ); - xTargetDocShell->DoSaveAs( *pDstMed ); - xTargetDocShell->DoSaveCompleted( pDstMed ); - if( xTargetDocShell->GetError() ) - SAL_WARN( "sw.mailmerge", "Error saving: " << aTempFile->GetURL() ); - else - SAL_INFO( "sw.mailmerge", "Saved doc as: " << aTempFile->GetURL() ); -} -#endif - // merge all data into one resulting document and return the number of merged documents sal_Int32 SwDBManager::MergeDocuments( SwMailMergeConfigItem& rMMConfig, SwView& rSourceView ) _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits