diff options
author | Oliver Bolte <obo@openoffice.org> | 2005-04-13 07:51:52 +0000 |
---|---|---|
committer | Oliver Bolte <obo@openoffice.org> | 2005-04-13 07:51:52 +0000 |
commit | 512fa0e4fcdf8d4983eb480182450eb24a174171 (patch) | |
tree | 13c1939b5aa1514340b449df6e0ca3fffc379b2b /fpicker | |
parent | 6f0e3be93a6722845cd4d7dae28948cc31acc785 (diff) |
INTEGRATION: CWS visibility03 (1.1.2); FILE ADDED
2005/03/24 16:44:04 mhu 1.1.2.1: #i45006# Factored out and moved from svtools/source/filepicker/
Diffstat (limited to 'fpicker')
-rw-r--r-- | fpicker/source/office/commonpicker.cxx | 542 | ||||
-rw-r--r-- | fpicker/source/office/commonpicker.hxx | 268 |
2 files changed, 810 insertions, 0 deletions
diff --git a/fpicker/source/office/commonpicker.cxx b/fpicker/source/office/commonpicker.cxx new file mode 100644 index 000000000000..217d7762a64f --- /dev/null +++ b/fpicker/source/office/commonpicker.cxx @@ -0,0 +1,542 @@ +/************************************************************************* + * + * $RCSfile: commonpicker.cxx,v $ + * + * $Revision: 1.2 $ + * + * last change: $Author: obo $ $Date: 2005-04-13 08:51:38 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#include "commonpicker.hxx" + +#ifndef _COM_SUN_STAR_BEANS_PROPERTYATTRIBUTE_HPP_ +#include <com/sun/star/beans/PropertyAttribute.hpp> +#endif +#ifndef _COM_SUN_STAR_BEANS_NAMEDVALUE_HPP_ +#include <com/sun/star/beans/NamedValue.hpp> +#endif +#ifndef _SV_SVAPP_HXX +#include <vcl/svapp.hxx> +#endif +#ifndef _VOS_MUTEX_HXX_ +#include <vos/mutex.hxx> +#endif +#ifndef _TOOLKIT_HELPER_VCLUNOHELPER_HXX_ +#include <toolkit/helper/vclunohelper.hxx> +#endif +#ifndef COMPHELPER_WEAKEVENTLISTENER_HXX +#include <comphelper/weakeventlistener.hxx> +#endif +#ifndef _COMPHELPER_TYPES_HXX_ +#include <comphelper/types.hxx> +#endif +#ifndef _SV_MSGBOX_HXX +#include <vcl/msgbox.hxx> +#endif + +#ifndef _IODLGIMPL_HXX +#include "iodlg.hxx" +#endif + +//......................................................................... +namespace svt +{ +//......................................................................... + +#define PROPERTY_ID_HELPURL 1 +#define PROPERTY_ID_WINDOW 2 + + // using -------------------------------------------------------------- + + using namespace ::com::sun::star::lang; + using namespace ::com::sun::star::ui::dialogs; + using namespace ::com::sun::star::uno; + using namespace ::com::sun::star::beans; + using namespace ::comphelper; + + //--------------------------------------------------------------------- + OCommonPicker::OCommonPicker( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory ) + :OCommonPicker_Base( m_aMutex ) + ,OPropertyContainer( GetBroadcastHelper() ) + ,m_xORB( _rxFactory ) + ,m_pDlg( NULL ) + ,m_nCancelEvent( 0 ) + ,m_bExecuting( sal_False ) + { + // the two properties we have + registerProperty( + ::rtl::OUString::createFromAscii( "HelpURL" ), PROPERTY_ID_HELPURL, + PropertyAttribute::TRANSIENT, + &m_sHelpURL, ::getCppuType( &m_sHelpURL ) + ); + + registerProperty( + ::rtl::OUString::createFromAscii( "Window" ), PROPERTY_ID_WINDOW, + PropertyAttribute::TRANSIENT | PropertyAttribute::READONLY, + &m_xWindow, ::getCppuType( &m_xWindow ) + ); + } + + //--------------------------------------------------------------------- + OCommonPicker::~OCommonPicker() + { + if ( !GetBroadcastHelper().bDisposed ) + { + acquire(); + dispose(); + } + } + + //--------------------------------------------------------------------- + // disambiguate XInterface + //--------------------------------------------------------------------- + IMPLEMENT_FORWARD_XINTERFACE2( OCommonPicker, OCommonPicker_Base, OPropertyContainer ) + + //--------------------------------------------------------------------- + // disambiguate XTypeProvider + //--------------------------------------------------------------------- + IMPLEMENT_FORWARD_XTYPEPROVIDER2( OCommonPicker, OCommonPicker_Base, OPropertyContainer ) + + //--------------------------------------------------------------------- + // XComponent related methods + //--------------------------------------------------------------------- + void OCommonPicker::checkAlive() const SAL_THROW( (DisposedException) ) + { + if ( GetBroadcastHelper().bInDispose || GetBroadcastHelper().bDisposed ) + throw DisposedException(); + } + + //--------------------------------------------------------------------- + void SAL_CALL OCommonPicker::disposing() + { + ::vos::OGuard aGuard( Application::GetSolarMutex() ); + + stopWindowListening(); + + if ( m_nCancelEvent ) + Application::RemoveUserEvent( m_nCancelEvent ); + + { + ::osl::MutexGuard aGuard( m_aMutex ); + if ( m_bExecuting && m_pDlg ) + m_pDlg->EndDialog( RET_CANCEL ); + } + + delete m_pDlg; + m_pDlg = NULL; + m_xWindow = NULL; + m_xDialogParent = NULL; + } + + //--------------------------------------------------------------------- + void OCommonPicker::stopWindowListening() + { + disposeComponent( m_xWindowListenerAdapter ); + disposeComponent( m_xParentListenerAdapter ); + } + + //--------------------------------------------------------------------- + // XEventListener + //--------------------------------------------------------------------- + void SAL_CALL OCommonPicker::disposing( const EventObject& _rSource ) throw (RuntimeException) + { + ::vos::OGuard aGuard( Application::GetSolarMutex() ); + sal_Bool bDialogDying = _rSource.Source == m_xWindow; + sal_Bool bParentDying = _rSource.Source == m_xDialogParent; + + if ( bDialogDying || bParentDying ) + { + stopWindowListening(); + + if ( !bDialogDying ) // it's the parent which is dying -> delete the dialog + delete m_pDlg; + + m_pDlg = NULL; + m_xWindow = NULL; + m_xDialogParent = NULL; + } + else + DBG_ERROR( "OCommonPicker::disposing: where did this come from?" ); + } + + //--------------------------------------------------------------------- + // property set related methods + //--------------------------------------------------------------------- + ::cppu::IPropertyArrayHelper* OCommonPicker::createArrayHelper( ) const + { + Sequence< Property > aProps; + describeProperties( aProps ); + return new cppu::OPropertyArrayHelper( aProps ); + } + + //--------------------------------------------------------------------- + ::cppu::IPropertyArrayHelper& SAL_CALL OCommonPicker::getInfoHelper() + { + return *const_cast< OCommonPicker* >( this )->getArrayHelper(); + } + + //--------------------------------------------------------------------- + Reference< XPropertySetInfo > SAL_CALL OCommonPicker::getPropertySetInfo( ) throw(RuntimeException) + { + return ::cppu::OPropertySetHelper::createPropertySetInfo( getInfoHelper() ); + } + + //--------------------------------------------------------------------- + void SAL_CALL OCommonPicker::setFastPropertyValue_NoBroadcast( sal_Int32 _nHandle, const Any& _rValue ) throw (Exception) + { + OPropertyContainer::setFastPropertyValue_NoBroadcast( _nHandle, _rValue ); + + // if the HelpURL changed, forward this to the dialog + if ( PROPERTY_ID_HELPURL == _nHandle ) + if ( m_pDlg ) + OControlAccess::setHelpURL( m_pDlg, m_sHelpURL, sal_False ); + } + + + //--------------------------------------------------------------------- + sal_Bool OCommonPicker::createPicker() + { + ::vos::OGuard aGuard( Application::GetSolarMutex() ); + + if ( !m_pDlg ) + { + m_pDlg = implCreateDialog( VCLUnoHelper::GetWindow( m_xDialogParent ) ); + DBG_ASSERT( m_pDlg, "OCommonPicker::createPicker: invalid dialog returned!" ); + + if ( m_pDlg ) + { + // synchronize the help id of the dialog with out help URL property + if ( m_sHelpURL.getLength() ) + { // somebody already set the help URL while we had no dialog yet + OControlAccess::setHelpURL( m_pDlg, m_sHelpURL, sal_False ); + } + else + { + m_sHelpURL = OControlAccess::getHelpURL( m_pDlg, sal_False ); + } + + m_xWindow = VCLUnoHelper::GetInterface( m_pDlg ); + + // add as event listener to the window + Reference< XComponent > xWindowComp( m_xWindow, UNO_QUERY ); + OSL_ENSURE( xWindowComp.is(), "OCommonPicker::createFileDialog: invalid window component!" ); + if ( xWindowComp.is() ) + { + m_xWindowListenerAdapter = new OWeakEventListenerAdapter( this, xWindowComp ); + // the adapter will add itself as listener, and forward notifications + } + + // _and_ add as event listener to the parent - in case the parent is destroyed + // before we are disposed, our disposal would access dead VCL windows then .... + m_xDialogParent = VCLUnoHelper::GetInterface( m_pDlg->GetParent() ); + xWindowComp = xWindowComp.query( m_xDialogParent ); + OSL_ENSURE( xWindowComp.is() || !m_pDlg->GetParent(), "OCommonPicker::createFileDialog: invalid window component (the parent this time)!" ); + if ( xWindowComp.is() ) + { + m_xParentListenerAdapter = new OWeakEventListenerAdapter( this, xWindowComp ); + // the adapter will add itself as listener, and forward notifications + } + } + } + + return NULL != m_pDlg; + } + + //--------------------------------------------------------------------- + // XControlAccess functions + //--------------------------------------------------------------------- + void SAL_CALL OCommonPicker::setControlProperty( const ::rtl::OUString& aControlName, const ::rtl::OUString& aControlProperty, const Any& aValue ) throw (IllegalArgumentException, RuntimeException) + { + checkAlive(); + + ::vos::OGuard aGuard( Application::GetSolarMutex() ); + if ( createPicker() ) + { + ::svt::OControlAccess aAccess( m_pDlg, m_pDlg->GetView() ); + aAccess.setControlProperty( aControlName, aControlProperty, aValue ); + } + } + + //--------------------------------------------------------------------- + Any SAL_CALL OCommonPicker::getControlProperty( const ::rtl::OUString& aControlName, const ::rtl::OUString& aControlProperty ) throw (IllegalArgumentException, RuntimeException) + { + checkAlive(); + + ::vos::OGuard aGuard( Application::GetSolarMutex() ); + if ( createPicker() ) + { + ::svt::OControlAccess aAccess( m_pDlg, m_pDlg->GetView() ); + return aAccess.getControlProperty( aControlName, aControlProperty ); + } + + return Any(); + } + + //--------------------------------------------------------------------- + // XControlInformation functions + //--------------------------------------------------------------------- + Sequence< ::rtl::OUString > SAL_CALL OCommonPicker::getSupportedControls( ) throw (RuntimeException) + { + checkAlive(); + + ::vos::OGuard aGuard( Application::GetSolarMutex() ); + if ( createPicker() ) + { + ::svt::OControlAccess aAccess( m_pDlg, m_pDlg->GetView() ); + return aAccess.getSupportedControls( ); + } + + return Sequence< ::rtl::OUString >(); + } + + //--------------------------------------------------------------------- + sal_Bool SAL_CALL OCommonPicker::isControlSupported( const ::rtl::OUString& aControlName ) throw (RuntimeException) + { + checkAlive(); + + ::vos::OGuard aGuard( Application::GetSolarMutex() ); + if ( createPicker() ) + { + ::svt::OControlAccess aAccess( m_pDlg, m_pDlg->GetView() ); + return aAccess.isControlSupported( aControlName ); + } + + return sal_False; + } + + //--------------------------------------------------------------------- + Sequence< ::rtl::OUString > SAL_CALL OCommonPicker::getSupportedControlProperties( const ::rtl::OUString& aControlName ) throw (IllegalArgumentException, RuntimeException) + { + checkAlive(); + + ::vos::OGuard aGuard( Application::GetSolarMutex() ); + if ( createPicker() ) + { + ::svt::OControlAccess aAccess( m_pDlg, m_pDlg->GetView() ); + return aAccess.getSupportedControlProperties( aControlName ); + } + + return Sequence< ::rtl::OUString >(); + } + + //--------------------------------------------------------------------- + sal_Bool SAL_CALL OCommonPicker::isControlPropertySupported( const ::rtl::OUString& aControlName, const ::rtl::OUString& aControlProperty ) throw (IllegalArgumentException, RuntimeException) + { + checkAlive(); + + ::vos::OGuard aGuard( Application::GetSolarMutex() ); + if ( createPicker() ) + { + ::svt::OControlAccess aAccess( m_pDlg, m_pDlg->GetView() ); + return aAccess.isControlPropertySupported( aControlName, aControlProperty ); + } + + return sal_False; + } + + //--------------------------------------------------------------------- + // XExecutableDialog functions + //--------------------------------------------------------------------- + void SAL_CALL OCommonPicker::setTitle( const rtl::OUString& _rTitle ) throw( RuntimeException ) + { + ::vos::OGuard aGuard( Application::GetSolarMutex() ); + m_aTitle = _rTitle; + } + + //--------------------------------------------------------------------- + sal_Int16 OCommonPicker::execute() throw (RuntimeException) + { + ::vos::OGuard aGuard( Application::GetSolarMutex() ); + + if ( !getDialog() ) + createPicker(); + + // set the title + if ( m_aTitle.getLength() > 0 ) + getDialog()->SetText( m_aTitle ); + + { + ::osl::MutexGuard aGuard( m_aMutex ); + m_bExecuting = sal_True; + } + sal_Int16 nResult = implExecutePicker(); + { + ::osl::MutexGuard aGuard( m_aMutex ); + m_bExecuting = sal_False; + } + + return nResult; + } + + //--------------------------------------------------------------------- + // XCancellable functions + //--------------------------------------------------------------------- + void SAL_CALL OCommonPicker::cancel( ) throw (RuntimeException) + { + { + ::osl::MutexGuard aGuard( m_aMutex ); + if ( m_nCancelEvent ) + // nothing to do - the event for cancelling the dialog is already on the way + return; + } + + // The thread which executes our dialog has locked the solar mutex for + // sure. Cancelling the dialog should be done with a locked solar mutex, too. + // Thus we post ourself a message for cancelling the dialog. This way, the message + // is either handled in the thread which opened the dialog (which may even be + // this thread here), or, if no dialog is open, in the thread doing scheduling + // currently. Both is okay for us .... + // + // Note that we could do check if we are really executing the dialog currently. + // but the information would be potentially obsolete at the moment our event + // arrives, so we need to check it there, anyway ... + m_nCancelEvent = Application::PostUserEvent( LINK( this, OCommonPicker, OnCancelPicker ) ); + } + + //--------------------------------------------------------------------- + IMPL_LINK( OCommonPicker, OnCancelPicker, void*, NOTINTERESTEDIN ) + { + // By definition, the solar mutex is locked when we arrive here. Note that this + // is important, as for instance the consistency of m_pDlg depends on this mutex. + ::osl::MutexGuard aGuard( m_aMutex ); + m_nCancelEvent = 0; + + if ( !m_bExecuting ) + // nothing to do. This may be because the dialog was cancelled after our cancel method + // posted this async event, or because somebody called cancel without the dialog + // being executed at this time. + return 0; + + OSL_ENSURE( getDialog(), "OCommonPicker::OnCancelPicker: executing, but no dialog!" ); + if ( getDialog() ) + getDialog()->EndDialog( RET_CANCEL ); + + return 0L; + } + + //------------------------------------------------------------------------------------ + // XInitialization functions + //------------------------------------------------------------------------------------ + void SAL_CALL OCommonPicker::initialize( const Sequence< Any >& _rArguments ) + throw ( Exception, RuntimeException ) + { + checkAlive(); + + ::rtl::OUString sSettingName; + Any aSettingValue; + + PropertyValue aPropArg; + NamedValue aPairArg; + + + const Any* pArguments = _rArguments.getConstArray(); + const Any* pArgumentsEnd = _rArguments.getConstArray() + _rArguments.getLength(); + for ( const Any* pArgument = pArguments; + pArgument != pArgumentsEnd; + ++pArgument + ) + { + if ( *pArgument >>= aPropArg ) + { + sSettingName = aPropArg.Name; + aSettingValue = aPropArg.Value; + } + else if ( *pArgument >>= aPairArg ) + { + sSettingName = aPairArg.Name; + aSettingValue = aPairArg.Value; + } + else + { + DBG_ERROR( + ( ::rtl::OString( "OCommonPicker::initialize: unknown argument type at position " ) + += ::rtl::OString::valueOf( (sal_Int32)( pArguments - _rArguments.getConstArray() ) ) + ).getStr() + ); + continue; + } + +#ifdef DBG_UTIL + sal_Bool bKnownSetting = +#endif + implHandleInitializationArgument( sSettingName, aSettingValue ); + DBG_ASSERT( bKnownSetting, + ( ::rtl::OString( "OCommonPicker::initialize: unknown argument \"" ) + += ::rtl::OString( sSettingName.getStr(), sSettingName.getLength(), osl_getThreadTextEncoding() ) + += ::rtl::OString( "\"!" ) + ).getStr() + ); + } + } + + //--------------------------------------------------------------------- + sal_Bool OCommonPicker::implHandleInitializationArgument( const ::rtl::OUString& _rName, const Any& _rValue ) SAL_THROW( ( Exception, RuntimeException ) ) + { + sal_Bool bKnown = sal_True; + if ( _rName.equalsAscii( "ParentWindow" ) ) + { + m_xDialogParent.clear(); + OSL_VERIFY( _rValue >>= m_xDialogParent ); + OSL_ENSURE( VCLUnoHelper::GetWindow( m_xDialogParent ), "OCommonPicker::implHandleInitializationArgument: invalid parent window given!" ); + } + else + bKnown = sal_False; + return bKnown; + } + +//......................................................................... +} // namespace svt +//......................................................................... + diff --git a/fpicker/source/office/commonpicker.hxx b/fpicker/source/office/commonpicker.hxx new file mode 100644 index 000000000000..5c104eec698d --- /dev/null +++ b/fpicker/source/office/commonpicker.hxx @@ -0,0 +1,268 @@ +/************************************************************************* + * + * $RCSfile: commonpicker.hxx,v $ + * + * $Revision: 1.2 $ + * + * last change: $Author: obo $ $Date: 2005-04-13 08:51:52 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (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.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#ifndef SVTOOLS_COMMONPICKER_HXX +#define SVTOOLS_COMMONPICKER_HXX + +#ifndef _CPPUHELPER_COMPBASE5_HXX_ +#include <cppuhelper/compbase5.hxx> +#endif + +#ifndef _COM_SUN_STAR_UI_DIALOGS_XCONTROLINFORMATION_HPP_ +#include <com/sun/star/ui/dialogs/XControlInformation.hpp> +#endif +#ifndef _COM_SUN_STAR_UI_DIALOGS_XCONTROLACCESS_HPP_ +#include <com/sun/star/ui/dialogs/XControlAccess.hpp> +#endif +#ifndef _COM_SUN_STAR_LANG_XMULTISERVICEFACTORY_HPP_ +#include <com/sun/star/lang/XMultiServiceFactory.hpp> +#endif +#ifndef _COM_SUN_STAR_LANG_DISPOSEDEXCEPTION_HPP_ +#include <com/sun/star/lang/DisposedException.hpp> +#endif +#ifndef _COM_SUN_STAR_AWT_XWINDOW_HPP_ +#include <com/sun/star/awt/XWindow.hpp> +#endif +#ifndef _COM_SUN_STAR_UTIL_XCANCELLABLE_HPP_ +#include <com/sun/star/util/XCancellable.hpp> +#endif +#ifndef _COM_SUN_STAR_LANG_XINITIALIZATION_HPP_ +#include <com/sun/star/lang/XInitialization.hpp> +#endif +#ifndef _COMPHELPER_BROADCASTHELPER_HXX_ +#include <comphelper/broadcasthelper.hxx> +#endif +#ifndef _COMPHELPER_PROPERTYCONTAINER_HXX_ +#include <comphelper/propertycontainer.hxx> +#endif +#ifndef _COMPHELPER_PROPERTY_ARRAY_HELPER_HXX_ +#include <comphelper/proparrhlp.hxx> +#endif +#ifndef _COMPHELPER_UNO3_HXX_ +#include <comphelper/uno3.hxx> +#endif +#ifndef _LINK_HXX +#include <tools/link.hxx> +#endif + +class SvtFileDialog; +class Window; + +namespace comphelper +{ + class OWeakEventListenerAdapter; +} + +//......................................................................... +namespace svt +{ +//......................................................................... + + typedef ::cppu::WeakComponentImplHelper5 < ::com::sun::star::ui::dialogs::XControlAccess + , ::com::sun::star::ui::dialogs::XControlInformation + , ::com::sun::star::lang::XEventListener + , ::com::sun::star::util::XCancellable + , ::com::sun::star::lang::XInitialization + > OCommonPicker_Base; + /** implements common functionality for the 2 UNO picker components + */ + class OCommonPicker + :public ::comphelper::OBaseMutex + ,public OCommonPicker_Base + ,public ::comphelper::OPropertyContainer + ,public ::comphelper::OPropertyArrayUsageHelper< OCommonPicker > + { + private: + ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > m_xORB; + + // <properties> + ::rtl::OUString m_sHelpURL; + ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow > m_xWindow; + // </properties> + + SvtFileDialog* m_pDlg; + sal_uInt32 m_nCancelEvent; + sal_Bool m_bExecuting; + + ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindow > m_xDialogParent; + + ::com::sun::star::uno::Reference< ::com::sun::star::lang::XComponent > m_xWindowListenerAdapter; + ::com::sun::star::uno::Reference< ::com::sun::star::lang::XComponent > m_xParentListenerAdapter; + + protected: + ::rtl::OUString m_aTitle; + ::rtl::OUString m_aDisplayDirectory; + + protected: + inline SvtFileDialog* getDialog() { return m_pDlg; } + + inline const ::cppu::OBroadcastHelper& GetBroadcastHelper() const { return OCommonPicker_Base::rBHelper; } + inline ::cppu::OBroadcastHelper& GetBroadcastHelper() { return OCommonPicker_Base::rBHelper; } + + public: + OCommonPicker( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory ); + + protected: + virtual ~OCommonPicker(); + + // overridables + + // will be called with locked SolarMutex + virtual SvtFileDialog* implCreateDialog( Window* _pParent ) = 0; + virtual sal_Int16 implExecutePicker( ) = 0; + // do NOT override XExecutableDialog::execute! We need to do some stuff there ourself ... + + protected: + //------------------------------------------------------------------------------------ + // disambiguate XInterface + //------------------------------------------------------------------------------------ + DECLARE_XINTERFACE( ) + + //------------------------------------------------------------------------------------ + // disambiguate XTypeProvider + //------------------------------------------------------------------------------------ + DECLARE_XTYPEPROVIDER( ) + + //------------------------------------------------------------------------------------ + // ComponentHelper/XComponent + //------------------------------------------------------------------------------------ + virtual void SAL_CALL disposing(); + + //------------------------------------------------------------------------------------ + // XEventListner + //------------------------------------------------------------------------------------ + virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& Source ) throw (::com::sun::star::uno::RuntimeException); + + //------------------------------------------------------------------------------------ + // property set related methods + //------------------------------------------------------------------------------------ + + // XPropertySet pure methods + virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) throw(::com::sun::star::uno::RuntimeException); + // OPropertySetHelper pure methods + virtual ::cppu::IPropertyArrayHelper& SAL_CALL getInfoHelper(); + // OPropertyArrayUsageHelper pure methods + virtual ::cppu::IPropertyArrayHelper* createArrayHelper( ) const; + + // OPropertySetHelper overridden methods + virtual void SAL_CALL setFastPropertyValue_NoBroadcast( + sal_Int32 _nHandle, const ::com::sun::star::uno::Any& _rValue ) throw (::com::sun::star::uno::Exception); + + //------------------------------------------------------------------------------------ + // XExecutableDialog functions + //------------------------------------------------------------------------------------ + virtual void SAL_CALL setTitle( const ::rtl::OUString& _rTitle ) throw( ::com::sun::star::uno::RuntimeException ); + virtual sal_Int16 SAL_CALL execute() throw( ::com::sun::star::uno::RuntimeException ); + + //------------------------------------------------------------------------------------ + // XControlAccess functions + //------------------------------------------------------------------------------------ + virtual void SAL_CALL setControlProperty( const ::rtl::OUString& aControlName, const ::rtl::OUString& aControlProperty, const ::com::sun::star::uno::Any& aValue ) throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Any SAL_CALL getControlProperty( const ::rtl::OUString& aControlName, const ::rtl::OUString& aControlProperty ) throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException); + + //------------------------------------------------------------------------------------ + // XControlInformation functions + //------------------------------------------------------------------------------------ + virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedControls( ) throw (::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL isControlSupported( const ::rtl::OUString& aControlName ) throw (::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedControlProperties( const ::rtl::OUString& aControlName ) throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL isControlPropertySupported( const ::rtl::OUString& aControlName, const ::rtl::OUString& aControlProperty ) throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException); + + //------------------------------------------------------------------------------------ + // XCancellable functions + //------------------------------------------------------------------------------------ + virtual void SAL_CALL cancel( ) throw (::com::sun::star::uno::RuntimeException); + + //------------------------------------------------------------------------------------ + // XInitialization functions + //------------------------------------------------------------------------------------ + + virtual void SAL_CALL initialize( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& aArguments ) throw ( ::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException ); + + //------------------------------------------------------------------------------------ + // misc + //------------------------------------------------------------------------------------ + void checkAlive() const SAL_THROW( (::com::sun::star::lang::DisposedException) ); + + protected: + sal_Bool createPicker(); + + /** handle a single argument from the XInitialization::initialize method + + @return <TRUE/> if the argument could be handled + */ + virtual sal_Bool implHandleInitializationArgument( + const ::rtl::OUString& _rName, + const ::com::sun::star::uno::Any& _rValue + ) + SAL_THROW( ( ::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException ) ); + + private: + void stopWindowListening(); + + DECL_LINK( OnCancelPicker, void* ); + }; +//......................................................................... +} // namespace svt +//......................................................................... + +#endif // SVTOOLS_COMMONPICKER_HXX + |