http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/77148f4a/frameworks/projects/MX/src/main/flex/mx/core/UITextFormat.as ---------------------------------------------------------------------- diff --cc frameworks/projects/MX/src/main/flex/mx/core/UITextFormat.as index bcc7c48,0000000..320718c mode 100644,000000..100644 --- a/frameworks/projects/MX/src/main/flex/mx/core/UITextFormat.as +++ b/frameworks/projects/MX/src/main/flex/mx/core/UITextFormat.as @@@ -1,660 -1,0 +1,660 @@@ +//////////////////////////////////////////////////////////////////////////////// +// +// 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 mx.core +{ + - COMPILE::AS3 ++COMPILE::SWF +{ + import flash.text.TextFormat; + import flash.text.TextLineMetrics; +} +COMPILE::JS +{ + import flex.text.TextFormat; + import flex.text.TextLineMetrics; +} + +import mx.managers.ISystemManager; + +/** + * The UITextFormat class represents character formatting information + * for the UITextField class. + * The UITextField class defines the component used by many Flex composite + * components to display text. + * + * <p>The UITextFormat class extends the flash.text.TextFormat class + * to add the text measurement methods <code>measureText()</code> + * and <code>measureHTMLText()</code> and to add properties for + * controlling the advanced anti-aliasing of fonts.</p> + * + * @see mx.core.UITextField + * + * @langversion 3.0 + * @playerversion Flash 9 + * @playerversion AIR 1.1 + * @productversion Flex 3 + */ +public class UITextFormat extends TextFormat +{ + include "../core/Version.as"; + + //-------------------------------------------------------------------------- + // + // Class properties + // + //-------------------------------------------------------------------------- + + //---------------------------------- + // embeddedFontRegistry + //---------------------------------- + + private static var noEmbeddedFonts:Boolean; + + /** + * @private + * Storage for the embeddedFontRegistry property. + * This gets initialized on first access, + * not at static initialization time, in order to ensure + * that the Singleton registry has been initialized. + */ + private static var _embeddedFontRegistry:IEmbeddedFontRegistry; + + /** + * @private + * A reference to the embedded font registry. + * Single registry in the system. + * Used to look up the moduleFactory of a font. + */ + private static function get embeddedFontRegistry():IEmbeddedFontRegistry + { + if (!_embeddedFontRegistry && !noEmbeddedFonts) + { + try + { + _embeddedFontRegistry = IEmbeddedFontRegistry( + Singleton.getInstance("mx.core::IEmbeddedFontRegistry")); + } + catch (e:Error) + { + noEmbeddedFonts = true; + } + } + + return _embeddedFontRegistry; + } + + //---------------------------------- + // textFieldFactory + //---------------------------------- + + /** + * @private + * Storage for the textFieldFactory property. + * This gets initialized on first access, + * not at static initialization time, in order to ensure + * that the Singleton registry has already been initialized. + */ + private static var _textFieldFactory:ITextFieldFactory; + + /** + * @private + * Factory for text fields used to measure text. + * Created in the context of module factories + * so the text field has access to an embedded font, if needed. + */ + private static function get textFieldFactory():ITextFieldFactory + { + if (!_textFieldFactory) + { + _textFieldFactory = ITextFieldFactory( + Singleton.getInstance("mx.core::ITextFieldFactory")); + } + + return _textFieldFactory; + } + + //-------------------------------------------------------------------------- + // + // Constructor + // + //-------------------------------------------------------------------------- + + /** + * Constructor. + * + * @param systemManager A SystemManager object. + * The SystemManager keeps track of which fonts are embedded. + * Typically this is the SystemManager obtained from the + * <code>systemManager</code> property of UIComponent. + * + * @param font A String specifying the name of a font, + * or <code>null</code> to indicate that this UITextFormat + * doesn't specify this property. + * This parameter is optional, with a default value of <code>null</code>. + * + * @param size A Number specifying a font size in pixels, + * or <code>null</code> to indicate that this UITextFormat + * doesn't specify this property. + * This parameter is optional, with a default value of <code>null</code>. + * + * @param color An unsigned integer specifying the RGB color of the text, + * such as 0xFF0000 for red, or <code>null</code> to indicate + * that is UITextFormat doesn't specify this property. + * This parameter is optional, with a default value of <code>null</code>. + * + * @param bold A Boolean flag specifying whether the text is bold, + * or <code>null</code> to indicate that this UITextFormat + * doesn't specify this property. + * This parameter is optional, with a default value of <code>null</code>. + * + * @param italic A Boolean flag specifying whether the text is italic, + * or <code>null</code> to indicate that this UITextFormat + * doesn't specify this property. + * This parameter is optional, with a default value of <code>null</code>. + * + * @param italic A Boolean flag specifying whether the text is underlined, + * or <code>null</code> to indicate that this UITextFormat + * doesn't specify this property. + * This parameter is optional, with a default value of <code>null</code>. + * + * @param urlString A String specifying the URL to which the text is + * hyperlinked, or <code>null</code> to indicate that this UITextFormat + * doesn't specify this property. + * This parameter is optional, with a default value of <code>null</code>. + * + * @param target A String specifying the target window + * where the hyperlinked URL is displayed. + * If the target window is <code>null</code> or an empty string, + * the hyperlinked page is displayed in the same browser window. + * If the <code>urlString</code> parameter is <code>null</code> + * or an empty string, this property has no effect. + * This parameter is optional, with a default value of <code>null</code>. + * + * @param align A String specifying the alignment of the paragraph, + * as a flash.text.TextFormatAlign value, or <code>null</code> to indicate + * that this UITextFormat doesn't specify this property. + * This parameter is optional, with a default value of <code>null</code>. + * + * @param leftMargin A Number specifying the left margin of the paragraph, + * in pixels, or <code>null</code> to indicate that this UITextFormat + * doesn't specify this property. + * This parameter is optional, with a default value of <code>null</code>. + * + * @param rightMargin A Number specifying the right margin of the paragraph, + * in pixels, or <code>null</code> to indicate that this UITextFormat + * doesn't specify this property. + * This parameter is optional, with a default value of <code>null</code>. + * + * @param indent A Number specifying the indentation from the left + * margin to the first character in the paragraph, in pixels, + * or <code>null</code> to indicate that this UITextFormat + * doesn't specify this property. + * This parameter is optional, with a default value of <code>null</code>. + * + * @param leading A Number specifying the amount of additional vertical + * space between lines, or <code>null</code> to indicate + * that this UITextFormat doesn't specify this property. + * This parameter is optional, with a default value of <code>null</code>. + * + * @see flash.text.TextFormatAlign + * + * @langversion 3.0 + * @playerversion Flash 9 + * @playerversion AIR 1.1 + * @productversion Flex 3 + */ + public function UITextFormat(systemManager:ISystemManager, + font:String = null, + size:Object = null, + color:Object = null, + bold:Object = null, + italic:Object = null, + underline:Object = null, + url:String = null, + target:String = null, + align:String = null, + leftMargin:Object = null, + rightMargin:Object = null, + indent:Object = null, + leading:Object = null) + { + this.systemManager = systemManager; + + super(font, size, color, bold, italic, underline, url, target, + align, leftMargin, rightMargin, indent, leading); + } + + //-------------------------------------------------------------------------- + // + // Variables + // + //-------------------------------------------------------------------------- + + /** + * @private + */ + private var systemManager:ISystemManager; + + //-------------------------------------------------------------------------- + // + // Properties + // + //-------------------------------------------------------------------------- + + //---------------------------------- + // antiAliasType + //---------------------------------- + + /** + * Defines the anti-aliasing setting for the UITextField class. + * The possible values are <code>"normal"</code> + * (<code>flash.text.AntiAliasType.NORMAL</code>) + * and <code>"advanced"</code> + * (<code>flash.text.AntiAliasType.ADVANCED</code>). + * + * <p>The default value is <code>"advanced"</code>, + * which enables advanced anti-aliasing + * for the embedded font. + * Set this property to <code>"normal"</code> + * to disable the advanced anti-aliasing.</p> + * + * <p>This property has no effect for system fonts.</p> + * + * <p>This property applies to all the text in a UITextField object; + * you cannot apply it to some characters and not others.</p> + * + * @default "advanced" + * + * @see flash.text.AntiAliasType + * + * @langversion 3.0 + * @playerversion Flash 9 + * @playerversion AIR 1.1 + * @productversion Flex 3 + */ + public var antiAliasType:String; + + //---------------------------------- + // direction + //---------------------------------- + + /** + * The directionality of the text. + * + * <p>The allowed values are <code>"ltr"</code> for left-to-right text, + * as in Latin-style scripts, + * and <code>"rtl"</code> for right-to-left text, + * as in Arabic and Hebrew.</p> + * + * <p>FTE and TLF use this value in their bidirectional text layout algorithm, + * which maps Unicode character order to glyph order.</p> + * + * <p>Note: This style only applies when this UITextFormat + * is used with a UIFTETextField rather than a UITextField.</p> + * + * @default null + * + * @langversion 3.0 + * @playerversion Flash 10 + * @playerversion AIR 1.5 + * @productversion Flex 4 + */ + public var direction:String; + + //---------------------------------- + // gridFitType + //---------------------------------- + + /** + * Defines the grid-fitting setting for the UITextField class. + * The possible values are <code>"none"</code> + * (<code>flash.text.GridFitType.NONE</code>), + * <code>"pixel"</code> + * (<code>flash.text.GridFitType.PIXEL</code>), + * and <code>"subpixel"</code> + * (<code>flash.text.GridFitType.SUBPIXEL</code>). + * + * <p>This property only applies when you are using an + * embedded font and the <code>fontAntiAliasType</code> + * property is set to <code>"advanced"</code>.</p> + * + * <p>This property has no effect for system fonts.</p> + * + * <p>This property applies to all the text in a UITextField object; + * you cannot apply it to some characters and not others.</p> + * + * @default "pixel" + * + * @see flash.text.GridFitType + * + * @langversion 3.0 + * @playerversion Flash 9 + * @playerversion AIR 1.1 + * @productversion Flex 3 + */ + public var gridFitType:String; + + //---------------------------------- + // locale + //---------------------------------- + + /** + * The locale of the text. + * + * <p>FTE and TLF use this locale to map Unicode characters + * to font glyphs and to find fallback fonts.</p> + * + * <p>Note: This style only applies when this UITextFormat + * is used with a UIFTETextField rather than a UITextField.</p> + * + * @default null + * + * @langversion 3.0 + * @playerversion Flash 10 + * @playerversion AIR 1.5 + * @productversion Flex 4 + */ + public var locale:String; + + //---------------------------------- + // moduleFactory + //---------------------------------- + + /** + * @private + * Storage for the moduleFactory property. + */ + private var _moduleFactory:IFlexModuleFactory; + + /** + * The moduleFactory used to create TextFields for embedded fonts. + * + * @langversion 3.0 + * @playerversion Flash 9 + * @playerversion AIR 1.1 + * @productversion Flex 3 + */ + public function get moduleFactory():IFlexModuleFactory + { + return _moduleFactory; + } + + /** + * @private + */ + public function set moduleFactory(value:IFlexModuleFactory):void + { + _moduleFactory = value; + } + + //---------------------------------- + // sharpness + //---------------------------------- + + /** + * Defines the sharpness setting for the UITextField class. + * This property specifies the sharpness of the glyph edges. + * The possible values are Numbers from -400 through 400. + * + * <p>This property only applies when you are using an + * embedded font and the <code>fontAntiAliasType</code> + * property is set to <code>"advanced"</code>.</p> + * + * <p>This property has no effect for system fonts.</p> + * + * <p>This property applies to all the text in a UITextField object; + * you cannot apply it to some characters and not others.</p> + * + * @default 0 + * @see flash.text.TextField + * + * @langversion 3.0 + * @playerversion Flash 9 + * @playerversion AIR 1.1 + * @productversion Flex 3 + */ + public var sharpness:Number; + + //---------------------------------- + // thickness + //---------------------------------- + + /** + * Defines the thickness setting for the UITextField class. + * This property specifies the thickness of the glyph edges. + * The possible values are Numbers from -200 to 200. + * + * <p>This property only applies when you are using an + * embedded font and the <code>fontAntiAliasType</code> + * property is set to <code>"advanced"</code>.</p> + * + * <p>This property has no effect for system fonts.</p> + * + * <p>This property applies to all the text in a UITextField object; + * you cannot apply it to some characters and not others.</p> + * + * @default 0 + * @see flash.text.TextField + * + * @langversion 3.0 + * @playerversion Flash 9 + * @playerversion AIR 1.1 + * @productversion Flex 3 + */ + public var thickness:Number; + + //---------------------------------- + // useFTE + //---------------------------------- + + /** + * Determines how the <code>measureText()</code> + * and <code>measureHTMLText()</code> methods do text measurement. + * + * <p>If <code>true</code>, they use an offscreen instance + * of the FTETextField class in the Text Layout Framework. + * If <code>false</code>, they use an offscreen instance + * of the TextField class in the Flash Player.</p> + * + * @default false + * + * @langversion 3.0 + * @playerversion Flash 9 + * @playerversion AIR 1.1 + * @productversion Flex 3 + */ + public var useFTE:Boolean = false; + + //-------------------------------------------------------------------------- + // + // Methods + // + //-------------------------------------------------------------------------- + + /** + * Returns measurement information for the specified text, + * assuming that it is displayed in a single-line UITextField component, + * and using this UITextFormat object to define the text format. + * + * @param text A String specifying the text to measure. + * + * @param roundUp A Boolean flag specifying whether to round up the + * the measured width and height to the nearest integer. + * Rounding up is appropriate in most circumstances. + * + * @return A TextLineMetrics object containing the text measurements. + * + * @see flash.text.TextLineMetrics + * + * @langversion 3.0 + * @playerversion Flash 9 + * @playerversion AIR 1.1 + * @productversion Flex 3 + */ + public function measureText(text:String, roundUp:Boolean = true):TextLineMetrics + { + return measure(text, false, roundUp); + } + + /** + * Returns measurement information for the specified HTML text, + * which may contain HTML tags such as <code><font></code> + * and <code><b></code>, assuming that it is displayed + * in a single-line UITextField, and using this UITextFormat object + * to define the text format. + * + * @param text A String specifying the HTML text to measure. + * + * @param roundUp A Boolean flag specifying whether to round up the + * the measured width and height to the nearest integer. + * Rounding up is appropriate in most circumstances. + * + * @return A TextLineMetrics object containing the text measurements. + * + * @see flash.text.TextLineMetrics + * + * @langversion 3.0 + * @playerversion Flash 9 + * @playerversion AIR 1.1 + * @productversion Flex 3 + */ + public function measureHTMLText(htmlText:String, roundUp:Boolean = true):TextLineMetrics + { + return measure(htmlText, true, roundUp); + } + + /** + * @private + */ + private function measure(s:String, html:Boolean, roundUp:Boolean):TextLineMetrics + { + // The text of a TextField can't be set to null. + if (!s) + s = ""; + + // Create a persistent, off-display-list TextField + // to be used for text measurement. The text field factory keeps + // the text fields to one per moduleFactory. + var embeddedFont:Boolean = false; + var fontModuleFactory:IFlexModuleFactory = (noEmbeddedFonts || !embeddedFontRegistry) ? + null : + embeddedFontRegistry.getAssociatedModuleFactory( + font, bold, italic, this, moduleFactory, systemManager, useFTE); + + embeddedFont = (fontModuleFactory != null); + if (fontModuleFactory == null) + { + // try to use the systemManager as a backup for the case + // where embedded fonts have no info(). + fontModuleFactory = systemManager; + } + + var measurementTextField:Object /* either TextField or FTETextField */ = + useFTE ? + textFieldFactory.createFTETextField(fontModuleFactory) : + textFieldFactory.createTextField(fontModuleFactory); + + // Clear any old text from the TextField. + // Otherwise, new text will get the old TextFormat. + if (html) + measurementTextField.htmlText = ""; + else + measurementTextField.text = ""; + + // Make the measurement TextField use this TextFormat. + measurementTextField.defaultTextFormat = this; + measurementTextField.embedFonts = embeddedFont; + + // Set other properties based on CSS styles. + if (!useFTE) + { + // These properties do not have meaning in FTETextField, + // and have been implemented to return either null or NaN, + // so don't try to set them on a FTETextField. + measurementTextField.antiAliasType = antiAliasType; + measurementTextField.gridFitType = gridFitType; + measurementTextField.sharpness = sharpness; + measurementTextField.thickness = thickness; + } + else + { + // The properties have meaning only on a FTETextField. + measurementTextField.direction = direction; + measurementTextField.locale = locale; + } + + // Set the text to be measured into the TextField. + if (html) + measurementTextField.htmlText = s; + else + measurementTextField.text = s; + + // Measure it. + var lineMetrics:TextLineMetrics = + measurementTextField.getLineMetrics(0); + + // Account for any indenting of the text. + if (indent != null) + lineMetrics.width += indent; + + if (roundUp) + { + // Round up because embedded fonts can produce fractional values; + // if a parent container rounds a component's actual width or height + // down, the component may not be wide enough to display the text. + lineMetrics.width = Math.ceil(lineMetrics.width); + lineMetrics.height = Math.ceil(lineMetrics.height); + } + + return lineMetrics; + } + + /** + * @private + */ + mx_internal function copyFrom(source:TextFormat):void + { + font = source.font; + size = source.size; + color = source.color; + bold = source.bold; + italic = source.italic; + underline = source.underline; + url = source.url; + target = source.target; + align = source.align; + leftMargin = source.leftMargin; + rightMargin = source.rightMargin; + indent = source.indent; + leading = source.leading; + letterSpacing = source.letterSpacing; + blockIndent = source.blockIndent; + bullet = source.bullet; + COMPILE::LATER + { + display = source.display; + } + indent = source.indent; + kerning = source.kerning; + tabStops = source.tabStops; + } +} + +}
http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/77148f4a/frameworks/projects/MX/src/main/flex/mx/effects/EffectManager.as ---------------------------------------------------------------------- diff --cc frameworks/projects/MX/src/main/flex/mx/effects/EffectManager.as index e322d82,0000000..2c9e421 mode 100644,000000..100644 --- a/frameworks/projects/MX/src/main/flex/mx/effects/EffectManager.as +++ b/frameworks/projects/MX/src/main/flex/mx/effects/EffectManager.as @@@ -1,1004 -1,0 +1,1004 @@@ +//////////////////////////////////////////////////////////////////////////////// +// +// 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 mx.effects +{ + - COMPILE::AS3 ++COMPILE::SWF +{ + import flash.display.DisplayObject; + import flash.display.DisplayObjectContainer; +} +COMPILE::JS +{ + import flex.display.DisplayObject; + import flex.display.DisplayObjectContainer; +} +import org.apache.flex.core.UIBase; +import org.apache.flex.events.Event; +import org.apache.flex.events.EventDispatcher; +import mx.events.FocusEvent; +COMPILE::LATER +{ + import flex.system.DefinitionManager; + import flash.utils.Dictionary; + import mx.core.EventPriority; + import mx.core.UIComponentCachePolicy; +} + +import mx.core.FlexGlobals; +import mx.core.IDeferredInstantiationUIComponent; +import mx.core.IFlexDisplayObject; +import mx.core.IUIComponent; +import mx.core.UIComponent; +import mx.core.UIComponentGlobals; +import mx.core.mx_internal; +import mx.events.EffectEvent; +import mx.events.FlexEvent; +import mx.events.MoveEvent; +import mx.events.ResizeEvent; +import mx.resources.IResourceManager; +import mx.resources.ResourceManager; +import mx.core.IVisualElementContainer; +import org.apache.flex.core.IVisualElement; + +use namespace mx_internal; + +[ResourceBundle("effects")] + +/** + * The EffectManager class listens for events, such as the <code>show</code> + * and <code>move</code> events, dispatched by objects in a Flex application. + * For each event, corresponding to an event trigger, it determines if + * there is an effect assigned to the object. + * If an effect is defined, it plays the effect. + * + * @langversion 3.0 + * @playerversion Flash 9 + * @playerversion AIR 1.1 + * @productversion Flex 3 + * @flexjsignoreimport mx.core.UIComponent + */ +public class EffectManager extends EventDispatcher +{ + include "../core/Version.as"; + + //-------------------------------------------------------------------------- + // + // Class variables + // + //-------------------------------------------------------------------------- + + /** + * @private + * Keeps track of all the triggered effects that are currently playing. + */ + mx_internal static var effectsPlaying:Array /* of EffectNode */ = []; + + /** + * @private + * Map with event type as key and effectTrigger as value. + */ + private static var effectTriggersForEvent:Object = {}; + + /** + * @private + * Map with effectTrigger as key and event type as value. + */ + private static var eventsForEffectTriggers:Object = {}; + + /** + * @private + * Array containing miscellaneous info about effect targets. + * An element in the array is an Object with three fields: + * target - reference to the target + * bitmapEffectsCount - number of bitmap effects + * currently playing on the target + * vectorEffectsCount - number of vector effects + * currently playing on the target + */ + private static var targetsInfo:Array /* of Object */ = []; + + /** + * @private + * Remember when suspendEventHandling() has been called + * without a matching resumeEventHandling(). + */ + private static var eventHandlingSuspendCount:Number = 0; + + /** + * @private + * Weak backing storage for the lastEffectCreated instance. + */ + COMPILE::LATER + private static var weakKeys:Dictionary; + + /** + * @private + * This internal property is currently only used by the ViewStack + * component in order to coordinate the hideEffect completion with + * ViewStack change logic. It would be best to find a better way + * to do this (localized to ViewStack) in the future however. + */ + COMPILE::LATER + mx_internal static function set lastEffectCreated(effect:IEffect):void + { + // We just regenerate our dictionary instead of finding and deleting + // the previous key. Faster. + weakKeys = new Dictionary(true); + weakKeys[effect] = true; + } + + /** + * @private + */ + COMPILE::LATER + mx_internal static function get lastEffectCreated():IEffect + { + for (var item:* in weakKeys) + return item; + + return null; + } + + /** + * @private + * Storage for the resourceManager getter. + * This gets initialized on first access, + * not at static initialization time, in order to ensure + * that the Singleton registry has already been initialized. + */ + private static var _resourceManager:IResourceManager; + + /** + * @private + * A reference to the object which manages + * all of the application's localized resources. + * This is a singleton instance which implements + * the IResourceManager interface. + */ + private static function get resourceManager():IResourceManager + { + if (!_resourceManager) + _resourceManager = ResourceManager.getInstance(); + + return _resourceManager; + } + + //-------------------------------------------------------------------------- + // + // Class methods + // + //-------------------------------------------------------------------------- + + /** + * After this method is called, the EffectManager class ignores + * all events, and no effects are triggered, until a call to + * <code>resumeEventHandling()</code>. + * Used internally so that an effect that is updating the screen + * does not cause another effect to be triggered. + * + * @langversion 3.0 + * @playerversion Flash 9 + * @playerversion AIR 1.1 + * @productversion Flex 3 + */ + public static function suspendEventHandling():void + { + eventHandlingSuspendCount++; + } + + /** + * Allows the EffectManager class to resume processing events + * after a call to the <code>suspendEventHandling()</code> method. + * Used internally in conjunction with the + * <code>suspendEventHandling()</code> method + * so that an effect that is updating the screen + * does not cause another effect to be triggered. + * + * @langversion 3.0 + * @playerversion Flash 9 + * @playerversion AIR 1.1 + * @productversion Flex 3 + */ + public static function resumeEventHandling():void + { + eventHandlingSuspendCount--; + } + + /** + * Immediately ends any effects currently playing on a target. + * + * @param target The target component on which to end all effects. + * + * @langversion 3.0 + * @playerversion Flash 9 + * @playerversion AIR 1.1 + * @productversion Flex 3 + */ + public static function endEffectsForTarget(target:IUIComponent):void + { + // Iterate through the array backward, because calling end() + // may cause the element to be removed from the array. + var n:int = effectsPlaying.length; + for (var i:int = n - 1; i >= 0; i--) + { + var otherInst:IEffectInstance = + effectsPlaying[i].instance; + if (otherInst.target == target) + otherInst.end(); + } + } + + /** + * @private + */ + COMPILE::LATER + mx_internal static function setStyle(styleProp:String, target:*):void + { + // Anytime that any UIComponent's style is changed, + // check to see if the styleProp that's changing + // is an effect trigger (e.g., showEffect). + + var eventName:String = eventsForEffectTriggers[styleProp]; + if (eventName != null && eventName != "") + { + target.addEventListener(eventName, + EffectManager.eventHandler, + false, EventPriority.EFFECT); + } + } + + /** + * @private + * Internal function used to instantiate an effect + */ + mx_internal static function createEffectForType(target:Object, + type:String):IEffect + { + var trigger:String = effectTriggersForEvent[type]; + + if (trigger == "") + trigger = type + "Effect"; // For backwards compatibility + + var value:Object = target.getStyle(trigger); + + if (!value) + return null; + + if (value is Class) + { + var cls:Class = Class(value); + return new cls(target); + } + + // If we don't find the ID on the parent document, then just move on. + try + { + var effectObj:IEffect; + if (value is String) + { + var doc:Object = target.parentDocument; + // The main Application doesn't have a parentDocument. + if (!doc) + doc = FlexGlobals.topLevelApplication; + effectObj = doc[value]; + } + else if (value is IEffect) + { + effectObj = IEffect(value); + } + + if (effectObj) + { + effectObj.target = target; + return effectObj; + } + } + catch(e:Error) + { + } + + var effectClass:Class; + if (target is IUIComponent && target.moduleFactory) + { + COMPILE::LATER + { + // only UIComponents have moduleFactories + var appDomain:DefinitionManager = new DefinitionManager( + target.moduleFactory.info()["currentDomain"]); + if (appDomain.hasDefinition("mx.effects." + value)) + effectClass = Class(appDomain.getDefinition("mx.effects." + value)); + } + } + if (!effectClass) + effectClass = Class(target.systemManager.getDefinitionByName( + "mx.effects." + value)); + + if (effectClass) + return new effectClass(target); + + return null; + } + + /** + * @private + * Internal function used while playing effects + */ + private static function animateSameProperty(a:IEffect, b:IEffect, + c:IEffectInstance):Boolean + { + // This function returns true if "a" and "b" animate + // the same property of the same object. + + if (a.target == c.target) + { + var aProps:Array = a.getAffectedProperties(); + var bProps:Array = b.getAffectedProperties(); + + var n:int = aProps.length; + var m:int = bProps.length; + + for (var i:int = 0; i < n; i++) + { + for (var j:int = 0; j < m; j++) + { + if (aProps[i] == bProps[j]) + return true; + } + } + } + + return false; + } + + /** + * @private + * Should be called by an effect instance before it starts playing, + * to suggest bitmap caching on the target. + * E.g. Fade calls this function in its play(). + */ + mx_internal static function startBitmapEffect(target:IUIComponent):void + { + cacheOrUncacheTargetAsBitmap(target, true, true); + } + + /** + * @private + * Should be called by an effect instance after it has finished playing, + * to suggest that the cached bitmap for the target can be freed. + * E.g. Fade calls this function in its onTweenEnd(). + */ + mx_internal static function endBitmapEffect(target:IUIComponent):void + { + cacheOrUncacheTargetAsBitmap(target, false, true); + } + + /** + * @private + * Should be called by an effect instance before it starts playing, to + * suggest that bitmap caching should be turned off on the target. + * E.g. Resize calls this function in its play(). + */ + mx_internal static function startVectorEffect(target:IUIComponent):void + { + cacheOrUncacheTargetAsBitmap(target, true, false); + } + + /** + * @private + * Should be called by an effect instance after it has finished playing, + * to suggest that bitmap caching may be turned back on on the target. + * E.g. Resize calls this function in its onTweenEnd(). + */ + mx_internal static function endVectorEffect(target:IUIComponent):void + { + cacheOrUncacheTargetAsBitmap(target, false, false); + } + + /** + * @private + * Cache or uncache the target as a bitmap depending on which effects are + * currently playing on the target. + * + * @param target The effect target. + * + * @param effectStart Whether this is the starting of the effect. + * false means it's the ending of the effect. + * + * @param bitmapEffect Whether this is a bitmap effect. + * false means it's a vector effect (like resize, zoom, etc.) + * that wants the target object to be uncached. + */ + private static function cacheOrUncacheTargetAsBitmap( + target:IUIComponent, + effectStart:Boolean = true, + bitmapEffect:Boolean = true):void + { + var n:int; + var i:int; + + // Object containing information about the target. + var info:Object = null; + + n = targetsInfo.length; + for (i = 0; i < n; i++) + { + if (targetsInfo[i].target == target) + { + info = targetsInfo[i]; + break; + } + } + + // If no info object is available, create an object and push it + // into the array. + if (!info) + { + info = + { + target: target, + bitmapEffectsCount: 0, + vectorEffectsCount: 0 + }; + + targetsInfo.push(info); + } + + if (effectStart) + { + if (bitmapEffect) + { + info.bitmapEffectsCount++; + + // If no vector effects are currently playing, + // cache the target. + if (info.vectorEffectsCount == 0 && + target is IDeferredInstantiationUIComponent) + { + COMPILE::LATER + { + IDeferredInstantiationUIComponent(target).cacheHeuristic = true; + } + } + } + else + { + COMPILE::LATER + { + // If a vector effect started playing, forcibly uncache + // the target regardless of anything else. + if (info.vectorEffectsCount++ == 0 && + target is IDeferredInstantiationUIComponent && + IDeferredInstantiationUIComponent(target).cachePolicy == UIComponentCachePolicy.AUTO) + { + target.cacheAsBitmap = false; + } + } + // If a vector effect started playing, forcibly uncache + // the target regardless of anything else. + if (info.vectorEffectsCount++ == 0 && + target is IDeferredInstantiationUIComponent) + { + COMPILE::LATER + { + target.cacheAsBitmap = false; + } + } + } + } + else // effect end + { + if (bitmapEffect) + { + if (info.bitmapEffectsCount != 0) + info.bitmapEffectsCount--; + + COMPILE::LATER + { + if (target is IDeferredInstantiationUIComponent) + IDeferredInstantiationUIComponent(target).cacheHeuristic = false; + } + } + else + { + if (info.vectorEffectsCount != 0) + { + // If no more vector effects are playing but bitmap + // effects are still playing, cache the target. + if (--info.vectorEffectsCount == 0 && + info.bitmapEffectsCount != 0) + { + // Crank up the counter. + n = info.bitmapEffectsCount; + COMPILE::LATER + { + for (i = 0; i < n; i++) + { + if (target is IDeferredInstantiationUIComponent) + IDeferredInstantiationUIComponent(target).cacheHeuristic = true; + } + } + } + } + } + + if (info.bitmapEffectsCount == 0 && info.vectorEffectsCount == 0) + { + // No more effects are playing on this target, so discard the + // info object (should speed up lookups). + n = targetsInfo.length; + for (i = 0; i < n; i++) + { + if (targetsInfo[i].target == target) + { + targetsInfo.splice(i, 1); + break; + } + } + } + } + } + + /** + * @private + * Called in code generated by MXML compiler. + */ + mx_internal static function registerEffectTrigger(name:String, + event:String):void + { + if (name != "") + { + if (event == "") + { + // For backwards compatibility. + var strLen:Number = name.length; + if (strLen > 6 && name.substring(strLen - 6) == "Effect") + event = name.substring(0, strLen - 6); + } + + if (event != "") + { + effectTriggersForEvent[event] = name; + eventsForEffectTriggers[name] = event; + } + } + } + + /** + * @private + */ + mx_internal static function getEventForEffectTrigger(effectTrigger:String):String + { + if (eventsForEffectTriggers) + { + try + { + return eventsForEffectTriggers[effectTrigger]; + } + catch(e:Error) {} + } + + return ""; + } + + //-------------------------------------------------------------------------- + // + // Class event handlers + // + //-------------------------------------------------------------------------- + + /** + * @private + * @flexjsignorecoercion mx.core.UIComponent + */ + mx_internal static function eventHandler(eventObj:Event):void + { + // If this event fired because an effect is currently playing + // (in other words, if an effect was the source of this event), + // then don't listen to the effect. + if (!(eventObj.currentTarget is IFlexDisplayObject)) + return; + + if (eventHandlingSuspendCount > 0) + return; + + if (eventObj is FocusEvent && + (eventObj.type == FocusEvent.FOCUS_OUT || + eventObj.type == FocusEvent.FOCUS_IN)) + { + var focusEventObj:FocusEvent = FocusEvent(eventObj); + if (focusEventObj.relatedObject && + (focusEventObj.currentTarget.contains(focusEventObj.relatedObject) || + focusEventObj.currentTarget == focusEventObj.relatedObject)) + { + return; + } + } + + // Only trigger the event for added and removed if the current target is the same as the target. + if ((eventObj.type == UIBase.CHILD_ADDED || eventObj.type == UIBase.CHILD_REMOVED) && eventObj.target != eventObj.currentTarget) + return; + + if (eventObj.type == UIBase.CHILD_REMOVED) + { + var uic:UIComponent = eventObj.target as UIComponent; + if (uic) + { + if (uic.initialized == false) + { + return; + } + else if (uic.isEffectStarted) + { + for (var i:int = 0; i < uic._effectsStarted.length; i++) + { + // Don't allow removedEffect to trigger more than one effect at a time + if (uic._effectsStarted[i].triggerEvent.type == UIBase.CHILD_REMOVED) + return; + } + } + } + + var targ:DisplayObject = eventObj.target as DisplayObject; + + if (targ != null) + { + var parent:DisplayObjectContainer = targ.parent as DisplayObjectContainer; + + if (parent != null) + { + var index:int = parent.getChildIndex(targ); + if (index >= 0) + { + if (uic) + { + // Since we get the "removed" event before the child is actually removed, + // we need to delay adding back the child. We must exit the current + // script block must exit before the child can be removed. + uic.callLater(removedEffectHandler, [targ, parent, index, eventObj]); + } + } + } + } + } + else + { + createAndPlayEffect(eventObj, eventObj.currentTarget); + } + } + + /** + * @private + * @flexjsignorecoercion mx.core.UIComponent + */ + private static function createAndPlayEffect(eventObj:Event, target:Object):void + { + + var effectInst:IEffect = createEffectForType(target, eventObj.type); + if (!effectInst) + return; + + COMPILE::LATER + { + if (effectInst is Zoom && eventObj.type == MoveEvent.MOVE) + { + var message:String = resourceManager.getString( + "effects", "incorrectTrigger"); + throw new Error(message); + } + } + + // If this is a "move" or "resize" event that was caused by + // the layout manager doing an initial layout, then don't + // play any effects. + // Ditto for "show" or "hide" effects triggered by ViewStack.doLayout. + if (target.initialized == false) + { + var type:String = eventObj.type; + if (type == MoveEvent.MOVE || + type == ResizeEvent.RESIZE || + type == FlexEvent.SHOW || + type == FlexEvent.HIDE || + type == Event.CHANGE) + { + effectInst = null; + return; + } + } + + var n:int; + var i:int; + var m:int; + var j:int; + + // Some components contain built-in tweens, which are not managed by + // the EffectManager. If one of those tweens is currently playing, + // and if it's animating a conflicting property, then don't play this + // tween. + if (effectInst.target is IUIComponent) + { + var tweeningProperties:Array = + IUIComponent(effectInst.target).tweeningProperties; + if (tweeningProperties && tweeningProperties.length > 0) + { + var effectProperties:Array = effectInst.getAffectedProperties(); + + n = tweeningProperties.length; + m = effectProperties.length; + + for (i = 0; i < n; i++) + { + for (j = 0; j < m; j++) + { + if (tweeningProperties[i] == effectProperties[j]) + { + effectInst = null; + return; + } + } + } + } + } + + // At any given time, only one effect may be animating a given + // property of a given target object. If some other effect was + // previously animating the same properties of my target object, + // then finish the other effect before starting this new one. + // + var uic:UIComponent = effectInst.target as UIComponent; + if (uic && + uic.isEffectStarted) + { + var affectedProps:Array = effectInst.getAffectedProperties(); + for (i = 0; i < affectedProps.length; i++) + { + var runningInstances:Array = + effectInst.target.getEffectsForProperty(affectedProps[i]); + if (runningInstances.length > 0) + { + if (eventObj.type == ResizeEvent.RESIZE) + return; + + for (j = 0; j < runningInstances.length; j++) + { + var otherInst:IEffectInstance = runningInstances[j]; + if (eventObj.type == FlexEvent.SHOW && otherInst.hideOnEffectEnd) + { + otherInst.target.removeEventListener( + FlexEvent.SHOW, otherInst.eventHandler); + otherInst.hideOnEffectEnd = false; + + } + + /* + if (eventObj.type == MoveEvent.MOVE && + ((affectedProps[i] == "width") || + (affectedProps[i] == "height") || + (affectedProps[i] == "x") || + (affectedProps[i] == "y")) && + effectInst.target.getStyle("moveEffect") != undefined) + { + trace("EM Got Move and ignoring"); + return; + } + + if (eventObj.type == ResizeEvent.RESIZE && + ((affectedProps[i] == "width") || + (affectedProps[i] == "height")) && + effectInst.target.getStyle("resizeEffect") != undefined) + { + return; + } + */ + + otherInst.end(); + } + } + } + } + + // Pass in event data for effect initialization + effectInst.triggerEvent = eventObj; + + // Tell the effectInst that I'm the listener, so that my "onEffectEnd" + // method is called when the effect finishes playing. The + // onEffectEnd handler will remove this effect from the effectsPlaying + // array. + effectInst.addEventListener(EffectEvent.EFFECT_END, + EffectManager.effectEndHandler); + + COMPILE::LATER + { + lastEffectCreated = effectInst; + } + + var instances:Array = effectInst.play(); + n = instances.length; + for (i = 0; i < n; i++) + { + effectsPlaying.push( + new EffectNode(effectInst, instances[i])); + } + + // Block all layout, responses from web services, and other background + // processing until the effect finishes executing. + if (effectInst.suspendBackgroundProcessing) + UIComponentGlobals.suspendBackgroundProcessing(); + } + + /** + * @private + * Delayed function call when effect is triggered by "removed" event + */ + private static function removedEffectHandler(target:DisplayObject, parent:DisplayObjectContainer, index:int, eventObj:Event):void + { + suspendEventHandling(); + // Add the child back to the parent so the effect can play upon it + if (parent is IVisualElementContainer && target is IVisualElement) + (IVisualElementContainer(parent).addElementAt(target as IVisualElement, index)); + else + parent.addChildAt(target, index); + resumeEventHandling(); + // Use target because the player assigns the Stage to the currentTarget when we leave the scope of the event handler function + createAndPlayEffect(eventObj, target); + } + + /** + * @private + * Internal function used while playing effects + */ + mx_internal static function effectEndHandler(event:EffectEvent):void + { + var effectInst:IEffectInstance = event.effectInstance; + // This function is called when an effect, which was started + // earlier by this effect manager, finishes playing. Remove + // this effect from the "effectPlaying" list + var n:int = effectsPlaying.length; + for (var i:int = n - 1; i >= 0; i--) + { + if (effectsPlaying[i].instance == effectInst) + { + effectsPlaying.splice(i, 1); + break; + } + } + + // If the event that caused this effect was "hide", then the + // eventHandler() method set the object's visiblity to true. + // Now that the effect is finished playing, set visiblity to false. + if (Object(effectInst).hideOnEffectEnd == true) + { + effectInst.target.removeEventListener( + FlexEvent.SHOW, Object(effectInst).eventHandler); + effectInst.target.setVisible(false, true); + } + + if (effectInst.triggerEvent && effectInst.triggerEvent.type == UIBase.CHILD_REMOVED) + { + var targ:DisplayObject = effectInst.target as DisplayObject; + + if (targ != null) + { + var parent:DisplayObjectContainer = targ.parent as DisplayObjectContainer; + + if (parent != null) + { + // Since we added the child back to the parent when the effect began, + // we need to remove it once the effect has finished. + suspendEventHandling(); + if (parent is IVisualElementContainer && targ is IVisualElement) + (IVisualElementContainer(parent).removeElement(targ as IVisualElement)); + else + parent.removeChild(targ); + resumeEventHandling(); + } + } + } + + // Resume the background processing that was suspended earlier + if (effectInst.suspendBackgroundProcessing) + UIComponentGlobals.resumeBackgroundProcessing(); + } + + //-------------------------------------------------------------------------- + // + // Diagnostics + // + //-------------------------------------------------------------------------- + COMPILE::LATER + private static var effects:Dictionary = new Dictionary(true); + + COMPILE::LATER + mx_internal static function effectStarted(effect:IEffectInstance):void + { + effects[effect] = 1; + } + + COMPILE::LATER + mx_internal static function effectFinished(effect:IEffectInstance):void + { + delete effects[effect]; + } + + COMPILE::LATER + mx_internal static function effectsInEffect():Boolean + { + for (var i:* in effects) + { + return true; + } + return false; + } +} + +} + +//////////////////////////////////////////////////////////////////////////////// +// +// Helper class: EffectNode +// +//////////////////////////////////////////////////////////////////////////////// + +import mx.effects.IEffect; +import mx.effects.IEffectInstance; + +/** + * @private + */ +class EffectNode +{ + //-------------------------------------------------------------------------- + // + // Constructor + // + //-------------------------------------------------------------------------- + + /** + * Constructor. + * + * @langversion 3.0 + * @playerversion Flash 9 + * @playerversion AIR 1.1 + * @productversion Flex 3 + */ + public function EffectNode(factory:IEffect, instance:IEffectInstance) + { + super(); + + this.factory = factory; + this.instance = instance; + } + + //-------------------------------------------------------------------------- + // + // Properties + // + //-------------------------------------------------------------------------- + + /** + * @private + */ + public var factory:IEffect; + + /** + * @private + */ + public var instance:IEffectInstance; +} http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/77148f4a/frameworks/projects/MX/src/main/flex/mx/effects/IAbstractEffect.as ---------------------------------------------------------------------- diff --cc frameworks/projects/MX/src/main/flex/mx/effects/IAbstractEffect.as index 4bae636,0000000..e2d1ad7 mode 100644,000000..100644 --- a/frameworks/projects/MX/src/main/flex/mx/effects/IAbstractEffect.as +++ b/frameworks/projects/MX/src/main/flex/mx/effects/IAbstractEffect.as @@@ -1,52 -1,0 +1,52 @@@ +//////////////////////////////////////////////////////////////////////////////// +// +// 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 mx.effects +{ + - COMPILE::AS3 ++COMPILE::SWF +{ + import flash.events.IEventDispatcher; +} +COMPILE::JS +{ + import org.apache.flex.events.IEventDispatcher; +} + +/** + * The IAbstractEffect interface is used to denote + * that a property or parameter must be of type Effect, + * but does not actually implement any of the APIs of the + * IEffect interface. + * The UIComponent class recognizes when property that + * implements the AbstractEffect interface changes, and passes it to + * the EffectManager class for processing. + * + * @see mx.effects.IEffect + * + * @langversion 3.0 + * @playerversion Flash 9 + * @playerversion AIR 1.1 + * @productversion Flex 3 + */ +public interface IAbstractEffect extends IEventDispatcher +{ +} + - } ++} http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/77148f4a/frameworks/projects/MX/src/main/flex/mx/effects/IEffectTargetHost.as ---------------------------------------------------------------------- diff --cc frameworks/projects/MX/src/main/flex/mx/effects/IEffectTargetHost.as index 754bc1d,0000000..ed55ddc mode 100644,000000..100644 --- a/frameworks/projects/MX/src/main/flex/mx/effects/IEffectTargetHost.as +++ b/frameworks/projects/MX/src/main/flex/mx/effects/IEffectTargetHost.as @@@ -1,123 -1,0 +1,123 @@@ +//////////////////////////////////////////////////////////////////////////////// +// +// 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 mx.effects +{ + +/** + * The IEffectTargetHost interface defines the interface that lets you access the + * target list-based control of a data effect. + * All list-based controls implement this interface. + * This interface enables an instance of an effect class to communicate with the + * list-based control on which the effect is playing. + * This interface is also used for determining whether to play an effect based on if a data item is + * added, removed, or replaced in the target control. + * + * @see mx.controls.listClasses.ListBase + * + * @langversion 3.0 + * @playerversion Flash 9 + * @playerversion AIR 1.1 + * @productversion Flex 3 + */ +public interface IEffectTargetHost +{ + + /** + * Called by an <code>UnconstrainItemAction</code> effect + * as part of a data change effect if the item renderers corresponding + * to certain data items need to move outside the normal positions + * of item renderers in the control. + * The control does not attempt to position the item render for the + * duration of the effect. + * + * @param item The item renderer that is a target of the effect. + * + * @langversion 3.0 + * @playerversion Flash 9 + * @playerversion AIR 1.1 + * @productversion Flex 3 + */ + function unconstrainRenderer(item:Object):void; + + /** + * Removes an item renderer if a data change effect is running. + * The item renderer must correspond to data that has already + * been removed from the data provider collection. + * + * This function will be called by a <code>RemoveItemAction</code> + * effect as part of a data change effect to specify the point + * at which a data item ceases to displayed by the control using + * an item renderer. + * + * @param item The item renderer to remove from the control's layout. + * + * @langversion 3.0 + * @playerversion Flash 9 + * @playerversion AIR 1.1 + * @productversion Flex 3 + */ + function removeDataEffectItem(target:Object):void; + + /** + * Adds an item renderer if a data change effect is running. + * The item renderer should correspond to a recently added + * data item in the data provider's collection that isn't + * yet being displayed. + * + * <p>This function will be called by an <code>AddItemAction</code> + * effect as part of a data change effect to specify the point + * at which a data item added to a collection begins to be displayed + * by the control using an item renderer.</p> + * + * @param item The item renderer to add to the control's layout. + * + * @langversion 3.0 + * @playerversion Flash 9 + * @playerversion AIR 1.1 + * @productversion Flex 3 + */ + function addDataEffectItem(target:Object):void; + + /** + * Returns <code>true</code> or <code>false</code> + * to indicates whether the effect should play on the target. + * The EffectTargetFilter class calls this method when you set + * the <code>filter</code> property on a data effect. + * For example, you set <code>filter</code> property + * to <code>addItem</code> or <code>removeItem</code>. + * + * @param target An item renderer + * + * @param semanticProperty The semantic property of the renderer + * whose value will be returned. + * + * @return <code>true</code> or <code>false</code> + * to indicates whether the effect should play on the target. + * + * @langversion 3.0 + * @playerversion Flash 9 + * @playerversion AIR 1.1 + * @productversion Flex 3 + */ + function getRendererSemanticValue(target:Object,semanticProperty:String):Object; + +} + - } ++} http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/77148f4a/frameworks/projects/MX/src/main/flex/mx/events/ChildExistenceChangedEvent.as ---------------------------------------------------------------------- diff --cc frameworks/projects/MX/src/main/flex/mx/events/ChildExistenceChangedEvent.as index 488cab4,0000000..3517408 mode 100644,000000..100644 --- a/frameworks/projects/MX/src/main/flex/mx/events/ChildExistenceChangedEvent.as +++ b/frameworks/projects/MX/src/main/flex/mx/events/ChildExistenceChangedEvent.as @@@ -1,213 -1,0 +1,213 @@@ +//////////////////////////////////////////////////////////////////////////////// +// +// 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 mx.events +{ + - COMPILE::AS3 ++COMPILE::SWF +{ + import flash.display.DisplayObject; +} +COMPILE::JS +{ + import flex.display.DisplayObject; +} +import org.apache.flex.events.Event; + +/** + * Represents events that are dispatched when a the child of a control + * is created or destroyed. + * + * @langversion 3.0 + * @playerversion Flash 9 + * @playerversion AIR 1.1 + * @productversion Flex 3 + */ +public class ChildExistenceChangedEvent extends Event +{ + include "../core/Version.as"; + + //-------------------------------------------------------------------------- + // + // Class constants + // + //-------------------------------------------------------------------------- + + /** + * The <code>ChildExistenceChangedEvent.CHILD_ADD</code> constant + * defines the value of the <code>type</code> property of the event + * object for a <code>childAdd</code> event. + * + * <p>The properties of the event object have the following values:</p> + * <table class="innertable"> + * <tr><th>Property</th><th>Value</th></tr> + * <tr><td><code>bubbles</code></td><td>false</td></tr> + * <tr><td><code>cancelable</code></td><td>false</td></tr> + * <tr><td><code>currentTarget</code></td><td>The Object that defines the + * event listener that handles the event. For example, if you use + * <code>myButton.addEventListener()</code> to register an event listener, + * myButton is the value of the <code>currentTarget</code>. </td></tr> + * <tr><td><code>relatedObject</code></td><td>Contains a reference + * to the child object that was created.</td></tr> + * <tr><td><code>target</code></td><td>The Object that dispatched the event; + * it is not always the Object listening for the event. + * Use the <code>currentTarget</code> property to always access the + * Object listening for the event.</td></tr> + * </table> + * + * @eventType childAdd + * + * @langversion 3.0 + * @playerversion Flash 9 + * @playerversion AIR 1.1 + * @productversion Flex 3 + */ + public static const CHILD_ADD:String = "childAdd"; + + /** + * The <code>ChildExistenceChangedEvent.CHILD_REMOVE</code> constant + * defines the value of the <code>type</code> property of the event + * object for a <code>childRemove</code> event. + * + * <p>The properties of the event object have the following values:</p> + * <table class="innertable"> + * <tr><th>Property</th><th>Value</th></tr> + * <tr><td><code>bubbles</code></td><td>false</td></tr> + * <tr><td><code>cancelable</code></td><td>false</td></tr> + * <tr><td><code>currentTarget</code></td><td>The Object that defines the + * event listener that handles the event. For example, if you use + * <code>myButton.addEventListener()</code> to register an event listener, + * myButton is the value of the <code>currentTarget</code>. </td></tr> + * <tr><td><code>relatedObject</code></td><td>Contains a reference + * to the child object that is about to be removed.</td></tr> + * <tr><td><code>target</code></td><td>The Object that dispatched the event; + * it is not always the Object listening for the event. + * Use the <code>currentTarget</code> property to always access the + * Object listening for the event.</td></tr> + * </table> + * + * @eventType childRemove + * + * @langversion 3.0 + * @playerversion Flash 9 + * @playerversion AIR 1.1 + * @productversion Flex 3 + */ + public static const CHILD_REMOVE:String = "childRemove"; + + /** + * The <code>ChildExistenceChangedEvent.OVERLAY_CREATED</code> constant + * defines the value of the <code>type</code> property of the event object + * for a <code>overlayCreated</code> event. + * + * <p>The properties of the event object have the following values:</p> + * <table class="innertable"> + * <tr><th>Property</th><th>Value</th></tr> + * <tr><td><code>bubbles</code></td><td>false</td></tr> + * <tr><td><code>cancelable</code></td><td>false</td></tr> + * <tr><td><code>currentTarget</code></td><td>The Object that defines the + * event listener that handles the event. For example, if you use + * <code>myButton.addEventListener()</code> to register an event listener, + * myButton is the value of the <code>currentTarget</code>. </td></tr> + * <tr><td><code>relatedObject</code></td><td>Contains a reference + * to the child object whose overlay was created.</td></tr> + * <tr><td><code>target</code></td><td>The Object that dispatched the event; + * it is not always the Object listening for the event. + * Use the <code>currentTarget</code> property to always access the + * Object listening for the event.</td></tr> + * </table> + * + * @eventType overlayCreated + * + * @langversion 3.0 + * @playerversion Flash 9 + * @playerversion AIR 1.1 + * @productversion Flex 3 + */ + public static const OVERLAY_CREATED:String = "overlayCreated"; + + //-------------------------------------------------------------------------- + // + // Constructor + // + //-------------------------------------------------------------------------- + + /** + * Constructor. + * + * @param type The event type; indicates the action that caused the event. + * + * @param bubbles Specifies whether the event can bubble up the display list hierarchy. + * + * @param cancelable Specifies whether the behavior associated with the event can be prevented. + * + * @param relatedObject Reference to the child object that was created or destroyed. + * + * @langversion 3.0 + * @playerversion Flash 9 + * @playerversion AIR 1.1 + * @productversion Flex 3 + */ + public function ChildExistenceChangedEvent( + type:String, bubbles:Boolean = false, + cancelable:Boolean = false, + relatedObject:DisplayObject = null) + { + super(type, bubbles, cancelable); + + this.relatedObject = relatedObject; + } + + //-------------------------------------------------------------------------- + // + // Properties + // + //-------------------------------------------------------------------------- + + //---------------------------------- + // relatedObject + //---------------------------------- + + /** + * Reference to the child object that was created or destroyed. + * + * @langversion 3.0 + * @playerversion Flash 9 + * @playerversion AIR 1.1 + * @productversion Flex 3 + */ + public var relatedObject:DisplayObject; + + //-------------------------------------------------------------------------- + // + // Overridden methods: Event + // + //-------------------------------------------------------------------------- + + /** + * @private + */ + override public function cloneEvent():Event + { + return new ChildExistenceChangedEvent(type, bubbles, cancelable, + relatedObject); + } +} + +} http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/77148f4a/frameworks/projects/MX/src/main/flex/mx/events/FlexChangeEvent.as ---------------------------------------------------------------------- diff --cc frameworks/projects/MX/src/main/flex/mx/events/FlexChangeEvent.as index ba77342,0000000..1efed46 mode 100644,000000..100644 --- a/frameworks/projects/MX/src/main/flex/mx/events/FlexChangeEvent.as +++ b/frameworks/projects/MX/src/main/flex/mx/events/FlexChangeEvent.as @@@ -1,187 -1,0 +1,187 @@@ +//////////////////////////////////////////////////////////////////////////////// +// +// 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 mx.events +{ +import org.apache.flex.events.Event; + +[ExcludeClass] + +/** + * @private + * The FlexChangeEvent class represents the event object passed to + * an event listener for Flex events that have data associated with + * some change in Flex. The <code>data</code> property provides + * additional information about the event. + * + */ +public class FlexChangeEvent extends Event +{ + include "../core/Version.as"; + + //-------------------------------------------------------------------------- + // + // Class constants + // + //-------------------------------------------------------------------------- + + /** + * The <code>FlexChangeEvent.ADD_CHILD_BRIDGE</code> constant defines the value of the + * <code>type</code> property of the event object for an <code>addChildBridge</code> event. + * + * This event is dispatch by a SystemManager after a child SWFBridge has been added. This + * event's <code>data</code> property is a reference to the added SWFBridge. + * + * added to the SystemManager. + * + * <p>The properties of the event object have the following values:</p> + * <table class="innertable"> + * <tr><th>Property</th><th>Value</th></tr> + * <tr><td><code>bubbles</code></td><td>false</td></tr> + * <tr><td><code>cancelable</code></td><td>false</td></tr> + * <tr><td><code>currentTarget</code></td><td>The Object that defines the + * event listener that handles the event. For example, if you use + * <code>myButton.addEventListener()</code> to register an event listener, + * myButton is the value of the <code>currentTarget</code>. </td></tr> + * <tr><td><code>target</code></td><td>The Object that dispatched the event; + * it is not always the Object listening for the event. + * Use the <code>currentTarget</code> property to always access the + * Object listening for the event.</td></tr> + * </table> + * + * @eventType addChildBridge + * + * @langversion 3.0 + * @playerversion Flash 9 + * @playerversion AIR 1.1 + * @productversion Flex 3 + */ + public static const ADD_CHILD_BRIDGE:String = "addChildBridge"; + + /** + * The <code>FlexChangeEvent.REMOVE_CHILD_BRIDGE</code> constant defines the value of the + * <code>type</code> property of the event object for an <code>removeChildBridge</code> event. + * + * This event is dispatch by a SystemManager just before a child SWFBridge is removed. This + * event's <code>data</code> property is a reference to the removed SWFBridge. + * + * <p>The properties of the event object have the following values:</p> + * <table class="innertable"> + * <tr><th>Property</th><th>Value</th></tr> + * <tr><td><code>bubbles</code></td><td>false</td></tr> + * <tr><td><code>cancelable</code></td><td>false</td></tr> + * <tr><td><code>currentTarget</code></td><td>The Object that defines the + * event listener that handles the event. For example, if you use + * <code>myButton.addEventListener()</code> to register an event listener, + * myButton is the value of the <code>currentTarget</code>. </td></tr> + * <tr><td><code>target</code></td><td>The Object that dispatched the event; + * it is not always the Object listening for the event. + * Use the <code>currentTarget</code> property to always access the + * Object listening for the event.</td></tr> + * </table> + * + * @eventType removeChildBridge + * + * @langversion 3.0 + * @playerversion Flash 9 + * @playerversion AIR 1.1 + * @productversion Flex 3 + */ + public static const REMOVE_CHILD_BRIDGE:String = "removeChildBridge"; + + /** + * @private + * + * Dispatched by a StyleManager when a style property is changed. + * + * The data parameter is an object that describes what changed: + * + * "property" - This property describes what kind of style manager + * property changed. + * If the "property" property is "inheritingStyles" then the + * StyleManager's inheritingStyles property was updated. + * + */ + public static const STYLE_MANAGER_CHANGE:String = "styleManagerChange"; + + //-------------------------------------------------------------------------- + // + // Constructor + // + //-------------------------------------------------------------------------- + + /** + * Constructor. + * + * @param type The event type; indicates the action that caused the event. + * + * @param bubbles Specifies whether the event can bubble up the display list hierarchy. + * + * @param cancelable Specifies whether the behavior associated with the event can be prevented. + * + * @param data Data related to the event. + * + * @langversion 3.0 + * @playerversion Flash 9 + * @playerversion AIR 1.1 + * @productversion Flex 3 + */ + public function FlexChangeEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false, data:Object = null) + { + super(type, bubbles, cancelable); + + this.data = data; + } + + //-------------------------------------------------------------------------- + // + // Properties + // + //-------------------------------------------------------------------------- + + //---------------------------------- + // data + //---------------------------------- + + /** + * Data related to the event. For more information on this object, see each event type. + * + * @langversion 3.0 + * @playerversion Flash 9 + * @playerversion AIR 1.1 + * @productversion Flex 3 + */ + public var data:Object; + + //-------------------------------------------------------------------------- + // + // Overridden methods: Event + // + //-------------------------------------------------------------------------- + + /** + * @private + */ + override public function cloneEvent():Event + { + return new FlexChangeEvent(type, bubbles, cancelable, data); + } + +} - } ++}
