1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #include <mailmergewizard.hxx>
21 #include <mmdocselectpage.hxx>
22 #include <mmoutputtypepage.hxx>
23 #include <mmaddressblockpage.hxx>
24 #include <mmpreparemergepage.hxx>
25 #include <mmmergepage.hxx>
26 #include <mmgreetingspage.hxx>
27 #include <mmoutputpage.hxx>
28 #include <mmlayoutpage.hxx>
29 #include <mmconfigitem.hxx>
30 #include <swabstdlg.hxx>
34 #include <sfx2/viewfrm.hxx>
36 #include "vcl/msgbox.hxx" // RET_CANCEL
39 #include <mailmergewizard.hrc>
42 using namespace ::com::sun::star
;
44 SwMailMergeWizard::SwMailMergeWizard(SwView
& rView
, SwMailMergeConfigItem
& rItem
) :
45 RoadmapWizard(&rView
.GetViewFrame()->GetWindow(),
46 SW_RES(DLG_MAILMERGEWIZARD
),
47 WZB_NEXT
|WZB_PREVIOUS
|WZB_FINISH
|WZB_CANCEL
|WZB_HELP
),
49 m_bDocumentLoad( false ),
51 m_sStarting( SW_RES( ST_STARTING
)),
52 m_sDocumentType( SW_RES( ST_DOCUMETNTYPE
)),
53 m_sAddressBlock( SW_RES( ST_ADDRESSBLOCK
)),
54 m_sAddressList( SW_RES( ST_ADDRESSLIST
)),
55 m_sGreetingsLine( SW_RES( ST_GREETINGSLINE
)),
56 m_sLayout( SW_RES( ST_LAYOUT
)),
57 m_sPrepareMerge( SW_RES( ST_PREPAREMERGE
)),
58 m_sMerge( SW_RES( ST_MERGE
)),
59 m_sOutput( SW_RES( ST_OUTPUT
)),
60 m_sFinish( SW_RES( ST_FINISH
)),
61 m_nRestartPage( MM_DOCUMENTSELECTPAGE
)
64 ShowButtonFixedLine(sal_True
);
65 defaultButton(WZB_NEXT
);
66 enableButtons(WZB_FINISH
, sal_False
);
68 m_pFinish
->SetText(m_sFinish
);
69 m_pNextPage
->SetHelpId(HID_MM_NEXT_PAGE
);
70 m_pPrevPage
->SetHelpId(HID_MM_PREV_PAGE
);
72 //#i51949# no output type page visible if e-Mail is not supported
73 if(rItem
.IsMailAvailable())
76 MM_DOCUMENTSELECTPAGE
,
89 MM_DOCUMENTSELECTPAGE
,
103 SwMailMergeWizard::~SwMailMergeWizard()
107 OWizardPage
* SwMailMergeWizard::createPage(WizardState _nState
)
109 OWizardPage
* pRet
= 0;
112 case MM_DOCUMENTSELECTPAGE
: pRet
= new SwMailMergeDocSelectPage(this); break;
113 case MM_OUTPUTTYPETPAGE
: pRet
= new SwMailMergeOutputTypePage(this); break;
114 case MM_ADDRESSBLOCKPAGE
: pRet
= new SwMailMergeAddressBlockPage(this); break;
115 case MM_GREETINGSPAGE
: pRet
= new SwMailMergeGreetingsPage(this); break;
116 case MM_LAYOUTPAGE
: pRet
= new SwMailMergeLayoutPage(this); break;
117 case MM_PREPAREMERGEPAGE
: pRet
= new SwMailMergePrepareMergePage(this); break;
118 case MM_MERGEPAGE
: pRet
= new SwMailMergeMergePage(this); break;
119 case MM_OUTPUTPAGE
: pRet
= new SwMailMergeOutputPage(this); break;
121 OSL_ENSURE(pRet
, "no page created in ::createPage");
125 void SwMailMergeWizard::enterState( WizardState _nState
)
127 ::svt::RoadmapWizard::enterState( _nState
);
130 entering a page after the layoutpage requires the insertion
131 of greeting and address block - if not yet done
132 entering the merge or output page requires to create the output document
134 if(_nState
> MM_LAYOUTPAGE
&& m_rConfigItem
.GetSourceView() &&
135 ((m_rConfigItem
.IsAddressBlock() && !m_rConfigItem
.IsAddressInserted()) ||
136 (m_rConfigItem
.IsGreetingLine(sal_False
) && !m_rConfigItem
.IsGreetingInserted() )))
138 SwMailMergeLayoutPage::InsertAddressAndGreeting(m_rConfigItem
.GetSourceView(),
139 m_rConfigItem
, Point(-1, -1), true);
141 if(_nState
>= MM_MERGEPAGE
&& !m_rConfigItem
.GetTargetView())
143 CreateTargetDocument();
144 m_nRestartPage
= _nState
;
145 EndDialog(RET_TARGET_CREATED
);
148 else if(_nState
< MM_MERGEPAGE
&& m_rConfigItem
.GetTargetView())
150 //close the dialog, remove the target view, show the source view
151 m_nRestartPage
= _nState
;
152 //set ResultSet back to start
153 m_rConfigItem
.MoveResultSet(1);
154 EndDialog(RET_REMOVE_TARGET
);
157 bool bEnablePrev
= true;
158 bool bEnableNext
= true;
161 case MM_DOCUMENTSELECTPAGE
:
164 case MM_ADDRESSBLOCKPAGE
:
165 bEnableNext
= m_rConfigItem
.GetResultSet().is();
171 enableButtons( WZB_PREVIOUS
, bEnablePrev
);
172 enableButtons( WZB_NEXT
, bEnableNext
);
177 String
SwMailMergeWizard::getStateDisplayName( WizardState _nState
) const
182 case MM_DOCUMENTSELECTPAGE
:sRet
= m_sStarting
; break;
183 case MM_OUTPUTTYPETPAGE
: sRet
= m_sDocumentType
; break;
184 case MM_ADDRESSBLOCKPAGE
:
185 sRet
= m_rConfigItem
.IsOutputToLetter() ?
186 m_sAddressBlock
: m_sAddressList
;
189 case MM_GREETINGSPAGE
: sRet
= m_sGreetingsLine
; break;
190 case MM_LAYOUTPAGE
: sRet
= m_sLayout
; break;
191 case MM_PREPAREMERGEPAGE
: sRet
= m_sPrepareMerge
; break;
192 case MM_MERGEPAGE
: sRet
= m_sMerge
; break;
193 case MM_OUTPUTPAGE
: sRet
= m_sOutput
; break;
197 /*----------------------------------------------------------------------
198 enables/disables pages in the roadmap depending on the current
200 -----------------------------------------------------------------------*/
201 void SwMailMergeWizard::UpdateRoadmap()
204 MM_DOCUMENTSELECTPAGE > inactive after the layoutpage
205 MM_OUTPUTTYPETPAGE : > inactive after the layoutpage
206 MM_ADDRESSBLOCKPAGE > inactive after the layoutpage
207 MM_GREETINGSPAGE > inactive after the layoutpage
208 MM_LAYOUTPAGE > inactive after the layoutpage
209 inactive if address block and greeting are switched off
210 or are already inserted into the source document
211 MM_PREPAREMERGEPAGE > only active if address data has been selected
212 inactive after preparemerge page
213 MM_MERGEPAGE > only active if address data has been selected
215 MM_OUTPUTPAGE > only active if address data has been selected
218 // enableState( <page id>, false );
219 const sal_uInt16 nCurPage
= GetCurLevel();
220 TabPage
* pCurPage
= GetPage( nCurPage
);
223 bool bEnable
= false;
224 bool bAddressFieldsConfigured
= !m_rConfigItem
.IsOutputToLetter() ||
225 !m_rConfigItem
.IsAddressBlock() ||
226 m_rConfigItem
.IsAddressFieldsAssigned();
227 bool bGreetingFieldsConfigured
= !m_rConfigItem
.IsGreetingLine(sal_False
) ||
228 !m_rConfigItem
.IsIndividualGreeting(sal_False
)||
229 m_rConfigItem
.IsGreetingFieldsAssigned();
230 //#i97436# if a document has to be loaded then enable output type page only
231 m_bDocumentLoad
= false;
232 bool bEnableOutputTypePage
= (nCurPage
!= MM_DOCUMENTSELECTPAGE
) ||
233 static_cast<svt::OWizardPage
*>(pCurPage
)->commitPage( ::svt::WizardTypes::eValidate
);
235 for(sal_uInt16 nPage
= MM_DOCUMENTSELECTPAGE
; nPage
<= MM_OUTPUTPAGE
; ++nPage
)
239 case MM_DOCUMENTSELECTPAGE
:
242 case MM_OUTPUTTYPETPAGE
:
243 bEnable
= bEnableOutputTypePage
;
245 case MM_ADDRESSBLOCKPAGE
:
246 bEnable
= !m_bDocumentLoad
&& bEnableOutputTypePage
;
248 case MM_GREETINGSPAGE
:
249 bEnable
= !m_bDocumentLoad
&& bEnableOutputTypePage
&&
250 m_rConfigItem
.GetResultSet().is() &&
251 bAddressFieldsConfigured
;
253 case MM_PREPAREMERGEPAGE
:
257 bEnable
= !m_bDocumentLoad
&& bEnableOutputTypePage
&&
258 m_rConfigItem
.GetResultSet().is() &&
259 bAddressFieldsConfigured
&&
260 bGreetingFieldsConfigured
;
261 if(MM_LAYOUTPAGE
== nPage
)
263 ((m_rConfigItem
.IsAddressBlock() && !m_rConfigItem
.IsAddressInserted()) ||
264 (m_rConfigItem
.IsGreetingLine(sal_False
) && !m_rConfigItem
.IsGreetingInserted() ));
267 enableState( nPage
, bEnable
);
270 /*-- --------------------------------------------------------------------
271 enables/disables pages in the roadmap depending on the current
273 -----------------------------------------------------------------------*/
274 void SwMailMergeWizard::CreateTargetDocument()
276 GetSwView()->GetWrtShell().GetNewDBMgr()->
277 MergeDocuments( m_rConfigItem
, *GetSwView() );
278 m_rConfigItem
.SetMergeDone();
279 if( m_rConfigItem
.GetTargetView() )
280 m_rConfigItem
.GetTargetView()->GetViewFrame()->GetFrame().Appear();
283 void SwMailMergeWizard::updateRoadmapItemLabel( WizardState _nState
)
285 svt::RoadmapWizard::updateRoadmapItemLabel( _nState
);
288 short SwMailMergeWizard::Execute()
290 OSL_FAIL("SwMailMergeWizard cannot be executed via Dialog::Execute!\n"
291 "It creates a thread (MailDispatcher instance) that will call"
292 "back to VCL apartment => deadlock!\n"
293 "Use Dialog::StartExecuteModal to execute the dialog!" );
297 void SwMailMergeWizard::StartExecuteModal( const Link
& rEndDialogHdl
)
299 ::svt::RoadmapWizard::StartExecuteModal( rEndDialogHdl
);
302 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */