Defines the ProjectTemplateInfo type.
Inheritance: BaseTemplateInfo
 /// <summary>
 /// Adds the project if.
 /// </summary>
 /// <param name="condition">if set to <c>true</c> [condition].</param>
 /// <param name="projectTemplateInfo">The project template information.</param>
 protected void AddProjectIf(
     bool condition,
     ProjectTemplateInfo projectTemplateInfo)
 {
     if (condition)
     {
         this.ProjectTemplateInfos.Add(projectTemplateInfo);
     }
 }
        public void TestGetRequiredTemplate()
        {
            ProjectTemplateInfo templateInfo = new ProjectTemplateInfo();
            templateInfo.NugetCommands = new List<string> { "testCommand" };

            this.presenter.GetRequiredTemplate("projectName", templateInfo);

            string command = templateInfo.NugetCommands[0];

            Assert.IsTrue(command == "testCommand projectName");
        }
        /// <summary>
        /// Translates the specified from.
        /// </summary>
        /// <param name="from">From.</param>
        /// <returns>A ProjectTemplateInfo.</returns>
        public ProjectTemplateInfo Translate(XElement from)
        {
            string projectName = from.GetSafeAttributeStringValue("Name");

            ProjectTemplateInfo projectTemplateInfo = new ProjectTemplateInfo
            {
                Name = projectName,
                ItemTemplates = this.GetTextTemplates(projectName, projectName, from)
            };

            return projectTemplateInfo;
        }
        /// <summary>
        /// Adds the project.
        /// </summary>
        /// <param name="path">The path.</param>
        /// <param name="projectInfo">The project info.</param>
        internal void TryToAddProject(
            string path,
            ProjectTemplateInfo projectInfo)
        {
            TraceService.WriteLine("ProjectsService::TryToAddProject  project=" + projectInfo.Name);

            //// Project may actually already exist - if so just skip it!

            string projectPath = $@"{path}\{projectInfo.Name}\";

            if (this.FileSystem.Directory.Exists(projectPath) == false)
            {
                TraceService.WriteDebugLine(projectInfo.Name + " " + projectPath + " added to the solution.");

                this.AddProject(projectInfo, projectPath);
            }
            else
            {
                TraceService.WriteError("Directory " + projectPath + " not empty");
            }
        }
        /// <summary>
        /// Adds the project.
        /// </summary>
        /// <param name="projectInfo">The project info.</param>
        /// <param name="projectPath">The project path.</param>
        internal void AddProject(
            ProjectTemplateInfo projectInfo,
            string projectPath)
        {
            TraceService.WriteLine("ProjectsService::AddProject projectPath=" + projectPath + "templateName = " + projectInfo.TemplateName);

            try
            {
                string template = this.visualStudioService.SolutionService.GetProjectTemplate(projectInfo.TemplateName);

                TraceService.WriteLine("Template=" + template);

                //// add to TestProjects subfolder if applicable,
                if (this.SettingsService.CreateTestProjectsSolutionFolder && projectInfo.Name.EndsWith("Tests"))
                {
                    this.visualStudioService.SolutionService.AddProjectToSubFolder(
                        this.SettingsService.TestProjectsSolutionFolderName,
                        projectPath,
                        template,
                        projectInfo.Name);
                }
                else
                {
                    this.visualStudioService.SolutionService.AddProjectToSolution(projectPath, template, projectInfo.Name);
                }

                this.Messages.Add(projectInfo.Name + " project successfully added. (template " + projectInfo.TemplateName + ")");
            }
            catch (Exception exception)
            {
                TraceService.WriteError("error adding project exception=" + exception.Message);
                TraceService.WriteError("projectPath=" + projectPath);
                TraceService.WriteError("projectInfo.TemplateName=" + projectInfo.TemplateName);

                this.Messages.Add("ERROR " + projectInfo.Name + " not added. exception " + exception.Message + " (template " + projectInfo.TemplateName + ")");
            }
        }
        /// <summary>
        /// Adds the project.
        /// </summary>
        /// <param name="path">The path.</param>
        /// <param name="projectInfo">The project information.</param>
        internal void AddProject(
            string path,
            ProjectTemplateInfo projectInfo)
        {
            string message = $"ProjectsService::AddProjectIf project {projectInfo.Name}";

            TraceService.WriteLine(message);

            this.SettingsService.ActiveProject = projectInfo.FriendlyName;

            this.TryToAddProject(path, projectInfo);

            //// add reference to core project

            IProjectService coreProjectService = this.visualStudioService.CoreProjectService;

            IProjectService projectService = this.visualStudioService.GetProjectServiceBySuffix(projectInfo.ProjectSuffix);

            if (coreProjectService != null &&
                projectService != null &&
                projectInfo.ReferenceCoreProject)
            {
                if (projectService.Name != coreProjectService.Name)
                {
                    projectService.AddProjectReference(coreProjectService);
                }
                else
                {
                    TraceService.WriteError("Attemped to reference project to its self project=" + projectService.Name);
                }
            }

            //// now add references to xamarin forms if required.

            if (projectInfo.ReferenceXamarinFormsProject)
            {
                IProjectService formsProjectService = this.visualStudioService.XamarinFormsProjectService;

                if (formsProjectService != null &&
                    projectService != null)
                {
                    if (projectService.Name != formsProjectService.Name)
                    {
                        projectService.AddProjectReference(formsProjectService);
                    }
                    else
                    {
                        TraceService.WriteError("Attemped to reference project to its self project=" + projectService.Name);
                    }
                }
            }

            //// now add reference to the plaform project from the test platform project

            if (projectInfo.ReferencePlatformProject)
            {
                //// TODO : tidy this up a little bit!
                IProjectService platformProjectService = this.visualStudioService.GetProjectServiceBySuffix(
                    projectInfo.ProjectSuffix.Replace(".Tests", string.Empty));

                if (platformProjectService != null &&
                    projectService != null)
                {
                    //// for some reason cant add project reference to windows store project !!
                    //// as no one is developing mvvmcross windows store apps dont worry about it :-)
                    try
                    {
                        projectService.AddProjectReference(platformProjectService);
                    }
                    catch (Exception exception)
                    {
                        TraceService.WriteError("Unable to add project reference to " + platformProjectService.Name + " exception=" + exception.Message);
                    }
                }
            }

            if (projectInfo.ItemTemplates != null &&
                projectInfo.ItemTemplates.Any() &&
                projectService != null)
            {
                foreach (TextTemplateInfo textTemplateInfo in projectInfo.ItemTemplates)
                {
                    textTemplateInfo.Tokens = this.tokensTranslator.Translate(projectService);
                }

                this.textTemplatingService.AddTextTemplates(
                        "Adding items to project " + projectService.Name,
                        projectInfo.ItemTemplates);
            }
        }
 /// <summary>
 /// Adds the template.
 /// </summary>
 /// <param name="projectTemplateInfo">The project template info.</param>
 public void AddTemplate(ProjectTemplateInfo projectTemplateInfo)
 {
     this.mvxListView1.AddTemplate(projectTemplateInfo);
 }
        /// <summary>
        /// Gets the required template.
        /// </summary>
        /// <param name="projectName">Name of the project.</param>
        /// <param name="projectInfo">The project info.</param>
        internal void GetRequiredTemplate(
            string projectName, 
            ProjectTemplateInfo projectInfo)
        {
            projectInfo.Name = projectName + projectInfo.ProjectSuffix;
            projectInfo.UseNuget = this.view.UseNuget;

            if (projectInfo.NugetCommands != null)
            {
                List<string> newCommands =
                    projectInfo.NugetCommands.Select(
                        nugetCommand => string.Format("{0} {1}", nugetCommand, projectInfo.Name)).ToList();

                projectInfo.NugetCommands = newCommands;
            }
        }
        /// <summary>
        /// Adds the project.
        /// </summary>
        /// <param name="path">The path.</param>
        /// <param name="projectInfo">The project information.</param>
        internal void AddProject(
            string path,
            ProjectTemplateInfo projectInfo)
        {
            string message = string.Format("ProjectsService::AddProjectIf project {0}", projectInfo.Name);

            TraceService.WriteLine(message);

            this.settingsService.ActiveProject = projectInfo.FriendlyName;

            this.TryToAddProject(path, projectInfo);

            //// add reference to core project

            IProjectService coreProjectService = this.visualStudioService.CoreProjectService;

            IProjectService projectService = this.visualStudioService.GetProjectServiceBySuffix(projectInfo.ProjectSuffix);

            if (coreProjectService != null &&
                projectService != null &&
                projectInfo.ReferenceCoreProject)
            {
                projectService.AddProjectReference(coreProjectService);
            }

            //// now add references to xamarin forms if required.

            if (projectInfo.ReferenceXamarinFormsProject)
            {
                IProjectService formsProjectService = this.visualStudioService.XamarinFormsProjectService;

                if (formsProjectService != null &&
                    projectService != null )
                {
                    projectService.AddProjectReference(formsProjectService);
                }
            }

            //// now add reference to the plaform project from the test platform project

            if (projectInfo.ReferencePlatformProject)
            {
                //// TODO : tidy this up a little bit!
                IProjectService platformProjectService = this.visualStudioService.GetProjectServiceBySuffix(
                    projectInfo.ProjectSuffix.Replace(".Tests", string.Empty));

                if (platformProjectService != null &&
                    projectService != null)
                {
                    //// for some reason cant add project reference to windows store project !!
                    //// as no one is developing mvvmcross windows store apps dont worry about it :-)
                    try
                    {
                        projectService.AddProjectReference(platformProjectService);

                    }
                    catch (Exception exception)
                    {
                        TraceService.WriteError("Unable to add project reference to " + platformProjectService.Name);
                    }
                }
            }
        }
        /// <summary>
        /// References the first project.
        /// </summary>
        /// <param name="projectInfo">The project info.</param>
        /// <param name="firstProjectService">The first project service.</param>
        /// <returns>The project.</returns>
        internal IProjectService ReferenceFirstProject(
            ProjectTemplateInfo projectInfo, 
            IProjectService firstProjectService)
        {
            TraceService.WriteLine("ProjectsService::ReferenceFirstProject");

            IProjectService projectService = this.visualStudioService.SolutionService.GetProjectService(projectInfo.Name);

            if (projectService != null)
            {
                if (firstProjectService == null)
                {
                    firstProjectService = projectService;
                }
                else
                {
                    projectService.AddProjectReference(firstProjectService);
                }
            }

            return firstProjectService;
        }
        /// <summary>
        /// Deletes the lib folder.
        /// </summary>
        /// <param name="projectInfo">The project info.</param>
        internal void DeleteLibFolder(ProjectTemplateInfo projectInfo)
        {
            TraceService.WriteLine("ProjectsService::DeleteLibFolder");

            IProjectService projectService = this.visualStudioService.SolutionService.GetProjectService((projectInfo.Name));

            if (projectService != null)
            {
                IProjectItemService projectItemService = projectService.RemoveFolder("Lib");

                //// remove the local files if we are going to use nuget.
                if (projectInfo.UseNuget)
                {
                    projectItemService.DeleteFolder(projectInfo.NonMvxAssemblies);
                }
            }
        }
        /// <summary>
        /// Adds the project.
        /// </summary>
        /// <param name="includeLibFolderInProjects">if set to <c>true</c> [include lib folder in projects].</param>
        /// <param name="projectInfo">The project info.</param>
        /// <param name="projectPath">The project path.</param>
        internal void AddProject(
            bool includeLibFolderInProjects,
            ProjectTemplateInfo projectInfo,
            string projectPath)
        {
            TraceService.WriteLine("ProjectsService::AddProject");

            try
            {
                string template = this.visualStudioService.SolutionService.GetProjectTemplate(projectInfo.TemplateName);

                this.visualStudioService.SolutionService.AddProjectToSolution(projectPath, template, projectInfo.Name);

                //// remove the lib folder if that's what the developer wants to happen.
                //// if the develop has selected use nuget then also remove the project
                if (includeLibFolderInProjects == false ||
                    projectInfo.UseNuget)
                {
                    this.DeleteLibFolder(projectInfo);
                }

                this.Messages.Add(projectInfo.Name + " project successfully added.");
            }
            catch (Exception exception)
            {
                TraceService.WriteError("error adding project " + projectPath + " exception=" + exception.Message);
            }
        }
        /// <summary>
        /// Adds the project.
        /// </summary>
        /// <param name="projectInfo">The project info.</param>
        /// <param name="projectPath">The project path.</param>
        internal void AddProject(
            ProjectTemplateInfo projectInfo,
            string projectPath)
        {
            TraceService.WriteLine("ProjectsService::AddProject project=" + projectInfo.Name);

            try
            {
                string template = this.visualStudioService.SolutionService.GetProjectTemplate(projectInfo.TemplateName);

                TraceService.WriteLine("Template=" + template);

                this.visualStudioService.SolutionService.AddProjectToSolution(projectPath, template, projectInfo.Name);

                this.Messages.Add(projectInfo.Name + " project successfully added.");
            }
            catch (Exception exception)
            {
                TraceService.WriteError("error adding project " + projectPath + " exception=" + exception.Message);
            }
        }
        /// <summary>
        /// Adds the project.
        /// </summary>
        /// <param name="path">The path.</param>
        /// <param name="projectInfo">The project info.</param>
        internal void TryToAddProject(
            string path,
            ProjectTemplateInfo projectInfo)
        {
            TraceService.WriteLine("ProjectsService::TryToAddProject  project=" + projectInfo.Name);

            //// Project may actually already exist - if so just skip it!

            string projectPath = string.Format(@"{0}\{1}\", path, projectInfo.Name);

            if (this.FileSystem.Directory.Exists(projectPath) == false)
            {
                this.AddProject(projectInfo, projectPath);
            }

            else
            {
                TraceService.WriteError("Directory " + projectPath + " not empty");
            }
        }
        /// <summary>
        /// Adds the project.
        /// </summary>
        /// <param name="path">The path.</param>
        /// <param name="referenceFirstProject">if set to <c>true</c> [reference first project].</param>
        /// <param name="includeLibFolderInProjects">if set to <c>true</c> [include lib folder in projects].</param>
        /// <param name="projectInfo">The project info.</param>
        /// <param name="firstProjectService">The first project service.</param>
        /// <returns>The project service.</returns>
        internal IProjectService TryToAddProject(
            string path,
            bool referenceFirstProject,
            bool includeLibFolderInProjects,
            ProjectTemplateInfo projectInfo,
            IProjectService firstProjectService)
        {
            TraceService.WriteLine("ProjectsService::TryToAddProject");

            //// Project may actually already exist - if so just skip it!

            string projectPath = string.Format(@"{0}\{1}\", path, projectInfo.Name);

            if (this.FileSystem.Directory.Exists(projectPath) == false)
            {
                this.AddProject(includeLibFolderInProjects, projectInfo, projectPath);
            }

            if (referenceFirstProject)
            {
                firstProjectService = this.ReferenceFirstProject(projectInfo, firstProjectService);
            }

            return firstProjectService;
        }
        /// <summary>
        /// Fixes the information p list.
        /// </summary>
        /// <param name="projectTemplateInfo">The project template information.</param>
        public void FixInfoPList(ProjectTemplateInfo projectTemplateInfo)
        {
            TraceService.WriteLine("ApplicationService::FixInfoPlist");

            IProjectService iosProjectService = this.visualStudioService.iOSProjectService;

            if (iosProjectService != null)
            {
                if (projectTemplateInfo != null)
                {
                    IProjectItemService projectItemService = iosProjectService.GetProjectItem("Info.plist");

                    if (projectItemService != null)
                    {
                        XDocument doc = XDocument.Load(projectItemService.FileName);

                        if (doc.Root != null)
                        {
                            XElement element = doc.Root.Element("dict");

                            if (element != null)
                            {
                                //// first look for the elements

                                XElement childElement = element.Elements("key").FirstOrDefault(x => x.Value == "CFBundleDisplayName");

                                if (childElement == null)
                                {
                                    element.Add(new XElement("key", "CFBundleDisplayName"));
                                    element.Add(new XElement("string", iosProjectService.Name));
                                }

                                childElement = element.Elements("key").FirstOrDefault(x => x.Value == "CFBundleVersion");

                                if (childElement == null)
                                {
                                    element.Add(new XElement("key", "CFBundleVersion"));
                                    element.Add(new XElement("string", "1.0"));
                                }

                                childElement = element.Elements("key").FirstOrDefault(x => x.Value == "CFBundleIdentifier");

                                if (childElement == null)
                                {
                                    element.Add(new XElement("key", "CFBundleIdentifier"));
                                    element.Add(new XElement("string", "1"));
                                }
                            }

                            doc.Save(projectItemService.FileName);
                        }
                    }
                }
            }
        }
 /// <summary>
 /// Gets the required template.
 /// </summary>
 /// <param name="projectInfo">The project info.</param>
 internal void GetRequiredTemplate(ProjectTemplateInfo projectInfo)
 {
     projectInfo.Name = this.Project + projectInfo.ProjectSuffix;
 }