using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Controls.Primitives; using System.Windows.Input; using GSF.TimeSeries.UI.UserControls; using GSF.TimeSeries.UI.ViewModels; using PowerCalculations.PowerMultiCalculator; using PowerCalculations.UI.WPF.ViewModels; namespace PowerCalculations.UI.WPF.UserControls { /// /// Interaction logic for PowerCalculationUserControl.xaml /// public partial class PowerCalculationUserControl { private PowerCalculationViewModel m_dataContext; public PowerCalculationUserControl() { InitializeComponent(); m_dataContext = new PowerCalculationViewModel(14); m_dataContext.PropertyChanged += ViewModel_PropertyChanged; DataContext = m_dataContext; try { // Validate that data operation and adapter instance exist within database PowerCalculationConfigurationValidation.ValidateDatabaseDefinitions(); } catch { // This should never cause unhanded exception } } private void ViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e) { if (e.PropertyName == nameof(m_dataContext.CurrentItem) && m_dataContext.IsNewRecord) DataGridList.SelectedIndex = -1; } private void PhasorSelector_Loaded(object sender, RoutedEventArgs e) { PhasorSelectionUserControl phasorSelector; PhasorSelectionViewModel dataContext; phasorSelector = e.OriginalSource as PhasorSelectionUserControl; if ((object)phasorSelector == null) return; dataContext = GetDataContext(phasorSelector); dataContext.Clear(); if (phasorSelector == VoltagePhasorSelector) dataContext.PropertyChanged += VoltagePhasorChanged; else if (phasorSelector == CurrentPhasorSelector) dataContext.PropertyChanged += CurrentPhasorChanged; } private void MeasurementPager_Loaded(object sender, RoutedEventArgs e) { MeasurementPagerUserControl measurementPager; Measurements dataContext; measurementPager = e.OriginalSource as MeasurementPagerUserControl; if ((object)measurementPager == null) return; dataContext = GetDataContext(measurementPager); dataContext.Clear(); if (measurementPager == ActiveMeasurementPager) dataContext.PropertyChanged += ActiveMeasurementChanged; else if (measurementPager == ReactiveMeasurementPager) dataContext.PropertyChanged += ReactiveMeasurementChanged; else if (measurementPager == ApparentMeasurementPager) dataContext.PropertyChanged += ApparentMeasurementChanged; } private void VoltagePhasorChanged(object sender, PropertyChangedEventArgs propertyChangedEventArgs) { if (propertyChangedEventArgs.PropertyName == "CurrentItem") ((PowerCalculationViewModel)DataContext).CurrentItem.VoltagePhasor = GetDataContext(VoltagePhasorSelector).CurrentItem; } private void CurrentPhasorChanged(object sender, PropertyChangedEventArgs propertyChangedEventArgs) { if (propertyChangedEventArgs.PropertyName == "CurrentItem") ((PowerCalculationViewModel)DataContext).CurrentItem.CurrentPhasor = GetDataContext(CurrentPhasorSelector).CurrentItem; } private void ActiveMeasurementChanged(object sender, PropertyChangedEventArgs propertyChangedEventArgs) { if (propertyChangedEventArgs.PropertyName == "CurrentItem") ((PowerCalculationViewModel)DataContext).CurrentItem.ActivePowerOutputMeasurement = ActiveMeasurementPager.CurrentItem; } private void ReactiveMeasurementChanged(object sender, PropertyChangedEventArgs propertyChangedEventArgs) { if (propertyChangedEventArgs.PropertyName == "CurrentItem") ((PowerCalculationViewModel)DataContext).CurrentItem.ReactivePowerOutputMeasurement = ReactiveMeasurementPager.CurrentItem; } private void ApparentMeasurementChanged(object sender, PropertyChangedEventArgs propertyChangedEventArgs) { if (propertyChangedEventArgs.PropertyName == "CurrentItem") ((PowerCalculationViewModel)DataContext).CurrentItem.ApparentPowerOutputMeasurement = ApparentMeasurementPager.CurrentItem; } private PhasorSelectionViewModel GetDataContext(PhasorSelectionUserControl phasorSelector) { return phasorSelector.DataContext as PhasorSelectionViewModel; } private Measurements GetDataContext(MeasurementPagerUserControl measurementPager) { StackPanel rootPanel = measurementPager.FindName("RootPanel") as StackPanel; if ((object)rootPanel == null) return null; return rootPanel.DataContext as Measurements; } private void ClearVoltagePhasor_Click(object sender, RoutedEventArgs e) { GetDataContext(VoltagePhasorSelector).Clear(); } private void ClearCurrentPhasor_Click(object sender, RoutedEventArgs e) { GetDataContext(CurrentPhasorSelector).Clear(); } private void ClearActiveMeasurement_Click(object sender, RoutedEventArgs e) { GetDataContext(ActiveMeasurementPager).Clear(); } private void ClearReactiveMeasurement_Click(object sender, RoutedEventArgs e) { GetDataContext(ReactiveMeasurementPager).Clear(); } private void ClearApparentMeasurement_Click(object sender, RoutedEventArgs e) { GetDataContext(ApparentMeasurementPager).Clear(); } private void Popup_Opened(object sender, System.EventArgs e) { CloseAllPopups(sender as Popup); } private void CloseAllPopups() { CloseAllPopups(null); } private void CloseAllPopups(Popup except) { List popups = new List(); List children = LogicalTreeHelper.GetChildren(GridDetailView).OfType().ToList(); while (children.Any()) { popups.AddRange(children.OfType()); children = children.SelectMany(child => LogicalTreeHelper.GetChildren(child).OfType()).ToList(); } foreach (Popup popup in popups) { if (popup != except) popup.IsOpen = false; } } private void CloseButton_Click(object sender, System.Windows.RoutedEventArgs e) { DependencyObject ancestor = e.OriginalSource as DependencyObject; Popup popup; do { ancestor = LogicalTreeHelper.GetParent(ancestor); popup = ancestor as Popup; } while ((object)ancestor != null && (object)popup == null); if ((object)popup != null) popup.IsOpen = false; } private void PowerCalculationUserControl_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e) { if (e.Key == Key.Escape) CloseAllPopups(); } private void RuntimeIDTextBlock_Loaded(object sender, RoutedEventArgs e) { TextBlock textBlock = e.OriginalSource as TextBlock; if ((object)textBlock != null) textBlock.Text = m_dataContext.RuntimeID; } private void InitializeButton_Click(object sender, RoutedEventArgs e) { m_dataContext.InitializeAdapter(); } } }