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 @@
+