diff options
author | Oliver Specht <oliver.specht@cib.de> | 2016-05-18 14:29:01 +0200 |
---|---|---|
committer | Oliver Specht <oliver.specht@cib.de> | 2016-05-19 07:08:33 +0000 |
commit | 7b24f21a46d8f9321434e40e6f9821df0ed2e2d3 (patch) | |
tree | 38e44c93b0805a234ce8a71ae1c152b64117791c /sw | |
parent | 5cf5dc32202e2b785f5a7979a16da3b2a35dee5f (diff) |
tdf#98985 create merge results at the right time
When using mail merge toolbar the resulting documents are now created
on OK in Save/Print and Send dialogs.
Additionally the 'To' is set in the save dialog and the
MailMergeConfigItem ist not deleted twice anymore.
Change-Id: I21f1f49d8bbd40c11b6f771e15b89e0f6c4bc87a
Reviewed-on: https://gerrit.libreoffice.org/25104
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Oliver Specht <oliver.specht@cib.de>
Diffstat (limited to 'sw')
-rw-r--r-- | sw/inc/dbmgr.hxx | 2 | ||||
-rw-r--r-- | sw/source/ui/dbui/mmresultdialogs.cxx | 67 | ||||
-rw-r--r-- | sw/source/uibase/app/apphdl.cxx | 36 | ||||
-rw-r--r-- | sw/source/uibase/dbui/dbmgr.cxx | 26 | ||||
-rw-r--r-- | sw/source/uibase/dbui/mmconfigitem.cxx | 16 | ||||
-rw-r--r-- | sw/source/uibase/inc/mmconfigitem.hxx | 2 | ||||
-rw-r--r-- | sw/source/uibase/uiview/uivwimp.cxx | 3 |
7 files changed, 89 insertions, 63 deletions
diff --git a/sw/inc/dbmgr.hxx b/sw/inc/dbmgr.hxx index c916542ca462..8acdc55009c8 100644 --- a/sw/inc/dbmgr.hxx +++ b/sw/inc/dbmgr.hxx @@ -296,6 +296,8 @@ public: inline bool IsMergeCancel() { return MergeStatus::CANCEL <= m_aMergeStatus; }; inline bool IsMergeError() { return MergeStatus::ERROR <= m_aMergeStatus; }; + static SwMailMergeConfigItem* PerformMailMerge(SwView* pView); + /// Initialize data fields that lack name of database. inline bool IsInitDBFields() const { return bInitDBFields; } inline void SetInitDBFields(bool b) { bInitDBFields = b; } diff --git a/sw/source/ui/dbui/mmresultdialogs.cxx b/sw/source/ui/dbui/mmresultdialogs.cxx index 015d8285fc28..1c6218af3697 100644 --- a/sw/source/ui/dbui/mmresultdialogs.cxx +++ b/sw/source/ui/dbui/mmresultdialogs.cxx @@ -236,6 +236,12 @@ SwMMResultSaveDialog::SwMMResultSaveDialog(vcl::Window* pParent) m_pFromRB->SetClickHdl(aLink); // m_pSaveAsOneRB is the default, so disable m_pFromNF and m_pToNF initially. aLink.Call(m_pSaveAsOneRB); + SwView* pView = ::GetActiveView(); + SwMailMergeConfigItem* pConfigItem = pView->GetMailMergeConfigItem(); + assert(pConfigItem); + sal_Int32 nCount = pConfigItem->GetMergedDocumentCount();; + m_pToNF->SetMax(nCount); + m_pToNF->SetValue(nCount); m_pOKButton->SetClickHdl(LINK(this, SwMMResultSaveDialog, SaveOutputHdl_Impl)); } @@ -372,30 +378,37 @@ void SwMMResultEmailDialog::dispose() void SwMMResultPrintDialog::FillInPrinterSettings() { //fill printer ListBox + SwView* pView = ::GetActiveView(); + SwMailMergeConfigItem* pConfigItem = pView->GetMailMergeConfigItem(); const std::vector<OUString>& rPrinters = Printer::GetPrinterQueues(); unsigned int nCount = rPrinters.size(); + bool bMergePrinterExists = false; if ( nCount ) { for( unsigned int i = 0; i < nCount; i++ ) { m_pPrinterLB->InsertEntry( rPrinters[i] ); + if( !bMergePrinterExists && rPrinters[i] == pConfigItem->GetSelectedPrinter() ) + bMergePrinterExists = true; } } - SwView* pView = ::GetActiveView(); - SwMailMergeConfigItem* pConfigItem = pView->GetMailMergeConfigItem(); assert(pConfigItem); - - SwView* pTargetView = pConfigItem->GetTargetView(); - OSL_ENSURE(pTargetView, "no target view exists"); - if(pTargetView) + if(!bMergePrinterExists) { - SfxPrinter* pPrinter = pTargetView->GetWrtShell().getIDocumentDeviceAccess().getPrinter( true ); + SfxPrinter* pPrinter = pView->GetWrtShell().getIDocumentDeviceAccess().getPrinter( true ); m_pPrinterLB->SelectEntry(pPrinter->GetName()); - m_pToNF->SetValue(pConfigItem->GetMergedDocumentCount()); - m_pToNF->SetMax(pConfigItem->GetMergedDocumentCount()); } + else + { + m_pPrinterLB->SelectEntry(pConfigItem->GetSelectedPrinter()); + } + + sal_Int32 count = pConfigItem->GetMergedDocumentCount();; + m_pToNF->SetValue(count); + m_pToNF->SetMax(count); + m_pPrinterLB->SelectEntry(pConfigItem->GetSelectedPrinter()); } @@ -558,6 +571,8 @@ IMPL_LINK_TYPED(SwMMResultSaveDialog, SaveOutputHdl_Impl, Button*, pButton, void SwView* pView = ::GetActiveView(); SwMailMergeConfigItem* pConfigItem = pView->GetMailMergeConfigItem(); assert(pConfigItem); + if(!pConfigItem->GetTargetView()) + SwDBManager::PerformMailMerge(pView); SwView* pTargetView = pConfigItem->GetTargetView(); assert(pTargetView); @@ -600,17 +615,19 @@ IMPL_LINK_TYPED(SwMMResultSaveDialog, SaveOutputHdl_Impl, Button*, pButton, void { sal_uInt32 nBegin = 0; sal_uInt32 nEnd = 0; + sal_uInt32 documentCount = pConfigItem->GetMergedDocumentCount(); + if(m_pSaveIndividualRB->IsChecked()) { nBegin = 0; - nEnd = pConfigItem->GetMergedDocumentCount(); + nEnd = documentCount; } else { nBegin = static_cast< sal_Int32 >(m_pFromNF->GetValue() - 1); nEnd = static_cast< sal_Int32 >(m_pToNF->GetValue()); - if(nEnd > pConfigItem->GetMergedDocumentCount()) - nEnd = pConfigItem->GetMergedDocumentCount(); + if(nEnd > documentCount) + nEnd = documentCount; } OUString sFilter; OUString sPath = SwMailMergeHelper::CallSaveAsDialog(sFilter); @@ -746,11 +763,7 @@ IMPL_LINK_TYPED(SwMMResultPrintDialog, PrinterChangeHdl_Impl, ListBox&, rBox, vo SwView* pView = ::GetActiveView(); SwMailMergeConfigItem* pConfigItem = pView->GetMailMergeConfigItem(); assert(pConfigItem); - - SwView *const pTargetView = pConfigItem->GetTargetView(); - SfxPrinter *const pDocumentPrinter = pTargetView->GetWrtShell() - .getIDocumentDeviceAccess().getPrinter(true); - if (pDocumentPrinter && rBox.GetSelectEntryPos() != LISTBOX_ENTRY_NOTFOUND) + if (rBox.GetSelectEntryPos() != LISTBOX_ENTRY_NOTFOUND) { const QueueInfo* pInfo = Printer::GetQueueInfo( rBox.GetSelectEntry(), false ); @@ -758,13 +771,7 @@ IMPL_LINK_TYPED(SwMMResultPrintDialog, PrinterChangeHdl_Impl, ListBox&, rBox, vo { if ( !m_pTempPrinter ) { - if ((pDocumentPrinter->GetName() == pInfo->GetPrinterName()) && - (pDocumentPrinter->GetDriverName() == pInfo->GetDriver())) - { - m_pTempPrinter = VclPtr<Printer>::Create(pDocumentPrinter->GetJobSetup()); - } - else - m_pTempPrinter = VclPtr<Printer>::Create( *pInfo ); + m_pTempPrinter = VclPtr<Printer>::Create( *pInfo ); } else { @@ -792,23 +799,27 @@ IMPL_LINK_TYPED(SwMMResultPrintDialog, PrintHdl_Impl, Button*, pButton, void) SwView* pView = ::GetActiveView(); SwMailMergeConfigItem* pConfigItem = pView->GetMailMergeConfigItem(); assert(pConfigItem); + if(!pConfigItem->GetTargetView()) + SwDBManager::PerformMailMerge(pView); SwView* pTargetView = pConfigItem->GetTargetView(); assert(pTargetView); sal_uInt32 nBegin = 0; sal_uInt32 nEnd = 0; + sal_uInt32 documentCount = pConfigItem->GetMergedDocumentCount(); + if(m_pPrintAllRB->IsChecked()) { nBegin = 0; - nEnd = pConfigItem->GetMergedDocumentCount(); + nEnd = documentCount; } else { nBegin = static_cast< sal_Int32 >(m_pFromNF->GetValue() - 1); nEnd = static_cast< sal_Int32 >(m_pToNF->GetValue()); - if(nEnd > pConfigItem->GetMergedDocumentCount()) - nEnd = pConfigItem->GetMergedDocumentCount(); + if(nEnd > documentCount) + nEnd = documentCount; } pConfigItem->SetPrintRange((sal_uInt16)nBegin, (sal_uInt16)nEnd); @@ -891,6 +902,8 @@ IMPL_LINK_TYPED(SwMMResultEmailDialog, SendDocumentsHdl_Impl, Button*, pButton, SwView* pView = ::GetActiveView(); SwMailMergeConfigItem* pConfigItem = pView->GetMailMergeConfigItem(); assert(pConfigItem); + if(!pConfigItem->GetTargetView()) + SwDBManager::PerformMailMerge(pView); //get the composed document SwView* pTargetView = pConfigItem->GetTargetView(); diff --git a/sw/source/uibase/app/apphdl.cxx b/sw/source/uibase/app/apphdl.cxx index c623d484a117..8f93cdb42cc7 100644 --- a/sw/source/uibase/app/apphdl.cxx +++ b/sw/source/uibase/app/apphdl.cxx @@ -615,34 +615,6 @@ IMPL_LINK_NOARG_TYPED(SwMailMergeWizardExecutor, CloseFrameHdl, void*, void) m_pView2Close = nullptr; } } - -SwMailMergeConfigItem* PerformMailMerge(SwView* pView) -{ - SwMailMergeConfigItem* pConfigItem = pView->GetMailMergeConfigItem(); - if (!pConfigItem) - return nullptr; - - svx::ODataAccessDescriptor aDescriptor; - aDescriptor.setDataSource(pConfigItem->GetCurrentDBData().sDataSource); - aDescriptor[ svx::daConnection ] <<= pConfigItem->GetConnection().getTyped(); - aDescriptor[ svx::daCursor ] <<= pConfigItem->GetResultSet(); - aDescriptor[ svx::daCommand ] <<= pConfigItem->GetCurrentDBData().sCommand; - aDescriptor[ svx::daCommandType ] <<= pConfigItem->GetCurrentDBData().nCommandType; - aDescriptor[ svx::daSelection ] <<= pConfigItem->GetSelection(); - - SwWrtShell& rSh = pView->GetWrtShell(); - pConfigItem->SetTargetView(nullptr); - - SwMergeDescriptor aMergeDesc(DBMGR_MERGE_SHELL, rSh, aDescriptor); - aMergeDesc.pMailMergeConfigItem = pConfigItem; - aMergeDesc.bCreateSingleFile = true; - rSh.GetDBManager()->Merge(aMergeDesc); - - pConfigItem->SetMergeDone(); - - return pConfigItem; -} - } // namespace #endif // HAVE_FEATURE_DBCONNECTIVITY @@ -789,7 +761,7 @@ void SwModule::ExecOther(SfxRequest& rReq) break; case FN_MAILMERGE_CREATE_DOCUMENTS: { - SwMailMergeConfigItem* pConfigItem = PerformMailMerge(GetActiveView()); + SwMailMergeConfigItem* pConfigItem = SwDBManager::PerformMailMerge(GetActiveView()); if (pConfigItem && pConfigItem->GetTargetView()) pConfigItem->GetTargetView()->GetViewFrame()->GetFrame().Appear(); @@ -799,10 +771,10 @@ void SwModule::ExecOther(SfxRequest& rReq) case FN_MAILMERGE_PRINT_DOCUMENTS: case FN_MAILMERGE_EMAIL_DOCUMENTS: { - SwMailMergeConfigItem* pConfigItem = PerformMailMerge(GetActiveView()); - if (!pConfigItem) + SwMailMergeConfigItem* pConfigItem = GetActiveView()->GetMailMergeConfigItem(); + if(!pConfigItem) return; - + pConfigItem->SetTargetView(nullptr); SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create(); switch (nWhich) { diff --git a/sw/source/uibase/dbui/dbmgr.cxx b/sw/source/uibase/dbui/dbmgr.cxx index 576a9fa9adac..74c2a7259752 100644 --- a/sw/source/uibase/dbui/dbmgr.cxx +++ b/sw/source/uibase/dbui/dbmgr.cxx @@ -3086,5 +3086,31 @@ void SwConnectionDisposedListener_Impl::disposing( const lang::EventObject& rSou } } } +SwMailMergeConfigItem* SwDBManager::PerformMailMerge(SwView* pView) +{ + SwMailMergeConfigItem* pConfigItem = pView->GetMailMergeConfigItem(); + if (!pConfigItem) + return nullptr; + + svx::ODataAccessDescriptor aDescriptor; + aDescriptor.setDataSource(pConfigItem->GetCurrentDBData().sDataSource); + aDescriptor[ svx::daConnection ] <<= pConfigItem->GetConnection().getTyped(); + aDescriptor[ svx::daCursor ] <<= pConfigItem->GetResultSet(); + aDescriptor[ svx::daCommand ] <<= pConfigItem->GetCurrentDBData().sCommand; + aDescriptor[ svx::daCommandType ] <<= pConfigItem->GetCurrentDBData().nCommandType; + aDescriptor[ svx::daSelection ] <<= pConfigItem->GetSelection(); + + SwWrtShell& rSh = pView->GetWrtShell(); + pConfigItem->SetTargetView(nullptr); + + SwMergeDescriptor aMergeDesc(DBMGR_MERGE_SHELL, rSh, aDescriptor); + aMergeDesc.pMailMergeConfigItem = pConfigItem; + aMergeDesc.bCreateSingleFile = true; + rSh.GetDBManager()->Merge(aMergeDesc); + + pConfigItem->SetMergeDone(); + + return pConfigItem; +} /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/uibase/dbui/mmconfigitem.cxx b/sw/source/uibase/dbui/mmconfigitem.cxx index 6e2d1fd3d4ed..031897a202ba 100644 --- a/sw/source/uibase/dbui/mmconfigitem.cxx +++ b/sw/source/uibase/dbui/mmconfigitem.cxx @@ -1576,9 +1576,20 @@ SwDocMergeInfo& SwMailMergeConfigItem::GetDocumentMergeInfo(sal_uInt32 nDocument return m_pImpl->m_aMergeInfos[nDocument]; } -sal_uInt32 SwMailMergeConfigItem::GetMergedDocumentCount() const + +sal_uInt32 SwMailMergeConfigItem::GetMergedDocumentCount() { - return m_pImpl->m_aMergeInfos.size(); + if(m_pTargetView) + return m_pImpl->m_aMergeInfos.size(); + else + { + sal_Int32 nRestore = GetResultSetPosition(); + MoveResultSet(-1); + sal_Int32 nRet = GetResultSetPosition(); + MoveResultSet( nRestore ); + nRet -= m_aExcludedRecords.size(); + return nRet >= 0 ? nRet : 0; + } } static SwView* lcl_ExistsView(SwView* pView) @@ -1611,6 +1622,7 @@ void SwMailMergeConfigItem::SetTargetView(SwView* pView) if(!m_pTargetView) { m_pImpl->m_aMergeInfos.clear(); + m_bMergeDone = false; } } diff --git a/sw/source/uibase/inc/mmconfigitem.hxx b/sw/source/uibase/inc/mmconfigitem.hxx index d70445ed5d32..6a1d7447c1e0 100644 --- a/sw/source/uibase/inc/mmconfigitem.hxx +++ b/sw/source/uibase/inc/mmconfigitem.hxx @@ -239,7 +239,7 @@ public: void AddMergedDocument(SwDocMergeInfo& rInfo); //returns the page and database cursor information of each merged document SwDocMergeInfo& GetDocumentMergeInfo(sal_uInt32 nDocument); - sal_uInt32 GetMergedDocumentCount() const; + sal_uInt32 GetMergedDocumentCount(); void SetPrintRange( sal_uInt16 nStartDocument, sal_uInt16 nEndDocument) { m_nStartPrint = nStartDocument; m_nEndPrint = nEndDocument; } diff --git a/sw/source/uibase/uiview/uivwimp.cxx b/sw/source/uibase/uiview/uivwimp.cxx index 830e32d8e85f..115ba4d22865 100644 --- a/sw/source/uibase/uiview/uivwimp.cxx +++ b/sw/source/uibase/uiview/uivwimp.cxx @@ -97,7 +97,8 @@ SwView_Impl::~SwView_Impl() pClipEvtLstnr->ViewDestroyed(); } #if HAVE_FEATURE_DBCONNECTIVITY - delete pConfigItem; + if(bMailMergeSourceView) + delete pConfigItem; #endif delete m_pDocInserter; delete m_pRequest; |