Horizon – Rev 1

Subversion Repositories:
Rev:
using System;
using System.Windows.Forms;
using Be.Windows.Forms;
using Horizon.Database;
using Horizon.Utilities;

namespace Horizon.Snapshots
{
    public partial class HexViewForm : Form
    {
        #region Public Events & Delegates

        public event EventHandler<SaveDataEventArgs> SaveData;

        #endregion

        #region Public Methods

        public void UpdateData(byte[] data)
        {
            hexBox1.InvokeIfRequired(hexBox =>
            {
                _originalData = (byte[])data.Clone();

                _dynamicByteProvider = new DynamicByteProvider(data);
                hexBox.ByteProvider = _dynamicByteProvider;
                hexBox.Refresh();
            });
        }

        #endregion

        #region Private Delegates, Events, Enums, Properties, Indexers and Fields

        private readonly SnapshotDatabase _snapshotDatabase;

        private DynamicByteProvider _dynamicByteProvider;

        private string _hash;

        private byte[] _originalData;

        #endregion

        #region Constructors, Destructors and Finalizers

        public HexViewForm()
        {
            InitializeComponent();
            Utilities.WindowState.FormTracker.Track(this);
        }

        public HexViewForm(SnapshotDatabase snapshotDatabase, string hash, byte[] data) : this()
        {
            _originalData = (byte[])data.Clone();
            _hash = hash;

            _snapshotDatabase = snapshotDatabase;
            _snapshotDatabase.SnapshotDataUpdate += SnapshotDatabaseSnapshotDataUpdate;

            _dynamicByteProvider = new DynamicByteProvider(data);
            hexBox1.ByteProvider = _dynamicByteProvider;
        }

        /// <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();
            }

            _snapshotDatabase.SnapshotDataUpdate -= SnapshotDatabaseSnapshotDataUpdate;

            base.Dispose(disposing);
        }

        #endregion

        #region Event Handlers

        private void SnapshotDatabaseSnapshotDataUpdate(object sender, SnapshotDataUpdateEventArgs e)
        {
            switch (e)
            {
                case SnapshotDataUpdateSuccessEventArgs snapshotDataUpdateSuccessEventArgs:
                    _hash = snapshotDataUpdateSuccessEventArgs.NewHash;

                    statusStrip1.InvokeIfRequired(statusStrip =>
                    {
                        toolStripProgressBar1.Value = toolStripProgressBar1.Maximum;
                        toolStripStatusLabel1.Text = "Data saved.";
                    });
                    break;
                case SnapshotDataUpdateFailureEventArgs _:
                    statusStrip1.InvokeIfRequired(statusStrip =>
                    {
                        toolStripProgressBar1.Value = toolStripProgressBar1.Minimum;
                        toolStripStatusLabel1.Text = "Could not save data.";
                    });
                    break;
            }
        }

        private void SaveToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (_dynamicByteProvider.HasChanges())
            {
                _dynamicByteProvider.ApplyChanges();

                statusStrip1.InvokeIfRequired(statusStrip =>
                {
                    toolStripProgressBar1.Value = toolStripProgressBar1.Minimum;
                    toolStripStatusLabel1.Text = "Saving.";
                });

                SaveData?.Invoke(this, new SaveDataEventArgs(_hash, _dynamicByteProvider.Bytes.ToArray()));
            }
        }

        private void ReloadToolStripMenuItem_Click(object sender, EventArgs e)
        {
            hexBox1.InvokeIfRequired(hexBox =>
            {
                _dynamicByteProvider = new DynamicByteProvider(_originalData);
                hexBox.ByteProvider = _dynamicByteProvider;
                hexBox.Refresh();
            });
        }

        #endregion
    }
}

Generated by GNU Enscript 1.6.5.90.