RichTextField.cs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. using System.Collections.Generic;
  2. using FairyGUI.Utils;
  3. namespace FairyGUI
  4. {
  5. /// <summary>
  6. ///
  7. /// </summary>
  8. public class RichTextField : Container
  9. {
  10. /// <summary>
  11. ///
  12. /// </summary>
  13. public IHtmlPageContext htmlPageContext { get; set; }
  14. /// <summary>
  15. ///
  16. /// </summary>
  17. public HtmlParseOptions htmlParseOptions { get; private set; }
  18. /// <summary>
  19. ///
  20. /// </summary>
  21. public Dictionary<uint, Emoji> emojies { get; set; }
  22. /// <summary>
  23. ///
  24. /// </summary>
  25. public TextField textField { get; private set; }
  26. public RichTextField()
  27. {
  28. gameObject.name = "RichTextField";
  29. this.opaque = true;
  30. htmlPageContext = HtmlPageContext.inst;
  31. htmlParseOptions = new HtmlParseOptions();
  32. this.textField = new TextField();
  33. textField.EnableRichSupport(this);
  34. AddChild(textField);
  35. }
  36. /// <summary>
  37. ///
  38. /// </summary>
  39. virtual public string text
  40. {
  41. get { return textField.text; }
  42. set { textField.text = value; }
  43. }
  44. /// <summary>
  45. ///
  46. /// </summary>
  47. virtual public string htmlText
  48. {
  49. get { return textField.htmlText; }
  50. set { textField.htmlText = value; }
  51. }
  52. /// <summary>
  53. ///
  54. /// </summary>
  55. virtual public TextFormat textFormat
  56. {
  57. get { return textField.textFormat; }
  58. set { textField.textFormat = value; }
  59. }
  60. /// <summary>
  61. ///
  62. /// </summary>
  63. /// <param name="name"></param>
  64. /// <returns></returns>
  65. public HtmlElement GetHtmlElement(string name)
  66. {
  67. List<HtmlElement> elements = textField.htmlElements;
  68. int count = elements.Count;
  69. for (int i = 0; i < count; i++)
  70. {
  71. HtmlElement element = elements[i];
  72. if (name.Equals(element.name, System.StringComparison.OrdinalIgnoreCase))
  73. return element;
  74. }
  75. return null;
  76. }
  77. /// <summary>
  78. ///
  79. /// </summary>
  80. /// <param name="index"></param>
  81. /// <returns></returns>
  82. public HtmlElement GetHtmlElementAt(int index)
  83. {
  84. return textField.htmlElements[index];
  85. }
  86. /// <summary>
  87. ///
  88. /// </summary>
  89. public int htmlElementCount
  90. {
  91. get { return textField.htmlElements.Count; }
  92. }
  93. /// <summary>
  94. ///
  95. /// </summary>
  96. /// <param name="index"></param>
  97. /// <param name="show"></param>
  98. public void ShowHtmlObject(int index, bool show)
  99. {
  100. HtmlElement element = textField.htmlElements[index];
  101. if (element.htmlObject != null && element.type != HtmlElementType.Link)
  102. {
  103. //set hidden flag
  104. if (show)
  105. element.status &= 253; //~(1<<1)
  106. else
  107. element.status |= 2;
  108. if ((element.status & 3) == 0) //not (hidden and clipped)
  109. {
  110. if ((element.status & 4) == 0) //not added
  111. {
  112. element.status |= 4;
  113. element.htmlObject.Add();
  114. }
  115. }
  116. else
  117. {
  118. if ((element.status & 4) != 0) //added
  119. {
  120. element.status &= 251;
  121. element.htmlObject.Remove();
  122. }
  123. }
  124. }
  125. }
  126. public override void EnsureSizeCorrect()
  127. {
  128. textField.EnsureSizeCorrect();
  129. }
  130. override protected void OnSizeChanged()
  131. {
  132. textField.size = _contentRect.size; //千万不可以调用this.size,后者会触发EnsureSizeCorrect
  133. base.OnSizeChanged();
  134. }
  135. public override void Update(UpdateContext context)
  136. {
  137. textField.Redraw();
  138. base.Update(context);
  139. }
  140. public override void Dispose()
  141. {
  142. if ((_flags & Flags.Disposed) != 0)
  143. return;
  144. CleanupObjects();
  145. base.Dispose();
  146. }
  147. internal void CleanupObjects()
  148. {
  149. List<HtmlElement> elements = textField.htmlElements;
  150. int count = elements.Count;
  151. for (int i = 0; i < count; i++)
  152. {
  153. HtmlElement element = elements[i];
  154. if (element.htmlObject != null)
  155. {
  156. element.htmlObject.Remove();
  157. htmlPageContext.FreeObject(element.htmlObject);
  158. }
  159. }
  160. }
  161. virtual internal void RefreshObjects()
  162. {
  163. List<HtmlElement> elements = textField.htmlElements;
  164. int count = elements.Count;
  165. for (int i = 0; i < count; i++)
  166. {
  167. HtmlElement element = elements[i];
  168. if (element.htmlObject != null)
  169. {
  170. if ((element.status & 3) == 0) //not (hidden and clipped)
  171. {
  172. if ((element.status & 4) == 0) //not added
  173. {
  174. element.status |= 4;
  175. element.htmlObject.Add();
  176. }
  177. }
  178. else
  179. {
  180. if ((element.status & 4) != 0) //added
  181. {
  182. element.status &= 251;
  183. element.htmlObject.Remove();
  184. }
  185. }
  186. }
  187. }
  188. }
  189. }
  190. }