summaryrefslogtreecommitdiff
path: root/svtools
diff options
context:
space:
mode:
authorCédric Bosdonnat <cedric.bosdonnat@free.fr>2012-12-20 09:42:58 +0100
committerCédric Bosdonnat <cedric.bosdonnat@free.fr>2012-12-20 18:02:53 +0100
commitf011e84a75651204f72d61773772f6a30841d18b (patch)
tree5c5159193be5ace53f85c6cecfc6ef0d9e2c03b4 /svtools
parent29c7c90fd26cd04fb1f0ba648609df36ebcc53ff (diff)
Partially reverted 786f15e605867668d88ab23d66cabb18f18bdcf9
This dialog is still of some use with some Writer Wizards and templates. Re-added the dialog, but moved the menu entry to Tools menu in Writer. The menu entry has not been added back in the other applications. Conflicts: sfx2/sdi/appslots.sdi sfx2/source/appl/appserv.cxx sfx2/source/doc/docvor.cxx sfx2/source/doc/docvor.hrc sfx2/source/doc/docvor.src Change-Id: I1388d955752e99ab6d39dfc81bb41a97b33bdfcd
Diffstat (limited to 'svtools')
-rw-r--r--svtools/AllLangResTarget_svt.mk1
-rw-r--r--svtools/Library_svt.mk2
-rw-r--r--svtools/Package_inc.mk1
-rw-r--r--svtools/inc/svtools/addresstemplate.hxx155
-rw-r--r--svtools/inc/svtools/svtools.hrc1
-rw-r--r--svtools/source/dialogs/addresstemplate.cxx1327
-rw-r--r--svtools/source/dialogs/addresstemplate.src313
-rw-r--r--svtools/source/uno/addrtempuno.cxx228
-rw-r--r--svtools/source/uno/miscservices.cxx14
-rw-r--r--svtools/util/svt.component3
10 files changed, 2045 insertions, 0 deletions
diff --git a/svtools/AllLangResTarget_svt.mk b/svtools/AllLangResTarget_svt.mk
index c6d3d1c5d8e1..3ff300084a41 100644
--- a/svtools/AllLangResTarget_svt.mk
+++ b/svtools/AllLangResTarget_svt.mk
@@ -49,6 +49,7 @@ $(eval $(call gb_SrsTarget_add_files,svt/res,\
svtools/source/control/ctrlbox.src \
svtools/source/control/ctrltool.src \
svtools/source/control/filectrl.src \
+ svtools/source/dialogs/addresstemplate.src \
svtools/source/dialogs/filedlg2.src \
svtools/source/dialogs/formats.src \
svtools/source/dialogs/so3res.src \
diff --git a/svtools/Library_svt.mk b/svtools/Library_svt.mk
index 9fb3a426bbd2..97b7e2e9ec73 100644
--- a/svtools/Library_svt.mk
+++ b/svtools/Library_svt.mk
@@ -123,6 +123,7 @@ $(eval $(call gb_Library_add_exception_objects,svt,\
svtools/source/control/urlcontrol \
svtools/source/control/valueacc \
svtools/source/control/valueset \
+ svtools/source/dialogs/addresstemplate \
svtools/source/dialogs/colrdlg \
svtools/source/dialogs/filedlg \
svtools/source/dialogs/filedlg2 \
@@ -230,6 +231,7 @@ $(eval $(call gb_Library_add_exception_objects,svt,\
svtools/source/toolpanel/toolpaneldeckpeer \
svtools/source/toolpanel/toolpaneldrawer \
svtools/source/toolpanel/toolpaneldrawerpeer \
+ svtools/source/uno/addrtempuno \
svtools/source/uno/contextmenuhelper \
svtools/source/uno/framestatuslistener \
svtools/source/uno/generictoolboxcontroller \
diff --git a/svtools/Package_inc.mk b/svtools/Package_inc.mk
index beca57fd519d..85afa18faf61 100644
--- a/svtools/Package_inc.mk
+++ b/svtools/Package_inc.mk
@@ -27,6 +27,7 @@ $(eval $(call gb_Package_add_file,svtools_inc,inc/svtools/accessibilityoptions.h
$(eval $(call gb_Package_add_file,svtools_inc,inc/svtools/accessiblefactory.hxx,svtools/accessiblefactory.hxx))
$(eval $(call gb_Package_add_file,svtools_inc,inc/svtools/accessibletable.hxx,svtools/accessibletable.hxx))
$(eval $(call gb_Package_add_file,svtools_inc,inc/svtools/accessibletableprovider.hxx,svtools/accessibletableprovider.hxx))
+$(eval $(call gb_Package_add_file,svtools_inc,inc/svtools/addresstemplate.hxx,svtools/addresstemplate.hxx))
$(eval $(call gb_Package_add_file,svtools_inc,inc/svtools/apearcfg.hxx,svtools/apearcfg.hxx))
$(eval $(call gb_Package_add_file,svtools_inc,inc/svtools/asynclink.hxx,svtools/asynclink.hxx))
$(eval $(call gb_Package_add_file,svtools_inc,inc/svtools/bindablecontrolhelper.hxx,svtools/bindablecontrolhelper.hxx))
diff --git a/svtools/inc/svtools/addresstemplate.hxx b/svtools/inc/svtools/addresstemplate.hxx
new file mode 100644
index 000000000000..7d716f644f38
--- /dev/null
+++ b/svtools/inc/svtools/addresstemplate.hxx
@@ -0,0 +1,155 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#ifndef _SVT_ADDRESSTEMPLATE_HXX_
+#define _SVT_ADDRESSTEMPLATE_HXX_
+
+#include "svtools/svtdllapi.h"
+#include <vcl/dialog.hxx>
+#include <vcl/group.hxx>
+#include <vcl/fixed.hxx>
+#include <vcl/combobox.hxx>
+#include <vcl/button.hxx>
+#include <vcl/lstbox.hxx>
+#include <vcl/scrbar.hxx>
+#include <com/sun/star/container/XNameAccess.hpp>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/util/AliasProgrammaticPair.hpp>
+#include <com/sun/star/sdb/XDatabaseContext.hpp>
+#include <com/sun/star/sdbc/XDataSource.hpp>
+#include <unotools/configitem.hxx>
+
+// .......................................................................
+namespace svt
+{
+// .......................................................................
+
+ // ===================================================================
+ // = AddressBookSourceDialog
+ // ===================================================================
+ struct AddressBookSourceDialogData;
+ class SVT_DLLPUBLIC AddressBookSourceDialog : public ModalDialog
+ {
+ protected:
+ // Controls
+ FixedLine m_aDatasourceFrame;
+ FixedText m_aDatasourceLabel;
+ ComboBox m_aDatasource;
+ PushButton m_aAdministrateDatasources;
+ FixedText m_aTableLabel;
+ ComboBox m_aTable;
+
+ FixedText m_aFieldsTitle;
+ Window m_aFieldsFrame;
+
+ ScrollBar m_aFieldScroller;
+ OKButton m_aOK;
+ CancelButton m_aCancel;
+ HelpButton m_aHelp;
+
+ // string to display for "no selection"
+ const String m_sNoFieldSelection;
+
+ /// the DatabaseContext for selecting data sources
+ ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XDatabaseContext >
+ m_xDatabaseContext;
+ // the ORB for creating objects
+ ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >
+ m_xORB;
+ ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >
+ m_xCurrentDatasourceTables;
+
+ AddressBookSourceDialogData*
+ m_pImpl;
+
+ public:
+ AddressBookSourceDialog( Window* _pParent,
+ const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxORB );
+
+ /** if you use this ctor, the dialog
+ <ul><li>will not store it's data in the configuration (nor initially retrieve it from there)</li>
+ <li>will not allow to change the data source name</li>
+ <li>will not allow to change the table name</li>
+ <li>will not allow to call the data source administration dialog</li>
+ </ul>
+
+ @param _rxORB
+ a service factory to use for various UNO related needs
+ @param _rxTransientDS
+ the data source to obtain connections from
+ @param _rDataSourceName
+ the to-be name of _rxTransientDS. This is only for displaying this
+ name to the user, since the dialog completely works on _rxTransientDS,
+ and doesn't allow to change this.
+ @param _rTable
+ the table name to display. It must refer to a valid table, relative to a connection
+ obtained from <arg>_rxTransientDS</arg>
+ */
+ AddressBookSourceDialog( Window* _pParent,
+ const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxORB,
+ const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDataSource >& _rxTransientDS,
+ const ::rtl::OUString& _rDataSourceName,
+ const ::rtl::OUString& _rTable,
+ const ::com::sun::star::uno::Sequence< ::com::sun::star::util::AliasProgrammaticPair >& _rMapping
+ );
+
+ ~AddressBookSourceDialog();
+
+ // to be used if the object was constructed for editing a field mapping only
+ void getFieldMapping(
+ ::com::sun::star::uno::Sequence< ::com::sun::star::util::AliasProgrammaticPair >& _rMapping) const;
+
+ protected:
+ void implConstruct();
+
+ // Window overridables
+ virtual long PreNotify( NotifyEvent& _rNEvt );
+
+ // implementations
+ void implScrollFields(sal_Int32 _nPos, sal_Bool _bAdjustFocus, sal_Bool _bAdjustScrollbar);
+ void implSelectField(ListBox* _pBox, const String& _rText);
+
+ void initalizeListBox(ListBox* _pList);
+ void resetTables();
+ void resetFields();
+
+ // fill in the data sources listbox
+ void initializeDatasources();
+
+ // initialize the dialog from the configuration data
+ void loadConfiguration();
+
+ DECL_LINK(OnFieldScroll, ScrollBar*);
+ DECL_LINK(OnFieldSelect, ListBox*);
+ DECL_LINK(OnAdministrateDatasources, void*);
+ DECL_LINK(OnComboGetFocus, ComboBox*);
+ DECL_LINK(OnComboLoseFocus, ComboBox*);
+ DECL_LINK(OnComboSelect, ComboBox*);
+ DECL_LINK(OnOkClicked, void*);
+ DECL_LINK(OnDelayedInitialize, void*);
+ };
+
+
+// .......................................................................
+} // namespace svt
+// .......................................................................
+
+#endif // _SVT_ADDRESSTEMPLATE_HXX_
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/svtools/inc/svtools/svtools.hrc b/svtools/inc/svtools/svtools.hrc
index 6979db55d01e..bccdb1a451eb 100644
--- a/svtools/inc/svtools/svtools.hrc
+++ b/svtools/inc/svtools/svtools.hrc
@@ -219,6 +219,7 @@
// dialogs
#define DLG_LOGIN (RID_SVTOOLS_START+113)
+#define DLG_ADDRESSBOOKSOURCE (RID_SVTOOLS_START+114)
//.............................................................................
// bitmaps
diff --git a/svtools/source/dialogs/addresstemplate.cxx b/svtools/source/dialogs/addresstemplate.cxx
new file mode 100644
index 000000000000..21065383a99d
--- /dev/null
+++ b/svtools/source/dialogs/addresstemplate.cxx
@@ -0,0 +1,1327 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+
+#include <stdio.h>
+#include <svtools/addresstemplate.hxx>
+#include "addresstemplate.hrc"
+#include <svtools/svtools.hrc>
+#include <svtools/helpid.hrc>
+#include <svtools/svtresid.hxx>
+#include <tools/debug.hxx>
+#include <comphelper/extract.hxx>
+#include <comphelper/interaction.hxx>
+#include <comphelper/processfactory.hxx>
+#include <comphelper/stl_types.hxx>
+#include <comphelper/string.hxx>
+#include <vcl/stdtext.hxx>
+#include <vcl/waitobj.hxx>
+#include <vcl/msgbox.hxx>
+#include <toolkit/helper/vclunohelper.hxx>
+#include <com/sun/star/ui/dialogs/XExecutableDialog.hpp>
+#include <com/sun/star/awt/XWindow.hpp>
+#include <com/sun/star/beans/PropertyValue.hpp>
+#include <com/sun/star/beans/XPropertySet.hpp>
+#include <com/sun/star/sdb/DatabaseContext.hpp>
+#include <com/sun/star/sdb/XCompletedConnection.hpp>
+#include <com/sun/star/sdb/SQLContext.hpp>
+#include <com/sun/star/sdbc/SQLWarning.hpp>
+#include <com/sun/star/sdbc/XConnection.hpp>
+#include <com/sun/star/task/InteractionHandler.hpp>
+#include <com/sun/star/sdbcx/XTablesSupplier.hpp>
+#include <com/sun/star/sdbcx/XColumnsSupplier.hpp>
+#include <com/sun/star/sdb/CommandType.hpp>
+#include <svtools/localresaccess.hxx>
+#include "svl/filenotation.hxx"
+#include <tools/urlobj.hxx>
+#include <algorithm>
+
+// .......................................................................
+namespace svt
+{
+// .......................................................................
+
+ using namespace ::com::sun::star::uno;
+ using namespace ::com::sun::star::lang;
+ using namespace ::com::sun::star::container;
+ using namespace ::com::sun::star::ui::dialogs;
+ using namespace ::com::sun::star::util;
+ using namespace ::com::sun::star::beans;
+ using namespace ::com::sun::star::sdb;
+ using namespace ::com::sun::star::sdbc;
+ using namespace ::com::sun::star::sdbcx;
+ using namespace ::com::sun::star::task;
+ using namespace ::comphelper;
+ using namespace ::utl;
+
+ DECLARE_STL_VECTOR( String, StringArray );
+ DECLARE_STL_STDKEY_SET( ::rtl::OUString, StringBag );
+ DECLARE_STL_USTRINGACCESS_MAP( ::rtl::OUString, MapString2String );
+
+ namespace
+ {
+ String lcl_getSelectedDataSource( const ComboBox& _dataSourceCombo )
+ {
+ String selectedDataSource = _dataSourceCombo.GetText();
+ if ( _dataSourceCombo.GetEntryPos( selectedDataSource ) == LISTBOX_ENTRY_NOTFOUND )
+ {
+ // none of the pre-selected entries -> assume a path to a database document
+ OFileNotation aFileNotation( selectedDataSource, OFileNotation::N_SYSTEM );
+ selectedDataSource = aFileNotation.get( OFileNotation::N_URL );
+ }
+ return selectedDataSource;
+ }
+ }
+
+ // ===================================================================
+ // = IAssigmentData
+ // ===================================================================
+ class IAssigmentData
+ {
+ public:
+ virtual ~IAssigmentData();
+
+ /// the data source to use for the address book
+ virtual ::rtl::OUString getDatasourceName() const = 0;
+
+ /// the command to use for the address book
+ virtual ::rtl::OUString getCommand() const = 0;
+
+ /** the command type to use for the address book
+ @return
+ a <type scope="com.sun.star.sdb">CommandType</type> value
+ */
+ virtual sal_Int32 getCommandType() const = 0;
+
+ /// checks whether or not there is an assignment for a given logical field
+ virtual sal_Bool hasFieldAssignment(const ::rtl::OUString& _rLogicalName) = 0;
+ /// retrieves the assignment for a given logical field
+ virtual ::rtl::OUString getFieldAssignment(const ::rtl::OUString& _rLogicalName) = 0;
+
+ /// set the assignment for a given logical field
+ virtual void setFieldAssignment(const ::rtl::OUString& _rLogicalName, const ::rtl::OUString& _rAssignment) = 0;
+ /// clear the assignment for a given logical field
+ virtual void clearFieldAssignment(const ::rtl::OUString& _rLogicalName) = 0;
+
+ virtual void setDatasourceName(const ::rtl::OUString& _rName) = 0;
+ virtual void setCommand(const ::rtl::OUString& _rCommand) = 0;
+ };
+
+ // -------------------------------------------------------------------
+ IAssigmentData::~IAssigmentData()
+ {
+ }
+
+ // ===================================================================
+ // = AssigmentTransientData
+ // ===================================================================
+ class AssigmentTransientData : public IAssigmentData
+ {
+ protected:
+ Reference< XDataSource > m_xDataSource;
+ ::rtl::OUString m_sDSName;
+ ::rtl::OUString m_sTableName;
+ MapString2String m_aAliases;
+
+public:
+ AssigmentTransientData(
+ const Reference< XDataSource >& _rxDataSource,
+ const ::rtl::OUString& _rDataSourceName,
+ const ::rtl::OUString& _rTableName,
+ const Sequence< AliasProgrammaticPair >& _rFields
+ );
+
+ // IAssigmentData overridables
+ virtual ::rtl::OUString getDatasourceName() const;
+ virtual ::rtl::OUString getCommand() const;
+ virtual sal_Int32 getCommandType() const;
+
+ virtual sal_Bool hasFieldAssignment(const ::rtl::OUString& _rLogicalName);
+ virtual ::rtl::OUString getFieldAssignment(const ::rtl::OUString& _rLogicalName);
+ virtual void setFieldAssignment(const ::rtl::OUString& _rLogicalName, const ::rtl::OUString& _rAssignment);
+ virtual void clearFieldAssignment(const ::rtl::OUString& _rLogicalName);
+
+ virtual void setDatasourceName(const ::rtl::OUString& _rName);
+ virtual void setCommand(const ::rtl::OUString& _rCommand);
+ };
+
+ // -------------------------------------------------------------------
+ AssigmentTransientData::AssigmentTransientData( const Reference< XDataSource >& _rxDataSource,
+ const ::rtl::OUString& _rDataSourceName, const ::rtl::OUString& _rTableName,
+ const Sequence< AliasProgrammaticPair >& _rFields )
+ :m_xDataSource( _rxDataSource )
+ ,m_sDSName( _rDataSourceName )
+ ,m_sTableName( _rTableName )
+ {
+ // fill our aliaes structure
+ // first collect all known programmatic names
+ StringBag aKnownNames;
+
+ rtl::OUString sLogicalFieldNames(SVT_RESSTR(STR_LOGICAL_FIELD_NAMES));
+ sal_Int32 nIndex = 0;
+ do
+ {
+ rtl::OUString aToken = sLogicalFieldNames.getToken(0, ';', nIndex);
+ aKnownNames.insert(aToken);
+ }
+ while ( nIndex >= 0);
+
+ // loop throuzh the given names
+ const AliasProgrammaticPair* pFields = _rFields.getConstArray();
+ const AliasProgrammaticPair* pFieldsEnd = pFields + _rFields.getLength();
+ for (;pFields != pFieldsEnd; ++pFields)
+ {
+ StringBagIterator aKnownPos = aKnownNames.find( pFields->ProgrammaticName );
+ if ( aKnownNames.end() != aKnownPos )
+ {
+ m_aAliases[ pFields->ProgrammaticName ] = pFields->Alias;
+ }
+ else
+ {
+ OSL_FAIL( ( ::rtl::OString("AssigmentTransientData::AssigmentTransientData: unknown programmatic name (")
+ += ::rtl::OString(pFields->ProgrammaticName.getStr(), pFields->ProgrammaticName.getLength(), RTL_TEXTENCODING_ASCII_US)
+ += ::rtl::OString(")!")
+ ).getStr()
+ );
+ }
+ }
+ }
+
+ // -------------------------------------------------------------------
+ ::rtl::OUString AssigmentTransientData::getDatasourceName() const
+ {
+ return m_sDSName;
+ }
+
+ // -------------------------------------------------------------------
+ ::rtl::OUString AssigmentTransientData::getCommand() const
+ {
+ return m_sTableName;
+ }
+
+ // -------------------------------------------------------------------
+ sal_Int32 AssigmentTransientData::getCommandType() const
+ {
+ return CommandType::TABLE;
+ }
+
+ // -------------------------------------------------------------------
+ sal_Bool AssigmentTransientData::hasFieldAssignment(const ::rtl::OUString& _rLogicalName)
+ {
+ ConstMapString2StringIterator aPos = m_aAliases.find( _rLogicalName );
+ return ( m_aAliases.end() != aPos )
+ && ( !aPos->second.isEmpty() );
+ }
+
+ // -------------------------------------------------------------------
+ ::rtl::OUString AssigmentTransientData::getFieldAssignment(const ::rtl::OUString& _rLogicalName)
+ {
+ ::rtl::OUString sReturn;
+ ConstMapString2StringIterator aPos = m_aAliases.find( _rLogicalName );
+ if ( m_aAliases.end() != aPos )
+ sReturn = aPos->second;
+
+ return sReturn;
+ }
+
+ // -------------------------------------------------------------------
+ void AssigmentTransientData::setFieldAssignment(const ::rtl::OUString& _rLogicalName, const ::rtl::OUString& _rAssignment)
+ {
+ m_aAliases[ _rLogicalName ] = _rAssignment;
+ }
+
+ // -------------------------------------------------------------------
+ void AssigmentTransientData::clearFieldAssignment(const ::rtl::OUString& _rLogicalName)
+ {
+ MapString2StringIterator aPos = m_aAliases.find( _rLogicalName );
+ if ( m_aAliases.end() != aPos )
+ m_aAliases.erase( aPos );
+ }
+
+ // -------------------------------------------------------------------
+ void AssigmentTransientData::setDatasourceName(const ::rtl::OUString&)
+ {
+ OSL_FAIL( "AssigmentTransientData::setDatasourceName: cannot be implemented for transient data!" );
+ }
+
+ // -------------------------------------------------------------------
+ void AssigmentTransientData::setCommand(const ::rtl::OUString&)
+ {
+ OSL_FAIL( "AssigmentTransientData::setCommand: cannot be implemented for transient data!" );
+ }
+
+ // ===================================================================
+ // = AssignmentPersistentData
+ // ===================================================================
+ class AssignmentPersistentData
+ :public ::utl::ConfigItem
+ ,public IAssigmentData
+ {
+ protected:
+ StringBag m_aStoredFields;
+
+ protected:
+ ::com::sun::star::uno::Any
+ getProperty(const ::rtl::OUString& _rLocalName) const;
+ ::com::sun::star::uno::Any
+ getProperty(const sal_Char* _pLocalName) const;
+
+ ::rtl::OUString getStringProperty(const sal_Char* _pLocalName) const;
+ sal_Int32 getInt32Property(const sal_Char* _pLocalName) const;
+
+ ::rtl::OUString getStringProperty(const ::rtl::OUString& _rLocalName) const;
+
+ void setStringProperty(const sal_Char* _pLocalName, const ::rtl::OUString& _rValue);
+
+ public:
+ AssignmentPersistentData();
+ ~AssignmentPersistentData();
+
+ // IAssigmentData overridables
+ virtual ::rtl::OUString getDatasourceName() const;
+ virtual ::rtl::OUString getCommand() const;
+ virtual sal_Int32 getCommandType() const;
+
+ virtual sal_Bool hasFieldAssignment(const ::rtl::OUString& _rLogicalName);
+ virtual ::rtl::OUString getFieldAssignment(const ::rtl::OUString& _rLogicalName);
+ virtual void setFieldAssignment(const ::rtl::OUString& _rLogicalName, const ::rtl::OUString& _rAssignment);
+ virtual void clearFieldAssignment(const ::rtl::OUString& _rLogicalName);
+
+ virtual void setDatasourceName(const ::rtl::OUString& _rName);
+ virtual void setCommand(const ::rtl::OUString& _rCommand);
+
+ virtual void Notify( const com::sun::star::uno::Sequence<rtl::OUString>& aPropertyNames);
+ virtual void Commit();
+ };
+
+
+void AssignmentPersistentData::Notify( const com::sun::star::uno::Sequence<rtl::OUString>& )
+{
+}
+
+void AssignmentPersistentData::Commit()
+{
+}
+
+ // -------------------------------------------------------------------
+ AssignmentPersistentData::AssignmentPersistentData()
+ :ConfigItem( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Office.DataAccess/AddressBook" )))
+ {
+ Sequence< ::rtl::OUString > aStoredNames = GetNodeNames(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Fields")));
+ const ::rtl::OUString* pStoredNames = aStoredNames.getConstArray();
+ for (sal_Int32 i=0; i<aStoredNames.getLength(); ++i, ++pStoredNames)
+ m_aStoredFields.insert(*pStoredNames);
+ }
+
+ // -------------------------------------------------------------------
+ AssignmentPersistentData::~AssignmentPersistentData()
+ {
+ }
+
+ // -------------------------------------------------------------------
+ sal_Bool AssignmentPersistentData::hasFieldAssignment(const ::rtl::OUString& _rLogicalName)
+ {
+ return (m_aStoredFields.end() != m_aStoredFields.find(_rLogicalName));
+ }
+
+ // -------------------------------------------------------------------
+ ::rtl::OUString AssignmentPersistentData::getFieldAssignment(const ::rtl::OUString& _rLogicalName)
+ {
+ ::rtl::OUString sAssignment;
+ if (hasFieldAssignment(_rLogicalName))
+ {
+ ::rtl::OUString sFieldPath(RTL_CONSTASCII_USTRINGPARAM("Fields/"));
+ sFieldPath += _rLogicalName;
+ sFieldPath += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/AssignedFieldName"));
+ sAssignment = getStringProperty(sFieldPath);
+ }
+ return sAssignment;
+ }
+
+ // -------------------------------------------------------------------
+ Any AssignmentPersistentData::getProperty(const sal_Char* _pLocalName) const
+ {
+ return getProperty(::rtl::OUString::createFromAscii(_pLocalName));
+ }
+
+ // -------------------------------------------------------------------
+ Any AssignmentPersistentData::getProperty(const ::rtl::OUString& _rLocalName) const
+ {
+ Sequence< ::rtl::OUString > aProperties(&_rLocalName, 1);
+ Sequence< Any > aValues = const_cast<AssignmentPersistentData*>(this)->GetProperties(aProperties);
+ DBG_ASSERT(aValues.getLength() == 1, "AssignmentPersistentData::getProperty: invalid sequence length!");
+ return aValues[0];
+ }
+
+ // -------------------------------------------------------------------
+ ::rtl::OUString AssignmentPersistentData::getStringProperty(const ::rtl::OUString& _rLocalName) const
+ {
+ ::rtl::OUString sReturn;
+ getProperty( _rLocalName ) >>= sReturn;
+ return sReturn;
+ }
+
+ // -------------------------------------------------------------------
+ ::rtl::OUString AssignmentPersistentData::getStringProperty(const sal_Char* _pLocalName) const
+ {
+ ::rtl::OUString sReturn;
+ getProperty( _pLocalName ) >>= sReturn;
+ return sReturn;
+ }
+
+ // -------------------------------------------------------------------
+ sal_Int32 AssignmentPersistentData::getInt32Property(const sal_Char* _pLocalName) const
+ {
+ sal_Int32 nReturn = 0;
+ getProperty( _pLocalName ) >>= nReturn;
+ return nReturn;
+ }
+
+ // -------------------------------------------------------------------
+ void AssignmentPersistentData::setStringProperty(const sal_Char* _pLocalName, const ::rtl::OUString& _rValue)
+ {
+ Sequence< ::rtl::OUString > aNames(1);
+ Sequence< Any > aValues(1);
+ aNames[0] = ::rtl::OUString::createFromAscii(_pLocalName);
+ aValues[0] <<= _rValue;
+ PutProperties(aNames, aValues);
+ }
+
+ // -------------------------------------------------------------------
+ void AssignmentPersistentData::setFieldAssignment(const ::rtl::OUString& _rLogicalName, const ::rtl::OUString& _rAssignment)
+ {
+ if (_rAssignment.isEmpty())
+ {
+ if (hasFieldAssignment(_rLogicalName))
+ // the assignment exists but it should be reset
+ clearFieldAssignment(_rLogicalName);
+ return;
+ }
+
+ // Fields
+ ::rtl::OUString sDescriptionNodePath(RTL_CONSTASCII_USTRINGPARAM("Fields"));
+
+ // Fields/<field>
+ ::rtl::OUString sFieldElementNodePath(sDescriptionNodePath);
+ sFieldElementNodePath += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/"));
+ sFieldElementNodePath += _rLogicalName;
+
+ Sequence< PropertyValue > aNewFieldDescription(2);
+ // Fields/<field>/ProgrammaticFieldName
+ aNewFieldDescription[0].Name = sFieldElementNodePath;
+ aNewFieldDescription[0].Name += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/ProgrammaticFieldName"));
+ aNewFieldDescription[0].Value <<= _rLogicalName;
+ // Fields/<field>/AssignedFieldName
+ aNewFieldDescription[1].Name = sFieldElementNodePath;
+ aNewFieldDescription[1].Name += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/AssignedFieldName"));
+ aNewFieldDescription[1].Value <<= _rAssignment;
+
+ // just set the new value
+#ifdef DBG_UTIL
+ sal_Bool bSuccess =
+#endif
+ SetSetProperties(sDescriptionNodePath, aNewFieldDescription);
+ DBG_ASSERT(bSuccess, "AssignmentPersistentData::setFieldAssignment: could not commit the changes a field!");
+ }
+
+ // -------------------------------------------------------------------
+ void AssignmentPersistentData::clearFieldAssignment(const ::rtl::OUString& _rLogicalName)
+ {
+ if (!hasFieldAssignment(_rLogicalName))
+ // nothing to do
+ return;
+
+ ::rtl::OUString sDescriptionNodePath(RTL_CONSTASCII_USTRINGPARAM("Fields"));
+ Sequence< ::rtl::OUString > aNames(&_rLogicalName, 1);
+ ClearNodeElements(sDescriptionNodePath, aNames);
+ }
+
+ // -------------------------------------------------------------------
+ ::rtl::OUString AssignmentPersistentData::getDatasourceName() const
+ {
+ return getStringProperty( "DataSourceName" );
+ }
+
+ // -------------------------------------------------------------------
+ ::rtl::OUString AssignmentPersistentData::getCommand() const
+ {
+ return getStringProperty( "Command" );
+ }
+
+ // -------------------------------------------------------------------
+ void AssignmentPersistentData::setDatasourceName(const ::rtl::OUString& _rName)
+ {
+ setStringProperty( "DataSourceName", _rName );
+ }
+
+ // -------------------------------------------------------------------
+ void AssignmentPersistentData::setCommand(const ::rtl::OUString& _rCommand)
+ {
+ setStringProperty( "Command", _rCommand );
+ }
+
+ // -------------------------------------------------------------------
+ sal_Int32 AssignmentPersistentData::getCommandType() const
+ {
+ return getInt32Property( "CommandType" );
+ }
+
+ // ===================================================================
+ // = AddressBookSourceDialogData
+ // ===================================================================
+ struct AddressBookSourceDialogData
+ {
+ FixedText* pFieldLabels[FIELD_PAIRS_VISIBLE * 2];
+ ListBox* pFields[FIELD_PAIRS_VISIBLE * 2];
+
+ /// when working transient, we need the data source
+ Reference< XDataSource >
+ m_xTransientDataSource;
+ /// current scroll pos in the field list
+ sal_Int32 nFieldScrollPos;
+ /// the index within m_pFields of the last visible list box. This is redundant, it could be extracted from other members
+ sal_Int32 nLastVisibleListIndex;
+ /// indicates that we've an odd field number. This member is for efficiency only, it's redundant.
+ sal_Bool bOddFieldNumber : 1;
+ /// indicates that we're working with the real persistent configuration
+ sal_Bool bWorkingPersistent : 1;
+
+ /// the strings to use as labels for the field selection listboxes
+ StringArray aFieldLabels;
+ // the current field assignment
+ StringArray aFieldAssignments;
+ /// the logical field names
+ StringArray aLogicalFieldNames;
+
+ IAssigmentData* pConfigData;
+
+ // ................................................................
+ AddressBookSourceDialogData( )
+ :nFieldScrollPos(0)
+ ,nLastVisibleListIndex(0)
+ ,bOddFieldNumber(sal_False)
+ ,bWorkingPersistent( sal_True )
+ ,pConfigData( new AssignmentPersistentData )
+ {
+ }
+
+ // ................................................................
+ AddressBookSourceDialogData( const Reference< XDataSource >& _rxTransientDS, const ::rtl::OUString& _rDataSourceName,
+ const ::rtl::OUString& _rTableName, const Sequence< AliasProgrammaticPair >& _rFields )
+ :m_xTransientDataSource( _rxTransientDS )
+ ,nFieldScrollPos(0)
+ ,nLastVisibleListIndex(0)
+ ,bOddFieldNumber(sal_False)
+ ,bWorkingPersistent( sal_False )
+ ,pConfigData( new AssigmentTransientData( m_xTransientDataSource, _rDataSourceName, _rTableName, _rFields ) )
+ {
+ }
+
+ ~AddressBookSourceDialogData()
+ {
+ delete pConfigData;
+ }
+
+ };
+
+ // ===================================================================
+ // = AddressBookSourceDialog
+ // ===================================================================
+#define INIT_FIELDS() \
+ ModalDialog(_pParent, SvtResId( DLG_ADDRESSBOOKSOURCE ))\
+ ,m_aDatasourceFrame (this, SvtResId(FL_DATASOURCEFRAME))\
+ ,m_aDatasourceLabel (this, SvtResId(FT_DATASOURCE))\
+ ,m_aDatasource (this, SvtResId(CB_DATASOURCE))\
+ ,m_aAdministrateDatasources (this, SvtResId(PB_ADMINISTATE_DATASOURCES))\
+ ,m_aTableLabel (this, SvtResId(FT_TABLE))\
+ ,m_aTable (this, SvtResId(CB_TABLE))\
+ ,m_aFieldsTitle (this, SvtResId(FT_FIELDS))\
+ ,m_aFieldsFrame (this, SvtResId(CT_BORDER))\
+ ,m_aFieldScroller (&m_aFieldsFrame, SvtResId(SB_FIELDSCROLLER))\
+ ,m_aOK (this, SvtResId(PB_OK))\
+ ,m_aCancel (this, SvtResId(PB_CANCEL))\
+ ,m_aHelp (this, SvtResId(PB_HELP))\
+ ,m_sNoFieldSelection(SVT_RESSTR(STR_NO_FIELD_SELECTION))\
+ ,m_xORB(_rxORB)
+
+ // -------------------------------------------------------------------
+ AddressBookSourceDialog::AddressBookSourceDialog(Window* _pParent,
+ const Reference< XMultiServiceFactory >& _rxORB )
+ :INIT_FIELDS()
+ ,m_pImpl( new AddressBookSourceDialogData )
+ {
+ implConstruct();
+ }
+
+ // -------------------------------------------------------------------
+ AddressBookSourceDialog::AddressBookSourceDialog( Window* _pParent, const Reference< XMultiServiceFactory >& _rxORB,
+ const Reference< XDataSource >& _rxTransientDS, const ::rtl::OUString& _rDataSourceName,
+ const ::rtl::OUString& _rTable, const Sequence< AliasProgrammaticPair >& _rMapping )
+ :INIT_FIELDS()
+ ,m_pImpl( new AddressBookSourceDialogData( _rxTransientDS, _rDataSourceName, _rTable, _rMapping ) )
+ {
+ implConstruct();
+ }
+
+ // -------------------------------------------------------------------
+ void AddressBookSourceDialog::implConstruct()
+ {
+ for (sal_Int32 row=0; row<FIELD_PAIRS_VISIBLE; ++row)
+ {
+ for (sal_Int32 column=0; column<2; ++column)
+ {
+ // the label
+ m_pImpl->pFieldLabels[row * 2 + column] = new FixedText(&m_aFieldsFrame, SvtResId((sal_uInt16)(FT_FIELD_BASE + row * 2 + column)));
+ // the listbox
+ m_pImpl->pFields[row * 2 + column] = new ListBox(&m_aFieldsFrame, SvtResId((sal_uInt16)(LB_FIELD_BASE + row * 2 + column)));
+ m_pImpl->pFields[row * 2 + column]->SetDropDownLineCount(15);
+ m_pImpl->pFields[row * 2 + column]->SetSelectHdl(LINK(this, AddressBookSourceDialog, OnFieldSelect));
+
+ m_pImpl->pFields[row * 2 + column]->SetHelpId(HID_ADDRTEMPL_FIELD_ASSIGNMENT);
+ }
+ }
+
+ m_aFieldsFrame.SetStyle((m_aFieldsFrame.GetStyle() | WB_TABSTOP | WB_DIALOGCONTROL) & ~WB_NODIALOGCONTROL);
+
+ // correct the z-order
+ m_aFieldScroller.SetZOrder(m_pImpl->pFields[FIELD_CONTROLS_VISIBLE - 1], WINDOW_ZORDER_BEHIND);
+ m_aOK.SetZOrder(&m_aFieldsFrame, WINDOW_ZORDER_BEHIND);
+ m_aCancel.SetZOrder(&m_aOK, WINDOW_ZORDER_BEHIND);
+
+ initializeDatasources();
+
+ // for the moment, we have a hard coded list of all known fields.
+ // A better solution would be to store all known field translations in the configuration, which could be
+ // extensible by the user in an arbitrary way.
+ // But for the moment we need a quick solution ...
+ // (the main thing would be to store the translations to use here in the user interface, besides that, the code
+ // should be adjustable with a rather small effort.)
+
+ // initialize the strings for the field labels
+ m_pImpl->aFieldLabels.push_back( SVT_RESSTR( STR_FIELD_FIRSTNAME ));
+ m_pImpl->aFieldLabels.push_back( SVT_RESSTR( STR_FIELD_LASTNAME ));
+ m_pImpl->aFieldLabels.push_back( SVT_RESSTR( STR_FIELD_COMPANY));
+ m_pImpl->aFieldLabels.push_back( SVT_RESSTR( STR_FIELD_DEPARTMENT ));
+ m_pImpl->aFieldLabels.push_back( SVT_RESSTR( STR_FIELD_STREET ));
+ m_pImpl->aFieldLabels.push_back( SVT_RESSTR( STR_FIELD_ZIPCODE ));
+ m_pImpl->aFieldLabels.push_back( SVT_RESSTR( STR_FIELD_CITY ));
+ m_pImpl->aFieldLabels.push_back( SVT_RESSTR( STR_FIELD_STATE));
+ m_pImpl->aFieldLabels.push_back( SVT_RESSTR( STR_FIELD_COUNTRY ));
+ m_pImpl->aFieldLabels.push_back( SVT_RESSTR( STR_FIELD_HOMETEL ));
+ m_pImpl->aFieldLabels.push_back( SVT_RESSTR( STR_FIELD_WORKTEL ));
+ m_pImpl->aFieldLabels.push_back( SVT_RESSTR( STR_FIELD_OFFICETEL));
+ m_pImpl->aFieldLabels.push_back( SVT_RESSTR( STR_FIELD_MOBILE));
+ m_pImpl->aFieldLabels.push_back( SVT_RESSTR( STR_FIELD_TELOTHER));
+ m_pImpl->aFieldLabels.push_back( SVT_RESSTR( STR_FIELD_PAGER));
+ m_pImpl->aFieldLabels.push_back( SVT_RESSTR( STR_FIELD_FAX ));
+ m_pImpl->aFieldLabels.push_back( SVT_RESSTR( STR_FIELD_EMAIL ));
+ m_pImpl->aFieldLabels.push_back( SVT_RESSTR( STR_FIELD_URL ));
+ m_pImpl->aFieldLabels.push_back( SVT_RESSTR( STR_FIELD_TITLE ));
+ m_pImpl->aFieldLabels.push_back( SVT_RESSTR( STR_FIELD_POSITION ));
+ m_pImpl->aFieldLabels.push_back( SVT_RESSTR( STR_FIELD_INITIALS ));
+ m_pImpl->aFieldLabels.push_back( SVT_RESSTR( STR_FIELD_ADDRFORM ));
+ m_pImpl->aFieldLabels.push_back( SVT_RESSTR( STR_FIELD_SALUTATION ));
+ m_pImpl->aFieldLabels.push_back( SVT_RESSTR( STR_FIELD_ID));
+ m_pImpl->aFieldLabels.push_back( SVT_RESSTR( STR_FIELD_CALENDAR));
+ m_pImpl->aFieldLabels.push_back( SVT_RESSTR( STR_FIELD_INVITE));
+ m_pImpl->aFieldLabels.push_back( SVT_RESSTR( STR_FIELD_NOTE));
+ m_pImpl->aFieldLabels.push_back( SVT_RESSTR( STR_FIELD_USER1));
+ m_pImpl->aFieldLabels.push_back( SVT_RESSTR( STR_FIELD_USER2));
+ m_pImpl->aFieldLabels.push_back( SVT_RESSTR( STR_FIELD_USER3));
+ m_pImpl->aFieldLabels.push_back( SVT_RESSTR( STR_FIELD_USER4));
+
+ // force a even number of known fields
+ m_pImpl->bOddFieldNumber = (m_pImpl->aFieldLabels.size() % 2) != 0;
+ if (m_pImpl->bOddFieldNumber)
+ m_pImpl->aFieldLabels.push_back( String() );
+
+ // limit the scrollbar range accordingly
+ sal_Int32 nOverallFieldPairs = m_pImpl->aFieldLabels.size() / 2;
+ m_aFieldScroller.SetRange( Range(0, nOverallFieldPairs - FIELD_PAIRS_VISIBLE) );
+ m_aFieldScroller.SetLineSize(1);
+ m_aFieldScroller.SetPageSize(FIELD_PAIRS_VISIBLE);
+
+ // reset the current field assignments
+ m_pImpl->aFieldAssignments.resize(m_pImpl->aFieldLabels.size());
+ // (empty strings mean "no assignment")
+
+ // some knittings
+ m_aFieldScroller.SetScrollHdl(LINK(this, AddressBookSourceDialog, OnFieldScroll));
+ m_aAdministrateDatasources.SetClickHdl(LINK(this, AddressBookSourceDialog, OnAdministrateDatasources));
+ m_aDatasource.EnableAutocomplete(sal_True);
+ m_aTable.EnableAutocomplete(sal_True);
+ m_aTable.SetGetFocusHdl(LINK(this, AddressBookSourceDialog, OnComboGetFocus));
+ m_aDatasource.SetGetFocusHdl(LINK(this, AddressBookSourceDialog, OnComboGetFocus));
+ m_aTable.SetLoseFocusHdl(LINK(this, AddressBookSourceDialog, OnComboLoseFocus));
+ m_aDatasource.SetLoseFocusHdl(LINK(this, AddressBookSourceDialog, OnComboLoseFocus));
+ m_aTable.SetSelectHdl(LINK(this, AddressBookSourceDialog, OnComboSelect));
+ m_aDatasource.SetSelectHdl(LINK(this, AddressBookSourceDialog, OnComboSelect));
+ m_aOK.SetClickHdl(LINK(this, AddressBookSourceDialog, OnOkClicked));
+
+ m_aDatasource.SetDropDownLineCount(15);
+
+ // initialize the field controls
+ resetFields();
+ m_aFieldScroller.SetThumbPos(0);
+ m_pImpl->nFieldScrollPos = -1;
+ implScrollFields(0, sal_False, sal_False);
+
+ // the logical names
+ rtl::OUString sLogicalFieldNames(SVT_RESSTR(STR_LOGICAL_FIELD_NAMES));
+ sal_Int32 nAdjustedTokenCount = comphelper::string::getTokenCount(sLogicalFieldNames, ';') + (m_pImpl->bOddFieldNumber ? 1 : 0);
+ DBG_ASSERT(nAdjustedTokenCount == (sal_Int32)m_pImpl->aFieldLabels.size(),
+ "AddressBookSourceDialog::AddressBookSourceDialog: inconsistence between logical and UI field names!");
+ m_pImpl->aLogicalFieldNames.reserve(nAdjustedTokenCount);
+ for (sal_Int32 i = 0; i<nAdjustedTokenCount; ++i)
+ m_pImpl->aLogicalFieldNames.push_back(comphelper::string::getToken(sLogicalFieldNames, i, ';'));
+
+ PostUserEvent(LINK(this, AddressBookSourceDialog, OnDelayedInitialize));
+ // so the dialog will at least show up before we do the loading of the
+ // configuration data and the (maybe time consuming) analysis of the data source/table to select
+
+ FreeResource();
+
+ if ( !m_pImpl->bWorkingPersistent )
+ {
+ StyleSettings aSystemStyle = GetSettings().GetStyleSettings();
+ const Color& rNewColor = aSystemStyle.GetDialogColor();
+
+ m_aDatasource.SetReadOnly( sal_True );
+ m_aDatasource.SetBackground( Wallpaper( rNewColor ) );
+ m_aDatasource.SetControlBackground( rNewColor );
+
+ m_aTable.SetReadOnly( sal_True );
+ m_aTable.SetBackground( Wallpaper( rNewColor ) );
+ m_aTable.SetControlBackground( rNewColor );
+
+ m_aAdministrateDatasources.Hide( );
+ }
+ }
+
+ // -------------------------------------------------------------------
+ void AddressBookSourceDialog::getFieldMapping(Sequence< AliasProgrammaticPair >& _rMapping) const
+ {
+ _rMapping.realloc( m_pImpl->aLogicalFieldNames.size() );
+ AliasProgrammaticPair* pPair = _rMapping.getArray();
+
+ ::rtl::OUString sCurrent;
+ for ( ConstStringArrayIterator aProgrammatic = m_pImpl->aLogicalFieldNames.begin();
+ aProgrammatic != m_pImpl->aLogicalFieldNames.end();
+ ++aProgrammatic
+ )
+ {
+ sCurrent = *aProgrammatic;
+ if ( m_pImpl->pConfigData->hasFieldAssignment( sCurrent ) )
+ {
+ // the user gave us an assignment for this field
+ pPair->ProgrammaticName = *aProgrammatic;
+ pPair->Alias = m_pImpl->pConfigData->getFieldAssignment( *aProgrammatic );
+ ++pPair;
+ }
+ }
+
+ _rMapping.realloc( pPair - _rMapping.getArray() );
+ }
+
+ // -------------------------------------------------------------------
+ void AddressBookSourceDialog::loadConfiguration()
+ {
+ ::rtl::OUString sName = m_pImpl->pConfigData->getDatasourceName();
+ INetURLObject aURL( sName );
+ if( aURL.GetProtocol() != INET_PROT_NOT_VALID )
+ {
+ OFileNotation aFileNotation( aURL.GetMainURL( INetURLObject::NO_DECODE ) );
+ sName = aFileNotation.get(OFileNotation::N_SYSTEM);
+ }
+
+ m_aDatasource.SetText(sName);
+ m_aTable.SetText(m_pImpl->pConfigData->getCommand());
+ // we ignore the CommandType: only tables are supported
+
+ // the logical names for the fields
+ DBG_ASSERT(m_pImpl->aLogicalFieldNames.size() == m_pImpl->aFieldAssignments.size(),
+ "AddressBookSourceDialog::loadConfiguration: inconsistence between field names and field assignments!");
+
+ ConstStringArrayIterator aLogical = m_pImpl->aLogicalFieldNames.begin();
+ StringArrayIterator aAssignment = m_pImpl->aFieldAssignments.begin();
+ for ( ;
+ aLogical < m_pImpl->aLogicalFieldNames.end();
+ ++aLogical, ++aAssignment
+ )
+ *aAssignment = m_pImpl->pConfigData->getFieldAssignment(*aLogical);
+ }
+
+ // -------------------------------------------------------------------
+ AddressBookSourceDialog::~AddressBookSourceDialog()
+ {
+ sal_Int32 i;
+ for (i=0; i<FIELD_CONTROLS_VISIBLE; ++i)
+ {
+ delete m_pImpl->pFieldLabels[i];
+ delete m_pImpl->pFields[i];
+ }
+
+ delete m_pImpl;
+ }
+
+ // -------------------------------------------------------------------
+ void AddressBookSourceDialog::initializeDatasources()
+ {
+ if (!m_xDatabaseContext.is())
+ {
+ DBG_ASSERT(m_xORB.is(), "AddressBookSourceDialog::initializeDatasources: no service factory!");
+ if (!m_xORB.is())
+ return;
+
+ try
+ {
+ m_xDatabaseContext = DatabaseContext::create(comphelper::getComponentContext(m_xORB));
+ }
+ catch(Exception&) { }
+ if (!m_xDatabaseContext.is())
+ {
+ const rtl::OUString sContextServiceName("com.sun.star.sdb.DatabaseContext");
+ ShowServiceNotAvailableError( this, sContextServiceName, sal_False);
+ return;
+ }
+ }
+ m_aDatasource.Clear();
+
+ // fill the datasources listbox
+ Sequence< ::rtl::OUString > aDatasourceNames;
+ try
+ {
+ aDatasourceNames = m_xDatabaseContext->getElementNames();
+ }
+ catch(Exception&)
+ {
+ OSL_FAIL("AddressBookSourceDialog::initializeDatasources: caught an exception while asking for the data source names!");
+ }
+ const ::rtl::OUString* pDatasourceNames = aDatasourceNames.getConstArray();
+ const ::rtl::OUString* pEnd = pDatasourceNames + aDatasourceNames.getLength();
+ for (; pDatasourceNames < pEnd; ++pDatasourceNames)
+ m_aDatasource.InsertEntry(*pDatasourceNames);
+ }
+
+ // -------------------------------------------------------------------
+ IMPL_LINK(AddressBookSourceDialog, OnFieldScroll, ScrollBar*, _pScrollBar)
+ {
+ implScrollFields( _pScrollBar->GetThumbPos(), sal_True, sal_True );
+ return 0L;
+ }
+
+ // -------------------------------------------------------------------
+ void AddressBookSourceDialog::resetTables()
+ {
+ if (!m_xDatabaseContext.is())
+ return;
+
+ WaitObject aWaitCursor(this);
+
+ // no matter what we do here, we handled the currently selected data source (no matter if successfull or not)
+ m_aDatasource.SaveValue();
+
+ // create an interaction handler (may be needed for connecting)
+ Reference< XInteractionHandler > xHandler;
+ try
+ {
+ xHandler.set(
+ InteractionHandler::createWithParent(comphelper::getComponentContext(m_xORB), 0),
+ UNO_QUERY_THROW );
+ }
+ catch(Exception&) { }
+ if (!xHandler.is())
+ {
+ const rtl::OUString sInteractionHandlerServiceName("com.sun.star.task.InteractionHandler");
+ ShowServiceNotAvailableError(this, sInteractionHandlerServiceName, sal_True);
+ return;
+ }
+
+ // the currently selected table
+ ::rtl::OUString sOldTable = m_aTable.GetText();
+
+ m_aTable.Clear();
+
+ m_xCurrentDatasourceTables= NULL;
+
+ // get the tables of the connection
+ Sequence< ::rtl::OUString > aTableNames;
+ Any aException;
+ try
+ {
+ Reference< XCompletedConnection > xDS;
+ if ( m_pImpl->bWorkingPersistent )
+ {
+ String sSelectedDS = lcl_getSelectedDataSource( m_aDatasource );
+
+ // get the data source the user has chosen and let it build a connection
+ INetURLObject aURL( sSelectedDS );
+ if ( aURL.GetProtocol() != INET_PROT_NOT_VALID || m_xDatabaseContext->hasByName(sSelectedDS) )
+ m_xDatabaseContext->getByName( sSelectedDS ) >>= xDS;
+ }
+ else
+ {
+ xDS = xDS.query( m_pImpl->m_xTransientDataSource );
+ }
+
+ // build the connection
+ Reference< XConnection > xConn;
+ if (xDS.is())
+ xConn = xDS->connectWithCompletion(xHandler);
+
+ // get the table names
+ Reference< XTablesSupplier > xSupplTables(xConn, UNO_QUERY);
+ if (xSupplTables.is())
+ {
+ m_xCurrentDatasourceTables = Reference< XNameAccess >(xSupplTables->getTables(), UNO_QUERY);
+ if (m_xCurrentDatasourceTables.is())
+ aTableNames = m_xCurrentDatasourceTables->getElementNames();
+ }
+ }
+ catch(const SQLContext& e) { aException <<= e; }
+ catch(const SQLWarning& e) { aException <<= e; }
+ catch(const SQLException& e) { aException <<= e; }
+ catch(Exception&)
+ {
+ OSL_FAIL("AddressBookSourceDialog::resetTables: could not retrieve the table!");
+ }
+
+ if (aException.hasValue())
+ {
+ Reference< XInteractionRequest > xRequest = new OInteractionRequest(aException);
+ try
+ {
+ xHandler->handle(xRequest);
+ }
+ catch(Exception&) { }
+ return;
+ }
+
+ sal_Bool bKnowOldTable = sal_False;
+ // fill the table list
+ const ::rtl::OUString* pTableNames = aTableNames.getConstArray();
+ const ::rtl::OUString* pEnd = pTableNames + aTableNames.getLength();
+ for (;pTableNames != pEnd; ++pTableNames)
+ {
+ m_aTable.InsertEntry(*pTableNames);
+ if (0 == pTableNames->compareTo(sOldTable))
+ bKnowOldTable = sal_True;
+ }
+
+ // set the old table, if the new data source knows a table with this name, too. Else reset the tables edit field.
+ if (!bKnowOldTable)
+ sOldTable = ::rtl::OUString();
+ m_aTable.SetText(sOldTable);
+
+ resetFields();
+ }
+
+ // -------------------------------------------------------------------
+ void AddressBookSourceDialog::resetFields()
+ {
+ WaitObject aWaitCursor(this);
+
+ // no matter what we do here, we handled the currently selected table (no matter if successfull or not)
+ m_aDatasource.SaveValue();
+
+ String sSelectedTable = m_aTable.GetText();
+ Sequence< ::rtl::OUString > aColumnNames;
+ try
+ {
+ if (m_xCurrentDatasourceTables.is())
+ {
+ // get the table and the columns
+ Reference< XColumnsSupplier > xSuppTableCols;
+ if (m_xCurrentDatasourceTables->hasByName(sSelectedTable))
+ ::cppu::extractInterface(xSuppTableCols, m_xCurrentDatasourceTables->getByName(sSelectedTable));
+ Reference< XNameAccess > xColumns;
+ if (xSuppTableCols.is())
+ xColumns = xSuppTableCols->getColumns();
+ if (xColumns.is())
+ aColumnNames = xColumns->getElementNames();
+ }
+ }
+ catch(Exception&)
+ {
+ OSL_FAIL("AddressBookSourceDialog::resetFields: could not retrieve the table columns!");
+ }
+
+
+ const ::rtl::OUString* pColumnNames = aColumnNames.getConstArray();
+ const ::rtl::OUString* pEnd = pColumnNames + aColumnNames.getLength();
+
+ // for quicker access
+ ::std::set< String > aColumnNameSet;
+ for (pColumnNames = aColumnNames.getConstArray(); pColumnNames != pEnd; ++pColumnNames)
+ aColumnNameSet.insert(*pColumnNames);
+
+ std::vector<String>::iterator aInitialSelection = m_pImpl->aFieldAssignments.begin() + m_pImpl->nFieldScrollPos;
+
+ ListBox** pListbox = m_pImpl->pFields;
+ String sSaveSelection;
+ for (sal_Int32 i=0; i<FIELD_CONTROLS_VISIBLE; ++i, ++pListbox, ++aInitialSelection)
+ {
+ sSaveSelection = (*pListbox)->GetSelectEntry();
+
+ (*pListbox)->Clear();
+
+ // the one entry for "no selection"
+ (*pListbox)->InsertEntry(m_sNoFieldSelection, 0);
+ // as it's entry data, set the index of the list box in our array
+ (*pListbox)->SetEntryData(0, reinterpret_cast<void*>(i));
+
+ // the field names
+ for (pColumnNames = aColumnNames.getConstArray(); pColumnNames != pEnd; ++pColumnNames)
+ (*pListbox)->InsertEntry(*pColumnNames);
+
+ if (aInitialSelection->Len() && (aColumnNameSet.end() != aColumnNameSet.find(*aInitialSelection)))
+ // we can select the entry as specified in our field assignment array
+ (*pListbox)->SelectEntry(*aInitialSelection);
+ else
+ // try to restore the selection
+ if (aColumnNameSet.end() != aColumnNameSet.find(sSaveSelection))
+ // the old selection is a valid column name
+ (*pListbox)->SelectEntry(sSaveSelection);
+ else
+ // select the <none> entry
+ (*pListbox)->SelectEntryPos(0);
+ }
+
+ // adjust m_pImpl->aFieldAssignments
+ for ( StringArrayIterator aAdjust = m_pImpl->aFieldAssignments.begin();
+ aAdjust != m_pImpl->aFieldAssignments.end();
+ ++aAdjust
+ )
+ if (aAdjust->Len())
+ if (aColumnNameSet.end() == aColumnNameSet.find(*aAdjust))
+ aAdjust->Erase();
+ }
+
+ // -------------------------------------------------------------------
+ IMPL_LINK(AddressBookSourceDialog, OnFieldSelect, ListBox*, _pListbox)
+ {
+ // the index of the affected list box in our array
+ sal_IntPtr nListBoxIndex = reinterpret_cast<sal_IntPtr>(_pListbox->GetEntryData(0));
+ DBG_ASSERT(nListBoxIndex >= 0 && nListBoxIndex < FIELD_CONTROLS_VISIBLE,
+ "AddressBookSourceDialog::OnFieldScroll: invalid list box entry!");
+
+ // update the array where we remember the field selections
+ if (0 == _pListbox->GetSelectEntryPos())
+ // it's the "no field selection" entry
+ m_pImpl->aFieldAssignments[m_pImpl->nFieldScrollPos * 2 + nListBoxIndex] = String();
+ else
+ // it's a regular field entry
+ m_pImpl->aFieldAssignments[m_pImpl->nFieldScrollPos * 2 + nListBoxIndex] = _pListbox->GetSelectEntry();
+
+ return 0L;
+ }
+
+ // -------------------------------------------------------------------
+ void AddressBookSourceDialog::implScrollFields(sal_Int32 _nPos, sal_Bool _bAdjustFocus, sal_Bool _bAdjustScrollbar)
+ {
+ if (_nPos == m_pImpl->nFieldScrollPos)
+ // nothing to do
+ return;
+
+ // loop through our field control rows and do some adjustments
+ // for the new texts
+ FixedText** pLeftLabelControl = m_pImpl->pFieldLabels;
+ FixedText** pRightLabelControl = pLeftLabelControl + 1;
+ ConstStringArrayIterator pLeftColumnLabel = m_pImpl->aFieldLabels.begin() + 2 * _nPos;
+ ConstStringArrayIterator pRightColumnLabel = pLeftColumnLabel + 1;
+
+ // for the focus movement and the selection scroll
+ ListBox** pLeftListControl = m_pImpl->pFields;
+ ListBox** pRightListControl = pLeftListControl + 1;
+
+ // for the focus movement
+ sal_Int32 nOldFocusRow = -1;
+ sal_Int32 nOldFocusColumn = 0;
+
+ // for the selection scroll
+ ConstStringArrayIterator pLeftAssignment = m_pImpl->aFieldAssignments.begin() + 2 * _nPos;
+ ConstStringArrayIterator pRightAssignment = pLeftAssignment + 1;
+
+ m_pImpl->nLastVisibleListIndex = -1;
+ // loop
+ for (sal_Int32 i=0; i<FIELD_PAIRS_VISIBLE; ++i)
+ {
+ if ((*pLeftListControl)->HasChildPathFocus())
+ {
+ nOldFocusRow = i;
+ nOldFocusColumn = 0;
+ }
+ else if ((*pRightListControl)->HasChildPathFocus())
+ {
+ nOldFocusRow = i;
+ nOldFocusColumn = 1;
+ }
+
+ // the new texts of the label controls
+ (*pLeftLabelControl)->SetText(*pLeftColumnLabel);
+ (*pRightLabelControl)->SetText(*pRightColumnLabel);
+
+ // we may have to hide the controls in the right column, if we have no label text for it
+ // (which means we have an odd number of fields, though we forced our internal arrays to
+ // be even-sized for easier handling)
+ // (If sometimes we support an arbitrary number of field assignments, we would have to care for
+ // an invisible left hand side column, too. But right now, the left hand side controls are always
+ // visible)
+ sal_Bool bHideRightColumn = (0 == pRightColumnLabel->Len());
+ (*pRightLabelControl)->Show(!bHideRightColumn);
+ (*pRightListControl)->Show(!bHideRightColumn);
+ // the new selections of the listboxes
+ implSelectField(*pLeftListControl, *pLeftAssignment);
+ implSelectField(*pRightListControl, *pRightAssignment);
+
+ // the index of the last visible list box
+ ++m_pImpl->nLastVisibleListIndex; // the left hand side box is always visible
+ if (!bHideRightColumn)
+ ++m_pImpl->nLastVisibleListIndex;
+
+ // increment ...
+ if ( i < FIELD_PAIRS_VISIBLE - 1 )
+ { // (not in the very last round, here the +=2 could result in an invalid
+ // iterator position, which causes an abort in a non-product version
+ pLeftLabelControl += 2;
+ pRightLabelControl += 2;
+ pLeftColumnLabel += 2;
+ pRightColumnLabel += 2;
+
+ pLeftListControl += 2;
+ pRightListControl += 2;
+ pLeftAssignment += 2;
+ pRightAssignment += 2;
+ }
+ }
+
+ if (_bAdjustFocus && (nOldFocusRow >= 0))
+ { // we have to adjust the focus and one of the list boxes has the focus
+ sal_Int32 nDelta = m_pImpl->nFieldScrollPos - _nPos;
+ // the new row for the focus
+ sal_Int32 nNewFocusRow = nOldFocusRow + nDelta;
+ // normalize
+ nNewFocusRow = std::min(nNewFocusRow, (sal_Int32)(FIELD_PAIRS_VISIBLE - 1), ::std::less< sal_Int32 >());
+ nNewFocusRow = std::max(nNewFocusRow, (sal_Int32)0, ::std::less< sal_Int32 >());
+ // set the new focus (in the same column)
+ m_pImpl->pFields[nNewFocusRow * 2 + nOldFocusColumn]->GrabFocus();
+ }
+
+ m_pImpl->nFieldScrollPos = _nPos;
+
+ if (_bAdjustScrollbar)
+ m_aFieldScroller.SetThumbPos(m_pImpl->nFieldScrollPos);
+ }
+
+ // -------------------------------------------------------------------
+ void AddressBookSourceDialog::implSelectField(ListBox* _pBox, const String& _rText)
+ {
+ if (_rText.Len())
+ // a valid field name
+ _pBox->SelectEntry(_rText);
+ else
+ // no selection for this item
+ _pBox->SelectEntryPos(0);
+ }
+
+ // -------------------------------------------------------------------
+ IMPL_LINK_NOARG(AddressBookSourceDialog, OnDelayedInitialize)
+ {
+ // load the initial data from the configuration
+ loadConfiguration();
+ resetTables();
+ // will reset the tables/fields implicitly
+
+ if ( !m_pImpl->bWorkingPersistent )
+ if ( m_pImpl->pFields[0] )
+ m_pImpl->pFields[0]->GrabFocus();
+
+ return 0L;
+ }
+
+ // -------------------------------------------------------------------
+ IMPL_LINK(AddressBookSourceDialog, OnComboSelect, ComboBox*, _pBox)
+ {
+ if (_pBox == &m_aDatasource)
+ resetTables();
+ else
+ resetFields();
+ return 0;
+ }
+
+ // -------------------------------------------------------------------
+ IMPL_LINK(AddressBookSourceDialog, OnComboGetFocus, ComboBox*, _pBox)
+ {
+ _pBox->SaveValue();
+ return 0L;
+ }
+
+ // -------------------------------------------------------------------
+ IMPL_LINK(AddressBookSourceDialog, OnComboLoseFocus, ComboBox*, _pBox)
+ {
+ if (_pBox->GetSavedValue() != _pBox->GetText())
+ {
+ if (_pBox == &m_aDatasource)
+ resetTables();
+ else
+ resetFields();
+ }
+ return 0L;
+ }
+
+ // -------------------------------------------------------------------
+ IMPL_LINK_NOARG(AddressBookSourceDialog, OnOkClicked)
+ {
+ String sSelectedDS = lcl_getSelectedDataSource( m_aDatasource );
+ if ( m_pImpl->bWorkingPersistent )
+ {
+ m_pImpl->pConfigData->setDatasourceName(sSelectedDS);
+ m_pImpl->pConfigData->setCommand(m_aTable.GetText());
+ }
+
+ // set the field assignments
+ ConstStringArrayIterator aLogical = m_pImpl->aLogicalFieldNames.begin();
+ ConstStringArrayIterator aAssignment = m_pImpl->aFieldAssignments.begin();
+ for ( ;
+ aLogical < m_pImpl->aLogicalFieldNames.end();
+ ++aLogical, ++aAssignment
+ )
+ m_pImpl->pConfigData->setFieldAssignment(*aLogical, *aAssignment);
+
+
+ EndDialog(RET_OK);
+ return 0L;
+ }
+
+ // -------------------------------------------------------------------
+ IMPL_LINK_NOARG(AddressBookSourceDialog, OnAdministrateDatasources)
+ {
+ // collect some initial arguments for the dialog
+ Sequence< Any > aArgs(1);
+ aArgs[0] <<= PropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ParentWindow")), 0, makeAny(VCLUnoHelper::GetInterface(this)), PropertyState_DIRECT_VALUE);
+
+ // create the dialog object
+ const rtl::OUString sDialogServiceName("com.sun.star.ui.dialogs.AddressBookSourcePilot");
+ Reference< XExecutableDialog > xAdminDialog;
+ try
+ {
+ xAdminDialog = Reference< XExecutableDialog >(m_xORB->createInstanceWithArguments(sDialogServiceName, aArgs), UNO_QUERY);
+ }
+ catch(Exception&) { }
+ if (!xAdminDialog.is())
+ {
+ ShowServiceNotAvailableError(this, sDialogServiceName, sal_True);
+ return 1L;
+ }
+
+ // excute the dialog
+ try
+ {
+ if ( xAdminDialog->execute() == RET_OK )
+ {
+ Reference<XPropertySet> xProp(xAdminDialog,UNO_QUERY);
+ if ( xProp.is() )
+ {
+ ::rtl::OUString sName;
+ xProp->getPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DataSourceName"))) >>= sName;
+
+ INetURLObject aURL( sName );
+ if( aURL.GetProtocol() != INET_PROT_NOT_VALID )
+ {
+ OFileNotation aFileNotation( aURL.GetMainURL( INetURLObject::NO_DECODE ) );
+ sName = aFileNotation.get(OFileNotation::N_SYSTEM);
+ }
+ m_aDatasource.InsertEntry(sName);
+ delete m_pImpl->pConfigData;
+ m_pImpl->pConfigData = new AssignmentPersistentData();
+ loadConfiguration();
+ resetTables();
+ // will reset the fields implicitly
+ }
+ }
+ }
+ catch(Exception&)
+ {
+ OSL_FAIL("AddressBookSourceDialog::OnAdministrateDatasources: an error occurred while executing the administration dialog!");
+ }
+
+ // re-fill the data source list
+ // try to preserve the current selection
+
+// initializeDatasources();
+
+ return 0L;
+ }
+
+ // -------------------------------------------------------------------
+ long AddressBookSourceDialog::PreNotify( NotifyEvent& _rNEvt )
+ {
+ switch (_rNEvt.GetType())
+ {
+ case EVENT_KEYINPUT:
+ {
+ const KeyEvent* pKeyEvent = _rNEvt.GetKeyEvent();
+ sal_uInt16 nCode = pKeyEvent->GetKeyCode().GetCode();
+ sal_Bool bShift = pKeyEvent->GetKeyCode().IsShift();
+ sal_Bool bCtrl = pKeyEvent->GetKeyCode().IsMod1();
+ sal_Bool bAlt = pKeyEvent->GetKeyCode().IsMod2();
+
+ if (KEY_TAB == nCode)
+ { // somebody pressed the tab key
+ if (!bAlt && !bCtrl && !bShift)
+ { // it's really the only the key (no modifiers)
+ if (m_pImpl->pFields[m_pImpl->nLastVisibleListIndex]->HasChildPathFocus())
+ // the last of our visible list boxes has the focus
+ if (m_pImpl->nFieldScrollPos < m_aFieldScroller.GetRangeMax())
+ { // we can still scroll down
+ sal_Int32 nNextFocusList = m_pImpl->nLastVisibleListIndex + 1 - 2;
+ // -> scroll down
+ implScrollFields(m_pImpl->nFieldScrollPos + 1, sal_False, sal_True);
+ // give the left control in the "next" line the focus
+ m_pImpl->pFields[nNextFocusList]->GrabFocus();
+ // return saying "have handled this"
+ return 1;
+ }
+ }
+ else if (!bAlt && !bCtrl && bShift)
+ { // it's shift-tab
+ if (m_pImpl->pFields[0]->HasChildPathFocus())
+ // our first list box has the focus
+ if (m_pImpl->nFieldScrollPos > 0)
+ { // we can still scroll up
+ // -> scroll up
+ implScrollFields(m_pImpl->nFieldScrollPos - 1, sal_False, sal_True);
+ // give the right control in the "prebious" line the focus
+ m_pImpl->pFields[0 - 1 + 2]->GrabFocus();
+ // return saying "have handled this"
+ return 1;
+ }
+ }
+ }
+ }
+ break;
+ }
+ return ModalDialog::PreNotify(_rNEvt);
+ }
+
+// .......................................................................
+} // namespace svt
+// .......................................................................
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/svtools/source/dialogs/addresstemplate.src b/svtools/source/dialogs/addresstemplate.src
new file mode 100644
index 000000000000..95dcea141199
--- /dev/null
+++ b/svtools/source/dialogs/addresstemplate.src
@@ -0,0 +1,313 @@
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include <svtools/svtools.hrc>
+#include "addresstemplate.hrc"
+#include <svtools/controldims.hrc>
+
+#define FIELD_ROW_HEIGHT 17
+
+ModalDialog DLG_ADDRESSBOOKSOURCE
+{
+ HelpID = "svtools:ModalDialog:DLG_ADDRESSBOOKSOURCE";
+ SVLook = TRUE ;
+ OutputSize = TRUE ;
+ Size = MAP_APPFONT ( 300 , 88 + FIELD_ROW_HEIGHT * FIELD_PAIRS_VISIBLE ) ;
+ Hide = TRUE ;
+ Moveable = TRUE ;
+ Text [ en-US ] = "Templates: Address Book Assignment";
+
+ FixedLine FL_DATASOURCEFRAME
+ {
+ Text [ en-US ] = "Address Book Source";
+ SVLook = TRUE ;
+ Pos = MAP_APPFONT ( 6 , 2 ) ;
+ Size = MAP_APPFONT ( 288 , RSC_CD_FIXEDLINE_HEIGHT ) ;
+ };
+ FixedText FT_DATASOURCE
+ {
+ Text [ en-US ] = "Data source";
+ SVLook = TRUE ;
+ Pos = MAP_APPFONT ( 12 , 15 ) ;
+ Size = MAP_APPFONT ( 90 , 10 ) ;
+
+ Group = TRUE;
+ };
+ ComboBox CB_DATASOURCE
+ {
+ HelpID = "svtools:ComboBox:DLG_ADDRESSBOOKSOURCE:CB_DATASOURCE";
+ SVLook = TRUE ;
+ Pos = MAP_APPFONT ( 105, 13 ) ;
+ Size = MAP_APPFONT ( 96, 55 ) ;
+
+ DropDown = TRUE;
+ TabStop = TRUE;
+ };
+ PushButton PB_ADMINISTATE_DATASOURCES
+ {
+ HelpID = "svtools:PushButton:DLG_ADDRESSBOOKSOURCE:PB_ADMINISTATE_DATASOURCES";
+ Text [ en-US ] = "~Address Data Source...";
+ SVLook = TRUE ;
+ Pos = MAP_APPFONT ( 204, 13 ) ;
+ Size = MAP_APPFONT ( 90, 14 ) ;
+ TabStop = TRUE;
+ };
+ FixedText FT_TABLE
+ {
+ Text [ en-US ] = "Table";
+ SVLook = TRUE ;
+ Pos = MAP_APPFONT ( 12 , 32 ) ;
+ Size = MAP_APPFONT ( 90 , 10 ) ;
+
+ Group = TRUE;
+ };
+ ComboBox CB_TABLE
+ {
+ HelpID = "svtools:ComboBox:DLG_ADDRESSBOOKSOURCE:CB_TABLE";
+ SVLook = TRUE ;
+ Pos = MAP_APPFONT ( 105, 30 ) ;
+ Size = MAP_APPFONT ( 96, 55 ) ;
+
+ DropDown = TRUE;
+ TabStop = TRUE;
+ };
+ FixedText FT_FIELDS
+ {
+ Text [ en-US ] = "Field assignment";
+ SVLook = TRUE ;
+ Pos = MAP_APPFONT ( 6, 30 + RSC_CD_DROPDOWN_HEIGHT + RSC_SP_CTRL_Y ) ;
+ Size = MAP_APPFONT ( 248 , RSC_CD_FIXEDTEXT_HEIGHT ) ;
+ };
+ Window CT_BORDER
+ {
+ Border = TRUE ;
+ Pos = MAP_APPFONT ( 6, 30 + RSC_CD_DROPDOWN_HEIGHT + RSC_SP_CTRL_Y + RSC_CD_FIXEDTEXT_HEIGHT + RSC_SP_CTRL_DESC_Y ) ;
+ Size = MAP_APPFONT ( 288 , 5 + FIELD_ROW_HEIGHT * FIELD_PAIRS_VISIBLE ) ;
+ };
+
+#define DECLARE_FIELD( row, column ) \
+ FixedText FT_FIELD_BASE + row * 2 + column \
+ { \
+ SVLook = TRUE ; \
+ Pos = MAP_APPFONT ( 3 + column * 134, RSC_SP_CTRL_GROUP_Y + 2 + row * FIELD_ROW_HEIGHT ) ; \
+ Size = MAP_APPFONT ( 79 , 10 ) ; \
+ Group = TRUE; \
+ }; \
+ ListBox LB_FIELD_BASE + row * 2 + column \
+ { \
+ SVLook = TRUE; \
+ Pos = MAP_APPFONT ( 89 + column * 134, RSC_SP_CTRL_GROUP_Y + row * FIELD_ROW_HEIGHT ) ; \
+ Size = MAP_APPFONT ( 42 , 14 ) ; \
+ Border = TRUE; \
+ DropDown = TRUE; \
+ TabStop = TRUE; \
+ }
+
+#if FIELD_PAIRS_VISIBLE > 0
+ DECLARE_FIELD( 0, 0 );
+ DECLARE_FIELD( 0, 1 );
+#endif
+#if FIELD_PAIRS_VISIBLE > 1
+ DECLARE_FIELD( 1, 0 );
+ DECLARE_FIELD( 1, 1 );
+#endif
+#if FIELD_PAIRS_VISIBLE > 2
+ DECLARE_FIELD( 3, 0 );
+ DECLARE_FIELD( 3, 1 );
+#endif
+#if FIELD_PAIRS_VISIBLE > 3
+ DECLARE_FIELD( 2, 0 );
+ DECLARE_FIELD( 2, 1 );
+#endif
+#if FIELD_PAIRS_VISIBLE > 4
+ DECLARE_FIELD( 4, 0 );
+ DECLARE_FIELD( 4, 1 );
+#endif
+#if FIELD_PAIRS_VISIBLE > 5
+ DECLARE_FIELD( 5, 0 );
+ DECLARE_FIELD( 5, 1 );
+#endif
+
+ ScrollBar SB_FIELDSCROLLER
+ {
+ SVLook = TRUE;
+ Pos = MAP_APPFONT ( 275, RSC_SP_CTRL_GROUP_Y ) ;
+ Size = MAP_APPFONT ( 8 , 16 - RSC_SP_CTRL_GROUP_Y + FIELD_ROW_HEIGHT * (FIELD_PAIRS_VISIBLE - 1) ) ;
+ };
+
+ OKButton PB_OK
+ {
+ SVLook = TRUE;
+ DefButton = TRUE;
+ Pos = MAP_APPFONT ( 137, 70 + FIELD_ROW_HEIGHT * FIELD_PAIRS_VISIBLE ) ;
+ Size = MAP_APPFONT ( 50 , 14 ) ;
+ };
+
+ CancelButton PB_CANCEL
+ {
+ SVLook = TRUE;
+ Pos = MAP_APPFONT ( 190, 70 + FIELD_ROW_HEIGHT * FIELD_PAIRS_VISIBLE ) ;
+ Size = MAP_APPFONT ( 50 , 14 ) ;
+ };
+
+ HelpButton PB_HELP
+ {
+ SVLook = TRUE;
+ Pos = MAP_APPFONT ( 244, 70 + FIELD_ROW_HEIGHT * FIELD_PAIRS_VISIBLE ) ;
+ Size = MAP_APPFONT ( 50 , 14 ) ;
+ };
+
+ String STR_LOGICAL_FIELD_NAMES
+ {
+ Text = "FirstName;LastName;Company;Department;Street;Zip;City;State;Country;PhonePriv;PhoneComp;PhoneOffice;PhoneCell;PhoneOther;Pager;Fax;EMail;URL;Title;Position;Code;AddrForm;AddrFormMail;Id;CalendarURL;InviteParticipant;Note;Altfield1;Altfield2;Altfield3;Altfield4";
+ // no need to translate this
+ // the items in this string have to be in the same order as the STR_FIELD_* strings are added to the
+ // field label list of the dialog
+ };
+
+ String STR_NO_FIELD_SELECTION
+ {
+ Text [ en-US ] = "<none>";
+ };
+
+ String STR_FIELD_COMPANY
+ {
+ Text [ en-US ] = "Company";
+ };
+ String STR_FIELD_DEPARTMENT
+ {
+ Text [ en-US ] = "Department";
+ };
+ String STR_FIELD_FIRSTNAME
+ {
+ Text [ en-US ] = "First name";
+ };
+ String STR_FIELD_LASTNAME
+ {
+ Text [ en-US ] = "Last name";
+ };
+ String STR_FIELD_STREET
+ {
+ Text [ en-US ] = "Street";
+ };
+ String STR_FIELD_COUNTRY
+ {
+ Text [ en-US ] = "Country";
+ };
+ String STR_FIELD_ZIPCODE
+ {
+ Text [ en-US ] = "ZIP Code";
+ };
+ String STR_FIELD_CITY
+ {
+ Text [ en-US ] = "City";
+ };
+ String STR_FIELD_TITLE
+ {
+ Text [ en-US ] = "Title";
+ };
+ String STR_FIELD_POSITION
+ {
+ Text [ en-US ] = "Position";
+ };
+ String STR_FIELD_ADDRFORM
+ {
+ Text [ en-US ] = "Addr. Form";
+ };
+ String STR_FIELD_INITIALS
+ {
+ Text [ en-US ] = "Initials";
+ };
+ String STR_FIELD_SALUTATION
+ {
+ Text [ en-US ] = "Complimentary close";
+ };
+ String STR_FIELD_HOMETEL
+ {
+ Text [ en-US ] = "Tel: Home";
+ };
+ String STR_FIELD_WORKTEL
+ {
+ Text [ en-US ] = "Tel: Work";
+ };
+ String STR_FIELD_FAX
+ {
+ Text [ en-US ] = "FAX";
+ };
+ String STR_FIELD_EMAIL
+ {
+ Text [ en-US ] = "E-mail";
+ };
+ String STR_FIELD_URL
+ {
+ Text [ en-US ] = "URL";
+ };
+ String STR_FIELD_NOTE
+ {
+ Text [ en-US ] = "Note";
+ };
+ String STR_FIELD_USER1
+ {
+ Text [ en-US ] = "User 1";
+ };
+ String STR_FIELD_USER2
+ {
+ Text [ en-US ] = "User 2";
+ };
+ String STR_FIELD_USER3
+ {
+ Text [ en-US ] = "User 3";
+ };
+ String STR_FIELD_USER4
+ {
+ Text [ en-US ] = "User 4";
+ };
+
+ String STR_FIELD_ID
+ {
+ Text [ en-US ] = "ID";
+ };
+ String STR_FIELD_STATE
+ {
+ Text [ en-US ] = "State";
+ };
+ String STR_FIELD_OFFICETEL
+ {
+ Text [ en-US ] = "Tel: Office";
+ };
+ String STR_FIELD_PAGER
+ {
+ Text [ en-US ] = "Pager";
+ };
+ String STR_FIELD_MOBILE
+ {
+ Text [ en-US ] = "Mobile";
+ };
+ String STR_FIELD_TELOTHER
+ {
+ Text [ en-US ] = "Tel: Other";
+ };
+ String STR_FIELD_CALENDAR
+ {
+ Text [ en-US ] = "Calendar";
+ };
+ String STR_FIELD_INVITE
+ {
+ Text [ en-US ] = "Invite";
+ };
+};
diff --git a/svtools/source/uno/addrtempuno.cxx b/svtools/source/uno/addrtempuno.cxx
new file mode 100644
index 000000000000..2287b12b65bb
--- /dev/null
+++ b/svtools/source/uno/addrtempuno.cxx
@@ -0,0 +1,228 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#include "svtools/genericunodialog.hxx"
+#include <svtools/addresstemplate.hxx>
+#include <comphelper/extract.hxx>
+#include <cppuhelper/typeprovider.hxx>
+#include <comphelper/property.hxx>
+#include <com/sun/star/sdbc/XDataSource.hpp>
+
+// .......................................................................
+namespace svt
+{
+// .......................................................................
+
+#define UNODIALOG_PROPERTY_ID_ALIASES 100
+#define UNODIALOG_PROPERTY_ALIASES "FieldMapping"
+
+ using namespace com::sun::star::uno;
+ using namespace com::sun::star::lang;
+ using namespace com::sun::star::util;
+ using namespace com::sun::star::beans;
+ using namespace com::sun::star::sdbc;
+
+ //=========================================================================
+ //= OAddressBookSourceDialogUno
+ //=========================================================================
+ typedef OGenericUnoDialog OAddressBookSourceDialogUnoBase;
+ class OAddressBookSourceDialogUno
+ :public OAddressBookSourceDialogUnoBase
+ ,public ::comphelper::OPropertyArrayUsageHelper< OAddressBookSourceDialogUno >
+ {
+ protected:
+ Sequence< AliasProgrammaticPair > m_aAliases;
+ Reference< XDataSource > m_xDataSource;
+ ::rtl::OUString m_sDataSourceName;
+ ::rtl::OUString m_sTable;
+
+ protected:
+ OAddressBookSourceDialogUno(const Reference< XMultiServiceFactory >& _rxORB);
+
+ public:
+ // XTypeProvider
+ virtual Sequence<sal_Int8> SAL_CALL getImplementationId( ) throw(RuntimeException);
+
+ // XServiceInfo
+ virtual ::rtl::OUString SAL_CALL getImplementationName() throw(RuntimeException);
+ virtual ::comphelper::StringSequence SAL_CALL getSupportedServiceNames() throw(RuntimeException);
+
+ // XServiceInfo - static methods
+ static Sequence< ::rtl::OUString > getSupportedServiceNames_Static(void) throw( RuntimeException );
+ static ::rtl::OUString getImplementationName_Static(void) throw( RuntimeException );
+ static Reference< XInterface >
+ SAL_CALL Create(const Reference< com::sun::star::lang::XMultiServiceFactory >&);
+
+ // XPropertySet
+ virtual Reference< XPropertySetInfo> SAL_CALL getPropertySetInfo() throw(RuntimeException);
+ virtual ::cppu::IPropertyArrayHelper& SAL_CALL getInfoHelper();
+
+ // OPropertyArrayUsageHelper
+ virtual ::cppu::IPropertyArrayHelper* createArrayHelper( ) const;
+
+ protected:
+ // OGenericUnoDialog overridables
+ virtual Dialog* createDialog(Window* _pParent);
+
+ virtual void implInitialize(const com::sun::star::uno::Any& _rValue);
+
+ virtual void executedDialog(sal_Int16 _nExecutionResult);
+ };
+
+
+ //=========================================================================
+ //= OAddressBookSourceDialogUno
+ //=========================================================================
+ Reference< XInterface > SAL_CALL OAddressBookSourceDialogUno_CreateInstance( const Reference< XMultiServiceFactory >& _rxFactory)
+ {
+ return OAddressBookSourceDialogUno::Create(_rxFactory);
+ }
+
+ //-------------------------------------------------------------------------
+ OAddressBookSourceDialogUno::OAddressBookSourceDialogUno(const Reference< XMultiServiceFactory >& _rxORB)
+ :OGenericUnoDialog(_rxORB)
+ {
+ registerProperty(::rtl::OUString(UNODIALOG_PROPERTY_ALIASES), UNODIALOG_PROPERTY_ID_ALIASES, PropertyAttribute::READONLY,
+ &m_aAliases, getCppuType(&m_aAliases));
+ }
+
+ //-------------------------------------------------------------------------
+ Sequence<sal_Int8> SAL_CALL OAddressBookSourceDialogUno::getImplementationId( ) throw(RuntimeException)
+ {
+ static ::cppu::OImplementationId aId;
+ return aId.getImplementationId();
+ }
+
+ //-------------------------------------------------------------------------
+ Reference< XInterface > SAL_CALL OAddressBookSourceDialogUno::Create(const Reference< XMultiServiceFactory >& _rxFactory)
+ {
+ return *(new OAddressBookSourceDialogUno(_rxFactory));
+ }
+
+ //-------------------------------------------------------------------------
+ ::rtl::OUString SAL_CALL OAddressBookSourceDialogUno::getImplementationName() throw(RuntimeException)
+ {
+ return getImplementationName_Static();
+ }
+
+ //-------------------------------------------------------------------------
+ ::rtl::OUString OAddressBookSourceDialogUno::getImplementationName_Static() throw(RuntimeException)
+ {
+ return ::rtl::OUString( "com.sun.star.comp.svtools.OAddressBookSourceDialogUno" );
+ }
+
+ //-------------------------------------------------------------------------
+ ::comphelper::StringSequence SAL_CALL OAddressBookSourceDialogUno::getSupportedServiceNames() throw(RuntimeException)
+ {
+ return getSupportedServiceNames_Static();
+ }
+
+ //-------------------------------------------------------------------------
+ ::comphelper::StringSequence OAddressBookSourceDialogUno::getSupportedServiceNames_Static() throw(RuntimeException)
+ {
+ ::comphelper::StringSequence aSupported(1);
+ aSupported.getArray()[0] = ::rtl::OUString( "com.sun.star.ui.AddressBookSourceDialog" );
+ return aSupported;
+ }
+
+ //-------------------------------------------------------------------------
+ Reference<XPropertySetInfo> SAL_CALL OAddressBookSourceDialogUno::getPropertySetInfo() throw(RuntimeException)
+ {
+ Reference<XPropertySetInfo> xInfo( createPropertySetInfo( getInfoHelper() ) );
+ return xInfo;
+ }
+
+ //-------------------------------------------------------------------------
+ ::cppu::IPropertyArrayHelper& OAddressBookSourceDialogUno::getInfoHelper()
+ {
+ return *const_cast<OAddressBookSourceDialogUno*>(this)->getArrayHelper();
+ }
+
+ //------------------------------------------------------------------------------
+ ::cppu::IPropertyArrayHelper* OAddressBookSourceDialogUno::createArrayHelper( ) const
+ {
+ Sequence< Property > aProps;
+ describeProperties(aProps);
+ return new ::cppu::OPropertyArrayHelper(aProps);
+ }
+
+ //------------------------------------------------------------------------------
+ void OAddressBookSourceDialogUno::executedDialog(sal_Int16 _nExecutionResult)
+ {
+ OAddressBookSourceDialogUnoBase::executedDialog(_nExecutionResult);
+
+ if ( _nExecutionResult )
+ if ( m_pDialog )
+ static_cast< AddressBookSourceDialog* >( m_pDialog )->getFieldMapping( m_aAliases );
+ }
+
+ //------------------------------------------------------------------------------
+ void OAddressBookSourceDialogUno::implInitialize(const com::sun::star::uno::Any& _rValue)
+ {
+ PropertyValue aVal;
+ if (_rValue >>= aVal)
+ {
+ if (0 == aVal.Name.compareToAscii("DataSource"))
+ {
+#if OSL_DEBUG_LEVEL > 0
+ sal_Bool bSuccess =
+#endif
+ aVal.Value >>= m_xDataSource;
+ OSL_ENSURE( bSuccess, "OAddressBookSourceDialogUno::implInitialize: invalid type for DataSource!" );
+ return;
+ }
+
+ if (0 == aVal.Name.compareToAscii("DataSourceName"))
+ {
+#if OSL_DEBUG_LEVEL > 0
+ sal_Bool bSuccess =
+#endif
+ aVal.Value >>= m_sDataSourceName;
+ OSL_ENSURE( bSuccess, "OAddressBookSourceDialogUno::implInitialize: invalid type for DataSourceName!" );
+ return;
+ }
+
+ if (0 == aVal.Name.compareToAscii("Command"))
+ {
+#if OSL_DEBUG_LEVEL > 0
+ sal_Bool bSuccess =
+#endif
+ aVal.Value >>= m_sTable;
+ OSL_ENSURE( bSuccess, "OAddressBookSourceDialogUno::implInitialize: invalid type for Command!" );
+ return;
+ }
+ }
+
+ OAddressBookSourceDialogUnoBase::implInitialize( _rValue );
+ }
+
+ //------------------------------------------------------------------------------
+ Dialog* OAddressBookSourceDialogUno::createDialog(Window* _pParent)
+ {
+ if ( m_xDataSource.is() && !m_sTable.isEmpty() )
+ return new AddressBookSourceDialog(_pParent, m_aContext.getLegacyServiceFactory(), m_xDataSource, m_sDataSourceName, m_sTable, m_aAliases );
+ else
+ return new AddressBookSourceDialog( _pParent, m_aContext.getLegacyServiceFactory() );
+ }
+
+// .......................................................................
+} // namespace svt
+// .......................................................................
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/svtools/source/uno/miscservices.cxx b/svtools/source/uno/miscservices.cxx
index 64095fa1d509..f40f964732e1 100644
--- a/svtools/source/uno/miscservices.cxx
+++ b/svtools/source/uno/miscservices.cxx
@@ -75,6 +75,7 @@ namespace
// -------------------------------------------------------------------------------------
+DECLARE_CREATEINSTANCE_NAMESPACE( svt, OAddressBookSourceDialogUno )
DECLARE_CREATEINSTANCE( SvFilterOptionsDialog )
DECLARE_CREATEINSTANCE_NAMESPACE( unographic, GraphicProvider )
DECLARE_CREATEINSTANCE_NAMESPACE( unographic, GraphicRendererVCL )
@@ -91,6 +92,19 @@ SAL_DLLPUBLIC_EXPORT void * SAL_CALL svt_component_getFactory (
{
Reference< XSingleServiceFactory > xFactory;
if (rtl_str_compare (
+ pImplementationName, "com.sun.star.comp.svtools.OAddressBookSourceDialogUno") == 0)
+ {
+ Sequence< OUString > aServiceNames(1);
+ aServiceNames.getArray()[0] =
+ OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.ui.AddressBookSourceDialog" ));
+
+ xFactory = ::cppu::createSingleFactory (
+ reinterpret_cast< XMultiServiceFactory* >( _pServiceManager ),
+ OUString::createFromAscii( pImplementationName ),
+ svt::OAddressBookSourceDialogUno_CreateInstance,
+ aServiceNames);
+ }
+ else if (rtl_str_compare (
pImplementationName, "com.sun.star.svtools.SvFilterOptionsDialog") == 0)
{
Sequence< OUString > aServiceNames(1);
diff --git a/svtools/util/svt.component b/svtools/util/svt.component
index 16b0c40f0cd7..4670a13605a7 100644
--- a/svtools/util/svt.component
+++ b/svtools/util/svt.component
@@ -25,6 +25,9 @@
<implementation name="com.sun.star.comp.graphic.GraphicRendererVCL">
<service name="com.sun.star.graphic.GraphicRendererVCL"/>
</implementation>
+ <implementation name="com.sun.star.comp.svtools.OAddressBookSourceDialogUno">
+ <service name="com.sun.star.ui.AddressBookSourceDialog"/>
+ </implementation>
<implementation name="com.sun.star.comp.svtools.uno.Wizard">
<service name="com.sun.star.ui.dialogs.Wizard"/>
</implementation>