From 1cdcca72678a239f4d30cef8825ff94f1e738870 Mon Sep 17 00:00:00 2001 From: Ray Date: Tue, 7 Sep 2021 12:32:24 +0100 Subject: [PATCH] Initial commit --- .gitignore | 6 + AppResource.Designer.cs | 160 +++ AppResource.resx | 151 +++ BookmarkManager.csproj | 134 ++ BookmarkManager.sln | 25 + Classes/Result.cs | 29 + Classes/SupportedFile/ISupportedFileBase.cs | 21 + Classes/SupportedFile/JSNXSupportedFile.cs | 84 ++ Classes/SupportedFile/RYZSupportedFile.cs | 33 + Classes/SupportedFile/SupportedFileBase.cs | 47 + DTO/BookmarkItem.cs | 40 + MainForm.Designer.cs | 350 ++++++ MainForm.cs | 959 +++++++++++++++ MainForm.resx | 209 ++++ Models/BookmarkItemModel.cs | 413 +++++++ Models/BookmarkItemViewModel.cs | 44 + Models/LauncherSession.cs | 42 + Models/TileGroupModel.cs | 21 + Models/TileModel.cs | 110 ++ NewForm.cs | 126 ++ NewForm.resx | 60 + OpenFileForm.cs | 182 +++ OpenFileForm.resx | 82 ++ OptionsForm.cs | 279 +++++ OptionsForm.resx | 80 ++ PasswordForm.cs | 151 +++ PasswordForm.resx | 60 + Program.cs | 23 + Properties/PublishProfiles/Release x64.pubxml | 17 + Properties/PublishProfiles/Release x86.pubxml | 17 + Resources/UI/arrow_down.png | Bin 0 -> 601 bytes Resources/UI/arrow_down2.png | Bin 0 -> 417 bytes Resources/UI/arrow_up.png | Bin 0 -> 590 bytes Resources/UI/arrow_up2.png | Bin 0 -> 410 bytes Resources/UI/circle_menu.png | Bin 0 -> 597 bytes Resources/UI/circle_menu2.png | Bin 0 -> 421 bytes Resources/UI/close.png | Bin 0 -> 367 bytes Resources/UI/close2.png | Bin 0 -> 468 bytes Resources/UI/cog.png | Bin 0 -> 713 bytes Resources/UI/cog2.png | Bin 0 -> 467 bytes Resources/UI/disk.png | Bin 0 -> 439 bytes Resources/UI/disk2.png | Bin 0 -> 347 bytes Resources/UI/edit.png | Bin 0 -> 612 bytes Resources/UI/edit2.png | Bin 0 -> 419 bytes Resources/UI/file.png | Bin 0 -> 372 bytes Resources/UI/file2.png | Bin 0 -> 323 bytes Resources/UI/folder.png | Bin 0 -> 352 bytes Resources/UI/folder2.png | Bin 0 -> 288 bytes Resources/UI/help.png | Bin 0 -> 670 bytes Resources/UI/help2.png | Bin 0 -> 436 bytes Resources/UI/icons.svg | 603 +++++++++ Resources/UI/menu.png | Bin 0 -> 212 bytes Resources/UI/menu2.png | Bin 0 -> 187 bytes Resources/UI/minus.png | Bin 0 -> 532 bytes Resources/UI/minus2.png | Bin 0 -> 380 bytes Resources/UI/pencil_line.png | Bin 0 -> 630 bytes Resources/UI/pencil_line2.png | Bin 0 -> 394 bytes Resources/UI/plus.png | Bin 0 -> 559 bytes Resources/UI/plus2.png | Bin 0 -> 398 bytes Resources/UI/trash.png | Bin 0 -> 382 bytes Resources/UI/trash2.png | Bin 0 -> 289 bytes Resources/file-text.png | Bin 0 -> 352 bytes Resources/folder.png | Bin 0 -> 303 bytes Resources/folder_32.png | Bin 0 -> 601 bytes Resources/folder_explore.png | Bin 0 -> 322 bytes Resources/hexagon.png | Bin 0 -> 313 bytes Resources/toggle-left-ea-16.png | Bin 0 -> 506 bytes Resources/toggle-right-ea-16.png | Bin 0 -> 502 bytes RyzStudio/Data/SQLite/SQLiteDatabase.cs | 444 +++++++ RyzStudio/Drawing/Rectangoid.cs | 124 ++ RyzStudio/IO/FileType.cs | 56 + RyzStudio/IO/SessionFileFormatBase.cs | 290 +++++ RyzStudio/IO/SharpZipLib.cs | 241 ++++ RyzStudio/Net/HttpWeb.cs | 168 +++ RyzStudio/Windows/Forms/StackLayoutPanel.cs | 69 ++ RyzStudio/Windows/Forms/TFlatButton.cs | 115 ++ RyzStudio/Windows/Forms/TForm.cs | 434 +++++++ RyzStudio/Windows/Forms/TForm.resx | 424 +++++++ .../Forms/THorizontalSeparator.Designer.cs | 37 + .../Windows/Forms/THorizontalSeparator.cs | 101 ++ .../Windows/Forms/THorizontalSeparator.resx | 120 ++ RyzStudio/Windows/Forms/TImageBox.cs | 84 ++ RyzStudio/Windows/Forms/TPanelBook.cs | 258 ++++ RyzStudio/Windows/Forms/TUserControl.cs | 73 ++ RyzStudio/Windows/Forms/ThreadControl.cs | 633 ++++++++++ .../ThemedForms/BorderlessForm.Designer.cs | 193 +++ .../Windows/ThemedForms/BorderlessForm.cs | 409 +++++++ .../Windows/ThemedForms/BorderlessForm.resx | 158 +++ .../BorderlessToolForm.Designer.cs | 191 +++ .../Windows/ThemedForms/BorderlessToolForm.cs | 394 ++++++ .../ThemedForms/BorderlessToolForm.resx | 138 +++ .../ThemedForms/PickerBox/TPickerBox.cs | 98 ++ .../PickerBox/TPickerBox.designer.cs | 59 + .../ThemedForms/PickerBox/TPickerBox.resx | 120 ++ .../ThemedForms/PickerBox/TYesNoPickerBox.cs | 17 + RyzStudio/Windows/ThemedForms/TButton.cs | 170 +++ .../Windows/ThemedForms/TButton.designer.cs | 61 + RyzStudio/Windows/ThemedForms/TButton.resx | 120 ++ .../ThemedForms/TDialogForm.Designer.cs | 47 + RyzStudio/Windows/ThemedForms/TDialogForm.cs | 117 ++ .../Windows/ThemedForms/TDialogForm.resx | 60 + RyzStudio/Windows/ThemedForms/TListBox.cs | 385 ++++++ .../Windows/ThemedForms/TListBox.designer.cs | 358 ++++++ RyzStudio/Windows/ThemedForms/TListBox.resx | 69 ++ RyzStudio/Windows/ThemedForms/TNumericBox.cs | 99 ++ .../ThemedForms/TNumericBox.designer.cs | 60 + .../Windows/ThemedForms/TNumericBox.resx | 60 + RyzStudio/Windows/ThemedForms/TUserControl.cs | 106 ++ .../ThemedForms/TUserControl.designer.cs | 37 + .../ThemedForms/TextBox/TButtonTextBox.cs | 127 ++ .../TextBox/TButtonTextBox.designer.cs | 81 ++ .../ThemedForms/TextBox/TButtonTextBox.resx | 120 ++ .../TextBox/TFolderTextBox - Copy.resx | 120 ++ .../ThemedForms/TextBox/TFolderTextBox.cs | 42 + .../ThemedForms/TextBox/TFolderTextBox.resx | 120 ++ .../ThemedForms/TextBox/TKeyCodeTextBox.cs | 92 ++ .../ThemedForms/TextBox/TOpenFileTextBox.cs | 43 + .../Windows/ThemedForms/TextBox/TTextBox.cs | 100 ++ .../ThemedForms/TextBox/TTextBox.designer.cs | 60 + .../Windows/ThemedForms/TextBox/TTextBox.resx | 120 ++ Text/Json/JsonPointConverter.cs | 40 + Text/Json/JsonSizeConverter.cs | 40 + UIResource.Designer.cs | 303 +++++ UIResource.resx | 193 +++ Windows/Forms/BookmarkTreeView.cs | 1074 +++++++++++++++++ Windows/Forms/BookmarkTreeViewSNode.cs | 211 ++++ Windows/Forms/EditGroupForm.cs | 176 +++ Windows/Forms/EditGroupForm.resx | 60 + Windows/Forms/EditTileFolderForm.cs | 394 ++++++ Windows/Forms/EditTileFolderForm.resx | 60 + Windows/Forms/EditTileForm.cs | 482 ++++++++ Windows/Forms/EditTileForm.resx | 97 ++ Windows/Forms/TileContainer.cs | 149 +++ Windows/Forms/TileContainer.resx | 120 ++ Windows/Forms/TilePanel.Designer.cs | 82 ++ Windows/Forms/TilePanel.cs | 506 ++++++++ Windows/Forms/TilePanel.resx | 66 + Windows/Forms/TilePanelLayout.Designer.cs | 259 ++++ Windows/Forms/TilePanelLayout.cs | 943 +++++++++++++++ Windows/Forms/TilePanelLayout.resx | 66 + favicon.ico | Bin 0 -> 7886 bytes installer-64.iss | 49 + installer-86.iss | 49 + 143 files changed, 18199 insertions(+) create mode 100644 .gitignore create mode 100644 AppResource.Designer.cs create mode 100644 AppResource.resx create mode 100644 BookmarkManager.csproj create mode 100644 BookmarkManager.sln create mode 100644 Classes/Result.cs create mode 100644 Classes/SupportedFile/ISupportedFileBase.cs create mode 100644 Classes/SupportedFile/JSNXSupportedFile.cs create mode 100644 Classes/SupportedFile/RYZSupportedFile.cs create mode 100644 Classes/SupportedFile/SupportedFileBase.cs create mode 100644 DTO/BookmarkItem.cs create mode 100644 MainForm.Designer.cs create mode 100644 MainForm.cs create mode 100644 MainForm.resx create mode 100644 Models/BookmarkItemModel.cs create mode 100644 Models/BookmarkItemViewModel.cs create mode 100644 Models/LauncherSession.cs create mode 100644 Models/TileGroupModel.cs create mode 100644 Models/TileModel.cs create mode 100644 NewForm.cs create mode 100644 NewForm.resx create mode 100644 OpenFileForm.cs create mode 100644 OpenFileForm.resx create mode 100644 OptionsForm.cs create mode 100644 OptionsForm.resx create mode 100644 PasswordForm.cs create mode 100644 PasswordForm.resx create mode 100644 Program.cs create mode 100644 Properties/PublishProfiles/Release x64.pubxml create mode 100644 Properties/PublishProfiles/Release x86.pubxml create mode 100644 Resources/UI/arrow_down.png create mode 100644 Resources/UI/arrow_down2.png create mode 100644 Resources/UI/arrow_up.png create mode 100644 Resources/UI/arrow_up2.png create mode 100644 Resources/UI/circle_menu.png create mode 100644 Resources/UI/circle_menu2.png create mode 100644 Resources/UI/close.png create mode 100644 Resources/UI/close2.png create mode 100644 Resources/UI/cog.png create mode 100644 Resources/UI/cog2.png create mode 100644 Resources/UI/disk.png create mode 100644 Resources/UI/disk2.png create mode 100644 Resources/UI/edit.png create mode 100644 Resources/UI/edit2.png create mode 100644 Resources/UI/file.png create mode 100644 Resources/UI/file2.png create mode 100644 Resources/UI/folder.png create mode 100644 Resources/UI/folder2.png create mode 100644 Resources/UI/help.png create mode 100644 Resources/UI/help2.png create mode 100644 Resources/UI/icons.svg create mode 100644 Resources/UI/menu.png create mode 100644 Resources/UI/menu2.png create mode 100644 Resources/UI/minus.png create mode 100644 Resources/UI/minus2.png create mode 100644 Resources/UI/pencil_line.png create mode 100644 Resources/UI/pencil_line2.png create mode 100644 Resources/UI/plus.png create mode 100644 Resources/UI/plus2.png create mode 100644 Resources/UI/trash.png create mode 100644 Resources/UI/trash2.png create mode 100644 Resources/file-text.png create mode 100644 Resources/folder.png create mode 100644 Resources/folder_32.png create mode 100644 Resources/folder_explore.png create mode 100644 Resources/hexagon.png create mode 100644 Resources/toggle-left-ea-16.png create mode 100644 Resources/toggle-right-ea-16.png create mode 100644 RyzStudio/Data/SQLite/SQLiteDatabase.cs create mode 100644 RyzStudio/Drawing/Rectangoid.cs create mode 100644 RyzStudio/IO/FileType.cs create mode 100644 RyzStudio/IO/SessionFileFormatBase.cs create mode 100644 RyzStudio/IO/SharpZipLib.cs create mode 100644 RyzStudio/Net/HttpWeb.cs create mode 100644 RyzStudio/Windows/Forms/StackLayoutPanel.cs create mode 100644 RyzStudio/Windows/Forms/TFlatButton.cs create mode 100644 RyzStudio/Windows/Forms/TForm.cs create mode 100644 RyzStudio/Windows/Forms/TForm.resx create mode 100644 RyzStudio/Windows/Forms/THorizontalSeparator.Designer.cs create mode 100644 RyzStudio/Windows/Forms/THorizontalSeparator.cs create mode 100644 RyzStudio/Windows/Forms/THorizontalSeparator.resx create mode 100644 RyzStudio/Windows/Forms/TImageBox.cs create mode 100644 RyzStudio/Windows/Forms/TPanelBook.cs create mode 100644 RyzStudio/Windows/Forms/TUserControl.cs create mode 100644 RyzStudio/Windows/Forms/ThreadControl.cs create mode 100644 RyzStudio/Windows/ThemedForms/BorderlessForm.Designer.cs create mode 100644 RyzStudio/Windows/ThemedForms/BorderlessForm.cs create mode 100644 RyzStudio/Windows/ThemedForms/BorderlessForm.resx create mode 100644 RyzStudio/Windows/ThemedForms/BorderlessToolForm.Designer.cs create mode 100644 RyzStudio/Windows/ThemedForms/BorderlessToolForm.cs create mode 100644 RyzStudio/Windows/ThemedForms/BorderlessToolForm.resx create mode 100644 RyzStudio/Windows/ThemedForms/PickerBox/TPickerBox.cs create mode 100644 RyzStudio/Windows/ThemedForms/PickerBox/TPickerBox.designer.cs create mode 100644 RyzStudio/Windows/ThemedForms/PickerBox/TPickerBox.resx create mode 100644 RyzStudio/Windows/ThemedForms/PickerBox/TYesNoPickerBox.cs create mode 100644 RyzStudio/Windows/ThemedForms/TButton.cs create mode 100644 RyzStudio/Windows/ThemedForms/TButton.designer.cs create mode 100644 RyzStudio/Windows/ThemedForms/TButton.resx create mode 100644 RyzStudio/Windows/ThemedForms/TDialogForm.Designer.cs create mode 100644 RyzStudio/Windows/ThemedForms/TDialogForm.cs create mode 100644 RyzStudio/Windows/ThemedForms/TDialogForm.resx create mode 100644 RyzStudio/Windows/ThemedForms/TListBox.cs create mode 100644 RyzStudio/Windows/ThemedForms/TListBox.designer.cs create mode 100644 RyzStudio/Windows/ThemedForms/TListBox.resx create mode 100644 RyzStudio/Windows/ThemedForms/TNumericBox.cs create mode 100644 RyzStudio/Windows/ThemedForms/TNumericBox.designer.cs create mode 100644 RyzStudio/Windows/ThemedForms/TNumericBox.resx create mode 100644 RyzStudio/Windows/ThemedForms/TUserControl.cs create mode 100644 RyzStudio/Windows/ThemedForms/TUserControl.designer.cs create mode 100644 RyzStudio/Windows/ThemedForms/TextBox/TButtonTextBox.cs create mode 100644 RyzStudio/Windows/ThemedForms/TextBox/TButtonTextBox.designer.cs create mode 100644 RyzStudio/Windows/ThemedForms/TextBox/TButtonTextBox.resx create mode 100644 RyzStudio/Windows/ThemedForms/TextBox/TFolderTextBox - Copy.resx create mode 100644 RyzStudio/Windows/ThemedForms/TextBox/TFolderTextBox.cs create mode 100644 RyzStudio/Windows/ThemedForms/TextBox/TFolderTextBox.resx create mode 100644 RyzStudio/Windows/ThemedForms/TextBox/TKeyCodeTextBox.cs create mode 100644 RyzStudio/Windows/ThemedForms/TextBox/TOpenFileTextBox.cs create mode 100644 RyzStudio/Windows/ThemedForms/TextBox/TTextBox.cs create mode 100644 RyzStudio/Windows/ThemedForms/TextBox/TTextBox.designer.cs create mode 100644 RyzStudio/Windows/ThemedForms/TextBox/TTextBox.resx create mode 100644 Text/Json/JsonPointConverter.cs create mode 100644 Text/Json/JsonSizeConverter.cs create mode 100644 UIResource.Designer.cs create mode 100644 UIResource.resx create mode 100644 Windows/Forms/BookmarkTreeView.cs create mode 100644 Windows/Forms/BookmarkTreeViewSNode.cs create mode 100644 Windows/Forms/EditGroupForm.cs create mode 100644 Windows/Forms/EditGroupForm.resx create mode 100644 Windows/Forms/EditTileFolderForm.cs create mode 100644 Windows/Forms/EditTileFolderForm.resx create mode 100644 Windows/Forms/EditTileForm.cs create mode 100644 Windows/Forms/EditTileForm.resx create mode 100644 Windows/Forms/TileContainer.cs create mode 100644 Windows/Forms/TileContainer.resx create mode 100644 Windows/Forms/TilePanel.Designer.cs create mode 100644 Windows/Forms/TilePanel.cs create mode 100644 Windows/Forms/TilePanel.resx create mode 100644 Windows/Forms/TilePanelLayout.Designer.cs create mode 100644 Windows/Forms/TilePanelLayout.cs create mode 100644 Windows/Forms/TilePanelLayout.resx create mode 100644 favicon.ico create mode 100644 installer-64.iss create mode 100644 installer-86.iss 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 0000000000000000000000000000000000000000..cccf233e96a5deccc73a84bdfff320ebbdfafc31 GIT binary patch literal 601 zcmV-f0;c_mP)pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10p>|W zK~y-6eN#PaR6!Iy=Mro-30PSKiIpPraGR~|R%2l*e}HHL+OCNp+H6D%i7rT@MYhmh z(i)A;{sSL-=OJm7fImQkE@*a-h4bX)1w7SoKjxlu?hH{wQ52b^B}r`n^C|oVz%I#t z2q9MMSsr4HCnWU%+yd|oz>cIn03dl5zyirxNiRv>2_gLYcR^}?3*aKjhojMGz13>{ ztWL`FykTamX7)hRfaI0(61e-OyZ?6gt940r#26Q2jEBSF@Hqf5Y5oXcErhUEE4~H* zA%r*8xVv{r-Uo2Ol40LRqtSYOnxth(%k}tpJbohSK+=*Ww|DBA|A%I?`2&AVZX1Bp zrQ0R#;c)m^l2w>kjPX$^DPfP~{1hsyOqeEluPBOBBnbdTQEW-N0pNO_%@lzBv}XW7 z2;r5xpOo~BpF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10WL{I zK~y-6jnlm@#8D6h@SlxrVbQ8YCtB8ZG=hYV6`zG(JOYKMKq6{25g!Gc zP~6$wzw0k?l1XmP%$dxcdoI5*fj!*fHR1+M)brw=!nqnn3wXu_?jtvfX$;~7%lMFq zukeXA^p#9j!#Y|~TP-G!LOfF<%+ZJ@`)y((h_#a9*@zq)p&2JF?D3DWFC%i)@Pyq8 zCZ&bF|6}|%-a<23!LaVO+hcE|Qs64s^7A_P80q!%DWM;$7%JpWF^{>jac*&zaZC8Z zL&R5bMVw0p)0CE2`=d#jxL;aglVs19WRe^QI4t2eL({SLVGxay;vBz>MAynK$t3x8 z1lKlD$IAI<+QA}TBm><=ZVXcxz%f>2pQ(sCc5xkzUgO*p)-B>2nOsV+E0#r300000 LNkvXXu0mjf{w}h~ literal 0 HcmV?d00001 diff --git a/Resources/UI/arrow_up.png b/Resources/UI/arrow_up.png new file mode 100644 index 0000000000000000000000000000000000000000..a08438ba358ad09ba06ed091b453a749822880e9 GIT binary patch literal 590 zcmV-U0pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10ozGL zK~y-6jZ?d7R8bUNYa=#e@&^(t#e2kQrnVc6h4}>q6HrW}CN{B|2nrHM@L9~@7lgD% zV>5r?W%d~)jS|QQXp9#$bC=DTaC22~Rhxa*eynxQA!-Dwn+9v z2(ilNB#1E{m-H0C4FF#OY)aY&0FtKx%#xgz^qS<|5W>&H2C4WhfD0ra6h*PtYPEh; zC*^tGFtcSdyDw=#^75n!-2J7y|8n;$bxC!^80TV)2gBj;82~V8{s>?-gs@sAyZdu9 zW0qx$wS0%<3V`#L4Et6T#afMY8^B^&mbX%Ti1B#*Skj)Pc}s3@RyC)BF3DYzy8yb? zCe3DZKbhP%04FDICym!q@f!dm0HYLl-Ti81k!_MQhRRhYe3$en%d!O}WLdUA@*&Cn zx~azi?4)}J0E7_M0jwt}005FDfR$fQf^7~=^^mjG-T$v(+x zGh40`N%lzg>Ul}`NKTRLBdz)(#&{58ocoXIM;?-;Np~a-0BpE>=WlZIJa4#r2f&7; zftf7Q?WoAo9K2vSQAnCfKHpx=}DCslF4pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10VhdB zK~y-6jnlm@#6c7V@E?&aEFMGR<2l&IR(cuSj8oi2Z4ea<-~bDFQy^dB z9n0v=oUDu$w4%4vS=&NS~}Hj#!a|`7in~jti1KTYl=$#$-ehYr*-l_HHDq|JePPk@&W9OHwy?ow9EOeObBq znKm$o7fHO^s10EZ{n*E%!e{Elh~%)V7}Sh)O<1=RpFIqP)pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10pdwS zK~y-6os+w2R8bU$zki>@;4sEF@Y0MTTbw4fU=c5ff-hh-g@Rb zJNq+bDvF}xoO|e;dtzqmlCDlc2qC-*AsmDdt~Vt$Eyj2w#yHv7*mwb;TJvXM-g`g) zFMyhGDCse9KCc_Lv$wamkg%L6%Q8=svMif;@3#TUvV4|h**&12*WF%CHCI)2(>Zq} z1u(OHU=g6#>+OaRR?TcK2acQB+celYw*|D)x2mcp4JDhBuH_`7oSLL>O#m}HIIJHz zuwBnN4Zdh*?M7Amz}>JNo!_yt0;<2uh-iJXti34=Edp6^2l!=flU&BUT8 zIw6E1@XpNEopS^D`%^>P!87R?;O&GgVc+cFqm{IHpF4-pu;I9B``E j{8iE?NlV`QQ5ydXqrm>^<pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10WwKM zK~y-6ozuH6L{St5;BS%>!7zy)C2@HP#fU^mynvdT+N~ENE~N+X0u&0*U?idvQ4?_~ zW~NY_HRjlkMEuE4_Fn7%SJqkQU;M;0_Hl!^I1TJ!DkWD6_nsiF;05Qni`*FIP{Rq< z(3FTT(ZUA$OFFA!3+>?c6q83GUMLZ!Sd1bEoxpSiHvS;)U^_IE75TuHF^rEOj3P@! zZ9K%iibtGgsLKcTQ6Mj&H!0AR4;kJ=Q_nDhvxIyv8B%mm#2w}{-+yHX&m{#~B|Mq@ zyT+3E4EmB-6IX@zcxdh8Nj{hkY8XmRt&ksxF89do*~VsBi@#teG+)*}jKIH)MAyn~ zxk;)&b*j1s`m%DmOuJacD=u&wxe3f-5XV@TEK?Cv^5Hae*ZDePlPUQVhbTqw-rwVt P00000NkvXXu0mjfiG#1D literal 0 HcmV?d00001 diff --git a/Resources/UI/close.png b/Resources/UI/close.png new file mode 100644 index 0000000000000000000000000000000000000000..25fc63244c4ebb4d67ac4fe0f893e9c281eb1584 GIT binary patch literal 367 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9F5he4R}c>anMprB-l zYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&Kt+E%T^vI!dZ$iy^gC=I;CkO> z<|#+zzjR7P%Dh^VpUb|W zuaP%kWos0J=myW7@>pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10bxl* zK~y-6jgwDG!(b4_e=m)Hj-UilO2wT^H#X2qR7$HOD^ccms&;z)#hy{b* zK+rVfq7iFbYTj;U-kW(de4moz(*yIY0~`T9#gGCISjqXh_|U|)P+CN7m@nf5Wmi6M zWa4_~wtrD@IsmU>Q^1)A_(doGfxIuk_m0<*a9lIrOvvdcW( z3*!BYpKdExm?9FgjTzb|^+zpZE;uky5r(URtmZ|W$qhAV}!e^5dtj$0000< KMNUMnLSTZlBh&@} literal 0 HcmV?d00001 diff --git a/Resources/UI/cog.png b/Resources/UI/cog.png new file mode 100644 index 0000000000000000000000000000000000000000..7a63c8ff497a06e19075ce81b066f66cccff3621 GIT binary patch literal 713 zcmV;)0yh1LP)pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10#->x zK~y-6g_ALe+(j70e{c36f*7kDVrxYBf4hqi!B{B7GN?sj@WAH4$O$3@vVKU}^TD=CDTk-i=|cdmwRK6?BwcH*eGD+2P9H6$JZW2Voc4h?fs>N% z*uDguk#w}RwkK%|_!L+H4ggn%!{Mm~LC<>K_6eYqbQ1U?BF+KioZn6`#0c9 zYwfY|czk0CK+?~)@1~TNBjP-8{$Elr^i9tBJ>d3WFt`P<1kiQePomJGM^)M8r8sN9XA*^{(FD+uQp^lK1J> zeP*}T_U2YAAH}M@wTauoUv^IYSsn+^oYwhXL zXmkXi);gT84Qxb2=_CKz_7B71aCNcM?(Xivob#Q@Wb!WmQ>B!(obz9$lt&gZ&StY^ z;2=;ZlgS$?r4`#(BjN)|E~T8ceG2&8_IJR6*4i>~b74--c@uaUxGU+h?bVdhG26e| zF2F~UUbX!&uo)4rNc!hf*jCPYlv27C5jS(r71#xS2VRVbLpwV=56)(@L*w!I#vHe_ v$mw2$+xz6cDe0o^2W-DCsR4iVy{NwdQgAt!(CbpF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10bof) zK~y-6jnX|!mT?pY@So4pP`D-L(2$!whJz3^1hyqKnBO7$0F_8i`T^1*H^EV~!EaDY zV`fWBU|SJCfcJo*|=qi;4l8H-~IFR_h<0Qcb;-r)(R6ML%;a3kn5y=JY+ zJPvWK=~%_v+W#n)^V&80c1G;V1AN9AW@Ed9zX|>ry#iUx2wir*Vhi`3v$CATR^ASl z;%h0(UB_MvSCq}~`=6R7#g%l@ZPzx9gE;15Yp3lUh4VkS9pCfB?%`nt(!vTp)GD>p z_EIgGLg$)>^y65$fs15Dp?t8aOgYbfg^j1F@}f59oWjUFek*$$Xd-WBwo~OM&J<=w zVt=hHyMv7iyt(O7{KAiP^F_J3N4Sow`R-m~R1*pOj>o-%{sE_RS^{qBODF&U002ov JPDHLkV1n}Z*WUmD literal 0 HcmV?d00001 diff --git a/Resources/UI/disk.png b/Resources/UI/disk.png new file mode 100644 index 0000000000000000000000000000000000000000..7355b964686b0062baebd248f6857423282e052b GIT binary patch literal 439 zcmV;o0Z9IdP)pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10Yphe zK~y-6t&_b)5XbR`bFSGBaRBm?l5x>{ilXR- zi-fJf)t@i+5WfNW!=EV}>z002ovPDHLkV1k?dw_^YR literal 0 HcmV?d00001 diff --git a/Resources/UI/disk2.png b/Resources/UI/disk2.png new file mode 100644 index 0000000000000000000000000000000000000000..29b59a4edfdd5e1c25cd3912d2772c20c4b8e8c7 GIT binary patch literal 347 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9F5he4R}c>anMprB-l zYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&Kt(S+T^vI!de>gI^Ngw?bDDi%l9pJp;Dum{qmSst11WCT60!?2w%<+t z>UhyNbbq*g$YHB>fr%zZ+afL=a++X%;dtDS^M75~+ba%=$<1)QX=nQ_M}|J+Jnj@y+qsYZz=EStxIqY4xv`t(f!5i*pCxF48OLZZ6O}esi|R r&%XJr&)YtRtUvQ@uJr1H&a3+7+TP-o%(d-6KQnl``njxgN@xNA{ppR@ literal 0 HcmV?d00001 diff --git a/Resources/UI/edit.png b/Resources/UI/edit.png new file mode 100644 index 0000000000000000000000000000000000000000..031e3f604221f0e7d68be875e68412c8b19e089e GIT binary patch literal 612 zcmV-q0-ODbP)N&JP;!hkk{ zRVu+~Z1NxY$nNDxqXYy=r$G`A&=uh-v}Ty`Xl)F_Rz z44c^_NkL{SvR@t;JdFsO8D5|@|IhypJ#m5!Q1H8FZd#HA7)3J*ZxDUgU4a4Co} z6%!PDjXBPkVI?QoXRZBTXYKENoA#K*7Oqi`=L%I!pUHfp1o!65dr zj5j&>0`DlJ@0ZDnSVJTB7P7_NfaiVz^D!SywwsB`NR+!kQ#inIyjOx5Ckgh{VQeVj z0iQU{9OoIEB(;zJ0Y6|iQ#-~b)Fg5Kf){f23TnN6{>m)8g&{m*6^9+BY&*gz?lWI5 zb>L1UgQ-d)7Nbzc2kyGS{gQ}Pl06$*IxI$$kxnCHJ(zE6??ht03)GA@Bhj*QLsGZc z&M9gc=-bNq%d~+dyy6@;Q5(ZF2C#<}xyzJ|3CUrX(WoBls<3W0z5w(WQ9cjxl3D-& N002ovPDHLkV1gdCtIYra literal 0 HcmV?d00001 diff --git a/Resources/UI/file.png b/Resources/UI/file.png new file mode 100644 index 0000000000000000000000000000000000000000..d0c9e5830ade13c518f1a0a7fb5c4e4f20407e41 GIT binary patch literal 372 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBufiR<}hF1en1E;5pV~B-+@}K|z?GJx_eO>q8-{0o#jg5}n z9g>X_tOiC#_t=80Zr!@IUqOk7N1;}M!R*1StE;a!K12(Z}++-JXWeQ&xW63z>H+#w~#;bXZn+`j)9pFh|njA5wmragwuLSFoy^UXf z-QJ$R*||lK?E$O9ZJ!1+Yvz}S9d3O--Y>s=VUUaD2I&+{T?OdXq84umfFr?P-?xdad}WKNiL#_{XZGGItC Nc)I$ztaD0e0s!%Bg1i6# literal 0 HcmV?d00001 diff --git a/Resources/UI/file2.png b/Resources/UI/file2.png new file mode 100644 index 0000000000000000000000000000000000000000..f3e9f6d2179af7121d2314669151bada83185afe GIT binary patch literal 323 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBufiR<}hF1en@P?<0V~B_mzch1Gq$$e+;8eZOfUvhDuXxoI>Z<;4FSAKHgGum`mj9+JAe$xE~D$Gfb_Ufni z7#v^{&B$rov*qGpw%RufHG>j*wWC%%Y+_q<#CAgOdiK0!6}xON-0+;gM&xay`G2PQ zOt+G*wXB{cw|r8~q%TRk64!0sue^WDo$FTu|J0^hdJ9TEnV5RN^Ixw)1@p4T61G!! S%?<z-+dbOt}?FI(5&63 z!&xxsRAc6>xjSk&zt`3`Z)|F7-J~QH5X=#{UFURYn3YI@fwwJ_jttCAK*V_`Ki{a*MzIbzRjOhYh_C1ebkJR#jNvvd?fa!=5|A|9&sX=bBqw z_}4JvZ^yzP0u8$9uV$_TjT-wL<FVdQ&MBb@0I8Ogm;e9( literal 0 HcmV?d00001 diff --git a/Resources/UI/folder2.png b/Resources/UI/folder2.png new file mode 100644 index 0000000000000000000000000000000000000000..d21178aa8cafb22ebfe50bf0379772d84075e671 GIT binary patch literal 288 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sDEfH31!Z9ZwB;8sr;#}Etux0m z`({cN-g>d1b*@z9#RhA)7pn!Ax7qqdta#{pJI^3+VJW*+#mk31-fh|?`8{_S-y0oW z`^Bn$it?(JjOTVb)$O~faH{@5KU<52yXeMiVqQy{0_Lhp%~1Zkc=O`wSeX!(3x_|< hFBYubZFY>sKU2UnWXUOwlRytJc)I$ztaD0e0suaOZf^hp literal 0 HcmV?d00001 diff --git a/Resources/UI/help.png b/Resources/UI/help.png new file mode 100644 index 0000000000000000000000000000000000000000..88b4864006518565fd2c8e5e5072b0fd688d4466 GIT binary patch literal 670 zcmV;P0%84$P)pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10xL;G zK~y-6ZBsE!6hRbyZ*C(6LSv4^!e|5LZp@wqHCTvZOo*}4&O{1rY!n(S1Y<)mCdQzN z7aP0N7!wN-D8#~888>%xr%-5!4RlIybL4KG%^q16UN!mu&HVq~pHE~^uh&mW8kaNz z;CK@L1z?F}*;?z;e0C1bxkHj30k{F+4}b+ps{lZ90Kh28UP(_$-nQ26>^_iOeh*-X z~wW? zeeCb=-v)5cIro+18}I!bfLly7e*-XMt)1!k;Jsf2a5Rzdqt$AiEtN{Y0iaf^O_Q7g z5SqlWzi}MTb=vjb&jN_O_o4UxjHDw$5KMRS?RI-s(w3xgleoQ*)=csRfGc4bR>Lq{ z0kG`7Ki$cfN~P_@>*hO0Mu%=C(gN+b8ak6Y&04JjYeaSJm=h) zbFNjbRv!bIuS{}S(t~!pJ)4Yb7f}>-=W@A8l2hrgoL#1eByUREBKg64|2;_;NS-6v zpF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10YOPb zK~y-6b<;6RT|p29;7^n%`1Jh(Yr#BI+J&T38?Dk<+az^jE73l=L5!&aqM(*m5(|HV z)iV%;v}pp7s30U4wAhKR>wO0Xc4yA)-8uIxk1>Uh_=c;9Q&i}d}N5YtL6yu!Z14-@OV&0dS&h~paDL8xR!G$DF69%z_Ye}aZ ztGF2Q@K=`D!6FW@+>g{W!hbx&^FFnG$zUo;#C8K|D5AuuBw|IfXRTR>Eo?XB*P`dn z+8dErD2NjgIUX5_dn?zHx=rJ>-5co6%H?BvkJq@wk>o&_#0 + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Resources/UI/menu.png b/Resources/UI/menu.png new file mode 100644 index 0000000000000000000000000000000000000000..9c63469ba258c68e9c03b77117c79163a0c95e15 GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBufiR<}hF1enFw@h;F~q_@`Op9V_ROjcoL-Z8CDzC7tzv$` zRjM&x<-my(6~ZYFdKVaES4em=WE@D|7(7?`>)Gd|T6Tp@W%l|Nw4ObwHUMn;BxdM4g$vlnOpEoJa@^>bP0l+XkK DcE><1 literal 0 HcmV?d00001 diff --git a/Resources/UI/menu2.png b/Resources/UI/menu2.png new file mode 100644 index 0000000000000000000000000000000000000000..2530762417e8ccd4ab973f5e184c86ba65713679 GIT binary patch literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBufiR<}hF1enFu>ErF~q_@`Op9V_ROjcoL<2!c?^apB%eHx z?r~5O?pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10ij7m zK~y-6om0JPltC0d=MrqzO5kdSx+&3_!H6}Lu z1`a!Sku(W;0}b&5&CapNM814RT|CwN+1jj7FnNlIA6K0h}$zI{-FG_Cp9> zkLS_C-A_q+2H-A$F96mhZ2vZTIqB;-|9*+ z#+I2an%N^s1CrN|NRU!`nNs?ZQo7l+)P%dwx%$fHRWb)jZzHIo~-c(ahe2 z5LU}}i{uSMt(E_SDFC~r&j5g;u=?keLy){6Y1aU30GN$2wkB0|_tTQD0oXK>eUdX~ zwm2z)q$QHmB>Mn>l+p`#KXCWC3Dl2$BrAUIOBw)JODXkEvJ+!$rIdOA)+7zgYytRv zn4XfnCuxu5hn(~0a($8HRg%*==T~O7aBP?wPYjZ7OX`w52Y`~cNq!{xHiR&$$NvNo W{^Fg|2zLko0000?$b literal 0 HcmV?d00001 diff --git a/Resources/UI/minus2.png b/Resources/UI/minus2.png new file mode 100644 index 0000000000000000000000000000000000000000..9bb41283a7f3e8d7bdf81467b5391984bea3e424 GIT binary patch literal 380 zcmV-?0fYXDP)pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10SQS& zK~y-6ozqP&Ltzxg@gI>6wCuoCLc0!;h?>{~#$wuF&J`hI14vi^39BfHbP+^!LbHDi&}exebH)(CK42f-|p2KH8R>@rpHj$_iauf~A; zx<-2j3%Jb{HnCL#UE(g{4%Vjq|CJMI(kt9Z29rrctd0TKq#u!B!L;5BMXSiziR`#punlviDHSUVQ#Mw|)j a=Jf+%ay>&=(wun!0000JP)pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10s~1z zK~y-6jm|r06j2n1@$cMRnFxVkZ()QbOK!4hENom+Obmh&iNQ`K5eo_UXwrxxir84h zN1=tHRail=5yc1C1Qa2zbMHhYA~x}nLXikN?9LpUC=%nEQ=i|TPgvnqDwUS5uCBAd zA>dP<=Z8zB(oXBJi}*nlMSB6#G_3$zRrOqNZ}0nm4tVd6 z0VjZ|EX#(br>7gOt*tkKT_SSbId=-6WjP!|7y~ANXV%*7&bc4JRbW4G%Q-hHA`0+V zK?vc1s!jl}L}W*2XXio);WBU#xHCULKPn>muYXyB_W+Zs`c75LJv}|2z4zyVao~Ow zMT3PxA^p?*9!Qd8FwgVbzz1t>xmYaDdGAjHCsp-PTU*=Cj*gDn(qaP;$8let=aaz4 zEX(>9@loI;FlCI{y&MLRYPGu7TKiU2zlliMIX4?Z7*o|t!1E}I`U-`@_vJ8vHOBO- z>S_@ga?Z`haXg}`7lCS?=L5|!fDw^0P*>GC@BO$j<{I!i%d-Absr0oO2C%>;U={EZ zKvie0wcEP8yT8P7JR%|kP5c`Rq`(aDL{%RfV;&ZZ#RULk%obH0ZZa_Q6D^P6`U3HH QJpcdz07*qoM6N<$f>pN;+W-In literal 0 HcmV?d00001 diff --git a/Resources/UI/pencil_line2.png b/Resources/UI/pencil_line2.png new file mode 100644 index 0000000000000000000000000000000000000000..9c30d393819c421db6daf5fa652a5da4b312c156 GIT binary patch literal 394 zcmV;50d@X~P)pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10T)R` zK~y-6mD9f~#Zef?@z=$T@*@nCEM)g5SSU8iWRlsyWX8Z^BZHKiVp2?$jEXD_Zr!>T z!(GHE`8|9exrY0_*HdRWpFZz%p67Eq)L!*i!6R-l^bb}Ya`?g(9`JX)K13FcIKw;os=>qZ$l5c*P(VBq8R}RSTTK9s0|(qU5KQqMOka oz94SPV;vLz2DU31uhPnY1K7w)aW0U!9{>OV07*qoM6N<$f@;#Fi2wiq literal 0 HcmV?d00001 diff --git a/Resources/UI/plus.png b/Resources/UI/plus.png new file mode 100644 index 0000000000000000000000000000000000000000..f63ace902d9e993fbf04de2688e18f9c4648530e GIT binary patch literal 559 zcmV+~0?_@5P)pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10lY~> zK~y-6om0zdR6!6urwDGwONgnr%qKDk=bN2xg=>pQV+n{1b+cAA~_5p z#HK$F4l%}4lAZ&&3*ak&O-b7TK=M3*Ig&Gy-jI9{Lil-@AO&v#xJvR#RaL9qZudu% zsVIt;nJt^yV@YF@*AJ4w-Cw!;FL%G0OUfCsYmi00808y@&n012w~Fn{|yw|_65H@(}Ms2002ovPDHLkV1jc+^1c87 literal 0 HcmV?d00001 diff --git a/Resources/UI/plus2.png b/Resources/UI/plus2.png new file mode 100644 index 0000000000000000000000000000000000000000..0c29081e25aa7911ea1e9793e66094cb06efb9df GIT binary patch literal 398 zcmV;90df9`P)pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10UJp~ zK~y-6ozp!|LQxO};7KRYlk!JoJaAu%jMV?+z3 zuy_MJAMYjTNhY~>X3o7cbI)ZOHJqY{L0A_ZRI|x*sdYJ$_V9*V^dq*4Z7ksm2l$d9 zKjIrr%;!{AK?}pkEvJJQLEgzBX3>a4&PI+}IGQ=hyJ1-z1!tXPU@rw_--TsS!7JJ& z)FlJ^oT2;?K7vy(VcBHbqp}~uHo`{xbUS^ll>C0mf1!u#f>_ZE;0E0i?j<6r{Nd6C zY)RTul{`r+C$Z=mkApLo_IWrOGu%EUBqmZGN<@;^PQ^q(V<~4p(+T$RE*ai)#MZEh sMO@-g<};;HMH^3X&>+?wA>A~70F4SmZKJ&MYXATM07*qoM6N<$f>mIi`~Uy| literal 0 HcmV?d00001 diff --git a/Resources/UI/trash.png b/Resources/UI/trash.png new file mode 100644 index 0000000000000000000000000000000000000000..55e65525ddc861bd34825421f233b1589aa8733a GIT binary patch literal 382 zcmV-^0fGLBP)pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10Sie) zK~yM_?T)cZ!%!H7&$$VKIz+OFd#CFw_!<)3>f{5s2r9Vf;No0$5f>q&n=g>5TXNB* zv*Hp=KqZiSoLYhuN(VQ;`TNfQ6Fssl3#_%b#+W@x0{|fT1>nIscaWxOH*>>&Xsz8L zIr83LlKcPw@BKQ-BWvvwfNbV6&+|c&Bx`Nk20;)UO4^rX`-3E(N#1o`cNIlZS5?&~ z%d&h0u!+@p3ym?ml1?QJNnQZh05JU}4gtJNIw3hFc@6+5iel`Xn=CuyoSPIyF$Ms$ z;)`?s!#@qZ_gp6Toe%&>z5p0G=guU3FN!1$NN!2GpNDl_U&nF0E$J9Qv?wIm0(fki c<^}+M0F=gWXpb8FNB{r;07*qoM6N<$f^I65pa1{> literal 0 HcmV?d00001 diff --git a/Resources/UI/trash2.png b/Resources/UI/trash2.png new file mode 100644 index 0000000000000000000000000000000000000000..1ae8d4397a12014956b526440cb2e4675e781690 GIT binary patch literal 289 zcmeAS@N?(olHy`uVBq!ia0vp^d_XL~!3HGNrubO_Db50q$YP-QVGw3Kp1&dmC@5Lt z8c`CQpH@mmtT}V`<;yxP|-S17sn8diEl62@;Md?uzZ-` z|17gaZ^7k4hUFK$W1JipEff&H5TIe%c#cuVVezzp%oZn&Kb-nUvP;x%rlqHqcRdu9 z>?u5;dWLcF0ow_^lG!U3_t)Nddhv+N<@Ds1m>m(v_?mAVWYdaxAQN=M=BSs|Y>`zN zi#z1FB97aMZFJQxxNB{Ak`$T(tQF+0igsy-?D*NU< hd{S)h?2?7 z8z9Vhe8JAOKtah8*NBqf{Irtt#G+J&^73-M%)IR4&N6MaqQ#$uCTIc3pm3!#0c54wFS?(P{?4_+4+&h>{xL?#&b~*j*m=H3)dVy zr?%nDy91N=%$!^PtoE6`{Op@o8TLlK;}Nfzc0svon#6LReTDKT`I`@_r4?=ZTHCjN z8tbtciI-9)T;kH7@krBbA;*r|J#8-@vt{pozR|KRVcniiog=Xs2Q!x>G+typ*2}W9 z_KDJyPrsf>985p(=E|q~#5Y>51yhn(u2*#T{C)IIpt=0%O7oS4-1aZFiG;nan&{T=YSq%@O1TaS?83{1OSS;lY9UG literal 0 HcmV?d00001 diff --git a/Resources/folder.png b/Resources/folder.png new file mode 100644 index 0000000000000000000000000000000000000000..d3ea8ab73eb0048f4a0116cf8847e72ccceae9a2 GIT binary patch literal 303 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!6Tk7jv*HQ$$$R;w`W#u;Pjfzdw|Wr$jEKu z=FRmCm;NWtm^}G2$AmPt)rXi5#3dvr{|qlMz#DMi*??P$?SJ{ZJDe#>2X1Z6{%>q-{Ga(`;$a;fom_`h2Qfb84~<8=#hZEl zGp0-u??_5Y;;H}tFO_}cN@4CP4T%X1+#Lz2sefypoDhslOibLMpjhzZL*j&a{t0{< vdW{M~GoLgM;#R?gdyVIMd3YGI>?dtfW(=|e`iH^O)z4*}Q$iB}%dK-b literal 0 HcmV?d00001 diff --git a/Resources/folder_32.png b/Resources/folder_32.png new file mode 100644 index 0000000000000000000000000000000000000000..832fd3c9b04b64cf590032b045d45050e033aaef GIT binary patch literal 601 zcmV-f0;c_mP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!TVrcG=30_DO16O;x4pyeRIh||EuJw0C;nEs~%ng4;9jfsKj03*ZyyTst1 z|G$4o$tXXYlvQp6HVg`o9Y7SAJGE;sFpg$JxugK*|BMVqjQ<(-r({+bL&ZpU00?~M z_+0>WL?JLBI*G+V^|OFl{{S(|KZgIUV1s}FISqh<6$Efwd;%=Kl=;UO;511Aq-$Ng(9|Vgenqe$KScAc!~=q-IyD z{rmS1)Yj*Qh|mmtWnyA7nmx7s7Kj6HmY+L)% literal 0 HcmV?d00001 diff --git a/Resources/folder_explore.png b/Resources/folder_explore.png new file mode 100644 index 0000000000000000000000000000000000000000..6fdc0bb59530c1b7e3bfd9d9eb51847eaca22409 GIT binary patch literal 322 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!Rwwbjv*HQ$$$R;w`W#u;Pjfzdw|Wr$jEKu zX2W`hOaBvROm2S4F(Hj@^&#d1aS6$(|3aoMJpcNw4!_u+Z-4on6JDLWKY#zfcg#iM z&8&e3r5EgLPY^TV`IkTQ{m=i$--=ko8D4#AZ!G-Seu9kInL~%JuwCLVV?1%vfmtFZ zXGvpG%fU~*- zL8jT|_9-uBmVUgv{(k+>L{7~~y;EP>PB`XaaKj)Z*TP0IkV%7wnT?Ghu_-SiweWg3 P(2ES7u6{1-oD!M<+8})0 literal 0 HcmV?d00001 diff --git a/Resources/hexagon.png b/Resources/hexagon.png new file mode 100644 index 0000000000000000000000000000000000000000..01e6fdb67ccd2a9ed424443a14bcd6d8a8d0ba53 GIT binary patch literal 313 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf2?7 z8z9Vhe8JAOKtah8*NBqf{Irtt#G+J&^73-M%)IR4Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!TM5@V(vBy06gh#SCn!Re04uR-KxwohL*PApgR+f zrj7KUOn8Hn2u=(>tlM;X=VzHXhI#D4_;!W3py}0MU}hXKj!~R&?oY=f>tB72PltNB wTnVs3{n)7GQ?5qa_(;1m>16cWkZK&F58rczF09|kUjP6A07*qoM6N<$f`0zlMF0Q* literal 0 HcmV?d00001 diff --git a/Resources/toggle-right-ea-16.png b/Resources/toggle-right-ea-16.png new file mode 100644 index 0000000000000000000000000000000000000000..aedd7c2f94120ca876963df3b9500d46e6f058f4 GIT binary patch literal 502 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!TL0F?FR`V=ECyHf# zC!0Dmf>$6COU#i-nwj>IP!QrLqx)f!Cb%(JSV$J~+0+JGb|Q$4V_}KrGbz{0^f75C zx;4oV3E#ZFT<CMeKqm}$0;P4b~%Obpjb;62m&2=NUkMDbk zYZVCvi1`qUUyx;CUUjohSE+{jAq?L?y$6Kp0C7NhIe)-{bf7-T%P*Cb7;jLRjG1P* zysSnut-vis?D!=sDx%s^du#1EW?;^oDb~D(Hp5md9`#Q6$Y-2wt#l8r+(jefZB6yz zyT^}7Y=toRHLo?xUYup(H0E)Lrz~jV2c!GJz*_Lcct#1K^LaPpY<_>FiJ4?Cm-GVK s96+JwitNV}J~e;F&805N(m#jj3n7Dw9b#Vt6#xJL07*qoM6N<$f{}0FssI20 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..4f54144bddb2a7c0e2d747116293d9137e014bf1 GIT binary patch literal 7886 zcmds6dr(tn7Qd|Bb$4fH+TH2wbYG*p(?53Cv9*%iBqSjTuaJaC0)&TPK|~NyDacb0 zP<&vO(uXMO_^NM3q`s|IsZ|SNP;0?w6-BKI78DhNz}a&y+;B;PtJChz&fb~B_uZTO zo!`0V^_}yf)$C1pI*BFLn80L*P`tFN<#W2_K*=tDj`{Y*`CjO5M^LKm) zmoRE1dj9`#jU78y>nfGq6S*lXaUSLB>iYVB>$}E^#gn9Rg;lp?6L>Bt1F0$OsjEob zBXU=L<0=+sqb#HUL$bJtrP4xAU!67O=y@<-=zySxJ~Gza1>d#%KshC&LnL$S63G?! z#ZtG`D2sX2s8PT9vGO2~Ux;P$t$yKAo!OR~F!gGu4V#z2Hh%jA43#yY$t!*)(Hb7R zvTT<~p*(@IBugZcKfkOjGMVgm5{0rReAOCMehIXN^6h2QEB9Vx7b62${magfZb-k0rrf;8o1$AHl6r}EI(689>(lU^Ke3otl zvC_R}D15Y)QSPqloVsOyFJTIa*S$8-1T%7Gf$qI*Fx5R6QV!GkcFK-UB}72=Lo`*2bSObz6>t zAuS)YK_MV>SApr=L)-79KUS&gz}z7f;Jb*VZgbVX`i|`CE0AaR-Go0);P?7|e3IeD zjT;ag^)C3%D+PU89%zHjkhkD{sH>~v$dH;lfZZ>@B5vAK)N>k-FLG1tQJc(9bI#p? zf*V$+__3D<;!cQ9GFYuv*sy6chu727Lyx#CZ~j8iqb_*e^P~3%>j3k_As%0>P<|I* zc?=3~T46Tg=OYR2PV)#s+}Y#vc*2q7AYC|%6~Db_0CRXd;=7OxB8hBy_@c7zq40AN zpSQjLp$5!qzI_ZLsjTarci#CYhc6OEXrm@P9tuB`;vW4* zSF#QQ$3?;A%a@&E3Lj<`6oS6|gmZlK19?QuWAwpz!hieixBnz&*`9(ckDTg1srDvl zV<*G>;u6l*LY$%IbKYMJ`VZF)iSIdYX|F5hb;74h>?XgLdgQDFe*A_#;2#=pW7=DEAz8DNCygvn6(*)C{pZFPz@ z)WfExCeWJ0fpRbJ`}}A;^8?V{jd}hrBm?H$1bxD^CxmYwgYm~Mf$!o~pdCLE%oE~Z z<(jo{`}XajU~O%JajkFPp>=`P zcfhx-9P}7ly}iAIu-e+%fc#!a7K;TErzeBHc$I?=R5OcuF!ss_A1@b*$+VM~9q=jl z@-p+IAvp``>+5a!6z`F7@nFbZ2!69m1}JAf1Y{M0Vc~KI9#pqr?z!3rk2b)ZG-1t7 z4&Ocpg$rsPl7aTp;!jF#_@ygWf}!wZ2Mk_b`!V3lYarDJJf+;r<6}Ig`=`$A5c(jW z2jgk)?a$vd8gbwA4+HSc!FW&&KJV=S-QPfB#~NC&tW{K{U}zr*G}Agz$tzX$`B^- z1LLWC;4{DU-(zF$_ME$<8?hhZH!AEgh4)mOxrat}#aC3p%nPj!`(Qf8qOkt9*RTD( z>1-P)CM9>G&Ks$w6k<7>Q*BBzpkH2~JwZ1yu{~zhj^6az8#Y-;2B9A8G5Pzz>hHlV zB(g&+SDvC;+8N&Sp1t+fTffKr^sY$hzDLALI#dS#C!upoo+a(AhHR{f$sg=}lE)6H zx(X5>!&CI}U5Jex>W{nBYV|Kse_pOq>0*&g(ZtGR&kR%3I>Xm|2I1AWAVd(GhFzzz z##ME?N~EQT`m-O0?0hx)(P*SB>_h8BVsW=TD6HMPXnC*qM;o}>0%e`#eC1F76yMM+j0^NKjH;VqhIb;hAvH40uqq^GfT(V>Q31}87$H^R zeLvCK;f)OQD$)of;++o#3_#~F1RV}^PVolP7^MH@a|+ho{awsY4_GhXy|izS9zFWE zDDqEoiB+E2#>AAi;M4cHe#UFT^2ah$=zUh>eGM^-(59{k#MR3$1Bh|+ip*QPX~O)H z_S7o_eHb67lq0muD|!?Y5}R31pF7yM??8Wgp|gWAW5&Fu(CREx)>U*k+aGugexyE3 zzwH>P(+k^JZ(TF%W!b-K^nQ)0`%XS1-jw@;F^?NQSOe7K@jRb5dVjL1 zmsM%z*)vDmv0nbhd+EpOZ9VRL-}UY9!Q-PLA|(?7F@M?fraqSIHBk=wEuiWTl>8~g372J`Gi5T8>3I;>ZP z{W9y}-9k1b46#a+ZJ03mVg7|59C}24KOp}6wRvYHOv=oKEjUtb*wWGh!3B#3eU~CO zskz^`7_qy$c~*Z9BJ6>M_1_c$e;$V)S7Q%qU+;T=wDB41rpzGuCEnV7Gmc+$=rK~S z_37TYsuGHpEaTZZj4|ms4t2Eu!Eez9zQ>3^)-ID{S8cc2*KhH4cOfJrAIkB(V5p1w z71OjCgLK2$A8jpGdp09`7u3@~0+VL62>DN~I06Y-xp42^y`fm!o^Po{doSPafFX~F zz26@PE^>^E*@F5nVZ~;M$;yMg#UH|{+FI!D?zZuBHp!Y-1c6vz3VqjW;R-9Btt60+ zP*-1Np1MA$zM6t(8+48sh;>}ZjG1us_=!QR@7}!&w{G2nhYue@b8|CN#klTMo%AHZ74TSuJbFZQmPsD1E)3kR8c{-b; zEx4MG_4X-~`S>;&;*uW3uC44&vV1@2Jc{FwxmlHx_Ym`Cg|o9oXZ-D-QGG6wE7MsI zpR?}%K@YTf#gF{Tk8{2*kDSEy2|kc0S^44F-({%Oy=O zldtJyUe&ZQ!!(UZRY(Pliv~p#5QFnRD!_4oT)6kEnBh1Qj}aPRR2pam4Q<3^l#xg; zTZc*fOeJCK zR3189)H{2Gjo*>-dF@l7Z}a{}`>3JvRF5iSUXwgLrkd=_GkNpPH-~$Ti$0Wgtf7ly zgFD+!&H&?yCa1pZhv$wmKVvqnC);^N#h%KrH1*J0KL0G)xD`s)Zvk_~aWG-*PF}Vi z!ltM7?dQ0U$U~#{(|V7Hn6tSJEw=oa+@BvyH*e?i;z>&#oNu_m&6CR3+vHKkO+QEL zbyHGnX%FJ#n_@0_|5@0&@1QNO(&Sp>4G7s*Wm~VwFS(7e`v+NY#Mb<)?cDm@YaK9Y zRXOZBQZ;BT-F#hl2FyE8+SVJ&Pxgq_K9Ld+?f8_c^F4G%Fm2mG$SwW|8ZKUPSWgd% zR&M}Pe~u*EBK9V-XH4m*_xUr1i5Ib+syG4h3rc`Lzdmu=0_6ujht0e9LOAAg-lmF} z#IH#QrnFi0{CfU>QbyeOsx4>0a=sqIHXh*4{iwbTJbsf~Z^W}RSx|T#tye|H9?Zvm zmh6|spRJ&c3RkX$gwnM(JRTQwd9TbIX+iyQ|8JD~8FSMFJ$YPzeP=G)3PwxIp!J45 zbzM?Z=n-7|Yr>|Bd{Hw#t|p>r>7C>+>w9w04#GW#$MxNK_%WUnZWEpp^>OI?OMSgW zXNXmgkNZ3*d(L(9hJzg;XZrppxqT*@^CNDNO5&IMF}bB^e}Vda{}SIafsBg!@Z0x?rQ4*&oF literal 0 HcmV?d00001 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 +