/************************************************************** * * 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 "wizardshell.hxx" #include "wizardpagecontroller.hxx" #include /** === begin UNO includes === **/ #include /** === end UNO includes === **/ #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::ui::dialogs::XWizardController; using ::com::sun::star::ui::dialogs::XWizard; using ::com::sun::star::ui::dialogs::XWizardPage; /** === end UNO using === **/ namespace WizardTravelType = ::com::sun::star::ui::dialogs::WizardTravelType; //================================================================================================================== namespace { //-------------------------------------------------------------------------------------------------------------- sal_Int16 lcl_determineFirstPageID( const Sequence< Sequence< sal_Int16 > >& i_rPaths ) { ENSURE_OR_THROW( ( i_rPaths.getLength() > 0 ) && ( i_rPaths[0].getLength() > 0 ), "illegal paths" ); return i_rPaths[0][0]; } } //================================================================================================================== //= WizardShell //================================================================================================================== //------------------------------------------------------------------------------------------------------------------ WizardShell::WizardShell( Window* i_pParent, const Reference< XWizardController >& i_rController, const Sequence< Sequence< sal_Int16 > >& i_rPaths ) :WizardShell_Base( i_pParent, WB_MOVEABLE | WB_CLOSEABLE ) ,m_xController( i_rController ) ,m_nFirstPageID( lcl_determineFirstPageID( i_rPaths ) ) { ENSURE_OR_THROW( m_xController.is(), "invalid controller" ); // declare the paths for ( sal_Int32 i=0; i& rPath( i_rPaths[i] ); WizardPath aPath( rPath.getLength() ); for ( sal_Int32 j=0; jGetSizePixel() ); // some defaults ShowButtonFixedLine( true ); SetRoadmapInteractive( true ); enableAutomaticNextButtonState(); } //------------------------------------------------------------------------------------------------------------------ WizardShell::~WizardShell() { } //------------------------------------------------------------------------------------------------------------------ short WizardShell::Execute() { ActivatePage(); return WizardShell_Base::Execute(); } //------------------------------------------------------------------------------------------------------------------ sal_Int16 WizardShell::convertCommitReasonToTravelType( const CommitPageReason i_eReason ) { switch ( i_eReason ) { case WizardTypes::eTravelForward: return WizardTravelType::FORWARD; case WizardTypes::eTravelBackward: return WizardTravelType::BACKWARD; case WizardTypes::eFinish: return WizardTravelType::FINISH; default: break; } OSL_ENSURE( false, "WizardShell::convertCommitReasonToTravelType: unsupported CommitPageReason!" ); return WizardTravelType::FINISH; } //------------------------------------------------------------------------------------------------------------------ void WizardShell::enterState( WizardState i_nState ) { WizardShell_Base::enterState( i_nState ); if ( !m_xController.is() ) return; try { m_xController->onActivatePage( impl_stateToPageId( i_nState ) ); } catch( const Exception& ) { DBG_UNHANDLED_EXCEPTION(); } } //------------------------------------------------------------------------------------------------------------------ sal_Bool WizardShell::leaveState( WizardState i_nState ) { if ( !WizardShell_Base::leaveState( i_nState ) ) return sal_False; if ( !m_xController.is() ) return sal_True; try { m_xController->onDeactivatePage( impl_stateToPageId( i_nState ) ); } catch( const Exception& ) { DBG_UNHANDLED_EXCEPTION(); } return sal_True; } //------------------------------------------------------------------------------------------------------------------ PWizardPageController WizardShell::impl_getController( TabPage* i_pPage ) const { Page2ControllerMap::const_iterator pos = m_aPageControllers.find( i_pPage ); ENSURE_OR_RETURN( pos != m_aPageControllers.end(), "WizardShell::impl_getController: no controller for this page!", PWizardPageController() ); return pos->second; } //------------------------------------------------------------------------------------------------------------------ Reference< XWizardPage > WizardShell::getCurrentWizardPage() const { const WizardState eState = getCurrentState(); PWizardPageController pController( impl_getController( GetPage( eState ) ) ); ENSURE_OR_RETURN( pController, "WizardShell::getCurrentWizardPage: invalid page/controller!", NULL ); return pController->getWizardPage(); } //------------------------------------------------------------------------------------------------------------------ void WizardShell::enablePage( const sal_Int16 i_nPageID, const sal_Bool i_bEnable ) { enableState( impl_pageIdToState( i_nPageID ), i_bEnable ); } //------------------------------------------------------------------------------------------------------------------ TabPage* WizardShell::createPage( WizardState i_nState ) { ENSURE_OR_RETURN( m_xController.is(), "WizardShell::createPage: no WizardController!", NULL ); ::boost::shared_ptr< WizardPageController > pController( new WizardPageController( *this, m_xController, impl_stateToPageId( i_nState ) ) ); TabPage* pPage = pController->getTabPage(); OSL_ENSURE( pPage != NULL, "WizardShell::createPage: illegal tab page!" ); if ( pPage == NULL ) { // fallback for ill-behaved clients: empty page pPage = new TabPage( this, 0 ); pPage->SetSizePixel( LogicToPixel( Size( 280, 185 ), MAP_APPFONT ) ); } m_aPageControllers[ pPage ] = pController; return pPage; } //------------------------------------------------------------------------------------------------------------------ IWizardPageController* WizardShell::getPageController( TabPage* i_pCurrentPage ) const { return impl_getController( i_pCurrentPage ).get(); } //------------------------------------------------------------------------------------------------------------------ String WizardShell::getStateDisplayName( WizardState i_nState ) const { try { if ( m_xController.is() ) return m_xController->getPageTitle( impl_stateToPageId( i_nState ) ); } catch( const Exception& ) { DBG_UNHANDLED_EXCEPTION(); } // fallback for ill-behaved clients: the numeric state return String::CreateFromInt32( i_nState ); } //------------------------------------------------------------------------------------------------------------------ bool WizardShell::canAdvance() const { try { if ( m_xController.is() && !m_xController->canAdvance() ) return false; } catch( const Exception& ) { DBG_UNHANDLED_EXCEPTION(); } return WizardShell_Base::canAdvance(); } //------------------------------------------------------------------------------------------------------------------ sal_Bool WizardShell::onFinish() { try { if ( m_xController.is() && !m_xController->confirmFinish() ) return sal_False; } catch( const Exception& ) { DBG_UNHANDLED_EXCEPTION(); } return WizardShell_Base::onFinish(); } //...................................................................................................................... } } // namespace svt::uno //......................................................................................................................