diff --git a/Pilz.Cryptography/IUniquieID.cs b/Pilz.Cryptography/IUniquieID.cs new file mode 100644 index 0000000..34bc49e --- /dev/null +++ b/Pilz.Cryptography/IUniquieID.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Pilz.Cryptography +{ + public interface IUniquieID + { + bool HasID { get; } + string ID { get; } + + void GenerateIfNull(); + void Generate(); + bool Equals(object obj); + } +} diff --git a/Pilz.Cryptography/UniquieID.cs b/Pilz.Cryptography/UniquieID.cs index 16efa58..ddf2c08 100644 --- a/Pilz.Cryptography/UniquieID.cs +++ b/Pilz.Cryptography/UniquieID.cs @@ -9,7 +9,7 @@ using System.Threading.Tasks; namespace Pilz.Cryptography { - public class UniquieID + public class UniquieID : IUniquieID { private static int currentSimpleID = 0; @@ -90,9 +90,36 @@ namespace Pilz.Cryptography public override bool Equals(object obj) { + var res = false; var iD = obj as UniquieID; - return iD != null && - _iD == iD._iD; + + if (iD is object) + { + if (ReferenceEquals(res, iD)) + res = true; + else + { + var leftHasID = iD.HasID; + var rightHasID = HasID; + + if (!leftHasID && iD.GenerateOnGet) + { + iD.Generate(); + leftHasID = iD.HasID; + } + + if (!rightHasID && GenerateOnGet) + { + Generate(); + rightHasID = HasID; + } + + if (leftHasID && rightHasID) + res = _iD.Equals(iD._iD); + } + } + + return res; } public override int GetHashCode() @@ -104,7 +131,7 @@ namespace Pilz.Cryptography public static implicit operator UniquieID(string id) => new UniquieID() { ID = id }; public static implicit operator UniquieID(int id) => new UniquieID() { ID = Convert.ToString(id) }; - public static bool operator ==(UniquieID left, UniquieID right) => left.ID == right.ID; - public static bool operator !=(UniquieID left, UniquieID right) => left.ID != right.ID; + public static bool operator ==(UniquieID left, UniquieID right) => left.ID.Equals(right.ID); + public static bool operator !=(UniquieID left, UniquieID right) => !left.ID.Equals(right.ID); } } diff --git a/Pilz.UI/Utilities/DrawingControl.vb b/Pilz.UI/Utilities/DrawingControl.vb index 02b44a8..9dd45a4 100644 --- a/Pilz.UI/Utilities/DrawingControl.vb +++ b/Pilz.UI/Utilities/DrawingControl.vb @@ -1,4 +1,4 @@ -Imports System.Runtime.CompilerServices +Imports System.Runtime.CompilerServices Imports System.Windows.Forms Namespace Utils @@ -6,10 +6,19 @@ Namespace Utils Public Module DrawingControl Private Const WM_SETREDRAW = 11 + Private ReadOnly dicSuspendCount As New Dictionary(Of IntPtr, Integer) Public Sub SuspendDrawing(control As Control) - SendMessage(control.Handle, WM_SETREDRAW, False, 0) + If Not dicSuspendCount.ContainsKey(control.Handle) Then + dicSuspendCount.Add(control.Handle, 1) + Else + dicSuspendCount(control.Handle) += 1 + End If + + If dicSuspendCount(control.Handle) = 1 Then + SendMessage(control.Handle, WM_SETREDRAW, False, 0) + End If End Sub @@ -19,8 +28,19 @@ Namespace Utils Public Sub ResumeDrawing(control As Control, redraw As Boolean) - SendMessage(control.Handle, WM_SETREDRAW, True, 0) - If redraw Then control.Refresh() + Dim doRedraw As Boolean = True + + If dicSuspendCount.ContainsKey(control.Handle) Then + dicSuspendCount(control.Handle) -= 1 + If dicSuspendCount(control.Handle) >= 1 Then + doRedraw = False + End If + End If + + If doRedraw Then + SendMessage(control.Handle, WM_SETREDRAW, True, 0) + If redraw Then control.Refresh() + End If End Sub End Module