Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 41 additions & 22 deletions src/StructuredLogViewer/Controls/BuildControl.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,9 @@ public partial class BuildControl : UserControl
private PreprocessedFileManager preprocessedFileManager;
private NavigationHelper navigationHelper;

private MenuItem searchMenuGroup;
private MenuItem copyMenuGroup;
private MenuItem gotoMenuGroup;
private MenuItem copyItem;
private MenuItem copySubtreeItem;
private MenuItem viewSubtreeTextItem;
Expand Down Expand Up @@ -190,6 +193,10 @@ public BuildControl(Build build, string logFilePath)
// Build Log
var contextMenu = new ContextMenu();
contextMenu.Opened += ContextMenu_Opened;
searchMenuGroup = new() { Header = "Search ..." };
copyMenuGroup = new() { Header = "Copy ..." };
gotoMenuGroup = new() { Header = "Go to ..." };
Comment thread
yuehuang010 marked this conversation as resolved.
Outdated

copyItem = new MenuItem() { Header = "Copy" };
copySubtreeItem = new MenuItem() { Header = "Copy subtree" };
viewSubtreeTextItem = new MenuItem() { Header = "View subtree text" };
Expand All @@ -198,8 +205,8 @@ public BuildControl(Build build, string logFilePath)
excludeNodeByNameFromSearch = new MenuItem() { Header = "Exclude node from search" };
searchInNodeByNameItem = new MenuItem() { Header = "Search in this node." };
searchThisNode = new MenuItem() { Header = "Search This Node" };
goToTimeLineItem = new MenuItem() { Header = "Go to timeline" };
goToTracingItem = new MenuItem() { Header = "Go to tracing" };
goToTimeLineItem = new MenuItem() { Header = "Timeline" };
goToTracingItem = new MenuItem() { Header = "Tracing" };
copyChildrenItem = new MenuItem() { Header = "Copy children" };
sortChildrenItem = new MenuItem() { Header = "Sort children" };
filterChildrenItem = new MenuItem() { Header = "Filter children (Ctrl+F)" };
Expand Down Expand Up @@ -261,25 +268,28 @@ public BuildControl(Build build, string logFilePath)
contextMenu.AddItem(viewSourceItem);
contextMenu.AddItem(viewFullTextItem);
contextMenu.AddItem(openFileItem);
contextMenu.AddItem(preprocessItem);
contextMenu.AddItem(searchNuGetItem);
contextMenu.AddItem(searchInSubtreeItem);
contextMenu.AddItem(searchInNodeByNameItem);
contextMenu.AddItem(searchThisNode);
contextMenu.AddItem(excludeSubtreeFromSearchItem);
contextMenu.AddItem(excludeNodeByNameFromSearch);
contextMenu.AddItem(goToTimeLineItem);
contextMenu.AddItem(goToTracingItem);
contextMenu.AddItem(copyItem);
contextMenu.AddItem(copySubtreeItem);
contextMenu.AddItem(copyFilePathItem);
contextMenu.AddItem(viewSubtreeTextItem);
contextMenu.AddItem(copyChildrenItem);
gotoMenuGroup.AddItem(preprocessItem);
contextMenu.AddItem(searchMenuGroup);
searchMenuGroup.AddItem(searchNuGetItem);
searchMenuGroup.AddItem(searchInSubtreeItem);
searchMenuGroup.AddItem(searchInNodeByNameItem);
searchMenuGroup.AddItem(searchThisNode);
searchMenuGroup.AddItem(excludeSubtreeFromSearchItem);
searchMenuGroup.AddItem(excludeNodeByNameFromSearch);
contextMenu.AddItem(gotoMenuGroup);
gotoMenuGroup.AddItem(goToTimeLineItem);
gotoMenuGroup.AddItem(goToTracingItem);
contextMenu.AddItem(copyMenuGroup);
copyMenuGroup.AddItem(copyItem);
copyMenuGroup.AddItem(copySubtreeItem);
copyMenuGroup.AddItem(copyFilePathItem);
gotoMenuGroup.AddItem(viewSubtreeTextItem);
copyMenuGroup.AddItem(copyChildrenItem);
contextMenu.AddItem(sortChildrenItem);
contextMenu.AddItem(filterChildrenItem);
contextMenu.AddItem(copyNameItem);
contextMenu.AddItem(copyValueItem);
contextMenu.AddItem(showTimeItem);
copyMenuGroup.AddItem(copyNameItem);
copyMenuGroup.AddItem(copyValueItem);
gotoMenuGroup.AddItem(showTimeItem);
contextMenu.AddItem(hideItem);

