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

#ifndef __com_sun_star_uno_XInterface_idl__
#include <com/sun/star/uno/XInterface.idl>
#endif
#ifndef __com_sun_star_drawing_framework_AnchorBindingMode_idl__
#include <com/sun/star/drawing/framework/AnchorBindingMode.idl>
#endif
#ifndef __com_sun_star_util_URL_idl__
#include <com/sun/star/util/URL.idl>
#endif

module com { module sun { module star { module drawing { module framework {

/** A resource id uses a set of URLs to unambiguously specify a resource of
    the drawing framework.
    <p>Resources of the drawing framework are panes, views, tool bars, and
    command groups.  One URL describes the type of the actual resource.  A
    sequence of URLs (typically one, sometimes two) specifies its anchor,
    the resource it is bound to.  The anchor typically is a pane (for
    views), or it is empty (for panes).</p>
    <p>The resource URL may be empty.  In this case the anchor is empty,
    too.  Such an empty resource id does not describe a resource but rather
    the absence of one.  Instead of an empty <type>XResourceId</type> object
    an empty reference can be used in many places.</p>
    <p>The resource URL may have arguments that are passed to the factory
    method on its creation.  Arguments are only available through the
    getFullResourceURL().  The getResourceURL() method strips them away.</p>
*/
published interface XResourceId
{
    /** Return the URL of the resource.  Arguments supplied on creation are
        stripped away.  Use getFullResourceURL() to access them.
    */
    string getResourceURL ();

    /** Return an URL object of the resource URL that may contain arguments.
    */
    com::sun::star::util::URL getFullResourceURL ();

    /** Return whether there is a non-empty anchor URL.  When this method
        returns <FALSE/> then getAnchorURLs() will return an empty list.
    */
    boolean hasAnchor ();

    /** Return a new XResourceId that represents the anchor resource.
    */
    XResourceId getAnchor ();

    /** Return the, possibly empty, list of anchor URLs.  The URLs are
        ordered so that the one in position 0 is the direct anchor of the
        resource, while the one in position i+1 is the direct anchor of the
        one in position i.
    */
    sequence<string> getAnchorURLs ();

    /** Return the type prefix of the resource URL.  This includes all up to
        and including the second slash.
    */
    string getResourceTypePrefix ();

    /** Compare the called <type>XResourceId</type> object with the given
        one.
        <p>The two resource ids A and B are compared so that if A<B (return
        value is -1) then either A and B are unrelated or A is a direct or
        indirect anchor of B.</p>
        <p>The algorithm for this comparison is quite simple. It uses a
        double lexicographic ordering.  On the lower level individual URLs
        are compared via the lexicographic order defined on strings.  On the
        higher level two resource ids are compared via a lexicographic order
        defined on the URLS.  So when there are two resource ids A1.A2
        (A1 being the anchor of A2) and B1.B2 then A1.A2<B1.B2 when A1<B1 or
        A1==B1 and A2<B2.  Resource ids may have different lengths: A1 <
        B1.B2 when A1<B1 or A1==B1 (anchors first then resources linked to them.</p>
        @param xId
            The resource id to which the called resource id is compared.
        @return
            Returns <const>0</const> when the called resource id is
            equivalent to the given resource id. Returns <code>-1</code> or
            <code>+1</code> when the two compared resource ids differ.
    */
    short compareTo (
        [in] XResourceId xId);

    /** Return whether the anchor of the called resource id object
        represents the same resource as the given object.
        <p>Note that not only the anchor of the given object is taken into
        account. The whole object, including the resource URL, is
        interpreted as anchor resource.</p>
        @param xAnchor
            The resource id of the anchor.
        @param eMode
            This mode specifies how the called resource has to be bound to
            the given anchor in order to have this function return <TRUE/>.
            <p>If eMode is <const>DIRECT</const> then the anchor of the called resource id
            has to be identical to the given anchor. If eMode is
            <const>INDIRECT</const> then the given anchor has to be a part
            of the anchor of the called resource.
    */
    boolean isBoundTo (
        [in] XResourceId xId,
        [in] AnchorBindingMode eMode);

    /** Return whether the anchor of the called resource id object
        represents the same resource as the given anchor URL. This is a
        convenience variant of the <member>isBoundTo()</member> function
        that can also be seen as an optimization for the case that the
        anchor consists of exactly one URL.
        @param xAnchor
            The resource URL of the anchor.
        @param eMode
            This mode specifies how the called resource has to be bound to
            the given anchor in order to have this function return. See the
            description of <member>isBoundTo()</member> for more
            information.
    */
    boolean isBoundToURL (
        [in] string sAnchorURL,
        [in] AnchorBindingMode eMode);

    /** Return a copy of the called resource id.  The caller becomes the
        owner of the new object.
    */
    XResourceId clone ();
};

}; }; }; }; }; // ::com::sun::star::drawing::framework

#endif
