Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*************************************************************************
3 : : *
4 : : * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 : : *
6 : : * Copyright 2000, 2010 Oracle and/or its affiliates.
7 : : *
8 : : * OpenOffice.org - a multi-platform office productivity suite
9 : : *
10 : : * This file is part of OpenOffice.org.
11 : : *
12 : : * OpenOffice.org is free software: you can redistribute it and/or modify
13 : : * it under the terms of the GNU Lesser General Public License version 3
14 : : * only, as published by the Free Software Foundation.
15 : : *
16 : : * OpenOffice.org is distributed in the hope that it will be useful,
17 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : : * GNU Lesser General Public License version 3 for more details
20 : : * (a copy is included in the LICENSE file that accompanied this code).
21 : : *
22 : : * You should have received a copy of the GNU Lesser General Public License
23 : : * version 3 along with OpenOffice.org. If not, see
24 : : * <http://www.openoffice.org/license.html>
25 : : * for a copy of the LGPLv3 License.
26 : : *
27 : : ************************************************************************/
28 : :
29 : : #include <mailmergewizard.hxx>
30 : : #include <mmdocselectpage.hxx>
31 : : #include <mmoutputtypepage.hxx>
32 : : #include <mmaddressblockpage.hxx>
33 : : #include <mmpreparemergepage.hxx>
34 : : #include <mmmergepage.hxx>
35 : : #include <mmgreetingspage.hxx>
36 : : #include <mmoutputpage.hxx>
37 : : #include <mmlayoutpage.hxx>
38 : : #include <mmconfigitem.hxx>
39 : : #include <swabstdlg.hxx>
40 : : #include <dbui.hrc>
41 : : #include <view.hxx>
42 : : #include <dbmgr.hxx>
43 : : #include <sfx2/viewfrm.hxx>
44 : : #include <wrtsh.hxx>
45 : : #include "vcl/msgbox.hxx" // RET_CANCEL
46 : :
47 : : #include <helpid.h>
48 : : #include <mailmergewizard.hrc>
49 : :
50 : : using namespace svt;
51 : : using namespace ::com::sun::star;
52 : :
53 : 0 : SwMailMergeWizard::SwMailMergeWizard(SwView& rView, SwMailMergeConfigItem& rItem) :
54 : 0 : RoadmapWizard(&rView.GetViewFrame()->GetWindow(),
55 : : SW_RES(DLG_MAILMERGEWIZARD),
56 : : WZB_NEXT|WZB_PREVIOUS|WZB_FINISH|WZB_CANCEL|WZB_HELP),
57 : : m_pSwView(&rView),
58 : : m_bDocumentLoad( false ),
59 : : m_rConfigItem(rItem),
60 : : m_sStarting( SW_RES( ST_STARTING )),
61 : : m_sDocumentType( SW_RES( ST_DOCUMETNTYPE )),
62 : : m_sAddressBlock( SW_RES( ST_ADDRESSBLOCK )),
63 : : m_sAddressList( SW_RES( ST_ADDRESSLIST )),
64 : : m_sGreetingsLine( SW_RES( ST_GREETINGSLINE )),
65 : : m_sLayout( SW_RES( ST_LAYOUT )),
66 : : m_sPrepareMerge( SW_RES( ST_PREPAREMERGE )),
67 : : m_sMerge( SW_RES( ST_MERGE )),
68 : : m_sOutput( SW_RES( ST_OUTPUT )),
69 : : m_sFinish( SW_RES( ST_FINISH )),
70 : 0 : m_nRestartPage( MM_DOCUMENTSELECTPAGE )
71 : : {
72 : 0 : FreeResource();
73 : 0 : ShowButtonFixedLine(sal_True);
74 : 0 : defaultButton(WZB_NEXT);
75 : 0 : enableButtons(WZB_FINISH, sal_False);
76 : :
77 : 0 : m_pFinish->SetText(m_sFinish);
78 : 0 : m_pNextPage->SetHelpId(HID_MM_NEXT_PAGE);
79 : 0 : m_pPrevPage->SetHelpId(HID_MM_PREV_PAGE);
80 : :
81 : : //#i51949# no output type page visible if e-Mail is not supported
82 : 0 : if(rItem.IsMailAvailable())
83 : : declarePath(
84 : : 0,
85 : : MM_DOCUMENTSELECTPAGE,
86 : : MM_OUTPUTTYPETPAGE,
87 : : MM_ADDRESSBLOCKPAGE,
88 : : MM_GREETINGSPAGE,
89 : : MM_LAYOUTPAGE,
90 : : MM_PREPAREMERGEPAGE,
91 : : MM_MERGEPAGE,
92 : : MM_OUTPUTPAGE,
93 : : WZS_INVALID_STATE
94 : 0 : );
95 : : else
96 : : declarePath(
97 : : 0,
98 : : MM_DOCUMENTSELECTPAGE,
99 : : MM_ADDRESSBLOCKPAGE,
100 : : MM_GREETINGSPAGE,
101 : : MM_LAYOUTPAGE,
102 : : MM_PREPAREMERGEPAGE,
103 : : MM_MERGEPAGE,
104 : : MM_OUTPUTPAGE,
105 : : WZS_INVALID_STATE
106 : 0 : );
107 : :
108 : 0 : ActivatePage();
109 : 0 : UpdateRoadmap();
110 : 0 : }
111 : :
112 : 0 : SwMailMergeWizard::~SwMailMergeWizard()
113 : : {
114 : 0 : }
115 : :
116 : 0 : OWizardPage* SwMailMergeWizard::createPage(WizardState _nState)
117 : : {
118 : 0 : OWizardPage* pRet = 0;
119 : 0 : switch(_nState)
120 : : {
121 : 0 : case MM_DOCUMENTSELECTPAGE : pRet = new SwMailMergeDocSelectPage(this); break;
122 : 0 : case MM_OUTPUTTYPETPAGE : pRet = new SwMailMergeOutputTypePage(this); break;
123 : 0 : case MM_ADDRESSBLOCKPAGE : pRet = new SwMailMergeAddressBlockPage(this); break;
124 : 0 : case MM_GREETINGSPAGE : pRet = new SwMailMergeGreetingsPage(this); break;
125 : 0 : case MM_LAYOUTPAGE : pRet = new SwMailMergeLayoutPage(this); break;
126 : 0 : case MM_PREPAREMERGEPAGE : pRet = new SwMailMergePrepareMergePage(this); break;
127 : 0 : case MM_MERGEPAGE : pRet = new SwMailMergeMergePage(this); break;
128 : 0 : case MM_OUTPUTPAGE : pRet = new SwMailMergeOutputPage(this); break;
129 : : }
130 : : OSL_ENSURE(pRet, "no page created in ::createPage");
131 : 0 : return pRet;
132 : : }
133 : :
134 : 0 : void SwMailMergeWizard::enterState( WizardState _nState )
135 : : {
136 : 0 : ::svt::RoadmapWizard::enterState( _nState );
137 : : /*
138 : :
139 : : entering a page after the layoutpage requires the insertion
140 : : of greeting and address block - if not yet done
141 : : entering the merge or output page requires to create the output document
142 : : */
143 : 0 : if(_nState > MM_LAYOUTPAGE && m_rConfigItem.GetSourceView() &&
144 : 0 : ((m_rConfigItem.IsAddressBlock() && !m_rConfigItem.IsAddressInserted()) ||
145 : 0 : (m_rConfigItem.IsGreetingLine(sal_False) && !m_rConfigItem.IsGreetingInserted() )))
146 : : {
147 : : SwMailMergeLayoutPage::InsertAddressAndGreeting(m_rConfigItem.GetSourceView(),
148 : 0 : m_rConfigItem, Point(-1, -1), true);
149 : : }
150 : 0 : if(_nState >= MM_MERGEPAGE && !m_rConfigItem.GetTargetView())
151 : : {
152 : 0 : CreateTargetDocument();
153 : 0 : m_nRestartPage = _nState;
154 : 0 : EndDialog(RET_TARGET_CREATED);
155 : 0 : return;
156 : : }
157 : 0 : else if(_nState < MM_MERGEPAGE && m_rConfigItem.GetTargetView())
158 : : {
159 : : //close the dialog, remove the target view, show the source view
160 : 0 : m_nRestartPage = _nState;
161 : : //set ResultSet back to start
162 : 0 : m_rConfigItem.MoveResultSet(1);
163 : 0 : EndDialog(RET_REMOVE_TARGET);
164 : 0 : return;
165 : : }
166 : 0 : bool bEnablePrev = true;
167 : 0 : bool bEnableNext = true;
168 : 0 : switch(_nState)
169 : : {
170 : : case MM_DOCUMENTSELECTPAGE :
171 : 0 : bEnablePrev = false;
172 : 0 : break;
173 : : case MM_ADDRESSBLOCKPAGE :
174 : 0 : bEnableNext = m_rConfigItem.GetResultSet().is();
175 : 0 : break;
176 : : case MM_OUTPUTPAGE :
177 : 0 : bEnableNext = false;
178 : 0 : break;
179 : : }
180 : 0 : enableButtons( WZB_PREVIOUS, bEnablePrev);
181 : 0 : enableButtons( WZB_NEXT, bEnableNext);
182 : :
183 : 0 : UpdateRoadmap();
184 : : }
185 : :
186 : 0 : String SwMailMergeWizard::getStateDisplayName( WizardState _nState ) const
187 : : {
188 : 0 : String sRet;
189 : 0 : switch(_nState)
190 : : {
191 : 0 : case MM_DOCUMENTSELECTPAGE :sRet = m_sStarting; break;
192 : 0 : case MM_OUTPUTTYPETPAGE : sRet = m_sDocumentType; break;
193 : : case MM_ADDRESSBLOCKPAGE :
194 : 0 : sRet = m_rConfigItem.IsOutputToLetter() ?
195 : 0 : m_sAddressBlock : m_sAddressList;
196 : :
197 : 0 : break;
198 : 0 : case MM_GREETINGSPAGE : sRet = m_sGreetingsLine; break;
199 : 0 : case MM_LAYOUTPAGE : sRet = m_sLayout; break;
200 : 0 : case MM_PREPAREMERGEPAGE : sRet = m_sPrepareMerge; break;
201 : 0 : case MM_MERGEPAGE : sRet = m_sMerge; break;
202 : 0 : case MM_OUTPUTPAGE : sRet = m_sOutput; break;
203 : : }
204 : 0 : return sRet;
205 : : }
206 : : /*----------------------------------------------------------------------
207 : : enables/disables pages in the roadmap depending on the current
208 : : page and state
209 : : -----------------------------------------------------------------------*/
210 : 0 : void SwMailMergeWizard::UpdateRoadmap()
211 : : {
212 : : /*
213 : : MM_DOCUMENTSELECTPAGE > inactive after the layoutpage
214 : : MM_OUTPUTTYPETPAGE : > inactive after the layoutpage
215 : : MM_ADDRESSBLOCKPAGE > inactive after the layoutpage
216 : : MM_GREETINGSPAGE > inactive after the layoutpage
217 : : MM_LAYOUTPAGE > inactive after the layoutpage
218 : : inactive if address block and greeting are switched off
219 : : or are already inserted into the source document
220 : : MM_PREPAREMERGEPAGE > only active if address data has been selected
221 : : inactive after preparemerge page
222 : : MM_MERGEPAGE > only active if address data has been selected
223 : :
224 : : MM_OUTPUTPAGE > only active if address data has been selected
225 : : */
226 : :
227 : : // enableState( <page id>, false );
228 : 0 : const sal_uInt16 nCurPage = GetCurLevel();
229 : 0 : TabPage* pCurPage = GetPage( nCurPage );
230 : 0 : if(!pCurPage)
231 : 0 : return;
232 : 0 : bool bEnable = false;
233 : 0 : bool bAddressFieldsConfigured = !m_rConfigItem.IsOutputToLetter() ||
234 : 0 : !m_rConfigItem.IsAddressBlock() ||
235 : 0 : m_rConfigItem.IsAddressFieldsAssigned();
236 : 0 : bool bGreetingFieldsConfigured = !m_rConfigItem.IsGreetingLine(sal_False) ||
237 : 0 : !m_rConfigItem.IsIndividualGreeting(sal_False)||
238 : 0 : m_rConfigItem.IsGreetingFieldsAssigned();
239 : : //#i97436# if a document has to be loaded then enable output type page only
240 : 0 : m_bDocumentLoad = false;
241 : : bool bEnableOutputTypePage = (nCurPage != MM_DOCUMENTSELECTPAGE) ||
242 : 0 : static_cast<svt::OWizardPage*>(pCurPage)->commitPage( ::svt::WizardTypes::eValidate );
243 : :
244 : 0 : for(sal_uInt16 nPage = MM_DOCUMENTSELECTPAGE; nPage <= MM_OUTPUTPAGE; ++nPage)
245 : : {
246 : 0 : switch(nPage)
247 : : {
248 : : case MM_DOCUMENTSELECTPAGE :
249 : 0 : bEnable = sal_True;
250 : 0 : break;
251 : : case MM_OUTPUTTYPETPAGE :
252 : 0 : bEnable = bEnableOutputTypePage;
253 : 0 : break;
254 : : case MM_ADDRESSBLOCKPAGE :
255 : 0 : bEnable = !m_bDocumentLoad && bEnableOutputTypePage;
256 : 0 : break;
257 : : case MM_GREETINGSPAGE :
258 : 0 : bEnable = !m_bDocumentLoad && bEnableOutputTypePage &&
259 : 0 : m_rConfigItem.GetResultSet().is() &&
260 : 0 : bAddressFieldsConfigured;
261 : 0 : break;
262 : : case MM_PREPAREMERGEPAGE :
263 : : case MM_MERGEPAGE :
264 : : case MM_OUTPUTPAGE :
265 : : case MM_LAYOUTPAGE :
266 : 0 : bEnable = !m_bDocumentLoad && bEnableOutputTypePage &&
267 : 0 : m_rConfigItem.GetResultSet().is() &&
268 : : bAddressFieldsConfigured &&
269 : 0 : bGreetingFieldsConfigured;
270 : 0 : if(MM_LAYOUTPAGE == nPage)
271 : : bEnable &=
272 : 0 : ((m_rConfigItem.IsAddressBlock() && !m_rConfigItem.IsAddressInserted()) ||
273 : 0 : (m_rConfigItem.IsGreetingLine(sal_False) && !m_rConfigItem.IsGreetingInserted() ));
274 : 0 : break;
275 : : }
276 : 0 : enableState( nPage, bEnable );
277 : : }
278 : : }
279 : : /*-- --------------------------------------------------------------------
280 : : enables/disables pages in the roadmap depending on the current
281 : : page and state
282 : : -----------------------------------------------------------------------*/
283 : 0 : void SwMailMergeWizard::CreateTargetDocument()
284 : : {
285 : 0 : GetSwView()->GetWrtShell().GetNewDBMgr()->
286 : 0 : MergeDocuments( m_rConfigItem, *GetSwView() );
287 : 0 : m_rConfigItem.SetMergeDone();
288 : 0 : if( m_rConfigItem.GetTargetView() )
289 : 0 : m_rConfigItem.GetTargetView()->GetViewFrame()->GetFrame().Appear();
290 : 0 : }
291 : :
292 : 0 : void SwMailMergeWizard::updateRoadmapItemLabel( WizardState _nState )
293 : : {
294 : 0 : svt::RoadmapWizard::updateRoadmapItemLabel( _nState );
295 : 0 : }
296 : :
297 : 0 : short SwMailMergeWizard::Execute()
298 : : {
299 : : OSL_FAIL("SwMailMergeWizard cannot be executed via Dialog::Execute!\n"
300 : : "It creates a thread (MailDispatcher instance) that will call"
301 : : "back to VCL apartment => deadlock!\n"
302 : : "Use Dialog::StartExecuteModal to execute the dialog!" );
303 : 0 : return RET_CANCEL;
304 : : }
305 : :
306 : 0 : void SwMailMergeWizard::StartExecuteModal( const Link& rEndDialogHdl )
307 : : {
308 : 0 : ::svt::RoadmapWizard::StartExecuteModal( rEndDialogHdl );
309 : 0 : }
310 : :
311 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|