/**************************************************************
 * 
 * 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.
 * 
 *************************************************************/



#ifndef COMPHELPER_ACCIMPLACCESS_HXX
#define COMPHELPER_ACCIMPLACCESS_HXX

#include <cppuhelper/implbase1.hxx>
#include <com/sun/star/lang/XUnoTunnel.hpp>
#include "comphelper/comphelperdllapi.h"

// forward declaration
namespace com { namespace sun { namespace star { namespace accessibility {
	class XAccessible;
	class XAccessibleContext;
}}}}

//.........................................................................
namespace comphelper
{
//.........................................................................

	//=====================================================================
	//= OAccessibleImplementationAccess
	//=====================================================================
	typedef	::cppu::ImplHelper1	<	::com::sun::star::lang::XUnoTunnel
								>	OAccImpl_Base;
	struct OAccImpl_Impl;

	/** This is a helper class which allows accessing several aspects of the the implementation
		of an AccessibleContext.

		<p>For instance, when you want to implement a context which can be re-parented, you:
			<ul><li>derive your class from <type>OAccessibleImplementationAccess</type></li>
				<li>use <code>setAccessibleParent( <em>component</em>, <em>new_parent</em> )</code>
			</ul>
		</p>

		<p>Another aspect which can be controlled from the outside are states. If you have a class which
		has only partial control over it's states, you may consider deriving from OAccessibleImplementationAccess.<br/>
		For instance, say you have an implementation (say component A) which is <em>unable</em> to know or to
		determine if the represented object is selected, but another component (say B) which uses A (and integrates
		it into a tree of accessibility components) is.<br/>
		In this case, if A is derived from OAccessibleImplementationAccess, B can manipulate this
		foreign-controlled state flag "SELECTED" by using the static helper methods on this class.</p>

		<p>Please note that the support for foreign controlled states is rather restrictive: You can't have states
		which <em>may be</em> controlled by a foreign instances. This is implied by the fact that a derived
		class can ask for states which are <em>set</em> only, not for the ones which are <em>reset</em> currently.
		</p>
	*/
	class COMPHELPER_DLLPUBLIC OAccessibleImplementationAccess : public OAccImpl_Base
	{
	private:
		OAccImpl_Impl*	m_pImpl;

	protected:
		/// retrieves the parent previously set via <method>setAccessibleParent</method>
		::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >
				implGetForeignControlledParent( ) const;

		/** retrieves the set of currently set states which are controlled by a foreign instance
		@return
			a bit mask, where a set bit 2^n means that the AccessibleStateType n has been set
		*/
		sal_Int64	implGetForeignControlledStates( ) const;

		/// sets the accessible parent component
		virtual	void	setAccessibleParent(
			const ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >& _rxAccParent );

		/// sets or resets a bit of the foreign controlled states
		virtual	void	setStateBit( const sal_Int16 _nState, const sal_Bool _bSet );

	protected:
		OAccessibleImplementationAccess( );
		virtual ~OAccessibleImplementationAccess( );

		// XUnoTunnel
		virtual sal_Int64 SAL_CALL getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& _rIdentifier ) throw (::com::sun::star::uno::RuntimeException);

	public:
		/** tries to access the implementation of an OAccessibleImplementationAccess derivee which is known as
			interface only.

		@param _rxComponent
			is the component which should be examined.
		@return
			the pointer to the implementation, if successful. The only known error condition so far
			is an invalid context (which means it is <NULL/>, or the implementation is not derived
			from <type>OAccessibleImplementationAccess</type>, or retrieving the implementation failed).
		*/
		static OAccessibleImplementationAccess* getImplementation( 
			const ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleContext >& _rxComponent
		);


		/** sets the parent for a derived implementation

		@param _rxComponent
			is the component which's new parent should be set
		@param _rxNewParent
			is the new parent of the component
		@return
			<TRUE/> in case of success, <FALSE/> otherwise. For error condition please look at
			<method>getImplementation</method>.
		*/
		static sal_Bool	setAccessibleParent(
			const ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleContext >& _rxComponent,
			const ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >& _rxNewParent
		);

		/** sets or resets a state bit in the set of foreign-controlled states of the component.

		@param _rxComponent
			is the component which's state is to be (re)set
		@param _nState
			the state bit which should be affected. This should be one of the respective UNO constants.
		@param _bSet
			<TRUE/> if the bit should be set, <FALSE/> otherwise
		@return
			<TRUE/> in case of success, <FALSE/> otherwise. For error condition please look at
			<method>getImplementation</method>.
		*/
		static sal_Bool	setForeignControlledState(
			const ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleContext >& _rxComponent,
			const sal_Int16 _nState,
			const sal_Bool	_bSet
		);
			

	private:
		COMPHELPER_DLLPRIVATE static const ::com::sun::star::uno::Sequence< sal_Int8 >& getUnoTunnelImplementationId();
	};

//.........................................................................
}	// namespace comphelper
//.........................................................................


#endif // COMPHELPER_ACCIMPLACCESS_HXX


