OSDN Git Service

Complete rewrite of the config system
[radegast/radegast.git] / Radegast / GUI / Consoles / GroupIMTabWindow.cs
1 // \r
2 // Radegast Metaverse Client\r
3 // Copyright (c) 2009, Radegast Development Team\r
4 // All rights reserved.\r
5 // \r
6 // Redistribution and use in source and binary forms, with or without\r
7 // modification, are permitted provided that the following conditions are met:\r
8 // \r
9 //     * Redistributions of source code must retain the above copyright notice,\r
10 //       this list of conditions and the following disclaimer.\r
11 //     * Redistributions in binary form must reproduce the above copyright\r
12 //       notice, this list of conditions and the following disclaimer in the\r
13 //       documentation and/or other materials provided with the distribution.\r
14 //     * Neither the name of the application "Radegast", nor the names of its\r
15 //       contributors may be used to endorse or promote products derived from\r
16 //       this software without specific prior written permission.\r
17 // \r
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"\r
19 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
20 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r
21 // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\r
22 // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r
23 // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\r
24 // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\r
25 // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\r
26 // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
27 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
28 //\r
29 // $Id$\r
30 //\r
31 using System;\r
32 using System.Drawing;\r
33 using System.Windows.Forms;\r
34 using System.Threading;\r
35 using Radegast.Netcom;\r
36 using OpenMetaverse;\r
37 \r
38 namespace Radegast\r
39 {\r
40     public partial class GroupIMTabWindow : UserControl\r
41     {\r
42         private RadegastInstance instance;\r
43         private GridClient client { get { return instance.Client; } }\r
44         private RadegastNetcom netcom { get { return instance.Netcom; } }\r
45         private UUID session;\r
46         private IMTextManager textManager;\r
47 \r
48         ManualResetEvent WaitForSessionStart = new ManualResetEvent(false);\r
49 \r
50         public GroupIMTabWindow(RadegastInstance instance, UUID session, string sessionName)\r
51         {\r
52             InitializeComponent();\r
53             Disposed += new EventHandler(IMTabWindow_Disposed);\r
54 \r
55             this.instance = instance;\r
56             this.session = session;\r
57 \r
58             textManager = new IMTextManager(this.instance, new RichTextBoxPrinter(rtbIMText), this.session, sessionName);\r
59             \r
60             // Callbacks\r
61             client.Self.OnGroupChatJoin += new AgentManager.GroupChatJoinedCallback(Self_OnGroupChatJoin);\r
62 \r
63             client.Self.RequestJoinGroupChat(session);\r
64         }\r
65 \r
66         private void IMTabWindow_Disposed(object sender, EventArgs e)\r
67         {\r
68             client.Self.OnGroupChatJoin -= new AgentManager.GroupChatJoinedCallback(Self_OnGroupChatJoin);\r
69             CleanUp();\r
70         }\r
71 \r
72 \r
73         void Self_OnGroupChatJoin(UUID groupChatSessionID, string sessionName, UUID tmpSessionID, bool success)\r
74         {\r
75             if (groupChatSessionID != session && tmpSessionID != session) {\r
76                 return;\r
77             }\r
78 \r
79             if (InvokeRequired) {\r
80                 Invoke(new MethodInvoker(\r
81                     delegate()\r
82                     {\r
83                         Self_OnGroupChatJoin(groupChatSessionID, sessionName, tmpSessionID, success);\r
84                     }\r
85                     )\r
86                 );\r
87                 return;\r
88             }\r
89             if (success) {\r
90                 textManager.TextPrinter.PrintTextLine("Join Group Chat Success!", Color.Green);\r
91                 WaitForSessionStart.Set();\r
92             } else {\r
93                 textManager.TextPrinter.PrintTextLine("Join Group Chat failed.", Color.Red);\r
94             }\r
95         }\r
96 \r
97         private void AddNetcomEvents()\r
98         {\r
99             netcom.ClientLoginStatus += new EventHandler<ClientLoginEventArgs>(netcom_ClientLoginStatus);\r
100             netcom.ClientDisconnected += new EventHandler<ClientDisconnectEventArgs>(netcom_ClientDisconnected);\r
101         }\r
102 \r
103         private void netcom_ClientLoginStatus(object sender, ClientLoginEventArgs e)\r
104         {\r
105             if (e.Status != LoginStatus.Success) return;\r
106 \r
107             RefreshControls();\r
108         }\r
109 \r
110         private void netcom_ClientDisconnected(object sender, ClientDisconnectEventArgs e)\r
111         {\r
112             RefreshControls();\r
113         }\r
114 \r
115         public void CleanUp()\r
116         {\r
117             textManager.CleanUp();\r
118             textManager = null;\r
119         }\r
120 \r
121         private void btnSend_Click(object sender, EventArgs e)\r
122         {\r
123             //netcom.SendInstantMessage(cbgInput.Text, target, session);\r
124             this.ClearIMInput();\r
125         }\r
126 \r
127         private void cbxInput_TextChanged(object sender, EventArgs e)\r
128         {\r
129             RefreshControls();\r
130         }\r
131 \r
132         private void RefreshControls()\r
133         {\r
134             if (!netcom.IsLoggedIn)\r
135             {\r
136                 cbgInput.Enabled = false;\r
137                 btnSend.Enabled = false;\r
138                 return;\r
139             }\r
140 \r
141         }\r
142 \r
143         private void cbxInput_KeyUp(object sender, KeyEventArgs e)\r
144         {\r
145             if (e.KeyCode != Keys.Enter) return;\r
146             e.SuppressKeyPress = true;\r
147             if (cbgInput.Text.Length == 0) return;\r
148 \r
149             string message = cbgInput.Text;\r
150             if (message.Length > 1023) message = message.Remove(1023);\r
151 \r
152             if (!client.Self.GroupChatSessions.ContainsKey(session)) {\r
153                 WaitForSessionStart.Reset();\r
154                 client.Self.RequestJoinGroupChat(session);\r
155             } else {\r
156                 WaitForSessionStart.Set();\r
157             }\r
158 \r
159             if (WaitForSessionStart.WaitOne(10000, false)) {\r
160                 client.Self.InstantMessageGroup(session, message);\r
161             } else {\r
162                 textManager.TextPrinter.PrintTextLine("Cannot send group IM.", Color.Red);\r
163             }\r
164             this.ClearIMInput();\r
165         }\r
166 \r
167         private void ClearIMInput()\r
168         {\r
169             cbgInput.Items.Add(cbgInput.Text);\r
170             cbgInput.Text = string.Empty;\r
171         }\r
172 \r
173         public void SelectIMInput()\r
174         {\r
175             cbgInput.Select();\r
176         }\r
177 \r
178         private void rtbIMText_LinkClicked(object sender, LinkClickedEventArgs e)\r
179         {\r
180             instance.MainForm.ProcessLink(e.LinkText);\r
181         }\r
182 \r
183         private void cbxInput_KeyDown(object sender, KeyEventArgs e)\r
184         {\r
185             if (e.KeyCode == Keys.Enter) e.SuppressKeyPress = true;\r
186         }\r
187 \r
188         public UUID SessionId\r
189         {\r
190             get { return session; }\r
191             set { session = value; }\r
192         }\r
193 \r
194         public IMTextManager TextManager\r
195         {\r
196             get { return textManager; }\r
197             set { textManager = value; }\r
198         }\r
199     }\r
200 }\r