JD2022-TU1/main/extern/ProfileEventViewer4/DirSummary.cs

160 lines
6.6 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace ProfileEventViewer
{
public partial class DirSummary : Form
{
///////////////////////////////////////////////////////////////////////////////////////////////////////
class ListViewDirInfo : ListViewInfo
{
public string FileName { get; private set; }
public ProfileEventTrace Parent; // Not a property so that it is not saved in the CSV.
public ListViewDirInfo(ListViewInfo info, string fileName, ProfileEventTrace parent)
{
ProfileName = info.ProfileName;
TotalTime = info.TotalTime;
CallCount = info.CallCount;
ClockTime = info.ClockTime;
MinTimeExtent = info.MinTimeExtent;
MaxTimeExtent = info.MaxTimeExtent;
FileName = fileName;
Parent = parent;
}
}
private List<ListViewDirInfo> m_ListViewDirInfo = new List<ListViewDirInfo>();
private ListViewCache m_ListViewCache = new ListViewCache();
private SortInfo m_SortInfo = new SortInfo() { Ascending = true, Column = -1 };
public DirSummary()
{
InitializeComponent();
}
public void ClearAll()
{
m_ListViewDirInfo.Clear();
}
public void Populate(List<ListViewInfo> listViewInfo, string fileName, ProfileEventTrace parent)
{
foreach (ListViewInfo lvi in listViewInfo)
m_ListViewDirInfo.Add(new ListViewDirInfo(lvi, fileName, parent));
m_FileSummary.VirtualListSize = m_ListViewDirInfo.Count;
}
public void SortByColumnIndex(int columnIndex)
{
m_SortInfo.Ascending = (m_SortInfo.Column != columnIndex ? true : !m_SortInfo.Ascending);
m_SortInfo.Column = columnIndex;
int signChanger = m_SortInfo.Ascending ? 1 : -1;
if (m_SortInfo.Column == 0)
m_ListViewDirInfo.Sort((x, y) => signChanger * CaseInsensitiveComparer.Default.Compare(x.ProfileName, y.ProfileName));
else if (m_SortInfo.Column == 1)
m_ListViewDirInfo.Sort((x, y) => signChanger * Math.Sign(x.TotalTime - y.TotalTime));
else if (m_SortInfo.Column == 2)
m_ListViewDirInfo.Sort((x, y) => signChanger * Math.Sign(x.ClockTime - y.ClockTime));
else if (m_SortInfo.Column == 3)
m_ListViewDirInfo.Sort((x, y) => signChanger * x.CallCount.CompareTo(y.CallCount));
else if (m_SortInfo.Column == 4)
m_ListViewDirInfo.Sort((x, y) => signChanger * Math.Sign(x.TotalTime / x.CallCount - y.TotalTime / y.CallCount));
else if (m_SortInfo.Column == 5)
m_ListViewDirInfo.Sort((x, y) => signChanger * CaseInsensitiveComparer.Default.Compare(x.FileName, y.FileName));
m_ListViewCache.Clear();
m_FileSummary.Invalidate();
}
private void m_FileSummary_ColumnClick(object sender, ColumnClickEventArgs e)
{
SortByColumnIndex(e.Column);
}
private void buttonExportCSV_Click(object sender, EventArgs e)
{
SaveFileDialog fileDlg = new SaveFileDialog();
fileDlg.OverwritePrompt = true;
fileDlg.Filter = "CommaSeparated file (*.csv) | *.csv";
if (fileDlg.ShowDialog() == DialogResult.OK)
{
SaveCSV(fileDlg.FileName);
}
}
private void SaveCSV(string fileName)
{
StreamWriter sw = System.IO.File.CreateText(fileName);
foreach (System.Reflection.PropertyInfo property in typeof(ListViewDirInfo).GetProperties())
sw.Write(string.Format("{0};", property.Name));
sw.WriteLine();
foreach (ListViewDirInfo info in m_ListViewDirInfo)
{
foreach (System.Reflection.PropertyInfo property in typeof(ListViewDirInfo).GetProperties())
sw.Write(string.Format("{0};", property.GetValue(info, null).ToString()));
sw.WriteLine();
}
sw.Close();
MessageBox.Show(string.Format("File {0} created.", fileName));
}
private void m_FileSummary_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
{
if (m_ListViewCache.IsIndexInCache(e.ItemIndex))
{
// Item is in the cache; return that one.
e.Item = m_ListViewCache.GetListViewItem(e.ItemIndex);
return;
}
ListViewDirInfo info = m_ListViewDirInfo[e.ItemIndex];
ListViewItem item = new ListViewItem(info.ProfileName);
item.SubItems.Add(new ListViewItem.ListViewSubItem(item, info.Parent.TimeToString(info.TotalTime)));
item.SubItems.Add(new ListViewItem.ListViewSubItem(item, info.Parent.TimeToString(info.ClockTime)));
item.SubItems.Add(new ListViewItem.ListViewSubItem(item, info.CallCount.ToString()));
item.SubItems.Add(new ListViewItem.ListViewSubItem(item, info.Parent.TimeToString(info.MeanTime)));
item.SubItems.Add(new ListViewItem.ListViewSubItem(item, info.FileName));
e.Item = item;
}
private void m_FileSummary_CacheVirtualItems(object sender, CacheVirtualItemsEventArgs e)
{
if (m_ListViewCache.IsRangeInCache(e.StartIndex, e.EndIndex))
return; // Requested cache is a subset of the current one
List<ListViewItem> itemsToCache = new List<ListViewItem>(e.EndIndex - e.StartIndex + 1);
for (int i = e.StartIndex; i <= e.EndIndex; ++i)
{
ListViewDirInfo info = m_ListViewDirInfo[i];
ListViewItem item = new ListViewItem(info.ProfileName);
item.SubItems.Add(new ListViewItem.ListViewSubItem(item, info.Parent.TimeToString(info.TotalTime)));
item.SubItems.Add(new ListViewItem.ListViewSubItem(item, info.Parent.TimeToString(info.ClockTime)));
item.SubItems.Add(new ListViewItem.ListViewSubItem(item, info.CallCount.ToString()));
item.SubItems.Add(new ListViewItem.ListViewSubItem(item, info.Parent.TimeToString(info.MeanTime)));
item.SubItems.Add(new ListViewItem.ListViewSubItem(item, info.FileName));
itemsToCache.Add(item);
}
m_ListViewCache.Populate(itemsToCache, e.StartIndex);
}
}
}