//////////////////////////////////////////////////////////////////////////////// // // 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 { import flash.text.TextField; import flash.utils.Dictionary; use namespace mx_internal; [ExcludeClass] /** * @private * Singleton to create TextFields in the context of various ModuleFactories. * One module factory will have at most one TextField created for it. * The text fields are only used for measurement; * they are not on the display list. */ public class TextFieldFactory implements ITextFieldFactory { include "../core/Version.as"; //-------------------------------------------------------------------------- // // Class variables // //-------------------------------------------------------------------------- /** * @private * * This classes singleton. */ private static var instance:ITextFieldFactory; //-------------------------------------------------------------------------- // // Class methods // //-------------------------------------------------------------------------- /** * @private */ public static function getInstance():ITextFieldFactory { if (!instance) instance = new TextFieldFactory(); return instance; } //-------------------------------------------------------------------------- // // Variables // //-------------------------------------------------------------------------- /** * @private * Cache of TextFields. Limit of one per module factory. * In this Dictionary, each key is a weak reference * to an IFlexModuleFactory and each value is a Dictionary * with a single entry (a TextField as a weak key). */ private var textFields:Dictionary = new Dictionary(true); /** * @private * Cache of FTETextFields. Limit of one per module factory. * In this Dictionary, each key is a weak reference * to an IFlexModuleFactory and each value is a Dictionary * with a single entry (a FTETextField as a weak key). */ private var fteTextFields:Dictionary = new Dictionary(true); //-------------------------------------------------------------------------- // // Methods // //-------------------------------------------------------------------------- /** * @private * Creates an instance of TextField * in the context of the specified IFlexModuleFactory. * * @param moduleFactory The IFlexModuleFactory requesting the TextField. * * @return A FTETextField created in the context * of moduleFactory. * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ public function createTextField(moduleFactory:IFlexModuleFactory):TextField { // Check to see if we already have a text field for this module factory. var textField:TextField = null; var textFieldDictionary:Dictionary = textFields[moduleFactory]; if (textFieldDictionary) { for (var iter:Object in textFieldDictionary) { textField = TextField(iter); break; } } if (!textField) { if (moduleFactory) textField = TextField(moduleFactory.create("flash.text.TextField")); else textField = new TextField(); // The dictionary could be empty, but not null because entries in the dictionary // could be garbage collected. if (!textFieldDictionary) textFieldDictionary = new Dictionary(true); textFieldDictionary[textField] = 1; textFields[moduleFactory] = textFieldDictionary; } return textField; } /** * @private * Creates an instance of FTETextField * in the context of the specified module factory. * * @param moduleFactory The IFlexModuleFactory requesting the TextField. * May not be null. * * @return A FTETextField created in the context * of moduleFactory. * The return value is loosely typed as Object * to avoid linking in FTETextField (and therefore much of TLF). * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 4 */ public function createFTETextField(moduleFactory:IFlexModuleFactory):Object { // Check to see if we already have a text field for this module factory. var fteTextField:Object = null; var fteTextFieldDictionary:Dictionary = fteTextFields[moduleFactory]; if (fteTextFieldDictionary) { for (var iter:Object in fteTextFieldDictionary) { fteTextField = iter; break; } } if (!fteTextField) { if (moduleFactory) { fteTextField = moduleFactory.create( "mx.core.FTETextField"); fteTextField.fontContext = moduleFactory; } // The dictionary could be empty, but not null because entries in the dictionary // could be garbage collected. if (!fteTextFieldDictionary) fteTextFieldDictionary = new Dictionary(true); fteTextFieldDictionary[fteTextField] = 1; fteTextFields[moduleFactory] = fteTextFieldDictionary; } return fteTextField; } } }