RESOLVED - bug 234860: New Project Wizard using "folders" for project type selection is totally unintuitive
https://bugs.eclipse.org/bugs/show_bug.cgi?id=234860
diff --git a/build/org.eclipse.cdt.managedbuilder.gnu.ui/plugin.xml b/build/org.eclipse.cdt.managedbuilder.gnu.ui/plugin.xml
index 3ea5660..dd98aa0 100644
--- a/build/org.eclipse.cdt.managedbuilder.gnu.ui/plugin.xml
+++ b/build/org.eclipse.cdt.managedbuilder.gnu.ui/plugin.xml
@@ -3779,13 +3779,7 @@
             filterPattern=".*"
             location="$nl$/templates/projecttemplates/HelloWorldCAnsiProject/template.xml"
             projectType="org.eclipse.cdt.build.core.buildArtefactType.exe">
-      </template>
-      <template
-            id="org.eclipse.cdt.build.core.templates.EmptyProject"
-            filterPattern=".*"
-            location="$nl$/templates/projecttemplates/EmptyProject/template.xml"
-            projectType="org.eclipse.cdt.build.core.buildArtefactType.exe">
-      </template>
+      </template>      
       <template
             id="org.eclipse.cdt.build.core.templates.MakefileHelloWorldCCProject"
             filterPattern=".*"
diff --git a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/messages.properties b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/messages.properties
index ee4476e..caa2e95 100644
--- a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/messages.properties
+++ b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/properties/messages.properties
@@ -119,3 +119,5 @@
 MBSWizardHandler.1=At least one configuration should be selected. Please check needed configurations.
 CMainWizardPage.1=Show project types and toolchains only if they are supported on the platform
 CMainWizardPage.2=Edit properties after project creation
+AbstractCWizard.0=Empty Project
+
diff --git a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/wizards/MBSWizardHandler.java b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/wizards/MBSWizardHandler.java
index ea481a3..2641987 100644
--- a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/wizards/MBSWizardHandler.java
+++ b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/wizards/MBSWizardHandler.java
@@ -151,7 +151,8 @@
 					break;
 			
 				projectTypeId = path[0];
-				if(path.length > 1 && (!path[0].equals(ManagedBuildWizard.OTHERS_LABEL))){
+				if(!entryDescriptor.isDefaultForCategory() && 
+						path.length > 1 && (!path[0].equals(ManagedBuildWizard.OTHERS_LABEL))){
 					templateId = path[path.length - 1]; 
 					Template templates[] = TemplateEngineUI.getDefault().getTemplates(projectTypeId);
 					if(templates.length == 0)
diff --git a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/wizards/ManagedBuildWizard.java b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/wizards/ManagedBuildWizard.java
index 9b0f958..502ee32 100644
--- a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/wizards/ManagedBuildWizard.java
+++ b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/wizards/ManagedBuildWizard.java
@@ -34,6 +34,7 @@
 public class ManagedBuildWizard extends AbstractCWizard {
 	private static final Image IMG = CPluginImages.get(CPluginImages.IMG_OBJS_CONTAINER);
 	public static final String OTHERS_LABEL = Messages.getString("CNewWizard.0");  //$NON-NLS-1$
+	public static final String EMPTY_PROJECT = Messages.getString("AbstractCWizard.0");  //$NON-NLS-1$
 	/**
 	 * Creates and returns an array of items to be displayed 
 	 */
@@ -54,7 +55,13 @@
 					h.addTc(tcs[j]);
 			}
 			if (h.getToolChainsCount() > 0) {
+				// The project category item.
 				items.add(new EntryDescriptor(vs[i].getId(), null, vs[i].getName(), true, h, null));
+				// A default project type for that category -- not using any template.
+				EntryDescriptor entryDescriptor = new EntryDescriptor(vs[i].getId() + ".default", vs[i].getId(),
+						EMPTY_PROJECT, false, h, null);
+				entryDescriptor.setDefaultForCategory(true);
+				items.add(entryDescriptor);
 			}
 		}
 		
@@ -102,7 +109,7 @@
 			} else { // do not group to <Others>
 				pId = null;
 			}
-			items.add(new EntryDescriptor(pt.getId(), pId, pt.getName(), true, h, IMG));
+			items.add(new EntryDescriptor(pt.getId(), pId, pt.getName(), false, h, IMG));
 		}
 		return (EntryDescriptor[])items.toArray(new EntryDescriptor[items.size()]);
 	}
