From fcd67c299d346216d13c1f1acae94bfd6e1af834 Mon Sep 17 00:00:00 2001 From: Michael Everett Date: Fri, 13 Oct 2017 16:55:27 -0700 Subject: [PATCH] -Upgraded InfluxData.Net reference from 7.0.3 to 8.0.1. -Added in the ability to close tabs with options by right-clicking on tabs to bring up a close context menu. -Updated the About dialog text. -Updated assembly version. -User settings file should automatically be upgraded when assembly version changes. --- .../AppForm.Designer.cs | 75 ++++-- src/CymaticLabs.InfluxDB.Studio/AppForm.cs | 8 + src/CymaticLabs.InfluxDB.Studio/AppForm.resx | 227 +++++++++--------- .../AppSettings.cs | 3 + .../Controls/ExtendedTabControl.cs | 112 ++++++++- .../CymaticLabs.InfluxDB.Studio.csproj | 8 +- .../Dialogs/AboutDialog.Designer.cs | 2 +- .../Properties/AssemblyInfo.cs | 6 +- .../packages.config | 2 +- 9 files changed, 291 insertions(+), 152 deletions(-) diff --git a/src/CymaticLabs.InfluxDB.Studio/AppForm.Designer.cs b/src/CymaticLabs.InfluxDB.Studio/AppForm.Designer.cs index 4de3f08..970540b 100644 --- a/src/CymaticLabs.InfluxDB.Studio/AppForm.Designer.cs +++ b/src/CymaticLabs.InfluxDB.Studio/AppForm.Designer.cs @@ -30,11 +30,11 @@ private void InitializeComponent() { this.components = new System.ComponentModel.Container(); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AppForm)); - System.Windows.Forms.TreeNode treeNode4 = new System.Windows.Forms.TreeNode("Measurement", 3, 3); - System.Windows.Forms.TreeNode treeNode5 = new System.Windows.Forms.TreeNode("Database", 2, 2, new System.Windows.Forms.TreeNode[] { - treeNode4}); - System.Windows.Forms.TreeNode treeNode6 = new System.Windows.Forms.TreeNode("Connection", 1, 1, new System.Windows.Forms.TreeNode[] { - treeNode5}); + System.Windows.Forms.TreeNode treeNode1 = new System.Windows.Forms.TreeNode("Measurement", 3, 3); + System.Windows.Forms.TreeNode treeNode2 = new System.Windows.Forms.TreeNode("Database", 2, 2, new System.Windows.Forms.TreeNode[] { + treeNode1}); + System.Windows.Forms.TreeNode treeNode3 = new System.Windows.Forms.TreeNode("Connection", 1, 1, new System.Windows.Forms.TreeNode[] { + treeNode2}); this.menuStrip = new System.Windows.Forms.MenuStrip(); this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.importToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -112,6 +112,10 @@ private void InitializeComponent() this.dropSeriesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.saveFileDialog = new System.Windows.Forms.SaveFileDialog(); this.openFileDialog = new System.Windows.Forms.OpenFileDialog(); + this.tabContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); + this.closeTabMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.closeAllButThisMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.closeAllMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.menuStrip.SuspendLayout(); this.toolStrip.SuspendLayout(); this.statusStrip.SuspendLayout(); @@ -122,6 +126,7 @@ private void InitializeComponent() this.connectionsContextMenu.SuspendLayout(); this.databaseContextMenu.SuspendLayout(); this.measurementContextMenu.SuspendLayout(); + this.tabContextMenuStrip.SuspendLayout(); this.SuspendLayout(); // // menuStrip @@ -631,20 +636,20 @@ private void InitializeComponent() this.connectionsTreeView.ImageList = this.imageList; this.connectionsTreeView.Location = new System.Drawing.Point(0, 0); this.connectionsTreeView.Name = "connectionsTreeView"; - treeNode4.ImageIndex = 3; - treeNode4.Name = "Node2"; - treeNode4.SelectedImageIndex = 3; - treeNode4.Text = "Measurement"; - treeNode5.ImageIndex = 2; - treeNode5.Name = "Node1"; - treeNode5.SelectedImageIndex = 2; - treeNode5.Text = "Database"; - treeNode6.ImageIndex = 1; - treeNode6.Name = "Node0"; - treeNode6.SelectedImageIndex = 1; - treeNode6.Text = "Connection"; + treeNode1.ImageIndex = 3; + treeNode1.Name = "Node2"; + treeNode1.SelectedImageIndex = 3; + treeNode1.Text = "Measurement"; + treeNode2.ImageIndex = 2; + treeNode2.Name = "Node1"; + treeNode2.SelectedImageIndex = 2; + treeNode2.Text = "Database"; + treeNode3.ImageIndex = 1; + treeNode3.Name = "Node0"; + treeNode3.SelectedImageIndex = 1; + treeNode3.Text = "Connection"; this.connectionsTreeView.Nodes.AddRange(new System.Windows.Forms.TreeNode[] { - treeNode6}); + treeNode3}); this.connectionsTreeView.SelectedImageIndex = 0; this.connectionsTreeView.Size = new System.Drawing.Size(168, 491); this.connectionsTreeView.TabIndex = 1; @@ -685,7 +690,7 @@ private void InitializeComponent() this.diagnosticsToolStripMenuItem, this.disconnectToolStripMenuItem}); this.connectionsContextMenu.Name = "connectionsContextMenu"; - this.connectionsContextMenu.Size = new System.Drawing.Size(201, 202); + this.connectionsContextMenu.Size = new System.Drawing.Size(201, 180); // // connectionRefreshToolStripMenuItem // @@ -881,6 +886,33 @@ private void InitializeComponent() this.openFileDialog.FileName = "InfluxDBStudio.json"; this.openFileDialog.Filter = "JSON files|*.json|All files|*.*"; // + // tabContextMenuStrip + // + this.tabContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.closeTabMenuItem, + this.closeAllButThisMenuItem, + this.closeAllMenuItem}); + this.tabContextMenuStrip.Name = "tabContextMenuStrip"; + this.tabContextMenuStrip.Size = new System.Drawing.Size(167, 70); + // + // closeTabMenuItem + // + this.closeTabMenuItem.Name = "closeTabMenuItem"; + this.closeTabMenuItem.Size = new System.Drawing.Size(166, 22); + this.closeTabMenuItem.Text = "Close"; + // + // closeAllButThisMenuItem + // + this.closeAllButThisMenuItem.Name = "closeAllButThisMenuItem"; + this.closeAllButThisMenuItem.Size = new System.Drawing.Size(166, 22); + this.closeAllButThisMenuItem.Text = "Close All But This"; + // + // closeAllMenuItem + // + this.closeAllMenuItem.Name = "closeAllMenuItem"; + this.closeAllMenuItem.Size = new System.Drawing.Size(166, 22); + this.closeAllMenuItem.Text = "Close All"; + // // AppForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -908,6 +940,7 @@ private void InitializeComponent() this.connectionsContextMenu.ResumeLayout(false); this.databaseContextMenu.ResumeLayout(false); this.measurementContextMenu.ResumeLayout(false); + this.tabContextMenuStrip.ResumeLayout(false); this.ResumeLayout(false); this.PerformLayout(); @@ -992,6 +1025,10 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripMenuItem showStatisticsToolStripMenuItem; private System.Windows.Forms.ToolStripButton showPoliciesButton; private System.Windows.Forms.ToolStripMenuItem showPoliciesToolStripMenuItem; + private System.Windows.Forms.ContextMenuStrip tabContextMenuStrip; + private System.Windows.Forms.ToolStripMenuItem closeTabMenuItem; + private System.Windows.Forms.ToolStripMenuItem closeAllButThisMenuItem; + private System.Windows.Forms.ToolStripMenuItem closeAllMenuItem; } } diff --git a/src/CymaticLabs.InfluxDB.Studio/AppForm.cs b/src/CymaticLabs.InfluxDB.Studio/AppForm.cs index 915d538..1611eb9 100644 --- a/src/CymaticLabs.InfluxDB.Studio/AppForm.cs +++ b/src/CymaticLabs.InfluxDB.Studio/AppForm.cs @@ -83,6 +83,11 @@ enum InfluxDbNodeTypes /// public static List ActiveClients { get; private set; } + /// + /// The global tab context menu used for closing tabs with extended options. + /// + public static ContextMenuStrip TabContextMenu { get; private set; } + #endregion Properties #region Constructors @@ -119,6 +124,9 @@ public AppForm() // Handle app load private async void AppForm_Load(object sender, EventArgs e) { + // Assign the tab context menu + TabContextMenu = tabContextMenuStrip; + // Clear status statusLabel.Text = null; diff --git a/src/CymaticLabs.InfluxDB.Studio/AppForm.resx b/src/CymaticLabs.InfluxDB.Studio/AppForm.resx index 21f3aef..e83fa27 100644 --- a/src/CymaticLabs.InfluxDB.Studio/AppForm.resx +++ b/src/CymaticLabs.InfluxDB.Studio/AppForm.resx @@ -123,42 +123,28 @@ - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAADJmlUWHRYTUw6Y29tLmFkb2Jl - LnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQi - Pz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENv - cmUgNS42LWMxMzggNzkuMTU5ODI0LCAyMDE2LzA5LzE0LTAxOjA5OjAxICAgICAgICAiPiA8cmRmOlJE - RiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8 - cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNv - bS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlw - ZS9SZXNvdXJjZVJlZiMiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1w - TU06RG9jdW1lbnRJRD0ieG1wLmRpZDowMzE4NUY5MkIxNkQxMUU2QUYzMkQ1MDRCRkJDREY2QyIgeG1w - TU06SW5zdGFuY2VJRD0ieG1wLmlpZDowMzE4NUY5MUIxNkQxMUU2QUYzMkQ1MDRCRkJDREY2QyIgeG1w - OkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxNyAoV2luZG93cykiPiA8eG1wTU06RGVy - aXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpERUEzNzYyNUIxNkExMUU2OTIzQkUyNkUz - Q0IyMEQ1MiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpERUEzNzYyNkIxNkExMUU2OTIzQkUyNkUz - Q0IyMEQ1MiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFj - a2V0IGVuZD0iciI/PtjsapUAAAJvSURBVDhPfZJbT1NBFIXPDzA++OA/MMEH1BceNDFRw4OYSKwRMVGM - 1ktaRFQslxIgbQgFtSFcpQJSaLHQIG21UFDEC0IqCChKhWJVJNRoimBoC3KR5ewhbYynYZK198yZ/a3J - njMCAMFkd8L4oBf1lheobXkKXVMXKo2dKNG3QVttReHtFlYGXvu/eDBYX2J1dZVNxWNmzg9ViYmmIpjE - Q5WpiyVgdn4FXt8SPN7fGP0SxOsxPxrbXEjLr6ZtEUzioayhHa2PB2Gw9aLG3I0ygwM371igLjUhq0iP - 5JwKVraBgbbGxlLkQS2czyimqQgm8VBQYWYJ8P1awY+5ZXz/uYxvM0uYZu1YHg0h6UohbYtgEg95xY28 - hXJDB26xW1eXNkF5Q4+rah3k2aU4Llezsg0MMgvrWIo8qIUj53JoKvTkyeJaU06D9ER5YRd94wZ0Eg2P - dxET04twTy1g7OsCXJMLMNoGcCgpE9a6rAME+vRqvM1YNyGWG8izy2iBcQZ9YBD9wnefgxjxBNnj6seZ - ZAW6bLm43zmAkYLrHC6JiSFk3UCq0NIC7wn6FMSbjwEMTQQwOO5HfbMd7fWJmJ3Uwt2bAo0ml8P5u3fG - hw1OXtZwg2GC3AEMsAckYBOin++HvfYwh8eeSfGwOg5bt2zGxYQo3j+JhwSZinj0M9Dpmkff6DyEwR3Q - 3TXC2VGEqWFFGD4auy2KmJB4iD+bDUd3H6qaX6HS5ETFPScqGxzcYG3tD8zlEg6nS6O3/wuHDQ6eSkfs - iTTsS0jFXskl7ImXQaVSI/VaOiTHElmVIDo5JNGHkAgiE0Wmki4oYg0A4S9v9fnU6SfJCwAAAABJRU5E - rkJggg== + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJvSURBVDhPfZJbT1NBFIXPDzA++OA/MMEH1BceNDFR + w4OYSKwRMVGM1ktaRFQslxIgbQgFtSFcpQJSaLHQIG21UFDEC0IqCChKhWJVJNRoimBoC3KR5ewhbYyn + YZK198yZ/a3JnjMCAMFkd8L4oBf1lheobXkKXVMXKo2dKNG3QVttReHtFlYGXvu/eDBYX2J1dZVNxWNm + zg9ViYmmIpjEQ5WpiyVgdn4FXt8SPN7fGP0SxOsxPxrbXEjLr6ZtEUzioayhHa2PB2Gw9aLG3I0ygwM3 + 71igLjUhq0iP5JwKVraBgbbGxlLkQS2czyimqQgm8VBQYWYJ8P1awY+5ZXz/uYxvM0uYZu1YHg0h6Uoh + bYtgEg95xY28hXJDB26xW1eXNkF5Q4+rah3k2aU4Llezsg0MMgvrWIo8qIUj53JoKvTkyeJaU06D9ER5 + YRd94wZ0Eg2PdxET04twTy1g7OsCXJMLMNoGcCgpE9a6rAME+vRqvM1YNyGWG8izy2iBcQZ9YBD9wnef + gxjxBNnj6seZZAW6bLm43zmAkYLrHC6JiSFk3UCq0NIC7wn6FMSbjwEMTQQwOO5HfbMd7fWJmJ3Uwt2b + Ao0ml8P5u3fGhw1OXtZwg2GC3AEMsAckYBOin++HvfYwh8eeSfGwOg5bt2zGxYQo3j+JhwSZinj0M9Dp + mkff6DyEwR3Q3TXC2VGEqWFFGD4auy2KmJB4iD+bDUd3H6qaX6HS5ETFPScqGxzcYG3tD8zlEg6nS6O3 + /wuHDQ6eSkfsiTTsS0jFXskl7ImXQaVSI/VaOiTHElmVIDo5JNGHkAgiE0Wmki4oYg0A4S9v9fnU6SfJ + CwAAAABJRU5ErkJggg== - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAACoSURBVDhPnZG9EQIhEIUpxSIMjMnJDSzCOswdM0tBa7gS - roHTAAhXVnnKAcOPb+ZLuN1vHoew1pJnMcYcxT9hweG6p2meyEtuzrlN+NQXFuxO2zeX+3m8TSxghtuk - AhDaNKkKtNaklCIpZZGiAFfg89JSTCZIa/PQY3kWWQniH4fFGpnA8326YUEaCDCEymBYUKMpKIFFENZ+ - 6RWE8TwQ1GgKevhMC/ECs2EOmrO0AXQAAAAASUVORK5CYII= + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAAKhJREFUOE+dkb0RAiEQhSnFIgyMyckNLMI6zB0zS0FruBKugdMACFdWecoBw49v + 5ku43W8eh7DWkmcxxhzFP2HB4bqnaZ7IS27OuU341BcW7E7bN5f7ebxNLGCG26QCENo0qQq01qSUIill + kaIAV+Dz0lJMJkhr89BjeRZZCeIfh8UamcDzfbphQRoIMITKYFhQoykogUUQ1n7pFYTxPBDUaAp6+EwL + 8QKzYQ6as7QBdAAAAABJRU5ErkJggg== @@ -169,88 +155,88 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABu - FAAAAk1TRnQBSQFMAgEBBAIAAQMBAAEDARABAAEQAQAE/wEhAQAI/wFCAU0BNgcAATYDAAEoAwABQAMA - ASADAAEBAQABIAYAASD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AG4AASQBCwEAAf8BIQEH - AQAB/wEdAQQBAAH/ARoCAAH/ARcCAAH/ARUCAAH/ARMCAAH/ARICAAH/ARICAAH/HAADOwFlA1cBuAFe - AmUB5QFXAmoB+QEAASABigH/AQABGwGHAf8BQQJqAfkBXgJlAeUBVgJXAbgDOwFlVAABngG8AZcB/wH9 - AfgB9gH/Ac0B1wHFAf8BggGoASkB/wEFAZUBAAH/AQABIgEAAf8BAAEhAQAB/wEAAZEBAAH/AZ4BuAGU - Af8DBwEKAwEBAhgAASkBEAEAAf8BxQG9AbYB/wHIAagBlwH/AccBpgGVAf8BxwGlAZQB/wHGAaQBkgH/ - AcYBowGSAf8BxgGiAZAB/wESAgAB/xgAAVQCVgGrA00B+gELAaMBvwH/AScBwAHUAf8BlQHZAeYB/wGB - AdsB8AH/AQABxgHsAf8BAAGqAd0B/wEAAZIBxwH/AQABgAGsAf8BMgJNAfoBVAJWAasMAAG3AaIBkwH/ - ARICAAH/ARICAAH/ARICAAH/ARICAAH/ARICAAH/ARICAAH/ARICAAH/ARICAAH/ARICAAH/ARICAAH/ - ARICAAH/ARICAAH/ARICAAH/DQABhgEAAf8BuwHQAbMB/wEAAYIBAAH/AQABmgEAAf8BCwG0AQAB/wEL - AbQBAAH/AQsBtAEAAf8BCwG0AQAB/wEAAS0BAAH/AZMBuQGHAf8DKgFAGAABgAEXAQQF/wHzAdcByQH/ - AfIB1QHHAf8B8gHUAcUB/wEAAcwBAAH/AQABmwEAAf8BxwGkAZQB/wEUAgAB/xgAAQkBhAGbAf8BAAG9 - AecB/wEWAdMB8QH/AYwB4wH0Af8BogHrAfYB/wGDAd8B9AH/AQABygHwAf8BAAG2Ae0B/wEAAacB6AH/ - AQABoQHhAf8BAAGWAdIB/wEAAQ0BKQH/DAABtwGiAZMB/wH9AfsB+QH/AeEB3AHYAf8B4AHXAdIB/wHf - AdIBygH/Ad8BzgHDAf8B3QHIAbsB/wHcAcMBswH/AdsBvwGtAf8B2wG7AacB/wHbAbsBpwH/AdsBuwGn - Af8BzwG0AaMB/wESAgAB/w0AAYoBAAH/AQABiAEAAf8BCwG0AQAB/wELAbQBAAH/AQsBtAEAAf8BAAGa - AQAB/wEAAZoBAAH/AQsBtAEAAf8BCwG0AQAB/wEAAS0BAAH/AagBvgGcAf8YAAGGARwBCgX/AfQB2gHO - Af8B9AHZAcwB/wHzAdcBygH/AQAB/wEAAf8BAAHMAQAB/wHIAagBmAH/ARgCAAH/GAABDAGHAZ4B/wEA - AcQB8AH/ARgB1AHxAf8BjAHjAfQB/wGiAesB9gH/AYMB3wH0Af8BAAHKAfAB/wEAAbYB7QH/AQABqAHo - Af8BAAGhAeEB/wEAAZwB2gH/AQABDgErAf8MAAG3AaIBkwH/A/4B/wHDAa0BnwH/AcABqAGaAf8BuwGj - AZQB/wH7AewB4wH/AbEBmAGHAf8BrAGRAYAB/wGnAYoBKAH/AfYB1gHCAf8BnQEuARsB/wGaASoBFgH/ - Ac8BtAGjAf8BEgIAAf8NAAGVAQAB/wGVAeIBiQH/AYwB1wGBAf8BjAHXAYEB/wEAAZEBAAH/AdYB4AHN - Af8B2wHhAdEB/wGlAcQBmgH/AQABmgEAAf8BCwG0AQAB/wEfAaABFAH/GAABjAEjAREF/wH1Ad4B0wH/ - AfUB3QHRAf8B9AHbAc8B/wH0AdoBzQH/AfMB2AHMAf8ByAGrAZsB/wEdAQIBAAH/GAABDgGJAaAB/wEA - AcQB7wH/ARcB1AHxAf8BjQHjAfQB/wGiAesB9gH/AYIB3wHzAf8BAAHKAfAB/wEAAbYB7QH/AQABqAHo - Af8BAAGhAeEB/wEAAZwB2gH/AQABEQEtAf8MAAG3AaIBkwH/A/4B/wP+Af8B/QH7AfkB/wH9AfcB8wH/ + FAAAAk1TRnQBSQFMAgEBBAEAARgBAwEYAQMBEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA + AwABIAMAAQEBAAEgBgABIP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AbgABIQEIAQAB/wEe + AQQBAAH/ARoBAQEAAf8BFwIAAf8BFAIAAf8BEgIAAf8BEAIAAf8BDwIAAf8BDwIAAf8cAAM7AWUDVwG4 + AV4CZQHlAVcCagH5AQABHQGKAf8BAAEYAYcB/wFBAmoB+QFeAmUB5QFWAlcBuAM7AWVUAAGeAbwBlwH/ + Af0B+AH2Af8BzQHXAcUB/wGCAagBJgH/AQIBlQEAAf8BAAEfAQAB/wEAAR4BAAH/AQABkQEAAf8BngG4 + AZQB/wMHAQoDAQECGAABJgENAQAB/wHFAb0BtgH/AcgBqAGXAf8BxwGmAZUB/wHHAaUBlAH/AcYBpAGS + Af8BxgGjAZIB/wHGAaIBkAH/AQ8CAAH/GAABVAJWAasDTQH6AQgBowG/Af8BJAHAAdQB/wGVAdkB5gH/ + AYEB2wHwAf8BAAHGAewB/wEAAaoB3QH/AQABkgHHAf8BAAGAAawB/wEyAk0B+gFUAlYBqwwAAbcBogGT + Af8BDwIAAf8BDwIAAf8BDwIAAf8BDwIAAf8BDwIAAf8BDwIAAf8BDwIAAf8BDwIAAf8BDwIAAf8BDwIA + Af8BDwIAAf8BDwIAAf8BDwIAAf8NAAGGAQAB/wG7AdABswH/AQABggEAAf8BAAGaAQAB/wEIAbQBAAH/ + AQgBtAEAAf8BCAG0AQAB/wEIAbQBAAH/AQABKgEAAf8BkwG5AYcB/wMqAUAYAAGAARQBAQX/AfMB1wHJ + Af8B8gHVAccB/wHyAdQBxQH/AQABzAEAAf8BAAGbAQAB/wHHAaQBlAH/ARECAAH/GAABBgGEAZsB/wEA + Ab0B5wH/ARMB0wHxAf8BjAHjAfQB/wGiAesB9gH/AYMB3wH0Af8BAAHKAfAB/wEAAbYB7QH/AQABpwHo + Af8BAAGhAeEB/wEAAZYB0gH/AQABCgEmAf8MAAG3AaIBkwH/Af0B+wH5Af8B4QHcAdgB/wHgAdcB0gH/ + Ad8B0gHKAf8B3wHOAcMB/wHdAcgBuwH/AdwBwwGzAf8B2wG/Aa0B/wHbAbsBpwH/AdsBuwGnAf8B2wG7 + AacB/wHPAbQBowH/AQ8CAAH/DQABigEAAf8BAAGIAQAB/wEIAbQBAAH/AQgBtAEAAf8BCAG0AQAB/wEA + AZoBAAH/AQABmgEAAf8BCAG0AQAB/wEIAbQBAAH/AQABKgEAAf8BqAG+AZwB/xgAAYYBGQEHBf8B9AHa + Ac4B/wH0AdkBzAH/AfMB1wHKAf8BAAH/AQAB/wEAAcwBAAH/AcgBqAGYAf8BFQIAAf8YAAEJAYcBngH/ + AQABxAHwAf8BFQHUAfEB/wGMAeMB9AH/AaIB6wH2Af8BgwHfAfQB/wEAAcoB8AH/AQABtgHtAf8BAAGo + AegB/wEAAaEB4QH/AQABnAHaAf8BAAELASgB/wwAAbcBogGTAf8D/gH/AcMBrQGfAf8BwAGoAZoB/wG7 + AaMBlAH/AfsB7AHjAf8BsQGYAYcB/wGsAZEBgAH/AacBigElAf8B9gHWAcIB/wGdASsBGAH/AZoBJwET + Af8BzwG0AaMB/wEPAgAB/w0AAZUBAAH/AZUB4gGJAf8BjAHXAYEB/wGMAdcBgQH/AQABkQEAAf8B1gHg + Ac0B/wHbAeEB0QH/AaUBxAGaAf8BAAGaAQAB/wEIAbQBAAH/ARwBoAERAf8YAAGMASABDgX/AfUB3gHT + Af8B9QHdAdEB/wH0AdsBzwH/AfQB2gHNAf8B8wHYAcwB/wHIAasBmwH/ARoCAAH/GAABCwGJAaAB/wEA + AcQB7wH/ARQB1AHxAf8BjQHjAfQB/wGiAesB9gH/AYIB3wHzAf8BAAHKAfAB/wEAAbYB7QH/AQABqAHo + Af8BAAGhAeEB/wEAAZwB2gH/AQABDgEqAf8MAAG3AaIBkwH/A/4B/wP+Af8B/QH7AfkB/wH9AfcB8wH/ AfwB8gHsAf8B+wHsAeMB/wH6AecB2wH/AfgB4QHSAf8B9wHbAckB/wH2AdYBwgH/AfYB0gG8Af8BzwG0 - AaMB/wESAgAB/w0AAZ0BAAH/AZUB4gGJAf8BjAHXAYEB/wEAAYwBAAH/AdYB4QHNAf8B7QHqAegB/wMV - AR0DAQECAdoB4QHQAf8BAwGmAQAB/wEAASwBAAH/GAABkgEpARgF/wH2AeEB2AH/AfYB4AHWAf8B9QHf - AdQB/wH1Ad4B0gH/AfUB3AHRAf8ByQGuAaAB/wEhAQcBAAH/GAABEAGMAaIB/wEAAcYB8AH/ARkB1AHx + AaMB/wEPAgAB/w0AAZ0BAAH/AZUB4gGJAf8BjAHXAYEB/wEAAYwBAAH/AdYB4QHNAf8B7QHqAegB/wMV + AR0DAQECAdoB4QHQAf8BAAGmAQAB/wEAASkBAAH/GAABkgEmARUF/wH2AeEB2AH/AfYB4AHWAf8B9QHf + AdQB/wH1Ad4B0gH/AfUB3AHRAf8ByQGuAaAB/wEeAQQBAAH/GAABDQGMAaIB/wEAAcYB8AH/ARYB1AHx Af8BjAHjAfQB/wGiAesB9gH/AYIB3wH0Af8BAAHKAfAB/wEAAbYB7QH/AQABqAHoAf8BAAGiAeIB/wEA - AZsB2wH/AQABFAGAAf8MAAG3AaIBkwH/A/4B/wHEAbABogH/AcEBrAGeAf8BvQGnAZgB/wH9AfcB8wH/ - AbMBmwGMAf8BrgGUAYQB/wGpAY4BLAH/AfgB4QHSAf8BnwGCAR8B/wGcASwBGQH/Ac8BtAGjAf8BEgIA + AZsB2wH/AQABEQGAAf8MAAG3AaIBkwH/A/4B/wHEAbABogH/AcEBrAGeAf8BvQGnAZgB/wH9AfcB8wH/ + AbMBmwGMAf8BrgGUAYQB/wGpAY4BKQH/AfgB4QHSAf8BnwGCARwB/wGcASkBFgH/Ac8BtAGjAf8BDwIA Af8NAAGdAQAB/wEAAZcBAAH/AVgBYgFYAe8BUwFkAVMB8QEAAYYBAAH/AaMBxgGYAf8DDgETBAADLAFE - AZ8BwwGYAf8BAAGUAQAB/xgAAZgBgQEfBf8B9wHlAdwB/wH3AeQB2gH/AfYB4gHZAf8B9gHhAdcB/wH2 - AeAB1QH/AcoBsAGjAf8BJgEMAQAB/xgAARMBjwGlAf8BAAHGAfAB/wEZAdQB8gH/AY0B4wH0Af8BogHr - AfYB/wGDAd8B9AH/AQABygHwAf8BAAG2Ae0B/wEAAacB6AH/AQABoQHiAf8BAAGcAdsB/wEAARcBgwH/ + AZ8BwwGYAf8BAAGUAQAB/xgAAZgBgQEcBf8B9wHlAdwB/wH3AeQB2gH/AfYB4gHZAf8B9gHhAdcB/wH2 + AeAB1QH/AcoBsAGjAf8BIwEJAQAB/xgAARABjwGlAf8BAAHGAfAB/wEWAdQB8gH/AY0B4wH0Af8BogHr + AfYB/wGDAd8B9AH/AQABygHwAf8BAAG2Ae0B/wEAAacB6AH/AQABoQHiAf8BAAGcAdsB/wEAARQBgwH/ DAABugGlAZYB/wP+Af8D/gH/A/4B/wP+Af8B/QH7AfkB/wH9AfcB8wH/AfwB8gHsAf8B+wHsAeMB/wH6 - AecB2wH/AfgB4QHSAf8B9wHbAckB/wHQAbkBqwH/ARICAAH/DAAB/gH7AfoB/wH+AfsB+gH/Ay0BRgMC - AQMDKAE8AwAEAQECAwABAQMAAQEDCAELAYkBwwEtAf8YAAGeAYcBJhn/AfMB7wHsAf8BKwESAQAB/xgA - ARQBkgGoAf8BAAHFAfAB/wEaAdQB8gH/AY0B4wH0Af8BogHrAfYB/wGCAd8B9AH/AQABygHwAf8BAAG2 - Ae0B/wEAAacB6AH/AQABoQHhAf8BAAGcAdsB/wEAARoBhgH/DAABvgGpAZoB/wP+Af8BxgGyAaUB/wHD - Aa8BogH/Ab4BqgGcAf8D/gH/AbUBnwGQAf8BsAGYAYkB/wGrAZIBgQH/AfsB7AHjAf8BoQGGASMB/wGd - AYEBHQH/AdEBwQG2Af8BEgIAAf8NAAGUAQAB/wHRAd4BywH/AwQBBQQAAxQBHAMEAQUDBgEIAwQBBgMB - AQIDEQEXAeEB3AHZAf8YAAGkAY4BLQH/AcwBugGtAf8BtwGiAZMB/wGvAZoBiwH/AacBkQGBAf8BnwGJ - ASgB/wGYAYEBHwH/AZEBKQEYAf8BgQEYAQUB/xgAARcBlQGrAf8BAAHFAfAB/wEaAdQB8gH/AY0B4wH0 + AecB2wH/AfgB4QHSAf8B9wHbAckB/wHQAbkBqwH/AQ8CAAH/DAAB/gH7AfoB/wH+AfsB+gH/Ay0BRgMC + AQMDKAE8AwAEAQECAwABAQMAAQEDCAELAYkBwwEqAf8YAAGeAYcBIxn/AfMB7wHsAf8BKAEPAQAB/xgA + AREBkgGoAf8BAAHFAfAB/wEXAdQB8gH/AY0B4wH0Af8BogHrAfYB/wGCAd8B9AH/AQABygHwAf8BAAG2 + Ae0B/wEAAacB6AH/AQABoQHhAf8BAAGcAdsB/wEAARcBhgH/DAABvgGpAZoB/wP+Af8BxgGyAaUB/wHD + Aa8BogH/Ab4BqgGcAf8D/gH/AbUBnwGQAf8BsAGYAYkB/wGrAZIBgQH/AfsB7AHjAf8BoQGGASAB/wGd + AYEBGgH/AdEBwQG2Af8BDwIAAf8NAAGUAQAB/wHRAd4BywH/AwQBBQQAAxQBHAMEAQUDBgEIAwQBBgMB + AQIDEQEXAeEB3AHZAf8YAAGkAY4BKgH/AcwBugGtAf8BtwGiAZMB/wGvAZoBiwH/AacBkQGBAf8BnwGJ + ASUB/wGYAYEBHAH/AZEBJgEVAf8BgQEVAQIB/xgAARQBlQGrAf8BAAHFAfAB/wEXAdQB8gH/AY0B4wH0 Af8BogHrAfYB/wGDAd8B9AH/AQABywHwAf8BAAG1Ae0B/wEAAacB6AH/AQABoQHiAf8BAAGcAdoB/wEA - AR0BiAH/DAABwwGuAZ4B/wP+Af8D/gH/A/4B/wP+Af8D/gH/A/4B/wH9AfsB+QH/Af0B9wHzAf8B/AHy - AewB/wH7AewB4wH/AfoB5wHbAf8B0QHBAbYB/wESAgAB/w0AAZkBAAH/AS0BrQElAf8DIQEwAwABAQMA - AQEBsgHNAagB/wEAAYcBAAH/AQABhwEAAf8BAAGDAQAB/wEAASwBAAH/AQABKAEAAf8YAAGpAZQBhQX/ - AfsB8AHrAf8B+gHvAekB/wH6Ae0B6AH/AfkB7AHmAf8B+QHrAeQB/wHNAbkBrgH/AYcBHgEMAf8YAAEZ - AZgBrgH/AQABxQHwAf8BGgHUAfEB/wGNAeMB9AH/AaIB6wH2Af8BgwHfAfQB/wEAAcoB8AH/AQABtgHt - Af8BAAGoAekB/wEAAaEB4QH/AQABnAHaAf8BAAEfAYoB/wwAAcgBsgGjAf8D/gH/AcQBsAGiAf8BwQGs - AZ4B/wG9AacBmAH/A/4B/wG3AaIBkwH/AbEBmwGNAf8BrQGVAYUB/wH9AfcB8wH/AaMBiQEnAf8BnwGE - ASEB/wHRAcEBtgH/ARICAAH/DAABCQGdAQAB/wEAAZkBAAH/AbUBzQGuAf8DHgErAwgBCwHuAesB6QH/ - AdkB4wHRAf8BAAGCAQAB/wELAbQBAAH/AQsBtAEAAf8BAAEsAQAB/xgAAbABmwGMGf8B8wHvAewB/wGO - ASUBEwH/GAABHAGbAbAB/wEAAcYB8AH/ARoB1AHyAf8BjQHjAfQB/wGiAesB9gH/AYMB3wH0Af8BAAHK - AfAB/wEAAbYB7QH/AQABqAHoAf8BAAGhAeEB/wEAAZwB2gH/AQABIwGOAf8MAAHMAbYBpwH/A/4B/wP+ - Af8D/gH/A/4B/wP+Af8D/gH/A/4B/wP+Af8B/QH7AfkB/wH9AfcB8wH/AfwB8gHsAf8B+wHsAeMB/wES - AgAB/wwAAYABsQEnAf8BGAHEAQsB/wEAAZEBAAH/AZQBuAGNAf8B2QHiAdIB/wHhAecB2gH/AQABggEA - Af8BCwG0AQAB/wELAbQBAAH/AQsBtAEAAf8BAAGDAQAB/xgAAbUBoQGSAf8BzAG6Aa0B/wHEAbABogH/ - Ab0BqQGbAf8BtgGiAZIB/wGuAZkBigH/AaYBkQGBAf8BnwGIAScB/wGUASsBGQH/GAABHwGfAbMB/wEA - AcYB8AH/ARgB1AHxAf8BjAHjAfQB/wGiAesB9gH/AYMB3wH0Af8BAAHKAfAB/wEAAbYB7QH/AQABpwHo - Af8BAAGhAeEB/wEAAZsB2gH/AQABJgGQAf8MAAHqAaoBiwH/AeoBqgGLAf8B6gGqAYsB/wHpAaUBhAH/ - AekBnwEpAf8B5wGXAR0B/wHmAY4BEQH/AeUBhgEFAf8B4wEsAQAB/wHjASUBAAH/AeIBIQEAAf8B4gEh - AQAB/wHiASEBAAH/AcgBEQEAAf8MAANiAe8BCwG0AQAB/wGOAd8BhAH/AQYBrgEAAf8BAAEuAQAB/wEA - AYMBAAH/ARoBwAEPAf8BjAHXAYEB/wGLAdcBgAH/AQABlgEAAf8BAAGJAQAB/xgAAbsBpgGXBf8B+wHy - Ae4B/wH5AesB5QH/AfgB5QHcAf8B9QHfAdQB/wHzAdcBywH/AdUBtAGkAf8BmgGDASEB/xgAASABoQG1 - Af8BGgHVAfQB/wGaAegB9wH/AbUB8wH6Af8BwgH4AfwB/wHDAfgB/QH/AcEB9wH9Af8BrwHwAfsB/wGP - AeIB9wH/ARkB0AHwAf8BAAG4AeUB/wECASkBkwH/DAAB6gGqAYsC/wHCAaIB/wH+AcABnwH/Af0BvQGa - Af8B/AG5AZYB/wH7AbUBkAH/AfoBsAGLAf8B+QGrAYQB/wH4AacBLAH/AfYBogEmAf8B9QGdASAB/wH1 - AZkBGQH/AfMBlQEUAf8BzQEUAQAB/wwAAw4BEwG2AdIBrwH/AQsBtAEAAf8BhwHfAS0B/wGTAeIBhwH/ - AYwB1wGBAf8BigHXAS4B/wEjAcoBFwH/AQABlgEAAf8B1gHfAdAB/wEAAY8BAAH/GAABwwGvAaIB/wP8 - Ff8B8wHvAewB/wGmAZABgAH/GAABIwGjAbgB/wHFAfkB/QH/AcUB+QH9Af8BxQH5Af0B/wHFAfkB/QH/ - AcUB+QH9Af8BxQH5Af0B/wHFAfkB/QH/AcUB+QH9Af8BxQH5Af0B/wHFAfkB/QH/AQQBLAGVAf8MAAHq - AaoBiwH/AeoBqgGLAf8B6gGqAYsB/wHqAaoBiwH/AeoBpgGGAf8B6QGhAS4B/wHoAZsBJQH/AecBlAEb - Af8B5gGOAREB/wHlAYcBBwH/AeQBgQEAAf8B5AEqAQAB/wHjASUBAAH/AeIBIQEAAf8QAAMWAR4ByAHa - AcQB/wGTAcABjQH/AQwBqgEDAf8BAAGaAQAB/wEAAZABAAH/AYMBrwErAf8DXQHwAzcBWwGXAcABjAH/ + ARoBiAH/DAABwwGuAZ4B/wP+Af8D/gH/A/4B/wP+Af8D/gH/A/4B/wH9AfsB+QH/Af0B9wHzAf8B/AHy + AewB/wH7AewB4wH/AfoB5wHbAf8B0QHBAbYB/wEPAgAB/w0AAZkBAAH/ASoBrQEiAf8DIQEwAwABAQMA + AQEBsgHNAagB/wEAAYcBAAH/AQABhwEAAf8BAAGDAQAB/wEAASkBAAH/AQABJQEAAf8YAAGpAZQBhQX/ + AfsB8AHrAf8B+gHvAekB/wH6Ae0B6AH/AfkB7AHmAf8B+QHrAeQB/wHNAbkBrgH/AYcBGwEJAf8YAAEW + AZgBrgH/AQABxQHwAf8BFwHUAfEB/wGNAeMB9AH/AaIB6wH2Af8BgwHfAfQB/wEAAcoB8AH/AQABtgHt + Af8BAAGoAekB/wEAAaEB4QH/AQABnAHaAf8BAAEcAYoB/wwAAcgBsgGjAf8D/gH/AcQBsAGiAf8BwQGs + AZ4B/wG9AacBmAH/A/4B/wG3AaIBkwH/AbEBmwGNAf8BrQGVAYUB/wH9AfcB8wH/AaMBiQEkAf8BnwGE + AR4B/wHRAcEBtgH/AQ8CAAH/DAABBgGdAQAB/wEAAZkBAAH/AbUBzQGuAf8DHgErAwgBCwHuAesB6QH/ + AdkB4wHRAf8BAAGCAQAB/wEIAbQBAAH/AQgBtAEAAf8BAAEpAQAB/xgAAbABmwGMGf8B8wHvAewB/wGO + ASIBEAH/GAABGQGbAbAB/wEAAcYB8AH/ARcB1AHyAf8BjQHjAfQB/wGiAesB9gH/AYMB3wH0Af8BAAHK + AfAB/wEAAbYB7QH/AQABqAHoAf8BAAGhAeEB/wEAAZwB2gH/AQABIAGOAf8MAAHMAbYBpwH/A/4B/wP+ + Af8D/gH/A/4B/wP+Af8D/gH/A/4B/wP+Af8B/QH7AfkB/wH9AfcB8wH/AfwB8gHsAf8B+wHsAeMB/wEP + AgAB/wwAAYABsQEkAf8BFQHEAQgB/wEAAZEBAAH/AZQBuAGNAf8B2QHiAdIB/wHhAecB2gH/AQABggEA + Af8BCAG0AQAB/wEIAbQBAAH/AQgBtAEAAf8BAAGDAQAB/xgAAbUBoQGSAf8BzAG6Aa0B/wHEAbABogH/ + Ab0BqQGbAf8BtgGiAZIB/wGuAZkBigH/AaYBkQGBAf8BnwGIASQB/wGUASgBFgH/GAABHAGfAbMB/wEA + AcYB8AH/ARUB1AHxAf8BjAHjAfQB/wGiAesB9gH/AYMB3wH0Af8BAAHKAfAB/wEAAbYB7QH/AQABpwHo + Af8BAAGhAeEB/wEAAZsB2gH/AQABIwGQAf8MAAHqAaoBiwH/AeoBqgGLAf8B6gGqAYsB/wHpAaUBhAH/ + AekBnwEmAf8B5wGXARoB/wHmAY4BDgH/AeUBhgECAf8B4wEpAQAB/wHjASIBAAH/AeIBHgEAAf8B4gEe + AQAB/wHiAR4BAAH/AcgBDgEAAf8MAANiAe8BCAG0AQAB/wGOAd8BhAH/AQMBrgEAAf8BAAErAQAB/wEA + AYMBAAH/ARcBwAEMAf8BjAHXAYEB/wGLAdcBgAH/AQABlgEAAf8BAAGJAQAB/xgAAbsBpgGXBf8B+wHy + Ae4B/wH5AesB5QH/AfgB5QHcAf8B9QHfAdQB/wHzAdcBywH/AdUBtAGkAf8BmgGDAR4B/xgAAR0BoQG1 + Af8BFwHVAfQB/wGaAegB9wH/AbUB8wH6Af8BwgH4AfwB/wHDAfgB/QH/AcEB9wH9Af8BrwHwAfsB/wGP + AeIB9wH/ARYB0AHwAf8BAAG4AeUB/wEAASYBkwH/DAAB6gGqAYsC/wHCAaIB/wH+AcABnwH/Af0BvQGa + Af8B/AG5AZYB/wH7AbUBkAH/AfoBsAGLAf8B+QGrAYQB/wH4AacBKQH/AfYBogEjAf8B9QGdAR0B/wH1 + AZkBFgH/AfMBlQERAf8BzQERAQAB/wwAAw4BEwG2AdIBrwH/AQgBtAEAAf8BhwHfASoB/wGTAeIBhwH/ + AYwB1wGBAf8BigHXASsB/wEgAcoBFAH/AQABlgEAAf8B1gHfAdAB/wEAAY8BAAH/GAABwwGvAaIB/wP8 + Ff8B8wHvAewB/wGmAZABgAH/GAABIAGjAbgB/wHFAfkB/QH/AcUB+QH9Af8BxQH5Af0B/wHFAfkB/QH/ + AcUB+QH9Af8BxQH5Af0B/wHFAfkB/QH/AcUB+QH9Af8BxQH5Af0B/wHFAfkB/QH/AQEBKQGVAf8MAAHq + AaoBiwH/AeoBqgGLAf8B6gGqAYsB/wHqAaoBiwH/AeoBpgGGAf8B6QGhASsB/wHoAZsBIgH/AecBlAEY + Af8B5gGOAQ4B/wHlAYcBBAH/AeQBgQEAAf8B5AEnAQAB/wHjASIBAAH/AeIBHgEAAf8QAAMWAR4ByAHa + AcQB/wGTAcABjQH/AQkBqgEAAf8BAAGaAQAB/wEAAZABAAH/AYMBrwEoAf8DXQHwAzcBWwGXAcABjAH/ GAABxwGzAaYB/wHEAbEBowH/AcEBrgGgAf8BvgGrAZwB/wG7AacBmAH/AbgBowGVAf8BtAGfAZAB/wGv AZoBjAH/AasBlgGHAf8YAANcAcwBjAG9AcwB/wGdAc8B2wH/Aa0B3wHoAf8BuQHsAfMB/wHCAfUB+gH/ - AcIB9QH6Af8BuAHrAfEB/wGpAdoB4wH/AZQBxAHRAf8BKgGoAbgB/wNcAcxQAAMCAQMDAQECAxABFQMH - AQoDEAEVAwsBDwMSARkDAwEEAwABAQQAAx8BLFQAAxQBGwNIAYQDWQHHA2AB6wNfAfsBHQGbAbAB/wEZ + AcIB9QH6Af8BuAHrAfEB/wGpAdoB4wH/AZQBxAHRAf8BJwGoAbgB/wNcAcxQAAMCAQMDAQECAxABFQMH + AQoDEAEVAwsBDwMSARkDAwEEAwABAQQAAx8BLFQAAxQBGwNIAYQDWQHHA2AB6wNfAfsBGgGbAbAB/wEW AZgBrQH/A18B+wNgAesDWQHHA0gBhAMUARtIAAFCAU0BPgcAAT4DAAEoAwABQAMAASADAAEBAQABAQYA AQEWAAP/gQAC/wHgAQ8B4AEHAv8BwAEHAeABDwHAAQMBgAEBAcABBwHgAQ8BwAEDAYABAQHAAQcB4AEP AcABAwGAAQEBwAEHAeABDwHAAQMBgAEBAcABBwHgAQ8BwAEDAYABAQHAAUcB4AEPAcABAwGAAQEBwAEH @@ -273,12 +259,12 @@ - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAADfSURBVDhPrVFLCsIwFOwRXHsKz9B9Qe+QawiuuvUALjyC - SA8geIG66MITiFIwC5NuYya8kdIPDdKBIX2vM/PySWaFtfYINk3jSPZEMg4aX/dLMF63y7CyngyBAGIY - H7ezKw+bsKJGfzIAU0CYPu9n+MaKmv9EOgwIMA2TaQBR8zgiHQYN7R0opVxd178wkQ7DC/btO4AhTVOX - ZZmrqgr1SWu9EHkf3VdgAFkUBXqlMWYllj4QwqBuAJjnOfraa9ZiGcfsAVFHaIMB0ZfYBQL4jH7LO2nH - AwGecef9H0nyBfIEZc+YK0L5AAAAAElFTkSuQmCC + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAAN9JREFUOE+tUUsKwjAU7BFcewrP0H1B75BrCK669QAuPIJIDyB4gbrowhOIUjAL + k25jJryR0g8N0oEhfa8z8/JJZoW19gg2TeNI9kQyDhpf90swXrfLsLKeDIEAYhgft7MrD5uwokZ/MgBT + QJg+72f4xoqa/0Q6DAgwDZNpAFHzOCIdBg3tHSilXF3XvzCRDsML9u07gCFNU5dlmauqCvVJa70QeR/d + V2AAWRQFeqUxZiWWPhDCoG4AmOc5+tpr1mIZx+wBUUdogwHRl9gFAviMfss7accDAZ5x5/0fSfIF8gRl + z5grQvkAAAAASUVORK5CYII= @@ -286,12 +272,12 @@ - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADrwAAA68AZW8ckkAAADfSURBVDhPrVFLCsIwFOwRXHsKz9B9Qe+QawiuuvUALjyC - SA8geIG66MITiFIwC5NuYya8kdIPDdKBIX2vM/PySWaFtfYINk3jSPZEMg4aX/dLMF63y7CyngyBAGIY - H7ezKw+bsKJGfzIAU0CYPu9n+MaKmv9EOgwIMA2TaQBR8zgiHQYN7R0opVxd178wkQ7DC/btO4AhTVOX - ZZmrqgr1SWu9EHkf3VdgAFkUBXqlMWYllj4QwqBuAJjnOfraa9ZiGcfsAVFHaIMB0ZfYBQL4jH7LO2nH - AwGecef9H0nyBfIEZc+YK0L5AAAAAElFTkSuQmCC + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO + vAAADrwBlbxySQAAAN9JREFUOE+tUUsKwjAU7BFcewrP0H1B75BrCK669QAuPIJIDyB4gbrowhOIUjAL + k25jJryR0g8N0oEhfa8z8/JJZoW19gg2TeNI9kQyDhpf90swXrfLsLKeDIEAYhgft7MrD5uwokZ/MgBT + QJg+72f4xoqa/0Q6DAgwDZNpAFHzOCIdBg3tHSilXF3XvzCRDsML9u07gCFNU5dlmauqCvVJa70QeR/d + V2AAWRQFeqUxZiWWPhDCoG4AmOc5+tpr1mIZx+wBUUdogwHRl9gFAviMfss7accDAZ5x5/0fSfIF8gRl + z5grQvkAAAAASUVORK5CYII= @@ -300,6 +286,9 @@ 1130, 17 + + 1263, 17 + AAABAAYAEBAAAAEAIABoBAAAZgAAACAgAAABACAAqBAAAM4EAAAwMAAAAQAgAKglAAB2FQAAQEAAAAEA diff --git a/src/CymaticLabs.InfluxDB.Studio/AppSettings.cs b/src/CymaticLabs.InfluxDB.Studio/AppSettings.cs index 6cb1cdc..1c4a917 100644 --- a/src/CymaticLabs.InfluxDB.Studio/AppSettings.cs +++ b/src/CymaticLabs.InfluxDB.Studio/AppSettings.cs @@ -125,6 +125,9 @@ public AppSettings() // Set the version string Version = GetType().Assembly.GetName().Version.ToString(); + + // Upgrade settings as needed + Properties.Settings.Default.Upgrade(); } #endregion Constructors diff --git a/src/CymaticLabs.InfluxDB.Studio/Controls/ExtendedTabControl.cs b/src/CymaticLabs.InfluxDB.Studio/Controls/ExtendedTabControl.cs index eb8fcb4..4cbf5a8 100644 --- a/src/CymaticLabs.InfluxDB.Studio/Controls/ExtendedTabControl.cs +++ b/src/CymaticLabs.InfluxDB.Studio/Controls/ExtendedTabControl.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Windows.Forms; @@ -13,6 +14,15 @@ public partial class ExtendedTabControl : TabControl { #region Fields + // Used for a custom tab context menu for closing tabs with options + private System.Windows.Forms.ContextMenuStrip tabContextMenuStrip; + private System.Windows.Forms.ToolStripMenuItem closeTabMenuItem; + private System.Windows.Forms.ToolStripMenuItem closeAllButThisMenuItem; + private System.Windows.Forms.ToolStripMenuItem closeAllMenuItem; + + // Used when selected "Close All But This" in the tab context menu + TabPage tabToLeave; + #endregion Fields #region Properties @@ -101,6 +111,30 @@ public ExtendedTabControl() DrawItem += ExtendedTabControl_DrawItem; DrawMode = TabDrawMode.OwnerDrawFixed; SizeMode = TabSizeMode.Fixed; + + // Initialize tab context meu + this.tabContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(); + this.closeTabMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.closeAllButThisMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.closeAllMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + + // Setup the tab context menu + this.tabContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.closeTabMenuItem, + this.closeAllButThisMenuItem, + this.closeAllMenuItem}); + this.tabContextMenuStrip.Name = "tabContextMenuStrip"; + this.tabContextMenuStrip.Size = new System.Drawing.Size(167, 70); + + // Setup tab context menu items + this.closeTabMenuItem.Text = "Close"; + this.closeTabMenuItem.Click += CloseMenuItem_Click; + + this.closeAllButThisMenuItem.Text = "Close All But This"; + this.closeAllButThisMenuItem.Click += CloseAllButThisMenuItem_Click; + + this.closeAllMenuItem.Text = "Close All"; + this.closeAllMenuItem.Click += CloseAllMenuItem_Click; } #endregion Constructors @@ -115,14 +149,70 @@ private void ExtendedTabControl_MouseUp(object sender, MouseEventArgs e) Rectangle r = GetTabRect(SelectedIndex); Rectangle closeButton = new Rectangle(r.Right - TabCloseWidth, r.Top + 4, 10, 10); - if (closeButton.Contains(e.Location)) + // Left click, check for tab close + if (e.Button == MouseButtons.Left && closeButton.Contains(e.Location)) { // Remove tab if a close click detected - var tab = SelectedTab; - TabPages.Remove(tab); + CloseTab(SelectedTab); + } + // Right click, show tab context menu + else if (e.Button == MouseButtons.Right) + { + // First go through and get the tab that was right-clicked + Point p = PointToClient(Cursor.Position); + for (int i = 0; i < TabCount; i++) + { + r = GetTabRect(i); + + if (r.Contains(p)) + { + SelectedIndex = i; // i is the index of tab under cursor + tabToLeave = SelectedTab; + break; + } + } + + // Now show the context menu + tabContextMenuStrip.Show(this, e.Location); + } + } + + // Handles click of tab context menu "Close" + private void CloseMenuItem_Click(object sender, EventArgs e) + { + // Remove tab + CloseTab(SelectedTab); + } + + // Handles click of tab context menu "Close All But This" + private void CloseAllButThisMenuItem_Click(object sender, EventArgs e) + { + if (tabToLeave == null) return; - // Notify - if (TabClosed != null) TabClosed(this, tab); + // First copy the current list of tab pages + List tabPagesToClose = new List(); + foreach (TabPage tab in TabPages) tabPagesToClose.Add(tab); + + // Now go through and close all but this one + foreach (TabPage tab in tabPagesToClose) + { + if (tab != tabToLeave) CloseTab(tab); + } + + tabToLeave = null; + } + + // Handles click of tab context menu "Close All" + private void CloseAllMenuItem_Click(object sender, EventArgs e) + { + // First copy the current list of tab pages + List tabPagesToClose = new List(); + foreach (TabPage tab in TabPages) tabPagesToClose.Add(tab); + + // Close all tabs + foreach (TabPage tab in tabPagesToClose) + { + CloseTab(tab); } } @@ -210,6 +300,18 @@ public void ResizeTabs() ItemSize = newTabSize; } + // Closes a tab + private void CloseTab(TabPage tab) + { + if (tab == null) return; + + // Remove tab + TabPages.Remove(tab); + + // Notify + if (TabClosed != null) TabClosed(this, tab); + } + #endregion Methods } } diff --git a/src/CymaticLabs.InfluxDB.Studio/CymaticLabs.InfluxDB.Studio.csproj b/src/CymaticLabs.InfluxDB.Studio/CymaticLabs.InfluxDB.Studio.csproj index d2d5948..c09949c 100644 --- a/src/CymaticLabs.InfluxDB.Studio/CymaticLabs.InfluxDB.Studio.csproj +++ b/src/CymaticLabs.InfluxDB.Studio/CymaticLabs.InfluxDB.Studio.csproj @@ -38,19 +38,19 @@ - ..\..\packages\InfluxData.Net.7.0.3\lib\net461\InfluxData.Net.dll + ..\..\packages\InfluxData.Net.8.0.1\lib\net461\InfluxData.Net.dll True - ..\..\packages\InfluxData.Net.7.0.3\lib\net461\InfluxData.Net.Common.dll + ..\..\packages\InfluxData.Net.8.0.1\lib\net461\InfluxData.Net.Common.dll True - ..\..\packages\InfluxData.Net.7.0.3\lib\net461\InfluxData.Net.InfluxDb.dll + ..\..\packages\InfluxData.Net.8.0.1\lib\net461\InfluxData.Net.InfluxDb.dll True - ..\..\packages\InfluxData.Net.7.0.3\lib\net461\InfluxData.Net.Kapacitor.dll + ..\..\packages\InfluxData.Net.8.0.1\lib\net461\InfluxData.Net.Kapacitor.dll True diff --git a/src/CymaticLabs.InfluxDB.Studio/Dialogs/AboutDialog.Designer.cs b/src/CymaticLabs.InfluxDB.Studio/Dialogs/AboutDialog.Designer.cs index 6bd72bd..b0c0754 100644 --- a/src/CymaticLabs.InfluxDB.Studio/Dialogs/AboutDialog.Designer.cs +++ b/src/CymaticLabs.InfluxDB.Studio/Dialogs/AboutDialog.Designer.cs @@ -108,7 +108,7 @@ private void InitializeComponent() this.copyrightLabel.Name = "copyrightLabel"; this.copyrightLabel.Size = new System.Drawing.Size(250, 13); this.copyrightLabel.TabIndex = 3; - this.copyrightLabel.Text = "Copyright 2016 Michael Everett. All rights reserved."; + this.copyrightLabel.Text = "Copyright 2017 Michael Everett. All rights reserved."; // // warranyLabel // diff --git a/src/CymaticLabs.InfluxDB.Studio/Properties/AssemblyInfo.cs b/src/CymaticLabs.InfluxDB.Studio/Properties/AssemblyInfo.cs index 342c0f8..6368f00 100644 --- a/src/CymaticLabs.InfluxDB.Studio/Properties/AssemblyInfo.cs +++ b/src/CymaticLabs.InfluxDB.Studio/Properties/AssemblyInfo.cs @@ -10,7 +10,7 @@ [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("CymaticLabs.InfluxDB.Studio")] -[assembly: AssemblyCopyright("Copyright © Michael Everett/Cymatic Labs 2016")] +[assembly: AssemblyCopyright("Copyright © Michael Everett/Cymatic Labs 2017")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -32,8 +32,8 @@ // 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.1.2.0")] -[assembly: AssemblyFileVersion("0.1.0.0")] +[assembly: AssemblyVersion("0.2.0.0")] +[assembly: AssemblyFileVersion("0.2.0.0")] // Enable log4net using app.config [assembly: log4net.Config.XmlConfigurator(Watch = true)] diff --git a/src/CymaticLabs.InfluxDB.Studio/packages.config b/src/CymaticLabs.InfluxDB.Studio/packages.config index 15c4c71..827f9ec 100644 --- a/src/CymaticLabs.InfluxDB.Studio/packages.config +++ b/src/CymaticLabs.InfluxDB.Studio/packages.config @@ -1,6 +1,6 @@  - +