public ConnectionDialog()
        {
            InitializeComponent();

            RemoveButton.Click += (sender, args) =>
            {
                var input = InputsListView.SelectedItem as IJsonInput;

                if (input == null)
                {
                    return;
                }

                _jsonInputs.Remove(input);
            };

            NewTextMenuItem.MouseUp += (sender, args) =>
            {
                var dialog = new AddNewTextSourceDialog()
                {
                    Owner = this
                };
                var result = dialog.ShowDialog();

                if (!(result.HasValue && result.Value))
                {
                    return;
                }

                _jsonInputs.Add(dialog.Input);
            };

            NewFileMenuItem.MouseUp += (sender, args) =>
            {
                var dialog = new AddNewFileSourceDialog()
                {
                    Owner = this
                };
                var result = dialog.ShowDialog();

                if (!(result.HasValue && result.Value))
                {
                    return;
                }

                _jsonInputs.Add(dialog.Input);
            };

            NewFolderMenuItem.MouseUp += (sender, args) =>
            {
                var dialog = new AddNewFolderSourceDialog {
                    Owner = this
                };
                var result = dialog.ShowDialog();

                if (!(result.HasValue && result.Value))
                {
                    return;
                }

                _jsonInputs.Add(dialog.Input);
            };

            NewWebMenuItem.MouseUp += (sender, args) =>
            {
                var dialog = new AddNewUrlSourceDialog()
                {
                    Owner = this
                };
                var result = dialog.ShowDialog();

                if (!(result.HasValue && result.Value))
                {
                    return;
                }

                _jsonInputs.Add(dialog.Input);
            };

            foreach (
                var panel in
                new[]
            {
                (DockPanel)NewFileMenuItem.Parent, (DockPanel)NewFolderMenuItem.Parent,
                (DockPanel)NewWebMenuItem.Parent, (DockPanel)NewTextMenuItem.Parent
            })
            {
                var p = panel;
                p.MouseEnter += (sender, args) => p.Background = _highlightedBrush;
                p.MouseLeave += (sender, args) => p.Background = _standardBrush;
            }

            CancelButton.Click += (sender, args) => DialogResult = false;

            OkButton.Click += (sender, args) =>
            {
                var jss = new JsonSerializerSettings {
                    TypeNameHandling = TypeNameHandling.All
                };
                var inputDefs = JsonConvert.SerializeObject(_jsonInputs.ToList(), jss);

                _connectionInfo.DisplayName = ConnectionNameTextBox.Text;
                _connectionInfo.DriverData.SetElementValue("inputDefs", inputDefs);

                DialogResult = true;
            };

            InputsListView.MouseDoubleClick += (sender, args) =>
            {
                var selectedItem = InputsListView.SelectedItem;

                if (selectedItem == null)
                {
                    return;
                }

                if (selectedItem is JsonTextInput)
                {
                    var jti    = selectedItem as JsonTextInput;
                    var dialog = new AddNewTextSourceDialog(jti)
                    {
                        Owner = this
                    };
                    dialog.ShowDialog();
                }
                else if (selectedItem is JsonUrlInput)
                {
                    var jui    = selectedItem as JsonUrlInput;
                    var dialog = new AddNewUrlSourceDialog(jui)
                    {
                        Owner = this
                    };
                    dialog.ShowDialog();
                }
                else if (selectedItem is JsonFileInput)
                {
                    var jfi = selectedItem as JsonFileInput;
                    if (jfi.IsDirectory)
                    {
                        var dialog = new AddNewFolderSourceDialog(jfi)
                        {
                            Owner = this
                        };
                        dialog.ShowDialog();
                    }
                    else
                    {
                        var dialog = new AddNewFileSourceDialog(jfi)
                        {
                            Owner = this
                        };
                        dialog.ShowDialog();
                    }
                }
            };

            Action checkCanOk     = () => OkButton.IsEnabled = _jsonInputs.Count > 0;
            Action checkCanRemove = () => RemoveButton.IsEnabled = InputsListView.SelectedItem != null;

            _jsonInputs.CollectionChanged   += (sender, args) => checkCanOk();
            InputsListView.SelectionChanged += (sender, args) => checkCanRemove();

            InputsListView.ItemsSource = _jsonInputs;
            checkCanOk();
            checkCanRemove();

            ConnectionNameTextBox.Focus();
        }
        public ConnectionDialog()
        {
            InitializeComponent();

            RemoveButton.Click += (sender, args) =>
            {
                var input = InputsListView.SelectedItem as IJsonInput;

                if (input == null)
                    return;

                _jsonInputs.Remove(input);
            };

            NewTextMenuItem.MouseUp += (sender, args) =>
            {
                var dialog = new AddNewTextSourceDialog() { Owner = this };
                var result = dialog.ShowDialog();

                if (!(result.HasValue && result.Value))
                    return;

                _jsonInputs.Add(dialog.Input);
            };

            NewFileMenuItem.MouseUp += (sender, args) =>
            {
                var dialog = new AddNewFileSourceDialog() { Owner = this };
                var result = dialog.ShowDialog();

                if (!(result.HasValue && result.Value))
                    return;

                _jsonInputs.Add(dialog.Input);
            };

            NewFolderMenuItem.MouseUp += (sender, args) =>
            {
                var dialog = new AddNewFolderSourceDialog { Owner = this };
                var result = dialog.ShowDialog();

                if (!(result.HasValue && result.Value))
                    return;

                _jsonInputs.Add(dialog.Input);
            };

            NewWebMenuItem.MouseUp += (sender, args) =>
            {
                var dialog = new AddNewUrlSourceDialog() { Owner = this };
                var result = dialog.ShowDialog();

                if (!(result.HasValue && result.Value))
                    return;

                _jsonInputs.Add(dialog.Input);
            };

            foreach (
                var panel in
                    new[]
                    {
                        (DockPanel) NewFileMenuItem.Parent, (DockPanel) NewFolderMenuItem.Parent,
                        (DockPanel) NewWebMenuItem.Parent, (DockPanel) NewTextMenuItem.Parent
                    })
            {
                var p = panel;
                p.MouseEnter += (sender, args) => p.Background = _highlightedBrush;
                p.MouseLeave += (sender, args) => p.Background = _standardBrush;
            }

            CancelButton.Click += (sender, args) => DialogResult = false;

            OkButton.Click += (sender, args) =>
            {
                var jss = new JsonSerializerSettings {TypeNameHandling = TypeNameHandling.All};
                var inputDefs = JsonConvert.SerializeObject(_jsonInputs.ToList(), jss);

                _connectionInfo.DisplayName = ConnectionNameTextBox.Text;
                _connectionInfo.DriverData.SetElementValue("inputDefs", inputDefs);

                DialogResult = true;
            };

            InputsListView.MouseDoubleClick += (sender, args) =>
            {
                var selectedItem = InputsListView.SelectedItem;

                if (selectedItem == null)
                    return;

                if (selectedItem is JsonTextInput)
                {
                    var jti = selectedItem as JsonTextInput;
                    var dialog = new AddNewTextSourceDialog(jti) { Owner = this };
                    dialog.ShowDialog();
                }
                else if (selectedItem is JsonUrlInput)
                {
                    var jui = selectedItem as JsonUrlInput;
                    var dialog = new AddNewUrlSourceDialog(jui) { Owner = this };
                    dialog.ShowDialog();
                }
                else if (selectedItem is JsonFileInput)
                {
                    var jfi = selectedItem as JsonFileInput;
                    if (jfi.IsDirectory)
                    {
                        var dialog = new AddNewFolderSourceDialog(jfi) { Owner = this };
                        dialog.ShowDialog();
                    }
                    else
                    {
                        var dialog = new AddNewFileSourceDialog(jfi) { Owner = this };
                        dialog.ShowDialog();
                    }
                }
            };

            Action checkCanOk = () => OkButton.IsEnabled = _jsonInputs.Count > 0;
            Action checkCanRemove = () => RemoveButton.IsEnabled = InputsListView.SelectedItem != null;

            _jsonInputs.CollectionChanged += (sender, args) => checkCanOk();
            InputsListView.SelectionChanged += (sender, args) => checkCanRemove();

            InputsListView.ItemsSource = _jsonInputs;
            checkCanOk();
            checkCanRemove();

            ConnectionNameTextBox.Focus();
        }