From 0356e9e7af699dda42b79deee1ea203cd9aca328 Mon Sep 17 00:00:00 2001 From: tdewin Date: Wed, 3 Aug 2016 18:36:30 +0200 Subject: [PATCH] Staggered Start Up Script + Ordering by selecting lines and rightclicking or using (+/-) with single select row + Regex filter by right clicking --- Inputbox.Designer.cs | 90 ++++++++++++++++++ Inputbox.cs | 49 ++++++++++ Inputbox.resx | 120 ++++++++++++++++++++++++ SuperEdit.Designer.cs | 49 +++++++++- SuperEdit.cs | 133 ++++++++++++++++++++++++++- SuperEdit.csproj | 9 ++ SuperEdit.resx | 6 ++ Templates.xml | 44 +++++++++ VeeamPS.cs | 2 +- nightly-build/SuperEdit_20160803.exe | Bin 0 -> 46080 bytes 10 files changed, 498 insertions(+), 4 deletions(-) create mode 100644 Inputbox.Designer.cs create mode 100644 Inputbox.cs create mode 100644 Inputbox.resx create mode 100644 nightly-build/SuperEdit_20160803.exe diff --git a/Inputbox.Designer.cs b/Inputbox.Designer.cs new file mode 100644 index 0000000..9fcb998 --- /dev/null +++ b/Inputbox.Designer.cs @@ -0,0 +1,90 @@ +namespace SuperEdit +{ + partial class Inputbox + { + /// + /// 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.btnOk = new System.Windows.Forms.Button(); + this.btnCancel = new System.Windows.Forms.Button(); + this.txtInput = new System.Windows.Forms.TextBox(); + this.SuspendLayout(); + // + // btnOk + // + this.btnOk.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btnOk.Location = new System.Drawing.Point(297, 46); + this.btnOk.Name = "btnOk"; + this.btnOk.Size = new System.Drawing.Size(75, 23); + this.btnOk.TabIndex = 0; + this.btnOk.Text = "OK"; + this.btnOk.UseVisualStyleBackColor = true; + this.btnOk.Click += new System.EventHandler(this.btnOk_Click); + // + // btnCancel + // + this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btnCancel.Location = new System.Drawing.Point(216, 46); + this.btnCancel.Name = "btnCancel"; + this.btnCancel.Size = new System.Drawing.Size(75, 23); + this.btnCancel.TabIndex = 1; + this.btnCancel.Text = "Cancel"; + this.btnCancel.UseVisualStyleBackColor = true; + this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click); + // + // txtInput + // + this.txtInput.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtInput.Location = new System.Drawing.Point(12, 12); + this.txtInput.Name = "txtInput"; + this.txtInput.Size = new System.Drawing.Size(360, 20); + this.txtInput.TabIndex = 2; + // + // Inputbox + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(384, 81); + this.Controls.Add(this.txtInput); + this.Controls.Add(this.btnCancel); + this.Controls.Add(this.btnOk); + this.MaximumSize = new System.Drawing.Size(600, 120); + this.MinimumSize = new System.Drawing.Size(400, 120); + this.Name = "Inputbox"; + this.Text = "Inputbox"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button btnOk; + private System.Windows.Forms.Button btnCancel; + private System.Windows.Forms.TextBox txtInput; + } +} \ No newline at end of file diff --git a/Inputbox.cs b/Inputbox.cs new file mode 100644 index 0000000..b42c2cb --- /dev/null +++ b/Inputbox.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace SuperEdit +{ + + public partial class Inputbox : Form + { + private InputFormObject ifo; + + public Inputbox(InputFormObject ifo,String topText) + { + InitializeComponent(); + this.ifo = ifo; + this.Text = topText; + } + + private void btnOk_Click(object sender, EventArgs e) + { + this.ifo.gotOk = true; + this.ifo.value = this.txtInput.Text; + this.Dispose(); + } + + private void btnCancel_Click(object sender, EventArgs e) + { + this.Dispose(); + } + } + + public class InputFormObject + { + public bool gotOk { get; set; } + public string value { get; set; } + + public InputFormObject() + { + this.gotOk = false; + this.value = ""; + } + } +} diff --git a/Inputbox.resx b/Inputbox.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/Inputbox.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/SuperEdit.Designer.cs b/SuperEdit.Designer.cs index b2f68b3..f5ce1ec 100644 --- a/SuperEdit.Designer.cs +++ b/SuperEdit.Designer.cs @@ -31,9 +31,14 @@ protected override void Dispose(bool disposing) /// private void InitializeComponent() { + this.components = new System.ComponentModel.Container(); this.dgvJobs = new System.Windows.Forms.DataGridView(); this.dgvJobSelect = new System.Windows.Forms.DataGridViewCheckBoxColumn(); this.dgvJobName = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.ctxMove = new System.Windows.Forms.ContextMenuStrip(this.components); + this.ctxTop = new System.Windows.Forms.ToolStripMenuItem(); + this.ctxBottom = new System.Windows.Forms.ToolStripMenuItem(); + this.ctxRegex = new System.Windows.Forms.ToolStripMenuItem(); this.comboVal = new System.Windows.Forms.ComboBox(); this.btnReview = new System.Windows.Forms.Button(); this.comboTemp = new System.Windows.Forms.ComboBox(); @@ -41,6 +46,7 @@ private void InitializeComponent() this.chkAll = new System.Windows.Forms.CheckBox(); this.btnDirectExec = new System.Windows.Forms.Button(); ((System.ComponentModel.ISupportInitialize)(this.dgvJobs)).BeginInit(); + this.ctxMove.SuspendLayout(); this.SuspendLayout(); // // dgvJobs @@ -55,13 +61,16 @@ private void InitializeComponent() this.dgvJobs.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { this.dgvJobSelect, this.dgvJobName}); + this.dgvJobs.ContextMenuStrip = this.ctxMove; this.dgvJobs.EnableHeadersVisualStyles = false; this.dgvJobs.Location = new System.Drawing.Point(12, 46); this.dgvJobs.Name = "dgvJobs"; + this.dgvJobs.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; this.dgvJobs.ShowEditingIcon = false; this.dgvJobs.Size = new System.Drawing.Size(820, 389); this.dgvJobs.TabIndex = 0; this.dgvJobs.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dgvJobs_CellContentClick); + this.dgvJobs.ColumnHeaderMouseClick += new System.Windows.Forms.DataGridViewCellMouseEventHandler(this.dgvJobs_ColumnHeaderMouseClick); // // dgvJobSelect // @@ -75,6 +84,37 @@ private void InitializeComponent() this.dgvJobName.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; this.dgvJobName.HeaderText = "Name"; this.dgvJobName.Name = "dgvJobName"; + this.dgvJobName.ReadOnly = true; + // + // ctxMove + // + this.ctxMove.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.ctxTop, + this.ctxBottom, + this.ctxRegex}); + this.ctxMove.Name = "ctxMove"; + this.ctxMove.Size = new System.Drawing.Size(242, 70); + // + // ctxTop + // + this.ctxTop.Name = "ctxTop"; + this.ctxTop.Size = new System.Drawing.Size(241, 22); + this.ctxTop.Text = "Move Selected Rows To Top"; + this.ctxTop.Click += new System.EventHandler(this.ctxTop_Click); + // + // ctxBottom + // + this.ctxBottom.Name = "ctxBottom"; + this.ctxBottom.Size = new System.Drawing.Size(241, 22); + this.ctxBottom.Text = "Move Selected Rows To Bottom"; + this.ctxBottom.Click += new System.EventHandler(this.ctxBottom_Click); + // + // ctxRegex + // + this.ctxRegex.Name = "ctxRegex"; + this.ctxRegex.Size = new System.Drawing.Size(241, 22); + this.ctxRegex.Text = "Regex Filter"; + this.ctxRegex.Click += new System.EventHandler(this.ctxRegex_Click); // // comboVal // @@ -158,6 +198,7 @@ private void InitializeComponent() this.Load += new System.EventHandler(this.Form1_Load); this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.SuperEdit_KeyDown); ((System.ComponentModel.ISupportInitialize)(this.dgvJobs)).EndInit(); + this.ctxMove.ResumeLayout(false); this.ResumeLayout(false); this.PerformLayout(); @@ -166,14 +207,18 @@ private void InitializeComponent() #endregion private System.Windows.Forms.DataGridView dgvJobs; - private DataGridViewCheckBoxColumn dgvJobSelect; - private DataGridViewTextBoxColumn dgvJobName; private ComboBox comboVal; private Button btnReview; private ComboBox comboTemp; private ComboBox comboType; private CheckBox chkAll; private Button btnDirectExec; + private DataGridViewCheckBoxColumn dgvJobSelect; + private DataGridViewTextBoxColumn dgvJobName; + private ContextMenuStrip ctxMove; + private ToolStripMenuItem ctxTop; + private ToolStripMenuItem ctxBottom; + private ToolStripMenuItem ctxRegex; } } diff --git a/SuperEdit.cs b/SuperEdit.cs index 0e84def..dce1a66 100644 --- a/SuperEdit.cs +++ b/SuperEdit.cs @@ -9,6 +9,7 @@ using System.Windows.Forms; using System.Management.Automation; using System.Collections.ObjectModel; +using System.Text.RegularExpressions; namespace SuperEdit { @@ -121,7 +122,10 @@ private void thirdstateChkAll() } private void dgvJobs_CellContentClick(object sender, DataGridViewCellEventArgs e) { - thirdstateChkAll(); + if (e.ColumnIndex == dgvJobSelect.Index) + { + thirdstateChkAll(); + } } private void comboType_SelectedIndexChanged(object sender, EventArgs e) @@ -161,10 +165,137 @@ private void SuperEdit_KeyDown(object sender, KeyEventArgs e) res.templateController.extractInternal(); this.Dispose(); break; + case Keys.Add: + + if (dgvJobs.SelectedRows.Count == 1) + { + var ind = dgvJobs.SelectedRows[0].Index; + if (ind > 0) + { + + var o = objects[ind]; + this.objects.Remove(o); + this.objects.Insert(ind - 1, o); + foreach(DataGridViewRow row in dgvJobs.Rows) + { + if (row.Selected) + { + row.Selected = false; + } + } + dgvJobs.Rows[ind - 1].Selected = true; + dgvJobs.CurrentCell = dgvJobs.Rows[ind - 1].Cells[0]; + + } + + } + break; + case Keys.Subtract: + + if (dgvJobs.SelectedRows.Count == 1) + { + var ind = dgvJobs.SelectedRows[0].Index; + if (ind < (dgvJobs.Rows.Count-1)) + { + + var o = objects[ind]; + this.objects.Remove(o); + this.objects.Insert(ind + 1, o); + foreach (DataGridViewRow row in dgvJobs.Rows) + { + if (row.Selected) + { + row.Selected = false; + } + } + dgvJobs.Rows[ind + 1].Selected = true; + dgvJobs.CurrentCell = dgvJobs.Rows[ind + 1].Cells[0]; + + } + + } + break; + default: + //MessageBox.Show(e.KeyCode.ToString()); + break; + } + } + + private void ctxTop_Click(object sender, EventArgs e) + { + var rs = dgvJobs.SelectedRows; + var movelist = new List(); + + //selection is inversed what you should expect + //that is ok, we will insert at location 0 so the first ones inserted will be pushed down + //store them first in a list not to change the order + for(int ri= 0;ri < rs.Count; ri++) + { + movelist.Add(objects[rs[ri].Index]); + } + foreach(var o in movelist) + { + this.objects.Remove(o); + this.objects.Insert(0, o); + } + + } + + private void ctxBottom_Click(object sender, EventArgs e) + { + var rs = dgvJobs.SelectedRows; + var movelist = new List(); + + //selection is inversed what you should expect + //that is ok, we will insert at location 0 so the first ones inserted will be pushed down + //store them first in a list not to change the order + for (int ri = 0; ri < rs.Count; ri++) + { + movelist.Add(objects[rs[ri].Index]); + } + + foreach (var o in movelist) + { + this.objects.Remove(o); + this.objects.Add(o); } } + private void ctxRegex_Click(object sender, EventArgs e) + { + InputFormObject ifo = new InputFormObject(); + var ib = new Inputbox(ifo,"Regex"); + ib.ShowDialog(); + + if (ifo.gotOk) + { + var rp = ifo.value; + + Regex r = new Regex(rp, RegexOptions.IgnoreCase); + + var removelist = new List(); + foreach (var o in objects) + { + if (!r.IsMatch(o.name)) + { + removelist.Add(o); + } + } + foreach (var o in removelist) + { + objects.Remove(o); + } + } + } + private void dgvJobs_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) + { + if(e.ColumnIndex == dgvJobName.DisplayIndex) + { + + } + } } + } diff --git a/SuperEdit.csproj b/SuperEdit.csproj index 82804f0..c339c5a 100644 --- a/SuperEdit.csproj +++ b/SuperEdit.csproj @@ -98,6 +98,12 @@ + + Form + + + Inputbox.cs + Form @@ -122,6 +128,9 @@ + + Inputbox.cs + Progress.cs diff --git a/SuperEdit.resx b/SuperEdit.resx index 9aa165f..23eed7e 100644 --- a/SuperEdit.resx +++ b/SuperEdit.resx @@ -123,4 +123,10 @@ True + + 17, 17 + + + 46 + \ No newline at end of file diff --git a/Templates.xml b/Templates.xml index c989bdd..407ad97 100644 --- a/Templates.xml +++ b/Templates.xml @@ -239,6 +239,50 @@ $ctr = ($ctr+1)%$alloweddays.Length Saturday, Sunday + + + + diff --git a/VeeamPS.cs b/VeeamPS.cs index c79339f..5b358e3 100644 --- a/VeeamPS.cs +++ b/VeeamPS.cs @@ -85,7 +85,7 @@ public BindingList GetObjects(string selectScript, string selectVa if (!this.VeeamPsLoaded) { //throw new Exception("Instance not loaded"); - for (int i = 0; i < 5000; i++) + for (int i = 0; i < 20; i++) { objects.Add(new SelectObject("job" + i)); } diff --git a/nightly-build/SuperEdit_20160803.exe b/nightly-build/SuperEdit_20160803.exe new file mode 100644 index 0000000000000000000000000000000000000000..1133213ea7bcf02a6f6fed9c380b2227244a8604 GIT binary patch literal 46080 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