/// <summary>
 /// Scrolls all the visible terminal windows to the bottom.
 /// </summary>
 public void ScrollAllToBottom()
 {
     GameTerminal.ScrollToLastLine();
     Terminal1.ScrollToLastLine();
     Terminal2.ScrollToLastLine();
     Terminal3.ScrollToLastLine();
 }
Пример #2
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;
            }
        }
Пример #3
0
        /// <summary>
        /// Pass mouse scrolling off to the back buffer.  Probably.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void GameTerminal_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
        {
            // If no back buffer, don't bother.
            if (!App.Settings.AvalonSettings.BackBufferEnabled || !App.Settings.AvalonSettings.MouseWheelScrollReroutesToBackBuffer)
            {
                return;
            }

            // Allowing scrolling down in the main terminal when the back buffer is collapsed.
            if (e.Delta < 0 && GameBackBufferTerminal.Visibility == Visibility.Collapsed)
            {
                e.Handled = false;
                return;
            }

            // Back buffer is collapsed, show it, scroll to the bottom of it.
            if (GameBackBufferTerminal.Visibility == Visibility.Collapsed)
            {
                GameBackBufferTerminal.Visibility = 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();
            }
            else if (GameBackBufferTerminal.Visibility == Visibility.Visible)
            {
                if (e.Delta > 0)
                {
                    this.GameBackBufferTerminal.PageUp();

                    // This mitigates scrolling up.
                    e.Handled = true;
                }
                else
                {
                    this.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 = Visibility.Collapsed;
                        TextInput.Editor.Focus();
                    }
                }
            }
        }
Пример #4
0
        /// <summary>
        /// Updates any properties that need to be updated after the settings are updated.  This deals primarily
        /// with properties that aren't bound through dependency properties.
        /// </summary>
        public void UpdateUISettings()
        {
            // Terminal font
            FontFamily font;

            switch (App.Settings.AvalonSettings.TerminalFont)
            {
            case AvalonSettings.TerminalFonts.Consolas:
                this.ViewModel.TerminalFontFamily = new FontFamily("Consolas");
                break;

            case AvalonSettings.TerminalFonts.CourierNew:
                this.ViewModel.TerminalFontFamily = new FontFamily("Courier New");
                break;

            default:
                this.ViewModel.TerminalFontFamily = new FontFamily("Consolas");
                break;
            }

            this.ViewModel.SpellCheckEnabled = App.Settings.ProfileSettings.SpellChecking;

            // Scroll everything to the last line in case heights/widths/wrapping has changed.
            GameTerminal.ScrollToLastLine();
            Terminal1.ScrollToLastLine();
            Terminal2.ScrollToLastLine();
            Terminal3.ScrollToLastLine();

            // This will allow the main window to go maximize and not cover the task bar on the main window
            // but will maximize over the task bar on 2nd monitors.
            // TODO - Make this work on all monitors
            this.MaxHeight = SystemParameters.MaximizedPrimaryScreenHeight;
            this.MaxWidth  = SystemParameters.MaximizedPrimaryScreenWidth;

            // The number of seconds in between batch writes for the the database wrapper.
            SqlTasks.SetInterval(App.Settings.AvalonSettings.DatabaseWriteInterval);

            // Apply the border settings by trigger the SizeChanged event.
            this.MainPage_SizeChanged(null, null);

            // Grid Layout
            LoadGridState();
        }
 /// <summary>
 /// Scrolls all the visible terminal windows to the bottom.
 /// </summary>
 public void ScrollAllToBottom()
 {
     OocCommunicationTerminal.ScrollToLastLine();
     CommunicationTerminal.ScrollToLastLine();
     GameTerminal.ScrollToLastLine();
 }
Пример #6
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;
            }
        }
Пример #7
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;
            }
        }