/// <summary>
 /// A factory method (Not really a factory) that initializes a new project type
 /// with the specified properties and returns it.
 /// </summary>
 /// <param name="id"></param>
 /// <param name="name"></param>
 /// <param name="type"></param>
 /// <param name="defaultPN"></param>
 /// <returns></returns>
 public static ProjectType InitType(string id, string name, string type, string defaultPN)
 {
     ProjectType pt = new ProjectType();
     pt.ID = id;
     pt.Name = name;
     pt.Type = type;
     pt.DefaultProjectName = defaultPN;
     return pt;
 }
 /// <summary>
 /// Adds a thumbnail to the project type and configures the uri used
 /// to determine the location of the thumbnail to be indeterminate on whether
 /// it is absolute or relative. This overload is mainly meant for code breverity.
 /// </summary>
 /// <param name="location"></param>
 /// <param name="pt"></param>
 /// <returns></returns>
 public static ProjectType AddThumbnail(string location, ProjectType pt)
 {
     BitmapImage logo = new BitmapImage();
     logo.BeginInit();
     logo.UriSource = new Uri(location, UriKind.RelativeOrAbsolute);
     logo.EndInit();
     pt.Icon = logo;
     return pt;
 }
 /// <summary>
 /// A method to register a type of project.
 /// 
 /// Note that in any place where a project type is used,
 /// ProjectType typeA;
 /// ProjectTypeRegistry.RegisteredTypes.TryGetValue(typeUsedInContext.ID, typeA);
 /// (typeUsedInContext == typeA) is always true
 /// </summary>
 /// <param name="typeToRegister"></param>
 public static void RegisterProjectType(ProjectType typeToRegister)
 {
     if (typeToRegister == null) throw new ArgumentNullException();
     if (String.IsNullOrEmpty(typeToRegister.ID.Trim())) throw new ArgumentException("New project type to be registered's ID string is Null! This is... Unacceptable!!!");
     if (!RegisteredTypes.ContainsKey(typeToRegister.ID))
     {
         RegisteredTypes.Add(typeToRegister.ID, typeToRegister);
         if(TypesChanged != null) TypesChanged(new EventArgs(), typeToRegister);
     }
 }
 public static void Reg(ProjectType pt)
 {
     Register(pt);
 }
 /// <summary>
 /// Registers the project type with the static class ProjectTypeRegistry.
 /// </summary>
 /// <param name="pt"></param>
 public static void Register(ProjectType pt)
 {
     Projects.ProjectTypeRegistry.RegisterProjectType(pt);
 }
 public void OnProjectsChanged(EventArgs e, ProjectType p)
 {
     ProjectTypes.Add(p);
 }