diff --git a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/wizards/StdBuildWizard.java b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/wizards/StdBuildWizard.java
index a8b72a9..0115892 100644
--- a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/wizards/StdBuildWizard.java
+++ b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/ui/wizards/StdBuildWizard.java
@@ -19,6 +19,7 @@
 public class StdBuildWizard extends AbstractCWizard {
 	private static final String NAME = Messages.getString("StdBuildWizard.0"); //$NON-NLS-1$
 	private static final String ID = "org.eclipse.cdt.build.makefile.projectType"; //$NON-NLS-1$
+	public static final String EMPTY_PROJECT = Messages.getString("AbstractCWizard.0");  //$NON-NLS-1$
 	
 	public EntryDescriptor[] createItems(boolean supportedOnly, IWizard wizard) {
 		STDWizardHandler h = new STDWizardHandler(parent, wizard);
@@ -27,8 +28,13 @@
 		for (int i=0; i<tcs.length; i++)
 			if (isValid(tcs[i], supportedOnly, wizard)) 
 				h.addTc(tcs[i]);
-		EntryDescriptor wd = new EntryDescriptor(ID, null, NAME, true, h, null); 
-		return new EntryDescriptor[] {wd};
+		EntryDescriptor wd = new EntryDescriptor(ID, null, NAME, true, h, null);
+				
+		EntryDescriptor wd2 = new EntryDescriptor(ID + ".default", ID,
+				EMPTY_PROJECT, false, h, null);
+				wd2.setDefaultForCategory(true);
+						
+		return new EntryDescriptor[] {wd, wd2};
 		
 // test only: creating items like of Templates	
 /*		
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/PluginResources.properties b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/PluginResources.properties
index 26cf152..fde3228 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/PluginResources.properties
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/newui/PluginResources.properties
@@ -524,6 +524,7 @@
 NewCfgDialog.4=Import from projects
 NewCfgDialog.5=Import predefined
 CDTMainWizardPage.0=Project name cannot contain '\#' symbol
+CDTMainWizardPage.1=Project category is selected. Expand the category and select a concrete project type
 WorkingSetConfigAction.0=Symbols '
 WorkingSetConfigAction.1=Choose active configs for Working Sets
 WorkingSetConfigAction.10=-- CURRENT --
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/wizards/CDTMainWizardPage.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/wizards/CDTMainWizardPage.java
index a730147..01ab278 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/wizards/CDTMainWizardPage.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/wizards/CDTMainWizardPage.java
@@ -70,6 +70,7 @@
 	    private Label right_label;
    
 	    public CWizardHandler h_selected = null;
+		private Label categorySelectedLabel;
 
 	    /**
 	     * Creates a new project creation wizard page.
@@ -290,6 +291,18 @@
 					}
 				}
 			}
+			// If there is a EntryDescriptor which is default for category, make sure it 
+			// is in the front of the list.
+			for (int i = 0; i < items.size(); ++i)
+			{
+				EntryDescriptor ed = items.get(i);
+				if (ed.isDefaultForCategory())
+				{
+					items.remove(i);
+					items.add(0, ed);
+					break;
+				}				
+			}
 			
 			// bug # 211935 : allow items filtering.
 			if (ls != null) // NULL means call from prefs
@@ -297,7 +310,7 @@
 			addItemsToTree(tree, items);
 			
 			if (tree.getItemCount() > 0) {
-				TreeItem target = tree.getItem(0);
+				TreeItem target = null;
 				// try to search item which was selected before
 				if (savedStr != null) {
 					TreeItem[] all = tree.getItems();
@@ -308,6 +321,12 @@
 						}
 					}
 				}
+				if (target == null)
+				{
+					target = tree.getItem(0);
+					if (target.getItemCount() != 0)
+						target = target.getItem(0);
+				}
 				tree.setSelection(target);
 				return (CWizardHandler)target.getData();
 			}
@@ -344,7 +363,12 @@
 							found = true;
 							wd1.setParentId(null);
 							CWizardHandler h = wd2.getHandler();
-							if (h == null && !wd1.isCategory()) 
+							/* If neither wd1 itself, nor its parent (wd2) have a handler
+							 * associated with them, and the item is not a category,
+							 * then skip it. If it's category, then it's possible that
+							 * children will have a handler associated with them.
+							 */
+							if (h == null && wd1.getHandler() == null && !wd1.isCategory())
 								break;
 
 							wd1.setPath(wd2.getPath() + "/" + wd1.getId()); //$NON-NLS-1$
@@ -377,18 +401,35 @@
 		private void switchTo(CWizardHandler h, EntryDescriptor ed) {
 			if (h == null) 
 				h = ed.getHandler();
+			if (ed.isCategory())
+				h = null;
 			try {
 				if (h != null && ed != null) 
 					h.initialize(ed);
 			} catch (CoreException e) { 
-				h = null; 
+				h = null;
 			}
 			if (h_selected != null) 
 				h_selected.handleUnSelection();
 			h_selected = h;
 			if (h == null) 
+			{
+				if (ed != null && ed.isCategory())
+				{
+					if (categorySelectedLabel == null)
+					{
+						categorySelectedLabel = new Label(right, SWT.WRAP);
+						categorySelectedLabel.setText(
+								UIMessages.getString("CDTMainWizardPage.1"));						 //$NON-NLS-1$
+						right.layout();
+					}
+					categorySelectedLabel.setVisible(true);
+				}
 				return;
+			}
 			right_label.setText(h_selected.getHeader());
+			if (categorySelectedLabel != null)
+				categorySelectedLabel.setVisible(false);
 			h_selected.handleSelection();
 			h_selected.setSupportedOnly(show_sup.getSelection());
 		}
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/wizards/EntryDescriptor.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/wizards/EntryDescriptor.java
index 84f4f90..ca3f35c 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/wizards/EntryDescriptor.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/wizards/EntryDescriptor.java
@@ -27,6 +27,7 @@
 	private CWizardHandler handler = null;
 	private String path = null;
 	private EntryDescriptor parent = null;
+	private boolean isDefaultForCategory = false;
 
 	public EntryDescriptor (String _id, String _par, String _name, boolean _cat, CWizardHandler _h, Image _image) {
 		id = _id;
@@ -82,4 +83,10 @@
 	public CWizardHandler getHandler() {
 		return handler;
 	}
+	public void setDefaultForCategory(boolean isDefaultForCategory) {
+		this.isDefaultForCategory = isDefaultForCategory;
+	}
+	public boolean isDefaultForCategory() {
+		return isDefaultForCategory;
+	}
 }