OSDN Git Service

Removed unused usings, thanks nephrael for the patch.
[radegast/radegast.git] / Radegast / GUI / Consoles / TabsConsole.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.Collections.Generic;\r
33 using System.ComponentModel;\r
34 using System.Drawing;\r
35 using System.Windows.Forms;\r
36 using Radegast.Netcom;\r
37 using OpenMetaverse;\r
38 \r
39 namespace Radegast\r
40 {\r
41     public partial class TabsConsole : UserControl\r
42     {\r
43         private RadegastInstance instance;\r
44         private GridClient client { get { return instance.Client; } }\r
45         private RadegastNetcom netcom { get { return instance.Netcom; } }\r
46         private ChatTextManager mainChatManger;\r
47 \r
48         public Dictionary<string, SleekTab> tabs = new Dictionary<string, SleekTab>();\r
49         private ChatConsole chatConsole;\r
50 \r
51         private SleekTab selectedTab;\r
52         private Form owner;\r
53 \r
54         public TabsConsole(RadegastInstance instance)\r
55         {\r
56             InitializeComponent();\r
57             Disposed += new EventHandler(TabsConsole_Disposed);\r
58 \r
59             this.instance = instance;\r
60 \r
61             AddNetcomEvents();\r
62 \r
63             InitializeMainTab();\r
64             InitializeChatTab();\r
65 \r
66             ApplyConfig(this.instance.Config.CurrentConfig);\r
67 \r
68             // Callbacks\r
69             instance.Config.ConfigApplied += new EventHandler<ConfigAppliedEventArgs>(Config_ConfigApplied);\r
70             client.Self.OnScriptQuestion += new AgentManager.ScriptQuestionCallback(Self_OnScriptQuestion);\r
71             client.Self.OnScriptDialog += new AgentManager.ScriptDialogCallback(Self_OnScriptDialog);\r
72             client.Inventory.OnObjectOffered += new InventoryManager.ObjectOfferedCallback(Inventory_OnObjectOffered);\r
73         }\r
74 \r
75         void TabsConsole_Disposed(object sender, EventArgs e)\r
76         {\r
77             RemoveNetcomEvents();\r
78             instance.Config.ConfigApplied -= new EventHandler<ConfigAppliedEventArgs>(Config_ConfigApplied);\r
79             client.Self.OnScriptQuestion -= new AgentManager.ScriptQuestionCallback(Self_OnScriptQuestion);\r
80             client.Self.OnScriptDialog -= new AgentManager.ScriptDialogCallback(Self_OnScriptDialog);\r
81             client.Inventory.OnObjectOffered -= new InventoryManager.ObjectOfferedCallback(Inventory_OnObjectOffered);\r
82         }\r
83 \r
84         private void AddNetcomEvents()\r
85         {\r
86             netcom.ClientLoginStatus += new EventHandler<ClientLoginEventArgs>(netcom_ClientLoginStatus);\r
87             netcom.ClientLoggedOut += new EventHandler(netcom_ClientLoggedOut);\r
88             netcom.ClientDisconnected += new EventHandler<ClientDisconnectEventArgs>(netcom_ClientDisconnected);\r
89             netcom.ChatReceived += new EventHandler<ChatEventArgs>(netcom_ChatReceived);\r
90             netcom.ChatSent += new EventHandler<ChatSentEventArgs>(netcom_ChatSent);\r
91             netcom.AlertMessageReceived += new EventHandler<AlertMessageEventArgs>(netcom_AlertMessageReceived);\r
92             netcom.InstantMessageReceived += new EventHandler<InstantMessageEventArgs>(netcom_InstantMessageReceived);\r
93         }\r
94 \r
95         private void RemoveNetcomEvents()\r
96         {\r
97             netcom.ClientLoginStatus -= new EventHandler<ClientLoginEventArgs>(netcom_ClientLoginStatus);\r
98             netcom.ClientLoggedOut -= new EventHandler(netcom_ClientLoggedOut);\r
99             netcom.ClientDisconnected -= new EventHandler<ClientDisconnectEventArgs>(netcom_ClientDisconnected);\r
100             netcom.ChatReceived -= new EventHandler<ChatEventArgs>(netcom_ChatReceived);\r
101             netcom.ChatSent -= new EventHandler<ChatSentEventArgs>(netcom_ChatSent);\r
102             netcom.AlertMessageReceived -= new EventHandler<AlertMessageEventArgs>(netcom_AlertMessageReceived);\r
103             netcom.InstantMessageReceived -= new EventHandler<InstantMessageEventArgs>(netcom_InstantMessageReceived);\r
104         }\r
105 \r
106         bool Inventory_OnObjectOffered(InstantMessage offerDetails, AssetType type, UUID objectID, bool fromTask)\r
107         {\r
108             DisplayNotificationInChat(offerDetails.FromAgentName + " gave you " + offerDetails.Message);\r
109             return true;\r
110         }\r
111 \r
112         void Self_OnScriptDialog(string message, string objectName, UUID imageID, UUID objectID, string firstName, string lastName, int chatChannel, List<string> buttons)\r
113         {\r
114             instance.MainForm.AddNotification(new ntfScriptDialog(instance, message, objectName, imageID, objectID, firstName, lastName, chatChannel, buttons));\r
115         }\r
116 \r
117         void Self_OnScriptQuestion(Simulator simulator, UUID taskID, UUID itemID, string objectName, string objectOwner, ScriptPermission questions)\r
118         {\r
119             instance.MainForm.AddNotification(new ntfPermissions(instance, simulator, taskID, itemID, objectName, objectOwner, questions));\r
120         }\r
121 \r
122         private void Config_ConfigApplied(object sender, ConfigAppliedEventArgs e)\r
123         {\r
124             ApplyConfig(e.AppliedConfig);\r
125         }\r
126 \r
127         private void ApplyConfig(Config config)\r
128         {\r
129             if (config.InterfaceStyle == 0) //System\r
130                 tstTabs.RenderMode = ToolStripRenderMode.System;\r
131             else if (config.InterfaceStyle == 1) //Office 2003\r
132                 tstTabs.RenderMode = ToolStripRenderMode.ManagerRenderMode;\r
133         }\r
134 \r
135         private void netcom_ClientLoginStatus(object sender, ClientLoginEventArgs e)\r
136         {\r
137             if (e.Status != LoginStatus.Success) return;\r
138 \r
139             InitializeFriendsTab();\r
140             InitializeInventoryTab();\r
141             InitializeSearchTab();\r
142 \r
143             if (selectedTab.Name == "main")\r
144                 tabs["chat"].Select();\r
145 \r
146             tabs["main"].AllowClose = true;\r
147             tabs["main"].Close();\r
148 \r
149             client.Self.RetrieveInstantMessages();\r
150         }\r
151 \r
152         private void netcom_ClientLoggedOut(object sender, EventArgs e)\r
153         {\r
154             DisposeSearchTab();\r
155             DisposeInventoryTab();\r
156             DisposeFriendsTab();\r
157 \r
158             tabs["chat"].Select();\r
159             DisplayNotificationInChat("Logged out.");\r
160             \r
161         }\r
162 \r
163         private void netcom_ClientDisconnected(object sender, ClientDisconnectEventArgs e)\r
164         {\r
165             if (e.Type == NetworkManager.DisconnectType.ClientInitiated) return;\r
166 \r
167             DisposeSearchTab();\r
168             DisposeInventoryTab();\r
169             DisposeFriendsTab();\r
170 \r
171             tabs["chat"].Select();\r
172             DisplayNotificationInChat("Disconnected.");\r
173         }\r
174 \r
175         private void netcom_AlertMessageReceived(object sender, AlertMessageEventArgs e)\r
176         {\r
177             tabs["chat"].Highlight();\r
178         }\r
179 \r
180         private void netcom_ChatSent(object sender, ChatSentEventArgs e)\r
181         {\r
182             tabs["chat"].Highlight();\r
183         }\r
184 \r
185         private void netcom_ChatReceived(object sender, ChatEventArgs e)\r
186         {\r
187             if (string.IsNullOrEmpty(e.Message)) return;\r
188 \r
189             tabs["chat"].Highlight();\r
190         }\r
191 \r
192         private void netcom_InstantMessageReceived(object sender, InstantMessageEventArgs e)\r
193         {\r
194             switch (e.IM.Dialog)\r
195             {\r
196                 case InstantMessageDialog.SessionSend:\r
197                     if (instance.Groups.ContainsKey(e.IM.IMSessionID))\r
198                     {\r
199                         HandleGroupIM(e);\r
200                     }\r
201                     else\r
202                     {\r
203                         HandleConferenceIM(e);\r
204                     }\r
205                     break;\r
206 \r
207                 case InstantMessageDialog.MessageFromAgent:\r
208                     if (e.IM.FromAgentName == "Second Life")\r
209                     {\r
210                         HandleIMFromObject(e);\r
211                     }\r
212                     else if (e.IM.GroupIM || instance.Groups.ContainsKey(e.IM.IMSessionID))\r
213                     {\r
214                         HandleGroupIM(e);\r
215                     }\r
216                     else if (e.IM.BinaryBucket.Length > 1)\r
217                     { // conference\r
218                         HandleConferenceIM(e);\r
219                     }\r
220                     else\r
221                     {\r
222                         HandleIM(e);\r
223                     }\r
224                     break;\r
225 \r
226                 case InstantMessageDialog.MessageFromObject:\r
227                     HandleIMFromObject(e);\r
228                     break;\r
229 \r
230                 case InstantMessageDialog.StartTyping:\r
231                     if (TabExists(e.IM.FromAgentName))\r
232                     {\r
233                         SleekTab tab = tabs[e.IM.FromAgentName.ToLower()];\r
234                         if (!tab.Highlighted) tab.PartialHighlight();\r
235                     }\r
236 \r
237                     break;\r
238 \r
239                 case InstantMessageDialog.StopTyping:\r
240                     if (TabExists(e.IM.FromAgentName))\r
241                     {\r
242                         SleekTab tab = tabs[e.IM.FromAgentName.ToLower()];\r
243                         if (!tab.Highlighted) tab.Unhighlight();\r
244                     }\r
245 \r
246                     break;\r
247 \r
248                 case InstantMessageDialog.MessageBox:\r
249                     instance.MainForm.AddNotification(new ntfGeneric(instance, e.IM.Message));\r
250                     break;\r
251 \r
252                 case InstantMessageDialog.RequestTeleport:\r
253                     instance.MainForm.AddNotification(new ntfTeleport(instance, e.IM));\r
254                     break;\r
255 \r
256                 case InstantMessageDialog.GroupInvitation:\r
257                     instance.MainForm.AddNotification(new ntfGroupInvitation(instance, e.IM));\r
258                     break;\r
259 \r
260                 case InstantMessageDialog.FriendshipOffered:\r
261                     instance.MainForm.AddNotification(new ntfFriendshipOffer(instance, e.IM));\r
262                     break;\r
263 \r
264                 case InstantMessageDialog.InventoryAccepted:\r
265                     DisplayNotificationInChat(e.IM.FromAgentName + " accepted your inventory offer.");\r
266                     break;\r
267             }\r
268         }\r
269 \r
270         public void DisplayNotificationInChat(string msg)\r
271         {\r
272             if (InvokeRequired)\r
273             {\r
274                 BeginInvoke(new MethodInvoker(delegate()\r
275                     {\r
276                         DisplayNotificationInChat(msg);\r
277                     }));\r
278                 return;\r
279             }\r
280 \r
281             ChatBufferItem line = new ChatBufferItem(\r
282                 DateTime.Now,\r
283                 msg,\r
284                 ChatBufferTextStyle.ObjectChat\r
285             );\r
286             try\r
287             {\r
288                 mainChatManger.ProcessBufferItem(line, true);\r
289                 tabs["chat"].Highlight();\r
290             }\r
291             catch (Exception) { }\r
292         }\r
293 \r
294         private void HandleIMFromObject(InstantMessageEventArgs e)\r
295         {\r
296             DisplayNotificationInChat(e.IM.FromAgentName + ": " + e.IM.Message);\r
297         }\r
298 \r
299         private void HandleIM(InstantMessageEventArgs e)\r
300         {\r
301             if (TabExists(e.IM.IMSessionID.ToString()))\r
302             {\r
303                 SleekTab tab = tabs[e.IM.IMSessionID.ToString()];\r
304                 if (!tab.Selected) tab.Highlight();\r
305                 return;\r
306             }\r
307 \r
308             IMTabWindow imTab = AddIMTab(e);\r
309             tabs[e.IM.IMSessionID.ToString()].Highlight();\r
310         }\r
311 \r
312         private void HandleConferenceIM(InstantMessageEventArgs e)\r
313         {\r
314             if (TabExists(e.IM.IMSessionID.ToString()))\r
315             {\r
316                 SleekTab tab = tabs[e.IM.IMSessionID.ToString()];\r
317                 if (!tab.Selected) tab.Highlight();\r
318                 return;\r
319             }\r
320 \r
321             ConferenceIMTabWindow imTab = AddConferenceIMTab(e);\r
322             tabs[e.IM.IMSessionID.ToString()].Highlight();\r
323         }\r
324 \r
325         private void HandleGroupIM(InstantMessageEventArgs e)\r
326         {\r
327             if (TabExists(e.IM.IMSessionID.ToString())) {\r
328                 SleekTab tab = tabs[e.IM.IMSessionID.ToString()];\r
329                 if (!tab.Selected) tab.Highlight();\r
330                 return;\r
331             }\r
332 \r
333             GroupIMTabWindow imTab = AddGroupIMTab(e);\r
334             tabs[e.IM.IMSessionID.ToString()].Highlight();\r
335         }\r
336 \r
337         private void InitializeMainTab()\r
338         {\r
339             MainConsole mainConsole = new MainConsole(instance);\r
340             mainConsole.Dock = DockStyle.Fill;\r
341             mainConsole.Visible = false;\r
342 \r
343             toolStripContainer1.ContentPanel.Controls.Add(mainConsole);\r
344 \r
345             SleekTab tab = AddTab("main", "Main", mainConsole);\r
346             tab.AllowClose = false;\r
347             tab.AllowDetach = false;\r
348             tab.AllowMerge = false;\r
349 \r
350             mainConsole.RegisterTab(tab);\r
351         }\r
352 \r
353         private void InitializeChatTab()\r
354         {\r
355             chatConsole = new ChatConsole(instance);\r
356             mainChatManger = chatConsole.ChatManager;\r
357             chatConsole.Dock = DockStyle.Fill;\r
358             chatConsole.Visible = false;\r
359 \r
360             toolStripContainer1.ContentPanel.Controls.Add(chatConsole);\r
361 \r
362             SleekTab tab = AddTab("chat", "Chat", chatConsole);\r
363             tab.AllowClose = false;\r
364             tab.AllowDetach = false;\r
365         }\r
366 \r
367         private void InitializeFriendsTab()\r
368         {\r
369             FriendsConsole friendsConsole = new FriendsConsole(instance);\r
370             friendsConsole.Dock = DockStyle.Fill;\r
371             friendsConsole.Visible = false;\r
372 \r
373             toolStripContainer1.ContentPanel.Controls.Add(friendsConsole);\r
374 \r
375             SleekTab tab = AddTab("friends", "Friends", friendsConsole);\r
376             tab.AllowClose = false;\r
377             tab.AllowDetach = false;\r
378         }\r
379 \r
380         private void InitializeSearchTab()\r
381         {\r
382             SearchConsole searchConsole = new SearchConsole(instance);\r
383             searchConsole.Dock = DockStyle.Fill;\r
384             searchConsole.Visible = false;\r
385 \r
386             toolStripContainer1.ContentPanel.Controls.Add(searchConsole);\r
387 \r
388             SleekTab tab = AddTab("search", "Search", searchConsole);\r
389             tab.AllowClose = false;\r
390             tab.AllowDetach = false;\r
391         }\r
392 \r
393         private void InitializeInventoryTab()\r
394         {\r
395             InventoryConsole invConsole = new InventoryConsole(instance);\r
396             invConsole.Dock = DockStyle.Fill;\r
397             invConsole.Visible = true;\r
398 \r
399             toolStripContainer1.ContentPanel.Controls.Add(invConsole);\r
400 \r
401             SleekTab tab = AddTab("inventory", "Inventory", invConsole);\r
402             tab.AllowClose = false;\r
403             tab.AllowDetach = true;\r
404         }\r
405 \r
406         private void DisposeFriendsTab()\r
407         {\r
408             ForceCloseTab("friends");\r
409         }\r
410 \r
411         private void DisposeSearchTab()\r
412         {\r
413             ForceCloseTab("search");\r
414         }\r
415 \r
416         private void DisposeInventoryTab()\r
417         {\r
418             ForceCloseTab("inventory");\r
419         }\r
420 \r
421         private void ForceCloseTab(string name)\r
422         {\r
423             if (!TabExists(name)) return;\r
424 \r
425             SleekTab tab = tabs[name];\r
426             if (tab.Merged) SplitTab(tab);\r
427 \r
428             tab.AllowClose = true;\r
429             tab.Close();\r
430             tab = null;\r
431         }\r
432 \r
433         public void AddTab(SleekTab tab)\r
434         {\r
435             ToolStripButton button = (ToolStripButton)tstTabs.Items.Add(tab.Label);\r
436             button.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText;\r
437             button.Image = null;\r
438             button.AutoToolTip = false;\r
439             button.Tag = tab.Name;\r
440             button.Click += new EventHandler(TabButtonClick);\r
441             tab.Button = button;\r
442             tabs.Add(tab.Name, tab);\r
443         }\r
444 \r
445         public SleekTab AddTab(string name, string label, Control control)\r
446         {\r
447             ToolStripButton button = (ToolStripButton)tstTabs.Items.Add(label);\r
448             button.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText;\r
449             button.Image = null;\r
450             button.AutoToolTip = false;\r
451             button.Tag = name.ToLower();\r
452             button.Click += new EventHandler(TabButtonClick);\r
453 \r
454             SleekTab tab = new SleekTab(instance, button, control, name.ToLower(), label);\r
455             tab.TabAttached += new EventHandler(tab_TabAttached);\r
456             tab.TabDetached += new EventHandler(tab_TabDetached);\r
457             tab.TabSelected += new EventHandler(tab_TabSelected);\r
458             tab.TabClosed += new EventHandler(tab_TabClosed);\r
459             tabs.Add(name.ToLower(), tab);\r
460 \r
461             return tab;\r
462         }\r
463 \r
464         private void tab_TabAttached(object sender, EventArgs e)\r
465         {\r
466             SleekTab tab = (SleekTab)sender;\r
467             tab.Select();\r
468         }\r
469 \r
470         private void tab_TabDetached(object sender, EventArgs e)\r
471         {\r
472             SleekTab tab = (SleekTab)sender;\r
473             frmDetachedTab form = (frmDetachedTab)tab.Owner;\r
474 \r
475             form.ReattachStrip = tstTabs;\r
476             form.ReattachContainer = toolStripContainer1.ContentPanel;\r
477         }\r
478 \r
479         private void tab_TabSelected(object sender, EventArgs e)\r
480         {\r
481             SleekTab tab = (SleekTab)sender;\r
482 \r
483             if (selectedTab != null &&\r
484                 selectedTab != tab)\r
485             { selectedTab.Deselect(); }\r
486             \r
487             selectedTab = tab;\r
488 \r
489             tbtnCloseTab.Enabled = tab.AllowClose;\r
490             owner.AcceptButton = tab.DefaultControlButton;\r
491         }\r
492 \r
493         private void tab_TabClosed(object sender, EventArgs e)\r
494         {\r
495             SleekTab tab = (SleekTab)sender;\r
496             \r
497             tabs.Remove(tab.Name);\r
498             tab = null;\r
499         }\r
500 \r
501         private void TabButtonClick(object sender, EventArgs e)\r
502         {\r
503             ToolStripButton button = (ToolStripButton)sender;\r
504 \r
505             SleekTab tab = tabs[button.Tag.ToString()];\r
506             tab.Select();\r
507         }\r
508 \r
509         public void RemoveTabEntry(SleekTab tab)\r
510         {\r
511             if (tstTabs.Items.Contains(tab.Button))\r
512             {\r
513                 tstTabs.Items.Remove(tab.Button);\r
514             }\r
515 \r
516             tab.Button.Dispose();\r
517             tabs.Remove(tab.Name);\r
518         }\r
519 \r
520         public void RemoveTab(string name)\r
521         {\r
522             if (tabs.ContainsKey(name))\r
523             {\r
524                 tabs.Remove(name);\r
525             }\r
526         }\r
527 \r
528         //Used for outside classes that have a reference to TabsConsole\r
529         public void SelectTab(string name)\r
530         {\r
531             tabs[name.ToLower()].Select();\r
532         }\r
533 \r
534         public bool TabExists(string name)\r
535         {\r
536             return tabs.ContainsKey(name.ToLower());\r
537         }\r
538 \r
539         public SleekTab GetTab(string name)\r
540         {\r
541             return tabs[name.ToLower()];\r
542         }\r
543 \r
544         public List<SleekTab> GetOtherTabs()\r
545         {\r
546             List<SleekTab> otherTabs = new List<SleekTab>();\r
547 \r
548             foreach (ToolStripItem item in tstTabs.Items)\r
549             {\r
550                 if (item.Tag == null) continue;\r
551                 if ((ToolStripButton)item == selectedTab.Button) continue;\r
552 \r
553                 SleekTab tab = tabs[item.Tag.ToString()];\r
554                 if (!tab.AllowMerge) continue;\r
555                 if (tab.Merged) continue;\r
556                 \r
557                 otherTabs.Add(tab);\r
558             }\r
559 \r
560             return otherTabs;\r
561         }\r
562 \r
563         public IMTabWindow AddIMTab(UUID target, UUID session, string targetName)\r
564         {\r
565             IMTabWindow imTab = new IMTabWindow(instance, target, session, targetName);\r
566             imTab.Dock = DockStyle.Fill;\r
567 \r
568             toolStripContainer1.ContentPanel.Controls.Add(imTab);\r
569             SleekTab tab = AddTab(session.ToString(), "IM: " + targetName, imTab);\r
570             SelectTab(session.ToString());\r
571             imTab.SelectIMInput();\r
572 \r
573             return imTab;\r
574         }\r
575 \r
576         public ConferenceIMTabWindow AddConferenceIMTab(UUID session, string name)\r
577         {\r
578             ConferenceIMTabWindow imTab = new ConferenceIMTabWindow(instance, session, name);\r
579             imTab.Dock = DockStyle.Fill;\r
580 \r
581             toolStripContainer1.ContentPanel.Controls.Add(imTab);\r
582             SleekTab tab = AddTab(session.ToString(), name, imTab);\r
583             imTab.SelectIMInput();\r
584 \r
585             return imTab;\r
586         }\r
587 \r
588 \r
589         public ConferenceIMTabWindow AddConferenceIMTab(InstantMessageEventArgs e)\r
590         {\r
591             ConferenceIMTabWindow imTab = AddConferenceIMTab(e.IM.IMSessionID, Utils.BytesToString(e.IM.BinaryBucket));\r
592             imTab.TextManager.ProcessIM(e);\r
593             return imTab;\r
594         }\r
595 \r
596         public GroupIMTabWindow AddGroupIMTab(UUID session, string name)\r
597         {\r
598             GroupIMTabWindow imTab = new GroupIMTabWindow(instance, session, name);\r
599             imTab.Dock = DockStyle.Fill;\r
600 \r
601             toolStripContainer1.ContentPanel.Controls.Add(imTab);\r
602             SleekTab tab = AddTab(session.ToString(), name, imTab);\r
603             imTab.SelectIMInput();\r
604 \r
605             return imTab;\r
606         }\r
607 \r
608         public GroupIMTabWindow AddGroupIMTab(InstantMessageEventArgs e)\r
609         {\r
610             GroupIMTabWindow imTab = AddGroupIMTab(e.IM.IMSessionID, Utils.BytesToString(e.IM.BinaryBucket));\r
611             imTab.TextManager.ProcessIM(e);\r
612             return imTab;\r
613         }\r
614         \r
615         public IMTabWindow AddIMTab(InstantMessageEventArgs e)\r
616         {\r
617             IMTabWindow imTab = AddIMTab(e.IM.FromAgentID, e.IM.IMSessionID, e.IM.FromAgentName);\r
618             imTab.TextManager.ProcessIM(e);\r
619             return imTab;\r
620         }\r
621 \r
622         public OutfitTextures AddOTTab(Avatar avatar)\r
623         {\r
624             OutfitTextures otTab = new OutfitTextures(instance, avatar);\r
625             otTab.Dock = DockStyle.Fill;\r
626             toolStripContainer1.ContentPanel.Controls.Add(otTab);\r
627             SleekTab tab = AddTab("OT: " + avatar.Name, "OT: " + avatar.Name, otTab);\r
628             otTab.GetTextures();\r
629             return otTab;\r
630         }\r
631 \r
632         public MasterTab AddMSTab(Avatar avatar)\r
633         {\r
634             MasterTab msTab = new MasterTab(instance, avatar);\r
635             msTab.Dock = DockStyle.Fill;\r
636             toolStripContainer1.ContentPanel.Controls.Add(msTab);\r
637             SleekTab tab = AddTab("MS: " + avatar.Name, "MS: " + avatar.Name, msTab);\r
638             // msTab.GetTextures();\r
639             return msTab;\r
640         }\r
641 \r
642         public AttachmentTab AddATTab(Avatar avatar)\r
643         {\r
644             AttachmentTab atTab = new AttachmentTab(instance, avatar);\r
645             atTab.Dock = DockStyle.Fill;\r
646             toolStripContainer1.ContentPanel.Controls.Add(atTab);\r
647             SleekTab tab = AddTab("AT: " + avatar.Name, "AT: " + avatar.Name, atTab);\r
648             return atTab;\r
649         }\r
650 \r
651         public AnimTab AddAnimTab(Avatar avatar)\r
652         {\r
653             AnimTab animTab = new AnimTab(instance, avatar);\r
654             animTab.Dock = DockStyle.Fill;\r
655             toolStripContainer1.ContentPanel.Controls.Add(animTab);\r
656             SleekTab tab = AddTab("Anim: " + avatar.Name, "Anim: " + avatar.Name, animTab);\r
657             return animTab;\r
658         }\r
659 \r
660         private void tbtnTabOptions_Click(object sender, EventArgs e)\r
661         {\r
662             tmnuMergeWith.Enabled = selectedTab.AllowMerge;\r
663             tmnuDetachTab.Enabled = selectedTab.AllowDetach;\r
664 \r
665             tmnuMergeWith.DropDown.Items.Clear();\r
666 \r
667             if (!selectedTab.AllowMerge) return;\r
668             if (!selectedTab.Merged)\r
669             {\r
670                 tmnuMergeWith.Text = "Merge With";\r
671 \r
672                 List<SleekTab> otherTabs = GetOtherTabs();\r
673 \r
674                 tmnuMergeWith.Enabled = (otherTabs.Count > 0);\r
675                 if (!tmnuMergeWith.Enabled) return;\r
676 \r
677                 foreach (SleekTab tab in otherTabs)\r
678                 {\r
679                     ToolStripItem item = tmnuMergeWith.DropDown.Items.Add(tab.Label);\r
680                     item.Tag = tab.Name;\r
681                     item.Click += new EventHandler(MergeItemClick);\r
682                 }\r
683             }\r
684             else\r
685             {\r
686                 tmnuMergeWith.Text = "Split";\r
687                 tmnuMergeWith.Click += new EventHandler(SplitClick);\r
688             }\r
689         }\r
690 \r
691         private void MergeItemClick(object sender, EventArgs e)\r
692         {\r
693             ToolStripItem item = (ToolStripItem)sender;\r
694             SleekTab tab = tabs[item.Tag.ToString()];\r
695 \r
696             selectedTab.MergeWith(tab);\r
697 \r
698             SplitContainer container = (SplitContainer)selectedTab.Control;\r
699             toolStripContainer1.ContentPanel.Controls.Add(container);\r
700 \r
701             selectedTab.Select();\r
702             RemoveTabEntry(tab);\r
703 \r
704             tabs.Add(tab.Name, selectedTab);\r
705         }\r
706 \r
707         private void SplitClick(object sender, EventArgs e)\r
708         {\r
709             SplitTab(selectedTab);\r
710             selectedTab.Select();\r
711         }\r
712 \r
713         public void SplitTab(SleekTab tab)\r
714         {\r
715             SleekTab otherTab = tab.Split();\r
716             if (otherTab == null) return;\r
717 \r
718             toolStripContainer1.ContentPanel.Controls.Add(tab.Control);\r
719             toolStripContainer1.ContentPanel.Controls.Add(otherTab.Control);\r
720 \r
721             tabs.Remove(otherTab.Name);\r
722             AddTab(otherTab);\r
723         }\r
724 \r
725         private void tmnuDetachTab_Click(object sender, EventArgs e)\r
726         {\r
727             if (!selectedTab.AllowDetach) return;\r
728 \r
729             tstTabs.Items.Remove(selectedTab.Button);\r
730             selectedTab.Detach(instance);\r
731             selectedTab.Owner.Show();\r
732 \r
733             tabs["chat"].Select();\r
734         }\r
735 \r
736         private void tbtnCloseTab_Click(object sender, EventArgs e)\r
737         {\r
738             SleekTab tab = selectedTab;\r
739 \r
740             tabs["chat"].Select();\r
741             tab.Close();\r
742             \r
743             tab = null;\r
744         }\r
745 \r
746         private void TabsConsole_Load(object sender, EventArgs e)\r
747         {\r
748             owner = this.FindForm();\r
749         }\r
750 \r
751         private void ctxTabs_Opening(object sender, CancelEventArgs e)\r
752         {\r
753             Point pt = this.PointToClient(Cursor.Position);\r
754             ToolStripItem stripItem = tstTabs.GetItemAt(pt);\r
755 \r
756             if (stripItem == null)\r
757             {\r
758                 e.Cancel = true;\r
759             }\r
760             else\r
761             {\r
762                 tabs[stripItem.Tag.ToString()].Select();\r
763 \r
764                 ctxBtnClose.Enabled = selectedTab.AllowClose;\r
765                 ctxBtnDetach.Enabled = selectedTab.AllowDetach;\r
766                 ctxBtnMerge.Enabled = selectedTab.AllowMerge;\r
767                 ctxBtnMerge.DropDown.Items.Clear();\r
768 \r
769                 if (!ctxBtnClose.Enabled && !ctxBtnDetach.Enabled && !ctxBtnMerge.Enabled)\r
770                 {\r
771                     e.Cancel = true;\r
772                     return;\r
773                 }\r
774 \r
775                 if (!selectedTab.AllowMerge) return;\r
776                 if (!selectedTab.Merged)\r
777                 {\r
778                     ctxBtnMerge.Text = "Merge With";\r
779 \r
780                     List<SleekTab> otherTabs = GetOtherTabs();\r
781 \r
782                     ctxBtnMerge.Enabled = (otherTabs.Count > 0);\r
783                     if (!ctxBtnMerge.Enabled) return;\r
784 \r
785                     foreach (SleekTab tab in otherTabs)\r
786                     {\r
787                         ToolStripItem item = ctxBtnMerge.DropDown.Items.Add(tab.Label);\r
788                         item.Tag = tab.Name;\r
789                         item.Click += new EventHandler(MergeItemClick);\r
790                     }\r
791                 }\r
792                 else\r
793                 {\r
794                     ctxBtnMerge.Text = "Split";\r
795                     ctxBtnMerge.Click += new EventHandler(SplitClick);\r
796                 }\r
797 \r
798             }\r
799         }\r
800     }\r
801 }\r