The PythonProcessor class from my last post is designed to be hosted in an GUI text editor.  I used an Avalon TextBox, as so:


namespace AddInConsole
{
     using System;
     using System.Globalization;
     using System.IO;
     using System.Text;
     using System.Windows;
     using System.Windows.Controls;
     using System.Windows.Input;
 
     public class ConsolePane : DockPanel
     {
          private TextBox textBox = null;
          private PythonProcessor processor = null;
 
          public ConsolePane()
          {
              this.textBox = new TextBox();
              this.textBox.AcceptsTab = true;
              this.textBox.KeyDown += textBox_KeyDown;
              this.Children.Add(this.textBox);
 
              TextBoxStream stream = new TextBoxStream(this.textBox);
              this.processor = new PythonProcessor(stream);
          }
 
          public PythonProcessor Processor
          {
              get
              {
                   return this.processor;
              }
          }
 
          void textBox_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
          {
              if (e.Key == Key.Return)
              {
                   string line = this.textBox.GetLineText(this.textBox.LineCount - 1);
                   this.Write("\n");
                   if (this.processor.EvaluateLine(line))
                   {
                        this.Write("\n");
                   }
              }
          }
 
          internal void Clear()
          {
              if (this.textBox != null)
              {
                   this.textBox.Text = string.Empty;
              }
          }
 
          internal void Write(string run)
          {
              bool cursorIsAtEnd = false;
              if (this.textBox.SelectionStart == this.textBox.Text.Length)
              {
                   cursorIsAtEnd = true;
              }
 
              this.textBox.AppendText(run);
 
              if (cursorIsAtEnd)
              {
                   this.textBox.Select(this.textBox.Text.Length, 0);
                   this.textBox.ScrollToEnd();
              }
          }
 
          internal void WriteLine(string line)
          {
              this.Write(line + "\n");
          }
     }
}