private void GenerateControl(ControlWindowViewModel controlWindowViewModel, ProjectItem projectItem)
        {
            // generate namespace for code behind
            var rootNamespace = projectItem.ContainingProject.Properties.Item("DefaultNamespace").Value as string;

            controlWindowViewModel.CodeBehindClassNamespace     = WizardHelpers.GenerateViewModelNamespace(rootNamespace, controlWindowViewModel.CodeBehindClassLocation);
            controlWindowViewModel.CodeBehindClassRootNamespace = rootNamespace;

            // run template
            var template = new ControlTemplate()
            {
                ViewModel = controlWindowViewModel
            };

            File.WriteAllText(DTEHelper.GetProjectItemFullPath(projectItem), template.TransformText(), Encoding.UTF8);
        }
        private void GenerateCodeBehindClass(ControlWindowViewModel controlWindowViewModel, Project project)
        {
            // find path
            var folder = DTEHelper.GetOrCreateFolder(project.ProjectItems, controlWindowViewModel.CodeBehindClassLocation);
            var codeBehindClassTemplatePath = Path.Combine(templateDir, "DotvvmControlCodeBehind.zip\\DotvvmControlCodeBehind.vstemplate");

            // create a code behind
            folder.AddFromTemplate(codeBehindClassTemplatePath, controlWindowViewModel.CodeBehindClassName);
            var projectItem = folder.OfType <ProjectItem>().FirstOrDefault(p => p.Name == controlWindowViewModel.CodeBehindClassName + ".cs");

            if (projectItem != null)
            {
                // regenerate the codebehind
                var template = new ControlCodeBehindTemplate()
                {
                    ViewModel = controlWindowViewModel
                };
                File.WriteAllText(DTEHelper.GetProjectItemFullPath(projectItem), template.TransformText(), Encoding.UTF8);
            }
        }
        public void ProjectItemFinishedGenerating(EnvDTE.ProjectItem projectItem)
        {
            var controlLocation = Path.GetDirectoryName(DTEHelper.GetProjectItemRelativePath(projectItem));
            var allProjectItems = DTEHelper.GetAllProjectItems().Select(DTEHelper.GetProjectItemRelativePath).ToList();

            viewModel = new ControlWindowViewModel()
            {
                ControlName             = projectItem.Name,
                ControlLocation         = controlLocation,
                CreateCodeBehind        = false,
                CodeBehindClassName     = WizardHelpers.GenerateCodeBehindClassName(Path.GetFileNameWithoutExtension(projectItem.Name)),
                CodeBehindClassLocation = controlLocation,
                Folders = allProjectItems
                          .Select(p => p.Substring(0, p.LastIndexOfAny(new[] { '/', '\\' }) + 1).TrimEnd('/', '\\'))
                          .Distinct()
                          .OrderBy(p => p)
                          .ToList()
            };

            var window = new ControlWindow()
            {
                DataContext = viewModel
            };

            if (window.ShowDialog() != true)
            {
                throw new WizardCancelledException();
            }

            // generate items
            DTEHelper.ExecuteSafe(() => GenerateControl(viewModel, projectItem), "Couldn't create the control!");
            if (viewModel.CreateCodeBehind)
            {
                DTEHelper.ExecuteSafe(() => GenerateCodeBehindClass(viewModel, projectItem.ContainingProject), "Couldn't create the code behind file!");
            }
        }