OSDN Git Service

Initial check in
[radegast/radegast.git] / Radegast / GUI / Consoles / GroupIMTabWindow.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.ComponentModel;\r
4 using System.Drawing;\r
5 using System.Data;\r
6 using System.Text;\r
7 using System.Windows.Forms;\r
8 using System.Threading;\r
9 using RadegastNc;\r
10 using OpenMetaverse;\r
11 \r
12 namespace Radegast\r
13 {\r
14     public partial class GroupIMTabWindow : UserControl\r
15     {\r
16         private RadegastInstance instance;\r
17         private RadegastNetcom netcom;\r
18         private UUID session;\r
19         private IMTextManager textManager;\r
20         private GridClient client;\r
21         private AgentManager.GroupChatJoinedCallback grpJoinCallback;\r
22 \r
23         ManualResetEvent WaitForSessionStart = new ManualResetEvent(false);\r
24 \r
25         public GroupIMTabWindow(RadegastInstance instance, UUID session)\r
26         {\r
27             InitializeComponent();\r
28 \r
29             this.instance = instance;\r
30             this.client = instance.Client;\r
31             netcom = this.instance.Netcom;\r
32 \r
33             this.session = session;\r
34 \r
35             textManager = new IMTextManager(this.instance, new RichTextBoxPrinter(rtbIMText), this.session);\r
36             this.Disposed += new EventHandler(IMTabWindow_Disposed);\r
37             ApplyConfig(this.instance.Config.CurrentConfig);\r
38             this.instance.Config.ConfigApplied += new EventHandler<ConfigAppliedEventArgs>(Config_ConfigApplied);\r
39             client.Self.RequestJoinGroupChat(session);\r
40             grpJoinCallback = new AgentManager.GroupChatJoinedCallback(Self_OnGroupChatJoin);\r
41             client.Self.OnGroupChatJoin += grpJoinCallback;\r
42 \r
43         }\r
44 \r
45         void Self_OnGroupChatJoin(UUID groupChatSessionID, string sessionName, UUID tmpSessionID, bool success)\r
46         {\r
47             if (groupChatSessionID != session && tmpSessionID != session) {\r
48                 return;\r
49             }\r
50 \r
51             if (InvokeRequired) {\r
52                 Invoke(new MethodInvoker(\r
53                     delegate()\r
54                     {\r
55                         Self_OnGroupChatJoin(groupChatSessionID, sessionName, tmpSessionID, success);\r
56                     }\r
57                     )\r
58                 );\r
59                 return;\r
60             }\r
61             if (success) {\r
62                 textManager.TextPrinter.PrintTextLine("Join Group Chat Success!", Color.Green);\r
63                 WaitForSessionStart.Set();\r
64             } else {\r
65                 textManager.TextPrinter.PrintTextLine("Join Group Chat failed.", Color.Red);\r
66             }\r
67         }\r
68 \r
69         private void Config_ConfigApplied(object sender, ConfigAppliedEventArgs e)\r
70         {\r
71             ApplyConfig(e.AppliedConfig);\r
72         }\r
73 \r
74         private void ApplyConfig(Config config)\r
75         {\r
76             /*\r
77             if (config.InterfaceStyle == 0) //System\r
78                 toolStrip1.RenderMode = ToolStripRenderMode.System;\r
79             else if (config.InterfaceStyle == 1) //Office 2003\r
80                 toolStrip1.RenderMode = ToolStripRenderMode.ManagerRenderMode;\r
81              */\r
82         }\r
83 \r
84         private void AddNetcomEvents()\r
85         {\r
86             netcom.ClientLoginStatus += new EventHandler<ClientLoginEventArgs>(netcom_ClientLoginStatus);\r
87             netcom.ClientDisconnected += new EventHandler<ClientDisconnectEventArgs>(netcom_ClientDisconnected);\r
88         }\r
89 \r
90         private void netcom_ClientLoginStatus(object sender, ClientLoginEventArgs e)\r
91         {\r
92             if (e.Status != LoginStatus.Success) return;\r
93 \r
94             RefreshControls();\r
95         }\r
96 \r
97         private void netcom_ClientDisconnected(object sender, ClientDisconnectEventArgs e)\r
98         {\r
99             RefreshControls();\r
100         }\r
101 \r
102         private void IMTabWindow_Disposed(object sender, EventArgs e)\r
103         {\r
104             CleanUp();\r
105         }\r
106 \r
107         public void CleanUp()\r
108         {\r
109             if (grpJoinCallback != null) {\r
110                 client.Self.OnGroupChatJoin -= grpJoinCallback;\r
111             }\r
112             textManager.CleanUp();\r
113             textManager = null;\r
114         }\r
115 \r
116         private void btnSend_Click(object sender, EventArgs e)\r
117         {\r
118             //netcom.SendInstantMessage(cbgInput.Text, target, session);\r
119             this.ClearIMInput();\r
120         }\r
121 \r
122         private void cbxInput_TextChanged(object sender, EventArgs e)\r
123         {\r
124             RefreshControls();\r
125         }\r
126 \r
127         private void RefreshControls()\r
128         {\r
129             if (!netcom.IsLoggedIn)\r
130             {\r
131                 cbgInput.Enabled = false;\r
132                 btnSend.Enabled = false;\r
133                 return;\r
134             }\r
135 \r
136         }\r
137 \r
138         private void cbxInput_KeyUp(object sender, KeyEventArgs e)\r
139         {\r
140             if (e.KeyCode != Keys.Enter) return;\r
141             e.SuppressKeyPress = true;\r
142             if (cbgInput.Text.Length == 0) return;\r
143 \r
144             string message = cbgInput.Text;\r
145             if (message.Length > 1023) message = message.Remove(1023);\r
146 \r
147             if (!client.Self.GroupChatSessions.ContainsKey(session)) {\r
148                 WaitForSessionStart.Reset();\r
149                 client.Self.RequestJoinGroupChat(session);\r
150             } else {\r
151                 WaitForSessionStart.Set();\r
152             }\r
153 \r
154             if (WaitForSessionStart.WaitOne(10000, false)) {\r
155                 client.Self.InstantMessageGroup(session, message);\r
156             } else {\r
157                 textManager.TextPrinter.PrintTextLine("Cannot send group IM.", Color.Red);\r
158             }\r
159             this.ClearIMInput();\r
160         }\r
161 \r
162         private void ClearIMInput()\r
163         {\r
164             cbgInput.Items.Add(cbgInput.Text);\r
165             cbgInput.Text = string.Empty;\r
166         }\r
167 \r
168         public void SelectIMInput()\r
169         {\r
170             cbgInput.Select();\r
171         }\r
172 \r
173         private void rtbIMText_LinkClicked(object sender, LinkClickedEventArgs e)\r
174         {\r
175             if (e.LinkText.StartsWith("http://") || e.LinkText.StartsWith("ftp://"))\r
176                 System.Diagnostics.Process.Start(e.LinkText);\r
177             else\r
178                 System.Diagnostics.Process.Start("http://" + e.LinkText);\r
179         }\r
180 \r
181         private void cbxInput_KeyDown(object sender, KeyEventArgs e)\r
182         {\r
183             if (e.KeyCode == Keys.Enter) e.SuppressKeyPress = true;\r
184         }\r
185 \r
186         public UUID SessionId\r
187         {\r
188             get { return session; }\r
189             set { session = value; }\r
190         }\r
191 \r
192         public IMTextManager TextManager\r
193         {\r
194             get { return textManager; }\r
195             set { textManager = value; }\r
196         }\r
197     }\r
198 }\r