public void SetUp()
 {
     _settings = new Tailviewer.Settings.DataSources();
     _scheduler = new ManualTaskScheduler();
     _dataSources = new DataSources(_scheduler, _settings);
     _model = new MergedDataSourceViewModel(_dataSources.AddGroup());
 }
        private void DragFromGroup(IDataSourceViewModel source, IDataSourceViewModel dest, MergedDataSourceViewModel parent)
        {
            parent.RemoveChild(source);
            DissolveGroupIfNecessary(parent);

            Drag(source, dest);
        }
        private void Drag(IDataSourceViewModel source, IDataSourceViewModel dest)
        {
            var merged = dest as MergedDataSourceViewModel;
            if (merged != null)
            {
                // Drag from ungrouped onto an existing group
                // => add to existing group
                AddFileToGroup(source, merged);
            }
            else
            {
                // Drag from ungrouped onto a dest within a group
                // => find group of dest and addd to it
                merged = dest.Parent as MergedDataSourceViewModel;
                if (merged != null)
                {
                    AddFileToGroup(source, merged);
                }
                else
                {
                    // Drag from ungrouped onto another ungrouped source
                    // => remove dest as well and create new group
                    int destIndex = _observable.IndexOf(dest);
                    if (destIndex != -1)
                    {
                        _observable.Remove(dest);

                        MergedDataSource mergedDataSource = _dataSources.AddGroup();
                        merged = new MergedDataSourceViewModel(mergedDataSource);
                        merged.Remove += OnRemove;
                        merged.AddChild(source);
                        merged.AddChild(dest);
                        _observable.Insert(destIndex, merged);
                        SelectedItem = merged;
                    }
                }
            }
        }
        private void DissolveGroupIfNecessary(MergedDataSourceViewModel group)
        {
            if (group.ChildCount == 1)
            {
                int groupIndex = _observable.IndexOf(group);
                _observable.RemoveAt(groupIndex);
                _dataSources.Remove(group.DataSource);

                IDataSourceViewModel child = group.Observable.First();
                group.RemoveChild(child);
                _observable.Insert(groupIndex, child);
            }
        }
        private IDataSourceViewModel CreateViewModel(IDataSource dataSource)
        {
            if (dataSource == null)
                throw new ArgumentNullException("dataSource");

            IDataSourceViewModel viewModel;
            var single = dataSource as SingleDataSource;
            if (single != null)
            {
                viewModel = new SingleDataSourceViewModel(single);
            }
            else
            {
                var merged = dataSource as MergedDataSource;
                if (merged != null)
                {
                    viewModel = new MergedDataSourceViewModel(merged);
                }
                else
                {
                    throw new ArgumentException(string.Format("Unknown data source: {0} ({1})", dataSource, dataSource.GetType()));
                }
            }
            viewModel.Remove += OnRemove;
            _allDataSourceViewModels.Add(viewModel);

            if (_settings.DataSources.SelectedItem == viewModel.DataSource.Id)
            {
                SelectedItem = viewModel;
            }

            return viewModel;
        }
 private static void AddFileToGroup(IDataSourceViewModel source, MergedDataSourceViewModel viewModel)
 {
     viewModel.AddChild(source);
 }