/**************************************************************
 * 
 * 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 __com_sun_star_accessibility_XAccessibleRelationSet_idl__
#define __com_sun_star_accessibility_XAccessibleRelationSet_idl__

#ifndef __com_sun_star_accessibility_AccessibleRelation_idl__
#include <com/sun/star/accessibility/AccessibleRelation.idl>
#endif

#ifndef __com_sun_star_uno_XInterface_idl__ 
#include <com/sun/star/uno/XInterface.idl> 
#endif 
#ifndef __com_sun_star_lang_IndexOutOfBoundsException_idl__
#include <com/sun/star/lang/IndexOutOfBoundsException.idl>
#endif

module com { module sun { module star { module accessibility {

/** Implement this interface to give access to an object's set of relations.

    <p>Such relation are modeled with the <type>AccessibleRelation</type>
    structure.  This interface is used for representing sets of relations
    between <type>Accessible</type> objects.  Most of the convenience
    methods of the corresponding AccessibleRelationSet interface of the Java
    Accessibility API have been removed from this interface in order to
    clean it up.  These methods are <member>add</member>,
    <member>addAll</member>, <member>clear</member>, and
    <member>remove</member>.  The other methods have been renamed to achieve
    a geater conformance with the other accessibility interfaces.</p>

    @since OpenOffice 1.1.2
*/
published interface XAccessibleRelationSet : ::com::sun::star::uno::XInterface
{
	/** Returns the number of relations in this relation set.
        
        @return
            Returns the number of relations or zero if there are none.            
	*/
	long getRelationCount ();
	
	/** Returns the relation of this relation set that is specified by
        the given index.
        
        @param nIndex
            This index specifies the relatio to return.
            
        @return
            For a valid index, i.e. inside the range 0 to the number of
            relations minus one, the returned value is the requested
            relation.  If the index is invalid then the returned relation
            has the type INVALID.
            
	*/
	AccessibleRelation getRelation ([in] long nIndex)
        raises (::com::sun::star::lang::IndexOutOfBoundsException);

	/** Tests whether the relation set contains a relation matching the
        specified key.
        
        @param aRelationType
            The type of relation to look for in this set of relations.  This
            has to be one of the constants of
            <type>AccessibleRelationType</type>.
            
        @return
            Returns <TRUE/> if there is a (at least one) relation of the
            given type and <FALSE/> if there is no such relation in the set.
	*/
	boolean containsRelation ([in] short aRelationType);

	/** Retrieve and return the relation with the given relation type.
        
        @param aRelationType
            The type of the relation to return.  This has to be one of the
            constants of <type>AccessibleRelationType</type>.
            
        @return
            If a relation with the given type could be found than (a copy
            of) this relation is returned.  Otherwise a relation with the
            type INVALID is returned.
	*/
	AccessibleRelation getRelationByType ([in] short aRelationType);
};
          
}; }; }; };

#endif
