using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using H.Pipes; using InABox.Logging; using InABox.Wpf; namespace PRSDesktop { public class PropertyChangedBase : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { Application.Current.Dispatcher.BeginInvoke((Action)(() => { var handler = PropertyChanged; if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); })); } } public class LogEntry : PropertyChangedBase { public string DateTime { get; set; } public string Type { get; set; } public string User { get; set; } public string Message { get; set; } } public class CollapsibleLogEntry : LogEntry { public List Contents { get; set; } } public static class ItemsControlExtensions { public static void ScrollIntoView( this ItemsControl control, object item) { var framework = control.ItemContainerGenerator.ContainerFromItem(item) as FrameworkElement; if (framework == null) return; framework.BringIntoView(); } public static void ScrollIntoView(this ItemsControl control) { var count = control.Items.Count; if (count == 0) return; var item = control.Items[count - 1]; control.ScrollIntoView(item); } } /// /// Interaction logic for Console.xaml /// public partial class Console : ThemableWindow { //private PipeClient _client; public CollectionViewSource _filtered; private readonly ObservableCollection _logentries; private bool _monitoronly = true; private EventLogger logger; private int _msgindex = 1; public Console() { InitializeComponent(); _logentries = new ObservableCollection(); _filtered = new CollectionViewSource(); _filtered.Source = _logentries; _filtered.Filter += (sender, args) => { args.Accepted = string.IsNullOrWhiteSpace(Search.Text) || ((LogEntry)args.Item).DateTime.Contains(Search.Text) || ((LogEntry)args.Item).Type.Contains(Search.Text) || ((LogEntry)args.Item).User.Contains(Search.Text) || ((LogEntry)args.Item).Message.Contains(Search.Text); }; DataContext = _filtered; } private void Window_Loaded(object sender, RoutedEventArgs e) { /*_client = new PipeClient("PRSDesktop"); _client.Connected += _client_Connected; _client.ExceptionOccurred += _client_ExceptionOccurred; _client.MessageReceived += (o, args) => { var m = args.Message; var datetime = m.Length > 32 ? m.Substring(0, 12) : string.Format("{0:HH:mm:ss.fff}", DateTime.Now); var type = m.Length > 32 ? m.Substring(13, 6) : "INFO"; var user = m.Length > 32 ? m.Substring(20, 12) : ""; var msg = m.Length > 32 ? m.Substring(33) : m; if (string.Equals(type?.Trim(), "INFO") || string.Equals(type?.Trim(), "ERROR")) { var logentry = new LogEntry { DateTime = datetime, Type = type, User = user, Message = msg }; Dispatcher.BeginInvoke((Action)(() => { _logentries.Insert(0, logentry); })); } }; _client.ConnectAsync();*/ logger = new EventLogger(OnLog); MainLogger.AddLogger(logger); } private void OnLog(string message) { var datetime = message.Length > 32 ? message.Substring(0, 12) : string.Format("{0:HH:mm:ss.fff}", DateTime.Now); var type = message.Length > 32 ? message.Substring(13, 6) : "INFO"; var user = message.Length > 32 ? message.Substring(20, 12) : ""; var msg = message.Length > 32 ? message.Substring(33) : message; if (string.Equals(type.Trim(), "INFO") || string.Equals(type.Trim(), "ERROR")) { var logentry = new LogEntry { DateTime = datetime, Type = type, User = user, Message = msg }; Dispatcher.BeginInvoke(() => _logentries.Insert(0, logentry)); } } private void Window_Closing(object sender, CancelEventArgs e) { //_client.DisconnectAsync(); MainLogger.RemoveLogger(logger); } private void Search_TextChanged(object sender, TextChangedEventArgs e) { _filtered.View.Refresh(); } } }