2010-10-14 08:27:31 +02:00
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2002-04-17 07:39:28 +00:00
/*************************************************************************
*
2008-04-11 10:06:28 +00:00
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER .
2002-04-17 07:39:28 +00:00
*
2010-02-12 15:01:35 +01:00
* Copyright 2000 , 2010 Oracle and / or its affiliates .
2002-04-17 07:39:28 +00:00
*
2008-04-11 10:06:28 +00:00
* OpenOffice . org - a multi - platform office productivity suite
2002-04-17 07:39:28 +00:00
*
2008-04-11 10:06:28 +00:00
* This file is part of OpenOffice . org .
2002-04-17 07:39:28 +00:00
*
2008-04-11 10:06:28 +00:00
* OpenOffice . org is free software : you can redistribute it and / or modify
* it under the terms of the GNU Lesser General Public License version 3
* only , as published by the Free Software Foundation .
2002-04-17 07:39:28 +00:00
*
2008-04-11 10:06:28 +00:00
* OpenOffice . org 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 version 3 for more details
* ( a copy is included in the LICENSE file that accompanied this code ) .
2002-04-17 07:39:28 +00:00
*
2008-04-11 10:06:28 +00:00
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenOffice . org . If not , see
* < http : //www.openoffice.org/license.html>
* for a copy of the LGPLv3 License .
2002-04-17 07:39:28 +00:00
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# include <comphelper/accimplaccess.hxx>
2003-04-24 16:28:13 +00:00
# include <com/sun/star/accessibility/XAccessible.hpp>
# include <com/sun/star/accessibility/XAccessibleContext.hpp>
2002-04-17 07:39:28 +00:00
# include <cppuhelper/typeprovider.hxx>
# include <set>
//.........................................................................
namespace comphelper
{
//.........................................................................
# define BITFIELDSIZE ( sizeof( sal_Int64 ) * 8 )
// maximum number of bits we have in a sal_Int64
using : : com : : sun : : star : : uno : : Reference ;
using : : com : : sun : : star : : uno : : Sequence ;
using : : com : : sun : : star : : uno : : Exception ;
using : : com : : sun : : star : : uno : : UNO_QUERY ;
using : : com : : sun : : star : : uno : : RuntimeException ;
using : : com : : sun : : star : : lang : : XUnoTunnel ;
2003-04-24 16:28:13 +00:00
using : : com : : sun : : star : : accessibility : : XAccessible ;
using : : com : : sun : : star : : accessibility : : XAccessibleContext ;
2002-04-17 07:39:28 +00:00
//=====================================================================
//= OAccImpl_Impl
//=====================================================================
struct OAccImpl_Impl
{
Reference < XAccessible > m_xAccParent ;
sal_Int64 m_nForeignControlledStates ;
} ;
//=====================================================================
//= OAccessibleImplementationAccess
//=====================================================================
//---------------------------------------------------------------------
OAccessibleImplementationAccess : : OAccessibleImplementationAccess ( )
: m_pImpl ( new OAccImpl_Impl )
{
}
//---------------------------------------------------------------------
OAccessibleImplementationAccess : : ~ OAccessibleImplementationAccess ( )
{
delete m_pImpl ;
m_pImpl = NULL ;
}
//---------------------------------------------------------------------
2002-04-26 04:54:25 +00:00
Reference < XAccessible > OAccessibleImplementationAccess : : implGetForeignControlledParent ( ) const
2002-04-17 07:39:28 +00:00
{
return m_pImpl - > m_xAccParent ;
}
//---------------------------------------------------------------------
void OAccessibleImplementationAccess : : setAccessibleParent ( const Reference < XAccessible > & _rxAccParent )
{
m_pImpl - > m_xAccParent = _rxAccParent ;
}
2002-04-23 10:03:40 +00:00
//---------------------------------------------------------------------
sal_Int64 OAccessibleImplementationAccess : : implGetForeignControlledStates ( ) const
{
return m_pImpl - > m_nForeignControlledStates ;
}
2002-04-17 07:39:28 +00:00
//---------------------------------------------------------------------
void OAccessibleImplementationAccess : : setStateBit ( const sal_Int16 _nState , const sal_Bool _bSet )
{
2006-06-19 21:47:22 +00:00
OSL_ENSURE ( _nState > = 0 & & static_cast < sal_uInt16 > ( _nState ) < BITFIELDSIZE , " OAccessibleImplementationAccess::setStateBit: no more bits (shutting down the universe now)! " ) ;
2002-04-17 07:39:28 +00:00
sal_uInt64 nBitMask ( 1 ) ;
nBitMask < < = _nState ;
if ( _bSet )
m_pImpl - > m_nForeignControlledStates | = nBitMask ;
else
m_pImpl - > m_nForeignControlledStates & = ~ nBitMask ;
}
2011-04-02 16:47:11 +01:00
namespace { struct lcl_ImplId : public rtl : : Static < : : cppu : : OImplementationId , lcl_ImplId > { } ; }
2002-04-17 07:39:28 +00:00
//---------------------------------------------------------------------
2011-04-02 16:47:11 +01:00
const Sequence < sal_Int8 > OAccessibleImplementationAccess : : getUnoTunnelImplementationId ( )
2002-04-17 07:39:28 +00:00
{
2011-04-02 16:47:11 +01:00
: : cppu : : OImplementationId & rID = lcl_ImplId : : get ( ) ;
return rID . getImplementationId ( ) ;
2002-04-17 07:39:28 +00:00
}
//---------------------------------------------------------------------
sal_Int64 SAL_CALL OAccessibleImplementationAccess : : getSomething ( const Sequence < sal_Int8 > & _rIdentifier ) throw ( RuntimeException )
{
sal_Int64 nReturn ( 0 ) ;
if ( ( _rIdentifier . getLength ( ) = = 16 )
& & ( 0 = = rtl_compareMemory ( getUnoTunnelImplementationId ( ) . getConstArray ( ) , _rIdentifier . getConstArray ( ) , 16 ) )
)
nReturn = reinterpret_cast < sal_Int64 > ( this ) ;
return nReturn ;
}
//---------------------------------------------------------------------
OAccessibleImplementationAccess * OAccessibleImplementationAccess : : getImplementation ( const Reference < XAccessibleContext > & _rxComponent )
{
OAccessibleImplementationAccess * pImplementation = NULL ;
try
{
Reference < XUnoTunnel > xTunnel ( _rxComponent , UNO_QUERY ) ;
if ( xTunnel . is ( ) )
{
pImplementation = reinterpret_cast < OAccessibleImplementationAccess * > (
xTunnel - > getSomething ( getUnoTunnelImplementationId ( ) ) ) ;
}
}
catch ( const Exception & )
{
2011-03-19 14:11:09 +01:00
OSL_FAIL ( " OAccessibleImplementationAccess::setAccessibleParent: caught an exception while retrieving the implementation! " ) ;
2002-04-17 07:39:28 +00:00
}
return pImplementation ;
}
//---------------------------------------------------------------------
sal_Bool OAccessibleImplementationAccess : : setAccessibleParent (
const Reference < XAccessibleContext > & _rxComponent , const Reference < XAccessible > & _rxNewParent )
{
OAccessibleImplementationAccess * pImplementation = getImplementation ( _rxComponent ) ;
if ( pImplementation )
pImplementation - > setAccessibleParent ( _rxNewParent ) ;
return ( NULL ! = pImplementation ) ;
}
//.........................................................................
} // namespace comphelper
//.........................................................................
2010-10-14 08:27:31 +02:00
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */