Skip to content

Commit 2b999d0

Browse files
committed
Close #1731
1 parent 2a08d2f commit 2b999d0

File tree

4 files changed

+84
-8
lines changed

4 files changed

+84
-8
lines changed

RetailCoder.VBE/App.cs

Lines changed: 56 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
using Rubberduck.Parsing.Symbols;
88
using Rubberduck.Parsing.VBA;
99
using Rubberduck.Settings;
10-
using Rubberduck.SmartIndenter;
1110
using Rubberduck.UI;
1211
using Rubberduck.UI.Command.MenuItems;
1312
using System;
@@ -18,6 +17,7 @@
1817
using System.Runtime.InteropServices.ComTypes;
1918
using System.Threading.Tasks;
2019
using System.Windows.Forms;
20+
using Rubberduck.UI.SourceControl;
2121

2222
namespace Rubberduck
2323
{
@@ -29,10 +29,11 @@ public sealed class App : IDisposable
2929
private readonly IRubberduckParser _parser;
3030
private AutoSave.AutoSave _autoSave;
3131
private IGeneralConfigService _configService;
32-
private IAppMenu _appMenus;
32+
private readonly IAppMenu _appMenus;
3333
private RubberduckCommandBar _stateBar;
34-
private readonly IIndenter _indenter;
3534
private IRubberduckHooks _hooks;
35+
private bool _handleSinkEvents = true;
36+
private readonly BranchesViewViewModel _branchesVM;
3637

3738
private readonly Logger _logger;
3839

@@ -52,8 +53,8 @@ public App(VBE vbe, IMessageBox messageBox,
5253
IGeneralConfigService configService,
5354
IAppMenu appMenus,
5455
RubberduckCommandBar stateBar,
55-
IIndenter indenter,
56-
IRubberduckHooks hooks)
56+
IRubberduckHooks hooks,
57+
SourceControlDockablePresenter sourceControlPresenter)
5758
{
5859
_vbe = vbe;
5960
_messageBox = messageBox;
@@ -62,10 +63,16 @@ public App(VBE vbe, IMessageBox messageBox,
6263
_autoSave = new AutoSave.AutoSave(_vbe, _configService);
6364
_appMenus = appMenus;
6465
_stateBar = stateBar;
65-
_indenter = indenter;
6666
_hooks = hooks;
6767
_logger = LogManager.GetCurrentClassLogger();
6868

69+
var sourceControlPanel = (SourceControlPanel) sourceControlPresenter.Window();
70+
var panelVM = (SourceControlViewViewModel) sourceControlPanel.ViewModel;
71+
_branchesVM = (BranchesViewViewModel) panelVM.TabItems.Single(t => t.ViewModel.Tab == SourceControlTab.Branches).ViewModel;
72+
73+
_branchesVM.MergeStarted += _branchesVM_MergeStarted;
74+
_branchesVM.MergeCompleted += _branchesVM_MergeCompleted;
75+
6976
_hooks.MessageReceived += _hooks_MessageReceived;
7077
_configService.SettingsChanged += _configService_SettingsChanged;
7178
_configService.LanguageChanged += ConfigServiceLanguageChanged;
@@ -87,6 +94,22 @@ public App(VBE vbe, IMessageBox messageBox,
8794
UiDispatcher.Initialize();
8895
}
8996

97+
private void _branchesVM_MergeCompleted(object sender, EventArgs e)
98+
{
99+
_handleSinkEvents = true;
100+
101+
// update cache
102+
_parser.State.RemoveProject(_vbe.ActiveVBProject.HelpFile);
103+
_parser.State.AddProject(_vbe.ActiveVBProject);
104+
105+
_parser.State.OnParseRequested(this);
106+
}
107+
108+
private void _branchesVM_MergeStarted(object sender, EventArgs e)
109+
{
110+
_handleSinkEvents = false;
111+
}
112+
90113
private void State_StatusMessageUpdate(object sender, RubberduckStatusMessageEventArgs e)
91114
{
92115
var message = e.Message;
@@ -168,6 +191,8 @@ public void Shutdown()
168191
#region sink handlers. todo: move to another class
169192
async void sink_ProjectRemoved(object sender, DispatcherEventArgs<VBProject> e)
170193
{
194+
if (!_handleSinkEvents) { return; }
195+
171196
if (e.Item.Protection == vbext_ProjectProtection.vbext_pp_locked)
172197
{
173198
_logger.Debug("Locked project '{0}' was removed.", e.Item.Name);
@@ -205,6 +230,8 @@ async void sink_ProjectRemoved(object sender, DispatcherEventArgs<VBProject> e)
205230

206231
async void sink_ProjectAdded(object sender, DispatcherEventArgs<VBProject> e)
207232
{
233+
if (!_handleSinkEvents) { return; }
234+
208235
_logger.Debug("Project '{0}' was added.", e.Item.Name);
209236
if (e.Item.Protection == vbext_ProjectProtection.vbext_pp_locked)
210237
{
@@ -260,6 +287,8 @@ private void RegisterComponentsEventSink(VBComponents components, string project
260287

261288
async void sink_ComponentSelected(object sender, DispatcherEventArgs<VBComponent> e)
262289
{
290+
if (!_handleSinkEvents) { return; }
291+
263292
if (!_parser.State.AllDeclarations.Any())
264293
{
265294
return;
@@ -271,6 +300,8 @@ async void sink_ComponentSelected(object sender, DispatcherEventArgs<VBComponent
271300

272301
async void sink_ComponentRenamed(object sender, DispatcherRenamedEventArgs<VBComponent> e)
273302
{
303+
if (!_handleSinkEvents) { return; }
304+
274305
if (!_parser.State.AllDeclarations.Any())
275306
{
276307
return;
@@ -283,6 +314,8 @@ async void sink_ComponentRenamed(object sender, DispatcherRenamedEventArgs<VBCom
283314

284315
async void sink_ComponentRemoved(object sender, DispatcherEventArgs<VBComponent> e)
285316
{
317+
if (!_handleSinkEvents) { return; }
318+
286319
if (!_parser.State.AllDeclarations.Any())
287320
{
288321
return;
@@ -294,6 +327,8 @@ async void sink_ComponentRemoved(object sender, DispatcherEventArgs<VBComponent>
294327

295328
async void sink_ComponentReloaded(object sender, DispatcherEventArgs<VBComponent> e)
296329
{
330+
if (!_handleSinkEvents) { return; }
331+
297332
if (!_parser.State.AllDeclarations.Any())
298333
{
299334
return;
@@ -305,6 +340,8 @@ async void sink_ComponentReloaded(object sender, DispatcherEventArgs<VBComponent
305340

306341
async void sink_ComponentAdded(object sender, DispatcherEventArgs<VBComponent> e)
307342
{
343+
if (!_handleSinkEvents) { return; }
344+
308345
if (!_parser.State.AllDeclarations.Any())
309346
{
310347
return;
@@ -316,6 +353,8 @@ async void sink_ComponentAdded(object sender, DispatcherEventArgs<VBComponent> e
316353

317354
async void sink_ComponentActivated(object sender, DispatcherEventArgs<VBComponent> e)
318355
{
356+
if (!_handleSinkEvents) { return; }
357+
319358
if (!_parser.State.AllDeclarations.Any())
320359
{
321360
return;
@@ -327,6 +366,8 @@ async void sink_ComponentActivated(object sender, DispatcherEventArgs<VBComponen
327366

328367
async void sink_ProjectRenamed(object sender, DispatcherRenamedEventArgs<VBProject> e)
329368
{
369+
if (!_handleSinkEvents) { return; }
370+
330371
if (!_parser.State.AllDeclarations.Any())
331372
{
332373
return;
@@ -342,6 +383,8 @@ async void sink_ProjectRenamed(object sender, DispatcherRenamedEventArgs<VBProje
342383

343384
async void sink_ProjectActivated(object sender, DispatcherEventArgs<VBProject> e)
344385
{
386+
if (!_handleSinkEvents) { return; }
387+
345388
if (!_parser.State.AllDeclarations.Any())
346389
{
347390
return;
@@ -395,13 +438,20 @@ private void LoadConfig()
395438
}
396439

397440
private bool _disposed;
441+
398442
public void Dispose()
399443
{
400444
if (_disposed)
401445
{
402446
return;
403447
}
404448

449+
if (_branchesVM != null)
450+
{
451+
_branchesVM.MergeStarted -= _branchesVM_MergeStarted;
452+
_branchesVM.MergeCompleted -= _branchesVM_MergeCompleted;
453+
}
454+
405455
if (_hooks != null)
406456
{
407457
_hooks.MessageReceived -= _hooks_MessageReceived;

RetailCoder.VBE/UI/Command/MenuItems/UiDispatcher.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Threading;
3+
using System.Windows.Threading;
34

45
namespace Rubberduck.UI.Command.MenuItems
56
{

RetailCoder.VBE/UI/SourceControl/BranchesView.xaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@
201201
<TextBlock Text="{Resx ResxName=Rubberduck.UI.RubberduckUI, Key=SourceControl_SourceLabel}"
202202
FontWeight="SemiBold"
203203
Margin="0,0,0,5" />
204-
<ComboBox ItemsSource="{Binding Branches}"
204+
<ComboBox ItemsSource="{Binding LocalBranches}"
205205
SelectedItem="{Binding SourceBranch, Mode=TwoWay}" />
206206
</StackPanel>
207207
<Image Source="{StaticResource MergeArrowImage}"
@@ -213,7 +213,7 @@
213213
<TextBlock Text="{Resx ResxName=Rubberduck.UI.RubberduckUI, Key=SourceControl_DestinationLabel}"
214214
FontWeight="SemiBold"
215215
Margin="0,0,0,5" />
216-
<ComboBox ItemsSource="{Binding Branches}"
216+
<ComboBox ItemsSource="{Binding LocalBranches}"
217217
SelectedItem="{Binding DestinationBranch, Mode=TwoWay}" />
218218
</StackPanel>
219219
</Grid>

RetailCoder.VBE/UI/SourceControl/BranchesViewViewModel.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,17 +279,22 @@ private void CreateBranchCancel()
279279

280280
private void MergeBranchOk()
281281
{
282+
OnMergeStarted();
283+
282284
try
283285
{
284286
Provider.Merge(SourceBranch, DestinationBranch);
285287
}
286288
catch (SourceControlException ex)
287289
{
288290
RaiseErrorEvent(ex.Message, ex.InnerException.Message, NotificationType.Error);
291+
OnMergeCompleted();
292+
return;
289293
}
290294

291295
DisplayMergeBranchesGrid = false;
292296
RaiseErrorEvent(RubberduckUI.SourceControl_MergeStatus, string.Format(RubberduckUI.SourceControl_SuccessfulMerge, SourceBranch, DestinationBranch), NotificationType.Info);
297+
OnMergeCompleted();
293298
}
294299

295300
private void MergeBranchCancel()
@@ -423,5 +428,25 @@ private void RaiseErrorEvent(string message, string innerMessage, NotificationTy
423428
handler(this, new ErrorEventArgs(message, innerMessage, notificationType));
424429
}
425430
}
431+
432+
public event EventHandler<EventArgs> MergeStarted;
433+
private void OnMergeStarted()
434+
{
435+
var handler = MergeStarted;
436+
if (handler != null)
437+
{
438+
handler(this, EventArgs.Empty);
439+
}
440+
}
441+
442+
public event EventHandler<EventArgs> MergeCompleted;
443+
private void OnMergeCompleted()
444+
{
445+
var handler = MergeCompleted;
446+
if (handler != null)
447+
{
448+
handler(this, EventArgs.Empty);
449+
}
450+
}
426451
}
427452
}

0 commit comments

Comments
 (0)