//****************************************************************************************************** // MonitoringUserControl.xaml.cs - Gbtc // // Copyright © 2010, Grid Protection Alliance. All Rights Reserved. // // Licensed to the Grid Protection Alliance (GPA) under one or more contributor license agreements. See // the NOTICE file distributed with this work for additional information regarding copyright ownership. // The GPA licenses this file to you under the MIT License (MIT), the "License"; you may // not use this file except in compliance with the License. You may obtain a copy of the License at: // // http://www.opensource.org/licenses/MIT // // Unless agreed to in writing, the subject software distributed under the License is distributed on an // "AS-IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. Refer to the // License for the specific language governing permissions and limitations. // // Code Modification History: // ---------------------------------------------------------------------------------------------------- // 06/08/2011 - Mehulbhai P Thakkar // Generated original version of source code. // //****************************************************************************************************** using System; using System.Windows; using System.Windows.Controls; using System.Windows.Controls.Primitives; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using GSF.Communication; using GSF.ServiceProcess; namespace GSF.TimeSeries.UI.UserControls { /// /// Interaction logic for MonitoringUserControl.xaml /// public partial class MonitoringUserControl : UserControl { #region [ Members ] // Fields private WindowsServiceClient m_serviceClient; private int m_numberOfMessages; // Delegates private delegate void DisplayHelper(UpdateType updateType, string message); #endregion #region [ Constructor ] /// /// Creates an instance of . /// public MonitoringUserControl() { InitializeComponent(); this.Loaded += MonitoringUserControl_Loaded; this.Unloaded += MonitoringUserControl_Unloaded; this.KeyUp += MonitoringUserControl_KeyUp; PopupSettings.Closed += PopupSettings_Closed; } private void PopupSettings_Closed(object sender, EventArgs e) { TextBoxServiceRequest.Focus(); } #endregion #region [ Methods ] private void MonitoringUserControl_KeyUp(object sender, KeyEventArgs e) { if (e.Key == Key.Escape && PopupSettings.IsOpen) PopupSettings.IsOpen = false; } /// /// Hanldes loaded event. /// /// Source of the event. /// Event arguments. private void MonitoringUserControl_Loaded(object sender, RoutedEventArgs e) { TextBoxServiceRequest.Focus(); SetupServiceConnection(); if (!int.TryParse(IsolatedStorageManager.ReadFromIsolatedStorage("NumberOfMessages").ToString(), out m_numberOfMessages)) m_numberOfMessages = 75; TextBoxNumberOfMessages.Text = m_numberOfMessages.ToString(); } /// /// Handles unloaded event. /// /// Source of the event. /// Event arguments. private void MonitoringUserControl_Unloaded(object sender, RoutedEventArgs e) { if (m_serviceClient != null && m_serviceClient.Helper != null) { m_serviceClient.Helper.ReceivedServiceResponse -= Helper_ReceivedServiceResponse; m_serviceClient.Helper.ReceivedServiceUpdate -= Helper_ReceivedServiceUpdate; } } /// /// Connects to backend windows service and attaches to it's events. /// private void SetupServiceConnection() { m_serviceClient = null; try { m_serviceClient = CommonFunctions.GetWindowsServiceClient(); if (m_serviceClient != null && m_serviceClient.Helper != null && m_serviceClient.Helper.RemotingClient != null && m_serviceClient.Helper.RemotingClient.CurrentState == ClientState.Connected) { TextBlockServiceStatus.Dispatcher.BeginInvoke(new DisplayHelper(RefreshStatusText), new object[] { UpdateType.Information, m_serviceClient.CachedStatus }); m_serviceClient.Helper.ReceivedServiceResponse += Helper_ReceivedServiceResponse; m_serviceClient.Helper.ReceivedServiceUpdate += Helper_ReceivedServiceUpdate; } } catch (Exception ex) { TextBlockServiceStatus.Dispatcher.BeginInvoke(new DisplayHelper(RefreshStatusText), new object[] { UpdateType.Alarm, "Failed to connect to windows service." + Environment.NewLine + ex.Message }); } } /// /// Handles ReceivedServiceUpdate event of the . /// /// Source of the event. /// Event arguments containing and Message. private void Helper_ReceivedServiceUpdate(object sender, EventArgs e) { TextBlockServiceStatus.Dispatcher.BeginInvoke(new DisplayHelper(RefreshStatusText), new object[] { e.Argument1, e.Argument2 }); } /// /// Hanldes ReceivedServiceResponse event of the . /// /// Source of the event. /// Response received from the service. private void Helper_ReceivedServiceResponse(object sender, EventArgs e) { string response = e.Argument.Type; string message = e.Argument.Message; string responseToClient = string.Empty; UpdateType responseType = UpdateType.Information; if (!string.IsNullOrEmpty(response)) { // Reponse types are formatted as "Command:Success" or "Command:Failure" string[] parts = response.Split(':'); string action; bool success; if (parts.Length > 1) { action = parts[0].Trim().ToTitleCase(); success = (string.Compare(parts[1].Trim(), "Success", true) == 0); } else { action = response; success = true; } if (success) { if (string.IsNullOrEmpty(message)) responseToClient = string.Format("{0} command processed successfully.\r\n\r\n", action); else responseToClient = string.Format("{0}\r\n\r\n", message); } else { responseType = UpdateType.Alarm; if (string.IsNullOrEmpty(message)) responseToClient = string.Format("{0} failure.\r\n\r\n", action); else responseToClient = string.Format("{0} failure: {1}\r\n\r\n", action, message); } TextBlockServiceStatus.Dispatcher.BeginInvoke(new DisplayHelper(RefreshStatusText), new object[] { responseType, responseToClient }); } } /// /// Refreshes status text being displayed on the screen. /// /// Type of update for the new status message received from backend service. /// Actual message received from the backend service. private void RefreshStatusText(UpdateType updateType, string message) { Run run; if (updateType == UpdateType.Information) { run = new Run(); run.Foreground = new SolidColorBrush(Color.FromArgb(255, 255, 255, 255)); run.Text = message; } else if (updateType == UpdateType.Warning) { run = new Run(); run.Foreground = new SolidColorBrush(Color.FromArgb(255, 255, 255, 0)); run.Text = message; } else { run = new Run(); run.Foreground = new SolidColorBrush(Color.FromArgb(255, 255, 10, 10)); run.Text = message; } TextBlockServiceStatus.Inlines.Add(run); if (TextBlockServiceStatus.Inlines.Count > m_numberOfMessages) TextBlockServiceStatus.Inlines.Remove(TextBlockServiceStatus.Inlines.FirstInline); TextBlockServiceStatus.UpdateLayout(); ScrollViewerMonitor.UpdateLayout(); //this is require to keep scroll-bar at the bottom. ScrollViewerMonitor.ScrollToVerticalOffset(TextBlockServiceStatus.ActualHeight * 2); } /// /// Handles Click event. /// /// Source of the event. /// Event arguments. private void ButtonSendServiceRequest_Click(object sender, RoutedEventArgs e) { if (!string.IsNullOrEmpty(TextBoxServiceRequest.Text) && m_serviceClient != null && m_serviceClient.Helper.RemotingClient.CurrentState == ClientState.Connected) { CommonFunctions.SendCommandToService(TextBoxServiceRequest.Text); TextBoxServiceRequest.Focus(); TextBoxServiceRequest.SelectAll(); } } /// /// Handles GotFocus event. /// /// Source of the event. /// Event arguments. private void TextBoxServiceRequest_GotFocus(object sender, RoutedEventArgs e) { TextBoxServiceRequest.SelectAll(); } private void ButtonDisplaySettings_Click(object sender, RoutedEventArgs e) { PopupSettings.Placement = PlacementMode.Center; PopupSettings.IsOpen = true; } private void ButtonRestore_Click(object sender, RoutedEventArgs e) { IsolatedStorageManager.InitializeStorageForRemoteConsole(true); if (int.TryParse(IsolatedStorageManager.ReadFromIsolatedStorage("NumberOfMessages").ToString(), out m_numberOfMessages)) { TextBoxNumberOfMessages.Text = m_numberOfMessages.ToString(); } PopupSettings.IsOpen = false; } private void ButtonCancel_Click(object sender, RoutedEventArgs e) { PopupSettings.IsOpen = false; } private void ButtonSave_Click(object sender, RoutedEventArgs e) { if (int.TryParse(TextBoxNumberOfMessages.Text, out m_numberOfMessages)) { IsolatedStorageManager.WriteToIsolatedStorage("NumberOfMessages", m_numberOfMessages); PopupSettings.IsOpen = false; } else { MessageBox.Show("Please provide integer value.", "ERROR: Invalid Value", MessageBoxButton.OK); } } #endregion } }