From d6718cafeffc96014ab64e698cb63fae0a3d1113 Mon Sep 17 00:00:00 2001 From: wj32 Date: Sat, 20 Dec 2008 06:38:38 +0000 Subject: [PATCH] added sorting to the process tree! git-svn-id: svn://svn.code.sf.net/p/processhacker/code@353 21ef857c-d57f-4fe0-8362-d861dc6d29cd --- .../Components/ProcessTree/ProcessNode.cs | 2 +- .../ProcessTree/ProcessTree.Designer.cs | 3 + .../Components/ProcessTree/ProcessTree.cs | 23 +++++- .../ProcessTree/ProcessTreeModel.cs | 70 +++++++++++++++++++ trunk/ProcessHacker/ProcessHacker.csproj | 2 +- .../Providers/ProcessProvider.cs | 6 +- 6 files changed, 100 insertions(+), 6 deletions(-) diff --git a/trunk/ProcessHacker/Components/ProcessTree/ProcessNode.cs b/trunk/ProcessHacker/Components/ProcessTree/ProcessNode.cs index 6e738869d..dca0fe951 100644 --- a/trunk/ProcessHacker/Components/ProcessTree/ProcessNode.cs +++ b/trunk/ProcessHacker/Components/ProcessTree/ProcessNode.cs @@ -83,7 +83,7 @@ namespace ProcessHacker public string Memory { - get { return _pitem.MemoryUsage; } + get { return Misc.GetNiceSizeName(_pitem.MemoryUsage); } } public string CPU diff --git a/trunk/ProcessHacker/Components/ProcessTree/ProcessTree.Designer.cs b/trunk/ProcessHacker/Components/ProcessTree/ProcessTree.Designer.cs index 2decf579a..503172446 100644 --- a/trunk/ProcessHacker/Components/ProcessTree/ProcessTree.Designer.cs +++ b/trunk/ProcessHacker/Components/ProcessTree/ProcessTree.Designer.cs @@ -75,6 +75,7 @@ this.treeProcesses.TabIndex = 2; this.treeProcesses.UseColumns = true; this.treeProcesses.SelectionChanged += new System.EventHandler(this.treeProcesses_SelectionChanged); + this.treeProcesses.ColumnClicked += new System.EventHandler(this.treeProcesses_ColumnClicked); // // columnName // @@ -94,6 +95,7 @@ // columnMemory // this.columnMemory.Header = "Pvt. Memory"; + this.columnMemory.Sortable = true; this.columnMemory.SortOrder = System.Windows.Forms.SortOrder.None; this.columnMemory.TooltipText = null; this.columnMemory.Width = 70; @@ -101,6 +103,7 @@ // columnCPU // this.columnCPU.Header = "CPU"; + this.columnCPU.Sortable = true; this.columnCPU.SortOrder = System.Windows.Forms.SortOrder.None; this.columnCPU.TooltipText = null; this.columnCPU.Width = 40; diff --git a/trunk/ProcessHacker/Components/ProcessTree/ProcessTree.cs b/trunk/ProcessHacker/Components/ProcessTree/ProcessTree.cs index c43e35b59..bc9a4c928 100644 --- a/trunk/ProcessHacker/Components/ProcessTree/ProcessTree.cs +++ b/trunk/ProcessHacker/Components/ProcessTree/ProcessTree.cs @@ -69,6 +69,27 @@ namespace ProcessHacker this.KeyDown(sender, e); } + private void treeProcesses_ColumnClicked(object sender, TreeColumnEventArgs e) + { + if (e.Column.SortOrder == SortOrder.None) + { + e.Column.SortOrder = SortOrder.Ascending; + } + else if (e.Column.SortOrder == SortOrder.Ascending) + { + e.Column.SortOrder = SortOrder.Descending; + } + else + { + e.Column.SortOrder = SortOrder.None; + } + + _treeModel.CallStructureChanged(new TreePathEventArgs(new TreePath())); + + treeProcesses.Root.ExpandAll(); + this.RefreshItems(); + } + #region Properties public override bool Focused @@ -115,7 +136,7 @@ namespace ProcessHacker _provider = value; - treeProcesses.Model = _treeModel = new ProcessTreeModel(); + treeProcesses.Model = _treeModel = new ProcessTreeModel(this); if (_provider != null) { diff --git a/trunk/ProcessHacker/Components/ProcessTree/ProcessTreeModel.cs b/trunk/ProcessHacker/Components/ProcessTree/ProcessTreeModel.cs index 225cf7bf8..f040d8ebf 100644 --- a/trunk/ProcessHacker/Components/ProcessTree/ProcessTreeModel.cs +++ b/trunk/ProcessHacker/Components/ProcessTree/ProcessTreeModel.cs @@ -20,14 +20,21 @@ using System; using System.Collections.Generic; using Aga.Controls.Tree; +using System.Windows.Forms; namespace ProcessHacker { public class ProcessTreeModel : ITreeModel { + private ProcessTree _tree; private Dictionary _processes = new Dictionary(); private List _roots = new List(); + public ProcessTreeModel(ProcessTree tree) + { + _tree = tree; + } + public void Add(ProcessItem item) { ProcessNode itemNode = new ProcessNode(item); @@ -140,8 +147,63 @@ namespace ProcessHacker #region ITreeModel Members + public string GetSortColumn() + { + foreach (TreeColumn column in _tree.Tree.Columns) + if (column.SortOrder != SortOrder.None) + return column.Header.ToLower(); + + return ""; + } + + public SortOrder GetSortOrder() + { + foreach (TreeColumn column in _tree.Tree.Columns) + if (column.SortOrder != SortOrder.None) + return column.SortOrder; + + return SortOrder.None; + } + + public int ModifySort(int sortResult, SortOrder order) + { + if (order == SortOrder.Ascending) + return sortResult; + else if (order == SortOrder.Descending) + return sortResult * -1; + else + return 0; + } + public System.Collections.IEnumerable GetChildren(TreePath treePath) { + if (this.GetSortColumn() != "") + { + List nodes = new List(); + string sortC = this.GetSortColumn(); + SortOrder sortO = this.GetSortOrder(); + + nodes.AddRange(_processes.Values); + + nodes.Sort(new Comparison(delegate(ProcessNode n1, ProcessNode n2) + { + if (sortC == "name") + return ModifySort(n1.Name.CompareTo(n2.Name), sortO); + else if (sortC == "pid") + return ModifySort(n1.PID.CompareTo(n2.PID), sortO); + else if (sortC == "pvt. memory") + return ModifySort(n1.ProcessItem.MemoryUsage.CompareTo(n2.ProcessItem.MemoryUsage), sortO); + else if (sortC == "cpu") + return ModifySort(n1.ProcessItem.CPUUsage.CompareTo(n2.ProcessItem.CPUUsage), sortO); + else if (sortC == "username") + return ModifySort(n1.Username.CompareTo(n2.Username), sortO); + else + return 0; + })); + + return nodes; + } + if (treePath.IsEmpty()) return _roots; else @@ -150,6 +212,9 @@ namespace ProcessHacker public bool IsLeaf(TreePath treePath) { + if (this.GetSortColumn() != "") + return true; + if (treePath.IsEmpty()) return false; else @@ -164,6 +229,11 @@ namespace ProcessHacker public event EventHandler StructureChanged; + public void CallStructureChanged(TreePathEventArgs args) + { + this.StructureChanged(this, args); + } + #endregion } } diff --git a/trunk/ProcessHacker/ProcessHacker.csproj b/trunk/ProcessHacker/ProcessHacker.csproj index 45f1533fe..efb16033f 100644 --- a/trunk/ProcessHacker/ProcessHacker.csproj +++ b/trunk/ProcessHacker/ProcessHacker.csproj @@ -477,6 +477,6 @@ --> - "$(SolutionDir)\ProcessHacker\Build\merge_and_clean.cmd" "$(SolutionDir)\ProcessHacker\$(OutDir)" + if $(ConfigurationName)==Release "$(SolutionDir)\ProcessHacker\Build\merge_and_clean.cmd" "$(SolutionDir)\ProcessHacker\$(OutDir)" \ No newline at end of file diff --git a/trunk/ProcessHacker/Providers/ProcessProvider.cs b/trunk/ProcessHacker/Providers/ProcessProvider.cs index a4bd1868f..258cc3b35 100644 --- a/trunk/ProcessHacker/Providers/ProcessProvider.cs +++ b/trunk/ProcessHacker/Providers/ProcessProvider.cs @@ -33,7 +33,7 @@ namespace ProcessHacker public Icon Icon; public string CmdLine; public float CPUUsage; - public string MemoryUsage; + public long MemoryUsage; public string Name; public string Username; @@ -147,7 +147,7 @@ namespace ProcessHacker try { - item.MemoryUsage = Misc.GetNiceSizeName(p.PrivateMemorySize64); + item.MemoryUsage = p.PrivateMemorySize64; } catch { } @@ -251,7 +251,7 @@ namespace ProcessHacker try { - newitem.MemoryUsage = Misc.GetNiceSizeName(p.PrivateMemorySize64); + newitem.MemoryUsage = p.PrivateMemorySize64; } catch { }