UIObjectFactory.cs 5.8 KB

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