2 // Radegast Metaverse Client
\r
3 // Copyright (c) 2009, Radegast Development Team
\r
4 // All rights reserved.
\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
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
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
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
41 public partial class TabsConsole : UserControl
\r
44 /// Delegate inviked on tab operations
\r
46 /// <param name="sender">Event sender</param>
\r
47 /// <param name="e">Event arguments</param>
\r
48 public delegate void TabCallback(object sender, TabEventArgs e);
\r
51 /// Fired when a tab is selected
\r
53 public event TabCallback OnTabSelected;
\r
56 /// Fired when a new tab is added
\r
58 public event TabCallback OnTabAdded;
\r
61 /// Fired when a tab is removed
\r
63 public event TabCallback OnTabRemoved;
\r
65 private RadegastInstance instance;
\r
66 private GridClient client { get { return instance.Client; } }
\r
67 private RadegastNetcom netcom { get { return instance.Netcom; } }
\r
68 private ChatTextManager mainChatManger;
\r
70 private Dictionary<string, RadegastTab> tabs = new Dictionary<string, RadegastTab>();
\r
71 public Dictionary<string, RadegastTab> Tabs { get { return tabs; } }
\r
73 private ChatConsole chatConsole;
\r
75 private RadegastTab selectedTab;
\r
78 /// Currently selected tab
\r
80 public RadegastTab SelectedTab
\r
90 public TabsConsole(RadegastInstance instance)
\r
92 InitializeComponent();
\r
93 Disposed += new EventHandler(TabsConsole_Disposed);
\r
95 this.instance = instance;
\r
96 this.instance.ClientChanged += new EventHandler<ClientChangedEventArgs>(instance_ClientChanged);
\r
100 InitializeMainTab();
\r
101 InitializeChatTab();
\r
104 RegisterClientEvents(client);
\r
107 private void RegisterClientEvents(GridClient client)
\r
109 client.Self.ScriptQuestion += new EventHandler<ScriptQuestionEventArgs>(Self_ScriptQuestion);
\r
110 client.Self.ScriptDialog += new EventHandler<ScriptDialogEventArgs>(Self_ScriptDialog);
\r
113 private void UnregisterClientEvents(GridClient client)
\r
115 client.Self.ScriptQuestion -= new EventHandler<ScriptQuestionEventArgs>(Self_ScriptQuestion);
\r
116 client.Self.ScriptDialog -= new EventHandler<ScriptDialogEventArgs>(Self_ScriptDialog);
\r
119 void instance_ClientChanged(object sender, ClientChangedEventArgs e)
\r
121 UnregisterClientEvents(e.OldClient);
\r
122 RegisterClientEvents(client);
\r
125 void TabsConsole_Disposed(object sender, EventArgs e)
\r
127 RemoveNetcomEvents();
\r
128 UnregisterClientEvents(client);
\r
131 private void AddNetcomEvents()
\r
133 netcom.ClientLoginStatus += new EventHandler<ClientLoginEventArgs>(netcom_ClientLoginStatus);
\r
134 netcom.ClientLoggedOut += new EventHandler(netcom_ClientLoggedOut);
\r
135 netcom.ClientDisconnected += new EventHandler<ClientDisconnectEventArgs>(netcom_ClientDisconnected);
\r
136 netcom.ChatReceived += new EventHandler<ChatEventArgs>(netcom_ChatReceived);
\r
137 netcom.ChatSent += new EventHandler<ChatSentEventArgs>(netcom_ChatSent);
\r
138 netcom.AlertMessageReceived += new EventHandler<AlertMessageEventArgs>(netcom_AlertMessageReceived);
\r
139 netcom.InstantMessageReceived += new EventHandler<InstantMessageEventArgs>(netcom_InstantMessageReceived);
\r
142 private void RemoveNetcomEvents()
\r
144 netcom.ClientLoginStatus -= new EventHandler<ClientLoginEventArgs>(netcom_ClientLoginStatus);
\r
145 netcom.ClientLoggedOut -= new EventHandler(netcom_ClientLoggedOut);
\r
146 netcom.ClientDisconnected -= new EventHandler<ClientDisconnectEventArgs>(netcom_ClientDisconnected);
\r
147 netcom.ChatReceived -= new EventHandler<ChatEventArgs>(netcom_ChatReceived);
\r
148 netcom.ChatSent -= new EventHandler<ChatSentEventArgs>(netcom_ChatSent);
\r
149 netcom.AlertMessageReceived -= new EventHandler<AlertMessageEventArgs>(netcom_AlertMessageReceived);
\r
150 netcom.InstantMessageReceived -= new EventHandler<InstantMessageEventArgs>(netcom_InstantMessageReceived);
\r
153 void Self_ScriptDialog(object sender, ScriptDialogEventArgs e)
\r
155 instance.MainForm.AddNotification(new ntfScriptDialog(instance, e.Message, e.ObjectName, e.ImageID, e.ObjectID, e.FirstName, e.LastName, e.Channel, e.ButtonLabels));
\r
158 void Self_ScriptQuestion(object sender, ScriptQuestionEventArgs e)
\r
160 instance.MainForm.AddNotification(new ntfPermissions(instance, e.Simulator, e.TaskID, e.ItemID, e.ObjectName, e.ObjectOwnerName, e.Questions));
\r
163 private void netcom_ClientLoginStatus(object sender, ClientLoginEventArgs e)
\r
165 if (e.Status == LoginStatus.Failed)
\r
167 DisplayNotificationInChat("Login error: " + e.Message, ChatBufferTextStyle.Error);
\r
169 else if (e.Status == LoginStatus.Success)
\r
171 DisplayNotificationInChat("Logged in as " + netcom.LoginOptions.FullName + ".", ChatBufferTextStyle.StatusDarkBlue);
\r
172 DisplayNotificationInChat("Login reply: " + e.Message, ChatBufferTextStyle.StatusDarkBlue);
\r
174 InitializeOnlineTabs();
\r
176 if (tabs.ContainsKey("login"))
\r
178 if (selectedTab.Name == "login")
\r
179 tabs["chat"].Select();
\r
180 ForceCloseTab("login");
\r
183 client.Self.RetrieveInstantMessages();
\r
187 private void netcom_ClientLoggedOut(object sender, EventArgs e)
\r
189 DisposeOnlineTabs();
\r
191 tabs["chat"].Select();
\r
192 DisplayNotificationInChat("Logged out.");
\r
196 private void netcom_ClientDisconnected(object sender, ClientDisconnectEventArgs e)
\r
198 if (e.Type == NetworkManager.DisconnectType.ClientInitiated) return;
\r
200 DisposeOnlineTabs();
\r
202 tabs["chat"].Select();
\r
203 DisplayNotificationInChat("Disconnected: " + e.Message, ChatBufferTextStyle.Error);
\r
206 private void netcom_AlertMessageReceived(object sender, AlertMessageEventArgs e)
\r
208 tabs["chat"].Highlight();
\r
211 private void netcom_ChatSent(object sender, ChatSentEventArgs e)
\r
213 tabs["chat"].Highlight();
\r
216 private void netcom_ChatReceived(object sender, ChatEventArgs e)
\r
218 if (string.IsNullOrEmpty(e.Message)) return;
\r
220 tabs["chat"].Highlight();
\r
223 private void netcom_InstantMessageReceived(object sender, InstantMessageEventArgs e)
\r
225 switch (e.IM.Dialog)
\r
227 case InstantMessageDialog.SessionSend:
\r
228 if (instance.Groups.ContainsKey(e.IM.IMSessionID))
\r
234 HandleConferenceIM(e);
\r
238 case InstantMessageDialog.MessageFromAgent:
\r
239 if (e.IM.FromAgentName == "Second Life")
\r
241 HandleIMFromObject(e);
\r
243 else if (e.IM.GroupIM || instance.Groups.ContainsKey(e.IM.IMSessionID))
\r
247 else if (e.IM.BinaryBucket.Length > 1)
\r
249 HandleConferenceIM(e);
\r
257 case InstantMessageDialog.MessageFromObject:
\r
258 HandleIMFromObject(e);
\r
261 case InstantMessageDialog.StartTyping:
\r
262 if (TabExists(e.IM.FromAgentName))
\r
264 RadegastTab tab = tabs[e.IM.FromAgentName.ToLower()];
\r
265 if (!tab.Highlighted) tab.PartialHighlight();
\r
270 case InstantMessageDialog.StopTyping:
\r
271 if (TabExists(e.IM.FromAgentName))
\r
273 RadegastTab tab = tabs[e.IM.FromAgentName.ToLower()];
\r
274 if (!tab.Highlighted) tab.Unhighlight();
\r
279 case InstantMessageDialog.MessageBox:
\r
280 instance.MainForm.AddNotification(new ntfGeneric(instance, e.IM.Message));
\r
283 case InstantMessageDialog.RequestTeleport:
\r
284 instance.MainForm.AddNotification(new ntfTeleport(instance, e.IM));
\r
287 case InstantMessageDialog.GroupInvitation:
\r
288 instance.MainForm.AddNotification(new ntfGroupInvitation(instance, e.IM));
\r
291 case InstantMessageDialog.FriendshipOffered:
\r
292 instance.MainForm.AddNotification(new ntfFriendshipOffer(instance, e.IM));
\r
295 case InstantMessageDialog.InventoryAccepted:
\r
296 DisplayNotificationInChat(e.IM.FromAgentName + " accepted your inventory offer.");
\r
299 case InstantMessageDialog.GroupNotice:
\r
300 instance.MainForm.AddNotification(new ntfGroupNotice(instance, e.IM));
\r
303 case InstantMessageDialog.InventoryOffered:
\r
304 case InstantMessageDialog.TaskInventoryOffered:
\r
305 instance.MainForm.AddNotification(new ntfInventoryOffer(instance, e.IM));
\r
311 /// Displays notification in the main chat tab
\r
313 /// <param name="msg">Message to be printed in the chat tab</param>
\r
314 public void DisplayNotificationInChat(string msg)
\r
316 DisplayNotificationInChat(msg, ChatBufferTextStyle.ObjectChat);
\r
320 /// Displays notification in the main chat tab
\r
322 /// <param name="msg">Message to be printed in the chat tab</param>
\r
323 /// <param name="style">Style of the message to be printed, normal, object, etc.</param>
\r
324 public void DisplayNotificationInChat(string msg, ChatBufferTextStyle style)
\r
326 if (InvokeRequired)
\r
328 BeginInvoke(new MethodInvoker(delegate()
\r
330 DisplayNotificationInChat(msg, style);
\r
335 ChatBufferItem line = new ChatBufferItem(
\r
342 mainChatManger.ProcessBufferItem(line, true);
\r
343 tabs["chat"].Highlight();
\r
345 catch (Exception) { }
\r
348 private void HandleIMFromObject(InstantMessageEventArgs e)
\r
350 DisplayNotificationInChat(e.IM.FromAgentName + ": " + e.IM.Message);
\r
353 private void HandleIM(InstantMessageEventArgs e)
\r
355 if (TabExists(e.IM.IMSessionID.ToString()))
\r
357 RadegastTab tab = tabs[e.IM.IMSessionID.ToString()];
\r
358 if (!tab.Selected) tab.Highlight();
\r
362 IMTabWindow imTab = AddIMTab(e);
\r
363 tabs[e.IM.IMSessionID.ToString()].Highlight();
\r
366 private void HandleConferenceIM(InstantMessageEventArgs e)
\r
368 if (TabExists(e.IM.IMSessionID.ToString()))
\r
370 RadegastTab tab = tabs[e.IM.IMSessionID.ToString()];
\r
371 if (!tab.Selected) tab.Highlight();
\r
375 ConferenceIMTabWindow imTab = AddConferenceIMTab(e);
\r
376 tabs[e.IM.IMSessionID.ToString()].Highlight();
\r
379 private void HandleGroupIM(InstantMessageEventArgs e)
\r
381 if (TabExists(e.IM.IMSessionID.ToString()))
\r
383 RadegastTab tab = tabs[e.IM.IMSessionID.ToString()];
\r
384 if (!tab.Selected) tab.Highlight();
\r
388 GroupIMTabWindow imTab = AddGroupIMTab(e);
\r
389 tabs[e.IM.IMSessionID.ToString()].Highlight();
\r
392 private void InitializeMainTab()
\r
394 LoginConsole loginConsole = new LoginConsole(instance);
\r
396 RadegastTab tab = AddTab("login", "Login", loginConsole);
\r
397 tab.AllowClose = false;
\r
398 tab.AllowDetach = false;
\r
399 tab.AllowMerge = false;
\r
400 tab.AllowHide = false;
\r
402 loginConsole.RegisterTab(tab);
\r
405 private void InitializeChatTab()
\r
407 chatConsole = new ChatConsole(instance);
\r
408 mainChatManger = chatConsole.ChatManager;
\r
410 RadegastTab tab = AddTab("chat", "Chat", chatConsole);
\r
411 tab.AllowClose = false;
\r
412 tab.AllowDetach = false;
\r
413 tab.AllowHide = false;
\r
418 /// Create Tabs that only make sense when connected
\r
420 private void InitializeOnlineTabs()
\r
422 RadegastTab tab = AddTab("friends", "Friends", new FriendsConsole(instance));
\r
423 tab.AllowClose = false;
\r
424 tab.AllowDetach = true;
\r
425 tab.Visible = false;
\r
427 tab = AddTab("groups", "Groups", new GroupsConsole(instance));
\r
428 tab.AllowClose = false;
\r
429 tab.AllowDetach = true;
\r
430 tab.Visible = false;
\r
432 tab = AddTab("inventory", "Inventory", new InventoryConsole(instance));
\r
433 tab.AllowClose = false;
\r
434 tab.AllowDetach = true;
\r
435 tab.Visible = false;
\r
437 tab = AddTab("search", "Search", new SearchConsole(instance));
\r
438 tab.AllowClose = false;
\r
439 tab.AllowDetach = true;
\r
440 tab.Visible = false;
\r
442 if (!TabExists("map"))
\r
444 tab = AddTab("map", "Map", new MapConsole(instance));
\r
445 tab.AllowClose = false;
\r
446 tab.AllowDetach = true;
\r
447 tab.Visible = false;
\r
453 /// Close tabs that make no sense when not connected
\r
455 private void DisposeOnlineTabs()
\r
457 // Mono crashes if we try to open map for the second time
\r
458 if (!instance.MonoRuntime)
\r
459 ForceCloseTab("map");
\r
461 tabs["map"].Hide();
\r
463 ForceCloseTab("search");
\r
464 ForceCloseTab("inventory");
\r
465 ForceCloseTab("groups");
\r
466 ForceCloseTab("friends");
\r
469 private void ForceCloseTab(string name)
\r
471 if (!TabExists(name)) return;
\r
473 RadegastTab tab = tabs[name];
\r
474 if (tab.Merged) SplitTab(tab);
\r
476 tab.AllowClose = true;
\r
482 public void RegisterContextAction(Type libomvType, String label, EventHandler handler)
\r
484 instance.ContextActionManager.RegisterContextAction(libomvType, label, handler);
\r
487 public void RegisterContextAction(ContextAction handler)
\r
489 instance.ContextActionManager.RegisterContextAction(handler);
\r
492 public void AddTab(RadegastTab tab)
\r
494 ToolStripButton button = (ToolStripButton)tstTabs.Items.Add(tab.Label);
\r
495 button.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText;
\r
496 button.Image = null;
\r
497 button.AutoToolTip = false;
\r
498 button.Tag = tab.Name;
\r
499 button.Click += new EventHandler(TabButtonClick);
\r
500 tab.Button = button;
\r
501 tabs.Add(tab.Name, tab);
\r
503 if (OnTabAdded != null)
\r
505 try { OnTabAdded(this, new TabEventArgs(tab)); }
\r
506 catch (Exception) { }
\r
510 public RadegastTab AddTab(string name, string label, Control control)
\r
512 // WORKAROUND: one should never add tab that alrady exists
\r
513 // but under some weird conditions disconnect/connect
\r
514 // fire in the wrong order
\r
515 if (TabExists(name))
\r
517 Logger.Log("Force closing tab '" + name + "'", Helpers.LogLevel.Warning, client);
\r
518 ForceCloseTab(name);
\r
521 control.Visible = false;
\r
522 control.Dock = DockStyle.Fill;
\r
523 toolStripContainer1.ContentPanel.Controls.Add(control);
\r
525 ToolStripButton button = (ToolStripButton)tstTabs.Items.Add(label);
\r
526 button.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText;
\r
527 button.Image = null;
\r
528 button.AutoToolTip = false;
\r
529 button.Tag = name.ToLower();
\r
530 button.Click += new EventHandler(TabButtonClick);
\r
532 RadegastTab tab = new RadegastTab(instance, button, control, name.ToLower(), label);
\r
533 tab.TabAttached += new EventHandler(tab_TabAttached);
\r
534 tab.TabDetached += new EventHandler(tab_TabDetached);
\r
535 tab.TabSelected += new EventHandler(tab_TabSelected);
\r
536 tab.TabClosed += new EventHandler(tab_TabClosed);
\r
537 tab.TabHidden += new EventHandler(tab_TabHidden);
\r
538 tabs.Add(name.ToLower(), tab);
\r
540 if (OnTabAdded != null)
\r
542 try { OnTabAdded(this, new TabEventArgs(tab)); }
\r
543 catch (Exception) { }
\r
549 private void tab_TabAttached(object sender, EventArgs e)
\r
551 RadegastTab tab = (RadegastTab)sender;
\r
555 private void tab_TabDetached(object sender, EventArgs e)
\r
557 RadegastTab tab = (RadegastTab)sender;
\r
558 frmDetachedTab form = (frmDetachedTab)tab.Owner;
\r
560 form.ReattachStrip = tstTabs;
\r
561 form.ReattachContainer = toolStripContainer1.ContentPanel;
\r
564 private void tab_TabSelected(object sender, EventArgs e)
\r
566 RadegastTab tab = (RadegastTab)sender;
\r
568 if (selectedTab != null &&
\r
569 selectedTab != tab)
\r
570 { selectedTab.Deselect(); }
\r
574 tbtnCloseTab.Enabled = tab.AllowClose || tab.AllowHide;
\r
575 owner.AcceptButton = tab.DefaultControlButton;
\r
577 if (OnTabSelected != null)
\r
579 try { OnTabSelected(this, new TabEventArgs(selectedTab)); }
\r
580 catch (Exception) { }
\r
584 void tab_TabHidden(object sender, EventArgs e)
\r
586 RadegastTab tab = (RadegastTab)sender;
\r
588 if (selectedTab != null && selectedTab == tab)
\r
591 tabs["chat"].Select();
\r
595 private void tab_TabClosed(object sender, EventArgs e)
\r
597 RadegastTab tab = (RadegastTab)sender;
\r
599 if (selectedTab != null && selectedTab == tab)
\r
602 tabs["chat"].Select();
\r
605 tabs.Remove(tab.Name);
\r
607 if (OnTabRemoved != null)
\r
609 try { OnTabRemoved(this, new TabEventArgs(tab)); }
\r
610 catch (Exception) { }
\r
616 private void TabButtonClick(object sender, EventArgs e)
\r
618 ToolStripButton button = (ToolStripButton)sender;
\r
620 RadegastTab tab = tabs[button.Tag.ToString()];
\r
624 public void RemoveTabEntry(RadegastTab tab)
\r
626 if (tstTabs.Items.Contains(tab.Button))
\r
628 tstTabs.Items.Remove(tab.Button);
\r
631 tab.Button.Dispose();
\r
632 tabs.Remove(tab.Name);
\r
635 public void RemoveTab(string name)
\r
637 if (tabs.ContainsKey(name))
\r
643 //Used for outside classes that have a reference to TabsConsole
\r
644 public void SelectTab(string name)
\r
646 tabs[name.ToLower()].Select();
\r
649 public bool TabExists(string name)
\r
651 return tabs.ContainsKey(name.ToLower());
\r
654 public RadegastTab GetTab(string name)
\r
656 return tabs[name.ToLower()];
\r
659 public List<RadegastTab> GetOtherTabs()
\r
661 List<RadegastTab> otherTabs = new List<RadegastTab>();
\r
663 foreach (ToolStripItem item in tstTabs.Items)
\r
665 if (item.Tag == null) continue;
\r
666 if ((ToolStripItem)item == selectedTab.Button) continue;
\r
668 RadegastTab tab = tabs[item.Tag.ToString()];
\r
669 if (!tab.AllowMerge) continue;
\r
670 if (tab.Merged) continue;
\r
672 otherTabs.Add(tab);
\r
679 /// Activates the next tab
\r
681 public void SelectNextTab()
\r
683 List<ToolStripItem> buttons = new List<ToolStripItem>();
\r
685 foreach (ToolStripItem item in tstTabs.Items)
\r
687 if (item.Tag == null || !item.Visible) continue;
\r
694 for (int i = 0; i < buttons.Count; i++)
\r
696 if (buttons[i] == selectedTab.Button)
\r
705 if (current == buttons.Count)
\r
708 SelectTab(tabs[buttons[current].Tag.ToString()].Name);
\r
712 /// Activates the previous tab
\r
714 public void SelectPreviousTab()
\r
716 List<ToolStripItem> buttons = new List<ToolStripItem>();
\r
718 foreach (ToolStripItem item in tstTabs.Items)
\r
720 if (item.Tag == null || !item.Visible) continue;
\r
727 for (int i = 0; i < buttons.Count; i++)
\r
729 if (buttons[i] == selectedTab.Button)
\r
739 current = buttons.Count - 1;
\r
741 SelectTab(tabs[buttons[current].Tag.ToString()].Name);
\r
745 public IMTabWindow AddIMTab(UUID target, UUID session, string targetName)
\r
747 IMTabWindow imTab = new IMTabWindow(instance, target, session, targetName);
\r
749 RadegastTab tab = AddTab(session.ToString(), "IM: " + targetName, imTab);
\r
750 imTab.SelectIMInput();
\r
756 public ConferenceIMTabWindow AddConferenceIMTab(UUID session, string name)
\r
758 ConferenceIMTabWindow imTab = new ConferenceIMTabWindow(instance, session, name);
\r
760 RadegastTab tab = AddTab(session.ToString(), name, imTab);
\r
761 imTab.SelectIMInput();
\r
767 public ConferenceIMTabWindow AddConferenceIMTab(InstantMessageEventArgs e)
\r
769 ConferenceIMTabWindow imTab = AddConferenceIMTab(e.IM.IMSessionID, Utils.BytesToString(e.IM.BinaryBucket));
\r
770 imTab.TextManager.ProcessIM(e);
\r
774 public GroupIMTabWindow AddGroupIMTab(UUID session, string name)
\r
776 GroupIMTabWindow imTab = new GroupIMTabWindow(instance, session, name);
\r
778 RadegastTab tab = AddTab(session.ToString(), name, imTab);
\r
779 imTab.SelectIMInput();
\r
784 public GroupIMTabWindow AddGroupIMTab(InstantMessageEventArgs e)
\r
786 GroupIMTabWindow imTab = AddGroupIMTab(e.IM.IMSessionID, Utils.BytesToString(e.IM.BinaryBucket));
\r
787 imTab.TextManager.ProcessIM(e);
\r
791 public IMTabWindow AddIMTab(InstantMessageEventArgs e)
\r
793 IMTabWindow imTab = AddIMTab(e.IM.FromAgentID, e.IM.IMSessionID, e.IM.FromAgentName);
\r
794 imTab.TextManager.ProcessIM(e);
\r
798 public OutfitTextures AddOTTab(Avatar avatar)
\r
800 OutfitTextures otTab = new OutfitTextures(instance, avatar);
\r
802 RadegastTab tab = AddTab("OT: " + avatar.Name, "OT: " + avatar.Name, otTab);
\r
803 otTab.GetTextures();
\r
807 public MasterTab AddMSTab(Avatar avatar)
\r
809 MasterTab msTab = new MasterTab(instance, avatar);
\r
811 RadegastTab tab = AddTab("MS: " + avatar.Name, "MS: " + avatar.Name, msTab);
\r
815 public AttachmentTab AddATTab(Avatar avatar)
\r
817 AttachmentTab atTab = new AttachmentTab(instance, avatar);
\r
819 RadegastTab tab = AddTab("AT: " + avatar.Name, "AT: " + avatar.Name, atTab);
\r
823 public AnimTab AddAnimTab(Avatar avatar)
\r
825 AnimTab animTab = new AnimTab(instance, avatar);
\r
827 RadegastTab tab = AddTab("Anim: " + avatar.Name, "Anim: " + avatar.Name, animTab);
\r
831 private void tbtnTabOptions_Click(object sender, EventArgs e)
\r
833 tmnuMergeWith.Enabled = selectedTab.AllowMerge;
\r
834 tmnuDetachTab.Enabled = selectedTab.AllowDetach;
\r
836 tmnuMergeWith.DropDown.Items.Clear();
\r
838 if (!selectedTab.AllowMerge) return;
\r
839 if (!selectedTab.Merged)
\r
841 tmnuMergeWith.Text = "Merge With";
\r
843 List<RadegastTab> otherTabs = GetOtherTabs();
\r
845 tmnuMergeWith.Enabled = (otherTabs.Count > 0);
\r
846 if (!tmnuMergeWith.Enabled) return;
\r
848 foreach (RadegastTab tab in otherTabs)
\r
850 ToolStripItem item = tmnuMergeWith.DropDown.Items.Add(tab.Label);
\r
851 item.Tag = tab.Name;
\r
852 item.Click += new EventHandler(MergeItemClick);
\r
857 tmnuMergeWith.Text = "Split";
\r
858 tmnuMergeWith.Click += new EventHandler(SplitClick);
\r
862 private void MergeItemClick(object sender, EventArgs e)
\r
864 ToolStripItem item = (ToolStripItem)sender;
\r
865 RadegastTab tab = tabs[item.Tag.ToString()];
\r
867 selectedTab.MergeWith(tab);
\r
869 SplitContainer container = (SplitContainer)selectedTab.Control;
\r
870 toolStripContainer1.ContentPanel.Controls.Add(container);
\r
872 selectedTab.Select();
\r
873 RemoveTabEntry(tab);
\r
875 tabs.Add(tab.Name, selectedTab);
\r
878 private void SplitClick(object sender, EventArgs e)
\r
880 SplitTab(selectedTab);
\r
881 selectedTab.Select();
\r
884 public void SplitTab(RadegastTab tab)
\r
886 RadegastTab otherTab = tab.Split();
\r
887 if (otherTab == null) return;
\r
889 toolStripContainer1.ContentPanel.Controls.Add(tab.Control);
\r
890 toolStripContainer1.ContentPanel.Controls.Add(otherTab.Control);
\r
892 tabs.Remove(otherTab.Name);
\r
896 private void tmnuDetachTab_Click(object sender, EventArgs e)
\r
898 if (!selectedTab.AllowDetach) return;
\r
899 RadegastTab tab = selectedTab;
\r
900 tabs["chat"].Select();
\r
901 tab.Detach(instance);
\r
904 private void tbtnCloseTab_Click(object sender, EventArgs e)
\r
906 RadegastTab tab = selectedTab;
\r
907 if (tab.AllowClose)
\r
909 else if (tab.AllowHide)
\r
913 private void TabsConsole_Load(object sender, EventArgs e)
\r
915 owner = this.FindForm();
\r
918 private void ctxTabs_Opening(object sender, CancelEventArgs e)
\r
920 Point pt = this.PointToClient(Cursor.Position);
\r
921 ToolStripItem stripItem = tstTabs.GetItemAt(pt);
\r
923 if (stripItem == null)
\r
929 tabs[stripItem.Tag.ToString()].Select();
\r
931 ctxBtnClose.Enabled = selectedTab.AllowClose || selectedTab.AllowHide;
\r
932 ctxBtnDetach.Enabled = selectedTab.AllowDetach;
\r
933 ctxBtnMerge.Enabled = selectedTab.AllowMerge;
\r
934 ctxBtnMerge.DropDown.Items.Clear();
\r
936 if (!ctxBtnClose.Enabled && !ctxBtnDetach.Enabled && !ctxBtnMerge.Enabled)
\r
942 if (!selectedTab.AllowMerge) return;
\r
943 if (!selectedTab.Merged)
\r
945 ctxBtnMerge.Text = "Merge With";
\r
947 List<RadegastTab> otherTabs = GetOtherTabs();
\r
949 ctxBtnMerge.Enabled = (otherTabs.Count > 0);
\r
950 if (!ctxBtnMerge.Enabled) return;
\r
952 foreach (RadegastTab tab in otherTabs)
\r
954 ToolStripItem item = ctxBtnMerge.DropDown.Items.Add(tab.Label);
\r
955 item.Tag = tab.Name;
\r
956 item.Click += new EventHandler(MergeItemClick);
\r
961 ctxBtnMerge.Text = "Split";
\r
962 ctxBtnMerge.Click += new EventHandler(SplitClick);
\r
971 /// Arguments for tab events
\r
973 public class TabEventArgs : EventArgs
\r
976 /// Tab that was manipulated in the event
\r
978 public RadegastTab Tab;
\r
980 public TabEventArgs()
\r
985 public TabEventArgs(RadegastTab tab)
\r