Ejemplo n.º 1
0
        async private Task connectToUrlAsyncInternal(string url, UrlParser.ParsedMergeRequestUrl parsedUrl)
        {
            labelWorkflowStatus.Text = String.Format("Connecting to {0}...", url);
            MergeRequestKey mrk = parseUrlIntoMergeRequestKey(parsedUrl);

            GitLabInstance gitLabInstance = new GitLabInstance(mrk.ProjectKey.HostName, Program.Settings);
            MergeRequest   mergeRequest   = await Shortcuts
                                            .GetMergeRequestAccessor(gitLabInstance, _modificationNotifier, mrk.ProjectKey)
                                            .SearchMergeRequestAsync(mrk.IId, false);

            if (mergeRequest == null)
            {
                throw new UrlConnectionException("Merge request does not exist. ", null);
            }
            labelWorkflowStatus.Text = String.Empty;

            bool canOpenAtLiveTab = mergeRequest.State == "opened" && checkIfCanOpenAtLiveTab(mrk, true);
            bool needReload       = (canOpenAtLiveTab && getDataCache(canOpenAtLiveTab).MergeRequestCache == null) ||
                                    mrk.ProjectKey.HostName != getHostName();

            if (needReload)
            {
                Trace.TraceInformation("[MainForm.ExternalCalls] Restart workflow for url {0}", url);
                await restartWorkflowByUrlAsync(mrk.ProjectKey.HostName);
            }

            if (!canOpenAtLiveTab || !await openUrlAtLiveTabAsync(mrk, url, !needReload))
            {
                await openUrlAtSearchTabAsync(mrk);
            }
        }
Ejemplo n.º 2
0
 internal static IMergeRequestEditor GetMergeRequestEditor(GitLabInstance gitLabInstance,
                                                           IModificationListener modificationListener, MergeRequestKey mrk)
 {
     return(GetMergeRequestAccessor(gitLabInstance, modificationListener, mrk.ProjectKey)
            .GetSingleMergeRequestAccessor(mrk.IId)
            .GetMergeRequestEditor());
 }
Ejemplo n.º 3
0
        async private Task createNewMergeRequestAsync(SubmitNewMergeRequestParameters parameters, string firstNote)
        {
            buttonCreateNew.Enabled  = false;
            labelWorkflowStatus.Text = "Creating a merge request at GitLab...";

            GitLabInstance  gitLabInstance = new GitLabInstance(parameters.ProjectKey.HostName, Program.Settings);
            MergeRequestKey?mrkOpt         = await MergeRequestEditHelper.SubmitNewMergeRequestAsync(gitLabInstance,
                                                                                                     _modificationNotifier, parameters, firstNote, getCurrentUser());

            if (mrkOpt == null)
            {
                // all error handling is done at the callee side
                string message = "Merge Request has not been created";
                labelWorkflowStatus.Text = message;
                buttonCreateNew.Enabled  = true;
                Trace.TraceInformation("[MainForm] {0}", message);
                return;
            }

            requestUpdates(null, new int[] { Constants.NewOrClosedMergeRequestRefreshListTimerInterval });

            labelWorkflowStatus.Text = String.Format("Merge Request !{0} has been created in project {1}",
                                                     mrkOpt.Value.IId, parameters.ProjectKey.ProjectName);
            buttonCreateNew.Enabled = true;

            _newMergeRequestDialogStatesByHosts[getHostName()] = new NewMergeRequestProperties(
                parameters.ProjectKey.ProjectName, null, null, parameters.AssigneeUserName, parameters.Squash,
                parameters.DeleteSourceBranch);

            Trace.TraceInformation(
                "[MainForm] Created a new merge request. " +
                "Project: {0}, SourceBranch: {1}, TargetBranch: {2}, Assignee: {3}, firstNote: {4}",
                parameters.ProjectKey.ProjectName, parameters.SourceBranch, parameters.TargetBranch,
                parameters.AssigneeUserName, firstNote);
        }
Ejemplo n.º 4
0
 internal static SingleDiscussionAccessor GetSingleDiscussionAccessor(GitLabInstance gitLabInstance,
                                                                      IModificationListener modificationListener, MergeRequestKey mrk, string discussionId)
 {
     return(GetMergeRequestAccessor(gitLabInstance, modificationListener, mrk.ProjectKey)
            .GetSingleMergeRequestAccessor(mrk.IId)
            .GetDiscussionAccessor()
            .GetSingleDiscussionAccessor(discussionId));
 }
