From 0b28770d1a05cb2df27e1504cbf0120e815d96e8 Mon Sep 17 00:00:00 2001 From: Frank Skare Date: Sun, 16 May 2021 16:49:43 +0200 Subject: [PATCH] - --- .../RatingExtension/RatingExtension.cs | 5 +- .../RatingExtension/RatingExtension.csproj | 1 + src/Misc/App.cs | 5 +- src/Misc/UpdateCheck.cs | 3 +- src/Native/TaskDialog.cs | 12 +- src/WPF/ConfWindow.xaml.cs | 5 +- src/WPF/InputWindow.xaml.cs | 11 +- src/WPF/SetupWindow.xaml.cs | 3 +- src/WinForms/MainForm.cs | 2 + src/WinForms/TaskDialog/CheckBoxRendererEx.vb | 70 + src/WinForms/TaskDialog/ColorHSL.vb | 164 ++ src/WinForms/TaskDialog/Mathf.vb | 116 + src/WinForms/TaskDialog/Misc.vb | 69 + src/WinForms/TaskDialog/Msg.vb | 82 + .../My Project/Application.Designer.vb | 13 + .../TaskDialog/My Project/Application.myapp | 10 + .../TaskDialog/My Project/AssemblyInfo.vb | 35 + .../My Project/Resources.Designer.vb | 63 + .../TaskDialog/My Project/Resources.resx | 117 + .../My Project/Settings.Designer.vb | 73 + .../TaskDialog/My Project/Settings.settings | 7 + src/WinForms/TaskDialog/StockIcon.vb | 144 ++ src/WinForms/TaskDialog/Symbol.vb | 2059 +++++++++++++++++ src/WinForms/TaskDialog/TaskDialog.sln | 25 + src/WinForms/TaskDialog/TaskDialog.vb | 486 ++++ src/WinForms/TaskDialog/TaskDialog.vbproj | 131 ++ .../TaskDialog/TaskDialogBaseForm.Designer.vb | 247 ++ .../TaskDialog/TaskDialogBaseForm.resx | 120 + src/WinForms/TaskDialog/TaskDialogBaseForm.vb | 1603 +++++++++++++ src/mpv.net.csproj | 7 +- src/mpv.net.sln | 6 + 31 files changed, 5677 insertions(+), 17 deletions(-) create mode 100644 src/WinForms/TaskDialog/CheckBoxRendererEx.vb create mode 100644 src/WinForms/TaskDialog/ColorHSL.vb create mode 100644 src/WinForms/TaskDialog/Mathf.vb create mode 100644 src/WinForms/TaskDialog/Misc.vb create mode 100644 src/WinForms/TaskDialog/Msg.vb create mode 100644 src/WinForms/TaskDialog/My Project/Application.Designer.vb create mode 100644 src/WinForms/TaskDialog/My Project/Application.myapp create mode 100644 src/WinForms/TaskDialog/My Project/AssemblyInfo.vb create mode 100644 src/WinForms/TaskDialog/My Project/Resources.Designer.vb create mode 100644 src/WinForms/TaskDialog/My Project/Resources.resx create mode 100644 src/WinForms/TaskDialog/My Project/Settings.Designer.vb create mode 100644 src/WinForms/TaskDialog/My Project/Settings.settings create mode 100644 src/WinForms/TaskDialog/StockIcon.vb create mode 100644 src/WinForms/TaskDialog/Symbol.vb create mode 100644 src/WinForms/TaskDialog/TaskDialog.sln create mode 100644 src/WinForms/TaskDialog/TaskDialog.vb create mode 100644 src/WinForms/TaskDialog/TaskDialog.vbproj create mode 100644 src/WinForms/TaskDialog/TaskDialogBaseForm.Designer.vb create mode 100644 src/WinForms/TaskDialog/TaskDialogBaseForm.resx create mode 100644 src/WinForms/TaskDialog/TaskDialogBaseForm.vb diff --git a/src/Extensions/RatingExtension/RatingExtension.cs b/src/Extensions/RatingExtension/RatingExtension.cs index 649d222..542681e 100644 --- a/src/Extensions/RatingExtension/RatingExtension.cs +++ b/src/Extensions/RatingExtension/RatingExtension.cs @@ -17,7 +17,7 @@ using System.Collections.Generic; using System.ComponentModel.Composition; using System.IO; using System.Threading; - +using System.Windows.Forms; using Microsoft.VisualBasic.FileIO; using mpvnet; @@ -91,7 +91,8 @@ namespace RatingExtension // the assembly name must end with 'Extension' } } else if (args[1] == "about") - Msg.Show("Rating Extension", "This extension writes a rating to the filename of rated videos when mpv.net shuts down.\n\nThe input.conf defaults contain key bindings for this extension to set ratings."); + MessageBox.Show("This extension writes a rating to the filename of rated videos when mpv.net shuts down.\n\nThe input.conf defaults contain key bindings for this extension to set ratings.", + "Rating Extension"); } void Delete(int rating) diff --git a/src/Extensions/RatingExtension/RatingExtension.csproj b/src/Extensions/RatingExtension/RatingExtension.csproj index f82832d..1615c2c 100644 --- a/src/Extensions/RatingExtension/RatingExtension.csproj +++ b/src/Extensions/RatingExtension/RatingExtension.csproj @@ -38,6 +38,7 @@ + diff --git a/src/Misc/App.cs b/src/Misc/App.cs index cc53b6f..bd250c3 100644 --- a/src/Misc/App.cs +++ b/src/Misc/App.cs @@ -7,6 +7,7 @@ using System.Windows.Forms; using System.Threading.Tasks; using static mpvnet.Core; +using static TaskDialog.Msg; namespace mpvnet { @@ -116,7 +117,7 @@ namespace mpvnet if (IsStartedFromTerminal) ConsoleHelp.WriteError(obj.ToString()); else - Msg.ShowError(obj.ToString()); + MsgError(obj.ToString()); } } @@ -206,7 +207,7 @@ namespace mpvnet Commands.Execute("show-setup-dialog"); else - Msg.Show("The setup dialog can be found in the context menu at:\n\nTools > Setup"); + MsgInfo("The setup dialog can be found in the context menu at:\n\nTools > Setup"); RegistryHelp.SetValue(RegistryHelp.ApplicationKey, Folder.Startup, 1); } diff --git a/src/Misc/UpdateCheck.cs b/src/Misc/UpdateCheck.cs index 3d7783d..5ff386a 100644 --- a/src/Misc/UpdateCheck.cs +++ b/src/Misc/UpdateCheck.cs @@ -8,6 +8,7 @@ using System.Text.RegularExpressions; using System.Windows.Forms; using static mpvnet.Core; +using static TaskDialog.Msg; namespace mpvnet { @@ -39,7 +40,7 @@ namespace mpvnet if (onlineVersion <= currentVersion) { if (showUpToDateMessage) - Msg.Show($"{Application.ProductName} is up to date."); + MsgInfo($"{Application.ProductName} is up to date."); return; } diff --git a/src/Native/TaskDialog.cs b/src/Native/TaskDialog.cs index 8541819..4428a21 100644 --- a/src/Native/TaskDialog.cs +++ b/src/Native/TaskDialog.cs @@ -82,16 +82,20 @@ public class Msg } } - public static void ShowWarning(string mainInstruction, - string content = null, - bool onlyOnce = false) + public static void ShowWarning( + string mainInstruction, + string content = null, + bool onlyOnce = false) { if (onlyOnce && Msg.ShownMessages != null && Msg.ShownMessages.Contains(mainInstruction + content)) return; Msg.Show(mainInstruction, content, MsgIcon.Warning, MsgButtons.Ok, MsgResult.None); - if (!onlyOnce) return; + + if (!onlyOnce) + return; + Msg.ShownMessages += mainInstruction + content; } diff --git a/src/WPF/ConfWindow.xaml.cs b/src/WPF/ConfWindow.xaml.cs index 001330d..15506bf 100644 --- a/src/WPF/ConfWindow.xaml.cs +++ b/src/WPF/ConfWindow.xaml.cs @@ -11,6 +11,7 @@ using System.Windows.Input; using DynamicGUI; +using static TaskDialog.Msg; using static mpvnet.Core; namespace mpvnet @@ -75,7 +76,7 @@ namespace mpvnet File.WriteAllText(core.ConfPath, GetContent("mpv")); File.WriteAllText(App.ConfPath, GetContent("mpvnet")); - Msg.Show("Changes will be available on next mpv.net startup."); + MsgInfo("Changes will be available on next mpv.net startup."); } string GetCompareString() @@ -297,7 +298,7 @@ namespace mpvnet void PreviewTextBlock_MouseUp(object sender, MouseButtonEventArgs e) { - Msg.Show("mpv.conf Preview", GetContent("mpv")); + MsgInfo("mpv.conf Preview", GetContent("mpv")); } void ShowManualTextBlock_MouseUp(object sender, MouseButtonEventArgs e) diff --git a/src/WPF/InputWindow.xaml.cs b/src/WPF/InputWindow.xaml.cs index c1ecf8d..1f258d3 100644 --- a/src/WPF/InputWindow.xaml.cs +++ b/src/WPF/InputWindow.xaml.cs @@ -9,6 +9,7 @@ using System.Windows.Data; using System.Windows.Input; using static mpvnet.Core; +using static TaskDialog.Msg; namespace mpvnet { @@ -37,7 +38,7 @@ namespace mpvnet if (SearchControl.SearchTextBox.Text == "?") { SearchControl.SearchTextBox.Text = ""; - Msg.Show("Filtering", "Reduce the filter scope with:\n\ni input\n\nm menu\n\nc command\n\nIf only one character is entered input search is performed."); + MsgInfo("Filtering", "Reduce the filter scope with:\n\ni input\n\nm menu\n\nc command\n\nIf only one character is entered input search is performed."); } } @@ -85,7 +86,7 @@ namespace mpvnet foreach (CommandItem i in CommandItem.Items) if (items.ContainsKey(i.Input) && i.Input != "") - Msg.Show($"Duplicate found:\n\n{i.Input}: {i.Path}\n\n{items[i.Input].Input}: {items[i.Input].Path}\n\nPlease note that you can chain multiple commands in the same line by using a semicolon as separator.", "Duplicate Found"); + MsgInfo($"Duplicate found:\n\n{i.Input}: {i.Path}\n\n{items[i.Input].Input}: {items[i.Input].Path}\n\nPlease note that you can chain multiple commands in the same line by using a semicolon as separator.", "Duplicate Found"); else items[i.Input] = i; } @@ -124,9 +125,11 @@ namespace mpvnet void Window_Closed(object sender, EventArgs e) { - if (InitialInputConfContent == GetInputConfContent()) return; + if (InitialInputConfContent == GetInputConfContent()) + return; + File.WriteAllText(core.InputConfPath, GetInputConfContent()); - Msg.Show("Changes will be available on next mpv.net startup."); + MsgInfo("Changes will be available on next mpv.net startup."); } void DataGrid_PreviewCanExecute(object sender, CanExecuteRoutedEventArgs e) diff --git a/src/WPF/SetupWindow.xaml.cs b/src/WPF/SetupWindow.xaml.cs index 6811434..860f1dc 100644 --- a/src/WPF/SetupWindow.xaml.cs +++ b/src/WPF/SetupWindow.xaml.cs @@ -8,6 +8,7 @@ using System.Windows; using WinForms = System.Windows.Forms; using static StockIcon; +using static TaskDialog.Msg; namespace mpvnet { @@ -44,7 +45,7 @@ namespace mpvnet proc.WaitForExit(); if (proc.ExitCode == 0) - Msg.Show("File associations successfully created."); + MsgInfo("File associations successfully created."); } } catch {} diff --git a/src/WinForms/MainForm.cs b/src/WinForms/MainForm.cs index e9da7eb..883b0bf 100644 --- a/src/WinForms/MainForm.cs +++ b/src/WinForms/MainForm.cs @@ -11,6 +11,7 @@ using System.Globalization; using static mpvnet.Core; using static Native; +using static TaskDialog.Msg; namespace mpvnet { @@ -957,6 +958,7 @@ namespace mpvnet CSharpScriptHost.ExecuteScriptsInFolder(core.ConfigFolder + "scripts-cs"); ShownTickCount = Environment.TickCount; App.ShowSetup(); + MsgError("aaaaaaaaaaaaaaa", "bbbbbbbbbbbbbbbbbb"); } protected override void OnActivated(EventArgs e) diff --git a/src/WinForms/TaskDialog/CheckBoxRendererEx.vb b/src/WinForms/TaskDialog/CheckBoxRendererEx.vb new file mode 100644 index 0000000..33978e5 --- /dev/null +++ b/src/WinForms/TaskDialog/CheckBoxRendererEx.vb @@ -0,0 +1,70 @@ + +Imports System.Drawing +Imports System.Drawing.Drawing2D +Imports System.Windows.Forms +Imports System.Windows.Forms.VisualStyles + +Public Class CheckBoxRendererEx + Public Shared Sub DrawCheckBox(g As Graphics, glyphLocation As Point, state As CheckBoxState) + DrawCheckBox(g, New Rectangle(glyphLocation, GetGlyphSize(g, state)), state) + End Sub + + Public Shared Sub DrawCheckBox(g As Graphics, rect As Rectangle, state As CheckBoxState) + 'Dim smoothingModeBackup = g.SmoothingMode + 'g.SmoothingMode = SmoothingMode.AntiAlias + + 'If ThemeManager.CurrentTheme.UsesSystemColors OrElse DesignHelp.IsDesignMode Then + ' CheckBoxRenderer.DrawCheckBox(g, rect.Location, state) + ' Return + 'End If + + 'Dim theme = ThemeManager.CurrentTheme.General.Controls.CheckBox + 'Dim checked = state = CheckBoxState.CheckedDisabled OrElse state = CheckBoxState.CheckedHot OrElse state = CheckBoxState.CheckedNormal OrElse state = CheckBoxState.CheckedPressed + 'Dim backColor = If(checked, theme.BoxCheckedColor, theme.BoxColor) + 'Dim borderColor = If(checked, theme.BorderCheckedColor, theme.BorderColor) + 'Dim borderStrength = 2 + 'Dim checkmarkColor = theme.CheckmarkColor + 'Dim checkmarkStrength = rect.Width \ 5 + + 'Select Case state + ' Case CheckBoxState.CheckedNormal + ' Using brush As New SolidBrush(backColor) + ' Using pen As New Pen(borderColor, borderStrength) + ' g.FillRectangle(brush, rect) + ' g.DrawRectangle(pen, rect) + ' End Using + ' End Using + + ' Dim startX1 = rect.Left + rect.Width / 4.5F + ' Dim startY1 = rect.Top + rect.Height / 2.75F + ' Dim endX1 = rect.Left + rect.Width / 3.0F + ' Dim endY1 = rect.Top + rect.Height / 1.2F + + ' Dim startX2 = rect.Left + rect.Width / 3.6F + ' Dim startY2 = rect.Top + rect.Height / 1.3F + ' Dim endX2 = rect.Left + rect.Width / 1.2F + ' Dim endY2 = rect.Top + rect.Height / 5.0F + + ' Using pen As New Pen(checkmarkColor, checkmarkStrength) + ' g.DrawLine(pen, startX1, startY1, endX1, endY1) + ' g.DrawLine(pen, startX2, startY2, endX2, endY2) + ' End Using + + ' Case CheckBoxState.UncheckedNormal + ' Using brush As New SolidBrush(backColor) + ' Using pen As New Pen(borderColor, borderStrength) + ' g.FillRectangle(brush, rect) + ' g.DrawRectangle(pen, rect) + ' End Using + ' End Using + 'End Select + + 'g.SmoothingMode = smoothingModeBackup + End Sub + + Shared Function GetGlyphSize(g As Graphics, state As CheckBoxState) As Size + Dim defaultSize = CheckBoxRenderer.GetGlyphSize(g, state) + Dim uiSize = New Size(CInt(defaultSize.Width), CInt(defaultSize.Height)) + Return uiSize + End Function +End Class diff --git a/src/WinForms/TaskDialog/ColorHSL.vb b/src/WinForms/TaskDialog/ColorHSL.vb new file mode 100644 index 0000000..39100e3 --- /dev/null +++ b/src/WinForms/TaskDialog/ColorHSL.vb @@ -0,0 +1,164 @@ +Imports System.Drawing + + +Public Structure ColorHSL + Private ReadOnly _h As Integer + Private ReadOnly _s As Single + Private ReadOnly _l As Single + Private ReadOnly _a As Single + + + Public ReadOnly Property H As Integer + Get + Return _h + End Get + End Property + + Public ReadOnly Property S As Single + Get + Return _s + End Get + End Property + + Public ReadOnly Property L As Single + Get + Return _l + End Get + End Property + + Public ReadOnly Property A As Single + Get + Return _a + End Get + End Property + + Public Sub New(h As Integer, s As Single, l As Single, Optional a As Single = 1.0F) + Dim newHue = h Mod 360 + _h = Mathf.Clamp(If(newHue < 0, newHue + 360, newHue), 0, 359) + _s = Mathf.Clamp01(s) + _l = Mathf.Clamp01(l) + _a = Mathf.Clamp01(a) + End Sub + + Public Shared Widening Operator CType(colorHSL As ColorHSL) As Color + Dim hue As Integer = Mathf.Clamp(colorHSL.H Mod 360, 0, 359) + Dim saturation As Single = Mathf.Clamp01(colorHSL.S) + Dim lightness As Single = Mathf.Clamp01(colorHSL.L) + Dim alpha As Single = Mathf.Clamp01(colorHSL.A) + Dim c As Single = (1.0F - Math.Abs(2.0F * lightness - 1.0F)) * saturation + Dim x As Single = c * (1.0F - Math.Abs((hue / 60.0F) Mod 2.0F - 1.0F)) + Dim m As Single = lightness - c / 2.0F + Dim r As Single = c + Dim g As Single = 0 + Dim b As Single = x + + If hue < 300 Then + r = x + g = 0 + b = c + End If + + If hue < 240 Then + r = 0 + g = x + b = c + End If + + If hue < 180 Then + r = 0 + g = c + b = x + End If + + If hue < 120 Then + r = x + g = c + b = 0 + End If + + If hue < 60 Then + r = c + g = x + b = 0 + End If + + Return Color.FromArgb(CType(alpha * 255.0F, Byte), CType(Mathf.Clamp01(r + m) * 255.0F, Byte), CType(Mathf.Clamp01(g + m) * 255.0F, Byte), CType(Mathf.Clamp01(b + m) * 255.0F, Byte)) + End Operator + + Public Shared Widening Operator CType(color As Color) As ColorHSL + Dim r As Single = color.R / 255.0F + Dim g As Single = color.G / 255.0F + Dim b As Single = color.B / 255.0F + Dim max As Single = Mathf.Max(r, g, b) + Dim min As Single = Mathf.Min(r, g, b) + Dim delta As Single = max - min + Dim alpha As Single = color.A / 255.0F + Dim lightness As Single = (min + max) / 2 + Dim saturation As Single = 0F + saturation = If(delta <> 0F, (delta / (1 - Math.Abs(2 * lightness - 1))), saturation) + Dim hue As Single = 0F + If delta <> 0F Then + hue = If(max = r, 60.0F * (((g - b) / delta) Mod 6.0F), hue) + hue = If(max = g, 60.0F * (((b - r) / delta) + 2.0F), hue) + hue = If(max = b, 60.0F * (((r - g) / delta) + 4.0F), hue) + End If + Return New ColorHSL(Mathf.RoundToInt(hue), saturation, lightness, alpha) + End Operator + + Public Shared Operator =(colorA As ColorHSL, colorB As ColorHSL) As Boolean + Return colorA.Equals(colorB) + End Operator + + Public Shared Operator <>(colorA As ColorHSL, colorB As ColorHSL) As Boolean + Return Not colorA.Equals(colorB) + End Operator + + Public Function AddHue(offset As Integer) As ColorHSL + Return New ColorHSL(H + offset, S, L, A) + End Function + + Public Function AddSaturation(offset As Single) As ColorHSL + Return New ColorHSL(H, S + offset, L, A) + End Function + + Public Function AddLuminance(offset As Single) As ColorHSL + Return New ColorHSL(H, S, L + offset, A) + End Function + + Public Function AddAlpha(offset As Single) As ColorHSL + Return New ColorHSL(H, S, L, A + offset) + End Function + + Public Overrides Function Equals(obj As Object) As Boolean + Dim objColor = CType(obj, ColorHSL) + Return H = objColor.H AndAlso S = objColor.S AndAlso L = objColor.L AndAlso A = objColor.A + End Function + + Public Function SetHue(value As Integer) As ColorHSL + Return New ColorHSL(value, S, L, A) + End Function + + Public Function SetSaturation(value As Single) As ColorHSL + Return New ColorHSL(H, value, L, A) + End Function + + Public Function SetLuminance(value As Single) As ColorHSL + Return New ColorHSL(H, S, value, A) + End Function + + Public Function SetAlpha(value As Single) As ColorHSL + Return New ColorHSL(H, S, L, value) + End Function + + Public Function ToColor() As Color + Return CType(Me, Color) + End Function + + Public Function ToHTML() As String + Return ColorTranslator.ToHtml(Me) + End Function + + Public Overrides Function ToString() As String + Return String.Format($"HSLA({H:0}, {S:0.00}, {L:0.00}, {A:0.00})") + End Function +End Structure diff --git a/src/WinForms/TaskDialog/Mathf.vb b/src/WinForms/TaskDialog/Mathf.vb new file mode 100644 index 0000000..17367a0 --- /dev/null +++ b/src/WinForms/TaskDialog/Mathf.vb @@ -0,0 +1,116 @@ +Public Class Mathf + Public Shared Function Clamp(value As Integer, min As Integer, max As Integer) As Integer + If value < min Then + value = min + ElseIf value > max Then + value = max + End If + Return value + End Function + + Public Shared Function Clamp(value As Single, min As Single, max As Single) As Single + If value < min Then + value = min + ElseIf value > max Then + value = max + End If + Return value + End Function + + Public Shared Function Clamp01(value As Single) As Single + If value < 0F Then + value = 0F + ElseIf value > 1.0F Then + value = 1.0F + End If + Return value + End Function + + Public Shared Function Min(a As Single, b As Single) As Single + Return If((a >= b), b, a) + End Function + + Public Shared Function Min(ParamArray values As Single()) As Single + Dim num As Integer = values.Length + Dim result As Single + If num = 0 Then + result = 0F + Else + Dim num2 As Single = values(0) + For i As Integer = 1 To num - 1 + If values(i) < num2 Then + num2 = values(i) + End If + Next + result = num2 + End If + Return result + End Function + + Public Shared Function Min(a As Integer, b As Integer) As Integer + Return If((a >= b), b, a) + End Function + + Public Shared Function Min(ParamArray values As Integer()) As Integer + Dim num As Integer = values.Length + Dim result As Integer + If num = 0 Then + result = 0 + Else + Dim num2 As Integer = values(0) + For i As Integer = 1 To num - 1 + If values(i) < num2 Then + num2 = values(i) + End If + Next + result = num2 + End If + Return result + End Function + + Public Shared Function Max(a As Single, b As Single) As Single + Return If((a <= b), b, a) + End Function + + Public Shared Function Max(ParamArray values As Single()) As Single + Dim num As Integer = values.Length + Dim result As Single + If num = 0 Then + result = 0F + Else + Dim num2 As Single = values(0) + For i As Integer = 1 To num - 1 + If values(i) > num2 Then + num2 = values(i) + End If + Next + result = num2 + End If + Return result + End Function + + Public Shared Function Max(a As Integer, b As Integer) As Integer + Return If((a <= b), b, a) + End Function + + Public Shared Function Max(ParamArray values As Integer()) As Integer + Dim num As Integer = values.Length + Dim result As Integer + If num = 0 Then + result = 0 + Else + Dim num2 As Integer = values(0) + For i As Integer = 1 To num - 1 + If values(i) > num2 Then + num2 = values(i) + End If + Next + result = num2 + End If + Return result + End Function + + Public Shared Function RoundToInt(value As Single) As Integer + Return CInt(Math.Round(value)) + End Function +End Class diff --git a/src/WinForms/TaskDialog/Misc.vb b/src/WinForms/TaskDialog/Misc.vb new file mode 100644 index 0000000..0321bc6 --- /dev/null +++ b/src/WinForms/TaskDialog/Misc.vb @@ -0,0 +1,69 @@ + +Imports System.IO +Imports System.Runtime.InteropServices +Imports System.Text +Imports System.Windows.Forms + +Public Class StringHelp + Shared Function Base(instance As String) As String + If instance = "" Then + Return "" + End If + + Dim ret = instance + + If ret.Contains(Path.DirectorySeparatorChar) Then + ret = RightLast(ret, Path.DirectorySeparatorChar) + End If + + If ret.Contains(".") Then + ret = LeftLast(ret, ".") + End If + + Return ret + End Function + + Shared Function RightLast(value As String, start As String) As String + If value = "" OrElse start = "" Then + Return "" + End If + + If Not value.Contains(start) Then + Return "" + End If + + Return value.Substring(value.LastIndexOf(start) + start.Length) + End Function + + Shared Function LeftLast(value As String, start As String) As String + If Not value.Contains(start) Then + Return "" + End If + + Return value.Substring(0, value.LastIndexOf(start)) + End Function +End Class + +Public Class Native + + Shared Function GetForegroundWindow() As IntPtr + End Function + + + Shared Function GetWindowModuleFileName( + hwnd As IntPtr, + lpszFileName As StringBuilder, + cchFileNameMax As UInteger) As UInteger + End Function + + + Shared Function SetWindowPos( + hWnd As IntPtr, + hWndInsertAfter As IntPtr, + X As Integer, + Y As Integer, + cx As Integer, + cy As Integer, + uFlags As UInteger) As Boolean + End Function +End Class \ No newline at end of file diff --git a/src/WinForms/TaskDialog/Msg.vb b/src/WinForms/TaskDialog/Msg.vb new file mode 100644 index 0000000..6fab867 --- /dev/null +++ b/src/WinForms/TaskDialog/Msg.vb @@ -0,0 +1,82 @@ + +Imports System.Windows.Forms + +Public Class Msg + Shared Sub MsgInfo(title As Object, Optional content As Object = Nothing) + Dim title1 = title?.ToString + Dim content1 = content?.ToString + Msg(title1, content1, TaskIcon.Info, TaskButton.OK) + End Sub + + Shared Sub MsgError(title As String, Optional content As String = Nothing) + MsgError(title, content, IntPtr.Zero) + End Sub + + Shared Sub MsgError(title As String, content As String, handle As IntPtr) + If title = "" Then + title = content + End If + + If title = "" Then + Exit Sub + End If + + Using td As New TaskDialog(Of String) + td.Title = title + td.Content = content + td.Owner = handle + td.Icon = TaskIcon.Error + td.ShowCopyButton = True + td.AddButton("OK") + td.Show() + End Using + End Sub + + Private Shared ShownMessages As String + + Shared Sub MsgWarn(text As String, Optional content As String = Nothing, Optional onlyOnce As Boolean = False) + If onlyOnce AndAlso ShownMessages?.Contains(text + content) Then + Exit Sub + End If + + Msg(text, content, TaskIcon.Warning, TaskButton.OK) + + If onlyOnce Then + ShownMessages += text + content + End If + End Sub + + Shared Function MsgOK(title As String) As Boolean + Return Msg(title, Nothing, TaskIcon.Question, TaskButton.OkCancel) = DialogResult.OK + End Function + + Shared Function MsgQuestion( + title As String, + Optional buttons As TaskButton = TaskButton.OkCancel) As DialogResult + + Return Msg(title, Nothing, TaskIcon.Question, buttons) + End Function + + Shared Function MsgQuestion( + title As String, + content As String, + Optional buttons As TaskButton = TaskButton.OkCancel) As DialogResult + + Return Msg(title, content, TaskIcon.Question, buttons) + End Function + + Shared Function Msg( + title As String, + content As String, + icon As TaskIcon, + buttons As TaskButton) As DialogResult + + Using td As New TaskDialog(Of DialogResult) + td.Icon = icon + td.Title = title + td.Content = content + td.Buttons = buttons + Return td.Show() + End Using + End Function +End Class diff --git a/src/WinForms/TaskDialog/My Project/Application.Designer.vb b/src/WinForms/TaskDialog/My Project/Application.Designer.vb new file mode 100644 index 0000000..88dd01c --- /dev/null +++ b/src/WinForms/TaskDialog/My Project/Application.Designer.vb @@ -0,0 +1,13 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:4.0.30319.42000 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + diff --git a/src/WinForms/TaskDialog/My Project/Application.myapp b/src/WinForms/TaskDialog/My Project/Application.myapp new file mode 100644 index 0000000..e62f1a5 --- /dev/null +++ b/src/WinForms/TaskDialog/My Project/Application.myapp @@ -0,0 +1,10 @@ + + + false + false + 0 + true + 0 + 2 + true + diff --git a/src/WinForms/TaskDialog/My Project/AssemblyInfo.vb b/src/WinForms/TaskDialog/My Project/AssemblyInfo.vb new file mode 100644 index 0000000..bf41d06 --- /dev/null +++ b/src/WinForms/TaskDialog/My Project/AssemblyInfo.vb @@ -0,0 +1,35 @@ +Imports System +Imports System.Reflection +Imports System.Runtime.InteropServices + +' General Information about an assembly is controlled through the following +' set of attributes. Change these attribute values to modify the information +' associated with an assembly. + +' Review the values of the assembly attributes + + + + + + + + + + +'The following GUID is for the ID of the typelib if this project is exposed to COM + + +' Version information for an assembly consists of the following four values: +' +' Major Version +' Minor Version +' Build Number +' Revision +' +' You can specify all the values or you can default the Build and Revision Numbers +' by using the '*' as shown below: +' + + + diff --git a/src/WinForms/TaskDialog/My Project/Resources.Designer.vb b/src/WinForms/TaskDialog/My Project/Resources.Designer.vb new file mode 100644 index 0000000..9a3290c --- /dev/null +++ b/src/WinForms/TaskDialog/My Project/Resources.Designer.vb @@ -0,0 +1,63 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:4.0.30319.42000 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + +Imports System + +Namespace My.Resources + + 'This class was auto-generated by the StronglyTypedResourceBuilder + 'class via a tool like ResGen or Visual Studio. + 'To add or remove a member, edit your .ResX file then rerun ResGen + 'with the /str option, or rebuild your VS project. + ''' + ''' A strongly-typed resource class, for looking up localized strings, etc. + ''' + _ + Friend Module Resources + + Private resourceMan As Global.System.Resources.ResourceManager + + Private resourceCulture As Global.System.Globalization.CultureInfo + + ''' + ''' Returns the cached ResourceManager instance used by this class. + ''' + _ + Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager + Get + If Object.ReferenceEquals(resourceMan, Nothing) Then + Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("TaskDialog.Resources", GetType(Resources).Assembly) + resourceMan = temp + End If + Return resourceMan + End Get + End Property + + ''' + ''' Overrides the current thread's CurrentUICulture property for all + ''' resource lookups using this strongly typed resource class. + ''' + _ + Friend Property Culture() As Global.System.Globalization.CultureInfo + Get + Return resourceCulture + End Get + Set + resourceCulture = value + End Set + End Property + End Module +End Namespace diff --git a/src/WinForms/TaskDialog/My Project/Resources.resx b/src/WinForms/TaskDialog/My Project/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/src/WinForms/TaskDialog/My Project/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/src/WinForms/TaskDialog/My Project/Settings.Designer.vb b/src/WinForms/TaskDialog/My Project/Settings.Designer.vb new file mode 100644 index 0000000..dffe133 --- /dev/null +++ b/src/WinForms/TaskDialog/My Project/Settings.Designer.vb @@ -0,0 +1,73 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:4.0.30319.42000 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Namespace My + + _ + Partial Friend NotInheritable Class MySettings + Inherits Global.System.Configuration.ApplicationSettingsBase + + Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings()),MySettings) + +#Region "My.Settings Auto-Save Functionality" +#If _MyType = "WindowsForms" Then + Private Shared addedHandler As Boolean + + Private Shared addedHandlerLockObject As New Object + + _ + Private Shared Sub AutoSaveSettings(sender As Global.System.Object, e As Global.System.EventArgs) + If My.Application.SaveMySettingsOnExit Then + My.Settings.Save() + End If + End Sub +#End If +#End Region + + Public Shared ReadOnly Property [Default]() As MySettings + Get + +#If _MyType = "WindowsForms" Then + If Not addedHandler Then + SyncLock addedHandlerLockObject + If Not addedHandler Then + AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings + addedHandler = True + End If + End SyncLock + End If +#End If + Return defaultInstance + End Get + End Property + End Class +End Namespace + +Namespace My + + _ + Friend Module MySettingsProperty + + _ + Friend ReadOnly Property Settings() As Global.TaskDialog.My.MySettings + Get + Return Global.TaskDialog.My.MySettings.Default + End Get + End Property + End Module +End Namespace diff --git a/src/WinForms/TaskDialog/My Project/Settings.settings b/src/WinForms/TaskDialog/My Project/Settings.settings new file mode 100644 index 0000000..85b890b --- /dev/null +++ b/src/WinForms/TaskDialog/My Project/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/WinForms/TaskDialog/StockIcon.vb b/src/WinForms/TaskDialog/StockIcon.vb new file mode 100644 index 0000000..9378342 --- /dev/null +++ b/src/WinForms/TaskDialog/StockIcon.vb @@ -0,0 +1,144 @@ + +Imports System.Drawing +Imports System.Runtime.InteropServices + + +Enum StockIconOptions As UInteger + Small = &H1 + ShellSize = &H4 + Handle = &H100 + SystemIndex = &H4000 + LinkOverlay = &H8000 + Selected = &H10000 +End Enum + +Enum StockIconIdentifier As UInteger + DocumentNotAssociated = 0 + DocumentAssociated = 1 + Application = 2 + Folder = 3 + FolderOpen = 4 + Drive525 = 5 + Drive35 = 6 + DriveRemove = 7 + DriveFixed = 8 + DriveNetwork = 9 + DriveNetworkDisabled = 10 + DriveCD = 11 + DriveRAM = 12 + World = 13 + Server = 15 + Printer = 16 + MyNetwork = 17 + Find = 22 + Help = 23 + Share = 28 + Link = 29 + SlowFile = 30 + Recycler = 31 + RecyclerFull = 32 + MediaCDAudio = 40 + Lock = 47 + AutoList = 49 + PrinterNet = 50 + ServerShare = 51 + PrinterFax = 52 + PrinterFaxNet = 53 + PrinterFile = 54 + Stack = 55 + MediaSVCD = 56 + StuffedFolder = 57 + DriveUnknown = 58 + DriveDVD = 59 + MediaDVD = 60 + MediaDVDRAM = 61 + MediaDVDRW = 62 + MediaDVDR = 63 + MediaDVDROM = 64 + MediaCDAudioPlus = 65 + MediaCDRW = 66 + MediaCDR = 67 + MediaCDBurn = 68 + MediaBlankCD = 69 + MediaCDROM = 70 + AudioFiles = 71 + ImageFiles = 72 + VideoFiles = 73 + MixedFiles = 74 + FolderBack = 75 + FolderFront = 76 + Shield = 77 + Warning = 78 + Info = 79 + [Error] = 80 + Key = 81 + Software = 82 + Rename = 83 + Delete = 84 + MediaAudioDVD = 85 + MediaMovieDVD = 86 + MediaEnhancedCD = 87 + MediaEnhancedDVD = 88 + MediaHDDVD = 89 + MediaBluRay = 90 + MediaVCD = 91 + MediaDVDPlusR = 92 + MediaDVDPlusRW = 93 + DesktopPC = 94 + MobilePC = 95 + Users = 96 + MediaSmartMedia = 97 + MediaCompactFlash = 98 + DeviceCellPhone = 99 + DeviceCamera = 100 + DeviceVideoCamera = 101 + DeviceAudioPlayer = 102 + NetworkConnect = 103 + Internet = 104 + ZipFile = 105 + Settings = 106 +End Enum + +Class StockIcon + + Structure StockIconInfo + Friend StuctureSize As UInt32 + Friend Handle As IntPtr + Friend ImageIndex As Int32 + Friend Identifier As Int32 + + Friend Path As String + End Structure + + + Shared Function SHGetStockIconInfo( + identifier As StockIconIdentifier, + flags As StockIconOptions, + ByRef info As StockIconInfo) As Integer + End Function + + + Shared Function DestroyIcon(handle As IntPtr) As Boolean + End Function + + Shared Function GetSmallImage(identifier As StockIconIdentifier) As Bitmap + Dim ptr = GetIcon(identifier, StockIconOptions.Handle Or StockIconOptions.Small) + Dim bmp = Icon.FromHandle(ptr).ToBitmap + DestroyIcon(ptr) + Return bmp + End Function + + Shared Function GetImage(identifier As StockIconIdentifier) As Image + Dim ptr = GetIcon(identifier, StockIconOptions.Handle Or StockIconOptions.ShellSize) + Dim bmp = Icon.FromHandle(ptr).ToBitmap + DestroyIcon(ptr) + Return bmp + End Function + + Shared Function GetIcon(identifier As StockIconIdentifier, flags As StockIconOptions) As IntPtr + Dim info As New StockIconInfo() + info.StuctureSize = CType(Marshal.SizeOf(GetType(StockIconInfo)), UInt32) + Marshal.ThrowExceptionForHR(SHGetStockIconInfo(identifier, flags, info)) + Return info.Handle + End Function +End Class diff --git a/src/WinForms/TaskDialog/Symbol.vb b/src/WinForms/TaskDialog/Symbol.vb new file mode 100644 index 0000000..810adae --- /dev/null +++ b/src/WinForms/TaskDialog/Symbol.vb @@ -0,0 +1,2059 @@ + +Public Enum Symbol + None = 0 + [Error] = &HE783 + [Like] = &HE8E1 + [Next] = &HE893 + [Stop] = &HE71A + Accept = &HE8FB + AcceptLegacy = &HE10B + Accident = &HE81F + AccidentSolid = &HEA8E + Accounts = &HE910 + AccountsLegacy = &HE168 + ActionCenter = &HE91C + ActionCenterAsterisk = &HEA21 + ActionCenterMirrored = &HED0D + ActionCenterNotification = &HE7E7 + ActionCenterNotificationMirrored = &HED0C + ActionCenterQuiet = &HEE79 + ActionCenterQuietNotification = &HEE7A + Add = &HE710 + AddFriend = &HE8FA + AddFriendLegacy = &HE1E2 + AddLegacy = &HE109 + AddRemoteDevice = &HE836 + AddSurfaceHub = &HECC4 + AddTo = &HECC8 + AdjustHologram = &HEBD2 + Admin = &HE7EF + AdminLegacy = &HE1A7 + Airplane = &HE709 + AirplaneSolid = &HEB4C + AlignCenter = &HE8E3 + AlignCenterLegacy = &HE1A1 + AlignLeft = &HE8E4 + AlignLeftLegacy = &HE1A2 + AlignRight = &HE8E2 + AlignRightLegacy = &HE1A0 + AllApps = &HE71D + AllAppsLegacy = &HE179 + AllAppsLegacyMirrored = &HE1EC + AllAppsMirrored = &HEA40 + Annotation = &HE924 + AppIconDefault = &HECAA + ArrowHTMLLegacy = &HED5 + ArrowHTMLLegacyMirrored = &HEAE + AspectRatio = &HE799 + Asterisk = &HEA38 + AsteriskBadge12 = &HEDAD + Attach = &HE723 + AttachCamera = &HE8A2 + AttachCameraLegacy = &HE12D + AttachLegacy = &HE16C + Audio = &HE8D6 + AudioLegacy = &HE189 + Back = &HE72B + BackBttnArrow20Legacy = &HEC4 + BackBttnArrow42Legacy = &HEA6 + BackBttnMirroredArrow20Legacy = &HEAD + BackBttnMirroredArrow42Legacy = &HEAB + BackgroundToggle = &HEF1F + BackLegacy = &HE112 + BackSpaceQWERTY = &HE750 + BackSpaceQWERTYLg = &HEB96 + BackSpaceQWERTYMd = &HE926 + BackSpaceQWERTYSm = &HE925 + BackToWindow = &HE73F + BackToWindowLegacy = &HE1D8 + Badge = &HEC1B + Bank = &HE825 + BarcodeScanner = &HEC5A + Battery0 = &HE850 + Battery1 = &HE851 + Battery10 = &HE83F + Battery2 = &HE852 + Battery3 = &HE853 + Battery4 = &HE854 + Battery5 = &HE855 + Battery6 = &HE856 + Battery7 = &HE857 + Battery8 = &HE858 + Battery9 = &HE859 + BatteryCharging0 = &HE85A + BatteryCharging1 = &HE85B + BatteryCharging10 = &HEA93 + BatteryCharging2 = &HE85C + BatteryCharging3 = &HE85D + BatteryCharging4 = &HE85E + BatteryCharging5 = &HE85F + BatteryCharging6 = &HE860 + BatteryCharging7 = &HE861 + BatteryCharging8 = &HE862 + BatteryCharging9 = &HE83E + BatterySaver0 = &HE863 + BatterySaver1 = &HE864 + BatterySaver10 = &HEA95 + BatterySaver2 = &HE865 + BatterySaver3 = &HE866 + BatterySaver4 = &HE867 + BatterySaver5 = &HE868 + BatterySaver6 = &HE869 + BatterySaver7 = &HE86A + BatterySaver8 = &HE86B + BatterySaver9 = &HEA94 + BatteryUnknown = &HE996 + Beta = &HEA24 + BidiLtr = &HE9AA + BidiRtl = &HE9AB + BlockContact = &HE8F8 + BlockContactLegacy = &HE1E0 + BlockedLegacy = &HE25B + Bluetooth = &HE702 + BodyCam = &HEC80 + Bold = &HE8DD + BoldFLegacy = &HE1B3 + BoldGLegacy = &HE1B1 + BoldKoreanLegacy = &HE1BD + BoldLegacy = &HE19B + BoldNLegacy = &HE1B7 + BoldRussionLegacy = &HE1B9 + Bookmarks = &HE8A4 + BookmarksLegacy = &HE12F + BookmarksLegacyMirrored = &HE1EE + BookmarksMirrored = &HEA41 + Brightness = &HE706 + Broom = &HEA99 + BrowsePhotos = &HE7C5 + BrowsePhotosLegacy = &HE155 + BrushSize = &HEDA8 + BuildingEnergy = &HEC0B + BulletedList = &HE8FD + BulletedListLegacy = &HE292 + BulletedListLegacyMirrored = &HE299 + BulletedListMirrored = &HEA42 + Bus = &HE806 + BusSolid = &HEB47 + Calculator = &HE8EF + CalculatorAddition = &HE948 + CalculatorBackspace = &HE94F + CalculatorDivide = &HE94A + CalculatorEqualTo = &HE94E + CalculatorLegacy = &HE1D0 + CalculatorMultiply = &HE947 + CalculatorNegate = &HE94D + CalculatorPercentage = &HE94C + CalculatorSquareroot = &HE94B + CalculatorSubtract = &HE949 + Calendar = &HE787 + CalendarDay = &HE8BF + CalendarDayLegacy = &HE161 + CalendarLegacy = &HE163 + CalendarLegacyMirrored = &HE1DC + CalendarMirrored = &HED28 + CalendarReply = &HE8F5 + CalendarReplyLegacy = &HE1DB + CalendarSolid = &HEA89 + CalendarWeek = &HE8C0 + CalendarWeekLegacy = &HE162 + CaligraphyPen = &HEDFB + CallForwarding = &HE7F2 + CallForwardingMirrored = &HEA97 + CallForwardInternational = &HE87A + CallForwardInternationalMirrored = &HEA43 + CallForwardRoaming = &HE87B + CallForwardRoamingMirrored = &HEA44 + Camera = &HE722 + CameraLegacy = &HE114 + Cancel = &HE711 + CancelLegacy = &HE10A + Caption = &HE8BA + CaptionLegacy = &HE15A + Car = &HE804 + CashDrawer = &HEC59 + CC = &HE7F0 + CCEuroLegacy = &HE18F + CCJapanLegacy = &HE18E + CCLegacy = &HE190 + CellPhone = &HE8EA + CellPhoneLegacy = &HE1C9 + Certificate = &HEB95 + Characters = &HE8C1 + CharactersLegacy = &HE164 + ChatBubbles = &HE8F2 + Checkbox = &HE739 + CheckboxComposite = &HE73A + CheckboxCompositeLegacy = &HEA2 + CheckboxCompositeReversed = &HE73D + CheckboxCompositeReversedLegacy = &HE5 + CheckboxFill = &HE73B + CheckboxFillLegacy = &HE2 + CheckboxFillZeroWidthLegacy = &HE9 + CheckboxIndeterminate = &HE73C + CheckboxIndeterminateLegacy = &HE4 + CheckboxLegacy = &HE3 + CheckMark = &HE73E + CheckMarkLegacy = &HE1 + CheckmarkListviewLegacy = &HE81 + CheckmarkMenuLegacy = &HEE7 + CheckMarkZeroWidthLegacy = &HE8 + ChevronDown = &HE70D + ChevronDown1Legacy = &HE99 + ChevronDown2Legacy = &HE9D + ChevronDown3Legacy = &HE15 + ChevronDown4Legacy = &HEA1 + ChevronDownMed = &HE972 + ChevronDownSmall = &HE96E + ChevronDownSmLegacy = &HE228 + ChevronFlipDownLegacy = &HEE5 + ChevronFlipLeftLegacy = &HEE2 + ChevronFlipRightLegacy = &HEE3 + ChevronFlipUpLegacy = &HEE4 + ChevronLeft = &HE76B + ChevronLeft1Legacy = &HE96 + ChevronLeft2Legacy = &HE9A + ChevronLeft3Legacy = &HE12 + ChevronLeft4Legacy = &HE9E + ChevronLeftMed = &HE973 + ChevronLeftSmall = &HE96F + ChevronLeftSmLegacy = &HE26C + ChevronRight = &HE76C + ChevronRight1Legacy = &HE97 + ChevronRight2Legacy = &HE9B + ChevronRight3Legacy = &HE13 + ChevronRight4Legacy = &HE9F + ChevronRightMed = &HE974 + ChevronRightSmall = &HE970 + ChevronRightSmLegacy = &HE26B + ChevronUp = &HE70E + ChevronUp1Legacy = &HE98 + ChevronUp2Legacy = &HE9C + ChevronUp3Legacy = &HE14 + ChevronUp4Legacy = &HEA0 + ChevronUpMed = &HE971 + ChevronUpSmall = &HE96D + ChineseBoPoMoFo = &HE989 + ChineseChangjie = &HE981 + ChinesePinyin = &HE98A + ChineseQuick = &HE984 + ChromeAnnotate = &HE931 + ChromeBack = &HE830 + ChromeBackMirrored = &HEA47 + ChromeBackToWindow = &HE92C + ChromeClose = &HE8BB + ChromeFullScreen = &HE92D + ChromeMaximize = &HE922 + ChromeMinimize = &HE921 + ChromeRestore = &HE923 + CircleFill = &HEA3B + CircleFillBadge12 = &HEDB0 + CircleRing = &HEA3A + CircleRingBadge12 = &HEDAF + CityNext = &HEC06 + CityNext2 = &HEC07 + Clear = &HE894 + ClearAllInk = &HED62 + ClearAllInkMirrored = &HEF19 + ClearLegacy = &HE106 + ClearSelection = &HE8E6 + ClearSelectionLegacy = &HE1C5 + ClearSelectionLegacyMirrored = &HE1F4 + ClearSelectionMirrored = &HEA48 + Click = &HE8B0 + ClockLegacy = &HE121 + ClosePane = &HE89F + ClosePaneLegacy = &HE126 + ClosePaneLegacyMirrored = &HE1BF + ClosePaneMirrored = &HEA49 + Cloud = &HE753 + CloudPrinter = &HEDA6 + Code = &HE943 + Color = &HE790 + ColorLegacy = &HE2B1 + CommaKey = &HE9AD + CommandPrompt = &HE756 + Comment = &HE90A + CommentInlineLegacy = &HE206 + CommentLegacy = &HE134 + Communications = &HE95A + CompanionApp = &HEC64 + CompanionDeviceFramework = &HED5D + Completed = &HE930 + CompletedSolid = &HEC61 + Component = &HE950 + Connect = &HE703 + ConnectApp = &HED5C + Construction = &HE822 + ConstructionCone = &HE98F + ConstructionSolid = &HEA8D + Contact = &HE77B + Contact2 = &HE8D4 + Contact2Legacy = &HE187 + Contact3Legacy = &HE2AF + ContactInfo = &HE779 + ContactInfoLegacy = &HE136 + ContactInfoMirrored = &HEA4A + ContactLegacy = &HE13D + ContactPresence = &HE8CF + ContactPresenceLegacy = &HE181 + ContactSolid = &HEA8C + Copy = &HE8C8 + CopyLegacy = &HE16F + Courthouse = &HEC08 + Crop = &HE7A8 + CropLegacy = &HE123 + Cut = &HE8C6 + CutLegacy = &HE16B + DashKey = &HE9AE + DataSense = &HE791 + DataSenseBar = &HE7A5 + DateTime = &HEC92 + DateTimeMirrored = &HEE93 + DecreaseIndentLegacy = &HE290 + DecreaseIndentLegacyMirrored = &HE297 + DefenderApp = &HE83D + Delete = &HE74D + DeleteLegacy = &HE107 + DeveloperTools = &HEC7A + DeviceDiscovery = &HEBDE + DeviceLaptopNoPic = &HE7F8 + DeviceLaptopPic = &HE7F7 + DeviceMonitorLeftPic = &HE7FA + DeviceMonitorNoPic = &HE7FB + DeviceMonitorRightPic = &HE7F9 + Devices = &HE772 + Devices2 = &HE975 + Devices3 = &HEA6C + Devices4 = &HEB66 + DevicesLegacy = &HE212 + DevUpdate = &HECC5 + Diagnostic = &HE9D9 + Dialpad = &HE75F + DialUp = &HE83C + Dictionary = &HE82D + DictionaryAdd = &HE82E + DictionaryCloud = &HEBC3 + DirectAccess = &HE83B + Directions = &HE8F0 + DirectionsLegacy = &HE1D1 + DisableUpdates = &HE8D8 + DisableUpdatesLegacy = &HE194 + DisconnectDisplay = &HEA14 + DisconnectDrive = &HE8CD + DisconnectDriveLegacy = &HE17A + Dislike = &HE8E0 + DislikeLegacy = &HE19E + DMC = &HE951 + Dock = &HE952 + DockBottom = &HE90E + DockBottomLegacy = &HE147 + DockLeft = &HE90C + DockLeftLegacy = &HE145 + DockLeftLegacyMirrored = &HE1AB + DockLeftMirrored = &HEA4C + DockRight = &HE90D + DockRightLegacy = &HE146 + DockRightLegacyMirrored = &HE1AC + DockRightMirrored = &HEA4B + Document = &HE8A5 + DocumentLegacy = &HE130 + Down = &HE74B + DownLegacy = &HE1FD + Download = &HE896 + DownloadLegacy = &HE118 + DownloadMap = &HE826 + DownShiftKey = &HE84A + Draw = &HEC87 + DrawSolid = &HEC88 + DrivingMode = &HE7EC + Drop = &HEB42 + DullSound = &HE911 + DullSoundKey = &HE9AF + EaseOfAccess = &HE776 + EaseOfAccessLegacy = &HE7F + Edit = &HE70F + EditLegacy = &HE104 + EditLegacyMirrored = &HE1C2 + EditMirrored = &HEB7E + Education = &HE7BE + Emoji = &HE899 + Emoji2 = &HE76E + Emoji2Legacy = &HE170 + EmojiLegacy = &HE11D + EmojiSwatch = &HED5B + EmojiTabCelebrationObjects = &HED55 + EmojiTabFavorites = &HED5A + EmojiTabFoodPlants = &HED56 + EmojiTabPeople = &HED53 + EmojiTabSmilesAnimals = &HED54 + EmojiTabSymbols = &HED58 + EmojiTabTextSmiles = &HED59 + EmojiTabTransitPlaces = &HED57 + EndPoint = &HE81B + EndPointSolid = &HEB4B + EraseTool = &HE75C + EraseToolFill = &HE82B + EraseToolFill2 = &HE82C + ErrorBadge = &HEA39 + ErrorBadge12 = &HEDAE + eSIM = &HED2A + eSIMBusy = &HED2D + eSIMLocked = &HED2C + eSIMNoProfile = &HED2B + Ethernet = &HE839 + EthernetError = &HEB55 + EthernetWarning = &HEB56 + ExpandTile = &HE976 + ExpandTileLegacy = &HE13F + ExpandTileLegacyMirrored = &HE176 + ExpandTileMirrored = &HEA4E + ExploreContent = &HECCD + Export = &HEDE1 + ExportMirrored = &HEDE2 + FastForward = &HEB9D + Favorite2Legacy = &HE249 + FavoriteInlineLegacy = &HE208 + FavoriteLegacy = &HE113 + FavoriteList = &HE728 + FavoriteStar = &HE734 + FavoriteStarFill = &HE735 + Feedback = &HED15 + FeedbackApp = &HE939 + Ferry = &HE7E3 + FerrySolid = &HEB48 + FileExplorer = &HEC50 + FileExplorerApp = &HEC51 + Filter = &HE71C + FilterLegacy = &HE16E + FindLegacy = &HE11A + FingerInking = &HED5F + Fingerprint = &HE928 + Flag = &HE7C1 + FlagLegacy = &HE129 + Flashlight = &HE754 + FlickDown = &HE935 + FlickLeft = &HE937 + FlickRight = &HE938 + FlickUp = &HE936 + Folder = &HE8B7 + FolderFill = &HE8D5 + FolderLegacy = &HE188 + Font = &HE8D2 + FontColor = &HE8D3 + FontColorKoreanLegacy = &HE1BE + FontColorLegacy = &HE186 + FontDecrease = &HE8E7 + FontDecreaseLegacy = &HE1C6 + FontIncrease = &HE8E8 + FontIncreaseLegacy = &HE1C7 + FontLegacy = &HE185 + FontSize = &HE8E9 + FontSizeLegacy = &HE1C8 + FontStyleKoreanLegacy = &HE1BA + Forward = &HE72A + ForwardLegacy = &HE111 + ForwardSm = &HE9AC + FourBars = &HE908 + FourBarsLegacy = &HE1E9 + Frigid = &HE9CA + FullAlpha = &HE97F + FullCircleMask = &HE91F + FullHiragana = &HE986 + FullKatakana = &HE987 + FullScreen = &HE740 + FullScreenLegacy = &HE1D9 + Game = &HE7FC + GameConsole = &HE967 + GlobalNavButton = &HE700 + Globe = &HE774 + GlobeLegacy = &HE12B + Go = &HE8AD + GoLegacy = &HE143 + GoLegacyMirrored = &HE1AA + GoMirrored = &HEA4F + GoToStart = &HE8FC + GoToStartLegacy = &HE1E4 + GotoToday = &HE8D1 + GotoTodayLegacy = &HE184 + GripperBarHorizontal = &HE76F + GripperBarVertical = &HE784 + GripperResize = &HE788 + GripperResizeMirrored = &HEA50 + GripperTool = &HE75E + Groceries = &HEC09 + GuestUser = &HEE57 + HalfAlpha = &HE97E + HalfDullSound = &HE9B0 + HalfKatakana = &HE988 + HalfStarLeft = &HE7C6 + HalfStarRight = &HE7C7 + Handwriting = &HE929 + HangUp = &HE778 + HangUpLegacy = &HE137 + HardDrive = &HEDA2 + Headphone = &HE7F6 + Headphone0 = &HED30 + Headphone1 = &HED31 + Headphone2 = &HED32 + Headphone3 = &HED33 + Headset = &HE95B + Health = &HE95E + Heart = &HEB51 + HeartBroken = &HEA92 + HeartBrokenLegacy = &HE7 + HeartBrokenZeroWidthLegacy = &HEC + HeartFill = &HEB52 + HeartFillLegacy = &HEA5 + HeartFillZeroWidthLegacy = &HEB + HeartLegacy = &HE6 + Help = &HE897 + HelpLegacy = &HE11B + HelpLegacyMirrored = &HE1F3 + HelpMirrored = &HEA51 + HideBcc = &HE8C5 + HideBccLegacy = &HE16A + Highlight = &HE7E6 + HighlightFill = &HE891 + HighlightFill2 = &HE82A + HighlightLegacy = &HE193 + History = &HE81C + Home = &HE80F + HomeGroup = &HEC26 + HomeLegacy = &HE10F + HomeSolid = &HEA8A + HorizontalTabKey = &HE7FD + IBeam = &HE933 + IBeamOutline = &HE934 + ImageExport = &HEE71 + Import = &HE8B5 + ImportAll = &HE8B6 + ImportAllLegacy = &HE151 + ImportAllLegacyMirrored = &HE1AE + ImportAllMirrored = &HEA53 + Important = &HE8C9 + ImportantBadge12 = &HEDB1 + ImportantLegacy = &HE171 + ImportLegacy = &HE150 + ImportLegacyMirrored = &HE1AD + ImportMirrored = &HEA52 + IncidentTriangle = &HE814 + IncreaseIndentLegacy = &HE291 + IncreaseIndentLegacyMirrored = &HE298 + Info = &HE946 + Info2 = &HEA1F + InkingCaret = &HED65 + InkingColorFill = &HED67 + InkingColorOutline = &HED66 + InkingTool = &HE76D + InkingToolFill = &HE88F + InkingToolFill2 = &HE829 + InPrivate = &HE727 + Input = &HE961 + InsiderHubApp = &HEC24 + InternetSharing = &HE704 + Italic = &HE8DB + ItalicCLegacy = &HE1B0 + ItalicILegacy = &HE1B6 + ItalicKLegacy = &HE1B4 + ItalicKoreanLegacy = &HE1BC + ItalicLegacy = &HE199 + ItalicRussianLegacy = &HE1EA + Japanese = &HE985 + JpnRomanji = &HE87C + JpnRomanjiLock = &HE87D + JpnRomanjiShift = &HE87E + JpnRomanjiShiftLock = &HE87F + Key12On = &HE980 + KeyboardBrightness = &HED39 + KeyboardClassic = &HE765 + KeyboardDismiss = &HE92F + KeyboardFull = &HEC31 + KeyboardLeftHanded = &HE763 + KeyBoardLegacy = &HE144 + KeyboardLowerBrightness = &HED3A + KeyboardOneHanded = &HED4C + KeyboardRightHanded = &HE764 + KeyboardShortcut = &HEDA7 + KeyboardSplit = &HE766 + KeyboardSplitLegacy = &HE8F + KeyboardStandard = &HE92E + KeyboardStandardLegacy = &HE87 + Korean = &HE97D + Label = &HE932 + LangJPN = &HE7DE + LanguageChs = &HE88D + LanguageCht = &HE88C + LanguageJpn = &HEC45 + LanguageKor = &HE88B + LaptopSelected = &HEC76 + LayoutLegacy = &HE2AE + Leaf = &HE8BE + LeaveChat = &HE89B + LeaveChatLegacy = &HE11F + LeaveChatMirrored = &HEA54 + LEDLight = &HE781 + LeftArrowKeyTime0 = &HEC52 + LeftDoubleQuote = &HE9B2 + LeftQuote = &HE848 + LengthLegacy = &HE2AD + Library = &HE8F1 + LibraryLegacy = &HE1D3 + Light = &HE793 + Lightbulb = &HEA80 + LightningBolt = &HE945 + LikeDislike = &HE8DF + LikeDislikeLegacy = &HE19D + LikeInlineLegacy = &HE209 + LikeLegacy = &HE19F + Link = &HE71B + LinkLegacy = &HE167 + List = &HEA37 + ListLegacy = &HE14C + ListLegacyMirrored = &HE175 + ListMirrored = &HEA55 + Location = &HE81D + LocationLegacy = &HE1D2 + Lock = &HE72E + LockLegacy = &HE1F6 + LockscreenDesktop = &HEE3F + LockScreenGlance = &HEE65 + LowerBrightness = &HEC8A + MagStripeReader = &HEC5C + Mail = &HE715 + MailBadge12 = &HEDB3 + MailFill = &HE8A8 + MailFillLegacy = &HE135 + MailForward = &HE89C + MailForwardLegacy = &HE120 + MailForwardLegacyMirrored = &HE1A8 + MailForwardMirrored = &HEA56 + MailLegacy = &HE119 + MailMessageLegacy = &HE20B + MailReply = &HE8CA + MailReplyAll = &HE8C2 + MailReplyAllLegacy = &HE165 + MailReplyAllLegacyMirrored = &HE1F2 + MailReplyAllMirrored = &HEA58 + MailReplyLegacy = &HE172 + MailReplyLegacyMirrored = &HE1AF + MailReplyMirrored = &HEA57 + Manage = &HE912 + ManageLegacy = &HE178 + MapCompassBottom = &HE813 + MapCompassTop = &HE812 + MapDirections = &HE816 + MapDrive = &HE8CE + MapDriveLegacy = &HE17B + MapLayers = &HE81E + MapLegacy = &HE1C4 + MapPin = &HE707 + MapPin2 = &HE7B7 + MapPinLegacy = &HE139 + Marker = &HED64 + Marquee = &HEF20 + Media = &HEA69 + MediaStorageTower = &HE965 + Megaphone = &HE789 + Memo = &HE77C + MemoLegacy = &HE1D5 + Message = &HE8BD + MessageLegacy = &HE15F + MicClipping = &HEC72 + MicError = &HEC56 + MicOff = &HEC54 + MicOn = &HEC71 + Microphone = &HE720 + MicrophoneLegacy = &HE1D6 + MicSleep = &HEC55 + MiracastLogoLarge = &HEC16 + MiracastLogoSmall = &HEC15 + MobActionCenter = &HEC42 + MobAirplane = &HEC40 + MobBattery0 = &HEBA0 + MobBattery1 = &HEBA1 + MobBattery10 = &HEBAA + MobBattery2 = &HEBA2 + MobBattery3 = &HEBA3 + MobBattery4 = &HEBA4 + MobBattery5 = &HEBA5 + MobBattery6 = &HEBA6 + MobBattery7 = &HEBA7 + MobBattery8 = &HEBA8 + MobBattery9 = &HEBA9 + MobBatteryCharging0 = &HEBAB + MobBatteryCharging1 = &HEBAC + MobBatteryCharging10 = &HEBB5 + MobBatteryCharging2 = &HEBAD + MobBatteryCharging3 = &HEBAE + MobBatteryCharging4 = &HEBAF + MobBatteryCharging5 = &HEBB0 + MobBatteryCharging6 = &HEBB1 + MobBatteryCharging7 = &HEBB2 + MobBatteryCharging8 = &HEBB3 + MobBatteryCharging9 = &HEBB4 + MobBatterySaver0 = &HEBB6 + MobBatterySaver1 = &HEBB7 + MobBatterySaver10 = &HEBC0 + MobBatterySaver2 = &HEBB8 + MobBatterySaver3 = &HEBB9 + MobBatterySaver4 = &HEBBA + MobBatterySaver5 = &HEBBB + MobBatterySaver6 = &HEBBC + MobBatterySaver7 = &HEBBD + MobBatterySaver8 = &HEBBE + MobBatterySaver9 = &HEBBF + MobBatteryUnknown = &HEC02 + MobBluetooth = &HEC41 + MobCallForwarding = &HEC7E + MobCallForwardingMirrored = &HEC7F + MobDrivingMode = &HEC47 + MobileContactLegacy = &HE25A + MobileLocked = &HEC20 + MobileSelected = &HEC75 + MobileTablet = &HE8CC + MobLocation = &HEC43 + MobQuietHours = &HEC46 + MobSignal1 = &HEC37 + MobSignal2 = &HEC38 + MobSignal3 = &HEC39 + MobSignal4 = &HEC3A + MobSignal5 = &HEC3B + MobWifi1 = &HEC3C + MobWifi2 = &HEC3D + MobWifi3 = &HEC3E + MobWifi4 = &HEC3F + MobWifiHotspot = &HEC44 + More = &HE712 + MoreLegacy = &HE10C + Mouse = &HE962 + MoveToFolder = &HE8DE + MoveToFolderLegacy = &HE19C + Movies = &HE8B2 + MultimediaDMP = &HED47 + MultimediaDMS = &HE953 + MultimediaDVR = &HE954 + MultimediaPMP = &HE955 + MultiSelect = &HE762 + MultiSelectLegacy = &HE133 + MultiSelectLegacyMirrored = &HE1EF + MultiSelectMirrored = &HEA98 + Multitask = &HE7C4 + Multitask16 = &HEE40 + MultitaskExpanded = &HEB91 + MusicAlbum = &HE93C + MusicInfo = &HE90B + MusicInfoLegacy = &HE142 + MusicNote = &HEC4F + Mute = &HE74F + MuteLegacy = &HE198 + MyNetwork = &HEC27 + Narrator = &HED4D + NarratorForward = &HEDA9 + NarratorForwardMirrored = &HEDAA + Network = &HE968 + NetworkAdapter = &HEDA3 + NetworkPrinter = &HEDA5 + NetworkTower = &HEC05 + NewFolder = &HE8F4 + NewFolderLegacy = &HE1DA + NewWindow = &HE78B + NewWindowLegacy = &HE17C + NextLegacy = &HE101 + NUIFace = &HEB68 + NUIFPContinueSlideAction = &HEB85 + NUIFPContinueSlideHand = &HEB84 + NUIFPPressAction = &HEB8B + NUIFPPressHand = &HEB8A + NUIFPPressRepeatAction = &HEB8D + NUIFPPressRepeatHand = &HEB8C + NUIFPRollLeftAction = &HEB89 + NUIFPRollLeftHand = &HEB88 + NUIFPRollRightHand = &HEB86 + NUIFPRollRightHandAction = &HEB87 + NUIFPStartSlideAction = &HEB83 + NUIFPStartSlideHand = &HEB82 + NUIIris = &HEB67 + OEM = &HE74C + OneBar = &HE905 + OneBarLegacy = &HE1E6 + OpenFile = &HE8E5 + OpenFileLegacy = &HE1A5 + OpenInNewWindow = &HE8A7 + OpenInNewWindowLegacy = &HE2B4 + OpenLocal = &HE8DA + OpenLocalLegacy = &HE197 + OpenPane = &HE8A0 + OpenPaneLegacy = &HE127 + OpenPaneLegacyMirrored = &HE1C0 + OpenPaneMirrored = &HEA5B + OpenWith = &HE7AC + OpenWithLegacy = &HE17D + OpenWithLegacyMirrored = &HE1ED + OpenWithMirrored = &HEA5C + Orientation = &HE8B4 + OrientationLegacy = &HE14F + OtherUser = &HE7EE + OtherUserLegacy = &HE1A6 + OutlineStarLegacy = &HE1CE + Package = &HE7B8 + Page = &HE7C3 + PageFillLegacy = &HE132 + PageLeft = &HE760 + PageLegacy = &HE160 + PageRight = &HE761 + PageSolid = &HE729 + PanMode = &HECE9 + ParkingLocation = &HE811 + ParkingLocationMirrored = &HEA5E + ParkingLocationSolid = &HEA8B + PartyLeader = &HECA7 + PasswordKeyHide = &HE9A9 + PasswordKeyShow = &HE9A8 + Paste = &HE77F + PasteLegacy = &HE16D + Pause = &HE769 + PauseBadge12 = &HEDB4 + PauseLegacy = &HE103 + PC1 = &HE977 + PC1Legacy = &HE211 + Pencil = &HED63 + PenPalette = &HEE56 + PenPaletteMirrored = &HEF16 + PenWorkspace = &HEDC6 + PenWorkspaceMirrored = &HEF15 + People = &HE716 + PeopleLegacy = &HE125 + PeriodKey = &HE843 + Permissions = &HE8D7 + PermissionsLegacy = &HE192 + PersonalFolder = &HEC25 + Personalize = &HE771 + Phone = &HE717 + PhoneBook = &HE780 + PhoneBookLegacy = &HE1D4 + PhoneLegacy = &HE13A + Photo = &HE91B + Photo2 = &HEB9F + Picture = &HE8B9 + PictureLegacy = &HE158 + PieSingle = &HEB05 + Pin = &HE718 + PinFill = &HE841 + PinLegacy = &HE141 + Pinned = &HE840 + PinnedFill = &HE842 + PlaceFolderLegacy = &HE18A + PLAP = &HEC19 + Play = &HE768 + Play36 = &HEE4A + PlaybackRate1x = &HEC57 + PlaybackRateOther = &HEC58 + PlayBadge12 = &HEDB5 + PlayLegacy = &HE102 + PlayOnLegacy = &HE29B + PointErase = &HED61 + PointEraseMirrored = &HEF18 + PoliceCar = &HEC81 + PostUpdate = &HE8F3 + PostUpdateLegacy = &HE1D7 + PowerButton = &HE7E8 + PresenceChicklet = &HE978 + PresenceChickletLegacy = &HE25E + PresenceChickletVideo = &HE979 + PresenceChickletVideoLegacy = &HE25D + Preview = &HE8FF + PreviewLegacy = &HE295 + PreviewLink = &HE8A1 + PreviewLinkLegacy = &HE12A + Previous = &HE892 + PreviousLegacy = &HE100 + Print = &HE749 + Printer3D = &HE914 + Printer3DLegacy = &HE2F7 + PrintfaxPrinterFile = &HE956 + PrintLegacy = &HE2F6 + Priority = &HE8D0 + PriorityLegacy = &HE182 + Process = &HE9F3 + Project = &HEBC6 + Projector = &HE95D + ProtectedDocument = &HE8A6 + ProtectedDocumentLegacy = &HE131 + ProvisioningPackage = &HE835 + PuncKey = &HE844 + PuncKey0 = &HE84C + PuncKey1 = &HE9B4 + PuncKey2 = &HE9B5 + PuncKey3 = &HE9B6 + PuncKey4 = &HE9B7 + PuncKey5 = &HE9B8 + PuncKey6 = &HE9B9 + PuncKey7 = &HE9BB + PuncKey8 = &HE9BC + PuncKey9 = &HE9BA + PuncKeyLeftBottom = &HE84D + PuncKeyRightBottom = &HE9B3 + Puzzle = &HEA86 + QuickNote = &HE70B + QuietHours = &HE708 + QWERTYOff = &HE983 + QWERTYOn = &HE982 + RadioBtnOff = &HECCA + RadioBtnOn = &HECCB + RadioBullet = &HE915 + RadioBullet2 = &HECCC + RatingStarFillLegacy = &HEB4 + RatingStarFillReducedPaddingHTMLLegacy = &HE82 + RatingStarFillSmallLegacy = &HEB5 + RatingStarFillZeroWidthLegacy = &HEA + RatingStarLegacy = &HE224 + Read = &HE8C3 + ReadingList = &HE7BC + ReadLegacy = &HE166 + ReceiptPrinter = &HEC5B + Recent = &HE823 + Record = &HE7C8 + RecordLegacy = &HE1F5 + Redo = &HE7A6 + RedoLegacy = &HE10D + ReduceTileLegacy = &HE140 + ReduceTileLegacyMirrored = &HE177 + Refresh = &HE72C + RefreshLegacy = &HE149 + RememberedDevice = &HE70C + Reminder = &HEB50 + ReminderFill = &HEB4F + Remote = &HE8AF + RemoteLegacy = &HE148 + Remove = &HE738 + RemoveFrom = &HECC9 + RemoveLegacy = &HE108 + Rename = &HE8AC + RenameLegacy = &HE13E + Repair = &HE90F + RepairLegacy = &HE15E + RepeatAll = &HE8EE + RepeatAllLegacy = &HE1CD + RepeatOne = &HE8ED + RepeatOneLegacy = &HE1CC + Reply = &HE97A + ReplyLegacy = &HE248 + ReplyMirrored = &HEE35 + ReportHacked = &HE730 + ReportHackedLegacy = &HE1DE + ResetDevice = &HED10 + ResetDrive = &HEBC4 + Reshare = &HE8EB + ReshareLegacy = &HE1CA + ResizeMouseLarge = &HE747 + ResizeMouseMedium = &HE744 + ResizeMouseMediumMirrored = &HEA5F + ResizeMouseSmall = &HE743 + ResizeMouseSmallMirrored = &HEA60 + ResizeMouseTall = &HE746 + ResizeMouseTallMirrored = &HEA61 + ResizeMouseWide = &HE745 + ResizeTouchLarger = &HE741 + ResizeTouchNarrower = &HE7EA + ResizeTouchNarrowerMirrored = &HEA62 + ResizeTouchShorter = &HE7EB + ResizeTouchSmaller = &HE742 + ResolutionLegacy = &HE2AC + ReturnKey = &HE751 + ReturnKeyLg = &HEB97 + ReturnKeySm = &HE966 + ReturnToWindow = &HE944 + ReturnToWindowLegacy = &HE2B3 + RevealPasswordLegacy = &HE52 + RevToggleKey = &HE845 + Rewind = &HEB9E + RightArrowKeyTime0 = &HEBE7 + RightArrowKeyTime1 = &HE846 + RightArrowKeyTime2 = &HE847 + RightArrowKeyTime3 = &HE84E + RightArrowKeyTime4 = &HE84F + RightDoubleQuote = &HE9B1 + RightQuote = &HE849 + Ringer = &HEA8F + RingerBadge12 = &HEDAC + RingerSilent = &HE7ED + RoamingDomestic = &HE879 + RoamingInternational = &HE878 + Robot = &HE99A + Rotate = &HE7AD + RotateCamera = &HE89E + RotateCameraLegacy = &HE124 + RotateLegacy = &HE14A + RotateMapLeft = &HE80D + RotateMapRight = &HE80C + RotationLock = &HE755 + Ruler = &HED5E + Save = &HE74E + SaveAs = &HE792 + SaveAsLegacy = &HE28F + SaveCopy = &HEA35 + SaveLegacy = &HE105 + SaveLocal = &HE78C + SaveLocalLegacy = &HE159 + Scan = &HE8FE + ScanLegacy = &HE294 + ScrollChevronDownBoldLegacy = &HE19 + ScrollChevronDownLegacy = &HE11 + ScrollChevronLeftBoldLegacy = &HE16 + ScrollChevronLeftLegacy = &HEE + ScrollChevronRightBoldLegacy = &HE17 + ScrollChevronRightLegacy = &HEF + ScrollChevronUpBoldLegacy = &HE18 + ScrollChevronUpLegacy = &HE10 + ScrollMode = &HECE7 + ScrollUpDown = &HEC8F + SDCard = &HE7F1 + Search = &HE721 + SearchAndApps = &HE773 + SearchboxLegacy = &HE94 + SelectAll = &HE8B3 + SelectAllLegacy = &HE14E + SemanticZoomLegacy = &HEB8 + Send = &HE724 + SendFill = &HE725 + SendFillMirrored = &HEA64 + SendLegacy = &HE122 + SendMirrored = &HEA63 + Sensor = &HE957 + SetlockScreen = &HE7B5 + SetlockScreenLegacy = &HE18C + SetTile = &HE97B + SetTileLegacy = &HE18D + Settings = &HE713 + SettingsBattery = &HEE63 + SettingsDisplaySound = &HE7F3 + SettingsLegacy = &HE115 + Share = &HE72D + ShareBroadband = &HE83A + Shield = &HEA18 + Shop = &HE719 + ShopLegacy = &HE14D + ShoppingCart = &HE7BF + ShowAllFiles1Legacy = &HE153 + ShowAllFiles3Legacy = &HE152 + ShowAllFilesLegacy = &HE154 + ShowBcc = &HE8C4 + ShowBccLegacy = &HE169 + ShowResults = &HE8BC + ShowResultsLegacy = &HE15C + ShowResultsLegacyMirrored = &HE1F1 + ShowResultsMirrored = &HEA65 + Shuffle = &HE8B1 + ShuffleLegacy = &HE14B + SignalBars1 = &HE86C + SignalBars2 = &HE86D + SignalBars3 = &HE86E + SignalBars4 = &HE86F + SignalBars5 = &HE870 + SignalError = &HED2E + SignalNotConnected = &HE871 + SignalRoaming = &HEC1E + SIMLock = &HE875 + SIMMissing = &HE876 + SIPMove = &HE759 + SIPRedock = &HE75B + SIPUndock = &HE75A + SizeLegacy = &HE2B2 + SkipBack10 = &HED3C + SkipForward30 = &HED3D + SliderThumb = &HEC13 + Slideshow = &HE786 + SlideshowLegacy = &HE173 + SlowMotionOn = &HEA79 + Smartcard = &HE963 + SmartcardVirtual = &HE964 + SolidStarLegacy = &HE1CF + Sort = &HE8CB + SortLegacy = &HE174 + Speakers = &HE7F5 + SpeedHigh = &HEC4A + SpeedMedium = &HEC49 + SpeedOff = &HEC48 + StartPoint = &HE819 + StartPointSolid = &HEB49 + StatusCircle = &HEA81 + StatusCircleLeft = &HEBFD + StatusConnecting1 = &HEB57 + StatusConnecting2 = &HEB58 + StatusDataTransfer = &HE880 + StatusDataTransferVPN = &HE881 + StatusDualSIM1 = &HE884 + StatusDualSIM1VPN = &HE885 + StatusDualSIM2 = &HE882 + StatusDualSIM2VPN = &HE883 + StatusError = &HEA83 + StatusErrorFull = &HEB90 + StatusErrorLeft = &HEBFF + StatusSGLTE = &HE886 + StatusSGLTECell = &HE887 + StatusSGLTEDataVPN = &HE888 + StatusTriangle = &HEA82 + StatusTriangleLeft = &HEBFE + StatusUnsecure = &HEB59 + StatusVPN = &HE889 + StatusWarning = &HEA84 + StatusWarningLeft = &HEC00 + StockDown = &HEB0F + StockUp = &HEB11 + StopLegacy = &HE15B + StopPoint = &HE81A + StopPointSolid = &HEB4A + StopSlideshowLegacy = &HE191 + Stopwatch = &HE916 + StorageNetworkWireless = &HE969 + StorageOptical = &HE958 + StorageTape = &HE96A + Streaming = &HE93E + StreamingEnterprise = &HED2F + Street = &HE913 + StreetLegacy = &HE1C3 + StreetsideSplitExpand = &HE803 + StreetsideSplitMinimize = &HE802 + StrokeErase = &HED60 + StrokeEraseMirrored = &HEF17 + Subtitles = &HED1E + SubtitlesAudio = &HED1F + SurfaceHub = &HE8AE + Sustainable = &HEC0A + Swipe = &HE927 + SwipeRevealArt = &HEC6D + Switch = &HE8AB + SwitchApps = &HE8F9 + SwitchAppsLegacy = &HE1E1 + SwitchLegacy = &HE13C + SwitchUser = &HE748 + Sync = &HE895 + SyncBadge12 = &HEDAB + SyncError = &HEA6A + SyncFolder = &HE8F7 + SyncFolderLegacy = &HE1DF + SyncLegacy = &HE117 + System = &HE770 + Tablet = &HE70A + TabletMode = &HEBFC + TabletSelected = &HEC74 + Tag = &HE8EC + TagLegacy = &HE1CB + TapAndSend = &HE9A1 + TaskbarPhone = &HEE64 + ThisPC = &HEC4E + ThoughtBubble = &HEA91 + ThreeBars = &HE907 + ThreeBarsLegacy = &HE1E8 + Tiles = &HECA5 + TiltDown = &HE80A + TiltUp = &HE809 + TimeLanguage = &HE775 + ToggleBorder = &HEC12 + ToggleFilled = &HEC11 + ToggleThumb = &HEC14 + ToolTip = &HE82F + Touch = &HE815 + TouchPointer = &HE7C9 + TouchPointerLegacy = &HE1E3 + Touchscreen = &HEDA4 + Trackers = &HEADF + TrackersMirrored = &HEE92 + Train = &HE7C0 + TrainSolid = &HEB4D + TreeFolderFolder = &HED41 + TreeFolderFolderFill = &HED42 + TreeFolderFolderOpen = &HED43 + TreeFolderFolderOpenFill = &HED44 + Trim = &HE78A + TrimLegacy = &HE12C + TVMonitor = &HE7F4 + TVMonitorSelected = &HEC77 + TwoBars = &HE906 + TwoBarsLegacy = &HE1E7 + TwoPage = &HE89A + TwoPageLegacy = &HE11E + Type = &HE97C + TypeLegacy = &HE2B0 + TypingIndicatorLegacy = &HE25C + Underline = &HE8DC + UnderlineLegacy = &HE19A + UnderlineLKoreanLegacy = &HE1BB + UnderlineRussianLegacy = &HE1B8 + UnderlineSLegacy = &HE1B2 + UnderlineULegacy = &HE1B5 + UnderscoreSpace = &HE75D + Undo = &HE7A7 + UndoLegacy = &HE10E + Unfavorite = &HE8D9 + Unfavorite2Legacy = &HE24A + UnfavoriteLegacy = &HE195 + Unit = &HECC6 + Unlock = &HE785 + UnlockLegacy = &HE1F7 + Unpin = &HE77A + UnpinLegacy = &HE196 + UnsyncFolder = &HE8F6 + UnsyncFolderLegacy = &HE1DD + Up = &HE74A + UpArrowShiftKey = &HE752 + UpdateRestore = &HE777 + UpLegacy = &HE110 + Upload = &HE898 + UploadLegacy = &HE11C + UploadSkyDriveLegacy = &HE183 + UpShiftKey = &HE84B + USB = &HE88E + USBSafeConnect = &HECF3 + Vibrate = &HE877 + Video = &HE714 + VideoChat = &HE8AA + VideoChatLegacy = &HE13B + VideoInlineLegacy = &HE20A + VideoLegacy = &HE116 + View = &HE890 + ViewAll = &HE8A9 + ViewAllLegacy = &HE138 + ViewLegacy = &HE18B + Volume = &HE767 + Volume0 = &HE992 + Volume1 = &HE993 + Volume2 = &HE994 + Volume3 = &HE995 + VolumeBars = &HEBC5 + VolumeLegacy = &HE15D + VPN = &HE705 + Walk = &HE805 + WalkSolid = &HE726 + Warning = &HE7BA + Webcam = &HE8B8 + Webcam2 = &HE960 + WebcamLegacy = &HE156 + Wheel = &HEE94 + Wifi = &HE701 + Wifi1 = &HE872 + Wifi2 = &HE873 + Wifi3 = &HE874 + WifiAttentionOverlay = &HE998 + WifiCall0 = &HEBD5 + WifiCall1 = &HEBD6 + WifiCall2 = &HEBD7 + WifiCall3 = &HEBD8 + WifiCall4 = &HEBD9 + WifiCallBars = &HEBD4 + WifiError0 = &HEB5A + WifiError1 = &HEB5B + WifiError2 = &HEB5C + WifiError3 = &HEB5D + WifiError4 = &HEB5E + WifiEthernet = &HEE77 + WifiHotspot = &HE88A + WifiWarning0 = &HEB5F + WifiWarning1 = &HEB60 + WifiWarning2 = &HEB61 + WifiWarning3 = &HEB62 + WifiWarning4 = &HEB63 + WindDirection = &HEBE6 + WiredUSB = &HECF0 + WirelessUSB = &HECF1 + Work = &HE821 + WorkSolid = &HEB4E + World = &HE909 + WorldLegacy = &HE128 + XboxOneConsole = &HE990 + ZeroBars = &HE904 + ZeroBarsLegacy = &HE1E5 + Zoom = &HE71E + ZoomIn = &HE8A3 + ZoomInLegacy = &HE12E + ZoomLegacy = &HE1A3 + ZoomMode = &HECE8 + ZoomOut = &HE71F + ZoomOutLegacy = &HE1A4 + fa_500px = &HF26E + fa_address_book = &HF2B9 + fa_address_book_o = &HF2BA + fa_address_card = &HF2BB + fa_address_card_o = &HF2BC + fa_adjust = &HF042 + fa_adn = &HF170 + fa_align_center = &HF037 + fa_align_justify = &HF039 + fa_align_left = &HF036 + fa_align_right = &HF038 + fa_amazon = &HF270 + fa_ambulance = &HF0F9 + fa_american_sign_language_interpreting = &HF2A3 + fa_anchor = &HF13D + fa_android = &HF17B + fa_angellist = &HF209 + fa_angle_double_down = &HF103 + fa_angle_double_left = &HF100 + fa_angle_double_right = &HF101 + fa_angle_double_up = &HF102 + fa_angle_down = &HF107 + fa_angle_left = &HF104 + fa_angle_right = &HF105 + fa_angle_up = &HF106 + fa_apple = &HF179 + fa_archive = &HF187 + fa_area_chart = &HF1FE + fa_arrow_circle_down = &HF0AB + fa_arrow_circle_left = &HF0A8 + fa_arrow_circle_o_down = &HF01A + fa_arrow_circle_o_left = &HF190 + fa_arrow_circle_o_right = &HF18E + fa_arrow_circle_o_up = &HF01B + fa_arrow_circle_right = &HF0A9 + fa_arrow_circle_up = &HF0AA + fa_arrow_down = &HF063 + fa_arrow_left = &HF060 + fa_arrow_right = &HF061 + fa_arrow_up = &HF062 + fa_arrows = &HF047 + fa_arrows_alt = &HF0B2 + fa_arrows_h = &HF07E + fa_arrows_v = &HF07D + fa_asl_interpreting = &HF2A3 + fa_assistive_listening_systems = &HF2A2 + fa_asterisk = &HF069 + fa_at = &HF1FA + fa_audio_description = &HF29E + fa_automobile = &HF1B9 + fa_backward = &HF04A + fa_balance_scale = &HF24E + fa_ban = &HF05E + fa_bandcamp = &HF2D5 + fa_bank = &HF19C + fa_bar_chart = &HF080 + fa_bar_chart_o = &HF080 + fa_barcode = &HF02A + fa_bars = &HF0C9 + fa_bath = &HF2CD + fa_bathtub = &HF2CD + fa_battery = &HF240 + fa_battery_0 = &HF244 + fa_battery_1 = &HF243 + fa_battery_2 = &HF242 + fa_battery_3 = &HF241 + fa_battery_4 = &HF240 + fa_battery_empty = &HF244 + fa_battery_full = &HF240 + fa_battery_half = &HF242 + fa_battery_quarter = &HF243 + fa_battery_three_quarters = &HF241 + fa_bed = &HF236 + fa_beer = &HF0FC + fa_behance = &HF1B4 + fa_behance_square = &HF1B5 + fa_bell = &HF0F3 + fa_bell_o = &HF0A2 + fa_bell_slash = &HF1F6 + fa_bell_slash_o = &HF1F7 + fa_bicycle = &HF206 + fa_binoculars = &HF1E5 + fa_birthday_cake = &HF1FD + fa_bitbucket = &HF171 + fa_bitbucket_square = &HF172 + fa_bitcoin = &HF15A + fa_black_tie = &HF27E + fa_blind = &HF29D + fa_bluetooth = &HF293 + fa_bluetooth_b = &HF294 + fa_bold = &HF032 + fa_bolt = &HF0E7 + fa_bomb = &HF1E2 + fa_book = &HF02D + fa_bookmark = &HF02E + fa_bookmark_o = &HF097 + fa_braille = &HF2A1 + fa_briefcase = &HF0B1 + fa_btc = &HF15A + fa_bug = &HF188 + fa_building = &HF1AD + fa_building_o = &HF0F7 + fa_bullhorn = &HF0A1 + fa_bullseye = &HF140 + fa_bus = &HF207 + fa_buysellads = &HF20D + fa_cab = &HF1BA + fa_calculator = &HF1EC + fa_calendar = &HF073 + fa_calendar_check_o = &HF274 + fa_calendar_minus_o = &HF272 + fa_calendar_o = &HF133 + fa_calendar_plus_o = &HF271 + fa_calendar_times_o = &HF273 + fa_camera = &HF030 + fa_camera_retro = &HF083 + fa_car = &HF1B9 + fa_caret_down = &HF0D7 + fa_caret_left = &HF0D9 + fa_caret_right = &HF0DA + fa_caret_square_o_down = &HF150 + fa_caret_square_o_left = &HF191 + fa_caret_square_o_right = &HF152 + fa_caret_square_o_up = &HF151 + fa_caret_up = &HF0D8 + fa_cart_arrow_down = &HF218 + fa_cart_plus = &HF217 + fa_cc = &HF20A + fa_cc_amex = &HF1F3 + fa_cc_diners_club = &HF24C + fa_cc_discover = &HF1F2 + fa_cc_jcb = &HF24B + fa_cc_mastercard = &HF1F1 + fa_cc_paypal = &HF1F4 + fa_cc_stripe = &HF1F5 + fa_cc_visa = &HF1F0 + fa_certificate = &HF0A3 + fa_chain = &HF0C1 + fa_chain_broken = &HF127 + fa_check = &HF00C + fa_check_circle = &HF058 + fa_check_circle_o = &HF05D + fa_check_square = &HF14A + fa_check_square_o = &HF046 + fa_chevron_circle_down = &HF13A + fa_chevron_circle_left = &HF137 + fa_chevron_circle_right = &HF138 + fa_chevron_circle_up = &HF139 + fa_chevron_down = &HF078 + fa_chevron_left = &HF053 + fa_chevron_right = &HF054 + fa_chevron_up = &HF077 + fa_child = &HF1AE + fa_chrome = &HF268 + fa_circle = &HF111 + fa_circle_o = &HF10C + fa_circle_o_notch = &HF1CE + fa_circle_thin = &HF1DB + fa_clipboard = &HF0EA + fa_clock_o = &HF017 + fa_clone = &HF24D + fa_close = &HF00D + fa_cloud = &HF0C2 + fa_cloud_download = &HF0ED + fa_cloud_upload = &HF0EE + fa_cny = &HF157 + fa_code = &HF121 + fa_code_fork = &HF126 + fa_codepen = &HF1CB + fa_codiepie = &HF284 + fa_coffee = &HF0F4 + fa_cog = &HF013 + fa_cogs = &HF085 + fa_columns = &HF0DB + fa_comment = &HF075 + fa_comment_o = &HF0E5 + fa_commenting = &HF27A + fa_commenting_o = &HF27B + fa_comments = &HF086 + fa_comments_o = &HF0E6 + fa_compass = &HF14E + fa_compress = &HF066 + fa_connectdevelop = &HF20E + fa_contao = &HF26D + fa_copy = &HF0C5 + fa_copyright = &HF1F9 + fa_creative_commons = &HF25E + fa_credit_card = &HF09D + fa_credit_card_alt = &HF283 + fa_crop = &HF125 + fa_crosshairs = &HF05B + fa_css3 = &HF13C + fa_cube = &HF1B2 + fa_cubes = &HF1B3 + fa_cut = &HF0C4 + fa_cutlery = &HF0F5 + fa_dashboard = &HF0E4 + fa_dashcube = &HF210 + fa_database = &HF1C0 + fa_deaf = &HF2A4 + fa_deafness = &HF2A4 + fa_dedent = &HF03B + fa_delicious = &HF1A5 + fa_desktop = &HF108 + fa_deviantart = &HF1BD + fa_diamond = &HF219 + fa_digg = &HF1A6 + fa_dollar = &HF155 + fa_dot_circle_o = &HF192 + fa_download = &HF019 + fa_dribbble = &HF17D + fa_drivers_license = &HF2C2 + fa_drivers_license_o = &HF2C3 + fa_dropbox = &HF16B + fa_drupal = &HF1A9 + fa_edge = &HF282 + fa_edit = &HF044 + fa_eercast = &HF2DA + fa_eject = &HF052 + fa_ellipsis_h = &HF141 + fa_ellipsis_v = &HF142 + fa_empire = &HF1D1 + fa_envelope = &HF0E0 + fa_envelope_o = &HF003 + fa_envelope_open = &HF2B6 + fa_envelope_open_o = &HF2B7 + fa_envelope_square = &HF199 + fa_envira = &HF299 + fa_eraser = &HF12D + fa_etsy = &HF2D7 + fa_eur = &HF153 + fa_euro = &HF153 + fa_exchange = &HF0EC + fa_exclamation = &HF12A + fa_exclamation_circle = &HF06A + fa_exclamation_triangle = &HF071 + fa_expand = &HF065 + fa_expeditedssl = &HF23E + fa_external_link = &HF08E + fa_external_link_square = &HF14C + fa_eye = &HF06E + fa_eye_slash = &HF070 + fa_eyedropper = &HF1FB + fa_fa = &HF2B4 + fa_facebook = &HF09A + fa_facebook_f = &HF09A + fa_facebook_official = &HF230 + fa_facebook_square = &HF082 + fa_fast_backward = &HF049 + fa_fast_forward = &HF050 + fa_fax = &HF1AC + fa_feed = &HF09E + fa_female = &HF182 + fa_fighter_jet = &HF0FB + fa_file = &HF15B + fa_file_archive_o = &HF1C6 + fa_file_audio_o = &HF1C7 + fa_file_code_o = &HF1C9 + fa_file_excel_o = &HF1C3 + fa_file_image_o = &HF1C5 + fa_file_movie_o = &HF1C8 + fa_file_o = &HF016 + fa_file_pdf_o = &HF1C1 + fa_file_photo_o = &HF1C5 + fa_file_picture_o = &HF1C5 + fa_file_powerpoint_o = &HF1C4 + fa_file_sound_o = &HF1C7 + fa_file_text = &HF15C + fa_file_text_o = &HF0F6 + fa_file_video_o = &HF1C8 + fa_file_word_o = &HF1C2 + fa_file_zip_o = &HF1C6 + fa_files_o = &HF0C5 + fa_film = &HF008 + fa_filter = &HF0B0 + fa_fire = &HF06D + fa_fire_extinguisher = &HF134 + fa_firefox = &HF269 + fa_first_order = &HF2B0 + fa_flag = &HF024 + fa_flag_checkered = &HF11E + fa_flag_o = &HF11D + fa_flash = &HF0E7 + fa_flask = &HF0C3 + fa_flickr = &HF16E + fa_floppy_o = &HF0C7 + fa_folder = &HF07B + fa_folder_o = &HF114 + fa_folder_open = &HF07C + fa_folder_open_o = &HF115 + fa_font = &HF031 + fa_font_awesome = &HF2B4 + fa_fonticons = &HF280 + fa_fort_awesome = &HF286 + fa_forumbee = &HF211 + fa_forward = &HF04E + fa_foursquare = &HF180 + fa_free_code_camp = &HF2C5 + fa_frown_o = &HF119 + fa_futbol_o = &HF1E3 + fa_gamepad = &HF11B + fa_gavel = &HF0E3 + fa_gbp = &HF154 + fa_ge = &HF1D1 + fa_gear = &HF013 + fa_gears = &HF085 + fa_genderless = &HF22D + fa_get_pocket = &HF265 + fa_gg = &HF260 + fa_gg_circle = &HF261 + fa_gift = &HF06B + fa_git = &HF1D3 + fa_git_square = &HF1D2 + fa_github = &HF09B + fa_github_alt = &HF113 + fa_github_square = &HF092 + fa_gitlab = &HF296 + fa_gittip = &HF184 + fa_glass = &HF000 + fa_glide = &HF2A5 + fa_glide_g = &HF2A6 + fa_globe = &HF0AC + fa_google = &HF1A0 + fa_google_plus = &HF0D5 + fa_google_plus_circle = &HF2B3 + fa_google_plus_official = &HF2B3 + fa_google_plus_square = &HF0D4 + fa_google_wallet = &HF1EE + fa_graduation_cap = &HF19D + fa_gratipay = &HF184 + fa_grav = &HF2D6 + fa_group = &HF0C0 + fa_h_square = &HF0FD + fa_hacker_news = &HF1D4 + fa_hand_grab_o = &HF255 + fa_hand_lizard_o = &HF258 + fa_hand_o_down = &HF0A7 + fa_hand_o_left = &HF0A5 + fa_hand_o_right = &HF0A4 + fa_hand_o_up = &HF0A6 + fa_hand_paper_o = &HF256 + fa_hand_peace_o = &HF25B + fa_hand_pointer_o = &HF25A + fa_hand_rock_o = &HF255 + fa_hand_scissors_o = &HF257 + fa_hand_spock_o = &HF259 + fa_hand_stop_o = &HF256 + fa_handshake_o = &HF2B5 + fa_hard_of_hearing = &HF2A4 + fa_hashtag = &HF292 + fa_hdd_o = &HF0A0 + fa_header = &HF1DC + fa_headphones = &HF025 + fa_heart = &HF004 + fa_heart_o = &HF08A + fa_heartbeat = &HF21E + fa_history = &HF1DA + fa_home = &HF015 + fa_hospital_o = &HF0F8 + fa_hotel = &HF236 + fa_hourglass = &HF254 + fa_hourglass_1 = &HF251 + fa_hourglass_2 = &HF252 + fa_hourglass_3 = &HF253 + fa_hourglass_end = &HF253 + fa_hourglass_half = &HF252 + fa_hourglass_o = &HF250 + fa_hourglass_start = &HF251 + fa_houzz = &HF27C + fa_html5 = &HF13B + fa_i_cursor = &HF246 + fa_id_badge = &HF2C1 + fa_id_card = &HF2C2 + fa_id_card_o = &HF2C3 + fa_ils = &HF20B + fa_image = &HF03E + fa_imdb = &HF2D8 + fa_inbox = &HF01C + fa_indent = &HF03C + fa_industry = &HF275 + fa_info = &HF129 + fa_info_circle = &HF05A + fa_inr = &HF156 + fa_instagram = &HF16D + fa_institution = &HF19C + fa_internet_explorer = &HF26B + fa_intersex = &HF224 + fa_ioxhost = &HF208 + fa_italic = &HF033 + fa_joomla = &HF1AA + fa_jpy = &HF157 + fa_jsfiddle = &HF1CC + fa_key = &HF084 + fa_keyboard_o = &HF11C + fa_krw = &HF159 + fa_language = &HF1AB + fa_laptop = &HF109 + fa_lastfm = &HF202 + fa_lastfm_square = &HF203 + fa_leaf = &HF06C + fa_leanpub = &HF212 + fa_legal = &HF0E3 + fa_lemon_o = &HF094 + fa_level_down = &HF149 + fa_level_up = &HF148 + fa_life_bouy = &HF1CD + fa_life_buoy = &HF1CD + fa_life_ring = &HF1CD + fa_life_saver = &HF1CD + fa_lightbulb_o = &HF0EB + fa_line_chart = &HF201 + fa_link = &HF0C1 + fa_linkedin = &HF0E1 + fa_linkedin_square = &HF08C + fa_linode = &HF2B8 + fa_linux = &HF17C + fa_list = &HF03A + fa_list_alt = &HF022 + fa_list_ol = &HF0CB + fa_list_ul = &HF0CA + fa_location_arrow = &HF124 + fa_lock = &HF023 + fa_long_arrow_down = &HF175 + fa_long_arrow_left = &HF177 + fa_long_arrow_right = &HF178 + fa_long_arrow_up = &HF176 + fa_low_vision = &HF2A8 + fa_magic = &HF0D0 + fa_magnet = &HF076 + fa_mail_forward = &HF064 + fa_mail_reply = &HF112 + fa_mail_reply_all = &HF122 + fa_male = &HF183 + fa_map = &HF279 + fa_map_marker = &HF041 + fa_map_o = &HF278 + fa_map_pin = &HF276 + fa_map_signs = &HF277 + fa_mars = &HF222 + fa_mars_double = &HF227 + fa_mars_stroke = &HF229 + fa_mars_stroke_h = &HF22B + fa_mars_stroke_v = &HF22A + fa_maxcdn = &HF136 + fa_meanpath = &HF20C + fa_medium = &HF23A + fa_medkit = &HF0FA + fa_meetup = &HF2E0 + fa_meh_o = &HF11A + fa_mercury = &HF223 + fa_microchip = &HF2DB + fa_microphone = &HF130 + fa_microphone_slash = &HF131 + fa_minus = &HF068 + fa_minus_circle = &HF056 + fa_minus_square = &HF146 + fa_minus_square_o = &HF147 + fa_mixcloud = &HF289 + fa_mobile = &HF10B + fa_mobile_phone = &HF10B + fa_modx = &HF285 + fa_money = &HF0D6 + fa_moon_o = &HF186 + fa_mortar_board = &HF19D + fa_motorcycle = &HF21C + fa_mouse_pointer = &HF245 + fa_music = &HF001 + fa_navicon = &HF0C9 + fa_neuter = &HF22C + fa_newspaper_o = &HF1EA + fa_object_group = &HF247 + fa_object_ungroup = &HF248 + fa_odnoklassniki = &HF263 + fa_odnoklassniki_square = &HF264 + fa_opencart = &HF23D + fa_openid = &HF19B + fa_opera = &HF26A + fa_optin_monster = &HF23C + fa_outdent = &HF03B + fa_pagelines = &HF18C + fa_paint_brush = &HF1FC + fa_paper_plane = &HF1D8 + fa_paper_plane_o = &HF1D9 + fa_paperclip = &HF0C6 + fa_paragraph = &HF1DD + fa_paste = &HF0EA + fa_pause = &HF04C + fa_pause_circle = &HF28B + fa_pause_circle_o = &HF28C + fa_paw = &HF1B0 + fa_paypal = &HF1ED + fa_pencil = &HF040 + fa_pencil_square = &HF14B + fa_pencil_square_o = &HF044 + fa_percent = &HF295 + fa_phone = &HF095 + fa_phone_square = &HF098 + fa_photo = &HF03E + fa_picture_o = &HF03E + fa_pie_chart = &HF200 + fa_pied_piper = &HF2AE + fa_pied_piper_alt = &HF1A8 + fa_pied_piper_pp = &HF1A7 + fa_pinterest = &HF0D2 + fa_pinterest_p = &HF231 + fa_pinterest_square = &HF0D3 + fa_plane = &HF072 + fa_play = &HF04B + fa_play_circle = &HF144 + fa_play_circle_o = &HF01D + fa_plug = &HF1E6 + fa_plus = &HF067 + fa_plus_circle = &HF055 + fa_plus_square = &HF0FE + fa_plus_square_o = &HF196 + fa_podcast = &HF2CE + fa_power_off = &HF011 + fa_print = &HF02F + fa_product_hunt = &HF288 + fa_puzzle_piece = &HF12E + fa_qq = &HF1D6 + fa_qrcode = &HF029 + fa_question = &HF128 + fa_question_circle = &HF059 + fa_question_circle_o = &HF29C + fa_quora = &HF2C4 + fa_quote_left = &HF10D + fa_quote_right = &HF10E + fa_ra = &HF1D0 + fa_random = &HF074 + fa_ravelry = &HF2D9 + fa_rebel = &HF1D0 + fa_recycle = &HF1B8 + fa_reddit = &HF1A1 + fa_reddit_alien = &HF281 + fa_reddit_square = &HF1A2 + fa_refresh = &HF021 + fa_registered = &HF25D + fa_remove = &HF00D + fa_renren = &HF18B + fa_reorder = &HF0C9 + fa_repeat = &HF01E + fa_reply = &HF112 + fa_reply_all = &HF122 + fa_resistance = &HF1D0 + fa_retweet = &HF079 + fa_rmb = &HF157 + fa_road = &HF018 + fa_rocket = &HF135 + fa_rotate_left = &HF0E2 + fa_rotate_right = &HF01E + fa_rouble = &HF158 + fa_rss = &HF09E + fa_rss_square = &HF143 + fa_rub = &HF158 + fa_ruble = &HF158 + fa_rupee = &HF156 + fa_s15 = &HF2CD + fa_safari = &HF267 + fa_save = &HF0C7 + fa_scissors = &HF0C4 + fa_scribd = &HF28A + fa_search = &HF002 + fa_search_minus = &HF010 + fa_search_plus = &HF00E + fa_sellsy = &HF213 + fa_send = &HF1D8 + fa_send_o = &HF1D9 + fa_server = &HF233 + fa_share = &HF064 + fa_share_alt = &HF1E0 + fa_share_alt_square = &HF1E1 + fa_share_square = &HF14D + fa_share_square_o = &HF045 + fa_shekel = &HF20B + fa_sheqel = &HF20B + fa_shield = &HF132 + fa_ship = &HF21A + fa_shirtsinbulk = &HF214 + fa_shopping_bag = &HF290 + fa_shopping_basket = &HF291 + fa_shopping_cart = &HF07A + fa_shower = &HF2CC + fa_sign_in = &HF090 + fa_sign_language = &HF2A7 + fa_sign_out = &HF08B + fa_signal = &HF012 + fa_signing = &HF2A7 + fa_simplybuilt = &HF215 + fa_sitemap = &HF0E8 + fa_skyatlas = &HF216 + fa_skype = &HF17E + fa_slack = &HF198 + fa_sliders = &HF1DE + fa_slideshare = &HF1E7 + fa_smile_o = &HF118 + fa_snapchat = &HF2AB + fa_snapchat_ghost = &HF2AC + fa_snapchat_square = &HF2AD + fa_snowflake_o = &HF2DC + fa_soccer_ball_o = &HF1E3 + fa_sort = &HF0DC + fa_sort_alpha_asc = &HF15D + fa_sort_alpha_desc = &HF15E + fa_sort_amount_asc = &HF160 + fa_sort_amount_desc = &HF161 + fa_sort_asc = &HF0DE + fa_sort_desc = &HF0DD + fa_sort_down = &HF0DD + fa_sort_numeric_asc = &HF162 + fa_sort_numeric_desc = &HF163 + fa_sort_up = &HF0DE + fa_soundcloud = &HF1BE + fa_space_shuttle = &HF197 + fa_spinner = &HF110 + fa_spoon = &HF1B1 + fa_spotify = &HF1BC + fa_square = &HF0C8 + fa_square_o = &HF096 + fa_stack_exchange = &HF18D + fa_stack_overflow = &HF16C + fa_star = &HF005 + fa_star_half = &HF089 + fa_star_half_empty = &HF123 + fa_star_half_full = &HF123 + fa_star_half_o = &HF123 + fa_star_o = &HF006 + fa_steam = &HF1B6 + fa_steam_square = &HF1B7 + fa_step_backward = &HF048 + fa_step_forward = &HF051 + fa_stethoscope = &HF0F1 + fa_sticky_note = &HF249 + fa_sticky_note_o = &HF24A + fa_stop = &HF04D + fa_stop_circle = &HF28D + fa_stop_circle_o = &HF28E + fa_street_view = &HF21D + fa_strikethrough = &HF0CC + fa_stumbleupon = &HF1A4 + fa_stumbleupon_circle = &HF1A3 + fa_subscript = &HF12C + fa_subway = &HF239 + fa_suitcase = &HF0F2 + fa_sun_o = &HF185 + fa_superpowers = &HF2DD + fa_superscript = &HF12B + fa_support = &HF1CD + fa_table = &HF0CE + fa_tablet = &HF10A + fa_tachometer = &HF0E4 + fa_tag = &HF02B + fa_tags = &HF02C + fa_tasks = &HF0AE + fa_taxi = &HF1BA + fa_telegram = &HF2C6 + fa_television = &HF26C + fa_tencent_weibo = &HF1D5 + fa_terminal = &HF120 + fa_text_height = &HF034 + fa_text_width = &HF035 + fa_th = &HF00A + fa_th_large = &HF009 + fa_th_list = &HF00B + fa_themeisle = &HF2B2 + fa_thermometer = &HF2C7 + fa_thermometer_0 = &HF2CB + fa_thermometer_1 = &HF2CA + fa_thermometer_2 = &HF2C9 + fa_thermometer_3 = &HF2C8 + fa_thermometer_4 = &HF2C7 + fa_thermometer_empty = &HF2CB + fa_thermometer_full = &HF2C7 + fa_thermometer_half = &HF2C9 + fa_thermometer_quarter = &HF2CA + fa_thermometer_three_quarters = &HF2C8 + fa_thumb_tack = &HF08D + fa_thumbs_down = &HF165 + fa_thumbs_o_down = &HF088 + fa_thumbs_o_up = &HF087 + fa_thumbs_up = &HF164 + fa_ticket = &HF145 + fa_times = &HF00D + fa_times_circle = &HF057 + fa_times_circle_o = &HF05C + fa_times_rectangle = &HF2D3 + fa_times_rectangle_o = &HF2D4 + fa_tint = &HF043 + fa_toggle_down = &HF150 + fa_toggle_left = &HF191 + fa_toggle_off = &HF204 + fa_toggle_on = &HF205 + fa_toggle_right = &HF152 + fa_toggle_up = &HF151 + fa_trademark = &HF25C + fa_train = &HF238 + fa_transgender = &HF224 + fa_transgender_alt = &HF225 + fa_trash = &HF1F8 + fa_trash_o = &HF014 + fa_tree = &HF1BB + fa_trello = &HF181 + fa_tripadvisor = &HF262 + fa_trophy = &HF091 + fa_truck = &HF0D1 + fa_try = &HF195 + fa_tty = &HF1E4 + fa_tumblr = &HF173 + fa_tumblr_square = &HF174 + fa_turkish_lira = &HF195 + fa_tv = &HF26C + fa_twitch = &HF1E8 + fa_twitter = &HF099 + fa_twitter_square = &HF081 + fa_umbrella = &HF0E9 + fa_underline = &HF0CD + fa_undo = &HF0E2 + fa_universal_access = &HF29A + fa_university = &HF19C + fa_unlink = &HF127 + fa_unlock = &HF09C + fa_unlock_alt = &HF13E + fa_unsorted = &HF0DC + fa_upload = &HF093 + fa_usb = &HF287 + fa_usd = &HF155 + fa_user = &HF007 + fa_user_circle = &HF2BD + fa_user_circle_o = &HF2BE + fa_user_md = &HF0F0 + fa_user_o = &HF2C0 + fa_user_plus = &HF234 + fa_user_secret = &HF21B + fa_user_times = &HF235 + fa_users = &HF0C0 + fa_vcard = &HF2BB + fa_vcard_o = &HF2BC + fa_venus = &HF221 + fa_venus_double = &HF226 + fa_venus_mars = &HF228 + fa_viacoin = &HF237 + fa_viadeo = &HF2A9 + fa_viadeo_square = &HF2AA + fa_video_camera = &HF03D + fa_vimeo = &HF27D + fa_vimeo_square = &HF194 + fa_vine = &HF1CA + fa_vk = &HF189 + fa_volume_control_phone = &HF2A0 + fa_volume_down = &HF027 + fa_volume_off = &HF026 + fa_volume_up = &HF028 + fa_warning = &HF071 + fa_wechat = &HF1D7 + fa_weibo = &HF18A + fa_weixin = &HF1D7 + fa_whatsapp = &HF232 + fa_wheelchair = &HF193 + fa_wheelchair_alt = &HF29B + fa_wifi = &HF1EB + fa_wikipedia_w = &HF266 + fa_window_close = &HF2D3 + fa_window_close_o = &HF2D4 + fa_window_maximize = &HF2D0 + fa_window_minimize = &HF2D1 + fa_window_restore = &HF2D2 + fa_windows = &HF17A + fa_won = &HF159 + fa_wordpress = &HF19A + fa_wpbeginner = &HF297 + fa_wpexplorer = &HF2DE + fa_wpforms = &HF298 + fa_wrench = &HF0AD + fa_xing = &HF168 + fa_xing_square = &HF169 + fa_y_combinator = &HF23B + fa_y_combinator_square = &HF1D4 + fa_yahoo = &HF19E + fa_yc = &HF23B + fa_yc_square = &HF1D4 + fa_yelp = &HF1E9 + fa_yen = &HF157 + fa_yoast = &HF2B1 + fa_youtube = &HF167 + fa_youtube_play = &HF16A + fa_youtube_square = &HF166 +End Enum \ No newline at end of file diff --git a/src/WinForms/TaskDialog/TaskDialog.sln b/src/WinForms/TaskDialog/TaskDialog.sln new file mode 100644 index 0000000..c623942 --- /dev/null +++ b/src/WinForms/TaskDialog/TaskDialog.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.31229.75 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "TaskDialog", "TaskDialog.vbproj", "{CFBE6E6C-B711-42BB-B5ED-487D4767FE2B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {CFBE6E6C-B711-42BB-B5ED-487D4767FE2B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CFBE6E6C-B711-42BB-B5ED-487D4767FE2B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CFBE6E6C-B711-42BB-B5ED-487D4767FE2B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CFBE6E6C-B711-42BB-B5ED-487D4767FE2B}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {A25E6589-5D38-46A2-B480-5B0FFCAC64D7} + EndGlobalSection +EndGlobal diff --git a/src/WinForms/TaskDialog/TaskDialog.vb b/src/WinForms/TaskDialog/TaskDialog.vb new file mode 100644 index 0000000..ab1de70 --- /dev/null +++ b/src/WinForms/TaskDialog/TaskDialog.vb @@ -0,0 +1,486 @@ + +Imports System.Drawing +Imports System.Text +Imports System.Threading +Imports System.Windows.Forms + +Imports TaskDialog.Msg + +Public Class TaskDialog(Of T) + Inherits TaskDialogBaseForm + + Property CommandDefinitions As New List(Of CommandDefinition) + Property ButtonDefinitions As New List(Of ButtonDefinition) + Property SelectedValue As T + Property SelectedText As String + Property Title As String + Property Timeout As Integer + Property Content As String + Property ContentLabel As LabelEx + Property ExpandedContent As String + Property ExpandedContentLabel As LabelEx + + Overloads Property Icon As TaskIcon + Overloads Property Owner As IntPtr + + + Public Sub New() + MyBase.New() + End Sub + + Public Sub New(defaultValue As T) + MyClass.New() + SelectedValue = defaultValue + End Sub + + Public Sub New(defaultText As String, defaultValue As T) + MyClass.New(defaultValue) + SelectedText = defaultText + End Sub + + Sub Init() + ShowInTaskbar = False + Width = FontHeight * 22 + + If Content = "" AndAlso Title?.Length > 80 Then + Content = Title + Title = "" + End If + + If MenuButton.Items.Count > 0 Then + MenuButton.Visible = True + + For Each i In MenuButton.Items + Dim textWidth = TextRenderer.MeasureText(i.ToString, Font).Width + FontHeight * 3 + + If MenuButton.Width < textWidth Then + Width += textWidth - MenuButton.Width + End If + Next + End If + + If Content?.Length > 1000 OrElse ExpandedContent?.Length > 1000 Then + Width = FontHeight * 35 + End If + + ShowIcon = False + StartPosition = FormStartPosition.CenterScreen + + If Icon <> TaskIcon.None Then + pbIcon.Visible = True + End If + + Select Case Icon + Case TaskIcon.Warning + pbIcon.Image = StockIcon.GetImage(StockIconIdentifier.Warning) + Case TaskIcon.Error + pbIcon.Image = StockIcon.GetImage(StockIconIdentifier.Error) + Case TaskIcon.Info + pbIcon.Image = StockIcon.GetImage(StockIconIdentifier.Info) + Case TaskIcon.Shield + pbIcon.Image = StockIcon.GetImage(StockIconIdentifier.Shield) + Case TaskIcon.Question + pbIcon.Image = StockIcon.GetImage(StockIconIdentifier.Help) + End Select + + TitleLabel.Font = New Font("Segoe UI", 11) + TitleLabel.Text = Title + + If Content <> "" Then + ContentLabel = New LabelEx + ContentLabel.Margin = New Padding(0) + ContentLabel.BorderStyle = BorderStyle.None + ContentLabel.Text = Content + paMain.Controls.Add(ContentLabel) + End If + + If ExpandedContent <> "" Then + ExpandedContentLabel = New LabelEx + ExpandedContentLabel.Margin = New Padding(0) + ExpandedContentLabel.BorderStyle = BorderStyle.None + ExpandedContentLabel.Text = ExpandedContent + ExpandedContentLabel.Name = "ExpandedInformation" + blDetails.Visible = True + paMain.Controls.Add(ExpandedContentLabel) + End If + + Dim firstCommandButton As CommandButton = Nothing + + For Each cmd In CommandDefinitions + Dim cb As New CommandButton + cb.Title = cmd.Text + cb.Description = cmd.Description + cb.Tag = cmd + + If TypeOf cmd.Value Is FontFamily Then + cb.Font = New Font(cmd.Text, Font.Size) + End If + + AddHandler cb.Click, AddressOf CommandClick + paMain.Controls.Add(cb) + + If firstCommandButton Is Nothing Then + firstCommandButton = cb + End If + Next + + For Each i In ButtonDefinitions + If Not flpButtons.Visible Then + flpButtons.Visible = True + flpButtons.AutoSize = True + End If + + Dim b As New ButtonEx + b.Text = i.Text + b.Tag = i.Value + + If AcceptButton Is Nothing AndAlso i.Text = "OK" Then + AcceptButton = b + End If + + flpButtons.Controls.Add(b) + i.Button = b + AddHandler b.Click, AddressOf ButtonClick + Next + + If Timeout > 0 Then + Task.Run(Sub() + Thread.Sleep(Timeout * 1000) + + If Not IsDisposingOrDisposed Then + Invoke(Sub() Close()) + End If + End Sub) + End If + + If TypeOf SelectedValue Is DialogResult Then + If SelectedValue.Equals(DialogResult.None) Then + If ButtonDefinitions.Where(Function(i) i.Value.Equals(DialogResult.No)).Any Then + SelectedValue = CType(CObj(DialogResult.No), T) + End If + + If ButtonDefinitions.Where(Function(i) i.Value.Equals(DialogResult.Cancel)).Any Then + SelectedValue = CType(CObj(DialogResult.Cancel), T) + End If + End If + + Dim ok = ButtonDefinitions.Where(Function(i) i.Value.Equals(DialogResult.OK)).FirstOrDefault + + If Not ok Is Nothing Then + ActiveControl = ok.Button + End If + + If ActiveControl Is Nothing Then + Dim yes = ButtonDefinitions.Where(Function(i) i.Value.Equals(DialogResult.Yes)).FirstOrDefault + + If Not yes Is Nothing Then + ActiveControl = yes.Button + End If + End If + End If + + If ActiveControl Is Nothing Then + If firstCommandButton Is Nothing Then + ActiveControl = TitleLabel + Else + ActiveControl = firstCommandButton + End If + End If + + If Owner = IntPtr.Zero Then + Owner = GetHandle() + End If + End Sub + + Sub AddCommand(value As T) + AddCommand(value.ToString, Nothing, value) + End Sub + + Sub AddCommand(text As String, Optional value As T = Nothing) + AddCommand(text, Nothing, value) + End Sub + + Sub AddCommand(text As String, description As String, value As T) + If value Is Nothing Then + value = CType(CObj(text), T) + End If + + CommandDefinitions.Add(New CommandDefinition With {.Text = text, .Description = description, .Value = value}) + End Sub + + Sub AddCommands(values As IEnumerable(Of T)) + For Each i In values + AddCommand(i) + Next + End Sub + + Sub AddButton(text As String) + AddButton(text, CType(CObj(text), T)) + End Sub + + Sub AddButton(text As String, value As T) + ButtonDefinitions.Add(New ButtonDefinition With {.Text = text, .Value = value}) + End Sub + + Sub AddButton(value As T) + ButtonDefinitions.Add(New ButtonDefinition With {.Text = value.ToString, .Value = value}) + End Sub + + Sub AddButtons(values As IEnumerable(Of T)) + For Each i In values + AddButton(i) + Next + End Sub + + WriteOnly Property Buttons As TaskButton + Set(value As TaskButton) + For Each i In {TaskButton.OK, TaskButton.Yes, TaskButton.No, + TaskButton.Cancel, TaskButton.Retry, TaskButton.Close} + + If value.HasFlag(i) Then + AddButton(i.ToString, CType(CObj(GetDialogResultFromButton(i)), T)) + End If + Next + End Set + End Property + + Sub CommandClick(sender As Object, e As EventArgs) + Dim tag = DirectCast(sender, CommandButton).Tag + Dim cmd = DirectCast(tag, CommandDefinition) + SelectedText = If(cmd.Text = "", cmd.Description, cmd.Text) + SelectedValue = cmd.Value + Close() + End Sub + + Sub ButtonClick(sender As Object, e As EventArgs) + Dim button = DirectCast(sender, ButtonEx) + SelectedText = button.Text + SelectedValue = DirectCast(button.Tag, T) + Close() + End Sub + + Overrides Sub AdjustSize() + Dim h = tlpTop.Height + tlpTop.Margin.Vertical + + If paMain.Controls.Count > 0 Then + Dim last = paMain.Controls(paMain.Controls.Count - 1) + h += last.Top + last.Height + last.Margin.Vertical + End If + + h += spBottom.Height + + If spBottom.Controls.OfType(Of Control).Where(Function(i) i.Visible).Count > 0 Then + h += spBottom.Margin.Vertical + End If + + Dim fh = FontHeight + h += CInt(fh * 0.7) + + Dim nonClientHeight = Height - ClientSize.Height + Dim workingArea = Screen.FromControl(Me).WorkingArea + Dim maxHeight = workingArea.Height + Dim w = ClientSize.Width + Dim secondLongestLine = GetSecondLongestLineLength() + Dim predictedWidth = CInt(secondLongestLine * fh * 0.45) + + If predictedWidth > Width Then + w = predictedWidth + End If + + If w > fh * 40 Then + w = fh * 40 + End If + + Dim ncx = Width - ClientSize.Width + Dim ncy = Height - ClientSize.Height + + w += ncx + h += ncy + + If h > maxHeight Then + h = maxHeight + End If + + Dim l = (workingArea.Width - w) \ 2 + Dim t = (workingArea.Height - h) \ 2 + + Native.SetWindowPos(Handle, IntPtr.Zero, l, t, w, h, 64) + End Sub + + Function GetSecondLongestLineLength() As Integer + Dim list As New List(Of Integer)({51, 52}) + + If Content <> "" Then + For Each line In Content.Split(vbLf) + list.Add(line.Length) + Next + End If + + If ExpandedContent <> "" AndAlso ExpandedContentLabel?.Height > 0 Then + For Each line In ExpandedContent.Split(vbLf) + list.Add(line.Length) + Next + End If + + For Each def In CommandDefinitions + If def.Description <> "" Then + For Each line In def.Description.Split(vbLf) + list.Add(line.Length) + Next + End If + Next + + For Each def In CommandDefinitions + If def.Text <> "" Then + For Each line In def.Text.Split(vbLf) + list.Add(CInt(line.Length / 11 * 9)) + Next + End If + Next + + list.Sort() + list.Reverse() + Return list(1) + End Function + + WriteOnly Property ShowCopyButton As Boolean + Set(value As Boolean) + If value Then + blCopyMessage.Text = "Copy Message" + blCopyMessage.Visible = True + blCopyMessage.ClickAction = Sub() + Clipboard.SetText(GetText) + MsgInfo("Message was copied to clipboard.") + End Sub + End If + End Set + End Property + + Function GetHandle() As IntPtr + Dim sb As New StringBuilder(500) + Dim handle = Native.GetForegroundWindow + Native.GetWindowModuleFileName(handle, sb, CUInt(sb.Capacity)) + + If StringHelp.Base(sb.ToString.Replace(".vshost", "")) = StringHelp.Base(Application.ExecutablePath) Then + Return handle + End If + End Function + + Function GetText() As String + Dim ret = TitleLabel.Text + + If Content <> "" Then + ret += BR2 + Content + End If + + If ExpandedContent <> "" Then + ret += BR2 + ExpandedContent + End If + + Return ret + End Function + + Shared Function GetDialogResultFromButton(button As TaskButton) As DialogResult + Select Case button + Case TaskButton.OK + Return DialogResult.OK + Case TaskButton.Cancel, TaskButton.Close + Return DialogResult.Cancel + Case TaskButton.Yes + Return DialogResult.Yes + Case TaskButton.No + Return DialogResult.No + Case TaskButton.None + Return DialogResult.None + Case TaskButton.Retry + Return DialogResult.Retry + End Select + End Function + + Protected Overrides Sub OnLoad(args As EventArgs) + MyBase.OnLoad(args) + Font = New Font("Segoe UI", 9) + Dim fh = FontHeight + + For Each i As ButtonEx In flpButtons.Controls + i.Height = CInt(fh * 1.5) + i.Width = fh * 5 + + Using g = i.CreateGraphics + Dim minWidth = CInt(g.MeasureString(i.Text, i.Font).Width + fh) + + If i.Width < minWidth Then + i.Width = minWidth + End If + End Using + + i.Margin = New Padding(CInt(fh * 0.4), 0, 0, 0) + Next + + MenuButton.Margin = New Padding(CInt(fh * 0.7), MenuButton.Margin.Top, CInt(fh * 0.7), MenuButton.Margin.Bottom) + InputTextEdit.Margin = MenuButton.Margin + flpButtons.Margin = New Padding(0, 0, CInt(fh * 0.7), 0) + + If InputTextEdit.Visible Then + ActiveControl = InputTextEdit + InputTextEdit.TextBox.SelectAll() + End If + + AdjustSize() + AdjustSize() + + If Owner <> IntPtr.Zero Then + Dim GWLP_HWNDPARENT = -8 + SetWindowLongPtr(Handle, GWLP_HWNDPARENT, Owner) + End If + End Sub + + Overloads Function Show() As T + Init() + + If Application.MessageLoop Then + Using Me + ShowDialog() + End Using + Else + Application.Run(Me) + End If + + Return SelectedValue + End Function + + Public Class CommandDefinition + Property Text As String + Property Description As String + Property Value As T + End Class + + Public Class ButtonDefinition + Property Text As String + Property Value As T + Property Button As ButtonEx + End Class +End Class + +Public Enum TaskIcon + None + Info + Warning + Question + [Error] + Shield +End Enum + +Public Enum TaskButton + None = 0 + OK = 1 + Yes = 2 + No = 4 + Cancel = 8 + Retry = 16 + Close = 32 + OkCancel = OK Or Cancel + YesNo = Yes Or No + YesNoCancel = YesNo Or Cancel + RetryCancel = Retry Or Cancel +End Enum diff --git a/src/WinForms/TaskDialog/TaskDialog.vbproj b/src/WinForms/TaskDialog/TaskDialog.vbproj new file mode 100644 index 0000000..54ee139 --- /dev/null +++ b/src/WinForms/TaskDialog/TaskDialog.vbproj @@ -0,0 +1,131 @@ + + + + + Debug + AnyCPU + {CFBE6E6C-B711-42BB-B5ED-487D4767FE2B} + Library + + + TaskDialog + TaskDialog + 512 + Windows + v4.8 + true + true + + + AnyCPU + true + full + true + true + bin\Debug\ + TaskDialog.xml + 41999,42016,42017,42018,42019,42020,42021,42022,42032,42036,42105,42106,42107,42353,42354,42355 + + + AnyCPU + pdbonly + false + true + true + bin\Release\ + TaskDialog.xml + 41999,42016,42017,42018,42019,42020,42021,42022,42032,42036,42105,42106,42107,42353,42354,42355 + + + On + + + Binary + + + Off + + + On + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True + Application.myapp + True + + + True + True + Resources.resx + + + True + Settings.settings + True + + + + + Form + + + TaskDialogBaseForm.vb + + + Form + + + + + VbMyResourcesResXFileCodeGenerator + Resources.Designer.vb + My.Resources + Designer + + + TaskDialogBaseForm.vb + + + + + MyApplicationCodeGenerator + Application.Designer.vb + + + SettingsSingleFileGenerator + My + Settings.Designer.vb + + + + \ No newline at end of file diff --git a/src/WinForms/TaskDialog/TaskDialogBaseForm.Designer.vb b/src/WinForms/TaskDialog/TaskDialogBaseForm.Designer.vb new file mode 100644 index 0000000..fc27f8a --- /dev/null +++ b/src/WinForms/TaskDialog/TaskDialogBaseForm.Designer.vb @@ -0,0 +1,247 @@ + +Imports System.Windows.Forms + + +Partial Class TaskDialogBaseForm + Inherits Form + + 'Form overrides dispose to clean up the component list. + + Protected Overrides Sub Dispose(ByVal disposing As Boolean) + Try + If disposing AndAlso components IsNot Nothing Then + components.Dispose() + End If + Finally + MyBase.Dispose(disposing) + End Try + End Sub + + 'Required by the Windows Form Designer + Private components As System.ComponentModel.IContainer + + 'NOTE: The following procedure is required by the Windows Form Designer + 'It can be modified using the Windows Form Designer. + 'Do not modify it using the code editor. + + Private Sub InitializeComponent() + Me.components = New System.ComponentModel.Container() + Me.tlpMain = New System.Windows.Forms.TableLayoutPanel() + Me.tlpTop = New System.Windows.Forms.TableLayoutPanel() + Me.TitleLabel = New TaskDialog.TaskDialogBaseForm.LabelEx() + Me.pbIcon = New System.Windows.Forms.PictureBox() + Me.paMain = New TaskDialog.TaskDialogBaseForm.TaskDialogPanel() + Me.spBottom = New TaskDialog.TaskDialogBaseForm.StackPanel() + Me.InputTextEdit = New TaskDialog.TaskDialogBaseForm.TextEdit() + Me.MenuButton = New TaskDialog.TaskDialogBaseForm.MenuButtonEx() + Me.CheckBox = New TaskDialog.TaskDialogBaseForm.CheckBoxEx() + Me.flpButtons = New System.Windows.Forms.FlowLayoutPanel() + Me.blDetails = New TaskDialog.TaskDialogBaseForm.ButtonLabel() + Me.blCopyMessage = New TaskDialog.TaskDialogBaseForm.ButtonLabel() + Me.tlpMain.SuspendLayout() + Me.tlpTop.SuspendLayout() + CType(Me.pbIcon, System.ComponentModel.ISupportInitialize).BeginInit() + Me.spBottom.SuspendLayout() + Me.SuspendLayout() + ' + 'tlpMain + ' + Me.tlpMain.ColumnCount = 1 + Me.tlpMain.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) + Me.tlpMain.Controls.Add(Me.tlpTop, 0, 0) + Me.tlpMain.Controls.Add(Me.paMain, 0, 1) + Me.tlpMain.Controls.Add(Me.spBottom, 0, 2) + Me.tlpMain.Dock = System.Windows.Forms.DockStyle.Fill + Me.tlpMain.Location = New System.Drawing.Point(0, 0) + Me.tlpMain.Name = "tlpMain" + Me.tlpMain.RowCount = 3 + Me.tlpMain.RowStyles.Add(New System.Windows.Forms.RowStyle()) + Me.tlpMain.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!)) + Me.tlpMain.RowStyles.Add(New System.Windows.Forms.RowStyle()) + Me.tlpMain.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20.0!)) + Me.tlpMain.Size = New System.Drawing.Size(705, 683) + Me.tlpMain.TabIndex = 0 + ' + 'tlpTop + ' + Me.tlpTop.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _ + Or System.Windows.Forms.AnchorStyles.Left) _ + Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) + Me.tlpTop.AutoSize = True + Me.tlpTop.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink + Me.tlpTop.ColumnCount = 2 + Me.tlpTop.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle()) + Me.tlpTop.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!)) + Me.tlpTop.Controls.Add(Me.TitleLabel, 1, 0) + Me.tlpTop.Controls.Add(Me.pbIcon, 0, 0) + Me.tlpTop.Location = New System.Drawing.Point(0, 15) + Me.tlpTop.Margin = New System.Windows.Forms.Padding(0, 15, 0, 20) + Me.tlpTop.Name = "tlpTop" + Me.tlpTop.RowCount = 1 + Me.tlpTop.RowStyles.Add(New System.Windows.Forms.RowStyle()) + Me.tlpTop.Size = New System.Drawing.Size(705, 150) + Me.tlpTop.TabIndex = 1 + ' + 'TitleLabel + ' + Me.TitleLabel.Anchor = System.Windows.Forms.AnchorStyles.Left + Me.TitleLabel.AutoSize = True + Me.TitleLabel.Location = New System.Drawing.Point(160, 56) + Me.TitleLabel.Margin = New System.Windows.Forms.Padding(20) + Me.TitleLabel.Size = New System.Drawing.Size(155, 37) + Me.TitleLabel.Text = "TitleLabel" + Me.TitleLabel.TextAlign = System.Drawing.ContentAlignment.MiddleLeft + ' + 'pbIcon + ' + Me.pbIcon.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _ + Or System.Windows.Forms.AnchorStyles.Left) _ + Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) + Me.pbIcon.Location = New System.Drawing.Point(40, 30) + Me.pbIcon.Margin = New System.Windows.Forms.Padding(40, 30, 0, 20) + Me.pbIcon.Name = "pbIcon" + Me.pbIcon.Size = New System.Drawing.Size(100, 100) + Me.pbIcon.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage + Me.pbIcon.TabIndex = 2 + Me.pbIcon.TabStop = False + Me.pbIcon.Visible = False + ' + 'paMain + ' + Me.paMain.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _ + Or System.Windows.Forms.AnchorStyles.Left) _ + Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) + Me.paMain.AutoScroll = True + Me.paMain.Form = Nothing + Me.paMain.LineBreaks = 0 + Me.paMain.Location = New System.Drawing.Point(0, 185) + Me.paMain.Margin = New System.Windows.Forms.Padding(0) + Me.paMain.Name = "paMain" + Me.paMain.Size = New System.Drawing.Size(705, 63) + Me.paMain.TabIndex = 2 + ' + 'spBottom + ' + Me.spBottom.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _ + Or System.Windows.Forms.AnchorStyles.Left) _ + Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) + Me.spBottom.AutoSize = True + Me.spBottom.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink + Me.spBottom.Controls.Add(Me.InputTextEdit) + Me.spBottom.Controls.Add(Me.MenuButton) + Me.spBottom.Controls.Add(Me.CheckBox) + Me.spBottom.Controls.Add(Me.flpButtons) + Me.spBottom.Controls.Add(Me.blDetails) + Me.spBottom.Controls.Add(Me.blCopyMessage) + Me.spBottom.FlowDirection = System.Windows.Forms.FlowDirection.TopDown + Me.spBottom.Location = New System.Drawing.Point(0, 248) + Me.spBottom.Margin = New System.Windows.Forms.Padding(0, 0, 0, 30) + Me.spBottom.Name = "spBottom" + Me.spBottom.Size = New System.Drawing.Size(705, 405) + Me.spBottom.TabIndex = 3 + Me.spBottom.WrapContents = False + ' + 'InputTextEdit + ' + Me.InputTextEdit.Anchor = CType((System.Windows.Forms.AnchorStyles.Left Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) + Me.InputTextEdit.Location = New System.Drawing.Point(30, 0) + Me.InputTextEdit.Margin = New System.Windows.Forms.Padding(30, 0, 30, 30) + Me.InputTextEdit.Name = "InputTextEdit" + Me.InputTextEdit.Size = New System.Drawing.Size(645, 60) + Me.InputTextEdit.Text = "InputTextEdit" + Me.InputTextEdit.Visible = False + ' + 'MenuButton + ' + Me.MenuButton.Anchor = CType((System.Windows.Forms.AnchorStyles.Left Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) + Me.MenuButton.FlatAppearance.BorderSize = 2 + Me.MenuButton.Location = New System.Drawing.Point(30, 90) + Me.MenuButton.Margin = New System.Windows.Forms.Padding(30, 0, 30, 30) + Me.MenuButton.Padding = New System.Windows.Forms.Padding(4, 0, 0, 0) + Me.MenuButton.ShowMenuSymbol = True + Me.MenuButton.ShowPath = False + Me.MenuButton.Size = New System.Drawing.Size(645, 70) + Me.MenuButton.Text2 = "MenuButton" + Me.MenuButton.Visible = False + ' + 'CheckBox + ' + Me.CheckBox.AutoSize = True + Me.CheckBox.FlatAppearance.BorderSize = 2 + Me.CheckBox.Location = New System.Drawing.Point(30, 190) + Me.CheckBox.Margin = New System.Windows.Forms.Padding(30, 0, 0, 0) + Me.CheckBox.Size = New System.Drawing.Size(366, 41) + Me.CheckBox.Text = "VerificationCheckBox" + Me.CheckBox.UseVisualStyleBackColor = False + Me.CheckBox.Visible = False + ' + 'flpButtons + ' + Me.flpButtons.Anchor = System.Windows.Forms.AnchorStyles.Right + Me.flpButtons.Location = New System.Drawing.Point(505, 231) + Me.flpButtons.Margin = New System.Windows.Forms.Padding(0) + Me.flpButtons.Name = "flpButtons" + Me.flpButtons.Size = New System.Drawing.Size(200, 100) + Me.flpButtons.TabIndex = 2 + Me.flpButtons.Visible = False + ' + 'blDetails + ' + Me.blDetails.AutoSize = True + Me.blDetails.ClickAction = Nothing + Me.blDetails.Location = New System.Drawing.Point(20, 331) + Me.blDetails.Margin = New System.Windows.Forms.Padding(20, 0, 0, 0) + Me.blDetails.Name = "blDetails" + Me.blDetails.Size = New System.Drawing.Size(203, 37) + Me.blDetails.TabIndex = 8 + Me.blDetails.Text = "Show Details" + Me.blDetails.Visible = False + ' + 'blCopyMessage + ' + Me.blCopyMessage.AutoSize = True + Me.blCopyMessage.ClickAction = Nothing + Me.blCopyMessage.Location = New System.Drawing.Point(20, 368) + Me.blCopyMessage.Margin = New System.Windows.Forms.Padding(20, 0, 0, 0) + Me.blCopyMessage.Name = "blCopyMessage" + Me.blCopyMessage.Size = New System.Drawing.Size(228, 37) + Me.blCopyMessage.TabIndex = 7 + Me.blCopyMessage.Text = "Copy Message" + Me.blCopyMessage.Visible = False + ' + 'TaskDialogBaseForm + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(288.0!, 288.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi + Me.ClientSize = New System.Drawing.Size(705, 683) + Me.Controls.Add(Me.tlpMain) + Me.Margin = New System.Windows.Forms.Padding(3, 4, 3, 4) + Me.MaximizeBox = False + Me.MinimizeBox = False + Me.Name = "TaskDialogBaseForm" + Me.ShowIcon = False + Me.Text = "StaxRip" + Me.tlpMain.ResumeLayout(False) + Me.tlpMain.PerformLayout() + Me.tlpTop.ResumeLayout(False) + Me.tlpTop.PerformLayout() + CType(Me.pbIcon, System.ComponentModel.ISupportInitialize).EndInit() + Me.spBottom.ResumeLayout(False) + Me.spBottom.PerformLayout() + Me.ResumeLayout(False) + + End Sub + + Friend WithEvents tlpMain As TableLayoutPanel + Friend WithEvents CheckBox As CheckBoxEx + Friend WithEvents flpButtons As FlowLayoutPanel + Friend WithEvents InputTextEdit As TextEdit + Friend WithEvents tlpTop As TableLayoutPanel + Friend WithEvents TitleLabel As LabelEx + Friend WithEvents MenuButton As MenuButtonEx + Friend WithEvents paMain As TaskDialogPanel + Friend WithEvents spBottom As StackPanel + Friend WithEvents blCopyMessage As ButtonLabel + Friend WithEvents blDetails As ButtonLabel + Friend WithEvents pbIcon As PictureBox +End Class diff --git a/src/WinForms/TaskDialog/TaskDialogBaseForm.resx b/src/WinForms/TaskDialog/TaskDialogBaseForm.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/src/WinForms/TaskDialog/TaskDialogBaseForm.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/src/WinForms/TaskDialog/TaskDialogBaseForm.vb b/src/WinForms/TaskDialog/TaskDialogBaseForm.vb new file mode 100644 index 0000000..99f0824 --- /dev/null +++ b/src/WinForms/TaskDialog/TaskDialogBaseForm.vb @@ -0,0 +1,1603 @@ + +Imports System.ComponentModel +Imports System.Drawing +Imports System.Drawing.Drawing2D +Imports System.Runtime.InteropServices +Imports System.Windows.Forms +Imports System.Windows.Forms.VisualStyles + +Public Class TaskDialogBaseForm + Overridable Sub AdjustSize() + End Sub + + Public Shared Property BR As String = Environment.NewLine + Public Shared Property BR2 As String = Environment.NewLine + Environment.NewLine + + Public Sub New() + InitializeComponent() + 'ApplyTheme() + + AddHandler InputTextEdit.TextBox.KeyDown, AddressOf InputTextEditTextBoxKeyDown + 'AddHandler ThemeManager.CurrentThemeChanged, AddressOf OnThemeChanged + End Sub + + 'Sub OnThemeChanged(theme As Theme) + ' ApplyTheme(theme) + 'End Sub + + 'Sub ApplyTheme() + ' ApplyTheme(ThemeManager.CurrentTheme) + 'End Sub + + 'Sub ApplyTheme(theme As Theme) + ' If DesignHelp.IsDesignMode Then + ' Exit Sub + ' End If + + ' SuspendLayout() + ' BackColor = theme.TaskDialog.BackColor + ' ForeColor = theme.TaskDialog.ForeColor + ' blCopyMessage.BackColor = BackColor + ' blDetails.BackColor = BackColor + ' ResumeLayout() + 'End Sub + + + Shared Function SetWindowLong32(hWnd As IntPtr, nIndex As Integer, dwNewLong As Integer) As Integer + End Function + + + Shared Function SetWindowLongPtr64(hWnd As IntPtr, nIndex As Integer, dwNewLong As IntPtr) As IntPtr + End Function + + Shared Function SetWindowLongPtr(hWnd As IntPtr, nIndex As Integer, dwNewLong As IntPtr) As IntPtr + If IntPtr.Size = 8 Then + Return SetWindowLongPtr64(hWnd, nIndex, dwNewLong) + Else + Return New IntPtr(SetWindowLong32(hWnd, nIndex, dwNewLong.ToInt32)) + End If + End Function + + Class TaskDialogPanel + Inherits PanelEx + + Property Form As TaskDialogBaseForm + Property LineBreaks As Integer + + Protected Overrides Sub OnLayout(levent As LayoutEventArgs) + MyBase.OnLayout(levent) + + If DesignMode OrElse Controls.Count = 0 Then + MyBase.OnLayout(levent) + Exit Sub + End If + + If Form Is Nothing Then + Form = DirectCast(FindForm(), TaskDialogBaseForm) + End If + + Dim fh = FontHeight + Dim previous As Control = Nothing + + Using g = CreateGraphics() + For x = 0 To Controls.Count - 1 + Dim c = Controls(x) + + If x = 0 Then + c.Top = 0 + Else + c.Top = previous.Top + previous.Height + CInt(fh * 0.2) + End If + + c.Left = CInt(fh * 0.7) + c.Width = ClientSize.Width - CInt(fh * 0.7 * 2) + + If TypeOf c Is LabelEx Then + If c.Name = "ExpandedInformation" AndAlso Form.blDetails.Text = "Show Details" Then + c.Visible = False + c.Height = 0 + Else + c.Visible = True + Dim sz = g.MeasureString(c.Text, c.Font, c.Width) + c.Height = CInt(sz.Height + fh / 2) + End If + End If + + If TryCast(c, CommandButton)?.AdjustSize() Then + LineBreaks += 1 + End If + + previous = c + Next + End Using + End Sub + End Class + + + Public Class DispNameAttribute + Inherits DisplayNameAttribute + + Sub New(name As String) + DisplayNameValue = name + End Sub + + Shared Function GetValueForEnum(value As Object) As String + For Each i In value.GetType.GetFields + If i.GetValue(value).Equals(value) Then + For Each i2 In i.GetCustomAttributes(False) + If i2.GetType Is GetType(DispNameAttribute) Then + Return DirectCast(i2, DispNameAttribute).DisplayName + End If + Next + + Return i.Name + End If + Next + + Return "Unknown Type" + End Function + + Shared Function GetNamesForEnum(Of T)() As String() + Dim l As New List(Of String) + + For Each i As T In System.Enum.GetValues(GetType(T)) + l.Add(GetValueForEnum(i)) + Next + + Return l.ToArray + End Function + + Shared Function GetValue(attributes As Object()) As String + For Each i In attributes + If TypeOf i Is DispNameAttribute Then + Return DirectCast(i, DispNameAttribute).DisplayName + End If + Next + + Return Nothing + End Function + End Class + + Public Class TextBoxEx + Inherits TextBox + + Private _blockOnTextChanged As Boolean = False + Private _borderColor As Color + Private _borderFocusedColor As Color + + Public Property BorderColor As Color + Get + Return _borderColor + End Get + Set(value As Color) + _borderColor = value + End Set + End Property + + Private Function ShouldSerializeBorderColor() As Boolean + Return BorderColor <> Color.Empty + End Function + + Public Property BorderFocusedColor As Color + Get + Return _borderFocusedColor + End Get + Set(value As Color) + _borderFocusedColor = value + 'Native.RedrawWindow(Handle, IntPtr.Zero, IntPtr.Zero, RDW_FRAME Or RDW_IUPDATENOW Or RDW_INVALIDATE) + End Set + End Property + + Private Function ShouldSerializeBorderFocusedColor() As Boolean + Return BorderFocusedColor <> Color.Empty + End Function + + + Shadows Property Name() As String + Get + Return MyBase.Name + End Get + Set(value As String) + MyBase.Name = value + End Set + End Property + + + Shadows Property TabIndex As Integer + Get + Return MyBase.TabIndex + End Get + Set(value As Integer) + MyBase.TabIndex = value + End Set + End Property + + Sub New() + 'ApplyTheme() + BorderStyle = BorderStyle.None + + 'AddHandler ThemeManager.CurrentThemeChanged, AddressOf OnThemeChanged + End Sub + + 'Sub OnThemeChanged(theme As Theme) + ' ApplyTheme(theme) + 'End Sub + + 'Sub ApplyTheme() + ' ApplyTheme(ThemeManager.CurrentTheme) + 'End Sub + + 'Sub ApplyTheme(theme As Theme) + ' If DesignHelp.IsDesignMode Then + ' Exit Sub + ' End If + + ' SuspendLayout() + ' BackColor = theme.General.Controls.TextBox.BackColor + ' ForeColor = theme.General.Controls.TextBox.ForeColor + ' BorderColor = theme.General.Controls.TextBox.BorderColor + ' BorderFocusedColor = theme.General.Controls.TextBox.BorderFocusedColor + ' ResumeLayout() + 'End Sub + + Public Sub SetTextWithoutTextChangedEvent(text As String) + _blockOnTextChanged = True + Me.Text = text + _blockOnTextChanged = False + End Sub + + Protected Overrides Sub OnTextChanged(e As EventArgs) + If Not _blockOnTextChanged Then + MyBase.OnTextChanged(e) + End If + End Sub + End Class + + Public Class TextEdit + Inherits UserControl + + Private _backReadonlyColor As Color + Private _borderColor As Color + Private _borderFocusedColor As Color + Private _borderHoverColor As Color + Private _drawBorder As Integer = -1 + + Public WithEvents TextBox As New TextBoxEx + + Public Shadows Event DoubleClick(sender As Object, e As EventArgs) + Public Shadows Event KeyDown(sender As Object, e As KeyEventArgs) + Public Shadows Event MouseDown(sender As Object, e As MouseEventArgs) + Public Shadows Event MouseWheel(sender As Object, e As MouseEventArgs) + Public Shadows Event TextChanged(sender As Object, e As EventArgs) + + Public Property BackReadonlyColor As Color + Get + Return _backReadonlyColor + End Get + Set(value As Color) + _backReadonlyColor = value + Invalidate() + End Set + End Property + + Private Function ShouldSerializeBackReadonlyColor() As Boolean + Return BackReadonlyColor <> Color.Empty + End Function + + Public Property BorderColor As Color + Get + Return _borderColor + End Get + Set(value As Color) + _borderColor = value + Invalidate() + End Set + End Property + + Private Function ShouldSerializeBorderColor() As Boolean + Return BorderColor <> Color.Empty + End Function + + Public Property BorderFocusedColor As Color + Get + Return _borderFocusedColor + End Get + Set(value As Color) + _borderFocusedColor = value + Invalidate() + End Set + End Property + + Private Function ShouldSerializeBorderFocusedColor() As Boolean + Return BorderFocusedColor <> Color.Empty + End Function + + Public Property BorderHoverColor As Color + Get + Return _borderHoverColor + End Get + Set(value As Color) + _borderHoverColor = value + Invalidate() + End Set + End Property + + Private Function ShouldSerializeBorderHoverColor() As Boolean + Return BorderHoverColor <> Color.Empty + End Function + + ReadOnly Property DrawBorder As Integer + Get + If _drawBorder < 0 Then + _drawBorder = 1 + End If + + Return _drawBorder + End Get + End Property + + + Property [ReadOnly] As Boolean + Get + Return TextBox.ReadOnly + End Get + Set(value As Boolean) + TextBox.ReadOnly = value + Invalidate() + End Set + End Property + + + + Overrides Property Text As String + Get + Return TextBox.Text + End Get + Set(value As String) + TextBox.Text = value + MyBase.Text = value + End Set + End Property + + + Shadows Property TabIndex As Integer + Get + Return MyBase.TabIndex + End Get + Set(value As Integer) + MyBase.TabIndex = value + End Set + End Property + + Sub New() + SetStyle(ControlStyles.ResizeRedraw, True) + TextBox.BorderStyle = BorderStyle.None + Controls.Add(TextBox) + + AddHandler TextBox.DoubleClick, Sub(sender As Object, e As EventArgs) RaiseEvent DoubleClick(sender, e) + AddHandler TextBox.KeyDown, Sub(sender As Object, e As KeyEventArgs) RaiseEvent KeyDown(sender, e) + AddHandler TextBox.MouseDown, Sub(sender As Object, e As MouseEventArgs) RaiseEvent MouseDown(sender, e) + AddHandler TextBox.MouseWheel, Sub(sender As Object, e As MouseEventArgs) RaiseEvent MouseWheel(sender, e) + AddHandler TextBox.TextChanged, Sub(sender As Object, e As EventArgs) RaiseEvent TextChanged(sender, e) + AddHandler TextBox.GotFocus, AddressOf TextBox_GotFocus + AddHandler TextBox.LostFocus, AddressOf TextBox_LostFocus + AddHandler TextBox.MouseEnter, AddressOf TextBox_GotFocus + AddHandler TextBox.MouseLeave, AddressOf TextBox_LostFocus + + 'ApplyTheme() + + 'AddHandler ThemeManager.CurrentThemeChanged, AddressOf OnThemeChanged + End Sub + + 'Sub OnThemeChanged(theme As Theme) + ' ApplyTheme(theme) + 'End Sub + + 'Sub ApplyTheme() + ' ApplyTheme(ThemeManager.CurrentTheme) + 'End Sub + + 'Sub ApplyTheme(theme As Theme) + ' If DesignHelp.IsDesignMode Then + ' Exit Sub + ' End If + + ' SuspendLayout() + ' BackColor = theme.General.Controls.TextEdit.BackColor + ' BackReadonlyColor = theme.General.Controls.TextEdit.BackReadonlyColor + ' ForeColor = theme.General.Controls.TextEdit.ForeColor + ' BorderColor = theme.General.Controls.TextEdit.BorderColor + ' BorderFocusedColor = theme.General.Controls.TextEdit.BorderFocusedColor + ' BorderHoverColor = theme.General.Controls.TextEdit.BorderHoverColor + ' ResumeLayout() + 'End Sub + + Sub TextBox_GotFocus(sender As Object, e As EventArgs) + Invalidate() + End Sub + + Sub TextBox_LostFocus(sender As Object, e As EventArgs) + Invalidate() + End Sub + + Protected Overrides Sub OnLayout(args As LayoutEventArgs) + MyBase.OnLayout(args) + + If TextBox.Multiline Then + TextBox.Top = 2 + TextBox.Left = 2 + TextBox.Width = ClientSize.Width - 4 + TextBox.Height = ClientSize.Height - 4 + Else + TextBox.Top = ((ClientSize.Height - TextBox.Height) \ 2) + TextBox.Left = 2 + TextBox.Width = ClientSize.Width - 4 + Dim h = TextRenderer.MeasureText("gG", TextBox.Font).Height + + If TextBox.Height < h Then + TextBox.Multiline = True + TextBox.MinimumSize = New Size(0, h) + TextBox.Multiline = False + End If + End If + End Sub + + Protected Overrides Sub OnPaint(e As PaintEventArgs) + MyBase.OnPaint(e) + + If Not [ReadOnly] AndAlso DrawBorder > 0 Then + Dim borderCol = If(TextBox.Focused OrElse Not GetChildAtPoint(PointToClient(Cursor.Position)) Is Nothing, BorderFocusedColor, BorderColor) + borderCol = If(GetChildAtPoint(PointToClient(Cursor.Position)) IsNot Nothing, BorderHoverColor, borderCol) + ControlPaint.DrawBorder(e.Graphics, ClientRectangle, borderCol, ButtonBorderStyle.Solid) + End If + End Sub + End Class + + Public Class StackPanel + Inherits FlowLayoutPanel + + Protected Overrides Sub OnLayout(levent As LayoutEventArgs) + MyBase.OnLayout(levent) + + If Not WrapContents AndAlso (FlowDirection = FlowDirection.TopDown OrElse FlowDirection = FlowDirection.BottomUp) Then + For Each i As Control In Controls + If (i.Anchor And AnchorStyles.Right) = AnchorStyles.Right AndAlso + (i.Anchor And AnchorStyles.Left) = AnchorStyles.Left Then + + i.Left = i.Margin.Left + i.Width = ClientSize.Width - i.Margin.Horizontal + ElseIf (i.Anchor And AnchorStyles.Right) = AnchorStyles.Right Then + i.Left = ClientSize.Width - (i.Width + i.Margin.Right) + End If + Next + End If + End Sub + End Class + + Public Class PanelEx + Inherits Panel + + Private ShowNiceBorderValue As Boolean + + Sub New() + SetStyle(ControlStyles.ResizeRedraw, True) + End Sub + + + + Property ShowNiceBorder() As Boolean + Get + Return ShowNiceBorderValue + End Get + Set(Value As Boolean) + ShowNiceBorderValue = Value + Invalidate() + End Set + End Property + + Protected Overrides Sub OnPaint(e As PaintEventArgs) + MyBase.OnPaint(e) + + If ShowNiceBorder AndAlso VisualStyleInformation.IsEnabledByUser Then + ControlPaint.DrawBorder(e.Graphics, ClientRectangle, + VisualStyleInformation.TextControlBorder, ButtonBorderStyle.Solid) + End If + End Sub + End Class + + Public Class ButtonLabel + Inherits Label + + Property LinkColor As Color = Color.Empty + Property LinkHoverColor As Color = Color.Empty + + Property ClickAction As Action + + Sub New() + ApplyTheme() + End Sub + + Private Function ShouldSerializeLinkColor() As Boolean + Return LinkColor <> Color.Empty + End Function + + Private Function ShouldSerializeLinkHoverColor() As Boolean + Return LinkHoverColor <> Color.Empty + End Function + + Sub ApplyTheme() + If DesignHelp.IsDesignMode Then + Exit Sub + End If + + BackColor = Colors.Window + ForeColor = Colors.Link + LinkColor = Colors.Link + LinkHoverColor = Colors.LinkHover + End Sub + + Protected Overrides Sub OnMouseEnter(e As EventArgs) + ForeColor = LinkHoverColor + MyBase.OnMouseEnter(e) + End Sub + + Protected Overrides Sub OnMouseLeave(e As EventArgs) + ForeColor = LinkColor + MyBase.OnMouseLeave(e) + End Sub + + Protected Overrides Sub OnClick(e As EventArgs) + MyBase.OnClick(e) + ClickAction?.Invoke + End Sub + End Class + + Class CommandButton + Inherits Button + + Property Title As String + Property Description As String + + Private _TitleFont As Font + + ReadOnly Property TitleFont As Font + Get + If _TitleFont Is Nothing Then + _TitleFont = New Font(Font.FontFamily, 11) + End If + + Return _TitleFont + End Get + End Property + + Sub New() + 'If Not DesignHelp.IsDesignMode Then + ' MinimumSize = New Size(20, 20) + ' UseCompatibleTextRendering = False + ' UseVisualStyleBackColor = False + ' FlatStyle = FlatStyle.Flat + 'End If + + FlatAppearance.BorderSize = 2 + + 'ApplyTheme() + + 'AddHandler ThemeManager.CurrentThemeChanged, AddressOf OnThemeChanged + End Sub + + 'Sub OnThemeChanged(theme As Theme) + ' ApplyTheme(theme) + 'End Sub + + 'Sub ApplyTheme() + ' ApplyTheme(ThemeManager.CurrentTheme) + 'End Sub + + 'Sub ApplyTheme(theme As Theme) + ' If DesignHelp.IsDesignMode Then + ' Exit Sub + ' End If + + ' SuspendLayout() + ' BackColor = theme.TaskDialog.CommandButton.BackColor + ' ForeColor = theme.TaskDialog.CommandButton.ForeColor + ' FlatAppearance.BorderColor = theme.TaskDialog.CommandButton.BorderColor + ' ResumeLayout() + 'End Sub + + + Function AdjustSize() As Boolean + Dim titleFontHeight = TitleFont.Height + Dim h As Integer + Dim hasLineBreak As Boolean + + If Title <> "" AndAlso Description <> "" Then + Dim ts = GetTitleSize() + Dim ds = GetDescriptionSize() + h = CInt(titleFontHeight * 0.2 * 2) + ts.Height + ds.Height + + If titleFontHeight * 2 < ts.Height Then + hasLineBreak = True + End If + ElseIf Title <> "" Then + Dim ts = GetTitleSize() + h = CInt(titleFontHeight * 0.2 * 2) + ts.Height + + If titleFontHeight * 2 < ts.Height Then + hasLineBreak = True + End If + ElseIf Description <> "" Then + Dim ds = GetDescriptionSize() + h = CInt(titleFontHeight * 0.2 * 2) + ds.Height + + If FontHeight * 2 < ds.Height Then + hasLineBreak = True + End If + End If + + ClientSize = New Size(ClientSize.Width, h) + Return hasLineBreak + End Function + + Function GetTitleSize(Optional g1 As Graphics = Nothing) As Size + If Title = "" Then + Exit Function + End If + + Dim g2 = g1 + + If g2 Is Nothing Then + g2 = CreateGraphics() + End If + + Dim tf = TitleFont.Height + Dim w = ClientSize.Width - CInt(tf * 0.3 * 2) + Dim sz = g2.MeasureString(Title, TitleFont, w) + + If g1 Is Nothing Then + g2.Dispose() + End If + + Return New Size(CInt(sz.Width), CInt(sz.Height)) + End Function + + Function GetDescriptionSize(Optional g1 As Graphics = Nothing) As Size + If Description = "" Then + Exit Function + End If + + Dim g2 = g1 + + If g2 Is Nothing Then + g2 = CreateGraphics() + End If + + Dim tf = TitleFont.Height + Dim w = ClientSize.Width - CInt(tf * 0.3 * 2) + Dim sz = g2.MeasureString(Description, Font, w) + + If g1 Is Nothing Then + g2.Dispose() + End If + + Return New Size(CInt(sz.Width), CInt(sz.Height)) + End Function + + Protected Overrides Sub OnGotFocus(e As EventArgs) + MyBase.OnGotFocus(e) + End Sub + + Protected Overrides Sub OnLostFocus(e As EventArgs) + MyBase.OnLostFocus(e) + End Sub + + Protected Overrides Sub OnPaint(e As PaintEventArgs) + MyBase.OnPaint(e) + + Dim g = e.Graphics + g.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAlias + Dim titleFontHeight = TitleFont.Height + + Dim x = CInt(titleFontHeight * 0.3) + Dim y = CInt(titleFontHeight * 0.2) + Dim w = ClientSize.Width - x * 2 + Dim h = ClientSize.Height - CInt(titleFontHeight * 0.2 * 2) + Dim r = New Rectangle(x, y, w, h) + + If Title <> "" AndAlso Description <> "" Then + TextRenderer.DrawText(g, Title, TitleFont, r, ForeColor, TextFormatFlags.Left Or TextFormatFlags.WordBreak) + y = CInt(titleFontHeight * 0.2) + GetTitleSize().Height + r = New Rectangle(x, y, w, h) + TextRenderer.DrawText(g, Description, Font, r, ForeColor, TextFormatFlags.Left Or TextFormatFlags.WordBreak) + ElseIf Title <> "" Then + TextRenderer.DrawText(g, Title, TitleFont, r, ForeColor, TextFormatFlags.Left Or TextFormatFlags.WordBreak) + ElseIf Description <> "" Then + TextRenderer.DrawText(g, Description, Font, r, ForeColor, TextFormatFlags.Left Or TextFormatFlags.WordBreak) + End If + End Sub + + Protected Overrides Sub Dispose(disposing As Boolean) + 'RemoveHandler ThemeManager.CurrentThemeChanged, AddressOf OnThemeChanged + TitleFont.Dispose() + MyBase.Dispose(disposing) + End Sub + End Class + + Public Class ButtonEx + Inherits Button + + Private _backDisabledColor As Color + Private _foreDisabledColor As Color + Private _text As String = "" + + + Property ShowMenuSymbol As Boolean + + + + Property ClickAction As Action + + Public Property BackDisabledColor As Color + Get + Return _backDisabledColor + End Get + Set(value As Color) + _backDisabledColor = value + End Set + End Property + + Private Function ShouldSerializeBackDisabledColor() As Boolean + Return BackDisabledColor <> Color.Empty + End Function + + Public Property ForeDisabledColor As Color + Get + Return _foreDisabledColor + End Get + Set(value As Color) + _foreDisabledColor = value + End Set + End Property + + Private Function ShouldSerializeForeDisabledColor() As Boolean + Return ForeDisabledColor <> Color.Empty + End Function + + + Shadows Property Name As String + Get + Return MyBase.Name + End Get + Set(value As String) + MyBase.Name = value + End Set + End Property + + + Shadows Property TabIndex As Integer + Get + Return MyBase.TabIndex + End Get + Set(value As Integer) + MyBase.TabIndex = value + End Set + End Property + + Protected Overrides ReadOnly Property ShowFocusCues As Boolean + Get + Return True + End Get + End Property + + 'The designer is not able to serialize the Text property probably + 'because it shadows the base Text property, Text2 is used as workaround + Property Text2 As String + Get + Return _text + End Get + Set(value As String) + _text = value + End Set + End Property + + Shadows Property Text As String + Get + Return _text + End Get + Set(value As String) + _text = value + + If AutoSize Then + Dim textSize = TextRenderer.MeasureText(_text, Font) + Dim fh = Font.Height + MinimumSize = New Size(CInt(fh * 2.2), fh) + AutoSizeMode = AutoSizeMode.GrowOnly + Size = New Size(textSize.Width + Padding.Horizontal + fh, textSize.Height + CInt(fh * 0.45)) + End If + + Invalidate(True) + End Set + End Property + + Private Function ShouldSerializeUseVisualStyleBackColor() As Boolean + Return False + End Function + + Protected Overrides ReadOnly Property DefaultSize As Size + Get + Return New Size(250, 70) + End Get + End Property + + Sub New() + SetStyle(ControlStyles.ResizeRedraw, True) + + Padding = New Padding(0) + + If Not DesignHelp.IsDesignMode Then + MinimumSize = New Size(20, 20) + UseCompatibleTextRendering = True + UseVisualStyleBackColor = False + FlatStyle = FlatStyle.Flat + End If + + FlatAppearance.BorderSize = 2 + + 'ApplyTheme() + + 'AddHandler ThemeManager.CurrentThemeChanged, AddressOf OnThemeChanged + End Sub + + 'Sub OnThemeChanged(theme As Theme) + ' ApplyTheme(theme) + 'End Sub + + 'Sub ApplyTheme() + ' ApplyTheme(ThemeManager.CurrentTheme) + 'End Sub + + 'Sub ApplyTheme(theme As Theme) + ' If DesignHelp.IsDesignMode Then + ' Exit Sub + ' End If + + ' SuspendLayout() + ' BackColor = theme.General.Controls.Button.BackColor + ' BackDisabledColor = theme.General.Controls.Button.BackDisabledColor + ' ForeColor = theme.General.Controls.Button.ForeColor + ' ForeDisabledColor = theme.General.Controls.Button.ForeDisabledColor + ' FlatAppearance.BorderColor = theme.General.Controls.Button.BorderColor + ' ResumeLayout() + 'End Sub + + Protected Overrides Sub OnClick(e As EventArgs) + ClickAction?.Invoke() + ContextMenuStrip?.Show(Me, 0, Height) + MyBase.OnClick(e) + End Sub + + Protected Overrides Sub OnPaint(e As PaintEventArgs) + MyBase.OnPaint(e) + + e.Graphics.SmoothingMode = SmoothingMode.AntiAlias + + Dim fore = If(Enabled, ForeColor, ForeDisabledColor) + Dim flags As TextFormatFlags + + Select Case TextAlign + Case Drawing.ContentAlignment.BottomCenter + flags = TextFormatFlags.Bottom Or TextFormatFlags.HorizontalCenter + Case Drawing.ContentAlignment.BottomLeft + flags = TextFormatFlags.Bottom Or TextFormatFlags.Left + Case Drawing.ContentAlignment.BottomRight + flags = TextFormatFlags.Bottom Or TextFormatFlags.Right + Case Drawing.ContentAlignment.MiddleCenter + flags = TextFormatFlags.VerticalCenter Or TextFormatFlags.HorizontalCenter + Case Drawing.ContentAlignment.MiddleLeft + flags = TextFormatFlags.VerticalCenter Or TextFormatFlags.Left + Case Drawing.ContentAlignment.MiddleRight + flags = TextFormatFlags.VerticalCenter Or TextFormatFlags.Right + Case Drawing.ContentAlignment.TopCenter + flags = TextFormatFlags.Top Or TextFormatFlags.HorizontalCenter + Case Drawing.ContentAlignment.TopLeft + flags = TextFormatFlags.Top Or TextFormatFlags.Left + Case Drawing.ContentAlignment.TopRight + flags = TextFormatFlags.Top Or TextFormatFlags.Right + End Select + + Using foreBrush = New SolidBrush(fore) + Dim rect = ClientRectangle + rect.Offset(0, Padding.Top - If(FlatStyle.HasFlag(FlatStyle.Flat), FlatAppearance.BorderSize \ 2, 0)) + + TextRenderer.DrawText(e.Graphics, Text, Font, rect, fore, flags) + End Using + + If ShowMenuSymbol Then + Dim h = CInt(Font.Height * 0.3) + Dim w = h * 2 + + Dim x1 = If(Text = "", Width \ 2 - w \ 2, Width - w - CInt(w * 0.7)) + Dim y1 = CInt(Height / 2 - h / 2) + + Dim x2 = CInt(x1 + w / 2) + Dim y2 = y1 + h + + Dim x3 = x1 + w + Dim y3 = y1 + + Using pen = New Pen(fore, Font.Height / 16.0F) + e.Graphics.DrawLine(pen, x1, y1, x2, y2) + e.Graphics.DrawLine(pen, x2, y2, x3, y3) + End Using + End If + End Sub + End Class + + Public Class CheckBoxEx + Inherits CheckBox + + 'Private _theme As Theme + + 'Public ReadOnly Property Theme As Theme + ' Get + ' Return _theme + ' End Get + 'End Property + + + Shadows Property Name() As String + Get + Return MyBase.Name + End Get + Set(value As String) + MyBase.Name = value + End Set + End Property + + + Shadows Property TabIndex As Integer + Get + Return MyBase.TabIndex + End Get + Set(value As Integer) + MyBase.TabIndex = value + End Set + End Property + + Sub New() + SetStyle(ControlStyles.ResizeRedraw, True) + SetStyle(ControlStyles.UserPaint, True) + UseVisualStyleBackColor = False + FlatStyle = FlatStyle.Standard + FlatAppearance.BorderSize = 2 + + 'ApplyTheme() + 'AddHandler ThemeManager.CurrentThemeChanged, AddressOf OnThemeChanged + End Sub + + 'Sub OnThemeChanged(theme As Theme) + ' ApplyTheme(theme) + 'End Sub + + 'Sub ApplyTheme() + ' ApplyTheme(ThemeManager.CurrentTheme) + 'End Sub + + 'Sub ApplyTheme(theme As Theme) + ' _theme = theme + + ' If DesignHelp.IsDesignMode Then + ' Exit Sub + ' End If + + ' SuspendLayout() + ' If Appearance.HasFlag(Appearance.Normal) Then + ' FlatStyle = FlatStyle.Standard + ' FlatAppearance.BorderSize = 0 + + ' BackColor = theme.General.Controls.CheckBox.BackColor + ' ForeColor = theme.General.Controls.CheckBox.ForeColor + ' FlatAppearance.BorderColor = theme.General.Controls.CheckBox.BorderColor + ' FlatAppearance.CheckedBackColor = theme.General.Controls.CheckBox.BackColor + ' FlatAppearance.MouseOverBackColor = theme.General.Controls.CheckBox.BackHighlightColor + ' Else + ' FlatStyle = FlatStyle.Flat + ' FlatAppearance.BorderSize = 0 + + ' BackColor = theme.General.Controls.CheckBox.BackColor + ' ForeColor = theme.General.Controls.Button.ForeColor + ' FlatAppearance.BorderColor = theme.General.Controls.Button.BorderColor + ' FlatAppearance.CheckedBackColor = theme.General.Controls.Button.BackColor + ' FlatAppearance.MouseOverBackColor = theme.General.Controls.CheckBox.BackHoverColor + ' End If + ' ResumeLayout() + 'End Sub + + 'Protected Overrides Sub OnPaint(pevent As PaintEventArgs) + ' InvokePaintBackground(Me, pevent) + + ' pevent.Graphics.SmoothingMode = SmoothingMode.AntiAlias + ' Dim state As CheckBoxState = If(CheckState = CheckState.Checked, CheckBoxState.CheckedNormal, CheckBoxState.UncheckedNormal) + ' Dim glyphSize As Size = CheckBoxRendererEx.GetGlyphSize(pevent.Graphics, state) + ' Dim vPos As Integer = (Height - glyphSize.Height) \ 2 + ' Dim hPos As Integer = 1 + ' Dim glyphLocation As Point = New Point(hPos, vPos) + ' Dim textLocation As Point = New Point(hPos + glyphSize.Width + hPos, 1 + Height - (Height - CInt(pevent.Graphics.MeasureString(Text, Font).Height)) \ 3) + ' Dim textFlags As TextFormatFlags = TextFormatFlags.SingleLine Or TextFormatFlags.VerticalCenter + ' Dim fColor As ColorHSL = If(Checked, _theme.General.Controls.CheckBox.ForeCheckedColor, _theme.General.Controls.CheckBox.ForeColor) + + ' CheckBoxRendererEx.DrawCheckBox(pevent.Graphics, glyphLocation, state) + ' TextRenderer.DrawText(pevent.Graphics, Text, Font, textLocation, fColor, textFlags) + 'End Sub + + Protected Overrides Sub OnPaintBackground(pevent As PaintEventArgs) + MyBase.OnPaintBackground(pevent) + End Sub + + Protected Overrides Sub OnCheckedChanged(e As EventArgs) + MyBase.OnCheckedChanged(e) + End Sub + + Private Function ShouldSerializeUseVisualStyleBackColor() As Boolean + Return False + End Function + End Class + + Public Class MenuButtonEx + Inherits ButtonEx + + Event ValueChangedUser(value As Object) + + + Property Items As New List(Of Object) + Property Menu As New ContextMenuStripEx + Property ShowPath As Boolean + + Sub New() + Menu.ShowImageMargin = False + ShowMenuSymbol = True + Padding = New Padding(4, 0, 0, 0) + AddHandler Menu.Opening, AddressOf MenuOpening + End Sub + + Sub MenuOpening(sender As Object, e As CancelEventArgs) + Menu.MinimumSize = New Size(Width, 0) + Dim minItemSize As Integer = Menu.MinimumSize.Width + + For Each mi As MenuItemEx In Menu.Items + mi.Font = New Font("Segoe UI", 9, If(Value IsNot Nothing AndAlso Value.Equals(mi.Tag), FontStyle.Bold, FontStyle.Regular)) + mi.AutoSize = True + minItemSize = Math.Max(minItemSize, mi.Width) + Next + + For Each mi As MenuItemEx In Menu.Items + mi.AutoSize = False + mi.Width = minItemSize + Next + End Sub + + Private ValueValue As Object + + + Property Value As Object + Get + Return ValueValue + End Get + Set(value As Object) + If Menu.Items.Count = 0 Then + If TypeOf value Is System.Enum Then + For Each i In System.Enum.GetValues(value.GetType) + Dim text = DispNameAttribute.GetValueForEnum(i) + Dim temp = i + + MenuItemEx.Add(Menu.Items, text, Sub(o As Object) OnAction(text, o), temp, Nothing).Tag = temp + Next + End If + End If + + If Not value Is Nothing Then + For Each i In Menu.Items.OfType(Of MenuItemEx)() + If value.Equals(i.Tag) Then Text = i.Text + + If i.DropDownItems.Count > 0 Then + For Each i2 In i.DropDownItems.OfType(Of MenuItemEx)() + If value.Equals(i2.Tag) Then + If ShowPath Then + Text = i2.Path + Else + Text = i2.Text + End If + End If + Next + End If + Next + End If + + If Text = "" AndAlso Not value Is Nothing Then + Text = value.ToString + End If + + ValueValue = value + End Set + End Property + + Protected Overrides Sub OnMouseDown(e As MouseEventArgs) + If e.Button = MouseButtons.Left Then + Menu.Show(Me, 0, Height) + Else + MyBase.OnMouseDown(e) + End If + End Sub + + Protected Overridable Sub OnValueChanged(value As Object) + RaiseEvent ValueChangedUser(value) + End Sub + + Sub AddRange(items As IEnumerable(Of Object)) + For Each i In items + Add(i.ToString, i, Nothing) + Next + End Sub + + Function Add(path As String, obj As Object, Optional tip As String = Nothing) As MenuItemEx + Items.Add(obj) + Dim name = path + + If path.Contains("|") Then + name = StringHelp.RightLast(path, "|").Trim + End If + + Dim ret = MenuItemEx.Add(Menu.Items, path, Sub(o As Object) OnAction(name, o), obj, tip) + ret.Tag = obj + ret.Path = path + Return ret + End Function + + Sub Clear() + Items.Clear() + ClearAndDisposeToolStripItems(Menu.Items) + End Sub + + Shared Sub ClearAndDisposeToolStripItems(instance As ToolStripItemCollection) + For Each i In instance.OfType(Of IDisposable).ToArray + i.Dispose() + Next + + instance.Clear() + End Sub + + Sub OnAction(text As String, value As Object) + Me.Text = text + Me.Value = value + OnValueChanged(value) + End Sub + + Function GetValue(Of T)() As T + Return DirectCast(Value, T) + End Function + + Function GetInt() As Integer + Return DirectCast(Value, Integer) + End Function + + Protected Overrides Sub Dispose(disposing As Boolean) + Menu.Dispose() + MyBase.Dispose(disposing) + End Sub + + Public Class ContextMenuStripEx + Inherits ContextMenuStrip + + Private FormValue As Form + + Sub New() + MyBase.New() + 'ApplyTheme() + 'AddHandler ThemeManager.CurrentThemeChanged, AddressOf OnThemeChanged + End Sub + + Sub New(container As IContainer) + MyBase.New(container) + 'ApplyTheme() + 'AddHandler ThemeManager.CurrentThemeChanged, AddressOf OnThemeChanged + End Sub + + 'Sub OnThemeChanged(theme As Theme) + ' ApplyTheme(theme) + 'End Sub + + 'Sub ApplyTheme() + ' ApplyTheme(ThemeManager.CurrentTheme) + 'End Sub + + 'Sub ApplyTheme(theme As Theme) + ' If DesignHelp.IsDesignMode Then + ' Exit Sub + ' End If + + ' SuspendLayout() + ' BackColor = theme.General.Controls.ToolStrip.DropdownBackgroundDefaultColor + ' ResumeLayout() + 'End Sub + + Protected Overrides Sub OnHandleCreated(e As EventArgs) + MyBase.OnHandleCreated(e) + 'g.SetRenderer(Me) + Font = New Font("Segoe UI", 9) + End Sub + + + Property Form As Form + Get + Return FormValue + End Get + Set(value As Form) + AddHandler value.Disposed, Sub() Dispose() + FormValue = value + value.KeyPreview = True + End Set + End Property + + Function Add(path As String) As MenuItemEx + Return Add(path, Nothing) + End Function + + Function Add(path As String, action As Action) As MenuItemEx + Return Add(path, action, True) + End Function + + Function Add(path As String, action As Action, key As Keys) As MenuItemEx + Return Add(path, action, key, True, Nothing, Nothing) + End Function + + Function Add(path As String, action As Action, key As Keys, symbol As Symbol) As MenuItemEx + Return Add(path, action, key, True, Nothing, Nothing, symbol) + End Function + + Function Add(path As String, action As Action, key As Keys, enabled As Boolean) As MenuItemEx + Return Add(path, action, key, enabled, Nothing, Nothing) + End Function + + Function Add(path As String, action As Action, help As String) As MenuItemEx + Return Add(path, action, True, help) + End Function + + Function Add(path As String, action As Action, enabled As Boolean) As MenuItemEx + Return Add(path, action, enabled, Nothing) + End Function + + Function Add(path As String, action As Action, key As Keys, help As String) As MenuItemEx + Return Add(path, action, key, True, Nothing, help) + End Function + + Function Add(path As String, action As Action, key As Keys, enabledFunc As Func(Of Boolean)) As MenuItemEx + Return Add(path, action, key, True, enabledFunc) + End Function + + Function Add(path As String, action As Action, key As Keys, enabledFunc As Func(Of Boolean), help As String) As MenuItemEx + Return Add(path, action, key, True, enabledFunc, help) + End Function + + Function Add(path As String, action As Action, enabled As Boolean, help As String) As MenuItemEx + Return Add(path, action, Keys.None, enabled, Nothing, help) + End Function + + Function Add(path As String, action As Action, enabledFunc As Func(Of Boolean), help As String) As MenuItemEx + Return Add(path, action, Keys.None, True, enabledFunc, help) + End Function + + Function Add( + path As String, + action As Action, + key As Keys, + enabled As Boolean, + enabledFunc As Func(Of Boolean), + Optional help As String = Nothing, + Optional symbol As Symbol = Symbol.None) As MenuItemEx + + Dim ret = MenuItemEx.Add(Items, path, action) + + If ret Is Nothing Then + Exit Function + End If + + ret.Form = Form + ret.Enabled = enabled + ret.EnabledFunc = enabledFunc + + AddHandler Opening, AddressOf ret.Opening + + Return ret + End Function + + ''I wasn't able to find out why it's only needed in some menus + 'Sub ApplyMarginFix() + ' For Each i In GetItems.OfType(Of MenuItemEx) + ' i.ShortcutKeyDisplayString += " ".Multiply(CInt(g.DPI / 96)) + ' Next + 'End Sub + + Function GetItems() As List(Of ToolStripItem) + Dim ret As New List(Of ToolStripItem) + AddItemsRecursive(Items, ret) + Return ret + End Function + + Shared Sub AddItemsRecursive(searchList As ToolStripItemCollection, returnList As List(Of ToolStripItem)) + For Each i As ToolStripItem In searchList + returnList.Add(i) + + If TypeOf i Is ToolStripDropDownItem Then + AddItemsRecursive(DirectCast(i, ToolStripDropDownItem).DropDownItems, returnList) + End If + Next + End Sub + End Class + + Public Class MenuItemEx + Inherits ToolStripMenuItem + + Shared Property UseTooltips As Boolean + + Private Action As Action + + + Property Form As Form + + + Property EnabledFunc As Func(Of Boolean) + + + Property VisibleFunc As Func(Of Boolean) + + + Property Path As String + + Sub New() + MyBase.New() + End Sub + + Sub New(text As String) + MyBase.New(text) + End Sub + + Sub New(text As String, a As Action) + Me.New(text, a, Nothing) + End Sub + + Sub New(text As String, + action As Action, + Optional tooltip As String = Nothing, + Optional enabled As Boolean = True) + + Me.Text = text + Me.Action = action + Me.Enabled = enabled + End Sub + + Sub Opening(sender As Object, e As CancelEventArgs) + If Not EnabledFunc Is Nothing Then + Enabled = EnabledFunc.Invoke + End If + + If Not VisibleFunc Is Nothing Then + Visible = VisibleFunc.Invoke + End If + End Sub + + Shared Function Add(Of T)( + items As ToolStripItemCollection, + path As String, + action As Action(Of T), + value As T, + Optional help As String = Nothing) As MenuItemEx + + Return Add(items, path, Sub() action(value), help) + End Function + + Shared Function Add(items As ToolStripItemCollection, path As String) As MenuItemEx + Return Add(items, path, Nothing) + End Function + + Shared Function Add( + items As ToolStripItemCollection, path As String, action As Action) As MenuItemEx + + Return Add(items, path, action, Symbol.None, Nothing) + End Function + + Shared Function Add( + items As ToolStripItemCollection, + path As String, + action As Action, + tip As String) As MenuItemEx + + Return Add(items, path, action, Symbol.None, tip) + End Function + + Shared Function Add( + items As ToolStripItemCollection, + path As String, + action As Action, + symbol As Symbol, + Optional tip As String = Nothing) As MenuItemEx + + Dim a = path.Split({" | "}, StringSplitOptions.RemoveEmptyEntries) + Dim l = items + Dim p = "" + + For x = 0 To a.Length - 1 + p += If(x = 0, "", " | ") + a(x) + Dim found = False + + For Each i In l.OfType(Of ToolStripMenuItem)() + If x < a.Length - 1 Then + If i.Text = a(x) Then + found = True + l = i.DropDownItems + End If + End If + Next + + If Not found Then + If x = a.Length - 1 Then + If a(x) = "-" Then + l.Add(New ToolStripSeparator) + Else + Dim item As New MenuItemEx(a(x), action, tip) + item.Path = p + l.Add(item) + l = item.DropDownItems + Return item + End If + Else + Dim item As New MenuItemEx() + item.Text = a(x) + item.Path = p + l.Add(item) + l = item.DropDownItems + End If + End If + Next + End Function + + Overrides Function GetPreferredSize(constrainingSize As Size) As Size + Dim ret = MyBase.GetPreferredSize(constrainingSize) + ret.Height = CInt(Font.Height * 1.4) + Return ret + End Function + + Protected Overrides Sub Dispose(disposing As Boolean) + MyBase.Dispose(disposing) + Action = Nothing + EnabledFunc = Nothing + VisibleFunc = Nothing + Form = Nothing + End Sub + + Sub CloseAll(item As Object) + If TypeOf item Is ToolStripItem Then + Dim d = DirectCast(item, ToolStripItem) + CloseAll(d.Owner) + End If + + If TypeOf item Is ToolStripDropDown Then + Dim d = DirectCast(item, ToolStripDropDown) + d.Close() + CloseAll(d.OwnerItem) + End If + End Sub + + Protected Overrides Sub OnClick(e As EventArgs) + Application.DoEvents() + + If Not Action Is Nothing Then + Action() + End If + + MyBase.OnClick(e) + End Sub + End Class + End Class + + Public Class LabelEx + Inherits Label + + Sub New() + TextAlign = Drawing.ContentAlignment.MiddleLeft + 'ApplyTheme() + + 'AddHandler ThemeManager.CurrentThemeChanged, AddressOf OnThemeChanged + End Sub + + 'Sub OnThemeChanged(theme As Theme) + ' ApplyTheme(theme) + 'End Sub + + 'Sub ApplyTheme() + ' ApplyTheme(ThemeManager.CurrentTheme) + 'End Sub + + 'Sub ApplyTheme(theme As Theme) + ' If DesignHelp.IsDesignMode Then + ' Exit Sub + ' End If + + ' SuspendLayout() + ' BackColor = theme.General.Controls.Label.BackColor + ' ForeColor = theme.General.Controls.Label.ForeColor + ' ResumeLayout() + 'End Sub + + + Shadows Property Name() As String + Get + Return MyBase.Name + End Get + Set(value As String) + MyBase.Name = value + End Set + End Property + + + Shadows Property TabIndex As Integer + Get + Return MyBase.TabIndex + End Get + Set(value As Integer) + MyBase.TabIndex = value + End Set + End Property + End Class + + Public Class DesignHelp + Private Shared IsDesignModeValue As Boolean? + + Shared ReadOnly Property IsDesignMode As Boolean + Get + If Not IsDesignModeValue.HasValue Then + IsDesignModeValue = Process.GetCurrentProcess.ProcessName = "devenv" + End If + + Return IsDesignModeValue.Value + End Get + End Property + End Class + + Public Class Colors + Shared Property Link As Color = Color.RoyalBlue + Shared Property LinkHover As Color = Color.CornflowerBlue + Shared Property Window As Color = SystemColors.Control + End Class + + Sub blDetails_Click(sender As Object, e As EventArgs) Handles blDetails.Click + paMain.ScrollControlIntoView(paMain.Controls(0)) + + If blDetails.Text = "Show Details" Then + blDetails.Text = "Hide Details" + Else + Width = FontHeight * 22 + blDetails.Text = "Show Details" + End If + + paMain.PerformLayout() + AdjustSize() + AdjustSize() + End Sub + + Sub InputTextEditTextBoxKeyDown(sender As Object, e As KeyEventArgs) + If e.KeyData = Keys.Enter AndAlso Not AcceptButton Is Nothing Then + AcceptButton.PerformClick() + End If + End Sub + + ReadOnly Property IsDisposingOrDisposed As Boolean + Get + Try + Return Disposing OrElse IsDisposed + Catch + Return True + End Try + End Get + End Property +End Class diff --git a/src/mpv.net.csproj b/src/mpv.net.csproj index 0dba253..972e5df 100644 --- a/src/mpv.net.csproj +++ b/src/mpv.net.csproj @@ -231,7 +231,12 @@ Designer - + + + {cfbe6e6c-b711-42bb-b5ed-487d4767fe2b} + TaskDialog + +