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 30 31 #include <mailmergewizard.hxx> 32 #include <mmdocselectpage.hxx> 33 #include <mmoutputtypepage.hxx> 34 #include <mmaddressblockpage.hxx> 35 #include <mmpreparemergepage.hxx> 36 #include <mmmergepage.hxx> 37 #include <mmgreetingspage.hxx> 38 #include <mmoutputpage.hxx> 39 #include <mmlayoutpage.hxx> 40 #include <mmconfigitem.hxx> 41 #include <swabstdlg.hxx> 42 #ifndef _DBUI_HRC 43 #include <dbui.hrc> 44 #endif 45 #include <view.hxx> 46 #ifndef _DBMGR_HXX 47 #include <dbmgr.hxx> 48 #endif 49 #include <sfx2/viewfrm.hxx> 50 #include <wrtsh.hxx> 51 #include <sfx2/viewfrm.hxx> 52 #include "vcl/msgbox.hxx" // RET_CANCEL 53 54 #include <helpid.h> 55 #include <dbui.hrc> 56 #include <mailmergewizard.hrc> 57 58 using namespace svt; 59 using namespace ::com::sun::star; 60 /*-- 01.04.2004 16:52:49--------------------------------------------------- 61 62 -----------------------------------------------------------------------*/ 63 SwMailMergeWizard::SwMailMergeWizard(SwView& rView, SwMailMergeConfigItem& rItem) : 64 RoadmapWizard(&rView.GetViewFrame()->GetWindow(), 65 SW_RES(DLG_MAILMERGEWIZARD), 66 WZB_NEXT|WZB_PREVIOUS|WZB_FINISH|WZB_CANCEL|WZB_HELP), 67 m_pSwView(&rView), 68 m_bDocumentLoad( false ), 69 m_rConfigItem(rItem), 70 m_sStarting( SW_RES( ST_STARTING )), 71 m_sDocumentType( SW_RES( ST_DOCUMETNTYPE )), 72 m_sAddressBlock( SW_RES( ST_ADDRESSBLOCK )), 73 m_sAddressList( SW_RES( ST_ADDRESSLIST )), 74 m_sGreetingsLine( SW_RES( ST_GREETINGSLINE )), 75 m_sLayout( SW_RES( ST_LAYOUT )), 76 m_sPrepareMerge( SW_RES( ST_PREPAREMERGE )), 77 m_sMerge( SW_RES( ST_MERGE )), 78 m_sOutput( SW_RES( ST_OUTPUT )), 79 m_sFinish( SW_RES( ST_FINISH )), 80 m_nRestartPage( MM_DOCUMENTSELECTPAGE ) 81 { 82 FreeResource(); 83 ShowButtonFixedLine(sal_True); 84 defaultButton(WZB_NEXT); 85 enableButtons(WZB_FINISH, sal_False); 86 87 m_pFinish->SetText(m_sFinish); 88 m_pNextPage->SetHelpId(HID_MM_NEXT_PAGE); 89 m_pPrevPage->SetHelpId(HID_MM_PREV_PAGE); 90 91 //#i51949# no output type page visible if e-Mail is not supported 92 if(rItem.IsMailAvailable()) 93 declarePath( 94 0, 95 MM_DOCUMENTSELECTPAGE, 96 MM_OUTPUTTYPETPAGE, 97 MM_ADDRESSBLOCKPAGE, 98 MM_GREETINGSPAGE, 99 MM_LAYOUTPAGE, 100 MM_PREPAREMERGEPAGE, 101 MM_MERGEPAGE, 102 MM_OUTPUTPAGE, 103 WZS_INVALID_STATE 104 ); 105 else 106 declarePath( 107 0, 108 MM_DOCUMENTSELECTPAGE, 109 MM_ADDRESSBLOCKPAGE, 110 MM_GREETINGSPAGE, 111 MM_LAYOUTPAGE, 112 MM_PREPAREMERGEPAGE, 113 MM_MERGEPAGE, 114 MM_OUTPUTPAGE, 115 WZS_INVALID_STATE 116 ); 117 118 ActivatePage(); 119 UpdateRoadmap(); 120 } 121 /*-- 01.04.2004 16:52:53--------------------------------------------------- 122 123 -----------------------------------------------------------------------*/ 124 SwMailMergeWizard::~SwMailMergeWizard() 125 { 126 } 127 /*-- 01.04.2004 16:52:53--------------------------------------------------- 128 129 -----------------------------------------------------------------------*/ 130 OWizardPage* SwMailMergeWizard::createPage(WizardState _nState) 131 { 132 OWizardPage* pRet = 0; 133 switch(_nState) 134 { 135 case MM_DOCUMENTSELECTPAGE : pRet = new SwMailMergeDocSelectPage(this); break; 136 case MM_OUTPUTTYPETPAGE : pRet = new SwMailMergeOutputTypePage(this); break; 137 case MM_ADDRESSBLOCKPAGE : pRet = new SwMailMergeAddressBlockPage(this); break; 138 case MM_GREETINGSPAGE : pRet = new SwMailMergeGreetingsPage(this); break; 139 case MM_LAYOUTPAGE : pRet = new SwMailMergeLayoutPage(this); break; 140 case MM_PREPAREMERGEPAGE : pRet = new SwMailMergePrepareMergePage(this); break; 141 case MM_MERGEPAGE : pRet = new SwMailMergeMergePage(this); break; 142 case MM_OUTPUTPAGE : pRet = new SwMailMergeOutputPage(this); break; 143 } 144 DBG_ASSERT(pRet, "no page created in ::createPage"); 145 return pRet; 146 } 147 /*-- 04.06.2004 13:18:47--------------------------------------------------- 148 149 -----------------------------------------------------------------------*/ 150 void SwMailMergeWizard::enterState( WizardState _nState ) 151 { 152 ::svt::RoadmapWizard::enterState( _nState ); 153 /* 154 entering a page after the layoutpage requires the insertion 155 of greeting and address block - if not yet done 156 entering the merge or output page requires to create the output document 157 */ 158 if(_nState > MM_LAYOUTPAGE && m_rConfigItem.GetSourceView() && 159 ((m_rConfigItem.IsAddressBlock() && !m_rConfigItem.IsAddressInserted()) || 160 (m_rConfigItem.IsGreetingLine(sal_False) && !m_rConfigItem.IsGreetingInserted() ))) 161 { 162 SwMailMergeLayoutPage::InsertAddressAndGreeting(m_rConfigItem.GetSourceView(), 163 m_rConfigItem, Point(-1, -1), true); 164 } 165 if(_nState >= MM_MERGEPAGE && !m_rConfigItem.GetTargetView()) 166 { 167 CreateTargetDocument(); 168 m_nRestartPage = _nState; 169 EndDialog(RET_TARGET_CREATED); 170 return; 171 } 172 else if(_nState < MM_MERGEPAGE && m_rConfigItem.GetTargetView()) 173 { 174 //close the dialog, remove the target view, show the source view 175 m_nRestartPage = _nState; 176 //set ResultSet back to start 177 m_rConfigItem.MoveResultSet(1); 178 EndDialog(RET_REMOVE_TARGET); 179 return; 180 } 181 bool bEnablePrev = true; 182 bool bEnableNext = true; 183 switch(_nState) 184 { 185 case MM_DOCUMENTSELECTPAGE : 186 bEnablePrev = false; 187 break; 188 case MM_ADDRESSBLOCKPAGE : 189 bEnableNext = m_rConfigItem.GetResultSet().is(); 190 break; 191 case MM_OUTPUTPAGE : 192 bEnableNext = false; 193 break; 194 } 195 enableButtons( WZB_PREVIOUS, bEnablePrev); 196 enableButtons( WZB_NEXT, bEnableNext); 197 198 UpdateRoadmap(); 199 } 200 /*-- 04.06.2004 12:54:13--------------------------------------------------- 201 202 -----------------------------------------------------------------------*/ 203 String SwMailMergeWizard::getStateDisplayName( WizardState _nState ) const 204 { 205 String sRet; 206 switch(_nState) 207 { 208 case MM_DOCUMENTSELECTPAGE :sRet = m_sStarting; break; 209 case MM_OUTPUTTYPETPAGE : sRet = m_sDocumentType; break; 210 case MM_ADDRESSBLOCKPAGE : 211 sRet = m_rConfigItem.IsOutputToLetter() ? 212 m_sAddressBlock : m_sAddressList; 213 214 break; 215 case MM_GREETINGSPAGE : sRet = m_sGreetingsLine; break; 216 case MM_LAYOUTPAGE : sRet = m_sLayout; break; 217 case MM_PREPAREMERGEPAGE : sRet = m_sPrepareMerge; break; 218 case MM_MERGEPAGE : sRet = m_sMerge; break; 219 case MM_OUTPUTPAGE : sRet = m_sOutput; break; 220 } 221 return sRet; 222 } 223 /*-- 24.06.2004 09:24:45--------------------------------------------------- 224 enables/disables pages in the roadmap depending on the current 225 page and state 226 -----------------------------------------------------------------------*/ 227 void SwMailMergeWizard::UpdateRoadmap() 228 { 229 /* 230 MM_DOCUMENTSELECTPAGE > inactive after the layoutpage 231 MM_OUTPUTTYPETPAGE : > inactive after the layoutpage 232 MM_ADDRESSBLOCKPAGE > inactive after the layoutpage 233 MM_GREETINGSPAGE > inactive after the layoutpage 234 MM_LAYOUTPAGE > inactive after the layoutpage 235 inactive if address block and greeting are switched off 236 or are already inserted into the source document 237 MM_PREPAREMERGEPAGE > only active if address data has been selected 238 inactive after preparemerge page 239 MM_MERGEPAGE > only active if address data has been selected 240 241 MM_OUTPUTPAGE > only active if address data has been selected 242 */ 243 244 // enableState( <page id>, false ); 245 const sal_uInt16 nCurPage = GetCurLevel(); 246 TabPage* pCurPage = GetPage( nCurPage ); 247 if(!pCurPage) 248 return; 249 bool bEnable = false; 250 bool bAddressFieldsConfigured = !m_rConfigItem.IsOutputToLetter() || 251 !m_rConfigItem.IsAddressBlock() || 252 m_rConfigItem.IsAddressFieldsAssigned(); 253 bool bGreetingFieldsConfigured = !m_rConfigItem.IsGreetingLine(sal_False) || 254 !m_rConfigItem.IsIndividualGreeting(sal_False)|| 255 m_rConfigItem.IsGreetingFieldsAssigned(); 256 //#i97436# if a document has to be loaded then enable output type page only 257 m_bDocumentLoad = false; 258 bool bEnableOutputTypePage = (nCurPage != MM_DOCUMENTSELECTPAGE) || 259 static_cast<svt::OWizardPage*>(pCurPage)->commitPage( ::svt::WizardTypes::eValidate ); 260 261 for(sal_uInt16 nPage = MM_DOCUMENTSELECTPAGE; nPage <= MM_OUTPUTPAGE; ++nPage) 262 { 263 switch(nPage) 264 { 265 case MM_DOCUMENTSELECTPAGE : 266 bEnable = sal_True; 267 break; 268 case MM_OUTPUTTYPETPAGE : 269 bEnable = bEnableOutputTypePage; 270 break; 271 case MM_ADDRESSBLOCKPAGE : 272 bEnable = !m_bDocumentLoad && bEnableOutputTypePage; 273 break; 274 case MM_GREETINGSPAGE : 275 bEnable = !m_bDocumentLoad && bEnableOutputTypePage && 276 m_rConfigItem.GetResultSet().is() && 277 bAddressFieldsConfigured; 278 break; 279 case MM_PREPAREMERGEPAGE : 280 case MM_MERGEPAGE : 281 case MM_OUTPUTPAGE : 282 case MM_LAYOUTPAGE : 283 bEnable = !m_bDocumentLoad && bEnableOutputTypePage && 284 m_rConfigItem.GetResultSet().is() && 285 bAddressFieldsConfigured && 286 bGreetingFieldsConfigured; 287 if(MM_LAYOUTPAGE == nPage) 288 bEnable &= 289 ((m_rConfigItem.IsAddressBlock() && !m_rConfigItem.IsAddressInserted()) || 290 (m_rConfigItem.IsGreetingLine(sal_False) && !m_rConfigItem.IsGreetingInserted() )); 291 break; 292 } 293 enableState( nPage, bEnable ); 294 } 295 } 296 /*-- 24.06.2004 09:24:45--------------------------------------------------- 297 enables/disables pages in the roadmap depending on the current 298 page and state 299 -----------------------------------------------------------------------*/ 300 void SwMailMergeWizard::CreateTargetDocument() 301 { 302 GetSwView()->GetWrtShell().GetNewDBMgr()-> 303 MergeDocuments( m_rConfigItem, *GetSwView() ); 304 m_rConfigItem.SetMergeDone(); 305 if( m_rConfigItem.GetTargetView() ) 306 m_rConfigItem.GetTargetView()->GetViewFrame()->GetFrame().Appear(); 307 } 308 /*-- 23.08.2004 08:51:36--------------------------------------------------- 309 310 -----------------------------------------------------------------------*/ 311 void SwMailMergeWizard::updateRoadmapItemLabel( WizardState _nState ) 312 { 313 svt::RoadmapWizard::updateRoadmapItemLabel( _nState ); 314 } 315 316 // ------------------------------------------------------------------------ 317 318 short SwMailMergeWizard::Execute() 319 { 320 DBG_ERROR( "SwMailMergeWizard cannot be executed via Dialog::Execute!\n" 321 "It creates a thread (MailDispatcher instance) that will call" 322 "back to VCL apartment => deadlock!\n" 323 "Use Dialog::StartExecuteModal to execute the dialog!" ); 324 return RET_CANCEL; 325 } 326 327 // ------------------------------------------------------------------------ 328 329 void SwMailMergeWizard::StartExecuteModal( const Link& rEndDialogHdl ) 330 { 331 ::svt::RoadmapWizard::StartExecuteModal( rEndDialogHdl ); 332 } 333