/**************************************************************
 *
 * 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_PropertyConcept_idl__
#define __com_sun_star_beans_PropertyConcept_idl__


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

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

//=============================================================================
/** These constants are used to specify concepts of the
	introspection which apply to properties and to the
	methods which represent attributes.

	<p>This list is not necessarily complete; new constants
	may be added.</p>

	@see Introspection
	@see XIntrospection
	@see XIntrospectionAccess
 */
published constants PropertyConcept
{
	//-------------------------------------------------------------------------
	/** This value is used to query for all properties.

		See
		<member>XIntrospectionAccess::getProperty()</member> and
		<member>XIntrospectionAccess::getProperties()</member>
	 */
	const long ALL = -1;

	//-------------------------------------------------------------------------
	/** specifies that the change or retrieval of this
		property directly by the user can result in an unstable
		state (deadlock, application crash, security hole, etc.)
	 */
	const long DANGEROUS = 1;

	//-------------------------------------------------------------------------
	/** specifies all properties which are reachable by
		<type>XPropertySet</type>, <type>XFastPropertySet</type> or
		<type>XMultiPropertySet</type>.
	 */
	const long PROPERTYSET = 2;

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

	/** specifies all properties which are actually attributes of interfaces.
	 */
	const long ATTRIBUTES = 4;

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

	/** specifies all properties which are represented by getter or setter methods.

		<p>These methods have the signature <code>type get...()</code>,
		<code>void set...()</code> or <code>boolean is...()</code>.</p>
	 */
	const long METHODS = 8;

};

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

}; }; }; };

#endif
