commit 1cdcca72678a239f4d30cef8825ff94f1e738870 Author: Ray Date: Tue Sep 7 12:32:24 2021 +0100 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..30a047b --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +/.vs +/bin +/obj +*.user +*.pubxml.user +*.csproj.user diff --git a/AppResource.Designer.cs b/AppResource.Designer.cs new file mode 100644 index 0000000..85eb89b --- /dev/null +++ b/AppResource.Designer.cs @@ -0,0 +1,160 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace BookmarkManager { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class AppResource { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal AppResource() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [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("BookmarkManager.AppResource", typeof(AppResource).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to Ray Lam. + /// + internal static string app_author { + get { + return ResourceManager.GetString("app_author", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Bookmark Manager. + /// + internal static string app_name { + get { + return ResourceManager.GetString("app_name", resourceCulture); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap file_text { + get { + object obj = ResourceManager.GetObject("file_text", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap folder { + get { + object obj = ResourceManager.GetObject("folder", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap folder_32 { + get { + object obj = ResourceManager.GetObject("folder_32", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap folder_explore { + get { + object obj = ResourceManager.GetObject("folder_explore", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap hexagon { + get { + object obj = ResourceManager.GetObject("hexagon", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap toggle_left_ea_16 { + get { + object obj = ResourceManager.GetObject("toggle_left_ea_16", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap toggle_right_ea_16 { + get { + object obj = ResourceManager.GetObject("toggle_right_ea_16", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized string similar to https://www.hiimray.co.uk/software-bookmark-manager. + /// + internal static string url_help { + get { + return ResourceManager.GetString("url_help", resourceCulture); + } + } + } +} diff --git a/AppResource.resx b/AppResource.resx new file mode 100644 index 0000000..1b86c3e --- /dev/null +++ b/AppResource.resx @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Ray Lam + + + Bookmark Manager + + + + Resources\file-text.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + Resources\folder.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + Resources\folder_32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + Resources\folder_explore.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + Resources\hexagon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + Resources\toggle-left-ea-16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + Resources\toggle-right-ea-16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + https://www.hiimray.co.uk/software-bookmark-manager + + \ No newline at end of file diff --git a/BookmarkManager.csproj b/BookmarkManager.csproj new file mode 100644 index 0000000..a9bf7f6 --- /dev/null +++ b/BookmarkManager.csproj @@ -0,0 +1,134 @@ + + + + WinExe + net5.0-windows + true + true + favicon.ico + false + bookmarkmanager + Ray Lam + Hi, I'm Ray + Bookmark Manager + Ray Lam + 0.4.0.061 + 0.4.0.061 + 0.4.0.061 + bookmarkmanager + + + + bin\Debug\ + + + + none + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True + True + AppResource.resx + + + Form + + + UserControl + + + True + True + UIResource.resx + + + + + + ResXFileCodeGenerator + AppResource.Designer.cs + + + TFolderTextBox.resx + + + ResXFileCodeGenerator + UIResource.Designer.cs + + + + + + + + + + \ No newline at end of file diff --git a/BookmarkManager.sln b/BookmarkManager.sln new file mode 100644 index 0000000..94d56d8 --- /dev/null +++ b/BookmarkManager.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.31410.357 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BookmarkManager", "BookmarkManager.csproj", "{4833FB27-0817-4720-A54B-180369B0C374}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {4833FB27-0817-4720-A54B-180369B0C374}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4833FB27-0817-4720-A54B-180369B0C374}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4833FB27-0817-4720-A54B-180369B0C374}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4833FB27-0817-4720-A54B-180369B0C374}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {CB4C1DB0-19FE-4AA0-9621-D66FAC4CF7C5} + EndGlobalSection +EndGlobal diff --git a/Classes/Result.cs b/Classes/Result.cs new file mode 100644 index 0000000..68533ea --- /dev/null +++ b/Classes/Result.cs @@ -0,0 +1,29 @@ +namespace BookmarkManager +{ + public class Result + { + public static Result Create() => new Result() + { + IsSuccess = true, + Message = null + }; + + public static Result Create(bool isSuccess) => new Result() + { + IsSuccess = isSuccess, + Message = null + }; + + public static Result Create(bool isSuccess, string message) => new Result() + { + IsSuccess = isSuccess, + Message = message + }; + + + public bool IsSuccess { get; set; } = false; + + public string Message { get; set; } + + } +} diff --git a/Classes/SupportedFile/ISupportedFileBase.cs b/Classes/SupportedFile/ISupportedFileBase.cs new file mode 100644 index 0000000..0432064 --- /dev/null +++ b/Classes/SupportedFile/ISupportedFileBase.cs @@ -0,0 +1,21 @@ +using RyzStudio.Windows.Forms; + +namespace BookmarkManager +{ + public interface ISupportedFile + { + + + bool IsEncryptionSupported { get; set; } + + + bool IsSupported(string filename); + + bool IsEncrypted(string filename); + + Result Load(BookmarkTreeView treeview, string filename, string password); + + Result Save(BookmarkTreeView treeview, string filename, string password); + + } +} diff --git a/Classes/SupportedFile/JSNXSupportedFile.cs b/Classes/SupportedFile/JSNXSupportedFile.cs new file mode 100644 index 0000000..862b95f --- /dev/null +++ b/Classes/SupportedFile/JSNXSupportedFile.cs @@ -0,0 +1,84 @@ +using BookmarkManager.DTO; +using bzit.bomg.Models; +using ICSharpCode.SharpZipLib.Zip; +using Newtonsoft.Json; +using RyzStudio.IO; +using RyzStudio.Windows.Forms; +using System; +using System.Collections.Generic; +using System.IO; +using System.Windows.Forms; + +namespace BookmarkManager +{ + public class JSNXSupportedFile : SupportedFileBase + { + + + public JSNXSupportedFile() + { + supportedExtensions = new List() { ".jsnx" }; + } + + + public override bool IsEncryptionSupported { get; set; } = true; + + + public override bool IsEncrypted(string filename) => SharpZipLib.IsZipEncrypted(filename); + + public override Result Load(BookmarkTreeView treeview, string filename, string password) + { + treeview.Clear(); + + if (!SharpZipLib.TestArchive(filename, password)) + { + return Result.Create(false, "Could not read file, is password correct?"); + } + + string sourceCode = SharpZipLib.ReadSingle(filename, password, "bookmarks.json"); + if (string.IsNullOrWhiteSpace(sourceCode)) + { + return Result.Create(false, "Could not read file, unexpected format"); + } + + List rs = JsonConvert.DeserializeObject>(sourceCode); + if (rs == null) + { + return Result.Create(false, "Could not read file, incorrect format"); + } + + //// load bookmark items + //ThreadControl.SetValue(progressBar1, 0, rs.Count); + + for (int i = 0; i < rs.Count; i++) + { + // ThreadControl.SetValue(progressBar1, (i + 1)); + + if (treeview.InvokeRequired) + { + treeview.Invoke(new MethodInvoker(() => { + treeview.AddItem(rs[i]); + })); + } + else + { + treeview.AddItem(rs[i]); + } + } + + treeview.SetNoChanges(); + + return Result.Create(true); + } + + public override Result Save(BookmarkTreeView treeview, string filename, string password) + { + List rs = treeview.GetBookmarkList(); + + bool rv = SharpZipLib.CreateSingle(filename, password, "bookmarks.json", JsonConvert.SerializeObject(rs)); + + return Result.Create(rv); + } + + } +} diff --git a/Classes/SupportedFile/RYZSupportedFile.cs b/Classes/SupportedFile/RYZSupportedFile.cs new file mode 100644 index 0000000..395a83e --- /dev/null +++ b/Classes/SupportedFile/RYZSupportedFile.cs @@ -0,0 +1,33 @@ +using RyzStudio.IO; +using RyzStudio.Windows.Forms; +using System.Collections.Generic; + +namespace BookmarkManager +{ + public class RYZSupportedFile : SupportedFileBase + { + + + public RYZSupportedFile() + { + supportedExtensions = new List() { ".ryz" }; + } + + + public override bool IsEncryptionSupported { get; set; } = true; + + + public override bool IsEncrypted(string filename) => SharpZipLib.IsZipEncrypted(filename); + + public override Result Load(BookmarkTreeView treeview, string filename, string password) + { + return Result.Create(false); + } + + public override Result Save(BookmarkTreeView treeview, string filename, string password) + { + return Result.Create(false); + } + + } +} diff --git a/Classes/SupportedFile/SupportedFileBase.cs b/Classes/SupportedFile/SupportedFileBase.cs new file mode 100644 index 0000000..667a206 --- /dev/null +++ b/Classes/SupportedFile/SupportedFileBase.cs @@ -0,0 +1,47 @@ +using RyzStudio.Windows.Forms; +using System.Collections.Generic; +using System.IO; + +namespace BookmarkManager +{ + public abstract class SupportedFileBase : ISupportedFile + { + protected List supportedExtensions = new List(); + + + public SupportedFileBase() + { + } + + + public virtual bool IsEncryptionSupported { get; set; } = false; + + + public virtual bool IsSupported(string filename) + { + if (string.IsNullOrWhiteSpace(filename)) + { + return false; + } + + if (supportedExtensions == null) + { + return false; + } + + if (supportedExtensions.Count <= 0) + { + return false; + } + + return supportedExtensions.Contains(Path.GetExtension(filename)?.Trim()?.ToLower()); + } + + public virtual bool IsEncrypted(string filename) => false; + + public virtual Result Load(BookmarkTreeView treeview, string filename, string password) => Result.Create(false); + + public virtual Result Save(BookmarkTreeView treeview, string filename, string password) => Result.Create(false); + + } +} diff --git a/DTO/BookmarkItem.cs b/DTO/BookmarkItem.cs new file mode 100644 index 0000000..9d8feb3 --- /dev/null +++ b/DTO/BookmarkItem.cs @@ -0,0 +1,40 @@ +using System.Text; + +namespace BookmarkManager.DTO +{ + public class BookmarkItem + { + public string SiteName { get; set; } + + public string SiteAddress { get; set; } + + public string SiteDescription { get; set; } + + public string FaviconAddress { get; set; } + + public string TreeviewPath { get; set; } + + //public BookmarkItemModel ToModel() + //{ + // return new BookmarkItemModel() + // { + // SiteName = this.SiteName, + // SiteAddress = this.SiteAddress, + // SiteDescription = this.SiteDescription, + // FaviconAddress = this.FaviconAddress, + // TreeviewPath = this.TreeviewPath + // }; + //} + + public new string ToString() + { + StringBuilder sb = new StringBuilder(); + sb.AppendLine("Name = " + this.SiteName ?? string.Empty); + sb.AppendLine("Address = " + this.SiteAddress ?? string.Empty); + sb.AppendLine("Description = " + this.SiteDescription ?? string.Empty); + + return sb.ToString(); + } + + } +} diff --git a/MainForm.Designer.cs b/MainForm.Designer.cs new file mode 100644 index 0000000..cc55ac7 --- /dev/null +++ b/MainForm.Designer.cs @@ -0,0 +1,350 @@ +namespace FizzyLauncher +{ + partial class MainForm + { + /// + /// 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() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); + this.saveFileDialog1 = new System.Windows.Forms.SaveFileDialog(); + this.contextMenuStrip2 = new System.Windows.Forms.ContextMenuStrip(this.components); + this.exitToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.menuStrip1 = new System.Windows.Forms.MenuStrip(); + this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.newToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.openToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem13 = new System.Windows.Forms.ToolStripSeparator(); + this.closeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem14 = new System.Windows.Forms.ToolStripSeparator(); + this.saveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.saveAsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem15 = new System.Windows.Forms.ToolStripSeparator(); + this.exitToolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.findToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.viewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.expandAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.collapseAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.alwaysOnTopToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.optionsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.helpToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.viewHelpToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem16 = new System.Windows.Forms.ToolStripSeparator(); + this.aboutToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.treeView1 = new RyzStudio.Windows.Forms.BookmarkTreeView(); + this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); + this.contextMenuStrip2.SuspendLayout(); + this.menuStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // saveFileDialog1 + // + this.saveFileDialog1.DefaultExt = "jsnx"; + this.saveFileDialog1.Filter = "Bookmarks files (*.jsnx)|*.jsnx|Bookmarks files (*.ryz)|*.ryz"; + this.saveFileDialog1.Title = "Save bookmarks file"; + // + // contextMenuStrip2 + // + this.contextMenuStrip2.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.exitToolStripMenuItem1}); + this.contextMenuStrip2.Name = "contextMenuStrip2"; + this.contextMenuStrip2.Size = new System.Drawing.Size(94, 26); + // + // exitToolStripMenuItem1 + // + this.exitToolStripMenuItem1.Name = "exitToolStripMenuItem1"; + this.exitToolStripMenuItem1.Size = new System.Drawing.Size(93, 22); + this.exitToolStripMenuItem1.Text = "E&xit"; + this.exitToolStripMenuItem1.Click += new System.EventHandler(this.exitToolStripMenuItem_Click); + // + // menuStrip1 + // + this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.fileToolStripMenuItem, + this.toolStripMenuItem1, + this.viewToolStripMenuItem, + this.toolsToolStripMenuItem, + this.helpToolStripMenuItem1}); + this.menuStrip1.Location = new System.Drawing.Point(0, 0); + this.menuStrip1.Name = "menuStrip1"; + this.menuStrip1.Size = new System.Drawing.Size(300, 24); + this.menuStrip1.TabIndex = 2; + // + // fileToolStripMenuItem + // + this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.newToolStripMenuItem, + this.openToolStripMenuItem, + this.toolStripMenuItem13, + this.closeToolStripMenuItem, + this.toolStripMenuItem14, + this.saveToolStripMenuItem, + this.saveAsToolStripMenuItem, + this.toolStripMenuItem15, + this.exitToolStripMenuItem2}); + this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; + this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20); + this.fileToolStripMenuItem.Text = "&File"; + // + // newToolStripMenuItem + // + this.newToolStripMenuItem.Image = global::BookmarkManager.UIResource.file2; + this.newToolStripMenuItem.Name = "newToolStripMenuItem"; + this.newToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.N))); + this.newToolStripMenuItem.Size = new System.Drawing.Size(146, 22); + this.newToolStripMenuItem.Text = "&New"; + this.newToolStripMenuItem.Click += new System.EventHandler(this.newToolStripMenuItem_Click); + // + // openToolStripMenuItem + // + this.openToolStripMenuItem.Image = global::BookmarkManager.UIResource.folder2; + this.openToolStripMenuItem.Name = "openToolStripMenuItem"; + this.openToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O))); + this.openToolStripMenuItem.Size = new System.Drawing.Size(146, 22); + this.openToolStripMenuItem.Text = "&Open"; + this.openToolStripMenuItem.Click += new System.EventHandler(this.openToolStripMenuItem_Click); + // + // toolStripMenuItem13 + // + this.toolStripMenuItem13.Name = "toolStripMenuItem13"; + this.toolStripMenuItem13.Size = new System.Drawing.Size(143, 6); + // + // closeToolStripMenuItem + // + this.closeToolStripMenuItem.Name = "closeToolStripMenuItem"; + this.closeToolStripMenuItem.Size = new System.Drawing.Size(146, 22); + this.closeToolStripMenuItem.Text = "&Close"; + this.closeToolStripMenuItem.Click += new System.EventHandler(this.closeToolStripMenuItem_Click); + // + // toolStripMenuItem14 + // + this.toolStripMenuItem14.Name = "toolStripMenuItem14"; + this.toolStripMenuItem14.Size = new System.Drawing.Size(143, 6); + // + // saveToolStripMenuItem + // + this.saveToolStripMenuItem.Image = global::BookmarkManager.UIResource.disk2; + this.saveToolStripMenuItem.Name = "saveToolStripMenuItem"; + this.saveToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S))); + this.saveToolStripMenuItem.Size = new System.Drawing.Size(146, 22); + this.saveToolStripMenuItem.Text = "&Save"; + this.saveToolStripMenuItem.Click += new System.EventHandler(this.saveToolStripMenuItem_Click); + // + // saveAsToolStripMenuItem + // + this.saveAsToolStripMenuItem.Name = "saveAsToolStripMenuItem"; + this.saveAsToolStripMenuItem.Size = new System.Drawing.Size(146, 22); + this.saveAsToolStripMenuItem.Text = "Save &As..."; + this.saveAsToolStripMenuItem.Click += new System.EventHandler(this.saveAsToolStripMenuItem_Click); + // + // toolStripMenuItem15 + // + this.toolStripMenuItem15.Name = "toolStripMenuItem15"; + this.toolStripMenuItem15.Size = new System.Drawing.Size(143, 6); + // + // exitToolStripMenuItem2 + // + this.exitToolStripMenuItem2.Name = "exitToolStripMenuItem2"; + this.exitToolStripMenuItem2.Size = new System.Drawing.Size(146, 22); + this.exitToolStripMenuItem2.Text = "E&xit"; + this.exitToolStripMenuItem2.Click += new System.EventHandler(this.exitToolStripMenuItem_Click); + // + // toolStripMenuItem1 + // + this.toolStripMenuItem1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.findToolStripMenuItem}); + this.toolStripMenuItem1.Name = "toolStripMenuItem1"; + this.toolStripMenuItem1.Size = new System.Drawing.Size(39, 20); + this.toolStripMenuItem1.Text = "&Edit"; + // + // findToolStripMenuItem + // + this.findToolStripMenuItem.Name = "findToolStripMenuItem"; + this.findToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.F))); + this.findToolStripMenuItem.Size = new System.Drawing.Size(137, 22); + this.findToolStripMenuItem.Text = "&Find"; + this.findToolStripMenuItem.Click += new System.EventHandler(this.findToolStripMenuItem_Click); + // + // viewToolStripMenuItem + // + this.viewToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.expandAllToolStripMenuItem, + this.collapseAllToolStripMenuItem, + this.toolStripSeparator1, + this.alwaysOnTopToolStripMenuItem}); + this.viewToolStripMenuItem.Name = "viewToolStripMenuItem"; + this.viewToolStripMenuItem.Size = new System.Drawing.Size(44, 20); + this.viewToolStripMenuItem.Text = "&View"; + // + // expandAllToolStripMenuItem + // + this.expandAllToolStripMenuItem.Name = "expandAllToolStripMenuItem"; + this.expandAllToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.expandAllToolStripMenuItem.Text = "&Expand All"; + this.expandAllToolStripMenuItem.Click += new System.EventHandler(this.expandAllToolStripMenuItem_Click); + // + // collapseAllToolStripMenuItem + // + this.collapseAllToolStripMenuItem.Name = "collapseAllToolStripMenuItem"; + this.collapseAllToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.collapseAllToolStripMenuItem.Text = "&Collapse All"; + this.collapseAllToolStripMenuItem.Click += new System.EventHandler(this.collapseAllToolStripMenuItem_Click); + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(149, 6); + // + // alwaysOnTopToolStripMenuItem + // + this.alwaysOnTopToolStripMenuItem.Name = "alwaysOnTopToolStripMenuItem"; + this.alwaysOnTopToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.alwaysOnTopToolStripMenuItem.Text = "Always On &Top"; + this.alwaysOnTopToolStripMenuItem.Click += new System.EventHandler(this.alwaysOnTopToolStripMenuItem_Click); + // + // toolsToolStripMenuItem + // + this.toolsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.optionsToolStripMenuItem}); + this.toolsToolStripMenuItem.Name = "toolsToolStripMenuItem"; + this.toolsToolStripMenuItem.Size = new System.Drawing.Size(46, 20); + this.toolsToolStripMenuItem.Text = "&Tools"; + // + // optionsToolStripMenuItem + // + this.optionsToolStripMenuItem.Image = global::BookmarkManager.UIResource.cog2; + this.optionsToolStripMenuItem.Name = "optionsToolStripMenuItem"; + this.optionsToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.F12))); + this.optionsToolStripMenuItem.Size = new System.Drawing.Size(168, 22); + this.optionsToolStripMenuItem.Text = "&Options"; + this.optionsToolStripMenuItem.Click += new System.EventHandler(this.optionsToolStripMenuItem_Click); + // + // helpToolStripMenuItem1 + // + this.helpToolStripMenuItem1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.viewHelpToolStripMenuItem1, + this.toolStripMenuItem16, + this.aboutToolStripMenuItem1}); + this.helpToolStripMenuItem1.Name = "helpToolStripMenuItem1"; + this.helpToolStripMenuItem1.Size = new System.Drawing.Size(44, 20); + this.helpToolStripMenuItem1.Text = "&Help"; + // + // viewHelpToolStripMenuItem1 + // + this.viewHelpToolStripMenuItem1.Image = global::BookmarkManager.UIResource.help2; + this.viewHelpToolStripMenuItem1.Name = "viewHelpToolStripMenuItem1"; + this.viewHelpToolStripMenuItem1.ShortcutKeys = System.Windows.Forms.Keys.F1; + this.viewHelpToolStripMenuItem1.Size = new System.Drawing.Size(146, 22); + this.viewHelpToolStripMenuItem1.Text = "&View Help"; + this.viewHelpToolStripMenuItem1.Click += new System.EventHandler(this.viewHelpToolStripMenuItem1_Click); + // + // toolStripMenuItem16 + // + this.toolStripMenuItem16.Name = "toolStripMenuItem16"; + this.toolStripMenuItem16.Size = new System.Drawing.Size(143, 6); + // + // aboutToolStripMenuItem1 + // + this.aboutToolStripMenuItem1.Name = "aboutToolStripMenuItem1"; + this.aboutToolStripMenuItem1.Size = new System.Drawing.Size(146, 22); + this.aboutToolStripMenuItem1.Text = "&About"; + this.aboutToolStripMenuItem1.Click += new System.EventHandler(this.aboutToolStripMenuItem1_Click); + // + // treeView1 + // + this.treeView1.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.treeView1.Dock = System.Windows.Forms.DockStyle.Fill; + this.treeView1.Location = new System.Drawing.Point(0, 24); + this.treeView1.Name = "treeView1"; + this.treeView1.Size = new System.Drawing.Size(300, 556); + this.treeView1.TabIndex = 3; + // + // openFileDialog1 + // + this.openFileDialog1.DefaultExt = "jsnx"; + this.openFileDialog1.Filter = "Bookmarks files (*.jsnx)|*.jsnx|Bookmarks files (*.ryz)|*.ryz"; + this.openFileDialog1.Title = "Open bookmarks file"; + // + // MainForm + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(250)))), ((int)(((byte)(250)))), ((int)(((byte)(250))))); + this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None; + this.ClientSize = new System.Drawing.Size(300, 580); + this.Controls.Add(this.treeView1); + this.Controls.Add(this.menuStrip1); + this.DoubleBuffered = true; + this.ForeColor = System.Drawing.SystemColors.ControlText; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MainMenuStrip = this.menuStrip1; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "MainForm"; + this.Text = "Bookmark Manager"; + this.contextMenuStrip2.ResumeLayout(false); + this.menuStrip1.ResumeLayout(false); + this.menuStrip1.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + private System.Windows.Forms.SaveFileDialog saveFileDialog1; + private System.Windows.Forms.ContextMenuStrip contextMenuStrip2; + private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem1; + private System.Windows.Forms.MenuStrip menuStrip1; + private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem viewToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem helpToolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem newToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem openToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem13; + private System.Windows.Forms.ToolStripMenuItem closeToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem14; + private System.Windows.Forms.ToolStripMenuItem saveToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem saveAsToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem15; + private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem2; + private System.Windows.Forms.ToolStripMenuItem expandAllToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem collapseAllToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem alwaysOnTopToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem optionsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem viewHelpToolStripMenuItem1; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem16; + private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem findToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private RyzStudio.Windows.Forms.BookmarkTreeView treeView1; + private System.Windows.Forms.OpenFileDialog openFileDialog1; + } +} + diff --git a/MainForm.cs b/MainForm.cs new file mode 100644 index 0000000..c5aa021 --- /dev/null +++ b/MainForm.cs @@ -0,0 +1,959 @@ +using BookmarkManager; +using FizzyLauncher.Models; +using FizzyLauncher.Text.Json; +using RyzStudio.Windows.Forms; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Text.Json; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace FizzyLauncher +{ + public partial class MainForm : Form + { + //[DllImport("user32.dll")] + //protected static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vk); + + //[DllImport("user32.dll")] + //protected static extern bool UnregisterHotKey(IntPtr hWnd, int id); + + + public enum AppMode + { + Clear = 0, + Open, + New + } + + //public enum LoadFileType + //{ + // None = 0, + // Jsnx, + // Ryz + //} + + //protected BackgroundWorker loadFileThread = null; + //protected bool isBusy = false; + + protected OptionsForm optionsForm = null; + + protected AppMode appMode = AppMode.Clear; + protected string sessionFilename = null; + protected string sessionPassword = null; + protected bool isBusy = false; + + + //protected LoadFileType loadFileType = LoadFileType.None; + //protected bool usePassword = false; + + + //protected const int MOD_ALT = 0x1; + //protected const int MOD_CONTROL = 0x2; + //protected const int MOD_SHIFT = 0x4; + //protected const int MOD_WIN = 0x8; + //protected const int WM_HOTKEY = 0x312; + //protected const int WM_QUERYENDSESSION = 0x0011; + + //protected string sessionFilename = null; + + //protected bool requestExit = false; + + + public MainForm() + { + InitializeComponent(); + + //tileContainer1.OnColumnSizeChanged += tileContainer1_OnSizeChanged; + + this.AutoScaleMode = AutoScaleMode.None; + this.StartPosition = FormStartPosition.WindowsDefaultLocation; + this.ClientSize = new System.Drawing.Size(300, 580); + //this.Visible = false; + + ApplicationMode = AppMode.Clear; + } + + protected override void OnLoad(EventArgs e) + { + base.OnLoad(e); + + //ThreadControl.SetVisible(this, false); + ThreadControl.SetSize(this, 300, 580); + } + + protected async override void OnShown(EventArgs e) + { + base.OnShown(e); + + //ThreadControl.SetVisible(this, false); + + //string jsonfigFilename = Path.ChangeExtension(Application.ExecutablePath, "jsonfig"); + //if (File.Exists(jsonfigFilename)) + //{ + // await loadFile(jsonfigFilename); + //} + //else + //{ + // this.CurrentSession = new LauncherSession(); + + // ThreadControl.SetVisible(this, true); + //} + } + + protected override void OnClosing(CancelEventArgs e) + { + base.OnClosing(e); + +// if (this.CurrentSession == null) this.CurrentSession = new LauncherSession(); + +// if (this.CurrentSession.HideOnClose && !requestExit) +// { +// this.Visible = !this.Visible; +// e.Cancel = true; +// return; +// } + +// requestExit = false; + +// if (string.IsNullOrWhiteSpace(sessionFilename)) +// { +// // do nothing +// } +// else +// { +// if (this.CurrentSession.AutoSave == LauncherSession.AutoSaveOption.Prompt) +// { +// DialogResult dr = MessageBox.Show("Save existing session?", "Exit", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); +// if (dr == DialogResult.Yes) +// { +// bool rv = saveFile(sessionFilename, false); +// if (!rv) +// { +// e.Cancel = true; +// } +// } +// else if (dr == DialogResult.No) +// { +// // do nothing +// } +// else if (dr == DialogResult.Cancel) +// { +// e.Cancel = true; +// } +// } +// else if (this.CurrentSession.AutoSave == LauncherSession.AutoSaveOption.Yes) +// { +// saveFile(sessionFilename, false); +// } +// } + +// if (this.CurrentSession.HotKey != null) +// { +// if (this.CurrentSession.HotKey.KeyCode != Keys.None) +// { +//#if !DEBUG +// UnregisterHotKey((IntPtr)Handle, 1); +//#endif +// } +// } + + } + + public LauncherSession CurrentSession { get; set; } = null; + + public bool IsBusy + { + get => isBusy; + set + { + treeView1.Enabled = !value; + } + } + + protected AppMode ApplicationMode + { + get => appMode; + set + { + appMode = value; + + switch (value) + { + case AppMode.Clear: + ThreadControl.SetText(this, AppResource.app_name); + + ThreadControl.SetEnable(closeToolStripMenuItem, false); + + ThreadControl.SetEnable(saveToolStripMenuItem, false); + ThreadControl.SetEnable(saveAsToolStripMenuItem, false); + + ThreadControl.SetEnable(expandAllToolStripMenuItem, false); + ThreadControl.SetEnable(collapseAllToolStripMenuItem, false); + + //ThreadControl.SetEnable(toolStrip1, closeFileMenuItem, false); + //this.AllowSave = false; + //ThreadControl.SetEnable(toolStrip1, saveAsFileMenuItem, false); + //ThreadControl.SetEnable(toolStrip1, findEditMenuItem, false); + + //ThreadControl.SetEnable(toolStrip1, expandAllViewMenuItem, false); + //ThreadControl.SetEnable(toolStrip1, collapseAllViewMenuItem, false); + //ThreadControl.SetEnable(toolStrip1, optionsToolMenuItem, false); + + break; + case AppMode.Open: + ThreadControl.SetEnable(closeToolStripMenuItem, true); + + ThreadControl.SetEnable(saveToolStripMenuItem, true); + ThreadControl.SetEnable(saveAsToolStripMenuItem, true); + + ThreadControl.SetEnable(expandAllToolStripMenuItem, true); + ThreadControl.SetEnable(collapseAllToolStripMenuItem, true); + + //ThreadControl.SetEnable(toolStrip1, closeFileMenuItem, true); + //this.AllowSave = true; + //ThreadControl.SetEnable(toolStrip1, saveAsFileMenuItem, true); + //ThreadControl.SetEnable(toolStrip1, findEditMenuItem, true); + //ThreadControl.SetEnable(toolStrip1, expandAllViewMenuItem, true); + //ThreadControl.SetEnable(toolStrip1, collapseAllViewMenuItem, true); + //ThreadControl.SetEnable(toolStrip1, optionsToolMenuItem, true); + + break; + case AppMode.New: + ThreadControl.SetText(this, AppResource.app_name); + + ThreadControl.SetEnable(closeToolStripMenuItem, true); + + ThreadControl.SetEnable(saveToolStripMenuItem, false); + ThreadControl.SetEnable(saveAsToolStripMenuItem, true); + + ThreadControl.SetEnable(expandAllToolStripMenuItem, true); + ThreadControl.SetEnable(collapseAllToolStripMenuItem, true); + + //ThreadControl.SetEnable(toolStrip1, closeFileMenuItem, true); + //this.AllowSave = true; + //ThreadControl.SetEnable(toolStrip1, saveAsFileMenuItem, true); + //ThreadControl.SetEnable(toolStrip1, findEditMenuItem, true); + //ThreadControl.SetEnable(toolStrip1, expandAllViewMenuItem, true); + //ThreadControl.SetEnable(toolStrip1, collapseAllViewMenuItem, true); + //ThreadControl.SetEnable(toolStrip1, optionsToolMenuItem, true); + + break; + } + } + } + + + //public void Clear(int columnCount) + //{ + // //tileContainer1.Clear(); + // //tileContainer1.Add(columnCount); + + // sessionFilename = null; + //} + + + //protected async Task collapseWindow(int width, int increment = 6) + //{ + // await Task.Run(() => + // { + // while (this.Width > width) + // { + // ThreadControl.SetWidth(this, (this.Width - increment)); + + // Application.DoEvents(); + // } + + // ThreadControl.SetWidth(this, width); + // }); + //} + + //protected async Task expandWindow(int width, int increment = 8) + //{ + // await Task.Run(() => + // { + // while (this.Width < width) + // { + // ThreadControl.SetWidth(this, (this.Width + increment)); + + // Application.DoEvents(); + // } + + // ThreadControl.SetWidth(this, width); + // }); + //} + +// protected void invalidateHotKey() +// { +//#if !DEBUG +// if (this.InvokeRequired) +// { +// this.Invoke(new MethodInvoker(() => +// { +// UnregisterHotKey((IntPtr)Handle, 1); +// })); +// } +// else +// { +// UnregisterHotKey((IntPtr)Handle, 1); +// } +//#endif + +// if (this.CurrentSession.HotKey != null) +// { +// if (this.CurrentSession.HotKey.KeyCode != Keys.None) +// { +//#if !DEBUG +// if (this.InvokeRequired) +// { +// this.Invoke(new MethodInvoker(() => +// { +// RegisterHotKey((IntPtr)Handle, 1, this.CurrentSession.HotKey.ModifierCode, this.CurrentSession.HotKey.Key); +// })); +// } +// else +// { +// RegisterHotKey((IntPtr)Handle, 1, this.CurrentSession.HotKey.ModifierCode, this.CurrentSession.HotKey.Key); +// } +//#endif +// } +// } +// } + + + //protected void newSession() + //{ + //NewForm form = new NewForm(this); + //form.ShowDialog(); + //} + + //protected async Task loadFile(string filename) + //{ + // await Task.Run(() => + // { + // if (isBusy) + // { + // return; + // } + + // if (string.IsNullOrWhiteSpace(filename)) + // { + // return; + // } + + // if (!File.Exists(filename)) + // { + // return; + // } + + // string sourceCode = null; + + // try + // { + // sessionFilename = filename; + + // sourceCode = File.ReadAllText(sessionFilename); + // } + // catch (Exception exc) + // { + // MessageBox.Show(exc.Message, "Load session"); + // return; + // } + + // if (string.IsNullOrWhiteSpace(sourceCode)) + // { + // return; + // } + + // // load options + // var options = new JsonSerializerOptions(); + // options.Converters.Add(new JsonPointConverter()); + // options.Converters.Add(new JsonSizeConverter()); + + // try + // { + // this.CurrentSession = JsonSerializer.Deserialize(sourceCode, options); + // } + // catch (Exception exc) + // { + // MessageBox.Show("Unable to read session", "Load session"); + // return; + // } + + // if (this.CurrentSession == null) + // { + // this.CurrentSession = new LauncherSession(); + // } + + // // load tiles + // //tileContainer1.Load(this.CurrentSession.Groups); + + // // reposition + // if (!this.CurrentSession.StartPosition.IsEmpty) ThreadControl.SetLocation(this, this.CurrentSession.StartPosition); + + // // + // ThreadControl.SetTopMost(this, this.CurrentSession.AlwaysOnTop); + // ThreadControl.SetVisible(this, true); + // ThreadControl.SetChecked(collapseAllToolStripMenuItem, this.CurrentSession.EnableAnimation); + // ThreadControl.SetChecked(expandAllToolStripMenuItem, this.CurrentSession.EnableBigIconInFolder); + // //ThreadControl.SetClientHeight(this, this.CurrentSession.DefaultHeight); + + // ThreadControl.SetFocus(this); + + // // hotkey + // invalidateHotKey(); + + // }); + //} + + //protected bool saveFile(string filename, bool showNotices = true) + //{ + //if (isBusy) + //{ + // return false; + //} + + //if (string.IsNullOrWhiteSpace(filename)) + //{ + // return false; + //} + + //if (tileContainer1.GroupCount <= 0) + //{ + // return true; + //} + + //isBusy = true; + + //// update session + //if (this.CurrentSession == null) + //{ + // this.CurrentSession = new LauncherSession(); + //} + + //this.CurrentSession.DefaultHeight = this.Height; + //this.CurrentSession.AlwaysOnTop = this.TopMost; + //this.CurrentSession.StartPosition = this.Location; + //this.CurrentSession.Groups = tileContainer1.GroupModels?.ToList() ?? new List(); + + //var options = new JsonSerializerOptions(); + //options.Converters.Add(new JsonPointConverter()); + //options.Converters.Add(new JsonSizeConverter()); + + //try + //{ + // File.WriteAllText(filename, JsonSerializer.Serialize(this.CurrentSession, options)); + + // if (showNotices) + // { + // MessageBox.Show("Session saved!", "Save session", MessageBoxButtons.OK, MessageBoxIcon.Information); + // } + //} + //catch (Exception exc) + //{ + // MessageBox.Show(exc.Message, "Save session"); + + // return false; + //} + + //isBusy = false; + + //return true; + //} + + //protected bool saveAsFile() + //{ + //if (isBusy) + //{ + // return false; + //} + + //if (saveFileDialog1.ShowDialog() == DialogResult.OK) + //{ + // bool rv = saveFile(saveFileDialog1.FileName); + // if (rv) + // { + // sessionFilename = saveFileDialog1.FileName; + // } + + // return rv; + //} + + // return false; + //} + +#region main menu + + /// + /// New + /// + /// + /// + private void newToolStripMenuItem_Click(object sender, EventArgs e) + { + if (this.IsBusy) + { + return; + } + + this.IsBusy = true; + + CloseFile(); + + sessionFilename = null; + sessionPassword = null; + + treeView1.Clear("Untitled"); + + ApplicationMode = AppMode.New; + + this.IsBusy = false; + } + + /// + /// Open file + /// + /// + /// + private async void openToolStripMenuItem_Click(object sender, EventArgs e) + { + if (this.IsBusy) + { + return; + } + + this.IsBusy = true; + + CloseFile(); + + if (openFileDialog1.ShowDialog() == DialogResult.OK) + { + Result result = await LoadFile(openFileDialog1.FileName); + if (!result.IsSuccess) + { + MessageBox.Show(result.Message, "Open File", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + this.IsBusy = false; + } + + /// + /// Close + /// + /// + /// + private void closeToolStripMenuItem_Click(object sender, EventArgs e) + { + if (this.IsBusy) + { + return; + } + + this.IsBusy = true; + + CloseFile(); + + sessionFilename = null; + sessionPassword = null; + + treeView1.Clear(); + + ApplicationMode = AppMode.Clear; + + this.IsBusy = false; + } + + /// + /// Save + /// + /// + /// + private async void saveToolStripMenuItem_Click(object sender, EventArgs e) + { + if (this.IsBusy) + { + return; + } + + if (ApplicationMode == AppMode.Clear) + { + return; + } + + this.IsBusy = true; + + Result result = await SaveFile(sessionFilename, sessionPassword); + if (result.IsSuccess) + { + MessageBox.Show("File saved!", "Save File", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + else + { + MessageBox.Show(result.Message, "Save File", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + + this.IsBusy = false; + } + + /// + /// Save As + /// + /// + /// + private async void saveAsToolStripMenuItem_Click(object sender, EventArgs e) + { + if (this.IsBusy) + { + return; + } + + if (ApplicationMode == AppMode.Clear) + { + return; + } + + this.IsBusy = true; + + if (saveFileDialog1.ShowDialog() == DialogResult.OK) + { + Result result = await SaveAsFile(saveFileDialog1.FileName); + if (result.IsSuccess) + { + MessageBox.Show("File saved!", "Save As File", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + else + { + MessageBox.Show(result.Message, "Save As File", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + + } + + this.IsBusy = false; + } + + /// + /// Exit + /// + /// + /// + private void exitToolStripMenuItem_Click(object sender, EventArgs e) + { + if (this.IsBusy) + { + return; + } + + this.Close(); + } + + /// + /// Find + /// + /// + /// + private void findToolStripMenuItem_Click(object sender, EventArgs e) + { + //tileContainer1.Add(); + } + + + /// + /// Expand all + /// + /// + /// + private void expandAllToolStripMenuItem_Click(object sender, EventArgs e) + { + if (this.IsBusy) return; + if (ApplicationMode == AppMode.Clear) return; + + if (treeView1.SelectedNode == null) + { + treeView1.ExpandAll(); + } + else + { + treeView1.SelectedNode.ExpandAll(); + } + } + + /// + /// Collapse all + /// + /// + /// + private void collapseAllToolStripMenuItem_Click(object sender, EventArgs e) + { + if (this.IsBusy) return; + if (ApplicationMode == AppMode.Clear) return; + + if (treeView1.SelectedNode == null) + { + treeView1.CollapseAll(); + } + else + { + treeView1.SelectedNode.Collapse(false); + } + } + + /// + /// Always on top + /// + /// + /// + private void alwaysOnTopToolStripMenuItem_Click(object sender, EventArgs e) + { + this.TopMost = !this.TopMost; + + alwaysOnTopToolStripMenuItem.Checked = this.TopMost; + } + + + /// + /// Options + /// + /// + /// + private void optionsToolStripMenuItem_Click(object sender, EventArgs e) + { + if (this.IsBusy) + { + return; + } + + if (optionsForm == null) optionsForm = new OptionsForm(this); + optionsForm.ShowDialog(); + + //invalidateHotKey(); + } + + + /// + /// View help + /// + /// + /// + private void viewHelpToolStripMenuItem1_Click(object sender, EventArgs e) + { + try + { + System.Diagnostics.Process.Start("https://www.hiimray.co.uk/software-bookmark-manager"); + } + catch + { + // do nothing + } + } + + /// + /// About + /// + /// + /// + private void aboutToolStripMenuItem1_Click(object sender, EventArgs e) + { + MessageBox.Show(Application.ProductName + " v" + Application.ProductVersion, "About", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + + #endregion + + + protected async void CloseFile() + { + if (this.ApplicationMode == AppMode.Clear) + { + return; + } + + if (!treeView1.HasChanged) + { + return; + } + + if (this.ApplicationMode == AppMode.New) + { + DialogResult response = MessageBox.Show("Save bookmarks", "Save?", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); + if (response == DialogResult.Yes) + { + Result result = await SaveAsFile(sessionFilename); + if (!result.IsSuccess) + { + MessageBox.Show(result.Message, "Save File", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + } + else if (response == DialogResult.Cancel) + { + return; + } + } + else if (this.ApplicationMode == AppMode.Open) + { + DialogResult response = MessageBox.Show("Save changes to open bookmarks", "Save?", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); + if (response == DialogResult.Yes) + { + Result result = await SaveFile(sessionFilename, sessionPassword); + if (!result.IsSuccess) + { + MessageBox.Show(result.Message, "Save File", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + } + else if (response == DialogResult.Cancel) + { + return; + } + } + } + + protected SupportedFileBase GetSupportedFileHandler(string filename) + { + SupportedFileBase rs = null; + + List typeList = Assembly.GetExecutingAssembly().GetTypes().Where(x => x.IsSubclassOf(typeof(SupportedFileBase))).ToList(); + foreach (Type t in typeList) + { + rs = (SupportedFileBase)Activator.CreateInstance(t); + if (rs == null) + { + continue; + } + + if (rs.IsSupported(filename)) + { + break; + } + + rs = null; + } + + return rs; + } + + protected async Task LoadFile(string filename) + { + return await Task.Run(() => + { + sessionFilename = null; + sessionPassword = null; + ApplicationMode = AppMode.Clear; + + treeView1.Clear(); + + if (string.IsNullOrWhiteSpace(filename)) + { + return Result.Create(false, "Filename is empty"); + } + + if (!File.Exists(filename)) + { + return Result.Create(false, "File not found"); + } + + sessionFilename = filename; + + SupportedFileBase fileHandler = GetSupportedFileHandler(sessionFilename); + if (fileHandler == null) + { + return Result.Create(false, "Handler not found for this file type"); + } + + if (fileHandler.IsEncrypted(sessionFilename)) + { + PasswordForm passwordForm = new PasswordForm(this); + if (passwordForm.ShowDialog() == DialogResult.OK) + { + sessionPassword = passwordForm.Password; + } + } + + Result result = fileHandler.Load(treeView1, sessionFilename, sessionPassword); + if (!result.IsSuccess) + { + return result; + } + + if (treeView1.Nodes.Count > 0) + { + ThreadControl.Expand(treeView1.Nodes[0]); + } + + ApplicationMode = AppMode.Open; + + return result; + }); + } + + protected async Task SaveFile(string filename, string password = null) + { + return await Task.Run(() => + { + if (string.IsNullOrWhiteSpace(filename)) + { + return Result.Create(false, "Filename is empty"); + } + + SupportedFileBase fileHandler = GetSupportedFileHandler(filename); + if (fileHandler == null) + { + return Result.Create(false, "Handler not found for this file type"); + } + + Result result = fileHandler.Save(treeView1, filename, password); + if (result.IsSuccess) + { + treeView1.SetNoChanges(); + } + + return result; + }); + } + + protected async Task SaveAsFile(string filename) + { + return await Task.Run(() => + { + if (string.IsNullOrWhiteSpace(filename)) + { + return Result.Create(false, "Filename is empty"); + } + + SupportedFileBase fileHandler = GetSupportedFileHandler(filename); + if (fileHandler == null) + { + return Result.Create(false, "Handler not found for this file type"); + } + + string password = null; + + if (fileHandler.IsEncryptionSupported) + { + PasswordForm passwordForm = new PasswordForm(this); + if (passwordForm.ShowDialog() == DialogResult.OK) + { + if (!string.IsNullOrWhiteSpace(passwordForm.Password)) + { + password = passwordForm.Password; + } + } + } + + Result result = fileHandler.Save(treeView1, filename, password); + if (result.IsSuccess) + { + treeView1.SetNoChanges(); + } + + return result; + }); + } + + } +} \ No newline at end of file diff --git a/MainForm.resx b/MainForm.resx new file mode 100644 index 0000000..5b26a88 --- /dev/null +++ b/MainForm.resx @@ -0,0 +1,209 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + 172, 17 + + + 561, 17 + + + 716, 17 + + + 17, 17 + + + + + AAABAAMAICAAAAEAIACoEAAANgAAABgYAAABACAAiAkAAN4QAAAQEAAAAQAgAGgEAABmGgAAKAAAACAA + AABAAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyMjJHMzg56TQ6PbAyMjJcMzMzFAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMjU1ZTg7PPlJlKb/Q4eY/zhRV/YzNDX9ND4/0jM1 + NXkzMzMtAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATU4OINDSEn5cb/T/1XX9/9S1vf/Utb3/1DJ + 6P9IoLb/PWp29zQ5Ovo0OzzqNTg6njMzM1UrKysMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsrKwY1OTupTFhc+HnN4v9s3Pj/Utb3/1LW + 9/9S1vf/Utb3/1LW9/9S1vf/UtT1/0uwyf9Bfo37N0dL9DM2Nvo0PD3FMzMzbzc3NxwAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5OTkSNzw9yVhtc/d71u3/feD5/1vY + 9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW9/9S1vf/TbzY/0SMnv86V1/2MzQ1/TU9 + P9o0NjaENzc3HAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANTU1Ijk9PuFhg4v5fdz0/33g + +f923/n/Utb3/1HS8v9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW + 9/9Qy+r/SJ60/zhQVvozNTWDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQ0NDY6Pj/vaZWf/H3f + +P994Pn/feD5/2jb+P9S1fb/OD5A/0qarf9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW + 9/9S1vf/Utb3/1LW9/9S1vf/Rpaq/zU9PskAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzMzNQOz4/+Gyo + t/594Pn/feD5/33g+f994Pn/W9j3/1LW9/9HT1H/c3t9/0lwef9Rzu3/Utb3/1LW9/9S1vf/Utb3/1LW + 9/9S1vf/UdPz/0qux/9R1PX/Utb3/1LW9/9Nvdn/MzU2+isrKwYAAAAAAAAAAAAAAAAAAAAANDY2cTxB + Qvlyucr/feD5/33g+f994Pn/feD5/3rf+f9T1vf/Utb3/0tVV///////sLO0/0ZVWf9MtdD/Utb3/1LW + 9/9R0/P/Sai//0t0f/9HUlT/OT4//1HR8f9S1vf/Utb3/1LV9v82PT/3MjIyOAAAAAAAAAAAAAAAATQ4 + OoRASEr3ecjb/37g+f994Pn/feD5/33g+f994Pn/bdz4/1LW9/9S1vf/SlVX////////////4eHh/1Nc + Xv9IhZX/SnR+/0dTVf9+h4r/zs7O/87Ozv9Lcnz/Utb3/1LW9/9S1vf/Utb3/zxkbfYzMzN0AAAAAAAA + AAA0Ojy0QFFV9nvR5v+A4fn/fuD5/33g+f994Pn/feD5/33g+f9i2vj/Utb3/1LW9/9KVVf///////// + ////////+fn5/6Smp//Ozs7//f39////////////foaJ/0qov/9S1vf/Utb3/1LW9/9S1vf/RY6h/zQ7 + PLsAAAAAAAAAADU8Pd1msML/g+L5/4Hh+f9/4fn/feD5/33g+f994Pn/feD5/1nY9/9S1vf/Utb3/0pV + V/////////////////////////////////////////////39/f9HU1X/UdLy/1LW9/9S1vf/Utb3/1LW + 9/9Mtc//Mzg58wAAAAEAAAAANDc5mViLmPyD4vn/geH5/3/h+f994Pn/feD5/33g+f984Pn/U9b3/1LW + 9/9Nu9b/SVJV////////////////////////////////////////////ycnJ/0t3gv9S1vf/Utb3/1LW + 9/9S1vf/Utb3/1LU9P80ODn6MTExKgAAAAA0NDRZR1xh9IPi+f+B4fn/f+H5/33g+f994Pn/feD5/3ff + +f9S1fb/SY+h/09aXP/a2tr///////////////////////////////////////////93gIP/SqzF/1LW + 9/9S1vf/Utb3/1LW9/9S1vf/Utb3/ztZYPQyMjJmAAAAAC8vLxs1Njb9gNvy/4Hh+f9/4fn/feD5/33g + +f994Pn/a8vi/0diaP+GjY//+fn5/////////////////////////////////////////////////4KK + jP9KkKH/Utb3/1LW9/9S1vf/Utb3/1LW9/9S1vf/Q4WW/jM5O6kAAAAAAAAAADU6O+lyvtD/geH5/3/h + +f994Pn/feD5/2aktP9NVlj/y8zM//////////////////////////////////////////////////// + ////////+fn5/1VdYP9Ms83/Utb3/1LW9/9S1vf/Utb3/1LW9/9Kq8P/NTo76QAAAAAAAAAANTk7qV+X + pf6B4fn/f+H5/33g+f930ej/Q05Q/19naP+wsbL/7+/v//////////////////////////////////// + ////////////////////////4+Pj/0dVWP9Qy+r/Utb3/1LW9/9S1vf/Utb3/1DP7v8zNDX9NTU1HQAA + AAA0NDRnSmdt9YHh+f+A4fn/fuD5/33g+f994Pn/ZsLZ/0iMnf9HXWP/VWFk/5ufoP/l5eX///////// + ////////////////////////////////////////vL2+/0lnb/9S1fb/Utb3/1LW9/9S1vf/Utb3/zhO + VPM0NDRYAAAAADU1NSs3Ozv7geD3/4Dh+f9+4Pn/feD5/33g+f9z3vn/Utb3/1LW9/9PyOb/SJis/0pT + Vf/+/v7/////////////////8PDw/8nJyf/Jycn/ycnJ/8nJyf/Nzc3/aW5v/0qNnf9S1vf/Utb3/1LW + 9/9S1vf/P3qI/TQ3OZgAAAAAAAAAATM4OfN0xtr/gOH5/37g+f994Pn/feD5/3rf+f9S1vf/Utb3/1LW + 9/9S1vf/S294/9XV1f////////////39/f9bZGb/S3yJ/0yBj/9MgY//TIGP/0x7hv9OeIP/S4mZ/1LW + 9/9S1vf/Utb3/1LW9/9IoLb/NTw93AAAAAAAAAAANDs8u2Gfr/+A4fn/f+H5/33g+f994Pn/feD5/1jX + 9/9S1vf/Utb3/1LW9/9InrT/jZOV////////////lZqb/0uDkv9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW + 9/9S1vf/Utb3/1LW9/9S1vf/TsHe/zhKTvY0Ojy0AAAAAAAAAAAyMjJ1TXJ694Hh+f9/4fn/feD5/33g + +f994Pn/Ztv4/1LW9/9S1vf/Utb3/1DO7f9NWFr//////9XV1f9GW2D/UdLy/1LW9/9S1vf/Utb3/1LW + 9/9S1vf/Utb3/1LW9/9S1vf/Utb3/0y40v82QEP3NDk7l1VVVQMAAAAAAAAAADExMTk5QUL4gOD4/3/h + +f994Pn/feD5/33g+f933/n/U9b3/1LW9/9S1vf/Utb3/0plbP/W1tb/TFdZ/06+2v9S1vf/Utb3/1LW + 9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW9/9JqMD/NDk6+TM1N4IAAAAAAAAAAAAAAAAAAAAAMzMzBTM2 + Nvl2zeL/f+H5/33g+f994Pn/feD5/33g+f9i2vj/Utb3/1LW9/9S1vf/SJir/0BCQ/9Lm6//Utb3/1LW + 9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW9/9S1vf/Rpar/jQ3OPkyMjJXAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAANTw+y2OnuP9/4fn/feD5/33g+f994Pn/feD5/3vg+f9X1/f/Utb3/1LW9/9Qyun/RoaV/1LW + 9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW9/9S1vf/UtX2/0OElPw0NzjyMzMzPAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAzNTWDPlZb+mauwP961+//feD5/33g+f994Pn/feD5/3Xe+f9V1/f/Utb3/1LW + 9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1HQ8P88ZW/4NDk64DU1NSIAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADc3NxwzNTWDNDo81zU2Nv1JY2nzYJ2t/nXL4f994Pn/feD5/3Xe + +f9X1/f/Utb3/1LW9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW9/9PyOf/OlRb9zU7Pco5OTkSAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALi4uFjQ0NF40PT60NDY39z9L + TfVWhI/7a7XI/3nc9P9i2vj/U9b3/1LW9/9S1vf/Utb3/1LW9/9S1vf/TsDc/zdGS/Y0OTuyOTk5CQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABAQEAINTU1RDM4OIw0OTzjNjk5+0tsdPhYn7H/WMjk/1TW9/9S1vf/Utb3/0uyzP81PT/4Mzc4lQAA + AAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzMzMtMzMzeDQ6Pc40NTX8O1JX80WImf5FkaT/NDg5+jU1 + NWUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMzMxQyMjJcNDo9sDM4 + OekyMjJHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////+D////A + H///AAH//gAAP/wAAAf4AAAH8AAAB+AAAAPAAAADAAAAAwAAAAMAAAABAAAAAQAAAAEAAAABgAAAAYAA + AACAAAAAgAAAAIAAAADAAAAAwAAAAMAAAAPAAAAH4AAAD+AAAB/gAAA//AAAf/+AAP//+AP///8H/ygA + AAAYAAAAMAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADY+Pl41PD7tNkRItTQ0 + NFgtLS0RAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAANT9DeVBpcfBTzOr/TLXQ/0SHmfQ5UVbqNkFF3jU8PogyMjIzAAAAAQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQAQ5RUemYYaP83Lb + 9f9S1vf/Utb3/1LW9/9S1vf/T8jn/0eZrv08YWnrNkNG5jdHS60zMzNVKysrDAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAMDAwEDxHSc1qoa73feD5/2La+P9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW + 9/9S1vf/UdHx/0qqwv9AdYPwNkVJ6zZERsgzMzMoAAAAAAAAAAAAAAAAAAAAAAAAAAA2NjYhQUpM4HK2 + xvt94Pn/e+D5/1PV9v9Ljp//UdPz/1LW9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW9/9S1vf/Utb3/0WT + pv42P0GFAAAAAAAAAAAAAAAAAAAAADQ0NDZETVDpdcLV/n3g+f994Pn/cN34/1LW9/9TXV//WXF3/0/A + 3P9S1vf/Utb3/1LW9/9S1vf/UdT1/0y10P9S1fb/Utb3/07A3f83REfNAAAAAAAAAAAAAAAAMjg7VklX + W+95zuP/feD5/33g+f994Pn/Y9r4/1LW9/9rfID/8/Pz/29+gv9QnrH/UdT1/0yvyP9VgYv/ZnuA/0lV + WP9R1PX/Utb3/1LW9/82QkXsQEBABAAAAAA1P0F5S2Fo8X/X7v9+4Pn/feD5/33g+f994Pn/V9f3/1LW + 9/9rfID///////////+nr7D/ZXd8/6ivsP/w8PD/7Ozs/1OAi/9S1vf/Utb3/1LW9/88YmvrMjIyMwAA + AAA1PkDrfdvy/4Hh+f9+4Pn/feD5/33g+f963/n/Utb3/1LW9/9qfID///////////////////////// + ////////nqan/0yzzf9S1vf/Utb3/1LW9/9FkaX7Njo9dgAAAAA3RUe2c8TY/4Hh+f9/4fn/feD5/33g + +f9y3vj/Utb3/1CdsP+IlJf/////////////////////////////////YHV7/1LV9v9S1vf/Utb3/1LW + 9/9NudT/N0RIwgAAAAAzNjZoYp2r+YHh+f9/4fn/feD5/33g+f9mzuj/VHZ//6yztP////////////// + ///////////////////5+fn/UW1z/1LW9/9S1vf/Utb3/1LW9/9S1fb/NUBD6wAAAAEyMjIpT2tz7IHh + +f9/4fn/feD5/2yuvv9neHz/6enp////////////////////////////////////////////qLCx/1GZ + q/9S1vf/Utb3/1LW9/9S1vf/O1li6jMzMygAAAABO0VJ64Hg+P9/4fn/feD5/2eap/9geH7/foyQ/8rL + y//8/Pz//////////////////////////////////////3iFiP9PuNL/Utb3/1LW9/9S1vf/RIma+TQ2 + NmcAAAAAN0RIw3fK3/9/4fn/feD5/33g+f9q3Pj/UMno/0+br/9Uc3r/v8TF/////////////////+jo + 6P/k5OT/8fHx/+vr6/9YaW7/UMzq/1LW9/9S1vf/S7LM/zZERrUAAAAANjo9dmSjs/yA4fn/feD5/33g + +f9x3fj/Utb3/1LW9/9R0fH/a32B////////////sLe4/1F5hP9VjZv/UoOP/1KDj/9Tg4//TrjT/1LW + 9/9S1vf/UM/u/zU+QOsAAAAAMTExNFFye+2A4fn/feD5/33g+f963/n/U9b3/1LW9/9S1vf/VXd///n5 + +f/o6Oj/VHeA/1LW9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW9/9Qy+r/OVZc8DZBQ4oAAAAAQEBABDxH + Su2A4fn/fuD5/33g+f994Pn/X9n4/1LW9/9S1vf/TZ+0/7y+v/9fcnf/UMrp/1LW9/9S1vf/Utb3/1LW + 9/9S1vf/Utb3/07B3v83SU7uNj4+XgAAAAAAAAAAAAAAADZER852z+b/fuD5/33g+f994Pn/dd75/1PW + 9/9S1vf/Uc7t/0BHSf9PsMj/Utb3/1LW9/9S1vf/Utb3/1LW9/9S1vf/S7PN/jZDR+syNjY9AAAAAAAA + AAAAAAAAAAAAADY9P4VforL+fuD5/33g+f994Pn/feD5/2nb+P9S1vf/Utb3/0282P9S1vf/Utb3/1LW + 9/9S1vf/Utb3/1LW9/9IoLb7NkBD3zY2NiEAAAAAAAAAAAAAAAAAAAAAAAAAADMzMyg2REbIP01Q7FmH + kvJtu87/fNz0/33g+f9o2/j/Utb3/1LW9/9S1vf/Utb3/1LW9/9S1vf/Utb3/0SImvU1QELMMDAwEAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBACDU1NUQ2RUaYOUZI40tka+1ioLD8a83n/1nY + 9/9S1vf/Utb3/1LW9/9S1PX/P3F+8TZCRa4rKysGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAADU1NSI0Oz11NkJG0D5NUu1Hfo3yTKzE/1DM6v87W2PvNUBCiwAA + AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAC0tLRE0NDRYNkRItTU8Pu02Pj5eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD///9B/wf/Qf4Af0H4AA9B8AADQeAAA0HAAANBgAABQQAAAUEAAAFBAAABQQAAAEEAAABBAAAAQYAA + AEGAAABBgAAAQYAAAUHAAANBwAAHQcAAD0HwAB9B/wA/Qf/g/0EoAAAAEAAAACAAAAABACAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3TVF4O1tk1zlRWLA3RERPQEBACAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBVlyOZqW18FPW9/9R0PD/SqrC+D9y + fts5VlzBNkhKdTU1NRgAAAAAAAAAAAAAAAAAAAAAAAAAAFVVVQNCV12tcbrL9mnb+P9S1vf/Utb3/1LW + 9/9S1vf/UdT1/0uwyv0/doXjO1hgyDU1NSIAAAAAAAAAACQkJAdEWl+7dMLW+n3g+f9b2Pf/Um92/1DF + 4/9S1vf/Utb3/1LW9/9S1vf/Utb3/0y71v85TFB5AAAAAC0tLRFEXGLKds3j/X3g+f963/n/U9b3/5Sl + qf+Po6j/Va7E/1GwyP9ol6P/V250/1HU9f9S1fb/O1ZctwAAAABCWWDQfNbs/33g+f994Pn/b934/1LW + 9/+Vp6v//////8bNzv/T1tf//////2uYo/9S1vf/Utb3/z1kbtEAAAAASWpyy4Hh+f9+4Pn/feD5/2jb + +P9Tt9D/qba5/////////////////97g4f9UqsD/Utb3/1LW9/9Bf4/lMzMzGTlTWal/3PP/fuD5/3ze + 9/9lnaz/sr7A///////////////////////Hzs//Va/G/1LW9/9S1vf/S6zG/TVARls3QkddccDT/X/h + +f9tqrn/fI2R/9bY2f///////////////////////////4iepP9Ryun/Utb3/1HQ8P85U1mmNTU1GGCV + oup/4fn/feD5/2PY9v9SrsX/ZoeP//39/f//////xczN/6y4uv+ns7X/WHd//1LW9/9S1vf/PGBpxwAA + AABRdH3Vf+H5/33g+f9s3Pj/Utb3/1C40v/Izc//zdPV/1eluP9Qy+r/T8jn/0/E4v9S1vf/UMjm/zlS + WM4AAAAAP1tiuX/g+P994Pn/eN/5/1PW9/9S1fb/g5ug/2eVoP9S1vf/Utb3/1LW9/9S1vf/TsHe/jlV + W80zMzMUAAAAADhMUHx0y+H/feD5/33g+f9k2vj/Utb3/1WYqf9Qzez/Utb3/1LW9/9S1vf/S7TO+jhR + Vr4zMzMKAAAAAAAAAAA1NTUiQV1kyVmIluZvwdX9e973/1/Z+P9S1vf/Utb3/1LW9/9S1vf/SKW89DhO + VKpVVVUDAAAAAAAAAAAAAAAAAAAAAAAAAAA5OTkSN0lLYkBdZLpSeYLfVaS591TP7f9S1vf/RZas7zdL + T5oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBACDdERE86U1qwO1tk1zdN + UXgAAAAAAAAAAAAAAAAAAAAAAAAAAPg/rEHwB6xBwAGsQYABrEEAAaxBAAGsQQAArEEAAKxBAACsQQAA + rEGAAKxBgACsQYABrEGAA6xB4A+sQfwfrEE= + + + \ No newline at end of file diff --git a/Models/BookmarkItemModel.cs b/Models/BookmarkItemModel.cs new file mode 100644 index 0000000..1fca643 --- /dev/null +++ b/Models/BookmarkItemModel.cs @@ -0,0 +1,413 @@ +using bzit.bomg.Models; +using HtmlAgilityPack; +using RyzStudio.Net; +using System; +using System.Drawing; +using System.IO; +using System.Net; +using System.Text; +using HtmlDocument = HtmlAgilityPack.HtmlDocument; + +namespace bzit.bomg +{ + public class BookmarkItemModel : BookmarkItemViewModel + { + protected HttpWeb webClient = null; + + public BookmarkItemModel() + { + this.Clear(); + } + + public void Clear() + { + this.SiteName = string.Empty; + this.SiteAddress = string.Empty; + this.SiteDescription = string.Empty; + this.FaviconAddress = string.Empty; + this.TreeviewPath = string.Empty; + } + + public new string ToString() + { + StringBuilder sb = new StringBuilder(); + sb.Append("Name = "); + sb.Append(this.SiteName ?? string.Empty); + sb.Append(Environment.NewLine); + + sb.Append("Address = "); + sb.Append(this.SiteAddress ?? string.Empty); + sb.Append(Environment.NewLine); + + sb.Append("Description = "); + sb.Append(this.SiteDescription ?? string.Empty); + sb.Append(Environment.NewLine); + + return sb.ToString(); + } + + public BookmarkItemViewModel ToViewModel() + { + return new BookmarkItemViewModel() + { + SiteName = this.SiteName, + SiteAddress = this.SiteAddress, + SiteDescription = this.SiteDescription, + FaviconAddress = this.FaviconAddress, + TreeviewPath = this.TreeviewPath + }; + } + + public bool Update() + { + string sourceCode = retrieveSourceCode(); + if (string.IsNullOrWhiteSpace(sourceCode)) + { + return false; + } + + HtmlDocument document = new HtmlDocument(); + document.LoadHtml(sourceCode); + + // title + this.SiteName = parseSiteTitle(document); + + // description + this.SiteDescription = parseSiteDescription(document); + + // favicon + this.FaviconAddress = parseSiteIcon(document); + + // default infurred icon + if (string.IsNullOrWhiteSpace(this.FaviconAddress)) + { + this.FaviconAddress = "/favicon.ico"; + } + + if (!string.IsNullOrWhiteSpace(this.FaviconAddress)) + { + Uri iconAddressURI; + bool rv = Uri.TryCreate(new Uri(this.SiteAddress), this.FaviconAddress, out iconAddressURI); + if (rv) + { + this.FaviconAddress = iconAddressURI.ToString(); + } + } + + return true; + } + + public bool UpdateFavicon() + { + string sourceCode = retrieveSourceCode(); + if (string.IsNullOrWhiteSpace(sourceCode)) + { + return false; + } + + HtmlDocument document = new HtmlDocument(); + document.LoadHtml(sourceCode); + + // favicon + this.FaviconAddress = parseSiteIcon(document); + + // default infurred icon + if (string.IsNullOrWhiteSpace(this.FaviconAddress)) + { + this.FaviconAddress = "/favicon.ico"; + } + + if (!string.IsNullOrWhiteSpace(this.FaviconAddress)) + { + Uri iconAddressURI; + bool rv = Uri.TryCreate(new Uri(this.SiteAddress), this.FaviconAddress, out iconAddressURI); + if (rv) + { + this.FaviconAddress = iconAddressURI.ToString(); + } + } + + return true; + } + + public Bitmap RetrieveFavicon() + { + if (string.IsNullOrWhiteSpace(this.FaviconAddress)) + { + return null; + } + + byte[] iconData = null; + WebClient webClient = new WebClient(); + webClient.CachePolicy = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.NoCacheNoStore); + + try + { + iconData = webClient.DownloadData(this.FaviconAddress); + + if (!RyzStudio.IO.FileType.IsImage(iconData)) + { + throw new Exception("Not a supported image"); + } + + Image img = Image.FromStream(new MemoryStream(iconData)); + return new Bitmap(img, 16, 16); + } + catch + { + iconData = null; + this.FaviconAddress = null; + + return null; + } + } + + public Bitmap RetrieveFavicon(out byte[] rawData) + { + rawData = null; + + if (string.IsNullOrWhiteSpace(this.FaviconAddress)) + { + return null; + } + + byte[] iconData = null; + WebClient webClient = new WebClient(); + webClient.CachePolicy = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.NoCacheNoStore); + + try + { + iconData = webClient.DownloadData(this.FaviconAddress); + + if (!RyzStudio.IO.FileType.IsImage(iconData)) + { + throw new Exception("Not a supported image"); + } + + rawData = iconData; + + Image img = Image.FromStream(new MemoryStream(iconData)); + return new Bitmap(img, 16, 16); + } + catch + { + iconData = null; + this.FaviconAddress = null; + + return null; + } + } + + protected string retrieveSourceCode() + { + if (webClient == null) + { + webClient = new HttpWeb(); + } + + string sourceCode; + int statusCode = webClient.GetResponse(out sourceCode, this.SiteAddress); + if ((statusCode == 200) || (statusCode == 301) || (statusCode == 302)) + { + return sourceCode; + } + + return null; + + //WebClient webClient = new WebClient(); + //webClient.CachePolicy = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.NoCacheNoStore); + + //try + //{ + // return webClient.DownloadString(this.SiteAddress); + //} + //catch (Exception exc) + //{ + // return null; + //} + } + + protected string parseTagValue(HtmlDocument doc, string xpath, string defaultValue = "") + { + HtmlNodeCollection hnc = doc.DocumentNode.SelectNodes(xpath); + if (hnc == null) + { + return defaultValue; + } + + if (hnc.Count <= 0) + { + return defaultValue; + } + + foreach (HtmlNode hn in hnc) + { + if (string.IsNullOrWhiteSpace(hn.InnerHtml)) + { + continue; + } + + string rs = WebUtility.HtmlDecode(hn.InnerHtml)?.Replace("\r", "")?.Replace("\n", " ")?.Trim(); + if (string.IsNullOrWhiteSpace(rs)) + { + continue; + } + + return rs; + } + + return defaultValue; + } + + protected string parseTagValue_Attr(HtmlDocument doc, string xpath, string attr, string defaultValue = "") + { + HtmlNodeCollection hnc = doc.DocumentNode.SelectNodes(xpath); + if (hnc == null) + { + return defaultValue; + } + + if (hnc.Count <= 0) + { + return defaultValue; + } + + foreach (HtmlNode hn in hnc) + { + if (hn.Attributes[attr] == null) + { + continue; + } + + if (string.IsNullOrWhiteSpace(hn.Attributes[attr].Value)) + { + continue; + } + + return System.Web.HttpUtility.HtmlDecode(hn.Attributes[attr].Value?.Trim()); + } + + return defaultValue; + } + + protected string parseSiteTitle(HtmlDocument doc) + { + string rs = null; + + if (string.IsNullOrWhiteSpace(rs)) + { + rs = parseTagValue(doc, "//title", string.Empty); + } + + if (string.IsNullOrWhiteSpace(rs)) + { + rs = parseTagValue_Attr(doc, "//meta[@property='og:title']", "content", string.Empty); + } + + if (string.IsNullOrWhiteSpace(rs)) + { + rs = parseTagValue_Attr(doc, "//meta[@name='twitter:title']", "content", string.Empty); + } + + if (string.IsNullOrWhiteSpace(rs)) + { + rs = parseTagValue_Attr(doc, "//meta[@property='og:site_name']", "content", string.Empty); + } + + if (string.IsNullOrWhiteSpace(rs)) + { + rs = parseTagValue_Attr(doc, "//meta[@itemprop='name']", "content", string.Empty); + } + + return rs?.Trim(); + } + + protected string parseSiteDescription(HtmlDocument doc) + { + string rs = null; + + if (string.IsNullOrWhiteSpace(rs)) + { + rs = parseTagValue_Attr(doc, "//meta[@name='description']", "content", string.Empty); + } + + if (string.IsNullOrWhiteSpace(rs)) + { + rs = parseTagValue_Attr(doc, "//meta[@property='og:description']", "content", string.Empty); + } + + if (string.IsNullOrWhiteSpace(rs)) + { + rs = parseTagValue_Attr(doc, "//meta[@name='twitter:description']", "content", string.Empty); + } + + if (string.IsNullOrWhiteSpace(rs)) + { + rs = parseTagValue_Attr(doc, "//meta[@property='og:description']", "content", string.Empty); + } + + if (string.IsNullOrWhiteSpace(rs)) + { + rs = parseTagValue_Attr(doc, "//meta[@itemprop='description']", "content", string.Empty); + } + + return rs; + } + + protected string parseSiteIcon(HtmlDocument doc) + { + string rs = null; + + if (string.IsNullOrWhiteSpace(rs)) + { + //rs = parseTagValue_Attr(doc, "//link[@rel='shortcut icon']", "href", string.Empty); + rs = parseTagValue_Attr(doc, "//link[translate(@rel, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = 'shortcut icon']", "href", string.Empty); + } + + if (string.IsNullOrWhiteSpace(rs)) + { + //rs = parseTagValue_Attr(doc, "//link[@rel='icon']", "href", string.Empty); + rs = parseTagValue_Attr(doc, "//link[translate(@rel, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = 'icon']", "href", string.Empty); + } + + if (string.IsNullOrWhiteSpace(rs)) + { + //rs = parseTagValue_Attr(doc, "//link[@rel='apple-touch-icon']", "href", string.Empty); + rs = parseTagValue_Attr(doc, "//link[translate(@rel, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = 'apple-touch-icon']", "href", string.Empty); + } + + if (string.IsNullOrWhiteSpace(rs)) + { + //rs = parseTagValue_Attr(doc, "//link[@rel='apple-touch-icon-precomposed']", "href", string.Empty); + rs = parseTagValue_Attr(doc, "//link[translate(@rel, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = 'apple-touch-icon-precomposed']", "href", string.Empty); + } + + if (string.IsNullOrWhiteSpace(rs)) + { + //rs = parseTagValue_Attr(doc, "//meta[@property='og:image']", "content", string.Empty); + rs = parseTagValue_Attr(doc, "//meta[translate(@property, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = 'og:image']", "content", string.Empty); + } + + if (string.IsNullOrWhiteSpace(rs)) + { + //rs = parseTagValue_Attr(doc, "//meta[@name='twitter:image']", "content", string.Empty); + rs = parseTagValue_Attr(doc, "//meta[translate(@name, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = 'twitter:image']", "content", string.Empty); + } + + if (string.IsNullOrWhiteSpace(rs)) + { + //rs = parseTagValue_Attr(doc, "//meta[@property='og:image']", "content", string.Empty); + rs = parseTagValue_Attr(doc, "//meta[translate(@property, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = 'og:image']", "content", string.Empty); + } + + if (string.IsNullOrWhiteSpace(rs)) + { + //rs = parseTagValue_Attr(doc, "//meta[@itemprop='image']", "content", string.Empty); + rs = parseTagValue_Attr(doc, "//meta[translate(@itemprop, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = 'image']", "content", string.Empty); + } + + return rs; + } + + } +} \ No newline at end of file diff --git a/Models/BookmarkItemViewModel.cs b/Models/BookmarkItemViewModel.cs new file mode 100644 index 0000000..f05f934 --- /dev/null +++ b/Models/BookmarkItemViewModel.cs @@ -0,0 +1,44 @@ +using System; +using System.Text; + +namespace bzit.bomg.Models +{ + public class BookmarkItemViewModel + { + public string SiteName { get; set; } + public string SiteAddress { get; set; } + public string SiteDescription { get; set; } + public string FaviconAddress { get; set; } + public string TreeviewPath { get; set; } + + public BookmarkItemModel ToModel() + { + return new BookmarkItemModel() + { + SiteName = this.SiteName, + SiteAddress = this.SiteAddress, + SiteDescription = this.SiteDescription, + FaviconAddress = this.FaviconAddress, + TreeviewPath = this.TreeviewPath + }; + } + + public new string ToString() + { + StringBuilder sb = new StringBuilder(); + sb.Append("Name = "); + sb.Append(this.SiteName ?? string.Empty); + sb.Append(Environment.NewLine); + + sb.Append("Address = "); + sb.Append(this.SiteAddress ?? string.Empty); + sb.Append(Environment.NewLine); + + sb.Append("Description = "); + sb.Append(this.SiteDescription ?? string.Empty); + sb.Append(Environment.NewLine); + + return sb.ToString(); + } + } +} \ No newline at end of file diff --git a/Models/LauncherSession.cs b/Models/LauncherSession.cs new file mode 100644 index 0000000..61a4dc6 --- /dev/null +++ b/Models/LauncherSession.cs @@ -0,0 +1,42 @@ +using System.Collections.Generic; +using System.Drawing; + +namespace FizzyLauncher.Models +{ + public class LauncherSession + { + public class HotKeyOptions + { + public bool IsCtrl { get; set; } = false; + public bool IsAlt { get; set; } = false; + public bool IsShift { get; set; } = false; + public int Key { get; set; } = (int)System.Windows.Forms.Keys.None; + + public int ModifierCode => ((this.IsAlt ? 1 : 0) + (this.IsCtrl ? 2 : 0) + (this.IsShift ? 4 : 0)); + + public System.Windows.Forms.Keys KeyCode => (System.Windows.Forms.Keys)this.Key; + } + + public enum AutoSaveOption + { + Prompt = 0, + Yes, + No + } + + public int DefaultHeight { get; set; } = 280; + public HotKeyOptions HotKey { get; set; } = null; + + public bool AlwaysOnTop { get; set; } = false; + public bool EnableAnimation { get; set; } = false; + public bool EnableBigIconInFolder { get; set; } = false; + + public bool HideOnClose { get; set; } = false; + public bool HideOnClick { get; set; } = false; + public AutoSaveOption AutoSave { get; set; } = AutoSaveOption.Prompt; + //public List Groups { get; set; } = new List(); + + public Point StartPosition { get; set; } = Point.Empty; + + } +} \ No newline at end of file diff --git a/Models/TileGroupModel.cs b/Models/TileGroupModel.cs new file mode 100644 index 0000000..6f69481 --- /dev/null +++ b/Models/TileGroupModel.cs @@ -0,0 +1,21 @@ +using FizzyLauncher.Text.Json; +using System.Collections.Generic; +using System.Drawing; +using System.Text.Json.Serialization; + +namespace FizzyLauncher.Models +{ + public class TileGroupModel + { + public string Title { get; set; } + + public bool IsExpanded { get; set; } = false; + + public bool IsExclusive { get; set; } = false; + + public List Items { get; set; } = new List(); + + [JsonConverter(typeof(JsonSizeConverter))] + public Size GridSize { get; set; } = new Size(0, 0); + } +} \ No newline at end of file diff --git a/Models/TileModel.cs b/Models/TileModel.cs new file mode 100644 index 0000000..9e47756 --- /dev/null +++ b/Models/TileModel.cs @@ -0,0 +1,110 @@ +using FizzyLauncher.Text.Json; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.Text.Json.Serialization; + +namespace FizzyLauncher.Models +{ + public class TileModel + { + public string Title { get; set; } + + public string ProcessFilename { get; set; } + + public string ProcessArgument { get; set; } + + public string ProcessWorkingDirectory { get; set; } + + public ProcessWindowStyle ProcessWindowStyle { get; set; } = ProcessWindowStyle.Normal; + + public bool ProcessAsAdmin { get; set; } = false; + + [JsonConverter(typeof(JsonPointConverter))] + public Point Position { get; set; } + + public bool IsGroup { get; set; } = false; + + public List Items { get; set; } = new List(); + + public override string ToString() => this.Title ?? string.Empty; + + public string CleanProcessFilename => (string.IsNullOrWhiteSpace(this.ProcessFilename) ? string.Empty : resolvePath(this.ProcessFilename)); + + public string CleanProcessArgument => (string.IsNullOrWhiteSpace(this.ProcessArgument) ? string.Empty : resolvePath(this.ProcessArgument)); + + public string CleanProcessWorkingDirectory => (string.IsNullOrWhiteSpace(this.ProcessWorkingDirectory) ? string.Empty : resolvePath(this.ProcessWorkingDirectory)); + + protected string resolvePath(string value) + { + string rv = Environment.ExpandEnvironmentVariables(value); + + rv = resolveFirstPath(rv); + rv = resolveLastPath(rv); + + return rv; + } + + protected string resolveFirstPath(string value) + { + const string last = "%FIRST%"; + if (!value.Contains(last)) + { + return value; + } + + string head = value.Substring(0, value.IndexOf(last)); + string tail = value.Substring(value.IndexOf(last) + last.Length); + + string[] dirList = new string[0]; + + try + { + dirList = System.IO.Directory.GetDirectories(head, "*", System.IO.SearchOption.TopDirectoryOnly); + } + catch + { + // do nothing + } + + if (dirList.Length <= 0) + { + return value; + } + + return dirList[0] + tail; + } + + protected string resolveLastPath(string value) + { + const string last = "%LAST%"; + if (!value.Contains(last)) + { + return value; + } + + string head = value.Substring(0, value.IndexOf(last)); + string tail = value.Substring(value.IndexOf(last) + last.Length); + + string[] dirList = new string[0]; + + try + { + dirList = System.IO.Directory.GetDirectories(head, "*", System.IO.SearchOption.TopDirectoryOnly); + } + catch + { + // do nothing + } + + if (dirList.Length <= 0) + { + return value; + } + + return dirList[(dirList.Length - 1)] + tail; + } + + } +} diff --git a/NewForm.cs b/NewForm.cs new file mode 100644 index 0000000..24d6442 --- /dev/null +++ b/NewForm.cs @@ -0,0 +1,126 @@ +using RyzStudio.Windows.ThemedForms; +using System; + +namespace FizzyLauncher +{ + public class NewForm : TDialogForm + { + private System.Windows.Forms.Label label1; + private TButton button1; + private TNumericBox numericBox1; + private RyzStudio.Windows.Forms.THorizontalSeparator tHorizontalSeparator1; + + + public NewForm(MainForm parent) : base() + { + InitializeComponent(); + + parentForm = parent; + + numericBox1.InnerControl.Minimum = 4; + numericBox1.InnerControl.Maximum = 24; + numericBox1.InnerControl.Value = 6; + } + + private void InitializeComponent() + { + this.label1 = new System.Windows.Forms.Label(); + this.button1 = new RyzStudio.Windows.ThemedForms.TButton(); + this.tHorizontalSeparator1 = new RyzStudio.Windows.Forms.THorizontalSeparator(); + this.numericBox1 = new RyzStudio.Windows.ThemedForms.TNumericBox(); + this.SuspendLayout(); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.BackColor = System.Drawing.Color.Transparent; + this.label1.ForeColor = System.Drawing.SystemColors.ControlText; + this.label1.Location = new System.Drawing.Point(10, 21); + this.label1.Margin = new System.Windows.Forms.Padding(0); + this.label1.Name = "label1"; + this.label1.Padding = new System.Windows.Forms.Padding(0, 9, 0, 10); + this.label1.Size = new System.Drawing.Size(137, 34); + this.label1.TabIndex = 153; + this.label1.Text = "Number of Tiles Per Row"; + this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // button1 + // + this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.button1.BackColor = System.Drawing.Color.Transparent; + this.button1.DefaultImage = null; + this.button1.DownImage = null; + this.button1.IsSelected = false; + this.button1.LabelText = "&Save"; + this.button1.Location = new System.Drawing.Point(241, 109); + this.button1.Margin = new System.Windows.Forms.Padding(10); + this.button1.Name = "button1"; + this.button1.OverImage = null; + this.button1.Padding = new System.Windows.Forms.Padding(4, 4, 3, 3); + this.button1.Size = new System.Drawing.Size(128, 32); + this.button1.TabIndex = 173; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // tHorizontalSeparator1 + // + this.tHorizontalSeparator1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.tHorizontalSeparator1.AutoScrollMargin = new System.Drawing.Size(0, 0); + this.tHorizontalSeparator1.AutoScrollMinSize = new System.Drawing.Size(0, 0); + this.tHorizontalSeparator1.BackColor = System.Drawing.Color.Transparent; + this.tHorizontalSeparator1.Location = new System.Drawing.Point(10, 77); + this.tHorizontalSeparator1.Margin = new System.Windows.Forms.Padding(10, 0, 10, 0); + this.tHorizontalSeparator1.MaximumSize = new System.Drawing.Size(4920, 2); + this.tHorizontalSeparator1.MinimumSize = new System.Drawing.Size(0, 22); + this.tHorizontalSeparator1.Name = "tHorizontalSeparator1"; + this.tHorizontalSeparator1.Padding = new System.Windows.Forms.Padding(0, 10, 0, 10); + this.tHorizontalSeparator1.Size = new System.Drawing.Size(364, 22); + this.tHorizontalSeparator1.TabIndex = 188; + // + // numericBox1 + // + this.numericBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.numericBox1.BackColor = System.Drawing.Color.Transparent; + this.numericBox1.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.numericBox1.Location = new System.Drawing.Point(285, 20); + this.numericBox1.Margin = new System.Windows.Forms.Padding(10, 6, 10, 6); + this.numericBox1.Name = "numericBox1"; + this.numericBox1.Padding = new System.Windows.Forms.Padding(8, 8, 7, 7); + this.numericBox1.Size = new System.Drawing.Size(84, 34); + this.numericBox1.SubmitButton = null; + this.numericBox1.TabIndex = 189; + this.numericBox1.Value = 0; + // + // NewForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(384, 161); + this.Controls.Add(this.numericBox1); + this.Controls.Add(this.tHorizontalSeparator1); + this.Controls.Add(this.button1); + this.Controls.Add(this.label1); + this.MinimumSize = new System.Drawing.Size(400, 200); + this.Name = "NewForm"; + this.Text = "New"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + + public MainForm parentForm { get; set; } = null; + + + private void button1_Click(object sender, EventArgs e) + { + if (parentForm != null) + { + parentForm.Clear(numericBox1.Value); + } + + this.Close(); + } + + } +} \ No newline at end of file diff --git a/NewForm.resx b/NewForm.resx new file mode 100644 index 0000000..f298a7b --- /dev/null +++ b/NewForm.resx @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/OpenFileForm.cs b/OpenFileForm.cs new file mode 100644 index 0000000..1b20e57 --- /dev/null +++ b/OpenFileForm.cs @@ -0,0 +1,182 @@ +using RyzStudio.Windows.ThemedForms; +using System; +using System.ComponentModel; + +namespace FizzyLauncher +{ + public class OpenFileForm : TDialogForm + { + private System.Windows.Forms.Label label1; + private TButton button1; + private System.Windows.Forms.Label label8; + private RyzStudio.Windows.Forms.THorizontalSeparator tHorizontalSeparator1; + private TOpenFileTextBox textBox1; + private TTextBox textBox2; + private System.Windows.Forms.OpenFileDialog openFileDialog1; + + + public OpenFileForm(MainForm parent) : base() + { + InitializeComponent(); + + this.ParentForm = parent; + + textBox2.InnerTextBox.MaxLength = 128; + } + + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(OpenFileForm)); + this.label1 = new System.Windows.Forms.Label(); + this.button1 = new RyzStudio.Windows.ThemedForms.TButton(); + this.label8 = new System.Windows.Forms.Label(); + this.tHorizontalSeparator1 = new RyzStudio.Windows.Forms.THorizontalSeparator(); + this.textBox1 = new RyzStudio.Windows.ThemedForms.TOpenFileTextBox(); + this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog(); + this.textBox2 = new RyzStudio.Windows.ThemedForms.TTextBox(); + this.SuspendLayout(); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.BackColor = System.Drawing.Color.Transparent; + this.label1.ForeColor = System.Drawing.SystemColors.ControlText; + this.label1.Location = new System.Drawing.Point(10, 21); + this.label1.Margin = new System.Windows.Forms.Padding(0); + this.label1.Name = "label1"; + this.label1.Padding = new System.Windows.Forms.Padding(0, 9, 0, 10); + this.label1.Size = new System.Drawing.Size(55, 34); + this.label1.TabIndex = 153; + this.label1.Text = "Filename"; + this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // button1 + // + this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.button1.BackColor = System.Drawing.Color.Transparent; + this.button1.DefaultImage = null; + this.button1.DownImage = null; + this.button1.IsSelected = false; + this.button1.LabelText = "&OK"; + this.button1.Location = new System.Drawing.Point(321, 149); + this.button1.Margin = new System.Windows.Forms.Padding(10); + this.button1.Name = "button1"; + this.button1.OverImage = null; + this.button1.Padding = new System.Windows.Forms.Padding(4, 4, 3, 3); + this.button1.Size = new System.Drawing.Size(128, 32); + this.button1.TabIndex = 173; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // label8 + // + this.label8.AutoSize = true; + this.label8.BackColor = System.Drawing.Color.Transparent; + this.label8.ForeColor = System.Drawing.SystemColors.ControlText; + this.label8.Location = new System.Drawing.Point(10, 62); + this.label8.Margin = new System.Windows.Forms.Padding(0); + this.label8.Name = "label8"; + this.label8.Padding = new System.Windows.Forms.Padding(0, 9, 0, 10); + this.label8.Size = new System.Drawing.Size(134, 34); + this.label8.TabIndex = 186; + this.label8.Text = "Password (If Applicable)"; + this.label8.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // tHorizontalSeparator1 + // + this.tHorizontalSeparator1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.tHorizontalSeparator1.AutoScrollMargin = new System.Drawing.Size(0, 0); + this.tHorizontalSeparator1.AutoScrollMinSize = new System.Drawing.Size(0, 0); + this.tHorizontalSeparator1.BackColor = System.Drawing.Color.Transparent; + this.tHorizontalSeparator1.Location = new System.Drawing.Point(10, 117); + this.tHorizontalSeparator1.Margin = new System.Windows.Forms.Padding(10, 0, 10, 0); + this.tHorizontalSeparator1.MaximumSize = new System.Drawing.Size(4920, 2); + this.tHorizontalSeparator1.MinimumSize = new System.Drawing.Size(0, 22); + this.tHorizontalSeparator1.Name = "tHorizontalSeparator1"; + this.tHorizontalSeparator1.Padding = new System.Windows.Forms.Padding(0, 10, 0, 10); + this.tHorizontalSeparator1.Size = new System.Drawing.Size(444, 22); + this.tHorizontalSeparator1.TabIndex = 188; + // + // textBox1 + // + this.textBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBox1.BackColor = System.Drawing.Color.Transparent; + this.textBox1.FileDialog = this.openFileDialog1; + this.textBox1.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.textBox1.HighlightImage = ((System.Drawing.Image)(resources.GetObject("textBox1.HighlightImage"))); + this.textBox1.Location = new System.Drawing.Point(192, 20); + this.textBox1.Margin = new System.Windows.Forms.Padding(10, 3, 3, 3); + this.textBox1.Name = "textBox1"; + this.textBox1.NormalImage = ((System.Drawing.Image)(resources.GetObject("textBox1.NormalImage"))); + this.textBox1.Padding = new System.Windows.Forms.Padding(10, 10, 9, 9); + this.textBox1.Size = new System.Drawing.Size(257, 35); + this.textBox1.SubmitButton = null; + this.textBox1.TabIndex = 190; + this.textBox1.UseSystemPasswordChar = false; + // + // openFileDialog1 + // + this.openFileDialog1.DefaultExt = "jsnx"; + this.openFileDialog1.Filter = "Bookmarks files (*.jsnx)|*.jsnx|Bookmarks files (*.ryz)|*.ryz"; + this.openFileDialog1.Title = "Open bookmarks file"; + // + // textBox2 + // + this.textBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBox2.BackColor = System.Drawing.Color.Transparent; + this.textBox2.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.textBox2.Location = new System.Drawing.Point(231, 62); + this.textBox2.Margin = new System.Windows.Forms.Padding(10, 6, 10, 6); + this.textBox2.Name = "textBox2"; + this.textBox2.Padding = new System.Windows.Forms.Padding(10, 10, 9, 9); + this.textBox2.Size = new System.Drawing.Size(218, 35); + this.textBox2.SubmitButton = null; + this.textBox2.TabIndex = 191; + this.textBox2.UseSystemPasswordChar = true; + // + // OpenFileForm + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.ClientSize = new System.Drawing.Size(464, 201); + this.Controls.Add(this.textBox2); + this.Controls.Add(this.textBox1); + this.Controls.Add(this.tHorizontalSeparator1); + this.Controls.Add(this.label8); + this.Controls.Add(this.button1); + this.Controls.Add(this.label1); + this.MinimumSize = new System.Drawing.Size(400, 240); + this.Name = "OpenFileForm"; + this.Text = "Open File"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + protected override void OnShown(EventArgs e) + { + base.OnShown(e); + + this.DialogResult = System.Windows.Forms.DialogResult.None; + } + + + [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public MainForm ParentForm { get; protected set; } = null; + + [Browsable(false)] + public string FileName => textBox1.Text; + + [Browsable(false)] + public string Password => textBox2.Text; + + + private void button1_Click(object sender, EventArgs e) + { + this.DialogResult = System.Windows.Forms.DialogResult.OK; + this.Close(); + } + + } +} \ No newline at end of file diff --git a/OpenFileForm.resx b/OpenFileForm.resx new file mode 100644 index 0000000..dce4b6e --- /dev/null +++ b/OpenFileForm.resx @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + 17, 17 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vQAADr0BR/uQrQAAAK9JREFUOE/t0zsKwkAURuGp1BWJK3EhIrgAV+EOLLWwtRQLwQdiIbbiIkwynj+O + IVwnyhR2XvjyInNIkXHee8f0cEQBPbDOaKEarSvXhsAJO4wirlB4jipiA3phoIvIrLFChhnKiA3o8Ckw + RR93LNBODVwwwRL62kNKYIxNzQ1FSsDOEHk08HrYJMw/8KtA06/cCef6KJDZgDbTFrHNZO3x9idqOyui + m2+07bvPgHcPXOhtG3D6cUIAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vQAADr0BR/uQrQAAAMZJREFUOE/tk7sNwjAQQF3BRohJGAQhMQBTsAElFLSUiAKJTxIXhBZlCILNuyRG + iXEQKeg46fmsO/slhU9Za5XWehiXYcD6JElygZ6qhdwTioVDGo4wDXDjsohXdYkvMDTHVa8R9Hb0tpCz + XzqJL5Df/CRYRFE0Yn8nr9M07XcSwBXmXN6QDfncRTCjt6+Rgfla4Adfn3D+ERS4Yht/wY8FxVN2xTac + gLP5qyYLAhmmA4SGyeeEoPkSq3EWydsoB4gRDEqBVU/p15ajstHKCgAAAABJRU5ErkJggg== + + + \ No newline at end of file diff --git a/OptionsForm.cs b/OptionsForm.cs new file mode 100644 index 0000000..29aff71 --- /dev/null +++ b/OptionsForm.cs @@ -0,0 +1,279 @@ +using FizzyLauncher.Models; +using RyzStudio.Windows.ThemedForms; +using System; + +namespace FizzyLauncher +{ + public class OptionsForm : TDialogForm + { + private System.Windows.Forms.Label label1; + private TButton button1; + private TYesNoPickerBox pickerBox2; + private System.Windows.Forms.Label label6; + private TYesNoPickerBox pickerBox3; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.Label label8; + private TPickerBox pickerBox1; + private RyzStudio.Windows.Forms.THorizontalSeparator tHorizontalSeparator1; + private TKeyCodeTextBox textBox1; + + + public OptionsForm(MainForm parent) : base() + { + InitializeComponent(); + + parentForm = parent; + + pickerBox1.ComboBox.Items.Clear(); + foreach (string item in Enum.GetNames(typeof(LauncherSession.AutoSaveOption))) + { + pickerBox1.ComboBox.Items.Add(item); + } + + if (pickerBox1.ComboBox.Items.Count > 0) pickerBox1.ComboBox.SelectedIndex = 0; + + } + + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(OptionsForm)); + RyzStudio.Windows.ThemedForms.TKeyCodeTextBox.Results results1 = new RyzStudio.Windows.ThemedForms.TKeyCodeTextBox.Results(); + this.label1 = new System.Windows.Forms.Label(); + this.button1 = new RyzStudio.Windows.ThemedForms.TButton(); + this.pickerBox2 = new RyzStudio.Windows.ThemedForms.TYesNoPickerBox(); + this.label6 = new System.Windows.Forms.Label(); + this.pickerBox3 = new RyzStudio.Windows.ThemedForms.TYesNoPickerBox(); + this.label7 = new System.Windows.Forms.Label(); + this.label8 = new System.Windows.Forms.Label(); + this.pickerBox1 = new RyzStudio.Windows.ThemedForms.TPickerBox(); + this.tHorizontalSeparator1 = new RyzStudio.Windows.Forms.THorizontalSeparator(); + this.textBox1 = new RyzStudio.Windows.ThemedForms.TKeyCodeTextBox(); + this.SuspendLayout(); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.BackColor = System.Drawing.Color.Transparent; + this.label1.ForeColor = System.Drawing.SystemColors.ControlText; + this.label1.Location = new System.Drawing.Point(10, 21); + this.label1.Margin = new System.Windows.Forms.Padding(0); + this.label1.Name = "label1"; + this.label1.Padding = new System.Windows.Forms.Padding(0, 9, 0, 10); + this.label1.Size = new System.Drawing.Size(107, 34); + this.label1.TabIndex = 153; + this.label1.Text = "Show/Hide Hotkey"; + this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // button1 + // + this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.button1.BackColor = System.Drawing.Color.Transparent; + this.button1.DefaultImage = null; + this.button1.DownImage = null; + this.button1.IsSelected = false; + this.button1.LabelText = "&Save"; + this.button1.Location = new System.Drawing.Point(241, 469); + this.button1.Margin = new System.Windows.Forms.Padding(10); + this.button1.Name = "button1"; + this.button1.OverImage = null; + this.button1.Padding = new System.Windows.Forms.Padding(4, 4, 3, 3); + this.button1.Size = new System.Drawing.Size(128, 32); + this.button1.TabIndex = 173; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // pickerBox2 + // + this.pickerBox2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.pickerBox2.BackColor = System.Drawing.Color.Transparent; + this.pickerBox2.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.pickerBox2.Location = new System.Drawing.Point(285, 103); + this.pickerBox2.Margin = new System.Windows.Forms.Padding(10, 4, 10, 4); + this.pickerBox2.Name = "pickerBox2"; + this.pickerBox2.Padding = new System.Windows.Forms.Padding(10, 6, 7, 5); + this.pickerBox2.Size = new System.Drawing.Size(84, 34); + this.pickerBox2.SubmitButton = null; + this.pickerBox2.TabIndex = 183; + this.pickerBox2.Value = true; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.BackColor = System.Drawing.Color.Transparent; + this.label6.ForeColor = System.Drawing.SystemColors.ControlText; + this.label6.Location = new System.Drawing.Point(10, 103); + this.label6.Margin = new System.Windows.Forms.Padding(0); + this.label6.Name = "label6"; + this.label6.Padding = new System.Windows.Forms.Padding(0, 9, 0, 10); + this.label6.Size = new System.Drawing.Size(83, 34); + this.label6.TabIndex = 182; + this.label6.Text = "Hide On Close"; + this.label6.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // pickerBox3 + // + this.pickerBox3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.pickerBox3.BackColor = System.Drawing.Color.Transparent; + this.pickerBox3.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.pickerBox3.Location = new System.Drawing.Point(285, 144); + this.pickerBox3.Margin = new System.Windows.Forms.Padding(10, 4, 10, 4); + this.pickerBox3.Name = "pickerBox3"; + this.pickerBox3.Padding = new System.Windows.Forms.Padding(10, 6, 7, 5); + this.pickerBox3.Size = new System.Drawing.Size(84, 34); + this.pickerBox3.SubmitButton = null; + this.pickerBox3.TabIndex = 185; + this.pickerBox3.Value = true; + // + // label7 + // + this.label7.AutoSize = true; + this.label7.BackColor = System.Drawing.Color.Transparent; + this.label7.ForeColor = System.Drawing.SystemColors.ControlText; + this.label7.Location = new System.Drawing.Point(10, 144); + this.label7.Margin = new System.Windows.Forms.Padding(0); + this.label7.Name = "label7"; + this.label7.Padding = new System.Windows.Forms.Padding(0, 9, 0, 10); + this.label7.Size = new System.Drawing.Size(95, 34); + this.label7.TabIndex = 184; + this.label7.Text = "Hide On Execute"; + this.label7.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // label8 + // + this.label8.AutoSize = true; + this.label8.BackColor = System.Drawing.Color.Transparent; + this.label8.ForeColor = System.Drawing.SystemColors.ControlText; + this.label8.Location = new System.Drawing.Point(10, 62); + this.label8.Margin = new System.Windows.Forms.Padding(0); + this.label8.Name = "label8"; + this.label8.Padding = new System.Windows.Forms.Padding(0, 9, 0, 10); + this.label8.Size = new System.Drawing.Size(60, 34); + this.label8.TabIndex = 186; + this.label8.Text = "Auto Save"; + this.label8.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // pickerBox1 + // + this.pickerBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.pickerBox1.BackColor = System.Drawing.Color.Transparent; + this.pickerBox1.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.pickerBox1.Location = new System.Drawing.Point(285, 62); + this.pickerBox1.Margin = new System.Windows.Forms.Padding(10, 4, 10, 4); + this.pickerBox1.Name = "pickerBox1"; + this.pickerBox1.Padding = new System.Windows.Forms.Padding(10, 6, 7, 5); + this.pickerBox1.Size = new System.Drawing.Size(84, 34); + this.pickerBox1.SubmitButton = null; + this.pickerBox1.TabIndex = 187; + // + // tHorizontalSeparator1 + // + this.tHorizontalSeparator1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.tHorizontalSeparator1.AutoScrollMargin = new System.Drawing.Size(0, 0); + this.tHorizontalSeparator1.AutoScrollMinSize = new System.Drawing.Size(0, 0); + this.tHorizontalSeparator1.BackColor = System.Drawing.Color.Transparent; + this.tHorizontalSeparator1.Location = new System.Drawing.Point(10, 437); + this.tHorizontalSeparator1.Margin = new System.Windows.Forms.Padding(10, 0, 10, 0); + this.tHorizontalSeparator1.MaximumSize = new System.Drawing.Size(4920, 2); + this.tHorizontalSeparator1.MinimumSize = new System.Drawing.Size(0, 22); + this.tHorizontalSeparator1.Name = "tHorizontalSeparator1"; + this.tHorizontalSeparator1.Padding = new System.Windows.Forms.Padding(0, 10, 0, 10); + this.tHorizontalSeparator1.Size = new System.Drawing.Size(364, 22); + this.tHorizontalSeparator1.TabIndex = 188; + // + // textBox1 + // + this.textBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBox1.BackColor = System.Drawing.Color.Transparent; + this.textBox1.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.textBox1.HighlightImage = ((System.Drawing.Image)(resources.GetObject("textBox1.HighlightImage"))); + results1.IsAlt = false; + results1.IsCtrl = false; + results1.IsShift = false; + results1.Key = System.Windows.Forms.Keys.None; + this.textBox1.KeyCodeResults = results1; + this.textBox1.Location = new System.Drawing.Point(192, 20); + this.textBox1.Margin = new System.Windows.Forms.Padding(10, 3, 3, 3); + this.textBox1.Name = "textBox1"; + this.textBox1.NormalImage = ((System.Drawing.Image)(resources.GetObject("textBox1.NormalImage"))); + this.textBox1.Padding = new System.Windows.Forms.Padding(10, 10, 9, 9); + this.textBox1.Size = new System.Drawing.Size(177, 35); + this.textBox1.SubmitButton = null; + this.textBox1.TabIndex = 189; + this.textBox1.UseSystemPasswordChar = false; + // + // OptionsForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(384, 521); + this.Controls.Add(this.textBox1); + this.Controls.Add(this.tHorizontalSeparator1); + this.Controls.Add(this.pickerBox1); + this.Controls.Add(this.label8); + this.Controls.Add(this.pickerBox3); + this.Controls.Add(this.label7); + this.Controls.Add(this.pickerBox2); + this.Controls.Add(this.label6); + this.Controls.Add(this.button1); + this.Controls.Add(this.label1); + this.MinimumSize = new System.Drawing.Size(400, 560); + this.Name = "OptionsForm"; + this.Text = "Options"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + protected override void OnShown(EventArgs e) + { + base.OnShown(e); + + if (parentForm == null) + { + return; + } + + if (parentForm.CurrentSession == null) + { + return; + } + + // hotkey + if (parentForm.CurrentSession.HotKey != null) + { + textBox1.UpdateKeyCode(parentForm.CurrentSession.HotKey.IsCtrl, parentForm.CurrentSession.HotKey.IsAlt, parentForm.CurrentSession.HotKey.IsShift, parentForm.CurrentSession.HotKey.KeyCode); + } + + pickerBox1.ComboBox.SelectedIndex = (int)parentForm.CurrentSession.AutoSave; + pickerBox2.Value = parentForm.CurrentSession.HideOnClose; + pickerBox3.Value = parentForm.CurrentSession.HideOnClick; + } + + + public MainForm parentForm { get; set; } = null; + + + private void button1_Click(object sender, EventArgs e) + { + if (parentForm != null) + { + if (parentForm.CurrentSession == null) parentForm.CurrentSession = new LauncherSession(); + if (parentForm.CurrentSession.HotKey == null) parentForm.CurrentSession.HotKey = new LauncherSession.HotKeyOptions(); + + parentForm.CurrentSession.HotKey.IsCtrl = textBox1.KeyCodeResults.IsCtrl; + parentForm.CurrentSession.HotKey.IsAlt = textBox1.KeyCodeResults.IsAlt; + parentForm.CurrentSession.HotKey.IsShift = textBox1.KeyCodeResults.IsShift; + parentForm.CurrentSession.HotKey.Key = textBox1.KeyCodeResults.KeyCode; + + parentForm.CurrentSession.AutoSave = (LauncherSession.AutoSaveOption)pickerBox1.ComboBox.SelectedIndex; + parentForm.CurrentSession.HideOnClose = pickerBox2.Value; + parentForm.CurrentSession.HideOnClick = pickerBox3.Value; + + } + + this.Close(); + } + + } +} \ No newline at end of file diff --git a/OptionsForm.resx b/OptionsForm.resx new file mode 100644 index 0000000..c8f691f --- /dev/null +++ b/OptionsForm.resx @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + iVBORw0KGgoAAAANSUhEUgAAAA4AAAAQCAYAAAAmlE46AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAClSURBVDhP7dI/ + DgFBGIbxSVTKjcRx3MLqXYCOjkocQcMF3MAZOIKaE5AthOexf2QnbJQKb/JLJvO9XzLFhCgtbHDBveB5 + DWcfM8ANC0wKnr1LUUsbHXSxxBlJxDtnduy6E04on/Utd0IPOxwxxBT9iHfO7Nh155kV9vmxMXbsVvkv + vvIji4f82Bg7tcUxrpih/NyxOeyMUMVPu0WGd39TzuzQDeEB5/ZKvTSyulEAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAAA4AAAAQCAYAAAAmlE46AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAADTSURBVDhP7ZI7 + CsJQEEUfWFmK4HLchdpnA9ppp5W4BBtdQNyBC0ilRf6VdVyBwUL03JdXxC/YWThwmDcz94YJjKmH7/uN + OI7XaZqekiS5Cr1hpZmTPQemAeILeU4eC/dWr+9kVQRB0MzzvB2GYQfBAsExiqJWHfU0k0ZaeQyNAuxa + X1CYLMu6/MOW4kD2YAK9B9TznGYrj12XVZY0drb4ENJI68q/sR4/YoS9K9+GNHdGLmIEJV+cku1xP4Jh + Ri7JQ2erDp3mBs7w6jaFZht74MaYGwmLbkeRGexGAAAAAElFTkSuQmCC + + + \ No newline at end of file diff --git a/PasswordForm.cs b/PasswordForm.cs new file mode 100644 index 0000000..847ccb2 --- /dev/null +++ b/PasswordForm.cs @@ -0,0 +1,151 @@ +using RyzStudio.Windows.ThemedForms; +using System; +using System.ComponentModel; +using System.Windows.Forms; + +namespace FizzyLauncher +{ + public class PasswordForm : TDialogForm + { + private System.Windows.Forms.Label label1; + private TButton button1; + private RyzStudio.Windows.Forms.THorizontalSeparator tHorizontalSeparator1; + private TTextBox textBox1; + + + public PasswordForm(MainForm parent) + { + InitializeComponent(); + + this.ParentForm = parent; + this.StartPosition = FormStartPosition.WindowsDefaultLocation; + + textBox1.InnerTextBox.MaxLength = 255; + textBox1.InnerTextBox.PreviewKeyDown += textBox1_PreviewKeyDown; + } + + private void InitializeComponent() + { + this.label1 = new System.Windows.Forms.Label(); + this.button1 = new RyzStudio.Windows.ThemedForms.TButton(); + this.tHorizontalSeparator1 = new RyzStudio.Windows.Forms.THorizontalSeparator(); + this.textBox1 = new RyzStudio.Windows.ThemedForms.TTextBox(); + this.SuspendLayout(); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.BackColor = System.Drawing.Color.Transparent; + this.label1.ForeColor = System.Drawing.SystemColors.ControlText; + this.label1.Location = new System.Drawing.Point(10, 21); + this.label1.Margin = new System.Windows.Forms.Padding(0); + this.label1.Name = "label1"; + this.label1.Padding = new System.Windows.Forms.Padding(0, 9, 0, 10); + this.label1.Size = new System.Drawing.Size(57, 34); + this.label1.TabIndex = 153; + this.label1.Text = "Password"; + this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // button1 + // + this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.button1.BackColor = System.Drawing.Color.Transparent; + this.button1.DefaultImage = null; + this.button1.DownImage = null; + this.button1.IsSelected = false; + this.button1.LabelText = "&OK"; + this.button1.Location = new System.Drawing.Point(321, 99); + this.button1.Margin = new System.Windows.Forms.Padding(10); + this.button1.Name = "button1"; + this.button1.OverImage = null; + this.button1.Padding = new System.Windows.Forms.Padding(4, 4, 3, 3); + this.button1.Size = new System.Drawing.Size(128, 32); + this.button1.TabIndex = 173; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // tHorizontalSeparator1 + // + this.tHorizontalSeparator1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.tHorizontalSeparator1.AutoScrollMargin = new System.Drawing.Size(0, 0); + this.tHorizontalSeparator1.AutoScrollMinSize = new System.Drawing.Size(0, 0); + this.tHorizontalSeparator1.BackColor = System.Drawing.Color.Transparent; + this.tHorizontalSeparator1.Location = new System.Drawing.Point(10, 67); + this.tHorizontalSeparator1.Margin = new System.Windows.Forms.Padding(10, 0, 10, 0); + this.tHorizontalSeparator1.MaximumSize = new System.Drawing.Size(4920, 2); + this.tHorizontalSeparator1.MinimumSize = new System.Drawing.Size(0, 22); + this.tHorizontalSeparator1.Name = "tHorizontalSeparator1"; + this.tHorizontalSeparator1.Padding = new System.Windows.Forms.Padding(0, 10, 0, 10); + this.tHorizontalSeparator1.Size = new System.Drawing.Size(444, 22); + this.tHorizontalSeparator1.TabIndex = 188; + // + // textBox1 + // + this.textBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBox1.BackColor = System.Drawing.Color.Transparent; + this.textBox1.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.textBox1.Location = new System.Drawing.Point(121, 20); + this.textBox1.Margin = new System.Windows.Forms.Padding(10, 6, 10, 6); + this.textBox1.Name = "textBox1"; + this.textBox1.Padding = new System.Windows.Forms.Padding(10, 10, 9, 9); + this.textBox1.Size = new System.Drawing.Size(328, 35); + this.textBox1.SubmitButton = null; + this.textBox1.TabIndex = 191; + this.textBox1.UseSystemPasswordChar = true; + // + // PasswordForm + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.ClientSize = new System.Drawing.Size(464, 151); + this.Controls.Add(this.textBox1); + this.Controls.Add(this.tHorizontalSeparator1); + this.Controls.Add(this.button1); + this.Controls.Add(this.label1); + this.MinimumSize = new System.Drawing.Size(480, 190); + this.Name = "PasswordForm"; + this.Text = "Password"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + protected override void OnShown(EventArgs e) + { + base.OnShown(e); + + this.DialogResult = System.Windows.Forms.DialogResult.None; + + textBox1.InnerTextBox.Focus(); + } + + + [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public MainForm ParentForm { get; protected set; } = null; + + [Browsable(false)] + public string Password => textBox1.Text; + + + private void textBox1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) + { + switch (e.KeyCode) + { + case Keys.Enter: + button1_Click(null, null); + break; + case Keys.Escape: + this.Close(); + break; + default: break; + } + } + + private void button1_Click(object sender, EventArgs e) + { + this.DialogResult = System.Windows.Forms.DialogResult.OK; + this.Close(); + } + + } +} \ No newline at end of file diff --git a/PasswordForm.resx b/PasswordForm.resx new file mode 100644 index 0000000..f298a7b --- /dev/null +++ b/PasswordForm.resx @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Program.cs b/Program.cs new file mode 100644 index 0000000..71f4564 --- /dev/null +++ b/Program.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace FizzyLauncher +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.SetHighDpiMode(HighDpiMode.SystemAware); + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new MainForm()); + } + } +} diff --git a/Properties/PublishProfiles/Release x64.pubxml b/Properties/PublishProfiles/Release x64.pubxml new file mode 100644 index 0000000..23a6044 --- /dev/null +++ b/Properties/PublishProfiles/Release x64.pubxml @@ -0,0 +1,17 @@ + + + + + Release + Any CPU + bin\Release\64\ + FileSystem + net5.0-windows + win-x64 + false + True + False + + \ No newline at end of file diff --git a/Properties/PublishProfiles/Release x86.pubxml b/Properties/PublishProfiles/Release x86.pubxml new file mode 100644 index 0000000..56c7547 --- /dev/null +++ b/Properties/PublishProfiles/Release x86.pubxml @@ -0,0 +1,17 @@ + + + + + Release + Any CPU + bin\Release\86\ + FileSystem + net5.0-windows + win-x86 + false + True + False + + \ No newline at end of file diff --git a/Resources/UI/arrow_down.png b/Resources/UI/arrow_down.png new file mode 100644 index 0000000..cccf233 Binary files /dev/null and b/Resources/UI/arrow_down.png differ diff --git a/Resources/UI/arrow_down2.png b/Resources/UI/arrow_down2.png new file mode 100644 index 0000000..5b0b115 Binary files /dev/null and b/Resources/UI/arrow_down2.png differ diff --git a/Resources/UI/arrow_up.png b/Resources/UI/arrow_up.png new file mode 100644 index 0000000..a08438b Binary files /dev/null and b/Resources/UI/arrow_up.png differ diff --git a/Resources/UI/arrow_up2.png b/Resources/UI/arrow_up2.png new file mode 100644 index 0000000..07c1797 Binary files /dev/null and b/Resources/UI/arrow_up2.png differ diff --git a/Resources/UI/circle_menu.png b/Resources/UI/circle_menu.png new file mode 100644 index 0000000..0ff2962 Binary files /dev/null and b/Resources/UI/circle_menu.png differ diff --git a/Resources/UI/circle_menu2.png b/Resources/UI/circle_menu2.png new file mode 100644 index 0000000..2338c18 Binary files /dev/null and b/Resources/UI/circle_menu2.png differ diff --git a/Resources/UI/close.png b/Resources/UI/close.png new file mode 100644 index 0000000..25fc632 Binary files /dev/null and b/Resources/UI/close.png differ diff --git a/Resources/UI/close2.png b/Resources/UI/close2.png new file mode 100644 index 0000000..c02cdf0 Binary files /dev/null and b/Resources/UI/close2.png differ diff --git a/Resources/UI/cog.png b/Resources/UI/cog.png new file mode 100644 index 0000000..7a63c8f Binary files /dev/null and b/Resources/UI/cog.png differ diff --git a/Resources/UI/cog2.png b/Resources/UI/cog2.png new file mode 100644 index 0000000..d40221f Binary files /dev/null and b/Resources/UI/cog2.png differ diff --git a/Resources/UI/disk.png b/Resources/UI/disk.png new file mode 100644 index 0000000..7355b96 Binary files /dev/null and b/Resources/UI/disk.png differ diff --git a/Resources/UI/disk2.png b/Resources/UI/disk2.png new file mode 100644 index 0000000..29b59a4 Binary files /dev/null and b/Resources/UI/disk2.png differ diff --git a/Resources/UI/edit.png b/Resources/UI/edit.png new file mode 100644 index 0000000..031e3f6 Binary files /dev/null and b/Resources/UI/edit.png differ diff --git a/Resources/UI/edit2.png b/Resources/UI/edit2.png new file mode 100644 index 0000000..b9e93ab Binary files /dev/null and b/Resources/UI/edit2.png differ diff --git a/Resources/UI/file.png b/Resources/UI/file.png new file mode 100644 index 0000000..d0c9e58 Binary files /dev/null and b/Resources/UI/file.png differ diff --git a/Resources/UI/file2.png b/Resources/UI/file2.png new file mode 100644 index 0000000..f3e9f6d Binary files /dev/null and b/Resources/UI/file2.png differ diff --git a/Resources/UI/folder.png b/Resources/UI/folder.png new file mode 100644 index 0000000..a97c4e0 Binary files /dev/null and b/Resources/UI/folder.png differ diff --git a/Resources/UI/folder2.png b/Resources/UI/folder2.png new file mode 100644 index 0000000..d21178a Binary files /dev/null and b/Resources/UI/folder2.png differ diff --git a/Resources/UI/help.png b/Resources/UI/help.png new file mode 100644 index 0000000..88b4864 Binary files /dev/null and b/Resources/UI/help.png differ diff --git a/Resources/UI/help2.png b/Resources/UI/help2.png new file mode 100644 index 0000000..ae6856d Binary files /dev/null and b/Resources/UI/help2.png differ diff --git a/Resources/UI/icons.svg b/Resources/UI/icons.svg new file mode 100644 index 0000000..fc6bf20 --- /dev/null +++ b/Resources/UI/icons.svg @@ -0,0 +1,603 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Resources/UI/menu.png b/Resources/UI/menu.png new file mode 100644 index 0000000..9c63469 Binary files /dev/null and b/Resources/UI/menu.png differ diff --git a/Resources/UI/menu2.png b/Resources/UI/menu2.png new file mode 100644 index 0000000..2530762 Binary files /dev/null and b/Resources/UI/menu2.png differ diff --git a/Resources/UI/minus.png b/Resources/UI/minus.png new file mode 100644 index 0000000..6b396d4 Binary files /dev/null and b/Resources/UI/minus.png differ diff --git a/Resources/UI/minus2.png b/Resources/UI/minus2.png new file mode 100644 index 0000000..9bb4128 Binary files /dev/null and b/Resources/UI/minus2.png differ diff --git a/Resources/UI/pencil_line.png b/Resources/UI/pencil_line.png new file mode 100644 index 0000000..a359edd Binary files /dev/null and b/Resources/UI/pencil_line.png differ diff --git a/Resources/UI/pencil_line2.png b/Resources/UI/pencil_line2.png new file mode 100644 index 0000000..9c30d39 Binary files /dev/null and b/Resources/UI/pencil_line2.png differ diff --git a/Resources/UI/plus.png b/Resources/UI/plus.png new file mode 100644 index 0000000..f63ace9 Binary files /dev/null and b/Resources/UI/plus.png differ diff --git a/Resources/UI/plus2.png b/Resources/UI/plus2.png new file mode 100644 index 0000000..0c29081 Binary files /dev/null and b/Resources/UI/plus2.png differ diff --git a/Resources/UI/trash.png b/Resources/UI/trash.png new file mode 100644 index 0000000..55e6552 Binary files /dev/null and b/Resources/UI/trash.png differ diff --git a/Resources/UI/trash2.png b/Resources/UI/trash2.png new file mode 100644 index 0000000..1ae8d43 Binary files /dev/null and b/Resources/UI/trash2.png differ diff --git a/Resources/file-text.png b/Resources/file-text.png new file mode 100644 index 0000000..4772be9 Binary files /dev/null and b/Resources/file-text.png differ diff --git a/Resources/folder.png b/Resources/folder.png new file mode 100644 index 0000000..d3ea8ab Binary files /dev/null and b/Resources/folder.png differ diff --git a/Resources/folder_32.png b/Resources/folder_32.png new file mode 100644 index 0000000..832fd3c Binary files /dev/null and b/Resources/folder_32.png differ diff --git a/Resources/folder_explore.png b/Resources/folder_explore.png new file mode 100644 index 0000000..6fdc0bb Binary files /dev/null and b/Resources/folder_explore.png differ diff --git a/Resources/hexagon.png b/Resources/hexagon.png new file mode 100644 index 0000000..01e6fdb Binary files /dev/null and b/Resources/hexagon.png differ diff --git a/Resources/toggle-left-ea-16.png b/Resources/toggle-left-ea-16.png new file mode 100644 index 0000000..e7895fd Binary files /dev/null and b/Resources/toggle-left-ea-16.png differ diff --git a/Resources/toggle-right-ea-16.png b/Resources/toggle-right-ea-16.png new file mode 100644 index 0000000..aedd7c2 Binary files /dev/null and b/Resources/toggle-right-ea-16.png differ diff --git a/RyzStudio/Data/SQLite/SQLiteDatabase.cs b/RyzStudio/Data/SQLite/SQLiteDatabase.cs new file mode 100644 index 0000000..2ebab58 --- /dev/null +++ b/RyzStudio/Data/SQLite/SQLiteDatabase.cs @@ -0,0 +1,444 @@ +using System; +using System.ComponentModel; +using System.Data; +using System.IO; + +namespace RyzStudio.Data.SQLite +{ + public class SQLiteDatabase + { + #region static methods + + public static string escapeSQL(string query) + { + return query.Replace("'", "''").Trim(); + } + + public static string escapeValue(string text) + { + return text.Replace("\"", "\\\"").Replace("\t", "\\t").Replace("\r", " \\r").Replace("\n", "\\n"); + } + + public static string PrepareQuery(string query, params string[] arguments) + { + string rv = query; + + if (string.IsNullOrEmpty(rv)) + { + return string.Empty; + } + + for (int i = 0; i < arguments.Length; i++) + { + rv = rv.Replace("[^" + (i + 1).ToString() + "]", escapeSQL(arguments[i])); + } + + return rv; + } + + #endregion + + protected SQLiteWrapper.SQLiteBase database = null; + protected string databaseLocation = ":memory:"; + protected string lastError = ""; + + protected string[] requiredTableList = new string[0]; + + protected const string tableNameConfig = "ryz_app_xxxx_config"; + + #region public properties + + [Browsable(false)] + public SQLiteWrapper.SQLiteBase Database + { + get { return database; } + set { database = value; } + } + + [Browsable(false)] + public string DatabaseLocation + { + get { return databaseLocation; } + set { databaseLocation = value; } + } + + [Browsable(false)] + public string LastError + { + get { return lastError; } + } + + [Browsable(false)] + public int LastInsertID + { + get + { + if (database == null) + { + return 0; + } + + DataTable dt = this.DoQuery("SELECT last_insert_rowid() AS ccc;"); + if (dt == null) + { + return 0; + } + + if (dt.Rows.Count <= 0) + { + return 0; + } + + return int.Parse(dt.Rows[0]["ccc"].ToString()); + } + } + + #endregion + + #region public methods + + public bool Create(bool use_memory = true) + { + lastError = string.Empty; + + if (string.IsNullOrEmpty(databaseLocation)) + { + return false; + } + + try + { + if (database != null) + { + database.CloseDatabase(); + } + + database = new SQLiteWrapper.SQLiteBase(((use_memory) ? ":memory:" : databaseLocation)); + } + catch (Exception exc) + { + lastError = exc.Message; + return false; + } + + bool rv = Prepare(); + if (!rv) + { + return false; + } + + return CheckRequiredTables(); + } + + public bool Create(string filename, bool override_file = false) + { + lastError = string.Empty; + databaseLocation = filename; + + if (string.IsNullOrEmpty(databaseLocation)) + { + return false; + } + + if (File.Exists(databaseLocation) && override_file) + { + try + { + File.Delete(databaseLocation); + } + catch (Exception xc) + { + lastError = xc.Message; + return false; + } + } + + try + { + if (database != null) + { + database.CloseDatabase(); + } + + database = new SQLiteWrapper.SQLiteBase(databaseLocation); + } + catch (Exception exc) + { + lastError = exc.Message; + return false; + } + + bool rv = CheckRequiredTables(); + if (!rv) + { + Prepare(); + } + + return CheckRequiredTables(); + } + + public bool Load(string filename) + { + if (!File.Exists(filename)) + { + return false; + } + + lastError = string.Empty; + databaseLocation = filename; + + try + { + if (database != null) + { + database.CloseDatabase(); + } + + database = new SQLiteWrapper.SQLiteBase(databaseLocation); + } + catch (Exception exc) + { + lastError = exc.Message; + return false; + } + + return CheckRequiredTables(); + } + + public void Close() + { + if (database != null) + { + database.CloseDatabase(); + } + } + + + public DataTable DoQuery(string query) + { + lastError = string.Empty; + if (database == null) + { + return null; + } + + try + { + return database.ExecuteQuery(query); + } + catch (Exception exc) + { + lastError = exc.Message; + return null; + } + } + + public DataTable DoQuery(string query, params string[] args) + { + string sql = SQLiteDatabase.PrepareQuery(query, args); + + return DoQuery(sql); + } + + public bool DoNonQuery(string query) + { + lastError = string.Empty; + if (database == null) + { + return false; + } + + try + { + database.ExecuteNonQuery(query); + return true; + } + catch (Exception exc) + { + lastError = exc.Message; + return false; + } + } + + public bool DoNonQuery(string query, params string[] args) + { + string sql = SQLiteDatabase.PrepareQuery(query, args); + + return DoNonQuery(sql); + } + + public string DoQuerySingle(string query) + { + lastError = string.Empty; + if (database == null) + { + return string.Empty; + } + + DataTable tbl = DoQuery(query); + + if (tbl == null) + { + return string.Empty; + } + + if (tbl.Columns.Count <= 0) + { + return string.Empty; + } + + if (tbl.Rows.Count <= 0) + { + return string.Empty; + } + + return tbl.Rows[0][0].ToString(); + } + + public string DoQuerySingle(string query, params string[] args) + { + string sql = SQLiteDatabase.PrepareQuery(query, args); + + return DoQuerySingle(sql); + } + + public int DoQueryCount(string query) + { + if (database == null) + { + return -1; + } + + DataTable tbl = DoQuery(query); + + if (tbl == null) + { + return -1; + } + + if (tbl.Rows.Count <= 0) + { + return 0; + } + + return tbl.Rows.Count; + } + + public int DoQueryCount(string query, params string[] args) + { + string sql = SQLiteDatabase.PrepareQuery(query, args); + + return DoQueryCount(sql); + } + + public bool DoQueryExist(string query) + { + int rv = DoQueryCount(query); + + return (rv > 0); + } + + public bool DoQueryExist(string query, params string[] args) + { + string sql = SQLiteDatabase.PrepareQuery(query, args); + + return DoQueryExist(sql); + } + + public bool HasTable(string table_name) + { + lastError = string.Empty; + if (database == null) + { + return false; + } + + int rv = this.DoQueryCount("SELECT 1 FROM sqlite_master WHERE type='table' AND name='" + escapeSQL(table_name) + "'"); + + return (rv > 0); + } + + public bool CheckRequiredTables() + { + bool rv = true; + foreach (string tbl in requiredTableList) + { + if (string.IsNullOrEmpty(tbl)) + { + continue; + } + + if (!this.HasTable(tbl)) + { + rv = false; + break; + } + } + + return rv; + } + + + protected bool PrepareConfig() + { + if (HasTable(tableNameConfig)) + { + return true; + } + + bool rv = this.DoNonQuery(@" + BEGIN TRANSACTION; + CREATE TABLE " + tableNameConfig + @" (cfg_name TEXT, cfg_value TEXT); + COMMIT; + "); + + return rv; + } + + public bool SetConfig(string name, string value) + { + if (!PrepareConfig()) + { + return false; + } + + string sql = string.Empty; + int rv = this.DoQueryCount("SELECT 1 FROM " + tableNameConfig + " WHERE cfg_name='" + escapeSQL(name) + "'"); + if (rv <= 0) + { + sql = "INSERT INTO " + tableNameConfig + " (cfg_name, cfg_value) VALUES ('[^1]', '[^2]');"; + } + else + { + sql = "UPDATE " + tableNameConfig + " SET cfg_value='[^2]' WHERE cfg_name='[^1]';"; + } + + sql = PrepareQuery(sql, new string[] { name, value }); + + return this.DoNonQuery(sql); + } + + public string GetConfig(string name, string default_value = "") + { + if (!PrepareConfig()) + { + return default_value; + } + + bool rv = this.DoQueryExist("SELECT 1 FROM " + tableNameConfig + " WHERE cfg_name='" + escapeSQL(name) + "'"); + if (!rv) + { + return default_value; + } + + return this.DoQuerySingle("SELECT cfg_value FROM " + tableNameConfig + " WHERE cfg_name='" + escapeSQL(name) + "'"); + } + + #endregion + + protected virtual bool Prepare() + { + return true; + } + } +} \ No newline at end of file diff --git a/RyzStudio/Drawing/Rectangoid.cs b/RyzStudio/Drawing/Rectangoid.cs new file mode 100644 index 0000000..59a24d8 --- /dev/null +++ b/RyzStudio/Drawing/Rectangoid.cs @@ -0,0 +1,124 @@ +using System.Drawing; +using System.Drawing.Drawing2D; + +namespace RyzStudio.Drawing +{ + public struct Rectangoid + { + private int X; + private int Y; + private int Width; + private int Height; + private int Radius; + + public Rectangoid(Rectangle rect, int radius) + { + X = rect.X; + Y = rect.Y; + Width = rect.Width; + Height = rect.Height; + Radius = radius; + } + + public Rectangoid(Rectangle rect, int radius, int borderWidth) + { + rect.Inflate((-1 * borderWidth), (-1 * borderWidth)); + + X = rect.X; + Y = rect.Y; + Width = rect.Width; + Height = rect.Height; + Radius = radius; + } + + public Rectangoid(int x, int y, int width, int height, int radius) + { + X = x; + Y = y; + Width = width; + Height = height; + Radius = radius; + } + + public Rectangoid(int x, int y, int width, int height) + { + X = x; + Y = y; + Width = width; + Height = height; + Radius = 0; + } + + public Rectangoid(int width, int height, int radius) + { + X = 0; + Y = 0; + Width = width; + Height = height; + Radius = radius; + } + + public Rectangoid(int width, int height) + { + X = 0; + Y = 0; + Width = width; + Height = height; + Radius = 0; + } + + public Rectangoid(int width) + { + X = 0; + Y = 0; + Width = width; + Height = width; + Radius = 0; + } + + public GraphicsPath ToGraphicsPath() + { + GraphicsPath rv = new GraphicsPath(); + rv.AddLine(X + this.Radius, Y, X + Width - (this.Radius * 2), Y); + + if (this.Radius > 0) + { + rv.AddArc(X + Width - (this.Radius * 2), Y, this.Radius * 2, this.Radius * 2, 270, 90); + } + + rv.AddLine(X + Width, Y + this.Radius, X + Width, Y + Height - (this.Radius * 2)); + + if (this.Radius > 0) + { + rv.AddArc(X + Width - (this.Radius * 2), Y + Height - (this.Radius * 2), this.Radius * 2, this.Radius * 2, 0, 90); + } + + rv.AddLine(X + Width - (this.Radius * 2), Y + Height, X + this.Radius, Y + Height); + + if (this.Radius > 0) + { + rv.AddArc(X, Y + Height - (this.Radius * 2), this.Radius * 2, this.Radius * 2, 90, 90); + } + + rv.AddLine(X, Y + Height - (this.Radius * 2), X, Y + this.Radius); + + if (this.Radius > 0) + { + rv.AddArc(X, Y, this.Radius * 2, this.Radius * 2, 180, 90); + } + + rv.CloseFigure(); + + return rv; + } + + public PointF GetOrigin() + { + PointF rv = new PointF(); + rv.X = ((float)Width / 2) + X; + rv.Y = ((float)Height / 2) + Y; + + return rv; + } + } +} \ No newline at end of file diff --git a/RyzStudio/IO/FileType.cs b/RyzStudio/IO/FileType.cs new file mode 100644 index 0000000..3c8b616 --- /dev/null +++ b/RyzStudio/IO/FileType.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace RyzStudio.IO +{ + public class FileType + { + protected static readonly byte[] BMP = { 66, 77 }; + protected static readonly byte[] GIF = { 71, 73, 70, 56 }; + protected static readonly byte[] ICO = { 0, 0, 1, 0 }; + protected static readonly byte[] JPG = { 255, 216, 255 }; + protected static readonly byte[] PNG = { 137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82 }; + + public static bool IsImage(byte[] byteArray) + { + if (byteArray == null) + { + return false; + } + + if (byteArray.Length <= 0) + { + return false; + } + + if (byteArray.Take(2).SequenceEqual(BMP)) + { + return true; + } + + if (byteArray.Take(4).SequenceEqual(GIF)) + { + return true; + } + + if (byteArray.Take(4).SequenceEqual(ICO)) + { + return true; + } + + if (byteArray.Take(3).SequenceEqual(JPG)) + { + return true; + } + + if (byteArray.Take(16).SequenceEqual(PNG)) + { + return true; + } + + return false; + } + } +} diff --git a/RyzStudio/IO/SessionFileFormatBase.cs b/RyzStudio/IO/SessionFileFormatBase.cs new file mode 100644 index 0000000..3ae2887 --- /dev/null +++ b/RyzStudio/IO/SessionFileFormatBase.cs @@ -0,0 +1,290 @@ +using System; +using System.IO; +using System.Text; +using System.Xml; +using System.Windows.Forms; +using ICSharpCode.SharpZipLib.Zip; + +namespace RyzStudio.IO +{ + public abstract class SessionFileFormatBase + { + protected string CONST_KEYPASS = ""; + protected string CONST_PRODUCT = ""; + protected string CONST_STREAM_FILE_NAME = ""; + + protected bool enableErrorReporting = false; + protected string lastUsedFileName = ""; + + #region public properties + + public string passkey + { + get { return CONST_KEYPASS; } + set { CONST_KEYPASS = value; } + } + + /*public string LastFilename + { + get { return lastUsedFileName; } + set { lastUsedFileName = value; } + }*/ + + #endregion + + #region public methods + +/* public bool loadFromRyz() + { + return loadFromRyz(lastUsedFileName); + }*/ + + public bool loadFromRyz(string file_name) + { + lastUsedFileName = file_name; + if (!File.Exists(file_name)) + { + return false; + } + + bool rv = false; + + try + { + ZipInputStream zipIn = new ZipInputStream(File.OpenRead(file_name)); + zipIn.Password = CONST_KEYPASS; + ZipEntry theEntry = null; + + while ((theEntry = zipIn.GetNextEntry()) != null) + { + string streamFileName = Path.GetFileName(theEntry.Name); + if (streamFileName.Equals(CONST_STREAM_FILE_NAME)) + { + MemoryStream oxStream = new MemoryStream(); + StreamWriter streamWriter = new StreamWriter(oxStream); + int size = 2048; + byte[] data = new byte[size]; + while (true) + { + size = zipIn.Read(data, 0, data.Length); + if (size <= 0) break; + streamWriter.BaseStream.Write(data, 0, size); + } + + oxStream.Position = 0; + + StreamReader sr2 = new StreamReader(oxStream, Encoding.UTF8); + XmlDocument xDoc = new XmlDocument(); + xDoc.LoadXml(sr2.ReadToEnd()); + + loadFromXmlDocument(ref xDoc); + } + } + + zipIn.Close(); + + rv = true; + } + catch (Exception exc) + { + if (enableErrorReporting) + { + MessageBox.Show(exc.Message); + } + } + + return rv; + } + + public bool loadFromXml() + { + return loadFromXml(lastUsedFileName); + } + + public bool loadFromXml(string file_name) + { + lastUsedFileName = file_name; + if (!File.Exists(file_name)) + { + return false; + } + + bool rv = false; + + try + { + StreamReader sr2 = new StreamReader(file_name, Encoding.UTF8); + XmlDocument xDoc = new XmlDocument(); + xDoc.LoadXml(sr2.ReadToEnd()); + + loadFromXmlDocument(ref xDoc); + sr2.Close(); + + rv = true; + } + catch (Exception exc) + { + if (enableErrorReporting) + { + MessageBox.Show(exc.Message); + } + } + + return rv; + } + +/* public bool saveToRyz() + { + return saveToRyz(lastUsedFileName); + } +*/ + + public bool saveToRyz(string file_name) + { + bool rv = false; + lastUsedFileName = file_name; + byte[] buffer = new byte[4096]; + + try + { + File.Delete(file_name); + FileInfo fileinfo1 = new FileInfo(file_name); + if (!Directory.Exists(fileinfo1.DirectoryName)) + { + Directory.CreateDirectory(fileinfo1.DirectoryName); + } + } + catch (Exception exc) + { + if (enableErrorReporting) + { + MessageBox.Show(exc.Message); + } + } + + try + { + ZipOutputStream zipOutStream1 = new ZipOutputStream(File.Create(file_name)); + zipOutStream1.SetLevel(9); + zipOutStream1.Password = CONST_KEYPASS; + + MemoryStream oxIndexStream = new MemoryStream(); + XmlTextWriter oxTW = new XmlTextWriter(oxIndexStream, Encoding.UTF8); + saveToXmlTextWriter(ref oxTW); + oxTW.Flush(); + + // write to file + zipOutStream1.PutNextEntry(new ZipEntry(CONST_STREAM_FILE_NAME)); + oxIndexStream.Position = 0; + StreamReader sr2 = new StreamReader(oxIndexStream, Encoding.UTF8); + int sourceBytes; + do + { + sourceBytes = sr2.BaseStream.Read(buffer, 0, buffer.Length); + zipOutStream1.Write(buffer, 0, sourceBytes); + } + while (sourceBytes > 0); + + sr2.Close(); + oxTW.Close(); + zipOutStream1.Finish(); + zipOutStream1.Close(); + + rv = true; + } + catch (Exception exc) + { + if (enableErrorReporting) + { + MessageBox.Show(exc.Message); + } + } + + return rv; + } + + public bool saveToXml() + { + return saveToXml(lastUsedFileName); + } + + public bool saveToXml(string file_name) + { + bool rv = false; + + lastUsedFileName = file_name; + try + { + File.Delete(file_name); + FileInfo fileinfo1 = new FileInfo(file_name); + if (!Directory.Exists(fileinfo1.DirectoryName)) + { + Directory.CreateDirectory(fileinfo1.DirectoryName); + } + } + catch (Exception exc) + { + if (enableErrorReporting) + { + MessageBox.Show(exc.Message); + } + } + + try + { + XmlTextWriter oxTW = new XmlTextWriter(file_name, Encoding.UTF8); + saveToXmlTextWriter(ref oxTW); + oxTW.Flush(); + oxTW.Close(); + + rv = true; + } + catch (Exception exc) + { + if (enableErrorReporting) + { + MessageBox.Show(exc.Message); + } + } + + return rv; + } + + #endregion + + protected virtual void loadFromXmlDocument(ref XmlDocument xml_doc) { } + protected virtual void saveToXmlTextWriter(ref XmlTextWriter writer) { } + + #region public methods (conversions) + + public int[] convIntArrayString(string s1, char c) + { + string[] sarr = s1.Split(c); + int[] iarr = new int[sarr.Length]; + for (int i = 0; i < sarr.Length; i++) + { + iarr[i] = Int32.Parse(sarr[i]); + } + + return iarr; + } + + public string convStringIntArray(int[] r, char s) + { + string t = null; + for (int i = 0; i < r.Length; i++) + { + if (i != 0) + { + t += s.ToString(); + } + + t += r[i].ToString(); + } + + return t; + } + +#endregion + } +} \ No newline at end of file diff --git a/RyzStudio/IO/SharpZipLib.cs b/RyzStudio/IO/SharpZipLib.cs new file mode 100644 index 0000000..33729b8 --- /dev/null +++ b/RyzStudio/IO/SharpZipLib.cs @@ -0,0 +1,241 @@ +using System; +using System.IO; +using ICSharpCode.SharpZipLib.Zip; + +namespace RyzStudio.IO +{ + public class SharpZipLib + { + + + public static bool IsZipEncrypted(string filename) + { + bool rv = false; + + try + { + ZipInputStream readStream = new ZipInputStream(System.IO.File.OpenRead(filename)); + + ZipEntry theEntry = null; + while ((theEntry = readStream.GetNextEntry()) != null) + { + if (theEntry.IsCrypted) + { + rv = true; + } + + break; + } + + readStream.Close(); + readStream.Dispose(); + readStream = null; + } + catch + { + // do nothing + } + + return rv; + } + + //public static void AddFile(ZipOutputStream zipStream, string filename, string prefixPath = null) + //{ + // byte[] buffer = new byte[4096]; + + // string f1 = ""; + // if (prefixPath != null) + // { + // f1 = Path.GetDirectoryName(filename).TrimEnd('\\') + "\\"; + // f1 = f1.Replace(prefixPath, "").TrimEnd('\\') + "\\"; + // f1 = f1 + Path.GetFileName(filename); + // f1 = f1.TrimStart('\\'); + // } + + // ZipEntry entry = new ZipEntry(f1); + // entry.DateTime = DateTime.Now; + + // zipStream.PutNextEntry(entry); + + // FileStream fs = File.OpenRead(filename); + + // int sourceBytes; + + // do + // { + // sourceBytes = fs.Read(buffer, 0, buffer.Length); + // zipStream.Write(buffer, 0, sourceBytes); + // } + // while (sourceBytes > 0); + //} + + //public static void AddFolder(ZipOutputStream zipstream, string folderpath, string prefixpath = null) + //{ + // foreach (string fn in Directory.GetFiles(folderpath, "*.*", System.IO.SearchOption.AllDirectories)) + // { + // AddFile(zipstream, fn, prefixpath); + // } + //} + + public static string ReadSingle(string filename, string password, string entryFilename) + { + string rv = null; + + int size = 2048; + byte[] buffer = new byte[size]; + int bufferSize = 0; + + ZipEntry readEntry = null; + + try + { + ZipInputStream readStream = new ZipInputStream(File.OpenRead(filename)); + readStream.Password = password; + + while (true) + { + readEntry = readStream.GetNextEntry(); + if (readEntry == null) + { + break; + } + + if (string.IsNullOrWhiteSpace(readEntry.Name)) + { + continue; + } + + if (!readEntry.IsFile) + { + continue; + } + + if (!readEntry.Name.Equals(entryFilename)) + { + continue; + } + + MemoryStream ms = new MemoryStream(); + buffer = new byte[size]; + bufferSize = 0; + + do + { + bufferSize = readStream.Read(buffer, 0, buffer.Length); + ms.Write(buffer, 0, bufferSize); + } + while (bufferSize > 0); + + ms.Position = 0; + + StreamReader sr = new StreamReader(ms); + rv = sr.ReadToEnd(); + + break; + } + + readStream.Flush(); + readStream.Close(); + readStream.Dispose(); + readStream = null; + } + catch (Exception) + { + return rv; + } + + return rv; + } + + public static bool TestArchive(string filename, string password = null) + { + if (string.IsNullOrWhiteSpace(filename)) + { + return false; + } + + if (!File.Exists(filename)) + { + return false; + } + + ZipEntry readEntry = null; + + try + { + ZipInputStream readStream = new ZipInputStream(System.IO.File.OpenRead(filename)); + readStream.Password = password; + + while (true) + { + readEntry = readStream.GetNextEntry(); + if (readEntry == null) + { + break; + } + + //break; + } + + readStream.Close(); + readStream.Dispose(); + readStream = null; + } + catch (Exception) + { + return false; + } + + return true; + } + + public static bool CreateSingle(string filename, string password, string entryFilename, string content) + { + int size = 2048; + byte[] buffer = new byte[size]; + int bufferSize = 0; + + try + { + ZipOutputStream zipStream = new ZipOutputStream(File.Create(filename)); + zipStream.SetLevel(9); + zipStream.Password = password; + + // stream + MemoryStream ms = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(content)); + ms.Position = 0; + + // write file entry + zipStream.PutNextEntry(new ZipEntry(entryFilename)); + + buffer = new byte[size]; + bufferSize = 0; + + do + { + bufferSize = ms.Read(buffer, 0, buffer.Length); + zipStream.Write(buffer, 0, bufferSize); + } + while (bufferSize > 0); + + ms.Flush(); + ms.Close(); + ms.Dispose(); + ms = null; + + zipStream.Finish(); + zipStream.Flush(); + zipStream.Close(); + zipStream.Dispose(); + zipStream = null; + } + catch (Exception) + { + return false; + } + + return true; + } + + } +} \ No newline at end of file diff --git a/RyzStudio/Net/HttpWeb.cs b/RyzStudio/Net/HttpWeb.cs new file mode 100644 index 0000000..bafff2e --- /dev/null +++ b/RyzStudio/Net/HttpWeb.cs @@ -0,0 +1,168 @@ +using System; +using System.IO; +using System.Net; +using System.Text; +using System.Windows.Forms; + +namespace RyzStudio.Net +{ + public class HttpWeb + { + public string defaultUserAgent = "Momozilla/5.0 (" + Environment.OSVersion.Platform.ToString() + " ; " + Environment.OSVersion.VersionString + "; " + Application.CurrentCulture.TwoLetterISOLanguageName + ")"; + public int defaultTimeout = 6000; + public int defaultMaxRedirect = 8; + public bool defaultAllowRedirect = true; + public CookieContainer defaultCookierContainer = null; + + public HttpWeb() + { + } + + public HttpWebRequest CreateRequest(string url) + { + return this.CreateRequest(url, url); + } + + public HttpWebRequest CreateRequest(string url, string referrerURL) + { + if (defaultCookierContainer == null) + { + defaultCookierContainer = new CookieContainer(); + } + + HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url); + webRequest.CachePolicy = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.NoCacheNoStore); + webRequest.MaximumAutomaticRedirections = defaultMaxRedirect; + webRequest.CookieContainer = defaultCookierContainer; + webRequest.UserAgent = defaultUserAgent; + webRequest.AllowAutoRedirect = defaultAllowRedirect; + webRequest.Timeout = defaultTimeout; + + return webRequest; + } + + public int GetResponse(out string sourceCode, string url, string referrerURL = "") + { + HttpWebRequest webRequest = this.CreateRequest(url, referrerURL); + + return GetResponse(out sourceCode, webRequest); + } + + public int GetResponse(out string sourceCode, HttpWebRequest webRequest) + { + sourceCode = string.Empty; + + int rv = 0; + + try + { + HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse(); + + rv = (int)webResponse.StatusCode; + + StreamReader readContent = new StreamReader(webResponse.GetResponseStream()); + sourceCode = readContent.ReadToEnd(); + + webResponse.Close(); + webResponse = null; + } + catch (WebException xc) + { + if (xc.Response is HttpWebResponse) + { + HttpWebResponse rs = xc.Response as HttpWebResponse; + StreamReader readContent = new StreamReader(rs.GetResponseStream()); + if (readContent != null) + { + sourceCode = readContent.ReadToEnd(); + } + + rv = (int)rs.StatusCode; + } + else + { + rv = (int)xc.Status; + sourceCode = xc.Message; + } + } + catch (Exception xc) + { + sourceCode = xc.Message; + } + + return rv; + } + + public static HttpWebRequest AddBasicAuthentication(HttpWebRequest webRequest, string username, string password) + { + webRequest.Headers["Authorization"] = "Basic " + Convert.ToBase64String(Encoding.Default.GetBytes(string.Concat(username, ":", password))); + webRequest.PreAuthenticate = true; + + return webRequest; + } + + + public int GetPOSTResponse(out string sourceCode, HttpWebRequest webRequest, string postData) + { + sourceCode = ""; + int rv = 0; + byte[] buffer = Encoding.UTF8.GetBytes(postData); + + webRequest.ContentLength = buffer.Length; + + try + { + Stream dataStream = webRequest.GetRequestStream(); + dataStream.Write(buffer, 0, buffer.Length); + dataStream.Close(); + } + catch (Exception xc) + { + sourceCode = xc.Message; + return rv; + } + + return this.GetResponse(out sourceCode, webRequest); + } + + public int GetHeader(out WebHeaderCollection headerCollection, string url, string referrerURL = "") + { + headerCollection = null; + + int rv = 0; + + HttpWebRequest webRequest = this.CreateRequest(url, referrerURL); + webRequest.Method = "HEAD"; + + try + { + HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse(); + headerCollection = webResponse.Headers; + + rv = (int)webResponse.StatusCode; + + webResponse.Close(); + webResponse = null; + } + catch (WebException xc) + { + if (xc.Response is HttpWebResponse) + { + HttpWebResponse rs = xc.Response as HttpWebResponse; + + rv = (int)rs.StatusCode; + } + else + { + rv = (int)xc.Status; + } + } + catch + { + // do nothing + } + + return rv; + } + } +} \ No newline at end of file diff --git a/RyzStudio/Windows/Forms/StackLayoutPanel.cs b/RyzStudio/Windows/Forms/StackLayoutPanel.cs new file mode 100644 index 0000000..8cdeae5 --- /dev/null +++ b/RyzStudio/Windows/Forms/StackLayoutPanel.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace RyzStudio.Windows.Forms +{ + public class StackLayoutPanel : FlowLayoutPanel + { + public StackLayoutPanel() : base() + { + this.AutoScroll = true; + this.FlowDirection = FlowDirection.TopDown; + this.WrapContents = false; + } + + protected override void OnResize(EventArgs eventargs) + { + base.OnResize(eventargs); + + //int w = this.ClientRectangle.Width - SystemInformation.VerticalScrollBarWidth; + int w = this.ClientRectangle.Width - 1; + + foreach (Control item in this.Controls) + { + if (item.Width != w) + { + item.Width = w; + } + } + } + + protected override void OnControlAdded(ControlEventArgs e) + { + base.OnControlAdded(e); + + OnResize(null); + } + + protected override void OnControlRemoved(ControlEventArgs e) + { + base.OnControlRemoved(e); + + OnResize(null); + } + + public void AddControl(Control value) + { + if (this.InvokeRequired) + { + this.Invoke(new MethodInvoker(() => + { + value.Margin = new Padding(0, 3, 0, 3); + + this.Controls.Add(value); + })); + } + else + { + value.Margin = new Padding(0, 3, 0, 3); + + this.Controls.Add(value); + } + } + + } +} diff --git a/RyzStudio/Windows/Forms/TFlatButton.cs b/RyzStudio/Windows/Forms/TFlatButton.cs new file mode 100644 index 0000000..b50dee0 --- /dev/null +++ b/RyzStudio/Windows/Forms/TFlatButton.cs @@ -0,0 +1,115 @@ +using System.Drawing; +using System.Windows.Forms; + +namespace RyzStudio.Windows.Forms +{ + public class TFlatButton : Label + { + public class ButtonStyle + { + public Color BackColour { get; set; } = Color.Transparent; + public Color PenColour { get; set; } = Color.Transparent; + } + + public enum FlatButtonState + { + Idle = 0, + Hover, + Down + } + + protected FlatButtonState controlState = FlatButtonState.Idle; + + public TFlatButton() : base() + { + this.AutoSize = false; + this.ImageAlign = ContentAlignment.MiddleCenter; + this.TextAlign = ContentAlignment.MiddleCenter; + + // customise + this.StyleOver = new ButtonStyle() + { + BackColour = Color.FromArgb(51, 51, 51), + PenColour = Color.White + }; + this.StyleDown = new ButtonStyle() + { + BackColour = Color.FromArgb(179, 179, 179), + PenColour = Color.Black + }; + this.StyleDefault = new ButtonStyle() + { + BackColour = Color.White, + PenColour = Color.Black + }; + + this.VisualState = FlatButtonState.Idle; + + this.Click += delegate { this.OnClick(null); }; + this.MouseEnter += delegate { this.VisualState = FlatButtonState.Hover; }; + this.MouseLeave += delegate { this.VisualState = FlatButtonState.Idle; }; + this.MouseDown += delegate { this.VisualState = FlatButtonState.Down; }; + this.MouseUp += delegate { this.VisualState = FlatButtonState.Idle; }; + } + + protected FlatButtonState VisualState + { + get { return controlState; } + set + { + switch (value) + { + case FlatButtonState.Idle: + if (this.VisualState == FlatButtonState.Down) + { + updateButton(StyleOver); + } + else + { + updateButton(StyleDefault); + } + + break; + case FlatButtonState.Hover: + updateButton(StyleOver); + break; + case FlatButtonState.Down: + updateButton(StyleDown); + break; + default: + updateButton(StyleDefault); + break; + } + + controlState = value; + } + } + + protected void updateButton(ButtonStyle style) + { + this.ForeColor = style.PenColour; + this.BackColor = style.BackColour; + } + + protected ButtonStyle StyleOver { get; set; } = new ButtonStyle(); + + protected ButtonStyle StyleDown { get; set; } = new ButtonStyle(); + + protected ButtonStyle StyleDefault { get; set; } = new ButtonStyle(); + + public void PerformClick() + { + if (this.InvokeRequired) + { + this.Invoke(new MethodInvoker(() => { + this.OnClick(null); + })); + } + else + { + this.OnClick(null); + } + } + + } +} diff --git a/RyzStudio/Windows/Forms/TForm.cs b/RyzStudio/Windows/Forms/TForm.cs new file mode 100644 index 0000000..58ed7dc --- /dev/null +++ b/RyzStudio/Windows/Forms/TForm.cs @@ -0,0 +1,434 @@ +using System; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; +//using Resources = AppLauncher.Properties.Resources; + +namespace RyzStudio.Windows.Forms +{ + public class TForm : Form + { + //protected readonly Color borderColour = Color.FromArgb(200, 200, 200); + //protected readonly int borderWidth = 1; + + //protected readonly int resizeBorderWidth = 4; + + protected readonly Color backColour = Color.FromArgb(250, 250, 250); + + //protected readonly Color titleBackColour = Color.FromArgb(235, 234, 233); + //protected readonly Color titleBorderColour = Color.FromArgb(200, 198, 196); + //protected readonly Color titleColour = Color.FromArgb(102, 102, 102); + //protected readonly int titleBarHeight = 33; + //protected readonly bool showTitleBarLine = true; + //protected Font titleFont = null; + //protected int titleFontTop = 0; + + //protected readonly Size titleBarIconSize = new Size(48, 32); + //protected readonly int titleBarIconMargin = 0; + //protected readonly int titleBarIconMarginRight = 0; + + //protected Image appIcon = null; + //protected const int appIconLeft = 12; + //protected const int appIconRight = 6; + //protected int appIconTop = 0; + + protected bool isDragging = false; + protected Point startPosition = new Point(); + + //protected Point startWindowSize = new Point(); + + //protected bool enableMinimise { get; set; } = true; + //protected bool enableMaximise { get; set; } = true; + //protected bool enableClose { get; set; } = true; + //protected bool closeOnMinimise { get; set; } = false; + + protected bool isBusy = false; + + private IContainer components; + + public TForm() : base() + { + InitializeComponent(); + + //if (!this.DesignMode) + //{ + // this.FormBorderStyle = FormBorderStyle.None; + // this.StartPosition = FormStartPosition.Manual; + //} + + this.AutoScaleMode = AutoScaleMode.Font; + this.BackColor = backColour; + this.FormBorderStyle = FormBorderStyle.Sizable; + this.Padding = new Padding(0); + this.DoubleBuffered = true; + + this.MouseDown += new MouseEventHandler(form_MouseDown); + this.MouseMove += new MouseEventHandler(form_MouseMove); + this.MouseUp += new MouseEventHandler(form_MouseUp); + this.PreviewKeyDown += new PreviewKeyDownEventHandler(form_PreviewKeyDown); + } + + protected override void OnLoad(EventArgs e) + { + base.OnLoad(e); + + this.Text = Application.ProductName; + + //initialiseLoadComponent(); + + //if (appIcon != null) appIconTop = (int)Math.Floor((decimal)(titleBarHeight - appIcon.Height) / 2) + borderWidth; + //titleFont = new Font(this.Font.FontFamily, 10F); + //titleFontTop = (int)Math.Floor((decimal)(titleBarHeight - TextRenderer.MeasureText("#", titleFont).Height) / 2) + borderWidth; + + } + + //protected override void OnMouseClick(MouseEventArgs e) + //{ + // base.OnMouseClick(e); + + // bool isLabel = ((e.Location.X >= 0) && (e.Location.X <= this.Width) && (e.Location.Y >= 0) && (e.Location.Y <= titleBarHeight)); + + // if (e.Button == MouseButtons.Left) + // { + // if (isLabel) + // { + // // do nothing + // } + // else + // { + // // do nothing + // } + // } + // else if (e.Button == MouseButtons.Right) + // { + // if (isLabel) + // { + // if (this.TitleContextMenuStrip != null) + // { + // this.TitleContextMenuStrip.Show(this, e.Location); + // } + // } + // else + // { + // // do nothing + // } + // } + //} + + //protected override void OnPaint(PaintEventArgs e) + //{ + // base.OnPaint(e); + + // Graphics g = e.Graphics; + // Rectangle area = new Rectangle(this.DisplayRectangle.X, this.DisplayRectangle.Y, (this.DisplayRectangle.Width - borderWidth), (this.DisplayRectangle.Height - borderWidth)); + + // // border + // g.DrawRectangle(new Pen(borderColour, borderWidth), area); + + // area.Inflate((-1 * borderWidth), (-1 * borderWidth)); + + //g.FillRectangle(new SolidBrush(titleBackColour), area.X, area.Y, (area.Width + area.X), titleBarHeight); + + //if (showTitleBarLine) g.DrawLine(new Pen(titleBorderColour, 1), area.X, titleBarHeight, (area.Width + area.X), titleBarHeight); + + //if (!DesignMode) + //{ + // if (appIcon != null) g.DrawImageUnscaled(appIcon, appIconLeft, appIconTop); + + // int iconPosX = borderWidth + appIconLeft + appIconRight + ((appIcon == null) ? 0 : appIcon.Width); + // TextRenderer.DrawText(g, this.Text, titleFont, new Point(iconPosX, titleFontTop), titleColour); + //} + //} + + protected override void OnResize(EventArgs e) + { + base.OnResize(e); + + this.Invalidate(); + } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public override Color BackColor { get => base.BackColor; set => base.BackColor = backColour; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new FormBorderStyle FormBorderStyle { get => base.FormBorderStyle; set => base.FormBorderStyle = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new Padding Padding { get => base.Padding; set => base.Padding = value; } + + [Category("Appearance")] + public ContextMenuStrip TitleContextMenuStrip { get; set; } = null; + + //[Browsable(false)] + //public Image AppIcon { get; set; } = null; + + //[Browsable(false)] + //public bool IsMaximiseEnabled { get; set; } = false; + + //protected Point DefaultLocation + //{ + // get + // { + // Point newPosition = new Point(Cursor.Position.X, Cursor.Position.Y); + // newPosition.X -= (this.Width / 2); + // newPosition.Y -= (this.Height / 2); + + // newPosition.X = Math.Max(newPosition.X, Screen.PrimaryScreen.WorkingArea.Left); + // newPosition.Y = Math.Max(newPosition.Y, Screen.PrimaryScreen.WorkingArea.Top); + + // return newPosition; + // } + //} + + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(TForm)); + this.SuspendLayout(); + // + // AForm + // + this.Name = "AForm"; + this.ResumeLayout(false); + } + + private void form_MouseDown(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Left) + { + isDragging = true; + startPosition = e.Location; + //startWindowSize = new Point(this.Width, this.Height); + } + } + + private void form_MouseMove(object sender, MouseEventArgs e) + { + if (isDragging) + { + int x = (this.Location.X + (e.Location.X - startPosition.X)); + int y = (this.Location.Y + (e.Location.Y - startPosition.Y)); + + //this.Location = validateFormLocation(x, y); + this.Location = new Point(x, y); + } + } + + private void form_MouseUp(object sender, MouseEventArgs e) + { + isDragging = false; + } + + private void form_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) + { + if (e.KeyCode == Keys.Escape) + { + Application.Exit(); + } + } + + //protected virtual void initialiseLoadComponent() + //{ + // if (DesignMode) return; + + // // close + // TImageBox closeBox = generateToolbarImageBox(); + // closeBox.Image = closeBox.ImageNormal = (enableClose) ? Resources.titlebar_close : Resources.titlebar_blank; + // closeBox.ImageHover = (enableClose) ? Resources.titlebar_close3 : Resources.titlebar_blank; + // closeBox.ImageSelected = Resources.titlebar_close3; + // closeBox.MouseClick += delegate (object sender, MouseEventArgs e) + // { + // if (e.Button == MouseButtons.Left) + // { + // if (enableClose) + // { + // this.Close(); + // } + // } + // }; + // closeBox.Left = this.DisplayRectangle.Width - closeBox.Width - (titleBarIconMarginRight + borderWidth); + + // this.Controls.Add(closeBox); + + // // maximise + // TImageBox maximiseBox = generateToolbarImageBox(); + // maximiseBox.Image = maximiseBox.ImageNormal = (enableMaximise) ? Resources.titlebar_maximise : Resources.titlebar_blank; + // maximiseBox.ImageHover = (enableMaximise) ? Resources.titlebar_maximise5 : Resources.titlebar_blank; + // maximiseBox.ImageSelected = Resources.titlebar_maximise3; + // maximiseBox.MouseClick += delegate (object sender, MouseEventArgs e) + // { + // if (!(sender is TImageBox)) return; + + // TImageBox imageBox2 = (sender as TImageBox); + + // if (imageBox2 == null) return; + + // if (e.Button == MouseButtons.Left) + // { + // if (enableMaximise) + // { + // if (this.WindowState == FormWindowState.Maximized) + // { + // this.WindowState = FormWindowState.Normal; + // imageBox2.Image = imageBox2.ImageNormal = Resources.titlebar_maximise; + // } + // else + // { + // this.WindowState = FormWindowState.Maximized; + // imageBox2.Image = imageBox2.ImageNormal = Resources.titlebar_maximise5; + // } + // } + // } + // else if (e.Button == MouseButtons.Right) + // { + // this.TopMost = !this.TopMost; + + // if (this.TopMost) + // { + // imageBox2.Image = imageBox2.ImageNormal = Resources.titlebar_maximise3; + // imageBox2.ImageHover = (enableMaximise) ? Resources.titlebar_maximise5 : Resources.titlebar_maximise3; + // } + // else + // { + // imageBox2.Image = imageBox2.ImageNormal = (enableMaximise) ? Resources.titlebar_maximise : Resources.titlebar_blank; + // imageBox2.ImageHover = (enableMaximise) ? Resources.titlebar_maximise5 : Resources.titlebar_blank; + // } + // } + // }; + // maximiseBox.Left = closeBox.Left - maximiseBox.Width - titleBarIconMargin; + + // this.Controls.Add(maximiseBox); + + // // minimise + // TImageBox minimiseBox = generateToolbarImageBox(); + // minimiseBox.Image = minimiseBox.ImageNormal = (enableMinimise) ? Resources.titlebar_minimise : Resources.titlebar_blank; + // minimiseBox.ImageHover = (enableMinimise) ? Resources.titlebar_minimise5 : Resources.titlebar_blank; + // //minimiseBox.ImageSelected = null; + // minimiseBox.MouseClick += delegate (object sender, MouseEventArgs e) + // { + // if (!enableMinimise) return; + // if (e.Button != MouseButtons.Left) return; + + // if (closeOnMinimise) + // { + // this.Close(); + // } + // else + // { + // this.WindowState = FormWindowState.Minimized; + // } + // }; + // minimiseBox.Left = maximiseBox.Left - minimiseBox.Width - titleBarIconMargin; + + // this.Controls.Add(minimiseBox); + + // // resize + // UserControl uc1 = new UserControl() + // { + // Anchor = (AnchorStyles.Left | AnchorStyles.Bottom | AnchorStyles.Right), + // Height = resizeBorderWidth, + // Width = this.DisplayRectangle.Width - resizeBorderWidth, + // Left = 0, + // Top = this.DisplayRectangle.Height - resizeBorderWidth, + // BackColor = Color.Transparent, + // Cursor = Cursors.SizeNS + // }; + // uc1.MouseDown += form_MouseDown; + // uc1.MouseUp += form_MouseUp; + // uc1.MouseMove += delegate (object sender, MouseEventArgs e) + // { + // if (isDragging) + // { + // this.Size = new Size(startWindowSize.X, e.Y - startPosition.Y + this.Height); + // } + // }; + // uc1.BringToFront(); + + // this.Controls.Add(uc1); + + // UserControl uc2 = new UserControl() + // { + // Anchor = (AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Bottom), + // Height = this.DisplayRectangle.Height - resizeBorderWidth, + // Width = resizeBorderWidth, + // Left = this.DisplayRectangle.Width - resizeBorderWidth, + // Top = 0, + // BackColor = Color.Transparent, + // Cursor = Cursors.SizeWE + // }; + // uc2.MouseDown += form_MouseDown; + // uc2.MouseUp += form_MouseUp; + // uc2.MouseMove += delegate (object sender, MouseEventArgs e) + // { + // if (isDragging) + // { + // this.Size = new Size(e.X - startPosition.X + this.Width, startWindowSize.Y); + // } + // }; + // uc2.BringToFront(); + + // this.Controls.Add(uc2); + + // UserControl uc3 = new UserControl() + // { + // Anchor = (AnchorStyles.Bottom | AnchorStyles.Right), + // Height = resizeBorderWidth, + // Width = resizeBorderWidth, + // Left = this.DisplayRectangle.Width - resizeBorderWidth, + // Top = this.DisplayRectangle.Height - resizeBorderWidth, + // BackColor = Color.Transparent, + // Cursor = Cursors.SizeNWSE + // }; + // uc3.MouseDown += form_MouseDown; + // uc3.MouseUp += form_MouseUp; + // uc3.MouseMove += delegate (object sender, MouseEventArgs e) + // { + // if (isDragging) + // { + // this.Size = new Size((e.X - startPosition.X + this.Width), (e.Y - startPosition.Y + this.Height)); + // } + // }; + // uc3.BringToFront(); + + // this.Controls.Add(uc3); + //} + + //protected TImageBox generateToolbarImageBox() + //{ + // TImageBox imageBox = new TImageBox(); + // //imageBox.BackColor = Color.Transparent; + // imageBox.BackColorHover = imageBox.BackColorSelected = Color.FromArgb(220, 220, 220); + // imageBox.BackgroundImageLayout = ImageLayout.Center; + // imageBox.ErrorImage = null; + // //imageBox.Image = Resources.close; + // //imageBox.ImageHover = Resources.close2; + // //imageBox.ImageNormal = Resources.close; + // imageBox.ImageSelected = null; + // imageBox.IsSelected = false; + // //closeBox.Location = new System.Drawing.Point(169, 12); + // imageBox.Size = titleBarIconSize; + // imageBox.SizeMode = PictureBoxSizeMode.CenterImage; + // //imageBox.MouseClick += new MouseEventHandler(closeBox_MouseClick); + // //imageBox.Left = this.DisplayRectangle.Width - imageBox.Width - 17; + // imageBox.Top = (int)Math.Floor((decimal) (titleBarHeight - titleBarIconSize.Height) / 2) + borderWidth; + // imageBox.Anchor = (AnchorStyles.Top | AnchorStyles.Right); + // imageBox.Padding = new Padding(0); + + // return imageBox; + //} + + //private void exitToolStripMenuItem_Click(object sender, EventArgs e) => this.Close(); + + //private void notifyIcon1_MouseClick(object sender, MouseEventArgs e) + //{ + // if (e.Button == MouseButtons.Left) + // { + // this.Visible = !this.Visible; + // } + + // //notifyIcon1.Visible = !this.Visible; + //} + + + } +} \ No newline at end of file diff --git a/RyzStudio/Windows/Forms/TForm.resx b/RyzStudio/Windows/Forms/TForm.resx new file mode 100644 index 0000000..b723165 --- /dev/null +++ b/RyzStudio/Windows/Forms/TForm.resx @@ -0,0 +1,424 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + 17, 17 + + + 130, 17 + + + + + AAABAAQAMDAAAAEAIACoJQAARgAAACAgAAABACAAqBAAAO4lAAAYGAAAAQAgAIgJAACWNgAAEBAAAAEA + IABoBAAAHkAAACgAAAAwAAAAYAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGxc + VU5rW1Tna1tU22paU5BsXVVCgEBABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAaltTZWtbVPxrW1T/a1tU/2tbVP9rW1T/a1tU7mtbU6VrXFNWbVtbDgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABqWlR/a1tU/2tbVP9rW1T/a1tU/2tbVP9rW1T/a1tU/2tbVP9rW1T/a1tU+Wta + VLprW1Nrb15VHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAVVVVA2tbVJhrW1T/a1tU/2tbVP+NgXz/2NPR/6+mov+Bc23/a1tU/2tb + VP9rW1T/a1tU/2tbVP9rW1T/a1tU/2tbVc1sXFSAa1xSMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABtSUkHa1xUqmtbVP9rW1T/a1tU/5iNiP/6+fn///////// + ////////6+no/7+4tf+Sh4L/bV5X/2tbVP9rW1T/a1tU/2tbVP9rW1T/a1tU/2tbVOFrXFOZallTTW1J + SQcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGlaWhFqW1TCa1tU/2tbVP9rW1T/o5mV//38 + /P//////////////////////////////////////9PPy/8jDwP+cko3/c2Nd/2tbVP9rW1T/a1tU/2tb + VP9rW1T/a1tU/2tbVPVrW1SzalxUXmlaWhEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAalhYHWtbVNRrW1T/a1tU/2tb + VP+1rar/////////////////////////////////////////////////////////////////+vn5/9LN + y/+lm5f/eGpj/2tbVP9rW1T/a1tU/2tbVP9rW1T/a1tU/2tbVPtrWlS9bFxVb2xdVSEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABrWVMra1tU42tb + VP9rW1T/bV1W/8S9u/////////////////////////////////////////////////////////////// + /////////////////////////v7+/97a2f+xqKT/g3Zw/2tbVP9rW1T/a1tU/2tbVP9rW1T/a1tU/2tb + VP5qW1V4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGpZ + VTxrW1Tua1tU/2tbVP9wYVr/0czK//////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////+ro5/+8tbL/j4N+/21d + Vv9rW1T/a1tU/2tbVP9rW1TpAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAbFxTUGtbVPZrW1T/a1tU/3VnYP/d2df///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////Tz8v/Iw8D/dmdh/2tbVP9rW1T/blpTJQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABsXFRha1tU+2tbVP9rW1T/emxl/+Th4P////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////m5CL/2tbVP9rW1T/a1tTXwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGtaVHdrW1T/a1tU/2tbVP+DdnD/7uzs/////////////Pvw//z6 + 7v/8+u7//Pru//z67v/8+u7//Pru//z67v/9/PT///////////////////////z4+f/79fX/+/X1//v1 + 9f/79fX/+/X1//v19f/79fX//Pb2////////////////////////////vLWy/2tbVP9rW1T/a1xTmQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVVVUDa1tUmGtbVP9rW1T/a1tU/4t/ev/08/L///////// + ///cyT7/0bcA/9G3AP/RtwD/0bcA/9G3AP/RtwD/0bcA/9G3AP/RtwD/6Nt+////////////4bG1/8Rl + bP/EZWz/xGVs/8RlbP/EZWz/xGVs/8RlbP/EZWz/xGVs/9KKkP//////////////////////3tvZ/2tb + VP9rW1T/a1tU1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG1JSQdrW1Sra1tU/2tbVP9rW1T/mY6J//r5 + +f////////////389f/RtwD/0bcA/9G3AP/RtwD/0bcA/9G3AP/RtwD/0bcA/9G3AP/RtwD/28Y1//// + ////////0IWL/8RlbP/EZWz/xGVs/8RlbP/EZWz/xGVs/8RlbP/EZWz/xGVs/8RlbP/9+fn///////// + /////////Pz8/3BhWv9rW1T/a1tU/nFVVRIAAAAAAAAAAAAAAAAAAAAAaVpaEWtcVMNrW1T/a1tU/2tb + VP+kmpb//fz8//////////////////389P/RtwD/0bcA/+TVbP/w56r/8Oeq//Dnqv/w56r/8Oeq/93K + Qv/RtwD/28Y1////////////0IWL/8RlbP/TjZL/68zO/+vMzv/rzM7/68zO/+vMzv/dpqr/xGVs/8Rl + bP/8+Pn//////////////////////46CfP9rW1T/a1tU/2xbVEkAAAAAAAAAAAAAAABsWFgaa1xU0Wtb + VP9rW1T/a1tU/7CopP////////////////////////////389P/RtwD/0bcA/+7lov////////////// + /////////////+PTY//RtwD/28Y1////////////0IWL/8RlbP/boaX///////////////////////// + ///px8n/xGVs/8RlbP/8+Pn//////////////////////7CopP9rW1T/a1tU/2tbVIMAAAAAAAAAAAAA + AABqXFTOa1tU/2tbVP9tXlf/xr+9//////////////////////////////////389P/RtwD/0bcA/+7l + ov///////////////////////////+PTY//RtwD/28Y1////////////0IWL/8RlbP/boaX///////// + ///////////////////px8n/xGVs/8RlbP/8+Pn//////////////////////9LNy/9rW1T/a1tU/2tb + VL8AAAAAAAAAAAAAAABrW1Tva1tU/2tbVP/KxML///////////////////////////////////////38 + 9P/RtwD/0bcA/+7lov///////////////////////////+PTY//RtwD/28Y1////////////0IWL/8Rl + bP/boaX////////////////////////////px8n/xGVs/8RlbP/8+Pn///////////////////////Py + 8v9sXFX/a1tU/2tbVPRmZmYFAAAAAAAAAABrW1W4a1tU/2tbVP/Oycf///////////////////////// + //////////////389P/RtwD/0bcA/+7lov///////////////////////////+PTY//RtwD/28Y1//// + ////////0IWL/8RlbP/boaX////////////////////////////px8n/xGVs/8RlbP/8+Pn///////// + //////////////////+CdG7/a1tU/2tbVP9sXVM0AAAAAAAAAABqWlR/a1tU/2tbVP+tpKD///////// + //////////////////////////////389P/RtwD/0bcA/+7lov///////////////////////////+PT + Y//RtwD/28Y1////////////0IWL/8RlbP/boaX////////////////////////////px8n/xGVs/8Rl + bP/8+Pn///////////////////////////+jmZX/a1tU/2tbVP9rWlNuAAAAAAAAAABtWlNEa1tU/2tb + VP+Lfnn///////////////////////////////////////389P/RtwD/0bcA/93JQf/j1Gb/49Rm/+PU + Zv/j1Gb/49Rm/9jCJ//RtwD/28Y1////////////0IWL/8RlbP/NfYL/3KOn/9yjp//co6f/3KOn/9yj + p//TjJH/xGVs/8RlbP/8+Pn////////////////////////////Fv7z/a1tU/2tbVP9qW1OoAAAAAAAA + AABqVVUMa1tU+2tbVP9uXlf/+fn4//////////////////////////////////389P/RtwD/0bcA/9G3 + AP/RtwD/0bcA/9G3AP/RtwD/0bcA/9G3AP/RtwD/28c5////////////0IWL/8RlbP/EZWz/xGVs/8Rl + bP/EZWz/xGVs/8RlbP/EZWz/xGVs/8Rmbf/9+vr////////////////////////////n5eT/a1tU/2tb + VP9rW1TkAAAAAAAAAAAAAAAAa1tUz2tbVP9rW1T/3NjW//////////////////////////////////38 + 9v/axTP/2sUz/9rFM//axTP/2sUz/9rFM//axTP/2sUz/9rFM//bxzj/8Ois////////////2p2i/9CE + if/QhIn/0ISJ/9CEif/QhIn/0ISJ/9CEif/QhIn/0ISJ/+GwtP////////////////////////////// + ///+/v7/dWdg/2tbVP9rW1T/alhYHQAAAAAAAAAAa1tUlGtbVP9rW1T/ubKv//////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////l4uG/2tbVP9rW1T/a1pUWAAAAAAAAAAAbFtVWmtbVP9rW1T/mI2I//// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////uLGt/2tbVP9rW1T/a1tUkgAAAAAAAAAAa1pSH2tb + VP9rW1T/dmdh//7+/v////////////////////////////////+rnPH/fGTp/3xk6f98ZOn/fGTp/3xk + 6f98ZOn/fGTp/3xk6f9/aOr/ysD2////////////rOH9/zi4+v8ztvr/M7b6/zO2+v8ztvr/M7b6/zO2 + +v8ztvr/M7b6/33R/P//////////////////////////////////////2tbV/2tbVP9rW1T/a1tVzQAA + AAAAAAAAAAAAAGtbVONrW1T/a1tU/+jm5f////////////////////////////r5/v9cPuT/Wz3k/1s9 + 5P9bPeT/Wz3k/1s95P9bPeT/Wz3k/1s95P9bPeT/gGjq////////////Obj6/wCk+f8ApPn/AKT5/wCk + +f8ApPn/AKT5/wCk+f8ApPn/AKT5/wGk+f/3/P//////////////////////////////////+vn5/25f + WP9rW1T/a1tU/GpVVQwAAAAAAAAAAGtcVKprW1T/a1tU/8bAvf////////////////////////////j3 + /v9bPeT/Wz3k/4Vu6/+di+//nYvv/52L7/+di+//nYvv/3Rb6P9bPeT/fWXq////////////Nbf6/wCk + +f8nsvr/Zsj7/2bI+/9myPv/Zsj7/2bI+/9Bu/v/AKT5/wCk+f/0+/////////////////////////// + /////////////4p9eP9rW1T/a1tU/2xdVUIAAAAAAAAAAGtbVHBrW1T/a1tU/6Sblv////////////// + //////////////j3/v9bPeT/Wz3k/8O49f///////////////////////////5uI7v9bPeT/fWXq//// + ////////Nbf6/wCk+f9jx/v///////////////////////////+i3v3/AKT5/wCk+f/0+/////////// + /////////////////////////////6yjn/9rW1T/a1tU/2pcVH0AAAAAAAAAAGxdUzRrW1T/a1tU/4J0 + bv////////////////////////////j3/v9bPeT/Wz3k/8O49f///////////////////////////5uI + 7v9bPeT/fWXq////////////Nbf6/wCk+f9jx/v///////////////////////////+i3v3/AKT5/wCk + +f/0+////////////////////////////////////////87Jx/9rW1T/a1tU/2tbVbgAAAAAAAAAAGZm + ZgVrW1T0a1tU/2xcVf/z8vL///////////////////////j3/v9bPeT/Wz3k/8O49f////////////// + /////////////5uI7v9bPeT/fWXq////////////Nbf6/wCk+f9jx/v///////////////////////// + //+i3v3/AKT5/wCk+f/0+////////////////////////////////////////8rEwv9rW1T/a1tU/2tb + VO8AAAAAAAAAAAAAAABrW1S/a1tU/2tbVP/Szcv///////////////////////j3/v9bPeT/Wz3k/8O4 + 9f///////////////////////////5uI7v9bPeT/fWXq////////////Nbf6/wCk+f9jx/v///////// + //////////////////+i3v3/AKT5/wCk+f/0+///////////////////////////////////xr+9/21e + V/9rW1T/a1tU/2pcVM4AAAAAAAAAAAAAAABrWlSFa1tU/2tbVP+xqaX///////////////////////j3 + /v9bPeT/Wz3k/8O49f///////////////////////////5uI7v9bPeT/fWXq////////////Nbf6/wCk + +f9jx/v///////////////////////////+i3v3/AKT5/wCk+f/0+/////////////////////////// + //+6sq//bFxV/2tbVP9rW1T/a1tT1m9eVR4AAAAAAAAAAAAAAABpXFVLa1tU/2tbVP+Pg37///////// + //////////////j3/v9bPeT/Wz3k/6CP7//Ivvb/yL72/8i+9v/Ivvb/yL72/4Vv6/9bPeT/fWXq//// + ////////Nbf6/wCk+f9CvPv/quH9/6rh/f+q4f3/quH9/6rh/f9sy/z/AKT5/wCk+f/0+/////////// + /////////f39/6ifmv9rW1T/a1tU/2tbVP9rW1TIZllZFAAAAAAAAAAAAAAAAAAAAABpWloRa1tU/Wtb + VP9wYVr//Pv7//////////////////j3/v9bPeT/Wz3k/1s95P9bPeT/Wz3k/1s95P9bPeT/Wz3k/1s9 + 5P9bPeT/fWXq////////////Nbf6/wCk+f8ApPn/AKT5/wCk+f8ApPn/AKT5/wCk+f8ApPn/AKT5/wCk + +f/1+//////////////7+vr/nZKO/2tbVP9rW1T/a1tU/2tcVbJmZk0KAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAa1tT1mtbVP9rW1T/4Nzb//////////////////j3/v9bPeT/Wz3k/1s95P9bPeT/Wz3k/1s9 + 5P9bPeT/Wz3k/1s95P9bPeT/rJ3x////////////Nbf6/wCk+f8ApPn/AKT5/wCk+f8ApPn/AKT5/wCk + +f8ApPn/AKT5/z66+v////////////b19P+Pg37/a1tU/2tbVP9rW1T/a1tTn4BAQAQAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAa1pUm2tbVP9rW1T/vbaz//////////////////7+///08v3/9PL9//Ty + /f/08v3/9PL9//Ty/f/08v3/9PL9//Ty/f/49/7/////////////////8vr//+75///u+f//7vn//+75 + ///u+f//7vn//+75///u+f//8Pr/////////////8O/u/4Z5dP9rW1T/a1tU/2tbVP9rXFSIAAAAAQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbFxUYWtbVP9rW1T/nJGM//////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////n5eT/fG5o/2tbVP9rW1T/a1tU/Gta + VWkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAblpTJWtbVP9rW1T/dmdh/8jD + wP/08/L///////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////93Z1/91Z2D/a1tU/2tb + VP9rW1T2bFxTUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWtb + VOlrW1T/a1tU/2tbVP9tXVb/j4N+/7y1sv/q6Of///////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////0czK/3Bh + Wv9rW1T/a1tU/2tbVO5qWVU8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAGpbVXhrW1T+a1tU/2tbVP9rW1T/a1tU/2tbVP9rW1T/g3Zw/7GopP/e2tn//v7+//// + //////////////////////////////////////////////////////////////////////////////// + ///Evbv/bV1W/2tbVP9rW1T/a1tU42tZUysAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsXVUhbFxVb2taVL1rW1T7a1tU/2tbVP9rW1T/a1tU/2tb + VP9rW1T/eGpj/6Wbl//Szcv/+vn5//////////////////////////////////////////////////// + /////////////7Wtqv9rW1T/a1tU/2tbVP9rW1TUalhYHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABpWloRbFpUVWtb + U6JrW1Twa1tU/2tbVP9rW1T/a1tU/2tbVP9rW1T/cGFa/5KHgv+/uLX/8O/u//////////////////// + ///////////////////9/f3/p56a/2tbVP9rW1T/a1tU/2pbVcdmWVkUAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABVVVUDallVPGtbVJFrW1Pia1tU/2tbVP9rW1T/a1tU/2tbVP9rW1T/bFxV/4l8 + dv+1ran/4d7d//////////////////v6+v+cko3/a1tU/2tbVP9rW1T/a1tUsXFVVQkAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa1xSMmxcVIBrW1XNa1tU/2tb + VP9rW1T/a1tU/2tbVP9rW1T/a1tU/4Fzbf+vpqL/2NPR/42BfP9rW1T/a1tU/2tbVP9rW1SYVVVVAwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAb15VHmtbU2trWlS6a1tU+WtbVP9rW1T/a1tU/2tbVP9rW1T/a1tU/2tbVP9rW1T/a1tU/2pa + VH8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbVtbDmtcU1ZrW1Ola1tU7mtbVP9rW1T/a1tU/2tb + VP9rW1T8altTZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgEBABGxd + VUJqWlOQa1tU22tbVOdsXFVOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//4H///+sEP//AD///6wQ//4AB///rBD/+AAA//+sEP/w + AAAP/6wQ/+AAAAH/rBD/wAAAAD+sEP+AAAAAH6wQ/wAAAAAPrBD+AAAAAA+sEPwAAAAAD6wQ+AAAAAAP + rBDgAAAAAA+sEMAAAAAAB6wQgAAAAAAHrBAAAAAAAAesEAAAAAAAB6wQAAAAAAADrBAAAAAAAAOsEAAA + AAAAA6wQAAAAAAADrBAAAAAAAAOsEIAAAAAAAawQgAAAAAABrBCAAAAAAAGsEIAAAAAAAawQwAAAAAAA + rBDAAAAAAACsEMAAAAAAAKwQwAAAAAAArBDAAAAAAACsEOAAAAAAAKwQ4AAAAAAArBDgAAAAAAGsEOAA + AAAAA6wQ8AAAAAAHrBDwAAAAAA+sEPAAAAAAP6wQ8AAAAAB/rBDwAAAAAP+sEPgAAAAB/6wQ/AAAAAP/ + rBD/gAAAB/+sEP/wAAAP/6wQ//8AAB//rBD//+AAf/+sEP///AD//6wQ////gf//rBAoAAAAIAAAAEAA + AAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABsXFRha1tU7GtbVcFqW1RzalxVJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAbFtVe2tbVP5rW1T/a1tU/2tbVP9rW1T/a1tT1mtcVIhrWVU5gICAAgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAVVVVA2xbVJVrW1T/bV5X/8K7uf/RzMr/pJqW/3hpY/9rW1T/a1tU/2tb + VP9rW1TpalxTnGxcVU5mZk0KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAG1JSQdrW1Spa1tU/29fWf/Oycf//////////////////v7+/+He + 3f+1ran/iXx2/2tbVP9rW1T/a1tU/2tbVPZqW1W7bFxVb2xYWBoAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwYFAQbFxUwGtbVP91ZmD+3trZ//////////////////// + ////////////////////////6efm/7y0sf+Ogn3/bV1W/2tbVP9rW1T/a1tU/WtbVMZrWlR3ZlVVDwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaF5VG2tbVNJrW1T/fW9p/+fl5P////////////// + ///////////////////////////////////////////////////z8vL/x8G//5uQi/9xYlv/a1tU/2tb + VP9rW1SPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGpdVylrW1Tha1tU/4V4cv/w7u7///////// + //////////////////////////////////////////////////////////////////////////////r6 + +v/Evbv/a1tU/2xbVMwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABrXVM3a1tU62tbVP+MgHr/9PPy//// + //////////////////////////////////////////////////////////////////////////////// + //////////////v6+v9vX1n/a1tU+2pVVQwAAAAAAAAAAAAAAAAAAAAAallTTWtbVPVrW1T/mY6K//r5 + +f///v3/1r8d/9G3AP/RtwD/0bcA/9G3AP/RtwD/07oL//r34//57u//x2xy/8RlbP/EZWz/xGVs/8Rl + bP/EZWz/y3d9///+/v///////////4yAev9rW1T/alpSQQAAAAAAAAAAAAAAAGpaVWBrW1T7a1tU/6mg + nP/+/v7///////799//RtwD/2cMr/+PUZv/j1Gb/49Rm/9zIPP/RtwD/9vHM//Pg4v/EZWz/0omP/9yj + p//co6f/3KOn/85/hf/EZWz//fr6////////////rqai/2tbVP9sW1V7AAAAAAAAAABrW1R5a1tU/2xc + Vf+4sa3//////////////////v33/9G3AP/k1Wz/////////////////7OGW/9G3AP/28cz/8+Di/8Rl + bP/nwML/////////////////3aaq/8RlbP/9+vr////////////RzMn/a1tU/2pbVLYAAAAAAAAAAGtb + VO5rW1T/w726///////////////////////+/ff/0bcA/+TVbP/////////////////s4Zb/0bcA//bx + zP/z4OL/xGVs/+fAwv/////////////////dpqr/xGVs//36+v////////////Lw8P9rW1T/a1tU74CA + gAIAAAAAa1tUxWtbVP/Z1dP///////////////////////799//RtwD/5NVs/////////////////+zh + lv/RtwD/9vHM//Pg4v/EZWz/58DC/////////////////92mqv/EZWz//fr6/////////////////4By + bP9rW1T/aF1RLAAAAABqXFSLa1tU/7iwrf///////////////////////v33/9G3AP/dyUH/7eKZ/+3i + mf/t4pn/4dBa/9G3AP/28cz/8+Di/8RlbP/Zm6D/58HE/+fBxP/nwcT/04yR/8RlbP/9+vr///////// + ////////opeT/2tbVP9qW1NlAAAAAGtbVVFrW1T/louG///////////////////////+/ff/0bcA/9G3 + AP/RtwD/0bcA/9G3AP/RtwD/0bcB//n12//z4OL/xGVs/8RlbP/EZWz/xGVs/8RlbP/EZWz/x2xy//79 + /f/////////////////Dvbr/a1tU/2tbU58AAAAAaF1RFmtbVP90ZV///v7+///////////////////+ + /f/28cz/9vHM//bxzP/28cz/9vHM//bxzP/49dr///////35+f/z4OL/8+Di//Pg4v/z4OL/8+Di//Pg + 4v/47e7//////////////////////+Xi4f9rW1T/altU2gAAAAAAAAAAa1xT3GtbVP/m4+L///////// + /////////////+zp/P/e2Pr/3tj6/97Y+v/e2Pr/3tj6/+fj+////////////9ry/v/M7f7/zO3+/8zt + /v/M7f7/zO3+/+L1/v///////////////////////v7+/3VmX/9rW1T+aF1RFgAAAABsWlSha1tU/8S+ + u//////////////////8/P//YkXl/1s95P9bPeT/Wz3k/1s95P9bPeT/XD7k/+jk+//b8v7/AaT5/wCk + +f8ApPn/AKT5/wCk+f8ApPn/C6j5//v+////////////////////////lYmE/2tbVP9rWlRPAAAAAGpc + VGdrW1T/o5mU//////////////////r5/v9bPeT/hW7r/72x9P+9sfT/vbH0/5WB7v9bPeT/3tj6/8zt + /v8ApPn/WsT7/5nb/f+Z2/3/mdv9/0G7+/8ApPn/9/z///////////////////////+2r6v/a1tU/2pb + VIkAAAAAaF1RLGtbVP+Acmz/////////////////+vn+/1s95P+gj+//////////////////u6/0/1s9 + 5P/e2Pr/zO3+/wCk+f+W2v3/////////////////bMv8/wCk+f/3/P///////////////////////9nV + 0/9rW1T/a1tUxQAAAACAgIACa1tU72tbVP/y8PD////////////6+f7/Wz3k/6CP7/////////////// + //+7r/T/Wz3k/97Y+v/M7f7/AKT5/5ba/f////////////////9sy/z/AKT5//f8//////////////// + ////////w726/2tbVP9rW1TuAAAAAAAAAABqW1S2a1tU/9HMyf////////////r5/v9bPeT/oI/v//// + /////////////7uv9P9bPeT/3tj6/8zt/v8ApPn/ltr9/////////////////2zL/P8ApPn/9/z///// + /////////////7ixrf9sXFX/a1tU/2tbVHkAAAAAAAAAAGpcVH1rW1T/r6ej////////////+vn+/1s9 + 5P93Xun/nYvv/52L7/+di+//gmvq/1s95P/e2Pr/zO3+/wCk+f88ufr/Zsj7/2bI+/9myPv/K7P6/wCk + +f/3/P////////7+/v+upaH/a1tU/2tbVPxqXFRnAAAAAAAAAAAAAAAAa1tUQ2tbVP+NgXz///////// + ///6+f7/Wz3k/1s95P9bPeT/Wz3k/1s95P9bPeT/YkXl/+3q/P/M7f7/AKT5/wCk+f8ApPn/AKT5/wCk + +f8ApPn/Ha76//3+///7+vr/nZOO/2tbVP9rWlT4altVVAAAAAAAAAAAAAAAAAAAAAB0XV0La1tU+29f + Wf/7+vr///////////////////////////////////////////////////////////////////////// + ////////////////////////9vX0/5CEfv9rW1T/bFxU72pZVTwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AABsW1TMa1tU/8S9u//6+vr///////////////////////////////////////////////////////// + //////////////////////////////Du7v+FeHL/a1tU/2tbVOFqXVcpAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAGtbVI9rW1T/a1tU/3FiW/+bkIv/x8G///Py8v////////////////////////////// + ///////////////////////////////////n5eT/fW9p/2tbVP9rW1TSaF5VGwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAZlVVD2taVHdrW1TGa1tU/WtbVP9rW1T/bV1W/46Cff+8tLH/6efm//// + ////////////////////////////////////////3trZ/3ZnYf9rW1T/bFxUwHBgUBAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmWVkUalxUXmtcVKprW1Tya1tU/2tb + VP9rW1T/f3Fr/6uinv/Y09H//fz8/////////////////9LNy/9xYVv/a1tU/2paVa9xVVUJAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGZm + TQpsXFVOalxTnGtbVOlrW1T/a1tU/2tbVP94aWP/pJqW/9HMyv/Cu7n/bV5X/2tbVP9sW1SVVVVVAwAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAgICAAmtZVTlrXFSIa1tT1mtbVP9rW1T/a1tU/2tbVP9rW1T+bFtVewAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAalxVJGpbVHNrW1XBa1tU7Gxc + VGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/g////wA///wAB//4A + AD/8AAAH+AAAB/AAAAfgAAADwAAAA4AAAAMAAAADAAAAAQAAAAEAAAABAAAAAQAAAAGAAAAAgAAAAIAA + AACAAAAAgAAAAMAAAADAAAABwAAAA8AAAAfgAAAP4AAAH+AAAD/8AAB//4AA///wA////wf/KAAAABgA + AAAwAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAa1tTa2xcVfBsXFW1bFpVZmZcUhkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFrWlSFa1tU/4+Dfv+AcWv8a1tU/2tb + VP5tXlbMa1xUemxbVS0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAVVVVA2xbVJprW1T/qqCc//7+/v//////6+no/7+4tf+RhoH9bF1W/mtbVP9tXlbia1xTmWpZ + U02AVVUGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0XV0LbFxVtWxcVf+5sq////////// + ////////////////////////8/Hx/8bAvf+Zjor/cGBa/WtbVP9tXVbxaltUo2heVRsAAAAAAAAAAAAA + AAAAAAAAAAAAAGZZWRRtXFbKbV1W/sjCv/////////////////////////////////////////////// + ////////+vn5/9LNy/+mnJj/bV1W/WtbVIMAAAAAAAAAAAAAAAAAAAAAaFhYIG1eV9pvYFn808/N//// + ////////////////////////////////////////////////////////////////////////in55/W1d + Vr4AAAAAAAAAAAAAAABoXVEsbV5X53NlXvzd2tj//v78/9S8EP/RtwD/0bcA/9G3AP/RtwD/8Oit/+zN + 0P/EZWz/xGVs/8RlbP/EZWz/yG91//79/f//////raSg/2xcVfaAQEAEAAAAAGxcVEBtXVbzfG5n++jm + 5f///////v35/9G3AP/v5qf/9vHM//bxzP/Ywij/7eKZ/+fBxP/NfYP/8+Di//Pg4v/rysz/xGVs//77 + /P//////z8rH/2tbVP9rXFIyAAAAAG1dVe2CdW/98O/u/////////////v35/9G3AP/38tH///////// + ///axTL/7eKZ/+fBxP/Qg4n////////////04+T/xGVs//77/P//////8fDv/2tbVP9sW1RtAAAAAG5e + Vs+ViYT+/////////////////v35/9G3AP/38tH////////////axTL/7eKZ/+fBxP/Qg4n///////// + ///04+T/xGVs//77/P///////////31waftqW1OoAAAAAGxaU5NyY138/v7+/////////////v35/9G3 + AP/Zwyr/2sUz/9rFM//Tugr/7eOb/+fBxP/Ga3L/0ISJ/9CEif/OfoT/xGVs//78/P///////////6CW + kv9tXlflAAAAAGpcU1lrW1T/5ePh//////////////79/+3imf/t4pn/7eKZ/+3imf/t4pr/+/nr//bm + 5//nwcT/58HE/+fBxP/nwcT/7M3P/////////////////8K7uf9rW1T/alhYHW9eVR5rW1T/w726//// + /////////////8rA9v+9sfT/vbH0/72x9P++svT/8vD9/+v4//+a2/3/mdv9/5nb/f+Z2/3/rOH9//// + /////////////+Th4P9rW1T/bFtVVwAAAABtXlfnopeT/////////////Pv+/1s95P92Xej/fGTp/3xk + 6f9hReX/v7P0/5vb/f8KqPn/M7b6/zO2+v8qs/r/AKT5//r9//////////////7+/v9yY1z8a1tUkQAA + AABqW1OofXBp+///////////+/r+/1s95P/h3Pr///////////97Y+n/vbH0/5nb/f8ytvr///////// + ///R7/7/AKT5//n9//////////////////+ViYT+bl5WzwAAAABsW1Rta1tU//Hw7///////+/r+/1s9 + 5P/h3Pr///////////97Y+n/vbH0/5nb/f8ytvr////////////R7/7/AKT5//n9//////////////Dv + 7v+CdW/9bV1V7QAAAABsXVM0a1tU/9DLyf//////+/r+/1s95P/GvPb/3tj6/97Y+v91W+j/vbH0/5nb + /f8osvr/zO3+/8zt/v+n4P3/AKT5//n9////////6+no/35wavxsXVX1altURgAAAACAQEAEbV1W9q6m + ov//////+/r+/1s95P9bPeT/Wz3k/1s95P9bPeT/ysH2/5nb/f8ApPn/AKT5/wCk+f8ApPn/EKr5//z+ + ///g3dv/dmdh/G1dVuptWFMxAAAAAAAAAAAAAAAAbFxVv4x/ev3///////////////////////////// + /////////////////////////////////////////////9jT0f9xYVv8bV5W32pcVSQAAAAAAAAAAAAA + AAAAAAAAa1tUg21dVv2mnJj/0s3L//r5+f////////////////////////////////////////////// + ////////yMK//21dVv5tXFbKZllZFAAAAAAAAAAAAAAAAAAAAAAAAAAAaF5VG2pbVKNsXFXwa1tU/3Bg + Wv2Zjor+xsC9//Px8f////////////////////////////////+5sq//bFxV/2xcVbV0XV0LAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVVVUDallVPGtcVIhtXVbba1tU/2tbVP6Ie3X9ta2p/+He + 3f///////v7+/66mov9rW1T/bFpUoWZmZgUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAbFtVLWtcVHpsXVXLa1tU/mtbVP9/cWv7j4N+/2tbVP9rWlSFAAAAAQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAZlxSGWxaVWZsXFW1bFxV8GtbU2sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8H + /0H8AP9B+AAPQfAAA0HgAANBwAADQYAAAUEAAAFBAAABQQAAAUEAAAFBAAAAQQAAAEGAAABBgAAAQYAA + AEGAAABBgAABQcAAA0HAAAdBwAAPQfAAH0H/AD9B/+D/QSgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJhW3tvYFn0dWZgsmxbVVdmVVUPAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgICAAnFiW5eCdG705OHg/8a/vf+UiYT0cWFa+Xdo + YcptXFVsb15VHgAAAAAAAAAAAAAAAAAAAAAAAAAAbUlJB3NkXbKMgHr09/b2//////////////////r5 + +f/Szcv/oJeS9XNlXfZzZV7baVxVJwAAAAAAAAAAbVtbDnNjXciZj4n1+/r6//////////////////// + ///////////////////+/v7/pJqW+WxdVnYAAAAAamBVGHJkXdmnnpn2/f37/9S8E//axTP/2MIo/+XX + cP/eqa3/zX2D/9CEif/IcHf//v39/83Ixf92Z2C8AAAAAHJjXOC5sK36//////7++//bxjb///////Xw + yv/k1Gf/3KOn//Pf4P//////0IaL//79/f/w7u7/cWFb8gAAAAF0Zl/i4+Df///////+/vv/2cMr//bx + zP/u5aL/5NRn/9yjp//px8n/8+Di/85/hf/+/f3//////3hpYvNuWlMldGReo8K7uf////////79/+PU + Zv/j1Gb/49Rm//Dorv/qyMv/3KOn/9yjp//eqKz///7+//////+ajoryalxUXmpaVWCbkYzz//////7+ + //+ikfD/nYvv/52L7//Lwfb/ruL9/2bI+/9myPv/b8z8//7/////////wbq3/3RlXqJuWlMleGli8/// + ///8/P//d17p/97Y+v/DuPX/nYvv/2fJ+/+i3v3/zO3+/yuz+v/7/v///////+Pg3/90Zl/iAAAAAXFh + W/Lw7u7//Pz//35m6v//////3df5/52L7/9nyfv/yuz+//////82t/r/+/7///////+5sK36cmNc4AAA + AAB2Z2G+zsnH//z8//9iReX/fGTp/3Vb6P+jkvD/Z8n7/yiy+v8ztvr/E6v5//v9/v+to5/4c2Nd3m1b + UhwAAAAAbF1WdqSalvn+/v7///////////////////////////////////////v6+v+Zj4r2c2ReyW1b + Ww4AAAAAAAAAAGlcVSdzZV7bc2Vd9qCXkvXSzcv/+vn5//////////////////f29v+MgHr0c2Rdsm1J + SQcAAAAAAAAAAAAAAAAAAAAAAAAAAG9eVR5rW1NrdGRexnBhWfiShoHvxr+9/uTh4P+CdG70c2RdmYCA + gAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmVVUPbFtVV3VmYLJvYFn0cmFbewAA + AAAAAAAAAAAAAAAAAAAAAAAA+D+sQeAHrEHAAaxBgAGsQQABrEEAAKxBAACsQQAArEEAAKxBAACsQQAA + rEGAAKxBgAGsQYADrEHgB6xB/B+sQQ== + + + \ No newline at end of file diff --git a/RyzStudio/Windows/Forms/THorizontalSeparator.Designer.cs b/RyzStudio/Windows/Forms/THorizontalSeparator.Designer.cs new file mode 100644 index 0000000..1058088 --- /dev/null +++ b/RyzStudio/Windows/Forms/THorizontalSeparator.Designer.cs @@ -0,0 +1,37 @@ +namespace RyzStudio.Windows.Forms +{ + partial class THorizontalSeparator + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + } + + #endregion + } +} diff --git a/RyzStudio/Windows/Forms/THorizontalSeparator.cs b/RyzStudio/Windows/Forms/THorizontalSeparator.cs new file mode 100644 index 0000000..1be87f2 --- /dev/null +++ b/RyzStudio/Windows/Forms/THorizontalSeparator.cs @@ -0,0 +1,101 @@ +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace RyzStudio.Windows.Forms +{ + public partial class THorizontalSeparator : System.Windows.Forms.UserControl + { + public THorizontalSeparator() + { + InitializeComponent(); + + this.BackColor = Color.Transparent; + this.Margin = new Padding(10, 0, 10, 0); + this.MaximumSize = new Size(SystemInformation.VirtualScreen.Width, 22); + this.MinimumSize = new Size(0, 22); + this.Padding = new Padding(0, 10, 0, 10); + } + + protected override void OnPaintBackground(PaintEventArgs e) + { + base.OnPaintBackground(e); + + Graphics g = e.Graphics; + + g.FillRectangle(new SolidBrush(Color.FromArgb(213, 223, 229)), new Rectangle(this.DisplayRectangle.Left, 11, this.DisplayRectangle.Width, 1)); + g.FillRectangle(new SolidBrush(Color.FromArgb(249, 251, 253)), new Rectangle(this.DisplayRectangle.Left, 12, this.DisplayRectangle.Width, 1)); + } + + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public override Image BackgroundImage { get => base.BackgroundImage; set => base.BackgroundImage = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public override ImageLayout BackgroundImageLayout { get => base.BackgroundImageLayout; set => base.BackgroundImageLayout = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new BorderStyle BorderStyle { get => base.BorderStyle; set => base.BorderStyle = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public override Cursor Cursor { get => base.Cursor; set => base.Cursor = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public override Font Font { get => base.Font; set => base.Font = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public override Color BackColor { get => base.BackColor; set => base.BackColor = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public override Color ForeColor { get => base.ForeColor; set => base.ForeColor = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public override RightToLeft RightToLeft { get => base.RightToLeft; set => base.RightToLeft = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new bool UseWaitCursor { get => base.UseWaitCursor; set => base.UseWaitCursor = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public override bool AllowDrop { get => base.AllowDrop; set => base.AllowDrop = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public override AutoValidate AutoValidate { get => base.AutoValidate; set => base.AutoValidate = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public override ContextMenuStrip ContextMenuStrip { get => base.ContextMenuStrip; set => base.ContextMenuStrip = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new ImeMode ImeMode { get => base.ImeMode; set => base.ImeMode = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public override bool AutoScroll { get => base.AutoScroll; set => base.AutoScroll = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new Size AutoScrollMargin { get => base.AutoScrollMargin; set => base.AutoScrollMargin = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new Size AutoScrollMinSize { get => base.AutoScrollMinSize; set => base.AutoScrollMinSize = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public override bool AutoSize { get => base.AutoSize; set => base.AutoSize = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new AutoSizeMode AutoSizeMode { get => base.AutoSizeMode; set => base.AutoSizeMode = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public override Size MaximumSize { get => base.MaximumSize; set => base.MaximumSize = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public override Size MinimumSize { get => base.MinimumSize; set => base.MinimumSize = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new Padding Margin { get => base.Margin; set => base.Margin = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new Padding Padding { get => base.Padding; set => base.Padding = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new DockStyle Dock { get => base.Dock; set => base.Dock = value; } + + } +} diff --git a/RyzStudio/Windows/Forms/THorizontalSeparator.resx b/RyzStudio/Windows/Forms/THorizontalSeparator.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/RyzStudio/Windows/Forms/THorizontalSeparator.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/RyzStudio/Windows/Forms/TImageBox.cs b/RyzStudio/Windows/Forms/TImageBox.cs new file mode 100644 index 0000000..09f7bbe --- /dev/null +++ b/RyzStudio/Windows/Forms/TImageBox.cs @@ -0,0 +1,84 @@ +using System; +using System.ComponentModel; +using System.Drawing; + +namespace RyzStudio.Windows.Forms +{ + public class TImageBox : System.Windows.Forms.PictureBox + { + public TImageBox() : base() + { + this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; + this.ErrorImage = null; + this.InitialImage = null; + this.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage; + } + + protected override void OnCreateControl() + { + OnMouseLeave(null); + + base.OnCreateControl(); + } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new Color BackColor { get => base.BackColor; set => base.BackColor = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new Image Image { get => base.Image; set => base.Image = value; } + + [Category("Appearance"), Browsable(true)] + public Color BackColorNormal { get; set; } = Color.Transparent; + + [Category("Appearance"), Browsable(true)] + public Color BackColorHover { get; set; } = Color.Transparent; + + [Category("Appearance"), Browsable(true)] + public Color BackColorSelected { get; set; } = Color.Transparent; + + [Category("Appearance"), Browsable(true)] + public Image ImageNormal { get; set; } + + [Category("Appearance"), Browsable(true)] + public Image ImageHover { get; set; } + + [Category("Appearance"), Browsable(true)] + public Image ImageSelected { get; set; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public Image NormalImage { get => this.ImageNormal; set => this.ImageNormal = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public Image HoverImage { get => this.ImageHover; set => this.ImageHover = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public Image SelectedImage { get => this.ImageSelected; set => this.ImageSelected = value; } + + public bool IsSelected { get; set; } = false; + + protected override void OnMouseEnter(EventArgs e) + { + this.Image = this.ImageHover; + this.BackColor = this.BackColorHover; + + base.OnMouseEnter(e); + } + + protected override void OnMouseLeave(EventArgs e) + { + this.Image = (this.IsSelected ? this.ImageSelected : this.ImageNormal); + this.BackColor = (this.IsSelected ? this.BackColorSelected : this.BackColorNormal); + + base.OnMouseLeave(e); + } + + protected override void OnLostFocus(EventArgs e) + { + this.Image = (this.IsSelected ? this.ImageSelected : this.ImageNormal); + this.BackColor = (this.IsSelected ? this.BackColorSelected : this.BackColorNormal); + + base.OnLostFocus(e); + } + + } +} diff --git a/RyzStudio/Windows/Forms/TPanelBook.cs b/RyzStudio/Windows/Forms/TPanelBook.cs new file mode 100644 index 0000000..eae6a0f --- /dev/null +++ b/RyzStudio/Windows/Forms/TPanelBook.cs @@ -0,0 +1,258 @@ +namespace RyzStudio.Windows.Forms +{ + using System; + using System.Collections; + using System.ComponentModel; + using System.Drawing; + using System.Windows.Forms; + + [ToolboxItem(true)] + public class TPanelBook : UserControl + { + public class PanelCollection : CollectionBase + { + protected TPanelBook panelBook = null; + + public PanelCollection(TPanelBook parentPanelBook) : base() + { + panelBook = parentPanelBook; + } + + public TPanelBook Parent => panelBook; + + public Panel this[int index] { get => (Panel)List[index]; set => List[index] = value; } + + public int Add(Panel value) => List.Add(value); + + public void AddRange(Panel[] pages) => Array.ForEach(pages, x => this.Add(x)); + + public bool Contains(Panel value) => List.Contains(value); + + public int IndexOf(Panel value) => List.IndexOf(value); + + public void Insert(int index, Panel value) => List.Insert(index, value); + + public void Remove(Panel value) => List.Remove(value); + + protected override void OnInsertComplete(int index, object value) + { + base.OnInsertComplete(index, value); + + if (panelBook != null) + { + panelBook.PageIndex = index; + } + } + + protected override void OnRemoveComplete(int index, object value) + { + base.OnRemoveComplete(index, value); + + if (panelBook != null) + { + if (panelBook.PageIndex == index) + { + if (index < InnerList.Count) + { + panelBook.PageIndex = index; + } + else + { + panelBook.PageIndex = InnerList.Count - 1; + } + } + } + } + + } + + private System.ComponentModel.IContainer components = null; + + protected PanelCollection panelCollection = null; + + public TPanelBook() + { + InitializeComponent(); + + panelCollection = new PanelCollection(this); + } + + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + + base.Dispose(disposing); + } + + protected void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public Panel ActivePanel { get; protected set; } = null; + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public override bool AutoScroll { get => base.AutoScroll; set => base.AutoScroll = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new Size AutoScrollMargin { get => base.AutoScrollMargin; set => base.AutoScrollMargin = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new Size AutoScrollMinSize { get => base.AutoScrollMinSize; set => base.AutoScrollMinSize = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public override Image BackgroundImage { get => base.BackgroundImage; set => base.BackgroundImage = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public override ImageLayout BackgroundImageLayout { get => base.BackgroundImageLayout; set => base.BackgroundImageLayout = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new ImeMode ImeMode { get => base.ImeMode; set => base.ImeMode = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public override RightToLeft RightToLeft { get => base.RightToLeft; set => base.RightToLeft = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new bool UseWaitCursor { get => base.UseWaitCursor; set => base.UseWaitCursor = value; } + + [Category("Collection")] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] + public PanelCollection Pages => panelCollection; + + [Category("Collection")] + public int SelectedIndex + { + get => (panelCollection.Count <= 0) ? -1 : panelCollection.IndexOf(this.ActivePanel); + set + { + if (panelCollection.Count <= 0) return; + if (value < 0) return; + if (value > (panelCollection.Count - 1)) return; + if (value == this.SelectedIndex) return; + + ActivatePage(value); + } + } + + protected internal int PageIndex + { + get => panelCollection.IndexOf(this.ActivePanel); + set + { + if (panelCollection.Count <= 0) + { + ActivatePage(-1); + return; + } + + if ((value < -1) || (value >= panelCollection.Count)) + { + throw new ArgumentOutOfRangeException("PageIndex", value, "The page index must be between 0 and " + Convert.ToString(panelCollection.Count - 1)); + } + + ActivatePage(value); + } + } + + protected internal void ActivatePage(int index) + { + if ((panelCollection.Count == 0) && (index >= panelCollection.Count) && (index <= 0)) + { + return; + } + + Panel p = (Panel)panelCollection[index]; + + ActivatePage(p); + } + + protected internal void ActivatePage(Panel page) + { + if (this.ActivePanel != null) + { + if (this.ActivePanel.InvokeRequired) + { + this.ActivePanel.Invoke(new MethodInvoker(() => { + this.ActivePanel.Visible = false; + })); + } + else + { + this.ActivePanel.Visible = false; + } + } + + this.ActivePanel = page; + if (this.ActivePanel != null) + { + this.ActivePanel.Parent = this; + if (!this.Contains(this.ActivePanel)) + { + this.Container.Add(this.ActivePanel); + } + + if (this.ActivePanel.InvokeRequired) + { + this.ActivePanel.Invoke(new MethodInvoker(() => { + this.ActivePanel.Dock = DockStyle.Fill; + this.ActivePanel.Visible = true; + this.ActivePanel.BringToFront(); + })); + } + else + { + this.ActivePanel.Dock = DockStyle.Fill; + this.ActivePanel.Visible = true; + this.ActivePanel.BringToFront(); + } + } + + if (this.ActivePanel != null) + { + if (this.ActivePanel.InvokeRequired) + { + this.ActivePanel.Invoke(new MethodInvoker(() => { + this.ActivePanel.Invalidate(); + })); + } + else + { + this.ActivePanel.Invalidate(); + } + } + else + { + this.Invalidate(); + } + } + +#if DEBUG + + protected override void OnResize(EventArgs e) + { + base.OnResize(e); + + if (this.DesignMode) + { + this.Invalidate(); + } + } + +#endif + + protected override void DestroyHandle() + { + base.DestroyHandle(); + + foreach (Panel p in panelCollection) + { + p.Dispose(); + } + } + + } +} \ No newline at end of file diff --git a/RyzStudio/Windows/Forms/TUserControl.cs b/RyzStudio/Windows/Forms/TUserControl.cs new file mode 100644 index 0000000..8a22585 --- /dev/null +++ b/RyzStudio/Windows/Forms/TUserControl.cs @@ -0,0 +1,73 @@ +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace RyzStudio.Windows.Forms +{ + public class TUserControl : UserControl + { + + public TUserControl() : base() + { + + } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public override Image BackgroundImage { get => base.BackgroundImage; set => base.BackgroundImage = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public override ImageLayout BackgroundImageLayout { get => base.BackgroundImageLayout; set => base.BackgroundImageLayout = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new BorderStyle BorderStyle { get => base.BorderStyle; set => base.BorderStyle = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public override Cursor Cursor { get => base.Cursor; set => base.Cursor = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public override Font Font { get => base.Font; set => base.Font = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public override Color ForeColor { get => base.ForeColor; set => base.ForeColor = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public override RightToLeft RightToLeft { get => base.RightToLeft; set => base.RightToLeft = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new bool UseWaitCursor { get => base.UseWaitCursor; set => base.UseWaitCursor = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public override bool AllowDrop { get => base.AllowDrop; set => base.AllowDrop = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public override AutoValidate AutoValidate { get => base.AutoValidate; set => base.AutoValidate = value; } + + //[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + //public override ContextMenuStrip ContextMenuStrip { get => base.ContextMenuStrip; set => base.ContextMenuStrip = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new ImeMode ImeMode { get => base.ImeMode; set => base.ImeMode = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public override bool AutoScroll { get => base.AutoScroll; set => base.AutoScroll = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new Size AutoScrollMargin { get => base.AutoScrollMargin; set => base.AutoScrollMargin = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new Size AutoScrollMinSize { get => base.AutoScrollMinSize; set => base.AutoScrollMinSize = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public override bool AutoSize { get => base.AutoSize; set => base.AutoSize = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new AutoSizeMode AutoSizeMode { get => base.AutoSizeMode; set => base.AutoSizeMode = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public override Size MaximumSize { get => base.MaximumSize; set => base.MaximumSize = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public override Size MinimumSize { get => base.MinimumSize; set => base.MinimumSize = value; } + + } +} \ No newline at end of file diff --git a/RyzStudio/Windows/Forms/ThreadControl.cs b/RyzStudio/Windows/Forms/ThreadControl.cs new file mode 100644 index 0000000..28f909e --- /dev/null +++ b/RyzStudio/Windows/Forms/ThreadControl.cs @@ -0,0 +1,633 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace RyzStudio.Windows.Forms +{ + public class ThreadControl + { + public static void Add(Control control, Control value) + { + if (control.InvokeRequired) + { + control.Invoke(new MethodInvoker(() => + { + control.Controls.Add(value); + })); + } + else + { + control.Controls.Add(value); + } + } + + public static void Add(ListBox control, string value) + { + if (control.InvokeRequired) + { + control.Invoke(new MethodInvoker(() => { + control.Items.Add(value); + })); + } + else + { + control.Items.Add(value); + } + } + + //public static void Add(FlowLayoutPanel control, Control value) + //{ + // if (control.InvokeRequired) + // { + // control.Invoke(new MethodInvoker(() => { + // control.Controls.Add(value); + // })); + // } + // else + // { + // control.Controls.Add(value); + // } + //} + + public static int Add(TreeView control, TreeNode value) + { + int n = -1; + + if (control.InvokeRequired) + { + control.Invoke(new MethodInvoker(() => { + n = control.Nodes.Add(value); + })); + } + else + { + n = control.Nodes.Add(value); + } + + return n; + } + + public static int Add(TreeNode control, TreeNode value) + { + int n = -1; + + if (control.TreeView.InvokeRequired) + { + control.TreeView.Invoke(new MethodInvoker(() => { + n = control.Nodes.Add(value); + })); + } + else + { + n = control.Nodes.Add(value); + } + + return n; + } + + public static int Add(DataGridView control, object[] value) + { + int n = -1; + + if (control.InvokeRequired) + { + control.Invoke(new MethodInvoker(() => { + n = control.Rows.Add(value); + })); + } + else + { + n = control.Rows.Add(value); + } + + return n; + } + + public static int Add(DataGridView control, object[] value, object tag) + { + int n = -1; + + if (control.InvokeRequired) + { + control.Invoke(new MethodInvoker(() => { + n = control.Rows.Add(value); + control.Rows[n].Tag = tag; + })); + } + else + { + n = control.Rows.Add(value); + control.Rows[n].Tag = tag; + } + + return n; + } + + public static TreeNode Add(TreeView control, string key, string text) + { + TreeNode rv = null; + + if (control.InvokeRequired) + { + control.Invoke(new MethodInvoker(() => { + rv = control.Nodes.Add(key, text); + })); + } + else + { + rv = control.Nodes.Add(key, text); + } + + return rv; + } + + public static TreeNode Add(TreeNode control, string key, string text) + { + TreeNode rv = null; + + if (control.TreeView.InvokeRequired) + { + control.TreeView.Invoke(new MethodInvoker(() => { + rv = control.Nodes.Add(key, text); + })); + } + else + { + rv = control.Nodes.Add(key, text); + } + + return rv; + } + + public static TreeNode Add(TreeView parentControl, TreeNodeCollection control, string key, string text, int imageIndex, int selectedImageIndex) + { + TreeNode rv = null; + + if (parentControl.InvokeRequired) + { + parentControl.Invoke(new MethodInvoker(() => { + rv = control.Add(key, text, imageIndex, selectedImageIndex); + })); + } + else + { + rv = control.Add(key, text, imageIndex, selectedImageIndex); + } + + return rv; + } + + public static void AddLine(RichTextBox control, string text) + { + if (control.InvokeRequired) + { + control.Invoke(new MethodInvoker(() => + { + control.Text += text + Environment.NewLine; + })); + } + else + { + control.Text += text + Environment.NewLine; + } + } + + public static void Clear(ListBox control) + { + if (control.InvokeRequired) + { + control.Invoke(new MethodInvoker(() => { + control.Items.Clear(); + })); + } + else + { + control.Items.Clear(); + } + } + + public static void Clear(FlowLayoutPanel control) + { + if (control.InvokeRequired) + { + control.Invoke(new MethodInvoker(() => { + control.Controls.Clear(); + })); + } + else + { + control.Controls.Clear(); + } + } + + public static void Clear(TreeView control) + { + if (control.InvokeRequired) + { + control.Invoke(new MethodInvoker(() => { + control.Nodes.Clear(); + })); + } + else + { + control.Nodes.Clear(); + } + } + + public static void Clear(Label control) => SetText(control, string.Empty); + + public static void Clear(PictureBox control) + { + if (control.InvokeRequired) + { + control.Invoke(new MethodInvoker(() => + { + control.Image = null; + })); + } + else + { + control.Image = null; + } + } + + public static void Clear(DataGridView control) + { + if (control.InvokeRequired) + { + control.Invoke(new MethodInvoker(() => + { + control.Rows.Clear(); + })); + } + else + { + control.Rows.Clear(); + } + } + + public static void Expand(TreeNode control) + { + if (control.TreeView.InvokeRequired) + { + control.TreeView.Invoke(new MethodInvoker(() => { + control.Expand(); + })); + } + else + { + control.Expand(); + } + } + + + public static List FindChildControl(Control control) where T : Control + { + List rs = new List(); + + foreach (Control item in control.Controls) + { + var ctr = item as T; + if (ctr == null) + { + rs.AddRange(FindChildControl(item)); + } + else + { + rs.Add(ctr); + } + } + + return rs; + } + + public static string GetText(Control control, bool doTrim = true) + { + string rv = string.Empty; + + if (control.InvokeRequired) + { + control.Invoke(new MethodInvoker(() => { + rv = (doTrim ? control.Text?.Trim() : control.Text); + })); + } + else + { + rv = (doTrim ? control.Text?.Trim() : control.Text); + } + + return rv; + } + + public static void SetChecked(ToolStripMenuItem control, bool value) + { + if (control.GetCurrentParent().InvokeRequired) + { + control.GetCurrentParent().Invoke(new MethodInvoker(() => + { + control.Checked = value; + })); + } + else + { + control.Checked = value; + } + } + + public static void SetEnable(Control control, bool value) + { + if (control.InvokeRequired) + { + control.Invoke(new MethodInvoker(() => + { + control.Enabled = value; + })); + } + else + { + control.Enabled = value; + } + } + + public static void SetEnable(ToolStripMenuItem control, bool value) + { + if (control.GetCurrentParent().InvokeRequired) + { + control.GetCurrentParent().Invoke(new MethodInvoker(() => + { + control.Enabled = value; + })); + } + else + { + control.Enabled = value; + } + } + + public static void SetFocus(Control control) + { + if (control.InvokeRequired) + { + control.Invoke(new MethodInvoker(() => + { + control.Focus(); + })); + } + else + { + control.Focus(); + } + } + + public static int GetValue(NumericUpDown sender) + { + int rv = 0; + + if (sender.InvokeRequired) + { + sender.Invoke(new MethodInvoker(() => { + rv = (int)sender.Value; + })); + } + else + { + rv = (int)sender.Value; + } + + return rv; + } + + public static string GetSelectedValue(ListBox sender) + { + string rv = string.Empty; + + if (sender.InvokeRequired) + { + sender.Invoke(new MethodInvoker(() => { + rv = (sender.SelectedItem == null) ? string.Empty : sender.SelectedItem.ToString(); + })); + } + else + { + rv = (sender.SelectedItem == null) ? string.Empty : sender.SelectedItem.ToString(); + } + + return rv; + } + + public static void SetHeight(Control control, int value) + { + if (control.InvokeRequired) + { + control.Invoke(new MethodInvoker(() => { + control.Height = value; + })); + } + else + { + control.Height = value; + } + } + + public static void SetLocation(Control control, Point value) + { + if (control.InvokeRequired) + { + control.Invoke(new MethodInvoker(() => { + control.Location = value; + })); + } + else + { + control.Location = value; + } + } + + public static void SetClientSize(Control control, int width, int height) => SetClientSize(control, new Size(width, height)); + + public static void SetClientSize(Control control, Size value) + { + if (control.InvokeRequired) + { + control.Invoke(new MethodInvoker(() => { + control.ClientSize = value; + })); + } + else + { + control.ClientSize = value; + } + } + + public static void SetClientHeight(Control control, int value) + { + if (control.InvokeRequired) + { + control.Invoke(new MethodInvoker(() => { + control.ClientSize = new Size(control.ClientSize.Width, value); + })); + } + else + { + control.ClientSize = new Size(control.ClientSize.Width, value); + } + } + + public static void SetSize(Control control, int width, int height) => SetSize(control, new Size(width, height)); + + public static void SetSize(Control control, Size value) + { + if (control.InvokeRequired) + { + control.Invoke(new MethodInvoker(() => { + control.Size = value; + })); + } + else + { + control.Size = value; + } + } + + public static void SetText(Control control, string text) + { + if (control.InvokeRequired) + { + control.Invoke(new MethodInvoker(() => + { + control.Text = text; + })); + } + else + { + control.Text = text; + } + } + + public static void SetTopMost(Form control, bool value) + { + if (control.InvokeRequired) + { + control.Invoke(new MethodInvoker(() => { + control.TopMost = value; + })); + } + else + { + control.TopMost = value; + } + } + + public static void SetValue(Control control, string value) + { + if (control.InvokeRequired) + { + control.Invoke(new MethodInvoker(() => { + control.Text = value; + })); + } + else + { + control.Text = value; + } + } + + public static void SetValue(PictureBox control, Image value) + { + if (control.InvokeRequired) + { + control.Invoke(new MethodInvoker(() => + { + control.Image = value; + })); + } + else + { + control.Image = value; + } + } + + public static void SetVisible(Control control, bool value) + { + if (control.InvokeRequired) + { + control.Invoke(new MethodInvoker(() => { + control.Visible = value; + })); + } + else + { + control.Visible = value; + } + } + + public static void SetVisible(Form control, bool value) + { + if (control.InvokeRequired) + { + control.Invoke(new MethodInvoker(() => { + if (value) + { + //control.ShowInTaskbar = value; + //control.Opacity = 100; + control.Visible = value; + } + else + { + control.Visible = value; + //control.ShowInTaskbar = value; + //control.Opacity = 0; + } + })); + } + else + { + if (value) + { + //control.ShowInTaskbar = value; + //control.Opacity = 100; + control.Visible = value; + } + else + { + control.Visible = value; + //control.ShowInTaskbar = value; + //control.Opacity = 0; + } + } + } + + public static void SetWidth(Control control, int value) + { + if (control.InvokeRequired) + { + control.Invoke(new MethodInvoker(() => { + control.Width = value; + })); + } + else + { + control.Width = value; + } + } + + public static void SetClientWidth(Control control, int value) + { + if (control.InvokeRequired) + { + control.Invoke(new MethodInvoker(() => { + control.ClientSize = new Size(value, control.ClientSize.Height); + })); + } + else + { + control.ClientSize = new Size(value, control.ClientSize.Height); + } + } + + } +} \ No newline at end of file diff --git a/RyzStudio/Windows/ThemedForms/BorderlessForm.Designer.cs b/RyzStudio/Windows/ThemedForms/BorderlessForm.Designer.cs new file mode 100644 index 0000000..d39ad3c --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/BorderlessForm.Designer.cs @@ -0,0 +1,193 @@ +using RyzStudio.Windows.Forms; + +namespace RyzStudio.Windows.ThemedForms +{ + partial class BorderlessForm + { + /// + /// 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(BorderlessForm)); + this.label1 = new System.Windows.Forms.Label(); + this.panel1 = new System.Windows.Forms.Panel(); + this.area1 = new System.Windows.Forms.Panel(); + this.pictureBox4 = new RyzStudio.Windows.Forms.TImageBox(); + this.pictureBox2 = new RyzStudio.Windows.Forms.TImageBox(); + this.pictureBox1 = new RyzStudio.Windows.Forms.TImageBox(); + this.pictureBox3 = new RyzStudio.Windows.Forms.TImageBox(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox4)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).BeginInit(); + this.SuspendLayout(); + // + // label1 + // + this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.label1.BackColor = System.Drawing.Color.Transparent; + this.label1.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(241)))), ((int)(((byte)(241)))), ((int)(((byte)(241))))); + this.label1.Location = new System.Drawing.Point(1, 1); + this.label1.Name = "label1"; + this.label1.Padding = new System.Windows.Forms.Padding(48, 0, 0, 0); + this.label1.Size = new System.Drawing.Size(454, 48); + this.label1.TabIndex = 148; + this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.label1.DoubleClick += new System.EventHandler(this.label1_DoubleClick); + this.label1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.label1_MouseClick); + this.label1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.label1_MouseDown); + this.label1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.label1_MouseMove); + this.label1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.label1_MouseUp); + // + // panel1 + // + this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.panel1.BackColor = System.Drawing.Color.Transparent; + this.panel1.Cursor = System.Windows.Forms.Cursors.SizeNWSE; + this.panel1.Location = new System.Drawing.Point(594, 674); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(6, 6); + this.panel1.TabIndex = 150; + this.panel1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseDown); + this.panel1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseMove); + this.panel1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseUp); + // + // area1 + // + this.area1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.area1.BackColor = System.Drawing.Color.Transparent; + this.area1.Cursor = System.Windows.Forms.Cursors.SizeNS; + this.area1.Location = new System.Drawing.Point(1, 674); + this.area1.Name = "area1"; + this.area1.Size = new System.Drawing.Size(592, 6); + this.area1.TabIndex = 152; + this.area1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.panel2_MouseDown); + this.area1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.panel2_MouseMove); + this.area1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.panel2_MouseUp); + // + // pictureBox4 + // + this.pictureBox4.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.pictureBox4.BackColor = System.Drawing.Color.Transparent; + this.pictureBox4.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; + this.pictureBox4.ErrorImage = null; + this.pictureBox4.ImageHover = global::hiim.dply.Properties.Resources.form20_menu2; + this.pictureBox4.Image = global::hiim.dply.Properties.Resources.form20_menu; + this.pictureBox4.InitialImage = null; + this.pictureBox4.Location = new System.Drawing.Point(460, 11); + this.pictureBox4.Name = "pictureBox4"; + this.pictureBox4.NormalImage = global::hiim.dply.Properties.Resources.form20_menu; + this.pictureBox4.Size = new System.Drawing.Size(28, 28); + this.pictureBox4.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage; + this.pictureBox4.TabIndex = 149; + this.pictureBox4.TabStop = false; + // + // pictureBox2 + // + this.pictureBox2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.pictureBox2.BackColor = System.Drawing.Color.Transparent; + this.pictureBox2.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; + this.pictureBox2.ErrorImage = null; + this.pictureBox2.ImageHover = global::hiim.dply.Properties.Resources.form20_maximise2; + this.pictureBox2.Image = global::hiim.dply.Properties.Resources.form20_maximise; + this.pictureBox2.InitialImage = null; + this.pictureBox2.Location = new System.Drawing.Point(528, 11); + this.pictureBox2.Name = "pictureBox2"; + this.pictureBox2.NormalImage = global::hiim.dply.Properties.Resources.form20_maximise; + this.pictureBox2.Size = new System.Drawing.Size(28, 28); + this.pictureBox2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage; + this.pictureBox2.TabIndex = 147; + this.pictureBox2.TabStop = false; + // + // pictureBox1 + // + this.pictureBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.pictureBox1.BackColor = System.Drawing.Color.Transparent; + this.pictureBox1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; + this.pictureBox1.ErrorImage = null; + this.pictureBox1.ImageHover = global::hiim.dply.Properties.Resources.form20_minimise2; + this.pictureBox1.Image = global::hiim.dply.Properties.Resources.form20_minimise; + this.pictureBox1.InitialImage = null; + this.pictureBox1.Location = new System.Drawing.Point(494, 11); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.NormalImage = global::hiim.dply.Properties.Resources.form20_minimise; + this.pictureBox1.Size = new System.Drawing.Size(28, 28); + this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage; + this.pictureBox1.TabIndex = 146; + this.pictureBox1.TabStop = false; + // + // pictureBox3 + // + this.pictureBox3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.pictureBox3.BackColor = System.Drawing.Color.Transparent; + this.pictureBox3.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; + this.pictureBox3.ErrorImage = null; + this.pictureBox3.ImageHover = global::hiim.dply.Properties.Resources.form20_close2; + this.pictureBox3.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox3.Image"))); + this.pictureBox3.InitialImage = null; + this.pictureBox3.Location = new System.Drawing.Point(562, 11); + this.pictureBox3.Name = "pictureBox3"; + this.pictureBox3.NormalImage = ((System.Drawing.Image)(resources.GetObject("pictureBox3.NormalImage"))); + this.pictureBox3.Size = new System.Drawing.Size(28, 28); + this.pictureBox3.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage; + this.pictureBox3.TabIndex = 145; + this.pictureBox3.TabStop = false; + // + // BorderlessForm + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.BackColor = System.Drawing.Color.WhiteSmoke; + this.ClientSize = new System.Drawing.Size(600, 680); + this.Controls.Add(this.area1); + this.Controls.Add(this.panel1); + this.Controls.Add(this.pictureBox4); + this.Controls.Add(this.label1); + this.Controls.Add(this.pictureBox2); + this.Controls.Add(this.pictureBox1); + this.Controls.Add(this.pictureBox3); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.Name = "BorderlessForm"; + ((System.ComponentModel.ISupportInitialize)(this.pictureBox4)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + protected internal TImageBox pictureBox2; + protected internal TImageBox pictureBox1; + protected internal TImageBox pictureBox3; + protected internal System.Windows.Forms.Label label1; + protected internal TImageBox pictureBox4; + protected internal System.Windows.Forms.Panel panel1; + protected internal System.Windows.Forms.Panel area1; + } +} \ No newline at end of file diff --git a/RyzStudio/Windows/ThemedForms/BorderlessForm.cs b/RyzStudio/Windows/ThemedForms/BorderlessForm.cs new file mode 100644 index 0000000..840d970 --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/BorderlessForm.cs @@ -0,0 +1,409 @@ +namespace RyzStudio.Windows.ThemedForms +{ + using System; + using System.ComponentModel; + using System.Drawing; + using System.Drawing.Design; + using System.Windows.Forms; + + public partial class BorderlessForm : System.Windows.Forms.Form + { + protected bool isBusy = false; + + protected Color topFillColour = Color.FromArgb(15, 15, 15); + protected int topFillHeight = 48; + protected Color bottomFillColour = Color.FromArgb(15, 15, 15); + protected int bottomFillMargin = 19; + protected int bottomLeftMargin = 20; + protected int borderWidth = 1; + protected int menuFillWidth = 160; + protected Color menuFillColour = Color.FromArgb(179, 179, 179); + + private bool windowDragging = false; + private Point windowOffset = new Point(); + private Point windowSize = new Point(); + + public BorderlessForm() : base() + { + this.InitializeComponent(); + + this.BackColor = Color.FromArgb(247, 247, 247); + this.FormBorderStyle = FormBorderStyle.None; + this.Padding = new Padding(1); + + this.topFillColour = Color.FromArgb(51, 51, 51); + this.topFillHeight = 48; + this.bottomFillColour = Color.FromArgb(0, 152, 167); + this.bottomFillMargin = 6; + + pictureBox1.Click += pictureBox1_Click; + pictureBox2.Click += pictureBox2_Click; + pictureBox3.Click += pictureBox3_Click; + pictureBox4.Click += pictureBox4_Click; + + updatePictureBox2Image(); + } + + protected override void OnClosing(CancelEventArgs e) + { + base.OnClosing(e); + + if (this.IsBusy) + { + e.Cancel = true; + } + } + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + + Graphics g = e.Graphics; + + Rectangle areaTop = new Rectangle(this.DisplayRectangle.Left, this.Padding.Top, this.DisplayRectangle.Width, topFillHeight); + Rectangle areaBottom = new Rectangle(this.DisplayRectangle.Left, (this.DisplayRectangle.Height - bottomFillMargin + this.Padding.Top), this.DisplayRectangle.Width, bottomFillMargin); + Rectangle areaBorder = new Rectangle(this.ClientRectangle.X, this.ClientRectangle.Y, this.ClientRectangle.Width - borderWidth, this.ClientRectangle.Height - borderWidth); + + Rectangle areaMenu = new Rectangle(this.DisplayRectangle.Left, this.DisplayRectangle.Top + topFillHeight, menuFillWidth, (this.DisplayRectangle.Height - bottomFillMargin - topFillHeight)); + + // draw header + if (topFillHeight > 0) + { + g.FillRectangle(new SolidBrush(topFillColour), areaTop); + } + + // fill menu + g.FillRectangle(new SolidBrush(menuFillColour), areaMenu); + + // draw footer + if (bottomFillMargin > 0) + { + g.FillRectangle(new SolidBrush(bottomFillColour), areaBottom); + } + + // draw logo + if (this.TitleLogo != null) + { + g.DrawImageUnscaled(this.TitleLogo, this.Padding.Left, this.Padding.Top); + } + + if (this.Banner != null) + { + g.DrawImageUnscaled(this.Banner, this.Padding.Left + bottomLeftMargin, (this.DisplayRectangle.Height - this.Banner.Height - bottomFillMargin + this.Padding.Top), (this.DisplayRectangle.Width - (this.Padding.Left + this.Padding.Right)), this.Banner.Height); + } + + g.DrawRectangle(new Pen(Color.Black, borderWidth), areaBorder); + } + + protected override void OnResize(EventArgs e) + { + base.OnResize(e); + + updatePictureBox2Image(); + + this.Invalidate(); + } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new Color BackColor { get => base.BackColor; set => base.BackColor = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new FormBorderStyle FormBorderStyle { get => base.FormBorderStyle; set => base.FormBorderStyle = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new Padding Padding { get => base.Padding; set => base.Padding = value; } + + [Category("Appearance"), Browsable(true)] + public string Description + { + get + { + return label1.Text?.Replace("\n", "\\n"); + } + set + { + label1.Text = value?.Replace("\\n", "\n"); + } + } + + [Category("Appearance"), Browsable(true)] + public Image TitleLogo { get; set; } + + [Category("Appearance"), Browsable(true)] + public Image Banner { get; set; } + + [Category("Appearance"), Browsable(true)] + public bool ShowMenuButton { get => pictureBox4.Visible; set => pictureBox4.Visible = value; } + + protected virtual bool IsBusy { get => isBusy; set => isBusy = value; } + + private void pictureBox4_Click(object sender, System.EventArgs e) + { + //this.WindowState = FormWindowState.Minimized; + } + + private void pictureBox1_Click(object sender, System.EventArgs e) + { + MouseEventArgs mouseEvent = (MouseEventArgs)e; + if (mouseEvent != null) + { + if (mouseEvent.Button != MouseButtons.Left) + { + return; + } + } + + this.WindowState = FormWindowState.Minimized; + } + + private void pictureBox2_Click(object sender, System.EventArgs e) + { + MouseEventArgs mouseEvent = (MouseEventArgs)e; + if (mouseEvent != null) + { + if (mouseEvent.Button != MouseButtons.Left) + { + return; + } + } + + if (this.WindowState == FormWindowState.Maximized) + { + this.WindowState = FormWindowState.Normal; + pictureBox2.NormalImage = Resources.form20_maximise; + pictureBox2.HighlightImage = Resources.form20_maximise2; + } + else + { + this.WindowState = FormWindowState.Maximized; + pictureBox2.NormalImage = Resources.form20_restore; + pictureBox2.HighlightImage = Resources.form20_restore2; + } + } + + private void pictureBox3_Click(object sender, System.EventArgs e) + { + MouseEventArgs mouseEvent = (MouseEventArgs)e; + if (mouseEvent != null) + { + if (mouseEvent.Button != MouseButtons.Left) + { + return; + } + } + + this.Close(); + } + + public void SetValue(Label sender, string value) + { + if (sender.InvokeRequired) + { + sender.Invoke(new MethodInvoker(() => { sender.Text = value; })); + } + else + { + sender.Text = value; + } + } + + public void SetValue(GroupBox sender, string value) + { + if (sender.InvokeRequired) + { + sender.Invoke(new MethodInvoker(() => { sender.Text = value; })); + } + else + { + sender.Text = value; + } + } + + public void AddValue(ListBox sender, string value) + { + if (sender.InvokeRequired) + { + sender.Invoke(new MethodInvoker(() => { sender.Items.Add(value); })); + } + else + { + sender.Items.Add(value); + } + } + + public void AddControl(FlowLayoutPanel sender, Control value) + { + if (sender.InvokeRequired) + { + sender.Invoke(new MethodInvoker(() => + { + sender.Controls.Add(value); + })); + } + else + { + sender.Controls.Add(value); + } + } + + public void ClearValues(ListBox sender) + { + if (sender.InvokeRequired) + { + sender.Invoke(new MethodInvoker(() => { sender.Items.Clear(); })); + } + else + { + sender.Items.Clear(); + } + } + + public string GetValue(ListBox sender) + { + string rv = string.Empty; + + if (sender.InvokeRequired) + { + sender.Invoke(new MethodInvoker(() => { rv = (sender.SelectedItem == null) ? string.Empty : sender.SelectedItem.ToString(); })); + } + else + { + rv = (sender.SelectedItem == null) ? string.Empty : sender.SelectedItem.ToString(); + } + + return rv; + } + + public string GetValue(TextBox sender) + { + string rv = string.Empty; + + if (sender.InvokeRequired) + { + sender.Invoke(new MethodInvoker(() => { rv = sender.Text.Trim(); })); + } + else + { + rv = sender.Text.Trim(); + } + + return rv; + } + + public int GetValue(NumericUpDown sender) + { + int rv = 0; + + if (sender.InvokeRequired) + { + sender.Invoke(new MethodInvoker(() => { rv = (int)sender.Value; })); + } + else + { + rv = (int)sender.Value; + } + + return rv; + } + + protected void updatePictureBox2Image() + { + if (this.WindowState == FormWindowState.Maximized) + { + pictureBox2.NormalImage = Resources.form20_restore; + pictureBox2.HighlightImage = Resources.form20_restore2; + } + else + { + pictureBox2.NormalImage = Resources.form20_maximise; + pictureBox2.HighlightImage = Resources.form20_maximise2; + } + } + + private void label1_MouseDown(object sender, MouseEventArgs e) + { + if (e.Button != MouseButtons.Left) + { + return; + } + + windowDragging = true; + windowOffset = e.Location; + } + + private void label1_MouseUp(object sender, MouseEventArgs e) + { + windowDragging = false; + } + + private void label1_MouseMove(object sender, MouseEventArgs e) + { + if (windowDragging) + { + Point currentScreenPos = PointToScreen(e.Location); + Location = new Point(currentScreenPos.X - windowOffset.X, currentScreenPos.Y - windowOffset.Y); + } + } + + private void label1_DoubleClick(object sender, EventArgs e) => pictureBox2_Click(sender, e); + + private void label1_MouseClick(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Middle) + { + this.TopMost = !this.TopMost; + } + } + + private void panel1_MouseDown(object sender, MouseEventArgs e) + { + if (e.Button != MouseButtons.Left) + { + return; + } + + windowDragging = true; + windowOffset = e.Location; + windowSize = new Point(this.Width, this.Height); + } + + private void panel1_MouseUp(object sender, MouseEventArgs e) + { + windowDragging = false; + } + + private void panel1_MouseMove(object sender, MouseEventArgs e) + { + if (windowDragging) + { + this.Size = new Size(e.X - windowOffset.X + this.Width, e.Y - windowOffset.Y + this.Height); + } + } + + private void panel2_MouseDown(object sender, MouseEventArgs e) + { + if (e.Button != MouseButtons.Left) + { + return; + } + + windowDragging = true; + windowOffset = e.Location; + windowSize = new Point(this.Width, this.Height); + } + + private void panel2_MouseUp(object sender, MouseEventArgs e) + { + windowDragging = false; + } + + private void panel2_MouseMove(object sender, MouseEventArgs e) + { + if (windowDragging) + { + this.Size = new Size(windowSize.X, e.Y - windowOffset.Y + this.Height); + } + } + + } +} \ No newline at end of file diff --git a/RyzStudio/Windows/ThemedForms/BorderlessForm.resx b/RyzStudio/Windows/ThemedForms/BorderlessForm.resx new file mode 100644 index 0000000..db173e1 --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/BorderlessForm.resx @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + True + + + True + + + True + + + + + iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAADnSURBVDhP1ZVB + DoIwEEW7whNo9Cri/QCv5Y4YEoTWxK71Gvqn+W2AgEkbNvxkYPgzfWkpKcpau9NaX/u+/yC+iSFjK3Ay + RdhcU0qUChc3s67rzipRGJ8T+JYHR2ctWYGzXSC8Gzbs3rbtgZaSXDyp0QoKnJBMBK8WH5vVCUhCcvbX + bAuivwxsmmaP2TxYfyE3zJ/Ij2wLYu3/OxQoah4kYedgIt8TDTTGnFgeyfcsAodLxn205Dlo4IRkInjr + bgq8dT+bWG0L6A/WnLVo4b1eyHDHV8WHNaJwvwAkJeI9KMSGjC201tkP+AimzgF8cMEAAAAASUVORK5C + YII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + xAAADsQBlSsOGwAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAADnSURBVDhP1ZVB + DoIwEEW7whNo9Cri/QCv5Y4YEoTWxK71Gvqn+W2AgEkbNvxkYPgzfWkpKcpau9NaX/u+/yC+iSFjK3Ay + RdhcU0qUChc3s67rzipRGJ8T+JYHR2ctWYGzXSC8Gzbs3rbtgZaSXDyp0QoKnJBMBK8WH5vVCUhCcvbX + bAuivwxsmmaP2TxYfyE3zJ/Ij2wLYu3/OxQoah4kYedgIt8TDTTGnFgeyfcsAodLxn205Dlo4IRkInjr + bgq8dT+bWG0L6A/WnLVo4b1eyHDHV8WHNaJwvwAkJeI9KMSGjC201tkP+AimzgF8cMEAAAAASUVORK5C + YII= + + + \ No newline at end of file diff --git a/RyzStudio/Windows/ThemedForms/BorderlessToolForm.Designer.cs b/RyzStudio/Windows/ThemedForms/BorderlessToolForm.Designer.cs new file mode 100644 index 0000000..75f86a0 --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/BorderlessToolForm.Designer.cs @@ -0,0 +1,191 @@ +namespace RyzStudio.Windows.ThemedForms +{ + partial class BorderlessToolForm + { + /// + /// 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() + { + this.lblDescription = new System.Windows.Forms.Label(); + this.panel1 = new System.Windows.Forms.Panel(); + this.imgbxMenu = new RyzStudio.Windows.Forms.ImageBox(); + this.imgbxMaximise = new RyzStudio.Windows.Forms.ImageBox(); + this.imgbxMinimise = new RyzStudio.Windows.Forms.ImageBox(); + this.imgbxClose = new RyzStudio.Windows.Forms.ImageBox(); + this.area1 = new System.Windows.Forms.Panel(); + ((System.ComponentModel.ISupportInitialize)(this.imgbxMenu)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.imgbxMaximise)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.imgbxMinimise)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.imgbxClose)).BeginInit(); + this.SuspendLayout(); + // + // lblDescription + // + this.lblDescription.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lblDescription.BackColor = System.Drawing.Color.Transparent; + this.lblDescription.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblDescription.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(241)))), ((int)(((byte)(241)))), ((int)(((byte)(241))))); + this.lblDescription.Location = new System.Drawing.Point(1, 1); + this.lblDescription.Name = "lblDescription"; + this.lblDescription.Padding = new System.Windows.Forms.Padding(10, 0, 0, 0); + this.lblDescription.Size = new System.Drawing.Size(194, 30); + this.lblDescription.TabIndex = 148; + this.lblDescription.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.lblDescription.DoubleClick += new System.EventHandler(this.label1_DoubleClick); + this.lblDescription.MouseClick += new System.Windows.Forms.MouseEventHandler(this.label1_MouseClick); + this.lblDescription.MouseDown += new System.Windows.Forms.MouseEventHandler(this.label1_MouseDown); + this.lblDescription.MouseMove += new System.Windows.Forms.MouseEventHandler(this.label1_MouseMove); + this.lblDescription.MouseUp += new System.Windows.Forms.MouseEventHandler(this.label1_MouseUp); + // + // panel1 + // + this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.panel1.BackColor = System.Drawing.Color.Transparent; + this.panel1.Cursor = System.Windows.Forms.Cursors.SizeNWSE; + this.panel1.Location = new System.Drawing.Point(335, 595); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(5, 5); + this.panel1.TabIndex = 150; + this.panel1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseDown); + this.panel1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseMove); + this.panel1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseUp); + // + // imgbxMenu + // + this.imgbxMenu.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.imgbxMenu.BackColor = System.Drawing.Color.Transparent; + this.imgbxMenu.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; + this.imgbxMenu.ErrorImage = null; + this.imgbxMenu.HighlightImage = global::AppLauncher.Properties.Resources.form16_menu2; + this.imgbxMenu.Image = global::AppLauncher.Properties.Resources.form16_menu; + this.imgbxMenu.InitialImage = null; + this.imgbxMenu.Location = new System.Drawing.Point(224, 4); + this.imgbxMenu.Name = "imgbxMenu"; + this.imgbxMenu.NormalImage = global::AppLauncher.Properties.Resources.form16_menu; + this.imgbxMenu.Size = new System.Drawing.Size(24, 24); + this.imgbxMenu.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage; + this.imgbxMenu.TabIndex = 149; + this.imgbxMenu.TabStop = false; + // + // imgbxMaximise + // + this.imgbxMaximise.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.imgbxMaximise.BackColor = System.Drawing.Color.Transparent; + this.imgbxMaximise.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; + this.imgbxMaximise.ErrorImage = null; + this.imgbxMaximise.HighlightImage = global::AppLauncher.Properties.Resources.form16_maximise2; + this.imgbxMaximise.Image = global::AppLauncher.Properties.Resources.form16_maximise; + this.imgbxMaximise.InitialImage = null; + this.imgbxMaximise.Location = new System.Drawing.Point(280, 4); + this.imgbxMaximise.Name = "imgbxMaximise"; + this.imgbxMaximise.NormalImage = global::AppLauncher.Properties.Resources.form16_maximise; + this.imgbxMaximise.Size = new System.Drawing.Size(24, 24); + this.imgbxMaximise.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage; + this.imgbxMaximise.TabIndex = 147; + this.imgbxMaximise.TabStop = false; + // + // imgbxMinimise + // + this.imgbxMinimise.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.imgbxMinimise.BackColor = System.Drawing.Color.Transparent; + this.imgbxMinimise.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; + this.imgbxMinimise.ErrorImage = null; + this.imgbxMinimise.HighlightImage = global::AppLauncher.Properties.Resources.form16_minimise2; + this.imgbxMinimise.Image = global::AppLauncher.Properties.Resources.form16_minimise; + this.imgbxMinimise.InitialImage = null; + this.imgbxMinimise.Location = new System.Drawing.Point(252, 4); + this.imgbxMinimise.Name = "imgbxMinimise"; + this.imgbxMinimise.NormalImage = global::AppLauncher.Properties.Resources.form16_minimise; + this.imgbxMinimise.Size = new System.Drawing.Size(24, 24); + this.imgbxMinimise.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage; + this.imgbxMinimise.TabIndex = 146; + this.imgbxMinimise.TabStop = false; + // + // imgbxClose + // + this.imgbxClose.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.imgbxClose.BackColor = System.Drawing.Color.Transparent; + this.imgbxClose.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; + this.imgbxClose.ErrorImage = null; + this.imgbxClose.HighlightImage = global::AppLauncher.Properties.Resources.form16_close2; + this.imgbxClose.Image = global::AppLauncher.Properties.Resources.form16_close; + this.imgbxClose.InitialImage = null; + this.imgbxClose.Location = new System.Drawing.Point(308, 4); + this.imgbxClose.Name = "imgbxClose"; + this.imgbxClose.NormalImage = global::AppLauncher.Properties.Resources.form16_close; + this.imgbxClose.Size = new System.Drawing.Size(24, 24); + this.imgbxClose.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage; + this.imgbxClose.TabIndex = 145; + this.imgbxClose.TabStop = false; + // + // area1 + // + this.area1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.area1.BackColor = System.Drawing.Color.Transparent; + this.area1.Cursor = System.Windows.Forms.Cursors.SizeNS; + this.area1.Location = new System.Drawing.Point(0, 595); + this.area1.Name = "area1"; + this.area1.Size = new System.Drawing.Size(334, 5); + this.area1.TabIndex = 151; + this.area1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.panel2_MouseDown); + this.area1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.panel2_MouseMove); + this.area1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.panel2_MouseUp); + // + // BorderlessToolForm + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.BackColor = System.Drawing.Color.WhiteSmoke; + this.ClientSize = new System.Drawing.Size(340, 600); + this.Controls.Add(this.area1); + this.Controls.Add(this.panel1); + this.Controls.Add(this.imgbxMenu); + this.Controls.Add(this.lblDescription); + this.Controls.Add(this.imgbxMaximise); + this.Controls.Add(this.imgbxMinimise); + this.Controls.Add(this.imgbxClose); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.MinimumSize = new System.Drawing.Size(40, 0); + this.Name = "BorderlessToolForm"; + ((System.ComponentModel.ISupportInitialize)(this.imgbxMenu)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.imgbxMaximise)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.imgbxMinimise)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.imgbxClose)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + protected internal Forms.ImageBox imgbxMaximise; + protected internal Forms.ImageBox imgbxMinimise; + protected internal Forms.ImageBox imgbxClose; + protected internal System.Windows.Forms.Label lblDescription; + protected internal Forms.ImageBox imgbxMenu; + protected internal System.Windows.Forms.Panel panel1; + protected internal System.Windows.Forms.Panel area1; + } +} \ No newline at end of file diff --git a/RyzStudio/Windows/ThemedForms/BorderlessToolForm.cs b/RyzStudio/Windows/ThemedForms/BorderlessToolForm.cs new file mode 100644 index 0000000..3c17b0b --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/BorderlessToolForm.cs @@ -0,0 +1,394 @@ +namespace RyzStudio.Windows.ThemedForms +{ + using System; + using System.ComponentModel; + using System.Drawing; + using System.Drawing.Design; + using System.Windows.Forms; + using Resources = AppLauncher.Properties.Resources; + + public partial class BorderlessToolForm : System.Windows.Forms.Form + { + protected bool isBusy = false; + + protected Color topFillColour = Color.FromArgb(15, 15, 15); + protected int topFillHeight = 32; + protected int borderWidth = 1; + + private bool windowDragging = false; + private Point windowOffset = new Point(); + private Point windowSize = new Point(); + + public BorderlessToolForm() : base() + { + this.InitializeComponent(); + + this.BackColor = Color.FromArgb(246, 246, 246); + this.Padding = new Padding(1); + + this.topFillColour = Color.FromArgb(51, 51, 51); + this.topFillHeight = 32; + + this.BackColor = Color.FromArgb(179, 179, 179); + this.FormBorderStyle = FormBorderStyle.None; + + imgbxMinimise.Click += pictureBox1_Click; + imgbxMaximise.Click += pictureBox2_Click; + imgbxClose.Click += pictureBox3_Click; + imgbxMenu.Click += pictureBox4_Click; + + updatePictureBox2Image(); + } + + protected override void OnClosing(CancelEventArgs e) + { + base.OnClosing(e); + + if (this.IsBusy) + { + e.Cancel = true; + } + } + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + + Graphics g = e.Graphics; + + Rectangle areaTop = new Rectangle(this.DisplayRectangle.Left, this.Padding.Top, this.DisplayRectangle.Width, topFillHeight); + Rectangle areaBorder = new Rectangle(this.ClientRectangle.X, this.ClientRectangle.Y, this.ClientRectangle.Width - borderWidth, this.ClientRectangle.Height - borderWidth); + + // draw header + if (topFillHeight > 0) + { + g.FillRectangle(new SolidBrush(topFillColour), areaTop); + } + + // draw logo + //if (this.TitleLogo != null) + //{ + // g.DrawImageUnscaled(this.TitleLogo, this.Padding.Left, this.Padding.Top); + //} + + g.DrawRectangle(new Pen(Color.Black, borderWidth), areaBorder); + } + + protected override void OnResize(EventArgs e) + { + base.OnResize(e); + + updatePictureBox2Image(); + + this.Invalidate(); + } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new Color BackColor { get => base.BackColor; set => base.BackColor = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new FormBorderStyle FormBorderStyle { get => base.FormBorderStyle; set => base.FormBorderStyle = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new Padding Padding { get => base.Padding; set => base.Padding = value; } + + [Category("Appearance"), Browsable(true)] + public string Description + { + get + { + return lblDescription.Text?.Replace("\n", "\\n"); + } + set + { + lblDescription.Text = value?.Replace("\\n", "\n"); + } + } + + //[Category("Appearance"), Browsable(true)] + //public Image TitleLogo { get; set; } + + [Category("Appearance"), Browsable(true)] + public Image Banner { get; set; } + + [Category("Appearance"), Browsable(true)] + public bool ShowMenuButton { get => imgbxMenu.Visible; set => imgbxMenu.Visible = value; } + + [Category("Appearance"), Browsable(true)] + public bool ShowMinimiseButton { get => imgbxMinimise.Visible; set => imgbxMinimise.Visible = value; } + + [Category("Appearance"), Browsable(true)] + public bool ShowMaximiseButton { get => imgbxMaximise.Visible; set => imgbxMaximise.Visible = value; } + + protected virtual bool IsBusy { get => isBusy; set => isBusy = value; } + + private void pictureBox4_Click(object sender, System.EventArgs e) + { + //this.WindowState = FormWindowState.Minimized; + } + + private void pictureBox1_Click(object sender, System.EventArgs e) + { + MouseEventArgs mouseEvent = (MouseEventArgs)e; + if (mouseEvent != null) + { + if (mouseEvent.Button != MouseButtons.Left) + { + return; + } + } + + this.WindowState = FormWindowState.Minimized; + } + + private void pictureBox2_Click(object sender, System.EventArgs e) + { + MouseEventArgs mouseEvent = (MouseEventArgs)e; + if (mouseEvent != null) + { + if (mouseEvent.Button != MouseButtons.Left) + { + return; + } + } + + if (this.WindowState == FormWindowState.Maximized) + { + this.WindowState = FormWindowState.Normal; + imgbxMaximise.NormalImage = Resources.form16_maximise; + imgbxMaximise.HighlightImage = Resources.form16_maximise2; + } + else + { + this.WindowState = FormWindowState.Maximized; + imgbxMaximise.NormalImage = Resources.form16_restore; + imgbxMaximise.HighlightImage = Resources.form16_restore2; + } + } + + private void pictureBox3_Click(object sender, System.EventArgs e) + { + MouseEventArgs mouseEvent = (MouseEventArgs)e; + if (mouseEvent != null) + { + if (mouseEvent.Button != MouseButtons.Left) + { + return; + } + } + + this.Close(); + } + + public void SetValue(Label sender, string value) + { + if (sender.InvokeRequired) + { + sender.Invoke(new MethodInvoker(() => { sender.Text = value; })); + } + else + { + sender.Text = value; + } + } + + public void SetValue(GroupBox sender, string value) + { + if (sender.InvokeRequired) + { + sender.Invoke(new MethodInvoker(() => { sender.Text = value; })); + } + else + { + sender.Text = value; + } + } + + public void AddValue(ListBox sender, string value) + { + if (sender.InvokeRequired) + { + sender.Invoke(new MethodInvoker(() => { sender.Items.Add(value); })); + } + else + { + sender.Items.Add(value); + } + } + + public void AddControl(FlowLayoutPanel sender, Control value) + { + if (sender.InvokeRequired) + { + sender.Invoke(new MethodInvoker(() => + { + sender.Controls.Add(value); + })); + } + else + { + sender.Controls.Add(value); + } + } + + public void ClearValues(ListBox sender) + { + if (sender.InvokeRequired) + { + sender.Invoke(new MethodInvoker(() => { sender.Items.Clear(); })); + } + else + { + sender.Items.Clear(); + } + } + + public string GetValue(ListBox sender) + { + string rv = string.Empty; + + if (sender.InvokeRequired) + { + sender.Invoke(new MethodInvoker(() => { rv = (sender.SelectedItem == null) ? string.Empty : sender.SelectedItem.ToString(); })); + } + else + { + rv = (sender.SelectedItem == null) ? string.Empty : sender.SelectedItem.ToString(); + } + + return rv; + } + + public string GetValue(TTextBox sender) + { + string rv = string.Empty; + + if (sender.InvokeRequired) + { + sender.Invoke(new MethodInvoker(() => { rv = sender.Text.Trim(); })); + } + else + { + rv = sender.Text.Trim(); + } + + return rv; + } + + public int GetValue(NumericUpDown sender) + { + int rv = 0; + + if (sender.InvokeRequired) + { + sender.Invoke(new MethodInvoker(() => { rv = (int)sender.Value; })); + } + else + { + rv = (int)sender.Value; + } + + return rv; + } + + protected void updatePictureBox2Image() + { + if (this.WindowState == FormWindowState.Maximized) + { + imgbxMaximise.NormalImage = Resources.form16_restore; + imgbxMaximise.HighlightImage = Resources.form16_restore2; + } + else + { + imgbxMaximise.NormalImage = Resources.form16_maximise; + imgbxMaximise.HighlightImage = Resources.form16_maximise2; + } + } + + private void label1_MouseDown(object sender, MouseEventArgs e) + { + if (e.Button != MouseButtons.Left) + { + return; + } + + windowDragging = true; + windowOffset = e.Location; + } + + private void label1_MouseUp(object sender, MouseEventArgs e) + { + windowDragging = false; + } + + private void label1_MouseMove(object sender, MouseEventArgs e) + { + if (windowDragging) + { + Point currentScreenPos = PointToScreen(e.Location); + Location = new Point(currentScreenPos.X - windowOffset.X, currentScreenPos.Y - windowOffset.Y); + } + } + + private void label1_DoubleClick(object sender, EventArgs e) => pictureBox2_Click(sender, e); + + private void label1_MouseClick(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Middle) + { + this.TopMost = !this.TopMost; + } + } + + private void panel1_MouseDown(object sender, MouseEventArgs e) + { + if (e.Button != MouseButtons.Left) + { + return; + } + + windowDragging = true; + windowOffset = e.Location; + windowSize = new Point(this.Width, this.Height); + } + + private void panel1_MouseUp(object sender, MouseEventArgs e) + { + windowDragging = false; + } + + private void panel1_MouseMove(object sender, MouseEventArgs e) + { + if (windowDragging) + { + this.Size = new Size(e.X - windowOffset.X + this.Width, e.Y - windowOffset.Y + this.Height); + } + } + + private void panel2_MouseDown(object sender, MouseEventArgs e) + { + if (e.Button != MouseButtons.Left) + { + return; + } + + windowDragging = true; + windowOffset = e.Location; + windowSize = new Point(this.Width, this.Height); + } + + private void panel2_MouseUp(object sender, MouseEventArgs e) + { + windowDragging = false; + + } + + private void panel2_MouseMove(object sender, MouseEventArgs e) + { + if (windowDragging) + { + this.Size = new Size(windowSize.X, e.Y - windowOffset.Y + this.Height); + } + } + } +} \ No newline at end of file diff --git a/RyzStudio/Windows/ThemedForms/BorderlessToolForm.resx b/RyzStudio/Windows/ThemedForms/BorderlessToolForm.resx new file mode 100644 index 0000000..8c98a25 --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/BorderlessToolForm.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + True + + + True + + + True + + + True + + \ No newline at end of file diff --git a/RyzStudio/Windows/ThemedForms/PickerBox/TPickerBox.cs b/RyzStudio/Windows/ThemedForms/PickerBox/TPickerBox.cs new file mode 100644 index 0000000..255f98c --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/PickerBox/TPickerBox.cs @@ -0,0 +1,98 @@ +namespace RyzStudio.Windows.ThemedForms +{ + using RyzStudio.Drawing; + using System; + using System.ComponentModel; + using System.Drawing; + using System.Windows.Forms; + + public partial class TPickerBox : RyzStudio.Windows.ThemedForms.TUserControl + { + protected readonly Padding textboxPadding = new Padding(6, 2, 4, 2); + + public TPickerBox() : base() + { + InitializeComponent(); + + this.Font = new Font(this.Font, FontStyle.Regular); + this.Margin = new Padding(10, 4, 10, 4); + + comboBox1.Font = this.Font; + comboBox1.DropDownStyle = ComboBoxStyle.DropDownList; + comboBox1.PreviewKeyDown += textBox_PreviewKeyDown; + } + + protected override void OnResize(EventArgs e) + { + base.OnResize(e); + + int b = (styleActive.BorderWidth + 1) + styleActive.BorderPadding; + + this.Height = comboBox1.Height + (b + textboxPadding.Top) + ((b - 1) + textboxPadding.Bottom); + } + + protected override void OnGotFocus(EventArgs e) + { + base.OnGotFocus(e); + + comboBox1.Focus(); + } + + protected void textBox_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) + { + switch (e.KeyCode) + { + case Keys.Enter: + if (this.SubmitButton != null) + { + this.SubmitButton.PerformClick(); + } + + break; + case Keys.Escape: + close(); + break; + default: break; + } + } + + [Browsable(true), EditorBrowsable(EditorBrowsableState.Advanced)] + [Category("Appearance")] + public System.Windows.Forms.ComboBox ComboBox { get => comboBox1; set => comboBox1 = value; } + + //[Browsable(true), EditorBrowsable(EditorBrowsableState.Advanced)] + //[Category("Appearance")] + //public new string Text + //{ + // get => textBox1.Text; + // set + // { + // textBox1.Text = value; + // textBox1.SelectionStart = textBox1.Text.Length; + // } + //} + + //[Browsable(true)] + //[Category("Appearance")] + //public ComboBox.ObjectCollection Items { get => comboBox1.Items; set => comboBox1.Items = value; } + + [Browsable(true), EditorBrowsable(EditorBrowsableState.Advanced)] + [Category("Appearance")] + public TButton SubmitButton { get; set; } = null; + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new Padding Margin { get => base.Margin; set => base.Margin = value; } + + protected override void updateBackground(Graphics g, ThemeStyle style) + { + int b = (styleActive.BorderWidth + 1) + styleActive.BorderPadding; + + this.Padding = new Padding((b + textboxPadding.Left), (b + textboxPadding.Top), ((b - 1) + textboxPadding.Right), ((b - 1) + textboxPadding.Bottom)); + + Rectangoid area = new Rectangoid(this.ClientRectangle, style.BorderRadius, style.BorderWidth); + g.FillPath(new SolidBrush(style.BackColour), area.ToGraphicsPath()); + g.DrawPath(new Pen(new SolidBrush(style.BorderColour), style.BorderWidth), area.ToGraphicsPath()); + } + + } +} \ No newline at end of file diff --git a/RyzStudio/Windows/ThemedForms/PickerBox/TPickerBox.designer.cs b/RyzStudio/Windows/ThemedForms/PickerBox/TPickerBox.designer.cs new file mode 100644 index 0000000..760329f --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/PickerBox/TPickerBox.designer.cs @@ -0,0 +1,59 @@ +namespace RyzStudio.Windows.ThemedForms +{ + partial class TPickerBox + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.comboBox1 = new System.Windows.Forms.ComboBox(); + this.SuspendLayout(); + // + // comboBox1 + // + this.comboBox1.Dock = System.Windows.Forms.DockStyle.Fill; + this.comboBox1.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.comboBox1.FormattingEnabled = true; + this.comboBox1.Location = new System.Drawing.Point(4, 4); + this.comboBox1.Name = "comboBox1"; + this.comboBox1.Size = new System.Drawing.Size(121, 21); + this.comboBox1.TabIndex = 0; + // + // PickerBox + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.Controls.Add(this.comboBox1); + this.Name = "PickerBox"; + this.Padding = new System.Windows.Forms.Padding(4, 4, 3, 3); + this.Size = new System.Drawing.Size(128, 32); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.ComboBox comboBox1; + } +} diff --git a/RyzStudio/Windows/ThemedForms/PickerBox/TPickerBox.resx b/RyzStudio/Windows/ThemedForms/PickerBox/TPickerBox.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/PickerBox/TPickerBox.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/RyzStudio/Windows/ThemedForms/PickerBox/TYesNoPickerBox.cs b/RyzStudio/Windows/ThemedForms/PickerBox/TYesNoPickerBox.cs new file mode 100644 index 0000000..89225ee --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/PickerBox/TYesNoPickerBox.cs @@ -0,0 +1,17 @@ +namespace RyzStudio.Windows.ThemedForms +{ + public class TYesNoPickerBox : TPickerBox + { + + public TYesNoPickerBox() : base() + { + this.ComboBox.Items.Clear(); + + this.ComboBox.Items.AddRange(new string[] { "No", "Yes" }); + if (this.ComboBox.Items.Count > 0) this.ComboBox.SelectedIndex = 0; + } + + public bool Value { get => (this.ComboBox.SelectedIndex == 1); set =>this.ComboBox.SelectedIndex = (value ? 1 : 0); } + + } +} diff --git a/RyzStudio/Windows/ThemedForms/TButton.cs b/RyzStudio/Windows/ThemedForms/TButton.cs new file mode 100644 index 0000000..74803bb --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/TButton.cs @@ -0,0 +1,170 @@ +namespace RyzStudio.Windows.ThemedForms +{ + using System; + using System.ComponentModel; + using System.Drawing; + using System.Windows.Forms; + + public partial class TButton : RyzStudio.Windows.ThemedForms.TUserControl + { + public class ButtonStyle + { + public Color BackColour { get; set; } = Color.Transparent; + public Color PenColour { get; set; } = Color.Transparent; + public Image ForeImage { get; set; } = null; + } + + public enum ButtonState + { + Idle = 0, + Hover, + Down + } + + protected ButtonState controlState = ButtonState.Idle; + protected bool isSelected = false; + + public TButton() : base() + { + InitializeComponent(); + + this.Margin = new Padding(10); + + this.StyleDefault = new ButtonStyle() + { + BackColour = Color.White, + PenColour = Color.Black, + ForeImage = this.DefaultImage + }; + this.StyleDown = new ButtonStyle() + { + BackColour = Color.FromArgb(60, 53, 148), + PenColour = Color.White, + ForeImage = this.DownImage + }; + this.StyleOver = new ButtonStyle() + { + BackColour = Color.FromArgb(108, 101, 196), + PenColour = Color.White, + ForeImage = this.OverImage + }; + this.StyleSelected = new ButtonStyle() + { + BackColour = Color.FromArgb(51, 51, 51), + PenColour = Color.White, + ForeImage = this.OverImage + }; + + label1.ImageAlign = ContentAlignment.MiddleCenter; + label1.Click += delegate { this.OnClick(null); }; + label1.MouseEnter += delegate { this.VisualState = ButtonState.Hover; }; + label1.MouseLeave += delegate { this.VisualState = ButtonState.Idle; }; + label1.MouseDown += delegate { this.VisualState = ButtonState.Down; }; + label1.MouseUp += delegate { this.VisualState = ButtonState.Idle; }; + } + + protected override void OnLoad(EventArgs e) + { + base.OnLoad(e); + + this.VisualState = ButtonState.Idle; + } + + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new Padding Margin { get => base.Margin; set => base.Margin = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new Padding Padding { get => base.Padding; set => base.Padding = value; } + + + protected ButtonState VisualState + { + get { return controlState; } + set + { + switch (value) + { + case ButtonState.Idle: + if (this.VisualState == ButtonState.Down) + { + updateButton(StyleOver); + } + else + { + if (this.IsSelected) + { + updateButton(StyleSelected); + } + else + { + updateButton(StyleDefault); + } + } + + break; + case ButtonState.Hover: + updateButton(StyleOver); + break; + case ButtonState.Down: + updateButton(StyleDown); + break; + default: + if (this.IsSelected) + { + updateButton(StyleSelected); + } + else + { + updateButton(StyleDefault); + } + + break; + } + + controlState = value; + } + } + + protected void updateButton(ButtonStyle style) + { + label1.ForeColor = style.PenColour; + label1.BackColor = style.BackColour; + label1.Image = style.ForeImage; + } + + [Browsable(true)] + [Category("Appearance")] + public string LabelText { get => label1.Text; set => label1.Text = value; } + + [Browsable(true)] + [Category("Appearance")] + public Image OverImage { get; set; } = null; + + [Browsable(true)] + [Category("Appearance")] + public Image DownImage { get; set; } = null; + + [Browsable(true)] + [Category("Appearance")] + public Image DefaultImage { get; set; } = null; + + public bool IsSelected + { + get => isSelected; + set + { + isSelected = value; + + this.VisualState = this.VisualState; + } + } + + protected ButtonStyle StyleOver { get; set; } = new ButtonStyle(); + protected ButtonStyle StyleDown { get; set; } = new ButtonStyle(); + protected ButtonStyle StyleDefault { get; set; } = new ButtonStyle(); + protected ButtonStyle StyleSelected { get; set; } = new ButtonStyle(); + + public void PerformClick() => this.OnClick(null); + } +} \ No newline at end of file diff --git a/RyzStudio/Windows/ThemedForms/TButton.designer.cs b/RyzStudio/Windows/ThemedForms/TButton.designer.cs new file mode 100644 index 0000000..5bf79d6 --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/TButton.designer.cs @@ -0,0 +1,61 @@ +namespace RyzStudio.Windows.ThemedForms +{ + partial class TButton + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.label1 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // label1 + // + this.label1.Dock = System.Windows.Forms.DockStyle.Fill; + this.label1.Location = new System.Drawing.Point(4, 4); + this.label1.Margin = new System.Windows.Forms.Padding(0); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(121, 25); + this.label1.TabIndex = 0; + this.label1.Text = "label1"; + this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // Button + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.label1); + this.Name = "Button"; + this.Padding = new System.Windows.Forms.Padding(4, 4, 3, 3); + this.Size = new System.Drawing.Size(128, 32); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Label label1; + } +} diff --git a/RyzStudio/Windows/ThemedForms/TButton.resx b/RyzStudio/Windows/ThemedForms/TButton.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/TButton.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/RyzStudio/Windows/ThemedForms/TDialogForm.Designer.cs b/RyzStudio/Windows/ThemedForms/TDialogForm.Designer.cs new file mode 100644 index 0000000..0133a0e --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/TDialogForm.Designer.cs @@ -0,0 +1,47 @@ +namespace RyzStudio.Windows.ThemedForms +{ + partial class TDialogForm + { + /// + /// 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() + { + this.SuspendLayout(); + // + // TDialogForm + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(248)))), ((int)(((byte)(249)))), ((int)(((byte)(250))))); + this.ClientSize = new System.Drawing.Size(340, 600); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.MinimumSize = new System.Drawing.Size(40, 0); + this.Name = "TDialogForm"; + this.ResumeLayout(false); + + } + + #endregion + } +} \ No newline at end of file diff --git a/RyzStudio/Windows/ThemedForms/TDialogForm.cs b/RyzStudio/Windows/ThemedForms/TDialogForm.cs new file mode 100644 index 0000000..23d11df --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/TDialogForm.cs @@ -0,0 +1,117 @@ +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace RyzStudio.Windows.ThemedForms +{ + public partial class TDialogForm : Form + { + public TDialogForm() + { + this.InitializeComponent(); + + this.BackColor = Color.FromArgb(254, 254, 254); + this.FormBorderStyle = FormBorderStyle.Sizable; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Padding = new Padding(5, 10, 5, 10); + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = FormStartPosition.WindowsDefaultLocation; + this.TopMost = true; + this.SizeGripStyle = SizeGripStyle.Hide; + this.AutoScaleMode = AutoScaleMode.None; + } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public override Color BackColor { get => base.BackColor; set => base.BackColor = value; } + + [Browsable(false)] + public override Image BackgroundImage { get => base.BackgroundImage; set => base.BackgroundImage = value; } + + [Browsable(false)] + public override ImageLayout BackgroundImageLayout { get => base.BackgroundImageLayout; set => base.BackgroundImageLayout = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new FormBorderStyle FormBorderStyle { get => base.FormBorderStyle; set => base.FormBorderStyle = value; } + + //[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + //public override Size MaximumSize { get => base.MaximumSize; set => base.MaximumSize = value; } + + //[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + //public override Size MinimumSize { get => base.MinimumSize; set => base.MinimumSize = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new Padding Padding { get => base.Padding; set => base.Padding = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new bool ShowIcon { get => base.ShowIcon; set => base.ShowIcon = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new bool ShowInTaskbar { get => base.ShowInTaskbar; set => base.ShowInTaskbar = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new FormStartPosition StartPosition { get => base.StartPosition; set => base.StartPosition = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new bool TopMost { get => base.TopMost; set => base.TopMost = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public override Cursor Cursor { get => base.Cursor; set => base.Cursor = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public override RightToLeft RightToLeft { get => base.RightToLeft; set => base.RightToLeft = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public override bool RightToLeftLayout { get => base.RightToLeftLayout; set => base.RightToLeftLayout = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new bool UseWaitCursor { get => base.UseWaitCursor; set => base.UseWaitCursor = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new ImeMode ImeMode { get => base.ImeMode; set => base.ImeMode = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public override bool AutoSize { get => base.AutoSize; set => base.AutoSize = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new AutoSizeMode AutoSizeMode { get => base.AutoSizeMode; set => base.AutoSizeMode = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new bool MinimizeBox { get => base.MinimizeBox; set => base.MinimizeBox = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new bool MaximizeBox { get => base.MaximizeBox; set => base.MaximizeBox = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new bool ControlBox { get => base.ControlBox; set => base.ControlBox = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new bool HelpButton { get => base.HelpButton; set => base.HelpButton = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new MenuStrip MainMenuStrip { get => base.MainMenuStrip; set => base.MainMenuStrip = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new SizeGripStyle SizeGripStyle { get => base.SizeGripStyle; set => base.SizeGripStyle = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new AutoScaleMode AutoScaleMode { get => base.AutoScaleMode; set => base.AutoScaleMode = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new bool AutoScroll { get => base.AutoScroll; set => base.AutoScroll = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new Size AutoScrollMargin { get => base.AutoScrollMargin; set => base.AutoScrollMargin = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new Size AutoScrollMinSize { get => base.AutoScrollMinSize; set => base.AutoScrollMinSize = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new Point AutoScrollOffset { get => base.AutoScrollOffset; set => base.AutoScrollOffset = value; } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new FormWindowState WindowState { get => base.WindowState; set => base.WindowState = value; } + + } +} \ No newline at end of file diff --git a/RyzStudio/Windows/ThemedForms/TDialogForm.resx b/RyzStudio/Windows/ThemedForms/TDialogForm.resx new file mode 100644 index 0000000..f298a7b --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/TDialogForm.resx @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/RyzStudio/Windows/ThemedForms/TListBox.cs b/RyzStudio/Windows/ThemedForms/TListBox.cs new file mode 100644 index 0000000..3f84e9c --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/TListBox.cs @@ -0,0 +1,385 @@ +using RyzStudio.Drawing; +using System; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; +using UIResource = BookmarkManager.UIResource; + +namespace RyzStudio.Windows.ThemedForms +{ + public partial class TListBox : RyzStudio.Windows.ThemedForms.TUserControl + { + protected readonly Padding textboxPadding = new Padding(6, 2, 4, 2); + + public TListBox() : base() + { + InitializeComponent(); + + this.Font = new Font(this.Font, FontStyle.Regular); + this.Margin = new Padding(10, 4, 10, 4); + + listBox1.Font = this.Font; + listBox1.BorderStyle = BorderStyle.None; + } + + //protected override void OnResize(EventArgs e) + //{ + // base.OnResize(e); + + // //int b = (styleActive.BorderWidth + 1) + styleActive.BorderPadding; + + // //this.Height = comboBox1.Height + (b + textboxPadding.Top) + ((b - 1) + textboxPadding.Bottom); + //} + + protected override void OnGotFocus(EventArgs e) + { + base.OnGotFocus(e); + + listBox1.Focus(); + } + + [Browsable(true), EditorBrowsable(EditorBrowsableState.Advanced)] + [Category("Appearance")] + public System.Windows.Forms.ListBox ListBox { get => listBox1; set => listBox1 = value; } + + [Browsable(true), EditorBrowsable(EditorBrowsableState.Advanced)] + [Category("Appearance")] + public TButton SubmitButton { get; set; } = null; + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new Padding Margin { get => base.Margin; set => base.Margin = value; } + + [Browsable(false)] + public event EventHandler OnAdd; + + [Browsable(false)] + public event EventHandler OnEdit; + + protected override void updateBackground(Graphics g, ThemeStyle style) + { + int b = (styleActive.BorderWidth + 1) + styleActive.BorderPadding; + + this.Padding = new Padding((b + textboxPadding.Left), (b + textboxPadding.Top), ((b - 1) + textboxPadding.Right), ((b - 1) + textboxPadding.Bottom)); + + Rectangoid area = new Rectangoid(this.ClientRectangle, style.BorderRadius, style.BorderWidth); + g.FillPath(new SolidBrush(style.BackColour), area.ToGraphicsPath()); + g.DrawPath(new Pen(new SolidBrush(style.BorderColour), style.BorderWidth), area.ToGraphicsPath()); + } + + /// + /// Add + /// + /// + /// + private void imageBox1_MouseClick(object sender, MouseEventArgs e) + { + if (e.Button != MouseButtons.Left) + { + return; + } + + this.OnAdd?.Invoke(sender, e); + } + + /// + /// Edit + /// + /// + /// + private void tImageBox1_MouseClick(object sender, MouseEventArgs e) + { + if (e.Button != MouseButtons.Left) + { + return; + } + + editToolStripMenuItem_Click(sender, e); + } + + /// + /// Menu + /// + /// + /// + private void imageBox5_MouseClick(object sender, MouseEventArgs e) + { + if (e.Button != MouseButtons.Left) + { + return; + } + + contextMenuStrip1.Show(Cursor.Position); + } + + /// + /// Move up + /// + /// + /// + private void imageBox3_MouseClick(object sender, MouseEventArgs e) + { + if (e != null) + { + if (e.Button != MouseButtons.Left) + { + return; + } + } + + moveUpToolStripMenuItem_Click(sender, e); + } + + /// + /// Move down + /// + /// + /// + private void imageBox4_MouseClick(object sender, MouseEventArgs e) + { + if (e != null) + { + if (e.Button != MouseButtons.Left) + { + return; + } + } + + moveDownToolStripMenuItem_Click(sender, e); + } + + private void listBox1_MouseDoubleClick(object sender, MouseEventArgs e) + { + editToolStripMenuItem_Click(sender, e); + } + + private void listBox1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) + { + switch (e.KeyCode) + { + case Keys.Enter: + if (this.SubmitButton != null) + { + this.SubmitButton.PerformClick(); + } + + break; + case Keys.Escape: + close(); + break; + case Keys.Up: + if (e.Alt) + { + imageBox3_MouseClick(sender, null); + } + + break; + case Keys.Down: + if (e.Alt) + { + imageBox4_MouseClick(sender, null); + } + + break; + default: break; + } + } + + #region context menu + + /// + /// Add + /// + /// + /// + private void addItemToolStripMenuItem_Click(object sender, EventArgs e) + { + this.OnAdd?.Invoke(sender, e); + } + + /// + /// Copy + /// + /// + /// + private void toolStripMenuItem2_Click(object sender, EventArgs e) + { + if (listBox1.SelectedIndex <= 0) + { + return; + } + + if (listBox1.SelectedItem == null) + { + return; + } + + object item = listBox1.SelectedItem; + + listBox1.Items.Add(item); + listBox1.SelectedIndex = (listBox1.Items.Count- 1); + } + + /// + /// Edit + /// + /// + /// + private void editToolStripMenuItem_Click(object sender, EventArgs e) + { + if (listBox1.SelectedIndex < 0) + { + return; + } + + if (listBox1.SelectedItem == null) + { + return; + } + + this.OnEdit?.Invoke(sender, e); + } + + /// + /// Remove + /// + /// + /// + private void removeToolStripMenuItem_Click(object sender, EventArgs e) + { + if (listBox1.SelectedIndex < 0) + { + return; + } + + int pos = listBox1.SelectedIndex; + + listBox1.Items.RemoveAt(pos); + + if (pos > (listBox1.Items.Count - 1)) + { + pos = (listBox1.Items.Count - 1); + } + + listBox1.SelectedIndex = pos; + } + + /// + /// Remove all + /// + /// + /// + private void toolStripMenuItem1_Click(object sender, EventArgs e) + { + listBox1.Items.Clear(); + } + + /// + /// Move to top + /// + /// + /// + private void moveToTopToolStripMenuItem_Click(object sender, EventArgs e) + { + if (listBox1.SelectedIndex <= 0) + { + return; + } + + if (listBox1.SelectedItem == null) + { + return; + } + + object item = listBox1.SelectedItem; + int pos = listBox1.SelectedIndex; + + listBox1.Items.RemoveAt(pos); + listBox1.Items.Insert(0, item); + + listBox1.SelectedIndex = 0; + } + + /// + /// Move up + /// + /// + /// + private void moveUpToolStripMenuItem_Click(object sender, EventArgs e) + { + if (listBox1.SelectedIndex <= 0) + { + return; + } + + if (listBox1.SelectedItem == null) + { + return; + } + + object item = listBox1.SelectedItem; + int pos = listBox1.SelectedIndex; + + listBox1.Items.RemoveAt(pos); + listBox1.Items.Insert((pos - 1), item); + + listBox1.SelectedIndex = (pos - 1); + } + + /// + /// Move down + /// + /// + /// + private void moveDownToolStripMenuItem_Click(object sender, EventArgs e) + { + if (listBox1.SelectedIndex >= (listBox1.Items.Count - 1)) + { + return; + } + + if (listBox1.SelectedItem == null) + { + return; + } + + object item = listBox1.SelectedItem; + int pos = listBox1.SelectedIndex; + + listBox1.Items.RemoveAt(pos); + listBox1.Items.Insert((pos + 1), item); + + listBox1.SelectedIndex = (pos + 1); + } + + /// + /// Move to bottom + /// + /// + /// + private void moveToBottomToolStripMenuItem_Click(object sender, EventArgs e) + { + int n = (listBox1.Items.Count - 1); + + if (listBox1.SelectedIndex >= (listBox1.Items.Count - 1)) + { + return; + } + + if (listBox1.SelectedItem == null) + { + return; + } + + object item = listBox1.SelectedItem; + int pos = listBox1.SelectedIndex; + + listBox1.Items.RemoveAt(pos); + listBox1.Items.Insert(n, item); + + listBox1.SelectedIndex = n; + } + + #endregion + + } +} \ No newline at end of file diff --git a/RyzStudio/Windows/ThemedForms/TListBox.designer.cs b/RyzStudio/Windows/ThemedForms/TListBox.designer.cs new file mode 100644 index 0000000..af75f87 --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/TListBox.designer.cs @@ -0,0 +1,358 @@ +using System.Drawing; + +namespace RyzStudio.Windows.ThemedForms +{ + partial class TListBox + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.listBox1 = new System.Windows.Forms.ListBox(); + this.imageBox5 = new RyzStudio.Windows.Forms.TImageBox(); + this.imageBox4 = new RyzStudio.Windows.Forms.TImageBox(); + this.imageBox3 = new RyzStudio.Windows.Forms.TImageBox(); + this.imageBox1 = new RyzStudio.Windows.Forms.TImageBox(); + this.toolTip1 = new System.Windows.Forms.ToolTip(this.components); + this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); + this.addItemToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); + this.editToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.removeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.moveToTopToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.moveUpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.moveDownToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.moveToBottomToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.tImageBox1 = new RyzStudio.Windows.Forms.TImageBox(); + ((System.ComponentModel.ISupportInitialize)(this.imageBox5)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.imageBox4)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.imageBox3)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.imageBox1)).BeginInit(); + this.contextMenuStrip1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.tImageBox1)).BeginInit(); + this.SuspendLayout(); + // + // listBox1 + // + this.listBox1.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.listBox1.BackColor = System.Drawing.SystemColors.Window; + this.listBox1.FormattingEnabled = true; + this.listBox1.ItemHeight = 15; + this.listBox1.Location = new System.Drawing.Point(4, 4); + this.listBox1.Name = "listBox1"; + this.listBox1.Size = new System.Drawing.Size(98, 214); + this.listBox1.TabIndex = 0; + this.listBox1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.listBox1_MouseDoubleClick); + this.listBox1.PreviewKeyDown += new System.Windows.Forms.PreviewKeyDownEventHandler(this.listBox1_PreviewKeyDown); + // + // imageBox5 + // + this.imageBox5.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.imageBox5.BackColor = System.Drawing.Color.Transparent; + this.imageBox5.BackColorHover = System.Drawing.Color.Transparent; + this.imageBox5.BackColorNormal = System.Drawing.Color.Transparent; + this.imageBox5.BackColorSelected = System.Drawing.Color.Transparent; + this.imageBox5.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; + this.imageBox5.ErrorImage = null; + this.imageBox5.HoverImage = global::BookmarkManager.UIResource.circle_menu2; + this.imageBox5.Image = global::BookmarkManager.UIResource.circle_menu; + this.imageBox5.ImageHover = global::BookmarkManager.UIResource.circle_menu2; + this.imageBox5.ImageNormal = global::BookmarkManager.UIResource.circle_menu; + this.imageBox5.ImageSelected = null; + this.imageBox5.InitialImage = null; + this.imageBox5.IsSelected = false; + this.imageBox5.Location = new System.Drawing.Point(106, 48); + this.imageBox5.Name = "imageBox5"; + this.imageBox5.NormalImage = global::BookmarkManager.UIResource.circle_menu; + this.imageBox5.SelectedImage = null; + this.imageBox5.Size = new System.Drawing.Size(18, 18); + this.imageBox5.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage; + this.imageBox5.TabIndex = 6; + this.imageBox5.TabStop = false; + this.toolTip1.SetToolTip(this.imageBox5, "Menu"); + this.imageBox5.MouseClick += new System.Windows.Forms.MouseEventHandler(this.imageBox5_MouseClick); + this.imageBox5.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.imageBox5_MouseClick); + // + // imageBox4 + // + this.imageBox4.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.imageBox4.BackColor = System.Drawing.Color.Transparent; + this.imageBox4.BackColorHover = System.Drawing.Color.Transparent; + this.imageBox4.BackColorNormal = System.Drawing.Color.Transparent; + this.imageBox4.BackColorSelected = System.Drawing.Color.Transparent; + this.imageBox4.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; + this.imageBox4.ErrorImage = null; + this.imageBox4.HoverImage = global::BookmarkManager.UIResource.arrow_down2; + this.imageBox4.Image = global::BookmarkManager.UIResource.arrow_down; + this.imageBox4.ImageHover = global::BookmarkManager.UIResource.arrow_down2; + this.imageBox4.ImageNormal = global::BookmarkManager.UIResource.arrow_down; + this.imageBox4.ImageSelected = null; + this.imageBox4.InitialImage = null; + this.imageBox4.IsSelected = false; + this.imageBox4.Location = new System.Drawing.Point(106, 92); + this.imageBox4.Name = "imageBox4"; + this.imageBox4.NormalImage = global::BookmarkManager.UIResource.arrow_down; + this.imageBox4.SelectedImage = null; + this.imageBox4.Size = new System.Drawing.Size(18, 18); + this.imageBox4.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage; + this.imageBox4.TabIndex = 5; + this.imageBox4.TabStop = false; + this.toolTip1.SetToolTip(this.imageBox4, "Move Down"); + this.imageBox4.MouseClick += new System.Windows.Forms.MouseEventHandler(this.imageBox4_MouseClick); + this.imageBox4.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.imageBox4_MouseClick); + // + // imageBox3 + // + this.imageBox3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.imageBox3.BackColor = System.Drawing.Color.Transparent; + this.imageBox3.BackColorHover = System.Drawing.Color.Transparent; + this.imageBox3.BackColorNormal = System.Drawing.Color.Transparent; + this.imageBox3.BackColorSelected = System.Drawing.Color.Transparent; + this.imageBox3.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; + this.imageBox3.ErrorImage = null; + this.imageBox3.HoverImage = global::BookmarkManager.UIResource.arrow_up2; + this.imageBox3.Image = global::BookmarkManager.UIResource.arrow_up; + this.imageBox3.ImageHover = global::BookmarkManager.UIResource.arrow_up2; + this.imageBox3.ImageNormal = global::BookmarkManager.UIResource.arrow_up; + this.imageBox3.ImageSelected = null; + this.imageBox3.InitialImage = null; + this.imageBox3.IsSelected = false; + this.imageBox3.Location = new System.Drawing.Point(106, 72); + this.imageBox3.Name = "imageBox3"; + this.imageBox3.NormalImage = global::BookmarkManager.UIResource.arrow_up; + this.imageBox3.SelectedImage = null; + this.imageBox3.Size = new System.Drawing.Size(18, 18); + this.imageBox3.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage; + this.imageBox3.TabIndex = 4; + this.imageBox3.TabStop = false; + this.toolTip1.SetToolTip(this.imageBox3, "Move Up"); + this.imageBox3.MouseClick += new System.Windows.Forms.MouseEventHandler(this.imageBox3_MouseClick); + this.imageBox3.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.imageBox3_MouseClick); + // + // imageBox1 + // + this.imageBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.imageBox1.BackColor = System.Drawing.Color.Transparent; + this.imageBox1.BackColorHover = System.Drawing.Color.Transparent; + this.imageBox1.BackColorNormal = System.Drawing.Color.Transparent; + this.imageBox1.BackColorSelected = System.Drawing.Color.Transparent; + this.imageBox1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; + this.imageBox1.ErrorImage = null; + this.imageBox1.HoverImage = global::BookmarkManager.UIResource.plus2; + this.imageBox1.Image = global::BookmarkManager.UIResource.plus; + this.imageBox1.ImageHover = global::BookmarkManager.UIResource.plus2; + this.imageBox1.ImageNormal = global::BookmarkManager.UIResource.plus; + this.imageBox1.ImageSelected = null; + this.imageBox1.InitialImage = null; + this.imageBox1.IsSelected = false; + this.imageBox1.Location = new System.Drawing.Point(106, 4); + this.imageBox1.Name = "imageBox1"; + this.imageBox1.NormalImage = global::BookmarkManager.UIResource.plus; + this.imageBox1.SelectedImage = null; + this.imageBox1.Size = new System.Drawing.Size(18, 18); + this.imageBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage; + this.imageBox1.TabIndex = 2; + this.imageBox1.TabStop = false; + this.toolTip1.SetToolTip(this.imageBox1, "Add"); + this.imageBox1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.imageBox1_MouseClick); + this.imageBox1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.imageBox1_MouseClick); + // + // contextMenuStrip1 + // + this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.addItemToolStripMenuItem, + this.toolStripMenuItem2, + this.toolStripSeparator3, + this.editToolStripMenuItem, + this.toolStripSeparator2, + this.removeToolStripMenuItem, + this.toolStripMenuItem1, + this.toolStripSeparator1, + this.moveToTopToolStripMenuItem, + this.moveUpToolStripMenuItem, + this.moveDownToolStripMenuItem, + this.moveToBottomToolStripMenuItem}); + this.contextMenuStrip1.Name = "contextMenuStrip1"; + this.contextMenuStrip1.Size = new System.Drawing.Size(163, 220); + // + // addItemToolStripMenuItem + // + this.addItemToolStripMenuItem.Name = "addItemToolStripMenuItem"; + this.addItemToolStripMenuItem.Size = new System.Drawing.Size(162, 22); + this.addItemToolStripMenuItem.Text = "&Add"; + this.addItemToolStripMenuItem.Click += new System.EventHandler(this.addItemToolStripMenuItem_Click); + // + // toolStripMenuItem2 + // + this.toolStripMenuItem2.Name = "toolStripMenuItem2"; + this.toolStripMenuItem2.Size = new System.Drawing.Size(162, 22); + this.toolStripMenuItem2.Text = "&Copy"; + this.toolStripMenuItem2.Click += new System.EventHandler(this.toolStripMenuItem2_Click); + // + // toolStripSeparator3 + // + this.toolStripSeparator3.Name = "toolStripSeparator3"; + this.toolStripSeparator3.Size = new System.Drawing.Size(159, 6); + // + // editToolStripMenuItem + // + this.editToolStripMenuItem.Name = "editToolStripMenuItem"; + this.editToolStripMenuItem.Size = new System.Drawing.Size(162, 22); + this.editToolStripMenuItem.Text = "&Edit"; + this.editToolStripMenuItem.Click += new System.EventHandler(this.editToolStripMenuItem_Click); + // + // toolStripSeparator2 + // + this.toolStripSeparator2.Name = "toolStripSeparator2"; + this.toolStripSeparator2.Size = new System.Drawing.Size(159, 6); + // + // removeToolStripMenuItem + // + this.removeToolStripMenuItem.Name = "removeToolStripMenuItem"; + this.removeToolStripMenuItem.Size = new System.Drawing.Size(162, 22); + this.removeToolStripMenuItem.Text = "&Remove"; + this.removeToolStripMenuItem.Click += new System.EventHandler(this.removeToolStripMenuItem_Click); + // + // toolStripMenuItem1 + // + this.toolStripMenuItem1.Name = "toolStripMenuItem1"; + this.toolStripMenuItem1.Size = new System.Drawing.Size(162, 22); + this.toolStripMenuItem1.Text = "Remove A&ll"; + this.toolStripMenuItem1.Click += new System.EventHandler(this.toolStripMenuItem1_Click); + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(159, 6); + // + // moveToTopToolStripMenuItem + // + this.moveToTopToolStripMenuItem.Name = "moveToTopToolStripMenuItem"; + this.moveToTopToolStripMenuItem.Size = new System.Drawing.Size(162, 22); + this.moveToTopToolStripMenuItem.Text = "Move To &Top"; + this.moveToTopToolStripMenuItem.Click += new System.EventHandler(this.moveToTopToolStripMenuItem_Click); + // + // moveUpToolStripMenuItem + // + this.moveUpToolStripMenuItem.Name = "moveUpToolStripMenuItem"; + this.moveUpToolStripMenuItem.Size = new System.Drawing.Size(162, 22); + this.moveUpToolStripMenuItem.Text = "Move &Up"; + this.moveUpToolStripMenuItem.Click += new System.EventHandler(this.moveUpToolStripMenuItem_Click); + // + // moveDownToolStripMenuItem + // + this.moveDownToolStripMenuItem.Name = "moveDownToolStripMenuItem"; + this.moveDownToolStripMenuItem.Size = new System.Drawing.Size(162, 22); + this.moveDownToolStripMenuItem.Text = "Move &Down"; + this.moveDownToolStripMenuItem.Click += new System.EventHandler(this.moveDownToolStripMenuItem_Click); + // + // moveToBottomToolStripMenuItem + // + this.moveToBottomToolStripMenuItem.Name = "moveToBottomToolStripMenuItem"; + this.moveToBottomToolStripMenuItem.Size = new System.Drawing.Size(162, 22); + this.moveToBottomToolStripMenuItem.Text = "Move To &Bottom"; + this.moveToBottomToolStripMenuItem.Click += new System.EventHandler(this.moveToBottomToolStripMenuItem_Click); + // + // tImageBox1 + // + this.tImageBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.tImageBox1.BackColor = System.Drawing.Color.Transparent; + this.tImageBox1.BackColorHover = System.Drawing.Color.Transparent; + this.tImageBox1.BackColorNormal = System.Drawing.Color.Transparent; + this.tImageBox1.BackColorSelected = System.Drawing.Color.Transparent; + this.tImageBox1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; + this.tImageBox1.ErrorImage = null; + this.tImageBox1.HoverImage = global::BookmarkManager.UIResource.edit2; + this.tImageBox1.Image = global::BookmarkManager.UIResource.edit; + this.tImageBox1.ImageHover = global::BookmarkManager.UIResource.edit2; + this.tImageBox1.ImageNormal = global::BookmarkManager.UIResource.edit; + this.tImageBox1.ImageSelected = null; + this.tImageBox1.InitialImage = null; + this.tImageBox1.IsSelected = false; + this.tImageBox1.Location = new System.Drawing.Point(106, 24); + this.tImageBox1.Name = "tImageBox1"; + this.tImageBox1.NormalImage = global::BookmarkManager.UIResource.edit; + this.tImageBox1.SelectedImage = null; + this.tImageBox1.Size = new System.Drawing.Size(18, 18); + this.tImageBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage; + this.tImageBox1.TabIndex = 7; + this.tImageBox1.TabStop = false; + this.toolTip1.SetToolTip(this.tImageBox1, "Edit"); + this.tImageBox1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.tImageBox1_MouseClick); + this.tImageBox1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.tImageBox1_MouseClick); + // + // TListBox + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.Controls.Add(this.tImageBox1); + this.Controls.Add(this.imageBox5); + this.Controls.Add(this.imageBox4); + this.Controls.Add(this.imageBox3); + this.Controls.Add(this.imageBox1); + this.Controls.Add(this.listBox1); + this.Name = "TListBox"; + this.Padding = new System.Windows.Forms.Padding(4, 4, 3, 3); + this.Size = new System.Drawing.Size(128, 225); + ((System.ComponentModel.ISupportInitialize)(this.imageBox5)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.imageBox4)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.imageBox3)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.imageBox1)).EndInit(); + this.contextMenuStrip1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.tImageBox1)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.ListBox listBox1; + private Forms.TImageBox imageBox1; + private Forms.TImageBox imageBox3; + private Forms.TImageBox imageBox4; + private Forms.TImageBox imageBox5; + private System.Windows.Forms.ToolTip toolTip1; + private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; + private System.Windows.Forms.ToolStripMenuItem addItemToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem editToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem removeToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripMenuItem moveToTopToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem moveUpToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem moveDownToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem moveToBottomToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem2; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem1; + private Forms.TImageBox tImageBox1; + } +} diff --git a/RyzStudio/Windows/ThemedForms/TListBox.resx b/RyzStudio/Windows/ThemedForms/TListBox.resx new file mode 100644 index 0000000..34628c2 --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/TListBox.resx @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + 17, 17 + + + 17, 17 + + + 114, 17 + + \ No newline at end of file diff --git a/RyzStudio/Windows/ThemedForms/TNumericBox.cs b/RyzStudio/Windows/ThemedForms/TNumericBox.cs new file mode 100644 index 0000000..76a1f7e --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/TNumericBox.cs @@ -0,0 +1,99 @@ +using RyzStudio.Drawing; +using System; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace RyzStudio.Windows.ThemedForms +{ + public partial class TNumericBox : RyzStudio.Windows.ThemedForms.TUserControl + { + protected readonly Padding textboxPadding = new Padding(4, 4, 4, 4); + + + public TNumericBox() : base() + { + InitializeComponent(); + + this.Margin = new Padding(10, 6, 10, 6); + this.Font = new Font(this.Font, FontStyle.Regular); + + numericUpDown1.Font = this.Font; + numericUpDown1.PreviewKeyDown += textBox_PreviewKeyDown; + } + + protected override void OnResize(EventArgs e) + { + base.OnResize(e); + + int b = (styleActive.BorderWidth + 1) + styleActive.BorderPadding; + + this.Height = numericUpDown1.Height + (b + textboxPadding.Top) + ((b - 1) + textboxPadding.Bottom); + + this.Invalidate(); + } + + protected override void OnGotFocus(EventArgs e) + { + base.OnGotFocus(e); + + numericUpDown1.Focus(); + } + + protected void textBox_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) + { + switch (e.KeyCode) + { + case Keys.Enter: + if (this.SubmitButton != null) + { + this.SubmitButton.PerformClick(); + } + + break; + case Keys.Escape: + close(); + break; + default: break; + } + } + + [Browsable(true), EditorBrowsable(EditorBrowsableState.Advanced)] + [Category("Appearance")] + public System.Windows.Forms.NumericUpDown InnerControl { get => numericUpDown1; set => numericUpDown1 = value; } + + [Browsable(true), EditorBrowsable(EditorBrowsableState.Advanced)] + [Category("Appearance")] + public int Value + { + get => (int)numericUpDown1.Value; + set + { + numericUpDown1.Value = value; + } + } + + //[Browsable(true), EditorBrowsable(EditorBrowsableState.Advanced)] + //[Category("Appearance")] + //public bool UseSystemPasswordChar { get => textBox1.UseSystemPasswordChar; set => textBox1.UseSystemPasswordChar = value; } + + [Browsable(true), EditorBrowsable(EditorBrowsableState.Advanced)] + [Category("Appearance")] + public TButton SubmitButton { get; set; } = null; + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new Padding Margin { get { return base.Margin; } set { base.Margin = value; } } + + protected override void updateBackground(Graphics g, ThemeStyle style) + { + int b = (styleActive.BorderWidth + 1) + styleActive.BorderPadding; + + this.Padding = new Padding((b + textboxPadding.Left), (b + textboxPadding.Top), ((b - 1) + textboxPadding.Right), ((b - 1) + textboxPadding.Bottom)); + + Rectangoid area = new Rectangoid(this.ClientRectangle, style.BorderRadius, style.BorderWidth); + g.FillPath(new SolidBrush(style.BackColour), area.ToGraphicsPath()); + g.DrawPath(new Pen(new SolidBrush(style.BorderColour), style.BorderWidth), area.ToGraphicsPath()); + } + + } +} \ No newline at end of file diff --git a/RyzStudio/Windows/ThemedForms/TNumericBox.designer.cs b/RyzStudio/Windows/ThemedForms/TNumericBox.designer.cs new file mode 100644 index 0000000..799db24 --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/TNumericBox.designer.cs @@ -0,0 +1,60 @@ +namespace RyzStudio.Windows.ThemedForms +{ + partial class TNumericBox + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.numericUpDown1 = new System.Windows.Forms.NumericUpDown(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).BeginInit(); + this.SuspendLayout(); + // + // numericUpDown1 + // + this.numericUpDown1.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.numericUpDown1.Dock = System.Windows.Forms.DockStyle.Fill; + this.numericUpDown1.Location = new System.Drawing.Point(4, 4); + this.numericUpDown1.Name = "numericUpDown1"; + this.numericUpDown1.Size = new System.Drawing.Size(121, 19); + this.numericUpDown1.TabIndex = 0; + // + // TNumericBox + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.Controls.Add(this.numericUpDown1); + this.Name = "TNumericBox"; + this.Padding = new System.Windows.Forms.Padding(4, 4, 3, 3); + this.Size = new System.Drawing.Size(128, 32); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.NumericUpDown numericUpDown1; + } +} diff --git a/RyzStudio/Windows/ThemedForms/TNumericBox.resx b/RyzStudio/Windows/ThemedForms/TNumericBox.resx new file mode 100644 index 0000000..f298a7b --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/TNumericBox.resx @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/RyzStudio/Windows/ThemedForms/TUserControl.cs b/RyzStudio/Windows/ThemedForms/TUserControl.cs new file mode 100644 index 0000000..56bea24 --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/TUserControl.cs @@ -0,0 +1,106 @@ +using System; +using System.Drawing; +using System.Windows.Forms; +using RyzStudio.Drawing; +using System.ComponentModel; + +namespace RyzStudio.Windows.ThemedForms +{ + public partial class TUserControl : System.Windows.Forms.UserControl + { + public class ThemeStyle + { + public int BorderWidth; + public int BorderRadius; + public int BorderPadding; + public Color BorderColour; + public Color BackColour; + public Color ForeColour; + + public ThemeStyle(int borderWidth, int borderRadius, int borderPadding, Color borderColour, Color backColour) + { + this.BorderWidth = borderWidth; + this.BorderRadius = borderRadius; + this.BorderPadding = borderPadding; + this.BorderColour = borderColour; + this.BackColour = backColour; + this.ForeColour = Color.Black; + } + + public ThemeStyle(int borderWidth, int borderRadius, int borderPadding, Color borderColour, Color backColour, Color foreColour) + { + this.BorderWidth = borderWidth; + this.BorderRadius = borderRadius; + this.BorderPadding = borderPadding; + this.BorderColour = borderColour; + this.BackColour = backColour; + this.ForeColour = foreColour; + } + } + + protected ThemeStyle styleActive = new ThemeStyle(1, 3, 2, Color.FromArgb(212, 212, 212), Color.White); + + public TUserControl() + { + InitializeComponent(); + } + + protected override void OnLoad(EventArgs e) + { + base.OnLoad(e); + + this.BackColor = Color.Transparent; + } + + protected override void OnPaintBackground(PaintEventArgs e) + { + base.OnPaintBackground(e); + + Graphics g = e.Graphics; + //g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; + //g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; + //g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality; + //g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; + + updateBackground(g, styleActive); + } + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new Padding Padding { get => base.Padding; set => base.Padding = value; } + + protected virtual void updateBackground(Graphics g, ThemeStyle style) + { + int b = (styleActive.BorderWidth + 1) + styleActive.BorderPadding; + + this.Padding = new Padding(b, b, (b - 1), (b - 1)); + + Rectangoid area = new Rectangoid(this.ClientRectangle, style.BorderRadius, style.BorderWidth); + g.FillPath(new SolidBrush(style.BackColour), area.ToGraphicsPath()); + g.DrawPath(new Pen(new SolidBrush(style.BorderColour), style.BorderWidth), area.ToGraphicsPath()); + } + + protected virtual void close() + { + if (this.Parent == null) + { + return; + } + + if (this.Parent is Form) + { + (this.Parent as Form).Close(); + return; + } + + if (this.Parent.GetType().IsSubclassOf(typeof(System.Windows.Forms.Form))) + { + System.Windows.Forms.Form parentForm = (System.Windows.Forms.Form)this.Parent; + if (parentForm != null) + { + parentForm.Close(); + } + } + } + + } +} \ No newline at end of file diff --git a/RyzStudio/Windows/ThemedForms/TUserControl.designer.cs b/RyzStudio/Windows/ThemedForms/TUserControl.designer.cs new file mode 100644 index 0000000..6f57544 --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/TUserControl.designer.cs @@ -0,0 +1,37 @@ +namespace RyzStudio.Windows.ThemedForms +{ + partial class TUserControl + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + } + + #endregion + } +} diff --git a/RyzStudio/Windows/ThemedForms/TextBox/TButtonTextBox.cs b/RyzStudio/Windows/ThemedForms/TextBox/TButtonTextBox.cs new file mode 100644 index 0000000..dbe7d77 --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/TextBox/TButtonTextBox.cs @@ -0,0 +1,127 @@ +namespace RyzStudio.Windows.ThemedForms +{ + using RyzStudio.Drawing; + using System; + using System.ComponentModel; + using System.Drawing; + using System.Windows.Forms; + + public partial class TButtonTextBox : RyzStudio.Windows.ThemedForms.TUserControl + { + protected readonly Padding textboxPadding = new Padding(6, 6, 6, 6); + + public TButtonTextBox() : base() + { + InitializeComponent(); + + //this.Margin = new Padding(10, 6, 10, 6); + this.Margin = new Padding(10, 3, 3, 3); + this.Font = new Font(this.Font, FontStyle.Regular); + + textBox1.Font = this.Font; + textBox1.Left = this.Margin.Left; + textBox1.PreviewKeyDown += textBox_PreviewKeyDown; + + imageBox1.Click += imageBox1_Click; + + OnResize(null); + } + + protected override void OnResize(EventArgs e) + { + base.OnResize(e); + + int b = (styleActive.BorderWidth + 1) + styleActive.BorderPadding; + + this.Height = textBox1.Height + (b + textboxPadding.Top) + ((b - 1) + textboxPadding.Bottom); + + imageBox1.Width = 18; + imageBox1.Height = textBox1.Height + textboxPadding.Top + textboxPadding.Bottom; + imageBox1.Left = this.Width - (this.Margin.Right + b + imageBox1.Width); + + textBox1.Left = this.Margin.Left; + textBox1.Width = imageBox1.Left - textBox1.Left - 3; + textBox1.Top = (int)Math.Ceiling(decimal.Divide((this.Height - textBox1.Height), 2)); + } + + protected override void OnGotFocus(EventArgs e) + { + base.OnGotFocus(e); + + textBox1.Focus(); + } + + protected void textBox_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) + { + switch (e.KeyCode) + { + case Keys.Enter: + if (this.SubmitButton != null) + { + this.SubmitButton.PerformClick(); + } + + break; + case Keys.Escape: + close(); + break; + default: break; + } + } + + protected virtual void imageBox1_Click(object sender, EventArgs e) => OnButtonClick?.Invoke(sender, e); + + [Category("Action")] + [Browsable(true)] + public event EventHandler OnButtonClick; + + [Browsable(true), EditorBrowsable(EditorBrowsableState.Advanced)] + [Category("Appearance")] + public Forms.TImageBox InnerImageBox { get => imageBox1; set => imageBox1 = value; } + + [Browsable(true), EditorBrowsable(EditorBrowsableState.Advanced)] + [Category("Appearance")] + public System.Windows.Forms.TextBox InnerTextBox { get => textBox1; set => textBox1 = value; } + + [Category("Appearance"), Browsable(true)] + public Image NormalImage { get => imageBox1.ImageNormal; set => imageBox1.ImageNormal = value; } + + [Category("Appearance"), Browsable(true)] + public Image HighlightImage { get => imageBox1.ImageHover; set => imageBox1.ImageHover = value; } + + [Browsable(true), EditorBrowsable(EditorBrowsableState.Advanced)] + [Category("Appearance")] + public new string Text + { + get => textBox1.Text; + set + { + textBox1.Text = value; + textBox1.SelectionStart = textBox1.Text.Length; + } + } + + [Browsable(true), EditorBrowsable(EditorBrowsableState.Advanced)] + [Category("Appearance")] + public bool UseSystemPasswordChar { get => textBox1.UseSystemPasswordChar; set => textBox1.UseSystemPasswordChar = value; } + + [Browsable(true), EditorBrowsable(EditorBrowsableState.Advanced)] + [Category("Appearance")] + public TButton SubmitButton { get; set; } = null; + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new Padding Margin { get => base.Margin; set => base.Margin = value; } + + protected override void updateBackground(Graphics g, ThemeStyle style) + { + int b = (styleActive.BorderWidth + 1) + styleActive.BorderPadding; + + this.Padding = new Padding((b + textboxPadding.Left), (b + textboxPadding.Top), ((b - 1) + textboxPadding.Right), ((b - 1) + textboxPadding.Bottom)); + + Rectangoid area = new Rectangoid(this.ClientRectangle, style.BorderRadius, style.BorderWidth); + g.FillPath(new SolidBrush(style.BackColour), area.ToGraphicsPath()); + g.DrawPath(new Pen(new SolidBrush(style.BorderColour), style.BorderWidth), area.ToGraphicsPath()); + } + + } +} \ No newline at end of file diff --git a/RyzStudio/Windows/ThemedForms/TextBox/TButtonTextBox.designer.cs b/RyzStudio/Windows/ThemedForms/TextBox/TButtonTextBox.designer.cs new file mode 100644 index 0000000..6a37b71 --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/TextBox/TButtonTextBox.designer.cs @@ -0,0 +1,81 @@ +namespace RyzStudio.Windows.ThemedForms +{ + partial class TButtonTextBox + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.textBox1 = new System.Windows.Forms.TextBox(); + this.imageBox1 = new RyzStudio.Windows.Forms.TImageBox(); + ((System.ComponentModel.ISupportInitialize)(this.imageBox1)).BeginInit(); + this.SuspendLayout(); + // + // textBox1 + // + this.textBox1.BackColor = System.Drawing.SystemColors.Window; + this.textBox1.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.textBox1.HideSelection = false; + this.textBox1.Location = new System.Drawing.Point(7, 7); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(68, 13); + this.textBox1.TabIndex = 0; + // + // imageBox1 + // + this.imageBox1.BackColor = System.Drawing.Color.Transparent; + this.imageBox1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; + this.imageBox1.ErrorImage = null; + this.imageBox1.ImageHover = null; + this.imageBox1.Image = null; + this.imageBox1.InitialImage = null; + this.imageBox1.Location = new System.Drawing.Point(107, 4); + this.imageBox1.Name = "imageBox1"; + this.imageBox1.ImageNormal = null; + this.imageBox1.Size = new System.Drawing.Size(18, 25); + this.imageBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage; + this.imageBox1.TabIndex = 1; + this.imageBox1.TabStop = false; + // + // TextBox2 + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.Controls.Add(this.imageBox1); + this.Controls.Add(this.textBox1); + this.Name = "TextBox2"; + this.Padding = new System.Windows.Forms.Padding(4, 4, 3, 3); + this.Size = new System.Drawing.Size(128, 32); + ((System.ComponentModel.ISupportInitialize)(this.imageBox1)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox textBox1; + private Forms.TImageBox imageBox1; + } +} diff --git a/RyzStudio/Windows/ThemedForms/TextBox/TButtonTextBox.resx b/RyzStudio/Windows/ThemedForms/TextBox/TButtonTextBox.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/TextBox/TButtonTextBox.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/RyzStudio/Windows/ThemedForms/TextBox/TFolderTextBox - Copy.resx b/RyzStudio/Windows/ThemedForms/TextBox/TFolderTextBox - Copy.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/TextBox/TFolderTextBox - Copy.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/RyzStudio/Windows/ThemedForms/TextBox/TFolderTextBox.cs b/RyzStudio/Windows/ThemedForms/TextBox/TFolderTextBox.cs new file mode 100644 index 0000000..3b74faa --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/TextBox/TFolderTextBox.cs @@ -0,0 +1,42 @@ +using System; +using System.IO; +using System.Windows.Forms; +using UIResources = BookmarkManager.UIResource; + +namespace RyzStudio.Windows.ThemedForms +{ + public class TFolderTextBox : TButtonTextBox + { + public TFolderTextBox() : base() + { + this.NormalImage = UIResources.folder; + this.HighlightImage = UIResources.folder2; + this.Text = string.Empty; + } + + public FolderBrowserDialog FolderDialog { get; set; } = null; + + protected override void imageBox1_Click(object sender, EventArgs e) + { + if (this.FolderDialog == null) + { + this.FolderDialog = new FolderBrowserDialog(); + this.FolderDialog.Description = "Choose a directory"; + } + + if (!string.IsNullOrWhiteSpace(this.Text)) + { + if (Directory.Exists(this.Text)) + { + this.FolderDialog.SelectedPath = this.Text; + } + } + + if (this.FolderDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) + { + this.Text = this.FolderDialog.SelectedPath; + } + } + + } +} diff --git a/RyzStudio/Windows/ThemedForms/TextBox/TFolderTextBox.resx b/RyzStudio/Windows/ThemedForms/TextBox/TFolderTextBox.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/TextBox/TFolderTextBox.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/RyzStudio/Windows/ThemedForms/TextBox/TKeyCodeTextBox.cs b/RyzStudio/Windows/ThemedForms/TextBox/TKeyCodeTextBox.cs new file mode 100644 index 0000000..c23248f --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/TextBox/TKeyCodeTextBox.cs @@ -0,0 +1,92 @@ +using System; +using System.Text; +using System.Windows.Forms; +using UIResources = BookmarkManager.UIResource; + +namespace RyzStudio.Windows.ThemedForms +{ + public class TKeyCodeTextBox : TButtonTextBox + { + public class Results + { + public bool IsCtrl { get; set; } = false; + public bool IsAlt { get; set; } = false; + public bool IsShift { get; set; } = false; + public Keys Key { get; set; } = Keys.None; + + public int ModifierCode => ((this.IsAlt ? 1 : 0) + (this.IsCtrl ? 2 : 0) + (this.IsShift ? 4 : 0)); + + public int KeyCode => (int)this.Key; + + public string DisplayText + { + get + { + StringBuilder sb = new StringBuilder(); + + if (this.IsCtrl) sb.Append("Ctrl+"); + if (this.IsShift) sb.Append("Shift+"); + if (this.IsAlt) sb.Append("Alt+"); + + sb.Append(this.Key.ToString()); + + return sb.ToString(); + } + } + + public void Clear() + { + this.IsCtrl = false; + this.IsAlt = false; + this.IsShift = false; + this.Key = Keys.None; + } + } + + + public Results KeyCodeResults { get; set; } = new Results(); + + + public TKeyCodeTextBox() : base() + { + this.NormalImage = UIResources.trash; + this.HighlightImage = UIResources.trash2; + this.Text = string.Empty; + + this.InnerTextBox.ReadOnly = true; + this.InnerTextBox.PreviewKeyDown += textBox1_PreviewKeyDown; + } + + private void textBox1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) + { + if (e.KeyCode == Keys.ControlKey) return; + if (e.KeyCode == Keys.ShiftKey) return; + if (e.KeyCode == Keys.Menu) return; + + this.KeyCodeResults.IsCtrl = e.Control; + this.KeyCodeResults.IsAlt = e.Alt; + this.KeyCodeResults.IsShift = e.Shift; + this.KeyCodeResults.Key = e.KeyCode; + + this.Text = this.KeyCodeResults.DisplayText; + } + + protected override void imageBox1_Click(object sender, EventArgs e) + { + this.KeyCodeResults.Clear(); + + this.Text = this.KeyCodeResults.DisplayText; + } + + public void UpdateKeyCode(bool isCtrl, bool isAlt, bool isShift, Keys key) + { + this.KeyCodeResults.IsCtrl = isCtrl; + this.KeyCodeResults.IsAlt = isAlt; + this.KeyCodeResults.IsShift = isShift; + this.KeyCodeResults.Key = key; + + this.Text = this.KeyCodeResults.DisplayText; + } + + } +} diff --git a/RyzStudio/Windows/ThemedForms/TextBox/TOpenFileTextBox.cs b/RyzStudio/Windows/ThemedForms/TextBox/TOpenFileTextBox.cs new file mode 100644 index 0000000..7a66132 --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/TextBox/TOpenFileTextBox.cs @@ -0,0 +1,43 @@ +using System; +using System.IO; +using System.Windows.Forms; +using UIResources = BookmarkManager.UIResource; + +namespace RyzStudio.Windows.ThemedForms +{ + public class TOpenFileTextBox : TButtonTextBox + { + public TOpenFileTextBox() : base() + { + this.NormalImage = UIResources.file; + this.HighlightImage = UIResources.file2; + this.Text = string.Empty; + } + + public OpenFileDialog FileDialog { get; set; } = null; + + protected override void imageBox1_Click(object sender, EventArgs e) + { + if (this.FileDialog == null) + { + this.FileDialog = new OpenFileDialog(); + this.FileDialog.Title = "Choose a file"; + this.FileDialog.Filter = "All files|*"; + } + + if (!string.IsNullOrWhiteSpace(this.Text)) + { + if (File.Exists(this.Text)) + { + this.FileDialog.InitialDirectory = Path.GetDirectoryName(this.Text); + } + } + + if (this.FileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) + { + this.Text = this.FileDialog.FileName; + } + } + + } +} diff --git a/RyzStudio/Windows/ThemedForms/TextBox/TTextBox.cs b/RyzStudio/Windows/ThemedForms/TextBox/TTextBox.cs new file mode 100644 index 0000000..be72ccd --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/TextBox/TTextBox.cs @@ -0,0 +1,100 @@ +using RyzStudio.Drawing; +using System; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace RyzStudio.Windows.ThemedForms +{ + public partial class TTextBox : RyzStudio.Windows.ThemedForms.TUserControl + { + protected readonly Padding textboxPadding = new Padding(6, 6, 6, 6); + + + public TTextBox() : base() + { + InitializeComponent(); + + this.Margin = new Padding(10, 6, 10, 6); + this.Font = new Font(this.Font, FontStyle.Regular); + + textBox1.Font = this.Font; + textBox1.PreviewKeyDown += textBox_PreviewKeyDown; + } + + protected override void OnResize(EventArgs e) + { + base.OnResize(e); + + int b = (styleActive.BorderWidth + 1) + styleActive.BorderPadding; + + this.Height = textBox1.Height + (b + textboxPadding.Top) + ((b - 1) + textboxPadding.Bottom); + + this.Invalidate(); + } + + protected override void OnGotFocus(EventArgs e) + { + base.OnGotFocus(e); + + textBox1.Focus(); + } + + protected void textBox_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) + { + switch (e.KeyCode) + { + case Keys.Enter: + if (this.SubmitButton != null) + { + this.SubmitButton.PerformClick(); + } + + break; + case Keys.Escape: + close(); + break; + default: break; + } + } + + [Browsable(true), EditorBrowsable(EditorBrowsableState.Advanced)] + [Category("Appearance")] + public System.Windows.Forms.TextBox InnerTextBox { get => textBox1; set => textBox1 = value; } + + [Browsable(true), EditorBrowsable(EditorBrowsableState.Advanced)] + [Category("Appearance")] + public new string Text + { + get => textBox1.Text; + set + { + textBox1.Text = value; + textBox1.SelectionStart = textBox1.Text.Length; + } + } + + [Browsable(true), EditorBrowsable(EditorBrowsableState.Advanced)] + [Category("Appearance")] + public bool UseSystemPasswordChar { get => textBox1.UseSystemPasswordChar; set => textBox1.UseSystemPasswordChar = value; } + + [Browsable(true), EditorBrowsable(EditorBrowsableState.Advanced)] + [Category("Appearance")] + public TButton SubmitButton { get; set; } = null; + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new Padding Margin { get { return base.Margin; } set { base.Margin = value; } } + + protected override void updateBackground(Graphics g, ThemeStyle style) + { + int b = (styleActive.BorderWidth + 1) + styleActive.BorderPadding; + + this.Padding = new Padding((b + textboxPadding.Left), (b + textboxPadding.Top), ((b - 1) + textboxPadding.Right), ((b - 1) + textboxPadding.Bottom)); + + Rectangoid area = new Rectangoid(this.ClientRectangle, style.BorderRadius, style.BorderWidth); + g.FillPath(new SolidBrush(style.BackColour), area.ToGraphicsPath()); + g.DrawPath(new Pen(new SolidBrush(style.BorderColour), style.BorderWidth), area.ToGraphicsPath()); + } + + } +} \ No newline at end of file diff --git a/RyzStudio/Windows/ThemedForms/TextBox/TTextBox.designer.cs b/RyzStudio/Windows/ThemedForms/TextBox/TTextBox.designer.cs new file mode 100644 index 0000000..752557d --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/TextBox/TTextBox.designer.cs @@ -0,0 +1,60 @@ +namespace RyzStudio.Windows.ThemedForms +{ + partial class TTextBox + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.textBox1 = new System.Windows.Forms.TextBox(); + this.SuspendLayout(); + // + // textBox1 + // + this.textBox1.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.textBox1.Dock = System.Windows.Forms.DockStyle.Fill; + this.textBox1.HideSelection = false; + this.textBox1.Location = new System.Drawing.Point(4, 4); + this.textBox1.Name = "textBox1"; + this.textBox1.Size = new System.Drawing.Size(121, 13); + this.textBox1.TabIndex = 0; + // + // TextBox + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.Controls.Add(this.textBox1); + this.Name = "TextBox"; + this.Padding = new System.Windows.Forms.Padding(4, 4, 3, 3); + this.Size = new System.Drawing.Size(128, 32); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox textBox1; + } +} diff --git a/RyzStudio/Windows/ThemedForms/TextBox/TTextBox.resx b/RyzStudio/Windows/ThemedForms/TextBox/TTextBox.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/TextBox/TTextBox.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Text/Json/JsonPointConverter.cs b/Text/Json/JsonPointConverter.cs new file mode 100644 index 0000000..e787cdc --- /dev/null +++ b/Text/Json/JsonPointConverter.cs @@ -0,0 +1,40 @@ +using System; +using System.Drawing; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace FizzyLauncher.Text.Json +{ + public class JsonPointConverter : JsonConverter + { + public override Point Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + Point rs = new Point(0, 0); + + if (reader.TokenType == JsonTokenType.String) + { + string[] parts = reader.GetString().Split(','); + if (parts.Length != 2) + { + return rs; + } + + int x = 0; + int y = 0; + + if (!int.TryParse(parts[0].Trim(), out x)) x = 0; + if (!int.TryParse(parts[1].Trim(), out y)) y = 0; + + return new Point(x, y); + } + + return rs; + } + + public override void Write(Utf8JsonWriter writer, Point value, JsonSerializerOptions options) + { + writer.WriteStringValue(string.Format("{0}, {1}", value.X.ToString(), value.Y.ToString())); + } + + } +} diff --git a/Text/Json/JsonSizeConverter.cs b/Text/Json/JsonSizeConverter.cs new file mode 100644 index 0000000..eb763fa --- /dev/null +++ b/Text/Json/JsonSizeConverter.cs @@ -0,0 +1,40 @@ +using System; +using System.Drawing; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace FizzyLauncher.Text.Json +{ + public class JsonSizeConverter : JsonConverter + { + public override Size Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + Size rs = new Size(0, 0); + + if (reader.TokenType == JsonTokenType.String) + { + string[] parts = reader.GetString().Split(','); + if (parts.Length != 2) + { + return rs; + } + + int w = 0; + int h = 0; + + if (!int.TryParse(parts[0].Trim(), out w)) w = 0; + if (!int.TryParse(parts[1].Trim(), out h)) h = 0; + + return new Size(w, h); + } + + return rs; + } + + public override void Write(Utf8JsonWriter writer, Size value, JsonSerializerOptions options) + { + writer.WriteStringValue(string.Format("{0}, {1}", value.Width.ToString(), value.Height.ToString())); + } + + } +} diff --git a/UIResource.Designer.cs b/UIResource.Designer.cs new file mode 100644 index 0000000..01da551 --- /dev/null +++ b/UIResource.Designer.cs @@ -0,0 +1,303 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace BookmarkManager { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class UIResource { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal UIResource() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [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("BookmarkManager.UIResource", typeof(UIResource).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap arrow_down { + get { + object obj = ResourceManager.GetObject("arrow_down", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap arrow_down2 { + get { + object obj = ResourceManager.GetObject("arrow_down2", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap arrow_up { + get { + object obj = ResourceManager.GetObject("arrow_up", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap arrow_up2 { + get { + object obj = ResourceManager.GetObject("arrow_up2", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap circle_menu { + get { + object obj = ResourceManager.GetObject("circle_menu", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap circle_menu2 { + get { + object obj = ResourceManager.GetObject("circle_menu2", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap close { + get { + object obj = ResourceManager.GetObject("close", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap close2 { + get { + object obj = ResourceManager.GetObject("close2", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap cog { + get { + object obj = ResourceManager.GetObject("cog", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap cog2 { + get { + object obj = ResourceManager.GetObject("cog2", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap disk { + get { + object obj = ResourceManager.GetObject("disk", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap disk2 { + get { + object obj = ResourceManager.GetObject("disk2", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap edit { + get { + object obj = ResourceManager.GetObject("edit", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap edit2 { + get { + object obj = ResourceManager.GetObject("edit2", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap file { + get { + object obj = ResourceManager.GetObject("file", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap file2 { + get { + object obj = ResourceManager.GetObject("file2", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap folder { + get { + object obj = ResourceManager.GetObject("folder", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap folder2 { + get { + object obj = ResourceManager.GetObject("folder2", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap help { + get { + object obj = ResourceManager.GetObject("help", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap help2 { + get { + object obj = ResourceManager.GetObject("help2", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap plus { + get { + object obj = ResourceManager.GetObject("plus", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap plus2 { + get { + object obj = ResourceManager.GetObject("plus2", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap trash { + get { + object obj = ResourceManager.GetObject("trash", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap trash2 { + get { + object obj = ResourceManager.GetObject("trash2", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/UIResource.resx b/UIResource.resx new file mode 100644 index 0000000..20df970 --- /dev/null +++ b/UIResource.resx @@ -0,0 +1,193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + Resources\UI\arrow_down.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + Resources\UI\arrow_down2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + Resources\UI\arrow_up.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + Resources\UI\arrow_up2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + Resources\UI\circle_menu.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + Resources\UI\circle_menu2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + Resources\UI\close.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + Resources\UI\close2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + Resources\UI\cog.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + Resources\UI\cog2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + Resources\UI\disk.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + Resources\UI\disk2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + Resources\UI\edit.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + Resources\UI\edit2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + Resources\UI\file.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + Resources\UI\file2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + Resources\UI\folder.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + Resources\UI\folder2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + Resources\UI\help.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + Resources\UI\help2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + Resources\UI\plus.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + Resources\UI\plus2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + Resources\UI\trash.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + Resources\UI\trash2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/Windows/Forms/BookmarkTreeView.cs b/Windows/Forms/BookmarkTreeView.cs new file mode 100644 index 0000000..2b01cb7 --- /dev/null +++ b/Windows/Forms/BookmarkTreeView.cs @@ -0,0 +1,1074 @@ +using bzit.bomg; +using bzit.bomg.Models; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using Resources = BookmarkManager.AppResource; + +namespace RyzStudio.Windows.Forms +{ + public partial class BookmarkTreeView : TreeView + { + public static string DecodePath(string value) + { + return System.Web.HttpUtility.UrlDecode(value); + } + + public static void DeleteNode(TreeNode node) + { + if (node == null) + { + return; + } + + if (node.TreeView.Nodes.Count <= 0) + { + return; + } + + if (node.Equals(node.TreeView.Nodes[0])) + { + return; + } + + node.Remove(); + } + + public static string EncodePath(string value) + { + return System.Web.HttpUtility.UrlEncode(value); + } + + public static BookmarkItemViewModel GetNodeModel(TreeNode node) + { + if (node == null) + { + return null; + } + + return (BookmarkItemViewModel)node.Tag; + } + + public static string GetNodePath(TreeNode node) + { + string[] folderList = node.FullPath.Split('\n'); + if (folderList.Length < 2) + { + return null; + } + + //if (folderList.Length < 2) + //{ + // return "/"; + //} + + StringBuilder sb = new StringBuilder(); + + for (int i = 0; i < (folderList.Length - 1); i++) + { + sb.Append("\\"); + sb.Append(EncodePath(folderList[i] ?? string.Empty)); + } + + sb.Append("\\"); + + return sb.ToString(); + } + + public static NodeType GetNodeType(TreeNode node) + { + if (node.Tag == null) + { + if (node.Equals(node.TreeView.Nodes[0])) + { + return NodeType.Root; + } + else + { + return NodeType.Folder; + } + } + else + { + if (node.Tag is BookmarkItemViewModel) + { + return NodeType.Page; + } + else + { + return NodeType.None; + } + } + } + + public static void MoveDown(TreeNode node) + { + if (node == null) + { + return; + } + + TreeNode tn = node; + if (tn.Parent == null) + { + return; + } + + TreeNode tn1 = tn.Parent; + + if (tn.Index >= (tn1.Nodes.Count - 1)) + { + return; + } + + int n = tn.Index + 1; + + tn1.Nodes.Remove(tn); + tn1.Nodes.Insert(n, tn); + + node.TreeView.SelectedNode = tn; + } + + public static void MoveUp(TreeNode node) + { + if (node == null) + { + return; + } + + TreeNode tn = node; + if (tn.Parent == null) + { + return; + } + + if (tn.Index <= 0) + { + return; + } + + int n = tn.Index - 1; + + TreeNode tn1 = tn.Parent; + tn1.Nodes.Remove(tn); + tn1.Nodes.Insert(n, tn); + + node.TreeView.SelectedNode = tn; + } + + public static void Sort(TreeNode node) + { + if (node == null) + { + return; + } + + string[] tnv = new string[0]; + TreeNode[] tna = new TreeNode[0]; + + foreach (TreeNode tn2 in node.Nodes) + { + Array.Resize(ref tna, (tna.Length + 1)); + tna[(tna.Length - 1)] = tn2; + + Array.Resize(ref tnv, (tnv.Length + 1)); + tnv[(tnv.Length - 1)] = tn2.Text; + } + + Array.Sort(tnv, tna); + + node.Nodes.Clear(); + + foreach (TreeNode tn2 in tna) + { + node.Nodes.Add(tn2); + } + } + + + public enum IconSet + { + Root = 0, + Folder1, + Folder2, + Default + } + + public enum NodeType + { + None = 0, + Root, + Folder, + Page + } + + + protected const string DEFAULT_NEW_FOLDER_NAME = "New Folder"; + protected const string PATH_SEPARATOR = "\n"; + + + public event EventHandler OnNodeChanged = null; + + //protected IconDatabase iconDatabase = null; + protected TreeNode draggingNode = null; + protected bool hasChanged = false; + + + public BookmarkTreeView() + { + if (this.ImageList == null) this.ImageList = new ImageList(); + this.PathSeparator = PATH_SEPARATOR; + + this.AllowDrop = true; + this.HideSelection = false; + this.HotTracking = true; + this.ImageIndex = 0; + this.LabelEdit = true; + this.PathSeparator = "\n"; + this.SelectedImageIndex = 0; + this.ShowNodeToolTips = true; + + this.ImageList.ColorDepth = ColorDepth.Depth16Bit; + this.ImageList.ImageSize = new Size(16, 16); + this.ImageList.TransparentColor = Color.Transparent; + this.ImageList.Images.Clear(); + this.ImageList.Images.Add(Resources.hexagon); + this.ImageList.Images.Add(Resources.folder); + this.ImageList.Images.Add(Resources.folder_explore); + this.ImageList.Images.Add(Resources.file_text); + + } + +#region encapsulation + + [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public new ImageList ImageList { get => base.ImageList; set => base.ImageList = value; } + + [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public new bool AllowDrop { get => base.AllowDrop; set => base.AllowDrop = value; } + + [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public new bool HideSelection { get => base.HideSelection; set => base.HideSelection = value; } + + [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public new bool HotTracking { get => base.HotTracking; set => base.HotTracking = value; } + + [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public new int ImageIndex { get => base.ImageIndex; set => base.ImageIndex = value; } + + [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public new bool LabelEdit { get => base.LabelEdit; set => base.LabelEdit = value; } + + [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public new string PathSeparator { get => base.PathSeparator; set => base.PathSeparator = value; } + + [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public new int SelectedImageIndex { get => base.SelectedImageIndex; set => base.SelectedImageIndex = value; } + + [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public new bool ShowNodeToolTips { get => base.ShowNodeToolTips; set => base.ShowNodeToolTips = value; } + +#endregion + + [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public bool AllowBeginEdit { get; set; } = false; + + + [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public bool HasChanged + { + get => hasChanged; + protected set + { + hasChanged = value; + + OnNodeChanged?.Invoke(null, null); + } + } + + + public bool InitialiseIconDatabase(out string message, string filename) + { + message = string.Empty; + + //if (string.IsNullOrWhiteSpace(filename)) + //{ + // return false; + //} + + //if (iconDatabase == null) + //{ + // iconDatabase = new IconDatabase(); + //} + + //bool rv = false; + //if (File.Exists(filename)) + //{ + // rv = iconDatabase.LoadFile(filename); + // if (!rv) + // { + // rv = iconDatabase.Create(filename, true, null, true); + // if (!rv) + // { + // message = iconDatabase.LastError; + // return false; + // } + // } + //} + //else + //{ + // rv = iconDatabase.Create(filename, true, null, true); + // if (!rv) + // { + // message = iconDatabase.LastError; + // return false; + // } + //} + + return true; + } + + public TreeNode AddFolder(string name = "") + { + return this.AddFolder(this.SelectedNode, name); + } + + public TreeNode AddFolder(TreeNode node, string name = "") + { + if (node == null) + { + return null; + } + + if (node.Tag != null) + { + return null; + } + + if (string.IsNullOrWhiteSpace(name)) + { + name = DEFAULT_NEW_FOLDER_NAME; + } + + return node.Nodes.Add(EncodePath(name), name, (int)IconSet.Folder1, (int)IconSet.Folder2); + } + + //public void AddItem(List viewModelList) + //{ + // this.Clear(); + + // if (viewModelList == null) + // { + // return; + // } + + // foreach (BookmarkItemViewModel item in viewModelList) + // { + // AddItem(item); + // } + + // this.HasChanged = false; + //} + + public void AddItem(BookmarkItemViewModel viewModel) + { + int iconIndex = addIcon(viewModel); + + TreeNode tn = new TreeNode(viewModel.SiteName, iconIndex, iconIndex); + tn.Tag = viewModel; + tn.ToolTipText = viewModel.ToString(); + + TreeNode tn2 = addFolderPath(viewModel.TreeviewPath); + + ThreadControl.Add(tn2, tn); + + this.HasChanged = true; + } + + public void AddItem(TreeNode treeNode, BookmarkItemViewModel viewModel) + { + if (treeNode == null) + { + return; + } + + int iconIndex = addIcon(viewModel); + + TreeNode tn = new TreeNode(viewModel.SiteName, iconIndex, iconIndex); + tn.Tag = viewModel; + tn.ToolTipText = viewModel.ToString(); + + treeNode.Nodes.Add(tn); + + this.HasChanged = true; + } + + //public void AddOrUpdateItem(TreeNode treeNode, BookmarkItemViewModel viewModel) + //{ + // switch (GetNodeType(treeNode)) + // { + // case NodeType.Root: + // case NodeType.Folder: + // AddItem(treeNode, viewModel); + // break; + // case NodeType.Page: + // UpdateItem(treeNode, viewModel); + // break; + // default: + // break; + // } + //} + + public void Clear() + { + ThreadControl.Clear(this); + + this.HasChanged = false; + } + + public void Clear(string name) + { + ThreadControl.Clear(this); + ThreadControl.Add(this, this.Nodes, "", name?.Trim(), (int)IconSet.Root, (int)IconSet.Root); + + this.HasChanged = true; + } + + public void CloseIconDatabase() + { + //iconDatabase.Close(); + } + + public int CountBookmarkItem() + { + int itemCount = 0; + + if (this.Nodes.Count <= 0) + { + return itemCount; + } + + foreach (TreeNode item in this.Nodes) + { + traverseBookmarkList(ref itemCount, item); + } + + return itemCount; + } + + public void DeleteNode() => DeleteNode(this.SelectedNode); + + public void EditNode() + { + this.EditNode(this.SelectedNode); + } + + public void EditNode(TreeNode node) + { + if (node == null) + { + return; + } + + if (node.IsEditing) + { + return; + } + + switch (GetNodeType(node)) + { + case BookmarkTreeView.NodeType.Root: + case BookmarkTreeView.NodeType.Folder: + this.AllowBeginEdit = true; + node.BeginEdit(); + break; + case BookmarkTreeView.NodeType.Page: + this.AllowBeginEdit = true; + node.BeginEdit(); + break; + default: + break; + } + } + + + public NodeType GetNodeType() => GetNodeType(this.SelectedNode); + + public string GetNodePath() => GetNodePath(this.SelectedNode); + + public BookmarkItemViewModel GetNodeModel() => GetNodeModel(this.SelectedNode); + + public List GetBookmarkList() + { + List rs = new List(); + + if (this.Nodes.Count <= 0) + { + return rs; + } + + foreach (TreeNode item in this.Nodes) + { + traverseBookmarkList(rs, item); + } + + return rs; + } + + //public List GetBookmarkNodeList() + //{ + // List rs = new List(); + + // if (this.Nodes.Count <= 0) + // { + // return rs; + // } + + // foreach (TreeNode item in this.Nodes) + // { + // traverseBookmarkList(rs, item); + // } + + // return rs; + //} + + public bool FindTextNode(TreeNode node, string term) + { + if (node == null) + { + return false; + } + + if (this.Nodes.Count <= 0) + { + return false; + } + + bool rt = false; + bool inclusive = false; + TreeNode tn = node; + while (true) + { + if (tn == null) + { + break; + } + + if (inclusive) + { + if (tn.Text.ToLower().Contains(term.ToLower())) + { + this.SelectedNode = tn; + this.SelectedNode.EnsureVisible(); + rt = true; + break; + } + } + + if (tn.Nodes.Count > 0) + { + tn = tn.Nodes[0]; + inclusive = true; + } + else + { + if (tn.NextNode != null) + { + tn = tn.NextNode; + inclusive = true; + } + else + { + while (true) + { + tn = tn.Parent; + if (tn == null) + { + break; + } + + if (tn.NextNode != null) + { + tn = tn.NextNode; + break; + } + } + + inclusive = true; + } + } + } + + return rt; + } + + public void MoveDown() => MoveDown(this.SelectedNode); + + public void MoveUp() => MoveUp(this.SelectedNode); + + public void SetNoChanges() + { + hasChanged = false; + } + + public void Sort() => Sort(this.SelectedNode); + + + + public void UpdateItem(TreeNode treeNode, BookmarkItemViewModel viewModel) + { + if (treeNode == null) + { + return; + } + + int iconIndex = addIcon(viewModel); + + treeNode.Text = viewModel.SiteName; + treeNode.ImageIndex = iconIndex; + treeNode.SelectedImageIndex = iconIndex; + treeNode.Tag = viewModel; + treeNode.ToolTipText = viewModel.ToString(); + + this.HasChanged = true; + } + + + #region integrated behaviour + + protected override void OnItemDrag(ItemDragEventArgs e) + { + base.OnItemDrag(e); + + draggingNode = (TreeNode)e.Item; + DoDragDrop(e.Item, DragDropEffects.Move); + } + + protected override void OnDragDrop(DragEventArgs e) + { + base.OnDragDrop(e); + + if (draggingNode.Level <= 0) + { + return; + } + + TreeNode en = this.GetNodeAt(this.PointToClient(new Point(e.X, e.Y))); + if (en == null) + { + return; + } + + if (isNodeChild(draggingNode, en)) + { + return; + } + + TreeNode dn = draggingNode; + if (en.Tag == null) + { + dn.Parent.Nodes.Remove(dn); + en.Nodes.Insert(0, dn); + } + else + { + en.Parent.Nodes.Remove(dn); + en.Parent.Nodes.Insert(en.Index + 1, dn); + } + + this.HasChanged = true; + } + + protected override void OnDragEnter(DragEventArgs e) + { + base.OnDragEnter(e); + + e.Effect = DragDropEffects.Move; + } + + protected override void OnMouseDown(MouseEventArgs e) + { + base.OnMouseDown(e); + + this.SelectedNode = this.GetNodeAt(e.Location); + } + + protected override void OnDragOver(DragEventArgs e) + { + base.OnDragOver(e); + + this.SelectedNode = this.GetNodeAt(this.PointToClient(new Point(e.X, e.Y))); + } + + protected override void OnBeforeLabelEdit(NodeLabelEditEventArgs e) + { + if (!AllowBeginEdit) + { + AllowBeginEdit = false; + + e.CancelEdit = true; + return; + } + + this.HasChanged = true; + + base.OnBeforeLabelEdit(e); + } + + protected override void OnAfterLabelEdit(NodeLabelEditEventArgs e) + { + base.OnAfterLabelEdit(e); + + //if (e.Node.Tag == null) + //{ + // if (e.Label == null) + // { + // e.CancelEdit = true; + // } + // else + // { + // if (e.Label.Trim().Length <= 0) + // { + // e.CancelEdit = true; + // } + // } + //} + //else + //{ + // e.CancelEdit = true; + //} + + AllowBeginEdit = false; + } + + protected override void OnPreviewKeyDown(PreviewKeyDownEventArgs e) + { + TreeNode tn = this.SelectedNode; + if (tn == null) + { + return; + } + + NodeType nodeType = this.GetNodeType(); + + switch (e.KeyCode) + { + case Keys.Insert: + if (e.Modifiers == Keys.Shift) + { + if ((nodeType == NodeType.Root) || (nodeType == NodeType.Folder)) + { + this.SelectedNode = this.AddFolder(); + } + else if (nodeType == NodeType.Page) + { + this.SelectedNode = tn.Parent; + this.SelectedNode = this.AddFolder(); + } + } + + break; + case Keys.Delete: + if (!tn.IsEditing) + { + this.DeleteNode(); + } + + break; + case Keys.F2: + if ((nodeType == NodeType.Root) || (nodeType == NodeType.Folder)) + { + this.AllowBeginEdit = true; + + this.EditNode(); + } + + break; + case Keys.F3: + switch (nodeType) + { + case NodeType.Root: + case NodeType.Folder: + try + { + Clipboard.SetText(tn.Text ?? string.Empty); + } + catch + { + } + + break; + case NodeType.Page: + BookmarkItemViewModel viewModel = this.GetNodeModel(); + if (viewModel != null) + { + try + { + Clipboard.SetText(viewModel.SiteAddress ?? string.Empty); + } + catch + { + } + } + + break; + default: + break; + } + + break; + case Keys.Up: + if (e.Modifiers == Keys.Control) + { + this.MoveUp(); + this.HasChanged = true; + } + + break; + case Keys.Down: + if (e.Modifiers == Keys.Control) + { + this.MoveDown(); + this.HasChanged = true; + } + + break; + default: break; + } + + base.OnPreviewKeyDown(e); + } + + #endregion + + + protected int addIcon(BookmarkItemViewModel viewModel) => addIcon(viewModel.ToModel()); + + protected int addIcon(BookmarkItemModel model) + { + return (int)IconSet.Default; + + + if (this.ImageList.Images.ContainsKey(model.SiteAddress)) + { + return this.ImageList.Images.IndexOfKey(model.SiteAddress); + } + + //if (iconDatabase.HasIcon(model.SiteAddress)) + //{ + // Image rs = iconDatabase.GetIcon(model.SiteAddress); + // if (rs == null) + // { + // return (int)IconSet.Default; + // } + // else + // { + // this.Add(this.ImageList, model.SiteAddress, rs); + + // return this.ImageList.Images.IndexOfKey(model.SiteAddress); + // } + //} + + byte[] rawData; + Bitmap bmp = model.RetrieveFavicon(out rawData); + if (bmp == null) + { + return (int)IconSet.Default; + } + + this.Add(this.ImageList, model.SiteAddress, bmp); + + //iconDatabase.AddIcon(model.SiteAddress, rawData); + + return this.ImageList.Images.IndexOfKey(model.SiteAddress); + } + + protected TreeNode addFolderPath(string path) + { + TreeNode tn = null; + //TreeNode tn = this.Nodes[0]; + //if (tn == null) + //{ + // return tn; + //} + + if (string.IsNullOrWhiteSpace(path)) + { + return tn; + } + + if (string.IsNullOrWhiteSpace(path.Trim('\\'))) + { + return tn; + } + + string[] folderList = path.Trim('\\').Split('\\'); + if (folderList.Length <= 0) + { + return tn; + } + + for (int i=0; i rs, TreeNode node) + { + foreach (TreeNode tn in node.Nodes) + { + NodeType nodeType = GetNodeType(tn); + if (nodeType == NodeType.Folder) + { + traverseBookmarkList(rs, tn); + } + else if (nodeType == NodeType.Page) + { + BookmarkItemViewModel nodeTag = GetNodeModel(tn); + nodeTag.TreeviewPath = GetNodePath(tn); + + if (nodeTag != null) + { + rs.Add(nodeTag); + } + } + } + } + + protected void traverseBookmarkList(List rs, TreeNode node) + { + foreach (TreeNode tn in node.Nodes) + { + NodeType nodeType = GetNodeType(tn); + if (nodeType == NodeType.Folder) + { + traverseBookmarkList(rs, tn); + } + else if (nodeType == NodeType.Page) + { + BookmarkItemViewModel nodeTag = GetNodeModel(tn); + nodeTag.TreeviewPath = GetNodePath(tn); + + if (nodeTag != null) + { + rs.Add(tn); + } + } + } + } + + protected void traverseBookmarkList(ref int itemCount, TreeNode node) + { + foreach (TreeNode tn in node.Nodes) + { + NodeType nodeType = GetNodeType(tn); + if (nodeType == NodeType.Folder) + { + traverseBookmarkList(ref itemCount, tn); + } + else if (nodeType == NodeType.Page) + { + itemCount++; + } + } + } + + protected bool isNodeChild(TreeNode drag_node, TreeNode drop_node) + { + TreeNode tn = drop_node; + while (true) + { + if (tn.Parent == null) + { + break; + } + + if (tn.Equals(drag_node)) + { + return true; + } + + tn = tn.Parent; + } + + return false; + } + + protected void Add(ImageList control, string key, Image value) + { + if (this.InvokeRequired) + { + this.Invoke(new MethodInvoker(() => { + control.Images.Add(key, value); + })); + } + else + { + control.Images.Add(key, value); + } + } + + protected TreeNode Add(string key, string text, int imageIndex, int selectedImageIndex) + { + TreeNode rs = null; + + if (this.InvokeRequired) + { + this.Invoke(new MethodInvoker(() => { + rs = this.Nodes.Add(key, text, imageIndex, selectedImageIndex); + })); + } + else + { + rs = this.Nodes.Add(key, text, imageIndex, selectedImageIndex); + } + + return rs; + } + + protected TreeNode Add(TreeNode control, string key, string text, int imageIndex, int selectedImageIndex) + { + TreeNode rs = null; + + if (control.TreeView.InvokeRequired) + { + control.TreeView.Invoke(new MethodInvoker(() => { + rs = control.Nodes.Add(key, text, imageIndex, selectedImageIndex); + })); + } + else + { + rs = control.Nodes.Add(key, text, imageIndex, selectedImageIndex); + } + + return rs; + } + + + } +} \ No newline at end of file diff --git a/Windows/Forms/BookmarkTreeViewSNode.cs b/Windows/Forms/BookmarkTreeViewSNode.cs new file mode 100644 index 0000000..e7756c7 --- /dev/null +++ b/Windows/Forms/BookmarkTreeViewSNode.cs @@ -0,0 +1,211 @@ +using bzit.bomg.Models; +using System; +using System.Windows.Forms; +using static RyzStudio.Windows.Forms.BookmarkTreeView; + +namespace RyzStudio.Windows.Forms +{ + public class BookmarkTreeViewSNode + { + protected BookmarkTreeView parentTreeview = null; + + + public BookmarkTreeViewSNode(BookmarkTreeView treeview) + { + parentTreeview = treeview; + } + + protected TreeNode SelectedNode + { + get => parentTreeview?.SelectedNode; + set + { + if (parentTreeview == null) + { + return; + } + + parentTreeview.SelectedNode = value; + } + } + + //public TreeNode AddFolder() => parentTreeview.AddFolder(this.SelectedNode); + + //public TreeNode AddFolder(string name) => parentTreeview.AddFolder(this.SelectedNode, name); + + //public TreeNode AddItem(string name, object tag) + //{ + // if (this.SelectedNode == null) + // { + // return null; + // } + + // if (this.SelectedNode.Tag != null) + // { + // return null; + // } + + // TreeNode tn = new TreeNode(name, (int)BookmarkTreeView.IconSet.Default, (int)BookmarkTreeView.IconSet.Default); + // tn.Tag = tag; + + // this.SelectedNode.Nodes.Add(tn); + + // return tn; + //} + + //public void AddOrUpdateItem(BookmarkItemViewModel viewModel) + //{ + // switch (this.GetNodeType()) + // { + // case NodeType.Root: + // case NodeType.Folder: + // parentTreeview.AddItem(this.SelectedNode, viewModel); + // break; + // case NodeType.Page: + // parentTreeview.UpdateItem(this.SelectedNode, viewModel); + // break; + // default: + // break; + // } + //} + + //public void Delete() + //{ + // if (this.SelectedNode == null) + // { + // return; + // } + + // if (parentTreeview.Nodes.Count <= 0) + // { + // return; + // } + + // if (this.SelectedNode.Equals(parentTreeview.Nodes[0])) + // { + // return; + // } + + // this.SelectedNode.Remove(); + //} + + //public void Edit() + //{ + // if (this.SelectedNode == null) + // { + // return; + // } + + // if (this.SelectedNode.IsEditing) + // { + // return; + // } + + // switch (this.GetNodeType()) + // { + // case BookmarkTreeView.NodeType.Root: + // case BookmarkTreeView.NodeType.Folder: + // parentTreeview.AllowBeginEdit = true; + // this.SelectedNode.BeginEdit(); + // break; + // case BookmarkTreeView.NodeType.Page: + // parentTreeview.AllowBeginEdit = true; + // this.SelectedNode.BeginEdit(); + // break; + // default: + // break; + // } + //} + + //public bool FindTextNode(string term) => parentTreeview.FindTextNode(this.SelectedNode, term); + + //public BookmarkTreeView.NodeType GetNodeType() => parentTreeview.GetNodeType(this.SelectedNode); + + //public BookmarkItemViewModel GetViewModel() => parentTreeview.GetViewModel(this.SelectedNode); + + //public void MoveDown() + //{ + // if (this.SelectedNode == null) + // { + // return; + // } + + // TreeNode tn = this.SelectedNode; + // if (tn.Parent == null) + // { + // return; + // } + + // TreeNode tn1 = tn.Parent; + + // if (tn.Index >= (tn1.Nodes.Count - 1)) + // { + // return; + // } + + // int n = tn.Index + 1; + + // tn1.Nodes.Remove(tn); + // tn1.Nodes.Insert(n, tn); + + // this.SelectedNode = tn; + //} + + //public void MoveUp() + //{ + // if (this.SelectedNode == null) + // { + // return; + // } + + // TreeNode tn = this.SelectedNode; + // if (tn.Parent == null) + // { + // return; + // } + + // if (tn.Index <= 0) + // { + // return; + // } + + // int n = tn.Index - 1; + + // TreeNode tn1 = tn.Parent; + // tn1.Nodes.Remove(tn); + // tn1.Nodes.Insert(n, tn); + + // this.SelectedNode = tn; + //} + + //public void Sort() + //{ + // if (this.SelectedNode == null) + // { + // return; + // } + + // string[] tnv = new string[0]; + // TreeNode[] tna = new TreeNode[0]; + + // foreach (TreeNode tn2 in this.SelectedNode.Nodes) + // { + // Array.Resize(ref tna, (tna.Length + 1)); + // tna[(tna.Length - 1)] = tn2; + + // Array.Resize(ref tnv, (tnv.Length + 1)); + // tnv[(tnv.Length - 1)] = tn2.Text; + // } + + // Array.Sort(tnv, tna); + + // this.SelectedNode.Nodes.Clear(); + + // foreach (TreeNode tn2 in tna) + // { + // this.SelectedNode.Nodes.Add(tn2); + // } + //} + + } +} diff --git a/Windows/Forms/EditGroupForm.cs b/Windows/Forms/EditGroupForm.cs new file mode 100644 index 0000000..96191f1 --- /dev/null +++ b/Windows/Forms/EditGroupForm.cs @@ -0,0 +1,176 @@ +using FizzyLauncher.Models; +using RyzStudio.Windows.ThemedForms; +using System; + +namespace FizzyLauncher.Windows.Forms +{ + public class EditGroupForm : TDialogForm + { + public static void ShowDialog(TilePanelLayout control) + { + EditGroupForm form = new EditGroupForm(); + form.TilePanelLayout = control; + form.ShowDialog(); + } + + + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label1; + private TButton button1; + private TPickerBox pickerBox1; + private RyzStudio.Windows.Forms.THorizontalSeparator horizontalSeparator2; + private TTextBox textBox1; + + + public EditGroupForm() : base() + { + InitializeComponent(); + + pickerBox1.ComboBox.Items.Clear(); + pickerBox1.ComboBox.Items.AddRange(new string[] { "No", "Yes" }); + if (pickerBox1.ComboBox.Items.Count > 0) pickerBox1.ComboBox.SelectedIndex = 0; + } + + private void InitializeComponent() + { + this.textBox1 = new RyzStudio.Windows.ThemedForms.TTextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.button1 = new RyzStudio.Windows.ThemedForms.TButton(); + this.pickerBox1 = new RyzStudio.Windows.ThemedForms.TPickerBox(); + this.horizontalSeparator2 = new RyzStudio.Windows.Forms.THorizontalSeparator(); + this.SuspendLayout(); + // + // textBox1 + // + this.textBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBox1.BackColor = System.Drawing.Color.Transparent; + this.textBox1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.textBox1.Location = new System.Drawing.Point(192, 20); + this.textBox1.Margin = new System.Windows.Forms.Padding(10, 6, 10, 6); + this.textBox1.Name = "textBox1"; + this.textBox1.Padding = new System.Windows.Forms.Padding(10, 10, 9, 9); + this.textBox1.Size = new System.Drawing.Size(177, 35); + this.textBox1.SubmitButton = null; + this.textBox1.TabIndex = 152; + this.textBox1.UseSystemPasswordChar = false; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.BackColor = System.Drawing.Color.Transparent; + this.label2.ForeColor = System.Drawing.SystemColors.ControlText; + this.label2.Location = new System.Drawing.Point(10, 62); + this.label2.Name = "label2"; + this.label2.Padding = new System.Windows.Forms.Padding(0, 9, 0, 10); + this.label2.Size = new System.Drawing.Size(119, 34); + this.label2.TabIndex = 155; + this.label2.Text = "Show Only Expanded"; + this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.BackColor = System.Drawing.Color.Transparent; + this.label1.ForeColor = System.Drawing.SystemColors.ControlText; + this.label1.Location = new System.Drawing.Point(10, 21); + this.label1.Margin = new System.Windows.Forms.Padding(0); + this.label1.Name = "label1"; + this.label1.Padding = new System.Windows.Forms.Padding(0, 9, 0, 10); + this.label1.Size = new System.Drawing.Size(29, 34); + this.label1.TabIndex = 153; + this.label1.Text = "Title"; + this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // button1 + // + this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.button1.BackColor = System.Drawing.Color.Transparent; + this.button1.DefaultImage = null; + this.button1.DownImage = null; + this.button1.IsSelected = false; + this.button1.LabelText = "&Save"; + this.button1.Location = new System.Drawing.Point(241, 469); + this.button1.Margin = new System.Windows.Forms.Padding(10); + this.button1.Name = "button1"; + this.button1.OverImage = null; + this.button1.Padding = new System.Windows.Forms.Padding(4, 4, 3, 3); + this.button1.Size = new System.Drawing.Size(128, 32); + this.button1.TabIndex = 173; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // pickerBox1 + // + this.pickerBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.pickerBox1.BackColor = System.Drawing.Color.Transparent; + this.pickerBox1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.pickerBox1.Location = new System.Drawing.Point(285, 62); + this.pickerBox1.Margin = new System.Windows.Forms.Padding(10, 6, 10, 6); + this.pickerBox1.Name = "pickerBox1"; + this.pickerBox1.Padding = new System.Windows.Forms.Padding(10, 6, 7, 5); + this.pickerBox1.Size = new System.Drawing.Size(84, 34); + this.pickerBox1.SubmitButton = null; + this.pickerBox1.TabIndex = 174; + // + // horizontalSeparator2 + // + this.horizontalSeparator2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.horizontalSeparator2.AutoScrollMargin = new System.Drawing.Size(0, 0); + this.horizontalSeparator2.AutoScrollMinSize = new System.Drawing.Size(0, 0); + this.horizontalSeparator2.BackColor = System.Drawing.Color.Transparent; + this.horizontalSeparator2.Location = new System.Drawing.Point(10, 437); + this.horizontalSeparator2.Margin = new System.Windows.Forms.Padding(10, 0, 10, 0); + this.horizontalSeparator2.MaximumSize = new System.Drawing.Size(4920, 2); + this.horizontalSeparator2.MinimumSize = new System.Drawing.Size(0, 22); + this.horizontalSeparator2.Name = "horizontalSeparator2"; + this.horizontalSeparator2.Padding = new System.Windows.Forms.Padding(0, 10, 0, 10); + this.horizontalSeparator2.Size = new System.Drawing.Size(364, 22); + this.horizontalSeparator2.TabIndex = 182; + // + // EditGroupForm + // + this.ClientSize = new System.Drawing.Size(384, 521); + this.Controls.Add(this.horizontalSeparator2); + this.Controls.Add(this.pickerBox1); + this.Controls.Add(this.button1); + this.Controls.Add(this.label2); + this.Controls.Add(this.label1); + this.Controls.Add(this.textBox1); + this.MinimumSize = new System.Drawing.Size(400, 560); + this.Name = "EditGroupForm"; + this.Text = "Edit Group"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + protected override void OnShown(EventArgs e) + { + base.OnShown(e); + + if (this.TilePanelLayout != null) + { + textBox1.Text = this.TilePanelLayout.Model.Title; + pickerBox1.ComboBox.SelectedIndex = (this.TilePanelLayout.Model.IsExclusive ? 1 : 0); + } + } + + + public TilePanelLayout TilePanelLayout { get; set; } = null; + + + private void button1_Click(object sender, EventArgs e) + { + TileGroupModel model = this.TilePanelLayout.Model; + model.Title = textBox1.Text?.Trim(); + model.IsExclusive = (pickerBox1.ComboBox.SelectedIndex == 1); + + this.TilePanelLayout.UpdateModel(model); + + this.Close(); + } + + } +} diff --git a/Windows/Forms/EditGroupForm.resx b/Windows/Forms/EditGroupForm.resx new file mode 100644 index 0000000..f298a7b --- /dev/null +++ b/Windows/Forms/EditGroupForm.resx @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Windows/Forms/EditTileFolderForm.cs b/Windows/Forms/EditTileFolderForm.cs new file mode 100644 index 0000000..9f39b35 --- /dev/null +++ b/Windows/Forms/EditTileFolderForm.cs @@ -0,0 +1,394 @@ +using FizzyLauncher.Models; +using RyzStudio.Windows.ThemedForms; +using System; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Windows.Forms; + +namespace FizzyLauncher.Windows.Forms +{ + public class EditTileFolderForm : TDialogForm + { + public static void ShowAddDialog(TilePanelLayout control, Point coord) + { + EditTileFolderForm form = new EditTileFolderForm(DialogModeType.Add); + form.TilePanelLayout = control; + form.AimCoord = coord; + form.ShowDialog(); + } + + public static void ShowEditDialog(TilePanel control) + { + EditTileFolderForm form = new EditTileFolderForm(DialogModeType.Edit); + form.TilePanel = control; + form.ShowDialog(); + } + + + private System.Windows.Forms.Label label1; + private TButton button1; + private RyzStudio.Windows.Forms.THorizontalSeparator horizontalSeparator2; + private TTextBox textBox1; + private TListBox listBox1; + private RyzStudio.Windows.Forms.THorizontalSeparator tHorizontalSeparator1; + private System.Windows.Forms.Label label2; + + + public enum DialogModeType + { + Add = 0, + Edit + } + + + protected DialogModeType dialogMode = DialogModeType.Add; + + + public EditTileFolderForm(DialogModeType dialogMode) : base() + { + InitializeComponent(); + + this.DialogMode = dialogMode; + } + + private void InitializeComponent() + { + this.textBox1 = new RyzStudio.Windows.ThemedForms.TTextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.button1 = new RyzStudio.Windows.ThemedForms.TButton(); + this.horizontalSeparator2 = new RyzStudio.Windows.Forms.THorizontalSeparator(); + this.listBox1 = new RyzStudio.Windows.ThemedForms.TListBox(); + this.label2 = new System.Windows.Forms.Label(); + this.tHorizontalSeparator1 = new RyzStudio.Windows.Forms.THorizontalSeparator(); + this.SuspendLayout(); + // + // textBox1 + // + this.textBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBox1.BackColor = System.Drawing.Color.Transparent; + this.textBox1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.textBox1.Location = new System.Drawing.Point(192, 20); + this.textBox1.Margin = new System.Windows.Forms.Padding(10, 6, 10, 6); + this.textBox1.Name = "textBox1"; + this.textBox1.Padding = new System.Windows.Forms.Padding(10, 10, 9, 9); + this.textBox1.Size = new System.Drawing.Size(177, 35); + this.textBox1.SubmitButton = null; + this.textBox1.TabIndex = 152; + this.textBox1.UseSystemPasswordChar = false; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.BackColor = System.Drawing.Color.Transparent; + this.label1.ForeColor = System.Drawing.SystemColors.ControlText; + this.label1.Location = new System.Drawing.Point(10, 21); + this.label1.Margin = new System.Windows.Forms.Padding(0); + this.label1.Name = "label1"; + this.label1.Padding = new System.Windows.Forms.Padding(0, 9, 0, 10); + this.label1.Size = new System.Drawing.Size(29, 34); + this.label1.TabIndex = 153; + this.label1.Text = "Title"; + this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // button1 + // + this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.button1.BackColor = System.Drawing.Color.Transparent; + this.button1.DefaultImage = null; + this.button1.DownImage = null; + this.button1.IsSelected = false; + this.button1.LabelText = "&Save"; + this.button1.Location = new System.Drawing.Point(241, 469); + this.button1.Margin = new System.Windows.Forms.Padding(10); + this.button1.Name = "button1"; + this.button1.OverImage = null; + this.button1.Padding = new System.Windows.Forms.Padding(4, 4, 3, 3); + this.button1.Size = new System.Drawing.Size(128, 32); + this.button1.TabIndex = 173; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // horizontalSeparator2 + // + this.horizontalSeparator2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.horizontalSeparator2.AutoScrollMargin = new System.Drawing.Size(0, 0); + this.horizontalSeparator2.AutoScrollMinSize = new System.Drawing.Size(0, 0); + this.horizontalSeparator2.BackColor = System.Drawing.Color.Transparent; + this.horizontalSeparator2.Location = new System.Drawing.Point(10, 61); + this.horizontalSeparator2.Margin = new System.Windows.Forms.Padding(10, 0, 10, 0); + this.horizontalSeparator2.MaximumSize = new System.Drawing.Size(4920, 2); + this.horizontalSeparator2.MinimumSize = new System.Drawing.Size(0, 22); + this.horizontalSeparator2.Name = "horizontalSeparator2"; + this.horizontalSeparator2.Padding = new System.Windows.Forms.Padding(0, 10, 0, 10); + this.horizontalSeparator2.Size = new System.Drawing.Size(364, 22); + this.horizontalSeparator2.TabIndex = 177; + // + // listBox1 + // + this.listBox1.AllowDrop = true; + this.listBox1.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.listBox1.BackColor = System.Drawing.Color.Transparent; + this.listBox1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.listBox1.Location = new System.Drawing.Point(109, 87); + this.listBox1.Margin = new System.Windows.Forms.Padding(10, 4, 10, 4); + this.listBox1.Name = "listBox1"; + this.listBox1.Padding = new System.Windows.Forms.Padding(10, 6, 7, 5); + this.listBox1.Size = new System.Drawing.Size(260, 346); + this.listBox1.SubmitButton = null; + this.listBox1.TabIndex = 180; + this.listBox1.OnAdd += new System.EventHandler(this.listBox1_OnAdd); + this.listBox1.OnEdit += new System.EventHandler(this.listBox1_OnEdit); + this.listBox1.DragDrop += new System.Windows.Forms.DragEventHandler(this.listBox1_DragDrop); + this.listBox1.DragOver += new System.Windows.Forms.DragEventHandler(this.listBox1_DragOver); + // + // label2 + // + this.label2.AutoSize = true; + this.label2.BackColor = System.Drawing.Color.Transparent; + this.label2.ForeColor = System.Drawing.SystemColors.ControlText; + this.label2.Location = new System.Drawing.Point(8, 87); + this.label2.Name = "label2"; + this.label2.Padding = new System.Windows.Forms.Padding(0, 9, 0, 10); + this.label2.Size = new System.Drawing.Size(25, 34); + this.label2.TabIndex = 181; + this.label2.Text = "List"; + this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // tHorizontalSeparator1 + // + this.tHorizontalSeparator1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.tHorizontalSeparator1.AutoScrollMargin = new System.Drawing.Size(0, 0); + this.tHorizontalSeparator1.AutoScrollMinSize = new System.Drawing.Size(0, 0); + this.tHorizontalSeparator1.BackColor = System.Drawing.Color.Transparent; + this.tHorizontalSeparator1.Location = new System.Drawing.Point(10, 437); + this.tHorizontalSeparator1.Margin = new System.Windows.Forms.Padding(10, 0, 10, 0); + this.tHorizontalSeparator1.MaximumSize = new System.Drawing.Size(4920, 2); + this.tHorizontalSeparator1.MinimumSize = new System.Drawing.Size(0, 22); + this.tHorizontalSeparator1.Name = "tHorizontalSeparator1"; + this.tHorizontalSeparator1.Padding = new System.Windows.Forms.Padding(0, 10, 0, 10); + this.tHorizontalSeparator1.Size = new System.Drawing.Size(364, 22); + this.tHorizontalSeparator1.TabIndex = 182; + // + // EditTileFolderForm + // + this.ClientSize = new System.Drawing.Size(384, 521); + this.Controls.Add(this.tHorizontalSeparator1); + this.Controls.Add(this.label2); + this.Controls.Add(this.listBox1); + this.Controls.Add(this.horizontalSeparator2); + this.Controls.Add(this.button1); + this.Controls.Add(this.label1); + this.Controls.Add(this.textBox1); + this.MinimumSize = new System.Drawing.Size(400, 560); + this.Name = "EditTileFolderForm"; + this.Text = "Add List Tile"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + protected override void OnShown(EventArgs e) + { + base.OnShown(e); + + if (this.DialogMode == DialogModeType.Edit) + { + listBox1.ListBox.Items.Clear(); + + if (this.TilePanel == null) return; + if (this.TilePanel.ModelInfo == null) return; + + textBox1.Text = this.TilePanel.ModelInfo.Title; + + if (this.TilePanel.ModelInfo.Items != null) + { + foreach (TileModel item in this.TilePanel.ModelInfo.Items) + { + if (item.IsGroup) + { + continue; + } + + listBox1.ListBox.Items.Add(item); + } + } + } + } + + + public TilePanelLayout TilePanelLayout { get; set; } = null; + + public TilePanel TilePanel { get; set; } = null; + + public Point AimCoord { get; set; } = new Point(-1, -1); + + public DialogModeType DialogMode + { + get => dialogMode; + set + { + dialogMode = value; + + switch (dialogMode) + { + case DialogModeType.Add: + this.Text = "Add Folder"; + textBox1.Text = "New Folder"; + break; + case DialogModeType.Edit: + this.Text = "Edit Folder"; + break; + default: break; + } + } + } + + + private void button1_Click(object sender, EventArgs e) + { + TileModel model = new TileModel() + { + Title = textBox1.Text?.Trim(), + IsGroup = true + }; + + switch (this.DialogMode) + { + case DialogModeType.Add: + if (!this.AimCoord.Equals(new Point(-1, -1))) + { + model.Position = this.AimCoord; + } + + model.Items = new System.Collections.Generic.List(); + + foreach (TileModel item in listBox1.ListBox.Items.OfType()) + { + if (item.IsGroup) + { + continue; + } + + model.Items.Add(item); + } + + this.TilePanelLayout.AddTile(model); + + break; + case DialogModeType.Edit: + model.Items = new System.Collections.Generic.List(); + + foreach (TileModel item in listBox1.ListBox.Items.OfType()) + { + if (item.IsGroup) + { + continue; + } + + model.Items.Add(item); + } + + this.TilePanel.LoadInfo(model); + + break; + default: break; + } + + this.Close(); + } + + private void listBox1_OnAdd(object sender, EventArgs e) => EditTileForm.ShowAddDialog(listBox1); + + private void listBox1_OnEdit(object sender, EventArgs e) + { + if (listBox1.ListBox.Items.Count <= 0) + { + return; + } + + if (listBox1.ListBox.SelectedIndex < 0) + { + return; + } + + if (listBox1.ListBox.SelectedItem == null) + { + return; + } + + EditTileForm.ShowEditDialog(listBox1); + } + + private void listBox1_DragOver(object sender, System.Windows.Forms.DragEventArgs e) + { + if (e.Data.GetDataPresent(DataFormats.FileDrop)) + { + e.Effect = DragDropEffects.Link; + } + else + { + e.Effect = DragDropEffects.None; + } + } + + private void listBox1_DragDrop(object sender, DragEventArgs e) + { + string[] fileList = e.Data.GetData(DataFormats.FileDrop) as string[]; + if (fileList == null) + { + return; + } + + if (fileList.Length <= 0) + { + return; + } + + if (string.IsNullOrWhiteSpace(fileList[0])) + { + return; + } + + TileModel model = new TileModel() + { + ProcessFilename = fileList[0], + Title = Path.GetFileName(fileList[0]) + }; + + // exe + if (Path.GetExtension(fileList[0]).Equals(".exe", StringComparison.CurrentCultureIgnoreCase)) + { + if (File.Exists(fileList[0])) + { + try + { + FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(fileList[0]); + if (fvi != null) + { + model.Title = fvi.ProductName; + } + } + catch + { + // do nothing + } + } + + + if (string.IsNullOrWhiteSpace(model.Title)) + { + model.Title = Path.GetFileNameWithoutExtension(fileList[0]); + } + } + + listBox1.ListBox.Items.Add(model); + } + + } +} \ No newline at end of file diff --git a/Windows/Forms/EditTileFolderForm.resx b/Windows/Forms/EditTileFolderForm.resx new file mode 100644 index 0000000..f298a7b --- /dev/null +++ b/Windows/Forms/EditTileFolderForm.resx @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Windows/Forms/EditTileForm.cs b/Windows/Forms/EditTileForm.cs new file mode 100644 index 0000000..54d2997 --- /dev/null +++ b/Windows/Forms/EditTileForm.cs @@ -0,0 +1,482 @@ +using FizzyLauncher.Models; +using RyzStudio.Windows.ThemedForms; +using System; +using System.Drawing; + +namespace FizzyLauncher.Windows.Forms +{ + public class EditTileForm : TDialogForm + { + public static void ShowAddDialog(TilePanelLayout control, Point coord) + { + EditTileForm form = new EditTileForm(DialogModeType.Add); + form.TilePanelLayout = control; + form.AimCoord = coord; + form.ShowDialog(); + } + + public static void ShowAddDialog(TListBox control) + { + EditTileForm form = new EditTileForm(DialogModeType.Add); + form.ListBox = control; + form.ShowDialog(); + } + + public static void ShowEditDialog(TilePanel control) + { + EditTileForm form = new EditTileForm(DialogModeType.Edit); + form.TilePanel = control; + form.ShowDialog(); + } + + public static void ShowEditDialog(TListBox control) + { + EditTileForm form = new EditTileForm(DialogModeType.Edit); + form.ListBox = control; + form.ShowDialog(); + } + + + private System.Windows.Forms.Label label6; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label1; + private TOpenFileTextBox textBox2; + private TTextBox textBox3; + private TFolderTextBox textBox4; + private TButton button1; + private TPickerBox pickerBox1; + private TPickerBox pickerBox2; + private RyzStudio.Windows.Forms.THorizontalSeparator horizontalSeparator1; + private RyzStudio.Windows.Forms.THorizontalSeparator horizontalSeparator2; + private TTextBox textBox1; + + + public enum DialogModeType + { + Add = 0, + Edit + } + + + protected DialogModeType dialogMode = DialogModeType.Add; + + + public EditTileForm(DialogModeType dialogMode) : base() + { + InitializeComponent(); + + this.DialogMode = dialogMode; + + pickerBox1.ComboBox.Items.Clear(); + pickerBox1.ComboBox.Items.AddRange(new string[] { "Normal", "Hidden", "Minimized", "Maximized" }); + if (pickerBox1.ComboBox.Items.Count > 0) pickerBox1.ComboBox.SelectedIndex = 0; + + pickerBox2.ComboBox.Items.Clear(); + pickerBox2.ComboBox.Items.AddRange(new string[] { "No", "Yes" }); + if (pickerBox2.ComboBox.Items.Count > 0) pickerBox2.ComboBox.SelectedIndex = 0; + } + + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(EditTileForm)); + this.textBox1 = new RyzStudio.Windows.ThemedForms.TTextBox(); + this.label6 = new System.Windows.Forms.Label(); + this.label7 = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.textBox2 = new RyzStudio.Windows.ThemedForms.TOpenFileTextBox(); + this.textBox3 = new RyzStudio.Windows.ThemedForms.TTextBox(); + this.textBox4 = new RyzStudio.Windows.ThemedForms.TFolderTextBox(); + this.button1 = new RyzStudio.Windows.ThemedForms.TButton(); + this.pickerBox1 = new RyzStudio.Windows.ThemedForms.TPickerBox(); + this.pickerBox2 = new RyzStudio.Windows.ThemedForms.TPickerBox(); + this.horizontalSeparator1 = new RyzStudio.Windows.Forms.THorizontalSeparator(); + this.horizontalSeparator2 = new RyzStudio.Windows.Forms.THorizontalSeparator(); + this.SuspendLayout(); + // + // textBox1 + // + this.textBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBox1.BackColor = System.Drawing.Color.Transparent; + this.textBox1.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.textBox1.Location = new System.Drawing.Point(192, 20); + this.textBox1.Margin = new System.Windows.Forms.Padding(10, 6, 10, 6); + this.textBox1.Name = "textBox1"; + this.textBox1.Padding = new System.Windows.Forms.Padding(10, 10, 9, 9); + this.textBox1.Size = new System.Drawing.Size(177, 35); + this.textBox1.SubmitButton = null; + this.textBox1.TabIndex = 152; + this.textBox1.UseSystemPasswordChar = false; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.BackColor = System.Drawing.Color.Transparent; + this.label6.ForeColor = System.Drawing.SystemColors.ControlText; + this.label6.Location = new System.Drawing.Point(10, 250); + this.label6.Name = "label6"; + this.label6.Padding = new System.Windows.Forms.Padding(0, 9, 0, 10); + this.label6.Size = new System.Drawing.Size(83, 34); + this.label6.TabIndex = 163; + this.label6.Text = "Run As Admin"; + this.label6.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // label7 + // + this.label7.AutoSize = true; + this.label7.BackColor = System.Drawing.Color.Transparent; + this.label7.ForeColor = System.Drawing.SystemColors.ControlText; + this.label7.Location = new System.Drawing.Point(10, 209); + this.label7.Name = "label7"; + this.label7.Padding = new System.Windows.Forms.Padding(0, 9, 0, 10); + this.label7.Size = new System.Drawing.Size(79, 34); + this.label7.TabIndex = 161; + this.label7.Text = "Window Style"; + this.label7.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.BackColor = System.Drawing.Color.Transparent; + this.label4.ForeColor = System.Drawing.SystemColors.ControlText; + this.label4.Location = new System.Drawing.Point(10, 144); + this.label4.Name = "label4"; + this.label4.Padding = new System.Windows.Forms.Padding(0, 9, 0, 10); + this.label4.Size = new System.Drawing.Size(103, 34); + this.label4.TabIndex = 159; + this.label4.Text = "Working Directory"; + this.label4.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.BackColor = System.Drawing.Color.Transparent; + this.label3.ForeColor = System.Drawing.SystemColors.ControlText; + this.label3.Location = new System.Drawing.Point(10, 103); + this.label3.Name = "label3"; + this.label3.Padding = new System.Windows.Forms.Padding(0, 9, 0, 10); + this.label3.Size = new System.Drawing.Size(61, 34); + this.label3.TabIndex = 157; + this.label3.Text = "Argument"; + this.label3.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.BackColor = System.Drawing.Color.Transparent; + this.label2.ForeColor = System.Drawing.SystemColors.ControlText; + this.label2.Location = new System.Drawing.Point(10, 62); + this.label2.Name = "label2"; + this.label2.Padding = new System.Windows.Forms.Padding(0, 9, 0, 10); + this.label2.Size = new System.Drawing.Size(55, 34); + this.label2.TabIndex = 155; + this.label2.Text = "Filename"; + this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.BackColor = System.Drawing.Color.Transparent; + this.label1.ForeColor = System.Drawing.SystemColors.ControlText; + this.label1.Location = new System.Drawing.Point(10, 21); + this.label1.Margin = new System.Windows.Forms.Padding(0); + this.label1.Name = "label1"; + this.label1.Padding = new System.Windows.Forms.Padding(0, 9, 0, 10); + this.label1.Size = new System.Drawing.Size(29, 34); + this.label1.TabIndex = 153; + this.label1.Text = "Title"; + this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // textBox2 + // + this.textBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBox2.BackColor = System.Drawing.Color.Transparent; + this.textBox2.FileDialog = null; + this.textBox2.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.textBox2.HighlightImage = ((System.Drawing.Image)(resources.GetObject("textBox2.HighlightImage"))); + this.textBox2.Location = new System.Drawing.Point(192, 61); + this.textBox2.Margin = new System.Windows.Forms.Padding(10, 3, 3, 3); + this.textBox2.Name = "textBox2"; + this.textBox2.NormalImage = ((System.Drawing.Image)(resources.GetObject("textBox2.NormalImage"))); + this.textBox2.Padding = new System.Windows.Forms.Padding(10, 10, 9, 9); + this.textBox2.Size = new System.Drawing.Size(177, 35); + this.textBox2.SubmitButton = null; + this.textBox2.TabIndex = 170; + this.textBox2.UseSystemPasswordChar = false; + // + // textBox3 + // + this.textBox3.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBox3.BackColor = System.Drawing.Color.Transparent; + this.textBox3.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.textBox3.Location = new System.Drawing.Point(192, 102); + this.textBox3.Margin = new System.Windows.Forms.Padding(10, 6, 10, 6); + this.textBox3.Name = "textBox3"; + this.textBox3.Padding = new System.Windows.Forms.Padding(10, 10, 9, 9); + this.textBox3.Size = new System.Drawing.Size(177, 35); + this.textBox3.SubmitButton = null; + this.textBox3.TabIndex = 171; + this.textBox3.UseSystemPasswordChar = false; + // + // textBox4 + // + this.textBox4.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.textBox4.BackColor = System.Drawing.Color.Transparent; + this.textBox4.FolderDialog = null; + this.textBox4.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.textBox4.HighlightImage = ((System.Drawing.Image)(resources.GetObject("textBox4.HighlightImage"))); + this.textBox4.Location = new System.Drawing.Point(192, 143); + this.textBox4.Margin = new System.Windows.Forms.Padding(10, 3, 3, 3); + this.textBox4.Name = "textBox4"; + this.textBox4.NormalImage = ((System.Drawing.Image)(resources.GetObject("textBox4.NormalImage"))); + this.textBox4.Padding = new System.Windows.Forms.Padding(10, 10, 9, 9); + this.textBox4.Size = new System.Drawing.Size(177, 35); + this.textBox4.SubmitButton = null; + this.textBox4.TabIndex = 172; + this.textBox4.UseSystemPasswordChar = false; + // + // button1 + // + this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.button1.BackColor = System.Drawing.Color.Transparent; + this.button1.DefaultImage = null; + this.button1.DownImage = null; + this.button1.IsSelected = false; + this.button1.LabelText = "&Save"; + this.button1.Location = new System.Drawing.Point(241, 469); + this.button1.Margin = new System.Windows.Forms.Padding(10); + this.button1.Name = "button1"; + this.button1.OverImage = null; + this.button1.Padding = new System.Windows.Forms.Padding(4, 4, 3, 3); + this.button1.Size = new System.Drawing.Size(128, 32); + this.button1.TabIndex = 173; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // pickerBox1 + // + this.pickerBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.pickerBox1.BackColor = System.Drawing.Color.Transparent; + this.pickerBox1.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.pickerBox1.Location = new System.Drawing.Point(241, 209); + this.pickerBox1.Margin = new System.Windows.Forms.Padding(10, 6, 10, 6); + this.pickerBox1.Name = "pickerBox1"; + this.pickerBox1.Padding = new System.Windows.Forms.Padding(10, 6, 7, 5); + this.pickerBox1.Size = new System.Drawing.Size(128, 34); + this.pickerBox1.SubmitButton = null; + this.pickerBox1.TabIndex = 174; + // + // pickerBox2 + // + this.pickerBox2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.pickerBox2.BackColor = System.Drawing.Color.Transparent; + this.pickerBox2.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point); + this.pickerBox2.Location = new System.Drawing.Point(285, 250); + this.pickerBox2.Margin = new System.Windows.Forms.Padding(10, 6, 10, 6); + this.pickerBox2.Name = "pickerBox2"; + this.pickerBox2.Padding = new System.Windows.Forms.Padding(10, 6, 7, 5); + this.pickerBox2.Size = new System.Drawing.Size(84, 34); + this.pickerBox2.SubmitButton = null; + this.pickerBox2.TabIndex = 175; + // + // horizontalSeparator1 + // + this.horizontalSeparator1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.horizontalSeparator1.AutoScrollMargin = new System.Drawing.Size(0, 0); + this.horizontalSeparator1.AutoScrollMinSize = new System.Drawing.Size(0, 0); + this.horizontalSeparator1.BackColor = System.Drawing.Color.Transparent; + this.horizontalSeparator1.Location = new System.Drawing.Point(10, 181); + this.horizontalSeparator1.Margin = new System.Windows.Forms.Padding(10, 0, 10, 0); + this.horizontalSeparator1.MaximumSize = new System.Drawing.Size(4920, 2); + this.horizontalSeparator1.MinimumSize = new System.Drawing.Size(0, 22); + this.horizontalSeparator1.Name = "horizontalSeparator1"; + this.horizontalSeparator1.Padding = new System.Windows.Forms.Padding(0, 10, 0, 10); + this.horizontalSeparator1.Size = new System.Drawing.Size(364, 22); + this.horizontalSeparator1.TabIndex = 176; + // + // horizontalSeparator2 + // + this.horizontalSeparator2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.horizontalSeparator2.AutoScrollMargin = new System.Drawing.Size(0, 0); + this.horizontalSeparator2.AutoScrollMinSize = new System.Drawing.Size(0, 0); + this.horizontalSeparator2.BackColor = System.Drawing.Color.Transparent; + this.horizontalSeparator2.Location = new System.Drawing.Point(10, 437); + this.horizontalSeparator2.Margin = new System.Windows.Forms.Padding(10, 0, 10, 0); + this.horizontalSeparator2.MaximumSize = new System.Drawing.Size(4920, 2); + this.horizontalSeparator2.MinimumSize = new System.Drawing.Size(0, 22); + this.horizontalSeparator2.Name = "horizontalSeparator2"; + this.horizontalSeparator2.Padding = new System.Windows.Forms.Padding(0, 10, 0, 10); + this.horizontalSeparator2.Size = new System.Drawing.Size(364, 22); + this.horizontalSeparator2.TabIndex = 177; + // + // EditTileForm + // + this.ClientSize = new System.Drawing.Size(384, 521); + this.Controls.Add(this.horizontalSeparator2); + this.Controls.Add(this.horizontalSeparator1); + this.Controls.Add(this.pickerBox2); + this.Controls.Add(this.pickerBox1); + this.Controls.Add(this.button1); + this.Controls.Add(this.textBox4); + this.Controls.Add(this.textBox3); + this.Controls.Add(this.textBox2); + this.Controls.Add(this.label6); + this.Controls.Add(this.label7); + this.Controls.Add(this.label4); + this.Controls.Add(this.label3); + this.Controls.Add(this.label2); + this.Controls.Add(this.label1); + this.Controls.Add(this.textBox1); + this.MinimumSize = new System.Drawing.Size(400, 560); + this.Name = "EditTileForm"; + this.Text = "Add Tile"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + protected override void OnShown(EventArgs e) + { + base.OnShown(e); + + if (this.DialogMode == DialogModeType.Edit) + { + if (this.TilePanel != null) + { + updateModel(this.TilePanel.ModelInfo); + } + else if (this.ListBox != null) + { + if (this.ListBox.ListBox.SelectedItem != null) + { + TileModel model = (this.ListBox.ListBox.SelectedItem as TileModel); + if (model != null) + { + updateModel(model); + } + } + } + } + } + + + public TilePanelLayout TilePanelLayout { get; set; } = null; + + public TilePanel TilePanel { get; set; } = null; + + public TListBox ListBox { get; set; } = null; + + public Point AimCoord { get; set; } = new Point(-1, -1); + + public DialogModeType DialogMode + { + get => dialogMode; + set + { + dialogMode = value; + + switch (dialogMode) + { + case DialogModeType.Add: + this.Text = "Add Tile"; + break; + case DialogModeType.Edit: + this.Text = "Edit Tile"; + break; + default: break; + } + } + } + + + private void button1_Click(object sender, EventArgs e) + { + TileModel model = buildModel(); + + switch (this.DialogMode) + { + case DialogModeType.Add: + if (this.TilePanelLayout != null) + { + this.TilePanelLayout.AddTile(model); + } + else if (this.ListBox != null) + { + int n = this.ListBox.ListBox.Items.Add(model); + this.ListBox.ListBox.SelectedIndex = n; + } + + break; + case DialogModeType.Edit: + if (this.TilePanel != null) + { + this.TilePanel.LoadInfo(model); + } + else if (this.ListBox != null) + { + int n = this.ListBox.ListBox.SelectedIndex; + if (n >= 0) + { + this.ListBox.ListBox.Items.RemoveAt(n); + this.ListBox.ListBox.Items.Insert(n, model); + this.ListBox.ListBox.SelectedIndex = n; + } + } + + break; + default: break; + } + + this.Close(); + } + + protected TileModel buildModel() + { + TileModel rs = new TileModel() + { + Title = textBox1.Text?.Trim(), + ProcessFilename = textBox2.Text?.Trim(), + ProcessArgument = textBox3.Text?.Trim(), + ProcessWorkingDirectory = textBox4.Text?.Trim(), + ProcessWindowStyle = (System.Diagnostics.ProcessWindowStyle)pickerBox1.ComboBox.SelectedIndex, + ProcessAsAdmin = (pickerBox2.ComboBox.SelectedIndex == 1) + }; + + if (this.DialogMode == DialogModeType.Add) + { + if (!this.AimCoord.Equals(new Point(-1, -1))) + { + rs.Position = this.AimCoord; + } + } + + return rs; + } + + protected void updateModel(TileModel model) + { + if (model == null) + { + return; + } + + textBox1.Text = model.Title; + textBox2.Text = model.ProcessFilename; + textBox3.Text = model.ProcessArgument; + textBox4.Text = model.ProcessWorkingDirectory; + pickerBox1.ComboBox.SelectedIndex = (int)model.ProcessWindowStyle; + pickerBox2.ComboBox.SelectedIndex = (model.ProcessAsAdmin ? 1 : 0); + } + + } +} diff --git a/Windows/Forms/EditTileForm.resx b/Windows/Forms/EditTileForm.resx new file mode 100644 index 0000000..0220ec4 --- /dev/null +++ b/Windows/Forms/EditTileForm.resx @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vgAADr4B6kKxwAAAAK9JREFUOE/t0zsKwkAURuGp1BWJK3EhIrgAV+EOLLWwtRQLwQdiIbbiIkwynj+O + IVwnyhR2XvjyInNIkXHee8f0cEQBPbDOaKEarSvXhsAJO4wirlB4jipiA3phoIvIrLFChhnKiA3o8Ckw + RR93LNBODVwwwRL62kNKYIxNzQ1FSsDOEHk08HrYJMw/8KtA06/cCef6KJDZgDbTFrHNZO3x9idqOyui + m2+07bvPgHcPXOhtG3D6cUIAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vgAADr4B6kKxwAAAAMZJREFUOE/tk7sNwjAQQF3BRohJGAQhMQBTsAElFLSUiAKJTxIXhBZlCILNuyRG + iXEQKeg46fmsO/slhU9Za5XWehiXYcD6JElygZ6qhdwTioVDGo4wDXDjsohXdYkvMDTHVa8R9Hb0tpCz + XzqJL5Df/CRYRFE0Yn8nr9M07XcSwBXmXN6QDfncRTCjt6+Rgfla4Adfn3D+ERS4Yht/wY8FxVN2xTac + gLP5qyYLAhmmA4SGyeeEoPkSq3EWydsoB4gRDEqBVU/p15ajstHKCgAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + wAAADsABataJCQAAAJtJREFUOE/t0zEKwkAQheEpvILHSLySlTeJ6AnEzpPYi0ERPIKWKtZKNv9LNS5x + E6xS+OCDJew8tsgYmeCECsGZo1dKXLBwtnghQ2fe0JDPGHecsW6xwgwjNM8tdIgyxQ0qij2gORV9LejK + Bk8dfi3QjGY/C0IISS7/gkEVtP3KfbKEZm0PLZM++IVK0d0rdrAcR8TrnKK7BzPLa7Wb+WX/Nb8PAAAA + AElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + wAAADsABataJCQAAALZJREFUOE/tkzEKwjAYRjt4BY9hvZKTN1HsCYqbJzGzKBGb9gY6qjgrxvdJK7ZS + Gpwc/ODBnzTvg0AT5Xk+hB3cwVc456ZRSIqi2MAeafbGEq5Zlg3KY+1Bvkkql89Ya/vsnUCZN8FJYWyM + 6ekKnsWkdF9hb8S3I6ioyRnkpa0FXcFbwOXrAjlyawXe+06q/At+qoDh41cOCU4iV8OaQY8pUVEgOnuA + VcSzjRm2UHvOHeisdc7FDwDnJKIbLgP9AAAAAElFTkSuQmCC + + + \ No newline at end of file diff --git a/Windows/Forms/TileContainer.cs b/Windows/Forms/TileContainer.cs new file mode 100644 index 0000000..6c6060b --- /dev/null +++ b/Windows/Forms/TileContainer.cs @@ -0,0 +1,149 @@ +using FizzyLauncher.Models; +using RyzStudio.Windows.Forms; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace FizzyLauncher.Windows.Forms +{ + public class TileContainer : Panel + { + protected const int DEFAULT_COLUMN = 6; + + protected FlowLayoutPanel flowLayoutPanel1 = null; + + + public TileContainer() + { + flowLayoutPanel1 = new FlowLayoutPanel(); + flowLayoutPanel1.AutoSize = true; + flowLayoutPanel1.AutoSizeMode = AutoSizeMode.GrowAndShrink; + flowLayoutPanel1.BackColor = Color.Transparent; + flowLayoutPanel1.FlowDirection = FlowDirection.TopDown; + flowLayoutPanel1.Location = new Point(10, 10); + flowLayoutPanel1.Margin = new Padding(0); + flowLayoutPanel1.Padding = new Padding(0, 0, 0, 20); + flowLayoutPanel1.Size = new Size(0, 20); + flowLayoutPanel1.WrapContents = false; + + this.AutoScroll = true; + this.AutoSizeMode = AutoSizeMode.GrowAndShrink; + this.BackColor = System.Drawing.Color.Transparent; + this.Margin = new Padding(0); + this.Name = "tileContainer1"; + this.Padding = new Padding(10, 10, 10, 20); + this.Controls.Add(flowLayoutPanel1); + } + + + [Browsable(false)] + public event EventHandler OnColumnSizeChanged; + + + public int CalcWidth + { + get => + TilePanelLayout.CalcWidth(this.TileWidthCount) + + this.Left + this.Padding.Horizontal + this.Margin.Horizontal + + flowLayoutPanel1.Padding.Horizontal + flowLayoutPanel1.Margin.Horizontal; + } + + public int GroupCount + { + get => flowLayoutPanel1.Controls.Count; + } + + public IEnumerable Groups + { + get + { + for (int i = 0; i < flowLayoutPanel1.Controls.Count; i++) + { + if (flowLayoutPanel1.Controls[i].GetType() != typeof(TilePanelLayout)) + { + continue; + } + + TilePanelLayout container = flowLayoutPanel1.Controls[i] as TilePanelLayout; + yield return container; + } + } + } + + public IEnumerable GroupModels + { + get + { + foreach (TilePanelLayout item in this.Groups) + { + yield return item.Model; + } + } + } + + public int TileWidthCount { get; private set; } = DEFAULT_COLUMN; + + + public void Add() + { + this.Add(new TilePanelLayout(new TileGroupModel() + { + Title = "New Group", + IsExpanded = true, + GridSize = new Size(this.TileWidthCount, 1) + })); + } + + public void Add(TilePanelLayout tilePanelLayout) + { + ThreadControl.Add(flowLayoutPanel1, tilePanelLayout); + + this.InvalidateColumnSize(); + } + + public void Add(int columnCount) + { + this.TileWidthCount = ((columnCount <= 0) ? DEFAULT_COLUMN : columnCount); + + this.Add(); + } + + public void Clear() + { + ThreadControl.Clear(flowLayoutPanel1); + + this.TileWidthCount = DEFAULT_COLUMN; + + InvalidateColumnSize(); + } + + public void InvalidateColumnSize() + { + this.OnColumnSizeChanged?.Invoke(this, null); + } + + public void Load(List groupList) + { + this.Clear(); + + if (groupList == null) + { + return; + } + + foreach (TileGroupModel item in groupList) + { + this.TileWidthCount = Math.Max(this.TileWidthCount, item.GridSize.Width); + + TilePanelLayout panel = new TilePanelLayout(item); + + this.Add(panel); + } + + InvalidateColumnSize(); + } + + } +} diff --git a/Windows/Forms/TileContainer.resx b/Windows/Forms/TileContainer.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/Windows/Forms/TileContainer.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Windows/Forms/TilePanel.Designer.cs b/Windows/Forms/TilePanel.Designer.cs new file mode 100644 index 0000000..b771cd9 --- /dev/null +++ b/Windows/Forms/TilePanel.Designer.cs @@ -0,0 +1,82 @@ +namespace FizzyLauncher.Windows.Forms +{ + partial class TilePanel + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); + this.editToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.removeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolTip1 = new System.Windows.Forms.ToolTip(this.components); + this.contextMenuStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // contextMenuStrip1 + // + this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.editToolStripMenuItem, + this.removeToolStripMenuItem}); + this.contextMenuStrip1.Name = "contextMenuStrip1"; + this.contextMenuStrip1.Size = new System.Drawing.Size(118, 48); + // + // editToolStripMenuItem + // + this.editToolStripMenuItem.Name = "editToolStripMenuItem"; + this.editToolStripMenuItem.Size = new System.Drawing.Size(117, 22); + this.editToolStripMenuItem.Text = "&Edit"; + this.editToolStripMenuItem.Click += new System.EventHandler(this.editToolStripMenuItem_Click); + // + // removeToolStripMenuItem + // + this.removeToolStripMenuItem.Name = "removeToolStripMenuItem"; + this.removeToolStripMenuItem.Size = new System.Drawing.Size(117, 22); + this.removeToolStripMenuItem.Text = "&Remove"; + this.removeToolStripMenuItem.Click += new System.EventHandler(this.removeToolStripMenuItem_Click); + // + // TilePanel + // + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(234)))), ((int)(((byte)(234)))), ((int)(((byte)(234))))); + this.Margin = new System.Windows.Forms.Padding(4, 3, 0, 0); + this.MaximumSize = new System.Drawing.Size(82, 81); + this.MinimumSize = new System.Drawing.Size(82, 81); + this.Name = "TilePanel"; + this.Size = new System.Drawing.Size(82, 81); + this.contextMenuStrip1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; + private System.Windows.Forms.ToolStripMenuItem editToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem removeToolStripMenuItem; + private System.Windows.Forms.ToolTip toolTip1; + } +} diff --git a/Windows/Forms/TilePanel.cs b/Windows/Forms/TilePanel.cs new file mode 100644 index 0000000..a1b8968 --- /dev/null +++ b/Windows/Forms/TilePanel.cs @@ -0,0 +1,506 @@ +using FizzyLauncher.Models; +using RyzStudio.Windows.Forms; +using System; +using System.ComponentModel; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Windows.Forms; +using AppResource = BookmarkManager.AppResource; + +namespace FizzyLauncher.Windows.Forms +{ + public partial class TilePanel : TUserControl + { + protected bool isDragging = false; + protected Point startPosition = new Point(); + + protected int imageLeft = 0; + protected int imageTop = 11; + protected int labelMargin = 3; + protected int labelTop = 47; + protected Rectangle labelRectangle = new Rectangle(); + + protected string title = ""; + protected Image icon = null; + protected ContextMenuStrip groupContextMenu = null; + protected TileModel modelInfo = new TileModel(); + + + public TilePanel() : base() + { + InitializeComponent(); + + this.AllowDrop = true; + this.AutoSize = false; + this.BackColor = Color.FromArgb(250, 250, 250); + this.ContextMenuStrip = contextMenuStrip1; + this.DoubleBuffered = true; + this.Font = new Font(this.Font.FontFamily, 8.25F); + this.ForeColor = Color.FromArgb(99, 105, 119); + this.Size = new Size(70, 70); + this.MaximumSize = this.MinimumSize = this.Size; + } + + protected override void OnLoad(EventArgs e) + { + base.OnLoad(e); + + this.AllowDrop = true; + this.AutoSize = false; + this.BackColor = Color.FromArgb(250, 250, 250); + this.ContextMenuStrip = contextMenuStrip1; + this.DoubleBuffered = true; + this.Font = new Font(this.Font.FontFamily, 8.25F); + this.Size = new Size(70, 70); + this.MaximumSize = this.MinimumSize = this.Size; + } + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + + Graphics g = e.Graphics; + + + if (this.Image != null) + { + g.DrawImage(this.Image, new Point(imageLeft, imageTop)); + } + + if (!string.IsNullOrWhiteSpace(this.Title)) + { + TextRenderer.DrawText(e.Graphics, this.Title, this.Font, labelRectangle, this.ForeColor, TextFormatFlags.HorizontalCenter | TextFormatFlags.NoPadding | TextFormatFlags.EndEllipsis); + } + + g.DrawRectangle(new Pen(Color.FromArgb(204, 206, 218), 1), new Rectangle(this.DisplayRectangle.X, this.DisplayRectangle.Y, (this.DisplayRectangle.Width - 1), (this.DisplayRectangle.Height - 1))); + + } + + [Category("Tile"), Browsable(true)] + public Image Image + { + get => icon; + protected set + { + icon = value; + + if (icon == null) + { + imageLeft = 0; + } + else + { + imageLeft = (this.Width - icon.Width) / 2; + } + } + } + + [Category("Tile"), Browsable(true)] + public string Title + { + get => title; + protected set + { + title = value; + + labelRectangle = new Rectangle(labelMargin, labelTop, (this.Width - (labelMargin * 2)), (this.Height - labelTop - 1)); + + this.Invalidate(); + } + } + + + [Browsable(false)] + public TileModel ModelInfo => modelInfo; + + public TilePanelLayout PanelContainer + { + get + { + if (this.Parent == null) + { + return null; + } + + if (this.Parent.GetType() != typeof(TilePanelLayout)) + { + return null; + } + + return (TilePanelLayout)this.Parent; + } + } + + protected override void OnDragDrop(DragEventArgs e) + { + string[] fileList = e.Data.GetData(DataFormats.FileDrop) as string[]; + + if (this.ModelInfo.IsGroup) + { + this.DropFileList(fileList); + + invalidateGroupMenu(this.ModelInfo); + } + else + { + if (this.PanelContainer != null) + { + this.PanelContainer.DropFileList(fileList); + } + } + } + + protected override void OnDragOver(DragEventArgs e) + { + base.OnDragDrop(e); + + e.Effect = (e.Data.GetDataPresent(DataFormats.FileDrop)) ? DragDropEffects.Link : DragDropEffects.None; + } + + protected override void OnMouseUp(MouseEventArgs e) + { + base.OnMouseUp(e); + + isDragging = false; + } + + protected override void OnMouseDown(MouseEventArgs e) + { + base.OnMouseDown(e); + + TilePanelLayout container = this.PanelContainer; + if (container == null) + { + return; + } + + this.BringToFront(); + + if (((e.Button == MouseButtons.Left) && (Control.ModifierKeys == Keys.Control)) || (e.Button == MouseButtons.Right)) + { + isDragging = true; + startPosition = e.Location; + } + } + + protected override void OnMouseClick(MouseEventArgs e) + { + base.OnMouseClick(e); + + if (Control.ModifierKeys == Keys.Control) return; + if (this.ModelInfo == null) return; + + if (e.Button == MouseButtons.Left) + { + if (this.ModelInfo.IsGroup) + { + if (groupContextMenu != null) + { + invalidateGroupMenuSize(); + + groupContextMenu.Show(this, e.Location); + } + } + else + { + OnMouseDoubleClick(e); + } + } + } + + protected override void OnMouseDoubleClick(MouseEventArgs e) + { + base.OnMouseDoubleClick(e); + + if (Control.ModifierKeys == Keys.Control) return; + + if (e.Button == MouseButtons.Left) + { + execute(this.ModelInfo); + } + } + + protected override void OnMouseMove(MouseEventArgs e) + { + base.OnMouseMove(e); + + if (isDragging) + { + TilePanelLayout layoutPanel = this.PanelContainer; + if (layoutPanel == null) + { + return; + } + + int x = (this.Location.X + (e.Location.X - startPosition.X)); + int y = (this.Location.Y + (e.Location.Y - startPosition.Y)); + + layoutPanel.MoveTile(this, x, y); + } + } + + + public void DropFileList(string[] fileList) + { + if (fileList == null) + { + return; + } + + if (fileList.Length <= 0) + { + return; + } + + if (string.IsNullOrWhiteSpace(fileList[0])) + { + return; + } + + TileModel model = new TileModel() + { + ProcessFilename = fileList[0], + Title = Path.GetFileName(fileList[0]) + }; + + // exe + if (Path.GetExtension(fileList[0]).Equals(".exe", StringComparison.CurrentCultureIgnoreCase)) + { + if (File.Exists(fileList[0])) + { + try + { + FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(fileList[0]); + if (fvi != null) + { + model.Title = fvi.ProductName; + } + } + catch + { + // do nothing + } + } + + if (string.IsNullOrWhiteSpace(model.Title)) + { + model.Title = Path.GetFileNameWithoutExtension(fileList[0]); + } + } + + this.ModelInfo.Items.Add(model); + } + + public void LoadInfo(TileModel model) + { + this.modelInfo = model; + + this.Image = null; + this.Title = model.Title; + + if (this.modelInfo.IsGroup) + { + this.Image = AppResource.folder_32; + + invalidateGroupMenu(this.modelInfo); + } + else + { + this.Image = getIcon(model); + } + + toolTip1.SetToolTip(this, this.Title); + } + + private void editToolStripMenuItem_Click(object sender, EventArgs e) + { + if (this.ModelInfo.IsGroup) + { + EditTileFolderForm.ShowEditDialog(this); + } + else + { + EditTileForm.ShowEditDialog(this); + } + } + + private void removeToolStripMenuItem_Click(object sender, EventArgs e) + { + if (this.PanelContainer == null) + { + return; + } + + this.PanelContainer.Remove(this); + } + + protected void execute(TileModel model) + { + if (model == null) + { + return; + } + + if (model.IsGroup) + { + return; + } + + if (string.IsNullOrWhiteSpace(model.CleanProcessFilename)) + { + return; + } + + if (!File.Exists(model.CleanProcessFilename)) + { + return; + } + + ProcessStartInfo p = new ProcessStartInfo(); + p.FileName = model.CleanProcessFilename; + p.WindowStyle = model.ProcessWindowStyle; + + if (!string.IsNullOrWhiteSpace(model.CleanProcessArgument)) + { + p.Arguments = model.CleanProcessArgument; + } + + if (!string.IsNullOrWhiteSpace(model.CleanProcessWorkingDirectory)) + { + p.WorkingDirectory = model.CleanProcessWorkingDirectory; + } + + if (model.ProcessAsAdmin) + { + p.UseShellExecute = true; + p.Verb = "runas"; + } + + MainForm parentForm = findMainForm(); + if (parentForm != null) + { + if (parentForm.CurrentSession != null) + { + if (parentForm.CurrentSession.HideOnClick) + { + parentForm.Visible = false; + } + } + } + + try + { + Process.Start(p); + } + catch (Exception exc) + { + MessageBox.Show(exc.Message); + } + } + + protected Image getIcon(TileModel model) + { + if (!File.Exists(model.CleanProcessFilename)) + { + return null; + } + + try + { + return Icon.ExtractAssociatedIcon(model.CleanProcessFilename)?.ToBitmap(); + } + catch + { + // do nothing + } + + return null; + } + + protected void invalidateGroupMenu(TileModel model) + { + if (groupContextMenu == null) + { + groupContextMenu = new ContextMenuStrip(); + } + + groupContextMenu.Items.Clear(); + + if (model.Items == null) + { + return; + } + + foreach (TileModel item in model.Items) + { + ToolStripItem toolItem = groupContextMenu.Items.Add(item.Title); + toolItem.Image = getIcon(item); + toolItem.Tag = item; + toolItem.Click += toolItem_Click; + } + } + + protected void invalidateGroupMenuSize() + { + if (this.PanelContainer != null) + { + if (this.PanelContainer.MainForm != null) + { + if (this.PanelContainer.MainForm.CurrentSession != null) + { + if (this.PanelContainer.MainForm.CurrentSession.EnableBigIconInFolder) + { + groupContextMenu.ImageScalingSize = new Size(24, 24); + return; + } + } + } + } + + groupContextMenu.ImageScalingSize = new Size(16, 16); + } + + protected MainForm findMainForm() + { + Control item = this; + + while (true) + { + item = item.Parent; + if (item == null) + { + return null; + } + + if (item.GetType() == typeof(MainForm)) + { + return (item as MainForm); + } + } + } + + private void toolItem_Click(object sender, EventArgs e) + { + if (sender.GetType() != typeof(ToolStripMenuItem)) + { + return; + } + + ToolStripMenuItem item = (sender as ToolStripMenuItem); + if (item.Tag == null) + { + return; + } + + if (item.Tag.GetType() != typeof(TileModel)) + { + return; + } + + TileModel model = (item.Tag as TileModel); + execute(model); + } + + } +} \ No newline at end of file diff --git a/Windows/Forms/TilePanel.resx b/Windows/Forms/TilePanel.resx new file mode 100644 index 0000000..60ff723 --- /dev/null +++ b/Windows/Forms/TilePanel.resx @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + 17, 17 + + + 172, 17 + + \ No newline at end of file diff --git a/Windows/Forms/TilePanelLayout.Designer.cs b/Windows/Forms/TilePanelLayout.Designer.cs new file mode 100644 index 0000000..3053842 --- /dev/null +++ b/Windows/Forms/TilePanelLayout.Designer.cs @@ -0,0 +1,259 @@ +namespace FizzyLauncher.Windows.Forms +{ + partial class TilePanelLayout + { + /// + /// 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 Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); + this.addToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.addListToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem6 = new System.Windows.Forms.ToolStripSeparator(); + this.removeRowToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.contextMenuStrip2 = new System.Windows.Forms.ContextMenuStrip(this.components); + this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripMenuItem4 = new System.Windows.Forms.ToolStripMenuItem(); + this.topToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.upToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.downToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.bottomToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripMenuItem3 = new System.Windows.Forms.ToolStripMenuItem(); + this.label1 = new System.Windows.Forms.Label(); + this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripMenuItem7 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem5 = new System.Windows.Forms.ToolStripMenuItem(); + this.removeRowToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.contextMenuStrip1.SuspendLayout(); + this.contextMenuStrip2.SuspendLayout(); + this.SuspendLayout(); + // + // contextMenuStrip1 + // + this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.addToolStripMenuItem, + this.addListToolStripMenuItem, + this.toolStripMenuItem6, + this.removeRowToolStripMenuItem1}); + this.contextMenuStrip1.Name = "contextMenuStrip1"; + this.contextMenuStrip1.Size = new System.Drawing.Size(144, 76); + // + // addToolStripMenuItem + // + this.addToolStripMenuItem.Name = "addToolStripMenuItem"; + this.addToolStripMenuItem.Size = new System.Drawing.Size(143, 22); + this.addToolStripMenuItem.Text = "&Add Tile"; + this.addToolStripMenuItem.Click += new System.EventHandler(this.addTileMenuItem_Click); + // + // addListToolStripMenuItem + // + this.addListToolStripMenuItem.Name = "addListToolStripMenuItem"; + this.addListToolStripMenuItem.Size = new System.Drawing.Size(143, 22); + this.addListToolStripMenuItem.Text = "Add &Folder"; + this.addListToolStripMenuItem.Click += new System.EventHandler(this.addListTileMenuItem_Click); + // + // toolStripMenuItem6 + // + this.toolStripMenuItem6.Name = "toolStripMenuItem6"; + this.toolStripMenuItem6.Size = new System.Drawing.Size(140, 6); + // + // removeRowToolStripMenuItem1 + // + this.removeRowToolStripMenuItem1.Name = "removeRowToolStripMenuItem1"; + this.removeRowToolStripMenuItem1.Size = new System.Drawing.Size(143, 22); + this.removeRowToolStripMenuItem1.Text = "&Remove Row"; + this.removeRowToolStripMenuItem1.Click += new System.EventHandler(this.removeRowToolStripMenuItem_Click_1); + // + // contextMenuStrip2 + // + this.contextMenuStrip2.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripMenuItem2, + this.toolStripMenuItem1, + this.toolStripSeparator3, + this.toolStripMenuItem7, + this.toolStripSeparator2, + this.toolStripMenuItem4, + this.toolStripSeparator1, + this.toolStripMenuItem3}); + this.contextMenuStrip2.Name = "contextMenuStrip1"; + this.contextMenuStrip2.Size = new System.Drawing.Size(181, 154); + // + // toolStripMenuItem2 + // + this.toolStripMenuItem2.Name = "toolStripMenuItem2"; + this.toolStripMenuItem2.Size = new System.Drawing.Size(180, 22); + this.toolStripMenuItem2.Text = "&Add Group"; + this.toolStripMenuItem2.Click += new System.EventHandler(this.addGroupMenuItem_Click); + // + // toolStripMenuItem1 + // + this.toolStripMenuItem1.Name = "toolStripMenuItem1"; + this.toolStripMenuItem1.Size = new System.Drawing.Size(180, 22); + this.toolStripMenuItem1.Text = "&Edit"; + this.toolStripMenuItem1.Click += new System.EventHandler(this.editGroupMenuItem_Click); + // + // toolStripSeparator2 + // + this.toolStripSeparator2.Name = "toolStripSeparator2"; + this.toolStripSeparator2.Size = new System.Drawing.Size(177, 6); + // + // toolStripMenuItem4 + // + this.toolStripMenuItem4.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.topToolStripMenuItem, + this.upToolStripMenuItem, + this.downToolStripMenuItem, + this.bottomToolStripMenuItem}); + this.toolStripMenuItem4.Name = "toolStripMenuItem4"; + this.toolStripMenuItem4.Size = new System.Drawing.Size(180, 22); + this.toolStripMenuItem4.Text = "&Move"; + // + // topToolStripMenuItem + // + this.topToolStripMenuItem.Name = "topToolStripMenuItem"; + this.topToolStripMenuItem.Size = new System.Drawing.Size(114, 22); + this.topToolStripMenuItem.Text = "&Top"; + this.topToolStripMenuItem.Click += new System.EventHandler(this.moveTopMenuItem_Click); + // + // upToolStripMenuItem + // + this.upToolStripMenuItem.Name = "upToolStripMenuItem"; + this.upToolStripMenuItem.Size = new System.Drawing.Size(114, 22); + this.upToolStripMenuItem.Text = "&Up"; + this.upToolStripMenuItem.Click += new System.EventHandler(this.moveUpMenuItem_Click); + // + // downToolStripMenuItem + // + this.downToolStripMenuItem.Name = "downToolStripMenuItem"; + this.downToolStripMenuItem.Size = new System.Drawing.Size(114, 22); + this.downToolStripMenuItem.Text = "&Down"; + this.downToolStripMenuItem.Click += new System.EventHandler(this.moveDownMenuItem_Click); + // + // bottomToolStripMenuItem + // + this.bottomToolStripMenuItem.Name = "bottomToolStripMenuItem"; + this.bottomToolStripMenuItem.Size = new System.Drawing.Size(114, 22); + this.bottomToolStripMenuItem.Text = "&Bottom"; + this.bottomToolStripMenuItem.Click += new System.EventHandler(this.moveBottomMenuItem_Click); + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(177, 6); + // + // toolStripMenuItem3 + // + this.toolStripMenuItem3.Name = "toolStripMenuItem3"; + this.toolStripMenuItem3.Size = new System.Drawing.Size(180, 22); + this.toolStripMenuItem3.Text = "&Remove"; + this.toolStripMenuItem3.Click += new System.EventHandler(this.removeGroupMenuItem3_Click); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(99)))), ((int)(((byte)(105)))), ((int)(((byte)(119))))); + this.label1.Image = global::BookmarkManager.AppResource.toggle_left_ea_16; + this.label1.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.label1.Location = new System.Drawing.Point(265, 83); + this.label1.Margin = new System.Windows.Forms.Padding(0); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(0, 15); + this.label1.TabIndex = 2; + this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + this.label1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.label1_MouseClick); + this.label1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.label1_MouseClick); + // + // toolStripSeparator3 + // + this.toolStripSeparator3.Name = "toolStripSeparator3"; + this.toolStripSeparator3.Size = new System.Drawing.Size(177, 6); + // + // toolStripMenuItem7 + // + this.toolStripMenuItem7.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripMenuItem5, + this.removeRowToolStripMenuItem}); + this.toolStripMenuItem7.Name = "toolStripMenuItem7"; + this.toolStripMenuItem7.Size = new System.Drawing.Size(180, 22); + this.toolStripMenuItem7.Text = "Ro&w"; + // + // toolStripMenuItem5 + // + this.toolStripMenuItem5.Name = "toolStripMenuItem5"; + this.toolStripMenuItem5.Size = new System.Drawing.Size(180, 22); + this.toolStripMenuItem5.Text = "Add &Row"; + this.toolStripMenuItem5.Click += new System.EventHandler(this.toolStripMenuItem5_Click); + // + // removeRowToolStripMenuItem + // + this.removeRowToolStripMenuItem.Name = "removeRowToolStripMenuItem"; + this.removeRowToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.removeRowToolStripMenuItem.Text = "Remo&ve Row"; + this.removeRowToolStripMenuItem.Click += new System.EventHandler(this.removeRowToolStripMenuItem_Click_1); + // + // TilePanelLayout + // + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.Transparent; + this.Controls.Add(this.label1); + this.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + this.Name = "TilePanelLayout"; + this.Size = new System.Drawing.Size(432, 173); + this.contextMenuStrip1.ResumeLayout(false); + this.contextMenuStrip2.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; + private System.Windows.Forms.ToolStripMenuItem addToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem addListToolStripMenuItem; + private System.Windows.Forms.ContextMenuStrip contextMenuStrip2; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem2; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem1; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem4; + private System.Windows.Forms.ToolStripMenuItem topToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem upToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem downToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem bottomToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem3; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem6; + private System.Windows.Forms.ToolStripMenuItem removeRowToolStripMenuItem1; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem7; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem5; + private System.Windows.Forms.ToolStripMenuItem removeRowToolStripMenuItem; + } +} diff --git a/Windows/Forms/TilePanelLayout.cs b/Windows/Forms/TilePanelLayout.cs new file mode 100644 index 0000000..b931be3 --- /dev/null +++ b/Windows/Forms/TilePanelLayout.cs @@ -0,0 +1,943 @@ +using FizzyLauncher.Models; +using RyzStudio.Windows.Forms; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; +using AppResource = BookmarkManager.AppResource; + +namespace FizzyLauncher.Windows.Forms +{ + public partial class TilePanelLayout : TUserControl + { + public static int CalcWidth(int tileCount) => (tileCount * tileSize) + ((tileCount - 1) * margin); + + + public class Item + { + public TilePanel Tile { get; set; } + public Point Coord { get; set; } = new Point(0, 0); + } + + + protected const int tileSize = 70; + protected const int margin = 3; + protected const int labelHeight = 20; + protected const int collapseIncrement = 6; + protected const int expandIncrement = 8; + + protected TileGroupModel groupModel = null; + protected List items = new List(); + + protected int collapseHeight = 0; + protected int expandedHeight = 0; + + protected bool isAnimating = false; + protected bool isChecked = true; + protected Point lastMousePosition = new Point(); + protected Point gridSize = new Point(); + + + public TilePanelLayout(TileGroupModel model) : base() + { + InitializeComponent(); + + this.AllowDrop = true; + this.BackColor = Color.Transparent; + + this.LoadModel(model); + + label1.Location = new Point(0, 4); + label1.Margin = new Padding(0); + label1.Padding = new Padding(0); + } + + protected override void OnDragDrop(DragEventArgs e) + { + string[] fileList = e.Data.GetData(DataFormats.FileDrop) as string[]; + + this.DropFileList(fileList); + } + + protected override void OnDragOver(DragEventArgs e) + { + if (e.Data.GetDataPresent(DataFormats.FileDrop)) + { + e.Effect = DragDropEffects.Link; + } + else + { + e.Effect = DragDropEffects.None; + } + } + + protected override void OnLoad(EventArgs e) + { + base.OnLoad(e); + + this.Margin = new Padding(0); + this.Padding = new Padding(0, 0, 0, 10); + } + + protected override async void OnResize(EventArgs e) + { + base.OnResize(e); + + await this.InvalidateContainer(); + } + + protected override void OnMouseClick(MouseEventArgs e) + { + base.OnMouseClick(e); + + lastMousePosition = e.Location; + + bool isLabel = ((e.Location.X >= 0) && (e.Location.X <= this.Width) && (e.Location.Y >= 0) && (e.Location.Y <= 20)); + + if (e.Button == MouseButtons.Left) + { + // do nothing + } + else if (e.Button == MouseButtons.Right) + { + if (isLabel) + { + contextMenuStrip2.Show(this, e.Location); + } + else + { + contextMenuStrip1.Show(this, e.Location); + } + } + } + + protected override void OnMouseDoubleClick(MouseEventArgs e) => base.OnMouseClick(e); + + public Point GridSize + { + get => gridSize; + } + + public bool EnableAnimation + { + get + { + MainForm mainForm = this.MainForm; + if (mainForm == null) + { + return false; + } + + if (mainForm.CurrentSession == null) + { + return false; + } + + return mainForm.CurrentSession.EnableAnimation; + } + } + + public int CollapseHeight => labelHeight + collapseHeight; + + public int ExpandedHeight => expandedHeight + this.Padding.Bottom; + + public void DropFileList(string[] fileList) + { + if (fileList == null) + { + return; + } + + if (fileList.Length <= 0) + { + return; + } + + if (string.IsNullOrWhiteSpace(fileList[0])) + { + return; + } + + TileModel model = new TileModel() + { + ProcessFilename = fileList[0], + Title = Path.GetFileName(fileList[0]) + }; + + // exe + if (Path.GetExtension(fileList[0]).Equals(".exe", StringComparison.CurrentCultureIgnoreCase)) + { + if (File.Exists(fileList[0])) + { + try + { + FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(fileList[0]); + if (fvi != null) + { + model.Title = fvi.ProductName; + } + } + catch + { + // do nothing + } + } + + if (string.IsNullOrWhiteSpace(model.Title)) + { + model.Title = Path.GetFileNameWithoutExtension(fileList[0]); + } + } + + this.AddTile(model); + } + + public TileGroupModel Model + { + get + { + TileGroupModel rs = new TileGroupModel() + { + Title = groupModel.Title, + GridSize = new Size(this.GridSize.X, this.GridSize.Y), + IsExpanded = isChecked, + IsExclusive = groupModel.IsExclusive, + Items = this.Tiles + }; + + return rs; + } + } + + public FlowLayoutPanel FlowLayoutPanel + { + get + { + Control parentControl = this.Parent; + while (true) + { + if (parentControl == null) + { + return null; + } + + if (parentControl.GetType() == typeof(FlowLayoutPanel)) + { + return parentControl as FlowLayoutPanel; + } + + parentControl = parentControl.Parent; + } + } + } + + public MainForm MainForm + { + get + { + Control parentControl = this.FlowLayoutPanel; + while (true) + { + if (parentControl == null) + { + return null; + } + + if (parentControl.GetType() == typeof(MainForm)) + { + return parentControl as MainForm; + } + + parentControl = parentControl.Parent; + } + } + } + + public List Tiles + { + get + { + List rs = new List(); + foreach (Item item in items) + { + TileModel model = item.Tile.ModelInfo; + model.Position = item.Coord; + + rs.Add(model); + } + + return rs; + } + } + + public int TileSize => (tileSize + margin); + + public void AddTile(TileModel tile) + { + Point gridSize = this.GridSize; + + if (items.Count >= (gridSize.X * gridSize.Y)) + { + this.SetGridSize(gridSize.X, (gridSize.Y + 1)); + } + + Point? newCoord = tile.Position; + if ((newCoord == null) || hasTile(tile.Position)) + { + newCoord = findLastFreeCoord(); + } + + if (newCoord == null) + { + return; + } + + tile.Position = newCoord.Value; + + TilePanel panel = new TilePanel(); + panel.LoadInfo(tile); + panel.Location = convertCoordToLocation(tile.Position); + + items.Add(new Item() + { + Tile = panel, + Coord = tile.Position + }); + + this.Controls.Add(panel); + } + + public void Clear() + { + this.Controls.Clear(); + } + + public async Task Collapse() + { + await Task.Run(() => + { + if (isAnimating) return; + + isAnimating = true; + isChecked = false; + + if (this.EnableAnimation) + { + while (this.Height > this.CollapseHeight) + { + ThreadControl.SetHeight(this, (this.Height - collapseIncrement)); + + Thread.Sleep(10); + } + } + + ThreadControl.SetHeight(this, this.CollapseHeight); + + isAnimating = false; + + this.Invalidate(this.DisplayRectangle, false); + }); + } + + public async Task Expand() + { + await Task.Run(() => + { + if (isAnimating) return; + + isAnimating = true; + isChecked = true; + + if (this.EnableAnimation) + { + while (this.Height < this.ExpandedHeight) + { + ThreadControl.SetHeight(this, (this.Height + expandIncrement)); + Thread.Sleep(10); + } + } + + ThreadControl.SetHeight(this, this.ExpandedHeight); + + isAnimating = false; + + this.Invalidate(this.DisplayRectangle, false); + }); + } + + public Point GetTilePosition(int posX, int posY) + { + int x = (int)Math.Round(decimal.Divide(posX, this.TileSize)); + int y = (int)Math.Round(decimal.Divide((posY - labelHeight), this.TileSize)); + + if (x < 0) x = 0; + if (y < 0) y = 0; + + return new Point((x * this.TileSize), ((y * this.TileSize) + labelHeight)); + } + + public async Task InvalidateContainer() + { + if (isAnimating) + { + return; + } + + if (isChecked) + { + await this.Expand(); + } + else + { + await this.Collapse(); + } + } + + public void AddGroup() + { + if (this.FlowLayoutPanel == null) + { + return; + } + + this.FlowLayoutPanel.Controls.Add(new TilePanelLayout(new TileGroupModel() + { + Title = "New Group", + GridSize = new Size(8, 1) + })); + } + + public void AddRow() => this.SetGridSize(gridSize.X, (gridSize.Y + 1)); + + public void EditGroup() => EditGroupForm.ShowDialog(this); + + public void LoadModel(TileGroupModel model) + { + groupModel = model; + + isChecked = groupModel.IsExpanded; + + label1.Text = " " + groupModel?.Title; + label1.Image = (isChecked ? AppResource.toggle_right_ea_16 : AppResource.toggle_left_ea_16); + + this.SetGridSize(groupModel.GridSize.Width, groupModel.GridSize.Height); + this.LoadTiles(model.Items); + this.SetGridSize(groupModel.GridSize.Width, groupModel.GridSize.Height); + + this.Invalidate(); + } + + public void UpdateModel(TileGroupModel model) + { + groupModel = model; + isChecked = groupModel.IsExpanded; + + label1.Text = " " + groupModel?.Title; + + this.Invalidate(); + } + + public void LoadTiles(List tiles) + { + if (tiles == null) + { + return; + } + + if (tiles.Count() <= 0) + { + return; + } + + foreach (TileModel item in tiles) + { + // resolve final grid position + Point? confirmedPosition = resolveCoord(item.Position); + if (confirmedPosition == null) + { + continue; + } + + // place control + TilePanel panel = new TilePanel(); + panel.LoadInfo(item); + panel.Location = convertCoordToLocation(confirmedPosition.Value); + + items.Add(new Item() + { + Tile = panel, + Coord = confirmedPosition.Value + }); + + this.Controls.Add(panel); + } + } + + public void MoveTile(TilePanel panel, int posX, int posY) + { + Item item = items.Where(x => x.Tile.Equals(panel)).FirstOrDefault(); + if (item == null) + { + return; + } + + Point newPosition = convertLocationToCoord_Nearest(posX, posY); + if (!isTileInBounds(newPosition)) + { + return; + } + + if (hasTile(newPosition)) + { + Item swapItem = items.Where(x => x.Coord.Equals(newPosition)).FirstOrDefault(); + if (swapItem != null) + { + swapItem.Coord = item.Coord; + swapItem.Tile.Location = convertCoordToLocation(item.Coord); + } + + item.Coord = newPosition; + panel.Location = convertCoordToLocation(newPosition); + } + else + { + item.Coord = newPosition; + panel.Location = convertCoordToLocation(newPosition); + } + } + + public void MoveTop() + { + if (this.FlowLayoutPanel == null) + { + return; + } + + this.FlowLayoutPanel.Controls.SetChildIndex(this, 0); + } + + public void MoveUp() + { + if (this.FlowLayoutPanel == null) + { + return; + } + + int pos = this.FlowLayoutPanel.Controls.GetChildIndex(this); + if (pos <= 0) + { + return; + } + + this.FlowLayoutPanel.Controls.SetChildIndex(this, (pos - 1)); + } + + public void MoveDown() + { + if (this.FlowLayoutPanel == null) + { + return; + } + + int pos = this.FlowLayoutPanel.Controls.GetChildIndex(this); + if (pos >= (this.FlowLayoutPanel.Controls.Count - 1)) + { + return; + } + + this.FlowLayoutPanel.Controls.SetChildIndex(this, (pos + 1)); + } + + public void MoveBottom() + { + if (this.FlowLayoutPanel == null) + { + return; + } + + this.FlowLayoutPanel.Controls.SetChildIndex(this, (this.FlowLayoutPanel.Controls.Count - 1)); + } + + public void Remove() + { + if (this.FlowLayoutPanel == null) + { + return; + } + + this.FlowLayoutPanel.Controls.Remove(this); + } + + public void Remove(TilePanel panel) + { + Item m = items.Where(x => x.Tile.Equals(panel)).FirstOrDefault(); + if (m != null) + { + items.Remove(m); + } + + this.Controls.Remove(panel); + } + + public void SetGridSize(int width, int height) + { + gridSize = new Point(width, height); + + groupModel.GridSize = new Size(groupModel.GridSize.Width, height); + + expandedHeight = (this.TileSize * height) + labelHeight; + + int w = CalcWidth(gridSize.X); + + this.Size = new Size(w, (isChecked ? this.ExpandedHeight : this.CollapseHeight)); + } + + protected Point convertCoordToLocation(Point position) => new Point((position.X * this.TileSize), ((position.Y * this.TileSize) + labelHeight)); + + protected Point convertLocationToCoord(int posX, int posY) + { + int x = (int)Math.Ceiling(decimal.Divide(posX, this.TileSize)); + int y = (int)Math.Ceiling(decimal.Divide((posY - labelHeight), this.TileSize)); + + x--; + y--; + + if (x < 0) x = 0; + if (y < 0) y = 0; + + return new Point(x, y); + } + + protected Point convertLocationToCoord_Nearest(int posX, int posY) + { + int x = (int)Math.Round(decimal.Divide(posX, this.TileSize)); + int y = (int)Math.Round(decimal.Divide((posY - labelHeight), this.TileSize)); + + if (x < 0) x = 0; + if (y < 0) y = 0; + + return new Point(x, y); + } + + protected Point? findFirstFreeCoord() + { + Point gridSize = this.GridSize; + + for (int y = 0; y < gridSize.Y; y++) + { + for (int x = 0; x < gridSize.X; x++) + { + if (hasTile(new Point(x, y))) + { + continue; + } + + return new Point(x, y); + } + } + + return null; + } + + protected Point? findLastFreeCoord() + { + Point gridSize = this.GridSize; + + // none available + if (items.Count >= (gridSize.X * gridSize.Y)) + { + return null; + } + + if (items.Count <= 0) + { + return findFirstFreeCoord(); + } + + // only one available + if (items.Count >= ((gridSize.X * gridSize.Y) - 1)) + { + return findFirstFreeCoord(); + } + + Point? rv = null; + + for (int y = (gridSize.Y - 1); y >= 0; y--) + { + for (int x = (gridSize.X - 1); x >= 0; x--) + { + if (hasTile(new Point(x, y))) + { + if (rv.HasValue) + { + return rv; + } + } + else + { + rv = new Point(x, y); + } + } + } + + return null; + } + + protected bool hasTile(Point position) + { + if (items == null) + { + return false; + } + + if (items.Count <= 0) + { + return false; + } + + return (items.Count(x => x.Coord.Equals(position)) > 0); + } + + protected bool isTileInBounds(Point position) + { + Point gridSize = this.GridSize; + + if (position.X >= gridSize.X) + { + return false; + } + + if (position.Y >= gridSize.Y) + { + return false; + } + + return true; + } + + protected Point? resolveCoord(Point coord) + { + if (!isTileInBounds(coord)) + { + return null; + } + + if (!hasTile(coord)) + { + return coord; + } + + return resolveNextCoord(coord); + } + + protected Point? resolveNextCoord(Point coord) + { + Point gridSize = this.GridSize; + Point newCoord = coord; + + while (true) + { + newCoord.X++; + + if (newCoord.X >= gridSize.X) + { + newCoord.Y++; + newCoord.X = 0; + } + + if (!isTileInBounds(newCoord)) + { + return null; + } + + if (hasTile(newCoord)) + { + continue; + } + + return newCoord; + } + } + + private async void label1_MouseClick(object sender, MouseEventArgs e) + { + if (isAnimating) return; + + if (e.Button == MouseButtons.Left) + { + isChecked = !isChecked; + + label1.Image = (isChecked ? AppResource.toggle_right_ea_16 : AppResource.toggle_left_ea_16); + + this.Invalidate(); + + await this.InvalidateContainer(); + + // exclusivity + if (isChecked) + { + if (this.Model.IsExclusive) + { + if (this.FlowLayoutPanel != null) + { + foreach (TilePanelLayout item in this.FlowLayoutPanel.Controls.OfType()) + { + if (item.Equals(this)) + { + continue; + } + + await item.Collapse(); + } + } + } + } + + label1.Image = (isChecked ? AppResource.toggle_right_ea_16 : AppResource.toggle_left_ea_16); + } + else if (e.Button == MouseButtons.Right) + { + contextMenuStrip2.Show(this, e.Location); + } + } + + #region tile context menu + + /// + /// Add tile + /// + /// + /// + private void addTileMenuItem_Click(object sender, EventArgs e) + { + Point coord = convertLocationToCoord(lastMousePosition.X, lastMousePosition.Y); + + EditTileForm.ShowAddDialog(this, coord); + } + + /// + /// Add folder + /// + /// + /// + private void addListTileMenuItem_Click(object sender, EventArgs e) + { + Point coord = convertLocationToCoord(lastMousePosition.X, lastMousePosition.Y); + + EditTileFolderForm.ShowAddDialog(this, coord); + } + + #endregion + + #region group context menu + + /// + /// Add group + /// + /// + /// + private void addGroupMenuItem_Click(object sender, EventArgs e) + { + this.AddGroup(); + } + + /// + /// Edit group + /// + /// + /// + private void editGroupMenuItem_Click(object sender, EventArgs e) + { + this.EditGroup(); + } + + /// + /// Add row + /// + /// + /// + private void toolStripMenuItem5_Click(object sender, EventArgs e) + { + this.AddRow(); + } + + /// + /// Remove row + /// + /// + /// + private void removeRowToolStripMenuItem_Click_1(object sender, EventArgs e) + { + if (gridSize.Y <= 1) + { + return; + } + + bool rs = items.Exists(x => x.Coord.Y.Equals(gridSize.Y - 1)); + if (rs) + { + return; + } + + this.SetGridSize(gridSize.X, (gridSize.Y - 1)); + } + + /// + /// Move to top + /// + /// + /// + private void moveTopMenuItem_Click(object sender, EventArgs e) + { + this.MoveTop(); + } + + /// + /// Move up + /// + /// + /// + private void moveUpMenuItem_Click(object sender, EventArgs e) + { + this.MoveUp(); + } + + /// + /// Move down + /// + /// + /// + private void moveDownMenuItem_Click(object sender, EventArgs e) + { + this.MoveDown(); + } + + /// + /// Move to bottom + /// + /// + /// + private void moveBottomMenuItem_Click(object sender, EventArgs e) + { + this.MoveBottom(); + } + + /// + /// Remove group + /// + /// + /// + private void removeGroupMenuItem3_Click(object sender, EventArgs e) + { + this.Remove(); + } + + #endregion + + } +} diff --git a/Windows/Forms/TilePanelLayout.resx b/Windows/Forms/TilePanelLayout.resx new file mode 100644 index 0000000..b5d6123 --- /dev/null +++ b/Windows/Forms/TilePanelLayout.resx @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + 17, 17 + + + 172, 17 + + \ No newline at end of file diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000..4f54144 Binary files /dev/null and b/favicon.ico differ diff --git a/installer-64.iss b/installer-64.iss new file mode 100644 index 0000000..3282b61 --- /dev/null +++ b/installer-64.iss @@ -0,0 +1,49 @@ +; Script generated by the Inno Setup Script Wizard. +; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! + +#define MyAppName "Bookmark Manager" +#define MyAppVersion "0.4.0.061" +#define MyAppPublisher "Hi, I'm Ray" +#define MyAppURL "https://www.hiimray.co.uk/software-bookmark-manager" +#define MyAppExeName "bookmarkmanager.exe" + +[Setup] +; NOTE: The value of AppId uniquely identifies this application. Do not use the same AppId value in installers for other applications. +; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) +AppId={{472ED37C-C4FC-4B72-8BC3-C281A6E0D2F9} +AppName={#MyAppName} +AppVersion={#MyAppVersion} +;AppVerName={#MyAppName} {#MyAppVersion} +AppPublisher={#MyAppPublisher} +AppPublisherURL={#MyAppURL} +AppSupportURL={#MyAppURL} +AppUpdatesURL={#MyAppURL} +DefaultDirName={autopf}\{#MyAppName} +DefaultGroupName={#MyAppName} +DisableProgramGroupPage=yes +; Remove the following line to run in administrative install mode (install for all users.) +PrivilegesRequired=lowest +OutputDir=L:\gitlab-hiimray\fizzy-launcher\bin +OutputBaseFilename=fizzy-launcher-64 +Compression=lzma +SolidCompression=yes +WizardStyle=modern + +[Languages] +Name: "english"; MessagesFile: "compiler:Default.isl" + +[Tasks] +Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked + +[Files] +Source: "L:\gitlab-hiimray\fizzy-launcher\bin\Release\64\fizzylauncher.exe"; DestDir: "{app}"; Flags: ignoreversion +; NOTE: Don't use "Flags: ignoreversion" on any shared system files + +[Icons] +Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" +Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}" +Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon + +[Run] +Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent + diff --git a/installer-86.iss b/installer-86.iss new file mode 100644 index 0000000..bbab705 --- /dev/null +++ b/installer-86.iss @@ -0,0 +1,49 @@ +; Script generated by the Inno Setup Script Wizard. +; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! + +#define MyAppName "Bookmark Manager" +#define MyAppVersion "0.4.0.061" +#define MyAppPublisher "Hi, I'm Ray" +#define MyAppURL "https://www.hiimray.co.uk/software-bookmark-manager" +#define MyAppExeName "bookmarkmanager.exe" + +[Setup] +; NOTE: The value of AppId uniquely identifies this application. Do not use the same AppId value in installers for other applications. +; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) +AppId={{472ED37C-C4FC-4B72-8BC3-C281A6E0D2F9} +AppName={#MyAppName} +AppVersion={#MyAppVersion} +;AppVerName={#MyAppName} {#MyAppVersion} +AppPublisher={#MyAppPublisher} +AppPublisherURL={#MyAppURL} +AppSupportURL={#MyAppURL} +AppUpdatesURL={#MyAppURL} +DefaultDirName={autopf}\{#MyAppName} +DefaultGroupName={#MyAppName} +DisableProgramGroupPage=yes +; Remove the following line to run in administrative install mode (install for all users.) +PrivilegesRequired=lowest +OutputDir=L:\gitlab-hiimray\fizzy-launcher\bin +OutputBaseFilename=fizzy-launcher-86 +Compression=lzma +SolidCompression=yes +WizardStyle=modern + +[Languages] +Name: "english"; MessagesFile: "compiler:Default.isl" + +[Tasks] +Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked + +[Files] +Source: "L:\gitlab-hiimray\fizzy-launcher\bin\Release\86\fizzylauncher.exe"; DestDir: "{app}"; Flags: ignoreversion +; NOTE: Don't use "Flags: ignoreversion" on any shared system files + +[Icons] +Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" +Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}" +Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon + +[Run] +Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent +