private void SynchronizePageObjects(SynchronizePageObjectsModel model)
        {
            ThreadHelper.ThrowIfNotOnUIThread();

            if (model == null)
            {
                throw new ArgumentNullException(nameof(model));
            }

            var waitDialog = threadedWaitDialogFactory.CreateInstance();

            var task = new SyncPageObjectsTask(
                parent: this,
                model: model,
                progressReporter: (a, b, c, d, e) =>
            {
                ThreadHelper.ThrowIfNotOnUIThread();
                waitDialog.UpdateProgress(a, b, c, d, e, false, out bool pfCanceled);
            });

            // Join main thread.
            ThreadHelper.JoinableTaskFactory.RunAsyncAsVsTask(
                VsTaskRunContext.UIThreadNormalPriority,
                task.DoWorkAsync);
        }
        /// <summary>
        /// This function is the callback used to execute the command when the
        /// menu item is clicked. See the constructor to see how the menu item
        /// is associated with this function using OleMenuCommandService
        /// service and MenuCommand class.
        /// </summary>
        /// <param name="sender">Event sender.</param>
        /// <param name="e">Event args.</param>
        private void Execute(object sender, EventArgs e)
        {
            ThreadHelper.ThrowIfNotOnUIThread();

            if (!(monitorSelectionService.GetSelectedItem() is Project project))
            {
                return;
            }

            // TODO: Retrieve these dynamically.
            var availableComponentTypeNames = new List <string>
            {
                "PageObject",
                "PageComponent"
            };

            var model = new SynchronizePageObjectsModel(project,
                                                        availableComponentTypeNames,
                                                        dte,
                                                        solutionService);

            dialog = new SynchronizePageObjectsDialog
            {
                DataContext = model,
                GeneratePageObjectsService = generatePageObjectsService
            };

            dialog.ShowModal();
        }
            public SyncPageObjectsTask(GeneratePageObjectsCommand parent,
                                       SynchronizePageObjectsModel model,
                                       ProgressReporterDelegate progressReporter)
            {
                this.model = model
                             ?? throw new ArgumentNullException(nameof(model));

                this.parent = parent
                              ?? throw new ArgumentNullException(nameof(parent));

                Progress = progressReporter
                           ?? throw new ArgumentNullException(nameof(progressReporter));
            }
Example #4
0
        private int GenerateOrLocateProject(SynchronizePageObjectsModel model)
        {
            ThreadHelper.ThrowIfNotOnUIThread();

            //var projectType = new Guid("9A19103F-16F7-4668-BE54-9A1E7A4F7556");
            var projectType         = new Guid("FAE04EC0-301F-11D3-BF4B-00C04F79EFBC");
            var idProject           = Guid.NewGuid();
            var projectTemplatePath = dte.Solution.ProjectItemsTemplatePath("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}");

            solutionService.CanCreateNewProjectAtLocation(
                fCreateNewSolution: Convert.ToInt32(false),
                pszFullProjectFilePath: model.SelectedProject.FullPath,
                pfCanCreate: out int canCreate);

            if (!Convert.ToBoolean(canCreate))
            {
                // Cannot create the project.
                return(VSConstants.E_FAIL);
            }

            // Create project.
            var projectCreateResult = solutionService.CreateProject(
                rguidProjectType: ref projectType,
                lpszMoniker: projectTemplatePath,
                lpszLocation: model.SelectedProject.PathToProjectFolder,
                lpszName: model.SelectedProject.Name,
                grfCreateFlags: (uint)__VSCREATEPROJFLAGS.CPF_CLONEFILE,
                iidProject: ref idProject,
                ppProject: out IntPtr projectPtr);

            if (ErrorHandler.Failed(projectCreateResult))
            {
                // Failed to create the project.
                return(VSConstants.E_FAIL);
            }

            return(VSConstants.S_OK);
        }
