/*
* Copyright (c) 2004-2006, Netherlands Forensic Institute
* All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the Institute nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
using System;
using System.Collections.Generic;
using Microsoft.VisualStudio.TemplateWizard;
using System.Windows.Forms;
using EnvDTE;
using System.IO;
using System.Xml;
using System.Collections;
namespace CustomWizard{
public class IWizardImplementation : IWizard
{
private UserInputForm inputForm;
private string _interfaceName;
private string _namespaceName;
private string _usingStatement;
private string _displayName;
private string _assemblyPrefix;
// This method is called before opening any item that
// has the OpenInEditor attribute.
public void BeforeOpeningFile(ProjectItem projectItem)
{
}
public void ProjectFinishedGenerating(Project project)
{
try
{
// Replace text in Plugin.cs file
int idx = project.FullName.LastIndexOf("\\");
string dirName = project.FullName.Substring(0, idx + 1); // (+1) keeps the '\'
ReplaceText(dirName);
// Remove the file 'replacements.xml' from the project (and directory)
File.Delete(dirName + "replacements.xml");
ProjectItem projectItem = project.DTE.Solution.FindProjectItem("replacements.xml");
projectItem.Delete();
project.Properties.Item("AssemblyName").Value = _assemblyPrefix + project.Name;
string nunitpath = FindToolLocation(@"HKEY_LOCAL_MACHINE\SOFTWARE\nunit.org\NUnit-Net-2.0 2.2.6" , @"InstallDir");
if(null != nunitpath)
{
project.ConfigurationManager.ActiveConfiguration.Properties.Item("StartAction").Value = 1;
project.ConfigurationManager.ActiveConfiguration.Properties.Item("StartProgram").Value = nunitpath + @"bin\nunit-gui.exe";
project.ConfigurationManager.ActiveConfiguration.Properties.Item("StartArguments").Value = _assemblyPrefix + project.Name + ".dll";
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
private string FindToolLocation(string registryPath, string valueName)
{
return (string)Microsoft.Win32.Registry.GetValue(registryPath, valueName, null);
}
// This method is only called for item templates,
// not for project templates.
public void ProjectItemFinishedGenerating(ProjectItem projectItem)
{
}
// This method is called after the project is created.
public void RunFinished()
{
}
public void RunStarted(object automationObject, Dictionary<string, string> replacementsDictionary, WizardRunKind runKind, object[] customParams)
{
try
{
// Display a form to the user. The form collects input for the custom message.
inputForm = new UserInputForm();
if (inputForm.ShowDialog() == DialogResult.OK)
{
_interfaceName = inputForm.InterfaceName;
_namespaceName = inputForm.NamespaceName;
_usingStatement = inputForm.UsingStatement;
_displayName = inputForm.DisplayName;
_assemblyPrefix = inputForm.AssemblyPrefix;
}
// Add dictionary parameters.
replacementsDictionary.Add("$interfacename$", _interfaceName);
replacementsDictionary.Add("$namespacename$", _namespaceName);
replacementsDictionary.Add("$usingstatement$", _usingStatement);
replacementsDictionary.Add("$displayname$", _displayName);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
// This method is only called for item templates,
// not for project templates.
public bool ShouldAddProjectItem(string filePath)
{
return true;
}
private void ReplaceText(string projectDir)
{
Hashtable table = new Hashtable();
XmlDocument doc = new XmlDocument();
doc.Load(projectDir + "replacements.xml");
XmlNodeList elemList = doc.GetElementsByTagName("item");
for (int i = 0; i < elemList.Count; i++)
{
if (elemList[i].Attributes["type"].Value.Equals(_interfaceName))
{
table.Add(elemList[i].Attributes["name"].Value, elemList[i].InnerText.Trim());
}
}
string contents = File.ReadAllText(projectDir + "Plugin.cs");
foreach (DictionaryEntry entry in table)
{
contents = contents.Replace("$$" + entry.Key + "$$", entry.Value.ToString());
}
StreamWriter writer = new StreamWriter(projectDir + "Plugin.cs");
writer.Write(contents);
writer.Flush();
writer.Close();
}
}
}
|