protected override void KeyDown(object sender, KeyboardKeyEventArgs e)
        {
            TableWidget table = (TableWidget)widgets[view.tableIndex];

            if (e.Key == Key.Enter)
            {
                string curServer = Get(view.hashIndex) ?? "";
                if (table.Count >= 1 && curServer == "")
                {
                    widgets[view.hashIndex].Text = table.Get(0).Hash;
                    ConnectToServer(0, 0);
                }
                else if (curServer != "" &&
                         (selectedWidget == null || selectedWidget == widgets[view.tableIndex]))
                {
                    ConnectToServer(0, 0);
                }
            }
            else if (e.Key == Key.Up)
            {
                table.SetSelected(table.SelectedIndex - 1);
                table.NeedRedraw();
            }
            else if (e.Key == Key.Down)
            {
                table.SetSelected(table.SelectedIndex + 1);
                table.NeedRedraw();
            }
            else
            {
                base.KeyDown(sender, e);
            }
        }
        protected override void RedrawLastInput()
        {
            base.RedrawLastInput();
            if (curInput != widgets[view.hashIndex])
            {
                return;
            }
            TableWidget table = (TableWidget)widgets[view.tableIndex];

            table.SetSelected(widgets[view.hashIndex].Text);
            MarkPendingRedraw();
        }
        void FilterList()
        {
            if (curInput != widgets[view.searchIndex])
            {
                return;
            }

            TableWidget table = (TableWidget)widgets[view.tableIndex];

            table.FilterEntries(curInput.Text);
            table.SetSelected(table.SelectedHash);
            MarkPendingRedraw();
        }
        void CheckFetchStatus()
        {
            if (!game.Session.Done)
            {
                return;
            }
            fetchingList = false;

            view.RefreshText = game.Session.Exception == null ? "Refresh" : "&cFailed";
            Resize();

            // needed to ensure 'highlighted server hash' is over right entry after refresh
            TableWidget table = (TableWidget)widgets[view.tableIndex];

            table.SetSelected(widgets[view.hashIndex].Text);
            MarkPendingRedraw();
        }
        void CheckFetchStatus()
        {
            fetchTask.Tick();
            if (!fetchTask.Completed)
            {
                return;
            }

            if (fetchTask.Success)
            {
                game.Servers = fetchTask.Servers;
                FetchFlags(game);
            }

            view.RefreshText = fetchTask.Success ? "Refresh" : "&cFailed";
            fetchTask        = null;
            Resize();

            // needed to ensure 'highlighted server hash' is over right entry after refresh
            TableWidget table = (TableWidget)widgets[view.tableIndex];

            table.SetSelected(widgets[view.hashIndex].Text);
            MarkPendingRedraw();
        }