|  |  | using System.Collections.Generic;
 | 
						
						
						
							|  |  | using UnityEngine;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | namespace FairyGUI.Utils
 | 
						
						
						
							|  |  | {
 | 
						
						
						
							|  |  |     /// <summary>
 | 
						
						
						
							|  |  |     /// 
 | 
						
						
						
							|  |  |     /// </summary>
 | 
						
						
						
							|  |  |     public class HtmlPageContext : IHtmlPageContext
 | 
						
						
						
							|  |  |     {
 | 
						
						
						
							|  |  |         Stack<IHtmlObject> _imagePool;
 | 
						
						
						
							|  |  |         Stack<IHtmlObject> _inputPool;
 | 
						
						
						
							|  |  |         Stack<IHtmlObject> _buttonPool;
 | 
						
						
						
							|  |  |         Stack<IHtmlObject> _selectPool;
 | 
						
						
						
							|  |  |         Stack<IHtmlObject> _linkPool;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         public static HtmlPageContext inst = new HtmlPageContext();
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         static Transform _poolManager;
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         public HtmlPageContext()
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             _imagePool = new Stack<IHtmlObject>();
 | 
						
						
						
							|  |  |             _inputPool = new Stack<IHtmlObject>();
 | 
						
						
						
							|  |  |             _buttonPool = new Stack<IHtmlObject>();
 | 
						
						
						
							|  |  |             _selectPool = new Stack<IHtmlObject>();
 | 
						
						
						
							|  |  |             _linkPool = new Stack<IHtmlObject>();
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (Application.isPlaying && _poolManager == null)
 | 
						
						
						
							|  |  |                 _poolManager = Stage.inst.CreatePoolManager("HtmlObjectPool");
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         virtual public IHtmlObject CreateObject(RichTextField owner, HtmlElement element)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             IHtmlObject ret = null;
 | 
						
						
						
							|  |  |             bool fromPool = false;
 | 
						
						
						
							|  |  |             if (element.type == HtmlElementType.Image)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 if (_imagePool.Count > 0 && _poolManager != null)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     ret = _imagePool.Pop();
 | 
						
						
						
							|  |  |                     fromPool = true;
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |                 else
 | 
						
						
						
							|  |  |                     ret = new HtmlImage();
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |             else if (element.type == HtmlElementType.Link)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 if (_linkPool.Count > 0 && _poolManager != null)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     ret = _linkPool.Pop();
 | 
						
						
						
							|  |  |                     fromPool = true;
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |                 else
 | 
						
						
						
							|  |  |                     ret = new HtmlLink();
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |             else if (element.type == HtmlElementType.Input)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 string type = element.GetString("type");
 | 
						
						
						
							|  |  |                 if (type != null)
 | 
						
						
						
							|  |  |                     type = type.ToLower();
 | 
						
						
						
							|  |  |                 if (type == "button" || type == "submit")
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     if (_buttonPool.Count > 0 && _poolManager != null)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         ret = _buttonPool.Pop();
 | 
						
						
						
							|  |  |                         fromPool = true;
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                     else
 | 
						
						
						
							|  |  |                         ret = new HtmlButton();
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |                 else
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     if (_inputPool.Count > 0 && _poolManager != null)
 | 
						
						
						
							|  |  |                     {
 | 
						
						
						
							|  |  |                         ret = _inputPool.Pop();
 | 
						
						
						
							|  |  |                         fromPool = true;
 | 
						
						
						
							|  |  |                     }
 | 
						
						
						
							|  |  |                     else
 | 
						
						
						
							|  |  |                         ret = new HtmlInput();
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  |             else if (element.type == HtmlElementType.Select)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 if (_selectPool.Count > 0 && _poolManager != null)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     ret = _selectPool.Pop();
 | 
						
						
						
							|  |  |                     fromPool = true;
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |                 else
 | 
						
						
						
							|  |  |                     ret = new HtmlSelect();
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             //Debug.Log("from=" + fromPool);
 | 
						
						
						
							|  |  |             if (ret != null)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 //可能已经被GameObject tree deleted了,不再使用
 | 
						
						
						
							|  |  |                 if (fromPool && ret.displayObject != null && ret.displayObject.isDisposed)
 | 
						
						
						
							|  |  |                 {
 | 
						
						
						
							|  |  |                     ret.Dispose();
 | 
						
						
						
							|  |  |                     return CreateObject(owner, element);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |                 }
 | 
						
						
						
							|  |  |                 ret.Create(owner, element);
 | 
						
						
						
							|  |  |                 if (ret.displayObject != null)
 | 
						
						
						
							|  |  |                     ret.displayObject.home = owner.cachedTransform;
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             return ret;
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         virtual public void FreeObject(IHtmlObject obj)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             if (_poolManager == null)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 obj.Dispose();
 | 
						
						
						
							|  |  |                 return;
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             //可能已经被GameObject tree deleted了,不再回收
 | 
						
						
						
							|  |  |             if (obj.displayObject != null && obj.displayObject.isDisposed)
 | 
						
						
						
							|  |  |             {
 | 
						
						
						
							|  |  |                 obj.Dispose();
 | 
						
						
						
							|  |  |                 return;
 | 
						
						
						
							|  |  |             }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             obj.Release();
 | 
						
						
						
							|  |  |             if (obj is HtmlImage)
 | 
						
						
						
							|  |  |                 _imagePool.Push(obj);
 | 
						
						
						
							|  |  |             else if (obj is HtmlInput)
 | 
						
						
						
							|  |  |                 _inputPool.Push(obj);
 | 
						
						
						
							|  |  |             else if (obj is HtmlButton)
 | 
						
						
						
							|  |  |                 _buttonPool.Push(obj);
 | 
						
						
						
							|  |  |             else if (obj is HtmlLink)
 | 
						
						
						
							|  |  |                 _linkPool.Push(obj);
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |             if (obj.displayObject != null)
 | 
						
						
						
							|  |  |                 obj.displayObject.cachedTransform.SetParent(_poolManager, false);
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         virtual public NTexture GetImageTexture(HtmlImage image)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |             return null;
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  |         virtual public void FreeImageTexture(HtmlImage image, NTexture texture)
 | 
						
						
						
							|  |  |         {
 | 
						
						
						
							|  |  |         }
 | 
						
						
						
							|  |  |     }
 | 
						
						
						
							|  |  | }
 |