//////////////////////////////////////////////////////////////////////////////// // // 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 { /** * A ClassFactory instance is a "factory object" which Flex uses * to generate instances of another class, each with identical properties. * *

You specify a generator class when you construct * the factory object. * Then you set the properties property on the factory object. * Flex uses the factory object to generate instances by calling * the factory object's newInstance() method.

* *

The newInstance() method creates a new instance * of the generator class, and sets the properties specified * by properties in the new instance. * If you need to further customize the generated instances, * you can override the newInstance() method.

* *

The ClassFactory class implements the IFactory interface. * Therefore it lets you create objects that can be assigned to properties * of type IFactory, such as the itemRenderer property of a List control * or the itemEditor property of a DataGrid control.

* *

For example, suppose you write an item renderer class named * ProductRenderer containing * a showProductImage property which can be true * or false. * If you want to make a List control use this renderer, and have each renderer * instance display a product image, you would write the following code:

* *
 *  var productRenderer:ClassFactory = new ClassFactory(ProductRenderer);
 *  productRenderer.properties = { showProductImage: true };
 *  myList.itemRenderer = productRenderer;
* *

The List control calls the newInstance() method on the * itemRenderer to create individual instances of ProductRenderer, * each with showProductImage property set to true. * If you want a different List control to omit the product images, you use * the ProductRenderer class to create another ClassFactory * with the properties property set to * { showProductImage: false }.

* *

Using the properties property to configure the instances * can be powerful, since it allows a single generator class to be used * in different ways. * However, it is very common to create non-configurable generator classes * which require no properties to be set. * For this reason, MXML lets you use the following syntax:

* *
 *  <mx:List id="myList" itemRenderer="ProductRenderer">
* *

The MXML compiler automatically creates the ClassFactory instance * for you.

* * @see mx.core.IFactory * @see mx.controls.List * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ public class ClassFactory implements IFactory { include "../core/Version.as"; //-------------------------------------------------------------------------- // // Constructor // //-------------------------------------------------------------------------- /** * Constructor. * * @param generator The Class that the newInstance() method uses * to generate objects from this factory object. * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ public function ClassFactory(generator:Class = null) { super(); this.generator = generator; } //-------------------------------------------------------------------------- // // Properties // //-------------------------------------------------------------------------- //---------------------------------- // generator //---------------------------------- /** * The Class that the newInstance() method uses * to generate objects from this factory object. * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ public var generator:Class; //---------------------------------- // properties //---------------------------------- /** * An Object whose name/value pairs specify the properties to be set * on each object generated by the newInstance() method. * *

For example, if you set properties to * { text: "Hello", width: 100 }, then every instance * of the generator class that is generated by calling * newInstance() will have its text set to * "Hello" and its width set to * 100.

* * @default null * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ public var properties:Object = null; //-------------------------------------------------------------------------- // // Methods // //-------------------------------------------------------------------------- /** * Creates a new instance of the generator class, * with the properties specified by properties. * *

This method implements the newInstance() method * of the IFactory interface.

* * @return The new instance that was created. * * @langversion 3.0 * @playerversion Flash 9 * @playerversion AIR 1.1 * @productversion Flex 3 */ public function newInstance():* { var instance:Object = new generator(); if (properties != null) { for (var p:String in properties) { instance[p] = properties[p]; } } return instance; } } }