diff --git a/src/StructuredLogViewer/BuildParametersScreen.cs b/src/StructuredLogViewer/BuildParametersScreen.cs index 83667073..9cf921f0 100644 --- a/src/StructuredLogViewer/BuildParametersScreen.cs +++ b/src/StructuredLogViewer/BuildParametersScreen.cs @@ -1,20 +1,13 @@ using System; -using System.ComponentModel; -using System.Runtime.CompilerServices; using System.Windows.Input; namespace Microsoft.Build.Logging.StructuredLogger { - public class BuildParametersScreen : INotifyPropertyChanged + public class BuildParametersScreen : ObservableObject { - public event PropertyChangedEventHandler PropertyChanged; - public event Action BuildRequested; public event Action CancelRequested; - protected void RaisePropertyChanged([CallerMemberName] string propertyName = null) - => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); - public string PrefixArguments { get; set; } public string MSBuildArguments { get; set; } public string PostfixArguments { get; set; } @@ -27,5 +20,4 @@ protected void RaisePropertyChanged([CallerMemberName] string propertyName = nul public ICommand CancelCommand => cancelCommand ?? (cancelCommand = new Command(Cancel)); private void Cancel() => CancelRequested?.Invoke(); } -} - +} \ No newline at end of file diff --git a/src/StructuredLogViewer/BuildProgress.cs b/src/StructuredLogViewer/BuildProgress.cs index 36cac3eb..dda43d54 100644 --- a/src/StructuredLogViewer/BuildProgress.cs +++ b/src/StructuredLogViewer/BuildProgress.cs @@ -1,9 +1,6 @@ -using System.ComponentModel; -using System.Runtime.CompilerServices; - -namespace Microsoft.Build.Logging.StructuredLogger +namespace Microsoft.Build.Logging.StructuredLogger { - public class BuildProgress : INotifyPropertyChanged + public class BuildProgress : ObservableObject { private string progressText; public string ProgressText @@ -37,10 +34,5 @@ public string MSBuildCommandLine } public bool ShowCommandLine => !string.IsNullOrEmpty(MSBuildCommandLine); - - public event PropertyChangedEventHandler PropertyChanged; - - protected void RaisePropertyChanged([CallerMemberName] string propertyName = null) - => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } diff --git a/src/StructuredLogViewer/Controls/StringEmptinessToVisibilityConverter.cs b/src/StructuredLogViewer/Controls/StringEmptinessToVisibilityConverter.cs new file mode 100644 index 00000000..2067ae3f --- /dev/null +++ b/src/StructuredLogViewer/Controls/StringEmptinessToVisibilityConverter.cs @@ -0,0 +1,23 @@ +using System; +using System.Globalization; +using System.Windows; +using System.Windows.Data; + +namespace StructuredLogViewer +{ + public class StringEmptinessToVisibilityConverter : IValueConverter + { + public static readonly StringEmptinessToVisibilityConverter Instance = new StringEmptinessToVisibilityConverter(); + + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + var text = value as string; + return string.IsNullOrEmpty(text) ? Visibility.Collapsed : Visibility.Visible; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } + } +} diff --git a/src/StructuredLogViewer/MainWindow.xaml.cs b/src/StructuredLogViewer/MainWindow.xaml.cs index 5c034f70..f4ab85d1 100644 --- a/src/StructuredLogViewer/MainWindow.xaml.cs +++ b/src/StructuredLogViewer/MainWindow.xaml.cs @@ -25,18 +25,18 @@ public MainWindow() var uri = new Uri("StructuredLogViewer;component/themes/Generic.xaml", UriKind.Relative); var generic = (ResourceDictionary)Application.LoadComponent(uri); Application.Current.Resources.MergedDictionaries.Add(generic); - Loaded += MainWindow_Loaded; - DisplayWelcomeScreen(); + Loaded += MainWindow_Loaded; } - private void DisplayWelcomeScreen() + private void DisplayWelcomeScreen(string message = "") { this.projectFilePath = null; this.logFilePath = null; this.currentBuild = null; Title = DefaultTitle; var welcomeScreen = new WelcomeScreen(); + welcomeScreen.Message = message; SetContent(welcomeScreen); welcomeScreen.RecentLogSelected += log => OpenLogFile(log); welcomeScreen.RecentProjectSelected += project => BuildProject(project); @@ -49,6 +49,43 @@ private async void MainWindow_Loaded(object sender, RoutedEventArgs e) { try { + var args = Environment.GetCommandLineArgs(); + if (args.Length > 1) + { + if (args.Length > 2) + { + DisplayWelcomeScreen("Structured Log Viewer can only accept a single command-line argument: a full path to an existing log file or MSBuild project/solution."); + return; + } + + var filePath = args[1]; + if (!File.Exists(filePath)) + { + DisplayWelcomeScreen($"File {filePath} not found."); + return; + } + + if (filePath.EndsWith(".xml", StringComparison.OrdinalIgnoreCase) || + filePath.EndsWith(".buildlog", StringComparison.OrdinalIgnoreCase)) + { + OpenLogFile(filePath); + return; + } + + if (filePath.EndsWith(".sln", StringComparison.OrdinalIgnoreCase) || + filePath.EndsWith("proj", StringComparison.OrdinalIgnoreCase)) + { + BuildProject(filePath); + return; + } + + DisplayWelcomeScreen($"File extension not supported: {filePath}"); + return; + } + + DisplayWelcomeScreen(); + + // only check for updates if there were no command-line arguments and debugger not attached if (Debugger.IsAttached || SettingsService.DisableUpdates) { return; @@ -84,7 +121,7 @@ private async void MainWindow_Loaded(object sender, RoutedEventArgs e) var welcomeScreen = mainContent.Content as WelcomeScreen; if (welcomeScreen != null) { - welcomeScreen.Version = ex.ToString(); + welcomeScreen.Message = ex.ToString(); } } } diff --git a/src/StructuredLogViewer/StructuredLogViewer.csproj b/src/StructuredLogViewer/StructuredLogViewer.csproj index 3808f009..b3fe0676 100644 --- a/src/StructuredLogViewer/StructuredLogViewer.csproj +++ b/src/StructuredLogViewer/StructuredLogViewer.csproj @@ -67,6 +67,7 @@ + diff --git a/src/StructuredLogViewer/WelcomeScreen.cs b/src/StructuredLogViewer/WelcomeScreen.cs index 3c7b5683..0da75de6 100644 --- a/src/StructuredLogViewer/WelcomeScreen.cs +++ b/src/StructuredLogViewer/WelcomeScreen.cs @@ -1,17 +1,15 @@ using System; using System.Collections.Generic; -using System.ComponentModel; using System.IO; using System.Linq; using System.Reflection; -using System.Runtime.CompilerServices; using System.Windows; using System.Windows.Input; using StructuredLogViewer; namespace Microsoft.Build.Logging.StructuredLogger { - public class WelcomeScreen : INotifyPropertyChanged + public class WelcomeScreen : ObservableObject { private IEnumerable recentLogs; public IEnumerable RecentLogs => recentLogs ?? (recentLogs = SettingsService.GetRecentLogFiles()); @@ -42,6 +40,21 @@ public string Version } } + private string message; + public string Message + { + get + { + return message; + } + + set + { + message = value; + RaisePropertyChanged(); + } + } + private static string GetVersion() { var version = Assembly.GetEntryAssembly().GetName().Version; @@ -93,10 +106,5 @@ public string SelectedProject private ICommand openLogFileCommand; public ICommand OpenLogFileCommand => openLogFileCommand ?? (openLogFileCommand = new Command(OpenLogFile)); private void OpenLogFile() => OpenLogFileRequested?.Invoke(); - - public event PropertyChangedEventHandler PropertyChanged; - - protected void RaisePropertyChanged([CallerMemberName] string propertyName = null) - => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } diff --git a/src/StructuredLogViewer/themes/Generic.xaml b/src/StructuredLogViewer/themes/Generic.xaml index cc675e5d..70b4f9e6 100644 --- a/src/StructuredLogViewer/themes/Generic.xaml +++ b/src/StructuredLogViewer/themes/Generic.xaml @@ -1,7 +1,8 @@  + xmlns:local="clr-namespace:Microsoft.Build.Logging.StructuredLogger" + xmlns:s="clr-namespace:StructuredLogViewer"> F1 M 8.5,7.0 C 7.12,7.00 6.0,5.88 6.0,4.5 C 6.0,3.12 7.12,2.0 8.5,2.0 C 9.88,2.0 11.0,3.12 11.0,4.5 C 11.0,5.88 9.88,7.0 8.5,7.0 Z M 8.5,0.0 C 6.02,0.0 4.0,2.02 4.0,4.500 C 4.0,5.23 4.19,5.9 4.49,6.5 L 0.0,11.0 L 2.0,13.0 L 6.49,8.51 C 7.1,8.81 7.77,9.0 8.5,9.0 C 11.0,9.0 13.0,7.0 13.0,4.5 C 13.0,2.02 11.0,0.0 8.5,0.0 Z @@ -404,8 +405,18 @@ + - + + @@ -446,7 +457,7 @@ @@ -459,7 +470,7 @@ @@ -499,8 +510,8 @@ - - + + diff --git a/src/StructuredLogger/ObjectModel/BaseNode.cs b/src/StructuredLogger/ObjectModel/BaseNode.cs index 337b84a3..f2567722 100644 --- a/src/StructuredLogger/ObjectModel/BaseNode.cs +++ b/src/StructuredLogger/ObjectModel/BaseNode.cs @@ -1,12 +1,7 @@ -using System.ComponentModel; -using System.Runtime.CompilerServices; - -namespace Microsoft.Build.Logging.StructuredLogger +namespace Microsoft.Build.Logging.StructuredLogger { - public abstract class BaseNode : INotifyPropertyChanged + public abstract class BaseNode : ObservableObject { - public event PropertyChangedEventHandler PropertyChanged; - /// /// Since there can only be 1 selected node at a time, don't waste an instance field /// just to store a bit. Store the currently selected node here and this way we save @@ -36,8 +31,5 @@ public bool IsSelected RaisePropertyChanged("IsLowRelevance"); } } - - protected void RaisePropertyChanged([CallerMemberName] string propertyName = null) - => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } diff --git a/src/StructuredLogger/ObjectModel/ObservableObject.cs b/src/StructuredLogger/ObjectModel/ObservableObject.cs new file mode 100644 index 00000000..2e268a66 --- /dev/null +++ b/src/StructuredLogger/ObjectModel/ObservableObject.cs @@ -0,0 +1,13 @@ +using System.ComponentModel; +using System.Runtime.CompilerServices; + +namespace Microsoft.Build.Logging.StructuredLogger +{ + public class ObservableObject : INotifyPropertyChanged + { + public event PropertyChangedEventHandler PropertyChanged; + + protected void RaisePropertyChanged([CallerMemberName] string propertyName = null) + => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } +} diff --git a/src/StructuredLogger/StructuredLogger.csproj b/src/StructuredLogger/StructuredLogger.csproj index e9f77ec5..a1a9d0ee 100644 --- a/src/StructuredLogger/StructuredLogger.csproj +++ b/src/StructuredLogger/StructuredLogger.csproj @@ -46,6 +46,7 @@ +