Widow – Rev 1

Subversion Repositories:
Rev:
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using Windows;

namespace Widow
{
    public partial class RuleEditForm : Form
    {
        #region Public Enums, Properties and Fields

        public Windows.Windows Windows { get; }

        public Form1 Form { get; set; }

        #endregion

        #region Constructors, Destructors and Finalizers

        public RuleEditForm(Form1 form1, Windows.Windows windows) : this(windows)
        {
            Form = form1;

            Form.WindowCreated += Form_WindowCreated;
            Form.WindowDestroyed += Form_WindowDestroyed;
        }

        public RuleEditForm(Windows.Windows windows) : this()
        {
            Windows = windows;

            foreach (var window in windows.Window)
            {
                windowRulesListBox.Items.Add(window);
            }
        }

        private RuleEditForm()
        {
            InitializeComponent();

            desktopWindowsListBox.DisplayMember = "Name";
            windowRulesListBox.DisplayMember = "Name";

            RefreshWindows();
        }

        /// <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)
            {
                Form.WindowCreated -= Form_WindowCreated;
                Form.WindowDestroyed -= Form_WindowDestroyed;

                components.Dispose();
            }

            base.Dispose(disposing);
        }

        #endregion

        #region Event Handlers

        private void Form_WindowDestroyed(object sender, WindowDestroyedEventArgs e)
        {
            if (string.IsNullOrEmpty(e.Name))
            {
                return;
            }

            var indices = new List<int>();
            for (var i = 0; i < desktopWindowsListBox.Items.Count; ++i)
            {
                if (((Window) desktopWindowsListBox.Items[i]).Name == e.Name)
                {
                    indices.Add(i);
                }
            }

            foreach (var index in indices)
            {
                desktopWindowsListBox.Items.RemoveAt(index);
            }
        }

        private void Form_WindowCreated(object sender, WindowCreatedEventArgs e)
        {
            if (string.IsNullOrEmpty(e.Name))
            {
                return;
            }

            var found = false;
            foreach (var window in desktopWindowsListBox.Items)
            {
                if (((Window) window).Name == e.Name)
                {
                    found = true;
                    break;
                }
            }

            if (found)
            {
                return;
            }

            if (Natives.GetWindowRect(e.Handle, out var rect))
            {
                var window = new Window(e.Name, rect.Top, rect.Left, rect.Right - rect.Left,
                    rect.Bottom - rect.Top);

                desktopWindowsListBox.Items.Add(window);
            }
        }

        private void WindowRulesListBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            var listBox = (ListBox) sender;

            if (listBox.SelectedIndex == -1)
            {
                WindowName.Text = string.Empty;
                WindowLeft.Text = string.Empty;
                WindowTop.Text = string.Empty;
                WindowWidth.Text = string.Empty;
                WindowHeight.Text = string.Empty;
                return;
            }

            var window = (Window) listBox.SelectedItem;

            if (window == null)
            {
                return;
            }

            WindowName.Text = window.Name;
            WindowLeft.Text = window.Left.ToString();
            WindowTop.Text = window.Top.ToString();
            WindowWidth.Text = window.Width.ToString();
            WindowHeight.Text = window.Height.ToString();
        }

        private void RefreshButton_Click(object sender, EventArgs e)
        {
            RefreshWindows();
        }

        private void RemoveButton_Click(object sender, EventArgs e)
        {
            var window = (Window) windowRulesListBox.SelectedItem;
            if (window == null)
            {
                return;
            }

            var index = -1;
            for (var i = 0; i < windowRulesListBox.Items.Count; ++i)
            {
                if (((Window) windowRulesListBox.Items[i]).Name == window.Name)
                {
                    index = i;
                    break;
                }
            }

            if (index == -1)
            {
                return;
            }

            windowRulesListBox.Items.RemoveAt(index);
            Windows.Window.Remove(window);
        }

        private void AddButton_Click(object sender, EventArgs e)
        {
            var window = (Window) desktopWindowsListBox.SelectedItem;
            if (window == null)
            {
                return;
            }

            var found = false;
            foreach (var windowRule in windowRulesListBox.Items)
            {
                if (((Window) windowRule).Name == window.Name)
                {
                    found = true;
                    break;
                }
            }

            if (found)
            {
                return;
            }

            windowRulesListBox.Items.Add(window);
            Windows.Window.Add(window);
        }

        private void OnWindowSettings_TextChanged(object sender, EventArgs e)
        {
            var selectedWindow = (Window) windowRulesListBox.SelectedItem;

            if (selectedWindow == null)
            {
                WindowName.Text = string.Empty;
                WindowLeft.Text = string.Empty;
                WindowTop.Text = string.Empty;
                WindowWidth.Text = string.Empty;
                WindowHeight.Text = string.Empty;

                return;
            }

            var textBox = (TextBox) sender;
            switch (textBox.Name)
            {
                case nameof(WindowName):
                    selectedWindow.Name = textBox.Text;
                    break;
                case nameof(WindowLeft):
                    if (int.TryParse(textBox.Text, out var left))
                    {
                        selectedWindow.Left = left;
                    }

                    break;
                case nameof(WindowTop):
                    if (int.TryParse(textBox.Text, out var top))
                    {
                        selectedWindow.Top = top;
                    }

                    break;
                case nameof(WindowWidth):
                    if (int.TryParse(textBox.Text, out var width))
                    {
                        selectedWindow.Width = width;
                    }

                    break;
                case nameof(WindowHeight):
                    if (int.TryParse(textBox.Text, out var height))
                    {
                        selectedWindow.Height = height;
                    }

                    break;
            }
        }

        #endregion

        #region Private Methods

        private void RefreshWindows()
        {
            foreach (var desktopWindow in Helpers.GetDesktopWindows())
            {
                if (string.IsNullOrEmpty(desktopWindow.Title))
                {
                    continue;
                }

                if (Natives.GetWindowRect(desktopWindow.Handle, out var rect))
                {
                    var window = new Window(desktopWindow.Title, rect.Top, rect.Left, rect.Right - rect.Left,
                        rect.Bottom - rect.Top);

                    var found = false;
                    foreach (var item in desktopWindowsListBox.Items)
                    {
                        if (((Window) item).Name == window.Name)
                        {
                            found = true;
                            break;
                        }
                    }

                    if (!found)
                    {
                        desktopWindowsListBox.Items.Add(window);
                    }
                }
            }
        }

        #endregion
    }
}

Generated by GNU Enscript 1.6.5.90.