////////////////////////////////////////////////////////////////////////////////
//
//  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.
//
////////////////////////////////////////////////////////////////////////////////
package bxf.ui.inspectors
{
	import mx.events.PropertyChangeEvent;

	public class PropertyEditEvent extends PropertyChangeEvent
	{		
		/// This event type means a temporary change, like you might consume for live feedback
		public static const VALUE_EDITED:String = new String("valueEdited");
		
		/// This event type means a committed change - Enter hit, drage ended, whatever. 
		public static const VALUE_CHANGED:String = new String("valueCommitted");
		
		/// This event type means we have detected that the user is hovering, editing, etc. 
		/// Only "property" may be set in this case
		public static const VALUE_ACTIVE:String = new String("valueActive");
		
		/// This event type means opposite of VALUE_FOCUSSED 
		/// Only "property" may be set in this case
		public static const VALUE_INACTIVE:String = new String("valueInactive");
		
		public function PropertyEditEvent(type:String, property:Object=null, newValue:Object=null)
		{
			// These parts of mx.events.PropertyChangeEvent, we don't currently use
			const bubbles:Boolean = false;
			const cancelable:Boolean = false;
			const kind:String = null;
			const source:Object = null;
			const oldValue:Object = null;
			
			super(type, bubbles, cancelable, kind, property, oldValue, newValue, source);
		}
		
	}
}
