protected void ForeachWithWaitIndicatorAndErrorReport(IReadOnlyList <ProjectViewModel> projects, string verb, Func <ProjectViewModel, HResult> action, bool breakOnFirstError = true) { ThreadHelper.ThrowIfNotOnUIThread(); try { bool allowCancel = projects.Count > 1; using var indicator = WaitIndicator.StartWait("Project Explorer", "", allowCancel); for (int i = 0; i < projects.Count; i++) { var project = projects[i]; indicator.Message = $"{verb} project '{project.DisplayName}'."; indicator.CancellationToken.ThrowIfCancellationRequested(); if (i == projects.Count - 1) { indicator.AllowCancel = false; } if (ShellUtil.ReportUserOnFailed(action(project).Value) && breakOnFirstError) { break; } } } catch (OperationCanceledException) { } }
protected override void ExecuteOverride(IReadOnlyList <ProjectViewModel> projects) { ThreadHelper.ThrowIfNotOnUIThread(); if (ShellUtil.ReportUserOnFailed(ViewModel.EnsureSolution().Value)) { return; } ForeachWithWaitIndicatorAndErrorReport(projects, "Adding", p => p.Open()); }
protected override void ExecuteOverride(IReadOnlyList <ProjectViewModel> projects) { ThreadHelper.ThrowIfNotOnUIThread(); string itemsList = string.Join(", ", projects.Select(project => $"'{project.DisplayName}'")); if (!ShellUtil.ConfirmOkCancel($"{itemsList}{(projects.Count == 1 ? " " : "\r\n")}will be removed.")) { return; } ForeachWithWaitIndicatorAndErrorReport(projects, "Removing", p => p.Close()); }