diff --git a/trunk/ProcessHacker/Components/ProcessTree/ProcessTree.cs b/trunk/ProcessHacker/Components/ProcessTree/ProcessTree.cs index 0aba57bd2..599a47ffe 100644 --- a/trunk/ProcessHacker/Components/ProcessTree/ProcessTree.cs +++ b/trunk/ProcessHacker/Components/ProcessTree/ProcessTree.cs @@ -45,6 +45,9 @@ namespace ProcessHacker treeProcesses.DoubleClick += new EventHandler(treeProcesses_DoubleClick); nodeName.ToolTipProvider = new ProcessToolTipProvider(this); + + // make it draw when we want it to draw :) + treeProcesses.BeginUpdate(); } private void treeProcesses_DoubleClick(object sender, EventArgs e) @@ -140,6 +143,7 @@ namespace ProcessHacker _provider.DictionaryAdded -= new ProcessSystemProvider.ProviderDictionaryAdded(provider_DictionaryAdded); _provider.DictionaryModified -= new ProcessSystemProvider.ProviderDictionaryModified(provider_DictionaryModified); _provider.DictionaryRemoved -= new ProcessSystemProvider.ProviderDictionaryRemoved(provider_DictionaryRemoved); + _provider.BeforeUpdate -= new Provider.ProviderUpdateOnce(_provider_BeforeUpdate); } _provider = value; @@ -158,13 +162,17 @@ namespace ProcessHacker _provider.DictionaryAdded += new ProcessSystemProvider.ProviderDictionaryAdded(provider_DictionaryAdded); _provider.DictionaryModified += new ProcessSystemProvider.ProviderDictionaryModified(provider_DictionaryModified); _provider.DictionaryRemoved += new ProcessSystemProvider.ProviderDictionaryRemoved(provider_DictionaryRemoved); + _provider.BeforeUpdate += new Provider.ProviderUpdateOnce(_provider_BeforeUpdate); } } } #endregion - #region Core Process List + private void _provider_BeforeUpdate() + { + treeProcesses.Invalidate(); + } private void PerformDelayed(int delay, MethodInvoker action) { @@ -211,11 +219,16 @@ namespace ProcessHacker { node.State = TreeNodeAdv.NodeState.New; this.PerformDelayed(Properties.Settings.Default.HighlightingDuration, - new MethodInvoker(delegate { node.State = TreeNodeAdv.NodeState.Normal; })); + new MethodInvoker(delegate + { + node.State = TreeNodeAdv.NodeState.Normal; + treeProcesses.Invalidate(); + })); } node.BackColor = GetProcessColor(item); node.ExpandAll(); + treeProcesses.Invalidate(); } } } @@ -248,7 +261,16 @@ namespace ProcessHacker { node.State = TreeNodeAdv.NodeState.Removed; this.PerformDelayed(Properties.Settings.Default.HighlightingDuration, - new MethodInvoker(delegate { try { _treeModel.Remove(item); } catch { } })); + new MethodInvoker(delegate + { + try + { + _treeModel.Remove(item); + } + catch { } + })); + + treeProcesses.Invalidate(); } } } @@ -292,8 +314,6 @@ namespace ProcessHacker return treeProcesses.GetPath(node).LastNode as ProcessNode; } - #endregion - #region Interfacing public void BeginUpdate() diff --git a/trunk/ProcessHacker/Components/ProcessTree/ProcessTreeModel.cs b/trunk/ProcessHacker/Components/ProcessTree/ProcessTreeModel.cs index f3d8318ce..ced9b6fc6 100644 --- a/trunk/ProcessHacker/Components/ProcessTree/ProcessTreeModel.cs +++ b/trunk/ProcessHacker/Components/ProcessTree/ProcessTreeModel.cs @@ -115,6 +115,8 @@ namespace ProcessHacker catch { } } + + _tree.Invalidate(); } public TreePath GetPath(ProcessNode node) diff --git a/trunk/ProcessHacker/Providers/ProcessSystemProvider.cs b/trunk/ProcessHacker/Providers/ProcessSystemProvider.cs index 2de7529ed..19bfee7aa 100644 --- a/trunk/ProcessHacker/Providers/ProcessSystemProvider.cs +++ b/trunk/ProcessHacker/Providers/ProcessSystemProvider.cs @@ -84,6 +84,8 @@ namespace ProcessHacker public float CurrentCPUUsage { get; private set; } public int PIDWithMostCPUUsage { get; private set; } + public bool PerformanceEnabled { get; set; } + private void UpdateProcessorPerf() { using (MemoryAlloc data = @@ -121,6 +123,9 @@ namespace ProcessHacker private void UpdatePerformance() { + if (!this.PerformanceEnabled) + return; + int retLen; Win32.SYSTEM_PERFORMANCE_INFORMATION performance = new Win32.SYSTEM_PERFORMANCE_INFORMATION(); @@ -387,15 +392,18 @@ namespace ProcessHacker catch { } - newdictionary[pid] = newitem; - if (newitem.MemoryUsage != item.MemoryUsage || newitem.CPUUsage != item.CPUUsage || newitem.IsBeingDebugged != item.IsBeingDebugged || newitem.IsVirtualizationEnabled != item.IsVirtualizationEnabled) - { + { + newdictionary[pid] = newitem; this.CallDictionaryModified(item, newitem); } + else if (Win32.ProcessesWithThreads.ContainsKey(pid)) + { + newdictionary[pid] = newitem; + } } } diff --git a/trunk/ProcessHacker/Providers/Provider.cs b/trunk/ProcessHacker/Providers/Provider.cs index 2a9f18645..f613b37e2 100644 --- a/trunk/ProcessHacker/Providers/Provider.cs +++ b/trunk/ProcessHacker/Providers/Provider.cs @@ -76,6 +76,8 @@ namespace ProcessHacker protected event System.Windows.Forms.MethodInvoker Killed; + public event ProviderUpdateOnce BeforeUpdate; + /// /// Occurs when the provider has been updated. /// @@ -203,6 +205,9 @@ namespace ProcessHacker if (ProviderUpdate != null) { + if (BeforeUpdate != null) + BeforeUpdate(); + try { ProviderUpdate(); diff --git a/trunk/ProcessHacker/Win32/Win32.cs b/trunk/ProcessHacker/Win32/Win32.cs index 408cc4c5c..f35c41e6b 100644 --- a/trunk/ProcessHacker/Win32/Win32.cs +++ b/trunk/ProcessHacker/Win32/Win32.cs @@ -484,23 +484,20 @@ namespace ProcessHacker while (true) { currentProcess.Process = data.ReadStruct(i, 0); - currentProcess.Threads = new Dictionary(); currentProcess.Name = ReadUnicodeString(currentProcess.Process.ImageName); - if (ProcessesWithThreads.ContainsKey(currentProcess.Process.ProcessId)) + if (ProcessesWithThreads.ContainsKey(currentProcess.Process.ProcessId) && + currentProcess.Process.ProcessId != 0) { - try - { - for (int j = 0; j < currentProcess.Process.NumberOfThreads; j++) - { - Win32.SYSTEM_THREAD_INFORMATION thread = data.ReadStruct(i + - Marshal.SizeOf(typeof(SYSTEM_PROCESS_INFORMATION)), j); + currentProcess.Threads = new Dictionary(); - currentProcess.Threads.Add(thread.ClientId.UniqueThread, thread); - } + for (int j = 0; j < currentProcess.Process.NumberOfThreads; j++) + { + Win32.SYSTEM_THREAD_INFORMATION thread = data.ReadStruct(i + + Marshal.SizeOf(typeof(SYSTEM_PROCESS_INFORMATION)), j); + + currentProcess.Threads.Add(thread.ClientId.UniqueThread, thread); } - catch - { } } returnProcesses.Add(currentProcess.Process.ProcessId, currentProcess); diff --git a/trunk/TreeViewAdv/Tree/NodeControls/BaseTextControl.cs b/trunk/TreeViewAdv/Tree/NodeControls/BaseTextControl.cs index c9b427b32..be51c1d2c 100644 --- a/trunk/TreeViewAdv/Tree/NodeControls/BaseTextControl.cs +++ b/trunk/TreeViewAdv/Tree/NodeControls/BaseTextControl.cs @@ -120,13 +120,16 @@ namespace Aga.Controls.Tree.NodeControls CheckThread(); Font font = GetDrawingFont(node, context, label); Size s = Size.Empty; - if (UseCompatibleTextRendering) - s = TextRenderer.MeasureText(label, font); - else - { - SizeF sf = context.Graphics.MeasureString(label, font); - s = Size.Ceiling(sf); - } + + if (!UseCompatibleTextRendering) + { + SizeF sf = context.Graphics.MeasureString(label, font); + s = Size.Ceiling(sf); + } + else + { + s = TextRenderer.MeasureText(label, font); + } if (!s.IsEmpty) return s; @@ -182,10 +185,10 @@ namespace Aga.Controls.Tree.NodeControls _focusPen.Color = SystemColors.InactiveCaption; context.Graphics.DrawRectangle(_focusPen, focusRect); } - if (UseCompatibleTextRendering) - TextRenderer.DrawText(context.Graphics, label, font, bounds, textColor, _formatFlags); - else + if (!UseCompatibleTextRendering) context.Graphics.DrawString(label, font, GetFrush(textColor), bounds, _format); + else + TextRenderer.DrawText(context.Graphics, label, font, bounds, textColor, _formatFlags); } private static Dictionary _brushes = new Dictionary(); diff --git a/trunk/TreeViewAdv/Tree/TreeColumn.cs b/trunk/TreeViewAdv/Tree/TreeColumn.cs index 515da346a..ae8327808 100644 --- a/trunk/TreeViewAdv/Tree/TreeColumn.cs +++ b/trunk/TreeViewAdv/Tree/TreeColumn.cs @@ -217,19 +217,12 @@ namespace Aga.Controls.Tree #region Draw - private static VisualStyleRenderer _normalRenderer; - private static VisualStyleRenderer _pressedRenderer; - private static VisualStyleRenderer _hotRenderer; - - private static void CreateRenderers() - { - if (Application.RenderWithVisualStyles && _normalRenderer == null) - { - _normalRenderer = new VisualStyleRenderer(VisualStyleElement.Header.Item.Normal); - _pressedRenderer = new VisualStyleRenderer(VisualStyleElement.Header.Item.Pressed); - _hotRenderer = new VisualStyleRenderer(VisualStyleElement.Header.Item.Hot); - } - } + private static VisualStyleRenderer _normalRenderer + = new VisualStyleRenderer(VisualStyleElement.Header.Item.Normal); + private static VisualStyleRenderer _pressedRenderer + = new VisualStyleRenderer(VisualStyleElement.Header.Item.Pressed); + private static VisualStyleRenderer _hotRenderer + = new VisualStyleRenderer(VisualStyleElement.Header.Item.Hot); internal Bitmap CreateGhostImage(Rectangle bounds, Font font) { @@ -242,7 +235,7 @@ namespace Aga.Controls.Tree } internal void Draw(Graphics gr, Rectangle bounds, Font font, bool pressed, bool hot) - { + { DrawBackground(gr, bounds, pressed, hot); DrawContent(gr, bounds, font); } @@ -303,10 +296,9 @@ namespace Aga.Controls.Tree } internal static void DrawBackground(Graphics gr, Rectangle bounds, bool pressed, bool hot) - { + { if (Application.RenderWithVisualStyles) { - CreateRenderers(); if (pressed) _pressedRenderer.DrawBackground(gr, bounds); else if (hot) diff --git a/trunk/TreeViewAdv/Tree/TreeViewAdv.Input.cs b/trunk/TreeViewAdv/Tree/TreeViewAdv.Input.cs index 820634449..6423058fd 100644 --- a/trunk/TreeViewAdv/Tree/TreeViewAdv.Input.cs +++ b/trunk/TreeViewAdv/Tree/TreeViewAdv.Input.cs @@ -11,6 +11,7 @@ namespace Aga.Controls.Tree { public partial class TreeViewAdv { + // Note by wj32: I've added a whole bunch of this.Invalidate()s that are necessary for PH. #region Keys protected override bool IsInputChar(char charCode) @@ -65,7 +66,8 @@ namespace Aga.Controls.Tree break; } } - } + } + this.Invalidate(); } protected override void OnKeyUp(KeyEventArgs e) @@ -91,7 +93,8 @@ namespace Aga.Controls.Tree { base.OnKeyPress(e); if (!e.Handled) - _search.Search(e.KeyChar); + _search.Search(e.KeyChar); + this.Invalidate(); } #endregion @@ -159,6 +162,7 @@ namespace Aga.Controls.Tree Input.MouseDown(args); base.OnMouseDown(e); + this.Invalidate(); } protected override void OnMouseClick(MouseEventArgs e) diff --git a/trunk/TreeViewAdv/Tree/TreeViewAdv.cs b/trunk/TreeViewAdv/Tree/TreeViewAdv.cs index 3a60fc3a3..1beda5eda 100644 --- a/trunk/TreeViewAdv/Tree/TreeViewAdv.cs +++ b/trunk/TreeViewAdv/Tree/TreeViewAdv.cs @@ -39,6 +39,7 @@ namespace Aga.Controls.Tree private IncrementalSearch _search; private List _expandingNodes = new List(); private AbortableThreadPool _threadPool = new AbortableThreadPool(); + private Stack _suspendedStack = new Stack(); #region Public Events @@ -270,18 +271,20 @@ namespace Aga.Controls.Tree public void BeginUpdate() { + _suspendedStack.Push(_suspendUpdate); _suspendUpdate = true; - SuspendSelectionEvent = true; + //SuspendSelectionEvent = true; } public void EndUpdate() { - _suspendUpdate = false; + _suspendUpdate = _suspendedStack.Pop(); + if (_needFullUpdate) FullUpdate(); else UpdateView(); - SuspendSelectionEvent = false; + //SuspendSelectionEvent = false; } public void ExpandAll() @@ -371,6 +374,7 @@ namespace Aga.Controls.Tree ArrangeControls(); SafeUpdateScrollBars(); base.OnSizeChanged(e); + this.Invalidate(); } private void ArrangeControls() @@ -821,11 +825,13 @@ namespace Aga.Controls.Tree private void _vScrollBar_ValueChanged(object sender, EventArgs e) { FirstVisibleRow = _vScrollBar.Value; + this.Invalidate(); } private void _hScrollBar_ValueChanged(object sender, EventArgs e) { - OffsetX = _hScrollBar.Value; + OffsetX = _hScrollBar.Value; + this.Invalidate(); } internal void SmartFullUpdate() @@ -867,7 +873,7 @@ namespace Aga.Controls.Tree } if (flag) - OnSelectionChanged(); + OnSelectionChanged(); } internal void ChangeColumnWidth(TreeColumn column) @@ -1046,6 +1052,9 @@ namespace Aga.Controls.Tree } //else // throw new ArgumentException("Path not found"); + + this.FullUpdate(); + this.Invalidate(); } private void _model_NodesRemoved(object sender, TreeModelEventArgs e)