Bug 531241 - ConsoleDropDownAction and OpenConsoleAction disposed on
perspective reset

Change-Id: I4c4d6f1741ee58e34977465226e127590dcc932c
Signed-off-by: Andrey Loskutov <loskutov@gmx.de>
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleDropDownAction.java b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleDropDownAction.java
index 3d34f1a..f3b3d93 100644
--- a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleDropDownAction.java
+++ b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleDropDownAction.java
@@ -18,8 +18,13 @@
 import org.eclipse.jface.action.Action;
 import org.eclipse.jface.action.ActionContributionItem;
 import org.eclipse.jface.action.IMenuCreator;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
 import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Event;
 import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.ToolItem;
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.console.ConsolePlugin;
 import org.eclipse.ui.console.IConsole;
@@ -44,12 +49,11 @@
 	}
 
 	public ConsoleDropDownAction(IConsoleView view) {
+		super(ConsoleMessages.ConsoleDropDownAction_0, AS_DROP_DOWN_MENU);
 		fView= view;
-		setText(ConsoleMessages.ConsoleDropDownAction_0);
 		setToolTipText(ConsoleMessages.ConsoleDropDownAction_1);
 		setImageDescriptor(ConsolePluginImages.getImageDescriptor(IConsoleConstants.IMG_VIEW_CONSOLE));
 		PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IConsoleHelpContextIds.CONSOLE_DISPLAY_CONSOLE_ACTION);
-		setMenuCreator(this);
 		ConsolePlugin.getDefault().getConsoleManager().addConsoleListener(this);
 		update();
 	}
@@ -132,6 +136,23 @@
 	}
 
 	@Override
+	public void runWithEvent(Event event) {
+		// Show menu on drop-down button, run action otherwise
+		if (event.detail == SWT.ARROW && event.widget instanceof ToolItem) {
+			ToolItem toolItem = (ToolItem) event.widget;
+			Control control = toolItem.getParent();
+			Menu menu = getMenu(control);
+
+			Rectangle bounds = toolItem.getBounds();
+			Point topLeft = new Point(bounds.x, bounds.y + bounds.height);
+			menu.setLocation(control.toDisplay(topLeft));
+			menu.setVisible(true);
+		} else {
+			run();
+		}
+	}
+
+	@Override
 	public void consolesAdded(IConsole[] consoles) {
 		UIJob job = new UIJob(ConsoleMessages.UpdatingConsoleState) {
 			@Override
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleView.java b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleView.java
index 02fac97..ff7c5f1 100644
--- a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleView.java
+++ b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleView.java
@@ -359,6 +359,10 @@
 			fDisplayConsoleAction.dispose();
 			fDisplayConsoleAction = null;
 		}
+		if (fOpenConsoleAction != null) {
+			fOpenConsoleAction.dispose();
+			fOpenConsoleAction = null;
+		}
 	}
 
 	/**
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/OpenConsoleAction.java b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/OpenConsoleAction.java
index 0927e14..ad9a8fb 100644
--- a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/OpenConsoleAction.java
+++ b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/OpenConsoleAction.java
@@ -39,12 +39,11 @@
 	private Menu fMenu;
 
 	public OpenConsoleAction() {
+		super(ConsoleMessages.OpenConsoleAction_0, AS_DROP_DOWN_MENU);
 		fFactoryExtensions = getSortedFactories();
-		setText(ConsoleMessages.OpenConsoleAction_0);
 		setToolTipText(ConsoleMessages.OpenConsoleAction_1);
 		setImageDescriptor(ConsolePluginImages.getImageDescriptor(IInternalConsoleConstants.IMG_ELCL_NEW_CON));
 		setDisabledImageDescriptor(ConsolePluginImages.getImageDescriptor(IInternalConsoleConstants.IMG_DLCL_NEW_CON));
-		setMenuCreator(this);
 		PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IConsoleHelpContextIds.CONSOLE_OPEN_CONSOLE_ACTION);
 	}
 
@@ -71,6 +70,10 @@
 	@Override
 	public void dispose() {
 		fFactoryExtensions = null;
+		if (fMenu != null) {
+			fMenu.dispose();
+			fMenu = null;
+		}
 	}
 
 	@Override