예제 #1
0
        /// <summary>
        /// Shared preview key down logic between the game terminal and it's back buffer.  If they have focus this
        /// will implement page up and page down so that the back buffer will show all of the paging, once it gets
        /// to the bottom it will disappear.  The escape key will send the focus back to the input box hiding the
        /// back buffer.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void GameTerminal_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            switch (e.Key)
            {
            case Key.PageUp:
                e.Handled = true;

                // Back buffer is collapsed, show it, scroll to the bottom of it.
                if (GameBackBufferTerminal.Visibility == System.Windows.Visibility.Collapsed)
                {
                    GameBackBufferTerminal.ScrollToLastLine();
                    GameBackBufferTerminal.Visibility = System.Windows.Visibility.Visible;

                    // Since the height of this changed scroll it to the bottom.
                    GameTerminal.ScrollToLastLine();
                    break;
                }

                // If it was already visible, then we PageUp()
                GameBackBufferTerminal.PageUp();

                break;

            case Key.PageDown:
                e.Handled = true;

                // Back buffer is visible then execute a PageDown()
                if (GameBackBufferTerminal.Visibility == System.Windows.Visibility.Visible)
                {
                    GameBackBufferTerminal.PageDown();
                }

                // Now, if the last line in the back buffer is visible then we can just collapse the
                // back buffer because the main terminal shows everything at the end.  Set the focus
                // back to the input box if it's not already there.
                if (GameBackBufferTerminal.IsLastLineVisible())
                {
                    GameBackBufferTerminal.Visibility = System.Windows.Visibility.Collapsed;
                    TextInput.Editor.Focus();
                }

                break;

            case Key.Escape:
                // Collapse the back buffer so it hides it and reclaims the space for the main terminal.
                GameBackBufferTerminal.Visibility = System.Windows.Visibility.Collapsed;

                // Reset the input history to the default position and clear the text in the input box.
                Interp.InputHistoryPosition = -1;
                TextInput.Editor.Text       = "";
                TextInput.Editor.Focus();

                break;
            }
        }
예제 #2
0
        /// <summary>
        /// The PreviewKeyDown event for the input text box used to setup special behavior from that box.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Editor_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            // So they key's for macros aren't entered into the text box.
            foreach (var item in App.Settings.ProfileSettings.MacroList)
            {
                if ((int)e.Key == item.Key)
                {
                    e.Handled = true;
                    return;
                }
            }

            switch (e.Key)
            {
            case Key.Enter:
                e.Handled = true;

                // When a command is entered into the input box.
                // Make sure the newline didn't make it into the text input, then select all in the box so it can be cleared quickly.
                TextInput.Editor.Text = TextInput.Editor.Text.Replace("\r", "").Replace("\n", "");
                TextInput.Editor.SelectAll();
                Interp.Send(TextInput.Editor.Text);

                // If the user wants the input box to clear after a command, make it so.
                if (App.Settings.AvalonSettings.InputBoxClearAfterCommand)
                {
                    TextInput.Editor.Text = "";
                }

                // Set the history count to the end
                Interp.InputHistoryPosition = -1;

                break;

            case Key.Up:
                e.Handled = false;

                // If the drop down is open allow the up and down keys to work for it, not history.
                if (TextInput.IsDropDownOpen)
                {
                    return;
                }

                //  Go to the previous item in the history.
                TextInput.Editor.Text            = Interp.InputHistoryNext();
                TextInput.Editor.SelectionStart  = (TextInput.Editor.Text.Length);
                TextInput.Editor.SelectionLength = 0;

                break;

            case Key.Down:
                e.Handled = false;

                // If the drop down is open allow the up and down keys to work for it, not history.
                if (TextInput.IsDropDownOpen)
                {
                    return;
                }

                //  Go to the next item in the history.
                TextInput.Editor.Text            = Interp.InputHistoryPrevious();
                TextInput.Editor.SelectionStart  = (TextInput.Editor.Text.Length);
                TextInput.Editor.SelectionLength = 0;

                break;

            case Key.PageUp:
                e.Handled = true;

                // Back buffer is collapsed, show it, scroll to the bottom of it.
                if (GameBackBufferTerminal.Visibility == System.Windows.Visibility.Collapsed)
                {
                    GameBackBufferTerminal.ScrollToLastLine();
                    GameBackBufferTerminal.Visibility = System.Windows.Visibility.Visible;

                    // Since the height of this changed scroll it to the bottom.
                    GameTerminal.ScrollToLastLine();
                    break;
                }

                // If it was already visible, then we PageUp()
                GameBackBufferTerminal.PageUp();

                break;

            case Key.PageDown:
                e.Handled = true;

                // Back buffer is visible then execute a PageDown()
                if (GameBackBufferTerminal.Visibility == System.Windows.Visibility.Visible)
                {
                    GameBackBufferTerminal.PageDown();
                }

                // Now, if the last line in the back buffer is visible then we can just collapse the
                // back buffer because the main terminal shows everything at the end.
                if (GameBackBufferTerminal.IsLastLineVisible())
                {
                    GameBackBufferTerminal.Visibility = System.Windows.Visibility.Collapsed;
                    TextInput.Editor.Focus();
                }

                break;

            case Key.Oem5:
            case Key.OemBackslash:
                TextInput.Editor.SelectAll();
                e.Handled = true;
                break;

            case Key.Escape:
                // Collapse the back buffer so it hides it and reclaims the space for the main terminal.
                GameBackBufferTerminal.Visibility = System.Windows.Visibility.Collapsed;

                // Reset the input history to the default position and clear the text in the input box.
                Interp.InputHistoryPosition = -1;
                TextInput.Editor.Text       = "";
                break;
            }
        }
예제 #3
0
        /// <summary>
        /// The PreviewKeyDown event for the input text box used to setup special behavior from that box.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Editor_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            // So they key's for macros aren't entered into the text box.
            foreach (var item in App.Settings.ProfileSettings.MacroList)
            {
                if ((int)e.Key == item.Key)
                {
                    e.Handled = true;
                    return;
                }
            }

            switch (e.Key)
            {
            case Key.Enter:
                e.Handled = true;

                // When a command is entered into the input box.
                // Make sure the newline didn't make it into the text input, then select all in the box so it can be cleared quickly.
                TextInput.Editor.Text = TextInput.Editor.Text.RemoveLineEndings();
                TextInput.Editor.SelectAll();
                Interp.Send(TextInput.Editor.Text);

                // If the user wants the input box to clear after a command, make it so.
                if (App.Settings.AvalonSettings.InputBoxClearAfterCommand)
                {
                    TextInput.Editor.Text = "";
                }

                // Set the history count to the end
                Interp.InputHistoryPosition = -1;

                break;

            case Key.Up:
                e.Handled = false;

                // If the drop down is open allow the up and down keys to work for it, not history.
                if (TextInput.IsDropDownOpen)
                {
                    return;
                }

                //  Go to the previous item in the history.
                TextInput.Editor.Text            = Interp.InputHistoryNext();
                TextInput.Editor.SelectionStart  = (TextInput.Editor.Text.Length);
                TextInput.Editor.SelectionLength = 0;

                break;

            case Key.Down:
                e.Handled = false;

                // If the drop down is open allow the up and down keys to work for it, not history.
                if (TextInput.IsDropDownOpen)
                {
                    return;
                }

                //  Go to the next item in the history.
                TextInput.Editor.Text            = Interp.InputHistoryPrevious();
                TextInput.Editor.SelectionStart  = (TextInput.Editor.Text.Length);
                TextInput.Editor.SelectionLength = 0;

                break;

            case Key.PageUp:
                e.Handled = true;

                // Back buffer is collapsed, show it, scroll to the bottom of it.
                if (GameBackBufferTerminal.Visibility == System.Windows.Visibility.Collapsed)
                {
                    GameBackBufferTerminal.Visibility = System.Windows.Visibility.Visible;

                    // Scroll via the vertical offset, if not done for some reason the first time the window is shown
                    // it will be at the top.
                    GameBackBufferTerminal.ScrollToLastLine(true);

                    // Since the height of this changed scroll it to the bottom.
                    GameTerminal.ScrollToLastLine();
                    break;
                }

                // If it was already visible, then we PageUp()
                GameBackBufferTerminal.PageUp();

                break;

            case Key.PageDown:
                e.Handled = true;

                // Back buffer is visible then execute a PageDown()
                if (GameBackBufferTerminal.Visibility == System.Windows.Visibility.Visible)
                {
                    GameBackBufferTerminal.PageDown();
                }

                // Now, if the last line in the back buffer is visible then we can just collapse the
                // back buffer because the main terminal shows everything at the end.
                if (GameBackBufferTerminal.IsLastLineVisible())
                {
                    GameBackBufferTerminal.Visibility = System.Windows.Visibility.Collapsed;
                    TextInput.Editor.Focus();
                }

                break;

            case Key.Oem5:
            case Key.OemBackslash:
                TextInput.Editor.SelectAll();
                e.Handled = true;
                break;

            case Key.Escape:
                // Collapse the back buffer so it hides it and reclaims the space for the main terminal.
                GameBackBufferTerminal.Visibility = System.Windows.Visibility.Collapsed;

                // Setting to see if the comm windows should scroll to the bottom on escape.
                if (App.Settings.AvalonSettings.EscapeScrollsAllTerminalsToBottom)
                {
                    Terminal1.ScrollToLastLine();
                    Terminal2.ScrollToLastLine();
                    Terminal3.ScrollToLastLine();
                    GameTerminal.ScrollToLastLine();
                }

                // Hide the auto completion box if it's open.
                if (PopupAutoComplete.IsOpen)
                {
                    PopupAutoComplete.IsOpen = false;
                }

                // Reset the input history to the default position and clear the text in the input box.
                Interp.InputHistoryPosition = -1;
                TextInput.Editor.Text       = "";
                break;

            case Key.Tab:
                // Auto Complete from command history and/or aliases.
                e.Handled = true;
                string command = null;
                bool   ctrl    = ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control);
                bool   shift   = ((Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift);

                // If control is down search aliases, if it's not search the history
                if (ctrl && !string.IsNullOrWhiteSpace(TextInput.Editor.Text))
                {
                    // Aliases
                    var alias = App.Settings.ProfileSettings.AliasList.FirstOrDefault(x => x.AliasExpression.StartsWith(TextInput.Editor.Text, System.StringComparison.OrdinalIgnoreCase));

                    if (alias != null)
                    {
                        command = alias.AliasExpression;
                    }

                    // If the alias isn't null, put it in the text editor and leave, we're done.  If it is, we'll go ahead and
                    // continue on to the history as a fall back.
                    if (!string.IsNullOrWhiteSpace(command))
                    {
                        TextInput.Editor.Text           = command;
                        TextInput.Editor.SelectionStart = TextInput.Editor.Text.Length;
                        return;
                    }
                }

                // If shift is down search past input data, if it's not search the history
                if (shift && App.Settings.AvalonSettings.AutoCompleteWord && !string.IsNullOrWhiteSpace(TextInput.Editor.Text))
                {
                    try
                    {
                        TextInput.Editor.SelectCurrentWord();
                        string word = TextInput.Editor.SelectedText;

                        App.MainWindow.PopupAutoComplete.IsOpen           = false;
                        App.MainWindow.PopupAutoComplete.PlacementTarget  = TextInput.Editor;
                        App.MainWindow.PopupAutoComplete.Height           = 200;
                        App.MainWindow.PopupAutoComplete.Width            = 200;
                        App.MainWindow.PopupAutoComplete.HorizontalOffset = App.MainWindow.PopupAutoComplete.Width;
                        App.MainWindow.PopupAutoComplete.VerticalOffset   = -200;
                        App.MainWindow.PopupAutoComplete.IsOpen           = true;

                        // Get a list of words that match, then reverse it so the newest entries come first.
                        var list = Interp.InputAutoCompleteKeywords.Where(x => x.StartsWith(word, StringComparison.OrdinalIgnoreCase)).Reverse();
                        PopupAutoCompleteListBox.ItemsSource = list;

                        // Select the first item in the list, then focus the list.
                        PopupAutoCompleteListBox.Focus();

                        if (PopupAutoCompleteListBox.Items.Count > 0)
                        {
                            PopupAutoCompleteListBox.SelectedIndex = 0;
                        }
                    }
                    catch (Exception ex)
                    {
                        App.Conveyor.EchoLog(ex.Message, LogType.Error);
                    }

                    return;
                }

                // If there is no input in the text editor, get the last entered command otherwise search the input
                // history for the command (searching the latest entries backwards).
                if (string.IsNullOrWhiteSpace(TextInput.Editor.Text))
                {
                    command = Interp.InputHistory.Last();
                }
                else
                {
                    command = Interp.InputHistory.FindLast(x => x.StartsWith(TextInput.Editor.Text, System.StringComparison.OrdinalIgnoreCase));
                }

                if (!string.IsNullOrWhiteSpace(command))
                {
                    TextInput.Editor.Text           = command;
                    TextInput.Editor.SelectionStart = TextInput.Editor.Text.Length;
                }

                break;
            }
        }