Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
26 changes: 20 additions & 6 deletions src/StructuredLogViewer.Avalonia/Controls/BuildControl.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,8 @@ public partial class BuildControl : UserControl

private MenuItem copyItem;
private MenuItem copySubtreeItem;
private MenuItem sortChildrenItem;
private MenuItem sortChildrenByNameItem;
private MenuItem sortChildrenByDurationItem;
private MenuItem copyNameItem;
private MenuItem copyValueItem;
private MenuItem viewSourceItem;
Expand Down Expand Up @@ -164,15 +165,17 @@ public BuildControl(Build build, string logFilePath)
//contextMenu.Opened += ContextMenu_Opened;
copyItem = new MenuItem() { Header = "Copy" };
copySubtreeItem = new MenuItem() { Header = "Copy subtree" };
sortChildrenItem = new MenuItem() { Header = "Sort children" };
sortChildrenByNameItem = new MenuItem() { Header = "Sort children by name" };
sortChildrenByDurationItem = new MenuItem() { Header = "Sort children by duration" };
copyNameItem = new MenuItem() { Header = "Copy name" };
copyValueItem = new MenuItem() { Header = "Copy value" };
viewSourceItem = new MenuItem() { Header = "View source" };
preprocessItem = new MenuItem() { Header = "Preprocess" };
hideItem = new MenuItem() { Header = "Hide" };
copyItem.Click += (s, a) => Copy();
copySubtreeItem.Click += (s, a) => CopySubtree(treeView);
sortChildrenItem.Click += (s, a) => SortChildren();
sortChildrenByNameItem.Click += (s, a) => SortChildrenByName();
sortChildrenByDurationItem.Click += (s, a) => SortChildrenByDuration();
copyNameItem.Click += (s, a) => CopyName();
copyValueItem.Click += (s, a) => CopyValue();
viewSourceItem.Click += (s, a) => Invoke(treeView.SelectedItem as BaseNode);
Expand All @@ -182,7 +185,8 @@ public BuildControl(Build build, string logFilePath)
contextMenu.AddItem(preprocessItem);
contextMenu.AddItem(copyItem);
contextMenu.AddItem(copySubtreeItem);
contextMenu.AddItem(sortChildrenItem);
contextMenu.AddItem(sortChildrenByNameItem);
contextMenu.AddItem(sortChildrenByDurationItem);
contextMenu.AddItem(copyNameItem);
contextMenu.AddItem(copyValueItem);
contextMenu.AddItem(hideItem);
Expand Down Expand Up @@ -475,7 +479,8 @@ private void ContextMenu_Opened(object sender, RoutedEventArgs e)
viewSourceItem.IsVisible = CanView(node);
var hasChildren = node is TreeNode t && t.HasChildren;
copySubtreeItem.IsVisible = hasChildren;
sortChildrenItem.IsVisible = hasChildren;
sortChildrenByNameItem.IsVisible = hasChildren;
sortChildrenByDurationItem.IsVisible = hasChildren;
preprocessItem.IsVisible = node is IPreprocessable p && preprocessedFileManager.CanPreprocess(p);
}

Expand Down Expand Up @@ -1006,7 +1011,7 @@ public void CopySubtree(TreeView tree = null)
}
}

public void SortChildren()
public void SortChildrenByName()
{
var selectedItem = treeView.SelectedItem;
if (selectedItem is TreeNode treeNode)
Expand All @@ -1015,6 +1020,15 @@ public void SortChildren()
}
}

public void SortChildrenByDuration()
{
var selectedItem = treeView.SelectedItem;
if (selectedItem is TreeNode treeNode)
{
treeNode.SortChildren(TreeNode.CompareByDuration);
}
}

