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

#ifndef __com_sun_star_lang_XComponent_idl__
#include <com/sun/star/lang/XComponent.idl>
#endif

#ifndef __com_sun_star_ucb_XContent_idl__
#include <com/sun/star/ucb/XContent.idl>
#endif

#ifndef __com_sun_star_ucb_XCommandProcessor_idl__
#include <com/sun/star/ucb/XCommandProcessor.idl>
#endif

#ifndef __com_sun_star_ucb_XCommandProcessor2_idl__
#include <com/sun/star/ucb/XCommandProcessor2.idl>
#endif

#ifndef __com_sun_star_beans_XPropertiesChangeNotifier_idl__
#include <com/sun/star/beans/XPropertiesChangeNotifier.idl>
#endif

#ifndef __com_sun_star_beans_XPropertyContainer_idl__
#include <com/sun/star/beans/XPropertyContainer.idl>
#endif

#ifndef __com_sun_star_beans_XPropertySetInfoChangeNotifier_idl__
#include <com/sun/star/beans/XPropertySetInfoChangeNotifier.idl>
#endif

#ifndef __com_sun_star_ucb_XCommandInfoChangeNotifier_idl__
#include <com/sun/star/ucb/XCommandInfoChangeNotifier.idl>
#endif

#ifndef __com_sun_star_container_XChild_idl__
#include <com/sun/star/container/XChild.idl>
#endif

//=============================================================================

module com { module sun { module star { module ucb {

//=============================================================================
/** A HCP Link is a content which points to another location.

    <p>It is always contained in HCP Folder. A HCP Link has no children.

	@see com::sun::star::ucb::HierarchyContentProvider
	@see com::sun::star::ucb::HierarchyRootFolderContent
	@see com::sun::star::ucb::HierarchyFolderContent
*/
published service HierarchyLinkContent
{
	//-------------------------------------------------------------------------
	/** This interface is implemented according to the specification of
		service <type>Content</type>.
	 */
	interface com::sun::star::lang::XComponent;

	//-------------------------------------------------------------------------
	/** This interface is implemented according to the specification of
		service <type>Content</type>.
	 */
	interface com::sun::star::ucb::XContent;

	//-------------------------------------------------------------------------
	/** This interface is implemented according to the specification of
		service <type>Content</type>.

		<p>

		<b>Supported Commands</b>
		<ul>
		<li>
		getCommandInfo
		</li>
		<li>
		getPropertySetInfo
		</li>
		<li>
		getPropertyValues
		</li>
		<li>
		setPropertyValues
		</li>
		<li>
		insert ( makes a newly created link persistent )
		</li>
		<li>
		delete
		</li>
		</ul>

		<b>Supported Properties</b>
		<ul>
		<li>
		string ContentType ( read-only, always "application/vnd.sun.star.hier-link" )
		</li>
		<li>
		boolean IsDocument ( read-only, always true )
		</li>
		<li>
		boolean IsFolder ( read-only, always false )
		</li>
		<li>
		string Title
		</li>
		<li>
		string TargetURL ( the URL of the link target )
		</li>
		</ul>

		</p>
	 */
	interface com::sun::star::ucb::XCommandProcessor;

    //-------------------------------------------------------------------------
    /** is an enhanced version of <type>XCommandProcessor</type> that has an
        additional method for releasing command identifiers obtained via
        <member>XCommandProcessor::createCommandIdentifier</member> to avoid
        resource leaks. For a detailed description of the problem refer to
        <member>XCommandProcessor2::releaseCommandIdentifier</member>.

        <p>Where many existing <type>Content</type> implementations do not
        (yet), every new implementation should support this interface.
     */
    [optional] interface com::sun::star::ucb::XCommandProcessor2;

	//-------------------------------------------------------------------------
	/** This interface is implemented according to the specification of
		service <type>Content</type>.
	 */
	interface com::sun::star::beans::XPropertiesChangeNotifier;

	//-------------------------------------------------------------------------
	/** This interface is implemented according to the specification of
		service <type>Content</type>.
	 */
	interface com::sun::star::beans::XPropertyContainer;

	//-------------------------------------------------------------------------
	/** This interface is implemented according to the specification of
		service <type>Content</type>.
	 */
	interface com::sun::star::beans::XPropertySetInfoChangeNotifier;

	//-------------------------------------------------------------------------
	/** This interface is implemented according to the specification of
		service <type>Content</type>.
	 */
	interface com::sun::star::ucb::XCommandInfoChangeNotifier;

	//-------------------------------------------------------------------------
	/** This interface is implemented according to the specification of
		service <type>Content</type>.
	 */
	interface com::sun::star::container::XChild;
};

//=============================================================================

}; }; }; };

#endif
