Beispiel #1
0
        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();
                }
            }
        }