blob: c7690db2ff2e9fa476faae6fbbe51964201c337f [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sw.hxx"
#ifdef SW_DLLIMPLEMENTATION
#undef SW_DLLIMPLEMENTATION
#endif
#include <mmoutputpage.hxx>
#include <mailmergewizard.hxx>
#include <mmconfigitem.hxx>
#include <mailmergechildwindow.hxx>
#include <mailconfigpage.hxx>
#include <cmdid.h>
#include <swtypes.hxx>
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#include <wrtsh.hxx>
#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#ifndef IDOCUMENTDEVICEACCESS_HXX_INCLUDED
#include <IDocumentDeviceAccess.hxx>
#endif
#include <hintids.hxx>
#include <editeng/scripttypeitem.hxx>
#include <editeng/langitem.hxx>
#include <svl/itemset.hxx>
#include <svl/stritem.hxx>
#include <svtools/ehdl.hxx>
#include <svtools/sfxecode.hxx>
#include <vcl/msgbox.hxx>
#include <sfx2/dinfdlg.hxx>
#include <sfx2/printer.hxx>
#include <sfx2/fcontnr.hxx>
#include <sfx2/viewfrm.hxx>
#include <sfx2/dispatch.hxx>
#include <sfx2/docfile.hxx>
//#ifndef _SFX_DOCFILT_HACK_HXX
//#include <sfx2/docfilt.hxx>
//#endif
#include <tools/urlobj.hxx>
#include <svl/urihelper.hxx>
#ifndef _VCL_PRINT_HXX
#include <vcl/print.hxx>
#endif
#include <unotools/tempfile.hxx>
#include <osl/file.hxx>
#include <mmgreetingspage.hxx>
#include <com/sun/star/frame/XStorable.hpp>
#include <com/sun/star/sdbcx/XColumnsSupplier.hpp>
#include <com/sun/star/sdb/XColumn.hpp>
//#ifndef _COM_SUN_STAR_BEANS_PROPERTYVALUE_HPP_
//#include <com/sun/star/beans/PropertyValue.hpp>
//#endif
//#ifndef _BASEDLGS_HXX
//#include <sfx2/basedlgs.hxx>
//#endif
#ifndef _DBMGR_HXX
#include <dbmgr.hxx>
#endif
#include <swunohelper.hxx>
#include <vos/mutex.hxx>
#include <shellio.hxx>
#include <svtools/htmlcfg.hxx>
#include <sfx2/event.hxx>
#include <swevent.hxx>
#include <mmoutputpage.hrc>
#include <dbui.hxx>
#include <dbui.hrc>
#include <helpid.h>
#include <sfx2/app.hxx>
#include <statstr.hrc>
#include <unomid.h>
using namespace svt;
using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
/*-- 01.07.2004 16:47:49---------------------------------------------------
-----------------------------------------------------------------------*/
String lcl_GetExtensionForDocType(sal_uLong nDocType)
{
String sExtension;
switch( nDocType )
{
case MM_DOCTYPE_OOO : sExtension = String::CreateFromAscii( "odt" ); break;
case MM_DOCTYPE_PDF : sExtension = String::CreateFromAscii( "pdf" ); break;
case MM_DOCTYPE_WORD: sExtension = String::CreateFromAscii( "doc" ); break;
case MM_DOCTYPE_HTML: sExtension = String::CreateFromAscii( "html" ); break;
case MM_DOCTYPE_TEXT: sExtension = String::CreateFromAscii( "txt" ); break;
}
return sExtension;
}
/*-- 28.06.2004 11:49:21---------------------------------------------------
-----------------------------------------------------------------------*/
::rtl::OUString lcl_GetColumnValueOf(const ::rtl::OUString& rColumn, Reference < container::XNameAccess>& rxColAccess )
{
::rtl::OUString sRet;
if(rxColAccess->hasByName(rColumn))
{
Any aCol = rxColAccess->getByName(rColumn);
Reference< sdb::XColumn > xColumn;
aCol >>= xColumn;
if(xColumn.is())
sRet = xColumn->getString();
}
return sRet;
}
/*-- 21.06.2004 14:01:13---------------------------------------------------
-----------------------------------------------------------------------*/
class SwSaveWarningBox_Impl : public ModalDialog
{
FixedImage aWarningImageIM;
FixedInfo aWarningFI;
FixedText aFileNameFT;
Edit aFileNameED;
FixedLine aSeparatorFL;
OKButton aOKPB;
CancelButton aCancelPB;
DECL_LINK( ModifyHdl, Edit*);
public:
SwSaveWarningBox_Impl(Window* pParent, const String& rFileName);
~SwSaveWarningBox_Impl();
String GetFileName() const {return aFileNameED.GetText();}
};
/*-- 02.07.2004 08:54:42---------------------------------------------------
-----------------------------------------------------------------------*/
class SwSendQueryBox_Impl : public ModalDialog
{
FixedImage aQueryImageIM;
FixedInfo aQueryFI;
Edit aTextED;
FixedLine aSeparatorFL;
OKButton aOKPB;
CancelButton aCancelPB;
bool bIsEmptyAllowed;
DECL_LINK( ModifyHdl, Edit*);
public:
SwSendQueryBox_Impl(Window* pParent, const String& rQueryText);
~SwSendQueryBox_Impl();
void SetValue(const String& rSet)
{
aTextED.SetText(rSet);
ModifyHdl( &aTextED );
}
String GetValue() const {return aTextED.GetText();}
void SetIsEmptyTextAllowed(bool bSet)
{
bIsEmptyAllowed = bSet;
ModifyHdl( &aTextED );
}
};
/*-- 21.06.2004 14:11:58---------------------------------------------------
-----------------------------------------------------------------------*/
SwSaveWarningBox_Impl::SwSaveWarningBox_Impl(Window* pParent, const String& rFileName) :
ModalDialog(pParent, SW_RES( DLG_MM_SAVEWARNING )),
aWarningImageIM(this, SW_RES( IM_WARNING )),
aWarningFI(this, SW_RES( FI_WARNING )),
aFileNameFT(this, SW_RES( FT_FILENAME )),
aFileNameED(this, SW_RES( ED_FILENAME )),
aSeparatorFL(this, SW_RES( FL_SEPARATOR )),
aOKPB(this, SW_RES( PB_OK )),
aCancelPB(this, SW_RES( PB_CANCEL ))
{
FreeResource();
aWarningImageIM.SetImage(WarningBox::GetStandardImage());
aFileNameED.SetText(rFileName);
aFileNameED.SetModifyHdl(LINK(this, SwSaveWarningBox_Impl, ModifyHdl));
ModifyHdl( &aFileNameED );
}
/*-- 21.06.2004 14:11:58---------------------------------------------------
-----------------------------------------------------------------------*/
SwSaveWarningBox_Impl::~SwSaveWarningBox_Impl()
{
}
/*-- 21.06.2004 14:11:58---------------------------------------------------
-----------------------------------------------------------------------*/
IMPL_LINK( SwSaveWarningBox_Impl, ModifyHdl, Edit*, pEdit)
{
aOKPB.Enable(pEdit->GetText().Len() > 0);
return 0;
}
/*-- 02.07.2004 09:02:53---------------------------------------------------
-----------------------------------------------------------------------*/
SwSendQueryBox_Impl::SwSendQueryBox_Impl(Window* pParent, const String& rText) :
ModalDialog(pParent, SW_RES( DLG_MM_QUERY )),
aQueryImageIM( this, SW_RES( IM_QUERY )),
aQueryFI( this, SW_RES( FI_QUERY )),
aTextED( this, SW_RES( ED_TEXT )),
aSeparatorFL(this, SW_RES( FL_SEPARATOR )),
aOKPB(this, SW_RES( PB_OK )),
aCancelPB(this, SW_RES( PB_CANCEL )),
bIsEmptyAllowed(true)
{
FreeResource();
aQueryFI.SetText(rText);
aQueryImageIM.SetImage(QueryBox::GetStandardImage());
aTextED.SetModifyHdl(LINK(this, SwSendQueryBox_Impl, ModifyHdl));
ModifyHdl( &aTextED );
}
/*-- 02.07.2004 08:58:45---------------------------------------------------
-----------------------------------------------------------------------*/
SwSendQueryBox_Impl::~SwSendQueryBox_Impl()
{
}
/*-- 02.07.2004 08:58:25---------------------------------------------------
-----------------------------------------------------------------------*/
IMPL_LINK( SwSendQueryBox_Impl, ModifyHdl, Edit*, pEdit)
{
aOKPB.Enable(bIsEmptyAllowed || (pEdit->GetText().Len() > 0));
return 0;
}
/*-- 16.04.2004 16:34:48---------------------------------------------------
-----------------------------------------------------------------------*/
class SwCopyToDialog : public SfxModalDialog
{
FixedInfo m_aDescriptionFI;
FixedText m_aCCFT;
Edit m_aCCED;
FixedText m_aBCCFT;
Edit m_aBCCED;
FixedInfo m_aNoteFI;
FixedLine m_aSeparatorFL;
OKButton m_aOK;
CancelButton m_aCancel;
HelpButton m_aHelp;
public:
SwCopyToDialog(Window* pParent);
~SwCopyToDialog();
String GetCC() {return m_aCCED.GetText();}
void SetCC(const String& rSet) {m_aCCED.SetText(rSet);}
String GetBCC() {return m_aBCCED.GetText();}
void SetBCC(const String& rSet) {m_aBCCED.SetText(rSet);}
};
/*-- 16.04.2004 16:43:18---------------------------------------------------
-----------------------------------------------------------------------*/
SwCopyToDialog::SwCopyToDialog(Window* pParent) :
SfxModalDialog(pParent, SW_RES(DLG_MM_COPYTO)),
#ifdef MSC
#pragma warning (disable : 4355)
#endif
m_aDescriptionFI( this, SW_RES( FI_DESCRIPTION )),
m_aCCFT( this, SW_RES( FT_CC )),
m_aCCED( this, SW_RES( ED_CC )),
m_aBCCFT( this, SW_RES( FT_BCC )),
m_aBCCED( this, SW_RES( ED_BCC )),
m_aNoteFI( this, SW_RES( FI_NOTE )),
m_aSeparatorFL( this, SW_RES( FL_SEPARATOR )),
m_aOK( this, SW_RES( PB_OK )),
m_aCancel( this, SW_RES( PB_CANCEL )),
m_aHelp( this, SW_RES( PB_HELP ))
#ifdef MSC
#pragma warning (default : 4355)
#endif
{
FreeResource();
}
/*-- 16.04.2004 16:43:10---------------------------------------------------
-----------------------------------------------------------------------*/
SwCopyToDialog::~SwCopyToDialog()
{
}
/*-- 02.04.2004 13:15:54---------------------------------------------------
-----------------------------------------------------------------------*/
SwMailMergeOutputPage::SwMailMergeOutputPage( SwMailMergeWizard* _pParent) :
svt::OWizardPage( _pParent, SW_RES(DLG_MM_OUTPUT_PAGE)),
#ifdef MSC
#pragma warning (disable : 4355)
#endif
m_aHeaderFI(this, SW_RES( FI_HEADER ) ),
m_aOptionsFI(this, SW_RES( FI_OPTIONS ) ),
m_aSaveStartDocRB(this, SW_RES( RB_SAVESTARTDOC ) ),
m_aSaveMergedDocRB(this, SW_RES( RB_SAVEMERGEDDOC ) ),
m_aPrintRB(this, SW_RES( RB_PRINT ) ),
m_aSendMailRB(this, SW_RES( RB_SENDMAIL ) ),
m_aSeparatorFL(this, SW_RES( FL_SEPARATOR ) ),
m_aSaveStartDocPB(this, SW_RES( PB_SAVESTARTDOC ) ),
m_aSaveAsOneRB(this, SW_RES( RB_SAVEASONE ) ),
m_aSaveIndividualRB(this, SW_RES( RB_SAVEINDIVIDUAL ) ),
m_aPrintAllRB(this, SW_RES( RB_PRINTALL ) ),
m_aSendAllRB( this, SW_RES( RB_SENDALL ) ),
m_aFromRB(this, SW_RES( RB_FROM ) ),
m_aFromNF(this, SW_RES( NF_FROM ) ),
m_aToFT(this, SW_RES( FT_TO ) ),
m_aToNF(this, SW_RES( NF_TO ) ),
m_aSaveNowPB(this, SW_RES( PB_SAVENOW ) ),
m_aPrinterFT(this, SW_RES( FT_PRINT ) ),
m_aPrinterLB(this, SW_RES( LB_PRINT ) ),
m_aPrinterSettingsPB(this, SW_RES( PB_PRINTERSETTINGS ) ),
m_aPrintNowPB(this, SW_RES( PB_PRINTNOW ) ),
m_aMailToFT( this, SW_RES( FT_MAILTO ) ),
m_aMailToLB( this, SW_RES( LB_MAILTO ) ),
m_aCopyToPB( this, SW_RES( PB_COPYTO ) ),
m_aSubjectFT( this, SW_RES( FT_SUBJECT ) ),
m_aSubjectED( this, SW_RES( ED_SUBJECT ) ),
m_aSendAsFT( this, SW_RES( FT_SENDAS ) ),
m_aSendAsLB( this, SW_RES( LB_SENDAS ) ),
m_aAttachmentFT( this, SW_RES( FT_ATTACHMENT ) ),
m_aAttachmentED( this, SW_RES( ED_ATTACHMENT ) ),
m_aSendAsPB( this, SW_RES( PB_SENDAS ) ),
m_aSendDocumentsPB( this, SW_RES( PB_SENDDOCUMENTS ) ),
m_sSaveStartST(SW_RES( ST_SAVESTART ) ),
m_sSaveMergedST(SW_RES( ST_SAVEMERGED ) ),
m_sPrintST(SW_RES( ST_PRINT ) ),
m_sSendMailST(SW_RES( ST_SENDMAIL ) ),
m_sDefaultAttachmentST(SW_RES( ST_DEFAULTATTACHMENT )),
m_sNoSubjectQueryST(SW_RES( ST_SUBJECTQUERY )),
m_sNoSubjectST(SW_RES( ST_NOSUBJECT )),
m_sNoAttachmentNameST(SW_RES( ST_NOATTACHMENTNAME )),
m_sConfigureMail(SW_RES( ST_CONFIGUREMAIL)),
#ifdef MSC
#pragma warning (default : 4355)
#endif
m_bCancelSaving( false ),
m_pWizard(_pParent),
m_pTempPrinter( 0 ),
m_pDocumentPrinterCopy(0)
{
FreeResource();
SwMailMergeConfigItem& rConfigItem = m_pWizard->GetConfigItem();
// #i51949# hide e-Mail option if e-Mail is not supported
if(!rConfigItem.IsMailAvailable())
m_aSendMailRB.Hide();
Link aLink = LINK(this, SwMailMergeOutputPage, OutputTypeHdl_Impl);
m_aSaveStartDocRB.SetClickHdl(aLink);
m_aSaveMergedDocRB.SetClickHdl(aLink);
m_aPrintRB.SetClickHdl(aLink);
m_aSendMailRB.SetClickHdl(aLink);
m_aSaveStartDocRB.Check();
m_aPrintAllRB.Check();
m_aSaveAsOneRB.Check();
m_aSendAllRB.Check();
m_aSaveStartDocPB.SetClickHdl(LINK(this, SwMailMergeOutputPage, SaveStartHdl_Impl));
m_aSaveNowPB.SetClickHdl(LINK(this, SwMailMergeOutputPage, SaveOutputHdl_Impl));
m_aPrinterLB.SetSelectHdl(LINK(this, SwMailMergeOutputPage, PrinterChangeHdl_Impl));
m_aPrintNowPB.SetClickHdl(LINK(this, SwMailMergeOutputPage, PrintHdl_Impl));
m_aPrinterSettingsPB.SetClickHdl(LINK(this, SwMailMergeOutputPage, PrinterSetupHdl_Impl));
m_aSendAsPB.SetClickHdl(LINK(this, SwMailMergeOutputPage, SendAsHdl_Impl)),
m_aSendDocumentsPB.SetClickHdl(LINK(this, SwMailMergeOutputPage, SendDocumentsHdl_Impl)),
m_aSendAsLB.SetSelectHdl(LINK(this, SwMailMergeOutputPage, SendTypeHdl_Impl));
m_nFromToRBPos = m_aFromRB.GetPosPixel().Y();
m_nFromToFTPos = m_aToFT.GetPosPixel().Y();
m_nFromToNFPos = m_aFromNF.GetPosPixel().Y();
m_nRBOffset = m_nFromToRBPos - m_aSaveIndividualRB.GetPosPixel().Y();
OutputTypeHdl_Impl(&m_aSaveStartDocRB);
m_aCopyToPB.SetClickHdl(LINK(this, SwMailMergeOutputPage, CopyToHdl_Impl));
m_aSaveAsOneRB.SetClickHdl(LINK(this, SwMailMergeOutputPage, DocumentSelectionHdl_Impl));
m_aSaveIndividualRB.SetClickHdl(LINK(this, SwMailMergeOutputPage, DocumentSelectionHdl_Impl));
m_aPrintAllRB.SetClickHdl(LINK(this, SwMailMergeOutputPage, DocumentSelectionHdl_Impl));
m_aSendAllRB.SetClickHdl(LINK(this, SwMailMergeOutputPage, DocumentSelectionHdl_Impl));
m_aFromRB.SetClickHdl(LINK(this, SwMailMergeOutputPage, DocumentSelectionHdl_Impl));
//#i63267# printing might be disabled
m_aPrintRB.Enable(!Application::GetSettings().GetMiscSettings().GetDisablePrinting());
}
/*-- 02.04.2004 13:15:44---------------------------------------------------
-----------------------------------------------------------------------*/
SwMailMergeOutputPage::~SwMailMergeOutputPage()
{
delete m_pTempPrinter;
delete m_pDocumentPrinterCopy;
}
/*-- 31.01.2005 08:38:14---------------------------------------------------
-----------------------------------------------------------------------*/
void SwMailMergeOutputPage::ActivatePage()
{
//fill printer ListBox
const std::vector<rtl::OUString>& rPrinters = Printer::GetPrinterQueues();
unsigned int nCount = rPrinters.size();
if ( nCount )
{
for( unsigned int i = 0; i < nCount; i++ )
{
m_aPrinterLB.InsertEntry( rPrinters[i] );
}
}
SwMailMergeConfigItem& rConfigItem = m_pWizard->GetConfigItem();
SwView* pTargetView = rConfigItem.GetTargetView();
DBG_ASSERT(pTargetView, "no target view exists");
if(pTargetView)
{
SfxPrinter* pPrinter = pTargetView->GetWrtShell().getIDocumentDeviceAccess()->getPrinter( true );
m_aPrinterLB.SelectEntry( pPrinter->GetName() );
m_aToNF.SetValue( rConfigItem.GetMergedDocumentCount() );
m_aToNF.SetMax( rConfigItem.GetMergedDocumentCount() );
m_pDocumentPrinterCopy = pTargetView->GetWrtShell().getIDocumentDeviceAccess()->getPrinter( true )->Clone();
}
m_aPrinterLB.SelectEntry( rConfigItem.GetSelectedPrinter() );
SwView* pSourceView = rConfigItem.GetSourceView();
DBG_ASSERT(pSourceView, "no source view exists");
if(pSourceView)
{
SwDocShell* pDocShell = pSourceView->GetDocShell();
if ( pDocShell->HasName() )
{
INetURLObject aTmp( pDocShell->GetMedium()->GetName() );
m_aAttachmentED.SetText(aTmp.getName(
INetURLObject::LAST_SEGMENT, true, INetURLObject::DECODE_WITH_CHARSET ));
}
}
}
/*-- 05.07.2004 13:54:11---------------------------------------------------
-----------------------------------------------------------------------*/
bool SwMailMergeOutputPage::canAdvance() const
{
return false;
}
/*-- 02.04.2004 13:15:44---------------------------------------------------
-----------------------------------------------------------------------*/
IMPL_LINK(SwMailMergeOutputPage, OutputTypeHdl_Impl, RadioButton*, pButton)
{
Control* aControls[] =
{
&m_aSaveStartDocPB,
&m_aSaveAsOneRB, &m_aSaveIndividualRB,
&m_aFromRB, &m_aFromNF, &m_aToFT, &m_aToNF,
&m_aSaveNowPB,
&m_aPrinterFT, &m_aPrinterLB, &m_aPrinterSettingsPB, &m_aPrintAllRB,
&m_aPrintNowPB,
&m_aMailToFT, &m_aMailToLB, &m_aCopyToPB,
&m_aSubjectFT, &m_aSubjectED,
&m_aSendAsFT, &m_aSendAsLB, &m_aSendAsPB,
&m_aAttachmentFT, &m_aAttachmentED,
&m_aSendAllRB, &m_aSendDocumentsPB,
0
};
SetUpdateMode(sal_True);
Control** pControl = aControls;
do
{
(*pControl)->Show(sal_False);
} while(*(++pControl));
if(&m_aSaveStartDocRB == pButton)
{
m_aSaveStartDocPB.Show();
m_aSeparatorFL.SetText(m_sSaveStartST);
}
else if(&m_aSaveMergedDocRB == pButton)
{
Control* aSaveMergedControls[] =
{
&m_aSaveAsOneRB, &m_aSaveIndividualRB,
&m_aFromRB, &m_aFromNF, &m_aToFT, &m_aToNF,
&m_aSaveNowPB,
0
};
Control** pSaveMergeControl = aSaveMergedControls;
do
{
(*pSaveMergeControl)->Show(sal_True);
} while(*(++pSaveMergeControl));
if(!m_aFromRB.IsChecked() && !m_aSaveAsOneRB.IsChecked())
{
m_aSaveIndividualRB.Check();
}
m_aSeparatorFL.SetText(m_sSaveMergedST);
//reposition the from/to line
if(m_aFromRB.GetPosPixel().Y() != m_nFromToRBPos)
{
Point aPos(m_aFromRB.GetPosPixel()); aPos.Y() = m_nFromToRBPos; m_aFromRB.SetPosPixel(aPos);
aPos = m_aToFT.GetPosPixel(); aPos.Y() = m_nFromToFTPos; m_aToFT.SetPosPixel(aPos);
aPos = m_aFromNF.GetPosPixel(); aPos.Y() = m_nFromToNFPos; m_aFromNF.SetPosPixel(aPos);
aPos = m_aToNF.GetPosPixel(); aPos.Y() = m_nFromToNFPos; m_aToNF.SetPosPixel(aPos);
}
}
else if(&m_aPrintRB == pButton)
{
Control* aPrintControls[] =
{
&m_aFromRB, &m_aFromNF, &m_aToFT, &m_aToNF,
&m_aPrinterFT, &m_aPrinterLB, &m_aPrinterSettingsPB, &m_aPrintAllRB,
&m_aPrintNowPB,
0
};
Control** pPrinterControl = aPrintControls;
do
{
(*pPrinterControl)->Show(sal_True);
} while(*(++pPrinterControl));
if(!m_aFromRB.IsChecked())
m_aPrintAllRB.Check();
m_aSeparatorFL.SetText(m_sPrintST);
//reposition the from/to line
long nRB_FT_Offset = m_nFromToRBPos - m_nFromToFTPos;
long nNewRBXPos = m_aPrintAllRB.GetPosPixel().Y() + m_nRBOffset;
Point aPos(m_aFromRB.GetPosPixel());aPos.Y() = nNewRBXPos; m_aFromRB.SetPosPixel(aPos);
aPos = m_aToFT.GetPosPixel(); aPos.Y() = nNewRBXPos + nRB_FT_Offset; m_aToFT.SetPosPixel(aPos);
aPos = m_aFromNF.GetPosPixel(); aPos.Y() = nNewRBXPos + nRB_FT_Offset; m_aFromNF.SetPosPixel(aPos);
aPos = m_aToNF.GetPosPixel(); aPos.Y() = nNewRBXPos + nRB_FT_Offset; m_aToNF.SetPosPixel(aPos);
}
else /*if(&m_aSendMailRB == pButton)*/
{
Control* aMailControls[] =
{
&m_aFromRB, &m_aFromNF, &m_aToFT, &m_aToNF,
&m_aMailToFT, &m_aMailToLB, &m_aCopyToPB,
&m_aSubjectFT, &m_aSubjectED,
&m_aSendAsFT, &m_aSendAsLB, &m_aSendAsPB,
&m_aAttachmentFT, &m_aAttachmentED,
&m_aSendAllRB, &m_aSendDocumentsPB, 0
};
Control** pMailControl = aMailControls;
do
{
(*pMailControl)->Show(sal_True);
} while(*(++pMailControl));
if(!m_aFromRB.IsChecked())
m_aSendAllRB.Check();
if(!m_aAttachmentED.GetText().Len())
{
String sAttach( m_sDefaultAttachmentST );
sAttach += '.';
sAttach += lcl_GetExtensionForDocType(
(sal_uLong)m_aSendAsLB.GetEntryData(m_aSendAsLB.GetSelectEntryPos()));
m_aAttachmentED.SetText( sAttach );
}
m_aSeparatorFL.SetText(m_sSendMailST);
//fill mail address ListBox
if(!m_aMailToLB.GetEntryCount())
{
SwMailMergeConfigItem& rConfigItem = m_pWizard->GetConfigItem();
//select first column
uno::Reference< sdbcx::XColumnsSupplier > xColsSupp( rConfigItem.GetResultSet(), uno::UNO_QUERY);
//get the name of the actual columns
uno::Reference < container::XNameAccess> xColAccess = xColsSupp.is() ? xColsSupp->getColumns() : 0;
uno::Sequence< ::rtl::OUString > aFields;
if(xColAccess.is())
aFields = xColAccess->getElementNames();
const ::rtl::OUString* pFields = aFields.getConstArray();
for(sal_Int32 nField = 0; nField < aFields.getLength(); ++nField)
m_aMailToLB.InsertEntry(pFields[nField]);
m_aMailToLB.SelectEntryPos(0);
// then select the right one - may not be available
const ResStringArray& rHeaders = rConfigItem.GetDefaultAddressHeaders();
String sEMailColumn = rHeaders.GetString( MM_PART_E_MAIL );
Sequence< ::rtl::OUString> aAssignment =
rConfigItem.GetColumnAssignment( rConfigItem.GetCurrentDBData() );
if(aAssignment.getLength() > MM_PART_E_MAIL && aAssignment[MM_PART_E_MAIL].getLength())
sEMailColumn = aAssignment[MM_PART_E_MAIL];
m_aMailToLB.SelectEntry(sEMailColumn);
// HTML format pre-selected
m_aSendAsLB.SelectEntryPos(3);
SendTypeHdl_Impl(&m_aSendAsLB);
}
if(m_aSendAllRB.GetPosPixel().Y() + m_nRBOffset != m_aFromRB.GetPosPixel().Y())
{
long nRB_FT_Offset = m_nFromToRBPos - m_nFromToFTPos;
long nNewRBXPos = m_aSendAllRB.GetPosPixel().Y() + m_nRBOffset;
Point aPos(m_aFromRB.GetPosPixel());aPos.Y() = nNewRBXPos; m_aFromRB.SetPosPixel(aPos);
aPos = m_aToFT.GetPosPixel(); aPos.Y() = nNewRBXPos + nRB_FT_Offset; m_aToFT.SetPosPixel(aPos);
aPos = m_aFromNF.GetPosPixel(); aPos.Y() = nNewRBXPos + nRB_FT_Offset; m_aFromNF.SetPosPixel(aPos);
aPos = m_aToNF.GetPosPixel(); aPos.Y() = nNewRBXPos + nRB_FT_Offset; m_aToNF.SetPosPixel(aPos);
}
}
m_aFromRB.GetClickHdl().Call(m_aFromRB.IsChecked() ? &m_aFromRB : 0);
SetUpdateMode(sal_False);
return 0;
}
/*-- 22.08.2005 12:15:10---------------------------------------------------
-----------------------------------------------------------------------*/
IMPL_LINK(SwMailMergeOutputPage, DocumentSelectionHdl_Impl, RadioButton*, pButton)
{
sal_Bool bEnableFromTo = pButton == &m_aFromRB;
m_aFromNF.Enable(bEnableFromTo);
m_aToFT.Enable(bEnableFromTo);
m_aToNF.Enable(bEnableFromTo);
return 0;
}
/*-- 16.04.2004 16:45:10---------------------------------------------------
-----------------------------------------------------------------------*/
IMPL_LINK(SwMailMergeOutputPage, CopyToHdl_Impl, PushButton*, pButton)
{
SwCopyToDialog* pDlg = new SwCopyToDialog(pButton);
pDlg->SetCC(m_sCC );
pDlg->SetBCC(m_sBCC);
if(RET_OK == pDlg->Execute())
{
m_sCC = pDlg->GetCC() ;
m_sBCC = pDlg->GetBCC();
}
delete pDlg;
return 0;
}
/*-- 17.05.2004 13:51:02---------------------------------------------------
-----------------------------------------------------------------------*/
IMPL_LINK(SwMailMergeOutputPage, SaveStartHdl_Impl, PushButton*, pButton)
{
SwMailMergeConfigItem& rConfigItem = m_pWizard->GetConfigItem();
SwView* pSourceView = rConfigItem.GetSourceView();
DBG_ASSERT( pSourceView, "source view missing");
if(pSourceView)
{
SfxViewFrame* pSourceViewFrm = pSourceView->GetViewFrame();
uno::Reference< frame::XFrame > xFrame =
pSourceViewFrm->GetFrame().GetFrameInterface();
xFrame->getContainerWindow()->setVisible(sal_True);
pSourceViewFrm->GetDispatcher()->Execute(SID_SAVEDOC, SFX_CALLMODE_SYNCHRON);
xFrame->getContainerWindow()->setVisible(sal_False);
SwDocShell* pDocShell = pSourceView->GetDocShell();
//if the document has been saved it's URL has to be stored for
// later use and it can be closed now
if(pDocShell->HasName() && !pDocShell->IsModified())
{
INetURLObject aURL = pDocShell->GetMedium()->GetURLObject();
//update the attachment name
if(!m_aAttachmentED.GetText().Len())
{
if ( pDocShell->HasName() )
{
m_aAttachmentED.SetText(aURL.getName(
INetURLObject::LAST_SEGMENT, true, INetURLObject::DECODE_WITH_CHARSET ));
}
}
rConfigItem.AddSavedDocument(
aURL.GetMainURL(INetURLObject::DECODE_TO_IURI));
pButton->Enable(sal_False);
m_pWizard->enableButtons(WZB_FINISH, sal_True);
pButton->Enable(sal_False);
}
}
return 0;
}
/*-- 17.07.2008 08:09:06---------------------------------------------------
-----------------------------------------------------------------------*/
IMPL_LINK(SwMailMergeOutputPage, SaveCancelHdl_Impl, Button*, EMPTYARG )
{
m_bCancelSaving = true;
return 0;
}
/*-- 17.05.2004 13:51:02---------------------------------------------------
-----------------------------------------------------------------------*/
IMPL_LINK(SwMailMergeOutputPage, SaveOutputHdl_Impl, PushButton*, pButton)
{
SwMailMergeConfigItem& rConfigItem = m_pWizard->GetConfigItem();
SwView* pTargetView = rConfigItem.GetTargetView();
DBG_ASSERT(pTargetView, "no target view exists");
if(!pTargetView)
return 0;
if(m_aSaveAsOneRB.IsChecked())
{
String sFilter;
String sPath = SwMailMergeHelper::CallSaveAsDialog(sFilter);
if(!sPath.Len())
return 0;
uno::Sequence< beans::PropertyValue > aValues(1);
beans::PropertyValue* pValues = aValues.getArray();
pValues[0].Name = C2U("FilterName");
pValues[0].Value <<= ::rtl::OUString(sFilter);
uno::Reference< frame::XStorable > xStore( pTargetView->GetDocShell()->GetModel(), uno::UNO_QUERY);
sal_uInt32 nErrorCode = ERRCODE_NONE;
try
{
xStore->storeToURL( sPath, aValues );
}
catch( task::ErrorCodeIOException& aErrorEx )
{
nErrorCode = (sal_uInt32)aErrorEx.ErrCode;
}
catch( Exception& )
{
nErrorCode = ERRCODE_IO_GENERAL;
}
if( nErrorCode != ERRCODE_NONE )
{
SfxErrorContext aEc(ERRCTX_SFX_SAVEASDOC, pTargetView->GetDocShell()->GetTitle());
ErrorHandler::HandleError( nErrorCode );
}
}
else
{
sal_uInt32 nBegin = 0;
sal_uInt32 nEnd = 0;
if(m_aSaveIndividualRB.IsChecked())
{
nBegin = 0;
nEnd = rConfigItem.GetMergedDocumentCount();
}
else
{
nBegin = static_cast< sal_Int32 >(m_aFromNF.GetValue() - 1);
nEnd = static_cast< sal_Int32 >(m_aToNF.GetValue());
if(nEnd > rConfigItem.GetMergedDocumentCount())
nEnd = rConfigItem.GetMergedDocumentCount();
}
String sFilter;
String sPath = SwMailMergeHelper::CallSaveAsDialog(sFilter);
if(!sPath.Len())
return 0;
String sTargetTempURL = URIHelper::SmartRel2Abs(
INetURLObject(), utl::TempFile::CreateTempName(),
URIHelper::GetMaybeFileHdl());
const SfxFilter *pSfxFlt = SwIoSystem::GetFilterOfFormat(
String::CreateFromAscii( FILTER_XML ),
SwDocShell::Factory().GetFilterContainer() );
uno::Sequence< beans::PropertyValue > aValues(1);
beans::PropertyValue* pValues = aValues.getArray();
pValues[0].Name = C2U("FilterName");
pValues[0].Value <<= ::rtl::OUString(pSfxFlt->GetFilterName());
uno::Reference< frame::XStorable > xStore( pTargetView->GetDocShell()->GetModel(), uno::UNO_QUERY);
sal_uInt32 nErrorCode = ERRCODE_NONE;
try
{
xStore->storeToURL( sTargetTempURL, aValues );
}
catch( task::ErrorCodeIOException& aErrorEx )
{
nErrorCode = (sal_uInt32)aErrorEx.ErrCode;
}
catch( Exception& )
{
nErrorCode = ERRCODE_IO_GENERAL;
}
if( nErrorCode != ERRCODE_NONE )
{
SfxErrorContext aEc(ERRCTX_SFX_SAVEASDOC, pTargetView->GetDocShell()->GetTitle());
ErrorHandler::HandleError( nErrorCode );
}
SwView* pSourceView = rConfigItem.GetSourceView();
PrintMonitor aSaveMonitor(this, PrintMonitor::MONITOR_TYPE_SAVE);
aSaveMonitor.aDocName.SetText(pSourceView->GetDocShell()->GetTitle(22));
aSaveMonitor.aCancel.SetClickHdl(LINK(this, SwMailMergeOutputPage, SaveCancelHdl_Impl));
aSaveMonitor.aPrinter.SetText( INetURLObject( sPath ).getFSysPath( INetURLObject::FSYS_DETECT ) );
aSaveMonitor.ResizeControls();
m_bCancelSaving = false;
aSaveMonitor.Show();
m_pWizard->enableButtons(WZB_CANCEL, sal_False);
for(sal_uInt32 nDoc = nBegin; nDoc < nEnd && !m_bCancelSaving; ++nDoc)
{
SwDocMergeInfo& rInfo = rConfigItem.GetDocumentMergeInfo(nDoc);
INetURLObject aURL(sPath);
String sFile = aURL.GetBase();
String sExtension = aURL.getExtension();
if(!sExtension.Len())
{
sExtension = pSfxFlt->GetWildcard()().GetToken(1, '.');
sPath += '.';
sPath += sExtension;
}
String sStat(SW_RES(STR_STATSTR_LETTER));
sStat += ' ';
sStat += String::CreateFromInt32( nDoc );
aSaveMonitor.aPrintInfo.SetText(sStat);
//now extract a document from the target document
// the shell will be closed at the end, but it is more safe to use SfxObjectShellLock here
SfxObjectShellLock xTempDocShell( new SwDocShell( SFX_CREATE_MODE_STANDARD ) );
xTempDocShell->DoInitNew( 0 );
SfxViewFrame* pTempFrame = SfxViewFrame::LoadHiddenDocument( *xTempDocShell, 0 );
// pTempFrame->GetFrame().Appear();
SwView* pTempView = static_cast<SwView*>( pTempFrame->GetViewShell() );
pTargetView->GetWrtShell().StartAction();
SwgReaderOption aOpt;
aOpt.SetTxtFmts( sal_True );
aOpt.SetFrmFmts( sal_True );
aOpt.SetPageDescs( sal_True );
aOpt.SetNumRules( sal_True );
aOpt.SetMerge( sal_False );
pTempView->GetDocShell()->LoadStylesFromFile(
sTargetTempURL, aOpt, sal_True );
pTargetView->GetWrtShell().PastePages(pTempView->GetWrtShell(),
(sal_uInt16)rInfo.nStartPageInTarget, (sal_uInt16)rInfo.nEndPageInTarget );
pTargetView->GetWrtShell().EndAction();
//then save it
String sOutPath = aURL.GetMainURL(INetURLObject::DECODE_TO_IURI);
String sCounter('_');
sCounter += String::CreateFromInt32(nDoc);
sOutPath.Insert(sCounter, sOutPath.Len() - sExtension.Len() - 1);
//SfxStringItem aName(SID_FILE_NAME, sOutPath);
//SfxStringItem aFilter(SID_FILTER_NAME, sFilter);
while(true)
{
//time for other slots is needed
for(sal_Int16 r = 0; r < 10; ++r)
Application::Reschedule();
bool bFailed = false;
try
{
pValues[0].Value <<= ::rtl::OUString(sFilter);
uno::Reference< frame::XStorable > xTempStore( xTempDocShell->GetModel(), uno::UNO_QUERY);
xTempStore->storeToURL( sOutPath, aValues );
}
catch( const uno::Exception& )
{
bFailed = true;
}
if(bFailed)
{
SwSaveWarningBox_Impl aWarning( pButton, sOutPath );
if(RET_OK == aWarning.Execute())
sOutPath = aWarning.GetFileName();
else
{
xTempDocShell->DoClose();
return 0;
}
}
else
{
xTempDocShell->DoClose();
break;
}
}
}
::osl::File::remove( sTargetTempURL );
}
m_pWizard->enableButtons(WZB_CANCEL, sal_True);
m_pWizard->enableButtons(WZB_FINISH, sal_True);
return 0;
}
/*-- 22.06.2004 11:51:30---------------------------------------------------
-----------------------------------------------------------------------*/
IMPL_LINK(SwMailMergeOutputPage, PrinterChangeHdl_Impl, ListBox*, pBox)
{
if( m_pDocumentPrinterCopy && pBox->GetSelectEntryPos() != LISTBOX_ENTRY_NOTFOUND )
{
const QueueInfo* pInfo = Printer::GetQueueInfo( pBox->GetSelectEntry(), false );
if( pInfo )
{
if ( !m_pTempPrinter )
{
if( (m_pDocumentPrinterCopy->GetName() == pInfo->GetPrinterName()) &&
(m_pDocumentPrinterCopy->GetDriverName() == pInfo->GetDriver()) )
m_pTempPrinter = new Printer( m_pDocumentPrinterCopy->GetJobSetup() );
else
m_pTempPrinter = new Printer( *pInfo );
}
else
{
if( (m_pTempPrinter->GetName() != pInfo->GetPrinterName()) ||
(m_pTempPrinter->GetDriverName() != pInfo->GetDriver()) )
{
delete m_pTempPrinter;
m_pTempPrinter = new Printer( *pInfo );
}
}
}
else if( ! m_pTempPrinter )
m_pTempPrinter = new Printer();
m_aPrinterSettingsPB.Enable( m_pTempPrinter->HasSupport( SUPPORT_SETUPDIALOG ) );
}
else
m_aPrinterSettingsPB.Disable();
m_pWizard->GetConfigItem().SetSelectedPrinter( pBox->GetSelectEntry() );
// return m_pTempPrinter;
return 0;
}
/*-- 17.05.2004 13:51:02---------------------------------------------------
-----------------------------------------------------------------------*/
IMPL_LINK(SwMailMergeOutputPage, PrintHdl_Impl, PushButton*, EMPTYARG)
{
SwView* pTargetView = m_pWizard->GetConfigItem().GetTargetView();
DBG_ASSERT(pTargetView, "no target view exists");
if(!pTargetView)
return 0;
sal_uInt32 nBegin = 0;
sal_uInt32 nEnd = 0;
SwMailMergeConfigItem& rConfigItem = m_pWizard->GetConfigItem();
if(m_aPrintAllRB.IsChecked())
{
nBegin = 0;
nEnd = rConfigItem.GetMergedDocumentCount();
}
else
{
nBegin = static_cast< sal_Int32 >(m_aFromNF.GetValue() - 1);
nEnd = static_cast< sal_Int32 >(m_aToNF.GetValue());
if(nEnd > rConfigItem.GetMergedDocumentCount())
nEnd = rConfigItem.GetMergedDocumentCount();
}
rConfigItem.SetPrintRange( (sal_uInt16)nBegin, (sal_uInt16)nEnd );
SwDocMergeInfo& rStartInfo = rConfigItem.GetDocumentMergeInfo(nBegin);
SwDocMergeInfo& rEndInfo = rConfigItem.GetDocumentMergeInfo(nEnd - 1);
rtl::OUString sPages(rtl::OUString::valueOf( rStartInfo.nStartPageInTarget ));
sPages += rtl::OUString::createFromAscii( " - ");
sPages += rtl::OUString::valueOf( rEndInfo.nEndPageInTarget );
SwWrtShell& rSh = pTargetView->GetWrtShell();
pTargetView->SetMailMergeConfigItem(&rConfigItem, 0, sal_False);
if(m_pTempPrinter)
{
m_pDocumentPrinterCopy->SetPrinterProps(m_pTempPrinter);
pTargetView->SetPrinter(m_pDocumentPrinterCopy->Clone());
}
SfxObjectShell* pObjSh = pTargetView->GetViewFrame()->GetObjectShell();
SFX_APP()->NotifyEvent(SfxEventHint(SW_EVENT_MAIL_MERGE, SwDocShell::GetEventName(STR_SW_EVENT_MAIL_MERGE), pObjSh));
rSh.GetNewDBMgr()->SetMergeType( DBMGR_MERGE_DOCUMENTS );
//SfxDispatcher *pDis = pTargetView->GetViewFrame()->GetDispatcher();
SfxBoolItem aMergeSilent(SID_SILENT, sal_False);
m_pWizard->enableButtons(WZB_CANCEL, sal_False);
uno::Sequence < beans::PropertyValue > aProps( 2 );
aProps[0]. Name = rtl::OUString::createFromAscii("MonitorVisible");
aProps[0].Value <<= sal_True;
aProps[1]. Name = rtl::OUString::createFromAscii("Pages");
aProps[1]. Value <<= sPages;
pTargetView->ExecPrint( aProps, false, true );
SFX_APP()->NotifyEvent(SfxEventHint(SW_EVENT_MAIL_MERGE_END, SwDocShell::GetEventName(STR_SW_EVENT_MAIL_MERGE_END), pObjSh));
pTargetView->SetMailMergeConfigItem(0, 0, sal_False);
m_pWizard->enableButtons(WZB_CANCEL, sal_True);
m_pWizard->enableButtons(WZB_FINISH, sal_True);
return 0;
}
/*-- 17.05.2004 13:51:02---------------------------------------------------
-----------------------------------------------------------------------*/
IMPL_LINK(SwMailMergeOutputPage, PrinterSetupHdl_Impl, PushButton*, pButton)
{
if( !m_pTempPrinter )
PrinterChangeHdl_Impl(&m_aPrinterLB);
if(m_pTempPrinter)
m_pTempPrinter->Setup(pButton);
return 0;
}
/*-- 14.06.2004 09:34:01---------------------------------------------------
-----------------------------------------------------------------------*/
IMPL_LINK(SwMailMergeOutputPage, SendTypeHdl_Impl, ListBox*, pBox)
{
sal_uLong nDocType = (sal_uLong)pBox->GetEntryData(pBox->GetSelectEntryPos());
sal_Bool bEnable = MM_DOCTYPE_HTML != nDocType && MM_DOCTYPE_TEXT != nDocType;
m_aSendAsPB.Enable( bEnable );
m_aAttachmentFT.Enable( bEnable );
m_aAttachmentED.Enable( bEnable );
if(bEnable)
{
//add the correct extension
String sAttach(m_aAttachmentED.GetText());
//do nothing if the user has removed the name - the warning will come early enough
if(sAttach.Len())
{
xub_StrLen nTokenCount = sAttach.GetTokenCount( '.' );
if( 2 > nTokenCount)
{
sAttach += '.';
++nTokenCount;
}
sAttach.SetToken( nTokenCount - 1, '.', lcl_GetExtensionForDocType( nDocType ));
m_aAttachmentED.SetText(sAttach);
}
}
return 0;
}
/*-- 17.05.2004 13:51:02---------------------------------------------------
-----------------------------------------------------------------------*/
IMPL_LINK(SwMailMergeOutputPage, SendAsHdl_Impl, PushButton*, pButton)
{
SwMailBodyDialog* pDlg = new SwMailBodyDialog(pButton, m_pWizard);
pDlg->SetBody(m_sBody);
if(RET_OK == pDlg->Execute())
{
m_sBody = pDlg->GetBody();
}
return 0;
}
/*-- 21.05.2004 12:03:25---------------------------------------------------
Send documents as e-mail
-----------------------------------------------------------------------*/
IMPL_LINK(SwMailMergeOutputPage, SendDocumentsHdl_Impl, PushButton*, pButton)
{
SwMailMergeConfigItem& rConfigItem = m_pWizard->GetConfigItem();
//get the composed document
SwView* pTargetView = rConfigItem.GetTargetView();
DBG_ASSERT(pTargetView, "no target view exists");
if(!pTargetView)
return 0;
if(!rConfigItem.GetMailServer().getLength() ||
!SwMailMergeHelper::CheckMailAddress(rConfigItem.GetMailAddress()) )
{
QueryBox aQuery(pButton, WB_YES_NO_CANCEL, m_sConfigureMail);
sal_uInt16 nRet = aQuery.Execute();
if(RET_YES == nRet )
{
SfxAllItemSet aSet(pTargetView->GetPool());
SwMailConfigDlg* pDlg = new SwMailConfigDlg(pButton, aSet);
nRet = pDlg->Execute();
delete pDlg;
}
if(nRet != RET_OK && nRet != RET_YES)
return 0;
}
//add the documents
sal_uInt32 nBegin = 0;
sal_uInt32 nEnd = 0;
if(m_aSendAllRB.IsChecked())
{
nBegin = 0;
nEnd = rConfigItem.GetMergedDocumentCount();
}
else
{
nBegin = static_cast< sal_Int32 >(m_aFromNF.GetValue() - 1);
nEnd = static_cast< sal_Int32 >(m_aToNF.GetValue());
if(nEnd > rConfigItem.GetMergedDocumentCount())
nEnd = rConfigItem.GetMergedDocumentCount();
}
bool bAsBody = false;
bool bIsPDF = false;
rtl_TextEncoding eEncoding = ::gsl_getSystemTextEncoding();
SfxFilterContainer* pFilterContainer = SwDocShell::Factory().GetFilterContainer();
const SfxFilter *pSfxFlt = 0;
sal_uLong nDocType = (sal_uLong)m_aSendAsLB.GetEntryData(m_aSendAsLB.GetSelectEntryPos());
String sExtension = lcl_GetExtensionForDocType(nDocType);
switch( nDocType )
{
case MM_DOCTYPE_OOO : break;
case MM_DOCTYPE_PDF : bIsPDF = true;
{
//the method SwIOSystemGetFilterOfFormat( ) returns the template filter
//because it uses the same user data :-(
SfxFilterMatcher aMatcher( pFilterContainer->GetName() );
SfxFilterMatcherIter aIter( &aMatcher );
const SfxFilter* pFilter = aIter.First();
String sFilterMime( String::CreateFromAscii( "application/pdf" ));
while ( pFilter )
{
if( pFilter->GetMimeType() == sFilterMime && pFilter->CanExport() )
{
pSfxFlt = pFilter;
break;
}
pFilter = aIter.Next();
}
}
break;
case MM_DOCTYPE_WORD:
{
//the method SwIOSystemGetFilterOfFormat( ) returns the template filter
//because it uses the same user data :-(
SfxFilterMatcher aMatcher( pFilterContainer->GetName() );
SfxFilterMatcherIter aIter( &aMatcher );
const SfxFilter* pFilter = aIter.First();
String sFilterUserData( String::CreateFromAscii( FILTER_WW8 ));
while ( pFilter )
{
if( pFilter->GetUserData() == sFilterUserData && pFilter->CanExport() )
{
pSfxFlt = pFilter;
break;
}
pFilter = aIter.Next();
}
}
break;
case MM_DOCTYPE_HTML:
{
bAsBody = true;
SvxHtmlOptions* pHtmlOptions = SvxHtmlOptions::Get();
eEncoding = pHtmlOptions->GetTextEncoding();
}
break;
case MM_DOCTYPE_TEXT:
bAsBody = true;
break;
}
if(!pSfxFlt)
pSfxFlt = pFilterContainer->GetFilter4Extension(sExtension, SFX_FILTER_EXPORT);
if(!pSfxFlt)
return 0;
String sMimeType = pSfxFlt->GetMimeType();
if(!m_aSubjectED.GetText().Len())
{
SwSendQueryBox_Impl aQuery(pButton, m_sNoSubjectQueryST);
aQuery.SetIsEmptyTextAllowed(true);
aQuery.SetValue(m_sNoSubjectST);
if(RET_OK == aQuery.Execute())
{
if(aQuery.GetValue() != m_sNoSubjectST)
m_aSubjectED.SetText(aQuery.GetValue());
}
else
return 0;
}
if(!bAsBody && !m_aAttachmentED.GetText().Len())
{
SwSendQueryBox_Impl aQuery(pButton, m_sNoAttachmentNameST);
aQuery.SetIsEmptyTextAllowed(false);
if(RET_OK == aQuery.Execute())
{
String sAttach(aQuery.GetValue());
xub_StrLen nTokenCount = sAttach.GetTokenCount( '.' );
if( 2 > nTokenCount)
{
sAttach += '.';
++nTokenCount;
}
sAttach.SetToken( nTokenCount - 1, '.', lcl_GetExtensionForDocType(
(sal_uLong)m_aSendAsLB.GetEntryData(m_aSendAsLB.GetSelectEntryPos())));
m_aAttachmentED.SetText(sAttach);
}
else
return 0;
}
SfxStringItem aFilterName( SID_FILTER_NAME, pSfxFlt->GetFilterName() );
String sEMailColumn = m_aMailToLB.GetSelectEntry();
DBG_ASSERT( sEMailColumn.Len(), "No email column selected");
Reference< sdbcx::XColumnsSupplier > xColsSupp( rConfigItem.GetResultSet(), UNO_QUERY);
Reference < container::XNameAccess> xColAccess = xColsSupp.is() ? xColsSupp->getColumns() : 0;
if(!sEMailColumn.Len() || !xColAccess.is() || !xColAccess->hasByName(sEMailColumn))
return 0;
String sFilterOptions;
if(MM_DOCTYPE_TEXT == nDocType)
{
SwAsciiOptions aOpt;
sal_uInt16 nAppScriptType = GetI18NScriptTypeOfLanguage( (sal_uInt16)GetAppLanguage() );
sal_uInt16 nWhich = GetWhichOfScript( RES_CHRATR_LANGUAGE, nAppScriptType);
aOpt.SetLanguage( ((SvxLanguageItem&)pTargetView->GetWrtShell().
GetDefault( nWhich )).GetLanguage());
aOpt.SetParaFlags( LINEEND_CR );
aOpt.WriteUserData( sFilterOptions );
}
String sTargetTempURL = URIHelper::SmartRel2Abs(
INetURLObject(), utl::TempFile::CreateTempName(),
URIHelper::GetMaybeFileHdl());
const SfxFilter *pTargetSfxFlt = SwIoSystem::GetFilterOfFormat(
String::CreateFromAscii( FILTER_XML ),
SwDocShell::Factory().GetFilterContainer() );
uno::Sequence< beans::PropertyValue > aValues(1);
beans::PropertyValue* pValues = aValues.getArray();
pValues[0].Name = C2U("FilterName");
pValues[0].Value <<= ::rtl::OUString(pTargetSfxFlt->GetFilterName());
uno::Reference< frame::XStorable > xStore( pTargetView->GetDocShell()->GetModel(), uno::UNO_QUERY);
xStore->storeToURL( sTargetTempURL, aValues );
//create the send dialog
SwSendMailDialog* pDlg = new SwSendMailDialog( pButton, rConfigItem );
pDlg->SetDocumentCount( nEnd );
pDlg->ShowDialog();
//help to force painting the dialog
//TODO/CLEANUP
//Sollbruchstelle
for ( sal_Int16 i = 0; i < 25; i++)
Application::Reschedule();
for(sal_uInt32 nDoc = nBegin; nDoc < nEnd; ++nDoc)
{
m_pWizard->EnterWait();
SwDocMergeInfo& rInfo = rConfigItem.GetDocumentMergeInfo(nDoc);
//now extract a document from the target document
// the shell will be closed at the end, but it is more safe to use SfxObjectShellLock here
SfxObjectShellLock xTempDocShell( new SwDocShell( SFX_CREATE_MODE_STANDARD ) );
xTempDocShell->DoInitNew( 0 );
SfxViewFrame* pTempFrame = SfxViewFrame::LoadHiddenDocument( *xTempDocShell, 0 );
// pTempFrame->GetFrame().Appear();
SwView* pTempView = static_cast<SwView*>( pTempFrame->GetViewShell() );
pTargetView->GetWrtShell().StartAction();
SwgReaderOption aOpt;
aOpt.SetTxtFmts( sal_True );
aOpt.SetFrmFmts( sal_True );
aOpt.SetPageDescs( sal_True );
aOpt.SetNumRules( sal_True );
aOpt.SetMerge( sal_False );
pTempView->GetDocShell()->LoadStylesFromFile(
sTargetTempURL, aOpt, sal_True );
pTargetView->GetWrtShell().PastePages(pTempView->GetWrtShell(),
(sal_uInt16)rInfo.nStartPageInTarget, (sal_uInt16)rInfo.nEndPageInTarget );
pTargetView->GetWrtShell().EndAction();
//then save it
SfxStringItem aName(SID_FILE_NAME,
URIHelper::SmartRel2Abs(
INetURLObject(), utl::TempFile::CreateTempName(0),
URIHelper::GetMaybeFileHdl()) );
/* if(bIsPDF)
{
SfxDispatcher* pSfxDispatcher = pTempView->GetViewFrame()->GetDispatcher();
pSfxDispatcher->Execute(
SID_DIRECTEXPORTDOCASPDF,
SFX_CALLMODE_SYNCHRON, &aName, &aFilterName, 0L );
}
else*/
{
uno::Sequence< beans::PropertyValue > aFilterValues(MM_DOCTYPE_TEXT == nDocType ? 2 : 1);
beans::PropertyValue* pFilterValues = aFilterValues.getArray();
pFilterValues[0].Name = C2U("FilterName");
pFilterValues[0].Value <<= ::rtl::OUString(pSfxFlt->GetFilterName());
if(MM_DOCTYPE_TEXT == nDocType)
{
pFilterValues[1].Name = C2U("FilterOptions");
pFilterValues[1].Value <<= ::rtl::OUString(sFilterOptions);
}
uno::Reference< frame::XStorable > xTempStore( pTempView->GetDocShell()->GetModel(), uno::UNO_QUERY);
xTempStore->storeToURL( aName.GetValue(), aFilterValues );
}
xTempDocShell->DoClose();
#ifdef DBG_UTIL
sal_Int32 nTarget =
#endif
rConfigItem.MoveResultSet(rInfo.nDBRow);
DBG_ASSERT( nTarget == rInfo.nDBRow, "row of current document could not be selected");
DBG_ASSERT( sEMailColumn.Len(), "No email column selected");
::rtl::OUString sEMail = lcl_GetColumnValueOf(sEMailColumn, xColAccess);
SwMailDescriptor aDesc;
aDesc.sEMail = sEMail;
rtl::OUString sBody;
if(bAsBody)
{
{
//read in the temporary file and use it as mail body
SfxMedium aMedium( aName.GetValue(), STREAM_READ, sal_True);
SvStream* pInStream = aMedium.GetInStream();
if(pInStream)
pInStream->SetStreamCharSet( eEncoding );
else
{
DBG_ERROR("no output file created?");
continue;
}
ByteString sLine;
sal_Bool bDone = pInStream->ReadLine( sLine );
while ( bDone )
{
sBody += rtl::OUString(String(sLine, eEncoding));
sBody += rtl::OUString('\n');
bDone = pInStream->ReadLine( sLine );
}
}
//remove the temporary file
SWUnoHelper::UCB_DeleteFile( aName.GetValue() );
}
else
{
sBody = m_sBody;
aDesc.sAttachmentURL = aName.GetValue();
String sAttachment(m_aAttachmentED.GetText());
xub_StrLen nTokenCount = sAttachment.GetTokenCount( '.' );
if( 2 > nTokenCount)
{
sAttachment += '.';
sAttachment.SetToken( nTokenCount, '.', sExtension);
}
else if(sAttachment.GetToken( nTokenCount - 1, '.') != sExtension)
sAttachment += sExtension;
aDesc.sAttachmentName = sAttachment;
aDesc.sMimeType = sMimeType;
if(rConfigItem.IsGreetingLine(sal_True))
{
::rtl::OUString sNameColumn = rConfigItem.GetAssignedColumn(MM_PART_LASTNAME);
::rtl::OUString sName = lcl_GetColumnValueOf(sNameColumn, xColAccess);
String sGreeting;
if(sName.getLength() && rConfigItem.IsIndividualGreeting(sal_True))
{
::rtl::OUString sGenderColumn = rConfigItem.GetAssignedColumn(MM_PART_GENDER);
const ::rtl::OUString& sFemaleValue = rConfigItem.GetFemaleGenderValue();
::rtl::OUString sGenderValue = lcl_GetColumnValueOf(sGenderColumn, xColAccess);
SwMailMergeConfigItem::Gender eGenderType = sGenderValue == sFemaleValue ?
SwMailMergeConfigItem::FEMALE :
SwMailMergeConfigItem::MALE;
sGreeting = SwAddressPreview::FillData(
rConfigItem.GetGreetings(eGenderType)
[rConfigItem.GetCurrentGreeting(eGenderType)],
rConfigItem);
}
else
{
sGreeting =
rConfigItem.GetGreetings(SwMailMergeConfigItem::NEUTRAL)
[rConfigItem.GetCurrentGreeting(SwMailMergeConfigItem::NEUTRAL)];
}
sGreeting += '\n';
::rtl::OUString sTemp( sGreeting );
sTemp += sBody;
sBody = sTemp;
}
}
aDesc.sBodyContent = sBody;
if(MM_DOCTYPE_HTML == nDocType)
{
aDesc.sBodyMimeType = ::rtl::OUString::createFromAscii("text/html; charset=");
aDesc.sBodyMimeType += ::rtl::OUString::createFromAscii(
rtl_getBestMimeCharsetFromTextEncoding( eEncoding ));
}
else
aDesc.sBodyMimeType =
::rtl::OUString::createFromAscii("text/plain; charset=UTF-8; format=flowed");
aDesc.sSubject = m_aSubjectED.GetText();
aDesc.sCC = m_sCC;
aDesc.sBCC = m_sBCC;
pDlg->AddDocument( aDesc );
//help to force painting the dialog
for ( sal_Int16 i = 0; i < 25; i++)
Application::Reschedule();
//stop creating of data when dialog has been closed
if(!pDlg->IsVisible())
{
m_pWizard->LeaveWait();
break;
}
m_pWizard->LeaveWait();
}
pDlg->EnableDesctruction();
::osl::File::remove( sTargetTempURL );
m_pWizard->enableButtons(WZB_FINISH, sal_True);
//the dialog deletes itself
//delete pDlg;
return 0;
}