diff --git a/Business/KeyboardInput.cs b/Business/KeyboardInput.cs index bf2a1e2..c96a12a 100644 --- a/Business/KeyboardInput.cs +++ b/Business/KeyboardInput.cs @@ -217,7 +217,7 @@ namespace SystemTrayMenu.Handler DataGridView dgv = menu.GetDataGridView(); if (dgv.Rows.Count > 0) { - Select(dgv, 0); + Select(dgv, 0, true); } } @@ -463,7 +463,7 @@ namespace SystemTrayMenu.Handler return found; } - public void Select(DataGridView dgv, int i) + public void Select(DataGridView dgv, int i, bool refreshview) { int newiMenuKey = ((Menu)dgv.TopLevelControl).Level; if (i != iRowKey || newiMenuKey != iMenuKey) @@ -475,8 +475,11 @@ namespace SystemTrayMenu.Handler DataGridViewRow row = dgv.Rows[i]; RowData rowData = (RowData)row.Cells[2].Value; rowData.IsSelected = true; - row.Selected = false; //event trigger - row.Selected = true; //event trigger + if (refreshview) + { + row.Selected = false; //event trigger + row.Selected = true; //event trigger + } } private bool Select(DataGridView dgv, int i, diff --git a/Business/Menus.cs b/Business/Menus.cs index 2522bbd..2dce7b4 100644 --- a/Business/Menus.cs +++ b/Business/Menus.cs @@ -1,4 +1,5 @@ -using System; +using Clearcove.Logging; +using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; @@ -78,12 +79,13 @@ namespace SystemTrayMenu.Business workerSubMenu.CancelAsync(); } } + waitToOpenMenu.StartLoadMenu += StartLoadMenu; void StartLoadMenu(RowData rowData) { if (menus[0].IsUsable && - menus[rowData.MenuLevel] == null || - menus[rowData.MenuLevel].Tag as RowData != rowData) + menus[rowData.MenuLevel + 1] == null || + menus[rowData.MenuLevel + 1].Tag as RowData != rowData) { LoadStarted(); BackgroundWorker workerSubMenu = workersSubMenu. @@ -164,6 +166,7 @@ namespace SystemTrayMenu.Business internal void SwitchOpenClose(bool byClick) { + waitToOpenMenu.MouseActive = byClick; if (byClick && (DateTime.Now - deactivatedTime).TotalMilliseconds < 200) { //By click on notifyicon the menu gets deactivated and closed @@ -471,10 +474,10 @@ namespace SystemTrayMenu.Business } DataGridView dgv = menu.GetDataGridView(); dgv.CellMouseEnter += waitToOpenMenu.MouseEnter; - dgv.CellMouseEnter += Dgv_CellMouseEnter; - void Dgv_CellMouseEnter(object sender, DataGridViewCellEventArgs e) + waitToOpenMenu.MouseEnterOk += Dgv_CellMouseEnter; + void Dgv_CellMouseEnter(DataGridView dgv, int rowIndex) { - if (menus[0].IsUsable && waitToOpenMenu.MouseActive) + if (menus[0].IsUsable) { if (keyboardInput.InUse) { @@ -482,7 +485,7 @@ namespace SystemTrayMenu.Business keyboardInput.InUse = false; } - keyboardInput.Select(dgv, e.RowIndex); + keyboardInput.Select(dgv, rowIndex, false); } } dgv.CellMouseLeave += waitToOpenMenu.MouseLeave; @@ -558,18 +561,18 @@ namespace SystemTrayMenu.Business row.DefaultCellStyle.SelectionBackColor = Color.White; row.Selected = false; } - else if (rowData.IsSelected) - { - row.DefaultCellStyle.SelectionBackColor = - MenuDefines.ColorSelectedItem; - row.Selected = true; - } else if (rowData.IsMenuOpen) { row.DefaultCellStyle.SelectionBackColor = MenuDefines.ColorOpenFolder; row.Selected = true; } + else if (rowData.IsSelected) + { + row.DefaultCellStyle.SelectionBackColor = + MenuDefines.ColorSelectedItem; + row.Selected = true; + } else { row.DefaultCellStyle.SelectionBackColor = Color.White; diff --git a/Business/WaitToLoadMenu.cs b/Business/WaitToLoadMenu.cs index 05965d0..b678636 100644 --- a/Business/WaitToLoadMenu.cs +++ b/Business/WaitToLoadMenu.cs @@ -11,15 +11,18 @@ namespace SystemTrayMenu.Handler { internal event Action StartLoadMenu; internal event EventHandlerEmpty StopLoadMenu; + internal event Action MouseEnterOk; private readonly Timer timerStartLoad = new Timer(); private DataGridView dgv = null; private int rowIndex = 0; + private DataGridView dgvTmp = null; + private int rowIndexTmp = 0; internal bool MouseActive = false; private int mouseMoveEvents = 0; private DateTime dateTimeLastMouseMoveEvent = DateTime.Now; - private bool checkForMouseActive = false; + private bool checkForMouseActive = true; internal WaitToLoadMenu() { @@ -29,11 +32,21 @@ namespace SystemTrayMenu.Handler internal void MouseEnter(object sender, DataGridViewCellEventArgs e) { - timerStartLoad.Stop(); - StopLoadMenu.Invoke(); - SetData((DataGridView)sender, e.RowIndex, MouseActive); - checkForMouseActive = true; - timerStartLoad.Start(); + if (MouseActive) + { + DataGridView dgv = (DataGridView)sender; + MouseEnterOk(dgv, e.RowIndex); + timerStartLoad.Stop(); + StopLoadMenu.Invoke(); + checkForMouseActive = true; + SetData(dgv, e.RowIndex); + timerStartLoad.Start(); + } + else + { + this.dgvTmp = (DataGridView)sender; + this.rowIndexTmp = e.RowIndex; + } } internal void RowSelected(DataGridView dgv, int rowIndex) @@ -48,9 +61,12 @@ namespace SystemTrayMenu.Handler internal void MouseLeave(object sender, DataGridViewCellEventArgs e) { - timerStartLoad.Stop(); - StopLoadMenu.Invoke(); - ResetData((DataGridView)sender, e.RowIndex); + if (MouseActive) + { + timerStartLoad.Stop(); + StopLoadMenu.Invoke(); + ResetData((DataGridView)sender, e.RowIndex); + } } internal void RowDeselected(int iMenuBefore, int rowIndex, DataGridView dgv) //iMenuBefore not needed @@ -88,6 +104,11 @@ namespace SystemTrayMenu.Handler if (mouseMoveEvents > 3) { MouseActive = true; + if (dgvTmp != null && !dgvTmp.IsDisposed) + { + MouseEnter(dgvTmp, new DataGridViewCellEventArgs( + 0, rowIndexTmp)); + } mouseMoveEvents = 0; } else if (DateTime.Now - dateTimeLastMouseMoveEvent < @@ -128,16 +149,14 @@ namespace SystemTrayMenu.Handler } } - private void SetData(DataGridView dgv, int rowIndex, bool select = true) + private void SetData(DataGridView dgv, int rowIndex) { + dgvTmp = null; this.dgv = dgv; this.rowIndex = rowIndex; RowData rowData = (RowData)dgv.Rows[rowIndex].Cells[2].Value; - if (select) - { - rowData.IsSelected = true; - dgv.Rows[rowIndex].Selected = true; - } + rowData.IsSelected = true; + dgv.Rows[rowIndex].Selected = true; } private void ResetData(DataGridView dgv, int rowIndex) @@ -156,6 +175,8 @@ namespace SystemTrayMenu.Handler { timerStartLoad.Stop(); timerStartLoad.Dispose(); + dgv.Dispose(); + dgvTmp.Dispose(); } } } \ No newline at end of file diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index eca423a..9e8358a 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -35,5 +35,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.11.0.0")] -[assembly: AssemblyFileVersion("0.11.0.0")] +[assembly: AssemblyVersion("0.11.1.0")] +[assembly: AssemblyFileVersion("0.11.1.0")] diff --git a/Utilities/File/IconReader.cs b/Utilities/File/IconReader.cs index 94d654e..f64b825 100644 --- a/Utilities/File/IconReader.cs +++ b/Utilities/File/IconReader.cs @@ -20,7 +20,7 @@ namespace SystemTrayMenu.Utilities public static class IconReader { private static readonly ConcurrentDictionary dictIconCache = new ConcurrentDictionary(); - + private static readonly Object readIcon = new Object(); public enum IconSize { Large = 0, //32x32 pixels @@ -46,18 +46,20 @@ namespace SystemTrayMenu.Utilities { Icon icon = null; string extension = Path.GetExtension(filePath); - - if (IsExtensionWitSameIcon(extension)) + lock (readIcon) { - icon = dictIconCache.GetOrAdd(extension, GetIcon); - Icon GetIcon(string keyExtension) + if (IsExtensionWitSameIcon(extension)) { - return GetFileIcon(filePath, linkOverlay, size); + icon = dictIconCache.GetOrAdd(extension, GetIcon); + Icon GetIcon(string keyExtension) + { + return GetFileIcon(filePath, linkOverlay, size); + } + } + else + { + icon = GetFileIcon(filePath, linkOverlay, size); } - } - else - { - icon = GetFileIcon(filePath, linkOverlay, size); } return icon;