From 1c934f17176caafe6a8d0bca45cc17bd99c213bc Mon Sep 17 00:00:00 2001 From: Markus Hofknecht Date: Thu, 4 Jul 2019 19:04:14 +0200 Subject: [PATCH] Initial commit, 0.9.1.233 --- .gitignore | 3 + Config.cs | 59 + Controls/AboutBox.Designer.cs | 526 ++++++++ Controls/AboutBox.cs | 846 +++++++++++++ Controls/AboutBox.resx | 377 ++++++ Controls/AppContextMenu.cs | 258 ++++ Controls/AppNotifyIcon.cs | 126 ++ Controls/AskHotKeyForm.Designer.cs | 139 +++ Controls/AskHotKeyForm.cs | 121 ++ Controls/AskHotKeyForm.resx | 377 ++++++ Controls/DragDropHintForm.Designer.cs | 140 +++ Controls/DragDropHintForm.cs | 29 + Controls/DragDropHintForm.resx | 377 ++++++ Controls/Menu.Designer.cs | 183 +++ Controls/Menu.cs | 313 +++++ Controls/Menu.resx | 126 ++ Controls/MenuData.cs | 24 + Controls/RowData.cs | 480 ++++++++ Helper/BringWindowToTop.cs | 62 + Helper/FadeForm.cs | 169 +++ Helper/File/FileIni.cs | 27 + Helper/File/FileLnk.cs | 218 ++++ Helper/File/FileUrl.cs | 65 + Helper/File/IconReader.cs | 299 +++++ Helper/KeyboardHook.cs | 148 +++ Helper/MessageFilter.cs | 33 + Helper/ScreenMouse.cs | 30 + Helper/ShellContextMenu.cs | 1640 +++++++++++++++++++++++++ Helper/Taskbar.cs | 143 +++ Helper/WaitFastLeave.cs | 39 + Helper/WaitMenuOpen.cs | 75 ++ MenuDefines.cs | 41 + Program.cs | 183 +++ Properties/AssemblyInfo.cs | 35 + Properties/Resources.Designer.cs | 293 +++++ Properties/Resources.resx | 190 +++ Properties/Settings.Designer.cs | 74 ++ Properties/Settings.settings | 18 + Resources/L010.ico | Bin 0 -> 104496 bytes Resources/L020.ico | Bin 0 -> 104486 bytes Resources/L030.ico | Bin 0 -> 104423 bytes Resources/L040.ico | Bin 0 -> 104485 bytes Resources/L050.ico | Bin 0 -> 104632 bytes Resources/L060.ico | Bin 0 -> 104465 bytes Resources/L070.ico | Bin 0 -> 104553 bytes Resources/L080.ico | Bin 0 -> 104683 bytes Resources/L090.ico | Bin 0 -> 104107 bytes Resources/L100.ico | Bin 0 -> 104577 bytes Resources/L110.ico | Bin 0 -> 104657 bytes Resources/L120.ico | Bin 0 -> 104583 bytes Resources/L130.ico | Bin 0 -> 104581 bytes Resources/L140.ico | Bin 0 -> 104564 bytes Resources/L150.ico | Bin 0 -> 104519 bytes Resources/L160.ico | Bin 0 -> 104547 bytes Resources/L170.ico | Bin 0 -> 104392 bytes Resources/L180.ico | Bin 0 -> 103977 bytes Resources/NotSelected.png | Bin 0 -> 8936 bytes Resources/STM.ico | Bin 0 -> 15086 bytes Resources/STM_black.ico | Bin 0 -> 15086 bytes Resources/Selected.png | Bin 0 -> 13491 bytes Resources/SystemTrayMenu.ico | Bin 0 -> 15086 bytes Resources/hintDragDrop.png | Bin 0 -> 7027 bytes Resources/lang.Designer.cs | 243 ++++ Resources/lang.de-DE.Designer.cs | 0 Resources/lang.de-DE.resx | 180 +++ Resources/lang.resx | 180 +++ STM Request Norton.txt | 59 + SystemTrayMenu.csproj | 236 ++++ SystemTrayMenu.sln | 25 + SystemTrayMenuHandler.cs | 1098 +++++++++++++++++ app.config | 37 + 71 files changed, 10344 insertions(+) create mode 100644 Config.cs create mode 100644 Controls/AboutBox.Designer.cs create mode 100644 Controls/AboutBox.cs create mode 100644 Controls/AboutBox.resx create mode 100644 Controls/AppContextMenu.cs create mode 100644 Controls/AppNotifyIcon.cs create mode 100644 Controls/AskHotKeyForm.Designer.cs create mode 100644 Controls/AskHotKeyForm.cs create mode 100644 Controls/AskHotKeyForm.resx create mode 100644 Controls/DragDropHintForm.Designer.cs create mode 100644 Controls/DragDropHintForm.cs create mode 100644 Controls/DragDropHintForm.resx create mode 100644 Controls/Menu.Designer.cs create mode 100644 Controls/Menu.cs create mode 100644 Controls/Menu.resx create mode 100644 Controls/MenuData.cs create mode 100644 Controls/RowData.cs create mode 100644 Helper/BringWindowToTop.cs create mode 100644 Helper/FadeForm.cs create mode 100644 Helper/File/FileIni.cs create mode 100644 Helper/File/FileLnk.cs create mode 100644 Helper/File/FileUrl.cs create mode 100644 Helper/File/IconReader.cs create mode 100644 Helper/KeyboardHook.cs create mode 100644 Helper/MessageFilter.cs create mode 100644 Helper/ScreenMouse.cs create mode 100644 Helper/ShellContextMenu.cs create mode 100644 Helper/Taskbar.cs create mode 100644 Helper/WaitFastLeave.cs create mode 100644 Helper/WaitMenuOpen.cs create mode 100644 MenuDefines.cs create mode 100644 Program.cs create mode 100644 Properties/AssemblyInfo.cs create mode 100644 Properties/Resources.Designer.cs create mode 100644 Properties/Resources.resx create mode 100644 Properties/Settings.Designer.cs create mode 100644 Properties/Settings.settings create mode 100644 Resources/L010.ico create mode 100644 Resources/L020.ico create mode 100644 Resources/L030.ico create mode 100644 Resources/L040.ico create mode 100644 Resources/L050.ico create mode 100644 Resources/L060.ico create mode 100644 Resources/L070.ico create mode 100644 Resources/L080.ico create mode 100644 Resources/L090.ico create mode 100644 Resources/L100.ico create mode 100644 Resources/L110.ico create mode 100644 Resources/L120.ico create mode 100644 Resources/L130.ico create mode 100644 Resources/L140.ico create mode 100644 Resources/L150.ico create mode 100644 Resources/L160.ico create mode 100644 Resources/L170.ico create mode 100644 Resources/L180.ico create mode 100644 Resources/NotSelected.png create mode 100644 Resources/STM.ico create mode 100644 Resources/STM_black.ico create mode 100644 Resources/Selected.png create mode 100644 Resources/SystemTrayMenu.ico create mode 100644 Resources/hintDragDrop.png create mode 100644 Resources/lang.Designer.cs create mode 100644 Resources/lang.de-DE.Designer.cs create mode 100644 Resources/lang.de-DE.resx create mode 100644 Resources/lang.resx create mode 100644 STM Request Norton.txt create mode 100644 SystemTrayMenu.csproj create mode 100644 SystemTrayMenu.sln create mode 100644 SystemTrayMenuHandler.cs create mode 100644 app.config diff --git a/.gitignore b/.gitignore index 3e759b7..1f7a27e 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,9 @@ ## ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore +# SVN +.svn* + # User-specific files *.suo *.user diff --git a/Config.cs b/Config.cs new file mode 100644 index 0000000..5ff1e48 --- /dev/null +++ b/Config.cs @@ -0,0 +1,59 @@ +using Microsoft.WindowsAPICodePack.Dialogs; +using System; +using System.IO; + +namespace SystemTrayMenu +{ + public class Config + { + public static string Language = "en"; + + public static string Path + { + get + { + return Properties.Settings.Default.PathDirectory; + } + } + + public static bool LoadOrSetByUser() + { + bool pathOK = Directory.Exists( + Properties.Settings.Default.PathDirectory); + if (!pathOK) + { + pathOK = SetFolderByUser(); + } + return pathOK; + } + + public static bool SetFolderByUser() + { + bool pathOK = false; + bool userAborted = false; + CommonOpenFileDialog dialog = new CommonOpenFileDialog(); + dialog.InitialDirectory = Path; + dialog.IsFolderPicker = true; + do + { + if (dialog.ShowDialog() == CommonFileDialogResult.Ok) + { + if (Directory.Exists(dialog.FileName)) + { + pathOK = true; + Properties.Settings.Default.PathDirectory = + dialog.FileName; + Properties.Settings.Default.Save(); + } + } + else + { + userAborted = true; + } + } + while (!pathOK && !userAborted); + + return pathOK; + } + } +} diff --git a/Controls/AboutBox.Designer.cs b/Controls/AboutBox.Designer.cs new file mode 100644 index 0000000..bd3ca39 --- /dev/null +++ b/Controls/AboutBox.Designer.cs @@ -0,0 +1,526 @@ +namespace SystemTrayMenu.Controls +{ + partial class AboutBox + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AboutBox)); + this.buttonDetails = new System.Windows.Forms.Button(); + this.ImagePictureBox = new System.Windows.Forms.PictureBox(); + this.AppDateLabel = new System.Windows.Forms.Label(); + this.buttonSystemInfo = new System.Windows.Forms.Button(); + this.AppCopyrightLabel = new System.Windows.Forms.Label(); + this.AppVersionLabel = new System.Windows.Forms.Label(); + this.AppDescriptionLabel = new System.Windows.Forms.Label(); + this.GroupBox1 = new System.Windows.Forms.GroupBox(); + this.AppTitleLabel = new System.Windows.Forms.Label(); + this.buttonOk = new System.Windows.Forms.Button(); + this.MoreRichTextBox = new System.Windows.Forms.RichTextBox(); + this.TabPanelDetails = new System.Windows.Forms.TabControl(); + this.TabPageApplication = new System.Windows.Forms.TabPage(); + this.AppInfoListView = new System.Windows.Forms.ListView(); + this.colKey = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.colValue = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.TabPageAssemblies = new System.Windows.Forms.TabPage(); + this.AssemblyInfoListView = new System.Windows.Forms.ListView(); + this.colAssemblyName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.colAssemblyVersion = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.colAssemblyBuilt = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.colAssemblyCodeBase = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.TabPageAssemblyDetails = new System.Windows.Forms.TabPage(); + this.AssemblyDetailsListView = new System.Windows.Forms.ListView(); + this.ColumnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.ColumnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.AssemblyNamesComboBox = new System.Windows.Forms.ComboBox(); + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.tableLayoutPanel4 = new System.Windows.Forms.TableLayoutPanel(); + this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel(); + this.tableLayoutPanel3 = new System.Windows.Forms.TableLayoutPanel(); + ((System.ComponentModel.ISupportInitialize)(this.ImagePictureBox)).BeginInit(); + this.TabPanelDetails.SuspendLayout(); + this.TabPageApplication.SuspendLayout(); + this.TabPageAssemblies.SuspendLayout(); + this.TabPageAssemblyDetails.SuspendLayout(); + this.tableLayoutPanel1.SuspendLayout(); + this.tableLayoutPanel4.SuspendLayout(); + this.tableLayoutPanel2.SuspendLayout(); + this.tableLayoutPanel3.SuspendLayout(); + this.SuspendLayout(); + // + // buttonDetails + // + this.buttonDetails.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonDetails.AutoSize = true; + this.buttonDetails.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.buttonDetails.Location = new System.Drawing.Point(148, 5); + this.buttonDetails.Margin = new System.Windows.Forms.Padding(5); + this.buttonDetails.MinimumSize = new System.Drawing.Size(133, 40); + this.buttonDetails.Name = "buttonDetails"; + this.buttonDetails.Size = new System.Drawing.Size(133, 40); + this.buttonDetails.TabIndex = 25; + this.buttonDetails.Text = "Details"; + this.buttonDetails.Click += new System.EventHandler(this.DetailsButton_Click); + // + // ImagePictureBox + // + this.ImagePictureBox.BackgroundImage = global::SystemTrayMenu.Properties.Resources.STM; + this.ImagePictureBox.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; + this.ImagePictureBox.Location = new System.Drawing.Point(5, 5); + this.ImagePictureBox.Margin = new System.Windows.Forms.Padding(5); + this.ImagePictureBox.Name = "ImagePictureBox"; + this.ImagePictureBox.Size = new System.Drawing.Size(68, 63); + this.ImagePictureBox.TabIndex = 24; + this.ImagePictureBox.TabStop = false; + // + // AppDateLabel + // + this.AppDateLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.AppDateLabel.AutoSize = true; + this.AppDateLabel.Location = new System.Drawing.Point(5, 140); + this.AppDateLabel.Margin = new System.Windows.Forms.Padding(5); + this.AppDateLabel.Name = "AppDateLabel"; + this.AppDateLabel.Size = new System.Drawing.Size(668, 25); + this.AppDateLabel.TabIndex = 23; + this.AppDateLabel.Text = "Built on %builddate%"; + // + // buttonSystemInfo + // + this.buttonSystemInfo.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonSystemInfo.AutoSize = true; + this.buttonSystemInfo.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.buttonSystemInfo.Location = new System.Drawing.Point(5, 5); + this.buttonSystemInfo.Margin = new System.Windows.Forms.Padding(5); + this.buttonSystemInfo.MinimumSize = new System.Drawing.Size(133, 40); + this.buttonSystemInfo.Name = "buttonSystemInfo"; + this.buttonSystemInfo.Size = new System.Drawing.Size(133, 40); + this.buttonSystemInfo.TabIndex = 22; + this.buttonSystemInfo.Text = "System Info"; + this.buttonSystemInfo.Visible = false; + this.buttonSystemInfo.Click += new System.EventHandler(this.SysInfoButton_Click); + // + // AppCopyrightLabel + // + this.AppCopyrightLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.AppCopyrightLabel.AutoSize = true; + this.AppCopyrightLabel.Location = new System.Drawing.Point(5, 175); + this.AppCopyrightLabel.Margin = new System.Windows.Forms.Padding(5); + this.AppCopyrightLabel.Name = "AppCopyrightLabel"; + this.AppCopyrightLabel.Size = new System.Drawing.Size(668, 25); + this.AppCopyrightLabel.TabIndex = 21; + this.AppCopyrightLabel.Text = "Copyright © %year%, %company%"; + // + // AppVersionLabel + // + this.AppVersionLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.AppVersionLabel.AutoSize = true; + this.AppVersionLabel.Location = new System.Drawing.Point(5, 105); + this.AppVersionLabel.Margin = new System.Windows.Forms.Padding(5); + this.AppVersionLabel.Name = "AppVersionLabel"; + this.AppVersionLabel.Size = new System.Drawing.Size(668, 25); + this.AppVersionLabel.TabIndex = 20; + this.AppVersionLabel.Text = "Version %version%"; + // + // AppDescriptionLabel + // + this.AppDescriptionLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.AppDescriptionLabel.AutoSize = true; + this.AppDescriptionLabel.Location = new System.Drawing.Point(5, 40); + this.AppDescriptionLabel.Margin = new System.Windows.Forms.Padding(5); + this.AppDescriptionLabel.Name = "AppDescriptionLabel"; + this.AppDescriptionLabel.Size = new System.Drawing.Size(142, 25); + this.AppDescriptionLabel.TabIndex = 19; + this.AppDescriptionLabel.Text = "%description%"; + // + // GroupBox1 + // + this.GroupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.GroupBox1.Location = new System.Drawing.Point(5, 91); + this.GroupBox1.Margin = new System.Windows.Forms.Padding(5); + this.GroupBox1.Name = "GroupBox1"; + this.GroupBox1.Padding = new System.Windows.Forms.Padding(5); + this.GroupBox1.Size = new System.Drawing.Size(668, 4); + this.GroupBox1.TabIndex = 18; + this.GroupBox1.TabStop = false; + this.GroupBox1.Text = "GroupBox1"; + // + // AppTitleLabel + // + this.AppTitleLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.AppTitleLabel.AutoSize = true; + this.AppTitleLabel.Location = new System.Drawing.Point(5, 5); + this.AppTitleLabel.Margin = new System.Windows.Forms.Padding(5); + this.AppTitleLabel.Name = "AppTitleLabel"; + this.AppTitleLabel.Size = new System.Drawing.Size(142, 25); + this.AppTitleLabel.TabIndex = 17; + this.AppTitleLabel.Text = "%title%"; + // + // buttonOk + // + this.buttonOk.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOk.AutoSize = true; + this.buttonOk.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.buttonOk.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonOk.Location = new System.Drawing.Point(291, 5); + this.buttonOk.Margin = new System.Windows.Forms.Padding(5); + this.buttonOk.MinimumSize = new System.Drawing.Size(133, 40); + this.buttonOk.Name = "buttonOk"; + this.buttonOk.Size = new System.Drawing.Size(133, 40); + this.buttonOk.TabIndex = 16; + this.buttonOk.Text = "OK"; + // + // MoreRichTextBox + // + this.MoreRichTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.MoreRichTextBox.BackColor = System.Drawing.SystemColors.ControlLight; + this.MoreRichTextBox.Location = new System.Drawing.Point(5, 210); + this.MoreRichTextBox.Margin = new System.Windows.Forms.Padding(5); + this.MoreRichTextBox.Name = "MoreRichTextBox"; + this.MoreRichTextBox.ReadOnly = true; + this.MoreRichTextBox.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Vertical; + this.MoreRichTextBox.Size = new System.Drawing.Size(668, 210); + this.MoreRichTextBox.TabIndex = 26; + this.MoreRichTextBox.Text = "%product% is %copyright%, %trademark%"; + this.MoreRichTextBox.LinkClicked += new System.Windows.Forms.LinkClickedEventHandler(this.MoreRichTextBox_LinkClicked); + // + // TabPanelDetails + // + this.TabPanelDetails.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.TabPanelDetails.Controls.Add(this.TabPageApplication); + this.TabPanelDetails.Controls.Add(this.TabPageAssemblies); + this.TabPanelDetails.Controls.Add(this.TabPageAssemblyDetails); + this.TabPanelDetails.Location = new System.Drawing.Point(5, 430); + this.TabPanelDetails.Margin = new System.Windows.Forms.Padding(5); + this.TabPanelDetails.Name = "TabPanelDetails"; + this.TabPanelDetails.SelectedIndex = 0; + this.TabPanelDetails.Size = new System.Drawing.Size(668, 219); + this.TabPanelDetails.TabIndex = 27; + this.TabPanelDetails.Visible = false; + this.TabPanelDetails.SelectedIndexChanged += new System.EventHandler(this.TabPanelDetails_SelectedIndexChanged); + // + // TabPageApplication + // + this.TabPageApplication.Controls.Add(this.AppInfoListView); + this.TabPageApplication.Location = new System.Drawing.Point(4, 33); + this.TabPageApplication.Margin = new System.Windows.Forms.Padding(5); + this.TabPageApplication.Name = "TabPageApplication"; + this.TabPageApplication.Size = new System.Drawing.Size(660, 182); + this.TabPageApplication.TabIndex = 0; + this.TabPageApplication.Text = "Application"; + // + // AppInfoListView + // + this.AppInfoListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.colKey, + this.colValue}); + this.AppInfoListView.Dock = System.Windows.Forms.DockStyle.Fill; + this.AppInfoListView.FullRowSelect = true; + this.AppInfoListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; + this.AppInfoListView.Location = new System.Drawing.Point(0, 0); + this.AppInfoListView.Margin = new System.Windows.Forms.Padding(5); + this.AppInfoListView.Name = "AppInfoListView"; + this.AppInfoListView.Size = new System.Drawing.Size(660, 182); + this.AppInfoListView.TabIndex = 16; + this.AppInfoListView.UseCompatibleStateImageBehavior = false; + this.AppInfoListView.View = System.Windows.Forms.View.Details; + // + // colKey + // + this.colKey.Text = "Application Key"; + this.colKey.Width = 120; + // + // colValue + // + this.colValue.Text = "Value"; + this.colValue.Width = 700; + // + // TabPageAssemblies + // + this.TabPageAssemblies.Controls.Add(this.AssemblyInfoListView); + this.TabPageAssemblies.Location = new System.Drawing.Point(4, 33); + this.TabPageAssemblies.Margin = new System.Windows.Forms.Padding(5); + this.TabPageAssemblies.Name = "TabPageAssemblies"; + this.TabPageAssemblies.Size = new System.Drawing.Size(660, 182); + this.TabPageAssemblies.TabIndex = 1; + this.TabPageAssemblies.Text = "Assemblies"; + // + // AssemblyInfoListView + // + this.AssemblyInfoListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.colAssemblyName, + this.colAssemblyVersion, + this.colAssemblyBuilt, + this.colAssemblyCodeBase}); + this.AssemblyInfoListView.Dock = System.Windows.Forms.DockStyle.Fill; + this.AssemblyInfoListView.FullRowSelect = true; + this.AssemblyInfoListView.Location = new System.Drawing.Point(0, 0); + this.AssemblyInfoListView.Margin = new System.Windows.Forms.Padding(5); + this.AssemblyInfoListView.MultiSelect = false; + this.AssemblyInfoListView.Name = "AssemblyInfoListView"; + this.AssemblyInfoListView.Size = new System.Drawing.Size(660, 182); + this.AssemblyInfoListView.Sorting = System.Windows.Forms.SortOrder.Ascending; + this.AssemblyInfoListView.TabIndex = 13; + this.AssemblyInfoListView.UseCompatibleStateImageBehavior = false; + this.AssemblyInfoListView.View = System.Windows.Forms.View.Details; + this.AssemblyInfoListView.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.AssemblyInfoListView_ColumnClick); + this.AssemblyInfoListView.DoubleClick += new System.EventHandler(this.AssemblyInfoListView_DoubleClick); + // + // colAssemblyName + // + this.colAssemblyName.Text = "Assembly"; + this.colAssemblyName.Width = 123; + // + // colAssemblyVersion + // + this.colAssemblyVersion.Text = "Version"; + this.colAssemblyVersion.Width = 100; + // + // colAssemblyBuilt + // + this.colAssemblyBuilt.Text = "Built"; + this.colAssemblyBuilt.Width = 130; + // + // colAssemblyCodeBase + // + this.colAssemblyCodeBase.Text = "CodeBase"; + this.colAssemblyCodeBase.Width = 750; + // + // TabPageAssemblyDetails + // + this.TabPageAssemblyDetails.Controls.Add(this.AssemblyDetailsListView); + this.TabPageAssemblyDetails.Controls.Add(this.AssemblyNamesComboBox); + this.TabPageAssemblyDetails.Location = new System.Drawing.Point(4, 33); + this.TabPageAssemblyDetails.Margin = new System.Windows.Forms.Padding(5); + this.TabPageAssemblyDetails.Name = "TabPageAssemblyDetails"; + this.TabPageAssemblyDetails.Size = new System.Drawing.Size(660, 182); + this.TabPageAssemblyDetails.TabIndex = 2; + this.TabPageAssemblyDetails.Text = "Assembly Details"; + // + // AssemblyDetailsListView + // + this.AssemblyDetailsListView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.ColumnHeader1, + this.ColumnHeader2}); + this.AssemblyDetailsListView.Dock = System.Windows.Forms.DockStyle.Fill; + this.AssemblyDetailsListView.FullRowSelect = true; + this.AssemblyDetailsListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; + this.AssemblyDetailsListView.Location = new System.Drawing.Point(0, 32); + this.AssemblyDetailsListView.Margin = new System.Windows.Forms.Padding(5); + this.AssemblyDetailsListView.Name = "AssemblyDetailsListView"; + this.AssemblyDetailsListView.Size = new System.Drawing.Size(660, 150); + this.AssemblyDetailsListView.Sorting = System.Windows.Forms.SortOrder.Ascending; + this.AssemblyDetailsListView.TabIndex = 19; + this.AssemblyDetailsListView.UseCompatibleStateImageBehavior = false; + this.AssemblyDetailsListView.View = System.Windows.Forms.View.Details; + // + // ColumnHeader1 + // + this.ColumnHeader1.Text = "Assembly Key"; + this.ColumnHeader1.Width = 120; + // + // ColumnHeader2 + // + this.ColumnHeader2.Text = "Value"; + this.ColumnHeader2.Width = 700; + // + // AssemblyNamesComboBox + // + this.AssemblyNamesComboBox.Dock = System.Windows.Forms.DockStyle.Top; + this.AssemblyNamesComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.AssemblyNamesComboBox.Location = new System.Drawing.Point(0, 0); + this.AssemblyNamesComboBox.Margin = new System.Windows.Forms.Padding(5); + this.AssemblyNamesComboBox.Name = "AssemblyNamesComboBox"; + this.AssemblyNamesComboBox.Size = new System.Drawing.Size(660, 32); + this.AssemblyNamesComboBox.Sorted = true; + this.AssemblyNamesComboBox.TabIndex = 18; + this.AssemblyNamesComboBox.SelectedIndexChanged += new System.EventHandler(this.AssemblyNamesComboBox_SelectedIndexChanged); + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.AutoSize = true; + this.tableLayoutPanel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.tableLayoutPanel1.ColumnCount = 1; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel1.Controls.Add(this.tableLayoutPanel4, 0, 8); + this.tableLayoutPanel1.Controls.Add(this.tableLayoutPanel2, 0, 0); + this.tableLayoutPanel1.Controls.Add(this.AppCopyrightLabel, 0, 4); + this.tableLayoutPanel1.Controls.Add(this.AppDateLabel, 0, 3); + this.tableLayoutPanel1.Controls.Add(this.GroupBox1, 0, 1); + this.tableLayoutPanel1.Controls.Add(this.TabPanelDetails, 0, 7); + this.tableLayoutPanel1.Controls.Add(this.MoreRichTextBox, 0, 6); + this.tableLayoutPanel1.Controls.Add(this.AppVersionLabel, 0, 2); + this.tableLayoutPanel1.Location = new System.Drawing.Point(16, 12); + this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(4); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 9; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tableLayoutPanel1.Size = new System.Drawing.Size(678, 712); + this.tableLayoutPanel1.TabIndex = 28; + // + // tableLayoutPanel4 + // + this.tableLayoutPanel4.AutoSize = true; + this.tableLayoutPanel4.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.tableLayoutPanel4.ColumnCount = 3; + this.tableLayoutPanel4.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + this.tableLayoutPanel4.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + this.tableLayoutPanel4.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + this.tableLayoutPanel4.Controls.Add(this.buttonSystemInfo, 0, 0); + this.tableLayoutPanel4.Controls.Add(this.buttonDetails, 1, 0); + this.tableLayoutPanel4.Controls.Add(this.buttonOk, 2, 0); + this.tableLayoutPanel4.Location = new System.Drawing.Point(4, 658); + this.tableLayoutPanel4.Margin = new System.Windows.Forms.Padding(4); + this.tableLayoutPanel4.Name = "tableLayoutPanel4"; + this.tableLayoutPanel4.RowCount = 1; + this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tableLayoutPanel4.Size = new System.Drawing.Size(429, 50); + this.tableLayoutPanel4.TabIndex = 29; + // + // tableLayoutPanel2 + // + this.tableLayoutPanel2.AutoSize = true; + this.tableLayoutPanel2.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.tableLayoutPanel2.ColumnCount = 2; + this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 548F)); + this.tableLayoutPanel2.Controls.Add(this.ImagePictureBox, 0, 0); + this.tableLayoutPanel2.Controls.Add(this.tableLayoutPanel3, 1, 0); + this.tableLayoutPanel2.Location = new System.Drawing.Point(4, 4); + this.tableLayoutPanel2.Margin = new System.Windows.Forms.Padding(4); + this.tableLayoutPanel2.Name = "tableLayoutPanel2"; + this.tableLayoutPanel2.RowCount = 1; + this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tableLayoutPanel2.Size = new System.Drawing.Size(626, 78); + this.tableLayoutPanel2.TabIndex = 29; + // + // tableLayoutPanel3 + // + this.tableLayoutPanel3.AutoSize = true; + this.tableLayoutPanel3.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.tableLayoutPanel3.ColumnCount = 1; + this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + this.tableLayoutPanel3.Controls.Add(this.AppTitleLabel, 0, 0); + this.tableLayoutPanel3.Controls.Add(this.AppDescriptionLabel, 0, 1); + this.tableLayoutPanel3.Location = new System.Drawing.Point(82, 4); + this.tableLayoutPanel3.Margin = new System.Windows.Forms.Padding(4); + this.tableLayoutPanel3.Name = "tableLayoutPanel3"; + this.tableLayoutPanel3.RowCount = 2; + this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tableLayoutPanel3.Size = new System.Drawing.Size(152, 70); + this.tableLayoutPanel3.TabIndex = 25; + // + // AboutBox + // + this.AutoScaleDimensions = new System.Drawing.SizeF(168F, 168F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; + this.AutoSize = true; + this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.CancelButton = this.buttonOk; + this.ClientSize = new System.Drawing.Size(704, 861); + this.Controls.Add(this.tableLayoutPanel1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Margin = new System.Windows.Forms.Padding(5); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "AboutBox"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "About %title%"; + this.Load += new System.EventHandler(this.AboutBox_Load); + this.Paint += new System.Windows.Forms.PaintEventHandler(this.AboutBox_Paint); + ((System.ComponentModel.ISupportInitialize)(this.ImagePictureBox)).EndInit(); + this.TabPanelDetails.ResumeLayout(false); + this.TabPageApplication.ResumeLayout(false); + this.TabPageAssemblies.ResumeLayout(false); + this.TabPageAssemblyDetails.ResumeLayout(false); + this.tableLayoutPanel1.ResumeLayout(false); + this.tableLayoutPanel1.PerformLayout(); + this.tableLayoutPanel4.ResumeLayout(false); + this.tableLayoutPanel4.PerformLayout(); + this.tableLayoutPanel2.ResumeLayout(false); + this.tableLayoutPanel2.PerformLayout(); + this.tableLayoutPanel3.ResumeLayout(false); + this.tableLayoutPanel3.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button buttonDetails; + private System.Windows.Forms.PictureBox ImagePictureBox; + private System.Windows.Forms.Label AppDateLabel; + private System.Windows.Forms.Button buttonSystemInfo; + private System.Windows.Forms.Label AppCopyrightLabel; + private System.Windows.Forms.Label AppVersionLabel; + private System.Windows.Forms.Label AppDescriptionLabel; + private System.Windows.Forms.GroupBox GroupBox1; + private System.Windows.Forms.Label AppTitleLabel; + private System.Windows.Forms.Button buttonOk; + internal System.Windows.Forms.RichTextBox MoreRichTextBox; + internal System.Windows.Forms.TabControl TabPanelDetails; + internal System.Windows.Forms.TabPage TabPageApplication; + internal System.Windows.Forms.ListView AppInfoListView; + internal System.Windows.Forms.ColumnHeader colKey; + internal System.Windows.Forms.ColumnHeader colValue; + internal System.Windows.Forms.TabPage TabPageAssemblies; + internal System.Windows.Forms.ListView AssemblyInfoListView; + internal System.Windows.Forms.ColumnHeader colAssemblyName; + internal System.Windows.Forms.ColumnHeader colAssemblyVersion; + internal System.Windows.Forms.ColumnHeader colAssemblyBuilt; + internal System.Windows.Forms.ColumnHeader colAssemblyCodeBase; + internal System.Windows.Forms.TabPage TabPageAssemblyDetails; + internal System.Windows.Forms.ListView AssemblyDetailsListView; + internal System.Windows.Forms.ColumnHeader ColumnHeader1; + internal System.Windows.Forms.ColumnHeader ColumnHeader2; + internal System.Windows.Forms.ComboBox AssemblyNamesComboBox; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel3; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel4; + } +} \ No newline at end of file diff --git a/Controls/AboutBox.cs b/Controls/AboutBox.cs new file mode 100644 index 0000000..9be8f61 --- /dev/null +++ b/Controls/AboutBox.cs @@ -0,0 +1,846 @@ +using Microsoft.Win32; +using System; +using System.Collections.Specialized; +using System.Drawing; +using System.IO; +using System.Reflection; +using System.Text.RegularExpressions; +using System.Windows.Forms; + +namespace SystemTrayMenu.Controls +{ + /// + /// Generic, self-contained About Box dialog + /// + /// + /// Jeff Atwood + /// http://www.codinghorror.com + /// converted to C# by Scott Ferguson + /// http://www.forestmoon.com + /// + public partial class AboutBox : Form + { + public AboutBox() + { + InitializeComponent(); + buttonOk.Text = Program.Translate("buttonOk"); + buttonDetails.Text = Program.Translate("buttonDetails"); + buttonSystemInfo.Text = Program.Translate("buttonSystemInfo"); + } + + private bool _IsPainted = false; + private string _EntryAssemblyName; + private string _CallingAssemblyName; + private string _ExecutingAssemblyName; + private Assembly _EntryAssembly; + private NameValueCollection _EntryAssemblyAttribCollection; + private int _MinWindowHeight; + + // + // returns the entry assembly for the current application domain + // + // + // This is usually read-only, but in some weird cases (Smart Client apps) + // you won't have an entry assembly, so you may want to set this manually. + // + public Assembly AppEntryAssembly + { + get + { + return _EntryAssembly; + } + set + { + _EntryAssembly = value; + } + } + + // + // single line of text to show in the application title section of the about box dialog + // + // + // defaults to "%title%" + // %title% = Assembly: AssemblyTitle + // + public string AppTitle + { + get + { + return AppTitleLabel.Text; + } + set + { + AppTitleLabel.Text = value; + } + } + + // + // single line of text to show in the description section of the about box dialog + // + // + // defaults to "%description%" + // %description% = Assembly: AssemblyDescription + // + public string AppDescription + { + get + { + return AppDescriptionLabel.Text; + } + set + { + if (value == "") + { + AppDescriptionLabel.Visible = false; + } + else + { + AppDescriptionLabel.Visible = true; + AppDescriptionLabel.Text = value; + } + } + } + + // + // single line of text to show in the version section of the about dialog + // + // + // defaults to "Version %version%" + // %version% = Assembly: AssemblyVersion + // + public string AppVersion + { + get + { + return AppVersionLabel.Text; + } + set + { + if (value == "") + { + AppVersionLabel.Visible = false; + } + else + { + AppVersionLabel.Visible = true; + AppVersionLabel.Text = value; + } + } + } + + // + // single line of text to show in the copyright section of the about dialog + // + // + // defaults to "Copyright © %year%, %company%" + // %company% = Assembly: AssemblyCompany + // %year% = current 4-digit year + // + public string AppCopyright + { + get + { + return AppCopyrightLabel.Text; + } + set + { + if (value == "") + { + AppCopyrightLabel.Visible = false; + } + else + { + AppCopyrightLabel.Visible = true; + AppCopyrightLabel.Text = value; + } + } + } + + // + // intended for the default 32x32 application icon to appear in the upper left of the about dialog + // + // + // if you open this form using .ShowDialog(Owner), the icon can be derived from the owning form + // + public Image AppImage + { + get + { + return ImagePictureBox.Image; + } + set + { + ImagePictureBox.Image = value; + } + } + + // + // multiple lines of miscellaneous text to show in rich text box + // + // + // defaults to "%product% is %copyright%, %trademark%" + // %product% = Assembly: AssemblyProduct + // %copyright% = Assembly: AssemblyCopyright + // %trademark% = Assembly: AssemblyTrademark + // + public string AppMoreInfo + { + get + { + return MoreRichTextBox.Text; + } + set + { + if (value == null || value == "") + { + MoreRichTextBox.Visible = false; + } + else + { + MoreRichTextBox.Visible = true; + MoreRichTextBox.Text = value; + } + } + } + + // + // determines if the "Details" (advanced assembly details) button is shown + // + public bool AppDetailsButton + { + get + { + return buttonDetails.Visible; + } + set + { + buttonDetails.Visible = value; + } + } + + // + // exception-safe retrieval of LastWriteTime for this assembly. + // + // File.GetLastWriteTime, or DateTime.MaxValue if exception was encountered. + private DateTime AssemblyLastWriteTime(Assembly a) + { + if (a.Location == null || a.Location == "") + return DateTime.MaxValue; + try + { + return File.GetLastWriteTime(a.Location); + } + catch (Exception) + { + return DateTime.MaxValue; + } + } + + // + // returns DateTime this Assembly was last built. Will attempt to calculate from build number, if possible. + // If not, the actual LastWriteTime on the assembly file will be returned. + // + // Assembly to get build date for + // Don't attempt to use the build number to calculate the date + // DateTime this assembly was last built + private DateTime AssemblyBuildDate(Assembly a, bool ForceFileDate) + { + Version AssemblyVersion = a.GetName().Version; + DateTime dt; + + if (ForceFileDate) + { + dt = AssemblyLastWriteTime(a); + } + else + { + dt = DateTime.Parse("01/01/2000").AddDays(AssemblyVersion.Build).AddSeconds(AssemblyVersion.Revision * 2); + if (TimeZone.IsDaylightSavingTime(dt, TimeZone.CurrentTimeZone.GetDaylightChanges(dt.Year))) + { + dt = dt.AddHours(1); + } + if (dt > DateTime.Now || AssemblyVersion.Build < 730 || AssemblyVersion.Revision == 0) + { + dt = AssemblyLastWriteTime(a); + } + } + + return dt; + } + + // + // returns string name / string value pair of all attribs + // for specified assembly + // + // + // note that Assembly* values are pulled from AssemblyInfo file in project folder + // + // Trademark = AssemblyTrademark string + // Debuggable = true + // GUID = 7FDF68D5-8C6F-44C9-B391-117B5AFB5467 + // CLSCompliant = true + // Product = AssemblyProduct string + // Copyright = AssemblyCopyright string + // Company = AssemblyCompany string + // Description = AssemblyDescription string + // Title = AssemblyTitle string + // + private NameValueCollection AssemblyAttribs(Assembly a) + { + string TypeName; + string Name; + string Value; + NameValueCollection nvc = new NameValueCollection(); + Regex r = new Regex(@"(\.Assembly|\.)(?[^.]*)Attribute$", RegexOptions.IgnoreCase); + + foreach (object attrib in a.GetCustomAttributes(false)) + { + TypeName = attrib.GetType().ToString(); + Name = r.Match(TypeName).Groups["Name"].ToString(); + Value = ""; + switch (TypeName) + { + case "System.CLSCompliantAttribute": + Value = ((CLSCompliantAttribute)attrib).IsCompliant.ToString(); break; + case "System.Diagnostics.DebuggableAttribute": + Value = ((System.Diagnostics.DebuggableAttribute)attrib).IsJITTrackingEnabled.ToString(); break; + case "System.Reflection.AssemblyCompanyAttribute": + Value = ((AssemblyCompanyAttribute)attrib).Company.ToString(); break; + case "System.Reflection.AssemblyConfigurationAttribute": + Value = ((AssemblyConfigurationAttribute)attrib).Configuration.ToString(); break; + case "System.Reflection.AssemblyCopyrightAttribute": + Value = ((AssemblyCopyrightAttribute)attrib).Copyright.ToString(); break; + case "System.Reflection.AssemblyDefaultAliasAttribute": + Value = ((AssemblyDefaultAliasAttribute)attrib).DefaultAlias.ToString(); break; + case "System.Reflection.AssemblyDelaySignAttribute": + Value = ((AssemblyDelaySignAttribute)attrib).DelaySign.ToString(); break; + case "System.Reflection.AssemblyDescriptionAttribute": + Value = ((AssemblyDescriptionAttribute)attrib).Description.ToString(); break; + case "System.Reflection.AssemblyInformationalVersionAttribute": + Value = ((AssemblyInformationalVersionAttribute)attrib).InformationalVersion.ToString(); break; + case "System.Reflection.AssemblyKeyFileAttribute": + Value = ((AssemblyKeyFileAttribute)attrib).KeyFile.ToString(); break; + case "System.Reflection.AssemblyProductAttribute": + Value = ((AssemblyProductAttribute)attrib).Product.ToString(); break; + case "System.Reflection.AssemblyTrademarkAttribute": + Value = ((AssemblyTrademarkAttribute)attrib).Trademark.ToString(); break; + case "System.Reflection.AssemblyTitleAttribute": + Value = ((AssemblyTitleAttribute)attrib).Title.ToString(); break; + case "System.Resources.NeutralResourcesLanguageAttribute": + Value = ((System.Resources.NeutralResourcesLanguageAttribute)attrib).CultureName.ToString(); break; + case "System.Resources.SatelliteContractVersionAttribute": + Value = ((System.Resources.SatelliteContractVersionAttribute)attrib).Version.ToString(); break; + case "System.Runtime.InteropServices.ComCompatibleVersionAttribute": + { + System.Runtime.InteropServices.ComCompatibleVersionAttribute x; + x = ((System.Runtime.InteropServices.ComCompatibleVersionAttribute)attrib); + Value = x.MajorVersion + "." + x.MinorVersion + "." + x.RevisionNumber + "." + x.BuildNumber; break; + } + case "System.Runtime.InteropServices.ComVisibleAttribute": + Value = ((System.Runtime.InteropServices.ComVisibleAttribute)attrib).Value.ToString(); break; + case "System.Runtime.InteropServices.GuidAttribute": + Value = ((System.Runtime.InteropServices.GuidAttribute)attrib).Value.ToString(); break; + case "System.Runtime.InteropServices.TypeLibVersionAttribute": + { + System.Runtime.InteropServices.TypeLibVersionAttribute x; + x = ((System.Runtime.InteropServices.TypeLibVersionAttribute)attrib); + Value = x.MajorVersion + "." + x.MinorVersion; break; + } + case "System.Security.AllowPartiallyTrustedCallersAttribute": + Value = "(Present)"; break; + default: + // debug.writeline("** unknown assembly attribute '" + TypeName + "'") + Value = TypeName; break; + } + + if (nvc[Name] == null) + { + nvc.Add(Name, Value); + } + } + + // add some extra values that are not in the AssemblyInfo, but nice to have + // codebase + try + { + nvc.Add("CodeBase", a.CodeBase.Replace("file:///", "")); + } + catch (NotSupportedException) + { + nvc.Add("CodeBase", "(not supported)"); + } + // build date + DateTime dt = AssemblyBuildDate(a, false); + if (dt == DateTime.MaxValue) + { + nvc.Add("BuildDate", "(unknown)"); + } + else + { + nvc.Add("BuildDate", dt.ToString("yyyy-MM-dd hh:mm tt")); + } + // location + try + { + nvc.Add("Location", a.Location); + } + catch (NotSupportedException) + { + nvc.Add("Location", "(not supported)"); + } + // version + try + { + if (a.GetName().Version.Major == 0 && a.GetName().Version.Minor == 0) + { + nvc.Add("Version", "(unknown)"); + } + else + { + nvc.Add("Version", a.GetName().Version.ToString()); + } + } + catch (Exception) + { + nvc.Add("Version", "(unknown)"); + } + + nvc.Add("FullName", a.FullName); + + return nvc; + } + + // + // reads an HKLM Windows Registry key value + // + private string RegistryHklmValue(string KeyName, string SubKeyRef) + { + RegistryKey rk; + try + { + rk = Registry.LocalMachine.OpenSubKey(KeyName); + return (string)rk.GetValue(SubKeyRef, ""); + } + catch (Exception) + { + return ""; + } + } + + // + // launch the MSInfo "system information" application (works on XP, 2003, and Vista) + // + private void ShowSysInfo() + { + string strSysInfoPath = ""; + + strSysInfoPath = RegistryHklmValue(@"SOFTWARE\Microsoft\Shared Tools Location", "MSINFO"); + if (strSysInfoPath == "") + { + strSysInfoPath = RegistryHklmValue(@"SOFTWARE\Microsoft\Shared Tools\MSINFO", "PATH"); + } + + if (strSysInfoPath == "") + { + MessageBox.Show("System Information is unavailable at this time." + + Environment.NewLine + + Environment.NewLine + + "(couldn't find path for Microsoft System Information Tool in the registry.)", + Text, MessageBoxButtons.OK, MessageBoxIcon.Warning); + return; + } + + try + { + System.Diagnostics.Process.Start(strSysInfoPath); + } + catch (Exception) + { + MessageBox.Show("System Information is unavailable at this time." + + Environment.NewLine + + Environment.NewLine + + "(couldn't launch '" + strSysInfoPath + "')", + Text, MessageBoxButtons.OK, MessageBoxIcon.Stop); + } + + } + + // + // populate a listview with the specified key and value strings + // + private void Populate(ListView lvw, string Key, string Value) + { + if (Value == "") + return; + ListViewItem lvi = new ListViewItem(); + lvi.Text = Key; + lvi.SubItems.Add(Value); + lvw.Items.Add(lvi); + } + + // + // populates the Application Information listview + // + private void PopulateAppInfo() + { + AppDomain d = System.AppDomain.CurrentDomain; + Populate(AppInfoListView, "Application Name", d.SetupInformation.ApplicationName); + Populate(AppInfoListView, "Application Base", d.SetupInformation.ApplicationBase); + Populate(AppInfoListView, "Cache Path", d.SetupInformation.CachePath); + Populate(AppInfoListView, "Configuration File", d.SetupInformation.ConfigurationFile); + Populate(AppInfoListView, "Dynamic Base", d.SetupInformation.DynamicBase); + Populate(AppInfoListView, "Friendly Name", d.FriendlyName); + Populate(AppInfoListView, "License File", d.SetupInformation.LicenseFile); + Populate(AppInfoListView, "private Bin Path", d.SetupInformation.PrivateBinPath); + Populate(AppInfoListView, "Shadow Copy Directories", d.SetupInformation.ShadowCopyDirectories); + Populate(AppInfoListView, " ", " "); + Populate(AppInfoListView, "Entry Assembly", _EntryAssemblyName); + Populate(AppInfoListView, "Executing Assembly", _ExecutingAssemblyName); + Populate(AppInfoListView, "Calling Assembly", _CallingAssemblyName); + } + + // + // populate Assembly Information listview with ALL assemblies + // + private void PopulateAssemblies() + { + foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies()) + { + PopulateAssemblySummary(a); + } + AssemblyNamesComboBox.SelectedIndex = AssemblyNamesComboBox.FindStringExact(_EntryAssemblyName); + } + + // + // populate Assembly Information listview with summary view for a specific assembly + // + private void PopulateAssemblySummary(Assembly a) + { + NameValueCollection nvc = AssemblyAttribs(a); + + string strAssemblyName = a.GetName().Name; + + ListViewItem lvi = new ListViewItem(); + lvi.Text = strAssemblyName; + lvi.Tag = strAssemblyName; + if (strAssemblyName == _CallingAssemblyName) + { + lvi.Text += " (calling)"; + } + if (strAssemblyName == _ExecutingAssemblyName) + { + lvi.Text += " (executing)"; + } + if (strAssemblyName == _EntryAssemblyName) + { + lvi.Text += " (entry)"; + } + lvi.SubItems.Add(nvc["version"]); + lvi.SubItems.Add(nvc["builddate"]); + lvi.SubItems.Add(nvc["codebase"]); + //lvi.SubItems.Add(AssemblyVersion(a)) + //lvi.SubItems.Add(AssemblyBuildDatestring(a, true)) + //lvi.SubItems.Add(AssemblyCodeBase(a)) + AssemblyInfoListView.Items.Add(lvi); + AssemblyNamesComboBox.Items.Add(strAssemblyName); + } + + // + // retrieves a cached value from the entry assembly attribute lookup collection + // + private string EntryAssemblyAttrib(string strName) + { + if (_EntryAssemblyAttribCollection[strName] == null) + { + return ""; + } + else + { + return _EntryAssemblyAttribCollection[strName].ToString(); + } + } + + // + // Populate all the form labels with tokenized text + // + private void PopulateLabels() + { + // get entry assembly attribs + _EntryAssemblyAttribCollection = AssemblyAttribs(_EntryAssembly); + + // set icon from parent, if present + if (Owner == null) + { + //ImagePictureBox.Visible = false; + //AppTitleLabel.Left = AppCopyrightLabel.Left; + //AppDescriptionLabel.Left = AppCopyrightLabel.Left; + } + else + { + Icon = Owner.Icon; + ImagePictureBox.Image = Icon.ToBitmap(); + } + // replace all labels and window title + Text = ReplaceTokens(Text); + AppTitleLabel.Text = ReplaceTokens(AppTitleLabel.Text); + if (AppDescriptionLabel.Visible) + { + AppDescriptionLabel.Text = ReplaceTokens(AppDescriptionLabel.Text); + } + if (AppCopyrightLabel.Visible) + { + AppCopyrightLabel.Text = ReplaceTokens(AppCopyrightLabel.Text); + } + if (AppVersionLabel.Visible) + { + AppVersionLabel.Text = ReplaceTokens(AppVersionLabel.Text); + } + if (AppDateLabel.Visible) + { + AppDateLabel.Text = ReplaceTokens(AppDateLabel.Text); + } + if (MoreRichTextBox.Visible) + { + MoreRichTextBox.Text = ReplaceTokens(MoreRichTextBox.Text); + } + } + + // + // perform assemblyinfo to string replacements on labels + // + private string ReplaceTokens(string s) + { + s = s.Replace("%title%", EntryAssemblyAttrib("title")); + s = s.Replace("%copyright%", EntryAssemblyAttrib("copyright")); + s = s.Replace("%description%", EntryAssemblyAttrib("description")); + s = s.Replace("%company%", EntryAssemblyAttrib("company")); + s = s.Replace("%product%", EntryAssemblyAttrib("product")); + s = s.Replace("%trademark%", EntryAssemblyAttrib("trademark")); + s = s.Replace("%year%", DateTime.Now.Year.ToString()); + s = s.Replace("%version%", EntryAssemblyAttrib("version")); + s = s.Replace("%builddate%", EntryAssemblyAttrib("builddate")); + return s; + } + + // + // populate details for a single assembly + // + private void PopulateAssemblyDetails(Assembly a, ListView lvw) + { + lvw.Items.Clear(); + + // this assembly property is only available in framework versions 1.1+ + Populate(lvw, "Image Runtime Version", a.ImageRuntimeVersion); + Populate(lvw, "Loaded from GAC", a.GlobalAssemblyCache.ToString()); + + NameValueCollection nvc = AssemblyAttribs(a); + foreach (string strKey in nvc) + { + Populate(lvw, strKey, nvc[strKey]); + } + } + + // + // matches assembly by Assembly.GetName.Name; returns nothing if no match + // + private Assembly MatchAssemblyByName(string AssemblyName) + { + foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies()) + { + if (a.GetName().Name == AssemblyName) + { + return a; + } + } + return null; + } + + // + // things to do when form is loaded + // + private void AboutBox_Load(object sender, EventArgs e) + { + // if the user didn't provide an assembly, try to guess which one is the entry assembly + if (_EntryAssembly == null) + { + _EntryAssembly = Assembly.GetEntryAssembly(); + } + if (_EntryAssembly == null) + { + _EntryAssembly = Assembly.GetExecutingAssembly(); + } + + _ExecutingAssemblyName = Assembly.GetExecutingAssembly().GetName().Name; + _CallingAssemblyName = Assembly.GetCallingAssembly().GetName().Name; + try + { + // for web hosted apps, GetEntryAssembly = nothing + _EntryAssemblyName = Assembly.GetEntryAssembly().GetName().Name; + } + catch (Exception) + { + } + + _MinWindowHeight = AppCopyrightLabel.Top + AppCopyrightLabel.Height + buttonOk.Height + 30; + + TabPanelDetails.Visible = false; + if (!MoreRichTextBox.Visible) + { + Height = Height - MoreRichTextBox.Height; + } + } + + // + // things to do when form is FIRST painted + // + private void AboutBox_Paint(object sender, PaintEventArgs e) + { + if (!_IsPainted) + { + _IsPainted = true; + Application.DoEvents(); + Cursor.Current = Cursors.WaitCursor; + PopulateLabels(); + Cursor.Current = Cursors.Default; + } + } + + // + // expand about dialog to show additional advanced details + // + private void DetailsButton_Click(object sender, EventArgs e) + { + Cursor.Current = Cursors.WaitCursor; + buttonDetails.Visible = false; + SuspendLayout(); + MaximizeBox = true; + FormBorderStyle = FormBorderStyle.Sizable; + TabPanelDetails.Dock = DockStyle.Fill; + tableLayoutPanel1.Dock = DockStyle.Fill; + this.AutoSize = false; + SizeGripStyle = SizeGripStyle.Show; + Size = new Size(580, Size.Height); + MoreRichTextBox.Visible = false; + TabPanelDetails.Visible = true; + buttonSystemInfo.Visible = true; + PopulateAssemblies(); + PopulateAppInfo(); + CenterToParent(); + ResumeLayout(); + Cursor.Current = Cursors.Default; + } + + // + // for detailed system info, launch the external Microsoft system info app + // + private void SysInfoButton_Click(object sender, EventArgs e) + { + ShowSysInfo(); + } + + // + // if an assembly is double-clicked, go to the detail page for that assembly + // + private void AssemblyInfoListView_DoubleClick(object sender, EventArgs e) + { + string strAssemblyName; + if (AssemblyInfoListView.SelectedItems.Count > 0) + { + strAssemblyName = Convert.ToString(AssemblyInfoListView.SelectedItems[0].Tag); + AssemblyNamesComboBox.SelectedIndex = AssemblyNamesComboBox.FindStringExact(strAssemblyName); + TabPanelDetails.SelectedTab = TabPageAssemblyDetails; + } + } + + // + // if a new assembly is selected from the combo box, show details for that assembly + // + private void AssemblyNamesComboBox_SelectedIndexChanged(object sender, EventArgs e) + { + string strAssemblyName = Convert.ToString(AssemblyNamesComboBox.SelectedItem); + PopulateAssemblyDetails(MatchAssemblyByName(strAssemblyName), AssemblyDetailsListView); + } + + // + // sort the assembly list by column + // + private void AssemblyInfoListView_ColumnClick(object sender, ColumnClickEventArgs e) + { + int intTargetCol = e.Column + 1; + + if (AssemblyInfoListView.Tag != null) + { + if (Math.Abs(Convert.ToInt32(AssemblyInfoListView.Tag)) == intTargetCol) + { + intTargetCol = -Convert.ToInt32(AssemblyInfoListView.Tag); + } + } + AssemblyInfoListView.Tag = intTargetCol; + AssemblyInfoListView.ListViewItemSorter = new ListViewItemComparer(intTargetCol, true); + } + + // + // launch any http:// or mailto: links clicked in the body of the rich text box + // + private void MoreRichTextBox_LinkClicked(object sender, LinkClickedEventArgs e) + { + try + { + System.Diagnostics.Process.Start(e.LinkText); + } + catch (Exception) + { + } + } + + // + // things to do when the selected tab is changed + // + class ListViewItemComparer : System.Collections.IComparer + { + private int _intCol; + private bool _IsAscending = true; + + public ListViewItemComparer() + { + _intCol = 0; + _IsAscending = true; + } + + public ListViewItemComparer(int column, bool ascending) + { + if (column < 0) + { + _IsAscending = false; + } + else + { + _IsAscending = ascending; + } + _intCol = Math.Abs(column) - 1; + } + + public int Compare(object x, object y) + { + int intResult = + string.Compare(((ListViewItem)x).SubItems[_intCol].Text, ((ListViewItem)y).SubItems[_intCol].Text); + + if (_IsAscending) + { + return intResult; + } + else + { + return -intResult; + } + } + } + + private void TabPanelDetails_SelectedIndexChanged(object sender, EventArgs e) + { + if (TabPanelDetails.SelectedTab == TabPageAssemblyDetails) + AssemblyNamesComboBox.Focus(); + } + + } +} \ No newline at end of file diff --git a/Controls/AboutBox.resx b/Controls/AboutBox.resx new file mode 100644 index 0000000..a04fa62 --- /dev/null +++ b/Controls/AboutBox.resx @@ -0,0 +1,377 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + AAABAAMAEBAAAAEAIABoBAAANgAAACAgAAABACAAqBAAAJ4EAAAwMAAAAQAgAKglAABGFQAAKAAAABAA + AAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAJAAAAcwEB + AXsBAQF7AQEBewEBAXsBAQF7AQEBewEBAXsBAQF7AQEBewEBAXsAAABzAAAACQAAAAEAAAABAAAACQAA + AHMBAQF7AQEBewEBAXsBAQF7AQEBewEBAXsBAQF7AQEBewEBAXsBAQF7AAAAcwAAAAkAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAACQAAAHUAAAB7AAAAewAAAHsAAAB7AAAAewAAAHsAAAB7AAAAewAAAHsAAAB7AAAAdQAA + AAkAAAABAAAAAQAAAAkAAABzAAAAewAAAHsAAAB7AAAAewAAAHsAAAB7AAAAewAAAHsAAAB7AAAAewAA + AHMAAAAJAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAkAAABzAQEBewEBAXsBAQF7AQEBewEBAXsBAQF7AQEBewEB + AXsBAQF7AQEBewAAAHMAAAAJAAAAAQAAAAEAAAAJAAAAcwEBAXsBAQF7AQEBewEBAXsBAQF7AQEBewEB + AXsBAQF7AQEBewEBAXsAAABzAAAACQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAAAABAAAAAAQAgAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAHwAAANkBAQH1AQEB9QEBAfUBAQH1AQEB9QEB + AfUBAQH1AQEB9QEBAfUBAQH1AQEB9QEBAfUBAQH1AQEB9QEBAfUBAQH1AQEB9QEBAfUBAQH1AQEB9QEB + AfUBAQH1AAAA2QAAAB8AAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAfAAAA2QEBAfUBAQH1AQEB9QEB + AfUBAQH1AQEB9QEBAfUBAQH1AQEB9QEBAfUBAQH1AQEB9QEBAfUBAQH1AQEB9QEBAfUBAQH1AQEB9QEB + AfUBAQH1AQEB9QEBAfUAAADZAAAAHwAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAFAAAAIQAAACUAAAAlAAAAJQAAACUAAAAlAAAAJQAA + ACUAAAAlAAAAJQAAACUAAAAlAAAAJQAAACUAAAAlAAAAJQAAACUAAAAlAAAAJQAAACUAAAAlAAAAJQAA + ACUAAAAhAAAABQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQEBARsAAAC5AAAA0QAAANEAAADRAAAA0QAA + ANEAAADRAAAA0QAAANEAAADRAAAA0QAAANEAAADRAAAA0QAAANEAAADRAAAA0QAAANEAAADRAAAA0QAA + ANEAAADRAAAA0QAAALkBAQEbAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAQEBGwEBAbkAAADRAAAA0QAA + ANEAAADRAAAA0QAAANEAAADRAAAA0QAAANEAAADRAAAA0QAAANEAAADRAAAA0QAAANEAAADRAAAA0QAA + ANEAAADRAAAA0QAAANEAAADRAQEBuQEBARsAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAFAQEBIQEB + ASUBAQElAQEBJQEBASUBAQElAQEBJQEBASUBAQElAQEBJQEBASUBAQElAQEBJQEBASUBAQElAQEBJQEB + ASUBAQElAQEBJQEBASUBAQElAQEBJQEBASUBAQEhAAAABQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAfAAAA2QEBAfUBAQH1AQEB9QEB + AfUBAQH1AQEB9QEBAfUBAQH1AQEB9QEBAfUBAQH1AQEB9QEBAfUBAQH1AQEB9QEBAfUBAQH1AQEB9QEB + AfUBAQH1AQEB9QEBAfUAAADZAAAAHwAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAB8AAADZAQEB9QEB + AfUBAQH1AQEB9QEBAfUBAQH1AQEB9QEBAfUBAQH1AQEB9QEBAfUBAQH1AQEB9QEBAfUBAQH1AQEB9QEB + AfUBAQH1AQEB9QEBAfUBAQH1AQEB9QAAANkAAAAfAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAwAAAAYAAAAAEA + IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAABUAAABdAQEBcQAA + AHEBAQFxAQEBcQAAAHEBAQFxAQEBcQAAAHEBAQFxAAAAcQAAAHEAAABxAQEBcQAAAHEBAQFxAAAAcQEB + AXEAAABxAAAAcQEBAXEAAABxAQEBcQAAAHEBAQFxAQEBcQAAAHEAAABxAQEBcQAAAHEAAABxAQEBcQAA + AHEAAABxAQEBcQEBAV0AAAAVAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQEB + AS8AAADTAAAA/wAAAP8AAAD/AAAA/wAAAP8BAQH/AAAA/wAAAP8AAAD/AQEB/wAAAP8AAAD/AQEB/wAA + AP8AAAD/AQEB/wAAAP8AAAD/AAAA/wAAAP8AAAD/AQEB/wAAAP8BAQH/AAAA/wEBAf8AAAD/AAAA/wEB + Af8BAQH/AAAA/wEBAf8BAQH/AAAA/wAAANMAAAAvAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQEBAS8AAADTAAAA/wEBAf8AAAD/AAAA/wEBAf8BAQH/AAAA/wAAAP8AAAD/AQEB/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AQEB/wAAAP8AAAD/AQEB/wAAAP8AAAD/AQEB/wAAAP8AAAD/AAAA/wEB + Af8AAAD/AAAA/wEBAf8BAQH/AAAA/wEBAf8BAQH/AAAA/wAAANMAAAAvAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAABUAAABdAQEBcQEBAXEBAQFxAQEBcQEBAXEBAQFxAQEBcQEB + AXEBAQFxAAAAcQAAAHEAAABxAQEBcQAAAHEBAQFxAAAAcQEBAXEAAABxAAAAcQEBAXEAAABxAQEBcQAA + AHEBAQFxAQEBcQAAAHEAAABxAQEBcQAAAHEAAABxAQEBcQAAAHEAAABxAQEBcQEBAV0AAAAVAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAABcAAABhAQEBdwAAAHcBAQF3AAAAdwEBAXcBAQF3AAAAdwEBAXcAAAB3AAAAdwEB + AXcAAAB3AQEBdwAAAHcAAAB3AAAAdwEBAXcBAQF3AAAAdwAAAHcAAAB3AQEBdwAAAHcBAQF3AQEBdwAA + AHcBAQF3AQEBdwAAAHcBAQF3AQEBdwAAAHcBAQF3AQEBdwAAAGEAAAAXAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAC8AAADPAQEB+QEBAfkAAAD5AAAA+QEBAfkBAQH5AAAA+QAA + APkAAAD5AAAA+QAAAPkAAAD5AAAA+QEBAfkAAAD5AAAA+QAAAPkAAAD5AAAA+QAAAPkBAQH5AAAA+QAA + APkAAAD5AAAA+QAAAPkAAAD5AAAA+QAAAPkAAAD5AAAA+QAAAPkAAAD5AAAA+QEBAc8AAAAvAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAC8AAADPAAAA+QAAAPkAAAD5AQEB+QAA + APkAAAD5AQEB+QEBAfkAAAD5AQEB+QAAAPkAAAD5AAAA+QEBAfkAAAD5AAAA+QEBAfkBAQH5AAAA+QEB + AfkBAQH5AAAA+QEBAfkAAAD5AAAA+QEBAfkAAAD5AAAA+QEBAfkBAQH5AQEB+QAAAPkBAQH5AQEB+QAA + AM8AAAAvAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQEBARcAAABhAQEBdQEB + AXUBAQF1AAAAdQEBAXUBAQF1AAAAdQEBAXUAAAB1AAAAdQAAAHUAAAB1AAAAdQAAAHUAAAB1AAAAdQAA + AHUAAAB1AQEBdQAAAHUAAAB1AAAAdQAAAHUAAAB1AAAAdQAAAHUAAAB1AAAAdQAAAHUAAAB1AAAAdQAA + AHUAAAB1AAAAdQEBAWEBAQEXAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAABUBAQFdAQEBcQAAAHEBAQFxAQEBcQAA + AHEAAABxAQEBcQEBAXEBAQFxAAAAcQAAAHEAAABxAQEBcQAAAHEBAQFxAAAAcQEBAXEBAQFxAAAAcQEB + AXEAAABxAQEBcQAAAHEBAQFxAAAAcQAAAHEBAQFxAQEBcQEBAXEBAQFxAQEBcQEBAXEAAABxAAAAcQEB + AV0AAAAVAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAC8BAQHTAAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8BAQH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAANMAAAAvAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AC8AAADTAQEB/wAAAP8AAAD/AAAA/wEBAf8BAQH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AQEB/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wEBAdMAAAAvAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAABUBAQFdAQEBcQAAAHEBAQFxAQEBcQAAAHEAAABxAQEBcQEBAXEBAQFxAAAAcQAA + AHEAAABxAQEBcQAAAHEBAQFxAAAAcQEBAXEBAQFxAAAAcQEBAXEAAABxAQEBcQAAAHEBAQFxAAAAcQAA + AHEBAQFxAQEBcQEBAXEBAQFxAQEBcQEBAXEAAABxAAAAcQEBAV0AAAAVAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + + + \ No newline at end of file diff --git a/Controls/AppContextMenu.cs b/Controls/AppContextMenu.cs new file mode 100644 index 0000000..369c74b --- /dev/null +++ b/Controls/AppContextMenu.cs @@ -0,0 +1,258 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Drawing.Imaging; +using System.Globalization; +using System.Linq; +using System.Reflection; +using System.Windows.Forms; + +namespace SystemTrayMenu.Controls +{ + class AppContextMenu + { + public event EventHandler ClickedChangeFolder; + public event EventHandler ClickedOpenLog; + public event EventHandler ClickedRestart; + public event EventHandler ClickedExit; + + public ContextMenuStrip Create() + { + ContextMenuStrip menu = new ContextMenuStrip(); + menu.BackColor = SystemColors.Control; + ToolStripMenuItem changeFolder = new ToolStripMenuItem(); + changeFolder.Text = Program.Translate("Folder"); + changeFolder.Click += ChangeFolder_Click; + void ChangeFolder_Click(object sender, EventArgs e) + { + ClickedChangeFolder.Invoke(); + } + menu.Items.Add(changeFolder); + + ToolStripMenuItem changeLanguage = new ToolStripMenuItem() + { + Name = "changeLanguage", + Text = Program.Translate("Language") + }; + foreach (CultureInfo cultureInfo in + GetCultureList(CultureTypes.AllCultures)) + { + if (Program.Languages.Contains(cultureInfo.Name)) + { + ToolStripItem language = changeLanguage.DropDownItems. + Add(Program.Translate(cultureInfo.EnglishName)); + language.Click += Language_Click; + void Language_Click(object sender, EventArgs e) + { + string twoLetter = cultureInfo.Name.Substring(0, 2); + Properties.Settings.Default.CurrentCultureInfoName = + twoLetter; + Properties.Settings.Default.Save(); + ClickedRestart.Invoke(); + } + if (cultureInfo.Name == Properties.Settings.Default. + CurrentCultureInfoName) + { + language.Image = Properties.Resources.Selected; + language.ImageScaling = ToolStripItemImageScaling.None; + language.Image = ResizeImage(language.Image); + } + } + } + menu.Items.Add(changeLanguage); + + ToolStripMenuItem autostart = new ToolStripMenuItem(); + autostart.Text = Program.Translate("Autostart"); + //autostart.Image.HorizontalResolution.wi.c.sc.Select .ImageScaling = ToolStripItemImageScaling.None; + if (Properties.Settings.Default.IsAutostartActivated) + { + autostart.Image = Properties.Resources.Selected; + } + else + { + autostart.Image = Properties.Resources.NotSelected; + } + autostart.ImageScaling = ToolStripItemImageScaling.None; + autostart.Image = ResizeImage(autostart.Image); + autostart.Click += Autostart_Click; + void Autostart_Click(object sender, EventArgs e) + { + if (Properties.Settings.Default.IsAutostartActivated) + { + Microsoft.Win32.RegistryKey key = + Microsoft.Win32.Registry.CurrentUser.OpenSubKey( + @"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", + true); + key.DeleteValue("SystemTrayMenu", false); + Properties.Settings.Default.IsAutostartActivated = false; + } + else + { + Microsoft.Win32.RegistryKey key = + Microsoft.Win32.Registry.CurrentUser.OpenSubKey( + @"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", + true); + key.SetValue( + Assembly.GetExecutingAssembly().GetName().Name, + Assembly.GetEntryAssembly().Location); + Properties.Settings.Default.IsAutostartActivated = true; + } + Properties.Settings.Default.Save(); + ClickedRestart.Invoke(); + } + menu.Items.Add(autostart); + + ToolStripMenuItem hotKey = new ToolStripMenuItem(); + string hotKeyText = + $"{Program.Translate("CTRL")} + " + + $"{Program.Translate("ALT")} + "; + + hotKey.ImageScaling = ToolStripItemImageScaling.SizeToFit; + if (string.IsNullOrEmpty(Properties.Settings.Default.HotKey)) + { + hotKey.Image = Properties.Resources.NotSelected; + hotKey.Text = hotKeyText + "? "; + } + else + { + hotKey.Image = Properties.Resources.Selected; + hotKey.Text = hotKeyText + + $"{Properties.Settings.Default.HotKey}"; + } + hotKey.ImageScaling = ToolStripItemImageScaling.None; + hotKey.Image = ResizeImage(hotKey.Image); + hotKey.Click += HotKey_Click; + void HotKey_Click(object sender, EventArgs e) + { + AskHotKeyForm askHotKey = new AskHotKeyForm(); + if (askHotKey.ShowDialog() == DialogResult.OK) + { + Properties.Settings.Default.HotKey = askHotKey.NewHotKey; + Properties.Settings.Default.Save(); + ClickedRestart?.Invoke(); + } + } + menu.Items.Add(hotKey); + + ToolStripSeparator seperator = new ToolStripSeparator(); + seperator.BackColor = SystemColors.Control; + menu.Items.Add(seperator); + + ToolStripMenuItem openLog = new ToolStripMenuItem(); + openLog.Text = Program.Translate("Log File"); + openLog.Click += OpenLog_Click; + void OpenLog_Click(object sender, EventArgs e) + { + ClickedOpenLog.Invoke(); + } + menu.Items.Add(openLog); + + menu.Items.Add(new ToolStripSeparator()); + + ToolStripMenuItem about = new ToolStripMenuItem(); + about.Text = Program.Translate("About"); + about.Click += About_Click; + void About_Click(object sender, EventArgs e) + { + FileVersionInfo versionInfo = FileVersionInfo.GetVersionInfo( + Assembly.GetEntryAssembly().Location); + AboutBox ab = new AboutBox(); + ab.AppTitle = versionInfo.ProductName; + ab.AppDescription = versionInfo.FileDescription; + ab.AppVersion = $"Version {versionInfo.FileVersion}"; + ab.AppCopyright = versionInfo.LegalCopyright; + ab.AppMoreInfo = "SystemTrayMenu - An improved Windows Toolbar"; + ab.AppMoreInfo += Environment.NewLine; + ab.AppMoreInfo += "Code from © 2019, TAMAHO, All Rights Reserved."; + ab.AppMoreInfo += Environment.NewLine; + ab.AppMoreInfo += "Developer:"; + ab.AppMoreInfo += Environment.NewLine; + ab.AppMoreInfo += "Markus Hofknecht (mailto:Markus@Hofknecht.eu)"; + ab.AppMoreInfo += Environment.NewLine; + ab.AppMoreInfo += "Tanja Kauth (Tanja@Hofknecht.eu)"; + ab.AppMoreInfo += Environment.NewLine; + ab.AppMoreInfo += Environment.NewLine; + ab.AppMoreInfo += "http://www.hofknecht.eu/systemtraymenu/" + Environment.NewLine; + ab.AppDetailsButton = true; + ab.ShowDialog(); + } + menu.Items.Add(about); + + menu.Items.Add(new ToolStripSeparator()); + + ToolStripMenuItem restart = new ToolStripMenuItem(); + restart.Text = Program.Translate("Restart"); + restart.Click += Restart_Click; + void Restart_Click(object sender, EventArgs e) + { + ClickedRestart.Invoke(); + } + menu.Items.Add(restart); + + ToolStripMenuItem exit = new ToolStripMenuItem(); + exit.Text = Program.Translate("Exit"); + exit.Click += Exit_Click; + void Exit_Click(object sender, EventArgs e) + { + ClickedExit.Invoke(); + } + menu.Items.Add(exit); + + return menu; + } + + /// + /// https://www.codeproject.com/Tips/744914/ + /// Sorted-list-of-available-cultures-in-NET + /// + public IEnumerable GetCultureList( + CultureTypes cultureType = CultureTypes.SpecificCultures) + { + var cultureList = CultureInfo.GetCultures(cultureType).ToList(); + cultureList.Sort((p1, p2) => string.Compare( + p1.NativeName, p2.NativeName, true)); + return cultureList; + } + + /// + /// Resize the image to the specified width and height. + /// + /// The image to resize. + /// The width to resize to. + /// The height to resize to. + /// The resized image. + public static Bitmap ResizeImage(Image image) + { + int length = (int)Math.Round( + 16 * Program.ScalingFactor, 0, + MidpointRounding.AwayFromZero); + return ResizeImage(image, length, length); + } + public static Bitmap ResizeImage(Image image, int width, int height) + { + var destRect = new Rectangle(0, 0, width, height); + var destImage = new Bitmap(width, height); + + destImage.SetResolution(image.HorizontalResolution, image.VerticalResolution); + + using (var graphics = Graphics.FromImage(destImage)) + { + graphics.CompositingMode = CompositingMode.SourceCopy; + graphics.CompositingQuality = CompositingQuality.HighQuality; + graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; + graphics.SmoothingMode = SmoothingMode.HighQuality; + graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; + + using (var wrapMode = new ImageAttributes()) + { + wrapMode.SetWrapMode(WrapMode.TileFlipXY); + graphics.DrawImage(image, destRect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, wrapMode); + } + } + + return destImage; + } + } +} \ No newline at end of file diff --git a/Controls/AppNotifyIcon.cs b/Controls/AppNotifyIcon.cs new file mode 100644 index 0000000..b450968 --- /dev/null +++ b/Controls/AppNotifyIcon.cs @@ -0,0 +1,126 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Windows.Forms; +using SystemTrayMenu.Controls; +using R = SystemTrayMenu.Properties.Resources; +using Timer = System.Windows.Forms.Timer; + +namespace SystemTrayMenu +{ + class MenuNotifyIcon : IDisposable + { + public event EventHandler HandleClick; + public event EventHandler ChangeFolder; + public event EventHandler OpenLog; + public event EventHandler Restart; + public event EventHandler Exit; + + NotifyIcon notifyIcon = new NotifyIcon(); + private DateTime timeLoadingStart; + int threadsLoading = 0; + Timer load = new Timer(); + int loadCount = 0, indexLoad = 0; + List bitmapsLoading = new List() { R.L010, R.L020, R.L030, + R.L040, R.L050, R.L060, R.L070, R.L080, R.L090, R.L100, R.L110, R.L120, + R.L130, R.L140, R.L150, R.L160, R.L170, R.L180}; + + public MenuNotifyIcon() + { + indexLoad = bitmapsLoading.Count; + notifyIcon.Icon = bitmapsLoading.First(); + load.Tick += Load_Tick; + load.Interval = MenuDefines.IntervalLoad; + + notifyIcon.Text = "SystemTrayMenu"; + notifyIcon.Visible = true; + notifyIcon.Icon = R.SystemTrayMenu; + AppContextMenu contextMenus = new AppContextMenu(); + contextMenus.ClickedChangeFolder += ClickedChangeFolder; + void ClickedChangeFolder() + { + ChangeFolder.Invoke(); + } + + contextMenus.ClickedOpenLog += ClickedOpenLog; + void ClickedOpenLog() + { + OpenLog.Invoke(); + } + + contextMenus.ClickedRestart += ClickedRestart; + void ClickedRestart() + { + Restart.Invoke(); + } + + contextMenus.ClickedExit += ClickedExit; + void ClickedExit() + { + Exit.Invoke(); + } + + notifyIcon.ContextMenuStrip = contextMenus.Create(); + notifyIcon.MouseClick += NotifyIcon_MouseClick; + void NotifyIcon_MouseClick(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Left) + { + HandleClick(); + } + } + + notifyIcon.MouseDoubleClick += NotifyIcon_MouseDoubleClick; + void NotifyIcon_MouseDoubleClick(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Left) + { + HandleClick(); + } + } + } + + public void Dispose() + { + notifyIcon.Icon = null; + notifyIcon.Dispose(); + } + + public void LoadingStart() + { + timeLoadingStart = DateTime.Now; + threadsLoading++; + load.Start(); + } + + public void LoadingStop() + { + threadsLoading--; + } + public void LoadWait() + { + notifyIcon.Icon = bitmapsLoading[loadCount++ % indexLoad]; + } + public void LoadStop() + { + notifyIcon.Icon = R.SystemTrayMenu; + } + + private void Load_Tick(object sender, EventArgs e) + { + if (threadsLoading > 0) + { + if (DateTime.Now - timeLoadingStart > new TimeSpan(0, 0, 0, 0, 500)) + { + notifyIcon.Icon = bitmapsLoading[loadCount++ % indexLoad]; + } + } + else + { + notifyIcon.Icon = R.SystemTrayMenu; + load.Stop(); + } + } + } +} \ No newline at end of file diff --git a/Controls/AskHotKeyForm.Designer.cs b/Controls/AskHotKeyForm.Designer.cs new file mode 100644 index 0000000..c76199f --- /dev/null +++ b/Controls/AskHotKeyForm.Designer.cs @@ -0,0 +1,139 @@ +namespace SystemTrayMenu.Controls +{ + partial class AskHotKeyForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AskHotKeyForm)); + this.tableLayoutPanelMain = new System.Windows.Forms.TableLayoutPanel(); + this.labelText = new System.Windows.Forms.Label(); + this.tableLayoutPanelBottom = new System.Windows.Forms.TableLayoutPanel(); + this.buttonOk = new System.Windows.Forms.Button(); + this.labelCaption = new System.Windows.Forms.Label(); + this.tableLayoutPanelMain.SuspendLayout(); + this.tableLayoutPanelBottom.SuspendLayout(); + this.SuspendLayout(); + // + // tableLayoutPanelMain + // + this.tableLayoutPanelMain.AutoSize = true; + this.tableLayoutPanelMain.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.tableLayoutPanelMain.ColumnCount = 1; + this.tableLayoutPanelMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanelMain.Controls.Add(this.labelText, 0, 1); + this.tableLayoutPanelMain.Controls.Add(this.tableLayoutPanelBottom, 0, 2); + this.tableLayoutPanelMain.Controls.Add(this.labelCaption, 0, 0); + this.tableLayoutPanelMain.Location = new System.Drawing.Point(12, 12); + this.tableLayoutPanelMain.Name = "tableLayoutPanelMain"; + this.tableLayoutPanelMain.RowCount = 3; + this.tableLayoutPanelMain.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tableLayoutPanelMain.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tableLayoutPanelMain.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tableLayoutPanelMain.Size = new System.Drawing.Size(121, 77); + this.tableLayoutPanelMain.TabIndex = 0; + // + // labelText + // + this.labelText.AutoSize = true; + this.labelText.Location = new System.Drawing.Point(3, 21); + this.labelText.Margin = new System.Windows.Forms.Padding(3, 8, 3, 8); + this.labelText.Name = "labelText"; + this.labelText.Size = new System.Drawing.Size(67, 13); + this.labelText.TabIndex = 1; + this.labelText.Text = "Ctrl + Alt + ?)"; + // + // tableLayoutPanelBottom + // + this.tableLayoutPanelBottom.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); + this.tableLayoutPanelBottom.AutoSize = true; + this.tableLayoutPanelBottom.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.tableLayoutPanelBottom.ColumnCount = 3; + this.tableLayoutPanelBottom.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanelBottom.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + this.tableLayoutPanelBottom.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanelBottom.Controls.Add(this.buttonOk, 1, 0); + this.tableLayoutPanelBottom.Location = new System.Drawing.Point(3, 45); + this.tableLayoutPanelBottom.Name = "tableLayoutPanelBottom"; + this.tableLayoutPanelBottom.RowCount = 1; + this.tableLayoutPanelBottom.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tableLayoutPanelBottom.Size = new System.Drawing.Size(115, 29); + this.tableLayoutPanelBottom.TabIndex = 1; + // + // buttonOk + // + this.buttonOk.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonOk.Location = new System.Drawing.Point(20, 3); + this.buttonOk.Name = "buttonOk"; + this.buttonOk.Size = new System.Drawing.Size(75, 23); + this.buttonOk.TabIndex = 2; + this.buttonOk.Text = "OK"; + this.buttonOk.UseVisualStyleBackColor = true; + this.buttonOk.Click += new System.EventHandler(this.ButtonOk_Click); + // + // labelCaption + // + this.labelCaption.AutoSize = true; + this.labelCaption.Location = new System.Drawing.Point(3, 0); + this.labelCaption.MaximumSize = new System.Drawing.Size(217, 0); + this.labelCaption.Name = "labelCaption"; + this.labelCaption.Size = new System.Drawing.Size(115, 13); + this.labelCaption.TabIndex = 0; + this.labelCaption.Text = "Shortcut key (e.g. F12)"; + // + // AskHotKeyForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; + this.AutoSize = true; + this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.ClientSize = new System.Drawing.Size(302, 221); + this.Controls.Add(this.tableLayoutPanelMain); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "AskHotKeyForm"; + this.Padding = new System.Windows.Forms.Padding(0, 0, 10, 0); + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "AskHotKeyForm"; + this.tableLayoutPanelMain.ResumeLayout(false); + this.tableLayoutPanelMain.PerformLayout(); + this.tableLayoutPanelBottom.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TableLayoutPanel tableLayoutPanelMain; + private System.Windows.Forms.Button buttonOk; + private System.Windows.Forms.Label labelCaption; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanelBottom; + private System.Windows.Forms.Label labelText; + } +} \ No newline at end of file diff --git a/Controls/AskHotKeyForm.cs b/Controls/AskHotKeyForm.cs new file mode 100644 index 0000000..cc9d246 --- /dev/null +++ b/Controls/AskHotKeyForm.cs @@ -0,0 +1,121 @@ +using System; +using System.Windows.Forms; + +namespace SystemTrayMenu.Controls +{ + public partial class AskHotKeyForm : Form + { + public string NewHotKey; + + public AskHotKeyForm() + { + InitializeComponent(); + this.Text = Program.Translate("Shortcut key"); + this.labelCaption.Text = $"{Program.Translate("Shortcut key")} " + + $"{Program.Translate("(e.g. F12)")}"; + this.labelText.Text = + Program.Translate("CTRL") + " + " + + Program.Translate("ALT") + " + ?"; + + this.buttonOk.Text = Program.Translate("buttonOk"); + } + + private void ButtonOk_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.None; + this.Close(); + } + + protected override bool ProcessCmdKey(ref Message msg, Keys keys) + { + switch (keys) + { + case Keys.Space: + case Keys.D0: + case Keys.D1: + case Keys.D2: + case Keys.D3: + case Keys.D4: + case Keys.D5: + case Keys.D6: + case Keys.D7: + case Keys.D8: + case Keys.D9: + case Keys.A: + case Keys.B: + case Keys.C: + case Keys.D: + case Keys.E: + case Keys.F: + case Keys.G: + case Keys.H: + case Keys.I: + case Keys.J: + case Keys.K: + case Keys.L: + case Keys.M: + case Keys.N: + case Keys.O: + case Keys.P: + case Keys.Q: + case Keys.R: + case Keys.S: + case Keys.T: + case Keys.U: + case Keys.V: + case Keys.W: + case Keys.X: + case Keys.Y: + case Keys.Z: + case Keys.NumPad0: + case Keys.NumPad1: + case Keys.NumPad2: + case Keys.NumPad3: + case Keys.NumPad4: + case Keys.NumPad5: + case Keys.NumPad6: + case Keys.NumPad7: + case Keys.NumPad8: + case Keys.NumPad9: + case Keys.F1: + case Keys.F2: + case Keys.F3: + case Keys.F4: + case Keys.F5: + case Keys.F6: + case Keys.F7: + case Keys.F8: + case Keys.F9: + case Keys.F10: + case Keys.F11: + case Keys.F12: + case Keys.F13: + case Keys.F14: + case Keys.F15: + case Keys.F16: + case Keys.F17: + case Keys.F18: + case Keys.F19: + case Keys.F20: + case Keys.F21: + case Keys.F22: + case Keys.F23: + case Keys.F24: + NewHotKey = keys.ToString(); + this.DialogResult = DialogResult.OK; + this.Close(); + break; + case Keys.Back: + case Keys.Delete: + NewHotKey = string.Empty; + this.DialogResult = DialogResult.OK; + this.Close(); + break; + default: + break; + } + + return base.ProcessCmdKey(ref msg, keys); + } + } +} diff --git a/Controls/AskHotKeyForm.resx b/Controls/AskHotKeyForm.resx new file mode 100644 index 0000000..a04fa62 --- /dev/null +++ b/Controls/AskHotKeyForm.resx @@ -0,0 +1,377 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + AAABAAMAEBAAAAEAIABoBAAANgAAACAgAAABACAAqBAAAJ4EAAAwMAAAAQAgAKglAABGFQAAKAAAABAA + AAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAJAAAAcwEB + AXsBAQF7AQEBewEBAXsBAQF7AQEBewEBAXsBAQF7AQEBewEBAXsAAABzAAAACQAAAAEAAAABAAAACQAA + AHMBAQF7AQEBewEBAXsBAQF7AQEBewEBAXsBAQF7AQEBewEBAXsBAQF7AAAAcwAAAAkAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAACQAAAHUAAAB7AAAAewAAAHsAAAB7AAAAewAAAHsAAAB7AAAAewAAAHsAAAB7AAAAdQAA + AAkAAAABAAAAAQAAAAkAAABzAAAAewAAAHsAAAB7AAAAewAAAHsAAAB7AAAAewAAAHsAAAB7AAAAewAA + AHMAAAAJAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAkAAABzAQEBewEBAXsBAQF7AQEBewEBAXsBAQF7AQEBewEB + AXsBAQF7AQEBewAAAHMAAAAJAAAAAQAAAAEAAAAJAAAAcwEBAXsBAQF7AQEBewEBAXsBAQF7AQEBewEB + AXsBAQF7AQEBewEBAXsAAABzAAAACQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAAAABAAAAAAQAgAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAHwAAANkBAQH1AQEB9QEBAfUBAQH1AQEB9QEB + AfUBAQH1AQEB9QEBAfUBAQH1AQEB9QEBAfUBAQH1AQEB9QEBAfUBAQH1AQEB9QEBAfUBAQH1AQEB9QEB + AfUBAQH1AAAA2QAAAB8AAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAfAAAA2QEBAfUBAQH1AQEB9QEB + AfUBAQH1AQEB9QEBAfUBAQH1AQEB9QEBAfUBAQH1AQEB9QEBAfUBAQH1AQEB9QEBAfUBAQH1AQEB9QEB + AfUBAQH1AQEB9QEBAfUAAADZAAAAHwAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAFAAAAIQAAACUAAAAlAAAAJQAAACUAAAAlAAAAJQAA + ACUAAAAlAAAAJQAAACUAAAAlAAAAJQAAACUAAAAlAAAAJQAAACUAAAAlAAAAJQAAACUAAAAlAAAAJQAA + ACUAAAAhAAAABQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQEBARsAAAC5AAAA0QAAANEAAADRAAAA0QAA + ANEAAADRAAAA0QAAANEAAADRAAAA0QAAANEAAADRAAAA0QAAANEAAADRAAAA0QAAANEAAADRAAAA0QAA + ANEAAADRAAAA0QAAALkBAQEbAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAQEBGwEBAbkAAADRAAAA0QAA + ANEAAADRAAAA0QAAANEAAADRAAAA0QAAANEAAADRAAAA0QAAANEAAADRAAAA0QAAANEAAADRAAAA0QAA + ANEAAADRAAAA0QAAANEAAADRAQEBuQEBARsAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAFAQEBIQEB + ASUBAQElAQEBJQEBASUBAQElAQEBJQEBASUBAQElAQEBJQEBASUBAQElAQEBJQEBASUBAQElAQEBJQEB + ASUBAQElAQEBJQEBASUBAQElAQEBJQEBASUBAQEhAAAABQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAfAAAA2QEBAfUBAQH1AQEB9QEB + AfUBAQH1AQEB9QEBAfUBAQH1AQEB9QEBAfUBAQH1AQEB9QEBAfUBAQH1AQEB9QEBAfUBAQH1AQEB9QEB + AfUBAQH1AQEB9QEBAfUAAADZAAAAHwAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAB8AAADZAQEB9QEB + AfUBAQH1AQEB9QEBAfUBAQH1AQEB9QEBAfUBAQH1AQEB9QEBAfUBAQH1AQEB9QEBAfUBAQH1AQEB9QEB + AfUBAQH1AQEB9QEBAfUBAQH1AQEB9QAAANkAAAAfAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAwAAAAYAAAAAEA + IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAABUAAABdAQEBcQAA + AHEBAQFxAQEBcQAAAHEBAQFxAQEBcQAAAHEBAQFxAAAAcQAAAHEAAABxAQEBcQAAAHEBAQFxAAAAcQEB + AXEAAABxAAAAcQEBAXEAAABxAQEBcQAAAHEBAQFxAQEBcQAAAHEAAABxAQEBcQAAAHEAAABxAQEBcQAA + AHEAAABxAQEBcQEBAV0AAAAVAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQEB + AS8AAADTAAAA/wAAAP8AAAD/AAAA/wAAAP8BAQH/AAAA/wAAAP8AAAD/AQEB/wAAAP8AAAD/AQEB/wAA + AP8AAAD/AQEB/wAAAP8AAAD/AAAA/wAAAP8AAAD/AQEB/wAAAP8BAQH/AAAA/wEBAf8AAAD/AAAA/wEB + Af8BAQH/AAAA/wEBAf8BAQH/AAAA/wAAANMAAAAvAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQEBAS8AAADTAAAA/wEBAf8AAAD/AAAA/wEBAf8BAQH/AAAA/wAAAP8AAAD/AQEB/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AQEB/wAAAP8AAAD/AQEB/wAAAP8AAAD/AQEB/wAAAP8AAAD/AAAA/wEB + Af8AAAD/AAAA/wEBAf8BAQH/AAAA/wEBAf8BAQH/AAAA/wAAANMAAAAvAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAABUAAABdAQEBcQEBAXEBAQFxAQEBcQEBAXEBAQFxAQEBcQEB + AXEBAQFxAAAAcQAAAHEAAABxAQEBcQAAAHEBAQFxAAAAcQEBAXEAAABxAAAAcQEBAXEAAABxAQEBcQAA + AHEBAQFxAQEBcQAAAHEAAABxAQEBcQAAAHEAAABxAQEBcQAAAHEAAABxAQEBcQEBAV0AAAAVAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAABcAAABhAQEBdwAAAHcBAQF3AAAAdwEBAXcBAQF3AAAAdwEBAXcAAAB3AAAAdwEB + AXcAAAB3AQEBdwAAAHcAAAB3AAAAdwEBAXcBAQF3AAAAdwAAAHcAAAB3AQEBdwAAAHcBAQF3AQEBdwAA + AHcBAQF3AQEBdwAAAHcBAQF3AQEBdwAAAHcBAQF3AQEBdwAAAGEAAAAXAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAC8AAADPAQEB+QEBAfkAAAD5AAAA+QEBAfkBAQH5AAAA+QAA + APkAAAD5AAAA+QAAAPkAAAD5AAAA+QEBAfkAAAD5AAAA+QAAAPkAAAD5AAAA+QAAAPkBAQH5AAAA+QAA + APkAAAD5AAAA+QAAAPkAAAD5AAAA+QAAAPkAAAD5AAAA+QAAAPkAAAD5AAAA+QEBAc8AAAAvAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAC8AAADPAAAA+QAAAPkAAAD5AQEB+QAA + APkAAAD5AQEB+QEBAfkAAAD5AQEB+QAAAPkAAAD5AAAA+QEBAfkAAAD5AAAA+QEBAfkBAQH5AAAA+QEB + AfkBAQH5AAAA+QEBAfkAAAD5AAAA+QEBAfkAAAD5AAAA+QEBAfkBAQH5AQEB+QAAAPkBAQH5AQEB+QAA + AM8AAAAvAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQEBARcAAABhAQEBdQEB + AXUBAQF1AAAAdQEBAXUBAQF1AAAAdQEBAXUAAAB1AAAAdQAAAHUAAAB1AAAAdQAAAHUAAAB1AAAAdQAA + AHUAAAB1AQEBdQAAAHUAAAB1AAAAdQAAAHUAAAB1AAAAdQAAAHUAAAB1AAAAdQAAAHUAAAB1AAAAdQAA + AHUAAAB1AAAAdQEBAWEBAQEXAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAABUBAQFdAQEBcQAAAHEBAQFxAQEBcQAA + AHEAAABxAQEBcQEBAXEBAQFxAAAAcQAAAHEAAABxAQEBcQAAAHEBAQFxAAAAcQEBAXEBAQFxAAAAcQEB + AXEAAABxAQEBcQAAAHEBAQFxAAAAcQAAAHEBAQFxAQEBcQEBAXEBAQFxAQEBcQEBAXEAAABxAAAAcQEB + AV0AAAAVAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAC8BAQHTAAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8BAQH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAANMAAAAvAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AC8AAADTAQEB/wAAAP8AAAD/AAAA/wEBAf8BAQH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AQEB/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wEBAdMAAAAvAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAABUBAQFdAQEBcQAAAHEBAQFxAQEBcQAAAHEAAABxAQEBcQEBAXEBAQFxAAAAcQAA + AHEAAABxAQEBcQAAAHEBAQFxAAAAcQEBAXEBAQFxAAAAcQEBAXEAAABxAQEBcQAAAHEBAQFxAAAAcQAA + AHEBAQFxAQEBcQEBAXEBAQFxAQEBcQEBAXEAAABxAAAAcQEBAV0AAAAVAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + + + \ No newline at end of file diff --git a/Controls/DragDropHintForm.Designer.cs b/Controls/DragDropHintForm.Designer.cs new file mode 100644 index 0000000..66b48f3 --- /dev/null +++ b/Controls/DragDropHintForm.Designer.cs @@ -0,0 +1,140 @@ +namespace SystemTrayMenu.Controls +{ + partial class DragDropHintForm + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DragDropHintForm)); + this.tableLayoutPanelMain = new System.Windows.Forms.TableLayoutPanel(); + this.tableLayoutPanelBottom = new System.Windows.Forms.TableLayoutPanel(); + this.buttonOk = new System.Windows.Forms.Button(); + this.labelHint = new System.Windows.Forms.Label(); + this.pictureBoxHint = new System.Windows.Forms.PictureBox(); + this.tableLayoutPanelMain.SuspendLayout(); + this.tableLayoutPanelBottom.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxHint)).BeginInit(); + this.SuspendLayout(); + // + // tableLayoutPanelMain + // + this.tableLayoutPanelMain.AutoSize = true; + this.tableLayoutPanelMain.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.tableLayoutPanelMain.ColumnCount = 1; + this.tableLayoutPanelMain.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanelMain.Controls.Add(this.tableLayoutPanelBottom, 0, 2); + this.tableLayoutPanelMain.Controls.Add(this.labelHint, 0, 0); + this.tableLayoutPanelMain.Controls.Add(this.pictureBoxHint, 0, 1); + this.tableLayoutPanelMain.Location = new System.Drawing.Point(12, 12); + this.tableLayoutPanelMain.Name = "tableLayoutPanelMain"; + this.tableLayoutPanelMain.RowCount = 3; + this.tableLayoutPanelMain.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tableLayoutPanelMain.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tableLayoutPanelMain.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tableLayoutPanelMain.Size = new System.Drawing.Size(223, 149); + this.tableLayoutPanelMain.TabIndex = 0; + // + // tableLayoutPanelBottom + // + this.tableLayoutPanelBottom.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); + this.tableLayoutPanelBottom.AutoSize = true; + this.tableLayoutPanelBottom.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.tableLayoutPanelBottom.ColumnCount = 3; + this.tableLayoutPanelBottom.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanelBottom.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + this.tableLayoutPanelBottom.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanelBottom.Controls.Add(this.buttonOk, 1, 0); + this.tableLayoutPanelBottom.Location = new System.Drawing.Point(3, 117); + this.tableLayoutPanelBottom.Name = "tableLayoutPanelBottom"; + this.tableLayoutPanelBottom.RowCount = 1; + this.tableLayoutPanelBottom.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tableLayoutPanelBottom.Size = new System.Drawing.Size(217, 29); + this.tableLayoutPanelBottom.TabIndex = 1; + // + // buttonOk + // + this.buttonOk.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonOk.Location = new System.Drawing.Point(71, 3); + this.buttonOk.Name = "buttonOk"; + this.buttonOk.Size = new System.Drawing.Size(75, 23); + this.buttonOk.TabIndex = 2; + this.buttonOk.Text = "OK"; + this.buttonOk.UseVisualStyleBackColor = true; + this.buttonOk.Click += new System.EventHandler(this.ButtonOk_Click); + // + // labelHint + // + this.labelHint.AutoSize = true; + this.labelHint.Location = new System.Drawing.Point(3, 0); + this.labelHint.MaximumSize = new System.Drawing.Size(217, 0); + this.labelHint.Name = "labelHint"; + this.labelHint.Size = new System.Drawing.Size(41, 13); + this.labelHint.TabIndex = 0; + this.labelHint.Text = "Hint: ..."; + // + // pictureBoxHint + // + this.pictureBoxHint.Image = global::SystemTrayMenu.Properties.Resources.hintDragDrop; + this.pictureBoxHint.Location = new System.Drawing.Point(3, 16); + this.pictureBoxHint.Name = "pictureBoxHint"; + this.pictureBoxHint.Size = new System.Drawing.Size(217, 95); + this.pictureBoxHint.TabIndex = 1; + this.pictureBoxHint.TabStop = false; + // + // DragDropHintForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; + this.AutoSize = true; + this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.ClientSize = new System.Drawing.Size(302, 221); + this.Controls.Add(this.tableLayoutPanelMain); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "DragDropHintForm"; + this.Padding = new System.Windows.Forms.Padding(0, 0, 10, 0); + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "DragDropHintForm"; + this.tableLayoutPanelMain.ResumeLayout(false); + this.tableLayoutPanelMain.PerformLayout(); + this.tableLayoutPanelBottom.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxHint)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TableLayoutPanel tableLayoutPanelMain; + private System.Windows.Forms.Button buttonOk; + private System.Windows.Forms.Label labelHint; + private System.Windows.Forms.PictureBox pictureBoxHint; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanelBottom; + } +} \ No newline at end of file diff --git a/Controls/DragDropHintForm.cs b/Controls/DragDropHintForm.cs new file mode 100644 index 0000000..75ffd14 --- /dev/null +++ b/Controls/DragDropHintForm.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace SystemTrayMenu.Controls +{ + public partial class DragDropHintForm : Form + { + public DragDropHintForm(string hintTitle, string hintText, + string buttonOk) + { + InitializeComponent(); + this.Text = hintTitle; + this.labelHint.Text = hintText; + this.buttonOk.Text = buttonOk; + } + + private void ButtonOk_Click(object sender, EventArgs e) + { + this.Close(); + } + } +} diff --git a/Controls/DragDropHintForm.resx b/Controls/DragDropHintForm.resx new file mode 100644 index 0000000..a04fa62 --- /dev/null +++ b/Controls/DragDropHintForm.resx @@ -0,0 +1,377 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + AAABAAMAEBAAAAEAIABoBAAANgAAACAgAAABACAAqBAAAJ4EAAAwMAAAAQAgAKglAABGFQAAKAAAABAA + AAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAJAAAAcwEB + AXsBAQF7AQEBewEBAXsBAQF7AQEBewEBAXsBAQF7AQEBewEBAXsAAABzAAAACQAAAAEAAAABAAAACQAA + AHMBAQF7AQEBewEBAXsBAQF7AQEBewEBAXsBAQF7AQEBewEBAXsBAQF7AAAAcwAAAAkAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAACQAAAHUAAAB7AAAAewAAAHsAAAB7AAAAewAAAHsAAAB7AAAAewAAAHsAAAB7AAAAdQAA + AAkAAAABAAAAAQAAAAkAAABzAAAAewAAAHsAAAB7AAAAewAAAHsAAAB7AAAAewAAAHsAAAB7AAAAewAA + AHMAAAAJAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAkAAABzAQEBewEBAXsBAQF7AQEBewEBAXsBAQF7AQEBewEB + AXsBAQF7AQEBewAAAHMAAAAJAAAAAQAAAAEAAAAJAAAAcwEBAXsBAQF7AQEBewEBAXsBAQF7AQEBewEB + AXsBAQF7AQEBewEBAXsAAABzAAAACQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAAAABAAAAAAQAgAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAHwAAANkBAQH1AQEB9QEBAfUBAQH1AQEB9QEB + AfUBAQH1AQEB9QEBAfUBAQH1AQEB9QEBAfUBAQH1AQEB9QEBAfUBAQH1AQEB9QEBAfUBAQH1AQEB9QEB + AfUBAQH1AAAA2QAAAB8AAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAfAAAA2QEBAfUBAQH1AQEB9QEB + AfUBAQH1AQEB9QEBAfUBAQH1AQEB9QEBAfUBAQH1AQEB9QEBAfUBAQH1AQEB9QEBAfUBAQH1AQEB9QEB + AfUBAQH1AQEB9QEBAfUAAADZAAAAHwAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAFAAAAIQAAACUAAAAlAAAAJQAAACUAAAAlAAAAJQAA + ACUAAAAlAAAAJQAAACUAAAAlAAAAJQAAACUAAAAlAAAAJQAAACUAAAAlAAAAJQAAACUAAAAlAAAAJQAA + ACUAAAAhAAAABQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQEBARsAAAC5AAAA0QAAANEAAADRAAAA0QAA + ANEAAADRAAAA0QAAANEAAADRAAAA0QAAANEAAADRAAAA0QAAANEAAADRAAAA0QAAANEAAADRAAAA0QAA + ANEAAADRAAAA0QAAALkBAQEbAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAQEBGwEBAbkAAADRAAAA0QAA + ANEAAADRAAAA0QAAANEAAADRAAAA0QAAANEAAADRAAAA0QAAANEAAADRAAAA0QAAANEAAADRAAAA0QAA + ANEAAADRAAAA0QAAANEAAADRAQEBuQEBARsAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAFAQEBIQEB + ASUBAQElAQEBJQEBASUBAQElAQEBJQEBASUBAQElAQEBJQEBASUBAQElAQEBJQEBASUBAQElAQEBJQEB + ASUBAQElAQEBJQEBASUBAQElAQEBJQEBASUBAQEhAAAABQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAfAAAA2QEBAfUBAQH1AQEB9QEB + AfUBAQH1AQEB9QEBAfUBAQH1AQEB9QEBAfUBAQH1AQEB9QEBAfUBAQH1AQEB9QEBAfUBAQH1AQEB9QEB + AfUBAQH1AQEB9QEBAfUAAADZAAAAHwAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAB8AAADZAQEB9QEB + AfUBAQH1AQEB9QEBAfUBAQH1AQEB9QEBAfUBAQH1AQEB9QEBAfUBAQH1AQEB9QEBAfUBAQH1AQEB9QEB + AfUBAQH1AQEB9QEBAfUBAQH1AQEB9QAAANkAAAAfAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAwAAAAYAAAAAEA + IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAABUAAABdAQEBcQAA + AHEBAQFxAQEBcQAAAHEBAQFxAQEBcQAAAHEBAQFxAAAAcQAAAHEAAABxAQEBcQAAAHEBAQFxAAAAcQEB + AXEAAABxAAAAcQEBAXEAAABxAQEBcQAAAHEBAQFxAQEBcQAAAHEAAABxAQEBcQAAAHEAAABxAQEBcQAA + AHEAAABxAQEBcQEBAV0AAAAVAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQEB + AS8AAADTAAAA/wAAAP8AAAD/AAAA/wAAAP8BAQH/AAAA/wAAAP8AAAD/AQEB/wAAAP8AAAD/AQEB/wAA + AP8AAAD/AQEB/wAAAP8AAAD/AAAA/wAAAP8AAAD/AQEB/wAAAP8BAQH/AAAA/wEBAf8AAAD/AAAA/wEB + Af8BAQH/AAAA/wEBAf8BAQH/AAAA/wAAANMAAAAvAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQEBAS8AAADTAAAA/wEBAf8AAAD/AAAA/wEBAf8BAQH/AAAA/wAAAP8AAAD/AQEB/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AQEB/wAAAP8AAAD/AQEB/wAAAP8AAAD/AQEB/wAAAP8AAAD/AAAA/wEB + Af8AAAD/AAAA/wEBAf8BAQH/AAAA/wEBAf8BAQH/AAAA/wAAANMAAAAvAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAABUAAABdAQEBcQEBAXEBAQFxAQEBcQEBAXEBAQFxAQEBcQEB + AXEBAQFxAAAAcQAAAHEAAABxAQEBcQAAAHEBAQFxAAAAcQEBAXEAAABxAAAAcQEBAXEAAABxAQEBcQAA + AHEBAQFxAQEBcQAAAHEAAABxAQEBcQAAAHEAAABxAQEBcQAAAHEAAABxAQEBcQEBAV0AAAAVAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAABcAAABhAQEBdwAAAHcBAQF3AAAAdwEBAXcBAQF3AAAAdwEBAXcAAAB3AAAAdwEB + AXcAAAB3AQEBdwAAAHcAAAB3AAAAdwEBAXcBAQF3AAAAdwAAAHcAAAB3AQEBdwAAAHcBAQF3AQEBdwAA + AHcBAQF3AQEBdwAAAHcBAQF3AQEBdwAAAHcBAQF3AQEBdwAAAGEAAAAXAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAC8AAADPAQEB+QEBAfkAAAD5AAAA+QEBAfkBAQH5AAAA+QAA + APkAAAD5AAAA+QAAAPkAAAD5AAAA+QEBAfkAAAD5AAAA+QAAAPkAAAD5AAAA+QAAAPkBAQH5AAAA+QAA + APkAAAD5AAAA+QAAAPkAAAD5AAAA+QAAAPkAAAD5AAAA+QAAAPkAAAD5AAAA+QEBAc8AAAAvAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAC8AAADPAAAA+QAAAPkAAAD5AQEB+QAA + APkAAAD5AQEB+QEBAfkAAAD5AQEB+QAAAPkAAAD5AAAA+QEBAfkAAAD5AAAA+QEBAfkBAQH5AAAA+QEB + AfkBAQH5AAAA+QEBAfkAAAD5AAAA+QEBAfkAAAD5AAAA+QEBAfkBAQH5AQEB+QAAAPkBAQH5AQEB+QAA + AM8AAAAvAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQEBARcAAABhAQEBdQEB + AXUBAQF1AAAAdQEBAXUBAQF1AAAAdQEBAXUAAAB1AAAAdQAAAHUAAAB1AAAAdQAAAHUAAAB1AAAAdQAA + AHUAAAB1AQEBdQAAAHUAAAB1AAAAdQAAAHUAAAB1AAAAdQAAAHUAAAB1AAAAdQAAAHUAAAB1AAAAdQAA + AHUAAAB1AAAAdQEBAWEBAQEXAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAABUBAQFdAQEBcQAAAHEBAQFxAQEBcQAA + AHEAAABxAQEBcQEBAXEBAQFxAAAAcQAAAHEAAABxAQEBcQAAAHEBAQFxAAAAcQEBAXEBAQFxAAAAcQEB + AXEAAABxAQEBcQAAAHEBAQFxAAAAcQAAAHEBAQFxAQEBcQEBAXEBAQFxAQEBcQEBAXEAAABxAAAAcQEB + AV0AAAAVAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAC8BAQHTAAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8BAQH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAANMAAAAvAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AC8AAADTAQEB/wAAAP8AAAD/AAAA/wEBAf8BAQH/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AQEB/wAAAP8AAAD/AAAA/wAA + AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wEBAdMAAAAvAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAABUBAQFdAQEBcQAAAHEBAQFxAQEBcQAAAHEAAABxAQEBcQEBAXEBAQFxAAAAcQAA + AHEAAABxAQEBcQAAAHEBAQFxAAAAcQEBAXEBAQFxAAAAcQEBAXEAAABxAQEBcQAAAHEBAQFxAAAAcQAA + AHEBAQFxAQEBcQEBAXEBAQFxAQEBcQEBAXEAAABxAAAAcQEBAV0AAAAVAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAA + AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= + + + \ No newline at end of file diff --git a/Controls/Menu.Designer.cs b/Controls/Menu.Designer.cs new file mode 100644 index 0000000..3c27043 --- /dev/null +++ b/Controls/Menu.Designer.cs @@ -0,0 +1,183 @@ +using SystemTrayMenu.Controls; + +namespace SystemTrayMenu +{ + partial class Menu + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + FadeForm.Dispose(); + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle3 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle(); + this.labelTitle = new System.Windows.Forms.Label(); + this.dgv = new System.Windows.Forms.DataGridView(); + this.ColumnIcon = new System.Windows.Forms.DataGridViewImageColumn(); + this.ColumnText = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.tableLayoutPanel = new System.Windows.Forms.TableLayoutPanel(); + ((System.ComponentModel.ISupportInitialize)(this.dgv)).BeginInit(); + this.tableLayoutPanel.SuspendLayout(); + this.SuspendLayout(); + // + // labelTitle + // + this.labelTitle.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right))); + this.labelTitle.AutoSize = true; + this.labelTitle.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(229)))), ((int)(((byte)(243)))), ((int)(((byte)(255))))); + this.labelTitle.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelTitle.ForeColor = System.Drawing.Color.Black; + this.labelTitle.Location = new System.Drawing.Point(0, 0); + this.labelTitle.Margin = new System.Windows.Forms.Padding(0); + this.labelTitle.Name = "labelTitle"; + this.labelTitle.Padding = new System.Windows.Forms.Padding(3, 0, 0, 1); + this.labelTitle.Size = new System.Drawing.Size(361, 14); + this.labelTitle.TabIndex = 2; + this.labelTitle.Text = "STM"; + this.labelTitle.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.labelTitle.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.LabelTitle_MouseDoubleClick); + this.labelTitle.MouseEnter += new System.EventHandler(this.LabelTitle_MouseEnter); + this.labelTitle.MouseLeave += new System.EventHandler(this.LabelTitle_MouseLeave); + this.labelTitle.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.dgv_MouseWheel); + // + // dgv + // + this.dgv.AllowUserToAddRows = false; + this.dgv.AllowUserToDeleteRows = false; + this.dgv.AllowUserToResizeColumns = false; + this.dgv.AllowUserToResizeRows = false; + this.dgv.BackgroundColor = System.Drawing.Color.White; + this.dgv.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.dgv.CellBorderStyle = System.Windows.Forms.DataGridViewCellBorderStyle.None; + this.dgv.ClipboardCopyMode = System.Windows.Forms.DataGridViewClipboardCopyMode.Disable; + this.dgv.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.None; + this.dgv.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing; + this.dgv.ColumnHeadersVisible = false; + this.dgv.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + this.ColumnIcon, + this.ColumnText}); + this.dgv.Location = new System.Drawing.Point(0, 14); + this.dgv.Margin = new System.Windows.Forms.Padding(0); + this.dgv.Name = "dgv"; + this.dgv.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.None; + this.dgv.RowHeadersVisible = false; + this.dgv.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.DisableResizing; + dataGridViewCellStyle3.Font = new System.Drawing.Font("Segoe UI", 7F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel, ((byte)(0))); + this.dgv.RowsDefaultCellStyle = dataGridViewCellStyle3; + this.dgv.RowTemplate.DefaultCellStyle.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.dgv.RowTemplate.Height = 20; + this.dgv.RowTemplate.ReadOnly = true; + this.dgv.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.dgv.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; + this.dgv.ShowCellErrors = false; + this.dgv.ShowCellToolTips = false; + this.dgv.ShowEditingIcon = false; + this.dgv.ShowRowErrors = false; + this.dgv.Size = new System.Drawing.Size(361, 390); + this.dgv.TabIndex = 4; + this.dgv.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.dgv_MouseWheel); + // + // ColumnIcon + // + dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; + dataGridViewCellStyle1.NullValue = "System.Drawing.Icon"; + dataGridViewCellStyle1.Padding = new System.Windows.Forms.Padding(3, 2, 6, 2); + this.ColumnIcon.DefaultCellStyle = dataGridViewCellStyle1; + this.ColumnIcon.Frozen = true; + this.ColumnIcon.HeaderText = "ColumnIcon"; + this.ColumnIcon.ImageLayout = System.Windows.Forms.DataGridViewImageCellLayout.Zoom; + this.ColumnIcon.Name = "ColumnIcon"; + this.ColumnIcon.ReadOnly = true; + this.ColumnIcon.Resizable = System.Windows.Forms.DataGridViewTriState.False; + this.ColumnIcon.Width = 25; + // + // ColumnText + // + dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle2.Padding = new System.Windows.Forms.Padding(0, 0, 3, 0); + this.ColumnText.DefaultCellStyle = dataGridViewCellStyle2; + this.ColumnText.Frozen = true; + this.ColumnText.HeaderText = "ColumnText"; + this.ColumnText.MaxInputLength = 40; + this.ColumnText.Name = "ColumnText"; + this.ColumnText.ReadOnly = true; + this.ColumnText.Resizable = System.Windows.Forms.DataGridViewTriState.False; + this.ColumnText.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.Programmatic; + this.ColumnText.Width = 50; + // + // tableLayoutPanel + // + this.tableLayoutPanel.AutoScroll = true; + this.tableLayoutPanel.AutoSize = true; + this.tableLayoutPanel.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.tableLayoutPanel.ColumnCount = 1; + this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); + this.tableLayoutPanel.Controls.Add(this.dgv, 0, 1); + this.tableLayoutPanel.Controls.Add(this.labelTitle, 0, 0); + this.tableLayoutPanel.Location = new System.Drawing.Point(1, 1); + this.tableLayoutPanel.Margin = new System.Windows.Forms.Padding(0); + this.tableLayoutPanel.Name = "tableLayoutPanel"; + this.tableLayoutPanel.RowCount = 2; + this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tableLayoutPanel.Size = new System.Drawing.Size(361, 404); + this.tableLayoutPanel.TabIndex = 3; + this.tableLayoutPanel.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.dgv_MouseWheel); + // + // Menu + // + this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; + this.AutoSize = true; + this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; + this.BackColor = System.Drawing.Color.Black; + this.ClientSize = new System.Drawing.Size(707, 611); + this.Controls.Add(this.tableLayoutPanel); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Name = "Menu"; + this.Opacity = 0.01D; + this.Padding = new System.Windows.Forms.Padding(1); + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.Manual; + this.Text = "SystemTrayMenu"; + this.TopMost = true; + this.Deactivate += new System.EventHandler(this.Menu_Deactivate); + ((System.ComponentModel.ISupportInitialize)(this.dgv)).EndInit(); + this.tableLayoutPanel.ResumeLayout(false); + this.tableLayoutPanel.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + private System.Windows.Forms.Label labelTitle; + private System.Windows.Forms.DataGridView dgv; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel; + private System.Windows.Forms.DataGridViewImageColumn ColumnIcon; + private System.Windows.Forms.DataGridViewTextBoxColumn ColumnText; + } +} \ No newline at end of file diff --git a/Controls/Menu.cs b/Controls/Menu.cs new file mode 100644 index 0000000..19ed52a --- /dev/null +++ b/Controls/Menu.cs @@ -0,0 +1,313 @@ +using System; +using System.Drawing; +using System.Linq; +using System.Reflection; +using System.Windows.Forms; +using SystemTrayMenu.Controls; + +namespace SystemTrayMenu +{ + public partial class Menu : Form, IDisposable + { + public new event EventHandler MouseWheel; + public event EventHandler Deactivated; + public event EventHandler UserClickedOpenFolder; + + public event Action CmdKeyProcessed; + + public enum Type + { + Main, + Sub, + Empty, + MaxReached + } + + public bool IsFadingIn + { + get + { + return FadeForm.IsFadingIn; + } + } + + public bool IsFadingOut + { + get + { + return FadeForm.IsFadingOut; + } + } + + public int Level = 0; + FadeForm FadeForm = null; + + public Menu() + { + FadeForm = new FadeForm(this); + InitializeComponent(); + SetDoubleBuffer(dgv, true); + + DataGridViewCellStyle dgvCellStyle = new DataGridViewCellStyle(); + dgvCellStyle.SelectionBackColor = MenuDefines.FileHover; + dgvCellStyle.SelectionForeColor = Color.Black; + this.dgv.DefaultCellStyle = dgvCellStyle; + } + + static void SetDoubleBuffer(Control ctl, bool DoubleBuffered) + { + typeof(Control).InvokeMember("DoubleBuffered", + BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.SetProperty, + null, ctl, new object[] { DoubleBuffered }); + } + + public void SetTypeSub() + { + SetType(Type.Sub); + } + public void SetTypeEmpty() + { + SetType(Type.Empty); + } + + public void SetType(Type type) + { + switch (type) + { + case Type.Sub: + if (!labelTitle.IsDisposed) + { + labelTitle.Dispose(); + } + break; + case Type.Empty: + SetTitle(Program.Translate("Folder empty")); + labelTitle.BackColor = MenuDefines.Background; + break; + case Type.MaxReached: + SetTitle($"Max {MenuDefines.MenusMax - 1} Menus"); + labelTitle.BackColor = MenuDefines.Background; + break; + case Type.Main: + break; + default: + break; + } + } + + public bool IsVisible() + { + return Visible; + } + + public bool IsActive(Form activeForm) + { + bool isActive = (this == activeForm); + return isActive; + } + + public bool IsMouseOn(Point mousePosition) + { + bool isMouseOn = Visible && Opacity >= MenuDefines.OpacityHalfValue + && ClientRectangle.Contains( + PointToClient(mousePosition)); + return isMouseOn; + } + + public DataGridView GetDataGridView() + { + return dgv; + } + + public void SetTitle(string title) + { + if (title.Length > MenuDefines.LengthMax) + { + title = $"{title.Substring(0, MenuDefines.LengthMax)}..."; + } + labelTitle.Text = title; + } + + public void FadeIn() + { + FadeForm.FadeIn(); + } + + public void FadeHalf() + { + FadeForm.FadeHalf(); + } + + public void FadeOut() + { + FadeForm.FadeOut(); + } + + public void AdjustLocationAndSize(Screen screen) + { + DataGridViewElementStates states = DataGridViewElementStates.None; + dgv.AutoResizeRows(); + int height = (int)(dgv.Rows.GetRowsHeight(states)); + int heightMax = screen.Bounds.Height - + new Taskbar().Size.Height - + labelTitle.Height; + if (height > heightMax) + { + height = heightMax; + } + dgv.Height = height; + AdjustDataGridViewSize(); + int x = screen.Bounds.Right - Width; + int y = heightMax - Height + labelTitle.Height; + + Location = new Point(x, y); + } + + public void AdjustLocationAndSize(int heightMax, int widthPredecessors, + Menu menuPredecessor) + { + DataGridViewElementStates states = DataGridViewElementStates.None; + this.dgv.AutoResizeRows(); + int height = this.dgv.Rows.GetRowsHeight(states); + if (height > heightMax) + { + height = heightMax; + } + this.dgv.Height = height; + + AdjustDataGridViewSize(); + int x = menuPredecessor.Location.X - Width + + (int)Math.Round(Program.ScalingFactor, 0, + MidpointRounding.AwayFromZero); + + RowData trigger = (RowData)Tag; + DataGridView dgv = menuPredecessor.GetDataGridView(); + if (dgv.Rows.Count > trigger.RowIndex) + { + var cellRectangle = dgv.GetCellDisplayRectangle( + 0, trigger.RowIndex, false); + int y = menuPredecessor.Location.Y + + menuPredecessor.dgv.Location.Y + + cellRectangle.Top; + if ((y + Height) > heightMax) + { + y = heightMax - Height; + } + + Location = new Point(x, y); + } + } + + private void AdjustDataGridViewSize() + { + dgv.AutoResizeColumns(); + bool scrollbarShown = false; + foreach (var scroll in dgv.Controls.OfType()) + { + if (scroll.Visible) + { + scroll.Width = 120; + scrollbarShown = true; + } + } + int newWidth = dgv.Columns[0].Width + dgv.Columns[1].Width; + if (scrollbarShown) + { + newWidth += SystemInformation.VerticalScrollBarWidth; + } + dgv.Width = newWidth; + } + + private void dgv_MouseWheel(object sender, MouseEventArgs e) + { + ((HandledMouseEventArgs)e).Handled = true; + int scrollspeed = MenuDefines.Scrollspeed; + if (e.Delta < 0) + { + if (dgv.FirstDisplayedScrollingRowIndex < dgv.Rows.Count - scrollspeed) + { + dgv.FirstDisplayedScrollingRowIndex += scrollspeed; + } + else + { + dgv.FirstDisplayedScrollingRowIndex = dgv.Rows.Count - 1; + } + } + else + { + if (dgv.FirstDisplayedScrollingRowIndex > 0 + scrollspeed) + { + dgv.FirstDisplayedScrollingRowIndex -= scrollspeed; + } + else + { + dgv.FirstDisplayedScrollingRowIndex = 0; + } + } + + dgv.PerformLayout(); + MouseWheel.Invoke(); + } + + private void Menu_Deactivate(object sender, EventArgs e) + { + Deactivated?.Invoke(); + } + + public void SetTitleColorDeactive() + { + this.labelTitle.ForeColor = Color.LightGray; + } + + public void SetTitleColorActive() + { + this.labelTitle.ForeColor = Color.Black; + } + + private void LabelTitle_MouseDoubleClick(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Left) + { + UserClickedOpenFolder?.Invoke(); + } + } + + private void LabelTitle_MouseEnter(object sender, EventArgs e) + { + this.labelTitle.BackColor = MenuDefines.FileHover; + } + + private void LabelTitle_MouseLeave(object sender, EventArgs e) + { + this.labelTitle.BackColor = MenuDefines.Background; + } + + protected override CreateParams CreateParams + { + get + { + var Params = base.CreateParams; + Params.ExStyle |= 0x80; + return Params; + } + } + + protected override bool ProcessCmdKey(ref Message msg, Keys keys) + { + switch (keys) + { + case Keys.Enter: + case Keys.Up: + case Keys.Down: + case Keys.Left: + case Keys.Right: + case Keys.Escape: + CmdKeyProcessed.Invoke(keys); + return true; + default: + break; + } + return base.ProcessCmdKey(ref msg, keys); + } + } +} \ No newline at end of file diff --git a/Controls/Menu.resx b/Controls/Menu.resx new file mode 100644 index 0000000..b1c3d17 --- /dev/null +++ b/Controls/Menu.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + True + + + True + + \ No newline at end of file diff --git a/Controls/MenuData.cs b/Controls/MenuData.cs new file mode 100644 index 0000000..543dd38 --- /dev/null +++ b/Controls/MenuData.cs @@ -0,0 +1,24 @@ +using Clearcove.Logging; +using IWshRuntimeLibrary; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Windows.Forms; +using SystemTrayMenu.Helper; +using TAFactory.IconPack; + +namespace SystemTrayMenu.Controls +{ + public struct MenuData + { + public List RowDatas; + public bool Valid; + public int Level; + }; +} \ No newline at end of file diff --git a/Controls/RowData.cs b/Controls/RowData.cs new file mode 100644 index 0000000..b2918b8 --- /dev/null +++ b/Controls/RowData.cs @@ -0,0 +1,480 @@ +using Clearcove.Logging; +using IWshRuntimeLibrary; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Windows.Forms; +using SystemTrayMenu.Helper; +using TAFactory.IconPack; + +namespace SystemTrayMenu.Controls +{ + public class RowData : IDisposable + { + public FileInfo FileInfo; + public Icon Icon; + public bool ContainsMenu; + public bool IsContextMenuOpen; + public bool ResolvedFileNotFound; + public string WorkingDirectory; + public string Arguments; + + public bool IsResolvedLnk; + public string TargetFilePath; + public string Text; + + + public Menu SubMenu; + public int RowIndex; + + public bool IsSelected; + public bool IsSelectedByKeyboard; + + public bool ReadIcon(bool isDirectory, bool isResolvedLnk, ref string resolvedLnkPath) + { + bool isLnkDirectory = false; + + Logger log = new Logger(nameof(RowData)); + + if (isResolvedLnk) + { + if (Icon == null) + { + Icon = IconReader.GetFolderIcon(TargetFilePath, + IconReader.FolderType.Open, true); + } + } + else if (isDirectory) + { + Icon = IconReader.GetFolderIcon(TargetFilePath, + IconReader.FolderType.Closed, false); + } + else if (!string.IsNullOrEmpty(TargetFilePath)) + { + bool handled = false; + string fileExtension = Path.GetExtension(TargetFilePath); + + if (fileExtension == ".lnk") + { + handled = SetLnk(log, ref isLnkDirectory, + ref resolvedLnkPath); + } + else if (fileExtension == ".url") + { + handled = SetUrl(log); + } + else if (fileExtension == ".sln") + { + handled = SetSln(log); + } + + if (!handled) + { + try + { + Icon = IconReader.GetFileIcon(TargetFilePath, false); + + // other project -> fails sometimes + //icon = IconHelper.ExtractIcon(TargetFilePath, 0); + + // standard way -> fails sometimes + //icon = Icon.ExtractAssociatedIcon(filePath); + + // API Code Pack -> fails sometimes + //ShellFile shellFile = ShellFile.FromFilePath(filePath); + //Bitmap shellThumb = shellFile.Thumbnail.ExtraLargeBitmap; + } + catch (Exception ex) + { + log.Info($"TargetFilePath:'{TargetFilePath}'"); + log.Error($"{ex.ToString()}"); + } + } + } + + return isLnkDirectory; + } + + private bool SetLnk(Logger log, ref bool isLnkDirectory, + ref string resolvedLnkPath) + { + bool handled = false; + resolvedLnkPath = LnkHelper.ResolveShortcut(TargetFilePath); + if (LnkHelper.IsDirectory(resolvedLnkPath)) + { + Icon = IconReader.GetFolderIcon(TargetFilePath, + IconReader.FolderType.Open, true); + handled = true; + isLnkDirectory = true; + } + else if (string.IsNullOrEmpty(resolvedLnkPath)) + { + ResolvedFileNotFound = true; + log.Info($"Resolve '{TargetFilePath}' not possible => no icon"); + } + else + { + IWshShell shell = new WshShell(); + var lnk = shell.CreateShortcut(TargetFilePath) + as IWshShortcut; + Arguments = lnk.Arguments; + WorkingDirectory = lnk.WorkingDirectory; + string iconLocation = lnk.IconLocation; + if (iconLocation.Length > 2) + { + iconLocation = iconLocation.Substring(0, + iconLocation.Length - 2); + if (System.IO.File.Exists(iconLocation)) + { + try + { + Icon = Icon.ExtractAssociatedIcon(iconLocation); + handled = true; + } + catch (Exception ex) + { + log.Info($"iconLocation:'{iconLocation}'"); + log.Error($"{ex.ToString()}"); + } + } + } + + TargetFilePath = resolvedLnkPath; + } + + SetText($"{FileInfo.Name.Substring(0, FileInfo.Name.Length - 4)}"); + + return handled; + } + + private bool SetUrl(Logger log) + { + bool handled = false; + string iconFile = string.Empty; + try + { + FileIni file = new FileIni(TargetFilePath); + iconFile = file.Value("IconFile", string.Empty); + if (string.IsNullOrEmpty(iconFile)) + { + string browserPath = FileUrl.GetDefaultBrowserPath(); + if (string.IsNullOrEmpty(browserPath)) + { + log.Info($"No default browser found!"); + } + else + { + Icon = IconReader.GetFileIcon(browserPath, false); + handled = true; + } + } + else if (System.IO.File.Exists(iconFile)) + { + Icon = Icon.ExtractAssociatedIcon(iconFile); + handled = true; + } + else + { + log.Info($"Resolve '{TargetFilePath}' not possible => no icon"); + } + } + catch (Exception ex) + { + log.Info($"TargetFilePath:'{TargetFilePath}', " + + $"iconFile:'{iconFile}'"); + log.Error($"{ex.ToString()}"); + } + + SetText($"{FileInfo.Name.Substring(0, FileInfo.Name.Length - 4)}"); + + return handled; + } + + [DllImport("shell32.dll")] + static extern int FindExecutable(string lpFile, string lpDirectory, [Out] StringBuilder lpResult); + private bool SetSln(Logger log) + { + bool handled = false; + var executable = new StringBuilder(1024); + try + { + FindExecutable(TargetFilePath, string.Empty, executable); + // icon = IconReader.GetFileIcon(executable, false); + // e.g. VS 2019 icon, need another icom in imagelist + List extractedIcons = IconHelper.ExtractAllIcons( + executable.ToString()); + Icon = extractedIcons.Last(); + handled = true; + } + catch (Exception ex) + { + log.Info($"TargetFilePath:'{TargetFilePath}', " + + $"executable:'{executable.ToString()}'"); + log.Error($"{ex.ToString()}"); + } + + return handled; + } + + public void SetText(string text) + { + //text = $" {text}"; + if (text.Length > MenuDefines.LengthMax) + { + text = $"{text.Substring(0, MenuDefines.LengthMax)}..."; + } + Text = text; + } + + +#warning sort this class and check for duplicated + + public event Action OpenMenu; + + public bool IsLoading = false; + public bool RestartLoading = false; + public BackgroundWorker Reading = new BackgroundWorker(); + + Icon icon = null; + //FontFamily fontFamily = new FontFamily("Segoe UI"); + //Font font = new Font(new FontFamily("Segoe UI"), 12F, + // FontStyle.Regular, GraphicsUnit.Pixel); + + WaitMenuOpen waitMenuOpen = new WaitMenuOpen(); + bool resolvedFileNotFound = false; + + bool disposed = false; + Logger log = new Logger(nameof(RowData)); + internal string TargetFilePathOrig; + + public RowData() + { + Reading.WorkerSupportsCancellation = true; + + Initialize(); + void Initialize() + { + //Margin = new Padding(0, 0, 0, 0); + //FlatAppearance.BorderSize = 0; + //UseVisualStyleBackColor = true; + //FlatStyle = FlatStyle.Flat; + //BackColor = MenuDefines.File; + //FlatAppearance.BorderColor = MenuDefines.File; + //Anchor = (AnchorStyles.Left | AnchorStyles.Right); + //AutoSize = true; + //AutoSizeMode = AutoSizeMode.GrowAndShrink; + //Font = new Font(fontFamily, 7, FontStyle.Regular, GraphicsUnit.Pixel); + //ForeColor = Color.Black; + waitMenuOpen.DoOpen += WaitMenuOpen_DoOpen; + + //MouseLeave += MenuButton_MouseLeave; + //void MenuButton_MouseLeave(object sender, EventArgs e) + //{ + // if (Tag == null && + // !isContextMenuOpen && + // !ContainsMenu) + // { + // BackColor = MenuDefines.File; + // } + //} + + //MouseEnter += Menubutton_MouseEnter; + //void Menubutton_MouseEnter(object sender, EventArgs e) + //{ + // if (Tag == null && + // !ContainsMenu) + // { + // BackColor = MenuDefines.FileHover; + // } + //} + + //BackColorChanged += MenuButton_BackColorChanged; + //void MenuButton_BackColorChanged(object sender, EventArgs e) + //{ + // FlatAppearance.BorderColor = BackColor; + //} + + + } + } + + //DoubleClick += MenuButton_DoubleClick; + public void DoubleClick() + { + if (ContainsMenu) + { + try + { + Process.Start("explorer.exe", TargetFilePath); + } + catch (Exception ex) + { + log.Info($"TargetFilePath:'{TargetFilePath}', " + + $"=>DirectoryNotFound?"); + log.Error($"{ex.ToString()}"); + ex = new DirectoryNotFoundException(); + MessageBox.Show(ex.Message); + } + } + } + + //MouseDown += MenuButton_MouseDown; + public void MouseDown(DataGridView dgv, MouseEventArgs e) + { + if (ContainsMenu) + { + TriggerMenuOpener(); // Touchscreen + } + + if (IsLoading) + { + waitMenuOpen.Click(); + } + + if (e == null || + e.Button == MouseButtons.Left && + !ContainsMenu) + { + try + { + //https://stackoverflow.com/questions/31627801/ + Process p = new Process(); + p.StartInfo = new ProcessStartInfo(TargetFilePath); + p.StartInfo.Arguments = Arguments; + p.StartInfo.WorkingDirectory = WorkingDirectory; + p.StartInfo.CreateNoWindow = true; + p.Start(); + } + catch (Exception ex) + { + log.Info($"TargetFilePath:'{ TargetFilePath}', " + + $"=>FileNotFound?"); + log.Error($"{ex.ToString()}"); + if (resolvedFileNotFound) + { + ex = new FileNotFoundException(); + } + MessageBox.Show(ex.Message); + } + } + + if (e != null && + e.Button == MouseButtons.Right && + FileInfo != null && + dgv.Rows.Count > RowIndex) + { + IsContextMenuOpen = true; + +#warning is there any other possiblity to raise selection changed event? dataGridView.ClearSelection(); seems to overwrite selected + IsSelected = true; + dgv.Rows[RowIndex].Selected = true; + + try + { + ShellContextMenu ctxMnu = new ShellContextMenu(); + Point location = dgv.FindForm().Location; + Point point = new Point( + e.X + location.X + dgv.Location.X, + e.Y + location.Y + dgv.Location.Y); + if (ContainsMenu) + { + DirectoryInfo[] dir = new DirectoryInfo[1]; + dir[0] = new DirectoryInfo(TargetFilePathOrig); + ctxMnu.ShowContextMenu(dir, point); + } + else + { + FileInfo[] arrFI = new FileInfo[1]; + arrFI[0] = new FileInfo(TargetFilePathOrig); + ctxMnu.ShowContextMenu(arrFI, point); + } + } + catch (Exception ex) + { + MessageBox.Show(ex.ToString() + TargetFilePath); + } + + if (!dgv.IsDisposed) + { + IsSelected = false; + dgv.Rows[RowIndex].Selected = false; + } + + IsContextMenuOpen = false; + } + } + + public void MenuLoaded() + { + waitMenuOpen.MenuLoaded(); + } + + public void StartMenuOpener() + { + if (ContainsMenu) + { + IsLoading = true; + waitMenuOpen.Start(); + } + } + + private void TriggerMenuOpener() + { + if (ContainsMenu && IsLoading) + { + waitMenuOpen.Start(); + } + } + + public void StopLoadMenuAndStartWaitToOpenIt() + { + if (ContainsMenu) + { + waitMenuOpen.Stop(); + //IsLoading = false; + } + } + + private void WaitMenuOpen_DoOpen() + { + IsLoading = false; + OpenMenu?.Invoke(this, null); + } + + public void SetData(RowData data, DataGridView dgv) + { + data.RowIndex = dgv.Rows.Add(); + DataGridViewRow row = dgv.Rows[data.RowIndex]; + + if (Icon == null) + { + Icon = Properties.Resources.SystemTrayMenu; + } + DataGridViewImageCell cellIcon = + (DataGridViewImageCell)row.Cells[0]; + cellIcon.Value = data.Icon; + + DataGridViewTextBoxCell cellName = + (DataGridViewTextBoxCell)row.Cells[1]; + cellName.Value = data.Text; + + row.Tag = data; + } + + public void Dispose() + { + if (!disposed) + { + icon?.Dispose(); + waitMenuOpen.Dispose(); + } + disposed = true; + } + } +} diff --git a/Helper/BringWindowToTop.cs b/Helper/BringWindowToTop.cs new file mode 100644 index 0000000..e49705c --- /dev/null +++ b/Helper/BringWindowToTop.cs @@ -0,0 +1,62 @@ +using System; +using System.Diagnostics; +using System.Runtime.InteropServices; + +namespace SystemTrayMenu.Helper +{ + public class WindowToTop + { + [DllImport("user32.dll")] + static extern bool IsIconic(IntPtr hWnd); + + //DLL's for ForceForgroundWindow + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] + private static extern IntPtr GetForegroundWindow(); + [DllImport("user32.dll")] + public static extern uint GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId); + [DllImport("kernel32.dll")] + public static extern uint GetCurrentThreadId(); + [DllImport("user32.dll")] + public static extern bool AttachThreadInput(uint idAttach, uint idAttachTo, bool fAttach); + [DllImport("user32.dll", SetLastError = true)] + public static extern bool BringWindowToTop(IntPtr hWnd); + //[DllImport("user32.dll", SetLastError = true)] + //public static extern bool BringWindowToTop(HandleRef hWnd); + [DllImport("user32.dll")] + public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); + + const int SW_RESTORE = 9; + + public static void ForceProcessToForeground(string processName) + { + Process[] proc = Process.GetProcessesByName(processName); + ForceForegroundWindow(proc[0].MainWindowHandle); + } + public static void ForceForegroundWindow(IntPtr hWnd) + { + uint foreThread = GetWindowThreadProcessId(GetForegroundWindow(), IntPtr.Zero); + uint appThread = GetCurrentThreadId(); + const int SW_SHOW = 5; + + int cmdShow = SW_SHOW; + + if (IsIconic(hWnd)) + { + cmdShow = SW_RESTORE; + } + + if (foreThread != appThread) + { + AttachThreadInput(foreThread, appThread, true); + BringWindowToTop(hWnd); + ShowWindow(hWnd, cmdShow); + AttachThreadInput(foreThread, appThread, false); + } + else + { + BringWindowToTop(hWnd); + ShowWindow(hWnd, cmdShow); + } + } + } +} \ No newline at end of file diff --git a/Helper/FadeForm.cs b/Helper/FadeForm.cs new file mode 100644 index 0000000..a0f109f --- /dev/null +++ b/Helper/FadeForm.cs @@ -0,0 +1,169 @@ +using System; +using System.Runtime.InteropServices; +using System.Windows.Forms; + +namespace SystemTrayMenu +{ + public class FadeForm : IDisposable + { + public bool IsFadingIn + { + get + { + return timerFadeIn.Enabled; + } + } + + public bool IsFadingOut + { + get + { + return timerFadeOut.Enabled; + } + } + + Timer timerFadeIn = new Timer(); + Timer timerFadeOut = new Timer(); + Timer timerFadeHalf = new Timer(); + + Form form = null; + bool stopFadeInByHalf = false; + + public FadeForm(Form form) + { + this.form = form; + timerFadeIn.Interval = MenuDefines.IntervalFade; + timerFadeOut.Interval = MenuDefines.IntervalFade; + timerFadeHalf.Interval = MenuDefines.IntervalFade; + timerFadeIn.Tick += TimerFadeIn_Tick; + timerFadeOut.Tick += TimerFadeOut_Tick; + timerFadeHalf.Tick += TimerFadeHalf_Tick; + } + + public void Dispose() + { + Dispose(true); + } + + protected virtual void Dispose(bool disposing) + { + if (disposing) + { + timerFadeIn.Dispose(); + timerFadeOut.Dispose(); + timerFadeHalf.Dispose(); + } + } + + public void FadeOut() + { + timerFadeHalf.Stop(); + timerFadeIn.Stop(); + timerFadeOut.Start(); + } + + public void FadeHalf() + { + if (form.Visible && + form.Opacity < MenuDefines.OpacityHalfValue) + { + stopFadeInByHalf = true; + timerFadeOut.Stop(); + timerFadeHalf.Stop(); + timerFadeIn.Start(); + } + else + { + timerFadeIn.Stop(); + timerFadeOut.Stop(); + timerFadeHalf.Start(); + } + } + + public void FadeIn() + { + stopFadeInByHalf = false; + if (form.Visible) + { + timerFadeOut.Stop(); + timerFadeHalf.Stop(); + timerFadeIn.Start(); + } + else + { + ShowInactiveTopmost(form); + timerFadeOut.Stop(); + timerFadeIn.Start(); + } + } + + private void TimerFadeIn_Tick(object sender, EventArgs e) + { + if (form.Opacity >= 1 || + (stopFadeInByHalf && form.Opacity >= MenuDefines.OpacityHalfValue)) + { + if (stopFadeInByHalf) + { + form.Opacity = MenuDefines.OpacityHalfValue; + stopFadeInByHalf = false; + } + timerFadeIn.Stop(); + } + else + { + form.Opacity += MenuDefines.OpacityInStep; + } + } + + private void TimerFadeOut_Tick(object sender, EventArgs e) + { + if (form.Opacity < 0.01) + { + form.Hide(); + timerFadeOut.Stop(); + } + else + { + form.Opacity -= MenuDefines.OpacityOutStep; + } + } + + private void TimerFadeHalf_Tick(object sender, EventArgs e) + { + if (form.Opacity <= MenuDefines.OpacityHalfValue) + { + form.Opacity = MenuDefines.OpacityHalfValue; + timerFadeHalf.Stop(); + } + else + { + form.Opacity -= MenuDefines.OpacityHalfStep; + } + } + + private const int SW_SHOWNOACTIVATE = 4; + private const int HWND_TOPMOST = -1; + private const uint SWP_NOACTIVATE = 0x0010; + + [DllImport("user32.dll", EntryPoint = "SetWindowPos")] + static extern bool SetWindowPos( + int hWnd, // Window handle + int hWndInsertAfter, // Placement-order handle + int X, // Horizontal position + int Y, // Vertical position + int cx, // Width + int cy, // Height + uint uFlags); // Window positioning flags + + [DllImport("user32.dll")] + static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); + + static void ShowInactiveTopmost(Form frm) + { + ShowWindow(frm.Handle, SW_SHOWNOACTIVATE); + SetWindowPos(frm.Handle.ToInt32(), HWND_TOPMOST, + frm.Left, frm.Top, frm.Width, frm.Height, + SWP_NOACTIVATE); + } + } +} \ No newline at end of file diff --git a/Helper/File/FileIni.cs b/Helper/File/FileIni.cs new file mode 100644 index 0000000..6fc2fc3 --- /dev/null +++ b/Helper/File/FileIni.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +namespace SystemTrayMenu.Helper +{ + public class FileIni + { + Dictionary values; + public FileIni(string path) + { + values = File.ReadLines(path) + .Where(line => (!String.IsNullOrWhiteSpace(line) && !line.StartsWith("#"))) + .Select(line => line.Split(new char[] { '=' }, 2, 0)) + .ToDictionary(parts => parts[0].Trim(), parts => parts.Length > 1 ? parts[1].Trim() : null); + } + public string Value(string name, string value = null) + { + if (values != null && values.ContainsKey(name)) + { + return values[name]; + } + return value; + } + } +} diff --git a/Helper/File/FileLnk.cs b/Helper/File/FileLnk.cs new file mode 100644 index 0000000..538d9f4 --- /dev/null +++ b/Helper/File/FileLnk.cs @@ -0,0 +1,218 @@ +using System; +using System.IO; +using System.Runtime.InteropServices; +using System.Text; + +namespace SystemTrayMenu +{ + class LnkHelper + { + #region Signitures imported from http://pinvoke.net + + [DllImport("shfolder.dll", CharSet = CharSet.Auto)] + internal static extern int SHGetFolderPath(IntPtr hwndOwner, int nFolder, IntPtr hToken, int dwFlags, StringBuilder lpszPath); + + [Flags()] + enum SLGP_FLAGS + { + /// Retrieves the standard short (8.3 format) file name + SLGP_SHORTPATH = 0x1, + /// Retrieves the Universal Naming Convention (UNC) path name of the file + SLGP_UNCPRIORITY = 0x2, + /// Retrieves the raw path name. A raw path is something that might not exist and may include environment variables that need to be expanded + SLGP_RAWPATH = 0x4 + } + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] + struct WIN32_FIND_DATAW + { + public uint dwFileAttributes; + public long ftCreationTime; + public long ftLastAccessTime; + public long ftLastWriteTime; + public uint nFileSizeHigh; + public uint nFileSizeLow; + public uint dwReserved0; + public uint dwReserved1; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] + public string cFileName; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)] + public string cAlternateFileName; + } + + [Flags()] + enum SLR_FLAGS + { + /// + /// Do not display a dialog box if the link cannot be resolved. When SLR_NO_UI is set, + /// the high-order word of fFlags can be set to a time-out value that specifies the + /// maximum amount of time to be spent resolving the link. The function returns if the + /// link cannot be resolved within the time-out duration. If the high-order word is set + /// to zero, the time-out duration will be set to the default value of 3,000 milliseconds + /// (3 seconds). To specify a value, set the high word of fFlags to the desired time-out + /// duration, in milliseconds. + /// + SLR_NO_UI = 0x1, + /// Obsolete and no longer used + SLR_ANY_MATCH = 0x2, + /// If the link object has changed, update its path and list of identifiers. + /// If SLR_UPDATE is set, you do not need to call IPersistFile::IsDirty to determine + /// whether or not the link object has changed. + SLR_UPDATE = 0x4, + /// Do not update the link information + SLR_NOUPDATE = 0x8, + /// Do not execute the search heuristics + SLR_NOSEARCH = 0x10, + /// Do not use distributed link tracking + SLR_NOTRACK = 0x20, + /// Disable distributed link tracking. By default, distributed link tracking tracks + /// removable media across multiple devices based on the volume name. It also uses the + /// Universal Naming Convention (UNC) path to track remote file systems whose drive letter + /// has changed. Setting SLR_NOLINKINFO disables both types of tracking. + SLR_NOLINKINFO = 0x40, + /// Call the Microsoft Windows Installer + SLR_INVOKE_MSI = 0x80 + } + + /// The IShellLink interface allows Shell links to be created, modified, and resolved + [ComImport(), InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("000214F9-0000-0000-C000-000000000046")] + interface IShellLinkW + { + /// Retrieves the path and file name of a Shell link object + void GetPath([Out(), MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszFile, int cchMaxPath, out WIN32_FIND_DATAW pfd, SLGP_FLAGS fFlags); + /// Retrieves the list of item identifiers for a Shell link object + void GetIDList(out IntPtr ppidl); + /// Sets the pointer to an item identifier list (PIDL) for a Shell link object. + void SetIDList(IntPtr pidl); + /// Retrieves the description string for a Shell link object + void GetDescription([Out(), MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszName, int cchMaxName); + /// Sets the description for a Shell link object. The description can be any application-defined string + void SetDescription([MarshalAs(UnmanagedType.LPWStr)] string pszName); + /// Retrieves the name of the working directory for a Shell link object + void GetWorkingDirectory([Out(), MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszDir, int cchMaxPath); + /// Sets the name of the working directory for a Shell link object + void SetWorkingDirectory([MarshalAs(UnmanagedType.LPWStr)] string pszDir); + /// Retrieves the command-line arguments associated with a Shell link object + void GetArguments([Out(), MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszArgs, int cchMaxPath); + /// Sets the command-line arguments for a Shell link object + void SetArguments([MarshalAs(UnmanagedType.LPWStr)] string pszArgs); + /// Retrieves the hot key for a Shell link object + void GetHotkey(out short pwHotkey); + /// Sets a hot key for a Shell link object + void SetHotkey(short wHotkey); + /// Retrieves the show command for a Shell link object + void GetShowCmd(out int piShowCmd); + /// Sets the show command for a Shell link object. The show command sets the initial show state of the window. + void SetShowCmd(int iShowCmd); + /// Retrieves the location (path and index) of the icon for a Shell link object + void GetIconLocation([Out(), MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszIconPath, + int cchIconPath, out int piIcon); + /// Sets the location (path and index) of the icon for a Shell link object + void SetIconLocation([MarshalAs(UnmanagedType.LPWStr)] string pszIconPath, int iIcon); + /// Sets the relative path to the Shell link object + void SetRelativePath([MarshalAs(UnmanagedType.LPWStr)] string pszPathRel, int dwReserved); + /// Attempts to find the target of a Shell link, even if it has been moved or renamed + void Resolve(IntPtr hwnd, SLR_FLAGS fFlags); + /// Sets the path and file name of a Shell link object + void SetPath([MarshalAs(UnmanagedType.LPWStr)] string pszFile); + + } + + [ComImport, Guid("0000010c-0000-0000-c000-000000000046"), + InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + public interface IPersist + { + [PreserveSig] + void GetClassID(out Guid pClassID); + } + + [ComImport, Guid("0000010b-0000-0000-C000-000000000046"), + InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + public interface IPersistFile : IPersist + { + new void GetClassID(out Guid pClassID); + [PreserveSig] + int IsDirty(); + + [PreserveSig] + void Load([In, MarshalAs(UnmanagedType.LPWStr)] + string pszFileName, uint dwMode); + + [PreserveSig] + void Save([In, MarshalAs(UnmanagedType.LPWStr)] string pszFileName, + [In, MarshalAs(UnmanagedType.Bool)] bool fRemember); + + [PreserveSig] + void SaveCompleted([In, MarshalAs(UnmanagedType.LPWStr)] string pszFileName); + + [PreserveSig] + void GetCurFile([In, MarshalAs(UnmanagedType.LPWStr)] string ppszFileName); + } + + const uint STGM_READ = 0; + const int MAX_PATH = 260; + + // CLSID_ShellLink from ShlGuid.h + [ + ComImport(), + Guid("00021401-0000-0000-C000-000000000046") + ] + public class ShellLink + { + } + + #endregion + + public static string ResolveShortcut(string filename) + { + ShellLink link = new ShellLink(); + ((IPersistFile)link).Load(filename, STGM_READ); + // TODO: if I can get hold of the hwnd call resolve first. This handles moved and renamed files. + // ((IShellLinkW)link).Resolve(hwnd, 0) + StringBuilder sb = new StringBuilder(MAX_PATH); + WIN32_FIND_DATAW data = new WIN32_FIND_DATAW(); + ((IShellLinkW)link).GetPath(sb, sb.Capacity, out data, 0); + string resolvedPath = sb.ToString(); + if (!IsDirectory(resolvedPath) && + !File.Exists(resolvedPath)) + { + //For some lnk e.g. WinRar SkypeForBuisness + //resolved path wrong to Program Files (x86) + resolvedPath = ReplaceFirst(resolvedPath, + @"\Program Files (x86)\", + @"\Program Files\"); + if (!File.Exists(resolvedPath)) + { + resolvedPath = string.Empty; + } + } + return resolvedPath; + } + + public static bool IsDirectory(string filePath) + { + bool isDirectory = false; + if (Directory.Exists(filePath)) + { + FileAttributes attr = File.GetAttributes(filePath); + if ((attr & FileAttributes.Directory) == FileAttributes.Directory) + { + isDirectory = true; + } + } + + return isDirectory; + } + + public static string ReplaceFirst(string text, string search, string replace) + { + int pos = text.IndexOf(search); + if (pos < 0) + { + return text; + } + return text.Substring(0, pos) + replace + + text.Substring(pos + search.Length); + } + } +} \ No newline at end of file diff --git a/Helper/File/FileUrl.cs b/Helper/File/FileUrl.cs new file mode 100644 index 0000000..7dfdaef --- /dev/null +++ b/Helper/File/FileUrl.cs @@ -0,0 +1,65 @@ +using Microsoft.Win32; +using System; + +namespace SystemTrayMenu.Helper +{ + public class FileUrl + { + private static string browserPath = string.Empty; + public static string GetDefaultBrowserPath() + { + string urlAssociation = @"Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http"; + string browserPathKey = @"$BROWSER$\shell\open\command"; + + RegistryKey userChoiceKey = null; + string browserPath = FileUrl.browserPath; + + if (string.IsNullOrEmpty(browserPath)) + { + //Read default browser path from userChoiceLKey + userChoiceKey = Registry.CurrentUser.OpenSubKey(urlAssociation + @"\UserChoice", false); + + //If user choice was not found, try machine default + if (userChoiceKey == null) + { + //Read default browser path from Win XP registry key + var browserKey = Registry.ClassesRoot.OpenSubKey(@"HTTP\shell\open\command", false); + + //If browser path wasn’t found, try Win Vista (and newer) registry key + if (browserKey == null) + { + browserKey = + Registry.CurrentUser.OpenSubKey( + urlAssociation, false); + } + var path = CleanifyBrowserPath(browserKey.GetValue(null) as string); + browserKey.Close(); + return path; + } + else + { + // user defined browser choice was found + string progId = (userChoiceKey.GetValue("ProgId").ToString()); + userChoiceKey.Close(); + + // now look up the path of the executable + string concreteBrowserKey = browserPathKey.Replace("$BROWSER$", progId); + var kp = Registry.ClassesRoot.OpenSubKey(concreteBrowserKey, false); + browserPath = CleanifyBrowserPath(kp.GetValue(null) as string); + kp.Close(); + } + + FileUrl.browserPath = browserPath; + } + + return browserPath; + } + + private static string CleanifyBrowserPath(string p) + { + string[] url = p.Split('"'); + string clean = url[1]; + return clean; + } + } +} diff --git a/Helper/File/IconReader.cs b/Helper/File/IconReader.cs new file mode 100644 index 0000000..7b02cf8 --- /dev/null +++ b/Helper/File/IconReader.cs @@ -0,0 +1,299 @@ +using Clearcove.Logging; +using System; +using System.Drawing; +using System.Runtime.InteropServices; + +namespace SystemTrayMenu.Helper +{ + // from https://www.codeproject.com/Articles/2532/Obtaining-and-managing-file-and-folder-icons-using + // added ImageList_GetIcon + + /// + /// Provides static methods to read system icons for both folders and files. + /// + /// + /// IconReader.GetFileIcon("c:\\general.xls"); + /// + public class IconReader + { + /// + /// Options to specify the size of icons to return. + /// + public enum IconSize + { + /// + /// Specify large icon - 32 pixels by 32 pixels. + /// + Large = 0, + /// + /// Specify small icon - 16 pixels by 16 pixels. + /// + Small = 1 + } + + /// + /// Options to specify whether folders should be in the open or closed state. + /// + public enum FolderType + { + /// + /// Specify open folder. + /// + Open = 0, + /// + /// Specify closed folder. + /// + Closed = 1 + } + + /// + /// Returns an icon for a given file - indicated by the name parameter. + /// + /// System.Drawing.Icon + public static Icon GetFileIcon(string filePath, bool linkOverlay, + IconSize size = IconSize.Small) + { + Shell32.SHFILEINFO shfi = new Shell32.SHFILEINFO(); + uint flags = Shell32.SHGFI_ICON | Shell32.SHGFI_SYSICONINDEX; + + //MH: Removed, otherwise wrong icon + // | Shell32.SHGFI_USEFILEATTRIBUTES ; + + if (true == linkOverlay) flags += Shell32.SHGFI_LINKOVERLAY; + + /* Check the size specified for return. */ + if (IconSize.Small == size) + { + flags += Shell32.SHGFI_SMALLICON; + } + else + { + flags += Shell32.SHGFI_LARGEICON; + } + + IntPtr hImageList = Shell32.SHGetFileInfo(filePath, + Shell32.FILE_ATTRIBUTE_NORMAL, + ref shfi, + (uint)System.Runtime.InteropServices.Marshal.SizeOf(shfi), + flags); + + Icon icon = null; + if (linkOverlay) + { + //MH: Added try catch, FromHandle can fail + try + { + // Copy (clone) the returned icon to a new object, thus allowing us to clean-up properly + icon = (Icon)Icon.FromHandle(shfi.hIcon).Clone(); + } + catch (Exception ex) + { + Logger log = new Logger(nameof(IconReader)); + log.Info($"filePath:'{filePath}'"); + log.Error($"{ex.ToString()}"); + } + } + else + { + //MH: Added ImageList_GetIcon, to get the correct icon from .ink without overlay + IntPtr hIcon = Shell32.ImageList_GetIcon(hImageList, shfi.iIcon, Shell32.ILD_TRANSPARENT); + + //MH: Added try catch, FromHandle can fail + try + { + icon = (Icon)Icon.FromHandle(hIcon).Clone(); + } + catch (Exception ex) + { + Logger log = new Logger(nameof(IconReader)); + log.Info($"filePath:'{filePath}'"); + log.Error($"{ex.ToString()}"); + } + + // Additionally Cleanup + User32.DestroyIcon(hIcon); + } + + // Cleanup + User32.DestroyIcon(shfi.hIcon); + return icon; + } + + public static Icon GetFolderIcon(string directoryPath, + FolderType folderType, bool linkOverlay, + IconSize size = IconSize.Small) + { + // Need to add size check, although errors generated at present! + //uint flags = Shell32.SHGFI_ICON | Shell32.SHGFI_USEFILEATTRIBUTES; + + //MH: Removed SHGFI_USEFILEATTRIBUTES, otherwise was wrong folder icon + uint flags = Shell32.SHGFI_ICON; // | Shell32.SHGFI_USEFILEATTRIBUTES; + + if (true == linkOverlay) flags += Shell32.SHGFI_LINKOVERLAY; + + if (FolderType.Open == folderType) + { + flags += Shell32.SHGFI_OPENICON; + } + + if (IconSize.Small == size) + { + flags += Shell32.SHGFI_SMALLICON; + } + else + { + flags += Shell32.SHGFI_LARGEICON; + } + + // Get the folder icon + Shell32.SHFILEINFO shfi = new Shell32.SHFILEINFO(); + Shell32.SHGetFileInfo(directoryPath, + Shell32.FILE_ATTRIBUTE_DIRECTORY, + ref shfi, + (uint)Marshal.SizeOf(shfi), + flags); + + //MH: Added try catch, FromHandle can fail + Icon icon = null; + try + { + Icon.FromHandle(shfi.hIcon); // Load the icon from an HICON handle + + // Now clone the icon, so that it can be successfully stored in an ImageList + icon = (Icon)Icon.FromHandle(shfi.hIcon).Clone(); + + User32.DestroyIcon(shfi.hIcon); // Cleanup + } + catch (Exception ex) + { + Logger log = new Logger(nameof(IconReader)); + log.Info($"directoryPath:'{directoryPath}'"); + log.Error($"{ex.ToString()}"); + } + return icon; + } + } + + /// + /// Wraps necessary Shell32.dll structures and functions required to retrieve Icon Handles using SHGetFileInfo. Code + /// courtesy of MSDN Cold Rooster Consulting case study. + /// + /// + + // This code has been left largely untouched from that in the CRC example. The main changes have been moving + // the icon reading code over to the IconReader type. + public class Shell32 + { + + public const int MAX_PATH = 256; + [StructLayout(LayoutKind.Sequential)] + public struct SHITEMID + { + public ushort cb; + [MarshalAs(UnmanagedType.LPArray)] + public byte[] abID; + } + + [StructLayout(LayoutKind.Sequential)] + public struct ITEMIDLIST + { + public SHITEMID mkid; + } + + [StructLayout(LayoutKind.Sequential)] + public struct BROWSEINFO + { + public IntPtr hwndOwner; + public IntPtr pidlRoot; + public IntPtr pszDisplayName; + [MarshalAs(UnmanagedType.LPTStr)] + public string lpszTitle; + public uint ulFlags; + public IntPtr lpfn; + public int lParam; + public IntPtr iImage; + } + + // Browsing for directory. + public const uint BIF_RETURNONLYFSDIRS = 0x0001; + public const uint BIF_DONTGOBELOWDOMAIN = 0x0002; + public const uint BIF_STATUSTEXT = 0x0004; + public const uint BIF_RETURNFSANCESTORS = 0x0008; + public const uint BIF_EDITBOX = 0x0010; + public const uint BIF_VALIDATE = 0x0020; + public const uint BIF_NEWDIALOGSTYLE = 0x0040; + public const uint BIF_USENEWUI = (BIF_NEWDIALOGSTYLE | BIF_EDITBOX); + public const uint BIF_BROWSEINCLUDEURLS = 0x0080; + public const uint BIF_BROWSEFORCOMPUTER = 0x1000; + public const uint BIF_BROWSEFORPRINTER = 0x2000; + public const uint BIF_BROWSEINCLUDEFILES = 0x4000; + public const uint BIF_SHAREABLE = 0x8000; + + [StructLayout(LayoutKind.Sequential)] + public struct SHFILEINFO + { + public const int NAMESIZE = 80; + public IntPtr hIcon; + public int iIcon; + public uint dwAttributes; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_PATH)] + public string szDisplayName; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = NAMESIZE)] + public string szTypeName; + }; + + public const uint SHGFI_ICON = 0x000000100; // get icon + public const uint SHGFI_DISPLAYNAME = 0x000000200; // get display name + public const uint SHGFI_TYPENAME = 0x000000400; // get type name + public const uint SHGFI_ATTRIBUTES = 0x000000800; // get attributes + public const uint SHGFI_ICONLOCATION = 0x000001000; // get icon location + public const uint SHGFI_EXETYPE = 0x000002000; // return exe type + public const uint SHGFI_SYSICONINDEX = 0x000004000; // get system icon index + public const uint SHGFI_LINKOVERLAY = 0x000008000; // put a link overlay on icon + public const uint SHGFI_SELECTED = 0x000010000; // show icon in selected state + public const uint SHGFI_ATTR_SPECIFIED = 0x000020000; // get only specified attributes + public const uint SHGFI_LARGEICON = 0x000000000; // get large icon + public const uint SHGFI_SMALLICON = 0x000000001; // get small icon + public const uint SHGFI_OPENICON = 0x000000002; // get open icon + public const uint SHGFI_SHELLICONSIZE = 0x000000004; // get shell size icon + public const uint SHGFI_PIDL = 0x000000008; // pszPath is a pidl + public const uint SHGFI_USEFILEATTRIBUTES = 0x000000010; // use passed dwFileAttribute + public const uint SHGFI_ADDOVERLAYS = 0x000000020; // apply the appropriate overlays + public const uint SHGFI_OVERLAYINDEX = 0x000000040; // Get the index of the overlay + + public const uint FILE_ATTRIBUTE_DIRECTORY = 0x00000010; + public const uint FILE_ATTRIBUTE_NORMAL = 0x00000080; + + public const int ILD_TRANSPARENT = 0x00000001; + + [DllImport("Shell32.dll")] + public static extern IntPtr SHGetFileInfo( + string pszPath, + uint dwFileAttributes, + ref SHFILEINFO psfi, + uint cbFileInfo, + uint uFlags + ); + + [DllImport("comctl32")] + internal static extern IntPtr ImageList_GetIcon( + IntPtr himl, + int i, + int flags); + } + + /// + /// Wraps necessary functions imported from User32.dll. Code courtesy of MSDN Cold Rooster Consulting example. + /// + public class User32 + { + /// + /// Provides access to function required to delete handle. This method is used internally + /// and is not required to be called separately. + /// + /// Pointer to icon handle. + /// N/A + [DllImport("User32.dll")] + public static extern int DestroyIcon(IntPtr hIcon); + } +} \ No newline at end of file diff --git a/Helper/KeyboardHook.cs b/Helper/KeyboardHook.cs new file mode 100644 index 0000000..85e9b27 --- /dev/null +++ b/Helper/KeyboardHook.cs @@ -0,0 +1,148 @@ +using System; +using System.Runtime.InteropServices; +using System.Windows.Forms; + +namespace SystemTrayMenu.Helper +{ + public sealed class KeyboardHook : IDisposable + { + // Registers a hot key with Windows. + [DllImport("user32.dll")] + private static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk); + // Unregisters the hot key with Windows. + [DllImport("user32.dll")] + private static extern bool UnregisterHotKey(IntPtr hWnd, int id); + + /// + /// Represents the window that is used internally to get the messages. + /// + private class Window : NativeWindow, IDisposable + { + private static int WM_HOTKEY = 0x0312; + + public Window() + { + // create the handle for the window. + this.CreateHandle(new CreateParams()); + } + + /// + /// Overridden to get the notifications. + /// + /// + protected override void WndProc(ref Message m) + { + base.WndProc(ref m); + + // check if we got a hot key pressed. + if (m.Msg == WM_HOTKEY) + { + // get the keys. + Keys key = (Keys)(((int)m.LParam >> 16) & 0xFFFF); + KeyboardHookModifierKeys modifier = (KeyboardHookModifierKeys)((int)m.LParam & 0xFFFF); + + // invoke the event to notify the parent. + if (KeyPressed != null) + KeyPressed(this, new KeyPressedEventArgs(modifier, key)); + } + } + + public event EventHandler KeyPressed; + + #region IDisposable Members + + public void Dispose() + { + this.DestroyHandle(); + } + + #endregion + } + + private Window _window = new Window(); + private int _currentId; + + public KeyboardHook() + { + // register the event of the inner native window. + _window.KeyPressed += delegate (object sender, KeyPressedEventArgs args) + { + if (KeyPressed != null) + KeyPressed(this, args); + }; + } + + /// + /// Registers a hot key in the system. + /// + /// The modifiers that are associated with the hot key. + /// The key itself that is associated with the hot key. + public void RegisterHotKey(KeyboardHookModifierKeys modifier, Keys key) + { + // increment the counter. + _currentId = _currentId + 1; + + // register the hot key. + if (!RegisterHotKey(_window.Handle, _currentId, (uint)modifier, (uint)key)) + throw new InvalidOperationException("Couldn’t register the hot key."); + } + + /// + /// A hot key has been pressed. + /// + public event EventHandler KeyPressed; + + #region IDisposable Members + + public void Dispose() + { + // unregister all the registered hot keys. + for (int i = _currentId; i > 0; i--) + { + UnregisterHotKey(_window.Handle, i); + } + + // dispose the inner native window. + _window.Dispose(); + } + + #endregion + } + + /// + /// Event Args for the event that is fired after the hot key has been pressed. + /// + public class KeyPressedEventArgs : EventArgs + { + private KeyboardHookModifierKeys _modifier; + private Keys _key; + + internal KeyPressedEventArgs(KeyboardHookModifierKeys modifier, Keys key) + { + _modifier = modifier; + _key = key; + } + + public KeyboardHookModifierKeys Modifier + { + get { return _modifier; } + } + + public Keys Key + { + get { return _key; } + } + } + + /// + /// The enumeration of possible modifiers. + /// + [Flags] + public enum KeyboardHookModifierKeys : uint + { + Alt = 1, + Control = 2, + Shift = 4, + Win = 8 + } +} diff --git a/Helper/MessageFilter.cs b/Helper/MessageFilter.cs new file mode 100644 index 0000000..916ae87 --- /dev/null +++ b/Helper/MessageFilter.cs @@ -0,0 +1,33 @@ +using System.Windows.Forms; + +namespace SystemTrayMenu +{ + public delegate void EventHandler(); + + class MessageFilter : IMessageFilter + { + const int WM_MOUSELEAVE = 0x02A3; + const int WM_MOUSEMOVE = 0x0200; + const int WM_NCMOUSEMOVE = 0x00A0; + public event EventHandler MouseLeave; + public event EventHandler MouseMove; + public event EventHandler ScrollBarMouseMove; + + public bool PreFilterMessage(ref Message message) + { + if (message.Msg == WM_MOUSELEAVE) + { + MouseLeave?.Invoke(); + } + else if (message.Msg == WM_MOUSEMOVE) + { + MouseMove?.Invoke(); + } + else if (message.Msg == WM_NCMOUSEMOVE) + { + ScrollBarMouseMove?.Invoke(); + } + return false; + } + } +} diff --git a/Helper/ScreenMouse.cs b/Helper/ScreenMouse.cs new file mode 100644 index 0000000..76a6253 --- /dev/null +++ b/Helper/ScreenMouse.cs @@ -0,0 +1,30 @@ +using System.Drawing; +using System.Windows.Forms; + +namespace SystemTrayMenu.Helper +{ + public class ScreenMouse + { + public static Screen GetScreen() + { + return Screen.PrimaryScreen; + // Maybe we need for later feature + // Show on mouse position + //return GetScreenFromMousePosition( + // Cursor.Position.X, Cursor.Position.Y); + } + + //public static Screen GetScreenFromMousePosition(int x, int y) + //{ + // Screen clickedScreen = null; + // foreach (Screen screen in Screen.AllScreens) + // { + // if (screen.Bounds.Contains(new Point(x, y))) + // { + // clickedScreen = screen; + // } + // } + // return clickedScreen; + //} + } +} diff --git a/Helper/ShellContextMenu.cs b/Helper/ShellContextMenu.cs new file mode 100644 index 0000000..5dfe196 --- /dev/null +++ b/Helper/ShellContextMenu.cs @@ -0,0 +1,1640 @@ +using System; +using System.Drawing; +using System.IO; +using System.Runtime.InteropServices; +using System.Text; +using System.Windows.Forms; + +namespace SystemTrayMenu.Helper +{ + /// + /// "Stand-alone" shell context menu + /// + /// It isn't really debugged but is mostly working. + /// Create an instance and call ShowContextMenu with a list of FileInfo for the files. + /// Limitation is that it only handles files in the same directory but it can be fixed + /// by changing the way files are translated into PIDLs. + /// + /// Based on FileBrowser in C# from CodeProject + /// http://www.codeproject.com/useritems/FileBrowser.asp + /// + /// Hooking class taken from MSDN Magazine Cutting Edge column + /// http://msdn.microsoft.com/msdnmag/issues/02/10/CuttingEdge/ + /// + /// Andreas Johansson + /// afjohansson@hotmail.com + /// http://afjohansson.spaces.live.com + /// + /// + /// ShellContextMenu scm = new ShellContextMenu(); + /// FileInfo[] files = new FileInfo[1]; + /// files[0] = new FileInfo(@"c:\windows\notepad.exe"); + /// scm.ShowContextMenu(this.Handle, files, Cursor.Position); + /// + public class ShellContextMenu : NativeWindow + { + #region Constructor + /// Default constructor + public ShellContextMenu() + { + this.CreateHandle(new CreateParams()); + } + #endregion + + #region Destructor + /// Ensure all resources get released + ~ShellContextMenu() + { + ReleaseAll(); + } + #endregion + + #region GetContextMenuInterfaces() + /// Gets the interfaces to the context menu + /// Parent folder + /// PIDLs + /// true if it got the interfaces, otherwise false + private bool GetContextMenuInterfaces(IShellFolder oParentFolder, IntPtr[] arrPIDLs, out IntPtr ctxMenuPtr) + { + int nResult = oParentFolder.GetUIObjectOf( + IntPtr.Zero, + (uint)arrPIDLs.Length, + arrPIDLs, + ref IID_IContextMenu, + IntPtr.Zero, + out ctxMenuPtr); + + if (S_OK == nResult) + { + _oContextMenu = (IContextMenu)Marshal.GetTypedObjectForIUnknown(ctxMenuPtr, typeof(IContextMenu)); + + /*IntPtr pUnknownContextMenu2 = IntPtr.Zero; + if (S_OK == Marshal.QueryInterface(pUnknownContextMenu, ref IID_IContextMenu2, out pUnknownContextMenu2)) + { + _oContextMenu2 = (IContextMenu2)Marshal.GetTypedObjectForIUnknown(pUnknownContextMenu2, typeof(IContextMenu2)); + } + IntPtr pUnknownContextMenu3 = IntPtr.Zero; + if (S_OK == Marshal.QueryInterface(pUnknownContextMenu, ref IID_IContextMenu3, out pUnknownContextMenu3)) + { + _oContextMenu3 = (IContextMenu3)Marshal.GetTypedObjectForIUnknown(pUnknownContextMenu3, typeof(IContextMenu3)); + }*/ + + return true; + } + else + { + ctxMenuPtr = IntPtr.Zero; + _oContextMenu = null; + return false; + } + } + #endregion + + #region Override + + /// + /// This method receives WindowMessages. It will make the "Open With" and "Send To" work + /// by calling HandleMenuMsg and HandleMenuMsg2. It will also call the OnContextMenuMouseHover + /// method of Browser when hovering over a ContextMenu item. + /// + /// the Message of the Browser's WndProc + /// true if the message has been handled, false otherwise + protected override void WndProc(ref Message m) + { + #region IContextMenu + + if (_oContextMenu != null && + m.Msg == (int)WM.MENUSELECT && + ((int)ShellHelper.HiWord(m.WParam) & (int)MFT.SEPARATOR) == 0 && + ((int)ShellHelper.HiWord(m.WParam) & (int)MFT.POPUP) == 0) + { + string info = string.Empty; + + if (ShellHelper.LoWord(m.WParam) == (int)CMD_CUSTOM.ExpandCollapse) + info = "Expands or collapses the current selected item"; + else + { + info = "";/* ContextMenuHelper.GetCommandString( + _oContextMenu, + ShellHelper.LoWord(m.WParam) - CMD_FIRST, + false);*/ + } + + //br.OnContextMenuMouseHover(new ContextMenuMouseHoverEventArgs(info.ToString())); + } + + #endregion + + #region IContextMenu2 + + if (_oContextMenu2 != null && + (m.Msg == (int)WM.INITMENUPOPUP || + m.Msg == (int)WM.MEASUREITEM || + m.Msg == (int)WM.DRAWITEM)) + { + if (_oContextMenu2.HandleMenuMsg( + (uint)m.Msg, m.WParam, m.LParam) == S_OK) + return; + } + + #endregion + + #region IContextMenu3 + + if (_oContextMenu3 != null && + m.Msg == (int)WM.MENUCHAR) + { + if (_oContextMenu3.HandleMenuMsg2( + (uint)m.Msg, m.WParam, m.LParam, IntPtr.Zero) == S_OK) + return; + } + + #endregion + + base.WndProc(ref m); + } + + #endregion + + #region InvokeCommand + private void InvokeCommand(IContextMenu oContextMenu, uint nCmd, string strFolder, Point pointInvoke) + { + CMINVOKECOMMANDINFOEX invoke = new CMINVOKECOMMANDINFOEX(); + invoke.cbSize = cbInvokeCommand; + invoke.lpVerb = (IntPtr)(nCmd - CMD_FIRST); + invoke.lpDirectory = strFolder; + invoke.lpVerbW = (IntPtr)(nCmd - CMD_FIRST); + invoke.lpDirectoryW = strFolder; + invoke.fMask = CMIC.UNICODE | CMIC.PTINVOKE | + ((Control.ModifierKeys & Keys.Control) != 0 ? CMIC.CONTROL_DOWN : 0) | + ((Control.ModifierKeys & Keys.Shift) != 0 ? CMIC.SHIFT_DOWN : 0); + invoke.ptInvoke = new POINT(pointInvoke.X, pointInvoke.Y); + invoke.nShow = SW.SHOWNORMAL; + + oContextMenu.InvokeCommand(ref invoke); + } + #endregion + + #region ReleaseAll() + /// + /// Release all allocated interfaces, PIDLs + /// + private void ReleaseAll() + { + if (null != _oContextMenu) + { + Marshal.ReleaseComObject(_oContextMenu); + _oContextMenu = null; + } + if (null != _oContextMenu2) + { + Marshal.ReleaseComObject(_oContextMenu2); + _oContextMenu2 = null; + } + if (null != _oContextMenu3) + { + Marshal.ReleaseComObject(_oContextMenu3); + _oContextMenu3 = null; + } + if (null != _oDesktopFolder) + { + Marshal.ReleaseComObject(_oDesktopFolder); + _oDesktopFolder = null; + } + if (null != _oParentFolder) + { + Marshal.ReleaseComObject(_oParentFolder); + _oParentFolder = null; + } + if (null != _arrPIDLs) + { + FreePIDLs(_arrPIDLs); + _arrPIDLs = null; + } + } + #endregion + + #region GetDesktopFolder() + /// + /// Gets the desktop folder + /// + /// IShellFolder for desktop folder + private IShellFolder GetDesktopFolder() + { + IntPtr pUnkownDesktopFolder = IntPtr.Zero; + + if (null == _oDesktopFolder) + { + // Get desktop IShellFolder + int nResult = SHGetDesktopFolder(out pUnkownDesktopFolder); + if (S_OK != nResult) + { + throw new ShellContextMenuException("Failed to get the desktop shell folder"); + } + _oDesktopFolder = (IShellFolder)Marshal.GetTypedObjectForIUnknown(pUnkownDesktopFolder, typeof(IShellFolder)); + } + + return _oDesktopFolder; + } + #endregion + + #region GetParentFolder() + /// + /// Gets the parent folder + /// + /// Folder path + /// IShellFolder for the folder (relative from the desktop) + private IShellFolder GetParentFolder(string folderName) + { + if (null == _oParentFolder) + { + IShellFolder oDesktopFolder = GetDesktopFolder(); + if (null == oDesktopFolder) + { + return null; + } + + // Get the PIDL for the folder file is in + IntPtr pPIDL = IntPtr.Zero; + uint pchEaten = 0; + SFGAO pdwAttributes = 0; + int nResult = oDesktopFolder.ParseDisplayName(IntPtr.Zero, IntPtr.Zero, folderName, ref pchEaten, out pPIDL, ref pdwAttributes); + if (S_OK != nResult) + { + return null; + } + + IntPtr pStrRet = Marshal.AllocCoTaskMem(MAX_PATH * 2 + 4); + Marshal.WriteInt32(pStrRet, 0, 0); + nResult = _oDesktopFolder.GetDisplayNameOf(pPIDL, SHGNO.FORPARSING, pStrRet); + StringBuilder strFolder = new StringBuilder(MAX_PATH); + StrRetToBuf(pStrRet, pPIDL, strFolder, MAX_PATH); + Marshal.FreeCoTaskMem(pStrRet); + pStrRet = IntPtr.Zero; + _strParentFolder = strFolder.ToString(); + + // Get the IShellFolder for folder + IntPtr pUnknownParentFolder = IntPtr.Zero; + nResult = oDesktopFolder.BindToObject(pPIDL, IntPtr.Zero, ref IID_IShellFolder, out pUnknownParentFolder); + // Free the PIDL first + Marshal.FreeCoTaskMem(pPIDL); + if (S_OK != nResult) + { + return null; + } + _oParentFolder = (IShellFolder)Marshal.GetTypedObjectForIUnknown(pUnknownParentFolder, typeof(IShellFolder)); + } + + return _oParentFolder; + } + #endregion + + #region GetPIDLs() + /// + /// Get the PIDLs + /// + /// Array of FileInfo + /// Array of PIDLs + protected IntPtr[] GetPIDLs(FileInfo[] arrFI) + { + if (null == arrFI || 0 == arrFI.Length) + { + return null; + } + + IShellFolder oParentFolder = GetParentFolder(arrFI[0].DirectoryName); + if (null == oParentFolder) + { + return null; + } + + IntPtr[] arrPIDLs = new IntPtr[arrFI.Length]; + int n = 0; + foreach (FileInfo fi in arrFI) + { + // Get the file relative to folder + uint pchEaten = 0; + SFGAO pdwAttributes = 0; + IntPtr pPIDL = IntPtr.Zero; + int nResult = oParentFolder.ParseDisplayName(IntPtr.Zero, IntPtr.Zero, fi.Name, ref pchEaten, out pPIDL, ref pdwAttributes); + if (S_OK != nResult) + { + FreePIDLs(arrPIDLs); + return null; + } + arrPIDLs[n] = pPIDL; + n++; + } + + return arrPIDLs; + } + + /// + /// Get the PIDLs + /// + /// Array of DirectoryInfo + /// Array of PIDLs + protected IntPtr[] GetPIDLs(DirectoryInfo[] arrFI) + { + if (null == arrFI || 0 == arrFI.Length) + { + return null; + } + + IShellFolder oParentFolder = GetParentFolder(arrFI[0].Parent.FullName); + if (null == oParentFolder) + { + return null; + } + + IntPtr[] arrPIDLs = new IntPtr[arrFI.Length]; + int n = 0; + foreach (DirectoryInfo fi in arrFI) + { + // Get the file relative to folder + uint pchEaten = 0; + SFGAO pdwAttributes = 0; + IntPtr pPIDL = IntPtr.Zero; + int nResult = oParentFolder.ParseDisplayName(IntPtr.Zero, IntPtr.Zero, fi.Name, ref pchEaten, out pPIDL, ref pdwAttributes); + if (S_OK != nResult) + { + FreePIDLs(arrPIDLs); + return null; + } + arrPIDLs[n] = pPIDL; + n++; + } + + return arrPIDLs; + } + #endregion + + #region FreePIDLs() + /// + /// Free the PIDLs + /// + /// Array of PIDLs (IntPtr) + protected void FreePIDLs(IntPtr[] arrPIDLs) + { + if (null != arrPIDLs) + { + for (int n = 0; n < arrPIDLs.Length; n++) + { + if (arrPIDLs[n] != IntPtr.Zero) + { + Marshal.FreeCoTaskMem(arrPIDLs[n]); + arrPIDLs[n] = IntPtr.Zero; + } + } + } + } + #endregion + + #region InvokeContextMenuDefault + private void InvokeContextMenuDefault(FileInfo[] arrFI) + { + // Release all resources first. + ReleaseAll(); + + IntPtr pMenu = IntPtr.Zero, + iContextMenuPtr = IntPtr.Zero; + + try + { + _arrPIDLs = GetPIDLs(arrFI); + if (null == _arrPIDLs) + { + ReleaseAll(); + return; + } + + if (false == GetContextMenuInterfaces(_oParentFolder, _arrPIDLs, out iContextMenuPtr)) + { + ReleaseAll(); + return; + } + + pMenu = CreatePopupMenu(); + + int nResult = _oContextMenu.QueryContextMenu( + pMenu, + 0, + CMD_FIRST, + CMD_LAST, + CMF.DEFAULTONLY | + ((Control.ModifierKeys & Keys.Shift) != 0 ? CMF.EXTENDEDVERBS : 0)); + + uint nDefaultCmd = (uint)GetMenuDefaultItem(pMenu, false, 0); + if (nDefaultCmd >= CMD_FIRST) + { + InvokeCommand(_oContextMenu, nDefaultCmd, arrFI[0].DirectoryName, Control.MousePosition); + } + + DestroyMenu(pMenu); + pMenu = IntPtr.Zero; + } + catch + { + throw; + } + finally + { + if (pMenu != IntPtr.Zero) + { + DestroyMenu(pMenu); + } + ReleaseAll(); + } + } + #endregion + + #region ShowContextMenu() + + /// + /// Shows the context menu + /// + /// FileInfos (should all be in same directory) + /// Where to show the menu + public void ShowContextMenu(FileInfo[] files, Point pointScreen) + { + // Release all resources first. + ReleaseAll(); + _arrPIDLs = GetPIDLs(files); + this.ShowContextMenu(pointScreen); + } + + /// + /// Shows the context menu + /// + /// DirectoryInfos (should all be in same directory) + /// Where to show the menu + public void ShowContextMenu(DirectoryInfo[] dirs, Point pointScreen) + { + // Release all resources first. + ReleaseAll(); + _arrPIDLs = GetPIDLs(dirs); + this.ShowContextMenu(pointScreen); + } + + /// + /// Shows the context menu + /// + /// FileInfos (should all be in same directory) + /// Where to show the menu + public void ShowContextMenu(Point pointScreen) + { + IntPtr pMenu = IntPtr.Zero, + iContextMenuPtr = IntPtr.Zero, + iContextMenuPtr2 = IntPtr.Zero, + iContextMenuPtr3 = IntPtr.Zero; + //LocalWindowsHook hook = new LocalWindowsHook(HookType.WH_CALLWNDPROC); + //hook.HookInvoked += new LocalWindowsHook.HookEventHandler(WindowsHookInvoked); + + try + { + //Application.AddMessageFilter(this); + + //_arrPIDLs = GetPIDLs(arrFI); + if (null == _arrPIDLs) + { + ReleaseAll(); + return; + } + + if (false == GetContextMenuInterfaces(_oParentFolder, _arrPIDLs, out iContextMenuPtr)) + { + ReleaseAll(); + return; + } + + pMenu = CreatePopupMenu(); + + int nResult = _oContextMenu.QueryContextMenu( + pMenu, + 0, + CMD_FIRST, + CMD_LAST, + CMF.EXPLORE | + CMF.NORMAL | + ((Control.ModifierKeys & Keys.Shift) != 0 ? CMF.EXTENDEDVERBS : 0)); + + Marshal.QueryInterface(iContextMenuPtr, ref IID_IContextMenu2, out iContextMenuPtr2); + Marshal.QueryInterface(iContextMenuPtr, ref IID_IContextMenu3, out iContextMenuPtr3); + + _oContextMenu2 = (IContextMenu2)Marshal.GetTypedObjectForIUnknown(iContextMenuPtr2, typeof(IContextMenu2)); + _oContextMenu3 = (IContextMenu3)Marshal.GetTypedObjectForIUnknown(iContextMenuPtr3, typeof(IContextMenu3)); + + //hook.Install(); + + uint nSelected = TrackPopupMenuEx( + pMenu, + TPM.RETURNCMD, + pointScreen.X, + pointScreen.Y, + this.Handle, + IntPtr.Zero); + + DestroyMenu(pMenu); + pMenu = IntPtr.Zero; + + if (nSelected != 0) + { + InvokeCommand(_oContextMenu, nSelected, _strParentFolder, pointScreen); + } + } + catch + { + throw; + } + finally + { + //hook.Uninstall(); + if (pMenu != IntPtr.Zero) + { + DestroyMenu(pMenu); + } + + if (iContextMenuPtr != IntPtr.Zero) + Marshal.Release(iContextMenuPtr); + + if (iContextMenuPtr2 != IntPtr.Zero) + Marshal.Release(iContextMenuPtr2); + + if (iContextMenuPtr3 != IntPtr.Zero) + Marshal.Release(iContextMenuPtr3); + + ReleaseAll(); + } + } + #endregion + + #region WindowsHookInvoked() + /// + /// Handle messages for context menu + /// + private void WindowsHookInvoked(object sender, HookEventArgs e) + { + CWPSTRUCT cwp = (CWPSTRUCT)Marshal.PtrToStructure(e.lParam, typeof(CWPSTRUCT)); + + if (_oContextMenu2 != null && + (cwp.message == (int)WM.INITMENUPOPUP || + cwp.message == (int)WM.MEASUREITEM || + cwp.message == (int)WM.DRAWITEM)) + { + if (_oContextMenu2.HandleMenuMsg((uint)cwp.message, cwp.wparam, cwp.lparam) == S_OK) + { + return; + } + } + + if (_oContextMenu3 != null && cwp.message == (int)WM.MENUCHAR) + { + if (_oContextMenu3.HandleMenuMsg2((uint)cwp.message, cwp.wparam, cwp.lparam, IntPtr.Zero) == S_OK) + { + return; + } + } + + return; + } + #endregion + + #region Local variabled + private IContextMenu _oContextMenu; + private IContextMenu2 _oContextMenu2; + private IContextMenu3 _oContextMenu3; + private IShellFolder _oDesktopFolder; + private IShellFolder _oParentFolder; + private IntPtr[] _arrPIDLs; + private string _strParentFolder; + #endregion + + #region Variables and Constants + + private const int MAX_PATH = 260; + private const uint CMD_FIRST = 1; + private const uint CMD_LAST = 30000; + + private const int S_OK = 0; + private const int S_FALSE = 1; + + private static int cbMenuItemInfo = Marshal.SizeOf(typeof(MENUITEMINFO)); + private static int cbInvokeCommand = Marshal.SizeOf(typeof(CMINVOKECOMMANDINFOEX)); + + #endregion + + #region DLL Import + + // Retrieves the IShellFolder interface for the desktop folder, which is the root of the Shell's namespace. + [DllImport("shell32.dll")] + private static extern Int32 SHGetDesktopFolder(out IntPtr ppshf); + + // Takes a STRRET structure returned by IShellFolder::GetDisplayNameOf, converts it to a string, and places the result in a buffer. + [DllImport("shlwapi.dll", EntryPoint = "StrRetToBuf", ExactSpelling = false, CharSet = CharSet.Auto, SetLastError = true)] + private static extern Int32 StrRetToBuf(IntPtr pstr, IntPtr pidl, StringBuilder pszBuf, int cchBuf); + + // The TrackPopupMenuEx function displays a shortcut menu at the specified location and tracks the selection of items on the shortcut menu. The shortcut menu can appear anywhere on the screen. + [DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)] + private static extern uint TrackPopupMenuEx(IntPtr hmenu, TPM flags, int x, int y, IntPtr hwnd, IntPtr lptpm); + + // The CreatePopupMenu function creates a drop-down menu, submenu, or shortcut menu. The menu is initially empty. You can insert or append menu items by using the InsertMenuItem function. You can also use the InsertMenu function to insert menu items and the AppendMenu function to append menu items. + [DllImport("user32", SetLastError = true, CharSet = CharSet.Auto)] + private static extern IntPtr CreatePopupMenu(); + + // The DestroyMenu function destroys the specified menu and frees any memory that the menu occupies. + [DllImport("user32", SetLastError = true, CharSet = CharSet.Auto)] + private static extern bool DestroyMenu(IntPtr hMenu); + + // Determines the default menu item on the specified menu + [DllImport("user32", SetLastError = true, CharSet = CharSet.Auto)] + private static extern int GetMenuDefaultItem(IntPtr hMenu, bool fByPos, uint gmdiFlags); + + #endregion + + #region Shell GUIDs + + private static Guid IID_IShellFolder = new Guid("{000214E6-0000-0000-C000-000000000046}"); + private static Guid IID_IContextMenu = new Guid("{000214e4-0000-0000-c000-000000000046}"); + private static Guid IID_IContextMenu2 = new Guid("{000214f4-0000-0000-c000-000000000046}"); + private static Guid IID_IContextMenu3 = new Guid("{bcfce0a0-ec17-11d0-8d10-00a0c90f2719}"); + + #endregion + + #region Structs + + [StructLayout(LayoutKind.Sequential)] + private struct CWPSTRUCT + { + public IntPtr lparam; + public IntPtr wparam; + public int message; + public IntPtr hwnd; + } + + // Contains extended information about a shortcut menu command + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + private struct CMINVOKECOMMANDINFOEX + { + public int cbSize; + public CMIC fMask; + public IntPtr hwnd; + public IntPtr lpVerb; + [MarshalAs(UnmanagedType.LPStr)] + public string lpParameters; + [MarshalAs(UnmanagedType.LPStr)] + public string lpDirectory; + public SW nShow; + public int dwHotKey; + public IntPtr hIcon; + [MarshalAs(UnmanagedType.LPStr)] + public string lpTitle; + public IntPtr lpVerbW; + [MarshalAs(UnmanagedType.LPWStr)] + public string lpParametersW; + [MarshalAs(UnmanagedType.LPWStr)] + public string lpDirectoryW; + [MarshalAs(UnmanagedType.LPWStr)] + public string lpTitleW; + public POINT ptInvoke; + } + + // Contains information about a menu item + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] + private struct MENUITEMINFO + { + public MENUITEMINFO(string text) + { + cbSize = cbMenuItemInfo; + dwTypeData = text; + cch = text.Length; + fMask = 0; + fType = 0; + fState = 0; + wID = 0; + hSubMenu = IntPtr.Zero; + hbmpChecked = IntPtr.Zero; + hbmpUnchecked = IntPtr.Zero; + dwItemData = IntPtr.Zero; + hbmpItem = IntPtr.Zero; + } + + public int cbSize; + public MIIM fMask; + public MFT fType; + public MFS fState; + public uint wID; + public IntPtr hSubMenu; + public IntPtr hbmpChecked; + public IntPtr hbmpUnchecked; + public IntPtr dwItemData; + [MarshalAs(UnmanagedType.LPTStr)] + public string dwTypeData; + public int cch; + public IntPtr hbmpItem; + } + + // A generalized global memory handle used for data transfer operations by the + // IAdviseSink, IDataObject, and IOleCache interfaces + [StructLayout(LayoutKind.Sequential)] + private struct STGMEDIUM + { + public TYMED tymed; + public IntPtr hBitmap; + public IntPtr hMetaFilePict; + public IntPtr hEnhMetaFile; + public IntPtr hGlobal; + public IntPtr lpszFileName; + public IntPtr pstm; + public IntPtr pstg; + public IntPtr pUnkForRelease; + } + + // Defines the x- and y-coordinates of a point + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] + private struct POINT + { + public POINT(int x, int y) + { + this.x = x; + this.y = y; + } + + public int x; + public int y; + } + + #endregion + + #region Enums + + // Defines the values used with the IShellFolder::GetDisplayNameOf and IShellFolder::SetNameOf + // methods to specify the type of file or folder names used by those methods + [Flags] + private enum SHGNO + { + NORMAL = 0x0000, + INFOLDER = 0x0001, + FOREDITING = 0x1000, + FORADDRESSBAR = 0x4000, + FORPARSING = 0x8000 + } + + // The attributes that the caller is requesting, when calling IShellFolder::GetAttributesOf + [Flags] + private enum SFGAO : uint + { + BROWSABLE = 0x8000000, + CANCOPY = 1, + CANDELETE = 0x20, + CANLINK = 4, + CANMONIKER = 0x400000, + CANMOVE = 2, + CANRENAME = 0x10, + CAPABILITYMASK = 0x177, + COMPRESSED = 0x4000000, + CONTENTSMASK = 0x80000000, + DISPLAYATTRMASK = 0xfc000, + DROPTARGET = 0x100, + ENCRYPTED = 0x2000, + FILESYSANCESTOR = 0x10000000, + FILESYSTEM = 0x40000000, + FOLDER = 0x20000000, + GHOSTED = 0x8000, + HASPROPSHEET = 0x40, + HASSTORAGE = 0x400000, + HASSUBFOLDER = 0x80000000, + HIDDEN = 0x80000, + ISSLOW = 0x4000, + LINK = 0x10000, + NEWCONTENT = 0x200000, + NONENUMERATED = 0x100000, + READONLY = 0x40000, + REMOVABLE = 0x2000000, + SHARE = 0x20000, + STORAGE = 8, + STORAGEANCESTOR = 0x800000, + STORAGECAPMASK = 0x70c50008, + STREAM = 0x400000, + VALIDATE = 0x1000000 + } + + // Determines the type of items included in an enumeration. + // These values are used with the IShellFolder::EnumObjects method + [Flags] + private enum SHCONTF + { + FOLDERS = 0x0020, + NONFOLDERS = 0x0040, + INCLUDEHIDDEN = 0x0080, + INIT_ON_FIRST_NEXT = 0x0100, + NETPRINTERSRCH = 0x0200, + SHAREABLE = 0x0400, + STORAGE = 0x0800, + } + + // Specifies how the shortcut menu can be changed when calling IContextMenu::QueryContextMenu + [Flags] + private enum CMF : uint + { + NORMAL = 0x00000000, + DEFAULTONLY = 0x00000001, + VERBSONLY = 0x00000002, + EXPLORE = 0x00000004, + NOVERBS = 0x00000008, + CANRENAME = 0x00000010, + NODEFAULT = 0x00000020, + INCLUDESTATIC = 0x00000040, + EXTENDEDVERBS = 0x00000100, + RESERVED = 0xffff0000 + } + + // Flags specifying the information to return when calling IContextMenu::GetCommandString + [Flags] + private enum GCS : uint + { + VERBA = 0, + HELPTEXTA = 1, + VALIDATEA = 2, + VERBW = 4, + HELPTEXTW = 5, + VALIDATEW = 6 + } + + // Specifies how TrackPopupMenuEx positions the shortcut menu horizontally + [Flags] + private enum TPM : uint + { + LEFTBUTTON = 0x0000, + RIGHTBUTTON = 0x0002, + LEFTALIGN = 0x0000, + CENTERALIGN = 0x0004, + RIGHTALIGN = 0x0008, + TOPALIGN = 0x0000, + VCENTERALIGN = 0x0010, + BOTTOMALIGN = 0x0020, + HORIZONTAL = 0x0000, + VERTICAL = 0x0040, + NONOTIFY = 0x0080, + RETURNCMD = 0x0100, + RECURSE = 0x0001, + HORPOSANIMATION = 0x0400, + HORNEGANIMATION = 0x0800, + VERPOSANIMATION = 0x1000, + VERNEGANIMATION = 0x2000, + NOANIMATION = 0x4000, + LAYOUTRTL = 0x8000 + } + + // The cmd for a custom added menu item + private enum CMD_CUSTOM + { + ExpandCollapse = (int)CMD_LAST + 1 + } + + // Flags used with the CMINVOKECOMMANDINFOEX structure + [Flags] + private enum CMIC : uint + { + HOTKEY = 0x00000020, + ICON = 0x00000010, + FLAG_NO_UI = 0x00000400, + UNICODE = 0x00004000, + NO_CONSOLE = 0x00008000, + ASYNCOK = 0x00100000, + NOZONECHECKS = 0x00800000, + SHIFT_DOWN = 0x10000000, + CONTROL_DOWN = 0x40000000, + FLAG_LOG_USAGE = 0x04000000, + PTINVOKE = 0x20000000 + } + + // Specifies how the window is to be shown + [Flags] + private enum SW + { + HIDE = 0, + SHOWNORMAL = 1, + NORMAL = 1, + SHOWMINIMIZED = 2, + SHOWMAXIMIZED = 3, + MAXIMIZE = 3, + SHOWNOACTIVATE = 4, + SHOW = 5, + MINIMIZE = 6, + SHOWMINNOACTIVE = 7, + SHOWNA = 8, + RESTORE = 9, + SHOWDEFAULT = 10, + } + + // Window message flags + [Flags] + private enum WM : uint + { + ACTIVATE = 0x6, + ACTIVATEAPP = 0x1C, + AFXFIRST = 0x360, + AFXLAST = 0x37F, + APP = 0x8000, + ASKCBFORMATNAME = 0x30C, + CANCELJOURNAL = 0x4B, + CANCELMODE = 0x1F, + CAPTURECHANGED = 0x215, + CHANGECBCHAIN = 0x30D, + CHAR = 0x102, + CHARTOITEM = 0x2F, + CHILDACTIVATE = 0x22, + CLEAR = 0x303, + CLOSE = 0x10, + COMMAND = 0x111, + COMPACTING = 0x41, + COMPAREITEM = 0x39, + CONTEXTMENU = 0x7B, + COPY = 0x301, + COPYDATA = 0x4A, + CREATE = 0x1, + CTLCOLORBTN = 0x135, + CTLCOLORDLG = 0x136, + CTLCOLOREDIT = 0x133, + CTLCOLORLISTBOX = 0x134, + CTLCOLORMSGBOX = 0x132, + CTLCOLORSCROLLBAR = 0x137, + CTLCOLORSTATIC = 0x138, + CUT = 0x300, + DEADCHAR = 0x103, + DELETEITEM = 0x2D, + DESTROY = 0x2, + DESTROYCLIPBOARD = 0x307, + DEVICECHANGE = 0x219, + DEVMODECHANGE = 0x1B, + DISPLAYCHANGE = 0x7E, + DRAWCLIPBOARD = 0x308, + DRAWITEM = 0x2B, + DROPFILES = 0x233, + ENABLE = 0xA, + ENDSESSION = 0x16, + ENTERIDLE = 0x121, + ENTERMENULOOP = 0x211, + ENTERSIZEMOVE = 0x231, + ERASEBKGND = 0x14, + EXITMENULOOP = 0x212, + EXITSIZEMOVE = 0x232, + FONTCHANGE = 0x1D, + GETDLGCODE = 0x87, + GETFONT = 0x31, + GETHOTKEY = 0x33, + GETICON = 0x7F, + GETMINMAXINFO = 0x24, + GETOBJECT = 0x3D, + GETSYSMENU = 0x313, + GETTEXT = 0xD, + GETTEXTLENGTH = 0xE, + HANDHELDFIRST = 0x358, + HANDHELDLAST = 0x35F, + HELP = 0x53, + HOTKEY = 0x312, + HSCROLL = 0x114, + HSCROLLCLIPBOARD = 0x30E, + ICONERASEBKGND = 0x27, + IME_CHAR = 0x286, + IME_COMPOSITION = 0x10F, + IME_COMPOSITIONFULL = 0x284, + IME_CONTROL = 0x283, + IME_ENDCOMPOSITION = 0x10E, + IME_KEYDOWN = 0x290, + IME_KEYLAST = 0x10F, + IME_KEYUP = 0x291, + IME_NOTIFY = 0x282, + IME_REQUEST = 0x288, + IME_SELECT = 0x285, + IME_SETCONTEXT = 0x281, + IME_STARTCOMPOSITION = 0x10D, + INITDIALOG = 0x110, + INITMENU = 0x116, + INITMENUPOPUP = 0x117, + INPUTLANGCHANGE = 0x51, + INPUTLANGCHANGEREQUEST = 0x50, + KEYDOWN = 0x100, + KEYFIRST = 0x100, + KEYLAST = 0x108, + KEYUP = 0x101, + KILLFOCUS = 0x8, + LBUTTONDBLCLK = 0x203, + LBUTTONDOWN = 0x201, + LBUTTONUP = 0x202, + LVM_GETEDITCONTROL = 0x1018, + LVM_SETIMAGELIST = 0x1003, + MBUTTONDBLCLK = 0x209, + MBUTTONDOWN = 0x207, + MBUTTONUP = 0x208, + MDIACTIVATE = 0x222, + MDICASCADE = 0x227, + MDICREATE = 0x220, + MDIDESTROY = 0x221, + MDIGETACTIVE = 0x229, + MDIICONARRANGE = 0x228, + MDIMAXIMIZE = 0x225, + MDINEXT = 0x224, + MDIREFRESHMENU = 0x234, + MDIRESTORE = 0x223, + MDISETMENU = 0x230, + MDITILE = 0x226, + MEASUREITEM = 0x2C, + MENUCHAR = 0x120, + MENUCOMMAND = 0x126, + MENUDRAG = 0x123, + MENUGETOBJECT = 0x124, + MENURBUTTONUP = 0x122, + MENUSELECT = 0x11F, + MOUSEACTIVATE = 0x21, + MOUSEFIRST = 0x200, + MOUSEHOVER = 0x2A1, + MOUSELAST = 0x20A, + MOUSELEAVE = 0x2A3, + MOUSEMOVE = 0x200, + MOUSEWHEEL = 0x20A, + MOVE = 0x3, + MOVING = 0x216, + NCACTIVATE = 0x86, + NCCALCSIZE = 0x83, + NCCREATE = 0x81, + NCDESTROY = 0x82, + NCHITTEST = 0x84, + NCLBUTTONDBLCLK = 0xA3, + NCLBUTTONDOWN = 0xA1, + NCLBUTTONUP = 0xA2, + NCMBUTTONDBLCLK = 0xA9, + NCMBUTTONDOWN = 0xA7, + NCMBUTTONUP = 0xA8, + NCMOUSEHOVER = 0x2A0, + NCMOUSELEAVE = 0x2A2, + NCMOUSEMOVE = 0xA0, + NCPAINT = 0x85, + NCRBUTTONDBLCLK = 0xA6, + NCRBUTTONDOWN = 0xA4, + NCRBUTTONUP = 0xA5, + NEXTDLGCTL = 0x28, + NEXTMENU = 0x213, + NOTIFY = 0x4E, + NOTIFYFORMAT = 0x55, + NULL = 0x0, + PAINT = 0xF, + PAINTCLIPBOARD = 0x309, + PAINTICON = 0x26, + PALETTECHANGED = 0x311, + PALETTEISCHANGING = 0x310, + PARENTNOTIFY = 0x210, + PASTE = 0x302, + PENWINFIRST = 0x380, + PENWINLAST = 0x38F, + POWER = 0x48, + PRINT = 0x317, + PRINTCLIENT = 0x318, + QUERYDRAGICON = 0x37, + QUERYENDSESSION = 0x11, + QUERYNEWPALETTE = 0x30F, + QUERYOPEN = 0x13, + QUEUESYNC = 0x23, + QUIT = 0x12, + RBUTTONDBLCLK = 0x206, + RBUTTONDOWN = 0x204, + RBUTTONUP = 0x205, + RENDERALLFORMATS = 0x306, + RENDERFORMAT = 0x305, + SETCURSOR = 0x20, + SETFOCUS = 0x7, + SETFONT = 0x30, + SETHOTKEY = 0x32, + SETICON = 0x80, + SETMARGINS = 0xD3, + SETREDRAW = 0xB, + SETTEXT = 0xC, + SETTINGCHANGE = 0x1A, + SHOWWINDOW = 0x18, + SIZE = 0x5, + SIZECLIPBOARD = 0x30B, + SIZING = 0x214, + SPOOLERSTATUS = 0x2A, + STYLECHANGED = 0x7D, + STYLECHANGING = 0x7C, + SYNCPAINT = 0x88, + SYSCHAR = 0x106, + SYSCOLORCHANGE = 0x15, + SYSCOMMAND = 0x112, + SYSDEADCHAR = 0x107, + SYSKEYDOWN = 0x104, + SYSKEYUP = 0x105, + TCARD = 0x52, + TIMECHANGE = 0x1E, + TIMER = 0x113, + TVM_GETEDITCONTROL = 0x110F, + TVM_SETIMAGELIST = 0x1109, + UNDO = 0x304, + UNINITMENUPOPUP = 0x125, + USER = 0x400, + USERCHANGED = 0x54, + VKEYTOITEM = 0x2E, + VSCROLL = 0x115, + VSCROLLCLIPBOARD = 0x30A, + WINDOWPOSCHANGED = 0x47, + WINDOWPOSCHANGING = 0x46, + WININICHANGE = 0x1A, + SH_NOTIFY = 0x0401 + } + + // Specifies the content of the new menu item + [Flags] + private enum MFT : uint + { + GRAYED = 0x00000003, + DISABLED = 0x00000003, + CHECKED = 0x00000008, + SEPARATOR = 0x00000800, + RADIOCHECK = 0x00000200, + BITMAP = 0x00000004, + OWNERDRAW = 0x00000100, + MENUBARBREAK = 0x00000020, + MENUBREAK = 0x00000040, + RIGHTORDER = 0x00002000, + BYCOMMAND = 0x00000000, + BYPOSITION = 0x00000400, + POPUP = 0x00000010 + } + + // Specifies the state of the new menu item + [Flags] + private enum MFS : uint + { + GRAYED = 0x00000003, + DISABLED = 0x00000003, + CHECKED = 0x00000008, + HILITE = 0x00000080, + ENABLED = 0x00000000, + UNCHECKED = 0x00000000, + UNHILITE = 0x00000000, + DEFAULT = 0x00001000 + } + + // Specifies the content of the new menu item + [Flags] + private enum MIIM : uint + { + BITMAP = 0x80, + CHECKMARKS = 0x08, + DATA = 0x20, + FTYPE = 0x100, + ID = 0x02, + STATE = 0x01, + STRING = 0x40, + SUBMENU = 0x04, + TYPE = 0x10 + } + + // Indicates the type of storage medium being used in a data transfer + [Flags] + private enum TYMED + { + ENHMF = 0x40, + FILE = 2, + GDI = 0x10, + HGLOBAL = 1, + ISTORAGE = 8, + ISTREAM = 4, + MFPICT = 0x20, + NULL = 0 + } + + #endregion + + #region IShellFolder + [ComImport] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [Guid("000214E6-0000-0000-C000-000000000046")] + private interface IShellFolder + { + // Translates a file object's or folder's display name into an item identifier list. + // Return value: error code, if any + [PreserveSig] + Int32 ParseDisplayName( + IntPtr hwnd, + IntPtr pbc, + [MarshalAs(UnmanagedType.LPWStr)] + string pszDisplayName, + ref uint pchEaten, + out IntPtr ppidl, + ref SFGAO pdwAttributes); + + // Allows a client to determine the contents of a folder by creating an item + // identifier enumeration object and returning its IEnumIDList interface. + // Return value: error code, if any + [PreserveSig] + Int32 EnumObjects( + IntPtr hwnd, + SHCONTF grfFlags, + out IntPtr enumIDList); + + // Retrieves an IShellFolder object for a subfolder. + // Return value: error code, if any + [PreserveSig] + Int32 BindToObject( + IntPtr pidl, + IntPtr pbc, + ref Guid riid, + out IntPtr ppv); + + // Requests a pointer to an object's storage interface. + // Return value: error code, if any + [PreserveSig] + Int32 BindToStorage( + IntPtr pidl, + IntPtr pbc, + ref Guid riid, + out IntPtr ppv); + + // Determines the relative order of two file objects or folders, given their + // item identifier lists. Return value: If this method is successful, the + // CODE field of the HRESULT contains one of the following values (the code + // can be retrived using the helper function GetHResultCode): Negative A + // negative return value indicates that the first item should precede + // the second (pidl1 < pidl2). + + // Positive A positive return value indicates that the first item should + // follow the second (pidl1 > pidl2). Zero A return value of zero + // indicates that the two items are the same (pidl1 = pidl2). + [PreserveSig] + Int32 CompareIDs( + IntPtr lParam, + IntPtr pidl1, + IntPtr pidl2); + + // Requests an object that can be used to obtain information from or interact + // with a folder object. + // Return value: error code, if any + [PreserveSig] + Int32 CreateViewObject( + IntPtr hwndOwner, + Guid riid, + out IntPtr ppv); + + // Retrieves the attributes of one or more file objects or subfolders. + // Return value: error code, if any + [PreserveSig] + Int32 GetAttributesOf( + uint cidl, + [MarshalAs(UnmanagedType.LPArray)] + IntPtr[] apidl, + ref SFGAO rgfInOut); + + // Retrieves an OLE interface that can be used to carry out actions on the + // specified file objects or folders. + // Return value: error code, if any + [PreserveSig] + Int32 GetUIObjectOf( + IntPtr hwndOwner, + uint cidl, + [MarshalAs(UnmanagedType.LPArray)] + IntPtr[] apidl, + ref Guid riid, + IntPtr rgfReserved, + out IntPtr ppv); + + // Retrieves the display name for the specified file object or subfolder. + // Return value: error code, if any + [PreserveSig()] + Int32 GetDisplayNameOf( + IntPtr pidl, + SHGNO uFlags, + IntPtr lpName); + + // Sets the display name of a file object or subfolder, changing the item + // identifier in the process. + // Return value: error code, if any + [PreserveSig] + Int32 SetNameOf( + IntPtr hwnd, + IntPtr pidl, + [MarshalAs(UnmanagedType.LPWStr)] + string pszName, + SHGNO uFlags, + out IntPtr ppidlOut); + } + #endregion + + #region IContextMenu + [ComImport()] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [GuidAttribute("000214e4-0000-0000-c000-000000000046")] + private interface IContextMenu + { + // Adds commands to a shortcut menu + [PreserveSig()] + Int32 QueryContextMenu( + IntPtr hmenu, + uint iMenu, + uint idCmdFirst, + uint idCmdLast, + CMF uFlags); + + // Carries out the command associated with a shortcut menu item + [PreserveSig()] + Int32 InvokeCommand( + ref CMINVOKECOMMANDINFOEX info); + + // Retrieves information about a shortcut menu command, + // including the help string and the language-independent, + // or canonical, name for the command + [PreserveSig()] + Int32 GetCommandString( + uint idcmd, + GCS uflags, + uint reserved, + [MarshalAs(UnmanagedType.LPArray)] + byte[] commandstring, + int cch); + } + + [ComImport, Guid("000214f4-0000-0000-c000-000000000046")] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + private interface IContextMenu2 + { + // Adds commands to a shortcut menu + [PreserveSig()] + Int32 QueryContextMenu( + IntPtr hmenu, + uint iMenu, + uint idCmdFirst, + uint idCmdLast, + CMF uFlags); + + // Carries out the command associated with a shortcut menu item + [PreserveSig()] + Int32 InvokeCommand( + ref CMINVOKECOMMANDINFOEX info); + + // Retrieves information about a shortcut menu command, + // including the help string and the language-independent, + // or canonical, name for the command + [PreserveSig()] + Int32 GetCommandString( + uint idcmd, + GCS uflags, + uint reserved, + [MarshalAs(UnmanagedType.LPWStr)] + StringBuilder commandstring, + int cch); + + // Allows client objects of the IContextMenu interface to + // handle messages associated with owner-drawn menu items + [PreserveSig] + Int32 HandleMenuMsg( + uint uMsg, + IntPtr wParam, + IntPtr lParam); + } + + [ComImport, Guid("bcfce0a0-ec17-11d0-8d10-00a0c90f2719")] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + private interface IContextMenu3 + { + // Adds commands to a shortcut menu + [PreserveSig()] + Int32 QueryContextMenu( + IntPtr hmenu, + uint iMenu, + uint idCmdFirst, + uint idCmdLast, + CMF uFlags); + + // Carries out the command associated with a shortcut menu item + [PreserveSig()] + Int32 InvokeCommand( + ref CMINVOKECOMMANDINFOEX info); + + // Retrieves information about a shortcut menu command, + // including the help string and the language-independent, + // or canonical, name for the command + [PreserveSig()] + Int32 GetCommandString( + uint idcmd, + GCS uflags, + uint reserved, + [MarshalAs(UnmanagedType.LPWStr)] + StringBuilder commandstring, + int cch); + + // Allows client objects of the IContextMenu interface to + // handle messages associated with owner-drawn menu items + [PreserveSig] + Int32 HandleMenuMsg( + uint uMsg, + IntPtr wParam, + IntPtr lParam); + + // Allows client objects of the IContextMenu3 interface to + // handle messages associated with owner-drawn menu items + [PreserveSig] + Int32 HandleMenuMsg2( + uint uMsg, + IntPtr wParam, + IntPtr lParam, + IntPtr plResult); + } + #endregion + } + + #region ShellContextMenuException + public class ShellContextMenuException : Exception + { + /// Default contructor + public ShellContextMenuException() + { + } + + /// Constructor with message + /// Message + public ShellContextMenuException(string message) + : base(message) + { + } + } + #endregion + + #region Class HookEventArgs + public class HookEventArgs : EventArgs + { + public int HookCode; // Hook code + public IntPtr wParam; // WPARAM argument + public IntPtr lParam; // LPARAM argument + } + #endregion + + #region Enum HookType + // Hook Types + public enum HookType : int + { + WH_JOURNALRECORD = 0, + WH_JOURNALPLAYBACK = 1, + WH_KEYBOARD = 2, + WH_GETMESSAGE = 3, + WH_CALLWNDPROC = 4, + WH_CBT = 5, + WH_SYSMSGFILTER = 6, + WH_MOUSE = 7, + WH_HARDWARE = 8, + WH_DEBUG = 9, + WH_SHELL = 10, + WH_FOREGROUNDIDLE = 11, + WH_CALLWNDPROCRET = 12, + WH_KEYBOARD_LL = 13, + WH_MOUSE_LL = 14 + } + #endregion + + #region Class LocalWindowsHook + public class LocalWindowsHook + { + // ************************************************************************ + // Filter function delegate + public delegate int HookProc(int code, IntPtr wParam, IntPtr lParam); + // ************************************************************************ + + // ************************************************************************ + // Internal properties + protected IntPtr m_hhook = IntPtr.Zero; + protected HookProc m_filterFunc = null; + protected HookType m_hookType; + // ************************************************************************ + + // ************************************************************************ + // Event delegate + public delegate void HookEventHandler(object sender, HookEventArgs e); + // ************************************************************************ + + // ************************************************************************ + // Event: HookInvoked + public event HookEventHandler HookInvoked; + protected void OnHookInvoked(HookEventArgs e) + { + if (HookInvoked != null) + HookInvoked(this, e); + } + // ************************************************************************ + + // ************************************************************************ + // Class constructor(s) + public LocalWindowsHook(HookType hook) + { + m_hookType = hook; + m_filterFunc = new HookProc(this.CoreHookProc); + } + public LocalWindowsHook(HookType hook, HookProc func) + { + m_hookType = hook; + m_filterFunc = func; + } + // ************************************************************************ + + // ************************************************************************ + // Default filter function + protected int CoreHookProc(int code, IntPtr wParam, IntPtr lParam) + { + if (code < 0) + return CallNextHookEx(m_hhook, code, wParam, lParam); + + // Let clients determine what to do + HookEventArgs e = new HookEventArgs(); + e.HookCode = code; + e.wParam = wParam; + e.lParam = lParam; + OnHookInvoked(e); + + // Yield to the next hook in the chain + return CallNextHookEx(m_hhook, code, wParam, lParam); + } + // ************************************************************************ + + // ************************************************************************ + // Install the hook + public void Install() + { + m_hhook = SetWindowsHookEx( + m_hookType, + m_filterFunc, + IntPtr.Zero, +#pragma warning disable CS0618 // depricated + (int)AppDomain.GetCurrentThreadId()); +#pragma warning restore CS0618 // depricated + } + // ************************************************************************ + + // ************************************************************************ + // Uninstall the hook + public void Uninstall() + { + UnhookWindowsHookEx(m_hhook); + } + // ************************************************************************ + + + #region Win32 Imports + // ************************************************************************ + // Win32: SetWindowsHookEx() + [DllImport("user32.dll")] + protected static extern IntPtr SetWindowsHookEx(HookType code, + HookProc func, + IntPtr hInstance, + int threadID); + // ************************************************************************ + + // ************************************************************************ + // Win32: UnhookWindowsHookEx() + [DllImport("user32.dll")] + protected static extern int UnhookWindowsHookEx(IntPtr hhook); + // ************************************************************************ + + // ************************************************************************ + // Win32: CallNextHookEx() + [DllImport("user32.dll")] + protected static extern int CallNextHookEx(IntPtr hhook, + int code, IntPtr wParam, IntPtr lParam); + // ************************************************************************ + #endregion + } + #endregion + + #region ShellHelper + + internal static class ShellHelper + { + #region Low/High Word + + /// + /// Retrieves the High Word of a WParam of a WindowMessage + /// + /// The pointer to the WParam + /// The unsigned integer for the High Word + public static uint HiWord(IntPtr ptr) + { + uint param32 = (uint)(ptr.ToInt64() | 0xffffffffL); + if ((param32 & 0x80000000) == 0x80000000) + return (param32 >> 16); + else + return (param32 >> 16) & 0xffff; + } + + /// + /// Retrieves the Low Word of a WParam of a WindowMessage + /// + /// The pointer to the WParam + /// The unsigned integer for the Low Word + public static uint LoWord(IntPtr ptr) + { + uint param32 = (uint)(ptr.ToInt64() | 0xffffffffL); + return (param32 & 0xffff); + } + + #endregion + } + + #endregion +} diff --git a/Helper/Taskbar.cs b/Helper/Taskbar.cs new file mode 100644 index 0000000..74efc79 --- /dev/null +++ b/Helper/Taskbar.cs @@ -0,0 +1,143 @@ +using System; +using System.Drawing; +using System.Runtime.InteropServices; + +namespace SystemTrayMenu +{ + public enum TaskbarPosition + { + Unknown = -1, + Left, + Top, + Right, + Bottom, + } + + public sealed class Taskbar + { + private const string ClassName = "Shell_TrayWnd"; + + public Rectangle Bounds + { + get; + private set; + } + public TaskbarPosition Position + { + get; + private set; + } + public Point Location + { + get + { + return Bounds.Location; + } + } + public Size Size + { + get + { + return Bounds.Size; + } + } + //Always returns false under Windows 7 + public bool AlwaysOnTop + { + get; + private set; + } + public bool AutoHide + { + get; + private set; + } + + public Taskbar() + { + IntPtr taskbarHandle = User32.FindWindow(Taskbar.ClassName, null); + + APPBARDATA data = new APPBARDATA(); + data.cbSize = (uint)Marshal.SizeOf(typeof(APPBARDATA)); + data.hWnd = taskbarHandle; + IntPtr result = Shell32.SHAppBarMessage(ABM.GetTaskbarPos, ref data); + if (result == IntPtr.Zero) + { + //throw new InvalidOperationException(); + Bounds = new Rectangle(20, 20, 20, 20); + } + else + { + Position = (TaskbarPosition)data.uEdge; + Bounds = Rectangle.FromLTRB(data.rc.left, data.rc.top, data.rc.right, data.rc.bottom); + + data.cbSize = (uint)Marshal.SizeOf(typeof(APPBARDATA)); + result = Shell32.SHAppBarMessage(ABM.GetState, ref data); + int state = result.ToInt32(); + this.AlwaysOnTop = (state & ABS.AlwaysOnTop) == ABS.AlwaysOnTop; + this.AutoHide = (state & ABS.Autohide) == ABS.Autohide; + } + } + } + + public enum ABM : uint + { + New = 0x00000000, + Remove = 0x00000001, + QueryPos = 0x00000002, + SetPos = 0x00000003, + GetState = 0x00000004, + GetTaskbarPos = 0x00000005, + Activate = 0x00000006, + GetAutoHideBar = 0x00000007, + SetAutoHideBar = 0x00000008, + WindowPosChanged = 0x00000009, + SetState = 0x0000000A, + } + + public enum ABE : uint + { + Left = 0, + Top = 1, + Right = 2, + Bottom = 3 + } + + public static class ABS + { + public const int Autohide = 0x0000001; + public const int AlwaysOnTop = 0x0000002; + } + + public static class Shell32 + { + [DllImport("shell32.dll", SetLastError = true)] + public static extern IntPtr SHAppBarMessage(ABM dwMessage, [In] ref APPBARDATA pData); + } + + public static class User32 + { + [DllImport("user32.dll", SetLastError = true)] + public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); + } + + [StructLayout(LayoutKind.Sequential)] + public struct APPBARDATA + { + public uint cbSize; + public IntPtr hWnd; + public uint uCallbackMessage; + public ABE uEdge; + public RECT rc; + public int lParam; + } + + [StructLayout(LayoutKind.Sequential)] + public struct RECT + { + public int left; + public int top; + public int right; + public int bottom; + } +} diff --git a/Helper/WaitFastLeave.cs b/Helper/WaitFastLeave.cs new file mode 100644 index 0000000..7d1466c --- /dev/null +++ b/Helper/WaitFastLeave.cs @@ -0,0 +1,39 @@ +using System; +using Timer = System.Windows.Forms.Timer; + +namespace SystemTrayMenu.Helper +{ + class WaitFastLeave : IDisposable + { + public event EventHandler Leave; + + Timer timerSecondLeaveCheck = new Timer(); + + public WaitFastLeave() + { + timerSecondLeaveCheck.Interval = 200; + timerSecondLeaveCheck.Tick += LeaveWorkaround_Tick; + } + + // When menu not activated and mouse leaves menu very fast, + // mouse still on menu but we not get leave event again + // as workaround we call the check again (200ms later) + public void Start() + { + Leave.Invoke(); + timerSecondLeaveCheck.Stop(); + timerSecondLeaveCheck.Start(); + } + + private void LeaveWorkaround_Tick(object sender, EventArgs e) + { + timerSecondLeaveCheck.Stop(); + Leave.Invoke(); + } + + public void Dispose() + { + timerSecondLeaveCheck.Dispose(); + } + } +} diff --git a/Helper/WaitMenuOpen.cs b/Helper/WaitMenuOpen.cs new file mode 100644 index 0000000..c61e005 --- /dev/null +++ b/Helper/WaitMenuOpen.cs @@ -0,0 +1,75 @@ +using System; +using Timer = System.Windows.Forms.Timer; + +namespace SystemTrayMenu.Helper +{ + class WaitMenuOpen : IDisposable + { + public event EventHandler DoOpen; + + Timer waitOpen = new Timer(); + bool waitedDone = false; + bool clicked = false; + bool menuLoaded = false; + + public WaitMenuOpen() + { + waitOpen.Interval = MenuDefines.WaitMenuOpen; + waitOpen.Tick += WaitOpen_Tick; + } + + private void WaitOpen_Tick(object sender, EventArgs e) + { + waitOpen.Stop(); + waitedDone = true; + CheckConditionsToOpenMenu(); + } + + private void CheckConditionsToOpenMenu() + { + if ((waitedDone || clicked) && + menuLoaded) + { + Stop(); + DoOpen?.Invoke(); + } + } + + // When mouse on menu, wait x ms until open it + // meanwhile load content, click opens when loaded + // (to not interrupt user when he moves into a submenu) + public void Start() + { + if (!waitedDone) + { + waitOpen.Start(); + } + } + + public void Stop() + { + clicked = false; + waitedDone = false; + menuLoaded = false; + waitOpen.Stop(); + } + + public void Click() + { + clicked = true; + CheckConditionsToOpenMenu(); + } + + public void MenuLoaded() + { + menuLoaded = true; + CheckConditionsToOpenMenu(); + } + + public void Dispose() + { + Stop(); + waitOpen.Dispose(); + } + } +} \ No newline at end of file diff --git a/MenuDefines.cs b/MenuDefines.cs new file mode 100644 index 0000000..44fc732 --- /dev/null +++ b/MenuDefines.cs @@ -0,0 +1,41 @@ +using System.Drawing; + +namespace SystemTrayMenu +{ + public static class MenuDefines + { + // windows explorer background white + public static Color File = Color.White; + public static Color Folder = Color.White; + + // windows explorer selected text + public static Color FileHover = Color.FromArgb(204, 232, 255); + + // windows explorer highlighted text + public static Color FolderOpen = Color.FromArgb(229, 243, 255); + public static Color Background = Color.FromArgb(229, 243, 255); + internal static Color KeyBoardSelection = Color.Yellow; + internal static int KeySearchInterval = 1000; + public const int MenuRowsHeight = 18; + public const int LengthMax = 37; + public const int ButtonTextPaddingLeft = 18; + public const int ButtonTextPaddingRight= 12; + + public const int Scrollspeed = 4; + + public const int WaitMenuOpen = 200; + + // 60 fps => 1000ms/60fps =~ 16.6ms + public const int IntervalFade = 16; + + // 60 fps => 1000ms/60fps =~ 16.6ms + public const int IntervalLoad = 16; + + public const double OpacityHalfValue = 0.80; + public const double OpacityInStep = 0.20; + public const double OpacityOutStep = 0.05; + public const double OpacityHalfStep = 0.01; + + public const int MenusMax = 50; + } +} \ No newline at end of file diff --git a/Program.cs b/Program.cs new file mode 100644 index 0000000..874a6d9 --- /dev/null +++ b/Program.cs @@ -0,0 +1,183 @@ +using Clearcove.Logging; +using Microsoft.Win32; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Drawing; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Resources; +using System.Runtime.InteropServices; +using System.Threading; +using System.Windows.Forms; + +namespace SystemTrayMenu +{ + static class Program + { + public static readonly List Languages = + new List() { "en", "de" }; + public static CultureInfo Culture; + public static float ScalingFactor = 1; + + private const string IconDir = "Icons\\"; + + + [System.Runtime.InteropServices.DllImport("user32.dll")] + private static extern bool SetProcessDPIAware(); + + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + + if (IsAppAlreadyRunning("SystemTrayMenu")) + { + KillOtherSystemTrayMenus(); + } + + GetDefaultLanguage(); + + ScalingFactor = GetScalingFactor(); + if (Environment.OSVersion.Version.Major >= 6) + { + SetProcessDPIAware(); + } + + Logger log = new Logger(nameof(Program)); + Logger.Start(new FileInfo(GetLogFilePath())); + try + { + bool cancelAppRun = false; + using (SystemTrayMenuHandler stm = + new SystemTrayMenuHandler(ref cancelAppRun)) + { + if (!cancelAppRun) + { + Application.Run(); + } + } + } + catch (Exception ex) + { + log.Error($"{ex.ToString()}"); + } + finally + { + Logger.ShutDown(); + } + } + + static bool KillOtherSystemTrayMenus() + { + bool killedAProcess = false; + int ownPID = Process.GetCurrentProcess().Id; + + foreach (Process p in Process.GetProcessesByName("SystemTrayMenu"). + Where(p => p.Id != ownPID)) + { + try + { + p.Kill(); + p.WaitForExit(); + killedAProcess = true; + } + catch (Win32Exception winException) + { + Logger log = new Logger(nameof(Program)); + log.Error($"{winException.ToString()}"); + MessageBox.Show(winException.ToString()); + Application.Exit(); + } + catch (InvalidOperationException invalidException) + { + Logger log = new Logger(nameof(Program)); + log.Error($"{invalidException.ToString()}"); + MessageBox.Show(invalidException.ToString()); + Application.Exit(); + } + } + + return killedAProcess; + } + + static bool IsAppAlreadyRunning(string processName) + { + foreach (Process p in Process.GetProcessesByName(processName). + Where(s => s.Id != Process.GetCurrentProcess().Id)) + { + return true; + } + + return false; + } + + internal static string GetLogFilePath() + { + return Path.Combine(Path.GetDirectoryName( + System.Reflection.Assembly.GetExecutingAssembly().Location), + $"log-{System.Environment.MachineName}.txt"); + } + + private static void GetDefaultLanguage() + { + if (string.IsNullOrEmpty(Properties.Settings.Default. + CurrentCultureInfoName)) + { + Properties.Settings.Default.CurrentCultureInfoName = "en"; + CultureInfo currentCulture = Thread.CurrentThread. + CurrentCulture; + foreach (string language in Languages) + { + string twoLetter = currentCulture.Name.Substring(0, 2); + if (language == currentCulture.Name || + language == twoLetter) + { + Properties.Settings.Default.CurrentCultureInfoName = + language; + } + } + Properties.Settings.Default.Save(); + } + + Culture = CultureInfo.CreateSpecificCulture( + Properties.Settings.Default.CurrentCultureInfoName); + } + + [DllImport("gdi32.dll")] + static extern int GetDeviceCaps(IntPtr hdc, int nIndex); + public enum DeviceCap + { + VERTRES = 10, + DESKTOPVERTRES = 117, + + // http://pinvoke.net/default.aspx/gdi32/GetDeviceCaps.html + } + + static float GetScalingFactor() + { + Graphics g = Graphics.FromHwnd(IntPtr.Zero); + IntPtr desktop = g.GetHdc(); + int LogicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.VERTRES); + int PhysicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.DESKTOPVERTRES); + + float ScreenScalingFactor = (float)PhysicalScreenHeight / (float)LogicalScreenHeight; + + return ScreenScalingFactor; // 1.25 = 125% + } + + internal static string Translate(string id) + { + ResourceManager rm = new ResourceManager( + "SystemTrayMenu.Resources.lang", + typeof(Menu).Assembly); + return rm.GetString(id, Culture); + } + } +} \ No newline at end of file diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..c09064b --- /dev/null +++ b/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using 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. +[assembly: AssemblyTitle("SystemTrayMenu")] +[assembly: AssemblyDescription("AN IMPROVED WINDOWS TOOLBAR")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("TAMAHO")] +[assembly: AssemblyProduct("TAMAHO SystemTrayMenu")] +[assembly: AssemblyCopyright("Copyright © 2019, TAMAHO")] +[assembly: AssemblyTrademark("TAMAHO")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("116c8741-a9b0-4560-8e82-7cf412894340")] + +// 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: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("0.9.1.233")] +[assembly: AssemblyFileVersion("0.9.1.233")] diff --git a/Properties/Resources.Designer.cs b/Properties/Resources.Designer.cs new file mode 100644 index 0000000..94d1ba7 --- /dev/null +++ b/Properties/Resources.Designer.cs @@ -0,0 +1,293 @@ +//------------------------------------------------------------------------------ +// +// Dieser Code wurde von einem Tool generiert. +// Laufzeitversion:4.0.30319.42000 +// +// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn +// der Code erneut generiert wird. +// +//------------------------------------------------------------------------------ + +namespace SystemTrayMenu.Properties { + using System; + + + /// + /// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. + /// + // Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert + // -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert. + // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen + // mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + public class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("SystemTrayMenu.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle + /// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap hintDragDrop { + get { + object obj = ResourceManager.GetObject("hintDragDrop", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Icon ähnlich wie (Symbol). + /// + public static System.Drawing.Icon L010 { + get { + object obj = ResourceManager.GetObject("L010", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Icon ähnlich wie (Symbol). + /// + public static System.Drawing.Icon L020 { + get { + object obj = ResourceManager.GetObject("L020", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Icon ähnlich wie (Symbol). + /// + public static System.Drawing.Icon L030 { + get { + object obj = ResourceManager.GetObject("L030", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Icon ähnlich wie (Symbol). + /// + public static System.Drawing.Icon L040 { + get { + object obj = ResourceManager.GetObject("L040", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Icon ähnlich wie (Symbol). + /// + public static System.Drawing.Icon L050 { + get { + object obj = ResourceManager.GetObject("L050", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Icon ähnlich wie (Symbol). + /// + public static System.Drawing.Icon L060 { + get { + object obj = ResourceManager.GetObject("L060", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Icon ähnlich wie (Symbol). + /// + public static System.Drawing.Icon L070 { + get { + object obj = ResourceManager.GetObject("L070", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Icon ähnlich wie (Symbol). + /// + public static System.Drawing.Icon L080 { + get { + object obj = ResourceManager.GetObject("L080", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Icon ähnlich wie (Symbol). + /// + public static System.Drawing.Icon L090 { + get { + object obj = ResourceManager.GetObject("L090", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Icon ähnlich wie (Symbol). + /// + public static System.Drawing.Icon L100 { + get { + object obj = ResourceManager.GetObject("L100", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Icon ähnlich wie (Symbol). + /// + public static System.Drawing.Icon L110 { + get { + object obj = ResourceManager.GetObject("L110", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Icon ähnlich wie (Symbol). + /// + public static System.Drawing.Icon L120 { + get { + object obj = ResourceManager.GetObject("L120", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Icon ähnlich wie (Symbol). + /// + public static System.Drawing.Icon L130 { + get { + object obj = ResourceManager.GetObject("L130", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Icon ähnlich wie (Symbol). + /// + public static System.Drawing.Icon L140 { + get { + object obj = ResourceManager.GetObject("L140", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Icon ähnlich wie (Symbol). + /// + public static System.Drawing.Icon L150 { + get { + object obj = ResourceManager.GetObject("L150", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Icon ähnlich wie (Symbol). + /// + public static System.Drawing.Icon L160 { + get { + object obj = ResourceManager.GetObject("L160", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Icon ähnlich wie (Symbol). + /// + public static System.Drawing.Icon L170 { + get { + object obj = ResourceManager.GetObject("L170", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Icon ähnlich wie (Symbol). + /// + public static System.Drawing.Icon L180 { + get { + object obj = ResourceManager.GetObject("L180", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap NotSelected { + get { + object obj = ResourceManager.GetObject("NotSelected", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap Selected { + get { + object obj = ResourceManager.GetObject("Selected", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + public static System.Drawing.Bitmap STM { + get { + object obj = ResourceManager.GetObject("STM", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Icon ähnlich wie (Symbol). + /// + public static System.Drawing.Icon SystemTrayMenu { + get { + object obj = ResourceManager.GetObject("SystemTrayMenu", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + } +} diff --git a/Properties/Resources.resx b/Properties/Resources.resx new file mode 100644 index 0000000..9eda6af --- /dev/null +++ b/Properties/Resources.resx @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + ..\Resources\SystemTrayMenu.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\STM.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\resources\Selected.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\hintDragDrop.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\L010.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\L020.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\L030.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\L040.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\L050.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\L060.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\L070.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\L080.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\L090.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\L100.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\L110.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\L120.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\L130.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\L140.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\L150.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\L160.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\L170.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\L180.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\NotSelected.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/Properties/Settings.Designer.cs b/Properties/Settings.Designer.cs new file mode 100644 index 0000000..5064ec5 --- /dev/null +++ b/Properties/Settings.Designer.cs @@ -0,0 +1,74 @@ +//------------------------------------------------------------------------------ +// +// Dieser Code wurde von einem Tool generiert. +// Laufzeitversion:4.0.30319.42000 +// +// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn +// der Code erneut generiert wird. +// +//------------------------------------------------------------------------------ + +namespace SystemTrayMenu.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string CurrentCultureInfoName { + get { + return ((string)(this["CurrentCultureInfoName"])); + } + set { + this["CurrentCultureInfoName"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string PathDirectory { + get { + return ((string)(this["PathDirectory"])); + } + set { + this["PathDirectory"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool IsAutostartActivated { + get { + return ((bool)(this["IsAutostartActivated"])); + } + set { + this["IsAutostartActivated"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string HotKey { + get { + return ((string)(this["HotKey"])); + } + set { + this["HotKey"] = value; + } + } + } +} diff --git a/Properties/Settings.settings b/Properties/Settings.settings new file mode 100644 index 0000000..e9f3f3b --- /dev/null +++ b/Properties/Settings.settings @@ -0,0 +1,18 @@ + + + + + + + + + + + + False + + + + + + \ No newline at end of file diff --git a/Resources/L010.ico b/Resources/L010.ico new file mode 100644 index 0000000000000000000000000000000000000000..c5287ffd6c5c422263737f35b83264d56e49ff48 GIT binary patch literal 104496 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

4{SCAXpTi38dY3*rKLQKrT5Ddf%oDV&dakx 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 literal 0 HcmV?d00001 diff --git a/Resources/L020.ico b/Resources/L020.ico new file mode 100644 index 0000000000000000000000000000000000000000..0a9523153017012c86e8bd632e44804a0e516c8e GIT binary patch literal 104486 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 literal 0 HcmV?d00001 diff --git a/Resources/L030.ico b/Resources/L030.ico new file mode 100644 index 0000000000000000000000000000000000000000..09a864743f17c1d4bc944135390dc3ee574a2893 GIT binary patch literal 104423 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 literal 0 HcmV?d00001 diff --git a/Resources/L040.ico b/Resources/L040.ico new file mode 100644 index 0000000000000000000000000000000000000000..e21a6089d9489e3c7be5dbd585bf330e81c72eae GIT binary patch literal 104485 zcmeHQ2Uru?7M=hC0@4)3f+*Mp#g3?e6|kTvB4Wde*mXs*5)lD)MQqp=dskEzyT$@G zEUT^yt|i#Ju$ILY;r%BhY|KkY0!e5&-}mRvZKvItxn=H57>31YGej(=I&;*NVMgMZ z&CZF})nzf3Di_^w(EGj1SiR_Di!8OCfLi!nw>{6=Xp%<1JU zWKJ#^^-+P8Jo#WoIombHP_Zy}MtxQNs{OHb(?QOi& zxQ13UzdkMMnWen5zFhm3FK0`|QS(Fk&UF9gvZ%{x<6VIPo`-zu#>KVY+b5cRxwhHT z`aPYDGjzN33#m1vtX4nksP|b}x;5(jb*10PNB%cjefr+0Rh^FyZZ@6v;^D}Rtg43L z7g8rW$Pidt)UWM6CaS%=ewyAK{SB;NU9Wd>9v@Pb;nWxq-jc=aoaFLjQ{3oJ9e1-V z!lM~ed-L~`jF=ehC-Yis>3K%9b>qxnCfHO-c{AqqvCrj4Xmc$`{kkKFX>RZG{oJ(b z`V(T9HKWf?S^sZDWzC89%hD~DdHxyHdvNN&eI3K@H?TZnX#I#8JJ0Y{$WG&z0k&G{ zm7EgCT<)8_@&zIXN5sj0VeVQKqbt1db;qWQm?Q1;g z%+wxQH7w>xTx6GT#sNP24ZB>^4U1^P^dH)0PDqt)ff?J4dmr+AzarYCuE|g)@#)S{ ziyI#sM8Y-sb5ew(($MeSmzufN>;cAam=K35}eA77-AyzcF`nN5cOeQfTJ?M+`< z?d`!D8!_#cPTAXz=dCN=95(-c9lNddZCfxO6DHq{_TD^yx!Z+b>i72TJi=!TvtwxM z%I1};1YE+ysB=WwU z-PQ`N%h{WqjlSm>RX*cD+eRzwnlY}!oJPCvweMmc@3+OVp`9l4WLudP;gc-PpFcE; z<4l}&+3VmLwONq$7&MQz^>g2C!cFx zjjBw!$$Do~{z7bTvl(|*kF#OY&crd3mc?3bI5j%SNpqXKer!mygC1I6H)xC=s()ho zty}Z=)~c~EfUQ3&BJuX`-=pSNtAAlu(|eT|uDxy3iOC%tG`QATv%b7E`0dip>lFe+ z$4zR$j=X%{jX7%V>0lCkK4|5H6DC#4O|&uJa&X7I4d;6eIIqE^yqVIozHf|)slDOu zjEz3^qq(gDUG@dGa$x(PAFymvbojBbwiW~Wt-cypH}O;F8^g5En)>)2j#zrSzV)-X zX}YaOgddOoCE4TT7Oh8D=RV*bFJpdqWX2mC!^HFy<7I(smmJycIk0(9(@oDkdf44^ zJ<&3h+uK&x!M$&WwbiGd{kz`yCy5#S$?)|V>&Y=DzD?A6$Glx!#pjZ^LExw3%)% zykA%xu6dl7qfuziz-ZUnf-v}*HCX#x7iK%UvV8cE$Kq{UBhA*9I@D!Rm*bc z)-K8H4nYa8EYcdkUw83i+WhXv!lrB6#kx4Qcl|B4bkZ z!b|;D?L+FV_fOJTZecm%mn~Hie{pnfKAg2==VHh9p}$Rk5WyO>BsIMK(lRIK|L{FI zS-Xqt3ti){&+2F!#MYVG^7ulB)tr^uw)VXp8@h7r=T7*0%Sg?t{`#+vRc*(yynl&3 z*!|KoU5yrZ=U5+0I=OA@WG&X1F~JREJ3H2P?HRlC#k%v?9AC6cIoiy2v}b?&vW}Zl zYrgV1F?3XW-KUK!*c`};EoYVNW!cyC%&))SYB}MX)`?`#330Pl*L&bQGWNvf@7tTF zXsjCDwp{YGMlK2Nrv|he<>Y_+S?KPFxn&>h{GIt0w||#;@4Xei>j#XR%J~?uq50=3 zuY;~?uR1@kPnUa3%V7`U>rP4?a%W)n3p0VqDqU>DxN%f7W+hl=zoR zVroF#*T1~8Ee5{zHC(wn@YO9qw#C@Ko!Nz0Z%ylT;XxrF0Ed7?c^S70v}a1U-rP@^~JyD#b4EUY_$JJtoAU&OHZP* z(zK_x+?e84BhJ8k_^y{%*PK7t;p=f`dgE$A6)4B$*KD)yE=6TMm;ojaO>*yDLGO9kfVOg zwuJjl+qLlP5a~ax#plKA)7QRPv?e&^#?&@@_J4QBoqbi1&R=P@UJPE8+3Il@tMz+p zt;@Ez>KJ?T$KDPfD#c$)8?mur#qYHukAHpL(Jtk|m=>XxXKm=Tww%k1L(Wn5`_A=k zaQ%VV$RiaQ`##sYrB0c*y=K4VXa9WkZFsj8j@*HBo;crZIlXmEK!b%*8_Q^!ceJv3 zXjOi@;hqh4YZ7#h_f2G2gXSM;?Opk*$EQ)7Y9^l8^`ZMf>qntI(~q(ZI9{i8erej{ z(xElo(yDp>dEv&mYVWMH{Fr-**G3KPIYs}}*tA!NI&EJxF=gG^RKpKk!|{4EDwTbk zHoJp=b}zk3AJ&ywG^F>_Zw+ca{%7IB>lw!W>0WDE|Ee+Pyr222w6Z-yuXP{Y%&`2i zgbw;OSwG67*5g?0-l>$Kk0u;&8S>V>sJzAx}t@W^hdSM4m@{pZ4$?ulLY z`0)O713zlmY`b!ODXU7@q3AA+Cd7Il+R?;@8IxM}?1+u0xRp}BmfLdUX{&&847=6n zkgF&6?EZZ8*9!wOy?m?aHSW28x%m*i+NrDKv}Y|?=QZbw(HR?#kNyd(h)Z`oPfh$> zbKA~ya~7Q0{_tZ{jaVb^&2wXqnab(b0Z-zgada+rs(C*nd`S)R<9u!>97L15K`X8a{|qYw6TQX*K8c&04ixJ9bgs zK@NKw>a{Jue)k|Rv#GX+0>?cX6~8RnFY39*xU7?t|4JFncJ!&5pznGoJ^qs2hxWmN zdk!0QSvK~u*RO*tYTBKv@TNgh;s~QENeOiWcl^Dii-G;)6RTEo%KzSfz@Tv#v~N~E z84~_S)*h!*qnVWpoVV<{-{JXCyUsx^d_TK1>ua{r%;n6Nw3r!nVm?lqyJ?lq>-86Y zAFIKv^*&VQ{FL2~(lrjG*9>paWzcu8M!RZd54z%A`)!89$Gq3uUTb+Wt?P?4>qd>kKedYJ-r#`4Kew3UW9vNZ{=%|{|v|Bx5ct-H` zeWNV39TI}r*E8>0&P?#TVl#$2toDgb&95)KH-s_&IQ5dlRBmfCrv^{PKdSq%)gVso z%x=H@W7X`;nteNbH5K-+C8(`J=j-n`?P zf!`kNh&7qR?mw}tdqy26&q}p>kFPRddwN1&|FhF3uGI>U@7;5HWap38QQTWzbyg%j z?bxIC-6s8(bLZaPeN=PD=qn>@SQ(vpf2;Pu0US@erP;~DeQhGL{nmzUowZ}omu`)B zj!J)L(&9_E!+*q+%T8B=JU&%8yeXUJLuEXb^iNiZ4IqICA&ISZtZ9HLC^2vtc0}no7m68 zzH6OaVQ}ATOMBz^rwOAc|JHl(nAC>n2JPtX-ek*+8a~`zjkv*fk4-XNe4jS=8T>Tb zv{O|(%O#d+Q=Nx#JmXj1>+AjQU|c13W)H85zZz+r>D4Lh?~JAak`;KnLe6x8S^p4%~Q_tf`RiBMBfADV~>)&?n2-HXzF!@O6 z!XbK>Ch1IzWrrW1H!Q{1*Yl5FU!ol|R{Yu3b$I!ABY&I?jX%z+)h)2EhDn)~U)Qp} zzCZLlP3Pmiv1|>GWsz4*w8r|Tu5CU`zgy&!UQ2)1sWYYp;~u#z@~Vk_rgrx3hm7lk zCx>*;yQLh_@R(F5M0f6_%tb8ysNN5MnX5b3J*@ttS)+e!jf&{>Hf>Ln#uewMTJ6-B zHni>5vp!|PX7|7f4qe3*G%ZnsC(EjMqioE$M` zaX)s_3)^YKMzwl(e!x8Q>i%6_E!tYF9df=*#sbfW^Mg#!{uVI9puFebdM7o%#?+11 zd)SBFyiMKuXYWTZYX3ELW>UkgcAGv-2o#aP9L8;z0a%G z7p^y+_50PiYrD8*ytExWtZxg`h>tToo}@4p=D5wAI^wHCCw&dKCDr05#;m$?IeF#T z;hi~e?sc)atC74uc-T_^+74ICbZaqt(Pamxi<<2oKd-tdrM*M7agp9vJv?68)t*|} z&vZiS-WoS&T^&*J^_g7;Pp9=78yTqayn4$gHt!OBSMIF0(CJu3Bb!tDCju=t-rN>)W~FUyfdpzuYY-VpQ`fJZ$v4vevg-e|2Ab|8XlG9G{lpXR|1_f4yJ6ht3am4IAEfme%eWQ%AH4 zbC~6s;QuAv?!x{Fy${ddP@kI;adB0e{>8504LoXS?`?kDdRF?o2m5yT88mc9Qk!lQ zUR9`BZP5DN2|fu(Q-5d%HSBCxJH7Abml~0Jx>G`ZL)OK*I!<(LY@NN}jqbkz_XF#izOHM>sknKw z&j!wEpN5vFj8ASalVLrzq4&;-&O0jga~f%QSM=QL!K&4BNX@XJ$Knk4KYJ38 z>s6 z)E-*z{?dk+VsJ~w~aM^vv<3Y`gNEyd-`Q>&tuUw>X+-O z@ia;|#>OLc4#ROD5jiSPyRCIXxN14}dNhW`2 z@2VW{61?r{I_AcZD*tNuY(2cKPb(RgcB&e>re!)meY^Ngm&RXdL5gwjbi>`~-EN_JG<0Y7eMAp!R^;18NVbJ)ri0+5>72s6C+efZ79U z52!t$_JG<0Y7eMAp!Ptq^FVfXwhmAUXasZw0)ZJo2(TSE1gzzUlty{O_+cl6h5&8- zR8ukV0NScN&;y7BIKVrgp!5X{?g8rn;$5v6xT4gki1ug!OaZO}KLBM@76iNo=zQo7 z7?m1l7ZF3@^P0e1;4M(t^a%jU`21@|tQJJlPGM+6S7vr81odiG9SWngcJ&>IK?{sIa@^c=%dUOkF)dDv?YsOtGm24o!oXdO}EYb@YNd&y`Y*%CnB zxeMvmuQ<1*yt>2Q^1ur~*~Ena+Ph~aua5aG4_W1a{y;JyjXt74^Zd#xj`d(K3y72E zm;&b0eTAN_8Wg6FAm0f%3DC1%0a1TP;|R;&}j*1LHA5Gwqh@J(B;_sEz1P4mG zrf6I=ps08Vy7&~Nu|?{Z>V0v7Hib`UKm0Qh-v~$lL8P^yd|`&rW23NQ1vsYnKJdqD zYJwjY%HYSRC{w#Iy#@IOz-JkBm8Hmp!nCER$cCe+KYb#L!%&9S!wm~dcgXH4qn^@= z(VAhYdqyg*-Qb7u(wrrdzh4|5Rir@=MZKpvOBMPSbs6v{_51Yw2zg26?~_15(lu3H zMa7i=h&1*0b8vFP558jjBTEwPsrFap`3-puWl>CqGK*EIcTtrEKa~M)%iu3bMKX|~ zvN-`{g-TLH&h$1#wM|s17km~Vr{BaC{~L)a`Njm~92KX4oM~@RK6hU>j;jK+SKJ9G zRo_d2y_W$+(0wpb`hG~rpl>1;ls3^d1|~F*r2C2RT=D_pD!ZSl@>&;_1v^~L)Luihf4CbPyaiiYFaI+AAlm&02(h860g=?qE! zL!ptv1q<<*`u!5Q7X)_Em|s=>zPKj*j>N9w&H<#;S{%*$3Y$X2=~oic;MiJ)?Oe#G zXGLQ74k5iPZ~`bSqHDiGNoZ?vHo&$mh2>Zgxz8o}8R@j2|1Xj9s*0A__dejj+5la9 zMTI2ZXQ3dC2lKNRr69J^n5d?>>!u{6!8T>QA6XE8U&za^U`*>%^h{Y*v>`8jigO+u zXbMo@R+MO~G@n9Qe?Sq>`lQ)S`@pQE=~GCDe@2PD_66rKT=R*QRE4S(fwEWor&Fu^WJqw*bYzx4OX`8P|`~gih>9A`%RUtZ&Bh8d#Nw51nAoi zx%;YcybLHP(HPHK74|~Ttb!_w`U$GgwW!O0A833{`)UeG_f%yo6s7l7_7qTI_5Wa@ z!QeyM3!(^;_Rjv^N(l?*q{HJ7gt#*GUQ9EPgEE2U?#~1YIsn>tO)B z#~|zevA%_=Yf+I6f7JsNHJ4WUyic0nV9N|Z8r?<#O=-MJdOrC8*elIhGUn5|VU@!6 z8FZkrthD_teub@PQIHQm^#T+{dy0Zhqyr41IRQt4VM#?r&%)FLzA*t_Nbpg9l7|(h zJ)*K<0IhG){7#r?o@gUlwlv1!2Wj_6VZTW`euM%=u0MrNw9nZY=mWR{O8+K7aX6RY z2O1;EI!;DWsnn-9*sa!)*Ee=RYbs){FE}aa-A?tlvx>pVg?4HI$g@TwXyd%XvBkjj zQm-N!&>o=u_KKwYV5Zb>yp;NeQ-A}|Mm|8gA{(C1%R>R`saYt=185@}|I$7Q+T);T zqUS|Q(p=59pdLWm&^vTH6y4~2ezZrdZb5Za*H?}Q&^ENsHj&>}$_S<@NAsf370#>- z&|V4ZQ*8jfqM|i)q5aVd0NR74EIJ9sxqHTnitWnO1NPEBqk+IxKy=-N?uAQ%Wjsgz>Wz5~dR%Y6Tl7%v^Da`W*HXoPSLnXIh0!%A1^BYy253so$pveD` zE{2X@yhjt!k8um^?%+SduA~vIYnG~SUPx$Ssmbt@4?xd8N&<0V!~j4&#*^Ce{}q70 zXg>vAGsTtYxiH=9OYNNgzt+s(5qw8`>FE99(}3t603;PjdI_zj0_yi(^4IKQYr&s& zffzuQ&tD-H0tF%fssFR480*zsggpSiTLOcD z1Hj*avWeCw=^5o5zz$Hqhaub`g?Nm%py!8m0AGOCRQCb2M=KM^0^}hop9cI190X-&!a{7Z+R6Xg4}9x&r}X5Xes(g0KtF6tF6`#;O%pdqC|0wFlH5P4;zs|)ITWW)u=9zcyiauI#4~f^&VuZ;oVb-B&drJEGGvRybE3H#L0KLN zG~~0-&F5){5`uibxZF55r+RLjBNAux;{tss>I@Hoz@Fe4nzX8&LOC-(TXnIN8NMHT;Z zOa{q?IRfz+1#8fkGJ!i|0P1@hm~UfB`Q~t(#LGnzFLF6LaI#Fyt*kKE;FCKgXRZ&gV~@ zt;EIo{v%079Q^R(Tpa39oZJSYxF-Dw#aX;cIr$u9u}BEt-@G^}WtEf9#vuzv{1k`L z0)OKOs{Rx=3WpN~{zVQrb8_RzL7bZ#=ddXbg>uAYr}EahOi|9KQLG#M7K>g+wA~7EFN^eu((-3};@9X9@o(CxE3t#o7O9 z%1bA22@yQYZ@8R9i2o@LaRNiV=rspUj$DMSPMRo`^R3;S!J3&Kb5MyX3Xc%y| zqIMRFQ!H0~TLpe>Tg7mU?^`E=3>jOV3tg{1KkIJwFQ)hdpM^f5sffDN#i z>i7k@FwDJjIpD?BKWY!CJ)ri0+5;-_0QwOPz!Yc*I0N)Q8ol|)^lqFPP~`siqae6h4Sr8$UOqcN(WJ}lA?TH*nD6M%~NEhg(z4kZKMo8 z!Im;Ws*J`@RfZ0Q$rE-DkaiG}!bvoyEA;=bfDU=J)6D$%06gu44V7?wI6u4J@Q6cC;dsPtX{+2%lA zZ7-}peb1tbxbpz%ZU6_Md#D#+49GLyMR6X*i{r1XG)N525i9dA&8L3)h70250nzy; zwdp57UK*?{TSfUoF(W|G-^-)tE)>okpX0bPkR=ZT31$C6y2`$H3RzPm=pjpTsIWg# zfxZDzQ1TPzsmx<2S{C?F0EMZ&eFZw=nELwN1>na;UAg{;MIbvrA!JP~fUbh7G+wGD zkdI^9cakW`lrx+l;G^sidT9aVZ$(h9k8pOA;1qp(8eTeA2LvgkWp`Jq5m zqVM|%?)7xPDlaM%X|yIu&sb!o$)Y@z8HZBSMHHicDpMp)G@2~X2^j`J6F}l~Rpj*q zXxu1`=pOV_e=3lptPt`nf#3Ox9YEL=5FUf^vwjMW%c~D+%hJEhl9#U{%0o9=m!Lj? zuGztWG@321TreaVF?leiv4@$wd=*_DI-JNuM?scje&nJut^J)9FcAso<%g#t>p-7| zfV8pON0gCxtxMAfb!m?A5D+GsbEy0ogs`rVPv_@hVWlJ-uM@79pJVWC0FWOAv?xD( z6j=v~^b#l|CG4OGxscHu*bXcJ3bd|PP<Lj ze;VHv1^o-618kyu(K#7yCm*S7K3WjFWT^{VY=Jv6+D_x47P9bFMj6Pa=P*`4f&C92 zG~XEyqyw_jugb7X8c!(K8n^-o`sBwro(0IgE{ZxdC+`oW0P@gf6ju5D88Vvz|42~u z3(~3YAbTnTV(-aFr~hVk1)_i#fV@O?s!3}nW#mIHM-F9aEJ4@uDc~ePZT1|HWzL0S zVu`K~J7w4=jVI)m0}7(MScBw9B;Pfcrl+#D^%zNn+X`d{- zpc{=*gMep%qKMWb$?h7m=ui~OKvx>S(0<8{fGl%06#I#2eQ6Ic08r@~qoVx>{WXE= zKo5Y{Z`T8Hd>lnc>lm8=dX`PsP$NM7{dq+wEER`Po=Z@X??FnG zndmza_JALd`<;lI>hDCr9cog0K;a(1g;@q@0*nD@os;G`v<^tmvFUgfFbQY@sC*q) zlEKi0p8t_<&j4B1y56DeHlQP*^0f-cq+4Pu;2cm;x(xb|}~61}Tq0ivJZ-5j%1=%lgK=*I~1qk$~5Q&oRU4rry`U}@l#4&iT7ZUJ~(6Q*@ zXe7}6hW12|zkk|)j<^OO%nQ+<=ow-P^*!Hj_TWo%faL(q4jk!1tR*=>@P?@_*VvKEkYb|kSH^Ilx+YA&)0)wuAGm8 zq#LjnkVK>8WeY}bz$@SyAXD4PD??Bo{M!SWfHujh06jlb_`0(M6=hC_PTBzV4ebC|z#VV~=zdxbkeQddpxOg!59I9uTu;19 zN^;1-t|auiS+rXTVFvADLWpfjypYQeIsA~#4;f7k`-3qmg4T@mNfNDd)~?phQgV52@8A!$h=7kqL<;)A_Z#E1Ti zjEgYS3iTi-iyzXRg$?=HASNe-s)%PAVXIh5pO&$DpBCIvV4@}kX#8CZpy!F@0j2hN;7|QmA7B^o3J|5Y zNH_ot0(fi41vV56zzbId@0+eq5z0!WOP_+u2M_Y=30Z}Tl%r?7azCRK=#0A6ffNy* z@QjDBnAR4fy#U|LpUCwIiP^H$|F;_EEpUVFcAu=P5S|Pp6AGK z4731*S;~BjdbIv4N)M4>BQukH7K98s--UfhdVB(E=aVI`8tS_NVL+bGW{^+qC`uCw zC>#9+?_FWyyDl$Y$e%}rgoxU_K=VG-A0@<(4u6rP1M*Ibls$*|J|JJ;PeHvh0G&I+ zL~9S-1UlfD=4v$GS_MdYMw%cfFHZ=5g8^~$Hxha8UL&M=o;2zqk6bDXhBObAbPpkU zT)-Tl`}+n!64825p4YrM-B5@6DrvNluPgO!)Yjt2M;w1?X<&4e&rI~$9nDp{0*isR z0zNpd0En))-bY%#*7;Dc4M6wgt$;9H7swP1QHbW-AB74J5iKK69DEFb4?_ItFwbiV z`K|!@>@kq%{YsiHs6Q7FB?lSmQU8Ir3i3~=?*x1k5q<^n{4H{zejy z=-QTRua&?7R1YBE<(JN&BL2lR|AhL9`4CQR5DFCd85ek10Gj|w&p?rtOVmEpXEw;c z#o}v%CymF40_%VTfbNfk%fL3kA5iKVw|LFesrmH)+AD`LtZ-Fhu>%VrSdyV-2P{dj zvNLqjdH-z9b@1x$;9GVk#++Cg3Flg2 z*}@8UTxW#Ayf@BhAw`I2odU}eOm!f4odQ>kD*ksEYS8_1I6z|o!bm{s`HM0%t_%mn zU621FUE&@xe%&~P0;2ic3V`n0H~5JY;SRBc{9t|=n&0{YKb1qgvS^y10Mcolo5r3* zLj~#LLgaS`77FJf-V-2t1N0Qm6Fx>B3n06Qc=H#8+W;DK3h1J69pPgX@DLP2NcS^Z ztFH$LkBzzt*AYHOx$}Ua&$xx-HI$FAGeGxc^0UM-E%NMuX8_SpZHf3GpuMm>(PQL~ z2Z+)Ev1<@W*8-e?-1!xbwE>#jla54zqPzuh2$4cOr$G~{Lv{ZLLpH9@ literal 0 HcmV?d00001 diff --git a/Resources/L050.ico b/Resources/L050.ico new file mode 100644 index 0000000000000000000000000000000000000000..3898518e63a830e4f2c5f93c8df1000e9f1c0e79 GIT binary patch literal 104632 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 literal 0 HcmV?d00001 diff --git a/Resources/L060.ico b/Resources/L060.ico new file mode 100644 index 0000000000000000000000000000000000000000..af72fdd5c35ab6e44b5f84ec78c2f3f1dd798afd GIT binary patch literal 104465 zcmeHQ30zFuAHOZ4l#~c9BU_dzTb8JhealX^?6P~d2o0sImHlPkBG10>3?X|WAx{P& zd;T6m>i_*sGmOmI+?l5L=J)B_x#yhU`EBPe=bn4+9fr|kj2I$4rVO*ml3|8mo6F74 zS1P2(7#Cw0PfuaK3B%N|(PLa(vh&du7^Y_*v@9dc7eyMR#}uU$@`f2Q%(f+Z%v|sG zEzC?xn?ST#tCn7!sFqL&^~|RL-!}|nIlPru<1YS5Z`Mrl?|S>_g@?;#HeSs2)Yref zK6-4sqLpVgY&>@O>*5=Hoa1&@>o7fd__p(%wkLiq`OzoZd*0{Pe!DyO+P*yCC_L_|DVo$~tR9iNBp-*!Cg7qR4E;^*nFt~ChQ{ldVu zNNCKXvGo*47MGahJHpQ<#rvkw-B||l9Oj1EN#>vJA3C~T9;feFyu_pZojtaD2QEK! zx5%Or%&oCitMhzK4I^ew=rH?=o>Oc$W_SPkT)V$~k~qb@dN8(gzKz{<=;gEiZbJqZ z+?TNR=GyuzXID!%3Ge9ft>@*5(^lST6OcNmaIZ9bd)FIZCT<&2fz#i4QpBgkcxKB7 z9d%)*p5 zHs0aAGaM7sLT?V)Yr;X*fdpZXnu3v4MoB3+yb-d-|f%b7rTsOH}STN&n zv`PvIE*bVTgFAimwR-Km47mgAl^NA!)`1xB6EQRTPpM=&w^ZYf%j!9d3MzQaw}SnU zwFgRh4l;}gwi;MDw55$j1-*vlMsbHuffp7 z^i^|jbZ3}o=dq^`n9cOJ_1Jgc_gr&^%VSO~{B(1Yp>Nr>d+M5ajWlGe61G<2Ir+Ki zr}gu{+jrn18@={td#4QScJq{#{n`01C%Lt2)`eksZB1ip4GRjZ;qKJ5LCtZ7ycvTG zE*eHu8#S)c+AiJJ8hI7q&5yU>^*wmg*XF@k<9Xg8`pm1bw*3Yc<2D+$&}pPz!thUq z5oQ}5xic>EiZUxU%^oy}u{}2|a+^b&wBxJKmn(m%T<_R^ZSLRV9ZP;4|5DR@4LgBxYK*8Y&l+` zVXvfP6^-P;s8s{Yyv7b@(TxpQ-) zkHuDZ{QGHq{AQe|_PF(XGCIc6zhzRJF%EjWpDeDoJD^?1%hzun`u0z~xU{MRDsUn` z)p+mw&*Qca!zL{|lzjNki;N0~OD*N?a*11#U>0-LbN`T5RT=dBijqrt`yEbCo#&U) zmw)d=;IdC;eNFd0xjx~gZ}fq{c1PF7-7DR@?H@Rg?SAq+#4zp9fidrUUw_oE(aE>x zpSSnxci`NU-ql^oa%(16dDCm)&^UhZ5XULS9H)H#bSJ!Z#i6x(yiaIa|FrX)UejCb ze%yX%k<3;}#A$&x5yk6fjue!CF5!>?ll0n-hZ1oFI>|xMxYWuXa^~3m%Ar01*zv91Z z!V15z?nd*Eb{N0(Q0F06+>U<;zhLbd+j?^3%p>iFZhKbg!GMQzZLj;zesn!Nnqe}% z#xHH{)M4d#+qykcGg3{;EU8sH_EO?;=9Yhrp*E2TEup>b^CmkxCj77Zjn|L7pFIlP zt6$frVNI^Ex>`Wt@OZ;M~w~K(&~2W`?*tB=FJ!L zh4ChTR*s7A&J@4!$iC&X)30NjoJm}`>C+R7g|`=)c02LD7Vq@jhljRqoHnWe!>{Ia ztJ|GIeJwZp57aa4vUJmwgmG;Xmh(57{Sjm}#)LJu?~q z>Pd5&RfzJA>mRk{uU%f;gpX#1>s=j8U%el=*=*0*4@tvcK0iII-aF%wj-$B6GZ!3O zIlRiJeh2n4eV5E_{&GW+4Lxr8Z@>FsO#B7?yA`b$`%L{{>Q`*!`pl3iK2=)Z@^4zR zR=u8MOY8|L->BT{`bl3_K0Y|tos(>{kon89^B$iDF571LEbM-;OG4olU#gaT;^1v} zrp})mCtka3!RZqj_VruU5|eK(vl~~AtKYjvz|%hpcG*PS z@v=Acz4T2zFBf9&H#WP{&#s1H;D^3fA9{HY{qxlRD#p9#{crxt-F|P+-}&=(2PSKD zb=$4=;`|Huf4t6T`1?8zC^NWr{;`!^Q1?Y%ZEtqEQa8iue~#QU&jyT}XZ6*D@t)VH z^zcg?!#!*``ut`tf!%MWvJnibF-LE3(t2dHfDz5jR$Af zo}Azj)6?>Uk?V-)r>m0Zr(5ub-HK--=FWLwd877AX40_e3$Z;L$Laglt-9n)wT$bd z9ILgdldvduZQuF+9KAn$hwjYmRCQ-?K|7oCA8y2quz07R8aymzkFgDhUv=(~n4^wG znZNX!=nHYhRgfX(!&Q>VB3T!|Ut z7r7yzRMsQcHLj0qnN3XLJ!#x=cR9~CDSj^FXHVta8SZBHst~uk-ho+RLqF(yp4|F= z?Ba!ZZ9%Cc)+YtMA7?*( zd31rr%jbH}uJg%eSy5i;F1Ir}pR^xu)niUsz2ggFY~3$(KQb?6(slmfs5kGQH0fS# zXwP1W+iR`(eEZAm@tF&Tw*KZq$t&=0SRX8-{L-pYnyy33(!oBub z?|xkJ(*Wl~E8bRWy6E`I76Z>cHcK46dtjStljp8l<58!E{$``zR*oh1j|eOmG@{Nq z*N3b6JnB<;j#Y+%(fKc_K8dgQw!O3O=F9gR3pp}{UCe?W+s8CAh`V{`%-eeYfA@ab zl__3tNBrF`{l_lZx~PuLDgE;A%9=X{xsv!TEu zcQ4O*Px>$o+VAUE?aiT0M(_0fJ2u^3dE(cHRn{I}c4=CH1Gg7_sJYGmLMOMi9ZFs< zw0_OHpsTH}jcc>>^(UWm$C*h3))gOW+byj+w_0-75<&Mj+l80!wfFJ}i#UDnW$B?t zoj;gvZB)c2p#8g9H7~aB`r_c6bwjykrQ6!2ey{i@jHtqwnp^4>lTjyw=MvjYoB!Ir)V3|85&Q1%C{*tshs>s+S%e`7`DHa!O95;T#+MdA&cih`M zMSsoeP-^ER`q&j++^>OO!|_{*%&8s5t;R8I-_^V#L^ z_r&p9$Hjkm?s>B-HK@<(qOZ!G*1sF_-KTAvgH<;?y?7xe!`)`^)U?XXL4&|M1Fd5V z8J({fJE;1s9ZdroK1??mon_NxLR7=)7taap>Kc2pc)b0)XrtIJLB_uICk?Ol#&y!-IW1f7EpA>XqhlGp=DFT_H5y`W^7!uLgKkAHjo9oTnfN@)f8?{1 z%fpj9y&rt7{mA~#FW%NHy0y1`-Q@3|Yjr<+aN61%uP@%Lbjo~Bg6|#9llfPzzx^-e zL6Tk4gr;5vi`W%Uy zV|elT=IOUA*IhYyZa|TVgT}h1JRW0eynfc0OBK4smsrE^c_;bV9`EpwtB)<3T9&C= zzroQsivm`>6&bB8cPvgb8mM39QfOp_H~qPH)2%)0zZ=lY?_06)`-*$is4}x%+oY!h z4n3*Z&;7KQo%J6*#@AZoTxuEfrAonzWA=S6zUtoE>3!ndH)JM;zZf#Jzg|R2)|?#y z1r{!-t7n_Cv&5Z`b&f?|2z6@7FI-~3XHxg@MeoaUBQYROF0;#hcw_yPZzrloHrLOr z?Xdf=BbCm*`)Yh_YKiVXisC=z7?ogB6S;qMZ7B zYzh4yAF=c3sa77B{XM4t{l%tJdL#S&6=yDK7~}qEt<&SwBY`CbuWlRu;$c(st$q)k z5*uErzoJ}y&!o>sYRo-3_fxwf%MV>$aQs$}!F}}0Pg!a+rEZHo6>6RRXn)PLMB;t7 zj+gpm)M!@y%>m1j*U#BmUcbH1sKVVa5B+Ff-`ie^wVtgvYmksRIq0)(L*v-Z&L-m; zP4z8)XuvKXr{bmE^oPwKTqrhi*B>KypS;C)`83eNgt6i?VUI^LM~8)uK6v`O#Uy@( zs~sDRZe~__c}VkT{SB@!os{Uf>b+IwU;p%(y=diFX2tx5#;F^EJtD$wJu3 z;C;Q{zBLm}KMwr(;!gt?yGtjwKW{p%&Ap3RLoKfCZgDjx)M1M4Ke6x9);Fj$D!9GV z7?)1R#~Cbd<7US-?%2k^vP+rG za_7VVm*C$0d;J}}HOj}lt;gWc`>cZsP14)?sD1GJ32io-HqA&>f`Um(Go8U0@s%N9{Gd-N`^f?n;*A_}DefD|VgwefcJ@($*Dec1Gn?|WkGS)Au z(s_xC$??r^(k|Y9lss{1y~p|tQ^&g5hL+ow)>~6_QPmwy92n1?7Y>#TNr@cld^n;= zvWbHQv;MDyf+go!dsiRTs!5j(K1qg+aM#JK?-pI-NO7B}H!Zn#t!rBEY2F00D&G5D zZ0C>jP73SdFhQS5=svuV$=lS5aKl(Cl^}4x}vPN8*)~089-y(rmEW6E{kQI7qQiXQGkDQN$J?(Zpi*a7|$*1my z8D=Bxi!`=g(Ac^6pbdLFq>V40967g3$h{MP-b&vUe>$_prhNwM-CMcqC(M3PvTzxL zC-KD^IQwinXLMrDw)lqS?H%-1hkRc&|GwTojo0y(eYabZaQvoyWVyxq(KGK|)N?7c zLcfw{_tkB8FV-v2)zNQsg_=y44JOeKp1n6NVbCKa>h7lYEx+|&+_G>P*Vpr%Hg6j9 z#yoL@Gj~*aX~!-#UpG@|4#zgEL54@b(Z{EorH(C&$tR{&v-V!Qn)uE_NEt2_;Es-_ zuChswNi<^w5EkeXT?BLy&_zHO0bK-i5zs|I7Xe)abP>=+Ko9{^3# zF(@mXm;V1(btCSUz$D-2RZ>ud@3q@avm_S6vz5kM>p1A#yW zkRRwBjMUu+u+#Srh~<_1(CK0}CSV(Dq;;f91Q0`-S7T$2PONJ*vbk6lzyIrP(L;tn z0FbGX-eO+~J{+N=+(ZCfp${x!ze_YG@enlS#`XVv8^o;uuwP?6#l9jM_Y2;$`OkNz zk^w;6=vnMv?01RAB>oLeb(M5m$BqafZgkuq*H}-ntLPKN(evbzy3Wj91Q5G*Kwc6b z%69=Y?ic~|19}6VKue$(&;u9-%mbDSK|CdL=e6uskXs(;53~k~$mY(!weT$%(DXQ; z`g;w~87K~D)!Gf%GX!`Gh$tN!bAf-=egJ=l1K$Bn&<7}40Mr1qc5Vi?wF9KlLsaww zwAOw_&qVN{5TZn_EuLjkZBJC-WM>{{$BrS zA?!_5A}G<|E&a2#_HV&nn%`NggpbOyenx|EAYUBs;ynhN4S~miGDP#^6M=m3ya{&F zoW8nPspcp4qHU=F;J(y zc_|yd(LKDT=>ilsRfpe@Yr^vtffI_%UInegv9i}6xM)Hg8i09bv#2zfLQ%NG4B zulb^V4?!{m^7@^oZ6bSAP2mg8W#0zapz{!-s!3Yi9{$<05hxX9(Ae6VjX*(8Gl1si zR3*A^abv?KZI%Ha=^i<+iSE%WvJof9q4`HPXgwSDXuAvqswW%4Qc=b;HsS;u=sC|5 z6>SkUXXSjvhF|KG0cX`Y_alm>tdz!pL)h>Ua@+tm=KGGYVNZULfp|p#c||lA;KNp& zAdBV|*q{z<*`)1q5UfLN1WbmEYpA2=q_jq$J5V2}4wMCq*o+V49RpM)TECU&&#l;u zi!532^{lD^lhgi~Ed6ZO!Hzd_Y*C~-f=!#WT^0hO?(fsR(L@a3hc&>)nr?4R*sCo% z5HniiuTG-zSXp)Z3mx>njH*QI7V_Qt&D_QozFGn_{#G~PXV=wBa3FvMCwS_$QoE!h zUTi-jmDU9_)$KVHEAsw=H2Xy5k?OWno8-gknj**5oUT^4->{#J`xsW{A=K?FTk;Vz zdf!hIbcHROrOAO4i7YtMK$`r2V>#lbss2w?XZ+v?eS7&Kpek9Z(@t%ZjbN=%AYexo z;E~7j2n=fbE+J$a18jVc^iV465scj7vjANt!|ACxe`X71P_vw9cT2H3d^@`&AvnIFU*J&Upy+(l( z*@2Y$pJJmbS*pt~7{+@4LuM!7ftb^`uJaDbAfcuw-eceZMOQq zlt?DqDQsk;{~;#(_(w{8FXs7Cs}t}PkVZ4Kxxd)9 z4MAY*`mfIZF9bW;c=pGEoa=xrQu|yM+kL2tJOo1P`=9)Soovki+?3Vv!n*%j|Jx`K z6L~CjZ*Hv0ekiXk&F#-L{<=DVh^?zny$iKzJTFhIS(kQf8eVvz{b75mn8XYmcdT?ttK|!`+^v$^p;JVwOtmXK;MB@ zmFS$w(S)ziqsaZ6D*oKlgdf_X1A&TCC0N3?FEr&3^szBkk>&DfP5F}7dJqIl;FYXk zC|GxxO<$ms19$-RPKh5t)u(^m`j4Fbg8+3{C5S2f1k+#bQ5!(xEPv*|1BDgcZF zXbo0g&~rBZ(KcBKs3Rb0&0B6_{RxdqsKZCdrFn@}z-K^{^snuI1kn^=^BbTW)Y13i zGGQ;hyLuSV6tOywCGJaJZX)r}xS0Xv!z(>I^&q)J=Oe<&!4$AZRmL4xGm4 zNMS#%|C|E+k7ZxP#jVq1zo=Um9HZlY2EfKQQ$%s1_XqN9j11i+fQh2Rw z$wy$Q@7elRns}UdA(Q975ege>0hh!LV`00erus+SdJqdb?%Ae~5Liv!wks+hw&(-& zej{7oHgBY;Zf)g5ENC8eDZn<-HDt6l`VG5iUC=Cm?nzaleEa*3)Gu(nD!}$RQ54UU z+SvEvHo?$}z&4S=xk%Oa{*t(zY;VI)y4Lpw-si$+MVio>NEf#4R);*;NykAm;3}XD zQS8+E{)(FXtqr@?Jx7x7-iJg?=sV&40Y%q0-3Ko#&#~3f&pBnn*3!TlK-Fs=M98Gm zsLk{7eop@t&BJzj-*-9i6_7Dy*9EasiS+$ze*0Kb-@-pTf}}cC%OID=3s`&wyNvN--j2q1==@?q!GeMx22JlD0R2q2Dhf0v(VEsV{V&$_g2k3$^kU8CxL~~JEGrz5DZ1V#@ z;yYXmJD=`Hy8^m%y_$C-#F*Y!dIo3%orV$J0TVU5trIU60mOR@ke3t<<#hqI{RWSi zyShyY5kTzeS)QioGZY;I=$S(?3FhdEG#ml+1Fc8z1*8IO6V21oyH7`fe!zd`H*7WB zjVi07z5!+fv|fkSn9%bTWr*6)x{s3ptrMX4A8i0#pR3$Eniqh6qxbIVeIF% zVjNOh*F|{`fOu+Z-a?&5T?BLy&_zHO0bK-i5zs|I7Xe)abP>=+KoOkUeBjIy=^2UZjL-<#p=l#@%HIC@&fT<^7(@LpZ4+u`Jeu91$mB0dscQn zFe}3&yNIf3Gd;TrsTVk#mhCcm$05!%S~L$f3-}6h6_O0R70PiRWSI&pcOPdD@Sj z&Rt#@b=ZXVh@S%a&};{IoQQQT># zB+9l6!UTtoNd3>e2W<+7C*Thh=0yBIve~CN(Qb!g0sl|&*?G=SenGuQj{MK8z`mc> zX4}sZtEas{EK9vCrVTYb@z&y;`E8qiWZ4to0(wjt{0Dh5Od?jf5Ok!AfGz^M2zGTtIE#9f556{R7gYC_Mrrjcr*!heIYEgEU6U zNiR@9eZ;Cx$fI}9s2>%jwO~}+_aI2N97D*~hN|xGqV|wAK#o39HGK`Fj;QKAHcBZX zk1ZbP3l%BPWtxh1M)K?d&p`#`Pm(8x?Rwa>NddcLvC#Nh<~J-*ZvhaWETUsWZXDI% ze~c`n_zQ0nZlO4QtS~GpI6o%Gz=Ft zRxtenK83F_%Gx81A38aJ=p2MiiS(zm_R`8Bh0blt&{Ju$)L9M#hbdsB+}|L8j7q?A zU_WpQkhf2PyCb=&!lfF2UI)uO6|j!_QRZ=pdb-}x zctRCgCasUuQ4T|CZtkK222WQ+KjcgW=sKBO(&%^?Mk;dL)0}i!Mf@io@X|A$!$59G z?m0$LJLK`fxGKOW1&qwqF$uXHfFuRvi?ei*XEz)5P*?_dD6Uw_Hub$rZgrw9-2+Yl z6rF2P`?u9#3;BKzP=pSEN#=P^k=Q_nHLwPtc*-KR&VfU*2S95B6d{@quu;T6MR_2v zHgHaga;5Jtl+bGiowEUXV?1%whAS#x89peW>tuJ}iMTRs-v?CQ*TijsJX2saplF|i zRY1G&UtARH+mLSp1Ol|5{R8w+RS9HJY;A!)06pIzxysTFG$^X7EsC~>E}AD%XkGz) zqWzf0nW?}n;3`1R<7k^=sS5GYSfyv(iu$cAAM7d$kdNx32N29r)-Fx)!?ro zJTL*EdA4o90f6qeX`6hV2y_N$9HjAQ%gXqoqk5x{juQQ~JW3dj_G z4?^^T6u$7gAY9?66%Y@Sh)*lfz?VKaAxP7N-;qFCFvEjBCBezcz!xfbOkh^J0alxV zD;?lsI~`^8(TjBO;16lR%5J0g_IBDDCNNj z9#V=RAMR6{?tu^##ELG65a^_jVt@zAg&*=j8c2CY7+|ij0|cK@K{<~?0^*a4$`XAi z!UgaJetahat2lJui9kSfq>BK{5y0_D&sFLH;{du3*aPr@Q^M^PNSgpGYtFqm*g~fk zPhb;3bC+~~CW~mUethmVveOba(42BBfab`QC3?PCoE=M)mjc~30L|sgi#1rJQhnt$ ztKI_EGzMrtQH5x(z*=={6qf*fG>Yg6dNA?BQd~I;oY2<|ptvbQ^vo_1*bS@| zVy7_Q7pcA^lTc1EqICilX`3yAthxXlbMlDh5(fixd?@|Q4Q<>2iV^uw^T(xB^#L-9 z0m*Gl64(lX#3}ZG)GNKWTIb6-uq!m8Fa7AWxC?a&&Ag z1FU4pLwyJZR!)XJYR#{eqwrLZ4Obu{wY!fJVCii z*H~$~A(x)di0A?~UWqa}(rMCUh|0lFYnmhxt!1ENy9Lk#VC^`DtV+ORARZ_MkS<9y zM`Wk86pex;HALAXpbsFrF8E55p-MUAQ;d=UNiO+ED30ir(6skWy)nP@=w5Av=hBv&o(6hUrZ5-x$r zrfQPxM>*|tbPUn4=>sUTMy;$QS*n&nH_aPKqBkg%crSqR4uCT2D8GWA^=koSmIp|- zB-$k{HejYXGi8X5FV@EXWEbSo7?kdlrBP=Y_7_H@d4MAKxg?*)P}0QZsvPp@9#q87ZX^^wk7pjh`nzQw`V-&^f|VyiR-@b$IwEIF1~V+5qG~U0b|?FhJ4! z+_T`7c)l0c$L2QlRR*pBBBK76c1{uTNJ=lGP@{9~&_{8p=gH&CZQ7lD6K1aM4& zge#CFraX*8Q7>2?hBTd4DIpd7E*4V0FfUlWggloi7(?|aK7*9jcku!lhSqcOIF#Z9 zh0!pr-{N5gEPIIhalxc1C^8Il**1Ttfac8=CDz{Kg+l7v6h#$-?-Ibu_p~9WB=883L|0Ha7N`Z3 z5W)fJZ}+1pTMf|uQt{WwO3#6p&Mn7*ob((8bg%iF9!b)`N8>Hgy*bU@EdX%Fluh92 z3go2QD6o;;^4D7MTjvyl{0m?ZAn|z*%IUaH0>p`)2`l}cEZWfAlQg3Hf#04pqs&V} z1K(dgQ!EELttH43FG@$|m-`Fkmx?oB`yrrEf9JFc?S=u8C>e!|fZx7-jk2pb8svID z3UatPWQnrZa@tCHR1(reOv1FQBwj_z&^}TqLv##?M8C(zZz51e=h;jVlQ8u_O7|!h zzcr9kfHso=+TTY4IqA1KZZL=+uOj|U*dUu$$x$b@8f_bkgb7oUC-E62%B5XnmPu70 zrvftj0pj#ZS`#oG6K53Lmiv57hRh9Oa%l5(PF|En0e=G@0ZHVWvyCEo2r3HX+^4zX zZBZ}joR`yvX5wuW-G&gFHxei6dm5VlLMST?%mk!8=Wza|fdU!GqVr$Q`HCa5nu6aR z*ancD;-u8P9U687a`q*i2WrdGFRBBdJ0O}fA~_PTS0a8<3O=%b4Up4*6lH~o_!LRO zPv;{VZ~k@;L|Fx3EI{Y@!9Wmj8j$v^a6jsPxz;FRgCrivp=U{oJVynafcD^jAxW}w zQwCWRvc<~%PuJG~K;pSBH@c|}rfIJp`cV2zP+HKn$=77yu}B ztSGBn$IosA&|le<&Y=kuj7;dK)XgzjK|hIZ?~zt8!#s_XVZg_mas0px2GHYYWfbIP zWf<^02wAAhDoEgZWENxqyai{@_eeKS_uz9f{22~rJUnRDBa0?eXhKGe=wd(%2Fd_G z<|%Nd(8N3i%%C+*Lx3icwaO4H+dXY{8h&BVVo^_r={XJp?{rDauwx*D%y!29{+Q508R;D~6eGrNcNo=jZoSW0eWa^& znE5_lo~27xED6!2JG5`(OSJ?;)HCm=`DZYUS$u~!ExS*?ov~@k+MWrk&)$C?IDG4n z9uY0|yAJg5FkLqH((GBMJnaTE=4N)CN_A{kzvHYb|Ju$!8&_u2(?u8egt}Nx^x09> z)TiFOW(#**jXho6)k#-p{iR)@qwjqTKeFM~>rb!#*!}$O>rc-=m~^_|r^l1)cP73* z&~#$S%*o9wFHL-yB|UkzIC->(wZA9x>8kaqUPSzCtH`n=b*6{y^jmS>_gvMKuv&f> zc>B{6tuM~Jow3ILMLQ;aTZNL#ZMMxDUv39eE3z@--PJ5Q{8+e^H;x^LDa!ZVk4Q{aHK{4Lu zsgujS&T4fw!111u$K1`?Hhp)d8rn|Nk4zi3f567ci@l$PSeyy49Ix{?&pN}U`>9@W zH_MH1vF+22;Z@Ek-o1l?(?IV_#m{tSk_Pp=S*G^*I>saV^r$vv?UmtE2Na8foLUDx zJb!IfX@BAdKmU{EYE3DBFgf<%FX<000#^syts3Z=Tg&}GxtJqsTA#V#zGh$dzxB+b z7rl#_=26-u-TCtVz+>smYqNbrOPP%PFhMsqYI(4C4eq@YTc(w5x~u!xa+5nBUsLw* z!b(Rzov!lo)bY56)e`pymfhCWYTV}Fx(Rud1L5|d5Ogj^|MT`+Gl=Sow3db&-yeh=QwKXl#3@Dr0Bovx}bU-liJlH zJUMCRrV@T(TQ=;Btrca<+-&7uD!$7e$GB@(Q=OtS7Ib^LXMR&lqpc4AwiaM=~j;?*x&MibJe5-!{|O&-gt~Hw=jFt&NbUd-@d6c z>b&vvvmamZ^s?sL?7v*^Qj=N5mfy=-8MW>}%z@@3YNf3I{PA$3ZM_oS-R|iyzP)?y zk~{m4Z=F{i7tXPl7Y&Z} z9G;s~BE!ootx}}b0Hdfg=CdlD@V&yVXWajvYkrL9AJ-R;JTP_O9N!2X;|E87PxW@& zoqEi1YRxT6$NkyXy>qW~F7cNy>@{!y#x3JuY2Kj;y+>pXyxQx3e{{H4ySG6|Pp<e|lhm=V9!xBqL3 z<&Mn7t5+mO%^p1Ny#CnD=5}FS=k&YX#c;v4Ddj&$U2c^elr{2v+KLie&xMs}>6q|0 zs=_~3)H|?9H{7-F!N|e7H9U_MD;w5z{lVkuNhA7l5?ek9*zoZ0@m51u8giY&18m#< zJ1BTV$f<{E39*T%ecM(W5D;fNEur+eI-{d)Loe=hGgw)YyPs>Bm2R-3`?1`4Yg@=Pmo6d$95JkR_FM z0!mbkd0;YY&HS0akMs%(emE>Q!N`_#W!J)~fsLz?Q`Vg_B~@p zUyU`Ke*J$;{hAYuH@wNypAp@3#I)^+>z7;&9zJzo>;som&)!Yg5oo@k2J`;xvw*YR zJuO}|a!oi9W>cbk;~KX!x_WZv-PqkGFiCG?lC_g*ty*c#gY0!8&D$-ku%hi+v(9A} zjvIE#t?THeF1m|mf3DOldU>5YJM{eBIM?+j)$Y7t{IrHTaju`!0|uuzIq_jZm(m{= zjeqW;4*_+|Cw90oid)6th->2h#C@&WHflX9^>o*EoIcCzK3g%uZ+P0In{!M3d1hg& zYHcT*FRjXP3A=o*Rnow6hUSfG=Bye!OeZpW$Ff;TpA4Iy`s7#F*UKxr&GZMJoRdqu ztda-3ik#zU`l-C7&HJ;Nn_T^FSGuw6yd9I&CaJvR)BTZ8md`22T#26@+;@D*;W2fc z%N<&{%Gaby+0Jt-=}fITG&#w-Jg?dE@uPXe2aYzX#c|zTr&Fz@#@Q>|xBPTEqrGu8 z=H}AJRTe$FU{$rsLkqj^tH#EeZZ*Ap^x5*2DO*13>9(|_0+H=Nb z)P$aED%W2bZ!znb<3{H0<9)YB#5Ud6$z)yKP#>#yr%Tv2xDu26P%o#;)>Uo;FZVQZ z;EZaTdRb@AVaF?rn;tf60vcoSlu zx(u#3`SEi1q>g=8@_rBRX?7sNEV}Ekt~G2=d2;@(x_6NGM&0Z>H@i=}Q8n84v}4Ei zCtmAU-ZZhlu8IGXs6W?liaT2IucLP1E^~Hs8|V)C$8c)vu{!NvUcVFI=9*>Fjg$C$ zT%f@&%VVXx-->Ti%5ra|zRVx`>wEh?yMJ_0xdpXyyz5n8=P+bO*=hFa&EJH*AC~D@ zY5qUStG&)N;zm!mI=Z#)djGn{Y35GOvvuG7W?>e+xzS4_u32D%S4;|1t-9SL-JP5^ z*)N*xu^4q{@8wSZM|Q1G?S1Dn)5uLMR>XkeT^&;ImNiTb=hGHml8ANwhTPy4SiF!wm-#q*7@ z&GImIO*D(SaJbveH!XZ0EqEDsILCNwd;4+w7M9xa%(G6@V}}}UWjY@_XIQ4@y7`I4 zo9a}t-~|PpZsc#(SD&d-@9po|Q5|ot=IJg=Ib*rO)qYZ>`>R$K)=hGEZS3TH<3x{V zDbex-!8LV^Vq*=_6Q|`@kd)-<0%wTuG zHOEsim7F)Z@6B|t>G@FKf*Tn6i&f;NIZ;g`n^f<$u2&0_ZZ!x0`?`)#Z{EBMJl*V$ zw%hAk94WS_i^bV0ht_Y|IJeo7&#U{jtsbWLy0)Pc6W!K7{!PsO1vM=ro(@e+jPJR} z!KW9`Z=dtZrDg`Miw3=SGCa~gJ9^EM+%5r~ohD@&a@sHX)PGntpNqeO{it9a zKZCNxYJPhDsKuJSrtO$@oB!++5xw%a(M?O6)VFzO`hd5)#w=6rfMU8$EAr}B3g0wg z>b2pALgOmdZrkpRcldp?K(AL@+jr*Pn0_-mCCsi=`CH?yYF_a%)LGkVW`#O+gNn_u zO`JQY(&MJfeJ@1S%Lb1ovf!Ww&cjte6(q@wbg{ ztsg`?H-7f2)br3<-Cta>&n-WClgoala`~ozHH(i*e8y~O(yafO32~2_Rw?Fxuj~{< zX2+Z}j55q}s#K0iTM@^rz9s(2z%h&7nA;w4nqI+bUQ;`-HUk=T zm_5F^&HI}*beA>Bwsy5i9sJqU?(P|{m-V+be%aR4$~TZl3Fyp*0R!z%)Z$h>32U2h%S$YLokJ zAqH0Q*M=2;4WUBr`=*}buIt+Cw$gQ|*8ZGz;9qBx_nf%gHmB^NflvRbud7$*&O>)+ zkE?sU$4!Z`*bv8U=U{v;CaLnOt<3$cWjb}*^!hEml{Z?$tM;?w(`b7aS(-UCboLx%IYs93TJKAVX(* z`x8l{23dQ1PY>P5qz4=s`)~u##V!6u7ReSCAi#gqA=H3+J_zkTu{pxi1+GUr?Yd%Cp=`EdiDmLoe-1YV&IXSO* ze>-ie*g>u9 z?B`A$c3{m5m1{+8ivJ zZ)2j{?e{$o=eB;)^Gf>SQG0@hR<*dEKI+w^>bm2bjd?Wtc2Aq5_ck-e<8%@eM{y6` zES;C(!`SyeyY56y<3p_?^dnc9Wcmi(35%<;rI~dnj{U-85hjr)6ZS@w?ADhVvhjTI zwdE^}=a{<0PaS&ejn@$KbpLu0gB;#(Xz}XzA(h?CnpK-ow)~)2$H-(ahbyMWT&IS= zcI~F?;%^a~W;ZHf=1V5hc(#kT)4;|~=8nTm(+BW8<=?p^oq%@>NLM$vRAnPm(6D*{F}`PF#2jg{55! z?!E9(kKU(SEm<_dK3vb0({6wVmI>xpY>) z>z0G>m5Gk2GxdSZ@}=&&HR@Hny(^)3`dgih0q;gkX?LgDL7#rz0`>YX+#S=;r`o6F z^C>A$ESq)T(k}4ml!`&K%XU8RW6=AsMc2<0&+I>KzIJ!&f|qUkF`QeAYK?1l^2TV- zY6t%s&9MrwWw=+H&(evn;JM>k_v1RF=gnpq?)3R1v-E?9AARWh@m9S~7FfnfkNnu= z;AyjrVC%<`{^kF%ENiF3aHbf|a6a36PHLM~md&OZ2eeDlXV$h3EdD>9o8Q8)x4#v8 zd0|rbC%O*9rrEw2X#8pX%#tIYyVTg35$)D|@2O6%16nfMmIl0=ce?Mr3qebYWyZzc z*j&>XP2$MB`R5GoE+$^^Qv0YaGjS?_*q})`eZINBuQu=|{)R znlT9nhK=0zH2mp^1u+?Ke`8*Zw{@65v}(nJL2De!jEavvv0;dl#nYUi6ZVU}9nOtT znR7I=ZTWE{pT63Xu;g~nIEOCxb$*{4G`7y1G$;Lw8;@AOPV2R+`|)>`tE@eJbJV4Q z8_$mMyKqgv?1h~h6D~LJay;Re!FLUPDp@aH&rID>e0;LbG3KO4>m-+~MIGNuUljUk z-N@{1UQ*zW%1NR9u3=G&>Co1z&B0dwVKs2fp#rRU(UMp`=`c4-Gkg>jXcKJ&v=Puo zKpO#V1hf&*MnD?@Z3MIt&_+NT0c`}d5zt0J8v$(uv=PuoKpO#V1hf&*M&P@RKwe&6 zeV`T44Hype2Ry%9hqQ)^jR5+z0ziGd6gUdJ2XX*O^b{3gKy|SKwS^iT0rXpGU;wZk zxDWgbC_~TDs5?OK2xv)zBY-|C3-kaE0UrQ1X@Ca1{?nR<4%P=60;_qc3!TUcgO2U9?Zb!tm3XgN~+tZvmW8SEmcFknmW z_bdl-@CDugnn<5uRAV;c3pw?GOF~Z4x>Xd=9-xoV{8R*=b%6kYuCJO%bl)+RjZT3a z6M&v6NFu6R3DCS(mkphoE(3lB1DZ-S|74}_sUIL~lmd?40`Ek?9{3@jKfy10=1$jE zO{5Djss)?p59Ea_=_t*I2La{Sw5KR#!IyqOQD5_4!iLMhVPH4F0mcH=0oKns$Xp8) zhW_jDX!}ivIy3c#kN7q!^1M&-C3zSgO1*Mun-%x-pdIUicKz%?@ zDT9ij5p1mkJOR{2e?if&fOQeL`;|)AK-X|p&VGP1xiNsEgi15zT43 z0Q9-rA|=?s=5HUweM5huq)m}JDMLBzqcy*xAllEm1ZW1xu#)|1=&S_LTw4`HbK>bh zDfTUAS0Ze*1B&{dX9T-m$(9D6&jP9-9)vo}wm>sDV5>P$)cY7-!v=gvT|ER{JpfgV zdD_Qsq8=~U(*m2{0Yy#t?7iv{cEIYYX9d@f)2V%09<+#Wr?k<>U?WMV@{UiC%L+Ac0fGvuHpdaFSIQ*E$R#2qK zNkQFupfBJEs5N%b$L2HrRLC<`$GBC84)`(~P$d=ldrEMQtu_8!$WqH(RULg#I^a(~ zRdzmP)4FeYb@?Nz2fEv^=-*;d`QLjUv7vpAs-_i15hplB&v=qpaxNWmewgdNpg-V~ z7fbPxCWe0hiwSh9D}~M)(u`8Du9v#(R;M1sz)Hb5D9f()_`%Te${H)u?l$s2kJMzXFF`~Vj>L9hO^^)IkhK+R%Ixj5cjpO&q2Orhd z|0mQHBltx74hu`y)n#u{>Oqh$7B*0Fw$A~d%D-7dI)FEF+9Zu_R8jVex^yD|2c!j| zppN!*7nW%K)KS%bK?m(?Bwd9edNygRYFjlyKK!J2c%)GVDk-Mf(wO9|>#J&?VMl*C zZIQS#YJy%(J*gHN97a7lKsRSqNQ{hGqk2Da?cbU6rA zPbtB=hdTawfOMl2K6$HD{yY$d?2^|QDSR_Dz2Dff4>2eX&>E*G(LUMk0zEip||p;+f!BcX`)=j%m(-qpm`4w?aS*YY%B8gu4G|})&W(zmJa!BJnyd~?EBAh zjM!NNv`6Qg_w`U#3SfhbRTWPdrw80;!N@YIvhjPBTM%0|*3?zm{|2yA+Ba?F9U9-w zJM8KjPY4{XtJ3@Hg(a1}BL%}~?T7Xp6^3YxYx`ehU?C=K^?x-H(X3@*qj6z6UZ}0M z|HbqQ;={&%DosECX&7kx|NHEJL-ZXRd;Pz=cR9s$7pp~xEA6NJ8z?MQVAU`oVKA%& zK=-bNB|9Op+CxMD0cETIRW|>pj)I+R-2aQ+^99-Z6o;R2K)`Rhx29*fg(X$@KO4^~ z`wRCm9JT~@0FQw*U_0=`?+p=&0j&)cmgrfcO207;`TGiMB-+mw_>N=hd!87XS5a14 z!1tr4@U^L!7${nF9}QGGw}yOr*RZe@C+JTIS|&xHAo+1XLrNlwrs)MSI6AbAq zuQ5{i=sHyrkhMSlcUAkNDe@5u`u!^`sr+3q7}%h&Mi#VpK^iGTR=lS4kE-oJ9O&KW z!qRXx*h$Z+*qEo%T34;@`qLAfx@NqVi7_df}@%a9xJaid3uoonL8j zfT6P1@D=ez9Ix8vHq!hpOdXt~_dIutb5hB&%Z0H=*|xB?Di8qd1lYKLff$K&Qdv7S ztsOj^D$z^jD%3JJhH0h%J)frkT}^Y=&w#qH}=NHznK$U)~*7)E-6nq40mgN{it5og(&X8ZY8S&vx1V1{D2oTa~`& zOL2sbih!(V^k7jb(KYkC{8k9;ZVRy8_w?MQi#o5bC&Y1N^ME+UR6=2uh7>IP}j3w zNzQjtr_ajjg7NfC^fQv2V4-}HvbGhb9qjH7(7oS#7JN`fghuy294ZY=22^pq7sTrb z4%GU;eMH9$^wZkqctDk79OA#B(W16!N*2U5SWnB4+eW3$i{pUDo`L(hNdckT|L zY6{jc-|2ks1Ei?hamc6VL>hbjgKfou7C;0*`%qLtMgG5m;1qrPrXH{scnYYCrfJgH zmu3qBLg$4yK)+RNt`V=3rdJhpu%F(?wguV)D*$y|=b+{*+J~IV*LhSFzjClW2srzd zN6KXmsKQ2)33I5A+W-TA5MTj7Yo0uyDCtiq|L)&^g%5Nd(LTq8fU>`r7uf87*kK3^ z1MUIp*uw@j3egF0|8U>PgHQDQyCtw0P~>^YPPY0Vdg(X(8lb6k4u<^<@4V1l!55(Y zBht=6nn(Ds(f^P`_beHJrqU02-plGcbVdbWEN}^+^?m`-xEL?1y*%}hL*FjCED)@L zDV+!3RaeVF&+?Odw|XL2#6~*B|}2(qKL=OrW0{?E_83PCxGTOO98dMulKX{xv;;8 zwWjnx&2N9$_gRHwu1Uv;xeZX1*Z(KbKM5$3_p~&rFN(?*#Gb8pEg?#7qWu!|TuiNd zc8V&-nyeRnuu|?`D?H;Hh?onM)8v@^OtzsfYyjFnr%Iw{M$-WMpDDKAi?8UHet@*K zW>hOo^na|QfnNZXetY+OiL)l#i9Q+#6lM(2`gAI=1?T~2|CfO#ceoha&}Yqn1AsjA z5==J%;vWSR>HF4V+|d>(5drig?MrA5&^Ih-{at{mI1U16PlyAcy{0P>Uu_d@1hf&* zMnD?@Z3MIt&_+NT0c`}d5zt0J8v$(uv=PuoKpO#V1hf&*MnD^ZqKyF7w|@lUhJ58k zCS&teo?#4x^VuSKF2m>v*P}~>^Et@V!vX=J`B!0WS0qp3NgsVnnTW(A zpDR$wqr5?04&%R&IX@qQ*Jks@LCvK{J<6Dk=UR#Utb8{4I9ex+q?7g_zNO_9Kme-1^t%~`I5Kc zyDysOSCeAWgz$*u1^tG4Se7a17UGvHFBp1^M?U|TJooE-D3|&tvmjh~c@Oz{-j_Tg zk9r02JQ04;yjXeA|D+%Q{Cea=Me>3G3F`mL^W*U)fCc_Z%yYkWD^+K|McD!!$piKT^KRyXO!4{QCTnLBm3P9+sfuzj~Y)#Q24u$Ip|!`R$QM zHRns7%g-ZQP@jJy{Fmnse-fWRKyieT@LwK+(Y>O1QlHPyV<=pFeeOuZ!G0p!1MNEClB*G`RD%lDT~1gz%;F z&7p$Kd~JMl@;UPBLkcoTI3(}CEI%(e�K{1>yyH@>W1x)Vm8ZNGUIrrM%!Y;}`St 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 literal 0 HcmV?d00001 diff --git a/Resources/L080.ico b/Resources/L080.ico new file mode 100644 index 0000000000000000000000000000000000000000..c62f41ffe3a84fbeaaf678dca12b82ab079c9d85 GIT binary patch literal 104683 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 Z9C?J$x4D@0kjEo1^(W?`-J0CC{|Bs3+~NQL literal 0 HcmV?d00001 diff --git a/Resources/L100.ico b/Resources/L100.ico new file mode 100644 index 0000000000000000000000000000000000000000..ced488e2348600553451ecadd622d2de03f2f48d GIT binary patch literal 104577 zcmeHQ30zFuAHNks5<r9#%ol1Q>WiKwwe+1Fmknun|*vX?dc^6Vig z&o0?gr2gOEG~++!&2p!?)582dpKs@$bAIQyojdoQd(OExhS6e*Fhp96DPw5JFe7lx z=V#|FifS=aP-bT*%(rEjjTN;ROUvy1HZz8~;DVN>!h9))89z&lDTS2ejV#14#w)a# zAcyW9^^2PnhiLuIo!U83EukptnN(lbw+vGzu5-IKy?o-{uAQ=?_wAMEqI(u@)T?0) ze%V=t9Itz9SQR?-^}dDM?zIamcE+yEQVWw|u1jm4tJ3Z-ow(HgB^{Sq6j@fmUEhAQ zR=IW$X4G6}sds)u(X$Rk3zxO;?fCgKuV}55-nXs4Bu`A8{%-AK|K6|TC#FVS^ZT;S zcg}RaooT6}g|uhLOYTL~d*Jb4$%6{J=H1t-e#58_6Qb{`6+CSJ{cUd-J+wDt`UVb8 zEb^z#lgHK$+OD-zhlQ=$^EPB)8*^sPlk}+#wsk1%onXd{b=CK{?5tmBqD}zg+VS$~ zRpp!aaxKr_>JYGN!~uWb{S_B7J|)7c#~-OUfN8b3f#uz4&mMp9Y*(EL4(s!#?RJM* z$J1K#C+{ucd&MiO%!a5T>Ee7}2vM&q}7 zf1B9)=qTT|yyN#{2KAlS%I)*SE2eIGw;V@n@7K29_=q<)R(o>5enUNQ$ zpPJhLL)G28_aD4H&EY{((5y#?Ee2@wbq*h!@wMc5o3Wd{ADj0Z$B#P{V{*7$(B

* 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%0D(>FPNClfkoBwpEOL>*y6tC5AH3@h zC_5JRF=bDF$btU`fbhH@S-FYMr@iyTZl-j?eww50klW*I#>YrPfI3XskzaD)1D%uP zA-ZmC252rJ*Y!WYe3Dl${GfXtY4;}d&2PF!_X8Aq7Avm}`N;>LB+XB+qAmcal%Mvg zS~vWoJ-pPvL{EYFKs{CK)g<}wmtw#MD-2up9UQh!Wj5Xw*Cs_E4s9f3{*%RqvBMe4b7<}5%oz&aqVQ4pJUk}#A9it;OxM|)aR^9FLqHje3hE8I88<`SJJYRIbtyfy%}5l5F$sFMFp0lBmu zD2b*kV1JM#At>)GuN+1BAX^`hbls*sX>!dkz;_W4M|V)D(ls>54;H5wWto75teAkO z6d-B6Tcvvt$TsM<0wj%Hncu-c+d67mzfD=E{milcB@GSR4)xP~aB>xf#uYXm*JB-jushy7j>+S0XOuDOCN9kS}7XPX2Y zWbSuIJ4t(o>Gxk&mTo5Mp(jRy{o7>8N4v%n+EOti-(iqu19WHu_ehx-;?Fl^v^PV$ zZ(`a~(Fkd6nW%#fy7!c%-%pkfwABLWIwg)&{%$0c`ifJGGCKb?l4U>DgKw=A8FJ5~ zLZkWKgS|45NdRkVLZbiSL8vgXoc3+ljk9gswC zP*F|5o0k;r%L9^r%aZg`Ir(5OODA~l6SEkixVXz|FHb$>(ETv|MinKBpVVs(>X(TT zO5>5yYdz#O03M6cC95b63=-cLK^>hZP67g=bHE5dq4SNL{lJD?Y3nMe7E9E3wI%65 z9nD#2t@U_ymTWxz(d z?k4~tz;CsmPo;q^V8YS&ApSgFkY=&7^W2=2lbvR=9QfrKxv4SbKhQQYq_LUU0ELt@ z9lN}cvV!Ojr5rlMeyUiO1B-?IT3mjr#Y^X~k=Nm6#3IeWOp!||t}a~s>M2b}O8<&U zQks!dFPi?upCcz%u0W5@CLZa{)H24dF|tb^yUWNHjJ1)2aqI0=fINa3@&U|DO-SK=%etfF)d4 z3qcpfpXS2z0J?`Ix}a+1&_VYQV}YxHD0!<=Ka|luB;8AhBf4j2T|lr$s+0-g}yHhewuf05fL0C8iX7^ara3g zP5EmQa?g3t*k4ot@@GW#Qy%4HYp4)EjR~4-iIU7`1Ud4mqoL?M0LgO`r(ehh>T4oe z2cvl@?b8q?Pf0QaWPc;zjJ%;_Tf z?@MY6KGFN0DUx{QEr-n3BKqmPl)FDcSPses*A79GzQXl+Iffv%K$uW!E>0HeY2S`8 z^%TdaNEw7x78aOu%oZmDb%`RpW5w|)QU-bUA~GpkN}LRoM~d+75yz)U8RUtcOP`@k ztO%6TwOp7!A|v;CTbxj|zbq^e#}a))-5&srPhpxVPOdy<5aKQ@DCbz}_qD+zx~}^b zWz9$*(kZ|aK2h5lTb?IpqMn@1$E$~>zAbGZ9*dXcK))S35NN? zOgN@%aSefdc~bCG|B0K|qWC9Tj@(Z+AWw6M$2nZ|d&|@FZL})|?8uQLE&1g)0_NfX ztu2?3$6skYkkJ`P0VL5$Y3-G*gVKtC=zNOi2LA&60HuADW+UV;0t7^BOSB%Q@;y5O zo1m*c5DXN$^(^=VdI!M0EG^8QftIYG%qlF0jH)bl2AjoBXLF3x9b)ylL0Q?rT0IwY zyI+t~pKg(hb&ghARfm7EBpXOaxMU(bqabwT@A=xr@+}guj>>L zX$pv)UqOXf0>2*61)%GH1|ai!Gk9{(IXFHD21zdP|hkd`X~# z?!$7wi-lt+fao-Depll>S6fG!|l!Axuy@}=vcyK(LU&7^w8Xl&d21FLhqS@-w3b~$di@wu3-%oGvUwJ>2n&E#Q}3Mg6F2NSWDhz ZgN}oN*f^jqi^Uy=b>1Kr>m859`X9&&Z)*Sm literal 0 HcmV?d00001 diff --git a/Resources/L120.ico b/Resources/L120.ico new file mode 100644 index 0000000000000000000000000000000000000000..b7a37a7b0c6e86bebde60b2f600b56cd2d1d814b GIT binary patch literal 104583 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 gDgq(%8N+xIKJu^(;WCsvk22v@j@D;^%m zzC~F>%lCh#8Ri>PGgEh_(mX$Z=br6Z&)j?Nx#!*(Mu|~lh?JP>%x4{j8HQsHCns;N zp~MW(Wf)sqUcN2E%&w}$SXt%dch+KghJDeI?sJKbCzA8l4cRe286cIXPb z;P6@&^Uj-Wvb5`IpHj2GI>nutl*JZ)3{_ry8z)YZ|sJwn~@h-qnT=UC_Ln zbAv$r#E>Ov9)?LS*Z=$5GA3*9;@Mq-Ze4b-Ts!s3-VJT8fB(B|?6AG_cWnDSvGQD% zQC&EOBQlvy8xAS!SXJn>GqAmRV~gw^x}E{!t{K|x?h(3az^IHz-6CD;E&pO?)QK6i zpql4w<4sjxE7`Yk+`6fPUVWP%kIvc+-+TJ-*?Q3puDBUBQZjUMRV#n*NL+TGqg5Yk zmX9~}d%NiSQG-`6=MCAqW&QpR-AvRC`f0n(zWcQQ>~=@D#u@8vIr9DZ-c^t5D&)jdon$fIiCWb3!5dQNVo)^%UZqpJskjUQ}#SbnlotCKYbp5J!A^T#3M z>zJj6JAYcO*UrIV>xqh$tQJK-Yq}w#{PzV<(^M|+oHcOc`?!P!Yb&LeS&_JU$p?qv z0|^se*6nrPZbooQgRAvdyT(n*95?ht+DMmOC-jy_jLC043B z_`eB(uWN_Rc$#E8%fkDL)0HDLmaCkfysqMtCOiJ_cXwk2e;4lt+79u@Dr%+uJ?P|_ zhS{?swstiAsNpts;F5a{2R;dO>DN4<@k+B=t#nNNy4ZHlFzaCd#(iFJWzLyir*yZ5 z?Kir7GTX!9{#@goV=l*-Z=R)Ur5W0=g6^`KVe{QPuk6>|@UH5nw&N_@I*qWlY}obE zstShJRoxsis$|y=n`0N%(|V|C;0Ghl)Z~9!=+D}u@#Mtz@x|>GE7Ja>3$o z=YRm!`yQ@4Q%yM+YA)2O7jI=dbFkA^H|?0X8FlyV@Qz%uphkqT^>9O z89B^xU1l{m<<=9D_xrt1Q(ODk(u@gwYWWH`~^vVB>$%I=voOY?<)(1UmJ2?COGhwZD&)_KKMD2|WqQ2{I()-2? zYNOdSlzFkhI;d}==W?~A35VKM;moo>xy_@DO5%JKIvo=mlI<i%X@@60{d6>}&c^W9M?cpd znc8UmNAI}ZMo-^w9lRrca?|%~n|W6~9PJt2()j46yGP1-)NN27VU94orIEvS&WV?v-?`Z=?0rj;+wT=2f?)Sh+5ZCbW@sQ*Oo zUX3$`D1}CP_#a%@@@11LR@*c6l9M(Ljhv*H+44Z8uT>{sYO8ho$7-ieKbp2OG4fgd z)Yl>Y+I|(?qgOW#=$sysbtJR%_bb7RXZ&r~IBLZGi$kuKIr<zMBD!}MCJSSNI>cuIS++Kx*O^Ot>3-`rnmjV@<61fKU7N_+yZT;y{(CocdhLP zSJS37>6!A^tAO1*Ei>vy9jx=OT9wZ4lNKA)PBl$&Jr#J2v&jF=^Vl`M&uhGLXO=%z zFY8ic|LcKG?T@DoozeH|hCSa}ckkz_-eaZf>chRBcv(2PZ5@`f!SU;wCeeM@{uioy zH`KaHQj2wAk3Y{m6n-@FaQWN2!)llEbYKQ8S-HmPTI(f0de86lWagdz4VA7hn`>>a za@8p1-$6dBciafsTlRK^+d)j1(>~7ceIHM|SlTsxPoHK6oy^-hG9%8arcPWpAav>6 zQRnwmZ)~g5U1i*vkg%)=ho1kZlXN>|PoMpxZ$3EmD#E?lr259DT|4^dG4}07F*}w{ zU$&cRnO612RGUq8ltSjIc<$=C=RxINQ$m^zsurQ#V_|L2QjDkHAp7_lqfgHo?dblk z{GyW!e;khbx?z00xn1d|FItCbrUo3c)9Ri&EG&6rrB^GxmbHsFUvc@_h5jMiPW`3z zey35yuniH%qnAGKtMhmL&Z+a~j!K(3=B}la` z?wbGXuXeN@K4#6{xEJC3yu9buxp-~T*B1>3l{QJJ)x7h7uh~I|>P=qhwuCdOt8-A> zPa2a08zlN4Tl3D>??$+xpZoAJ+MLbTBNANvTPbfJdHv*x?2fv@p2vRtV-Oq`GFj)5 zHPdpWbJs&1X4Xy#_-|o$$C%1pt5&SGYD$|2alYk0PrCo8&ex1eXMB}ku0A@g$6ck# zMjJI_7CSF64>GBCzD9>C(bl%BK1|+wvfrkt;3>8)@#Bd)z(TlQXqpOEuShTQ*$z5OQAvK+3?CI`d>_* z^(_5c>8ojvJztG}yYrM*KhElgR}vE9J+dyk_8eiOx%B0eHM#Ax}?=Bz4_pdm>C)$3ux>xTqE!`LIAMrh|->XcM)yra(6I*7Q zPQUo+#KZ8qKYUJ{?yfvqYxLuuLrRS`?dCq};)j{z8^uktc8Te(yjAVU^|<8j6`m#A zw%j*s_N#~WQ&%u!YXo+RQ;UoWJ+kqKJ@dKB0u_sIZDZa%skq(r<%pNN9?p9AzLu4z z@qxxkpVKZp^E5m#r{#&v`>x8W_pTm0GgGCvLu$FHpCgT$r!-KSqQ2&muSp9tzkcyw zE^dfc?NO><%7DkiERT#C67W*@XsIn%FI>sgQne14I>TjEV9)a_{I!)b?@Ld&eyGSJiu5 z{h{)KzA4M6j0&*Ve5iV>Q&pv=6Gmla#?-7AKhFA9*WG?$?&q@{&0Bl!9C{-xezo(t z(lr*JzaP47kD3-8c<)UttUyL{AS-} z0Y;6>Dy`VMWOL2iDgjE?b_X5O79Fag5zeDx3t{kZKb;R_naUb{0exr1{dg{bO*AfzMU%%D7RczFnceBESPHYPs z?>*P|W-#OW{q`wqw^eqwb>GussM8elbc0WQJ5L`t?S7el`v1IV4Ckp|t)yvh>rm6} z#Kb*a3MQVCFYuUJ&Ti<`-P48@YT|wa+Oa_!-JT;OQu>`%yrthg6Z6&tlM8z z9@|dqbXVnU{cJ~rZo4)eK0n9JX|Ju>qH@9R>q-xta<8-UfreRTUPc)Q_1x=5tjhk@ z{Gsa7#g~|fP1Ya!%+n4X>^SdqRd4Nl{7=ZPW9LSUoR!+avL@rWRB6|p-8$t9^XbI%R_$X=79(F5d3rb1lx^ z?P|LopI)VDj5|Rq9A;|8_59MFGwx^cTG7r$C9)*k$*adr2E#N?F3dB#;oW~f%{g{hOLnNk!d z-sE|l`Df=&H>!3?ZXY@4OPp$}txZ=aJgU6T#9E`r;%gqS4NrgWa5&rldtaS9bGr67 z$DHS0^XnmVjJ~Ot>)86{Mg8mJ%Rb&TbzA6_73)TyjZnROGvY#Yi_XpG_8fHboKHaP z#;!}^E#f_$N_QOZhuKT8pSIEHQ$`*qA6opW0!RYBQwpj zv1$#gHQM!0v{$3Um)rLmZ}q||aA@BY@3*=!*ylT^(lId5f39^BS2a%x+ud^^+FNjcd#z zule)h7%z?WU5rl+Z@FicW-VLOPdh)QpF7nwsK!bki;Mx|-gZ~opF>}ll=d%CC0 z3y-etrTci&n;lITyGJ^YatQgX+9Ter&Jok|E$;8`dq>yoUkmTQ&8s)5Vi-I7%ez^& zHI))PhTK_IMYE|}WZ3ZRzlVG&WvRQY%9LB~+b>lB~j^kt*3L>d`&y>{d`ov z)zzwBIib-vc|@0Bjp!cAJ3aO;U0Su*hw)~!c6^xK?5Xreks$T2cVanOFXNIh- zVK&Hf;?DE2)Bg@_cUos)U4vQY9-MsVkfibMwD+?&dmGHu*w=Wtrq0ksm4>!{*zu-ANy*bq@*&$p#F_0PlpnZ_bQR5@KuAI`D z^~2$m#injv`rkXZj4_$kZ|4&9VkGNJyu4dbC ztdpj3{G_eBvP(}*KcmY$oEs4DVKHH={$juNA^xpjPoC`Tyi6k|A>?b>Rr_ls8ToIk zJ#u@a z>Y~o8vj>CrPu#mpr~YLB5UpO9U)Xg&>+X0tX-_K?o$qbOJ}En>c1m>hfGw$&H=db! zILo~I;eDIu7;iG#zGcy2Wvw^Y%KM($J?~b^Ufbq6)%81$%DlGX^=9XLo!V9%IOpGx zfcEApd&+ftGBL>QuR(E2367;2J-qJFT*ubE+}wl@p$4z@wd;L}tMzhj)=@RvC7fMe z<<*rU7u@K#HEP9|m1Em3W0>JLr*D1j_IdS{2=yA8BaUiyVy2r0AB>pT!{71jNwp!& z**?d&We#3^pr-BA(P3$=FSWHXGMgLz>YMID%-RR{`)5+)HWrO~a@sY&y=$Yb!TH{s z4>`ToI~+7%eSht~KXsbk*+hWXiwRBR3wJ zrS&BB*2s6+p;*3I8>`%V-O0Zybz(OE8uwSb>29P(!UZg#4yR&N-4CV zCbM+DM@E06;9F-!uM%PDXz|&!?6jx~Pj|oS@({~eOeec;?f12H^EbyahYGOPMT=oM zq{Q4R$8ffWiX`4=6mK@PNVt3J)kepzwgg0}2lmiU+c@vvq-9KnI|D zp(vpcDt8Yc)(kKbcn|O?6$jpOS4JUF?jAs#Tk?Z0l>R`zmE09l2$ZV_5aY!{aTm;P zkgGBZVRH2V0$mz-DHw2}UivE&$0KV=D zh@(1^absv6Q3j|33AFv!40W=0mNveaQo#Y;XUv~iFXkcy} z(UHy{EdXyI6376u0Je$7#Wi3i&<7}+n@);y$vglb>HuE=akNH|BN~?ioPhO!q`zx4 zWtBdF+h%~~t~qZq2r8*K7V81{%@vS@5{VfaRs`sroG3{rIktHYS#+(D_&O!lIVGS0 z{B=f(7}0fHl5>R=EM?O4GPt?`^rn%5a`6ECV<;2v7agY8p-OLnUNuvYkO$xwnn#rc zx&tG-3YlM`v+#!sK=))Ng}%YiP@qPM4m{6z_@Plr3A~VTBJJ>XLwekjRR(J&sLulaKc_6;t{0hYjadVW>mPaFZTO9>$R6qL6I z&Z7E{I}gC7nt7Wow_3XX+~DCNQo?N>=-F{mAo`vBQFB7rGg;1#O^3XAU>z_Bs1K9{ zXzh`nCH_3k;+W1&1gbLxXg|SNfY$6D0J7Lm0JeG30n}>#RI(T!zz$`A*1_dPw6<&s zu(HkuKD7Z~;4UCfT3(F9{!?{0tf@Sm#*;<+b!Gsp{)WJ>IY9ePX#GakMC${6e>$?5 z9>9hbvUXG+{2!vOH`}fQPg7ta@CuM6eFpP-Z0j#Ce$buv-M*HkgCyXci8d~>uo--5 zUb`Kj->R&L_8k_>{f5xnURF+#l5Z;7<1@puA@FVwBuJ@~G|iXDMswM6g@OM{W2B7R z%5;Aobk_$Y+0UFGGc(YswQQrsE_dil?^1lskFhf7L+58hb}js!8)VSE&UD}_z&2e1 z!(y}77`oCNsi;u&@6nQ735<3CWHIlVDm$&&`F9h;4;Q|l_&~xV5KwqHH&Y6%+Ye#I4fnf2YuV}P@?F|7* z&VzK1_8p-6-6Y^V5C!Z4<^gj67oZo=4X6s30p$VhqG7FQEufzrz~+2_-hG*42Ohu#Vq?0En&^9I-=XZAExaFT}y z5cqPy1C|EBL3!w`kio785PRB_#0JsYN0Gk&W!H0m4mZRtk&OWW9)12Cuaq215Vrv= z#eZYT@!FqbDPm9afR`+cfd_w%S4x&8h&`=`7L;gzvP}0jl&q-8&sxNdo{z9WqvfZy zLK0gZK;UVQ%smzcKp0y(Dfr0O1Bm@{7UF+PzFI4!vE>28-kyc{zXcD)S}ub{*7c`Wnyg`pSiXO(0>r?3h14NU9e8XsBf4d1v5 zJ1if0dBop8AA0e-(4Jn!cdZ>Bkpw!4YeLVdSp6oKC|!$t8TkmH zZxGTrptW>9(J_5K?W3I%`j0OG$NV1u^(##~WQl(P<=;0b2BDIfiilYd8^P!Cm?1Mo6^v!#0mQ8_i}C*iURE+u zRKZjx9zeWQfmSEwU*Q{DcS`VmPOE!*0&}DyMa@{W8f(u$@{Ko z#tP9st77r44D_UPz+qOb{>6lzF)o$&7=X;mz|~)B6zb7%dE1{~dGHcl-`IFAEbQ=2 zC}8F9_)20MWU=*ZOW2P5(feZ6vqy&AAqD=)^+X)$T9;0)8Q6QQxSjgID zHu*ze9Uxgo&U*m99oW=Ym>2ld{p>Rt=`StYOTzjUhdhjI3ecLqEQo#+biX9Ca{+jV z%0lsc@GQ3P$->qJ`LI`-F3-`J)*V#Y{!M@<&Hvc=78BUyn`rKDz_xAj;s@Q;0Jhfz zL^<;=3hmgo3p{BIEEOeCPGtw!wn^Un;3p$MUUR7zkVR`omD#it{LFv@fHZ42XkK9I z#ikvF#S30&1AHj3Hza33&!ZE7(Exo^bw zro4&XF`)M(*8($vzCeATJfI>3`umjh_b2JQm4kpe0Nrz@0P>~{Y{#Im`N4r6@^+#G z^5}VUQKUA79WS=!!^z43J?o<1q=ItyKq9K-w${mZoW=2jZ6kofxEAE@@uF4pk2oI| z_j*W&@T_f;jqZ2m-!|BNG{** z&QGjl)dvx$b+!#9KJqzpB0X98xhV5R?CF{7aNunT9tVeua*X7m8)9z+&^53m-XCWYx4fUJK#?x z#Wyg-3|<7D#sRG#7xnu^+W$(=i{Ai}&^;mNdERXg#o(1Tf^xGa?lu7!$^S8bdx6IUYcK$L1D%l>htZSgNo@lm`%F zdRP1rAWSrO>@BK~qU_J|0ODK;_z&REMd?08Zhx=k&+=yRwFWV-0+<2ii?0<5%@rO{ zctGI+g$EQKPkhb)2=<13iU&W^FkJI^uBPNIju zeBv0VGYq}G%Oj342jSr7va=cPUl}w0S&$PedIXR|yx8%xS-iXruYjL7=H)YZ_4NFJ zh@a=H#Lx3JfO0wH%Wa7iD?$GMM**Tv-F_0H>iaW; z0}*)}q5A*JV-yJIjRo7I{-=Yv<-h0QH38xedwvmz@9>zM;g8`?RrIUoHi_Y;P@886 z^1kF2em;pIH~-3`BR35E`kdb(vCH9ymJq~k&*e{?eTDMI+>=(0J}{8tj{kG=bc7DS z@*FB4;tix2ZYK9UR~2f*^9xrMfjrk#fjlX|CBC19^Bi6Q+`y$Ip*&vzzn(9^CZ{>q zHtO;-ACtr2XP(PI_18G!GHCTHPp2lO41qiv7-tEN!*p$ocD}frG>hj>eyMPt`wW_2 zNol-bMqbC}aD^?v0hE~P_#b4;Ft@N9ouD9v2NWJ)&ja{f8vs?<<5+w+!EXBY1HJc8 z7+ricFSw?#m%e}U0N~R@9OTIu^>huP%cwp;@5$1)s7e9F?j3RHYz+ug4ZZ_VLH?-+ zj0ZLYv{z5mx0h&t{SzPxm=8DtmHB*%Y6=}`FQG8GpuhrH1Uv%rOSCsN0-(K$rHh&m zpc9Q@;oE)`ara<~+apWuq#^qL+d`mXQSk$Gq4yc(O`jofI-pV5et-_)@-|*T-W?n_ zE-W8Fc10jvK%c@mq;sYhAouGAWR5NjgL9F&9_6fmFF3cc1zB`YSSa^(x!6y|+W@)v z0CH-RzkGYenHR;eDYK~Y zg5fl$$ct!=F5mY>=u7W9H3bZcn(d?y^rCx7aa2`W-NBI7<_`c_Jm!?rJ)E($ykyxP z`t;=Kmsiq48Xdrh?!B($!jP`JGP%EyMn`^I=+ZnFJq3$9@!Lz1qT>L;&LWOyNWw=R zZJ--Hd*qK%5vp>Fq`C&8$FAHM@ya9RVVk5fpwqQH^rd?*sm3eX@5_T9Ro#+QH+i&! zK6KCZgA@}Y8W+Q))d78IEiEsid-!}`Q>4{LlJ?NY7T}+=$nHnL07?1^w?V%dfH*2r z*8#o_P+A`-&^L$CUy^$ZXTHooErtD60deQl&_B&?L3?0-5|9_sJMU7RR|WYO^<&sZ z>s;c?{skbjzuB5!-Pz~|yJ$~NG9ZqYu_3Q0@_^y9#Tk!!T4%H` ziuxB+C)iaHpt+7XqCHKl{f!s!qHkD{>^eXzpex`COaT@E^vs*)s4)P|ed(UetDyFZ z>JPq>%!Sa5d%dVBiifx|^i>0b0J0+upfM#a(e;|O81QulPg-l1zHVkCtVTLneAgprsrJJ5Z#MN zwC;d*H2$|p!(2q$@od{H$Pe<=fioiHiYubuv^QW1Xng0Yh2F_fzYB<4p+8TRQfOPhsx!wy;# zKPN+bq+w0hOIE*eDQvH(JY>>dfKX`^l~LP`qV$tT8SG(zfq{W2QL8SD~xI1M>C&?_44x;Xg(V{~+c14=LB5HrY9^ z6jK@lKT=8^e34Q^O7WSRByO5vlSEk%Kh0xCPMd?R05{<0cOtNYtN2a?98$~)BLD-h z=)5m0jXR+?{oM|FUxMbx9@6wJ3T>gY1Hh*kL7h-o8fXj*0%id8p7>HA02l|*Jl6n_ z`+J>yJt2Dsz$aRdrFBoz_aGq2S_j>$Qv7I*Qzp+O___+Gkf#OEJ(VEkXHA*kKMMy( zffj(wV*(i-fGmja!#4w!gnh_Rv+?4GLQ;B*hPm#`Mjh=xaRr_Lc@eE085Pt9@Sy9Ev@~CwTrkuJ zXx%F>`WKaXJ{y!kPH0{Ncy)9R`~=Xt@d==oIKEVmb~Mgb0=W^z-9ZvwxwS!mBVay2 z>x5GQPk`19Z2${^_Jh#)&et^v{m2IX`VkI)qw^>!Pz-XjjjeL%N7r^*Kh2F;`7N`h zuP8oHyhm=zqkOxlK1HnzdS1xI23prH^l#IM^A~g+mW%#W+)7;k!mfvol>wSVh$4yi zfuM6WfaW3n0J-hsge+x%uHm96L=yj^Bb^&R3ov+wV_MFT3qclLvqVw2I0ev&_V>LJ z(V2c%aybV>POu31RJ30L{oCZym*$iOdiOw_Y<@lDbOl7sx5R#f5dB&KxltXy3|XcS zPV?2p0QroFY}p2s5+@gJOnL2*{6;;*^=GRdl4)*4&%Ap9R)9ov6SSkXsrP^=TF91u zvg8BBqeLl>GTQGZksoBKpE%yoaYiosQ*n23{R_JuI+_8Ze*dKZIiSctBZQ7|q--wa zRoFfjCm(wE%|&-ArhULI#qkhTkA8Hof(Ikq^_WITI{?lAt&h^Z{c>O{AoaVAg7VOx z)*Rx2+=%A0%?119c8qp3r&$5K1kwRXsX+Jc5YiIJYt1SR^#g%C&q=7KJ&k$sLG^F+ z5hVrsHYxhkHDu0jod3Uoe&+{(T(8ZjBmb`fq@m5Z#Z#Jc2&D0POaj4V2dz8M{YNc; zo^#MVfI!zo13;Q}n6}dBnO9rLrQcg#zXeqPACWEeEZ`B41kid`1|TUtLPNE@bdt6X z{K^B7fILX-+LyHYQ+p^*E`g&kB|g!2d8nv=OKe%mz*a?*Km0-j!K6HOa z&+Lil8cy?fN$3$8xdR1SmqvdtpdfS-oelF767-|^UMz@kUf&l;>q@Hw^~pmv#eO(I z_wkK^E&$DEa+^CpN1d@WI-q?ZkQd!X<^QdhAy3z9dM-rk8NzfH1^?GRFMZIKVke4d zZu}lN28bMAC^rOX?juZN^O7l8hmN#HJqVzAAo?*DwoAr=M&!+@wKb!o;@q*y7g2Hi}0*LH}ay4K)K=;y3MK+SM5PazO zDNG{Y!$G4(0u5;`)Kp4wzcmLBJprElLzCYcq5zdQ`3-pK5K--5VQT$|82ElZ`5hOa-)s&SyVZM+>=QrVX z=quQ z@|qt>yjKEzrUJr5b5MGQp(CsZ%IMmk7hM(ZlUE*$=sLbP7lw3R+71i@+VMc+Hm|wT zguLX5sslfDU>{IWqWPi3)(2wrsd;#K-UpgvIj<|XVt_S=J(D^_T5*)t+#POH3 z9)fEEG&YX_Pk?U#=|uBUI(O6c%Nn42CL;Pxl#!IbwC%u~)+m3w*Fl*sKzm$QO3Rb2 z_K>X#$b7xIp!!0`oZa_^HkcKu(CcFaUo1P=0LB?il6D4@uAQNtf!|{m{U!-2$v{#L zW+M#*vXgvskZO};lWNQ{PFLsHr04LlA)Z(X@x}UvZ+4b9TIUR9TBpFW1b40C=Q;&u z2jbo*BOMB2JNnc8g*`xHbtb?81^~aEUxnqM4P7JXTrcW;PuGh1!2i9AFUSLRB#%#Y zZrKTJ0&ejOkwyU`_eG-ox8>1+r>n0KX zzVr1rYSHg9F#ru0kW0@m$?v`SWx1tjvm78=#BYP+;oK73`|-A64KvKs1Zbm!G1HuA4N6B0EJsD?|AZfG887b18T47E)V4@cd3O{B53$ zGKzBuz^4~D*bUGaqVp}EHuLooPSJqI$w=T0zp+3{dJ&1;7mYUbtjhr)JA8mXfH`m< z$oKCPeSaI1UvbNpYRoW6_*Er=bJA>vNlwO?Ph*%RJOrXmU?9VsM12gk1JZ%)_YCtt Dl_CXI literal 0 HcmV?d00001 diff --git a/Resources/L170.ico b/Resources/L170.ico new file mode 100644 index 0000000000000000000000000000000000000000..243ba516f491968552702d4fa22eb3be14eb9e71 GIT binary patch literal 104392 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 literal 0 HcmV?d00001 diff --git a/Resources/L180.ico b/Resources/L180.ico new file mode 100644 index 0000000000000000000000000000000000000000..d5338b1f3116bfab40bc17defa9205dbae76d259 GIT binary patch literal 103977 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 D+Fwd( literal 0 HcmV?d00001 diff --git a/Resources/STM_black.ico b/Resources/STM_black.ico new file mode 100644 index 0000000000000000000000000000000000000000..c35ef8bb0a55b80b9f9469633d147e8b74e46f91 GIT binary patch literal 15086 zcmeI1zfR;Z5XK#G6m&G`iYsm@km#VIzKXX%y6vt-Cq%)!Q1c2r1wvFj2nE&g`<9(O z$HbA%k_|xcANxz3^@h-dt+2Zr;Ir`OTL>p1gxTzMe1rZP-SP2qd=SFvUI>Ty zU?SpG56fK*hN;sI_wcuAnyV6$FQgc|?{(uX&sbdjUqDxdB;PmpUl^+z>HLj#-&S|s z^;~b(&ysq%*9Wh(?|Bory)qWA=SuXX6*X8 zzFePQGoPD}o11N(jeUr(^+8CvRikswc;DJ zAnKie>UYkI>wR7}gn_a5-?8ia^XKm%$G~PWz^iS%OXn0Ek%r%ppHuigyMV!F@$c^& zpKr&2W56*`j{*MC3}^gSKZl=-=VaN9Vjqj^vzdR+*YxGXA$y((y{4d9{b07$$hreHy#sr$GG_WXX&e$R_`{B?<4Ig9;be0Gp>B8oQbLG zpB#pt3*-e+>y0d32`NX3U(Sd4IaGt6Qk=P8`7`Nr<#Xj2a12ZV1AFWjo##L7F|FV8 z8XFO_IxmX-Ozz^QQ*27IE$vn3Kg1l7tMmK^TkHI%W=zia#@3#n=v(O_t*3FStLZ=W lEzN~rZU0lp&lH|f@6q=X$ADwNG2j@OG6wi8@oTIZcmYY<_-+6I literal 0 HcmV?d00001 diff --git a/Resources/Selected.png b/Resources/Selected.png new file mode 100644 index 0000000000000000000000000000000000000000..a1ae604aa9c9bd1739db2e3f71b1ef5f051c930a GIT binary patch literal 13491 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 D+Fwd( literal 0 HcmV?d00001 diff --git a/Resources/hintDragDrop.png b/Resources/hintDragDrop.png new file mode 100644 index 0000000000000000000000000000000000000000..ea8a44a30bd08975e266c24148770758fc11b122 GIT binary patch literal 7027 zcmcgxhc_HRw_m+?qPG>%qGk17R#}}@qnGH>MQ2Hfm8c;R-D0&MLi8TJvpS0?(My!* zJm2@;-|*&~J9F-wGiPS*-20o~oq_A=sF4sd5CQ-I5{Nq3;IUnM6bpRJ$NKiiee`34 z;cK9#1gIQk+Idv4ofNed0f6d6qFY;>N1eb+-OLvNApP|p!RYfWad_;c^iwhQgL*pp z1=#w$0;u`CdgbBk?CED^g#S2%VHW~cGz_#l$g(Ucatey+lNcC&>iF{46#Nsmx&7@} zqU?AIJ_GnK*DzCeu5*eurmGM=PbW8mYtR8`Cp)3o`4&dMP-+vEv8KDN0U9Elgc@)tKPNA+z^VQvSq=Jh1R|Bpq6 zwvt|gQ%i8AV+W(^a)tCZlFmN3Nx1inTB!HT&;H{MkIl!OonAT=w1W%+4B&UZDB_CJOhvb4SFIUe8WP;WeG#c%r$>T{>EUT{X- zirfloFTDKj-*_tDd-fn_{BfsLYv>_P7(F*9RqV{j_&|e~`8eH9Z=CS!`ugR?Yrm1_ z=ZUC_yW$tUw6wd&_>Z)$zwNQ5Hc+!Oi=eW_;u#|7U(es> z|6TTUdeqKmor{*GJNT0#`w_Hk?F9Xx9Xa7a%bTyF^IA_#=`N4vgPs(P#6dGSGYcnF zzPzZ;bhlmXs{ik9GlUPeYnteydMwX+&kY*iZzg!i)k-Zi`Co*K;q7TUP*D%m=WyM- zNUd{UPvzSmlp4qReiW8POH8B(``)1c9SSy-_6=`ZHP3wIR3{BZbGFN^fHva0UjN!Xcp%5C-C8fBJ#v%m0DlN5vU%#hs&=rU}XV~jz9 zNk&-xPjV~E*FdFOS39yC#+g)C!~YH;mDMjGP;cZXlR@!-SRa$#5DeSV6l}X(J1!Iq znIEEtP;Aax2B7Pu@58AA(4o_q;w%39bJZm#%YLTe`^VbURqhQtm6cj<9v<`6RiW+= zX(suv(`hGd&mD<-?h>@RTn^9{SoQ6N2~WOb#W+-yEd< z$_#t*TEb6fGlicic-qJ_be*xP>B@0dV7(&}tL4%uC+OLQQlND#`*PKyN3%9Xt#G!p zH%D0kEcj-k6;;~%v69Lea2z}5N+{&u8hKBS$i}(-Rx|3F$v=v8-p>?In#q9~bw4Ly zl6aOVoHomypE~ihELIA67cTzJ(Cg-!Ts7uQmRh3;3+Nbl=6OjfDbC6v^SO%d6cbBG!t; z$T#J(Az@PGJVr?|ip1=VgfIhWo|+!zsKqnN%l&ucJc`!}br7SkvfAzE6`qpFJrAd5 zahbR$x=%c(Peg`O=}V9g@a!@8OmP;T%+?GQpMphcm9&EaF+D1L1!+FqdfY}%^IJyS z+d$>3+!;R+TA$6uf#IzuzDi)dIH^04kRTN?d3KzSacP5$CZL67no_t44`z-@zT(Ip zHML!f@n@``S}K`dPa%#wXh72{W%p+JLM|71Ug^FW8dImcv{T?4=?}6LZbps4{hj6r z`|%?Y+1$tYzUkyl=Uko+t(~ z&fSON@Lr8?IcC|M%%Bauq9zAyg06hUy4jGSk*`#qTYnk#zn^JJ{royy{JbqtEq3{N z0pY4LYi6i1T{knfi8$b9|8&b@F?*CxGmM^Sq~Zz+AsU6 z+lyBIEV8~=Iwgdp#TuN0l+*4I^C4=CE=(hW3T-k&*bjN#(Fag-Fti*kI?ome#LQOE zp^3t%te`C}(-6qy=57?i15lQM{qUx|pQbQm_lu=}U?;V8WsedLd$?KA-6*PB^?hw; zUaj+RRxE#aUKMfI%jhX`H&rZm9>ARYaJyyH9kOz>TorcU_SqDnKE|PzkjEq&d{)4E zSF)z@ZP7Bz!RUo1-;5+*3rAPT#sORKI^Zem^)?D6axqPt z;FY#8=|8d||CYio(8MdU7fZ^z8RS757GdYpDfKOz{ILRxL9@-vIQbfI>iZ(WFnDsb z%?FUFoT}aklcQbsnDO){DwV3NlJ<@c)gUw87Fssz<64SVMLaT={qvZAA|u-!Up!kV zWD$k@rZDQaj!*^j#O;M`KAJpwFo9uHz=yBpN~P%78r1GPFBZSgg}Yf89*z2Ir=mO{ z4MX7<1*=z!4`)$Civjcdzy@(J4baH5n4%|z@OD!$;_B{VMHd{@C%xRcwf@2C3`i_v z=h?XVIWcsD;{qMPN@&E`OBNVwprqvl$;kXME^?##1(qhI-(aEaKEYqwK#OfUcoYeLTtCPG{+mPAr6@d{~w`r66aItjpYVF9`l^ha)af5=kgEKT-R`fem#vFp?C zz7MNOhks+eNHh1>>O9SDUxeTst_|V5|4y+K7R_^9`^7r^>d_lCf!F7=)(@!M`$vZn z$QwkR)#To}e{P5i+{zA+yE{Wkl&)0=Z;!J}mL!(%ulY;_^C!5L`F?#n*jh=L+3?Pp zp}jO6Uellzm=WwV9^QHsoRSs~K7G@Tl?8x#3=%yp1$tjC%}>!4QkQTzLR6^nV}d1l zjVCa=X&ICpPGBH4KdC!r*UWBGjY1oLV1)j+(y85N+v=E8Z1@ zG5RvQd&gCmL8Mf$A>Dg{0V120Ed2AGT$nhG#tzW?Bqi9nAuMb?SQtIM>hJ26Mz};h z*DZoAtQ&Rc3PV{GRhGGke*dymZWOvDy)ux@c)tfq%zu`jYgiSxs9g2T)4q)E;yWZ#7@EezG!%=XejR2#uax#xsozljGo1MNNrc%^^W|QT6#_m<_4O`#o3#ShT>+IWZ_a9)TnwwEE7+q|-K zh0p)2t**}R*Q)tYPr1=kYC|CY0blFy-qRF==$a*8LIVV@Slp!4zh`WVM$9!N+BjK% zc>RsEMTL;u`#7E}+P2RC;u9bo!@YAX*}sfXgU)YsiHN7PS_D?K8hQ=t{v*4XXv*U< zxwCvS+ZviY&=6$hH0Pot;Apuu;vqa@LiuO5&0iv(-cgFs9zHAYNAh(yf@yu(Mca1S zBS=}?f`uhE%-2VKto6!ZKH2hm=h^q{Voa|zFIxtc%I&)ZC5B4H2CpCq>`@D8qsd)@ z_kn?prJMpnh#Lk-{CSx$Rd%5Ilij~U9i(5;OgUs>y7+${Om`U=RZMCH!PO~bkCCbc zFRjW8e&T~a+r<+Zt}AZKGtHzB)yZ22K;wHfZa$Hb)1H>ZUA57bJ)e3+sKk>m%>L|H zgQ(O<`+c^m;OX+qB?l3DH75~pQuv{7ZpbE|bx@S>U46s@S$px15b1e4h6eJgo*Q<& zMr^$?V**FX3g^8&^03c!I7LQQA_lsMN=)M%aEafM;Tk493!~@_$D~@(;v&9nj92S6 zi?k!V=b=t$Ps(!eUIjSKMayM(>OH+jA-daaIJd^Y%}q1h#t^_p(AJQs=SEIvrGH1hoCCZ@GGFWdoX9yP2d96iS0aedo)h5XfkuHLBhQAPlNloj+{czC#i*vg$R)4whpV0H+tq>Jzxijm#T@w)UQdbDMO4}ZYxZ7W`7T4`>Be!GW0x*+p zb7jcMPTB9JY3HqqmyH|u@Fq`b#}`hMm#BTT79imEw%k32Sa#eiU}4v+4SO1?+oRn2)hxnehG6Rtuk?UFu(`4h{AP$?{lYfTDZSUJOkp(H$B7ZQ z>!I7fu41k)*Aoj`j-v$~v>s90WhhY(HboXJnRI6NwutTpa(KJ$_15wO*#rL8Rxz_Q zG9tMwBstheGiQc-70A-@lAwv_Ld8I3?Hi~csY-xgE>j0r zdd$BVobRFD#z<8^MN`*WA2mzVC=q&N@aUsE(@xhx>-ZFLVJKV;y65w1mYF0Fb_)U~ zgAs)UyeM18nlxOEu2Y5Qip$3_;tGe2TRD$ZRL>5$a)uO_M8SR%XMwinAh#*JQ;O~Y zj{#wS)qwrbPI{*-%|R#GclYijb2ti!2LIS4e3?)IF{yXdt^B4-f%wTcll&yX0PHDo zAz>oEj4BQbMr}j~`UBC^f6Pc;VZFpyN$ENP^ARz_FDBzoL+`^YyT#226?FVSHqA^u zrd#F|;E$B@{nZUApTMn@V;r^|vAO{f{IB5X>APrZmq&p~cqOpCJ3_uEW6hC6OW$g^ zo{2;6mqqLcKjwI=-lWNqT*W>tU);m76hiZwCWyB?X8R0Be@>Y^pRPl8xS5Q(8O-vg zTn_^7I)0`q#7L8{o7qvpSfaM$xBuZ@n?~mmNpOOPOUtn5V&4Ex2#G)Pbnl+g8eCgw zx%ZN41EK_0Q>S`5qU@7gs0AvQFs`*f=|Iw%+ zBcijHTV91-82+Xh)>2ml18{fcCWW?qDP*|#W`48VY|fUfXMIFJ9^K4Vc6BB*YtTmS z*QrN@sA1ij4>@Z6!r?u2bJ(oA`5(lfF|o++S4uD(DNH@_)Ng;dI}&Wa^%+T+_(dk~ zPLOCmyD5ep>w#^(mCyg^De#msiaGYYhdt|uV3N=`f5GX5M0!#K@59_%Cs)%EtGN$K zuDEr%rfLc1P&=_YLh=gLcV|>$ex9gCN@xRTm9`F^#z~u9laLL;+&pJE|FifN-c_Ab zxS-mZ`=~SUmm0AxxnSc4B@MBHtniB4&On05#s?nIApNMM)6pkgxgfK?N7f)NCMI+l z@RYo=3ybdWrRR0VBaMhj-`VG6oG1-H`IP(ahU{8=Ik4biX7FX~kYLMkS078r{v#tc zaw2k1HATEnCEd=Wyr#m@(2itLBzR1grXV=O+&r9ugejyM)11aCsah2~op14e3#{CR zKq)1$3rj7qU@)pgq6v|3D6Bn>l#}TPvFvkOX?$lc(=3n?HI(flFh~2>;>!KM$26#$ zm@S-Sh(pS*$;5J6N>_IkCWsX>FR1A|7r=@s5dK zLn8KVW4ej^hC5tlaGlpU+5U64-_MVQ_cFo+dC6qYl4du3WLhwZiz0Xx$`bJ26`=Y? z*#_M$V!iNVJhBwxwhJ+xQr{z_aDg_B%&~=rJ5>^H_(F7%y3p#Ye8Ht(=VFuODh^m9 zU@%GHxtqt6E{-yAJ(j*50Ro@4Q1$n|(wTa!mlW(~`<-485 zC=2_v69^kkh+>qCmirxgqu=$%#r{nNsNQp>&9zQ94@9QlrrEu2MV{eiqa}R7j2ycj zjOLH$)IYg6wO(~h?q^4kNYNBOMlmNS{BaMtNuHFefno;-ryAghigoMCH(td#%l(CjyvEm(u zwXMeGQ|RI8LQc`4-vtkzOPDGf$7=aZ-lzk#c;z@mjiKI_Nm(pB64g;lyQL5?v|xy7 zvFWlAXY*$knw_FmQ54$fNF!XnZ(p{Ov)f$=n!^)vph>V~o%(RM@>wEPhj%>BgAikW z^pu>LIqhTV4KOAAG;?L2Z-GFx*%%~a)Hgxo9i&=ezL0*R5be-7CZCH0O9=9a<%~Qg zNyCqzZ(pxmZ)@c>2B7sp)Op#H5{TsSA%mpUYxUE}F^a(D8T3$^@q78gmx&3xZ!?Vz z&e?#lf_GHs4z$obJiQlb{r;4{c|nW&*<5hRAr3+bq5_FGGJ5nH$Po(cZOnvG@XT27 zWMETknE0zICakIVKoG_pHI^7@N1qg~fo_UqLSt2?N3kQ#P!>Jn{Uwg+D!_| zrq6a?SoPx0I=fL(OJR-uo6-h&GQC-*0+Ruoh1%`_x<%6?CyG;v`B`CMw2nM(*9+L( zuw*>(*I9L6c`oOR!sxAJ&`DuuKAAx&f)(?&Me6KG7(1>~A*k)m1 zS9dvY7R|*v1nQI#oQ_UhZlXnF-<_gGNbX|dx&$z}iqkGbAvBcw&dRd|_+>fX^-m#$ zbCv%-vUlJ7+~f))dXQ%=A-2G+)hV{iR)=%?*-7NlG@qeFlQ7@>4sLZSY+*~O3wxi{ zPf0U7sex9DnZ_L~4G2;Zt;I12+_XrB7dtc9-F9vKw{%IXt~Q9gld`}%Qs3JM-1-b2<$ zM^D|zc{7>q5QnzVstTxYkcfSJyrw{{@&uR89bcrmPCz6cs3t-(g_Rnpg%N^*0=viY zR=&XbP412aqf&vvFYWzkuZehWJnzkFq0TSAV2HELfFKJ|IO@XAVmJw+rEUdPhA>BR zPQ9IFen(u2$LwcRr<`idyeB}O%9u-c*{O;GPlU%8^7z`-0MIcX(<3{=VC!umm4tKB zpqiGp7ry4ynK`?BC6_flyMDR(6xq6*HT3w1RS+|WFgN%cNN!WgVrm*sg>V*a7e_bx cZbe`o7c;a~XgL0S{1XE}RCK_VN;Xmd0|uu!2LJ#7 literal 0 HcmV?d00001 diff --git a/Resources/lang.Designer.cs b/Resources/lang.Designer.cs new file mode 100644 index 0000000..389745c --- /dev/null +++ b/Resources/lang.Designer.cs @@ -0,0 +1,243 @@ +//------------------------------------------------------------------------------ +// +// Dieser Code wurde von einem Tool generiert. +// Laufzeitversion:4.0.30319.42000 +// +// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn +// der Code erneut generiert wird. +// +//------------------------------------------------------------------------------ + +namespace SystemTrayMenu.Resources { + using System; + + + /// + /// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. + /// + // Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert + // -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert. + // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen + // mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class lang { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal lang() { + } + + /// + /// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("SystemTrayMenu.Resources.lang", typeof(lang).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Ãœberschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle + /// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Sucht eine lokalisierte Zeichenfolge, die (e.g. F12) ähnelt. + /// + internal static string _e_g__F12_ { + get { + return ResourceManager.GetString("(e.g. F12)", resourceCulture); + } + } + + /// + /// Sucht eine lokalisierte Zeichenfolge, die About ähnelt. + /// + internal static string About { + get { + return ResourceManager.GetString("About", resourceCulture); + } + } + + /// + /// Sucht eine lokalisierte Zeichenfolge, die Activate autostart ähnelt. + /// + internal static string Activate_autostart { + get { + return ResourceManager.GetString("Activate autostart", resourceCulture); + } + } + + /// + /// Sucht eine lokalisierte Zeichenfolge, die ALT ähnelt. + /// + internal static string ALT { + get { + return ResourceManager.GetString("ALT", resourceCulture); + } + } + + /// + /// Sucht eine lokalisierte Zeichenfolge, die Autostart ähnelt. + /// + internal static string Autostart { + get { + return ResourceManager.GetString("Autostart", resourceCulture); + } + } + + /// + /// Sucht eine lokalisierte Zeichenfolge, die Details ähnelt. + /// + internal static string buttonDetails { + get { + return ResourceManager.GetString("buttonDetails", resourceCulture); + } + } + + /// + /// Sucht eine lokalisierte Zeichenfolge, die OK ähnelt. + /// + internal static string buttonOk { + get { + return ResourceManager.GetString("buttonOk", resourceCulture); + } + } + + /// + /// Sucht eine lokalisierte Zeichenfolge, die System Info ähnelt. + /// + internal static string buttonSystemInfo { + get { + return ResourceManager.GetString("buttonSystemInfo", resourceCulture); + } + } + + /// + /// Sucht eine lokalisierte Zeichenfolge, die CTRL ähnelt. + /// + internal static string CTRL { + get { + return ResourceManager.GetString("CTRL", resourceCulture); + } + } + + /// + /// Sucht eine lokalisierte Zeichenfolge, die English ähnelt. + /// + internal static string English { + get { + return ResourceManager.GetString("English", resourceCulture); + } + } + + /// + /// Sucht eine lokalisierte Zeichenfolge, die Exit ähnelt. + /// + internal static string Exit { + get { + return ResourceManager.GetString("Exit", resourceCulture); + } + } + + /// + /// Sucht eine lokalisierte Zeichenfolge, die Folder ähnelt. + /// + internal static string Folder { + get { + return ResourceManager.GetString("Folder", resourceCulture); + } + } + + /// + /// Sucht eine lokalisierte Zeichenfolge, die Folder empty ähnelt. + /// + internal static string Folder_empty { + get { + return ResourceManager.GetString("Folder empty", resourceCulture); + } + } + + /// + /// Sucht eine lokalisierte Zeichenfolge, die Deutsch ähnelt. + /// + internal static string German { + get { + return ResourceManager.GetString("German", resourceCulture); + } + } + + /// + /// Sucht eine lokalisierte Zeichenfolge, die Move the NotifyIcon per DragDrop from the SystemTray into the Taskbar ähnelt. + /// + internal static string HintDragDropText { + get { + return ResourceManager.GetString("HintDragDropText", resourceCulture); + } + } + + /// + /// Sucht eine lokalisierte Zeichenfolge, die SystemTrayMenu - Hint ähnelt. + /// + internal static string HintDragDropTitle { + get { + return ResourceManager.GetString("HintDragDropTitle", resourceCulture); + } + } + + /// + /// Sucht eine lokalisierte Zeichenfolge, die Language ähnelt. + /// + internal static string Language { + get { + return ResourceManager.GetString("Language", resourceCulture); + } + } + + /// + /// Sucht eine lokalisierte Zeichenfolge, die Log File ähnelt. + /// + internal static string Log_File { + get { + return ResourceManager.GetString("Log File", resourceCulture); + } + } + + /// + /// Sucht eine lokalisierte Zeichenfolge, die Restart ähnelt. + /// + internal static string Restart { + get { + return ResourceManager.GetString("Restart", resourceCulture); + } + } + + /// + /// Sucht eine lokalisierte Zeichenfolge, die Shortcut key ähnelt. + /// + internal static string Shortcut_key { + get { + return ResourceManager.GetString("Shortcut key", resourceCulture); + } + } + } +} diff --git a/Resources/lang.de-DE.Designer.cs b/Resources/lang.de-DE.Designer.cs new file mode 100644 index 0000000..e69de29 diff --git a/Resources/lang.de-DE.resx b/Resources/lang.de-DE.resx new file mode 100644 index 0000000..efffcb6 --- /dev/null +++ b/Resources/lang.de-DE.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Ãœber + + + Autostart aktivieren + + + OK + + + Autostart + + + Beenden + + + Ordner + + + Ziehe das Notify-Icon per DragDrop vom SystemTray in die Taskleiste + + + SystemTrayMenu - Hinweis + + + Sprache + + + Log Datei + + + Neustart + + + Ordner leer + + + ALT + + + STRG + + + Tastenkombination + + + English + + + Deutsch + + + (z.B. F12) + + + Details + + + System Info + + \ No newline at end of file diff --git a/Resources/lang.resx b/Resources/lang.resx new file mode 100644 index 0000000..054b5ae --- /dev/null +++ b/Resources/lang.resx @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + About + + + Activate autostart + + + OK + + + Autostart + + + English + + + Exit + + + Folder + + + Deutsch + + + Move the NotifyIcon per DragDrop from the SystemTray into the Taskbar + + + SystemTrayMenu - Hint + + + Language + + + Log File + + + Restart + + + Folder empty + + + ALT + + + CTRL + + + Shortcut key + + + (e.g. F12) + + + Details + + + System Info + + \ No newline at end of file diff --git a/STM Request Norton.txt b/STM Request Norton.txt new file mode 100644 index 0000000..b56f09a --- /dev/null +++ b/STM Request Norton.txt @@ -0,0 +1,59 @@ +Hello Symantec Team, + +I am the owner/ developer of my software TAMAHO SystemTrayMenu / systemtraymenu.exe + +My software is a improved windows toolbar. +Please find more informations on my website: +http://www.hofknecht.eu/systemtraymenu/ +(There i am frequently providing updates during beta phase) + +It not contains any other functionalities, no hidden doors. +My software exactly only makes what described on website. + +Current version is 0.9.1.224 +Later versions will be released under same homepage. Links look then like (current version): +http://hofknecht.eu/systemtraymenu/0.9.1.224/SystemTrayMenu-0.9.1.224-beta.zip + +It will probably become Open Source as soon it is good enough ;) + +A user reported, that Norton detects systemtraymenu.exe as unsafe and he needs to allow it explicitly. + +Here my product clipboard: +------------------------------ +SystemTrayMenu - An improved Windows Toolbar +Code from © 2019, TAMAHO, All Rights Reserved. Developer: +Markus Hofknecht (mailto:Markus@Hofknecht.eu) +Tanja Kauth (Tanja@Hofknecht.eu) + +http://www.hofknecht.eu/systemtraymenu/ +------------------------------ + +If you have any questions please don't hesitate to contact me. + +Best Regards + +Markus Hofknecht +Software Engineer + + + +Was sent to Norton: +------------------------------ +CONFIRMATION +Your submission has been sent Fri Jun 21 21:10:37 UTC 2019. To make another submission, click here. + +Sincerely, + +Symantec Security Response +------------------------------ + +Was sent to AVAST: +------------------------------ +Thank you! We have received the URL you submitted. + +If we need any further information we will contact you. Otherwise, we will reply when the analysis is complete to let you know what action we’ve taken. + +Kind regards, +The Support Team +AVAST Software +------------------------------ \ No newline at end of file diff --git a/SystemTrayMenu.csproj b/SystemTrayMenu.csproj new file mode 100644 index 0000000..388ee23 --- /dev/null +++ b/SystemTrayMenu.csproj @@ -0,0 +1,236 @@ + + + + Debug + x86 + 8.0.30703 + 2.0 + {F317AF2E-9704-4A2A-BDAE-B4662ED9483B} + WinExe + Properties + SystemTrayMenu + SystemTrayMenu + v4.7.2 + + + 512 + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true + + + x86 + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + x86 + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + SystemTrayMenu.Program + + + Resources\SystemTrayMenu.ico + + + + ..\CodeProjects\SimpleLogger\SimpleLogger\Clearcove.Logging\bin\Debug\Clearcove.Logging.dll + + + ..\ThirdParty\Windows-API-Code-Pack-1.1-master\source\WindowsAPICodePack\Shell\bin\Debug\Microsoft.WindowsAPICodePack.Shell.dll + + + + + + + + + + + + + ..\CodeProjects\IconPack\TAFactory.IconPack.dll + + + + + + Form + + + AboutBox.cs + + + Form + + + AskHotKeyForm.cs + + + Form + + + DragDropHintForm.cs + + + + + + + + + + + + + + + + True + True + Resources.resx + + + lang.de-DE.resx + True + True + + + True + True + lang.resx + + + + + + Form + + + Menu.cs + + + + + + + + AboutBox.cs + + + AskHotKeyForm.cs + + + DragDropHintForm.cs + + + Menu.cs + + + ResXFileCodeGenerator + lang.de-DE.Designer.cs + + + ResXFileCodeGenerator + lang.Designer.cs + + + PublicResXFileCodeGenerator + Designer + Resources.Designer.cs + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {F935DC20-1CF0-11D0-ADB9-00C04FD58A0B} + 1 + 0 + 0 + tlbimp + False + True + + + + + False + Microsoft .NET Framework 4.7.2 %28x86 und x64%29 + true + + + False + .NET Framework 3.5 SP1 + false + + + + + \ No newline at end of file diff --git a/SystemTrayMenu.sln b/SystemTrayMenu.sln new file mode 100644 index 0000000..76a3df2 --- /dev/null +++ b/SystemTrayMenu.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.28010.2046 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SystemTrayMenu", "SystemTrayMenu.csproj", "{F317AF2E-9704-4A2A-BDAE-B4662ED9483B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x86 = Debug|x86 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F317AF2E-9704-4A2A-BDAE-B4662ED9483B}.Debug|x86.ActiveCfg = Debug|x86 + {F317AF2E-9704-4A2A-BDAE-B4662ED9483B}.Debug|x86.Build.0 = Debug|x86 + {F317AF2E-9704-4A2A-BDAE-B4662ED9483B}.Release|x86.ActiveCfg = Release|x86 + {F317AF2E-9704-4A2A-BDAE-B4662ED9483B}.Release|x86.Build.0 = Release|x86 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {ECA870FE-709A-4EC0-9F28-206977283A13} + EndGlobalSection +EndGlobal diff --git a/SystemTrayMenuHandler.cs b/SystemTrayMenuHandler.cs new file mode 100644 index 0000000..e9955cc --- /dev/null +++ b/SystemTrayMenuHandler.cs @@ -0,0 +1,1098 @@ +using Clearcove.Logging; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Windows.Forms; +using SystemTrayMenu.Controls; +using SystemTrayMenu.Helper; + +namespace SystemTrayMenu +{ + #region Enable debug log by putting this code into each function + //MethodBase m = MethodBase.GetCurrentMethod(); + //log.Debug($"Executing {m.ReflectedType.Name}, {m.Name}"); + #endregion + class SystemTrayMenuHandler : IDisposable + { + Logger log = new Logger(nameof(SystemTrayMenuHandler)); + + KeyboardHook hook = new KeyboardHook(); + Timer timerKeySearch = new Timer(); + int iRowKey = -1; + int iMenuKey = 0; + string keyInput = string.Empty; + + MenuNotifyIcon menuNotifyIcon = new MenuNotifyIcon(); + WaitFastLeave fastLeave = new WaitFastLeave(); + Menu[] menus = new Menu[MenuDefines.MenusMax]; + bool isMainMenuOpen = false; + + BackgroundWorker worker = new BackgroundWorker(); + bool restartLoading = false; + Screen screen = null; + + public SystemTrayMenuHandler(ref bool cancelAppRun) + { + log.Info("Application Start " + + Assembly.GetExecutingAssembly(). + GetName().Version.ToString() + + $" ScalingFactor={Program.ScalingFactor}"); + + if (!string.IsNullOrEmpty(Properties.Settings.Default.HotKey)) + { + var cvt = new KeysConverter(); + var key = (Keys)cvt.ConvertFrom( + Properties.Settings.Default.HotKey); + try + { + hook.RegisterHotKey( + KeyboardHookModifierKeys.Control | + KeyboardHookModifierKeys.Alt, + key); + hook.KeyPressed += hook_KeyPressed; + } + catch (Exception ex) + { + log.Info($"key:'{key.ToString()}'"); + log.Error($"{ex.ToString()}"); + Properties.Settings.Default.HotKey = string.Empty; + Properties.Settings.Default.Save(); + MessageBox.Show(ex.Message); + ApplicationRestart(); + } + } + void hook_KeyPressed(object sender, KeyPressedEventArgs e) + { + SwitchOpenClose(); + } + + timerKeySearch.Interval = MenuDefines.KeySearchInterval; + timerKeySearch.Tick += TimerKeySearch_Tick; + menus[0] = new Menu(); + MessageFilter messageFilter = new MessageFilter(); + Application.AddMessageFilter(messageFilter); + menuNotifyIcon.Exit += Application.Exit; + + menuNotifyIcon.HandleClick += SwitchOpenClose; + void SwitchOpenClose() + { + if (Config.Path == string.Empty) + { + //Case when Folder Dialog open + } + else if (isMainMenuOpen && menus[0].Visible) + { + isMainMenuOpen = false; + MenusFadeOut(); + if (worker.IsBusy) + { + worker.CancelAsync(); + } + } + else if (worker.IsBusy) + { + restartLoading = true; + worker.CancelAsync(); + } + else + { + isMainMenuOpen = true; + if (menus[0].Visible) + { + ActivateMenu(); + } + else + { + screen = ScreenMouse.GetScreen(); + bool IsNotifyIconInTaskbar() + { + bool isNotifyIconInTaskbar = false; + int height = screen.Bounds.Height - + new Taskbar().Size.Height; + if (Cursor.Position.Y >= height) + { + isNotifyIconInTaskbar = true; + } + return isNotifyIconInTaskbar; + } + if (!IsNotifyIconInTaskbar()) + { + //DragDropHintForm hintForm = new DragDropHintForm( + // Program.Translate("HintDragDropTitle"), + // Program.Translate("HintDragDropText"), + // Program.Translate("buttonOk")); + //hintForm.Show(); + } + + menuNotifyIcon.LoadingStart(); + worker.RunWorkerAsync(); + } + } + } + + worker.WorkerSupportsCancellation = true; + worker.DoWork += Worker_DoWork; + void Worker_DoWork(object senderDoWork, + DoWorkEventArgs eDoWork) + { + int level = 0; + BackgroundWorker worker = (BackgroundWorker)senderDoWork; + restartLoading = false; + eDoWork.Result = ReadMenu(worker, Config.Path, level); + } + + worker.RunWorkerCompleted += Worker_RunWorkerCompleted; + void Worker_RunWorkerCompleted(object sender, + RunWorkerCompletedEventArgs e) + { + if (restartLoading) + { + worker.RunWorkerAsync(); + } + else + { + ResetSelectedByKey(); + menuNotifyIcon.LoadingStop(); + MenuData menuData = (MenuData)e.Result; + if (menuData.Valid) + { + menus[0] = CreateMenu(menuData, Path.GetFileName(Config.Path)); + menus[0].AdjustLocationAndSize(screen); + ActivateMenu(); + menus[0].AdjustLocationAndSize(screen); + } + } + } + + void ActivateMenu() + { + Menus().ToList().ForEach(menu => + { + menu.FadeIn(); + menu.FadeHalf(); + }); + menus[0].SetTitleColorActive(); + menus[0].Activate(); + WindowToTop.ForceForegroundWindow(menus[0].Handle); + } + + menuNotifyIcon.ChangeFolder += ChangeFolder; + void ChangeFolder() + { + if (Config.SetFolderByUser()) + { + ApplicationRestart(); + } + } + + menuNotifyIcon.OpenLog += OpenLog; + void OpenLog() + { + Process.Start(Program.GetLogFilePath()); + } + + menuNotifyIcon.Restart += ApplicationRestart; + void ApplicationRestart() + { + Dispose(); + Process.Start(Assembly.GetExecutingAssembly(). + ManifestModule.FullyQualifiedName); + } + + messageFilter.MouseMove += FadeInIfNeeded; + messageFilter.ScrollBarMouseMove += FadeInIfNeeded; + + messageFilter.MouseLeave += fastLeave.Start; + fastLeave.Leave += FadeHalfOrOutIfNeeded; + + if (!Config.LoadOrSetByUser()) + { + cancelAppRun = true; + } + } + void FadeInIfNeeded() + { + if (menus[0].Visible && + !menus[0].IsFadingIn && + !menus[0].IsFadingOut) + { + if (Menus().Any(m => m.Opacity < 1)) + { + Menus().ToList().ForEach(menu => menu.FadeIn()); + } + } + } + + void FadeHalfOrOutIfNeeded() + { + Point mousePosition = Control.MousePosition; + bool isMouseOnAnyMenu = + !Menus().Any(m => m.IsMouseOn(mousePosition)); + bool isAnyMenuActive = IsAnyMenuActive(); + + if (isMouseOnAnyMenu) + { + if (isAnyMenuActive && isMainMenuOpen) + { + if (!IsAnyMenuSelectedByKey()) + { + Menus().ToList().ForEach(menu => menu.FadeHalf()); + } + } + else + { + MenusFadeOut(); + } + } + } + + private void ResetSelectedByKey() + { + iRowKey = -1; + iMenuKey = 0; + } + + public void Dispose() + { + hook.Dispose(); + menuNotifyIcon.Dispose(); + fastLeave.Dispose(); + DisposeMenu(menus[0]); + } + + void DisposeMenu(Menu menuToDispose) + { + if (menuToDispose != null) + { + DataGridView dgv = menuToDispose.GetDataGridView(); + foreach (DataGridViewRow row in dgv.Rows) + { + RowData rowData = (RowData)row.Tag; + rowData.Dispose(); + DisposeMenu(rowData.SubMenu); + } + dgv.ClearSelection(); + menuToDispose.Dispose(); + menuToDispose = null; + } + } + + void DisposeWhenHidden(object sender, EventArgs e) + { + Menu menuToDispose = (Menu)sender; + if (!menuToDispose.Visible) + { + DisposeMenu(menuToDispose); + } + } + + void AdjustSubMenusLocationAndSize() + { + Screen screen = ScreenMouse.GetScreen(); + int heightMax = screen.Bounds.Height - + new Taskbar().Size.Height; + Menu menuPredecessor = menus[0]; + int widthPredecessors = -1; // -1 padding + bool directionToRight = false; + + foreach (Menu menu in Menus().Skip(1)) + { + // -1*2 padding + int newWith = (menu.Width - 2 + menuPredecessor.Width); + if (directionToRight) + { +#warning is this still correct? + if (widthPredecessors - menu.Width <= -2) // -1*2 padding + { + directionToRight = false; + } + else + { + widthPredecessors -= newWith; + } + } + else if (screen.Bounds.Width < + widthPredecessors + menuPredecessor.Width + menu.Width) + { + directionToRight = true; + widthPredecessors -= newWith; + } + + menu.AdjustLocationAndSize(heightMax, + widthPredecessors, menuPredecessor); + widthPredecessors += menu.Width - 1; // -1 padding + menuPredecessor = menu; + } + } + + void OpenSubMenu(object sender, EventArgs e) + { + RowData trigger = (RowData)sender; + Menu menuTriggered = trigger.SubMenu; + Menu menuFromTrigger = menus[menuTriggered.Level - 1]; + + for (int level = menuTriggered.Level; + level < MenuDefines.MenusMax; level++) + { + if (menus[level] != null) + { + Menu menuToClose = menus[level]; + RowData oldTrigger = (RowData)menuToClose.Tag; + DataGridView dgv = menuFromTrigger.GetDataGridView(); + foreach (DataGridViewRow row in dgv.Rows) + { + RowData rowData = (RowData)row.Tag; + rowData.IsSelected = false; + } + trigger.IsSelected = true; + dgv.ClearSelection(); + dgv.Rows[trigger.RowIndex].Selected = true; + menuToClose.FadeOut(); + menuToClose.VisibleChanged += DisposeWhenHidden; + menus[level] = null; + } + } + + menus[menuTriggered.Level] = menuTriggered; + AdjustSubMenusLocationAndSize(); + menus[menuTriggered.Level].FadeIn(); + AdjustSubMenusLocationAndSize(); + IsAnyMenuActive(); + } + + void Activated(object sender, EventArgs e) + { + Menu triggeredMenu = (Menu)sender; + menus[0].SetTitleColorActive(); + } + + bool IsAnyMenuActive() + { + bool isAnyMenuActive; + Form activeForm = Form.ActiveForm; + //isAnyMenuActive = Menus().Any(m => m.IsActive(activeForm)); + isAnyMenuActive = activeForm is Menu; + if (!isAnyMenuActive) + { + menus[0].SetTitleColorDeactive(); + CheckMenuOpenerStop(iMenuKey, iRowKey); + ClearIsSelectedByKey(iMenuKey, iRowKey); + ResetSelectedByKey(); + } + else + { + menus[0].SetTitleColorActive(); + } + + return isAnyMenuActive; + } + + MenuData ReadMenu(BackgroundWorker worker, string path, int level) + { + MenuData menuData = new MenuData(); + menuData.RowDatas = new List(); + menuData.Valid = false; + menuData.Level = level; + if (!worker.CancellationPending) + { + string[] directories = new string[] { }; + + try + { + directories = Directory.GetDirectories(path); + Array.Sort(directories, new WindowsExplorerSort()); + } + catch (Exception ex) + { + log.Info($"path:'{path}'"); + log.Error($"{ex.ToString()}"); + } + + foreach (string directory in directories) + { + if (worker != null && worker.CancellationPending) + { + break; + } + + RowData menuButtonData = ReadMenuButtonData(directory, false); + menuButtonData.ContainsMenu = true; + string resolvedLnkPath = string.Empty; + menuButtonData.ReadIcon(true, false, ref resolvedLnkPath); + menuData.RowDatas.Add(menuButtonData); + } + } + + if (!worker.CancellationPending) + { + string[] files = new string[] { }; + + try + { + files = Directory.GetFiles(path). + Where(p => Path.GetFileName(p) != "desktop.ini").ToArray(); + Array.Sort(files, new WindowsExplorerSort()); + } + catch (Exception ex) + { + log.Info($"path:'{path}'"); + log.Error($"{ex.ToString()}"); + } + + foreach (string file in files) + { + if (worker != null && worker.CancellationPending) + { + break; + } + + RowData menuButtonData = ReadMenuButtonData(file, false); + string resolvedLnkPath = string.Empty; + if (menuButtonData.ReadIcon(false, + false, ref resolvedLnkPath)) + { + menuButtonData = ReadMenuButtonData(resolvedLnkPath, true, file); + menuButtonData.ContainsMenu = true; + menuButtonData.ReadIcon(true, true, ref resolvedLnkPath); + } + + menuData.RowDatas.Add(menuButtonData); + } + } + + if (!worker.CancellationPending) + { + menuData.Valid = true; + } + + return menuData; + } + + RowData ReadMenuButtonData(string fileName, + bool isResolvedLnk, string fileUnresolved = null) + { + RowData menuButtonData = new RowData(); + menuButtonData.IsResolvedLnk = isResolvedLnk; + + try + { + menuButtonData.FileInfo = new FileInfo(fileName); + menuButtonData.TargetFilePath = menuButtonData.FileInfo.FullName; + menuButtonData.SetText($"{menuButtonData.FileInfo.Name}"); + if(string.IsNullOrEmpty(fileUnresolved)) + { + menuButtonData.TargetFilePathOrig = menuButtonData.TargetFilePath; + } + else + { + menuButtonData.TargetFilePathOrig = fileUnresolved; + } + } + catch (Exception ex) + { + log.Info($"fileName:'{fileName}'"); + log.Error($"{ex.ToString()}"); + } + + return menuButtonData; + } + + private void Dgv_MouseDoubleClick(object sender, MouseEventArgs e) + { + DataGridView dgv = (DataGridView)sender; + DataGridView.HitTestInfo hitTestInfo; + hitTestInfo = dgv.HitTest(e.X, e.Y); + if (hitTestInfo.RowIndex > -1 && + dgv.Rows.Count > hitTestInfo.RowIndex) + { + RowData trigger = (RowData)dgv.Rows[hitTestInfo.RowIndex].Tag; + trigger.DoubleClick(); + } + } + + private void Dgv_MouseDown(object sender, MouseEventArgs e) + { + DataGridView dgv = (DataGridView)sender; + DataGridView.HitTestInfo hitTestInfo; + hitTestInfo = dgv.HitTest(e.X, e.Y); + if (hitTestInfo.RowIndex > -1 && + dgv.Rows.Count > hitTestInfo.RowIndex) + { + RowData trigger = (RowData)dgv.Rows[hitTestInfo.RowIndex].Tag; + trigger.MouseDown(dgv, e); + } + } + + private void Dgv_MouseEnter(object sender, DataGridViewCellEventArgs e) + { + DataGridView dgv = (DataGridView)sender; + CheckMenuOpenerStart(dgv, e.RowIndex); + } + + private void CheckMenuOpenerStart(DataGridView dgv, int rowIndex) + { + if (rowIndex > -1 && + dgv.Rows.Count > rowIndex) + { + RowData trigger = (RowData)dgv.Rows[rowIndex].Tag; + trigger.IsSelected = true; + dgv.Rows[rowIndex].Selected = true; + Menu menuFromTrigger = (Menu)dgv.FindForm(); + Menu menuTriggered = trigger.SubMenu; + int level = menuFromTrigger.Level + 1; + + if (trigger.ContainsMenu && + level < MenuDefines.MenusMax && + !menus[0].IsFadingOut && + !menuFromTrigger.IsFadingOut && + (menus[level] == null || + menus[level] != menuTriggered)) + { + trigger.StopLoadMenuAndStartWaitToOpenIt(); + trigger.StartMenuOpener(); + + if (trigger.Reading.IsBusy) + { + trigger.RestartLoading = true; + } + else + { + menuNotifyIcon.LoadingStart(); + trigger.Reading.RunWorkerAsync(level); + } + } + } + } + + private void Dgv_MouseLeave(object sender, DataGridViewCellEventArgs e) + { + DataGridView dgv = (DataGridView)sender; + Menu menu = (Menu)dgv.FindForm(); + CheckMenuOpenerStop(menu.Level, e.RowIndex, dgv); + } + + private void CheckMenuOpenerStop(int menuIndex, int rowIndex, DataGridView dgv = null) + { + Menu menu = menus[menuIndex]; + if (menu != null && + rowIndex > -1) + { + if (dgv == null) + { + dgv = menu.GetDataGridView(); + } + if (dgv.Rows.Count > rowIndex) + { + RowData trigger = (RowData)dgv.Rows[rowIndex].Tag; + if (trigger.Reading.IsBusy) + { + if (!trigger.IsContextMenuOpen) + { + trigger.IsSelected = false; + dgv.Rows[rowIndex].Selected = false; + } + trigger.Reading.CancelAsync(); + } + else if (trigger.ContainsMenu && !trigger.IsLoading) + { + trigger.IsSelected = true; + dgv.Rows[rowIndex].Selected = true; + } + else + { + if (!trigger.IsContextMenuOpen) + { + trigger.IsSelected = false; + dgv.Rows[rowIndex].Selected = false; + } + } + if (trigger.IsLoading) + { + trigger.StopLoadMenuAndStartWaitToOpenIt(); + trigger.IsLoading = false; + } + } + } + } + + private void Dgv_SelectionChanged(object sender, EventArgs e) + { + DataGridView dgv = (DataGridView)sender; + foreach (DataGridViewRow row in dgv.Rows) + { + RowData rowData = (RowData)row.Tag; + if (rowData.IsSelectedByKeyboard) + { + row.DefaultCellStyle.SelectionBackColor = + MenuDefines.KeyBoardSelection; + row.Selected = true; + } + else if (rowData.IsSelected) + { + row.DefaultCellStyle.SelectionBackColor = + MenuDefines.FolderOpen; + row.Selected = true; + } + else + { + rowData.IsSelected = false; + row.Selected = false; + } + } + } + + IEnumerable Menus() + { + return menus.Where(m => m != null); + } + + void MenusFadeOut() + { + Menus().ToList().ForEach(menu => + { + if (menu.Level > 0) + { + menus[menu.Level] = null; + } + menu.FadeOut(); + }); + } + + Menu CreateMenu(MenuData menuData, string title = null) + { + Menu menu = new Menu(); + if (title != null) + { + if (title == string.Empty) + { + title = Path.GetPathRoot(Config.Path); + } + + menu.SetTitle(title); + menu.UserClickedOpenFolder += OpenFolder; + void OpenFolder() + { + Process.Start("explorer.exe", Config.Path); + } + } + menu.Level = menuData.Level; + menu.MouseWheel += AdjustSubMenusLocationAndSize; + DataGridView dgv = menu.GetDataGridView(); + dgv.CellMouseEnter += Dgv_MouseEnter; + dgv.CellMouseLeave += Dgv_MouseLeave; + dgv.MouseDoubleClick += Dgv_MouseDoubleClick; + dgv.MouseDown += Dgv_MouseDown; + dgv.SelectionChanged += Dgv_SelectionChanged; + menu.KeyPress += KeyPress; + menu.CmdKeyProcessed += CmdKeyProcessed; + menu.Activated += Activated; + menu.Deactivated += fastLeave.Start; + menu.VisibleChanged += DisposeWhenHidden; + AddItemsToMenu(menuData.RowDatas, menu); + return menu; + } + + private void KeyPress(object sender, KeyPressEventArgs e) + { + if (char.IsLetterOrDigit(e.KeyChar) || + char.IsPunctuation(e.KeyChar) || + char.IsWhiteSpace(e.KeyChar) || + char.IsSeparator(e.KeyChar)) + { + string letter = e.KeyChar.ToString(); + + if (string.IsNullOrEmpty(keyInput)) + { + keyInput = letter; + Search(keyInput, true); + } + else if (keyInput.LastOrDefault().ToString() == letter) + { + keyInput += letter; + Search(letter, true); + timerKeySearch.Stop(); + } + else + { + keyInput += letter; + Search(keyInput, false); + timerKeySearch.Stop(); + } + timerKeySearch.Start(); + e.Handled = true; + } + } + + private void TimerKeySearch_Tick(object sender, EventArgs e) + { + timerKeySearch.Stop(); + //Search(keyInput); + keyInput = string.Empty; + } + +#warning better word than force + private void Search(string keyInput, bool force) + { + SelectByKey(Keys.None, keyInput, force); + } + + private void CmdKeyProcessed(Keys keys) + { + SelectByKey(keys); + } + + private bool IsAnyMenuSelectedByKey() + { + Menu menu = null; + DataGridView dgv = null; + string textselected = string.Empty; + return IsAnyMenuSelectedByKey(ref dgv, ref menu, ref textselected); + } + + private bool IsAnyMenuSelectedByKey( + ref DataGridView dgv, + ref Menu menuFromSelected, + ref string textselected) + { + Menu menu = menus[iMenuKey]; + bool isStillSelected = false; + if (menu != null && + iRowKey > -1) + { + dgv = menu.GetDataGridView(); + if (dgv.Rows.Count > iRowKey) + { + RowData rowData = (RowData)dgv. + Rows[iRowKey].Tag; + if (rowData.IsSelectedByKeyboard) + { + isStillSelected = true; + menuFromSelected = rowData.SubMenu; +#warning refactor datagridviewrow get + textselected = dgv.Rows[iRowKey]. + Cells[1].Value.ToString(); + } + } + } + + return isStillSelected; + } + + private void SelectByKey(Keys keys, string keyInput = "", + bool force = true) + { + int iRowBefore = iRowKey; + int iMenuBefore = iMenuKey; + + Menu menu = menus[iMenuKey]; + DataGridView dgv = null; + DataGridView dgvBefore = null; + Menu menuFromSelected = null; + string textselected = string.Empty; + bool isStillSelected = IsAnyMenuSelectedByKey( + ref dgv, ref menuFromSelected, ref textselected); + if (isStillSelected) + { + dgvBefore = dgv; + if (!force && + textselected.ToLower().StartsWith(keyInput.ToLower())) + { +#warning rewrite function should not return here + return; // is that ok? check twice + } + } + else + { + ResetSelectedByKey(); + menu = menus[iMenuKey]; + dgv = menu.GetDataGridView(); + } + + bool toClear = false; + switch (keys) + { + case Keys.Enter: + if (iRowKey > -1 && + dgv.Rows.Count > iRowKey) + { + RowData trigger = (RowData)dgv.Rows[iRowKey].Tag; + trigger.MouseDown(dgv, null); + //trigger.DoubleClick(); + } + break; + case Keys.Up: + FadeInIfNeeded(); + if (SelectMatchedReverse(dgv, iRowKey) || + SelectMatchedReverse(dgv, dgv.Rows.Count - 1)) + { + CheckMenuOpenerStop(iMenuBefore, iRowBefore, dgvBefore); + CheckMenuOpenerStart(dgv, iRowKey); + toClear = true; + } + break; + case Keys.Down: + FadeInIfNeeded(); + if (SelectMatched(dgv, iRowKey) || + SelectMatched(dgv, 0)) + { + CheckMenuOpenerStop(iMenuBefore, iRowBefore, dgvBefore); + CheckMenuOpenerStart(dgv, iRowKey); + toClear = true; + } + break; + case Keys.Left: + FadeInIfNeeded(); + int iMenuKeyNext = iMenuKey + 1; + if (isStillSelected) + { + if (menuFromSelected != null && + menuFromSelected == menus[iMenuKeyNext]) + { + dgv = menuFromSelected.GetDataGridView(); + if (dgv.Rows.Count > 0) + { + iMenuKey += 1; + iRowKey = -1; + if (SelectMatched(dgv, iRowKey) || + SelectMatched(dgv, 0)) + { + CheckMenuOpenerStop(iMenuBefore, + iRowBefore, dgvBefore); + CheckMenuOpenerStart(dgv, iRowKey); + toClear = true; + } + } + } + } + else + { + iRowKey = -1; + iMenuKey = menus.Where(m => m != null).Count() - 1; + if (menus[iMenuKey] != null) + { + dgv = menus[iMenuKey].GetDataGridView(); + if (SelectMatched(dgv, iRowKey) || + SelectMatched(dgv, 0)) + { + CheckMenuOpenerStop(iMenuBefore, iRowBefore, dgvBefore); + CheckMenuOpenerStart(dgv, iRowKey); + toClear = true; + } + } + else + { + log.Info("indexMenuByKey = menus.Where(m => m != null).Count()" + + "=> menus[iMenuKey] == null"); + } + } + break; + case Keys.Right: + if (iMenuKey > 0) + { + if (menus[iMenuKey - 1] != null) + { + iMenuKey -= 1; + iRowKey = -1; + menu = menus[iMenuKey]; + dgv = menu.GetDataGridView(); + if (SelectMatched(dgv, dgv.SelectedRows[0].Index) || + SelectMatched(dgv, 0)) + { + CheckMenuOpenerStop(iMenuBefore, iRowBefore, dgvBefore); + CheckMenuOpenerStart(dgv, iRowKey); + toClear = true; + } + } + } + else + { + CheckMenuOpenerStop(iMenuBefore, iRowBefore, dgvBefore); + iMenuKey = 0; + iRowKey = -1; + toClear = true; + FadeHalfOrOutIfNeeded(); + } + break; + case Keys.Escape: + CheckMenuOpenerStop(iMenuBefore, iRowBefore, dgvBefore); + iMenuKey = 0; + iRowKey = -1; + toClear = true; + isMainMenuOpen = false; + MenusFadeOut(); + break; + default: + if (!string.IsNullOrEmpty(keyInput) && + (SelectMatched(dgv, iRowKey, keyInput) || + SelectMatched(dgv, 0, keyInput))) + { + FadeInIfNeeded(); + CheckMenuOpenerStop(iMenuBefore, iRowBefore); + CheckMenuOpenerStart(dgv, iRowKey); + toClear = true; + } + break; + } + if (isStillSelected && toClear) + { + ClearIsSelectedByKey(iMenuBefore, + iRowBefore); + } + + } + + private bool SelectMatched(DataGridView dgv, + int indexStart, string keyInput = "") + { + bool found = false; + for (int i = indexStart; i < dgv.Rows.Count; i++) + { + if (Select(dgv, i, keyInput)) + { + found = true; + break; + } + } + return found; + } + + private bool SelectMatchedReverse(DataGridView dgv, + int indexStart, string keyInput = "") + { + bool found = false; + for (int i = indexStart; i > -1; i--) + { + if (Select(dgv, i, keyInput)) + { + found = true; + break; + } + } + return found; + } + + private bool Select(DataGridView dgv, int i, + string keyInput = "") + { + bool found = false; + if (i > -1 && + i != iRowKey && + dgv.Rows.Count > i) + { + DataGridViewRow row = dgv.Rows[i]; + RowData rowData = (RowData)row.Tag; + string text = row.Cells[1].Value.ToString(); + if (text.ToLower().StartsWith(keyInput.ToLower())) + { + iRowKey = rowData.RowIndex; + rowData.IsSelectedByKeyboard = true; + row.Selected = false; //event trigger + row.Selected = true; //event trigger + if (row.Index < dgv.FirstDisplayedScrollingRowIndex) + { + dgv.FirstDisplayedScrollingRowIndex = row.Index; + } + else if(row.Index >= + dgv.FirstDisplayedScrollingRowIndex + + dgv.DisplayedRowCount(false)) + { + dgv.FirstDisplayedScrollingRowIndex = row.Index - + dgv.DisplayedRowCount(false) + 1; + } + + found = true; + } + } + return found; + } + + private void ClearIsSelectedByKey(int menuIndex, int rowIndex) + { + Menu menu = menus[menuIndex]; + if (menu != null && rowIndex > -1) + { + DataGridView dgv = menu.GetDataGridView(); + if (dgv.Rows.Count > rowIndex) + { + DataGridViewRow row = dgv.Rows[rowIndex]; + RowData rowData = (RowData)row.Tag; + rowData.IsSelectedByKeyboard = false; + row.Selected = false; //event trigger + } + } + } + + private void AddItemsToMenu(List data, Menu menu) + { + foreach (RowData rowData in data) + { + CreateMenuRow(rowData, menu); + } + } + + private void CreateMenuRow(RowData rowData, Menu menu) + { + rowData.SetData(rowData, menu.GetDataGridView()); + rowData.OpenMenu += OpenSubMenu; + rowData.Reading.WorkerSupportsCancellation = true; + rowData.Reading.DoWork += ReadMenu_DoWork; + void ReadMenu_DoWork(object senderDoWork, + DoWorkEventArgs eDoWork) + { + int level = (int)eDoWork.Argument; + BackgroundWorker worker = (BackgroundWorker)senderDoWork; + rowData.RestartLoading = false; + eDoWork.Result = ReadMenu(worker, rowData.TargetFilePath, level); + } + + rowData.Reading.RunWorkerCompleted += ReadMenu_RunWorkerCompleted; + void ReadMenu_RunWorkerCompleted(object senderCompleted, + RunWorkerCompletedEventArgs e) + { + MenuData menuData = (MenuData)e.Result; + if (rowData.RestartLoading) + { + rowData.Reading.RunWorkerAsync(menuData.Level); + } + else + { + menuNotifyIcon.LoadingStop(); + menuNotifyIcon.LoadWait(); + if (menuData.Valid) + { + menu = CreateMenu(menuData); + if (menuData.RowDatas.Count > 0) + { + menu.SetTypeSub(); + } + else + { + menu.SetTypeEmpty(); + } + menu.Tag = rowData; + rowData.SubMenu = menu; + rowData.MenuLoaded(); + } + menuNotifyIcon.LoadStop(); + } + } + } + } + + class WindowsExplorerSort : IComparer + { + [DllImport("shlwapi.dll", CharSet = CharSet.Unicode, ExactSpelling = true)] + static extern int StrCmpLogicalW(String x, String y); + + public int Compare(string x, string y) + { + return StrCmpLogicalW(x, y); + } + } +} \ No newline at end of file diff --git a/app.config b/app.config new file mode 100644 index 0000000..c25b42e --- /dev/null +++ b/app.config @@ -0,0 +1,37 @@ + + + + +
+ + + + + + + + + + + + False + + + + + + + +