1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_sfx2.hxx" 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir #include "helpinterceptor.hxx" 32*cdf0e10cSrcweir #include "helpdispatch.hxx" 33*cdf0e10cSrcweir #include "newhelp.hxx" 34*cdf0e10cSrcweir #include <sfx2/sfxuno.hxx> 35*cdf0e10cSrcweir #include <tools/urlobj.hxx> 36*cdf0e10cSrcweir #include <tools/debug.hxx> 37*cdf0e10cSrcweir #include <com/sun/star/beans/PropertyValue.hpp> 38*cdf0e10cSrcweir #include <com/sun/star/frame/XNotifyingDispatch.hpp> 39*cdf0e10cSrcweir #include <cppuhelper/interfacecontainer.h> 40*cdf0e10cSrcweir #include <vcl/window.hxx> 41*cdf0e10cSrcweir #include <limits.h> 42*cdf0e10cSrcweir 43*cdf0e10cSrcweir using namespace ::com::sun::star::beans; 44*cdf0e10cSrcweir using namespace ::com::sun::star::frame; 45*cdf0e10cSrcweir using namespace ::com::sun::star::uno; 46*cdf0e10cSrcweir using namespace ::com::sun::star::util; 47*cdf0e10cSrcweir using namespace ::com::sun::star::lang; 48*cdf0e10cSrcweir 49*cdf0e10cSrcweir extern void AppendConfigToken_Impl( String& rURL, sal_Bool bQuestionMark ); // sfxhelp.cxx 50*cdf0e10cSrcweir 51*cdf0e10cSrcweir // class HelpInterceptor_Impl -------------------------------------------- 52*cdf0e10cSrcweir 53*cdf0e10cSrcweir HelpInterceptor_Impl::HelpInterceptor_Impl() : 54*cdf0e10cSrcweir 55*cdf0e10cSrcweir m_pHistory ( NULL ), 56*cdf0e10cSrcweir m_nCurPos ( 0 ) 57*cdf0e10cSrcweir 58*cdf0e10cSrcweir { 59*cdf0e10cSrcweir } 60*cdf0e10cSrcweir 61*cdf0e10cSrcweir // ----------------------------------------------------------------------- 62*cdf0e10cSrcweir 63*cdf0e10cSrcweir HelpInterceptor_Impl::~HelpInterceptor_Impl() 64*cdf0e10cSrcweir { 65*cdf0e10cSrcweir for ( sal_uInt16 i = 0; m_pHistory && i < m_pHistory->Count(); ++i ) 66*cdf0e10cSrcweir delete m_pHistory->GetObject(i); 67*cdf0e10cSrcweir delete m_pHistory; 68*cdf0e10cSrcweir } 69*cdf0e10cSrcweir 70*cdf0e10cSrcweir // ----------------------------------------------------------------------- 71*cdf0e10cSrcweir 72*cdf0e10cSrcweir void HelpInterceptor_Impl::addURL( const String& rURL ) 73*cdf0e10cSrcweir { 74*cdf0e10cSrcweir if ( !m_pHistory ) 75*cdf0e10cSrcweir m_pHistory = new HelpHistoryList_Impl; 76*cdf0e10cSrcweir sal_uIntPtr nCount = m_pHistory->Count(); 77*cdf0e10cSrcweir if ( nCount && m_nCurPos < ( nCount - 1 ) ) 78*cdf0e10cSrcweir { 79*cdf0e10cSrcweir for ( sal_uIntPtr i = nCount - 1; i > m_nCurPos; i-- ) 80*cdf0e10cSrcweir delete m_pHistory->Remove(i); 81*cdf0e10cSrcweir } 82*cdf0e10cSrcweir Reference<XFrame> xFrame(m_xIntercepted, UNO_QUERY); 83*cdf0e10cSrcweir Reference<XController> xController; 84*cdf0e10cSrcweir if(xFrame.is()) 85*cdf0e10cSrcweir xController = xFrame->getController(); 86*cdf0e10cSrcweir Any aViewData; 87*cdf0e10cSrcweir if(xController.is() && m_pHistory->Count()) 88*cdf0e10cSrcweir { 89*cdf0e10cSrcweir m_pHistory->GetObject(m_nCurPos)->aViewData = xController->getViewData(); 90*cdf0e10cSrcweir } 91*cdf0e10cSrcweir 92*cdf0e10cSrcweir m_aCurrentURL = rURL; 93*cdf0e10cSrcweir Any aEmptyViewData; 94*cdf0e10cSrcweir m_pHistory->Insert( new HelpHistoryEntry_Impl( rURL, aEmptyViewData ), LIST_APPEND ); 95*cdf0e10cSrcweir m_nCurPos = m_pHistory->Count() - 1; 96*cdf0e10cSrcweir // TODO ? 97*cdf0e10cSrcweir if ( m_xListener.is() ) 98*cdf0e10cSrcweir { 99*cdf0e10cSrcweir ::com::sun::star::frame::FeatureStateEvent aEvent; 100*cdf0e10cSrcweir URL aURL; 101*cdf0e10cSrcweir aURL.Complete = rURL; 102*cdf0e10cSrcweir aEvent.FeatureURL = aURL; 103*cdf0e10cSrcweir aEvent.Source = (::com::sun::star::frame::XDispatch*)this; 104*cdf0e10cSrcweir m_xListener->statusChanged( aEvent ); 105*cdf0e10cSrcweir } 106*cdf0e10cSrcweir 107*cdf0e10cSrcweir m_pWindow->UpdateToolbox(); 108*cdf0e10cSrcweir } 109*cdf0e10cSrcweir 110*cdf0e10cSrcweir // ----------------------------------------------------------------------- 111*cdf0e10cSrcweir 112*cdf0e10cSrcweir void HelpInterceptor_Impl::setInterception( Reference< XFrame > xFrame ) 113*cdf0e10cSrcweir { 114*cdf0e10cSrcweir m_xIntercepted = Reference< XDispatchProviderInterception>( xFrame, UNO_QUERY ); 115*cdf0e10cSrcweir 116*cdf0e10cSrcweir if ( m_xIntercepted.is() ) 117*cdf0e10cSrcweir m_xIntercepted->registerDispatchProviderInterceptor( (XDispatchProviderInterceptor*)this ); 118*cdf0e10cSrcweir } 119*cdf0e10cSrcweir 120*cdf0e10cSrcweir // ----------------------------------------------------------------------- 121*cdf0e10cSrcweir 122*cdf0e10cSrcweir void HelpInterceptor_Impl::SetStartURL( const String& rURL ) 123*cdf0e10cSrcweir { 124*cdf0e10cSrcweir DBG_ASSERT( !m_pHistory, "invalid history" ); 125*cdf0e10cSrcweir if ( !m_pHistory ) 126*cdf0e10cSrcweir { 127*cdf0e10cSrcweir m_pHistory = new HelpHistoryList_Impl; 128*cdf0e10cSrcweir Any aEmptyViewData; 129*cdf0e10cSrcweir m_pHistory->Insert( new HelpHistoryEntry_Impl( rURL, aEmptyViewData ), ((sal_uIntPtr)0x0) ); 130*cdf0e10cSrcweir m_nCurPos = m_pHistory->Count() - 1; 131*cdf0e10cSrcweir 132*cdf0e10cSrcweir m_pWindow->UpdateToolbox(); 133*cdf0e10cSrcweir } 134*cdf0e10cSrcweir m_aCurrentURL = rURL; 135*cdf0e10cSrcweir } 136*cdf0e10cSrcweir 137*cdf0e10cSrcweir sal_Bool HelpInterceptor_Impl::HasHistoryPred() const 138*cdf0e10cSrcweir { 139*cdf0e10cSrcweir return m_pHistory && ( m_nCurPos > 0 ); 140*cdf0e10cSrcweir } 141*cdf0e10cSrcweir 142*cdf0e10cSrcweir sal_Bool HelpInterceptor_Impl::HasHistorySucc() const 143*cdf0e10cSrcweir { 144*cdf0e10cSrcweir return m_pHistory && ( m_nCurPos < ( m_pHistory->Count() - 1 ) ); 145*cdf0e10cSrcweir } 146*cdf0e10cSrcweir 147*cdf0e10cSrcweir 148*cdf0e10cSrcweir // ----------------------------------------------------------------------- 149*cdf0e10cSrcweir // XDispatchProvider 150*cdf0e10cSrcweir 151*cdf0e10cSrcweir Reference< XDispatch > SAL_CALL HelpInterceptor_Impl::queryDispatch( 152*cdf0e10cSrcweir 153*cdf0e10cSrcweir const URL& aURL, const ::rtl::OUString& aTargetFrameName, sal_Int32 nSearchFlags ) 154*cdf0e10cSrcweir 155*cdf0e10cSrcweir throw( RuntimeException ) 156*cdf0e10cSrcweir 157*cdf0e10cSrcweir { 158*cdf0e10cSrcweir Reference< XDispatch > xResult; 159*cdf0e10cSrcweir if ( m_xSlaveDispatcher.is() ) 160*cdf0e10cSrcweir xResult = m_xSlaveDispatcher->queryDispatch( aURL, aTargetFrameName, nSearchFlags ); 161*cdf0e10cSrcweir 162*cdf0e10cSrcweir // INetURLObject aObj( aURL.Complete ); 163*cdf0e10cSrcweir // sal_Bool bHelpURL = ( aObj.GetProtocol() == INET_PROT_VND_SUN_STAR_HELP ); 164*cdf0e10cSrcweir sal_Bool bHelpURL = aURL.Complete.toAsciiLowerCase().match(rtl::OUString::createFromAscii("vnd.sun.star.help"),0); 165*cdf0e10cSrcweir 166*cdf0e10cSrcweir if ( bHelpURL ) 167*cdf0e10cSrcweir { 168*cdf0e10cSrcweir DBG_ASSERT( xResult.is(), "invalid dispatch" ); 169*cdf0e10cSrcweir HelpDispatch_Impl* pHelpDispatch = new HelpDispatch_Impl( *this, xResult ); 170*cdf0e10cSrcweir xResult = Reference< XDispatch >( static_cast< ::cppu::OWeakObject* >(pHelpDispatch), UNO_QUERY ); 171*cdf0e10cSrcweir } 172*cdf0e10cSrcweir 173*cdf0e10cSrcweir return xResult; 174*cdf0e10cSrcweir } 175*cdf0e10cSrcweir 176*cdf0e10cSrcweir // ----------------------------------------------------------------------- 177*cdf0e10cSrcweir 178*cdf0e10cSrcweir Sequence < Reference < XDispatch > > SAL_CALL HelpInterceptor_Impl::queryDispatches( 179*cdf0e10cSrcweir 180*cdf0e10cSrcweir const Sequence< DispatchDescriptor >& aDescripts ) 181*cdf0e10cSrcweir 182*cdf0e10cSrcweir throw( RuntimeException ) 183*cdf0e10cSrcweir 184*cdf0e10cSrcweir { 185*cdf0e10cSrcweir Sequence< Reference< XDispatch > > aReturn( aDescripts.getLength() ); 186*cdf0e10cSrcweir Reference< XDispatch >* pReturn = aReturn.getArray(); 187*cdf0e10cSrcweir const DispatchDescriptor* pDescripts = aDescripts.getConstArray(); 188*cdf0e10cSrcweir for ( sal_Int16 i = 0; i < aDescripts.getLength(); ++i, ++pReturn, ++pDescripts ) 189*cdf0e10cSrcweir { 190*cdf0e10cSrcweir *pReturn = queryDispatch( pDescripts->FeatureURL, pDescripts->FrameName, pDescripts->SearchFlags ); 191*cdf0e10cSrcweir } 192*cdf0e10cSrcweir return aReturn; 193*cdf0e10cSrcweir } 194*cdf0e10cSrcweir 195*cdf0e10cSrcweir // ----------------------------------------------------------------------- 196*cdf0e10cSrcweir // XDispatchProviderInterceptor 197*cdf0e10cSrcweir 198*cdf0e10cSrcweir Reference< XDispatchProvider > SAL_CALL HelpInterceptor_Impl::getSlaveDispatchProvider() 199*cdf0e10cSrcweir 200*cdf0e10cSrcweir throw( RuntimeException ) 201*cdf0e10cSrcweir 202*cdf0e10cSrcweir { 203*cdf0e10cSrcweir return m_xSlaveDispatcher; 204*cdf0e10cSrcweir } 205*cdf0e10cSrcweir 206*cdf0e10cSrcweir // ----------------------------------------------------------------------- 207*cdf0e10cSrcweir 208*cdf0e10cSrcweir void SAL_CALL HelpInterceptor_Impl::setSlaveDispatchProvider( const Reference< XDispatchProvider >& xNewSlave ) 209*cdf0e10cSrcweir 210*cdf0e10cSrcweir throw( RuntimeException ) 211*cdf0e10cSrcweir 212*cdf0e10cSrcweir { 213*cdf0e10cSrcweir m_xSlaveDispatcher = xNewSlave; 214*cdf0e10cSrcweir } 215*cdf0e10cSrcweir 216*cdf0e10cSrcweir // ----------------------------------------------------------------------- 217*cdf0e10cSrcweir 218*cdf0e10cSrcweir Reference< XDispatchProvider > SAL_CALL HelpInterceptor_Impl::getMasterDispatchProvider() 219*cdf0e10cSrcweir 220*cdf0e10cSrcweir throw( RuntimeException ) 221*cdf0e10cSrcweir 222*cdf0e10cSrcweir { 223*cdf0e10cSrcweir return m_xMasterDispatcher; 224*cdf0e10cSrcweir } 225*cdf0e10cSrcweir 226*cdf0e10cSrcweir // ----------------------------------------------------------------------- 227*cdf0e10cSrcweir 228*cdf0e10cSrcweir void SAL_CALL HelpInterceptor_Impl::setMasterDispatchProvider( const Reference< XDispatchProvider >& xNewMaster ) 229*cdf0e10cSrcweir 230*cdf0e10cSrcweir throw( RuntimeException ) 231*cdf0e10cSrcweir 232*cdf0e10cSrcweir { 233*cdf0e10cSrcweir m_xMasterDispatcher = xNewMaster; 234*cdf0e10cSrcweir } 235*cdf0e10cSrcweir 236*cdf0e10cSrcweir // ----------------------------------------------------------------------- 237*cdf0e10cSrcweir // XInterceptorInfo 238*cdf0e10cSrcweir 239*cdf0e10cSrcweir Sequence< ::rtl::OUString > SAL_CALL HelpInterceptor_Impl::getInterceptedURLs() 240*cdf0e10cSrcweir 241*cdf0e10cSrcweir throw( RuntimeException ) 242*cdf0e10cSrcweir 243*cdf0e10cSrcweir { 244*cdf0e10cSrcweir Sequence< ::rtl::OUString > aURLList( 1 ); 245*cdf0e10cSrcweir aURLList[0] = DEFINE_CONST_UNICODE("vnd.sun.star.help://*"); 246*cdf0e10cSrcweir return aURLList;; 247*cdf0e10cSrcweir } 248*cdf0e10cSrcweir 249*cdf0e10cSrcweir // ----------------------------------------------------------------------- 250*cdf0e10cSrcweir // XDispatch 251*cdf0e10cSrcweir 252*cdf0e10cSrcweir void SAL_CALL HelpInterceptor_Impl::dispatch( 253*cdf0e10cSrcweir const URL& aURL, const Sequence< ::com::sun::star::beans::PropertyValue >& ) throw( RuntimeException ) 254*cdf0e10cSrcweir { 255*cdf0e10cSrcweir sal_Bool bBack = ( String( DEFINE_CONST_UNICODE(".uno:Backward") ) == String( aURL.Complete ) ); 256*cdf0e10cSrcweir if ( bBack || String( DEFINE_CONST_UNICODE(".uno:Forward") ) == String( aURL.Complete ) ) 257*cdf0e10cSrcweir { 258*cdf0e10cSrcweir if ( m_pHistory ) 259*cdf0e10cSrcweir { 260*cdf0e10cSrcweir if(m_pHistory->Count() > m_nCurPos) 261*cdf0e10cSrcweir { 262*cdf0e10cSrcweir Reference<XFrame> xFrame(m_xIntercepted, UNO_QUERY); 263*cdf0e10cSrcweir Reference<XController> xController; 264*cdf0e10cSrcweir if(xFrame.is()) 265*cdf0e10cSrcweir xController = xFrame->getController(); 266*cdf0e10cSrcweir if(xController.is()) 267*cdf0e10cSrcweir { 268*cdf0e10cSrcweir m_pHistory->GetObject(m_nCurPos)->aViewData = xController->getViewData(); 269*cdf0e10cSrcweir } 270*cdf0e10cSrcweir } 271*cdf0e10cSrcweir 272*cdf0e10cSrcweir sal_uIntPtr nPos = ( bBack && m_nCurPos > 0 ) ? --m_nCurPos 273*cdf0e10cSrcweir : ( !bBack && m_nCurPos < m_pHistory->Count() - 1 ) 274*cdf0e10cSrcweir ? ++m_nCurPos 275*cdf0e10cSrcweir : ULONG_MAX; 276*cdf0e10cSrcweir 277*cdf0e10cSrcweir if ( nPos < ULONG_MAX ) 278*cdf0e10cSrcweir { 279*cdf0e10cSrcweir HelpHistoryEntry_Impl* pEntry = m_pHistory->GetObject( nPos ); 280*cdf0e10cSrcweir if ( pEntry ) 281*cdf0e10cSrcweir m_pWindow->loadHelpContent(pEntry->aURL, sal_False); // false => dont add item to history again! 282*cdf0e10cSrcweir } 283*cdf0e10cSrcweir 284*cdf0e10cSrcweir m_pWindow->UpdateToolbox(); 285*cdf0e10cSrcweir } 286*cdf0e10cSrcweir } 287*cdf0e10cSrcweir } 288*cdf0e10cSrcweir 289*cdf0e10cSrcweir // ----------------------------------------------------------------------- 290*cdf0e10cSrcweir 291*cdf0e10cSrcweir void SAL_CALL HelpInterceptor_Impl::addStatusListener( 292*cdf0e10cSrcweir const Reference< XStatusListener >& xControl, const URL& ) throw( RuntimeException ) 293*cdf0e10cSrcweir { 294*cdf0e10cSrcweir DBG_ASSERT( !m_xListener.is(), "listener already exists" ); 295*cdf0e10cSrcweir m_xListener = xControl; 296*cdf0e10cSrcweir } 297*cdf0e10cSrcweir 298*cdf0e10cSrcweir // ----------------------------------------------------------------------- 299*cdf0e10cSrcweir 300*cdf0e10cSrcweir void SAL_CALL HelpInterceptor_Impl::removeStatusListener( 301*cdf0e10cSrcweir const Reference< XStatusListener >&, const URL&) throw( RuntimeException ) 302*cdf0e10cSrcweir { 303*cdf0e10cSrcweir m_xListener = 0; 304*cdf0e10cSrcweir } 305*cdf0e10cSrcweir 306*cdf0e10cSrcweir // HelpListener_Impl ----------------------------------------------------- 307*cdf0e10cSrcweir 308*cdf0e10cSrcweir HelpListener_Impl::HelpListener_Impl( HelpInterceptor_Impl* pInter ) 309*cdf0e10cSrcweir { 310*cdf0e10cSrcweir pInterceptor = pInter; 311*cdf0e10cSrcweir pInterceptor->addStatusListener( this, ::com::sun::star::util::URL() ); 312*cdf0e10cSrcweir } 313*cdf0e10cSrcweir 314*cdf0e10cSrcweir // ----------------------------------------------------------------------- 315*cdf0e10cSrcweir 316*cdf0e10cSrcweir void SAL_CALL HelpListener_Impl::statusChanged( const ::com::sun::star::frame::FeatureStateEvent& Event ) 317*cdf0e10cSrcweir 318*cdf0e10cSrcweir throw( ::com::sun::star::uno::RuntimeException ) 319*cdf0e10cSrcweir 320*cdf0e10cSrcweir { 321*cdf0e10cSrcweir INetURLObject aObj( Event.FeatureURL.Complete ); 322*cdf0e10cSrcweir aFactory = aObj.GetHost(); 323*cdf0e10cSrcweir aChangeLink.Call( this ); 324*cdf0e10cSrcweir } 325*cdf0e10cSrcweir 326*cdf0e10cSrcweir // ----------------------------------------------------------------------- 327*cdf0e10cSrcweir 328*cdf0e10cSrcweir void SAL_CALL HelpListener_Impl::disposing( const ::com::sun::star::lang::EventObject& ) 329*cdf0e10cSrcweir 330*cdf0e10cSrcweir throw( ::com::sun::star::uno::RuntimeException ) 331*cdf0e10cSrcweir 332*cdf0e10cSrcweir { 333*cdf0e10cSrcweir pInterceptor->removeStatusListener( this, ::com::sun::star::util::URL() ); 334*cdf0e10cSrcweir pInterceptor = NULL; 335*cdf0e10cSrcweir } 336*cdf0e10cSrcweir /*-- 05.09.2002 12:17:59--------------------------------------------------- 337*cdf0e10cSrcweir 338*cdf0e10cSrcweir -----------------------------------------------------------------------*/ 339*cdf0e10cSrcweir HelpStatusListener_Impl::HelpStatusListener_Impl( 340*cdf0e10cSrcweir Reference < XDispatch > aDispatch, URL& rURL) 341*cdf0e10cSrcweir { 342*cdf0e10cSrcweir aDispatch->addStatusListener(this, rURL); 343*cdf0e10cSrcweir } 344*cdf0e10cSrcweir /*-- 05.09.2002 12:17:59--------------------------------------------------- 345*cdf0e10cSrcweir 346*cdf0e10cSrcweir -----------------------------------------------------------------------*/ 347*cdf0e10cSrcweir HelpStatusListener_Impl::~HelpStatusListener_Impl() 348*cdf0e10cSrcweir { 349*cdf0e10cSrcweir if(xDispatch.is()) 350*cdf0e10cSrcweir xDispatch->removeStatusListener(this, com::sun::star::util::URL()); 351*cdf0e10cSrcweir } 352*cdf0e10cSrcweir /*-- 05.09.2002 12:17:59--------------------------------------------------- 353*cdf0e10cSrcweir 354*cdf0e10cSrcweir -----------------------------------------------------------------------*/ 355*cdf0e10cSrcweir void HelpStatusListener_Impl::statusChanged( 356*cdf0e10cSrcweir const FeatureStateEvent& rEvent ) throw( RuntimeException ) 357*cdf0e10cSrcweir { 358*cdf0e10cSrcweir aStateEvent = rEvent; 359*cdf0e10cSrcweir } 360*cdf0e10cSrcweir /*-- 05.09.2002 12:18:00--------------------------------------------------- 361*cdf0e10cSrcweir 362*cdf0e10cSrcweir -----------------------------------------------------------------------*/ 363*cdf0e10cSrcweir void HelpStatusListener_Impl::disposing( const EventObject& ) throw( RuntimeException ) 364*cdf0e10cSrcweir { 365*cdf0e10cSrcweir xDispatch->removeStatusListener(this, com::sun::star::util::URL()); 366*cdf0e10cSrcweir xDispatch = 0; 367*cdf0e10cSrcweir } 368