Skip to content

Commit 6cfe14a

Browse files
committed
added collapsable split panel for displaying error states
1 parent 1caad28 commit 6cfe14a

File tree

9 files changed

+424
-9
lines changed

9 files changed

+424
-9
lines changed

RetailCoder.VBE/UI/SourceControl/BranchesPresenter.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,10 +74,6 @@ private void OnSelectedBranchChanged(object sender, EventArgs e)
7474
}
7575
catch (SourceControlException ex)
7676
{
77-
//todo: find a better way of displaying these errors
78-
//todo: remove messagebox
79-
MessageBox.Show(ex.InnerException.Message, ex.Message, MessageBoxButtons.OK, MessageBoxIcon.Error);
80-
8177
RaiseActionFailedEvent(ex);
8278
}
8379

@@ -129,6 +125,7 @@ private IEnumerable<IBranch> RemoteBranches()
129125
private void OnShowDeleteBranchView(object sender, EventArgs e)
130126
{
131127
if (_view.Local == null) { return; }
128+
132129
_deleteView.Branches = _view.Local;
133130
_deleteView.Show();
134131
}

RetailCoder.VBE/UI/SourceControl/ISourceControlView.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@ public interface ISourceControlView : IDockableUserControl
77
event EventHandler<EventArgs> RefreshData;
88
event EventHandler<EventArgs> OpenWorkingDirectory;
99
event EventHandler<EventArgs> InitializeNewRepository;
10+
event EventHandler<EventArgs> DismissMessage;
1011

1112
string Status { get; set; }
13+
string FailedActionMessage { get; set; }
14+
bool FailedActionMessageVisible { get; set; }
1215
}
1316
}

RetailCoder.VBE/UI/SourceControl/SourceControlPanel.Designer.cs

Lines changed: 67 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

RetailCoder.VBE/UI/SourceControl/SourceControlPanel.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,18 @@ public string Status
5757
set { this.StatusMessage.Text = value; }
5858
}
5959

60+
public string FailedActionMessage
61+
{
62+
get { return this.ActionFailedMessage.Text; }
63+
set { this.ActionFailedMessage.Text = value; }
64+
}
65+
66+
public bool FailedActionMessageVisible
67+
{
68+
get { return !this.MainContainer.Panel1Collapsed; }
69+
set { this.MainContainer.Panel1Collapsed = !value; }
70+
}
71+
6072
public event EventHandler<EventArgs> RefreshData;
6173
private void RefreshButton_Click(object sender, EventArgs e)
6274
{
@@ -75,6 +87,12 @@ private void InitRepoButton_Click(object sender, EventArgs e)
7587
RaiseGenericEvent(InitializeNewRepository, e);
7688
}
7789

90+
public event EventHandler<EventArgs> DismissMessage;
91+
private void DismissMessageButton_Click(object sender, EventArgs e)
92+
{
93+
RaiseGenericEvent(DismissMessage, e);
94+
}
95+
7896
private void RaiseGenericEvent(EventHandler<EventArgs> handler, EventArgs e)
7997
{
8098
if (handler != null)

RetailCoder.VBE/UI/SourceControl/SourceControlPresenter.cs

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,16 @@ public SourceControlPresenter
3030
_config = _configService.LoadConfiguration();
3131

3232
_changesPresenter = changesPresenter;
33+
_changesPresenter.ActionFailed += OnActionFailed;
3334

3435
_branchesPresenter = branchesPresenter;
36+
_branchesPresenter.ActionFailed += OnActionFailed;
37+
3538
_settingsPresenter = settingsPresenter;
39+
_settingsPresenter.ActionFailed += OnActionFailed;
40+
3641
_unsyncedPresenter = unsyncedPresenter;
42+
_unsyncedPresenter.ActionFailed += OnActionFailed;
3743

3844
_folderBrowserFactory = folderBrowserFactory;
3945
_providerFactory = providerFactory;
@@ -44,6 +50,17 @@ public SourceControlPresenter
4450
_view.RefreshData += OnRefreshChildren;
4551
_view.OpenWorkingDirectory += OnOpenWorkingDirectory;
4652
_view.InitializeNewRepository += OnInitNewRepository;
53+
_view.DismissMessage += OnDismissMessage;
54+
}
55+
56+
private void OnDismissMessage(object sender, EventArgs eventArgs)
57+
{
58+
_view.FailedActionMessageVisible = false;
59+
}
60+
61+
private void OnActionFailed(object sender, ActionFailedEventArgs e)
62+
{
63+
ShowActionFailedMessage(e.Title, e.Message);
4764
}
4865

4966
private void _branchesPresenter_BranchChanged(object sender, EventArgs e)
@@ -90,10 +107,9 @@ private void OnOpenWorkingDirectory(object sender, EventArgs e)
90107
{
91108
_provider = _providerFactory.CreateProvider(project, repo);
92109
}
93-
catch (SourceControlException)
110+
catch (SourceControlException ex)
94111
{
95-
MessageBox.Show(RubberduckUI.SourceControl_NoRepoFound, RubberduckUI.SourceControlPanel_Caption,
96-
MessageBoxButtons.OK, MessageBoxIcon.Warning);
112+
ShowActionFailedMessage(ex.Message, ex.InnerException.Message);
97113
return;
98114
}
99115

