RegName – Rev 2
?pathlinks?
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Reflection;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Forms;
using NetSparkleUpdater.Enums;
using NetSparkleUpdater.SignatureVerifiers;
using NetSparkleUpdater.UI.WinForms;
using NetSparkleUpdater;
using RegName.Utilities;
namespace RegName
{
public partial class MainForm : Form
{
#region Private Delegates, Events, Enums, Properties, Indexers and Fields
private AboutForm _aboutForm;
private Regex _expression;
private Helpers.IncrementMode _incrementMode;
private RegexOptions _regexOptions;
private readonly SparkleUpdater _sparkle;
#endregion
#region Constructors, Destructors and Finalizers
public MainForm()
{
InitializeComponent();
// Start application update.
var manifestModuleName = Assembly.GetEntryAssembly().ManifestModule.FullyQualifiedName;
var icon = Icon.ExtractAssociatedIcon(manifestModuleName);
_sparkle = new SparkleUpdater("https://regname.grimore.org/update/appcast.xml",
new Ed25519Checker(SecurityMode.Strict, "LonrgxVjSF0GnY4hzwlRJnLkaxnDn2ikdmOifILzLJY="))
{
UIFactory = new UIFactory(icon),
RelaunchAfterUpdate = true,
SecurityProtocolType = SecurityProtocolType.Tls12
};
_sparkle.StartLoop(true, true);
comboBox1.SelectedIndex = 0;
_regexOptions = RegexOptions.Compiled;
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && components != null)
{
components.Dispose();
}
base.Dispose(disposing);
}
#endregion
#region Event Handlers
private void DataGridView2_RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e)
{
//UpdatePreviewDataGridView();
}
private void DataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{
//UpdatePreviewDataGridView();
}
private void DataGridView2_Scroll(object sender, ScrollEventArgs e)
{
switch (e.ScrollOrientation)
{
case ScrollOrientation.VerticalScroll:
dataGridView1.FirstDisplayedScrollingRowIndex = dataGridView2.FirstDisplayedScrollingRowIndex;
break;
case ScrollOrientation.HorizontalScroll:
if (dataGridView1.Rows.Count > 0 & dataGridView2.Rows.Count > 0)
{
dataGridView1.HorizontalScrollingOffset = e.NewValue;
}
break;
}
}
private void DataGridView1_Scroll(object sender, ScrollEventArgs e)
{
switch (e.ScrollOrientation)
{
case ScrollOrientation.VerticalScroll:
dataGridView2.FirstDisplayedScrollingRowIndex = dataGridView1.FirstDisplayedScrollingRowIndex;
break;
case ScrollOrientation.HorizontalScroll:
if (dataGridView2.Rows.Count > 0 & dataGridView1.Rows.Count > 0)
{
dataGridView2.HorizontalScrollingOffset = e.NewValue;
}
break;
}
}
private void TextBox3_TextChanged(object sender, EventArgs e)
{
UpdatePreviewDataGridView();
}
private void DataGridView1_Sorted(object sender, EventArgs e)
{
UpdatePreviewDataGridView();
}
private void QuitToolStripMenuItem_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void AboutToolStripMenuItem1_Click(object sender, EventArgs e)
{
if (_aboutForm != null)
{
return;
}
_aboutForm = new AboutForm();
_aboutForm.Closing += AboutForm_Closing;
_aboutForm.Show();
}
private void AboutForm_Closing(object sender, CancelEventArgs e)
{
if (_aboutForm == null)
{
return;
}
_aboutForm.Closing -= AboutForm_Closing;
_aboutForm.Dispose();
_aboutForm = null;
}
private void RemoveAllToolStripMenuItem_Click(object sender, EventArgs e)
{
dataGridView1.Rows.Clear();
UpdatePreviewDataGridView();
}
private async void Button2_Click(object sender, EventArgs e)
{
toolStripStatusLabel1.Text = "Renaming...";
var rows = dataGridView2.Rows.OfType<DataGridViewRow>();
var dataGridViewRows = rows as DataGridViewRow[] ?? rows.ToArray();
var count = dataGridViewRows.Length;
var rename = dataGridViewRows
.Select(row =>
new FileRename((string) row.Cells[0].Value, (string) dataGridView1.Rows[row.Index].Cells[0].Tag))
.ToList();
toolStripProgressBar1.Minimum = 0;
toolStripProgressBar1.Maximum = count;
var progress = new Progress<RenameProgress>(renameProgress =>
{
toolStripProgressBar1.Value = renameProgress.Index;
var previewRow = dataGridView2.Rows[renameProgress.Index];
var replaceRow = dataGridView1.Rows[renameProgress.Index];
switch (renameProgress)
{
case RenameProgressSuccess renameSuccess:
previewRow.DefaultCellStyle.BackColor = Color.LightGreen;
replaceRow.Cells[0].Tag = renameSuccess.New.FullName;
replaceRow.Cells[0].Value = renameSuccess.New.Name;
replaceRow.Cells[1].Value = renameSuccess.New.CreationTime;
replaceRow.Cells[2].Value = renameSuccess.New.LastAccessTime;
previewRow.Cells[0].Tag = renameSuccess.New.FullName;
previewRow.Cells[0].Value = renameSuccess.New.Name;
return;
case RenameProgressFailure renameFailure:
toolStripStatusLabel1.Text = $"Could not rename file: {renameFailure.Exception.Message}";
previewRow.DefaultCellStyle.BackColor = Color.LightPink;
return;
}
});
await Task.Run(() => RenameFiles(rename, progress));
toolStripProgressBar1.Value = toolStripProgressBar1.Maximum;
toolStripStatusLabel1.Text = "Done.";
}
private void TextBox1_TextChanged(object sender, EventArgs e)
{
UpdatePreviewDataGridView();
}
private void TextBox2_TextChanged(object sender, EventArgs e)
{
var textBox = (TextBox) sender;
if (string.IsNullOrEmpty(textBox.Text))
{
return;
}
try
{
_expression = new Regex(textBox.Text, _regexOptions);
foreach (DataGridViewRow rows in dataGridView1.Rows)
{
if (!_expression.IsMatch((string) rows.Cells[0].Value))
{
textBox.BackColor = Color.LightYellow;
break;
}
textBox.BackColor = Color.LightGreen;
}
UpdatePreviewDataGridView();
}
catch
{
_expression = null;
textBox.BackColor = Color.LightPink;
}
}
private void RemoveToolStripMenuItem_Click(object sender, EventArgs e)
{
var rows = dataGridView1.SelectedRows;
foreach (DataGridViewRow row in rows)
{
dataGridView1.Rows.RemoveAt(row.Index);
}
UpdatePreviewDataGridView();
}
private void DataGridView1_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
e.Effect = DragDropEffects.Copy;
return;
}
e.Effect = DragDropEffects.None;
}
private void DataGridView1_DragDrop(object sender, DragEventArgs e)
{
if (!e.Data.GetDataPresent(DataFormats.FileDrop))
{
return;
}
var files = (string[]) e.Data.GetData(DataFormats.FileDrop);
if (files.Length == 0)
{
return;
}
var exist = new HashSet<string>(
dataGridView1.Rows.OfType<DataGridViewRow>().Select(row => (string) row.Cells[0].Tag));
// Create row for each file.
foreach (var file in files)
{
var fileInfo = new FileInfo(file);
if (exist.Contains(fileInfo.FullName))
{
continue;
}
var replaceRowIndex = dataGridView1.Rows.Add();
var replaceRow = dataGridView1.Rows[replaceRowIndex];
replaceRow.Cells[0].Value = fileInfo.Name;
replaceRow.Cells[0].Tag = fileInfo.FullName;
replaceRow.Cells[1].Value = fileInfo.CreationTime;
replaceRow.Cells[2].Value = fileInfo.LastAccessTime;
exist.Add(fileInfo.FullName);
}
UpdatePreviewDataGridView();
// Sort added files.
dataGridView1.Sort(dataGridView1.Columns["Source"], ListSortDirection.Ascending);
dataGridView2.Sort(dataGridView2.Columns["Target"], ListSortDirection.Ascending);
}
private void DataGridView1_RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e)
{
}
private void CheckBox1_CheckedChanged(object sender, EventArgs e)
{
var checkBox = (CheckBox) sender;
switch (checkBox.CheckState)
{
case CheckState.Checked:
_regexOptions |= RegexOptions.IgnoreCase;
break;
case CheckState.Unchecked:
_regexOptions &= ~RegexOptions.IgnoreCase;
break;
}
}
private void DataGridView2_SelectionChanged(object sender, EventArgs e)
{
dataGridView2.ClearSelection();
}
private async void UpdateToolStripMenuItem_Click(object sender, EventArgs e)
{
// Manually check for updates, this will not show a ui
var result = await _sparkle.CheckForUpdatesQuietly();
var updates = result.Updates;
if (result.Status == UpdateStatus.UpdateAvailable)
{
// if update(s) are found, then we have to trigger the UI to show it gracefully
_sparkle.ShowUpdateNeededUI();
return;
}
MessageBox.Show("No updates available at this time.", "RegName", MessageBoxButtons.OK,
MessageBoxIcon.Asterisk,
MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly, false);
}
private void ComboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
var comboBox = (ComboBox) sender;
var mode = (string) comboBox.SelectedItem;
switch (mode)
{
case "Alpha Numeric":
_incrementMode = Helpers.IncrementMode.AlphaNumeric;
break;
case "Alpha":
_incrementMode = Helpers.IncrementMode.Alpha;
break;
case "Numeric":
_incrementMode = Helpers.IncrementMode.Numeric;
break;
}
UpdatePreviewDataGridView();
}
#endregion
#region Private Methods
private static void RenameFiles(IReadOnlyList<FileRename> files, IProgress<RenameProgress> progress)
{
var count = files.Count;
for (var i = 0; i < count; ++i)
{
try
{
var regName = files[i].New;
var oldFileInfo = new FileInfo(files[i].Old);
var newName = Path.Combine(oldFileInfo.DirectoryName, regName);
File.Move(oldFileInfo.FullName, newName);
var newFileInfo = new FileInfo(newName);
progress.Report(new RenameProgressSuccess(i, oldFileInfo, newFileInfo));
}
catch (Exception ex)
{
progress.Report(new RenameProgressFailure(i, ex));
}
}
}
private void UpdatePreviewDataGridView()
{
// Clear all rows.
dataGridView2.Rows.Clear();
var sequence = textBox3.Text;
foreach (DataGridViewRow replaceRow in dataGridView1.Rows)
{
var fileName = (string) replaceRow.Cells[0].Value;
// Add the row if it does not exist.
if (replaceRow.Index > dataGridView2.Rows.Count - 1)
{
var previewRowIndex = dataGridView2.Rows.Add();
var previewRow = dataGridView2.Rows[previewRowIndex];
previewRow.Cells[0].Value = replaceRow.Cells[0].Value;
previewRow.Cells[0].Tag = replaceRow.Cells[0].Tag;
}
var modifyRow = dataGridView2.Rows[replaceRow.Index];
if (modifyRow.Cells[0].Value == null)
{
continue;
}
// Perform the regular expression replacement.
if (_expression != null)
{
fileName = _expression.Replace((string) modifyRow.Cells[0].Value, textBox1.Text);
}
if (sequence.Length != 0)
{
fileName = fileName.Replace("{seq}", sequence);
// Increment the sequence.
sequence = Helpers.Increment(sequence, _incrementMode);
}
modifyRow.Cells[0].Value = fileName;
}
}
private void MainForm_Load(object sender, EventArgs e)
{
Utilities.WindowState.FormTracker.Track(this);
}
#endregion
}
}
Generated by GNU Enscript 1.6.5.90.