private void showDiscussionForm(GitLabInstance gitLabInstance, DataCache dataCache, ILocalCommitStorage storage, User currentUser, MergeRequestKey mrk, IEnumerable <Discussion> discussions, string title, User author) { if (currentUser == null || discussions == null || author == null) { return; } bool doesMatchTag(object tag) => tag != null && ((MergeRequestKey)(tag)).Equals(mrk); Form formExisting = findFormByTag("DiscussionsForm", doesMatchTag); if (formExisting != null) { formExisting.Activate(); return; } labelWorkflowStatus.Text = "Rendering discussion contexts..."; labelWorkflowStatus.Refresh(); DiscussionsForm form; try { IAsyncGitCommandService git = storage?.Git; DiscussionsForm discussionsForm = new DiscussionsForm(dataCache, gitLabInstance, _modificationNotifier, git, currentUser, mrk, discussions, title, author, int.Parse(comboBoxDCDepth.Text), _colorScheme, async(key, discussionsUpdated) => { if (storage != null && storage.Updater != null) { try { await storage.Updater.StartUpdate(new DiscussionBasedContextProvider(discussionsUpdated), status => onStorageUpdateProgressChange(status, mrk), () => onStorageUpdateStateChange()); } catch (LocalCommitStorageUpdaterException ex) { ExceptionHandlers.Handle("Cannot update a storage on refreshing discussions", ex); } } else { Trace.TraceInformation("[MainForm] User tried to refresh Discussions without a storage"); MessageBox.Show("Cannot update a storage, some context code snippets may be missing. ", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning); } }, () => dataCache?.DiscussionCache?.RequestUpdate(mrk, Constants.DiscussionCheckOnNewThreadInterval, null)) { Tag = mrk }; form = discussionsForm; } catch (NoDiscussionsToShow) { MessageBox.Show("No discussions to show.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information); labelWorkflowStatus.Text = "No discussions to show"; return; } catch (ArgumentException ex) { string errorMessage = "Cannot show Discussions form"; ExceptionHandlers.Handle(errorMessage, ex); MessageBox.Show(errorMessage, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); labelWorkflowStatus.Text = "Cannot show Discussions"; return; } labelWorkflowStatus.Text = "Opening Discussions view..."; labelWorkflowStatus.Refresh(); Trace.TraceInformation(String.Format("[MainForm] Opened Discussions for MR IId {0} (at {1})", mrk.IId, (storage?.Path ?? "null"))); form.Show(); labelWorkflowStatus.Text = "Discussions opened"; }
private void showDiscussionForm(DataCache dataCache, ILocalCommitStorage storage, User currentUser, MergeRequestKey mrk, IEnumerable <Discussion> discussions, string title, User author, string webUrl, string customActionFileName) { if (currentUser == null || discussions == null || author == null || currentUser.Id == 0) { return; } bool doesMatchTag(object tag) => tag != null && ((MergeRequestKey)(tag)).Equals(mrk); Form formExisting = WinFormsHelpers.FindFormByTag("DiscussionsForm", doesMatchTag); if (formExisting is DiscussionsForm existingDiscussionsForm) { existingDiscussionsForm.Restore(); Trace.TraceInformation(String.Format("[MainForm] Activated an existing Discussions view for MR {0}", mrk.IId)); return; } addOperationRecord("Rendering discussion contexts has started"); labelOperationStatus.Refresh(); DiscussionsForm form; try { IAsyncGitCommandService git = storage?.Git; AsyncDiscussionLoader discussionLoader = new AsyncDiscussionLoader(mrk, dataCache, async(key, discussionsUpdated) => { if (storage != null && storage.Updater != null) { try { await storage.Updater.StartUpdate(new DiscussionBasedContextProvider(discussionsUpdated), status => onStorageUpdateProgressChange(status, mrk), () => onStorageUpdateStateChange()); } catch (LocalCommitStorageUpdaterException ex) { ExceptionHandlers.Handle("Cannot update a storage on refreshing discussions", ex); } } else { Trace.TraceInformation("[MainForm] User tried to refresh Discussions without a storage"); MessageBox.Show("Cannot update a storage, some context code snippets may be missing. ", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning); } }, this); AsyncDiscussionHelper discussionHelper = new AsyncDiscussionHelper(mrk, title, currentUser, _shortcuts); IEnumerable <ICommand> getCommands(ICommandCallback callback) => loadCustomCommands(customActionFileName, callback); DiscussionsForm discussionsForm = new DiscussionsForm( git, currentUser, mrk, discussions, title, author, _colorScheme, discussionLoader, discussionHelper, webUrl, _shortcuts, getCommands) { Tag = mrk }; form = discussionsForm; } catch (NoDiscussionsToShow) { MessageBox.Show("No discussions to show.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information); Trace.TraceInformation(String.Format("[MainForm] No discussions to show for MR IID {0}", mrk.IId)); addOperationRecord("No discussions to show"); return; } addOperationRecord("Opening Discussions view has started"); labelOperationStatus.Refresh(); form.Show(); Trace.TraceInformation(String.Format("[MainForm] Opened Discussions for MR IId {0} (at {1})", mrk.IId, (storage?.Path ?? "null"))); addOperationRecord("Discussions view has opened"); ensureMergeRequestInRecentDataCache(mrk); }