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)); }
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); }
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)); } } }