private void CopyAll(TreeView tree = null)
{
tree = tree ?? ActiveTreeView;
Expand Down
29 changes: 22 additions & 7 deletions src/StructuredLogViewer/Controls/BuildControl.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,8 @@ public partial class BuildControl : UserControl
private MenuItem goToTimeLineItem;
private MenuItem goToTracingItem;
private MenuItem copyChildrenItem;
private MenuItem sortChildrenItem;
private MenuItem sortChildrenByNameItem;
private MenuItem sortChildrenByDurationItem;
private MenuItem filterChildrenItem;
private MenuItem copyNameItem;
private MenuItem copyValueItem;
Expand Down Expand Up @@ -217,7 +218,8 @@ public BuildControl(Build build, string logFilePath)
goToTimeLineItem = new MenuItem() { Header = "Timeline" };
goToTracingItem = new MenuItem() { Header = "Tracing" };
copyChildrenItem = new MenuItem() { Header = "Copy children" };
sortChildrenItem = new MenuItem() { Header = "Sort children" };
sortChildrenByNameItem = new MenuItem() { Header = "Sort children by name" };
sortChildrenByDurationItem = new MenuItem() { Header = "Sort children by duration" };
filterChildrenItem = new MenuItem() { Header = "Filter children (Ctrl+F)" };
copyNameItem = new MenuItem() { Header = "Copy name" };
copyValueItem = new MenuItem() { Header = "Copy value" };
Expand Down Expand Up @@ -255,7 +257,8 @@ public BuildControl(Build build, string logFilePath)
goToTimeLineItem.Click += (s, a) => GoToTimeLine();
goToTracingItem.Click += (s, a) => GoToTracing();
copyChildrenItem.Click += (s, a) => CopyChildren();
sortChildrenItem.Click += (s, a) => SortChildren();
sortChildrenByNameItem.Click += (s, a) => SortChildrenByName();
sortChildrenByDurationItem.Click += (s, a) => SortChildrenByDuration();
filterChildrenItem.Click += (s, a) => FilterChildren();
copyNameItem.Click += (s, a) => CopyName();
copyValueItem.Click += (s, a) => CopyValue();
Expand Down Expand Up @@ -313,7 +316,8 @@ public BuildControl(Build build, string logFilePath)

contextMenu.AddItem(separator1);

contextMenu.AddItem(sortChildrenItem);
contextMenu.AddItem(sortChildrenByNameItem);
contextMenu.AddItem(sortChildrenByDurationItem);
contextMenu.AddItem(filterChildrenItem);
contextMenu.AddItem(hideItem);

Expand Down Expand Up @@ -460,7 +464,8 @@ public void Dispose()
goToTimeLineItem = null;
goToTracingItem = null;
copyChildrenItem = null;
sortChildrenItem = null;
sortChildrenByNameItem = null;
sortChildrenByDurationItem = null;
filterChildrenItem = null;
copyNameItem = null;
copyValueItem = null;
Expand Down Expand Up @@ -939,7 +944,8 @@ private void ContextMenu_Opened(object sender, RoutedEventArgs e)
copySubtreeItem.Visibility = hasChildrenVisibility;
viewSubtreeTextItem.Visibility = hasChildrenVisibility;
copyChildrenItem.Visibility = hasChildrenVisibility;
sortChildrenItem.Visibility = hasChildrenVisibility;
sortChildrenByNameItem.Visibility = hasChildrenVisibility;
sortChildrenByDurationItem.Visibility = hasChildrenVisibility;
filterChildrenItem.Visibility = hasChildrenVisibility;
preprocessItem.Visibility = node is IPreprocessable p && preprocessedFileManager.CanPreprocess(p) ? Visibility.Visible : Visibility.Collapsed;
searchNuGetItem.Visibility = node is IProjectOrEvaluation ? Visibility.Visible : Visibility.Collapsed;
Expand Down Expand Up @@ -2106,7 +2112,7 @@ public void CopyChildren()
}
}

public void SortChildren()
public void SortChildrenByName()
{
var selectedItem = treeView.SelectedItem;
if (selectedItem is TreeNode treeNode)
Expand All @@ -2115,6 +2121,15 @@ public void SortChildren()
}
}

public void SortChildrenByDuration()
{
var selectedItem = treeView.SelectedItem;
if (selectedItem is TreeNode treeNode)
{
treeNode.SortChildren(TreeNode.CompareByDuration);
}
}

public void FilterChildren()
{
IsFindVisible = !IsFindVisible;
Expand Down
23 changes: 23 additions & 0 deletions src/StructuredLogger/ObjectModel/TreeNode.cs
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,29 @@ public void EnsureChildrenCapacity(int capacity)
private static int CompareByToString(BaseNode o1, BaseNode o2)
=> string.Compare(o1.ToString(), o2.ToString(), StringComparison.OrdinalIgnoreCase);

public static int CompareByDuration(BaseNode o1, BaseNode o2)
{
TimedNode timedNode1 = o1 as TimedNode;
TimedNode timedNode2 = o2 as TimedNode;

if (timedNode1 != null && timedNode2 != null)
{
return timedNode2.Duration.CompareTo(timedNode1.Duration);
}
else if (timedNode1 != null)
{
return -1;
}
else if (timedNode2 != null)
{
return 1;
}
else
{
return CompareByToString(o1, o2);
}
}

public void SortChildren(Comparison<BaseNode> comparison = null)
{
if (children == null || children.Count < 2)
Expand Down