| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 | using System;using System.Collections.Generic;#if FAIRYGUI_TOLUAusing LuaInterface;#endifnamespace FairyGUI{    /// <summary>    ///     /// </summary>    public class UIObjectFactory    {        public delegate GComponent GComponentCreator();        public delegate GLoader GLoaderCreator();        static Dictionary<string, GComponentCreator> packageItemExtensions = new Dictionary<string, GComponentCreator>();        static GLoaderCreator loaderCreator;        /// <summary>        ///         /// </summary>        /// <param name="url"></param>        /// <param name="type"></param>        public static void SetPackageItemExtension(string url, System.Type type)        {            SetPackageItemExtension(url, () =>             {                 return (GComponent)Activator.CreateInstance(type);             });        }        /// <summary>        ///         /// </summary>        /// <param name="url"></param>        /// <param name="creator"></param>        public static void SetPackageItemExtension(string url, GComponentCreator creator)        {            if (url == null)                throw new Exception("Invaild url: " + url);            PackageItem pi = UIPackage.GetItemByURL(url);            if (pi != null)                pi.extensionCreator = creator;            packageItemExtensions[url] = creator;        }#if FAIRYGUI_TOLUA        public static void SetExtension(string url, System.Type baseType, LuaFunction extendFunction)        {            SetPackageItemExtension(url, () =>            {                GComponent gcom = (GComponent)Activator.CreateInstance(baseType);                extendFunction.BeginPCall();                extendFunction.Push(gcom);                extendFunction.PCall();                gcom.SetLuaPeer(extendFunction.CheckLuaTable());                extendFunction.EndPCall();                return gcom;            });        }#endif        /// <summary>        ///         /// </summary>        /// <param name="type"></param>        public static void SetLoaderExtension(System.Type type)        {            loaderCreator = () => { return (GLoader)Activator.CreateInstance(type); };        }        /// <summary>        ///         /// </summary>        /// <param name="creator"></param>        public static void SetLoaderExtension(GLoaderCreator creator)        {            loaderCreator = creator;        }        internal static void ResolvePackageItemExtension(PackageItem pi)        {            if (!packageItemExtensions.TryGetValue(UIPackage.URL_PREFIX + pi.owner.id + pi.id, out pi.extensionCreator)                && !packageItemExtensions.TryGetValue(UIPackage.URL_PREFIX + pi.owner.name + "/" + pi.name, out pi.extensionCreator))                pi.extensionCreator = null;        }        public static void Clear()        {            packageItemExtensions.Clear();            loaderCreator = null;        }        /// <summary>        ///         /// </summary>        /// <param name="pi"></param>        /// <param name="userClass"></param>        /// <returns></returns>        public static GObject NewObject(PackageItem pi, System.Type userClass = null)        {            GObject obj;            if (pi.type == PackageItemType.Component)            {                if (userClass != null)                {                    Stats.LatestObjectCreation++;                    obj = (GComponent)Activator.CreateInstance(userClass);                }                else if (pi.extensionCreator != null)                {                    Stats.LatestObjectCreation++;                    obj = pi.extensionCreator();                }                else                    obj = NewObject(pi.objectType);            }            else                obj = NewObject(pi.objectType);            if (obj != null)                obj.packageItem = pi;            return obj;        }        /// <summary>        ///         /// </summary>        /// <param name="type"></param>        /// <returns></returns>        public static GObject NewObject(ObjectType type)        {            Stats.LatestObjectCreation++;            switch (type)            {                case ObjectType.Image:                    return new GImage();                case ObjectType.MovieClip:                    return new GMovieClip();                case ObjectType.Component:                    return new GComponent();                case ObjectType.Text:                    return new GTextField();                case ObjectType.RichText:                    return new GRichTextField();                case ObjectType.InputText:                    return new GTextInput();                case ObjectType.Group:                    return new GGroup();                case ObjectType.List:                    return new GList();                case ObjectType.Graph:                    return new GGraph();                case ObjectType.Loader:                    if (loaderCreator != null)                        return loaderCreator();                    else                        return new GLoader();                case ObjectType.Button:                    return new GButton();                case ObjectType.Label:                    return new GLabel();                case ObjectType.ProgressBar:                    return new GProgressBar();                case ObjectType.Slider:                    return new GSlider();                case ObjectType.ScrollBar:                    return new GScrollBar();                case ObjectType.ComboBox:                    return new GComboBox();                case ObjectType.Tree:                    return new GTree();                case ObjectType.Loader3D:                    return new GLoader3D();                default:                    return null;            }        }    }}
 |