summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOliver Specht <oliver.specht@cib.de>2016-05-18 14:29:01 +0200
committerOliver Specht <oliver.specht@cib.de>2016-05-19 07:08:33 +0000
commit7b24f21a46d8f9321434e40e6f9821df0ed2e2d3 (patch)
tree38e44c93b0805a234ce8a71ae1c152b64117791c
parent5cf5dc32202e2b785f5a7979a16da3b2a35dee5f (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>
-rw-r--r--sw/inc/dbmgr.hxx2
-rw-r--r--sw/source/ui/dbui/mmresultdialogs.cxx67
-rw-r--r--sw/source/uibase/app/apphdl.cxx36
-rw-r--r--sw/source/uibase/dbui/dbmgr.cxx26
-rw-r--r--sw/source/uibase/dbui/mmconfigitem.cxx16
-rw-r--r--sw/source/uibase/inc/mmconfigitem.hxx2
-rw-r--r--sw/source/uibase/uiview/uivwimp.cxx3
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;