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
37 using System.Windows.Forms;
\r
38 using System.Threading;
\r
40 using OpenMetaverse;
\r
44 public partial class TabsConsole : UserControl
\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
51 public Dictionary<string, SleekTab> tabs = new Dictionary<string, SleekTab>();
\r
52 private ChatConsole chatConsole;
\r
54 private SleekTab selectedTab;
\r
57 public TabsConsole(RadegastInstance instance)
\r
59 InitializeComponent();
\r
60 Disposed += new EventHandler(TabsConsole_Disposed);
\r
62 this.instance = instance;
\r
66 InitializeMainTab();
\r
67 InitializeChatTab();
\r
69 ApplyConfig(this.instance.Config.CurrentConfig);
\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
78 void TabsConsole_Disposed(object sender, EventArgs e)
\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
87 private void AddNetcomEvents()
\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
98 private void RemoveNetcomEvents()
\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
109 bool Inventory_OnObjectOffered(InstantMessage offerDetails, AssetType type, UUID objectID, bool fromTask)
\r
111 DisplayNotificationInChat(offerDetails.FromAgentName + " gave you " + offerDetails.Message);
\r
115 void Self_OnScriptDialog(string message, string objectName, UUID imageID, UUID objectID, string firstName, string lastName, int chatChannel, List<string> buttons)
\r
117 instance.MainForm.AddNotification(new ntfScriptDialog(instance, message, objectName, imageID, objectID, firstName, lastName, chatChannel, buttons));
\r
120 void Self_OnScriptQuestion(Simulator simulator, UUID taskID, UUID itemID, string objectName, string objectOwner, ScriptPermission questions)
\r
122 instance.MainForm.AddNotification(new ntfPermissions(instance, simulator, taskID, itemID, objectName, objectOwner, questions));
\r
125 private void Config_ConfigApplied(object sender, ConfigAppliedEventArgs e)
\r
127 ApplyConfig(e.AppliedConfig);
\r
130 private void ApplyConfig(Config config)
\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
138 private void netcom_ClientLoginStatus(object sender, ClientLoginEventArgs e)
\r
140 if (e.Status != LoginStatus.Success) return;
\r
142 InitializeFriendsTab();
\r
143 InitializeInventoryTab();
\r
144 InitializeSearchTab();
\r
146 if (selectedTab.Name == "main")
\r
147 tabs["chat"].Select();
\r
149 tabs["main"].AllowClose = true;
\r
150 tabs["main"].Close();
\r
152 client.Self.RetrieveInstantMessages();
\r
155 private void netcom_ClientLoggedOut(object sender, EventArgs e)
\r
157 DisposeSearchTab();
\r
158 DisposeInventoryTab();
\r
159 DisposeFriendsTab();
\r
161 tabs["chat"].Select();
\r
162 DisplayNotificationInChat("Logged out.");
\r
166 private void netcom_ClientDisconnected(object sender, ClientDisconnectEventArgs e)
\r
168 if (e.Type == NetworkManager.DisconnectType.ClientInitiated) return;
\r
170 DisposeSearchTab();
\r
171 DisposeInventoryTab();
\r
172 DisposeFriendsTab();
\r
174 tabs["chat"].Select();
\r
175 DisplayNotificationInChat("Disconnected.");
\r
178 private void netcom_AlertMessageReceived(object sender, AlertMessageEventArgs e)
\r
180 tabs["chat"].Highlight();
\r
183 private void netcom_ChatSent(object sender, ChatSentEventArgs e)
\r
185 tabs["chat"].Highlight();
\r
188 private void netcom_ChatReceived(object sender, ChatEventArgs e)
\r
190 if (string.IsNullOrEmpty(e.Message)) return;
\r
192 tabs["chat"].Highlight();
\r
195 private void netcom_InstantMessageReceived(object sender, InstantMessageEventArgs e)
\r
197 switch (e.IM.Dialog)
\r
199 case InstantMessageDialog.SessionSend:
\r
200 if (instance.groups.ContainsKey(e.IM.IMSessionID))
\r
206 HandleConferenceIM(e);
\r
210 case InstantMessageDialog.MessageFromAgent:
\r
211 if (e.IM.FromAgentName == "Second Life")
\r
213 HandleIMFromObject(e);
\r
215 else if (e.IM.GroupIM || instance.groups.ContainsKey(e.IM.IMSessionID))
\r
219 else if (e.IM.BinaryBucket.Length > 1)
\r
221 HandleConferenceIM(e);
\r
229 case InstantMessageDialog.MessageFromObject:
\r
230 HandleIMFromObject(e);
\r
233 case InstantMessageDialog.StartTyping:
\r
234 if (TabExists(e.IM.FromAgentName))
\r
236 SleekTab tab = tabs[e.IM.FromAgentName.ToLower()];
\r
237 if (!tab.Highlighted) tab.PartialHighlight();
\r
242 case InstantMessageDialog.StopTyping:
\r
243 if (TabExists(e.IM.FromAgentName))
\r
245 SleekTab tab = tabs[e.IM.FromAgentName.ToLower()];
\r
246 if (!tab.Highlighted) tab.Unhighlight();
\r
251 case InstantMessageDialog.MessageBox:
\r
252 instance.MainForm.AddNotification(new ntfGeneric(instance, e.IM.Message));
\r
255 case InstantMessageDialog.RequestTeleport:
\r
256 instance.MainForm.AddNotification(new ntfTeleport(instance, e.IM));
\r
259 case InstantMessageDialog.GroupInvitation:
\r
260 instance.MainForm.AddNotification(new ntfGroupInvitation(instance, e.IM));
\r
263 case InstantMessageDialog.FriendshipOffered:
\r
264 instance.MainForm.AddNotification(new ntfFriendshipOffer(instance, e.IM));
\r
267 case InstantMessageDialog.InventoryAccepted:
\r
268 DisplayNotificationInChat(e.IM.FromAgentName + " accepted your inventory offer.");
\r
273 public void DisplayNotificationInChat(string msg)
\r
275 if (InvokeRequired)
\r
277 BeginInvoke(new MethodInvoker(delegate()
\r
279 DisplayNotificationInChat(msg);
\r
284 ChatBufferItem line = new ChatBufferItem(
\r
287 ChatBufferTextStyle.ObjectChat
\r
291 mainChatManger.ProcessBufferItem(line, true);
\r
292 tabs["chat"].Highlight();
\r
294 catch (Exception) { }
\r
297 private void HandleIMFromObject(InstantMessageEventArgs e)
\r
299 DisplayNotificationInChat(e.IM.FromAgentName + ": " + e.IM.Message);
\r
302 private void HandleIM(InstantMessageEventArgs e)
\r
304 if (TabExists(e.IM.IMSessionID.ToString()))
\r
306 SleekTab tab = tabs[e.IM.IMSessionID.ToString()];
\r
307 if (!tab.Selected) tab.Highlight();
\r
311 IMTabWindow imTab = AddIMTab(e);
\r
312 tabs[e.IM.IMSessionID.ToString()].Highlight();
\r
315 private void HandleConferenceIM(InstantMessageEventArgs e)
\r
317 if (TabExists(e.IM.IMSessionID.ToString()))
\r
319 SleekTab tab = tabs[e.IM.IMSessionID.ToString()];
\r
320 if (!tab.Selected) tab.Highlight();
\r
324 ConferenceIMTabWindow imTab = AddConferenceIMTab(e);
\r
325 tabs[e.IM.IMSessionID.ToString()].Highlight();
\r
328 private void HandleGroupIM(InstantMessageEventArgs e)
\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
336 GroupIMTabWindow imTab = AddGroupIMTab(e);
\r
337 tabs[e.IM.IMSessionID.ToString()].Highlight();
\r
340 private void InitializeMainTab()
\r
342 MainConsole mainConsole = new MainConsole(instance);
\r
343 mainConsole.Dock = DockStyle.Fill;
\r
344 mainConsole.Visible = false;
\r
346 toolStripContainer1.ContentPanel.Controls.Add(mainConsole);
\r
348 SleekTab tab = AddTab("main", "Main", mainConsole);
\r
349 tab.AllowClose = false;
\r
350 tab.AllowDetach = false;
\r
351 tab.AllowMerge = false;
\r
353 mainConsole.RegisterTab(tab);
\r
356 private void InitializeChatTab()
\r
358 chatConsole = new ChatConsole(instance);
\r
359 mainChatManger = chatConsole.ChatManager;
\r
360 chatConsole.Dock = DockStyle.Fill;
\r
361 chatConsole.Visible = false;
\r
363 toolStripContainer1.ContentPanel.Controls.Add(chatConsole);
\r
365 SleekTab tab = AddTab("chat", "Chat", chatConsole);
\r
366 tab.AllowClose = false;
\r
367 tab.AllowDetach = false;
\r
370 private void InitializeFriendsTab()
\r
372 FriendsConsole friendsConsole = new FriendsConsole(instance);
\r
373 friendsConsole.Dock = DockStyle.Fill;
\r
374 friendsConsole.Visible = false;
\r
376 toolStripContainer1.ContentPanel.Controls.Add(friendsConsole);
\r
378 SleekTab tab = AddTab("friends", "Friends", friendsConsole);
\r
379 tab.AllowClose = false;
\r
380 tab.AllowDetach = false;
\r
383 private void InitializeSearchTab()
\r
385 SearchConsole searchConsole = new SearchConsole(instance);
\r
386 searchConsole.Dock = DockStyle.Fill;
\r
387 searchConsole.Visible = false;
\r
389 toolStripContainer1.ContentPanel.Controls.Add(searchConsole);
\r
391 SleekTab tab = AddTab("search", "Search", searchConsole);
\r
392 tab.AllowClose = false;
\r
393 tab.AllowDetach = false;
\r
396 private void InitializeInventoryTab()
\r
398 InventoryConsole invConsole = new InventoryConsole(instance);
\r
399 invConsole.Dock = DockStyle.Fill;
\r
400 invConsole.Visible = true;
\r
402 toolStripContainer1.ContentPanel.Controls.Add(invConsole);
\r
404 SleekTab tab = AddTab("inventory", "Inventory", invConsole);
\r
405 tab.AllowClose = false;
\r
406 tab.AllowDetach = true;
\r
409 private void DisposeFriendsTab()
\r
411 ForceCloseTab("friends");
\r
414 private void DisposeSearchTab()
\r
416 ForceCloseTab("search");
\r
419 private void DisposeInventoryTab()
\r
421 ForceCloseTab("inventory");
\r
424 private void ForceCloseTab(string name)
\r
426 if (!TabExists(name)) return;
\r
428 SleekTab tab = tabs[name];
\r
429 if (tab.Merged) SplitTab(tab);
\r
431 tab.AllowClose = true;
\r
436 public void AddTab(SleekTab tab)
\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
448 public SleekTab AddTab(string name, string label, Control control)
\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
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
467 private void tab_TabAttached(object sender, EventArgs e)
\r
469 SleekTab tab = (SleekTab)sender;
\r
473 private void tab_TabDetached(object sender, EventArgs e)
\r
475 SleekTab tab = (SleekTab)sender;
\r
476 frmDetachedTab form = (frmDetachedTab)tab.Owner;
\r
478 form.ReattachStrip = tstTabs;
\r
479 form.ReattachContainer = toolStripContainer1.ContentPanel;
\r
482 private void tab_TabSelected(object sender, EventArgs e)
\r
484 SleekTab tab = (SleekTab)sender;
\r
486 if (selectedTab != null &&
\r
487 selectedTab != tab)
\r
488 { selectedTab.Deselect(); }
\r
492 tbtnCloseTab.Enabled = tab.AllowClose;
\r
493 owner.AcceptButton = tab.DefaultControlButton;
\r
496 private void tab_TabClosed(object sender, EventArgs e)
\r
498 SleekTab tab = (SleekTab)sender;
\r
500 tabs.Remove(tab.Name);
\r
504 private void TabButtonClick(object sender, EventArgs e)
\r
506 ToolStripButton button = (ToolStripButton)sender;
\r
508 SleekTab tab = tabs[button.Tag.ToString()];
\r
512 public void RemoveTabEntry(SleekTab tab)
\r
514 if (tstTabs.Items.Contains(tab.Button))
\r
516 tstTabs.Items.Remove(tab.Button);
\r
519 tab.Button.Dispose();
\r
520 tabs.Remove(tab.Name);
\r
523 public void RemoveTab(string name)
\r
525 if (tabs.ContainsKey(name))
\r
531 //Used for outside classes that have a reference to TabsConsole
\r
532 public void SelectTab(string name)
\r
534 tabs[name.ToLower()].Select();
\r
537 public bool TabExists(string name)
\r
539 return tabs.ContainsKey(name.ToLower());
\r
542 public SleekTab GetTab(string name)
\r
544 return tabs[name.ToLower()];
\r
547 public List<SleekTab> GetOtherTabs()
\r
549 List<SleekTab> otherTabs = new List<SleekTab>();
\r
551 foreach (ToolStripItem item in tstTabs.Items)
\r
553 if (item.Tag == null) continue;
\r
554 if ((ToolStripButton)item == selectedTab.Button) continue;
\r
556 SleekTab tab = tabs[item.Tag.ToString()];
\r
557 if (!tab.AllowMerge) continue;
\r
558 if (tab.Merged) continue;
\r
560 otherTabs.Add(tab);
\r
566 public IMTabWindow AddIMTab(UUID target, UUID session, string targetName)
\r
568 IMTabWindow imTab = new IMTabWindow(instance, target, session, targetName);
\r
569 imTab.Dock = DockStyle.Fill;
\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
579 public ConferenceIMTabWindow AddConferenceIMTab(UUID session, string name)
\r
581 ConferenceIMTabWindow imTab = new ConferenceIMTabWindow(instance, session, name);
\r
582 imTab.Dock = DockStyle.Fill;
\r
584 toolStripContainer1.ContentPanel.Controls.Add(imTab);
\r
585 SleekTab tab = AddTab(session.ToString(), name, imTab);
\r
586 imTab.SelectIMInput();
\r
592 public ConferenceIMTabWindow AddConferenceIMTab(InstantMessageEventArgs e)
\r
594 ConferenceIMTabWindow imTab = AddConferenceIMTab(e.IM.IMSessionID, Utils.BytesToString(e.IM.BinaryBucket));
\r
595 imTab.TextManager.ProcessIM(e);
\r
599 public GroupIMTabWindow AddGroupIMTab(UUID session, string name)
\r
601 GroupIMTabWindow imTab = new GroupIMTabWindow(instance, session, name);
\r
602 imTab.Dock = DockStyle.Fill;
\r
604 toolStripContainer1.ContentPanel.Controls.Add(imTab);
\r
605 SleekTab tab = AddTab(session.ToString(), name, imTab);
\r
606 imTab.SelectIMInput();
\r
611 public GroupIMTabWindow AddGroupIMTab(InstantMessageEventArgs e)
\r
613 GroupIMTabWindow imTab = AddGroupIMTab(e.IM.IMSessionID, Utils.BytesToString(e.IM.BinaryBucket));
\r
614 imTab.TextManager.ProcessIM(e);
\r
618 public IMTabWindow AddIMTab(InstantMessageEventArgs e)
\r
620 IMTabWindow imTab = AddIMTab(e.IM.FromAgentID, e.IM.IMSessionID, e.IM.FromAgentName);
\r
621 imTab.TextManager.ProcessIM(e);
\r
625 public OutfitTextures AddOTTab(Avatar avatar)
\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
635 public MasterTab AddMSTab(Avatar avatar)
\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
645 public AttachmentTab AddATTab(Avatar avatar)
\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
654 public AnimTab AddAnimTab(Avatar avatar)
\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
663 private void tbtnTabOptions_Click(object sender, EventArgs e)
\r
665 tmnuMergeWith.Enabled = selectedTab.AllowMerge;
\r
666 tmnuDetachTab.Enabled = selectedTab.AllowDetach;
\r
668 tmnuMergeWith.DropDown.Items.Clear();
\r
670 if (!selectedTab.AllowMerge) return;
\r
671 if (!selectedTab.Merged)
\r
673 tmnuMergeWith.Text = "Merge With";
\r
675 List<SleekTab> otherTabs = GetOtherTabs();
\r
677 tmnuMergeWith.Enabled = (otherTabs.Count > 0);
\r
678 if (!tmnuMergeWith.Enabled) return;
\r
680 foreach (SleekTab tab in otherTabs)
\r
682 ToolStripItem item = tmnuMergeWith.DropDown.Items.Add(tab.Label);
\r
683 item.Tag = tab.Name;
\r
684 item.Click += new EventHandler(MergeItemClick);
\r
689 tmnuMergeWith.Text = "Split";
\r
690 tmnuMergeWith.Click += new EventHandler(SplitClick);
\r
694 private void MergeItemClick(object sender, EventArgs e)
\r
696 ToolStripItem item = (ToolStripItem)sender;
\r
697 SleekTab tab = tabs[item.Tag.ToString()];
\r
699 selectedTab.MergeWith(tab);
\r
701 SplitContainer container = (SplitContainer)selectedTab.Control;
\r
702 toolStripContainer1.ContentPanel.Controls.Add(container);
\r
704 selectedTab.Select();
\r
705 RemoveTabEntry(tab);
\r
707 tabs.Add(tab.Name, selectedTab);
\r
710 private void SplitClick(object sender, EventArgs e)
\r
712 SplitTab(selectedTab);
\r
713 selectedTab.Select();
\r
716 public void SplitTab(SleekTab tab)
\r
718 SleekTab otherTab = tab.Split();
\r
719 if (otherTab == null) return;
\r
721 toolStripContainer1.ContentPanel.Controls.Add(tab.Control);
\r
722 toolStripContainer1.ContentPanel.Controls.Add(otherTab.Control);
\r
724 tabs.Remove(otherTab.Name);
\r
728 private void tmnuDetachTab_Click(object sender, EventArgs e)
\r
730 if (!selectedTab.AllowDetach) return;
\r
732 tstTabs.Items.Remove(selectedTab.Button);
\r
733 selectedTab.Detach(instance);
\r
734 selectedTab.Owner.Show();
\r
736 tabs["chat"].Select();
\r
739 private void tbtnCloseTab_Click(object sender, EventArgs e)
\r
741 SleekTab tab = selectedTab;
\r
743 tabs["chat"].Select();
\r
749 private void TabsConsole_Load(object sender, EventArgs e)
\r
751 owner = this.FindForm();
\r
754 private void ctxTabs_Opening(object sender, CancelEventArgs e)
\r
756 Point pt = this.PointToClient(Cursor.Position);
\r
757 ToolStripItem stripItem = tstTabs.GetItemAt(pt);
\r
759 if (stripItem == null)
\r
765 tabs[stripItem.Tag.ToString()].Select();
\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
772 if (!ctxBtnClose.Enabled && !ctxBtnDetach.Enabled && !ctxBtnMerge.Enabled)
\r
778 if (!selectedTab.AllowMerge) return;
\r
779 if (!selectedTab.Merged)
\r
781 ctxBtnMerge.Text = "Merge With";
\r
783 List<SleekTab> otherTabs = GetOtherTabs();
\r
785 ctxBtnMerge.Enabled = (otherTabs.Count > 0);
\r
786 if (!ctxBtnMerge.Enabled) return;
\r
788 foreach (SleekTab tab in otherTabs)
\r
790 ToolStripItem item = ctxBtnMerge.DropDown.Items.Add(tab.Label);
\r
791 item.Tag = tab.Name;
\r
792 item.Click += new EventHandler(MergeItemClick);
\r
797 ctxBtnMerge.Text = "Split";
\r
798 ctxBtnMerge.Click += new EventHandler(SplitClick);
\r