1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_sw.hxx" 26 #ifdef SW_DLLIMPLEMENTATION 27 #undef SW_DLLIMPLEMENTATION 28 #endif 29 #include <mmoutputpage.hxx> 30 #include <mailmergewizard.hxx> 31 #include <mmconfigitem.hxx> 32 #include <mailmergechildwindow.hxx> 33 #include <mailconfigpage.hxx> 34 #include <cmdid.h> 35 #include <swtypes.hxx> 36 #ifndef _VIEW_HXX 37 #include <view.hxx> 38 #endif 39 #include <wrtsh.hxx> 40 #ifndef _DOCSH_HXX 41 #include <docsh.hxx> 42 #endif 43 #ifndef IDOCUMENTDEVICEACCESS_HXX_INCLUDED 44 #include <IDocumentDeviceAccess.hxx> 45 #endif 46 #include <hintids.hxx> 47 #include <editeng/scripttypeitem.hxx> 48 #include <editeng/langitem.hxx> 49 #include <svl/itemset.hxx> 50 #include <svl/stritem.hxx> 51 #include <svtools/ehdl.hxx> 52 #include <svtools/sfxecode.hxx> 53 #include <vcl/msgbox.hxx> 54 #include <sfx2/dinfdlg.hxx> 55 #include <sfx2/printer.hxx> 56 #include <sfx2/fcontnr.hxx> 57 #include <sfx2/viewfrm.hxx> 58 #include <sfx2/dispatch.hxx> 59 #include <sfx2/docfile.hxx> 60 //#ifndef _SFX_DOCFILT_HACK_HXX 61 //#include <sfx2/docfilt.hxx> 62 //#endif 63 #include <tools/urlobj.hxx> 64 #include <svl/urihelper.hxx> 65 #ifndef _VCL_PRINT_HXX 66 #include <vcl/print.hxx> 67 #endif 68 #include <unotools/tempfile.hxx> 69 #include <osl/file.hxx> 70 #include <mmgreetingspage.hxx> 71 #include <com/sun/star/frame/XStorable.hpp> 72 #include <com/sun/star/sdbcx/XColumnsSupplier.hpp> 73 #include <com/sun/star/sdb/XColumn.hpp> 74 //#ifndef _COM_SUN_STAR_BEANS_PROPERTYVALUE_HPP_ 75 //#include <com/sun/star/beans/PropertyValue.hpp> 76 //#endif 77 //#ifndef _BASEDLGS_HXX 78 //#include <sfx2/basedlgs.hxx> 79 //#endif 80 #ifndef _DBMGR_HXX 81 #include <dbmgr.hxx> 82 #endif 83 #include <swunohelper.hxx> 84 #include <vos/mutex.hxx> 85 #include <shellio.hxx> 86 #include <svtools/htmlcfg.hxx> 87 #include <sfx2/event.hxx> 88 #include <swevent.hxx> 89 #include <mmoutputpage.hrc> 90 #include <dbui.hxx> 91 #include <dbui.hrc> 92 #include <helpid.h> 93 #include <sfx2/app.hxx> 94 #include <statstr.hrc> 95 #include <unomid.h> 96 97 using namespace svt; 98 using namespace ::com::sun::star; 99 using namespace ::com::sun::star::uno; 100 101 /*-- 01.07.2004 16:47:49--------------------------------------------------- 102 103 -----------------------------------------------------------------------*/ 104 String lcl_GetExtensionForDocType(sal_uLong nDocType) 105 { 106 String sExtension; 107 switch( nDocType ) 108 { 109 case MM_DOCTYPE_OOO : sExtension = String::CreateFromAscii( "odt" ); break; 110 case MM_DOCTYPE_PDF : sExtension = String::CreateFromAscii( "pdf" ); break; 111 case MM_DOCTYPE_WORD: sExtension = String::CreateFromAscii( "doc" ); break; 112 case MM_DOCTYPE_HTML: sExtension = String::CreateFromAscii( "html" ); break; 113 case MM_DOCTYPE_TEXT: sExtension = String::CreateFromAscii( "txt" ); break; 114 } 115 return sExtension; 116 } 117 /*-- 28.06.2004 11:49:21--------------------------------------------------- 118 119 -----------------------------------------------------------------------*/ 120 ::rtl::OUString lcl_GetColumnValueOf(const ::rtl::OUString& rColumn, Reference < container::XNameAccess>& rxColAccess ) 121 { 122 ::rtl::OUString sRet; 123 if(rxColAccess->hasByName(rColumn)) 124 { 125 Any aCol = rxColAccess->getByName(rColumn); 126 Reference< sdb::XColumn > xColumn; 127 aCol >>= xColumn; 128 if(xColumn.is()) 129 sRet = xColumn->getString(); 130 } 131 return sRet; 132 } 133 /*-- 21.06.2004 14:01:13--------------------------------------------------- 134 135 -----------------------------------------------------------------------*/ 136 class SwSaveWarningBox_Impl : public ModalDialog 137 { 138 FixedImage aWarningImageIM; 139 FixedInfo aWarningFI; 140 141 FixedText aFileNameFT; 142 Edit aFileNameED; 143 144 FixedLine aSeparatorFL; 145 OKButton aOKPB; 146 CancelButton aCancelPB; 147 148 DECL_LINK( ModifyHdl, Edit*); 149 public: 150 SwSaveWarningBox_Impl(Window* pParent, const String& rFileName); 151 ~SwSaveWarningBox_Impl(); 152 153 String GetFileName() const {return aFileNameED.GetText();} 154 }; 155 /*-- 02.07.2004 08:54:42--------------------------------------------------- 156 157 -----------------------------------------------------------------------*/ 158 class SwSendQueryBox_Impl : public ModalDialog 159 { 160 FixedImage aQueryImageIM; 161 FixedInfo aQueryFI; 162 163 Edit aTextED; 164 165 FixedLine aSeparatorFL; 166 OKButton aOKPB; 167 CancelButton aCancelPB; 168 169 bool bIsEmptyAllowed; 170 DECL_LINK( ModifyHdl, Edit*); 171 public: 172 SwSendQueryBox_Impl(Window* pParent, const String& rQueryText); 173 ~SwSendQueryBox_Impl(); 174 175 void SetValue(const String& rSet) 176 { 177 aTextED.SetText(rSet); 178 ModifyHdl( &aTextED ); 179 } 180 String GetValue() const {return aTextED.GetText();} 181 182 void SetIsEmptyTextAllowed(bool bSet) 183 { 184 bIsEmptyAllowed = bSet; 185 ModifyHdl( &aTextED ); 186 } 187 }; 188 189 /*-- 21.06.2004 14:11:58--------------------------------------------------- 190 191 -----------------------------------------------------------------------*/ 192 SwSaveWarningBox_Impl::SwSaveWarningBox_Impl(Window* pParent, const String& rFileName) : 193 ModalDialog(pParent, SW_RES( DLG_MM_SAVEWARNING )), 194 aWarningImageIM(this, SW_RES( IM_WARNING )), 195 aWarningFI(this, SW_RES( FI_WARNING )), 196 aFileNameFT(this, SW_RES( FT_FILENAME )), 197 aFileNameED(this, SW_RES( ED_FILENAME )), 198 aSeparatorFL(this, SW_RES( FL_SEPARATOR )), 199 aOKPB(this, SW_RES( PB_OK )), 200 aCancelPB(this, SW_RES( PB_CANCEL )) 201 { 202 FreeResource(); 203 aWarningImageIM.SetImage(WarningBox::GetStandardImage()); 204 aFileNameED.SetText(rFileName); 205 aFileNameED.SetModifyHdl(LINK(this, SwSaveWarningBox_Impl, ModifyHdl)); 206 ModifyHdl( &aFileNameED ); 207 } 208 /*-- 21.06.2004 14:11:58--------------------------------------------------- 209 210 -----------------------------------------------------------------------*/ 211 SwSaveWarningBox_Impl::~SwSaveWarningBox_Impl() 212 { 213 } 214 /*-- 21.06.2004 14:11:58--------------------------------------------------- 215 216 -----------------------------------------------------------------------*/ 217 IMPL_LINK( SwSaveWarningBox_Impl, ModifyHdl, Edit*, pEdit) 218 { 219 aOKPB.Enable(pEdit->GetText().Len() > 0); 220 return 0; 221 } 222 /*-- 02.07.2004 09:02:53--------------------------------------------------- 223 224 -----------------------------------------------------------------------*/ 225 SwSendQueryBox_Impl::SwSendQueryBox_Impl(Window* pParent, const String& rText) : 226 ModalDialog(pParent, SW_RES( DLG_MM_QUERY )), 227 aQueryImageIM( this, SW_RES( IM_QUERY )), 228 aQueryFI( this, SW_RES( FI_QUERY )), 229 aTextED( this, SW_RES( ED_TEXT )), 230 aSeparatorFL(this, SW_RES( FL_SEPARATOR )), 231 aOKPB(this, SW_RES( PB_OK )), 232 aCancelPB(this, SW_RES( PB_CANCEL )), 233 bIsEmptyAllowed(true) 234 { 235 FreeResource(); 236 aQueryFI.SetText(rText); 237 aQueryImageIM.SetImage(QueryBox::GetStandardImage()); 238 aTextED.SetModifyHdl(LINK(this, SwSendQueryBox_Impl, ModifyHdl)); 239 ModifyHdl( &aTextED ); 240 } 241 /*-- 02.07.2004 08:58:45--------------------------------------------------- 242 243 -----------------------------------------------------------------------*/ 244 SwSendQueryBox_Impl::~SwSendQueryBox_Impl() 245 { 246 } 247 /*-- 02.07.2004 08:58:25--------------------------------------------------- 248 249 -----------------------------------------------------------------------*/ 250 IMPL_LINK( SwSendQueryBox_Impl, ModifyHdl, Edit*, pEdit) 251 { 252 aOKPB.Enable(bIsEmptyAllowed || (pEdit->GetText().Len() > 0)); 253 return 0; 254 } 255 256 /*-- 16.04.2004 16:34:48--------------------------------------------------- 257 258 -----------------------------------------------------------------------*/ 259 class SwCopyToDialog : public SfxModalDialog 260 { 261 FixedInfo m_aDescriptionFI; 262 FixedText m_aCCFT; 263 Edit m_aCCED; 264 FixedText m_aBCCFT; 265 Edit m_aBCCED; 266 267 FixedInfo m_aNoteFI; 268 FixedLine m_aSeparatorFL; 269 270 OKButton m_aOK; 271 CancelButton m_aCancel; 272 HelpButton m_aHelp; 273 274 public: 275 SwCopyToDialog(Window* pParent); 276 ~SwCopyToDialog(); 277 278 String GetCC() {return m_aCCED.GetText();} 279 void SetCC(const String& rSet) {m_aCCED.SetText(rSet);} 280 281 String GetBCC() {return m_aBCCED.GetText();} 282 void SetBCC(const String& rSet) {m_aBCCED.SetText(rSet);} 283 }; 284 285 /*-- 16.04.2004 16:43:18--------------------------------------------------- 286 287 -----------------------------------------------------------------------*/ 288 SwCopyToDialog::SwCopyToDialog(Window* pParent) : 289 SfxModalDialog(pParent, SW_RES(DLG_MM_COPYTO)), 290 #ifdef MSC 291 #pragma warning (disable : 4355) 292 #endif 293 m_aDescriptionFI( this, SW_RES( FI_DESCRIPTION )), 294 m_aCCFT( this, SW_RES( FT_CC )), 295 m_aCCED( this, SW_RES( ED_CC )), 296 m_aBCCFT( this, SW_RES( FT_BCC )), 297 m_aBCCED( this, SW_RES( ED_BCC )), 298 m_aNoteFI( this, SW_RES( FI_NOTE )), 299 m_aSeparatorFL( this, SW_RES( FL_SEPARATOR )), 300 m_aOK( this, SW_RES( PB_OK )), 301 m_aCancel( this, SW_RES( PB_CANCEL )), 302 m_aHelp( this, SW_RES( PB_HELP )) 303 #ifdef MSC 304 #pragma warning (default : 4355) 305 #endif 306 { 307 FreeResource(); 308 } 309 /*-- 16.04.2004 16:43:10--------------------------------------------------- 310 311 -----------------------------------------------------------------------*/ 312 SwCopyToDialog::~SwCopyToDialog() 313 { 314 } 315 316 /*-- 02.04.2004 13:15:54--------------------------------------------------- 317 318 -----------------------------------------------------------------------*/ 319 SwMailMergeOutputPage::SwMailMergeOutputPage( SwMailMergeWizard* _pParent) : 320 svt::OWizardPage( _pParent, SW_RES(DLG_MM_OUTPUT_PAGE)), 321 #ifdef MSC 322 #pragma warning (disable : 4355) 323 #endif 324 m_aHeaderFI(this, SW_RES( FI_HEADER ) ), 325 m_aOptionsFI(this, SW_RES( FI_OPTIONS ) ), 326 m_aSaveStartDocRB(this, SW_RES( RB_SAVESTARTDOC ) ), 327 m_aSaveMergedDocRB(this, SW_RES( RB_SAVEMERGEDDOC ) ), 328 m_aPrintRB(this, SW_RES( RB_PRINT ) ), 329 m_aSendMailRB(this, SW_RES( RB_SENDMAIL ) ), 330 331 m_aSeparatorFL(this, SW_RES( FL_SEPARATOR ) ), 332 333 m_aSaveStartDocPB(this, SW_RES( PB_SAVESTARTDOC ) ), 334 335 m_aSaveAsOneRB(this, SW_RES( RB_SAVEASONE ) ), 336 m_aSaveIndividualRB(this, SW_RES( RB_SAVEINDIVIDUAL ) ), 337 m_aPrintAllRB(this, SW_RES( RB_PRINTALL ) ), 338 m_aSendAllRB( this, SW_RES( RB_SENDALL ) ), 339 340 m_aFromRB(this, SW_RES( RB_FROM ) ), 341 m_aFromNF(this, SW_RES( NF_FROM ) ), 342 m_aToFT(this, SW_RES( FT_TO ) ), 343 m_aToNF(this, SW_RES( NF_TO ) ), 344 m_aSaveNowPB(this, SW_RES( PB_SAVENOW ) ), 345 346 m_aPrinterFT(this, SW_RES( FT_PRINT ) ), 347 m_aPrinterLB(this, SW_RES( LB_PRINT ) ), 348 m_aPrinterSettingsPB(this, SW_RES( PB_PRINTERSETTINGS ) ), 349 m_aPrintNowPB(this, SW_RES( PB_PRINTNOW ) ), 350 351 m_aMailToFT( this, SW_RES( FT_MAILTO ) ), 352 m_aMailToLB( this, SW_RES( LB_MAILTO ) ), 353 m_aCopyToPB( this, SW_RES( PB_COPYTO ) ), 354 m_aSubjectFT( this, SW_RES( FT_SUBJECT ) ), 355 m_aSubjectED( this, SW_RES( ED_SUBJECT ) ), 356 m_aSendAsFT( this, SW_RES( FT_SENDAS ) ), 357 m_aSendAsLB( this, SW_RES( LB_SENDAS ) ), 358 m_aAttachmentFT( this, SW_RES( FT_ATTACHMENT ) ), 359 m_aAttachmentED( this, SW_RES( ED_ATTACHMENT ) ), 360 m_aSendAsPB( this, SW_RES( PB_SENDAS ) ), 361 m_aSendDocumentsPB( this, SW_RES( PB_SENDDOCUMENTS ) ), 362 363 m_sSaveStartST(SW_RES( ST_SAVESTART ) ), 364 m_sSaveMergedST(SW_RES( ST_SAVEMERGED ) ), 365 m_sPrintST(SW_RES( ST_PRINT ) ), 366 m_sSendMailST(SW_RES( ST_SENDMAIL ) ), 367 368 m_sDefaultAttachmentST(SW_RES( ST_DEFAULTATTACHMENT )), 369 m_sNoSubjectQueryST(SW_RES( ST_SUBJECTQUERY )), 370 m_sNoSubjectST(SW_RES( ST_NOSUBJECT )), 371 m_sNoAttachmentNameST(SW_RES( ST_NOATTACHMENTNAME )), 372 m_sConfigureMail(SW_RES( ST_CONFIGUREMAIL)), 373 #ifdef MSC 374 #pragma warning (default : 4355) 375 #endif 376 m_bCancelSaving( false ), 377 m_pWizard(_pParent), 378 m_pTempPrinter( 0 ), 379 m_pDocumentPrinterCopy(0) 380 { 381 FreeResource(); 382 383 SwMailMergeConfigItem& rConfigItem = m_pWizard->GetConfigItem(); 384 // #i51949# hide e-Mail option if e-Mail is not supported 385 if(!rConfigItem.IsMailAvailable()) 386 m_aSendMailRB.Hide(); 387 388 Link aLink = LINK(this, SwMailMergeOutputPage, OutputTypeHdl_Impl); 389 m_aSaveStartDocRB.SetClickHdl(aLink); 390 m_aSaveMergedDocRB.SetClickHdl(aLink); 391 m_aPrintRB.SetClickHdl(aLink); 392 m_aSendMailRB.SetClickHdl(aLink); 393 m_aSaveStartDocRB.Check(); 394 m_aPrintAllRB.Check(); 395 m_aSaveAsOneRB.Check(); 396 m_aSendAllRB.Check(); 397 398 m_aSaveStartDocPB.SetClickHdl(LINK(this, SwMailMergeOutputPage, SaveStartHdl_Impl)); 399 m_aSaveNowPB.SetClickHdl(LINK(this, SwMailMergeOutputPage, SaveOutputHdl_Impl)); 400 m_aPrinterLB.SetSelectHdl(LINK(this, SwMailMergeOutputPage, PrinterChangeHdl_Impl)); 401 m_aPrintNowPB.SetClickHdl(LINK(this, SwMailMergeOutputPage, PrintHdl_Impl)); 402 m_aPrinterSettingsPB.SetClickHdl(LINK(this, SwMailMergeOutputPage, PrinterSetupHdl_Impl)); 403 404 m_aSendAsPB.SetClickHdl(LINK(this, SwMailMergeOutputPage, SendAsHdl_Impl)), 405 m_aSendDocumentsPB.SetClickHdl(LINK(this, SwMailMergeOutputPage, SendDocumentsHdl_Impl)), 406 m_aSendAsLB.SetSelectHdl(LINK(this, SwMailMergeOutputPage, SendTypeHdl_Impl)); 407 408 m_nFromToRBPos = m_aFromRB.GetPosPixel().Y(); 409 m_nFromToFTPos = m_aToFT.GetPosPixel().Y(); 410 m_nFromToNFPos = m_aFromNF.GetPosPixel().Y(); 411 412 m_nRBOffset = m_nFromToRBPos - m_aSaveIndividualRB.GetPosPixel().Y(); 413 414 OutputTypeHdl_Impl(&m_aSaveStartDocRB); 415 416 m_aCopyToPB.SetClickHdl(LINK(this, SwMailMergeOutputPage, CopyToHdl_Impl)); 417 418 m_aSaveAsOneRB.SetClickHdl(LINK(this, SwMailMergeOutputPage, DocumentSelectionHdl_Impl)); 419 m_aSaveIndividualRB.SetClickHdl(LINK(this, SwMailMergeOutputPage, DocumentSelectionHdl_Impl)); 420 m_aPrintAllRB.SetClickHdl(LINK(this, SwMailMergeOutputPage, DocumentSelectionHdl_Impl)); 421 m_aSendAllRB.SetClickHdl(LINK(this, SwMailMergeOutputPage, DocumentSelectionHdl_Impl)); 422 423 m_aFromRB.SetClickHdl(LINK(this, SwMailMergeOutputPage, DocumentSelectionHdl_Impl)); 424 //#i63267# printing might be disabled 425 m_aPrintRB.Enable(!Application::GetSettings().GetMiscSettings().GetDisablePrinting()); 426 } 427 428 /*-- 02.04.2004 13:15:44--------------------------------------------------- 429 430 -----------------------------------------------------------------------*/ 431 SwMailMergeOutputPage::~SwMailMergeOutputPage() 432 { 433 delete m_pTempPrinter; 434 delete m_pDocumentPrinterCopy; 435 } 436 /*-- 31.01.2005 08:38:14--------------------------------------------------- 437 438 -----------------------------------------------------------------------*/ 439 void SwMailMergeOutputPage::ActivatePage() 440 { 441 //fill printer ListBox 442 const std::vector<rtl::OUString>& rPrinters = Printer::GetPrinterQueues(); 443 unsigned int nCount = rPrinters.size(); 444 if ( nCount ) 445 { 446 for( unsigned int i = 0; i < nCount; i++ ) 447 { 448 m_aPrinterLB.InsertEntry( rPrinters[i] ); 449 } 450 451 } 452 SwMailMergeConfigItem& rConfigItem = m_pWizard->GetConfigItem(); 453 454 SwView* pTargetView = rConfigItem.GetTargetView(); 455 DBG_ASSERT(pTargetView, "no target view exists"); 456 if(pTargetView) 457 { 458 SfxPrinter* pPrinter = pTargetView->GetWrtShell().getIDocumentDeviceAccess()->getPrinter( true ); 459 m_aPrinterLB.SelectEntry( pPrinter->GetName() ); 460 m_aToNF.SetValue( rConfigItem.GetMergedDocumentCount() ); 461 m_aToNF.SetMax( rConfigItem.GetMergedDocumentCount() ); 462 m_pDocumentPrinterCopy = pTargetView->GetWrtShell().getIDocumentDeviceAccess()->getPrinter( true )->Clone(); 463 } 464 m_aPrinterLB.SelectEntry( rConfigItem.GetSelectedPrinter() ); 465 466 SwView* pSourceView = rConfigItem.GetSourceView(); 467 DBG_ASSERT(pSourceView, "no source view exists"); 468 if(pSourceView) 469 { 470 SwDocShell* pDocShell = pSourceView->GetDocShell(); 471 if ( pDocShell->HasName() ) 472 { 473 INetURLObject aTmp( pDocShell->GetMedium()->GetName() ); 474 m_aAttachmentED.SetText(aTmp.getName( 475 INetURLObject::LAST_SEGMENT, true, INetURLObject::DECODE_WITH_CHARSET )); 476 } 477 } 478 } 479 /*-- 05.07.2004 13:54:11--------------------------------------------------- 480 481 -----------------------------------------------------------------------*/ 482 bool SwMailMergeOutputPage::canAdvance() const 483 { 484 return false; 485 } 486 /*-- 02.04.2004 13:15:44--------------------------------------------------- 487 488 -----------------------------------------------------------------------*/ 489 IMPL_LINK(SwMailMergeOutputPage, OutputTypeHdl_Impl, RadioButton*, pButton) 490 { 491 Control* aControls[] = 492 { 493 &m_aSaveStartDocPB, 494 &m_aSaveAsOneRB, &m_aSaveIndividualRB, 495 &m_aFromRB, &m_aFromNF, &m_aToFT, &m_aToNF, 496 &m_aSaveNowPB, 497 &m_aPrinterFT, &m_aPrinterLB, &m_aPrinterSettingsPB, &m_aPrintAllRB, 498 &m_aPrintNowPB, 499 &m_aMailToFT, &m_aMailToLB, &m_aCopyToPB, 500 &m_aSubjectFT, &m_aSubjectED, 501 &m_aSendAsFT, &m_aSendAsLB, &m_aSendAsPB, 502 &m_aAttachmentFT, &m_aAttachmentED, 503 &m_aSendAllRB, &m_aSendDocumentsPB, 504 0 505 }; 506 SetUpdateMode(sal_True); 507 Control** pControl = aControls; 508 do 509 { 510 (*pControl)->Show(sal_False); 511 512 } while(*(++pControl)); 513 514 if(&m_aSaveStartDocRB == pButton) 515 { 516 m_aSaveStartDocPB.Show(); 517 m_aSeparatorFL.SetText(m_sSaveStartST); 518 519 } 520 else if(&m_aSaveMergedDocRB == pButton) 521 { 522 Control* aSaveMergedControls[] = 523 { 524 &m_aSaveAsOneRB, &m_aSaveIndividualRB, 525 &m_aFromRB, &m_aFromNF, &m_aToFT, &m_aToNF, 526 &m_aSaveNowPB, 527 0 528 }; 529 Control** pSaveMergeControl = aSaveMergedControls; 530 do 531 { 532 (*pSaveMergeControl)->Show(sal_True); 533 534 } while(*(++pSaveMergeControl)); 535 if(!m_aFromRB.IsChecked() && !m_aSaveAsOneRB.IsChecked()) 536 { 537 m_aSaveIndividualRB.Check(); 538 } 539 m_aSeparatorFL.SetText(m_sSaveMergedST); 540 //reposition the from/to line 541 if(m_aFromRB.GetPosPixel().Y() != m_nFromToRBPos) 542 { 543 Point aPos(m_aFromRB.GetPosPixel()); aPos.Y() = m_nFromToRBPos; m_aFromRB.SetPosPixel(aPos); 544 aPos = m_aToFT.GetPosPixel(); aPos.Y() = m_nFromToFTPos; m_aToFT.SetPosPixel(aPos); 545 aPos = m_aFromNF.GetPosPixel(); aPos.Y() = m_nFromToNFPos; m_aFromNF.SetPosPixel(aPos); 546 aPos = m_aToNF.GetPosPixel(); aPos.Y() = m_nFromToNFPos; m_aToNF.SetPosPixel(aPos); 547 } 548 } 549 else if(&m_aPrintRB == pButton) 550 { 551 Control* aPrintControls[] = 552 { 553 &m_aFromRB, &m_aFromNF, &m_aToFT, &m_aToNF, 554 &m_aPrinterFT, &m_aPrinterLB, &m_aPrinterSettingsPB, &m_aPrintAllRB, 555 &m_aPrintNowPB, 556 0 557 }; 558 Control** pPrinterControl = aPrintControls; 559 do 560 { 561 (*pPrinterControl)->Show(sal_True); 562 563 } while(*(++pPrinterControl)); 564 if(!m_aFromRB.IsChecked()) 565 m_aPrintAllRB.Check(); 566 567 m_aSeparatorFL.SetText(m_sPrintST); 568 //reposition the from/to line 569 long nRB_FT_Offset = m_nFromToRBPos - m_nFromToFTPos; 570 long nNewRBXPos = m_aPrintAllRB.GetPosPixel().Y() + m_nRBOffset; 571 572 Point aPos(m_aFromRB.GetPosPixel());aPos.Y() = nNewRBXPos; m_aFromRB.SetPosPixel(aPos); 573 aPos = m_aToFT.GetPosPixel(); aPos.Y() = nNewRBXPos + nRB_FT_Offset; m_aToFT.SetPosPixel(aPos); 574 aPos = m_aFromNF.GetPosPixel(); aPos.Y() = nNewRBXPos + nRB_FT_Offset; m_aFromNF.SetPosPixel(aPos); 575 aPos = m_aToNF.GetPosPixel(); aPos.Y() = nNewRBXPos + nRB_FT_Offset; m_aToNF.SetPosPixel(aPos); 576 } 577 else /*if(&m_aSendMailRB == pButton)*/ 578 { 579 Control* aMailControls[] = 580 { 581 &m_aFromRB, &m_aFromNF, &m_aToFT, &m_aToNF, 582 &m_aMailToFT, &m_aMailToLB, &m_aCopyToPB, 583 &m_aSubjectFT, &m_aSubjectED, 584 &m_aSendAsFT, &m_aSendAsLB, &m_aSendAsPB, 585 &m_aAttachmentFT, &m_aAttachmentED, 586 &m_aSendAllRB, &m_aSendDocumentsPB, 0 587 }; 588 Control** pMailControl = aMailControls; 589 do 590 { 591 (*pMailControl)->Show(sal_True); 592 593 } while(*(++pMailControl)); 594 595 if(!m_aFromRB.IsChecked()) 596 m_aSendAllRB.Check(); 597 if(!m_aAttachmentED.GetText().Len()) 598 { 599 String sAttach( m_sDefaultAttachmentST ); 600 sAttach += '.'; 601 sAttach += lcl_GetExtensionForDocType( 602 (sal_uLong)m_aSendAsLB.GetEntryData(m_aSendAsLB.GetSelectEntryPos())); 603 m_aAttachmentED.SetText( sAttach ); 604 605 } 606 m_aSeparatorFL.SetText(m_sSendMailST); 607 //fill mail address ListBox 608 if(!m_aMailToLB.GetEntryCount()) 609 { 610 SwMailMergeConfigItem& rConfigItem = m_pWizard->GetConfigItem(); 611 //select first column 612 uno::Reference< sdbcx::XColumnsSupplier > xColsSupp( rConfigItem.GetResultSet(), uno::UNO_QUERY); 613 //get the name of the actual columns 614 uno::Reference < container::XNameAccess> xColAccess = xColsSupp.is() ? xColsSupp->getColumns() : 0; 615 uno::Sequence< ::rtl::OUString > aFields; 616 if(xColAccess.is()) 617 aFields = xColAccess->getElementNames(); 618 const ::rtl::OUString* pFields = aFields.getConstArray(); 619 for(sal_Int32 nField = 0; nField < aFields.getLength(); ++nField) 620 m_aMailToLB.InsertEntry(pFields[nField]); 621 622 m_aMailToLB.SelectEntryPos(0); 623 // then select the right one - may not be available 624 const ResStringArray& rHeaders = rConfigItem.GetDefaultAddressHeaders(); 625 String sEMailColumn = rHeaders.GetString( MM_PART_E_MAIL ); 626 Sequence< ::rtl::OUString> aAssignment = 627 rConfigItem.GetColumnAssignment( rConfigItem.GetCurrentDBData() ); 628 if(aAssignment.getLength() > MM_PART_E_MAIL && aAssignment[MM_PART_E_MAIL].getLength()) 629 sEMailColumn = aAssignment[MM_PART_E_MAIL]; 630 m_aMailToLB.SelectEntry(sEMailColumn); 631 // HTML format pre-selected 632 m_aSendAsLB.SelectEntryPos(3); 633 SendTypeHdl_Impl(&m_aSendAsLB); 634 } 635 if(m_aSendAllRB.GetPosPixel().Y() + m_nRBOffset != m_aFromRB.GetPosPixel().Y()) 636 { 637 long nRB_FT_Offset = m_nFromToRBPos - m_nFromToFTPos; 638 long nNewRBXPos = m_aSendAllRB.GetPosPixel().Y() + m_nRBOffset; 639 640 Point aPos(m_aFromRB.GetPosPixel());aPos.Y() = nNewRBXPos; m_aFromRB.SetPosPixel(aPos); 641 aPos = m_aToFT.GetPosPixel(); aPos.Y() = nNewRBXPos + nRB_FT_Offset; m_aToFT.SetPosPixel(aPos); 642 aPos = m_aFromNF.GetPosPixel(); aPos.Y() = nNewRBXPos + nRB_FT_Offset; m_aFromNF.SetPosPixel(aPos); 643 aPos = m_aToNF.GetPosPixel(); aPos.Y() = nNewRBXPos + nRB_FT_Offset; m_aToNF.SetPosPixel(aPos); 644 } 645 } 646 m_aFromRB.GetClickHdl().Call(m_aFromRB.IsChecked() ? &m_aFromRB : 0); 647 648 SetUpdateMode(sal_False); 649 return 0; 650 } 651 /*-- 22.08.2005 12:15:10--------------------------------------------------- 652 653 -----------------------------------------------------------------------*/ 654 IMPL_LINK(SwMailMergeOutputPage, DocumentSelectionHdl_Impl, RadioButton*, pButton) 655 { 656 sal_Bool bEnableFromTo = pButton == &m_aFromRB; 657 m_aFromNF.Enable(bEnableFromTo); 658 m_aToFT.Enable(bEnableFromTo); 659 m_aToNF.Enable(bEnableFromTo); 660 return 0; 661 } 662 663 /*-- 16.04.2004 16:45:10--------------------------------------------------- 664 665 -----------------------------------------------------------------------*/ 666 IMPL_LINK(SwMailMergeOutputPage, CopyToHdl_Impl, PushButton*, pButton) 667 { 668 SwCopyToDialog* pDlg = new SwCopyToDialog(pButton); 669 pDlg->SetCC(m_sCC ); 670 pDlg->SetBCC(m_sBCC); 671 if(RET_OK == pDlg->Execute()) 672 { 673 m_sCC = pDlg->GetCC() ; 674 m_sBCC = pDlg->GetBCC(); 675 } 676 delete pDlg; 677 return 0; 678 } 679 /*-- 17.05.2004 13:51:02--------------------------------------------------- 680 681 -----------------------------------------------------------------------*/ 682 IMPL_LINK(SwMailMergeOutputPage, SaveStartHdl_Impl, PushButton*, pButton) 683 { 684 SwMailMergeConfigItem& rConfigItem = m_pWizard->GetConfigItem(); 685 SwView* pSourceView = rConfigItem.GetSourceView(); 686 DBG_ASSERT( pSourceView, "source view missing"); 687 if(pSourceView) 688 { 689 SfxViewFrame* pSourceViewFrm = pSourceView->GetViewFrame(); 690 uno::Reference< frame::XFrame > xFrame = 691 pSourceViewFrm->GetFrame().GetFrameInterface(); 692 xFrame->getContainerWindow()->setVisible(sal_True); 693 pSourceViewFrm->GetDispatcher()->Execute(SID_SAVEDOC, SFX_CALLMODE_SYNCHRON); 694 xFrame->getContainerWindow()->setVisible(sal_False); 695 SwDocShell* pDocShell = pSourceView->GetDocShell(); 696 //if the document has been saved it's URL has to be stored for 697 // later use and it can be closed now 698 if(pDocShell->HasName() && !pDocShell->IsModified()) 699 { 700 INetURLObject aURL = pDocShell->GetMedium()->GetURLObject(); 701 //update the attachment name 702 if(!m_aAttachmentED.GetText().Len()) 703 { 704 if ( pDocShell->HasName() ) 705 { 706 m_aAttachmentED.SetText(aURL.getName( 707 INetURLObject::LAST_SEGMENT, true, INetURLObject::DECODE_WITH_CHARSET )); 708 } 709 } 710 711 rConfigItem.AddSavedDocument( 712 aURL.GetMainURL(INetURLObject::DECODE_TO_IURI)); 713 pButton->Enable(sal_False); 714 m_pWizard->enableButtons(WZB_FINISH, sal_True); 715 pButton->Enable(sal_False); 716 717 } 718 } 719 return 0; 720 } 721 /*-- 17.07.2008 08:09:06--------------------------------------------------- 722 723 -----------------------------------------------------------------------*/ 724 IMPL_LINK(SwMailMergeOutputPage, SaveCancelHdl_Impl, Button*, EMPTYARG ) 725 { 726 m_bCancelSaving = true; 727 return 0; 728 } 729 /*-- 17.05.2004 13:51:02--------------------------------------------------- 730 731 -----------------------------------------------------------------------*/ 732 IMPL_LINK(SwMailMergeOutputPage, SaveOutputHdl_Impl, PushButton*, pButton) 733 { 734 SwMailMergeConfigItem& rConfigItem = m_pWizard->GetConfigItem(); 735 SwView* pTargetView = rConfigItem.GetTargetView(); 736 DBG_ASSERT(pTargetView, "no target view exists"); 737 if(!pTargetView) 738 return 0; 739 740 if(m_aSaveAsOneRB.IsChecked()) 741 { 742 String sFilter; 743 String sPath = SwMailMergeHelper::CallSaveAsDialog(sFilter); 744 if(!sPath.Len()) 745 return 0; 746 uno::Sequence< beans::PropertyValue > aValues(1); 747 beans::PropertyValue* pValues = aValues.getArray(); 748 pValues[0].Name = C2U("FilterName"); 749 pValues[0].Value <<= ::rtl::OUString(sFilter); 750 751 uno::Reference< frame::XStorable > xStore( pTargetView->GetDocShell()->GetModel(), uno::UNO_QUERY); 752 sal_uInt32 nErrorCode = ERRCODE_NONE; 753 try 754 { 755 xStore->storeToURL( sPath, aValues ); 756 } 757 catch( task::ErrorCodeIOException& aErrorEx ) 758 { 759 nErrorCode = (sal_uInt32)aErrorEx.ErrCode; 760 } 761 catch( Exception& ) 762 { 763 nErrorCode = ERRCODE_IO_GENERAL; 764 } 765 if( nErrorCode != ERRCODE_NONE ) 766 { 767 SfxErrorContext aEc(ERRCTX_SFX_SAVEASDOC, pTargetView->GetDocShell()->GetTitle()); 768 ErrorHandler::HandleError( nErrorCode ); 769 } 770 } 771 else 772 { 773 sal_uInt32 nBegin = 0; 774 sal_uInt32 nEnd = 0; 775 if(m_aSaveIndividualRB.IsChecked()) 776 { 777 nBegin = 0; 778 nEnd = rConfigItem.GetMergedDocumentCount(); 779 } 780 else 781 { 782 nBegin = static_cast< sal_Int32 >(m_aFromNF.GetValue() - 1); 783 nEnd = static_cast< sal_Int32 >(m_aToNF.GetValue()); 784 if(nEnd > rConfigItem.GetMergedDocumentCount()) 785 nEnd = rConfigItem.GetMergedDocumentCount(); 786 } 787 String sFilter; 788 String sPath = SwMailMergeHelper::CallSaveAsDialog(sFilter); 789 if(!sPath.Len()) 790 return 0; 791 String sTargetTempURL = URIHelper::SmartRel2Abs( 792 INetURLObject(), utl::TempFile::CreateTempName(), 793 URIHelper::GetMaybeFileHdl()); 794 const SfxFilter *pSfxFlt = SwIoSystem::GetFilterOfFormat( 795 String::CreateFromAscii( FILTER_XML ), 796 SwDocShell::Factory().GetFilterContainer() ); 797 798 uno::Sequence< beans::PropertyValue > aValues(1); 799 beans::PropertyValue* pValues = aValues.getArray(); 800 pValues[0].Name = C2U("FilterName"); 801 pValues[0].Value <<= ::rtl::OUString(pSfxFlt->GetFilterName()); 802 803 uno::Reference< frame::XStorable > xStore( pTargetView->GetDocShell()->GetModel(), uno::UNO_QUERY); 804 sal_uInt32 nErrorCode = ERRCODE_NONE; 805 try 806 { 807 xStore->storeToURL( sTargetTempURL, aValues ); 808 } 809 catch( task::ErrorCodeIOException& aErrorEx ) 810 { 811 nErrorCode = (sal_uInt32)aErrorEx.ErrCode; 812 } 813 catch( Exception& ) 814 { 815 nErrorCode = ERRCODE_IO_GENERAL; 816 } 817 if( nErrorCode != ERRCODE_NONE ) 818 { 819 SfxErrorContext aEc(ERRCTX_SFX_SAVEASDOC, pTargetView->GetDocShell()->GetTitle()); 820 ErrorHandler::HandleError( nErrorCode ); 821 } 822 823 SwView* pSourceView = rConfigItem.GetSourceView(); 824 PrintMonitor aSaveMonitor(this, PrintMonitor::MONITOR_TYPE_SAVE); 825 aSaveMonitor.aDocName.SetText(pSourceView->GetDocShell()->GetTitle(22)); 826 aSaveMonitor.aCancel.SetClickHdl(LINK(this, SwMailMergeOutputPage, SaveCancelHdl_Impl)); 827 aSaveMonitor.aPrinter.SetText( INetURLObject( sPath ).getFSysPath( INetURLObject::FSYS_DETECT ) ); 828 aSaveMonitor.ResizeControls(); 829 830 m_bCancelSaving = false; 831 aSaveMonitor.Show(); 832 m_pWizard->enableButtons(WZB_CANCEL, sal_False); 833 834 for(sal_uInt32 nDoc = nBegin; nDoc < nEnd && !m_bCancelSaving; ++nDoc) 835 { 836 SwDocMergeInfo& rInfo = rConfigItem.GetDocumentMergeInfo(nDoc); 837 INetURLObject aURL(sPath); 838 String sFile = aURL.GetBase(); 839 String sExtension = aURL.getExtension(); 840 if(!sExtension.Len()) 841 { 842 sExtension = pSfxFlt->GetWildcard()().GetToken(1, '.'); 843 sPath += '.'; 844 sPath += sExtension; 845 } 846 String sStat(SW_RES(STR_STATSTR_LETTER)); 847 sStat += ' '; 848 sStat += String::CreateFromInt32( nDoc ); 849 aSaveMonitor.aPrintInfo.SetText(sStat); 850 851 //now extract a document from the target document 852 // the shell will be closed at the end, but it is more safe to use SfxObjectShellLock here 853 SfxObjectShellLock xTempDocShell( new SwDocShell( SFX_CREATE_MODE_STANDARD ) ); 854 xTempDocShell->DoInitNew( 0 ); 855 SfxViewFrame* pTempFrame = SfxViewFrame::LoadHiddenDocument( *xTempDocShell, 0 ); 856 // pTempFrame->GetFrame().Appear(); 857 SwView* pTempView = static_cast<SwView*>( pTempFrame->GetViewShell() ); 858 pTargetView->GetWrtShell().StartAction(); 859 SwgReaderOption aOpt; 860 aOpt.SetTxtFmts( sal_True ); 861 aOpt.SetFrmFmts( sal_True ); 862 aOpt.SetPageDescs( sal_True ); 863 aOpt.SetNumRules( sal_True ); 864 aOpt.SetMerge( sal_False ); 865 pTempView->GetDocShell()->LoadStylesFromFile( 866 sTargetTempURL, aOpt, sal_True ); 867 868 pTargetView->GetWrtShell().PastePages(pTempView->GetWrtShell(), 869 (sal_uInt16)rInfo.nStartPageInTarget, (sal_uInt16)rInfo.nEndPageInTarget ); 870 pTargetView->GetWrtShell().EndAction(); 871 //then save it 872 String sOutPath = aURL.GetMainURL(INetURLObject::DECODE_TO_IURI); 873 String sCounter('_'); 874 sCounter += String::CreateFromInt32(nDoc); 875 sOutPath.Insert(sCounter, sOutPath.Len() - sExtension.Len() - 1); 876 //SfxStringItem aName(SID_FILE_NAME, sOutPath); 877 //SfxStringItem aFilter(SID_FILTER_NAME, sFilter); 878 879 while(true) 880 { 881 //time for other slots is needed 882 for(sal_Int16 r = 0; r < 10; ++r) 883 Application::Reschedule(); 884 bool bFailed = false; 885 try 886 { 887 pValues[0].Value <<= ::rtl::OUString(sFilter); 888 uno::Reference< frame::XStorable > xTempStore( xTempDocShell->GetModel(), uno::UNO_QUERY); 889 xTempStore->storeToURL( sOutPath, aValues ); 890 } 891 catch( const uno::Exception& ) 892 { 893 bFailed = true; 894 } 895 896 if(bFailed) 897 { 898 SwSaveWarningBox_Impl aWarning( pButton, sOutPath ); 899 if(RET_OK == aWarning.Execute()) 900 sOutPath = aWarning.GetFileName(); 901 else 902 { 903 xTempDocShell->DoClose(); 904 return 0; 905 } 906 } 907 else 908 { 909 xTempDocShell->DoClose(); 910 break; 911 } 912 } 913 } 914 ::osl::File::remove( sTargetTempURL ); 915 } 916 m_pWizard->enableButtons(WZB_CANCEL, sal_True); 917 m_pWizard->enableButtons(WZB_FINISH, sal_True); 918 return 0; 919 } 920 /*-- 22.06.2004 11:51:30--------------------------------------------------- 921 922 -----------------------------------------------------------------------*/ 923 IMPL_LINK(SwMailMergeOutputPage, PrinterChangeHdl_Impl, ListBox*, pBox) 924 { 925 if( m_pDocumentPrinterCopy && pBox->GetSelectEntryPos() != LISTBOX_ENTRY_NOTFOUND ) 926 { 927 const QueueInfo* pInfo = Printer::GetQueueInfo( pBox->GetSelectEntry(), false ); 928 929 if( pInfo ) 930 { 931 if ( !m_pTempPrinter ) 932 { 933 if( (m_pDocumentPrinterCopy->GetName() == pInfo->GetPrinterName()) && 934 (m_pDocumentPrinterCopy->GetDriverName() == pInfo->GetDriver()) ) 935 m_pTempPrinter = new Printer( m_pDocumentPrinterCopy->GetJobSetup() ); 936 else 937 m_pTempPrinter = new Printer( *pInfo ); 938 } 939 else 940 { 941 if( (m_pTempPrinter->GetName() != pInfo->GetPrinterName()) || 942 (m_pTempPrinter->GetDriverName() != pInfo->GetDriver()) ) 943 { 944 delete m_pTempPrinter; 945 m_pTempPrinter = new Printer( *pInfo ); 946 } 947 } 948 } 949 else if( ! m_pTempPrinter ) 950 m_pTempPrinter = new Printer(); 951 952 m_aPrinterSettingsPB.Enable( m_pTempPrinter->HasSupport( SUPPORT_SETUPDIALOG ) ); 953 } 954 else 955 m_aPrinterSettingsPB.Disable(); 956 m_pWizard->GetConfigItem().SetSelectedPrinter( pBox->GetSelectEntry() ); 957 958 // return m_pTempPrinter; 959 return 0; 960 } 961 962 /*-- 17.05.2004 13:51:02--------------------------------------------------- 963 964 -----------------------------------------------------------------------*/ 965 IMPL_LINK(SwMailMergeOutputPage, PrintHdl_Impl, PushButton*, EMPTYARG) 966 { 967 SwView* pTargetView = m_pWizard->GetConfigItem().GetTargetView(); 968 DBG_ASSERT(pTargetView, "no target view exists"); 969 if(!pTargetView) 970 return 0; 971 972 sal_uInt32 nBegin = 0; 973 sal_uInt32 nEnd = 0; 974 SwMailMergeConfigItem& rConfigItem = m_pWizard->GetConfigItem(); 975 if(m_aPrintAllRB.IsChecked()) 976 { 977 nBegin = 0; 978 nEnd = rConfigItem.GetMergedDocumentCount(); 979 } 980 else 981 { 982 nBegin = static_cast< sal_Int32 >(m_aFromNF.GetValue() - 1); 983 nEnd = static_cast< sal_Int32 >(m_aToNF.GetValue()); 984 if(nEnd > rConfigItem.GetMergedDocumentCount()) 985 nEnd = rConfigItem.GetMergedDocumentCount(); 986 } 987 rConfigItem.SetPrintRange( (sal_uInt16)nBegin, (sal_uInt16)nEnd ); 988 SwDocMergeInfo& rStartInfo = rConfigItem.GetDocumentMergeInfo(nBegin); 989 SwDocMergeInfo& rEndInfo = rConfigItem.GetDocumentMergeInfo(nEnd - 1); 990 991 rtl::OUString sPages(rtl::OUString::valueOf( rStartInfo.nStartPageInTarget )); 992 sPages += rtl::OUString::createFromAscii( " - "); 993 sPages += rtl::OUString::valueOf( rEndInfo.nEndPageInTarget ); 994 995 SwWrtShell& rSh = pTargetView->GetWrtShell(); 996 pTargetView->SetMailMergeConfigItem(&rConfigItem, 0, sal_False); 997 if(m_pTempPrinter) 998 { 999 m_pDocumentPrinterCopy->SetPrinterProps(m_pTempPrinter); 1000 pTargetView->SetPrinter(m_pDocumentPrinterCopy->Clone()); 1001 } 1002 1003 SfxObjectShell* pObjSh = pTargetView->GetViewFrame()->GetObjectShell(); 1004 SFX_APP()->NotifyEvent(SfxEventHint(SW_EVENT_MAIL_MERGE, SwDocShell::GetEventName(STR_SW_EVENT_MAIL_MERGE), pObjSh)); 1005 rSh.GetNewDBMgr()->SetMergeType( DBMGR_MERGE_DOCUMENTS ); 1006 //SfxDispatcher *pDis = pTargetView->GetViewFrame()->GetDispatcher(); 1007 SfxBoolItem aMergeSilent(SID_SILENT, sal_False); 1008 m_pWizard->enableButtons(WZB_CANCEL, sal_False); 1009 1010 uno::Sequence < beans::PropertyValue > aProps( 2 ); 1011 aProps[0]. Name = rtl::OUString::createFromAscii("MonitorVisible"); 1012 aProps[0].Value <<= sal_True; 1013 aProps[1]. Name = rtl::OUString::createFromAscii("Pages"); 1014 aProps[1]. Value <<= sPages; 1015 1016 pTargetView->ExecPrint( aProps, false, true ); 1017 SFX_APP()->NotifyEvent(SfxEventHint(SW_EVENT_MAIL_MERGE_END, SwDocShell::GetEventName(STR_SW_EVENT_MAIL_MERGE_END), pObjSh)); 1018 1019 pTargetView->SetMailMergeConfigItem(0, 0, sal_False); 1020 m_pWizard->enableButtons(WZB_CANCEL, sal_True); 1021 m_pWizard->enableButtons(WZB_FINISH, sal_True); 1022 return 0; 1023 } 1024 /*-- 17.05.2004 13:51:02--------------------------------------------------- 1025 1026 -----------------------------------------------------------------------*/ 1027 IMPL_LINK(SwMailMergeOutputPage, PrinterSetupHdl_Impl, PushButton*, pButton) 1028 { 1029 if( !m_pTempPrinter ) 1030 PrinterChangeHdl_Impl(&m_aPrinterLB); 1031 if(m_pTempPrinter) 1032 m_pTempPrinter->Setup(pButton); 1033 return 0; 1034 } 1035 /*-- 14.06.2004 09:34:01--------------------------------------------------- 1036 1037 -----------------------------------------------------------------------*/ 1038 IMPL_LINK(SwMailMergeOutputPage, SendTypeHdl_Impl, ListBox*, pBox) 1039 { 1040 sal_uLong nDocType = (sal_uLong)pBox->GetEntryData(pBox->GetSelectEntryPos()); 1041 sal_Bool bEnable = MM_DOCTYPE_HTML != nDocType && MM_DOCTYPE_TEXT != nDocType; 1042 m_aSendAsPB.Enable( bEnable ); 1043 m_aAttachmentFT.Enable( bEnable ); 1044 m_aAttachmentED.Enable( bEnable ); 1045 if(bEnable) 1046 { 1047 //add the correct extension 1048 String sAttach(m_aAttachmentED.GetText()); 1049 //do nothing if the user has removed the name - the warning will come early enough 1050 if(sAttach.Len()) 1051 { 1052 xub_StrLen nTokenCount = sAttach.GetTokenCount( '.' ); 1053 if( 2 > nTokenCount) 1054 { 1055 sAttach += '.'; 1056 ++nTokenCount; 1057 } 1058 sAttach.SetToken( nTokenCount - 1, '.', lcl_GetExtensionForDocType( nDocType )); 1059 m_aAttachmentED.SetText(sAttach); 1060 } 1061 } 1062 return 0; 1063 } 1064 /*-- 17.05.2004 13:51:02--------------------------------------------------- 1065 1066 -----------------------------------------------------------------------*/ 1067 IMPL_LINK(SwMailMergeOutputPage, SendAsHdl_Impl, PushButton*, pButton) 1068 { 1069 SwMailBodyDialog* pDlg = new SwMailBodyDialog(pButton, m_pWizard); 1070 pDlg->SetBody(m_sBody); 1071 if(RET_OK == pDlg->Execute()) 1072 { 1073 m_sBody = pDlg->GetBody(); 1074 } 1075 return 0; 1076 } 1077 /*-- 21.05.2004 12:03:25--------------------------------------------------- 1078 Send documents as e-mail 1079 -----------------------------------------------------------------------*/ 1080 IMPL_LINK(SwMailMergeOutputPage, SendDocumentsHdl_Impl, PushButton*, pButton) 1081 { 1082 SwMailMergeConfigItem& rConfigItem = m_pWizard->GetConfigItem(); 1083 1084 //get the composed document 1085 SwView* pTargetView = rConfigItem.GetTargetView(); 1086 DBG_ASSERT(pTargetView, "no target view exists"); 1087 if(!pTargetView) 1088 return 0; 1089 1090 if(!rConfigItem.GetMailServer().getLength() || 1091 !SwMailMergeHelper::CheckMailAddress(rConfigItem.GetMailAddress()) ) 1092 { 1093 QueryBox aQuery(pButton, WB_YES_NO_CANCEL, m_sConfigureMail); 1094 sal_uInt16 nRet = aQuery.Execute(); 1095 if(RET_YES == nRet ) 1096 { 1097 SfxAllItemSet aSet(pTargetView->GetPool()); 1098 SwMailConfigDlg* pDlg = new SwMailConfigDlg(pButton, aSet); 1099 nRet = pDlg->Execute(); 1100 delete pDlg; 1101 } 1102 1103 if(nRet != RET_OK && nRet != RET_YES) 1104 return 0; 1105 } 1106 //add the documents 1107 sal_uInt32 nBegin = 0; 1108 sal_uInt32 nEnd = 0; 1109 if(m_aSendAllRB.IsChecked()) 1110 { 1111 nBegin = 0; 1112 nEnd = rConfigItem.GetMergedDocumentCount(); 1113 } 1114 else 1115 { 1116 nBegin = static_cast< sal_Int32 >(m_aFromNF.GetValue() - 1); 1117 nEnd = static_cast< sal_Int32 >(m_aToNF.GetValue()); 1118 if(nEnd > rConfigItem.GetMergedDocumentCount()) 1119 nEnd = rConfigItem.GetMergedDocumentCount(); 1120 } 1121 bool bAsBody = false; 1122 bool bIsPDF = false; 1123 rtl_TextEncoding eEncoding = ::gsl_getSystemTextEncoding(); 1124 SfxFilterContainer* pFilterContainer = SwDocShell::Factory().GetFilterContainer(); 1125 const SfxFilter *pSfxFlt = 0; 1126 sal_uLong nDocType = (sal_uLong)m_aSendAsLB.GetEntryData(m_aSendAsLB.GetSelectEntryPos()); 1127 String sExtension = lcl_GetExtensionForDocType(nDocType); 1128 switch( nDocType ) 1129 { 1130 case MM_DOCTYPE_OOO : break; 1131 case MM_DOCTYPE_PDF : bIsPDF = true; 1132 { 1133 //the method SwIOSystemGetFilterOfFormat( ) returns the template filter 1134 //because it uses the same user data :-( 1135 SfxFilterMatcher aMatcher( pFilterContainer->GetName() ); 1136 SfxFilterMatcherIter aIter( &aMatcher ); 1137 const SfxFilter* pFilter = aIter.First(); 1138 String sFilterMime( String::CreateFromAscii( "application/pdf" )); 1139 while ( pFilter ) 1140 { 1141 if( pFilter->GetMimeType() == sFilterMime && pFilter->CanExport() ) 1142 { 1143 pSfxFlt = pFilter; 1144 break; 1145 } 1146 pFilter = aIter.Next(); 1147 } 1148 1149 } 1150 break; 1151 case MM_DOCTYPE_WORD: 1152 { 1153 //the method SwIOSystemGetFilterOfFormat( ) returns the template filter 1154 //because it uses the same user data :-( 1155 SfxFilterMatcher aMatcher( pFilterContainer->GetName() ); 1156 SfxFilterMatcherIter aIter( &aMatcher ); 1157 const SfxFilter* pFilter = aIter.First(); 1158 String sFilterUserData( String::CreateFromAscii( FILTER_WW8 )); 1159 while ( pFilter ) 1160 { 1161 if( pFilter->GetUserData() == sFilterUserData && pFilter->CanExport() ) 1162 { 1163 pSfxFlt = pFilter; 1164 break; 1165 } 1166 pFilter = aIter.Next(); 1167 } 1168 1169 } 1170 break; 1171 case MM_DOCTYPE_HTML: 1172 { 1173 bAsBody = true; 1174 SvxHtmlOptions* pHtmlOptions = SvxHtmlOptions::Get(); 1175 eEncoding = pHtmlOptions->GetTextEncoding(); 1176 } 1177 break; 1178 case MM_DOCTYPE_TEXT: 1179 bAsBody = true; 1180 break; 1181 } 1182 if(!pSfxFlt) 1183 pSfxFlt = pFilterContainer->GetFilter4Extension(sExtension, SFX_FILTER_EXPORT); 1184 1185 if(!pSfxFlt) 1186 return 0; 1187 String sMimeType = pSfxFlt->GetMimeType(); 1188 1189 if(!m_aSubjectED.GetText().Len()) 1190 { 1191 SwSendQueryBox_Impl aQuery(pButton, m_sNoSubjectQueryST); 1192 aQuery.SetIsEmptyTextAllowed(true); 1193 aQuery.SetValue(m_sNoSubjectST); 1194 if(RET_OK == aQuery.Execute()) 1195 { 1196 if(aQuery.GetValue() != m_sNoSubjectST) 1197 m_aSubjectED.SetText(aQuery.GetValue()); 1198 } 1199 else 1200 return 0; 1201 } 1202 if(!bAsBody && !m_aAttachmentED.GetText().Len()) 1203 { 1204 SwSendQueryBox_Impl aQuery(pButton, m_sNoAttachmentNameST); 1205 aQuery.SetIsEmptyTextAllowed(false); 1206 if(RET_OK == aQuery.Execute()) 1207 { 1208 String sAttach(aQuery.GetValue()); 1209 xub_StrLen nTokenCount = sAttach.GetTokenCount( '.' ); 1210 if( 2 > nTokenCount) 1211 { 1212 sAttach += '.'; 1213 ++nTokenCount; 1214 } 1215 sAttach.SetToken( nTokenCount - 1, '.', lcl_GetExtensionForDocType( 1216 (sal_uLong)m_aSendAsLB.GetEntryData(m_aSendAsLB.GetSelectEntryPos()))); 1217 m_aAttachmentED.SetText(sAttach); 1218 } 1219 else 1220 return 0; 1221 } 1222 SfxStringItem aFilterName( SID_FILTER_NAME, pSfxFlt->GetFilterName() ); 1223 String sEMailColumn = m_aMailToLB.GetSelectEntry(); 1224 DBG_ASSERT( sEMailColumn.Len(), "No email column selected"); 1225 Reference< sdbcx::XColumnsSupplier > xColsSupp( rConfigItem.GetResultSet(), UNO_QUERY); 1226 Reference < container::XNameAccess> xColAccess = xColsSupp.is() ? xColsSupp->getColumns() : 0; 1227 if(!sEMailColumn.Len() || !xColAccess.is() || !xColAccess->hasByName(sEMailColumn)) 1228 return 0; 1229 1230 String sFilterOptions; 1231 if(MM_DOCTYPE_TEXT == nDocType) 1232 { 1233 SwAsciiOptions aOpt; 1234 sal_uInt16 nAppScriptType = GetI18NScriptTypeOfLanguage( (sal_uInt16)GetAppLanguage() ); 1235 sal_uInt16 nWhich = GetWhichOfScript( RES_CHRATR_LANGUAGE, nAppScriptType); 1236 aOpt.SetLanguage( ((SvxLanguageItem&)pTargetView->GetWrtShell(). 1237 GetDefault( nWhich )).GetLanguage()); 1238 aOpt.SetParaFlags( LINEEND_CR ); 1239 aOpt.WriteUserData( sFilterOptions ); 1240 } 1241 String sTargetTempURL = URIHelper::SmartRel2Abs( 1242 INetURLObject(), utl::TempFile::CreateTempName(), 1243 URIHelper::GetMaybeFileHdl()); 1244 const SfxFilter *pTargetSfxFlt = SwIoSystem::GetFilterOfFormat( 1245 String::CreateFromAscii( FILTER_XML ), 1246 SwDocShell::Factory().GetFilterContainer() ); 1247 1248 uno::Sequence< beans::PropertyValue > aValues(1); 1249 beans::PropertyValue* pValues = aValues.getArray(); 1250 pValues[0].Name = C2U("FilterName"); 1251 pValues[0].Value <<= ::rtl::OUString(pTargetSfxFlt->GetFilterName()); 1252 1253 uno::Reference< frame::XStorable > xStore( pTargetView->GetDocShell()->GetModel(), uno::UNO_QUERY); 1254 xStore->storeToURL( sTargetTempURL, aValues ); 1255 1256 //create the send dialog 1257 SwSendMailDialog* pDlg = new SwSendMailDialog( pButton, rConfigItem ); 1258 pDlg->SetDocumentCount( nEnd ); 1259 pDlg->ShowDialog(); 1260 //help to force painting the dialog 1261 //TODO/CLEANUP 1262 //Sollbruchstelle 1263 for ( sal_Int16 i = 0; i < 25; i++) 1264 Application::Reschedule(); 1265 for(sal_uInt32 nDoc = nBegin; nDoc < nEnd; ++nDoc) 1266 { 1267 m_pWizard->EnterWait(); 1268 SwDocMergeInfo& rInfo = rConfigItem.GetDocumentMergeInfo(nDoc); 1269 1270 //now extract a document from the target document 1271 // the shell will be closed at the end, but it is more safe to use SfxObjectShellLock here 1272 SfxObjectShellLock xTempDocShell( new SwDocShell( SFX_CREATE_MODE_STANDARD ) ); 1273 xTempDocShell->DoInitNew( 0 ); 1274 SfxViewFrame* pTempFrame = SfxViewFrame::LoadHiddenDocument( *xTempDocShell, 0 ); 1275 // pTempFrame->GetFrame().Appear(); 1276 SwView* pTempView = static_cast<SwView*>( pTempFrame->GetViewShell() ); 1277 pTargetView->GetWrtShell().StartAction(); 1278 SwgReaderOption aOpt; 1279 aOpt.SetTxtFmts( sal_True ); 1280 aOpt.SetFrmFmts( sal_True ); 1281 aOpt.SetPageDescs( sal_True ); 1282 aOpt.SetNumRules( sal_True ); 1283 aOpt.SetMerge( sal_False ); 1284 pTempView->GetDocShell()->LoadStylesFromFile( 1285 sTargetTempURL, aOpt, sal_True ); 1286 pTargetView->GetWrtShell().PastePages(pTempView->GetWrtShell(), 1287 (sal_uInt16)rInfo.nStartPageInTarget, (sal_uInt16)rInfo.nEndPageInTarget ); 1288 pTargetView->GetWrtShell().EndAction(); 1289 1290 //then save it 1291 SfxStringItem aName(SID_FILE_NAME, 1292 URIHelper::SmartRel2Abs( 1293 INetURLObject(), utl::TempFile::CreateTempName(0), 1294 URIHelper::GetMaybeFileHdl()) ); 1295 1296 /* if(bIsPDF) 1297 { 1298 SfxDispatcher* pSfxDispatcher = pTempView->GetViewFrame()->GetDispatcher(); 1299 pSfxDispatcher->Execute( 1300 SID_DIRECTEXPORTDOCASPDF, 1301 SFX_CALLMODE_SYNCHRON, &aName, &aFilterName, 0L ); 1302 } 1303 else*/ 1304 { 1305 uno::Sequence< beans::PropertyValue > aFilterValues(MM_DOCTYPE_TEXT == nDocType ? 2 : 1); 1306 beans::PropertyValue* pFilterValues = aFilterValues.getArray(); 1307 pFilterValues[0].Name = C2U("FilterName"); 1308 pFilterValues[0].Value <<= ::rtl::OUString(pSfxFlt->GetFilterName()); 1309 if(MM_DOCTYPE_TEXT == nDocType) 1310 { 1311 pFilterValues[1].Name = C2U("FilterOptions"); 1312 pFilterValues[1].Value <<= ::rtl::OUString(sFilterOptions); 1313 } 1314 1315 uno::Reference< frame::XStorable > xTempStore( pTempView->GetDocShell()->GetModel(), uno::UNO_QUERY); 1316 xTempStore->storeToURL( aName.GetValue(), aFilterValues ); 1317 } 1318 xTempDocShell->DoClose(); 1319 1320 #ifdef DBG_UTIL 1321 sal_Int32 nTarget = 1322 #endif 1323 rConfigItem.MoveResultSet(rInfo.nDBRow); 1324 DBG_ASSERT( nTarget == rInfo.nDBRow, "row of current document could not be selected"); 1325 DBG_ASSERT( sEMailColumn.Len(), "No email column selected"); 1326 ::rtl::OUString sEMail = lcl_GetColumnValueOf(sEMailColumn, xColAccess); 1327 SwMailDescriptor aDesc; 1328 aDesc.sEMail = sEMail; 1329 rtl::OUString sBody; 1330 if(bAsBody) 1331 { 1332 { 1333 //read in the temporary file and use it as mail body 1334 SfxMedium aMedium( aName.GetValue(), STREAM_READ, sal_True); 1335 SvStream* pInStream = aMedium.GetInStream(); 1336 if(pInStream) 1337 pInStream->SetStreamCharSet( eEncoding ); 1338 else 1339 { 1340 DBG_ERROR("no output file created?"); 1341 continue; 1342 } 1343 ByteString sLine; 1344 sal_Bool bDone = pInStream->ReadLine( sLine ); 1345 while ( bDone ) 1346 { 1347 sBody += rtl::OUString(String(sLine, eEncoding)); 1348 sBody += rtl::OUString('\n'); 1349 bDone = pInStream->ReadLine( sLine ); 1350 } 1351 } 1352 //remove the temporary file 1353 SWUnoHelper::UCB_DeleteFile( aName.GetValue() ); 1354 } 1355 else 1356 { 1357 sBody = m_sBody; 1358 aDesc.sAttachmentURL = aName.GetValue(); 1359 String sAttachment(m_aAttachmentED.GetText()); 1360 xub_StrLen nTokenCount = sAttachment.GetTokenCount( '.' ); 1361 if( 2 > nTokenCount) 1362 { 1363 sAttachment += '.'; 1364 sAttachment.SetToken( nTokenCount, '.', sExtension); 1365 } 1366 else if(sAttachment.GetToken( nTokenCount - 1, '.') != sExtension) 1367 sAttachment += sExtension; 1368 aDesc.sAttachmentName = sAttachment; 1369 aDesc.sMimeType = sMimeType; 1370 1371 if(rConfigItem.IsGreetingLine(sal_True)) 1372 { 1373 ::rtl::OUString sNameColumn = rConfigItem.GetAssignedColumn(MM_PART_LASTNAME); 1374 ::rtl::OUString sName = lcl_GetColumnValueOf(sNameColumn, xColAccess); 1375 String sGreeting; 1376 if(sName.getLength() && rConfigItem.IsIndividualGreeting(sal_True)) 1377 { 1378 ::rtl::OUString sGenderColumn = rConfigItem.GetAssignedColumn(MM_PART_GENDER); 1379 const ::rtl::OUString& sFemaleValue = rConfigItem.GetFemaleGenderValue(); 1380 ::rtl::OUString sGenderValue = lcl_GetColumnValueOf(sGenderColumn, xColAccess); 1381 SwMailMergeConfigItem::Gender eGenderType = sGenderValue == sFemaleValue ? 1382 SwMailMergeConfigItem::FEMALE : 1383 SwMailMergeConfigItem::MALE; 1384 1385 sGreeting = SwAddressPreview::FillData( 1386 rConfigItem.GetGreetings(eGenderType) 1387 [rConfigItem.GetCurrentGreeting(eGenderType)], 1388 rConfigItem); 1389 } 1390 else 1391 { 1392 sGreeting = 1393 rConfigItem.GetGreetings(SwMailMergeConfigItem::NEUTRAL) 1394 [rConfigItem.GetCurrentGreeting(SwMailMergeConfigItem::NEUTRAL)]; 1395 1396 } 1397 sGreeting += '\n'; 1398 ::rtl::OUString sTemp( sGreeting ); 1399 sTemp += sBody; 1400 sBody = sTemp; 1401 } 1402 } 1403 aDesc.sBodyContent = sBody; 1404 if(MM_DOCTYPE_HTML == nDocType) 1405 { 1406 aDesc.sBodyMimeType = ::rtl::OUString::createFromAscii("text/html; charset="); 1407 aDesc.sBodyMimeType += ::rtl::OUString::createFromAscii( 1408 rtl_getBestMimeCharsetFromTextEncoding( eEncoding )); 1409 } 1410 else 1411 aDesc.sBodyMimeType = 1412 ::rtl::OUString::createFromAscii("text/plain; charset=UTF-8; format=flowed"); 1413 1414 aDesc.sSubject = m_aSubjectED.GetText(); 1415 aDesc.sCC = m_sCC; 1416 aDesc.sBCC = m_sBCC; 1417 pDlg->AddDocument( aDesc ); 1418 //help to force painting the dialog 1419 for ( sal_Int16 i = 0; i < 25; i++) 1420 Application::Reschedule(); 1421 //stop creating of data when dialog has been closed 1422 if(!pDlg->IsVisible()) 1423 { 1424 m_pWizard->LeaveWait(); 1425 break; 1426 } 1427 m_pWizard->LeaveWait(); 1428 } 1429 pDlg->EnableDesctruction(); 1430 ::osl::File::remove( sTargetTempURL ); 1431 1432 m_pWizard->enableButtons(WZB_FINISH, sal_True); 1433 //the dialog deletes itself 1434 //delete pDlg; 1435 return 0; 1436 } 1437