/**************************************************************
 * 
 * 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_configuration_SimpleSetUpdate_idl__
#define __com_sun_star_configuration_SimpleSetUpdate_idl__

#ifndef __com_sun_star_configuration_SimpleSetAccess_idl__
#include <com/sun/star/configuration/SimpleSetAccess.idl>
#endif

#ifndef __com_sun_star_container_XNameContainer_idl__
#include <com/sun/star/container/XNameContainer.idl>
#endif

#ifndef __com_sun_star_lang_XSingleServiceFactory_idl__
#include <com/sun/star/lang/XSingleServiceFactory.idl>
#endif

#ifndef __com_sun_star_lang_XMultiServiceFactory_idl__
#include <com/sun/star/lang/XMultiServiceFactory.idl>
#endif

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

module com { module sun { module star { module configuration { 

//=============================================================================
/** provides write access to a dynamic, homogeneous, non-hierarchical set of
 values or objects.

 <p>Allows adding and removing elements.
 Helps create new elements to be added.
 </p>

 <p>This service extends <type>SimpleSetAccess</type> to support
 modifying the container. Any child objects shall in turn support
 modifying access.
 </p>
*/
published service SimpleSetUpdate
{
/** is the basic service providing read access to a (not necessarily
 hierarchical) <em>set</em>.
*/
	service SimpleSetAccess;

/** allows inserting, removing, and replacing elements.

 <p>This interface extends the interface 
 <type scope="com::sun::star::container">XNameAccess</type> supported
 by service <type>SimpleSetAccess</type> to allow modifying the container.
 </p>

 <p>If available, changes can be observed by registering a listener with interface
 <type scope="com::sun::star::container">XContainer</type>.
 </p>

 <p>If the elements of this set are of simple type (the type returned by
 <member scope="com::sun::star::container">XElementAccess::getElementType()</member>
 is not an interface type), then values of that type can directly be passed to
 <member scope="com::sun::star::container">XNameContainer::insertByName()</member>
 and
 <member scope="com::sun::star::container">XNameContainer::replaceByName()</member>.
 </p>

 <p>Otherwise new elements have to be constructed to match the type
 prescribed by the element template of this set. Such elements can be created
 using interfaces <type scope="com::sun::star::lang">XSingleServiceFactory</type>
 and, if supported, <type scope="com::sun::star::lang">XMultiServiceFactory</type>.
 </p>

 <p>Objects to be inserted must not be contained in any set at the time of
 insertion. <member scope="com::sun::star::container">XChild::getParent()</member>
 must return <NULL/>. If a name had been assigned to the object prior to insertion
 (using <member scope="com::sun::star::container">XNamed::setName()</member>
 or by other means), this name is ignored and will be lost.
 After insertion the name of the object is the name that was used as argument
 to <member scope="com::sun::star::container">XNameContainer::insertByName()</member>
 or <member scope="com::sun::star::container">XNameContainer::replaceByName()</member>.
</p>


 <p>Objects that are removed using
 <member scope="com::sun::star::container">XNameContainer::removeByName()</member>
 or replaced using
 <member scope="com::sun::star::container">XNameContainer::replaceByName()</member>
 remain valid and can be reinserted into a set supporting the same template and 
 even under a different name.
 </p>

 <p>An implementation need not support insertion of objects that were not 
 obtained in one of the ways described above. If it does, the implementation
 must reject elements that do not have the correct structure as described
 by the template.
 </p>
*/
	interface com::sun::star::container::XNameContainer;

/** allows creating an object that can be inserted into this set. [conditional]

 <p>This interface shall be implemented by an implementation, 
 if and only if the element type of the set, as returned by
 <member scope="com::sun::star::container">XElementAccess::getElementType()</member>,
 is an object type, such as an interface.
 </p> 

 <p>Using <member scope="com::sun::star::lang">XSingleServiceFactory::createInstance()</member>
 an instance of the element template of this set is created. If the set
 supports multiple templates or variations of the basic template, a default
 variant of the basic template is instantiated. If an implementation supports
 variations, they may be specified by passing arguments to 
 <member scope="com::sun::star::lang">XSingleServiceFactory::createInstanceWithArguments()</member>.
 There are no predefined arguments for all versions of this service.
 </p>

 <p>The object created is not contained in the set and does not have a name yet.
 It may subsequently be inserted into the set and named using
 <member scope="com::sun::star::container">XNameContainer::insertByName()</member>
 or
 <member scope="com::sun::star::container">XNameContainer::replaceByName()</member>.
 </p>
*/
	[optional] interface com::sun::star::lang::XSingleServiceFactory;

/** allows creating various objects that can be inserted into this set. [optional]

 <p>This interface may be implemented by an implementation of 
 service SetUpdate to support creating elements from other than
 the basic element template. An example of this would be an
 implementation that supports inheritance, allowing the use of
 templates derived from the basic template by extension.
 </p> 

 <p>This interface may only be implemented if the element type of the set 
 (as returned by
 <member scope="com::sun::star::container">XElementAccess::getElementType()</member>)
 is an object type, such as an interface. An implementation should also implement
 interface <type>XTemplateContainer</type> which is optional in this service.
 </p> 

 <p>The service identifier argument passed
 to <member scope="com::sun::star::lang">XMultiServiceFactory::createInstance()</member>
 or <member scope="com::sun::star::lang">XMultiServiceFactory::createInstanceWithArguments()</member>
 names the template to be instantiated or otherwise identifies the structure
 to be built. The implementation must at least support using the template
 name obtained from <member>XTemplateContainer::getElementTemplateName()</member>
 as a service identifier, in which case the result shall be the same as if
 the corresponding member of <type scope="com::sun::star::lang">XSingleServiceFactory</type>
 had been called.
 </p> 

*/
	[optional] interface com::sun::star::lang::XMultiServiceFactory;

};

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

}; }; }; }; 

#endif
