private void projectItemGenerator_ProjectItemGenerated(object sender, ProjectItemGeneratedEventArgs e)
{
//.NET is a single-threaded application so we much release to let the UI refresh sometimes.
if (_doEventCount % 10 == 0)
Application.DoEvents();
_doEventCount++;
try
{
const string solutionDirReplaceText = "$(solutiondir)";
if (e.FullName != null && e.FullName.ToLower().Contains(solutionDirReplaceText))
{
var ti = e.FullName.ToLower().IndexOf(solutionDirReplaceText);
e.FullName = e.FullName.Remove(ti, solutionDirReplaceText.Length).Insert(ti, EnvDTEHelper.Instance.SolutionDirectory.FullName);
}
if (e.ProjectItemName != null && e.ProjectItemName.ToLower().Contains(solutionDirReplaceText))
{
var ti = e.ProjectItemName.ToLower().IndexOf(solutionDirReplaceText);
e.ProjectItemName = e.ProjectItemName.Remove(ti, solutionDirReplaceText.Length).Insert(ti, EnvDTEHelper.Instance.SolutionDirectory.FullName);
}
//Get the parent project if one exists
Project project = null;
ProjectItem parent = null;
if (!string.IsNullOrEmpty(e.ProjectName))
{
if (projectCache.ContainsKey(e.ProjectName))
{
var p = projectCache[e.ProjectName];
//Test this COM object to ensure it has not expired.
//If error, do nothing and the project will be requeried
try
{
var s = p.Name;
project = p;
}
catch (Exception)
{
//Do Nothing
projectCache.Remove(e.ProjectName);
}
}
var fromCache = true;
if (project == null)
{
fromCache = false;
project = EnvDTEHelper.Instance.GetProject(e.ProjectName);
projectCache.Add(e.ProjectName, project);
}
parent = EnvDTEHelper.Instance.GetProjectItem(e.ProjectName, e.ParentItemName, e.ParentItemType);
//This should not happen. If do dump the cache project and requery
if (parent == null && fromCache)
{
if (projectCache.ContainsKey(e.ProjectName))
projectCache.Remove(e.ProjectName);
project = EnvDTEHelper.Instance.GetProject(e.ProjectName);
projectCache.Add(e.ProjectName, project);
parent = EnvDTEHelper.Instance.GetProjectItem(e.ProjectName, e.ParentItemName, e.ParentItemType);
}
}
var fileStateInfo = new FileStateInfo();
ProjectItem projectItem = null;
if (e.ParentItemName != string.Empty)
{
if (e.ContentType == ProjectItemContentType.String)
projectItem = EnvDTEHelper.Instance.AddProjectItem(project, parent, e.ProjectItemName, e.ProjectItemContent, e.Overwrite, out fileStateInfo);
else
{
projectItem = EnvDTEHelper.Instance.AddProjectItem(parent, e.ProjectItemContent, out fileStateInfo);
}
if (fileStateInfo.FileState == EnvDTEHelper.FileStateConstants.Success)
EnvDTEHelper.SetProperties(projectItem, e.Properties);
}
else
{
if (e.ContentType == ProjectItemContentType.String || e.ContentType == ProjectItemContentType.Binary)
{
if (project == null)
EnvDTEHelper.Instance.AddProjectItem(e.ProjectItemContent, e.ProjectItemBinaryContent, e.ContentType, e.ProjectItemName, e.Overwrite, out fileStateInfo);
else
projectItem = EnvDTEHelper.Instance.AddProjectItem(project, e.ProjectItemContent, e.ProjectItemBinaryContent, e.ContentType, e.ProjectItemName, e.Overwrite, out fileStateInfo);
}
else
{
projectItem = EnvDTEHelper.Instance.AddFileAsProjectItem(project, e.ProjectItemContent, e.ProjectItemName, e.Overwrite, out fileStateInfo);
}
if (fileStateInfo.FileState == EnvDTEHelper.FileStateConstants.Success)
EnvDTEHelper.SetProperties(projectItem, e.Properties);
}
//TEMP
processedFiles.Add(fileStateInfo.FileName);
//TEMP
//Custom Tool Functionality
if (e.RunCustomTool && projectItem != null)
{
if (!string.IsNullOrEmpty(e.CustomToolName))
{
EnvDTEHelper.SetProperty(projectItem, "Generator", e.CustomToolName);
EnvDTEHelper.SetProperty(projectItem, "CustomTool", e.CustomToolName);
}
//Try to run the custom tool
try
{
var vsProjectItem = projectItem.Object as VSLangProj.VSProjectItem;
if (vsProjectItem != null)
vsProjectItem.RunCustomTool();
}
catch
{
//Do Nothing
}
}
#region Compute CRC
//System.IO.StreamReader sr = System.IO.File.OpenText("");
//nHydrate.Generator.Common.Util.CRC32HashAlgorithm hash = new CRC32HashAlgorithm();
//byte[] arr = hash.ComputeHash(sr.BaseStream);
//sr.Close();
//XmlHelper.AddAttribute(newfileNode, "crc", "0");
#endregion
if (fileStateInfo.FileName == string.Empty)
{
System.Diagnostics.Debug.Write(string.Empty);
}
if (fileStateInfo.FileState == EnvDTEHelper.FileStateConstants.Failed)
{
System.Diagnostics.Debug.Write(string.Empty);
}
//Write Log
nHydrateLog.LogInfo("Project Item Generated: {0}", e.ProjectItemName);
e.FileState = fileStateInfo.FileState;
e.FullName = fileStateInfo.FileName;
this.OnProjectItemGenerated(sender, e);
}
catch (Exception ex)
{
this.OnProjectItemGeneratedError(this, e);
nHydrateLog.LogWarning(ex);
}
}