Bug 529248 - "New console" should be on top, and other consoles order
fixed

Separated semantically different "New Console" contribution from other
console *page* contributions by placing it on top and adding a separator
after it. Additionally added a "Console" icon to it and sorted remaining
contributions alphabetically.

Change-Id: I2bfb18753637fe84c668f7a93dcd7c878a19d7f7
Signed-off-by: Andrey Loskutov <loskutov@gmx.de>
diff --git a/org.eclipse.ui.console/plugin.xml b/org.eclipse.ui.console/plugin.xml
index cef75ea..c2d548e 100644
--- a/org.eclipse.ui.console/plugin.xml
+++ b/org.eclipse.ui.console/plugin.xml
@@ -75,6 +75,7 @@
           point="org.eclipse.ui.console.consoleFactories">
        <consoleFactory
              label="%consoleViewConsoleFactory.name"
+             icon="$nl$/icons/full/cview16/console_view.png"
              class="org.eclipse.ui.internal.console.ConsoleViewConsoleFactory"/>
     </extension>
     <extension
diff --git a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleFactoryExtension.java b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleFactoryExtension.java
index 874f3f9..bb21919 100644
--- a/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleFactoryExtension.java
+++ b/org.eclipse.ui.console/src/org/eclipse/ui/internal/console/ConsoleFactoryExtension.java
@@ -17,15 +17,12 @@
 import org.eclipse.core.expressions.Expression;
 import org.eclipse.core.expressions.ExpressionConverter;
 import org.eclipse.core.expressions.ExpressionTagNames;
-
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.FileLocator;
 import org.eclipse.core.runtime.IConfigurationElement;
 import org.eclipse.core.runtime.Path;
 import org.eclipse.core.runtime.Platform;
-
 import org.eclipse.jface.resource.ImageDescriptor;
-
 import org.eclipse.ui.IPluginContribution;
 import org.eclipse.ui.console.ConsolePlugin;
 import org.eclipse.ui.console.IConsoleFactory;
@@ -46,17 +43,19 @@
 		fConfig = config;
 	}
 
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPluginContribution#getLocalId()
+	/**
+	 *
+	 * @return {@code true} if this is a "New Console" contribution
 	 */
+	public boolean isNewConsoleExtenson() {
+		return ConsoleViewConsoleFactory.class.getName().equals(fConfig.getAttribute("class")); //$NON-NLS-1$
+	}
+
 	@Override
 	public String getLocalId() {
 		return fConfig.getAttribute("id"); //$NON-NLS-1$
 	}
 
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IPluginContribution#getPluginId()
-	 */
 	@Override
 	public String getPluginId() {
 		return fConfig.getContributor().getName();
@@ -89,10 +88,16 @@
 		return fEnablementExpression;
 	}
 
+	/**
+	 * @return console label, never null
+	 */
 	public String getLabel() {
 		if (fLabel == null) {
 			fLabel = fConfig.getAttribute("label"); //$NON-NLS-1$
 		}
+		if (fLabel == null) {
+			fLabel = "?"; //$NON-NLS-1$
+		}
 		return fLabel;
 	}
 
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 d3ed733..0927e14 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
@@ -10,10 +10,14 @@
  *******************************************************************************/
 package org.eclipse.ui.internal.console;
 
+import java.util.Arrays;
+import java.util.Comparator;
+
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.jface.action.Action;
 import org.eclipse.jface.action.ActionContributionItem;
 import org.eclipse.jface.action.IMenuCreator;
+import org.eclipse.jface.action.Separator;
 import org.eclipse.jface.resource.ImageDescriptor;
 import org.eclipse.swt.graphics.Point;
 import org.eclipse.swt.graphics.Rectangle;
@@ -35,7 +39,7 @@
 	private Menu fMenu;
 
 	public OpenConsoleAction() {
-		fFactoryExtensions = ((ConsoleManager)ConsolePlugin.getDefault().getConsoleManager()).getConsoleFactoryExtensions();
+		fFactoryExtensions = getSortedFactories();
 		setText(ConsoleMessages.OpenConsoleAction_0);
 		setToolTipText(ConsoleMessages.OpenConsoleAction_1);
 		setImageDescriptor(ConsolePluginImages.getImageDescriptor(IInternalConsoleConstants.IMG_ELCL_NEW_CON));
@@ -44,18 +48,31 @@
 		PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IConsoleHelpContextIds.CONSOLE_OPEN_CONSOLE_ACTION);
 	}
 
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IMenuCreator#dispose()
-	 */
+	private ConsoleFactoryExtension[] getSortedFactories() {
+		ConsoleFactoryExtension[] factoryExtensions = ((ConsoleManager) ConsolePlugin.getDefault().getConsoleManager()).getConsoleFactoryExtensions();
+		Arrays.sort(factoryExtensions, new Comparator<ConsoleFactoryExtension>() {
+
+			@Override
+			public int compare(ConsoleFactoryExtension e1, ConsoleFactoryExtension e2) {
+				if (e1.isNewConsoleExtenson()) {
+					return -1;
+				}
+				if (e2.isNewConsoleExtenson()) {
+					return 1;
+				}
+				String first = e1.getLabel();
+				String second = e2.getLabel();
+				return first.compareTo(second);
+			}
+		});
+		return factoryExtensions;
+	}
+
 	@Override
 	public void dispose() {
 		fFactoryExtensions = null;
 	}
 
-	/*
-	 * @see org.eclipse.jface.action.Action#runWithEvent(org.eclipse.swt.widgets.Event)
-	 * @since 3.5
-	 */
 	@Override
 	public void runWithEvent(Event event) {
 		if (event.widget instanceof ToolItem) {
@@ -70,9 +87,6 @@
 		}
 	}
 
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IMenuCreator#getMenu(org.eclipse.swt.widgets.Control)
-	 */
 	@Override
 	public Menu getMenu(Control parent) {
 		if (fMenu != null) {
@@ -88,6 +102,9 @@
 				ImageDescriptor image = extension.getImageDescriptor();
 				addActionToMenu(fMenu, new ConsoleFactoryAction(label, image, extension), accel);
 				accel++;
+				if (extension.isNewConsoleExtenson()) {
+					new Separator("new").fill(fMenu, -1); //$NON-NLS-1$
+				}
 			}
 		}
 		return fMenu;
@@ -108,9 +125,6 @@
 		item.fill(parent, -1);
 	}
 
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.action.IMenuCreator#getMenu(org.eclipse.swt.widgets.Menu)
-	 */
 	@Override
 	public Menu getMenu(Menu parent) {
 		return null;
@@ -129,10 +143,6 @@
 			fConfig = extension;
 		}
 
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.action.IAction#run()
-		 */
 		@Override
 		public void run() {
 			try {
@@ -146,9 +156,6 @@
 			}
 		}
 
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.action.IAction#runWithEvent(org.eclipse.swt.widgets.Event)
-		 */
 		@Override
 		public void runWithEvent(Event event) {
 			run();