Make UNO and wizard mail merge use same function.
Instead of MergeDocuments and MergeMailFiles duplicating largely the
same functionality, the only user of MergeDocuments (MM wizard) now
uses MergeMailFiles.
Change-Id: Ifad183bdeabf5ca1eb08b4b1df557404a54a9fdd
Reviewed-on: https://gerrit.libreoffice.org/10981
Reviewed-by: Björn Michaelsen <bjoern.michaelsen@canonical.com>
Tested-by: Björn Michaelsen <bjoern.michaelsen@canonical.com>
diff --git a/sw/inc/dbmgr.hxx b/sw/inc/dbmgr.hxx
index 29fa03b..18105cf 100644
--- a/sw/inc/dbmgr.hxx
+++ b/sw/inc/dbmgr.hxx
@@ -79,8 +79,9 @@ 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 merg as files.
DBMGR_MERGE_SINGLE_FILE ///< Save merge as single file.
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.
};
// Administration of (new) logical databases.
diff --git a/sw/source/ui/dbui/mailmergewizard.cxx b/sw/source/ui/dbui/mailmergewizard.cxx
index 677717d..d2ac379 100644
--- a/sw/source/ui/dbui/mailmergewizard.cxx
+++ b/sw/source/ui/dbui/mailmergewizard.cxx
@@ -34,6 +34,7 @@
#include <sfx2/viewfrm.hxx>
#include <wrtsh.hxx>
#include <vcl/msgbox.hxx>
#include <svx/dataaccessdescriptor.hxx>
#include <helpid.h>
@@ -269,8 +270,19 @@ void SwMailMergeWizard::UpdateRoadmap()
// enables/disables pages in the roadmap depending on the current page and state
void SwMailMergeWizard::CreateTargetDocument()
{
GetSwView()->GetWrtShell().GetDBManager()->
MergeDocuments( m_rConfigItem, *GetSwView() );
svx::ODataAccessDescriptor aDescriptor;
aDescriptor.setDataSource( m_rConfigItem.GetCurrentDBData().sDataSource );
aDescriptor[ svx::daConnection ] <<= m_rConfigItem.GetConnection().getTyped();
aDescriptor[ svx::daCursor ] <<= m_rConfigItem.GetResultSet();
aDescriptor[ svx::daCommand ] <<= m_rConfigItem.GetCurrentDBData().sCommand;
aDescriptor[ svx::daCommandType ] <<= m_rConfigItem.GetCurrentDBData().nCommandType;
SwMergeDescriptor aMergeDesc( DBMGR_MERGE_ONLY, GetSwView()->GetWrtShell(),
aDescriptor);
aMergeDesc.pMailMergeConfigItem = &m_rConfigItem;
aMergeDesc.bCreateSingleFile = true;
GetSwView()->GetWrtShell().GetDBManager()->MergeNew( aMergeDesc );
m_rConfigItem.SetMergeDone();
if( m_rConfigItem.GetTargetView() )
m_rConfigItem.GetTargetView()->GetViewFrame()->GetFrame().Appear();
diff --git a/sw/source/uibase/dbui/dbmgr.cxx b/sw/source/uibase/dbui/dbmgr.cxx
index fcb47c6..fdd8e69 100644
--- a/sw/source/uibase/dbui/dbmgr.cxx
+++ b/sw/source/uibase/dbui/dbmgr.cxx
@@ -318,7 +318,7 @@ static bool lcl_GetColumnCnt(SwDSParam* pParam,
};
// import data
bool SwDBManager::MergeNew(const SwMergeDescriptor& rMergeDesc )
bool SwDBManager::MergeNew( const SwMergeDescriptor& rMergeDesc )
{
OSL_ENSURE(!bInMerge && !pImpl->pMergeData, "merge already activated!");
@@ -434,6 +434,7 @@ bool SwDBManager::MergeNew(const SwMergeDescriptor& rMergeDesc )
case DBMGR_MERGE_MAILING:
case DBMGR_MERGE_MAILFILES:
case DBMGR_MERGE_SINGLE_FILE:
case DBMGR_MERGE_ONLY:
// save files and send them as e-Mail if required
bRet = MergeMailFiles(&rMergeDesc.rSh,
rMergeDesc);
@@ -849,13 +850,14 @@ static void lcl_SaveDoc( SfxObjectShell *xTargetDocShell,
#endif
bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell,
const SwMergeDescriptor& rMergeDescriptor)
const SwMergeDescriptor& rMergeDescriptor)
{
//check if the doc is synchronized and contains at least one linked section
bool bSynchronizedDoc = pSourceShell->IsLabelDoc() && pSourceShell->GetSectionFmtCount() > 1;
bool bNoError = true;
bool bEMail = rMergeDescriptor.nMergeType == DBMGR_MERGE_MAILING;
const bool bAsSingleFile = rMergeDescriptor.nMergeType == DBMGR_MERGE_SINGLE_FILE;
bool bMergeOnly = rMergeDescriptor.nMergeType == DBMGR_MERGE_ONLY;
::rtl::Reference< MailDispatcher > xMailDispatcher;
OUString sBodyMimeType;
@@ -925,9 +927,7 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell,
SwWrtShell* pTargetShell = 0;
SwDoc* pTargetDoc = 0;
// the shell will be explicitly closed at the end of the method, but it is
// still more safe to use SfxObjectShellLock here
SfxObjectShellLock xTargetDocShell;
SfxObjectShellRef xTargetDocShell;
SwView* pTargetView = 0;
boost::scoped_ptr< utl::TempFile > aTempFile;
@@ -1126,6 +1126,7 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell,
else
pTargetPageDesc = pTargetShell->FindPageDescByName( sModifiedStartingPageDesc );
sal_uInt16 nStartPage = pTargetShell->GetPageCnt();
#ifdef DBG_UTIL
if ( nDocNo <= MAX_DOC_DUMP )
lcl_SaveDoc( xWorkDocSh, "WorkDoc", nDocNo );
@@ -1139,6 +1140,15 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell,
if ( nDocNo <= MAX_DOC_DUMP )
lcl_SaveDoc( xTargetDocShell, "MergeDoc" );
#endif
if (bMergeOnly)
{
SwDocMergeInfo aMergeInfo;
aMergeInfo.nStartPageInTarget = nStartPage;
aMergeInfo.nEndPageInTarget =
nStartPage + pSourceShell->GetPageCnt() - 1;
aMergeInfo.nDBRow = nStartRow;
rMergeDescriptor.pMailMergeConfigItem->AddMergedDocument( aMergeInfo );
}
}
else
{
@@ -1278,7 +1288,11 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell,
aPrtMonDlg.Show( false );
// save the single output document
if(rMergeDescriptor.bCreateSingleFile || bAsSingleFile)
if (bMergeOnly)
{
rMergeDescriptor.pMailMergeConfigItem->SetTargetView( pTargetView );
}
else if(rMergeDescriptor.bCreateSingleFile || bAsSingleFile)
{
if( rMergeDescriptor.nMergeType != DBMGR_MERGE_MAILMERGE )
{
@@ -1347,7 +1361,10 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell,
pTargetView->ExecPrint( aOptions, IsMergeSilent(), rMergeDescriptor.bPrintAsync );
}
xTargetDocShell->DoClose();
// Leave docshell available for caller (e.g. MM wizard)
if (!bMergeOnly)
xTargetDocShell->DoClose();
}
//remove the temporary files
@@ -2770,7 +2787,7 @@ sal_Int32 SwDBManager::MergeDocuments( SwMailMergeConfigItem& rMMConfig,
bInMerge = true;
sal_Int32 nRet = 0;
pImpl->pMergeData = new SwDSParam(
rMMConfig.GetCurrentDBData(), xResultSet, rMMConfig.GetSelection());
rMMConfig.GetCurrentDBData(), xResultSet, rMMConfig.GetSelection());
try{
//set to start position