OSDN Git Service

De-register setting event hooks.
[radegast/radegast.git] / Radegast / GUI / Consoles / IMTabWindow.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.Windows.Forms;\r
33 using Radegast.Netcom;\r
34 using OpenMetaverse;\r
35 \r
36 namespace Radegast\r
37 {\r
38     public partial class IMTabWindow : UserControl\r
39     {\r
40         private RadegastInstance instance;\r
41         private RadegastNetcom netcom { get { return instance.Netcom; } }\r
42         private UUID target;\r
43         private UUID session;\r
44         private string toName;\r
45         private IMTextManager textManager;\r
46         private bool typing = false;\r
47 \r
48         public IMTabWindow(RadegastInstance instance, UUID target, UUID session, string toName)\r
49         {\r
50             InitializeComponent();\r
51             Disposed += new EventHandler(IMTabWindow_Disposed);\r
52             \r
53             this.instance = instance;\r
54 \r
55             this.target = target;\r
56             this.session = session;\r
57             this.toName = toName;\r
58 \r
59             textManager = new IMTextManager(this.instance, new RichTextBoxPrinter(rtbIMText), IMTextManagerType.Agent, this.session, toName);\r
60 \r
61             AddNetcomEvents();\r
62 \r
63             UpdateFontSize();\r
64         }\r
65 \r
66         private void IMTabWindow_Disposed(object sender, EventArgs e)\r
67         {\r
68             CleanUp();\r
69         }\r
70 \r
71         private void AddNetcomEvents()\r
72         {\r
73             netcom.ClientLoginStatus += new EventHandler<LoginProgressEventArgs>(netcom_ClientLoginStatus);\r
74             netcom.ClientDisconnected += new EventHandler<DisconnectedEventArgs>(netcom_ClientDisconnected);\r
75             instance.GlobalSettings.OnSettingChanged += new Settings.SettingChangedCallback(GlobalSettings_OnSettingChanged);\r
76         }\r
77 \r
78         private void RemoveNetcomEvents()\r
79         {\r
80             netcom.ClientLoginStatus -= new EventHandler<LoginProgressEventArgs>(netcom_ClientLoginStatus);\r
81             netcom.ClientDisconnected -= new EventHandler<DisconnectedEventArgs>(netcom_ClientDisconnected);\r
82             instance.GlobalSettings.OnSettingChanged -= new Settings.SettingChangedCallback(GlobalSettings_OnSettingChanged);\r
83         }\r
84 \r
85         void UpdateFontSize()\r
86         {\r
87             float size = (float)instance.GlobalSettings["chat_font_size"].AsReal();\r
88             cbxInput.Font = ChatConsole.ChangeFontSize(cbxInput.Font, size);\r
89             rtbIMText.Font = ChatConsole.ChangeFontSize(rtbIMText.Font, size);\r
90             textManager.ReprintAllText();\r
91         }\r
92 \r
93         void GlobalSettings_OnSettingChanged(object sender, SettingsEventArgs e)\r
94         {\r
95             if (e.Key == "chat_font_size")\r
96                 UpdateFontSize();\r
97         }\r
98 \r
99         private void netcom_ClientLoginStatus(object sender, LoginProgressEventArgs e)\r
100         {\r
101             if (e.Status != LoginStatus.Success) return;\r
102 \r
103             RefreshControls();\r
104         }\r
105 \r
106         private void netcom_ClientDisconnected(object sender, DisconnectedEventArgs e)\r
107         {\r
108             RefreshControls();\r
109         }\r
110 \r
111         public void CleanUp()\r
112         {\r
113             instance.TabConsole.RemoveTab(SessionId.ToString());\r
114             textManager.CleanUp();\r
115             textManager = null;\r
116             RemoveNetcomEvents();\r
117         }\r
118 \r
119         private void btnSend_Click(object sender, EventArgs e)\r
120         {\r
121             ProcessInput();\r
122         }\r
123 \r
124         private void cbxInput_TextChanged(object sender, EventArgs e)\r
125         {\r
126             RefreshControls();\r
127         }\r
128 \r
129         private void RefreshControls()\r
130         {\r
131             if (!netcom.IsLoggedIn)\r
132             {\r
133                 cbxInput.Enabled = false;\r
134                 btnSend.Enabled = false;\r
135                 return;\r
136             }\r
137 \r
138             cbxInput.Enabled = true;\r
139 \r
140             if (cbxInput.Text.Length > 0)\r
141             {\r
142                 btnSend.Enabled = true;\r
143 \r
144                 if (!typing)\r
145                 {\r
146                     netcom.SendIMStartTyping(target, session);\r
147                     typing = true;\r
148                 }\r
149             }\r
150             else\r
151             {\r
152                 btnSend.Enabled = false;\r
153                 netcom.SendIMStopTyping(target, session);\r
154                 typing = false;\r
155             }\r
156         }\r
157 \r
158         private void ProcessInput()\r
159         {\r
160             if (cbxInput.Text.Length == 0) return;\r
161             string msg = cbxInput.Text.Replace(ChatInputBox.NewlineMarker, "\n");\r
162 \r
163             if (instance.GlobalSettings["mu_emotes"].AsBoolean() && msg.StartsWith(":"))\r
164             {\r
165                 msg = "/me " + msg.Substring(1);\r
166             }\r
167 \r
168             if (instance.RLV.RestictionActive("sendim", target.ToString()))\r
169                 msg = "*** IM blocked by sender's viewer";\r
170 \r
171             netcom.SendInstantMessage(msg, target, session);\r
172             this.ClearIMInput();\r
173         }\r
174 \r
175         private void cbxInput_KeyUp(object sender, KeyEventArgs e)\r
176         {\r
177             if (e.KeyCode != Keys.Enter) return;\r
178             e.SuppressKeyPress = true;\r
179             ProcessInput();\r
180         }\r
181 \r
182         private void ClearIMInput()\r
183         {\r
184             cbxInput.Text = string.Empty;\r
185         }\r
186 \r
187         public void SelectIMInput()\r
188         {\r
189             cbxInput.Select();\r
190         }\r
191 \r
192         private void rtbIMText_LinkClicked(object sender, LinkClickedEventArgs e)\r
193         {\r
194             instance.MainForm.ProcessLink(e.LinkText);\r
195         }\r
196 \r
197         private void tbtnProfile_Click(object sender, EventArgs e)\r
198         {\r
199             instance.MainForm.ShowAgentProfile(toName, target);\r
200         }\r
201 \r
202         private void cbxInput_KeyDown(object sender, KeyEventArgs e)\r
203         {\r
204             if (e.KeyCode == Keys.Enter) e.SuppressKeyPress = true;\r
205         }\r
206 \r
207         public UUID TargetId\r
208         {\r
209             get { return target; }\r
210             set { target = value; }\r
211         }\r
212 \r
213         public string TargetName\r
214         {\r
215             get { return toName; }\r
216             set { toName = value; }\r
217         }\r
218 \r
219         public UUID SessionId\r
220         {\r
221             get { return session; }\r
222             set { session = value; }\r
223         }\r
224 \r
225         public IMTextManager TextManager\r
226         {\r
227             get { return textManager; }\r
228             set { textManager = value; }\r
229         }\r
230 \r
231         private void cbxInput_VisibleChanged(object sender, EventArgs e)\r
232         {\r
233             if (Visible) cbxInput.Focus();\r
234         }\r
235 \r
236         private void cbxInput_SizeChanged(object sender, EventArgs e)\r
237         {\r
238             pnlChatInput.Height = cbxInput.Height + 9;\r
239         }\r
240     }\r
241 }\r