From 0b4533ee5df1d93b56a099d9e40c0df30a95a874 Mon Sep 17 00:00:00 2001
From: Anton Leherbauer <anton.leherbauer@windriver.com>
Date: Tue, 24 Feb 2015 17:02:09 +0100
Subject: [PATCH] Terminals: Keep context menu from being disposed if terminal
 is disposed

Related to Bug 458625.
---
 .../tcf/te/ui/terminals/tabs/TabDisposeListener.java       | 7 ++++++-
 .../eclipse/tcf/te/ui/terminals/tabs/TabFolderManager.java | 3 +++
 .../tcf/te/ui/terminals/tabs/TabFolderMenuHandler.java     | 4 ++++
 3 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/plugins/org.eclipse.tcf.te.ui.terminals/src/org/eclipse/tcf/te/ui/terminals/tabs/TabDisposeListener.java b/plugins/org.eclipse.tcf.te.ui.terminals/src/org/eclipse/tcf/te/ui/terminals/tabs/TabDisposeListener.java
index 6c65825d913..c4f08d92b96 100644
--- a/plugins/org.eclipse.tcf.te.ui.terminals/src/org/eclipse/tcf/te/ui/terminals/tabs/TabDisposeListener.java
+++ b/plugins/org.eclipse.tcf.te.ui.terminals/src/org/eclipse/tcf/te/ui/terminals/tabs/TabDisposeListener.java
@@ -54,7 +54,12 @@ public class TabDisposeListener implements DisposeListener {
 		if (e.getSource() instanceof CTabItem) {
 			// Get the terminal control (if any) from the tab item
 			Object candidate = ((CTabItem)e.getSource()).getData();
-			if (candidate instanceof ITerminalViewControl) ((ITerminalViewControl)candidate).disposeTerminal();
+			if (candidate instanceof ITerminalViewControl) {
+				ITerminalViewControl terminal = (ITerminalViewControl)candidate;
+				// Keep the context menu from being disposed
+				terminal.getControl().setMenu(null);
+				terminal.disposeTerminal();
+			}
 			// Dispose the command input field handler
 			parentTabFolderManager.disposeTabCommandFieldHandler((CTabItem)e.getSource());
 			// Dispose the tab item control
diff --git a/plugins/org.eclipse.tcf.te.ui.terminals/src/org/eclipse/tcf/te/ui/terminals/tabs/TabFolderManager.java b/plugins/org.eclipse.tcf.te.ui.terminals/src/org/eclipse/tcf/te/ui/terminals/tabs/TabFolderManager.java
index 24df7ee3e27..42b05528b64 100644
--- a/plugins/org.eclipse.tcf.te.ui.terminals/src/org/eclipse/tcf/te/ui/terminals/tabs/TabFolderManager.java
+++ b/plugins/org.eclipse.tcf.te.ui.terminals/src/org/eclipse/tcf/te/ui/terminals/tabs/TabFolderManager.java
@@ -378,6 +378,9 @@ public class TabFolderManager extends PlatformObject implements ISelectionProvid
 			// Remember terminal state
 			TerminalState oldState = terminal.getState();
 
+			// Keep the context menu from being disposed
+			terminal.getControl().setMenu(null);
+
 			// change the "parent".
 			Assert.isTrue(terminal instanceof ITerminalControl);
 			((ITerminalControl)terminal).setupTerminal(composite);
diff --git a/plugins/org.eclipse.tcf.te.ui.terminals/src/org/eclipse/tcf/te/ui/terminals/tabs/TabFolderMenuHandler.java b/plugins/org.eclipse.tcf.te.ui.terminals/src/org/eclipse/tcf/te/ui/terminals/tabs/TabFolderMenuHandler.java
index 3a3e745c050..f04d9a3d1b5 100644
--- a/plugins/org.eclipse.tcf.te.ui.terminals/src/org/eclipse/tcf/te/ui/terminals/tabs/TabFolderMenuHandler.java
+++ b/plugins/org.eclipse.tcf.te.ui.terminals/src/org/eclipse/tcf/te/ui/terminals/tabs/TabFolderMenuHandler.java
@@ -371,6 +371,10 @@ public class TabFolderMenuHandler extends PlatformObject {
 		if (MenuManager.class.isAssignableFrom(adapter)) {
 			return contextMenuManager;
 		} else if (Menu.class.isAssignableFrom(adapter)) {
+			if (contextMenu != null && contextMenu.isDisposed()) {
+				// menu got disposed (should not happen)
+				contextMenu = contextMenuManager.createContextMenu(getTabFolder());
+			}
 			return contextMenu;
 		}