/**************************************************************
 *
 * 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_beans_PropertyState_idl__
#define __com_sun_star_beans_PropertyState_idl__


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

module com {  module sun {  module star {  module beans {

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

/** This enumeration lists the states that a property value can have.

	<p>The state consists of two aspects: </p>
	<ol>
		<li>whether a value is available or void, </li>
		<li>whether the value is stored in the property set itself or is a
			default, or ambiguous.  </li>
	</ol>

	@see XPropertyState
	@see Property
 */
published enum PropertyState
{
	//-------------------------------------------------------------------------

	/** The value of the property is stored in the PropertySet itself.

		<p>The property value must be available and of the specified type.
		If the <member>PropertyAttribute</member> field in the struct
		<type>Property</type> contains <const>PropertyAttribute::MAYBEVOID</const>,
		then the value may be void. </p>
	 */
	DIRECT_VALUE,

	//-------------------------------------------------------------------------

	/** The value of the property is available from a master (e.g., template).

		<p>The <member>PropertyAttribute</member> field in the struct
		<type>Property</type> must contain the
		<const>PropertyAttribute::MAYBEDEFAULT</const> flag. The property
		value must be available and of the specified type. If the
		<member>PropertyAttribute</member> field in the struct <type>Property</type>
		contains <const>PropertyAttribute::MAYBEVOID</const>, then the
		value may be void. </p>
	 */
	DEFAULT_VALUE,

	//-------------------------------------------------------------------------

	/** The value of the property is only a recommendation because there
		are multiple values for this property (e.g., from a multi selection).

		<p>The <member>PropertyAttribute</member> field in the struct
		<type>Property</type> must contain the
		<const>PropertyAttribute::MAYBEAMBIGUOUS</const> flag. The
		property value must be available and of the specified type.
		If the Attribute field in the struct Property contains
		<const>PropertyAttribute::MAYBEVOID</const>, then the value
		may be void. </p>
	 */
	AMBIGUOUS_VALUE

};

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

}; }; }; };

#endif
