160 lines
6.6 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|