Ejemplo n.º 5
0
 internal static IDiscussionCreator GetDiscussionCreator(GitLabInstance gitLabInstance,
                                                         IModificationListener modificationListener, MergeRequestKey mrk, User user)
 {
     return(GetMergeRequestAccessor(gitLabInstance, modificationListener, mrk.ProjectKey)
            .GetSingleMergeRequestAccessor(mrk.IId)
            .GetDiscussionAccessor()
            .GetDiscussionCreator(user));
 }
Ejemplo n.º 6
0
 internal static MergeRequestAccessor GetMergeRequestAccessor(GitLabInstance gitLabInstance,
                                                              IModificationListener modificationListener, ProjectKey projectKey)
 {
     return(new RawDataAccessor(gitLabInstance)
            .GetProjectAccessor(modificationListener)
            .GetSingleProjectAccessor(projectKey.ProjectName)
            .MergeRequestAccessor);
 }
Ejemplo n.º 7
0
 private void initializeGitLabInstance(string hostname)
 {
     Trace.TraceInformation("[MainForm] Initializing GitLabInstance for {0}", hostname);
     disposeGitLabInstance();
     _gitLabInstance = new GitLabInstance(hostname, Program.Settings, this);
     _gitLabInstance.ConnectionLost     += onConnectionLost;
     _gitLabInstance.ConnectionRestored += onConnectionRestored;
     _shortcuts = new Shortcuts(_gitLabInstance);
     applyConnectionStatus("Not connected", System.Drawing.Color.Black, null);
 }
Ejemplo n.º 8
0
        async private static Task <User> getUserAsync(GitLabInstance gitLabInstance, string username)
        {
            if (String.IsNullOrEmpty(username))
            {
                return(null);
            }

            GitLabClient.UserAccessor userAccessor = Shortcuts.GetUserAccessor(gitLabInstance);
            return(await userAccessor.SearchUserByUsernameAsync(username)
                   ?? await userAccessor.SearchUserByNameAsync(username)); // fallback
        }
Ejemplo n.º 9
0
        async internal static Task <MergeRequestKey?> SubmitNewMergeRequestAsync(GitLabInstance gitLabInstance,
                                                                                 IModificationListener modificationListener, SubmitNewMergeRequestParameters parameters,
                                                                                 string firstNote, User currentUser)
        {
            if (String.IsNullOrEmpty(parameters.ProjectKey.ProjectName) ||
                String.IsNullOrEmpty(parameters.SourceBranch) ||
                String.IsNullOrEmpty(parameters.TargetBranch) ||
                String.IsNullOrEmpty(parameters.Title) ||
                parameters.AssigneeUserName == null ||
                firstNote == null ||
                currentUser == null)
            {
                // this is unexpected due to UI restrictions, so don't implement detailed logging here
                MessageBox.Show("Invalid parameters for a new merge request", "Error",
                                MessageBoxButtons.OK, MessageBoxIcon.Error);
                Trace.TraceError("[MergeRequestEditHelper] Invalid parameters for a new merge request");
                return(null);
            }

            User assignee = await getUserAsync(gitLabInstance, parameters.AssigneeUserName);

            checkFoundAssignee(parameters.ProjectKey.HostName, parameters.AssigneeUserName, assignee);

            int assigneeId = assignee?.Id ?? 0; // 0 means to not assign MR to anyone
            CreateNewMergeRequestParameters creatorParameters = new CreateNewMergeRequestParameters(
                parameters.SourceBranch, parameters.TargetBranch, parameters.Title, assigneeId,
                parameters.Description, parameters.DeleteSourceBranch, parameters.Squash);

            MergeRequest mergeRequest = null;

            try
            {
                mergeRequest = await Shortcuts
                               .GetMergeRequestCreator(gitLabInstance, modificationListener, parameters.ProjectKey)
                               .CreateMergeRequest(creatorParameters);
            }
            catch (MergeRequestCreatorException ex)
            {
                reportErrorToUser(ex);
                return(null);
            }

            MergeRequestKey mrk = new MergeRequestKey(parameters.ProjectKey, mergeRequest.IId);

            await addComment(gitLabInstance, modificationListener, mrk, currentUser, firstNote);

            return(mrk);
        }
