summaryrefslogtreecommitdiff
path: root/extensions/source/abpilot
diff options
context:
space:
mode:
Diffstat (limited to 'extensions/source/abpilot')
-rw-r--r--extensions/source/abpilot/abp.map8
-rw-r--r--extensions/source/abpilot/abpfinalpage.cxx232
-rw-r--r--extensions/source/abpilot/abpfinalpage.hxx95
-rw-r--r--extensions/source/abpilot/abpresid.hrc222
-rw-r--r--extensions/source/abpilot/abpservices.cxx110
-rw-r--r--extensions/source/abpilot/abptypes.hxx51
-rw-r--r--extensions/source/abpilot/abspage.cxx92
-rw-r--r--extensions/source/abpilot/abspage.hxx78
-rw-r--r--extensions/source/abpilot/abspilot.cxx508
-rw-r--r--extensions/source/abpilot/abspilot.hxx152
-rw-r--r--extensions/source/abpilot/abspilot.src379
-rw-r--r--extensions/source/abpilot/addresssettings.hxx82
-rw-r--r--extensions/source/abpilot/admininvokationimpl.cxx140
-rw-r--r--extensions/source/abpilot/admininvokationimpl.hxx73
-rw-r--r--extensions/source/abpilot/admininvokationpage.cxx117
-rw-r--r--extensions/source/abpilot/admininvokationpage.hxx76
-rw-r--r--extensions/source/abpilot/datasourcehandling.cxx679
-rw-r--r--extensions/source/abpilot/datasourcehandling.hxx229
-rw-r--r--extensions/source/abpilot/exports.dxp3
-rw-r--r--extensions/source/abpilot/fieldmappingimpl.cxx378
-rw-r--r--extensions/source/abpilot/fieldmappingimpl.hxx129
-rw-r--r--extensions/source/abpilot/fieldmappingpage.cxx122
-rw-r--r--extensions/source/abpilot/fieldmappingpage.hxx73
-rw-r--r--extensions/source/abpilot/makefile.mk110
-rw-r--r--extensions/source/abpilot/moduleabp.cxx35
-rw-r--r--extensions/source/abpilot/tableselectionpage.cxx136
-rw-r--r--extensions/source/abpilot/tableselectionpage.hxx76
-rw-r--r--extensions/source/abpilot/typeselectionpage.cxx252
-rw-r--r--extensions/source/abpilot/typeselectionpage.hxx109
-rw-r--r--extensions/source/abpilot/unodialogabp.cxx199
-rw-r--r--extensions/source/abpilot/unodialogabp.hxx104
31 files changed, 5049 insertions, 0 deletions
diff --git a/extensions/source/abpilot/abp.map b/extensions/source/abpilot/abp.map
new file mode 100644
index 000000000000..2b4747c38ff9
--- /dev/null
+++ b/extensions/source/abpilot/abp.map
@@ -0,0 +1,8 @@
+EXTABP_1_0 {
+ global:
+ component_getImplementationEnvironment;
+ component_writeInfo;
+ component_getFactory;
+ local:
+ *;
+};
diff --git a/extensions/source/abpilot/abpfinalpage.cxx b/extensions/source/abpilot/abpfinalpage.cxx
new file mode 100644
index 000000000000..ac6c01693c2d
--- /dev/null
+++ b/extensions/source/abpilot/abpfinalpage.cxx
@@ -0,0 +1,232 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: abpfinalpage.cxx,v $
+ * $Revision: 1.11 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_extensions.hxx"
+#include "abpfinalpage.hxx"
+#include "addresssettings.hxx"
+#include "abspilot.hxx"
+#include <tools/debug.hxx>
+#include <tools/urlobj.hxx>
+#include <unotools/ucbhelper.hxx>
+#include <sfx2/filedlghelper.hxx>
+#include <svtools/pathoptions.hxx>
+#ifndef SVTOOLS_FILENOTATION_HXX_
+#include <svtools/filenotation.hxx>
+#endif
+#include <sfx2/docfilt.hxx>
+#include <vcl/msgbox.hxx>
+#include <comphelper/componentcontext.hxx>
+#include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
+
+//.........................................................................
+namespace abp
+{
+//.........................................................................
+ using namespace ::svt;
+ using namespace ::utl;
+
+ const SfxFilter* lcl_getBaseFilter()
+ {
+ static const String s_sDatabaseType = String::CreateFromAscii("StarOffice XML (Base)");
+ const SfxFilter* pFilter = SfxFilter::GetFilterByName( s_sDatabaseType);
+ OSL_ENSURE(pFilter,"Filter: StarOffice XML (Base) could not be found!");
+ return pFilter;
+ }
+ //=====================================================================
+ //= FinalPage
+ //=====================================================================
+ //---------------------------------------------------------------------
+ FinalPage::FinalPage( OAddessBookSourcePilot* _pParent )
+ :AddressBookSourcePage(_pParent, ModuleRes(RID_PAGE_FINAL))
+ ,m_aExplanation ( this, ModuleRes( FT_FINISH_EXPL ) )
+ ,m_aLocationLabel ( this, ModuleRes( FT_LOCATION ) )
+ ,m_aLocation ( this, ModuleRes( CBB_LOCATION ) )
+ ,m_aBrowse ( this, ModuleRes( PB_BROWSE ) )
+ ,m_aRegisterName ( this, ModuleRes( CB_REGISTER_DS ) )
+ ,m_aNameLabel ( this, ModuleRes( FT_NAME_EXPL ) )
+ ,m_aName ( this, ModuleRes( ET_DATASOURCENAME ) )
+ ,m_aDuplicateNameError ( this, ModuleRes( FT_DUPLICATENAME ) )
+ ,m_aLocationController( ::comphelper::ComponentContext( _pParent->getORB() ), m_aLocation, m_aBrowse )
+ {
+ FreeResource();
+
+ m_aName.SetModifyHdl( LINK(this, FinalPage, OnNameModified) );
+ m_aLocation.SetModifyHdl( LINK(this, FinalPage, OnNameModified) );
+ m_aRegisterName.SetClickHdl( LINK( this, FinalPage, OnRegister ) );
+ m_aRegisterName.Check(TRUE);
+ }
+
+ //---------------------------------------------------------------------
+ sal_Bool FinalPage::isValidName() const
+ {
+ ::rtl::OUString sCurrentName(m_aName.GetText());
+
+ if (0 == sCurrentName.getLength())
+ // the name must not be empty
+ return sal_False;
+
+ if ( m_aInvalidDataSourceNames.find( sCurrentName ) != m_aInvalidDataSourceNames.end() )
+ // there already is a data source with this name
+ return sal_False;
+
+ return sal_True;
+ }
+
+ //---------------------------------------------------------------------
+ void FinalPage::setFields()
+ {
+ AddressSettings& rSettings = getSettings();
+
+ INetURLObject aURL( rSettings.sDataSourceName );
+ if( aURL.GetProtocol() == INET_PROT_NOT_VALID )
+ {
+ String sPath = SvtPathOptions().GetWorkPath();
+ sPath += '/';
+ sPath += String(rSettings.sDataSourceName);
+
+ const SfxFilter* pFilter = lcl_getBaseFilter();
+ if ( pFilter )
+ {
+ String sExt = pFilter->GetDefaultExtension();
+ sPath += sExt.GetToken(1,'*');
+ }
+
+ aURL.SetURL(sPath);
+ }
+ OSL_ENSURE( aURL.GetProtocol() != INET_PROT_NOT_VALID ,"No valid file name!");
+ rSettings.sDataSourceName = aURL.GetMainURL( INetURLObject::NO_DECODE );
+ m_aLocationController.setURL( rSettings.sDataSourceName );
+ String sName = aURL.getName( );
+ xub_StrLen nPos = sName.Search(String(aURL.GetExtension()));
+ if ( nPos != STRING_NOTFOUND )
+ {
+ sName.Erase(nPos-1,4);
+ }
+ m_aName.SetText(sName);
+
+ OnRegister(&m_aRegisterName);
+ }
+
+ //---------------------------------------------------------------------
+ void FinalPage::initializePage()
+ {
+ AddressBookSourcePage::initializePage();
+
+ setFields();
+ }
+
+ //---------------------------------------------------------------------
+ sal_Bool FinalPage::commitPage( CommitPageReason _eReason )
+ {
+ if (!AddressBookSourcePage::commitPage(_eReason))
+ return sal_False;
+
+ if ( ( eTravelBackward != _eReason )
+ && ( !m_aLocationController.prepareCommit() )
+ )
+ return sal_False;
+
+ AddressSettings& rSettings = getSettings();
+ rSettings.sDataSourceName = m_aLocationController.getURL();
+ rSettings.bRegisterDataSource = m_aRegisterName.IsChecked();
+ if ( rSettings.bRegisterDataSource )
+ rSettings.sRegisteredDataSourceName = m_aName.GetText();
+
+ return sal_True;
+ }
+
+ //---------------------------------------------------------------------
+ void FinalPage::ActivatePage()
+ {
+ AddressBookSourcePage::ActivatePage();
+
+ // get the names of all data sources
+ ODataSourceContext aContext( getORB() );
+ aContext.getDataSourceNames( m_aInvalidDataSourceNames );
+
+ // give the name edit the focus
+ m_aLocation.GrabFocus();
+
+ // default the finish button
+ getDialog()->defaultButton( WZB_FINISH );
+ }
+
+ //---------------------------------------------------------------------
+ void FinalPage::DeactivatePage()
+ {
+ AddressBookSourcePage::DeactivatePage();
+
+ // default the "next" button, again
+ getDialog()->defaultButton( WZB_NEXT );
+ // disable the finish button
+ getDialog()->enableButtons( WZB_FINISH, sal_False );
+ }
+
+ //---------------------------------------------------------------------
+ bool FinalPage::canAdvance() const
+ {
+ return false;
+ }
+
+ //---------------------------------------------------------------------
+ void FinalPage::implCheckName()
+ {
+ sal_Bool bValidName = isValidName();
+ sal_Bool bEmptyName = 0 == m_aName.GetText().Len();
+ sal_Bool bEmptyLocation = 0 == m_aLocation.GetText().Len();
+
+ // enable or disable the finish button
+ getDialog()->enableButtons( WZB_FINISH, !bEmptyLocation && (!m_aRegisterName.IsChecked() || bValidName) );
+
+ // show the error message for an invalid name
+ m_aDuplicateNameError.Show( !bValidName && !bEmptyName );
+ }
+
+ //---------------------------------------------------------------------
+ IMPL_LINK( FinalPage, OnNameModified, Edit*, /**/ )
+ {
+ implCheckName();
+ return 0L;
+ }
+
+ // -----------------------------------------------------------------------------
+ IMPL_LINK( FinalPage, OnRegister, CheckBox*, EMPTYARG )
+ {
+ BOOL bEnable = m_aRegisterName.IsChecked();
+ m_aNameLabel.Enable(bEnable);
+ m_aName.Enable(bEnable);
+ implCheckName();
+ return 0L;
+ }
+//.........................................................................
+} // namespace abp
+//.........................................................................
+
diff --git a/extensions/source/abpilot/abpfinalpage.hxx b/extensions/source/abpilot/abpfinalpage.hxx
new file mode 100644
index 000000000000..6a9c5387da77
--- /dev/null
+++ b/extensions/source/abpilot/abpfinalpage.hxx
@@ -0,0 +1,95 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: abpfinalpage.hxx,v $
+ * $Revision: 1.7 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef EXTENSIONS_ABP_ABPFINALPAGE_HXX
+#define EXTENSIONS_ABP_ABPFINALPAGE_HXX
+
+#include "abspage.hxx"
+#include "abptypes.hxx"
+
+#include <svtools/urlcontrol.hxx>
+#include <svx/databaselocationinput.hxx>
+#include <vcl/edit.hxx>
+
+//.........................................................................
+namespace abp
+{
+//.........................................................................
+
+ //=====================================================================
+ //= FinalPage
+ //=====================================================================
+ class FinalPage : public AddressBookSourcePage
+ {
+ protected:
+ FixedText m_aExplanation;
+ FixedText m_aLocationLabel;
+ ::svt::OFileURLControl m_aLocation;
+ PushButton m_aBrowse;
+ CheckBox m_aRegisterName;
+ FixedText m_aNameLabel;
+ Edit m_aName;
+ FixedText m_aDuplicateNameError;
+
+ ::svx::DatabaseLocationInputController
+ m_aLocationController;
+
+ StringBag m_aInvalidDataSourceNames;
+
+ public:
+ FinalPage( OAddessBookSourcePilot* _pParent );
+
+ protected:
+ // OWizardPage overridables
+ virtual void initializePage();
+ virtual sal_Bool commitPage( CommitPageReason _eReason );
+
+ // TabDialog overridables
+ virtual void ActivatePage();
+ virtual void DeactivatePage();
+
+ // OImportPage overridables
+ virtual bool canAdvance() const;
+
+ private:
+ DECL_LINK( OnNameModified, Edit* );
+ DECL_LINK( OnRegister, CheckBox* );
+
+ sal_Bool isValidName() const;
+ void implCheckName();
+ void setFields();
+ };
+
+//.........................................................................
+} // namespace abp
+//.........................................................................
+
+#endif // EXTENSIONS_ABP_ABPFINALPAGE_HXX
+
diff --git a/extensions/source/abpilot/abpresid.hrc b/extensions/source/abpilot/abpresid.hrc
new file mode 100644
index 000000000000..6b7a7d467d2b
--- /dev/null
+++ b/extensions/source/abpilot/abpresid.hrc
@@ -0,0 +1,222 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: abpresid.hrc,v $
+ * $Revision: 1.15 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef EXTENSIONS_ABPRESID_HRC
+#define EXTENSIONS_ABPRESID_HRC
+
+#include "abpilot.hrc"
+
+//========================================================================
+// basics
+
+#define RID_DIALOG_START RID_ABP_START
+#define RID_PAGE_START RID_ABP_START
+#define RID_STRING_START RID_ABP_START
+#define RID_ERRORBOX_START RID_ABP_START
+#define RID_UNTYPED_START RID_ABP_START
+#define RID_QUERYBOX_START RID_ABP_START
+#define RID_BITMAP_START RID_ABP_START
+
+//========================================================================
+// dialogs
+
+#define RID_DLG_ADDRESSBOOKSOURCEPILOT ( RID_DIALOG_START + 0 )
+// please adjust RID_DIALOG_END (below) when adding new dialogs
+
+#define RID_DIALOG_END RID_DLG_ADDRESSBOOKSOURCEPILOT
+
+//========================================================================
+// tab pages
+
+#define RID_PAGE_SELECTABTYPE ( RID_PAGE_START + 0 )
+#define RID_PAGE_ADMININVOKATION ( RID_PAGE_START + 1 )
+#define RID_PAGE_TABLESELECTION_AB ( RID_PAGE_START + 2 )
+#define RID_PAGE_FIELDMAPPING ( RID_PAGE_START + 3 )
+#define RID_PAGE_FINAL ( RID_PAGE_START + 4 )
+// please adjust RID_PAGE_END (below) when adding new tab pages
+
+#define RID_PAGE_END RID_PAGE_FINAL
+
+//========================================================================
+// strings
+
+#define RID_STR_DEFAULT_NAME ( RID_STRING_START + 0 )
+#define RID_STR_ADMINDIALOGTITLE ( RID_STRING_START + 1 )
+#define RID_STR_NOCONNECTION ( RID_STRING_START + 2 )
+#define RID_STR_PLEASECHECKSETTINGS ( RID_STRING_START + 3 )
+#define RID_STR_FIELDDIALOGTITLE ( RID_STRING_START + 4 )
+#define RID_STR_NOFIELDSASSIGNED ( RID_STRING_START + 5 )
+// please adjust RID_STRING_END (below) when adding new strings
+
+#define RID_STRING_END RID_STR_NOFIELDSASSIGNED
+
+//========================================================================
+// error boxes
+
+#define RID_ERR_NEEDTYPESELECTION ( RID_ERRORBOX_START + 0 )
+// please adjust RID_ERRORBOX_END (below) when adding new error boxes
+
+#define RID_ERRORBOX_END RID_ERR_NEEDTYPESELECTION
+
+//========================================================================
+// query boxes
+
+#define RID_QRY_NOTABLES ( RID_QUERYBOX_START + 0 )
+// please adjust RID_QUERYBOX_END (below) when adding new query boxes
+
+#define RID_QUERYBOX_END RID_QRY_NOTABLES
+
+//========================================================================
+// untyped resources
+
+#define RID_RSC_NOTUSEDYET ( RID_UNTYPED_START + 0 )
+// please adjust RID_UNTYPED_END (below) when adding new untyped resources
+
+#define RID_UNTYPED_END RID_RSC_NOTUSEDYET
+
+//========================================================================
+// bitmaps
+
+#define BMP_HEADERIMAGE ( RID_BITMAP_START + 0 )
+// please adjust RID_BITMAP_END (below) when adding new bitmaps
+
+#define RID_BITMAP_END BMP_HEADERIMAGE
+
+//========================================================================
+//========================================================================
+//= range checks
+
+#if RID_DIALOG_END > RID_ABP_END
+ #error "please adjust the resource id ranges!!"
+#endif
+#if RID_PAGE_END > RID_ABP_END
+ #error "please adjust the resource id ranges!!"
+#endif
+#if RID_STRING_END > RID_ABP_END
+ #error "please adjust the resource id ranges!!"
+#endif
+#if RID_ERRORBOX_END > RID_ABP_END
+ #error "please adjust the resource id ranges!!"
+#endif
+#if RID_QUERYBOX_END > RID_ABP_END
+ #error "please adjust the resource id ranges!!"
+#endif
+#if RID_UNTYPED_END > RID_ABP_END
+ #error "please adjust the resource id ranges!!"
+#endif
+#if RID_BITMAP_END > RID_ABP_END
+ #error "please adjust the resource id ranges!!"
+#endif
+
+//========================================================================
+// local resource ids
+
+//........................................................................
+#define FL_SEPARATOR 1
+#define FL_TYPE 2
+#define FL_NAME 3
+
+//........................................................................
+#define FT_TYPE_HINTS 1
+#define FT_ADMINEXPLANATION 3
+#define FT_NAME_EXPL 4
+#define FT_ERROR 5
+#define FL_TOOMUCHTABLES 6
+#define FT_FIELDASSIGMENTEXPL 7
+#define FT_ASSIGNEDFIELDS 8
+#define FT_FINISH_EXPL 9
+#define FT_DUPLICATENAME 10
+#define FT_LOCATION 11
+
+//........................................................................
+#define RB_MORK 1
+#define RB_THUNDERBIRD 2
+#define RB_EVOLUTION 3
+#define RB_KAB 4
+#define RB_MACAB 5
+#define RB_LDAP 6
+#define RB_OUTLOOK 7
+#define RB_OUTLOOKEXPRESS 8
+#define RB_OTHER 9
+#define RB_EVOLUTION_GROUPWISE 10
+#define RB_EVOLUTION_LDAP 11
+
+//........................................................................
+#define ET_DATASOURCENAME 1
+#define ET_LOCATION 2
+
+//........................................................................
+#define PB_INVOKE_ADMIN_DIALOG 1
+#define PB_INVOKE_FIELDS_DIALOG 2
+#define PB_BROWSE 3
+
+//........................................................................
+#define LB_TABLELIST 1
+
+//........................................................................
+#define CB_REGISTER_DS 1
+
+//........................................................................
+#define CBB_LOCATION 1
+
+//........................................................................
+#define STR_SELECT_ABTYPE 1
+#define STR_INVOKE_ADMIN_DIALOG 2
+#define STR_TABLE_SELECTION 3
+#define STR_MANUAL_FIELD_MAPPING 4
+#define STR_FINAL_CONFIRM 5
+
+//========================================================================
+// some defines
+
+//........................................................................
+#define WINDOW_SIZE_X 240
+#define WINDOW_SIZE_Y 185
+
+#define WINDOW_BORDER_X 12
+#define WINDOW_BORDER_Y 14
+
+#define BUTTON_SIZE_X 50
+#define BUTTON_SIZE_Y 14
+
+#define HEADER_SIZE_Y 30
+
+#define BORDER_X 12
+
+//........................................................................
+
+#endif // EXTENSIONS_ABPRESID_HRC
+
+/*************************************************************************
+ * history:
+ *
+ * Revision 1.0 30.01.01 16:38:29 fs
+ ************************************************************************/
+
diff --git a/extensions/source/abpilot/abpservices.cxx b/extensions/source/abpilot/abpservices.cxx
new file mode 100644
index 000000000000..ac7222fcb1d1
--- /dev/null
+++ b/extensions/source/abpilot/abpservices.cxx
@@ -0,0 +1,110 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: abpservices.cxx,v $
+ * $Revision: 1.6 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_extensions.hxx"
+#include "componentmodule.hxx"
+
+//---------------------------------------------------------------------------------------
+
+using namespace ::rtl;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::registry;
+
+//---------------------------------------------------------------------------------------
+
+extern "C" void SAL_CALL createRegistryInfo_OABSPilotUno();
+
+//---------------------------------------------------------------------------------------
+
+extern "C" void SAL_CALL abp_initializeModule()
+{
+ static sal_Bool s_bInit = sal_False;
+ if (!s_bInit)
+ {
+ createRegistryInfo_OABSPilotUno();
+ ::abp::OModule::setResourceFilePrefix("abp");
+ s_bInit = sal_True;
+ }
+}
+
+//---------------------------------------------------------------------------------------
+
+extern "C" SAL_DLLPUBLIC_EXPORT void SAL_CALL
+component_getImplementationEnvironment(
+ const sal_Char **ppEnvTypeName,
+ uno_Environment ** /*ppEnv*/
+ )
+{
+ abp_initializeModule();
+ *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME;
+}
+
+//---------------------------------------------------------------------------------------
+extern "C" SAL_DLLPUBLIC_EXPORT sal_Bool SAL_CALL component_writeInfo(
+ void* pServiceManager,
+ void* pRegistryKey
+ )
+{
+ if (pRegistryKey)
+ try
+ {
+ return ::abp::OModule::writeComponentInfos(
+ static_cast<XMultiServiceFactory*>(pServiceManager),
+ static_cast<XRegistryKey*>(pRegistryKey));
+ }
+ catch (InvalidRegistryException& )
+ {
+ OSL_ASSERT("abp::component_writeInfo: could not create a registry key (InvalidRegistryException) !");
+ }
+
+ return sal_False;
+}
+
+//---------------------------------------------------------------------------------------
+extern "C" SAL_DLLPUBLIC_EXPORT void* SAL_CALL component_getFactory(
+ const sal_Char* pImplementationName,
+ void* pServiceManager,
+ void* /*pRegistryKey*/)
+{
+ Reference< XInterface > xRet;
+ if (pServiceManager && pImplementationName)
+ {
+ xRet = ::abp::OModule::getComponentFactory(
+ ::rtl::OUString::createFromAscii(pImplementationName),
+ static_cast< XMultiServiceFactory* >(pServiceManager));
+ }
+
+ if (xRet.is())
+ xRet->acquire();
+ return xRet.get();
+};
+
diff --git a/extensions/source/abpilot/abptypes.hxx b/extensions/source/abpilot/abptypes.hxx
new file mode 100644
index 000000000000..db591624be77
--- /dev/null
+++ b/extensions/source/abpilot/abptypes.hxx
@@ -0,0 +1,51 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: abptypes.hxx,v $
+ * $Revision: 1.4 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef EXTENSIONS_ABP_ABPTYPES_HXX
+#define EXTENSIONS_ABP_ABPTYPES_HXX
+
+#include <comphelper/stl_types.hxx>
+#include <rtl/ustring.hxx>
+
+//.........................................................................
+namespace abp
+{
+//.........................................................................
+
+ DECLARE_STL_STDKEY_SET( ::rtl::OUString, StringBag );
+
+ DECLARE_STL_USTRINGACCESS_MAP( ::rtl::OUString, MapString2String );
+
+//.........................................................................
+} // namespace abp
+//.........................................................................
+
+#endif // EXTENSIONS_ABP_ABPTYPES_HXX
+
diff --git a/extensions/source/abpilot/abspage.cxx b/extensions/source/abpilot/abspage.cxx
new file mode 100644
index 000000000000..ed41f6c004ae
--- /dev/null
+++ b/extensions/source/abpilot/abspage.cxx
@@ -0,0 +1,92 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: abspage.cxx,v $
+ * $Revision: 1.5 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_extensions.hxx"
+#include "abspage.hxx"
+#include "abspilot.hxx"
+
+//.........................................................................
+namespace abp
+{
+//.........................................................................
+
+ using namespace ::svt;
+ using namespace ::com::sun::star::uno;
+ using namespace ::com::sun::star::lang;
+ //=====================================================================
+ //= AddressBookSourcePage
+ //=====================================================================
+ AddressBookSourcePage::AddressBookSourcePage( OAddessBookSourcePilot* _pParent, const ResId& _rId )
+ :AddressBookSourcePage_Base(_pParent, _rId)
+ {
+ }
+
+ //---------------------------------------------------------------------
+ void AddressBookSourcePage::DeactivatePage()
+ {
+ AddressBookSourcePage_Base::DeactivatePage();
+ getDialog()->enableButtons(WZB_NEXT, sal_True);
+ }
+
+ //---------------------------------------------------------------------
+ OAddessBookSourcePilot* AddressBookSourcePage::getDialog()
+ {
+ return static_cast<OAddessBookSourcePilot*>(GetParent());
+ }
+
+ //---------------------------------------------------------------------
+ const OAddessBookSourcePilot* AddressBookSourcePage::getDialog() const
+ {
+ return static_cast<const OAddessBookSourcePilot*>(GetParent());
+ }
+
+ //---------------------------------------------------------------------
+ AddressSettings& AddressBookSourcePage::getSettings()
+ {
+ return getDialog()->getSettings();
+ }
+
+ //---------------------------------------------------------------------
+ const AddressSettings& AddressBookSourcePage::getSettings() const
+ {
+ return getDialog()->getSettings();
+ }
+
+ //---------------------------------------------------------------------
+ Reference< XMultiServiceFactory > AddressBookSourcePage::getORB()
+ {
+ return getDialog()->getORB();
+ }
+
+//.........................................................................
+} // namespace abp
+//.........................................................................
+
diff --git a/extensions/source/abpilot/abspage.hxx b/extensions/source/abpilot/abspage.hxx
new file mode 100644
index 000000000000..83353793c1ec
--- /dev/null
+++ b/extensions/source/abpilot/abspage.hxx
@@ -0,0 +1,78 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: abspage.hxx,v $
+ * $Revision: 1.5 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef EXTENSIONS_ABP_ABSPAGE_HXX
+#define EXTENSIONS_ABP_ABSPAGE_HXX
+
+#include <svtools/wizardmachine.hxx>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#ifndef EXTENSIONS_ABPRESID_HRC
+#include "abpresid.hrc"
+#endif
+#include "componentmodule.hxx"
+#include <vcl/fixed.hxx>
+
+//.........................................................................
+namespace abp
+{
+//.........................................................................
+
+ class OAddessBookSourcePilot;
+ struct AddressSettings;
+
+ //=====================================================================
+ //= AddressBookSourcePage
+ //=====================================================================
+ typedef ::svt::OWizardPage AddressBookSourcePage_Base;
+ /// the base class for all tab pages in the address book source wizard
+ class AddressBookSourcePage : public AddressBookSourcePage_Base
+ {
+ protected:
+ AddressBookSourcePage( OAddessBookSourcePilot* _pParent, const ResId& _rId );
+
+ protected:
+ // helper
+ OAddessBookSourcePilot* getDialog();
+ const OAddessBookSourcePilot* getDialog() const;
+ ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >
+ getORB();
+ AddressSettings& getSettings();
+ const AddressSettings& getSettings() const;
+
+ // TabDialog overridables
+ virtual void DeactivatePage();
+ };
+
+//.........................................................................
+} // namespace abp
+//.........................................................................
+
+#endif // EXTENSIONS_ABP_ABSPAGE_HXX
+
diff --git a/extensions/source/abpilot/abspilot.cxx b/extensions/source/abpilot/abspilot.cxx
new file mode 100644
index 000000000000..50e9fb0326ae
--- /dev/null
+++ b/extensions/source/abpilot/abspilot.cxx
@@ -0,0 +1,508 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: abspilot.cxx,v $
+ * $Revision: 1.21 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_extensions.hxx"
+#include "abspilot.hxx"
+#include "abpilot.hrc"
+#include "abpresid.hrc"
+#include "componentmodule.hxx"
+#include <tools/debug.hxx>
+#include <svtools/localresaccess.hxx>
+#include "typeselectionpage.hxx"
+#include "admininvokationpage.hxx"
+#include "tableselectionpage.hxx"
+#include <vcl/waitobj.hxx>
+#include <vcl/msgbox.hxx>
+#include "abpfinalpage.hxx"
+#include "fieldmappingpage.hxx"
+#include "fieldmappingimpl.hxx"
+
+//.........................................................................
+namespace abp
+{
+//.........................................................................
+
+#define STATE_SELECT_ABTYPE 0
+#define STATE_INVOKE_ADMIN_DIALOG 1
+#define STATE_TABLE_SELECTION 2
+#define STATE_MANUAL_FIELD_MAPPING 3
+#define STATE_FINAL_CONFIRM 4
+
+#define PATH_COMPLETE 1
+#define PATH_NO_SETTINGS 2
+#define PATH_NO_FIELDS 3
+#define PATH_NO_SETTINGS_NO_FIELDS 4
+
+ using namespace ::svt;
+ using namespace ::com::sun::star::uno;
+ using namespace ::com::sun::star::lang;
+
+ //=====================================================================
+ //= OAddessBookSourcePilot
+ //=====================================================================
+ //---------------------------------------------------------------------
+ OAddessBookSourcePilot::OAddessBookSourcePilot(Window* _pParent, const Reference< XMultiServiceFactory >& _rxORB)
+ :OAddessBookSourcePilot_Base( _pParent, ModuleRes( RID_DLG_ADDRESSBOOKSOURCEPILOT ),
+ WZB_HELP | WZB_FINISH | WZB_CANCEL | WZB_NEXT | WZB_PREVIOUS )
+ ,m_xORB(_rxORB)
+ ,m_aNewDataSource(_rxORB)
+ ,m_eNewDataSourceType( AST_INVALID )
+ {
+ SetPageSizePixel(LogicToPixel(Size(WINDOW_SIZE_X, WINDOW_SIZE_Y), MAP_APPFONT));
+
+ ShowButtonFixedLine(sal_True);
+
+ declarePath( PATH_COMPLETE,
+ STATE_SELECT_ABTYPE,
+ STATE_INVOKE_ADMIN_DIALOG,
+ STATE_TABLE_SELECTION,
+ STATE_MANUAL_FIELD_MAPPING,
+ STATE_FINAL_CONFIRM,
+ WZS_INVALID_STATE
+ );
+ declarePath( PATH_NO_SETTINGS,
+ STATE_SELECT_ABTYPE,
+ STATE_TABLE_SELECTION,
+ STATE_MANUAL_FIELD_MAPPING,
+ STATE_FINAL_CONFIRM,
+ WZS_INVALID_STATE
+ );
+ declarePath( PATH_NO_FIELDS,
+ STATE_SELECT_ABTYPE,
+ STATE_INVOKE_ADMIN_DIALOG,
+ STATE_TABLE_SELECTION,
+ STATE_FINAL_CONFIRM,
+ WZS_INVALID_STATE
+ );
+ declarePath( PATH_NO_SETTINGS_NO_FIELDS,
+ STATE_SELECT_ABTYPE,
+ STATE_TABLE_SELECTION,
+ STATE_FINAL_CONFIRM,
+ WZS_INVALID_STATE
+ );
+
+ m_pPrevPage->SetHelpId(HID_ABSPILOT_PREVIOUS);
+ m_pNextPage->SetHelpId(HID_ABSPILOT_NEXT);
+ m_pCancel->SetHelpId(HID_ABSPILOT_CANCEL);
+ m_pFinish->SetHelpId(HID_ABSPILOT_FINISH);
+ m_pHelp->SetUniqueId(UID_ABSPILOT_HELP);
+
+ m_pCancel->SetClickHdl( LINK( this, OAddessBookSourcePilot, OnCancelClicked) );
+
+ // some initial settings
+#ifdef MACOSX
+ m_aSettings.eType = AST_MACAB;
+#elif WITH_MOZILLA
+#ifdef UNX
+ m_aSettings.eType = AST_MORK;
+#else
+ m_aSettings.eType = AST_OE;
+#endif
+#else
+ m_aSettings.eType = AST_OTHER;
+#endif
+ m_aSettings.sDataSourceName = String(ModuleRes(RID_STR_DEFAULT_NAME));
+ m_aSettings.bRegisterDataSource = false;
+ m_aSettings.bIgnoreNoTable = false;
+
+ defaultButton(WZB_NEXT);
+ enableButtons(WZB_FINISH, sal_False);
+ ActivatePage();
+
+ typeSelectionChanged( m_aSettings.eType );
+ }
+
+ //---------------------------------------------------------------------
+ String OAddessBookSourcePilot::getStateDisplayName( WizardState _nState ) const
+ {
+ USHORT nResId = 0;
+ switch ( _nState )
+ {
+ case STATE_SELECT_ABTYPE: nResId = STR_SELECT_ABTYPE; break;
+ case STATE_INVOKE_ADMIN_DIALOG: nResId = STR_INVOKE_ADMIN_DIALOG; break;
+ case STATE_TABLE_SELECTION: nResId = STR_TABLE_SELECTION; break;
+ case STATE_MANUAL_FIELD_MAPPING: nResId = STR_MANUAL_FIELD_MAPPING; break;
+ case STATE_FINAL_CONFIRM: nResId = STR_FINAL_CONFIRM; break;
+ }
+ DBG_ASSERT( nResId, "OAddessBookSourcePilot::getStateDisplayName: don't know this state!" );
+
+ String sDisplayName;
+ if ( nResId )
+ {
+ svt::OLocalResourceAccess aAccess( ModuleRes( RID_DLG_ADDRESSBOOKSOURCEPILOT ), RSC_MODALDIALOG );
+ sDisplayName = String( ModuleRes( nResId ) );
+ }
+
+ return sDisplayName;
+ }
+
+ //---------------------------------------------------------------------
+ void OAddessBookSourcePilot::implCommitAll()
+ {
+ // in real, the data source already exists in the data source context
+ // Thus, if the user changed the name, we have to rename the data source
+ if ( m_aSettings.sDataSourceName != m_aNewDataSource.getName() )
+ m_aNewDataSource.rename( m_aSettings.sDataSourceName );
+
+ // 1. the data source
+ m_aNewDataSource.store();
+
+ // 2. check if we need to register the data source
+ if ( m_aSettings.bRegisterDataSource )
+ m_aNewDataSource.registerDataSource(m_aSettings.sRegisteredDataSourceName);
+
+ // 3. write the data source / table names into the configuration
+ addressconfig::writeTemplateAddressSource( getORB(), m_aSettings.bRegisterDataSource ? m_aSettings.sRegisteredDataSourceName : m_aSettings.sDataSourceName, m_aSettings.sSelectedTable );
+
+ // 4. write the field mapping
+ fieldmapping::writeTemplateAddressFieldMapping( getORB(), m_aSettings.aFieldMapping );
+ }
+
+ //---------------------------------------------------------------------
+ void OAddessBookSourcePilot::implCleanup()
+ {
+ if ( m_aNewDataSource.isValid() )
+ m_aNewDataSource.remove();
+ }
+
+ //---------------------------------------------------------------------
+ IMPL_LINK( OAddessBookSourcePilot, OnCancelClicked, void*, /*NOTINTERESTEDIN*/ )
+ {
+ // do cleanups
+ implCleanup();
+
+ // reset the click hdl
+ m_pCancel->SetClickHdl( Link() );
+ // simulate the click again - this time, the default handling of the button will strike ....
+ m_pCancel->Click();
+
+ return 0L;
+ }
+
+ //---------------------------------------------------------------------
+ BOOL OAddessBookSourcePilot::Close()
+ {
+ implCleanup();
+
+ return OAddessBookSourcePilot_Base::Close();
+ }
+
+ //---------------------------------------------------------------------
+ sal_Bool OAddessBookSourcePilot::onFinish(sal_Int32 _nResult)
+ {
+ if (!OAddessBookSourcePilot_Base::onFinish(_nResult))
+ return sal_False;
+
+ if (RET_OK != _nResult)
+ return sal_True;
+
+ implCommitAll();
+
+ addressconfig::markPilotSuccess( getORB() );
+
+ return sal_True;
+ }
+
+ //---------------------------------------------------------------------
+ void OAddessBookSourcePilot::enterState( WizardState _nState )
+ {
+ switch ( _nState )
+ {
+ case STATE_SELECT_ABTYPE:
+ impl_updateRoadmap( static_cast< TypeSelectionPage* >( GetPage( STATE_SELECT_ABTYPE ) )->getSelectedType() );
+ break;
+
+ case STATE_FINAL_CONFIRM:
+ if ( !needManualFieldMapping( ) )
+ implDoAutoFieldMapping();
+ break;
+
+ case STATE_TABLE_SELECTION:
+ implDefaultTableName();
+ break;
+ }
+
+ OAddessBookSourcePilot_Base::enterState(_nState);
+ }
+
+ //---------------------------------------------------------------------
+ sal_Bool OAddessBookSourcePilot::prepareLeaveCurrentState( CommitPageReason _eReason )
+ {
+ if ( !OAddessBookSourcePilot_Base::prepareLeaveCurrentState( _eReason ) )
+ return sal_False;
+
+ if ( _eReason == eTravelBackward )
+ return sal_True;
+
+ sal_Bool bAllow = sal_True;
+
+ switch ( getCurrentState() )
+ {
+ case STATE_SELECT_ABTYPE:
+ implCreateDataSource();
+ if ( needAdminInvokationPage() )
+ break;
+ // no break here
+
+ case STATE_INVOKE_ADMIN_DIALOG:
+ if ( !connectToDataSource( sal_False ) )
+ {
+ // connecting did not succeed -> do not allow proceeding
+ bAllow = sal_False;
+ break;
+ }
+
+ // ........................................................
+ // now that we connected to the data source, check whether we need the "table selection" page
+ const StringBag& aTables = m_aNewDataSource.getTableNames();
+
+ if ( aTables.empty() )
+ {
+ if ( ( _eReason == eValidateNoUI )
+ || ( RET_YES != QueryBox( this, ModuleRes( RID_QRY_NOTABLES ) ).Execute() )
+ )
+ {
+ // cannot ask the user, or the user chose to use this data source, though there are no tables
+ bAllow = sal_False;
+ break;
+ }
+
+ m_aSettings.bIgnoreNoTable = true;
+ }
+
+ if ( aTables.size() == 1 )
+ // remember the one and only table we have
+ m_aSettings.sSelectedTable = *aTables.begin();
+
+ break;
+ }
+
+ impl_updateRoadmap( m_aSettings.eType );
+ return bAllow;
+ }
+
+ //---------------------------------------------------------------------
+ void OAddessBookSourcePilot::implDefaultTableName()
+ {
+ const StringBag& rTableNames = getDataSource().getTableNames();
+ if ( rTableNames.end() != rTableNames.find( getSettings().sSelectedTable ) )
+ // already a valid table selected
+ return;
+
+ const sal_Char* pGuess = NULL;
+ switch ( getSettings().eType )
+ {
+ case AST_MORK :
+ case AST_THUNDERBIRD : pGuess = "Personal Address book"; break;
+ case AST_LDAP : pGuess = "LDAP Directory"; break;
+ case AST_EVOLUTION :
+ case AST_EVOLUTION_GROUPWISE:
+ case AST_EVOLUTION_LDAP : pGuess = "Personal"; break;
+ default:
+ DBG_ERROR( "OAddessBookSourcePilot::implDefaultTableName: unhandled case!" );
+ return;
+ }
+ const ::rtl::OUString sGuess = ::rtl::OUString::createFromAscii( pGuess );
+ if ( rTableNames.end() != rTableNames.find( sGuess ) )
+ getSettings().sSelectedTable = sGuess;
+ }
+
+ //---------------------------------------------------------------------
+ void OAddessBookSourcePilot::implDoAutoFieldMapping()
+ {
+ DBG_ASSERT( !needManualFieldMapping( ), "OAddessBookSourcePilot::implDoAutoFieldMapping: invalid call!" );
+
+ fieldmapping::defaultMapping( getORB(), m_aSettings.aFieldMapping );
+ }
+
+ //---------------------------------------------------------------------
+ void OAddessBookSourcePilot::implCreateDataSource()
+ {
+ if (m_aNewDataSource.isValid())
+ { // we already have a data source object
+ if ( m_aSettings.eType == m_eNewDataSourceType )
+ // and it already has the correct type
+ return;
+
+ // it has a wrong type -> remove it
+ m_aNewDataSource.remove();
+ }
+
+ ODataSourceContext aContext( getORB() );
+ aContext.disambiguate( m_aSettings.sDataSourceName );
+
+ switch (m_aSettings.eType)
+ {
+ case AST_MORK:
+ m_aNewDataSource = aContext.createNewMORK( m_aSettings.sDataSourceName );
+ break;
+
+ case AST_THUNDERBIRD:
+ m_aNewDataSource = aContext.createNewThunderbird( m_aSettings.sDataSourceName );
+ break;
+
+ case AST_EVOLUTION:
+ m_aNewDataSource = aContext.createNewEvolution( m_aSettings.sDataSourceName );
+ break;
+
+ case AST_EVOLUTION_GROUPWISE:
+ m_aNewDataSource = aContext.createNewEvolutionGroupwise( m_aSettings.sDataSourceName );
+ break;
+
+ case AST_EVOLUTION_LDAP:
+ m_aNewDataSource = aContext.createNewEvolutionLdap( m_aSettings.sDataSourceName );
+ break;
+
+ case AST_KAB:
+ m_aNewDataSource = aContext.createNewKab( m_aSettings.sDataSourceName );
+ break;
+
+ case AST_MACAB:
+ m_aNewDataSource = aContext.createNewMacab( m_aSettings.sDataSourceName );
+ break;
+
+ case AST_LDAP:
+ m_aNewDataSource = aContext.createNewLDAP( m_aSettings.sDataSourceName );
+ break;
+
+ case AST_OUTLOOK:
+ m_aNewDataSource = aContext.createNewOutlook( m_aSettings.sDataSourceName );
+ break;
+
+ case AST_OE:
+ m_aNewDataSource = aContext.createNewOE( m_aSettings.sDataSourceName );
+ break;
+
+ case AST_OTHER:
+ m_aNewDataSource = aContext.createNewDBase( m_aSettings.sDataSourceName );
+ break;
+
+ case AST_INVALID:
+ DBG_ERROR( "OAddessBookSourcePilot::implCreateDataSource: illegal data source type!" );
+ break;
+ }
+ m_eNewDataSourceType = m_aSettings.eType;
+ }
+
+ //---------------------------------------------------------------------
+ sal_Bool OAddessBookSourcePilot::connectToDataSource( sal_Bool _bForceReConnect )
+ {
+ DBG_ASSERT( m_aNewDataSource.isValid(), "OAddessBookSourcePilot::implConnect: invalid current data source!" );
+
+ WaitObject aWaitCursor( this );
+ if ( _bForceReConnect && m_aNewDataSource.isConnected( ) )
+ m_aNewDataSource.disconnect( );
+
+ return m_aNewDataSource.connect( this );
+ }
+
+ //---------------------------------------------------------------------
+ OWizardPage* OAddessBookSourcePilot::createPage(WizardState _nState)
+ {
+ switch (_nState)
+ {
+ case STATE_SELECT_ABTYPE:
+ return new TypeSelectionPage( this );
+
+ case STATE_INVOKE_ADMIN_DIALOG:
+ return new AdminDialogInvokationPage( this );
+
+ case STATE_TABLE_SELECTION:
+ return new TableSelectionPage( this );
+
+ case STATE_MANUAL_FIELD_MAPPING:
+ return new FieldMappingPage( this );
+
+ case STATE_FINAL_CONFIRM:
+ return new FinalPage( this );
+
+ default:
+ DBG_ERROR("OAddessBookSourcePilot::createPage: invalid state!");
+ return NULL;
+ }
+ }
+
+ //---------------------------------------------------------------------
+ void OAddessBookSourcePilot::impl_updateRoadmap( AddressSourceType _eType )
+ {
+ bool bSettingsPage = needAdminInvokationPage( _eType );
+ bool bTablesPage = needTableSelection( _eType );
+ bool bFieldsPage = needManualFieldMapping( _eType );
+
+ bool bConnected = m_aNewDataSource.isConnected();
+ bool bCanSkipTables =
+ ( m_aNewDataSource.hasTable( m_aSettings.sSelectedTable )
+ || m_aSettings.bIgnoreNoTable
+ );
+
+ enableState( STATE_INVOKE_ADMIN_DIALOG, bSettingsPage );
+
+ enableState( STATE_TABLE_SELECTION,
+ bTablesPage && ( bConnected ? !bCanSkipTables : !bSettingsPage )
+ // if we do not need a settings page, we connect upon "Next" on the first page
+ );
+
+ enableState( STATE_MANUAL_FIELD_MAPPING,
+ bFieldsPage && bConnected && m_aNewDataSource.hasTable( m_aSettings.sSelectedTable )
+ );
+
+ enableState( STATE_FINAL_CONFIRM,
+ bConnected && bCanSkipTables
+ );
+ }
+
+ //---------------------------------------------------------------------
+ void OAddessBookSourcePilot::typeSelectionChanged( AddressSourceType _eType )
+ {
+ PathId nCurrentPathID( PATH_COMPLETE );
+ bool bSettingsPage = needAdminInvokationPage( _eType );
+ bool bFieldsPage = needManualFieldMapping( _eType );
+ if ( !bSettingsPage )
+ if ( !bFieldsPage )
+ nCurrentPathID = PATH_NO_SETTINGS_NO_FIELDS;
+ else
+ nCurrentPathID = PATH_NO_SETTINGS;
+ else
+ if ( !bFieldsPage )
+ nCurrentPathID = PATH_NO_FIELDS;
+ else
+ nCurrentPathID = PATH_COMPLETE;
+ activatePath( nCurrentPathID, true );
+
+ m_aNewDataSource.disconnect();
+ m_aSettings.bIgnoreNoTable = false;
+ impl_updateRoadmap( _eType );
+ }
+
+//.........................................................................
+} // namespace abp
+//.........................................................................
+
diff --git a/extensions/source/abpilot/abspilot.hxx b/extensions/source/abpilot/abspilot.hxx
new file mode 100644
index 000000000000..7429f10d91cc
--- /dev/null
+++ b/extensions/source/abpilot/abspilot.hxx
@@ -0,0 +1,152 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: abspilot.hxx,v $
+ * $Revision: 1.8 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef EXTENSIONS_ABSPILOT_HXX
+#define EXTENSIONS_ABSPILOT_HXX
+
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <svtools/roadmapwizard.hxx>
+#include "addresssettings.hxx"
+#include <vcl/fixed.hxx>
+#include "datasourcehandling.hxx"
+
+//.........................................................................
+namespace abp
+{
+//.........................................................................
+
+ //=====================================================================
+ //= OAddessBookSourcePilot
+ //=====================================================================
+ typedef ::svt::RoadmapWizard OAddessBookSourcePilot_Base;
+ class OAddessBookSourcePilot : public OAddessBookSourcePilot_Base
+ {
+ protected:
+ ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >
+ m_xORB;
+ AddressSettings m_aSettings;
+
+ ODataSource m_aNewDataSource;
+ AddressSourceType m_eNewDataSourceType;
+
+ public:
+ /// ctor
+ OAddessBookSourcePilot(
+ Window* _pParent,
+ const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxORB);
+
+ /// get the service factory which was used to create the dialog
+ ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >
+ getORB() { return m_xORB; }
+ AddressSettings& getSettings() { return m_aSettings; }
+ const AddressSettings& getSettings() const { return m_aSettings; }
+
+ const ODataSource& getDataSource() const { return m_aNewDataSource; }
+
+ sal_Bool connectToDataSource( sal_Bool _bForceReConnect );
+
+ void travelNext( ) { OAddessBookSourcePilot_Base::travelNext(); }
+
+ /// to be called when the selected type changed
+ void typeSelectionChanged( AddressSourceType _eType );
+
+ protected:
+ // OWizardMachine overridables
+ virtual ::svt::OWizardPage* createPage( WizardState _nState );
+ virtual void enterState( WizardState _nState );
+ virtual sal_Bool prepareLeaveCurrentState( CommitPageReason _eReason );
+ virtual sal_Bool onFinish( sal_Int32 _nResult );
+
+ // RoadmapWizard
+ virtual String getStateDisplayName( WizardState _nState ) const;
+
+ virtual BOOL Close();
+
+ private:
+ DECL_LINK( OnCancelClicked, void* );
+
+ /** creates a new data source of the type indicated by m_aSettings
+ <p>If another data source has been created before, this one is deleted.</p>
+ */
+ void implCreateDataSource();
+
+ /// does an automatic field mapping (possible for all types except AST_OTHER)
+ void implDoAutoFieldMapping();
+
+ /// guesses a default for the table name, if no valid table is selected
+ void implDefaultTableName();
+
+ inline sal_Bool needAdminInvokationPage( AddressSourceType _eType ) const
+ {
+ return ( ( AST_LDAP == _eType )
+ || ( AST_OTHER == _eType )
+ );
+ }
+ /// check if with the current settings, we would need to invoke he administration dialog for more details about the data source
+ inline sal_Bool needAdminInvokationPage() const
+ {
+ return needAdminInvokationPage( m_aSettings.eType );
+ }
+
+ inline sal_Bool needManualFieldMapping( AddressSourceType _eType ) const
+ {
+ return ( AST_OTHER == _eType ) || ( AST_KAB == _eType ) ||
+ ( AST_EVOLUTION == _eType ) || ( AST_EVOLUTION_GROUPWISE == _eType ) ||
+ ( AST_EVOLUTION_LDAP == _eType );
+ }
+ /// checks if we need a manual (user-guided) field mapping
+ inline sal_Bool needManualFieldMapping() const
+ {
+ return needManualFieldMapping( m_aSettings.eType );
+ }
+
+ /// determines whether the given address book type does provide one table only
+ inline bool needTableSelection( AddressSourceType _eType ) const
+ {
+ return ( AST_LDAP != _eType ) && ( AST_KAB != _eType );
+ }
+
+ inline bool needTableSelection() const
+ {
+ return needTableSelection( m_aSettings.eType );
+ }
+
+ void implCleanup();
+ void implCommitAll();
+
+ void impl_updateRoadmap( AddressSourceType _eType );
+ };
+
+//.........................................................................
+} // namespace abp
+//.........................................................................
+
+#endif // EXTENSIONS_ABSPILOT_HXX
+
diff --git a/extensions/source/abpilot/abspilot.src b/extensions/source/abpilot/abspilot.src
new file mode 100644
index 000000000000..3bfa6ea844d6
--- /dev/null
+++ b/extensions/source/abpilot/abspilot.src
@@ -0,0 +1,379 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: abspilot.src,v $
+ * $Revision: 1.61 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef EXTENSIONS_ABPRESID_HRC
+#include "abpresid.hrc"
+#endif
+
+//........................................................................
+ModalDialog RID_DLG_ADDRESSBOOKSOURCEPILOT
+{
+ Text [ en-US ] = "Address Book Data Source Wizard" ;
+
+ HelpId = HID_ABSPILOT;
+
+ OutputSize = TRUE ;
+ SVLook = TRUE ;
+ Moveable = TRUE ;
+ Closeable = TRUE ;
+ Hide = TRUE;
+
+ String STR_SELECT_ABTYPE
+ {
+ Text [ en-US ] = "Address book type";
+ };
+
+ String STR_INVOKE_ADMIN_DIALOG
+ {
+ Text [ en-US ] = "Connection Settings";
+ };
+
+ String STR_TABLE_SELECTION
+ {
+ Text [ en-US ] = "Table selection";
+ };
+
+ String STR_MANUAL_FIELD_MAPPING
+ {
+ Text [ en-US ] = "Field Assignment";
+ };
+
+ String STR_FINAL_CONFIRM
+ {
+ Text [ en-US ] = "Data Source Title";
+ };
+};
+
+//........................................................................
+TabPage RID_PAGE_SELECTABTYPE
+{
+ SVLook = TRUE ;
+ Size = MAP_APPFONT ( WINDOW_SIZE_X , WINDOW_SIZE_Y ) ;
+
+ FixedText FT_TYPE_HINTS
+ {
+ Pos = MAP_APPFONT ( BORDER_X, 9 ) ;
+ Size = MAP_APPFONT ( WINDOW_SIZE_X - 2 * BORDER_X, 40 ) ;
+ WordBreak = TRUE;
+
+ Text [ en-US ] = "%PRODUCTNAME lets you access address data already present in your system. To do this, a %PRODUCTNAME data source will be created in which your address data is available in tabular form.\n\nThis wizard helps you create the data source.";
+ };
+
+ FixedLine FL_TYPE
+ {
+ Pos = MAP_APPFONT ( 7, 56 ) ;
+ Size = MAP_APPFONT ( WINDOW_SIZE_X - 14, 8 ) ;
+
+ Text [ en-US ] = "Please select the type of your external address book:";
+ };
+
+ RadioButton RB_EVOLUTION
+ {
+ Size = MAP_APPFONT ( WINDOW_SIZE_X - 30, 8 ) ;
+ Text [ en-US ] = "Evolution";
+ };
+ RadioButton RB_EVOLUTION_GROUPWISE
+ {
+ Size = MAP_APPFONT ( WINDOW_SIZE_X - 30, 8 ) ;
+ Text [ en-US ] = "Groupwise";
+ };
+ RadioButton RB_EVOLUTION_LDAP
+ {
+ Size = MAP_APPFONT ( WINDOW_SIZE_X - 30, 8 ) ;
+ Text [ en-US ] = "Evolution LDAP";
+ };
+ RadioButton RB_MORK
+ {
+ Size = MAP_APPFONT ( WINDOW_SIZE_X - 30, 8 ) ;
+ Text [ en-US ] = "Mozilla / Netscape";
+ };
+ RadioButton RB_THUNDERBIRD
+ {
+ Size = MAP_APPFONT ( WINDOW_SIZE_X - 30, 8 ) ;
+ Text [ en-US ] = "Thunderbird";
+ };
+ RadioButton RB_KAB
+ {
+ Size = MAP_APPFONT ( WINDOW_SIZE_X - 30, 8 ) ;
+ Text [ en-US ] = "KDE address book";
+ };
+ RadioButton RB_MACAB
+ {
+ Size = MAP_APPFONT ( WINDOW_SIZE_X - 30, 8 ) ;
+ Text [ en-US ] = "Mac OS X address book";
+ };
+ RadioButton RB_LDAP
+ {
+ Size = MAP_APPFONT ( WINDOW_SIZE_X - 30, 8 ) ;
+ Text [ en-US ] = "LDAP address data";
+ };
+ RadioButton RB_OUTLOOK
+ {
+ Size = MAP_APPFONT ( WINDOW_SIZE_X - 30, 8 ) ;
+ Text [ en-US ] = "Outlook address book";
+ };
+ RadioButton RB_OUTLOOKEXPRESS
+ {
+ Size = MAP_APPFONT ( WINDOW_SIZE_X - 30, 8 ) ;
+ Text [ en-US ] = "Windows system address book";
+ };
+ RadioButton RB_OTHER
+ {
+ Size = MAP_APPFONT ( WINDOW_SIZE_X - 30, 8 ) ;
+ Text [ en-US ] = "Other external data source";
+ };
+};
+
+//........................................................................
+TabPage RID_PAGE_ADMININVOKATION
+{
+ SVLook = TRUE ;
+ Size = MAP_APPFONT ( WINDOW_SIZE_X , WINDOW_SIZE_Y ) ;
+
+ FixedText FT_ADMINEXPLANATION
+ {
+ Pos = MAP_APPFONT ( BORDER_X, 9 ) ;
+ Size = MAP_APPFONT ( WINDOW_SIZE_X - 2 * BORDER_X, 48 ) ;
+ WordBreak = TRUE;
+
+ Text [ en-US ] = "To set up the new data source, additional information is required.\n\nClick the following button to open another dialog in which you then enter the necessary information.";
+ };
+
+ PushButton PB_INVOKE_ADMIN_DIALOG
+ {
+ Pos = MAP_APPFONT ( ( WINDOW_SIZE_X - BUTTON_SIZE_X ) / 2, 60 ) ;
+ Size = MAP_APPFONT ( BUTTON_SIZE_X, BUTTON_SIZE_Y ) ;
+
+ Text [ en-US ] = "Settings";
+ };
+
+ FixedText FT_ERROR
+ {
+ Pos = MAP_APPFONT ( BORDER_X, WINDOW_SIZE_Y - HEADER_SIZE_Y - 7 - 48 ) ;
+ Size = MAP_APPFONT ( WINDOW_SIZE_X - 2 * BORDER_X, 48 ) ;
+ WordBreak = TRUE;
+ Hide = TRUE;
+
+ Text [ en-US ] = "The connection to the data source could not be established.\nBefore you proceed, please check the settings made, or (on the previous page) choose another address data source type.";
+ };
+};
+
+//........................................................................
+TabPage RID_PAGE_TABLESELECTION_AB
+{
+ SVLook = TRUE ;
+ Size = MAP_APPFONT ( WINDOW_SIZE_X , WINDOW_SIZE_Y ) ;
+
+ FixedText FL_TOOMUCHTABLES
+ {
+ Pos = MAP_APPFONT ( BORDER_X, 9 ) ;
+ Size = MAP_APPFONT ( WINDOW_SIZE_X - 2 * BORDER_X, 24 ) ;
+ WordBreak = TRUE;
+
+ Text [ en-US ] = "The external data source you have chosen contains more than one address book.\nPlease select the one you mainly want to work with:";
+ };
+
+ ListBox LB_TABLELIST
+ {
+ Pos = MAP_APPFONT ( BORDER_X, 36 ) ;
+ Size = MAP_APPFONT ( WINDOW_SIZE_X - 2 * BORDER_X, 50 ) ;
+ SVLook = TRUE;
+ Sort = TRUE;
+ DropDown = FALSE;
+ AutoHScroll = TRUE;
+ Border = TRUE;
+ };
+};
+
+//........................................................................
+TabPage RID_PAGE_FIELDMAPPING
+{
+ SVLook = TRUE ;
+ Size = MAP_APPFONT ( WINDOW_SIZE_X , WINDOW_SIZE_Y ) ;
+
+ FixedText FT_FIELDASSIGMENTEXPL
+ {
+ Pos = MAP_APPFONT ( BORDER_X, 9 ) ;
+ Size = MAP_APPFONT ( WINDOW_SIZE_X - 2 * BORDER_X, 72 ) ;
+ WordBreak = TRUE;
+
+ Text [ en-US ] = "To incorporate the address data in your templates, %PRODUCTNAME has to know which fields contain which data.\n\nFor instance, you could have stored the e-mail addresses in a field named \"email\", or \"E-mail\" or \"EM\" - or something completely different.\n\nClick the button below to open another dialog where you can enter the settings for your data source.";
+ };
+
+ PushButton PB_INVOKE_FIELDS_DIALOG
+ {
+ Pos = MAP_APPFONT ( ( WINDOW_SIZE_X - BUTTON_SIZE_X ) / 2, 84 ) ;
+ Size = MAP_APPFONT ( BUTTON_SIZE_X, BUTTON_SIZE_Y ) ;
+
+ Text [ en-US ] = "Field Assignment";
+ };
+
+ FixedText FT_ASSIGNEDFIELDS
+ {
+ Pos = MAP_APPFONT ( BORDER_X, WINDOW_SIZE_Y - HEADER_SIZE_Y - 7 - 32 ) ;
+ Size = MAP_APPFONT ( WINDOW_SIZE_X - 2 * BORDER_X, 32 ) ;
+ WordBreak = TRUE;
+ };
+};
+
+//........................................................................
+TabPage RID_PAGE_FINAL
+{
+ SVLook = TRUE ;
+ Size = MAP_APPFONT ( WINDOW_SIZE_X , WINDOW_SIZE_Y ) ;
+
+ FixedText FT_FINISH_EXPL
+ {
+ Pos = MAP_APPFONT ( BORDER_X, 9 ) ;
+ Size = MAP_APPFONT ( WINDOW_SIZE_X - 2 * BORDER_X, 40 ) ;
+ WordBreak = TRUE;
+
+ Text [ en-US ] = "That was all the information necessary to integrate your address data into %PRODUCTNAME.\n\nNow, just enter the name under which you want to register the data source in %PRODUCTNAME.";
+ };
+
+ FixedText FT_LOCATION
+ {
+ Pos = MAP_APPFONT ( BORDER_X, 53 ) ;
+ Size = MAP_APPFONT ( 50, 8 ) ;
+ Group = TRUE;
+
+ Text [ en-US ] = "Location";
+ };
+
+ ComboBox CBB_LOCATION
+ {
+ Pos = MAP_APPFONT ( BORDER_X , 64 ) ;
+ Size = MAP_APPFONT ( WINDOW_SIZE_X - 53 - BORDER_X - BORDER_X, 12) ;
+ SVLook = TRUE;
+ Border = TRUE;
+ DropDown = TRUE ;
+ AutoHScroll = TRUE ;
+ };
+
+ PushButton PB_BROWSE
+ {
+ Pos = MAP_APPFONT ( WINDOW_SIZE_X - 50 - BORDER_X , 63 ) ;
+ Size = MAP_APPFONT ( 50, 14) ;
+ SVLook = TRUE;
+ Group = FALSE;
+
+ Text [ en-US ] = "Browse...";
+ };
+
+ CheckBox CB_REGISTER_DS
+ {
+ Pos = MAP_APPFONT ( BORDER_X, 82 ) ;
+ Size = MAP_APPFONT ( WINDOW_SIZE_X - BORDER_X - BORDER_X, 8) ;
+ SVLook = TRUE;
+ Group = TRUE;
+
+ Text [ en-US ] = "Make this address book available to all modules in %PRODUCTNAME.";
+ };
+ FixedText FT_NAME_EXPL
+ {
+ Pos = MAP_APPFONT ( BORDER_X + 10, 93 ) ;
+ Size = MAP_APPFONT ( WINDOW_SIZE_X - BORDER_X - BORDER_X - 10, 8 ) ;
+
+ Text [ en-US ] = "Address book name";
+ };
+
+ Edit ET_DATASOURCENAME
+ {
+ Pos = MAP_APPFONT ( BORDER_X + 10, 104 ) ;
+ Size = MAP_APPFONT ( WINDOW_SIZE_X - 56 - BORDER_X - BORDER_X - 10, 12) ;
+ SVLook = TRUE;
+ Border = TRUE;
+ };
+
+ FixedText FT_DUPLICATENAME
+ {
+ Pos = MAP_APPFONT ( BORDER_X + 10, WINDOW_SIZE_Y - HEADER_SIZE_Y - 7 - 24 ) ;
+ Size = MAP_APPFONT ( WINDOW_SIZE_X - 2 * BORDER_X, 24) ;
+ WordBreak = TRUE;
+ Hide = TRUE;
+ Group = FALSE;
+
+ Text [ en-US ] = "Another data source already has this name. As data sources have to have globally unique names, you need to choose another one.";
+ };
+};
+
+//........................................................................
+ErrorBox RID_ERR_NEEDTYPESELECTION
+{
+ Buttons = WB_OK;
+
+ Message [ en-US ] = "Please select a type of address book.";
+};
+
+//........................................................................
+QueryBox RID_QRY_NOTABLES
+{
+ Buttons = WB_YES_NO;
+ DefButton = WB_DEF_NO;
+
+ Message [ en-US ] = "The data source does not contain any tables.\nDo you want to set it up as an address data source, anyway?";
+};
+
+//........................................................................
+String RID_STR_DEFAULT_NAME
+{
+ Text [ en-US ] = "Addresses";
+};
+
+String RID_STR_ADMINDIALOGTITLE
+{
+ Text [ en-US ] = "Create Address Data Source";
+};
+
+String RID_STR_NOCONNECTION
+{
+ Text [ en-US ] = "The connection could not be established.";
+};
+
+String RID_STR_PLEASECHECKSETTINGS
+{
+ Text [ en-US ] = "Please check the settings made for the data source.";
+};
+
+String RID_STR_FIELDDIALOGTITLE
+{
+ Text [ en-US ] = "Address Data - Field Assignment";
+};
+
+String RID_STR_NOFIELDSASSIGNED
+{
+ Text [ en-US ] = "There are no fields assigned at this time.\nYou can either assign fields now or do so later by first choosing:\n\"File - Template - Address Book Source...\"";
+};
+
+//........................................................................
+Bitmap BMP_HEADERIMAGE
+{
+ file = "addresspilot.bmp";
+};
diff --git a/extensions/source/abpilot/addresssettings.hxx b/extensions/source/abpilot/addresssettings.hxx
new file mode 100644
index 000000000000..7059db95f97a
--- /dev/null
+++ b/extensions/source/abpilot/addresssettings.hxx
@@ -0,0 +1,82 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: addresssettings.hxx,v $
+ * $Revision: 1.11 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef EXTENSIONS_ABP_ADDRESSSETTINGS_HXX
+#define EXTENSIONS_ABP_ADDRESSSETTINGS_HXX
+
+#include <rtl/ustring.hxx>
+#include "abptypes.hxx"
+
+//.........................................................................
+namespace abp
+{
+//.........................................................................
+
+ //=====================================================================
+ //= AddressSourceType
+ //=====================================================================
+ enum AddressSourceType
+ {
+ AST_MORK,
+ AST_THUNDERBIRD,
+ AST_EVOLUTION,
+ AST_EVOLUTION_GROUPWISE,
+ AST_EVOLUTION_LDAP,
+ AST_KAB,
+ AST_MACAB,
+ AST_LDAP,
+ AST_OUTLOOK,
+ AST_OE,
+
+ AST_OTHER,
+
+ AST_INVALID
+ };
+
+ //=====================================================================
+ //= AddressSettings
+ //=====================================================================
+ struct AddressSettings
+ {
+ AddressSourceType eType;
+ ::rtl::OUString sDataSourceName;
+ ::rtl::OUString sRegisteredDataSourceName;
+ ::rtl::OUString sSelectedTable;
+ bool bIgnoreNoTable;
+ MapString2String aFieldMapping;
+ bool bRegisterDataSource;
+ };
+
+//.........................................................................
+} // namespace abp
+//.........................................................................
+
+#endif // EXTENSIONS_ABP_ADDRESSSETTINGS_HXX
+
diff --git a/extensions/source/abpilot/admininvokationimpl.cxx b/extensions/source/abpilot/admininvokationimpl.cxx
new file mode 100644
index 000000000000..712df3cfbe0b
--- /dev/null
+++ b/extensions/source/abpilot/admininvokationimpl.cxx
@@ -0,0 +1,140 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: admininvokationimpl.cxx,v $
+ * $Revision: 1.7 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_extensions.hxx"
+#include "admininvokationimpl.hxx"
+#include <tools/debug.hxx>
+#include <com/sun/star/beans/PropertyValue.hpp>
+#include <com/sun/star/ui/dialogs/XExecutableDialog.hpp>
+#include <com/sun/star/awt/XWindow.hpp>
+#include <vcl/stdtext.hxx>
+#ifndef _TOOLKIT_HELPER_VCLUNOHELPER_HXX_
+#include <toolkit/unohlp.hxx>
+#endif
+#ifndef EXTENSIONS_ABPRESID_HRC
+#include "abpresid.hrc"
+#endif
+#include "componentmodule.hxx"
+#include <vcl/waitobj.hxx>
+
+
+//.........................................................................
+namespace abp
+{
+//.........................................................................
+
+ using namespace ::com::sun::star::uno;
+ using namespace ::com::sun::star::lang;
+ using namespace ::com::sun::star::beans;
+ using namespace ::com::sun::star::awt;
+ using namespace ::com::sun::star::ui::dialogs;
+
+ //=====================================================================
+ //= OAdminDialogInvokation
+ //=====================================================================
+ //---------------------------------------------------------------------
+ OAdminDialogInvokation::OAdminDialogInvokation(const Reference< XMultiServiceFactory >& _rxORB
+ , const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > _xDataSource
+ , Window* _pMessageParent)
+ :m_xORB(_rxORB)
+ ,m_xDataSource(_xDataSource)
+ ,m_pMessageParent(_pMessageParent)
+ {
+ DBG_ASSERT(m_xORB.is(), "OAdminDialogInvokation::OAdminDialogInvokation: invalid service factory!");
+ DBG_ASSERT(m_xDataSource.is(), "OAdminDialogInvokation::OAdminDialogInvokation: invalid preferred name!");
+ DBG_ASSERT(m_pMessageParent, "OAdminDialogInvokation::OAdminDialogInvokation: invalid message parent!");
+ }
+
+ //---------------------------------------------------------------------
+ sal_Bool OAdminDialogInvokation::invokeAdministration( sal_Bool _bFixedType )
+ {
+ if (!m_xORB.is())
+ return sal_False;
+
+ try
+ {
+ // the service name of the administration dialog
+ const static ::rtl::OUString s_sAdministrationServiceName = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sdb.DatasourceAdministrationDialog"));
+ const static ::rtl::OUString s_sDataSourceTypeChangeDialog = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sdb.DataSourceTypeChangeDialog"));
+
+ // the parameters for the call
+ Sequence< Any > aArguments(3);
+ Any* pArguments = aArguments.getArray();
+
+ // the parent window
+ Reference< XWindow > xDialogParent = VCLUnoHelper::GetInterface(m_pMessageParent);
+ *pArguments++ <<= PropertyValue(::rtl::OUString::createFromAscii("ParentWindow"), -1, makeAny(xDialogParent), PropertyState_DIRECT_VALUE);
+
+ // the title of the dialog
+ String sAdminDialogTitle(ModuleRes(RID_STR_ADMINDIALOGTITLE));
+ *pArguments++ <<= PropertyValue(::rtl::OUString::createFromAscii("Title"), -1, makeAny(::rtl::OUString(sAdminDialogTitle)), PropertyState_DIRECT_VALUE);
+
+ // the name of the new data source
+ *pArguments++ <<= PropertyValue(::rtl::OUString::createFromAscii("InitialSelection"), -1, makeAny(m_xDataSource), PropertyState_DIRECT_VALUE);
+
+ // create the dialog
+ Reference< XExecutableDialog > xDialog;
+ {
+ // creating the dialog service is potentially expensive (if all the libraries invoked need to be loaded)
+ // so we display a wait cursor
+ WaitObject aWaitCursor(m_pMessageParent);
+ xDialog = Reference< XExecutableDialog >( m_xORB->createInstanceWithArguments( _bFixedType ? s_sAdministrationServiceName : s_sDataSourceTypeChangeDialog, aArguments ), UNO_QUERY );
+
+ // just for a smoother UI: What the dialog does upon execution, is (amongst other things) creating
+ // the DriverManager service
+ // If this context has never been accessed before, this may be expensive (it includes loading of
+ // at least one library).
+ // As this wizard is intended to run on the first office start, it is very likely that the
+ // context needs to be freshly created
+ // Thus, we access the context here (within the WaitCursor), which means the user sees a waitcursor
+ // while his/her office blocks a few seconds ....
+ m_xORB->createInstance( ::rtl::OUString::createFromAscii( "com.sun.star.sdbc.DriverManager" ) );
+ }
+
+ if (xDialog.is())
+ { // execute it
+ if (xDialog->execute())
+ return sal_True;
+ }
+ else
+ ShowServiceNotAvailableError(m_pMessageParent, s_sAdministrationServiceName, sal_True);
+ }
+ catch(const Exception&)
+ {
+ DBG_ERROR("OAdminDialogInvokation::invokeAdministration: caught an exception while executing the dialog!");
+ }
+ return sal_False;
+ }
+
+//.........................................................................
+} // namespace abp
+//.........................................................................
+
diff --git a/extensions/source/abpilot/admininvokationimpl.hxx b/extensions/source/abpilot/admininvokationimpl.hxx
new file mode 100644
index 000000000000..817833a6d428
--- /dev/null
+++ b/extensions/source/abpilot/admininvokationimpl.hxx
@@ -0,0 +1,73 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: admininvokationimpl.hxx,v $
+ * $Revision: 1.5 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef EXTENSIONS_ABP_ADMININVOKATIONIMPL_HXX
+#define EXTENSIONS_ABP_ADMININVOKATIONIMPL_HXX
+
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+
+
+class Window;
+//.........................................................................
+namespace abp
+{
+//.........................................................................
+
+ //=====================================================================
+ //= OAdminDialogInvokation
+ //=====================================================================
+ /** outsourced from AdminDialogInvokationPage, 'cause this class here, in opposite to
+ the page, needs exception handlíng to be enabled.
+ */
+ class OAdminDialogInvokation
+ {
+ private:
+ ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >
+ m_xORB;
+ ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > m_xDataSource;
+ Window* m_pMessageParent;
+
+ public:
+ OAdminDialogInvokation(
+ const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxORB,
+ const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > _xDataSource,
+ Window* _pMessageParent
+ );
+
+ sal_Bool invokeAdministration( sal_Bool _bFixedType );
+ };
+
+//.........................................................................
+} // namespace abp
+//.........................................................................
+
+#endif // EXTENSIONS_ABP_ADMININVOKATIONIMPL_HXX
+
diff --git a/extensions/source/abpilot/admininvokationpage.cxx b/extensions/source/abpilot/admininvokationpage.cxx
new file mode 100644
index 000000000000..cf35cef1e932
--- /dev/null
+++ b/extensions/source/abpilot/admininvokationpage.cxx
@@ -0,0 +1,117 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: admininvokationpage.cxx,v $
+ * $Revision: 1.10 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_extensions.hxx"
+#include "admininvokationpage.hxx"
+#include "abspilot.hxx"
+#include "admininvokationimpl.hxx"
+
+//.........................................................................
+namespace abp
+{
+//.........................................................................
+
+ //=====================================================================
+ //= AdminDialogInvokationPage
+ //=====================================================================
+ AdminDialogInvokationPage::AdminDialogInvokationPage( OAddessBookSourcePilot* _pParent )
+ :AddressBookSourcePage(_pParent, ModuleRes(RID_PAGE_ADMININVOKATION))
+ ,m_aExplanation (this, ModuleRes(FT_ADMINEXPLANATION))
+ ,m_aInvokeAdminDialog (this, ModuleRes(PB_INVOKE_ADMIN_DIALOG))
+ ,m_aErrorMessage (this, ModuleRes(FT_ERROR))
+ ,m_bSuccessfullyExecutedDialog(sal_False)
+ {
+ FreeResource();
+
+ m_aInvokeAdminDialog.SetClickHdl( LINK(this, AdminDialogInvokationPage, OnInvokeAdminDialog) );
+ }
+
+ //---------------------------------------------------------------------
+ void AdminDialogInvokationPage::ActivatePage()
+ {
+ AddressBookSourcePage::ActivatePage();
+ m_aInvokeAdminDialog.GrabFocus();
+ }
+
+ //---------------------------------------------------------------------
+ void AdminDialogInvokationPage::implUpdateErrorMessage()
+ {
+ const sal_Bool bIsConnected = getDialog()->getDataSource().isConnected();
+ m_aErrorMessage.Show( !bIsConnected );
+ }
+
+ //---------------------------------------------------------------------
+ void AdminDialogInvokationPage::initializePage()
+ {
+ AddressBookSourcePage::initializePage();
+ m_aErrorMessage.Hide();
+ // if we're entering this page, we assume we had no connection trial with this data source
+ }
+
+ //---------------------------------------------------------------------
+ void AdminDialogInvokationPage::implTryConnect()
+ {
+ getDialog()->connectToDataSource( sal_True );
+
+ // show our error message if and only if we could not connect
+ implUpdateErrorMessage();
+
+ // the status of the next button may have changed
+ updateDialogTravelUI();
+
+ // automatically go to the next page (if successfully connected)
+ if ( canAdvance() )
+ getDialog()->travelNext();
+ }
+
+ //---------------------------------------------------------------------
+ bool AdminDialogInvokationPage::canAdvance() const
+ {
+ return AddressBookSourcePage::canAdvance() && getDialog()->getDataSource().isConnected();
+ }
+
+ //---------------------------------------------------------------------
+ IMPL_LINK( AdminDialogInvokationPage, OnInvokeAdminDialog, void*, /*NOTINTERESTEDIN*/ )
+ {
+ OAdminDialogInvokation aInvokation( getORB(), getDialog()->getDataSource().getDataSource(), getDialog() );
+ if ( aInvokation.invokeAdministration( AST_LDAP == getSettings().eType ) )
+ {
+ // try to connect to this data source
+ implTryConnect();
+ }
+
+ return 0L;
+ }
+
+//.........................................................................
+} // namespace abp
+//.........................................................................
+
diff --git a/extensions/source/abpilot/admininvokationpage.hxx b/extensions/source/abpilot/admininvokationpage.hxx
new file mode 100644
index 000000000000..46331973796b
--- /dev/null
+++ b/extensions/source/abpilot/admininvokationpage.hxx
@@ -0,0 +1,76 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: admininvokationpage.hxx,v $
+ * $Revision: 1.6 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef EXTENSIONS_ABP_ADMINDIALOG_INVOKATION_PAGE_HXX
+#define EXTENSIONS_ABP_ADMINDIALOG_INVOKATION_PAGE_HXX
+
+#include "abspage.hxx"
+
+//.........................................................................
+namespace abp
+{
+//.........................................................................
+
+ //=====================================================================
+ //= AdminDialogInvokationPage
+ //=====================================================================
+ class AdminDialogInvokationPage : public AddressBookSourcePage
+ {
+ protected:
+ FixedText m_aExplanation;
+ PushButton m_aInvokeAdminDialog;
+ FixedText m_aErrorMessage;
+
+ sal_Bool m_bSuccessfullyExecutedDialog;
+
+ public:
+ AdminDialogInvokationPage( OAddessBookSourcePilot* _pParent );
+
+ protected:
+ // TabDialog overridables
+ virtual void ActivatePage();
+ virtual void initializePage();
+
+ // OImportPage overridables
+ virtual bool canAdvance() const;
+
+ private:
+ DECL_LINK( OnInvokeAdminDialog, void* );
+
+ void implTryConnect();
+ void implUpdateErrorMessage();
+ };
+
+//.........................................................................
+} // namespace abp
+//.........................................................................
+
+#endif // EXTENSIONS_ABP_ADMINDIALOG_INVOKATION_PAGE_HXX
+
diff --git a/extensions/source/abpilot/datasourcehandling.cxx b/extensions/source/abpilot/datasourcehandling.cxx
new file mode 100644
index 000000000000..14ad3543ac51
--- /dev/null
+++ b/extensions/source/abpilot/datasourcehandling.cxx
@@ -0,0 +1,679 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: datasourcehandling.cxx,v $
+ * $Revision: 1.15 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_extensions.hxx"
+#include "datasourcehandling.hxx"
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/container/XNameAccess.hpp>
+#include <com/sun/star/sdb/SQLContext.hpp>
+#include <com/sun/star/task/XInteractionHandler.hpp>
+#include <com/sun/star/lang/XSingleServiceFactory.hpp>
+#include <com/sun/star/frame/XStorable.hpp>
+#include <com/sun/star/uno/XNamingService.hpp>
+#include <com/sun/star/lang/XComponent.hpp>
+#include <com/sun/star/sdbc/XConnection.hpp>
+#include <com/sun/star/sdb/XCompletedConnection.hpp>
+#include <com/sun/star/sdb/XDocumentDataSource.hpp>
+#include <com/sun/star/sdbcx/XTablesSupplier.hpp>
+#include <tools/debug.hxx>
+#include <comphelper/interaction.hxx>
+#include <vcl/stdtext.hxx>
+#ifndef EXTENSIONS_ABPRESID_HRC
+#include "abpresid.hrc"
+#endif
+#include "componentmodule.hxx"
+#include "abptypes.hxx"
+#include <unotools/confignode.hxx>
+#include <unotools/sharedunocomponent.hxx>
+
+//.........................................................................
+namespace abp
+{
+//.........................................................................
+
+ using namespace ::utl;
+ using namespace ::comphelper;
+ using namespace ::com::sun::star::uno;
+ using namespace ::com::sun::star::lang;
+ using namespace ::com::sun::star::sdb;
+ using namespace ::com::sun::star::sdbc;
+ using namespace ::com::sun::star::task;
+ using namespace ::com::sun::star::beans;
+ using namespace ::com::sun::star::sdbcx;
+ using namespace ::com::sun::star::container;
+ using namespace ::com::sun::star::frame;
+
+ //=====================================================================
+ struct PackageAccessControl { };
+
+ //=====================================================================
+ //--------------------------------------------------------------------
+ static const ::rtl::OUString& getDbRegisteredNamesNodeName()
+ {
+ static ::rtl::OUString s_sNodeName = ::rtl::OUString::createFromAscii("org.openoffice.Office.DataAccess/RegisteredNames");
+ return s_sNodeName;
+ }
+
+ //--------------------------------------------------------------------
+ static const ::rtl::OUString& getDbNameNodeName()
+ {
+ static ::rtl::OUString s_sNodeName = ::rtl::OUString::createFromAscii("Name");
+ return s_sNodeName;
+ }
+
+ //--------------------------------------------------------------------
+ static const ::rtl::OUString& getDbLocationNodeName()
+ {
+ static ::rtl::OUString s_sNodeName = ::rtl::OUString::createFromAscii("Location");
+ return s_sNodeName;
+ }
+ //---------------------------------------------------------------------
+ static Reference< XNameAccess > lcl_getDataSourceContext( const Reference< XMultiServiceFactory >& _rxORB ) SAL_THROW (( Exception ))
+ {
+ Reference< XNameAccess > xContext( _rxORB->createInstance( ::rtl::OUString::createFromAscii( "com.sun.star.sdb.DatabaseContext" ) ), UNO_QUERY );
+ DBG_ASSERT(xContext.is(), "lcl_getDataSourceContext: could not access the data source context!");
+ return xContext;
+ }
+
+ //---------------------------------------------------------------------
+ /// creates a new data source and inserts it into the context
+ static void lcl_implCreateAndInsert(
+ const Reference< XMultiServiceFactory >& _rxORB, const ::rtl::OUString& _rName,
+ Reference< XPropertySet >& /* [out] */ _rxNewDataSource ) SAL_THROW (( ::com::sun::star::uno::Exception ))
+ {
+ //.............................................................
+ // get the data source context
+ Reference< XNameAccess > xContext = lcl_getDataSourceContext( _rxORB );
+
+ DBG_ASSERT( !xContext->hasByName( _rName ), "lcl_implCreateAndInsert: name already used!" );
+ (void)_rName;
+
+ //.............................................................
+ // create a new data source
+ Reference< XSingleServiceFactory > xFactory( xContext, UNO_QUERY );
+ Reference< XPropertySet > xNewDataSource;
+ if (xFactory.is())
+ xNewDataSource = Reference< XPropertySet >( xFactory->createInstance(), UNO_QUERY );
+ DBG_ASSERT( xNewDataSource.is(), "lcl_implCreateAndInsert: could not create a new data source!" );
+
+ //.............................................................
+ // insert the data source into the context
+ Reference< XNamingService > xDynamicContext( xContext, UNO_QUERY );
+ DBG_ASSERT( xDynamicContext.is(), "lcl_implCreateAndInsert: missing an interface on the context (XNamingService)!" );
+ if (xDynamicContext.is())
+ {
+ // xDynamicContext->registerObject( _rName, xNewDataSource );
+ _rxNewDataSource = xNewDataSource;
+ }
+ }
+
+ //---------------------------------------------------------------------
+ /// creates and inserts a data source, and sets it's URL property to the string given
+ static ODataSource lcl_implCreateAndSetURL(
+ const Reference< XMultiServiceFactory >& _rxORB, const ::rtl::OUString& _rName,
+ const sal_Char* _pInitialAsciiURL ) SAL_THROW (( ))
+ {
+ ODataSource aReturn( _rxORB );
+ try
+ {
+ // create the new data source
+ Reference< XPropertySet > xNewDataSource;
+ lcl_implCreateAndInsert( _rxORB, _rName, xNewDataSource );
+
+ //.............................................................
+ // set the URL property
+ if (xNewDataSource.is())
+ {
+ xNewDataSource->setPropertyValue(
+ ::rtl::OUString::createFromAscii( "URL" ),
+ makeAny( ::rtl::OUString::createFromAscii( _pInitialAsciiURL ) )
+ );
+ }
+
+ aReturn.setDataSource( xNewDataSource, _rName,PackageAccessControl() );
+ }
+ catch(const Exception&)
+ {
+ DBG_ERROR( "lcl_implCreateAndSetURL: caught an exception while creating the data source!" );
+ }
+
+ return aReturn;
+ }
+ //---------------------------------------------------------------------
+ void lcl_registerDataSource(
+ const Reference< XMultiServiceFactory >& _rxORB, const ::rtl::OUString& _sName,
+ const ::rtl::OUString& _sURL ) SAL_THROW (( ::com::sun::star::uno::Exception ))
+ {
+ // the config node where all pooling relevant info are stored under
+ OConfigurationTreeRoot aDbRegisteredNamesRoot = OConfigurationTreeRoot::createWithServiceFactory(
+ _rxORB, getDbRegisteredNamesNodeName(), -1, OConfigurationTreeRoot::CM_UPDATABLE);
+
+ if (!aDbRegisteredNamesRoot.isValid())
+ // already asserted by the OConfigurationTreeRoot
+ return;
+
+ OSL_ENSURE(_sName.getLength(),"No Name given!");
+ OSL_ENSURE(_sURL.getLength(),"No URL given!");
+
+ OConfigurationNode aThisDriverSettings;
+ if ( aDbRegisteredNamesRoot.hasByName(_sName) )
+ aThisDriverSettings = aDbRegisteredNamesRoot.openNode(_sName);
+ else
+ aThisDriverSettings = aDbRegisteredNamesRoot.createNode(_sName);
+
+ // set the values
+ aThisDriverSettings.setNodeValue(getDbNameNodeName(), makeAny(_sName));
+ aThisDriverSettings.setNodeValue(getDbLocationNodeName(), makeAny(_sURL));
+
+ aDbRegisteredNamesRoot.commit();
+ }
+
+ //=====================================================================
+ //= ODataSourceContextImpl
+ //=====================================================================
+ struct ODataSourceContextImpl
+ {
+ Reference< XMultiServiceFactory > xORB;
+ Reference< XNameAccess > xContext; /// the UNO data source context
+ StringBag aDataSourceNames; /// for quicker name checks (without the UNO overhead)
+
+ ODataSourceContextImpl( const Reference< XMultiServiceFactory >& _rxORB ) : xORB( _rxORB ) { }
+ ODataSourceContextImpl( const ODataSourceContextImpl& _rSource )
+ :xORB ( _rSource.xORB )
+ ,xContext ( _rSource.xContext )
+ {
+ }
+ };
+
+ //=====================================================================
+ //= ODataSourceContext
+ //=====================================================================
+ //---------------------------------------------------------------------
+ ODataSourceContext::ODataSourceContext(const Reference< XMultiServiceFactory >& _rxORB)
+ :m_pImpl( new ODataSourceContextImpl( _rxORB ) )
+ {
+ try
+ {
+ // create the UNO context
+ m_pImpl->xContext = lcl_getDataSourceContext( _rxORB );
+
+ if (m_pImpl->xContext.is())
+ {
+ // collect the data source names
+ Sequence< ::rtl::OUString > aDSNames = m_pImpl->xContext->getElementNames();
+ const ::rtl::OUString* pDSNames = aDSNames.getConstArray();
+ const ::rtl::OUString* pDSNamesEnd = pDSNames + aDSNames.getLength();
+
+ for ( ;pDSNames != pDSNamesEnd; ++pDSNames )
+ m_pImpl->aDataSourceNames.insert( *pDSNames );
+ }
+ }
+ catch( const Exception& )
+ {
+ DBG_ERROR( "ODataSourceContext::ODataSourceContext: caught an exception!" );
+ }
+ }
+
+ //---------------------------------------------------------------------
+ ::rtl::OUString& ODataSourceContext::disambiguate(::rtl::OUString& _rDataSourceName)
+ {
+ ::rtl::OUString sCheck( _rDataSourceName );
+ ConstStringBagIterator aPos = m_pImpl->aDataSourceNames.find( sCheck );
+
+ sal_Int32 nPostFix = 1;
+ while ( ( m_pImpl->aDataSourceNames.end() != aPos ) && ( nPostFix < 65535 ) )
+ { // there already is a data source with this name
+ sCheck = _rDataSourceName;
+ sCheck += ::rtl::OUString::valueOf( nPostFix++ );
+
+ aPos = m_pImpl->aDataSourceNames.find( sCheck );
+ }
+
+ _rDataSourceName = sCheck;
+ return _rDataSourceName;
+ }
+
+ //---------------------------------------------------------------------
+ void ODataSourceContext::getDataSourceNames( StringBag& _rNames ) const SAL_THROW (( ))
+ {
+ _rNames = m_pImpl->aDataSourceNames;
+ }
+
+ //---------------------------------------------------------------------
+ ODataSource ODataSourceContext::createNewLDAP( const ::rtl::OUString& _rName) SAL_THROW (( ))
+ {
+ return lcl_implCreateAndSetURL( m_pImpl->xORB, _rName, "sdbc:address:ldap:" );
+ }
+
+ //---------------------------------------------------------------------
+ ODataSource ODataSourceContext::createNewMORK( const ::rtl::OUString& _rName) SAL_THROW (( ))
+ {
+ return lcl_implCreateAndSetURL( m_pImpl->xORB, _rName, "sdbc:address:mozilla" );
+ }
+
+ //---------------------------------------------------------------------
+ ODataSource ODataSourceContext::createNewThunderbird( const ::rtl::OUString& _rName ) SAL_THROW (( ))
+ {
+ return lcl_implCreateAndSetURL( m_pImpl->xORB, _rName, "sdbc:address:thunderbird" );
+ }
+
+ //---------------------------------------------------------------------
+ ODataSource ODataSourceContext::createNewEvolutionLdap( const ::rtl::OUString& _rName) SAL_THROW (( ))
+ {
+ return lcl_implCreateAndSetURL( m_pImpl->xORB, _rName, "sdbc:address:evolution:ldap" );
+ }
+ //---------------------------------------------------------------------
+ ODataSource ODataSourceContext::createNewEvolutionGroupwise( const ::rtl::OUString& _rName) SAL_THROW (( ))
+ {
+ return lcl_implCreateAndSetURL( m_pImpl->xORB, _rName, "sdbc:address:evolution:groupwise" );
+ }
+ //---------------------------------------------------------------------
+ ODataSource ODataSourceContext::createNewEvolution( const ::rtl::OUString& _rName) SAL_THROW (( ))
+ {
+ return lcl_implCreateAndSetURL( m_pImpl->xORB, _rName, "sdbc:address:evolution:local" );
+ }
+
+ //---------------------------------------------------------------------
+ ODataSource ODataSourceContext::createNewKab( const ::rtl::OUString& _rName) SAL_THROW (( ))
+ {
+ return lcl_implCreateAndSetURL( m_pImpl->xORB, _rName, "sdbc:address:kab" );
+ }
+
+ //---------------------------------------------------------------------
+ ODataSource ODataSourceContext::createNewMacab( const ::rtl::OUString& _rName) SAL_THROW (( ))
+ {
+ return lcl_implCreateAndSetURL( m_pImpl->xORB, _rName, "sdbc:address:macab" );
+ }
+
+ //---------------------------------------------------------------------
+ ODataSource ODataSourceContext::createNewOutlook( const ::rtl::OUString& _rName) SAL_THROW (( ))
+ {
+ return lcl_implCreateAndSetURL( m_pImpl->xORB, _rName, "sdbc:address:outlook" );
+ }
+
+ //---------------------------------------------------------------------
+ ODataSource ODataSourceContext::createNewOE( const ::rtl::OUString& _rName) SAL_THROW (( ))
+ {
+ return lcl_implCreateAndSetURL( m_pImpl->xORB, _rName, "sdbc:address:outlookexp" );
+ }
+
+ //---------------------------------------------------------------------
+ ODataSource ODataSourceContext::createNewDBase( const ::rtl::OUString& _rName) SAL_THROW (( ))
+ {
+ return lcl_implCreateAndSetURL( m_pImpl->xORB, _rName, "sdbc:dbase:" );
+ }
+
+ //=====================================================================
+ //= ODataSourceImpl
+ //=====================================================================
+ struct ODataSourceImpl
+ {
+ public:
+ Reference< XMultiServiceFactory > xORB; /// the service factory
+ Reference< XPropertySet > xDataSource; /// the UNO data source
+ ::utl::SharedUNOComponent< XConnection >
+ xConnection;
+ StringBag aTables; // the cached table names
+ ::rtl::OUString sName;
+ sal_Bool bTablesUpToDate; // table name cache up-to-date?
+
+ ODataSourceImpl( const Reference< XMultiServiceFactory >& _rxORB )
+ :xORB( _rxORB )
+ ,bTablesUpToDate( sal_False )
+ {
+ }
+
+ ODataSourceImpl( const ODataSourceImpl& _rSource );
+ };
+
+ //---------------------------------------------------------------------
+ ODataSourceImpl::ODataSourceImpl( const ODataSourceImpl& _rSource )
+ :xORB( _rSource.xORB )
+ ,xDataSource( _rSource.xDataSource )
+ ,xConnection( _rSource.xConnection )
+ ,aTables( _rSource.aTables )
+ ,sName( _rSource.sName )
+ ,bTablesUpToDate( _rSource.bTablesUpToDate )
+ {
+ }
+
+ //=====================================================================
+ //= ODataSource
+ //=====================================================================
+ //---------------------------------------------------------------------
+ ODataSource::ODataSource( const Reference< XMultiServiceFactory >& _rxORB, const ::rtl::OUString& _rName )
+ :m_pImpl(new ODataSourceImpl(_rxORB))
+ {
+ try
+ {
+ // get the data source context
+ Reference< XNameAccess > xContext = lcl_getDataSourceContext( m_pImpl->xORB );
+
+ // retrieve the UNO data source
+ if (xContext.is())
+ xContext->getByName( _rName ) >>= m_pImpl->xDataSource;
+ }
+ catch(const Exception&)
+ {
+ DBG_ERROR("ODataSource::ODataSource: could not access the requested data source (caught an exception)!");
+ }
+ }
+
+ //---------------------------------------------------------------------
+ ODataSource::ODataSource( const ODataSource& _rSource )
+ :m_pImpl( NULL )
+ {
+ *this = _rSource;
+ }
+
+ //---------------------------------------------------------------------
+ ODataSource& ODataSource::operator=( const ODataSource& _rSource )
+ {
+ delete m_pImpl;
+ m_pImpl = new ODataSourceImpl( *_rSource.m_pImpl );
+
+ return *this;
+ }
+
+ //---------------------------------------------------------------------
+ ODataSource::ODataSource( const Reference< XMultiServiceFactory >& _rxORB )
+ :m_pImpl(new ODataSourceImpl(_rxORB))
+ {
+ }
+
+ //---------------------------------------------------------------------
+ ODataSource::~ODataSource( )
+ {
+ delete m_pImpl;
+ }
+
+ //---------------------------------------------------------------------
+ void ODataSource::store() SAL_THROW (( ))
+ {
+ if (!isValid())
+ // nothing to do
+ return;
+ try
+ {
+ Reference< XDocumentDataSource > xDocAccess( m_pImpl->xDataSource, UNO_QUERY );
+ Reference< XStorable > xStorable;
+ if ( xDocAccess.is() )
+ xStorable = xStorable.query( xDocAccess->getDatabaseDocument() );
+ OSL_ENSURE( xStorable.is(),"DataSource is no XStorable!" );
+ if ( xStorable.is() )
+ xStorable->storeAsURL(m_pImpl->sName,Sequence<PropertyValue>());
+ }
+ catch(const Exception&)
+ {
+ DBG_ERROR( "ODataSource::registerDataSource: caught an exception while creating the data source!" );
+ }
+ }
+ //---------------------------------------------------------------------
+ void ODataSource::registerDataSource( const ::rtl::OUString& _sRegisteredDataSourceName) SAL_THROW (( ))
+ {
+ if (!isValid())
+ // nothing to do
+ return;
+
+ try
+ {
+ // invalidate ourself
+ lcl_registerDataSource(m_pImpl->xORB,_sRegisteredDataSourceName,m_pImpl->sName);
+ }
+ catch(const Exception&)
+ {
+ DBG_ERROR( "ODataSource::registerDataSource: caught an exception while creating the data source!" );
+ }
+ }
+
+ //---------------------------------------------------------------------
+ void ODataSource::setDataSource( const Reference< XPropertySet >& _rxDS,const ::rtl::OUString& _sName, PackageAccessControl )
+ {
+ if (m_pImpl->xDataSource.get() == _rxDS.get())
+ // nothing to do
+ return;
+
+ if ( isConnected() )
+ disconnect();
+
+ m_pImpl->sName = _sName;
+ m_pImpl->xDataSource = _rxDS;
+ }
+
+ //---------------------------------------------------------------------
+ void ODataSource::remove() SAL_THROW (( ))
+ {
+ if (!isValid())
+ // nothing to do
+ return;
+
+ try
+ {
+ // invalidate ourself
+ m_pImpl->xDataSource.clear();
+ }
+ catch(const Exception&)
+ {
+ DBG_ERROR( "ODataSource::remove: caught an exception while creating the data source!" );
+ }
+ }
+
+ //---------------------------------------------------------------------
+ sal_Bool ODataSource::rename( const ::rtl::OUString& _rName ) SAL_THROW (( ))
+ {
+ if (!isValid())
+ // nothing to do
+ return sal_False;
+
+ m_pImpl->sName = _rName;
+ return sal_True;
+ }
+
+ //---------------------------------------------------------------------
+ ::rtl::OUString ODataSource::getName() const SAL_THROW (( ))
+ {
+ if ( !isValid() )
+ return ::rtl::OUString();
+ return m_pImpl->sName;
+ }
+
+ //---------------------------------------------------------------------
+ bool ODataSource::hasTable( const ::rtl::OUString& _rTableName ) const
+ {
+ if ( !isConnected() )
+ return false;
+
+ const StringBag& aTables( getTableNames() );
+ return aTables.find( _rTableName ) != aTables.end();
+ }
+
+ //---------------------------------------------------------------------
+ const StringBag& ODataSource::getTableNames() const SAL_THROW (( ))
+ {
+ m_pImpl->aTables.clear();
+ if ( !isConnected() )
+ {
+ DBG_ERROR( "ODataSource::getTableNames: not connected!" );
+ }
+ else
+ {
+ try
+ {
+ // get the tables container from the connection
+ Reference< XTablesSupplier > xSuppTables( m_pImpl->xConnection.getTyped(), UNO_QUERY );
+ Reference< XNameAccess > xTables;
+ if ( xSuppTables.is( ) )
+ xTables = xSuppTables->getTables();
+ DBG_ASSERT( xTables.is(), "ODataSource::getTableNames: could not retrieve the tables container!" );
+
+ // get the names
+ Sequence< ::rtl::OUString > aTableNames;
+ if ( xTables.is( ) )
+ aTableNames = xTables->getElementNames( );
+
+ // copy the names
+ const ::rtl::OUString* pTableNames = aTableNames.getConstArray();
+ const ::rtl::OUString* pTableNamesEnd = pTableNames + aTableNames.getLength();
+ for (;pTableNames < pTableNamesEnd; ++pTableNames)
+ m_pImpl->aTables.insert( *pTableNames );
+ }
+ catch(const Exception&)
+ {
+ }
+ }
+
+ // now the table cache is up-to-date
+ m_pImpl->bTablesUpToDate = sal_True;
+ return m_pImpl->aTables;
+ }
+
+ //---------------------------------------------------------------------
+ sal_Bool ODataSource::connect( Window* _pMessageParent ) SAL_THROW (( ))
+ {
+ if ( isConnected( ) )
+ // nothing to do
+ return sal_True;
+
+ // ................................................................
+ // create the interaction handler (needed for authentication and error handling)
+ static ::rtl::OUString s_sInteractionHandlerServiceName = ::rtl::OUString::createFromAscii("com.sun.star.sdb.InteractionHandler");
+ Reference< XInteractionHandler > xInteractions;
+ try
+ {
+ xInteractions = Reference< XInteractionHandler >(
+ m_pImpl->xORB->createInstance( s_sInteractionHandlerServiceName ),
+ UNO_QUERY
+ );
+ }
+ catch(const Exception&)
+ {
+ }
+
+ // ................................................................
+ // failure to create the interaction handler is a serious issue ...
+ if (!xInteractions.is())
+ {
+ if ( _pMessageParent )
+ ShowServiceNotAvailableError( _pMessageParent, s_sInteractionHandlerServiceName, sal_True );
+ return sal_False;
+ }
+
+ // ................................................................
+ // open the connection
+ Any aError;
+ Reference< XConnection > xConnection;
+ try
+ {
+ Reference< XCompletedConnection > xComplConn( m_pImpl->xDataSource, UNO_QUERY );
+ DBG_ASSERT( xComplConn.is(), "ODataSource::connect: missing the XCompletedConnection interface on the data source!" );
+ if ( xComplConn.is() )
+ xConnection = xComplConn->connectWithCompletion( xInteractions );
+ }
+ catch( const SQLContext& e ) { aError <<= e; }
+ catch( const SQLWarning& e ) { aError <<= e; }
+ catch( const SQLException& e ) { aError <<= e; }
+ catch( const Exception& )
+ {
+ DBG_ERROR( "ODataSource::connect: caught a generic exception!" );
+ }
+
+ // ................................................................
+ // handle errors
+ if ( aError.hasValue() && _pMessageParent )
+ {
+ try
+ {
+ SQLException aException;
+ aError >>= aException;
+ if ( !aException.Message.getLength() )
+ {
+ // prepend some context info
+ SQLContext aDetailedError;
+ aDetailedError.Message = String( ModuleRes( RID_STR_NOCONNECTION ) );
+ aDetailedError.Details = String( ModuleRes( RID_STR_PLEASECHECKSETTINGS ) );
+ aDetailedError.NextException = aError;
+ // handle (aka display) the new context info
+ xInteractions->handle( new OInteractionRequest( makeAny( aDetailedError ) ) );
+ }
+ else
+ {
+ // handle (aka display) the original error
+ xInteractions->handle( new OInteractionRequest( makeAny( aException ) ) );
+ }
+ }
+ catch( const Exception& )
+ {
+ DBG_ERROR( "ODataSource::connect: caught an exception while trying to display the error!" );
+ }
+ }
+
+ if ( !xConnection.is() )
+ return sal_False;
+
+ // ................................................................
+ // success
+ m_pImpl->xConnection.reset( xConnection );
+ m_pImpl->aTables.clear();
+ m_pImpl->bTablesUpToDate = sal_False;
+
+ return sal_True;
+ }
+
+ //---------------------------------------------------------------------
+ void ODataSource::disconnect( ) SAL_THROW (( ))
+ {
+ m_pImpl->xConnection.clear();
+ m_pImpl->aTables.clear();
+ m_pImpl->bTablesUpToDate = sal_False;
+ }
+
+ //---------------------------------------------------------------------
+ sal_Bool ODataSource::isConnected( ) const SAL_THROW (( ))
+ {
+ return m_pImpl->xConnection.is();
+ }
+
+ //---------------------------------------------------------------------
+ sal_Bool ODataSource::isValid() const SAL_THROW (( ))
+ {
+ return m_pImpl && m_pImpl->xDataSource.is();
+ }
+ //---------------------------------------------------------------------
+ Reference< XPropertySet > ODataSource::getDataSource() const SAL_THROW (( ))
+ {
+ return m_pImpl ? m_pImpl->xDataSource : Reference< XPropertySet >();
+ }
+
+//.........................................................................
+} // namespace abp
+//.........................................................................
+
diff --git a/extensions/source/abpilot/datasourcehandling.hxx b/extensions/source/abpilot/datasourcehandling.hxx
new file mode 100644
index 000000000000..074530c86e59
--- /dev/null
+++ b/extensions/source/abpilot/datasourcehandling.hxx
@@ -0,0 +1,229 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: datasourcehandling.hxx,v $
+ * $Revision: 1.11 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef EXTENSIONS_ABP_DATASOURCEHANDLING_HXX
+#define EXTENSIONS_ABP_DATASOURCEHANDLING_HXX
+
+#include <com/sun/star/uno/Reference.hxx>
+#include "abptypes.hxx"
+
+//========================================================================
+namespace com { namespace sun { namespace star {
+ namespace lang {
+ class XMultiServiceFactory;
+ }
+ namespace beans {
+ class XPropertySet;
+ }
+} } }
+
+class Window;
+
+
+//.........................................................................
+namespace abp
+{
+//.........................................................................
+
+ //=====================================================================
+ //= ODataSourceContext
+ //=====================================================================
+ struct ODataSourceContextImpl;
+ class ODataSource;
+ /// a non-UNO wrapper for the data source context
+ class ODataSourceContext
+ {
+ private:
+ ODataSourceContextImpl* m_pImpl;
+
+ public:
+ ODataSourceContext(
+ const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxORB
+ );
+
+ /// retrieves the names of all data sources
+ void getDataSourceNames( StringBag& _rNames ) const SAL_THROW (( ));
+
+ /// disambiguates the given name by appending auccessive numbers
+ ::rtl::OUString& disambiguate(::rtl::OUString& _rDataSourceName);
+
+ /// creates a new MORK data source
+ ODataSource createNewMORK( const ::rtl::OUString& _rName ) SAL_THROW (( ));
+
+ /// creates a new Thunderbird data source
+ ODataSource createNewThunderbird( const ::rtl::OUString& _rName ) SAL_THROW (( ));
+
+ /// creates a new Evolution local data source
+ ODataSource createNewEvolution( const ::rtl::OUString& _rName ) SAL_THROW (( ));
+
+ /// creates a new Evolution LDAP data source
+ ODataSource createNewEvolutionLdap( const ::rtl::OUString& _rName ) SAL_THROW (( ));
+
+ /// creates a new Evolution GROUPWISE data source
+ ODataSource createNewEvolutionGroupwise( const ::rtl::OUString& _rName ) SAL_THROW (( ));
+
+ /// creates a new KDE address book data source
+ ODataSource createNewKab( const ::rtl::OUString& _rName ) SAL_THROW (( ));
+
+ /// creates a new Mac OS X address book data source
+ ODataSource createNewMacab( const ::rtl::OUString& _rName ) SAL_THROW (( ));
+
+ /// creates a new LDAP data source
+ ODataSource createNewLDAP( const ::rtl::OUString& _rName ) SAL_THROW (( ));
+
+ /// creates a new Outlook data source
+ ODataSource createNewOutlook( const ::rtl::OUString& _rName ) SAL_THROW (( ));
+
+ /// creates a new Outlook express data source
+ ODataSource createNewOE( const ::rtl::OUString& _rName ) SAL_THROW (( ));
+
+ /// creates a new dBase data source
+ ODataSource createNewDBase( const ::rtl::OUString& _rName ) SAL_THROW (( ));
+ };
+
+ //=====================================================================
+ //= ODataSource
+ //=====================================================================
+ struct ODataSourceImpl;
+ struct PackageAccessControl;
+ /** a non-UNO wrapper for a data source
+ <p>This class allows to access data sources without the need to compile the respective file with
+ exception handling enabled (hopefully :).</p>
+ <p>In addition to wrapping an UNO data source, an instance of this class can handle at most
+ one valid connection, as obtained from the data source.</p>
+ */
+ class ODataSource
+ {
+ private:
+ ODataSourceImpl* m_pImpl;
+
+ public:
+ // ----------------------------------------------------------------
+ // - ctor/dtor/assignment
+ // ----------------------------------------------------------------
+ /** ctor
+ @param _rxORB
+ the service factory to use to access the UNO objects
+ @param _rName
+ the name of the data source the object should represent
+ */
+ ODataSource(
+ const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxORB,
+ const ::rtl::OUString& _rName
+ );
+
+ /// constructs an object which is initially invalid
+ ODataSource(
+ const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxORB
+ );
+
+ /// copy ctor
+ ODataSource( const ODataSource& _rSource );
+
+ /// dtor
+ ~ODataSource( );
+
+ /// assignment
+ ODataSource& operator=( const ODataSource& _rSource );
+
+ // ----------------------------------------------------------------
+ /// checks whether or not the object represents a valid data source
+ sal_Bool isValid() const SAL_THROW (( ));
+
+ // ----------------------------------------------------------------
+ /// removes the data source represented by the object from the data source context
+ void remove() SAL_THROW (( ));
+ // TODO: put this into the context class
+
+ /// returns the name of the data source
+ ::rtl::OUString
+ getName() const SAL_THROW (( ));
+
+ /// renames the data source
+ sal_Bool rename( const ::rtl::OUString& _rName ) SAL_THROW (( ));
+ // TODO: put this into the context class
+
+ // ----------------------------------------------------------------
+ // - connection handling
+ // ----------------------------------------------------------------
+ /** connects to the data source represented by this object
+ @param _pMessageParent
+ the window to use as parent for any error messages. If this is <NULL/>, no messages are displayed
+ at all.
+ @see isConnected
+ */
+ sal_Bool connect( Window* _pMessageParent ) SAL_THROW (( ));
+
+ /// returns <TRUE/> if the object has a valid connection, obtained from it's data source
+ sal_Bool isConnected( ) const SAL_THROW (( ));
+
+ /// disconnects from the data source (i.e. disposes the UNO connection hold internally)
+ void disconnect( ) SAL_THROW (( ));
+
+ /// stores the database file
+ void store() SAL_THROW (( ));
+
+ /// register the data source under the given name in the configuration
+ void registerDataSource( const ::rtl::OUString& _sRegisteredDataSourceName ) SAL_THROW (( ));
+
+ // ----------------------------------------------------------------
+ /** retrieves the tables names from the connection
+ <p>to be called when <method>isConnection</method> returns <TRUE/> only</p>
+ */
+ const StringBag& getTableNames() const SAL_THROW (( ));
+
+ /** determines whether a given table exists
+ */
+ bool hasTable( const ::rtl::OUString& _rTableName ) const;
+
+ /// return the intern data source object
+ ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > getDataSource() const SAL_THROW (( ));
+
+
+ // ----------------------------------------------------------------
+ /** set a new data source.
+ <p>Available to selected clients only</p>
+ */
+ void setDataSource(
+ const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxDS
+ ,const ::rtl::OUString& _sName
+ ,PackageAccessControl
+ );
+
+ private:
+ ODataSource( ); // never implemented
+ };
+
+//.........................................................................
+} // namespace abp
+//.........................................................................
+
+#endif // EXTENSIONS_ABP_DATASOURCEHANDLING_HXX
+
diff --git a/extensions/source/abpilot/exports.dxp b/extensions/source/abpilot/exports.dxp
new file mode 100644
index 000000000000..9630d7e06768
--- /dev/null
+++ b/extensions/source/abpilot/exports.dxp
@@ -0,0 +1,3 @@
+component_getImplementationEnvironment
+component_writeInfo
+component_getFactory
diff --git a/extensions/source/abpilot/fieldmappingimpl.cxx b/extensions/source/abpilot/fieldmappingimpl.cxx
new file mode 100644
index 000000000000..fd01ffed0fef
--- /dev/null
+++ b/extensions/source/abpilot/fieldmappingimpl.cxx
@@ -0,0 +1,378 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: fieldmappingimpl.cxx,v $
+ * $Revision: 1.9 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_extensions.hxx"
+#include "fieldmappingimpl.hxx"
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/beans/PropertyValue.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/ui/dialogs/XExecutableDialog.hpp>
+#include <com/sun/star/awt/XWindow.hpp>
+#include <com/sun/star/sdb/CommandType.hpp>
+#include <tools/debug.hxx>
+#ifndef _TOOLKIT_HELPER_VCLUNOHELPER_HXX_
+#include <toolkit/unohlp.hxx>
+#endif
+#include <vcl/stdtext.hxx>
+#include <com/sun/star/util/AliasProgrammaticPair.hpp>
+#ifndef EXTENSIONS_ABPRESID_HRC
+#include "abpresid.hrc"
+#endif
+#include "componentmodule.hxx"
+#include <unotools/confignode.hxx>
+
+//.........................................................................
+namespace abp
+{
+//.........................................................................
+
+ using namespace ::utl;
+ using namespace ::com::sun::star::uno;
+ using namespace ::com::sun::star::awt;
+ using namespace ::com::sun::star::util;
+ using namespace ::com::sun::star::lang;
+ using namespace ::com::sun::star::beans;
+ using namespace ::com::sun::star::sdb;
+ using namespace ::com::sun::star::ui::dialogs;
+
+ //---------------------------------------------------------------------
+ static const ::rtl::OUString& lcl_getDriverSettingsNodeName()
+ {
+ static const ::rtl::OUString s_sDriverSettingsNodeName =
+ ::rtl::OUString::createFromAscii( "/org.openoffice.Office.DataAccess/DriverSettings/com.sun.star.comp.sdbc.MozabDriver" );
+ return s_sDriverSettingsNodeName;
+ }
+
+ //---------------------------------------------------------------------
+ static const ::rtl::OUString& lcl_getAddressBookNodeName()
+ {
+ static const ::rtl::OUString s_sAddressBookNodeName =
+ ::rtl::OUString::createFromAscii( "/org.openoffice.Office.DataAccess/AddressBook" );
+ return s_sAddressBookNodeName;
+ }
+
+ //.....................................................................
+ namespace fieldmapping
+ {
+ //.....................................................................
+
+ //-----------------------------------------------------------------
+ sal_Bool invokeDialog( const Reference< XMultiServiceFactory >& _rxORB, class Window* _pParent,
+ const Reference< XPropertySet >& _rxDataSource, AddressSettings& _rSettings ) SAL_THROW ( ( ) )
+ {
+ _rSettings.aFieldMapping.clear();
+
+ DBG_ASSERT( _rxORB.is(), "fieldmapping::invokeDialog: invalid service factory!" );
+ DBG_ASSERT( _rxDataSource.is(), "fieldmapping::invokeDialog: invalid data source!" );
+ if ( !_rxORB.is() || !_rxDataSource.is() )
+ return sal_False;
+
+ try
+ {
+ // ........................................................
+ // the parameters for creating the dialog
+ Sequence< Any > aArguments(5);
+ Any* pArguments = aArguments.getArray();
+
+ // the parent window
+ Reference< XWindow > xDialogParent = VCLUnoHelper::GetInterface( _pParent );
+ *pArguments++ <<= PropertyValue(::rtl::OUString::createFromAscii( "ParentWindow" ), -1, makeAny( xDialogParent ), PropertyState_DIRECT_VALUE);
+
+ // the data source to use
+ *pArguments++ <<= PropertyValue(::rtl::OUString::createFromAscii( "DataSource" ), -1, makeAny( _rxDataSource ), PropertyState_DIRECT_VALUE);
+ *pArguments++ <<= PropertyValue(::rtl::OUString::createFromAscii( "DataSourceName" ), -1, makeAny( (sal_Bool)_rSettings.bRegisterDataSource ? _rSettings.sRegisteredDataSourceName : _rSettings.sDataSourceName ), PropertyState_DIRECT_VALUE);
+
+ // the table to use
+ *pArguments++ <<= PropertyValue(::rtl::OUString::createFromAscii( "Command" ), -1, makeAny( _rSettings.sSelectedTable ), PropertyState_DIRECT_VALUE);
+
+ // the title
+ ::rtl::OUString sTitle = String( ModuleRes( RID_STR_FIELDDIALOGTITLE ) );
+ *pArguments++ <<= PropertyValue(::rtl::OUString::createFromAscii( "Title" ), -1, makeAny( sTitle ), PropertyState_DIRECT_VALUE);
+
+ // ........................................................
+ // create an instance of the dialog service
+ static ::rtl::OUString s_sAdressBookFieldAssignmentServiceName = ::rtl::OUString::createFromAscii( "com.sun.star.ui.AddressBookSourceDialog" );
+ Reference< XExecutableDialog > xDialog(
+ _rxORB->createInstanceWithArguments( s_sAdressBookFieldAssignmentServiceName, aArguments ),
+ UNO_QUERY
+ );
+ if ( !xDialog.is( ) )
+ {
+ ShowServiceNotAvailableError( _pParent, s_sAdressBookFieldAssignmentServiceName, sal_True );
+ return sal_False;
+ }
+
+ // execute the dialog
+ if ( xDialog->execute() )
+ {
+ // retrieve the field mapping as set by he user
+ Reference< XPropertySet > xDialogProps( xDialog, UNO_QUERY );
+
+ Sequence< AliasProgrammaticPair > aMapping;
+#ifdef DBG_UTIL
+ sal_Bool bSuccess =
+#endif
+ xDialogProps->getPropertyValue( ::rtl::OUString::createFromAscii( "FieldMapping" ) ) >>= aMapping;
+ DBG_ASSERT( bSuccess, "fieldmapping::invokeDialog: invalid property type for FieldMapping!" );
+
+ // and copy it into the map
+ const AliasProgrammaticPair* pMapping = aMapping.getConstArray();
+ const AliasProgrammaticPair* pMappingEnd = pMapping + aMapping.getLength();
+ for (;pMapping != pMappingEnd; ++pMapping)
+ _rSettings.aFieldMapping[ pMapping->ProgrammaticName ] = pMapping->Alias;
+
+ return sal_True;
+ }
+
+ }
+ catch(const Exception&)
+ {
+ DBG_ERROR("fieldmapping::invokeDialog: caught an exception while executing the dialog!");
+ }
+ return sal_False;
+ }
+
+ //-----------------------------------------------------------------
+ void defaultMapping( const Reference< XMultiServiceFactory >& _rxORB, MapString2String& _rFieldAssignment ) SAL_THROW ( ( ) )
+ {
+ _rFieldAssignment.clear();
+
+ try
+ {
+ // what we have:
+ // a) For the address data source, we need a mapping from programmatic names (1) to real column names
+ // b) The SDBC driver has a fixed set of columns, which, when returned, are named according to
+ // some configuration entries. E.g., the driver displays the field which it knows contains
+ // the first name as "First Name" - the latter string is stored in the config.
+ // For this, the driver uses programmatic names, too, but they differ from the programmatic names the
+ // template documents have.
+ // So what we need first is a mapping from programmatic names (1) to programmatic names (2)
+ const sal_Char* pMappingProgrammatics[] =
+ {
+ "FirstName", "FirstName",
+ "LastName", "LastName",
+ "Street", "HomeAddress",
+ "Zip", "HomeZipCode",
+ "City", "HomeCity",
+ "State", "HomeState",
+ "Country", "HomeCountry",
+ "PhonePriv", "HomePhone",
+ "PhoneComp", "WorkPhone",
+ "PhoneCell", "CellularNumber",
+ "Pager", "PagerNumber",
+ "Fax", "FaxNumber",
+ "EMail", "PrimaryEmail",
+ "URL", "WebPage1",
+ "Note", "Notes",
+ "Altfield1", "Custom1",
+ "Altfield2", "Custom2",
+ "Altfield3", "Custom3",
+ "Altfield4", "Custom4",
+ "Title", "JobTitle",
+ "Company", "Company",
+ "Department", "Department"
+ };
+ // (this list is not complete: both lists of programmatic names are larger in real,
+ // but this list above is the intersection)
+
+
+ // access the configuration information which the driver uses for determining it's column names
+ ::rtl::OUString sDriverAliasesNodeName = lcl_getDriverSettingsNodeName();
+ sDriverAliasesNodeName += ::rtl::OUString::createFromAscii( "/ColumnAliases" );
+
+ // create a config node for this
+ OConfigurationTreeRoot aDriverFieldAliasing = OConfigurationTreeRoot::createWithServiceFactory(
+ _rxORB, sDriverAliasesNodeName, -1, OConfigurationTreeRoot::CM_READONLY);
+
+ // loop through all programmatic pairs
+ DBG_ASSERT( 0 == ( sizeof( pMappingProgrammatics ) / sizeof( pMappingProgrammatics[ 0 ] ) ) % 2,
+ "fieldmapping::defaultMapping: invalid programmatic map!" );
+ // number of pairs
+ sal_Int32 nIntersectedProgrammatics = sizeof( pMappingProgrammatics ) / sizeof( pMappingProgrammatics[ 0 ] ) / 2;
+
+ const sal_Char** pProgrammatic = pMappingProgrammatics;
+ ::rtl::OUString sAddressProgrammatic;
+ ::rtl::OUString sDriverProgrammatic;
+ ::rtl::OUString sDriverUI;
+ for ( sal_Int32 i=0;
+ i < nIntersectedProgrammatics;
+ ++i
+ )
+ {
+ sAddressProgrammatic = ::rtl::OUString::createFromAscii( *pProgrammatic++ );
+ sDriverProgrammatic = ::rtl::OUString::createFromAscii( *pProgrammatic++ );
+
+ if ( aDriverFieldAliasing.hasByName( sDriverProgrammatic ) )
+ {
+ aDriverFieldAliasing.getNodeValue( sDriverProgrammatic ) >>= sDriverUI;
+ if ( 0 == sDriverUI.getLength() )
+ {
+ DBG_ERROR( "fieldmapping::defaultMapping: invalid driver UI column name!");
+ }
+ else
+ _rFieldAssignment[ sAddressProgrammatic ] = sDriverUI;
+ }
+ else
+ {
+ DBG_ERROR( "fieldmapping::defaultMapping: invalid driver programmatic name!" );
+ }
+ }
+ }
+ catch( const Exception& )
+ {
+ DBG_ERROR("fieldmapping::defaultMapping: code is assumed to throw no exceptions!");
+ // the config nodes we're using herein should not do this ....
+ }
+ }
+
+ //-----------------------------------------------------------------
+ void writeTemplateAddressFieldMapping( const Reference< XMultiServiceFactory >& _rxORB, const MapString2String& _rFieldAssignment ) SAL_THROW ( ( ) )
+ {
+ // want to have a non-const map for easier handling
+ MapString2String aFieldAssignment( _rFieldAssignment );
+
+ // access the configuration information which the driver uses for determining it's column names
+ const ::rtl::OUString& sAddressBookNodeName = lcl_getAddressBookNodeName();
+
+ // create a config node for this
+ OConfigurationTreeRoot aAddressBookSettings = OConfigurationTreeRoot::createWithServiceFactory(
+ _rxORB, sAddressBookNodeName, -1, OConfigurationTreeRoot::CM_UPDATABLE);
+
+ OConfigurationNode aFields = aAddressBookSettings.openNode( ::rtl::OUString::createFromAscii( "Fields" ) );
+
+ // loop through all existent fields
+ Sequence< ::rtl::OUString > aExistentFields = aFields.getNodeNames();
+ const ::rtl::OUString* pExistentFields = aExistentFields.getConstArray();
+ const ::rtl::OUString* pExistentFieldsEnd = pExistentFields + aExistentFields.getLength();
+
+ const ::rtl::OUString sProgrammaticNodeName = ::rtl::OUString::createFromAscii( "ProgrammaticFieldName" );
+ const ::rtl::OUString sAssignedNodeName = ::rtl::OUString::createFromAscii( "AssignedFieldName" );
+
+ for ( ; pExistentFields != pExistentFieldsEnd; ++pExistentFields )
+ {
+#ifdef DBG_UTIL
+ ::rtl::OUString sRedundantProgrammaticName;
+ aFields.openNode( *pExistentFields ).getNodeValue( sProgrammaticNodeName ) >>= sRedundantProgrammaticName;
+#endif
+ DBG_ASSERT( sRedundantProgrammaticName == *pExistentFields,
+ "fieldmapping::writeTemplateAddressFieldMapping: inconsistent config data!" );
+ // there should be a redundancy in the config data .... if this asserts, there isn't anymore!
+
+ // do we have a new alias for the programmatic?
+ MapString2StringIterator aPos = aFieldAssignment.find( *pExistentFields );
+ if ( aFieldAssignment.end() != aPos )
+ { // yes
+ // -> set a new value
+ OConfigurationNode aExistentField = aFields.openNode( *pExistentFields );
+ aExistentField.setNodeValue( sAssignedNodeName, makeAny( aPos->second ) );
+ // and remove the mapping entry
+ aFieldAssignment.erase( *pExistentFields );
+ }
+ else
+ { // no
+ // -> remove it
+ aFields.removeNode( *pExistentFields );
+ }
+ }
+
+ // now everything remaining in aFieldAssignment marks a mapping entry which was not present
+ // in the config before
+ for ( ConstMapString2StringIterator aNewMapping = aFieldAssignment.begin();
+ aNewMapping != aFieldAssignment.end();
+ ++aNewMapping
+ )
+ {
+ DBG_ASSERT( !aFields.hasByName( aNewMapping->first ),
+ "fieldmapping::writeTemplateAddressFieldMapping: inconsistence!" );
+ // in case the config node for the fields already has the node named <aNewMapping->first>,
+ // the entry should have been removed from aNewMapping (in the above loop)
+ OConfigurationNode aNewField = aFields.createNode( aNewMapping->first );
+ aNewField.setNodeValue( sProgrammaticNodeName, makeAny( aNewMapping->first ) );
+ aNewField.setNodeValue( sAssignedNodeName, makeAny( aNewMapping->second ) );
+ }
+
+ // commit the changes done
+ aAddressBookSettings.commit();
+ }
+
+ //.....................................................................
+ } // namespace fieldmapping
+ //.....................................................................
+
+ //.....................................................................
+ namespace addressconfig
+ {
+ //.....................................................................
+
+ //-----------------------------------------------------------------
+ void writeTemplateAddressSource( const Reference< XMultiServiceFactory >& _rxORB,
+ const ::rtl::OUString& _rDataSourceName, const ::rtl::OUString& _rTableName ) SAL_THROW ( ( ) )
+ {
+ // access the configuration information which the driver uses for determining it's column names
+ const ::rtl::OUString& sAddressBookNodeName = lcl_getAddressBookNodeName();
+
+ // create a config node for this
+ OConfigurationTreeRoot aAddressBookSettings = OConfigurationTreeRoot::createWithServiceFactory(
+ _rxORB, sAddressBookNodeName, -1, OConfigurationTreeRoot::CM_UPDATABLE);
+
+ aAddressBookSettings.setNodeValue( ::rtl::OUString::createFromAscii( "DataSourceName" ), makeAny( _rDataSourceName ) );
+ aAddressBookSettings.setNodeValue( ::rtl::OUString::createFromAscii( "Command" ), makeAny( _rTableName ) );
+ aAddressBookSettings.setNodeValue( ::rtl::OUString::createFromAscii( "CommandType" ), makeAny( (sal_Int32)CommandType::TABLE ) );
+
+ // commit the changes done
+ aAddressBookSettings.commit();
+ }
+
+ //-----------------------------------------------------------------
+ void markPilotSuccess( const Reference< XMultiServiceFactory >& _rxORB ) SAL_THROW ( ( ) )
+ {
+ // access the configuration information which the driver uses for determining it's column names
+ const ::rtl::OUString& sAddressBookNodeName = lcl_getAddressBookNodeName();
+
+ // create a config node for this
+ OConfigurationTreeRoot aAddressBookSettings = OConfigurationTreeRoot::createWithServiceFactory(
+ _rxORB, sAddressBookNodeName, -1, OConfigurationTreeRoot::CM_UPDATABLE);
+
+ // set the flag
+ aAddressBookSettings.setNodeValue( ::rtl::OUString::createFromAscii( "AutoPilotCompleted" ), makeAny( (sal_Bool)sal_True ) );
+
+ // commit the changes done
+ aAddressBookSettings.commit();
+ }
+
+ //.....................................................................
+ } // namespace addressconfig
+ //.....................................................................
+
+//.........................................................................
+} // namespace abp
+//.........................................................................
+
diff --git a/extensions/source/abpilot/fieldmappingimpl.hxx b/extensions/source/abpilot/fieldmappingimpl.hxx
new file mode 100644
index 000000000000..370c23089a8b
--- /dev/null
+++ b/extensions/source/abpilot/fieldmappingimpl.hxx
@@ -0,0 +1,129 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: fieldmappingimpl.hxx,v $
+ * $Revision: 1.5 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef EXTENSIONS_ABP_FIELDMAPPINGIMPL_HXX
+#define EXTENSIONS_ABP_FIELDMAPPINGIMPL_HXX
+
+#include <rtl/ustring.hxx>
+#include "abptypes.hxx"
+#include <com/sun/star/uno/Reference.hxx>
+#include "addresssettings.hxx"
+
+namespace com { namespace sun { namespace star {
+ namespace lang {
+ class XMultiServiceFactory;
+ }
+ namespace beans {
+ class XPropertySet;
+ }
+} } }
+class Window;
+
+//.........................................................................
+namespace abp
+{
+//.........................................................................
+
+ //.....................................................................
+ namespace fieldmapping
+ {
+ //.....................................................................
+
+ //-----------------------------------------------------------------
+ /** invokes the field mapping dialog
+ @param _rxORB
+ service factory to use for creating UNO services
+ @param _pParent
+ window to use as parent for the dialog and error messages
+ @param _rSettings
+ current settings. Upon return, the field mapping member of this
+ structure will be filled with the settings the user did in the
+ field mapping dialog.
+ */
+ sal_Bool invokeDialog(
+ const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxORB,
+ class Window* _pParent,
+ const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxDataSource,
+ AddressSettings& _rSettings
+ ) SAL_THROW ( ( ) );
+
+ //-----------------------------------------------------------------
+ /** creates a default field mapping for usage with the address book SDBC driver
+ <p>The column names as used by the SDBC driver for address books is stored in the configuration,
+ and this function creates a mapping which uses this configuration information.</p>
+ */
+ void defaultMapping(
+ const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxORB,
+ MapString2String& /* [out] */ _rFieldAssignment
+ ) SAL_THROW ( ( ) );
+
+ //-----------------------------------------------------------------
+ /** writes a field mapping for the template document address source
+ */
+ void writeTemplateAddressFieldMapping(
+ const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxORB,
+ const MapString2String& _rFieldAssignment
+ ) SAL_THROW ( ( ) );
+
+ //.....................................................................
+ } // namespace fieldmapping
+ //.....................................................................
+
+ //.....................................................................
+ namespace addressconfig
+ {
+ //.....................................................................
+
+ //-----------------------------------------------------------------
+ /** writes the data source / table name given into the configuration, to where the template documents
+ expect it.
+ */
+ void writeTemplateAddressSource(
+ const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxORB,
+ const ::rtl::OUString& _rDataSourceName,
+ const ::rtl::OUString& _rTableName
+ ) SAL_THROW ( ( ) );
+
+ /** writes the configuration entry which states the the pilot has been completed successfully
+ */
+ void markPilotSuccess(
+ const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxORB
+ ) SAL_THROW ( ( ) );
+
+ //.....................................................................
+ } // namespace addressconfig
+ //.....................................................................
+
+//.........................................................................
+} // namespace abp
+//.........................................................................
+
+#endif // EXTENSIONS_ABP_FIELDMAPPINGIMPL_HXX
+
diff --git a/extensions/source/abpilot/fieldmappingpage.cxx b/extensions/source/abpilot/fieldmappingpage.cxx
new file mode 100644
index 000000000000..04ff17995e62
--- /dev/null
+++ b/extensions/source/abpilot/fieldmappingpage.cxx
@@ -0,0 +1,122 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: fieldmappingpage.cxx,v $
+ * $Revision: 1.13 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_extensions.hxx"
+#include "fieldmappingpage.hxx"
+#include "fieldmappingimpl.hxx"
+#include "addresssettings.hxx"
+#include "abspilot.hxx"
+
+//.........................................................................
+namespace abp
+{
+//.........................................................................
+
+ //=====================================================================
+ //= FieldMappingPage
+ //=====================================================================
+ //---------------------------------------------------------------------
+ FieldMappingPage::FieldMappingPage( OAddessBookSourcePilot* _pParent )
+ :AddressBookSourcePage( _pParent, ModuleRes( RID_PAGE_FIELDMAPPING ) )
+ ,m_aExplanation ( this, ModuleRes( FT_FIELDASSIGMENTEXPL ) )
+ ,m_aInvokeDialog ( this, ModuleRes( PB_INVOKE_FIELDS_DIALOG ) )
+ ,m_aHint ( this, ModuleRes( FT_ASSIGNEDFIELDS ) )
+ {
+ FreeResource();
+
+ m_aInvokeDialog.SetClickHdl( LINK( this, FieldMappingPage, OnInvokeDialog ) );
+
+ // check the size of the InvokeDialog button - some languages are very ... gossipy here ....
+ // 96349 - 09.01.2002 - fs@openoffice.org
+ sal_Int32 nTextWidth = m_aInvokeDialog.GetTextWidth( m_aInvokeDialog.GetText() );
+
+ sal_Int32 nBorderSpace = m_aInvokeDialog.LogicToPixel( Point( 4, 0 ), MAP_APPFONT ).X();
+ sal_Int32 nSpace = m_aInvokeDialog.GetOutputSizePixel().Width() - 2 * nBorderSpace;
+
+ if ( nSpace < nTextWidth )
+ {
+ Size aButtonSize = m_aInvokeDialog.GetSizePixel();
+ aButtonSize.Width() += nTextWidth - nSpace;
+ m_aInvokeDialog.SetSizePixel( aButtonSize );
+ }
+ }
+
+ //---------------------------------------------------------------------
+ void FieldMappingPage::ActivatePage()
+ {
+ AddressBookSourcePage::ActivatePage();
+ m_aInvokeDialog.GrabFocus();
+ }
+
+ //---------------------------------------------------------------------
+ void FieldMappingPage::DeactivatePage()
+ {
+ AddressBookSourcePage::DeactivatePage();
+ }
+
+ //---------------------------------------------------------------------
+ void FieldMappingPage::initializePage()
+ {
+ AddressBookSourcePage::initializePage();
+ implUpdateHint();
+ }
+
+ //---------------------------------------------------------------------
+ void FieldMappingPage::implUpdateHint()
+ {
+ const AddressSettings& rSettings = getSettings();
+ String sHint;
+ if ( 0 == rSettings.aFieldMapping.size() )
+ sHint = String( ModuleRes( RID_STR_NOFIELDSASSIGNED ) );
+ m_aHint.SetText( sHint );
+ }
+
+ //---------------------------------------------------------------------
+ IMPL_LINK( FieldMappingPage, OnInvokeDialog, void*, /*NOTINTERESTEDIN*/ )
+ {
+ AddressSettings& rSettings = getSettings();
+
+ // invoke the dialog doing the mapping
+ if ( fieldmapping::invokeDialog( getORB(), this, getDialog()->getDataSource().getDataSource(), rSettings ) )
+ {
+ if ( rSettings.aFieldMapping.size() )
+ getDialog()->travelNext();
+ else
+ implUpdateHint();
+ }
+
+ return 0L;
+ }
+
+//.........................................................................
+} // namespace abp
+//.........................................................................
+
diff --git a/extensions/source/abpilot/fieldmappingpage.hxx b/extensions/source/abpilot/fieldmappingpage.hxx
new file mode 100644
index 000000000000..0abf3039f1f3
--- /dev/null
+++ b/extensions/source/abpilot/fieldmappingpage.hxx
@@ -0,0 +1,73 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: fieldmappingpage.hxx,v $
+ * $Revision: 1.7 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef EXTENSIONS_ABP_FIELDMAPPINGPAGE_HXX
+#define EXTENSIONS_ABP_FIELDMAPPINGPAGE_HXX
+
+#include "abspage.hxx"
+
+//.........................................................................
+namespace abp
+{
+//.........................................................................
+
+ //=====================================================================
+ //= FieldMappingPage
+ //=====================================================================
+ class FieldMappingPage : public AddressBookSourcePage
+ {
+ protected:
+ FixedText m_aExplanation;
+ PushButton m_aInvokeDialog;
+ FixedText m_aHint;
+
+ public:
+ FieldMappingPage( OAddessBookSourcePilot* _pParent );
+
+ protected:
+ // OWizardPage overridables
+ virtual void initializePage();
+
+ // TabDialog overridables
+ virtual void ActivatePage();
+ virtual void DeactivatePage();
+
+ private:
+ DECL_LINK( OnInvokeDialog, void* );
+
+ void implUpdateHint();
+ };
+
+//.........................................................................
+} // namespace abp
+//.........................................................................
+
+#endif // EXTENSIONS_ABP_FIELDMAPPINGPAGE_HXX
+
diff --git a/extensions/source/abpilot/makefile.mk b/extensions/source/abpilot/makefile.mk
new file mode 100644
index 000000000000..8830b9144409
--- /dev/null
+++ b/extensions/source/abpilot/makefile.mk
@@ -0,0 +1,110 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2008 by Sun Microsystems, Inc.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# $RCSfile: makefile.mk,v $
+#
+# $Revision: 1.14 $
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+PRJ=..$/..
+PRJINC=..$/inc
+
+PRJNAME=extensions
+TARGET=abp
+USE_DEFFILE=TRUE
+VISIBILITY_HIDDEN=TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : $(PRJ)$/util$/makefile.pmk
+
+# --- defines ------------------------------------------------------
+
+CDEFS+=-DCOMPMOD_NAMESPACE=abp
+CDEFS+=-DCOMPMOD_RESPREFIX=abp
+
+# --- Files --------------------------------------------------------
+
+EXCEPTIONSFILES= \
+ $(SLO)$/fieldmappingimpl.obj \
+ $(SLO)$/datasourcehandling.obj \
+ $(SLO)$/admininvokationimpl.obj \
+ $(SLO)$/unodialogabp.obj \
+ $(SLO)$/moduleabp.obj \
+ $(SLO)$/abpservices.obj \
+ $(SLO)$/typeselectionpage.obj \
+
+SLOFILES= \
+ $(SLO)$/fieldmappingpage.obj \
+ $(SLO)$/abpfinalpage.obj \
+ $(SLO)$/tableselectionpage.obj \
+ $(SLO)$/admininvokationpage.obj \
+ $(SLO)$/abspage.obj \
+ $(SLO)$/abspilot.obj \
+ $(EXCEPTIONSFILES)
+
+
+.IF "$(WITH_MOZILLA)" != "NO"
+.IF "$(SYSTEM_MOZILLA)" != "YES"
+CDEFS+=-DWITH_MOZILLA
+.ENDIF
+.ENDIF
+
+SRS1NAME=$(TARGET)
+SRC1FILES= abspilot.src
+
+RESLIB1NAME=abp
+RESLIB1IMAGES=$(PRJ)$/res
+RESLIB1SRSFILES= $(SRS)$/abp.srs
+
+SHL1TARGET= $(TARGET)$(DLLPOSTFIX)
+SHL1VERSIONMAP= $(TARGET).map
+
+SHL1STDLIBS= \
+ $(VCLLIB) \
+ $(SALLIB) \
+ $(TOOLSLIB) \
+ $(CPPULIB) \
+ $(SVTOOLLIB) \
+ $(SVLLIB) \
+ $(SFXLIB) \
+ $(CPPUHELPERLIB) \
+ $(COMPHELPERLIB) \
+ $(TKLIB) \
+ $(UNOTOOLSLIB) \
+ $(SVXCORELIB) \
+ $(SVXLIB)
+
+SHL1LIBS= $(SLB)$/$(TARGET).lib
+SHL1IMPLIB= i$(TARGET)
+SHL1DEPN= $(SHL1LIBS)
+SHL1DEF= $(MISC)$/$(SHL1TARGET).def
+
+DEF1NAME= $(SHL1TARGET)
+DEF1EXPORTFILE= exports.dxp
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
diff --git a/extensions/source/abpilot/moduleabp.cxx b/extensions/source/abpilot/moduleabp.cxx
new file mode 100644
index 000000000000..9dc289f57288
--- /dev/null
+++ b/extensions/source/abpilot/moduleabp.cxx
@@ -0,0 +1,35 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: moduleabp.cxx,v $
+ * $Revision: 1.5 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_extensions.hxx"
+
+#include "componentmodule.cxx"
+
diff --git a/extensions/source/abpilot/tableselectionpage.cxx b/extensions/source/abpilot/tableselectionpage.cxx
new file mode 100644
index 000000000000..b7a7f39e2056
--- /dev/null
+++ b/extensions/source/abpilot/tableselectionpage.cxx
@@ -0,0 +1,136 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: tableselectionpage.cxx,v $
+ * $Revision: 1.10 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_extensions.hxx"
+#include "tableselectionpage.hxx"
+#include "abptypes.hxx"
+#include "addresssettings.hxx"
+#include "abspilot.hxx"
+#include <tools/debug.hxx>
+
+//.........................................................................
+namespace abp
+{
+//.........................................................................
+
+ //=====================================================================
+ //= TableSelectionPage
+ //=====================================================================
+ //---------------------------------------------------------------------
+ TableSelectionPage::TableSelectionPage( OAddessBookSourcePilot* _pParent )
+ :AddressBookSourcePage(_pParent, ModuleRes(RID_PAGE_TABLESELECTION_AB))
+ ,m_aLabel ( this, ModuleRes( FL_TOOMUCHTABLES ) )
+ ,m_aTableList ( this, ModuleRes( LB_TABLELIST ) )
+ {
+ FreeResource();
+
+ m_aTableList.SetSelectHdl( LINK( this, TableSelectionPage, OnTableSelected ) );
+ m_aTableList.SetDoubleClickHdl( LINK( this, TableSelectionPage, OnTableDoubleClicked ) );
+ }
+
+ //---------------------------------------------------------------------
+ void TableSelectionPage::ActivatePage()
+ {
+ AddressBookSourcePage::ActivatePage();
+
+ m_aTableList.GrabFocus();
+ }
+
+ //---------------------------------------------------------------------
+ void TableSelectionPage::DeactivatePage()
+ {
+ AddressBookSourcePage::DeactivatePage();
+ }
+
+ //---------------------------------------------------------------------
+ void TableSelectionPage::initializePage()
+ {
+ AddressBookSourcePage::initializePage();
+
+ const AddressSettings& rSettings = getSettings();
+
+ m_aTableList.Clear();
+
+ // get the table names
+ const StringBag& aTableNames = getDialog()->getDataSource().getTableNames();
+ DBG_ASSERT( aTableNames.size() > 1, "TableSelectionPage::initializePage: to be called for more than one table only!");
+ // this page should never bother the user if there is 1 or less tables.
+
+ // fill the list
+ for ( ConstStringBagIterator aTables = aTableNames.begin();
+ aTables != aTableNames.end();
+ ++aTables
+ )
+ m_aTableList.InsertEntry( *aTables );
+
+ // initially select the proper table
+ m_aTableList.SelectEntry( rSettings.sSelectedTable );
+ }
+
+ //---------------------------------------------------------------------
+ IMPL_LINK( TableSelectionPage, OnTableDoubleClicked, void*, /*NOTINTERESTEDIN*/ )
+ {
+ if ( 1 == m_aTableList.GetSelectEntryCount() )
+ getDialog()->travelNext();
+
+ return 0L;
+ }
+
+ //---------------------------------------------------------------------
+ IMPL_LINK( TableSelectionPage, OnTableSelected, void*, /*NOTINTERESTEDIN*/ )
+ {
+ updateDialogTravelUI();
+ return 0L;
+ }
+
+ //---------------------------------------------------------------------
+ sal_Bool TableSelectionPage::commitPage( CommitPageReason _eReason )
+ {
+ if (!AddressBookSourcePage::commitPage(_eReason))
+ return sal_False;
+
+ AddressSettings& rSettings = getSettings();
+ rSettings.sSelectedTable = m_aTableList.GetSelectEntry();
+
+ return sal_True;
+ }
+
+ //---------------------------------------------------------------------
+ bool TableSelectionPage::canAdvance() const
+ {
+ return AddressBookSourcePage::canAdvance()
+ && ( 0 < m_aTableList.GetSelectEntryCount() );
+ }
+
+//.........................................................................
+} // namespace abp
+//.........................................................................
+
diff --git a/extensions/source/abpilot/tableselectionpage.hxx b/extensions/source/abpilot/tableselectionpage.hxx
new file mode 100644
index 000000000000..5477ec35a9ff
--- /dev/null
+++ b/extensions/source/abpilot/tableselectionpage.hxx
@@ -0,0 +1,76 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: tableselectionpage.hxx,v $
+ * $Revision: 1.6 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef EXTENSIONS_ABP_TABLESELECTIONPAGE_HXX
+#define EXTENSIONS_ABP_TABLESELECTIONPAGE_HXX
+
+#include "abspage.hxx"
+#include <vcl/lstbox.hxx>
+
+//.........................................................................
+namespace abp
+{
+//.........................................................................
+
+ //=====================================================================
+ //= TableSelectionPage
+ //=====================================================================
+ class TableSelectionPage : public AddressBookSourcePage
+ {
+ protected:
+ FixedText m_aLabel;
+ ListBox m_aTableList;
+
+ public:
+ TableSelectionPage( OAddessBookSourcePilot* _pParent );
+
+ protected:
+ // OWizardPage overridables
+ virtual void initializePage();
+ virtual sal_Bool commitPage( CommitPageReason _eReason );
+
+ // TabDialog overridables
+ virtual void ActivatePage();
+ virtual void DeactivatePage();
+
+ // OImportPage overridables
+ virtual bool canAdvance() const;
+
+ private:
+ DECL_LINK( OnTableSelected, void* );
+ DECL_LINK( OnTableDoubleClicked, void* );
+ };
+
+//.........................................................................
+} // namespace abp
+//.........................................................................
+
+#endif // EXTENSIONS_ABP_TABLESELECTIONPAGE_HXX
+
diff --git a/extensions/source/abpilot/typeselectionpage.cxx b/extensions/source/abpilot/typeselectionpage.cxx
new file mode 100644
index 000000000000..c34aceb418a3
--- /dev/null
+++ b/extensions/source/abpilot/typeselectionpage.cxx
@@ -0,0 +1,252 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: typeselectionpage.cxx,v $
+ * $Revision: 1.17 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_extensions.hxx"
+#include "typeselectionpage.hxx"
+#include "addresssettings.hxx"
+#include "abspilot.hxx"
+#include <vcl/msgbox.hxx>
+#include <com/sun/star/sdbc/XDriverAccess.hpp>
+
+//.........................................................................
+namespace abp
+{
+//.........................................................................
+
+ using namespace ::com::sun::star::uno;
+ using namespace ::com::sun::star::sdbc;
+
+ //=====================================================================
+ //= TypeSelectionPage
+ //=====================================================================
+ //---------------------------------------------------------------------
+ TypeSelectionPage::TypeSelectionPage( OAddessBookSourcePilot* _pParent )
+ :AddressBookSourcePage(_pParent, ModuleRes(RID_PAGE_SELECTABTYPE))
+ ,m_aHint (this, ModuleRes(FT_TYPE_HINTS))
+ ,m_aTypeSep (this, ModuleRes(FL_TYPE))
+ ,m_aEvolution (this, ModuleRes(RB_EVOLUTION))
+ ,m_aEvolutionGroupwise (this, ModuleRes(RB_EVOLUTION_GROUPWISE))
+ ,m_aEvolutionLdap (this, ModuleRes(RB_EVOLUTION_LDAP))
+ ,m_aMORK (this, ModuleRes(RB_MORK))
+ ,m_aThunderbird (this, ModuleRes(RB_THUNDERBIRD))
+ ,m_aKab (this, ModuleRes(RB_KAB))
+ ,m_aMacab (this, ModuleRes(RB_MACAB))
+ ,m_aLDAP (this, ModuleRes(RB_LDAP))
+ ,m_aOutlook (this, ModuleRes(RB_OUTLOOK))
+ ,m_aOE (this, ModuleRes(RB_OUTLOOKEXPRESS))
+ ,m_aOther (this, ModuleRes(RB_OTHER))
+ {
+ FreeResource();
+
+ Point aTopLeft( LogicToPixel( Point( 15, 68 ), MAP_APPFONT ) );
+ Size aItemSize( LogicToPixel( Size( 0, 8 ), MAP_APPFONT ) );
+ aItemSize.Width() = GetOutputSizePixel().Width() - 30;
+
+ bool bWithMozilla = true, bUnx = true;
+ bool bHaveEvolution = true, bHaveKab = true;
+ bool bHaveMacab = true;
+
+#if !defined WITH_MOZILLA || defined MACOSX
+ bWithMozilla = false;
+#endif
+#ifndef UNX
+ bUnx = false;
+ bHaveEvolution = false;
+ bHaveKab = false;
+ bHaveMacab = false;
+#else
+ Reference< XDriverAccess> xManager(_pParent->getORB()->createInstance(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.sdbc.DriverManager"))), UNO_QUERY);
+
+ // check whether Evolution is available
+ Reference< XDriver > xDriver( xManager->getDriverByURL(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("sdbc:address:evolution:local"))) );
+ if ( !xDriver.is() )
+ bHaveEvolution = false;
+
+ // check whether KDE address book is available
+ xDriver = xManager->getDriverByURL(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("sdbc:address:kab")));
+ if ( !xDriver.is() )
+ bHaveKab = false;
+
+ // check whether Mac OS X address book is available
+ xDriver = xManager->getDriverByURL(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("sdbc:address:macab")));
+ if ( !xDriver.is() )
+ bHaveMacab = false;
+#endif
+
+ // Items are displayed in list order
+ m_aAllTypes.push_back( ButtonItem( &m_aEvolution, AST_EVOLUTION, bHaveEvolution ) );
+ m_aAllTypes.push_back( ButtonItem( &m_aEvolutionGroupwise, AST_EVOLUTION_GROUPWISE, bHaveEvolution ) );
+ m_aAllTypes.push_back( ButtonItem( &m_aEvolutionLdap, AST_EVOLUTION_LDAP, bHaveEvolution ) );
+ m_aAllTypes.push_back( ButtonItem( &m_aMORK, AST_MORK, bWithMozilla ) );
+ m_aAllTypes.push_back( ButtonItem( &m_aThunderbird, AST_THUNDERBIRD, bWithMozilla ) );
+ m_aAllTypes.push_back( ButtonItem( &m_aKab, AST_KAB, bHaveKab ) );
+ m_aAllTypes.push_back( ButtonItem( &m_aMacab, AST_MACAB, bHaveMacab ) );
+ m_aAllTypes.push_back( ButtonItem( &m_aLDAP, AST_LDAP, bWithMozilla ) );
+ m_aAllTypes.push_back( ButtonItem( &m_aOutlook, AST_OUTLOOK, bWithMozilla && !bUnx ) );
+ m_aAllTypes.push_back( ButtonItem( &m_aOE, AST_OE, bWithMozilla && !bUnx ) );
+ m_aAllTypes.push_back( ButtonItem( &m_aOther, AST_OTHER, true ) );
+
+ bool bFirstVisible = true;
+ Link aTypeSelectionHandler = LINK(this, TypeSelectionPage, OnTypeSelected );
+ const Size aSpacing( LogicToPixel( Size( 0, 3 ), MAP_APPFONT ) );
+ for ( ::std::vector< ButtonItem >::const_iterator loop = m_aAllTypes.begin();
+ loop != m_aAllTypes.end(); ++loop )
+ {
+ ButtonItem aItem = *loop;
+ if (!aItem.m_bVisible)
+ aItem.m_pItem->Hide();
+ else
+ {
+ aItem.m_pItem->SetPosPixel( aTopLeft );
+ aTopLeft.Y() += aItemSize.Height() + aSpacing.Height();
+ aItem.m_pItem->SetClickHdl( aTypeSelectionHandler );
+ aItem.m_pItem->Show();
+
+ if ( bFirstVisible )
+ {
+ aItem.m_pItem->SetStyle( aItem.m_pItem->GetStyle() | WB_GROUP );
+ bFirstVisible = false;
+ }
+ }
+ }
+ }
+
+ //---------------------------------------------------------------------
+ TypeSelectionPage::~TypeSelectionPage()
+ {
+ for ( ::std::vector< ButtonItem >::iterator loop = m_aAllTypes.begin();
+ loop != m_aAllTypes.end(); ++loop )
+ {
+ loop->m_bVisible = false;
+ }
+ }
+
+ //---------------------------------------------------------------------
+ void TypeSelectionPage::ActivatePage()
+ {
+ AddressBookSourcePage::ActivatePage();
+
+ for ( ::std::vector< ButtonItem >::const_iterator loop = m_aAllTypes.begin();
+ loop != m_aAllTypes.end(); ++loop )
+ {
+ const ButtonItem& rItem = (*loop);
+ if( rItem.m_pItem->IsChecked() && rItem.m_bVisible )
+ {
+ rItem.m_pItem->GrabFocus();
+ break;
+ }
+ }
+
+ getDialog()->enableButtons(WZB_PREVIOUS, sal_False);
+ }
+
+ //---------------------------------------------------------------------
+ void TypeSelectionPage::DeactivatePage()
+ {
+ AddressBookSourcePage::DeactivatePage();
+ getDialog()->enableButtons(WZB_PREVIOUS, sal_True);
+ }
+
+ //---------------------------------------------------------------------
+ void TypeSelectionPage::selectType( AddressSourceType _eType )
+ {
+ for ( ::std::vector< ButtonItem >::const_iterator loop = m_aAllTypes.begin();
+ loop != m_aAllTypes.end(); ++loop )
+ {
+ ButtonItem aItem = (*loop);
+ aItem.m_pItem->Check( _eType == aItem.m_eType );
+ }
+ }
+
+ //---------------------------------------------------------------------
+ AddressSourceType TypeSelectionPage::getSelectedType() const
+ {
+ for ( ::std::vector< ButtonItem >::const_iterator loop = m_aAllTypes.begin();
+ loop != m_aAllTypes.end(); ++loop )
+ {
+ ButtonItem aItem = (*loop);
+ if ( aItem.m_pItem->IsChecked() )
+ return aItem.m_eType;
+ }
+
+ return AST_INVALID;
+ }
+
+ //---------------------------------------------------------------------
+ void TypeSelectionPage::initializePage()
+ {
+ AddressBookSourcePage::initializePage();
+
+ const AddressSettings& rSettings = getSettings();
+ selectType(rSettings.eType);
+ }
+
+ //---------------------------------------------------------------------
+ sal_Bool TypeSelectionPage::commitPage( CommitPageReason _eReason )
+ {
+ if (!AddressBookSourcePage::commitPage(_eReason))
+ return sal_False;
+
+ if (AST_INVALID == getSelectedType( ))
+ {
+ if ( _eReason != eValidateNoUI )
+ {
+ ErrorBox aError(this, ModuleRes(RID_ERR_NEEDTYPESELECTION));
+ aError.Execute();
+ }
+ return sal_False;
+ }
+
+ AddressSettings& rSettings = getSettings();
+ rSettings.eType = getSelectedType();
+
+ return sal_True;
+ }
+
+ //---------------------------------------------------------------------
+ bool TypeSelectionPage::canAdvance() const
+ {
+ return AddressBookSourcePage::canAdvance()
+ && (AST_INVALID != getSelectedType());
+ }
+
+ //---------------------------------------------------------------------
+ IMPL_LINK( TypeSelectionPage, OnTypeSelected, void*, /*NOTINTERESTEDIN*/ )
+ {
+ getDialog()->typeSelectionChanged( getSelectedType() );
+ updateDialogTravelUI();
+ return 0L;
+ }
+
+//.........................................................................
+} // namespace abp
+//.........................................................................
+
diff --git a/extensions/source/abpilot/typeselectionpage.hxx b/extensions/source/abpilot/typeselectionpage.hxx
new file mode 100644
index 000000000000..0d647f696a39
--- /dev/null
+++ b/extensions/source/abpilot/typeselectionpage.hxx
@@ -0,0 +1,109 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: typeselectionpage.hxx,v $
+ * $Revision: 1.12 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef EXTENSIONS_ABP_TYPESELECTIONPAGE_HXX
+#define EXTENSIONS_ABP_TYPESELECTIONPAGE_HXX
+
+#include "abspage.hxx"
+#include "addresssettings.hxx"
+#include <vcl/edit.hxx>
+
+//.........................................................................
+namespace abp
+{
+//.........................................................................
+
+ //=====================================================================
+ //= TypeSelectionPage
+ //=====================================================================
+ class TypeSelectionPage : public AddressBookSourcePage
+ {
+ protected:
+ FixedText m_aHint;
+ FixedLine m_aTypeSep;
+ RadioButton m_aEvolution;
+ RadioButton m_aEvolutionGroupwise;
+ RadioButton m_aEvolutionLdap;
+ RadioButton m_aMORK;
+ RadioButton m_aThunderbird;
+ RadioButton m_aKab;
+ RadioButton m_aMacab;
+ RadioButton m_aLDAP;
+ RadioButton m_aOutlook;
+ RadioButton m_aOE;
+ RadioButton m_aOther;
+
+ struct ButtonItem {
+ RadioButton *m_pItem;
+ AddressSourceType m_eType;
+ bool m_bVisible;
+
+ ButtonItem( RadioButton *pItem,
+ AddressSourceType eType,
+ bool bVisible ) :
+ m_pItem( pItem ),
+ m_eType( eType ),
+ m_bVisible( bVisible )
+ {}
+ };
+
+ ::std::vector< ButtonItem > m_aAllTypes;
+
+ public:
+ TypeSelectionPage( OAddessBookSourcePilot* _pParent );
+ ~TypeSelectionPage();
+
+ // retrieves the currently selected type
+ AddressSourceType getSelectedType() const;
+
+ protected:
+ // OWizardPage overridables
+ virtual void initializePage();
+ virtual sal_Bool commitPage( CommitPageReason _eReason );
+
+ // TabDialog overridables
+ virtual void ActivatePage();
+ virtual void DeactivatePage();
+
+ // OImportPage overridables
+ virtual bool canAdvance() const;
+
+ private:
+ DECL_LINK( OnTypeSelected, void* );
+
+ void selectType( AddressSourceType _eType );
+ };
+
+//.........................................................................
+} // namespace abp
+//.........................................................................
+
+#endif // EXTENSIONS_ABP_TYPESELECTIONPAGE_HXX
+
diff --git a/extensions/source/abpilot/unodialogabp.cxx b/extensions/source/abpilot/unodialogabp.cxx
new file mode 100644
index 000000000000..69c2c5e107d5
--- /dev/null
+++ b/extensions/source/abpilot/unodialogabp.cxx
@@ -0,0 +1,199 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: unodialogabp.cxx,v $
+ * $Revision: 1.13 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_extensions.hxx"
+#include "unodialogabp.hxx"
+#include <cppuhelper/typeprovider.hxx>
+#include "abspilot.hxx"
+#include <comphelper/sequence.hxx>
+#include <vcl/msgbox.hxx>
+
+extern "C" void SAL_CALL createRegistryInfo_OABSPilotUno()
+{
+ static ::abp::OMultiInstanceAutoRegistration< ::abp::OABSPilotUno > aAutoRegistration;
+}
+
+#define PROPERTY_ID_DATASOURCENAME 3
+//.........................................................................
+namespace abp
+{
+//.........................................................................
+
+ using namespace ::com::sun::star::uno;
+ using namespace ::com::sun::star::lang;
+ using namespace ::com::sun::star::beans;
+ using namespace ::com::sun::star::ui::dialogs;
+
+ //=====================================================================
+ //= OABSPilotUno
+ //=====================================================================
+ //---------------------------------------------------------------------
+ OABSPilotUno::OABSPilotUno(const Reference< XMultiServiceFactory >& _rxORB)
+ :OGenericUnoDialog(_rxORB)
+ {
+ registerProperty( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DataSourceName")), PROPERTY_ID_DATASOURCENAME, PropertyAttribute::READONLY ,
+ &m_sDataSourceName, ::getCppuType( &m_sDataSourceName ) );
+ }
+
+ //--------------------------------------------------------------------------
+ Any SAL_CALL OABSPilotUno::queryInterface( const Type& aType ) throw (RuntimeException)
+ {
+ Any aReturn = OABSPilotUno_DBase::queryInterface( aType );
+ return aReturn.hasValue() ? aReturn : OABSPilotUno_JBase::queryInterface( aType );
+ }
+
+ //--------------------------------------------------------------------------
+ void SAL_CALL OABSPilotUno::acquire( ) throw ()
+ {
+ OABSPilotUno_DBase::acquire();
+ }
+
+ //--------------------------------------------------------------------------
+ void SAL_CALL OABSPilotUno::release( ) throw ()
+ {
+ OABSPilotUno_DBase::release();
+ }
+
+ //---------------------------------------------------------------------
+ Sequence< Type > SAL_CALL OABSPilotUno::getTypes( ) throw (RuntimeException)
+ {
+ return ::comphelper::concatSequences(
+ OABSPilotUno_DBase::getTypes(),
+ OABSPilotUno_JBase::getTypes()
+ );
+ }
+
+ //---------------------------------------------------------------------
+ Sequence<sal_Int8> SAL_CALL OABSPilotUno::getImplementationId( ) throw(RuntimeException)
+ {
+ static ::cppu::OImplementationId* s_pId;
+ if ( !s_pId )
+ {
+ ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() );
+ if ( !s_pId )
+ {
+ static ::cppu::OImplementationId s_aId;
+ s_pId = &s_aId;
+ }
+ }
+ return s_pId->getImplementationId();
+ }
+
+ //---------------------------------------------------------------------
+ Reference< XInterface > SAL_CALL OABSPilotUno::Create(const Reference< XMultiServiceFactory >& _rxFactory)
+ {
+ return *(new OABSPilotUno(_rxFactory));
+ }
+
+ //---------------------------------------------------------------------
+ ::rtl::OUString SAL_CALL OABSPilotUno::getImplementationName() throw(RuntimeException)
+ {
+ return getImplementationName_Static();
+ }
+
+ //---------------------------------------------------------------------
+ ::rtl::OUString OABSPilotUno::getImplementationName_Static() throw(RuntimeException)
+ {
+ return ::rtl::OUString::createFromAscii("org.openoffice.comp.abp.OAddressBookSourcePilot");
+ }
+
+ //---------------------------------------------------------------------
+ ::comphelper::StringSequence SAL_CALL OABSPilotUno::getSupportedServiceNames() throw(RuntimeException)
+ {
+ return getSupportedServiceNames_Static();
+ }
+
+ //---------------------------------------------------------------------
+ ::comphelper::StringSequence OABSPilotUno::getSupportedServiceNames_Static() throw(RuntimeException)
+ {
+ ::comphelper::StringSequence aSupported(1);
+ aSupported.getArray()[0] = ::rtl::OUString::createFromAscii("com.sun.star.ui.dialogs.AddressBookSourcePilot");
+ return aSupported;
+ }
+
+ //---------------------------------------------------------------------
+ Reference<XPropertySetInfo> SAL_CALL OABSPilotUno::getPropertySetInfo() throw(RuntimeException)
+ {
+ Reference<XPropertySetInfo> xInfo( createPropertySetInfo( getInfoHelper() ) );
+ return xInfo;
+ }
+
+ //---------------------------------------------------------------------
+ ::cppu::IPropertyArrayHelper& OABSPilotUno::getInfoHelper()
+ {
+ return *const_cast<OABSPilotUno*>(this)->getArrayHelper();
+ }
+
+ //--------------------------------------------------------------------------
+ ::cppu::IPropertyArrayHelper* OABSPilotUno::createArrayHelper( ) const
+ {
+ Sequence< Property > aProps;
+ describeProperties(aProps);
+ return new ::cppu::OPropertyArrayHelper(aProps);
+ }
+
+ //--------------------------------------------------------------------------
+ Dialog* OABSPilotUno::createDialog(Window* _pParent)
+ {
+ return new OAddessBookSourcePilot(_pParent, m_aContext.getLegacyServiceFactory());
+ }
+
+ //--------------------------------------------------------------------------
+ Any SAL_CALL OABSPilotUno::execute( const Sequence< NamedValue >& /*lArgs*/ ) throw (IllegalArgumentException, Exception, RuntimeException)
+ {
+ // not interested in the context, not interested in the args
+ // -> call the execute method of the XExecutableDialog
+ static_cast< XExecutableDialog* >( this )->execute();
+
+ // result interest not really ...
+ // We show this dialog one times only!
+ // User has one chance to accept it or not.
+ // (or he can start it again by using wizard-menu!)
+ // So we should deregister it on our general job execution service by using right protocol parameters.
+ ::com::sun::star::uno::Sequence< ::com::sun::star::beans::NamedValue > lProtocol(1);
+ lProtocol[0].Name = ::rtl::OUString::createFromAscii("Deactivate");
+ lProtocol[0].Value <<= sal_True;
+ return makeAny( lProtocol );
+ }
+ // -----------------------------------------------------------------------------
+ void OABSPilotUno::executedDialog(sal_Int16 _nExecutionResult)
+ {
+ if ( _nExecutionResult == RET_OK )
+ {
+ const AddressSettings& aSettings = static_cast<OAddessBookSourcePilot*>(m_pDialog)->getSettings();
+ m_sDataSourceName = aSettings.bRegisterDataSource ? aSettings.sRegisteredDataSourceName : aSettings.sDataSourceName;
+ }
+ }
+
+//.........................................................................
+} // namespace abp
+//.........................................................................
+
diff --git a/extensions/source/abpilot/unodialogabp.hxx b/extensions/source/abpilot/unodialogabp.hxx
new file mode 100644
index 000000000000..40912d502aee
--- /dev/null
+++ b/extensions/source/abpilot/unodialogabp.hxx
@@ -0,0 +1,104 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: unodialogabp.hxx,v $
+ * $Revision: 1.9 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef EXTENSIONS_ABP_UNODIALOG_HXX
+#define EXTENSIONS_ABP_UNODIALOG_HXX
+
+#include <svtools/genericunodialog.hxx>
+#include <comphelper/proparrhlp.hxx>
+#include "componentmodule.hxx"
+#include <com/sun/star/task/XJob.hpp>
+#include <cppuhelper/implbase1.hxx>
+
+//.........................................................................
+namespace abp
+{
+//.........................................................................
+
+ //=====================================================================
+ //= OABSPilotUno
+ //=====================================================================
+ class OABSPilotUno;
+ typedef ::svt::OGenericUnoDialog OABSPilotUno_DBase;
+ typedef ::cppu::ImplHelper1< ::com::sun::star::task::XJob > OABSPilotUno_JBase;
+ typedef ::comphelper::OPropertyArrayUsageHelper< OABSPilotUno > OABSPilotUno_PBase;
+ /// the UNO wrapper for the address book source pilot
+ class OABSPilotUno
+ :public OABSPilotUno_DBase
+ ,public OABSPilotUno_JBase
+ ,public OABSPilotUno_PBase
+ ,public OModuleResourceClient
+ {
+ ::rtl::OUString m_sDataSourceName;
+ OABSPilotUno(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxORB);
+
+ public:
+ // XInterface (disambiguation)
+ virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type& aType ) throw (::com::sun::star::uno::RuntimeException);
+ virtual void SAL_CALL acquire( ) throw ();
+ virtual void SAL_CALL release( ) throw ();
+
+ // XTypeProvider
+ virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes( ) throw (::com::sun::star::uno::RuntimeException);
+ virtual ::com::sun::star::uno::Sequence<sal_Int8> SAL_CALL getImplementationId( ) throw(::com::sun::star::uno::RuntimeException);
+
+ // XServiceInfo
+ virtual ::rtl::OUString SAL_CALL getImplementationName() throw(::com::sun::star::uno::RuntimeException);
+ virtual ::comphelper::StringSequence SAL_CALL getSupportedServiceNames() throw(::com::sun::star::uno::RuntimeException);
+
+ // XServiceInfo - static methods
+ static ::com::sun::star::uno::Sequence< ::rtl::OUString > getSupportedServiceNames_Static(void) throw( ::com::sun::star::uno::RuntimeException );
+ static ::rtl::OUString getImplementationName_Static(void) throw( ::com::sun::star::uno::RuntimeException );
+ static ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >
+ SAL_CALL Create(const ::com::sun::star::uno::Reference< com::sun::star::lang::XMultiServiceFactory >&);
+
+ // XPropertySet
+ virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo> SAL_CALL getPropertySetInfo() throw(::com::sun::star::uno::RuntimeException);
+ virtual ::cppu::IPropertyArrayHelper& SAL_CALL getInfoHelper();
+
+ // OPropertyArrayUsageHelper
+ virtual ::cppu::IPropertyArrayHelper* createArrayHelper( ) const;
+
+ // XJob
+ virtual ::com::sun::star::uno::Any SAL_CALL execute( const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::NamedValue >& lArgs ) throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException);
+
+ using OABSPilotUno_DBase::execute;
+ protected:
+ // OGenericUnoDialog overridables
+ virtual Dialog* createDialog(Window* _pParent);
+ virtual void executedDialog(sal_Int16 _nExecutionResult);
+ };
+
+//.........................................................................
+} // namespace abp
+//.........................................................................
+
+#endif // EXTENSIONS_ABP_UNODIALOG_HXX
+