UIObjectFactory.cs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. using System;
  2. using System.Collections.Generic;
  3. #if FAIRYGUI_TOLUA
  4. using LuaInterface;
  5. #endif
  6. namespace FairyGUI
  7. {
  8. /// <summary>
  9. ///
  10. /// </summary>
  11. public class UIObjectFactory
  12. {
  13. public delegate GComponent GComponentCreator();
  14. public delegate GLoader GLoaderCreator();
  15. static Dictionary<string, GComponentCreator> packageItemExtensions = new Dictionary<string, GComponentCreator>();
  16. static GLoaderCreator loaderCreator;
  17. /// <summary>
  18. ///
  19. /// </summary>
  20. /// <param name="url"></param>
  21. /// <param name="type"></param>
  22. public static void SetPackageItemExtension(string url, System.Type type)
  23. {
  24. SetPackageItemExtension(url, () =>
  25. {
  26. return (GComponent)Activator.CreateInstance(type);
  27. });
  28. }
  29. /// <summary>
  30. ///
  31. /// </summary>
  32. /// <param name="url"></param>
  33. /// <param name="creator"></param>
  34. public static void SetPackageItemExtension(string url, GComponentCreator creator)
  35. {
  36. if (url == null)
  37. throw new Exception("Invaild url: " + url);
  38. PackageItem pi = UIPackage.GetItemByURL(url);
  39. if (pi != null)
  40. pi.extensionCreator = creator;
  41. packageItemExtensions[url] = creator;
  42. }
  43. #if FAIRYGUI_TOLUA
  44. public static void SetExtension(string url, System.Type baseType, LuaFunction extendFunction)
  45. {
  46. SetPackageItemExtension(url, () =>
  47. {
  48. GComponent gcom = (GComponent)Activator.CreateInstance(baseType);
  49. extendFunction.BeginPCall();
  50. extendFunction.Push(gcom);
  51. extendFunction.PCall();
  52. gcom.SetLuaPeer(extendFunction.CheckLuaTable());
  53. extendFunction.EndPCall();
  54. return gcom;
  55. });
  56. }
  57. #endif
  58. /// <summary>
  59. ///
  60. /// </summary>
  61. /// <param name="type"></param>
  62. public static void SetLoaderExtension(System.Type type)
  63. {
  64. loaderCreator = () => { return (GLoader)Activator.CreateInstance(type); };
  65. }
  66. /// <summary>
  67. ///
  68. /// </summary>
  69. /// <param name="creator"></param>
  70. public static void SetLoaderExtension(GLoaderCreator creator)
  71. {
  72. loaderCreator = creator;
  73. }
  74. internal static void ResolvePackageItemExtension(PackageItem pi)
  75. {
  76. if (!packageItemExtensions.TryGetValue(UIPackage.URL_PREFIX + pi.owner.id + pi.id, out pi.extensionCreator)
  77. && !packageItemExtensions.TryGetValue(UIPackage.URL_PREFIX + pi.owner.name + "/" + pi.name, out pi.extensionCreator))
  78. pi.extensionCreator = null;
  79. }
  80. public static void Clear()
  81. {
  82. packageItemExtensions.Clear();
  83. loaderCreator = null;
  84. }
  85. /// <summary>
  86. ///
  87. /// </summary>
  88. /// <param name="pi"></param>
  89. /// <param name="userClass"></param>
  90. /// <returns></returns>
  91. public static GObject NewObject(PackageItem pi, System.Type userClass = null)
  92. {
  93. GObject obj;
  94. if (pi.type == PackageItemType.Component)
  95. {
  96. if (userClass != null)
  97. {
  98. Stats.LatestObjectCreation++;
  99. obj = (GComponent)Activator.CreateInstance(userClass);
  100. }
  101. else if (pi.extensionCreator != null)
  102. {
  103. Stats.LatestObjectCreation++;
  104. obj = pi.extensionCreator();
  105. }
  106. else
  107. obj = NewObject(pi.objectType);
  108. }
  109. else
  110. obj = NewObject(pi.objectType);
  111. if (obj != null)
  112. obj.packageItem = pi;
  113. return obj;
  114. }
  115. /// <summary>
  116. ///
  117. /// </summary>
  118. /// <param name="type"></param>
  119. /// <returns></returns>
  120. public static GObject NewObject(ObjectType type)
  121. {
  122. Stats.LatestObjectCreation++;
  123. switch (type)
  124. {
  125. case ObjectType.Image:
  126. return new GImage();
  127. case ObjectType.MovieClip:
  128. return new GMovieClip();
  129. case ObjectType.Component:
  130. return new GComponent();
  131. case ObjectType.Text:
  132. return new GTextField();
  133. case ObjectType.RichText:
  134. return new GRichTextField();
  135. case ObjectType.InputText:
  136. return new GTextInput();
  137. case ObjectType.Group:
  138. return new GGroup();
  139. case ObjectType.List:
  140. return new GList();
  141. case ObjectType.Graph:
  142. return new GGraph();
  143. case ObjectType.Loader:
  144. if (loaderCreator != null)
  145. return loaderCreator();
  146. else
  147. return new GLoader();
  148. case ObjectType.Button:
  149. return new GButton();
  150. case ObjectType.Label:
  151. return new GLabel();
  152. case ObjectType.ProgressBar:
  153. return new GProgressBar();
  154. case ObjectType.Slider:
  155. return new GSlider();
  156. case ObjectType.ScrollBar:
  157. return new GScrollBar();
  158. case ObjectType.ComboBox:
  159. return new GComboBox();
  160. case ObjectType.Tree:
  161. return new GTree();
  162. case ObjectType.Loader3D:
  163. return new GLoader3D();
  164. default:
  165. return null;
  166. }
  167. }
  168. }
  169. }