Ejemplo n.º 10
0
        async private Task onNewDiscussionAsync(MergeRequestKey mrk, string title)
        {
            string caption = String.Format("Create a new thread in merge request \"{0}\"", title);
            DiscussionNoteEditPanel actions = new DiscussionNoteEditPanel();

            using (TextEditForm form = new TextEditForm(caption, "", true, true, actions))
            {
                actions.SetTextbox(form.TextBox);
                if (form.ShowDialog() == DialogResult.OK)
                {
                    if (form.Body.Length == 0)
                    {
                        MessageBox.Show("Discussion body cannot be empty", "Warning",
                                        MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                        return;
                    }

                    DataCache dataCache = getDataCache(!isSearchMode());
                    if (dataCache == null)
                    {
                        Debug.Assert(false);
                        return;
                    }

                    labelWorkflowStatus.Text = "Creating a discussion...";
                    try
                    {
                        GitLabInstance     gitLabInstance = new GitLabInstance(mrk.ProjectKey.HostName, Program.Settings);
                        IDiscussionCreator creator        = Shortcuts.GetDiscussionCreator(
                            gitLabInstance, _modificationNotifier, mrk, getCurrentUser());
                        await creator.CreateDiscussionAsync(new NewDiscussionParameters(form.Body, null), false);
                    }
                    catch (DiscussionCreatorException)
                    {
                        MessageBox.Show("Cannot create a discussion at GitLab. Check your connection and try again",
                                        "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        labelWorkflowStatus.Text = "Cannot create a discussion";
                        return;
                    }
                    labelWorkflowStatus.Text = "Thread started";

                    dataCache.DiscussionCache?.RequestUpdate(mrk, Constants.DiscussionCheckOnNewThreadInterval, null);
                }
            }
        }
Ejemplo n.º 11
0
        async private Task submitDiscussionAsync(MatchInfo matchInfo, Snapshot snapshot, DiffPosition position,
                                                 string body, bool includeContext)
        {
            if (body.Length == 0)
            {
                MessageBox.Show("Discussion text cannot be empty", "Warning",
                                MessageBoxButtons.OK, MessageBoxIcon.Exclamation,
                                MessageBoxDefaultButton.Button1, MessageBoxOptions.ServiceNotification);
                return;
            }

            NewDiscussionParameters parameters = new NewDiscussionParameters(
                body, includeContext ? createPositionParameters(position) : new PositionParameters?());

            MergeRequestKey    mrk            = getMergeRequestKey(snapshot);
            GitLabInstance     gitLabInstance = new GitLabInstance(snapshot.Host, Program.Settings);
            IDiscussionCreator creator        = Shortcuts.GetDiscussionCreator(
                gitLabInstance, _modificationListener, mrk, _currentUser);

            try
            {
                await creator.CreateDiscussionAsync(parameters, true);
            }
            catch (DiscussionCreatorException ex)
            {
                Trace.TraceInformation(
                    "Additional information about exception:\n" +
                    "Position: {0}\n" +
                    "Include context: {1}\n" +
                    "Snapshot refs: {2}\n" +
                    "MatchInfo: {3}\n" +
                    "Body:\n{4}",
                    position.ToString(),
                    includeContext.ToString(),
                    snapshot.Refs.ToString(),
                    matchInfo.ToString(),
                    body);

                if (!ex.Handled)
                {
                    throw;
                }
            }
        }
Ejemplo n.º 12
0
        async internal static Task <bool> CloseMergeRequest(GitLabInstance gitLabInstance,
                                                            IModificationListener modificationListener, MergeRequestKey mrk)
        {
            UpdateMergeRequestParameters updateMergeRequestParameters = new UpdateMergeRequestParameters(
                null, null, null, null, "close", null, null);

            try
            {
                MergeRequest mergeRequest = await Shortcuts
                                            .GetMergeRequestEditor(gitLabInstance, modificationListener, mrk)
                                            .ModifyMergeRequest(updateMergeRequestParameters);
            }
            catch (MergeRequestEditorException ex)
            {
                reportErrorToUser(ex);
                return(false);
            }
            return(true);
        }
Ejemplo n.º 13
0
        async private Task closeMergeRequestAsync(string hostname, FullMergeRequestKey item)
        {
            MergeRequestKey mrk     = new MergeRequestKey(item.ProjectKey, item.MergeRequest.IId);
            string          message =
                "Do you really want to close (cancel) merge request? It will not be merged to the target branch.";

            if (MessageBox.Show(message, "Confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                GitLabInstance gitLabInstance = new GitLabInstance(hostname, Program.Settings);
                await MergeRequestEditHelper.CloseMergeRequest(gitLabInstance, _modificationNotifier, mrk);

                string statusMessage = String.Format("Merge Request !{0} has been closed", mrk.IId);
                labelWorkflowStatus.Text = statusMessage;
                Trace.TraceInformation("[MainForm] {0}", statusMessage);

                requestUpdates(null, new int[] { Constants.NewOrClosedMergeRequestRefreshListTimerInterval });
            }
            else
            {
                Trace.TraceInformation("[MainForm] User declined to close a merge request");
            }
        }
Ejemplo n.º 14
0
        async private Task applyChangesToMergeRequestAsync(string hostname, User currentUser, FullMergeRequestKey item)
        {
            MergeRequestKey mrk      = new MergeRequestKey(item.ProjectKey, item.MergeRequest.IId);
            string          noteText = await MergeRequestEditHelper.GetLatestSpecialNote(_liveDataCache.DiscussionCache, mrk);

            MergeRequestPropertiesForm form = new EditMergeRequestPropertiesForm(hostname,
                                                                                 getProjectAccessor(), currentUser, item.ProjectKey, item.MergeRequest, noteText);

            if (form.ShowDialog() != DialogResult.OK)
            {
                Trace.TraceInformation("[MainForm] User declined to modify a merge request");
                return;
            }

            ApplyMergeRequestChangesParameters parameters =
                new ApplyMergeRequestChangesParameters(form.Title, form.AssigneeUsername,
                                                       form.Description, form.TargetBranch, form.DeleteSourceBranch, form.Squash);

            GitLabInstance gitLabInstance = new GitLabInstance(hostname, Program.Settings);
            bool           modified       = await MergeRequestEditHelper.ApplyChangesToMergeRequest(gitLabInstance, _modificationNotifier,
                                                                                                    item.ProjectKey, item.MergeRequest, parameters, noteText, form.SpecialNote, currentUser);

            string statusMessage = modified
            ? String.Format("Merge Request !{0} has been modified", mrk.IId)
            : String.Format("No changes have been made to Merge Request !{0}", mrk.IId);

            labelWorkflowStatus.Text = statusMessage;
            Trace.TraceInformation("[MainForm] {0}", statusMessage);

            if (modified)
            {
                requestUpdates(mrk,
                               new int[] {
                    100,
                    Program.Settings.OneShotUpdateFirstChanceDelayMs,
                    Program.Settings.OneShotUpdateSecondChanceDelayMs
                });
            }
        }
Ejemplo n.º 15
0
        async private Task showDiscussionsFormAsync(MergeRequestKey mrk, string title, User author)
        {
            Debug.Assert(getHostName() != String.Empty);
            Debug.Assert(getCurrentUser() != null);

            // Store data before async/await
            User           currentUser    = getCurrentUser();
            DataCache      dataCache      = getDataCache(!isSearchMode());
            GitLabInstance gitLabInstance = new GitLabInstance(getHostName(), Program.Settings);

            if (dataCache == null)
            {
                Debug.Assert(false);
                return;
            }

            if (isSearchMode())
            {
                // Pre-load discussions for MR in Search mode
                dataCache.DiscussionCache.RequestUpdate(mrk, Constants.ReloadListPseudoTimerInterval, null);
            }

            IEnumerable <Discussion> discussions = await loadDiscussionsAsync(dataCache, mrk);

            if (discussions == null || _exiting)
            {
                return;
            }

            ILocalCommitStorage storage = getCommitStorage(mrk.ProjectKey, true);

            if (!await prepareStorageForDiscussionsForm(mrk, storage, discussions) || _exiting)
            {
                return;
            }
            showDiscussionForm(gitLabInstance, dataCache, storage, currentUser, mrk, discussions, title, author);
        }
Ejemplo n.º 16
0
        async private static Task <bool> addComment(GitLabInstance gitLabInstance,
                                                    IModificationListener modificationListener, MergeRequestKey mrk, User currentUser, string commentBody)
        {
            if (String.IsNullOrEmpty(commentBody))
            {
                return(false);
            }

            try
            {
                IDiscussionCreator creator = Shortcuts.GetDiscussionCreator(
                    gitLabInstance, modificationListener, mrk, currentUser);
                await creator.CreateNoteAsync(new CreateNewNoteParameters(commentBody));

                return(true);
            }
            catch (DiscussionCreatorException ex)
            {
                MessageBox.Show("Failed to create a note in the new merge request", "Error",
                                MessageBoxButtons.OK, MessageBoxIcon.Error);
                ExceptionHandlers.Handle("Failed to create a note", ex);
            }
            return(false);
        }
Ejemplo n.º 17
0
        async private Task onAddCommentAsync(MergeRequestKey mrk, string title)
        {
            string caption = String.Format("Add comment to merge request \"{0}\"", title);
            DiscussionNoteEditPanel actions = new DiscussionNoteEditPanel();

            using (TextEditForm form = new TextEditForm(caption, "", true, true, actions))
            {
                actions.SetTextbox(form.TextBox);
                if (form.ShowDialog() == DialogResult.OK)
                {
                    if (form.Body.Length == 0)
                    {
                        MessageBox.Show("Comment body cannot be empty", "Warning",
                                        MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                        return;
                    }

                    labelWorkflowStatus.Text = "Adding a comment...";
                    try
                    {
                        GitLabInstance     gitLabInstance = new GitLabInstance(mrk.ProjectKey.HostName, Program.Settings);
                        IDiscussionCreator creator        = Shortcuts.GetDiscussionCreator(
                            gitLabInstance, _modificationNotifier, mrk, getCurrentUser());
                        await creator.CreateNoteAsync(new CreateNewNoteParameters(form.Body));
                    }
                    catch (DiscussionCreatorException)
                    {
                        MessageBox.Show("Cannot create a discussion at GitLab. Check your connection and try again",
                                        "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        labelWorkflowStatus.Text = "Cannot create a discussion";
                        return;
                    }
                    labelWorkflowStatus.Text = "Comment added";
                }
            }
        }
Ejemplo n.º 18
0
 internal static IMergeRequestCreator GetMergeRequestCreator(GitLabInstance gitLabInstance,
                                                             IModificationListener modificationListener, ProjectKey projectKey)
 {
     return(GetMergeRequestAccessor(gitLabInstance, modificationListener, projectKey)
            .GetMergeRequestCreator());
 }
Ejemplo n.º 19
0
 internal static ProjectAccessor GetProjectAccessor(GitLabInstance gitLabInstance,
                                                    IModificationListener modificationListener)
 {
     return(new RawDataAccessor(gitLabInstance)
            .GetProjectAccessor(modificationListener));
 }
Ejemplo n.º 20
0
        async internal static Task <bool> ApplyChangesToMergeRequest(GitLabInstance gitLabInstance,
                                                                     IModificationListener modificationListener,
                                                                     ProjectKey projectKey, MergeRequest originalMergeRequest, ApplyMergeRequestChangesParameters parameters,
                                                                     string oldSpecialNote, string newSpecialNote, User currentUser)
        {
            if (String.IsNullOrEmpty(parameters.Title) ||
                String.IsNullOrEmpty(parameters.TargetBranch) ||
                parameters.AssigneeUserName == null ||
                newSpecialNote == null ||
                currentUser == null)
            {
                // this is unexpected due to UI restrictions, so don't implement detailed logging here
                MessageBox.Show("Invalid parameters for a merge request", "Error",
                                MessageBoxButtons.OK, MessageBoxIcon.Error);
                Trace.TraceError("[MergeRequestEditHelper] Invalid parameters for a merge request");
                return(false);
            }

            string oldAssigneeUsername = originalMergeRequest.Assignee?.Username ?? String.Empty;
            User   assignee            = oldAssigneeUsername == parameters.AssigneeUserName
            ? originalMergeRequest.Assignee
            : await getUserAsync(gitLabInstance, parameters.AssigneeUserName);

            checkFoundAssignee(projectKey.HostName, parameters.AssigneeUserName, assignee);

            bool            result = false;
            MergeRequestKey mrk    = new MergeRequestKey(projectKey, originalMergeRequest.IId);

            if (oldSpecialNote != newSpecialNote)
            {
                result = await addComment(gitLabInstance, modificationListener, mrk, currentUser, newSpecialNote);
            }

            bool changed =
                oldAssigneeUsername != parameters.AssigneeUserName ||
                originalMergeRequest.Force_Remove_Source_Branch != parameters.DeleteSourceBranch ||
                originalMergeRequest.Squash != parameters.Squash ||
                originalMergeRequest.Target_Branch != parameters.TargetBranch ||
                originalMergeRequest.Title != parameters.Title ||
                originalMergeRequest.Description != parameters.Description;

            if (!changed)
            {
                return(result);
            }

            int assigneeId = assignee?.Id ?? 0; // 0 means to unassign
            UpdateMergeRequestParameters updateMergeRequestParameters = new UpdateMergeRequestParameters(
                parameters.TargetBranch, parameters.Title, assigneeId, parameters.Description,
                null, parameters.DeleteSourceBranch, parameters.Squash);

            try
            {
                MergeRequest mergeRequest = await Shortcuts
                                            .GetMergeRequestEditor(gitLabInstance, modificationListener, mrk)
                                            .ModifyMergeRequest(updateMergeRequestParameters);
            }
            catch (MergeRequestEditorException ex)
            {
                reportErrorToUser(ex);
                return(result);
            }
            return(true);
        }
Ejemplo n.º 21
0
        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";
        }
Ejemplo n.º 22
0
 internal Shortcuts(GitLabInstance gitLabIntance)
 {
     _gitLabInstance = gitLabIntance;
 }
Ejemplo n.º 23
0
        /// <summary>
        /// Throws:
        /// ArgumentException
        /// </summary>
        internal DiscussionsForm(
            DataCache dataCache, GitLabInstance gitLabInstance, IModificationListener modificationListener,
            IGitCommandService git, User currentUser, MergeRequestKey mrk, IEnumerable <Discussion> discussions,
            string mergeRequestTitle, User mergeRequestAuthor,
            int diffContextDepth, ColorScheme colorScheme,
            Func <MergeRequestKey, IEnumerable <Discussion>, Task> updateGit, Action onDiscussionModified)
        {
            _mergeRequestKey    = mrk;
            _mergeRequestTitle  = mergeRequestTitle;
            _mergeRequestAuthor = mergeRequestAuthor;

            _git = git;
            _diffContextDepth = diffContextDepth;

            _colorScheme = colorScheme;

            _dataCache            = dataCache;
            _gitLabInstance       = gitLabInstance;
            _modificationListener = modificationListener;
            _updateGit            = updateGit;
            _onDiscussionModified = onDiscussionModified;

            _currentUser = currentUser;
            if (_currentUser.Id == 0)
            {
                throw new ArgumentException("Bad user Id");
            }

            CommonControls.Tools.WinFormsHelpers.FixNonStandardDPIIssue(this,
                                                                        (float)Common.Constants.Constants.FontSizeChoices["Design"], 96);
            InitializeComponent();
            CommonControls.Tools.WinFormsHelpers.LogScaleDimensions(this);

            DisplayFilter = new DiscussionFilter(_currentUser, _mergeRequestAuthor,
                                                 DiscussionFilterState.Default);
            SystemFilter = new DiscussionFilter(_currentUser, _mergeRequestAuthor,
                                                DiscussionFilterState.AllExceptSystem);

            FilterPanel = new DiscussionFilterPanel(DisplayFilter.Filter,
                                                    () =>
            {
                DisplayFilter.Filter = FilterPanel.Filter;
                updateLayout(null, true, true);
                updateSearch();
            });

            ActionsPanel = new DiscussionActionsPanel(() => BeginInvoke(new Action(async() => await onRefresh())));

            SearchPanel = new DiscussionSearchPanel(
                (query, forward) =>
            {
                if (query.Text == String.Empty)
                {
                    resetSearch();
                }
                else if (TextSearch == null || !query.Equals(TextSearch.Query))
                {
                    startSearch(query, true);
                }
                else
                {
                    MostRecentFocusedDiscussionControl?.Focus();
                    continueSearch(forward);
                }
            });

            DiscussionSortState sortState = DiscussionSortState.Default;

            DisplaySort = new DiscussionSort(sortState);
            SortPanel   = new DiscussionSortPanel(DisplaySort.SortState,
                                                  () =>
            {
                DisplaySort.SortState = SortPanel.SortState;
                updateLayout(null, true, true);
                updateSearch();
            });

            FontSelectionPanel = new DiscussionFontSelectionPanel(font => applyFont(font));

            Controls.Add(FilterPanel);
            Controls.Add(ActionsPanel);
            Controls.Add(SearchPanel);
            Controls.Add(SortPanel);
            Controls.Add(FontSelectionPanel);

            applyFont(Program.Settings.MainWindowFontSizeName);
            applyTheme(Program.Settings.VisualThemeName);

            if (!renderDiscussions(discussions, false))
            {
                throw new NoDiscussionsToShow();
            }
        }
Ejemplo n.º 24
0
 internal static UserAccessor GetUserAccessor(GitLabInstance gitLabInstance)
 {
     return(new RawDataAccessor(gitLabInstance)
            .UserAccessor);
 }