diff options
author | Jan-Marek Glogowski <glogow@fbihome.de> | 2014-09-15 00:13:06 +0200 |
---|---|---|
committer | Jan-Marek Glogowski <glogow@fbihome.de> | 2014-10-01 10:32:42 +0200 |
commit | 9835bb562cfe3a5d386c24d86176ba7bb5ab26d2 (patch) | |
tree | 4f799aae7b90d8b23e487765d67243b00a205131 /sw | |
parent | 0a5cd87e591d7f87bfab92716079af719259f143 (diff) |
MM: export the SwDocShell mail merge via UNO
This saves the loading time for large document. Use it if you
want to present the generated document to the user or write a
mail merge unit tests.
This includes:
* renaming "only" to "shell" at multiple occurences
* dropping the DBMGR_MERGE_SINGLE_FILE special type for the mail
merge wizard in favour of an additional SwMergeDescriptor
boolean
* cleanup and renaming of the internal merge type enums, so these
actually match the diffferent merge targets: printer, email,
file and shell
Change-Id: I33c6773972195193687ba9c3e12b562310d330c1
Diffstat (limited to 'sw')
-rw-r--r-- | sw/inc/dbmgr.hxx | 13 | ||||
-rw-r--r-- | sw/inc/swabstdlg.hxx | 2 | ||||
-rw-r--r-- | sw/source/ui/dbui/mailmergewizard.cxx | 2 | ||||
-rw-r--r-- | sw/source/ui/dialog/swdlgfact.cxx | 4 | ||||
-rw-r--r-- | sw/source/ui/dialog/swdlgfact.hxx | 2 | ||||
-rw-r--r-- | sw/source/ui/envelp/mailmrge.cxx | 7 | ||||
-rw-r--r-- | sw/source/uibase/dbui/dbmgr.cxx | 58 | ||||
-rw-r--r-- | sw/source/uibase/inc/mailmrge.hxx | 6 | ||||
-rw-r--r-- | sw/source/uibase/uno/unomailmerge.cxx | 172 |
9 files changed, 141 insertions, 125 deletions
diff --git a/sw/inc/dbmgr.hxx b/sw/inc/dbmgr.hxx index 61eb74027c6e..797e64ce7832 100644 --- a/sw/inc/dbmgr.hxx +++ b/sw/inc/dbmgr.hxx @@ -77,11 +77,10 @@ class SwCalc; enum DBManagerOptions { DBMGR_MERGE, ///< Data records in fields. - DBMGR_MERGE_MAILMERGE, ///< Print mail merge. - DBMGR_MERGE_MAILING, ///< Send mail merge as email. - DBMGR_MERGE_MAILFILES, ///< Save mail merge as files. - DBMGR_MERGE_SINGLE_FILE, ///< Save merge as single file. - DBMGR_MERGE_ONLY ///< Create merge doc w/o save/print. + DBMGR_MERGE_PRINTER, ///< Print mail merge. + DBMGR_MERGE_EMAIL, ///< Send mail merge as email. + DBMGR_MERGE_FILE, ///< Save mail merge as files. + DBMGR_MERGE_SHELL ///< Create merge doc and keep the doc shell. }; // Administration of (new) logical databases. @@ -154,6 +153,7 @@ struct SwMergeDescriptor bool bPrintAsync; bool bCreateSingleFile; + bool bSubjectIsFilename; SwMailMergeConfigItem* pMailMergeConfigItem; @@ -167,6 +167,7 @@ struct SwMergeDescriptor bSendAsAttachment( false ), bPrintAsync( false ), bCreateSingleFile( false ), + bSubjectIsFilename( false ), pMailMergeConfigItem(0) {} @@ -277,7 +278,7 @@ public: /// check if a data source is open bool IsDataSourceOpen(const OUString& rDataSource, - const OUString& rTableOrQuery, bool bMergeOnly); + const OUString& rTableOrQuery, bool bMergeShell); /// open the source while fields are updated - for the calculator only! bool OpenDataSource(const OUString& rDataSource, const OUString& rTableOrQuery, diff --git a/sw/inc/swabstdlg.hxx b/sw/inc/swabstdlg.hxx index daf8ad6246b5..f5542757bfa6 100644 --- a/sw/inc/swabstdlg.hxx +++ b/sw/inc/swabstdlg.hxx @@ -145,7 +145,7 @@ public: virtual const OUString& GetSaveFilter() const = 0; virtual const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any > GetSelection() const = 0; virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet> GetResultSet() const = 0; - virtual bool IsSaveIndividualDocs() const = 0; + virtual bool IsSaveSingleDoc() const = 0; virtual bool IsGenerateFromDataBase() const = 0; virtual OUString GetColumnName() const = 0; virtual OUString GetPath() const = 0; diff --git a/sw/source/ui/dbui/mailmergewizard.cxx b/sw/source/ui/dbui/mailmergewizard.cxx index d2ac379d7668..ced4c6e98c4c 100644 --- a/sw/source/ui/dbui/mailmergewizard.cxx +++ b/sw/source/ui/dbui/mailmergewizard.cxx @@ -277,7 +277,7 @@ void SwMailMergeWizard::CreateTargetDocument() aDescriptor[ svx::daCommand ] <<= m_rConfigItem.GetCurrentDBData().sCommand; aDescriptor[ svx::daCommandType ] <<= m_rConfigItem.GetCurrentDBData().nCommandType; - SwMergeDescriptor aMergeDesc( DBMGR_MERGE_ONLY, GetSwView()->GetWrtShell(), + SwMergeDescriptor aMergeDesc( DBMGR_MERGE_SHELL, GetSwView()->GetWrtShell(), aDescriptor); aMergeDesc.pMailMergeConfigItem = &m_rConfigItem; aMergeDesc.bCreateSingleFile = true; diff --git a/sw/source/ui/dialog/swdlgfact.cxx b/sw/source/ui/dialog/swdlgfact.cxx index b62e4223ccda..3b79a38c69dd 100644 --- a/sw/source/ui/dialog/swdlgfact.cxx +++ b/sw/source/ui/dialog/swdlgfact.cxx @@ -497,9 +497,9 @@ uno::Reference< sdbc::XResultSet> AbstractMailMergeDlg_Impl::GetResultSet() cons return pDlg->GetResultSet(); } -bool AbstractMailMergeDlg_Impl::IsSaveIndividualDocs() const +bool AbstractMailMergeDlg_Impl::IsSaveSingleDoc() const { - return pDlg->IsSaveIndividualDocs(); + return pDlg->IsSaveSingleDoc(); } bool AbstractMailMergeDlg_Impl::IsGenerateFromDataBase() const diff --git a/sw/source/ui/dialog/swdlgfact.hxx b/sw/source/ui/dialog/swdlgfact.hxx index 1a037f71f160..0a4021993f71 100644 --- a/sw/source/ui/dialog/swdlgfact.hxx +++ b/sw/source/ui/dialog/swdlgfact.hxx @@ -286,7 +286,7 @@ class AbstractMailMergeDlg_Impl : public AbstractMailMergeDlg virtual const OUString& GetSaveFilter() const SAL_OVERRIDE; virtual const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any > GetSelection() const SAL_OVERRIDE ; virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet> GetResultSet() const SAL_OVERRIDE; - virtual bool IsSaveIndividualDocs() const SAL_OVERRIDE; + virtual bool IsSaveSingleDoc() const SAL_OVERRIDE; virtual bool IsGenerateFromDataBase() const SAL_OVERRIDE; virtual OUString GetColumnName() const SAL_OVERRIDE; virtual OUString GetPath() const SAL_OVERRIDE; diff --git a/sw/source/ui/envelp/mailmrge.cxx b/sw/source/ui/envelp/mailmrge.cxx index b452f4e3cf74..693bebab1be5 100644 --- a/sw/source/ui/envelp/mailmrge.cxx +++ b/sw/source/ui/envelp/mailmrge.cxx @@ -139,7 +139,7 @@ SwMailMergeDlg::SwMailMergeDlg(vcl::Window* pParent, SwWrtShell& rShell, pImpl (new SwMailMergeDlg_Impl), rSh (rShell), - nMergeType (DBMGR_MERGE_MAILING), + nMergeType (DBMGR_MERGE_EMAIL), m_aDialogSize( GetSizePixel() ) { get(m_pBeamerWin, "beamer"); @@ -495,11 +495,10 @@ bool SwMailMergeDlg::ExecQryShell() SwDBManager* pMgr = rSh.GetDBManager(); if (m_pPrinterRB->IsChecked()) - nMergeType = DBMGR_MERGE_MAILMERGE; + nMergeType = DBMGR_MERGE_PRINTER; else { - nMergeType = m_pSaveSingleDocRB->IsChecked() ? - DBMGR_MERGE_SINGLE_FILE : DBMGR_MERGE_MAILFILES; + nMergeType = DBMGR_MERGE_FILE; SfxMedium* pMedium = rSh.GetView().GetDocShell()->GetMedium(); INetURLObject aAbs; if( pMedium ) diff --git a/sw/source/uibase/dbui/dbmgr.cxx b/sw/source/uibase/dbui/dbmgr.cxx index 13bcbcd39bd9..9103a1a0dac9 100644 --- a/sw/source/uibase/dbui/dbmgr.cxx +++ b/sw/source/uibase/dbui/dbmgr.cxx @@ -430,11 +430,10 @@ bool SwDBManager::MergeNew( const SwMergeDescriptor& rMergeDesc ) bRet = Merge(&rMergeDesc.rSh); break; - case DBMGR_MERGE_MAILMERGE: // printing merge from 'old' merge dialog or from UNO-component - case DBMGR_MERGE_MAILING: - case DBMGR_MERGE_MAILFILES: - case DBMGR_MERGE_SINGLE_FILE: - case DBMGR_MERGE_ONLY: + case DBMGR_MERGE_PRINTER: + case DBMGR_MERGE_EMAIL: + case DBMGR_MERGE_FILE: + case DBMGR_MERGE_SHELL: // save files and send them as e-Mail if required bRet = MergeMailFiles(&rMergeDesc.rSh, rMergeDesc); @@ -875,9 +874,8 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell, //check if the doc is synchronized and contains at least one linked section bool bSynchronizedDoc = pSourceShell->IsLabelDoc() && pSourceShell->GetSectionFmtCount() > 1; bool bNoError = true; - const bool bEMail = rMergeDescriptor.nMergeType == DBMGR_MERGE_MAILING; - const bool bAsSingleFile = rMergeDescriptor.nMergeType == DBMGR_MERGE_SINGLE_FILE; - const bool bMergeOnly = rMergeDescriptor.nMergeType == DBMGR_MERGE_ONLY; + const bool bEMail = rMergeDescriptor.nMergeType == DBMGR_MERGE_EMAIL; + const bool bMergeShell = rMergeDescriptor.nMergeType == DBMGR_MERGE_SHELL; ::rtl::Reference< MailDispatcher > xMailDispatcher; OUString sBodyMimeType; @@ -936,9 +934,9 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell, OSL_ENSURE(xSourceDocProps.is(), "DocumentProperties is null"); } - if( !bMergeOnly && pSourceDocSh->IsModified() ) + if( !bMergeShell && pSourceDocSh->IsModified() ) pSfxDispatcher->Execute( pSourceDocSh->HasName() ? SID_SAVEDOC : SID_SAVEASDOC, SFX_CALLMODE_SYNCHRON|SFX_CALLMODE_RECORD); - if( bMergeOnly || !pSourceDocSh->IsModified() ) + if( bMergeShell || !pSourceDocSh->IsModified() ) { const SfxFilter* pStoreToFilter = SwIoSystem::GetFileFilter( pSourceDocSh->GetMedium()->GetURLObject().GetMainURL( INetURLObject::NO_DECODE ), ::aEmptyOUStr ); @@ -982,7 +980,7 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell, if (!IsMergeSilent()) { pSourceWindow = &pSourceShell->GetView().GetEditWin(); - if( bMergeOnly ) + if( bMergeShell ) pProgressDlg = new CreateMonitor( pSourceWindow ); else { pProgressDlg = new PrintMonitor( pSourceWindow, PrintMonitor::MONITOR_TYPE_PRINT ); @@ -995,7 +993,7 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell, Application::Reschedule(); } - if(bAsSingleFile || rMergeDescriptor.bCreateSingleFile) + if(rMergeDescriptor.bCreateSingleFile) { // create a target docshell to put the merged document into xTargetDocShell = new SwDocShell( SFX_CREATE_MODE_STANDARD ); @@ -1003,7 +1001,7 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell, if (nMaxDumpDocs) lcl_SaveDoc( xTargetDocShell, "MergeDoc" ); SfxViewFrame* pTargetFrame = SfxViewFrame::LoadHiddenDocument( *xTargetDocShell, 0 ); - if (bMergeOnly) { + if (bMergeShell && pSourceWindow) { //the created window has to be located at the same position as the source window vcl::Window& rTargetWindow = pTargetFrame->GetFrame().GetWindow(); rTargetWindow.SetPosPixel(pSourceWindow->GetPosPixel()); @@ -1052,7 +1050,7 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell, sal_Int32 nDocNo = 1; sal_Int32 nDocCount = 0; - if( !IsMergeSilent() && bMergeOnly && + if( !IsMergeSilent() && bMergeShell && lcl_getCountFromResultSet( nDocCount, pImpl->pMergeData->xResultSet ) ) static_cast<CreateMonitor*>( pProgressDlg )->SetTotalCount( nDocCount ); @@ -1079,7 +1077,7 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell, } // create a new temporary file name - only done once in case of bCreateSingleFile - if( 1 == nDocNo || (!rMergeDescriptor.bCreateSingleFile && !bAsSingleFile) ) + if( 1 == nDocNo || !rMergeDescriptor.bCreateSingleFile ) { INetURLObject aEntry(sPath); OUString sLeading; @@ -1093,7 +1091,7 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell, OUString sExt(comphelper::string::stripStart(pStoreToFilter->GetDefaultExtension(), '*')); aTempFile.reset( new utl::TempFile(sLeading, true, &sExt, &sPath)); - if( bAsSingleFile ) + if( rMergeDescriptor.bSubjectIsFilename ) aTempFile->EnableKillingFile(); } @@ -1107,7 +1105,7 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell, { INetURLObject aTempFileURL(aTempFile->GetURL()); if (!IsMergeSilent()) { - if( bMergeOnly ) + if( bMergeShell ) static_cast<CreateMonitor*>( pProgressDlg )->SetCurrentPosition( nDocNo ); else { PrintMonitor *pPrintMonDlg = static_cast<PrintMonitor*>( pProgressDlg ); @@ -1162,7 +1160,7 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell, pEvtSrc->LaunchMailMergeEvent( aEvt ); } - if(rMergeDescriptor.bCreateSingleFile || bAsSingleFile ) + if(rMergeDescriptor.bCreateSingleFile) { OSL_ENSURE( pTargetShell, "no target shell available!" ); // copy created file into the target document @@ -1206,7 +1204,7 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell, pTargetShell->CalcLayout(); if ( (nMaxDumpDocs < 0) || (nDocNo <= nMaxDumpDocs) ) lcl_SaveDoc( xTargetDocShell, "MergeDoc" ); - if (bMergeOnly) + if (bMergeShell) { SwDocMergeInfo aMergeInfo; aMergeInfo.nStartPageInTarget = nStartPage; @@ -1332,7 +1330,7 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell, // Freeze the layouts of the target document after the first inserted // sub-document, to get the correct PageDesc. - if(!bFreezedLayouts && (rMergeDescriptor.bCreateSingleFile || bAsSingleFile)) + if(!bFreezedLayouts && (rMergeDescriptor.bCreateSingleFile)) { std::set<SwRootFrm*> aAllLayouts = pTargetShell->GetDoc()->GetAllLayouts(); std::for_each( aAllLayouts.begin(), aAllLayouts.end(), @@ -1346,7 +1344,7 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell, Application::Reschedule(); // Unfreeze target document layouts and correct all PageDescs. - if(rMergeDescriptor.bCreateSingleFile || bAsSingleFile) + if(rMergeDescriptor.bCreateSingleFile) { std::set<SwRootFrm*> aAllLayouts = pTargetShell->GetDoc()->GetAllLayouts(); std::for_each( aAllLayouts.begin(), aAllLayouts.end(), @@ -1357,17 +1355,16 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell, DELETEZ( pProgressDlg ); // save the single output document - if (bMergeOnly) + if (bMergeShell) { rMergeDescriptor.pMailMergeConfigItem->SetTargetView( pTargetView ); } - else if(rMergeDescriptor.bCreateSingleFile || bAsSingleFile) + else if(rMergeDescriptor.bCreateSingleFile) { - if( rMergeDescriptor.nMergeType != DBMGR_MERGE_MAILMERGE ) + if( rMergeDescriptor.nMergeType != DBMGR_MERGE_PRINTER ) { OSL_ENSURE( aTempFile.get(), "Temporary file not available" ); - OUString sSub(sSubject); - INetURLObject aTempFileURL(bAsSingleFile ? sSub : aTempFile->GetURL()); + INetURLObject aTempFileURL( rMergeDescriptor.bSubjectIsFilename ? sSubject : aTempFile->GetURL()); SfxMedium* pDstMed = new SfxMedium( aTempFileURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_STD_READWRITE ); @@ -1432,7 +1429,7 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell, } // Leave docshell available for caller (e.g. MM wizard) - if (!bMergeOnly) + if (!bMergeShell) xTargetDocShell->DoClose(); } @@ -1829,7 +1826,7 @@ OUString SwDBManager::GetDBField(uno::Reference<XPropertySet> xColumnProps, // checks if a desired data source table or query is open bool SwDBManager::IsDataSourceOpen(const OUString& rDataSource, - const OUString& rTableOrQuery, bool bMergeOnly) + const OUString& rTableOrQuery, bool bMergeShell) { if(pImpl->pMergeData) { @@ -1840,7 +1837,7 @@ bool SwDBManager::IsDataSourceOpen(const OUString& rDataSource, && pImpl->pMergeData->xResultSet.is(); } - else if(!bMergeOnly) + else if(!bMergeShell) { SwDBData aData; aData.sDataSource = rDataSource; @@ -2642,7 +2639,8 @@ void SwDBManager::ExecuteFormLetter( SwWrtShell& rSh, SwMergeDescriptor aMergeDesc( pImpl->pMergeDialog->GetMergeType(), pView->GetWrtShell(), aDescriptor ); aMergeDesc.sSaveToFilter = pImpl->pMergeDialog->GetSaveFilter(); - aMergeDesc.bCreateSingleFile = !pImpl->pMergeDialog->IsSaveIndividualDocs(); + aMergeDesc.bCreateSingleFile = pImpl->pMergeDialog->IsSaveSingleDoc(); + aMergeDesc.bSubjectIsFilename = aMergeDesc.bCreateSingleFile; if( !aMergeDesc.bCreateSingleFile && pImpl->pMergeDialog->IsGenerateFromDataBase() ) { aMergeDesc.sAddressFromColumn = pImpl->pMergeDialog->GetColumnName(); diff --git a/sw/source/uibase/inc/mailmrge.hxx b/sw/source/uibase/inc/mailmrge.hxx index 143e06b08cef..f3d67eeb831f 100644 --- a/sw/source/uibase/inc/mailmrge.hxx +++ b/sw/source/uibase/inc/mailmrge.hxx @@ -115,8 +115,8 @@ class SwMailMergeDlg : public SvxStandardDialog bool ExecQryShell(); public: - SwMailMergeDlg(vcl::Window* pParent, SwWrtShell& rSh, - const OUString& rSourceName, + SwMailMergeDlg(vcl::Window* pParent, SwWrtShell& rSh, + const OUString& rSourceName, const OUString& rTblName, sal_Int32 nCommandType, const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection>& xConnection, @@ -125,7 +125,7 @@ public: inline DBManagerOptions GetMergeType() { return nMergeType; } - bool IsSaveIndividualDocs() const { return m_pSaveIndividualRB->IsChecked(); } + bool IsSaveSingleDoc() const { return m_pSaveSingleDocRB->IsChecked(); } bool IsGenerateFromDataBase() const { return m_pGenerateFromDataBaseCB->IsChecked(); } OUString GetColumnName() const { return m_pColumnLB->GetSelectEntry();} OUString GetPath() const { return m_pPathED->GetText();} diff --git a/sw/source/uibase/uno/unomailmerge.cxx b/sw/source/uibase/uno/unomailmerge.cxx index 9787a01957ba..f54a9df40155 100644 --- a/sw/source/uibase/uno/unomailmerge.cxx +++ b/sw/source/uibase/uno/unomailmerge.cxx @@ -661,9 +661,10 @@ uno::Any SAL_CALL SwXMailMerge::execute( DBManagerOptions nMergeType; switch (nCurOutputType) { - case MailMergeType::PRINTER : nMergeType = DBMGR_MERGE_MAILMERGE; break; - case MailMergeType::FILE : nMergeType = DBMGR_MERGE_MAILFILES; break; - case MailMergeType::MAIL : nMergeType = DBMGR_MERGE_MAILING; break; + case MailMergeType::PRINTER : nMergeType = DBMGR_MERGE_PRINTER; break; + case MailMergeType::FILE : nMergeType = DBMGR_MERGE_FILE; break; + case MailMergeType::MAIL : nMergeType = DBMGR_MERGE_EMAIL; break; + case MailMergeType::SHELL : nMergeType = DBMGR_MERGE_SHELL; break; default: throw IllegalArgumentException("Invalid value of property: OutputType", static_cast < cppu::OWeakObject * > ( this ), 0 ); } @@ -678,87 +679,98 @@ uno::Any SAL_CALL SwXMailMerge::execute( boost::scoped_ptr< SwMailMergeConfigItem > pMMConfigItem; uno::Reference< mail::XMailService > xInService; - if (MailMergeType::PRINTER == nCurOutputType) + switch (nCurOutputType) { - IDocumentDeviceAccess* pIDDA = rSh.getIDocumentDeviceAccess(); - SwPrintData aPrtData( pIDDA->getPrintData() ); - aPrtData.SetPrintSingleJobs( bCurSinglePrintJobs ); - pIDDA->setPrintData( aPrtData ); - // #i25686# printing should not be done asynchronously to prevent dangling offices - // when mail merge is called as command line macro - aMergeDesc.bPrintAsync = false; - aMergeDesc.aPrintOptions = aPrintSettings; + case MailMergeType::PRINTER: + { + IDocumentDeviceAccess* pIDDA = rSh.getIDocumentDeviceAccess(); + SwPrintData aPrtData( pIDDA->getPrintData() ); + aPrtData.SetPrintSingleJobs( bCurSinglePrintJobs ); + pIDDA->setPrintData( aPrtData ); + // #i25686# printing should not be done asynchronously to prevent dangling offices + // when mail merge is called as command line macro + aMergeDesc.bPrintAsync = false; + aMergeDesc.aPrintOptions = aPrintSettings; + aMergeDesc.bCreateSingleFile = true; + } + break; + case MailMergeType::SHELL: aMergeDesc.bCreateSingleFile = true; - } - else /* FILE and MAIL*/ - { - INetURLObject aURLObj; - aURLObj.SetSmartProtocol( INET_PROT_FILE ); - - if (!aCurDocumentURL.isEmpty()) + pMMConfigItem.reset(new SwMailMergeConfigItem); + aMergeDesc.pMailMergeConfigItem = pMMConfigItem.get(); + break; + case MailMergeType::FILE: + case MailMergeType::MAIL: { - // if OutputURL or FileNamePrefix are missing get - // them from DocumentURL - aURLObj.SetSmartURL( aCurDocumentURL ); - if (aCurFileNamePrefix.isEmpty()) - aCurFileNamePrefix = aURLObj.GetBase(); // filename without extension - if (aCurOutputURL.isEmpty()) + INetURLObject aURLObj; + aURLObj.SetSmartProtocol( INET_PROT_FILE ); + + if (!aCurDocumentURL.isEmpty()) + { + // if OutputURL or FileNamePrefix are missing get + // them from DocumentURL + aURLObj.SetSmartURL( aCurDocumentURL ); + if (aCurFileNamePrefix.isEmpty()) + aCurFileNamePrefix = aURLObj.GetBase(); // filename without extension + if (aCurOutputURL.isEmpty()) + { + aURLObj.removeSegment(); + aCurOutputURL = aURLObj.GetMainURL( INetURLObject::DECODE_TO_IURI ); + } + } + else // default empty document without URL { - aURLObj.removeSegment(); - aCurOutputURL = aURLObj.GetMainURL( INetURLObject::DECODE_TO_IURI ); + if (aCurOutputURL.isEmpty()) + throw RuntimeException("OutputURL is not set and can not be obtained.", static_cast < cppu::OWeakObject * > ( this ) ); } - } - else // default empty document without URL - { - if (aCurOutputURL.isEmpty()) - throw RuntimeException("OutputURL is not set and can not be obtained.", static_cast < cppu::OWeakObject * > ( this ) ); - } - aURLObj.SetSmartURL( aCurOutputURL ); - OUString aPath = aURLObj.GetMainURL( INetURLObject::DECODE_TO_IURI ); + aURLObj.SetSmartURL( aCurOutputURL ); + OUString aPath = aURLObj.GetMainURL( INetURLObject::DECODE_TO_IURI ); - const OUString aDelim( "/" ); - if (!aPath.isEmpty() && !aPath.endsWith(aDelim)) - aPath += aDelim; - if (bCurFileNameFromColumn) - pMgr->SetEMailColumn( aCurFileNamePrefix ); - else - { - aPath += aCurFileNamePrefix; - pMgr->SetEMailColumn( OUString() ); - } - pMgr->SetSubject( aPath ); - if(MailMergeType::FILE == nCurOutputType) - { - aMergeDesc.sSaveToFilter = sSaveFilter; - aMergeDesc.sSaveToFilterOptions = sSaveFilterOptions; - aMergeDesc.aSaveToFilterData = aSaveFilterData; - aMergeDesc.bCreateSingleFile = bSaveAsSingleFile; - } - else - { - pMgr->SetEMailColumn( sAddressFromColumn ); - if(sAddressFromColumn.isEmpty()) - throw RuntimeException("Mail address column not set.", static_cast < cppu::OWeakObject * > ( this ) ); - aMergeDesc.sSaveToFilter = sAttachmentFilter; - aMergeDesc.sSubject = sSubject; - aMergeDesc.sMailBody = sMailBody; - aMergeDesc.sAttachmentName = sAttachmentName; - aMergeDesc.aCopiesTo = aCopiesTo; - aMergeDesc.aBlindCopiesTo = aBlindCopiesTo; - aMergeDesc.bSendAsHTML = bSendAsHTML; - aMergeDesc.bSendAsAttachment = bSendAsAttachment; - - aMergeDesc.bCreateSingleFile = false; - pMMConfigItem.reset(new SwMailMergeConfigItem); - aMergeDesc.pMailMergeConfigItem = pMMConfigItem.get(); - aMergeDesc.xSmtpServer = SwMailMergeHelper::ConnectToSmtpServer( - *pMMConfigItem, - xInService, - sInServerPassword, sOutServerPassword ); - if( !aMergeDesc.xSmtpServer.is() || !aMergeDesc.xSmtpServer->isConnected()) - throw RuntimeException("Failed to connect to mail server.", static_cast < cppu::OWeakObject * > ( this ) ); + const OUString aDelim( "/" ); + if (!aPath.isEmpty() && !aPath.endsWith(aDelim)) + aPath += aDelim; + if (bCurFileNameFromColumn) + pMgr->SetEMailColumn( aCurFileNamePrefix ); + else + { + aPath += aCurFileNamePrefix; + pMgr->SetEMailColumn( OUString() ); + } + pMgr->SetSubject( aPath ); + if(MailMergeType::FILE == nCurOutputType) + { + aMergeDesc.sSaveToFilter = sSaveFilter; + aMergeDesc.sSaveToFilterOptions = sSaveFilterOptions; + aMergeDesc.aSaveToFilterData = aSaveFilterData; + aMergeDesc.bCreateSingleFile = bSaveAsSingleFile; + } + else + { + pMgr->SetEMailColumn( sAddressFromColumn ); + if(sAddressFromColumn.isEmpty()) + throw RuntimeException("Mail address column not set.", static_cast < cppu::OWeakObject * > ( this ) ); + aMergeDesc.sSaveToFilter = sAttachmentFilter; + aMergeDesc.sSubject = sSubject; + aMergeDesc.sMailBody = sMailBody; + aMergeDesc.sAttachmentName = sAttachmentName; + aMergeDesc.aCopiesTo = aCopiesTo; + aMergeDesc.aBlindCopiesTo = aBlindCopiesTo; + aMergeDesc.bSendAsHTML = bSendAsHTML; + aMergeDesc.bSendAsAttachment = bSendAsAttachment; + + aMergeDesc.bCreateSingleFile = false; + pMMConfigItem.reset(new SwMailMergeConfigItem); + aMergeDesc.pMailMergeConfigItem = pMMConfigItem.get(); + aMergeDesc.xSmtpServer = SwMailMergeHelper::ConnectToSmtpServer( + *pMMConfigItem, + xInService, + sInServerPassword, sOutServerPassword ); + if( !aMergeDesc.xSmtpServer.is() || !aMergeDesc.xSmtpServer->isConnected()) + throw RuntimeException("Failed to connect to mail server.", static_cast < cppu::OWeakObject * > ( this ) ); + } } + break; } // save document with temporary filename @@ -812,7 +824,13 @@ uno::Any SAL_CALL SwXMailMerge::execute( if(aMergeDesc.xSmtpServer.is() && aMergeDesc.xSmtpServer->isConnected()) aMergeDesc.xSmtpServer->disconnect(); - return makeAny( sal_True ); + if (DBMGR_MERGE_SHELL == nMergeType) + { + SwXTextDocument *xTextDoc = new SwXTextDocument( aMergeDesc.pMailMergeConfigItem->GetTargetView()->GetDocShell() ); + return makeAny( Reference< XComponent >( xTextDoc->queryInterface( XComponent::static_type() ), css::uno::UNO_QUERY) ); + } + else + return makeAny( sal_True ); } void SAL_CALL SwXMailMerge::cancel() throw (com::sun::star::uno::RuntimeException, std::exception) |