/// <summary>
        /// Updates the item templates.
        /// </summary>
        /// <returns>A list of required views.</returns>
        public List<ItemTemplateInfo> GetRequiredItemTemplates()
        {
            const string ViewModelSuffix = "ViewModel";

            string viewName = this.view.ViewModelName.Remove(this.view.ViewModelName.Length - ViewModelSuffix.Length) + "View.cs";

            this.itemTemplateInfos.Clear();

            //// first add thew view model

            ItemTemplateInfo viewModelTemplateInfo = new ItemTemplateInfo
            {
                ProjectSuffix = ProjectSuffixes.Core,
                FolderName = "ViewModels",
                TemplateName = ItemTemplates.ViewModel,
                FileName = this.view.ViewModelName,
            };

            this.itemTemplateInfos.Add(viewModelTemplateInfo);

            foreach (ItemTemplateInfo itemTemplateInfo in this.view.RequiredTemplates)
            {
                itemTemplateInfo.FileName = viewName;

                this.itemTemplateInfos.Add(itemTemplateInfo);
            }

            return this.itemTemplateInfos;
        }
        /// <summary>
        /// Updates the item templates.
        /// </summary>
        /// <returns>A list of required views.</returns>
        public IEnumerable<ItemTemplateInfo> GetRequiredItemTemplates()
        {
            const string ViewModelSuffix = "ViewModel";

            string viewName = this.view.ViewModelName.Remove(this.view.ViewModelName.Length - ViewModelSuffix.Length) + "View.cs";

            List<ItemTemplateInfo> itemTemplateInfos = new List<ItemTemplateInfo>();

            //// first add the view model

            ItemTemplateInfo viewModelTemplateInfo = new ItemTemplateInfo
            {
                ProjectSuffix = ProjectSuffixes.Core,
                FolderName = "ViewModels",
                TemplateName = ItemTemplates.ViewModel,
                FileName = this.view.ViewModelName,
            };

            itemTemplateInfos.Add(viewModelTemplateInfo);

            foreach (ItemTemplateInfo itemTemplateInfo in this.view.RequiredTemplates)
            {
                itemTemplateInfo.FileName = viewName;

                itemTemplateInfos.Add(itemTemplateInfo);
            }

            //// do we require a Test ViewModel?

            if (this.view.IncludeUnitTests)
            {
                viewModelTemplateInfo = new ItemTemplateInfo
                {
                    ProjectSuffix = ProjectSuffixes.CoreTests,
                    FolderName = "ViewModels",
                    TemplateName = ItemTemplates.TestViewModel,
                    FileName = "Test" + this.view.ViewModelName,
                };

                itemTemplateInfos.Add(viewModelTemplateInfo);
            }

            return itemTemplateInfos;
        }
        /// <summary>
        /// Adds the converter.
        /// </summary>
        /// <param name="projectService">The project service.</param>
        /// <param name="templatesPath">The templates path.</param>
        /// <param name="messages">The messages.</param>
        /// <param name="templateInfo">The template info.</param>
        internal void AddConverter(
            IProjectService projectService, 
            string templatesPath, 
            List<string> messages, 
            ItemTemplateInfo templateInfo)
        {
            TraceService.WriteLine("ConvertersService::AddConverters adding from template path " + templatesPath + " template=" + templateInfo.FileName);

            string fileName = templateInfo.FriendlyName + ".cs";

            projectService.AddToFolderFromTemplate("Converters", templateInfo.FileName, fileName, false);

            IProjectItemService projectItemService = projectService.GetProjectItem(fileName);

            //// if we find the project item replace the text in it.
            if (projectItemService != null)
            {
                projectItemService.ReplacePattern("MvvmCross." + templateInfo.FriendlyName, projectService.Name);
                projectItemService.Save();
            }

            messages.Add(@"Converters\" + fileName + " added to project " + projectService.Name + ".");
        }
        /// <summary>
        /// Implements the test code snippet.
        /// </summary>
        /// <param name="visualStudioService">The visual studio service.</param>
        /// <param name="viewModelName">Name of the view model.</param>
        /// <param name="itemTemplateInfo">The item template info.</param>
        internal void ImplementTestCodeSnippet(
            IVisualStudioService visualStudioService,
            string viewModelName,
            ItemTemplateInfo itemTemplateInfo)
        {
            CodeSnippet testCodeSnippet = this.codeSnippetFactory.GetServiceTestSnippet(itemTemplateInfo.FriendlyName);

            IProjectItemService projectItemService =  this.codeSnippetService.CreateUnitTests(
                visualStudioService,
                visualStudioService.CoreTestsProjectService,
                testCodeSnippet,
                viewModelName,
                itemTemplateInfo.FriendlyName,
                string.Empty);

            projectItemService.FixUsingStatements();
        }
        /// <summary>
        /// Implements the code snippet.
        /// </summary>
        /// <param name="visualStudioService">The visual studio service.</param>
        /// <param name="viewModelName">Name of the view model.</param>
        /// <param name="coreProjectService">The core project service.</param>
        /// <param name="projectItemService">The project item service.</param>
        /// <param name="itemTemplateInfo">The item template info.</param>
        /// <returns>The project Item service.</returns>
        internal void ImplementCodeSnippet(
            IVisualStudioService visualStudioService,
            string viewModelName,
            IProjectService coreProjectService,
            IProjectItemService projectItemService,
            ItemTemplateInfo itemTemplateInfo)
        {
            TraceService.WriteLine("ServicesService::CreateSnippet service=" + itemTemplateInfo.FriendlyName + " viewModelName=" + viewModelName);

            CodeSnippet codeSnippet = this.codeSnippetFactory.GetServiceSnippet(itemTemplateInfo.FriendlyName);

            if (codeSnippet != null)
            {
                projectItemService.ImplementCodeSnippet(
                    codeSnippet,
                    this.settingsService.FormatFunctionParameters);

                this.Messages.Add(itemTemplateInfo.FriendlyName + " service code added to " + viewModelName + ".cs in project " + coreProjectService.Name + ".");
            }
        }
        /// <summary>
        /// Adds the service.
        /// </summary>
        /// <param name="visualStudioService">The visual studio service.</param>
        /// <param name="projectService">The project service.</param>
        /// <param name="templateInfo">The template info.</param>
        /// <returns>True or false.</returns>
        internal bool AddService(
            IVisualStudioService visualStudioService,
            IProjectService projectService,
            ItemTemplateInfo templateInfo)
        {
            TraceService.WriteLine("ServicesService::AddServices");

            //// put at the top of the stack!
            if (this.settingsService.UseNugetForPlugins)
            {
                IEnumerable<string> messages = this.nugetService.GetInitNugetMessages(NinjaMessages.ServicesViaNuget);
                this.Messages.AddRange(messages);
            }

            string fileName = templateInfo.FriendlyName + ".cs";

            try
            {
                projectService.AddToFolderFromTemplate(templateInfo.FileName, fileName);

                CodeConfig codeConfig = this.codeConfigFactory.GetServiceConfig(templateInfo.FriendlyName);

                if (codeConfig != null)
                {
                    this.ProcessConfig(
                        visualStudioService,
                        projectService,
                        codeConfig);
                }

                return true;
            }
            catch (Exception exception)
            {
                string message = "AddToFolderFromTemplate error:-" + exception.Message;

                TraceService.WriteError(message);
                this.messageBoxService.Show(
                    message,
                    "Ninja Code for MvvmCross - Add Service",
                    this.settingsService.BetaTesting,
                    Theme.Light,
                    this.settingsService.ThemeColor);

                throw new NinjaCoderServiceException
                {
                    NinjaMessage = "Ninja exception :-" + message,
                    FileName = templateInfo.FileName,
                };
            }
        }
        public void TestImplementTestCodeSnippet()
        {
            Mock<IVisualStudioService> mockVisualStudioService = new Mock<IVisualStudioService>();

            ItemTemplateInfo itemTemplateInfo = new ItemTemplateInfo();

            this.service.ImplementTestCodeSnippet(
                mockVisualStudioService.Object,
                "viewModelName",
                itemTemplateInfo);
        }
        public void TestImplementCodeSnippet()
        {
            Mock<IVisualStudioService> mockVisualStudioService = new Mock<IVisualStudioService>();

            Mock<IProjectService> mockProjectService = new Mock<IProjectService>();

            mockVisualStudioService.SetupGet(x => x.CoreProjectService)
                .Returns(mockProjectService.Object);

            Mock<IProjectItemService> mockProjectItemService = new Mock<IProjectItemService>();

            ItemTemplateInfo itemTemplateInfo = new ItemTemplateInfo();

            this.mockCodeSnippetFactory
                .Setup(x => x.GetServiceSnippet(
                    It.IsAny<string>()))
                    .Returns(new CodeSnippet());

            service.ImplementCodeSnippet(
                mockVisualStudioService.Object,
                "viewModelName",
                mockProjectService.Object,
                mockProjectItemService.Object,
                itemTemplateInfo);

            mockProjectItemService
                .Verify(x => x.ImplementCodeSnippet(
                    It.IsAny<CodeSnippet>(),
                    It.IsAny<bool>()));
        }
        public void TestAddService()
        {
            Mock<IVisualStudioService> mockVisualStudioService = new Mock<IVisualStudioService>();

            Mock<IProjectService> mockProjectService = new Mock<IProjectService>();

            mockVisualStudioService.SetupGet(x => x.CoreProjectService).Returns(mockProjectService.Object);

            ItemTemplateInfo itemTemplateInfo = new ItemTemplateInfo();

            service.AddService(
                mockVisualStudioService.Object,
                mockProjectService.Object,
                itemTemplateInfo);

            mockProjectService.Verify(x => x.AddToFolderFromTemplate(
                It.IsAny<string>(),
                It.IsAny<string>()));

            this.mockCodeConfigFactory.Verify(x => x.GetServiceConfig(
                It.IsAny<string>()));
        }
        /// <summary>
        /// Creates the snippet.
        /// </summary>
        /// <param name="visualStudioService">The visual studio service.</param>
        /// <param name="viewModelName">Name of the view model.</param>
        /// <param name="codeSnippetsPath">The code snippets path.</param>
        /// <param name="createUnitTests">if set to <c>true</c> [create unit tests].</param>
        /// <param name="coreProjectService">The core project service.</param>
        /// <param name="projectItemService">The project item service.</param>
        /// <param name="itemTemplateInfo">The item template info.</param>
        /// <returns>The project Item service.</returns>
        internal IProjectItemService CreateSnippet(
            IVisualStudioService visualStudioService,
            string viewModelName,
            string codeSnippetsPath,
            bool createUnitTests,
            IProjectService coreProjectService,
            IProjectItemService projectItemService,
            ItemTemplateInfo itemTemplateInfo)
        {
            TraceService.WriteLine("ServicesService::CreateSnippet service=" + itemTemplateInfo.FriendlyName + " viewModelName=" + viewModelName);

            string snippetPath = string.Format(@"{0}\Services.{1}.xml", codeSnippetsPath, itemTemplateInfo.FriendlyName);
            IProjectItemService testProjectItemService = null;

            CodeSnippet codeSnippet = this.snippetService.GetSnippet(snippetPath);

            if (codeSnippet != null)
            {
                //// Do some variable substitution!!!!

                if (this.settingsService.ReplaceVariablesInSnippets)
                {
                    this.snippetService.ApplyGlobals(visualStudioService, codeSnippet);
                }

                projectItemService.ImplementCodeSnippet(codeSnippet, this.settingsService.FormatFunctionParameters);

                this.Messages.Add(itemTemplateInfo.FriendlyName + " service code added to " + viewModelName + ".cs in project " + coreProjectService.Name + ".");

                //// do we need to implement any unit tests?
                if (createUnitTests)
                {
                    string testSnippetPath = string.Format(@"{0}\Services.{1}.Tests.xml", codeSnippetsPath, itemTemplateInfo.FriendlyName);

                    IProjectItemService itemService = this.snippetService.CreateUnitTests(
                            visualStudioService,
                            visualStudioService.CoreTestsProjectService,
                            testSnippetPath,
                            viewModelName,
                            itemTemplateInfo.FriendlyName,
                            string.Empty);

                    //// if we actually create some units tests save the pointer to do
                    //// the sort and remove of the using statements later!
                    if (itemService != null)
                    {
                        testProjectItemService = itemService;
                    }
                }
            }

            return testProjectItemService;
        }
        /// <summary>
        /// Adds the service.
        /// </summary>
        /// <param name="visualStudioService">The visual studio service.</param>
        /// <param name="projectService">The project service.</param>
        /// <param name="templatesPath">The templates path.</param>
        /// <param name="templateInfo">The template info.</param>
        /// <returns>True or false.</returns>
        internal bool AddService(
            IVisualStudioService visualStudioService,
            IProjectService projectService,
            string templatesPath,
            ItemTemplateInfo templateInfo)
        {
            TraceService.WriteLine("ServicesService::AddServices adding from template path " + templatesPath + " template=" + templateInfo.FileName);

            //// put at the top of the stack!
            if (this.settingsService.UseNugetForPlugins)
            {
                IEnumerable<string> messages = this.nugetService.GetInitNugetMessages(NinjaMessages.ServicesViaNuget);
                this.Messages.AddRange(messages);
            }

            string fileName = templateInfo.FriendlyName + ".cs";

            try
            {
                projectService.AddToFolderFromTemplate("Services", templateInfo.FileName, fileName, false);

                string configFile = string.Format(@"{0}\Services\Config.{1}.xml", this.settingsService.ConfigPath, templateInfo.FriendlyName);

                if (this.fileSystem.File.Exists(configFile))
                {
                    this.ProcessConfig(
                        visualStudioService,
                        projectService,
                        configFile);
                }

                return true;
            }
            catch (Exception exception)
            {
                string message = "AddToFolderFromTemplate error:-" + exception.Message;

                TraceService.WriteError(message);
                this.messageBoxService.Show(message, "Ninja Code for MvvmCross - Add Service");

                throw new NinjaCoderServiceException
                {
                    NinjaMessage = "Ninja exception :-" + message,
                    FileName = templateInfo.FileName,
                    FolderName = templateInfo.FolderName
                };
            }
        }
        /// <summary>
        /// Gets the required templates.
        /// </summary>
        /// <param name="view">The view.</param>
        /// <param name="viewModelName">Name of the view model.</param>
        /// <param name="requiredUIViews">The required UI views.</param>
        /// <param name="unitTestsRequired">if set to <c>true</c> [unit tests required].</param>
        /// <param name="overwriteCurrentFiles">if set to <c>true</c> [overwrite current files].</param>
        /// <returns>
        /// The required template.
        /// </returns>
        public IEnumerable<ItemTemplateInfo> GetRequiredViewModelAndViews(
            View view,
            string viewModelName,
            IEnumerable<ItemTemplateInfo> requiredUIViews,
            bool unitTestsRequired,
            bool overwriteCurrentFiles)
        {
            TraceService.WriteLine("ViewModelAndViewsFactory::GetRequiredViewModelAndViews");

            const string ViewModelSuffix = "ViewModel";

            List<ItemTemplateInfo> itemTemplateInfos = new List<ItemTemplateInfo>();

            //// first add the view model

            if (view.Framework == FrameworkType.MvvmCross.GetDescription())
            {
                ItemTemplateInfo viewModelTemplateInfo = new ItemTemplateInfo
                {
                    ProjectSuffix = ProjectSuffix.Core.GetDescription(),
                    TemplateName = this.GetViewModelTemplate(FrameworkType.MvvmCross.GetValueFromDescription<FrameworkType>(view.Framework), view.PageType),
                    FileName = viewModelName + ".cs"
                };

                itemTemplateInfos.Add(viewModelTemplateInfo);

                string viewName = viewModelName.Remove(viewModelName.Length - ViewModelSuffix.Length) + "View.cs";

                foreach (ItemTemplateInfo itemTemplateInfo in requiredUIViews)
                {
                    itemTemplateInfo.TemplateName = this.GetViewTemplate(FrameworkType.MvvmCross.GetValueFromDescription<FrameworkType>(view.Framework),
                        itemTemplateInfo.ProjectSuffix,
                        view.PageType);

                    itemTemplateInfo.FileName = viewName;

                    itemTemplateInfos.Add(itemTemplateInfo);
                }
            }

            else if (view.Framework == FrameworkType.XamarinForms.GetDescription())
            {
                ItemTemplateInfo viewModelTemplateInfo = new ItemTemplateInfo
                {
                    ProjectSuffix = ProjectSuffix.Core.GetDescription(),
                    TemplateName = this.GetViewModelTemplate(FrameworkType.MvvmCross.GetValueFromDescription<FrameworkType>(view.Framework), view.PageType),
                    FileName = viewModelName + ".cs",
                };

                itemTemplateInfos.Add(viewModelTemplateInfo);

                string viewName = viewModelName.Remove(viewModelName.Length - ViewModelSuffix.Length) + "View.cs";

                ItemTemplateInfo viewTemplateInfo = new ItemTemplateInfo
                {
                    ProjectSuffix = ProjectSuffix.XamarinForms.GetDescription(),
                    TemplateName = this.GetViewTemplate(FrameworkType.MvvmCross.GetValueFromDescription<FrameworkType>(view.Framework),
                        string.Empty,
                        view.PageType),
                    FileName = viewName,
                };

                itemTemplateInfos.Add(viewTemplateInfo);
            }

            //// do we require a Test ViewModel?

            if (unitTestsRequired)
            {
                ItemTemplateInfo viewModelTemplateInfo = new ItemTemplateInfo
                                            {
                                                ProjectSuffix = ProjectSuffix.CoreTests.GetDescription(),
                                                TemplateName = this.GetTestViewModelTemplate(
                                                    FrameworkType.MvvmCross.GetValueFromDescription<FrameworkType>(view.Framework),
                                                    view.PageType),
                                                FileName = "Test" + viewModelName + ".cs",
                                            };

                itemTemplateInfos.Add(viewModelTemplateInfo);
            }

            return itemTemplateInfos;
        }
        /// <summary>
        /// Gets the MVVM cross view.
        /// </summary>
        /// <param name="itemTemplateInfo">The item template information.</param>
        /// <param name="tokens">The tokens.</param>
        /// <param name="viewTemplateName">Name of the view template.</param>
        /// <param name="viewName">Name of the view.</param>
        /// <returns></returns>
        public TextTemplateInfo GetMvvmCrossView(
            ItemTemplateInfo itemTemplateInfo,
            Dictionary<string, string> tokens,
            string viewTemplateName,
            string viewName)
        {
            TraceService.WriteLine("MvvmCrossViewFactory::GetMvvmCrossView viewTemplateName=" + viewTemplateName);

            if (itemTemplateInfo.ProjectSuffix == this.SettingsService.iOSProjectSuffix)
            {
                return this.GetiOSMvvmCrossView(
                    itemTemplateInfo,
                    tokens,
                    viewTemplateName,
                    viewName);
            }

            TextTemplateInfo textTemplateInfo = new TextTemplateInfo
            {
                ProjectSuffix = itemTemplateInfo.ProjectSuffix,
                ProjectFolder = "Views",
                Tokens = tokens,
                ShortTemplateName = viewTemplateName,
                TemplateName = this.SettingsService.ItemTemplatesDirectory + "\\" + itemTemplateInfo.ProjectType + "\\" + viewTemplateName
            };

            TextTransformationRequest textTransformationRequest = new TextTransformationRequest
            {
                SourceFile = textTemplateInfo.TemplateName,
                Parameters = textTemplateInfo.Tokens,
                RemoveFileHeaders = this.SettingsService.RemoveDefaultFileHeaders,
                RemoveXmlComments = this.SettingsService.RemoveDefaultComments,
                RemoveThisPointer = this.SettingsService.RemoveThisPointer
            };

            TextTransformation textTransformation = this.GetTextTransformationService().Transform(textTransformationRequest);

            textTemplateInfo.TextOutput = textTransformation.Output;
            textTemplateInfo.FileName = viewName + "." + textTransformation.FileExtension;

            if (itemTemplateInfo.ProjectSuffix == this.SettingsService.DroidProjectSuffix)
            {
                textTemplateInfo.FileOperations.Add(
                    this.GetCompileFileOperation(textTemplateInfo.ProjectSuffix, textTemplateInfo.FileName));
            }
            else
            {
                textTemplateInfo.FileOperations.Add(
                    this.GetPageFileOperation(textTemplateInfo.ProjectSuffix, textTemplateInfo.FileName));
            }

            return textTemplateInfo;
        }
        /// <summary>
        /// Getis the os MVVM cross view.
        /// </summary>
        /// <param name="itemTemplateInfo">The item template information.</param>
        /// <param name="tokens">The tokens.</param>
        /// <param name="viewTemplateName">Name of the view template.</param>
        /// <param name="viewName">Name of the view.</param>
        /// <returns>A TextTemplateInfo.</returns>
        internal TextTemplateInfo GetiOSMvvmCrossView(
            ItemTemplateInfo itemTemplateInfo,
            Dictionary<string, string> tokens,
            string viewTemplateName,
            string viewName)
        {
            TraceService.WriteLine("MvvmCrossViewFactory::GetiOSMvvmCrossView viewTemplateName=" + viewTemplateName);

            string folder = viewTemplateName.Replace("View.t4", string.Empty);

            TraceService.WriteLine("folder=" + folder);

            string subFolder = this.SettingsService.SelectedMvvmCrossiOSViewType;

            TraceService.WriteLine("subFolder=" + subFolder);

            folder = folder.Replace(subFolder, string.Empty);

            TraceService.WriteLine("folder=" + folder);

            string templateFolder = this.SettingsService.ItemTemplatesDirectory + "\\iOS\\" + folder + "\\" + subFolder + "\\";
            string shortFolderName = folder + "\\" + subFolder + "\\";

            TraceService.WriteLine("templateFolder=" + templateFolder);

            TextTemplateInfo textTemplateInfo = new TextTemplateInfo
            {
                ProjectSuffix = this.SettingsService.iOSProjectSuffix,
                ProjectFolder = "Views",
                Tokens = tokens,
                ShortTemplateName = shortFolderName + "View.t4",
                TemplateName = templateFolder + "View.t4"
            };

            TextTransformationRequest textTransformationRequest = new TextTransformationRequest
            {
                SourceFile = textTemplateInfo.TemplateName,
                Parameters = tokens,
                RemoveFileHeaders = this.SettingsService.RemoveDefaultFileHeaders,
                RemoveXmlComments = this.SettingsService.RemoveDefaultComments,
                RemoveThisPointer = this.SettingsService.RemoveThisPointer
            };

            TextTransformation textTransformation = this.GetTextTransformationService().Transform(textTransformationRequest);

            textTemplateInfo.TextOutput = textTransformation.Output;
            textTemplateInfo.FileName = viewName + "." + textTransformation.FileExtension;

            textTemplateInfo.FileOperations.Add(this.GetCompileFileOperation(
                textTemplateInfo.ProjectSuffix,
                textTemplateInfo.FileName));

            //// now handle xib and story board options!

            TraceService.WriteLine("SelectedMvvmCrossiOSViewType=" + this.SettingsService.SelectedMvvmCrossiOSViewType);

            if (this.SettingsService.SelectedMvvmCrossiOSViewType == MvvmCrossViewType.StoryBoard.GetDescription() ||
                this.SettingsService.SelectedMvvmCrossiOSViewType == MvvmCrossViewType.Xib.GetDescription())
            {
                viewTemplateName = this.SettingsService.SelectedMvvmCrossiOSViewType == MvvmCrossViewType.Xib.GetDescription() ? "ViewXib.t4" : "ViewStoryBoard.t4";

                TraceService.WriteLine("Adding ChildTextTemplate ViewTemplateName=" + viewTemplateName);

                TextTemplateInfo childTextTemplateInfo = new TextTemplateInfo
                {
                    ProjectSuffix = itemTemplateInfo.ProjectSuffix,
                    ProjectFolder = "Views",
                    Tokens = tokens,
                    ShortTemplateName = shortFolderName + viewTemplateName,
                    TemplateName = templateFolder + viewTemplateName
                };

                TextTransformationRequest childTextTransformationRequest = new TextTransformationRequest
                {
                    SourceFile = childTextTemplateInfo.TemplateName,
                    Parameters = tokens,
                    RemoveFileHeaders = this.SettingsService.RemoveDefaultFileHeaders,
                    RemoveXmlComments = this.SettingsService.RemoveDefaultComments,
                    RemoveThisPointer = this.SettingsService.RemoveThisPointer
                };

                textTransformation = this.GetTextTransformationService().Transform(childTextTransformationRequest);

                childTextTemplateInfo.TextOutput = textTransformation.Output;
                childTextTemplateInfo.FileName = viewName + "." + textTransformation.FileExtension;

                textTemplateInfo.ChildItems.Add(childTextTemplateInfo);

                //// add in designer file

                viewTemplateName = "ViewDesigner.t4";

                TraceService.WriteLine("Adding ChildTextTemplate ViewTemplateName=" + viewTemplateName);

                childTextTemplateInfo = new TextTemplateInfo
                {
                    ProjectSuffix = itemTemplateInfo.ProjectSuffix,
                    ProjectFolder = "Views",
                    Tokens = tokens,
                    ShortTemplateName = shortFolderName + viewTemplateName,
                    TemplateName = templateFolder + viewTemplateName
                };

                childTextTransformationRequest = new TextTransformationRequest
                {
                    SourceFile = childTextTemplateInfo.TemplateName,
                    Parameters = tokens,
                    RemoveFileHeaders = this.SettingsService.RemoveDefaultFileHeaders,
                    RemoveXmlComments = this.SettingsService.RemoveDefaultComments,
                    RemoveThisPointer = this.SettingsService.RemoveThisPointer
                };

                textTransformation = this.GetTextTransformationService().Transform(childTextTransformationRequest);

                childTextTemplateInfo.TextOutput = textTransformation.Output;
                childTextTemplateInfo.FileName = viewName + ".designer." + textTransformation.FileExtension;

                textTemplateInfo.ChildItems.Add(childTextTemplateInfo);
            }

            return textTemplateInfo;
        }
        /// <summary>
        /// Gets the MVVM cross view.
        /// </summary>
        /// <param name="viewModelName">Name of the view model.</param>
        /// <param name="itemTemplateInfo">The item template information.</param>
        /// <param name="view">The view.</param>
        /// <returns>A TextTemplateInfo.</returns>
        public TextTemplateInfo GetMvvmCrossView(
            string viewModelName,
            ItemTemplateInfo itemTemplateInfo,
            View view)
        {
            TraceService.WriteLine("MvvmCrossViewFactory::GetMvvmCrossView");

            string viewName = viewModelName.Remove(viewModelName.Length - ViewModelSuffix.Length) + "View";

            TraceService.WriteLine("viewName=" + viewName);

            string viewTemplateName = this.GetViewTemplate(
                    FrameworkType.MvvmCross.GetValueFromDescription<FrameworkType>(view.Framework),
                    view.PageType);

            TraceService.WriteLine("ViewTemplateName=" + viewTemplateName);

            if (itemTemplateInfo.ProjectSuffix == this.SettingsService.iOSProjectSuffix)
            {
                viewTemplateName = this.SettingsService.SelectedMvvmCrossiOSViewType + viewTemplateName;

                TraceService.WriteLine("iOS ViewTemplateName=" + viewTemplateName);
            }

            Dictionary<string, string> tokens = this.GetBaseDictionary(
                viewName,
                itemTemplateInfo.ProjectSuffix);

            TextTemplateInfo textTemplateInfo = this.GetMvvmCrossView(
                itemTemplateInfo,
                tokens,
                viewTemplateName,
                viewName);

            if (itemTemplateInfo.ProjectSuffix == this.SettingsService.WindowsPhoneProjectSuffix ||
                itemTemplateInfo.ProjectSuffix == this.SettingsService.WpfProjectSuffix ||
                itemTemplateInfo.ProjectSuffix == this.SettingsService.WindowsUniversalProjectSuffix)
            {
                TextTemplateInfo childTextTemplateInfo =
                    this.GetCodeBehindTextTemplateInfo(
                        itemTemplateInfo.ProjectSuffix,
                        viewName,
                        viewTemplateName,
                        tokens);

                textTemplateInfo.ChildItems.Add(childTextTemplateInfo);
            }
            else if (itemTemplateInfo.ProjectSuffix == this.SettingsService.DroidProjectSuffix)
            {
                this.GetDroidMvvmCrossViewLayout(textTemplateInfo, tokens, viewName);
            }

            return textTemplateInfo;
        }
 /// <summary>
 /// Adds the template.
 /// </summary>
 /// <param name="itemTemplateInfo">The item template info.</param>
 public void AddTemplate(ItemTemplateInfo itemTemplateInfo)
 {
     this.mvxListView1.AddTemplate(itemTemplateInfo);
 }
        /// <summary>
        /// Gets the required templates.
        /// </summary>
        /// <param name="viewModelName">Name of the view model.</param>
        /// <param name="requiredUIViews">The required UI views.</param>
        /// <param name="includeUnitTests">if set to <c>true</c> [include unit tests].</param>
        /// <returns>The required template.</returns>
        public IEnumerable<ItemTemplateInfo> GetRequiredViewModelAndViews(
            string viewModelName,
            IEnumerable<ItemTemplateInfo> requiredUIViews,
            bool includeUnitTests)
        {
            const string ViewModelSuffix = "ViewModel";

            List<ItemTemplateInfo> itemTemplateInfos = new List<ItemTemplateInfo>();

            //// first add the view model

            ItemTemplateInfo viewModelTemplateInfo = new ItemTemplateInfo
            {
                ProjectSuffix = ProjectSuffixes.Core,
                TemplateName = this.GetViewModelTemplate(),
                FileName = viewModelName + ".cs",
            };

            itemTemplateInfos.Add(viewModelTemplateInfo);

            string viewName = viewModelName.Remove(viewModelName.Length - ViewModelSuffix.Length) + "View.cs";

            foreach (ItemTemplateInfo itemTemplateInfo in requiredUIViews)
            {
                itemTemplateInfo.TemplateName = this.GetViewTemplate(itemTemplateInfo.ProjectSuffix);
                itemTemplateInfo.FileName = viewName;
                itemTemplateInfos.Add(itemTemplateInfo);
            }

            //// do we require a Test ViewModel?

            if (includeUnitTests)
            {
                viewModelTemplateInfo = new ItemTemplateInfo
                {
                    ProjectSuffix = ProjectSuffixes.CoreTests,
                    TemplateName = this.GetTestViewModelTemplate(),
                    FileName = "Test" + viewModelName + ".cs",
                };

                itemTemplateInfos.Add(viewModelTemplateInfo);
            }

            return itemTemplateInfos;
        }