OSDN Git Service

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