private Dictionary <string, Action> GetInstanceCommandActions(Bookmark bookmark) { Action <VagrantProcess> useProcess = process => { _mainApplication.Dispatcher.Invoke(() => { bookmark.VagrantInstance.CurrentState = VagrantInstance.State.Loading; }); bookmark.VagrantInstance.CurrentProcess = process; _menu.StartWorkingAnimation(); process.Start(); process.Exited += (sender, args) => { bookmark.VagrantInstance.CurrentProcess = null; if (_applicationData.Bookmarks.Select(b => b.VagrantInstance).Count(i => i.CurrentProcess != null) == 0) { _menu.StopWorkingAnimation(); } }; try { process.BeginOutputReadLine(); } catch (Exception) { } process.WaitForExit(); }; Action <Action> initWorker = work => { using (var worker = new BackgroundWorker()) { worker.DoWork += (sender, args) => { work.Invoke(); }; worker.RunWorkerAsync(); } }; return(new Dictionary <string, Action> { { "Status", (() => initWorker(() => { using (var process = new VagrantStatusProcess(bookmark.VagrantInstance)) { process.Success += state => _mainApplication.Dispatcher.Invoke(() => { bookmark.VagrantInstance.CurrentState = state; _menu.ShowMessageBalloon(bookmark.Name + " current state: " + bookmark.VagrantInstance.CurrentState); }); useProcess(process); } })) }, { "SSH", (() => initWorker(() => { using (var process = new VagrantSshProcess(bookmark.VagrantInstance)) { process.Start(); } })) }, { "Up", (() => initWorker(() => { using (var process = new VagrantUpProcess(bookmark.VagrantInstance)) { process.Success += (sender2, args2) => _mainApplication.Dispatcher.Invoke(() => { bookmark.VagrantInstance.CurrentState = VagrantInstance.State.Running; _menu.ShowMessageBalloon(bookmark.Name + ": " + ((VagrantProcess)sender2).Command + " complete." + Environment.NewLine + Environment.NewLine + "Current state: " + bookmark.VagrantInstance.CurrentState); }); useProcess(process); } })) }, { "Reload", (() => initWorker(() => { using (var process = new VagrantReloadProcess(bookmark.VagrantInstance)) { process.Success += (sender2, args2) => _mainApplication.Dispatcher.Invoke(() => { bookmark.VagrantInstance.CurrentState = VagrantInstance.State.Running; _menu.ShowMessageBalloon(bookmark.Name + ": " + ((VagrantProcess)sender2).Command + " complete." + Environment.NewLine + Environment.NewLine + "Current state: " + bookmark.VagrantInstance.CurrentState); }); useProcess(process); } })) }, { "Suspend", (() => initWorker(() => { using (var process = new VagrantSuspendProcess(bookmark.VagrantInstance)) { process.Success += (sender2, args2) => _mainApplication.Dispatcher.Invoke(() => { bookmark.VagrantInstance.CurrentState = VagrantInstance.State.Saved; _menu.ShowMessageBalloon(bookmark.Name + ": " + ((VagrantProcess)sender2).Command + " complete." + Environment.NewLine + Environment.NewLine + "Current state: " + bookmark.VagrantInstance.CurrentState); }); useProcess(process); } })) }, { "Resume", (() => initWorker(() => { using (var process = new VagrantResumeProcess(bookmark.VagrantInstance)) { process.Success += (sender2, args2) => _mainApplication.Dispatcher.Invoke(() => { bookmark.VagrantInstance.CurrentState = VagrantInstance.State.Running; _menu.ShowMessageBalloon(bookmark.Name + ": " + ((VagrantProcess)sender2).Command + " complete." + Environment.NewLine + Environment.NewLine + "Current state: " + bookmark.VagrantInstance.CurrentState); }); useProcess(process); } })) }, { "Halt", (() => initWorker(() => { using (var process = new VagrantHaltProcess(bookmark.VagrantInstance)) { process.Success += (sender2, args2) => _mainApplication.Dispatcher.Invoke(() => { bookmark.VagrantInstance.CurrentState = VagrantInstance.State.Poweroff; _menu.ShowMessageBalloon(bookmark.Name + ": " + ((VagrantProcess)sender2).Command + " complete." + Environment.NewLine + Environment.NewLine + "Current state: " + bookmark.VagrantInstance.CurrentState); }); useProcess(process); } })) }, { "Destroy", (() => initWorker(() => { using (var process = new VagrantDestroyProcess(bookmark.VagrantInstance)) { //TODO: this state isn't accurate process.Success += (sender2, args2) => _mainApplication.Dispatcher.Invoke(() => { bookmark.VagrantInstance.CurrentState = VagrantInstance.State.Poweroff; _menu.ShowMessageBalloon(bookmark.Name + ": " + ((VagrantProcess)sender2).Command + " complete." + Environment.NewLine + Environment.NewLine + "Current state: " + bookmark.VagrantInstance.CurrentState); }); useProcess(process); } })) } }); }
private void RebuildList() { _menu.Reset(); //add each bookmark to the menu foreach (var bookmark in _applicationData.Bookmarks) { _menu.AddBookmarkSubmenu(bookmark, GetInstanceCommandActions(bookmark)); } //refresh the status of each underlying vagrant instance if (_applicationData.Bookmarks.Count > 0) { _menu.StartWorkingAnimation(); } foreach (var instance in _applicationData.Bookmarks.Select(b => b.VagrantInstance).Distinct(new VagrantInstanceEqualityComparer())) { var process = new VagrantStatusProcess(instance); var bookmarks = _applicationData.Bookmarks.Where( b => new VagrantInstanceEqualityComparer().Equals(b.VagrantInstance, instance)).ToList(); foreach (var bookmark in bookmarks) { bookmark.VagrantInstance.CurrentProcess = process; } using (var worker = new BackgroundWorker()) { worker.DoWork += (sender, args) => { process.Success += state => { _mainApplication.Dispatcher.Invoke(() => instance.CurrentState = state); foreach (var bookmark in bookmarks) { bookmark.VagrantInstance.CurrentProcess = null; } if ( _applicationData.Bookmarks.Select(b => b.VagrantInstance) .Count(i => i.CurrentProcess != null) == 0) { _menu.StopWorkingAnimation(); } process.Dispose(); }; process.Start(); try { process.BeginOutputReadLine(); } catch (Exception) { } process.WaitForExit(); }; worker.RunWorkerAsync(); } } }