123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 |
- using System;
- using System.Collections.Generic;
- #if FAIRYGUI_TOLUA
- using LuaInterface;
- #endif
- namespace 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;
- }
- }
- }
- }
|