From 54d43aedbc59c5ab09441d33982e60ae9726ccfa Mon Sep 17 00:00:00 2001
From: Siegfried Pammer <siegfriedpammer@gmail.com>
Date: Sat, 25 Jan 2014 21:09:13 +0100
Subject: [PATCH] fix #279: Reference project items are UnknownProjectItems
 after creating a new project

---
 .../Templates/Project/ProjectDescriptor.cs     | 18 +++++++++++++-----
 .../Templates/Project/ProjectTemplateImpl.cs   |  6 ++----
 .../Templates/Project/SolutionDescriptor.cs    |  5 ++---
 3 files changed, 17 insertions(+), 12 deletions(-)

diff --git a/src/Main/SharpDevelop/Templates/Project/ProjectDescriptor.cs b/src/Main/SharpDevelop/Templates/Project/ProjectDescriptor.cs
index fe0f465c7b..2c72c49656 100644
--- a/src/Main/SharpDevelop/Templates/Project/ProjectDescriptor.cs
+++ b/src/Main/SharpDevelop/Templates/Project/ProjectDescriptor.cs
@@ -267,7 +267,7 @@ namespace ICSharpCode.SharpDevelop.Templates
 		
 		#region Create new project from template
 		//Show prompt, create files from template, create project, execute command, save project
-		public IProject CreateProject(ProjectTemplateResult templateResults, string defaultLanguage)
+		public bool CreateProject(ProjectTemplateResult templateResults, string defaultLanguage, ISolutionFolder target)
 		{
 			var projectCreateOptions = templateResults.Options;
 			var parentSolution = templateResults.Options.Solution;
@@ -283,7 +283,7 @@ namespace ICSharpCode.SharpDevelop.Templates
 					MessageService.ShowError(
 						StringParser.Parse("${res:ICSharpCode.SharpDevelop.Internal.Templates.ProjectDescriptor.CantCreateProjectWithTypeError}",
 						                   new StringTagPair("type", language)));
-					return null;
+					return false;
 				}
 				
 				DirectoryName projectBasePath = projectCreateOptions.ProjectBasePath;
@@ -335,7 +335,7 @@ namespace ICSharpCode.SharpDevelop.Templates
 						                   new StringTagPair("projectLocation", projectLocation)),
 						"${res:ICSharpCode.SharpDevelop.Internal.Templates.ProjectDescriptor.OverwriteQuestion.InfoName}"))
 					{
-						return null; //The user doesnt want to overwrite the project...
+						return false; //The user doesnt want to overwrite the project...
 					}
 				}
 				
@@ -408,10 +408,11 @@ namespace ICSharpCode.SharpDevelop.Templates
 				
 				#region Create Project
 				try {
+					info.InitializeTypeSystem = false;
 					project = languageinfo.CreateProject(info);
 				} catch (ProjectLoadException ex) {
 					MessageService.ShowError(ex.Message);
-					return null;
+					return false;
 				}
 				#endregion
 				
@@ -511,11 +512,18 @@ namespace ICSharpCode.SharpDevelop.Templates
 				// Save project
 				project.Save();
 				
+				// HACK : close and reload
+				var fn = project.FileName;
+				project.Dispose();
+				ProjectLoadInformation loadInfo = new ProjectLoadInformation(parentSolution, fn, fn.GetFileNameWithoutExtension());
+				project = SD.ProjectService.LoadProject(loadInfo);
+				target.Items.Add(project);
+				project.ProjectLoaded();
 				
 				SD.GetRequiredService<IProjectServiceRaiseEvents>().RaiseProjectCreated(new ProjectEventArgs(project));
 				templateResults.NewProjects.Add(project);
 				success = true;
-				return project;
+				return true;
 			} finally {
 				if (project != null && !success)
 					project.Dispose();
diff --git a/src/Main/SharpDevelop/Templates/Project/ProjectTemplateImpl.cs b/src/Main/SharpDevelop/Templates/Project/ProjectTemplateImpl.cs
index 49866cec75..4a24057d42 100644
--- a/src/Main/SharpDevelop/Templates/Project/ProjectTemplateImpl.cs
+++ b/src/Main/SharpDevelop/Templates/Project/ProjectTemplateImpl.cs
@@ -266,10 +266,8 @@ namespace ICSharpCode.SharpDevelop.Templates
 					return null;
 			}
 			if (projectDescriptor != null) {
-				IProject project = projectDescriptor.CreateProject(result, languagename);
-				if (project != null) {
-					options.SolutionFolder.Items.Add(project);
-				} else {
+				bool success = projectDescriptor.CreateProject(result, languagename, options.SolutionFolder);
+				if (!success) {
 					return null;
 				}
 			}
diff --git a/src/Main/SharpDevelop/Templates/Project/SolutionDescriptor.cs b/src/Main/SharpDevelop/Templates/Project/SolutionDescriptor.cs
index 6a97ec3fef..6740ba1a6c 100644
--- a/src/Main/SharpDevelop/Templates/Project/SolutionDescriptor.cs
+++ b/src/Main/SharpDevelop/Templates/Project/SolutionDescriptor.cs
@@ -45,10 +45,9 @@ namespace ICSharpCode.SharpDevelop.Templates
 						return false;
 				}
 				foreach (ProjectDescriptor projectDescriptor in projectDescriptors) {
-					IProject newProject = projectDescriptor.CreateProject(templateResult, defaultLanguage);
-					if (newProject == null)
+					bool success = projectDescriptor.CreateProject(templateResult, defaultLanguage, parentFolder);
+					if (!success)
 						return false;
-					parentFolder.Items.Add(newProject);
 				}
 				return true;
 			}