using System; using System.ComponentModel; using System.Configuration; using System.Globalization; using System.IO; using System.Threading.Tasks; using System.Windows.Forms; using AutoUpdaterDotNET; using Widow.Properties; using Widow.Serialization; namespace Widow { public partial class MainForm : Form { #region Public Events & Delegates public event EventHandler WindowCreated; public event EventHandler WindowDestroyed; #endregion #region Public Enums, Properties and Fields public Windows.Windows Windows { get; set; } public RuleEditForm RuleEditForm { get; set; } public WindowManipulation WindowManipulation { get; set; } public AboutForm AboutForm { get; set; } public LogForm LogForm { get; private set; } #endregion #region Constructors, Destructors and Finalizers public MainForm() { InitializeComponent(); AutoUpdater.Start("http://widow.grimore.org/update/update.xml"); // Upgrade settings if required. if (!ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal).HasFile) { Settings.Default.Upgrade(); } // Bind to settings changed event. Settings.Default.SettingsLoaded += Default_SettingsLoaded; Settings.Default.SettingsSaving += Default_SettingsSaving; Settings.Default.PropertyChanged += Default_PropertyChanged; Natives.RegisterShellHookWindow(Handle); WindowManipulation = new WindowManipulation(Settings.Default, this); LoadWindows().ContinueWith(task => { WindowManipulation.AddWindows(Windows); }); } /// /// 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) { Settings.Default.SettingsLoaded -= Default_SettingsLoaded; Settings.Default.SettingsSaving -= Default_SettingsSaving; Settings.Default.PropertyChanged -= Default_PropertyChanged; components.Dispose(); } base.Dispose(disposing); } #endregion #region Private Overrides protected override void WndProc(ref Message m) { var handle = m.LParam; var windowName = Helpers.GetWindowTitle(handle); switch (m.WParam.ToInt32()) { case (int) Natives.WM.HSHELL_WINDOWCREATED: WindowCreated?.Invoke(this, new WindowCreatedEventArgs(windowName, handle)); break; case (int) Natives.WM.HSHELL_WINDOWDESTROYED: WindowDestroyed?.Invoke(this, new WindowDestroyedEventArgs(windowName, handle)); break; } base.WndProc(ref m); } #endregion #region Event Handlers private static void Default_PropertyChanged(object sender, PropertyChangedEventArgs e) { Settings.Default.Save(); } private static void Default_SettingsSaving(object sender, CancelEventArgs e) { } private static void Default_SettingsLoaded(object sender, SettingsLoadedEventArgs e) { } private void NewToolStripMenuItem_Click(object sender, EventArgs e) { if (RuleEditForm != null) { return; } RuleEditForm = new RuleEditForm(this, Windows); RuleEditForm.Closed += RuleEditForm_Closed; RuleEditForm.Show(); } private async void RuleEditForm_Closed(object sender, EventArgs e) { RuleEditForm.Closed -= RuleEditForm_Closed; RuleEditForm.Dispose(); RuleEditForm = null; if (!Directory.Exists(Constants.UserApplicationDirectory)) { Directory.CreateDirectory(Constants.UserApplicationDirectory); } switch (await WindowsSerialization.Serialize(Windows, Constants.WindowsSettingsFile)) { case SerializationSuccess serializationSuccess: if (LogForm != null) { LogForm.InvokeIfRequired(form => { form.logTextBox.Text += "Windows saved." + Environment.NewLine; }); } break; case SerializationFailure serializationFailure: if (LogForm != null) { LogForm.InvokeIfRequired(form => { form.logTextBox.Text += "Failed to save windows: " + serializationFailure.Exception.Message + Environment.NewLine; }); } break; } } private void ExitToolStripMenuItem_Click(object sender, EventArgs e) { Close(); Environment.Exit(0); } private void LaunchOnBootToolStripMenuItem_CheckedChanged(object sender, EventArgs e) { Settings.Default.LaunchOnBoot = ((ToolStripMenuItem) sender).Checked; LaunchOnBoot.Set(Settings.Default.LaunchOnBoot); } private void OnWindowCreateToolStripMenuItem_CheckedChanged(object sender, EventArgs e) { Settings.Default.OnWindowCreate = ((ToolStripMenuItem) sender).Checked; WindowManipulation.OnWindowCreate = Settings.Default.OnWindowCreate; } private void AboutToolStripMenuItem_Click(object sender, EventArgs e) { // Show the about form. AboutForm = new AboutForm(); AboutForm.Show(); } private async void ApplyNowToolStripMenuItem_Click(object sender, EventArgs e) { await WindowManipulation.Apply(); } private void OnEveryToolStripMenuItem_CheckedChanged(object sender, EventArgs e) { var toolStripMenuItem = (ToolStripMenuItem) sender; if (!int.TryParse(toolStripTextBox1.Text, out var time)) { return; } Settings.Default.ApplyEveryTimeEnabled = toolStripMenuItem.Checked; Settings.Default.ApplyEveryTime = time.ToString(CultureInfo.InvariantCulture); WindowManipulation.ApplyEveryTime = time; WindowManipulation.ApplyEveryTimeEnabled = toolStripMenuItem.Checked; } private void NotifyIcon1_DoubleClick(object sender, EventArgs e) { if (RuleEditForm != null) { return; } RuleEditForm = new RuleEditForm(this, Windows); RuleEditForm.Closed += RuleEditForm_Closed; RuleEditForm.Show(); } private async void NotifyIcon1_Click(object sender, EventArgs e) { await WindowManipulation.Apply(); } private void ShowLogToolStripMenuItem_Click(object sender, EventArgs e) { if (LogForm != null) { return; } LogForm = new LogForm(); LogForm.Closed += LogForm_Closed; LogForm.Show(); } private void LogForm_Closed(object sender, EventArgs e) { LogForm.Closed -= LogForm_Closed; LogForm.Dispose(); LogForm = null; } #endregion #region Private Methods private async Task LoadWindows() { if (!Directory.Exists(Constants.UserApplicationDirectory)) { Directory.CreateDirectory(Constants.UserApplicationDirectory); } switch (await WindowsSerialization.Deserialize(Constants.WindowsSettingsFile)) { case SerializationSuccess serializationSuccess: Windows = serializationSuccess.Windows; if (LogForm != null) { LogForm.InvokeIfRequired(form => { form.logTextBox.Text += "Windows loaded." + Environment.NewLine; }); } break; case SerializationFailure serializationFailure: Windows = new Windows.Windows(); if (LogForm != null) { LogForm.InvokeIfRequired(form => { form.logTextBox.Text += "Failed to load windows: " + serializationFailure.Exception.Message + Environment.NewLine; }); } break; } } #endregion } }