RegName – Rev 2

Subversion Repositories:
Rev:
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.