/**************************************************************
 * 
 * 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_script_XLibraryContainer2_idl__ 
#define __com_sun_star_script_XLibraryContainer2_idl__ 
 
#ifndef __com_sun_star_script_XLibraryContainer_idl__ 
#include <com/sun/star/script/XLibraryContainer.idl> 
#endif 
 
 
//============================================================================= 
 
 module com {  module sun {  module star {  module script {  
 
//============================================================================= 
 
/** 
	Extension of <type>XLibraryContainer</type> to provide additional information
	about the libraries contained in a library container
 */
published interface XLibraryContainer2: com::sun::star::script::XLibraryContainer
{ 
	/** 
		returns true if the accessed library item is a link,
		e.g., created by createLibraryLink, otherwise false.
	 */
	boolean isLibraryLink( [in] string Name )
			raises( com::sun::star::container::NoSuchElementException ); 

	/** 
		returns the location of the library link target.
		Should return the same URL that was passed to 
		createLibraryLink in the StorageURL parameter.

		If the accessed library item exists but isn't a 
		link, a IllegalArgumentException is thrown
	 */
	string getLibraryLinkURL( [in] string Name )
			raises( com::sun::star::lang::IllegalArgumentException, 
					com::sun::star::container::NoSuchElementException );

	/** 
		returns true if the accessed library item (library or library 
		link) is read only. A library can be read only because it was 
		set to read only using the methods provided by this interface 
		or because of other reasons depending on the implementation 
		(e.g., file system write protection)
	 */
	boolean isLibraryReadOnly( [in] string Name )
			raises( com::sun::star::container::NoSuchElementException ); 

	/** 
		Sets the accessed library item (library or library link) to
		read only according to the flag bReadOnly (true means read only)
	 */
	void setLibraryReadOnly( [in] string Name, [in] boolean bReadOnly )
			raises( com::sun::star::container::NoSuchElementException ); 

	/** renames the library item with the specified name. If the accessed 
		library item is a link only the link is renamed, not the target library.
		If a library with the new name exists already a 
		com::sun::star::container::ElementExistException is thrown.
	 */
	void renameLibrary( [in] string Name, [in] string NewName ) 
			raises( com::sun::star::container::NoSuchElementException,
					com::sun::star::container::ElementExistException );

};

//============================================================================= 
 
 
}; }; }; };  
 
#endif 
