[Libreoffice-commits] core.git: sw/inc sw/source

Oliver Specht oliver.specht at cib.de
Thu May 19 07:08:54 UTC 2016


 sw/inc/dbmgr.hxx                       |    2 
 sw/source/ui/dbui/mmresultdialogs.cxx  |   67 +++++++++++++++++++--------------
 sw/source/uibase/app/apphdl.cxx        |   36 +----------------
 sw/source/uibase/dbui/dbmgr.cxx        |   26 ++++++++++++
 sw/source/uibase/dbui/mmconfigitem.cxx |   16 ++++++-
 sw/source/uibase/inc/mmconfigitem.hxx  |    2 
 sw/source/uibase/uiview/uivwimp.cxx    |    3 -
 7 files changed, 89 insertions(+), 63 deletions(-)

New commits:
commit 7b24f21a46d8f9321434e40e6f9821df0ed2e2d3
Author: Oliver Specht <oliver.specht at cib.de>
Date:   Wed May 18 14:29:01 2016 +0200

    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 at libreoffice.org>
    Reviewed-by: Oliver Specht <oliver.specht at cib.de>

diff --git a/sw/inc/dbmgr.hxx b/sw/inc/dbmgr.hxx
index c916542..8acdc55 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 015d8285..1c6218a 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 c623d48..8f93cdb4 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 576a9fa..74c2a72 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 6e2d1fd..031897a 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 d70445e..6a1d744 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 830e32d..115ba4d 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;


More information about the Libreoffice-commits mailing list