Defines the TextTemplateInfo type.
        /// <summary>
        /// Gets the text templates.
        /// </summary>
        /// <param name="nameSpace">The name space.</param>
        /// <param name="projectName">Name of the project.</param>
        /// <param name="element">The element.</param>
        /// <returns></returns>
        internal IEnumerable<TextTemplateInfo> GetTextTemplates(
            string nameSpace,
            string projectName,
            XElement element)
        {
            List<TextTemplateInfo> textTemplateInfos= new List<TextTemplateInfo>();

            XElement itemTeplatesElement = element.Element("ItemTemplates");

            IEnumerable<XElement> itemElements = itemTeplatesElement?.Elements("Item");

            if (itemElements != null)
            {
                foreach (XElement itemElement in itemElements)
                {
                    TextTemplateInfo textTemplateInfo = new TextTemplateInfo
                    {
                        TemplateName =this.GetTemplatePath(projectName,itemElement),
                        ProjectSuffix = projectName,
                        ProjectFolder = itemElement.GetSafeElementStringValue("Folder"),
                        FileName = itemElement.GetSafeElementStringValue("Target"),
                        Tokens = new Dictionary<string, string>
                                     {
                                        { "NameSpace",
                                           this.GetNameSpace(projectName)
                                        }
                                     }
                    };

                    textTemplateInfos.Add(textTemplateInfo);
                }
            }

            return textTemplateInfos;
        }
        /// <summary>
        ///     Gets the code behind text template information.
        /// </summary>
        /// <param name="projectSuffix">The project suffix.</param>
        /// <param name="viewName">Name of the view.</param>
        /// <param name="viewTemplateName">Name of the view template.</param>
        /// <param name="tokens">The tokens.</param>
        /// <returns>A TextTemplateInfo.</returns>
        protected TextTemplateInfo GetCodeBehindTextTemplateInfo(
            string projectSuffix,
            string viewName,
            string viewTemplateName,
            Dictionary<string, string> tokens)
        {
            var templateDirectory = this.SettingsService.ItemTemplatesDirectory;

            if (projectSuffix == this.SettingsService.XamarinFormsProjectSuffix)
            {
                templateDirectory += "\\XamarinForms";
            }

            TextTemplateInfo textTemplateInfo = new TextTemplateInfo
            {
                ProjectSuffix = projectSuffix,
                ProjectFolder = "Views",
                Tokens = tokens,
                ShortTemplateName = viewTemplateName,
                TemplateName = templateDirectory + "\\" + "BlankViewCodeBehind.t4"
            };

            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;

            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="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>
        /// Gets the droid MVVM cross view layout.
        /// </summary>
        /// <param name="textTemplateInfo">The text template information.</param>
        /// <param name="tokens">The tokens.</param>
        /// <param name="viewName">Name of the view.</param>
        internal void GetDroidMvvmCrossViewLayout(
            TextTemplateInfo textTemplateInfo,
            Dictionary<string, string> tokens,
            string viewName)
        {
            string viewTemplateName = textTemplateInfo.ShortTemplateName.Replace(".t4", ".axml.t4");

            TextTemplateInfo childTextTemplateInfo = new TextTemplateInfo
            {
                ProjectSuffix = this.SettingsService.DroidProjectSuffix,
                ProjectFolder = "Resources\\Layout",
                Tokens = tokens,
                ShortTemplateName = viewTemplateName,
                TemplateName = this.SettingsService.ItemTemplatesDirectory + "\\Droid\\" + viewTemplateName
            };

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

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

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

            textTemplateInfo.ChildItems.Add(childTextTemplateInfo);
        }
        /// <summary>
        /// Gets the xamarin forms view.
        /// </summary>
        /// <param name="viewModelName">Name of the view model.</param>
        /// <param name="view">The view.</param>
        /// <returns>A TextTemplateInfo.</returns>
        internal TextTemplateInfo GetXamarinFormsView(string viewModelName, View view)
        {
            TraceService.WriteLine("ViewModelAndViewsFactory::GetXamarinFormsView viewModelName=" + viewModelName + " view=" + view.Name);

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

            string viewName = viewModelName.Remove(viewModelName.Length - ViewModelSuffix.Length) + "View";
            string pageType = view.PageType.Replace(" ", string.Empty);

            Dictionary<string, string> tokens = new Dictionary<string, string>
            {
                { "ClassName", viewName },
                { "CoreProjectName", this.VisualStudioService.CoreProjectService.Name },
                { "NameSpace", this.VisualStudioService.XamarinFormsProjectService.Name + ".Views" },
                { "PageType", pageType },
                { "CompileOption", this.SettingsService.UseXamarinFormsXamlCompilation ? XamarinFormsCompileOption.Compile.GetDescription() : XamarinFormsCompileOption.Skip.GetDescription() },
                { "Content", this.GetFormsViewContent(view)
                }
            };

            TextTemplateInfo textTemplateInfo = new TextTemplateInfo
            {
                ProjectSuffix = this.SettingsService.XamarinFormsProjectSuffix,
                ProjectFolder = "Views",
                Tokens = tokens,
                ShortTemplateName = viewTemplateName,
                TemplateName = this.SettingsService.ItemTemplatesDirectory + "\\XamarinForms\\" + 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;

            //// we also need to add a build action for the xaml file!

            textTemplateInfo.FileOperations.Add(
                this.GetEmbeddedResourceFileOperation(
                    this.SettingsService.XamarinFormsProjectSuffix,
                    textTemplateInfo.FileName));

            //// add code behind file

            TextTemplateInfo childTextTemplateInfo =
                this.GetCodeBehindTextTemplateInfo(
                    this.SettingsService.XamarinFormsProjectSuffix,
                    viewName,
                    viewTemplateName,
                    tokens);

            textTemplateInfo.ChildItems.Add(childTextTemplateInfo);

            return textTemplateInfo;
        }
        /// <summary>
        /// Gets the view model text template information.
        /// </summary>
        /// <param name="view">The view.</param>
        /// <param name="viewModelName">Name of the view model.</param>
        /// <returns>A TextTemplateInfo.</returns>
        internal TextTemplateInfo GetViewModelTextTemplateInfo(
            View view,
            string viewModelName)
        {
            TraceService.WriteLine("ViewModelAndViewsFactory::GetViewModelTextTemplateInfo viewModelName=" + viewModelName + " view=" + view.Name);

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

            Dictionary<string, string> tokens = new Dictionary<string, string>
            {
                { "ClassName", viewModelName },
                { "NameSpace",  this.VisualStudioService.CoreProjectService != null ? this.VisualStudioService.CoreProjectService.Name + ".ViewModels" : string.Empty}
            };

            TextTemplateInfo textTemplateInfo = new TextTemplateInfo
            {
                ProjectSuffix = this.SettingsService.CoreProjectSuffix,
                FileName = viewModelName + ".cs",
                ProjectFolder = "ViewModels",
                Tokens = tokens,
                ShortTemplateName = templateName,
                TemplateName = this.SettingsService.ItemTemplatesDirectory + "\\ViewModels\\" + templateName
            };

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

            textTemplateInfo.TextOutput = this.GetTextTransformationService().Transform(textTransformationRequest).Output;

            return textTemplateInfo;
        }
        /// <summary>
        /// Gets the unit testing item template.
        /// </summary>
        /// <param name="view">The view.</param>
        /// <param name="viewModelName">Name of the view model.</param>
        /// <returns>A TextTemplateInfo.</returns>
        internal TextTemplateInfo GetUnitTestingItemTemplate(
            View view,
            string viewModelName)
        {
            TraceService.WriteLine("ViewModelAndViewsFactory::GetUnitTestingItemTemplate viewModelName=" + viewModelName + " view=" + view.Name);

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

            Dictionary<string, string> tokens = new Dictionary<string, string>
            {
                { "ClassName", "Test" + viewModelName },
                { "NameSpace", this.VisualStudioService.CoreTestsProjectService.Name + ".ViewModels" },
                { "TestingLibrary", this.testingFrameworkFactory.GetTestingLibrary() },
                { "TestingClassAttribute", this.testingFrameworkFactory.GetTestingClassAttribute() },
                { "TestingMethodAttribute", this.testingFrameworkFactory.GetTestingMethodAttribute() },
                { "TestableObject", viewModelName },
                { "TestableObjectInstance", viewModelName.LowerCaseFirstCharacter() }
            };

            TextTemplateInfo textTemplateInfo = new TextTemplateInfo
            {
                ProjectSuffix = this.SettingsService.CoreTestsProjectSuffix,
                FileName = "Test" + viewModelName + ".cs",
                ProjectFolder = "ViewModels",
                Tokens = tokens,
                ShortTemplateName = templateName,
                TemplateName = this.SettingsService.ItemTemplatesDirectory + "\\TestViewModels\\" + templateName
            };

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

            textTemplateInfo.TextOutput = this.GetTextTransformationService().Transform(textTransformationRequest).Output;

            return textTemplateInfo;
        }
        /// <summary>
        /// Adds the text template.
        /// </summary>
        /// <param name="textTemplateInfo">The text template information.</param>
        /// <param name="outputTextTemplateContentToTraceFile">if set to <c>true</c> [output text template content to trace file].</param>
        /// <returns></returns>
        public string AddTextTemplate(
            TextTemplateInfo textTemplateInfo,
            bool outputTextTemplateContentToTraceFile)
        {
            string output = this.project.AddTextTemplate(
                textTemplateInfo.ProjectFolder,
                textTemplateInfo.FileName,
                textTemplateInfo.TextOutput,
                outputTextTemplateContentToTraceFile);

            if (textTemplateInfo.ChildItems != null)
            {
                foreach (TextTemplateInfo childItem in textTemplateInfo.ChildItems)
                {
                    this.project.AddTextTemplate(
                        childItem.ProjectFolder,
                        childItem.FileName,
                        childItem.TextOutput,
                        outputTextTemplateContentToTraceFile);
                }
            }

            return output;
        }