/************************************************************** * * 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 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ #include "precompiled_svtools.hxx" #include "../unowizard.hxx" #include "wizardshell.hxx" /** === begin UNO includes === **/ #include #include #include #include #include #include /** === end UNO includes === **/ #include #include #include #include #include //...................................................................................................................... namespace svt { namespace uno { //...................................................................................................................... /** === begin UNO using === **/ using ::com::sun::star::uno::Reference; using ::com::sun::star::uno::XInterface; using ::com::sun::star::uno::UNO_QUERY; using ::com::sun::star::uno::UNO_QUERY_THROW; using ::com::sun::star::uno::UNO_SET_THROW; using ::com::sun::star::uno::Exception; using ::com::sun::star::uno::RuntimeException; using ::com::sun::star::uno::Any; using ::com::sun::star::uno::makeAny; using ::com::sun::star::uno::Sequence; using ::com::sun::star::uno::Type; using ::com::sun::star::lang::XServiceInfo; using ::com::sun::star::ui::dialogs::XWizard; using ::com::sun::star::lang::XInitialization; using ::com::sun::star::beans::XPropertySetInfo; using ::com::sun::star::uno::XComponentContext; using ::com::sun::star::beans::Property; using ::com::sun::star::lang::IllegalArgumentException; using ::com::sun::star::ucb::AlreadyInitializedException; using ::com::sun::star::ui::dialogs::XWizardController; using ::com::sun::star::ui::dialogs::XWizardPage; using ::com::sun::star::container::NoSuchElementException; using ::com::sun::star::util::InvalidStateException; using ::com::sun::star::awt::XWindow; /** === end UNO using === **/ namespace WizardButton = ::com::sun::star::ui::dialogs::WizardButton; //------------------------------------------------------------------------------------------------------------------ namespace { sal_uInt32 lcl_convertWizardButtonToWZB( const sal_Int16 i_nWizardButton ) { switch ( i_nWizardButton ) { case WizardButton::NONE: return WZB_NONE; case WizardButton::NEXT: return WZB_NEXT; case WizardButton::PREVIOUS: return WZB_PREVIOUS; case WizardButton::FINISH: return WZB_FINISH; case WizardButton::CANCEL: return WZB_CANCEL; case WizardButton::HELP: return WZB_HELP; } OSL_ENSURE( false, "lcl_convertWizardButtonToWZB: invalid WizardButton constant!" ); return WZB_NONE; } } //================================================================================================================== //= Wizard - implementation //================================================================================================================== //------------------------------------------------------------------------------------------------------------------ Wizard::Wizard( const Reference< XComponentContext >& _rxContext ) :Wizard_Base( _rxContext ) ,m_aContext( _rxContext ) { } //-------------------------------------------------------------------- Wizard::~Wizard() { // we do this here cause the base class' call to destroyDialog won't reach us anymore : we're within an dtor, // so this virtual-method-call the base class does does not work, we're already dead then ... if ( m_pDialog ) { ::osl::MutexGuard aGuard( m_aMutex ); if ( m_pDialog ) destroyDialog(); } } //-------------------------------------------------------------------- Reference< XInterface > SAL_CALL Wizard::Create( const Reference< XComponentContext >& _rxContext ) { return *(new Wizard( _rxContext ) ); } //-------------------------------------------------------------------- namespace { static void lcl_checkPaths( const Sequence< Sequence< sal_Int16 > >& i_rPaths, const Reference< XInterface >& i_rContext ) { // need at least one path if ( i_rPaths.getLength() == 0 ) throw IllegalArgumentException( ::rtl::OUString(), i_rContext, 2 ); // each path must be of length 1, at least for ( sal_Int32 i = 0; i < i_rPaths.getLength(); ++i ) { if ( i_rPaths[i].getLength() == 0 ) throw IllegalArgumentException( ::rtl::OUString(), i_rContext, 2 ); // page IDs must be in ascending order sal_Int16 nPreviousPageID = i_rPaths[i][0]; for ( sal_Int32 j=1; j& i_Arguments ) throw (Exception, RuntimeException) { ::osl::MutexGuard aGuard( m_aMutex ); if ( m_bInitialized ) throw AlreadyInitializedException( ::rtl::OUString(), *this ); if ( i_Arguments.getLength() != 2 ) throw IllegalArgumentException( ::rtl::OUString(), *this, -1 ); // the second argument must be a XWizardController, for each constructor m_xController.set( i_Arguments[1], UNO_QUERY ); if ( !m_xController.is() ) throw IllegalArgumentException( ::rtl::OUString(), *this, 2 ); // the first arg is either a single path (short[]), or multiple paths (short[][]) Sequence< sal_Int16 > aSinglePath; i_Arguments[0] >>= aSinglePath; Sequence< Sequence< sal_Int16 > > aMultiplePaths; i_Arguments[0] >>= aMultiplePaths; if ( !aMultiplePaths.getLength() ) { aMultiplePaths.realloc(1); aMultiplePaths[0] = aSinglePath; } lcl_checkPaths( aMultiplePaths, *this ); // if we survived this, the paths are valid, and we're done here ... m_aWizardSteps = aMultiplePaths; m_bInitialized = true; } static rtl::OString lcl_getHelpId( const ::rtl::OUString& _rHelpURL ) { INetURLObject aHID( _rHelpURL ); if ( aHID.GetProtocol() == INET_PROT_HID ) return rtl::OUStringToOString( aHID.GetURLPath(), RTL_TEXTENCODING_UTF8 ); else return rtl::OUStringToOString( _rHelpURL, RTL_TEXTENCODING_UTF8 ); } //------------------------------------------------------------------------ static ::rtl::OUString lcl_getHelpURL( const rtl::OString& sHelpId ) { ::rtl::OUStringBuffer aBuffer; ::rtl::OUString aTmp( OStringToOUString( sHelpId, RTL_TEXTENCODING_UTF8 )); INetURLObject aHID( aTmp ); if ( aHID.GetProtocol() == INET_PROT_NOT_VALID ) aBuffer.appendAscii( INET_HID_SCHEME ); aBuffer.append( aTmp.getStr() ); return aBuffer.makeStringAndClear(); } //-------------------------------------------------------------------- Dialog* Wizard::createDialog( Window* i_pParent ) { WizardShell* pDialog( new WizardShell( i_pParent, m_xController, m_aWizardSteps ) ); pDialog->SetHelpId( lcl_getHelpId( m_sHelpURL ) ); pDialog->setTitleBase( m_sTitle ); return pDialog; } //-------------------------------------------------------------------- void Wizard::destroyDialog() { if ( m_pDialog ) m_sHelpURL = lcl_getHelpURL( m_pDialog->GetHelpId() ); Wizard_Base::destroyDialog(); } //-------------------------------------------------------------------- ::rtl::OUString SAL_CALL Wizard::getImplementationName_static() throw(RuntimeException) { return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.svtools.uno.Wizard" ) ); } //-------------------------------------------------------------------- Sequence< ::rtl::OUString > SAL_CALL Wizard::getSupportedServiceNames_static() throw(RuntimeException) { Sequence< ::rtl::OUString > aServices(1); aServices[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.ui.dialogs.Wizard" ) ); return aServices; } //-------------------------------------------------------------------- ::rtl::OUString SAL_CALL Wizard::getImplementationName() throw(RuntimeException) { return getImplementationName_static(); } //-------------------------------------------------------------------- Sequence< ::rtl::OUString > SAL_CALL Wizard::getSupportedServiceNames() throw(RuntimeException) { return getSupportedServiceNames_static(); } //-------------------------------------------------------------------- Reference< XPropertySetInfo > SAL_CALL Wizard::getPropertySetInfo() throw(RuntimeException) { return createPropertySetInfo( getInfoHelper() ); } //-------------------------------------------------------------------- ::cppu::IPropertyArrayHelper& SAL_CALL Wizard::getInfoHelper() { return *const_cast< Wizard* >( this )->getArrayHelper(); } //-------------------------------------------------------------------- ::cppu::IPropertyArrayHelper* Wizard::createArrayHelper( ) const { Sequence< Property > aProps; describeProperties( aProps ); return new ::cppu::OPropertyArrayHelper( aProps ); } //------------------------------------------------------------------------------------------------------------------ ::rtl::OUString SAL_CALL Wizard::getHelpURL() throw (RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::MutexGuard aGuard( m_aMutex ); if ( !m_pDialog ) return m_sHelpURL; return lcl_getHelpURL( m_pDialog->GetHelpId() ); } //------------------------------------------------------------------------------------------------------------------ void SAL_CALL Wizard::setHelpURL( const ::rtl::OUString& i_HelpURL ) throw (RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::MutexGuard aGuard( m_aMutex ); if ( !m_pDialog ) m_sHelpURL = i_HelpURL; else m_pDialog->SetHelpId( lcl_getHelpId( i_HelpURL ) ); } //------------------------------------------------------------------------------------------------------------------ Reference< XWindow > SAL_CALL Wizard::getDialogWindow() throw (RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::MutexGuard aGuard( m_aMutex ); ENSURE_OR_RETURN( m_pDialog, "Wizard::getDialogWindow: illegal call (execution did not start, yet)!", NULL ); return Reference< XWindow >( m_pDialog->GetComponentInterface(), UNO_QUERY ); } //------------------------------------------------------------------------------------------------------------------ void SAL_CALL Wizard::enableButton( ::sal_Int16 i_WizardButton, ::sal_Bool i_Enable ) throw (RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::MutexGuard aGuard( m_aMutex ); WizardShell* pWizardImpl = dynamic_cast< WizardShell* >( m_pDialog ); ENSURE_OR_RETURN_VOID( pWizardImpl, "Wizard::enableButtons: invalid dialog implementation!" ); pWizardImpl->enableButtons( lcl_convertWizardButtonToWZB( i_WizardButton ), i_Enable ); } //------------------------------------------------------------------------------------------------------------------ void SAL_CALL Wizard::setDefaultButton( ::sal_Int16 i_WizardButton ) throw (RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::MutexGuard aGuard( m_aMutex ); WizardShell* pWizardImpl = dynamic_cast< WizardShell* >( m_pDialog ); ENSURE_OR_RETURN_VOID( pWizardImpl, "Wizard::setDefaultButton: invalid dialog implementation!" ); pWizardImpl->defaultButton( lcl_convertWizardButtonToWZB( i_WizardButton ) ); } //------------------------------------------------------------------------------------------------------------------ sal_Bool SAL_CALL Wizard::travelNext( ) throw (RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::MutexGuard aGuard( m_aMutex ); WizardShell* pWizardImpl = dynamic_cast< WizardShell* >( m_pDialog ); ENSURE_OR_RETURN_FALSE( pWizardImpl, "Wizard::travelNext: invalid dialog implementation!" ); return pWizardImpl->travelNext(); } //------------------------------------------------------------------------------------------------------------------ sal_Bool SAL_CALL Wizard::travelPrevious( ) throw (RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::MutexGuard aGuard( m_aMutex ); WizardShell* pWizardImpl = dynamic_cast< WizardShell* >( m_pDialog ); ENSURE_OR_RETURN_FALSE( pWizardImpl, "Wizard::travelPrevious: invalid dialog implementation!" ); return pWizardImpl->travelPrevious(); } //------------------------------------------------------------------------------------------------------------------ void SAL_CALL Wizard::enablePage( ::sal_Int16 i_PageID, ::sal_Bool i_Enable ) throw (NoSuchElementException, InvalidStateException, RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::MutexGuard aGuard( m_aMutex ); WizardShell* pWizardImpl = dynamic_cast< WizardShell* >( m_pDialog ); ENSURE_OR_RETURN_VOID( pWizardImpl, "Wizard::enablePage: invalid dialog implementation!" ); if ( !pWizardImpl->knowsPage( i_PageID ) ) throw NoSuchElementException( ::rtl::OUString(), *this ); if ( i_PageID == pWizardImpl->getCurrentPage() ) throw InvalidStateException( ::rtl::OUString(), *this ); pWizardImpl->enablePage( i_PageID, i_Enable ); } //------------------------------------------------------------------------------------------------------------------ void SAL_CALL Wizard::updateTravelUI( ) throw (RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::MutexGuard aGuard( m_aMutex ); WizardShell* pWizardImpl = dynamic_cast< WizardShell* >( m_pDialog ); ENSURE_OR_RETURN_VOID( pWizardImpl, "Wizard::updateTravelUI: invalid dialog implementation!" ); pWizardImpl->updateTravelUI(); } //------------------------------------------------------------------------------------------------------------------ ::sal_Bool SAL_CALL Wizard::advanceTo( ::sal_Int16 i_PageId ) throw (RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::MutexGuard aGuard( m_aMutex ); WizardShell* pWizardImpl = dynamic_cast< WizardShell* >( m_pDialog ); ENSURE_OR_RETURN_FALSE( pWizardImpl, "Wizard::advanceTo: invalid dialog implementation!" ); return pWizardImpl->advanceTo( i_PageId ); } //------------------------------------------------------------------------------------------------------------------ ::sal_Bool SAL_CALL Wizard::goBackTo( ::sal_Int16 i_PageId ) throw (RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::MutexGuard aGuard( m_aMutex ); WizardShell* pWizardImpl = dynamic_cast< WizardShell* >( m_pDialog ); ENSURE_OR_RETURN_FALSE( pWizardImpl, "Wizard::goBackTo: invalid dialog implementation!" ); return pWizardImpl->goBackTo( i_PageId ); } //------------------------------------------------------------------------------------------------------------------ Reference< XWizardPage > SAL_CALL Wizard::getCurrentPage( ) throw (RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::MutexGuard aGuard( m_aMutex ); WizardShell* pWizardImpl = dynamic_cast< WizardShell* >( m_pDialog ); ENSURE_OR_RETURN( pWizardImpl, "Wizard::getCurrentPage: invalid dialog implementation!", Reference< XWizardPage >() ); return pWizardImpl->getCurrentWizardPage(); } //------------------------------------------------------------------------------------------------------------------ void SAL_CALL Wizard::activatePath( ::sal_Int16 i_PathIndex, ::sal_Bool i_Final ) throw (NoSuchElementException, InvalidStateException, RuntimeException) { ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); ::osl::MutexGuard aGuard( m_aMutex ); if ( ( i_PathIndex < 0 ) || ( i_PathIndex >= m_aWizardSteps.getLength() ) ) throw NoSuchElementException( ::rtl::OUString(), *this ); WizardShell* pWizardImpl = dynamic_cast< WizardShell* >( m_pDialog ); ENSURE_OR_RETURN_VOID( pWizardImpl, "Wizard::activatePath: invalid dialog implementation!" ); pWizardImpl->activatePath( i_PathIndex, i_Final ); } //------------------------------------------------------------------------------------------------------------------ void SAL_CALL Wizard::setTitle( const ::rtl::OUString& i_Title ) throw (RuntimeException) { // simply disambiguate Wizard_Base::OGenericUnoDialog::setTitle( i_Title ); } //------------------------------------------------------------------------------------------------------------------ ::sal_Int16 SAL_CALL Wizard::execute( ) throw (RuntimeException) { return Wizard_Base::OGenericUnoDialog::execute(); } //...................................................................................................................... } } // namespace svt::uno //......................................................................................................................