| //--------------------------------------------------------  | 
| //    [Author]:           第二世界  | 
| //    [  Date ]:           Wednesday, September 13, 2017  | 
| //--------------------------------------------------------  | 
| using UnityEngine;  | 
| using System.Collections;  | 
| using UnityEngine.UI;  | 
| using System.Collections.Generic;  | 
| using System;  | 
| using System.Text.RegularExpressions;  | 
|   | 
| namespace vnxbqy.UI  | 
| {  | 
|   | 
|     public class ChatFriend : MonoBehaviour  | 
|     {  | 
|         [SerializeField] ScrollerController m_Controller;  | 
|   | 
|         private List<ChatFriendData> chatList = null;  | 
|   | 
|         [SerializeField] RichText destText;  | 
|         [SerializeField] RichText destSysText;  | 
|         private bool open = false;  | 
|         public bool IsOpen  | 
|         {  | 
|             get { return open; }  | 
|         }  | 
|   | 
|         private void Awake()  | 
|         {  | 
|             m_Controller.OnGetDynamicSize += OnGetChatDynamicSize;  | 
|             ChatCtrl.Inst.SetChatFreind(this);  | 
|         }  | 
|   | 
|         #region 计算动态宽度长度  | 
|         private bool OnGetChatDynamicSize(ScrollerDataType type, int index, out float height)  | 
|         {  | 
|             height = 90;  | 
|             if (chatList == null || index >= chatList.Count)  | 
|             {  | 
|                 return false;  | 
|             }  | 
|             ChatData chat = chatList[index];  | 
|             if (type == ScrollerDataType.Extra2)  | 
|             {  | 
|                 height = chat.content.Equals(string.Empty) ? 90 : 120;  | 
|             }  | 
|             else if (type == ScrollerDataType.Tail)  | 
|             {  | 
|                 height = 30;  | 
|             }  | 
|             float width = 0;  | 
|             OnGetChatDynamicHeight(chat.content, ref height, ref width, type, chat.infoList);  | 
|             return true;  | 
|         }  | 
|         private void OnGetChatDynamicHeight(string content, ref float height, ref float width, ScrollerDataType type, ArrayList infoList = null)  | 
|         {  | 
|             if (type == ScrollerDataType.Tail)  | 
|             {  | 
|                 destSysText.SetExtenalData(infoList);  | 
|                 destSysText.text = content;  | 
|                 width = destSysText.preferredWidth;  | 
|                 height += Mathf.Max(0, destSysText.preferredHeight - 23);  | 
|             }  | 
|             else  | 
|             {  | 
|                 destText.SetExtenalData(infoList);  | 
|                 destText.text = content;  | 
|                 width = destText.preferredWidth;  | 
|                 height += Mathf.Max(0, destText.preferredHeight - 30);  | 
|             }  | 
|         }  | 
|         #endregion  | 
|   | 
|         private void OnEnable()  | 
|         {  | 
|             ChatCtrl.OnRefreshPteChat += OnRefreshPteChat;  | 
|             RefreshChatInfo();  | 
|             open = true;  | 
|             ChatCtrl.Inst.lockUpdate = true;  | 
|             OnSetLock();  | 
|         }  | 
|   | 
|         public void OnSetLock()  | 
|         {  | 
|             m_Controller.lockType = ChatCtrl.Inst.lockUpdate ? EnhanceLockType.LockVerticalBottom : EnhanceLockType.KeepVertical;  | 
|             if (ChatCtrl.Inst.lockUpdate)  | 
|             {  | 
|                 m_Controller.ResetScrollPos();  | 
|             }  | 
|         }  | 
|   | 
|         private void OnDisable()  | 
|         {  | 
|             ChatCtrl.OnRefreshPteChat -= OnRefreshPteChat;  | 
|             open = false;  | 
|         }  | 
|   | 
|         public void RefreshChatInfo()  | 
|         {  | 
|             int id = ChatCtrl.Inst.PteChatID;  | 
|             chatList = ChatCtrl.Inst.GetChatInfo(id);  | 
|             m_Controller.Refresh();  | 
|             if (chatList != null)  | 
|             {  | 
|                 for (int i = 0; i < chatList.Count; i++)  | 
|                 {  | 
|                     if (chatList[i].soundTick != 0)  | 
|                     {  | 
|                         m_Controller.AddCell(ScrollerDataType.Extra2, i);  | 
|                         continue;  | 
|                     }  | 
|                     if (Regex.IsMatch(chatList[i].content, ChatCtrl.KILL_IDENTIFY))  | 
|                     {  | 
|                         m_Controller.AddCell(ScrollerDataType.Tail, i);  | 
|                         continue;  | 
|                     }  | 
|                     if (chatList[i].player == PlayerDatas.Instance.baseData.PlayerID)  | 
|                     {  | 
|                         m_Controller.AddCell(ScrollerDataType.Header, i);  | 
|                     }  | 
|                     else  | 
|                     {  | 
|                         m_Controller.AddCell(ScrollerDataType.Normal, i);  | 
|                     }  | 
|                 }  | 
|             }  | 
|             m_Controller.Restart();  | 
|         }  | 
|   | 
|         private void OnRefreshPteChat(ChatFriendData data)  | 
|         {  | 
|             if (data == null)  | 
|             {  | 
|                 return;  | 
|             }  | 
|             if (data.toPlayer != ChatCtrl.Inst.PteChatID && data.player != ChatCtrl.Inst.PteChatID)  | 
|             {  | 
|                 return;  | 
|             }  | 
|             if (data.player == PlayerDatas.Instance.baseData.PlayerID)  | 
|             {  | 
|   | 
|             }  | 
|             RefreshChatInfo();  | 
|         }  | 
|     }  | 
|   | 
| }  | 
|   | 
|   | 
|   |