using System.Collections; using System.Collections.Generic; using UnityEngine; namespace FairyGUI.Utils { /// <summary> /// /// </summary> public enum HtmlElementType { Text, Link, Image, Input, Select, Object, //internal LinkEnd, } /// <summary> /// /// </summary> public class HtmlElement { public HtmlElementType type; public string name; public string text; public TextFormat format; public int charIndex; public IHtmlObject htmlObject; public int status; //1 hidden 2 clipped 4 added public int space; public Vector2 position; Hashtable attributes; public HtmlElement() { format = new TextFormat(); } public object Get(string attrName) { if (attributes == null) return null; return attributes[attrName]; } public void Set(string attrName, object attrValue) { if (attributes == null) attributes = new Hashtable(); attributes[attrName] = attrValue; } public string GetString(string attrName) { return GetString(attrName, null); } public string GetString(string attrName, string defValue) { if (attributes == null) return defValue; object ret = attributes[attrName]; if (ret != null) return ret.ToString(); else return defValue; } public int GetInt(string attrName) { return GetInt(attrName, 0); } public int GetInt(string attrName, int defValue) { string value = GetString(attrName); if (value == null || value.Length == 0) return defValue; if (value[value.Length - 1] == '%') { int ret; if (int.TryParse(value.Substring(0, value.Length - 1), out ret)) return Mathf.CeilToInt(ret / 100.0f * defValue); else return defValue; } else { int ret; if (int.TryParse(value, out ret)) return ret; else return defValue; } } public float GetFloat(string attrName) { return GetFloat(attrName, 0); } public float GetFloat(string attrName, float defValue) { string value = GetString(attrName); if (value == null || value.Length == 0) return defValue; float ret; if (float.TryParse(value, out ret)) return ret; else return defValue; } public bool GetBool(string attrName) { return GetBool(attrName, false); } public bool GetBool(string attrName, bool defValue) { string value = GetString(attrName); if (value == null || value.Length == 0) return defValue; bool ret; if (bool.TryParse(value, out ret)) return ret; else return defValue; } public Color GetColor(string attrName, Color defValue) { string value = GetString(attrName); if (value == null || value.Length == 0) return defValue; return ToolSet.ConvertFromHtmlColor(value); } public void FetchAttributes() { attributes = XMLIterator.GetAttributes(attributes); } public bool isEntity { get { return type == HtmlElementType.Image || type == HtmlElementType.Select || type == HtmlElementType.Input || type == HtmlElementType.Object; } } #region Pool Support static Stack<HtmlElement> elementPool = new Stack<HtmlElement>(); public static HtmlElement GetElement(HtmlElementType type) { HtmlElement ret; if (elementPool.Count > 0) ret = elementPool.Pop(); else ret = new HtmlElement(); ret.type = type; if (type != HtmlElementType.Text && ret.attributes == null) ret.attributes = new Hashtable(); return ret; } public static void ReturnElement(HtmlElement element) { element.name = null; element.text = null; element.htmlObject = null; element.status = 0; if (element.attributes != null) element.attributes.Clear(); elementPool.Push(element); } public static void ReturnElements(List<HtmlElement> elements) { int count = elements.Count; for (int i = 0; i < count; i++) { HtmlElement element = elements[i]; ReturnElement(element); } elements.Clear(); } #endregion } }