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

#ifndef __com_sun_star_accessibility_XAccessibleAction_idl__ 
#include <com/sun/star/accessibility/XAccessibleAction.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 represent a hyperlink or a group of
    hyperlinks.

    <p>Single hyperlinks correspond to simple &lt;a href&gt; tags.  Groups
    of hyperlinks are contained in client side image maps.  Linked objects
    and anchors are implementation dependent.  This interface inherits the
    <type>XAccessibleAction</type> interface.  Especially that interface's
    <member>XAccessibleAction::getActionCount</member> method is needed to
    obtain a maximum value for the indices passed to the
    <member>XAccessibleHyperlink::getAccessibleActionAnchor</member> and
    <member>XAccessibleHyperlink::getAccessibleActionObject</member>
    methods.</p>
        
    <p>Furhtermore, the object that implements this interface has to be
    connected implicitely or explicitely with an object that implements the
    the <type>XAccessibleText</type> interface.  The
    <member>XAccessibleHyperlink::getStartIndex</member> and
    <member>XAccessibleHyperlink::getEndIndex</member> methods return
    indices with respect to the text exposed by that interface.</p>

    @since OOo 1.1.2
*/
published interface XAccessibleHyperlink : 
    ::com::sun::star::accessibility::XAccessibleAction
{
    /** Returns an object that represents the link anchor, as appropriate
        for that link.
        
        <p>For an HTML link for example, this method would return the string
        enclosed by the &lt&a href&gt; tag.</p>
        
        @param nIndex
            This index identifies the anchor when, as in the case of an
            image map, there is more than one link represented by this
            object.  The valid maximal index can be determinded by calling
            the <member>XAccessibleAction::getActionCount</member> method.
            
        @return
            If the index is not valid then an exception is thrown.
            Otherwise it returns an implementation dependent value.
    */
    any getAccessibleActionAnchor ([in] long nIndex)
        raises (::com::sun::star::lang::IndexOutOfBoundsException);

    /** Returns an object that represents the link anchor, as appropriate
        for that link.
        
        <p>For an HTML link for example, this method would return the URL of
        the &lt&a href&gt; tag.</p>
        
        @param nIndex
            This index identifies the action object when, as in the case of
            an image map, there is more than one link represented by this
            object.  The valid maximal index can be determinded by calling
            the <member>XAccessibleAction::getActionCount</member> method.
            
        @return
            If the index is not valid then an exception is thrown.
            Otherwise it returns an implementation dependent value.
    */
    any getAccessibleActionObject ([in] long nIndex)
        raises (::com::sun::star::lang::IndexOutOfBoundsException);

    /** Returns the index at which the textual representation of the
        hyperlink (group) starts.
        
        <p>The returned value relates to the <type>XAccessibleText</type>
        interface that ownes this hyperlink.</p>
        
        @return
            The index relates to the text exposed by the
            <type>XAccessibleHypertext</type> interface.
    */
    long getStartIndex ();

    /** Returns the index at which the textual rerpesentation of the
        hyperlink (group) ends.
        
        <p>The returned value relates to the <type>XAccessibleText</type>
        interface that ownes this hyperlink.</p>
        
        @return
            The index relates to the text exposed by the
            <type>XAccessibleText</type> interface.
    */
    long getEndIndex ();

    /** Returns whether the document referenced by this links is
        still valid.
        
        <p>This is a volatile state that may change without further warning
        like e.g. sending an appropriate event.</p>
        
        @return
            Returns <TRUE/> if the referenced document is still valid and
            <FALSE/> otherwise.
    */
    boolean isValid ();
};
          
}; }; }; };

#endif
