using System.Collections.Generic; using FairyGUI.Utils; namespace FairyGUI { /// /// /// public class RichTextField : Container { /// /// /// public IHtmlPageContext htmlPageContext { get; set; } /// /// /// public HtmlParseOptions htmlParseOptions { get; private set; } /// /// /// public Dictionary emojies { get; set; } /// /// /// public TextField textField { get; private set; } public RichTextField() { gameObject.name = "RichTextField"; this.opaque = true; htmlPageContext = HtmlPageContext.inst; htmlParseOptions = new HtmlParseOptions(); this.textField = new TextField(); textField.EnableRichSupport(this); AddChild(textField); } /// /// /// virtual public string text { get { return textField.text; } set { textField.text = value; } } /// /// /// virtual public string htmlText { get { return textField.htmlText; } set { textField.htmlText = value; } } /// /// /// virtual public TextFormat textFormat { get { return textField.textFormat; } set { textField.textFormat = value; } } /// /// /// /// /// public HtmlElement GetHtmlElement(string name) { List elements = textField.htmlElements; int count = elements.Count; for (int i = 0; i < count; i++) { HtmlElement element = elements[i]; if (name.Equals(element.name, System.StringComparison.OrdinalIgnoreCase)) return element; } return null; } /// /// /// /// /// public HtmlElement GetHtmlElementAt(int index) { return textField.htmlElements[index]; } /// /// /// public int htmlElementCount { get { return textField.htmlElements.Count; } } /// /// /// /// /// public void ShowHtmlObject(int index, bool show) { HtmlElement element = textField.htmlElements[index]; if (element.htmlObject != null && element.type != HtmlElementType.Link) { //set hidden flag if (show) element.status &= 253; //~(1<<1) else element.status |= 2; if ((element.status & 3) == 0) //not (hidden and clipped) { if ((element.status & 4) == 0) //not added { element.status |= 4; element.htmlObject.Add(); } } else { if ((element.status & 4) != 0) //added { element.status &= 251; element.htmlObject.Remove(); } } } } public override void EnsureSizeCorrect() { textField.EnsureSizeCorrect(); } override protected void OnSizeChanged() { textField.size = _contentRect.size; //千万不可以调用this.size,后者会触发EnsureSizeCorrect base.OnSizeChanged(); } public override void Update(UpdateContext context) { textField.Redraw(); base.Update(context); } public override void Dispose() { if ((_flags & Flags.Disposed) != 0) return; CleanupObjects(); base.Dispose(); } internal void CleanupObjects() { List elements = textField.htmlElements; int count = elements.Count; for (int i = 0; i < count; i++) { HtmlElement element = elements[i]; if (element.htmlObject != null) { element.htmlObject.Remove(); htmlPageContext.FreeObject(element.htmlObject); } } } virtual internal void RefreshObjects() { List elements = textField.htmlElements; int count = elements.Count; for (int i = 0; i < count; i++) { HtmlElement element = elements[i]; if (element.htmlObject != null) { if ((element.status & 3) == 0) //not (hidden and clipped) { if ((element.status & 4) == 0) //not added { element.status |= 4; element.htmlObject.Add(); } } else { if ((element.status & 4) != 0) //added { element.status &= 251; element.htmlObject.Remove(); } } } } } } }