Пример #1
0
        private void OnSourcesChanged(object sender, NotifyCollectionChangedEventArgs e)
        {
            ObservableCollection <CompareSource> obsSender = sender as ObservableCollection <CompareSource>;

            if (e.Action == NotifyCollectionChangedAction.Add)
            {
                foreach (var newItem in e.NewItems)
                {
                    var newSource = m_Sources[m_Sources.IndexOf((CompareSource)newItem)];

                    int titleNum = 1;

                    if (string.IsNullOrEmpty(newSource.Title.Trim()))
                    {
                        newSource.Title = DEFAULT_NAME;
                    }

                    string title = newSource.Title;
                    while (m_Sources.Where(s => s.Title.Equals(newSource.Title)).Count() > 1)
                    {
                        newSource.Title = title + "(" + titleNum++ + ")";
                    }

                    newSource.getValues().Keys.ToList().ForEach(
                        k =>
                    {
                        if (m_Dimensions.ContainsKey(k))
                        {
                            m_Dimensions[k]++;
                        }
                        else
                        {
                            m_Dimensions.Add(k, 1);
                            var newOrdinateCheckbox              = new CheckedListItem <string>(k);
                            newOrdinateCheckbox.PropertyChanged += OnOrdinateCheckChanged;
                            m_AvailableOrdinates.Add(newOrdinateCheckbox);
                            CbAbscissa.Items.Add(k);
                        }
                    });

                    switch (m_Metrica)
                    {
                    case Metrica.Metric:
                        foreach (var keyValue in newSource.getValues())
                        {
                            string newUnit = m_Imperical2MetricalConverter.Convert(keyValue.Value, newSource.getUnits()[keyValue.Key]);
                            newSource.getUnits()[keyValue.Key] = newUnit;
                        }
                        break;

                    case Metrica.Imperial:
                        foreach (var keyValue in newSource.getValues())
                        {
                            string newUnit = m_Metrical2ImperialConverter.Convert(keyValue.Value, newSource.getUnits()[keyValue.Key]);
                            newSource.getUnits()[keyValue.Key] = newUnit;
                        }
                        break;

                    default:
                        throw new InvalidOperationException("invalid metrica");
                    }
                    var newSourceCheckbox = new CheckedListItem <string>(newSource.Title);
                    newSourceCheckbox.PropertyChanged += OnSourceCheckChanged;
                    m_AvailableSources.Add(newSourceCheckbox);
                }
            }
            else if (e.Action == NotifyCollectionChangedAction.Remove)
            {
                foreach (var removedItem in e.OldItems)
                {
                    var removedSource = (CompareSource)removedItem;

                    foreach (string dimension in removedSource.getValues().Keys.ToList())
                    {
                        int count = m_Dimensions[dimension];
                        if (count == 1)
                        {
                            m_Dimensions.Remove(dimension);
                            CbAbscissa.Items.Remove(dimension);

                            var ordinatesToRemove = m_AvailableOrdinates.Where(o => o.Item.Equals(dimension)).ToList();
                            foreach (var item in ordinatesToRemove)
                            {
                                m_AvailableOrdinates.Remove(item);
                            }
                        }
                        else
                        {
                            m_Dimensions[dimension]--;
                        }
                    }

                    m_Graphs.RemoveAll(g => g.Key.Equals(removedSource.Title));

                    var toRemove = m_AvailableSources.Where(s => s.Item.Equals(removedSource.Title)).ToList();
                    foreach (var item in toRemove)
                    {
                        m_AvailableSources.Remove(item);
                    }
                }
                Redraw();
            }
        }