private void Window_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            try
            {
                e.Handled = true;

                ListView focussedLV = null;

                if (Keyboard.FocusedElement is ListViewItem) focussedLV = ((FrameworkElement)Keyboard.FocusedElement).GetAncestorOfType<ListView>();

                var settings = HyperSearchSettings.Instance().Input;
                var elementWithFocus = Keyboard.FocusedElement as UIElement;

                DependencyObject listViewItem = null;

                if (listView.SelectedIndex >= 0)
                    listViewItem = listView.ItemContainerGenerator.ContainerFromIndex(listView.SelectedIndex);

                var ctrl = FindISettingsControls(listViewItem).FirstOrDefault();

                SettingsListViewItem item = listView.SelectedItem as SettingsListViewItem;
                SettingTypeAttribute attrib = null;

                if (item != null) attrib = item.SettingType;

                var actionKey = new KeyList(Key.Enter);

                if (settings.Action != null && settings.Action.Keys.Count > 0) actionKey = settings.Action;

                if (actionKey.Is(e.Key) && attrib != null)
                {
                    if (ctrl != null)
                    {
                        if (ctrl is TrueFalse)
                        {
                            ((TrueFalse)ctrl).IsChecked = !((TrueFalse)ctrl).IsChecked;
                            item.Property.SetValue(item.ParentObject, ((TrueFalse)ctrl).IsChecked, null);
                        }
                        else if (ctrl is MultiOption)
                        {
                            if (attrib != null)
                            {
                                if (attrib.Type == SettingsType.FolderPath)
                                {
                                    var dlg = new System.Windows.Forms.FolderBrowserDialog();

                                    if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                                    {
                                        item.Value = dlg.SelectedPath;
                                    }

                                }
                                else if (attrib.Type == SettingsType.FilePath)
                                {
                                    var dlg = new System.Windows.Forms.OpenFileDialog();

                                    dlg.Multiselect = false;
                                    dlg.Filter = "RocketLauncher|Rocketlauncher.exe|All filers (*.*)|*.*";

                                    if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                                    {
                                        item.Value = dlg.FileName;
                                    }
                                }
                                else if (attrib.ActionType != SettingActionType.None)
                                {
                                    HandleActionType(attrib);
                                }
                                else // default
                                {
                                    if (attrib.EnumSource != null)
                                    {
                                        //var items = attrib.MutliValueCsv.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
                                        var items = Enum.GetNames(attrib.EnumSource);

                                        MultiOptionSelector win = new MultiOptionSelector();

                                        win.SetItemSource(items);

                                        if (Win.Modal(win, this))
                                        {
                                            if (win.SelectedItem != null)
                                            {
                                                var o = (TextInputType)Enum.Parse(attrib.EnumSource, win.SelectedItem.ToString());

                                                if (o == TextInputType.Orb)
                                                {
                                                    Alert.ShowExclamation("Orb type not yet supported", secondsBeforeWeMayClose:0);
                                                    return;
                                                }

                                                item.Value = win.SelectedItem.ToString();
                                                item.Property.SetValue(item.ParentObject, o, null);
                                            }
                                        }
                                    }
                                }

                            }
                        }
                        else
                        {
                            ctrl.IsActive = !ctrl.IsActive;
                        }
                    }
                    else
                    {
                        if (attrib.Type == SettingsType.Action)
                        {
                            HandleActionType(attrib);
                        }
                    }
                }
                else if (settings.Clear.Is(e.Key))
                {
                    if (ctrl == null) return;

                    ctrl.ResetValue();
                    item.Property.SetValue(item.ParentObject, null, null);
                }
                else if (settings.Exit.Is(e.Key))
                {
                    this.Close();
                }
                else if (settings.Down.Is(e.Key))
                {
                    if (focussedLV == sectionListView)
                    {
                        listView.SelectAndFocusItem();
                    }
                    else
                    {
                        if (listView.SelectedIndex >= listView.Items.Count - 1)
                        {
                            listView.SelectedIndex = 0;
                            listView.ScrollIntoView(listView.SelectedItem);
                            listView.SelectAndFocusItem(0);
                        }
                        else
                        {
                            elementWithFocus.MoveFocus(new TraversalRequest(FocusNavigationDirection.Down));
                        }
                    }
                }
                else if (settings.Up.Is(e.Key))
                {
                    if (listView.SelectedIndex == 0)
                    {
                        listView.SelectedIndex = listView.Items.Count - 1;
                        listView.ScrollIntoView(listView.SelectedItem);
                        listView.SelectAndFocusItem(listView.Items.Count - 1);
                    }
                    else
                    {
                        elementWithFocus.MoveFocus(new TraversalRequest(FocusNavigationDirection.Up));
                    }
                }
                else if (settings.Left.Is(e.Key))
                {
                    if (sectionListView.SelectedIndex >= 1)
                    {
                        sectionListView.SelectedIndex = sectionListView.SelectedIndex - 1;
                        sectionListView.ScrollIntoView(sectionListView.SelectedItem);
                    }
                    else
                    {
                        sectionListView.SelectAndFocusItem(sectionListView.Items.Count - 1);
                    }
                }
                else if (settings.Right.Is(e.Key))
                {
                    if (sectionListView.SelectedIndex < sectionListView.Items.Count - 1)
                    {
                        sectionListView.SelectedIndex = sectionListView.SelectedIndex + 1;
                        sectionListView.ScrollIntoView(sectionListView.SelectedItem);
                    }
                    else
                    {
                        sectionListView.SelectAndFocusItem(0);
                    }
                }
            }
            catch (Exception ex)
            {
                ErrorHandler.HandleException(ex);
            }
        }
        public OnScreenKeyboardButton ProcessKey(KeyList keypress)
        {
            if (this.SelectedOrb == null) return null;

            // check if an Orb button was pressed
            var matchingOrbButton = this.SelectedOrb.FindVisualChildren<OnScreenKeyboardButton>().FirstOrDefault(b =>
            {
                Key key;

                if (Enum.TryParse<Key>(b.Key, out key))
                {
                    return keypress.Is(key);
                }
                return false;
            });

            if (matchingOrbButton != null)
            {
                return matchingOrbButton;
            }

            return null;
        }