From 050bff5a0062997f752c10ff55c97476655fcbf6 Mon Sep 17 00:00:00 2001 From: Ray Date: Tue, 16 Apr 2019 21:57:31 +0100 Subject: [PATCH 01/34] WIP: rebuild with json, model and viewmodel --- BookmarkEditForm.cs | 14 +- BookmarkTreeView.cs | 246 +++- IconDatabase.cs | 24 +- MainForm.Designer.cs | 1257 +++++++++-------- MainForm.cs | 116 +- MainForm.resx | 35 +- Models/BookmarkItemModel.cs | 314 ++++ RyzStudio/String.cs | 36 - RyzStudio/Windows/Forms/MovableTreeView.cs | 532 +++---- .../Forms/MovableTreeViewSelectedNode.cs | 194 +++ SessionFileFormat.cs | 24 +- UpdateIconForm.cs | 2 +- ViewModels/BookmarkItemViewModel.cs | 44 + bomg.csproj | 8 +- 14 files changed, 1741 insertions(+), 1105 deletions(-) create mode 100644 Models/BookmarkItemModel.cs delete mode 100644 RyzStudio/String.cs create mode 100644 RyzStudio/Windows/Forms/MovableTreeViewSelectedNode.cs create mode 100644 ViewModels/BookmarkItemViewModel.cs diff --git a/BookmarkEditForm.cs b/BookmarkEditForm.cs index a707cd9..133fc99 100644 --- a/BookmarkEditForm.cs +++ b/BookmarkEditForm.cs @@ -8,7 +8,7 @@ namespace bzit.bomg { private TreeNode parentNode = null; private BookmarkItem bookmarkItem; - private bool isWorking = false; + private bool isWorking = false; public BookmarkEditForm(ref TreeNode node) { @@ -61,7 +61,7 @@ namespace bzit.bomg if (this.IsWorking) { e.Cancel = true; - } + } } public bool IsWorking @@ -136,7 +136,7 @@ namespace bzit.bomg BookmarkTreeView bookmarkTreeView = (BookmarkTreeView)parentNode.TreeView; if (bookmarkTreeView != null) { - parentNode.ImageIndex = parentNode.SelectedImageIndex = bookmarkTreeView.AddToIconList(bookmarkItem); + //##parentNode.ImageIndex = parentNode.SelectedImageIndex = bookmarkTreeView.AddToIconList(bookmarkItem); } this.Close(); @@ -154,7 +154,7 @@ namespace bzit.bomg // don't replace with blank if (!string.IsNullOrEmpty(sender.Description)) - { + { bookmarkItem.Description = sender.Description; } } @@ -171,15 +171,15 @@ namespace bzit.bomg bookmarkItem.Description = sender.Description; } } - + // don't replace with blank if (sender.IconData != null) { bookmarkItem.IconData = sender.IconData; } - + tbxDescription.Text = bookmarkItem.Description; - pbxIcon.Image = (bookmarkItem.Icon == null) ? parentNode.TreeView.ImageList.Images[3] : bookmarkItem.Icon; + pbxIcon.Image = (bookmarkItem.Icon == null) ? parentNode.TreeView.ImageList.Images[3] : bookmarkItem.Icon; if (hasError) { diff --git a/BookmarkTreeView.cs b/BookmarkTreeView.cs index 6847b7d..ba4819f 100644 --- a/BookmarkTreeView.cs +++ b/BookmarkTreeView.cs @@ -1,125 +1,219 @@ +using bzit.bomg.Models; using System; using System.ComponentModel; using System.Drawing; +using System.IO; using System.Windows.Forms; namespace bzit.bomg { public partial class BookmarkTreeView : RyzStudio.Windows.Forms.MovableTreeView { - protected ImageList iconList = null; + protected IconDatabase iconDatabase = null; public BookmarkTreeView() { InitializeComponent(); - this.iconList = new ImageList(); - this.iconList.ColorDepth = ColorDepth.Depth16Bit; - this.iconList.ImageSize = new Size(16, 16); - this.iconList.TransparentColor = Color.Transparent; + if (this.ImageList == null) + { + this.ImageList = new ImageList(); + } - this.iconList.Images.Clear(); - this.iconList.Images.Add(Properties.Resources.transmit_blue); - this.iconList.Images.Add(Properties.Resources.folder); - this.iconList.Images.Add(Properties.Resources.folder_explore); -//// this.iconList.Images.Add(Properties.Resources.page_white_gray_green); - this.iconList.Images.Add(Properties.Resources.page_white_world_bw); + this.ImageList.ColorDepth = ColorDepth.Depth16Bit; + this.ImageList.ImageSize = new Size(16, 16); + this.ImageList.TransparentColor = Color.Transparent; - this.ImageList = this.iconList; + this.ImageList.Images.Clear(); + this.ImageList.Images.Add(Properties.Resources.transmit_blue); + this.ImageList.Images.Add(Properties.Resources.folder); + this.ImageList.Images.Add(Properties.Resources.folder_explore); + this.ImageList.Images.Add(Properties.Resources.page_white_world_bw); } - #region encapsulation + [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public new ImageList ImageList { get => base.ImageList; set => base.ImageList = value; } - [Browsable(false)] - public new ImageList ImageList + protected override void OnPreviewKeyDown(PreviewKeyDownEventArgs e) { - get { return base.ImageList; } - set { base.ImageList = value; } - } + base.OnPreviewKeyDown(e); - #endregion - - #region public properties - - [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), DefaultValue(null)] - public IconDatabase IconDatabase { get; set; } - - #endregion - - #region integrated behaviour - - protected override void OnAddItemNode(TreeNode node) - { - base.OnAddItemNode(node); - - BookmarkItem bi = new BookmarkItem(); - node.Tag = bi; - } - - #endregion - - public void AddBookmarkItem(string name, BookmarkItem tag) - { - if (this.Nodes.Count <= 0) + TreeNode tn = this.SelectedNode; + if (tn == null) { return; } - - TreeNode tn = AddBookmarkPageFullPath(name.Trim(), 3); - tn.Tag = tag; - tn.ToolTipText = tag.SiteAddress + Environment.NewLine + tag.Description; - // load icon - if (this.IconDatabase.HasIcon(tag.SiteAddress)) + switch (e.KeyCode) { - try - { - Image icon = this.IconDatabase.GetIcon(tag.SiteAddress); - if (icon != null) + case Keys.Insert: + if (e.Modifiers == Keys.Shift) { - tn.TreeView.ImageList.Images.Add(tag.SiteAddress, icon); - tn.ImageKey = tn.SelectedImageKey = tag.SiteAddress; + // do nothing } - } - catch - { - // do nothing - } + else + { + MessageBox.Show("!"); + //AddBookmarkPage(); + } + + break; + + default: break; } } - public int AddToIconList(BookmarkItem sender) + public bool InitialiseIconDatabase(out string message, string filename) { - Image rs = null; - if (this.IconDatabase.HasIcon(sender.SiteAddress)) + message = string.Empty; + + if (string.IsNullOrWhiteSpace(filename)) { - rs = this.IconDatabase.GetIcon(sender.SiteAddress); + 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 { - if (this.IconDatabase.AddIcon(sender.SiteAddress, sender.IconData)) + rv = iconDatabase.Create(filename, true, null, true); + if (!rv) { - rs = sender.Icon; + message = iconDatabase.LastError; + return false; } } - if (rs != null) - { - this.ImageList.Images.Add(sender.SiteAddress, rs); - return this.ImageList.Images.IndexOfKey(sender.SiteAddress); - } - - return 3; + return true; } - public void AddIcon(BookmarkItem sender) - { - if (this.IconDatabase.HasIcon(sender.SiteAddress)) + 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); + + tn2.Nodes.Add(tn); + } + + public void AddItem_OnSelectedNode(BookmarkItemViewModel viewModel) + { + if (this.SelectedNode == null) { return; } - this.IconDatabase.AddIcon(sender.SiteAddress, sender.IconData); + if (this.SelectedNode.Tag != null) + { + return; + } + + int iconIndex = addIcon(viewModel); + + TreeNode tn = new TreeNode(viewModel.SiteName, iconIndex, iconIndex); + tn.Tag = viewModel; + tn.ToolTipText = viewModel.ToString(); + + int n = this.SelectedNode.Nodes.Add(tn); + + this.SelectedNode = this.SelectedNode.Nodes[n]; + } + + protected int addIcon(BookmarkItemViewModel viewModel) => addIcon(viewModel.ToModel()); + + protected int addIcon(BookmarkItemModel model) + { + 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.ImageList.Images.Add(model.SiteAddress, rs); + + return this.ImageList.Images.IndexOfKey(model.SiteAddress); + } + } + + Bitmap bmp = model.RetrieveFavicon(); + if (bmp == null) + { + return (int)IconSet.Default; + } + + this.ImageList.Images.Add(model.SiteAddress, bmp); + + return this.ImageList.Images.IndexOfKey(model.SiteAddress); + } + + protected TreeNode addFolderPath(string path) + { + 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; + } + + foreach (string item in folderList) + { + if (tn.Nodes.ContainsKey(item)) + { + // do nothing + } + else + { + tn.Nodes.Add(item, item, (int)IconSet.Folder1, (int)IconSet.Folder2); + } + + tn = tn.Nodes[item]; + } + + return tn; } } } \ No newline at end of file diff --git a/IconDatabase.cs b/IconDatabase.cs index e1c7a63..8919058 100644 --- a/IconDatabase.cs +++ b/IconDatabase.cs @@ -18,7 +18,7 @@ namespace bzit.bomg { return false; } - + return this.DoNonQuery(@" CREATE TABLE bzt_app_bomg_icons ( @@ -29,7 +29,7 @@ namespace bzit.bomg ) ") >= 0; } - + #region public methods public bool HasIcon(string url) @@ -48,7 +48,7 @@ namespace bzit.bomg { return false; } - + if (this.HasIcon(url)) { return this.DoNonQuery("UPDATE bzt_app_bomg_icons SET='" + imageToSQLString(image) + "' WHERE ico_key='" + SQLiteDatabase2.escapeValue(url) + "';") >= 0; @@ -70,7 +70,7 @@ namespace bzit.bomg { return false; } - + if (this.HasIcon(url)) { return this.DoNonQuery("UPDATE bzt_app_bomg_icons SET='" + bytesToSQLString(image) + "' WHERE ico_key='" + escapeValue(url) + "';") >= 0; @@ -87,7 +87,7 @@ namespace bzit.bomg { return null; } - + string rs = this.DoQuerySingle("SELECT ico_content FROM bzt_app_bomg_icons WHERE ico_key='" + escapeValue(url) + "'"); return sqlStringToImage(rs); } @@ -98,20 +98,20 @@ namespace bzit.bomg { return; } - + this.DoNonQuery("DELETE FROM bzt_app_bomg_icons WHERE ico_key='" + escapeValue(url) + "';"); } - + #endregion - + protected string imageToSQLString(Image image) { MemoryStream stream = new MemoryStream(); image.Save(stream, new System.Drawing.Imaging.ImageFormat(image.RawFormat.Guid)); stream.Close(); - + byte[] byteArray = stream.ToArray(); - + return bytesToSQLString(byteArray); } @@ -121,12 +121,12 @@ namespace bzit.bomg } protected Image sqlStringToImage(string base64_string) - { + { byte[] byteArray2 = Convert.FromBase64String(base64_string); MemoryStream stream2 = new MemoryStream(); stream2.Write(byteArray2, 0, byteArray2.Length); - + Image displayImage = Image.FromStream(stream2); return displayImage; } diff --git a/MainForm.Designer.cs b/MainForm.Designer.cs index aa7c313..ba16784 100644 --- a/MainForm.Designer.cs +++ b/MainForm.Designer.cs @@ -28,88 +28,89 @@ namespace bzit.bomg /// private void InitializeComponent() { - this.components = new System.ComponentModel.Container(); - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); - this.treeMenuItem = new System.Windows.Forms.ContextMenuStrip(this.components); - this.toolStripMenuItem4 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); - this.toolStripMenuItem8 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem6 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); - this.listViewMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.moveFileToToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.statusBar1 = new System.Windows.Forms.StatusBar(); - this.statusBarPanel1 = new System.Windows.Forms.StatusBarPanel(); - this.statusBarPanel2 = new System.Windows.Forms.StatusBarPanel(); - this.oToolTip1 = new System.Windows.Forms.ToolTip(this.components); - this.imageList1 = new System.Windows.Forms.ImageList(this.components); - this.toolStrip1 = new System.Windows.Forms.ToolStrip(); - this.toolStripDropDownButton1 = new System.Windows.Forms.ToolStripDropDownButton(); - this.newFileMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.openFileMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); - this.closeFileMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); - this.saveFileMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.saveAsFileMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator(); - this.exportFileMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator(); - this.exitFileMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripDropDownButton2 = new System.Windows.Forms.ToolStripDropDownButton(); - this.findEditMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripDropDownButton3 = new System.Windows.Forms.ToolStripDropDownButton(); - this.expandAllViewMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.collapseAllViewMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripDropDownButton4 = new System.Windows.Forms.ToolStripDropDownButton(); - this.updateIconsToolMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator14 = new System.Windows.Forms.ToolStripSeparator(); - this.optionsToolMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripDropDownButton5 = new System.Windows.Forms.ToolStripDropDownButton(); - this.viewHelpHelpMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator12 = new System.Windows.Forms.ToolStripSeparator(); - this.aboutHelpMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripDropDownButton7 = new System.Windows.Forms.ToolStripDropDownButton(); - this.alwaysOnTopToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.openFileDialog = new System.Windows.Forms.OpenFileDialog(); - this.treeMenuFolder = new System.Windows.Forms.ContextMenuStrip(this.components); - this.toolStripMenuItem15 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem16 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator(); - this.toolStripMenuItem14 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem9 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem11 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator(); - this.sortToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator11 = new System.Windows.Forms.ToolStripSeparator(); - this.toolStripMenuItem12 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem13 = new System.Windows.Forms.ToolStripMenuItem(); - this.saveFileDialog = new System.Windows.Forms.SaveFileDialog(); - this.toolStrip2 = new System.Windows.Forms.ToolStrip(); - this.newMenuBarItem = new System.Windows.Forms.ToolStripButton(); - this.openMenuBarItem = new System.Windows.Forms.ToolStripButton(); - this.saveMenuBarItem = new System.Windows.Forms.ToolStripButton(); - this.toolStripSeparator9 = new System.Windows.Forms.ToolStripSeparator(); - this.treeMenuRoot = new System.Windows.Forms.ContextMenuStrip(this.components); - this.toolStripMenuItem17 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem18 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator10 = new System.Windows.Forms.ToolStripSeparator(); - this.toolStripMenuItem20 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator13 = new System.Windows.Forms.ToolStripSeparator(); - this.toolStripMenuItem22 = new System.Windows.Forms.ToolStripMenuItem(); - this.treeView1 = new bzit.bomg.BookmarkTreeView(); - this.treeMenuItem.SuspendLayout(); - ((System.ComponentModel.ISupportInitialize)(this.statusBarPanel1)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.statusBarPanel2)).BeginInit(); - this.toolStrip1.SuspendLayout(); - this.treeMenuFolder.SuspendLayout(); - this.toolStrip2.SuspendLayout(); - this.treeMenuRoot.SuspendLayout(); - this.SuspendLayout(); - // - // treeMenuItem - // - this.treeMenuItem.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); + this.treeMenuItem = new System.Windows.Forms.ContextMenuStrip(this.components); + this.toolStripMenuItem4 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripMenuItem8 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem6 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.listViewMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.moveFileToToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.statusBar1 = new System.Windows.Forms.StatusBar(); + this.statusBarPanel1 = new System.Windows.Forms.StatusBarPanel(); + this.statusBarPanel2 = new System.Windows.Forms.StatusBarPanel(); + this.oToolTip1 = new System.Windows.Forms.ToolTip(this.components); + this.imageList1 = new System.Windows.Forms.ImageList(this.components); + this.toolStrip1 = new System.Windows.Forms.ToolStrip(); + this.toolStripDropDownButton1 = new System.Windows.Forms.ToolStripDropDownButton(); + this.newFileMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.openFileMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.closeFileMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); + this.saveFileMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.saveAsFileMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator(); + this.exportFileMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator(); + this.exitFileMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripDropDownButton2 = new System.Windows.Forms.ToolStripDropDownButton(); + this.findEditMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripDropDownButton3 = new System.Windows.Forms.ToolStripDropDownButton(); + this.expandAllViewMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.collapseAllViewMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripDropDownButton4 = new System.Windows.Forms.ToolStripDropDownButton(); + this.updateIconsToolMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator14 = new System.Windows.Forms.ToolStripSeparator(); + this.optionsToolMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripDropDownButton5 = new System.Windows.Forms.ToolStripDropDownButton(); + this.viewHelpHelpMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator12 = new System.Windows.Forms.ToolStripSeparator(); + this.aboutHelpMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripDropDownButton7 = new System.Windows.Forms.ToolStripDropDownButton(); + this.alwaysOnTopToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.openFileDialog = new System.Windows.Forms.OpenFileDialog(); + this.treeMenuFolder = new System.Windows.Forms.ContextMenuStrip(this.components); + this.toolStripMenuItem15 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem16 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripMenuItem14 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem9 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem11 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator(); + this.sortToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator11 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripMenuItem12 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem13 = new System.Windows.Forms.ToolStripMenuItem(); + this.saveFileDialog = new System.Windows.Forms.SaveFileDialog(); + this.toolStrip2 = new System.Windows.Forms.ToolStrip(); + this.newMenuBarItem = new System.Windows.Forms.ToolStripButton(); + this.openMenuBarItem = new System.Windows.Forms.ToolStripButton(); + this.saveMenuBarItem = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator9 = new System.Windows.Forms.ToolStripSeparator(); + this.treeMenuRoot = new System.Windows.Forms.ContextMenuStrip(this.components); + this.toolStripMenuItem17 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem18 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator10 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripMenuItem20 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator13 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripMenuItem22 = new System.Windows.Forms.ToolStripMenuItem(); + this.treeView1 = new bzit.bomg.BookmarkTreeView(); + this.toolStripButton1 = new System.Windows.Forms.ToolStripButton(); + this.treeMenuItem.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.statusBarPanel1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.statusBarPanel2)).BeginInit(); + this.toolStrip1.SuspendLayout(); + this.treeMenuFolder.SuspendLayout(); + this.toolStrip2.SuspendLayout(); + this.treeMenuRoot.SuspendLayout(); + this.SuspendLayout(); + // + // treeMenuItem + // + this.treeMenuItem.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.toolStripMenuItem4, this.toolStripSeparator3, this.toolStripMenuItem8, @@ -117,113 +118,113 @@ namespace bzit.bomg this.toolStripSeparator2, this.listViewMenuItem1, this.moveFileToToolStripMenuItem}); - this.treeMenuItem.Name = "listViewMenu"; - this.treeMenuItem.Size = new System.Drawing.Size(139, 126); - // - // toolStripMenuItem4 - // - this.toolStripMenuItem4.Name = "toolStripMenuItem4"; - this.toolStripMenuItem4.Size = new System.Drawing.Size(138, 22); - this.toolStripMenuItem4.Text = "&Open"; - this.toolStripMenuItem4.Click += new System.EventHandler(this.toolStripMenuItem4_Click); - // - // toolStripSeparator3 - // - this.toolStripSeparator3.Name = "toolStripSeparator3"; - this.toolStripSeparator3.Size = new System.Drawing.Size(135, 6); - // - // toolStripMenuItem8 - // - this.toolStripMenuItem8.Name = "toolStripMenuItem8"; - this.toolStripMenuItem8.Size = new System.Drawing.Size(138, 22); - this.toolStripMenuItem8.Text = "E&dit"; - this.toolStripMenuItem8.Click += new System.EventHandler(this.toolStripMenuItem8_Click); - // - // toolStripMenuItem6 - // - this.toolStripMenuItem6.Name = "toolStripMenuItem6"; - this.toolStripMenuItem6.Size = new System.Drawing.Size(138, 22); - this.toolStripMenuItem6.Text = "D&elete"; - this.toolStripMenuItem6.Click += new System.EventHandler(this.toolStripMenuItem6_Click); - // - // toolStripSeparator2 - // - this.toolStripSeparator2.Name = "toolStripSeparator2"; - this.toolStripSeparator2.Size = new System.Drawing.Size(135, 6); - // - // listViewMenuItem1 - // - this.listViewMenuItem1.Name = "listViewMenuItem1"; - this.listViewMenuItem1.Size = new System.Drawing.Size(138, 22); - this.listViewMenuItem1.Text = "Move &Up"; - this.listViewMenuItem1.Click += new System.EventHandler(this.toolStripMenuItem12_Click); - // - // moveFileToToolStripMenuItem - // - this.moveFileToToolStripMenuItem.Name = "moveFileToToolStripMenuItem"; - this.moveFileToToolStripMenuItem.Size = new System.Drawing.Size(138, 22); - this.moveFileToToolStripMenuItem.Text = "Move &Down"; - this.moveFileToToolStripMenuItem.Click += new System.EventHandler(this.toolStripMenuItem13_Click); - // - // statusBar1 - // - this.statusBar1.Font = new System.Drawing.Font("Verdana", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.statusBar1.Location = new System.Drawing.Point(0, 634); - this.statusBar1.Name = "statusBar1"; - this.statusBar1.Panels.AddRange(new System.Windows.Forms.StatusBarPanel[] { + this.treeMenuItem.Name = "listViewMenu"; + this.treeMenuItem.Size = new System.Drawing.Size(139, 126); + // + // toolStripMenuItem4 + // + this.toolStripMenuItem4.Name = "toolStripMenuItem4"; + this.toolStripMenuItem4.Size = new System.Drawing.Size(138, 22); + this.toolStripMenuItem4.Text = "&Open"; + this.toolStripMenuItem4.Click += new System.EventHandler(this.toolStripMenuItem4_Click); + // + // toolStripSeparator3 + // + this.toolStripSeparator3.Name = "toolStripSeparator3"; + this.toolStripSeparator3.Size = new System.Drawing.Size(135, 6); + // + // toolStripMenuItem8 + // + this.toolStripMenuItem8.Name = "toolStripMenuItem8"; + this.toolStripMenuItem8.Size = new System.Drawing.Size(138, 22); + this.toolStripMenuItem8.Text = "E&dit"; + this.toolStripMenuItem8.Click += new System.EventHandler(this.toolStripMenuItem8_Click); + // + // toolStripMenuItem6 + // + this.toolStripMenuItem6.Name = "toolStripMenuItem6"; + this.toolStripMenuItem6.Size = new System.Drawing.Size(138, 22); + this.toolStripMenuItem6.Text = "D&elete"; + this.toolStripMenuItem6.Click += new System.EventHandler(this.toolStripMenuItem6_Click); + // + // toolStripSeparator2 + // + this.toolStripSeparator2.Name = "toolStripSeparator2"; + this.toolStripSeparator2.Size = new System.Drawing.Size(135, 6); + // + // listViewMenuItem1 + // + this.listViewMenuItem1.Name = "listViewMenuItem1"; + this.listViewMenuItem1.Size = new System.Drawing.Size(138, 22); + this.listViewMenuItem1.Text = "Move &Up"; + this.listViewMenuItem1.Click += new System.EventHandler(this.toolStripMenuItem12_Click); + // + // moveFileToToolStripMenuItem + // + this.moveFileToToolStripMenuItem.Name = "moveFileToToolStripMenuItem"; + this.moveFileToToolStripMenuItem.Size = new System.Drawing.Size(138, 22); + this.moveFileToToolStripMenuItem.Text = "Move &Down"; + this.moveFileToToolStripMenuItem.Click += new System.EventHandler(this.toolStripMenuItem13_Click); + // + // statusBar1 + // + this.statusBar1.Font = new System.Drawing.Font("Verdana", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.statusBar1.Location = new System.Drawing.Point(0, 634); + this.statusBar1.Name = "statusBar1"; + this.statusBar1.Panels.AddRange(new System.Windows.Forms.StatusBarPanel[] { this.statusBarPanel1, this.statusBarPanel2}); - this.statusBar1.ShowPanels = true; - this.statusBar1.Size = new System.Drawing.Size(304, 20); - this.statusBar1.SizingGrip = false; - this.statusBar1.TabIndex = 9; - // - // statusBarPanel1 - // - this.statusBarPanel1.AutoSize = System.Windows.Forms.StatusBarPanelAutoSize.Spring; - this.statusBarPanel1.Name = "statusBarPanel1"; - this.statusBarPanel1.Width = 204; - // - // statusBarPanel2 - // - this.statusBarPanel2.Alignment = System.Windows.Forms.HorizontalAlignment.Center; - this.statusBarPanel2.Name = "statusBarPanel2"; - // - // imageList1 - // - this.imageList1.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList1.ImageStream"))); - this.imageList1.TransparentColor = System.Drawing.Color.Transparent; - this.imageList1.Images.SetKeyName(0, "transmit_blue.png"); - this.imageList1.Images.SetKeyName(1, "folder.png"); - this.imageList1.Images.SetKeyName(2, "folder_explore.png"); - this.imageList1.Images.SetKeyName(3, "page_blue.png"); - this.imageList1.Images.SetKeyName(4, "page.png"); - this.imageList1.Images.SetKeyName(5, "page_green.png"); - this.imageList1.Images.SetKeyName(6, "page_red.png"); - // - // toolStrip1 - // - this.toolStrip1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None; - this.toolStrip1.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden; - this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.statusBar1.ShowPanels = true; + this.statusBar1.Size = new System.Drawing.Size(304, 20); + this.statusBar1.SizingGrip = false; + this.statusBar1.TabIndex = 9; + // + // statusBarPanel1 + // + this.statusBarPanel1.AutoSize = System.Windows.Forms.StatusBarPanelAutoSize.Spring; + this.statusBarPanel1.Name = "statusBarPanel1"; + this.statusBarPanel1.Width = 204; + // + // statusBarPanel2 + // + this.statusBarPanel2.Alignment = System.Windows.Forms.HorizontalAlignment.Center; + this.statusBarPanel2.Name = "statusBarPanel2"; + // + // imageList1 + // + this.imageList1.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList1.ImageStream"))); + this.imageList1.TransparentColor = System.Drawing.Color.Transparent; + this.imageList1.Images.SetKeyName(0, "transmit_blue.png"); + this.imageList1.Images.SetKeyName(1, "folder.png"); + this.imageList1.Images.SetKeyName(2, "folder_explore.png"); + this.imageList1.Images.SetKeyName(3, "page_blue.png"); + this.imageList1.Images.SetKeyName(4, "page.png"); + this.imageList1.Images.SetKeyName(5, "page_green.png"); + this.imageList1.Images.SetKeyName(6, "page_red.png"); + // + // toolStrip1 + // + this.toolStrip1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None; + this.toolStrip1.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden; + this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.toolStripDropDownButton1, this.toolStripDropDownButton2, this.toolStripDropDownButton3, this.toolStripDropDownButton4, this.toolStripDropDownButton5, this.toolStripDropDownButton7}); - this.toolStrip1.Location = new System.Drawing.Point(0, 0); - this.toolStrip1.Name = "toolStrip1"; - this.toolStrip1.Padding = new System.Windows.Forms.Padding(5, 0, 1, 0); - this.toolStrip1.RenderMode = System.Windows.Forms.ToolStripRenderMode.System; - this.toolStrip1.Size = new System.Drawing.Size(304, 25); - this.toolStrip1.TabIndex = 25; - this.toolStrip1.Text = "toolStrip1"; - // - // toolStripDropDownButton1 - // - this.toolStripDropDownButton1.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; - this.toolStripDropDownButton1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStrip1.Location = new System.Drawing.Point(0, 0); + this.toolStrip1.Name = "toolStrip1"; + this.toolStrip1.Padding = new System.Windows.Forms.Padding(5, 0, 1, 0); + this.toolStrip1.RenderMode = System.Windows.Forms.ToolStripRenderMode.System; + this.toolStrip1.Size = new System.Drawing.Size(304, 25); + this.toolStrip1.TabIndex = 25; + this.toolStrip1.Text = "toolStrip1"; + // + // toolStripDropDownButton1 + // + this.toolStripDropDownButton1.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + this.toolStripDropDownButton1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.newFileMenuItem, this.openFileMenuItem, this.toolStripSeparator1, @@ -235,239 +236,239 @@ namespace bzit.bomg this.exportFileMenuItem, this.toolStripSeparator6, this.exitFileMenuItem}); - this.toolStripDropDownButton1.ImageTransparentColor = System.Drawing.Color.Magenta; - this.toolStripDropDownButton1.Name = "toolStripDropDownButton1"; - this.toolStripDropDownButton1.ShowDropDownArrow = false; - this.toolStripDropDownButton1.Size = new System.Drawing.Size(29, 22); - this.toolStripDropDownButton1.Text = "&File"; - // - // newFileMenuItem - // - this.newFileMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("newFileMenuItem.Image"))); - this.newFileMenuItem.Name = "newFileMenuItem"; - this.newFileMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.N))); - this.newFileMenuItem.Size = new System.Drawing.Size(186, 22); - this.newFileMenuItem.Text = "&New"; - this.newFileMenuItem.Click += new System.EventHandler(this.newSessionToolStripMenuItem_Click); - // - // openFileMenuItem - // - this.openFileMenuItem.Image = global::bzit.bomg.Properties.Resources.folder_page; - this.openFileMenuItem.Name = "openFileMenuItem"; - this.openFileMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O))); - this.openFileMenuItem.Size = new System.Drawing.Size(186, 22); - this.openFileMenuItem.Text = "&Open"; - this.openFileMenuItem.Click += new System.EventHandler(this.toolStripMenuItem2_Click); - // - // toolStripSeparator1 - // - this.toolStripSeparator1.Name = "toolStripSeparator1"; - this.toolStripSeparator1.Size = new System.Drawing.Size(183, 6); - // - // closeFileMenuItem - // - this.closeFileMenuItem.Name = "closeFileMenuItem"; - this.closeFileMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.W))); - this.closeFileMenuItem.Size = new System.Drawing.Size(186, 22); - this.closeFileMenuItem.Text = "&Close"; - this.closeFileMenuItem.Click += new System.EventHandler(this.toolStripMenuItem3_Click); - // - // toolStripSeparator4 - // - this.toolStripSeparator4.Name = "toolStripSeparator4"; - this.toolStripSeparator4.Size = new System.Drawing.Size(183, 6); - // - // saveFileMenuItem - // - this.saveFileMenuItem.Image = global::bzit.bomg.Properties.Resources.disk; - this.saveFileMenuItem.Name = "saveFileMenuItem"; - this.saveFileMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S))); - this.saveFileMenuItem.Size = new System.Drawing.Size(186, 22); - this.saveFileMenuItem.Text = "&Save"; - this.saveFileMenuItem.Click += new System.EventHandler(this.importSnapshotToolStripMenuItem_Click); - // - // saveAsFileMenuItem - // - this.saveAsFileMenuItem.Image = global::bzit.bomg.Properties.Resources.page_white_disk; - this.saveAsFileMenuItem.Name = "saveAsFileMenuItem"; - this.saveAsFileMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + this.toolStripDropDownButton1.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripDropDownButton1.Name = "toolStripDropDownButton1"; + this.toolStripDropDownButton1.ShowDropDownArrow = false; + this.toolStripDropDownButton1.Size = new System.Drawing.Size(29, 22); + this.toolStripDropDownButton1.Text = "&File"; + // + // newFileMenuItem + // + this.newFileMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("newFileMenuItem.Image"))); + this.newFileMenuItem.Name = "newFileMenuItem"; + this.newFileMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.N))); + this.newFileMenuItem.Size = new System.Drawing.Size(186, 22); + this.newFileMenuItem.Text = "&New"; + this.newFileMenuItem.Click += new System.EventHandler(this.newSessionToolStripMenuItem_Click); + // + // openFileMenuItem + // + this.openFileMenuItem.Image = global::bzit.bomg.Properties.Resources.folder_page; + this.openFileMenuItem.Name = "openFileMenuItem"; + this.openFileMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O))); + this.openFileMenuItem.Size = new System.Drawing.Size(186, 22); + this.openFileMenuItem.Text = "&Open"; + this.openFileMenuItem.Click += new System.EventHandler(this.toolStripMenuItem2_Click); + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(183, 6); + // + // closeFileMenuItem + // + this.closeFileMenuItem.Name = "closeFileMenuItem"; + this.closeFileMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.W))); + this.closeFileMenuItem.Size = new System.Drawing.Size(186, 22); + this.closeFileMenuItem.Text = "&Close"; + this.closeFileMenuItem.Click += new System.EventHandler(this.toolStripMenuItem3_Click); + // + // toolStripSeparator4 + // + this.toolStripSeparator4.Name = "toolStripSeparator4"; + this.toolStripSeparator4.Size = new System.Drawing.Size(183, 6); + // + // saveFileMenuItem + // + this.saveFileMenuItem.Image = global::bzit.bomg.Properties.Resources.disk; + this.saveFileMenuItem.Name = "saveFileMenuItem"; + this.saveFileMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S))); + this.saveFileMenuItem.Size = new System.Drawing.Size(186, 22); + this.saveFileMenuItem.Text = "&Save"; + this.saveFileMenuItem.Click += new System.EventHandler(this.importSnapshotToolStripMenuItem_Click); + // + // saveAsFileMenuItem + // + this.saveAsFileMenuItem.Image = global::bzit.bomg.Properties.Resources.page_white_disk; + this.saveAsFileMenuItem.Name = "saveAsFileMenuItem"; + this.saveAsFileMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) | System.Windows.Forms.Keys.S))); - this.saveAsFileMenuItem.Size = new System.Drawing.Size(186, 22); - this.saveAsFileMenuItem.Text = "Save &As"; - this.saveAsFileMenuItem.Click += new System.EventHandler(this.exportSnapshotToolStripMenuItem_Click); - // - // toolStripSeparator8 - // - this.toolStripSeparator8.Name = "toolStripSeparator8"; - this.toolStripSeparator8.Size = new System.Drawing.Size(183, 6); - // - // exportFileMenuItem - // - this.exportFileMenuItem.Enabled = false; - this.exportFileMenuItem.Name = "exportFileMenuItem"; - this.exportFileMenuItem.Size = new System.Drawing.Size(186, 22); - this.exportFileMenuItem.Text = "&Export"; - this.exportFileMenuItem.Click += new System.EventHandler(this.toolStripMenuItem7_Click); - // - // toolStripSeparator6 - // - this.toolStripSeparator6.Name = "toolStripSeparator6"; - this.toolStripSeparator6.Size = new System.Drawing.Size(183, 6); - // - // exitFileMenuItem - // - this.exitFileMenuItem.Name = "exitFileMenuItem"; - this.exitFileMenuItem.Size = new System.Drawing.Size(186, 22); - this.exitFileMenuItem.Text = "E&xit"; - this.exitFileMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem1_Click); - // - // toolStripDropDownButton2 - // - this.toolStripDropDownButton2.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; - this.toolStripDropDownButton2.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.saveAsFileMenuItem.Size = new System.Drawing.Size(186, 22); + this.saveAsFileMenuItem.Text = "Save &As"; + this.saveAsFileMenuItem.Click += new System.EventHandler(this.exportSnapshotToolStripMenuItem_Click); + // + // toolStripSeparator8 + // + this.toolStripSeparator8.Name = "toolStripSeparator8"; + this.toolStripSeparator8.Size = new System.Drawing.Size(183, 6); + // + // exportFileMenuItem + // + this.exportFileMenuItem.Enabled = false; + this.exportFileMenuItem.Name = "exportFileMenuItem"; + this.exportFileMenuItem.Size = new System.Drawing.Size(186, 22); + this.exportFileMenuItem.Text = "&Export"; + this.exportFileMenuItem.Click += new System.EventHandler(this.toolStripMenuItem7_Click); + // + // toolStripSeparator6 + // + this.toolStripSeparator6.Name = "toolStripSeparator6"; + this.toolStripSeparator6.Size = new System.Drawing.Size(183, 6); + // + // exitFileMenuItem + // + this.exitFileMenuItem.Name = "exitFileMenuItem"; + this.exitFileMenuItem.Size = new System.Drawing.Size(186, 22); + this.exitFileMenuItem.Text = "E&xit"; + this.exitFileMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem1_Click); + // + // toolStripDropDownButton2 + // + this.toolStripDropDownButton2.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + this.toolStripDropDownButton2.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.findEditMenuItem}); - this.toolStripDropDownButton2.ImageTransparentColor = System.Drawing.Color.Magenta; - this.toolStripDropDownButton2.Name = "toolStripDropDownButton2"; - this.toolStripDropDownButton2.ShowDropDownArrow = false; - this.toolStripDropDownButton2.Size = new System.Drawing.Size(31, 22); - this.toolStripDropDownButton2.Text = "&Edit"; - // - // findEditMenuItem - // - this.findEditMenuItem.Image = global::bzit.bomg.Properties.Resources.magnifier; - this.findEditMenuItem.Name = "findEditMenuItem"; - this.findEditMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.F))); - this.findEditMenuItem.Size = new System.Drawing.Size(137, 22); - this.findEditMenuItem.Text = "&Find"; - this.findEditMenuItem.Click += new System.EventHandler(this.toolStripButton5_Click); - // - // toolStripDropDownButton3 - // - this.toolStripDropDownButton3.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; - this.toolStripDropDownButton3.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripDropDownButton2.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripDropDownButton2.Name = "toolStripDropDownButton2"; + this.toolStripDropDownButton2.ShowDropDownArrow = false; + this.toolStripDropDownButton2.Size = new System.Drawing.Size(31, 22); + this.toolStripDropDownButton2.Text = "&Edit"; + // + // findEditMenuItem + // + this.findEditMenuItem.Image = global::bzit.bomg.Properties.Resources.magnifier; + this.findEditMenuItem.Name = "findEditMenuItem"; + this.findEditMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.F))); + this.findEditMenuItem.Size = new System.Drawing.Size(137, 22); + this.findEditMenuItem.Text = "&Find"; + this.findEditMenuItem.Click += new System.EventHandler(this.toolStripButton5_Click); + // + // toolStripDropDownButton3 + // + this.toolStripDropDownButton3.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + this.toolStripDropDownButton3.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.expandAllViewMenuItem, this.collapseAllViewMenuItem}); - this.toolStripDropDownButton3.ImageTransparentColor = System.Drawing.Color.Magenta; - this.toolStripDropDownButton3.Name = "toolStripDropDownButton3"; - this.toolStripDropDownButton3.ShowDropDownArrow = false; - this.toolStripDropDownButton3.Size = new System.Drawing.Size(36, 22); - this.toolStripDropDownButton3.Text = "&View"; - // - // expandAllViewMenuItem - // - this.expandAllViewMenuItem.Enabled = false; - this.expandAllViewMenuItem.Name = "expandAllViewMenuItem"; - this.expandAllViewMenuItem.Size = new System.Drawing.Size(136, 22); - this.expandAllViewMenuItem.Text = "&Expand All"; - this.expandAllViewMenuItem.Click += new System.EventHandler(this.expandAllToolStripMenuItem_Click); - // - // collapseAllViewMenuItem - // - this.collapseAllViewMenuItem.Enabled = false; - this.collapseAllViewMenuItem.Name = "collapseAllViewMenuItem"; - this.collapseAllViewMenuItem.Size = new System.Drawing.Size(136, 22); - this.collapseAllViewMenuItem.Text = "&Collapse All"; - this.collapseAllViewMenuItem.Click += new System.EventHandler(this.collapseAllToolStripMenuItem_Click); - // - // toolStripDropDownButton4 - // - this.toolStripDropDownButton4.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; - this.toolStripDropDownButton4.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripDropDownButton3.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripDropDownButton3.Name = "toolStripDropDownButton3"; + this.toolStripDropDownButton3.ShowDropDownArrow = false; + this.toolStripDropDownButton3.Size = new System.Drawing.Size(36, 22); + this.toolStripDropDownButton3.Text = "&View"; + // + // expandAllViewMenuItem + // + this.expandAllViewMenuItem.Enabled = false; + this.expandAllViewMenuItem.Name = "expandAllViewMenuItem"; + this.expandAllViewMenuItem.Size = new System.Drawing.Size(136, 22); + this.expandAllViewMenuItem.Text = "&Expand All"; + this.expandAllViewMenuItem.Click += new System.EventHandler(this.expandAllToolStripMenuItem_Click); + // + // collapseAllViewMenuItem + // + this.collapseAllViewMenuItem.Enabled = false; + this.collapseAllViewMenuItem.Name = "collapseAllViewMenuItem"; + this.collapseAllViewMenuItem.Size = new System.Drawing.Size(136, 22); + this.collapseAllViewMenuItem.Text = "&Collapse All"; + this.collapseAllViewMenuItem.Click += new System.EventHandler(this.collapseAllToolStripMenuItem_Click); + // + // toolStripDropDownButton4 + // + this.toolStripDropDownButton4.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + this.toolStripDropDownButton4.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.updateIconsToolMenuItem, this.toolStripSeparator14, this.optionsToolMenuItem}); - this.toolStripDropDownButton4.ImageTransparentColor = System.Drawing.Color.Magenta; - this.toolStripDropDownButton4.Name = "toolStripDropDownButton4"; - this.toolStripDropDownButton4.ShowDropDownArrow = false; - this.toolStripDropDownButton4.Size = new System.Drawing.Size(39, 22); - this.toolStripDropDownButton4.Text = "&Tools"; - // - // updateIconsToolMenuItem - // - this.updateIconsToolMenuItem.Name = "updateIconsToolMenuItem"; - this.updateIconsToolMenuItem.Size = new System.Drawing.Size(180, 22); - this.updateIconsToolMenuItem.Text = "&Update Icons"; - this.updateIconsToolMenuItem.Click += new System.EventHandler(this.toolStripMenuItem1_Click); - // - // toolStripSeparator14 - // - this.toolStripSeparator14.Name = "toolStripSeparator14"; - this.toolStripSeparator14.Size = new System.Drawing.Size(177, 6); - // - // optionsToolMenuItem - // - this.optionsToolMenuItem.Enabled = false; - this.optionsToolMenuItem.Image = global::bzit.bomg.Properties.Resources.cog; - this.optionsToolMenuItem.Name = "optionsToolMenuItem"; - this.optionsToolMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F12; - this.optionsToolMenuItem.Size = new System.Drawing.Size(180, 22); - this.optionsToolMenuItem.Text = "&Options"; - this.optionsToolMenuItem.Click += new System.EventHandler(this.optionsToolStripMenuItem1_Click); - // - // toolStripDropDownButton5 - // - this.toolStripDropDownButton5.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; - this.toolStripDropDownButton5.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripDropDownButton4.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripDropDownButton4.Name = "toolStripDropDownButton4"; + this.toolStripDropDownButton4.ShowDropDownArrow = false; + this.toolStripDropDownButton4.Size = new System.Drawing.Size(39, 22); + this.toolStripDropDownButton4.Text = "&Tools"; + // + // updateIconsToolMenuItem + // + this.updateIconsToolMenuItem.Name = "updateIconsToolMenuItem"; + this.updateIconsToolMenuItem.Size = new System.Drawing.Size(143, 22); + this.updateIconsToolMenuItem.Text = "&Update Icons"; + this.updateIconsToolMenuItem.Click += new System.EventHandler(this.toolStripMenuItem1_Click); + // + // toolStripSeparator14 + // + this.toolStripSeparator14.Name = "toolStripSeparator14"; + this.toolStripSeparator14.Size = new System.Drawing.Size(140, 6); + // + // optionsToolMenuItem + // + this.optionsToolMenuItem.Enabled = false; + this.optionsToolMenuItem.Image = global::bzit.bomg.Properties.Resources.cog; + this.optionsToolMenuItem.Name = "optionsToolMenuItem"; + this.optionsToolMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F12; + this.optionsToolMenuItem.Size = new System.Drawing.Size(143, 22); + this.optionsToolMenuItem.Text = "&Options"; + this.optionsToolMenuItem.Click += new System.EventHandler(this.optionsToolStripMenuItem1_Click); + // + // toolStripDropDownButton5 + // + this.toolStripDropDownButton5.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + this.toolStripDropDownButton5.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.viewHelpHelpMenuItem, this.toolStripSeparator12, this.aboutHelpMenuItem}); - this.toolStripDropDownButton5.ImageTransparentColor = System.Drawing.Color.Magenta; - this.toolStripDropDownButton5.Name = "toolStripDropDownButton5"; - this.toolStripDropDownButton5.ShowDropDownArrow = false; - this.toolStripDropDownButton5.Size = new System.Drawing.Size(36, 22); - this.toolStripDropDownButton5.Text = "&Help"; - // - // viewHelpHelpMenuItem - // - this.viewHelpHelpMenuItem.Image = global::bzit.bomg.Properties.Resources.help; - this.viewHelpHelpMenuItem.Name = "viewHelpHelpMenuItem"; - this.viewHelpHelpMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F1; - this.viewHelpHelpMenuItem.Size = new System.Drawing.Size(146, 22); - this.viewHelpHelpMenuItem.Text = "View &Help"; - this.viewHelpHelpMenuItem.Click += new System.EventHandler(this.documentationToolStripMenuItem_Click); - // - // toolStripSeparator12 - // - this.toolStripSeparator12.Name = "toolStripSeparator12"; - this.toolStripSeparator12.Size = new System.Drawing.Size(143, 6); - // - // aboutHelpMenuItem - // - this.aboutHelpMenuItem.Image = global::bzit.bomg.Properties.Resources.comment; - this.aboutHelpMenuItem.Name = "aboutHelpMenuItem"; - this.aboutHelpMenuItem.Size = new System.Drawing.Size(146, 22); - this.aboutHelpMenuItem.Text = "&About"; - this.aboutHelpMenuItem.Click += new System.EventHandler(this.aboutToolStripMenuItem1_Click); - // - // toolStripDropDownButton7 - // - this.toolStripDropDownButton7.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; - this.toolStripDropDownButton7.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripDropDownButton5.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripDropDownButton5.Name = "toolStripDropDownButton5"; + this.toolStripDropDownButton5.ShowDropDownArrow = false; + this.toolStripDropDownButton5.Size = new System.Drawing.Size(36, 22); + this.toolStripDropDownButton5.Text = "&Help"; + // + // viewHelpHelpMenuItem + // + this.viewHelpHelpMenuItem.Image = global::bzit.bomg.Properties.Resources.help; + this.viewHelpHelpMenuItem.Name = "viewHelpHelpMenuItem"; + this.viewHelpHelpMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F1; + this.viewHelpHelpMenuItem.Size = new System.Drawing.Size(146, 22); + this.viewHelpHelpMenuItem.Text = "View &Help"; + this.viewHelpHelpMenuItem.Click += new System.EventHandler(this.documentationToolStripMenuItem_Click); + // + // toolStripSeparator12 + // + this.toolStripSeparator12.Name = "toolStripSeparator12"; + this.toolStripSeparator12.Size = new System.Drawing.Size(143, 6); + // + // aboutHelpMenuItem + // + this.aboutHelpMenuItem.Image = global::bzit.bomg.Properties.Resources.comment; + this.aboutHelpMenuItem.Name = "aboutHelpMenuItem"; + this.aboutHelpMenuItem.Size = new System.Drawing.Size(146, 22); + this.aboutHelpMenuItem.Text = "&About"; + this.aboutHelpMenuItem.Click += new System.EventHandler(this.aboutToolStripMenuItem1_Click); + // + // toolStripDropDownButton7 + // + this.toolStripDropDownButton7.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + this.toolStripDropDownButton7.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.alwaysOnTopToolStripMenuItem}); - this.toolStripDropDownButton7.ImageTransparentColor = System.Drawing.Color.Magenta; - this.toolStripDropDownButton7.Name = "toolStripDropDownButton7"; - this.toolStripDropDownButton7.ShowDropDownArrow = false; - this.toolStripDropDownButton7.Size = new System.Drawing.Size(16, 22); - this.toolStripDropDownButton7.Text = "&?"; - this.toolStripDropDownButton7.Visible = false; - // - // alwaysOnTopToolStripMenuItem - // - this.alwaysOnTopToolStripMenuItem.Name = "alwaysOnTopToolStripMenuItem"; - this.alwaysOnTopToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.F11))); - this.alwaysOnTopToolStripMenuItem.Size = new System.Drawing.Size(205, 22); - this.alwaysOnTopToolStripMenuItem.Text = "Always On Top"; - this.alwaysOnTopToolStripMenuItem.Click += new System.EventHandler(this.alwaysOnTopToolStripMenuItem_Click); - // - // openFileDialog - // - this.openFileDialog.DefaultExt = "ryz"; - this.openFileDialog.Filter = "Bookmarks files|*.ryz"; - this.openFileDialog.Title = "Open bookmarks file"; - // - // treeMenuFolder - // - this.treeMenuFolder.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripDropDownButton7.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripDropDownButton7.Name = "toolStripDropDownButton7"; + this.toolStripDropDownButton7.ShowDropDownArrow = false; + this.toolStripDropDownButton7.Size = new System.Drawing.Size(16, 22); + this.toolStripDropDownButton7.Text = "&?"; + this.toolStripDropDownButton7.Visible = false; + // + // alwaysOnTopToolStripMenuItem + // + this.alwaysOnTopToolStripMenuItem.Name = "alwaysOnTopToolStripMenuItem"; + this.alwaysOnTopToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.F11))); + this.alwaysOnTopToolStripMenuItem.Size = new System.Drawing.Size(205, 22); + this.alwaysOnTopToolStripMenuItem.Text = "Always On Top"; + this.alwaysOnTopToolStripMenuItem.Click += new System.EventHandler(this.alwaysOnTopToolStripMenuItem_Click); + // + // openFileDialog + // + this.openFileDialog.DefaultExt = "ryz"; + this.openFileDialog.Filter = "Bookmarks files|*.ryz"; + this.openFileDialog.Title = "Open bookmarks file"; + // + // treeMenuFolder + // + this.treeMenuFolder.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.toolStripMenuItem15, this.toolStripMenuItem16, this.toolStripSeparator5, @@ -479,236 +480,243 @@ namespace bzit.bomg this.toolStripSeparator11, this.toolStripMenuItem12, this.toolStripMenuItem13}); - this.treeMenuFolder.Name = "listViewMenu"; - this.treeMenuFolder.Size = new System.Drawing.Size(139, 198); - // - // toolStripMenuItem15 - // - this.toolStripMenuItem15.Name = "toolStripMenuItem15"; - this.toolStripMenuItem15.Size = new System.Drawing.Size(138, 22); - this.toolStripMenuItem15.Text = "Add &Page"; - this.toolStripMenuItem15.Click += new System.EventHandler(this.toolStripMenuItem15_Click); - // - // toolStripMenuItem16 - // - this.toolStripMenuItem16.Name = "toolStripMenuItem16"; - this.toolStripMenuItem16.Size = new System.Drawing.Size(138, 22); - this.toolStripMenuItem16.Text = "Add &Folder"; - this.toolStripMenuItem16.Click += new System.EventHandler(this.toolStripMenuItem16_Click); - // - // toolStripSeparator5 - // - this.toolStripSeparator5.Name = "toolStripSeparator5"; - this.toolStripSeparator5.Size = new System.Drawing.Size(135, 6); - // - // toolStripMenuItem14 - // - this.toolStripMenuItem14.Name = "toolStripMenuItem14"; - this.toolStripMenuItem14.Size = new System.Drawing.Size(138, 22); - this.toolStripMenuItem14.Text = "&Open All"; - this.toolStripMenuItem14.Click += new System.EventHandler(this.toolStripMenuItem14_Click); - // - // toolStripMenuItem9 - // - this.toolStripMenuItem9.Name = "toolStripMenuItem9"; - this.toolStripMenuItem9.Size = new System.Drawing.Size(138, 22); - this.toolStripMenuItem9.Text = "Edi&t"; - this.toolStripMenuItem9.Click += new System.EventHandler(this.toolStripMenuItem9_Click); - // - // toolStripMenuItem11 - // - this.toolStripMenuItem11.Name = "toolStripMenuItem11"; - this.toolStripMenuItem11.Size = new System.Drawing.Size(138, 22); - this.toolStripMenuItem11.Text = "D&elete"; - this.toolStripMenuItem11.Click += new System.EventHandler(this.toolStripMenuItem6_Click); - // - // toolStripSeparator7 - // - this.toolStripSeparator7.Name = "toolStripSeparator7"; - this.toolStripSeparator7.Size = new System.Drawing.Size(135, 6); - // - // sortToolStripMenuItem - // - this.sortToolStripMenuItem.Name = "sortToolStripMenuItem"; - this.sortToolStripMenuItem.Size = new System.Drawing.Size(138, 22); - this.sortToolStripMenuItem.Text = "&Sort"; - this.sortToolStripMenuItem.Click += new System.EventHandler(this.sortToolStripMenuItem_Click); - // - // toolStripSeparator11 - // - this.toolStripSeparator11.Name = "toolStripSeparator11"; - this.toolStripSeparator11.Size = new System.Drawing.Size(135, 6); - // - // toolStripMenuItem12 - // - this.toolStripMenuItem12.Name = "toolStripMenuItem12"; - this.toolStripMenuItem12.Size = new System.Drawing.Size(138, 22); - this.toolStripMenuItem12.Text = "Move &Up"; - this.toolStripMenuItem12.Click += new System.EventHandler(this.toolStripMenuItem12_Click); - // - // toolStripMenuItem13 - // - this.toolStripMenuItem13.Name = "toolStripMenuItem13"; - this.toolStripMenuItem13.Size = new System.Drawing.Size(138, 22); - this.toolStripMenuItem13.Text = "Move &Down"; - this.toolStripMenuItem13.Click += new System.EventHandler(this.toolStripMenuItem13_Click); - // - // saveFileDialog - // - this.saveFileDialog.DefaultExt = "ryz"; - this.saveFileDialog.Filter = "Bookmarks file|*.ryz|Bookmarks file (password protected)|*.ryz"; - this.saveFileDialog.Title = "Save bookmarks file"; - // - // toolStrip2 - // - this.toolStrip2.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None; - this.toolStrip2.CanOverflow = false; - this.toolStrip2.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.treeMenuFolder.Name = "listViewMenu"; + this.treeMenuFolder.Size = new System.Drawing.Size(139, 198); + // + // toolStripMenuItem15 + // + this.toolStripMenuItem15.Name = "toolStripMenuItem15"; + this.toolStripMenuItem15.Size = new System.Drawing.Size(138, 22); + this.toolStripMenuItem15.Text = "Add &Page"; + // + // toolStripMenuItem16 + // + this.toolStripMenuItem16.Name = "toolStripMenuItem16"; + this.toolStripMenuItem16.Size = new System.Drawing.Size(138, 22); + this.toolStripMenuItem16.Text = "Add &Folder"; + // + // toolStripSeparator5 + // + this.toolStripSeparator5.Name = "toolStripSeparator5"; + this.toolStripSeparator5.Size = new System.Drawing.Size(135, 6); + // + // toolStripMenuItem14 + // + this.toolStripMenuItem14.Name = "toolStripMenuItem14"; + this.toolStripMenuItem14.Size = new System.Drawing.Size(138, 22); + this.toolStripMenuItem14.Text = "&Open All"; + this.toolStripMenuItem14.Click += new System.EventHandler(this.toolStripMenuItem14_Click); + // + // toolStripMenuItem9 + // + this.toolStripMenuItem9.Name = "toolStripMenuItem9"; + this.toolStripMenuItem9.Size = new System.Drawing.Size(138, 22); + this.toolStripMenuItem9.Text = "Edi&t"; + this.toolStripMenuItem9.Click += new System.EventHandler(this.toolStripMenuItem9_Click); + // + // toolStripMenuItem11 + // + this.toolStripMenuItem11.Name = "toolStripMenuItem11"; + this.toolStripMenuItem11.Size = new System.Drawing.Size(138, 22); + this.toolStripMenuItem11.Text = "D&elete"; + this.toolStripMenuItem11.Click += new System.EventHandler(this.toolStripMenuItem6_Click); + // + // toolStripSeparator7 + // + this.toolStripSeparator7.Name = "toolStripSeparator7"; + this.toolStripSeparator7.Size = new System.Drawing.Size(135, 6); + // + // sortToolStripMenuItem + // + this.sortToolStripMenuItem.Name = "sortToolStripMenuItem"; + this.sortToolStripMenuItem.Size = new System.Drawing.Size(138, 22); + this.sortToolStripMenuItem.Text = "&Sort"; + this.sortToolStripMenuItem.Click += new System.EventHandler(this.sortToolStripMenuItem_Click); + // + // toolStripSeparator11 + // + this.toolStripSeparator11.Name = "toolStripSeparator11"; + this.toolStripSeparator11.Size = new System.Drawing.Size(135, 6); + // + // toolStripMenuItem12 + // + this.toolStripMenuItem12.Name = "toolStripMenuItem12"; + this.toolStripMenuItem12.Size = new System.Drawing.Size(138, 22); + this.toolStripMenuItem12.Text = "Move &Up"; + this.toolStripMenuItem12.Click += new System.EventHandler(this.toolStripMenuItem12_Click); + // + // toolStripMenuItem13 + // + this.toolStripMenuItem13.Name = "toolStripMenuItem13"; + this.toolStripMenuItem13.Size = new System.Drawing.Size(138, 22); + this.toolStripMenuItem13.Text = "Move &Down"; + this.toolStripMenuItem13.Click += new System.EventHandler(this.toolStripMenuItem13_Click); + // + // saveFileDialog + // + this.saveFileDialog.DefaultExt = "ryz"; + this.saveFileDialog.Filter = "Bookmarks file|*.ryz|Bookmarks file (password protected)|*.ryz"; + this.saveFileDialog.Title = "Save bookmarks file"; + // + // toolStrip2 + // + this.toolStrip2.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None; + this.toolStrip2.CanOverflow = false; + this.toolStrip2.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.newMenuBarItem, this.openMenuBarItem, this.saveMenuBarItem, - this.toolStripSeparator9}); - this.toolStrip2.Location = new System.Drawing.Point(0, 25); - this.toolStrip2.Name = "toolStrip2"; - this.toolStrip2.RenderMode = System.Windows.Forms.ToolStripRenderMode.System; - this.toolStrip2.Size = new System.Drawing.Size(304, 25); - this.toolStrip2.TabIndex = 26; - this.toolStrip2.Text = "toolStrip2"; - // - // newMenuBarItem - // - this.newMenuBarItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.newMenuBarItem.Image = ((System.Drawing.Image)(resources.GetObject("newMenuBarItem.Image"))); - this.newMenuBarItem.ImageTransparentColor = System.Drawing.Color.Magenta; - this.newMenuBarItem.Name = "newMenuBarItem"; - this.newMenuBarItem.Size = new System.Drawing.Size(23, 22); - this.newMenuBarItem.Text = "toolStripButton1"; - this.newMenuBarItem.ToolTipText = "New"; - this.newMenuBarItem.Click += new System.EventHandler(this.newSessionToolStripMenuItem_Click); - // - // openMenuBarItem - // - this.openMenuBarItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.openMenuBarItem.Image = global::bzit.bomg.Properties.Resources.folder_page; - this.openMenuBarItem.ImageTransparentColor = System.Drawing.Color.Magenta; - this.openMenuBarItem.Name = "openMenuBarItem"; - this.openMenuBarItem.Size = new System.Drawing.Size(23, 22); - this.openMenuBarItem.Text = "toolStripButton2"; - this.openMenuBarItem.ToolTipText = "Open"; - this.openMenuBarItem.Click += new System.EventHandler(this.toolStripMenuItem2_Click); - // - // saveMenuBarItem - // - this.saveMenuBarItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.saveMenuBarItem.Image = global::bzit.bomg.Properties.Resources.disk; - this.saveMenuBarItem.ImageTransparentColor = System.Drawing.Color.Magenta; - this.saveMenuBarItem.Name = "saveMenuBarItem"; - this.saveMenuBarItem.Size = new System.Drawing.Size(23, 22); - this.saveMenuBarItem.Text = "toolStripButton3"; - this.saveMenuBarItem.ToolTipText = "Save"; - this.saveMenuBarItem.Click += new System.EventHandler(this.importSnapshotToolStripMenuItem_Click); - // - // toolStripSeparator9 - // - this.toolStripSeparator9.Name = "toolStripSeparator9"; - this.toolStripSeparator9.Size = new System.Drawing.Size(6, 25); - // - // treeMenuRoot - // - this.treeMenuRoot.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripSeparator9, + this.toolStripButton1}); + this.toolStrip2.Location = new System.Drawing.Point(0, 25); + this.toolStrip2.Name = "toolStrip2"; + this.toolStrip2.RenderMode = System.Windows.Forms.ToolStripRenderMode.System; + this.toolStrip2.Size = new System.Drawing.Size(304, 25); + this.toolStrip2.TabIndex = 26; + this.toolStrip2.Text = "toolStrip2"; + // + // newMenuBarItem + // + this.newMenuBarItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.newMenuBarItem.Image = ((System.Drawing.Image)(resources.GetObject("newMenuBarItem.Image"))); + this.newMenuBarItem.ImageTransparentColor = System.Drawing.Color.Magenta; + this.newMenuBarItem.Name = "newMenuBarItem"; + this.newMenuBarItem.Size = new System.Drawing.Size(23, 22); + this.newMenuBarItem.Text = "toolStripButton1"; + this.newMenuBarItem.ToolTipText = "New"; + this.newMenuBarItem.Click += new System.EventHandler(this.newSessionToolStripMenuItem_Click); + // + // openMenuBarItem + // + this.openMenuBarItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.openMenuBarItem.Image = global::bzit.bomg.Properties.Resources.folder_page; + this.openMenuBarItem.ImageTransparentColor = System.Drawing.Color.Magenta; + this.openMenuBarItem.Name = "openMenuBarItem"; + this.openMenuBarItem.Size = new System.Drawing.Size(23, 22); + this.openMenuBarItem.Text = "toolStripButton2"; + this.openMenuBarItem.ToolTipText = "Open"; + this.openMenuBarItem.Click += new System.EventHandler(this.toolStripMenuItem2_Click); + // + // saveMenuBarItem + // + this.saveMenuBarItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.saveMenuBarItem.Image = global::bzit.bomg.Properties.Resources.disk; + this.saveMenuBarItem.ImageTransparentColor = System.Drawing.Color.Magenta; + this.saveMenuBarItem.Name = "saveMenuBarItem"; + this.saveMenuBarItem.Size = new System.Drawing.Size(23, 22); + this.saveMenuBarItem.Text = "toolStripButton3"; + this.saveMenuBarItem.ToolTipText = "Save"; + this.saveMenuBarItem.Click += new System.EventHandler(this.importSnapshotToolStripMenuItem_Click); + // + // toolStripSeparator9 + // + this.toolStripSeparator9.Name = "toolStripSeparator9"; + this.toolStripSeparator9.Size = new System.Drawing.Size(6, 25); + // + // treeMenuRoot + // + this.treeMenuRoot.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.toolStripMenuItem17, this.toolStripMenuItem18, this.toolStripSeparator10, this.toolStripMenuItem20, this.toolStripSeparator13, this.toolStripMenuItem22}); - this.treeMenuRoot.Name = "listViewMenu"; - this.treeMenuRoot.Size = new System.Drawing.Size(133, 104); - // - // toolStripMenuItem17 - // - this.toolStripMenuItem17.Name = "toolStripMenuItem17"; - this.toolStripMenuItem17.Size = new System.Drawing.Size(132, 22); - this.toolStripMenuItem17.Text = "Add &Page"; - this.toolStripMenuItem17.Click += new System.EventHandler(this.toolStripMenuItem15_Click); - // - // toolStripMenuItem18 - // - this.toolStripMenuItem18.Name = "toolStripMenuItem18"; - this.toolStripMenuItem18.Size = new System.Drawing.Size(132, 22); - this.toolStripMenuItem18.Text = "Add &Folder"; - this.toolStripMenuItem18.Click += new System.EventHandler(this.toolStripMenuItem16_Click); - // - // toolStripSeparator10 - // - this.toolStripSeparator10.Name = "toolStripSeparator10"; - this.toolStripSeparator10.Size = new System.Drawing.Size(129, 6); - // - // toolStripMenuItem20 - // - this.toolStripMenuItem20.Name = "toolStripMenuItem20"; - this.toolStripMenuItem20.Size = new System.Drawing.Size(132, 22); - this.toolStripMenuItem20.Text = "Edi&t"; - this.toolStripMenuItem20.Click += new System.EventHandler(this.toolStripMenuItem9_Click); - // - // toolStripSeparator13 - // - this.toolStripSeparator13.Name = "toolStripSeparator13"; - this.toolStripSeparator13.Size = new System.Drawing.Size(129, 6); - // - // toolStripMenuItem22 - // - this.toolStripMenuItem22.Name = "toolStripMenuItem22"; - this.toolStripMenuItem22.Size = new System.Drawing.Size(132, 22); - this.toolStripMenuItem22.Text = "&Sort"; - this.toolStripMenuItem22.Click += new System.EventHandler(this.sortToolStripMenuItem_Click); - // - // treeView1 - // - this.treeView1.AllowDrop = true; - this.treeView1.BackColor = System.Drawing.Color.White; - this.treeView1.Dock = System.Windows.Forms.DockStyle.Fill; - this.treeView1.HasChanged = false; - this.treeView1.HideSelection = false; - this.treeView1.HotTracking = true; - this.treeView1.ImageIndex = 0; - this.treeView1.LabelEdit = true; - this.treeView1.Location = new System.Drawing.Point(0, 50); - this.treeView1.Name = "treeView1"; - this.treeView1.SelectedImageIndex = 0; - this.treeView1.ShowNodeToolTips = true; - this.treeView1.Size = new System.Drawing.Size(304, 584); - this.treeView1.TabIndex = 24; - this.treeView1.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeView1_NodeMouseClick); - this.treeView1.NodeMouseDoubleClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeView2_NodeMouseDoubleClick); - this.treeView1.PreviewKeyDown += new System.Windows.Forms.PreviewKeyDownEventHandler(this.treeView1_PreviewKeyDown); - // - // MainForm - // - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; - this.BackColor = System.Drawing.SystemColors.Control; - this.ClientSize = new System.Drawing.Size(304, 654); - this.Controls.Add(this.treeView1); - this.Controls.Add(this.toolStrip2); - this.Controls.Add(this.statusBar1); - this.Controls.Add(this.toolStrip1); - this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.MinimumSize = new System.Drawing.Size(320, 600); - this.Name = "MainForm"; - this.StartPosition = System.Windows.Forms.FormStartPosition.Manual; - this.Text = "Bookmark Manager"; - this.treeMenuItem.ResumeLayout(false); - ((System.ComponentModel.ISupportInitialize)(this.statusBarPanel1)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.statusBarPanel2)).EndInit(); - this.toolStrip1.ResumeLayout(false); - this.toolStrip1.PerformLayout(); - this.treeMenuFolder.ResumeLayout(false); - this.toolStrip2.ResumeLayout(false); - this.toolStrip2.PerformLayout(); - this.treeMenuRoot.ResumeLayout(false); - this.ResumeLayout(false); - this.PerformLayout(); + this.treeMenuRoot.Name = "listViewMenu"; + this.treeMenuRoot.Size = new System.Drawing.Size(133, 104); + // + // toolStripMenuItem17 + // + this.toolStripMenuItem17.Name = "toolStripMenuItem17"; + this.toolStripMenuItem17.Size = new System.Drawing.Size(132, 22); + this.toolStripMenuItem17.Text = "Add &Page"; + // + // toolStripMenuItem18 + // + this.toolStripMenuItem18.Name = "toolStripMenuItem18"; + this.toolStripMenuItem18.Size = new System.Drawing.Size(132, 22); + this.toolStripMenuItem18.Text = "Add &Folder"; + // + // toolStripSeparator10 + // + this.toolStripSeparator10.Name = "toolStripSeparator10"; + this.toolStripSeparator10.Size = new System.Drawing.Size(129, 6); + // + // toolStripMenuItem20 + // + this.toolStripMenuItem20.Name = "toolStripMenuItem20"; + this.toolStripMenuItem20.Size = new System.Drawing.Size(132, 22); + this.toolStripMenuItem20.Text = "Edi&t"; + this.toolStripMenuItem20.Click += new System.EventHandler(this.toolStripMenuItem9_Click); + // + // toolStripSeparator13 + // + this.toolStripSeparator13.Name = "toolStripSeparator13"; + this.toolStripSeparator13.Size = new System.Drawing.Size(129, 6); + // + // toolStripMenuItem22 + // + this.toolStripMenuItem22.Name = "toolStripMenuItem22"; + this.toolStripMenuItem22.Size = new System.Drawing.Size(132, 22); + this.toolStripMenuItem22.Text = "&Sort"; + this.toolStripMenuItem22.Click += new System.EventHandler(this.sortToolStripMenuItem_Click); + // + // treeView1 + // + this.treeView1.AllowDrop = true; + this.treeView1.BackColor = System.Drawing.Color.White; + this.treeView1.Dock = System.Windows.Forms.DockStyle.Fill; + this.treeView1.HasChanged = false; + this.treeView1.HideSelection = false; + this.treeView1.HotTracking = true; + this.treeView1.ImageIndex = 0; + this.treeView1.LabelEdit = true; + this.treeView1.Location = new System.Drawing.Point(0, 50); + this.treeView1.Name = "treeView1"; + this.treeView1.SelectedImageIndex = 0; + this.treeView1.ShowNodeToolTips = true; + this.treeView1.Size = new System.Drawing.Size(304, 584); + this.treeView1.TabIndex = 24; + this.treeView1.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeView1_NodeMouseClick); + this.treeView1.NodeMouseDoubleClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeView2_NodeMouseDoubleClick); + this.treeView1.PreviewKeyDown += new System.Windows.Forms.PreviewKeyDownEventHandler(this.treeView1_PreviewKeyDown); + // + // toolStripButton1 + // + this.toolStripButton1.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButton1.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton1.Image"))); + this.toolStripButton1.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton1.Name = "toolStripButton1"; + this.toolStripButton1.Size = new System.Drawing.Size(23, 22); + this.toolStripButton1.Text = "toolStripButton1"; + this.toolStripButton1.Click += new System.EventHandler(this.toolStripButton1_Click); + // + // MainForm + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.BackColor = System.Drawing.SystemColors.Control; + this.ClientSize = new System.Drawing.Size(304, 654); + this.Controls.Add(this.treeView1); + this.Controls.Add(this.toolStrip2); + this.Controls.Add(this.statusBar1); + this.Controls.Add(this.toolStrip1); + this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MinimumSize = new System.Drawing.Size(320, 600); + this.Name = "MainForm"; + this.StartPosition = System.Windows.Forms.FormStartPosition.Manual; + this.Text = "Bookmark Manager"; + this.treeMenuItem.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.statusBarPanel1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.statusBarPanel2)).EndInit(); + this.toolStrip1.ResumeLayout(false); + this.toolStrip1.PerformLayout(); + this.treeMenuFolder.ResumeLayout(false); + this.toolStrip2.ResumeLayout(false); + this.toolStrip2.PerformLayout(); + this.treeMenuRoot.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); } @@ -782,6 +790,7 @@ namespace bzit.bomg private System.Windows.Forms.ToolStripMenuItem findEditMenuItem; private System.Windows.Forms.ToolStripMenuItem updateIconsToolMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator14; + private System.Windows.Forms.ToolStripButton toolStripButton1; } } diff --git a/MainForm.cs b/MainForm.cs index d650079..35b3fd3 100644 --- a/MainForm.cs +++ b/MainForm.cs @@ -1,3 +1,4 @@ +using bzit.bomg.Models; using System; using System.ComponentModel; using System.IO; @@ -32,41 +33,20 @@ namespace bzit.bomg // toolbar viewHelpHelpMenuItem.Enabled = File.Exists(Path.ChangeExtension(Application.ExecutablePath, ".chm")); - string iconDBPath = Path.ChangeExtension(Application.ExecutablePath, ".db"); - bool rs = this.IconDatabase.Create(Path.ChangeExtension(Application.ExecutablePath, "db"), false, null, true); - if (!rs) - { - MessageBox.Show("Can not find icon database. [" + this.IconDatabase.LastError + "]"); - this.Close(); - } - //bool rv = false; - // if (File.Exists(iconDBPath)) - // { - // rv = this.IconDatabase.LoadFile(iconDBPath); - // if (!rv) - // { - // rv = this.IconDatabase.CreateSpecial(iconDBPath, true); - // if (!rv) - // { - // MessageBox.Show("Can not find icon database. [" + this.IconDatabase.LastError + "]"); - // this.Close(); - // } - // } - // } - // else - // { - // rv = this.IconDatabase.CreateSpecial(iconDBPath, true); - // if (!rv) - // { - // MessageBox.Show("Can not find icon database. [" + this.IconDatabase.LastError + "]"); - // this.Close(); - // } - // } + bool rv = false; + string iconDBFilename = Path.ChangeExtension(Application.ExecutablePath, ".db"); - treeView1.IconDatabase = this.IconDatabase; - sessionFileFormat = new SessionFileFormat(this); + string errorMessage; + rv = treeView1.InitialiseIconDatabase(out errorMessage, iconDBFilename); + if (!rv) + { + MessageBox.Show("Can not find icon database. [" + this.IconDatabase.LastError + "]"); + this.Close(); + } + + sessionFileFormat = new SessionFileFormat(this); this.ApplicationMode = AppMode.Clear; treeView1.OnNodeCountUpdate = delegate (ulong v) { @@ -88,7 +68,7 @@ namespace bzit.bomg protected override void OnShown(EventArgs e) { base.OnShown(e); - + this.Height = Screen.PrimaryScreen.WorkingArea.Height; this.Location = Screen.PrimaryScreen.WorkingArea.Location; @@ -215,7 +195,7 @@ namespace bzit.bomg } } } - + #region public properties public AppMode ApplicationMode @@ -237,7 +217,7 @@ namespace bzit.bomg closeFileMenuItem.Enabled = false; saveFileMenuItem.Enabled = saveMenuBarItem.Enabled = false; saveAsFileMenuItem.Enabled = false; - updateIconsToolMenuItem.Enabled = false; + updateIconsToolMenuItem.Enabled = false; break; case AppMode.Open: @@ -265,9 +245,9 @@ namespace bzit.bomg [DefaultValue(null)] public IconDatabase IconDatabase { get; set; } - + #endregion - + #region Toolbar #1 /** @@ -307,7 +287,7 @@ namespace bzit.bomg ApplicationMode = AppMode.Clear; return; } - + if (ApplicationMode == AppMode.Open) { if (string.IsNullOrEmpty(sessionFilename)) @@ -327,7 +307,7 @@ namespace bzit.bomg { if (MessageBox.Show("There was a problem saving bookmarks. Bookmarks are not saved", "Not Saved", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.Cancel) return; } - + ApplicationMode = AppMode.Clear; } else if (ApplicationMode == AppMode.New) @@ -488,7 +468,7 @@ namespace bzit.bomg { this.TopMost = !this.TopMost; } - + #endregion #region TreeView Menu - item @@ -521,10 +501,10 @@ namespace bzit.bomg /** * Node -> Delete */ - private void toolStripMenuItem6_Click(object sender, EventArgs e) - { - treeView1.DeleteNode(); - } + private void toolStripMenuItem6_Click(object sender, EventArgs e) => treeView1.SNode.Delete(); + //{ + // treeView1.DeleteNode(); + //} #endregion @@ -533,12 +513,12 @@ namespace bzit.bomg /** * Add Page */ - private void toolStripMenuItem15_Click(object sender, EventArgs e) { treeView1.AddBookmarkPage(); } + //private void toolStripMenuItem15_Click(object sender, EventArgs e) { treeView1.AddBookmarkPage(); } /** * Add Folder */ - private void toolStripMenuItem16_Click(object sender, EventArgs e) { treeView1.AddFolder(); } + //private void toolStripMenuItem16_Click(object sender, EventArgs e) => treeView1.SelectedNode = treeView1.SNode.AddFolder(); /** * Open All @@ -549,14 +529,14 @@ namespace bzit.bomg { return; } - + foreach (TreeNode tn in treeView1.SelectedNode.Nodes) { if (tn.Tag == null) { continue; } - + openBookmark(tn); } } @@ -573,20 +553,20 @@ namespace bzit.bomg /** * Move Up */ - private void toolStripMenuItem12_Click(object sender, EventArgs e) { treeView1.MoveNodeUp(); } + private void toolStripMenuItem12_Click(object sender, EventArgs e) => treeView1.SNode.MoveUp(); /** * Move Down */ - private void toolStripMenuItem13_Click(object sender, EventArgs e) { treeView1.MoveNodeDown(); } + private void toolStripMenuItem13_Click(object sender, EventArgs e) => treeView1.SNode.MoveDown(); /** * Sort */ - private void sortToolStripMenuItem_Click(object sender, EventArgs e) { treeView1.SortNode(); } + private void sortToolStripMenuItem_Click(object sender, EventArgs e) => treeView1.SNode.Sort(); #endregion - + protected void OpenBookmarkFile(string filename) { treeView1.HasChanged = false; @@ -618,7 +598,7 @@ namespace bzit.bomg protected bool SaveBookmarkFile() { bool rv = false; - + if (saveFileDialog.ShowDialog() == DialogResult.OK) { switch (saveFileDialog.FilterIndex) @@ -641,9 +621,9 @@ namespace bzit.bomg break; default: break; } - + } - + if (rv) { ApplicationMode = AppMode.Open; @@ -677,7 +657,7 @@ namespace bzit.bomg collapseAllViewMenuItem.Enabled = true; } } - + if (e.Button == MouseButtons.Right) { // folder @@ -714,7 +694,7 @@ namespace bzit.bomg { return; } - + switch (e.KeyCode) { case Keys.Apps: @@ -772,7 +752,7 @@ namespace bzit.bomg default: break; } } - + protected void openBookmark(TreeNode node) { if (node == null) @@ -789,13 +769,13 @@ namespace bzit.bomg { return; } - + BookmarkItem item = (BookmarkItem)node.Tag; if (item == null) { return; } - + if (string.IsNullOrEmpty(item.SiteAddress)) { return; @@ -843,6 +823,20 @@ namespace bzit.bomg break; } - } + } + + private void toolStripButton1_Click(object sender, EventArgs e) + { + BookmarkItemModel model = new BookmarkItemModel() + { + SiteAddress = "http://www.hiimray.co.uk", + TreeviewPath = @"\hello\momo\" + }; + model.Update(); + + treeView1.AddItem_OnSelectedNode(model.ToViewModel()); + + //MessageBox.Show(treeView1.Nodes.Count.ToString()); + } } } \ No newline at end of file diff --git a/MainForm.resx b/MainForm.resx index 5efc7db..bd3674e 100644 --- a/MainForm.resx +++ b/MainForm.resx @@ -131,7 +131,7 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADU - FwAAAk1TRnQBSQFMAgEBBwEAAWQBAgFkAQIBEAEAARABAAT/AREBAAj/AUIBTQE2BwABNgMAASgDAAFA + FwAAAk1TRnQBSQFMAgEBBwEAAWwBAgFsAQIBEAEAARABAAT/AREBAAj/AUIBTQE2BwABNgMAASgDAAFA AwABIAMAAQEBAAEQBgABEBQAAZkBSgEYAS4BtwEdAbcBGQG3ARkBtwEZAbcBGQG3ARkBtwEZAbcBGQG3 ARkBtwEdARcBLgGZAUoEAAGZAUoBGAEuAbcBHQG3ARkBtwEZAbcBGQG3ARkBtwEZAbcBGQG3ARkBtwEZ AbcBHQEXAS4BmQFKBAABmQFKARgBLgG3AR0BtwEZAbcBGQG3ARkBtwEZAbcBGQG3ARkBtwEZAbcBGQG3 @@ -268,15 +268,30 @@ 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 + TgDQASA1MVpwzwAAAABJRU5ErkJggg== diff --git a/Models/BookmarkItemModel.cs b/Models/BookmarkItemModel.cs new file mode 100644 index 0000000..aa1f427 --- /dev/null +++ b/Models/BookmarkItemModel.cs @@ -0,0 +1,314 @@ +using bzit.bomg.Models; +using HtmlAgilityPack; +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 + { + 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); + 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; + } + } + + protected string retrieveSourceCode() + { + WebClient webClient = new WebClient(); + webClient.CachePolicy = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.NoCacheNoStore); + + try + { + return webClient.DownloadString(this.SiteAddress); + } + catch + { + return null; + } + } + + //protected string encodePath(string text) => System.Web.HttpUtility.UrlEncode(text); + //protected string decodePath(string text) => System.Web.HttpUtility.UrlDecode(text); + + 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; + } + + 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); + } + + if (string.IsNullOrWhiteSpace(rs)) + { + rs = parseTagValue_Attr(doc, "//link[@rel='icon']", "href", string.Empty); + } + + if (string.IsNullOrWhiteSpace(rs)) + { + rs = parseTagValue_Attr(doc, "//link[@rel='apple-touch-icon']", "href", string.Empty); + } + + if (string.IsNullOrWhiteSpace(rs)) + { + rs = parseTagValue_Attr(doc, "//link[@rel='apple-touch-icon-precomposed']", "href", string.Empty); + } + + if (string.IsNullOrWhiteSpace(rs)) + { + rs = parseTagValue_Attr(doc, "//meta[@property='og:image']", "content", string.Empty); + } + + if (string.IsNullOrWhiteSpace(rs)) + { + rs = parseTagValue_Attr(doc, "//meta[@name='twitter:image']", "content", string.Empty); + } + + if (string.IsNullOrWhiteSpace(rs)) + { + rs = parseTagValue_Attr(doc, "//meta[@property='og:image']", "content", string.Empty); + } + + if (string.IsNullOrWhiteSpace(rs)) + { + rs = parseTagValue_Attr(doc, "//meta[@itemprop='image']", "content", string.Empty); + } + + return rs; + } + } +} \ No newline at end of file diff --git a/RyzStudio/String.cs b/RyzStudio/String.cs deleted file mode 100644 index c6c4510..0000000 --- a/RyzStudio/String.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using System.IO; -using System.Security.Cryptography; -using System.Text; - -namespace RyzStudio -{ - public class String - { - public static string EncodeTo64(string value) - { - try - { - byte[] toEncodeAsBytes = System.Text.ASCIIEncoding.ASCII.GetBytes(value); - return System.Convert.ToBase64String(toEncodeAsBytes); - } - catch - { - return string.Empty; - } - } - - public static string DecodeFrom64(string value) - { - try - { - byte[] encodedDataAsBytes = System.Convert.FromBase64String(value); - return System.Text.ASCIIEncoding.ASCII.GetString(encodedDataAsBytes); - } - catch - { - return string.Empty; - } - } - } -} \ No newline at end of file diff --git a/RyzStudio/Windows/Forms/MovableTreeView.cs b/RyzStudio/Windows/Forms/MovableTreeView.cs index 40d1c8d..a2f9f6b 100644 --- a/RyzStudio/Windows/Forms/MovableTreeView.cs +++ b/RyzStudio/Windows/Forms/MovableTreeView.cs @@ -7,25 +7,36 @@ namespace RyzStudio.Windows.Forms { public class MovableTreeView : System.Windows.Forms.TreeView { + public enum IconSet + { + Root = 0, + Folder1, + Folder2, + Default + } + + public MovableTreeViewSelectedNode SNode { get; set; } + public delegate void NodeCountUpdated(ulong v); public EventHandler OnChanged = null; public NodeCountUpdated OnNodeCountUpdate = null; protected const char pathSeparator = '|'; - protected const int folderImageIndex = 1; - protected const int folderSelectedImageIndex = 2; + //protected const int folderImageIndex = 1; + //protected const int folderSelectedImageIndex = 2; - protected TreeNode draggingNode = null; + protected TreeNode draggingNode = null; protected bool allowBeginEdit = false; //// public int[] folderImageIndex = { 1, 2 }; protected ulong nodeCount = 0; protected bool hasChanged = false; - + public MovableTreeView() { + this.SNode = new MovableTreeViewSelectedNode(this); } - + #region public properties /* [Category("Data")] @@ -45,35 +56,35 @@ namespace RyzStudio.Windows.Forms { return rv; } - + foreach (TreeNode tn in this.Nodes) { traverseNodeList(ref rv, tn); } - + return rv; } } - [Browsable(false)] - public string[] NodeNameList - { - get - { - string[] rv = new string[0]; - if (this.Nodes.Count <= 0) - { - return rv; - } - - foreach (TreeNode tn in this.Nodes) - { - traverseNodeNameList(ref rv, tn); - } - - return rv; - } - } + //[Browsable(false)] + //public string[] NodeNameList + //{ + // get + // { + // string[] rv = new string[0]; + // if (this.Nodes.Count <= 0) + // { + // return rv; + // } + + // foreach (TreeNode tn in this.Nodes) + // { + // traverseNodeNameList(ref rv, tn); + // } + + // return rv; + // } + //} [Browsable(false)] public ulong NodeCount @@ -94,12 +105,12 @@ namespace RyzStudio.Windows.Forms { return rv; } - + foreach (TreeNode tn in this.Nodes) { traverseNodeCount(ref rv, tn); } - + return rv; } } @@ -112,119 +123,119 @@ namespace RyzStudio.Windows.Forms { hasChanged = value; - OnChanged?.Invoke(null, null); + OnChanged?.Invoke(null, null); } } #endregion - + #region public methods - public TreeNode AddFolder() - { - return this.AddFolder("New Folder " + (new Random()).Next(10001, 99999).ToString()); - } + //public TreeNode AddFolder() + //{ + // return this.AddFolder("New Folder " + (new Random()).Next(10001, 99999).ToString()); + //} - public TreeNode AddFolder(string name) - { - if (this.SelectedNode == null) - { - return null; - } + //public TreeNode AddFolder(string name) + //{ + // if (this.SelectedNode == null) + // { + // return null; + // } - if (this.SelectedNode.Tag != null) - { - return null; - } - - this.HasChanged = true; - - TreeNode tn = this.SelectedNode.Nodes.Add(PathEncode(name), name, folderImageIndex, folderSelectedImageIndex); - this.SelectedNode = tn; - - OnAddFolderNode(tn); + // if (this.SelectedNode.Tag != null) + // { + // return null; + // } - return tn; - } + // this.HasChanged = true; - public TreeNode AddBookmarkPage() - { - return this.AddBookmarkPage("New Page " + (new Random()).Next(10001, 99999).ToString()); - } + // TreeNode tn = this.SelectedNode.Nodes.Add(PathEncode(name), name, folderImageIndex, folderSelectedImageIndex); + // this.SelectedNode = tn; - public TreeNode AddBookmarkPage(string name, int icon = 3) - { - if (this.SelectedNode == null) - { - return null; - } + // OnAddFolderNode(tn); - if (this.SelectedNode.Tag != null) - { - return null; - } + // return tn; + //} - this.HasChanged = true; - - TreeNode tn = this.SelectedNode.Nodes.Add(PathEncode(name), name, icon, icon); - tn.Tag = new object(); - tn.ToolTipText = name; - - nodeCount++; - NodeCountUpdate(nodeCount); - - this.SelectedNode = tn; - - OnAddItemNode(tn); - return tn; - } + //public TreeNode AddBookmarkPage() + //{ + // return this.AddBookmarkPage("New Page " + (new Random()).Next(10001, 99999).ToString()); + //} - public TreeNode AddBookmarkPageFullPath(string name, int icon = 3) - { - if (this.Nodes.Count <= 0) - { - return null; - } + //public TreeNode AddBookmarkPage(string name, int icon = 3) + //{ + // if (this.SelectedNode == null) + // { + // return null; + // } + + // if (this.SelectedNode.Tag != null) + // { + // return null; + // } + + // this.HasChanged = true; + + // TreeNode tn = this.SelectedNode.Nodes.Add(PathEncode(name), name, icon, icon); + // tn.Tag = new object(); + // tn.ToolTipText = name; + + // nodeCount++; + // NodeCountUpdate(nodeCount); + + // this.SelectedNode = tn; + + // OnAddItemNode(tn); + // return tn; + //} + + //public TreeNode AddBookmarkPageFullPath(string name, int icon = 3) + //{ + // if (this.Nodes.Count <= 0) + // { + // return null; + // } + + // this.HasChanged = true; + + // TreeNode tn2; + // if (!name.Contains(pathSeparator.ToString())) + // { + // tn2 = this.Nodes[0].Nodes.Add(name, PathDecode(name), icon, icon); + // tn2.ToolTipText = name; + // nodeCount++; + // } + // else + // { + // tn2 = this.Nodes[0]; + // string[] folders = name.Split(pathSeparator); + // for (int x = 0; x < (folders.Length - 1); x++) + // { + // string dr = folders[x].Trim(); + // if (tn2.Nodes.ContainsKey(dr)) + // { + // tn2 = tn2.Nodes[dr]; + // } + // else + // { + // tn2 = tn2.Nodes.Add(dr, PathDecode(dr), folderImageIndex, folderSelectedImageIndex); + // } + // } + + // string tm = folders[(folders.Length - 1)].Trim(); + // tn2 = tn2.Nodes.Add(tm, PathDecode(tm), icon, icon); + // tn2.Tag = new object(); + // tn2.ToolTipText = tm; + + // nodeCount++; + // } + + // NodeCountUpdate(nodeCount); + + // return tn2; + //} - this.HasChanged = true; - - TreeNode tn2; - if (!name.Contains(pathSeparator.ToString())) - { - tn2 = this.Nodes[0].Nodes.Add(name, PathDecode(name), icon, icon); - tn2.ToolTipText = name; - nodeCount++; - } - else - { - tn2 = this.Nodes[0]; - string[] folders = name.Split(pathSeparator); - for (int x = 0; x < (folders.Length - 1); x++) - { - string dr = folders[x].Trim(); - if (tn2.Nodes.ContainsKey(dr)) - { - tn2 = tn2.Nodes[dr]; - } - else - { - tn2 = tn2.Nodes.Add(dr, PathDecode(dr), folderImageIndex, folderSelectedImageIndex); - } - } - - string tm = folders[(folders.Length - 1)].Trim(); - tn2 = tn2.Nodes.Add(tm, PathDecode(tm), icon, icon); - tn2.Tag = new object(); - tn2.ToolTipText = tm; - - nodeCount++; - } - - NodeCountUpdate(nodeCount); - - return tn2; - } - public void EditNode() { this.HasChanged = true; @@ -233,7 +244,7 @@ namespace RyzStudio.Windows.Forms { return; } - + if (!this.SelectedNode.IsEditing) { allowBeginEdit = true; @@ -241,114 +252,114 @@ namespace RyzStudio.Windows.Forms } } - public void DeleteNode() - { - if (this.SelectedNode == null) - { - return; - } + //public void DeleteNode() + //{ + // if (this.SelectedNode == null) + // { + // return; + // } - if (this.Nodes.Count <= 0) - { - return; - } + // if (this.Nodes.Count <= 0) + // { + // return; + // } - if (this.SelectedNode.Equals(this.Nodes[0])) - { - return; - } + // if (this.SelectedNode.Equals(this.Nodes[0])) + // { + // return; + // } - this.HasChanged = true; - - this.SelectedNode.Remove(); - - if (this.SelectedNode.Tag == null) - { - nodeCount = this.NodeCountCalc; - } - else - { - nodeCount--; - } + // this.HasChanged = true; - NodeCountUpdate(nodeCount); - } + // this.SelectedNode.Remove(); - public void SortNode() - { - TreeNode tn = this.SelectedNode; - string[] tnv = new string[0]; - TreeNode[] tna = new TreeNode[0]; + // if (this.SelectedNode.Tag == null) + // { + // nodeCount = this.NodeCountCalc; + // } + // else + // { + // nodeCount--; + // } - this.HasChanged = true; - - foreach (TreeNode tn2 in tn.Nodes) - { - Array.Resize(ref tna, (tna.Length + 1)); - tna[(tna.Length - 1)] = tn2; + // NodeCountUpdate(nodeCount); + //} - Array.Resize(ref tnv, (tnv.Length + 1)); - tnv[(tnv.Length - 1)] = tn2.Text; - } + //public void SortNode() + //{ + // TreeNode tn = this.SelectedNode; + // string[] tnv = new string[0]; + // TreeNode[] tna = new TreeNode[0]; - Array.Sort(tnv, tna); - - tn.Nodes.Clear(); - foreach (TreeNode tn2 in tna) - { - tn.Nodes.Add(tn2); - } - } + // this.HasChanged = true; - public void MoveNodeUp() - { - TreeNode tn = this.SelectedNode; - if (tn.Parent == null) - { - return; - } + // foreach (TreeNode tn2 in tn.Nodes) + // { + // Array.Resize(ref tna, (tna.Length + 1)); + // tna[(tna.Length - 1)] = tn2; - if (tn.Index == 0) - { - return; - } + // Array.Resize(ref tnv, (tnv.Length + 1)); + // tnv[(tnv.Length - 1)] = tn2.Text; + // } - this.HasChanged = true; - - int n = tn.Index - 1; + // Array.Sort(tnv, tna); - TreeNode tn1 = tn.Parent; - tn1.Nodes.Remove(tn); - tn1.Nodes.Insert(n, tn); - - this.SelectedNode = tn; - } + // tn.Nodes.Clear(); + // foreach (TreeNode tn2 in tna) + // { + // tn.Nodes.Add(tn2); + // } + //} - public void MoveNodeDown() - { - TreeNode tn = this.SelectedNode; - if (tn.Parent == null) - { - return; - } + //public void MoveNodeUp() + //{ + // TreeNode tn = this.SelectedNode; + // if (tn.Parent == null) + // { + // return; + // } - TreeNode tn1 = tn.Parent; + // if (tn.Index == 0) + // { + // return; + // } - this.HasChanged = true; + // this.HasChanged = true; - if (tn.Index >= (tn1.Nodes.Count - 1)) - { - return; - } - - int n = tn.Index + 1; + // int n = tn.Index - 1; + + // TreeNode tn1 = tn.Parent; + // tn1.Nodes.Remove(tn); + // tn1.Nodes.Insert(n, tn); + + // this.SelectedNode = tn; + //} + + //public void MoveNodeDown() + //{ + // TreeNode tn = this.SelectedNode; + // if (tn.Parent == null) + // { + // return; + // } + + // TreeNode tn1 = tn.Parent; + + // this.HasChanged = true; + + // 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; + //} - tn1.Nodes.Remove(tn); - tn1.Nodes.Insert(n, tn); - - this.SelectedNode = tn; - } - public string GetNodeFullPath(TreeNode node) { string rv = PathEncode(node.Text); @@ -367,10 +378,10 @@ namespace RyzStudio.Windows.Forms { break; } - + rv = PathEncode(tn.Text) + pathSeparator.ToString() + rv; } - + return rv; } @@ -385,7 +396,7 @@ namespace RyzStudio.Windows.Forms { return false; } - + bool rt = false; bool inclusive = false; TreeNode tn = node; @@ -395,7 +406,7 @@ namespace RyzStudio.Windows.Forms { break; } - + if (inclusive) { if (tn.Text.ToLower().Contains(term.ToLower())) @@ -406,7 +417,7 @@ namespace RyzStudio.Windows.Forms break; } } - + if (tn.Nodes.Count > 0) { tn = tn.Nodes[0]; @@ -440,7 +451,7 @@ namespace RyzStudio.Windows.Forms } } } - + return rt; } @@ -454,13 +465,13 @@ namespace RyzStudio.Windows.Forms } #endregion - + #region integrated behaviour protected override void OnItemDrag(ItemDragEventArgs e) { base.OnItemDrag(e); - + draggingNode = (TreeNode)e.Item; DoDragDrop(e.Item, DragDropEffects.Move); } @@ -480,7 +491,7 @@ namespace RyzStudio.Windows.Forms return; } - if (IsNodeChild(draggingNode, en)) + if (isNodeChild(draggingNode, en)) { return; } @@ -503,21 +514,21 @@ namespace RyzStudio.Windows.Forms 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))); } @@ -530,9 +541,9 @@ namespace RyzStudio.Windows.Forms } this.HasChanged = true; - + base.OnBeforeLabelEdit(e); - + if (e.Node == null) { e.CancelEdit = true; @@ -553,7 +564,7 @@ namespace RyzStudio.Windows.Forms protected override void OnAfterLabelEdit(NodeLabelEditEventArgs e) { base.OnAfterLabelEdit(e); - + if (e.Node.Tag == null) { if (e.Label == null) @@ -572,7 +583,7 @@ namespace RyzStudio.Windows.Forms { e.CancelEdit = true; } - + allowBeginEdit = false; } @@ -583,24 +594,24 @@ namespace RyzStudio.Windows.Forms { return; } - + switch (e.KeyCode) { case Keys.Insert: if (e.Modifiers == Keys.Shift) { - AddFolder(); + this.SelectedNode = this.SNode.AddFolder(); } else { - AddBookmarkPage(); + //##AddBookmarkPage(); } break; case Keys.Delete: if (!tn.IsEditing) { - this.DeleteNode(); + this.SNode.Delete(); } break; @@ -614,14 +625,14 @@ namespace RyzStudio.Windows.Forms case Keys.Up: if (e.Modifiers == Keys.Control) { - this.MoveNodeUp(); + this.SNode.MoveUp(); } break; case Keys.Down: if (e.Modifiers == Keys.Control) { - this.MoveNodeDown(); + this.SNode.MoveDown(); } break; @@ -638,9 +649,7 @@ namespace RyzStudio.Windows.Forms #endregion - #region internals - - protected bool IsNodeChild(TreeNode drag_node, TreeNode drop_node) + protected bool isNodeChild(TreeNode drag_node, TreeNode drop_node) { TreeNode tn = drop_node; while (true) @@ -677,21 +686,21 @@ namespace RyzStudio.Windows.Forms } } - protected void traverseNodeNameList(ref string[] results, TreeNode node) - { - foreach (TreeNode tn in node.Nodes) - { - if (tn.Tag == null) - { - traverseNodeNameList(ref results, tn); - } - else - { - Array.Resize(ref results, (results.Length + 1)); - results[(results.Length - 1)] = this.GetNodeFullPath(tn); - } - } - } + //protected void traverseNodeNameList(ref string[] results, TreeNode node) + //{ + // foreach (TreeNode tn in node.Nodes) + // { + // if (tn.Tag == null) + // { + // traverseNodeNameList(ref results, tn); + // } + // else + // { + // Array.Resize(ref results, (results.Length + 1)); + // results[(results.Length - 1)] = this.GetNodeFullPath(tn); + // } + // } + //} protected void traverseNodeCount(ref ulong results, TreeNode node) { @@ -707,20 +716,15 @@ namespace RyzStudio.Windows.Forms } } } - - #endregion - - #region public methods protected virtual void OnAddFolderNode(TreeNode node) { } protected virtual void OnAddItemNode(TreeNode node) { } - #endregion ////protected string PathEncode(string text) { return RyzStudio.String.EncodeTo64(text); } //protected string PathDecode(string text) { return RyzStudio.String.DecodeFrom64(text); } - protected string PathEncode(string text) { return System.Web.HttpUtility.UrlEncodeUnicode(text); } + protected string PathEncode(string text) { return System.Web.HttpUtility.UrlEncode(text); } protected string PathDecode(string text) { return System.Web.HttpUtility.UrlDecode(text); } } } \ No newline at end of file diff --git a/RyzStudio/Windows/Forms/MovableTreeViewSelectedNode.cs b/RyzStudio/Windows/Forms/MovableTreeViewSelectedNode.cs new file mode 100644 index 0000000..15e9440 --- /dev/null +++ b/RyzStudio/Windows/Forms/MovableTreeViewSelectedNode.cs @@ -0,0 +1,194 @@ +using System; +using System.Windows.Forms; + +namespace RyzStudio.Windows.Forms +{ + public class MovableTreeViewSelectedNode + { + protected MovableTreeView Treeview = null; + + public MovableTreeViewSelectedNode(MovableTreeView treeview) + { + Treeview = treeview; + } + + protected TreeNode SelectedNode { get => this.Treeview.SelectedNode; set => this.Treeview.SelectedNode = value; } + + protected string encodeName(string name) => Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(name)); + + public TreeNode AddFolder() + { + //return this.AddFolder("New Folder " + (new Random()).Next(10001, 99999).ToString()); + return this.AddFolder("New Folder (" + DateTime.Now.ToString("yyyy-MM-dd-HHmmss") + ")"); + } + + public TreeNode AddFolder(string name) + { + if (this.SelectedNode == null) + { + return null; + } + + if (this.SelectedNode.Tag != null) + { + return null; + } + + return this.SelectedNode.Nodes.Add(encodeName(name), name, (int)MovableTreeView.IconSet.Folder1, (int)MovableTreeView.IconSet.Folder2); + } + + 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)MovableTreeView.IconSet.Default, (int)MovableTreeView.IconSet.Default); + tn.Tag = tag; + + this.SelectedNode.Nodes.Add(tn); + + return tn; + } + + + //public TreeNode AddPage() => this.AddPage("New Page (" + DateTime.Now.ToString("yyyy-MM-dd-HHmmss") + ")"); + + //public TreeNode AddPage(string name) + //{ + // if (this.SelectedNode == null) + // { + // return null; + // } + + // if (this.SelectedNode.Tag != null) + // { + // return null; + // } + + // TreeNode tn = this.SelectedNode.Nodes.Add(encodeName(name), name, (int)MovableTreeView.IconSet.Default, (int)MovableTreeView.IconSet.Default); + // tn.Tag = new object(); + // tn.ToolTipText = name; + + // nodeCount++; + // NodeCountUpdate(nodeCount); + + // this.SelectedNode = tn; + + // OnAddItemNode(tn); + // return tn; + //} + + + public void Delete() + { + if (this.SelectedNode == null) + { + return; + } + + if (this.Treeview.Nodes.Count <= 0) + { + return; + } + + if (this.SelectedNode.Equals(this.Treeview.Nodes[0])) + { + return; + } + + this.SelectedNode.Remove(); + } + + 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/SessionFileFormat.cs b/SessionFileFormat.cs index d9d8fb0..24b57d3 100644 --- a/SessionFileFormat.cs +++ b/SessionFileFormat.cs @@ -13,10 +13,10 @@ namespace bzit.bomg base.CONST_STREAM_FILE_NAME = "bookmarks.xml"; base.CONST_KEYPASS = ""; base.enableErrorReporting = true; - + parentForm = parent_form; } - + protected override void loadFromXmlDocument(ref XmlDocument xml_doc) { XmlNodeList xnl = xml_doc.SelectNodes("bomg/b/g"); @@ -25,13 +25,13 @@ namespace bzit.bomg MessageBox.Show("No bookmarks found.", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } - + parentForm.treeView1.Clear(); - TreeNode tn = parentForm.treeView1.Nodes.Add("", xnl.Item(0).Attributes["name"].InnerText, 0, 0); + TreeNode tn = parentForm.treeView1.Nodes.Add("", xnl.Item(0).Attributes["name"].InnerText, 0, 0); foreach (XmlNode xn in xnl.Item(0)) { BookmarkItem bi = new BookmarkItem(); - + foreach (XmlNode xn2 in xn.ChildNodes) { switch (xn2.LocalName) @@ -51,10 +51,10 @@ namespace bzit.bomg default: break; } } - - parentForm.treeView1.AddBookmarkItem(bi.Fullpath, bi); + + //##parentForm.treeView1.AddBookmarkItem(bi.Fullpath, bi); } - + tn.Expand(); } @@ -64,18 +64,18 @@ namespace bzit.bomg { return; } - + writer.Formatting = Formatting.Indented; writer.WriteStartDocument(); writer.WriteStartElement(CONST_PRODUCT); writer.WriteStartElement("b"); writer.WriteStartElement("g"); writer.WriteAttributeString("name", parentForm.treeView1.Nodes[0].Text); - + foreach (TreeNode tn in parentForm.treeView1.NodeList) { BookmarkItem bi = (BookmarkItem)tn.Tag; - + writer.WriteStartElement("m"); writer.WriteElementString("name", parentForm.treeView1.GetNodeFullPath(tn)); writer.WriteElementString("address", bi.SiteAddress); @@ -83,7 +83,7 @@ namespace bzit.bomg writer.WriteElementString("created", bi.Created.ToString()); writer.WriteEndElement(); } - + writer.WriteEndElement(); writer.WriteEndElement(); writer.WriteEndElement(); diff --git a/UpdateIconForm.cs b/UpdateIconForm.cs index e8dbec9..05830dd 100644 --- a/UpdateIconForm.cs +++ b/UpdateIconForm.cs @@ -108,7 +108,7 @@ namespace bzit.bomg continue; } - parentForm.treeView1.AddIcon(bookmarkItem); + //##parentForm.treeView1.AddIcon(bookmarkItem); } } diff --git a/ViewModels/BookmarkItemViewModel.cs b/ViewModels/BookmarkItemViewModel.cs new file mode 100644 index 0000000..f05f934 --- /dev/null +++ b/ViewModels/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/bomg.csproj b/bomg.csproj index dabf678..7c502d1 100644 --- a/bomg.csproj +++ b/bomg.csproj @@ -96,6 +96,9 @@ + + + Form @@ -142,7 +145,6 @@ - UserControl @@ -245,7 +247,9 @@ true - + + + From 35eb3a92aee4471387593bc6a5236c4765778fa8 Mon Sep 17 00:00:00 2001 From: Ray Date: Thu, 18 Apr 2019 21:04:58 +0100 Subject: [PATCH 02/34] WIP: rebuild context menu functionality --- .gitignore | 3 +- BookmarkEditForm.Designer.cs | 387 ++++++----- BookmarkEditForm.cs | 243 ++++--- BookmarkEditForm.resx | 27 +- BookmarkItem.cs | 26 +- BookmarkTreeView.cs | 198 ------ MainForm.Designer.cs | 403 ++++++------ MainForm.cs | 378 +++++++---- MainForm.resx | 57 +- RyzStudio/Drawing/Rectangoid.cs | 184 ++++-- .../Forms/HorizontalSeparator.Designer.cs | 37 ++ .../Windows/Forms/HorizontalSeparator.cs | 25 + RyzStudio/Windows/ThemedForms/Button.cs | 104 +++ .../Windows/ThemedForms/Button.designer.cs | 61 ++ RyzStudio/Windows/ThemedForms/Button.resx | 120 ++++ RyzStudio/Windows/ThemedForms/ButtonState.cs | 9 + RyzStudio/Windows/ThemedForms/ButtonStyle.cs | 25 + .../Windows/ThemedForms/Form.Designer.cs | 52 ++ RyzStudio/Windows/ThemedForms/Form.cs | 186 ++++++ RyzStudio/Windows/ThemedForms/Form.resx | 120 ++++ RyzStudio/Windows/ThemedForms/MemoBox.cs | 58 ++ .../Windows/ThemedForms/MemoBox.designer.cs | 63 ++ RyzStudio/Windows/ThemedForms/MemoBox.resx | 120 ++++ .../ThemedForms/ProgressBar.Designer.cs | 72 ++ RyzStudio/Windows/ThemedForms/ProgressBar.cs | 29 + .../Windows/ThemedForms/ProgressBar.resx | 120 ++++ .../ThemedForms/ProgressBarInner.Designer.cs | 63 ++ .../Windows/ThemedForms/ProgressBarInner.cs | 197 ++++++ .../Windows/ThemedForms/ProgressBarInner.resx | 120 ++++ RyzStudio/Windows/ThemedForms/TextBox.cs | 58 ++ .../Windows/ThemedForms/TextBox.designer.cs | 60 ++ RyzStudio/Windows/ThemedForms/TextBox.resx | 120 ++++ RyzStudio/Windows/ThemedForms/ThemeStyle.cs | 34 + RyzStudio/Windows/ThemedForms/ThreadHelper.cs | 51 ++ RyzStudio/Windows/ThemedForms/UserControl.cs | 53 ++ .../ThemedForms/UserControl.designer.cs | 37 ++ .../Forms/BookmarkTreeView.cs | 618 +++++++++--------- .../Forms/BookmarkTreeViewSNode.cs | 90 ++- bomg.csproj | 80 ++- 39 files changed, 3377 insertions(+), 1311 deletions(-) create mode 100644 RyzStudio/Windows/Forms/HorizontalSeparator.Designer.cs create mode 100644 RyzStudio/Windows/Forms/HorizontalSeparator.cs create mode 100644 RyzStudio/Windows/ThemedForms/Button.cs create mode 100644 RyzStudio/Windows/ThemedForms/Button.designer.cs create mode 100644 RyzStudio/Windows/ThemedForms/Button.resx create mode 100644 RyzStudio/Windows/ThemedForms/ButtonState.cs create mode 100644 RyzStudio/Windows/ThemedForms/ButtonStyle.cs create mode 100644 RyzStudio/Windows/ThemedForms/Form.Designer.cs create mode 100644 RyzStudio/Windows/ThemedForms/Form.cs create mode 100644 RyzStudio/Windows/ThemedForms/Form.resx create mode 100644 RyzStudio/Windows/ThemedForms/MemoBox.cs create mode 100644 RyzStudio/Windows/ThemedForms/MemoBox.designer.cs create mode 100644 RyzStudio/Windows/ThemedForms/MemoBox.resx create mode 100644 RyzStudio/Windows/ThemedForms/ProgressBar.Designer.cs create mode 100644 RyzStudio/Windows/ThemedForms/ProgressBar.cs create mode 100644 RyzStudio/Windows/ThemedForms/ProgressBar.resx create mode 100644 RyzStudio/Windows/ThemedForms/ProgressBarInner.Designer.cs create mode 100644 RyzStudio/Windows/ThemedForms/ProgressBarInner.cs create mode 100644 RyzStudio/Windows/ThemedForms/ProgressBarInner.resx create mode 100644 RyzStudio/Windows/ThemedForms/TextBox.cs create mode 100644 RyzStudio/Windows/ThemedForms/TextBox.designer.cs create mode 100644 RyzStudio/Windows/ThemedForms/TextBox.resx create mode 100644 RyzStudio/Windows/ThemedForms/ThemeStyle.cs create mode 100644 RyzStudio/Windows/ThemedForms/ThreadHelper.cs create mode 100644 RyzStudio/Windows/ThemedForms/UserControl.cs create mode 100644 RyzStudio/Windows/ThemedForms/UserControl.designer.cs rename RyzStudio/Windows/Forms/MovableTreeView.cs => Windows/Forms/BookmarkTreeView.cs (55%) rename RyzStudio/Windows/Forms/MovableTreeViewSelectedNode.cs => Windows/Forms/BookmarkTreeViewSNode.cs (67%) diff --git a/.gitignore b/.gitignore index be8a03f..8198594 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,5 @@ -/skye.sln /bomg.csproj.user /bin /obj /packages -/.vs/skye/v14/*.suo +/.vs diff --git a/BookmarkEditForm.Designer.cs b/BookmarkEditForm.Designer.cs index 8ad9413..f9c7c92 100644 --- a/BookmarkEditForm.Designer.cs +++ b/BookmarkEditForm.Designer.cs @@ -28,197 +28,224 @@ namespace bzit.bomg /// private void InitializeComponent() { - this.components = new System.ComponentModel.Container(); - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(BookmarkEditForm)); - this.label1 = new System.Windows.Forms.Label(); - this.tbxAddress = new System.Windows.Forms.TextBox(); - this.tbxName = new System.Windows.Forms.TextBox(); - this.label2 = new System.Windows.Forms.Label(); - this.tbxDescription = new System.Windows.Forms.TextBox(); - this.oToolTip = new System.Windows.Forms.ToolTip(this.components); - this.label3 = new System.Windows.Forms.Label(); - this.pbxIcon = new System.Windows.Forms.PictureBox(); - this.pictureBox1 = new System.Windows.Forms.PictureBox(); - this.button1 = new RyzStudio.Windows.Forms.BigButton(); - this.btnSave = new RyzStudio.Windows.Forms.BigButton(); - ((System.ComponentModel.ISupportInitialize)(this.pbxIcon)).BeginInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); - this.SuspendLayout(); - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(12, 12); - this.label1.Margin = new System.Windows.Forms.Padding(3); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(39, 13); - this.label1.TabIndex = 0; - this.label1.Text = "Name:"; - // - // tbxAddress - // - this.tbxAddress.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + this.components = new System.ComponentModel.Container(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.toolTip1 = new System.Windows.Forms.ToolTip(this.components); + this.label3 = new System.Windows.Forms.Label(); + this.pictureBox2 = new System.Windows.Forms.PictureBox(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.button2 = new RyzStudio.Windows.ThemedForms.Button(); + this.button1 = new RyzStudio.Windows.ThemedForms.Button(); + this.label5 = new System.Windows.Forms.Label(); + this.horizontalSeparator1 = new RyzStudio.Windows.Forms.HorizontalSeparator(); + this.textBox1 = new RyzStudio.Windows.ThemedForms.TextBox(); + this.textBox2 = new RyzStudio.Windows.ThemedForms.TextBox(); + this.memoBox1 = new RyzStudio.Windows.ThemedForms.MemoBox(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.SuspendLayout(); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(12, 25); + this.label1.Margin = new System.Windows.Forms.Padding(3); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(28, 13); + this.label1.TabIndex = 0; + this.label1.Text = "Title"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(12, 69); + this.label2.Margin = new System.Windows.Forms.Padding(3); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(48, 13); + this.label2.TabIndex = 4; + this.label2.Text = "Address"; + // + // toolTip1 + // + this.toolTip1.Active = false; + this.toolTip1.BackColor = System.Drawing.Color.IndianRed; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(12, 113); + this.label3.Margin = new System.Windows.Forms.Padding(3); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(66, 13); + this.label3.TabIndex = 55; + this.label3.Text = "Description"; + // + // pictureBox2 + // + this.pictureBox2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.pictureBox2.BackColor = System.Drawing.SystemColors.Window; + this.pictureBox2.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; + this.pictureBox2.ErrorImage = null; + this.pictureBox2.InitialImage = null; + this.pictureBox2.Location = new System.Drawing.Point(368, 15); + this.pictureBox2.Name = "pictureBox2"; + this.pictureBox2.Size = new System.Drawing.Size(32, 32); + this.pictureBox2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage; + this.pictureBox2.TabIndex = 57; + this.pictureBox2.TabStop = false; + // + // pictureBox1 + // + this.pictureBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | 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.InitialImage = null; + this.pictureBox1.Location = new System.Drawing.Point(287, 237); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(32, 32); + this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage; + this.pictureBox1.TabIndex = 60; + this.pictureBox1.TabStop = false; + // + // button2 + // + this.button2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.button2.BackColor = System.Drawing.Color.Transparent; + this.button2.DefaultImage = null; + this.button2.DownImage = null; + this.button2.LabelText = "&Save"; + this.button2.Location = new System.Drawing.Point(325, 237); + this.button2.Name = "button2"; + this.button2.OverImage = null; + this.button2.Padding = new System.Windows.Forms.Padding(4, 4, 3, 3); + this.button2.Size = new System.Drawing.Size(107, 32); + this.button2.TabIndex = 4; + this.button2.Click += new System.EventHandler(this.button2_Click); + // + // button1 + // + this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.button1.BackColor = System.Drawing.Color.Transparent; + this.button1.DefaultImage = null; + this.button1.DownImage = null; + this.button1.LabelText = "S&can"; + this.button1.Location = new System.Drawing.Point(368, 59); + 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(64, 32); + this.button1.TabIndex = 2; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // label5 + // + this.label5.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.tbxAddress.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(51)))), ((int)(((byte)(51)))), ((int)(((byte)(51))))); - this.tbxAddress.Location = new System.Drawing.Point(12, 78); - this.tbxAddress.MaxLength = 4096; - this.tbxAddress.Name = "tbxAddress"; - this.tbxAddress.Size = new System.Drawing.Size(240, 22); - this.tbxAddress.TabIndex = 1; - this.tbxAddress.PreviewKeyDown += new System.Windows.Forms.PreviewKeyDownEventHandler(this.textBox_PreviewKeyDown); - // - // tbxName - // - this.tbxName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + this.label5.ForeColor = System.Drawing.Color.OrangeRed; + this.label5.Location = new System.Drawing.Point(9, 237); + this.label5.Margin = new System.Windows.Forms.Padding(3); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(272, 32); + this.label5.TabIndex = 64; + this.label5.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // horizontalSeparator1 + // + this.horizontalSeparator1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.tbxName.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(51)))), ((int)(((byte)(51)))), ((int)(((byte)(51))))); - this.tbxName.Location = new System.Drawing.Point(12, 31); - this.tbxName.MaxLength = 4096; - this.tbxName.Name = "tbxName"; - this.tbxName.Size = new System.Drawing.Size(212, 22); - this.tbxName.TabIndex = 0; - this.tbxName.PreviewKeyDown += new System.Windows.Forms.PreviewKeyDownEventHandler(this.textBox_PreviewKeyDown); - // - // label2 - // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(12, 59); - this.label2.Margin = new System.Windows.Forms.Padding(3); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(51, 13); - this.label2.TabIndex = 4; - this.label2.Text = "Address:"; - // - // tbxDescription - // - this.tbxDescription.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + this.horizontalSeparator1.Location = new System.Drawing.Point(12, 222); + this.horizontalSeparator1.Margin = new System.Windows.Forms.Padding(3, 10, 3, 10); + this.horizontalSeparator1.MaximumSize = new System.Drawing.Size(4920, 2); + this.horizontalSeparator1.Name = "horizontalSeparator1"; + this.horizontalSeparator1.Size = new System.Drawing.Size(420, 2); + this.horizontalSeparator1.TabIndex = 65; + // + // textBox1 + // + this.textBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.tbxDescription.BackColor = System.Drawing.SystemColors.Window; - this.tbxDescription.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(51)))), ((int)(((byte)(51)))), ((int)(((byte)(51))))); - this.tbxDescription.Location = new System.Drawing.Point(12, 125); - this.tbxDescription.MaxLength = 4096; - this.tbxDescription.Multiline = true; - this.tbxDescription.Name = "tbxDescription"; - this.tbxDescription.Size = new System.Drawing.Size(240, 84); - this.tbxDescription.TabIndex = 2; - this.tbxDescription.PreviewKeyDown += new System.Windows.Forms.PreviewKeyDownEventHandler(this.textBox_PreviewKeyDown); - // - // oToolTip - // - this.oToolTip.Active = false; - this.oToolTip.BackColor = System.Drawing.Color.IndianRed; - // - // label3 - // - this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(12, 106); - this.label3.Margin = new System.Windows.Forms.Padding(3); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(69, 13); - this.label3.TabIndex = 55; - this.label3.Text = "Description:"; - // - // pbxIcon - // - this.pbxIcon.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.pbxIcon.BackColor = System.Drawing.SystemColors.Window; - this.pbxIcon.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; - this.pbxIcon.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; - this.pbxIcon.ErrorImage = null; - this.pbxIcon.InitialImage = null; - this.pbxIcon.Location = new System.Drawing.Point(230, 31); - this.pbxIcon.Name = "pbxIcon"; - this.pbxIcon.Size = new System.Drawing.Size(22, 22); - this.pbxIcon.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage; - this.pbxIcon.TabIndex = 57; - this.pbxIcon.TabStop = false; - // - // pictureBox1 - // - this.pictureBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.pictureBox1.BackColor = System.Drawing.Color.Transparent; - this.pictureBox1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; - this.pictureBox1.ErrorImage = null; - this.pictureBox1.InitialImage = null; - this.pictureBox1.Location = new System.Drawing.Point(12, 227); - this.pictureBox1.Name = "pictureBox1"; - this.pictureBox1.Size = new System.Drawing.Size(32, 32); - this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage; - this.pictureBox1.TabIndex = 60; - this.pictureBox1.TabStop = 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.WhiteSmoke; - this.button1.Location = new System.Drawing.Point(118, 227); - this.button1.MaximumSize = new System.Drawing.Size(120, 32); - this.button1.MinimumSize = new System.Drawing.Size(32, 32); - this.button1.Name = "button1"; - this.button1.Padding = new System.Windows.Forms.Padding(4); - this.button1.Size = new System.Drawing.Size(32, 32); - this.button1.TabIndex = 3; - this.button1.Value = ""; - this.button1.Click += new System.EventHandler(this.btnRetrievePage_Click); - // - // btnSave - // - this.btnSave.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.btnSave.BackColor = System.Drawing.Color.WhiteSmoke; - this.btnSave.Location = new System.Drawing.Point(156, 227); - this.btnSave.MaximumSize = new System.Drawing.Size(120, 32); - this.btnSave.MinimumSize = new System.Drawing.Size(32, 32); - this.btnSave.Name = "btnSave"; - this.btnSave.Padding = new System.Windows.Forms.Padding(4); - this.btnSave.Size = new System.Drawing.Size(96, 32); - this.btnSave.TabIndex = 4; - this.btnSave.Value = "&OK"; - this.btnSave.Click += new System.EventHandler(this.btnSave_Click); - // - // BookmarkEditForm - // - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; - this.BackColor = System.Drawing.Color.White; - this.ClientSize = new System.Drawing.Size(264, 271); - this.Controls.Add(this.button1); - this.Controls.Add(this.pictureBox1); - this.Controls.Add(this.pbxIcon); - this.Controls.Add(this.tbxDescription); - this.Controls.Add(this.label3); - this.Controls.Add(this.tbxName); - this.Controls.Add(this.label1); - this.Controls.Add(this.tbxAddress); - this.Controls.Add(this.btnSave); - this.Controls.Add(this.label2); - this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "BookmarkEditForm"; - this.ShowInTaskbar = false; - this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Edit Bookmark"; - ((System.ComponentModel.ISupportInitialize)(this.pbxIcon)).EndInit(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); - this.ResumeLayout(false); - this.PerformLayout(); + this.textBox1.BackColor = System.Drawing.Color.Transparent; + this.textBox1.Location = new System.Drawing.Point(96, 15); + 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(259, 32); + this.textBox1.TabIndex = 66; + // + // 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.Location = new System.Drawing.Point(96, 59); + 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(259, 32); + this.textBox2.TabIndex = 67; + // + // memoBox1 + // + this.memoBox1.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.memoBox1.BackColor = System.Drawing.Color.Transparent; + this.memoBox1.Location = new System.Drawing.Point(96, 103); + this.memoBox1.Margin = new System.Windows.Forms.Padding(10, 6, 10, 6); + this.memoBox1.Name = "memoBox1"; + this.memoBox1.Padding = new System.Windows.Forms.Padding(10, 10, 3, 9); + this.memoBox1.Size = new System.Drawing.Size(336, 103); + this.memoBox1.TabIndex = 69; + // + // BookmarkEditForm + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.BackColor = System.Drawing.Color.White; + this.ClientSize = new System.Drawing.Size(444, 281); + this.Controls.Add(this.memoBox1); + this.Controls.Add(this.textBox2); + this.Controls.Add(this.textBox1); + this.Controls.Add(this.horizontalSeparator1); + this.Controls.Add(this.label5); + this.Controls.Add(this.button1); + this.Controls.Add(this.button2); + this.Controls.Add(this.pictureBox1); + this.Controls.Add(this.pictureBox2); + this.Controls.Add(this.label3); + this.Controls.Add(this.label1); + this.Controls.Add(this.label2); + this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "BookmarkEditForm"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Edit Bookmark"; + ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); } #endregion private System.Windows.Forms.Label label1; - private System.Windows.Forms.TextBox tbxAddress; - private System.Windows.Forms.TextBox tbxName; private System.Windows.Forms.Label label2; - private System.Windows.Forms.TextBox tbxDescription; - private System.Windows.Forms.ToolTip oToolTip; - private RyzStudio.Windows.Forms.BigButton btnSave; + private System.Windows.Forms.ToolTip toolTip1; private System.Windows.Forms.Label label3; - private System.Windows.Forms.PictureBox pbxIcon; + private System.Windows.Forms.PictureBox pictureBox2; private System.Windows.Forms.PictureBox pictureBox1; - private RyzStudio.Windows.Forms.BigButton button1; + private RyzStudio.Windows.ThemedForms.Button button2; + private RyzStudio.Windows.ThemedForms.Button button1; + private System.Windows.Forms.Label label5; + private RyzStudio.Windows.Forms.HorizontalSeparator horizontalSeparator1; + private RyzStudio.Windows.ThemedForms.TextBox textBox1; + private RyzStudio.Windows.ThemedForms.TextBox textBox2; + private RyzStudio.Windows.ThemedForms.MemoBox memoBox1; } } \ No newline at end of file diff --git a/BookmarkEditForm.cs b/BookmarkEditForm.cs index 133fc99..a3bd390 100644 --- a/BookmarkEditForm.cs +++ b/BookmarkEditForm.cs @@ -1,192 +1,225 @@ +using bzit.bomg.Models; +using RyzStudio.Windows.Forms; +using RyzStudio.Windows.ThemedForms; using System; using System.ComponentModel; using System.Windows.Forms; +using Form = System.Windows.Forms.Form; +using Resources = bzit.bomg.Properties.Resources; namespace bzit.bomg { public partial class BookmarkEditForm : Form { - private TreeNode parentNode = null; - private BookmarkItem bookmarkItem; - private bool isWorking = false; + protected BackgroundWorker threadWorker1 = null; - public BookmarkEditForm(ref TreeNode node) + protected BookmarkItemModel itemModel = null; + protected BookmarkTreeView treeView = null; + //protected TreeNode treeNode = null; + + //public BookmarkEditForm(ref TreeNode node) : base() + public BookmarkEditForm(BookmarkTreeView treeview) : base() { InitializeComponent(); - parentNode = node; + treeView = treeview; + + //treeNode = node; this.StartPosition = FormStartPosition.WindowsDefaultLocation; + + if (threadWorker1 == null) + { + threadWorker1 = new BackgroundWorker(); + threadWorker1.WorkerReportsProgress = threadWorker1.WorkerSupportsCancellation = true; + threadWorker1.DoWork += threadWorker1_DoWork; + threadWorker1.RunWorkerCompleted += threadWorker1_RunWorkerCompleted; + } } - protected override void OnLoad(EventArgs e) + protected void threadWorker1_DoWork(object sender, DoWorkEventArgs e) { - base.OnLoad(e); + if (itemModel == null) + { + itemModel = new BookmarkItemModel(); + } - button1.Button.Image = Properties.Resources.magnifier; + itemModel.SiteAddress = textBox2.Text; + + bool rv = itemModel.Update(); + if (rv) + { + ThreadHelper.SetText(textBox1, itemModel.SiteName); + ThreadHelper.SetText(textBox2, itemModel.SiteAddress); + ThreadHelper.SetText(memoBox1, itemModel.SiteDescription); + ThreadHelper.SetImage(pictureBox2, itemModel.RetrieveFavicon()); + } + } + + protected void threadWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) + { + this.IsBusy = false; } protected override void OnShown(EventArgs e) { base.OnShown(e); - if (parentNode.Tag != null) + if (treeView.SNode.GetNodeType() == BookmarkTreeView.NodeType.Page) { - if (parentNode.Tag is BookmarkItem) + BookmarkItemViewModel bookmarkItem = (BookmarkItemViewModel)treeView.SelectedNode.Tag; + if (bookmarkItem != null) { - bookmarkItem = (BookmarkItem)parentNode.Tag; - tbxName.Text = bookmarkItem.GetName(); - tbxAddress.Text = bookmarkItem.SiteAddress; - tbxDescription.Text = bookmarkItem.Description; - - if (parentNode.TreeView.ImageList != null) + if (itemModel == null) { - if (parentNode.ImageIndex >= 0) - { - pbxIcon.Image = parentNode.TreeView.ImageList.Images[parentNode.ImageIndex]; - } - else - { - pbxIcon.Image = parentNode.TreeView.ImageList.Images[parentNode.ImageKey]; - } + itemModel = new BookmarkItemModel(); } + + updateViewModel(bookmarkItem); } } + + + //if (parentNode.Tag != null) + //{ + // if (parentNode.Tag is BookmarkItem) + // { + // bookmarkItem = (BookmarkItem)parentNode.Tag; + // tbxName.Text = bookmarkItem.GetName(); + // tbxAddress.Text = bookmarkItem.SiteAddress; + // tbxDescription.Text = bookmarkItem.Description; + + // if (parentNode.TreeView.ImageList != null) + // { + // if (parentNode.ImageIndex >= 0) + // { + // pbxIcon.Image = parentNode.TreeView.ImageList.Images[parentNode.ImageIndex]; + // } + // else + // { + // pbxIcon.Image = parentNode.TreeView.ImageList.Images[parentNode.ImageKey]; + // } + // } + // } + //} } protected override void OnClosing(CancelEventArgs e) { base.OnClosing(e); - if (this.IsWorking) + if (this.IsBusy) { e.Cancel = true; } } - public bool IsWorking + protected bool IsBusy { - get { return isWorking; } + get => threadWorker1.IsBusy; set { - isWorking = value; + textBox1.Enabled = textBox2.Enabled = memoBox1.Enabled = !value; - tbxName.Enabled = tbxAddress.Enabled = tbxDescription.Enabled = !value; - btnSave.Enabled = !value; - button1.Enabled = !value; - - pictureBox1.Image = (value) ? Properties.Resources.aniZomq2x32 : null; + pictureBox1.Image = (value) ? Resources.aniZomq2x32 : null; } } - private void textBox_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) + protected void updateViewModel(BookmarkItemViewModel viewModel) { - if (this.IsWorking) - { - return; - } + itemModel.SiteName = viewModel.SiteName?.Trim(); + itemModel.SiteAddress = viewModel.SiteAddress?.Trim(); + itemModel.SiteDescription = viewModel.SiteDescription?.Trim(); + itemModel.FaviconAddress = viewModel.FaviconAddress?.Trim(); - if (e.KeyCode == Keys.Escape) - { - this.Close(); - } + textBox1.Text = itemModel.SiteName; + textBox2.Text = itemModel.SiteAddress; + memoBox1.Text = itemModel.SiteDescription; + pictureBox2.Image = treeView.ImageList.Images[treeView.SelectedNode.ImageIndex]; } - private void btnRetrievePage_Click(object sender, EventArgs e) + private void button1_Click(object sender, EventArgs e) { - if (this.IsWorking) + if (this.IsBusy) { return; } - if (string.IsNullOrWhiteSpace(tbxAddress.Text)) + if (string.IsNullOrWhiteSpace(textBox2.Text)) { return; } - this.IsWorking = true; - oToolTip.SetToolTip(pictureBox1, ""); + this.IsBusy = true; - BookmarkItem bi = new BookmarkItem(); - bi.OnRetrieveCompleted += bookmarkItem_OnRetrieveCompleted; - bi.RetrieveAsync(tbxAddress.Text.Trim()); + threadWorker1.RunWorkerAsync(); } - private void btnSave_Click(object sender, EventArgs e) + private void button2_Click(object sender, EventArgs e) { - if (this.IsWorking) + if (this.IsBusy) { return; } - if (bookmarkItem == null) + if (itemModel == null) { - bookmarkItem = new BookmarkItem(); + itemModel = new BookmarkItemModel(); } - bookmarkItem.ChangeName(tbxName.Text.Trim()); - bookmarkItem.SiteAddress = tbxAddress.Text.Trim(); - bookmarkItem.Description = tbxDescription.Text.Trim(); + itemModel.SiteName = textBox1.Text?.Trim(); + itemModel.SiteAddress = textBox2.Text?.Trim(); + itemModel.SiteDescription = memoBox1.Text?.Trim(); - parentNode.Text = tbxName.Text.Trim(); -//// parentNode.ImageIndex = parentNode.SelectedImageIndex = 3; - parentNode.ToolTipText = string.Concat(bookmarkItem.SiteAddress, Environment.NewLine, bookmarkItem.Description).Trim(); - parentNode.Tag = bookmarkItem; - - BookmarkTreeView bookmarkTreeView = (BookmarkTreeView)parentNode.TreeView; - if (bookmarkTreeView != null) - { - //##parentNode.ImageIndex = parentNode.SelectedImageIndex = bookmarkTreeView.AddToIconList(bookmarkItem); - } + treeView?.AddOrUpdateItem_OnSelectedNode(itemModel.ToViewModel()); this.Close(); } - protected void bookmarkItem_OnRetrieveCompleted(BookmarkItem sender, bool hasError, string message) - { - if (string.IsNullOrEmpty(sender.SiteName)) - { - if (MessageBox.Show("The page could not be retrieved or the title is blank. Do you want to keep your original title?", "Keep original?", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) - { - bookmarkItem.SiteName = sender.SiteName; - tbxName.Text = bookmarkItem.SiteName; - // don't replace with blank - if (!string.IsNullOrEmpty(sender.Description)) - { - bookmarkItem.Description = sender.Description; - } - } - } - else - { - bookmarkItem.SiteName = sender.SiteName; - tbxName.Text = bookmarkItem.SiteName; + // private void btnSave_Click(object sender, EventArgs e) + // { + // if (this.IsBusy) + // { + // return; + // } - // don't replace with blank - if (!string.IsNullOrEmpty(sender.Description)) - { - bookmarkItem.Description = sender.Description; - } - } + // if (itemModel == null) + // { + // itemModel = new BookmarkItemModel(); + // } - // don't replace with blank - if (sender.IconData != null) - { - bookmarkItem.IconData = sender.IconData; - } + // itemModel.SiteName = textBox1.Text?.Trim(); + // itemModel.SiteAddress = textBox2.Text?.Trim(); + // itemModel.SiteDescription = memoBox1.Text?.Trim(); - tbxDescription.Text = bookmarkItem.Description; - pbxIcon.Image = (bookmarkItem.Icon == null) ? parentNode.TreeView.ImageList.Images[3] : bookmarkItem.Icon; + // treeView?.AddOrUpdateItem_OnSelectedNode(itemModel.ToViewModel()); + + //// if (bookmarkItem == null) + //// { + //// bookmarkItem = new BookmarkItem(); + //// } + + //// bookmarkItem.ChangeName(textBox1.Text.Trim()); + //// bookmarkItem.SiteAddress = textBox2.Text.Trim(); + //// bookmarkItem.Description = memoBox1.Text.Trim(); + + //// parentNode.Text = textBox1.Text.Trim(); + //////// parentNode.ImageIndex = parentNode.SelectedImageIndex = 3; + //// parentNode.ToolTipText = string.Concat(bookmarkItem.SiteAddress, Environment.NewLine, bookmarkItem.Description).Trim(); + //// parentNode.Tag = bookmarkItem; + + //// BookmarkTreeView bookmarkTreeView = (BookmarkTreeView)parentNode.TreeView; + //// if (bookmarkTreeView != null) + //// { + //// //##parentNode.ImageIndex = parentNode.SelectedImageIndex = bookmarkTreeView.AddToIconList(bookmarkItem); + //// } + + // this.Close(); + // } - if (hasError) - { - oToolTip.SetToolTip(pictureBox1, message); - } - this.IsWorking = false; - } } } \ No newline at end of file diff --git a/BookmarkEditForm.resx b/BookmarkEditForm.resx index 3b96111..9d9bc4d 100644 --- a/BookmarkEditForm.resx +++ b/BookmarkEditForm.resx @@ -117,32 +117,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + 17, 17 - - - - AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAHQAAADQAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAAMwAA - AB0AAAAAAAAAAAAAADT5+fn1/Pz8/fz8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8/fn5 - +fMAAAAzAAAAAAAAAAEAAAA2/Pz8/vz8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8 - /P/8/Pz9AAAANgAAAAAAAAABAAAANvz8/P/8/Pz/F0JZ/ypgiP9Lib3/bqfL/+Dp8f/7+/v/+/v7//v7 - +//7+/v//Pz8/wAAADYAAAABAAAAAQAAADb8/Pz//Pz8/y1mhP+Tx/n/kMn5/0CEyf8laq3/1OLu//r6 - +v/6+vr/+vr6//z8/P8AAAA2AAAAAQAAAAEAAAA2/Pz8//z8/P9CiKn/4PL//1OZ2P8Zeb3/SJfE/0eN - x//Y5vP/+Pj4//j4+P/8/Pz/AAAANgAAAAEAAAABAAAANvz8/P/8/Pz/pMLX/3m11f+PttH/VMnk/1rf - 9f930O3/UJzd/9/r9f/4+Pj//Pz8/wAAADYAAAABAAAAAQAAADb8/Pz//Pz8//z8/P+x1eX/dbnX/8H2 - /f9i3/f/XOL4/3jT8P9Il9z/3uny//z8/P8AAAA2AAAAAQAAAAEAAAA2/Pz8//z8/P/8/Pz//Pz8/67U - 5f92y+f/x/f9/13c9f9Z4ff/etTx/0qZ3f/U5fX/AAAANgAAAAEAAAABAAAANvz8/P/8/Pz//Pz8//z8 - /P/8/Pz/vOXy/3jT7v/H9/3/Xtz1/1ri9/951vL/UKHi/yJJalwAAAABAAAAAQAAADb8/Pz/+/v7//z8 - /P/8/Pz/+/v7//j4+P+54/D/fNTu/8P2/f9r3fb/bMrt/2Ki1/9bmM/wTo3DJwAAAAEAAAA2/Pz8//n5 - +f/5+fn/+fn5//f39//29vb/8vLy/6fZ6P+A1u7/seP5/4q/5/+t0/b/w+D8/2We0/cAAAABAAAANvz8 - /P/39/f/+fn5//f39//39/f/8/Pz//Dw8P/q6ur/ruTz/3a95/+z0vD/5fP//6vS7/9Hi8foAAAAAAAA - ADb7+/v99PT0//X19f/19fX/9fX1//Hx8f/v7+//6enp//z8/P+r1eT/V6TY/4Sw2/9FnND/KpTRXgAA - AAAAAAAz+Pj48Pv7+/38/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/4+Pj/k5OTkQAAACAAAAACAAAAAAAA - AAAAAAAAAAAAHAAAADMAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAAACAAAAACAAAAAAAA - AAAAAAAAgAGsQYABrEEAAaxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQYAA - rEGAA6xBgAesQQ== - - \ No newline at end of file diff --git a/BookmarkItem.cs b/BookmarkItem.cs index dcd6993..6ac6e70 100644 --- a/BookmarkItem.cs +++ b/BookmarkItem.cs @@ -20,17 +20,17 @@ namespace bzit.bomg public byte[] IconData { get; set; } = null; public string SiteName { get; set; } = null; - public string SiteAddress { get; set; } + public string SiteAddress { get; set; } public string Description { get; set; } - public string IconAddress { get; protected set; } + public string IconAddress { get; set; } public string Fullpath { get; set; } - public string Created { get; set; } + public string Created { get; set; } protected const char pathSeparator = '|'; //protected TreeNode treeNode = null; protected BackgroundWorker mainThread = null; - + protected bool hasRetrieveError = false; protected string retrieveErrorMessage = null; @@ -46,13 +46,13 @@ namespace bzit.bomg rv += "Address=" + this.SiteAddress + Environment.NewLine; rv += "Description=" + this.Description + Environment.NewLine; rv += "Created=" + this.Created?.Trim(); - + return rv; } #region public properties - + //{ // get // { @@ -64,7 +64,7 @@ namespace bzit.bomg // this.treeNode = value; // } //} - + public Bitmap Icon { get @@ -87,7 +87,7 @@ namespace bzit.bomg } - + #endregion #region public methods @@ -107,7 +107,7 @@ namespace bzit.bomg this.mainThread.RunWorkerCompleted += retrieveWorker_RunWorkerCompleted; } } - + public string GetName() { if (this.Fullpath.Contains(pathSeparator.ToString())) @@ -226,7 +226,7 @@ namespace bzit.bomg // } // } - // // load icon image + // // load icon image // if (!string.IsNullOrEmpty(this.IconAddress)) // { // try @@ -246,7 +246,7 @@ namespace bzit.bomg } public void RetrieveAsync() - { + { if (this.mainThread.IsBusy) { return; @@ -279,7 +279,7 @@ namespace bzit.bomg this.Description = string.Empty; this.IconAddress = string.Empty; - WebClient webClient = new WebClient(); + WebClient webClient = new WebClient(); webClient.CachePolicy = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.NoCacheNoStore); string sourceCode = string.Empty; @@ -404,7 +404,7 @@ namespace bzit.bomg return System.Web.HttpUtility.HtmlDecode(hn.Attributes[attr].Value?.Trim()); } - + return defaultValue; } diff --git a/BookmarkTreeView.cs b/BookmarkTreeView.cs index ba4819f..85fae29 100644 --- a/BookmarkTreeView.cs +++ b/BookmarkTreeView.cs @@ -9,211 +9,13 @@ namespace bzit.bomg { public partial class BookmarkTreeView : RyzStudio.Windows.Forms.MovableTreeView { - protected IconDatabase iconDatabase = null; public BookmarkTreeView() { InitializeComponent(); - if (this.ImageList == null) - { - this.ImageList = new ImageList(); - } - - 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(Properties.Resources.transmit_blue); - this.ImageList.Images.Add(Properties.Resources.folder); - this.ImageList.Images.Add(Properties.Resources.folder_explore); - this.ImageList.Images.Add(Properties.Resources.page_white_world_bw); } - [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] - public new ImageList ImageList { get => base.ImageList; set => base.ImageList = value; } - protected override void OnPreviewKeyDown(PreviewKeyDownEventArgs e) - { - base.OnPreviewKeyDown(e); - - TreeNode tn = this.SelectedNode; - if (tn == null) - { - return; - } - - switch (e.KeyCode) - { - case Keys.Insert: - if (e.Modifiers == Keys.Shift) - { - // do nothing - } - else - { - MessageBox.Show("!"); - //AddBookmarkPage(); - } - - break; - - default: break; - } - } - - 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 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); - - tn2.Nodes.Add(tn); - } - - public void AddItem_OnSelectedNode(BookmarkItemViewModel viewModel) - { - if (this.SelectedNode == null) - { - return; - } - - if (this.SelectedNode.Tag != null) - { - return; - } - - int iconIndex = addIcon(viewModel); - - TreeNode tn = new TreeNode(viewModel.SiteName, iconIndex, iconIndex); - tn.Tag = viewModel; - tn.ToolTipText = viewModel.ToString(); - - int n = this.SelectedNode.Nodes.Add(tn); - - this.SelectedNode = this.SelectedNode.Nodes[n]; - } - - protected int addIcon(BookmarkItemViewModel viewModel) => addIcon(viewModel.ToModel()); - - protected int addIcon(BookmarkItemModel model) - { - 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.ImageList.Images.Add(model.SiteAddress, rs); - - return this.ImageList.Images.IndexOfKey(model.SiteAddress); - } - } - - Bitmap bmp = model.RetrieveFavicon(); - if (bmp == null) - { - return (int)IconSet.Default; - } - - this.ImageList.Images.Add(model.SiteAddress, bmp); - - return this.ImageList.Images.IndexOfKey(model.SiteAddress); - } - - protected TreeNode addFolderPath(string path) - { - 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; - } - - foreach (string item in folderList) - { - if (tn.Nodes.ContainsKey(item)) - { - // do nothing - } - else - { - tn.Nodes.Add(item, item, (int)IconSet.Folder1, (int)IconSet.Folder2); - } - - tn = tn.Nodes[item]; - } - - return tn; - } } } \ No newline at end of file diff --git a/MainForm.Designer.cs b/MainForm.Designer.cs index ba16784..3b6f0a2 100644 --- a/MainForm.Designer.cs +++ b/MainForm.Designer.cs @@ -1,3 +1,5 @@ +using RyzStudio.Windows.Forms; + namespace bzit.bomg { partial class MainForm @@ -30,7 +32,7 @@ namespace bzit.bomg { this.components = new System.ComponentModel.Container(); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); - this.treeMenuItem = new System.Windows.Forms.ContextMenuStrip(this.components); + this.pageTreeNodeMenu = new System.Windows.Forms.ContextMenuStrip(this.components); this.toolStripMenuItem4 = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); this.toolStripMenuItem8 = new System.Windows.Forms.ToolStripMenuItem(); @@ -72,7 +74,7 @@ namespace bzit.bomg this.toolStripDropDownButton7 = new System.Windows.Forms.ToolStripDropDownButton(); this.alwaysOnTopToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.openFileDialog = new System.Windows.Forms.OpenFileDialog(); - this.treeMenuFolder = new System.Windows.Forms.ContextMenuStrip(this.components); + this.folderTreeNodeMenu = new System.Windows.Forms.ContextMenuStrip(this.components); this.toolStripMenuItem15 = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripMenuItem16 = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator(); @@ -90,27 +92,28 @@ namespace bzit.bomg this.openMenuBarItem = new System.Windows.Forms.ToolStripButton(); this.saveMenuBarItem = new System.Windows.Forms.ToolStripButton(); this.toolStripSeparator9 = new System.Windows.Forms.ToolStripSeparator(); - this.treeMenuRoot = new System.Windows.Forms.ContextMenuStrip(this.components); + this.toolStripButton1 = new System.Windows.Forms.ToolStripButton(); + this.toolStripButton2 = new System.Windows.Forms.ToolStripButton(); + this.rootTreeNodeMenu = new System.Windows.Forms.ContextMenuStrip(this.components); this.toolStripMenuItem17 = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripMenuItem18 = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator10 = new System.Windows.Forms.ToolStripSeparator(); this.toolStripMenuItem20 = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator13 = new System.Windows.Forms.ToolStripSeparator(); this.toolStripMenuItem22 = new System.Windows.Forms.ToolStripMenuItem(); - this.treeView1 = new bzit.bomg.BookmarkTreeView(); - this.toolStripButton1 = new System.Windows.Forms.ToolStripButton(); - this.treeMenuItem.SuspendLayout(); + this.treeView1 = new RyzStudio.Windows.Forms.BookmarkTreeView(); + this.pageTreeNodeMenu.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.statusBarPanel1)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.statusBarPanel2)).BeginInit(); this.toolStrip1.SuspendLayout(); - this.treeMenuFolder.SuspendLayout(); + this.folderTreeNodeMenu.SuspendLayout(); this.toolStrip2.SuspendLayout(); - this.treeMenuRoot.SuspendLayout(); + this.rootTreeNodeMenu.SuspendLayout(); this.SuspendLayout(); - // - // treeMenuItem - // - this.treeMenuItem.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + // + // pageTreeNodeMenu + // + this.pageTreeNodeMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.toolStripMenuItem4, this.toolStripSeparator3, this.toolStripMenuItem8, @@ -118,56 +121,56 @@ namespace bzit.bomg this.toolStripSeparator2, this.listViewMenuItem1, this.moveFileToToolStripMenuItem}); - this.treeMenuItem.Name = "listViewMenu"; - this.treeMenuItem.Size = new System.Drawing.Size(139, 126); - // + this.pageTreeNodeMenu.Name = "listViewMenu"; + this.pageTreeNodeMenu.Size = new System.Drawing.Size(139, 126); + // // toolStripMenuItem4 - // + // this.toolStripMenuItem4.Name = "toolStripMenuItem4"; this.toolStripMenuItem4.Size = new System.Drawing.Size(138, 22); this.toolStripMenuItem4.Text = "&Open"; - this.toolStripMenuItem4.Click += new System.EventHandler(this.toolStripMenuItem4_Click); - // + this.toolStripMenuItem4.Click += new System.EventHandler(this.openContextMenu_Click); + // // toolStripSeparator3 - // + // this.toolStripSeparator3.Name = "toolStripSeparator3"; this.toolStripSeparator3.Size = new System.Drawing.Size(135, 6); - // + // // toolStripMenuItem8 - // + // this.toolStripMenuItem8.Name = "toolStripMenuItem8"; this.toolStripMenuItem8.Size = new System.Drawing.Size(138, 22); this.toolStripMenuItem8.Text = "E&dit"; - this.toolStripMenuItem8.Click += new System.EventHandler(this.toolStripMenuItem8_Click); - // + this.toolStripMenuItem8.Click += new System.EventHandler(this.editContextMenu3_Click); + // // toolStripMenuItem6 - // + // this.toolStripMenuItem6.Name = "toolStripMenuItem6"; this.toolStripMenuItem6.Size = new System.Drawing.Size(138, 22); this.toolStripMenuItem6.Text = "D&elete"; - this.toolStripMenuItem6.Click += new System.EventHandler(this.toolStripMenuItem6_Click); - // + this.toolStripMenuItem6.Click += new System.EventHandler(this.deleteContextMenu2_Click); + // // toolStripSeparator2 - // + // this.toolStripSeparator2.Name = "toolStripSeparator2"; this.toolStripSeparator2.Size = new System.Drawing.Size(135, 6); - // + // // listViewMenuItem1 - // + // this.listViewMenuItem1.Name = "listViewMenuItem1"; this.listViewMenuItem1.Size = new System.Drawing.Size(138, 22); this.listViewMenuItem1.Text = "Move &Up"; - this.listViewMenuItem1.Click += new System.EventHandler(this.toolStripMenuItem12_Click); - // + this.listViewMenuItem1.Click += new System.EventHandler(this.moveUpContextMenu2_Click); + // // moveFileToToolStripMenuItem - // + // this.moveFileToToolStripMenuItem.Name = "moveFileToToolStripMenuItem"; this.moveFileToToolStripMenuItem.Size = new System.Drawing.Size(138, 22); this.moveFileToToolStripMenuItem.Text = "Move &Down"; - this.moveFileToToolStripMenuItem.Click += new System.EventHandler(this.toolStripMenuItem13_Click); - // + this.moveFileToToolStripMenuItem.Click += new System.EventHandler(this.moveDownContextMenu2_Click); + // // statusBar1 - // + // this.statusBar1.Font = new System.Drawing.Font("Verdana", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.statusBar1.Location = new System.Drawing.Point(0, 634); this.statusBar1.Name = "statusBar1"; @@ -178,20 +181,20 @@ namespace bzit.bomg this.statusBar1.Size = new System.Drawing.Size(304, 20); this.statusBar1.SizingGrip = false; this.statusBar1.TabIndex = 9; - // + // // statusBarPanel1 - // + // this.statusBarPanel1.AutoSize = System.Windows.Forms.StatusBarPanelAutoSize.Spring; this.statusBarPanel1.Name = "statusBarPanel1"; this.statusBarPanel1.Width = 204; - // + // // statusBarPanel2 - // + // this.statusBarPanel2.Alignment = System.Windows.Forms.HorizontalAlignment.Center; this.statusBarPanel2.Name = "statusBarPanel2"; - // + // // imageList1 - // + // this.imageList1.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList1.ImageStream"))); this.imageList1.TransparentColor = System.Drawing.Color.Transparent; this.imageList1.Images.SetKeyName(0, "transmit_blue.png"); @@ -201,9 +204,9 @@ namespace bzit.bomg this.imageList1.Images.SetKeyName(4, "page.png"); this.imageList1.Images.SetKeyName(5, "page_green.png"); this.imageList1.Images.SetKeyName(6, "page_red.png"); - // + // // toolStrip1 - // + // this.toolStrip1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None; this.toolStrip1.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden; this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { @@ -220,9 +223,9 @@ namespace bzit.bomg this.toolStrip1.Size = new System.Drawing.Size(304, 25); this.toolStrip1.TabIndex = 25; this.toolStrip1.Text = "toolStrip1"; - // + // // toolStripDropDownButton1 - // + // this.toolStripDropDownButton1.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; this.toolStripDropDownButton1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.newFileMenuItem, @@ -241,89 +244,89 @@ namespace bzit.bomg this.toolStripDropDownButton1.ShowDropDownArrow = false; this.toolStripDropDownButton1.Size = new System.Drawing.Size(29, 22); this.toolStripDropDownButton1.Text = "&File"; - // + // // newFileMenuItem - // + // this.newFileMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("newFileMenuItem.Image"))); this.newFileMenuItem.Name = "newFileMenuItem"; this.newFileMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.N))); this.newFileMenuItem.Size = new System.Drawing.Size(186, 22); this.newFileMenuItem.Text = "&New"; - this.newFileMenuItem.Click += new System.EventHandler(this.newSessionToolStripMenuItem_Click); - // + this.newFileMenuItem.Click += new System.EventHandler(this.newMenuItem_Click); + // // openFileMenuItem - // + // this.openFileMenuItem.Image = global::bzit.bomg.Properties.Resources.folder_page; this.openFileMenuItem.Name = "openFileMenuItem"; this.openFileMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O))); this.openFileMenuItem.Size = new System.Drawing.Size(186, 22); this.openFileMenuItem.Text = "&Open"; - this.openFileMenuItem.Click += new System.EventHandler(this.toolStripMenuItem2_Click); - // + this.openFileMenuItem.Click += new System.EventHandler(this.openMenuItem_Click); + // // toolStripSeparator1 - // + // this.toolStripSeparator1.Name = "toolStripSeparator1"; this.toolStripSeparator1.Size = new System.Drawing.Size(183, 6); - // + // // closeFileMenuItem - // + // this.closeFileMenuItem.Name = "closeFileMenuItem"; this.closeFileMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.W))); this.closeFileMenuItem.Size = new System.Drawing.Size(186, 22); this.closeFileMenuItem.Text = "&Close"; - this.closeFileMenuItem.Click += new System.EventHandler(this.toolStripMenuItem3_Click); - // + this.closeFileMenuItem.Click += new System.EventHandler(this.closeMenuItem_Click); + // // toolStripSeparator4 - // + // this.toolStripSeparator4.Name = "toolStripSeparator4"; this.toolStripSeparator4.Size = new System.Drawing.Size(183, 6); - // + // // saveFileMenuItem - // + // this.saveFileMenuItem.Image = global::bzit.bomg.Properties.Resources.disk; this.saveFileMenuItem.Name = "saveFileMenuItem"; this.saveFileMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S))); this.saveFileMenuItem.Size = new System.Drawing.Size(186, 22); this.saveFileMenuItem.Text = "&Save"; this.saveFileMenuItem.Click += new System.EventHandler(this.importSnapshotToolStripMenuItem_Click); - // + // // saveAsFileMenuItem - // + // this.saveAsFileMenuItem.Image = global::bzit.bomg.Properties.Resources.page_white_disk; this.saveAsFileMenuItem.Name = "saveAsFileMenuItem"; - this.saveAsFileMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + this.saveAsFileMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) | System.Windows.Forms.Keys.S))); this.saveAsFileMenuItem.Size = new System.Drawing.Size(186, 22); this.saveAsFileMenuItem.Text = "Save &As"; this.saveAsFileMenuItem.Click += new System.EventHandler(this.exportSnapshotToolStripMenuItem_Click); - // + // // toolStripSeparator8 - // + // this.toolStripSeparator8.Name = "toolStripSeparator8"; this.toolStripSeparator8.Size = new System.Drawing.Size(183, 6); - // + // // exportFileMenuItem - // + // this.exportFileMenuItem.Enabled = false; this.exportFileMenuItem.Name = "exportFileMenuItem"; this.exportFileMenuItem.Size = new System.Drawing.Size(186, 22); this.exportFileMenuItem.Text = "&Export"; this.exportFileMenuItem.Click += new System.EventHandler(this.toolStripMenuItem7_Click); - // + // // toolStripSeparator6 - // + // this.toolStripSeparator6.Name = "toolStripSeparator6"; this.toolStripSeparator6.Size = new System.Drawing.Size(183, 6); - // + // // exitFileMenuItem - // + // this.exitFileMenuItem.Name = "exitFileMenuItem"; this.exitFileMenuItem.Size = new System.Drawing.Size(186, 22); this.exitFileMenuItem.Text = "E&xit"; - this.exitFileMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem1_Click); - // + this.exitFileMenuItem.Click += new System.EventHandler(this.exitMenuItem_Click); + // // toolStripDropDownButton2 - // + // this.toolStripDropDownButton2.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; this.toolStripDropDownButton2.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.findEditMenuItem}); @@ -332,18 +335,18 @@ namespace bzit.bomg this.toolStripDropDownButton2.ShowDropDownArrow = false; this.toolStripDropDownButton2.Size = new System.Drawing.Size(31, 22); this.toolStripDropDownButton2.Text = "&Edit"; - // + // // findEditMenuItem - // + // this.findEditMenuItem.Image = global::bzit.bomg.Properties.Resources.magnifier; this.findEditMenuItem.Name = "findEditMenuItem"; this.findEditMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.F))); this.findEditMenuItem.Size = new System.Drawing.Size(137, 22); this.findEditMenuItem.Text = "&Find"; this.findEditMenuItem.Click += new System.EventHandler(this.toolStripButton5_Click); - // + // // toolStripDropDownButton3 - // + // this.toolStripDropDownButton3.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; this.toolStripDropDownButton3.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.expandAllViewMenuItem, @@ -353,25 +356,25 @@ namespace bzit.bomg this.toolStripDropDownButton3.ShowDropDownArrow = false; this.toolStripDropDownButton3.Size = new System.Drawing.Size(36, 22); this.toolStripDropDownButton3.Text = "&View"; - // + // // expandAllViewMenuItem - // + // this.expandAllViewMenuItem.Enabled = false; this.expandAllViewMenuItem.Name = "expandAllViewMenuItem"; this.expandAllViewMenuItem.Size = new System.Drawing.Size(136, 22); this.expandAllViewMenuItem.Text = "&Expand All"; this.expandAllViewMenuItem.Click += new System.EventHandler(this.expandAllToolStripMenuItem_Click); - // + // // collapseAllViewMenuItem - // + // this.collapseAllViewMenuItem.Enabled = false; this.collapseAllViewMenuItem.Name = "collapseAllViewMenuItem"; this.collapseAllViewMenuItem.Size = new System.Drawing.Size(136, 22); this.collapseAllViewMenuItem.Text = "&Collapse All"; this.collapseAllViewMenuItem.Click += new System.EventHandler(this.collapseAllToolStripMenuItem_Click); - // + // // toolStripDropDownButton4 - // + // this.toolStripDropDownButton4.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; this.toolStripDropDownButton4.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.updateIconsToolMenuItem, @@ -382,21 +385,21 @@ namespace bzit.bomg this.toolStripDropDownButton4.ShowDropDownArrow = false; this.toolStripDropDownButton4.Size = new System.Drawing.Size(39, 22); this.toolStripDropDownButton4.Text = "&Tools"; - // + // // updateIconsToolMenuItem - // + // this.updateIconsToolMenuItem.Name = "updateIconsToolMenuItem"; this.updateIconsToolMenuItem.Size = new System.Drawing.Size(143, 22); this.updateIconsToolMenuItem.Text = "&Update Icons"; this.updateIconsToolMenuItem.Click += new System.EventHandler(this.toolStripMenuItem1_Click); - // + // // toolStripSeparator14 - // + // this.toolStripSeparator14.Name = "toolStripSeparator14"; this.toolStripSeparator14.Size = new System.Drawing.Size(140, 6); - // + // // optionsToolMenuItem - // + // this.optionsToolMenuItem.Enabled = false; this.optionsToolMenuItem.Image = global::bzit.bomg.Properties.Resources.cog; this.optionsToolMenuItem.Name = "optionsToolMenuItem"; @@ -404,9 +407,9 @@ namespace bzit.bomg this.optionsToolMenuItem.Size = new System.Drawing.Size(143, 22); this.optionsToolMenuItem.Text = "&Options"; this.optionsToolMenuItem.Click += new System.EventHandler(this.optionsToolStripMenuItem1_Click); - // + // // toolStripDropDownButton5 - // + // this.toolStripDropDownButton5.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; this.toolStripDropDownButton5.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.viewHelpHelpMenuItem, @@ -417,31 +420,31 @@ namespace bzit.bomg this.toolStripDropDownButton5.ShowDropDownArrow = false; this.toolStripDropDownButton5.Size = new System.Drawing.Size(36, 22); this.toolStripDropDownButton5.Text = "&Help"; - // + // // viewHelpHelpMenuItem - // + // this.viewHelpHelpMenuItem.Image = global::bzit.bomg.Properties.Resources.help; this.viewHelpHelpMenuItem.Name = "viewHelpHelpMenuItem"; this.viewHelpHelpMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F1; this.viewHelpHelpMenuItem.Size = new System.Drawing.Size(146, 22); this.viewHelpHelpMenuItem.Text = "View &Help"; this.viewHelpHelpMenuItem.Click += new System.EventHandler(this.documentationToolStripMenuItem_Click); - // + // // toolStripSeparator12 - // + // this.toolStripSeparator12.Name = "toolStripSeparator12"; this.toolStripSeparator12.Size = new System.Drawing.Size(143, 6); - // + // // aboutHelpMenuItem - // + // this.aboutHelpMenuItem.Image = global::bzit.bomg.Properties.Resources.comment; this.aboutHelpMenuItem.Name = "aboutHelpMenuItem"; this.aboutHelpMenuItem.Size = new System.Drawing.Size(146, 22); this.aboutHelpMenuItem.Text = "&About"; this.aboutHelpMenuItem.Click += new System.EventHandler(this.aboutToolStripMenuItem1_Click); - // + // // toolStripDropDownButton7 - // + // this.toolStripDropDownButton7.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; this.toolStripDropDownButton7.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.alwaysOnTopToolStripMenuItem}); @@ -451,24 +454,24 @@ namespace bzit.bomg this.toolStripDropDownButton7.Size = new System.Drawing.Size(16, 22); this.toolStripDropDownButton7.Text = "&?"; this.toolStripDropDownButton7.Visible = false; - // + // // alwaysOnTopToolStripMenuItem - // + // this.alwaysOnTopToolStripMenuItem.Name = "alwaysOnTopToolStripMenuItem"; this.alwaysOnTopToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.F11))); this.alwaysOnTopToolStripMenuItem.Size = new System.Drawing.Size(205, 22); this.alwaysOnTopToolStripMenuItem.Text = "Always On Top"; this.alwaysOnTopToolStripMenuItem.Click += new System.EventHandler(this.alwaysOnTopToolStripMenuItem_Click); - // + // // openFileDialog - // + // this.openFileDialog.DefaultExt = "ryz"; this.openFileDialog.Filter = "Bookmarks files|*.ryz"; this.openFileDialog.Title = "Open bookmarks file"; - // - // treeMenuFolder - // - this.treeMenuFolder.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + // + // folderTreeNodeMenu + // + this.folderTreeNodeMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.toolStripMenuItem15, this.toolStripMenuItem16, this.toolStripSeparator5, @@ -480,86 +483,88 @@ namespace bzit.bomg this.toolStripSeparator11, this.toolStripMenuItem12, this.toolStripMenuItem13}); - this.treeMenuFolder.Name = "listViewMenu"; - this.treeMenuFolder.Size = new System.Drawing.Size(139, 198); - // + this.folderTreeNodeMenu.Name = "listViewMenu"; + this.folderTreeNodeMenu.Size = new System.Drawing.Size(139, 198); + // // toolStripMenuItem15 - // + // this.toolStripMenuItem15.Name = "toolStripMenuItem15"; this.toolStripMenuItem15.Size = new System.Drawing.Size(138, 22); this.toolStripMenuItem15.Text = "Add &Page"; - // + this.toolStripMenuItem15.Click += new System.EventHandler(this.addPageContextMenu2_Click); + // // toolStripMenuItem16 - // + // this.toolStripMenuItem16.Name = "toolStripMenuItem16"; this.toolStripMenuItem16.Size = new System.Drawing.Size(138, 22); this.toolStripMenuItem16.Text = "Add &Folder"; - // + this.toolStripMenuItem16.Click += new System.EventHandler(this.addFolderContextMenu2_Click); + // // toolStripSeparator5 - // + // this.toolStripSeparator5.Name = "toolStripSeparator5"; this.toolStripSeparator5.Size = new System.Drawing.Size(135, 6); - // + // // toolStripMenuItem14 - // + // this.toolStripMenuItem14.Name = "toolStripMenuItem14"; this.toolStripMenuItem14.Size = new System.Drawing.Size(138, 22); this.toolStripMenuItem14.Text = "&Open All"; - this.toolStripMenuItem14.Click += new System.EventHandler(this.toolStripMenuItem14_Click); - // + this.toolStripMenuItem14.Click += new System.EventHandler(this.openAllContextMenu_Click); + // // toolStripMenuItem9 - // + // this.toolStripMenuItem9.Name = "toolStripMenuItem9"; this.toolStripMenuItem9.Size = new System.Drawing.Size(138, 22); this.toolStripMenuItem9.Text = "Edi&t"; - this.toolStripMenuItem9.Click += new System.EventHandler(this.toolStripMenuItem9_Click); - // + this.toolStripMenuItem9.Click += new System.EventHandler(this.editContextMenu2_Click); + // // toolStripMenuItem11 - // + // this.toolStripMenuItem11.Name = "toolStripMenuItem11"; this.toolStripMenuItem11.Size = new System.Drawing.Size(138, 22); this.toolStripMenuItem11.Text = "D&elete"; - this.toolStripMenuItem11.Click += new System.EventHandler(this.toolStripMenuItem6_Click); - // + this.toolStripMenuItem11.Click += new System.EventHandler(this.deleteContextMenu_Click); + // // toolStripSeparator7 - // + // this.toolStripSeparator7.Name = "toolStripSeparator7"; this.toolStripSeparator7.Size = new System.Drawing.Size(135, 6); - // + // // sortToolStripMenuItem - // + // this.sortToolStripMenuItem.Name = "sortToolStripMenuItem"; this.sortToolStripMenuItem.Size = new System.Drawing.Size(138, 22); this.sortToolStripMenuItem.Text = "&Sort"; - this.sortToolStripMenuItem.Click += new System.EventHandler(this.sortToolStripMenuItem_Click); - // + this.sortToolStripMenuItem.Click += new System.EventHandler(this.sortContextMenu2_Click); + // // toolStripSeparator11 - // + // this.toolStripSeparator11.Name = "toolStripSeparator11"; this.toolStripSeparator11.Size = new System.Drawing.Size(135, 6); - // + // // toolStripMenuItem12 - // + // this.toolStripMenuItem12.Name = "toolStripMenuItem12"; this.toolStripMenuItem12.Size = new System.Drawing.Size(138, 22); this.toolStripMenuItem12.Text = "Move &Up"; - this.toolStripMenuItem12.Click += new System.EventHandler(this.toolStripMenuItem12_Click); - // + this.toolStripMenuItem12.Click += new System.EventHandler(this.moveUpContextMenu_Click); + // // toolStripMenuItem13 - // + // this.toolStripMenuItem13.Name = "toolStripMenuItem13"; this.toolStripMenuItem13.Size = new System.Drawing.Size(138, 22); this.toolStripMenuItem13.Text = "Move &Down"; - this.toolStripMenuItem13.Click += new System.EventHandler(this.toolStripMenuItem13_Click); - // + this.toolStripMenuItem13.Click += new System.EventHandler(this.moveDownContextMenu_Click); + // // saveFileDialog - // + // this.saveFileDialog.DefaultExt = "ryz"; this.saveFileDialog.Filter = "Bookmarks file|*.ryz|Bookmarks file (password protected)|*.ryz"; this.saveFileDialog.Title = "Save bookmarks file"; - // + // // toolStrip2 - // + // this.toolStrip2.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None; this.toolStrip2.CanOverflow = false; this.toolStrip2.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { @@ -567,16 +572,17 @@ namespace bzit.bomg this.openMenuBarItem, this.saveMenuBarItem, this.toolStripSeparator9, - this.toolStripButton1}); + this.toolStripButton1, + this.toolStripButton2}); this.toolStrip2.Location = new System.Drawing.Point(0, 25); this.toolStrip2.Name = "toolStrip2"; this.toolStrip2.RenderMode = System.Windows.Forms.ToolStripRenderMode.System; this.toolStrip2.Size = new System.Drawing.Size(304, 25); this.toolStrip2.TabIndex = 26; this.toolStrip2.Text = "toolStrip2"; - // + // // newMenuBarItem - // + // this.newMenuBarItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; this.newMenuBarItem.Image = ((System.Drawing.Image)(resources.GetObject("newMenuBarItem.Image"))); this.newMenuBarItem.ImageTransparentColor = System.Drawing.Color.Magenta; @@ -584,10 +590,10 @@ namespace bzit.bomg this.newMenuBarItem.Size = new System.Drawing.Size(23, 22); this.newMenuBarItem.Text = "toolStripButton1"; this.newMenuBarItem.ToolTipText = "New"; - this.newMenuBarItem.Click += new System.EventHandler(this.newSessionToolStripMenuItem_Click); - // + this.newMenuBarItem.Click += new System.EventHandler(this.newMenuItem_Click); + // // openMenuBarItem - // + // this.openMenuBarItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; this.openMenuBarItem.Image = global::bzit.bomg.Properties.Resources.folder_page; this.openMenuBarItem.ImageTransparentColor = System.Drawing.Color.Magenta; @@ -595,10 +601,10 @@ namespace bzit.bomg this.openMenuBarItem.Size = new System.Drawing.Size(23, 22); this.openMenuBarItem.Text = "toolStripButton2"; this.openMenuBarItem.ToolTipText = "Open"; - this.openMenuBarItem.Click += new System.EventHandler(this.toolStripMenuItem2_Click); - // + this.openMenuBarItem.Click += new System.EventHandler(this.openMenuItem_Click); + // // saveMenuBarItem - // + // this.saveMenuBarItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; this.saveMenuBarItem.Image = global::bzit.bomg.Properties.Resources.disk; this.saveMenuBarItem.ImageTransparentColor = System.Drawing.Color.Magenta; @@ -607,62 +613,82 @@ namespace bzit.bomg this.saveMenuBarItem.Text = "toolStripButton3"; this.saveMenuBarItem.ToolTipText = "Save"; this.saveMenuBarItem.Click += new System.EventHandler(this.importSnapshotToolStripMenuItem_Click); - // + // // toolStripSeparator9 - // + // this.toolStripSeparator9.Name = "toolStripSeparator9"; this.toolStripSeparator9.Size = new System.Drawing.Size(6, 25); - // - // treeMenuRoot - // - this.treeMenuRoot.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + // + // toolStripButton1 + // + this.toolStripButton1.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButton1.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton1.Image"))); + this.toolStripButton1.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton1.Name = "toolStripButton1"; + this.toolStripButton1.Size = new System.Drawing.Size(23, 22); + this.toolStripButton1.Text = "toolStripButton1"; + // + // toolStripButton2 + // + this.toolStripButton2.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButton2.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton2.Image"))); + this.toolStripButton2.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton2.Name = "toolStripButton2"; + this.toolStripButton2.Size = new System.Drawing.Size(23, 22); + this.toolStripButton2.Text = "toolStripButton2"; + // + // rootTreeNodeMenu + // + this.rootTreeNodeMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.toolStripMenuItem17, this.toolStripMenuItem18, this.toolStripSeparator10, this.toolStripMenuItem20, this.toolStripSeparator13, this.toolStripMenuItem22}); - this.treeMenuRoot.Name = "listViewMenu"; - this.treeMenuRoot.Size = new System.Drawing.Size(133, 104); - // + this.rootTreeNodeMenu.Name = "listViewMenu"; + this.rootTreeNodeMenu.Size = new System.Drawing.Size(133, 104); + // // toolStripMenuItem17 - // + // this.toolStripMenuItem17.Name = "toolStripMenuItem17"; this.toolStripMenuItem17.Size = new System.Drawing.Size(132, 22); this.toolStripMenuItem17.Text = "Add &Page"; - // + this.toolStripMenuItem17.Click += new System.EventHandler(this.addPageContextMenu_Click); + // // toolStripMenuItem18 - // + // this.toolStripMenuItem18.Name = "toolStripMenuItem18"; this.toolStripMenuItem18.Size = new System.Drawing.Size(132, 22); this.toolStripMenuItem18.Text = "Add &Folder"; - // + this.toolStripMenuItem18.Click += new System.EventHandler(this.addFolderContextMenu_Click); + // // toolStripSeparator10 - // + // this.toolStripSeparator10.Name = "toolStripSeparator10"; this.toolStripSeparator10.Size = new System.Drawing.Size(129, 6); - // + // // toolStripMenuItem20 - // + // this.toolStripMenuItem20.Name = "toolStripMenuItem20"; this.toolStripMenuItem20.Size = new System.Drawing.Size(132, 22); this.toolStripMenuItem20.Text = "Edi&t"; - this.toolStripMenuItem20.Click += new System.EventHandler(this.toolStripMenuItem9_Click); - // + this.toolStripMenuItem20.Click += new System.EventHandler(this.editContextMenu_Click); + // // toolStripSeparator13 - // + // this.toolStripSeparator13.Name = "toolStripSeparator13"; this.toolStripSeparator13.Size = new System.Drawing.Size(129, 6); - // + // // toolStripMenuItem22 - // + // this.toolStripMenuItem22.Name = "toolStripMenuItem22"; this.toolStripMenuItem22.Size = new System.Drawing.Size(132, 22); this.toolStripMenuItem22.Text = "&Sort"; - this.toolStripMenuItem22.Click += new System.EventHandler(this.sortToolStripMenuItem_Click); - // + this.toolStripMenuItem22.Click += new System.EventHandler(this.sortContextMenu_Click); + // // treeView1 - // + // this.treeView1.AllowDrop = true; this.treeView1.BackColor = System.Drawing.Color.White; this.treeView1.Dock = System.Windows.Forms.DockStyle.Fill; @@ -680,19 +706,9 @@ namespace bzit.bomg this.treeView1.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeView1_NodeMouseClick); this.treeView1.NodeMouseDoubleClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeView2_NodeMouseDoubleClick); this.treeView1.PreviewKeyDown += new System.Windows.Forms.PreviewKeyDownEventHandler(this.treeView1_PreviewKeyDown); - // - // toolStripButton1 - // - this.toolStripButton1.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.toolStripButton1.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton1.Image"))); - this.toolStripButton1.ImageTransparentColor = System.Drawing.Color.Magenta; - this.toolStripButton1.Name = "toolStripButton1"; - this.toolStripButton1.Size = new System.Drawing.Size(23, 22); - this.toolStripButton1.Text = "toolStripButton1"; - this.toolStripButton1.Click += new System.EventHandler(this.toolStripButton1_Click); - // + // // MainForm - // + // this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; this.BackColor = System.Drawing.SystemColors.Control; this.ClientSize = new System.Drawing.Size(304, 654); @@ -706,15 +722,15 @@ namespace bzit.bomg this.Name = "MainForm"; this.StartPosition = System.Windows.Forms.FormStartPosition.Manual; this.Text = "Bookmark Manager"; - this.treeMenuItem.ResumeLayout(false); + this.pageTreeNodeMenu.ResumeLayout(false); ((System.ComponentModel.ISupportInitialize)(this.statusBarPanel1)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.statusBarPanel2)).EndInit(); this.toolStrip1.ResumeLayout(false); this.toolStrip1.PerformLayout(); - this.treeMenuFolder.ResumeLayout(false); + this.folderTreeNodeMenu.ResumeLayout(false); this.toolStrip2.ResumeLayout(false); this.toolStrip2.PerformLayout(); - this.treeMenuRoot.ResumeLayout(false); + this.rootTreeNodeMenu.ResumeLayout(false); this.ResumeLayout(false); this.PerformLayout(); @@ -725,7 +741,7 @@ namespace bzit.bomg private System.Windows.Forms.StatusBar statusBar1; private System.Windows.Forms.StatusBarPanel statusBarPanel1; private System.Windows.Forms.StatusBarPanel statusBarPanel2; - private System.Windows.Forms.ContextMenuStrip treeMenuItem; + private System.Windows.Forms.ContextMenuStrip pageTreeNodeMenu; private System.Windows.Forms.ToolStripMenuItem listViewMenuItem1; private System.Windows.Forms.ToolStripMenuItem moveFileToToolStripMenuItem; private System.Windows.Forms.ToolTip oToolTip1; @@ -758,7 +774,7 @@ namespace bzit.bomg public BookmarkTreeView treeView1; private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem4; private System.Windows.Forms.OpenFileDialog openFileDialog; - private System.Windows.Forms.ContextMenuStrip treeMenuFolder; + private System.Windows.Forms.ContextMenuStrip folderTreeNodeMenu; private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem9; private System.Windows.Forms.ToolStripSeparator toolStripSeparator5; private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem11; @@ -778,7 +794,7 @@ namespace bzit.bomg private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem15; private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem16; private System.Windows.Forms.ToolStripSeparator toolStripSeparator11; - private System.Windows.Forms.ContextMenuStrip treeMenuRoot; + private System.Windows.Forms.ContextMenuStrip rootTreeNodeMenu; private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem17; private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem18; private System.Windows.Forms.ToolStripSeparator toolStripSeparator10; @@ -791,6 +807,7 @@ namespace bzit.bomg private System.Windows.Forms.ToolStripMenuItem updateIconsToolMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator14; private System.Windows.Forms.ToolStripButton toolStripButton1; + private System.Windows.Forms.ToolStripButton toolStripButton2; } } diff --git a/MainForm.cs b/MainForm.cs index 35b3fd3..203181a 100644 --- a/MainForm.cs +++ b/MainForm.cs @@ -28,13 +28,6 @@ namespace bzit.bomg { base.OnLoad(e); - this.IconDatabase = new IconDatabase(); - - // toolbar - viewHelpHelpMenuItem.Enabled = File.Exists(Path.ChangeExtension(Application.ExecutablePath, ".chm")); - - - bool rv = false; string iconDBFilename = Path.ChangeExtension(Application.ExecutablePath, ".db"); @@ -42,10 +35,32 @@ namespace bzit.bomg rv = treeView1.InitialiseIconDatabase(out errorMessage, iconDBFilename); if (!rv) { - MessageBox.Show("Can not find icon database. [" + this.IconDatabase.LastError + "]"); + MessageBox.Show("Can not find icon database. [" + errorMessage + "]"); this.Close(); } + + + + + //this.IconDatabase = new IconDatabase(); + + // toolbar + viewHelpHelpMenuItem.Enabled = File.Exists(Path.ChangeExtension(Application.ExecutablePath, ".chm")); + + + + //bool rv = false; + //string iconDBFilename = Path.ChangeExtension(Application.ExecutablePath, ".db"); + + //string errorMessage; + //rv = treeView1.InitialiseIconDatabase(out errorMessage, iconDBFilename); + //if (!rv) + //{ + // MessageBox.Show("Can not find icon database. [" + errorMessage + "]"); + // this.Close(); + //} + sessionFileFormat = new SessionFileFormat(this); this.ApplicationMode = AppMode.Clear; @@ -117,7 +132,7 @@ namespace bzit.bomg protected override void OnFormClosing(FormClosingEventArgs e) { - this.IconDatabase?.Close(); + //this.IconDatabase?.Close(); if (this.ApplicationMode == AppMode.Clear) { @@ -196,7 +211,7 @@ namespace bzit.bomg } } - #region public properties + //#region public properties public AppMode ApplicationMode { @@ -243,26 +258,23 @@ namespace bzit.bomg } } - [DefaultValue(null)] - public IconDatabase IconDatabase { get; set; } + //[DefaultValue(null)] + //public IconDatabase IconDatabase { get; set; } - #endregion + //#endregion #region Toolbar #1 - /** - * File -> New - */ - private void newSessionToolStripMenuItem_Click(object sender, EventArgs e) + private void newMenuItem_Click(object sender, EventArgs e) { - NewSessionForm oNewSession = new NewSessionForm(this); - oNewSession.ShowDialog(); + NewSessionForm newSessionForm = new NewSessionForm(this); + newSessionForm.ShowDialog(); } /* * File -> Open */ - private void toolStripMenuItem2_Click(object sender, EventArgs e) + private void openMenuItem_Click(object sender, EventArgs e) { if (openFileDialog.ShowDialog() == DialogResult.OK) { @@ -275,7 +287,7 @@ namespace bzit.bomg /** * File -> Close */ - private void toolStripMenuItem3_Click(object sender, EventArgs e) + private void closeMenuItem_Click(object sender, EventArgs e) { if (ApplicationMode == AppMode.Clear) { @@ -363,7 +375,7 @@ namespace bzit.bomg /** * File -> Exit */ - private void exitToolStripMenuItem1_Click(object sender, EventArgs e) { this.Close(); } + private void exitMenuItem_Click(object sender, EventArgs e) { this.Close(); } /** * Find @@ -476,39 +488,39 @@ namespace bzit.bomg /** * Node -> Open */ - private void toolStripMenuItem4_Click(object sender, EventArgs e) - { - openBookmark(treeView1.SelectedNode); - } + //private void toolStripMenuItem4_Click(object sender, EventArgs e) + //{ + // openBookmark(treeView1.SelectedNode); + //} /** * Node -> Edit */ - private void toolStripMenuItem8_Click(object sender, EventArgs e) - { - if (treeView1.SelectedNode == null) - { - return; - } + //private void toolStripMenuItem8_Click(object sender, EventArgs e) + //{ + // if (treeView1.SelectedNode == null) + // { + // return; + // } - treeView1.HasChanged = true; + // treeView1.HasChanged = true; - TreeNode tn = treeView1.SelectedNode; - BookmarkEditForm oBookmarkEdit = new BookmarkEditForm(ref tn); - oBookmarkEdit.ShowDialog(); - } + // TreeNode tn = treeView1.SelectedNode; + // //##BookmarkEditForm oBookmarkEdit = new BookmarkEditForm(ref tn); + // //##oBookmarkEdit.ShowDialog(); + //} /** * Node -> Delete */ - private void toolStripMenuItem6_Click(object sender, EventArgs e) => treeView1.SNode.Delete(); + //private void toolStripMenuItem6_Click(object sender, EventArgs e) => treeView1.SNode.Delete(); //{ // treeView1.DeleteNode(); //} #endregion - #region TreeView Menu - folder + //#region TreeView Menu - folder /** * Add Page @@ -523,49 +535,36 @@ namespace bzit.bomg /** * Open All */ - private void toolStripMenuItem14_Click(object sender, EventArgs e) - { - if (treeView1.SelectedNode == null) - { - return; - } + //private void toolStripMenuItem14_Click(object sender, EventArgs e) + //{ + // if (treeView1.SelectedNode == null) + // { + // return; + // } - foreach (TreeNode tn in treeView1.SelectedNode.Nodes) - { - if (tn.Tag == null) - { - continue; - } + // foreach (TreeNode tn in treeView1.SelectedNode.Nodes) + // { + // if (tn.Tag == null) + // { + // continue; + // } - openBookmark(tn); - } - } + // openBookmark(tn); + // } + //} /** * Edit */ - private void toolStripMenuItem9_Click(object sender, EventArgs e) - { - treeView1.HasChanged = true; - treeView1.EditNode(); - } + //private void toolStripMenuItem9_Click(object sender, EventArgs e) + //{ + // treeView1.HasChanged = true; + // //##treeView1.EditNode(); + //} - /** - * Move Up - */ - private void toolStripMenuItem12_Click(object sender, EventArgs e) => treeView1.SNode.MoveUp(); - /** - * Move Down - */ - private void toolStripMenuItem13_Click(object sender, EventArgs e) => treeView1.SNode.MoveDown(); - /** - * Sort - */ - private void sortToolStripMenuItem_Click(object sender, EventArgs e) => treeView1.SNode.Sort(); - - #endregion + //#endregion protected void OpenBookmarkFile(string filename) { @@ -636,7 +635,33 @@ namespace bzit.bomg private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) { - if (e.Node == null) + if (e.Button != MouseButtons.Right) + { + return; + } + + switch (treeView1.SNode.GetNodeType()) + { + case RyzStudio.Windows.Forms.BookmarkTreeView.NodeType.Root: + rootTreeNodeMenu.Show(Cursor.Position); + break; + case RyzStudio.Windows.Forms.BookmarkTreeView.NodeType.Folder: + folderTreeNodeMenu.Show(Cursor.Position); + break; + case RyzStudio.Windows.Forms.BookmarkTreeView.NodeType.Page: + pageTreeNodeMenu.Show(Cursor.Position); + break; + default: + break; + } + + //BookmarkEditForm editForm = new BookmarkEditForm(treeView1); + //editForm.ShowDialog(); + + return; + + + if (e.Node == null) { return; } @@ -665,11 +690,11 @@ namespace bzit.bomg { if (e.Node.Equals(e.Node.TreeView.Nodes[0])) { - treeMenuRoot.Show(Cursor.Position); + rootTreeNodeMenu.Show(Cursor.Position); } else { - treeMenuFolder.Show(Cursor.Position); + folderTreeNodeMenu.Show(Cursor.Position); } } else @@ -680,7 +705,7 @@ namespace bzit.bomg } BookmarkItem bi = (BookmarkItem)e.Node.Tag; - treeMenuItem.Show(Cursor.Position); + pageTreeNodeMenu.Show(Cursor.Position); } } } @@ -700,20 +725,20 @@ namespace bzit.bomg case Keys.Apps: treeView1_NodeMouseClick(sender, new TreeNodeMouseClickEventArgs(tn, MouseButtons.Right, 1, tn.Bounds.X, tn.Bounds.Y)); return; - case Keys.F2: - if (tn.Tag == null) - { - return; - } + //case Keys.F2: + //if (tn.Tag == null) + //{ + // return; + //} - if (!(tn.Tag is BookmarkItem)) - { - return; - } + //if (!(tn.Tag is BookmarkItem)) + //{ + // return; + //} - toolStripMenuItem8_Click(sender, null); + //toolStripMenuItem8_Click(sender, null); - break; + //break; case Keys.F3: if (tn.Tag == null) { @@ -755,88 +780,157 @@ namespace bzit.bomg protected void openBookmark(TreeNode node) { - if (node == null) + if (treeView1.GetNodeType(node) != RyzStudio.Windows.Forms.BookmarkTreeView.NodeType.Page) { return; } - if (node.Tag == null) + BookmarkItemViewModel viewModel = (BookmarkItemViewModel)node.Tag; + if (viewModel == null) { return; } - if (!(node.Tag is BookmarkItem)) + if (string.IsNullOrWhiteSpace(viewModel.SiteAddress)) { return; } - BookmarkItem item = (BookmarkItem)node.Tag; - if (item == null) + try { - return; + System.Diagnostics.Process.Start(viewModel.SiteAddress); + } + catch + { + // do nothing } - if (string.IsNullOrEmpty(item.SiteAddress)) - { - return; - } - int bookmarkAction; - if (!int.TryParse(this.IconDatabase.GetConfig("core.bookmark.action", string.Empty), out bookmarkAction)) - { - bookmarkAction = 0; - } - string bookmarkCustom1 = this.IconDatabase.GetConfig("core.bookmark.customcommand1", string.Empty).Trim(); - string bookmarkCustom2 = this.IconDatabase.GetConfig("core.bookmark.customcommand2", string.Empty).Trim(); - switch (bookmarkAction) - { - case 1: - if (string.IsNullOrEmpty(bookmarkCustom1)) - { - return; - } - bookmarkCustom1 = bookmarkCustom1.Replace("%1", item.SiteAddress); - bookmarkCustom2 = bookmarkCustom2.Replace("%1", item.SiteAddress); - try - { - System.Diagnostics.Process.Start(bookmarkCustom1, bookmarkCustom2); - } - catch - { - // do nothing - } + //if (node == null) + //{ + // return; + //} - break; - default: - try - { - System.Diagnostics.Process.Start(item.SiteAddress); - } - catch - { - // do nothing - } + //if (node.Tag == null) + //{ + // return; + //} - break; - } + //if (!(node.Tag is BookmarkItem)) + //{ + // return; + //} + + //BookmarkItem item = (BookmarkItem)node.Tag; + //if (item == null) + //{ + // return; + //} + + //if (string.IsNullOrEmpty(item.SiteAddress)) + //{ + // return; + //} + + //int bookmarkAction; + //if (!int.TryParse(this.IconDatabase.GetConfig("core.bookmark.action", string.Empty), out bookmarkAction)) + //{ + // bookmarkAction = 0; + //} + + //string bookmarkCustom1 = this.IconDatabase.GetConfig("core.bookmark.customcommand1", string.Empty).Trim(); + //string bookmarkCustom2 = this.IconDatabase.GetConfig("core.bookmark.customcommand2", string.Empty).Trim(); + + //switch (bookmarkAction) + //{ + // case 1: + // if (string.IsNullOrEmpty(bookmarkCustom1)) + // { + // return; + // } + + // bookmarkCustom1 = bookmarkCustom1.Replace("%1", item.SiteAddress); + // bookmarkCustom2 = bookmarkCustom2.Replace("%1", item.SiteAddress); + + // try + // { + // System.Diagnostics.Process.Start(bookmarkCustom1, bookmarkCustom2); + // } + // catch + // { + // // do nothing + // } + + // break; + // default: + // try + // { + // System.Diagnostics.Process.Start(item.SiteAddress); + // } + // catch + // { + // // do nothing + // } + + // break; + //} } - private void toolStripButton1_Click(object sender, EventArgs e) + + #region root context menu + + private void addPageContextMenu_Click(object sender, EventArgs e) => (new BookmarkEditForm(treeView1)).ShowDialog(); + private void addFolderContextMenu_Click(object sender, EventArgs e) => treeView1.SelectedNode = treeView1.SNode.AddFolder(); + private void editContextMenu_Click(object sender, EventArgs e) => treeView1.SNode.Edit(); + private void sortContextMenu_Click(object sender, EventArgs e) => treeView1.SNode.Sort(); + + #endregion + + #region folder context menu + + private void addPageContextMenu2_Click(object sender, EventArgs e) => (new BookmarkEditForm(treeView1)).ShowDialog(); + private void addFolderContextMenu2_Click(object sender, EventArgs e) => treeView1.SelectedNode = treeView1.SNode.AddFolder(); + + private void openAllContextMenu_Click(object sender, EventArgs e) { - BookmarkItemModel model = new BookmarkItemModel() + if (treeView1.SelectedNode == null) { - SiteAddress = "http://www.hiimray.co.uk", - TreeviewPath = @"\hello\momo\" - }; - model.Update(); + return; + } - treeView1.AddItem_OnSelectedNode(model.ToViewModel()); + if (treeView1.SelectedNode.Nodes.Count <= 0) + { + return; + } - //MessageBox.Show(treeView1.Nodes.Count.ToString()); + foreach (TreeNode item in treeView1.SelectedNode.Nodes) + { + openBookmark(item); + } } + + private void editContextMenu2_Click(object sender, EventArgs e) => treeView1.SNode.Edit(); + private void deleteContextMenu_Click(object sender, EventArgs e) => treeView1.SNode.Delete(); + private void sortContextMenu2_Click(object sender, EventArgs e) => treeView1.SNode.Sort(); + private void moveUpContextMenu_Click(object sender, EventArgs e) => treeView1.SNode.MoveUp(); + private void moveDownContextMenu_Click(object sender, EventArgs e) => treeView1.SNode.MoveDown(); + + #endregion + + #region page context menu + + private void openContextMenu_Click(object sender, EventArgs e) => openBookmark(treeView1.SelectedNode); + private void editContextMenu3_Click(object sender, EventArgs e) => (new BookmarkEditForm(treeView1)).ShowDialog(); + private void deleteContextMenu2_Click(object sender, EventArgs e) => treeView1.SNode.Delete(); + private void moveUpContextMenu2_Click(object sender, EventArgs e) => treeView1.SNode.MoveUp(); + private void moveDownContextMenu2_Click(object sender, EventArgs e) => treeView1.SNode.MoveDown(); + + #endregion + + } } \ No newline at end of file diff --git a/MainForm.resx b/MainForm.resx index bd3674e..6cef617 100644 --- a/MainForm.resx +++ b/MainForm.resx @@ -117,21 +117,21 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 412, 17 + + 1034, 17 17, 17 - 307, 17 + 333, 17 AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADU - FwAAAk1TRnQBSQFMAgEBBwEAAWwBAgFsAQIBEAEAARABAAT/AREBAAj/AUIBTQE2BwABNgMAASgDAAFA + FwAAAk1TRnQBSQFMAgEBBwEAAcwBAgHMAQIBEAEAARABAAT/AREBAAj/AUIBTQE2BwABNgMAASgDAAFA AwABIAMAAQEBAAEQBgABEBQAAZkBSgEYAS4BtwEdAbcBGQG3ARkBtwEZAbcBGQG3ARkBtwEZAbcBGQG3 ARkBtwEdARcBLgGZAUoEAAGZAUoBGAEuAbcBHQG3ARkBtwEZAbcBGQG3ARkBtwEZAbcBGQG3ARkBtwEZ AbcBHQEXAS4BmQFKBAABmQFKARgBLgG3AR0BtwEZAbcBGQG3ARkBtwEZAbcBGQG3ARkBtwEZAbcBGQG3 @@ -236,7 +236,7 @@ - 109, 17 + 123, 17 @@ -254,29 +254,29 @@ - 779, 20 + 443, 17 - - 534, 17 + + 865, 17 - 903, 20 + 576, 17 - 208, 17 + 228, 17 iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHZSURBVDhPjZM9SxxRFIaNqfIfIlgJQpDgypZBEAshFkpS - SECIhYJdolikjFiZJizLYiPpAikC6W1EQiQhM4tK/AAlWOy6X+7szse9d2b09ZxLZpxxNyQHHraY8z77 - 3ruzPYl5SGSI7D/oJ3qJjsl4nmcZhnEVhiG6IaVELpd7T7tdJVkOO44D13VjWq0Wms0mKpWKlpTLZeTz - +Q7JPSLLC0IIKKX0J2PbNizLQrVa1QJqCf6SQqEQSfRoQdAqQl7+0IJIwoF2u41arZY6DsMZnabRAnH8 - GuLXQrwQBIE+d3SUer2um5RKpVvB9fmrB/b+i1Hj89imPJyH3JuBPFuH3/iK0HdSEm7C99FoNG4F8mhu - Qx0tQp4swf+9DnX6FsKYgrMzDLG/kmrCx+E7YVEsAJ7f9/amv8iTZRK8I8EqvOIzeOZLhIHSi4zv+/pe - WMLEAp7Ln5NDovgU6mwV6vgNnO1H8K2DOMxwi+hyuU1K4HwfnxDmJNxvj2HvDFL9DNTFlg5FcAOGw52C - 3Sez5seBD6GsIyDE4Rrk+aeOcJKUgCZ+ke6SbJGEn3FGp2m0wDTN67uCv0G7V5zR6T8zQj+Pyw+6BZLw - Dr3ONmX43xtPHzFCsPV/oHBP3w1tip0dw+Y0hQAAAABJRU5ErkJggg== + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHaSURBVDhPjZNNSxtRFIatXfU/KHQlFEqRJmRZhNJFoS6U + uiiC0C4UuquWLlxWurIbCSF0I90VXAju3ZhBLC01QUv9gEpxkZgvM8l83HtnRt+ec3HGGRPRAw9ZzHmf + vPdm0hebASJFZG7gPtFPdE3KdV2zUCicBUGAXkgpkc1ml2i3pyTDYdu24ThORLvdRqvVQrVa1ZJKpYJc + LtcluUNkeEEIAaWU/mQsy4JpmqjValpALcFfks/nQ4keLfDbJcjTn1oQSjjQ6XRQr9cTx2E4o9M0WiAO + ZiH+zEQLvu/rc4dHaTQaukm5XL4UnB+/u2ftTo5srz5dlnvTkDuvII8W4TU3EXh2QsJN+D6azealQO6/ + +aL230IezsH7twj19yPE9hhs4zHE7odEEz4O3wmLIgEwcdfdGV+Th+9J8JkEC3BLL+EWXyPwlV5kPM/T + 98ISJhLwnP4afSRKL6COFqAO5mFvPIRn/o7CDLcIL5fbJAT2j2fPRXEUztYwLOMB1U9BnazrUAg3YDjc + Lfj+ZKr4behrIBvwCbH3CfJ4pSscJyGgiV6kq8RbxOFnnNFpGi0wDOP8quA6aPeMMzp9MWn6eRx+0CsQ + h3fodbYow//eaAaJNMHW20DhvsH/Ib+cRcWEtS4AAAAASUVORK5CYII= @@ -294,8 +294,23 @@ TgDQASA1MVpwzwAAAABJRU5ErkJggg== - - 658, 20 + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG + YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9 + 0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw + bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc + VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9 + c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32 + Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo + mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+ + kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D + TgDQASA1MVpwzwAAAABJRU5ErkJggg== + + + + 705, 17 108 diff --git a/RyzStudio/Drawing/Rectangoid.cs b/RyzStudio/Drawing/Rectangoid.cs index de846cb..59a24d8 100644 --- a/RyzStudio/Drawing/Rectangoid.cs +++ b/RyzStudio/Drawing/Rectangoid.cs @@ -3,82 +3,122 @@ using System.Drawing.Drawing2D; namespace RyzStudio.Drawing { - public struct Rectangoid - { - int X; - int Y; - int Width; - int Height; - int Radius; + public struct Rectangoid + { + private int X; + private int Y; + private int Width; + private int Height; + private int 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(Rectangle rect, int radius) + { + X = rect.X; + Y = rect.Y; + Width = rect.Width; + Height = rect.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(Rectangle rect, int radius, int borderWidth) + { + rect.Inflate((-1 * borderWidth), (-1 * borderWidth)); - public Rectangoid(int width, int height, int radius) - { - X = 0; - Y = 0; - Width = width; - Height = height; - Radius = radius; - } + X = rect.X; + Y = rect.Y; + Width = rect.Width; + Height = rect.Height; + Radius = radius; + } - public Rectangoid(int width, int height) - { - X = 0; - Y = 0; - Width = width; - Height = height; - Radius = 0; - } + 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 width) - { - X = 0; - Y = 0; - Width = width; - Height = width; - Radius = 0; - } - - public GraphicsPath ToGraphicsPath() - { - GraphicsPath rv = new GraphicsPath(); - rv.AddLine(X + Radius, Y, X + Width - (Radius * 2), Y); - rv.AddArc(X + Width - (Radius * 2), Y, Radius * 2, Radius * 2, 270, 90); - rv.AddLine(X + Width, Y + Radius, X + Width, Y + Height - (Radius * 2)); - rv.AddArc(X + Width - (Radius * 2), Y + Height - (Radius * 2), Radius * 2, Radius * 2, 0, 90); - rv.AddLine(X + Width - (Radius * 2), Y + Height, X + Radius, Y + Height); - rv.AddArc(X, Y + Height - (Radius * 2), Radius * 2, Radius * 2, 90, 90); - rv.AddLine(X, Y + Height - (Radius * 2), X, Y + Radius); - rv.AddArc(X, Y, Radius * 2, Radius * 2, 180, 90); - rv.CloseFigure(); - - return rv; - } + public Rectangoid(int x, int y, int width, int height) + { + X = x; + Y = y; + Width = width; + Height = height; + Radius = 0; + } - public PointF GetOrigin() - { - PointF retval = new PointF(); - retval.X = ((float)Width / 2) + X; - retval.Y = ((float)Height / 2) + Y; - - return retval; - } - } + 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/Windows/Forms/HorizontalSeparator.Designer.cs b/RyzStudio/Windows/Forms/HorizontalSeparator.Designer.cs new file mode 100644 index 0000000..f2b384d --- /dev/null +++ b/RyzStudio/Windows/Forms/HorizontalSeparator.Designer.cs @@ -0,0 +1,37 @@ +namespace RyzStudio.Windows.Forms +{ + partial class HorizontalSeparator + { + /// + /// 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.None; + } + + #endregion + } +} diff --git a/RyzStudio/Windows/Forms/HorizontalSeparator.cs b/RyzStudio/Windows/Forms/HorizontalSeparator.cs new file mode 100644 index 0000000..ace86f8 --- /dev/null +++ b/RyzStudio/Windows/Forms/HorizontalSeparator.cs @@ -0,0 +1,25 @@ +using System.Drawing; +using System.Windows.Forms; + +namespace RyzStudio.Windows.Forms +{ + public partial class HorizontalSeparator : UserControl + { + public HorizontalSeparator() : base() + { + //InitializeComponent(); + + this.MaximumSize = new Size(SystemInformation.VirtualScreen.Width, 2); + } + + + 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, 0, this.DisplayRectangle.Width, 1)); + g.FillRectangle(new SolidBrush(Color.FromArgb(249, 251, 253)), new Rectangle(this.DisplayRectangle.Left, 1, this.DisplayRectangle.Width, 1)); + } + } +} diff --git a/RyzStudio/Windows/ThemedForms/Button.cs b/RyzStudio/Windows/ThemedForms/Button.cs new file mode 100644 index 0000000..06cefb6 --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/Button.cs @@ -0,0 +1,104 @@ +namespace RyzStudio.Windows.ThemedForms +{ + using System; + using System.ComponentModel; + using System.Drawing; + + public partial class Button : RyzStudio.Windows.ThemedForms.UserControl + { + protected ButtonState buttonState = ButtonState.Normal; + + public Button() : base() + { + InitializeComponent(); + + label1.ImageAlign = ContentAlignment.MiddleCenter; + + label1.Click += delegate { this.OnClick(null); }; + label1.MouseEnter += delegate { this.VisualState = ButtonState.Hover; }; + label1.MouseLeave += delegate { this.VisualState = ButtonState.Normal; }; + label1.MouseDown += delegate { this.VisualState = ButtonState.Down; }; + label1.MouseUp += delegate { this.VisualState = ButtonState.Normal; }; + } + + protected override void OnLoad(EventArgs e) + { + base.OnLoad(e); + + this.StyleOver.ForeImage = this.OverImage; + this.StyleDown.ForeImage = this.DownImage; + this.StyleDefault.ForeImage = this.DefaultImage; + + this.VisualState = ButtonState.Normal; + } + + protected ButtonState VisualState + { + get { return buttonState; } + set + { + switch (value) + { + case ButtonState.Normal: + if (this.VisualState == ButtonState.Down) + { + updateButton(StyleOver); + } + else + { + updateButton(StyleDefault); + } + + break; + case ButtonState.Hover: + updateButton(StyleOver); + break; + case ButtonState.Down: + updateButton(StyleDown); + break; + default: + updateButton(StyleDefault); + break; + } + + buttonState = 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; + + [Browsable(false)] + public ButtonStyle StyleOver { get; set; } = new ButtonStyle(Color.Black, Color.White); + + [Browsable(false)] + public ButtonStyle StyleDown { get; set; } = new ButtonStyle(Color.LightGray, Color.Black); + + [Browsable(false)] + public ButtonStyle StyleDefault { get; set; } = new ButtonStyle(Color.White, Color.Black); + } +} \ No newline at end of file diff --git a/RyzStudio/Windows/ThemedForms/Button.designer.cs b/RyzStudio/Windows/ThemedForms/Button.designer.cs new file mode 100644 index 0000000..8791a02 --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/Button.designer.cs @@ -0,0 +1,61 @@ +namespace RyzStudio.Windows.ThemedForms +{ + partial class Button + { + /// + /// 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(3, 3); + this.label1.Margin = new System.Windows.Forms.Padding(0); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(123, 27); + 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(3, 3, 2, 2); + this.Size = new System.Drawing.Size(128, 32); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Label label1; + } +} diff --git a/RyzStudio/Windows/ThemedForms/Button.resx b/RyzStudio/Windows/ThemedForms/Button.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/Button.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/ButtonState.cs b/RyzStudio/Windows/ThemedForms/ButtonState.cs new file mode 100644 index 0000000..9ca2060 --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/ButtonState.cs @@ -0,0 +1,9 @@ +namespace RyzStudio.Windows.ThemedForms +{ + public enum ButtonState + { + Normal = 0, + Hover, + Down + } +} diff --git a/RyzStudio/Windows/ThemedForms/ButtonStyle.cs b/RyzStudio/Windows/ThemedForms/ButtonStyle.cs new file mode 100644 index 0000000..57c7cb5 --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/ButtonStyle.cs @@ -0,0 +1,25 @@ +namespace RyzStudio.Windows.ThemedForms +{ + using System.Drawing; + + public class ButtonStyle + { + public Color BackColour { get; set; } + public Color PenColour { get; set; } + public Image ForeImage { get; set; } = null; + + public ButtonStyle(Color backColour, Color penColour) + { + this.BackColour = backColour; + this.PenColour = penColour; + this.ForeImage = null; + } + + public ButtonStyle(Color backColour, Color penColour, Image foreImage) + { + this.BackColour = backColour; + this.PenColour = penColour; + this.ForeImage = foreImage; + } + } +} diff --git a/RyzStudio/Windows/ThemedForms/Form.Designer.cs b/RyzStudio/Windows/ThemedForms/Form.Designer.cs new file mode 100644 index 0000000..a50fcc7 --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/Form.Designer.cs @@ -0,0 +1,52 @@ +namespace RyzStudio.Windows.ThemedForms +{ + partial class Form + { + /// + /// 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(); + // + // Form + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.BackColor = System.Drawing.Color.WhiteSmoke; + this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None; + this.ClientSize = new System.Drawing.Size(584, 381); + this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.ForeColor = System.Drawing.Color.Black; + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.MaximizeBox = false; + this.MinimumSize = new System.Drawing.Size(600, 420); + this.Name = "Form"; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.ResumeLayout(false); + + } + + #endregion + } +} \ No newline at end of file diff --git a/RyzStudio/Windows/ThemedForms/Form.cs b/RyzStudio/Windows/ThemedForms/Form.cs new file mode 100644 index 0000000..00dcbbf --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/Form.cs @@ -0,0 +1,186 @@ +namespace RyzStudio.Windows.ThemedForms +{ + using System; + using System.ComponentModel; + using System.Drawing; + using System.Windows.Forms; + + /// + /// Theme customised form + /// + public partial class Form : System.Windows.Forms.Form + { + protected Image topImage = null; + protected Color topFillColour = Color.FromArgb(15, 15, 15); + protected int topFillHeight = 52; + + protected Image bottomImage = null; + protected Color bottomFillColour = Color.FromArgb(15, 15, 15); + protected int bottomFillMargin = 19; + + /// + /// Initializes a new instance of the Form class + /// + public Form() + { + this.InitializeComponent(); + + this.BackColor = Color.FromArgb(246, 246, 246); + } + + /// + /// Onresize event + /// + /// Event argument + protected override void OnResize(EventArgs e) + { + base.OnResize(e); + + this.Invalidate(); + } + + /// + /// OnPaint event + /// + /// Event argument + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + + Graphics g = e.Graphics; + + Rectangle areaTop = new Rectangle(this.DisplayRectangle.Left, 0, this.DisplayRectangle.Width, topFillHeight); + Rectangle areaBottom = new Rectangle(this.DisplayRectangle.Left, (this.DisplayRectangle.Height - bottomFillMargin), this.DisplayRectangle.Width, bottomFillMargin); + + // draw header + if (topFillHeight > 0) + { + g.FillRectangle(new SolidBrush(topFillColour), areaTop); + } + + // draw footer + if (bottomFillMargin > 0) + { + g.FillRectangle(new SolidBrush(bottomFillColour), areaBottom); + } + + // draw logo + if (topImage != null) + { + g.DrawImageUnscaled(topImage, 0, 0); + } + + if (bottomImage != null) + { + g.DrawImageUnscaled(bottomImage, 0, (this.DisplayRectangle.Height - bottomImage.Height - bottomFillMargin), this.DisplayRectangle.Width, bottomImage.Height); + } + } + + #region public properties + + #endregion + + #region public properties (encapsulation) + + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public new Color BackColor { get { return base.BackColor; } set { base.BackColor = value; } } + + #endregion + + 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 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; + } + } +} \ No newline at end of file diff --git a/RyzStudio/Windows/ThemedForms/Form.resx b/RyzStudio/Windows/ThemedForms/Form.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/Form.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/MemoBox.cs b/RyzStudio/Windows/ThemedForms/MemoBox.cs new file mode 100644 index 0000000..6e16562 --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/MemoBox.cs @@ -0,0 +1,58 @@ +namespace RyzStudio.Windows.ThemedForms +{ + using RyzStudio.Drawing; + using System; + using System.ComponentModel; + using System.Drawing; + using System.Windows.Forms; + + public partial class MemoBox : RyzStudio.Windows.ThemedForms.UserControl + { + protected readonly Padding textboxPadding = new Padding(6, 6, 0, 6); + + public MemoBox() : base() + { + InitializeComponent(); + + this.Margin = new Padding(10, 6, 10, 6); + } + + //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); + //} + + protected override void OnGotFocus(EventArgs e) + { + base.OnGotFocus(e); + + textBox1.Focus(); + } + + [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; } + + [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/MemoBox.designer.cs b/RyzStudio/Windows/ThemedForms/MemoBox.designer.cs new file mode 100644 index 0000000..19ad7a6 --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/MemoBox.designer.cs @@ -0,0 +1,63 @@ +namespace RyzStudio.Windows.ThemedForms +{ + partial class MemoBox + { + /// + /// 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.AcceptsReturn = true; + 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.Multiline = true; + this.textBox1.Name = "textBox1"; + this.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.textBox1.Size = new System.Drawing.Size(121, 25); + this.textBox1.TabIndex = 0; + // + // MemoBox + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.Controls.Add(this.textBox1); + this.Name = "MemoBox"; + 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/MemoBox.resx b/RyzStudio/Windows/ThemedForms/MemoBox.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/MemoBox.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/ProgressBar.Designer.cs b/RyzStudio/Windows/ThemedForms/ProgressBar.Designer.cs new file mode 100644 index 0000000..032705b --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/ProgressBar.Designer.cs @@ -0,0 +1,72 @@ +namespace RyzStudio.Windows.ThemedForms +{ + partial class ProgressBar + { + private System.ComponentModel.IContainer components = null; + + 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.label3 = new System.Windows.Forms.Label(); + this.userControl1 = new RyzStudio.Windows.ThemedForms.ProgressBarInner(); + this.SuspendLayout(); + // + // label3 + // + this.label3.BackColor = System.Drawing.Color.Transparent; + this.label3.Dock = System.Windows.Forms.DockStyle.Fill; + this.label3.Font = new System.Drawing.Font("Segoe UI", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label3.Location = new System.Drawing.Point(4, 4); + this.label3.Margin = new System.Windows.Forms.Padding(0); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(803, 47); + this.label3.TabIndex = 144; + this.label3.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // userControl1 + // + this.userControl1.BarColour = System.Drawing.Color.FromArgb(((int)(((byte)(158)))), ((int)(((byte)(225)))), ((int)(((byte)(249))))); + this.userControl1.Dock = System.Windows.Forms.DockStyle.Fill; + this.userControl1.Location = new System.Drawing.Point(4, 4); + this.userControl1.Margin = new System.Windows.Forms.Padding(0); + this.userControl1.Maximum = 100; + this.userControl1.Minimum = 0; + this.userControl1.Name = "userControl1"; + this.userControl1.Size = new System.Drawing.Size(803, 47); + this.userControl1.TabIndex = 145; + this.userControl1.Value = 50; + // + // ProgressBar + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.userControl1); + this.Controls.Add(this.label3); + this.Margin = new System.Windows.Forms.Padding(0); + this.Name = "ProgressBar"; + this.Padding = new System.Windows.Forms.Padding(4, 4, 3, 3); + this.Size = new System.Drawing.Size(810, 54); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Label label3; + private ProgressBarInner userControl1; + } +} diff --git a/RyzStudio/Windows/ThemedForms/ProgressBar.cs b/RyzStudio/Windows/ThemedForms/ProgressBar.cs new file mode 100644 index 0000000..42dc1bf --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/ProgressBar.cs @@ -0,0 +1,29 @@ +using System; +using System.Drawing; + +namespace RyzStudio.Windows.ThemedForms +{ + public partial class ProgressBar : RyzStudio.Windows.ThemedForms.UserControl + { + public ProgressBar() : base() + { + InitializeComponent(); + + styleActive = new ThemeStyle(1, 3, 2, Color.FromArgb(112, 112, 112), Color.White); + } + + public int Minimum { get => userControl1.Minimum; set => userControl1.Minimum = value; } + public int Maximum { get => userControl1.Maximum; set => userControl1.Maximum = value; } + public int Value { get => userControl1.Value; set => userControl1.Value = value; } + + public Color BarColour { get => userControl1.BarColour; set => userControl1.BarColour = value; } + public Color BarTextColour { get => userControl1.BarTextColour; set => userControl1.BarTextColour = value; } + + protected override void OnSizeChanged(EventArgs e) + { + base.OnSizeChanged(e); + + this.Invalidate(); + } + } +} diff --git a/RyzStudio/Windows/ThemedForms/ProgressBar.resx b/RyzStudio/Windows/ThemedForms/ProgressBar.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/ProgressBar.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/ProgressBarInner.Designer.cs b/RyzStudio/Windows/ThemedForms/ProgressBarInner.Designer.cs new file mode 100644 index 0000000..8a0fc5c --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/ProgressBarInner.Designer.cs @@ -0,0 +1,63 @@ +namespace RyzStudio.Windows.ThemedForms +{ + partial class ProgressBarInner + { + /// + /// 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.label3 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // label3 + // + this.label3.BackColor = System.Drawing.Color.Transparent; + this.label3.Dock = System.Windows.Forms.DockStyle.Fill; + this.label3.Font = new System.Drawing.Font("Segoe UI", 6.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label3.Location = new System.Drawing.Point(4, 4); + this.label3.Margin = new System.Windows.Forms.Padding(0); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(803, 47); + this.label3.TabIndex = 144; + this.label3.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // ProgressBarInner + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.label3); + this.Margin = new System.Windows.Forms.Padding(0); + this.Name = "ProgressBarInner"; + this.Padding = new System.Windows.Forms.Padding(4, 4, 3, 3); + this.Size = new System.Drawing.Size(810, 54); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Label label3; + } +} diff --git a/RyzStudio/Windows/ThemedForms/ProgressBarInner.cs b/RyzStudio/Windows/ThemedForms/ProgressBarInner.cs new file mode 100644 index 0000000..acf6004 --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/ProgressBarInner.cs @@ -0,0 +1,197 @@ +using System; +using System.Drawing; +using System.Windows.Forms; + +namespace RyzStudio.Windows.ThemedForms +{ + public partial class ProgressBarInner : System.Windows.Forms.UserControl + { + protected int minimum = 0; + protected int maximum = 100; + protected int value = 0; + + public ProgressBarInner() : base() + { + InitializeComponent(); + + this.Padding = new Padding(0); + } + + public int Minimum + { + get + { + return minimum; + } + set + { + if (this.InvokeRequired) + { + this.Invoke(new MethodInvoker(() => { + setMinimum(value); + })); + } + else + { + setMinimum(value); + } + } + } + + public int Maximum + { + get + { + return maximum; + } + set + { + if (this.InvokeRequired) + { + this.Invoke(new MethodInvoker(() => { + setMaximum(value); + })); + } + else + { + setMaximum(value); + } + } + } + + public int Value + { + get + { + return value; + } + set + { + if (this.InvokeRequired) + { + this.Invoke(new MethodInvoker(() => { + setValue(value); + })); + } + else + { + setValue(value); + } + } + } + + public Color BarColour { get; set; } = Color.FromArgb(158, 225, 249); + + public Color BarTextColour + { + get => label3.ForeColor; + set => label3.ForeColor = value; + } + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + + Rectangle canvas = this.DisplayRectangle; + Graphics g = e.Graphics; + + if (this.Value > 0) + { + decimal result = decimal.Divide(canvas.Width, this.Maximum) * this.Value; + + canvas.Width = (int)Math.Round(result); + + g.FillRectangle(new SolidBrush(this.BarColour), canvas); + } + } + + protected void updateText() + { + if (label3.InvokeRequired) + { + label3.Invoke(new MethodInvoker(() => + { + label3.Text = string.Format("{0}/{1}", this.Value.ToString(), this.Maximum.ToString()); + })); + } + else + { + label3.Text = string.Format("{0}/{1}", this.Value.ToString(), this.Maximum.ToString()); + } + } + + protected void setMinimum(int value) + { + int m = value; + if (m < 0) + { + m = 0; + } + + if (m > this.Maximum) + { + m = this.Maximum; + } + + if (this.Value < m) + { + this.Value = m; + } + + if (this.value > this.Maximum) + { + this.value = this.Maximum; + } + + minimum = m; + updateText(); + this.Invalidate(); + } + + protected void setMaximum(int value) + { + int m = value; + if (m < 0) + { + m = 0; + } + + if (m < this.Minimum) + { + m = this.Minimum; + } + + if (this.Value > m) + { + this.Value = m; + } + + if (this.value < this.Minimum) + { + this.value = this.Minimum; + } + + maximum = m; + updateText(); + this.Invalidate(); + } + + protected void setValue(int value) + { + int m = value; + if (m < this.Minimum) + { + m = this.Minimum; + } + + if (m > this.Maximum) + { + m = this.Maximum; + } + + this.value = m; + updateText(); + this.Invalidate(); + } + } +} diff --git a/RyzStudio/Windows/ThemedForms/ProgressBarInner.resx b/RyzStudio/Windows/ThemedForms/ProgressBarInner.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/ProgressBarInner.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.cs b/RyzStudio/Windows/ThemedForms/TextBox.cs new file mode 100644 index 0000000..ec54dc7 --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/TextBox.cs @@ -0,0 +1,58 @@ +namespace RyzStudio.Windows.ThemedForms +{ + using RyzStudio.Drawing; + using System; + using System.ComponentModel; + using System.Drawing; + using System.Windows.Forms; + + public partial class TextBox : RyzStudio.Windows.ThemedForms.UserControl + { + protected readonly Padding textboxPadding = new Padding(6, 6, 6, 6); + + public TextBox() : base() + { + InitializeComponent(); + + this.Margin = new Padding(10, 6, 10, 6); + } + + 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); + } + + protected override void OnGotFocus(EventArgs e) + { + base.OnGotFocus(e); + + textBox1.Focus(); + } + + [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; } + + [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.designer.cs b/RyzStudio/Windows/ThemedForms/TextBox.designer.cs new file mode 100644 index 0000000..29231b0 --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/TextBox.designer.cs @@ -0,0 +1,60 @@ +namespace RyzStudio.Windows.ThemedForms +{ + partial class TextBox + { + /// + /// 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.resx b/RyzStudio/Windows/ThemedForms/TextBox.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/TextBox.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/ThemeStyle.cs b/RyzStudio/Windows/ThemedForms/ThemeStyle.cs new file mode 100644 index 0000000..71d1dee --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/ThemeStyle.cs @@ -0,0 +1,34 @@ +namespace RyzStudio.Windows.ThemedForms +{ + using System.Drawing; + + public struct 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; + } + } +} diff --git a/RyzStudio/Windows/ThemedForms/ThreadHelper.cs b/RyzStudio/Windows/ThemedForms/ThreadHelper.cs new file mode 100644 index 0000000..e1e3b82 --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/ThreadHelper.cs @@ -0,0 +1,51 @@ +using System.Drawing; +using System.Windows.Forms; + +namespace RyzStudio.Windows.ThemedForms +{ + public class ThreadHelper + { + public static void SetText(TextBox sender, string text) + { + if (sender.InvokeRequired) + { + sender.Invoke(new MethodInvoker(() => { + sender.Text = text; + })); + } + else + { + sender.Text = text; + } + } + + public static void SetText(MemoBox sender, string text) + { + if (sender.InvokeRequired) + { + sender.Invoke(new MethodInvoker(() => { + sender.Text = text; + })); + } + else + { + sender.Text = text; + } + } + + public static void SetImage(PictureBox sender, Image image) + { + if (sender.InvokeRequired) + { + sender.Invoke(new MethodInvoker(() => { + sender.Image = image; + })); + } + else + { + sender.Image = image; + } + } + + } +} diff --git a/RyzStudio/Windows/ThemedForms/UserControl.cs b/RyzStudio/Windows/ThemedForms/UserControl.cs new file mode 100644 index 0000000..8f25bdb --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/UserControl.cs @@ -0,0 +1,53 @@ +namespace RyzStudio.Windows.ThemedForms +{ + using System; + using System.Drawing; + using System.Windows.Forms; + using RyzStudio.Drawing; + using System.ComponentModel; + + public partial class UserControl : System.Windows.Forms.UserControl + { + protected ThemeStyle styleActive = new ThemeStyle(1, 3, 2, Color.FromArgb(112, 112, 112), Color.White); + + public UserControl() + { + 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 { return 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()); + } + } +} \ No newline at end of file diff --git a/RyzStudio/Windows/ThemedForms/UserControl.designer.cs b/RyzStudio/Windows/ThemedForms/UserControl.designer.cs new file mode 100644 index 0000000..ea91b3c --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/UserControl.designer.cs @@ -0,0 +1,37 @@ +namespace RyzStudio.Windows.ThemedForms +{ + partial class UserControl + { + /// + /// 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/MovableTreeView.cs b/Windows/Forms/BookmarkTreeView.cs similarity index 55% rename from RyzStudio/Windows/Forms/MovableTreeView.cs rename to Windows/Forms/BookmarkTreeView.cs index a2f9f6b..0da84f9 100644 --- a/RyzStudio/Windows/Forms/MovableTreeView.cs +++ b/Windows/Forms/BookmarkTreeView.cs @@ -1,11 +1,15 @@ -using System; +using bzit.bomg; +using bzit.bomg.Models; +using System; using System.ComponentModel; using System.Drawing; +using System.IO; using System.Windows.Forms; +using Resources = bzit.bomg.Properties.Resources; namespace RyzStudio.Windows.Forms { - public class MovableTreeView : System.Windows.Forms.TreeView + public class BookmarkTreeView : System.Windows.Forms.TreeView { public enum IconSet { @@ -15,7 +19,18 @@ namespace RyzStudio.Windows.Forms Default } - public MovableTreeViewSelectedNode SNode { get; set; } + public enum NodeType + { + None = 0, + Root, + Folder, + Page + } + + public BookmarkTreeViewSNode SNode { get; set; } + + protected IconDatabase iconDatabase = null; + public delegate void NodeCountUpdated(ulong v); @@ -23,28 +38,34 @@ namespace RyzStudio.Windows.Forms public NodeCountUpdated OnNodeCountUpdate = null; protected const char pathSeparator = '|'; - //protected const int folderImageIndex = 1; - //protected const int folderSelectedImageIndex = 2; protected TreeNode draggingNode = null; - protected bool allowBeginEdit = false; -//// public int[] folderImageIndex = { 1, 2 }; + //protected bool allowBeginEdit = false; protected ulong nodeCount = 0; protected bool hasChanged = false; - public MovableTreeView() + public BookmarkTreeView() : base() { - this.SNode = new MovableTreeViewSelectedNode(this); + this.SNode = new BookmarkTreeViewSNode(this); + + if (this.ImageList == null) + { + this.ImageList = new ImageList(); + } + + 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.transmit_blue); + this.ImageList.Images.Add(Resources.folder); + this.ImageList.Images.Add(Resources.folder_explore); + this.ImageList.Images.Add(Resources.page_white_world_bw); } - #region public properties - -/* [Category("Data")] - public char CustomPathSeparator - { - get { return customPathSeparator; } - set { customPathSeparator = value; } - }*/ + [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public new ImageList ImageList { get => base.ImageList; set => base.ImageList = value; } [Browsable(false)] public TreeNode[] NodeList @@ -66,26 +87,6 @@ namespace RyzStudio.Windows.Forms } } - //[Browsable(false)] - //public string[] NodeNameList - //{ - // get - // { - // string[] rv = new string[0]; - // if (this.Nodes.Count <= 0) - // { - // return rv; - // } - - // foreach (TreeNode tn in this.Nodes) - // { - // traverseNodeNameList(ref rv, tn); - // } - - // return rv; - // } - //} - [Browsable(false)] public ulong NodeCount { @@ -127,237 +128,122 @@ namespace RyzStudio.Windows.Forms } } - #endregion #region public methods - //public TreeNode AddFolder() - //{ - // return this.AddFolder("New Folder " + (new Random()).Next(10001, 99999).ToString()); - //} - - //public TreeNode AddFolder(string name) - //{ - // if (this.SelectedNode == null) - // { - // return null; - // } - - // if (this.SelectedNode.Tag != null) - // { - // return null; - // } - - // this.HasChanged = true; - - // TreeNode tn = this.SelectedNode.Nodes.Add(PathEncode(name), name, folderImageIndex, folderSelectedImageIndex); - // this.SelectedNode = tn; - - // OnAddFolderNode(tn); - - // return tn; - //} - - //public TreeNode AddBookmarkPage() - //{ - // return this.AddBookmarkPage("New Page " + (new Random()).Next(10001, 99999).ToString()); - //} - - //public TreeNode AddBookmarkPage(string name, int icon = 3) - //{ - // if (this.SelectedNode == null) - // { - // return null; - // } - - // if (this.SelectedNode.Tag != null) - // { - // return null; - // } - - // this.HasChanged = true; - - // TreeNode tn = this.SelectedNode.Nodes.Add(PathEncode(name), name, icon, icon); - // tn.Tag = new object(); - // tn.ToolTipText = name; - - // nodeCount++; - // NodeCountUpdate(nodeCount); - - // this.SelectedNode = tn; - - // OnAddItemNode(tn); - // return tn; - //} - - //public TreeNode AddBookmarkPageFullPath(string name, int icon = 3) - //{ - // if (this.Nodes.Count <= 0) - // { - // return null; - // } - - // this.HasChanged = true; - - // TreeNode tn2; - // if (!name.Contains(pathSeparator.ToString())) - // { - // tn2 = this.Nodes[0].Nodes.Add(name, PathDecode(name), icon, icon); - // tn2.ToolTipText = name; - // nodeCount++; - // } - // else - // { - // tn2 = this.Nodes[0]; - // string[] folders = name.Split(pathSeparator); - // for (int x = 0; x < (folders.Length - 1); x++) - // { - // string dr = folders[x].Trim(); - // if (tn2.Nodes.ContainsKey(dr)) - // { - // tn2 = tn2.Nodes[dr]; - // } - // else - // { - // tn2 = tn2.Nodes.Add(dr, PathDecode(dr), folderImageIndex, folderSelectedImageIndex); - // } - // } - - // string tm = folders[(folders.Length - 1)].Trim(); - // tn2 = tn2.Nodes.Add(tm, PathDecode(tm), icon, icon); - // tn2.Tag = new object(); - // tn2.ToolTipText = tm; - - // nodeCount++; - // } - - // NodeCountUpdate(nodeCount); - - // return tn2; - //} - - public void EditNode() + public bool InitialiseIconDatabase(out string message, string filename) { - this.HasChanged = true; + message = string.Empty; - if (this.SelectedNode == null) + if (string.IsNullOrWhiteSpace(filename)) { - return; + return false; } - if (!this.SelectedNode.IsEditing) + if (iconDatabase == null) { - allowBeginEdit = true; - this.SelectedNode.BeginEdit(); + 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 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); + + tn2.Nodes.Add(tn); + } + + public void AddOrUpdateItem_OnSelectedNode(BookmarkItemViewModel viewModel) + { + switch (this.SNode.GetNodeType()) + { + case NodeType.Root: + case NodeType.Folder: + addItem_OnSelectedNode(viewModel); + break; + case NodeType.Page: + updateItem_OnSelectedNode(viewModel); + break; + default: + break; } } - //public void DeleteNode() + public NodeType GetNodeType(TreeNode node) + { + if (node.Tag == null) + { + if (node.Equals(this.Nodes[0])) + { + return NodeType.Root; + } + else + { + return NodeType.Folder; + } + } + else + { + if (node.Tag is BookmarkItemViewModel) + { + return NodeType.Page; + } + else + { + return NodeType.None; + } + } + } + + + //public void EditNode() //{ - // if (this.SelectedNode == null) - // { - // return; - // } + // this.SNode. - // if (this.Nodes.Count <= 0) - // { - // return; - // } + // //this.HasChanged = true; - // if (this.SelectedNode.Equals(this.Nodes[0])) - // { - // return; - // } + // //if (this.SelectedNode == null) + // //{ + // // return; + // //} - // this.HasChanged = true; - - // this.SelectedNode.Remove(); - - // if (this.SelectedNode.Tag == null) - // { - // nodeCount = this.NodeCountCalc; - // } - // else - // { - // nodeCount--; - // } - - // NodeCountUpdate(nodeCount); - //} - - //public void SortNode() - //{ - // TreeNode tn = this.SelectedNode; - // string[] tnv = new string[0]; - // TreeNode[] tna = new TreeNode[0]; - - // this.HasChanged = true; - - // foreach (TreeNode tn2 in tn.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); - - // tn.Nodes.Clear(); - // foreach (TreeNode tn2 in tna) - // { - // tn.Nodes.Add(tn2); - // } - //} - - //public void MoveNodeUp() - //{ - // TreeNode tn = this.SelectedNode; - // if (tn.Parent == null) - // { - // return; - // } - - // if (tn.Index == 0) - // { - // return; - // } - - // this.HasChanged = true; - - // int n = tn.Index - 1; - - // TreeNode tn1 = tn.Parent; - // tn1.Nodes.Remove(tn); - // tn1.Nodes.Insert(n, tn); - - // this.SelectedNode = tn; - //} - - //public void MoveNodeDown() - //{ - // TreeNode tn = this.SelectedNode; - // if (tn.Parent == null) - // { - // return; - // } - - // TreeNode tn1 = tn.Parent; - - // this.HasChanged = true; - - // 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; + // //if (!this.SelectedNode.IsEditing) + // //{ + // // allowBeginEdit = true; + // // this.SelectedNode.BeginEdit(); + // //} //} public string GetNodeFullPath(TreeNode node) @@ -534,57 +420,57 @@ namespace RyzStudio.Windows.Forms protected override void OnBeforeLabelEdit(NodeLabelEditEventArgs e) { - if (!allowBeginEdit) - { - e.CancelEdit = true; - return; - } + //if (!allowBeginEdit) + //{ + // e.CancelEdit = true; + // return; + //} - this.HasChanged = true; + //this.HasChanged = true; - base.OnBeforeLabelEdit(e); + //base.OnBeforeLabelEdit(e); - if (e.Node == null) - { - e.CancelEdit = true; - } - else - { - if (e.Node.Tag == null) - { - // do it - } - else - { - e.CancelEdit = true; - } - } + //if (e.Node == null) + //{ + // e.CancelEdit = true; + //} + //else + //{ + // if (e.Node.Tag == null) + // { + // // do it + // } + // else + // { + // e.CancelEdit = true; + // } + //} } 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; - } + //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; + //allowBeginEdit = false; } protected override void OnPreviewKeyDown(PreviewKeyDownEventArgs e) @@ -616,11 +502,7 @@ namespace RyzStudio.Windows.Forms break; case Keys.F2: - if (tn.Tag == null) - { - this.EditNode(); - } - + this.SNode.Edit(); break; case Keys.Up: if (e.Modifiers == Keys.Control) @@ -639,7 +521,7 @@ namespace RyzStudio.Windows.Forms default: break; } - base.OnPreviewKeyDown(e); + //base.OnPreviewKeyDown(e); } protected virtual void NodeCountUpdate(ulong v) @@ -649,6 +531,117 @@ namespace RyzStudio.Windows.Forms #endregion + + protected int addIcon(BookmarkItemViewModel viewModel) => addIcon(viewModel.ToModel()); + + protected int addIcon(BookmarkItemModel model) + { + 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.ImageList.Images.Add(model.SiteAddress, rs); + + return this.ImageList.Images.IndexOfKey(model.SiteAddress); + } + } + + Bitmap bmp = model.RetrieveFavicon(); + if (bmp == null) + { + return (int)IconSet.Default; + } + + this.ImageList.Images.Add(model.SiteAddress, bmp); + + return this.ImageList.Images.IndexOfKey(model.SiteAddress); + } + + protected TreeNode addFolderPath(string path) + { + 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; + } + + foreach (string item in folderList) + { + if (tn.Nodes.ContainsKey(item)) + { + // do nothing + } + else + { + tn.Nodes.Add(item, item, (int)IconSet.Folder1, (int)IconSet.Folder2); + } + + tn = tn.Nodes[item]; + } + + return tn; + } + + protected void addItem_OnSelectedNode(BookmarkItemViewModel viewModel) + { + if (this.SelectedNode == null) + { + return; + } + + int iconIndex = addIcon(viewModel); + + TreeNode tn = new TreeNode(viewModel.SiteName, iconIndex, iconIndex); + tn.Tag = viewModel; + tn.ToolTipText = viewModel.ToString(); + + int n = this.SelectedNode.Nodes.Add(tn); + + this.SelectedNode = this.SelectedNode.Nodes[n]; + } + + protected void updateItem_OnSelectedNode(BookmarkItemViewModel viewModel) + { + if (this.SelectedNode == null) + { + return; + } + + int iconIndex = addIcon(viewModel); + + this.SelectedNode.Text = viewModel.SiteName; + this.SelectedNode.ImageIndex = iconIndex; + this.SelectedNode.SelectedImageIndex = iconIndex; + this.SelectedNode.Tag = viewModel; + this.SelectedNode.ToolTipText = viewModel.ToString(); + } + protected bool isNodeChild(TreeNode drag_node, TreeNode drop_node) { TreeNode tn = drop_node; @@ -686,22 +679,6 @@ namespace RyzStudio.Windows.Forms } } - //protected void traverseNodeNameList(ref string[] results, TreeNode node) - //{ - // foreach (TreeNode tn in node.Nodes) - // { - // if (tn.Tag == null) - // { - // traverseNodeNameList(ref results, tn); - // } - // else - // { - // Array.Resize(ref results, (results.Length + 1)); - // results[(results.Length - 1)] = this.GetNodeFullPath(tn); - // } - // } - //} - protected void traverseNodeCount(ref ulong results, TreeNode node) { foreach (TreeNode tn in node.Nodes) @@ -717,6 +694,12 @@ namespace RyzStudio.Windows.Forms } } + + + + + + protected virtual void OnAddFolderNode(TreeNode node) { } protected virtual void OnAddItemNode(TreeNode node) { } @@ -726,5 +709,10 @@ namespace RyzStudio.Windows.Forms //protected string PathDecode(string text) { return RyzStudio.String.DecodeFrom64(text); } protected string PathEncode(string text) { return System.Web.HttpUtility.UrlEncode(text); } protected string PathDecode(string text) { return System.Web.HttpUtility.UrlDecode(text); } + + + + + } } \ No newline at end of file diff --git a/RyzStudio/Windows/Forms/MovableTreeViewSelectedNode.cs b/Windows/Forms/BookmarkTreeViewSNode.cs similarity index 67% rename from RyzStudio/Windows/Forms/MovableTreeViewSelectedNode.cs rename to Windows/Forms/BookmarkTreeViewSNode.cs index 15e9440..9be4ca0 100644 --- a/RyzStudio/Windows/Forms/MovableTreeViewSelectedNode.cs +++ b/Windows/Forms/BookmarkTreeViewSNode.cs @@ -1,18 +1,23 @@ -using System; +using bzit.bomg.Models; +using System; using System.Windows.Forms; namespace RyzStudio.Windows.Forms { - public class MovableTreeViewSelectedNode + public class BookmarkTreeViewSNode { - protected MovableTreeView Treeview = null; + protected BookmarkTreeView Treeview = null; - public MovableTreeViewSelectedNode(MovableTreeView treeview) + public BookmarkTreeViewSNode(BookmarkTreeView treeview) { Treeview = treeview; } - protected TreeNode SelectedNode { get => this.Treeview.SelectedNode; set => this.Treeview.SelectedNode = value; } + protected TreeNode SelectedNode + { + get => this.Treeview.SelectedNode; + set => this.Treeview.SelectedNode = value; + } protected string encodeName(string name) => Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(name)); @@ -34,7 +39,7 @@ namespace RyzStudio.Windows.Forms return null; } - return this.SelectedNode.Nodes.Add(encodeName(name), name, (int)MovableTreeView.IconSet.Folder1, (int)MovableTreeView.IconSet.Folder2); + return this.SelectedNode.Nodes.Add(encodeName(name), name, (int)BookmarkTreeView.IconSet.Folder1, (int)BookmarkTreeView.IconSet.Folder2); } public TreeNode AddItem(string name, object tag) @@ -49,7 +54,7 @@ namespace RyzStudio.Windows.Forms return null; } - TreeNode tn = new TreeNode(name, (int)MovableTreeView.IconSet.Default, (int)MovableTreeView.IconSet.Default); + TreeNode tn = new TreeNode(name, (int)BookmarkTreeView.IconSet.Default, (int)BookmarkTreeView.IconSet.Default); tn.Tag = tag; this.SelectedNode.Nodes.Add(tn); @@ -57,35 +62,6 @@ namespace RyzStudio.Windows.Forms return tn; } - - //public TreeNode AddPage() => this.AddPage("New Page (" + DateTime.Now.ToString("yyyy-MM-dd-HHmmss") + ")"); - - //public TreeNode AddPage(string name) - //{ - // if (this.SelectedNode == null) - // { - // return null; - // } - - // if (this.SelectedNode.Tag != null) - // { - // return null; - // } - - // TreeNode tn = this.SelectedNode.Nodes.Add(encodeName(name), name, (int)MovableTreeView.IconSet.Default, (int)MovableTreeView.IconSet.Default); - // tn.Tag = new object(); - // tn.ToolTipText = name; - - // nodeCount++; - // NodeCountUpdate(nodeCount); - - // this.SelectedNode = tn; - - // OnAddItemNode(tn); - // return tn; - //} - - public void Delete() { if (this.SelectedNode == null) @@ -106,6 +82,48 @@ namespace RyzStudio.Windows.Forms 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: + this.SelectedNode.BeginEdit(); + break; + case BookmarkTreeView.NodeType.Page: + this.SelectedNode.BeginEdit(); + break; + default: + break; + } + + + //this.HasChanged = true; + + //if (this.SelectedNode == null) + //{ + // return; + //} + + //if (!this.SelectedNode.IsEditing) + //{ + // allowBeginEdit = true; + // this.SelectedNode.BeginEdit(); + //} + } + + public BookmarkTreeView.NodeType GetNodeType() => this.Treeview.GetNodeType(this.SelectedNode); + public void MoveDown() { if (this.SelectedNode == null) diff --git a/bomg.csproj b/bomg.csproj index 7c502d1..f7e7271 100644 --- a/bomg.csproj +++ b/bomg.csproj @@ -97,7 +97,59 @@ - + + + UserControl + + + HorizontalSeparator.cs + + + + UserControl + + + MemoBox.cs + + + UserControl + + + TextBox.cs + + + UserControl + + + Button.cs + + + + + Form + + + Form.cs + + + UserControl + + + ProgressBar.cs + + + UserControl + + + ProgressBarInner.cs + + + + UserControl + + + UserControl.cs + @@ -157,15 +209,27 @@ BigUserControl.cs - + Component - - Component - - - BookmarkTreeView.cs - + + MemoBox.cs + + + TextBox.cs + + + Button.cs + + + Form.cs + + + ProgressBar.cs + + + ProgressBarInner.cs + UpdateIconForm.cs From 0e70f6b56e1db043879688487e337224a46e76a2 Mon Sep 17 00:00:00 2001 From: Ray Date: Fri, 19 Apr 2019 03:51:55 +0100 Subject: [PATCH 03/34] WIP --- BookmarkEditForm.Designer.cs | 164 +++++++-------- BookmarkEditForm.cs | 90 +------- BookmarkEditForm.resx | 3 - MainForm.Designer.cs | 331 +++++++++++++----------------- MainForm.cs | 100 +++------ MainForm.resx | 160 +-------------- NewSessionForm.Designer.cs | 103 +++++----- NewSessionForm.cs | 12 +- NewSessionForm.resx | 25 --- UpdateIconForm.cs | 10 +- Windows/Forms/BookmarkTreeView.cs | 125 ++++++----- 11 files changed, 391 insertions(+), 732 deletions(-) diff --git a/BookmarkEditForm.Designer.cs b/BookmarkEditForm.Designer.cs index f9c7c92..5fd0a71 100644 --- a/BookmarkEditForm.Designer.cs +++ b/BookmarkEditForm.Designer.cs @@ -28,20 +28,18 @@ namespace bzit.bomg /// private void InitializeComponent() { - this.components = new System.ComponentModel.Container(); this.label1 = new System.Windows.Forms.Label(); this.label2 = new System.Windows.Forms.Label(); - this.toolTip1 = new System.Windows.Forms.ToolTip(this.components); this.label3 = new System.Windows.Forms.Label(); this.pictureBox2 = new System.Windows.Forms.PictureBox(); this.pictureBox1 = new System.Windows.Forms.PictureBox(); - this.button2 = new RyzStudio.Windows.ThemedForms.Button(); - this.button1 = new RyzStudio.Windows.ThemedForms.Button(); this.label5 = new System.Windows.Forms.Label(); - this.horizontalSeparator1 = new RyzStudio.Windows.Forms.HorizontalSeparator(); - this.textBox1 = new RyzStudio.Windows.ThemedForms.TextBox(); - this.textBox2 = new RyzStudio.Windows.ThemedForms.TextBox(); this.memoBox1 = new RyzStudio.Windows.ThemedForms.MemoBox(); + this.textBox2 = new RyzStudio.Windows.ThemedForms.TextBox(); + this.textBox1 = new RyzStudio.Windows.ThemedForms.TextBox(); + this.horizontalSeparator1 = new RyzStudio.Windows.Forms.HorizontalSeparator(); + this.button1 = new RyzStudio.Windows.ThemedForms.Button(); + this.button2 = new RyzStudio.Windows.ThemedForms.Button(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); this.SuspendLayout(); @@ -66,11 +64,6 @@ namespace bzit.bomg this.label2.TabIndex = 4; this.label2.Text = "Address"; // - // toolTip1 - // - this.toolTip1.Active = false; - this.toolTip1.BackColor = System.Drawing.Color.IndianRed; - // // label3 // this.label3.AutoSize = true; @@ -102,27 +95,72 @@ namespace bzit.bomg this.pictureBox1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; this.pictureBox1.ErrorImage = null; this.pictureBox1.InitialImage = null; - this.pictureBox1.Location = new System.Drawing.Point(287, 237); + this.pictureBox1.Location = new System.Drawing.Point(286, 217); this.pictureBox1.Name = "pictureBox1"; this.pictureBox1.Size = new System.Drawing.Size(32, 32); this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage; this.pictureBox1.TabIndex = 60; this.pictureBox1.TabStop = false; // - // button2 + // label5 // - this.button2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.button2.BackColor = System.Drawing.Color.Transparent; - this.button2.DefaultImage = null; - this.button2.DownImage = null; - this.button2.LabelText = "&Save"; - this.button2.Location = new System.Drawing.Point(325, 237); - this.button2.Name = "button2"; - this.button2.OverImage = null; - this.button2.Padding = new System.Windows.Forms.Padding(4, 4, 3, 3); - this.button2.Size = new System.Drawing.Size(107, 32); - this.button2.TabIndex = 4; - this.button2.Click += new System.EventHandler(this.button2_Click); + this.label5.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.label5.ForeColor = System.Drawing.Color.OrangeRed; + this.label5.Location = new System.Drawing.Point(9, 217); + this.label5.Margin = new System.Windows.Forms.Padding(3); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(271, 32); + this.label5.TabIndex = 64; + this.label5.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // memoBox1 + // + this.memoBox1.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.memoBox1.BackColor = System.Drawing.Color.Transparent; + this.memoBox1.Location = new System.Drawing.Point(96, 103); + this.memoBox1.Margin = new System.Windows.Forms.Padding(10, 6, 10, 6); + this.memoBox1.Name = "memoBox1"; + this.memoBox1.Padding = new System.Windows.Forms.Padding(10, 10, 3, 9); + this.memoBox1.Size = new System.Drawing.Size(336, 83); + this.memoBox1.TabIndex = 69; + // + // 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.Location = new System.Drawing.Point(96, 59); + 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(259, 32); + this.textBox2.TabIndex = 67; + // + // 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.Location = new System.Drawing.Point(96, 15); + 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(259, 32); + this.textBox1.TabIndex = 66; + // + // horizontalSeparator1 + // + this.horizontalSeparator1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.horizontalSeparator1.Location = new System.Drawing.Point(12, 202); + this.horizontalSeparator1.Margin = new System.Windows.Forms.Padding(3, 10, 3, 10); + this.horizontalSeparator1.MaximumSize = new System.Drawing.Size(4920, 2); + this.horizontalSeparator1.Name = "horizontalSeparator1"; + this.horizontalSeparator1.Size = new System.Drawing.Size(420, 2); + this.horizontalSeparator1.TabIndex = 65; // // button1 // @@ -139,71 +177,26 @@ namespace bzit.bomg this.button1.TabIndex = 2; this.button1.Click += new System.EventHandler(this.button1_Click); // - // label5 + // button2 // - this.label5.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.label5.ForeColor = System.Drawing.Color.OrangeRed; - this.label5.Location = new System.Drawing.Point(9, 237); - this.label5.Margin = new System.Windows.Forms.Padding(3); - this.label5.Name = "label5"; - this.label5.Size = new System.Drawing.Size(272, 32); - this.label5.TabIndex = 64; - this.label5.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; - // - // horizontalSeparator1 - // - this.horizontalSeparator1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.horizontalSeparator1.Location = new System.Drawing.Point(12, 222); - this.horizontalSeparator1.Margin = new System.Windows.Forms.Padding(3, 10, 3, 10); - this.horizontalSeparator1.MaximumSize = new System.Drawing.Size(4920, 2); - this.horizontalSeparator1.Name = "horizontalSeparator1"; - this.horizontalSeparator1.Size = new System.Drawing.Size(420, 2); - this.horizontalSeparator1.TabIndex = 65; - // - // 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.Location = new System.Drawing.Point(96, 15); - 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(259, 32); - this.textBox1.TabIndex = 66; - // - // 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.Location = new System.Drawing.Point(96, 59); - 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(259, 32); - this.textBox2.TabIndex = 67; - // - // memoBox1 - // - this.memoBox1.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.memoBox1.BackColor = System.Drawing.Color.Transparent; - this.memoBox1.Location = new System.Drawing.Point(96, 103); - this.memoBox1.Margin = new System.Windows.Forms.Padding(10, 6, 10, 6); - this.memoBox1.Name = "memoBox1"; - this.memoBox1.Padding = new System.Windows.Forms.Padding(10, 10, 3, 9); - this.memoBox1.Size = new System.Drawing.Size(336, 103); - this.memoBox1.TabIndex = 69; + this.button2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.button2.BackColor = System.Drawing.Color.Transparent; + this.button2.DefaultImage = null; + this.button2.DownImage = null; + this.button2.LabelText = "&Save"; + this.button2.Location = new System.Drawing.Point(324, 217); + this.button2.Name = "button2"; + this.button2.OverImage = null; + this.button2.Padding = new System.Windows.Forms.Padding(4, 4, 3, 3); + this.button2.Size = new System.Drawing.Size(108, 32); + this.button2.TabIndex = 4; + this.button2.Click += new System.EventHandler(this.button2_Click); // // BookmarkEditForm // this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; this.BackColor = System.Drawing.Color.White; - this.ClientSize = new System.Drawing.Size(444, 281); + this.ClientSize = new System.Drawing.Size(444, 261); this.Controls.Add(this.memoBox1); this.Controls.Add(this.textBox2); this.Controls.Add(this.textBox1); @@ -236,7 +229,6 @@ namespace bzit.bomg private System.Windows.Forms.Label label1; private System.Windows.Forms.Label label2; - private System.Windows.Forms.ToolTip toolTip1; private System.Windows.Forms.Label label3; private System.Windows.Forms.PictureBox pictureBox2; private System.Windows.Forms.PictureBox pictureBox1; diff --git a/BookmarkEditForm.cs b/BookmarkEditForm.cs index a3bd390..5771874 100644 --- a/BookmarkEditForm.cs +++ b/BookmarkEditForm.cs @@ -11,29 +11,25 @@ namespace bzit.bomg { public partial class BookmarkEditForm : Form { - protected BackgroundWorker threadWorker1 = null; + protected BackgroundWorker threadWorker = null; protected BookmarkItemModel itemModel = null; protected BookmarkTreeView treeView = null; - //protected TreeNode treeNode = null; - //public BookmarkEditForm(ref TreeNode node) : base() public BookmarkEditForm(BookmarkTreeView treeview) : base() { InitializeComponent(); treeView = treeview; - //treeNode = node; - this.StartPosition = FormStartPosition.WindowsDefaultLocation; - if (threadWorker1 == null) + if (threadWorker == null) { - threadWorker1 = new BackgroundWorker(); - threadWorker1.WorkerReportsProgress = threadWorker1.WorkerSupportsCancellation = true; - threadWorker1.DoWork += threadWorker1_DoWork; - threadWorker1.RunWorkerCompleted += threadWorker1_RunWorkerCompleted; + threadWorker = new BackgroundWorker(); + threadWorker.WorkerReportsProgress = threadWorker.WorkerSupportsCancellation = true; + threadWorker.DoWork += threadWorker1_DoWork; + threadWorker.RunWorkerCompleted += threadWorker1_RunWorkerCompleted; } } @@ -78,30 +74,6 @@ namespace bzit.bomg updateViewModel(bookmarkItem); } } - - - //if (parentNode.Tag != null) - //{ - // if (parentNode.Tag is BookmarkItem) - // { - // bookmarkItem = (BookmarkItem)parentNode.Tag; - // tbxName.Text = bookmarkItem.GetName(); - // tbxAddress.Text = bookmarkItem.SiteAddress; - // tbxDescription.Text = bookmarkItem.Description; - - // if (parentNode.TreeView.ImageList != null) - // { - // if (parentNode.ImageIndex >= 0) - // { - // pbxIcon.Image = parentNode.TreeView.ImageList.Images[parentNode.ImageIndex]; - // } - // else - // { - // pbxIcon.Image = parentNode.TreeView.ImageList.Images[parentNode.ImageKey]; - // } - // } - // } - //} } protected override void OnClosing(CancelEventArgs e) @@ -116,7 +88,7 @@ namespace bzit.bomg protected bool IsBusy { - get => threadWorker1.IsBusy; + get => threadWorker.IsBusy; set { textBox1.Enabled = textBox2.Enabled = memoBox1.Enabled = !value; @@ -152,7 +124,7 @@ namespace bzit.bomg this.IsBusy = true; - threadWorker1.RunWorkerAsync(); + threadWorker.RunWorkerAsync(); } private void button2_Click(object sender, EventArgs e) @@ -175,51 +147,5 @@ namespace bzit.bomg this.Close(); } - - - - - // private void btnSave_Click(object sender, EventArgs e) - // { - // if (this.IsBusy) - // { - // return; - // } - - // if (itemModel == null) - // { - // itemModel = new BookmarkItemModel(); - // } - - // itemModel.SiteName = textBox1.Text?.Trim(); - // itemModel.SiteAddress = textBox2.Text?.Trim(); - // itemModel.SiteDescription = memoBox1.Text?.Trim(); - - // treeView?.AddOrUpdateItem_OnSelectedNode(itemModel.ToViewModel()); - - //// if (bookmarkItem == null) - //// { - //// bookmarkItem = new BookmarkItem(); - //// } - - //// bookmarkItem.ChangeName(textBox1.Text.Trim()); - //// bookmarkItem.SiteAddress = textBox2.Text.Trim(); - //// bookmarkItem.Description = memoBox1.Text.Trim(); - - //// parentNode.Text = textBox1.Text.Trim(); - //////// parentNode.ImageIndex = parentNode.SelectedImageIndex = 3; - //// parentNode.ToolTipText = string.Concat(bookmarkItem.SiteAddress, Environment.NewLine, bookmarkItem.Description).Trim(); - //// parentNode.Tag = bookmarkItem; - - //// BookmarkTreeView bookmarkTreeView = (BookmarkTreeView)parentNode.TreeView; - //// if (bookmarkTreeView != null) - //// { - //// //##parentNode.ImageIndex = parentNode.SelectedImageIndex = bookmarkTreeView.AddToIconList(bookmarkItem); - //// } - - // this.Close(); - // } - - } } \ No newline at end of file diff --git a/BookmarkEditForm.resx b/BookmarkEditForm.resx index 9d9bc4d..d58980a 100644 --- a/BookmarkEditForm.resx +++ b/BookmarkEditForm.resx @@ -117,7 +117,4 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 17, 17 - \ No newline at end of file diff --git a/MainForm.Designer.cs b/MainForm.Designer.cs index 3b6f0a2..7366db7 100644 --- a/MainForm.Designer.cs +++ b/MainForm.Designer.cs @@ -44,7 +44,6 @@ namespace bzit.bomg this.statusBarPanel1 = new System.Windows.Forms.StatusBarPanel(); this.statusBarPanel2 = new System.Windows.Forms.StatusBarPanel(); this.oToolTip1 = new System.Windows.Forms.ToolTip(this.components); - this.imageList1 = new System.Windows.Forms.ImageList(this.components); this.toolStrip1 = new System.Windows.Forms.ToolStrip(); this.toolStripDropDownButton1 = new System.Windows.Forms.ToolStripDropDownButton(); this.newFileMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -92,8 +91,6 @@ namespace bzit.bomg this.openMenuBarItem = new System.Windows.Forms.ToolStripButton(); this.saveMenuBarItem = new System.Windows.Forms.ToolStripButton(); this.toolStripSeparator9 = new System.Windows.Forms.ToolStripSeparator(); - this.toolStripButton1 = new System.Windows.Forms.ToolStripButton(); - this.toolStripButton2 = new System.Windows.Forms.ToolStripButton(); this.rootTreeNodeMenu = new System.Windows.Forms.ContextMenuStrip(this.components); this.toolStripMenuItem17 = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripMenuItem18 = new System.Windows.Forms.ToolStripMenuItem(); @@ -110,9 +107,9 @@ namespace bzit.bomg this.toolStrip2.SuspendLayout(); this.rootTreeNodeMenu.SuspendLayout(); this.SuspendLayout(); - // + // // pageTreeNodeMenu - // + // this.pageTreeNodeMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.toolStripMenuItem4, this.toolStripSeparator3, @@ -123,54 +120,54 @@ namespace bzit.bomg this.moveFileToToolStripMenuItem}); this.pageTreeNodeMenu.Name = "listViewMenu"; this.pageTreeNodeMenu.Size = new System.Drawing.Size(139, 126); - // + // // toolStripMenuItem4 - // + // this.toolStripMenuItem4.Name = "toolStripMenuItem4"; this.toolStripMenuItem4.Size = new System.Drawing.Size(138, 22); this.toolStripMenuItem4.Text = "&Open"; this.toolStripMenuItem4.Click += new System.EventHandler(this.openContextMenu_Click); - // + // // toolStripSeparator3 - // + // this.toolStripSeparator3.Name = "toolStripSeparator3"; this.toolStripSeparator3.Size = new System.Drawing.Size(135, 6); - // + // // toolStripMenuItem8 - // + // this.toolStripMenuItem8.Name = "toolStripMenuItem8"; this.toolStripMenuItem8.Size = new System.Drawing.Size(138, 22); this.toolStripMenuItem8.Text = "E&dit"; this.toolStripMenuItem8.Click += new System.EventHandler(this.editContextMenu3_Click); - // + // // toolStripMenuItem6 - // + // this.toolStripMenuItem6.Name = "toolStripMenuItem6"; this.toolStripMenuItem6.Size = new System.Drawing.Size(138, 22); this.toolStripMenuItem6.Text = "D&elete"; this.toolStripMenuItem6.Click += new System.EventHandler(this.deleteContextMenu2_Click); - // + // // toolStripSeparator2 - // + // this.toolStripSeparator2.Name = "toolStripSeparator2"; this.toolStripSeparator2.Size = new System.Drawing.Size(135, 6); - // + // // listViewMenuItem1 - // + // this.listViewMenuItem1.Name = "listViewMenuItem1"; this.listViewMenuItem1.Size = new System.Drawing.Size(138, 22); this.listViewMenuItem1.Text = "Move &Up"; this.listViewMenuItem1.Click += new System.EventHandler(this.moveUpContextMenu2_Click); - // + // // moveFileToToolStripMenuItem - // + // this.moveFileToToolStripMenuItem.Name = "moveFileToToolStripMenuItem"; this.moveFileToToolStripMenuItem.Size = new System.Drawing.Size(138, 22); this.moveFileToToolStripMenuItem.Text = "Move &Down"; this.moveFileToToolStripMenuItem.Click += new System.EventHandler(this.moveDownContextMenu2_Click); - // + // // statusBar1 - // + // this.statusBar1.Font = new System.Drawing.Font("Verdana", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.statusBar1.Location = new System.Drawing.Point(0, 634); this.statusBar1.Name = "statusBar1"; @@ -181,32 +178,20 @@ namespace bzit.bomg this.statusBar1.Size = new System.Drawing.Size(304, 20); this.statusBar1.SizingGrip = false; this.statusBar1.TabIndex = 9; - // + // // statusBarPanel1 - // + // this.statusBarPanel1.AutoSize = System.Windows.Forms.StatusBarPanelAutoSize.Spring; this.statusBarPanel1.Name = "statusBarPanel1"; this.statusBarPanel1.Width = 204; - // + // // statusBarPanel2 - // + // this.statusBarPanel2.Alignment = System.Windows.Forms.HorizontalAlignment.Center; this.statusBarPanel2.Name = "statusBarPanel2"; - // - // imageList1 - // - this.imageList1.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList1.ImageStream"))); - this.imageList1.TransparentColor = System.Drawing.Color.Transparent; - this.imageList1.Images.SetKeyName(0, "transmit_blue.png"); - this.imageList1.Images.SetKeyName(1, "folder.png"); - this.imageList1.Images.SetKeyName(2, "folder_explore.png"); - this.imageList1.Images.SetKeyName(3, "page_blue.png"); - this.imageList1.Images.SetKeyName(4, "page.png"); - this.imageList1.Images.SetKeyName(5, "page_green.png"); - this.imageList1.Images.SetKeyName(6, "page_red.png"); - // + // // toolStrip1 - // + // this.toolStrip1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None; this.toolStrip1.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden; this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { @@ -223,9 +208,9 @@ namespace bzit.bomg this.toolStrip1.Size = new System.Drawing.Size(304, 25); this.toolStrip1.TabIndex = 25; this.toolStrip1.Text = "toolStrip1"; - // + // // toolStripDropDownButton1 - // + // this.toolStripDropDownButton1.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; this.toolStripDropDownButton1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.newFileMenuItem, @@ -244,89 +229,89 @@ namespace bzit.bomg this.toolStripDropDownButton1.ShowDropDownArrow = false; this.toolStripDropDownButton1.Size = new System.Drawing.Size(29, 22); this.toolStripDropDownButton1.Text = "&File"; - // + // // newFileMenuItem - // + // this.newFileMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("newFileMenuItem.Image"))); this.newFileMenuItem.Name = "newFileMenuItem"; this.newFileMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.N))); this.newFileMenuItem.Size = new System.Drawing.Size(186, 22); this.newFileMenuItem.Text = "&New"; this.newFileMenuItem.Click += new System.EventHandler(this.newMenuItem_Click); - // + // // openFileMenuItem - // + // this.openFileMenuItem.Image = global::bzit.bomg.Properties.Resources.folder_page; this.openFileMenuItem.Name = "openFileMenuItem"; this.openFileMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O))); this.openFileMenuItem.Size = new System.Drawing.Size(186, 22); this.openFileMenuItem.Text = "&Open"; this.openFileMenuItem.Click += new System.EventHandler(this.openMenuItem_Click); - // + // // toolStripSeparator1 - // + // this.toolStripSeparator1.Name = "toolStripSeparator1"; this.toolStripSeparator1.Size = new System.Drawing.Size(183, 6); - // + // // closeFileMenuItem - // + // this.closeFileMenuItem.Name = "closeFileMenuItem"; this.closeFileMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.W))); this.closeFileMenuItem.Size = new System.Drawing.Size(186, 22); this.closeFileMenuItem.Text = "&Close"; this.closeFileMenuItem.Click += new System.EventHandler(this.closeMenuItem_Click); - // + // // toolStripSeparator4 - // + // this.toolStripSeparator4.Name = "toolStripSeparator4"; this.toolStripSeparator4.Size = new System.Drawing.Size(183, 6); - // + // // saveFileMenuItem - // + // this.saveFileMenuItem.Image = global::bzit.bomg.Properties.Resources.disk; this.saveFileMenuItem.Name = "saveFileMenuItem"; this.saveFileMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S))); this.saveFileMenuItem.Size = new System.Drawing.Size(186, 22); this.saveFileMenuItem.Text = "&Save"; this.saveFileMenuItem.Click += new System.EventHandler(this.importSnapshotToolStripMenuItem_Click); - // + // // saveAsFileMenuItem - // + // this.saveAsFileMenuItem.Image = global::bzit.bomg.Properties.Resources.page_white_disk; this.saveAsFileMenuItem.Name = "saveAsFileMenuItem"; - this.saveAsFileMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + this.saveAsFileMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) | System.Windows.Forms.Keys.S))); this.saveAsFileMenuItem.Size = new System.Drawing.Size(186, 22); this.saveAsFileMenuItem.Text = "Save &As"; this.saveAsFileMenuItem.Click += new System.EventHandler(this.exportSnapshotToolStripMenuItem_Click); - // + // // toolStripSeparator8 - // + // this.toolStripSeparator8.Name = "toolStripSeparator8"; this.toolStripSeparator8.Size = new System.Drawing.Size(183, 6); - // + // // exportFileMenuItem - // + // this.exportFileMenuItem.Enabled = false; this.exportFileMenuItem.Name = "exportFileMenuItem"; this.exportFileMenuItem.Size = new System.Drawing.Size(186, 22); this.exportFileMenuItem.Text = "&Export"; this.exportFileMenuItem.Click += new System.EventHandler(this.toolStripMenuItem7_Click); - // + // // toolStripSeparator6 - // + // this.toolStripSeparator6.Name = "toolStripSeparator6"; this.toolStripSeparator6.Size = new System.Drawing.Size(183, 6); - // + // // exitFileMenuItem - // + // this.exitFileMenuItem.Name = "exitFileMenuItem"; this.exitFileMenuItem.Size = new System.Drawing.Size(186, 22); this.exitFileMenuItem.Text = "E&xit"; this.exitFileMenuItem.Click += new System.EventHandler(this.exitMenuItem_Click); - // + // // toolStripDropDownButton2 - // + // this.toolStripDropDownButton2.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; this.toolStripDropDownButton2.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.findEditMenuItem}); @@ -335,18 +320,18 @@ namespace bzit.bomg this.toolStripDropDownButton2.ShowDropDownArrow = false; this.toolStripDropDownButton2.Size = new System.Drawing.Size(31, 22); this.toolStripDropDownButton2.Text = "&Edit"; - // + // // findEditMenuItem - // + // this.findEditMenuItem.Image = global::bzit.bomg.Properties.Resources.magnifier; this.findEditMenuItem.Name = "findEditMenuItem"; this.findEditMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.F))); - this.findEditMenuItem.Size = new System.Drawing.Size(137, 22); + this.findEditMenuItem.Size = new System.Drawing.Size(180, 22); this.findEditMenuItem.Text = "&Find"; this.findEditMenuItem.Click += new System.EventHandler(this.toolStripButton5_Click); - // + // // toolStripDropDownButton3 - // + // this.toolStripDropDownButton3.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; this.toolStripDropDownButton3.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.expandAllViewMenuItem, @@ -356,25 +341,25 @@ namespace bzit.bomg this.toolStripDropDownButton3.ShowDropDownArrow = false; this.toolStripDropDownButton3.Size = new System.Drawing.Size(36, 22); this.toolStripDropDownButton3.Text = "&View"; - // + // // expandAllViewMenuItem - // + // this.expandAllViewMenuItem.Enabled = false; this.expandAllViewMenuItem.Name = "expandAllViewMenuItem"; - this.expandAllViewMenuItem.Size = new System.Drawing.Size(136, 22); + this.expandAllViewMenuItem.Size = new System.Drawing.Size(180, 22); this.expandAllViewMenuItem.Text = "&Expand All"; this.expandAllViewMenuItem.Click += new System.EventHandler(this.expandAllToolStripMenuItem_Click); - // + // // collapseAllViewMenuItem - // + // this.collapseAllViewMenuItem.Enabled = false; this.collapseAllViewMenuItem.Name = "collapseAllViewMenuItem"; - this.collapseAllViewMenuItem.Size = new System.Drawing.Size(136, 22); + this.collapseAllViewMenuItem.Size = new System.Drawing.Size(180, 22); this.collapseAllViewMenuItem.Text = "&Collapse All"; this.collapseAllViewMenuItem.Click += new System.EventHandler(this.collapseAllToolStripMenuItem_Click); - // + // // toolStripDropDownButton4 - // + // this.toolStripDropDownButton4.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; this.toolStripDropDownButton4.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.updateIconsToolMenuItem, @@ -385,31 +370,31 @@ namespace bzit.bomg this.toolStripDropDownButton4.ShowDropDownArrow = false; this.toolStripDropDownButton4.Size = new System.Drawing.Size(39, 22); this.toolStripDropDownButton4.Text = "&Tools"; - // + // // updateIconsToolMenuItem - // + // this.updateIconsToolMenuItem.Name = "updateIconsToolMenuItem"; - this.updateIconsToolMenuItem.Size = new System.Drawing.Size(143, 22); + this.updateIconsToolMenuItem.Size = new System.Drawing.Size(180, 22); this.updateIconsToolMenuItem.Text = "&Update Icons"; this.updateIconsToolMenuItem.Click += new System.EventHandler(this.toolStripMenuItem1_Click); - // + // // toolStripSeparator14 - // + // this.toolStripSeparator14.Name = "toolStripSeparator14"; - this.toolStripSeparator14.Size = new System.Drawing.Size(140, 6); - // + this.toolStripSeparator14.Size = new System.Drawing.Size(177, 6); + // // optionsToolMenuItem - // + // this.optionsToolMenuItem.Enabled = false; this.optionsToolMenuItem.Image = global::bzit.bomg.Properties.Resources.cog; this.optionsToolMenuItem.Name = "optionsToolMenuItem"; this.optionsToolMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F12; - this.optionsToolMenuItem.Size = new System.Drawing.Size(143, 22); + this.optionsToolMenuItem.Size = new System.Drawing.Size(180, 22); this.optionsToolMenuItem.Text = "&Options"; this.optionsToolMenuItem.Click += new System.EventHandler(this.optionsToolStripMenuItem1_Click); - // + // // toolStripDropDownButton5 - // + // this.toolStripDropDownButton5.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; this.toolStripDropDownButton5.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.viewHelpHelpMenuItem, @@ -420,31 +405,31 @@ namespace bzit.bomg this.toolStripDropDownButton5.ShowDropDownArrow = false; this.toolStripDropDownButton5.Size = new System.Drawing.Size(36, 22); this.toolStripDropDownButton5.Text = "&Help"; - // + // // viewHelpHelpMenuItem - // + // this.viewHelpHelpMenuItem.Image = global::bzit.bomg.Properties.Resources.help; this.viewHelpHelpMenuItem.Name = "viewHelpHelpMenuItem"; this.viewHelpHelpMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F1; - this.viewHelpHelpMenuItem.Size = new System.Drawing.Size(146, 22); + this.viewHelpHelpMenuItem.Size = new System.Drawing.Size(180, 22); this.viewHelpHelpMenuItem.Text = "View &Help"; this.viewHelpHelpMenuItem.Click += new System.EventHandler(this.documentationToolStripMenuItem_Click); - // + // // toolStripSeparator12 - // + // this.toolStripSeparator12.Name = "toolStripSeparator12"; - this.toolStripSeparator12.Size = new System.Drawing.Size(143, 6); - // + this.toolStripSeparator12.Size = new System.Drawing.Size(177, 6); + // // aboutHelpMenuItem - // + // this.aboutHelpMenuItem.Image = global::bzit.bomg.Properties.Resources.comment; this.aboutHelpMenuItem.Name = "aboutHelpMenuItem"; - this.aboutHelpMenuItem.Size = new System.Drawing.Size(146, 22); + this.aboutHelpMenuItem.Size = new System.Drawing.Size(180, 22); this.aboutHelpMenuItem.Text = "&About"; this.aboutHelpMenuItem.Click += new System.EventHandler(this.aboutToolStripMenuItem1_Click); - // + // // toolStripDropDownButton7 - // + // this.toolStripDropDownButton7.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; this.toolStripDropDownButton7.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.alwaysOnTopToolStripMenuItem}); @@ -454,23 +439,23 @@ namespace bzit.bomg this.toolStripDropDownButton7.Size = new System.Drawing.Size(16, 22); this.toolStripDropDownButton7.Text = "&?"; this.toolStripDropDownButton7.Visible = false; - // + // // alwaysOnTopToolStripMenuItem - // + // this.alwaysOnTopToolStripMenuItem.Name = "alwaysOnTopToolStripMenuItem"; this.alwaysOnTopToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.F11))); this.alwaysOnTopToolStripMenuItem.Size = new System.Drawing.Size(205, 22); this.alwaysOnTopToolStripMenuItem.Text = "Always On Top"; this.alwaysOnTopToolStripMenuItem.Click += new System.EventHandler(this.alwaysOnTopToolStripMenuItem_Click); - // + // // openFileDialog - // + // this.openFileDialog.DefaultExt = "ryz"; this.openFileDialog.Filter = "Bookmarks files|*.ryz"; this.openFileDialog.Title = "Open bookmarks file"; - // + // // folderTreeNodeMenu - // + // this.folderTreeNodeMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.toolStripMenuItem15, this.toolStripMenuItem16, @@ -485,104 +470,102 @@ namespace bzit.bomg this.toolStripMenuItem13}); this.folderTreeNodeMenu.Name = "listViewMenu"; this.folderTreeNodeMenu.Size = new System.Drawing.Size(139, 198); - // + // // toolStripMenuItem15 - // + // this.toolStripMenuItem15.Name = "toolStripMenuItem15"; this.toolStripMenuItem15.Size = new System.Drawing.Size(138, 22); this.toolStripMenuItem15.Text = "Add &Page"; this.toolStripMenuItem15.Click += new System.EventHandler(this.addPageContextMenu2_Click); - // + // // toolStripMenuItem16 - // + // this.toolStripMenuItem16.Name = "toolStripMenuItem16"; this.toolStripMenuItem16.Size = new System.Drawing.Size(138, 22); this.toolStripMenuItem16.Text = "Add &Folder"; this.toolStripMenuItem16.Click += new System.EventHandler(this.addFolderContextMenu2_Click); - // + // // toolStripSeparator5 - // + // this.toolStripSeparator5.Name = "toolStripSeparator5"; this.toolStripSeparator5.Size = new System.Drawing.Size(135, 6); - // + // // toolStripMenuItem14 - // + // this.toolStripMenuItem14.Name = "toolStripMenuItem14"; this.toolStripMenuItem14.Size = new System.Drawing.Size(138, 22); this.toolStripMenuItem14.Text = "&Open All"; this.toolStripMenuItem14.Click += new System.EventHandler(this.openAllContextMenu_Click); - // + // // toolStripMenuItem9 - // + // this.toolStripMenuItem9.Name = "toolStripMenuItem9"; this.toolStripMenuItem9.Size = new System.Drawing.Size(138, 22); this.toolStripMenuItem9.Text = "Edi&t"; this.toolStripMenuItem9.Click += new System.EventHandler(this.editContextMenu2_Click); - // + // // toolStripMenuItem11 - // + // this.toolStripMenuItem11.Name = "toolStripMenuItem11"; this.toolStripMenuItem11.Size = new System.Drawing.Size(138, 22); this.toolStripMenuItem11.Text = "D&elete"; this.toolStripMenuItem11.Click += new System.EventHandler(this.deleteContextMenu_Click); - // + // // toolStripSeparator7 - // + // this.toolStripSeparator7.Name = "toolStripSeparator7"; this.toolStripSeparator7.Size = new System.Drawing.Size(135, 6); - // + // // sortToolStripMenuItem - // + // this.sortToolStripMenuItem.Name = "sortToolStripMenuItem"; this.sortToolStripMenuItem.Size = new System.Drawing.Size(138, 22); this.sortToolStripMenuItem.Text = "&Sort"; this.sortToolStripMenuItem.Click += new System.EventHandler(this.sortContextMenu2_Click); - // + // // toolStripSeparator11 - // + // this.toolStripSeparator11.Name = "toolStripSeparator11"; this.toolStripSeparator11.Size = new System.Drawing.Size(135, 6); - // + // // toolStripMenuItem12 - // + // this.toolStripMenuItem12.Name = "toolStripMenuItem12"; this.toolStripMenuItem12.Size = new System.Drawing.Size(138, 22); this.toolStripMenuItem12.Text = "Move &Up"; this.toolStripMenuItem12.Click += new System.EventHandler(this.moveUpContextMenu_Click); - // + // // toolStripMenuItem13 - // + // this.toolStripMenuItem13.Name = "toolStripMenuItem13"; this.toolStripMenuItem13.Size = new System.Drawing.Size(138, 22); this.toolStripMenuItem13.Text = "Move &Down"; this.toolStripMenuItem13.Click += new System.EventHandler(this.moveDownContextMenu_Click); - // + // // saveFileDialog - // + // this.saveFileDialog.DefaultExt = "ryz"; this.saveFileDialog.Filter = "Bookmarks file|*.ryz|Bookmarks file (password protected)|*.ryz"; this.saveFileDialog.Title = "Save bookmarks file"; - // + // // toolStrip2 - // + // this.toolStrip2.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None; this.toolStrip2.CanOverflow = false; this.toolStrip2.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.newMenuBarItem, this.openMenuBarItem, this.saveMenuBarItem, - this.toolStripSeparator9, - this.toolStripButton1, - this.toolStripButton2}); + this.toolStripSeparator9}); this.toolStrip2.Location = new System.Drawing.Point(0, 25); this.toolStrip2.Name = "toolStrip2"; this.toolStrip2.RenderMode = System.Windows.Forms.ToolStripRenderMode.System; this.toolStrip2.Size = new System.Drawing.Size(304, 25); this.toolStrip2.TabIndex = 26; this.toolStrip2.Text = "toolStrip2"; - // + // // newMenuBarItem - // + // this.newMenuBarItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; this.newMenuBarItem.Image = ((System.Drawing.Image)(resources.GetObject("newMenuBarItem.Image"))); this.newMenuBarItem.ImageTransparentColor = System.Drawing.Color.Magenta; @@ -591,9 +574,9 @@ namespace bzit.bomg this.newMenuBarItem.Text = "toolStripButton1"; this.newMenuBarItem.ToolTipText = "New"; this.newMenuBarItem.Click += new System.EventHandler(this.newMenuItem_Click); - // + // // openMenuBarItem - // + // this.openMenuBarItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; this.openMenuBarItem.Image = global::bzit.bomg.Properties.Resources.folder_page; this.openMenuBarItem.ImageTransparentColor = System.Drawing.Color.Magenta; @@ -602,9 +585,9 @@ namespace bzit.bomg this.openMenuBarItem.Text = "toolStripButton2"; this.openMenuBarItem.ToolTipText = "Open"; this.openMenuBarItem.Click += new System.EventHandler(this.openMenuItem_Click); - // + // // saveMenuBarItem - // + // this.saveMenuBarItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; this.saveMenuBarItem.Image = global::bzit.bomg.Properties.Resources.disk; this.saveMenuBarItem.ImageTransparentColor = System.Drawing.Color.Magenta; @@ -613,32 +596,14 @@ namespace bzit.bomg this.saveMenuBarItem.Text = "toolStripButton3"; this.saveMenuBarItem.ToolTipText = "Save"; this.saveMenuBarItem.Click += new System.EventHandler(this.importSnapshotToolStripMenuItem_Click); - // + // // toolStripSeparator9 - // + // this.toolStripSeparator9.Name = "toolStripSeparator9"; this.toolStripSeparator9.Size = new System.Drawing.Size(6, 25); - // - // toolStripButton1 - // - this.toolStripButton1.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.toolStripButton1.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton1.Image"))); - this.toolStripButton1.ImageTransparentColor = System.Drawing.Color.Magenta; - this.toolStripButton1.Name = "toolStripButton1"; - this.toolStripButton1.Size = new System.Drawing.Size(23, 22); - this.toolStripButton1.Text = "toolStripButton1"; - // - // toolStripButton2 - // - this.toolStripButton2.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.toolStripButton2.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton2.Image"))); - this.toolStripButton2.ImageTransparentColor = System.Drawing.Color.Magenta; - this.toolStripButton2.Name = "toolStripButton2"; - this.toolStripButton2.Size = new System.Drawing.Size(23, 22); - this.toolStripButton2.Text = "toolStripButton2"; - // + // // rootTreeNodeMenu - // + // this.rootTreeNodeMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.toolStripMenuItem17, this.toolStripMenuItem18, @@ -648,51 +613,50 @@ namespace bzit.bomg this.toolStripMenuItem22}); this.rootTreeNodeMenu.Name = "listViewMenu"; this.rootTreeNodeMenu.Size = new System.Drawing.Size(133, 104); - // + // // toolStripMenuItem17 - // + // this.toolStripMenuItem17.Name = "toolStripMenuItem17"; this.toolStripMenuItem17.Size = new System.Drawing.Size(132, 22); this.toolStripMenuItem17.Text = "Add &Page"; this.toolStripMenuItem17.Click += new System.EventHandler(this.addPageContextMenu_Click); - // + // // toolStripMenuItem18 - // + // this.toolStripMenuItem18.Name = "toolStripMenuItem18"; this.toolStripMenuItem18.Size = new System.Drawing.Size(132, 22); this.toolStripMenuItem18.Text = "Add &Folder"; this.toolStripMenuItem18.Click += new System.EventHandler(this.addFolderContextMenu_Click); - // + // // toolStripSeparator10 - // + // this.toolStripSeparator10.Name = "toolStripSeparator10"; this.toolStripSeparator10.Size = new System.Drawing.Size(129, 6); - // + // // toolStripMenuItem20 - // + // this.toolStripMenuItem20.Name = "toolStripMenuItem20"; this.toolStripMenuItem20.Size = new System.Drawing.Size(132, 22); this.toolStripMenuItem20.Text = "Edi&t"; this.toolStripMenuItem20.Click += new System.EventHandler(this.editContextMenu_Click); - // + // // toolStripSeparator13 - // + // this.toolStripSeparator13.Name = "toolStripSeparator13"; this.toolStripSeparator13.Size = new System.Drawing.Size(129, 6); - // + // // toolStripMenuItem22 - // + // this.toolStripMenuItem22.Name = "toolStripMenuItem22"; this.toolStripMenuItem22.Size = new System.Drawing.Size(132, 22); this.toolStripMenuItem22.Text = "&Sort"; this.toolStripMenuItem22.Click += new System.EventHandler(this.sortContextMenu_Click); - // + // // treeView1 - // + // this.treeView1.AllowDrop = true; this.treeView1.BackColor = System.Drawing.Color.White; this.treeView1.Dock = System.Windows.Forms.DockStyle.Fill; - this.treeView1.HasChanged = false; this.treeView1.HideSelection = false; this.treeView1.HotTracking = true; this.treeView1.ImageIndex = 0; @@ -704,11 +668,11 @@ namespace bzit.bomg this.treeView1.Size = new System.Drawing.Size(304, 584); this.treeView1.TabIndex = 24; this.treeView1.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeView1_NodeMouseClick); - this.treeView1.NodeMouseDoubleClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeView2_NodeMouseDoubleClick); + this.treeView1.NodeMouseDoubleClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeView1_NodeMouseDoubleClick); this.treeView1.PreviewKeyDown += new System.Windows.Forms.PreviewKeyDownEventHandler(this.treeView1_PreviewKeyDown); - // + // // MainForm - // + // this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; this.BackColor = System.Drawing.SystemColors.Control; this.ClientSize = new System.Drawing.Size(304, 654); @@ -764,7 +728,6 @@ namespace bzit.bomg private System.Windows.Forms.ToolStripMenuItem viewHelpHelpMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator12; private System.Windows.Forms.ToolStripMenuItem aboutHelpMenuItem; - private System.Windows.Forms.ImageList imageList1; private System.Windows.Forms.ToolStripDropDownButton toolStripDropDownButton7; private System.Windows.Forms.ToolStripMenuItem alwaysOnTopToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem openFileMenuItem; @@ -806,8 +769,6 @@ namespace bzit.bomg private System.Windows.Forms.ToolStripMenuItem findEditMenuItem; private System.Windows.Forms.ToolStripMenuItem updateIconsToolMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator14; - private System.Windows.Forms.ToolStripButton toolStripButton1; - private System.Windows.Forms.ToolStripButton toolStripButton2; } } diff --git a/MainForm.cs b/MainForm.cs index 203181a..11846ff 100644 --- a/MainForm.cs +++ b/MainForm.cs @@ -64,20 +64,20 @@ namespace bzit.bomg sessionFileFormat = new SessionFileFormat(this); this.ApplicationMode = AppMode.Clear; - treeView1.OnNodeCountUpdate = delegate (ulong v) { - statusBarPanel2.Text = v.ToString(); - }; - treeView1.OnChanged = delegate (object sender, EventArgs ev) { - if (this.ApplicationMode == AppMode.New) - { - saveMenuBarItem.Enabled = saveFileMenuItem.Enabled = false; - } - else - { - saveMenuBarItem.Enabled = saveFileMenuItem.Enabled = treeView1.HasChanged; - } + //treeView1.OnNodeCountUpdate = delegate (ulong v) { + // statusBarPanel2.Text = v.ToString(); + //}; + //treeView1.OnChanged = delegate (object sender, EventArgs ev) { + // if (this.ApplicationMode == AppMode.New) + // { + // saveMenuBarItem.Enabled = saveFileMenuItem.Enabled = false; + // } + // else + // { + // saveMenuBarItem.Enabled = saveFileMenuItem.Enabled = treeView1.HasChanged; + // } - }; + //}; } protected override void OnShown(EventArgs e) @@ -265,15 +265,22 @@ namespace bzit.bomg #region Toolbar #1 + /// + /// File New + /// + /// + /// private void newMenuItem_Click(object sender, EventArgs e) { NewSessionForm newSessionForm = new NewSessionForm(this); newSessionForm.ShowDialog(); } - /* - * File -> Open - */ + /// + /// File Open + /// + /// + /// private void openMenuItem_Click(object sender, EventArgs e) { if (openFileDialog.ShowDialog() == DialogResult.OK) @@ -483,7 +490,7 @@ namespace bzit.bomg #endregion - #region TreeView Menu - item + //#region TreeView Menu - item /** * Node -> Open @@ -518,7 +525,7 @@ namespace bzit.bomg // treeView1.DeleteNode(); //} - #endregion + //#endregion //#region TreeView Menu - folder @@ -654,63 +661,9 @@ namespace bzit.bomg default: break; } - - //BookmarkEditForm editForm = new BookmarkEditForm(treeView1); - //editForm.ShowDialog(); - - return; - - - if (e.Node == null) - { - return; - } - - if (e.Node.Text.Equals("")) - { - return; - } - - // view ui - expandAllViewMenuItem.Enabled = false; - collapseAllViewMenuItem.Enabled = false; - if (e.Node != null) - { - if (e.Node.Tag == null) - { - expandAllViewMenuItem.Enabled = true; - collapseAllViewMenuItem.Enabled = true; - } - } - - if (e.Button == MouseButtons.Right) - { - // folder - if (e.Node.Tag == null) - { - if (e.Node.Equals(e.Node.TreeView.Nodes[0])) - { - rootTreeNodeMenu.Show(Cursor.Position); - } - else - { - folderTreeNodeMenu.Show(Cursor.Position); - } - } - else - { - if (!(e.Node.Tag is BookmarkItem)) - { - return; - } - - BookmarkItem bi = (BookmarkItem)e.Node.Tag; - pageTreeNodeMenu.Show(Cursor.Position); - } - } } - private void treeView2_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e) { openBookmark(e.Node); } + private void treeView1_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e) => openBookmark(e.Node); private void treeView1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) { @@ -880,7 +833,6 @@ namespace bzit.bomg //} } - #region root context menu private void addPageContextMenu_Click(object sender, EventArgs e) => (new BookmarkEditForm(treeView1)).ShowDialog(); diff --git a/MainForm.resx b/MainForm.resx index 6cef617..c2e0424 100644 --- a/MainForm.resx +++ b/MainForm.resx @@ -123,118 +123,6 @@ 17, 17 - - 333, 17 - - - - AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w - LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 - ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADU - FwAAAk1TRnQBSQFMAgEBBwEAAcwBAgHMAQIBEAEAARABAAT/AREBAAj/AUIBTQE2BwABNgMAASgDAAFA - AwABIAMAAQEBAAEQBgABEBQAAZkBSgEYAS4BtwEdAbcBGQG3ARkBtwEZAbcBGQG3ARkBtwEZAbcBGQG3 - ARkBtwEdARcBLgGZAUoEAAGZAUoBGAEuAbcBHQG3ARkBtwEZAbcBGQG3ARkBtwEZAbcBGQG3ARkBtwEZ - AbcBHQEXAS4BmQFKBAABmQFKARgBLgG3AR0BtwEZAbcBGQG3ARkBtwEZAbcBGQG3ARkBtwEZAbcBGQG3 - AR0BFwEuAZkBSiQAAdcBIQHeAXcBvgFvAb4BbwG+AW8BvgFvAb4BbwHfAXcB3wF3Ad8BdwHfAXsB/wF7 - Af8BfwHXASEEAAHXASEB3gF3Ab4BbwG+AW8BvgFvAb4BbwG+AW8B3wF3Ad8BdwHfAXcB3wF7Af8BewH/ - AX8B1wEhBAAB1wEhAd4BdwG+AW8BvgFvAb4BbwG+AW8BvgFvAd8BdwHfAXcB3wF3Ad8BewH/AXsB/wF/ - AdcBISQAAdgBHQG+AW8B1gFaAdYBWgHWAVoB1gFaAdYBWgHWAVoB1gFaAdYBWgHWAVoB1gFaAf8BfwG3 - ARkEAAHYAR0BvgFvAYkBNgGJATYBiQE2AYkBNgGJATYBiQE2AYkBNgGJATYBiQE2AYkBNgH/AX8BtwEZ - BAAB2AEdAb4BbwHOAXkBzgF5Ac4BeQGtAXkBrQF5Aa0BeQGtAXkBrQF5Aa0BeQGtAXkB/wF/AbcBGSQA - AfgBIQG+AXMB9wFeAVoBawFaAWsBOQFnATkBZwE5AWcBOQFnATkBZwE5AWcB1gFaAd8BewG3ARkEAAH4 - ASEBvgFzAYkBNgEMAUcBDAFHAQwBRwEMAUcBDAFHAQwBRwEMAUcBDAFHAYkBNgHfAXsBtwEZBAAB+AEh - Ab4BcwHvAXkBlAF+AXMBfgFzAX4BcwF+AXMBfgFTAX4BUwF+AVIBfgHOAXkB3wF7AbcBGSQAAfgBIQHe - AXMBtQFWAbUBVgG1AVYBtQFWAbUBVgG1AVYBtQFWAbUBVgG1AVYBtQFWAf8BewHYAR0EAAH4ASEB3gFz - AYkBNgGJATYBiQE2AYkBNgGJATYBiQE2AYkBNgGJATYBiQE2AYkBNgH/AXsB2AEdBAAB+AEhAd4BcwGM - AXUBjAF1AYwBdQFrAXUBawF1AWsBdQFrAXUBawF1AWsBdQFrAXUB/wF7AdgBHSQAARgBIgHfAXcBnwFr - AZ8BawGfAWsBnwFrAZ8BawGfAWsBnwFnAZ8BZwGfAWcBnwFnAf8BewH4ASEEAAEYASIB3wF3AZ8BawGf - AWsBnwFrAZ8BawGfAWsBnwFrAZ8BZwGfAWcBnwFnAZ8BZwH/AXsB+AEhBAABGAEiAd8BdwGfAWsBnwFr - AZ8BawGfAWsBnwFrAZ8BawGfAWcBnwFnAZ8BZwGfAWcB/wF7AfgBISQAARgBJgHfAXcBnwFrAZ8BawGf - AWsBnwFrAZ8BawGfAWsBnwFrAZ8BZwGfAWcBnwFnAd8BewH4ASEEAAEYASYB3wF3AZ8BawGfAWsBnwFr - AZ8BawGfAWsBnwFrAZ8BawGfAWcBnwFnAZ8BZwHfAXsB+AEhBAABGAEmAd8BdwGfAWsBnwFrAZ8BawGf - AWsBnwFrAZ8BawGfAWsBnwFnAZ8BZwGfAWcB3wF7AfgBISQAARgBJgHfAXcBvwFrAb8BawGfAWsBnwFr - AZ8BawGfAWsBnwFrAZ8BZwF/AWMBfwFjAd8BdwEYASIEAAEYASYB3wF3Ab8BawG/AWsBnwFrAZ8BawGf - AWsBnwFrAZ8BawGfAWcBfwFjAX8BYwHfAXcBGAEiBAABGAEmAd8BdwG/AWsBvwFrAZ8BawGfAWsBnwFr - AZ8BawGfAWsBnwFnAX8BYwF/AWMB3wF3ARgBIiQAATgBJgHfAXcBvwFvAb8BbwG/AWsBnwFrAZ8BawGf - AWsBnwFnAZ8BYwF/AWMBfwFjAd8BdwEYASYEAAE4ASYB3wF3Ab8BbwG/AW8BvwFrAZ8BawGfAWsBnwFr - AZ8BZwGfAWMBfwFjAX8BYwHfAXcBGAEmBAABOAEmAd8BdwG/AW8BvwFvAb8BawGfAWsBnwFrAZ8BawGf - AWcBnwFjAX8BYwF/AWMB3wF3ARgBJiQAATgBJgHfAXcBnwFrAZ8BawGfAWsBnwFrAZ8BawGfAWcBfwFj - AX8BYwF+AV8BfgFfAd8BdwEYASYEAAE4ASYB3wF3AZ8BawGfAWsBnwFrAZ8BawGfAWsBnwFnAX8BYwF/ - AWMBfgFfAX4BXwHfAXcBGAEmBAABOAEmAd8BdwGfAWsBnwFrAZ8BawGfAWsBnwFrAZ8BZwF/AWMBfwFj - AX4BXwF+AV8B3wF3ARgBJiQAATgBKgHfAXsBnwFrAZ8BawGfAWsBnwFrAZ8BZwGfAWcBfwFjAV4BXwFe - AVsBXgFbAd8BewEYASYEAAE4ASoB3wF7AZ8BawGfAWsBnwFrAZ8BawGfAWcBnwFnAX8BYwFeAV8BXgFb - AV4BWwHfAXsBGAEmBAABOAEqAd8BewGfAWsBnwFrAZ8BawGfAWsBnwFnAZ8BZwF/AWMBXgFfAV4BWwFe - AVsB3wF7ARgBJiQAATgBKgHfAXsBnwFnAZ8BawGfAWcBnwFnAZ8BZwF/AWMBfgFfAb4BbwHeAXcB3wF7 - Ab4BdwH4ASEEAAE4ASoB3wF7AZ8BZwGfAWsBnwFnAZ8BZwGfAWcBfwFjAX4BXwG+AW8B3gF3Ad8BewG+ - AXcB+AEhBAABOAEqAd8BewGfAWcBnwFrAZ8BZwGfAWcBnwFnAX8BYwF+AV8BvgFvAd4BdwHfAXsBvgF3 - AfgBISQAATgBKgHfAXsBnwFnAZ8BZwGfAWcBnwFnAZ8BZwF/AWMBXgFfAf8BfwGfAWcBnwFnAdwBQgF4 - AToEAAE4ASoB3wF7AZ8BZwGfAWcBnwFnAZ8BZwGfAWcBfwFjAV4BXwH/AX8BnwFnAZ8BZwHcAUIBeAE6 - BAABOAEqAd8BewGfAWcBnwFnAZ8BZwGfAWcBnwFnAX8BYwFeAV8B/wF/AZ8BZwGfAWcB3AFCAXgBOiQA - ATgBKgHfAXsBnwFjAZ8BZwGfAWcBnwFnAX8BYwF/AWMBXgFfAf8BfwF+AVsB3AE+AVsBMgFaAWcEAAE4 - ASoB3wF7AZ8BYwGfAWcBnwFnAZ8BZwF/AWMBfwFjAV4BXwH/AX8BfgFbAdwBPgFbATIBWgFnBAABOAEq - Ad8BewGfAWMBnwFnAZ8BZwGfAWcBfwFjAX8BYwFeAV8B/wF/AX4BWwHcAT4BWwEyAVoBZyQAAXkBNgHe - AXcB3gF3Ad8BdwHfAXcB3wF3Ad8BdwHfAXcB3gF3AZ4BawHcAT4BWwE2AVoBZwYAAXkBNgHeAXcB3gF3 - Ad8BdwHfAXcB3wF3Ad8BdwHfAXcB3gF3AZ4BawHcAT4BWwE2AVoBZwYAAXkBNgHeAXcB3gF3Ad8BdwHf - AXcB3wF3Ad8BdwHfAXcB3gF3AZ4BawHcAT4BWwE2AVoBZyYAAdkBTgF5AToBWQEuATkBKgE5ASoBOQEq - AVkBKgE5ASoBOQEqAVkBMgF5AT4BWgFnCAAB2QFOAXkBOgFZAS4BOQEqATkBKgE5ASoBWQEqATkBKgE5 - ASoBWQEyAXkBPgFaAWcIAAHZAU4BeQE6AVkBLgE5ASoBOQEqATkBKgFZASoBOQEqATkBKgFZATIBeQE+ - AVoBZ4AAAdMBYgFtAWYB8gFuAgABmQFKARgBLgG3AR0BtwEZAbcBGQG3ARkBtwEZAbcBGQG3ARkBtwEZ - AbcBGQG3AR0BFwEuAZkBSlIAAVoBZwEbAVsBHAFXARwBVwH7AU4BlgFKAfMBagFsAWYCAAHXASEB3gF3 - Ab4BbwG+AW8BvgFvAb4BbwG+AW8B3wF3Ad8BdwHfAXcB3wF7Af8BewH/AX8B1wEhJAAB0QFqAYwBagEn - AWoBJgFuASYBbgEmAW4BJgFuASYBbgEmAW4BJgFuASYBbgEmAW4BJgFuAY4BagQAAdEBagGMAWoBJwFq - ASYBbgEmAW4BJgFuASYBbgG1AVoBfgFnAZ8BZwGeAWMBnwFnAV4BWwGWAU4B0wFmAgAB2AEdAb4BbwH/ - ATYB/wEyAf8BMgH/ATIB/wEyAf8BMgH/ATIB/wEyAf8BMgH/ATIB/wF/AbcBGQIAAfsBUgH7AVYBWgFn - FgAB+gFWAdoBUgIAAUgBbgG7AXsBdQF7AXMBewFyAXsBcQF7AVABewFPAXsBTwF7AU4BewFNAXsBLQF7 - AbgBfwFHAW4EAAFIAW4BuwF7AXUBewFzAXsBcgF7AXEBewFQAXsBHAFXAZ4BawF+AWMBfgFfAX4BXwGf - AWcB2wFOBAAB+AEhAb4BcwEfATcBfwFTAV8BTwFfAU8BXwFPAV8BSwFfAUsBXwFLAV8BSwH/ATIB3wF7 - AbcBGQIAAbwBQgG8AUIBewE2AVoBawEaAVsMAAEaAV8BWgFrARoBJgEbASYBOgEqAgABRwFuAf0BfwG0 - AX8BkgF/AZABewFuAXsBbAF7AUoBewFIAXsBRwF7ASUBewEkAXsB2QF/AUcBbgQAAUcBbgH9AX8BtAF/ - AZIBfwGQAXsBbgF7AWwBewH8AU4BvwFvAX4BYwF+AWMBfgFfAZ8BZwEcAVMEAAH4ASEB3gFzAd8BKgHe - ASoB3gEqAd8BKgHfASoB3gEqAd4BKgHeASoB3gEmAd4BJgH/AXsB2AEdAgABvAFCAR0BUwGcAToBWgFr - AXsBNgF7ATYBOgFjBAABGQFfATsBLgEaASIBWgFnAfoBHQGcAT4B+gEdAgABZwFuAf4BfwG2AX8BtAF/ - AZIBfwGQAXsBbgF7AWwBewFKAXsBSQF7AUcBewEmAXsB2QF/AWcBbgQAAWcBbgH+AX8BtgF/AbQBfwGS - AX8BkAF7AW4BewEcAVcBngFrAZ4BZwF+AWMBfgFjAZ8BawEcAVcEAAEYASIB3wF3AZ8BawGfAWsBnwFr - AZ8BawGfAWsBnwFrAZ8BZwGfAWcBnwFnAZ8BZwH/AXsB+AEhAgAB3AFGAT0BVwG8AT4BWgFrAZwBOgGc - AToBGgFfATkBZwE5AWcBGgJbAS4BOgEmAVoBawEaASIBvAE+ARoBIgIAAYcBbgH+AX8B2QF/AbcBfwG1 - AX8BswF/AZEBewGPAXsBbQF7AWsBewFJAXsBSAF7AdoBfwGHAW4EAAGHAW4B/gF/AdkBfwG3AX8BtQF/ - AbMBfwGRAXsBVAFrAT0BWwGeAW8BvwFvAX4BZwFdAV8B1AFaBAABGAEmAd8BdwGfAWsBnwFrAZ8BawGf - AWsBnwFrAZ8BawGfAWsBnwFnAZ8BZwGfAWcB3wF7AfgBIQIAAfwBTgE9AVcB3AFGAVoBawHbAU4B3AFG - AdsBSgEaAV8BGgFbAbsBQgGcAToBmwE+AVoBZwE7ASYBnAE+AVoBLgIAAYcBbgH/AX8B/wF/Af4BfwH+ - AX8B/gF/AdsBfwGSAX8BkAF7AW4BewFtAXsBawF7AdoBfwGHAW4EAAGHAW4B/wF/Af8BfwH+AX8B/gF/ - Af4BfwHbAX8BkgF/AVUBawEZAVsB/AFOARwBUwE8AV8BqQFqBAABGAEmAd8BdwG/AWsBvwFrAZ8BawGf - AWsBnwFrAZ8BawGfAWsBnwFnAX8BYwF/AWMB3wF3ARgBIgIAARwBWwEdAVcB/QFOATsBYwE6AWcB3AFG - Ad0BRgG8AT4BnAE+AbwBQgF7AjoBYwEaAlsBLgGcATYBugFCAgABpwFuAd0BfwFSAXcBMQF3AQ4BdwG5 - AXsB/gF/Af4BfwH+AX8B/gF/Af0BfwH9AX8B/wF/AacBbgQAAacBbgHdAX8BUgF3ATEBdwEOAXcBuQF7 - Af4BfwH+AX8B/gF/Af4BfwH9AX8B/QF/Af8BfwGnAW4EAAE4ASYB3wF3Ab8BbwG/AW8BvwFrAZ8BawGf - AWsBnwFrAZ8BZwGfAWMBfwFjAX8BYwHfAXcBGAEmAgABWgFnAf0BTgE9AVsB/AFKAToBZwFaAWcBGwFX - AdwBSgHbAUYB+wFSAVoBZwE6AWMBWwEyAbwBQgE7ASoBGgFfAgABpwFuAf4BfwFyAXsBcgF7AVABewEt - AXcBLQF3AVABdwFQAXcBTwF3AS4BdwEuAXcB3QF/AccBbgQAAacBbgH+AX8BcgF7AXIBewFQAXsBLQF3 - AS0BdwFQAXcBUAF3AU8BdwEuAXcBLgF3Ad0BfwHHAW4EAAE4ASYB3wF3AZ8BawGfAWsBnwFrAZ8BawGf - AWsBnwFnAX8BYwF/AWMBfgFfAX4BXwHfAXcBGAEmBAABPAFbAT0BVwE9AVcB/QFKATsBYwFaAWsEAAFa - AWsBGgFfAZsBOgHcAUIBvAE+AdsBSgQAAccBbgH+AX8BkQF/AXIBewGTAXsBlQF7Af0BfwH+AX8B/gF/ - Af4BfwH9AX8B/QF/Af8BfwHKAW4EAAHHAW4B/gF/AZEBfwFyAXsBkwF7AZUBewH9AX8B/gF/Af4BfwH+ - AX8B/QF/Af0BfwH/AX8BygFuBAABOAEqAd8BewGfAWsBnwFrAZ8BawGfAWsBnwFnAZ8BZwF/AWMBXgFf - AV4BWwFeAVsB3wF7ARgBJgQAAVoBawE8AVsBPQFXAT4BWwEdAVMB/QFKAd0BSgHcAUYBvAFCAdwBRgH9 - AU4B3AFGAbsBRgFaAWsEAAHHAW4B/wF/Af8BfwH/AX8B/wF/Af8BfwHdAX8BDQFzAS0BcwEtAXMBLQFz - AS8BcwEvAXMBMwFrBAABxwFuAf8BfwH/AX8B/wF/Af8BfwH/AX8B3QF/AQ0BcwEtAXMBLQFzAS0BcwEv - AXMBLwFzATMBawQAATgBKgHfAXsBnwFnAZ8BawGfAWcBnwFnAZ8BZwF/AWMBfgFfAb4BbwHeAXcB3wF7 - Ab4BdwH4ASEIAAE7AV8BHQFTAT0BWwFeAV8BXgFfAV4BXwE9AVcBHQFTAbwBQgEbAVcIAAHqAW4BDAFz - AQwBcwEMAXMBDAFzAQwBcwHqAW4BWAFrAVkBawFZAWsBWQFrAVkBawFZAWsBWgFrBAAB6gFuAQwBcwEM - AXMBDAFzAQwBcwEMAXMB6gFuAVgBawFZAWsBWQFrAVkBawFZAWsBWQFrAVoBawQAATgBKgHfAXsBnwFn - AZ8BZwGfAWcBnwFnAZ8BZwF/AWMBXgFfAf8BfwGfAWcBnwFnAdwBQgF4AToKAAFaAWcBPAFfARwBVwH9 - AU4B/QFOARwBUwEbAVcBOgFnSgABOAEqAd8BewGfAWMBnwFnAZ8BZwGfAWcBfwFjAX8BYwFeAV8B/wF/ - AX4BWwHcAT4BWwEyAVoBZ2QAAXkBNgHeAXcB3gF3Ad8BdwHfAXcB3wF3Ad8BdwHfAXcB3gF3AZ4BawHc - AT4BWwE2AVoBZ2YAAdkBTgF5AToBWQEuATkBKgE5ASoBOQEqAVkBKgE5ASoBOQEqAVkBMgF5AT4BWgFn - BgABQgFNAT4HAAE+AwABKAMAAUADAAEgAwABAQEAAQEGAAEBFgAD/wEAAYABAQGAAQEBgAEBAgABgAEB - AYABAQGAAQECAAGAAQEBgAEBAYABAQIAAYABAQGAAQEBgAEBAgABgAEBAYABAQGAAQECAAGAAQEBgAEB - AYABAQIAAYABAQGAAQEBgAEBAgABgAEBAYABAQGAAQECAAGAAQEBgAEBAYABAQIAAYABAQGAAQEBgAEB - AgABgAEBAYABAQGAAQECAAGAAQEBgAEBAYABAQIAAYABAQGAAQEBgAEBAgABgAEBAYABAQGAAQECAAGA - AQMBgAEDAYABAwIAAYABBwGAAQcBgAEHAgAF/wH4AYABAQX/AQABgAEBAv8BgAEBAYABAAGAAQEBHwH8 - AYABAQGAAQEBgAEBAQcB4AGAAQEBgAEBAYACAQKAAQEBgAEBAYABAQIAAYABAQGAAQEBgAEBAgABgAEB - AYABAQGAAQECAAGAAQEBgAEBAYABAQIAAYABAQGAAQEBgAEBAoEBgAEBAYABAQGAAQEBgAEBAYABAQGA - AQEBgAEBAeABBwGAAQEBgAEBAYABAQHwAQ8E/wGAAQEG/wGAAQMG/wGAAQcL - - 123, 17 @@ -268,45 +156,15 @@ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHaSURBVDhPjZNNSxtRFIatXfU/KHQlFEqRJmRZhNJFoS6U - uiiC0C4UuquWLlxWurIbCSF0I90VXAju3ZhBLC01QUv9gEpxkZgvM8l83HtnRt+ec3HGGRPRAw9ZzHmf - vPdm0hebASJFZG7gPtFPdE3KdV2zUCicBUGAXkgpkc1ml2i3pyTDYdu24ThORLvdRqvVQrVa1ZJKpYJc - LtcluUNkeEEIAaWU/mQsy4JpmqjValpALcFfks/nQ4keLfDbJcjTn1oQSjjQ6XRQr9cTx2E4o9M0WiAO - ZiH+zEQLvu/rc4dHaTQaukm5XL4UnB+/u2ftTo5srz5dlnvTkDuvII8W4TU3EXh2QsJN+D6azealQO6/ - +aL230IezsH7twj19yPE9hhs4zHE7odEEz4O3wmLIgEwcdfdGV+Th+9J8JkEC3BLL+EWXyPwlV5kPM/T - 98ISJhLwnP4afSRKL6COFqAO5mFvPIRn/o7CDLcIL5fbJAT2j2fPRXEUztYwLOMB1U9BnazrUAg3YDjc - Lfj+ZKr4behrIBvwCbH3CfJ4pSscJyGgiV6kq8RbxOFnnNFpGi0wDOP8quA6aPeMMzp9MWn6eRx+0CsQ - h3fodbYow//eaAaJNMHW20DhvsH/Ib+cRcWEtS4AAAAASUVORK5CYII= - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG - YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9 - 0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw - bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc - VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9 - c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32 - Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo - mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+ - kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D - TgDQASA1MVpwzwAAAABJRU5ErkJggg== - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG - YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9 - 0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw - bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc - VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9 - c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32 - Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo - mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+ - kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D - TgDQASA1MVpwzwAAAABJRU5ErkJggg== + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHaSURBVDhPjZO9S1tRGMZtnfo/VHASCkWkCRlFKB0KdVB0 + KIWCDgpuanHoWOlklxJCcBG3QoeCe5dEpEXRBBW/oCIOSfNlbnI/zjn3Xn36vofe670mpb7wI8N9n1+e + c3LTE5nHRIJI/Yd+4iHRMQnHcYxcLnft+z66IaVEOp3+TLtdJSkOW5YF27ZDWq0Wms0mKpWKlpTLZWQy + mQ7JAyLFC0IIKKX0J2OaJgzDQLVa1QJqCf6SbDYbSPRogdcqQl7taEEg4UC73UatVosdh+GMTtNogThd + gDiaDRc8z9PnDo5Sr9d1k1KpdCu4uZx/ZB68Gdn79nxNHs9A7r+GPF+B29iC71oxCTfh+2g0GrcCeTK9 + qk7mIM8W4V6sQP36ALE3BmvzGcTBUqwJH4fvhEWhAJjsdfbHN+TZOxJ8IsEynOIEnMIUfE/pRcZ1XX0v + LGFCAc/V7uigKL6COl+GOn0PK/cUrnEYhhluEVwut4kJrO0XL0VhFPaPIZibT6h+Aur3dx0K4AYMhzsF + P4ffFr4MrPuyDo8Qxx8hL792hKPEBDThi3SXaIso/IwzOk2jBfl8/uau4F/Q7jVndPrvJOnnsflBt0AU + 3qHX2aQM/3vD6SOSBFvvA4V7+v4ABhqcM6lhVZQAAAAASUVORK5CYII= diff --git a/NewSessionForm.Designer.cs b/NewSessionForm.Designer.cs index 0a35947..367e2f3 100644 --- a/NewSessionForm.Designer.cs +++ b/NewSessionForm.Designer.cs @@ -28,74 +28,85 @@ namespace bzit.bomg /// private void InitializeComponent() { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(NewSessionForm)); - this.label1 = new System.Windows.Forms.Label(); - this.textBox1 = new System.Windows.Forms.TextBox(); - this.btnSave = new RyzStudio.Windows.Forms.BigButton(); + this.textBox2 = new RyzStudio.Windows.ThemedForms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.horizontalSeparator1 = new RyzStudio.Windows.Forms.HorizontalSeparator(); + this.button2 = new RyzStudio.Windows.ThemedForms.Button(); this.SuspendLayout(); // - // label1 + // textBox2 // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(12, 12); - this.label1.Margin = new System.Windows.Forms.Padding(3); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(132, 13); - this.label1.TabIndex = 0; - this.label1.Text = "Enter a new session name"; - // - // textBox1 - // - this.textBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + this.textBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.textBox1.Location = new System.Drawing.Point(12, 31); - this.textBox1.MaxLength = 128; - this.textBox1.Name = "textBox1"; - this.textBox1.Size = new System.Drawing.Size(280, 21); - this.textBox1.TabIndex = 0; - this.textBox1.PreviewKeyDown += new System.Windows.Forms.PreviewKeyDownEventHandler(this.textBox1_PreviewKeyDown); + this.textBox2.BackColor = System.Drawing.Color.Transparent; + this.textBox2.Location = new System.Drawing.Point(96, 15); + 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(276, 33); + this.textBox2.TabIndex = 68; // - // btnSave + // label2 // - this.btnSave.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.btnSave.BackColor = System.Drawing.Color.WhiteSmoke; - this.btnSave.Location = new System.Drawing.Point(196, 67); - this.btnSave.MaximumSize = new System.Drawing.Size(120, 32); - this.btnSave.MinimumSize = new System.Drawing.Size(32, 32); - this.btnSave.Name = "btnSave"; - this.btnSave.Padding = new System.Windows.Forms.Padding(4); - this.btnSave.Size = new System.Drawing.Size(96, 32); - this.btnSave.TabIndex = 22; - this.btnSave.Value = "&OK"; - this.btnSave.Click += new System.EventHandler(this.button2_Click); + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(12, 25); + this.label2.Margin = new System.Windows.Forms.Padding(3); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(34, 13); + this.label2.TabIndex = 67; + this.label2.Text = "Name"; + // + // horizontalSeparator1 + // + this.horizontalSeparator1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.horizontalSeparator1.Location = new System.Drawing.Point(12, 63); + this.horizontalSeparator1.Margin = new System.Windows.Forms.Padding(3, 10, 3, 10); + this.horizontalSeparator1.MaximumSize = new System.Drawing.Size(4920, 2); + this.horizontalSeparator1.Name = "horizontalSeparator1"; + this.horizontalSeparator1.Size = new System.Drawing.Size(360, 2); + this.horizontalSeparator1.TabIndex = 69; + // + // button2 + // + this.button2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.button2.BackColor = System.Drawing.Color.Transparent; + this.button2.DefaultImage = null; + this.button2.DownImage = null; + this.button2.LabelText = "&OK"; + this.button2.Location = new System.Drawing.Point(264, 78); + this.button2.Name = "button2"; + this.button2.OverImage = null; + this.button2.Padding = new System.Windows.Forms.Padding(4, 4, 3, 3); + this.button2.Size = new System.Drawing.Size(108, 32); + this.button2.TabIndex = 70; + this.button2.Click += new System.EventHandler(this.button2_Click); // // NewSessionForm // this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; this.BackColor = System.Drawing.Color.White; - this.ClientSize = new System.Drawing.Size(304, 111); - this.Controls.Add(this.btnSave); - this.Controls.Add(this.textBox1); - this.Controls.Add(this.label1); + this.ClientSize = new System.Drawing.Size(384, 122); + this.Controls.Add(this.button2); + this.Controls.Add(this.horizontalSeparator1); + this.Controls.Add(this.textBox2); + this.Controls.Add(this.label2); this.Font = new System.Drawing.Font("Tahoma", 8.25F); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.MaximizeBox = false; this.MinimizeBox = false; this.Name = "NewSessionForm"; + this.ShowIcon = false; this.ShowInTaskbar = false; this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "New"; this.ResumeLayout(false); this.PerformLayout(); } #endregion - - private System.Windows.Forms.Label label1; - private System.Windows.Forms.TextBox textBox1; - private RyzStudio.Windows.Forms.BigButton btnSave; + private RyzStudio.Windows.ThemedForms.TextBox textBox2; + private System.Windows.Forms.Label label2; + private RyzStudio.Windows.Forms.HorizontalSeparator horizontalSeparator1; + private RyzStudio.Windows.ThemedForms.Button button2; } } \ No newline at end of file diff --git a/NewSessionForm.cs b/NewSessionForm.cs index e7890ba..74ebd4f 100644 --- a/NewSessionForm.cs +++ b/NewSessionForm.cs @@ -10,7 +10,7 @@ namespace bzit.bomg public NewSessionForm(MainForm form) { InitializeComponent(); - + parentForm = form; } @@ -21,20 +21,18 @@ namespace bzit.bomg return; } - if (string.IsNullOrEmpty(textBox1.Text)) + if (string.IsNullOrEmpty(textBox2.Text)) { return; } - + parentForm.treeView1.Clear(); - parentForm.treeView1.Nodes.Add("", textBox1.Text.Trim(), 0, 0); + parentForm.treeView1.Nodes.Add("", textBox2.Text.Trim(), 0, 0); parentForm.ApplicationMode = MainForm.AppMode.New; this.Close(); } -#region behaviour - private void textBox1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) { switch (e.KeyCode) @@ -49,7 +47,5 @@ namespace bzit.bomg } } -#endregion - } } \ No newline at end of file diff --git a/NewSessionForm.resx b/NewSessionForm.resx index f427d71..d58980a 100644 --- a/NewSessionForm.resx +++ b/NewSessionForm.resx @@ -117,29 +117,4 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAB0AAAA0AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAA - ADMAAAAdAAAAAAAAAAAAAAA0+fn59fz8/P38/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8 - /P35+fnzAAAAMwAAAAAAAAABAAAANvz8/P78/Pz//Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz//Pz8//z8 - /P/8/Pz//Pz8/QAAADYAAAAAAAAAAQAAADb8/Pz//Pz8//z8/P/8/Pz//Pz8//v7+//7+/v/+/v7//v7 - +//7+/v/+/v7//z8/P8AAAA2AAAAAD3K814np8+g7Pj8/+z4+/+E1/f/qeL4//v7+//7+/v/+vr6//r6 - +v/6+vr/+vr6//r6+v/8/Pz/AAAANgAAAABEzPNJTM/3/y/H9f8owvP/MsL0/7vo+f/7+/v/+/v7//v7 - +//6+vr/+vr6//j4+P/4+Pj//Pz8/wAAADYAAAAASsvwLkvQ9/+C3vn/edn5/yvA9P/U8Pr//Pz8//z8 - /P/8/Pz/+/v7//n5+f/5+fn/+Pj4//z8/P8AAAA2W9f4A1HS+LFz2vj/i+D6/4Ld+f9T0Pb/YM/2//n7 - /P/8/Pz//Pz8//r6+v/5+fn/9vb2//b29v/8/Pz/AAAANmHZ+Jlp2Pn/ctr4/4rg+v+B3fn/UM73/zHC - 9P910/f//Pz8//v7+//4+Pj/9vb2//Pz8//y8vL//Pz8/wAAADZk2fgJWtT0QEOuz55l1/j/WNL4/4re - +P/E7fr/9Pr8//v7+//4+Pj/9fX1//Ly8v/v7+//7e3t//z8/P8AAAA2AAAAAAAAAAEAAAA2cdn3/2bW - 9//8/Pz//Pz8//v7+//4+Pj/9fX1//Hx8f/s7Oz/6urq/+bm5v/8/Pz/AAAANgAAAAAAAAABAAAANtDx - +//L7vj/+fn5//n5+f/39/f/9vb2//Ly8v/r6+v//Pz8//z8/P/8/Pz//Pz8/wAAADYAAAAAAAAAAQAA - ADb8/Pz/9/f3//n5+f/39/f/9/f3//Pz8//w8PD/6urq//z8/P/29vb/9PT0/5iYmJEAAAAgAAAAAAAA - AAAAAAA2+/v7/fT09P/19fX/9fX1//X19f/x8fH/7+/v/+np6f/8/Pz/5+fn/5SUlJEAAAAgAAAAAgAA - AAAAAAAAAAAAM/j4+PD7+/v9/Pz8//z8/P/8/Pz//Pz8//z8/P/8/Pz/+Pj4/5OTk5EAAAAgAAAAAgAA - AAAAAAAAAAAAAAAAABwAAAAzAAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAAgAAAAAgAA - AAAAAAAAwACsQcAArEGAAKxBgACsQYAArEGAAKxBgACsQQAArEEAAKxBAACsQYAArEGAAKxBgACsQcAA - rEHAAaxBwAOsQQ== - - \ No newline at end of file diff --git a/UpdateIconForm.cs b/UpdateIconForm.cs index 05830dd..105375f 100644 --- a/UpdateIconForm.cs +++ b/UpdateIconForm.cs @@ -27,12 +27,12 @@ namespace bzit.bomg { base.OnShown(e); - int nodeCount = (int)parentForm.treeView1.NodeCountCalc; - progressBar1.Minimum = 0; - progressBar1.Value = 0; - progressBar1.Maximum = nodeCount; + //##int nodeCount = (int)parentForm.treeView1.NodeCountCalc; + //progressBar1.Minimum = 0; + //progressBar1.Value = 0; + //progressBar1.Maximum = nodeCount; - label2.Text = string.Concat("0", "/", nodeCount.ToString()); + //label2.Text = string.Concat("0", "/", nodeCount.ToString()); } protected override void OnClosing(CancelEventArgs e) diff --git a/Windows/Forms/BookmarkTreeView.cs b/Windows/Forms/BookmarkTreeView.cs index 0da84f9..8099ca9 100644 --- a/Windows/Forms/BookmarkTreeView.cs +++ b/Windows/Forms/BookmarkTreeView.cs @@ -32,16 +32,16 @@ namespace RyzStudio.Windows.Forms protected IconDatabase iconDatabase = null; - public delegate void NodeCountUpdated(ulong v); + //public delegate void NodeCountUpdated(ulong v); - public EventHandler OnChanged = null; - public NodeCountUpdated OnNodeCountUpdate = null; + //public EventHandler OnChanged = null; + //public NodeCountUpdated OnNodeCountUpdate = null; protected const char pathSeparator = '|'; protected TreeNode draggingNode = null; - //protected bool allowBeginEdit = false; - protected ulong nodeCount = 0; + protected bool allowBeginEdit = false; + //protected ulong nodeCount = 0; protected bool hasChanged = false; public BookmarkTreeView() : base() @@ -87,34 +87,34 @@ namespace RyzStudio.Windows.Forms } } - [Browsable(false)] - public ulong NodeCount - { - get - { - return nodeCount; - } - } + //[Browsable(false)] + //public ulong NodeCount + //{ + // get + // { + // return nodeCount; + // } + //} - [Browsable(false)] - public ulong NodeCountCalc - { - get - { - ulong rv = 0; - if (this.Nodes.Count <= 0) - { - return rv; - } + //[Browsable(false)] + //public ulong NodeCountCalc + //{ + // get + // { + // ulong rv = 0; + // if (this.Nodes.Count <= 0) + // { + // return rv; + // } - foreach (TreeNode tn in this.Nodes) - { - traverseNodeCount(ref rv, tn); - } + // foreach (TreeNode tn in this.Nodes) + // { + // traverseNodeCount(ref rv, tn); + // } - return rv; - } - } + // return rv; + // } + //} [Browsable(false)] public bool HasChanged @@ -124,7 +124,7 @@ namespace RyzStudio.Windows.Forms { hasChanged = value; - OnChanged?.Invoke(null, null); + //OnChanged?.Invoke(null, null); } } @@ -183,6 +183,8 @@ namespace RyzStudio.Windows.Forms TreeNode tn2 = addFolderPath(viewModel.TreeviewPath); tn2.Nodes.Add(tn); + + this.HasChanged = true; } public void AddOrUpdateItem_OnSelectedNode(BookmarkItemViewModel viewModel) @@ -192,9 +194,13 @@ namespace RyzStudio.Windows.Forms case NodeType.Root: case NodeType.Folder: addItem_OnSelectedNode(viewModel); + + this.HasChanged = true; break; case NodeType.Page: updateItem_OnSelectedNode(viewModel); + + this.HasChanged = true; break; default: break; @@ -227,25 +233,6 @@ namespace RyzStudio.Windows.Forms } } - - //public void EditNode() - //{ - // this.SNode. - - // //this.HasChanged = true; - - // //if (this.SelectedNode == null) - // //{ - // // return; - // //} - - // //if (!this.SelectedNode.IsEditing) - // //{ - // // allowBeginEdit = true; - // // this.SelectedNode.BeginEdit(); - // //} - //} - public string GetNodeFullPath(TreeNode node) { string rv = PathEncode(node.Text); @@ -343,8 +330,8 @@ namespace RyzStudio.Windows.Forms public void Clear() { - nodeCount = 0; - NodeCountUpdate(nodeCount); + //nodeCount = 0; + //NodeCountUpdate(nodeCount); this.Nodes.Clear(); this.HasChanged = true; @@ -420,15 +407,17 @@ namespace RyzStudio.Windows.Forms protected override void OnBeforeLabelEdit(NodeLabelEditEventArgs e) { - //if (!allowBeginEdit) - //{ - // e.CancelEdit = true; - // return; - //} + if (!allowBeginEdit) + { + allowBeginEdit = false; - //this.HasChanged = true; + e.CancelEdit = true; + return; + } - //base.OnBeforeLabelEdit(e); + this.HasChanged = true; + + base.OnBeforeLabelEdit(e); //if (e.Node == null) //{ @@ -470,7 +459,7 @@ namespace RyzStudio.Windows.Forms // e.CancelEdit = true; //} - //allowBeginEdit = false; + allowBeginEdit = false; } protected override void OnPreviewKeyDown(PreviewKeyDownEventArgs e) @@ -502,6 +491,8 @@ namespace RyzStudio.Windows.Forms break; case Keys.F2: + allowBeginEdit = true; + this.SNode.Edit(); break; case Keys.Up: @@ -521,13 +512,13 @@ namespace RyzStudio.Windows.Forms default: break; } - //base.OnPreviewKeyDown(e); + base.OnPreviewKeyDown(e); } - protected virtual void NodeCountUpdate(ulong v) - { - this.OnNodeCountUpdate?.Invoke(v); - } + //protected virtual void NodeCountUpdate(ulong v) + //{ + // this.OnNodeCountUpdate?.Invoke(v); + //} #endregion @@ -700,9 +691,9 @@ namespace RyzStudio.Windows.Forms - protected virtual void OnAddFolderNode(TreeNode node) { } + //protected virtual void OnAddFolderNode(TreeNode node) { } - protected virtual void OnAddItemNode(TreeNode node) { } + //protected virtual void OnAddItemNode(TreeNode node) { } ////protected string PathEncode(string text) { return RyzStudio.String.EncodeTo64(text); } From 18dc43e491890c5ab66e5d78a6c0fac0785f1818 Mon Sep 17 00:00:00 2001 From: Ray Date: Sat, 20 Apr 2019 17:05:55 +0100 Subject: [PATCH 04/34] WIP --- BookmarkEditForm.Designer.cs | 8 +- BookmarkEditForm.cs | 10 + IconDatabase.cs => Data/IconDatabase.cs | 19 +- MainForm.Designer.cs | 309 +++++++++++++----------- MainForm.cs | 161 +++--------- MainForm.resx | 33 ++- NewSessionForm.Designer.cs | 3 +- SessionFileFormat.cs | 48 ++-- UpdateIconForm.cs | 86 +++---- Windows/Forms/BookmarkTreeView.cs | 285 ++++++++++++++++------ Windows/Forms/BookmarkTreeViewSNode.cs | 25 +- bomg.csproj | 6 +- 12 files changed, 523 insertions(+), 470 deletions(-) rename IconDatabase.cs => Data/IconDatabase.cs (90%) diff --git a/BookmarkEditForm.Designer.cs b/BookmarkEditForm.Designer.cs index 5fd0a71..c1bd6f0 100644 --- a/BookmarkEditForm.Designer.cs +++ b/BookmarkEditForm.Designer.cs @@ -125,7 +125,7 @@ namespace bzit.bomg this.memoBox1.Name = "memoBox1"; this.memoBox1.Padding = new System.Windows.Forms.Padding(10, 10, 3, 9); this.memoBox1.Size = new System.Drawing.Size(336, 83); - this.memoBox1.TabIndex = 69; + this.memoBox1.TabIndex = 3; // // textBox2 // @@ -137,7 +137,7 @@ namespace bzit.bomg this.textBox2.Name = "textBox2"; this.textBox2.Padding = new System.Windows.Forms.Padding(10, 10, 9, 9); this.textBox2.Size = new System.Drawing.Size(259, 32); - this.textBox2.TabIndex = 67; + this.textBox2.TabIndex = 0; // // textBox1 // @@ -149,7 +149,7 @@ namespace bzit.bomg this.textBox1.Name = "textBox1"; this.textBox1.Padding = new System.Windows.Forms.Padding(10, 10, 9, 9); this.textBox1.Size = new System.Drawing.Size(259, 32); - this.textBox1.TabIndex = 66; + this.textBox1.TabIndex = 2; // // horizontalSeparator1 // @@ -174,7 +174,7 @@ namespace bzit.bomg this.button1.OverImage = null; this.button1.Padding = new System.Windows.Forms.Padding(4, 4, 3, 3); this.button1.Size = new System.Drawing.Size(64, 32); - this.button1.TabIndex = 2; + this.button1.TabIndex = 1; this.button1.Click += new System.EventHandler(this.button1_Click); // // button2 diff --git a/BookmarkEditForm.cs b/BookmarkEditForm.cs index 5771874..ab1ea96 100644 --- a/BookmarkEditForm.cs +++ b/BookmarkEditForm.cs @@ -134,6 +134,16 @@ namespace bzit.bomg return; } + if (string.IsNullOrWhiteSpace(textBox1.Text)) + { + return; + } + + if (string.IsNullOrWhiteSpace(textBox2.Text)) + { + return; + } + if (itemModel == null) { itemModel = new BookmarkItemModel(); diff --git a/IconDatabase.cs b/Data/IconDatabase.cs similarity index 90% rename from IconDatabase.cs rename to Data/IconDatabase.cs index 8919058..c761ad4 100644 --- a/IconDatabase.cs +++ b/Data/IconDatabase.cs @@ -3,7 +3,7 @@ using System.Drawing; using System.IO; using RyzStudio.Data.SQLite; -namespace bzit.bomg +namespace bzit.bomg.Data { public class IconDatabase : SQLiteDatabase2 { @@ -19,19 +19,17 @@ namespace bzit.bomg return false; } - return this.DoNonQuery(@" - CREATE TABLE bzt_app_bomg_icons + return this.DoNonQuery(@" + CREATE TABLE bzt_app_bomg_icons ( - ico_id INTEGER PRIMARY KEY, + ico_id INTEGER PRIMARY KEY, ico_key TEXT, ico_hash TEXT, ico_content BLOB - ) + ) ") >= 0; } -#region public methods - public bool HasIcon(string url) { return this.DoQueryExist("SELECT 1 FROM bzt_app_bomg_icons WHERE ico_key='" + escapeValue(url) + "'"); @@ -102,8 +100,6 @@ namespace bzit.bomg this.DoNonQuery("DELETE FROM bzt_app_bomg_icons WHERE ico_key='" + escapeValue(url) + "';"); } -#endregion - protected string imageToSQLString(Image image) { MemoryStream stream = new MemoryStream(); @@ -115,10 +111,7 @@ namespace bzit.bomg return bytesToSQLString(byteArray); } - protected string bytesToSQLString(byte[] image) - { - return Convert.ToBase64String(image); - } + protected string bytesToSQLString(byte[] image) => Convert.ToBase64String(image); protected Image sqlStringToImage(string base64_string) { diff --git a/MainForm.Designer.cs b/MainForm.Designer.cs index 7366db7..59d99c7 100644 --- a/MainForm.Designer.cs +++ b/MainForm.Designer.cs @@ -98,6 +98,7 @@ namespace bzit.bomg this.toolStripMenuItem20 = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator13 = new System.Windows.Forms.ToolStripSeparator(); this.toolStripMenuItem22 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripButton1 = new System.Windows.Forms.ToolStripButton(); this.treeView1 = new RyzStudio.Windows.Forms.BookmarkTreeView(); this.pageTreeNodeMenu.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.statusBarPanel1)).BeginInit(); @@ -107,9 +108,9 @@ namespace bzit.bomg this.toolStrip2.SuspendLayout(); this.rootTreeNodeMenu.SuspendLayout(); this.SuspendLayout(); - // + // // pageTreeNodeMenu - // + // this.pageTreeNodeMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.toolStripMenuItem4, this.toolStripSeparator3, @@ -120,54 +121,54 @@ namespace bzit.bomg this.moveFileToToolStripMenuItem}); this.pageTreeNodeMenu.Name = "listViewMenu"; this.pageTreeNodeMenu.Size = new System.Drawing.Size(139, 126); - // + // // toolStripMenuItem4 - // + // this.toolStripMenuItem4.Name = "toolStripMenuItem4"; this.toolStripMenuItem4.Size = new System.Drawing.Size(138, 22); this.toolStripMenuItem4.Text = "&Open"; this.toolStripMenuItem4.Click += new System.EventHandler(this.openContextMenu_Click); - // + // // toolStripSeparator3 - // + // this.toolStripSeparator3.Name = "toolStripSeparator3"; this.toolStripSeparator3.Size = new System.Drawing.Size(135, 6); - // + // // toolStripMenuItem8 - // + // this.toolStripMenuItem8.Name = "toolStripMenuItem8"; this.toolStripMenuItem8.Size = new System.Drawing.Size(138, 22); this.toolStripMenuItem8.Text = "E&dit"; this.toolStripMenuItem8.Click += new System.EventHandler(this.editContextMenu3_Click); - // + // // toolStripMenuItem6 - // + // this.toolStripMenuItem6.Name = "toolStripMenuItem6"; this.toolStripMenuItem6.Size = new System.Drawing.Size(138, 22); this.toolStripMenuItem6.Text = "D&elete"; this.toolStripMenuItem6.Click += new System.EventHandler(this.deleteContextMenu2_Click); - // + // // toolStripSeparator2 - // + // this.toolStripSeparator2.Name = "toolStripSeparator2"; this.toolStripSeparator2.Size = new System.Drawing.Size(135, 6); - // + // // listViewMenuItem1 - // + // this.listViewMenuItem1.Name = "listViewMenuItem1"; this.listViewMenuItem1.Size = new System.Drawing.Size(138, 22); this.listViewMenuItem1.Text = "Move &Up"; this.listViewMenuItem1.Click += new System.EventHandler(this.moveUpContextMenu2_Click); - // + // // moveFileToToolStripMenuItem - // + // this.moveFileToToolStripMenuItem.Name = "moveFileToToolStripMenuItem"; this.moveFileToToolStripMenuItem.Size = new System.Drawing.Size(138, 22); this.moveFileToToolStripMenuItem.Text = "Move &Down"; this.moveFileToToolStripMenuItem.Click += new System.EventHandler(this.moveDownContextMenu2_Click); - // + // // statusBar1 - // + // this.statusBar1.Font = new System.Drawing.Font("Verdana", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.statusBar1.Location = new System.Drawing.Point(0, 634); this.statusBar1.Name = "statusBar1"; @@ -178,20 +179,20 @@ namespace bzit.bomg this.statusBar1.Size = new System.Drawing.Size(304, 20); this.statusBar1.SizingGrip = false; this.statusBar1.TabIndex = 9; - // + // // statusBarPanel1 - // + // this.statusBarPanel1.AutoSize = System.Windows.Forms.StatusBarPanelAutoSize.Spring; this.statusBarPanel1.Name = "statusBarPanel1"; this.statusBarPanel1.Width = 204; - // + // // statusBarPanel2 - // + // this.statusBarPanel2.Alignment = System.Windows.Forms.HorizontalAlignment.Center; this.statusBarPanel2.Name = "statusBarPanel2"; - // + // // toolStrip1 - // + // this.toolStrip1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None; this.toolStrip1.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden; this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { @@ -208,9 +209,9 @@ namespace bzit.bomg this.toolStrip1.Size = new System.Drawing.Size(304, 25); this.toolStrip1.TabIndex = 25; this.toolStrip1.Text = "toolStrip1"; - // + // // toolStripDropDownButton1 - // + // this.toolStripDropDownButton1.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; this.toolStripDropDownButton1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.newFileMenuItem, @@ -229,89 +230,89 @@ namespace bzit.bomg this.toolStripDropDownButton1.ShowDropDownArrow = false; this.toolStripDropDownButton1.Size = new System.Drawing.Size(29, 22); this.toolStripDropDownButton1.Text = "&File"; - // + // // newFileMenuItem - // + // this.newFileMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("newFileMenuItem.Image"))); this.newFileMenuItem.Name = "newFileMenuItem"; this.newFileMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.N))); this.newFileMenuItem.Size = new System.Drawing.Size(186, 22); this.newFileMenuItem.Text = "&New"; this.newFileMenuItem.Click += new System.EventHandler(this.newMenuItem_Click); - // + // // openFileMenuItem - // + // this.openFileMenuItem.Image = global::bzit.bomg.Properties.Resources.folder_page; this.openFileMenuItem.Name = "openFileMenuItem"; this.openFileMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O))); this.openFileMenuItem.Size = new System.Drawing.Size(186, 22); this.openFileMenuItem.Text = "&Open"; this.openFileMenuItem.Click += new System.EventHandler(this.openMenuItem_Click); - // + // // toolStripSeparator1 - // + // this.toolStripSeparator1.Name = "toolStripSeparator1"; this.toolStripSeparator1.Size = new System.Drawing.Size(183, 6); - // + // // closeFileMenuItem - // + // this.closeFileMenuItem.Name = "closeFileMenuItem"; this.closeFileMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.W))); this.closeFileMenuItem.Size = new System.Drawing.Size(186, 22); this.closeFileMenuItem.Text = "&Close"; this.closeFileMenuItem.Click += new System.EventHandler(this.closeMenuItem_Click); - // + // // toolStripSeparator4 - // + // this.toolStripSeparator4.Name = "toolStripSeparator4"; this.toolStripSeparator4.Size = new System.Drawing.Size(183, 6); - // + // // saveFileMenuItem - // + // this.saveFileMenuItem.Image = global::bzit.bomg.Properties.Resources.disk; this.saveFileMenuItem.Name = "saveFileMenuItem"; this.saveFileMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S))); this.saveFileMenuItem.Size = new System.Drawing.Size(186, 22); this.saveFileMenuItem.Text = "&Save"; this.saveFileMenuItem.Click += new System.EventHandler(this.importSnapshotToolStripMenuItem_Click); - // + // // saveAsFileMenuItem - // + // this.saveAsFileMenuItem.Image = global::bzit.bomg.Properties.Resources.page_white_disk; this.saveAsFileMenuItem.Name = "saveAsFileMenuItem"; - this.saveAsFileMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) + this.saveAsFileMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) | System.Windows.Forms.Keys.S))); this.saveAsFileMenuItem.Size = new System.Drawing.Size(186, 22); this.saveAsFileMenuItem.Text = "Save &As"; this.saveAsFileMenuItem.Click += new System.EventHandler(this.exportSnapshotToolStripMenuItem_Click); - // + // // toolStripSeparator8 - // + // this.toolStripSeparator8.Name = "toolStripSeparator8"; this.toolStripSeparator8.Size = new System.Drawing.Size(183, 6); - // + // // exportFileMenuItem - // + // this.exportFileMenuItem.Enabled = false; this.exportFileMenuItem.Name = "exportFileMenuItem"; this.exportFileMenuItem.Size = new System.Drawing.Size(186, 22); this.exportFileMenuItem.Text = "&Export"; this.exportFileMenuItem.Click += new System.EventHandler(this.toolStripMenuItem7_Click); - // + // // toolStripSeparator6 - // + // this.toolStripSeparator6.Name = "toolStripSeparator6"; this.toolStripSeparator6.Size = new System.Drawing.Size(183, 6); - // + // // exitFileMenuItem - // + // this.exitFileMenuItem.Name = "exitFileMenuItem"; this.exitFileMenuItem.Size = new System.Drawing.Size(186, 22); this.exitFileMenuItem.Text = "E&xit"; this.exitFileMenuItem.Click += new System.EventHandler(this.exitMenuItem_Click); - // + // // toolStripDropDownButton2 - // + // this.toolStripDropDownButton2.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; this.toolStripDropDownButton2.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.findEditMenuItem}); @@ -320,18 +321,18 @@ namespace bzit.bomg this.toolStripDropDownButton2.ShowDropDownArrow = false; this.toolStripDropDownButton2.Size = new System.Drawing.Size(31, 22); this.toolStripDropDownButton2.Text = "&Edit"; - // + // // findEditMenuItem - // + // this.findEditMenuItem.Image = global::bzit.bomg.Properties.Resources.magnifier; this.findEditMenuItem.Name = "findEditMenuItem"; this.findEditMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.F))); - this.findEditMenuItem.Size = new System.Drawing.Size(180, 22); + this.findEditMenuItem.Size = new System.Drawing.Size(137, 22); this.findEditMenuItem.Text = "&Find"; this.findEditMenuItem.Click += new System.EventHandler(this.toolStripButton5_Click); - // + // // toolStripDropDownButton3 - // + // this.toolStripDropDownButton3.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; this.toolStripDropDownButton3.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.expandAllViewMenuItem, @@ -341,25 +342,25 @@ namespace bzit.bomg this.toolStripDropDownButton3.ShowDropDownArrow = false; this.toolStripDropDownButton3.Size = new System.Drawing.Size(36, 22); this.toolStripDropDownButton3.Text = "&View"; - // + // // expandAllViewMenuItem - // + // this.expandAllViewMenuItem.Enabled = false; this.expandAllViewMenuItem.Name = "expandAllViewMenuItem"; - this.expandAllViewMenuItem.Size = new System.Drawing.Size(180, 22); + this.expandAllViewMenuItem.Size = new System.Drawing.Size(136, 22); this.expandAllViewMenuItem.Text = "&Expand All"; this.expandAllViewMenuItem.Click += new System.EventHandler(this.expandAllToolStripMenuItem_Click); - // + // // collapseAllViewMenuItem - // + // this.collapseAllViewMenuItem.Enabled = false; this.collapseAllViewMenuItem.Name = "collapseAllViewMenuItem"; - this.collapseAllViewMenuItem.Size = new System.Drawing.Size(180, 22); + this.collapseAllViewMenuItem.Size = new System.Drawing.Size(136, 22); this.collapseAllViewMenuItem.Text = "&Collapse All"; this.collapseAllViewMenuItem.Click += new System.EventHandler(this.collapseAllToolStripMenuItem_Click); - // + // // toolStripDropDownButton4 - // + // this.toolStripDropDownButton4.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; this.toolStripDropDownButton4.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.updateIconsToolMenuItem, @@ -370,31 +371,31 @@ namespace bzit.bomg this.toolStripDropDownButton4.ShowDropDownArrow = false; this.toolStripDropDownButton4.Size = new System.Drawing.Size(39, 22); this.toolStripDropDownButton4.Text = "&Tools"; - // + // // updateIconsToolMenuItem - // + // this.updateIconsToolMenuItem.Name = "updateIconsToolMenuItem"; - this.updateIconsToolMenuItem.Size = new System.Drawing.Size(180, 22); + this.updateIconsToolMenuItem.Size = new System.Drawing.Size(143, 22); this.updateIconsToolMenuItem.Text = "&Update Icons"; this.updateIconsToolMenuItem.Click += new System.EventHandler(this.toolStripMenuItem1_Click); - // + // // toolStripSeparator14 - // + // this.toolStripSeparator14.Name = "toolStripSeparator14"; - this.toolStripSeparator14.Size = new System.Drawing.Size(177, 6); - // + this.toolStripSeparator14.Size = new System.Drawing.Size(140, 6); + // // optionsToolMenuItem - // + // this.optionsToolMenuItem.Enabled = false; this.optionsToolMenuItem.Image = global::bzit.bomg.Properties.Resources.cog; this.optionsToolMenuItem.Name = "optionsToolMenuItem"; this.optionsToolMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F12; - this.optionsToolMenuItem.Size = new System.Drawing.Size(180, 22); + this.optionsToolMenuItem.Size = new System.Drawing.Size(143, 22); this.optionsToolMenuItem.Text = "&Options"; this.optionsToolMenuItem.Click += new System.EventHandler(this.optionsToolStripMenuItem1_Click); - // + // // toolStripDropDownButton5 - // + // this.toolStripDropDownButton5.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; this.toolStripDropDownButton5.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.viewHelpHelpMenuItem, @@ -405,31 +406,31 @@ namespace bzit.bomg this.toolStripDropDownButton5.ShowDropDownArrow = false; this.toolStripDropDownButton5.Size = new System.Drawing.Size(36, 22); this.toolStripDropDownButton5.Text = "&Help"; - // + // // viewHelpHelpMenuItem - // + // this.viewHelpHelpMenuItem.Image = global::bzit.bomg.Properties.Resources.help; this.viewHelpHelpMenuItem.Name = "viewHelpHelpMenuItem"; this.viewHelpHelpMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F1; - this.viewHelpHelpMenuItem.Size = new System.Drawing.Size(180, 22); + this.viewHelpHelpMenuItem.Size = new System.Drawing.Size(146, 22); this.viewHelpHelpMenuItem.Text = "View &Help"; this.viewHelpHelpMenuItem.Click += new System.EventHandler(this.documentationToolStripMenuItem_Click); - // + // // toolStripSeparator12 - // + // this.toolStripSeparator12.Name = "toolStripSeparator12"; - this.toolStripSeparator12.Size = new System.Drawing.Size(177, 6); - // + this.toolStripSeparator12.Size = new System.Drawing.Size(143, 6); + // // aboutHelpMenuItem - // + // this.aboutHelpMenuItem.Image = global::bzit.bomg.Properties.Resources.comment; this.aboutHelpMenuItem.Name = "aboutHelpMenuItem"; - this.aboutHelpMenuItem.Size = new System.Drawing.Size(180, 22); + this.aboutHelpMenuItem.Size = new System.Drawing.Size(146, 22); this.aboutHelpMenuItem.Text = "&About"; this.aboutHelpMenuItem.Click += new System.EventHandler(this.aboutToolStripMenuItem1_Click); - // + // // toolStripDropDownButton7 - // + // this.toolStripDropDownButton7.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; this.toolStripDropDownButton7.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.alwaysOnTopToolStripMenuItem}); @@ -439,23 +440,23 @@ namespace bzit.bomg this.toolStripDropDownButton7.Size = new System.Drawing.Size(16, 22); this.toolStripDropDownButton7.Text = "&?"; this.toolStripDropDownButton7.Visible = false; - // + // // alwaysOnTopToolStripMenuItem - // + // this.alwaysOnTopToolStripMenuItem.Name = "alwaysOnTopToolStripMenuItem"; this.alwaysOnTopToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.F11))); this.alwaysOnTopToolStripMenuItem.Size = new System.Drawing.Size(205, 22); this.alwaysOnTopToolStripMenuItem.Text = "Always On Top"; this.alwaysOnTopToolStripMenuItem.Click += new System.EventHandler(this.alwaysOnTopToolStripMenuItem_Click); - // + // // openFileDialog - // + // this.openFileDialog.DefaultExt = "ryz"; this.openFileDialog.Filter = "Bookmarks files|*.ryz"; this.openFileDialog.Title = "Open bookmarks file"; - // + // // folderTreeNodeMenu - // + // this.folderTreeNodeMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.toolStripMenuItem15, this.toolStripMenuItem16, @@ -470,102 +471,103 @@ namespace bzit.bomg this.toolStripMenuItem13}); this.folderTreeNodeMenu.Name = "listViewMenu"; this.folderTreeNodeMenu.Size = new System.Drawing.Size(139, 198); - // + // // toolStripMenuItem15 - // + // this.toolStripMenuItem15.Name = "toolStripMenuItem15"; this.toolStripMenuItem15.Size = new System.Drawing.Size(138, 22); this.toolStripMenuItem15.Text = "Add &Page"; this.toolStripMenuItem15.Click += new System.EventHandler(this.addPageContextMenu2_Click); - // + // // toolStripMenuItem16 - // + // this.toolStripMenuItem16.Name = "toolStripMenuItem16"; this.toolStripMenuItem16.Size = new System.Drawing.Size(138, 22); this.toolStripMenuItem16.Text = "Add &Folder"; this.toolStripMenuItem16.Click += new System.EventHandler(this.addFolderContextMenu2_Click); - // + // // toolStripSeparator5 - // + // this.toolStripSeparator5.Name = "toolStripSeparator5"; this.toolStripSeparator5.Size = new System.Drawing.Size(135, 6); - // + // // toolStripMenuItem14 - // + // this.toolStripMenuItem14.Name = "toolStripMenuItem14"; this.toolStripMenuItem14.Size = new System.Drawing.Size(138, 22); this.toolStripMenuItem14.Text = "&Open All"; this.toolStripMenuItem14.Click += new System.EventHandler(this.openAllContextMenu_Click); - // + // // toolStripMenuItem9 - // + // this.toolStripMenuItem9.Name = "toolStripMenuItem9"; this.toolStripMenuItem9.Size = new System.Drawing.Size(138, 22); this.toolStripMenuItem9.Text = "Edi&t"; this.toolStripMenuItem9.Click += new System.EventHandler(this.editContextMenu2_Click); - // + // // toolStripMenuItem11 - // + // this.toolStripMenuItem11.Name = "toolStripMenuItem11"; this.toolStripMenuItem11.Size = new System.Drawing.Size(138, 22); this.toolStripMenuItem11.Text = "D&elete"; this.toolStripMenuItem11.Click += new System.EventHandler(this.deleteContextMenu_Click); - // + // // toolStripSeparator7 - // + // this.toolStripSeparator7.Name = "toolStripSeparator7"; this.toolStripSeparator7.Size = new System.Drawing.Size(135, 6); - // + // // sortToolStripMenuItem - // + // this.sortToolStripMenuItem.Name = "sortToolStripMenuItem"; this.sortToolStripMenuItem.Size = new System.Drawing.Size(138, 22); this.sortToolStripMenuItem.Text = "&Sort"; this.sortToolStripMenuItem.Click += new System.EventHandler(this.sortContextMenu2_Click); - // + // // toolStripSeparator11 - // + // this.toolStripSeparator11.Name = "toolStripSeparator11"; this.toolStripSeparator11.Size = new System.Drawing.Size(135, 6); - // + // // toolStripMenuItem12 - // + // this.toolStripMenuItem12.Name = "toolStripMenuItem12"; this.toolStripMenuItem12.Size = new System.Drawing.Size(138, 22); this.toolStripMenuItem12.Text = "Move &Up"; this.toolStripMenuItem12.Click += new System.EventHandler(this.moveUpContextMenu_Click); - // + // // toolStripMenuItem13 - // + // this.toolStripMenuItem13.Name = "toolStripMenuItem13"; this.toolStripMenuItem13.Size = new System.Drawing.Size(138, 22); this.toolStripMenuItem13.Text = "Move &Down"; this.toolStripMenuItem13.Click += new System.EventHandler(this.moveDownContextMenu_Click); - // + // // saveFileDialog - // - this.saveFileDialog.DefaultExt = "ryz"; - this.saveFileDialog.Filter = "Bookmarks file|*.ryz|Bookmarks file (password protected)|*.ryz"; + // + this.saveFileDialog.DefaultExt = "jsnx"; + this.saveFileDialog.Filter = "Bookmarks file|*.jsnx|Bookmarks file (password protected)|*.jsnx"; this.saveFileDialog.Title = "Save bookmarks file"; - // + // // toolStrip2 - // + // this.toolStrip2.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None; this.toolStrip2.CanOverflow = false; this.toolStrip2.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.newMenuBarItem, this.openMenuBarItem, this.saveMenuBarItem, - this.toolStripSeparator9}); + this.toolStripSeparator9, + this.toolStripButton1}); this.toolStrip2.Location = new System.Drawing.Point(0, 25); this.toolStrip2.Name = "toolStrip2"; this.toolStrip2.RenderMode = System.Windows.Forms.ToolStripRenderMode.System; this.toolStrip2.Size = new System.Drawing.Size(304, 25); this.toolStrip2.TabIndex = 26; this.toolStrip2.Text = "toolStrip2"; - // + // // newMenuBarItem - // + // this.newMenuBarItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; this.newMenuBarItem.Image = ((System.Drawing.Image)(resources.GetObject("newMenuBarItem.Image"))); this.newMenuBarItem.ImageTransparentColor = System.Drawing.Color.Magenta; @@ -574,9 +576,9 @@ namespace bzit.bomg this.newMenuBarItem.Text = "toolStripButton1"; this.newMenuBarItem.ToolTipText = "New"; this.newMenuBarItem.Click += new System.EventHandler(this.newMenuItem_Click); - // + // // openMenuBarItem - // + // this.openMenuBarItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; this.openMenuBarItem.Image = global::bzit.bomg.Properties.Resources.folder_page; this.openMenuBarItem.ImageTransparentColor = System.Drawing.Color.Magenta; @@ -585,9 +587,9 @@ namespace bzit.bomg this.openMenuBarItem.Text = "toolStripButton2"; this.openMenuBarItem.ToolTipText = "Open"; this.openMenuBarItem.Click += new System.EventHandler(this.openMenuItem_Click); - // + // // saveMenuBarItem - // + // this.saveMenuBarItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; this.saveMenuBarItem.Image = global::bzit.bomg.Properties.Resources.disk; this.saveMenuBarItem.ImageTransparentColor = System.Drawing.Color.Magenta; @@ -596,14 +598,14 @@ namespace bzit.bomg this.saveMenuBarItem.Text = "toolStripButton3"; this.saveMenuBarItem.ToolTipText = "Save"; this.saveMenuBarItem.Click += new System.EventHandler(this.importSnapshotToolStripMenuItem_Click); - // + // // toolStripSeparator9 - // + // this.toolStripSeparator9.Name = "toolStripSeparator9"; this.toolStripSeparator9.Size = new System.Drawing.Size(6, 25); - // + // // rootTreeNodeMenu - // + // this.rootTreeNodeMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.toolStripMenuItem17, this.toolStripMenuItem18, @@ -613,56 +615,68 @@ namespace bzit.bomg this.toolStripMenuItem22}); this.rootTreeNodeMenu.Name = "listViewMenu"; this.rootTreeNodeMenu.Size = new System.Drawing.Size(133, 104); - // + // // toolStripMenuItem17 - // + // this.toolStripMenuItem17.Name = "toolStripMenuItem17"; this.toolStripMenuItem17.Size = new System.Drawing.Size(132, 22); this.toolStripMenuItem17.Text = "Add &Page"; this.toolStripMenuItem17.Click += new System.EventHandler(this.addPageContextMenu_Click); - // + // // toolStripMenuItem18 - // + // this.toolStripMenuItem18.Name = "toolStripMenuItem18"; this.toolStripMenuItem18.Size = new System.Drawing.Size(132, 22); this.toolStripMenuItem18.Text = "Add &Folder"; this.toolStripMenuItem18.Click += new System.EventHandler(this.addFolderContextMenu_Click); - // + // // toolStripSeparator10 - // + // this.toolStripSeparator10.Name = "toolStripSeparator10"; this.toolStripSeparator10.Size = new System.Drawing.Size(129, 6); - // + // // toolStripMenuItem20 - // + // this.toolStripMenuItem20.Name = "toolStripMenuItem20"; this.toolStripMenuItem20.Size = new System.Drawing.Size(132, 22); this.toolStripMenuItem20.Text = "Edi&t"; this.toolStripMenuItem20.Click += new System.EventHandler(this.editContextMenu_Click); - // + // // toolStripSeparator13 - // + // this.toolStripSeparator13.Name = "toolStripSeparator13"; this.toolStripSeparator13.Size = new System.Drawing.Size(129, 6); - // + // // toolStripMenuItem22 - // + // this.toolStripMenuItem22.Name = "toolStripMenuItem22"; this.toolStripMenuItem22.Size = new System.Drawing.Size(132, 22); this.toolStripMenuItem22.Text = "&Sort"; this.toolStripMenuItem22.Click += new System.EventHandler(this.sortContextMenu_Click); - // + // + // toolStripButton1 + // + this.toolStripButton1.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButton1.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton1.Image"))); + this.toolStripButton1.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton1.Name = "toolStripButton1"; + this.toolStripButton1.Size = new System.Drawing.Size(23, 22); + this.toolStripButton1.Text = "toolStripButton1"; + this.toolStripButton1.Click += new System.EventHandler(this.toolStripButton1_Click); + // // treeView1 - // + // this.treeView1.AllowDrop = true; this.treeView1.BackColor = System.Drawing.Color.White; this.treeView1.Dock = System.Windows.Forms.DockStyle.Fill; + this.treeView1.HasChanged = false; this.treeView1.HideSelection = false; this.treeView1.HotTracking = true; this.treeView1.ImageIndex = 0; this.treeView1.LabelEdit = true; this.treeView1.Location = new System.Drawing.Point(0, 50); this.treeView1.Name = "treeView1"; + this.treeView1.PathSeparator = "\n"; this.treeView1.SelectedImageIndex = 0; this.treeView1.ShowNodeToolTips = true; this.treeView1.Size = new System.Drawing.Size(304, 584); @@ -670,9 +684,9 @@ namespace bzit.bomg this.treeView1.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeView1_NodeMouseClick); this.treeView1.NodeMouseDoubleClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeView1_NodeMouseDoubleClick); this.treeView1.PreviewKeyDown += new System.Windows.Forms.PreviewKeyDownEventHandler(this.treeView1_PreviewKeyDown); - // + // // MainForm - // + // this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; this.BackColor = System.Drawing.SystemColors.Control; this.ClientSize = new System.Drawing.Size(304, 654); @@ -769,6 +783,7 @@ namespace bzit.bomg private System.Windows.Forms.ToolStripMenuItem findEditMenuItem; private System.Windows.Forms.ToolStripMenuItem updateIconsToolMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator14; + private System.Windows.Forms.ToolStripButton toolStripButton1; } } diff --git a/MainForm.cs b/MainForm.cs index 11846ff..d935187 100644 --- a/MainForm.cs +++ b/MainForm.cs @@ -1,8 +1,10 @@ using bzit.bomg.Models; using System; +using System.Collections.Generic; using System.ComponentModel; using System.IO; using System.Windows.Forms; +using static RyzStudio.Windows.Forms.BookmarkTreeView; namespace bzit.bomg { @@ -382,7 +384,7 @@ namespace bzit.bomg /** * File -> Exit */ - private void exitMenuItem_Click(object sender, EventArgs e) { this.Close(); } + private void exitMenuItem_Click(object sender, EventArgs e) => this.Close(); /** * Find @@ -490,89 +492,6 @@ namespace bzit.bomg #endregion - //#region TreeView Menu - item - - /** - * Node -> Open - */ - //private void toolStripMenuItem4_Click(object sender, EventArgs e) - //{ - // openBookmark(treeView1.SelectedNode); - //} - - /** - * Node -> Edit - */ - //private void toolStripMenuItem8_Click(object sender, EventArgs e) - //{ - // if (treeView1.SelectedNode == null) - // { - // return; - // } - - // treeView1.HasChanged = true; - - // TreeNode tn = treeView1.SelectedNode; - // //##BookmarkEditForm oBookmarkEdit = new BookmarkEditForm(ref tn); - // //##oBookmarkEdit.ShowDialog(); - //} - - /** - * Node -> Delete - */ - //private void toolStripMenuItem6_Click(object sender, EventArgs e) => treeView1.SNode.Delete(); - //{ - // treeView1.DeleteNode(); - //} - - //#endregion - - //#region TreeView Menu - folder - - /** - * Add Page - */ - //private void toolStripMenuItem15_Click(object sender, EventArgs e) { treeView1.AddBookmarkPage(); } - - /** - * Add Folder - */ - //private void toolStripMenuItem16_Click(object sender, EventArgs e) => treeView1.SelectedNode = treeView1.SNode.AddFolder(); - - /** - * Open All - */ - //private void toolStripMenuItem14_Click(object sender, EventArgs e) - //{ - // if (treeView1.SelectedNode == null) - // { - // return; - // } - - // foreach (TreeNode tn in treeView1.SelectedNode.Nodes) - // { - // if (tn.Tag == null) - // { - // continue; - // } - - // openBookmark(tn); - // } - //} - - /** - * Edit - */ - //private void toolStripMenuItem9_Click(object sender, EventArgs e) - //{ - // treeView1.HasChanged = true; - // //##treeView1.EditNode(); - //} - - - - //#endregion - protected void OpenBookmarkFile(string filename) { treeView1.HasChanged = false; @@ -640,6 +559,9 @@ namespace bzit.bomg return rv; } + + + private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) { if (e.Button != MouseButtons.Right) @@ -673,59 +595,31 @@ namespace bzit.bomg return; } + NodeType nodeType = treeView1.SNode.GetNodeType(); + switch (e.KeyCode) { case Keys.Apps: treeView1_NodeMouseClick(sender, new TreeNodeMouseClickEventArgs(tn, MouseButtons.Right, 1, tn.Bounds.X, tn.Bounds.Y)); return; - //case Keys.F2: - //if (tn.Tag == null) - //{ - // return; - //} - - //if (!(tn.Tag is BookmarkItem)) - //{ - // return; - //} - - //toolStripMenuItem8_Click(sender, null); - - //break; - case Keys.F3: - if (tn.Tag == null) - { - return; - } - - if (!(tn.Tag is BookmarkItem)) - { - return; - } - - BookmarkItem bookmarkItem = (BookmarkItem)tn.Tag; - if (bookmarkItem == null) - { - return; - } - - if (string.IsNullOrEmpty(bookmarkItem.SiteAddress)) - { - return; - } - - try - { - Clipboard.SetText(bookmarkItem.SiteAddress.Trim()); - } - catch - { - // do nothing - } - - break; case Keys.Enter: openBookmark(tn); + break; + case Keys.Insert: + if (e.Modifiers != Keys.Shift) + { + if ((nodeType == NodeType.Root) || (nodeType == NodeType.Folder)) + { + (new BookmarkEditForm(treeView1)).ShowDialog(); + } + else if (nodeType == NodeType.Page) + { + treeView1.SelectedNode = tn.Parent; + + (new BookmarkEditForm(treeView1)).ShowDialog(); + } + } + break; default: break; } @@ -881,8 +775,15 @@ namespace bzit.bomg private void moveUpContextMenu2_Click(object sender, EventArgs e) => treeView1.SNode.MoveUp(); private void moveDownContextMenu2_Click(object sender, EventArgs e) => treeView1.SNode.MoveDown(); + #endregion + private void toolStripButton1_Click(object sender, EventArgs e) + { + List rs = treeView1.GetBookmarkList(); + //MessageBox.Show(treeView1.GetNodePath(treeView1.SelectedNode)); + MessageBox.Show("!"); + } } } \ No newline at end of file diff --git a/MainForm.resx b/MainForm.resx index c2e0424..df4dc2d 100644 --- a/MainForm.resx +++ b/MainForm.resx @@ -156,15 +156,30 @@ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHaSURBVDhPjZO9S1tRGMZtnfo/VHASCkWkCRlFKB0KdVB0 - KIWCDgpuanHoWOlklxJCcBG3QoeCe5dEpEXRBBW/oCIOSfNlbnI/zjn3Xn36vofe670mpb7wI8N9n1+e - c3LTE5nHRIJI/Yd+4iHRMQnHcYxcLnft+z66IaVEOp3+TLtdJSkOW5YF27ZDWq0Wms0mKpWKlpTLZWQy - mQ7JAyLFC0IIKKX0J2OaJgzDQLVa1QJqCf6SbDYbSPRogdcqQl7taEEg4UC73UatVosdh+GMTtNogThd - gDiaDRc8z9PnDo5Sr9d1k1KpdCu4uZx/ZB68Gdn79nxNHs9A7r+GPF+B29iC71oxCTfh+2g0GrcCeTK9 - qk7mIM8W4V6sQP36ALE3BmvzGcTBUqwJH4fvhEWhAJjsdfbHN+TZOxJ8IsEynOIEnMIUfE/pRcZ1XX0v - LGFCAc/V7uigKL6COl+GOn0PK/cUrnEYhhluEVwut4kJrO0XL0VhFPaPIZibT6h+Aur3dx0K4AYMhzsF - P4ffFr4MrPuyDo8Qxx8hL792hKPEBDThi3SXaIso/IwzOk2jBfl8/uau4F/Q7jVndPrvJOnnsflBt0AU - 3qHX2aQM/3vD6SOSBFvvA4V7+v4ABhqcM6lhVZQAAAAASUVORK5CYII= + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHZSURBVDhPjZM7SxxRGIY1qfwPClaCICFkZUsRxELQQkmK + EAjEQsHOCxYpFSttZFmWNJJOsAik2yKwBAkJiu6i4g0iYrGbvbmzO5dzzszE1+87OOOOay4fPEyx5332 + PWfmtDVNJxEj4v+gm3hCtEzMcRwjk8n89n0fjyGlRCKRWKe1j0riHLYsC7Zth9TrddRqNRSLRS0pFApI + JpMtknYizguEEFBK6SdjmiYMw0CpVNICagn+k1QqFUj0aIFXz0Fe72pBIOFAo9FAuVyObIfhjE7TaIE4 + m4M4ng4XeJ6n9x1spVKp6Cb5fP5ecHM122Eevhnc/zS0IU+mIA9eQ16swq1+g+9aEQk34fOoVqv3Ank6 + +UGdzkCez8O9XIX6uQSxPw5r+wXE4WKkCW+Hz4RFoQB49dQ5mPgszxdIsEaCZTi5l3Cy7+B7Si9kXNfV + 58ISJhTwXO+NPRO5UaiLZaiz97C+9sE1jsIwwy2Cw+U2EYG1MzwismOwvz+Hud1L9WNQv77oUAA3YDjc + Kvgx8Da72fPRlxV4hDhZgbzaagk3ExHQhB/SQ5pbNMO/cUanabQgnU7fPBT8Cf7sOaPTd9NPr8f+22UK + uLszJmX49obTRfQTbP0fKNzWdQu5+pvuDaXQ3AAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG + YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9 + 0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw + bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc + VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9 + c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32 + Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo + mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+ + kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D + TgDQASA1MVpwzwAAAABJRU5ErkJggg== diff --git a/NewSessionForm.Designer.cs b/NewSessionForm.Designer.cs index 367e2f3..031ac36 100644 --- a/NewSessionForm.Designer.cs +++ b/NewSessionForm.Designer.cs @@ -43,7 +43,7 @@ namespace bzit.bomg 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(276, 33); + this.textBox2.Size = new System.Drawing.Size(276, 32); this.textBox2.TabIndex = 68; // // label2 @@ -98,6 +98,7 @@ namespace bzit.bomg this.ShowIcon = false; this.ShowInTaskbar = false; this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.Text = "New Session"; this.ResumeLayout(false); this.PerformLayout(); diff --git a/SessionFileFormat.cs b/SessionFileFormat.cs index 24b57d3..e61e4e0 100644 --- a/SessionFileFormat.cs +++ b/SessionFileFormat.cs @@ -60,34 +60,34 @@ namespace bzit.bomg protected override void saveToXmlTextWriter(ref XmlTextWriter writer) { - if (parentForm.treeView1.Nodes.Count <= 0) - { - return; - } + //if (parentForm.treeView1.Nodes.Count <= 0) + //{ + // return; + //} - writer.Formatting = Formatting.Indented; - writer.WriteStartDocument(); - writer.WriteStartElement(CONST_PRODUCT); - writer.WriteStartElement("b"); - writer.WriteStartElement("g"); - writer.WriteAttributeString("name", parentForm.treeView1.Nodes[0].Text); + //writer.Formatting = Formatting.Indented; + //writer.WriteStartDocument(); + //writer.WriteStartElement(CONST_PRODUCT); + //writer.WriteStartElement("b"); + //writer.WriteStartElement("g"); + //writer.WriteAttributeString("name", parentForm.treeView1.Nodes[0].Text); - foreach (TreeNode tn in parentForm.treeView1.NodeList) - { - BookmarkItem bi = (BookmarkItem)tn.Tag; + //foreach (TreeNode tn in parentForm.treeView1.NodeList) + //{ + // BookmarkItem bi = (BookmarkItem)tn.Tag; - writer.WriteStartElement("m"); - writer.WriteElementString("name", parentForm.treeView1.GetNodeFullPath(tn)); - writer.WriteElementString("address", bi.SiteAddress); - writer.WriteElementString("description", bi.Description); - writer.WriteElementString("created", bi.Created.ToString()); - writer.WriteEndElement(); - } + // writer.WriteStartElement("m"); + // writer.WriteElementString("name", parentForm.treeView1.GetNodeFullPath(tn)); + // writer.WriteElementString("address", bi.SiteAddress); + // writer.WriteElementString("description", bi.Description); + // writer.WriteElementString("created", bi.Created.ToString()); + // writer.WriteEndElement(); + //} - writer.WriteEndElement(); - writer.WriteEndElement(); - writer.WriteEndElement(); - writer.WriteEndDocument(); + //writer.WriteEndElement(); + //writer.WriteEndElement(); + //writer.WriteEndElement(); + //writer.WriteEndDocument(); } } } \ No newline at end of file diff --git a/UpdateIconForm.cs b/UpdateIconForm.cs index 105375f..67975e5 100644 --- a/UpdateIconForm.cs +++ b/UpdateIconForm.cs @@ -59,57 +59,57 @@ namespace bzit.bomg private void mainThread_DoWork(object sender, DoWorkEventArgs e) { - TreeNode[] nodeList = parentForm.treeView1.NodeList; - for (int i=0; i< nodeList.Length; i++) - { - if (progressBar1.InvokeRequired) - { - progressBar1.Invoke(new Action(() => progressBar1.Value = (i + 1) )); - } - else - { - progressBar1.Value = (i + 1); - } + //TreeNode[] nodeList = parentForm.treeView1.NodeList; + //for (int i=0; i< nodeList.Length; i++) + //{ + // if (progressBar1.InvokeRequired) + // { + // progressBar1.Invoke(new Action(() => progressBar1.Value = (i + 1) )); + // } + // else + // { + // progressBar1.Value = (i + 1); + // } - if (label2.InvokeRequired) - { - label2.Invoke(new Action(() => label2.Text = string.Concat((i + 1).ToString(), "/", progressBar1.Maximum.ToString()))); - } - else - { - label2.Text = string.Concat((i + 1).ToString(), "/", progressBar1.Maximum.ToString()); - } + // if (label2.InvokeRequired) + // { + // label2.Invoke(new Action(() => label2.Text = string.Concat((i + 1).ToString(), "/", progressBar1.Maximum.ToString()))); + // } + // else + // { + // label2.Text = string.Concat((i + 1).ToString(), "/", progressBar1.Maximum.ToString()); + // } - TreeNode node = nodeList[i]; - if (node == null) - { - continue; - } + // TreeNode node = nodeList[i]; + // if (node == null) + // { + // continue; + // } - if (node.Tag == null) - { - continue; - } + // if (node.Tag == null) + // { + // continue; + // } - if (!(node.Tag is BookmarkItem)) - { - continue; - } + // if (!(node.Tag is BookmarkItem)) + // { + // continue; + // } - BookmarkItem bookmarkItem = (BookmarkItem)node.Tag; - if (bookmarkItem == null) - { - continue; - } + // BookmarkItem bookmarkItem = (BookmarkItem)node.Tag; + // if (bookmarkItem == null) + // { + // continue; + // } - bookmarkItem.GetFaviconAddress(); - if (bookmarkItem.IconData == null) - { - continue; - } + // bookmarkItem.GetFaviconAddress(); + // if (bookmarkItem.IconData == null) + // { + // continue; + // } //##parentForm.treeView1.AddIcon(bookmarkItem); - } + //} } private void mainThread_OnCompleted(object sender, RunWorkerCompletedEventArgs e) diff --git a/Windows/Forms/BookmarkTreeView.cs b/Windows/Forms/BookmarkTreeView.cs index 8099ca9..62feb54 100644 --- a/Windows/Forms/BookmarkTreeView.cs +++ b/Windows/Forms/BookmarkTreeView.cs @@ -1,9 +1,12 @@ using bzit.bomg; +using bzit.bomg.Data; using bzit.bomg.Models; using System; +using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.IO; +using System.Text; using System.Windows.Forms; using Resources = bzit.bomg.Properties.Resources; @@ -37,12 +40,12 @@ namespace RyzStudio.Windows.Forms //public EventHandler OnChanged = null; //public NodeCountUpdated OnNodeCountUpdate = null; - protected const char pathSeparator = '|'; + //protected const char pathSeparator = '|'; protected TreeNode draggingNode = null; protected bool allowBeginEdit = false; - //protected ulong nodeCount = 0; protected bool hasChanged = false; + //protected ulong nodeCount = 0; public BookmarkTreeView() : base() { @@ -62,30 +65,32 @@ namespace RyzStudio.Windows.Forms this.ImageList.Images.Add(Resources.folder); this.ImageList.Images.Add(Resources.folder_explore); this.ImageList.Images.Add(Resources.page_white_world_bw); + + this.PathSeparator = "\n"; } [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public new ImageList ImageList { get => base.ImageList; set => base.ImageList = value; } - [Browsable(false)] - public TreeNode[] NodeList - { - get - { - TreeNode[] rv = new TreeNode[0]; - if (this.Nodes.Count <= 0) - { - return rv; - } + //[Browsable(false)] + //public TreeNode[] NodeList + //{ + // get + // { + // TreeNode[] rv = new TreeNode[0]; + // if (this.Nodes.Count <= 0) + // { + // return rv; + // } - foreach (TreeNode tn in this.Nodes) - { - traverseNodeList(ref rv, tn); - } + // foreach (TreeNode tn in this.Nodes) + // { + // traverseNodeList(ref rv, tn); + // } - return rv; - } - } + // return rv; + // } + //} //[Browsable(false)] //public ulong NodeCount @@ -172,6 +177,27 @@ namespace RyzStudio.Windows.Forms return true; } + public TreeNode AddFolder(TreeNode node) + { + //return this.AddFolder("New Folder " + (new Random()).Next(10001, 99999).ToString()); + return this.AddFolder(node, "New Folder (" + DateTime.Now.ToString("yyyy-MM-dd-HHmmss") + ")"); + } + + public TreeNode AddFolder(TreeNode node, string name) + { + if (node == null) + { + return null; + } + + if (node.Tag != null) + { + return null; + } + + return node.Nodes.Add(encodePath(name), name, (int)IconSet.Folder1, (int)IconSet.Folder2); + } + public void AddItem(BookmarkItemViewModel viewModel) { int iconIndex = addIcon(viewModel); @@ -233,31 +259,78 @@ namespace RyzStudio.Windows.Forms } } - public string GetNodeFullPath(TreeNode node) + public string GetNodePath(TreeNode node) { - string rv = PathEncode(node.Text); - - TreeNode tn = node; - while (true) + string[] folderList = node.FullPath.Split('\n'); + if (folderList.Length < 2) { - tn = tn.Parent; - - if (tn == null) - { - break; - } - - if (tn.Level == 0) - { - break; - } - - rv = PathEncode(tn.Text) + pathSeparator.ToString() + rv; + return null; } - return rv; + if (folderList.Length < 2) + { + return "/"; + } + + StringBuilder sb = new StringBuilder(); + + for (int i=1; i<(folderList.Length - 1); i++) + { + sb.Append("\\"); + sb.Append(encodePath(folderList[i] ?? string.Empty)); + } + + sb.Append("\\"); + + return sb.ToString(); } + public BookmarkItemViewModel GetViewModel(TreeNode node) => (BookmarkItemViewModel)node.Tag; + + public List GetBookmarkList() + { + List rs = new List(); + + if (this.Nodes.Count <= 0) + { + return rs; + } + + traverseBookmarkList(rs, this.Nodes[0]); + + return rs; + } + + + + + + + //public string GetNodeFullPath(TreeNode node) + //{ + // string rv = PathEncode(node.Text); + + // TreeNode tn = node; + // while (true) + // { + // tn = tn.Parent; + + // if (tn == null) + // { + // break; + // } + + // if (tn.Level == 0) + // { + // break; + // } + + // //rv = PathEncode(tn.Text) + pathSeparator.ToString() + rv; + // } + + // return rv; + //} + public bool FindTextNode(TreeNode node, string term) { if (node == null) @@ -470,16 +543,22 @@ namespace RyzStudio.Windows.Forms return; } + NodeType nodeType = this.SNode.GetNodeType(); + switch (e.KeyCode) { case Keys.Insert: if (e.Modifiers == Keys.Shift) { - this.SelectedNode = this.SNode.AddFolder(); - } - else - { - //##AddBookmarkPage(); + if ((nodeType == NodeType.Root) || (nodeType == NodeType.Folder)) + { + this.SelectedNode = this.SNode.AddFolder(); + } + else if (nodeType == NodeType.Page) + { + this.SelectedNode = tn.Parent; + this.SelectedNode = this.SNode.AddFolder(); + } } break; @@ -494,6 +573,39 @@ namespace RyzStudio.Windows.Forms allowBeginEdit = true; this.SNode.Edit(); + 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.SNode.GetViewModel(); + if (viewModel != null) + { + try + { + Clipboard.SetText(viewModel.SiteAddress ?? string.Empty); + } + catch + { + } + } + + break; + default: + break; + } + break; case Keys.Up: if (e.Modifiers == Keys.Control) @@ -617,6 +729,32 @@ namespace RyzStudio.Windows.Forms this.SelectedNode = this.SelectedNode.Nodes[n]; } + protected string decodePath(string value) => System.Web.HttpUtility.UrlDecode(value); + + protected string encodePath(string value) => System.Web.HttpUtility.UrlEncode(value); + + protected void traverseBookmarkList(List rs, TreeNode node) + { + foreach (TreeNode tn in node.Nodes) + { + NodeType nodeType = this.GetNodeType(tn); + if (nodeType == NodeType.Folder) + { + traverseBookmarkList(rs, tn); + } + else if (nodeType == NodeType.Page) + { + BookmarkItemViewModel nodeTag = this.GetViewModel(tn); + nodeTag.TreeviewPath = this.GetNodePath(tn); + + if (nodeTag != null) + { + rs.Add(nodeTag); + } + } + } + } + protected void updateItem_OnSelectedNode(BookmarkItemViewModel viewModel) { if (this.SelectedNode == null) @@ -654,36 +792,36 @@ namespace RyzStudio.Windows.Forms return false; } - protected void traverseNodeList(ref TreeNode[] results, TreeNode node) - { - foreach (TreeNode tn in node.Nodes) - { - if (tn.Tag == null) - { - traverseNodeList(ref results, tn); - } - else - { - Array.Resize(ref results, (results.Length + 1)); - results[(results.Length - 1)] = tn; - } - } - } + //protected void traverseNodeList(ref TreeNode[] results, TreeNode node) + //{ + // foreach (TreeNode tn in node.Nodes) + // { + // if (tn.Tag == null) + // { + // traverseNodeList(ref results, tn); + // } + // else + // { + // Array.Resize(ref results, (results.Length + 1)); + // results[(results.Length - 1)] = tn; + // } + // } + //} - protected void traverseNodeCount(ref ulong results, TreeNode node) - { - foreach (TreeNode tn in node.Nodes) - { - if (tn.Tag == null) - { - traverseNodeCount(ref results, tn); - } - else - { - results++; - } - } - } + //protected void traverseNodeCount(ref ulong results, TreeNode node) + //{ + // foreach (TreeNode tn in node.Nodes) + // { + // if (tn.Tag == null) + // { + // traverseNodeCount(ref results, tn); + // } + // else + // { + // results++; + // } + // } + //} @@ -698,8 +836,7 @@ namespace RyzStudio.Windows.Forms ////protected string PathEncode(string text) { return RyzStudio.String.EncodeTo64(text); } //protected string PathDecode(string text) { return RyzStudio.String.DecodeFrom64(text); } - protected string PathEncode(string text) { return System.Web.HttpUtility.UrlEncode(text); } - protected string PathDecode(string text) { return System.Web.HttpUtility.UrlDecode(text); } + diff --git a/Windows/Forms/BookmarkTreeViewSNode.cs b/Windows/Forms/BookmarkTreeViewSNode.cs index 9be4ca0..7d7e6a3 100644 --- a/Windows/Forms/BookmarkTreeViewSNode.cs +++ b/Windows/Forms/BookmarkTreeViewSNode.cs @@ -19,28 +19,9 @@ namespace RyzStudio.Windows.Forms set => this.Treeview.SelectedNode = value; } - protected string encodeName(string name) => Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(name)); + public TreeNode AddFolder() => this.Treeview.AddFolder(this.SelectedNode); - public TreeNode AddFolder() - { - //return this.AddFolder("New Folder " + (new Random()).Next(10001, 99999).ToString()); - return this.AddFolder("New Folder (" + DateTime.Now.ToString("yyyy-MM-dd-HHmmss") + ")"); - } - - public TreeNode AddFolder(string name) - { - if (this.SelectedNode == null) - { - return null; - } - - if (this.SelectedNode.Tag != null) - { - return null; - } - - return this.SelectedNode.Nodes.Add(encodeName(name), name, (int)BookmarkTreeView.IconSet.Folder1, (int)BookmarkTreeView.IconSet.Folder2); - } + public TreeNode AddFolder(string name) => this.Treeview.AddFolder(this.SelectedNode, name); public TreeNode AddItem(string name, object tag) { @@ -124,6 +105,8 @@ namespace RyzStudio.Windows.Forms public BookmarkTreeView.NodeType GetNodeType() => this.Treeview.GetNodeType(this.SelectedNode); + public BookmarkItemViewModel GetViewModel() => this.Treeview.GetViewModel(this.SelectedNode); + public void MoveDown() { if (this.SelectedNode == null) diff --git a/bomg.csproj b/bomg.csproj index f7e7271..9a0c05f 100644 --- a/bomg.csproj +++ b/bomg.csproj @@ -159,7 +159,7 @@ UpdateIconForm.cs - + Form @@ -311,9 +311,7 @@ true - - - + From 988857d91c963070295f99293862c080909f82c1 Mon Sep 17 00:00:00 2001 From: Ray Date: Sat, 20 Apr 2019 18:25:14 +0100 Subject: [PATCH 05/34] WIP --- MainForm.cs | 467 ++++++++++++++++-------------- Windows/Forms/BookmarkTreeView.cs | 10 +- bomg.csproj | 3 + packages.config | 1 + 4 files changed, 260 insertions(+), 221 deletions(-) diff --git a/MainForm.cs b/MainForm.cs index d935187..f4c2433 100644 --- a/MainForm.cs +++ b/MainForm.cs @@ -1,4 +1,6 @@ using bzit.bomg.Models; +using ICSharpCode.SharpZipLib.Zip; +using Newtonsoft.Json; using System; using System.Collections.Generic; using System.ComponentModel; @@ -18,9 +20,10 @@ namespace bzit.bomg } protected AppMode appMode = AppMode.Clear; - protected SessionFileFormat sessionFileFormat = null; protected string sessionFilename = null; + //protected SessionFileFormat sessionFileFormat = null; + public MainForm() { InitializeComponent(); @@ -41,12 +44,6 @@ namespace bzit.bomg this.Close(); } - - - - - //this.IconDatabase = new IconDatabase(); - // toolbar viewHelpHelpMenuItem.Enabled = File.Exists(Path.ChangeExtension(Application.ExecutablePath, ".chm")); @@ -63,8 +60,9 @@ namespace bzit.bomg // this.Close(); //} - sessionFileFormat = new SessionFileFormat(this); + //sessionFileFormat = new SessionFileFormat(this); this.ApplicationMode = AppMode.Clear; + sessionFilename = null; //treeView1.OnNodeCountUpdate = delegate (ulong v) { // statusBarPanel2.Text = v.ToString(); @@ -90,54 +88,53 @@ namespace bzit.bomg this.Location = Screen.PrimaryScreen.WorkingArea.Location; // command line - string[] szr = Environment.GetCommandLineArgs(); - int i = 0; - while (true) - { - if (i > (szr.Length - 1)) - { - break; - } + //string[] szr = Environment.GetCommandLineArgs(); + //int i = 0; + //while (true) + //{ + // if (i > (szr.Length - 1)) + // { + // break; + // } - switch (szr[i].Trim().ToLower()) - { - case "-o": - case "-open": - if ((i + 1) > (szr.Length - 1)) - { - break; - } + // switch (szr[i].Trim().ToLower()) + // { + // case "-o": + // case "-open": + // if ((i + 1) > (szr.Length - 1)) + // { + // break; + // } - sessionFilename = szr[(i + 1)]; + // sessionFilename = szr[(i + 1)]; - if (string.IsNullOrEmpty(sessionFilename)) - { - sessionFilename = null; - break; - } + // if (string.IsNullOrEmpty(sessionFilename)) + // { + // sessionFilename = null; + // break; + // } - if (!File.Exists(sessionFilename)) - { - sessionFilename = null; - break; - } + // if (!File.Exists(sessionFilename)) + // { + // sessionFilename = null; + // break; + // } - OpenBookmarkFile(sessionFilename); + // OpenBookmarkFile(sessionFilename); - i++; - break; - } + // i++; + // break; + // } - i++; - } + // i++; + //} } protected override void OnFormClosing(FormClosingEventArgs e) { - //this.IconDatabase?.Close(); - if (this.ApplicationMode == AppMode.Clear) { + this.ApplicationMode = AppMode.Clear; Application.Exit(); return; } @@ -149,68 +146,68 @@ namespace bzit.bomg return; } - if (this.ApplicationMode == AppMode.Open) - { - if (string.IsNullOrEmpty(sessionFilename)) - { - this.ApplicationMode = AppMode.Clear; - Application.Exit(); - return; - } + //if (this.ApplicationMode == AppMode.Open) + //{ + // if (string.IsNullOrEmpty(sessionFilename)) + // { + // this.ApplicationMode = AppMode.Clear; + // Application.Exit(); + // return; + // } - if (MessageBox.Show("Save changes to open bookmarks.", "Save?", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes) - { - this.ApplicationMode = AppMode.Clear; - Application.Exit(); - return; - } + // if (MessageBox.Show("Save changes to open bookmarks.", "Save?", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes) + // { + // this.ApplicationMode = AppMode.Clear; + // Application.Exit(); + // return; + // } - while (true) - { - bool rv = sessionFileFormat.saveToRyz(sessionFilename); - if (!rv) - { - switch (MessageBox.Show("There was a problem saving bookmarks. Retry?", "Retry?", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question)) - { - case DialogResult.Yes: - break; - case DialogResult.No: - this.ApplicationMode = AppMode.Clear; - Application.Exit(); - break; - case DialogResult.Cancel: - e.Cancel = true; - break; - default: break; - } - } - else - { - this.ApplicationMode = AppMode.Clear; - Application.Exit(); - break; - } - } - } - else if (this.ApplicationMode == AppMode.New) - { - if (MessageBox.Show("Save changes to open bookmarks.", "Save?", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) - { - bool rt = SaveBookmarkFile(); - if (rt) - { - this.ApplicationMode = AppMode.Clear; - Application.Exit(); - return; - } - } - else - { - this.ApplicationMode = AppMode.Clear; - Application.Exit(); - return; - } - } + // while (true) + // { + // bool rv = sessionFileFormat.saveToRyz(sessionFilename); + // if (!rv) + // { + // switch (MessageBox.Show("There was a problem saving bookmarks. Retry?", "Retry?", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question)) + // { + // case DialogResult.Yes: + // break; + // case DialogResult.No: + // this.ApplicationMode = AppMode.Clear; + // Application.Exit(); + // break; + // case DialogResult.Cancel: + // e.Cancel = true; + // break; + // default: break; + // } + // } + // else + // { + // this.ApplicationMode = AppMode.Clear; + // Application.Exit(); + // break; + // } + // } + //} + //else if (this.ApplicationMode == AppMode.New) + //{ + // if (MessageBox.Show("Save changes to open bookmarks.", "Save?", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) + // { + // bool rt = SaveBookmarkFile(); + // if (rt) + // { + // this.ApplicationMode = AppMode.Clear; + // Application.Exit(); + // return; + // } + // } + // else + // { + // this.ApplicationMode = AppMode.Clear; + // Application.Exit(); + // return; + // } + //} } //#region public properties @@ -298,53 +295,53 @@ namespace bzit.bomg */ private void closeMenuItem_Click(object sender, EventArgs e) { - if (ApplicationMode == AppMode.Clear) - { - return; - } + //if (ApplicationMode == AppMode.Clear) + //{ + // return; + //} - if (!treeView1.HasChanged) - { - ApplicationMode = AppMode.Clear; - return; - } + //if (!treeView1.HasChanged) + //{ + // ApplicationMode = AppMode.Clear; + // return; + //} - if (ApplicationMode == AppMode.Open) - { - if (string.IsNullOrEmpty(sessionFilename)) - { - ApplicationMode = AppMode.Clear; - return; - } + //if (ApplicationMode == AppMode.Open) + //{ + // if (string.IsNullOrEmpty(sessionFilename)) + // { + // ApplicationMode = AppMode.Clear; + // return; + // } - if (MessageBox.Show("Save changes to open bookmarks.", "Save?", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes) - { - ApplicationMode = AppMode.Clear; - return; - } + // if (MessageBox.Show("Save changes to open bookmarks.", "Save?", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes) + // { + // ApplicationMode = AppMode.Clear; + // return; + // } - bool rv = sessionFileFormat.saveToRyz(sessionFilename); - if (!rv) - { - if (MessageBox.Show("There was a problem saving bookmarks. Bookmarks are not saved", "Not Saved", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.Cancel) return; - } + // bool rv = sessionFileFormat.saveToRyz(sessionFilename); + // if (!rv) + // { + // if (MessageBox.Show("There was a problem saving bookmarks. Bookmarks are not saved", "Not Saved", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.Cancel) return; + // } - ApplicationMode = AppMode.Clear; - } - else if (ApplicationMode == AppMode.New) - { - if (MessageBox.Show("Save changes to open bookmarks.", "Save?", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes) - { - ApplicationMode = AppMode.Clear; - return; - } + // ApplicationMode = AppMode.Clear; + //} + //else if (ApplicationMode == AppMode.New) + //{ + // if (MessageBox.Show("Save changes to open bookmarks.", "Save?", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes) + // { + // ApplicationMode = AppMode.Clear; + // return; + // } - bool rt = SaveBookmarkFile(); - if (rt) - { - ApplicationMode = AppMode.Clear; - } - } + // bool rt = SaveBookmarkFile(); + // if (rt) + // { + // ApplicationMode = AppMode.Clear; + // } + //} } /** @@ -352,16 +349,16 @@ namespace bzit.bomg */ private void importSnapshotToolStripMenuItem_Click(object sender, EventArgs e) { - if (string.IsNullOrEmpty(sessionFilename)) - { - return; - } + //if (string.IsNullOrEmpty(sessionFilename)) + //{ + // return; + //} - bool rv = sessionFileFormat.saveToRyz(sessionFilename); - if (rv) - { - treeView1.HasChanged = false; - } + //bool rv = sessionFileFormat.saveToRyz(sessionFilename); + //if (rv) + //{ + // treeView1.HasChanged = false; + //} } /** @@ -369,11 +366,11 @@ namespace bzit.bomg */ private void exportSnapshotToolStripMenuItem_Click(object sender, EventArgs e) { - if (SaveBookmarkFile()) - { - ApplicationMode = AppMode.Open; - treeView1.HasChanged = false; - } + //if (SaveBookmarkFile()) + //{ + // ApplicationMode = AppMode.Open; + // treeView1.HasChanged = false; + //} } /** @@ -485,84 +482,121 @@ namespace bzit.bomg /** * ? -> Always-On-Top */ - private void alwaysOnTopToolStripMenuItem_Click(object sender, EventArgs e) - { - this.TopMost = !this.TopMost; - } + private void alwaysOnTopToolStripMenuItem_Click(object sender, EventArgs e) => this.TopMost = !this.TopMost; #endregion protected void OpenBookmarkFile(string filename) { - treeView1.HasChanged = false; - if (RyzStudio.IO.SharpZipLib.IsZipEncrypted(filename)) - { - PasswordForm oPassword = new PasswordForm(this); - sessionFileFormat.passkey = oPassword.ShowDialog(); + //treeView1.HasChanged = false; + //if (RyzStudio.IO.SharpZipLib.IsZipEncrypted(filename)) + //{ + // PasswordForm oPassword = new PasswordForm(this); + // sessionFileFormat.passkey = oPassword.ShowDialog(); - if (sessionFileFormat.passkey.Equals("")) - { - return; - } - } - else - { - sessionFileFormat.passkey = ""; - } + // if (sessionFileFormat.passkey.Equals("")) + // { + // return; + // } + //} + //else + //{ + // sessionFileFormat.passkey = ""; + //} - bool rv = sessionFileFormat.loadFromRyz(filename); - if (rv) - { - this.Text = Path.GetFileNameWithoutExtension(filename) + " - " + Properties.Resources.app_name; - this.ApplicationMode = AppMode.Open; + //bool rv = sessionFileFormat.loadFromRyz(filename); + //if (rv) + //{ + // this.Text = Path.GetFileNameWithoutExtension(filename) + " - " + Properties.Resources.app_name; + // this.ApplicationMode = AppMode.Open; - treeView1.HasChanged = false; - } + // treeView1.HasChanged = false; + //} } protected bool SaveBookmarkFile() { bool rv = false; - if (saveFileDialog.ShowDialog() == DialogResult.OK) - { - switch (saveFileDialog.FilterIndex) - { - case 1: - sessionFileFormat.passkey = ""; + //if (saveFileDialog.ShowDialog() == DialogResult.OK) + //{ + // switch (saveFileDialog.FilterIndex) + // { + // case 1: + // sessionFileFormat.passkey = ""; - rv = sessionFileFormat.saveToRyz(saveFileDialog.FileName); - break; - case 2: - PasswordForm oPassword = new PasswordForm(this); - sessionFileFormat.passkey = oPassword.ShowDialog(); + // rv = sessionFileFormat.saveToRyz(saveFileDialog.FileName); + // break; + // case 2: + // PasswordForm oPassword = new PasswordForm(this); + // sessionFileFormat.passkey = oPassword.ShowDialog(); - rv = sessionFileFormat.saveToRyz(saveFileDialog.FileName); - if (rv) - { - treeView1.HasChanged = false; - } + // rv = sessionFileFormat.saveToRyz(saveFileDialog.FileName); + // if (rv) + // { + // treeView1.HasChanged = false; + // } - break; - default: break; - } + // break; + // default: break; + // } - } + //} - if (rv) - { - ApplicationMode = AppMode.Open; - sessionFilename = saveFileDialog.FileName; - this.Text = Path.GetFileNameWithoutExtension(saveFileDialog.FileName) + " - " + Properties.Resources.app_name; - } + //if (rv) + //{ + // ApplicationMode = AppMode.Open; + // sessionFilename = saveFileDialog.FileName; + // this.Text = Path.GetFileNameWithoutExtension(saveFileDialog.FileName) + " - " + Properties.Resources.app_name; + //} return rv; } + protected void saveBookmarkFile(string filename) + { + List rs = treeView1.GetBookmarkList(); + + int size = 2048; + byte[] buffer = new byte[size]; + int bufferSize = 0; + + ZipOutputStream zipStream = new ZipOutputStream(File.Create(filename)); + zipStream.SetLevel(9); + + // make readable + MemoryStream ms = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(rs))); + ms.Position = 0; + + // write new document xml + zipStream.PutNextEntry(new ZipEntry("bookmarks.json")); + + 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; + } - private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) + + protected void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) { if (e.Button != MouseButtons.Right) { @@ -585,9 +619,9 @@ namespace bzit.bomg } } - private void treeView1_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e) => openBookmark(e.Node); + protected void treeView1_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e) => openBookmark(e.Node); - private void treeView1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) + protected void treeView1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) { TreeNode tn = treeView1.SelectedNode; if (tn == null) @@ -775,15 +809,16 @@ namespace bzit.bomg private void moveUpContextMenu2_Click(object sender, EventArgs e) => treeView1.SNode.MoveUp(); private void moveDownContextMenu2_Click(object sender, EventArgs e) => treeView1.SNode.MoveDown(); - #endregion private void toolStripButton1_Click(object sender, EventArgs e) { List rs = treeView1.GetBookmarkList(); - //MessageBox.Show(treeView1.GetNodePath(treeView1.SelectedNode)); - MessageBox.Show("!"); + string filename = @"N:\test.jsnx"; + + saveBookmarkFile(filename); + } } -} \ No newline at end of file +} diff --git a/Windows/Forms/BookmarkTreeView.cs b/Windows/Forms/BookmarkTreeView.cs index 62feb54..062d2b0 100644 --- a/Windows/Forms/BookmarkTreeView.cs +++ b/Windows/Forms/BookmarkTreeView.cs @@ -267,14 +267,14 @@ namespace RyzStudio.Windows.Forms return null; } - if (folderList.Length < 2) - { - return "/"; - } + //if (folderList.Length < 2) + //{ + // return "/"; + //} StringBuilder sb = new StringBuilder(); - for (int i=1; i<(folderList.Length - 1); i++) + for (int i=0; i<(folderList.Length - 1); i++) { sb.Append("\\"); sb.Append(encodePath(folderList[i] ?? string.Empty)); diff --git a/bomg.csproj b/bomg.csproj index 9a0c05f..9ae9327 100644 --- a/bomg.csproj +++ b/bomg.csproj @@ -84,6 +84,9 @@ packages\SharpZipLib.1.1.0\lib\net45\ICSharpCode.SharpZipLib.dll + + packages\Newtonsoft.Json.12.0.1\lib\net45\Newtonsoft.Json.dll + diff --git a/packages.config b/packages.config index 77ea619..d782911 100644 --- a/packages.config +++ b/packages.config @@ -1,6 +1,7 @@  + \ No newline at end of file From ad535144bd615622bdff6872833d4cce4c368802 Mon Sep 17 00:00:00 2001 From: Ray Date: Sun, 21 Apr 2019 18:53:56 +0100 Subject: [PATCH 06/34] WIP --- BookmarkEditForm.Designer.cs | 4 + MainForm.Designer.cs | 26 +- MainForm.cs | 309 ++++++++++++++++-- MainForm.resx | 4 +- NewSessionForm.cs | 51 --- PasswordForm.Designer.cs | 91 +++--- PasswordForm.cs | 8 - PasswordForm.resx | 25 -- RyzStudio/IO/SharpZipLib.cs | 116 +++++-- RyzStudio/Windows/ThemedForms/Button.cs | 2 + RyzStudio/Windows/ThemedForms/TextBox.cs | 27 ++ .../ThemedForms/TextBoxForm.Designer.cs | 85 ++--- RyzStudio/Windows/ThemedForms/TextBoxForm.cs | 67 ++++ .../Windows/ThemedForms/TextBoxForm.resx | 0 Windows/Forms/BookmarkTreeView.cs | 135 +++----- bomg.csproj | 11 +- 16 files changed, 622 insertions(+), 339 deletions(-) delete mode 100644 NewSessionForm.cs rename NewSessionForm.Designer.cs => RyzStudio/Windows/ThemedForms/TextBoxForm.Designer.cs (76%) create mode 100644 RyzStudio/Windows/ThemedForms/TextBoxForm.cs rename NewSessionForm.resx => RyzStudio/Windows/ThemedForms/TextBoxForm.resx (100%) diff --git a/BookmarkEditForm.Designer.cs b/BookmarkEditForm.Designer.cs index c1bd6f0..049eff0 100644 --- a/BookmarkEditForm.Designer.cs +++ b/BookmarkEditForm.Designer.cs @@ -137,7 +137,9 @@ namespace bzit.bomg this.textBox2.Name = "textBox2"; this.textBox2.Padding = new System.Windows.Forms.Padding(10, 10, 9, 9); this.textBox2.Size = new System.Drawing.Size(259, 32); + this.textBox2.SubmitButton = this.button1; this.textBox2.TabIndex = 0; + this.textBox2.UseSystemPasswordChar = false; // // textBox1 // @@ -149,7 +151,9 @@ namespace bzit.bomg this.textBox1.Name = "textBox1"; this.textBox1.Padding = new System.Windows.Forms.Padding(10, 10, 9, 9); this.textBox1.Size = new System.Drawing.Size(259, 32); + this.textBox1.SubmitButton = this.button2; this.textBox1.TabIndex = 2; + this.textBox1.UseSystemPasswordChar = false; // // horizontalSeparator1 // diff --git a/MainForm.Designer.cs b/MainForm.Designer.cs index 59d99c7..a94f3fb 100644 --- a/MainForm.Designer.cs +++ b/MainForm.Designer.cs @@ -91,6 +91,7 @@ namespace bzit.bomg this.openMenuBarItem = new System.Windows.Forms.ToolStripButton(); this.saveMenuBarItem = new System.Windows.Forms.ToolStripButton(); this.toolStripSeparator9 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripButton1 = new System.Windows.Forms.ToolStripButton(); this.rootTreeNodeMenu = new System.Windows.Forms.ContextMenuStrip(this.components); this.toolStripMenuItem17 = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripMenuItem18 = new System.Windows.Forms.ToolStripMenuItem(); @@ -98,7 +99,6 @@ namespace bzit.bomg this.toolStripMenuItem20 = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator13 = new System.Windows.Forms.ToolStripSeparator(); this.toolStripMenuItem22 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripButton1 = new System.Windows.Forms.ToolStripButton(); this.treeView1 = new RyzStudio.Windows.Forms.BookmarkTreeView(); this.pageTreeNodeMenu.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.statusBarPanel1)).BeginInit(); @@ -451,8 +451,8 @@ namespace bzit.bomg // // openFileDialog // - this.openFileDialog.DefaultExt = "ryz"; - this.openFileDialog.Filter = "Bookmarks files|*.ryz"; + this.openFileDialog.DefaultExt = "jsnx"; + this.openFileDialog.Filter = "Bookmarks files (*.jsnx)|*.jsnx|Bookmarks files (*.ryz)|*.ryz"; this.openFileDialog.Title = "Open bookmarks file"; // // folderTreeNodeMenu @@ -604,6 +604,16 @@ namespace bzit.bomg this.toolStripSeparator9.Name = "toolStripSeparator9"; this.toolStripSeparator9.Size = new System.Drawing.Size(6, 25); // + // toolStripButton1 + // + this.toolStripButton1.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButton1.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton1.Image"))); + this.toolStripButton1.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButton1.Name = "toolStripButton1"; + this.toolStripButton1.Size = new System.Drawing.Size(23, 22); + this.toolStripButton1.Text = "toolStripButton1"; + this.toolStripButton1.Click += new System.EventHandler(this.toolStripButton1_Click); + // // rootTreeNodeMenu // this.rootTreeNodeMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { @@ -654,16 +664,6 @@ namespace bzit.bomg this.toolStripMenuItem22.Text = "&Sort"; this.toolStripMenuItem22.Click += new System.EventHandler(this.sortContextMenu_Click); // - // toolStripButton1 - // - this.toolStripButton1.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.toolStripButton1.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton1.Image"))); - this.toolStripButton1.ImageTransparentColor = System.Drawing.Color.Magenta; - this.toolStripButton1.Name = "toolStripButton1"; - this.toolStripButton1.Size = new System.Drawing.Size(23, 22); - this.toolStripButton1.Text = "toolStripButton1"; - this.toolStripButton1.Click += new System.EventHandler(this.toolStripButton1_Click); - // // treeView1 // this.treeView1.AllowDrop = true; diff --git a/MainForm.cs b/MainForm.cs index f4c2433..05ab05d 100644 --- a/MainForm.cs +++ b/MainForm.cs @@ -5,8 +5,12 @@ using System; using System.Collections.Generic; using System.ComponentModel; using System.IO; +using System.Text; using System.Windows.Forms; +using System.Xml; using static RyzStudio.Windows.Forms.BookmarkTreeView; +using TextBoxForm = RyzStudio.Windows.ThemedForms.TextBoxForm; + namespace bzit.bomg { @@ -22,8 +26,6 @@ namespace bzit.bomg protected AppMode appMode = AppMode.Clear; protected string sessionFilename = null; - //protected SessionFileFormat sessionFileFormat = null; - public MainForm() { InitializeComponent(); @@ -218,6 +220,7 @@ namespace bzit.bomg set { appMode = value; + switch (value) { case AppMode.Clear: @@ -271,8 +274,24 @@ namespace bzit.bomg /// private void newMenuItem_Click(object sender, EventArgs e) { - NewSessionForm newSessionForm = new NewSessionForm(this); - newSessionForm.ShowDialog(); + TextBoxForm newSessionForm = new TextBoxForm("New Session", "Name"); + string rv = newSessionForm.ShowDialog(); + if (string.IsNullOrWhiteSpace(rv)) + { + return; + } + + if (this.ApplicationMode == AppMode.Clear) + { + + } + else + { + + } + + //treeView1.HasChanged.ToString() + } /// @@ -284,9 +303,9 @@ namespace bzit.bomg { if (openFileDialog.ShowDialog() == DialogResult.OK) { - sessionFilename = openFileDialog.FileName; + //##sessionFilename = openFileDialog.FileName; - OpenBookmarkFile(sessionFilename); + loadBookmarkFile(openFileDialog.FileName, openFileDialog.FilterIndex); } } @@ -486,33 +505,9 @@ namespace bzit.bomg #endregion - protected void OpenBookmarkFile(string filename) - { - //treeView1.HasChanged = false; - //if (RyzStudio.IO.SharpZipLib.IsZipEncrypted(filename)) - //{ - // PasswordForm oPassword = new PasswordForm(this); - // sessionFileFormat.passkey = oPassword.ShowDialog(); - // if (sessionFileFormat.passkey.Equals("")) - // { - // return; - // } - //} - //else - //{ - // sessionFileFormat.passkey = ""; - //} - //bool rv = sessionFileFormat.loadFromRyz(filename); - //if (rv) - //{ - // this.Text = Path.GetFileNameWithoutExtension(filename) + " - " + Properties.Resources.app_name; - // this.ApplicationMode = AppMode.Open; - // treeView1.HasChanged = false; - //} - } protected bool SaveBookmarkFile() { @@ -553,8 +548,250 @@ namespace bzit.bomg return rv; } + protected void loadBookmarkFile(string filename, int filterIndex) + { + switch (filterIndex) + { + case 1: + if (RyzStudio.IO.SharpZipLib.IsZipEncrypted(filename)) + { + PasswordForm passwordForm = new PasswordForm(this); + string password = string.Empty; - protected void saveBookmarkFile(string filename) + while (true) + { + password = passwordForm.ShowDialog(); + if (string.IsNullOrWhiteSpace(password)) + { + break; + } + + if (RyzStudio.IO.SharpZipLib.TestZipEncrypted(filename, password)) + { + loadBookmarkFile_ForJSNX(filename, password); + break; + } + } + } + else + { + loadBookmarkFile_ForJSNX(filename); + } + + break; + case 2: + if (RyzStudio.IO.SharpZipLib.IsZipEncrypted(filename)) + { + PasswordForm passwordForm = new PasswordForm(this); + string password = string.Empty; + + while (true) + { + password = passwordForm.ShowDialog(); + if (string.IsNullOrWhiteSpace(password)) + { + break; + } + + if (RyzStudio.IO.SharpZipLib.TestZipEncrypted(filename, password)) + { + loadBookmarkFile_ForRYZ(filename, password); + break; + } + } + } + else + { + loadBookmarkFile_ForRYZ(filename); + } + + break; + default: + break; + } + } + + protected void loadBookmarkFile_ForJSNX(string filename, string password = "") + { + int size = 2048; + byte[] buffer = new byte[size]; + int bufferSize = 0; + + List rs = null; + + ZipEntry readEntry = null; + 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("bookmarks.json")) + { + 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); + rs = JsonConvert.DeserializeObject>(sr.ReadToEnd()); + + break; + } + + treeView1.AddItem(rs); + } + + protected void loadBookmarkFile_ForRYZ(string filename, string password = "") + { + int size = 2048; + byte[] buffer = new byte[size]; + int bufferSize = 0; + + List rs = new List(); + + ZipEntry readEntry = null; + 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("bookmarks.xml")) + { + 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; + + // read stream + StreamReader sr = new StreamReader(ms); + + // load xml + XmlDocument xmlDocument = new XmlDocument(); + xmlDocument.LoadXml(sr.ReadToEnd()); + + // parse + XmlNode xnl = xmlDocument.SelectSingleNode("bomg/b/g"); + if (xnl == null) + { + break; + } + + string rootName = (xnl.Attributes["name"] == null) ? "Bookmarks" : (string.IsNullOrWhiteSpace(xnl.Attributes["name"].InnerText) ? "Bookmarks" : xnl.Attributes["name"].InnerText.Trim()); + + foreach (XmlNode xn in xnl.ChildNodes) + { + BookmarkItemViewModel viewModel = new BookmarkItemViewModel(); + + foreach (XmlNode xn2 in xn.ChildNodes) + { + switch (xn2.LocalName) + { + case "name": + viewModel.SiteName = xn2.InnerText?.Trim(); + break; + case "address": + viewModel.SiteAddress = xn2.InnerText?.Trim(); + break; + case "description": + viewModel.SiteDescription = xn2.InnerText?.Trim(); + break; + //case "created": + // bi.Created = xn2.InnerText?.Trim(); + // break; + default: + break; + } + } + + // fix fullpath and name + if (viewModel.SiteName.Contains("|")) + { + StringBuilder sb = new StringBuilder(); + sb.Append("\\"); + sb.Append(System.Web.HttpUtility.UrlEncode(rootName)); + sb.Append("\\"); + + string[] pathParts = viewModel.SiteName.Split('|'); + for (int i = 0; i < (pathParts.Length - 1); i++) + { + sb.Append(pathParts[i]); + //sb.Append(System.Web.HttpUtility.UrlDecode(pathParts[i])); + sb.Append("\\"); + } + + viewModel.SiteName = System.Web.HttpUtility.UrlDecode(pathParts[(pathParts.Length - 1)] ?? string.Empty); + viewModel.TreeviewPath = sb.ToString(); + } + else + { + viewModel.SiteName = System.Web.HttpUtility.UrlDecode(viewModel.SiteName); + viewModel.TreeviewPath = string.Format("\\{0}\\", System.Web.HttpUtility.UrlEncode(rootName)); + } + + rs.Add(viewModel); + } + + break; + } + + treeView1.AddItem(rs); + } + + protected void saveBookmarkFile(string filename, string password = "") { List rs = treeView1.GetBookmarkList(); @@ -564,12 +801,13 @@ namespace bzit.bomg ZipOutputStream zipStream = new ZipOutputStream(File.Create(filename)); zipStream.SetLevel(9); + zipStream.Password = password; - // make readable + // stream MemoryStream ms = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(rs))); ms.Position = 0; - // write new document xml + // write file entry zipStream.PutNextEntry(new ZipEntry("bookmarks.json")); buffer = new byte[size]; @@ -815,9 +1053,10 @@ namespace bzit.bomg { List rs = treeView1.GetBookmarkList(); - string filename = @"N:\test.jsnx"; + //string filename = @"N:\test.jsnx"; - saveBookmarkFile(filename); + //saveBookmarkFile(filename, string.Empty); + //loadBookmarkFile(filename, string.Empty); } } diff --git a/MainForm.resx b/MainForm.resx index df4dc2d..7a6034f 100644 --- a/MainForm.resx +++ b/MainForm.resx @@ -157,14 +157,14 @@ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHZSURBVDhPjZM7SxxRGIY1qfwPClaCICFkZUsRxELQQkmK - EAjEQsHOCxYpFSttZFmWNJJOsAik2yKwBAkJiu6i4g0iYrGbvbmzO5dzzszE1+87OOOOay4fPEyx5332 + EAjEQsHOCxYpFSttZFmWNJJOsAik2C6wBAkJiu6i4g0iYrGbvbmzO5dzzszE1+87OOOOay4fPEyx5332 PWfmtDVNJxEj4v+gm3hCtEzMcRwjk8n89n0fjyGlRCKRWKe1j0riHLYsC7Zth9TrddRqNRSLRS0pFApI JpMtknYizguEEFBK6SdjmiYMw0CpVNICagn+k1QqFUj0aIFXz0Fe72pBIOFAo9FAuVyObIfhjE7TaIE4 m4M4ng4XeJ6n9x1spVKp6Cb5fP5ecHM122Eevhnc/zS0IU+mIA9eQ16swq1+g+9aEQk34fOoVqv3Ank6 +UGdzkCez8O9XIX6uQSxPw5r+wXE4WKkCW+Hz4RFoQB49dQ5mPgszxdIsEaCZTi5l3Cy7+B7Si9kXNfV 58ISJhTwXO+NPRO5UaiLZaiz97C+9sE1jsIwwy2Cw+U2EYG1MzwismOwvz+Hud1L9WNQv77oUAA3YDjc Kvgx8Da72fPRlxV4hDhZgbzaagk3ExHQhB/SQ5pbNMO/cUanabQgnU7fPBT8Cf7sOaPTd9NPr8f+22UK - uLszJmX49obTRfQTbP0fKNzWdQu5+pvuDaXQ3AAAAABJRU5ErkJggg== + uLszJmX49obTRfQTbP0fKNzWdQuznZvllfjFsQAAAABJRU5ErkJggg== diff --git a/NewSessionForm.cs b/NewSessionForm.cs deleted file mode 100644 index 74ebd4f..0000000 --- a/NewSessionForm.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System; -using System.Windows.Forms; - -namespace bzit.bomg -{ - public partial class NewSessionForm : Form - { - private MainForm parentForm = null; - - public NewSessionForm(MainForm form) - { - InitializeComponent(); - - parentForm = form; - } - - private void button2_Click(object sender, EventArgs e) - { - if (parentForm == null) - { - return; - } - - if (string.IsNullOrEmpty(textBox2.Text)) - { - return; - } - - parentForm.treeView1.Clear(); - parentForm.treeView1.Nodes.Add("", textBox2.Text.Trim(), 0, 0); - parentForm.ApplicationMode = MainForm.AppMode.New; - - this.Close(); - } - - private void textBox1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) - { - switch (e.KeyCode) - { - case Keys.Enter: - button2_Click(sender, null); - break; - case Keys.Escape: - this.Close(); - break; - default: break; - } - } - - } -} \ No newline at end of file diff --git a/PasswordForm.Designer.cs b/PasswordForm.Designer.cs index deaee9c..21a52fa 100644 --- a/PasswordForm.Designer.cs +++ b/PasswordForm.Designer.cs @@ -28,62 +28,77 @@ namespace bzit.bomg /// private void InitializeComponent() { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PasswordForm)); - this.label1 = new System.Windows.Forms.Label(); - this.textBox1 = new System.Windows.Forms.TextBox(); - this.btnSave = new RyzStudio.Windows.Forms.BigButton(); + this.button2 = new RyzStudio.Windows.ThemedForms.Button(); + this.horizontalSeparator1 = new RyzStudio.Windows.Forms.HorizontalSeparator(); + this.textBox1 = new RyzStudio.Windows.ThemedForms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); this.SuspendLayout(); // - // label1 + // button2 // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(12, 12); - this.label1.Margin = new System.Windows.Forms.Padding(3); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(91, 13); - this.label1.TabIndex = 0; - this.label1.Text = "Enter a password"; + this.button2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.button2.BackColor = System.Drawing.Color.Transparent; + this.button2.DefaultImage = null; + this.button2.DownImage = null; + this.button2.LabelText = "&OK"; + this.button2.Location = new System.Drawing.Point(264, 77); + this.button2.Name = "button2"; + this.button2.OverImage = null; + this.button2.Padding = new System.Windows.Forms.Padding(4, 4, 3, 3); + this.button2.Size = new System.Drawing.Size(108, 32); + this.button2.TabIndex = 1; + this.button2.Click += new System.EventHandler(this.button2_Click); + // + // horizontalSeparator1 + // + this.horizontalSeparator1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.horizontalSeparator1.Location = new System.Drawing.Point(12, 62); + this.horizontalSeparator1.Margin = new System.Windows.Forms.Padding(3, 10, 3, 10); + this.horizontalSeparator1.MaximumSize = new System.Drawing.Size(4920, 2); + this.horizontalSeparator1.Name = "horizontalSeparator1"; + this.horizontalSeparator1.Size = new System.Drawing.Size(360, 2); + this.horizontalSeparator1.TabIndex = 73; // // 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.Location = new System.Drawing.Point(12, 31); + this.textBox1.BackColor = System.Drawing.Color.Transparent; + this.textBox1.Location = new System.Drawing.Point(96, 15); + this.textBox1.Margin = new System.Windows.Forms.Padding(10, 6, 10, 6); this.textBox1.Name = "textBox1"; - this.textBox1.PasswordChar = '*'; - this.textBox1.Size = new System.Drawing.Size(280, 21); + this.textBox1.Padding = new System.Windows.Forms.Padding(10, 10, 9, 9); + this.textBox1.Size = new System.Drawing.Size(276, 32); + this.textBox1.SubmitButton = this.button2; this.textBox1.TabIndex = 0; - this.textBox1.UseSystemPasswordChar = true; - this.textBox1.PreviewKeyDown += new System.Windows.Forms.PreviewKeyDownEventHandler(this.textBox1_PreviewKeyDown); + this.textBox1.UseSystemPasswordChar = false; // - // btnSave + // label2 // - this.btnSave.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.btnSave.BackColor = System.Drawing.Color.WhiteSmoke; - this.btnSave.Location = new System.Drawing.Point(196, 67); - this.btnSave.MaximumSize = new System.Drawing.Size(120, 32); - this.btnSave.MinimumSize = new System.Drawing.Size(32, 32); - this.btnSave.Name = "btnSave"; - this.btnSave.Padding = new System.Windows.Forms.Padding(4); - this.btnSave.Size = new System.Drawing.Size(96, 32); - this.btnSave.TabIndex = 23; - this.btnSave.Value = "&OK"; - this.btnSave.Click += new System.EventHandler(this.button2_Click); + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(12, 25); + this.label2.Margin = new System.Windows.Forms.Padding(3); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(53, 13); + this.label2.TabIndex = 71; + this.label2.Text = "Password"; // // PasswordForm // this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; this.BackColor = System.Drawing.Color.White; - this.ClientSize = new System.Drawing.Size(304, 111); - this.Controls.Add(this.btnSave); + this.ClientSize = new System.Drawing.Size(384, 121); + this.Controls.Add(this.button2); + this.Controls.Add(this.horizontalSeparator1); this.Controls.Add(this.textBox1); - this.Controls.Add(this.label1); + this.Controls.Add(this.label2); this.Font = new System.Drawing.Font("Tahoma", 8.25F); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.MaximizeBox = false; this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(400, 160); this.Name = "PasswordForm"; + this.ShowIcon = false; this.ShowInTaskbar = false; this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; @@ -94,9 +109,9 @@ namespace bzit.bomg } #endregion - - private System.Windows.Forms.Label label1; - private System.Windows.Forms.TextBox textBox1; - private RyzStudio.Windows.Forms.BigButton btnSave; + private RyzStudio.Windows.ThemedForms.Button button2; + private RyzStudio.Windows.Forms.HorizontalSeparator horizontalSeparator1; + private RyzStudio.Windows.ThemedForms.TextBox textBox1; + private System.Windows.Forms.Label label2; } } \ No newline at end of file diff --git a/PasswordForm.cs b/PasswordForm.cs index 5336a59..724808d 100644 --- a/PasswordForm.cs +++ b/PasswordForm.cs @@ -21,11 +21,6 @@ namespace bzit.bomg return; } - if (string.IsNullOrEmpty(textBox1.Text)) - { - return; - } - this.Close(); } @@ -33,9 +28,6 @@ namespace bzit.bomg { switch (e.KeyCode) { - case Keys.Enter: - button2_Click(sender, null); - break; case Keys.Escape: this.Close(); break; diff --git a/PasswordForm.resx b/PasswordForm.resx index de6f015..d58980a 100644 --- a/PasswordForm.resx +++ b/PasswordForm.resx @@ -117,29 +117,4 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzjMmFRJ7V6TmMy+AkZqRWAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAR63jyYXp+f9M2fX/OZHM8yNgnF0AAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEeq4c+g5vj/N9Ly/0bW9v86k831IlqYYhlS - tw0cXb8NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvl9pcOZ3dzpji9v9S3PX/Rdn2/zaP - zPQ0gs/oNYPS6B9dplMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACyU2TRFqeHKT7fl3l3Z - 8v9N2/b/Wt33/1TY9f8tf833H1ehWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADOY - 2oaI3fT/aeD2/3Li9/9e3/b/VNr2/zd+zfMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAA6oN2vqO75/33m+P+Z6Pj/fdHw/3/i9v8+l9nwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAALZXZZlzA6v2i8Pv/f9Tw/33H7P9Pot31IG21WQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAokNhwbsns/8nz+/9WueftJITNSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAALJXaAjCY2olFquHLKpXaYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAA//+sQf//rEH//6xB4f+sQeD/rEHgH6xB4A+sQfAHrEH8B6xB/AesQfwHrEH+D6xB/h+sQf// - rEH//6xB//+sQQ== - - \ No newline at end of file diff --git a/RyzStudio/IO/SharpZipLib.cs b/RyzStudio/IO/SharpZipLib.cs index b162124..d1f7c77 100644 --- a/RyzStudio/IO/SharpZipLib.cs +++ b/RyzStudio/IO/SharpZipLib.cs @@ -1,75 +1,123 @@ -using System; -using System.IO; -using ICSharpCode.SharpZipLib.Zip; - -namespace RyzStudio.IO +namespace RyzStudio.IO { + using System; + using System.IO; + using ICSharpCode.SharpZipLib.Zip; + public class SharpZipLib { - /// - /// Is zip file encrypted - /// - /// Filename - /// Is encrypted - public static bool IsZipEncrypted(string fn) + public static bool IsZipEncrypted(string filename) { - bool ret_val = false; + bool rv = false; + try { - ZipInputStream zipIn = new ZipInputStream(System.IO.File.OpenRead(fn)); - ZipEntry theEntry = null; - while ((theEntry = zipIn.GetNextEntry()) != null) + ZipInputStream zipStream = new ZipInputStream(File.OpenRead(filename)); + + ZipEntry zipEntry = null; + while ((zipEntry = zipStream.GetNextEntry()) != null) { - if (theEntry.IsCrypted) + if (zipEntry.IsCrypted) { - ret_val = true; + rv = true; } break; } - zipIn.Close(); + zipStream.Close(); } catch - { + { // do nothing } - return ret_val; + return rv; } - public static void AddFile(ZipOutputStream zipstream, string filename, string prefixpath = null) + public static bool TestZipEncrypted(string filename, string password) + { + bool rv = false; + + int size = 2; + byte[] buffer = new byte[size]; + int bufferSize = 0; + + ZipEntry readEntry = null; + 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.Size <= 0) + { + continue; + } + + try + { + bufferSize = readStream.Read(buffer, 0, buffer.Length); + rv = true; + } + catch + { + break; + } + + break; + } + + return rv; + } + + public static void AddFile(ZipOutputStream zipStream, string filename, string prefixPath = null) { byte[] buffer = new byte[4096]; - + string f1 = ""; - if (prefixpath != null) + if (prefixPath != null) { f1 = Path.GetDirectoryName(filename).TrimEnd('\\') + "\\"; - f1 = f1.Replace(prefixpath, "").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); + ZipEntry zipEntry = new ZipEntry(f1); + zipEntry.DateTime = DateTime.Now; + zipStream.PutNextEntry(zipEntry); + + FileStream fileStream = File.OpenRead(filename); int sourceBytes; do { - sourceBytes = fs.Read(buffer, 0, buffer.Length); - zipstream.Write(buffer, 0, sourceBytes); + sourceBytes = fileStream.Read(buffer, 0, buffer.Length); + zipStream.Write(buffer, 0, sourceBytes); } while (sourceBytes > 0); } - public static void AddFolder(ZipOutputStream zipstream, string folderpath, string prefixpath = null) + public static void AddFolder(ZipOutputStream zipStream, string folderPath, string prefixPath = null) { - foreach (string fn in Directory.GetFiles(folderpath, "*.*", System.IO.SearchOption.AllDirectories)) + foreach (string fn in Directory.GetFiles(folderPath, "*.*", System.IO.SearchOption.AllDirectories)) { - AddFile(zipstream, fn, prefixpath); + AddFile(zipStream, fn, prefixPath); } } } diff --git a/RyzStudio/Windows/ThemedForms/Button.cs b/RyzStudio/Windows/ThemedForms/Button.cs index 06cefb6..9e3cf0a 100644 --- a/RyzStudio/Windows/ThemedForms/Button.cs +++ b/RyzStudio/Windows/ThemedForms/Button.cs @@ -100,5 +100,7 @@ [Browsable(false)] public ButtonStyle StyleDefault { get; set; } = new ButtonStyle(Color.White, Color.Black); + + public void PerformClick() => this.OnClick(null); } } \ No newline at end of file diff --git a/RyzStudio/Windows/ThemedForms/TextBox.cs b/RyzStudio/Windows/ThemedForms/TextBox.cs index ec54dc7..676b6d5 100644 --- a/RyzStudio/Windows/ThemedForms/TextBox.cs +++ b/RyzStudio/Windows/ThemedForms/TextBox.cs @@ -15,6 +15,7 @@ InitializeComponent(); this.Margin = new Padding(10, 6, 10, 6); + textBox1.PreviewKeyDown += textBox_PreviewKeyDown; } protected override void OnResize(EventArgs e) @@ -33,6 +34,24 @@ 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: + // this.Close(); + // break; + default: break; + } + } + [Browsable(true), EditorBrowsable(EditorBrowsableState.Advanced)] [Category("Appearance")] public System.Windows.Forms.TextBox InnerTextBox { get => textBox1; set => textBox1 = value; } @@ -41,6 +60,14 @@ [Category("Appearance")] public new string Text { get => textBox1.Text; set => textBox1.Text = 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 Button SubmitButton { get; set; } = null; + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] public new Padding Margin { get { return base.Margin; } set { base.Margin = value; } } diff --git a/NewSessionForm.Designer.cs b/RyzStudio/Windows/ThemedForms/TextBoxForm.Designer.cs similarity index 76% rename from NewSessionForm.Designer.cs rename to RyzStudio/Windows/ThemedForms/TextBoxForm.Designer.cs index 031ac36..9e5fa61 100644 --- a/NewSessionForm.Designer.cs +++ b/RyzStudio/Windows/ThemedForms/TextBoxForm.Designer.cs @@ -1,6 +1,6 @@ -namespace bzit.bomg +namespace RyzStudio.Windows.ThemedForms { - partial class NewSessionForm + partial class TextBoxForm { /// /// Required designer variable. @@ -28,26 +28,43 @@ namespace bzit.bomg /// private void InitializeComponent() { - this.textBox2 = new RyzStudio.Windows.ThemedForms.TextBox(); + this.textBox1 = new RyzStudio.Windows.ThemedForms.TextBox(); + this.button2 = new RyzStudio.Windows.ThemedForms.Button(); this.label2 = new System.Windows.Forms.Label(); this.horizontalSeparator1 = new RyzStudio.Windows.Forms.HorizontalSeparator(); - this.button2 = new RyzStudio.Windows.ThemedForms.Button(); this.SuspendLayout(); - // - // textBox2 - // - this.textBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + // + // textBox1 + // + this.textBox1.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.Location = new System.Drawing.Point(96, 15); - 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(276, 32); - this.textBox2.TabIndex = 68; - // + this.textBox1.BackColor = System.Drawing.Color.Transparent; + this.textBox1.Location = new System.Drawing.Point(96, 15); + 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(276, 32); + this.textBox1.SubmitButton = this.button2; + this.textBox1.TabIndex = 0; + this.textBox1.UseSystemPasswordChar = false; + // + // button2 + // + this.button2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.button2.BackColor = System.Drawing.Color.Transparent; + this.button2.DefaultImage = null; + this.button2.DownImage = null; + this.button2.LabelText = "&OK"; + this.button2.Location = new System.Drawing.Point(264, 77); + this.button2.Name = "button2"; + this.button2.OverImage = null; + this.button2.Padding = new System.Windows.Forms.Padding(4, 4, 3, 3); + this.button2.Size = new System.Drawing.Size(108, 32); + this.button2.TabIndex = 1; + this.button2.Click += new System.EventHandler(this.button2_Click); + // // label2 - // + // this.label2.AutoSize = true; this.label2.Location = new System.Drawing.Point(12, 25); this.label2.Margin = new System.Windows.Forms.Padding(3); @@ -55,45 +72,31 @@ namespace bzit.bomg this.label2.Size = new System.Drawing.Size(34, 13); this.label2.TabIndex = 67; this.label2.Text = "Name"; - // + // // horizontalSeparator1 - // - this.horizontalSeparator1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + // + this.horizontalSeparator1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.horizontalSeparator1.Location = new System.Drawing.Point(12, 63); + this.horizontalSeparator1.Location = new System.Drawing.Point(12, 62); this.horizontalSeparator1.Margin = new System.Windows.Forms.Padding(3, 10, 3, 10); this.horizontalSeparator1.MaximumSize = new System.Drawing.Size(4920, 2); this.horizontalSeparator1.Name = "horizontalSeparator1"; this.horizontalSeparator1.Size = new System.Drawing.Size(360, 2); this.horizontalSeparator1.TabIndex = 69; - // - // button2 - // - this.button2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.button2.BackColor = System.Drawing.Color.Transparent; - this.button2.DefaultImage = null; - this.button2.DownImage = null; - this.button2.LabelText = "&OK"; - this.button2.Location = new System.Drawing.Point(264, 78); - this.button2.Name = "button2"; - this.button2.OverImage = null; - this.button2.Padding = new System.Windows.Forms.Padding(4, 4, 3, 3); - this.button2.Size = new System.Drawing.Size(108, 32); - this.button2.TabIndex = 70; - this.button2.Click += new System.EventHandler(this.button2_Click); - // + // // NewSessionForm - // + // this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; this.BackColor = System.Drawing.Color.White; - this.ClientSize = new System.Drawing.Size(384, 122); + this.ClientSize = new System.Drawing.Size(384, 121); this.Controls.Add(this.button2); this.Controls.Add(this.horizontalSeparator1); - this.Controls.Add(this.textBox2); + this.Controls.Add(this.textBox1); this.Controls.Add(this.label2); this.Font = new System.Drawing.Font("Tahoma", 8.25F); this.MaximizeBox = false; this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(400, 160); this.Name = "NewSessionForm"; this.ShowIcon = false; this.ShowInTaskbar = false; @@ -105,7 +108,7 @@ namespace bzit.bomg } #endregion - private RyzStudio.Windows.ThemedForms.TextBox textBox2; + private RyzStudio.Windows.ThemedForms.TextBox textBox1; private System.Windows.Forms.Label label2; private RyzStudio.Windows.Forms.HorizontalSeparator horizontalSeparator1; private RyzStudio.Windows.ThemedForms.Button button2; diff --git a/RyzStudio/Windows/ThemedForms/TextBoxForm.cs b/RyzStudio/Windows/ThemedForms/TextBoxForm.cs new file mode 100644 index 0000000..92c94c3 --- /dev/null +++ b/RyzStudio/Windows/ThemedForms/TextBoxForm.cs @@ -0,0 +1,67 @@ +using System; +using System.Windows.Forms; + +namespace RyzStudio.Windows.ThemedForms +{ + public partial class TextBoxForm : Form + { + public TextBoxForm(string title, string labelText, string defaultValue) + { + InitializeComponent(); + + this.Text = title; + label2.Text = labelText; + textBox1.Text = defaultValue; + } + + public TextBoxForm(string title, string labelText, string defaultValue, bool password) + { + InitializeComponent(); + + this.Text = title; + label2.Text = labelText; + textBox1.Text = defaultValue; + textBox1.UseSystemPasswordChar = password; + } + + public TextBoxForm(string title, string labelText) + { + InitializeComponent(); + + this.Text = title; + label2.Text = labelText; + } + + public TextBoxForm(string title, string labelText, bool password) + { + InitializeComponent(); + + this.Text = title; + label2.Text = labelText; + textBox1.UseSystemPasswordChar = password; + } + + private void button2_Click(object sender, EventArgs e) + { + this.Close(); + } + + private void textBox1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) + { + switch (e.KeyCode) + { + case Keys.Escape: + this.Close(); + break; + default: break; + } + } + + public new string ShowDialog() + { + base.ShowDialog(); + + return textBox1.Text; + } + } +} \ No newline at end of file diff --git a/NewSessionForm.resx b/RyzStudio/Windows/ThemedForms/TextBoxForm.resx similarity index 100% rename from NewSessionForm.resx rename to RyzStudio/Windows/ThemedForms/TextBoxForm.resx diff --git a/Windows/Forms/BookmarkTreeView.cs b/Windows/Forms/BookmarkTreeView.cs index 062d2b0..7c5c0d8 100644 --- a/Windows/Forms/BookmarkTreeView.cs +++ b/Windows/Forms/BookmarkTreeView.cs @@ -198,6 +198,21 @@ namespace RyzStudio.Windows.Forms 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); + } + } + public void AddItem(BookmarkItemViewModel viewModel) { int iconIndex = addIcon(viewModel); @@ -296,7 +311,10 @@ namespace RyzStudio.Windows.Forms return rs; } - traverseBookmarkList(rs, this.Nodes[0]); + foreach (TreeNode item in this.Nodes) + { + traverseBookmarkList(rs, item); + } return rs; } @@ -403,13 +421,19 @@ namespace RyzStudio.Windows.Forms public void Clear() { - //nodeCount = 0; - //NodeCountUpdate(nodeCount); this.Nodes.Clear(); this.HasChanged = true; } + public void Clear(string name) + { + this.Nodes.Clear(); + this.Nodes.Add("", name?.Trim(), (int)IconSet.Root, (int)IconSet.Root); + + this.HasChanged = true; + } + #endregion #region integrated behaviour @@ -491,22 +515,6 @@ namespace RyzStudio.Windows.Forms this.HasChanged = true; base.OnBeforeLabelEdit(e); - - //if (e.Node == null) - //{ - // e.CancelEdit = true; - //} - //else - //{ - // if (e.Node.Tag == null) - // { - // // do it - // } - // else - // { - // e.CancelEdit = true; - // } - //} } protected override void OnAfterLabelEdit(NodeLabelEditEventArgs e) @@ -627,14 +635,8 @@ namespace RyzStudio.Windows.Forms base.OnPreviewKeyDown(e); } - //protected virtual void NodeCountUpdate(ulong v) - //{ - // this.OnNodeCountUpdate?.Invoke(v); - //} - #endregion - protected int addIcon(BookmarkItemViewModel viewModel) => addIcon(viewModel.ToModel()); protected int addIcon(BookmarkItemModel model) @@ -672,11 +674,12 @@ namespace RyzStudio.Windows.Forms protected TreeNode addFolderPath(string path) { - TreeNode tn = this.Nodes[0]; - if (tn == null) - { - return tn; - } + TreeNode tn = null; + //TreeNode tn = this.Nodes[0]; + //if (tn == null) + //{ + // return tn; + //} if (string.IsNullOrWhiteSpace(path)) { @@ -694,18 +697,28 @@ namespace RyzStudio.Windows.Forms return tn; } - foreach (string item in folderList) + for (int i=0; i UpdateIconForm.cs - Form @@ -175,11 +174,11 @@ FindForm.cs - + Form - - NewSessionForm.cs + + TextBoxForm.cs Form @@ -242,8 +241,8 @@ FindForm.cs - - NewSessionForm.cs + + TextBoxForm.cs PasswordForm.cs From 07585887adf747be5ad00a83c1b70fa0e1e541bd Mon Sep 17 00:00:00 2001 From: Ray Date: Mon, 22 Apr 2019 12:40:29 +0100 Subject: [PATCH 07/34] WIP --- MainForm.Designer.cs | 188 ++---- MainForm.cs | 673 ++++++++++--------- MainForm.resx | 47 +- Properties/Resources.Designer.cs | 132 ++-- Properties/Resources.resx | 59 +- Resources/2/arrow-down-circle.png | Bin 0 -> 418 bytes Resources/2/arrow-up-circle.png | Bin 0 -> 425 bytes Resources/2/bookmark.png | Bin 0 -> 295 bytes Resources/2/file-plus.png | Bin 0 -> 321 bytes Resources/2/file.png | Bin 0 -> 312 bytes Resources/2/folder-plus.png | Bin 0 -> 363 bytes Resources/2/folder.png | Bin 0 -> 313 bytes Resources/2/help-circle.png | Bin 0 -> 435 bytes Resources/2/save.png | Bin 0 -> 371 bytes Resources/2/search.png | Bin 0 -> 378 bytes Resources/2/settings.png | Bin 0 -> 483 bytes Resources/2/svg/arrow-down-circle.svg | 1 + Resources/2/svg/arrow-up-circle.svg | 1 + Resources/2/svg/bookmark.svg | 1 + Resources/2/svg/file-plus.svg | 1 + Resources/2/svg/file-text.svg | 1 + Resources/2/svg/file.svg | 1 + Resources/2/svg/folder-plus.svg | 1 + Resources/2/svg/folder.svg | 1 + Resources/2/svg/help-circle.svg | 1 + Resources/2/svg/save.svg | 1 + Resources/2/svg/search.svg | 1 + Resources/2/svg/settings.svg | 1 + Resources/2/svg/trash-2.svg | 1 + Resources/2/trash-2.png | Bin 0 -> 345 bytes RyzStudio/Windows/ThemedForms/TextBoxForm.cs | 2 +- Windows/Forms/BookmarkTreeView.cs | 123 +--- bomg.csproj | 23 +- 33 files changed, 613 insertions(+), 647 deletions(-) create mode 100644 Resources/2/arrow-down-circle.png create mode 100644 Resources/2/arrow-up-circle.png create mode 100644 Resources/2/bookmark.png create mode 100644 Resources/2/file-plus.png create mode 100644 Resources/2/file.png create mode 100644 Resources/2/folder-plus.png create mode 100644 Resources/2/folder.png create mode 100644 Resources/2/help-circle.png create mode 100644 Resources/2/save.png create mode 100644 Resources/2/search.png create mode 100644 Resources/2/settings.png create mode 100644 Resources/2/svg/arrow-down-circle.svg create mode 100644 Resources/2/svg/arrow-up-circle.svg create mode 100644 Resources/2/svg/bookmark.svg create mode 100644 Resources/2/svg/file-plus.svg create mode 100644 Resources/2/svg/file-text.svg create mode 100644 Resources/2/svg/file.svg create mode 100644 Resources/2/svg/folder-plus.svg create mode 100644 Resources/2/svg/folder.svg create mode 100644 Resources/2/svg/help-circle.svg create mode 100644 Resources/2/svg/save.svg create mode 100644 Resources/2/svg/search.svg create mode 100644 Resources/2/svg/settings.svg create mode 100644 Resources/2/svg/trash-2.svg create mode 100644 Resources/2/trash-2.png diff --git a/MainForm.Designer.cs b/MainForm.Designer.cs index a94f3fb..0913441 100644 --- a/MainForm.Designer.cs +++ b/MainForm.Designer.cs @@ -43,7 +43,7 @@ namespace bzit.bomg this.statusBar1 = new System.Windows.Forms.StatusBar(); this.statusBarPanel1 = new System.Windows.Forms.StatusBarPanel(); this.statusBarPanel2 = new System.Windows.Forms.StatusBarPanel(); - this.oToolTip1 = new System.Windows.Forms.ToolTip(this.components); + this.toolTip1 = new System.Windows.Forms.ToolTip(this.components); this.toolStrip1 = new System.Windows.Forms.ToolStrip(); this.toolStripDropDownButton1 = new System.Windows.Forms.ToolStripDropDownButton(); this.newFileMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -54,24 +54,20 @@ namespace bzit.bomg this.saveFileMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.saveAsFileMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator(); - this.exportFileMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator(); this.exitFileMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripDropDownButton2 = new System.Windows.Forms.ToolStripDropDownButton(); this.findEditMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripDropDownButton3 = new System.Windows.Forms.ToolStripDropDownButton(); this.expandAllViewMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.collapseAllViewMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripSeparator(); + this.alwaysOnTopToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripDropDownButton4 = new System.Windows.Forms.ToolStripDropDownButton(); - this.updateIconsToolMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator14 = new System.Windows.Forms.ToolStripSeparator(); this.optionsToolMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripDropDownButton5 = new System.Windows.Forms.ToolStripDropDownButton(); this.viewHelpHelpMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator12 = new System.Windows.Forms.ToolStripSeparator(); this.aboutHelpMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripDropDownButton7 = new System.Windows.Forms.ToolStripDropDownButton(); - this.alwaysOnTopToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.openFileDialog = new System.Windows.Forms.OpenFileDialog(); this.folderTreeNodeMenu = new System.Windows.Forms.ContextMenuStrip(this.components); this.toolStripMenuItem15 = new System.Windows.Forms.ToolStripMenuItem(); @@ -91,7 +87,6 @@ namespace bzit.bomg this.openMenuBarItem = new System.Windows.Forms.ToolStripButton(); this.saveMenuBarItem = new System.Windows.Forms.ToolStripButton(); this.toolStripSeparator9 = new System.Windows.Forms.ToolStripSeparator(); - this.toolStripButton1 = new System.Windows.Forms.ToolStripButton(); this.rootTreeNodeMenu = new System.Windows.Forms.ContextMenuStrip(this.components); this.toolStripMenuItem17 = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripMenuItem18 = new System.Windows.Forms.ToolStripMenuItem(); @@ -120,50 +115,54 @@ namespace bzit.bomg this.listViewMenuItem1, this.moveFileToToolStripMenuItem}); this.pageTreeNodeMenu.Name = "listViewMenu"; - this.pageTreeNodeMenu.Size = new System.Drawing.Size(139, 126); + this.pageTreeNodeMenu.Size = new System.Drawing.Size(181, 148); // // toolStripMenuItem4 // + this.toolStripMenuItem4.Image = global::bzit.bomg.Properties.Resources.bookmark; this.toolStripMenuItem4.Name = "toolStripMenuItem4"; - this.toolStripMenuItem4.Size = new System.Drawing.Size(138, 22); + this.toolStripMenuItem4.Size = new System.Drawing.Size(180, 22); this.toolStripMenuItem4.Text = "&Open"; this.toolStripMenuItem4.Click += new System.EventHandler(this.openContextMenu_Click); // // toolStripSeparator3 // this.toolStripSeparator3.Name = "toolStripSeparator3"; - this.toolStripSeparator3.Size = new System.Drawing.Size(135, 6); + this.toolStripSeparator3.Size = new System.Drawing.Size(177, 6); // // toolStripMenuItem8 // this.toolStripMenuItem8.Name = "toolStripMenuItem8"; - this.toolStripMenuItem8.Size = new System.Drawing.Size(138, 22); + this.toolStripMenuItem8.Size = new System.Drawing.Size(180, 22); this.toolStripMenuItem8.Text = "E&dit"; this.toolStripMenuItem8.Click += new System.EventHandler(this.editContextMenu3_Click); // // toolStripMenuItem6 // + this.toolStripMenuItem6.Image = global::bzit.bomg.Properties.Resources.trash_2; this.toolStripMenuItem6.Name = "toolStripMenuItem6"; - this.toolStripMenuItem6.Size = new System.Drawing.Size(138, 22); + this.toolStripMenuItem6.Size = new System.Drawing.Size(180, 22); this.toolStripMenuItem6.Text = "D&elete"; this.toolStripMenuItem6.Click += new System.EventHandler(this.deleteContextMenu2_Click); // // toolStripSeparator2 // this.toolStripSeparator2.Name = "toolStripSeparator2"; - this.toolStripSeparator2.Size = new System.Drawing.Size(135, 6); + this.toolStripSeparator2.Size = new System.Drawing.Size(177, 6); // // listViewMenuItem1 // + this.listViewMenuItem1.Image = global::bzit.bomg.Properties.Resources.arrow_up_circle; this.listViewMenuItem1.Name = "listViewMenuItem1"; - this.listViewMenuItem1.Size = new System.Drawing.Size(138, 22); + this.listViewMenuItem1.Size = new System.Drawing.Size(180, 22); this.listViewMenuItem1.Text = "Move &Up"; this.listViewMenuItem1.Click += new System.EventHandler(this.moveUpContextMenu2_Click); // // moveFileToToolStripMenuItem // + this.moveFileToToolStripMenuItem.Image = global::bzit.bomg.Properties.Resources.arrow_down_circle; this.moveFileToToolStripMenuItem.Name = "moveFileToToolStripMenuItem"; - this.moveFileToToolStripMenuItem.Size = new System.Drawing.Size(138, 22); + this.moveFileToToolStripMenuItem.Size = new System.Drawing.Size(180, 22); this.moveFileToToolStripMenuItem.Text = "Move &Down"; this.moveFileToToolStripMenuItem.Click += new System.EventHandler(this.moveDownContextMenu2_Click); // @@ -200,8 +199,7 @@ namespace bzit.bomg this.toolStripDropDownButton2, this.toolStripDropDownButton3, this.toolStripDropDownButton4, - this.toolStripDropDownButton5, - this.toolStripDropDownButton7}); + this.toolStripDropDownButton5}); this.toolStrip1.Location = new System.Drawing.Point(0, 0); this.toolStrip1.Name = "toolStrip1"; this.toolStrip1.Padding = new System.Windows.Forms.Padding(5, 0, 1, 0); @@ -222,8 +220,6 @@ namespace bzit.bomg this.saveFileMenuItem, this.saveAsFileMenuItem, this.toolStripSeparator8, - this.exportFileMenuItem, - this.toolStripSeparator6, this.exitFileMenuItem}); this.toolStripDropDownButton1.ImageTransparentColor = System.Drawing.Color.Magenta; this.toolStripDropDownButton1.Name = "toolStripDropDownButton1"; @@ -233,21 +229,21 @@ namespace bzit.bomg // // newFileMenuItem // - this.newFileMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("newFileMenuItem.Image"))); + this.newFileMenuItem.Image = global::bzit.bomg.Properties.Resources.file; this.newFileMenuItem.Name = "newFileMenuItem"; this.newFileMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.N))); this.newFileMenuItem.Size = new System.Drawing.Size(186, 22); this.newFileMenuItem.Text = "&New"; - this.newFileMenuItem.Click += new System.EventHandler(this.newMenuItem_Click); + this.newFileMenuItem.Click += new System.EventHandler(this.fileNewMenuItem_Click); // // openFileMenuItem // - this.openFileMenuItem.Image = global::bzit.bomg.Properties.Resources.folder_page; + this.openFileMenuItem.Image = global::bzit.bomg.Properties.Resources.folder1; this.openFileMenuItem.Name = "openFileMenuItem"; this.openFileMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O))); this.openFileMenuItem.Size = new System.Drawing.Size(186, 22); this.openFileMenuItem.Text = "&Open"; - this.openFileMenuItem.Click += new System.EventHandler(this.openMenuItem_Click); + this.openFileMenuItem.Click += new System.EventHandler(this.fileOpenMenuItem_Click); // // toolStripSeparator1 // @@ -260,7 +256,7 @@ namespace bzit.bomg this.closeFileMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.W))); this.closeFileMenuItem.Size = new System.Drawing.Size(186, 22); this.closeFileMenuItem.Text = "&Close"; - this.closeFileMenuItem.Click += new System.EventHandler(this.closeMenuItem_Click); + this.closeFileMenuItem.Click += new System.EventHandler(this.fileCloseMenuItem_Click); // // toolStripSeparator4 // @@ -269,47 +265,33 @@ namespace bzit.bomg // // saveFileMenuItem // - this.saveFileMenuItem.Image = global::bzit.bomg.Properties.Resources.disk; + this.saveFileMenuItem.Image = global::bzit.bomg.Properties.Resources.save; this.saveFileMenuItem.Name = "saveFileMenuItem"; this.saveFileMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S))); this.saveFileMenuItem.Size = new System.Drawing.Size(186, 22); this.saveFileMenuItem.Text = "&Save"; - this.saveFileMenuItem.Click += new System.EventHandler(this.importSnapshotToolStripMenuItem_Click); + this.saveFileMenuItem.Click += new System.EventHandler(this.fileSaveMenuItem_Click); // // saveAsFileMenuItem // - this.saveAsFileMenuItem.Image = global::bzit.bomg.Properties.Resources.page_white_disk; this.saveAsFileMenuItem.Name = "saveAsFileMenuItem"; this.saveAsFileMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift) | System.Windows.Forms.Keys.S))); this.saveAsFileMenuItem.Size = new System.Drawing.Size(186, 22); this.saveAsFileMenuItem.Text = "Save &As"; - this.saveAsFileMenuItem.Click += new System.EventHandler(this.exportSnapshotToolStripMenuItem_Click); + this.saveAsFileMenuItem.Click += new System.EventHandler(this.fileSaveAsMenuItem_Click); // // toolStripSeparator8 // this.toolStripSeparator8.Name = "toolStripSeparator8"; this.toolStripSeparator8.Size = new System.Drawing.Size(183, 6); // - // exportFileMenuItem - // - this.exportFileMenuItem.Enabled = false; - this.exportFileMenuItem.Name = "exportFileMenuItem"; - this.exportFileMenuItem.Size = new System.Drawing.Size(186, 22); - this.exportFileMenuItem.Text = "&Export"; - this.exportFileMenuItem.Click += new System.EventHandler(this.toolStripMenuItem7_Click); - // - // toolStripSeparator6 - // - this.toolStripSeparator6.Name = "toolStripSeparator6"; - this.toolStripSeparator6.Size = new System.Drawing.Size(183, 6); - // // exitFileMenuItem // this.exitFileMenuItem.Name = "exitFileMenuItem"; this.exitFileMenuItem.Size = new System.Drawing.Size(186, 22); this.exitFileMenuItem.Text = "E&xit"; - this.exitFileMenuItem.Click += new System.EventHandler(this.exitMenuItem_Click); + this.exitFileMenuItem.Click += new System.EventHandler(this.fileExitMenuItem_Click); // // toolStripDropDownButton2 // @@ -324,7 +306,7 @@ namespace bzit.bomg // // findEditMenuItem // - this.findEditMenuItem.Image = global::bzit.bomg.Properties.Resources.magnifier; + this.findEditMenuItem.Image = global::bzit.bomg.Properties.Resources.search; this.findEditMenuItem.Name = "findEditMenuItem"; this.findEditMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.F))); this.findEditMenuItem.Size = new System.Drawing.Size(137, 22); @@ -336,7 +318,9 @@ namespace bzit.bomg this.toolStripDropDownButton3.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; this.toolStripDropDownButton3.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.expandAllViewMenuItem, - this.collapseAllViewMenuItem}); + this.collapseAllViewMenuItem, + this.toolStripMenuItem1, + this.alwaysOnTopToolStripMenuItem1}); this.toolStripDropDownButton3.ImageTransparentColor = System.Drawing.Color.Magenta; this.toolStripDropDownButton3.Name = "toolStripDropDownButton3"; this.toolStripDropDownButton3.ShowDropDownArrow = false; @@ -347,24 +331,35 @@ namespace bzit.bomg // this.expandAllViewMenuItem.Enabled = false; this.expandAllViewMenuItem.Name = "expandAllViewMenuItem"; - this.expandAllViewMenuItem.Size = new System.Drawing.Size(136, 22); + this.expandAllViewMenuItem.Size = new System.Drawing.Size(205, 22); this.expandAllViewMenuItem.Text = "&Expand All"; - this.expandAllViewMenuItem.Click += new System.EventHandler(this.expandAllToolStripMenuItem_Click); + this.expandAllViewMenuItem.Click += new System.EventHandler(this.viewExpandAllMenuItem_Click); // // collapseAllViewMenuItem // this.collapseAllViewMenuItem.Enabled = false; this.collapseAllViewMenuItem.Name = "collapseAllViewMenuItem"; - this.collapseAllViewMenuItem.Size = new System.Drawing.Size(136, 22); + this.collapseAllViewMenuItem.Size = new System.Drawing.Size(205, 22); this.collapseAllViewMenuItem.Text = "&Collapse All"; - this.collapseAllViewMenuItem.Click += new System.EventHandler(this.collapseAllToolStripMenuItem_Click); + this.collapseAllViewMenuItem.Click += new System.EventHandler(this.viewCollapseAllMenuItem_Click); + // + // toolStripMenuItem1 + // + this.toolStripMenuItem1.Name = "toolStripMenuItem1"; + this.toolStripMenuItem1.Size = new System.Drawing.Size(202, 6); + // + // alwaysOnTopToolStripMenuItem1 + // + this.alwaysOnTopToolStripMenuItem1.Name = "alwaysOnTopToolStripMenuItem1"; + this.alwaysOnTopToolStripMenuItem1.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.F11))); + this.alwaysOnTopToolStripMenuItem1.Size = new System.Drawing.Size(205, 22); + this.alwaysOnTopToolStripMenuItem1.Text = "Always On &Top"; + this.alwaysOnTopToolStripMenuItem1.Click += new System.EventHandler(this.viewAlwaysOnTopMenuItem_Click); // // toolStripDropDownButton4 // this.toolStripDropDownButton4.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; this.toolStripDropDownButton4.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.updateIconsToolMenuItem, - this.toolStripSeparator14, this.optionsToolMenuItem}); this.toolStripDropDownButton4.ImageTransparentColor = System.Drawing.Color.Magenta; this.toolStripDropDownButton4.Name = "toolStripDropDownButton4"; @@ -372,27 +367,15 @@ namespace bzit.bomg this.toolStripDropDownButton4.Size = new System.Drawing.Size(39, 22); this.toolStripDropDownButton4.Text = "&Tools"; // - // updateIconsToolMenuItem - // - this.updateIconsToolMenuItem.Name = "updateIconsToolMenuItem"; - this.updateIconsToolMenuItem.Size = new System.Drawing.Size(143, 22); - this.updateIconsToolMenuItem.Text = "&Update Icons"; - this.updateIconsToolMenuItem.Click += new System.EventHandler(this.toolStripMenuItem1_Click); - // - // toolStripSeparator14 - // - this.toolStripSeparator14.Name = "toolStripSeparator14"; - this.toolStripSeparator14.Size = new System.Drawing.Size(140, 6); - // // optionsToolMenuItem // this.optionsToolMenuItem.Enabled = false; - this.optionsToolMenuItem.Image = global::bzit.bomg.Properties.Resources.cog; + this.optionsToolMenuItem.Image = global::bzit.bomg.Properties.Resources.settings; this.optionsToolMenuItem.Name = "optionsToolMenuItem"; this.optionsToolMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F12; - this.optionsToolMenuItem.Size = new System.Drawing.Size(143, 22); + this.optionsToolMenuItem.Size = new System.Drawing.Size(141, 22); this.optionsToolMenuItem.Text = "&Options"; - this.optionsToolMenuItem.Click += new System.EventHandler(this.optionsToolStripMenuItem1_Click); + this.optionsToolMenuItem.Click += new System.EventHandler(this.toolsOptionsMenuItem_Click); // // toolStripDropDownButton5 // @@ -409,12 +392,12 @@ namespace bzit.bomg // // viewHelpHelpMenuItem // - this.viewHelpHelpMenuItem.Image = global::bzit.bomg.Properties.Resources.help; + this.viewHelpHelpMenuItem.Image = global::bzit.bomg.Properties.Resources.help_circle; this.viewHelpHelpMenuItem.Name = "viewHelpHelpMenuItem"; this.viewHelpHelpMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F1; this.viewHelpHelpMenuItem.Size = new System.Drawing.Size(146, 22); this.viewHelpHelpMenuItem.Text = "View &Help"; - this.viewHelpHelpMenuItem.Click += new System.EventHandler(this.documentationToolStripMenuItem_Click); + this.viewHelpHelpMenuItem.Click += new System.EventHandler(this.helpViewHelpMenuItem_Click); // // toolStripSeparator12 // @@ -423,31 +406,10 @@ namespace bzit.bomg // // aboutHelpMenuItem // - this.aboutHelpMenuItem.Image = global::bzit.bomg.Properties.Resources.comment; this.aboutHelpMenuItem.Name = "aboutHelpMenuItem"; this.aboutHelpMenuItem.Size = new System.Drawing.Size(146, 22); this.aboutHelpMenuItem.Text = "&About"; - this.aboutHelpMenuItem.Click += new System.EventHandler(this.aboutToolStripMenuItem1_Click); - // - // toolStripDropDownButton7 - // - this.toolStripDropDownButton7.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; - this.toolStripDropDownButton7.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.alwaysOnTopToolStripMenuItem}); - this.toolStripDropDownButton7.ImageTransparentColor = System.Drawing.Color.Magenta; - this.toolStripDropDownButton7.Name = "toolStripDropDownButton7"; - this.toolStripDropDownButton7.ShowDropDownArrow = false; - this.toolStripDropDownButton7.Size = new System.Drawing.Size(16, 22); - this.toolStripDropDownButton7.Text = "&?"; - this.toolStripDropDownButton7.Visible = false; - // - // alwaysOnTopToolStripMenuItem - // - this.alwaysOnTopToolStripMenuItem.Name = "alwaysOnTopToolStripMenuItem"; - this.alwaysOnTopToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.F11))); - this.alwaysOnTopToolStripMenuItem.Size = new System.Drawing.Size(205, 22); - this.alwaysOnTopToolStripMenuItem.Text = "Always On Top"; - this.alwaysOnTopToolStripMenuItem.Click += new System.EventHandler(this.alwaysOnTopToolStripMenuItem_Click); + this.aboutHelpMenuItem.Click += new System.EventHandler(this.helpAboutMenuItem_Click); // // openFileDialog // @@ -474,6 +436,7 @@ namespace bzit.bomg // // toolStripMenuItem15 // + this.toolStripMenuItem15.Image = global::bzit.bomg.Properties.Resources.file_plus; this.toolStripMenuItem15.Name = "toolStripMenuItem15"; this.toolStripMenuItem15.Size = new System.Drawing.Size(138, 22); this.toolStripMenuItem15.Text = "Add &Page"; @@ -481,6 +444,7 @@ namespace bzit.bomg // // toolStripMenuItem16 // + this.toolStripMenuItem16.Image = global::bzit.bomg.Properties.Resources.folder_plus; this.toolStripMenuItem16.Name = "toolStripMenuItem16"; this.toolStripMenuItem16.Size = new System.Drawing.Size(138, 22); this.toolStripMenuItem16.Text = "Add &Folder"; @@ -493,6 +457,7 @@ namespace bzit.bomg // // toolStripMenuItem14 // + this.toolStripMenuItem14.Image = global::bzit.bomg.Properties.Resources.bookmark; this.toolStripMenuItem14.Name = "toolStripMenuItem14"; this.toolStripMenuItem14.Size = new System.Drawing.Size(138, 22); this.toolStripMenuItem14.Text = "&Open All"; @@ -507,6 +472,7 @@ namespace bzit.bomg // // toolStripMenuItem11 // + this.toolStripMenuItem11.Image = global::bzit.bomg.Properties.Resources.trash_2; this.toolStripMenuItem11.Name = "toolStripMenuItem11"; this.toolStripMenuItem11.Size = new System.Drawing.Size(138, 22); this.toolStripMenuItem11.Text = "D&elete"; @@ -531,6 +497,7 @@ namespace bzit.bomg // // toolStripMenuItem12 // + this.toolStripMenuItem12.Image = global::bzit.bomg.Properties.Resources.arrow_up_circle; this.toolStripMenuItem12.Name = "toolStripMenuItem12"; this.toolStripMenuItem12.Size = new System.Drawing.Size(138, 22); this.toolStripMenuItem12.Text = "Move &Up"; @@ -538,6 +505,7 @@ namespace bzit.bomg // // toolStripMenuItem13 // + this.toolStripMenuItem13.Image = global::bzit.bomg.Properties.Resources.arrow_down_circle; this.toolStripMenuItem13.Name = "toolStripMenuItem13"; this.toolStripMenuItem13.Size = new System.Drawing.Size(138, 22); this.toolStripMenuItem13.Text = "Move &Down"; @@ -546,7 +514,7 @@ namespace bzit.bomg // saveFileDialog // this.saveFileDialog.DefaultExt = "jsnx"; - this.saveFileDialog.Filter = "Bookmarks file|*.jsnx|Bookmarks file (password protected)|*.jsnx"; + this.saveFileDialog.Filter = "Bookmarks files (*.jsnx)|*.jsnx|Protected bookmarks files (*.jsnx)|*.jsnx"; this.saveFileDialog.Title = "Save bookmarks file"; // // toolStrip2 @@ -557,8 +525,7 @@ namespace bzit.bomg this.newMenuBarItem, this.openMenuBarItem, this.saveMenuBarItem, - this.toolStripSeparator9, - this.toolStripButton1}); + this.toolStripSeparator9}); this.toolStrip2.Location = new System.Drawing.Point(0, 25); this.toolStrip2.Name = "toolStrip2"; this.toolStrip2.RenderMode = System.Windows.Forms.ToolStripRenderMode.System; @@ -569,51 +536,41 @@ namespace bzit.bomg // newMenuBarItem // this.newMenuBarItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.newMenuBarItem.Image = ((System.Drawing.Image)(resources.GetObject("newMenuBarItem.Image"))); + this.newMenuBarItem.Image = global::bzit.bomg.Properties.Resources.file; this.newMenuBarItem.ImageTransparentColor = System.Drawing.Color.Magenta; this.newMenuBarItem.Name = "newMenuBarItem"; this.newMenuBarItem.Size = new System.Drawing.Size(23, 22); this.newMenuBarItem.Text = "toolStripButton1"; this.newMenuBarItem.ToolTipText = "New"; - this.newMenuBarItem.Click += new System.EventHandler(this.newMenuItem_Click); + this.newMenuBarItem.Click += new System.EventHandler(this.fileNewMenuItem_Click); // // openMenuBarItem // this.openMenuBarItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.openMenuBarItem.Image = global::bzit.bomg.Properties.Resources.folder_page; + this.openMenuBarItem.Image = global::bzit.bomg.Properties.Resources.folder1; this.openMenuBarItem.ImageTransparentColor = System.Drawing.Color.Magenta; this.openMenuBarItem.Name = "openMenuBarItem"; this.openMenuBarItem.Size = new System.Drawing.Size(23, 22); this.openMenuBarItem.Text = "toolStripButton2"; this.openMenuBarItem.ToolTipText = "Open"; - this.openMenuBarItem.Click += new System.EventHandler(this.openMenuItem_Click); + this.openMenuBarItem.Click += new System.EventHandler(this.fileOpenMenuItem_Click); // // saveMenuBarItem // this.saveMenuBarItem.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.saveMenuBarItem.Image = global::bzit.bomg.Properties.Resources.disk; + this.saveMenuBarItem.Image = global::bzit.bomg.Properties.Resources.save; this.saveMenuBarItem.ImageTransparentColor = System.Drawing.Color.Magenta; this.saveMenuBarItem.Name = "saveMenuBarItem"; this.saveMenuBarItem.Size = new System.Drawing.Size(23, 22); this.saveMenuBarItem.Text = "toolStripButton3"; this.saveMenuBarItem.ToolTipText = "Save"; - this.saveMenuBarItem.Click += new System.EventHandler(this.importSnapshotToolStripMenuItem_Click); + this.saveMenuBarItem.Click += new System.EventHandler(this.fileSaveMenuItem_Click); // // toolStripSeparator9 // this.toolStripSeparator9.Name = "toolStripSeparator9"; this.toolStripSeparator9.Size = new System.Drawing.Size(6, 25); // - // toolStripButton1 - // - this.toolStripButton1.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.toolStripButton1.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton1.Image"))); - this.toolStripButton1.ImageTransparentColor = System.Drawing.Color.Magenta; - this.toolStripButton1.Name = "toolStripButton1"; - this.toolStripButton1.Size = new System.Drawing.Size(23, 22); - this.toolStripButton1.Text = "toolStripButton1"; - this.toolStripButton1.Click += new System.EventHandler(this.toolStripButton1_Click); - // // rootTreeNodeMenu // this.rootTreeNodeMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { @@ -628,6 +585,7 @@ namespace bzit.bomg // // toolStripMenuItem17 // + this.toolStripMenuItem17.Image = global::bzit.bomg.Properties.Resources.file_plus; this.toolStripMenuItem17.Name = "toolStripMenuItem17"; this.toolStripMenuItem17.Size = new System.Drawing.Size(132, 22); this.toolStripMenuItem17.Text = "Add &Page"; @@ -635,6 +593,7 @@ namespace bzit.bomg // // toolStripMenuItem18 // + this.toolStripMenuItem18.Image = global::bzit.bomg.Properties.Resources.folder_plus; this.toolStripMenuItem18.Name = "toolStripMenuItem18"; this.toolStripMenuItem18.Size = new System.Drawing.Size(132, 22); this.toolStripMenuItem18.Text = "Add &Folder"; @@ -722,7 +681,7 @@ namespace bzit.bomg private System.Windows.Forms.ContextMenuStrip pageTreeNodeMenu; private System.Windows.Forms.ToolStripMenuItem listViewMenuItem1; private System.Windows.Forms.ToolStripMenuItem moveFileToToolStripMenuItem; - private System.Windows.Forms.ToolTip oToolTip1; + private System.Windows.Forms.ToolTip toolTip1; private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem8; private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem6; private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; @@ -733,7 +692,6 @@ namespace bzit.bomg private System.Windows.Forms.ToolStripMenuItem newFileMenuItem; private System.Windows.Forms.ToolStripMenuItem saveFileMenuItem; private System.Windows.Forms.ToolStripMenuItem saveAsFileMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator6; private System.Windows.Forms.ToolStripMenuItem exitFileMenuItem; private System.Windows.Forms.ToolStripDropDownButton toolStripDropDownButton3; private System.Windows.Forms.ToolStripDropDownButton toolStripDropDownButton4; @@ -742,8 +700,6 @@ namespace bzit.bomg private System.Windows.Forms.ToolStripMenuItem viewHelpHelpMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator12; private System.Windows.Forms.ToolStripMenuItem aboutHelpMenuItem; - private System.Windows.Forms.ToolStripDropDownButton toolStripDropDownButton7; - private System.Windows.Forms.ToolStripMenuItem alwaysOnTopToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem openFileMenuItem; private System.Windows.Forms.ToolStripMenuItem closeFileMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator4; @@ -759,7 +715,6 @@ namespace bzit.bomg private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem12; private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem13; private System.Windows.Forms.ToolStripSeparator toolStripSeparator8; - private System.Windows.Forms.ToolStripMenuItem exportFileMenuItem; private System.Windows.Forms.SaveFileDialog saveFileDialog; private System.Windows.Forms.ToolStrip toolStrip2; private System.Windows.Forms.ToolStripButton newMenuBarItem; @@ -781,9 +736,8 @@ namespace bzit.bomg private System.Windows.Forms.ToolStripMenuItem expandAllViewMenuItem; private System.Windows.Forms.ToolStripMenuItem collapseAllViewMenuItem; private System.Windows.Forms.ToolStripMenuItem findEditMenuItem; - private System.Windows.Forms.ToolStripMenuItem updateIconsToolMenuItem; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator14; - private System.Windows.Forms.ToolStripButton toolStripButton1; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem alwaysOnTopToolStripMenuItem1; } } diff --git a/MainForm.cs b/MainForm.cs index 05ab05d..fc1c8b1 100644 --- a/MainForm.cs +++ b/MainForm.cs @@ -10,7 +10,7 @@ using System.Windows.Forms; using System.Xml; using static RyzStudio.Windows.Forms.BookmarkTreeView; using TextBoxForm = RyzStudio.Windows.ThemedForms.TextBoxForm; - +using Resources = bzit.bomg.Properties.Resources; namespace bzit.bomg { @@ -46,23 +46,6 @@ namespace bzit.bomg this.Close(); } - // toolbar - viewHelpHelpMenuItem.Enabled = File.Exists(Path.ChangeExtension(Application.ExecutablePath, ".chm")); - - - - //bool rv = false; - //string iconDBFilename = Path.ChangeExtension(Application.ExecutablePath, ".db"); - - //string errorMessage; - //rv = treeView1.InitialiseIconDatabase(out errorMessage, iconDBFilename); - //if (!rv) - //{ - // MessageBox.Show("Can not find icon database. [" + errorMessage + "]"); - // this.Close(); - //} - - //sessionFileFormat = new SessionFileFormat(this); this.ApplicationMode = AppMode.Clear; sessionFilename = null; @@ -136,87 +119,70 @@ namespace bzit.bomg { if (this.ApplicationMode == AppMode.Clear) { - this.ApplicationMode = AppMode.Clear; - Application.Exit(); - return; + // do later } - - if (!treeView1.HasChanged) + else { - this.ApplicationMode = AppMode.Clear; - Application.Exit(); - return; + if (treeView1.HasChanged) + { + if (this.ApplicationMode == AppMode.New) + { + DialogResult response = MessageBox.Show("Save bookmarks", "Save?", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); + if (response == DialogResult.Yes) + { + bool hasSaved = saveAsBookmarkFile(); + if (!hasSaved) + { + e.Cancel = true; + return; + } + } + else if (response == DialogResult.No) + { + // do later + } + else if (response == DialogResult.Cancel) + { + e.Cancel = true; + 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) + { + saveBookmarkFile_ForJSNX(sessionFilename); + } + else if (response == DialogResult.No) + { + // do later + } + else if (response == DialogResult.Cancel) + { + e.Cancel = true; + return; + } + } + } + else + { + // do later + } } - //if (this.ApplicationMode == AppMode.Open) - //{ - // if (string.IsNullOrEmpty(sessionFilename)) - // { - // this.ApplicationMode = AppMode.Clear; - // Application.Exit(); - // return; - // } + treeView1.CloseIconDatabase(); - // if (MessageBox.Show("Save changes to open bookmarks.", "Save?", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes) - // { - // this.ApplicationMode = AppMode.Clear; - // Application.Exit(); - // return; - // } + treeView1.Clear(); + this.ApplicationMode = AppMode.Clear; + sessionFilename = null; - // while (true) - // { - // bool rv = sessionFileFormat.saveToRyz(sessionFilename); - // if (!rv) - // { - // switch (MessageBox.Show("There was a problem saving bookmarks. Retry?", "Retry?", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question)) - // { - // case DialogResult.Yes: - // break; - // case DialogResult.No: - // this.ApplicationMode = AppMode.Clear; - // Application.Exit(); - // break; - // case DialogResult.Cancel: - // e.Cancel = true; - // break; - // default: break; - // } - // } - // else - // { - // this.ApplicationMode = AppMode.Clear; - // Application.Exit(); - // break; - // } - // } - //} - //else if (this.ApplicationMode == AppMode.New) - //{ - // if (MessageBox.Show("Save changes to open bookmarks.", "Save?", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) - // { - // bool rt = SaveBookmarkFile(); - // if (rt) - // { - // this.ApplicationMode = AppMode.Clear; - // Application.Exit(); - // return; - // } - // } - // else - // { - // this.ApplicationMode = AppMode.Clear; - // Application.Exit(); - // return; - // } - //} + Application.Exit(); } - //#region public properties - public AppMode ApplicationMode { - get { return appMode; } + get => appMode; set { appMode = value; @@ -225,55 +191,85 @@ namespace bzit.bomg { case AppMode.Clear: this.Text = Properties.Resources.app_name; - statusBarPanel2.Text = string.Empty; - - treeView1.Clear(); - - sessionFilename = null; closeFileMenuItem.Enabled = false; saveFileMenuItem.Enabled = saveMenuBarItem.Enabled = false; saveAsFileMenuItem.Enabled = false; - updateIconsToolMenuItem.Enabled = false; break; case AppMode.Open: closeFileMenuItem.Enabled = true; - saveFileMenuItem.Enabled = saveMenuBarItem.Enabled = false; + saveFileMenuItem.Enabled = saveMenuBarItem.Enabled = true; saveAsFileMenuItem.Enabled = true; - updateIconsToolMenuItem.Enabled = true; break; case AppMode.New: this.Text = Properties.Resources.app_name; - statusBarPanel2.Text = string.Empty; - - sessionFilename = null; closeFileMenuItem.Enabled = true; - saveFileMenuItem.Enabled = saveMenuBarItem.Enabled = false; + saveFileMenuItem.Enabled = saveMenuBarItem.Enabled = true; saveAsFileMenuItem.Enabled = true; - updateIconsToolMenuItem.Enabled = true; break; } } } - //[DefaultValue(null)] - //public IconDatabase IconDatabase { get; set; } - - //#endregion - #region Toolbar #1 - /// - /// File New - /// - /// - /// - private void newMenuItem_Click(object sender, EventArgs e) + private void fileNewMenuItem_Click(object sender, EventArgs e) { + if (this.ApplicationMode == AppMode.Clear) + { + // do later + } + else + { + if (treeView1.HasChanged) + { + if (this.ApplicationMode == AppMode.New) + { + DialogResult response = MessageBox.Show("Save bookmarks", "Save?", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); + if (response == DialogResult.Yes) + { + bool hasSaved = saveAsBookmarkFile(); + if (!hasSaved) + { + return; + } + } + else if (response == DialogResult.No) + { + // do later + } + 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) + { + saveBookmarkFile_ForJSNX(sessionFilename); + } + else if (response == DialogResult.No) + { + // do later + } + else if (response == DialogResult.Cancel) + { + return; + } + } + } + else + { + // do later + } + } + TextBoxForm newSessionForm = new TextBoxForm("New Session", "Name"); string rv = newSessionForm.ShowDialog(); if (string.IsNullOrWhiteSpace(rv)) @@ -281,126 +277,177 @@ namespace bzit.bomg return; } + treeView1.Clear(rv); + + this.ApplicationMode = AppMode.New; + sessionFilename = null; + } + + private void fileOpenMenuItem_Click(object sender, EventArgs e) + { if (this.ApplicationMode == AppMode.Clear) { - + // do later } else { - + if (treeView1.HasChanged) + { + if (this.ApplicationMode == AppMode.New) + { + DialogResult response = MessageBox.Show("Save bookmarks", "Save?", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); + if (response == DialogResult.Yes) + { + bool hasSaved = saveAsBookmarkFile(); + if (!hasSaved) + { + return; + } + } + else if (response == DialogResult.No) + { + // do later + } + 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) + { + saveBookmarkFile_ForJSNX(sessionFilename); + } + else if (response == DialogResult.No) + { + // do later + } + else if (response == DialogResult.Cancel) + { + return; + } + } + } + else + { + // do later + } } - //treeView1.HasChanged.ToString() - - } - - /// - /// File Open - /// - /// - /// - private void openMenuItem_Click(object sender, EventArgs e) - { if (openFileDialog.ShowDialog() == DialogResult.OK) { - //##sessionFilename = openFileDialog.FileName; - loadBookmarkFile(openFileDialog.FileName, openFileDialog.FilterIndex); } } - /** - * File -> Close - */ - private void closeMenuItem_Click(object sender, EventArgs e) + private void fileCloseMenuItem_Click(object sender, EventArgs e) { - //if (ApplicationMode == AppMode.Clear) - //{ - // return; - //} + if (this.ApplicationMode == AppMode.Clear) + { + // do later + } + else + { + if (treeView1.HasChanged) + { + if (this.ApplicationMode == AppMode.New) + { + DialogResult response = MessageBox.Show("Save bookmarks", "Save?", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); + if (response == DialogResult.Yes) + { + bool hasSaved = saveAsBookmarkFile(); + if (!hasSaved) + { + return; + } + } + else if (response == DialogResult.No) + { + // do later + } + 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) + { + saveBookmarkFile_ForJSNX(sessionFilename); + } + else if (response == DialogResult.No) + { + // do later + } + else if (response == DialogResult.Cancel) + { + return; + } + } + } + else + { + // do later + } + } - //if (!treeView1.HasChanged) - //{ - // ApplicationMode = AppMode.Clear; - // return; - //} - - //if (ApplicationMode == AppMode.Open) - //{ - // if (string.IsNullOrEmpty(sessionFilename)) - // { - // ApplicationMode = AppMode.Clear; - // return; - // } - - // if (MessageBox.Show("Save changes to open bookmarks.", "Save?", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes) - // { - // ApplicationMode = AppMode.Clear; - // return; - // } - - // bool rv = sessionFileFormat.saveToRyz(sessionFilename); - // if (!rv) - // { - // if (MessageBox.Show("There was a problem saving bookmarks. Bookmarks are not saved", "Not Saved", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.Cancel) return; - // } - - // ApplicationMode = AppMode.Clear; - //} - //else if (ApplicationMode == AppMode.New) - //{ - // if (MessageBox.Show("Save changes to open bookmarks.", "Save?", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes) - // { - // ApplicationMode = AppMode.Clear; - // return; - // } - - // bool rt = SaveBookmarkFile(); - // if (rt) - // { - // ApplicationMode = AppMode.Clear; - // } - //} + treeView1.Clear(); + this.ApplicationMode = AppMode.Clear; + sessionFilename = null; } - /** - * File -> Save - */ - private void importSnapshotToolStripMenuItem_Click(object sender, EventArgs e) + private void fileSaveMenuItem_Click(object sender, EventArgs e) { - //if (string.IsNullOrEmpty(sessionFilename)) - //{ - // return; - //} - - //bool rv = sessionFileFormat.saveToRyz(sessionFilename); - //if (rv) - //{ - // treeView1.HasChanged = false; - //} + if (this.ApplicationMode == AppMode.New) + { + DialogResult response = MessageBox.Show("Save bookmarks", "Save?", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); + if (response == DialogResult.Yes) + { + bool hasSaved = saveAsBookmarkFile(); + if (!hasSaved) + { + return; + } + } + else if (response == DialogResult.No) + { + return; + } + else if (response == DialogResult.Cancel) + { + return; + } + } + else if (this.ApplicationMode == AppMode.Open) + { + saveBookmarkFile_ForJSNX(sessionFilename); + } } - /** - * File -> Save As - */ - private void exportSnapshotToolStripMenuItem_Click(object sender, EventArgs e) + private void fileSaveAsMenuItem_Click(object sender, EventArgs e) { - //if (SaveBookmarkFile()) - //{ - // ApplicationMode = AppMode.Open; - // treeView1.HasChanged = false; - //} + if (this.ApplicationMode == AppMode.Clear) + { + return; + } + + bool hasSaved = saveAsBookmarkFile(); + if (!hasSaved) + { + return; + } + } + + private void fileExitMenuItem_Click(object sender, EventArgs e) + { + this.Close(); } - /** - * File -> Export - */ - private void toolStripMenuItem7_Click(object sender, EventArgs e) { } - /** - * File -> Exit - */ - private void exitMenuItem_Click(object sender, EventArgs e) => this.Close(); /** * Find @@ -411,10 +458,8 @@ namespace bzit.bomg frm.Show(); } - /** - * View -> Expand All - */ - private void expandAllToolStripMenuItem_Click(object sender, EventArgs e) + + private void viewExpandAllMenuItem_Click(object sender, EventArgs e) { if (treeView1.SelectedNode == null) { @@ -426,10 +471,7 @@ namespace bzit.bomg } } - /** - * View -> Collapse All - */ - private void collapseAllToolStripMenuItem_Click(object sender, EventArgs e) + private void viewCollapseAllMenuItem_Click(object sender, EventArgs e) { if (treeView1.SelectedNode == null) { @@ -441,48 +483,43 @@ namespace bzit.bomg } } - /** - * Tools -> Refresh Icons - */ - private void toolStripMenuItem1_Click(object sender, EventArgs e) + private void viewAlwaysOnTopMenuItem_Click(object sender, EventArgs e) { - if (string.IsNullOrEmpty(sessionFilename)) - { - return; - } + this.TopMost = !this.TopMost; - if (this.ApplicationMode == AppMode.Clear) - { - return; - } - - UpdateIconForm frm = new UpdateIconForm(this); - frm.ShowDialog(); + alwaysOnTopToolStripMenuItem1.Checked = this.TopMost; } /** - * Tools -> Options + * Tools -> Refresh Icons */ - private void optionsToolStripMenuItem1_Click(object sender, EventArgs e) + //private void toolStripMenuItem1_Click(object sender, EventArgs e) + //{ + // if (string.IsNullOrEmpty(sessionFilename)) + // { + // return; + // } + + // if (this.ApplicationMode == AppMode.Clear) + // { + // return; + // } + + // UpdateIconForm frm = new UpdateIconForm(this); + // frm.ShowDialog(); + //} + + private void toolsOptionsMenuItem_Click(object sender, EventArgs e) { //OptionsForm frm = new OptionsForm(this); //frm.ShowDialog(); } - /** - * Help -> Documentation - */ - public void documentationToolStripMenuItem_Click(object sender, EventArgs e) + private void helpViewHelpMenuItem_Click(object sender, EventArgs e) { - string chm = Path.ChangeExtension(Application.ExecutablePath, ".chm"); - if (!File.Exists(chm)) - { - return; - } - try { - System.Diagnostics.Process.Start(chm); + System.Diagnostics.Process.Start(Resources.url_help); } catch { @@ -490,63 +527,24 @@ namespace bzit.bomg } } - /** - * Help -> About - */ - private void aboutToolStripMenuItem1_Click(object sender, EventArgs e) + private void helpAboutMenuItem_Click(object sender, EventArgs e) { - MessageBox.Show("Name: " + Properties.Resources.app_name + Environment.NewLine + "Version: " + Properties.Resources.app_version + Environment.NewLine + "Author: " + Properties.Resources.app_author, "About", MessageBoxButtons.OK, MessageBoxIcon.Information); + try + { + System.Diagnostics.Process.Start(Resources.url_about); + } + catch + { + // do nothing + } } - /** - * ? -> Always-On-Top - */ - private void alwaysOnTopToolStripMenuItem_Click(object sender, EventArgs e) => this.TopMost = !this.TopMost; - #endregion - protected bool SaveBookmarkFile() - { - bool rv = false; - - //if (saveFileDialog.ShowDialog() == DialogResult.OK) - //{ - // switch (saveFileDialog.FilterIndex) - // { - // case 1: - // sessionFileFormat.passkey = ""; - - // rv = sessionFileFormat.saveToRyz(saveFileDialog.FileName); - // break; - // case 2: - // PasswordForm oPassword = new PasswordForm(this); - // sessionFileFormat.passkey = oPassword.ShowDialog(); - - // rv = sessionFileFormat.saveToRyz(saveFileDialog.FileName); - // if (rv) - // { - // treeView1.HasChanged = false; - // } - - // break; - // default: break; - // } - - //} - - //if (rv) - //{ - // ApplicationMode = AppMode.Open; - // sessionFilename = saveFileDialog.FileName; - // this.Text = Path.GetFileNameWithoutExtension(saveFileDialog.FileName) + " - " + Properties.Resources.app_name; - //} - - return rv; - } protected void loadBookmarkFile(string filename, int filterIndex) { @@ -555,7 +553,7 @@ namespace bzit.bomg case 1: if (RyzStudio.IO.SharpZipLib.IsZipEncrypted(filename)) { - PasswordForm passwordForm = new PasswordForm(this); + TextBoxForm passwordForm = new TextBoxForm("Password", "Password", true); string password = string.Empty; while (true) @@ -568,6 +566,8 @@ namespace bzit.bomg if (RyzStudio.IO.SharpZipLib.TestZipEncrypted(filename, password)) { + sessionFilename = filename; + //this.ApplicationMode = AppMode.Open; loadBookmarkFile_ForJSNX(filename, password); break; } @@ -575,6 +575,8 @@ namespace bzit.bomg } else { + sessionFilename = filename; + //this.ApplicationMode = AppMode.Open; loadBookmarkFile_ForJSNX(filename); } @@ -582,7 +584,7 @@ namespace bzit.bomg case 2: if (RyzStudio.IO.SharpZipLib.IsZipEncrypted(filename)) { - PasswordForm passwordForm = new PasswordForm(this); + TextBoxForm passwordForm = new TextBoxForm("Password", "Password", true); string password = string.Empty; while (true) @@ -596,6 +598,9 @@ namespace bzit.bomg if (RyzStudio.IO.SharpZipLib.TestZipEncrypted(filename, password)) { loadBookmarkFile_ForRYZ(filename, password); + + sessionFilename = null; + this.ApplicationMode = AppMode.New; break; } } @@ -603,6 +608,9 @@ namespace bzit.bomg else { loadBookmarkFile_ForRYZ(filename); + + sessionFilename = null; + this.ApplicationMode = AppMode.New; } break; @@ -665,7 +673,16 @@ namespace bzit.bomg break; } + readStream.Flush(); + readStream.Close(); + readStream.Dispose(); + readStream = null; + treeView1.AddItem(rs); + treeView1.HasChanged = false; + this.ApplicationMode = AppMode.Open; + + setAppTitle(Path.GetFileNameWithoutExtension(filename)); } protected void loadBookmarkFile_ForRYZ(string filename, string password = "") @@ -788,10 +805,57 @@ namespace bzit.bomg break; } + readStream.Flush(); + readStream.Close(); + readStream.Dispose(); + readStream = null; + treeView1.AddItem(rs); + treeView1.HasChanged = false; + //this.ApplicationMode = AppMode.New; + + setAppTitle(Path.GetFileNameWithoutExtension(filename)); } - protected void saveBookmarkFile(string filename, string password = "") + protected bool saveAsBookmarkFile() + { + if (saveFileDialog.ShowDialog() == DialogResult.OK) + { + switch (saveFileDialog.FilterIndex) + { + case 1: + saveBookmarkFile_ForJSNX(saveFileDialog.FileName); + + setAppTitle(Path.GetFileNameWithoutExtension(saveFileDialog.FileName)); + + sessionFilename = saveFileDialog.FileName; + this.ApplicationMode = AppMode.Open; + treeView1.HasChanged = false; + break; + case 2: + TextBoxForm passwordForm = new TextBoxForm("Password", "Password", true); + string password = passwordForm.ShowDialog(); + + saveBookmarkFile_ForJSNX(saveFileDialog.FileName, password ?? string.Empty); + + setAppTitle(Path.GetFileNameWithoutExtension(saveFileDialog.FileName)); + + sessionFilename = saveFileDialog.FileName; + this.ApplicationMode = AppMode.Open; + treeView1.HasChanged = false; + break; + default: break; + } + + return true; + } + else + { + return false; + } + } + + protected void saveBookmarkFile_ForJSNX(string filename, string password = "") { List rs = treeView1.GetBookmarkList(); @@ -830,9 +894,14 @@ namespace bzit.bomg zipStream.Close(); zipStream.Dispose(); zipStream = null; + + treeView1.HasChanged = false; } - + protected void setAppTitle(string title) + { + this.Text = title + " - " + Properties.Resources.app_name; + } protected void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) { @@ -1049,15 +1118,5 @@ namespace bzit.bomg #endregion - private void toolStripButton1_Click(object sender, EventArgs e) - { - List rs = treeView1.GetBookmarkList(); - - //string filename = @"N:\test.jsnx"; - - //saveBookmarkFile(filename, string.Empty); - //loadBookmarkFile(filename, string.Empty); - - } } } diff --git a/MainForm.resx b/MainForm.resx index 7a6034f..3cd9a8b 100644 --- a/MainForm.resx +++ b/MainForm.resx @@ -120,27 +120,12 @@ 1034, 17 - + 17, 17 123, 17 - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO - wwAADsMBx2+oZAAAAddJREFUOE+Nk7tLHFEUhzVW/g8KdhIIQVzZUoRgEYiFIRYSCGihYOeDFCmVVKaR - ZWHThHSBFAF7GxFRFN1FxRcoYrGbfbmzO49778zoL+fcZMYZd4Me+Jhizu+bc+7MtEWqi0gQyUfoIZ4R - TZUQQhiu6976vo9WSCmRSqVWqLelJMlhy7Jg23ZIvV5HrVZDsVjUkkKhgHQ63SRpJ5LcQFNAKaWvjGma - MAwDpVJJCxzHAT8kk8kEEl1a4NVzkDe7WhBIONBoNFAul2PrMJzRaSotEGdzEMfTYYPneXrvYJVKpaIn - yefz94K769lO8/D90P6vV9/kyRTkwTjk5TLc6iZ814pJeBI+j2q1ei+Qp5Nf1ekM5Pk83KtlqItFiP1R - WBv9EIcfY5PwOnwmLAoFwFiHOHi7Ks8XSPCFBEtwcu/gZCfge0o3MvSG9LmwhAkFXDd7Iy9F7g3U5RLU - 2SdY6y/gGkdhmOEpgsPlaWICa2f4tciOwN7qg7nxnMZPQP1e06EAnoDhcLNge/BD9kfvd19W4BHi5DPk - 9c+mcJSYgCr8kB4SnSIK3+OMTlP9/ZA87+6h4H9Q7y1ndPpfDdBuNt9oFYjCPdRrUob/3rC6iQGCrU+B - wm3dfwBRcqBbhKA6hAAAAABJRU5ErkJggg== - - 443, 17 @@ -153,41 +138,13 @@ 228, 17 - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHZSURBVDhPjZM7SxxRGIY1qfwPClaCICFkZUsRxELQQkmK - EAjEQsHOCxYpFSttZFmWNJJOsAik2C6wBAkJiu6i4g0iYrGbvbmzO5dzzszE1+87OOOOay4fPEyx5332 - PWfmtDVNJxEj4v+gm3hCtEzMcRwjk8n89n0fjyGlRCKRWKe1j0riHLYsC7Zth9TrddRqNRSLRS0pFApI - JpMtknYizguEEFBK6SdjmiYMw0CpVNICagn+k1QqFUj0aIFXz0Fe72pBIOFAo9FAuVyObIfhjE7TaIE4 - m4M4ng4XeJ6n9x1spVKp6Cb5fP5ecHM122Eevhnc/zS0IU+mIA9eQ16swq1+g+9aEQk34fOoVqv3Ank6 - +UGdzkCez8O9XIX6uQSxPw5r+wXE4WKkCW+Hz4RFoQB49dQ5mPgszxdIsEaCZTi5l3Cy7+B7Si9kXNfV - 58ISJhTwXO+NPRO5UaiLZaiz97C+9sE1jsIwwy2Cw+U2EYG1MzwismOwvz+Hud1L9WNQv77oUAA3YDjc - Kvgx8Da72fPRlxV4hDhZgbzaagk3ExHQhB/SQ5pbNMO/cUanabQgnU7fPBT8Cf7sOaPTd9NPr8f+22UK - uLszJmX49obTRfQTbP0fKNzWdQuznZvllfjFsQAAAABJRU5ErkJggg== - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG - YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9 - 0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw - bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc - VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9 - c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32 - Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo - mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+ - kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D - TgDQASA1MVpwzwAAAABJRU5ErkJggg== - - 705, 17 108 + AAABAAMAMDAAAAEAIACoJQAANgAAACAgAAABACAAqBAAAN4lAAAQEAAAAQAgAGgEAACGNgAAKAAAADAA diff --git a/Properties/Resources.Designer.cs b/Properties/Resources.Designer.cs index fe32468..0fe47ac 100644 --- a/Properties/Resources.Designer.cs +++ b/Properties/Resources.Designer.cs @@ -100,9 +100,9 @@ namespace bzit.bomg.Properties { /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// - internal static System.Drawing.Bitmap cog { + internal static System.Drawing.Bitmap arrow_down_circle { get { - object obj = ResourceManager.GetObject("cog", resourceCulture); + object obj = ResourceManager.GetObject("arrow_down_circle", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } @@ -110,9 +110,9 @@ namespace bzit.bomg.Properties { /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// - internal static System.Drawing.Bitmap comment { + internal static System.Drawing.Bitmap arrow_up_circle { get { - object obj = ResourceManager.GetObject("comment", resourceCulture); + object obj = ResourceManager.GetObject("arrow_up_circle", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } @@ -120,9 +120,29 @@ namespace bzit.bomg.Properties { /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// - internal static System.Drawing.Bitmap disk { + internal static System.Drawing.Bitmap bookmark { get { - object obj = ResourceManager.GetObject("disk", resourceCulture); + object obj = ResourceManager.GetObject("bookmark", 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 file_plus { + get { + object obj = ResourceManager.GetObject("file_plus", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } @@ -150,9 +170,9 @@ namespace bzit.bomg.Properties { /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// - internal static System.Drawing.Bitmap folder_page { + internal static System.Drawing.Bitmap folder_plus { get { - object obj = ResourceManager.GetObject("folder_page", resourceCulture); + object obj = ResourceManager.GetObject("folder_plus", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } @@ -160,9 +180,9 @@ namespace bzit.bomg.Properties { /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// - internal static System.Drawing.Bitmap help { + internal static System.Drawing.Bitmap folder1 { get { - object obj = ResourceManager.GetObject("help", resourceCulture); + object obj = ResourceManager.GetObject("folder1", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } @@ -170,39 +190,9 @@ namespace bzit.bomg.Properties { /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// - internal static System.Drawing.Bitmap magnifier { + internal static System.Drawing.Bitmap help_circle { get { - object obj = ResourceManager.GetObject("magnifier", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap page_white_disk { - get { - object obj = ResourceManager.GetObject("page_white_disk", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap page_white_gray_green { - get { - object obj = ResourceManager.GetObject("page_white_gray_green", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap page_white_star { - get { - object obj = ResourceManager.GetObject("page_white_star", resourceCulture); + object obj = ResourceManager.GetObject("help_circle", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } @@ -217,6 +207,36 @@ namespace bzit.bomg.Properties { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap save { + get { + object obj = ResourceManager.GetObject("save", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap search { + get { + object obj = ResourceManager.GetObject("search", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap settings { + get { + object obj = ResourceManager.GetObject("settings", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// @@ -226,5 +246,33 @@ namespace bzit.bomg.Properties { return ((System.Drawing.Bitmap)(obj)); } } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap trash_2 { + get { + object obj = ResourceManager.GetObject("trash_2", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized string similar to https://www.hiimray.co.uk. + /// + internal static string url_about { + get { + return ResourceManager.GetString("url_about", resourceCulture); + } + } + + /// + /// 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/Properties/Resources.resx b/Properties/Resources.resx index 8637a55..6d715ff 100644 --- a/Properties/Resources.resx +++ b/Properties/Resources.resx @@ -130,43 +130,58 @@ 0.2.1.001 beta - - ..\Resources\cog.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\2\arrow-down-circle.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\comment.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\2\arrow-up-circle.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\disk.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\2\bookmark.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\2\file.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\2\file-plus.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\2\folder.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\folder_page.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\2\folder-plus.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\help.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\magnifier.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\page_white_disk.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\page_white_gray_green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\page_white_star.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\2\help-circle.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a ..\Resources\page_white_world_bw.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\2\save.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\2\search.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\2\settings.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\transmit_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\2\trash-2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + https://www.hiimray.co.uk + + + https://www.hiimray.co.uk/software-bookmark-manager + \ No newline at end of file diff --git a/Resources/2/arrow-down-circle.png b/Resources/2/arrow-down-circle.png new file mode 100644 index 0000000000000000000000000000000000000000..c89f58b626d6cfd3011fc5c679af3d4d5d4dda73 GIT binary patch literal 418 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf2?7 z8z9Vhe8JAOKtah8*NBqf{Irtt#G+J&^73-M%)IR4(g&HG7w0cpTF?LZy>>nTW7N(pHW}XZo&4tOB>rI?)D(|e{Rdqlvww1j+$T7jk6uQZ=5c=J>#)~ubIec!?hZdx|i<=H=G+LGE@7R z&4>(v=STI-d56EPKWEx~F;J&l<41_=FQ)2!&OX(vf>nUw$>8bg K=d#Wzp$P!Kma2^a literal 0 HcmV?d00001 diff --git a/Resources/2/arrow-up-circle.png b/Resources/2/arrow-up-circle.png new file mode 100644 index 0000000000000000000000000000000000000000..c2f96cd4a6f3743ce64f47b334a29d061b1c9ba0 GIT binary patch literal 425 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf2?7 z8z9Vhe8JAOKtah8*NBqf{Irtt#G+J&^73-M%)IR4Y3a~xkS24aQt-+S1B;_#i1+PuxF*}Rie(8*7f*Pl-XGGWuFe|O*IMd=_ zcq1;hy>E`k(2gx?`^r==hfGpVt-0cxbKkuBc{E7l7r2bq)oCp zQhmeV<`PlM*QRUOehOsUR_!_NUf_Mu^kdkSuw?ZWM}GBYzj>^kBOlJ1YkH0IW~*oP zi9+FNi{@?*n0j}E9iMkgC95W1igV4W&fuF{q&o{#*L2AC6o#l|Z&Kv-GV`3w{vt_{ z_t|8*)BlQZ-w(}uY?O5O!n8$d)dseg`(LV_`d40bG-pk+?jN~%r(Nt2?7 z8z9Vhe8JAOKtah8*NBqf{Irtt#G+J&^73-M%)IR4tC-(LL=Mb6>3$HXKn3HiiNK+=!tU8m!4V4SKxH_;q`~AjH=f( jjH1ORYHrT|=~f;PAw4bp&z^rk_cD08`njxgN@xNAMyqM? literal 0 HcmV?d00001 diff --git a/Resources/2/file-plus.png b/Resources/2/file-plus.png new file mode 100644 index 0000000000000000000000000000000000000000..b17222e51d0bba06dc70c9f33b5a75140386f759 GIT binary patch literal 321 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf2?7 z8z9Vhe8JAOKtah8*NBqf{Irtt#G+J&^73-M%)IR4=z%AY-{9R0xe$c_>kbcFI=ZtqESw6DpJvO{k!LJ$T5bpGPQE*1`zg-`i z`%~JUq@Gae+BeN1>519_9t+_Mf-7v#IX8%J*!tu;(~6u4f$4Uv^X4%ZEnq0qbMR0t zVElIA2?7 z8z9Vhe8JAOKtah8*NBqf{Irtt#G+J&^73-M%)IR4z$L!29V-Dvi?_i5QdTDM)@7}p8Da;3zVg)>3Z7g6r zR(PzE`@@0O-+JHw%z1S8#MWaS-kTZ2eq3FkdTG|LBf-KC_}`0u7E#Yxt+3YV{y~4< znl?eR7uOiyy_6Q_*{J7qtFb|o@5W=^_!sSJ5ou`_kC^pCyEP{2?7 z8z9Vhe8JAOKtah8*NBqf{Irtt#G+J&^73-M%)IR44n zWnp#Jkx`VM^f$c5;LnF=duRS^e>gv)vz)y>BKL`2;WVuY3y+Ah@z%+z--t?U64VP= zz_ssy?zMvZ537%B<{3S44C6g0&R1~#az#US&LN4?tSe%lKJ;vA+0c{mxct^04-t#L z^8Nl7!WSIb_Cxub!QtTPJF?j)KbU2hnfdC2Ud*FP7xAo~VCxFsC(rxT&Fi@fwj5v& zefT`W&hTjTs^kP_`5CDd$Moc;n;d3ttN7WxT>Acfd%d;BqM2?7 z8z9Vhe8JAOKtah8*NBqf{Irtt#G+J&^73-M%)IR4w$1lJXA^KIrTcDdr&ACc7b zobkST-Uo>Qm5uLWe;iZ|lNOu4<2Yx`gYq@6q+CCRC|~XEQ!D74J!}X#2^mStiRB7#R%oGXsOCtDnm{r-UW| D=4*dn literal 0 HcmV?d00001 diff --git a/Resources/2/help-circle.png b/Resources/2/help-circle.png new file mode 100644 index 0000000000000000000000000000000000000000..9d6d673ec21fa55b5b65f5caec9f0877dee79242 GIT binary patch literal 435 zcmV;k0ZjghP)evZ~&yqZ1 zD>#)H!8KlSf(8ac=5ZQlSHbPM`5IkJ|C8ZNaIVUk?BFGH?#B_H@r1pMI~$p_@&KJk zyFe=f?qVMwSjo=M&@PlIsY#8Du#ELgzrk^)&xg+hEQK=AQ!#zmz*{NcVE8PG&u19R zxWGFOP|NH?;j=(mm~sgP#xYi5Zx$u=NgLL|S_Sc4YG4_wQWNhA!?rY%mzJYj5v1(g#ig_>zc3s@-lRD<{j72m=W%u!+)C7?2h-O3m>weSUpLqMjR`*! dXyd+$^aUX!N^@W&W3d1L002ovPDHLkV1m+MxV-=X literal 0 HcmV?d00001 diff --git a/Resources/2/save.png b/Resources/2/save.png new file mode 100644 index 0000000000000000000000000000000000000000..b5669a1b2989b0b17ab3732cbea244777d8ca18a GIT binary patch literal 371 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf2?7 z8z9Vhe8JAOKtah8*NBqf{Irtt#G+J&^73-M%)IR4RtA999gzZDTX7fd_^o<)|=1jhEWcrIMKZGLIOgq<7vT2i&Am{2MDpsC8I-kOw z^JhQaHL0p{(&Xaecb4ZXpZ2d%we1v}6>-cq&geeZ?H#?xI+sM>IA|hf5bd$8!&qmk zmZgjN-rqNLew+VW7X^VzG0) z-)#0AGc((?;9=G7h{Mw+e3d#sm**f#2M!ALUK)*A1 My85}Sb4q9e0GK+J1poj5 literal 0 HcmV?d00001 diff --git a/Resources/2/search.png b/Resources/2/search.png new file mode 100644 index 0000000000000000000000000000000000000000..b1feec0ea23cd32bc606380cdffcb8448accca0b GIT binary patch literal 378 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf2?7 z8z9Vhe8JAOKtah8*NBqf{Irtt#G+J&^73-M%)IR4(WFBjK& z{X3)^Rus`DZnHRa%AKB5=3Td&{PyhBW9oPMmNnC5PEt#&O~KN86Rs_(eB;N|`=R^C z3dav}b(;Pk+P+G$NI#7Ke4xzZv=)cn()x=UOusL!vI?Gb-tgE*lW*I$JXiEv(s(x6 zSgYSTb-hoL_pQ$wa{lKOwB{fEyQrsS%X8T`$*2F%tN!7(y=%#tT^4g%ADpjaR4_GU U@w%(=5Eujup00i_>zopr092%+Jpcdz literal 0 HcmV?d00001 diff --git a/Resources/2/settings.png b/Resources/2/settings.png new file mode 100644 index 0000000000000000000000000000000000000000..d0643dedf3b0fb3f68572db256152df36eb5a3f9 GIT binary patch literal 483 zcmV<90UZ8`P)SJCfcJo*|=qi;4l8H-~IFR_h<0Qcb; z-r)(R6ML%;a3kn5y=JY+JPvWK=~%_v+W#n)^V&80c1G;V1AN9AW@Ed9zX|>ry#iUx z2wir*Vhi`3v$CATR^ASl;%h0(UB_MvSCq}~`=6R7#g%l@ZPzx9gE;15Yp3lUh4VkS z9pCfB?%`nt(!vTp)GD>p_EIgGLg$)>^y65$fs15Dp?t8aOgYbfg^j1F@}f59oWjUF zek*$$Xd-WBwo~OM&J<=wVt=hHyMv7iyt(O7{KAiP^F_J3N4Sow`R-m~R1*pOj>o-% Z{sE_RS^{qBODF&U002ovPDHLkV1iv^+i(B? literal 0 HcmV?d00001 diff --git a/Resources/2/svg/arrow-down-circle.svg b/Resources/2/svg/arrow-down-circle.svg new file mode 100644 index 0000000..3238091 --- /dev/null +++ b/Resources/2/svg/arrow-down-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Resources/2/svg/arrow-up-circle.svg b/Resources/2/svg/arrow-up-circle.svg new file mode 100644 index 0000000..044a75d --- /dev/null +++ b/Resources/2/svg/arrow-up-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Resources/2/svg/bookmark.svg b/Resources/2/svg/bookmark.svg new file mode 100644 index 0000000..2239cc5 --- /dev/null +++ b/Resources/2/svg/bookmark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Resources/2/svg/file-plus.svg b/Resources/2/svg/file-plus.svg new file mode 100644 index 0000000..eed1200 --- /dev/null +++ b/Resources/2/svg/file-plus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Resources/2/svg/file-text.svg b/Resources/2/svg/file-text.svg new file mode 100644 index 0000000..4197ddd --- /dev/null +++ b/Resources/2/svg/file-text.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Resources/2/svg/file.svg b/Resources/2/svg/file.svg new file mode 100644 index 0000000..378519a --- /dev/null +++ b/Resources/2/svg/file.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Resources/2/svg/folder-plus.svg b/Resources/2/svg/folder-plus.svg new file mode 100644 index 0000000..898f2fc --- /dev/null +++ b/Resources/2/svg/folder-plus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Resources/2/svg/folder.svg b/Resources/2/svg/folder.svg new file mode 100644 index 0000000..134458b --- /dev/null +++ b/Resources/2/svg/folder.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Resources/2/svg/help-circle.svg b/Resources/2/svg/help-circle.svg new file mode 100644 index 0000000..c9cd11a --- /dev/null +++ b/Resources/2/svg/help-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Resources/2/svg/save.svg b/Resources/2/svg/save.svg new file mode 100644 index 0000000..46c7299 --- /dev/null +++ b/Resources/2/svg/save.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Resources/2/svg/search.svg b/Resources/2/svg/search.svg new file mode 100644 index 0000000..8710306 --- /dev/null +++ b/Resources/2/svg/search.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Resources/2/svg/settings.svg b/Resources/2/svg/settings.svg new file mode 100644 index 0000000..19c2726 --- /dev/null +++ b/Resources/2/svg/settings.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Resources/2/svg/trash-2.svg b/Resources/2/svg/trash-2.svg new file mode 100644 index 0000000..f24d55b --- /dev/null +++ b/Resources/2/svg/trash-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Resources/2/trash-2.png b/Resources/2/trash-2.png new file mode 100644 index 0000000000000000000000000000000000000000..f1fe11328e92d9165c9a2024391b7cd7ccd9cfda GIT binary patch literal 345 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf2?7 z8z9Vhe8JAOKtah8*NBqf{Irtt#G+J&^73-M%)IR44mGtK8J$x%J`i7UF)n+_*ULG)^^Q-)SBR*TmECgaW&J!UwQ{%D zo|7r*>F@5mQK^=`YjK#Dt?+(AV`*c(!JocdvHZ>i(eH)^K3RuX+7$bGtRy6$3gu6K-bk7n*ql#aQuT0q^Rcg7Ttzg-8IHlLVZ zShU8${-t>3R?&Yg_1ss&ejG@jB(GZ#dgA+pbr+ base.ImageList; set => base.ImageList = value; } - //[Browsable(false)] - //public TreeNode[] NodeList - //{ - // get - // { - // TreeNode[] rv = new TreeNode[0]; - // if (this.Nodes.Count <= 0) - // { - // return rv; - // } - - // foreach (TreeNode tn in this.Nodes) - // { - // traverseNodeList(ref rv, tn); - // } - - // return rv; - // } - //} - - //[Browsable(false)] - //public ulong NodeCount - //{ - // get - // { - // return nodeCount; - // } - //} - - //[Browsable(false)] - //public ulong NodeCountCalc - //{ - // get - // { - // ulong rv = 0; - // if (this.Nodes.Count <= 0) - // { - // return rv; - // } - - // foreach (TreeNode tn in this.Nodes) - // { - // traverseNodeCount(ref rv, tn); - // } - - // return rv; - // } - //} - [Browsable(false)] public bool HasChanged { @@ -248,6 +190,26 @@ namespace RyzStudio.Windows.Forms } } + public void Clear() + { + this.Nodes.Clear(); + + this.HasChanged = true; + } + + public void Clear(string name) + { + this.Nodes.Clear(); + this.Nodes.Add("", name?.Trim(), (int)IconSet.Root, (int)IconSet.Root); + + this.HasChanged = true; + } + + public void CloseIconDatabase() + { + iconDatabase.Close(); + } + public NodeType GetNodeType(TreeNode node) { if (node.Tag == null) @@ -319,36 +281,6 @@ namespace RyzStudio.Windows.Forms return rs; } - - - - - - //public string GetNodeFullPath(TreeNode node) - //{ - // string rv = PathEncode(node.Text); - - // TreeNode tn = node; - // while (true) - // { - // tn = tn.Parent; - - // if (tn == null) - // { - // break; - // } - - // if (tn.Level == 0) - // { - // break; - // } - - // //rv = PathEncode(tn.Text) + pathSeparator.ToString() + rv; - // } - - // return rv; - //} - public bool FindTextNode(TreeNode node, string term) { if (node == null) @@ -419,21 +351,6 @@ namespace RyzStudio.Windows.Forms return rt; } - public void Clear() - { - this.Nodes.Clear(); - - this.HasChanged = true; - } - - public void Clear(string name) - { - this.Nodes.Clear(); - this.Nodes.Add("", name?.Trim(), (int)IconSet.Root, (int)IconSet.Root); - - this.HasChanged = true; - } - #endregion #region integrated behaviour diff --git a/bomg.csproj b/bomg.csproj index f6620c3..0de7fdf 100644 --- a/bomg.csproj +++ b/bomg.csproj @@ -180,13 +180,6 @@ TextBoxForm.cs - - Form - - - PasswordForm.cs - - @@ -244,9 +237,6 @@ TextBoxForm.cs - - PasswordForm.cs - ResXFileCodeGenerator Resources.Designer.cs @@ -276,6 +266,19 @@ + + + + + + + + + + + + + From 306f9c17b1609f0ee8b7c6124c39a0b30dbf3c5d Mon Sep 17 00:00:00 2001 From: Ray Date: Mon, 22 Apr 2019 13:30:42 +0100 Subject: [PATCH 08/34] WIP --- Properties/Resources.Designer.cs | 24 ++++++++++++------------ Properties/Resources.resx | 10 +++++----- Resources/2/file-text.png | Bin 0 -> 352 bytes Resources/2/hexagon.png | Bin 0 -> 313 bytes Resources/2/svg/book-open.svg | 1 + Resources/2/svg/circle.svg | 1 + Resources/2/svg/globe.svg | 1 + Resources/2/svg/hexagon.svg | 1 + Windows/Forms/BookmarkTreeView.cs | 4 ++-- bomg.csproj | 5 +++++ 10 files changed, 28 insertions(+), 19 deletions(-) create mode 100644 Resources/2/file-text.png create mode 100644 Resources/2/hexagon.png create mode 100644 Resources/2/svg/book-open.svg create mode 100644 Resources/2/svg/circle.svg create mode 100644 Resources/2/svg/globe.svg create mode 100644 Resources/2/svg/hexagon.svg diff --git a/Properties/Resources.Designer.cs b/Properties/Resources.Designer.cs index 0fe47ac..4751479 100644 --- a/Properties/Resources.Designer.cs +++ b/Properties/Resources.Designer.cs @@ -147,6 +147,16 @@ namespace bzit.bomg.Properties { } } + /// + /// 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. /// @@ -200,9 +210,9 @@ namespace bzit.bomg.Properties { /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// - internal static System.Drawing.Bitmap page_white_world_bw { + internal static System.Drawing.Bitmap hexagon { get { - object obj = ResourceManager.GetObject("page_white_world_bw", resourceCulture); + object obj = ResourceManager.GetObject("hexagon", resourceCulture); return ((System.Drawing.Bitmap)(obj)); } } @@ -237,16 +247,6 @@ namespace bzit.bomg.Properties { } } - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap transmit_blue { - get { - object obj = ResourceManager.GetObject("transmit_blue", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// diff --git a/Properties/Resources.resx b/Properties/Resources.resx index 6d715ff..bdc354f 100644 --- a/Properties/Resources.resx +++ b/Properties/Resources.resx @@ -145,6 +145,9 @@ ..\Resources\2\file-plus.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\2\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 @@ -160,8 +163,8 @@ ..\Resources\2\help-circle.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\page_white_world_bw.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\2\hexagon.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a ..\Resources\2\save.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -172,9 +175,6 @@ ..\Resources\2\settings.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\transmit_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - ..\Resources\2\trash-2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a diff --git a/Resources/2/file-text.png b/Resources/2/file-text.png new file mode 100644 index 0000000000000000000000000000000000000000..4772be984b64d35cc54d6224ad1f30f5f11ee51c GIT binary patch literal 352 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf2?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/2/hexagon.png b/Resources/2/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%)IR4 \ No newline at end of file diff --git a/Resources/2/svg/circle.svg b/Resources/2/svg/circle.svg new file mode 100644 index 0000000..b009088 --- /dev/null +++ b/Resources/2/svg/circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Resources/2/svg/globe.svg b/Resources/2/svg/globe.svg new file mode 100644 index 0000000..0a0586d --- /dev/null +++ b/Resources/2/svg/globe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Resources/2/svg/hexagon.svg b/Resources/2/svg/hexagon.svg new file mode 100644 index 0000000..eae7f25 --- /dev/null +++ b/Resources/2/svg/hexagon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Windows/Forms/BookmarkTreeView.cs b/Windows/Forms/BookmarkTreeView.cs index 5cd01f5..cf067fb 100644 --- a/Windows/Forms/BookmarkTreeView.cs +++ b/Windows/Forms/BookmarkTreeView.cs @@ -52,10 +52,10 @@ namespace RyzStudio.Windows.Forms this.ImageList.TransparentColor = Color.Transparent; this.ImageList.Images.Clear(); - this.ImageList.Images.Add(Resources.transmit_blue); + this.ImageList.Images.Add(Resources.hexagon); this.ImageList.Images.Add(Resources.folder); this.ImageList.Images.Add(Resources.folder_explore); - this.ImageList.Images.Add(Resources.page_white_world_bw); + this.ImageList.Images.Add(Resources.file_text); this.PathSeparator = "\n"; } diff --git a/bomg.csproj b/bomg.csproj index 0de7fdf..7882b90 100644 --- a/bomg.csproj +++ b/bomg.csproj @@ -266,6 +266,11 @@ + + + + + From 196bffb889ddeccdda149c2751679799f0f8ceb3 Mon Sep 17 00:00:00 2001 From: Ray Date: Mon, 22 Apr 2019 15:51:03 +0100 Subject: [PATCH 09/34] WIP --- FindForm.Designer.cs | 129 +++--- FindForm.cs | 70 ++-- FindForm.resx | 25 -- MainForm.Designer.cs | 20 +- MainForm.cs | 40 +- MainForm.resx | 374 ++++++------------ Properties/AssemblyInfo.cs | 2 +- Properties/Resources.Designer.cs | 2 +- Properties/Resources.resx | 2 +- .../ThemedForms/TextBoxForm.Designer.cs | 29 +- RyzStudio/Windows/ThemedForms/TextBoxForm.cs | 13 + Windows/Forms/BookmarkTreeViewSNode.cs | 2 + bomg.csproj | 4 +- bomg2.ico | Bin 0 -> 7886 bytes 14 files changed, 292 insertions(+), 420 deletions(-) create mode 100644 bomg2.ico diff --git a/FindForm.Designer.cs b/FindForm.Designer.cs index e22a971..c0a9dda 100644 --- a/FindForm.Designer.cs +++ b/FindForm.Designer.cs @@ -28,77 +28,94 @@ namespace bzit.bomg /// private void InitializeComponent() { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FindForm)); - this.label1 = new System.Windows.Forms.Label(); - this.textBox1 = new System.Windows.Forms.TextBox(); - this.btnSave = new RyzStudio.Windows.Forms.BigButton(); - this.button3 = new RyzStudio.Windows.Forms.BigButton(); + this.label2 = new System.Windows.Forms.Label(); + this.button1 = new RyzStudio.Windows.ThemedForms.Button(); + this.button2 = new RyzStudio.Windows.ThemedForms.Button(); + this.horizontalSeparator1 = new RyzStudio.Windows.Forms.HorizontalSeparator(); + this.textBox1 = new RyzStudio.Windows.ThemedForms.TextBox(); this.SuspendLayout(); // - // label1 + // label2 // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(12, 12); - this.label1.Margin = new System.Windows.Forms.Padding(3); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(96, 13); - this.label1.TabIndex = 0; - this.label1.Text = "Find a search term"; + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(12, 25); + this.label2.Margin = new System.Windows.Forms.Padding(3); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(27, 13); + this.label2.TabIndex = 72; + this.label2.Text = "Find"; + // + // 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.LabelText = "&Find"; + this.button1.Location = new System.Drawing.Point(150, 77); + 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(108, 32); + this.button1.TabIndex = 1; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // button2 + // + this.button2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.button2.BackColor = System.Drawing.Color.Transparent; + this.button2.DefaultImage = null; + this.button2.DownImage = null; + this.button2.LabelText = "&Next"; + this.button2.Location = new System.Drawing.Point(264, 77); + this.button2.Name = "button2"; + this.button2.OverImage = null; + this.button2.Padding = new System.Windows.Forms.Padding(4, 4, 3, 3); + this.button2.Size = new System.Drawing.Size(108, 32); + this.button2.TabIndex = 2; + this.button2.Click += new System.EventHandler(this.button2_Click); + // + // horizontalSeparator1 + // + this.horizontalSeparator1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.horizontalSeparator1.Location = new System.Drawing.Point(12, 62); + this.horizontalSeparator1.Margin = new System.Windows.Forms.Padding(3, 10, 3, 10); + this.horizontalSeparator1.MaximumSize = new System.Drawing.Size(4920, 2); + this.horizontalSeparator1.Name = "horizontalSeparator1"; + this.horizontalSeparator1.Size = new System.Drawing.Size(360, 2); + this.horizontalSeparator1.TabIndex = 73; // // 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.Location = new System.Drawing.Point(12, 31); - this.textBox1.MaxLength = 128; + this.textBox1.BackColor = System.Drawing.Color.Transparent; + this.textBox1.Location = new System.Drawing.Point(96, 15); + this.textBox1.Margin = new System.Windows.Forms.Padding(10, 6, 10, 6); this.textBox1.Name = "textBox1"; - this.textBox1.Size = new System.Drawing.Size(280, 21); + this.textBox1.Padding = new System.Windows.Forms.Padding(10, 10, 9, 9); + this.textBox1.Size = new System.Drawing.Size(276, 32); + this.textBox1.SubmitButton = this.button2; this.textBox1.TabIndex = 0; - this.textBox1.PreviewKeyDown += new System.Windows.Forms.PreviewKeyDownEventHandler(this.textBox1_PreviewKeyDown); - // - // btnSave - // - this.btnSave.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.btnSave.BackColor = System.Drawing.Color.WhiteSmoke; - this.btnSave.Location = new System.Drawing.Point(196, 67); - this.btnSave.MaximumSize = new System.Drawing.Size(120, 32); - this.btnSave.MinimumSize = new System.Drawing.Size(32, 32); - this.btnSave.Name = "btnSave"; - this.btnSave.Padding = new System.Windows.Forms.Padding(4); - this.btnSave.Size = new System.Drawing.Size(96, 32); - this.btnSave.TabIndex = 22; - this.btnSave.Value = "&Next"; - this.btnSave.Click += new System.EventHandler(this.button1_Click); - // - // button3 - // - this.button3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.button3.BackColor = System.Drawing.Color.WhiteSmoke; - this.button3.Location = new System.Drawing.Point(94, 67); - this.button3.MaximumSize = new System.Drawing.Size(120, 32); - this.button3.MinimumSize = new System.Drawing.Size(32, 32); - this.button3.Name = "button3"; - this.button3.Padding = new System.Windows.Forms.Padding(4); - this.button3.Size = new System.Drawing.Size(96, 32); - this.button3.TabIndex = 23; - this.button3.Value = "&Find"; - this.button3.Click += new System.EventHandler(this.button2_Click); + this.textBox1.UseSystemPasswordChar = false; // // FindForm // this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; this.BackColor = System.Drawing.Color.White; - this.ClientSize = new System.Drawing.Size(304, 111); - this.Controls.Add(this.button3); - this.Controls.Add(this.btnSave); + this.ClientSize = new System.Drawing.Size(384, 121); + this.Controls.Add(this.button1); + this.Controls.Add(this.button2); + this.Controls.Add(this.horizontalSeparator1); this.Controls.Add(this.textBox1); - this.Controls.Add(this.label1); + this.Controls.Add(this.label2); this.Font = new System.Drawing.Font("Tahoma", 8.25F); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.MaximizeBox = false; this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(400, 160); this.Name = "FindForm"; + this.ShowIcon = false; this.ShowInTaskbar = false; this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; @@ -109,10 +126,10 @@ namespace bzit.bomg } #endregion - - private System.Windows.Forms.Label label1; - private System.Windows.Forms.TextBox textBox1; - private RyzStudio.Windows.Forms.BigButton btnSave; - private RyzStudio.Windows.Forms.BigButton button3; + private RyzStudio.Windows.ThemedForms.Button button2; + private RyzStudio.Windows.Forms.HorizontalSeparator horizontalSeparator1; + private RyzStudio.Windows.ThemedForms.TextBox textBox1; + private System.Windows.Forms.Label label2; + private RyzStudio.Windows.ThemedForms.Button button1; } } \ No newline at end of file diff --git a/FindForm.cs b/FindForm.cs index 896c607..083e90c 100644 --- a/FindForm.cs +++ b/FindForm.cs @@ -11,11 +11,36 @@ namespace bzit.bomg public FindForm(MainForm form) { InitializeComponent(); - + + textBox1.PreviewKeyDown += textBox1_PreviewKeyDown; + textBox1.InnerTextBox.PreviewKeyDown += textBox1_PreviewKeyDown; + parentForm = form; } - private void button2_Click(object sender, EventArgs e) + private void textBox1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) + { + switch (e.KeyCode) + { + case Keys.Enter: + if (findNextNew) + { + button2_Click(sender, null); + } + else + { + button1_Click(sender, null); + } + + break; + case Keys.Escape: + this.Close(); + break; + default: break; + } + } + + private void button1_Click(object sender, EventArgs e) { if (parentForm == null) { @@ -31,12 +56,12 @@ namespace bzit.bomg { return; } - + findNextNew = false; - parentForm.treeView1.FindTextNode(parentForm.treeView1.Nodes[0], textBox1.Text.Trim()); + parentForm.treeView1.FindTextNode(parentForm.treeView1.Nodes[0], textBox1.Text?.Trim()); } - private void button1_Click(object sender, EventArgs e) + private void button2_Click(object sender, EventArgs e) { if (parentForm == null) { @@ -57,46 +82,15 @@ namespace bzit.bomg { parentForm.treeView1.SelectedNode = parentForm.treeView1.Nodes[0]; } - + findNextNew = false; - bool rv = parentForm.treeView1.FindTextNode(parentForm.treeView1.SelectedNode, textBox1.Text.Trim()); + bool rv = parentForm.treeView1.SNode.FindTextNode(textBox1.Text?.Trim()); if (!rv) { findNextNew = true; } } -#region behaviour - - private void textBox1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) - { - switch (e.KeyCode) - { - case Keys.Enter: - if (string.IsNullOrEmpty(textBox1.Text)) - { - return; - } - - if (findNextNew) - { - button2_Click(sender, null); - } - else - { - button1_Click(sender, null); - } - - break; - case Keys.Escape: - this.Close(); - break; - default: break; - } - } - -#endregion - } } \ No newline at end of file diff --git a/FindForm.resx b/FindForm.resx index dbc6f20..d58980a 100644 --- a/FindForm.resx +++ b/FindForm.resx @@ -117,29 +117,4 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATXJQDEFmRGgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhZZ0GGmGZrSFm - nP8RWpKHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxcakGKmykrVSM - u/+ItN3/F16W/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDfrYGO3iwrWOW - xP+cwOT/ZZjH/x5knOsAAAAAAAAAAAAAAAAAAAAA3bGOAtmtiZfWqITj06R+/dCfev3Nm3XkoZKJ3nSh - zP+qy+j/daPO/y9vp+snaqInAAAAAAAAAAAAAAAA5LyaAuG3lcDoya3/9eHN//fl0//35dH/893I/9+5 - m//Hp5D/ha3V/0B8tOs4dq4nAAAAAAAAAAAAAAAAAAAAAOjCoZft0Lb/+OjZ//XeyP/z2Lz/89a6//Tb - wf/35NL/37qc/5yTkfdKg7snAAAAAAAAAAAAAAAAAAAAAAAAAADsyKfj9+fX//bhzP/028H/9Nq///PY - vP/z17r/9NvB//Peyf/NnnrnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8M6t/fns3//138j/9d3F//Tc - wv/02sD/89m9//PXvP/45tP/06R+/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPTTs/357eH/9uHM//Xf - yf/13sf/9NzD//Tbwf/02r//+OfW/9ephf0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD317jj+eve//fn - 1v/24cz/9eDK//XeyP/13cT/9uHL//Xi0P/br4vjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+tu8l/ji - zP/67uP/9+fW//bizv/24cv/9uPQ//nq3f/sz7T/37WSlwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPze - vwL6273A+eLN//rs3v/57uL/+e3i//jp2v/w1bz/57+ewOO7mQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAA/N7AAvrcvpf52brj9ta3/fTTs/3xz67j7suql+vFpQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAA//+sQf/nrEH/w6xB/4OsQf8DrEHAA6xBgAesQYAPrEGAH6xBgB+sQYAfrEGAH6xBgB+sQYAf - rEHAP6xB//+sQQ== - - \ No newline at end of file diff --git a/MainForm.Designer.cs b/MainForm.Designer.cs index 0913441..0d91e46 100644 --- a/MainForm.Designer.cs +++ b/MainForm.Designer.cs @@ -115,25 +115,25 @@ namespace bzit.bomg this.listViewMenuItem1, this.moveFileToToolStripMenuItem}); this.pageTreeNodeMenu.Name = "listViewMenu"; - this.pageTreeNodeMenu.Size = new System.Drawing.Size(181, 148); + this.pageTreeNodeMenu.Size = new System.Drawing.Size(139, 126); // // toolStripMenuItem4 // this.toolStripMenuItem4.Image = global::bzit.bomg.Properties.Resources.bookmark; this.toolStripMenuItem4.Name = "toolStripMenuItem4"; - this.toolStripMenuItem4.Size = new System.Drawing.Size(180, 22); + this.toolStripMenuItem4.Size = new System.Drawing.Size(138, 22); this.toolStripMenuItem4.Text = "&Open"; this.toolStripMenuItem4.Click += new System.EventHandler(this.openContextMenu_Click); // // toolStripSeparator3 // this.toolStripSeparator3.Name = "toolStripSeparator3"; - this.toolStripSeparator3.Size = new System.Drawing.Size(177, 6); + this.toolStripSeparator3.Size = new System.Drawing.Size(135, 6); // // toolStripMenuItem8 // this.toolStripMenuItem8.Name = "toolStripMenuItem8"; - this.toolStripMenuItem8.Size = new System.Drawing.Size(180, 22); + this.toolStripMenuItem8.Size = new System.Drawing.Size(138, 22); this.toolStripMenuItem8.Text = "E&dit"; this.toolStripMenuItem8.Click += new System.EventHandler(this.editContextMenu3_Click); // @@ -141,20 +141,20 @@ namespace bzit.bomg // this.toolStripMenuItem6.Image = global::bzit.bomg.Properties.Resources.trash_2; this.toolStripMenuItem6.Name = "toolStripMenuItem6"; - this.toolStripMenuItem6.Size = new System.Drawing.Size(180, 22); + this.toolStripMenuItem6.Size = new System.Drawing.Size(138, 22); this.toolStripMenuItem6.Text = "D&elete"; this.toolStripMenuItem6.Click += new System.EventHandler(this.deleteContextMenu2_Click); // // toolStripSeparator2 // this.toolStripSeparator2.Name = "toolStripSeparator2"; - this.toolStripSeparator2.Size = new System.Drawing.Size(177, 6); + this.toolStripSeparator2.Size = new System.Drawing.Size(135, 6); // // listViewMenuItem1 // this.listViewMenuItem1.Image = global::bzit.bomg.Properties.Resources.arrow_up_circle; this.listViewMenuItem1.Name = "listViewMenuItem1"; - this.listViewMenuItem1.Size = new System.Drawing.Size(180, 22); + this.listViewMenuItem1.Size = new System.Drawing.Size(138, 22); this.listViewMenuItem1.Text = "Move &Up"; this.listViewMenuItem1.Click += new System.EventHandler(this.moveUpContextMenu2_Click); // @@ -162,7 +162,7 @@ namespace bzit.bomg // this.moveFileToToolStripMenuItem.Image = global::bzit.bomg.Properties.Resources.arrow_down_circle; this.moveFileToToolStripMenuItem.Name = "moveFileToToolStripMenuItem"; - this.moveFileToToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.moveFileToToolStripMenuItem.Size = new System.Drawing.Size(138, 22); this.moveFileToToolStripMenuItem.Text = "Move &Down"; this.moveFileToToolStripMenuItem.Click += new System.EventHandler(this.moveDownContextMenu2_Click); // @@ -311,7 +311,7 @@ namespace bzit.bomg this.findEditMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.F))); this.findEditMenuItem.Size = new System.Drawing.Size(137, 22); this.findEditMenuItem.Text = "&Find"; - this.findEditMenuItem.Click += new System.EventHandler(this.toolStripButton5_Click); + this.findEditMenuItem.Click += new System.EventHandler(this.editFindMenuItem_Click); // // toolStripDropDownButton3 // @@ -329,7 +329,6 @@ namespace bzit.bomg // // expandAllViewMenuItem // - this.expandAllViewMenuItem.Enabled = false; this.expandAllViewMenuItem.Name = "expandAllViewMenuItem"; this.expandAllViewMenuItem.Size = new System.Drawing.Size(205, 22); this.expandAllViewMenuItem.Text = "&Expand All"; @@ -337,7 +336,6 @@ namespace bzit.bomg // // collapseAllViewMenuItem // - this.collapseAllViewMenuItem.Enabled = false; this.collapseAllViewMenuItem.Name = "collapseAllViewMenuItem"; this.collapseAllViewMenuItem.Size = new System.Drawing.Size(205, 22); this.collapseAllViewMenuItem.Text = "&Collapse All"; diff --git a/MainForm.cs b/MainForm.cs index fc1c8b1..da89eab 100644 --- a/MainForm.cs +++ b/MainForm.cs @@ -48,21 +48,6 @@ namespace bzit.bomg this.ApplicationMode = AppMode.Clear; sessionFilename = null; - - //treeView1.OnNodeCountUpdate = delegate (ulong v) { - // statusBarPanel2.Text = v.ToString(); - //}; - //treeView1.OnChanged = delegate (object sender, EventArgs ev) { - // if (this.ApplicationMode == AppMode.New) - // { - // saveMenuBarItem.Enabled = saveFileMenuItem.Enabled = false; - // } - // else - // { - // saveMenuBarItem.Enabled = saveFileMenuItem.Enabled = treeView1.HasChanged; - // } - - //}; } protected override void OnShown(EventArgs e) @@ -195,12 +180,14 @@ namespace bzit.bomg closeFileMenuItem.Enabled = false; saveFileMenuItem.Enabled = saveMenuBarItem.Enabled = false; saveAsFileMenuItem.Enabled = false; + findEditMenuItem.Enabled = false; break; case AppMode.Open: closeFileMenuItem.Enabled = true; saveFileMenuItem.Enabled = saveMenuBarItem.Enabled = true; saveAsFileMenuItem.Enabled = true; + findEditMenuItem.Enabled = true; break; case AppMode.New: @@ -209,6 +196,7 @@ namespace bzit.bomg closeFileMenuItem.Enabled = true; saveFileMenuItem.Enabled = saveMenuBarItem.Enabled = true; saveAsFileMenuItem.Enabled = true; + findEditMenuItem.Enabled = true; break; } @@ -447,20 +435,19 @@ namespace bzit.bomg this.Close(); } - - - /** - * Find - */ - private void toolStripButton5_Click(object sender, EventArgs e) + private void editFindMenuItem_Click(object sender, EventArgs e) { - FindForm frm = new FindForm(this); - frm.Show(); + FindForm findForm = new FindForm(this); + findForm.Show(); } - private void viewExpandAllMenuItem_Click(object sender, EventArgs e) { + if (this.ApplicationMode == AppMode.Clear) + { + return; + } + if (treeView1.SelectedNode == null) { treeView1.ExpandAll(); @@ -473,6 +460,11 @@ namespace bzit.bomg private void viewCollapseAllMenuItem_Click(object sender, EventArgs e) { + if (this.ApplicationMode == AppMode.Clear) + { + return; + } + if (treeView1.SelectedNode == null) { treeView1.CollapseAll(); diff --git a/MainForm.resx b/MainForm.resx index 3cd9a8b..b299e1a 100644 --- a/MainForm.resx +++ b/MainForm.resx @@ -147,258 +147,138 @@ - AAABAAMAMDAAAAEAIACoJQAANgAAACAgAAABACAAqBAAAN4lAAAQEAAAAQAgAGgEAACGNgAAKAAAADAA - AABgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAABAAMAICAAAAEAIACoEAAANgAAABgYAAABACAAiAkAAN4QAAAQEAAAAQAgAGgEAABmGgAAKAAAACAA + AABAAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyMjJHMzg56TQ6PbAyMjJcMzMzFAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANDQ0LDMz - M9gzMzO2MzMzajQ0NCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 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 + 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 - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALy8vFTIyMsY+Pj7/aYyV/3zc9P994Pn/XNj3/1LW - 9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW9/9S1vf/UdP0/0uxyv9BgZH/OFFX/zMz - M/8zMzP/MzMz9zMzM7czMzNtMzMzIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxMTEpMjIy3UVFRf9voK3/fN/4/33g - +f923vj/Utb3/1LW9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW - 9/9S1vf/Utb3/07E4f9Flaj/PGVv/zQ7Pf8zMzP/MzMz/zMzM9YzMzOLMTExQTIyMgYAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADIyMkEzMzPuTVBQ/3Sy - wv994Pn/feD5/33g+f9m2vf/Utb3/1LW9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW - 9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1HQ8P9JqMD/QHmH/zdJTv8zMzP/MzMz/zMz - M5sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMTExYDQ0 - NPlUW13/d8HU/33g+f994Pn/feD5/3zf+P9X1/f/Utb3/02/3P9R1fX/Utb3/1LW9/9S1vf/Utb3/1LW - 9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1HV - 9v9NvNf/NkZK/zMzM9kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkZ - GQEzMzOCNTU1/ltpbP95zOH/feD5/33g+f994Pn/feD5/3Pd+P9S1vf/UdT1/zM1Nv88Y2z/T8jm/1LW - 9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW - 9/9S1vf/Utb3/1LW9/9S1vf/PnB9/zIyMv4uLi4XAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAKCgoBzIyMqQ3Nzf/YXd9/3vV7P994Pn/feD5/33g+f994Pn/feD5/2Xa9/9S1vf/UdX2/zMz - M/9BOzv/NkNG/0mqw/9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW - 9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW9/9S1vf/Rper/zMzM/8xMTFUAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAxMTETMjIywjk5Of9miJD/fNv0/33g+f994Pn/feD5/33g+f994Pn/fN/5/1fX - 9/9S1vf/Utb3/zM1Nf+PbGz/cFhY/zQ1Nf9Bf47/UdLy/1LW9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW - 9/9S1vf/Utb3/1HR8f9Ipb3/QX6N/1DP7/9S1vf/Utb3/1LW9/9S1vf/Tb7a/zMzM/8yMjKRAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAADExMSUyMjLaPDw8/2yapv983/j/feD5/33g+f994Pn/feD5/33g - +f994Pn/dt74/1LW9/9S1vf/Utb3/zM3OP+QbGz/sICA/5FsbP9BOzv/OVZd/02/3P9S1vf/Utb3/1LW - 9/9S1vf/Utb3/1DQ8P9IpLv/Pm97/zQ9P/8zMzP/NDk7/1DO7v9S1vf/Utb3/1LW9/9S1vf/UdX2/zZC - Rf8yMjLOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMzMzPTIyMus+QEH/cq28/37g+f994Pn/feD5/33g - +f994Pn/feD5/33g+f994Pn/atv4/1LW9/9S1vf/Utb3/zQ5Ov+Oa2v/sICA/7CAgP+menr/WktL/zQ8 - Pv9HnLL/UdX2/1DP7/9Iorn/Pm15/zQ8Pv87ODj/YU9P/4ppaf9cTEz/PWp2/1LW9/9S1vf/Utb3/1LW - 9/9S1vf/Utb3/z1pdP8yMjL8MTExDgAAAAAAAAAAAAAAAAAAAAAzMzNaMjIy90BGR/93vc7/f+H5/37g - +f994Pn/feD5/33g+f994Pn/feD5/33g+f994Pn/X9n3/1LW9/9S1vf/Utb3/zQ7Pf+Mamr/sICA/7CA - gP+wgID/r39//3xgYP83Njb/Olhf/zQ7Pf88ODj/Y1BQ/4xpaf+sfX3/sICA/6t9ff85Njb/SKO6/1LW - 9/9S1vf/Utb3/1LW9/9S1vf/Utb3/0SQo/8zMzP/NDQ0SAAAAAAAAAAAAAAAADMzM3wyMjL+QExP/3vJ - 3f+B4fn/f+H5/37g+f994Pn/feD5/33g+f994Pn/feD5/33g+f983/j/Vdb3/1LW9/9S1vf/Utb3/zU9 - P/+LaWn/sICA/7CAgP+wgID/sICA/7CAgP+ZcnL/a1VV/41qav+tfn7/sICA/7CAgP+wgID/sICA/4Vm - Zv81PT//UdHx/1LW9/9S1vf/Utb3/1LW9/9S1vf/Utb3/0y30f8zMzP/MzMzhQAAAAAAAAAAAAAAADMz - M900Oz3/etHm/4Lh+f+B4Pn/gOD5/37g+f994Pn/feD5/33g+f994Pn/feD5/33g+f923vj/Utb3/1LW - 9/9S1vf/Utb3/zU/Qv+JaGj/sICA/7CAgP+wgID/sICA/7CAgP+wgID/sICA/7CAgP+wgID/sICA/7CA - gP+wgID/sICA/1pLS/8+cX7/Utb3/1LW9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1HU9P80PD7/MzMzwgAA - AAAAAAAAAAAAADMzM6AzMzP/e9Lo/4Ph+f+B4fn/gOH5/37g+f994Pn/feD5/33g+f994Pn/feD5/33g - +f9t3Pj/Utb3/1LW9/9S1vf/Utb3/zVBRP+IZ2f/sICA/7CAgP+wgID/sICA/7CAgP+wgID/sICA/7CA - gP+wgID/sICA/7CAgP+wgID/qHt7/zY1Nf9JqsP/Utb3/1LW9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW - 9/87YWv/MzMz9ysrKwgAAAAAAAAAADMzM2MzMzP/a6u6/4Ph+f+B4fn/gOH5/3/h+f994Pn/feD5/33g - +f994Pn/feD5/33g+f9m2vf/Utb3/1LW9/9S1vf/TcDc/zQ7Pf+GZmb/sICA/7CAgP+wgID/sICA/7CA - gP+wgID/sICA/7CAgP+wgID/sICA/7CAgP+wgID/gGJi/zVCRf9R1PT/Utb3/1LW9/9S1vf/Utb3/1LW - 9/9S1vf/Utb3/1LW9/9DiJr/MzMz/zIyMj0AAAAAAAAAAC8vLyczMzP/WYON/4Pi+f+B4fn/gOH5/3/h - +f994Pn/feD5/33g+f994Pn/feD5/33g+f9f2ff/Utb3/1HV9v9Flqr/NDs9/1hKSv+ne3v/sICA/7CA - gP+wgID/sICA/7CAgP+wgID/sICA/7CAgP+wgID/sICA/7CAgP+wgID/VEdH/0B5h/9S1vf/Utb3/1LW - 9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW9/9Kr8n/MzMz/zMzM3oAAAAAAAAAADIyMgEzMzPoR1pe/4Pi - +f+B4fn/gOH5/3/h+f994Pn/feD5/33g+f994Pn/feD5/33g+f9a1/f/T8bk/zxkbv85Nzf/f2Ji/69/ - f/+wgID/sICA/7CAgP+wgID/sICA/7CAgP+wgID/sICA/7CAgP+wgID/sICA/7CAgP+leXn/NDQ0/0qu - x/9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW9/9R0fH/NDg5/zMzM7cAAAAAAAAAAAAA - AAAyMjKsNjc3/4Ha8P+B4fn/gOH5/3/h+f9+4Pn/feD5/33g+f994Pn/feD5/33g+f9Lorf/NUBC/1FF - Rf+fdnb/sICA/7CAgP+wgID/sICA/7CAgP+wgID/sICA/7CAgP+wgID/sICA/7CAgP+wgID/sICA/7CA - gP+qfHz/Rj4+/z5ve/9R1fb/Utb3/1LW9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW9/9S1vf/Olpi/zIy - MvAxMTEDAAAAAAAAAAAzMzNvMzMz/3G1xv+C4fn/gOH5/3/h+f9+4Pn/feD5/33g+f994Pn/eNXt/05y - e/82NTX/d11d/65/f/+wgID/sICA/7CAgP+wgID/sICA/7CAgP+wgID/sICA/7CAgP+wgID/sICA/7CA - gP+wgID/sICA/7CAgP+wgID/mnJy/zg2Nv9Flan/Utb3/1LW9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW - 9/9S1vf/QYGR/zMzM/8xMTExAAAAAAAAAAAyMjIyMzMz/16Llv+C4fn/gOH5/3/h+f9+4Pn/feD5/33g - +f9qtMf/O0dK/0tBQf+acnL/sICA/7CAgP+wgID/sICA/7CAgP+wgID/sICA/7CAgP+wgID/sICA/7CA - gP+wgID/sICA/7CAgP+wgID/sICA/7CAgP+wgID/sICA/4JjY/80ODn/S7XQ/1LW9/9S1vf/Utb3/1LW - 9/9S1vf/Utb3/1LW9/9S1vf/SajA/zMzM/8xMTFuAAAAAAAAAAAxMTEDMzMz8UphZ/+C4fn/geH5/3/h - +f9+4Pn/feD5/33g+f9Qd4H/MzU1/0M9Pf9qVFT/j2xs/61+fv+wgID/sICA/7CAgP+wgID/sICA/7CA - gP+wgID/sICA/7CAgP+wgID/sICA/7CAgP+wgID/sICA/7CAgP+wgID/sICA/7CAgP9lUVH/N0hN/0/L - 6v9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW9/9S1vf/UM3s/zM1Nf8yMjKrAAAAAAAAAAAAAAAAMzMztzc6 - O/+B3fT/geD5/3/g+f9+4Pn/feD5/33g+f994Pn/dc7l/1+cq/88ZG7/NDo7/zs4OP9eTU3/hGVl/6d6 - ev+wgID/sICA/7CAgP+wgID/sICA/7CAgP+wgID/sICA/7CAgP+wgID/sICA/7CAgP+wgID/sICA/7CA - gP+sfX3/S0JC/zxlb/9R1fX/Utb3/1LW9/9S1vf/Utb3/1LW9/9S1vf/Utb3/zlTWf8zMzPoLy8vAQAA - AAAAAAAAMTExejMzM/9yu83/geH5/4Dh+f9+4Pn/feD5/33g+f994Pn/feD5/33g+f9T1vf/UM/u/0il - vP8/dIL/NkRI/zU0NP9TRkb/i2lp/7CAgP+wgID/sICA/7CAgP+wgID/sICA/7CAgP+wgID/sICA/7CA - gP+wgID/sICA/7CAgP+wgID/n3V1/zs4OP9Dipz/Utb3/1LW9/9S1vf/Utb3/1LW9/9S1vf/Utb3/0B6 - iP8zMzP/NDQ0JgAAAAAAAAAAMjIyPTMzM/9ekZ3/geD5/4Dg+f9+4Pn/feD5/33g+f994Pn/feD5/33g - +f9Y1/f/Utb3/1LW9/9S1vf/UdT1/0u0z/8+bXj/RT4+/69/f/+wgID/sICA/7CAgP+wgID/sICA/7CA - gP+XcXH/k25u/5Rvb/+WcHD/l3Fx/5lycv+bc3P/nHR0/3hdXf8zNTb/Sq3G/1LW9/9S1vf/Utb3/1LW - 9/9S1vf/Utb3/0eht/8zMzP/MzMzYwAAAAAAAAAAKysrCDMzM/hKZm3/geH5/4Dh+f9/4fn/feD5/33g - +f994Pn/feD5/33g+f9e2Pf/Utb3/1LW9/9S1vf/Utb3/1LW9/9Owt//MzMz/5pycv+wgID/sICA/7CA - gP+wgID/sICA/4dmZv8zNDT/NDg5/zM2N/8zNDT/MzMz/zMzM/8zMzP/MzMz/zMzM/8zMzP/O11l/1LW - 9/9S1vf/Utb3/1LW9/9S1vf/Utb3/0/H5f8zMzP/MTExoAAAAAAAAAAAAAAAADMzM8I3Pj//gN/3/4Dh - +f9/4fn/feD5/33g+f994Pn/feD5/33g+f9m2vf/Utb3/1LW9/9S1vf/Utb3/1LW9/9S1vf/OVRa/3Ja - Wv+wgID/sICA/7CAgP+wgID/oXZ2/zs4OP9Di53/Utb3/1LW9/9S1vf/UdT1/1HS8/9R0fD/UM/u/1DN - 7P9Qy+r/UdHx/1LW9/9S1vf/Utb3/1LW9/9S1vf/Utb3/0/H5P80Oz3/MjIy3QAAAAAAAAAAAAAAADIy - MoYzMzP/ccDU/4Dh+f9/4fn/fuD5/33g+f994Pn/feD5/33g+f9w3fj/Utb3/1LW9/9S1vf/Utb3/1LW - 9/9S1vf/Q4iZ/0pBQf+wgID/sICA/7CAgP+ufn7/UEVF/ztgaf9R1PX/Utb3/1LW9/9S1vf/Utb3/1LW - 9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW9/9S1vf/TLvW/zZHTP8yMjL+MjIyfwAA - AAAAAAAAAAAAADExMUkzMzP/XZak/4Dg+f9/4Pn/fuD5/33g+f994Pn/feD5/33g+f973/j/VNb3/1LW - 9/9S1vf/Utb3/1LW9/9S1vf/TbzX/zMzM/+fdnb/sICA/7CAgP9xWVn/NUFE/0/G5P9S1vf/Utb3/1LW - 9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW9/9Jq8P/NT0//zMz - M/gxMTFdAAAAAAAAAAAAAAAAAAAAADMzMw8yMjL8Smx1/4Dg+P9/4Pj/fuD4/3zg+P984Pj/fOD4/3zg - +P984Pj/Ydn3/1HV9/9R1ff/UdX3/1HV9/9R1ff/UdX2/zdNUv94XV3/r4CA/5Ftbf80NTX/Sae//1HV - 9/9R1ff/UdX3/1HV9/9R1ff/UdX3/1HV9/9R1ff/UdX3/1HV9/9R1ff/UdX3/1HV9/9R1ff/UdX3/0aX - rP8zNjf/MzMz7DExMT8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyMjLON0NG/3/g+P9/4Pj/fuD4/33g - +P984Pj/fOD4/3zg+P984Pj/dN34/1LW9/9R1ff/UdX3/1HV9/9R1ff/UdX3/0GBkP9QRUX/p3p6/0E7 - O/9AfIv/UdX3/1HV9/9R1ff/UdX3/1HV9/9R1ff/UdX3/1HV9/9R1ff/UdX3/1HV9/9R1ff/UdX3/1HV - 9/9R1fb/QYGR/zMzM/8zMzPbMzMzJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzMzORMzMz/3HH - 3P9/4Pj/fuD4/33g+P984Pj/fOD4/3zg+P984Pj/fOD4/1/Z9/9R1ff/UdX3/1HV9/9R1ff/UdX3/0u1 - z/80MzP/VEdH/zlUWv9R0vL/UdX3/1HV9/9R1ff/UdX3/1HV9/9R1ff/UdX3/1HV9/9R1ff/UdX3/1HV - 9/9R1ff/UdX3/1HQ8P89a3f/MzMz/zMzM8QzMzMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAzMzNUMzMz/16drf9/4Pj/fuD4/33g+P984Pj/fOD4/3zg+P984Pj/fOD4/3fe+P9T1vf/UdX3/1HV - 9/9R1ff/UdX3/1HV9v82Rkr/NDs8/02+2v9R1ff/UdX3/1HV9/9R1ff/UdX3/1HV9/9R1ff/UdX3/1HV - 9/9R1ff/UdX3/1HV9/9R1ff/T8nn/zpZYP8zMzP/MjIypzMzMwgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAzMzMYMjIy/0t0fv+A4Pj/fuD4/33g+P984Pj/fOD4/3zg+P984Pj/fOD4/3zg - +P9r3Pj/Utb3/1HV9/9R1ff/UdX3/1HV9/9Gm7D/SKS7/1HV9/9R1ff/UdX3/1HV9/9R1ff/UdX3/1HV - 9/9R1ff/UdX3/1HV9/9R1ff/UdX3/1HV9/9Nvdn/N0pP/zMzM/4yMjKFHh4eAgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMzMz2TlHS/9uxdv/fuD4/33g+P984Pj/fOD4/3zg - +P984Pj/fOD4/3zg+P983/j/ZNr3/1HV9/9R1ff/UdX3/1HV9/9R1ff/UdX3/1HV9/9R1ff/UdX3/1HV - 9/9R1ff/UdX3/1HV9/9R1ff/UdX3/1HV9/9R1ff/UdX3/0qtxv81P0H/MzMz+TExMWEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMjIynDMzM/8zMzP/PUxQ/1aB - jP9ttsj/fNz0/3zg+P984Pj/fOD4/3zg+P984Pj/fN/4/2PZ9/9R1ff/UdX3/1HV9/9R1ff/UdX3/1HV - 9/9R1ff/UdX3/1HV9/9R1ff/UdX3/1HV9/9R1ff/UdX3/1HV9/9R1ff/Rpuw/zM3OP8yMjLvMDAwQgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMjIyBjAw - MEQxMTGOMjIy2TMzM/8zMzP/OkBB/1BweP9mo7L/edLp/3zg+P984Pj/fOD4/3zf+P9o2/j/Utb3/1HV - 9/9R1ff/UdX3/1HV9/9R1ff/UdX3/1HV9/9R1ff/UdX3/1HV9/9R1ff/UdX3/1HV9v9ChZX/MzMz/zMz - M94vLy8qAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAADIyMiUyMjJwMjIyuzIyMvgzMzP/NTU2/0ZaX/9cjZn/cb/S/3ze - 9/984Pj/ct34/1jX9/9R1ff/UdX3/1HV9/9R1ff/UdX3/1HV9/9R1ff/UdX3/1HV9/9R1ff/UdHy/z5v - e/8zMzP/MzMzyDMzMxcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMzMw0yMjJSMzMznTMz - M+UzMzP/MzMz/zxFR/9QdX//Zai4/3fV7f9p2/j/Vdb3/1HV9/9R1ff/UdX3/1HV9/9R1ff/UdX3/1HV - 9/9Pyun/Oltk/zMzM/8zMzOsMzMzCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAADQ0NAIwMDAzMjIyfjIyMskyMjL8MzMz/zQ3N/9EXmX/V5Cf/1u/2P9Y1vb/Utb3/1HV - 9/9R1ff/UdX3/02/3P83TFH/MjIy/jExMYozMzMCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuLi4YMTExXzExMaoyMjLvMzMz/zMz - M/85SU3/RHmG/0qowP9R0PD/SrHK/zVAQ/8zMzP6MDAwZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAxMTEGNDQ0QDMzM4syMjLWMzMz/zMzM/80Ojz/Mzg5/zMzM/ExMTFHAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMzMzIjIyMm0zMzO3MjIy2DAwMC0AAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAP///////0h0//+D////SHT//wA///9IdP/+AAf//0h0//gAAH//SHT/8AAAD/9IdP/g - AAAB/0h0/8AAAAAfSHT/gAAAAB9IdP8AAAAAH0h0/AAAAAAPSHT4AAAAAA9IdPAAAAAAD0h04AAAAAAP - SHTAAAAAAAdIdIAAAAAAB0h0AAAAAAAHSHQAAAAAAAdIdAAAAAAAA0h0AAAAAAADSHQAAAAAAANIdAAA - AAAAA0h0gAAAAAABSHSAAAAAAAFIdIAAAAAAAUh0gAAAAAABSHTAAAAAAABIdMAAAAAAAEh0wAAAAAAA - SHTAAAAAAABIdOAAAAAAAEh04AAAAAAASHTgAAAAAAFIdOAAAAAAA0h08AAAAAAHSHTwAAAAAA9IdPAA - AAAAH0h08AAAAAA/SHT4AAAAAP9IdPgAAAAB/0h0+AAAAAP/SHT/gAAAB/9IdP/wAAAP/0h0//4AAB// - SHT//+AAf/9IdP///AD//0h0////wf//SHT///////9IdCgAAAAgAAAAQAAAAAEAIAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAMzMzRjMzM+EzMzOnMzMzXDQ0NBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAADMzM2M4Ozv6SZKk/0KFlf85VFv/MzQ0+zMzM8QzMzN3MTExLCoqKgEAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAADMzMwEyMjKEQ0tN/3C+0f9T1vf/Utb3/1LW9/9OxuT/Rper/zxncf80Ozz/MjIy3zIy - MpMzMzNINjY2CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAyMjIHMjIypE9cYP95zeL/atv4/1LW9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1HR - 8f9JqcH/QHiH/zdITf8zMzPzMzMzsDMzM2QzMzMaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAMTExEjQ0NL9Zb3T/e9Xs/3zf+P9a1/f/Utb3/1LW9/9S1vf/Utb3/1LW - 9/9S1vf/Utb3/1LW9/9S1vf/UdX2/0y71v9Dipz/Oltj/zM1Nv0zMzPLMjIygDMzMxwAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAADExMSE3NzfXYYGJ/3zb8/994Pj/dd74/1LW9/9R0fH/Utb3/1LW - 9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW9/9S1vf/T8vp/0edsv85Uln/MzMzgwAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxMTE2OTo66GiUn/983vf/feD5/33g+f9m2vf/UdX2/zQ9 - P/9Gma7/UdX2/1LW9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1LW9/9S1vf/Utb3/0WW - qv8yMjK/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMTExTzw9PfVtprT/fd/4/33g+P994Pj/feD4/1nX - 9/9S1fb/RD4+/2BPT/8+bnr/UM3t/1LW9/9S1vf/Utb3/1LW9/9S1vf/Utb3/1HS8/9Krsf/UdT1/1LW - 9/9S1vf/TbzY/zIyMvUuLi4HAAAAAAAAAAAAAAAAAAAAADExMW4+QkP8crbH/33g+f994Pn/feD5/33g - +f933vj/Utb3/1LW9/9HQkP/r39//4FjY/89TlP/S7XQ/1LW9/9S1vf/UdLz/0mowP8/cn//QUZJ/zU8 - Pv9R0fH/Utb3/1LW9/9R1fb/NUBD/zIyMjkAAAAAAAAAADY2NgMzMzOPQUpM/3fE1/9+4Pj/feD4/33g - +P994Pj/feD4/2zc+P9S1vf/Utb3/0ZDRP+wgID/sICA/5x0dP9LRkf/QoSU/z9yf/9CR0r/aFNT/5Ft - bf+RbW3/Pm56/1LW9/9S1vf/Utb3/1LW9/88ZnH/MzMzdQAAAAAAAAAAMzMzrEFRVP97zuP/gOH5/37g - +f994Pn/feD5/33g+f994Pn/Ydn3/1LW9/9S1vf/RURG/7CAgP+wgID/sICA/6x9ff96X1//km1t/65/ - f/+wgID/sICA/2dTU/9Jpr7/Utb3/1LW9/9S1vf/Utb3/0SNn/8zMzOxAAAAAAAAAAAzMzPSZqe2/4Lh - +P+A4fj/fuD4/33g+P994Pj/feD4/33g+P9Y1/f/Utb3/1LW9/9ERUf/sICA/7CAgP+wgID/sICA/7CA - gP+wgID/sICA/7CAgP+uf3//QEZJ/1HS8v9S1vf/Utb3/1LW9/9S1vf/S7PN/zMzM+wyMjIBAAAAADIy - MpVXgYz/guH5/4Dh+f9+4Pn/feD5/33g+f994Pn/e9/4/1LW9/9S1vf/TLrW/0RCQ/+wgID/sICA/7CA - gP+wgID/sICA/7CAgP+wgID/sICA/45ra/8/dIH/Utb3/1LW9/9S1vf/Utb3/1LW9/9R0vL/NDo8/zEx - MSsAAAAAMjIyWUZZXv+D4fj/gOH4/37g+P993/j/fd/4/33f+P913vj/UdT1/0SOof9JRUf/mHFx/7CA - gP+wgID/sICA/7CAgP+wgID/sICA/7CAgP+wgID/Y1FR/0qsxf9S1vb/Utb2/1LW9v9S1vb/Utb2/1LW - 9v87XWb/MzMzZwAAAAAxMTEdNTc3/4Hb8f+B4fj/f+D4/33f+P993/j/fd/4/2zL4v88Xmf/a1VV/6x9 - ff+wgID/sICA/7CAgP+wgID/sICA/7CAgP+wgID/sICA/7CAgP9pVFT/RI+i/1LW9v9S1vb/Utb2/1LW - 9v9S1vb/Utb2/0KElP8yMjKjAAAAAAAAAAAzMzPfcLbH/4Hh+P9/4Pj/feD4/3zf+P9jpLT/RkdJ/49s - bP+wgID/sICA/7CAgP+wgID/sICA/7CAgP+wgID/sICA/7CAgP+wgID/sICA/6x9ff9MRkf/S7PN/1LW - 9v9R1vb/Utb2/1HW9v9S1vb/SarC/zIyMt8AAAAAAAAAADIyMqNdjJj/geH4/3/h+P994Pj/dc/m/z1M - UP9UR0f/gGJi/6V5ef+wgID/sICA/7CAgP+wgID/sICA/7CAgP+wgID/sICA/7CAgP+wgID/sICA/551 - df8+S1D/T8rp/1HW9v9R1vb/Udb2/1HW9v9Qzu3/MzU2/jExMR0AAAAAMjIyZ0liaP+B4fj/f+H4/33g - +P993/j/fN/4/2bB2P9DiZv/O1lg/1BGR/92XFz/n3V1/7CAgP+wgID/sICA/7CAgP+wgID/sICA/7CA - gP+wgID/sICA/4hnZ/88ZG7/UdX1/1HW9v9R1vb/Udb2/1HW9v85VFv/MzMzWQAAAAAxMTErNzw9/4Dd - 9f9/4fj/feD4/33f+P993/j/ct34/1LW9v9S1vb/T8fl/0aXq/9DREb/r39//7CAgP+wgID/sICA/6Z5 - ef+LaWn/jWpq/49ra/+QbGz/km1t/1VISP9Dipz/Utb2/1LW9v9S1vb/Utb2/0B7if8yMjKVAAAAADMz - MwEzMzPscb3Q/4Dh+P9+4Pj/fd/4/33f+P953/j/Utb3/1LW9v9S1vb/Utb2/z1rd/+WcHD/sICA/7CA - gP+uf3//UkdI/0B7if9Bf47/QX2M/0B7iv9AeYf/QHeF/0OHmP9S1vb/Utb2/1LW9v9S1vb/R5+1/zIy - MtEAAAAAAAAAADMzM7Fdk6H/gOH4/37g+P993/j/fd/4/3zf+P9X1/f/Udb2/1HW9v9R1vb/R5+1/25X - V/+wgID/sICA/3RbW/9BgJD/Udb2/1HW9v9R1vb/Udb2/1HW9v9R1vb/Udb2/1HW9v9R1vb/Udb2/07B - 3v84TVL/MjIyrQAAAAAAAAAAMjIydUpqcv+A4fj/fuD4/33f+P993/j/fd/4/2Ta9/9R1vb/Udb2/1HW - 9v9Qze3/SERF/69/f/+Ub2//PFde/1HS8/9R1vb/Udb2/1HW9v9R1vb/Udb2/1HW9v9R1vb/Udb2/1HW - 9v9LtM7/NUJF/zIyMpEuLi4DAAAAAAAAAAAyMjI5N0FD/3/g+P9+4Pj/fd/4/33f+P993/j/dd74/1LW - 9/9R1vb/Udb2/1HW9v88Y23/lnBw/0VGR/9Nv9v/Udb2/1HW9v9R1vb/Udb2/1HW9v9R1vb/Udb2/1HW - 9v9R1vb/SKS7/zQ6O/wzMzNwAAAAAAAAAAAAAAAAAAAAADQ0NAczMzP1ccXa/37g+P993/j/fd/4/33f - +P993/j/YNn3/1LW9v9S1vb/Utb2/0WWqv89OTn/Rpqu/1LW9v9S1vb/Utb2/1LW9v9S1vb/Utb2/1LW - 9v9S1vb/UtX2/0SRpP8zNDX1MzMzUQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADMzM79fnKv/f+D4/33g - +P994Pj/feD4/33g+P953/j/Vtb3/1LW9/9S1vb/T8nn/0KDk/9R1fb/Utb2/1LW9/9S1vb/Utb3/1LW - 9v9S1vf/Utb2/1HU9f9AfIv/MjIy6TExMTcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMjIygz9U - Wv9jpbX/edXt/33f+P993/j/fd/4/33f+P9z3fj/VNb3/1HW9v9R1vb/Udb2/1HW9v9R1vb/Udb2/1HW - 9v9R1vb/Udb2/1HW9v9Q0O//PWhy/zIyMtcxMTEiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAyMjIdMTExgjIyMs41Nzf+SGFn/1+Vo/90yN3/fN/4/33f+P9z3fj/Vtf3/1HW9v9R1vb/Udb2/1HW - 9v9R1vb/Udb2/1HW9v9R1vb/T8jm/zlXXv8yMjLBMDAwEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAADIyMhwyMjJmMjIysjMzM/RATlL/VoGM/2uzxv932/T/Ydn3/1LW - 9/9R1vf/Udb3/1HW9/9R1vf/Udb3/0292f83SU7/MzMzpjMzMwcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANDQ0CTIyMkoyMjKWMjIy4Tc9 - Pv9Ka3T/V5yu/1fJ5f9T1vf/Udb2/1HW9v9Kr8n/NT9C/zIyMoYzMzMBAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAApKSkBMTExLjIyMnozMzPFMzQ0/DtWXf9Dhpf/RZKl/zM4OfoxMTFlAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyMjIVMzMzXTIyMqkzMzPhMTExRwAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////g////wA///wAB//4AAD/8AAAH+AAAB/AA - AAfgAAADwAAAAwAAAAMAAAADAAAAAQAAAAEAAAABAAAAAYAAAAGAAAAAgAAAAIAAAACAAAAAwAAAAMAA - AADAAAADwAAAB+AAAA/gAAAf4AAAP/wAAH//gAD///AD////B/8oAAAAEAAAACAAAAABACAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANzo7bj5ocuM2R0ueMzMzVDEx - MRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvLy8EQUpMlmeyxf9S1vf/UdT0/0ux - yv9Cg5P7Ol1mwTM2NngzMzMvMjIyAQAAAAAAAAAAAAAAAAAAAAAyMjIQSlpeunbH3P9m2vf/UM/v/1HV - 9v9R1fb/UdX2/1HV9v9PxuT/Rpmu/zxkbuMyMjIvAAAAAAAAAAAxMTEkUGpx13rU6/983/j/V9f3/09T - V/9Lq8P/UdX2/1HV9v9R1fb/TLnU/1HU9f9OxOH/MjIydgAAAAAzMzM/V3uF7Hzc9P983/n/dd74/1HV - 9v97YWL/km5u/0+Dkf9RiJf/b2xx/1deY/9R1fb/UdX2/zhRV7QAAAAASGJp5YHg+P994Pn/fN/5/2vb - +P9R1fb/emJj/6+AgP+sfn7/r39//61+fv9Mi5z/UdX2/1HV9v8/c4DvLy8vA0FQU66B4fj/fuD5/3zf - +f9i0e3/U3+M/5pzc/+vgID/r4CA/6+AgP+Namr/TLvW/1HV9v9R1fb/Rpit/zIyMjEzMzNweMvg/37g - +f9rt8r/bWZq/6t9ff+vgID/r4CA/6+AgP+vgID/qHt7/1GAjf9R1fb/UdX2/03A3P8yMjJwMjIyMmSg - r/9+4Pn/dtHo/1Scr/9efIf/fmlq/6+AgP+vgID/r4CA/6+AgP+acnL/S5uw/1HV9v9R1fb/N0xSri8v - LwNSeILwf+D5/3zf+f9m2vf/UdX2/0iku/+gdnb/qHt7/1F1gP9LkKL/TY+h/0iTpv9R1fb/UdX2/ztf - Z+UAAAAAQFJXtH/g+P993/n/ct34/1HV9v9R0PD/eWVn/2Jsc/9R0fH/UdX2/1HV9v9R1fb/UdHx/z5x - fuwyMjI/AAAAADMzM3Z1zeP/fd/5/3zf+P9d2Pf/UdX2/0Z7if9Nvtv/UdX2/1HV9v9R1fb/T8fm/zte - ZtczMzMkAAAAAAAAAAAyMjIvSWhv5GKhsf930ej/ed/4/1nX9/9R1fb/UdX2/1HV9v9R1fb/TLnV/zdO - U7sxMTEQAAAAAAAAAAAAAAAAAAAAACwsLAEyMjIwNTc3eUhiacJWiZX7VrTM/1PU9P9R1fb/Saa+/zVB - RJczMzMEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwEDIyMlU4SEyePWhz4zM3 - OG4AAAAAAAAAAAAAAAAAAAAAAAAAAP//rEH4P6xB4AOsQcABrEGAAaxBAAGsQQAArEEAAKxBAACsQQAA - rEEAAKxBgACsQYABrEGAA6xBwAesQfwfrEE= + 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/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index 8bbc9a6..87e3ca7 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.2.1.001")] +[assembly: AssemblyVersion("0.2.1.012")] [assembly: AssemblyFileVersion("0.1.0.0")] diff --git a/Properties/Resources.Designer.cs b/Properties/Resources.Designer.cs index 4751479..ba0cfae 100644 --- a/Properties/Resources.Designer.cs +++ b/Properties/Resources.Designer.cs @@ -89,7 +89,7 @@ namespace bzit.bomg.Properties { } /// - /// Looks up a localized string similar to 0.2.1.001 beta. + /// Looks up a localized string similar to 0.2.1.012 beta. /// internal static string app_version { get { diff --git a/Properties/Resources.resx b/Properties/Resources.resx index bdc354f..833b209 100644 --- a/Properties/Resources.resx +++ b/Properties/Resources.resx @@ -128,7 +128,7 @@ Bookmark Manager - 0.2.1.001 beta + 0.2.1.012 beta ..\Resources\2\arrow-down-circle.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a diff --git a/RyzStudio/Windows/ThemedForms/TextBoxForm.Designer.cs b/RyzStudio/Windows/ThemedForms/TextBoxForm.Designer.cs index 9e5fa61..d6b58a9 100644 --- a/RyzStudio/Windows/ThemedForms/TextBoxForm.Designer.cs +++ b/RyzStudio/Windows/ThemedForms/TextBoxForm.Designer.cs @@ -33,10 +33,10 @@ namespace RyzStudio.Windows.ThemedForms this.label2 = new System.Windows.Forms.Label(); this.horizontalSeparator1 = new RyzStudio.Windows.Forms.HorizontalSeparator(); this.SuspendLayout(); - // + // // textBox1 - // - this.textBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + // + 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.Location = new System.Drawing.Point(96, 15); @@ -47,9 +47,10 @@ namespace RyzStudio.Windows.ThemedForms this.textBox1.SubmitButton = this.button2; this.textBox1.TabIndex = 0; this.textBox1.UseSystemPasswordChar = false; - // + this.textBox1.PreviewKeyDown += new System.Windows.Forms.PreviewKeyDownEventHandler(this.textBox1_PreviewKeyDown); + // // button2 - // + // this.button2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.button2.BackColor = System.Drawing.Color.Transparent; this.button2.DefaultImage = null; @@ -62,9 +63,9 @@ namespace RyzStudio.Windows.ThemedForms this.button2.Size = new System.Drawing.Size(108, 32); this.button2.TabIndex = 1; this.button2.Click += new System.EventHandler(this.button2_Click); - // + // // label2 - // + // this.label2.AutoSize = true; this.label2.Location = new System.Drawing.Point(12, 25); this.label2.Margin = new System.Windows.Forms.Padding(3); @@ -72,10 +73,10 @@ namespace RyzStudio.Windows.ThemedForms this.label2.Size = new System.Drawing.Size(34, 13); this.label2.TabIndex = 67; this.label2.Text = "Name"; - // + // // horizontalSeparator1 - // - this.horizontalSeparator1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + // + this.horizontalSeparator1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.horizontalSeparator1.Location = new System.Drawing.Point(12, 62); this.horizontalSeparator1.Margin = new System.Windows.Forms.Padding(3, 10, 3, 10); @@ -83,9 +84,9 @@ namespace RyzStudio.Windows.ThemedForms this.horizontalSeparator1.Name = "horizontalSeparator1"; this.horizontalSeparator1.Size = new System.Drawing.Size(360, 2); this.horizontalSeparator1.TabIndex = 69; - // - // NewSessionForm - // + // + // TextBoxForm + // this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; this.BackColor = System.Drawing.Color.White; this.ClientSize = new System.Drawing.Size(384, 121); @@ -97,7 +98,7 @@ namespace RyzStudio.Windows.ThemedForms this.MaximizeBox = false; this.MinimizeBox = false; this.MinimumSize = new System.Drawing.Size(400, 160); - this.Name = "NewSessionForm"; + this.Name = "TextBoxForm"; this.ShowIcon = false; this.ShowInTaskbar = false; this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; diff --git a/RyzStudio/Windows/ThemedForms/TextBoxForm.cs b/RyzStudio/Windows/ThemedForms/TextBoxForm.cs index ba3c49e..7bbca82 100644 --- a/RyzStudio/Windows/ThemedForms/TextBoxForm.cs +++ b/RyzStudio/Windows/ThemedForms/TextBoxForm.cs @@ -9,6 +9,9 @@ namespace RyzStudio.Windows.ThemedForms { InitializeComponent(); + textBox1.PreviewKeyDown += textBox1_PreviewKeyDown; + textBox1.InnerTextBox.PreviewKeyDown += textBox1_PreviewKeyDown; + this.Text = title; label2.Text = labelText; textBox1.Text = defaultValue; @@ -18,16 +21,23 @@ namespace RyzStudio.Windows.ThemedForms { InitializeComponent(); + textBox1.PreviewKeyDown += textBox1_PreviewKeyDown; + textBox1.InnerTextBox.PreviewKeyDown += textBox1_PreviewKeyDown; + this.Text = title; label2.Text = labelText; textBox1.Text = defaultValue; textBox1.UseSystemPasswordChar = password; + } public TextBoxForm(string title, string labelText) { InitializeComponent(); + textBox1.PreviewKeyDown += textBox1_PreviewKeyDown; + textBox1.InnerTextBox.PreviewKeyDown += textBox1_PreviewKeyDown; + this.Text = title; label2.Text = labelText; } @@ -36,6 +46,9 @@ namespace RyzStudio.Windows.ThemedForms { InitializeComponent(); + textBox1.PreviewKeyDown += textBox1_PreviewKeyDown; + textBox1.InnerTextBox.PreviewKeyDown += textBox1_PreviewKeyDown; + this.Text = title; label2.Text = labelText; textBox1.UseSystemPasswordChar = password; diff --git a/Windows/Forms/BookmarkTreeViewSNode.cs b/Windows/Forms/BookmarkTreeViewSNode.cs index 7d7e6a3..df058db 100644 --- a/Windows/Forms/BookmarkTreeViewSNode.cs +++ b/Windows/Forms/BookmarkTreeViewSNode.cs @@ -103,6 +103,8 @@ namespace RyzStudio.Windows.Forms //} } + public bool FindTextNode(string term) => this.Treeview.FindTextNode(this.SelectedNode, term); + public BookmarkTreeView.NodeType GetNodeType() => this.Treeview.GetNodeType(this.SelectedNode); public BookmarkItemViewModel GetViewModel() => this.Treeview.GetViewModel(this.SelectedNode); diff --git a/bomg.csproj b/bomg.csproj index 7882b90..58c79b5 100644 --- a/bomg.csproj +++ b/bomg.csproj @@ -55,7 +55,7 @@ - bomg-4.ico + bomg2.ico LocalIntranet @@ -265,7 +265,7 @@ - + diff --git a/bomg2.ico b/bomg2.ico new file mode 100644 index 0000000000000000000000000000000000000000..4f54144bddb2a7c0e2d747116293d9137e014bf1 GIT binary patch literal 7886 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 literal 0 HcmV?d00001 From d6775aa5ade17674760bbb911b8f8965c28d6d7e Mon Sep 17 00:00:00 2001 From: Ray Date: Mon, 22 Apr 2019 15:54:55 +0100 Subject: [PATCH 10/34] WIP --- FindForm.cs | 1 - MainForm.cs | 3 +++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/FindForm.cs b/FindForm.cs index 083e90c..61891c4 100644 --- a/FindForm.cs +++ b/FindForm.cs @@ -91,6 +91,5 @@ namespace bzit.bomg findNextNew = true; } } - } } \ No newline at end of file diff --git a/MainForm.cs b/MainForm.cs index da89eab..8541d42 100644 --- a/MainForm.cs +++ b/MainForm.cs @@ -181,6 +181,7 @@ namespace bzit.bomg saveFileMenuItem.Enabled = saveMenuBarItem.Enabled = false; saveAsFileMenuItem.Enabled = false; findEditMenuItem.Enabled = false; + expandAllViewMenuItem.Enabled = collapseAllViewMenuItem.Enabled = false; break; case AppMode.Open: @@ -188,6 +189,7 @@ namespace bzit.bomg saveFileMenuItem.Enabled = saveMenuBarItem.Enabled = true; saveAsFileMenuItem.Enabled = true; findEditMenuItem.Enabled = true; + expandAllViewMenuItem.Enabled = collapseAllViewMenuItem.Enabled = true; break; case AppMode.New: @@ -197,6 +199,7 @@ namespace bzit.bomg saveFileMenuItem.Enabled = saveMenuBarItem.Enabled = true; saveAsFileMenuItem.Enabled = true; findEditMenuItem.Enabled = true; + expandAllViewMenuItem.Enabled = collapseAllViewMenuItem.Enabled = true; break; } From 95e332941ecd3219359a6e44eb3c86bc466d515e Mon Sep 17 00:00:00 2001 From: Ray Date: Tue, 23 Apr 2019 20:15:17 +0100 Subject: [PATCH 11/34] Changed: total rebuild --- MainForm.cs | 453 ++++++++++++------- Properties/AssemblyInfo.cs | 2 +- RyzStudio/Windows/ThemedForms/TextBoxForm.cs | 1 + Windows/Forms/BookmarkTreeView.cs | 2 + bomg.csproj | 24 - 5 files changed, 304 insertions(+), 178 deletions(-) diff --git a/MainForm.cs b/MainForm.cs index 8541d42..a8181aa 100644 --- a/MainForm.cs +++ b/MainForm.cs @@ -23,12 +23,33 @@ namespace bzit.bomg New } + public enum LoadFileType + { + None = 0, + Jsnx, + Ryz + } + + protected BackgroundWorker loadFileThread = null; + protected LoadFileType loadFileType = LoadFileType.None; + protected AppMode appMode = AppMode.Clear; protected string sessionFilename = null; + protected string sessionPassword = null; + protected bool usePassword = false; public MainForm() { InitializeComponent(); + + if (loadFileThread == null) + { + loadFileThread = new BackgroundWorker(); + loadFileThread.WorkerReportsProgress = loadFileThread.WorkerSupportsCancellation = true; + } + + loadFileThread.DoWork += loadFileThread_DoWork; + loadFileThread.RunWorkerCompleted += loadFileThread_RunWorkerCompleted; } protected override void OnLoad(EventArgs e) @@ -47,7 +68,8 @@ namespace bzit.bomg } this.ApplicationMode = AppMode.Clear; - sessionFilename = null; + sessionFilename = sessionPassword = null; + usePassword = false; } protected override void OnShown(EventArgs e) @@ -102,6 +124,12 @@ namespace bzit.bomg protected override void OnFormClosing(FormClosingEventArgs e) { + if (this.IsBusy) + { + e.Cancel = true; + return; + } + if (this.ApplicationMode == AppMode.Clear) { // do later @@ -137,7 +165,16 @@ namespace bzit.bomg DialogResult response = MessageBox.Show("Save changes to open bookmarks", "Save?", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); if (response == DialogResult.Yes) { - saveBookmarkFile_ForJSNX(sessionFilename); + if (usePassword) + { + if (string.IsNullOrWhiteSpace(sessionPassword)) + { + TextBoxForm passwordForm = new TextBoxForm("Password", "Password", true); + sessionPassword = passwordForm.ShowDialog(); + } + } + + saveBookmarkFile_ForJSNX(sessionFilename, sessionPassword ?? string.Empty); } else if (response == DialogResult.No) { @@ -160,12 +197,12 @@ namespace bzit.bomg treeView1.Clear(); this.ApplicationMode = AppMode.Clear; - sessionFilename = null; + sessionFilename = sessionPassword = null; Application.Exit(); } - public AppMode ApplicationMode + protected AppMode ApplicationMode { get => appMode; set @@ -206,10 +243,27 @@ namespace bzit.bomg } } - #region Toolbar #1 + protected bool IsBusy + { + get + { + return loadFileThread.IsBusy; + } + set + { + treeView1.Enabled = !value; + } + } + + #region toolbar private void fileNewMenuItem_Click(object sender, EventArgs e) { + if (this.IsBusy) + { + return; + } + if (this.ApplicationMode == AppMode.Clear) { // do later @@ -243,7 +297,16 @@ namespace bzit.bomg DialogResult response = MessageBox.Show("Save changes to open bookmarks", "Save?", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); if (response == DialogResult.Yes) { - saveBookmarkFile_ForJSNX(sessionFilename); + if (usePassword) + { + if (string.IsNullOrWhiteSpace(sessionPassword)) + { + TextBoxForm passwordForm = new TextBoxForm("Password", "Password", true); + sessionPassword = passwordForm.ShowDialog(); + } + } + + saveBookmarkFile_ForJSNX(sessionFilename, sessionPassword ?? string.Empty); } else if (response == DialogResult.No) { @@ -271,11 +334,16 @@ namespace bzit.bomg treeView1.Clear(rv); this.ApplicationMode = AppMode.New; - sessionFilename = null; + sessionFilename = sessionPassword = null; } private void fileOpenMenuItem_Click(object sender, EventArgs e) { + if (this.IsBusy) + { + return; + } + if (this.ApplicationMode == AppMode.Clear) { // do later @@ -309,7 +377,16 @@ namespace bzit.bomg DialogResult response = MessageBox.Show("Save changes to open bookmarks", "Save?", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); if (response == DialogResult.Yes) { - saveBookmarkFile_ForJSNX(sessionFilename); + if (usePassword) + { + if (string.IsNullOrWhiteSpace(sessionPassword)) + { + TextBoxForm passwordForm = new TextBoxForm("Password", "Password", true); + sessionPassword = passwordForm.ShowDialog(); + } + } + + saveBookmarkFile_ForJSNX(sessionFilename, sessionPassword ?? string.Empty); } else if (response == DialogResult.No) { @@ -335,6 +412,11 @@ namespace bzit.bomg private void fileCloseMenuItem_Click(object sender, EventArgs e) { + if (this.IsBusy) + { + return; + } + if (this.ApplicationMode == AppMode.Clear) { // do later @@ -368,7 +450,16 @@ namespace bzit.bomg DialogResult response = MessageBox.Show("Save changes to open bookmarks", "Save?", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); if (response == DialogResult.Yes) { - saveBookmarkFile_ForJSNX(sessionFilename); + if (usePassword) + { + if (string.IsNullOrWhiteSpace(sessionPassword)) + { + TextBoxForm passwordForm = new TextBoxForm("Password", "Password", true); + sessionPassword = passwordForm.ShowDialog(); + } + } + + saveBookmarkFile_ForJSNX(sessionFilename, sessionPassword ?? string.Empty); } else if (response == DialogResult.No) { @@ -388,11 +479,16 @@ namespace bzit.bomg treeView1.Clear(); this.ApplicationMode = AppMode.Clear; - sessionFilename = null; + sessionFilename = sessionPassword = null; } private void fileSaveMenuItem_Click(object sender, EventArgs e) { + if (this.IsBusy) + { + return; + } + if (this.ApplicationMode == AppMode.New) { DialogResult response = MessageBox.Show("Save bookmarks", "Save?", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); @@ -415,12 +511,26 @@ namespace bzit.bomg } else if (this.ApplicationMode == AppMode.Open) { - saveBookmarkFile_ForJSNX(sessionFilename); + if (usePassword) + { + if (string.IsNullOrWhiteSpace(sessionPassword)) + { + TextBoxForm passwordForm = new TextBoxForm("Password", "Password", true); + sessionPassword = passwordForm.ShowDialog(); + } + } + + saveBookmarkFile_ForJSNX(sessionFilename, sessionPassword ?? string.Empty); } } private void fileSaveAsMenuItem_Click(object sender, EventArgs e) { + if (this.IsBusy) + { + return; + } + if (this.ApplicationMode == AppMode.Clear) { return; @@ -435,17 +545,32 @@ namespace bzit.bomg private void fileExitMenuItem_Click(object sender, EventArgs e) { + if (this.IsBusy) + { + return; + } + this.Close(); } private void editFindMenuItem_Click(object sender, EventArgs e) { + if (this.IsBusy) + { + return; + } + FindForm findForm = new FindForm(this); findForm.Show(); } private void viewExpandAllMenuItem_Click(object sender, EventArgs e) { + if (this.IsBusy) + { + return; + } + if (this.ApplicationMode == AppMode.Clear) { return; @@ -463,6 +588,11 @@ namespace bzit.bomg private void viewCollapseAllMenuItem_Click(object sender, EventArgs e) { + if (this.IsBusy) + { + return; + } + if (this.ApplicationMode == AppMode.Clear) { return; @@ -485,27 +615,13 @@ namespace bzit.bomg alwaysOnTopToolStripMenuItem1.Checked = this.TopMost; } - /** - * Tools -> Refresh Icons - */ - //private void toolStripMenuItem1_Click(object sender, EventArgs e) - //{ - // if (string.IsNullOrEmpty(sessionFilename)) - // { - // return; - // } - - // if (this.ApplicationMode == AppMode.Clear) - // { - // return; - // } - - // UpdateIconForm frm = new UpdateIconForm(this); - // frm.ShowDialog(); - //} - private void toolsOptionsMenuItem_Click(object sender, EventArgs e) { + if (this.IsBusy) + { + return; + } + //OptionsForm frm = new OptionsForm(this); //frm.ShowDialog(); } @@ -536,11 +652,6 @@ namespace bzit.bomg #endregion - - - - - protected void loadBookmarkFile(string filename, int filterIndex) { switch (filterIndex) @@ -562,8 +673,12 @@ namespace bzit.bomg if (RyzStudio.IO.SharpZipLib.TestZipEncrypted(filename, password)) { sessionFilename = filename; - //this.ApplicationMode = AppMode.Open; - loadBookmarkFile_ForJSNX(filename, password); + sessionPassword = password; + usePassword = true; + + loadFileType = LoadFileType.Jsnx; + + loadFileThread.RunWorkerAsync(); break; } } @@ -571,8 +686,12 @@ namespace bzit.bomg else { sessionFilename = filename; - //this.ApplicationMode = AppMode.Open; - loadBookmarkFile_ForJSNX(filename); + sessionPassword = null; + usePassword = false; + + loadFileType = LoadFileType.Jsnx; + + loadFileThread.RunWorkerAsync(); } break; @@ -592,20 +711,26 @@ namespace bzit.bomg if (RyzStudio.IO.SharpZipLib.TestZipEncrypted(filename, password)) { - loadBookmarkFile_ForRYZ(filename, password); + sessionFilename = filename; + sessionPassword = password; + usePassword = true; - sessionFilename = null; - this.ApplicationMode = AppMode.New; + loadFileType = LoadFileType.Ryz; + + loadFileThread.RunWorkerAsync(); break; } } } else { - loadBookmarkFile_ForRYZ(filename); + sessionFilename = filename; + sessionPassword = null; + usePassword = false; - sessionFilename = null; - this.ApplicationMode = AppMode.New; + loadFileType = LoadFileType.Ryz; + + loadFileThread.RunWorkerAsync(); } break; @@ -673,9 +798,27 @@ namespace bzit.bomg readStream.Dispose(); readStream = null; - treeView1.AddItem(rs); - treeView1.HasChanged = false; - this.ApplicationMode = AppMode.Open; + if (treeView1.InvokeRequired) + { + treeView1.Invoke(new MethodInvoker(() => { + treeView1.AddItem(rs); + })); + } + else + { + treeView1.AddItem(rs); + } + + if (this.InvokeRequired) + { + this.Invoke(new MethodInvoker(() => { + this.ApplicationMode = AppMode.Open; + })); + } + else + { + this.ApplicationMode = AppMode.Open; + } setAppTitle(Path.GetFileNameWithoutExtension(filename)); } @@ -805,13 +948,62 @@ namespace bzit.bomg readStream.Dispose(); readStream = null; - treeView1.AddItem(rs); - treeView1.HasChanged = false; - //this.ApplicationMode = AppMode.New; + if (treeView1.InvokeRequired) + { + treeView1.Invoke(new MethodInvoker(() => { + treeView1.AddItem(rs); + })); + } + else + { + treeView1.AddItem(rs); + } + + sessionFilename = sessionPassword = null; + usePassword = !string.IsNullOrWhiteSpace(password); + + if (this.InvokeRequired) + { + this.Invoke(new MethodInvoker(() => { + this.ApplicationMode = AppMode.New; + })); + } + else + { + this.ApplicationMode = AppMode.New; + } setAppTitle(Path.GetFileNameWithoutExtension(filename)); } + protected void openBookmark(TreeNode node) + { + if (treeView1.GetNodeType(node) != RyzStudio.Windows.Forms.BookmarkTreeView.NodeType.Page) + { + return; + } + + BookmarkItemViewModel viewModel = (BookmarkItemViewModel)node.Tag; + if (viewModel == null) + { + return; + } + + if (string.IsNullOrWhiteSpace(viewModel.SiteAddress)) + { + return; + } + + try + { + System.Diagnostics.Process.Start(viewModel.SiteAddress); + } + catch + { + // do nothing + } + } + protected bool saveAsBookmarkFile() { if (saveFileDialog.ShowDialog() == DialogResult.OK) @@ -824,6 +1016,7 @@ namespace bzit.bomg setAppTitle(Path.GetFileNameWithoutExtension(saveFileDialog.FileName)); sessionFilename = saveFileDialog.FileName; + usePassword = false; this.ApplicationMode = AppMode.Open; treeView1.HasChanged = false; break; @@ -836,6 +1029,8 @@ namespace bzit.bomg setAppTitle(Path.GetFileNameWithoutExtension(saveFileDialog.FileName)); sessionFilename = saveFileDialog.FileName; + sessionPassword = password; + usePassword = true; this.ApplicationMode = AppMode.Open; treeView1.HasChanged = false; break; @@ -895,7 +1090,16 @@ namespace bzit.bomg protected void setAppTitle(string title) { - this.Text = title + " - " + Properties.Resources.app_name; + if (this.InvokeRequired) + { + this.Invoke(new MethodInvoker(() => { + this.Text = title + " - " + Properties.Resources.app_name; + })); + } + else + { + this.Text = title + " - " + Properties.Resources.app_name; + } } protected void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) @@ -961,113 +1165,15 @@ namespace bzit.bomg } } - protected void openBookmark(TreeNode node) - { - if (treeView1.GetNodeType(node) != RyzStudio.Windows.Forms.BookmarkTreeView.NodeType.Page) - { - return; - } - - BookmarkItemViewModel viewModel = (BookmarkItemViewModel)node.Tag; - if (viewModel == null) - { - return; - } - - if (string.IsNullOrWhiteSpace(viewModel.SiteAddress)) - { - return; - } - - try - { - System.Diagnostics.Process.Start(viewModel.SiteAddress); - } - catch - { - // do nothing - } - - - - - - - //if (node == null) - //{ - // return; - //} - - //if (node.Tag == null) - //{ - // return; - //} - - //if (!(node.Tag is BookmarkItem)) - //{ - // return; - //} - - //BookmarkItem item = (BookmarkItem)node.Tag; - //if (item == null) - //{ - // return; - //} - - //if (string.IsNullOrEmpty(item.SiteAddress)) - //{ - // return; - //} - - //int bookmarkAction; - //if (!int.TryParse(this.IconDatabase.GetConfig("core.bookmark.action", string.Empty), out bookmarkAction)) - //{ - // bookmarkAction = 0; - //} - - //string bookmarkCustom1 = this.IconDatabase.GetConfig("core.bookmark.customcommand1", string.Empty).Trim(); - //string bookmarkCustom2 = this.IconDatabase.GetConfig("core.bookmark.customcommand2", string.Empty).Trim(); - - //switch (bookmarkAction) - //{ - // case 1: - // if (string.IsNullOrEmpty(bookmarkCustom1)) - // { - // return; - // } - - // bookmarkCustom1 = bookmarkCustom1.Replace("%1", item.SiteAddress); - // bookmarkCustom2 = bookmarkCustom2.Replace("%1", item.SiteAddress); - - // try - // { - // System.Diagnostics.Process.Start(bookmarkCustom1, bookmarkCustom2); - // } - // catch - // { - // // do nothing - // } - - // break; - // default: - // try - // { - // System.Diagnostics.Process.Start(item.SiteAddress); - // } - // catch - // { - // // do nothing - // } - - // break; - //} - } #region root context menu private void addPageContextMenu_Click(object sender, EventArgs e) => (new BookmarkEditForm(treeView1)).ShowDialog(); + private void addFolderContextMenu_Click(object sender, EventArgs e) => treeView1.SelectedNode = treeView1.SNode.AddFolder(); + private void editContextMenu_Click(object sender, EventArgs e) => treeView1.SNode.Edit(); + private void sortContextMenu_Click(object sender, EventArgs e) => treeView1.SNode.Sort(); #endregion @@ -1075,6 +1181,7 @@ namespace bzit.bomg #region folder context menu private void addPageContextMenu2_Click(object sender, EventArgs e) => (new BookmarkEditForm(treeView1)).ShowDialog(); + private void addFolderContextMenu2_Click(object sender, EventArgs e) => treeView1.SelectedNode = treeView1.SNode.AddFolder(); private void openAllContextMenu_Click(object sender, EventArgs e) @@ -1096,9 +1203,13 @@ namespace bzit.bomg } private void editContextMenu2_Click(object sender, EventArgs e) => treeView1.SNode.Edit(); + private void deleteContextMenu_Click(object sender, EventArgs e) => treeView1.SNode.Delete(); + private void sortContextMenu2_Click(object sender, EventArgs e) => treeView1.SNode.Sort(); + private void moveUpContextMenu_Click(object sender, EventArgs e) => treeView1.SNode.MoveUp(); + private void moveDownContextMenu_Click(object sender, EventArgs e) => treeView1.SNode.MoveDown(); #endregion @@ -1106,12 +1217,48 @@ namespace bzit.bomg #region page context menu private void openContextMenu_Click(object sender, EventArgs e) => openBookmark(treeView1.SelectedNode); + private void editContextMenu3_Click(object sender, EventArgs e) => (new BookmarkEditForm(treeView1)).ShowDialog(); + private void deleteContextMenu2_Click(object sender, EventArgs e) => treeView1.SNode.Delete(); + private void moveUpContextMenu2_Click(object sender, EventArgs e) => treeView1.SNode.MoveUp(); + private void moveDownContextMenu2_Click(object sender, EventArgs e) => treeView1.SNode.MoveDown(); #endregion + private void loadFileThread_DoWork(object sender, DoWorkEventArgs e) + { + if (loadFileType == LoadFileType.Jsnx) + { + if (usePassword) + { + loadBookmarkFile_ForJSNX(sessionFilename, sessionPassword); + } + else + { + loadBookmarkFile_ForJSNX(sessionFilename); + } + } + else if (loadFileType == LoadFileType.Ryz) + { + if (usePassword) + { + loadBookmarkFile_ForRYZ(sessionFilename, sessionPassword); + } + else + { + loadBookmarkFile_ForRYZ(sessionFilename); + } + + sessionFilename = sessionPassword = null; + } + } + + private void loadFileThread_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) + { + this.IsBusy = false; + } } } diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index 87e3ca7..c0f53bc 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -8,7 +8,7 @@ using System.Runtime.InteropServices; [assembly: AssemblyTitle("Bookmark Manager")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] +[assembly: AssemblyCompany("Hi, I'm Ray")] [assembly: AssemblyProduct("Bookmark Manager")] [assembly: AssemblyCopyright("Copyright © Ray Lam 2012")] [assembly: AssemblyTrademark("")] diff --git a/RyzStudio/Windows/ThemedForms/TextBoxForm.cs b/RyzStudio/Windows/ThemedForms/TextBoxForm.cs index 7bbca82..a4b7a9b 100644 --- a/RyzStudio/Windows/ThemedForms/TextBoxForm.cs +++ b/RyzStudio/Windows/ThemedForms/TextBoxForm.cs @@ -64,6 +64,7 @@ namespace RyzStudio.Windows.ThemedForms switch (e.KeyCode) { case Keys.Escape: + textBox1.Text = string.Empty; this.Close(); break; default: break; diff --git a/Windows/Forms/BookmarkTreeView.cs b/Windows/Forms/BookmarkTreeView.cs index cf067fb..f76dc69 100644 --- a/Windows/Forms/BookmarkTreeView.cs +++ b/Windows/Forms/BookmarkTreeView.cs @@ -153,6 +153,8 @@ namespace RyzStudio.Windows.Forms { AddItem(item); } + + this.HasChanged = false; } public void AddItem(BookmarkItemViewModel viewModel) diff --git a/bomg.csproj b/bomg.csproj index 58c79b5..1dea1c9 100644 --- a/bomg.csproj +++ b/bomg.csproj @@ -155,12 +155,6 @@ - - Form - - - UpdateIconForm.cs - Form @@ -192,18 +186,6 @@ - - UserControl - - - BigButton.cs - - - UserControl - - - BigUserControl.cs - Component @@ -225,9 +207,6 @@ ProgressBarInner.cs - - UpdateIconForm.cs - BookmarkEditForm.cs @@ -250,9 +229,6 @@ MainForm.cs - - BigButton.cs - SettingsSingleFileGenerator From da3ffb607fabb492a6ba324909366dcfa95fffae Mon Sep 17 00:00:00 2001 From: Ray Date: Tue, 23 Apr 2019 21:57:35 +0100 Subject: [PATCH 12/34] Changed: colours and version --- BookmarkEditForm.cs | 2 +- MainForm.cs | 8 +- Models/BookmarkItemModel.cs | 29 +++++- Properties/AssemblyInfo.cs | 2 +- Properties/Resources.Designer.cs | 2 +- Properties/Resources.resx | 2 +- RyzStudio/Windows/ThemedForms/Button.cs | 10 +- RyzStudio/Windows/ThemedForms/UserControl.cs | 3 +- Windows/Forms/BookmarkTreeView.cs | 104 ++++++++++--------- Windows/Forms/BookmarkTreeViewSNode.cs | 33 +++--- 10 files changed, 117 insertions(+), 78 deletions(-) diff --git a/BookmarkEditForm.cs b/BookmarkEditForm.cs index ab1ea96..4790f05 100644 --- a/BookmarkEditForm.cs +++ b/BookmarkEditForm.cs @@ -153,7 +153,7 @@ namespace bzit.bomg itemModel.SiteAddress = textBox2.Text?.Trim(); itemModel.SiteDescription = memoBox1.Text?.Trim(); - treeView?.AddOrUpdateItem_OnSelectedNode(itemModel.ToViewModel()); + treeView?.SNode.AddOrUpdateItem(itemModel.ToViewModel()); this.Close(); } diff --git a/MainForm.cs b/MainForm.cs index a8181aa..de99d05 100644 --- a/MainForm.cs +++ b/MainForm.cs @@ -1144,6 +1144,13 @@ namespace bzit.bomg return; case Keys.Enter: openBookmark(tn); + break; + case Keys.F2: + if (nodeType == NodeType.Page) + { + (new BookmarkEditForm(treeView1)).ShowDialog(); + } + break; case Keys.Insert: if (e.Modifiers != Keys.Shift) @@ -1165,7 +1172,6 @@ namespace bzit.bomg } } - #region root context menu private void addPageContextMenu_Click(object sender, EventArgs e) => (new BookmarkEditForm(treeView1)).ShowDialog(); diff --git a/Models/BookmarkItemModel.cs b/Models/BookmarkItemModel.cs index aa1f427..8aa2de0 100644 --- a/Models/BookmarkItemModel.cs +++ b/Models/BookmarkItemModel.cs @@ -87,6 +87,32 @@ namespace bzit.bomg 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); + 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)) @@ -134,9 +160,6 @@ namespace bzit.bomg } } - //protected string encodePath(string text) => System.Web.HttpUtility.UrlEncode(text); - //protected string decodePath(string text) => System.Web.HttpUtility.UrlDecode(text); - protected string parseTagValue(HtmlDocument doc, string xpath, string defaultValue = "") { HtmlNodeCollection hnc = doc.DocumentNode.SelectNodes(xpath); diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index c0f53bc..154548b 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.2.1.012")] +[assembly: AssemblyVersion("0.3.0.012")] [assembly: AssemblyFileVersion("0.1.0.0")] diff --git a/Properties/Resources.Designer.cs b/Properties/Resources.Designer.cs index ba0cfae..30474e0 100644 --- a/Properties/Resources.Designer.cs +++ b/Properties/Resources.Designer.cs @@ -89,7 +89,7 @@ namespace bzit.bomg.Properties { } /// - /// Looks up a localized string similar to 0.2.1.012 beta. + /// Looks up a localized string similar to 0.3.0.012 beta. /// internal static string app_version { get { diff --git a/Properties/Resources.resx b/Properties/Resources.resx index 833b209..7053999 100644 --- a/Properties/Resources.resx +++ b/Properties/Resources.resx @@ -128,7 +128,7 @@ Bookmark Manager - 0.2.1.012 beta + 0.3.0.012 beta ..\Resources\2\arrow-down-circle.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a diff --git a/RyzStudio/Windows/ThemedForms/Button.cs b/RyzStudio/Windows/ThemedForms/Button.cs index 9e3cf0a..4762b3c 100644 --- a/RyzStudio/Windows/ThemedForms/Button.cs +++ b/RyzStudio/Windows/ThemedForms/Button.cs @@ -93,13 +93,13 @@ public Image DefaultImage { get; set; } = null; [Browsable(false)] - public ButtonStyle StyleOver { get; set; } = new ButtonStyle(Color.Black, Color.White); + public ButtonStyle StyleOver { get; set; } = new ButtonStyle(Color.FromArgb(71, 142, 203), Color.FromArgb(250, 250, 250)); - [Browsable(false)] - public ButtonStyle StyleDown { get; set; } = new ButtonStyle(Color.LightGray, Color.Black); + [Browsable(false)] + public ButtonStyle StyleDown { get; set; } = new ButtonStyle(Color.FromArgb(61, 132, 193), Color.FromArgb(250, 250, 250)); - [Browsable(false)] - public ButtonStyle StyleDefault { get; set; } = new ButtonStyle(Color.White, Color.Black); + [Browsable(false)] + public ButtonStyle StyleDefault { get; set; } = new ButtonStyle(Color.FromArgb(51, 122, 183), Color.FromArgb(250, 250, 250)); public void PerformClick() => this.OnClick(null); } diff --git a/RyzStudio/Windows/ThemedForms/UserControl.cs b/RyzStudio/Windows/ThemedForms/UserControl.cs index 8f25bdb..2bb47f2 100644 --- a/RyzStudio/Windows/ThemedForms/UserControl.cs +++ b/RyzStudio/Windows/ThemedForms/UserControl.cs @@ -8,7 +8,8 @@ public partial class UserControl : System.Windows.Forms.UserControl { - protected ThemeStyle styleActive = new ThemeStyle(1, 3, 2, Color.FromArgb(112, 112, 112), Color.White); + //protected ThemeStyle styleActive = new ThemeStyle(1, 3, 2, Color.FromArgb(112, 112, 112), Color.White); + protected ThemeStyle styleActive = new ThemeStyle(1, 3, 2, Color.FromArgb(212, 212, 212), Color.White); public UserControl() { diff --git a/Windows/Forms/BookmarkTreeView.cs b/Windows/Forms/BookmarkTreeView.cs index f76dc69..846763b 100644 --- a/Windows/Forms/BookmarkTreeView.cs +++ b/Windows/Forms/BookmarkTreeView.cs @@ -35,7 +35,7 @@ namespace RyzStudio.Windows.Forms protected IconDatabase iconDatabase = null; protected TreeNode draggingNode = null; - protected bool allowBeginEdit = false; + protected bool hasChanged = false; public BookmarkTreeView() : base() @@ -60,10 +60,13 @@ namespace RyzStudio.Windows.Forms this.PathSeparator = "\n"; } + [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public bool AllowBeginEdit { get; set; } = false; + [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public new ImageList ImageList { get => base.ImageList; set => base.ImageList = value; } - [Browsable(false)] + [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public bool HasChanged { get { return hasChanged; } @@ -75,7 +78,6 @@ namespace RyzStudio.Windows.Forms } } - #region public methods public bool InitialiseIconDatabase(out string message, string filename) @@ -172,20 +174,34 @@ namespace RyzStudio.Windows.Forms this.HasChanged = true; } - public void AddOrUpdateItem_OnSelectedNode(BookmarkItemViewModel viewModel) + public void AddItem(TreeNode treeNode, BookmarkItemViewModel viewModel) { - switch (this.SNode.GetNodeType()) + 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 (this.GetNodeType(treeNode)) { case NodeType.Root: case NodeType.Folder: - addItem_OnSelectedNode(viewModel); - - this.HasChanged = true; + AddItem(treeNode, viewModel); break; case NodeType.Page: - updateItem_OnSelectedNode(viewModel); - - this.HasChanged = true; + UpdateItem(treeNode, viewModel); break; default: break; @@ -353,6 +369,24 @@ namespace RyzStudio.Windows.Forms return rt; } + 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; + } + #endregion #region integrated behaviour @@ -423,9 +457,9 @@ namespace RyzStudio.Windows.Forms protected override void OnBeforeLabelEdit(NodeLabelEditEventArgs e) { - if (!allowBeginEdit) + if (!AllowBeginEdit) { - allowBeginEdit = false; + AllowBeginEdit = false; e.CancelEdit = true; return; @@ -459,7 +493,7 @@ namespace RyzStudio.Windows.Forms // e.CancelEdit = true; //} - allowBeginEdit = false; + AllowBeginEdit = false; } protected override void OnPreviewKeyDown(PreviewKeyDownEventArgs e) @@ -497,9 +531,13 @@ namespace RyzStudio.Windows.Forms break; case Keys.F2: - allowBeginEdit = true; + if ((nodeType == NodeType.Root) || (nodeType == NodeType.Folder)) + { + this.AllowBeginEdit = true; + + this.SNode.Edit(); + } - this.SNode.Edit(); break; case Keys.F3: switch (nodeType) @@ -643,24 +681,6 @@ namespace RyzStudio.Windows.Forms return tn; } - protected void addItem_OnSelectedNode(BookmarkItemViewModel viewModel) - { - if (this.SelectedNode == null) - { - return; - } - - int iconIndex = addIcon(viewModel); - - TreeNode tn = new TreeNode(viewModel.SiteName, iconIndex, iconIndex); - tn.Tag = viewModel; - tn.ToolTipText = viewModel.ToString(); - - int n = this.SelectedNode.Nodes.Add(tn); - - this.SelectedNode = this.SelectedNode.Nodes[n]; - } - protected string decodePath(string value) => System.Web.HttpUtility.UrlDecode(value); protected string encodePath(string value) => System.Web.HttpUtility.UrlEncode(value); @@ -687,22 +707,6 @@ namespace RyzStudio.Windows.Forms } } - protected void updateItem_OnSelectedNode(BookmarkItemViewModel viewModel) - { - if (this.SelectedNode == null) - { - return; - } - - int iconIndex = addIcon(viewModel); - - this.SelectedNode.Text = viewModel.SiteName; - this.SelectedNode.ImageIndex = iconIndex; - this.SelectedNode.SelectedImageIndex = iconIndex; - this.SelectedNode.Tag = viewModel; - this.SelectedNode.ToolTipText = viewModel.ToString(); - } - protected bool isNodeChild(TreeNode drag_node, TreeNode drop_node) { TreeNode tn = drop_node; diff --git a/Windows/Forms/BookmarkTreeViewSNode.cs b/Windows/Forms/BookmarkTreeViewSNode.cs index df058db..efd9dc0 100644 --- a/Windows/Forms/BookmarkTreeViewSNode.cs +++ b/Windows/Forms/BookmarkTreeViewSNode.cs @@ -1,6 +1,7 @@ using bzit.bomg.Models; using System; using System.Windows.Forms; +using static RyzStudio.Windows.Forms.BookmarkTreeView; namespace RyzStudio.Windows.Forms { @@ -43,6 +44,22 @@ namespace RyzStudio.Windows.Forms return tn; } + public void AddOrUpdateItem(BookmarkItemViewModel viewModel) + { + switch (this.GetNodeType()) + { + case NodeType.Root: + case NodeType.Folder: + Treeview.AddItem(this.SelectedNode, viewModel); + break; + case NodeType.Page: + Treeview.UpdateItem(this.SelectedNode, viewModel); + break; + default: + break; + } + } + public void Delete() { if (this.SelectedNode == null) @@ -79,28 +96,16 @@ namespace RyzStudio.Windows.Forms { case BookmarkTreeView.NodeType.Root: case BookmarkTreeView.NodeType.Folder: + this.Treeview.AllowBeginEdit = true; this.SelectedNode.BeginEdit(); break; case BookmarkTreeView.NodeType.Page: + this.Treeview.AllowBeginEdit = true; this.SelectedNode.BeginEdit(); break; default: break; } - - - //this.HasChanged = true; - - //if (this.SelectedNode == null) - //{ - // return; - //} - - //if (!this.SelectedNode.IsEditing) - //{ - // allowBeginEdit = true; - // this.SelectedNode.BeginEdit(); - //} } public bool FindTextNode(string term) => this.Treeview.FindTextNode(this.SelectedNode, term); From b3303a830bbe1f7734d0c79604c092fd85c3e695 Mon Sep 17 00:00:00 2001 From: Ray Date: Wed, 24 Apr 2019 19:46:37 +0100 Subject: [PATCH 13/34] Changed: near-complete rebuild for 0.3.0.012 --- MainForm.Designer.cs | 4 +- MainForm.cs | 4 +- OptionForm.Designer.cs | 175 +++++++++++++++++++ OptionForm.cs | 165 +++++++++++++++++ OptionForm.resx | 120 +++++++++++++ RyzStudio/Windows/ThemedForms/ProgressBar.cs | 2 +- Windows/Forms/BookmarkTreeView.cs | 73 ++++++++ bomg.csproj | 9 + 8 files changed, 546 insertions(+), 6 deletions(-) create mode 100644 OptionForm.Designer.cs create mode 100644 OptionForm.cs create mode 100644 OptionForm.resx diff --git a/MainForm.Designer.cs b/MainForm.Designer.cs index 0d91e46..cb220a7 100644 --- a/MainForm.Designer.cs +++ b/MainForm.Designer.cs @@ -367,11 +367,10 @@ namespace bzit.bomg // // optionsToolMenuItem // - this.optionsToolMenuItem.Enabled = false; this.optionsToolMenuItem.Image = global::bzit.bomg.Properties.Resources.settings; this.optionsToolMenuItem.Name = "optionsToolMenuItem"; this.optionsToolMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F12; - this.optionsToolMenuItem.Size = new System.Drawing.Size(141, 22); + this.optionsToolMenuItem.Size = new System.Drawing.Size(180, 22); this.optionsToolMenuItem.Text = "&Options"; this.optionsToolMenuItem.Click += new System.EventHandler(this.toolsOptionsMenuItem_Click); // @@ -626,7 +625,6 @@ namespace bzit.bomg this.treeView1.AllowDrop = true; this.treeView1.BackColor = System.Drawing.Color.White; this.treeView1.Dock = System.Windows.Forms.DockStyle.Fill; - this.treeView1.HasChanged = false; this.treeView1.HideSelection = false; this.treeView1.HotTracking = true; this.treeView1.ImageIndex = 0; diff --git a/MainForm.cs b/MainForm.cs index de99d05..27d53fc 100644 --- a/MainForm.cs +++ b/MainForm.cs @@ -622,8 +622,8 @@ namespace bzit.bomg return; } - //OptionsForm frm = new OptionsForm(this); - //frm.ShowDialog(); + OptionForm optionForm = new OptionForm(this); + optionForm.ShowDialog(); } private void helpViewHelpMenuItem_Click(object sender, EventArgs e) diff --git a/OptionForm.Designer.cs b/OptionForm.Designer.cs new file mode 100644 index 0000000..cac19db --- /dev/null +++ b/OptionForm.Designer.cs @@ -0,0 +1,175 @@ +namespace bzit.bomg +{ + partial class OptionForm + { + /// + /// 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.label1 = new System.Windows.Forms.Label(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.label5 = new System.Windows.Forms.Label(); + this.button1 = new RyzStudio.Windows.ThemedForms.Button(); + this.button2 = new RyzStudio.Windows.ThemedForms.Button(); + this.horizontalSeparator1 = new RyzStudio.Windows.Forms.HorizontalSeparator(); + this.progressBar1 = new RyzStudio.Windows.ThemedForms.ProgressBar(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).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.AutoSize = true; + this.label1.Location = new System.Drawing.Point(12, 25); + this.label1.Margin = new System.Windows.Forms.Padding(3); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(34, 13); + this.label1.TabIndex = 0; + this.label1.Text = "Icons"; + // + // pictureBox1 + // + this.pictureBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | 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.InitialImage = null; + this.pictureBox1.Location = new System.Drawing.Point(306, 237); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(32, 32); + this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage; + this.pictureBox1.TabIndex = 60; + this.pictureBox1.TabStop = false; + // + // label5 + // + this.label5.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.label5.ForeColor = System.Drawing.Color.OrangeRed; + this.label5.Location = new System.Drawing.Point(9, 237); + this.label5.Margin = new System.Windows.Forms.Padding(3); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(291, 32); + this.label5.TabIndex = 64; + this.label5.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // button1 + // + this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.button1.BackColor = System.Drawing.Color.Transparent; + this.button1.DefaultImage = null; + this.button1.DownImage = null; + this.button1.LabelText = "&Update"; + this.button1.Location = new System.Drawing.Point(368, 59); + 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(84, 32); + this.button1.TabIndex = 1; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // button2 + // + this.button2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.button2.BackColor = System.Drawing.Color.Transparent; + this.button2.DefaultImage = null; + this.button2.DownImage = null; + this.button2.LabelText = "&Close"; + this.button2.Location = new System.Drawing.Point(344, 237); + this.button2.Name = "button2"; + this.button2.OverImage = null; + this.button2.Padding = new System.Windows.Forms.Padding(4, 4, 3, 3); + this.button2.Size = new System.Drawing.Size(108, 32); + this.button2.TabIndex = 4; + this.button2.Click += new System.EventHandler(this.button2_Click); + // + // horizontalSeparator1 + // + this.horizontalSeparator1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.horizontalSeparator1.Location = new System.Drawing.Point(12, 222); + this.horizontalSeparator1.Margin = new System.Windows.Forms.Padding(3, 10, 3, 10); + this.horizontalSeparator1.MaximumSize = new System.Drawing.Size(4920, 2); + this.horizontalSeparator1.Name = "horizontalSeparator1"; + this.horizontalSeparator1.Size = new System.Drawing.Size(440, 2); + this.horizontalSeparator1.TabIndex = 65; + // + // progressBar1 + // + this.progressBar1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.progressBar1.BackColor = System.Drawing.Color.Transparent; + this.progressBar1.BarColour = System.Drawing.Color.FromArgb(((int)(((byte)(158)))), ((int)(((byte)(225)))), ((int)(((byte)(249))))); + this.progressBar1.BarTextColour = System.Drawing.SystemColors.ControlText; + this.progressBar1.Location = new System.Drawing.Point(96, 17); + this.progressBar1.Margin = new System.Windows.Forms.Padding(3, 10, 3, 10); + this.progressBar1.Maximum = 0; + this.progressBar1.Minimum = 0; + this.progressBar1.Name = "progressBar1"; + this.progressBar1.Padding = new System.Windows.Forms.Padding(4, 4, 3, 3); + this.progressBar1.Size = new System.Drawing.Size(356, 29); + this.progressBar1.TabIndex = 66; + this.progressBar1.Value = 0; + // + // OptionForm + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.BackColor = System.Drawing.Color.White; + this.ClientSize = new System.Drawing.Size(464, 281); + this.Controls.Add(this.progressBar1); + this.Controls.Add(this.horizontalSeparator1); + this.Controls.Add(this.label5); + this.Controls.Add(this.button1); + this.Controls.Add(this.button2); + this.Controls.Add(this.pictureBox1); + this.Controls.Add(this.label1); + this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.MinimumSize = new System.Drawing.Size(480, 320); + this.Name = "OptionForm"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Options"; + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label label1; + private System.Windows.Forms.PictureBox pictureBox1; + private RyzStudio.Windows.ThemedForms.Button button2; + private RyzStudio.Windows.ThemedForms.Button button1; + private System.Windows.Forms.Label label5; + private RyzStudio.Windows.Forms.HorizontalSeparator horizontalSeparator1; + private RyzStudio.Windows.ThemedForms.ProgressBar progressBar1; + } +} \ No newline at end of file diff --git a/OptionForm.cs b/OptionForm.cs new file mode 100644 index 0000000..4c4e659 --- /dev/null +++ b/OptionForm.cs @@ -0,0 +1,165 @@ +using bzit.bomg.Models; +using RyzStudio.Windows.Forms; +using RyzStudio.Windows.ThemedForms; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Windows.Forms; +using Form = System.Windows.Forms.Form; +using Resources = bzit.bomg.Properties.Resources; + +namespace bzit.bomg +{ + public partial class OptionForm : Form + { + protected BackgroundWorker threadWorker = null; + + protected BookmarkItemModel itemModel = null; + protected MainForm parentForm = null; + + public OptionForm(MainForm mainForm) : base() + { + InitializeComponent(); + + parentForm = mainForm; + + this.StartPosition = FormStartPosition.WindowsDefaultLocation; + + if (threadWorker == null) + { + threadWorker = new BackgroundWorker(); + threadWorker.WorkerReportsProgress = threadWorker.WorkerSupportsCancellation = true; + threadWorker.DoWork += threadWorker1_DoWork; + threadWorker.RunWorkerCompleted += threadWorker1_RunWorkerCompleted; + } + } + + protected void threadWorker1_DoWork(object sender, DoWorkEventArgs e) + { + if (threadWorker.CancellationPending) + { + return; + } + + List nodeList = parentForm.treeView1.GetBookmarkNodeList(); + + if (progressBar1.InvokeRequired) + { + progressBar1.Invoke(new MethodInvoker(() => { + progressBar1.Maximum = nodeList.Count; + progressBar1.Value = 0; + })); + } + else + { + progressBar1.Maximum = nodeList.Count; + progressBar1.Value = 0; + } + + for (int i=0; i { + progressBar1.Value = (i + 1); + })); + } + else + { + progressBar1.Value = (i + 1); + } + + BookmarkItemViewModel viewModel = (BookmarkItemViewModel)nodeList[i].Tag; + BookmarkItemModel model = viewModel.ToModel(); + bool rv = model.UpdateFavicon(); + if (rv) + { + if (parentForm.treeView1.InvokeRequired) + { + parentForm.treeView1.Invoke(new MethodInvoker(() => { + parentForm.treeView1.UpdateItem(nodeList[i], model.ToViewModel()); + })); + } + else + { + parentForm.treeView1.UpdateItem(nodeList[i], model.ToViewModel()); + } + } + } + } + + protected void threadWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) + { + this.IsBusy = false; + + setLabelText("&Update"); + } + + protected override void OnClosing(CancelEventArgs e) + { + base.OnClosing(e); + + if (this.IsBusy) + { + e.Cancel = true; + } + } + + protected bool IsBusy + { + get => threadWorker.IsBusy; + set + { + pictureBox1.Image = (value) ? Resources.aniZomq2x32 : null; + } + } + + private void button1_Click(object sender, EventArgs e) + { + if (this.IsBusy) + { + setLabelText("&Cancelling..."); + + threadWorker.CancelAsync(); + } + else + { + this.IsBusy = true; + + setLabelText("&Updating..."); + + threadWorker.RunWorkerAsync(); + } + } + + private void button2_Click(object sender, EventArgs e) + { + if (this.IsBusy) + { + return; + } + + this.Close(); + } + + protected void setLabelText(string text) + { + if (button1.InvokeRequired) + { + button1.Invoke(new MethodInvoker(() => { + button1.LabelText = text; + })); + } + else + { + button1.LabelText = text; + } + } + + } +} \ No newline at end of file diff --git a/OptionForm.resx b/OptionForm.resx new file mode 100644 index 0000000..d58980a --- /dev/null +++ b/OptionForm.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/ProgressBar.cs b/RyzStudio/Windows/ThemedForms/ProgressBar.cs index 42dc1bf..6660601 100644 --- a/RyzStudio/Windows/ThemedForms/ProgressBar.cs +++ b/RyzStudio/Windows/ThemedForms/ProgressBar.cs @@ -9,7 +9,7 @@ namespace RyzStudio.Windows.ThemedForms { InitializeComponent(); - styleActive = new ThemeStyle(1, 3, 2, Color.FromArgb(112, 112, 112), Color.White); + styleActive = new ThemeStyle(1, 3, 2, Color.FromArgb(212, 212, 212), Color.White); } public int Minimum { get => userControl1.Minimum; set => userControl1.Minimum = value; } diff --git a/Windows/Forms/BookmarkTreeView.cs b/Windows/Forms/BookmarkTreeView.cs index 846763b..9f22e4f 100644 --- a/Windows/Forms/BookmarkTreeView.cs +++ b/Windows/Forms/BookmarkTreeView.cs @@ -228,6 +228,24 @@ namespace RyzStudio.Windows.Forms 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 NodeType GetNodeType(TreeNode node) { if (node.Tag == null) @@ -299,6 +317,23 @@ namespace RyzStudio.Windows.Forms 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) @@ -707,6 +742,44 @@ namespace RyzStudio.Windows.Forms } } + protected void traverseBookmarkList(List rs, TreeNode node) + { + foreach (TreeNode tn in node.Nodes) + { + NodeType nodeType = this.GetNodeType(tn); + if (nodeType == NodeType.Folder) + { + traverseBookmarkList(rs, tn); + } + else if (nodeType == NodeType.Page) + { + BookmarkItemViewModel nodeTag = this.GetViewModel(tn); + nodeTag.TreeviewPath = this.GetNodePath(tn); + + if (nodeTag != null) + { + rs.Add(tn); + } + } + } + } + + protected void traverseBookmarkList(ref int itemCount, TreeNode node) + { + foreach (TreeNode tn in node.Nodes) + { + NodeType nodeType = this.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; diff --git a/bomg.csproj b/bomg.csproj index 1dea1c9..53f17ab 100644 --- a/bomg.csproj +++ b/bomg.csproj @@ -99,6 +99,12 @@ + + Form + + + OptionForm.cs + @@ -189,6 +195,9 @@ Component + + OptionForm.cs + MemoBox.cs From d0471a03a88091b1401e12b2d981928793979325 Mon Sep 17 00:00:00 2001 From: Ray Date: Wed, 24 Apr 2019 22:06:52 +0100 Subject: [PATCH 14/34] Fixed: replaced web client --- Models/BookmarkItemModel.cs | 33 ++++-- Properties/AssemblyInfo.cs | 2 +- Properties/Resources.Designer.cs | 2 +- Properties/Resources.resx | 2 +- RyzStudio/Net/HttpWeb.cs | 168 +++++++++++++++++++++++++++++++ bomg.csproj | 1 + 6 files changed, 197 insertions(+), 11 deletions(-) create mode 100644 RyzStudio/Net/HttpWeb.cs diff --git a/Models/BookmarkItemModel.cs b/Models/BookmarkItemModel.cs index 8aa2de0..fe98ab6 100644 --- a/Models/BookmarkItemModel.cs +++ b/Models/BookmarkItemModel.cs @@ -1,5 +1,6 @@ using bzit.bomg.Models; using HtmlAgilityPack; +using RyzStudio.Net; using System; using System.Drawing; using System.IO; @@ -11,6 +12,8 @@ namespace bzit.bomg { public class BookmarkItemModel : BookmarkItemViewModel { + protected HttpWeb webClient = null; + public BookmarkItemModel() { this.Clear(); @@ -147,17 +150,31 @@ namespace bzit.bomg protected string retrieveSourceCode() { - WebClient webClient = new WebClient(); - webClient.CachePolicy = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.NoCacheNoStore); + if (webClient == null) + { + webClient = new HttpWeb(); + } - try + string sourceCode; + int statusCode = webClient.GetResponse(out sourceCode, this.SiteAddress); + if ((statusCode == 200) || (statusCode == 301) || (statusCode == 302)) { - return webClient.DownloadString(this.SiteAddress); - } - catch - { - return null; + 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 = "") diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index 154548b..56a6f4f 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.3.0.012")] +[assembly: AssemblyVersion("0.3.0.013")] [assembly: AssemblyFileVersion("0.1.0.0")] diff --git a/Properties/Resources.Designer.cs b/Properties/Resources.Designer.cs index 30474e0..4a5ce0b 100644 --- a/Properties/Resources.Designer.cs +++ b/Properties/Resources.Designer.cs @@ -89,7 +89,7 @@ namespace bzit.bomg.Properties { } /// - /// Looks up a localized string similar to 0.3.0.012 beta. + /// Looks up a localized string similar to 0.3.0.013 beta. /// internal static string app_version { get { diff --git a/Properties/Resources.resx b/Properties/Resources.resx index 7053999..0e30a35 100644 --- a/Properties/Resources.resx +++ b/Properties/Resources.resx @@ -128,7 +128,7 @@ Bookmark Manager - 0.3.0.012 beta + 0.3.0.013 beta ..\Resources\2\arrow-down-circle.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a diff --git a/RyzStudio/Net/HttpWeb.cs b/RyzStudio/Net/HttpWeb.cs new file mode 100644 index 0000000..44e3622 --- /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 (Exception xc) + { + // do nothing + } + + return rv; + } + } +} \ No newline at end of file diff --git a/bomg.csproj b/bomg.csproj index 53f17ab..968d32a 100644 --- a/bomg.csproj +++ b/bomg.csproj @@ -106,6 +106,7 @@ OptionForm.cs + UserControl From 17e4e867eb5af8329b12f39805f2d0b2c1e3bfe9 Mon Sep 17 00:00:00 2001 From: Ray Date: Wed, 24 Apr 2019 22:33:42 +0100 Subject: [PATCH 15/34] Fixed: mis-threading --- MainForm.cs | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/MainForm.cs b/MainForm.cs index 27d53fc..76db302 100644 --- a/MainForm.cs +++ b/MainForm.cs @@ -678,7 +678,6 @@ namespace bzit.bomg loadFileType = LoadFileType.Jsnx; - loadFileThread.RunWorkerAsync(); break; } } @@ -690,8 +689,6 @@ namespace bzit.bomg usePassword = false; loadFileType = LoadFileType.Jsnx; - - loadFileThread.RunWorkerAsync(); } break; @@ -717,7 +714,6 @@ namespace bzit.bomg loadFileType = LoadFileType.Ryz; - loadFileThread.RunWorkerAsync(); break; } } @@ -729,14 +725,23 @@ namespace bzit.bomg usePassword = false; loadFileType = LoadFileType.Ryz; - - loadFileThread.RunWorkerAsync(); } break; default: + sessionFilename = sessionPassword = null; + usePassword = false; break; } + + if (string.IsNullOrWhiteSpace(sessionFilename)) + { + return; + } + + this.IsBusy = true; + + loadFileThread.RunWorkerAsync(); } protected void loadBookmarkFile_ForJSNX(string filename, string password = "") From d232f7b5ec60677e4a2064b736582d1a7cba2496 Mon Sep 17 00:00:00 2001 From: Ray Date: Sat, 27 Apr 2019 03:17:24 +0100 Subject: [PATCH 16/34] Changed: threading and icons db --- MainForm.cs | 90 +++++++++++-------------------- Models/BookmarkItemModel.cs | 36 +++++++++++++ Windows/Forms/BookmarkTreeView.cs | 77 +++++++++++++++++++++++--- 3 files changed, 138 insertions(+), 65 deletions(-) diff --git a/MainForm.cs b/MainForm.cs index 76db302..19a5619 100644 --- a/MainForm.cs +++ b/MainForm.cs @@ -803,20 +803,12 @@ namespace bzit.bomg readStream.Dispose(); readStream = null; - if (treeView1.InvokeRequired) - { - treeView1.Invoke(new MethodInvoker(() => { - treeView1.AddItem(rs); - })); - } - else - { - treeView1.AddItem(rs); - } + treeView1.AddItem(rs); if (this.InvokeRequired) { - this.Invoke(new MethodInvoker(() => { + this.Invoke(new MethodInvoker(() => + { this.ApplicationMode = AppMode.Open; })); } @@ -825,7 +817,17 @@ namespace bzit.bomg this.ApplicationMode = AppMode.Open; } - setAppTitle(Path.GetFileNameWithoutExtension(filename)); + if (this.InvokeRequired) + { + this.Invoke(new MethodInvoker(() => + { + this.Text = Path.GetFileNameWithoutExtension(filename) + " - " + Resources.app_name; + })); + } + else + { + this.Text = Path.GetFileNameWithoutExtension(filename) + " - " + Resources.app_name; + } } protected void loadBookmarkFile_ForRYZ(string filename, string password = "") @@ -953,23 +955,15 @@ namespace bzit.bomg readStream.Dispose(); readStream = null; - if (treeView1.InvokeRequired) - { - treeView1.Invoke(new MethodInvoker(() => { - treeView1.AddItem(rs); - })); - } - else - { - treeView1.AddItem(rs); - } + treeView1.AddItem(rs); sessionFilename = sessionPassword = null; usePassword = !string.IsNullOrWhiteSpace(password); if (this.InvokeRequired) { - this.Invoke(new MethodInvoker(() => { + this.Invoke(new MethodInvoker(() => + { this.ApplicationMode = AppMode.New; })); } @@ -978,7 +972,17 @@ namespace bzit.bomg this.ApplicationMode = AppMode.New; } - setAppTitle(Path.GetFileNameWithoutExtension(filename)); + if (this.InvokeRequired) + { + this.Invoke(new MethodInvoker(() => + { + this.Text = Path.GetFileNameWithoutExtension(filename) + " - " + Resources.app_name; + })); + } + else + { + this.Text = Path.GetFileNameWithoutExtension(filename) + " - " + Resources.app_name; + } } protected void openBookmark(TreeNode node) @@ -1018,7 +1022,7 @@ namespace bzit.bomg case 1: saveBookmarkFile_ForJSNX(saveFileDialog.FileName); - setAppTitle(Path.GetFileNameWithoutExtension(saveFileDialog.FileName)); + this.Text = Path.GetFileNameWithoutExtension(saveFileDialog.FileName) + " - " + Properties.Resources.app_name; sessionFilename = saveFileDialog.FileName; usePassword = false; @@ -1031,7 +1035,7 @@ namespace bzit.bomg saveBookmarkFile_ForJSNX(saveFileDialog.FileName, password ?? string.Empty); - setAppTitle(Path.GetFileNameWithoutExtension(saveFileDialog.FileName)); + this.Text = Path.GetFileNameWithoutExtension(saveFileDialog.FileName) + " - " + Properties.Resources.app_name; sessionFilename = saveFileDialog.FileName; sessionPassword = password; @@ -1093,20 +1097,6 @@ namespace bzit.bomg treeView1.HasChanged = false; } - protected void setAppTitle(string title) - { - if (this.InvokeRequired) - { - this.Invoke(new MethodInvoker(() => { - this.Text = title + " - " + Properties.Resources.app_name; - })); - } - else - { - this.Text = title + " - " + Properties.Resources.app_name; - } - } - protected void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) { if (e.Button != MouseButtons.Right) @@ -1243,27 +1233,11 @@ namespace bzit.bomg { if (loadFileType == LoadFileType.Jsnx) { - if (usePassword) - { - loadBookmarkFile_ForJSNX(sessionFilename, sessionPassword); - } - else - { - loadBookmarkFile_ForJSNX(sessionFilename); - } + loadBookmarkFile_ForJSNX(sessionFilename, sessionPassword ?? string.Empty); } else if (loadFileType == LoadFileType.Ryz) { - if (usePassword) - { - loadBookmarkFile_ForRYZ(sessionFilename, sessionPassword); - } - else - { - loadBookmarkFile_ForRYZ(sessionFilename); - } - - sessionFilename = sessionPassword = null; + loadBookmarkFile_ForRYZ(sessionFilename, sessionPassword ?? string.Empty); } } diff --git a/Models/BookmarkItemModel.cs b/Models/BookmarkItemModel.cs index fe98ab6..8e78b6c 100644 --- a/Models/BookmarkItemModel.cs +++ b/Models/BookmarkItemModel.cs @@ -148,6 +148,42 @@ namespace bzit.bomg } } + 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) diff --git a/Windows/Forms/BookmarkTreeView.cs b/Windows/Forms/BookmarkTreeView.cs index 9f22e4f..66e4499 100644 --- a/Windows/Forms/BookmarkTreeView.cs +++ b/Windows/Forms/BookmarkTreeView.cs @@ -169,7 +169,17 @@ namespace RyzStudio.Windows.Forms TreeNode tn2 = addFolderPath(viewModel.TreeviewPath); - tn2.Nodes.Add(tn); + if (this.InvokeRequired) + { + this.Invoke(new MethodInvoker(() => + { + tn2.Nodes.Add(tn); + })); + } + else + { + tn2.Nodes.Add(tn); + } this.HasChanged = true; } @@ -210,7 +220,17 @@ namespace RyzStudio.Windows.Forms public void Clear() { - this.Nodes.Clear(); + if (this.InvokeRequired) + { + this.Invoke(new MethodInvoker(() => + { + this.Nodes.Clear(); + })); + } + else + { + this.Nodes.Clear(); + } this.HasChanged = true; } @@ -647,19 +667,42 @@ namespace RyzStudio.Windows.Forms } else { - this.ImageList.Images.Add(model.SiteAddress, rs); + if (this.InvokeRequired) + { + this.Invoke(new MethodInvoker(() => + { + this.ImageList.Images.Add(model.SiteAddress, rs); + })); + } + else + { + this.ImageList.Images.Add(model.SiteAddress, rs); + } return this.ImageList.Images.IndexOfKey(model.SiteAddress); } } - Bitmap bmp = model.RetrieveFavicon(); + byte[] rawData; + Bitmap bmp = model.RetrieveFavicon(out rawData); if (bmp == null) { return (int)IconSet.Default; } - this.ImageList.Images.Add(model.SiteAddress, bmp); + if (this.InvokeRequired) + { + this.Invoke(new MethodInvoker(() => + { + this.ImageList.Images.Add(model.SiteAddress, bmp); + })); + } + else + { + this.ImageList.Images.Add(model.SiteAddress, bmp); + } + + iconDatabase.AddIcon(model.SiteAddress, rawData); return this.ImageList.Images.IndexOfKey(model.SiteAddress); } @@ -697,7 +740,17 @@ namespace RyzStudio.Windows.Forms { if (!this.Nodes.ContainsKey(item)) { - this.Nodes.Add(item, decodePath(item), (int)IconSet.Root, (int)IconSet.Root); + if (this.InvokeRequired) + { + this.Invoke(new MethodInvoker(() => + { + this.Nodes.Add(item, decodePath(item), (int)IconSet.Root, (int)IconSet.Root); + })); + } + else + { + this.Nodes.Add(item, decodePath(item), (int)IconSet.Root, (int)IconSet.Root); + } } tn = this.Nodes[item]; @@ -706,7 +759,17 @@ namespace RyzStudio.Windows.Forms { if (!tn.Nodes.ContainsKey(item)) { - tn.Nodes.Add(item, decodePath(item), (int)IconSet.Folder1, (int)IconSet.Folder2); + if (this.InvokeRequired) + { + this.Invoke(new MethodInvoker(() => + { + tn.Nodes.Add(item, decodePath(item), (int)IconSet.Folder1, (int)IconSet.Folder2); + })); + } + else + { + tn.Nodes.Add(item, decodePath(item), (int)IconSet.Folder1, (int)IconSet.Folder2); + } } tn = tn.Nodes[item]; From ce49c7e06289165ebf420b5b8191a35ba4dcd16b Mon Sep 17 00:00:00 2001 From: Ray Date: Sun, 28 Apr 2019 16:54:59 +0100 Subject: [PATCH 17/34] Changed: improved favicon parsing --- Models/BookmarkItemModel.cs | 52 ++++++++++++++++++-------------- Properties/AssemblyInfo.cs | 2 +- Properties/Resources.Designer.cs | 2 +- Properties/Resources.resx | 2 +- 4 files changed, 33 insertions(+), 25 deletions(-) diff --git a/Models/BookmarkItemModel.cs b/Models/BookmarkItemModel.cs index 8e78b6c..47d17b7 100644 --- a/Models/BookmarkItemModel.cs +++ b/Models/BookmarkItemModel.cs @@ -346,45 +346,53 @@ namespace bzit.bomg if (string.IsNullOrWhiteSpace(rs)) { - rs = parseTagValue_Attr(doc, "//link[@rel='shortcut icon']", "href", string.Empty); + //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[@rel='icon']", "href", string.Empty); + rs = parseTagValue_Attr(doc, "//link[translate(@rel, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = 'icon']", "href", string.Empty); + } - if (string.IsNullOrWhiteSpace(rs)) + if (string.IsNullOrWhiteSpace(rs)) { - rs = parseTagValue_Attr(doc, "//link[@rel='apple-touch-icon']", "href", string.Empty); - } + //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)) + if (string.IsNullOrWhiteSpace(rs)) { - rs = parseTagValue_Attr(doc, "//link[@rel='apple-touch-icon-precomposed']", "href", string.Empty); - } + //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)) + if (string.IsNullOrWhiteSpace(rs)) { - rs = parseTagValue_Attr(doc, "//meta[@property='og:image']", "content", string.Empty); - } + //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)) + if (string.IsNullOrWhiteSpace(rs)) { - rs = parseTagValue_Attr(doc, "//meta[@name='twitter:image']", "content", string.Empty); - } + //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)) + if (string.IsNullOrWhiteSpace(rs)) { - rs = parseTagValue_Attr(doc, "//meta[@property='og:image']", "content", string.Empty); - } + //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)) + if (string.IsNullOrWhiteSpace(rs)) { - rs = parseTagValue_Attr(doc, "//meta[@itemprop='image']", "content", string.Empty); - } + //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; + return rs; } } } \ No newline at end of file diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index 56a6f4f..62e3dab 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.3.0.013")] +[assembly: AssemblyVersion("0.3.0.014")] [assembly: AssemblyFileVersion("0.1.0.0")] diff --git a/Properties/Resources.Designer.cs b/Properties/Resources.Designer.cs index 4a5ce0b..3926832 100644 --- a/Properties/Resources.Designer.cs +++ b/Properties/Resources.Designer.cs @@ -89,7 +89,7 @@ namespace bzit.bomg.Properties { } /// - /// Looks up a localized string similar to 0.3.0.013 beta. + /// Looks up a localized string similar to 0.3.0.014 beta. /// internal static string app_version { get { diff --git a/Properties/Resources.resx b/Properties/Resources.resx index 0e30a35..2b4e37b 100644 --- a/Properties/Resources.resx +++ b/Properties/Resources.resx @@ -128,7 +128,7 @@ Bookmark Manager - 0.3.0.013 beta + 0.3.0.014 beta ..\Resources\2\arrow-down-circle.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a From 6e58d6bb5b3b7d0bbb392179a2743180677dff82 Mon Sep 17 00:00:00 2001 From: Ray Date: Sat, 18 May 2019 16:24:40 +0100 Subject: [PATCH 18/34] Changed: save button toggle for treeview change state --- MainForm.cs | 18 ++++++++++++++++++ Properties/AssemblyInfo.cs | 2 +- Properties/Resources.Designer.cs | 2 +- Properties/Resources.resx | 2 +- Windows/Forms/BookmarkTreeView.cs | 7 ++++--- 5 files changed, 25 insertions(+), 6 deletions(-) diff --git a/MainForm.cs b/MainForm.cs index 19a5619..25aaaf1 100644 --- a/MainForm.cs +++ b/MainForm.cs @@ -50,6 +50,8 @@ namespace bzit.bomg loadFileThread.DoWork += loadFileThread_DoWork; loadFileThread.RunWorkerCompleted += loadFileThread_RunWorkerCompleted; + + treeView1.OnNodeChanged += treeView1_OnNodeChanged; } protected override void OnLoad(EventArgs e) @@ -1229,6 +1231,20 @@ namespace bzit.bomg #endregion + protected void treeView1_OnNodeChanged(object sender, EventArgs e) + { + if (this.InvokeRequired) + { + this.Invoke(new MethodInvoker(() => { + saveMenuBarItem.Enabled = saveFileMenuItem.Enabled = treeView1.HasChanged; + })); + } + else + { + saveMenuBarItem.Enabled = saveFileMenuItem.Enabled = treeView1.HasChanged; + } + } + private void loadFileThread_DoWork(object sender, DoWorkEventArgs e) { if (loadFileType == LoadFileType.Jsnx) @@ -1244,6 +1260,8 @@ namespace bzit.bomg private void loadFileThread_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { this.IsBusy = false; + saveMenuBarItem.Enabled = saveFileMenuItem.Enabled = false; } + } } diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index 62e3dab..5b9571d 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.3.0.014")] +[assembly: AssemblyVersion("0.3.0.018")] [assembly: AssemblyFileVersion("0.1.0.0")] diff --git a/Properties/Resources.Designer.cs b/Properties/Resources.Designer.cs index 3926832..81591f5 100644 --- a/Properties/Resources.Designer.cs +++ b/Properties/Resources.Designer.cs @@ -89,7 +89,7 @@ namespace bzit.bomg.Properties { } /// - /// Looks up a localized string similar to 0.3.0.014 beta. + /// Looks up a localized string similar to 0.3.0.018 beta. /// internal static string app_version { get { diff --git a/Properties/Resources.resx b/Properties/Resources.resx index 2b4e37b..23227b9 100644 --- a/Properties/Resources.resx +++ b/Properties/Resources.resx @@ -128,7 +128,7 @@ Bookmark Manager - 0.3.0.014 beta + 0.3.0.018 beta ..\Resources\2\arrow-down-circle.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a diff --git a/Windows/Forms/BookmarkTreeView.cs b/Windows/Forms/BookmarkTreeView.cs index 66e4499..b922caf 100644 --- a/Windows/Forms/BookmarkTreeView.cs +++ b/Windows/Forms/BookmarkTreeView.cs @@ -32,12 +32,13 @@ namespace RyzStudio.Windows.Forms public BookmarkTreeViewSNode SNode { get; set; } + public event EventHandler OnNodeChanged = null; + protected IconDatabase iconDatabase = null; - protected TreeNode draggingNode = null; - protected bool hasChanged = false; + public BookmarkTreeView() : base() { this.SNode = new BookmarkTreeViewSNode(this); @@ -74,7 +75,7 @@ namespace RyzStudio.Windows.Forms { hasChanged = value; - //OnChanged?.Invoke(null, null); + OnNodeChanged?.Invoke(null, null); } } From f896729bebe6f1832758aa09ff50119622ce2cc8 Mon Sep 17 00:00:00 2001 From: Ray Date: Sun, 23 Aug 2020 11:40:44 +0100 Subject: [PATCH 19/34] Fixed: context menu position --- MainForm.cs | 7 ++++--- Properties/AssemblyInfo.cs | 2 +- Properties/Resources.Designer.cs | 2 +- Properties/Resources.resx | 2 +- bomg.csproj | 3 ++- 5 files changed, 9 insertions(+), 7 deletions(-) diff --git a/MainForm.cs b/MainForm.cs index 25aaaf1..c91bc83 100644 --- a/MainForm.cs +++ b/MainForm.cs @@ -70,6 +70,7 @@ namespace bzit.bomg } this.ApplicationMode = AppMode.Clear; + sessionFilename = sessionPassword = null; usePassword = false; } @@ -1109,13 +1110,13 @@ namespace bzit.bomg switch (treeView1.SNode.GetNodeType()) { case RyzStudio.Windows.Forms.BookmarkTreeView.NodeType.Root: - rootTreeNodeMenu.Show(Cursor.Position); + rootTreeNodeMenu.Show(e.Node.TreeView, e.X, e.Y); break; case RyzStudio.Windows.Forms.BookmarkTreeView.NodeType.Folder: - folderTreeNodeMenu.Show(Cursor.Position); + folderTreeNodeMenu.Show(e.Node.TreeView, e.X, e.Y); break; case RyzStudio.Windows.Forms.BookmarkTreeView.NodeType.Page: - pageTreeNodeMenu.Show(Cursor.Position); + pageTreeNodeMenu.Show(e.Node.TreeView, e.X, e.Y); break; default: break; diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index 5b9571d..cbe5b8d 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.3.0.018")] +[assembly: AssemblyVersion("0.3.0.025")] [assembly: AssemblyFileVersion("0.1.0.0")] diff --git a/Properties/Resources.Designer.cs b/Properties/Resources.Designer.cs index 81591f5..01f1519 100644 --- a/Properties/Resources.Designer.cs +++ b/Properties/Resources.Designer.cs @@ -89,7 +89,7 @@ namespace bzit.bomg.Properties { } /// - /// Looks up a localized string similar to 0.3.0.018 beta. + /// Looks up a localized string similar to 0.3.0.025 beta. /// internal static string app_version { get { diff --git a/Properties/Resources.resx b/Properties/Resources.resx index 23227b9..d538afe 100644 --- a/Properties/Resources.resx +++ b/Properties/Resources.resx @@ -128,7 +128,7 @@ Bookmark Manager - 0.3.0.018 beta + 0.3.0.025 beta ..\Resources\2\arrow-down-circle.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a diff --git a/bomg.csproj b/bomg.csproj index 968d32a..cef8ea3 100644 --- a/bomg.csproj +++ b/bomg.csproj @@ -10,7 +10,7 @@ Properties bzit.bomg bomg - v4.6.2 + v4.7.2 512 @@ -239,6 +239,7 @@ MainForm.cs + SettingsSingleFileGenerator From ade25a2ccdfe815f9f0db780a94eead4eab95708 Mon Sep 17 00:00:00 2001 From: Ray Date: Sun, 23 Aug 2020 12:00:16 +0100 Subject: [PATCH 20/34] Fixed: has changed on node movement --- RyzStudio/Net/HttpWeb.cs | 2 +- Windows/Forms/BookmarkTreeView.cs | 10 ++++------ bomg.csproj | 18 +++++++++--------- packages.config | 8 ++++---- 4 files changed, 18 insertions(+), 20 deletions(-) diff --git a/RyzStudio/Net/HttpWeb.cs b/RyzStudio/Net/HttpWeb.cs index 44e3622..70fe441 100644 --- a/RyzStudio/Net/HttpWeb.cs +++ b/RyzStudio/Net/HttpWeb.cs @@ -157,7 +157,7 @@ namespace RyzStudio.Net rv = (int)xc.Status; } } - catch (Exception xc) + catch { // do nothing } diff --git a/Windows/Forms/BookmarkTreeView.cs b/Windows/Forms/BookmarkTreeView.cs index b922caf..50c4091 100644 --- a/Windows/Forms/BookmarkTreeView.cs +++ b/Windows/Forms/BookmarkTreeView.cs @@ -70,7 +70,7 @@ namespace RyzStudio.Windows.Forms [Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public bool HasChanged { - get { return hasChanged; } + get => hasChanged; set { hasChanged = value; @@ -122,11 +122,7 @@ namespace RyzStudio.Windows.Forms return true; } - public TreeNode AddFolder(TreeNode node) - { - //return this.AddFolder("New Folder " + (new Random()).Next(10001, 99999).ToString()); - return this.AddFolder(node, "New Folder (" + DateTime.Now.ToString("yyyy-MM-dd-HHmmss") + ")"); - } + public TreeNode AddFolder(TreeNode node) => this.AddFolder(node, "New Folder (" + DateTime.Now.ToString("yyyy-MM-dd-HHmmss") + ")"); public TreeNode AddFolder(TreeNode node, string name) { @@ -632,6 +628,7 @@ namespace RyzStudio.Windows.Forms if (e.Modifiers == Keys.Control) { this.SNode.MoveUp(); + this.HasChanged = true; } break; @@ -639,6 +636,7 @@ namespace RyzStudio.Windows.Forms if (e.Modifiers == Keys.Control) { this.SNode.MoveDown(); + this.HasChanged = true; } break; diff --git a/bomg.csproj b/bomg.csproj index cef8ea3..bf27fc9 100644 --- a/bomg.csproj +++ b/bomg.csproj @@ -78,20 +78,20 @@ false - - packages\HtmlAgilityPack.1.11.2\lib\Net45\HtmlAgilityPack.dll + + packages\HtmlAgilityPack.1.11.24\lib\Net45\HtmlAgilityPack.dll - - packages\SharpZipLib.1.1.0\lib\net45\ICSharpCode.SharpZipLib.dll + + packages\SharpZipLib.1.2.0\lib\net45\ICSharpCode.SharpZipLib.dll - packages\Newtonsoft.Json.12.0.1\lib\net45\Newtonsoft.Json.dll + packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll - - packages\System.Data.SQLite.Core.1.0.110.0\lib\net46\System.Data.SQLite.dll + + packages\System.Data.SQLite.Core.1.0.113.1\lib\net46\System.Data.SQLite.dll @@ -310,12 +310,12 @@ - + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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/MainForm.cs b/MainForm.cs index d01f885..673726f 100644 --- a/MainForm.cs +++ b/MainForm.cs @@ -9,8 +9,9 @@ using System.Text; using System.Windows.Forms; using System.Xml; using static RyzStudio.Windows.Forms.BookmarkTreeView; -using TextBoxForm = RyzStudio.Windows.ThemedForms.TextBoxForm; using Resources = bzit.bomg.Properties.Resources; +using TextBoxForm = RyzStudio.Windows.ThemedForms.TextBoxForm; +using ThreadControl = RyzStudio.Windows.Forms.ThreadControl; namespace bzit.bomg { @@ -30,7 +31,8 @@ namespace bzit.bomg Ryz } - protected BackgroundWorker loadFileThread = null; + //protected BackgroundWorker loadFileThread = null; + protected bool isBusy = false; protected LoadFileType loadFileType = LoadFileType.None; protected AppMode appMode = AppMode.Clear; @@ -42,14 +44,14 @@ namespace bzit.bomg { InitializeComponent(); - if (loadFileThread == null) - { - loadFileThread = new BackgroundWorker(); - loadFileThread.WorkerReportsProgress = loadFileThread.WorkerSupportsCancellation = true; - } + //if (loadFileThread == null) + //{ + // loadFileThread = new BackgroundWorker(); + // loadFileThread.WorkerReportsProgress = loadFileThread.WorkerSupportsCancellation = true; + //} - loadFileThread.DoWork += loadFileThread_DoWork; - loadFileThread.RunWorkerCompleted += loadFileThread_RunWorkerCompleted; + //loadFileThread.DoWork += loadFileThread_DoWork; + //loadFileThread.RunWorkerCompleted += loadFileThread_RunWorkerCompleted; treeView1.OnNodeChanged += treeView1_OnNodeChanged; } @@ -70,9 +72,7 @@ namespace bzit.bomg } this.ApplicationMode = AppMode.Clear; - - sessionFilename = sessionPassword = null; - usePassword = false; + this.ClearSession(); } protected override void OnShown(EventArgs e) @@ -105,15 +105,8 @@ namespace bzit.bomg if (string.IsNullOrWhiteSpace(openFilename)) break; if (!File.Exists(openFilename)) break; - string openExtension = Path.GetExtension(openFilename).Trim('.'); - if (openExtension.Equals("jsnx", StringComparison.CurrentCultureIgnoreCase)) - { - loadBookmarkFile(openFilename, 1); - } - else if (openExtension.Equals("ryz", StringComparison.CurrentCultureIgnoreCase)) - { - loadBookmarkFile(openFilename, 2); - } + LoadBookmarksForm loadFileForm = new LoadBookmarksForm(this, openFilename); + loadFileForm.ShowDialog(); i++; break; @@ -198,13 +191,14 @@ namespace bzit.bomg treeView1.CloseIconDatabase(); treeView1.Clear(); + this.ApplicationMode = AppMode.Clear; - sessionFilename = sessionPassword = null; + this.ClearSession(); Application.Exit(); } - protected AppMode ApplicationMode + public AppMode ApplicationMode { get => appMode; set @@ -214,46 +208,56 @@ namespace bzit.bomg switch (value) { case AppMode.Clear: - this.Text = Properties.Resources.app_name; + ThreadControl.SetText(this, Resources.app_name); - closeFileMenuItem.Enabled = false; - saveFileMenuItem.Enabled = saveMenuBarItem.Enabled = false; - saveAsFileMenuItem.Enabled = false; - findEditMenuItem.Enabled = false; - expandAllViewMenuItem.Enabled = collapseAllViewMenuItem.Enabled = false; - optionsToolMenuItem.Enabled = 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: - closeFileMenuItem.Enabled = true; - saveFileMenuItem.Enabled = saveMenuBarItem.Enabled = true; - saveAsFileMenuItem.Enabled = true; - findEditMenuItem.Enabled = true; - expandAllViewMenuItem.Enabled = collapseAllViewMenuItem.Enabled = true; - optionsToolMenuItem.Enabled = 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: - this.Text = Properties.Resources.app_name; + ThreadControl.SetText(this, Resources.app_name); - closeFileMenuItem.Enabled = true; - saveFileMenuItem.Enabled = saveMenuBarItem.Enabled = true; - saveAsFileMenuItem.Enabled = true; - findEditMenuItem.Enabled = true; - expandAllViewMenuItem.Enabled = collapseAllViewMenuItem.Enabled = true; - optionsToolMenuItem.Enabled = 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; } } } - protected bool IsBusy + public bool AllowSave { - get + get => (saveMenuBarItem.Enabled || saveFileMenuItem.Enabled); + set { - return loadFileThread.IsBusy; + ThreadControl.SetEnable(toolStrip1, saveMenuBarItem, value); + ThreadControl.SetEnable(toolStrip1, saveFileMenuItem, value); } + } + + public bool IsBusy + { + get => isBusy; set { treeView1.Enabled = !value; @@ -339,7 +343,7 @@ namespace bzit.bomg treeView1.Clear(rv); this.ApplicationMode = AppMode.New; - sessionFilename = sessionPassword = null; + this.ClearSession(); } private void fileOpenMenuItem_Click(object sender, EventArgs e) @@ -411,7 +415,8 @@ namespace bzit.bomg if (openFileDialog.ShowDialog() == DialogResult.OK) { - loadBookmarkFile(openFileDialog.FileName, openFileDialog.FilterIndex); + LoadBookmarksForm loadFileForm = new LoadBookmarksForm(this, openFileDialog.FileName); + loadFileForm.ShowDialog(); } } @@ -483,8 +488,9 @@ namespace bzit.bomg } treeView1.Clear(); + this.ApplicationMode = AppMode.Clear; - sessionFilename = sessionPassword = null; + this.ClearSession(); } private void fileSaveMenuItem_Click(object sender, EventArgs e) @@ -657,284 +663,284 @@ namespace bzit.bomg #endregion - protected void loadBookmarkFile(string filename, int filterIndex) - { - sessionFilename = sessionPassword = null; - usePassword = false; + //protected void loadBookmarkFile(string filename, int filterIndex) + //{ + // sessionFilename = sessionPassword = null; + // usePassword = false; - //sessionFilename = filename; - //sessionPassword = null; - //usePassword = false; + // //sessionFilename = filename; + // //sessionPassword = null; + // //usePassword = false; - if (RyzStudio.IO.SharpZipLib.IsZipEncrypted(filename)) - { - TextBoxForm passwordForm = new TextBoxForm("Password", "Password", true); - string password = string.Empty; + // if (RyzStudio.IO.SharpZipLib.IsZipEncrypted(filename)) + // { + // TextBoxForm passwordForm = new TextBoxForm("Password", "Password", true); + // string password = string.Empty; - while (true) - { - password = passwordForm.ShowDialog(); - if (string.IsNullOrWhiteSpace(password)) - { - break; - } + // while (true) + // { + // password = passwordForm.ShowDialog(); + // if (string.IsNullOrWhiteSpace(password)) + // { + // break; + // } - if (RyzStudio.IO.SharpZipLib.TestZipEncrypted(filename, password)) - { - sessionFilename = filename; - sessionPassword = password; - usePassword = true; + // if (RyzStudio.IO.SharpZipLib.TestZipEncrypted(filename, password)) + // { + // sessionFilename = filename; + // sessionPassword = password; + // usePassword = true; - loadFileType = LoadFileType.Jsnx; + // loadFileType = LoadFileType.Jsnx; - break; - } - } - } + // break; + // } + // } + // } - switch (filterIndex) - { - case 1: - loadFileType = LoadFileType.Jsnx; - break; - case 2: - loadFileType = LoadFileType.Ryz; - break; - default: - loadFileType = LoadFileType.None; - break; - } + // switch (filterIndex) + // { + // case 1: + // loadFileType = LoadFileType.Jsnx; + // break; + // case 2: + // loadFileType = LoadFileType.Ryz; + // break; + // default: + // loadFileType = LoadFileType.None; + // break; + // } - if (string.IsNullOrWhiteSpace(sessionFilename)) - { - return; - } + // if (string.IsNullOrWhiteSpace(sessionFilename)) + // { + // return; + // } - this.IsBusy = true; + // this.IsBusy = true; - loadFileThread.RunWorkerAsync(); - } + // loadFileThread.RunWorkerAsync(); + //} - protected void loadBookmarkFile_ForJSNX(string filename, string password = "") - { - int size = 2048; - byte[] buffer = new byte[size]; - int bufferSize = 0; + //protected void loadBookmarkFile_ForJSNX(string filename, string password = "") + //{ + // int size = 2048; + // byte[] buffer = new byte[size]; + // int bufferSize = 0; - List rs = null; + // List rs = null; - ZipEntry readEntry = null; - ZipInputStream readStream = new ZipInputStream(File.OpenRead(filename)); - readStream.Password = password; + // ZipEntry readEntry = null; + // ZipInputStream readStream = new ZipInputStream(File.OpenRead(filename)); + // readStream.Password = password; - while (true) - { - readEntry = readStream.GetNextEntry(); - if (readEntry == null) - { - break; - } + // while (true) + // { + // readEntry = readStream.GetNextEntry(); + // if (readEntry == null) + // { + // break; + // } - if (string.IsNullOrWhiteSpace(readEntry.Name)) - { - continue; - } + // if (string.IsNullOrWhiteSpace(readEntry.Name)) + // { + // continue; + // } - if (!readEntry.IsFile) - { - continue; - } + // if (!readEntry.IsFile) + // { + // continue; + // } - if (!readEntry.Name.Equals("bookmarks.json")) - { - continue; - } + // if (!readEntry.Name.Equals("bookmarks.json")) + // { + // continue; + // } - MemoryStream ms = new MemoryStream(); - buffer = new byte[size]; - bufferSize = 0; + // 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); + // do + // { + // bufferSize = readStream.Read(buffer, 0, buffer.Length); + // ms.Write(buffer, 0, bufferSize); + // } + // while (bufferSize > 0); - ms.Position = 0; + // ms.Position = 0; - StreamReader sr = new StreamReader(ms); - rs = JsonConvert.DeserializeObject>(sr.ReadToEnd()); + // StreamReader sr = new StreamReader(ms); + // rs = JsonConvert.DeserializeObject>(sr.ReadToEnd()); - break; - } + // break; + // } - readStream.Flush(); - readStream.Close(); - readStream.Dispose(); - readStream = null; + // readStream.Flush(); + // readStream.Close(); + // readStream.Dispose(); + // readStream = null; - treeView1.AddItem(rs); + // treeView1.AddItem(rs); - if (this.InvokeRequired) - { - this.Invoke(new MethodInvoker(() => - { - this.ApplicationMode = AppMode.Open; - })); - } - else - { - this.ApplicationMode = AppMode.Open; - } + // if (this.InvokeRequired) + // { + // this.Invoke(new MethodInvoker(() => + // { + // this.ApplicationMode = AppMode.Open; + // })); + // } + // else + // { + // this.ApplicationMode = AppMode.Open; + // } - RyzStudio.Windows.Forms.ThreadControl.SetText(this, Path.GetFileNameWithoutExtension(filename) + " - " + Resources.app_name); - } + // RyzStudio.Windows.Forms.ThreadControl.SetText(this, Path.GetFileNameWithoutExtension(filename) + " - " + Resources.app_name); + //} - protected void loadBookmarkFile_ForRYZ(string filename, string password = "") - { - int size = 2048; - byte[] buffer = new byte[size]; - int bufferSize = 0; + //protected void loadBookmarkFile_ForRYZ(string filename, string password = "") + //{ + // int size = 2048; + // byte[] buffer = new byte[size]; + // int bufferSize = 0; - List rs = new List(); + // List rs = new List(); - ZipEntry readEntry = null; - ZipInputStream readStream = new ZipInputStream(File.OpenRead(filename)); - readStream.Password = password; + // ZipEntry readEntry = null; + // ZipInputStream readStream = new ZipInputStream(File.OpenRead(filename)); + // readStream.Password = password; - while (true) - { - readEntry = readStream.GetNextEntry(); - if (readEntry == null) - { - break; - } + // while (true) + // { + // readEntry = readStream.GetNextEntry(); + // if (readEntry == null) + // { + // break; + // } - if (string.IsNullOrWhiteSpace(readEntry.Name)) - { - continue; - } + // if (string.IsNullOrWhiteSpace(readEntry.Name)) + // { + // continue; + // } - if (!readEntry.IsFile) - { - continue; - } + // if (!readEntry.IsFile) + // { + // continue; + // } - if (!readEntry.Name.Equals("bookmarks.xml")) - { - continue; - } + // if (!readEntry.Name.Equals("bookmarks.xml")) + // { + // continue; + // } - MemoryStream ms = new MemoryStream(); - buffer = new byte[size]; - bufferSize = 0; + // 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); + // do + // { + // bufferSize = readStream.Read(buffer, 0, buffer.Length); + // ms.Write(buffer, 0, bufferSize); + // } + // while (bufferSize > 0); - ms.Position = 0; + // ms.Position = 0; - // read stream - StreamReader sr = new StreamReader(ms); + // // read stream + // StreamReader sr = new StreamReader(ms); - // load xml - XmlDocument xmlDocument = new XmlDocument(); - xmlDocument.LoadXml(sr.ReadToEnd()); + // // load xml + // XmlDocument xmlDocument = new XmlDocument(); + // xmlDocument.LoadXml(sr.ReadToEnd()); - // parse - XmlNode xnl = xmlDocument.SelectSingleNode("bomg/b/g"); - if (xnl == null) - { - break; - } + // // parse + // XmlNode xnl = xmlDocument.SelectSingleNode("bomg/b/g"); + // if (xnl == null) + // { + // break; + // } - string rootName = (xnl.Attributes["name"] == null) ? "Bookmarks" : (string.IsNullOrWhiteSpace(xnl.Attributes["name"].InnerText) ? "Bookmarks" : xnl.Attributes["name"].InnerText.Trim()); + // string rootName = (xnl.Attributes["name"] == null) ? "Bookmarks" : (string.IsNullOrWhiteSpace(xnl.Attributes["name"].InnerText) ? "Bookmarks" : xnl.Attributes["name"].InnerText.Trim()); - foreach (XmlNode xn in xnl.ChildNodes) - { - BookmarkItemViewModel viewModel = new BookmarkItemViewModel(); + // foreach (XmlNode xn in xnl.ChildNodes) + // { + // BookmarkItemViewModel viewModel = new BookmarkItemViewModel(); - foreach (XmlNode xn2 in xn.ChildNodes) - { - switch (xn2.LocalName) - { - case "name": - viewModel.SiteName = xn2.InnerText?.Trim(); - break; - case "address": - viewModel.SiteAddress = xn2.InnerText?.Trim(); - break; - case "description": - viewModel.SiteDescription = xn2.InnerText?.Trim(); - break; - //case "created": - // bi.Created = xn2.InnerText?.Trim(); - // break; - default: - break; - } - } + // foreach (XmlNode xn2 in xn.ChildNodes) + // { + // switch (xn2.LocalName) + // { + // case "name": + // viewModel.SiteName = xn2.InnerText?.Trim(); + // break; + // case "address": + // viewModel.SiteAddress = xn2.InnerText?.Trim(); + // break; + // case "description": + // viewModel.SiteDescription = xn2.InnerText?.Trim(); + // break; + // //case "created": + // // bi.Created = xn2.InnerText?.Trim(); + // // break; + // default: + // break; + // } + // } - // fix fullpath and name - if (viewModel.SiteName.Contains("|")) - { - StringBuilder sb = new StringBuilder(); - sb.Append("\\"); - sb.Append(System.Web.HttpUtility.UrlEncode(rootName)); - sb.Append("\\"); + // // fix fullpath and name + // if (viewModel.SiteName.Contains("|")) + // { + // StringBuilder sb = new StringBuilder(); + // sb.Append("\\"); + // sb.Append(System.Web.HttpUtility.UrlEncode(rootName)); + // sb.Append("\\"); - string[] pathParts = viewModel.SiteName.Split('|'); - for (int i = 0; i < (pathParts.Length - 1); i++) - { - sb.Append(pathParts[i]); - //sb.Append(System.Web.HttpUtility.UrlDecode(pathParts[i])); - sb.Append("\\"); - } + // string[] pathParts = viewModel.SiteName.Split('|'); + // for (int i = 0; i < (pathParts.Length - 1); i++) + // { + // sb.Append(pathParts[i]); + // //sb.Append(System.Web.HttpUtility.UrlDecode(pathParts[i])); + // sb.Append("\\"); + // } - viewModel.SiteName = System.Web.HttpUtility.UrlDecode(pathParts[(pathParts.Length - 1)] ?? string.Empty); - viewModel.TreeviewPath = sb.ToString(); - } - else - { - viewModel.SiteName = System.Web.HttpUtility.UrlDecode(viewModel.SiteName); - viewModel.TreeviewPath = string.Format("\\{0}\\", System.Web.HttpUtility.UrlEncode(rootName)); - } + // viewModel.SiteName = System.Web.HttpUtility.UrlDecode(pathParts[(pathParts.Length - 1)] ?? string.Empty); + // viewModel.TreeviewPath = sb.ToString(); + // } + // else + // { + // viewModel.SiteName = System.Web.HttpUtility.UrlDecode(viewModel.SiteName); + // viewModel.TreeviewPath = string.Format("\\{0}\\", System.Web.HttpUtility.UrlEncode(rootName)); + // } - rs.Add(viewModel); - } + // rs.Add(viewModel); + // } - break; - } + // break; + // } - readStream.Flush(); - readStream.Close(); - readStream.Dispose(); - readStream = null; + // readStream.Flush(); + // readStream.Close(); + // readStream.Dispose(); + // readStream = null; - treeView1.AddItem(rs); + // treeView1.AddItem(rs); - sessionFilename = sessionPassword = null; - usePassword = !string.IsNullOrWhiteSpace(password); + // sessionFilename = sessionPassword = null; + // usePassword = !string.IsNullOrWhiteSpace(password); - if (this.InvokeRequired) - { - this.Invoke(new MethodInvoker(() => - { - this.ApplicationMode = AppMode.New; - })); - } - else - { - this.ApplicationMode = AppMode.New; - } + // if (this.InvokeRequired) + // { + // this.Invoke(new MethodInvoker(() => + // { + // this.ApplicationMode = AppMode.New; + // })); + // } + // else + // { + // this.ApplicationMode = AppMode.New; + // } - RyzStudio.Windows.Forms.ThreadControl.SetText(this, Path.GetFileNameWithoutExtension(filename) + " - " + Resources.app_name); - } + // RyzStudio.Windows.Forms.ThreadControl.SetText(this, Path.GetFileNameWithoutExtension(filename) + " - " + Resources.app_name); + //} protected void openBookmark(TreeNode node) { @@ -1185,34 +1191,69 @@ namespace bzit.bomg if (this.InvokeRequired) { this.Invoke(new MethodInvoker(() => { - saveMenuBarItem.Enabled = saveFileMenuItem.Enabled = treeView1.HasChanged; + this.AllowSave = treeView1.HasChanged; })); } else { - saveMenuBarItem.Enabled = saveFileMenuItem.Enabled = treeView1.HasChanged; + this.AllowSave = treeView1.HasChanged; } } - - private void loadFileThread_DoWork(object sender, DoWorkEventArgs e) + public void ClearSession() { - if (loadFileType == LoadFileType.Jsnx) - { - loadBookmarkFile_ForJSNX(sessionFilename, sessionPassword ?? string.Empty); - } - else if (loadFileType == LoadFileType.Ryz) - { - loadBookmarkFile_ForRYZ(sessionFilename, sessionPassword ?? string.Empty); - } + sessionFilename = sessionPassword = null; + usePassword = false; } - private void loadFileThread_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) + public void SetSessionFile(string filename, string password) { - this.IsBusy = false; - saveMenuBarItem.Enabled = saveFileMenuItem.Enabled = false; + sessionFilename = filename; + sessionPassword = password; + usePassword = !string.IsNullOrWhiteSpace(password); + + string ext = Path.GetExtension(filename).Trim('.').ToLower(); + if (ext.Equals("jsnx")) + { + loadFileType = LoadFileType.Jsnx; + } + else if (ext.Equals("ryz")) + { + loadFileType = LoadFileType.Ryz; + } + else + { + loadFileType = LoadFileType.None; + } + + ThreadControl.SetText(this, Path.GetFileNameWithoutExtension(sessionFilename) + " - " + Resources.app_name); } + public void SetBookmarkItem(List itmes) + { + treeView1.AddItem(itmes); + } + + + + //private void loadFileThread_DoWork(object sender, DoWorkEventArgs e) + //{ + // if (loadFileType == LoadFileType.Jsnx) + // { + // loadBookmarkFile_ForJSNX(sessionFilename, sessionPassword ?? string.Empty); + // } + // else if (loadFileType == LoadFileType.Ryz) + // { + // loadBookmarkFile_ForRYZ(sessionFilename, sessionPassword ?? string.Empty); + // } + //} + + //private void loadFileThread_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) + //{ + // this.IsBusy = false; + // saveMenuBarItem.Enabled = saveFileMenuItem.Enabled = false; + //} + } } diff --git a/RyzStudio/Windows/Forms/ThreadControl.cs b/RyzStudio/Windows/Forms/ThreadControl.cs index 13581da..c7ef544 100644 --- a/RyzStudio/Windows/Forms/ThreadControl.cs +++ b/RyzStudio/Windows/Forms/ThreadControl.cs @@ -355,6 +355,36 @@ namespace RyzStudio.Windows.Forms } } + public static void SetEnable(Control container, ToolStripMenuItem control, bool value) + { + if (container.InvokeRequired) + { + container.Invoke(new MethodInvoker(() => + { + control.Enabled = value; + })); + } + else + { + control.Enabled = value; + } + } + + public static void SetEnable(Control container, ToolStripItem control, bool value) + { + if (container.InvokeRequired) + { + container.Invoke(new MethodInvoker(() => + { + control.Enabled = value; + })); + } + else + { + control.Enabled = value; + } + } + public static int GetValue(NumericUpDown sender) { int rv = 0; diff --git a/bomg.csproj b/bomg.csproj index e4f9989..0acd95a 100644 --- a/bomg.csproj +++ b/bomg.csproj @@ -102,11 +102,11 @@ - + Form - - LoadFileForm.cs + + LoadBookmarksForm.cs Form @@ -205,8 +205,8 @@ Component - - LoadFileForm.cs + + LoadBookmarksForm.cs UpdateIconsForm.cs From ac117cbfc47e4a25b5ed4ae87574c667976d3de3 Mon Sep 17 00:00:00 2001 From: Ray Date: Sat, 29 Aug 2020 23:46:36 +0100 Subject: [PATCH 31/34] Changed: show loading file dialog --- FindForm.cs | 12 +- LoadBookmarksForm.cs | 455 ++++++++++++++----------------- MainForm.Designer.cs | 4 +- MainForm.cs | 357 ++---------------------- Properties/AssemblyInfo.cs | 2 +- Properties/Resources.Designer.cs | 2 +- Properties/Resources.resx | 2 +- UpdateIconsForm.cs | 10 +- bomg.sln => skye.sln | 0 9 files changed, 244 insertions(+), 600 deletions(-) rename bomg.sln => skye.sln (100%) diff --git a/FindForm.cs b/FindForm.cs index 140b089..78086ee 100644 --- a/FindForm.cs +++ b/FindForm.cs @@ -52,13 +52,13 @@ namespace bzit.bomg return; } - if (parentForm.treeView1.Nodes.Count <= 0) + if (parentForm.TreeView.Nodes.Count <= 0) { return; } findNextNew = false; - parentForm.treeView1.FindTextNode(parentForm.treeView1.Nodes[0], textBox1.Text?.Trim()); + parentForm.TreeView.FindTextNode(parentForm.TreeView.Nodes[0], textBox1.Text?.Trim()); } private void button2_Click(object sender, EventArgs e) @@ -73,19 +73,19 @@ namespace bzit.bomg return; } - if (parentForm.treeView1.Nodes.Count <= 0) + if (parentForm.TreeView.Nodes.Count <= 0) { return; } - if (parentForm.treeView1.SelectedNode == null) + if (parentForm.TreeView.SelectedNode == null) { - parentForm.treeView1.SelectedNode = parentForm.treeView1.Nodes[0]; + parentForm.TreeView.SelectedNode = parentForm.TreeView.Nodes[0]; } findNextNew = false; - bool rv = parentForm.treeView1.SNode.FindTextNode(textBox1.Text?.Trim()); + bool rv = parentForm.TreeView.SNode.FindTextNode(textBox1.Text?.Trim()); if (!rv) { findNextNew = true; diff --git a/LoadBookmarksForm.cs b/LoadBookmarksForm.cs index 8f75bdc..88f317c 100644 --- a/LoadBookmarksForm.cs +++ b/LoadBookmarksForm.cs @@ -7,11 +7,12 @@ using System; using System.Collections.Generic; using System.ComponentModel; using System.IO; +using System.Text; using System.Threading.Tasks; using System.Windows.Forms; +using System.Xml; using AppMode = bzit.bomg.MainForm.AppMode; using Form = System.Windows.Forms.Form; -using Resources = bzit.bomg.Properties.Resources; namespace bzit.bomg { @@ -43,11 +44,13 @@ namespace bzit.bomg } } - protected override void OnShown(EventArgs e) + protected async override void OnShown(EventArgs e) { base.OnShown(e); - loadFile(sessionFilename); + await loadFile(sessionFilename); + + this.Close(); } protected bool IsBusy @@ -63,76 +66,6 @@ namespace bzit.bomg } } - private async void button1_Click(object sender, EventArgs e) - { - if (this.IsBusy) - { - //requestCancel = true; - //ThreadControl.SetText(button1, "&Cancelling..."); - return; - } - - this.IsBusy = true; - - await Task.Run(() => - { - //ThreadControl.SetText(button1, "&Updating..."); - - //if (requestCancel) - //{ - // this.IsBusy = false; - - // ThreadControl.SetText(button1, "&Update"); - - // requestCancel = false; - // return; - //} - - //List nodeList = parentForm.treeView1.GetBookmarkNodeList(); - - //ThreadControl.SetValue(progressBar1, 0, nodeList.Count); - - //for (int i = 0; i < nodeList.Count; i++) - //{ - // if (requestCancel) - // { - // this.IsBusy = false; - - // ThreadControl.SetText(button1, "&Update"); - - // requestCancel = false; - // return; - // } - - // ThreadControl.SetValue(progressBar1, (i + 1)); - - // BookmarkItemViewModel viewModel = (BookmarkItemViewModel)nodeList[i].Tag; - // BookmarkItemModel model = viewModel.ToModel(); - // bool rv = model.UpdateFavicon(); - // if (rv) - // { - // if (parentForm.treeView1.InvokeRequired) - // { - // parentForm.treeView1.Invoke(new MethodInvoker(() => - // { - // parentForm.treeView1.UpdateItem(nodeList[i], model.ToViewModel()); - // })); - // } - // else - // { - // parentForm.treeView1.UpdateItem(nodeList[i], model.ToViewModel()); - // } - // } - //} - - this.IsBusy = false; - - //ThreadControl.SetText(button1, "&Update"); - - //requestCancel = false; - }); - } - private void button2_Click(object sender, EventArgs e) { if (this.IsBusy) @@ -143,16 +76,19 @@ namespace bzit.bomg this.Close(); } - - protected void loadFile(string filename) + protected async Task loadFile(string filename) { parentForm.ClearSession(); + parentForm.TreeView.Clear(); + parentForm.TreeView.HasChanged = false; if (string.IsNullOrWhiteSpace(filename)) { return; } + ThreadControl.SetValue(progressBar1, 0, 0); + string password = string.Empty; if (RyzStudio.IO.SharpZipLib.IsZipEncrypted(filename)) @@ -173,6 +109,11 @@ namespace bzit.bomg break; } } + + if (string.IsNullOrWhiteSpace(password)) + { + return; + } } this.IsBusy = true; @@ -180,11 +121,11 @@ namespace bzit.bomg string ext = Path.GetExtension(filename).Trim('.').ToLower(); if (ext.Equals("jsnx")) { - loadJSNXBookmarkFile(filename, password); + await loadJSNXBookmarkFile(filename, password); } else if (ext.Equals("ryz")) { - //##loadFileType = LoadFileType.Ryz; + await loadRYZBookmarkFile(filename, password); } else { @@ -193,221 +134,227 @@ namespace bzit.bomg this.IsBusy = false; parentForm.AllowSave = false; + parentForm.TreeView.HasChanged = false; + + if (parentForm.TreeView.Nodes.Count > 0) parentForm.TreeView.Nodes[0].Expand(); } - protected void loadJSNXBookmarkFile(string filename, string password) + protected async Task loadJSNXBookmarkFile(string filename, string password) { - int size = 2048; - byte[] buffer = new byte[size]; - int bufferSize = 0; - - List rs = null; - - ZipEntry readEntry = null; - ZipInputStream readStream = new ZipInputStream(File.OpenRead(filename)); - readStream.Password = password; - - while (true) + await Task.Run(() => { - readEntry = readStream.GetNextEntry(); - if (readEntry == null) + int size = 2048; + byte[] buffer = new byte[size]; + int bufferSize = 0; + + List rs = null; + + ZipEntry readEntry = null; + 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("bookmarks.json")) + { + 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); + rs = JsonConvert.DeserializeObject>(sr.ReadToEnd()); + break; } - if (string.IsNullOrWhiteSpace(readEntry.Name)) + readStream.Flush(); + readStream.Close(); + readStream.Dispose(); + readStream = null; + + // load bookmark items + ThreadControl.SetValue(progressBar1, 0, rs.Count); + + for (int i=0; i 0); - - ms.Position = 0; - - StreamReader sr = new StreamReader(ms); - rs = JsonConvert.DeserializeObject>(sr.ReadToEnd()); - - break; - } - - readStream.Flush(); - readStream.Close(); - readStream.Dispose(); - readStream = null; - - parentForm.SetBookmarkItem(rs); - parentForm.ApplicationMode = AppMode.Open; - - //// RyzStudio.Windows.Forms.ThreadControl.SetText(this, Path.GetFileNameWithoutExtension(filename) + " - " + Resources.app_name); + parentForm.ApplicationMode = AppMode.Open; + }); } - //protected void loadBookmarkFile_ForRYZ(string filename, string password = "") - //{ - // int size = 2048; - // byte[] buffer = new byte[size]; - // int bufferSize = 0; + protected async Task loadRYZBookmarkFile(string filename, string password) + { + await Task.Run(() => + { + int size = 2048; + byte[] buffer = new byte[size]; + int bufferSize = 0; - // List rs = new List(); + List rs = new List(); - // ZipEntry readEntry = null; - // ZipInputStream readStream = new ZipInputStream(File.OpenRead(filename)); - // readStream.Password = password; + ZipEntry readEntry = null; + ZipInputStream readStream = new ZipInputStream(File.OpenRead(filename)); + readStream.Password = password; - // while (true) - // { - // readEntry = readStream.GetNextEntry(); - // if (readEntry == null) - // { - // break; - // } + while (true) + { + readEntry = readStream.GetNextEntry(); + if (readEntry == null) + { + break; + } - // if (string.IsNullOrWhiteSpace(readEntry.Name)) - // { - // continue; - // } + if (string.IsNullOrWhiteSpace(readEntry.Name)) + { + continue; + } - // if (!readEntry.IsFile) - // { - // continue; - // } + if (!readEntry.IsFile) + { + continue; + } - // if (!readEntry.Name.Equals("bookmarks.xml")) - // { - // continue; - // } + if (!readEntry.Name.Equals("bookmarks.xml")) + { + continue; + } - // MemoryStream ms = new MemoryStream(); - // buffer = new byte[size]; - // bufferSize = 0; + 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); + do + { + bufferSize = readStream.Read(buffer, 0, buffer.Length); + ms.Write(buffer, 0, bufferSize); + } + while (bufferSize > 0); - // ms.Position = 0; + ms.Position = 0; - // // read stream - // StreamReader sr = new StreamReader(ms); + // read stream + StreamReader sr = new StreamReader(ms); - // // load xml - // XmlDocument xmlDocument = new XmlDocument(); - // xmlDocument.LoadXml(sr.ReadToEnd()); + // load xml + XmlDocument xmlDocument = new XmlDocument(); + xmlDocument.LoadXml(sr.ReadToEnd()); - // // parse - // XmlNode xnl = xmlDocument.SelectSingleNode("bomg/b/g"); - // if (xnl == null) - // { - // break; - // } + // parse + XmlNode xnl = xmlDocument.SelectSingleNode("bomg/b/g"); + if (xnl == null) + { + break; + } - // string rootName = (xnl.Attributes["name"] == null) ? "Bookmarks" : (string.IsNullOrWhiteSpace(xnl.Attributes["name"].InnerText) ? "Bookmarks" : xnl.Attributes["name"].InnerText.Trim()); + string rootName = (xnl.Attributes["name"] == null) ? "Bookmarks" : (string.IsNullOrWhiteSpace(xnl.Attributes["name"].InnerText) ? "Bookmarks" : xnl.Attributes["name"].InnerText.Trim()); - // foreach (XmlNode xn in xnl.ChildNodes) - // { - // BookmarkItemViewModel viewModel = new BookmarkItemViewModel(); + foreach (XmlNode xn in xnl.ChildNodes) + { + BookmarkItemViewModel viewModel = new BookmarkItemViewModel(); - // foreach (XmlNode xn2 in xn.ChildNodes) - // { - // switch (xn2.LocalName) - // { - // case "name": - // viewModel.SiteName = xn2.InnerText?.Trim(); - // break; - // case "address": - // viewModel.SiteAddress = xn2.InnerText?.Trim(); - // break; - // case "description": - // viewModel.SiteDescription = xn2.InnerText?.Trim(); - // break; - // //case "created": - // // bi.Created = xn2.InnerText?.Trim(); - // // break; - // default: - // break; - // } - // } + foreach (XmlNode xn2 in xn.ChildNodes) + { + switch (xn2.LocalName) + { + case "name": + viewModel.SiteName = xn2.InnerText?.Trim(); + break; + case "address": + viewModel.SiteAddress = xn2.InnerText?.Trim(); + break; + case "description": + viewModel.SiteDescription = xn2.InnerText?.Trim(); + break; + //case "created": + // bi.Created = xn2.InnerText?.Trim(); + // break; + default: + break; + } + } - // // fix fullpath and name - // if (viewModel.SiteName.Contains("|")) - // { - // StringBuilder sb = new StringBuilder(); - // sb.Append("\\"); - // sb.Append(System.Web.HttpUtility.UrlEncode(rootName)); - // sb.Append("\\"); + // fix fullpath and name + if (viewModel.SiteName.Contains("|")) + { + StringBuilder sb = new StringBuilder(); + sb.Append("\\"); + sb.Append(System.Web.HttpUtility.UrlEncode(rootName)); + sb.Append("\\"); - // string[] pathParts = viewModel.SiteName.Split('|'); - // for (int i = 0; i < (pathParts.Length - 1); i++) - // { - // sb.Append(pathParts[i]); - // //sb.Append(System.Web.HttpUtility.UrlDecode(pathParts[i])); - // sb.Append("\\"); - // } + string[] pathParts = viewModel.SiteName.Split('|'); + for (int i = 0; i < (pathParts.Length - 1); i++) + { + sb.Append(pathParts[i]); + //sb.Append(System.Web.HttpUtility.UrlDecode(pathParts[i])); + sb.Append("\\"); + } - // viewModel.SiteName = System.Web.HttpUtility.UrlDecode(pathParts[(pathParts.Length - 1)] ?? string.Empty); - // viewModel.TreeviewPath = sb.ToString(); - // } - // else - // { - // viewModel.SiteName = System.Web.HttpUtility.UrlDecode(viewModel.SiteName); - // viewModel.TreeviewPath = string.Format("\\{0}\\", System.Web.HttpUtility.UrlEncode(rootName)); - // } + viewModel.SiteName = System.Web.HttpUtility.UrlDecode(pathParts[(pathParts.Length - 1)] ?? string.Empty); + viewModel.TreeviewPath = sb.ToString(); + } + else + { + viewModel.SiteName = System.Web.HttpUtility.UrlDecode(viewModel.SiteName); + viewModel.TreeviewPath = string.Format("\\{0}\\", System.Web.HttpUtility.UrlEncode(rootName)); + } - // rs.Add(viewModel); - // } + rs.Add(viewModel); + } - // break; - // } + break; + } - // readStream.Flush(); - // readStream.Close(); - // readStream.Dispose(); - // readStream = null; - - // treeView1.AddItem(rs); - - // sessionFilename = sessionPassword = null; - // usePassword = !string.IsNullOrWhiteSpace(password); - - // if (this.InvokeRequired) - // { - // this.Invoke(new MethodInvoker(() => - // { - // this.ApplicationMode = AppMode.New; - // })); - // } - // else - // { - // this.ApplicationMode = AppMode.New; - // } - - // RyzStudio.Windows.Forms.ThreadControl.SetText(this, Path.GetFileNameWithoutExtension(filename) + " - " + Resources.app_name); - //} + readStream.Flush(); + readStream.Close(); + readStream.Dispose(); + readStream = null; + // load bookmark items + ThreadControl.SetValue(progressBar1, 0, rs.Count); + for (int i = 0; i < rs.Count; i++) + { + ThreadControl.SetValue(progressBar1, (i + 1)); + parentForm.TreeView.AddItem(rs[i]); + } + parentForm.ClearSession(); + parentForm.ApplicationMode = AppMode.Open; + }); + } } } \ No newline at end of file diff --git a/MainForm.Designer.cs b/MainForm.Designer.cs index 5a9963c..9c1f248 100644 --- a/MainForm.Designer.cs +++ b/MainForm.Designer.cs @@ -369,7 +369,7 @@ namespace bzit.bomg // optionsToolMenuItem // this.optionsToolMenuItem.Name = "optionsToolMenuItem"; - this.optionsToolMenuItem.Size = new System.Drawing.Size(180, 22); + this.optionsToolMenuItem.Size = new System.Drawing.Size(161, 22); this.optionsToolMenuItem.Text = "&Update Favicons"; this.optionsToolMenuItem.Click += new System.EventHandler(this.toolsOptionsMenuItem_Click); // @@ -699,7 +699,6 @@ namespace bzit.bomg private System.Windows.Forms.ToolStripMenuItem closeFileMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripSeparator4; private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; - public BookmarkTreeView treeView1; private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem4; private System.Windows.Forms.OpenFileDialog openFileDialog; private System.Windows.Forms.ContextMenuStrip folderTreeNodeMenu; @@ -733,6 +732,7 @@ namespace bzit.bomg private System.Windows.Forms.ToolStripMenuItem findEditMenuItem; private System.Windows.Forms.ToolStripSeparator toolStripMenuItem1; private System.Windows.Forms.ToolStripMenuItem alwaysOnTopToolStripMenuItem1; + private BookmarkTreeView treeView1; } } diff --git a/MainForm.cs b/MainForm.cs index 673726f..d768e26 100644 --- a/MainForm.cs +++ b/MainForm.cs @@ -198,6 +198,16 @@ namespace bzit.bomg Application.Exit(); } + public bool AllowSave + { + get => (saveMenuBarItem.Enabled || saveFileMenuItem.Enabled); + set + { + ThreadControl.SetEnable(toolStrip1, saveMenuBarItem, value); + ThreadControl.SetEnable(toolStrip1, saveFileMenuItem, value); + } + } + public AppMode ApplicationMode { get => appMode; @@ -213,7 +223,7 @@ namespace bzit.bomg ThreadControl.SetEnable(toolStrip1, closeFileMenuItem, false); this.AllowSave = false; ThreadControl.SetEnable(toolStrip1, saveAsFileMenuItem, false); - ThreadControl.SetEnable(toolStrip1, findEditMenuItem, false); + ThreadControl.SetEnable(toolStrip1, findEditMenuItem, false); ThreadControl.SetEnable(toolStrip1, expandAllViewMenuItem, false); ThreadControl.SetEnable(toolStrip1, collapseAllViewMenuItem, false); ThreadControl.SetEnable(toolStrip1, optionsToolMenuItem, false); @@ -245,16 +255,6 @@ namespace bzit.bomg } } - public bool AllowSave - { - get => (saveMenuBarItem.Enabled || saveFileMenuItem.Enabled); - set - { - ThreadControl.SetEnable(toolStrip1, saveMenuBarItem, value); - ThreadControl.SetEnable(toolStrip1, saveFileMenuItem, value); - } - } - public bool IsBusy { get => isBusy; @@ -264,6 +264,8 @@ namespace bzit.bomg } } + public RyzStudio.Windows.Forms.BookmarkTreeView TreeView { get => treeView1; set => treeView1 = value; } + #region toolbar private void fileNewMenuItem_Click(object sender, EventArgs e) @@ -663,285 +665,6 @@ namespace bzit.bomg #endregion - //protected void loadBookmarkFile(string filename, int filterIndex) - //{ - // sessionFilename = sessionPassword = null; - // usePassword = false; - - // //sessionFilename = filename; - // //sessionPassword = null; - // //usePassword = false; - - // if (RyzStudio.IO.SharpZipLib.IsZipEncrypted(filename)) - // { - // TextBoxForm passwordForm = new TextBoxForm("Password", "Password", true); - // string password = string.Empty; - - // while (true) - // { - // password = passwordForm.ShowDialog(); - // if (string.IsNullOrWhiteSpace(password)) - // { - // break; - // } - - // if (RyzStudio.IO.SharpZipLib.TestZipEncrypted(filename, password)) - // { - // sessionFilename = filename; - // sessionPassword = password; - // usePassword = true; - - // loadFileType = LoadFileType.Jsnx; - - // break; - // } - // } - // } - - // switch (filterIndex) - // { - // case 1: - // loadFileType = LoadFileType.Jsnx; - // break; - // case 2: - // loadFileType = LoadFileType.Ryz; - // break; - // default: - // loadFileType = LoadFileType.None; - // break; - // } - - // if (string.IsNullOrWhiteSpace(sessionFilename)) - // { - // return; - // } - - // this.IsBusy = true; - - // loadFileThread.RunWorkerAsync(); - //} - - //protected void loadBookmarkFile_ForJSNX(string filename, string password = "") - //{ - // int size = 2048; - // byte[] buffer = new byte[size]; - // int bufferSize = 0; - - // List rs = null; - - // ZipEntry readEntry = null; - // 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("bookmarks.json")) - // { - // 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); - // rs = JsonConvert.DeserializeObject>(sr.ReadToEnd()); - - // break; - // } - - // readStream.Flush(); - // readStream.Close(); - // readStream.Dispose(); - // readStream = null; - - // treeView1.AddItem(rs); - - // if (this.InvokeRequired) - // { - // this.Invoke(new MethodInvoker(() => - // { - // this.ApplicationMode = AppMode.Open; - // })); - // } - // else - // { - // this.ApplicationMode = AppMode.Open; - // } - - // RyzStudio.Windows.Forms.ThreadControl.SetText(this, Path.GetFileNameWithoutExtension(filename) + " - " + Resources.app_name); - //} - - //protected void loadBookmarkFile_ForRYZ(string filename, string password = "") - //{ - // int size = 2048; - // byte[] buffer = new byte[size]; - // int bufferSize = 0; - - // List rs = new List(); - - // ZipEntry readEntry = null; - // 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("bookmarks.xml")) - // { - // 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; - - // // read stream - // StreamReader sr = new StreamReader(ms); - - // // load xml - // XmlDocument xmlDocument = new XmlDocument(); - // xmlDocument.LoadXml(sr.ReadToEnd()); - - // // parse - // XmlNode xnl = xmlDocument.SelectSingleNode("bomg/b/g"); - // if (xnl == null) - // { - // break; - // } - - // string rootName = (xnl.Attributes["name"] == null) ? "Bookmarks" : (string.IsNullOrWhiteSpace(xnl.Attributes["name"].InnerText) ? "Bookmarks" : xnl.Attributes["name"].InnerText.Trim()); - - // foreach (XmlNode xn in xnl.ChildNodes) - // { - // BookmarkItemViewModel viewModel = new BookmarkItemViewModel(); - - // foreach (XmlNode xn2 in xn.ChildNodes) - // { - // switch (xn2.LocalName) - // { - // case "name": - // viewModel.SiteName = xn2.InnerText?.Trim(); - // break; - // case "address": - // viewModel.SiteAddress = xn2.InnerText?.Trim(); - // break; - // case "description": - // viewModel.SiteDescription = xn2.InnerText?.Trim(); - // break; - // //case "created": - // // bi.Created = xn2.InnerText?.Trim(); - // // break; - // default: - // break; - // } - // } - - // // fix fullpath and name - // if (viewModel.SiteName.Contains("|")) - // { - // StringBuilder sb = new StringBuilder(); - // sb.Append("\\"); - // sb.Append(System.Web.HttpUtility.UrlEncode(rootName)); - // sb.Append("\\"); - - // string[] pathParts = viewModel.SiteName.Split('|'); - // for (int i = 0; i < (pathParts.Length - 1); i++) - // { - // sb.Append(pathParts[i]); - // //sb.Append(System.Web.HttpUtility.UrlDecode(pathParts[i])); - // sb.Append("\\"); - // } - - // viewModel.SiteName = System.Web.HttpUtility.UrlDecode(pathParts[(pathParts.Length - 1)] ?? string.Empty); - // viewModel.TreeviewPath = sb.ToString(); - // } - // else - // { - // viewModel.SiteName = System.Web.HttpUtility.UrlDecode(viewModel.SiteName); - // viewModel.TreeviewPath = string.Format("\\{0}\\", System.Web.HttpUtility.UrlEncode(rootName)); - // } - - // rs.Add(viewModel); - // } - - // break; - // } - - // readStream.Flush(); - // readStream.Close(); - // readStream.Dispose(); - // readStream = null; - - // treeView1.AddItem(rs); - - // sessionFilename = sessionPassword = null; - // usePassword = !string.IsNullOrWhiteSpace(password); - - // if (this.InvokeRequired) - // { - // this.Invoke(new MethodInvoker(() => - // { - // this.ApplicationMode = AppMode.New; - // })); - // } - // else - // { - // this.ApplicationMode = AppMode.New; - // } - - // RyzStudio.Windows.Forms.ThreadControl.SetText(this, Path.GetFileNameWithoutExtension(filename) + " - " + Resources.app_name); - //} - protected void openBookmark(TreeNode node) { if (treeView1.GetNodeType(node) != RyzStudio.Windows.Forms.BookmarkTreeView.NodeType.Page) @@ -1079,6 +802,20 @@ namespace bzit.bomg protected void treeView1_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e) => openBookmark(e.Node); + protected void treeView1_OnNodeChanged(object sender, EventArgs e) + { + if (this.InvokeRequired) + { + this.Invoke(new MethodInvoker(() => { + this.AllowSave = treeView1.HasChanged; + })); + } + else + { + this.AllowSave = treeView1.HasChanged; + } + } + protected void treeView1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) { TreeNode tn = treeView1.SelectedNode; @@ -1186,21 +923,6 @@ namespace bzit.bomg #endregion - protected void treeView1_OnNodeChanged(object sender, EventArgs e) - { - if (this.InvokeRequired) - { - this.Invoke(new MethodInvoker(() => { - this.AllowSave = treeView1.HasChanged; - })); - } - else - { - this.AllowSave = treeView1.HasChanged; - } - } - - public void ClearSession() { sessionFilename = sessionPassword = null; @@ -1230,30 +952,5 @@ namespace bzit.bomg ThreadControl.SetText(this, Path.GetFileNameWithoutExtension(sessionFilename) + " - " + Resources.app_name); } - public void SetBookmarkItem(List itmes) - { - treeView1.AddItem(itmes); - } - - - - //private void loadFileThread_DoWork(object sender, DoWorkEventArgs e) - //{ - // if (loadFileType == LoadFileType.Jsnx) - // { - // loadBookmarkFile_ForJSNX(sessionFilename, sessionPassword ?? string.Empty); - // } - // else if (loadFileType == LoadFileType.Ryz) - // { - // loadBookmarkFile_ForRYZ(sessionFilename, sessionPassword ?? string.Empty); - // } - //} - - //private void loadFileThread_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) - //{ - // this.IsBusy = false; - // saveMenuBarItem.Enabled = saveFileMenuItem.Enabled = false; - //} - } } diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index cbe5b8d..c7c1090 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.3.0.025")] +[assembly: AssemblyVersion("0.3.0.030")] [assembly: AssemblyFileVersion("0.1.0.0")] diff --git a/Properties/Resources.Designer.cs b/Properties/Resources.Designer.cs index 439d428..e2d9c84 100644 --- a/Properties/Resources.Designer.cs +++ b/Properties/Resources.Designer.cs @@ -89,7 +89,7 @@ namespace bzit.bomg.Properties { } /// - /// Looks up a localized string similar to 0.3.0.025 beta. + /// Looks up a localized string similar to 0.3.0.030 beta. /// internal static string app_version { get { diff --git a/Properties/Resources.resx b/Properties/Resources.resx index 98fe4e7..281006b 100644 --- a/Properties/Resources.resx +++ b/Properties/Resources.resx @@ -128,7 +128,7 @@ Bookmark Manager - 0.3.0.025 beta + 0.3.0.030 beta ..\Resources\2\arrow-down-circle.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a diff --git a/UpdateIconsForm.cs b/UpdateIconsForm.cs index 754e195..3bc0c29 100644 --- a/UpdateIconsForm.cs +++ b/UpdateIconsForm.cs @@ -72,7 +72,7 @@ namespace bzit.bomg return; } - List nodeList = parentForm.treeView1.GetBookmarkNodeList(); + List nodeList = parentForm.TreeView.GetBookmarkNodeList(); ThreadControl.SetValue(progressBar1, 0, nodeList.Count); @@ -95,16 +95,16 @@ namespace bzit.bomg bool rv = model.UpdateFavicon(); if (rv) { - if (parentForm.treeView1.InvokeRequired) + if (parentForm.TreeView.InvokeRequired) { - parentForm.treeView1.Invoke(new MethodInvoker(() => + parentForm.TreeView.Invoke(new MethodInvoker(() => { - parentForm.treeView1.UpdateItem(nodeList[i], model.ToViewModel()); + parentForm.TreeView.UpdateItem(nodeList[i], model.ToViewModel()); })); } else { - parentForm.treeView1.UpdateItem(nodeList[i], model.ToViewModel()); + parentForm.TreeView.UpdateItem(nodeList[i], model.ToViewModel()); } } } diff --git a/bomg.sln b/skye.sln similarity index 100% rename from bomg.sln rename to skye.sln From 5b28341a83f372579ee54b23baafcdfef4e9ac38 Mon Sep 17 00:00:00 2001 From: Ray Date: Sun, 30 Aug 2020 00:25:48 +0100 Subject: [PATCH 32/34] Changed: clean-up --- BookmarkItem.cs | 524 -------------- BookmarkTreeView.Designer.cs | 36 - BookmarkTreeView.cs | 21 - LICENSE | 674 ------------------ LoadBookmarksForm.cs | 2 +- MainForm.Designer.cs | 1 + .../BookmarkItemViewModel.cs | 0 OptionsForm.Designer.cs | 151 ---- OptionsForm.cs | 44 -- OptionsForm.resx | 148 ---- PasswordForm.Designer.cs | 117 --- PasswordForm.cs | 45 -- PasswordForm.resx | 120 ---- README.md | 4 - References/SQLiteWrapper.dll | Bin 20480 -> 0 bytes References/sqlite3.dll | Bin 558133 -> 0 bytes Resources/bullet_key.ico | Bin 1150 -> 0 bytes Resources/cog.ico | Bin 1150 -> 0 bytes Resources/cog.png | Bin 512 -> 0 bytes Resources/comment.png | Bin 413 -> 0 bytes Resources/disk.png | Bin 620 -> 0 bytes Resources/folder_page.png | Bin 688 -> 0 bytes Resources/help.png | Bin 786 -> 0 bytes Resources/magnifier.ico | Bin 1150 -> 0 bytes Resources/magnifier.png | Bin 615 -> 0 bytes Resources/package_green.ico | Bin 1150 -> 0 bytes Resources/page_white_disk.png | Bin 715 -> 0 bytes Resources/page_white_gray_green.png | Bin 638 -> 0 bytes Resources/page_white_star.ico | Bin 1150 -> 0 bytes Resources/page_white_star.png | Bin 565 -> 0 bytes Resources/page_white_world_bw.png | Bin 660 -> 0 bytes Resources/transmit_blue.png | Bin 674 -> 0 bytes RyzStudio/Data/SQLite/SQLiteDatabase.cs | 444 ------------ RyzStudio/Windows/Forms/BigButton.Designer.cs | 64 -- RyzStudio/Windows/Forms/BigButton.cs | 91 --- RyzStudio/Windows/Forms/BigButton.resx | 120 ---- .../Windows/Forms/BigUserControl.Designer.cs | 37 - RyzStudio/Windows/Forms/BigUserControl.cs | 52 -- RyzStudio/Windows/ThemedForms/ThreadHelper.cs | 51 -- SessionFileFormat.cs | 93 --- UpdateIconForm.Designer.cs | 144 ---- UpdateIconForm.cs | 121 ---- UpdateIconForm.resx | 148 ---- bomg-2.ico | Bin 17542 -> 0 bytes bomg-4.ico | Bin 15086 -> 0 bytes bomg.csproj | 2 +- 46 files changed, 3 insertions(+), 3251 deletions(-) delete mode 100644 BookmarkItem.cs delete mode 100644 BookmarkTreeView.Designer.cs delete mode 100644 BookmarkTreeView.cs delete mode 100644 LICENSE rename {ViewModels => Models}/BookmarkItemViewModel.cs (100%) delete mode 100644 OptionsForm.Designer.cs delete mode 100644 OptionsForm.cs delete mode 100644 OptionsForm.resx delete mode 100644 PasswordForm.Designer.cs delete mode 100644 PasswordForm.cs delete mode 100644 PasswordForm.resx delete mode 100644 README.md delete mode 100644 References/SQLiteWrapper.dll delete mode 100644 References/sqlite3.dll delete mode 100644 Resources/bullet_key.ico delete mode 100644 Resources/cog.ico delete mode 100644 Resources/cog.png delete mode 100644 Resources/comment.png delete mode 100644 Resources/disk.png delete mode 100644 Resources/folder_page.png delete mode 100644 Resources/help.png delete mode 100644 Resources/magnifier.ico delete mode 100644 Resources/magnifier.png delete mode 100644 Resources/package_green.ico delete mode 100644 Resources/page_white_disk.png delete mode 100644 Resources/page_white_gray_green.png delete mode 100644 Resources/page_white_star.ico delete mode 100644 Resources/page_white_star.png delete mode 100644 Resources/page_white_world_bw.png delete mode 100644 Resources/transmit_blue.png delete mode 100644 RyzStudio/Data/SQLite/SQLiteDatabase.cs delete mode 100644 RyzStudio/Windows/Forms/BigButton.Designer.cs delete mode 100644 RyzStudio/Windows/Forms/BigButton.cs delete mode 100644 RyzStudio/Windows/Forms/BigButton.resx delete mode 100644 RyzStudio/Windows/Forms/BigUserControl.Designer.cs delete mode 100644 RyzStudio/Windows/Forms/BigUserControl.cs delete mode 100644 RyzStudio/Windows/ThemedForms/ThreadHelper.cs delete mode 100644 SessionFileFormat.cs delete mode 100644 UpdateIconForm.Designer.cs delete mode 100644 UpdateIconForm.cs delete mode 100644 UpdateIconForm.resx delete mode 100644 bomg-2.ico delete mode 100644 bomg-4.ico diff --git a/BookmarkItem.cs b/BookmarkItem.cs deleted file mode 100644 index 6ac6e70..0000000 --- a/BookmarkItem.cs +++ /dev/null @@ -1,524 +0,0 @@ -using HtmlAgilityPack; -using System; -using System.ComponentModel; -using System.Drawing; -using System.IO; -using System.Net; -using System.Windows.Forms; -using HtmlDocument = HtmlAgilityPack.HtmlDocument; - -namespace bzit.bomg -{ - public class BookmarkItem - { - public delegate void RetrieveCompleted(BookmarkItem sender, bool hasError, string message); - - public RetrieveCompleted OnRetrieveCompleted { get; set; } = null; - - public TreeNode TreeViewNode { get; protected set; } - - public byte[] IconData { get; set; } = null; - - public string SiteName { get; set; } = null; - public string SiteAddress { get; set; } - public string Description { get; set; } - public string IconAddress { get; set; } - public string Fullpath { get; set; } - public string Created { get; set; } - - protected const char pathSeparator = '|'; - - //protected TreeNode treeNode = null; - protected BackgroundWorker mainThread = null; - - protected bool hasRetrieveError = false; - protected string retrieveErrorMessage = null; - - public BookmarkItem() - { - this.Clear(); - } - - public new string ToString() - { - string rv = ""; - rv += "Name=" + this.Fullpath + Environment.NewLine; - rv += "Address=" + this.SiteAddress + Environment.NewLine; - rv += "Description=" + this.Description + Environment.NewLine; - rv += "Created=" + this.Created?.Trim(); - - return rv; - } - - #region public properties - - - //{ - // get - // { - // return this.treeNode; - // } - - // set - // { - // this.treeNode = value; - // } - //} - - public Bitmap Icon - { - get - { - if (this.IconData == null) - { - return null; - } - - try - { - Image img = Image.FromStream(new MemoryStream(this.IconData)); - return new Bitmap(img, 16, 16); - } - catch - { - return null; - } - } - } - - - - #endregion - - #region public methods - - public void Clear() - { - this.Fullpath = string.Empty; - this.SiteAddress = string.Empty; - this.Description = string.Empty; - this.Created = string.Empty; - - if (this.mainThread == null) - { - this.mainThread = new BackgroundWorker(); - this.mainThread.WorkerReportsProgress = this.mainThread.WorkerSupportsCancellation = true; - this.mainThread.DoWork += retrieveWorker_DoWork; - this.mainThread.RunWorkerCompleted += retrieveWorker_RunWorkerCompleted; - } - } - - public string GetName() - { - if (this.Fullpath.Contains(pathSeparator.ToString())) - { - return decodePath(this.Fullpath.Substring(this.Fullpath.LastIndexOf(pathSeparator) + 1)).Trim(); - } - - return decodePath(this.Fullpath).Trim(); - } - - public void ChangeName(string newName) - { - string prefix = (this.Fullpath.Contains(pathSeparator.ToString()) ? this.Fullpath.Substring(0, this.Fullpath.IndexOf(pathSeparator)).Trim() : string.Empty); - - this.Fullpath = string.Concat(prefix, pathSeparator, encodePath(newName.Trim())); - } - - public void GetFaviconAddress() - { - hasRetrieveError = false; - retrieveErrorMessage = string.Empty; - - this.IconData = null; - - WebClient webClient = new WebClient(); - webClient.CachePolicy = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.NoCacheNoStore); - - string sourceCode = string.Empty; - - try - { - sourceCode = webClient.DownloadString(this.SiteAddress); - } - catch (Exception exc) - { - hasRetrieveError = true; - retrieveErrorMessage = exc.Message; - return; - } - - HtmlAgilityPack.HtmlDocument document = new HtmlAgilityPack.HtmlDocument(); - document.LoadHtml(sourceCode); - - // favicon - this.IconAddress = parseSiteIcon(document); - if (!string.IsNullOrWhiteSpace(this.IconAddress)) - { - Uri iconAddressURI; - bool rv = Uri.TryCreate(new Uri(this.SiteAddress), this.IconAddress, out iconAddressURI); - if (rv) - { - this.IconAddress = iconAddressURI.ToString(); - } - } - - // load favicon image - if (!string.IsNullOrEmpty(this.IconAddress)) - { - try - { - this.IconData = webClient.DownloadData(this.IconAddress); - - if (!RyzStudio.IO.FileType.IsImage(this.IconData)) - { - this.IconData = null; - } - } - catch - { - this.IconData = null; - this.IconAddress = null; - } - } - - //// parse icon - //HtmlAgilityPack.HtmlNodeCollection hnc = document.DocumentNode.SelectNodes("//link"); - // if (hnc != null) - // { - // foreach (HtmlAgilityPack.HtmlNode node in hnc) - // { - // if (node.Attributes["rel"] == null) - // { - // continue; - // } - - // string nodeAttr = node.Attributes["rel"].Value.Trim(); - // if (nodeAttr.ToLower().Contains("icon")) - // { - // if (!string.IsNullOrEmpty(this.IconAddress)) - // { - // continue; - // } - - // if (node.Attributes["href"] != null) - // { - // Uri iconPath; - // bool rv = Uri.TryCreate(new Uri(this.SiteAddress), WebUtility.HtmlDecode(node.Attributes["href"].Value).Trim(), out iconPath); - // if (rv) - // { - // this.IconAddress = iconPath.ToString(); - // } - - // break; - // } - // } - // } - // } - - // // default favicon - // if (string.IsNullOrEmpty(this.IconAddress)) - // { - // Uri iconPath; - // if (Uri.TryCreate(new Uri(this.SiteAddress), "/favicon.ico", out iconPath)) - // { - // this.IconAddress = iconPath.ToString(); - // } - // } - - // // load icon image - // if (!string.IsNullOrEmpty(this.IconAddress)) - // { - // try - // { - // this.IconData = webClient.DownloadData(this.IconAddress); - - // if (!RyzStudio.IO.FileType.IsImage(this.IconData)) - // { - // this.IconData = null; - // } - // } - // catch - // { - // // do nothing - // } - // } - } - - public void RetrieveAsync() - { - if (this.mainThread.IsBusy) - { - return; - } - - this.mainThread.RunWorkerAsync(); - } - - public void RetrieveAsync(string address) - { - if (this.mainThread.IsBusy) - { - return; - } - - this.SiteAddress = address; - this.mainThread.RunWorkerAsync(); - } - - #endregion - - - protected void retrieveWorker_DoWork(object sender, DoWorkEventArgs e) - { - hasRetrieveError = false; - retrieveErrorMessage = string.Empty; - - this.IconData = null; - this.Fullpath = string.Empty; - this.Description = string.Empty; - this.IconAddress = string.Empty; - - WebClient webClient = new WebClient(); - webClient.CachePolicy = new System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.NoCacheNoStore); - - string sourceCode = string.Empty; - - try - { - sourceCode = webClient.DownloadString(this.SiteAddress); - } - catch (Exception exc) - { - hasRetrieveError = true; - retrieveErrorMessage = exc.Message; - return; - } - - HtmlDocument document = new HtmlDocument(); - document.LoadHtml(sourceCode); - - // title - this.SiteName = parseSiteTitle(document); - - // description - this.Description = parseSiteDescription(document); - - // favicon - this.IconAddress = parseSiteIcon(document); - if (!string.IsNullOrWhiteSpace(this.IconAddress)) - { - Uri iconAddressURI; - bool rv = Uri.TryCreate(new Uri(this.SiteAddress), this.IconAddress, out iconAddressURI); - if (rv) - { - this.IconAddress = iconAddressURI.ToString(); - } - } - - // load favicon image - if (!string.IsNullOrWhiteSpace(this.IconAddress)) - { - try - { - this.IconData = webClient.DownloadData(this.IconAddress); - - if (!RyzStudio.IO.FileType.IsImage(this.IconData)) - { - this.IconData = null; - } - } - catch - { - this.IconData = null; - this.IconAddress = null; - } - } - } - - protected void retrieveWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) - { - this.OnRetrieveCompleted?.Invoke(this, hasRetrieveError, retrieveErrorMessage); - } - - protected string encodePath(string text) => System.Web.HttpUtility.UrlEncode(text); - - protected string decodePath(string text) => System.Web.HttpUtility.UrlDecode(text); - - 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; - } - - 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); - } - - if (string.IsNullOrWhiteSpace(rs)) - { - rs = parseTagValue_Attr(doc, "//link[@rel='icon']", "href", string.Empty); - } - - if (string.IsNullOrWhiteSpace(rs)) - { - rs = parseTagValue_Attr(doc, "//link[@rel='apple-touch-icon']", "href", string.Empty); - } - - if (string.IsNullOrWhiteSpace(rs)) - { - rs = parseTagValue_Attr(doc, "//link[@rel='apple-touch-icon-precomposed']", "href", string.Empty); - } - - if (string.IsNullOrWhiteSpace(rs)) - { - rs = parseTagValue_Attr(doc, "//meta[@property='og:image']", "content", string.Empty); - } - - if (string.IsNullOrWhiteSpace(rs)) - { - rs = parseTagValue_Attr(doc, "//meta[@name='twitter:image']", "content", string.Empty); - } - - if (string.IsNullOrWhiteSpace(rs)) - { - rs = parseTagValue_Attr(doc, "//meta[@property='og:image']", "content", string.Empty); - } - - if (string.IsNullOrWhiteSpace(rs)) - { - rs = parseTagValue_Attr(doc, "//meta[@itemprop='image']", "content", string.Empty); - } - - return rs; - } - - - } -} \ No newline at end of file diff --git a/BookmarkTreeView.Designer.cs b/BookmarkTreeView.Designer.cs deleted file mode 100644 index a085fe3..0000000 --- a/BookmarkTreeView.Designer.cs +++ /dev/null @@ -1,36 +0,0 @@ -namespace bzit.bomg -{ - partial class BookmarkTreeView - { - /// - /// 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(); - } - - #endregion - } -} diff --git a/BookmarkTreeView.cs b/BookmarkTreeView.cs deleted file mode 100644 index 85fae29..0000000 --- a/BookmarkTreeView.cs +++ /dev/null @@ -1,21 +0,0 @@ -using bzit.bomg.Models; -using System; -using System.ComponentModel; -using System.Drawing; -using System.IO; -using System.Windows.Forms; - -namespace bzit.bomg -{ - public partial class BookmarkTreeView : RyzStudio.Windows.Forms.MovableTreeView - { - - public BookmarkTreeView() - { - InitializeComponent(); - - } - - - } -} \ No newline at end of file diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 9cecc1d..0000000 --- a/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - {one line to give the program's name and a brief idea of what it does.} - Copyright (C) {year} {name of author} - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - {project} Copyright (C) {year} {fullname} - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/LoadBookmarksForm.cs b/LoadBookmarksForm.cs index 88f317c..242cd94 100644 --- a/LoadBookmarksForm.cs +++ b/LoadBookmarksForm.cs @@ -61,7 +61,7 @@ namespace bzit.bomg isBusy = value; parentForm.IsBusy = value; - //ThreadControl.SetImage(pictureBox1, (value) ? Resources.aniZomq2x32 : null); + ThreadControl.SetImage(pictureBox1, (value) ? Properties.Resources.aniZomq2x32 : null); //ThreadControl.SetEnable(button2, !value); } } diff --git a/MainForm.Designer.cs b/MainForm.Designer.cs index 9c1f248..af1ef74 100644 --- a/MainForm.Designer.cs +++ b/MainForm.Designer.cs @@ -650,6 +650,7 @@ namespace bzit.bomg this.Controls.Add(this.toolStrip1); this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; this.MinimumSize = new System.Drawing.Size(320, 600); this.Name = "MainForm"; this.StartPosition = System.Windows.Forms.FormStartPosition.Manual; diff --git a/ViewModels/BookmarkItemViewModel.cs b/Models/BookmarkItemViewModel.cs similarity index 100% rename from ViewModels/BookmarkItemViewModel.cs rename to Models/BookmarkItemViewModel.cs diff --git a/OptionsForm.Designer.cs b/OptionsForm.Designer.cs deleted file mode 100644 index 749a7c5..0000000 --- a/OptionsForm.Designer.cs +++ /dev/null @@ -1,151 +0,0 @@ -namespace bzit.bomg -{ - partial class OptionsForm - { - /// - /// 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(OptionsForm)); - this.label1 = new System.Windows.Forms.Label(); - this.tbxAddress = new System.Windows.Forms.TextBox(); - this.label2 = new System.Windows.Forms.Label(); - this.oToolTip = new System.Windows.Forms.ToolTip(this.components); - this.comboBox1 = new System.Windows.Forms.ComboBox(); - this.btnSave = new RyzStudio.Windows.Forms.BigButton(); - this.textBox1 = new System.Windows.Forms.TextBox(); - this.SuspendLayout(); - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(12, 12); - this.label1.Margin = new System.Windows.Forms.Padding(3); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(94, 13); - this.label1.TabIndex = 0; - this.label1.Text = "Open Bookmark:"; - // - // tbxAddress - // - this.tbxAddress.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(51)))), ((int)(((byte)(51)))), ((int)(((byte)(51))))); - this.tbxAddress.Location = new System.Drawing.Point(12, 78); - this.tbxAddress.MaxLength = 4096; - this.tbxAddress.Name = "tbxAddress"; - this.tbxAddress.Size = new System.Drawing.Size(178, 22); - this.tbxAddress.TabIndex = 0; - // - // label2 - // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(12, 59); - this.label2.Margin = new System.Windows.Forms.Padding(3); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(104, 13); - this.label2.TabIndex = 4; - this.label2.Text = "Custom Command:"; - // - // oToolTip - // - this.oToolTip.Active = false; - this.oToolTip.BackColor = System.Drawing.Color.IndianRed; - // - // comboBox1 - // - this.comboBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.comboBox1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.comboBox1.FormattingEnabled = true; - this.comboBox1.Items.AddRange(new object[] { - "Default", - "Custom Command"}); - this.comboBox1.Location = new System.Drawing.Point(12, 31); - this.comboBox1.Name = "comboBox1"; - this.comboBox1.Size = new System.Drawing.Size(280, 21); - this.comboBox1.TabIndex = 61; - // - // btnSave - // - this.btnSave.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.btnSave.BackColor = System.Drawing.Color.WhiteSmoke; - this.btnSave.Location = new System.Drawing.Point(196, 227); - this.btnSave.MaximumSize = new System.Drawing.Size(120, 32); - this.btnSave.MinimumSize = new System.Drawing.Size(32, 32); - this.btnSave.Name = "btnSave"; - this.btnSave.Padding = new System.Windows.Forms.Padding(4); - this.btnSave.Size = new System.Drawing.Size(96, 32); - this.btnSave.TabIndex = 3; - this.btnSave.Value = "&Save"; - this.btnSave.Click += new System.EventHandler(this.btnSave_Click); - // - // 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.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(51)))), ((int)(((byte)(51)))), ((int)(((byte)(51))))); - this.textBox1.Location = new System.Drawing.Point(196, 78); - this.textBox1.MaxLength = 4096; - this.textBox1.Name = "textBox1"; - this.textBox1.Size = new System.Drawing.Size(96, 22); - this.textBox1.TabIndex = 62; - // - // OptionsForm - // - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; - this.BackColor = System.Drawing.Color.White; - this.ClientSize = new System.Drawing.Size(304, 271); - this.Controls.Add(this.textBox1); - this.Controls.Add(this.comboBox1); - this.Controls.Add(this.label1); - this.Controls.Add(this.tbxAddress); - this.Controls.Add(this.btnSave); - this.Controls.Add(this.label2); - this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "OptionsForm"; - this.ShowInTaskbar = false; - this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Options"; - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Label label1; - private System.Windows.Forms.TextBox tbxAddress; - private System.Windows.Forms.Label label2; - private System.Windows.Forms.ToolTip oToolTip; - private RyzStudio.Windows.Forms.BigButton btnSave; - private System.Windows.Forms.ComboBox comboBox1; - private System.Windows.Forms.TextBox textBox1; - } -} \ No newline at end of file diff --git a/OptionsForm.cs b/OptionsForm.cs deleted file mode 100644 index 7e50850..0000000 --- a/OptionsForm.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System; -using System.Windows.Forms; - -namespace bzit.bomg -{ - public partial class OptionsForm : Form - { - private MainForm parentForm = null; - - public OptionsForm(MainForm form) - { - InitializeComponent(); - - parentForm = form; - - this.StartPosition = FormStartPosition.WindowsDefaultLocation; - } - - protected override void OnLoad(EventArgs e) - { - base.OnLoad(e); - - comboBox1.SelectedIndex = 0; - - comboBox1.SelectedIndex = ((parentForm.IconDatabase.GetConfig("core.bookmark.action", string.Empty).Equals("1")) ? 1 : 0); - tbxAddress.Text = parentForm.IconDatabase.GetConfig("core.bookmark.customcommand1", string.Empty).Trim(); - textBox1.Text = parentForm.IconDatabase.GetConfig("core.bookmark.customcommand2", string.Empty).Trim(); - } - - protected override void OnShown(EventArgs e) - { - base.OnShown(e); - } - - private void btnSave_Click(object sender, EventArgs e) - { - parentForm.IconDatabase.SetConfig("core.bookmark.action", comboBox1.SelectedIndex.ToString()); - parentForm.IconDatabase.SetConfig("core.bookmark.customcommand1", tbxAddress.Text.Trim()); - parentForm.IconDatabase.SetConfig("core.bookmark.customcommand2", textBox1.Text.Trim()); - - this.Close(); - } - } -} \ No newline at end of file diff --git a/OptionsForm.resx b/OptionsForm.resx deleted file mode 100644 index 9941254..0000000 --- a/OptionsForm.resx +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - - - AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsbGxjV1dXv1BQUL9RUVFjAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAbm5uKWlpaQ55eXkCgICA6ry8vP+xsbH/Wlpa6llZWQJbW1sOTU1NKQAA - AAAAAAAAAAAAAAAAAAAAAAAAgICAm25ubv1jY2PndXV1GYKCgufLy8v/x8fH/2FhYedZWVkZV1dX501N - Tf1ISEibAAAAAAAAAAAAAAAAo6Oje7u7u//e3t7/paWl/4KCgvSEhIT+w8PD/8HBwf9sbGz+bW1t9KWl - pf/S0tL/f39//1FRUXsAAAAAAAAAAKqqqn2lpaX+1dXV/8TExP/Ly8v/0dHR/8nJyf/Hx8f/zMzM/8TE - xP+8vLz/y8vL/21tbf5mZmZ9AAAAAAAAAAAAAAAAq6urhcTExP/AwMD/xMTE/8fHx/+pqan/pqam/8DA - wP+9vb3/tLS0/6mpqf9oaGiFAAAAAAAAAACioqLNjo6O45+fn+7Pz8//xcXF/8zMzP+dnZ3GmJiYRJOT - k0SOjo7GwMDA/7u7u/+4uLj/Y2Nj7ldXV+NSUlLNvr6+/eLi4v/S0tL/xcXF/83Nzf+wsLD/kpKSRAAA - AAAAAAAAlJSURKenp//BwcH/tra2/7+/v//S0tL/YGBg/cPDw/3p6en/1tbW/8nJyf/Ozs7/pKSk/4OD - g0QAAAAAAAAAAJmZmUSrq6v/w8PD/7m5uf/FxcX/3d3d/2pqav3IyMjNw8PD47+/v+7Y2Nj/zc3N/7u7 - u/+BgYHGdnZ2RH19fUSOjo7GwsLC/8HBwf/Nzc3/i4uL7oaGhuOCgoLNAAAAAAAAAADExMSF1NTU/8zM - zP/Jycn/ubm5/5ubm/+goKD/wcHB/8XFxf/AwMD/tra2/4iIiIUAAAAAAAAAAAAAAADKysp9w8PD/tzc - 3P/U1NT/2dnZ/9vb2//W1tb/1NTU/9nZ2f/S0tL/y8vL/8jIyP94eHj+cHBwfQAAAAAAAAAA0NDQe9zc - 3P/t7e3/29vb/8HBwfS9vb3+1tbW/9TU1P+vr6/+q6ur9MvLy//n5+f/tra2/4qKinsAAAAAAAAAAAAA - AADR0dGbzs7O/crKyufFxcUZwcHB597e3v/d3d3/sbGx57CwsBmrq6vnpqam/aKiopsAAAAAAAAAAAAA - AAAAAAAAAAAAANHR0SnOzs4Oy8vLAsfHx+rl5eX/5OTk/6urq+q1tbUCsbGxDqysrCkAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADLy8tjx8fHv8PDw7++vr5jAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAA/D+sQeAHrEHAA6xBgAGsQYABrEHAA6xBAACsQQGArEEBgKxBAACsQcADrEGAAaxBgAGsQcAD - rEHgB6xB/D+sQQ== - - - \ No newline at end of file diff --git a/PasswordForm.Designer.cs b/PasswordForm.Designer.cs deleted file mode 100644 index 21a52fa..0000000 --- a/PasswordForm.Designer.cs +++ /dev/null @@ -1,117 +0,0 @@ -namespace bzit.bomg -{ - partial class PasswordForm - { - /// - /// 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.button2 = new RyzStudio.Windows.ThemedForms.Button(); - this.horizontalSeparator1 = new RyzStudio.Windows.Forms.HorizontalSeparator(); - this.textBox1 = new RyzStudio.Windows.ThemedForms.TextBox(); - this.label2 = new System.Windows.Forms.Label(); - this.SuspendLayout(); - // - // button2 - // - this.button2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.button2.BackColor = System.Drawing.Color.Transparent; - this.button2.DefaultImage = null; - this.button2.DownImage = null; - this.button2.LabelText = "&OK"; - this.button2.Location = new System.Drawing.Point(264, 77); - this.button2.Name = "button2"; - this.button2.OverImage = null; - this.button2.Padding = new System.Windows.Forms.Padding(4, 4, 3, 3); - this.button2.Size = new System.Drawing.Size(108, 32); - this.button2.TabIndex = 1; - this.button2.Click += new System.EventHandler(this.button2_Click); - // - // horizontalSeparator1 - // - this.horizontalSeparator1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.horizontalSeparator1.Location = new System.Drawing.Point(12, 62); - this.horizontalSeparator1.Margin = new System.Windows.Forms.Padding(3, 10, 3, 10); - this.horizontalSeparator1.MaximumSize = new System.Drawing.Size(4920, 2); - this.horizontalSeparator1.Name = "horizontalSeparator1"; - this.horizontalSeparator1.Size = new System.Drawing.Size(360, 2); - this.horizontalSeparator1.TabIndex = 73; - // - // 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.Location = new System.Drawing.Point(96, 15); - 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(276, 32); - this.textBox1.SubmitButton = this.button2; - this.textBox1.TabIndex = 0; - this.textBox1.UseSystemPasswordChar = false; - // - // label2 - // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(12, 25); - this.label2.Margin = new System.Windows.Forms.Padding(3); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(53, 13); - this.label2.TabIndex = 71; - this.label2.Text = "Password"; - // - // PasswordForm - // - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; - this.BackColor = System.Drawing.Color.White; - this.ClientSize = new System.Drawing.Size(384, 121); - this.Controls.Add(this.button2); - this.Controls.Add(this.horizontalSeparator1); - this.Controls.Add(this.textBox1); - this.Controls.Add(this.label2); - this.Font = new System.Drawing.Font("Tahoma", 8.25F); - this.MaximizeBox = false; - this.MinimizeBox = false; - this.MinimumSize = new System.Drawing.Size(400, 160); - this.Name = "PasswordForm"; - this.ShowIcon = false; - this.ShowInTaskbar = false; - this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Password"; - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - private RyzStudio.Windows.ThemedForms.Button button2; - private RyzStudio.Windows.Forms.HorizontalSeparator horizontalSeparator1; - private RyzStudio.Windows.ThemedForms.TextBox textBox1; - private System.Windows.Forms.Label label2; - } -} \ No newline at end of file diff --git a/PasswordForm.cs b/PasswordForm.cs deleted file mode 100644 index 724808d..0000000 --- a/PasswordForm.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System; -using System.Windows.Forms; - -namespace bzit.bomg -{ - public partial class PasswordForm : Form - { - private MainForm parentForm = null; - - public PasswordForm(MainForm form) - { - InitializeComponent(); - - parentForm = form; - } - - private void button2_Click(object sender, EventArgs e) - { - if (parentForm == null) - { - return; - } - - this.Close(); - } - - private void textBox1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) - { - switch (e.KeyCode) - { - case Keys.Escape: - this.Close(); - break; - default: break; - } - } - - public new string ShowDialog() - { - base.ShowDialog(); - - return textBox1.Text; - } - } -} \ No newline at end of file diff --git a/PasswordForm.resx b/PasswordForm.resx deleted file mode 100644 index d58980a..0000000 --- a/PasswordForm.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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/README.md b/README.md deleted file mode 100644 index 9706953..0000000 --- a/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# bookmark-manager -Bookmark Manager is a free utility for storing and organising your favourite Internet shortcuts - -http://www.hiimray.co.uk/software-bookmark-manager diff --git a/References/SQLiteWrapper.dll b/References/SQLiteWrapper.dll deleted file mode 100644 index ec9f1f82cda4ce19b922b6a12c41a4f084ffb52c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20480 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°p 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

U~9pZQ?~}i@*4rw1^kxG`4CsBB6x< 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%0A-hY~V=-;_joSv+te9<@3H(wHl; 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�X6H%qlKDjVm3 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%0DSl%c%D7_eD<$wqiTR|f6baD)lTQ)%)|ELbw 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 PkkBNz%C+<>Tl)V4CJ5n6 diff --git a/Resources/bullet_key.ico b/Resources/bullet_key.ico deleted file mode 100644 index 88e2f20fbc87a2cfd3670d0f9529398cb8b683c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcmZQzU<5(|0R|wcz>vYhz#zuJz@P!dKp~(AL>x#BdtlsivejkY)t8n%ryr=KEeRvl z!|rPzpKN{k^S{r{um3G4p82etFejE2Gu&4_Jip-CkN@VEKK*yQ_U*sbC^+12wO~3hp z82!3aZ>Gf@c=dPDhu{C}uYCAld;HCR|3!DdD&%e@%KacaG$!0A$UFJw|H;q4|A*~- z{#K>stOqf6!_??Zy~SiO<5s8Zs)whwrrt`1i4Q0G|Nk|PF#Hh6egMMqK+M0!@dNuB S$3IB;A5iQcP!6UZL<0bYD$?Bm diff --git a/Resources/cog.ico b/Resources/cog.ico deleted file mode 100644 index 737f1a86914e7c123e5f70b307a9952ecbcb6d8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcmb7DNlPPP5N$I9a|@mZa+~A$D~3Q0UINC8s23#=qNsRL6bXqdqToS2Bm_}nqNoi~ zP*F7LxUcPoisHhMD2)Mg%5l2OS6@hG!GW0$y`;YHy?XVkK1nLVueeyk^NZyEC`q3s zN&1Q#Aw+Uc+}_@9^7(w}_4RdHSXiK{ zs;YElWu>XQy4q~F+e_Z#!u}xey3^^@T3T8xU0q$;(a{m@?d?%*ZLJ2p1$s2#_0rPP z;IAB$lan25YisoQ_(+jRgn-TV^z;~8TU)fTu|cTCXl!iE^4i741$n(*LQNfcj@j8+ z57vyUt1H^x-X_j_etu2|2L~em@$s>Ub3MEUF2m(=dGdIE&&|#CGB%M&h`p?PW@d(_ zrlv$J7K_p1;-ZMT-R|BzHWUh}LqkKU@$vD@>FFu$?CcQd8yg$j_51y{k&zJ_)_0kg zYg}1bA$XL57pd~{ay1^0>&awN)Wuj;RcU^Ho`#2qZTTFdqocOz>1pA`^71k%iX!&c z)YRzkNPl^Gq3i2wQSZsg35CO9>hA6?-~)kx4fPTGxw^V4G(J2$P&YG>a$PcRsy ziHQk;Y?}<5XZ*S@D?oQN{|IdBr-a#+5wY3?|&CP}W zot>R^F!uHJRp2l)S@g?bPZ%GKMh(=TWxS?oLc_qoKw*AZ1Lh?N?{sLrzZj~y|lDs0*_gi<#*3dj^XDM t98Pd3@I}Fl{Pq0)_$FJwf0C_<53>K>9IF$eZ diff --git a/Resources/cog.png b/Resources/cog.png deleted file mode 100644 index 67de2c6ccbeac17742f56cf7391e72b2bf5033ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 512 zcmV+b0{{JqP)CQDsH?WF>AIFt zQuJ}i;w2$ZUU#3SZ6RY0Gw;kZ&ol1~2ky^QZ(fom$=jNJZt!z7w_pH~wdQ;R)Gh%BbQFCx+Nm!4SuS-vkr`vhhrX zM*>w%e+v~?m@q~ImPAgtLkR_3U<2F8LP3W5=LJ*ZN|S5p#sf4YFr$p~Q~Z*0Ngxf2 zjk#J#<7EAlhzlrV53~GF&pIzcCN_lz9@05UeoUXiK%N z#x+4o*i_c|6_Uu1+&TIho?3@y4k-#b8Y_o94zW*B3a1ne2-Y5s0uke$$|@=}OP-i= zNYZQA=>PrZu0MfSL=b8UhD_={W4IY1{b{)U)*gc45xtL%IYLY&hF;d`@GzI&7H&D# zh;z_BX$#hqh@q?AY3sJTod2%*Yd)_>YM0#q&ixGuh+PQsneK)F00004%P)i2vikyMR~)n*keF9=!Gc_n*K2@qsNT?}H4v4a974 z1ArVJApZ0B-@pGKzWw|E^3%Wn&p!V9|K$C@{}12&`+x7vzyG&i{r!LE6~yrB1;;^# zm?0Y=moxPMSn>r>N00000NkvXX Hu0mjf$^yWL diff --git a/Resources/disk.png b/Resources/disk.png deleted file mode 100644 index 99d532e8b1750115952f97302a92d713c0486f97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 620 zcmV-y0+aoTP)~H+MJzd|s z^YP1Hc07G_>)Lgir!F1{Qn4GcTg%?koHo<=1qRN{}nPDolOeI^o4N5I>! zU$N=L=sg~ zDx#dOA*B0N~cqPsWI(^rbbkh)DS0_H_UN0C4l_kvWIm2#Kyy6%BCh z(yIUf003&1xdx>t$*eR2ZvXxT0001Z_R$y3Iju92q*wg58};}zm(OaAH=p|y0002M zh5O5#fxp|~jc?yi@+7$`d4Q6Hl%z;WiWG??NXR{Hx%)pMd~SE0000OQI diff --git a/Resources/folder_page.png b/Resources/folder_page.png deleted file mode 100644 index 1ef6e11438f3226f88bdc457f55d677d1f2f8409..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 688 zcmV;h0#E&kP)CVGc zN?Hxg{(SJp>2>GN9JetoZ(aZH;Ije%0FdZ{S!LRVX%}YG;=d8L^N!mJkCd*SBx($jgG)S}+Le)f;q=GIn30YFNh3ZW|nh}2rL)`=3ju9K*d z<&~Gte>sT=5|RjR+}A(|O&3gS5t&*G5h0Um$c5IgEgxJl_8nzY#B+YU^|Fhvzo-^U z6fNn3(lBMcl9{Silx)4RpURdFw}1BZ?>}8S&h8fk5`hjKW@sP$LJL*otPOMf+jp$? zcC^*PiL>vkTOZln=wuc^%A^$j`TU&aa3ETVYE{(r=bgN835`stIePGw{uwD`7K9Y) z=4)VDHnkl3YL%JeLce6>Uubzae&kQ4($XgYMs^AIOw1Qr{*Wn)N-{9ma}x2(<~`9Go1=*>YR!KZvrBS zCd!u}@M0og%Ev@_;Z?Kk>Wwv=%h_57zmt2<_1msz_niYE=YRNPpd%02TK9oK1z z>ooPno}v^sikz_|1XHFx_L%~;ljh7i(jiay5F0x*+(9aXXFCl?AdQj5XlQ65%sEv+ ztfe?|YcjPN*@yYtE~ImQh{l|#A6Z8iu>pf43Rj52CzU_dMQm|S2xR62YjQOn+z8WH zaK=!}ggOZi{4pB7SQ=xC0n|vXP_Bkx_a)FeNd}w8U97BNbSWxa^QW-li9BZ#M1!_xE*?wzt^GcoeoL*JGLSe_+l-JT2#2tz!z&^ z_s5anq&^nBklIMwRvcoP3%qs%%Ea?1c{_*V*Xj&~uLu-2Dp1fUN4<0zMo$EH>*U83 zm_9;Vt%-bE{_J_!If!1y=c+`QVZ>0_BPy z+%^pgnv`f8H)Z%0&Tp8&u*MCIC4igNW5MeWM_DHpDNi)Zxz|9XboOnitwFq$ETN=X zj-tkCJnz**Y4k#6_Ty^B=hWo~L!47r`HoP=x&3T1)JLr2t2+#fHVpu~8dqVKzuayadC!km-*)Z`)1}(Q7g#Q z=_vBuL>*g6QR^s*+Dt?&;?#Wd`|o4zfg26FeLao;a*?LiJKDxWeRR`NBi8KKU;LYl zZKsB`TTTqpd#~7V$--j&!Cw3+zq?~hyW{L*`f%?wj7$Qpx188;#F+k>XP;cvMCfiq z=-~x1IM`7M+-CY&~gCHy^*({5_wr-`2#(Z!#%24LR;Z z@k5a44J6hD{zX5W=4vT)*eeth zZ^2uQFkbH|?&-As!m516WfqIcFbZ*RmB~jPwTy5rL*m@<4YViK+NH*VpROnw9y0HO z%+4S`KZ$&lffSj56t<)EF$lFMOR=h#4?e9Z*?9GQnRk;nI7!CTx4V>*A%usz>hi_# zb5TiiD3Ut$4f6Zf)jr7VG+BEf3jxF)T^8$|Uyj)gCBchwPON1J{wh}x15iG*$jn;6 zKhqoP@r#^8Q;tnAir_;z!$HXjP_hC_pQ2cpvm@ykU_@J=rXH{QiyWgV&%ZP%5vy1T zjaSs3e3=~;bDm*Cdgj5h>~guk+XF^gkR+NS>Lh9yX<>-YuOeDav~g)MJ4r2JzXBZ* BlqCQF diff --git a/Resources/magnifier.png b/Resources/magnifier.png deleted file mode 100644 index cf3d97f75e9cde9c143980d89272fe61fc2d64ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 615 zcmV-t0+{`YP)gNuvOO$0ks zMIj=HnnBRUR?tKXG11rxCU4&7dG4NbuvR2_mEvc)n?Cow;~Wve|KR^>9@p5l)|QB+ z$jmun3q#x>;ss-PW_mnr2MHVzLAl1RW&0?VkixF*4t!St0YVb2wnKdU(kmOHiL;aW zK8Xte%(k>MVGG$E4no6dcNnb>BhVHHGD&1pv4YZ68kE2V03t5#PCEFm7=ad$6)+3B zTCmn*?A?=u(o~ET7~-7g0)ZB=6|lumi4}B}MLgy~Ysy6)Q5%Al7|05&1z3Jpu>cF8 z3?VXs*3<}%h3`5Wld)N2zJnk%Agw<~3k)sPTLFd=F5;d8-bj-09SkQuynfflNcZLN z!^_37fdZvzrq=9~mp*($%mcDRKC&qvaaZuX+C=AT6O*~tHl>0mcP<_q>-z%$xO(@! zYluq5a8VQI$S@4?r*v;gPo!QQ%pX3A#>xx4t=w-L6COWx?aj&`f+!YePsFtj=hOQR zP3=E2j@9L7s8;T^&s?u(Hdpu?CubjMrGn{t_37>9$|AD)QE08weJlKn8|OyjL~7oP zC8mPT`jzuH*Dh^I0048RGafUIT)4H~*m8m>egI0iH=(LB%b@@O002ovPDHLkV1lw0 B3EChABo<$D=zfHF*KVpUFHW8LWba^+knj&cWYv@nVI+zW3pXLw?RSJ z2167z>da!s#v01XHzHj}TL=XTwDg-Yq)=9%6k4#*Qucp5Y}tiNhoNs^?UB1B14?$<^7U+abQJ-Iu|x^>Tg-QAs1Y%KV%;@#i& zr@mC#cQv)bBwrj1@@d;7SrsOPhkARFVb5khum3cd^y-i1l0DS}i-pE%%zr`W!WyMk zKj((Rynn^Tb0x;*?Mg$%wnF_g4}3Czvpk-0dH7iRr6KQ^wPI(bJc-h?b-%M!Xvk!#bfxYX9DZODgpz-G7N+g99EBV-nEL#7pK~}#0QOD1ZyV2 z>p%X)p|;V-3R*qK@|xY=s^Mww#MYTwk-2euiAMh_pWpJa_lk8w@cOaf^@#`kKAeR| zl9)-cnCs#%jyX!r0ru57mIWu}+1G4OKit3BU3jD(Y;rulx1OcW4nL*N V?s`O>ElK|#XSdw%-Oy}k{|5N)axwq_ diff --git a/Resources/page_white_disk.png b/Resources/page_white_disk.png deleted file mode 100644 index 1a80ac99f86bc436ab9915d3c5382bd4d10fd9be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 715 zcmV;+0yO=JP) zTTc@~6vsh7gfEi#34AHx!3UrC0z`}^hA1W^#XyA+Bee>m#S5k4r46(p#TG>)50V&( z!G~%POAR#;s|8_=Tx{*Ob=z+5yW77rqb@7dc#?ni%;o&%oHIMsRok|oxci9qYUV1r zJek}eD(_s>6$*u4x7z(hXfuV+Orc-M}sq&46@m*s#GckK@bp)Mj12` ziNJ2R?}AhlS{>bx&*xDr7TK3d6h$PHN$@<+0J&Ta^bm)`@e5)Y4#MOLqH|;sR~~$V z{#F33w*xrmTtt^+38yXdm|NOJEEd~U7Cp48#kzp0fCy^Oe4Fg6HMf_?shfV#QsVJA z%Oo5QGZ+J$xaNcFmB3;Q_ZHOHyac2Qz~Iv@G!OV#Ptxf$>qjDy*akG+n1|adpd>4h zpF7<5HgbW?9;ba!ELWdLwtX>N2bZe?^J zG%heMHD!e|WdHyH{7FPXR5(wKlTB+AQ51%wf1?&$b=fWwrc}|o6QNL{f(ZR7T@U_gp%YsSVfz4_t;h&pqed zdmR8AEN(HJ4BpBvN1ZW+L#SjjMp(qLlg8>SK0z^@~B%!#$5L&GkQmK@MDTzcPP*s%+I-L&aKS`3f zWUL^aPIG8Y)kLFFghC;{JGDX*!!RgQ;DUQcvlA|9#EX!y%nxNTO*Pg2CWr!Tk5R zb6>^>F(_g~eudB4M=b3xAfL~30aaqogW4exos=cGe>i*oO+UtKc@r;xzQCUH0grbd zae*nJnIw}*UI{_7umpF%xK_nq+xVpI!=p%e=ikD{!5U9C+n_2)K$Xy7*^!R~!tTt( z^vaZHX>S3G?uS_a`W$CkfG66M2}&mV{r*V6f*)h0Qn7ZlGfqIa@`|8bE?-+fcj1bl zSSHq)$ diff --git a/Resources/page_white_star.ico b/Resources/page_white_star.ico deleted file mode 100644 index d4e1e07696f644b94890f9d86acf9f12ce6dda6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcma)*O=uHA6vrpli?^P7QpnAMpwyP!1dCq$I4EAkf+(oyQN@EdEuQow$su0En-q%R z*-I#bV2cU07$aE3Lt>JR*;w|3U+2>`F9pDQKtipe4p6`LNwxG2Rk|Y_iXo5z3*JBVqU^!NSnO_sQtltqB zz-*S!o}2eLj%l0_hdIL^d+%L7__F%KQ3*LJrbl&2E8kVhMNve%mE})vc&E-*B^`Me z(CnH=N7sCM^FyaR;#*!RMNpPMz3v`9QhtS$MHe^O&$gnsy@>oMF+Bhq1cBlD{XX@2 zy_7f8`!m1W4M{gX?ZiZWsM)fE!GIjcp-!hm&1Q2fUmL`<{!^uWl2V$Sk#D!#H4OY( z+4*O`A28?>RtWXFu503gLl1o4r*gUcl({_1T7mN&;S9A}A#c>&ZnsU`R;xv&QpvJ= zEX?aX*XqKD&2RULUKESPaV*^IhY!}I|8Jh}q;V@^brE_nMuPXOvgZ{rIo8zb;%_8# Bx848% diff --git a/Resources/page_white_star.png b/Resources/page_white_star.png deleted file mode 100644 index 3a1441c9a12062a4bb3d706000d3ca14399aebca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 565 zcmV-50?Pe~P)SCZIX8XZzY2l?gCw6LlgWJ5Avz#QX4|&mI8LN)w~J1vgL=KLAhlWz*=#m~gyvxa z&;iC6gb?aZvMdXxX`<0+D1hs_pqJ!wxqlEH;CJ)je~uL(gpi@v>!I0f_Kl=E(E+Tq z26na*9gribxx-Oft(HnstyXUUy!39&E-cI%J5Rsy;(PGZH{g{ty!HVC&yGPT3H8x# zw{^gBPW)O0FMoh{k%l<`1a|To_Wl&u&-GXm8izU|&<&utILc4wc6s@u1bmTz6x{qg zTw@7=FQRcg&r`h+gcR$*Jbv+*DPk7v)B@e0o2 z6IlBXW&8xh@9)YKiV~2>+z&XKd24JT55YWz&JtfvCg4r^~bLP79-yS@n$OW00000NkvXXu0mjf DStt2z diff --git a/Resources/page_white_world_bw.png b/Resources/page_white_world_bw.png deleted file mode 100644 index 2a2e8a9b695d94b3b6b88538d184b33bdba23bad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 660 zcmV;F0&D$=P)pF7<5HgbW?9;ba!ELWdLwtX>N2bZe?^J zG%heMHD!e|WdHyI5=lfsR5(wCliO-qQ4of0pQC}kLyA{<2w$L=eTm!%p1sggjprkZ zqJjs4pd^q8-YKFfs8NClg5n7^M#(|@cg?igZ4kQPXS3Ne-~2OcwhRDEoKHfhLh}FU zv(U$Vo&<3E{QNwBdwbh%HX9t1_>PN7^ZR;#@hiv?!08HU3lLk5EZ zY&P2-vP=G;P$<4#U0uQHbi!aT@H3y!qt$9*KA&SW8ZltKUW1CbT&_P50%*0`uWGgW zA)C#jQmLR?t>XIn8h*bYUauGBav9_C_@Et<0LW!}z5dK-H2xF^ykm&+xCq<~+ALV@j)ZL8IaNF>58 zsIo?*;WmU*yu7?Hgd}a@o~BPhZnvA0%w{vr&(EP!sbDgh5R1jw0Rc#~4^n_R91e3; zpU=k*>~=fE&2Uv}L#NY$ioCwQa`Jn?nFzQ`rBd9+?&>TS3lCCk9y{xFIt4iaxvx uJf^LPU5cDjDd2=4LdSmLV-ml?8O9 diff --git a/Resources/transmit_blue.png b/Resources/transmit_blue.png deleted file mode 100644 index b9c8d011cab24ba10a7b80dcaa1d5d99c328e2dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 674 zcmV;T0$u%yP)I#mR_6p95waS%aqkS-3o z6u}PCNhcSDiqKI}S_vxEL?g+I`Lplm{+xR~&rMNq5PIQqE{FSl=ljk*7ht28@q1$7 zMQb;O^Qd7Ar9LP$0HS)ugAe1wGe7iAwV#M&6a+-ZH{vGf&CCA=^Z)<=07*qo IM6N<$g1+V;hX4Qo diff --git a/RyzStudio/Data/SQLite/SQLiteDatabase.cs b/RyzStudio/Data/SQLite/SQLiteDatabase.cs deleted file mode 100644 index 2ebab58..0000000 --- a/RyzStudio/Data/SQLite/SQLiteDatabase.cs +++ /dev/null @@ -1,444 +0,0 @@ -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/Windows/Forms/BigButton.Designer.cs b/RyzStudio/Windows/Forms/BigButton.Designer.cs deleted file mode 100644 index 6943f34..0000000 --- a/RyzStudio/Windows/Forms/BigButton.Designer.cs +++ /dev/null @@ -1,64 +0,0 @@ -namespace RyzStudio.Windows.Forms -{ - partial class BigButton - { - ///

- /// 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.button1 = new System.Windows.Forms.Button(); - this.SuspendLayout(); - // - // button1 - // - this.button1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(249)))), ((int)(((byte)(177)))), ((int)(((byte)(12))))); - this.button1.Dock = System.Windows.Forms.DockStyle.Fill; - this.button1.FlatAppearance.BorderSize = 0; - this.button1.FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(231)))), ((int)(((byte)(108)))), ((int)(((byte)(31))))); - this.button1.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(245)))), ((int)(((byte)(76)))), ((int)(((byte)(0))))); - this.button1.Location = new System.Drawing.Point(6, 6); - this.button1.Name = "button1"; - this.button1.Size = new System.Drawing.Size(116, 20); - this.button1.TabIndex = 6; - this.button1.UseVisualStyleBackColor = false; - // - // BButton - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.Controls.Add(this.button1); - this.Name = "BButton"; - this.Padding = new System.Windows.Forms.Padding(6); - this.Size = new System.Drawing.Size(128, 32); - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.Button button1; - - } -} diff --git a/RyzStudio/Windows/Forms/BigButton.cs b/RyzStudio/Windows/Forms/BigButton.cs deleted file mode 100644 index 5dd4ca2..0000000 --- a/RyzStudio/Windows/Forms/BigButton.cs +++ /dev/null @@ -1,91 +0,0 @@ -using System; -using System.ComponentModel; -using System.Drawing; -using System.Windows.Forms; - -namespace RyzStudio.Windows.Forms -{ - public partial class BigButton : BigUserControl - { - protected bool enableClick = false; - - public BigButton() - { - InitializeComponent(); - - this.Button.Click += delegate (object s, EventArgs a) { this.OnClick(a); }; - this.Button.MouseEnter += delegate (object s, EventArgs a) { enableClick = true; }; - this.Button.MouseLeave += delegate (object s, EventArgs a) { enableClick = false; }; - this.Button.KeyDown += delegate (object s, KeyEventArgs a) { enableClick = true; }; - this.Button.KeyUp += delegate (object s, KeyEventArgs a) { enableClick = false; }; - } - - protected override void OnLoad(EventArgs e) - { - base.OnLoad(e); - - int b4 = (borderWidth * 4); - - this.borderColor = Color.FromArgb(222, 222, 222); - this.borderPen = new Pen(this.borderColor); - - this.Button.FlatStyle = FlatStyle.Flat; - this.Button.FlatAppearance.MouseDownBackColor = Color.FromArgb(200, 202, 206); - this.Button.FlatAppearance.MouseOverBackColor = Color.FromArgb(238, 238, 238); - this.Button.Font = new Font("Segoe UI", 8.25F, FontStyle.Regular, GraphicsUnit.Point); - this.Button.BackColor = Color.Transparent; - this.Button.ForeColor = Color.FromArgb(51, 51, 51); - this.Padding = new Padding(b4); - this.MinimumSize = new Size(32, 32); - } - - protected override void OnPaint(PaintEventArgs e) - { - base.OnPaint(e); - - this.Height = this.button1.Height + (this.button1.Top * 2); - } - - protected override void OnClick(EventArgs e) - { - if (!enableClick) - { - return; - } - - base.OnClick(e); - } - - #region public properties - - [Category("Data")] - public Button Button - { - get - { - return this.button1; - } - - set - { - this.button1 = value; - } - } - - [Browsable(false)] - public string Value - { - get - { - return this.button1.Text; - } - - set - { - this.button1.Text = value; - } - } - - #endregion - } -} \ No newline at end of file diff --git a/RyzStudio/Windows/Forms/BigButton.resx b/RyzStudio/Windows/Forms/BigButton.resx deleted file mode 100644 index 1af7de1..0000000 --- a/RyzStudio/Windows/Forms/BigButton.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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/BigUserControl.Designer.cs b/RyzStudio/Windows/Forms/BigUserControl.Designer.cs deleted file mode 100644 index 218b152..0000000 --- a/RyzStudio/Windows/Forms/BigUserControl.Designer.cs +++ /dev/null @@ -1,37 +0,0 @@ -namespace RyzStudio.Windows.Forms -{ - partial class BigUserControl - { - /// - /// 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/BigUserControl.cs b/RyzStudio/Windows/Forms/BigUserControl.cs deleted file mode 100644 index 400e7b9..0000000 --- a/RyzStudio/Windows/Forms/BigUserControl.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System; -using System.Drawing; -using System.Windows.Forms; -using RyzStudio.Drawing; - -namespace RyzStudio.Windows.Forms -{ - public partial class BigUserControl : UserControl - { - protected int borderWidth = 1; - protected Pen borderPen = null; - protected Color borderColor = Color.FromArgb(112, 112, 112); - protected Brush backgroundBrush = null; - protected Color backgroundColor = Color.FromKnownColor(KnownColor.White); - - public BigUserControl() - { - InitializeComponent(); - - borderPen = new Pen(new SolidBrush(borderColor), borderWidth); - backgroundBrush = new SolidBrush(backgroundColor); - } - - protected override void OnLoad(EventArgs e) - { - base.OnLoad(e); - - int b4 = (borderWidth * 4); - int b6 = (borderWidth * 6); - - this.BackColor = Color.FromKnownColor(KnownColor.WhiteSmoke); - this.Padding = new Padding(b6, b4, b6, b4); - } - - 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; - - int b3 = (borderWidth * 3); - - Rectangoid area = new Rectangoid(borderWidth, borderWidth, (this.ClientRectangle.Width - b3), (this.ClientRectangle.Height - b3), 3); - g.FillPath(backgroundBrush, area.ToGraphicsPath()); - g.DrawPath(borderPen, area.ToGraphicsPath()); - } - } -} \ No newline at end of file diff --git a/RyzStudio/Windows/ThemedForms/ThreadHelper.cs b/RyzStudio/Windows/ThemedForms/ThreadHelper.cs deleted file mode 100644 index e1e3b82..0000000 --- a/RyzStudio/Windows/ThemedForms/ThreadHelper.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System.Drawing; -using System.Windows.Forms; - -namespace RyzStudio.Windows.ThemedForms -{ - public class ThreadHelper - { - public static void SetText(TextBox sender, string text) - { - if (sender.InvokeRequired) - { - sender.Invoke(new MethodInvoker(() => { - sender.Text = text; - })); - } - else - { - sender.Text = text; - } - } - - public static void SetText(MemoBox sender, string text) - { - if (sender.InvokeRequired) - { - sender.Invoke(new MethodInvoker(() => { - sender.Text = text; - })); - } - else - { - sender.Text = text; - } - } - - public static void SetImage(PictureBox sender, Image image) - { - if (sender.InvokeRequired) - { - sender.Invoke(new MethodInvoker(() => { - sender.Image = image; - })); - } - else - { - sender.Image = image; - } - } - - } -} diff --git a/SessionFileFormat.cs b/SessionFileFormat.cs deleted file mode 100644 index e61e4e0..0000000 --- a/SessionFileFormat.cs +++ /dev/null @@ -1,93 +0,0 @@ -using System.Xml; -using System.Windows.Forms; - -namespace bzit.bomg -{ - public class SessionFileFormat : RyzStudio.IO.SessionFileFormatBase - { - private MainForm parentForm = null; - - public SessionFileFormat(MainForm parent_form) - { - base.CONST_PRODUCT = "bomg"; - base.CONST_STREAM_FILE_NAME = "bookmarks.xml"; - base.CONST_KEYPASS = ""; - base.enableErrorReporting = true; - - parentForm = parent_form; - } - - protected override void loadFromXmlDocument(ref XmlDocument xml_doc) - { - XmlNodeList xnl = xml_doc.SelectNodes("bomg/b/g"); - if (xnl.Count <= 0) - { - MessageBox.Show("No bookmarks found.", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Warning); - return; - } - - parentForm.treeView1.Clear(); - TreeNode tn = parentForm.treeView1.Nodes.Add("", xnl.Item(0).Attributes["name"].InnerText, 0, 0); - foreach (XmlNode xn in xnl.Item(0)) - { - BookmarkItem bi = new BookmarkItem(); - - foreach (XmlNode xn2 in xn.ChildNodes) - { - switch (xn2.LocalName) - { - case "name": - bi.Fullpath = xn2.InnerText?.Trim(); - break; - case "address": - bi.SiteAddress = xn2.InnerText?.Trim(); - break; - case "description": - bi.Description = xn2.InnerText?.Trim(); - break; - case "created": - bi.Created = xn2.InnerText?.Trim(); - break; - default: break; - } - } - - //##parentForm.treeView1.AddBookmarkItem(bi.Fullpath, bi); - } - - tn.Expand(); - } - - protected override void saveToXmlTextWriter(ref XmlTextWriter writer) - { - //if (parentForm.treeView1.Nodes.Count <= 0) - //{ - // return; - //} - - //writer.Formatting = Formatting.Indented; - //writer.WriteStartDocument(); - //writer.WriteStartElement(CONST_PRODUCT); - //writer.WriteStartElement("b"); - //writer.WriteStartElement("g"); - //writer.WriteAttributeString("name", parentForm.treeView1.Nodes[0].Text); - - //foreach (TreeNode tn in parentForm.treeView1.NodeList) - //{ - // BookmarkItem bi = (BookmarkItem)tn.Tag; - - // writer.WriteStartElement("m"); - // writer.WriteElementString("name", parentForm.treeView1.GetNodeFullPath(tn)); - // writer.WriteElementString("address", bi.SiteAddress); - // writer.WriteElementString("description", bi.Description); - // writer.WriteElementString("created", bi.Created.ToString()); - // writer.WriteEndElement(); - //} - - //writer.WriteEndElement(); - //writer.WriteEndElement(); - //writer.WriteEndElement(); - //writer.WriteEndDocument(); - } - } -} \ No newline at end of file diff --git a/UpdateIconForm.Designer.cs b/UpdateIconForm.Designer.cs deleted file mode 100644 index ba005c6..0000000 --- a/UpdateIconForm.Designer.cs +++ /dev/null @@ -1,144 +0,0 @@ -namespace bzit.bomg -{ - partial class UpdateIconForm - { - /// - /// 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(UpdateIconForm)); - this.label1 = new System.Windows.Forms.Label(); - this.label2 = new System.Windows.Forms.Label(); - this.oToolTip = new System.Windows.Forms.ToolTip(this.components); - this.pictureBox1 = new System.Windows.Forms.PictureBox(); - this.progressBar1 = new System.Windows.Forms.ProgressBar(); - this.btnRun = new RyzStudio.Windows.Forms.BigButton(); - ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); - this.SuspendLayout(); - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(12, 12); - this.label1.Margin = new System.Windows.Forms.Padding(3); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(45, 13); - this.label1.TabIndex = 0; - this.label1.Text = "Entries:"; - // - // label2 - // - this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.label2.Location = new System.Drawing.Point(15, 59); - this.label2.Margin = new System.Windows.Forms.Padding(3); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(277, 13); - this.label2.TabIndex = 4; - this.label2.Text = "0/0"; - this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - // - // oToolTip - // - this.oToolTip.Active = false; - this.oToolTip.BackColor = System.Drawing.Color.IndianRed; - // - // pictureBox1 - // - this.pictureBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.pictureBox1.BackColor = System.Drawing.Color.Transparent; - this.pictureBox1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; - this.pictureBox1.ErrorImage = null; - this.pictureBox1.InitialImage = null; - this.pictureBox1.Location = new System.Drawing.Point(12, 77); - this.pictureBox1.Name = "pictureBox1"; - this.pictureBox1.Size = new System.Drawing.Size(32, 32); - this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage; - this.pictureBox1.TabIndex = 60; - this.pictureBox1.TabStop = false; - // - // progressBar1 - // - this.progressBar1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.progressBar1.BackColor = System.Drawing.Color.White; - this.progressBar1.Location = new System.Drawing.Point(12, 31); - this.progressBar1.Name = "progressBar1"; - this.progressBar1.Size = new System.Drawing.Size(280, 22); - this.progressBar1.Step = 1; - this.progressBar1.Style = System.Windows.Forms.ProgressBarStyle.Continuous; - this.progressBar1.TabIndex = 61; - // - // btnRun - // - this.btnRun.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.btnRun.BackColor = System.Drawing.Color.WhiteSmoke; - this.btnRun.Location = new System.Drawing.Point(196, 77); - this.btnRun.MaximumSize = new System.Drawing.Size(120, 32); - this.btnRun.MinimumSize = new System.Drawing.Size(32, 32); - this.btnRun.Name = "btnRun"; - this.btnRun.Padding = new System.Windows.Forms.Padding(4); - this.btnRun.Size = new System.Drawing.Size(96, 32); - this.btnRun.TabIndex = 3; - this.btnRun.Value = "&Run"; - this.btnRun.Click += new System.EventHandler(this.btnRun_Click); - // - // UpdateIconForm - // - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; - this.BackColor = System.Drawing.Color.White; - this.ClientSize = new System.Drawing.Size(304, 121); - this.Controls.Add(this.progressBar1); - this.Controls.Add(this.pictureBox1); - this.Controls.Add(this.label1); - this.Controls.Add(this.btnRun); - this.Controls.Add(this.label2); - this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "UpdateIconForm"; - this.ShowInTaskbar = false; - this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Update Icons"; - ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Label label1; - private System.Windows.Forms.Label label2; - private System.Windows.Forms.ToolTip oToolTip; - private RyzStudio.Windows.Forms.BigButton btnRun; - private System.Windows.Forms.PictureBox pictureBox1; - private System.Windows.Forms.ProgressBar progressBar1; - } -} \ No newline at end of file diff --git a/UpdateIconForm.cs b/UpdateIconForm.cs deleted file mode 100644 index 67975e5..0000000 --- a/UpdateIconForm.cs +++ /dev/null @@ -1,121 +0,0 @@ -using System; -using System.ComponentModel; -using System.Windows.Forms; - -namespace bzit.bomg -{ - public partial class UpdateIconForm : Form - { - private MainForm parentForm = null; - private BackgroundWorker mainThread = null; - - public UpdateIconForm(MainForm parent) - { - InitializeComponent(); - - parentForm = parent; - - this.StartPosition = FormStartPosition.WindowsDefaultLocation; - - mainThread = new BackgroundWorker(); - mainThread.WorkerReportsProgress = mainThread.WorkerSupportsCancellation = true; - mainThread.DoWork += mainThread_DoWork; - mainThread.RunWorkerCompleted += mainThread_OnCompleted; - } - - protected override void OnShown(EventArgs e) - { - base.OnShown(e); - - //##int nodeCount = (int)parentForm.treeView1.NodeCountCalc; - //progressBar1.Minimum = 0; - //progressBar1.Value = 0; - //progressBar1.Maximum = nodeCount; - - //label2.Text = string.Concat("0", "/", nodeCount.ToString()); - } - - protected override void OnClosing(CancelEventArgs e) - { - base.OnClosing(e); - - if (mainThread.IsBusy) - { - e.Cancel = true; - } - } - - private void btnRun_Click(object sender, EventArgs e) - { - if (mainThread.IsBusy) - { - return; - } - - btnRun.Enabled = false; - pictureBox1.Image = Properties.Resources.aniZomq2x32; - mainThread.RunWorkerAsync(); - } - - private void mainThread_DoWork(object sender, DoWorkEventArgs e) - { - //TreeNode[] nodeList = parentForm.treeView1.NodeList; - //for (int i=0; i< nodeList.Length; i++) - //{ - // if (progressBar1.InvokeRequired) - // { - // progressBar1.Invoke(new Action(() => progressBar1.Value = (i + 1) )); - // } - // else - // { - // progressBar1.Value = (i + 1); - // } - - // if (label2.InvokeRequired) - // { - // label2.Invoke(new Action(() => label2.Text = string.Concat((i + 1).ToString(), "/", progressBar1.Maximum.ToString()))); - // } - // else - // { - // label2.Text = string.Concat((i + 1).ToString(), "/", progressBar1.Maximum.ToString()); - // } - - // TreeNode node = nodeList[i]; - // if (node == null) - // { - // continue; - // } - - // if (node.Tag == null) - // { - // continue; - // } - - // if (!(node.Tag is BookmarkItem)) - // { - // continue; - // } - - // BookmarkItem bookmarkItem = (BookmarkItem)node.Tag; - // if (bookmarkItem == null) - // { - // continue; - // } - - // bookmarkItem.GetFaviconAddress(); - // if (bookmarkItem.IconData == null) - // { - // continue; - // } - - //##parentForm.treeView1.AddIcon(bookmarkItem); - //} - } - - private void mainThread_OnCompleted(object sender, RunWorkerCompletedEventArgs e) - { - pictureBox1.Image = null; - btnRun.Enabled = true; - } - } -} \ No newline at end of file diff --git a/UpdateIconForm.resx b/UpdateIconForm.resx deleted file mode 100644 index a6f44d9..0000000 --- a/UpdateIconForm.resx +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - - - AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApisVGJ4jEviWGxMQjhMNNAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAC+Syistj8mlK43I/o7N6/9utuL/P43I/yOEw6wigsIxAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAANZnNFjOXzIUxlMvvgcPl/8z0//+77vr/h9Hk/4nO8P9eo9f/JIXD8yKD - wo0ggcEbAAAAAAAAAAA8odAGOp/PZTicztt8v+D/x+78/8vy/v9k3dD/MtGn/yGpe/80r5D/iMvo/4HA - 6/9SltD/IoPC4CGBwW0ff8EKP6TSu3a83P++5fb/2/b//53o6/8206v/NtKr/1TY0f82t7v/I6mE/yGp - e/9Mtqj/hcXr/3Oy5P9Jj8r/IYLCwUGn0/nn+/7/0PP5/0XXt/841K3/T9nC/43i8v+V4f7/R8Xr/z67 - 4/8vrrD/I6uD/yOsgP9mvsH/gsPs/yOEw/hDqdT3p+3i/0DWsv9I2Ln/i+Tk/7Lq//+s5///e9n+/0fH - 7/9Cw+r/Qr3o/zyy3P8sraj/KLCH/4TTuv8lhsT+RqzV+5Hn1P9/5dj/yPH9/8jv//+56///kdv7/1XA - 8f9Hwfn/Orzw/0bE7P9EvOn/QrTm/zis1P+H0sz/J4nF/0iv1vjb9vj/2fP//9Xz//+86///iNX3/2jJ - 9f9Ls+n/jNr7/4vc//9Hw/n/N7Xs/0e+6P9Ht+f/j9Px/yqMx/pKsdfw4vj9/9Tz//+v5Pr/hc/x/37Q - 9f930PX/S7Dk/6/k+v+16f//muH//3fW/v8/vPX/PLTp/4/V8f8sjsjwTLPY++H4/v/N6/n/kdLt/4PM - 6/9uvuX/VbDb/zqTyP/O7Pr/2fX//7jq//+U3/7/dtX//6Tk//+D3Pv/LpHJ+0622Z9MtNn+pNnt/9Lr - 9f+93u3/lMne/4jC2/9vt9b/abne/4/X9f9+z/X/nNv4/6nj+v+Dyuz/UKXV/zGUy6YAAAAATrbZRk20 - 2cJ9xeD/0e73//b////w/v//y+37/0+s2v+K1/f/qeH5/5TW8v9hsdv/OJzOyDWZzU0AAAAAAAAAAAAA - AABOttoFTbXZZUuz2NuRz+X/5vj8/+P2/v+u3fL/seT3/3G/4f8+o9HgPKHQbDqfzwkAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABNtdkWTLPYhEqx1++b1er/h8zn/0Sr1fNDqdSMQabTGgAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMs9grSrHYr0mv17xHrdYxAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAA/D+sQfAPrEHAA6xBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBgAGsQcAD - rEHwD6xB/D+sQQ== - - - \ No newline at end of file diff --git a/bomg-2.ico b/bomg-2.ico deleted file mode 100644 index 91a99b0ed886eba1a929cf6948587405c47b656c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17542 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 e*6poot<@k4$`QS=OW0dhh94>;D1O|LNrb diff --git a/bomg.csproj b/bomg.csproj index 0acd95a..288d65c 100644 --- a/bomg.csproj +++ b/bomg.csproj @@ -169,7 +169,7 @@ UserControl.cs - + From d885b2ef8d0e63284b9e4042bdcf3c7ef0c5ec0a Mon Sep 17 00:00:00 2001 From: Ray Date: Sun, 30 Aug 2020 01:02:12 +0100 Subject: [PATCH 33/34] Changed: treeview folder icons --- Resources/folder.png | Bin 537 -> 303 bytes Resources/folder_explore.png | Bin 689 -> 322 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Resources/folder.png b/Resources/folder.png index 784e8fa48234f4f64b6922a6758f254ee0ca08ec..d3ea8ab73eb0048f4a0116cf8847e72ccceae9a2 100644 GIT binary patch delta 276 zcmV+v0qg#m1g`>+B!2;OQb$4nuFf3k00004XF*Lt006O%3;baP00009a7bBm000id z000id0mpBsWB>pF#7RU!R5(v#{Qv(y10{e7N|O!11~4)*MzOQAe*n_|VVIMX^9Yb; z2CKpYz+PZuWBXKDS;_0?=LZ)2`t>V=kB`sq&!0c{0lBNef`6#s4N%`hFbf(6|99@( z31lL`+O=!{Gcz;)1Ib~-EG#T-KxIG{4g>Ik#fuk%4F3USk{5_#Vqy$`|NdnMv8fXa zlz?Gi01JpS=MxWr(n+HjEGfzFK# a3;=3BlCmQKQVl);0000Vie3h?3OmEEkjwdLG0PgLVi`!N((f$A@n17Ldj#`};0I3@iHJ5M{#IZz|U zIYRm4(!uV7eYIYIwQf&}_2J~}>pQ^n6o8--^T(=hkBNQ_k{-_GWE3|PIeAdgL$L?1oHmfF0zaB8Q_#zIKt0B zeo8$ak@s(ro!V?0{!@XP3et6mNxA^k3F+}OtZ&|)2MWXd7eet0#UTnq6hi<3wT)ly~z}ZC=~5|&}JUZ0aBPR zwgGs_5mETn3X4VAafrfrA-1we1elo7;%%IP!nKT>pF*GWV{R5(v#{Qv(y10{e7N|O!11~4)*MzOOoe*n_|VVIMHEDsj^_Wch-VCv4_pTGX@19De`1%FY&8=$_2U=}nC{%@J@ z`Txi56gXZn)#X1k6XQRS95&3t!qf)R3w8m>$v^`bTx_I)a)iP1jdvJQ$`Ahh^XDH2 zS%D}j%*pWg?|*g>n>w*T2^aC0-JX~Wayc7@zby0fB9hvDUywq t={=CfNHEwiR3L3QJRwm6C=3Gz1^{7#Zdhe;*NXrE002ovPDHLkV1if#1u|>;#x^;?HE$+RVWM^#`DChrzp?k)5?$7ibV<)C* z05Iu$%*l66Eg`qkR?V)ok>3>7AFKJ*N9owirJI&uy18uXDoD-&In@W5e-9-+1+ykl zR|TdnQI1abwSPmv(5l?DJ!%Oi?V_O_(eMB&iGGM*yKu0252dyH5F*_Wwx2=RdV<5v z4oW-itO)KylVk}z&00;_gAg6S;YKftfrn6vVOmxERsDD^TOH8xIFDVm1mjn<`uql= zD1a{4gSx_k6b2EEPJju9FucISwUmc{GlQt>IMg9Ys5B&_lZ zf+-oxlt_WVy~x873^c2zCeZK*NWKqhx{HR}A#-=?Z6`_u!DIzXi3%223F{exu|Uoe z#2l9kT7NlFt|VPXB|Z#^dj*MgK>F4LH=TJWFC)O6gpc{0C2)FUmVoWCJz#qq$JytN zCAzAo`8e&?!wC@^G_=C2SfkaMFB0C4&YHfb*ILiKi~U~yqSMcJdgxh9EEn+3ziYf6 z^_mgi5JH13;+cYf{V>yc<8JuPZ6P)P5 Date: Sun, 30 Aug 2020 09:50:48 +0100 Subject: [PATCH 34/34] Added: build script --- build-release.bat | 1 + 1 file changed, 1 insertion(+) create mode 100644 build-release.bat diff --git a/build-release.bat b/build-release.bat new file mode 100644 index 0000000..3150823 --- /dev/null +++ b/build-release.bat @@ -0,0 +1 @@ +"C:\Program Files (x86)\Microsoft Visual Studio\2017 Community\MSBuild\15.0\Bin\MSBuild.exe" "skye.sln" /T:Build /P:Configuration=Release \ No newline at end of file