@@ -139,6 +155,12 @@ public void RefreshChildren()
139155
_view.Status = RubberduckUI.Online;
140156
}
141157

158+
private void ShowActionFailedMessage(string title, string message)
159+
{
160+
_view.FailedActionMessageVisible = true;
161+
_view.FailedActionMessage = string.Format("{0}{1}{2}", title, Environment.NewLine, message);
162+
}
163+
142164
private void SetChildPresenterSourceControlProviders(ISourceControlProvider provider)
143165
{
144166
_branchesPresenter.Provider = provider;

RubberduckTests/SourceControl/BranchesPresenterTests.cs

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -569,5 +569,72 @@ public void RefreshingViewShouldNotCheckoutBranch()
569569
//assert
570570
_provider.Verify(git => git.Checkout(It.IsAny<string>()),Times.Never);
571571
}
572+
573+
[TestMethod]
574+
public void OnBranchChange_WhenCheckoutFails_ActionFailedEventIsRaised()
575+
{
576+
//arrange
577+
var wasRaised = false;
578+
579+
_provider.Setup(p => p.Checkout(It.IsAny<string>()))
580+
.Throws(
581+
new SourceControlException("A source control exception was thrown.",
582+
new LibGit2Sharp.LibGit2SharpException("With an inner libgit2sharp exception"))
583+
);
584+
585+
_presenter.ActionFailed += (sender, args) => wasRaised = true;
586+
587+
_view.SetupProperty(v => v.Current, "master");
588+
589+
//act
590+
_view.Raise(v => v.SelectedBranchChanged += null, EventArgs.Empty);
591+
592+
//assert
593+
Assert.IsTrue(wasRaised, "ActionFailedEvent was not raised.");
594+
}
595+
596+
[TestMethod]
597+
public void OnDeleteBranch_WhenDeleteFails_ActionFailedEventIsRaised()
598+
{
599+
//arrange
600+
var wasRaised = false;
601+
602+
var branchName = "dev";
603+
_provider.Setup(p => p.DeleteBranch(It.Is<string>(b => b == branchName)))
604+
.Throws(
605+
new SourceControlException("A source control exception was thrown.",
606+
new LibGit2Sharp.LibGit2SharpException("With an inner libgit2sharp exception"))
607+
);
608+
609+
_presenter.ActionFailed += (sender, args) => wasRaised = true;
610+
611+
//act
612+
_deleteView.Raise(v => v.Confirm += null, new BranchDeleteArgs(branchName));
613+
614+
//assert
615+
Assert.IsTrue(wasRaised, "ActionFailedEvent was not raised.");
616+
}
617+
618+
[TestMethod]
619+
public void OnCreateBranch_WhenCreateFails_ActionFailedEventIsRaised()
620+
{
621+
//arrange
622+
var wasRaised = false;
623+
624+
var branchName = "dev";
625+
_provider.Setup(p => p.CreateBranch(It.Is<string>(b => b == branchName)))
626+
.Throws(
627+
new SourceControlException("A source control exception was thrown.",
628+
new LibGit2Sharp.LibGit2SharpException("With an inner libgit2sharp exception"))
629+
);
630+
631+
_presenter.ActionFailed += (sender, args) => wasRaised = true;
632+
633+
//act
634+
_createView.Raise(v => v.Confirm += null, new BranchCreateArgs(branchName));
635+
636+
//assert
637+
Assert.IsTrue(wasRaised, "ActionFailedEvent was not raised.");
638+
}
572639
}
573640
}

RubberduckTests/SourceControl/ChangesPresenterTests.cs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,5 +189,31 @@ public void ExcludedIsClearedAfterRefresh()
189189
//
190190
Assert.IsFalse(_viewMock.Object.ExcludedChanges.Any());
191191
}
192+
193+
[TestMethod]
194+
public void ChangesPresenter_WhenCommitFails_ActionFailedEventIsRaised()
195+
{
196+
//arrange
197+
var wasRaised = false;
198+
199+
_providerMock.Setup(p => p.Commit(It.IsAny<string>()))
200+
.Throws(
201+
new SourceControlException("A source control exception was thrown.",
202+
new LibGit2Sharp.LibGit2SharpException("With an inner libgit2sharp exception"))
203+
);
204+
205+
_viewMock.SetupProperty(v => v.IncludedChanges);
206+
_viewMock.Object.IncludedChanges = new List<IFileStatusEntry>() { new FileStatusEntry(@"C:\path\to\module.bas", FileStatus.Modified) };
207+
208+
var presenter = new ChangesPresenter(_viewMock.Object, _providerMock.Object);
209+
210+
presenter.ActionFailed += (sender, args) => wasRaised = true;
211+
212+
//act
213+
presenter.Commit();
214+
215+
//assert
216+
Assert.IsTrue(wasRaised, "ActionFailedEvent was not raised.");
217+
}
192218
}
193219
}

0 commit comments

Comments
 (0)