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
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
48 public Dictionary<string, SleekTab> tabs = new Dictionary<string, SleekTab>();
\r
49 private ChatConsole chatConsole;
\r
51 private SleekTab selectedTab;
\r
52 public SleekTab SelectedTab
\r
62 public TabsConsole(RadegastInstance instance)
\r
64 InitializeComponent();
\r
65 Disposed += new EventHandler(TabsConsole_Disposed);
\r
67 this.instance = instance;
\r
71 InitializeMainTab();
\r
72 InitializeChatTab();
\r
75 client.Self.OnScriptQuestion += new AgentManager.ScriptQuestionCallback(Self_OnScriptQuestion);
\r
76 client.Self.OnScriptDialog += new AgentManager.ScriptDialogCallback(Self_OnScriptDialog);
\r
77 client.Inventory.OnObjectOffered += new InventoryManager.ObjectOfferedCallback(Inventory_OnObjectOffered);
\r
80 void TabsConsole_Disposed(object sender, EventArgs e)
\r
82 RemoveNetcomEvents();
\r
83 client.Self.OnScriptQuestion -= new AgentManager.ScriptQuestionCallback(Self_OnScriptQuestion);
\r
84 client.Self.OnScriptDialog -= new AgentManager.ScriptDialogCallback(Self_OnScriptDialog);
\r
85 client.Inventory.OnObjectOffered -= new InventoryManager.ObjectOfferedCallback(Inventory_OnObjectOffered);
\r
88 private void AddNetcomEvents()
\r
90 netcom.ClientLoginStatus += new EventHandler<ClientLoginEventArgs>(netcom_ClientLoginStatus);
\r
91 netcom.ClientLoggedOut += new EventHandler(netcom_ClientLoggedOut);
\r
92 netcom.ClientDisconnected += new EventHandler<ClientDisconnectEventArgs>(netcom_ClientDisconnected);
\r
93 netcom.ChatReceived += new EventHandler<ChatEventArgs>(netcom_ChatReceived);
\r
94 netcom.ChatSent += new EventHandler<ChatSentEventArgs>(netcom_ChatSent);
\r
95 netcom.AlertMessageReceived += new EventHandler<AlertMessageEventArgs>(netcom_AlertMessageReceived);
\r
96 netcom.InstantMessageReceived += new EventHandler<InstantMessageEventArgs>(netcom_InstantMessageReceived);
\r
99 private void RemoveNetcomEvents()
\r
101 netcom.ClientLoginStatus -= new EventHandler<ClientLoginEventArgs>(netcom_ClientLoginStatus);
\r
102 netcom.ClientLoggedOut -= new EventHandler(netcom_ClientLoggedOut);
\r
103 netcom.ClientDisconnected -= new EventHandler<ClientDisconnectEventArgs>(netcom_ClientDisconnected);
\r
104 netcom.ChatReceived -= new EventHandler<ChatEventArgs>(netcom_ChatReceived);
\r
105 netcom.ChatSent -= new EventHandler<ChatSentEventArgs>(netcom_ChatSent);
\r
106 netcom.AlertMessageReceived -= new EventHandler<AlertMessageEventArgs>(netcom_AlertMessageReceived);
\r
107 netcom.InstantMessageReceived -= new EventHandler<InstantMessageEventArgs>(netcom_InstantMessageReceived);
\r
110 bool Inventory_OnObjectOffered(InstantMessage offerDetails, AssetType type, UUID objectID, bool fromTask)
\r
112 DisplayNotificationInChat(offerDetails.FromAgentName + " gave you " + offerDetails.Message);
\r
116 void Self_OnScriptDialog(string message, string objectName, UUID imageID, UUID objectID, string firstName, string lastName, int chatChannel, List<string> buttons)
\r
118 instance.MainForm.AddNotification(new ntfScriptDialog(instance, message, objectName, imageID, objectID, firstName, lastName, chatChannel, buttons));
\r
121 void Self_OnScriptQuestion(Simulator simulator, UUID taskID, UUID itemID, string objectName, string objectOwner, ScriptPermission questions)
\r
123 instance.MainForm.AddNotification(new ntfPermissions(instance, simulator, taskID, itemID, objectName, objectOwner, questions));
\r
126 private void netcom_ClientLoginStatus(object sender, ClientLoginEventArgs e)
\r
128 if (e.Status != LoginStatus.Success) return;
\r
130 InitializeFriendsTab();
\r
131 InitializeInventoryTab();
\r
132 InitializeSearchTab();
\r
134 if (selectedTab.Name == "login")
\r
135 tabs["chat"].Select();
\r
137 tabs["login"].AllowClose = true;
\r
138 tabs["login"].Close();
\r
140 client.Self.RetrieveInstantMessages();
\r
143 private void netcom_ClientLoggedOut(object sender, EventArgs e)
\r
145 DisposeSearchTab();
\r
146 DisposeInventoryTab();
\r
147 DisposeFriendsTab();
\r
149 tabs["chat"].Select();
\r
150 DisplayNotificationInChat("Logged out.");
\r
154 private void netcom_ClientDisconnected(object sender, ClientDisconnectEventArgs e)
\r
156 if (e.Type == NetworkManager.DisconnectType.ClientInitiated) return;
\r
158 DisposeSearchTab();
\r
159 DisposeInventoryTab();
\r
160 DisposeFriendsTab();
\r
162 tabs["chat"].Select();
\r
163 DisplayNotificationInChat("Disconnected.");
\r
166 private void netcom_AlertMessageReceived(object sender, AlertMessageEventArgs e)
\r
168 tabs["chat"].Highlight();
\r
171 private void netcom_ChatSent(object sender, ChatSentEventArgs e)
\r
173 tabs["chat"].Highlight();
\r
176 private void netcom_ChatReceived(object sender, ChatEventArgs e)
\r
178 if (string.IsNullOrEmpty(e.Message)) return;
\r
180 tabs["chat"].Highlight();
\r
183 private void netcom_InstantMessageReceived(object sender, InstantMessageEventArgs e)
\r
185 switch (e.IM.Dialog)
\r
187 case InstantMessageDialog.SessionSend:
\r
188 if (instance.Groups.ContainsKey(e.IM.IMSessionID))
\r
194 HandleConferenceIM(e);
\r
198 case InstantMessageDialog.MessageFromAgent:
\r
199 if (e.IM.FromAgentName == "Second Life")
\r
201 HandleIMFromObject(e);
\r
203 else if (e.IM.GroupIM || instance.Groups.ContainsKey(e.IM.IMSessionID))
\r
207 else if (e.IM.BinaryBucket.Length > 1)
\r
209 HandleConferenceIM(e);
\r
217 case InstantMessageDialog.MessageFromObject:
\r
218 HandleIMFromObject(e);
\r
221 case InstantMessageDialog.StartTyping:
\r
222 if (TabExists(e.IM.FromAgentName))
\r
224 SleekTab tab = tabs[e.IM.FromAgentName.ToLower()];
\r
225 if (!tab.Highlighted) tab.PartialHighlight();
\r
230 case InstantMessageDialog.StopTyping:
\r
231 if (TabExists(e.IM.FromAgentName))
\r
233 SleekTab tab = tabs[e.IM.FromAgentName.ToLower()];
\r
234 if (!tab.Highlighted) tab.Unhighlight();
\r
239 case InstantMessageDialog.MessageBox:
\r
240 instance.MainForm.AddNotification(new ntfGeneric(instance, e.IM.Message));
\r
243 case InstantMessageDialog.RequestTeleport:
\r
244 instance.MainForm.AddNotification(new ntfTeleport(instance, e.IM));
\r
247 case InstantMessageDialog.GroupInvitation:
\r
248 instance.MainForm.AddNotification(new ntfGroupInvitation(instance, e.IM));
\r
251 case InstantMessageDialog.FriendshipOffered:
\r
252 instance.MainForm.AddNotification(new ntfFriendshipOffer(instance, e.IM));
\r
255 case InstantMessageDialog.InventoryAccepted:
\r
256 DisplayNotificationInChat(e.IM.FromAgentName + " accepted your inventory offer.");
\r
259 case InstantMessageDialog.GroupNotice:
\r
260 instance.MainForm.AddNotification(new ntfGroupNotice(instance, e.IM));
\r
265 public void DisplayNotificationInChat(string msg)
\r
267 if (InvokeRequired)
\r
269 BeginInvoke(new MethodInvoker(delegate()
\r
271 DisplayNotificationInChat(msg);
\r
276 ChatBufferItem line = new ChatBufferItem(
\r
279 ChatBufferTextStyle.ObjectChat
\r
283 mainChatManger.ProcessBufferItem(line, true);
\r
284 tabs["chat"].Highlight();
\r
286 catch (Exception) { }
\r
289 private void HandleIMFromObject(InstantMessageEventArgs e)
\r
291 DisplayNotificationInChat(e.IM.FromAgentName + ": " + e.IM.Message);
\r
294 private void HandleIM(InstantMessageEventArgs e)
\r
296 if (TabExists(e.IM.IMSessionID.ToString()))
\r
298 SleekTab tab = tabs[e.IM.IMSessionID.ToString()];
\r
299 if (!tab.Selected) tab.Highlight();
\r
303 IMTabWindow imTab = AddIMTab(e);
\r
304 tabs[e.IM.IMSessionID.ToString()].Highlight();
\r
307 private void HandleConferenceIM(InstantMessageEventArgs e)
\r
309 if (TabExists(e.IM.IMSessionID.ToString()))
\r
311 SleekTab tab = tabs[e.IM.IMSessionID.ToString()];
\r
312 if (!tab.Selected) tab.Highlight();
\r
316 ConferenceIMTabWindow imTab = AddConferenceIMTab(e);
\r
317 tabs[e.IM.IMSessionID.ToString()].Highlight();
\r
320 private void HandleGroupIM(InstantMessageEventArgs e)
\r
322 if (TabExists(e.IM.IMSessionID.ToString())) {
\r
323 SleekTab tab = tabs[e.IM.IMSessionID.ToString()];
\r
324 if (!tab.Selected) tab.Highlight();
\r
328 GroupIMTabWindow imTab = AddGroupIMTab(e);
\r
329 tabs[e.IM.IMSessionID.ToString()].Highlight();
\r
332 private void InitializeMainTab()
\r
334 MainConsole mainConsole = new MainConsole(instance);
\r
335 mainConsole.Dock = DockStyle.Fill;
\r
336 mainConsole.Visible = false;
\r
338 toolStripContainer1.ContentPanel.Controls.Add(mainConsole);
\r
340 SleekTab tab = AddTab("login", "Login", mainConsole);
\r
341 tab.AllowClose = false;
\r
342 tab.AllowDetach = false;
\r
343 tab.AllowMerge = false;
\r
345 mainConsole.RegisterTab(tab);
\r
348 private void InitializeChatTab()
\r
350 chatConsole = new ChatConsole(instance);
\r
351 mainChatManger = chatConsole.ChatManager;
\r
352 chatConsole.Dock = DockStyle.Fill;
\r
353 chatConsole.Visible = false;
\r
355 toolStripContainer1.ContentPanel.Controls.Add(chatConsole);
\r
357 SleekTab tab = AddTab("chat", "Chat", chatConsole);
\r
358 tab.AllowClose = false;
\r
359 tab.AllowDetach = false;
\r
362 private void InitializeFriendsTab()
\r
364 FriendsConsole friendsConsole = new FriendsConsole(instance);
\r
365 friendsConsole.Dock = DockStyle.Fill;
\r
366 friendsConsole.Visible = false;
\r
368 toolStripContainer1.ContentPanel.Controls.Add(friendsConsole);
\r
370 SleekTab tab = AddTab("friends", "Friends", friendsConsole);
\r
371 tab.AllowClose = false;
\r
372 tab.AllowDetach = false;
\r
375 private void InitializeSearchTab()
\r
377 SearchConsole searchConsole = new SearchConsole(instance);
\r
378 searchConsole.Dock = DockStyle.Fill;
\r
379 searchConsole.Visible = false;
\r
381 toolStripContainer1.ContentPanel.Controls.Add(searchConsole);
\r
383 SleekTab tab = AddTab("search", "Search", searchConsole);
\r
384 tab.AllowClose = false;
\r
385 tab.AllowDetach = false;
\r
388 private void InitializeInventoryTab()
\r
390 InventoryConsole invConsole = new InventoryConsole(instance);
\r
391 invConsole.Dock = DockStyle.Fill;
\r
392 invConsole.Visible = true;
\r
394 toolStripContainer1.ContentPanel.Controls.Add(invConsole);
\r
396 SleekTab tab = AddTab("inventory", "Inventory", invConsole);
\r
397 tab.AllowClose = false;
\r
398 tab.AllowDetach = true;
\r
401 private void DisposeFriendsTab()
\r
403 ForceCloseTab("friends");
\r
406 private void DisposeSearchTab()
\r
408 ForceCloseTab("search");
\r
411 private void DisposeInventoryTab()
\r
413 ForceCloseTab("inventory");
\r
416 private void ForceCloseTab(string name)
\r
418 if (!TabExists(name)) return;
\r
420 SleekTab tab = tabs[name];
\r
421 if (tab.Merged) SplitTab(tab);
\r
423 tab.AllowClose = true;
\r
428 public void AddTab(SleekTab tab)
\r
430 ToolStripButton button = (ToolStripButton)tstTabs.Items.Add(tab.Label);
\r
431 button.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText;
\r
432 button.Image = null;
\r
433 button.AutoToolTip = false;
\r
434 button.Tag = tab.Name;
\r
435 button.Click += new EventHandler(TabButtonClick);
\r
436 tab.Button = button;
\r
437 tabs.Add(tab.Name, tab);
\r
440 public SleekTab AddTab(string name, string label, Control control)
\r
442 ToolStripButton button = (ToolStripButton)tstTabs.Items.Add(label);
\r
443 button.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText;
\r
444 button.Image = null;
\r
445 button.AutoToolTip = false;
\r
446 button.Tag = name.ToLower();
\r
447 button.Click += new EventHandler(TabButtonClick);
\r
449 SleekTab tab = new SleekTab(instance, button, control, name.ToLower(), label);
\r
450 tab.TabAttached += new EventHandler(tab_TabAttached);
\r
451 tab.TabDetached += new EventHandler(tab_TabDetached);
\r
452 tab.TabSelected += new EventHandler(tab_TabSelected);
\r
453 tab.TabClosed += new EventHandler(tab_TabClosed);
\r
454 tabs.Add(name.ToLower(), tab);
\r
459 private void tab_TabAttached(object sender, EventArgs e)
\r
461 SleekTab tab = (SleekTab)sender;
\r
465 private void tab_TabDetached(object sender, EventArgs e)
\r
467 SleekTab tab = (SleekTab)sender;
\r
468 frmDetachedTab form = (frmDetachedTab)tab.Owner;
\r
470 form.ReattachStrip = tstTabs;
\r
471 form.ReattachContainer = toolStripContainer1.ContentPanel;
\r
474 private void tab_TabSelected(object sender, EventArgs e)
\r
476 SleekTab tab = (SleekTab)sender;
\r
478 if (selectedTab != null &&
\r
479 selectedTab != tab)
\r
480 { selectedTab.Deselect(); }
\r
484 tbtnCloseTab.Enabled = tab.AllowClose;
\r
485 owner.AcceptButton = tab.DefaultControlButton;
\r
488 private void tab_TabClosed(object sender, EventArgs e)
\r
490 SleekTab tab = (SleekTab)sender;
\r
492 tabs.Remove(tab.Name);
\r
496 private void TabButtonClick(object sender, EventArgs e)
\r
498 ToolStripButton button = (ToolStripButton)sender;
\r
500 SleekTab tab = tabs[button.Tag.ToString()];
\r
504 public void RemoveTabEntry(SleekTab tab)
\r
506 if (tstTabs.Items.Contains(tab.Button))
\r
508 tstTabs.Items.Remove(tab.Button);
\r
511 tab.Button.Dispose();
\r
512 tabs.Remove(tab.Name);
\r
515 public void RemoveTab(string name)
\r
517 if (tabs.ContainsKey(name))
\r
523 //Used for outside classes that have a reference to TabsConsole
\r
524 public void SelectTab(string name)
\r
526 tabs[name.ToLower()].Select();
\r
529 public bool TabExists(string name)
\r
531 return tabs.ContainsKey(name.ToLower());
\r
534 public SleekTab GetTab(string name)
\r
536 return tabs[name.ToLower()];
\r
539 public List<SleekTab> GetOtherTabs()
\r
541 List<SleekTab> otherTabs = new List<SleekTab>();
\r
543 foreach (ToolStripItem item in tstTabs.Items)
\r
545 if (item.Tag == null) continue;
\r
546 if ((ToolStripItem)item == selectedTab.Button) continue;
\r
548 SleekTab tab = tabs[item.Tag.ToString()];
\r
549 if (!tab.AllowMerge) continue;
\r
550 if (tab.Merged) continue;
\r
552 otherTabs.Add(tab);
\r
559 /// Activates the next tab
\r
561 public void SelectNextTab()
\r
563 List<ToolStripItem> buttons = new List<ToolStripItem>();
\r
565 foreach (ToolStripItem item in tstTabs.Items)
\r
567 if (item.Tag == null) continue;
\r
574 for (int i = 0; i < buttons.Count; i++)
\r
576 if (buttons[i] == selectedTab.Button)
\r
585 if (current == buttons.Count)
\r
588 SelectTab(tabs[buttons[current].Tag.ToString()].Name);
\r
592 /// Activates the previous tab
\r
594 public void SelectPreviousTab()
\r
596 List<ToolStripItem> buttons = new List<ToolStripItem>();
\r
598 foreach (ToolStripItem item in tstTabs.Items)
\r
600 if (item.Tag == null) continue;
\r
607 for (int i = 0; i < buttons.Count; i++)
\r
609 if (buttons[i] == selectedTab.Button)
\r
619 current = buttons.Count - 1;
\r
621 SelectTab(tabs[buttons[current].Tag.ToString()].Name);
\r
625 public IMTabWindow AddIMTab(UUID target, UUID session, string targetName)
\r
627 IMTabWindow imTab = new IMTabWindow(instance, target, session, targetName);
\r
628 imTab.Dock = DockStyle.Fill;
\r
630 toolStripContainer1.ContentPanel.Controls.Add(imTab);
\r
631 SleekTab tab = AddTab(session.ToString(), "IM: " + targetName, imTab);
\r
632 SelectTab(session.ToString());
\r
633 imTab.SelectIMInput();
\r
638 public ConferenceIMTabWindow AddConferenceIMTab(UUID session, string name)
\r
640 ConferenceIMTabWindow imTab = new ConferenceIMTabWindow(instance, session, name);
\r
641 imTab.Dock = DockStyle.Fill;
\r
643 toolStripContainer1.ContentPanel.Controls.Add(imTab);
\r
644 SleekTab tab = AddTab(session.ToString(), name, imTab);
\r
645 imTab.SelectIMInput();
\r
651 public ConferenceIMTabWindow AddConferenceIMTab(InstantMessageEventArgs e)
\r
653 ConferenceIMTabWindow imTab = AddConferenceIMTab(e.IM.IMSessionID, Utils.BytesToString(e.IM.BinaryBucket));
\r
654 imTab.TextManager.ProcessIM(e);
\r
658 public GroupIMTabWindow AddGroupIMTab(UUID session, string name)
\r
660 GroupIMTabWindow imTab = new GroupIMTabWindow(instance, session, name);
\r
661 imTab.Dock = DockStyle.Fill;
\r
663 toolStripContainer1.ContentPanel.Controls.Add(imTab);
\r
664 SleekTab tab = AddTab(session.ToString(), name, imTab);
\r
665 imTab.SelectIMInput();
\r
670 public GroupIMTabWindow AddGroupIMTab(InstantMessageEventArgs e)
\r
672 GroupIMTabWindow imTab = AddGroupIMTab(e.IM.IMSessionID, Utils.BytesToString(e.IM.BinaryBucket));
\r
673 imTab.TextManager.ProcessIM(e);
\r
677 public IMTabWindow AddIMTab(InstantMessageEventArgs e)
\r
679 IMTabWindow imTab = AddIMTab(e.IM.FromAgentID, e.IM.IMSessionID, e.IM.FromAgentName);
\r
680 imTab.TextManager.ProcessIM(e);
\r
684 public OutfitTextures AddOTTab(Avatar avatar)
\r
686 OutfitTextures otTab = new OutfitTextures(instance, avatar);
\r
687 otTab.Dock = DockStyle.Fill;
\r
688 toolStripContainer1.ContentPanel.Controls.Add(otTab);
\r
689 SleekTab tab = AddTab("OT: " + avatar.Name, "OT: " + avatar.Name, otTab);
\r
690 otTab.GetTextures();
\r
694 public MasterTab AddMSTab(Avatar avatar)
\r
696 MasterTab msTab = new MasterTab(instance, avatar);
\r
697 msTab.Dock = DockStyle.Fill;
\r
698 toolStripContainer1.ContentPanel.Controls.Add(msTab);
\r
699 SleekTab tab = AddTab("MS: " + avatar.Name, "MS: " + avatar.Name, msTab);
\r
700 // msTab.GetTextures();
\r
704 public AttachmentTab AddATTab(Avatar avatar)
\r
706 AttachmentTab atTab = new AttachmentTab(instance, avatar);
\r
707 atTab.Dock = DockStyle.Fill;
\r
708 toolStripContainer1.ContentPanel.Controls.Add(atTab);
\r
709 SleekTab tab = AddTab("AT: " + avatar.Name, "AT: " + avatar.Name, atTab);
\r
713 public AnimTab AddAnimTab(Avatar avatar)
\r
715 AnimTab animTab = new AnimTab(instance, avatar);
\r
716 animTab.Dock = DockStyle.Fill;
\r
717 toolStripContainer1.ContentPanel.Controls.Add(animTab);
\r
718 SleekTab tab = AddTab("Anim: " + avatar.Name, "Anim: " + avatar.Name, animTab);
\r
722 private void tbtnTabOptions_Click(object sender, EventArgs e)
\r
724 tmnuMergeWith.Enabled = selectedTab.AllowMerge;
\r
725 tmnuDetachTab.Enabled = selectedTab.AllowDetach;
\r
727 tmnuMergeWith.DropDown.Items.Clear();
\r
729 if (!selectedTab.AllowMerge) return;
\r
730 if (!selectedTab.Merged)
\r
732 tmnuMergeWith.Text = "Merge With";
\r
734 List<SleekTab> otherTabs = GetOtherTabs();
\r
736 tmnuMergeWith.Enabled = (otherTabs.Count > 0);
\r
737 if (!tmnuMergeWith.Enabled) return;
\r
739 foreach (SleekTab tab in otherTabs)
\r
741 ToolStripItem item = tmnuMergeWith.DropDown.Items.Add(tab.Label);
\r
742 item.Tag = tab.Name;
\r
743 item.Click += new EventHandler(MergeItemClick);
\r
748 tmnuMergeWith.Text = "Split";
\r
749 tmnuMergeWith.Click += new EventHandler(SplitClick);
\r
753 private void MergeItemClick(object sender, EventArgs e)
\r
755 ToolStripItem item = (ToolStripItem)sender;
\r
756 SleekTab tab = tabs[item.Tag.ToString()];
\r
758 selectedTab.MergeWith(tab);
\r
760 SplitContainer container = (SplitContainer)selectedTab.Control;
\r
761 toolStripContainer1.ContentPanel.Controls.Add(container);
\r
763 selectedTab.Select();
\r
764 RemoveTabEntry(tab);
\r
766 tabs.Add(tab.Name, selectedTab);
\r
769 private void SplitClick(object sender, EventArgs e)
\r
771 SplitTab(selectedTab);
\r
772 selectedTab.Select();
\r
775 public void SplitTab(SleekTab tab)
\r
777 SleekTab otherTab = tab.Split();
\r
778 if (otherTab == null) return;
\r
780 toolStripContainer1.ContentPanel.Controls.Add(tab.Control);
\r
781 toolStripContainer1.ContentPanel.Controls.Add(otherTab.Control);
\r
783 tabs.Remove(otherTab.Name);
\r
787 private void tmnuDetachTab_Click(object sender, EventArgs e)
\r
789 if (!selectedTab.AllowDetach) return;
\r
791 tstTabs.Items.Remove(selectedTab.Button);
\r
792 selectedTab.Detach(instance);
\r
793 selectedTab.Owner.Show();
\r
795 tabs["chat"].Select();
\r
798 private void tbtnCloseTab_Click(object sender, EventArgs e)
\r
800 SleekTab tab = selectedTab;
\r
802 tabs["chat"].Select();
\r
808 private void TabsConsole_Load(object sender, EventArgs e)
\r
810 owner = this.FindForm();
\r
813 private void ctxTabs_Opening(object sender, CancelEventArgs e)
\r
815 Point pt = this.PointToClient(Cursor.Position);
\r
816 ToolStripItem stripItem = tstTabs.GetItemAt(pt);
\r
818 if (stripItem == null)
\r
824 tabs[stripItem.Tag.ToString()].Select();
\r
826 ctxBtnClose.Enabled = selectedTab.AllowClose;
\r
827 ctxBtnDetach.Enabled = selectedTab.AllowDetach;
\r
828 ctxBtnMerge.Enabled = selectedTab.AllowMerge;
\r
829 ctxBtnMerge.DropDown.Items.Clear();
\r
831 if (!ctxBtnClose.Enabled && !ctxBtnDetach.Enabled && !ctxBtnMerge.Enabled)
\r
837 if (!selectedTab.AllowMerge) return;
\r
838 if (!selectedTab.Merged)
\r
840 ctxBtnMerge.Text = "Merge With";
\r
842 List<SleekTab> otherTabs = GetOtherTabs();
\r
844 ctxBtnMerge.Enabled = (otherTabs.Count > 0);
\r
845 if (!ctxBtnMerge.Enabled) return;
\r
847 foreach (SleekTab tab in otherTabs)
\r
849 ToolStripItem item = ctxBtnMerge.DropDown.Items.Add(tab.Label);
\r
850 item.Tag = tab.Name;
\r
851 item.Click += new EventHandler(MergeItemClick);
\r
856 ctxBtnMerge.Text = "Split";
\r
857 ctxBtnMerge.Click += new EventHandler(SplitClick);
\r