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
54 public TabsConsole(RadegastInstance instance)
\r
56 InitializeComponent();
\r
57 Disposed += new EventHandler(TabsConsole_Disposed);
\r
59 this.instance = instance;
\r
63 InitializeMainTab();
\r
64 InitializeChatTab();
\r
66 ApplyConfig(this.instance.Config.CurrentConfig);
\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
75 void TabsConsole_Disposed(object sender, EventArgs e)
\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
84 private void AddNetcomEvents()
\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
95 private void RemoveNetcomEvents()
\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
106 bool Inventory_OnObjectOffered(InstantMessage offerDetails, AssetType type, UUID objectID, bool fromTask)
\r
108 DisplayNotificationInChat(offerDetails.FromAgentName + " gave you " + offerDetails.Message);
\r
112 void Self_OnScriptDialog(string message, string objectName, UUID imageID, UUID objectID, string firstName, string lastName, int chatChannel, List<string> buttons)
\r
114 instance.MainForm.AddNotification(new ntfScriptDialog(instance, message, objectName, imageID, objectID, firstName, lastName, chatChannel, buttons));
\r
117 void Self_OnScriptQuestion(Simulator simulator, UUID taskID, UUID itemID, string objectName, string objectOwner, ScriptPermission questions)
\r
119 instance.MainForm.AddNotification(new ntfPermissions(instance, simulator, taskID, itemID, objectName, objectOwner, questions));
\r
122 private void Config_ConfigApplied(object sender, ConfigAppliedEventArgs e)
\r
124 ApplyConfig(e.AppliedConfig);
\r
127 private void ApplyConfig(Config config)
\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
135 private void netcom_ClientLoginStatus(object sender, ClientLoginEventArgs e)
\r
137 if (e.Status != LoginStatus.Success) return;
\r
139 InitializeFriendsTab();
\r
140 InitializeInventoryTab();
\r
141 InitializeSearchTab();
\r
143 if (selectedTab.Name == "main")
\r
144 tabs["chat"].Select();
\r
146 tabs["main"].AllowClose = true;
\r
147 tabs["main"].Close();
\r
149 client.Self.RetrieveInstantMessages();
\r
152 private void netcom_ClientLoggedOut(object sender, EventArgs e)
\r
154 DisposeSearchTab();
\r
155 DisposeInventoryTab();
\r
156 DisposeFriendsTab();
\r
158 tabs["chat"].Select();
\r
159 DisplayNotificationInChat("Logged out.");
\r
163 private void netcom_ClientDisconnected(object sender, ClientDisconnectEventArgs e)
\r
165 if (e.Type == NetworkManager.DisconnectType.ClientInitiated) return;
\r
167 DisposeSearchTab();
\r
168 DisposeInventoryTab();
\r
169 DisposeFriendsTab();
\r
171 tabs["chat"].Select();
\r
172 DisplayNotificationInChat("Disconnected.");
\r
175 private void netcom_AlertMessageReceived(object sender, AlertMessageEventArgs e)
\r
177 tabs["chat"].Highlight();
\r
180 private void netcom_ChatSent(object sender, ChatSentEventArgs e)
\r
182 tabs["chat"].Highlight();
\r
185 private void netcom_ChatReceived(object sender, ChatEventArgs e)
\r
187 if (string.IsNullOrEmpty(e.Message)) return;
\r
189 tabs["chat"].Highlight();
\r
192 private void netcom_InstantMessageReceived(object sender, InstantMessageEventArgs e)
\r
194 switch (e.IM.Dialog)
\r
196 case InstantMessageDialog.SessionSend:
\r
197 if (instance.Groups.ContainsKey(e.IM.IMSessionID))
\r
203 HandleConferenceIM(e);
\r
207 case InstantMessageDialog.MessageFromAgent:
\r
208 if (e.IM.FromAgentName == "Second Life")
\r
210 HandleIMFromObject(e);
\r
212 else if (e.IM.GroupIM || instance.Groups.ContainsKey(e.IM.IMSessionID))
\r
216 else if (e.IM.BinaryBucket.Length > 1)
\r
218 HandleConferenceIM(e);
\r
226 case InstantMessageDialog.MessageFromObject:
\r
227 HandleIMFromObject(e);
\r
230 case InstantMessageDialog.StartTyping:
\r
231 if (TabExists(e.IM.FromAgentName))
\r
233 SleekTab tab = tabs[e.IM.FromAgentName.ToLower()];
\r
234 if (!tab.Highlighted) tab.PartialHighlight();
\r
239 case InstantMessageDialog.StopTyping:
\r
240 if (TabExists(e.IM.FromAgentName))
\r
242 SleekTab tab = tabs[e.IM.FromAgentName.ToLower()];
\r
243 if (!tab.Highlighted) tab.Unhighlight();
\r
248 case InstantMessageDialog.MessageBox:
\r
249 instance.MainForm.AddNotification(new ntfGeneric(instance, e.IM.Message));
\r
252 case InstantMessageDialog.RequestTeleport:
\r
253 instance.MainForm.AddNotification(new ntfTeleport(instance, e.IM));
\r
256 case InstantMessageDialog.GroupInvitation:
\r
257 instance.MainForm.AddNotification(new ntfGroupInvitation(instance, e.IM));
\r
260 case InstantMessageDialog.FriendshipOffered:
\r
261 instance.MainForm.AddNotification(new ntfFriendshipOffer(instance, e.IM));
\r
264 case InstantMessageDialog.InventoryAccepted:
\r
265 DisplayNotificationInChat(e.IM.FromAgentName + " accepted your inventory offer.");
\r
270 public void DisplayNotificationInChat(string msg)
\r
272 if (InvokeRequired)
\r
274 BeginInvoke(new MethodInvoker(delegate()
\r
276 DisplayNotificationInChat(msg);
\r
281 ChatBufferItem line = new ChatBufferItem(
\r
284 ChatBufferTextStyle.ObjectChat
\r
288 mainChatManger.ProcessBufferItem(line, true);
\r
289 tabs["chat"].Highlight();
\r
291 catch (Exception) { }
\r
294 private void HandleIMFromObject(InstantMessageEventArgs e)
\r
296 DisplayNotificationInChat(e.IM.FromAgentName + ": " + e.IM.Message);
\r
299 private void HandleIM(InstantMessageEventArgs e)
\r
301 if (TabExists(e.IM.IMSessionID.ToString()))
\r
303 SleekTab tab = tabs[e.IM.IMSessionID.ToString()];
\r
304 if (!tab.Selected) tab.Highlight();
\r
308 IMTabWindow imTab = AddIMTab(e);
\r
309 tabs[e.IM.IMSessionID.ToString()].Highlight();
\r
312 private void HandleConferenceIM(InstantMessageEventArgs e)
\r
314 if (TabExists(e.IM.IMSessionID.ToString()))
\r
316 SleekTab tab = tabs[e.IM.IMSessionID.ToString()];
\r
317 if (!tab.Selected) tab.Highlight();
\r
321 ConferenceIMTabWindow imTab = AddConferenceIMTab(e);
\r
322 tabs[e.IM.IMSessionID.ToString()].Highlight();
\r
325 private void HandleGroupIM(InstantMessageEventArgs e)
\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
333 GroupIMTabWindow imTab = AddGroupIMTab(e);
\r
334 tabs[e.IM.IMSessionID.ToString()].Highlight();
\r
337 private void InitializeMainTab()
\r
339 MainConsole mainConsole = new MainConsole(instance);
\r
340 mainConsole.Dock = DockStyle.Fill;
\r
341 mainConsole.Visible = false;
\r
343 toolStripContainer1.ContentPanel.Controls.Add(mainConsole);
\r
345 SleekTab tab = AddTab("main", "Main", mainConsole);
\r
346 tab.AllowClose = false;
\r
347 tab.AllowDetach = false;
\r
348 tab.AllowMerge = false;
\r
350 mainConsole.RegisterTab(tab);
\r
353 private void InitializeChatTab()
\r
355 chatConsole = new ChatConsole(instance);
\r
356 mainChatManger = chatConsole.ChatManager;
\r
357 chatConsole.Dock = DockStyle.Fill;
\r
358 chatConsole.Visible = false;
\r
360 toolStripContainer1.ContentPanel.Controls.Add(chatConsole);
\r
362 SleekTab tab = AddTab("chat", "Chat", chatConsole);
\r
363 tab.AllowClose = false;
\r
364 tab.AllowDetach = false;
\r
367 private void InitializeFriendsTab()
\r
369 FriendsConsole friendsConsole = new FriendsConsole(instance);
\r
370 friendsConsole.Dock = DockStyle.Fill;
\r
371 friendsConsole.Visible = false;
\r
373 toolStripContainer1.ContentPanel.Controls.Add(friendsConsole);
\r
375 SleekTab tab = AddTab("friends", "Friends", friendsConsole);
\r
376 tab.AllowClose = false;
\r
377 tab.AllowDetach = false;
\r
380 private void InitializeSearchTab()
\r
382 SearchConsole searchConsole = new SearchConsole(instance);
\r
383 searchConsole.Dock = DockStyle.Fill;
\r
384 searchConsole.Visible = false;
\r
386 toolStripContainer1.ContentPanel.Controls.Add(searchConsole);
\r
388 SleekTab tab = AddTab("search", "Search", searchConsole);
\r
389 tab.AllowClose = false;
\r
390 tab.AllowDetach = false;
\r
393 private void InitializeInventoryTab()
\r
395 InventoryConsole invConsole = new InventoryConsole(instance);
\r
396 invConsole.Dock = DockStyle.Fill;
\r
397 invConsole.Visible = true;
\r
399 toolStripContainer1.ContentPanel.Controls.Add(invConsole);
\r
401 SleekTab tab = AddTab("inventory", "Inventory", invConsole);
\r
402 tab.AllowClose = false;
\r
403 tab.AllowDetach = true;
\r
406 private void DisposeFriendsTab()
\r
408 ForceCloseTab("friends");
\r
411 private void DisposeSearchTab()
\r
413 ForceCloseTab("search");
\r
416 private void DisposeInventoryTab()
\r
418 ForceCloseTab("inventory");
\r
421 private void ForceCloseTab(string name)
\r
423 if (!TabExists(name)) return;
\r
425 SleekTab tab = tabs[name];
\r
426 if (tab.Merged) SplitTab(tab);
\r
428 tab.AllowClose = true;
\r
433 public void AddTab(SleekTab tab)
\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
445 public SleekTab AddTab(string name, string label, Control control)
\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
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
464 private void tab_TabAttached(object sender, EventArgs e)
\r
466 SleekTab tab = (SleekTab)sender;
\r
470 private void tab_TabDetached(object sender, EventArgs e)
\r
472 SleekTab tab = (SleekTab)sender;
\r
473 frmDetachedTab form = (frmDetachedTab)tab.Owner;
\r
475 form.ReattachStrip = tstTabs;
\r
476 form.ReattachContainer = toolStripContainer1.ContentPanel;
\r
479 private void tab_TabSelected(object sender, EventArgs e)
\r
481 SleekTab tab = (SleekTab)sender;
\r
483 if (selectedTab != null &&
\r
484 selectedTab != tab)
\r
485 { selectedTab.Deselect(); }
\r
489 tbtnCloseTab.Enabled = tab.AllowClose;
\r
490 owner.AcceptButton = tab.DefaultControlButton;
\r
493 private void tab_TabClosed(object sender, EventArgs e)
\r
495 SleekTab tab = (SleekTab)sender;
\r
497 tabs.Remove(tab.Name);
\r
501 private void TabButtonClick(object sender, EventArgs e)
\r
503 ToolStripButton button = (ToolStripButton)sender;
\r
505 SleekTab tab = tabs[button.Tag.ToString()];
\r
509 public void RemoveTabEntry(SleekTab tab)
\r
511 if (tstTabs.Items.Contains(tab.Button))
\r
513 tstTabs.Items.Remove(tab.Button);
\r
516 tab.Button.Dispose();
\r
517 tabs.Remove(tab.Name);
\r
520 public void RemoveTab(string name)
\r
522 if (tabs.ContainsKey(name))
\r
528 //Used for outside classes that have a reference to TabsConsole
\r
529 public void SelectTab(string name)
\r
531 tabs[name.ToLower()].Select();
\r
534 public bool TabExists(string name)
\r
536 return tabs.ContainsKey(name.ToLower());
\r
539 public SleekTab GetTab(string name)
\r
541 return tabs[name.ToLower()];
\r
544 public List<SleekTab> GetOtherTabs()
\r
546 List<SleekTab> otherTabs = new List<SleekTab>();
\r
548 foreach (ToolStripItem item in tstTabs.Items)
\r
550 if (item.Tag == null) continue;
\r
551 if ((ToolStripButton)item == selectedTab.Button) continue;
\r
553 SleekTab tab = tabs[item.Tag.ToString()];
\r
554 if (!tab.AllowMerge) continue;
\r
555 if (tab.Merged) continue;
\r
557 otherTabs.Add(tab);
\r
563 public IMTabWindow AddIMTab(UUID target, UUID session, string targetName)
\r
565 IMTabWindow imTab = new IMTabWindow(instance, target, session, targetName);
\r
566 imTab.Dock = DockStyle.Fill;
\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
576 public ConferenceIMTabWindow AddConferenceIMTab(UUID session, string name)
\r
578 ConferenceIMTabWindow imTab = new ConferenceIMTabWindow(instance, session, name);
\r
579 imTab.Dock = DockStyle.Fill;
\r
581 toolStripContainer1.ContentPanel.Controls.Add(imTab);
\r
582 SleekTab tab = AddTab(session.ToString(), name, imTab);
\r
583 imTab.SelectIMInput();
\r
589 public ConferenceIMTabWindow AddConferenceIMTab(InstantMessageEventArgs e)
\r
591 ConferenceIMTabWindow imTab = AddConferenceIMTab(e.IM.IMSessionID, Utils.BytesToString(e.IM.BinaryBucket));
\r
592 imTab.TextManager.ProcessIM(e);
\r
596 public GroupIMTabWindow AddGroupIMTab(UUID session, string name)
\r
598 GroupIMTabWindow imTab = new GroupIMTabWindow(instance, session, name);
\r
599 imTab.Dock = DockStyle.Fill;
\r
601 toolStripContainer1.ContentPanel.Controls.Add(imTab);
\r
602 SleekTab tab = AddTab(session.ToString(), name, imTab);
\r
603 imTab.SelectIMInput();
\r
608 public GroupIMTabWindow AddGroupIMTab(InstantMessageEventArgs e)
\r
610 GroupIMTabWindow imTab = AddGroupIMTab(e.IM.IMSessionID, Utils.BytesToString(e.IM.BinaryBucket));
\r
611 imTab.TextManager.ProcessIM(e);
\r
615 public IMTabWindow AddIMTab(InstantMessageEventArgs e)
\r
617 IMTabWindow imTab = AddIMTab(e.IM.FromAgentID, e.IM.IMSessionID, e.IM.FromAgentName);
\r
618 imTab.TextManager.ProcessIM(e);
\r
622 public OutfitTextures AddOTTab(Avatar avatar)
\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
632 public MasterTab AddMSTab(Avatar avatar)
\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
642 public AttachmentTab AddATTab(Avatar avatar)
\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
651 public AnimTab AddAnimTab(Avatar avatar)
\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
660 private void tbtnTabOptions_Click(object sender, EventArgs e)
\r
662 tmnuMergeWith.Enabled = selectedTab.AllowMerge;
\r
663 tmnuDetachTab.Enabled = selectedTab.AllowDetach;
\r
665 tmnuMergeWith.DropDown.Items.Clear();
\r
667 if (!selectedTab.AllowMerge) return;
\r
668 if (!selectedTab.Merged)
\r
670 tmnuMergeWith.Text = "Merge With";
\r
672 List<SleekTab> otherTabs = GetOtherTabs();
\r
674 tmnuMergeWith.Enabled = (otherTabs.Count > 0);
\r
675 if (!tmnuMergeWith.Enabled) return;
\r
677 foreach (SleekTab tab in otherTabs)
\r
679 ToolStripItem item = tmnuMergeWith.DropDown.Items.Add(tab.Label);
\r
680 item.Tag = tab.Name;
\r
681 item.Click += new EventHandler(MergeItemClick);
\r
686 tmnuMergeWith.Text = "Split";
\r
687 tmnuMergeWith.Click += new EventHandler(SplitClick);
\r
691 private void MergeItemClick(object sender, EventArgs e)
\r
693 ToolStripItem item = (ToolStripItem)sender;
\r
694 SleekTab tab = tabs[item.Tag.ToString()];
\r
696 selectedTab.MergeWith(tab);
\r
698 SplitContainer container = (SplitContainer)selectedTab.Control;
\r
699 toolStripContainer1.ContentPanel.Controls.Add(container);
\r
701 selectedTab.Select();
\r
702 RemoveTabEntry(tab);
\r
704 tabs.Add(tab.Name, selectedTab);
\r
707 private void SplitClick(object sender, EventArgs e)
\r
709 SplitTab(selectedTab);
\r
710 selectedTab.Select();
\r
713 public void SplitTab(SleekTab tab)
\r
715 SleekTab otherTab = tab.Split();
\r
716 if (otherTab == null) return;
\r
718 toolStripContainer1.ContentPanel.Controls.Add(tab.Control);
\r
719 toolStripContainer1.ContentPanel.Controls.Add(otherTab.Control);
\r
721 tabs.Remove(otherTab.Name);
\r
725 private void tmnuDetachTab_Click(object sender, EventArgs e)
\r
727 if (!selectedTab.AllowDetach) return;
\r
729 tstTabs.Items.Remove(selectedTab.Button);
\r
730 selectedTab.Detach(instance);
\r
731 selectedTab.Owner.Show();
\r
733 tabs["chat"].Select();
\r
736 private void tbtnCloseTab_Click(object sender, EventArgs e)
\r
738 SleekTab tab = selectedTab;
\r
740 tabs["chat"].Select();
\r
746 private void TabsConsole_Load(object sender, EventArgs e)
\r
748 owner = this.FindForm();
\r
751 private void ctxTabs_Opening(object sender, CancelEventArgs e)
\r
753 Point pt = this.PointToClient(Cursor.Position);
\r
754 ToolStripItem stripItem = tstTabs.GetItemAt(pt);
\r
756 if (stripItem == null)
\r
762 tabs[stripItem.Tag.ToString()].Select();
\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
769 if (!ctxBtnClose.Enabled && !ctxBtnDetach.Enabled && !ctxBtnMerge.Enabled)
\r
775 if (!selectedTab.AllowMerge) return;
\r
776 if (!selectedTab.Merged)
\r
778 ctxBtnMerge.Text = "Merge With";
\r
780 List<SleekTab> otherTabs = GetOtherTabs();
\r
782 ctxBtnMerge.Enabled = (otherTabs.Count > 0);
\r
783 if (!ctxBtnMerge.Enabled) return;
\r
785 foreach (SleekTab tab in otherTabs)
\r
787 ToolStripItem item = ctxBtnMerge.DropDown.Items.Add(tab.Label);
\r
788 item.Tag = tab.Name;
\r
789 item.Click += new EventHandler(MergeItemClick);
\r
794 ctxBtnMerge.Text = "Split";
\r
795 ctxBtnMerge.Click += new EventHandler(SplitClick);
\r