/**************************************************************
 * 
 * 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_UpdateRootElement_idl__
#define __com_sun_star_configuration_UpdateRootElement_idl__

#ifndef __com_sun_star_configuration_AccessRootElement_idl__
#include <com/sun/star/configuration/AccessRootElement.idl>
#endif

#ifndef __com_sun_star_util_XChangesBatch_idl__
#include <com/sun/star/util/XChangesBatch.idl>
#endif

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

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

//=============================================================================
/** provides update control for a hierarchy of configuration items
 and information about the hierarchy as a whole as well as its root.
 
 <p>Extends <type>AccessRootElement</type> by adding support for
 collecting changes and applying them to a backend store as a single batch.
 </p>

 <p>An implementation represents the root of a partial hierarchy. [See the
 documentation for <type>AccessRootElement</type>]. The hierarchy in turn is
 a <em>view</em> onto a fragment of persistent data tree that can be accessed
 through several such views, or even several processes, simultaneously.
 </p>

 <p>Elements of the hierarchy, such as descendants of this root element,
 may support modification by providing appropriate
 interfaces. Changes done this way initially only affect these objects
 themselves and other objects within the same hierarchy, such as other
 descendants of this root element.
 </p>

 <p>The accumulated changes within this hierarchy can be managed using
 <type scope="com::sun::star::util">XChangesBatch</type>. Pending changes
 will become persistent and visible from other overlapping hierarchies
 only when <member scope="com::sun::star::util">XChangesBatch::commitChanges()</member>
 is called. If the hierarchy is disposed or discarded without committing
 changes, the changes will be lost.
 </p>

 @see com::sun::star::configuration::GroupUpdate
 @see com::sun::star::configuration::SetUpdate
*/
published service UpdateRootElement
{
/** provides (read-only) access to information about the root element of
 (a fragment of) the hierarchy. It also provides some functionality concerning
 the hierarchy (fragment) accessible from that element as a whole.
*/
	service AccessRootElement;

/** allows managing changes within the hierarchy.

 <p><member scope="com::sun::star::util">XChangesBatch::getPendingChanges()</member>
 reports all changes within the hierarchy that are done through (direct or
 indirect) descendants of this element. The same set of changes is committed
 to persistent storage and/or made visible to other objects accessing the same
 data set, when 
 <member scope="com::sun::star::util">XChangesBatch::commitChanges()</member>
 is invoked.
 </p>

 <p>If the implementation supports
 <member scope="com::sun::star::lang">XLocalizable::setLocale()</member>, changes
 will be considered to apply to the locale that is set when
 <member scope="com::sun::star::util">XChangesBatch::commitChanges()</member>
 is invoked.
 </p>

 @ see AccessRootElement
 @ see com::sun::star::util::XChangesNotifier
*/
	interface com::sun::star::util::XChangesBatch;
};

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

}; }; }; }; 

#endif
