using System; using System.Collections; using Server; using Server.HuePickers; using Server.Gumps; using Knives.Utils; namespace Knives.Chat3 { public class FriendsGump : GumpPlus { public static void SendTo(Mobile m) { SendTo(m, false); } public static void SendTo(Mobile m, bool min) { General.ClearGump(m, typeof(FriendsGump)); new FriendsGump(m, min); } #region Class Definitions private int c_Page, c_Height, c_Width; private Mobile c_Profile; private bool c_Minimized, c_Options, c_Search; private string c_TxtSearch, c_CharSearch; public Data GetData { get { return Data.GetData(Owner); } } #endregion #region Constructors public FriendsGump(Mobile m, bool min) : base(m, 250, 50) { c_Minimized = min; if (c_Minimized) Override = false; c_Page = 0; c_TxtSearch = ""; c_CharSearch = ""; NewGump(); } #endregion #region Methods protected override void BuildGump() { Owner.CloseGump(typeof(FriendsGump)); c_Height = 80 + (GetData.FriendsPP * 20); c_Width = 160; if (c_Minimized) AddImage(0, 0, 0x9C5); else AddBackground(0, 0, c_Width, c_Height, 0x1400); AddButton(0, 0, 0x13A8, 0x13A8, "Minimize", new TimerCallback(Minimize)); if ( c_Minimized ) AddLabel(1, -3, 0x47E, "^"); else AddLabel(2, -9, 0x47E, "_"); if (c_Minimized) DisplayMin(); else DisplayList(); } private void DisplayMin() { AddHtml(60, 1, 80, 21, HTML.White + General.Local(19 + (int)GetData.Status), false, false, false); AddButton(42, 5, 0x2716, 0x2716, "Status", new TimerCallback(Status)); if (GetData.NewMsg()) AddButton(20, 2, 0x1523, 0x1523, "Check Message", new TimerCallback(CheckMsg)); } private ArrayList BuildList() { ArrayList list = new ArrayList(); if (c_TxtSearch == "" && c_CharSearch == "") { list = new ArrayList( GetData.Friends ); foreach( Message msg in GetData.Messages ) if (!msg.Read && !list.Contains(msg.From)) list.Add(msg.From); list.Sort(new InternalSort(GetData)); return list; } foreach( Mobile m in GetData.Friends ) if( m.Name.ToLower().IndexOf(c_TxtSearch.ToLower()) != -1 || m.Name.ToLower().IndexOf(c_CharSearch.ToLower()) == 0 ) list.Add(m); list.Sort(new InternalSort(GetData)); return list; } private void DisplayList() { if (c_Profile != null && !GetData.Friends.Contains(c_Profile)) c_Profile = null; if (c_Profile != null) Chat3.Profile.Insert(c_Profile, this, c_Width+20, 0); if (c_Search) SearchTab(); if (c_Options) OptionsTab(); ArrayList list = BuildList(); int perpage = GetData.FriendsPP; int y = 10; if ( perpage*c_Page > list.Count || c_Page < 0 ) c_Page = 0; AddImage(8, y - 1, 0x9C5); AddHtml(10, y, c_Width - 20, 21, HTML.White + "
" + General.Local(32), false, false, false); y += 20; if (perpage*(c_Page+1) < list.Count) AddButton(c_Width / 2 - 10, c_Height - 25, 0x25E8, 0x25E9, "Page Up", new TimerCallback(PageUp)); if (c_Page != 0) AddButton(c_Width/2-10, 30, 0x25E4, 0x25E5, "Page Down", new TimerCallback(PageDown)); AddButton(10, 32, 0x983, 0x983, "PerPage Down", new TimerCallback(PerPageDown)); AddButton(20, 32, 0x985, 0x985, "PerPage Up", new TimerCallback(PerPageUp)); AddButton(6, c_Height - 30, 0x768, 0x768, "Options", new TimerCallback(Options)); AddButton(22, c_Height - 30, 0x768, 0x768, "Search", new TimerCallback(Search)); AddLabel(11, c_Height - 30, c_Options ? 0x34 : 0x47E, "O"); AddLabel(27, c_Height - 30, c_Search ? 0x34 : 0x47E, "S"); AddHtml(c_Width-53, c_Height-29, 80, 21, HTML.White + General.Local(19+(int)GetData.Status), false, false); AddButton(c_Width-70, c_Height-26, 0x2716, 0x2716, "Status", new TimerCallback(Status)); try { for (int i = perpage * c_Page; i < list.Count && i < perpage * (c_Page + 1); ++i) { AddHtml(45, y += 20, 90, 21, HTML.White + ((Mobile)list[i]).Name + (Data.GetData((Mobile)list[i]).Status != OnlineStatus.Online ? " (" + General.Local(19 + (int)Data.GetData((Mobile)list[i]).Status) + ")" : ""), false, false, false); AddButton(30, y + 3, list[i] == c_Profile ? 0x939 : 0x2716, list[i] == c_Profile ? 0x939 : 0x2716, "Profile", new TimerStateCallback(Profile), (Mobile)list[i]); if (GetData.NewMsgFrom((Mobile)list[i])) AddButton(10, y, 0x1523, 0x1523, "Check Message From", new TimerStateCallback(CheckMsgFrom), (Mobile)list[i]); } } catch { AddHtml(45, y += 20, 80, 21, HTML.White + "!!!", false, false); } } private void SearchTab() { AddBackground(c_Width + 20, 10, 130, 40, 0x1400); AddImageTiled(c_Width + 30, 20, 90, 21, 0xBBC); AddTextField(c_Width + 30, 20, 90, 21, 0x480, 1, c_TxtSearch); AddButton(c_Width + 127, 24, 0x2716, 0x2716, "Text Search", new TimerCallback(TxtSearch)); char[] chars = new char[] { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' }; int x = c_Width + 17; int y = 51; foreach (char c in chars) { AddButton(x += 20, y, 0x2344, 0x2344, "Char Search", new TimerStateCallback(CharSearch), c.ToString()); AddHtml(x + 6, y, 20, 20, (c_CharSearch == c.ToString() ? HTML.Green : HTML.White) + c, false, false, false); if (x >= c_Width + 115) { x = c_Width + 17; y += 20; } } } private void OptionsTab() { int x = c_Width+20; AddHtml(x, 10, 300, 21, HTML.White + "
" + General.Local(18), false, false); int y = 10; if (GetData.GlobalAccess && GetData.Global) { AddHtml(x + 120, y+=25, 120, 21, HTML.Red + General.Local(26), false, false, false); AddButton(x + 70, y, GetData.GlobalM ? 0x2343 : 0x2342, GetData.GlobalM ? 0x2343 : 0x2342, "Global Messages", new TimerCallback(GlobalMsg)); AddImage(x + 90, y, 0x2342, GetData.GlobalMC); AddButton(x + 94, y + 4, 0x2716, 0x2716, "GlobalMsgColor", new TimerCallback(GlobalMsgColor)); } AddHtml(x + 60, y += 25, 220, 21, HTML.White + General.Local(24), false, false); AddButton(x + 30, y, GetData.FriendsOnly ? 0x2343 : 0x2342, GetData.FriendsOnly ? 0x2343 : 0x2342, "Friends Only", new TimerCallback(FriendsOnly)); AddHtml(x + 60, y += 20, 220, 21, HTML.White + General.Local(25), false, false); AddButton(x + 30, y, GetData.ByRequest ? 0x2343 : 0x2342, GetData.ByRequest ? 0x2343 : 0x2342, "Friend Request", new TimerCallback(FriendRequest)); AddHtml(x + 60, y+=20, 220, 21, HTML.White + General.Local(30), false, false); AddButton(x + 30, y, GetData.FriendAlert ? 0x2343 : 0x2342, GetData.FriendAlert ? 0x2343 : 0x2342, "Friend Alert", new TimerCallback(FriendAlert)); AddHtml(x + 60, y += 20, 220, 21, HTML.White + General.Local(196), false, false); AddButton(x + 30, y, GetData.ReadReceipt ? 0x2343 : 0x2342, GetData.ReadReceipt ? 0x2343 : 0x2342, "Read Receipt", new TimerCallback(ReadReceipt)); AddHtml(x + 30, y += 25, 170, 21, HTML.White + General.Local(29), false, false); AddImageTiled(x + 175, y, 70, 21, 0xBBA); AddTextField(x + 175, y, 70, 21, 0x480, 2, GetData.FriendsSpeech); AddButton(x + 255, y + 3, 0x2716, 0x2716, "Submit Speech", new TimerCallback(SubmitSpeech)); AddHtml(x + 60, y += 23, 220, 21, HTML.White + General.Local(27), false, false); AddButton(x + 30, y, GetData.MsgSound ? 0x2343 : 0x2342, GetData.MsgSound ? 0x2343 : 0x2342, "Message Sound", new TimerCallback(MessageSound)); if (GetData.MsgSound) { AddHtml(x, y+=25, 300, 21, HTML.White + "
" + General.Local(28), false, false); AddImageTiled(x+125, y+=25, 50, 21, 0xBBA); AddTextField(x+125, y, 50, 21, 0x480, 1, GetData.DefaultSound.ToString()); AddButton(x + 185, y+3, 0x15E1, 0x15E5, "Play Sound", new TimerCallback(PlaySound)); AddButton(x + 110, y, 0x983, 0x983, "Sound Up", new TimerCallback(SoundUp)); AddButton(x + 110, y+10, 0x985, 0x985, "Sound Down", new TimerCallback(SoundDown)); } Entries.Insert(0, new GumpBackground(x, 0, 300, y+40, 0x1400)); } private string GetColor(Mobile m) { if (Owner == m) return HTML.Yellow; if (Data.GetData(m).Banned) return HTML.Red; if (GetData.Ignores.Contains(m)) return HTML.AshRed; if (GetData.Global && GetData.GIgnores.Contains(m)) return HTML.AshRed; if (!GetData.Global && GetData.GListens.Contains(m)) return HTML.Blue; if (m.NetState == null) return HTML.DarkGray; if (Data.GetData(m).Status == OnlineStatus.Away || Data.GetData(m).Status == OnlineStatus.Busy) return HTML.Gray; if (m.AccessLevel > AccessLevel.Player) return HTML.LightPurple; if (m.Guild != null && (m.Guild == Owner.Guild)) return HTML.Green; return HTML.White; } protected override void OnClose() { if (c_Profile != null || c_Search || c_Options) { c_Profile = null; c_Options = false; c_Search = false; NewGump(); return; } } #endregion #region Responses private void Minimize() { c_Minimized = !c_Minimized; if (c_Minimized) Override = false; else Override = true; NewGump(); } private void PageUp() { c_Page++; NewGump(); } private void PageDown() { c_Page--; NewGump(); } private void PerPageUp() { GetData.FriendsPP++; NewGump(); } private void PerPageDown() { GetData.FriendsPP--; NewGump(); } private void Search() { c_Search = !c_Search; c_Profile = null; c_Options = false; NewGump(); } private void Options() { c_Options = !c_Options; c_Profile = null; c_Search = false; NewGump(); } private void CheckMsgFrom(object o) { if (!(o is Mobile)) return; GetData.CheckMsgFrom((Mobile)o); General.RefreshGump(Owner, typeof(MailGump)); NewGump(); } private void CheckMsg() { GetData.CheckMsg(); General.RefreshGump(Owner, typeof(MailGump)); NewGump(); } private void Profile(object o) { if (!(o is Mobile)) return; if (c_Profile == o) c_Profile = null; else c_Profile = (Mobile)o; c_Options = false; c_Search = false; NewGump(); } private void TxtSearch() { c_TxtSearch = GetTextField(1); c_CharSearch = ""; NewGump(); } private void CharSearch(object o) { if (!(o is string)) return; if (c_CharSearch == o.ToString()) c_CharSearch = ""; else c_CharSearch = o.ToString(); c_TxtSearch = ""; NewGump(); } private void Status() { new StatusGump(Owner, this); } private void FriendsOnly() { GetData.FriendsOnly = !GetData.FriendsOnly; NewGump(); } private void FriendRequest() { GetData.ByRequest = !GetData.ByRequest; NewGump(); } private void FriendAlert() { GetData.FriendAlert = !GetData.FriendAlert; NewGump(); } private void ReadReceipt() { GetData.ReadReceipt = !GetData.ReadReceipt; NewGump(); } private void GlobalMsg() { GetData.GlobalM = !GetData.GlobalM; NewGump(); } private void GlobalMsgColor() { Owner.SendHuePicker(new InternalPicker(this)); } private void MessageSound() { GetData.MsgSound = !GetData.MsgSound; NewGump(); } private void PlaySound() { GetData.DefaultSound = Utility.ToInt32(GetTextField(1)); Owner.SendSound(GetData.DefaultSound); NewGump(); } private void SoundUp() { GetData.DefaultSound = GetData.DefaultSound+1; NewGump(); } private void SoundDown() { GetData.DefaultSound = GetData.DefaultSound-1; NewGump(); } private void SubmitSpeech() { GetData.FriendsSpeech = GetTextField(2); if (GetData.FriendsSpeech != "") Owner.SendMessage(GetData.SystemC, General.Local(70) + " \"" + GetData.FriendsSpeech + "\""); else Owner.SendMessage(GetData.SystemC, General.Local(71)); NewGump(); } #endregion #region Internal Classes private class InternalSort : IComparer { private Data c_Data; public InternalSort( Data data ) { c_Data = data; } public int Compare(object x, object y) { if (x == null && y == null) return 0; if (x == null || !(x is Mobile)) return -1; if (y == null || !(y is Mobile)) return 1; Mobile a = (Mobile)x; Mobile b = (Mobile)y; if (c_Data.NewMsgFrom(a) && !c_Data.NewMsgFrom(b)) return 1; if (c_Data.NewMsgFrom(b) && !c_Data.NewMsgFrom(a)) return -1; if (a.NetState != null && b.NetState == null) return 1; if (a.NetState == null && b.NetState != null) return -1; return Insensitive.Compare(a.Name, b.Name); } } private class StatusGump : GumpPlus { private GumpPlus c_Gump; public StatusGump(Mobile m, GumpPlus g) : base(m, 100, 100) { m.CloseGump(typeof(StatusGump)); c_Gump = g; NewGump(); } protected override void BuildGump() { AddBackground(0, 0, 100, 100, 0x1400); int y = 20; AddHtml(40, y, 80, 21, HTML.White + General.Local(19), false, false, false); AddButton(20, y + 2, 0x2716, 0x2716, "Online", new TimerStateCallback(Status), OnlineStatus.Online); AddHtml(40, y += 20, 80, 21, HTML.White + General.Local(20), false, false, false); AddButton(20, y + 2, 0x2716, 0x2716, "Away", new TimerStateCallback(Status), OnlineStatus.Away); AddHtml(40, y += 20, 80, 21, HTML.White + General.Local(21), false, false, false); AddButton(20, y + 2, 0x2716, 0x2716, "Busy", new TimerStateCallback(Status), OnlineStatus.Busy); AddHtml(40, y += 20, 80, 21, HTML.White + General.Local(22), false, false, false); AddButton(20, y + 2, 0x2716, 0x2716, "Hidden", new TimerStateCallback(Status), OnlineStatus.Hidden); } private void Status(object o) { if (!(o is OnlineStatus)) return; Data.GetData(Owner).Status = (OnlineStatus)o; if ((OnlineStatus)o == OnlineStatus.Away || (OnlineStatus)o == OnlineStatus.Busy) new AwayGump(Owner, c_Gump); else c_Gump.NewGump(); } protected override void OnClose() { c_Gump.NewGump(); } } private class AwayGump : GumpPlus { private GumpPlus c_Gump; public AwayGump(Mobile m, GumpPlus g) : base(m, 100, 100) { m.CloseGump(typeof(AwayGump)); c_Gump = g; NewGump(); } protected override void BuildGump() { AddBackground(0, 0, 200, 200, 0x1400); AddHtml(0, 10, 200, 21, HTML.White + "
" + General.Local(12), false, false); AddImageTiled(10, 30, 180, 120, 0xBBC); AddTextField(10, 30, 180, 120, 0x480, 0, Data.GetData(Owner).AwayMsg); AddButton(60, 160, 0xFB1, 0xFB3, "Clear", new TimerCallback(ClearMsg)); AddButton(120, 160, 0xFB7, 0xFB9, "Submit", new TimerCallback(Submit)); } private void ClearMsg() { Data.GetData(Owner).AwayMsg = ""; NewGump(); } private void Submit() { Data.GetData(Owner).AwayMsg = GetTextField(0); c_Gump.NewGump(); } protected override void OnClose() { c_Gump.NewGump(); } } private class InternalPicker : HuePicker { private GumpPlus c_Gump; public InternalPicker(GumpPlus g) : base(0x1018) { c_Gump = g; } public override void OnResponse(int hue) { Data.GetData(c_Gump.Owner).GlobalMC = hue; c_Gump.NewGump(); } } #endregion } }