xref: /AOO41X/main/extensions/source/abpilot/abspilot.cxx (revision 2a97ec55f1442d65917e8c8b82a55ab76c9ff676)
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_extensions.hxx"
26 #include "abspilot.hxx"
27 #include "abpilot.hrc"
28 #include "abpresid.hrc"
29 #include "componentmodule.hxx"
30 #include <tools/debug.hxx>
31 #include <svtools/localresaccess.hxx>
32 #include "typeselectionpage.hxx"
33 #include "admininvokationpage.hxx"
34 #include "tableselectionpage.hxx"
35 #include <vcl/waitobj.hxx>
36 #include <vcl/msgbox.hxx>
37 #include "abpfinalpage.hxx"
38 #include "fieldmappingpage.hxx"
39 #include "fieldmappingimpl.hxx"
40 
41 //.........................................................................
42 namespace abp
43 {
44 //.........................................................................
45 
46 #define STATE_SELECT_ABTYPE         0
47 #define STATE_INVOKE_ADMIN_DIALOG   1
48 #define STATE_TABLE_SELECTION       2
49 #define STATE_MANUAL_FIELD_MAPPING  3
50 #define STATE_FINAL_CONFIRM         4
51 
52 #define PATH_COMPLETE               1
53 #define PATH_NO_SETTINGS            2
54 #define PATH_NO_FIELDS              3
55 #define PATH_NO_SETTINGS_NO_FIELDS  4
56 
57     using namespace ::svt;
58     using namespace ::com::sun::star::uno;
59     using namespace ::com::sun::star::lang;
60 
61     //=====================================================================
62     //= OAddessBookSourcePilot
63     //=====================================================================
64     //---------------------------------------------------------------------
OAddessBookSourcePilot(Window * _pParent,const Reference<XMultiServiceFactory> & _rxORB)65     OAddessBookSourcePilot::OAddessBookSourcePilot(Window* _pParent, const Reference< XMultiServiceFactory >& _rxORB)
66         :OAddessBookSourcePilot_Base( _pParent, ModuleRes( RID_DLG_ADDRESSBOOKSOURCEPILOT ),
67             WZB_HELP | WZB_FINISH | WZB_CANCEL | WZB_NEXT | WZB_PREVIOUS )
68         ,m_xORB(_rxORB)
69         ,m_aNewDataSource(_rxORB)
70         ,m_eNewDataSourceType( AST_INVALID )
71     {
72         SetPageSizePixel(LogicToPixel(Size(WINDOW_SIZE_X, WINDOW_SIZE_Y), MAP_APPFONT));
73 
74         ShowButtonFixedLine(sal_True);
75 
76         declarePath( PATH_COMPLETE,
77             STATE_SELECT_ABTYPE,
78             STATE_INVOKE_ADMIN_DIALOG,
79             STATE_TABLE_SELECTION,
80             STATE_MANUAL_FIELD_MAPPING,
81             STATE_FINAL_CONFIRM,
82             WZS_INVALID_STATE
83         );
84         declarePath( PATH_NO_SETTINGS,
85             STATE_SELECT_ABTYPE,
86             STATE_TABLE_SELECTION,
87             STATE_MANUAL_FIELD_MAPPING,
88             STATE_FINAL_CONFIRM,
89             WZS_INVALID_STATE
90         );
91         declarePath( PATH_NO_FIELDS,
92             STATE_SELECT_ABTYPE,
93             STATE_INVOKE_ADMIN_DIALOG,
94             STATE_TABLE_SELECTION,
95             STATE_FINAL_CONFIRM,
96             WZS_INVALID_STATE
97         );
98         declarePath( PATH_NO_SETTINGS_NO_FIELDS,
99             STATE_SELECT_ABTYPE,
100             STATE_TABLE_SELECTION,
101             STATE_FINAL_CONFIRM,
102             WZS_INVALID_STATE
103         );
104 
105         m_pPrevPage->SetHelpId(HID_ABSPILOT_PREVIOUS);
106         m_pNextPage->SetHelpId(HID_ABSPILOT_NEXT);
107         m_pCancel->SetHelpId(HID_ABSPILOT_CANCEL);
108         m_pFinish->SetHelpId(HID_ABSPILOT_FINISH);
109         m_pHelp->SetUniqueId(UID_ABSPILOT_HELP);
110 
111         m_pCancel->SetClickHdl( LINK( this, OAddessBookSourcePilot, OnCancelClicked) );
112 
113         // some initial settings
114 #ifdef MACOSX
115         m_aSettings.eType = AST_MACAB;
116 #elif WITH_MOZILLA
117 #ifdef UNX
118         m_aSettings.eType = AST_MORK;
119 #else
120         m_aSettings.eType = AST_OE;
121 #endif
122 #else
123         m_aSettings.eType = AST_OTHER;
124 #endif
125         m_aSettings.sDataSourceName = String(ModuleRes(RID_STR_DEFAULT_NAME));
126         m_aSettings.bRegisterDataSource = false;
127         m_aSettings.bIgnoreNoTable = false;
128 
129         defaultButton(WZB_NEXT);
130         enableButtons(WZB_FINISH, sal_False);
131         ActivatePage();
132 
133         typeSelectionChanged( m_aSettings.eType );
134     }
135 
136     //---------------------------------------------------------------------
getStateDisplayName(WizardState _nState) const137     String OAddessBookSourcePilot::getStateDisplayName( WizardState _nState ) const
138     {
139         sal_uInt16 nResId = 0;
140         switch ( _nState )
141         {
142             case STATE_SELECT_ABTYPE:        nResId = STR_SELECT_ABTYPE; break;
143             case STATE_INVOKE_ADMIN_DIALOG:  nResId = STR_INVOKE_ADMIN_DIALOG; break;
144             case STATE_TABLE_SELECTION:      nResId = STR_TABLE_SELECTION; break;
145             case STATE_MANUAL_FIELD_MAPPING: nResId = STR_MANUAL_FIELD_MAPPING; break;
146             case STATE_FINAL_CONFIRM:        nResId = STR_FINAL_CONFIRM; break;
147         }
148         DBG_ASSERT( nResId, "OAddessBookSourcePilot::getStateDisplayName: don't know this state!" );
149 
150         String sDisplayName;
151         if ( nResId )
152         {
153             svt::OLocalResourceAccess aAccess( ModuleRes( RID_DLG_ADDRESSBOOKSOURCEPILOT ), RSC_MODALDIALOG );
154             sDisplayName = String( ModuleRes( nResId ) );
155         }
156 
157         return sDisplayName;
158     }
159 
160     //---------------------------------------------------------------------
implCommitAll()161     void OAddessBookSourcePilot::implCommitAll()
162     {
163         // in real, the data source already exists in the data source context
164         // Thus, if the user changed the name, we have to rename the data source
165         if ( m_aSettings.sDataSourceName != m_aNewDataSource.getName() )
166             m_aNewDataSource.rename( m_aSettings.sDataSourceName );
167 
168         // 1. the data source
169         m_aNewDataSource.store();
170 
171         // 2. check if we need to register the data source
172         if ( m_aSettings.bRegisterDataSource )
173             m_aNewDataSource.registerDataSource(m_aSettings.sRegisteredDataSourceName);
174 
175         // 3. write the data source / table names into the configuration
176         addressconfig::writeTemplateAddressSource( getORB(), m_aSettings.bRegisterDataSource ? m_aSettings.sRegisteredDataSourceName : m_aSettings.sDataSourceName, m_aSettings.sSelectedTable );
177 
178         // 4. write the field mapping
179         fieldmapping::writeTemplateAddressFieldMapping( getORB(), m_aSettings.aFieldMapping );
180     }
181 
182     //---------------------------------------------------------------------
implCleanup()183     void OAddessBookSourcePilot::implCleanup()
184     {
185         if ( m_aNewDataSource.isValid() )
186             m_aNewDataSource.remove();
187     }
188 
189     //---------------------------------------------------------------------
190     IMPL_LINK( OAddessBookSourcePilot, OnCancelClicked, void*, /*NOTINTERESTEDIN*/ )
191     {
192         // do cleanups
193         implCleanup();
194 
195         // reset the click hdl
196         m_pCancel->SetClickHdl( Link() );
197         // simulate the click again - this time, the default handling of the button will strike ....
198         m_pCancel->Click();
199 
200         return 0L;
201     }
202 
203     //---------------------------------------------------------------------
Close()204     sal_Bool OAddessBookSourcePilot::Close()
205     {
206         implCleanup();
207 
208         return OAddessBookSourcePilot_Base::Close();
209     }
210 
211     //---------------------------------------------------------------------
onFinish()212     sal_Bool OAddessBookSourcePilot::onFinish()
213     {
214         if ( !OAddessBookSourcePilot_Base::onFinish() )
215             return sal_False;
216 
217         implCommitAll();
218 
219         addressconfig::markPilotSuccess( getORB() );
220 
221         return sal_True;
222     }
223 
224     //---------------------------------------------------------------------
enterState(WizardState _nState)225     void OAddessBookSourcePilot::enterState( WizardState _nState )
226     {
227         switch ( _nState )
228         {
229             case STATE_SELECT_ABTYPE:
230                 impl_updateRoadmap( static_cast< TypeSelectionPage* >( GetPage( STATE_SELECT_ABTYPE ) )->getSelectedType() );
231                 break;
232 
233             case STATE_FINAL_CONFIRM:
234                 if ( !needManualFieldMapping( ) )
235                     implDoAutoFieldMapping();
236                 break;
237 
238             case STATE_TABLE_SELECTION:
239                 implDefaultTableName();
240                 break;
241         }
242 
243         OAddessBookSourcePilot_Base::enterState(_nState);
244     }
245 
246     //---------------------------------------------------------------------
prepareLeaveCurrentState(CommitPageReason _eReason)247     sal_Bool OAddessBookSourcePilot::prepareLeaveCurrentState( CommitPageReason _eReason )
248     {
249         if ( !OAddessBookSourcePilot_Base::prepareLeaveCurrentState( _eReason ) )
250             return sal_False;
251 
252         if ( _eReason == eTravelBackward )
253             return sal_True;
254 
255         sal_Bool bAllow = sal_True;
256 
257         switch ( getCurrentState() )
258         {
259         case STATE_SELECT_ABTYPE:
260             implCreateDataSource();
261             if ( needAdminInvokationPage() )
262                 break;
263             // no break here
264 
265         case STATE_INVOKE_ADMIN_DIALOG:
266             if ( !connectToDataSource( sal_False ) )
267             {
268                 // connecting did not succeed -> do not allow proceeding
269                 bAllow = sal_False;
270                 break;
271             }
272 
273             // ........................................................
274             // now that we connected to the data source, check whether we need the "table selection" page
275             const StringBag& aTables = m_aNewDataSource.getTableNames();
276 
277             if ( aTables.empty() )
278             {
279                 if ( RET_YES != QueryBox( this, ModuleRes( RID_QRY_NOTABLES ) ).Execute() )
280                 {
281                     // cannot ask the user, or the user chose to use this data source, though there are no tables
282                     bAllow = sal_False;
283                     break;
284                 }
285 
286                 m_aSettings.bIgnoreNoTable = true;
287             }
288 
289             if ( aTables.size() == 1 )
290                 // remember the one and only table we have
291                 m_aSettings.sSelectedTable = *aTables.begin();
292 
293             break;
294         }
295 
296         impl_updateRoadmap( m_aSettings.eType );
297         return bAllow;
298     }
299 
300     //---------------------------------------------------------------------
implDefaultTableName()301     void OAddessBookSourcePilot::implDefaultTableName()
302     {
303         const StringBag& rTableNames = getDataSource().getTableNames();
304         if ( rTableNames.end() != rTableNames.find( getSettings().sSelectedTable ) )
305             // already a valid table selected
306             return;
307 
308         const sal_Char* pGuess = NULL;
309         switch ( getSettings().eType )
310         {
311             case AST_MORK               :
312             case AST_THUNDERBIRD        : pGuess = "Personal Address book"; break;
313             case AST_LDAP               : pGuess = "LDAP Directory"; break;
314             case AST_EVOLUTION          :
315             case AST_EVOLUTION_GROUPWISE:
316             case AST_EVOLUTION_LDAP     : pGuess = "Personal"; break;
317             default:
318                 DBG_ERROR( "OAddessBookSourcePilot::implDefaultTableName: unhandled case!" );
319                 return;
320         }
321         const ::rtl::OUString sGuess = ::rtl::OUString::createFromAscii( pGuess );
322         if ( rTableNames.end() != rTableNames.find( sGuess ) )
323             getSettings().sSelectedTable = sGuess;
324     }
325 
326     //---------------------------------------------------------------------
implDoAutoFieldMapping()327     void OAddessBookSourcePilot::implDoAutoFieldMapping()
328     {
329         DBG_ASSERT( !needManualFieldMapping( ), "OAddessBookSourcePilot::implDoAutoFieldMapping: invalid call!" );
330 
331         fieldmapping::defaultMapping( getORB(), m_aSettings.aFieldMapping );
332     }
333 
334     //---------------------------------------------------------------------
implCreateDataSource()335     void OAddessBookSourcePilot::implCreateDataSource()
336     {
337         if (m_aNewDataSource.isValid())
338         {   // we already have a data source object
339             if ( m_aSettings.eType == m_eNewDataSourceType )
340                 // and it already has the correct type
341                 return;
342 
343             // it has a wrong type -> remove it
344             m_aNewDataSource.remove();
345         }
346 
347         ODataSourceContext aContext( getORB() );
348         aContext.disambiguate( m_aSettings.sDataSourceName );
349 
350         switch (m_aSettings.eType)
351         {
352             case AST_MORK:
353                 m_aNewDataSource = aContext.createNewMORK( m_aSettings.sDataSourceName );
354                 break;
355 
356             case AST_THUNDERBIRD:
357                 m_aNewDataSource = aContext.createNewThunderbird( m_aSettings.sDataSourceName );
358                 break;
359 
360             case AST_EVOLUTION:
361                 m_aNewDataSource = aContext.createNewEvolution( m_aSettings.sDataSourceName );
362                 break;
363 
364             case AST_EVOLUTION_GROUPWISE:
365                 m_aNewDataSource = aContext.createNewEvolutionGroupwise( m_aSettings.sDataSourceName );
366                 break;
367 
368             case AST_EVOLUTION_LDAP:
369                 m_aNewDataSource = aContext.createNewEvolutionLdap( m_aSettings.sDataSourceName );
370                 break;
371 
372             case AST_KAB:
373                 m_aNewDataSource = aContext.createNewKab( m_aSettings.sDataSourceName );
374                 break;
375 
376             case AST_MACAB:
377                 m_aNewDataSource = aContext.createNewMacab( m_aSettings.sDataSourceName );
378                 break;
379 
380             case AST_LDAP:
381                 m_aNewDataSource = aContext.createNewLDAP( m_aSettings.sDataSourceName );
382                 break;
383 
384             case AST_OUTLOOK:
385                 m_aNewDataSource = aContext.createNewOutlook( m_aSettings.sDataSourceName );
386                 break;
387 
388             case AST_OE:
389                 m_aNewDataSource = aContext.createNewOE( m_aSettings.sDataSourceName );
390                 break;
391 
392             case AST_OTHER:
393                 m_aNewDataSource = aContext.createNewDBase( m_aSettings.sDataSourceName );
394                 break;
395 
396             case AST_INVALID:
397                 DBG_ERROR( "OAddessBookSourcePilot::implCreateDataSource: illegal data source type!" );
398                 break;
399         }
400         m_eNewDataSourceType = m_aSettings.eType;
401     }
402 
403     //---------------------------------------------------------------------
connectToDataSource(sal_Bool _bForceReConnect)404     sal_Bool OAddessBookSourcePilot::connectToDataSource( sal_Bool _bForceReConnect )
405     {
406         DBG_ASSERT( m_aNewDataSource.isValid(), "OAddessBookSourcePilot::implConnect: invalid current data source!" );
407 
408         WaitObject aWaitCursor( this );
409         if ( _bForceReConnect && m_aNewDataSource.isConnected( ) )
410             m_aNewDataSource.disconnect( );
411 
412         return m_aNewDataSource.connect( this );
413     }
414 
415     //---------------------------------------------------------------------
createPage(WizardState _nState)416     OWizardPage* OAddessBookSourcePilot::createPage(WizardState _nState)
417     {
418         switch (_nState)
419         {
420             case STATE_SELECT_ABTYPE:
421                 return new TypeSelectionPage( this );
422 
423             case STATE_INVOKE_ADMIN_DIALOG:
424                 return new AdminDialogInvokationPage( this );
425 
426             case STATE_TABLE_SELECTION:
427                 return new TableSelectionPage( this );
428 
429             case STATE_MANUAL_FIELD_MAPPING:
430                 return new FieldMappingPage( this );
431 
432             case STATE_FINAL_CONFIRM:
433                 return new FinalPage( this );
434 
435             default:
436                 DBG_ERROR("OAddessBookSourcePilot::createPage: invalid state!");
437                 return NULL;
438         }
439     }
440 
441     //---------------------------------------------------------------------
impl_updateRoadmap(AddressSourceType _eType)442     void OAddessBookSourcePilot::impl_updateRoadmap( AddressSourceType _eType )
443     {
444         bool bSettingsPage = needAdminInvokationPage( _eType );
445         bool bTablesPage   = needTableSelection( _eType );
446         bool bFieldsPage   = needManualFieldMapping( _eType );
447 
448         bool bConnected = m_aNewDataSource.isConnected();
449         bool bCanSkipTables =
450                 (   m_aNewDataSource.hasTable( m_aSettings.sSelectedTable )
451                 ||  m_aSettings.bIgnoreNoTable
452                 );
453 
454         enableState( STATE_INVOKE_ADMIN_DIALOG, bSettingsPage );
455 
456         enableState( STATE_TABLE_SELECTION,
457             bTablesPage &&  ( bConnected ? !bCanSkipTables : !bSettingsPage )
458             // if we do not need a settings page, we connect upon "Next" on the first page
459         );
460 
461         enableState( STATE_MANUAL_FIELD_MAPPING,
462                 bFieldsPage && bConnected && m_aNewDataSource.hasTable( m_aSettings.sSelectedTable )
463         );
464 
465         enableState( STATE_FINAL_CONFIRM,
466             bConnected && bCanSkipTables
467         );
468     }
469 
470     //---------------------------------------------------------------------
typeSelectionChanged(AddressSourceType _eType)471     void OAddessBookSourcePilot::typeSelectionChanged( AddressSourceType _eType )
472     {
473         PathId nCurrentPathID( PATH_COMPLETE );
474         bool bSettingsPage = needAdminInvokationPage( _eType );
475         bool bFieldsPage = needManualFieldMapping( _eType );
476         if ( !bSettingsPage )
477             if ( !bFieldsPage )
478                 nCurrentPathID = PATH_NO_SETTINGS_NO_FIELDS;
479             else
480                 nCurrentPathID = PATH_NO_SETTINGS;
481         else
482             if ( !bFieldsPage )
483                 nCurrentPathID = PATH_NO_FIELDS;
484             else
485                 nCurrentPathID = PATH_COMPLETE;
486         activatePath( nCurrentPathID, true );
487 
488         m_aNewDataSource.disconnect();
489         m_aSettings.bIgnoreNoTable = false;
490         impl_updateRoadmap( _eType );
491     }
492 
493 //.........................................................................
494 }   // namespace abp
495 //.........................................................................
496 
497