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_framework.hxx" 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 32*cdf0e10cSrcweir // my own includes 33*cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 34*cdf0e10cSrcweir #include <helper/ocomponentaccess.hxx> 35*cdf0e10cSrcweir #include <helper/ocomponentenumeration.hxx> 36*cdf0e10cSrcweir 37*cdf0e10cSrcweir #ifndef _FRAMEWORK_THREADHELP_RESETABLEGUARD_HXX_ 38*cdf0e10cSrcweir #include <threadhelp/resetableguard.hxx> 39*cdf0e10cSrcweir #endif 40*cdf0e10cSrcweir 41*cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 42*cdf0e10cSrcweir // interface includes 43*cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 44*cdf0e10cSrcweir #include <com/sun/star/frame/FrameSearchFlag.hpp> 45*cdf0e10cSrcweir 46*cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 47*cdf0e10cSrcweir // includes of other projects 48*cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 49*cdf0e10cSrcweir #include <vcl/svapp.hxx> 50*cdf0e10cSrcweir 51*cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 52*cdf0e10cSrcweir // namespace 53*cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 54*cdf0e10cSrcweir 55*cdf0e10cSrcweir namespace framework{ 56*cdf0e10cSrcweir 57*cdf0e10cSrcweir using namespace ::com::sun::star::container ; 58*cdf0e10cSrcweir using namespace ::com::sun::star::frame ; 59*cdf0e10cSrcweir using namespace ::com::sun::star::lang ; 60*cdf0e10cSrcweir using namespace ::com::sun::star::uno ; 61*cdf0e10cSrcweir using namespace ::cppu ; 62*cdf0e10cSrcweir using namespace ::osl ; 63*cdf0e10cSrcweir using namespace ::rtl ; 64*cdf0e10cSrcweir 65*cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 66*cdf0e10cSrcweir // non exported const 67*cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 68*cdf0e10cSrcweir 69*cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 70*cdf0e10cSrcweir // non exported definitions 71*cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 72*cdf0e10cSrcweir 73*cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 74*cdf0e10cSrcweir // declarations 75*cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 76*cdf0e10cSrcweir 77*cdf0e10cSrcweir //***************************************************************************************************************** 78*cdf0e10cSrcweir // constructor 79*cdf0e10cSrcweir //***************************************************************************************************************** 80*cdf0e10cSrcweir OComponentAccess::OComponentAccess( const css::uno::Reference< XDesktop >& xOwner ) 81*cdf0e10cSrcweir // Init baseclasses first 82*cdf0e10cSrcweir : ThreadHelpBase ( &Application::GetSolarMutex() ) 83*cdf0e10cSrcweir // Init member 84*cdf0e10cSrcweir , m_xOwner ( xOwner ) 85*cdf0e10cSrcweir { 86*cdf0e10cSrcweir // Safe impossible cases 87*cdf0e10cSrcweir LOG_ASSERT( impldbg_checkParameter_OComponentAccessCtor( xOwner ), "OComponentAccess::OComponentAccess()\nInvalid parameter detected!\n" ) 88*cdf0e10cSrcweir } 89*cdf0e10cSrcweir 90*cdf0e10cSrcweir //***************************************************************************************************************** 91*cdf0e10cSrcweir // destructor 92*cdf0e10cSrcweir //***************************************************************************************************************** 93*cdf0e10cSrcweir OComponentAccess::~OComponentAccess() 94*cdf0e10cSrcweir { 95*cdf0e10cSrcweir } 96*cdf0e10cSrcweir 97*cdf0e10cSrcweir //***************************************************************************************************************** 98*cdf0e10cSrcweir // XEnumerationAccess 99*cdf0e10cSrcweir //***************************************************************************************************************** 100*cdf0e10cSrcweir css::uno::Reference< XEnumeration > SAL_CALL OComponentAccess::createEnumeration() throw( RuntimeException ) 101*cdf0e10cSrcweir { 102*cdf0e10cSrcweir // Ready for multithreading 103*cdf0e10cSrcweir ResetableGuard aGuard( m_aLock ); 104*cdf0e10cSrcweir 105*cdf0e10cSrcweir // Set default return value, if method failed. 106*cdf0e10cSrcweir // If no desktop exist and there is no task container - return an empty enumeration! 107*cdf0e10cSrcweir css::uno::Reference< XEnumeration > xReturn = css::uno::Reference< XEnumeration >(); 108*cdf0e10cSrcweir 109*cdf0e10cSrcweir // Try to "lock" the desktop for access to task container. 110*cdf0e10cSrcweir css::uno::Reference< XInterface > xLock = m_xOwner.get(); 111*cdf0e10cSrcweir if ( xLock.is() == sal_True ) 112*cdf0e10cSrcweir { 113*cdf0e10cSrcweir // Desktop exist => pointer to task container must be valid. 114*cdf0e10cSrcweir // Initialize a new enumeration ... if some tasks and his components exist! 115*cdf0e10cSrcweir // (OTasksEnumeration will make an assert, if we initialize the new instance without valid values!) 116*cdf0e10cSrcweir 117*cdf0e10cSrcweir Sequence< css::uno::Reference< XComponent > > seqComponents; 118*cdf0e10cSrcweir impl_collectAllChildComponents( css::uno::Reference< XFramesSupplier >( xLock, UNO_QUERY ), seqComponents ); 119*cdf0e10cSrcweir OComponentEnumeration* pEnumeration = new OComponentEnumeration( seqComponents ); 120*cdf0e10cSrcweir xReturn = css::uno::Reference< XEnumeration >( (OWeakObject*)pEnumeration, UNO_QUERY ); 121*cdf0e10cSrcweir } 122*cdf0e10cSrcweir 123*cdf0e10cSrcweir // Return result of this operation. 124*cdf0e10cSrcweir return xReturn; 125*cdf0e10cSrcweir } 126*cdf0e10cSrcweir 127*cdf0e10cSrcweir //***************************************************************************************************************** 128*cdf0e10cSrcweir // XElementAccess 129*cdf0e10cSrcweir //***************************************************************************************************************** 130*cdf0e10cSrcweir Type SAL_CALL OComponentAccess::getElementType() throw( RuntimeException ) 131*cdf0e10cSrcweir { 132*cdf0e10cSrcweir // Elements in list an enumeration are components! 133*cdf0e10cSrcweir // Return the uno-type of XComponent. 134*cdf0e10cSrcweir return ::getCppuType((const css::uno::Reference< XComponent >*)NULL); 135*cdf0e10cSrcweir } 136*cdf0e10cSrcweir 137*cdf0e10cSrcweir //***************************************************************************************************************** 138*cdf0e10cSrcweir // XElementAccess 139*cdf0e10cSrcweir //***************************************************************************************************************** 140*cdf0e10cSrcweir sal_Bool SAL_CALL OComponentAccess::hasElements() throw( RuntimeException ) 141*cdf0e10cSrcweir { 142*cdf0e10cSrcweir // Ready for multithreading 143*cdf0e10cSrcweir ResetableGuard aGuard( m_aLock ); 144*cdf0e10cSrcweir 145*cdf0e10cSrcweir // Set default return value, if method failed. 146*cdf0e10cSrcweir sal_Bool bReturn = sal_False; 147*cdf0e10cSrcweir 148*cdf0e10cSrcweir // Try to "lock" the desktop for access to task container. 149*cdf0e10cSrcweir css::uno::Reference< XFramesSupplier > xLock( m_xOwner.get(), UNO_QUERY ); 150*cdf0e10cSrcweir if ( xLock.is() == sal_True ) 151*cdf0e10cSrcweir { 152*cdf0e10cSrcweir // Ask container of owner for existing elements. 153*cdf0e10cSrcweir bReturn = xLock->getFrames()->hasElements(); 154*cdf0e10cSrcweir } 155*cdf0e10cSrcweir 156*cdf0e10cSrcweir // Return result of this operation. 157*cdf0e10cSrcweir return bReturn; 158*cdf0e10cSrcweir } 159*cdf0e10cSrcweir 160*cdf0e10cSrcweir //***************************************************************************************************************** 161*cdf0e10cSrcweir // private method 162*cdf0e10cSrcweir //***************************************************************************************************************** 163*cdf0e10cSrcweir void OComponentAccess::impl_collectAllChildComponents( const css::uno::Reference< XFramesSupplier >& xNode , 164*cdf0e10cSrcweir Sequence< css::uno::Reference< XComponent > >& seqComponents ) 165*cdf0e10cSrcweir { 166*cdf0e10cSrcweir // If valid node was given ... 167*cdf0e10cSrcweir if( xNode.is() == sal_True ) 168*cdf0e10cSrcweir { 169*cdf0e10cSrcweir // ... continue collection at these. 170*cdf0e10cSrcweir 171*cdf0e10cSrcweir // Get the container of current node, collect the components of existing child frames 172*cdf0e10cSrcweir // and go down to next level in tree (recursive!). 173*cdf0e10cSrcweir 174*cdf0e10cSrcweir sal_Int32 nComponentCount = seqComponents.getLength(); 175*cdf0e10cSrcweir 176*cdf0e10cSrcweir const css::uno::Reference< XFrames > xContainer = xNode->getFrames(); 177*cdf0e10cSrcweir const Sequence< css::uno::Reference< XFrame > > seqFrames = xContainer->queryFrames( FrameSearchFlag::CHILDREN ); 178*cdf0e10cSrcweir 179*cdf0e10cSrcweir const sal_Int32 nFrameCount = seqFrames.getLength(); 180*cdf0e10cSrcweir for( sal_Int32 nFrame=0; nFrame<nFrameCount; ++nFrame ) 181*cdf0e10cSrcweir { 182*cdf0e10cSrcweir css::uno::Reference< XComponent > xComponent = impl_getFrameComponent( seqFrames[nFrame] ); 183*cdf0e10cSrcweir if( xComponent.is() == sal_True ) 184*cdf0e10cSrcweir { 185*cdf0e10cSrcweir nComponentCount++; 186*cdf0e10cSrcweir seqComponents.realloc( nComponentCount ); 187*cdf0e10cSrcweir seqComponents[nComponentCount-1] = xComponent; 188*cdf0e10cSrcweir } 189*cdf0e10cSrcweir } 190*cdf0e10cSrcweir } 191*cdf0e10cSrcweir // ... otherwise break a recursive path and go back at current stack! 192*cdf0e10cSrcweir } 193*cdf0e10cSrcweir 194*cdf0e10cSrcweir //***************************************************************************************************************** 195*cdf0e10cSrcweir // private method 196*cdf0e10cSrcweir //***************************************************************************************************************** 197*cdf0e10cSrcweir css::uno::Reference< XComponent > OComponentAccess::impl_getFrameComponent( const css::uno::Reference< XFrame >& xFrame ) const 198*cdf0e10cSrcweir { 199*cdf0e10cSrcweir // Set default return value, if method failed. 200*cdf0e10cSrcweir css::uno::Reference< XComponent > xComponent = css::uno::Reference< XComponent >(); 201*cdf0e10cSrcweir // Does no controller exists? 202*cdf0e10cSrcweir css::uno::Reference< XController > xController = xFrame->getController(); 203*cdf0e10cSrcweir if ( xController.is() == sal_False ) 204*cdf0e10cSrcweir { 205*cdf0e10cSrcweir // Controller not exist - use the VCL-component. 206*cdf0e10cSrcweir xComponent = css::uno::Reference< XComponent >( xFrame->getComponentWindow(), UNO_QUERY ); 207*cdf0e10cSrcweir } 208*cdf0e10cSrcweir else 209*cdf0e10cSrcweir { 210*cdf0e10cSrcweir // Does no model exists? 211*cdf0e10cSrcweir css::uno::Reference< XModel > xModel( xController->getModel(), UNO_QUERY ); 212*cdf0e10cSrcweir if ( xModel.is() == sal_True ) 213*cdf0e10cSrcweir { 214*cdf0e10cSrcweir // Model exist - use the model as component. 215*cdf0e10cSrcweir xComponent = css::uno::Reference< XComponent >( xModel, UNO_QUERY ); 216*cdf0e10cSrcweir } 217*cdf0e10cSrcweir else 218*cdf0e10cSrcweir { 219*cdf0e10cSrcweir // Model not exist - use the controller as component. 220*cdf0e10cSrcweir xComponent = css::uno::Reference< XComponent >( xController, UNO_QUERY ); 221*cdf0e10cSrcweir } 222*cdf0e10cSrcweir } 223*cdf0e10cSrcweir 224*cdf0e10cSrcweir return xComponent; 225*cdf0e10cSrcweir } 226*cdf0e10cSrcweir 227*cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 228*cdf0e10cSrcweir // debug methods 229*cdf0e10cSrcweir //_________________________________________________________________________________________________________________ 230*cdf0e10cSrcweir 231*cdf0e10cSrcweir /*----------------------------------------------------------------------------------------------------------------- 232*cdf0e10cSrcweir The follow methods checks the parameter for other functions. If a parameter or his value is non valid, 233*cdf0e10cSrcweir we return "sal_False". (else sal_True) This mechanism is used to throw an ASSERT! 234*cdf0e10cSrcweir 235*cdf0e10cSrcweir ATTENTION 236*cdf0e10cSrcweir 237*cdf0e10cSrcweir If you miss a test for one of this parameters, contact the autor or add it himself !(?) 238*cdf0e10cSrcweir But ... look for right testing! See using of this methods! 239*cdf0e10cSrcweir -----------------------------------------------------------------------------------------------------------------*/ 240*cdf0e10cSrcweir 241*cdf0e10cSrcweir #ifdef ENABLE_ASSERTIONS 242*cdf0e10cSrcweir 243*cdf0e10cSrcweir //***************************************************************************************************************** 244*cdf0e10cSrcweir sal_Bool OComponentAccess::impldbg_checkParameter_OComponentAccessCtor( const css::uno::Reference< XDesktop >& xOwner ) 245*cdf0e10cSrcweir { 246*cdf0e10cSrcweir // Set default return value. 247*cdf0e10cSrcweir sal_Bool bOK = sal_True; 248*cdf0e10cSrcweir // Check parameter. 249*cdf0e10cSrcweir if ( 250*cdf0e10cSrcweir ( &xOwner == NULL ) || 251*cdf0e10cSrcweir ( xOwner.is() == sal_False ) 252*cdf0e10cSrcweir ) 253*cdf0e10cSrcweir { 254*cdf0e10cSrcweir bOK = sal_False ; 255*cdf0e10cSrcweir } 256*cdf0e10cSrcweir // Return result of check. 257*cdf0e10cSrcweir return bOK ; 258*cdf0e10cSrcweir } 259*cdf0e10cSrcweir 260*cdf0e10cSrcweir #endif // #ifdef ENABLE_ASSERTIONS 261*cdf0e10cSrcweir 262*cdf0e10cSrcweir } // namespace framework 263