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

#ifndef __com_sun_star_accessibility_AccessibleStateType_idl__
#include <com/sun/star/accessibility/AccessibleStateType.idl>
#endif

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

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

 published interface XAccessible;

/** Implement this interface to represent a set of states.

    <p>The interface <type>XAccessibleStateSet</type> represents a set of
    states of an accessible object.  It can hold any combination of states
    defined by the constants collection
    <type>AccessibleStateType</type>.</p>

    @since OOo 1.1.2
*/
published interface XAccessibleStateSet : ::com::sun::star::uno::XInterface
{
    /** Checks whether the current state set is empty.
        
        @return
            Returns <TRUE/> if there is no state in this state set and
            <FALSE/> if there is at least one set state in it.
    */
    boolean isEmpty ();

    /** Checks if the given state is a member of the state set of the called
        object.
        
        @param aState
            The state for which to check membership.  This has to be one of
            the constants of <type>AccessibleStateType</type>.
            
        @return
            Returns <TRUE/> if the given state is a memeber of this object's
            state set and <FALSE/> otherwise.
    */
    boolean contains ([in] short aState);
    
    /** Checks if all of the given states are in the state set of the called
        object.
        
        @param aStateSet
            This sequence of states is interpreted as set and every of its
            members, duplicates are ignored, is checked for membership in
            this object's state set.  Each state has to be one of the
            constants of <type>AccessibleStateType</type>.
            
        @return
            Returns <TRUE/> if all states of the given state set are members
            of this object's state set.  <FALSE/> is returned if at least
            one of the states in the given state is not a member of this
            object's state set.
    */
    boolean containsAll ([in] sequence<short> aStateSet);

    /** Get all currently set states as a sequence of state ids.

        <p>The purpose of this function is to reduce the communication
        between accessibility objects and AT.  Without this function an
        AT-Tool had to call <member>contains()</member> for every state
        type.  Now a single call is sufficient.</p>

        @return
            The returned sequence contains one entry for every currently set
            state.  This entry is the id of that state.  The order of the
            states in the sequence is undefined.
    */
    sequence<short> getStates ();
};
          
}; }; }; };

#endif
