/**************************************************************
 * 
 * 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_backend_NodeAttribute_idl__ 
#define __com_sun_star_configuration_backend_NodeAttribute_idl__
 
//=============================================================================
 
module com { module sun { module star { module configuration { module backend {
 
//=============================================================================
 
/** These values are used to specify the behavior of a node or property
	in a layer.

	<p> The values were chosen so they can be combined with values from
		<type>SchemaAttribute</type>
	</p>

	@see com::sun::star::configuration::backend::SchemaAttribute
		During merging the values may be combined with static attributes 
		from the schema.

    @since OOo 1.1.2  
 */
published constants NodeAttribute
{ 
	//------------------------------------------------------------------------- 
	 
	/** indicates that a node or property may not be changed or overridden
		in subsequent layers
	 */
	const short FINALIZED = 256; 
 
	//------------------------------------------------------------------------- 
	 
	/** indicates that a set item may not be removed or replaced
		in subsequent layers. 
	 */
	const short MANDATORY = 512; 
 
	//------------------------------------------------------------------------- 
	 
	/** indicates that a node or property may not be changed 
		in this or subsequent layer.
	 */
	const short READONLY = 1024; 
 
    //-------------------------------------------------------------------------

    /** indicates that contents shall be fused.

        <p>Used in <member>XLayerHandler::addOrReplaceNode</member>,
        <member>XLayerHandler::addOrReplaceNodeFromTemplate</member>,
        <member>XUpdateHandler::addOrReplaceNode</member>, and
        <member>XUpdateHandler::addOrReplaceNodeFromTemplate</member>.</p>

        @since OOo 2.0.3
     */
    const short FUSE = 2048;
 
	//------------------------------------------------------------------------- 
	 	 
	/** can be used to mask the node attributes from merged attributes
	 */
	const short MASK = 32512; // 0xFF00, changed to 0x7F00 because only 3 bits
                              // are masked and fixing a bug in idlc
 
	//------------------------------------------------------------------------- 
}; 
 
//=============================================================================
 
}; }; }; }; }; 

//=============================================================================
 
#endif 