Example #5
0
        public async Task GeneratePageObjectsAsync(SynchronizePageObjectsModel model)
        {
            if (model == null)
            {
                throw new ArgumentNullException(nameof(model));
            }

            var cancellationToken = CancellationToken.None;
            await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken);

            // Generate project if new.
            if (model.SelectedProject.IsNew)
            {
                if (ErrorHandler.Failed(GenerateOrLocateProject(model)))
                {
                    if (ErrorHandler.Failed(shellService.GetErrorInfo(out var errorText)))
                    {
                        errorText = "Failed to create the new project.";
                    }

                    VsShellUtilities.ShowMessageBox(
                        ServiceProvider.GlobalProvider,
                        errorText,
                        String.Empty,
                        OLEMSGICON.OLEMSGICON_CRITICAL,
                        OLEMSGBUTTON.OLEMSGBUTTON_OK,
                        OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST);

                    return;
                }
            }

            // Retrieve the project.
            var project = solutionService
                          .GetProjects()
                          .FirstOrDefault(
                p => p.Name.Equals(
                    model.SelectedProject.Name,
                    StringComparison.OrdinalIgnoreCase));

            var vsProject = solutionService.GetProjectByFileName(project.FileName);

            if (project == null)
            {
                VsShellUtilities.ShowMessageBox(
                    ServiceProvider.GlobalProvider,
                    "Failed to locate the project.",
                    String.Empty,
                    OLEMSGICON.OLEMSGICON_CRITICAL,
                    OLEMSGBUTTON.OLEMSGBUTTON_OK,
                    OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST);

                return;
            }

            // Verify the project has the necessary files installed.
            var isCodeGenPackageInstalled = packageInstallerService
                                            .IsPackageInstalled(
                project,
                PACKAGE_APT_SELENIUM_CODE_GENERATION);

            if (!AreCodeGenerationPackagesInstalled(project))
            {
                try
                {
                    packageInstaller.InstallPackage(
                        source: null,
                        project: project,
                        packageId: PACKAGE_APT_SELENIUM_CODE_GENERATION,
                        version: default(string),
                        ignoreDependencies: false);
                }
                catch (Exception e)
                {
                    VsShellUtilities.ShowMessageBox(
                        ServiceProvider.GlobalProvider,
                        e.ToString(),
                        String.Empty,
                        OLEMSGICON.OLEMSGICON_CRITICAL,
                        OLEMSGBUTTON.OLEMSGBUTTON_OK,
                        OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST);

                    return;
                }
            }

            // Retrieve all CodeGenerators.
            var codeGenerators = GetAllCodeGenerators(project);

            if (!codeGenerators.Any())
            {
                VsShellUtilities.ShowMessageBox(
                    ServiceProvider.GlobalProvider,
                    "Failed to locate any code generators in the project.",
                    String.Empty,
                    OLEMSGICON.OLEMSGICON_CRITICAL,
                    OLEMSGBUTTON.OLEMSGBUTTON_OK,
                    OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST);

                return;
            }

            // Create and display a wait dialog.
            var dialog = threadedWaitDialogFactory.StartWaitDialog(
                waitCaption: "Starting",
                initialProgress: new ThreadedWaitDialogProgressData(
                    waitMessage: "Starting",
                    progressText: String.Empty,
                    statusBarText: String.Empty,
                    isCancelable: true,
                    currentStep: 0,
                    totalSteps: model.FileMap.Count),
                delayToShowDialog: TimeSpan.Zero);

            using (dialog)
            {
                // Iterate over all file maps in the model.
                for (var currentStep = 0; currentStep < model.FileMap.Count; currentStep++)
                {
                    // Exit loop if canceled.
                    if (dialog.UserCancellationToken.IsCancellationRequested)
                    {
                        break;
                    }

                    var fileMap = model.FileMap[currentStep];
                    //var projectItem = default(ProjectItem);

                    // Check if file exists.
                    if (fileMap.IsNewFile)
                    {
                        // Create file.
                        var fileInfo = new FileInfo(fileMap.NewPath);
                        Directory.CreateDirectory(fileInfo.Directory.FullName);
                        File.Create(fileMap.NewPath);

                        // Add file to the project.
                        if (project.Kind != "{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}" &&
                            vsProject != null)
                        {
                            var result = new VSADDRESULT[1];

                            vsProject.AddItem(
                                itemidLoc: (uint)VSConstants.VSITEMID.Root,
                                dwAddItemOperation: VSADDITEMOPERATION.VSADDITEMOP_LINKTOFILE,
                                pszItemName: fileMap.NewPath,
                                cFilesToOpen: 0,
                                rgpszFilesToOpen: new[] { fileMap.NewPath },
                                hwndDlgOwner: IntPtr.Zero,
                                pResult: result);

                            if (result[0].Equals(VSADDRESULT.ADDRESULT_Failure))
                            {
                                VsShellUtilities.ShowMessageBox(
                                    ServiceProvider.GlobalProvider,
                                    "Failed to add the item to the project.",
                                    String.Empty,
                                    OLEMSGICON.OLEMSGICON_CRITICAL,
                                    OLEMSGBUTTON.OLEMSGBUTTON_OK,
                                    OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST);

                                return;
                            }
                        }
                    }

                    // TODO: Generate code for file.

                    // Update wait dialog.
                    dialog.Progress.Report(new ThreadedWaitDialogProgressData(
                                               waitMessage: String.Empty,
                                               progressText: String.Empty,
                                               statusBarText: String.Empty,
                                               isCancelable: true,
                                               currentStep: currentStep,
                                               totalSteps: model.FileMap.Count));
                }
            }
        }