var treeViewItemStyle = TreeViewExtensions.CreateTreeViewItemStyleWithEvents<BaseNode, TreeViewItem>();
Expand Down Expand Up @@ -870,9 +880,9 @@ private string GetTaskTargetFramework(Task task)
private void ContextMenu_Opened(object sender, RoutedEventArgs e)
{
var node = treeView.SelectedItem as BaseNode;
var visibility = node is NameValueNode ? Visibility.Visible : Visibility.Collapsed;
copyNameItem.Visibility = visibility;
copyValueItem.Visibility = visibility;
var nameValueVisibility = node is NameValueNode ? Visibility.Visible : Visibility.Collapsed;
copyNameItem.Visibility = nameValueVisibility;
copyValueItem.Visibility = nameValueVisibility;
viewSourceItem.Visibility = CanView(node) ? Visibility.Visible : Visibility.Collapsed;
viewFullTextItem.Visibility = HasFullText(node) ? Visibility.Visible : Visibility.Collapsed;
openFileItem.Visibility = CanOpenFile(node) ? Visibility.Visible : Visibility.Collapsed;
Expand Down Expand Up @@ -937,6 +947,15 @@ private void ContextMenu_Opened(object sender, RoutedEventArgs e)
excludeNodeByNameFromSearch.Visibility = Visibility.Collapsed;
searchInNodeByNameItem.Visibility = Visibility.Collapsed;
}

searchMenuGroup.Visibility = searchMenuGroup.Items.Cast<MenuItem>().Any(p => p.Visibility != Visibility.Collapsed) ?
Visibility.Visible : Visibility.Collapsed;

copyMenuGroup.Visibility = copyMenuGroup.Items.Cast<MenuItem>().Any(p => p.Visibility != Visibility.Collapsed) ?
Visibility.Visible : Visibility.Collapsed;

gotoMenuGroup.Visibility = gotoMenuGroup.Items.Cast<MenuItem>().Any(p => p.Visibility != Visibility.Collapsed) ?
Visibility.Visible : Visibility.Collapsed;
}

private void SharedTreeContextMenu_Opened(object sender, RoutedEventArgs e)
Expand Down
1 change: 0 additions & 1 deletion src/StructuredLogger/Analyzers/CppAnalyzer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,6 @@ public CppAnalyzerNode(CppAnalyzer cppAnalyzer)
private bool globalLinkTime = false;

private TimeSpan oneMilliSecond = TimeSpan.FromMilliseconds(1);
private static HashSet<string> hashCppTasks = new HashSet<string>() { MultiToolTaskName, CLTaskName, LinkTaskName, LibTaskName };
private List<CppTimedNode> resultTimedNode = new List<CppTimedNode>();

public CppAnalyzer()
Expand Down
2 changes: 1 addition & 1 deletion src/StructuredLogger/ObjectModel/TextNode.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ public class TextNode : TreeNode
{
public string Text { get; set; }
public string ShortenedText => TextUtilities.ShortenValue(Text);
public bool IsTextShortened => Text != ShortenedText;
public bool IsTextShortened => Text.Length != TextUtilities.GetShortenLength(Text);
Comment thread
KirillOsenkov marked this conversation as resolved.
Outdated

public override string TypeName => nameof(TextNode);
public override string Title => Text ?? TypeName;
Expand Down
40 changes: 28 additions & 12 deletions src/StructuredLogger/TextUtilities.cs
Original file line number Diff line number Diff line change
Expand Up @@ -287,38 +287,54 @@ public static bool ContainsLineBreak(string text)
public const int MaxDisplayedValueLength = 260;
private const string TrimPrompt = "... (Space: view, Ctrl+C: copy)";

public static string ShortenValue(string text, string trimPrompt = TrimPrompt, int maxChars = MaxDisplayedValueLength)
public static int GetShortenLength(string text, int maxChars = MaxDisplayedValueLength)
{
if (text == null)
{
return text;
return 0;
}

int newLength = maxChars;
int lineBreak = text.IndexOfFirstLineBreak();
if (lineBreak == -1)
if (lineBreak != -1)
{
if (text.Length <= newLength)
if (lineBreak < maxChars)
{
return text;
return lineBreak;
}
}
else
{
if (lineBreak < newLength)
if (text.Length <= maxChars)
{
newLength = lineBreak;
return text.Length;
}
}

var shortText = text.Substring(0, newLength);
return maxChars;
}

public static string ShortenValue(string text, string trimPrompt = TrimPrompt, int maxChars = MaxDisplayedValueLength)
{
if (text == null)
{
return text;
}

int newLength = GetShortenLength(text, maxChars);

if (lineBreak == newLength && IsWhitespace(text, new Span(newLength, text.Length - newLength)))
if (text.Length != newLength)
{
return shortText + '\u21b5';
var shortText = text.Substring(0, newLength);

if (newLength <= maxChars && IsWhitespace(text, new Span(newLength, text.Length - newLength)))
{
return shortText + '\u21b5';
}

return shortText + trimPrompt;
}

return shortText + trimPrompt;
return text;
}

public static int IndexOfFirstLineBreak(this string text)
Expand Down