using System;
using System.Collections.Generic;
#if FAIRYGUI_TOLUA
using LuaInterface;
#endif
namespace FairyGUI
{
///
///
///
public class UIObjectFactory
{
public delegate GComponent GComponentCreator();
public delegate GLoader GLoaderCreator();
static Dictionary packageItemExtensions = new Dictionary();
static GLoaderCreator loaderCreator;
///
///
///
///
///
public static void SetPackageItemExtension(string url, System.Type type)
{
SetPackageItemExtension(url, () => { return (GComponent)Activator.CreateInstance(type); });
}
///
///
///
///
///
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
///
///
///
///
public static void SetLoaderExtension(System.Type type)
{
loaderCreator = () => { return (GLoader)Activator.CreateInstance(type); };
}
///
///
///
///
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;
}
///
///
///
///
///
///
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;
}
///
///
///
///
///
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;
}
}
}
}