asciipumper

- mspaint style program to create irc ascii art
git clone git://git.acid.vegas/asciipumper.git
Log | Files | Refs | Archive | README

commit ded2c99e48d3ef979485fc05521b1145580544ad
Author: acidvegas <acid.vegas@acid.vegas>
Date: Fri, 2 Jun 2023 14:49:13 -0400

Initial commit

Diffstat:
A.screens/preview.png | 0
AREADME.md | 13+++++++++++++
Aasciipumper/AsciiPumper.exe | 0
Aasciipumper/AsciiPumper.exe.config | 111+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aasciipumper/AsciiPumperSetup.msi | 0
Aasciipumper/MainIcon.ico | 0
Aasciipumper/setup.exe | 0
Asource/AboutBox1.Designer.cs | 187+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asource/AboutBox1.cs | 165+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asource/AboutBox1.resx | 611+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asource/AsciiPumper.csproj | 191+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asource/AsciiPumper.exe.config | 111+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asource/CellInfo.cs | 69+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asource/ColorPalette.cs | 99+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asource/ColorSelector.Designer.cs | 317+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asource/ColorSelector.cs | 191+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asource/ColorSelector.resx | 121+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asource/ImageImporter.cs | 11+++++++++++
Asource/KeypressAction.cs | 60++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asource/MainForm.Designer.cs | 536+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asource/MainForm.cs | 576+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asource/MainForm.resx | 159+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asource/OptionsForm.Designer.cs | 445+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asource/OptionsForm.cs | 130+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asource/OptionsForm.resx | 130+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asource/PaintAction.cs | 53+++++++++++++++++++++++++++++++++++++++++++++++++++++
Asource/PaintCanvas.Designer.cs | 56++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asource/PaintCanvas.cs | 1265+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asource/PaintCanvas.resx | 121+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asource/Program.cs | 46++++++++++++++++++++++++++++++++++++++++++++++
Asource/Properties/AssemblyInfo.cs | 33+++++++++++++++++++++++++++++++++
Asource/Properties/Resources.Designer.cs | 70++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asource/Properties/Resources.resx | 125+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asource/Properties/Settings.Designer.cs | 220+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asource/PumpForm.Designer.cs | 688+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asource/PumpForm.cs | 474+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asource/PumpForm.resx | 431+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asource/Settings.cs | 55+++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asource/UndoableAction.cs | 13+++++++++++++

39 files changed, 7883 insertions(+), 0 deletions(-)

diff --git a/.screens/preview.png b/.screens/preview.png
Binary files differ.
diff --git a/README.md b/README.md
@@ -0,0 +1,13 @@
+![](.screens/preview.png)
+
+###### Requirements
+* [Microsoft .NET Framework Version 2.0 Redistributable](https://www.microsoft.com/en-us/download/details.aspx?id=6523)
+
+###### Mirrors
+- [acid.vegas](https://acid.vegas/asciipumper)
+- [SuperNETs](https://git.supernets.org/ircart/asciipumper)
+- [GitHub](https://github.com/ircart/asciipumper)
+- [GitLab](https://gitlab.com/ircart/asciipumper)
+
+###### Credits
+* Lampiasis
diff --git a/asciipumper/AsciiPumper.exe b/asciipumper/AsciiPumper.exe
Binary files differ.
diff --git a/asciipumper/AsciiPumper.exe.config b/asciipumper/AsciiPumper.exe.config
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+    <configSections>
+        <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
+            <section name="AsciiPumper.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
+            <section name="ColorPumper.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
+        </sectionGroup>
+    </configSections>
+    <userSettings>
+        <AsciiPumper.Properties.Settings>
+            <setting name="PaintFontName" serializeAs="String">
+                <value>Consolas</value>
+            </setting>
+            <setting name="LMBIsForeground" serializeAs="String">
+                <value>False</value>
+            </setting>
+            <setting name="MMBIsForeground" serializeAs="String">
+                <value>True</value>
+            </setting>
+            <setting name="RMBIsForeground" serializeAs="String">
+                <value>False</value>
+            </setting>
+            <setting name="CellHeight" serializeAs="String">
+                <value>20</value>
+            </setting>
+            <setting name="CellWidth" serializeAs="String">
+                <value>10</value>
+            </setting>
+            <setting name="HighlightColor" serializeAs="String">
+                <value>Salmon</value>
+            </setting>
+            <setting name="SeperatorColor" serializeAs="String">
+                <value>DimGray</value>
+            </setting>
+            <setting name="Columns" serializeAs="String">
+                <value>80</value>
+            </setting>
+            <setting name="Rows" serializeAs="String">
+                <value>15</value>
+            </setting>
+            <setting name="LMBColor" serializeAs="String">
+                <value>0</value>
+            </setting>
+            <setting name="MMBColor" serializeAs="String">
+                <value>4</value>
+            </setting>
+            <setting name="RMBColor" serializeAs="String">
+                <value>1</value>
+            </setting>
+            <setting name="PaintFontSize" serializeAs="String">
+                <value>10</value>
+            </setting>
+            <setting name="ShouldWatermark" serializeAs="String">
+                <value>True</value>
+            </setting>
+            <setting name="RecentFiles" serializeAs="Xml">
+                <value>
+                    <ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+                        xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+                        <string>asciipumper.txt</string>
+                    </ArrayOfString>
+                </value>
+            </setting>
+        </AsciiPumper.Properties.Settings>
+        <ColorPumper.Properties.Settings>
+            <setting name="PaintFontName" serializeAs="String">
+                <value>Consolas</value>
+            </setting>
+            <setting name="PaintFontSize" serializeAs="String">
+                <value>10</value>
+            </setting>
+            <setting name="LMBIsForeground" serializeAs="String">
+                <value>True</value>
+            </setting>
+            <setting name="MMBIsForeground" serializeAs="String">
+                <value>False</value>
+            </setting>
+            <setting name="RMBIsForeground" serializeAs="String">
+                <value>False</value>
+            </setting>
+            <setting name="CellHeight" serializeAs="String">
+                <value>20</value>
+            </setting>
+            <setting name="CellWidth" serializeAs="String">
+                <value>10</value>
+            </setting>
+            <setting name="HighlightColor" serializeAs="String">
+                <value>OldLace</value>
+            </setting>
+            <setting name="SeperatorColor" serializeAs="String">
+                <value>DarkGray</value>
+            </setting>
+            <setting name="Columns" serializeAs="String">
+                <value>80</value>
+            </setting>
+            <setting name="Rows" serializeAs="String">
+                <value>15</value>
+            </setting>
+            <setting name="LMBColor" serializeAs="String">
+                <value>0</value>
+            </setting>
+            <setting name="MMBColor" serializeAs="String">
+                <value>4</value>
+            </setting>
+            <setting name="RMBColor" serializeAs="String">
+                <value>1</value>
+            </setting>
+        </ColorPumper.Properties.Settings>
+    </userSettings>
+</configuration>
+\ No newline at end of file
diff --git a/asciipumper/AsciiPumperSetup.msi b/asciipumper/AsciiPumperSetup.msi
Binary files differ.
diff --git a/asciipumper/MainIcon.ico b/asciipumper/MainIcon.ico
Binary files differ.
diff --git a/asciipumper/setup.exe b/asciipumper/setup.exe
Binary files differ.
diff --git a/source/AboutBox1.Designer.cs b/source/AboutBox1.Designer.cs
@@ -0,0 +1,187 @@
+namespace AsciiPumper
+{
+	partial class AboutBox1
+	{
+		/// <summary>
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.IContainer components = null;
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		protected override void Dispose(bool disposing)
+		{
+			if (disposing && (components != null))
+			{
+				components.Dispose();
+			}
+			base.Dispose(disposing);
+		}
+
+		#region Windows Form Designer generated code
+
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+			System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AboutBox1));
+			this.tableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();
+			this.logoPictureBox = new System.Windows.Forms.PictureBox();
+			this.labelProductName = new System.Windows.Forms.Label();
+			this.labelVersion = new System.Windows.Forms.Label();
+			this.labelCopyright = new System.Windows.Forms.Label();
+			this.labelCompanyName = new System.Windows.Forms.Label();
+			this.textBoxDescription = new System.Windows.Forms.TextBox();
+			this.okButton = new System.Windows.Forms.Button();
+			this.tableLayoutPanel.SuspendLayout();
+			((System.ComponentModel.ISupportInitialize)(this.logoPictureBox)).BeginInit();
+			this.SuspendLayout();
+			// 
+			// tableLayoutPanel
+			// 
+			this.tableLayoutPanel.ColumnCount = 2;
+			this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33F));
+			this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 67F));
+			this.tableLayoutPanel.Controls.Add(this.logoPictureBox, 0, 0);
+			this.tableLayoutPanel.Controls.Add(this.labelProductName, 1, 0);
+			this.tableLayoutPanel.Controls.Add(this.labelVersion, 1, 1);
+			this.tableLayoutPanel.Controls.Add(this.labelCopyright, 1, 2);
+			this.tableLayoutPanel.Controls.Add(this.labelCompanyName, 1, 3);
+			this.tableLayoutPanel.Controls.Add(this.textBoxDescription, 1, 4);
+			this.tableLayoutPanel.Controls.Add(this.okButton, 1, 5);
+			this.tableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;
+			this.tableLayoutPanel.Location = new System.Drawing.Point(9, 9);
+			this.tableLayoutPanel.Name = "tableLayoutPanel";
+			this.tableLayoutPanel.RowCount = 6;
+			this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F));
+			this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F));
+			this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F));
+			this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F));
+			this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
+			this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F));
+			this.tableLayoutPanel.Size = new System.Drawing.Size(694, 324);
+			this.tableLayoutPanel.TabIndex = 0;
+			// 
+			// logoPictureBox
+			// 
+			this.logoPictureBox.Dock = System.Windows.Forms.DockStyle.Fill;
+			this.logoPictureBox.Image = ((System.Drawing.Image)(resources.GetObject("logoPictureBox.Image")));
+			this.logoPictureBox.Location = new System.Drawing.Point(3, 3);
+			this.logoPictureBox.Name = "logoPictureBox";
+			this.tableLayoutPanel.SetRowSpan(this.logoPictureBox, 6);
+			this.logoPictureBox.Size = new System.Drawing.Size(223, 318);
+			this.logoPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
+			this.logoPictureBox.TabIndex = 12;
+			this.logoPictureBox.TabStop = false;
+			// 
+			// labelProductName
+			// 
+			this.labelProductName.Dock = System.Windows.Forms.DockStyle.Fill;
+			this.labelProductName.Location = new System.Drawing.Point(235, 0);
+			this.labelProductName.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0);
+			this.labelProductName.MaximumSize = new System.Drawing.Size(0, 17);
+			this.labelProductName.Name = "labelProductName";
+			this.labelProductName.Size = new System.Drawing.Size(456, 17);
+			this.labelProductName.TabIndex = 19;
+			this.labelProductName.Text = "Product Name";
+			this.labelProductName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+			// 
+			// labelVersion
+			// 
+			this.labelVersion.Dock = System.Windows.Forms.DockStyle.Fill;
+			this.labelVersion.Location = new System.Drawing.Point(235, 32);
+			this.labelVersion.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0);
+			this.labelVersion.MaximumSize = new System.Drawing.Size(0, 17);
+			this.labelVersion.Name = "labelVersion";
+			this.labelVersion.Size = new System.Drawing.Size(456, 17);
+			this.labelVersion.TabIndex = 0;
+			this.labelVersion.Text = "Version";
+			this.labelVersion.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+			// 
+			// labelCopyright
+			// 
+			this.labelCopyright.Dock = System.Windows.Forms.DockStyle.Fill;
+			this.labelCopyright.Location = new System.Drawing.Point(235, 64);
+			this.labelCopyright.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0);
+			this.labelCopyright.MaximumSize = new System.Drawing.Size(0, 17);
+			this.labelCopyright.Name = "labelCopyright";
+			this.labelCopyright.Size = new System.Drawing.Size(456, 17);
+			this.labelCopyright.TabIndex = 21;
+			this.labelCopyright.Text = "Copyright";
+			this.labelCopyright.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+			// 
+			// labelCompanyName
+			// 
+			this.labelCompanyName.Dock = System.Windows.Forms.DockStyle.Fill;
+			this.labelCompanyName.Location = new System.Drawing.Point(235, 96);
+			this.labelCompanyName.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0);
+			this.labelCompanyName.MaximumSize = new System.Drawing.Size(0, 17);
+			this.labelCompanyName.Name = "labelCompanyName";
+			this.labelCompanyName.Size = new System.Drawing.Size(456, 17);
+			this.labelCompanyName.TabIndex = 22;
+			this.labelCompanyName.Text = "Company Name";
+			this.labelCompanyName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
+			// 
+			// textBoxDescription
+			// 
+			this.textBoxDescription.Dock = System.Windows.Forms.DockStyle.Fill;
+			this.textBoxDescription.Location = new System.Drawing.Point(235, 131);
+			this.textBoxDescription.Margin = new System.Windows.Forms.Padding(6, 3, 3, 3);
+			this.textBoxDescription.Multiline = true;
+			this.textBoxDescription.Name = "textBoxDescription";
+			this.textBoxDescription.ReadOnly = true;
+			this.textBoxDescription.ScrollBars = System.Windows.Forms.ScrollBars.Both;
+			this.textBoxDescription.Size = new System.Drawing.Size(456, 156);
+			this.textBoxDescription.TabIndex = 23;
+			this.textBoxDescription.TabStop = false;
+			this.textBoxDescription.Text = "Description";
+			// 
+			// okButton
+			// 
+			this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+			this.okButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+			this.okButton.Location = new System.Drawing.Point(616, 298);
+			this.okButton.Name = "okButton";
+			this.okButton.Size = new System.Drawing.Size(75, 23);
+			this.okButton.TabIndex = 24;
+			this.okButton.Text = "&OK";
+			// 
+			// AboutBox1
+			// 
+			this.AcceptButton = this.okButton;
+			this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+			this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+			this.ClientSize = new System.Drawing.Size(712, 342);
+			this.Controls.Add(this.tableLayoutPanel);
+			this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+			this.MaximizeBox = false;
+			this.MinimizeBox = false;
+			this.Name = "AboutBox1";
+			this.Padding = new System.Windows.Forms.Padding(9);
+			this.ShowIcon = false;
+			this.ShowInTaskbar = false;
+			this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+			this.Text = "About Ascii Pumper";
+			this.Load += new System.EventHandler(this.AboutBox1_Load);
+			this.tableLayoutPanel.ResumeLayout(false);
+			this.tableLayoutPanel.PerformLayout();
+			((System.ComponentModel.ISupportInitialize)(this.logoPictureBox)).EndInit();
+			this.ResumeLayout(false);
+
+		}
+
+		#endregion
+
+		private System.Windows.Forms.TableLayoutPanel tableLayoutPanel;
+		private System.Windows.Forms.PictureBox logoPictureBox;
+		private System.Windows.Forms.Label labelProductName;
+		private System.Windows.Forms.Label labelVersion;
+		private System.Windows.Forms.Label labelCopyright;
+		private System.Windows.Forms.Label labelCompanyName;
+		private System.Windows.Forms.TextBox textBoxDescription;
+		private System.Windows.Forms.Button okButton;
+	}
+}
diff --git a/source/AboutBox1.cs b/source/AboutBox1.cs
@@ -0,0 +1,165 @@
+#region Copyright (c) 2007, PP4L Software
+/************************************************************************************
+
+Copyright  2007, PP4L Software
+Author:	Lampiasis <lampiasis@dvolker.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+'***********************************************************************************/
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Windows.Forms;
+using System.Reflection;
+
+namespace AsciiPumper
+{
+	partial class AboutBox1 : Form
+	{
+		public AboutBox1()
+		{
+			InitializeComponent();
+
+			//  Initialize the AboutBox to display the product information from the assembly information.
+			//  Change assembly information settings for your application through either:
+			//  - Project->Properties->Application->Assembly Information
+			//  - AssemblyInfo.cs
+			this.Text = String.Format("About {0}", AssemblyTitle);
+			//this.labelProductName.Text = AssemblyProduct;
+			this.labelProductName.Text = "Ascii Pumper";
+			this.labelVersion.Text = String.Format("Version {0}", AssemblyVersion);
+			this.labelCopyright.Text = AssemblyCopyright;
+			this.labelCompanyName.Text = AssemblyCompany;
+			this.textBoxDescription.Text = AssemblyDescription + "\r\n\r\nya we pumpin'!\r\n\r\n";
+			this.textBoxDescription.Text += @"
+Thanks vap0r for asciipumper.txt, ramprat for bug reports and all the 
+pumpers for their input.
+
+http://code.google.com/p/asciipumper/
+Copyright (C) 2007 Lampiasis <lampiasis@dvolker.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+";
+		}
+
+		#region Assembly Attribute Accessors
+
+		public string AssemblyTitle
+		{
+			get
+			{
+				// Get all Title attributes on this assembly
+				object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyTitleAttribute), false);
+				// If there is at least one Title attribute
+				if (attributes.Length > 0)
+				{
+					// Select the first one
+					AssemblyTitleAttribute titleAttribute = (AssemblyTitleAttribute)attributes[0];
+					// If it is not an empty string, return it
+					if (titleAttribute.Title != "")
+						return titleAttribute.Title;
+				}
+				// If there was no Title attribute, or if the Title attribute was the empty string, return the .exe name
+				return System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().CodeBase);
+			}
+		}
+
+		public string AssemblyVersion
+		{
+			get
+			{
+				return Assembly.GetExecutingAssembly().GetName().Version.ToString();
+			}
+		}
+
+		public string AssemblyDescription
+		{
+			get
+			{
+				// Get all Description attributes on this assembly
+				object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyDescriptionAttribute), false);
+				// If there aren't any Description attributes, return an empty string
+				if (attributes.Length == 0)
+					return "";
+				// If there is a Description attribute, return its value
+				return ((AssemblyDescriptionAttribute)attributes[0]).Description;
+			}
+		}
+
+		public string AssemblyProduct
+		{
+			get
+			{
+				// Get all Product attributes on this assembly
+				object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyProductAttribute), false);
+				// If there aren't any Product attributes, return an empty string
+				if (attributes.Length == 0)
+					return "";
+				// If there is a Product attribute, return its value
+				return ((AssemblyProductAttribute)attributes[0]).Product;
+			}
+		}
+
+		public string AssemblyCopyright
+		{
+			get
+			{
+				// Get all Copyright attributes on this assembly
+				object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCopyrightAttribute), false);
+				// If there aren't any Copyright attributes, return an empty string
+				if (attributes.Length == 0)
+					return "";
+				// If there is a Copyright attribute, return its value
+				return ((AssemblyCopyrightAttribute)attributes[0]).Copyright;
+			}
+		}
+
+		public string AssemblyCompany
+		{
+			get
+			{
+				// Get all Company attributes on this assembly
+				object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCompanyAttribute), false);
+				// If there aren't any Company attributes, return an empty string
+				if (attributes.Length == 0)
+					return "";
+				// If there is a Company attribute, return its value
+				return ((AssemblyCompanyAttribute)attributes[0]).Company;
+			}
+		}
+		#endregion
+
+		private void AboutBox1_Load(object sender, EventArgs e)
+		{
+
+		}
+	}
+}
diff --git a/source/AboutBox1.resx b/source/AboutBox1.resx
@@ -0,0 +1,610 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="logoPictureBox.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+        AZ+4Ui+mkTlKAAAAAElFTkSuQmCC
+</value>
+  </data>
+</root>
+\ No newline at end of file
diff --git a/source/AsciiPumper.csproj b/source/AsciiPumper.csproj
@@ -0,0 +1,190 @@
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.20404</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{3F20CEF2-815A-43E2-9071-0D5462F245BF}</ProjectGuid>
+    <OutputType>WinExe</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>AsciiPumper</RootNamespace>
+    <AssemblyName>AsciiPumper</AssemblyName>
+    <ManifestCertificateThumbprint>4DD6994A8DC8FB07112F22D88EE79355E4A1AEDB</ManifestCertificateThumbprint>
+    <ManifestKeyFile>AsciiPumper_TemporaryKey.pfx</ManifestKeyFile>
+    <GenerateManifests>true</GenerateManifests>
+    <SignManifests>true</SignManifests>
+    <IsWebBootstrapper>false</IsWebBootstrapper>
+    <ApplicationIcon>Resources\MainIcon.ico</ApplicationIcon>
+    <TargetZone>LocalIntranet</TargetZone>
+    <FileUpgradeFlags>
+    </FileUpgradeFlags>
+    <OldToolsVersion>2.0</OldToolsVersion>
+    <UpgradeBackupLocation>
+    </UpgradeBackupLocation>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>asciipumper.pfx</AssemblyOriginatorKeyFile>
+    <PublishUrl>c:\temp\AsciiPumper\</PublishUrl>
+    <Install>true</Install>
+    <InstallFrom>Disk</InstallFrom>
+    <UpdateEnabled>false</UpdateEnabled>
+    <UpdateMode>Foreground</UpdateMode>
+    <UpdateInterval>7</UpdateInterval>
+    <UpdateIntervalUnits>Days</UpdateIntervalUnits>
+    <UpdatePeriodically>false</UpdatePeriodically>
+    <UpdateRequired>false</UpdateRequired>
+    <MapFileExtensions>true</MapFileExtensions>
+    <SupportUrl>http://code.google.com/p/asciipumper/</SupportUrl>
+    <ProductName>Ascii Pumper</ProductName>
+    <PublisherName>PP4L</PublisherName>
+    <CreateWebPageOnPublish>false</CreateWebPageOnPublish>
+    <ApplicationRevision>1</ApplicationRevision>
+    <ApplicationVersion>1.1.0.%2a</ApplicationVersion>
+    <UseApplicationTrust>false</UseApplicationTrust>
+    <BootstrapperEnabled>true</BootstrapperEnabled>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Deployment" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="AboutBox1.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="AboutBox1.Designer.cs">
+      <DependentUpon>AboutBox1.cs</DependentUpon>
+    </Compile>
+    <Compile Include="CellInfo.cs" />
+    <Compile Include="ColorPalette.cs" />
+    <Compile Include="ColorSelector.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ColorSelector.Designer.cs">
+      <DependentUpon>ColorSelector.cs</DependentUpon>
+    </Compile>
+    <Compile Include="ImageImporter.cs" />
+    <Compile Include="KeypressAction.cs" />
+    <Compile Include="MainForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="MainForm.Designer.cs">
+      <DependentUpon>MainForm.cs</DependentUpon>
+    </Compile>
+    <Compile Include="OptionsForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="OptionsForm.Designer.cs">
+      <DependentUpon>OptionsForm.cs</DependentUpon>
+    </Compile>
+    <Compile Include="PaintAction.cs" />
+    <Compile Include="PaintCanvas.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="PaintCanvas.Designer.cs">
+      <DependentUpon>PaintCanvas.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <EmbeddedResource Include="AboutBox1.resx">
+      <SubType>Designer</SubType>
+      <DependentUpon>AboutBox1.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ColorSelector.resx">
+      <SubType>Designer</SubType>
+      <DependentUpon>ColorSelector.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="MainForm.resx">
+      <SubType>Designer</SubType>
+      <DependentUpon>MainForm.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="OptionsForm.resx">
+      <SubType>Designer</SubType>
+      <DependentUpon>OptionsForm.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="PaintCanvas.resx">
+      <SubType>Designer</SubType>
+      <DependentUpon>PaintCanvas.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Properties\Resources.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <EmbeddedResource Include="PumpForm.resx">
+      <SubType>Designer</SubType>
+      <DependentUpon>PumpForm.cs</DependentUpon>
+    </EmbeddedResource>
+    <Compile Include="Properties\Resources.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Resources.resx</DependentUpon>
+      <DesignTime>True</DesignTime>
+    </Compile>
+    <None Include="app.config" />
+    <None Include="Properties\Settings.settings">
+      <Generator>SettingsSingleFileGenerator</Generator>
+      <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+    </None>
+    <Compile Include="Properties\Settings.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Settings.settings</DependentUpon>
+      <DesignTimeSharedInput>True</DesignTimeSharedInput>
+    </Compile>
+    <Compile Include="PumpForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="PumpForm.Designer.cs">
+      <DependentUpon>PumpForm.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Settings.cs" />
+    <Compile Include="UndoableAction.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="asciipumper.txt">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="license.txt">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="README.txt">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <BaseApplicationManifest Include="Properties\app.manifest" />
+    <None Include="asciipumper.pfx" />
+    <None Include="Resources\MainIcon.ico" />
+  </ItemGroup>
+  <ItemGroup>
+    <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
+      <Visible>False</Visible>
+      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>
+      <Install>true</Install>
+    </BootstrapperPackage>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>
+\ No newline at end of file
diff --git a/source/AsciiPumper.exe.config b/source/AsciiPumper.exe.config
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+    <configSections>
+        <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
+            <section name="AsciiPumper.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
+            <section name="ColorPumper.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
+        </sectionGroup>
+    </configSections>
+    <userSettings>
+        <AsciiPumper.Properties.Settings>
+            <setting name="PaintFontName" serializeAs="String">
+                <value>Consolas</value>
+            </setting>
+            <setting name="LMBIsForeground" serializeAs="String">
+                <value>False</value>
+            </setting>
+            <setting name="MMBIsForeground" serializeAs="String">
+                <value>True</value>
+            </setting>
+            <setting name="RMBIsForeground" serializeAs="String">
+                <value>False</value>
+            </setting>
+            <setting name="CellHeight" serializeAs="String">
+                <value>20</value>
+            </setting>
+            <setting name="CellWidth" serializeAs="String">
+                <value>10</value>
+            </setting>
+            <setting name="HighlightColor" serializeAs="String">
+                <value>Salmon</value>
+            </setting>
+            <setting name="SeperatorColor" serializeAs="String">
+                <value>DimGray</value>
+            </setting>
+            <setting name="Columns" serializeAs="String">
+                <value>80</value>
+            </setting>
+            <setting name="Rows" serializeAs="String">
+                <value>15</value>
+            </setting>
+            <setting name="LMBColor" serializeAs="String">
+                <value>0</value>
+            </setting>
+            <setting name="MMBColor" serializeAs="String">
+                <value>4</value>
+            </setting>
+            <setting name="RMBColor" serializeAs="String">
+                <value>1</value>
+            </setting>
+            <setting name="PaintFontSize" serializeAs="String">
+                <value>10</value>
+            </setting>
+            <setting name="ShouldWatermark" serializeAs="String">
+                <value>True</value>
+            </setting>
+            <setting name="RecentFiles" serializeAs="Xml">
+                <value>
+                    <ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+                        xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+                        <string>asciipumper.txt</string>
+                    </ArrayOfString>
+                </value>
+            </setting>
+        </AsciiPumper.Properties.Settings>
+        <ColorPumper.Properties.Settings>
+            <setting name="PaintFontName" serializeAs="String">
+                <value>Consolas</value>
+            </setting>
+            <setting name="PaintFontSize" serializeAs="String">
+                <value>10</value>
+            </setting>
+            <setting name="LMBIsForeground" serializeAs="String">
+                <value>True</value>
+            </setting>
+            <setting name="MMBIsForeground" serializeAs="String">
+                <value>False</value>
+            </setting>
+            <setting name="RMBIsForeground" serializeAs="String">
+                <value>False</value>
+            </setting>
+            <setting name="CellHeight" serializeAs="String">
+                <value>20</value>
+            </setting>
+            <setting name="CellWidth" serializeAs="String">
+                <value>10</value>
+            </setting>
+            <setting name="HighlightColor" serializeAs="String">
+                <value>OldLace</value>
+            </setting>
+            <setting name="SeperatorColor" serializeAs="String">
+                <value>DarkGray</value>
+            </setting>
+            <setting name="Columns" serializeAs="String">
+                <value>80</value>
+            </setting>
+            <setting name="Rows" serializeAs="String">
+                <value>15</value>
+            </setting>
+            <setting name="LMBColor" serializeAs="String">
+                <value>0</value>
+            </setting>
+            <setting name="MMBColor" serializeAs="String">
+                <value>4</value>
+            </setting>
+            <setting name="RMBColor" serializeAs="String">
+                <value>1</value>
+            </setting>
+        </ColorPumper.Properties.Settings>
+    </userSettings>
+</configuration>
+\ No newline at end of file
diff --git a/source/CellInfo.cs b/source/CellInfo.cs
@@ -0,0 +1,69 @@
+#region Copyright (c) 2007, PP4L Software
+/************************************************************************************
+
+Copyright  2007, PP4L Software
+Author:	Lampiasis <lampiasis@dvolker.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+'***********************************************************************************/
+#endregion
+
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace AsciiPumper
+{
+	public class CellInfo
+	{
+		public CellInfo()
+		{
+			Selected = false;
+			Character = ' ';
+			BackColor = 1;
+			ForeColor = 0;
+		}
+
+		public CellInfo(char character, byte backcolor, byte forecolor)
+		{
+			Selected = false;
+			Character = character;
+			BackColor = backcolor;
+			ForeColor = forecolor;
+		}
+
+		public bool Bold = false;
+		public bool Underlined = false;
+		
+		/// <summary>
+		/// Gets or sets the Selected.
+		/// </summary>
+		public bool Selected;
+
+	
+		public char Character;
+	
+
+		public byte BackColor;
+
+
+
+		public byte ForeColor;
+
+
+	}
+}
diff --git a/source/ColorPalette.cs b/source/ColorPalette.cs
@@ -0,0 +1,99 @@
+#region Copyright (c) 2007, PP4L Software
+/************************************************************************************
+
+Copyright  2007, PP4L Software
+Author:	Lampiasis <lampiasis@dvolker.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+'***********************************************************************************/
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Drawing;
+
+namespace AsciiPumper
+{
+	public class ColorPalette : List<Color>
+	{
+
+		public SolidBrush [] SolidBrushes  = new SolidBrush[16];
+
+		/* 
+ 0 white
+ 1 black
+ 2 blue     (navy)
+ 3 green
+ 4 red
+ 5 brown    (maroon)
+ 6 purple
+ 7 orange   (olive)
+ 8 yellow
+ 9 lt.green (lime)
+ 10 teal    (a kinda green/blue cyan)
+ 11 lt.cyan (cyan ?) (aqua)
+ 12 lt.blue (royal)
+ 13 pink    (light purple) (fuchsia)
+ 14 grey
+ 15 lt.grey (silver)
+		 */
+		public ColorPalette() : base(16)
+		{
+			
+
+			this.Add(Color.White);
+			this.Add(Color.Black);
+			this.Add(Color.FromArgb(0, 0, 127)); // this.Add(Color.Blue);
+			this.Add(Color.FromArgb(0, 147, 0)); // this.Add(Color.Green);
+			this.Add(Color.FromArgb(255, 0, 0)); // this.Add(Color.Red);
+			this.Add(Color.FromArgb(127, 0, 0)); // this.Add(Color.Brown);
+			this.Add(Color.FromArgb(156, 0, 156)); // this.Add(Color.Purple);
+			this.Add(Color.FromArgb(252, 127, 0)); // this.Add(Color.Orange);
+			this.Add(Color.FromArgb(255, 255, 0)); // this.Add( Color.Yellow);
+			this.Add(Color.FromArgb(0, 252, 0)); // this.Add( Color.LightGreen);
+			this.Add(Color.FromArgb(0, 147, 147)); // this.Add( Color.Teal);
+			this.Add(Color.FromArgb(0, 255, 255)); // this.Add( Color.LightCyan);
+			this.Add(Color.FromArgb(0, 0, 252)); // this.Add( Color.LightBlue);
+			this.Add(Color.FromArgb(255, 0, 255)); // this.Add( Color.Pink);
+			this.Add(Color.FromArgb(127, 127, 127)); // this.Add( Color.Gray);
+			this.Add(Color.FromArgb(210, 210, 210)); // this.Add(Color.LightGray);
+
+			for(int i = 0; i < 16; i++)
+				SolidBrushes[i] = new SolidBrush(this[i]);
+		}
+
+		public byte FindClosestColor(Color color)
+		{
+			byte smallestindex = 0;
+			int smallestdistance = int.MaxValue;
+
+			for (byte i = 0; i < this.Count; i++)
+			{
+
+				Color curcolor = this[i];
+				int distance = (curcolor.R - color.R) * (curcolor.R - color.R) + (curcolor.G - color.G) * (curcolor.G - color.G) + (curcolor.B - color.B) * (curcolor.B - color.B);
+				if (distance < smallestdistance)
+				{
+					smallestdistance = distance;
+					smallestindex = i;
+				}
+			}
+
+			return smallestindex;
+		}
+	}
+}
diff --git a/source/ColorSelector.Designer.cs b/source/ColorSelector.Designer.cs
@@ -0,0 +1,317 @@
+namespace AsciiPumper
+{
+	partial class ColorSelector
+	{
+		/// <summary> 
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.IContainer components = null;
+
+		/// <summary> 
+		/// Clean up any resources being used.
+		/// </summary>
+		/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+		protected override void Dispose(bool disposing)
+		{
+			if (disposing && (components != null))
+			{
+				components.Dispose();
+			}
+			base.Dispose(disposing);
+		}
+
+		#region Component Designer generated code
+
+		/// <summary> 
+		/// Required method for Designer support - do not modify 
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+			this.colorLayoutPanel = new System.Windows.Forms.FlowLayoutPanel();
+			this.color0 = new System.Windows.Forms.PictureBox();
+			this.color1 = new System.Windows.Forms.PictureBox();
+			this.color2 = new System.Windows.Forms.PictureBox();
+			this.color3 = new System.Windows.Forms.PictureBox();
+			this.color4 = new System.Windows.Forms.PictureBox();
+			this.color5 = new System.Windows.Forms.PictureBox();
+			this.color7 = new System.Windows.Forms.PictureBox();
+			this.color8 = new System.Windows.Forms.PictureBox();
+			this.color9 = new System.Windows.Forms.PictureBox();
+			this.color10 = new System.Windows.Forms.PictureBox();
+			this.color11 = new System.Windows.Forms.PictureBox();
+			this.color12 = new System.Windows.Forms.PictureBox();
+			this.color13 = new System.Windows.Forms.PictureBox();
+			this.color14 = new System.Windows.Forms.PictureBox();
+			this.color15 = new System.Windows.Forms.PictureBox();
+			this.color6 = new System.Windows.Forms.PictureBox();
+			this.colorLayoutPanel.SuspendLayout();
+			((System.ComponentModel.ISupportInitialize)(this.color0)).BeginInit();
+			((System.ComponentModel.ISupportInitialize)(this.color1)).BeginInit();
+			((System.ComponentModel.ISupportInitialize)(this.color2)).BeginInit();
+			((System.ComponentModel.ISupportInitialize)(this.color3)).BeginInit();
+			((System.ComponentModel.ISupportInitialize)(this.color4)).BeginInit();
+			((System.ComponentModel.ISupportInitialize)(this.color5)).BeginInit();
+			((System.ComponentModel.ISupportInitialize)(this.color7)).BeginInit();
+			((System.ComponentModel.ISupportInitialize)(this.color8)).BeginInit();
+			((System.ComponentModel.ISupportInitialize)(this.color9)).BeginInit();
+			((System.ComponentModel.ISupportInitialize)(this.color10)).BeginInit();
+			((System.ComponentModel.ISupportInitialize)(this.color11)).BeginInit();
+			((System.ComponentModel.ISupportInitialize)(this.color12)).BeginInit();
+			((System.ComponentModel.ISupportInitialize)(this.color13)).BeginInit();
+			((System.ComponentModel.ISupportInitialize)(this.color14)).BeginInit();
+			((System.ComponentModel.ISupportInitialize)(this.color15)).BeginInit();
+			((System.ComponentModel.ISupportInitialize)(this.color6)).BeginInit();
+			this.SuspendLayout();
+			// 
+			// colorLayoutPanel
+			// 
+			this.colorLayoutPanel.Controls.Add(this.color0);
+			this.colorLayoutPanel.Controls.Add(this.color1);
+			this.colorLayoutPanel.Controls.Add(this.color2);
+			this.colorLayoutPanel.Controls.Add(this.color3);
+			this.colorLayoutPanel.Controls.Add(this.color4);
+			this.colorLayoutPanel.Controls.Add(this.color5);
+			this.colorLayoutPanel.Controls.Add(this.color6);
+			this.colorLayoutPanel.Controls.Add(this.color7);
+			this.colorLayoutPanel.Controls.Add(this.color8);
+			this.colorLayoutPanel.Controls.Add(this.color9);
+			this.colorLayoutPanel.Controls.Add(this.color10);
+			this.colorLayoutPanel.Controls.Add(this.color11);
+			this.colorLayoutPanel.Controls.Add(this.color12);
+			this.colorLayoutPanel.Controls.Add(this.color13);
+			this.colorLayoutPanel.Controls.Add(this.color14);
+			this.colorLayoutPanel.Controls.Add(this.color15);
+			this.colorLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;
+			this.colorLayoutPanel.Location = new System.Drawing.Point(0, 0);
+			this.colorLayoutPanel.Name = "colorLayoutPanel";
+			this.colorLayoutPanel.Size = new System.Drawing.Size(208, 52);
+			this.colorLayoutPanel.TabIndex = 0;
+			// 
+			// color0
+			// 
+			this.color0.BackColor = System.Drawing.Color.White;
+			this.color0.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+			this.color0.Location = new System.Drawing.Point(3, 3);
+			this.color0.Name = "color0";
+			this.color0.Size = new System.Drawing.Size(20, 20);
+			this.color0.TabIndex = 0;
+			this.color0.TabStop = false;
+			this.color0.MouseClick += new System.Windows.Forms.MouseEventHandler(this.color0_MouseClick);
+			// 
+			// color1
+			// 
+			this.color1.BackColor = System.Drawing.Color.Black;
+			this.color1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+			this.color1.Location = new System.Drawing.Point(29, 3);
+			this.color1.Name = "color1";
+			this.color1.Size = new System.Drawing.Size(20, 20);
+			this.color1.TabIndex = 1;
+			this.color1.TabStop = false;
+			this.color1.Click += new System.EventHandler(this.color1_Click);
+			this.color1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.color1_MouseClick);
+			// 
+			// color2
+			// 
+			this.color2.BackColor = System.Drawing.Color.Blue;
+			this.color2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+			this.color2.Location = new System.Drawing.Point(55, 3);
+			this.color2.Name = "color2";
+			this.color2.Size = new System.Drawing.Size(20, 20);
+			this.color2.TabIndex = 2;
+			this.color2.TabStop = false;
+			this.color2.MouseClick += new System.Windows.Forms.MouseEventHandler(this.color2_MouseClick);
+			// 
+			// color3
+			// 
+			this.color3.BackColor = System.Drawing.Color.Green;
+			this.color3.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+			this.color3.Location = new System.Drawing.Point(81, 3);
+			this.color3.Name = "color3";
+			this.color3.Size = new System.Drawing.Size(20, 20);
+			this.color3.TabIndex = 3;
+			this.color3.TabStop = false;
+			this.color3.MouseClick += new System.Windows.Forms.MouseEventHandler(this.color3_MouseClick);
+			// 
+			// color4
+			// 
+			this.color4.BackColor = System.Drawing.Color.Red;
+			this.color4.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+			this.color4.Location = new System.Drawing.Point(107, 3);
+			this.color4.Name = "color4";
+			this.color4.Size = new System.Drawing.Size(20, 20);
+			this.color4.TabIndex = 4;
+			this.color4.TabStop = false;
+			this.color4.MouseClick += new System.Windows.Forms.MouseEventHandler(this.color4_MouseClick);
+			// 
+			// color5
+			// 
+			this.color5.BackColor = System.Drawing.Color.Brown;
+			this.color5.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+			this.color5.Location = new System.Drawing.Point(133, 3);
+			this.color5.Name = "color5";
+			this.color5.Size = new System.Drawing.Size(20, 20);
+			this.color5.TabIndex = 5;
+			this.color5.TabStop = false;
+			this.color5.MouseClick += new System.Windows.Forms.MouseEventHandler(this.color5_MouseClick);
+			// 
+			// color7
+			// 
+			this.color7.BackColor = System.Drawing.Color.Orange;
+			this.color7.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+			this.color7.Location = new System.Drawing.Point(185, 3);
+			this.color7.Name = "color7";
+			this.color7.Size = new System.Drawing.Size(20, 20);
+			this.color7.TabIndex = 6;
+			this.color7.TabStop = false;
+			this.color7.MouseClick += new System.Windows.Forms.MouseEventHandler(this.color7_MouseClick);
+			// 
+			// color8
+			// 
+			this.color8.BackColor = System.Drawing.Color.Yellow;
+			this.color8.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+			this.color8.Location = new System.Drawing.Point(3, 29);
+			this.color8.Name = "color8";
+			this.color8.Size = new System.Drawing.Size(20, 20);
+			this.color8.TabIndex = 7;
+			this.color8.TabStop = false;
+			this.color8.MouseClick += new System.Windows.Forms.MouseEventHandler(this.color8_MouseClick);
+			// 
+			// color9
+			// 
+			this.color9.BackColor = System.Drawing.Color.LightGreen;
+			this.color9.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+			this.color9.Location = new System.Drawing.Point(29, 29);
+			this.color9.Name = "color9";
+			this.color9.Size = new System.Drawing.Size(20, 20);
+			this.color9.TabIndex = 8;
+			this.color9.TabStop = false;
+			this.color9.MouseClick += new System.Windows.Forms.MouseEventHandler(this.color9_MouseClick);
+			// 
+			// color10
+			// 
+			this.color10.BackColor = System.Drawing.Color.Teal;
+			this.color10.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+			this.color10.Location = new System.Drawing.Point(55, 29);
+			this.color10.Name = "color10";
+			this.color10.Size = new System.Drawing.Size(20, 20);
+			this.color10.TabIndex = 9;
+			this.color10.TabStop = false;
+			this.color10.MouseClick += new System.Windows.Forms.MouseEventHandler(this.color10_MouseClick);
+			// 
+			// color11
+			// 
+			this.color11.BackColor = System.Drawing.Color.LightCyan;
+			this.color11.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+			this.color11.Location = new System.Drawing.Point(81, 29);
+			this.color11.Name = "color11";
+			this.color11.Size = new System.Drawing.Size(20, 20);
+			this.color11.TabIndex = 10;
+			this.color11.TabStop = false;
+			this.color11.Click += new System.EventHandler(this.color11_Click);
+			this.color11.MouseClick += new System.Windows.Forms.MouseEventHandler(this.color11_MouseClick);
+			// 
+			// color12
+			// 
+			this.color12.BackColor = System.Drawing.Color.LightBlue;
+			this.color12.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+			this.color12.Location = new System.Drawing.Point(107, 29);
+			this.color12.Name = "color12";
+			this.color12.Size = new System.Drawing.Size(20, 20);
+			this.color12.TabIndex = 11;
+			this.color12.TabStop = false;
+			this.color12.MouseClick += new System.Windows.Forms.MouseEventHandler(this.color12_MouseClick);
+			// 
+			// color13
+			// 
+			this.color13.BackColor = System.Drawing.Color.Pink;
+			this.color13.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+			this.color13.Location = new System.Drawing.Point(133, 29);
+			this.color13.Name = "color13";
+			this.color13.Size = new System.Drawing.Size(20, 20);
+			this.color13.TabIndex = 12;
+			this.color13.TabStop = false;
+			this.color13.MouseClick += new System.Windows.Forms.MouseEventHandler(this.color13_MouseClick);
+			// 
+			// color14
+			// 
+			this.color14.BackColor = System.Drawing.Color.Gray;
+			this.color14.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+			this.color14.Location = new System.Drawing.Point(159, 29);
+			this.color14.Name = "color14";
+			this.color14.Size = new System.Drawing.Size(20, 20);
+			this.color14.TabIndex = 13;
+			this.color14.TabStop = false;
+			this.color14.MouseClick += new System.Windows.Forms.MouseEventHandler(this.color14_MouseClick);
+			// 
+			// color15
+			// 
+			this.color15.BackColor = System.Drawing.Color.LightGray;
+			this.color15.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+			this.color15.Location = new System.Drawing.Point(185, 29);
+			this.color15.Name = "color15";
+			this.color15.Size = new System.Drawing.Size(20, 20);
+			this.color15.TabIndex = 14;
+			this.color15.TabStop = false;
+			this.color15.MouseClick += new System.Windows.Forms.MouseEventHandler(this.color15_MouseClick);
+			// 
+			// color6
+			// 
+			this.color6.BackColor = System.Drawing.Color.Purple;
+			this.color6.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+			this.color6.Location = new System.Drawing.Point(159, 3);
+			this.color6.Name = "color6";
+			this.color6.Size = new System.Drawing.Size(20, 20);
+			this.color6.TabIndex = 15;
+			this.color6.TabStop = false;
+			this.color6.MouseClick += new System.Windows.Forms.MouseEventHandler(this.color6_MouseClick);
+			// 
+			// ColorSelector
+			// 
+			this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+			this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+			this.Controls.Add(this.colorLayoutPanel);
+			this.Name = "ColorSelector";
+			this.Size = new System.Drawing.Size(208, 52);
+			this.colorLayoutPanel.ResumeLayout(false);
+			((System.ComponentModel.ISupportInitialize)(this.color0)).EndInit();
+			((System.ComponentModel.ISupportInitialize)(this.color1)).EndInit();
+			((System.ComponentModel.ISupportInitialize)(this.color2)).EndInit();
+			((System.ComponentModel.ISupportInitialize)(this.color3)).EndInit();
+			((System.ComponentModel.ISupportInitialize)(this.color4)).EndInit();
+			((System.ComponentModel.ISupportInitialize)(this.color5)).EndInit();
+			((System.ComponentModel.ISupportInitialize)(this.color7)).EndInit();
+			((System.ComponentModel.ISupportInitialize)(this.color8)).EndInit();
+			((System.ComponentModel.ISupportInitialize)(this.color9)).EndInit();
+			((System.ComponentModel.ISupportInitialize)(this.color10)).EndInit();
+			((System.ComponentModel.ISupportInitialize)(this.color11)).EndInit();
+			((System.ComponentModel.ISupportInitialize)(this.color12)).EndInit();
+			((System.ComponentModel.ISupportInitialize)(this.color13)).EndInit();
+			((System.ComponentModel.ISupportInitialize)(this.color14)).EndInit();
+			((System.ComponentModel.ISupportInitialize)(this.color15)).EndInit();
+			((System.ComponentModel.ISupportInitialize)(this.color6)).EndInit();
+			this.ResumeLayout(false);
+
+		}
+
+		#endregion
+
+		private System.Windows.Forms.FlowLayoutPanel colorLayoutPanel;
+		private System.Windows.Forms.PictureBox color0;
+		private System.Windows.Forms.PictureBox color1;
+		private System.Windows.Forms.PictureBox color2;
+		private System.Windows.Forms.PictureBox color3;
+		private System.Windows.Forms.PictureBox color4;
+		private System.Windows.Forms.PictureBox color5;
+		private System.Windows.Forms.PictureBox color7;
+		private System.Windows.Forms.PictureBox color8;
+		private System.Windows.Forms.PictureBox color9;
+		private System.Windows.Forms.PictureBox color10;
+		private System.Windows.Forms.PictureBox color11;
+		private System.Windows.Forms.PictureBox color12;
+		private System.Windows.Forms.PictureBox color13;
+		private System.Windows.Forms.PictureBox color14;
+		private System.Windows.Forms.PictureBox color15;
+		private System.Windows.Forms.PictureBox color6;
+	}
+}
diff --git a/source/ColorSelector.cs b/source/ColorSelector.cs
@@ -0,0 +1,191 @@
+#region Copyright (c) 2007, PP4L Software
+/************************************************************************************
+
+Copyright  2007, PP4L Software
+Author:	Lampiasis <lampiasis@dvolker.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+'***********************************************************************************/
+#endregion
+
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+
+namespace AsciiPumper
+{
+	public partial class ColorSelector : UserControl
+	{
+		public ColorSelector()
+		{
+			InitializeComponent();
+			LoadColorPalette(new ColorPalette());
+		}
+
+		public void LoadColorPalette(ColorPalette colors)
+		{
+			m_Colors = colors; 
+			color0.BackColor = colors[0];
+			color1.BackColor = colors[1];
+			color2.BackColor = colors[2];
+			color3.BackColor = colors[3];
+			color4.BackColor = colors[4];
+			color5.BackColor = colors[5];
+			color6.BackColor = colors[6];
+			color7.BackColor = colors[7];
+			color8.BackColor = colors[8];
+			color9.BackColor = colors[9];
+			color10.BackColor = colors[10];
+			color11.BackColor = colors[11];
+			color12.BackColor = colors[12];
+			color13.BackColor = colors[13];
+			color14.BackColor = colors[14];
+			color15.BackColor = colors[15];
+		}
+
+		private ColorPalette m_Colors = new ColorPalette();
+
+		/// <summary>
+		/// Gets or sets the Colors.
+		/// </summary>
+		public ColorPalette Colors
+		{
+			get { return m_Colors; }
+			set { LoadColorPalette(value); }
+		}
+
+		public class ButtonColorChangedEventArgs : EventArgs
+		{
+			public static readonly new ButtonColorChangedEventArgs Empty = new ButtonColorChangedEventArgs(0, new MouseEventArgs(MouseButtons.None, 1, 0, 0, 0));
+
+			public ButtonColorChangedEventArgs(byte colorindex, MouseEventArgs e )
+			{
+				ColorIndex = colorindex;
+				MouseEvent = e;
+			}
+
+			public MouseEventArgs MouseEvent;
+			public byte ColorIndex;
+		}
+
+		public event EventHandler<ButtonColorChangedEventArgs> ButtonColorChanged;
+
+		protected virtual void OnButtonColorChanged(ButtonColorChangedEventArgs e)
+		{
+			EventHandler<ButtonColorChangedEventArgs> handler = ButtonColorChanged;
+			if (handler != null)
+			{
+				handler(this, e);
+			}
+		}
+
+		private void color0_MouseClick(object sender, MouseEventArgs e)
+		{
+			OnButtonColorChanged(new ButtonColorChangedEventArgs(0, e));
+
+		}
+
+		private void color1_Click(object sender, EventArgs e)
+		{
+
+		}
+
+		private void color1_MouseClick(object sender, MouseEventArgs e)
+		{
+			OnButtonColorChanged(new ButtonColorChangedEventArgs(1, e));
+		}
+
+		private void color2_MouseClick(object sender, MouseEventArgs e)
+		{
+			OnButtonColorChanged(new ButtonColorChangedEventArgs(2, e));
+		}
+
+		private void color3_MouseClick(object sender, MouseEventArgs e)
+		{
+			OnButtonColorChanged(new ButtonColorChangedEventArgs(3, e));
+		}
+
+		private void color4_MouseClick(object sender, MouseEventArgs e)
+		{
+			OnButtonColorChanged(new ButtonColorChangedEventArgs(4, e));
+		}
+
+		private void color5_MouseClick(object sender, MouseEventArgs e)
+		{
+			OnButtonColorChanged(new ButtonColorChangedEventArgs(5, e));
+		}
+
+		private void color6_MouseClick(object sender, MouseEventArgs e)
+		{
+			OnButtonColorChanged(new ButtonColorChangedEventArgs(6, e));
+		}
+
+		private void color7_MouseClick(object sender, MouseEventArgs e)
+		{
+			OnButtonColorChanged(new ButtonColorChangedEventArgs(7, e));
+		}
+
+		private void color8_MouseClick(object sender, MouseEventArgs e)
+		{
+			OnButtonColorChanged(new ButtonColorChangedEventArgs(8, e));
+		}
+
+		private void color9_MouseClick(object sender, MouseEventArgs e)
+		{
+			OnButtonColorChanged(new ButtonColorChangedEventArgs(9, e));
+		}
+
+		private void color10_MouseClick(object sender, MouseEventArgs e)
+		{
+			OnButtonColorChanged(new ButtonColorChangedEventArgs(10, e));
+		}
+
+		private void color11_Click(object sender, EventArgs e)
+		{
+			
+		}
+
+		private void color11_MouseClick(object sender, MouseEventArgs e)
+		{
+			OnButtonColorChanged(new ButtonColorChangedEventArgs(11, e));
+		}
+
+		private void color12_MouseClick(object sender, MouseEventArgs e)
+		{
+			OnButtonColorChanged(new ButtonColorChangedEventArgs(12, e));
+		}
+
+		private void color13_MouseClick(object sender, MouseEventArgs e)
+		{
+			OnButtonColorChanged(new ButtonColorChangedEventArgs(13, e));
+		}
+
+		private void color14_MouseClick(object sender, MouseEventArgs e)
+		{
+			OnButtonColorChanged(new ButtonColorChangedEventArgs(14, e));
+		}
+
+		private void color15_MouseClick(object sender, MouseEventArgs e)
+		{
+			OnButtonColorChanged(new ButtonColorChangedEventArgs(15, e));
+		}
+	}
+}
diff --git a/source/ColorSelector.resx b/source/ColorSelector.resx
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
+\ No newline at end of file
diff --git a/source/ImageImporter.cs b/source/ImageImporter.cs
@@ -0,0 +1,11 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace AsciiPumper
+{
+	public class ImageImporter
+	{
+
+	}
+}
diff --git a/source/KeypressAction.cs b/source/KeypressAction.cs
@@ -0,0 +1,60 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace AsciiPumper
+{
+	public class KeypressAction : IUndoableAction
+	{
+
+		private struct CharChangeInfo
+		{
+			public int x;
+			public int y;
+			public char origchar;
+			public char newchar;
+
+		}
+		private List<CharChangeInfo> ChangedCharacters = new List<CharChangeInfo>();
+
+		public void AddCharacter(int x, int y, char origchar, char newchar)
+		{
+			foreach (CharChangeInfo info in ChangedCharacters)
+			{
+				if (info.x == x && info.y == y)
+				{
+					ChangedCharacters.Remove(info);
+					break;
+				}
+			}
+			CharChangeInfo newinfo = new CharChangeInfo();
+			newinfo.x = x;
+			newinfo.y = y;
+			newinfo.origchar = origchar;
+			newinfo.newchar = newchar;
+			ChangedCharacters.Add(newinfo);
+		}
+
+		#region IUndoableAction Members
+
+		public void Undo(PaintCanvas canvas)
+		{
+			foreach (CharChangeInfo info in ChangedCharacters)
+			{
+				canvas.CellRows[info.y][info.x].Character = info.origchar;
+			}
+			canvas.CompleteRepaint();
+		}
+
+		public void Redo(PaintCanvas canvas)
+		{
+			foreach (CharChangeInfo info in ChangedCharacters)
+			{
+				canvas.CellRows[info.y][info.x].Character = info.newchar;
+			}
+			canvas.CompleteRepaint();
+		}
+
+		#endregion
+	}
+}
diff --git a/source/MainForm.Designer.cs b/source/MainForm.Designer.cs
@@ -0,0 +1,536 @@
+namespace AsciiPumper
+{
+	partial class MainForm
+	{
+		/// <summary>
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.IContainer components = null;
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+		protected override void Dispose(bool disposing)
+		{
+			if (disposing && (components != null))
+			{
+				components.Dispose();
+			}
+			base.Dispose(disposing);
+		}
+
+		#region Windows Form Designer generated code
+
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+            this.components = new System.ComponentModel.Container();
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
+            this.fontDialog1 = new System.Windows.Forms.FontDialog();
+            this.colorDialog1 = new System.Windows.Forms.ColorDialog();
+            this.splitContainer = new System.Windows.Forms.SplitContainer();
+            this.PaintPanel = new System.Windows.Forms.Panel();
+            this.AsciiPaintCanvas = new AsciiPumper.PaintCanvas();
+            this.txtWatermark = new System.Windows.Forms.TextBox();
+            this.chkWatermark = new System.Windows.Forms.CheckBox();
+            this.panel1 = new System.Windows.Forms.Panel();
+            this.radioRemoveFormatting = new System.Windows.Forms.RadioButton();
+            this.radioUnderline = new System.Windows.Forms.RadioButton();
+            this.radioBold = new System.Windows.Forms.RadioButton();
+            this.radioFill = new System.Windows.Forms.RadioButton();
+            this.radioPaintBrush = new System.Windows.Forms.RadioButton();
+            this.btnCopy = new System.Windows.Forms.Button();
+            this.checkRMBfg = new System.Windows.Forms.CheckBox();
+            this.colorRMB = new System.Windows.Forms.PictureBox();
+            this.lblRMB = new System.Windows.Forms.Label();
+            this.checkMMBfg = new System.Windows.Forms.CheckBox();
+            this.colorMMB = new System.Windows.Forms.PictureBox();
+            this.lblMMB = new System.Windows.Forms.Label();
+            this.lblForeground = new System.Windows.Forms.Label();
+            this.checkLMBfg = new System.Windows.Forms.CheckBox();
+            this.colorLMB = new System.Windows.Forms.PictureBox();
+            this.lblLeftMouseButton = new System.Windows.Forms.Label();
+            this.colorSelector1 = new AsciiPumper.ColorSelector();
+            this.numColumns = new System.Windows.Forms.NumericUpDown();
+            this.lblColumns = new System.Windows.Forms.Label();
+            this.numRows = new System.Windows.Forms.NumericUpDown();
+            this.lblRows = new System.Windows.Forms.Label();
+            this.saveFileDialog = new System.Windows.Forms.SaveFileDialog();
+            this.openFileDialog = new System.Windows.Forms.OpenFileDialog();
+            this.toolTip1 = new System.Windows.Forms.ToolTip(this.components);
+            this.splitContainer.Panel1.SuspendLayout();
+            this.splitContainer.Panel2.SuspendLayout();
+            this.splitContainer.SuspendLayout();
+            this.PaintPanel.SuspendLayout();
+            this.panel1.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.colorRMB)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.colorMMB)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.colorLMB)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.numColumns)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.numRows)).BeginInit();
+            this.SuspendLayout();
+            // 
+            // fontDialog1
+            // 
+            this.fontDialog1.FixedPitchOnly = true;
+            // 
+            // splitContainer
+            // 
+            this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.splitContainer.Location = new System.Drawing.Point(0, 0);
+            this.splitContainer.Name = "splitContainer";
+            // 
+            // splitContainer.Panel1
+            // 
+            this.splitContainer.Panel1.Controls.Add(this.PaintPanel);
+            // 
+            // splitContainer.Panel2
+            // 
+            this.splitContainer.Panel2.Controls.Add(this.txtWatermark);
+            this.splitContainer.Panel2.Controls.Add(this.chkWatermark);
+            this.splitContainer.Panel2.Controls.Add(this.panel1);
+            this.splitContainer.Panel2.Controls.Add(this.btnCopy);
+            this.splitContainer.Panel2.Controls.Add(this.checkRMBfg);
+            this.splitContainer.Panel2.Controls.Add(this.colorRMB);
+            this.splitContainer.Panel2.Controls.Add(this.lblRMB);
+            this.splitContainer.Panel2.Controls.Add(this.checkMMBfg);
+            this.splitContainer.Panel2.Controls.Add(this.colorMMB);
+            this.splitContainer.Panel2.Controls.Add(this.lblMMB);
+            this.splitContainer.Panel2.Controls.Add(this.lblForeground);
+            this.splitContainer.Panel2.Controls.Add(this.checkLMBfg);
+            this.splitContainer.Panel2.Controls.Add(this.colorLMB);
+            this.splitContainer.Panel2.Controls.Add(this.lblLeftMouseButton);
+            this.splitContainer.Panel2.Controls.Add(this.colorSelector1);
+            this.splitContainer.Panel2.Controls.Add(this.numColumns);
+            this.splitContainer.Panel2.Controls.Add(this.lblColumns);
+            this.splitContainer.Panel2.Controls.Add(this.numRows);
+            this.splitContainer.Panel2.Controls.Add(this.lblRows);
+            
+            this.splitContainer.Size = new System.Drawing.Size(978, 438);
+            this.splitContainer.Panel2MinSize = 220;
+            this.splitContainer.SplitterDistance = 751;
+            this.splitContainer.TabIndex = 2;
+            // 
+            // PaintPanel
+            // 
+            this.PaintPanel.AutoScroll = true;
+            this.PaintPanel.Controls.Add(this.AsciiPaintCanvas);
+            this.PaintPanel.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.PaintPanel.Location = new System.Drawing.Point(0, 0);
+            this.PaintPanel.Name = "PaintPanel";
+            this.PaintPanel.Size = new System.Drawing.Size(751, 438);
+            this.PaintPanel.TabIndex = 2;
+            // 
+            // AsciiPaintCanvas
+            // 
+            this.AsciiPaintCanvas.BackColor = System.Drawing.Color.White;
+            this.AsciiPaintCanvas.CausesValidation = false;
+            this.AsciiPaintCanvas.CellHeight = 20;
+            this.AsciiPaintCanvas.CellWidth = 10;
+            new AsciiPumper.ColorPalette().Add(System.Drawing.Color.White);
+            new AsciiPumper.ColorPalette().Add(System.Drawing.Color.Black);
+            new AsciiPumper.ColorPalette().Add(System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(127))))));
+            new AsciiPumper.ColorPalette().Add(System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(147)))), ((int)(((byte)(0))))));
+            new AsciiPumper.ColorPalette().Add(System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))));
+            new AsciiPumper.ColorPalette().Add(System.Drawing.Color.FromArgb(((int)(((byte)(127)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))));
+            new AsciiPumper.ColorPalette().Add(System.Drawing.Color.FromArgb(((int)(((byte)(156)))), ((int)(((byte)(0)))), ((int)(((byte)(156))))));
+            new AsciiPumper.ColorPalette().Add(System.Drawing.Color.FromArgb(((int)(((byte)(252)))), ((int)(((byte)(127)))), ((int)(((byte)(0))))));
+            new AsciiPumper.ColorPalette().Add(System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(0))))));
+            new AsciiPumper.ColorPalette().Add(System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(252)))), ((int)(((byte)(0))))));
+            new AsciiPumper.ColorPalette().Add(System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(147)))), ((int)(((byte)(147))))));
+            new AsciiPumper.ColorPalette().Add(System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))));
+            new AsciiPumper.ColorPalette().Add(System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(252))))));
+            new AsciiPumper.ColorPalette().Add(System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(0)))), ((int)(((byte)(255))))));
+            new AsciiPumper.ColorPalette().Add(System.Drawing.Color.FromArgb(((int)(((byte)(127)))), ((int)(((byte)(127)))), ((int)(((byte)(127))))));
+            new AsciiPumper.ColorPalette().Add(System.Drawing.Color.FromArgb(((int)(((byte)(210)))), ((int)(((byte)(210)))), ((int)(((byte)(210))))));
+            this.AsciiPaintCanvas.Columns = 60;
+            this.AsciiPaintCanvas.DontRepaint = false;
+            this.AsciiPaintCanvas.Font = new System.Drawing.Font("Consolas", 10F);
+            this.AsciiPaintCanvas.HighlightColor = System.Drawing.Color.Salmon;
+            this.AsciiPaintCanvas.HighlightWidth = 2;
+            this.AsciiPaintCanvas.LeftMouseColor = ((byte)(0));
+            this.AsciiPaintCanvas.LeftMouseIsForeground = false;
+            this.AsciiPaintCanvas.Location = new System.Drawing.Point(0, 0);
+            this.AsciiPaintCanvas.MiddleMouseColor = ((byte)(4));
+            this.AsciiPaintCanvas.MiddleMouseIsForeground = true;
+            this.AsciiPaintCanvas.Modified = false;
+            this.AsciiPaintCanvas.MostRecentForegroundColor = ((byte)(4));
+            this.AsciiPaintCanvas.Name = "AsciiPaintCanvas";
+            this.AsciiPaintCanvas.PaintMode = AsciiPumper.PaintCanvas.PaintModes.PaintBrush;
+            this.AsciiPaintCanvas.RightMouseColor = ((byte)(1));
+            this.AsciiPaintCanvas.RightMouseIsForeground = false;
+            this.AsciiPaintCanvas.Rows = 20;
+            this.AsciiPaintCanvas.SelectedCellPosition = new System.Drawing.Point(0, 0);
+            this.AsciiPaintCanvas.SeperatorColor = System.Drawing.Color.DimGray;
+            this.AsciiPaintCanvas.SeperatorWidth = 1;
+            this.AsciiPaintCanvas.Size = new System.Drawing.Size(600, 400);
+            this.AsciiPaintCanvas.TabIndex = 0;
+            // 
+            // txtWatermark
+            // 
+            this.txtWatermark.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtWatermark.Location = new System.Drawing.Point(2, 345);
+            this.txtWatermark.Name = "txtWatermark";
+            this.txtWatermark.Size = new System.Drawing.Size(218, 22);
+            this.txtWatermark.TabIndex = 18;
+            this.txtWatermark.Text = "http://code.google.com/p/asciipumper/ ";
+            this.txtWatermark.Enter += new System.EventHandler(this.txtWatermark_Enter);
+            // 
+            // chkWatermark
+            // 
+            this.chkWatermark.AutoSize = true;
+            this.chkWatermark.Location = new System.Drawing.Point(3, 322);
+            this.chkWatermark.Name = "chkWatermark";
+            this.chkWatermark.Size = new System.Drawing.Size(166, 17);
+            this.chkWatermark.TabIndex = 17;
+            this.chkWatermark.Text = "Hardspace with watermark:";
+            this.chkWatermark.UseVisualStyleBackColor = true;
+            this.chkWatermark.CheckedChanged += new System.EventHandler(this.chkWatermark_CheckedChanged);
+            // 
+            // panel1
+            // 
+            this.panel1.Controls.Add(this.radioRemoveFormatting);
+            this.panel1.Controls.Add(this.radioUnderline);
+            this.panel1.Controls.Add(this.radioBold);
+            this.panel1.Controls.Add(this.radioFill);
+            this.panel1.Controls.Add(this.radioPaintBrush);
+            this.panel1.Location = new System.Drawing.Point(3, 213);
+            this.panel1.Name = "panel1";
+            this.panel1.Size = new System.Drawing.Size(210, 73);
+            this.panel1.TabIndex = 16;
+            // 
+            // radioRemoveFormatting
+            // 
+            this.radioRemoveFormatting.AutoSize = true;
+            this.radioRemoveFormatting.Location = new System.Drawing.Point(4, 50);
+            this.radioRemoveFormatting.Name = "radioRemoveFormatting";
+            this.radioRemoveFormatting.Size = new System.Drawing.Size(123, 17);
+            this.radioRemoveFormatting.TabIndex = 4;
+            this.radioRemoveFormatting.Text = "Remove formatting";
+            this.radioRemoveFormatting.UseVisualStyleBackColor = true;
+            this.radioRemoveFormatting.CheckedChanged += new System.EventHandler(this.radioRemoveFormatting_CheckedChanged);
+            // 
+            // radioUnderline
+            // 
+            this.radioUnderline.AutoSize = true;
+            this.radioUnderline.Location = new System.Drawing.Point(118, 27);
+            this.radioUnderline.Name = "radioUnderline";
+            this.radioUnderline.Size = new System.Drawing.Size(76, 17);
+            this.radioUnderline.TabIndex = 3;
+            this.radioUnderline.Text = "Underline";
+            this.radioUnderline.UseVisualStyleBackColor = true;
+            this.radioUnderline.CheckedChanged += new System.EventHandler(this.radioUnderline_CheckedChanged);
+            // 
+            // radioBold
+            // 
+            this.radioBold.AutoSize = true;
+            this.radioBold.Location = new System.Drawing.Point(118, 4);
+            this.radioBold.Name = "radioBold";
+            this.radioBold.Size = new System.Drawing.Size(49, 17);
+            this.radioBold.TabIndex = 2;
+            this.radioBold.Text = "Bold";
+            this.radioBold.UseVisualStyleBackColor = true;
+            this.radioBold.CheckedChanged += new System.EventHandler(this.radioBold_CheckedChanged);
+            // 
+            // radioFill
+            // 
+            this.radioFill.AutoSize = true;
+            this.radioFill.Location = new System.Drawing.Point(4, 27);
+            this.radioFill.Name = "radioFill";
+            this.radioFill.Size = new System.Drawing.Size(40, 17);
+            this.radioFill.TabIndex = 1;
+            this.radioFill.Text = "Fill";
+            this.radioFill.UseVisualStyleBackColor = true;
+            this.radioFill.CheckedChanged += new System.EventHandler(this.radioFill_CheckedChanged);
+            // 
+            // radioPaintBrush
+            // 
+            this.radioPaintBrush.AutoSize = true;
+            this.radioPaintBrush.Checked = true;
+            this.radioPaintBrush.Location = new System.Drawing.Point(4, 4);
+            this.radioPaintBrush.Name = "radioPaintBrush";
+            this.radioPaintBrush.Size = new System.Drawing.Size(84, 17);
+            this.radioPaintBrush.TabIndex = 0;
+            this.radioPaintBrush.TabStop = true;
+            this.radioPaintBrush.Text = "Paint brush";
+            this.radioPaintBrush.UseVisualStyleBackColor = true;
+            this.radioPaintBrush.CheckedChanged += new System.EventHandler(this.radioPaintBrush_CheckedChanged);
+            // 
+            // btnCopy
+            // 
+            this.btnCopy.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                        | System.Windows.Forms.AnchorStyles.Right)));
+            this.btnCopy.Location = new System.Drawing.Point(0, 292);
+            this.btnCopy.Name = "btnCopy";
+            this.btnCopy.Size = new System.Drawing.Size(218, 23);
+            this.btnCopy.TabIndex = 15;
+            this.btnCopy.Text = "Copy art to clipboard";
+            this.btnCopy.UseVisualStyleBackColor = true;
+            this.btnCopy.Click += new System.EventHandler(this.button1_Click);
+            // 
+            // checkRMBfg
+            // 
+            this.checkRMBfg.AutoSize = true;
+            this.checkRMBfg.Location = new System.Drawing.Point(164, 193);
+            this.checkRMBfg.Name = "checkRMBfg";
+            this.checkRMBfg.Size = new System.Drawing.Size(15, 14);
+            this.checkRMBfg.TabIndex = 14;
+            this.checkRMBfg.UseVisualStyleBackColor = true;
+            this.checkRMBfg.CheckedChanged += new System.EventHandler(this.checkRMBfg_CheckedChanged);
+            // 
+            // colorRMB
+            // 
+            this.colorRMB.BackColor = System.Drawing.SystemColors.ControlDarkDark;
+            this.colorRMB.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+            this.colorRMB.Location = new System.Drawing.Point(121, 187);
+            this.colorRMB.Name = "colorRMB";
+            this.colorRMB.Size = new System.Drawing.Size(20, 20);
+            this.colorRMB.TabIndex = 13;
+            this.colorRMB.TabStop = false;
+            // 
+            // lblRMB
+            // 
+            this.lblRMB.AutoSize = true;
+            this.lblRMB.Location = new System.Drawing.Point(1, 194);
+            this.lblRMB.Name = "lblRMB";
+            this.lblRMB.Size = new System.Drawing.Size(115, 13);
+            this.lblRMB.TabIndex = 12;
+            this.lblRMB.Text = "Right Mouse Button:";
+            // 
+            // checkMMBfg
+            // 
+            this.checkMMBfg.AutoSize = true;
+            this.checkMMBfg.Checked = true;
+            this.checkMMBfg.CheckState = System.Windows.Forms.CheckState.Checked;
+            this.checkMMBfg.Location = new System.Drawing.Point(164, 167);
+            this.checkMMBfg.Name = "checkMMBfg";
+            this.checkMMBfg.Size = new System.Drawing.Size(15, 14);
+            this.checkMMBfg.TabIndex = 11;
+            this.checkMMBfg.UseVisualStyleBackColor = true;
+            this.checkMMBfg.CheckedChanged += new System.EventHandler(this.checkMMBfg_CheckedChanged);
+            // 
+            // colorMMB
+            // 
+            this.colorMMB.BackColor = System.Drawing.SystemColors.ControlDarkDark;
+            this.colorMMB.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+            this.colorMMB.Location = new System.Drawing.Point(121, 161);
+            this.colorMMB.Name = "colorMMB";
+            this.colorMMB.Size = new System.Drawing.Size(20, 20);
+            this.colorMMB.TabIndex = 10;
+            this.colorMMB.TabStop = false;
+            // 
+            // lblMMB
+            // 
+            this.lblMMB.AutoSize = true;
+            this.lblMMB.Location = new System.Drawing.Point(1, 168);
+            this.lblMMB.Name = "lblMMB";
+            this.lblMMB.Size = new System.Drawing.Size(123, 13);
+            this.lblMMB.TabIndex = 9;
+            this.lblMMB.Text = "Middle Mouse Button:";
+            // 
+            // lblForeground
+            // 
+            this.lblForeground.AutoSize = true;
+            this.lblForeground.Location = new System.Drawing.Point(140, 118);
+            this.lblForeground.Name = "lblForeground";
+            this.lblForeground.Size = new System.Drawing.Size(74, 13);
+            this.lblForeground.TabIndex = 8;
+            this.lblForeground.Text = "Foreground?";
+            // 
+            // checkLMBfg
+            // 
+            this.checkLMBfg.AutoSize = true;
+            this.checkLMBfg.Location = new System.Drawing.Point(164, 140);
+            this.checkLMBfg.Name = "checkLMBfg";
+            this.checkLMBfg.Size = new System.Drawing.Size(15, 14);
+            this.checkLMBfg.TabIndex = 7;
+            this.checkLMBfg.UseVisualStyleBackColor = true;
+            this.checkLMBfg.CheckedChanged += new System.EventHandler(this.checkLMBfg_CheckedChanged);
+            // 
+            // colorLMB
+            // 
+            this.colorLMB.BackColor = System.Drawing.SystemColors.ControlDarkDark;
+            this.colorLMB.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+            this.colorLMB.Location = new System.Drawing.Point(121, 134);
+            this.colorLMB.Name = "colorLMB";
+            this.colorLMB.Size = new System.Drawing.Size(20, 20);
+            this.colorLMB.TabIndex = 6;
+            this.colorLMB.TabStop = false;
+            // 
+            // lblLeftMouseButton
+            // 
+            this.lblLeftMouseButton.AutoSize = true;
+            this.lblLeftMouseButton.Location = new System.Drawing.Point(1, 141);
+            this.lblLeftMouseButton.Name = "lblLeftMouseButton";
+            this.lblLeftMouseButton.Size = new System.Drawing.Size(106, 13);
+            this.lblLeftMouseButton.TabIndex = 5;
+            this.lblLeftMouseButton.Text = "Left Mouse Button:";
+            // 
+            // colorSelector1
+            // 
+            new AsciiPumper.ColorPalette().Add(System.Drawing.Color.White);
+            new AsciiPumper.ColorPalette().Add(System.Drawing.Color.Black);
+            new AsciiPumper.ColorPalette().Add(System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(127))))));
+            new AsciiPumper.ColorPalette().Add(System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(147)))), ((int)(((byte)(0))))));
+            new AsciiPumper.ColorPalette().Add(System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))));
+            new AsciiPumper.ColorPalette().Add(System.Drawing.Color.FromArgb(((int)(((byte)(127)))), ((int)(((byte)(0)))), ((int)(((byte)(0))))));
+            new AsciiPumper.ColorPalette().Add(System.Drawing.Color.FromArgb(((int)(((byte)(156)))), ((int)(((byte)(0)))), ((int)(((byte)(156))))));
+            new AsciiPumper.ColorPalette().Add(System.Drawing.Color.FromArgb(((int)(((byte)(252)))), ((int)(((byte)(127)))), ((int)(((byte)(0))))));
+            new AsciiPumper.ColorPalette().Add(System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(255)))), ((int)(((byte)(0))))));
+            new AsciiPumper.ColorPalette().Add(System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(252)))), ((int)(((byte)(0))))));
+            new AsciiPumper.ColorPalette().Add(System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(147)))), ((int)(((byte)(147))))));
+            new AsciiPumper.ColorPalette().Add(System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(255)))), ((int)(((byte)(255))))));
+            new AsciiPumper.ColorPalette().Add(System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(0)))), ((int)(((byte)(252))))));
+            new AsciiPumper.ColorPalette().Add(System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(0)))), ((int)(((byte)(255))))));
+            new AsciiPumper.ColorPalette().Add(System.Drawing.Color.FromArgb(((int)(((byte)(127)))), ((int)(((byte)(127)))), ((int)(((byte)(127))))));
+            new AsciiPumper.ColorPalette().Add(System.Drawing.Color.FromArgb(((int)(((byte)(210)))), ((int)(((byte)(210)))), ((int)(((byte)(210))))));
+            this.colorSelector1.Location = new System.Drawing.Point(3, 51);
+            this.colorSelector1.Name = "colorSelector1";
+            this.colorSelector1.Size = new System.Drawing.Size(209, 54);
+            this.colorSelector1.TabIndex = 4;
+            this.colorSelector1.ButtonColorChanged += new System.EventHandler<AsciiPumper.ColorSelector.ButtonColorChangedEventArgs>(this.colorSelector1_ButtonColorChanged);
+            // 
+            // numColumns
+            // 
+            this.numColumns.Location = new System.Drawing.Point(106, 16);
+            this.numColumns.Maximum = new decimal(new int[] {
+            10000,
+            0,
+            0,
+            0});
+            this.numColumns.Minimum = new decimal(new int[] {
+            1,
+            0,
+            0,
+            0});
+            this.numColumns.Name = "numColumns";
+            this.numColumns.Size = new System.Drawing.Size(46, 22);
+            this.numColumns.TabIndex = 3;
+            this.numColumns.Value = new decimal(new int[] {
+            80,
+            0,
+            0,
+            0});
+            this.numColumns.ValueChanged += new System.EventHandler(this.numColumns_ValueChanged);
+            // 
+            // lblColumns
+            // 
+            this.lblColumns.AutoSize = true;
+            this.lblColumns.Location = new System.Drawing.Point(103, 0);
+            this.lblColumns.Name = "lblColumns";
+            this.lblColumns.Size = new System.Drawing.Size(55, 13);
+            this.lblColumns.TabIndex = 2;
+            this.lblColumns.Text = "Columns:";
+            // 
+            // numRows
+            // 
+            this.numRows.Location = new System.Drawing.Point(44, 23);
+            this.numRows.Maximum = new decimal(new int[] {
+            10000,
+            0,
+            0,
+            0});
+            this.numRows.Minimum = new decimal(new int[] {
+            1,
+            0,
+            0,
+            0});
+            this.numRows.Name = "numRows";
+            this.numRows.Size = new System.Drawing.Size(46, 22);
+            this.numRows.TabIndex = 1;
+            this.numRows.Value = new decimal(new int[] {
+            50,
+            0,
+            0,
+            0});
+            this.numRows.ValueChanged += new System.EventHandler(this.numRows_ValueChanged);
+            // 
+            // lblRows
+            // 
+            this.lblRows.AutoSize = true;
+            this.lblRows.Location = new System.Drawing.Point(6, 25);
+            this.lblRows.Name = "lblRows";
+            this.lblRows.Size = new System.Drawing.Size(38, 13);
+            this.lblRows.TabIndex = 0;
+            this.lblRows.Text = "Rows:";
+            // 
+            // saveFileDialog
+            // 
+            this.saveFileDialog.DefaultExt = "txt";
+            this.saveFileDialog.Filter = "Text files|*.txt|All files|*.*";
+            // 
+            // openFileDialog
+            // 
+            this.openFileDialog.DefaultExt = "txt";
+            this.openFileDialog.Filter = "Text files|*.txt|All files|*.*";
+            // 
+            // MainForm
+            // 
+            this.ClientSize = new System.Drawing.Size(978, 438);
+            this.Controls.Add(this.splitContainer);
+            this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+            this.Name = "MainForm";
+            this.Text = "Ascii Pumper";
+            this.WindowState = System.Windows.Forms.FormWindowState.Maximized;
+            this.Load += new System.EventHandler(this.MainForm_Load);
+            this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing);
+            this.Resize += new System.EventHandler(this.MainForm_Resize);
+            this.splitContainer.Panel1.ResumeLayout(false);
+            this.splitContainer.Panel2.ResumeLayout(false);
+            this.splitContainer.Panel2.PerformLayout();
+            this.splitContainer.ResumeLayout(false);
+            this.PaintPanel.ResumeLayout(false);
+            this.panel1.ResumeLayout(false);
+            this.panel1.PerformLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.colorRMB)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.colorMMB)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.colorLMB)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.numColumns)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.numRows)).EndInit();
+            this.ResumeLayout(false);
+
+		}
+
+		#endregion
+
+		private System.Windows.Forms.FontDialog fontDialog1;
+		private System.Windows.Forms.ColorDialog colorDialog1;
+		private System.Windows.Forms.SplitContainer splitContainer;
+		private System.Windows.Forms.Panel PaintPanel;
+		private PaintCanvas AsciiPaintCanvas;
+		private System.Windows.Forms.NumericUpDown numColumns;
+		private System.Windows.Forms.Label lblColumns;
+		private System.Windows.Forms.NumericUpDown numRows;
+		private System.Windows.Forms.Label lblRows;
+		private ColorSelector colorSelector1;
+		private System.Windows.Forms.Label lblLeftMouseButton;
+		private System.Windows.Forms.PictureBox colorLMB;
+		private System.Windows.Forms.CheckBox checkRMBfg;
+		private System.Windows.Forms.PictureBox colorRMB;
+		private System.Windows.Forms.Label lblRMB;
+		private System.Windows.Forms.CheckBox checkMMBfg;
+		private System.Windows.Forms.PictureBox colorMMB;
+		private System.Windows.Forms.Label lblMMB;
+		private System.Windows.Forms.Label lblForeground;
+		private System.Windows.Forms.CheckBox checkLMBfg;
+		private System.Windows.Forms.Button btnCopy;
+		private System.Windows.Forms.SaveFileDialog saveFileDialog;
+		private System.Windows.Forms.OpenFileDialog openFileDialog;
+		private System.Windows.Forms.Panel panel1;
+		private System.Windows.Forms.RadioButton radioFill;
+		private System.Windows.Forms.RadioButton radioPaintBrush;
+		private System.Windows.Forms.CheckBox chkWatermark;
+		private System.Windows.Forms.ToolTip toolTip1;
+		private System.Windows.Forms.TextBox txtWatermark;
+		private System.Windows.Forms.RadioButton radioRemoveFormatting;
+		private System.Windows.Forms.RadioButton radioUnderline;
+		private System.Windows.Forms.RadioButton radioBold;
+	}
+}
+
diff --git a/source/MainForm.cs b/source/MainForm.cs
@@ -0,0 +1,575 @@
+#region Copyright (c) 2007, PP4L Software
+/************************************************************************************
+
+Copyright  2007, PP4L Software
+Author:	Lampiasis <lampiasis@dvolker.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+'***********************************************************************************/
+#endregion
+
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using System.Reflection;
+using System.Runtime;
+using System.Diagnostics;
+using System.IO;
+using System.Drawing.Printing;
+
+
+namespace AsciiPumper
+{
+	public partial class MainForm : Form
+	{
+
+		public void Undo()
+		{
+			AsciiPaintCanvas.Undo();
+		}
+
+		public void Redo()
+		{
+			AsciiPaintCanvas.Redo();
+		}
+
+		public Stack<IUndoableAction> UndoList
+		{
+			get { return AsciiPaintCanvas.UndoList; }
+		}
+
+		public Stack<IUndoableAction> RedoList
+		{
+			get { return AsciiPaintCanvas.RedoList; }
+		}
+
+		private string m_FileName = "(Untitled)";
+
+		/// <summary>
+		/// Gets or sets the FileName.
+		/// </summary>
+		public string FileName
+		{
+			get { return m_FileName; }
+			set { m_FileName = value; this.Text = m_FileName + (m_FileModified ? "" : "*"); } 
+		}
+
+		private bool m_FileModified = false;
+
+		/// <summary>
+		/// Gets or sets the FileModified.
+		/// </summary>
+		public bool FileModified
+		{
+			get { return m_FileModified; }
+			set {
+				m_FileModified = value;
+				if (value == true)
+					this.Text = m_FileName + "*";
+				else
+				{
+					this.Text = m_FileName;
+					AsciiPaintCanvas.Modified = false;
+				}
+			}
+		}
+
+		public void LoadStream(Stream stream)
+		{
+			m_LoadingFile = true;
+			
+			AsciiPaintCanvas.DontRepaint = true;
+			try
+			{
+				AsciiPaintCanvas.LoadStream(stream);
+				numColumns.Value = AsciiPaintCanvas.Columns;
+				numRows.Value = AsciiPaintCanvas.Rows;
+				m_LoadingFile = false;
+			}
+			finally
+			{
+				AsciiPaintCanvas.DontRepaint = false;
+				AsciiPaintCanvas.CompleteRepaint();
+
+			}
+			
+		}
+
+
+
+		public MainForm()
+		{
+			InitializeComponent();
+			//this.Icon = new Icon(typeof(MainForm), "MainIcon");
+
+			AsciiPaintCanvas.Columns = (int)numColumns.Value;
+			AsciiPaintCanvas.Rows = (int)numRows.Value;
+			ColorPalette pal = AsciiPaintCanvas.Colors;
+			colorLMB.BackColor = pal[AsciiPaintCanvas.LeftMouseColor];
+			colorMMB.BackColor = pal[AsciiPaintCanvas.MiddleMouseColor];
+			colorRMB.BackColor = pal[AsciiPaintCanvas.RightMouseColor];
+			//AsciiPumper.Properties.Settings.Default.
+
+			/*AsciiPaintCanvas.Font = new Font("Consolas", 10);
+			if (AsciiPaintCanvas.Font.Name != "Consolas")
+				AsciiPaintCanvas.Font = new Font("Fixedsys", 9);
+			*/
+			this.AsciiPaintCanvas.Font = new Font((string) Program.Settings["PaintFontName"] , (float) Program.Settings["PaintFontSize"]);
+			AsciiPaintCanvas.CellWidth = (int)Program.Settings["CellWidth"];
+			AsciiPaintCanvas.CellHeight = (int)Program.Settings["CellHeight"];
+			numColumns.Value = (int)Program.Settings["Columns"];
+			numRows.Value = (int)Program.Settings["Rows"];
+			ColorSelector.ButtonColorChangedEventArgs ea = new ColorSelector.ButtonColorChangedEventArgs((byte)Program.Settings["LMBColor"], new MouseEventArgs(MouseButtons.Left, 0, 0, 0, 0));
+			this.colorSelector1_ButtonColorChanged(this, ea);
+			ea = new ColorSelector.ButtonColorChangedEventArgs((byte)Program.Settings["MMBColor"], new MouseEventArgs(MouseButtons.Middle, 0, 0, 0, 0));
+			this.colorSelector1_ButtonColorChanged(this, ea);
+			ea = new ColorSelector.ButtonColorChangedEventArgs((byte)Program.Settings["RMBColor"], new MouseEventArgs(MouseButtons.Right, 0, 0, 0, 0));
+			this.colorSelector1_ButtonColorChanged(this, ea);
+			
+
+			this.checkLMBfg.Checked = Program.Settings.LMBIsForeground;
+			this.checkMMBfg.Checked = Program.Settings.MMBIsForeground;
+			this.checkRMBfg.Checked = Program.Settings.RMBIsForeground;
+			//P//rogram.Settings.PropertyChanged += new PropertyChangedEventHandler(Settings_PropertyChanged);
+
+			this.chkWatermark.Checked = Program.Settings.ShouldWatermark;
+
+			AsciiPaintCanvas.CanvasModified += new EventHandler<PaintCanvas.CanvasModifiedEventArgs>(AsciiPaintCanvas_CanvasModified);
+			AsciiPaintCanvas.UndoChanged += new EventHandler<PaintCanvas.UndoChangedEventArgs>(AsciiPaintCanvas_UndoChanged);
+			AsciiPaintCanvas.RedoChanged += new EventHandler<PaintCanvas.RedoChangedEventArgs>(AsciiPaintCanvas_RedoChanged);
+		}
+
+		void AsciiPaintCanvas_RedoChanged(object sender, PaintCanvas.RedoChangedEventArgs e)
+		{
+			OnRedoChanged(RedoChangedEventArgs.Empty);
+		}
+
+		void AsciiPaintCanvas_UndoChanged(object sender, PaintCanvas.UndoChangedEventArgs e)
+		{
+			OnUndoChanged(UndoChangedEventArgs.Empty);
+		}
+
+		public class UndoChangedEventArgs : EventArgs
+		{
+			public static readonly new UndoChangedEventArgs Empty = new UndoChangedEventArgs();
+		}
+
+		public event EventHandler<UndoChangedEventArgs> UndoChanged;
+
+		protected virtual void OnUndoChanged(UndoChangedEventArgs e)
+		{
+			EventHandler<UndoChangedEventArgs> handler = UndoChanged;
+			if (handler != null)
+			{
+				handler(this, e);
+			}
+		}
+
+		public class RedoChangedEventArgs : EventArgs
+		{
+			public static readonly new RedoChangedEventArgs Empty = new RedoChangedEventArgs();
+		}
+
+		public event EventHandler<RedoChangedEventArgs> RedoChanged;
+
+		protected virtual void OnRedoChanged(RedoChangedEventArgs e)
+		{
+			EventHandler<RedoChangedEventArgs> handler = RedoChanged;
+			if (handler != null)
+			{
+				handler(this, e);
+			}
+		}
+
+		void AsciiPaintCanvas_CanvasModified(object sender, PaintCanvas.CanvasModifiedEventArgs e)
+		{
+			FileModified = true;
+		}
+
+		void Settings_PropertyChanged(object sender, PropertyChangedEventArgs e)
+		{
+			//AsciiPaintCanvas.CompleteRepaint();
+		}
+
+		private void MainForm_Load(object sender, EventArgs e)
+		{
+			
+		}
+
+		private void numColumns_ValueChanged(object sender, EventArgs e)
+		{
+			if ( !this.m_LoadingFile )
+				AsciiPaintCanvas.Columns = (int) numColumns.Value;
+
+		}
+
+		private void numRows_ValueChanged(object sender, EventArgs e)
+		{
+			if ( !this.m_LoadingFile )
+				AsciiPaintCanvas.Rows = (int) numRows.Value;
+		}
+
+		private void colorSelector1_ButtonColorChanged(object sender, ColorSelector.ButtonColorChangedEventArgs e)
+		{
+			switch (e.MouseEvent.Button)
+			{
+							
+				case MouseButtons.Left:
+					AsciiPaintCanvas.LeftMouseColor = e.ColorIndex;
+					colorLMB.BackColor = colorSelector1.Colors[e.ColorIndex];
+					Program.Settings.LMBColor = e.ColorIndex;
+					break;
+				case MouseButtons.Middle:
+					AsciiPaintCanvas.MiddleMouseColor = e.ColorIndex;
+					colorMMB.BackColor = colorSelector1.Colors[e.ColorIndex];
+					Program.Settings.MMBColor = e.ColorIndex;
+					break;
+				case MouseButtons.Right:
+					AsciiPaintCanvas.RightMouseColor = e.ColorIndex;
+					colorRMB.BackColor = colorSelector1.Colors[e.ColorIndex];
+					Program.Settings.RMBColor = e.ColorIndex;
+					break;
+				default:
+					throw new Exception("Invalid mouse button color changed.");
+			}
+		}
+
+		public const string WaterMark = "http://code.google.com/p/asciipumper/ ";
+
+		public char WatermarkCharAtPos(int pos)
+		{
+			string watermark = txtWatermark.Text;
+			if (watermark == "")
+				watermark = WaterMark;
+
+			return watermark[pos % watermark.Length];
+		}
+		
+		private const char ColorControl = '\x0003';
+		private const char UnderlineControl = '\x001F';
+		private const char BoldControl = '\x0002';
+		private const char PlainControl = '\x000F';
+		private const char ReverseControl = '\x0016';
+
+		public string GetIRCString( bool watermark)
+		{
+			StringBuilder sb = new StringBuilder();
+			CellInfo lastcell;
+			int rowcount = 0;
+			
+
+			foreach (List<CellInfo> row in AsciiPaintCanvas.CellRows)
+			{
+				rowcount++;
+				if (rowcount > AsciiPaintCanvas.Rows)
+					break;
+
+				// something that will not be used normally so that color is always printed at beginning of line
+				lastcell = new CellInfo('z', 100, 100);
+
+				int cellcount = 0;
+				
+				foreach (CellInfo cell in row)
+				{	// FIXME: check for digits and use two digit color code.
+					cellcount++;
+					if (cellcount > AsciiPaintCanvas.Columns)
+						break;
+					if (lastcell.Bold != cell.Bold)
+						sb.Append(BoldControl);
+					if (lastcell.Underlined != cell.Underlined)
+						sb.Append(UnderlineControl);
+					if (cell.Character == ' ' && watermark)
+					{
+						cell.ForeColor = cell.BackColor;
+						char character = WatermarkCharAtPos(cellcount - 1);
+						if (lastcell.BackColor != cell.BackColor || lastcell.ForeColor != cell.BackColor)
+						{
+							if (cell.BackColor < 10 && char.IsDigit(character))
+								sb.AppendFormat(ColorControl + "{0},0{1}{2}", cell.ForeColor, cell.BackColor, character);
+							else
+								sb.AppendFormat(ColorControl + "{0},{1}{2}", cell.ForeColor, cell.BackColor, character);
+						}
+						else
+							sb.Append(character);
+					}
+					else if (lastcell.BackColor != cell.BackColor)
+					{
+						if (char.IsDigit(cell.Character) || cell.Character == ',' )
+						{
+							if (cell.BackColor < 10 && char.IsDigit(cell.Character))
+								sb.AppendFormat(ColorControl + "{0},0{1}{2}", cell.ForeColor, cell.BackColor, cell.Character);
+							else
+								sb.AppendFormat(ColorControl + "{0},{1}{2}", cell.ForeColor, cell.BackColor, cell.Character);
+						}
+						else
+							sb.AppendFormat(ColorControl + "{0},{1}{2}", cell.ForeColor, cell.BackColor, cell.Character);
+					}
+					else if (lastcell.ForeColor != cell.ForeColor)
+					{
+						if (char.IsDigit(cell.Character))
+						{
+							if (cell.ForeColor < 10 && char.IsDigit(cell.Character))
+								sb.AppendFormat(ColorControl + "0{0}{1}", cell.ForeColor, cell.Character);
+							else
+								sb.AppendFormat(ColorControl + "{0}{1}", cell.ForeColor, cell.Character);
+						}
+						else if (cell.Character == ',')
+						{
+							if (cell.BackColor < 10 && char.IsDigit(cell.Character))
+								sb.AppendFormat(ColorControl + "{0},0{1}{2}", cell.ForeColor, cell.BackColor, cell.Character);
+							else
+								sb.AppendFormat(ColorControl + "{0},{1}{2}", cell.ForeColor, cell.BackColor, cell.Character);
+						}
+						else
+							sb.AppendFormat(ColorControl + "{0}{1}", cell.ForeColor, cell.Character);
+					}
+					else
+						sb.Append(cell.Character);
+					lastcell = cell;
+				}
+				sb.Append("\r\n");
+			}
+			return sb.ToString();
+		}
+    
+
+		private void button1_Click(object sender, EventArgs e)
+		{
+
+			Cursor cur = Cursor.Current;
+			Cursor.Current = Cursors.WaitCursor;
+			try
+			{
+				Clipboard.SetText(GetIRCString(chkWatermark.Checked), TextDataFormat.Text);
+			}
+			finally
+			{
+				Cursor.Current = cur;
+			}
+			
+		}
+
+		private void aboutToolStripMenuItem_Click(object sender, EventArgs e)
+		{
+			AboutBox1 about = new AboutBox1();
+			about.ShowDialog(this);
+		}
+
+		public void SaveDocument()
+		{
+			if ( File.Exists(m_FileName) )
+			{
+				Stream stream = File.OpenWrite(m_FileName);
+				StreamWriter writer = new StreamWriter(stream);
+				writer.WriteLine(GetIRCString(false));
+
+				writer.Close();
+				this.FileModified = false;
+			}
+			else
+				saveAsToolStripMenuItem_Click(this, EventArgs.Empty);
+		}
+
+		private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
+		{
+			if (AsciiPaintCanvas.Modified == true)
+			{
+				DialogResult res = MessageBox.Show(this, m_FileName + " has been modified. Would you like to save changes?", "Save changes?", MessageBoxButtons.YesNoCancel);
+				if (res == DialogResult.Yes)
+				{
+					if ( File.Exists(m_FileName) )
+					{
+						Stream stream = File.OpenWrite(m_FileName);
+						StreamWriter writer = new StreamWriter(stream);
+						writer.WriteLine(GetIRCString(false));
+
+						writer.Close();
+						this.m_FileModified = false;
+					}
+					else
+						saveAsToolStripMenuItem_Click(this, EventArgs.Empty);
+				}
+				else if (res == DialogResult.Cancel)
+				{
+					e.Cancel = true;
+				}
+				else if (res == DialogResult.No)
+				{
+
+				}
+			}
+
+			Program.Settings.PropertyChanged -= new PropertyChangedEventHandler(Settings_PropertyChanged);
+
+			Program.Settings.LMBIsForeground = checkLMBfg.Checked;
+			Program.Settings.MMBIsForeground = checkMMBfg.Checked;
+			Program.Settings.RMBIsForeground = checkRMBfg.Checked;
+
+			Program.Settings.ShouldWatermark = chkWatermark.Checked;
+
+			Program.Settings.Save();
+		}
+
+		private void checkLMBfg_CheckedChanged(object sender, EventArgs e)
+		{
+			AsciiPaintCanvas.LeftMouseIsForeground = checkLMBfg.Checked;
+
+		}
+
+		private void checkMMBfg_CheckedChanged(object sender, EventArgs e)
+		{
+			AsciiPaintCanvas.MiddleMouseIsForeground = checkMMBfg.Checked;
+		}
+
+		private void checkRMBfg_CheckedChanged(object sender, EventArgs e)
+		{
+			AsciiPaintCanvas.RightMouseIsForeground = checkRMBfg.Checked;
+		}
+
+		private void linklabelVersion_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
+		{
+			ProcessStartInfo pi = new ProcessStartInfo("http://code.google.com/p/asciipumper/");
+			Process.Start(pi);
+		}
+
+		private void saveAsToolStripMenuItem_Click(object sender, EventArgs e)
+		{
+			DialogResult res = saveFileDialog.ShowDialog(this);
+			if (res == DialogResult.OK)
+			{
+				Stream stream = saveFileDialog.OpenFile();
+				FileName = saveFileDialog.FileName;
+				StreamWriter writer = new  StreamWriter(stream);
+				writer.WriteLine(GetIRCString(false));
+				
+				writer.Close();
+				this.FileModified = false;
+			
+			}
+		}
+
+		private bool m_LoadingFile = false;
+
+		private void openToolStripMenuItem_Click(object sender, EventArgs e)
+		{
+			DialogResult res = openFileDialog.ShowDialog(this);
+			if (res == DialogResult.OK)
+			{
+				Cursor cur = Cursor.Current;
+				Cursor.Current = Cursors.WaitCursor;
+				try
+				{
+					m_LoadingFile = true;
+					Stream stream = openFileDialog.OpenFile();
+					AsciiPaintCanvas.LoadStream(stream);
+					stream.Close();
+					numColumns.Value = AsciiPaintCanvas.Columns;
+					numRows.Value = AsciiPaintCanvas.Rows;
+					m_LoadingFile = false;
+				}
+				finally
+				{
+					Cursor.Current = cur;
+				}
+				
+
+			}
+		}
+
+		private void optionsToolStripMenuItem_Click(object sender, EventArgs e)
+		{
+			
+
+		}
+
+		void form_SettingsSaved(object sender, OptionsForm.SettingsSavedEventArgs e)
+		{
+			AsciiPaintCanvas.CompleteRepaint();
+		}
+
+		public void RepaintCanvas()
+		{
+			AsciiPaintCanvas.CompleteRepaint();
+		}
+
+		private void exitToolStripMenuItem_Click(object sender, EventArgs e)
+		{
+			this.Close();
+		}
+
+		private void radioPaintBrush_CheckedChanged(object sender, EventArgs e)
+		{
+			if (radioPaintBrush.Checked)
+				AsciiPaintCanvas.PaintMode = PaintCanvas.PaintModes.PaintBrush;
+		}
+
+		private void radioFill_CheckedChanged(object sender, EventArgs e)
+		{
+			if (radioFill.Checked)
+				AsciiPaintCanvas.PaintMode = PaintCanvas.PaintModes.Fill;
+		}
+
+		private void MainForm_Resize(object sender, EventArgs e)
+		{
+
+		}
+
+		private void chkWatermark_CheckedChanged(object sender, EventArgs e)
+		{
+
+		}
+
+		public void ImportImage(string filename)
+		{
+			AsciiPaintCanvas.ImportImage(filename);
+			numColumns.Value = AsciiPaintCanvas.Columns;
+			numRows.Value = AsciiPaintCanvas.Rows;
+		}
+
+		private void txtWatermark_Enter(object sender, EventArgs e)
+		{
+			txtWatermark.SelectAll();
+		}
+
+		public void PrintToGraphicDevice(Graphics graphics, PrintPageEventArgs e)
+		{
+			AsciiPaintCanvas.PrintToGraphicDevice(graphics, e);
+		}
+
+		private void radioBold_CheckedChanged(object sender, EventArgs e)
+		{
+			if (radioBold.Checked == true)
+				AsciiPaintCanvas.PaintMode = PaintCanvas.PaintModes.Bold;
+		}
+
+		private void radioUnderline_CheckedChanged(object sender, EventArgs e)
+		{
+			if (radioUnderline.Checked == true)
+				AsciiPaintCanvas.PaintMode = PaintCanvas.PaintModes.Underline;
+		}
+
+		private void radioRemoveFormatting_CheckedChanged(object sender, EventArgs e)
+		{
+			if (radioRemoveFormatting.Checked == true)
+				AsciiPaintCanvas.PaintMode = PaintCanvas.PaintModes.RemoveFormatting;
+		}
+	}
+}
+\ No newline at end of file
diff --git a/source/MainForm.resx b/source/MainForm.resx
@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="fontDialog1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <metadata name="colorDialog1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>133, 17</value>
+  </metadata>
+  <metadata name="saveFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>254, 17</value>
+  </metadata>
+  <metadata name="openFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>498, 17</value>
+  </metadata>
+  <metadata name="toolTip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>631, 17</value>
+  </metadata>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAABAAIAEBAQAAAABAAoAQAAJgAAACAgEAAAAAQA6AIAAE4BAAAoAAAAEAAAACAAAAABAAQAAAAAAIAA
+        AAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/
+        AAAA//8A/wAAAP8A/wD//wAA////AACIiIgAAAAAAIiIiAAAAAAACZmQAAzMAAAJmZAAzMwAAAmZkADM
+        zAAACZmQAAzMAAAJmZAAAHAAAAmZkAAAcAAACZmQAAB3AAAJmZAAAAcAAAmZkAAABwAACZmQAAB3AAAA
+        mQAAB3AAAAAHAAB3AAAAAAd3d3AAAAAAAAAAAAAAwP8AAMD/AADh4wAA4cMAAOHDAADh4wAA4fcAAOH3
+        AADh8wAA4fsAAOH7AADh8wAA8+cAAPvPAAD4HwAA//8AACgAAAAgAAAAQAAAAAEABAAAAAAAAAIAAAAA
+        AAAAAAAAEAAAABAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD/
+        /wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAACIiIiIiIAAAAAAAAAAAAAACIiIiIgAAA
+        AAAAAAAAAAAAiIiIiIAAAAAAAAAAAAAAAAiIiIgAAAAAAAAAAAAAAAAAmZmQAAAAAAAAAAAAAAAAAJmZ
+        kAAAAADMwAAAAAAAAACZmZAAAAAMzMwAAAAAAAAAmZmQAAAAzMzMwAAAAAAAAJmZkAAAAMzMzMAAAAAA
+        AACZmZAAAADMzMzAAAAAAAAAmZmQAAAAzMzMwAAAAAAAAJmZkAAAAAzMzAAAAAAAAACZmZAAAAAMzMwA
+        AAAAAAAAmZmQAAAADMzMAAAAAAAAAJmZkAAAAAAHAAAAAAAAAACZmZAAAAAAB3AAAAAAAAAAmZmQAAAA
+        AABwAAAAAAAAAJmZkAAAAAAAcAAAAAAAAACZmZAAAAAAB3AAAAAAAAAAmZmQAAAAAAcAAAAAAAAAAJmZ
+        kAAAAAAHAAAAAAAAAACZmZAAAAAABwAAAAAAAAAAmZmQAAAAAAcAAAAAAAAAAJmZkAAAAAAHAAAAAAAA
+        AACZmZAAAAAAdwAAAAAAAAAACZkAAAAAB3AAAAAAAAAAAABwAAAAAAcAAAAAAAAAAAAAcAAAAAB3AAAA
+        AAAAAAAAAHcAAAAHcAAAAAAAAAAAAAAHd3d3dwAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////+AD///wB
+        ///8Af///gP///8H////B/x//wf4P/8H8B//B/Af/wfwH/8H8B//B/g//wf4P/8H+D//B/7//wf+f/8H
+        /3//B/9//wf+f/8H/v//B/7//wf+//8H/v//B/7//wf8//+P+f//3/v//9/z///P5///4A///////w==
+</value>
+  </data>
+</root>
+\ No newline at end of file
diff --git a/source/OptionsForm.Designer.cs b/source/OptionsForm.Designer.cs
@@ -0,0 +1,444 @@
+namespace AsciiPumper
+{
+	partial class OptionsForm
+	{
+		/// <summary>
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.IContainer components = null;
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+		protected override void Dispose(bool disposing)
+		{
+			if (disposing && (components != null))
+			{
+				components.Dispose();
+			}
+			base.Dispose(disposing);
+		}
+
+		#region Windows Form Designer generated code
+
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+			this.splitContainer1 = new System.Windows.Forms.SplitContainer();
+			this.lbCategories = new System.Windows.Forms.ListBox();
+			this.grpEditor = new System.Windows.Forms.GroupBox();
+			this.tableEditor = new System.Windows.Forms.TableLayoutPanel();
+			this.lblEditorFont = new System.Windows.Forms.Label();
+			this.lblSampleText = new System.Windows.Forms.Label();
+			this.btnEditorFont = new System.Windows.Forms.Button();
+			this.lblCellWidth = new System.Windows.Forms.Label();
+			this.panel1 = new System.Windows.Forms.Panel();
+			this.lblPx1 = new System.Windows.Forms.Label();
+			this.numCellWidth = new System.Windows.Forms.NumericUpDown();
+			this.lblCellHeight = new System.Windows.Forms.Label();
+			this.panel2 = new System.Windows.Forms.Panel();
+			this.lblPx2 = new System.Windows.Forms.Label();
+			this.numCellHeight = new System.Windows.Forms.NumericUpDown();
+			this.lblSeperatorColor = new System.Windows.Forms.Label();
+			this.panel3 = new System.Windows.Forms.Panel();
+			this.btnSeperatorColor = new System.Windows.Forms.Button();
+			this.colorSeperator = new System.Windows.Forms.PictureBox();
+			this.lblHighlightColor = new System.Windows.Forms.Label();
+			this.panel4 = new System.Windows.Forms.Panel();
+			this.btnHighlightColor = new System.Windows.Forms.Button();
+			this.colorHighlight = new System.Windows.Forms.PictureBox();
+			this.btnOK = new System.Windows.Forms.Button();
+			this.btnApply = new System.Windows.Forms.Button();
+			this.btnCancel = new System.Windows.Forms.Button();
+			this.fontdlgEditorFont = new System.Windows.Forms.FontDialog();
+			this.colordlgSeperator = new System.Windows.Forms.ColorDialog();
+			this.colordlgHighlight = new System.Windows.Forms.ColorDialog();
+			this.splitContainer1.Panel1.SuspendLayout();
+			this.splitContainer1.Panel2.SuspendLayout();
+			this.splitContainer1.SuspendLayout();
+			this.grpEditor.SuspendLayout();
+			this.tableEditor.SuspendLayout();
+			this.panel1.SuspendLayout();
+			((System.ComponentModel.ISupportInitialize)(this.numCellWidth)).BeginInit();
+			this.panel2.SuspendLayout();
+			((System.ComponentModel.ISupportInitialize)(this.numCellHeight)).BeginInit();
+			this.panel3.SuspendLayout();
+			((System.ComponentModel.ISupportInitialize)(this.colorSeperator)).BeginInit();
+			this.panel4.SuspendLayout();
+			((System.ComponentModel.ISupportInitialize)(this.colorHighlight)).BeginInit();
+			this.SuspendLayout();
+			// 
+			// splitContainer1
+			// 
+			this.splitContainer1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+						| System.Windows.Forms.AnchorStyles.Left)
+						| System.Windows.Forms.AnchorStyles.Right)));
+			this.splitContainer1.Location = new System.Drawing.Point(0, 0);
+			this.splitContainer1.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
+			this.splitContainer1.Name = "splitContainer1";
+			// 
+			// splitContainer1.Panel1
+			// 
+			this.splitContainer1.Panel1.Controls.Add(this.lbCategories);
+			this.splitContainer1.Panel1MinSize = 85;
+			// 
+			// splitContainer1.Panel2
+			// 
+			this.splitContainer1.Panel2.Controls.Add(this.grpEditor);
+			this.splitContainer1.Size = new System.Drawing.Size(508, 330);
+			this.splitContainer1.SplitterDistance = 95;
+			this.splitContainer1.SplitterWidth = 5;
+			this.splitContainer1.TabIndex = 0;
+			// 
+			// lbCategories
+			// 
+			this.lbCategories.Dock = System.Windows.Forms.DockStyle.Fill;
+			this.lbCategories.FormattingEnabled = true;
+			this.lbCategories.ItemHeight = 17;
+			this.lbCategories.Items.AddRange(new object[] {
+            "Editor"});
+			this.lbCategories.Location = new System.Drawing.Point(0, 0);
+			this.lbCategories.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
+			this.lbCategories.Name = "lbCategories";
+			this.lbCategories.Size = new System.Drawing.Size(95, 327);
+			this.lbCategories.TabIndex = 0;
+			// 
+			// grpEditor
+			// 
+			this.grpEditor.Controls.Add(this.tableEditor);
+			this.grpEditor.Dock = System.Windows.Forms.DockStyle.Fill;
+			this.grpEditor.Location = new System.Drawing.Point(0, 0);
+			this.grpEditor.Name = "grpEditor";
+			this.grpEditor.Size = new System.Drawing.Size(408, 330);
+			this.grpEditor.TabIndex = 1;
+			this.grpEditor.TabStop = false;
+			this.grpEditor.Text = "Editor";
+			// 
+			// tableEditor
+			// 
+			this.tableEditor.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+						| System.Windows.Forms.AnchorStyles.Left)
+						| System.Windows.Forms.AnchorStyles.Right)));
+			this.tableEditor.ColumnCount = 3;
+			this.tableEditor.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 40.44586F));
+			this.tableEditor.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 59.55414F));
+			this.tableEditor.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 82F));
+			this.tableEditor.Controls.Add(this.lblEditorFont, 0, 0);
+			this.tableEditor.Controls.Add(this.lblSampleText, 1, 0);
+			this.tableEditor.Controls.Add(this.btnEditorFont, 2, 0);
+			this.tableEditor.Controls.Add(this.lblCellWidth, 0, 1);
+			this.tableEditor.Controls.Add(this.panel1, 1, 1);
+			this.tableEditor.Controls.Add(this.lblCellHeight, 0, 2);
+			this.tableEditor.Controls.Add(this.panel2, 1, 2);
+			this.tableEditor.Controls.Add(this.lblSeperatorColor, 0, 3);
+			this.tableEditor.Controls.Add(this.panel3, 1, 3);
+			this.tableEditor.Controls.Add(this.lblHighlightColor, 0, 4);
+			this.tableEditor.Controls.Add(this.panel4, 1, 4);
+			this.tableEditor.Location = new System.Drawing.Point(6, 24);
+			this.tableEditor.Name = "tableEditor";
+			this.tableEditor.RowCount = 6;
+			this.tableEditor.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 44.28571F));
+			this.tableEditor.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 55.71429F));
+			this.tableEditor.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30F));
+			this.tableEditor.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 35F));
+			this.tableEditor.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 35F));
+			this.tableEditor.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 134F));
+			this.tableEditor.Size = new System.Drawing.Size(396, 300);
+			this.tableEditor.TabIndex = 0;
+			// 
+			// lblEditorFont
+			// 
+			this.lblEditorFont.AutoSize = true;
+			this.lblEditorFont.Location = new System.Drawing.Point(3, 0);
+			this.lblEditorFont.Name = "lblEditorFont";
+			this.lblEditorFont.Size = new System.Drawing.Size(73, 17);
+			this.lblEditorFont.TabIndex = 0;
+			this.lblEditorFont.Text = "Editor font:";
+			// 
+			// lblSampleText
+			// 
+			this.lblSampleText.AutoSize = true;
+			this.lblSampleText.Location = new System.Drawing.Point(130, 0);
+			this.lblSampleText.Name = "lblSampleText";
+			this.lblSampleText.Size = new System.Drawing.Size(76, 17);
+			this.lblSampleText.TabIndex = 1;
+			this.lblSampleText.Text = "Sample text";
+			// 
+			// btnEditorFont
+			// 
+			this.btnEditorFont.Location = new System.Drawing.Point(316, 3);
+			this.btnEditorFont.Name = "btnEditorFont";
+			this.btnEditorFont.Size = new System.Drawing.Size(25, 23);
+			this.btnEditorFont.TabIndex = 2;
+			this.btnEditorFont.Text = "...";
+			this.btnEditorFont.UseVisualStyleBackColor = true;
+			this.btnEditorFont.Click += new System.EventHandler(this.btnEditorFont_Click);
+			// 
+			// lblCellWidth
+			// 
+			this.lblCellWidth.AutoSize = true;
+			this.lblCellWidth.Location = new System.Drawing.Point(3, 29);
+			this.lblCellWidth.Name = "lblCellWidth";
+			this.lblCellWidth.Size = new System.Drawing.Size(67, 17);
+			this.lblCellWidth.TabIndex = 3;
+			this.lblCellWidth.Text = "Cell width:";
+			// 
+			// panel1
+			// 
+			this.panel1.Controls.Add(this.lblPx1);
+			this.panel1.Controls.Add(this.numCellWidth);
+			this.panel1.Location = new System.Drawing.Point(130, 32);
+			this.panel1.Name = "panel1";
+			this.panel1.Size = new System.Drawing.Size(180, 30);
+			this.panel1.TabIndex = 4;
+			// 
+			// lblPx1
+			// 
+			this.lblPx1.AutoSize = true;
+			this.lblPx1.Location = new System.Drawing.Point(85, 5);
+			this.lblPx1.Name = "lblPx1";
+			this.lblPx1.Size = new System.Drawing.Size(22, 17);
+			this.lblPx1.TabIndex = 1;
+			this.lblPx1.Text = "px";
+			// 
+			// numCellWidth
+			// 
+			this.numCellWidth.Location = new System.Drawing.Point(3, 3);
+			this.numCellWidth.Minimum = new decimal(new int[] {
+            5,
+            0,
+            0,
+            0});
+			this.numCellWidth.Name = "numCellWidth";
+			this.numCellWidth.Size = new System.Drawing.Size(76, 25);
+			this.numCellWidth.TabIndex = 0;
+			this.numCellWidth.Value = new decimal(new int[] {
+            5,
+            0,
+            0,
+            0});
+			// 
+			// lblCellHeight
+			// 
+			this.lblCellHeight.AutoSize = true;
+			this.lblCellHeight.Location = new System.Drawing.Point(3, 65);
+			this.lblCellHeight.Name = "lblCellHeight";
+			this.lblCellHeight.Size = new System.Drawing.Size(72, 17);
+			this.lblCellHeight.TabIndex = 5;
+			this.lblCellHeight.Text = "Cell height:";
+			// 
+			// panel2
+			// 
+			this.panel2.Controls.Add(this.lblPx2);
+			this.panel2.Controls.Add(this.numCellHeight);
+			this.panel2.Location = new System.Drawing.Point(130, 68);
+			this.panel2.Name = "panel2";
+			this.panel2.Size = new System.Drawing.Size(180, 24);
+			this.panel2.TabIndex = 6;
+			// 
+			// lblPx2
+			// 
+			this.lblPx2.AutoSize = true;
+			this.lblPx2.Location = new System.Drawing.Point(85, 1);
+			this.lblPx2.Name = "lblPx2";
+			this.lblPx2.Size = new System.Drawing.Size(22, 17);
+			this.lblPx2.TabIndex = 3;
+			this.lblPx2.Text = "px";
+			// 
+			// numCellHeight
+			// 
+			this.numCellHeight.Location = new System.Drawing.Point(3, -1);
+			this.numCellHeight.Minimum = new decimal(new int[] {
+            5,
+            0,
+            0,
+            0});
+			this.numCellHeight.Name = "numCellHeight";
+			this.numCellHeight.Size = new System.Drawing.Size(76, 25);
+			this.numCellHeight.TabIndex = 2;
+			this.numCellHeight.Value = new decimal(new int[] {
+            5,
+            0,
+            0,
+            0});
+			// 
+			// lblSeperatorColor
+			// 
+			this.lblSeperatorColor.AutoSize = true;
+			this.lblSeperatorColor.Location = new System.Drawing.Point(3, 95);
+			this.lblSeperatorColor.Name = "lblSeperatorColor";
+			this.lblSeperatorColor.Size = new System.Drawing.Size(103, 17);
+			this.lblSeperatorColor.TabIndex = 7;
+			this.lblSeperatorColor.Text = "Seperator color:";
+			// 
+			// panel3
+			// 
+			this.panel3.Controls.Add(this.btnSeperatorColor);
+			this.panel3.Controls.Add(this.colorSeperator);
+			this.panel3.Location = new System.Drawing.Point(130, 98);
+			this.panel3.Name = "panel3";
+			this.panel3.Size = new System.Drawing.Size(180, 29);
+			this.panel3.TabIndex = 8;
+			// 
+			// btnSeperatorColor
+			// 
+			this.btnSeperatorColor.Location = new System.Drawing.Point(29, 3);
+			this.btnSeperatorColor.Name = "btnSeperatorColor";
+			this.btnSeperatorColor.Size = new System.Drawing.Size(25, 23);
+			this.btnSeperatorColor.TabIndex = 3;
+			this.btnSeperatorColor.Text = "...";
+			this.btnSeperatorColor.UseVisualStyleBackColor = true;
+			this.btnSeperatorColor.Click += new System.EventHandler(this.button1_Click);
+			// 
+			// colorSeperator
+			// 
+			this.colorSeperator.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+			this.colorSeperator.Location = new System.Drawing.Point(3, 3);
+			this.colorSeperator.Name = "colorSeperator";
+			this.colorSeperator.Size = new System.Drawing.Size(20, 20);
+			this.colorSeperator.TabIndex = 0;
+			this.colorSeperator.TabStop = false;
+			// 
+			// lblHighlightColor
+			// 
+			this.lblHighlightColor.AutoSize = true;
+			this.lblHighlightColor.Location = new System.Drawing.Point(3, 130);
+			this.lblHighlightColor.Name = "lblHighlightColor";
+			this.lblHighlightColor.Size = new System.Drawing.Size(97, 17);
+			this.lblHighlightColor.TabIndex = 9;
+			this.lblHighlightColor.Text = "Highlight color:";
+			// 
+			// panel4
+			// 
+			this.panel4.Controls.Add(this.btnHighlightColor);
+			this.panel4.Controls.Add(this.colorHighlight);
+			this.panel4.Location = new System.Drawing.Point(130, 133);
+			this.panel4.Name = "panel4";
+			this.panel4.Size = new System.Drawing.Size(180, 29);
+			this.panel4.TabIndex = 10;
+			// 
+			// btnHighlightColor
+			// 
+			this.btnHighlightColor.Location = new System.Drawing.Point(29, 3);
+			this.btnHighlightColor.Name = "btnHighlightColor";
+			this.btnHighlightColor.Size = new System.Drawing.Size(25, 23);
+			this.btnHighlightColor.TabIndex = 5;
+			this.btnHighlightColor.Text = "...";
+			this.btnHighlightColor.UseVisualStyleBackColor = true;
+			this.btnHighlightColor.Click += new System.EventHandler(this.button1_Click_1);
+			// 
+			// colorHighlight
+			// 
+			this.colorHighlight.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+			this.colorHighlight.Location = new System.Drawing.Point(3, 3);
+			this.colorHighlight.Name = "colorHighlight";
+			this.colorHighlight.Size = new System.Drawing.Size(20, 20);
+			this.colorHighlight.TabIndex = 4;
+			this.colorHighlight.TabStop = false;
+			// 
+			// btnOK
+			// 
+			this.btnOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+			this.btnOK.Location = new System.Drawing.Point(213, 338);
+			this.btnOK.Name = "btnOK";
+			this.btnOK.Size = new System.Drawing.Size(91, 29);
+			this.btnOK.TabIndex = 1;
+			this.btnOK.Text = "&Ok";
+			this.btnOK.UseVisualStyleBackColor = true;
+			this.btnOK.Click += new System.EventHandler(this.btnOK_Click);
+			// 
+			// btnApply
+			// 
+			this.btnApply.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+			this.btnApply.Location = new System.Drawing.Point(310, 338);
+			this.btnApply.Name = "btnApply";
+			this.btnApply.Size = new System.Drawing.Size(91, 29);
+			this.btnApply.TabIndex = 2;
+			this.btnApply.Text = "&Apply";
+			this.btnApply.UseVisualStyleBackColor = true;
+			this.btnApply.Click += new System.EventHandler(this.btnApply_Click);
+			// 
+			// btnCancel
+			// 
+			this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+			this.btnCancel.Location = new System.Drawing.Point(407, 338);
+			this.btnCancel.Name = "btnCancel";
+			this.btnCancel.Size = new System.Drawing.Size(91, 29);
+			this.btnCancel.TabIndex = 3;
+			this.btnCancel.Text = "&Cancel";
+			this.btnCancel.UseVisualStyleBackColor = true;
+			this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
+			// 
+			// OptionsForm
+			// 
+			this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 17F);
+			this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+			this.ClientSize = new System.Drawing.Size(510, 379);
+			this.Controls.Add(this.btnCancel);
+			this.Controls.Add(this.btnApply);
+			this.Controls.Add(this.btnOK);
+			this.Controls.Add(this.splitContainer1);
+			this.Font = new System.Drawing.Font("Segoe UI", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+			this.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
+			this.Name = "OptionsForm";
+			this.ShowInTaskbar = false;
+			this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+			this.Text = "Ascii Pumper Options";
+			this.Load += new System.EventHandler(this.OptionsForm_Load);
+			this.splitContainer1.Panel1.ResumeLayout(false);
+			this.splitContainer1.Panel2.ResumeLayout(false);
+			this.splitContainer1.ResumeLayout(false);
+			this.grpEditor.ResumeLayout(false);
+			this.tableEditor.ResumeLayout(false);
+			this.tableEditor.PerformLayout();
+			this.panel1.ResumeLayout(false);
+			this.panel1.PerformLayout();
+			((System.ComponentModel.ISupportInitialize)(this.numCellWidth)).EndInit();
+			this.panel2.ResumeLayout(false);
+			this.panel2.PerformLayout();
+			((System.ComponentModel.ISupportInitialize)(this.numCellHeight)).EndInit();
+			this.panel3.ResumeLayout(false);
+			((System.ComponentModel.ISupportInitialize)(this.colorSeperator)).EndInit();
+			this.panel4.ResumeLayout(false);
+			((System.ComponentModel.ISupportInitialize)(this.colorHighlight)).EndInit();
+			this.ResumeLayout(false);
+
+		}
+
+		#endregion
+
+		private System.Windows.Forms.SplitContainer splitContainer1;
+		private System.Windows.Forms.ListBox lbCategories;
+		private System.Windows.Forms.GroupBox grpEditor;
+		private System.Windows.Forms.Button btnOK;
+		private System.Windows.Forms.Button btnApply;
+		private System.Windows.Forms.Button btnCancel;
+		private System.Windows.Forms.TableLayoutPanel tableEditor;
+		private System.Windows.Forms.Label lblEditorFont;
+		private System.Windows.Forms.Label lblSampleText;
+		private System.Windows.Forms.Button btnEditorFont;
+		private System.Windows.Forms.FontDialog fontdlgEditorFont;
+		private System.Windows.Forms.Label lblCellWidth;
+		private System.Windows.Forms.Panel panel1;
+		private System.Windows.Forms.Label lblPx1;
+		private System.Windows.Forms.NumericUpDown numCellWidth;
+		private System.Windows.Forms.Label lblCellHeight;
+		private System.Windows.Forms.Panel panel2;
+		private System.Windows.Forms.Label lblPx2;
+		private System.Windows.Forms.NumericUpDown numCellHeight;
+		private System.Windows.Forms.Label lblSeperatorColor;
+		private System.Windows.Forms.Panel panel3;
+		private System.Windows.Forms.PictureBox colorSeperator;
+		private System.Windows.Forms.Button btnSeperatorColor;
+		private System.Windows.Forms.ColorDialog colordlgSeperator;
+		private System.Windows.Forms.ColorDialog colordlgHighlight;
+		private System.Windows.Forms.Label lblHighlightColor;
+		private System.Windows.Forms.Panel panel4;
+		private System.Windows.Forms.Button btnHighlightColor;
+		private System.Windows.Forms.PictureBox colorHighlight;
+	}
+}
+\ No newline at end of file
diff --git a/source/OptionsForm.cs b/source/OptionsForm.cs
@@ -0,0 +1,129 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+
+namespace AsciiPumper
+{
+	public partial class OptionsForm : Form
+	{
+		public OptionsForm()
+		{
+			InitializeComponent();
+			fontdlgEditorFont.Font = new Font(Program.Settings.PaintFontName, Program.Settings.PaintFontSize);
+			lblSampleText.Font = new Font(Program.Settings.PaintFontName, Program.Settings.PaintFontSize);
+			colorSeperator.BackColor = Program.Settings.SeperatorColor;
+			colorHighlight.BackColor = Program.Settings.HighlightColor;
+			numCellHeight.Value = Program.Settings.CellHeight;
+			numCellWidth.Value = Program.Settings.CellWidth;
+			colordlgHighlight.Color = Program.Settings.HighlightColor;
+			colordlgSeperator.Color = Program.Settings.SeperatorColor;
+
+
+		}
+
+		public class SettingsSavedEventArgs : EventArgs
+		{
+			public static readonly new SettingsSavedEventArgs Empty = new SettingsSavedEventArgs();
+		}
+
+		public event EventHandler<SettingsSavedEventArgs> SettingsSaved;
+
+		protected virtual void OnSettingsSaved(SettingsSavedEventArgs e)
+		{
+			EventHandler<SettingsSavedEventArgs> handler = SettingsSaved;
+			if (handler != null)
+			{
+				handler(this, e);
+			}
+		}
+
+		private void OptionsForm_Load(object sender, EventArgs e)
+		{
+			lbCategories.SelectedValue = "Editor";
+
+		}
+
+		private void ApplySettings()
+		{
+			Cursor cur = Cursor.Current;
+			Cursor.Current = Cursors.WaitCursor;
+			try
+			{
+				if (fontdlgEditorFont.Font.Name != Program.Settings.PaintFontName)
+				{
+					Program.Settings.PaintFontName = fontdlgEditorFont.Font.Name;
+				}
+				if (fontdlgEditorFont.Font.Size != Program.Settings.PaintFontSize)
+				{
+					Program.Settings.PaintFontSize = fontdlgEditorFont.Font.Size;
+				}
+				if (colordlgHighlight.Color != Program.Settings.HighlightColor)
+					Program.Settings.HighlightColor = colordlgHighlight.Color;
+				if (colordlgSeperator.Color != Program.Settings.SeperatorColor)
+					Program.Settings.SeperatorColor = colordlgSeperator.Color;
+				if (numCellHeight.Value != Program.Settings.CellHeight)
+					Program.Settings.CellHeight = (int)numCellHeight.Value;
+				if (numCellWidth.Value != Program.Settings.CellWidth)
+					Program.Settings.CellWidth = (int) numCellWidth.Value;
+
+				Program.Settings.Save();
+				this.OnSettingsSaved(SettingsSavedEventArgs.Empty);
+			}
+			finally
+			{
+				Cursor.Current = cur;
+			}
+			
+		}
+
+		private void btnOK_Click(object sender, EventArgs e)
+		{
+			ApplySettings();
+			this.DialogResult = DialogResult.OK;
+			this.Close();
+
+		}
+
+		private void btnApply_Click(object sender, EventArgs e)
+		{
+			ApplySettings();
+		}
+
+		private void btnCancel_Click(object sender, EventArgs e)
+		{
+			this.DialogResult = DialogResult.Cancel;
+			this.Close();
+
+		}
+
+		private void btnEditorFont_Click(object sender, EventArgs e)
+		{
+			DialogResult res = fontdlgEditorFont.ShowDialog(this);
+			if (res == DialogResult.OK)
+			{
+				lblSampleText.Font = fontdlgEditorFont.Font;
+			}
+		}
+
+		private void button1_Click(object sender, EventArgs e)
+		{
+			DialogResult res = colordlgSeperator.ShowDialog(this);
+			if (res == DialogResult.OK)
+				colorSeperator.BackColor = colordlgSeperator.Color;
+
+		}
+
+		private void button1_Click_1(object sender, EventArgs e)
+		{
+
+			DialogResult res = colordlgHighlight.ShowDialog(this);
+			if (res == DialogResult.OK)
+				colorHighlight.BackColor = colordlgHighlight.Color;
+
+		}
+	}
+}
+\ No newline at end of file
diff --git a/source/OptionsForm.resx b/source/OptionsForm.resx
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="fontdlgEditorFont.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <metadata name="colordlgSeperator.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>165, 17</value>
+  </metadata>
+  <metadata name="colordlgHighlight.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>286, 17</value>
+  </metadata>
+</root>
+\ No newline at end of file
diff --git a/source/PaintAction.cs b/source/PaintAction.cs
@@ -0,0 +1,53 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Drawing;
+
+namespace AsciiPumper
+{
+	public class PaintAction : IUndoableAction
+	{
+		
+		public List<Point> PaintedPoints = new List<Point>();
+		public byte OldPaintColor = 0;
+		public byte NewPaintColor = 1;
+		public bool IsForeground = false;
+
+		public bool PointExists(Point point)
+		{
+			foreach (Point p in PaintedPoints)
+			{
+				if (p.X == point.X && p.Y == point.Y)
+					return true;
+			}
+			return false;
+		}
+
+		#region IUndoableAction Members
+		public void Undo(PaintCanvas canvas)
+		{
+			foreach (Point p in PaintedPoints)
+			{
+				if (IsForeground)
+					canvas.CellRows[p.Y][p.X].ForeColor = OldPaintColor;
+				else
+					canvas.CellRows[p.Y][p.X].BackColor = OldPaintColor;
+			}
+			canvas.RepaintAll();
+		}
+
+		public void Redo(PaintCanvas canvas)
+		{
+			foreach (Point p in PaintedPoints)
+			{
+				if (IsForeground)
+					canvas.CellRows[p.Y][p.X].ForeColor = NewPaintColor;
+				else
+					canvas.CellRows[p.Y][p.X].BackColor = NewPaintColor;
+			}
+			canvas.RepaintAll();
+		}
+
+		#endregion
+	}
+}
diff --git a/source/PaintCanvas.Designer.cs b/source/PaintCanvas.Designer.cs
@@ -0,0 +1,56 @@
+namespace AsciiPumper
+{
+	partial class PaintCanvas
+	{
+		/// <summary> 
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.IContainer components = null;
+
+		/// <summary> 
+		/// Clean up any resources being used.
+		/// </summary>
+		/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+		protected override void Dispose(bool disposing)
+		{
+			if (disposing && (components != null))
+			{
+				components.Dispose();
+			}
+			base.Dispose(disposing);
+		}
+
+		#region Component Designer generated code
+
+		/// <summary> 
+		/// Required method for Designer support - do not modify 
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+			this.SuspendLayout();
+			// 
+			// PaintCanvas
+			// 
+			this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+			this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+			this.BackColor = System.Drawing.Color.White;
+			this.DoubleBuffered = true;
+			this.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+			this.Name = "PaintCanvas";
+			this.Size = new System.Drawing.Size(666, 413);
+			this.PreviewKeyDown += new System.Windows.Forms.PreviewKeyDownEventHandler(this.PaintCanvas_PreviewKeyDown);
+			this.Load += new System.EventHandler(this.PaintCanvas_Load);
+			this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.PaintCanvas_MouseDown);
+			this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.PaintCanvas_MouseMove);
+			this.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.PaintCanvas_KeyPress);
+			this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.PaintCanvas_MouseUp);
+			this.SizeChanged += new System.EventHandler(this.PaintCanvas_SizeChanged);
+			this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.PaintCanvas_KeyDown);
+			this.ResumeLayout(false);
+
+		}
+
+		#endregion
+	}
+}
diff --git a/source/PaintCanvas.cs b/source/PaintCanvas.cs
@@ -0,0 +1,1265 @@
+#region Copyright (c) 2007, PP4L Software
+/************************************************************************************
+
+Copyright  2007, PP4L Software
+Author:	Lampiasis <lampiasis@dvolker.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+'***********************************************************************************/
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Text;
+using System.Windows.Forms;
+using System.IO;
+using System.Text.RegularExpressions;
+using System.Drawing.Printing;
+
+
+namespace AsciiPumper
+{
+	public partial class PaintCanvas : UserControl
+	{
+		public PaintCanvas()
+		{
+			InitializeComponent();
+
+			CellRows = new List<List<CellInfo>>();
+			ResizeCellRows();
+
+
+			UpdateSeperatorPen();
+			PaintCanvas_SizeChanged(this, EventArgs.Empty);
+			PaintIntoBackground();
+			Program.Settings.PropertyChanged += new PropertyChangedEventHandler(Settings_PropertyChanged);
+
+		}
+
+
+		public Stack<IUndoableAction> UndoList = new Stack<IUndoableAction>();
+		public Stack<IUndoableAction> RedoList = new Stack<IUndoableAction>();
+		public IUndoableAction CurrentAction;
+
+		private bool m_Modified;
+
+		/// <summary>
+		/// Gets or sets the Modified.
+		/// </summary>
+		public bool Modified
+		{
+			get { return m_Modified; }
+			set
+			{
+				if (m_Modified != value)
+				{
+					if (value == true)
+						OnCanvasModified(CanvasModifiedEventArgs.Empty);
+					m_Modified = value;
+				}
+			}
+		}
+
+		public class CanvasModifiedEventArgs : EventArgs
+		{
+			public static readonly new CanvasModifiedEventArgs Empty = new CanvasModifiedEventArgs();
+		}
+
+		public event EventHandler<CanvasModifiedEventArgs> CanvasModified;
+
+		protected virtual void OnCanvasModified(CanvasModifiedEventArgs e)
+		{
+			EventHandler<CanvasModifiedEventArgs> handler = CanvasModified;
+			if (handler != null)
+			{
+				handler(this, e);
+			}
+		}
+
+		public void CompleteRepaint()
+		{
+			this.PaintIntoBackground();
+			this.Invalidate();
+		}
+
+		void Settings_PropertyChanged(object sender, PropertyChangedEventArgs e)
+		{
+			bool invalidate = false;
+
+			if ( e.PropertyName == "PaintFontName" )
+			{
+				this.Font = new Font((string) Program.Settings["PaintFontName"], (float) Program.Settings["PaintFontSize"]);
+				invalidate = true;
+			}
+			if (e.PropertyName == "PaintFontSize")
+			{
+				this.Font = new Font((string) Program.Settings["PaintFontName"], (float) Program.Settings["PaintFontSize"]);
+				invalidate = true;
+			}
+			if (e.PropertyName == "CellWidth")
+			{
+				this.CellWidth = Program.Settings.CellWidth;
+				invalidate = true;
+			}
+			if (e.PropertyName == "CellHeight")
+			{
+				this.CellHeight = Program.Settings.CellHeight;
+				invalidate = true;
+			}
+			if (e.PropertyName == "SeperatorColor")
+				this.SeperatorColor = Program.Settings.SeperatorColor;
+			if (e.PropertyName == "HighlightColor")
+				this.HighlightColor = Program.Settings.HighlightColor;
+
+			if (invalidate)
+			{
+			//	this.PaintIntoBackground();
+			//	this.Invalidate();
+			}
+		}
+
+		private void ResizeCellRows( )
+		{
+			for (int rows = 0; rows < this.Rows; rows++)
+			{
+				if ( CellRows.Count < rows + 1 ) 
+					CellRows.Add(new List<CellInfo>(this.Columns));
+				for (int cols = 0; cols < this.Columns; cols++)
+				{
+					if ( CellRows[rows].Count < cols + 1 )
+						CellRows[rows].Add( new CellInfo() );
+				}
+			}
+		}
+    
+
+		private void PaintCanvas_Paint(object sender, PaintEventArgs e)
+		{
+#if false
+			// test
+			Font consolas = new Font("Consolas", 18);
+			m_PaintBuffer.DrawString("Test", consolas, Brushes.BlueViolet, 10, consolas.Height);
+			SizeF size = m_PaintBuffer.MeasureString("Test", consolas);
+			m_PaintBuffer.DrawString(size.Width.ToString(), consolas, Brushes.Blue, size.Width + 10, consolas.Height);
+			// test
+			Font arial = new Font("Arial", 10);
+			m_PaintBuffer.DrawString("Test", arial, Brushes.BlueViolet, 10, 40);
+			size = m_PaintBuffer.MeasureString("Test", arial);
+			m_PaintBuffer.DrawString(size.Width.ToString(), arial, Brushes.Blue, size.Width + 10, 40);
+#endif
+		}
+
+		private Image m_PaintImage;
+
+		private Graphics m_PaintBuffer;
+
+
+		protected override void OnPaint(PaintEventArgs e)
+		{
+			base.OnPaint(e);
+			// PaintIntoBackground();
+			e.Graphics.DrawImage(m_PaintImage, e.ClipRectangle, e.ClipRectangle, GraphicsUnit.Pixel); // DrawImageUnscaledAndClipped(m_PaintImage., e.ClipRectangle);
+
+
+		}
+
+		public void PrintToGraphicDevice(Graphics graphics, PrintPageEventArgs e )
+		{
+			Rectangle printRect = new Rectangle(
+				e.MarginBounds.Top, e.MarginBounds.Left ,
+				Math.Min(m_PaintImage.Width, e.MarginBounds.Right - e.MarginBounds.Left),
+				Math.Min(m_PaintImage.Height, e.MarginBounds.Bottom - e.MarginBounds.Top)
+				);
+			
+			graphics.DrawImage(m_PaintImage, printRect, new Rectangle(0, 0, m_PaintImage.Width, m_PaintImage.Height), GraphicsUnit.Pixel);
+		}
+
+		private void ResizeByCellSize()
+		{
+			this.Height = /*(m_Rows * ( m_SeperatorWidth / 2)) +*/ (m_Rows * m_CellHeight);
+			this.Width = (m_Columns * (m_SeperatorWidth / 2)) + (m_Columns * m_CellWidth);
+
+		} 
+
+		private Point m_SelectedCellPosition = new Point(0,0);
+
+		/// <summary>
+		/// Gets or sets the SelectedCellPosition.
+		/// </summary>
+		public Point SelectedCellPosition
+		{
+			get { return m_SelectedCellPosition; }
+			set { RepaintSingleCell(m_SelectedCellPosition); m_SelectedCellPosition = value; RepaintSingleCell(m_SelectedCellPosition); }
+		}
+
+		#region Highlight Properties and methods
+		private void UpdateHighlightPen()
+		{
+			m_HighlightPen = new Pen(m_HighlightColor, m_HighlightWidth);
+			
+		}
+
+		private Pen m_HighlightPen = Pens.OldLace;
+
+		private Color m_HighlightColor = Color.OldLace;
+
+		/// <summary>
+		/// Gets or sets the HighlightColor.
+		/// </summary>
+		public Color HighlightColor
+		{
+			get { return m_HighlightColor; }
+			set { m_HighlightColor = value; UpdateHighlightPen(); PaintIntoBackground();  this.Invalidate(); }
+		}
+
+		private int m_HighlightWidth = 2;
+
+		/// <summary>
+		/// Gets or sets the HighlightWidth.
+		/// </summary>
+		public int HighlightWidth
+		{
+			get { return m_HighlightWidth; }
+			set { m_HighlightWidth = value; UpdateHighlightPen(); PaintIntoBackground(); this.Invalidate(); }
+		}
+		#endregion
+
+		private int m_SeperatorWidth = 1;
+
+		/// <summary>
+		/// Gets or sets the SeperatorWidth.
+		/// </summary>
+		public int SeperatorWidth
+		{
+			get { return m_SeperatorWidth; }
+			set { m_SeperatorWidth = value; UpdateSeperatorPen(); ResizeByCellSize(); PaintIntoBackground();  this.Invalidate(); }
+		}
+
+		private int m_CellWidth = 5;
+
+		/// <summary>
+		/// Gets or sets the CellWidth.
+		/// </summary>
+		public int CellWidth
+		{
+			get { return m_CellWidth; }
+			set { m_CellWidth = value; ResizeByCellSize(); PaintIntoBackground(); this.Invalidate(); }
+		}
+
+		private int m_CellHeight = 10;
+
+		/// <summary>
+		/// Gets or sets the CellHeight.
+		/// </summary>
+		public int CellHeight
+		{
+			get { return m_CellHeight; }
+			set { m_CellHeight = value; ResizeByCellSize(); PaintIntoBackground(); this.Invalidate(); }
+		}
+
+		private int m_Columns = 60;
+
+		/// <summary>
+		/// Gets or sets the Columns.
+		/// </summary>
+		public int Columns 
+		{
+			get { return m_Columns; }
+			set { m_Columns = value; ResizeCellRows(); ResizeByCellSize(); PaintIntoBackground(); this.Invalidate(); }
+		}
+
+		private int m_Rows = 20;
+
+		/// <summary>
+		/// Gets or sets the Rows.
+		/// </summary>
+		public int Rows
+		{
+			get { return m_Rows; }
+			set { m_Rows = value; ResizeCellRows(); ResizeByCellSize(); PaintIntoBackground();  this.Invalidate(); }
+		}
+
+
+		private Color m_SeperatorColor = Color.DarkGray;
+
+		/// <summary>
+		/// Gets or sets the SeperatorColor.
+		/// </summary>
+		public Color SeperatorColor
+		{
+			get { return m_SeperatorColor; }
+			set { m_SeperatorColor = value; UpdateSeperatorPen(); this.Invalidate(); }
+		}
+
+		private Pen m_SeperatorPen;
+
+		private void UpdateSeperatorPen()
+		{
+			m_SeperatorPen = new Pen(m_SeperatorColor, m_SeperatorWidth);
+		}
+
+		private void RepaintSingleCell(Point cellpos)
+		{
+			if ( m_DontRepaint )
+				return;
+
+			if (cellpos.X < 0 || cellpos.Y < 0 || cellpos.Y >= CellRows.Count || cellpos.X >= CellRows[0].Count)
+				return;
+
+			
+			
+			/* int max_x = cellpos.X + 1;
+			int max_y = cellpos.Y + 1;
+			for (cellpos.X--; cellpos.X < max_x; cellpos.X++)
+			{
+				for (cellpos.Y--; cellpos.Y < max_y; cellpos.Y++)
+				{
+					if (cellpos.Y < 0 || cellpos.X < 0)
+						continue;
+			 */
+		
+					CellInfo ci = CellRows[cellpos.Y][cellpos.X];
+					//m_PaintBuffer.FillRectangle(new SolidBrush(this.BackColor), cellpos.X * m_CellWidth, cellpos.Y * m_CellHeight, m_CellWidth, m_CellHeight);
+					m_PaintBuffer.FillRectangle(this.Colors.SolidBrushes[ci.BackColor], cellpos.X * m_CellWidth, cellpos.Y * m_CellHeight, m_CellWidth, m_CellHeight);
+					if (CellRows[cellpos.Y][cellpos.X].Character != ' ')
+					{
+						FontStyle styles = new FontStyle();
+						if (ci.Bold)
+							styles |= FontStyle.Bold;
+						if (ci.Underlined)
+							styles |= FontStyle.Underline;
+						Font font = new Font(this.Font, styles);
+						m_PaintBuffer.DrawString(ci.Character.ToString(), font,this.Colors.SolidBrushes[ci.ForeColor], cellpos.X * m_CellWidth, cellpos.Y * m_CellHeight);
+
+					}
+					m_PaintBuffer.DrawLine(m_SeperatorPen, cellpos.X * m_CellWidth, (1 + cellpos.Y) * m_CellHeight, (1 + cellpos.X) * m_CellWidth, (1 + cellpos.Y) * m_CellHeight);
+					m_PaintBuffer.DrawLine(m_SeperatorPen, (1 + cellpos.X) * m_CellWidth, (cellpos.Y) * m_CellHeight, (1 + cellpos.X) * m_CellWidth, (1 + cellpos.Y) * m_CellHeight);
+					m_PaintBuffer.DrawLine(m_SeperatorPen, (cellpos.X) * m_CellWidth, (cellpos.Y) * m_CellHeight, (1 + cellpos.X) * m_CellWidth, (cellpos.Y) * m_CellHeight);
+					m_PaintBuffer.DrawLine(m_SeperatorPen, (cellpos.X) * m_CellWidth, (cellpos.Y) * m_CellHeight, (cellpos.X) * m_CellWidth, (1 + cellpos.Y) * m_CellHeight);
+					if (m_SelectedCellPosition.X == cellpos.X && m_SelectedCellPosition.Y == cellpos.Y)
+					{
+						m_PaintBuffer.DrawRectangle(m_HighlightPen, 1 + (m_SelectedCellPosition.X * (m_CellWidth + (m_SeperatorWidth / 2))), 1 + ( m_SelectedCellPosition.Y * (m_CellHeight + (m_SeperatorWidth / 2)) ),
+										 m_CellWidth - 2, m_CellHeight - 2);
+					}
+			//	}
+			//}
+			int xpos = (cellpos.X * m_CellWidth) - 5;
+			int ypos = (cellpos.Y * m_CellHeight) - 5;
+			if ( xpos < 0 ) 
+				xpos = 0;
+			if ( ypos < 0 )
+				ypos = 0;
+			this.Invalidate(new Rectangle(new Point(xpos, ypos), new Size(m_CellWidth + 5, m_CellHeight + 5)));
+		}
+
+		private void PaintIntoBackground()
+		{
+			if ( m_DontRepaint )
+				return;
+			//m_PaintBuffer.FillRectangle(new SolidBrush(this.BackColor), 0, 0, this.Width, this.Height);
+
+			Font boldfont = new Font(this.Font, FontStyle.Bold);
+			Font underlinedfont = new Font(this.Font, FontStyle.Underline);
+			Font bold_underlined_font = new Font(this.Font, FontStyle.Underline | FontStyle.Bold);
+
+			CellInfo ci;
+			for (int row = 0; row < m_Rows; row++)
+			{
+				for (int col = 0; col < m_Columns; col++)
+				{
+					ci = CellRows[row][col];
+					m_PaintBuffer.FillRectangle(this.Colors.SolidBrushes[ci.BackColor], col * m_CellWidth, row * m_CellHeight, m_CellWidth, m_CellHeight);
+					if (CellRows[row][col].Character != ' ')
+					{
+						Font font;
+						if (ci.Bold && ci.Underlined)
+							font = bold_underlined_font;
+						else if (ci.Bold)
+							font = boldfont;
+						else if (ci.Underlined)
+							font = underlinedfont;
+						else
+							font = this.Font;
+						m_PaintBuffer.DrawString(ci.Character.ToString(), font, this.Colors.SolidBrushes[ci.ForeColor], col * m_CellWidth, row * m_CellHeight);
+
+					}
+				}
+			}
+			for (int i = 0; i < m_Rows; i++)
+			{
+				int ypos = (m_SeperatorWidth / 2) + i * m_CellHeight;
+				m_PaintBuffer.DrawLine(m_SeperatorPen, 0, ypos, this.Width, ypos);
+
+			}
+			for (int i = 0; i < m_Columns; i++)
+			{
+				int xpos = (m_SeperatorWidth / 2) + i * m_CellWidth;
+				m_PaintBuffer.DrawLine(m_SeperatorPen, xpos, 0, xpos, this.Height);
+
+			}
+
+			m_PaintBuffer.DrawRectangle(m_HighlightPen, m_SelectedCellPosition.X * (m_CellWidth + (m_SeperatorWidth / 2)), m_SelectedCellPosition.Y * (m_CellHeight + (m_SeperatorWidth / 2)),
+				 m_CellWidth, m_CellHeight);
+
+			
+#if false
+			// test
+			Font consolas = new Font("Consolas", 18, GraphicsUnit.Pixel);
+			m_PaintBuffer.DrawString("Test", consolas, Brushes.BlueViolet, 10, 0);
+			SizeF size = m_PaintBuffer.MeasureString("Test", consolas);
+			m_PaintBuffer.DrawString(size.Width.ToString(), consolas, Brushes.Blue, size.Width + 10, 0);
+			m_PaintBuffer.DrawLine(new Pen(Brushes.AliceBlue), new Point(0, consolas.Height), new Point(this.Width, consolas.Height));
+			// test
+			Font arial = new Font("Arial", 10, GraphicsUnit.Pixel);
+			
+			m_PaintBuffer.DrawString("Test", arial, Brushes.BlueViolet, 10, consolas.Height);
+			size = m_PaintBuffer.MeasureString("Test", arial);
+			m_PaintBuffer.DrawString(size.Width.ToString(), arial, Brushes.Blue, size.Width + 10, consolas.Height);
+			m_PaintBuffer.DrawLine(new Pen(Brushes.Peru), new Point(0, consolas.Height + arial.Height), new Point(this.Width, consolas.Height + arial.Height));
+#endif
+		}
+
+		private void PaintCanvas_SizeChanged(object sender, EventArgs e)
+		{
+			m_PaintImage = new Bitmap(this.Width, this.Height, System.Drawing.Imaging.PixelFormat.Format16bppRgb565); //.Format32bppRgb);
+			m_PaintBuffer = Graphics.FromImage(m_PaintImage);
+			PaintIntoBackground();
+		}
+
+		public enum PaintModes
+		{
+			PaintBrush,
+			Fill,
+			Bold,
+			Underline,
+			RemoveFormatting
+		};
+
+		private PaintModes m_PaintMode;
+
+		/// <summary>
+		/// Gets or sets the PaintMode.
+		/// </summary>
+		public PaintModes PaintMode
+		{
+			get { return m_PaintMode; }
+			set { m_PaintMode = value; }
+		}
+
+		private void PaintCanvas_MouseDown(object sender, MouseEventArgs e)
+		{
+			if (CurrentAction is KeypressAction)
+			{
+				CurrentAction = null;
+			}
+
+			if (CurrentAction == null)
+			{
+				if ( m_PaintMode == PaintModes.PaintBrush || m_PaintMode == PaintModes.Fill )
+					CurrentAction = new PaintAction();
+			}
+			SelectAppropriateCell(e.X, e.Y);
+			if (m_PaintMode == PaintModes.PaintBrush || m_PaintMode == PaintModes.Fill)
+				PaintCellByMouseArgs(this.m_SelectedCellPosition, e);
+			else if (m_PaintMode == PaintModes.Bold)
+			{
+				BoldSelectedCell();
+			}
+			else if (m_PaintMode == PaintModes.Underline)
+			{
+				UnderlineSelectedCell();
+			}
+			else if (m_PaintMode == PaintModes.RemoveFormatting)
+			{
+				RemoveFormattingSelectedCell();
+			}
+		}
+
+		private void RemoveFormattingSelectedCell()
+		{
+			SelectedCell.Underlined = false;
+			SelectedCell.Bold = false;
+			RepaintSingleCell(SelectedCellPosition);
+		}
+
+		public void UnderlineSelectedCell()
+		{
+			SelectedCell.Underlined = true;
+			RepaintSingleCell(SelectedCellPosition);
+		}
+
+		public void BoldSelectedCell()
+		{
+			SelectedCell.Bold = true; //  (SelectedCell.Bold ? false : true); 
+			RepaintSingleCell(SelectedCellPosition);
+		}
+
+		private void StartFillCell( Point point, byte origcolor, byte color, bool foreground)
+		{
+			if (CurrentAction is PaintAction)
+			{
+				//CurrentAction = new PaintAction();
+				((PaintAction)CurrentAction).IsForeground = foreground;
+				((PaintAction)CurrentAction).NewPaintColor = color;
+				((PaintAction)CurrentAction).OldPaintColor = origcolor;
+			}
+			FillCell(  point,  origcolor,  color,  foreground);
+			if (CurrentAction is PaintAction)
+			{
+				AddUndoAction(CurrentAction);
+				CurrentAction = null;
+			}
+		}
+
+		private void PaintCellByMouseArgs(Point point, MouseEventArgs e)
+		{
+
+
+			switch (e.Button)
+			{
+				case MouseButtons.Left:
+					if ( m_PaintMode == PaintModes.Fill )
+					{
+						if ( m_LeftMouseIsForeground )
+							StartFillCell(point, CellRows[point.Y][point.X].ForeColor, m_LeftMouseColor, m_LeftMouseIsForeground);
+						else
+							StartFillCell(point, CellRows[point.Y][point.X].BackColor, m_LeftMouseColor, m_LeftMouseIsForeground);
+						this.Invalidate();
+					}
+					else
+						PaintCell(point, m_LeftMouseColor, m_LeftMouseIsForeground);
+					if (m_LeftMouseIsForeground)
+						this.MostRecentForegroundColor = m_LeftMouseColor;
+					break;
+				case MouseButtons.Right:
+					if (m_PaintMode == PaintModes.Fill)
+					{
+						if (m_RightMouseIsForeground)
+							StartFillCell(point, CellRows[point.Y][point.X].ForeColor, m_RightMouseColor, m_RightMouseIsForeground);
+						else
+							StartFillCell(point, CellRows[point.Y][point.X].BackColor, m_RightMouseColor, m_RightMouseIsForeground);
+						this.Invalidate();
+					}
+					else
+						PaintCell(point, m_RightMouseColor, m_RightMouseIsForeground);
+					if (m_RightMouseIsForeground)
+						this.MostRecentForegroundColor = m_RightMouseColor;
+					break;
+				case MouseButtons.Middle:
+					if (m_PaintMode == PaintModes.Fill)
+					{
+						if (m_MiddleMouseIsForeground)
+							StartFillCell(point, CellRows[point.Y][point.X].ForeColor, m_MiddleMouseColor, m_MiddleMouseIsForeground);
+						else
+							StartFillCell(point, CellRows[point.Y][point.X].BackColor, m_MiddleMouseColor, m_MiddleMouseIsForeground);
+						this.Invalidate();
+					}
+					else
+						PaintCell(point, m_MiddleMouseColor, m_MiddleMouseIsForeground);
+					if (m_MiddleMouseIsForeground)
+						this.MostRecentForegroundColor = m_MiddleMouseColor;
+					break;
+				default:
+					break;
+			}
+		}
+
+		private bool m_DontRepaint = false;
+
+		/// <summary>
+		/// Gets or sets the DontRepaint = false.
+		/// </summary>
+		public bool DontRepaint 
+		{
+			get { return m_DontRepaint; }
+			set { m_DontRepaint = value; }
+		}
+
+		private void FillCell(Point point, byte origcolor, byte color, bool foreground)
+		{
+
+			Point curpoint = new Point();
+			if (foreground)
+			{
+				if (CellRows[point.Y][point.X].ForeColor == color)
+					return;
+				CellRows[point.Y][point.X].ForeColor = color;
+			}
+			else
+			{
+				if (CellRows[point.Y][point.X].BackColor == color)
+					return;
+				CellRows[point.Y][point.X].BackColor = color;
+			}
+
+
+
+			if (CurrentAction is PaintAction)
+			{
+				((PaintAction)CurrentAction).PaintedPoints.Add(point);
+			}
+		
+
+			RepaintSingleCell(point);
+			
+
+			if (point.Y - 1 >= 0) // up
+			{
+				curpoint.Y = point.Y - 1;
+				curpoint.X = point.X;
+				if (foreground)
+				{
+					if (CellRows[curpoint.Y][curpoint.X].ForeColor == origcolor)
+						FillCell(curpoint, origcolor, color, foreground);
+				}
+				else
+					if (CellRows[curpoint.Y][curpoint.X].BackColor == origcolor)
+						FillCell(curpoint, origcolor, color, foreground);
+			}
+			if ( point.X + 1 < m_Columns ) // right
+			{
+				curpoint.Y = point.Y;
+				curpoint.X = point.X + 1;
+				if (foreground)
+				{
+					if (CellRows[curpoint.Y][curpoint.X].ForeColor == origcolor)
+						FillCell(curpoint, origcolor, color, foreground);
+				}
+				else
+					if (CellRows[curpoint.Y][curpoint.X].BackColor == origcolor)
+						FillCell(curpoint, origcolor, color, foreground);
+			}
+
+			if (point.X - 1 >= 0) // left
+			{
+				curpoint.Y = point.Y;
+				curpoint.X = point.X - 1;
+				if (foreground)
+				{
+					if (CellRows[curpoint.Y][curpoint.X].ForeColor == origcolor)
+						FillCell(curpoint, origcolor, color, foreground);
+				}
+				else
+					if (CellRows[curpoint.Y][curpoint.X].BackColor == origcolor)
+						FillCell(curpoint, origcolor, color, foreground);
+			}
+			if (point.Y + 1 < m_Rows)	// down
+			{
+				curpoint.Y = point.Y + 1;
+				curpoint.X = point.X;
+				if (foreground)
+				{
+					if (CellRows[curpoint.Y][curpoint.X].ForeColor == origcolor)
+						FillCell(curpoint, origcolor, color, foreground);
+				}
+				else
+					if (CellRows[curpoint.Y][curpoint.X].BackColor == origcolor)
+						FillCell(curpoint, origcolor, color, foreground);
+			}
+
+			if ( m_Modified == false )
+				Modified = true;
+
+
+		}
+
+		private void PaintCell(Point point, byte color, bool foreground)
+		{
+			if (CurrentAction is PaintAction)
+			{
+				PaintAction act = (PaintAction)CurrentAction;
+				act.IsForeground = foreground;
+				act.NewPaintColor = color;
+				if (foreground)
+					act.OldPaintColor = CellRows[point.Y][point.X].ForeColor;
+				else
+					act.OldPaintColor = CellRows[point.Y][point.X].BackColor;
+				act.PaintedPoints.Add(new Point(point.X, point.Y));
+			}
+
+
+			if ( foreground )
+				CellRows[point.Y][point.X].ForeColor = color;
+			else
+				CellRows[point.Y][point.X].BackColor = color;
+			RepaintSingleCell(point);
+	
+			if (m_Modified == false)
+				Modified = true;
+
+
+		}
+
+		private void PaintCanvas_MouseMove(object sender, MouseEventArgs e)
+		{
+			if (e.Button != MouseButtons.None )
+			{
+				Point newpos = FindCellCoords(e.X, e.Y);
+				if ( newpos.X != SelectedCellPosition.X || newpos.Y != SelectedCellPosition.Y)
+				{
+					SelectAppropriateCell(e.X, e.Y);
+					if (m_PaintMode == PaintModes.Bold)
+					{
+						BoldSelectedCell();
+						RepaintSingleCell(newpos);
+					}
+					else if (m_PaintMode == PaintModes.Underline)
+					{
+						UnderlineSelectedCell();
+						RepaintSingleCell(newpos);
+					}
+					else if (m_PaintMode == PaintModes.RemoveFormatting)
+					{
+						RemoveFormattingSelectedCell();
+						RepaintSingleCell(newpos);
+					}
+					else if (CurrentAction is PaintAction)			
+					{
+						if (!((PaintAction)CurrentAction).PointExists(m_SelectedCellPosition))
+							PaintCellByMouseArgs(this.m_SelectedCellPosition, e);
+					}
+				}
+			}
+
+		}
+
+		private Point FindCellCoords(int x, int y)
+		{
+			// Find the cell we need to highlight.
+			int xpos = x / this.m_CellWidth;
+			int ypos = y / this.m_CellHeight;
+			if (xpos < 0)
+				xpos = 0;
+			if (ypos < 0)
+				ypos = 0;
+			if (ypos >= CellRows.Count)
+				ypos = CellRows.Count - 1;
+			if (xpos >= CellRows[ypos].Count)
+				xpos = CellRows[ypos].Count - 1;
+			return new Point(xpos, ypos);
+		}
+
+		private void SelectAppropriateCell(int x, int y)
+		{
+			Point oldpos = m_SelectedCellPosition;
+
+			SelectedCellPosition = FindCellCoords(x, y);
+			
+			RepaintSingleCell(oldpos); 
+			RepaintSingleCell(m_SelectedCellPosition); 
+		} 
+
+		private ColorPalette m_Colors = new ColorPalette(); 
+
+		/// <summary> 
+		/// Gets or sets the Colors.
+		/// </summary>
+		public ColorPalette Colors
+		{
+			get { return m_Colors; }
+			set { m_Colors = value; this.Invalidate(); }
+		}
+
+		public List<List<CellInfo>> CellRows;
+		 
+		private byte m_LeftMouseColor = 0;
+
+		/// <summary>
+		/// Gets or sets the LeftMouseColor .
+		/// </summary>
+		public byte LeftMouseColor 
+		{
+			get { return m_LeftMouseColor ; }
+			set { m_LeftMouseColor  = value; }
+		}
+
+		private byte m_MiddleMouseColor = 4;
+
+		/// <summary>
+		/// Gets or sets the MiddleMouseColor.
+		/// </summary>
+		public byte MiddleMouseColor
+		{
+			get { return m_MiddleMouseColor; }
+			set { m_MiddleMouseColor = value; }
+		}
+
+		private byte m_RightMouseColor = 1;
+
+		/// <summary>
+		/// Gets or sets the RightMouseColor.
+		/// </summary>
+		public byte RightMouseColor
+		{
+			get { return m_RightMouseColor; }
+			set { m_RightMouseColor = value; }
+		}
+		 
+		private bool m_LeftMouseIsForeground = true;
+
+		/// <summary>
+		/// Gets or sets the LeftMouseIsForeground.
+		/// </summary>
+		public bool LeftMouseIsForeground
+		{
+			get { return m_LeftMouseIsForeground; }
+			set { m_LeftMouseIsForeground = value; }
+		} 
+
+		private bool m_MiddleMouseIsForeground = false;
+
+		/// <summary>
+		/// Gets or sets the MiddleMouseIsForeground.
+		/// </summary>
+		public bool MiddleMouseIsForeground
+		{
+			get { return m_MiddleMouseIsForeground; }
+			set { m_MiddleMouseIsForeground = value; }
+		} 
+
+		private bool m_RightMouseIsForeground = false;
+
+		/// <summary>
+		/// Gets or sets the RightMouseIsForeground.
+		/// </summary>
+		public bool RightMouseIsForeground
+		{
+			get { return m_RightMouseIsForeground; }
+			set { m_RightMouseIsForeground = value; }
+		}
+
+		public CellInfo SelectedCell
+		{
+			get { return CellRows[m_SelectedCellPosition.Y][m_SelectedCellPosition.X]; }
+		}
+	
+
+		private void PaintCanvas_KeyPress(object sender, KeyPressEventArgs e)
+		{
+			e.Handled = true;
+			Point oldpos = m_SelectedCellPosition;
+			if (!char.IsControl((char)e.KeyChar) ) // && e.KeyChar != (char)Keys.Up && e.KeyChar != (char)Keys.Down && e.KeyChar != (char)Keys.Left && e.KeyChar != (char)Keys.Right && e.KeyChar != (char)Keys.Return)
+			{
+				AddCharacterChangeToKeypressAction(m_SelectedCellPosition.X, m_SelectedCellPosition.Y, SelectedCell.Character, (char)e.KeyChar);
+				SelectedCell.Character = (char)e.KeyChar;
+				SelectedCell.ForeColor = m_MostRecentForegroundColor;
+
+				if (m_SelectedCellPosition.X + 1 < m_Columns)
+					m_SelectedCellPosition.X++;
+				else
+				{
+					m_SelectedCellPosition.X = 0;
+					m_SelectedCellPosition.Y++;
+				}
+				RepaintSingleCell(oldpos);
+				RepaintSingleCell(m_SelectedCellPosition);
+
+			}
+			
+		}
+
+
+		private int ParseChar(char c)
+		{
+			return (int)(c - 0x30);
+		}
+
+		private const char ColorControl = '\x0003';
+		private const char UnderlineControl = '\x001F';
+		private const char BoldControl = '\x0002';
+		private const char PlainControl = '\x000F';
+		private const char ReverseControl = '\x0016';
+
+		internal void LoadStream(System.IO.Stream stream)
+		{
+
+			StreamReader reader = new StreamReader(stream);
+
+			CellRows.Clear();
+			CellRows = new List<List<CellInfo>>();
+
+
+			//int col = 0;
+			int row = 0;
+			while(reader.Peek() >= 0 )
+			{
+				int bc = 100;
+				int fc = 100;
+				CellRows.Add(new List<CellInfo>());
+				string strline = reader.ReadLine();
+				char[] str = strline.ToCharArray();
+				bool bold = false;
+				bool underlined = false;
+				for(int i = 0; i < str.Length; i++)
+				{
+					
+					if (IsControlCode(str[i]))
+					{
+						if (str[i] == BoldControl)
+						{
+							bold = (bold ? false : true);
+							continue;
+						}
+						else if (str[i] == UnderlineControl)
+						{
+							underlined = (underlined ? false : true);
+							continue;
+						}
+						else if (str[i] == ReverseControl)
+						{
+							continue;
+						}
+						else if (str[i] == PlainControl)
+						{
+							bold = false;
+							underlined = false;
+							continue;
+						}
+						else if (str[i] == ColorControl)
+						{
+							//bc = 100;
+							fc = 100;
+
+
+							if (i + 1 == str.Length)
+								break;
+							i++;
+
+							if (Char.IsDigit(str[i]))
+							{
+								// forecolor += str[i];
+								fc = ParseChar(str[i]);
+
+								if (i + 1 == str.Length)
+									break;
+								i++;
+								if (Char.IsDigit(str[i]))
+								{
+									fc = ((fc * 10)) + ParseChar(str[i]);
+
+									if (i + 1 == str.Length)
+										break;
+									i++;
+
+								}
+
+							}
+
+							if (fc > 15 && fc != 100)
+								fc = 0;
+
+							if (str[i] == ',')
+							{
+								if (++i == str.Length)
+									break;
+
+								if (Char.IsDigit(str[i]))
+								{
+									bc = ParseChar(str[i]);
+									if (++i == str.Length)
+										break;
+
+									if (Char.IsDigit(str[i]))
+									{
+										bc = (bc * 10) + ParseChar(str[i]);
+										if (++i == str.Length)
+											break;
+									}
+								}
+							}
+
+							if (bc > 15 && bc != 100)
+								bc = 1;
+
+
+							/*for (; i < str.Length && IsControlCode(str[i]); i++)
+							{
+							}
+							 */
+
+						}
+					}
+					CellInfo ci = new CellInfo();
+					ci.Character = str[i];
+					if (fc != 100)
+						ci.ForeColor = (byte)fc;
+					if (bc != 100)
+						ci.BackColor = (byte)bc;
+					ci.Bold = bold;
+					ci.Underlined = underlined;
+					CellRows[row].Add(ci);
+
+
+				}
+				row++;
+				
+			}
+
+
+			// find longest row.
+			int longest = 0;
+			foreach (List<CellInfo> cellrow in CellRows)
+			{
+				if (cellrow.Count > longest)
+					longest = cellrow.Count;
+			}
+			this.m_Columns = longest;
+			this.m_Rows = CellRows.Count;
+			ResizeCellRows(); 
+			ResizeByCellSize(); 
+			PaintIntoBackground();
+		}
+
+		private bool IsControlCode(char c)
+		{
+			return
+				c == '\x0003' ||
+				c == '\x001F' ||
+				c == '\x0002' ||
+				c == '\x000F' ||
+				c == '\x0016';
+		}
+
+		private void PaintCanvas_Load(object sender, EventArgs e)
+		{
+			this.Font = new Font(Program.Settings.PaintFontName, Program.Settings.PaintFontSize);
+			this.CellHeight = Program.Settings.CellHeight;
+			this.CellWidth = Program.Settings.CellWidth;
+			this.HighlightColor = Program.Settings.HighlightColor;
+			this.LeftMouseColor = Program.Settings.LMBColor;
+			this.LeftMouseIsForeground = Program.Settings.LMBIsForeground;
+			
+			this.RightMouseColor = Program.Settings.RMBColor;
+			this.RightMouseIsForeground = Program.Settings.RMBIsForeground;
+			this.MiddleMouseColor = Program.Settings.MMBColor;
+			this.MiddleMouseIsForeground = Program.Settings.MMBIsForeground;
+			this.SeperatorColor = Program.Settings.SeperatorColor;
+			this.HighlightColor = Program.Settings.HighlightColor;
+
+			if (this.RightMouseIsForeground)
+				this.MostRecentForegroundColor = this.RightMouseColor;
+			if (this.MiddleMouseIsForeground)
+				this.MostRecentForegroundColor = this.MiddleMouseColor;
+			if (this.LeftMouseIsForeground)
+				this.MostRecentForegroundColor = this.LeftMouseColor;
+			
+		}
+
+		private byte m_MostRecentForegroundColor = 0;
+
+		/// <summary>
+		/// Gets or sets the MostRecentForegroundColor.
+		/// </summary>
+		public byte MostRecentForegroundColor
+		{
+			get { return m_MostRecentForegroundColor; }
+			set { m_MostRecentForegroundColor = value; }
+		}
+
+		private void PaintCanvas_KeyDown(object sender, KeyEventArgs e)
+		{
+			
+		}
+
+		public void ImportImage(string filename)
+		{
+			Bitmap bmp = new Bitmap(filename);
+
+			this.Columns = bmp.Width * 2;
+			this.Rows = bmp.Height;
+			for (int y = 0; y < bmp.Height; y++)
+			{
+				for (int x = 0; x < bmp.Width * 2; x++)
+				{
+					byte newcolor = this.Colors.FindClosestColor(bmp.GetPixel(x/2, y));
+					this.CellRows[y][x++].BackColor = newcolor;
+					this.CellRows[y][x].BackColor = newcolor;
+				}
+			}
+			this.PaintIntoBackground();
+			this.Invalidate();
+		}
+
+		private void PaintCanvas_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
+		{
+			//e.Handled = true;
+			bool repaint = false;
+			Point oldpos = m_SelectedCellPosition;
+
+			if (e.KeyCode == Keys.Up)
+			{
+				if (m_SelectedCellPosition.Y > 0)
+				{
+					m_SelectedCellPosition.Y--;
+				}
+				repaint = true;
+			}
+			else if (e.KeyCode == Keys.Right)
+			{
+				if (m_SelectedCellPosition.X < CellRows[0].Count)
+					m_SelectedCellPosition.X++;
+				repaint = true;
+			}
+			else if (e.KeyCode == Keys.Down)
+			{
+				if (m_SelectedCellPosition.Y < CellRows.Count)
+					m_SelectedCellPosition.Y++;
+				repaint = true;
+			}
+			else if (e.KeyCode == Keys.Left)
+			{
+				if (m_SelectedCellPosition.X > 0)
+					m_SelectedCellPosition.X--;
+				repaint = true;
+			}
+			else if (e.KeyCode == Keys.Return)
+			{
+				if (m_SelectedCellPosition.Y < CellRows.Count)
+					m_SelectedCellPosition.Y++;
+				m_SelectedCellPosition.X = 0;
+				repaint = true;
+			}
+			else if (e.KeyCode == Keys.Back)
+			{
+				if (m_SelectedCellPosition.X > 0)
+					m_SelectedCellPosition.X--;
+				AddCharacterChangeToKeypressAction(m_SelectedCellPosition.X, m_SelectedCellPosition.Y, SelectedCell.Character, ' ');
+				SelectedCell.Character = ' ';
+				
+				repaint = true;
+			}
+			else if (e.KeyCode == Keys.Delete)
+			{
+				AddCharacterChangeToKeypressAction(m_SelectedCellPosition.X, m_SelectedCellPosition.Y, SelectedCell.Character, ' ');
+				SelectedCell.Character = ' ';
+				repaint = true;
+			}
+
+			if (repaint)
+			{
+				RepaintSingleCell(oldpos);
+				RepaintSingleCell(m_SelectedCellPosition);
+			}
+		}
+
+		public void AddCharacterChangeToKeypressAction(int x, int y, char origchar, char newchar)
+		{
+			if (CurrentAction == null)
+			{
+				CurrentAction = new KeypressAction();
+				AddUndoAction(CurrentAction);
+			}
+
+			if (CurrentAction is KeypressAction)
+			{
+				((KeypressAction)CurrentAction).AddCharacter(x, y, origchar, newchar);
+			}
+		}
+
+		public class UndoChangedEventArgs : EventArgs
+		{
+			public static readonly new UndoChangedEventArgs Empty = new UndoChangedEventArgs();
+		}
+
+		public event EventHandler<UndoChangedEventArgs> UndoChanged;
+
+		protected virtual void OnUndoChanged(UndoChangedEventArgs e)
+		{
+			EventHandler<UndoChangedEventArgs> handler = UndoChanged;
+			if (handler != null)
+			{
+				handler(this, e);
+			}
+		}
+
+		public class RedoChangedEventArgs : EventArgs
+		{
+			public static readonly new RedoChangedEventArgs Empty = new RedoChangedEventArgs();
+		}
+
+		public event EventHandler<RedoChangedEventArgs> RedoChanged;
+
+		protected virtual void OnRedoChanged(RedoChangedEventArgs e)
+		{
+			EventHandler<RedoChangedEventArgs> handler = RedoChanged;
+			if (handler != null)
+			{
+				handler(this, e);
+			}
+		}
+
+		public void AddUndoAction(IUndoableAction action)
+		{
+			UndoList.Push(action);
+			if (RedoList.Count > 0)
+			{
+				RedoList.Clear();
+				OnRedoChanged(RedoChangedEventArgs.Empty);
+			}
+			OnUndoChanged(UndoChangedEventArgs.Empty);
+		}
+
+		public void AddRedoAction(IUndoableAction action)
+		{
+			RedoList.Push(action);
+			OnRedoChanged(RedoChangedEventArgs.Empty);
+		}
+
+		public void Undo()
+		{
+			if (UndoList.Count > 0)
+			{
+				IUndoableAction act = UndoList.Pop();
+				act.Undo(this);
+				OnUndoChanged(UndoChangedEventArgs.Empty);
+				RedoList.Push(act);
+				OnRedoChanged(RedoChangedEventArgs.Empty);
+			}
+		}
+
+		public void Redo()
+		{
+			if (RedoList.Count > 0)
+			{
+				IUndoableAction act = RedoList.Pop();
+				act.Redo(this);
+				OnRedoChanged(RedoChangedEventArgs.Empty);
+				//UndoList.Clear();
+				UndoList.Push(act);
+				OnUndoChanged(UndoChangedEventArgs.Empty);
+			}
+		}
+
+		private void PaintCanvas_MouseUp(object sender, MouseEventArgs e)
+		{
+			if (CurrentAction is PaintAction)
+			{
+				AddUndoAction(CurrentAction);
+				CurrentAction = null;
+				
+			}
+		}
+
+		public void RepaintAll()
+		{
+			this.PaintIntoBackground();
+			this.Invalidate();
+		}
+	}
+}
diff --git a/source/PaintCanvas.resx b/source/PaintCanvas.resx
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
+\ No newline at end of file
diff --git a/source/Program.cs b/source/Program.cs
@@ -0,0 +1,45 @@
+#region Copyright (c) 2007, PP4L Software
+/************************************************************************************
+
+Copyright  2007, PP4L Software
+Author:	Lampiasis <lampiasis@dvolker.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+'***********************************************************************************/
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Windows.Forms;
+
+namespace AsciiPumper
+{
+	static class Program
+	{
+		public static AsciiPumper.Properties.Settings Settings = new AsciiPumper.Properties.Settings();
+
+		/// <summary>
+		/// The main entry point for the application.
+		/// </summary>
+		[STAThread]
+		static void Main()
+		{
+			Application.EnableVisualStyles();
+			Application.SetCompatibleTextRenderingDefault(false);
+			Application.Run(new PumpForm()); //new MainForm());
+		}
+	}
+}
+\ No newline at end of file
diff --git a/source/Properties/AssemblyInfo.cs b/source/Properties/AssemblyInfo.cs
@@ -0,0 +1,33 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following 
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("Ascii Pumper")]
+[assembly: AssemblyDescription("Pumps up your IRC ascii art.")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("PP4L")]
+[assembly: AssemblyProduct("AsciiPumper")]
+[assembly: AssemblyCopyright("Copyright © Lampiasis <lampiasis@dvolker.com>  2007")]
+[assembly: AssemblyTrademark("ya we pumpin")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible 
+// to COM components.  If you need to access a type in this assembly from 
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("eb9df274-3e3c-4d3f-82de-890971e593b5")]
+
+// Version information for an assembly consists of the following four values:
+//
+//      Major Version
+//      Minor Version 
+//      Build Number
+//      Revision
+//
+[assembly: AssemblyVersion("1.1.0.1")]
+[assembly: AssemblyFileVersion("1.1.0.1")]
diff --git a/source/Properties/Resources.Designer.cs b/source/Properties/Resources.Designer.cs
@@ -0,0 +1,70 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:2.0.50727.1318
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace AsciiPumper.Properties {
+    using System;
+    
+    
+    /// <summary>
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
+    /// </summary>
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class Resources {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal Resources() {
+        }
+        
+        /// <summary>
+        ///   Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("AsciiPumper.Properties.Resources", typeof(Resources).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+        
+        internal static System.Drawing.Icon MainIcon {
+            get {
+                object obj = ResourceManager.GetObject("MainIcon", resourceCulture);
+                return ((System.Drawing.Icon)(obj));
+            }
+        }
+    }
+}
diff --git a/source/Properties/Resources.resx b/source/Properties/Resources.resx
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+  <data name="MainIcon" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\MainIcon.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+  </data>
+</root>
+\ No newline at end of file
diff --git a/source/Properties/Settings.Designer.cs b/source/Properties/Settings.Designer.cs
@@ -0,0 +1,220 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:2.0.50727.1318
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace AsciiPumper.Properties {
+    
+    
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.0.0.0")]
+    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
+        
+        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+        
+        public static Settings Default {
+            get {
+                return defaultInstance;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("Consolas")]
+        public string PaintFontName {
+            get {
+                return ((string)(this["PaintFontName"]));
+            }
+            set {
+                this["PaintFontName"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("False")]
+        public bool LMBIsForeground {
+            get {
+                return ((bool)(this["LMBIsForeground"]));
+            }
+            set {
+                this["LMBIsForeground"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("True")]
+        public bool MMBIsForeground {
+            get {
+                return ((bool)(this["MMBIsForeground"]));
+            }
+            set {
+                this["MMBIsForeground"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("False")]
+        public bool RMBIsForeground {
+            get {
+                return ((bool)(this["RMBIsForeground"]));
+            }
+            set {
+                this["RMBIsForeground"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("20")]
+        public int CellHeight {
+            get {
+                return ((int)(this["CellHeight"]));
+            }
+            set {
+                this["CellHeight"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("10")]
+        public int CellWidth {
+            get {
+                return ((int)(this["CellWidth"]));
+            }
+            set {
+                this["CellWidth"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("Salmon")]
+        public global::System.Drawing.Color HighlightColor {
+            get {
+                return ((global::System.Drawing.Color)(this["HighlightColor"]));
+            }
+            set {
+                this["HighlightColor"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("DimGray")]
+        public global::System.Drawing.Color SeperatorColor {
+            get {
+                return ((global::System.Drawing.Color)(this["SeperatorColor"]));
+            }
+            set {
+                this["SeperatorColor"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("80")]
+        public int Columns {
+            get {
+                return ((int)(this["Columns"]));
+            }
+            set {
+                this["Columns"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("15")]
+        public int Rows {
+            get {
+                return ((int)(this["Rows"]));
+            }
+            set {
+                this["Rows"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("0")]
+        public byte LMBColor {
+            get {
+                return ((byte)(this["LMBColor"]));
+            }
+            set {
+                this["LMBColor"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("4")]
+        public byte MMBColor {
+            get {
+                return ((byte)(this["MMBColor"]));
+            }
+            set {
+                this["MMBColor"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("1")]
+        public byte RMBColor {
+            get {
+                return ((byte)(this["RMBColor"]));
+            }
+            set {
+                this["RMBColor"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("10")]
+        public float PaintFontSize {
+            get {
+                return ((float)(this["PaintFontSize"]));
+            }
+            set {
+                this["PaintFontSize"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("True")]
+        public bool ShouldWatermark {
+            get {
+                return ((bool)(this["ShouldWatermark"]));
+            }
+            set {
+                this["ShouldWatermark"] = value;
+            }
+        }
+        
+        [global::System.Configuration.UserScopedSettingAttribute()]
+        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+        [global::System.Configuration.DefaultSettingValueAttribute("<?xml version=\"1.0\" encoding=\"utf-16\"?>\r\n<ArrayOfString xmlns:xsi=\"http://www.w3." +
+            "org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">\r\n  <s" +
+            "tring>asciipumper.txt</string>\r\n</ArrayOfString>")]
+        public global::System.Collections.Specialized.StringCollection RecentFiles {
+            get {
+                return ((global::System.Collections.Specialized.StringCollection)(this["RecentFiles"]));
+            }
+            set {
+                this["RecentFiles"] = value;
+            }
+        }
+    }
+}
diff --git a/source/PumpForm.Designer.cs b/source/PumpForm.Designer.cs
@@ -0,0 +1,688 @@
+namespace AsciiPumper
+{
+	partial class PumpForm
+	{
+		/// <summary>
+		/// Required designer variable.
+		/// </summary>
+		private System.ComponentModel.IContainer components = null;
+
+		/// <summary>
+		/// Clean up any resources being used.
+		/// </summary>
+		/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+		protected override void Dispose(bool disposing)
+		{
+			if (disposing && (components != null))
+			{
+				components.Dispose();
+			}
+			base.Dispose(disposing);
+		}
+
+		#region Windows Form Designer generated code
+
+		/// <summary>
+		/// Required method for Designer support - do not modify
+		/// the contents of this method with the code editor.
+		/// </summary>
+		private void InitializeComponent()
+		{
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PumpForm));
+            this.menuStrip = new System.Windows.Forms.MenuStrip();
+            this.fileMenu = new System.Windows.Forms.ToolStripMenuItem();
+            this.newToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.openToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.openRecentToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.recentFilesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();
+            this.saveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.saveAsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator();
+            this.printToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.printPreviewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.printSetupToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator();
+            this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.editMenu = new System.Windows.Forms.ToolStripMenuItem();
+            this.undoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.redoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator();
+            this.cutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.copyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.pasteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator();
+            this.selectAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.viewMenu = new System.Windows.Forms.ToolStripMenuItem();
+            this.toolBarToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.statusBarToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.toolsMenu = new System.Windows.Forms.ToolStripMenuItem();
+            this.optionsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.imageImporterToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.windowsMenu = new System.Windows.Forms.ToolStripMenuItem();
+            this.newWindowToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.cascadeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.tileVerticalToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.tileHorizontalToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.closeAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.arrangeIconsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.helpMenu = new System.Windows.Forms.ToolStripMenuItem();
+            this.rEADMETXTToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.contentsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.indexToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.searchToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.toolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator();
+            this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.toolStrip = new System.Windows.Forms.ToolStrip();
+            this.newToolStripButton = new System.Windows.Forms.ToolStripButton();
+            this.openToolStripButton = new System.Windows.Forms.ToolStripButton();
+            this.saveToolStripButton = new System.Windows.Forms.ToolStripButton();
+            this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
+            this.printToolStripButton = new System.Windows.Forms.ToolStripButton();
+            this.printPreviewToolStripButton = new System.Windows.Forms.ToolStripButton();
+            this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
+            this.helpToolStripButton = new System.Windows.Forms.ToolStripButton();
+            this.statusStrip = new System.Windows.Forms.StatusStrip();
+            this.toolStripStatusLabel = new System.Windows.Forms.ToolStripStatusLabel();
+            this.toolStripProgressBar1 = new System.Windows.Forms.ToolStripProgressBar();
+            this.menuStrip.SuspendLayout();
+            this.toolStrip.SuspendLayout();
+            this.statusStrip.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // menuStrip
+            // 
+            this.menuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.fileMenu,
+            this.editMenu,
+            this.viewMenu,
+            this.toolsMenu,
+            this.windowsMenu,
+            this.helpMenu});
+            this.menuStrip.Location = new System.Drawing.Point(0, 0);
+            this.menuStrip.MdiWindowListItem = this.windowsMenu;
+            this.menuStrip.Name = "menuStrip";
+            this.menuStrip.Size = new System.Drawing.Size(1008, 24);
+            this.menuStrip.TabIndex = 0;
+            this.menuStrip.Text = "MenuStrip";
+            // 
+            // fileMenu
+            // 
+            this.fileMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.newToolStripMenuItem,
+            this.openToolStripMenuItem,
+            this.openRecentToolStripMenuItem,
+            this.toolStripSeparator3,
+            this.saveToolStripMenuItem,
+            this.saveAsToolStripMenuItem,
+            this.toolStripSeparator4,
+            this.printToolStripMenuItem,
+            this.printPreviewToolStripMenuItem,
+            this.printSetupToolStripMenuItem,
+            this.toolStripSeparator5,
+            this.exitToolStripMenuItem});
+            this.fileMenu.ImageTransparentColor = System.Drawing.SystemColors.ActiveBorder;
+            this.fileMenu.Name = "fileMenu";
+            this.fileMenu.Size = new System.Drawing.Size(37, 20);
+            this.fileMenu.Text = "&File";
+            // 
+            // newToolStripMenuItem
+            // 
+            this.newToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("newToolStripMenuItem.Image")));
+            this.newToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Black;
+            this.newToolStripMenuItem.Name = "newToolStripMenuItem";
+            this.newToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.N)));
+            this.newToolStripMenuItem.Size = new System.Drawing.Size(146, 22);
+            this.newToolStripMenuItem.Text = "&New";
+            this.newToolStripMenuItem.Click += new System.EventHandler(this.ShowNewForm);
+            // 
+            // openToolStripMenuItem
+            // 
+            this.openToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("openToolStripMenuItem.Image")));
+            this.openToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Black;
+            this.openToolStripMenuItem.Name = "openToolStripMenuItem";
+            this.openToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O)));
+            this.openToolStripMenuItem.Size = new System.Drawing.Size(146, 22);
+            this.openToolStripMenuItem.Text = "&Open";
+            this.openToolStripMenuItem.Click += new System.EventHandler(this.OpenFile);
+            // 
+            // openRecentToolStripMenuItem
+            // 
+            this.openRecentToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.recentFilesToolStripMenuItem});
+            this.openRecentToolStripMenuItem.Name = "openRecentToolStripMenuItem";
+            this.openRecentToolStripMenuItem.Size = new System.Drawing.Size(146, 22);
+            this.openRecentToolStripMenuItem.Text = "Open &Recent";
+            // 
+            // recentFilesToolStripMenuItem
+            // 
+            this.recentFilesToolStripMenuItem.Name = "recentFilesToolStripMenuItem";
+            this.recentFilesToolStripMenuItem.Size = new System.Drawing.Size(131, 22);
+            this.recentFilesToolStripMenuItem.Text = "recent files";
+            // 
+            // toolStripSeparator3
+            // 
+            this.toolStripSeparator3.Name = "toolStripSeparator3";
+            this.toolStripSeparator3.Size = new System.Drawing.Size(143, 6);
+            // 
+            // saveToolStripMenuItem
+            // 
+            this.saveToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("saveToolStripMenuItem.Image")));
+            this.saveToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Black;
+            this.saveToolStripMenuItem.Name = "saveToolStripMenuItem";
+            this.saveToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S)));
+            this.saveToolStripMenuItem.Size = new System.Drawing.Size(146, 22);
+            this.saveToolStripMenuItem.Text = "&Save";
+            this.saveToolStripMenuItem.Click += new System.EventHandler(this.saveToolStripMenuItem_Click);
+            // 
+            // saveAsToolStripMenuItem
+            // 
+            this.saveAsToolStripMenuItem.Name = "saveAsToolStripMenuItem";
+            this.saveAsToolStripMenuItem.Size = new System.Drawing.Size(146, 22);
+            this.saveAsToolStripMenuItem.Text = "Save &As";
+            this.saveAsToolStripMenuItem.Click += new System.EventHandler(this.SaveAsToolStripMenuItem_Click);
+            // 
+            // toolStripSeparator4
+            // 
+            this.toolStripSeparator4.Name = "toolStripSeparator4";
+            this.toolStripSeparator4.Size = new System.Drawing.Size(143, 6);
+            // 
+            // printToolStripMenuItem
+            // 
+            this.printToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("printToolStripMenuItem.Image")));
+            this.printToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Black;
+            this.printToolStripMenuItem.Name = "printToolStripMenuItem";
+            this.printToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.P)));
+            this.printToolStripMenuItem.Size = new System.Drawing.Size(146, 22);
+            this.printToolStripMenuItem.Text = "&Print";
+            this.printToolStripMenuItem.Click += new System.EventHandler(this.printToolStripMenuItem_Click);
+            // 
+            // printPreviewToolStripMenuItem
+            // 
+            this.printPreviewToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("printPreviewToolStripMenuItem.Image")));
+            this.printPreviewToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Black;
+            this.printPreviewToolStripMenuItem.Name = "printPreviewToolStripMenuItem";
+            this.printPreviewToolStripMenuItem.Size = new System.Drawing.Size(146, 22);
+            this.printPreviewToolStripMenuItem.Text = "Print Pre&view";
+            this.printPreviewToolStripMenuItem.Click += new System.EventHandler(this.printPreviewToolStripMenuItem_Click);
+            // 
+            // printSetupToolStripMenuItem
+            // 
+            this.printSetupToolStripMenuItem.Enabled = false;
+            this.printSetupToolStripMenuItem.Name = "printSetupToolStripMenuItem";
+            this.printSetupToolStripMenuItem.Size = new System.Drawing.Size(146, 22);
+            this.printSetupToolStripMenuItem.Text = "Print Setup";
+            this.printSetupToolStripMenuItem.Visible = false;
+            this.printSetupToolStripMenuItem.Click += new System.EventHandler(this.printSetupToolStripMenuItem_Click);
+            // 
+            // toolStripSeparator5
+            // 
+            this.toolStripSeparator5.Name = "toolStripSeparator5";
+            this.toolStripSeparator5.Size = new System.Drawing.Size(143, 6);
+            // 
+            // exitToolStripMenuItem
+            // 
+            this.exitToolStripMenuItem.Name = "exitToolStripMenuItem";
+            this.exitToolStripMenuItem.Size = new System.Drawing.Size(146, 22);
+            this.exitToolStripMenuItem.Text = "E&xit";
+            this.exitToolStripMenuItem.Click += new System.EventHandler(this.ExitToolsStripMenuItem_Click);
+            // 
+            // editMenu
+            // 
+            this.editMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.undoToolStripMenuItem,
+            this.redoToolStripMenuItem,
+            this.toolStripSeparator6,
+            this.cutToolStripMenuItem,
+            this.copyToolStripMenuItem,
+            this.pasteToolStripMenuItem,
+            this.toolStripSeparator7,
+            this.selectAllToolStripMenuItem});
+            this.editMenu.Name = "editMenu";
+            this.editMenu.Size = new System.Drawing.Size(39, 20);
+            this.editMenu.Text = "&Edit";
+            // 
+            // undoToolStripMenuItem
+            // 
+            this.undoToolStripMenuItem.Enabled = false;
+            this.undoToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("undoToolStripMenuItem.Image")));
+            this.undoToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Black;
+            this.undoToolStripMenuItem.Name = "undoToolStripMenuItem";
+            this.undoToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Z)));
+            this.undoToolStripMenuItem.Size = new System.Drawing.Size(164, 22);
+            this.undoToolStripMenuItem.Text = "&Undo";
+            this.undoToolStripMenuItem.Click += new System.EventHandler(this.undoToolStripMenuItem_Click);
+            // 
+            // redoToolStripMenuItem
+            // 
+            this.redoToolStripMenuItem.Enabled = false;
+            this.redoToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("redoToolStripMenuItem.Image")));
+            this.redoToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Black;
+            this.redoToolStripMenuItem.Name = "redoToolStripMenuItem";
+            this.redoToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Y)));
+            this.redoToolStripMenuItem.Size = new System.Drawing.Size(164, 22);
+            this.redoToolStripMenuItem.Text = "&Redo";
+            this.redoToolStripMenuItem.Click += new System.EventHandler(this.redoToolStripMenuItem_Click);
+            // 
+            // toolStripSeparator6
+            // 
+            this.toolStripSeparator6.Name = "toolStripSeparator6";
+            this.toolStripSeparator6.Size = new System.Drawing.Size(161, 6);
+            this.toolStripSeparator6.Visible = false;
+            // 
+            // cutToolStripMenuItem
+            // 
+            this.cutToolStripMenuItem.Enabled = false;
+            this.cutToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("cutToolStripMenuItem.Image")));
+            this.cutToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Black;
+            this.cutToolStripMenuItem.Name = "cutToolStripMenuItem";
+            this.cutToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.X)));
+            this.cutToolStripMenuItem.Size = new System.Drawing.Size(164, 22);
+            this.cutToolStripMenuItem.Text = "Cu&t";
+            this.cutToolStripMenuItem.Visible = false;
+            this.cutToolStripMenuItem.Click += new System.EventHandler(this.CutToolStripMenuItem_Click);
+            // 
+            // copyToolStripMenuItem
+            // 
+            this.copyToolStripMenuItem.Enabled = false;
+            this.copyToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("copyToolStripMenuItem.Image")));
+            this.copyToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Black;
+            this.copyToolStripMenuItem.Name = "copyToolStripMenuItem";
+            this.copyToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.C)));
+            this.copyToolStripMenuItem.Size = new System.Drawing.Size(164, 22);
+            this.copyToolStripMenuItem.Text = "&Copy";
+            this.copyToolStripMenuItem.Visible = false;
+            this.copyToolStripMenuItem.Click += new System.EventHandler(this.CopyToolStripMenuItem_Click);
+            // 
+            // pasteToolStripMenuItem
+            // 
+            this.pasteToolStripMenuItem.Enabled = false;
+            this.pasteToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("pasteToolStripMenuItem.Image")));
+            this.pasteToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Black;
+            this.pasteToolStripMenuItem.Name = "pasteToolStripMenuItem";
+            this.pasteToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.V)));
+            this.pasteToolStripMenuItem.Size = new System.Drawing.Size(164, 22);
+            this.pasteToolStripMenuItem.Text = "&Paste";
+            this.pasteToolStripMenuItem.Visible = false;
+            this.pasteToolStripMenuItem.Click += new System.EventHandler(this.PasteToolStripMenuItem_Click);
+            // 
+            // toolStripSeparator7
+            // 
+            this.toolStripSeparator7.Name = "toolStripSeparator7";
+            this.toolStripSeparator7.Size = new System.Drawing.Size(161, 6);
+            this.toolStripSeparator7.Visible = false;
+            // 
+            // selectAllToolStripMenuItem
+            // 
+            this.selectAllToolStripMenuItem.Enabled = false;
+            this.selectAllToolStripMenuItem.Name = "selectAllToolStripMenuItem";
+            this.selectAllToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.A)));
+            this.selectAllToolStripMenuItem.Size = new System.Drawing.Size(164, 22);
+            this.selectAllToolStripMenuItem.Text = "Select &All";
+            this.selectAllToolStripMenuItem.Visible = false;
+            // 
+            // viewMenu
+            // 
+            this.viewMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.toolBarToolStripMenuItem,
+            this.statusBarToolStripMenuItem});
+            this.viewMenu.Name = "viewMenu";
+            this.viewMenu.Size = new System.Drawing.Size(44, 20);
+            this.viewMenu.Text = "&View";
+            // 
+            // toolBarToolStripMenuItem
+            // 
+            this.toolBarToolStripMenuItem.Checked = true;
+            this.toolBarToolStripMenuItem.CheckOnClick = true;
+            this.toolBarToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Checked;
+            this.toolBarToolStripMenuItem.Name = "toolBarToolStripMenuItem";
+            this.toolBarToolStripMenuItem.Size = new System.Drawing.Size(126, 22);
+            this.toolBarToolStripMenuItem.Text = "&Toolbar";
+            this.toolBarToolStripMenuItem.Click += new System.EventHandler(this.ToolBarToolStripMenuItem_Click);
+            // 
+            // statusBarToolStripMenuItem
+            // 
+            this.statusBarToolStripMenuItem.Checked = true;
+            this.statusBarToolStripMenuItem.CheckOnClick = true;
+            this.statusBarToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Checked;
+            this.statusBarToolStripMenuItem.Name = "statusBarToolStripMenuItem";
+            this.statusBarToolStripMenuItem.Size = new System.Drawing.Size(126, 22);
+            this.statusBarToolStripMenuItem.Text = "&Status Bar";
+            this.statusBarToolStripMenuItem.Click += new System.EventHandler(this.StatusBarToolStripMenuItem_Click);
+            // 
+            // toolsMenu
+            // 
+            this.toolsMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.optionsToolStripMenuItem,
+            this.imageImporterToolStripMenuItem});
+            this.toolsMenu.Name = "toolsMenu";
+            this.toolsMenu.Size = new System.Drawing.Size(48, 20);
+            this.toolsMenu.Text = "&Tools";
+            // 
+            // optionsToolStripMenuItem
+            // 
+            this.optionsToolStripMenuItem.Name = "optionsToolStripMenuItem";
+            this.optionsToolStripMenuItem.Size = new System.Drawing.Size(165, 22);
+            this.optionsToolStripMenuItem.Text = "&Options";
+            this.optionsToolStripMenuItem.Click += new System.EventHandler(this.optionsToolStripMenuItem_Click);
+            // 
+            // imageImporterToolStripMenuItem
+            // 
+            this.imageImporterToolStripMenuItem.Name = "imageImporterToolStripMenuItem";
+            this.imageImporterToolStripMenuItem.Size = new System.Drawing.Size(165, 22);
+            this.imageImporterToolStripMenuItem.Text = "Image importer...";
+            this.imageImporterToolStripMenuItem.Click += new System.EventHandler(this.imageImporterToolStripMenuItem_Click);
+            // 
+            // windowsMenu
+            // 
+            this.windowsMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.newWindowToolStripMenuItem,
+            this.cascadeToolStripMenuItem,
+            this.tileVerticalToolStripMenuItem,
+            this.tileHorizontalToolStripMenuItem,
+            this.closeAllToolStripMenuItem,
+            this.arrangeIconsToolStripMenuItem});
+            this.windowsMenu.Name = "windowsMenu";
+            this.windowsMenu.Size = new System.Drawing.Size(68, 20);
+            this.windowsMenu.Text = "&Windows";
+            // 
+            // newWindowToolStripMenuItem
+            // 
+            this.newWindowToolStripMenuItem.Name = "newWindowToolStripMenuItem";
+            this.newWindowToolStripMenuItem.Size = new System.Drawing.Size(151, 22);
+            this.newWindowToolStripMenuItem.Text = "&New Window";
+            this.newWindowToolStripMenuItem.Click += new System.EventHandler(this.ShowNewForm);
+            // 
+            // cascadeToolStripMenuItem
+            // 
+            this.cascadeToolStripMenuItem.Name = "cascadeToolStripMenuItem";
+            this.cascadeToolStripMenuItem.Size = new System.Drawing.Size(151, 22);
+            this.cascadeToolStripMenuItem.Text = "&Cascade";
+            this.cascadeToolStripMenuItem.Click += new System.EventHandler(this.CascadeToolStripMenuItem_Click);
+            // 
+            // tileVerticalToolStripMenuItem
+            // 
+            this.tileVerticalToolStripMenuItem.Name = "tileVerticalToolStripMenuItem";
+            this.tileVerticalToolStripMenuItem.Size = new System.Drawing.Size(151, 22);
+            this.tileVerticalToolStripMenuItem.Text = "Tile &Vertical";
+            this.tileVerticalToolStripMenuItem.Click += new System.EventHandler(this.TileVerticalToolStripMenuItem_Click);
+            // 
+            // tileHorizontalToolStripMenuItem
+            // 
+            this.tileHorizontalToolStripMenuItem.Name = "tileHorizontalToolStripMenuItem";
+            this.tileHorizontalToolStripMenuItem.Size = new System.Drawing.Size(151, 22);
+            this.tileHorizontalToolStripMenuItem.Text = "Tile &Horizontal";
+            this.tileHorizontalToolStripMenuItem.Click += new System.EventHandler(this.TileHorizontalToolStripMenuItem_Click);
+            // 
+            // closeAllToolStripMenuItem
+            // 
+            this.closeAllToolStripMenuItem.Name = "closeAllToolStripMenuItem";
+            this.closeAllToolStripMenuItem.Size = new System.Drawing.Size(151, 22);
+            this.closeAllToolStripMenuItem.Text = "C&lose All";
+            this.closeAllToolStripMenuItem.Click += new System.EventHandler(this.CloseAllToolStripMenuItem_Click);
+            // 
+            // arrangeIconsToolStripMenuItem
+            // 
+            this.arrangeIconsToolStripMenuItem.Name = "arrangeIconsToolStripMenuItem";
+            this.arrangeIconsToolStripMenuItem.Size = new System.Drawing.Size(151, 22);
+            this.arrangeIconsToolStripMenuItem.Text = "&Arrange Icons";
+            this.arrangeIconsToolStripMenuItem.Click += new System.EventHandler(this.ArrangeIconsToolStripMenuItem_Click);
+            // 
+            // helpMenu
+            // 
+            this.helpMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.rEADMETXTToolStripMenuItem,
+            this.contentsToolStripMenuItem,
+            this.indexToolStripMenuItem,
+            this.searchToolStripMenuItem,
+            this.toolStripSeparator8,
+            this.aboutToolStripMenuItem});
+            this.helpMenu.Name = "helpMenu";
+            this.helpMenu.Size = new System.Drawing.Size(44, 20);
+            this.helpMenu.Text = "&Help";
+            // 
+            // rEADMETXTToolStripMenuItem
+            // 
+            this.rEADMETXTToolStripMenuItem.Name = "rEADMETXTToolStripMenuItem";
+            this.rEADMETXTToolStripMenuItem.Size = new System.Drawing.Size(168, 22);
+            this.rEADMETXTToolStripMenuItem.Text = "README.TXT";
+            this.rEADMETXTToolStripMenuItem.Click += new System.EventHandler(this.rEADMETXTToolStripMenuItem_Click);
+            // 
+            // contentsToolStripMenuItem
+            // 
+            this.contentsToolStripMenuItem.Enabled = false;
+            this.contentsToolStripMenuItem.Name = "contentsToolStripMenuItem";
+            this.contentsToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.F1)));
+            this.contentsToolStripMenuItem.Size = new System.Drawing.Size(168, 22);
+            this.contentsToolStripMenuItem.Text = "&Contents";
+            // 
+            // indexToolStripMenuItem
+            // 
+            this.indexToolStripMenuItem.Enabled = false;
+            this.indexToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("indexToolStripMenuItem.Image")));
+            this.indexToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Black;
+            this.indexToolStripMenuItem.Name = "indexToolStripMenuItem";
+            this.indexToolStripMenuItem.Size = new System.Drawing.Size(168, 22);
+            this.indexToolStripMenuItem.Text = "&Index";
+            // 
+            // searchToolStripMenuItem
+            // 
+            this.searchToolStripMenuItem.Enabled = false;
+            this.searchToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("searchToolStripMenuItem.Image")));
+            this.searchToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Black;
+            this.searchToolStripMenuItem.Name = "searchToolStripMenuItem";
+            this.searchToolStripMenuItem.Size = new System.Drawing.Size(168, 22);
+            this.searchToolStripMenuItem.Text = "&Search";
+            // 
+            // toolStripSeparator8
+            // 
+            this.toolStripSeparator8.Name = "toolStripSeparator8";
+            this.toolStripSeparator8.Size = new System.Drawing.Size(165, 6);
+            // 
+            // aboutToolStripMenuItem
+            // 
+            this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem";
+            this.aboutToolStripMenuItem.Size = new System.Drawing.Size(168, 22);
+            this.aboutToolStripMenuItem.Text = "&About ...";
+            this.aboutToolStripMenuItem.Click += new System.EventHandler(this.aboutToolStripMenuItem_Click);
+            // 
+            // toolStrip
+            // 
+            this.toolStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.newToolStripButton,
+            this.openToolStripButton,
+            this.saveToolStripButton,
+            this.toolStripSeparator1,
+            this.printToolStripButton,
+            this.printPreviewToolStripButton,
+            this.toolStripSeparator2,
+            this.helpToolStripButton});
+            this.toolStrip.Location = new System.Drawing.Point(0, 24);
+            this.toolStrip.Name = "toolStrip";
+            this.toolStrip.Size = new System.Drawing.Size(1008, 25);
+            this.toolStrip.TabIndex = 1;
+            this.toolStrip.Text = "ToolStrip";
+            // 
+            // newToolStripButton
+            // 
+            this.newToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.newToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("newToolStripButton.Image")));
+            this.newToolStripButton.ImageTransparentColor = System.Drawing.Color.Black;
+            this.newToolStripButton.Name = "newToolStripButton";
+            this.newToolStripButton.Size = new System.Drawing.Size(23, 22);
+            this.newToolStripButton.Text = "New";
+            this.newToolStripButton.Click += new System.EventHandler(this.ShowNewForm);
+            // 
+            // openToolStripButton
+            // 
+            this.openToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.openToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("openToolStripButton.Image")));
+            this.openToolStripButton.ImageTransparentColor = System.Drawing.Color.Black;
+            this.openToolStripButton.Name = "openToolStripButton";
+            this.openToolStripButton.Size = new System.Drawing.Size(23, 22);
+            this.openToolStripButton.Text = "Open";
+            this.openToolStripButton.Click += new System.EventHandler(this.OpenFile);
+            // 
+            // saveToolStripButton
+            // 
+            this.saveToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.saveToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("saveToolStripButton.Image")));
+            this.saveToolStripButton.ImageTransparentColor = System.Drawing.Color.Black;
+            this.saveToolStripButton.Name = "saveToolStripButton";
+            this.saveToolStripButton.Size = new System.Drawing.Size(23, 22);
+            this.saveToolStripButton.Text = "Save";
+            this.saveToolStripButton.Click += new System.EventHandler(this.saveToolStripButton_Click);
+            // 
+            // toolStripSeparator1
+            // 
+            this.toolStripSeparator1.Name = "toolStripSeparator1";
+            this.toolStripSeparator1.Size = new System.Drawing.Size(6, 25);
+            // 
+            // printToolStripButton
+            // 
+            this.printToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.printToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("printToolStripButton.Image")));
+            this.printToolStripButton.ImageTransparentColor = System.Drawing.Color.Black;
+            this.printToolStripButton.Name = "printToolStripButton";
+            this.printToolStripButton.Size = new System.Drawing.Size(23, 22);
+            this.printToolStripButton.Text = "Print";
+            this.printToolStripButton.Click += new System.EventHandler(this.printToolStripButton_Click);
+            // 
+            // printPreviewToolStripButton
+            // 
+            this.printPreviewToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.printPreviewToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("printPreviewToolStripButton.Image")));
+            this.printPreviewToolStripButton.ImageTransparentColor = System.Drawing.Color.Black;
+            this.printPreviewToolStripButton.Name = "printPreviewToolStripButton";
+            this.printPreviewToolStripButton.Size = new System.Drawing.Size(23, 22);
+            this.printPreviewToolStripButton.Text = "Print Preview";
+            this.printPreviewToolStripButton.Click += new System.EventHandler(this.printPreviewToolStripButton_Click);
+            // 
+            // toolStripSeparator2
+            // 
+            this.toolStripSeparator2.Name = "toolStripSeparator2";
+            this.toolStripSeparator2.Size = new System.Drawing.Size(6, 25);
+            // 
+            // helpToolStripButton
+            // 
+            this.helpToolStripButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
+            this.helpToolStripButton.Enabled = false;
+            this.helpToolStripButton.Image = ((System.Drawing.Image)(resources.GetObject("helpToolStripButton.Image")));
+            this.helpToolStripButton.ImageTransparentColor = System.Drawing.Color.Black;
+            this.helpToolStripButton.Name = "helpToolStripButton";
+            this.helpToolStripButton.Size = new System.Drawing.Size(23, 22);
+            this.helpToolStripButton.Text = "Help";
+            // 
+            // statusStrip
+            // 
+            this.statusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.toolStripStatusLabel,
+            this.toolStripProgressBar1});
+            this.statusStrip.Location = new System.Drawing.Point(0, 604);
+            this.statusStrip.Name = "statusStrip";
+            this.statusStrip.Size = new System.Drawing.Size(1008, 22);
+            this.statusStrip.TabIndex = 2;
+            this.statusStrip.Text = "StatusStrip";
+            this.statusStrip.Visible = false;
+            // 
+            // toolStripStatusLabel
+            // 
+            this.toolStripStatusLabel.Name = "toolStripStatusLabel";
+            this.toolStripStatusLabel.Size = new System.Drawing.Size(891, 17);
+            this.toolStripStatusLabel.Spring = true;
+            // 
+            // toolStripProgressBar1
+            // 
+            this.toolStripProgressBar1.Name = "toolStripProgressBar1";
+            this.toolStripProgressBar1.Size = new System.Drawing.Size(100, 16);
+            // 
+            // PumpForm
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(1008, 626);
+            this.Controls.Add(this.statusStrip);
+            this.Controls.Add(this.toolStrip);
+            this.Controls.Add(this.menuStrip);
+            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+            this.IsMdiContainer = true;
+            this.MainMenuStrip = this.menuStrip;
+            this.Name = "PumpForm";
+            this.Text = "Ascii Pumper";
+            this.Load += new System.EventHandler(this.PumpForm_Load);
+            this.MdiChildActivate += new System.EventHandler(this.PumpForm_MdiChildActivate);
+            this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.PumpForm_FormClosing);
+            this.menuStrip.ResumeLayout(false);
+            this.menuStrip.PerformLayout();
+            this.toolStrip.ResumeLayout(false);
+            this.toolStrip.PerformLayout();
+            this.statusStrip.ResumeLayout(false);
+            this.statusStrip.PerformLayout();
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+		}
+		#endregion
+
+
+		private System.Windows.Forms.MenuStrip menuStrip;
+		private System.Windows.Forms.ToolStrip toolStrip;
+		private System.Windows.Forms.StatusStrip statusStrip;
+		private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
+		private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
+		private System.Windows.Forms.ToolStripSeparator toolStripSeparator3;
+		private System.Windows.Forms.ToolStripSeparator toolStripSeparator4;
+		private System.Windows.Forms.ToolStripSeparator toolStripSeparator5;
+		private System.Windows.Forms.ToolStripSeparator toolStripSeparator6;
+		private System.Windows.Forms.ToolStripMenuItem printSetupToolStripMenuItem;
+		private System.Windows.Forms.ToolStripSeparator toolStripSeparator7;
+		private System.Windows.Forms.ToolStripSeparator toolStripSeparator8;
+		private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel;
+		private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem;
+		private System.Windows.Forms.ToolStripMenuItem tileHorizontalToolStripMenuItem;
+		private System.Windows.Forms.ToolStripMenuItem fileMenu;
+		private System.Windows.Forms.ToolStripMenuItem newToolStripMenuItem;
+		private System.Windows.Forms.ToolStripMenuItem openToolStripMenuItem;
+		private System.Windows.Forms.ToolStripMenuItem saveToolStripMenuItem;
+		private System.Windows.Forms.ToolStripMenuItem saveAsToolStripMenuItem;
+		private System.Windows.Forms.ToolStripMenuItem printToolStripMenuItem;
+		private System.Windows.Forms.ToolStripMenuItem printPreviewToolStripMenuItem;
+		private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem;
+		private System.Windows.Forms.ToolStripMenuItem editMenu;
+		private System.Windows.Forms.ToolStripMenuItem undoToolStripMenuItem;
+		private System.Windows.Forms.ToolStripMenuItem redoToolStripMenuItem;
+		private System.Windows.Forms.ToolStripMenuItem cutToolStripMenuItem;
+		private System.Windows.Forms.ToolStripMenuItem copyToolStripMenuItem;
+		private System.Windows.Forms.ToolStripMenuItem pasteToolStripMenuItem;
+		private System.Windows.Forms.ToolStripMenuItem selectAllToolStripMenuItem;
+		private System.Windows.Forms.ToolStripMenuItem viewMenu;
+		private System.Windows.Forms.ToolStripMenuItem toolBarToolStripMenuItem;
+		private System.Windows.Forms.ToolStripMenuItem statusBarToolStripMenuItem;
+		private System.Windows.Forms.ToolStripMenuItem toolsMenu;
+		private System.Windows.Forms.ToolStripMenuItem optionsToolStripMenuItem;
+		private System.Windows.Forms.ToolStripMenuItem windowsMenu;
+		private System.Windows.Forms.ToolStripMenuItem newWindowToolStripMenuItem;
+		private System.Windows.Forms.ToolStripMenuItem cascadeToolStripMenuItem;
+		private System.Windows.Forms.ToolStripMenuItem tileVerticalToolStripMenuItem;
+		private System.Windows.Forms.ToolStripMenuItem closeAllToolStripMenuItem;
+		private System.Windows.Forms.ToolStripMenuItem arrangeIconsToolStripMenuItem;
+		private System.Windows.Forms.ToolStripMenuItem helpMenu;
+		private System.Windows.Forms.ToolStripMenuItem contentsToolStripMenuItem;
+		private System.Windows.Forms.ToolStripMenuItem indexToolStripMenuItem;
+		private System.Windows.Forms.ToolStripMenuItem searchToolStripMenuItem;
+		private System.Windows.Forms.ToolStripButton newToolStripButton;
+		private System.Windows.Forms.ToolStripButton openToolStripButton;
+		private System.Windows.Forms.ToolStripButton saveToolStripButton;
+		private System.Windows.Forms.ToolStripButton printToolStripButton;
+		private System.Windows.Forms.ToolStripButton printPreviewToolStripButton;
+        private System.Windows.Forms.ToolStripButton helpToolStripButton;
+		private System.Windows.Forms.ToolStripProgressBar toolStripProgressBar1;
+		private System.Windows.Forms.ToolStripMenuItem imageImporterToolStripMenuItem;
+		private System.Windows.Forms.ToolStripMenuItem openRecentToolStripMenuItem;
+		private System.Windows.Forms.ToolStripMenuItem recentFilesToolStripMenuItem;
+		private System.Windows.Forms.ToolStripMenuItem rEADMETXTToolStripMenuItem;
+	}
+}
+
+
+
diff --git a/source/PumpForm.cs b/source/PumpForm.cs
@@ -0,0 +1,474 @@
+#region Copyright (c) 2007, PP4L Software
+/************************************************************************************
+
+Copyright  2007, PP4L Software
+Author:	Lampiasis <lampiasis@dvolker.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+'***********************************************************************************/
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using System.IO;
+using System.Net;
+using System.Text.RegularExpressions;
+using System.Reflection;
+using System.Diagnostics;
+using System.Threading;
+using System.Drawing.Printing;
+
+namespace AsciiPumper
+{
+	public partial class PumpForm : Form
+	{
+		private int childFormNumber = 0;
+
+		public PumpForm()
+		{
+			InitializeComponent();
+		}
+
+		private void ShowNewForm(object sender, EventArgs e)
+		{
+			// Create a new instance of the child form.
+			MainForm childForm = new MainForm();
+			// Make it a child of this MDI form before showing it.
+			childForm.MdiParent = this;
+			//childForm.Text = "(Untitled)";
+			childForm.FileName = "(Untitled " + ++childFormNumber + ")";
+			childForm.FileModified = false;
+			childForm.UndoChanged += new EventHandler<MainForm.UndoChangedEventArgs>(childForm_UndoChanged);
+			childForm.RedoChanged += new EventHandler<MainForm.RedoChangedEventArgs>(childForm_RedoChanged);
+			childForm.Show();
+		}
+
+		void childForm_RedoChanged(object sender, MainForm.RedoChangedEventArgs e)
+		{
+			if (sender is MainForm)
+			{
+				MainForm form = (MainForm)sender;
+
+				if (form.RedoList.Count > 0)
+					redoToolStripMenuItem.Enabled = true;
+				else
+					redoToolStripMenuItem.Enabled = false;
+			}
+		}
+
+		void childForm_UndoChanged(object sender, MainForm.UndoChangedEventArgs e)
+		{
+			if (sender is MainForm)
+			{
+				MainForm form = (MainForm)sender;
+
+				if (form.UndoList.Count > 0)
+					undoToolStripMenuItem.Enabled = true;
+				else
+					undoToolStripMenuItem.Enabled = false;
+			}
+		}
+
+		private void OpenFile(object sender, EventArgs e)
+		{
+			OpenFileDialog openFileDialog = new OpenFileDialog();
+			openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
+			openFileDialog.Filter = "Text Files (*.txt)|*.txt|All Files (*.*)|*.*";
+			if (openFileDialog.ShowDialog(this) == DialogResult.OK)
+			{
+				OpenFileByName(openFileDialog.FileName);
+			}
+		}
+
+		private void OpenFileByName(string fn)
+		{
+			
+			Cursor cur = Cursor.Current;
+			Cursor.Current = Cursors.WaitCursor;
+			try
+			{
+				Stream stream = File.OpenRead(fn);
+				MainForm form = new MainForm();
+
+				form.LoadStream(stream);
+
+				stream.Close();
+				form.FileName = fn;
+				form.MdiParent = this;
+				form.FileModified = false;
+				form.UndoChanged += new EventHandler<MainForm.UndoChangedEventArgs>(childForm_UndoChanged);
+				form.RedoChanged += new EventHandler<MainForm.RedoChangedEventArgs>(childForm_RedoChanged);
+				form.Show();
+
+			}
+			finally
+			{
+				Cursor.Current = cur;
+			}
+			AddFileToRecentFiles(fn);
+		}
+
+		private void SaveAsToolStripMenuItem_Click(object sender, EventArgs e)
+		{
+			if (this.ActiveMdiChild == null)
+			{
+				MessageBox.Show(this, "No files are loaded.");
+				return;
+			}
+			SaveFileDialog saveFileDialog = new SaveFileDialog();
+			saveFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
+			saveFileDialog.Filter = "Text Files (*.txt)|*.txt|All Files (*.*)|*.*";
+			if (saveFileDialog.ShowDialog(this) == DialogResult.OK)
+			{
+				Stream stream = saveFileDialog.OpenFile();
+				StreamWriter writer = new StreamWriter(stream);
+				if (this.ActiveMdiChild is MainForm)
+				{
+					((MainForm)this.ActiveMdiChild).FileName = saveFileDialog.FileName;
+					((MainForm)this.ActiveMdiChild).FileModified = false;
+					writer.Write(((MainForm)this.ActiveMdiChild).GetIRCString(false));
+					writer.Close();
+				}
+
+				AddFileToRecentFiles(saveFileDialog.FileName);
+			}
+		}
+
+		private void ExitToolsStripMenuItem_Click(object sender, EventArgs e)
+		{
+			Application.Exit();
+		}
+
+		private void CutToolStripMenuItem_Click(object sender, EventArgs e)
+		{
+			// TODO: Use System.Windows.Forms.Clipboard to insert the selected text or images into the clipboard
+		}
+
+		private void CopyToolStripMenuItem_Click(object sender, EventArgs e)
+		{
+			// TODO: Use System.Windows.Forms.Clipboard to insert the selected text or images into the clipboard
+		}
+
+		private void PasteToolStripMenuItem_Click(object sender, EventArgs e)
+		{
+			// TODO: Use System.Windows.Forms.Clipboard.GetText() or System.Windows.Forms.GetData to retrieve information from the clipboard.
+		}
+
+		private void ToolBarToolStripMenuItem_Click(object sender, EventArgs e)
+		{
+			toolStrip.Visible = toolBarToolStripMenuItem.Checked;
+		}
+
+		private void StatusBarToolStripMenuItem_Click(object sender, EventArgs e)
+		{
+			statusStrip.Visible = statusBarToolStripMenuItem.Checked;
+		}
+
+		private void CascadeToolStripMenuItem_Click(object sender, EventArgs e)
+		{
+			LayoutMdi(MdiLayout.Cascade);
+		}
+
+		private void TileVerticalToolStripMenuItem_Click(object sender, EventArgs e)
+		{
+			LayoutMdi(MdiLayout.TileVertical);
+		}
+
+		private void TileHorizontalToolStripMenuItem_Click(object sender, EventArgs e)
+		{
+			LayoutMdi(MdiLayout.TileHorizontal);
+		}
+
+		private void ArrangeIconsToolStripMenuItem_Click(object sender, EventArgs e)
+		{
+			LayoutMdi(MdiLayout.ArrangeIcons);
+		}
+
+		private void CloseAllToolStripMenuItem_Click(object sender, EventArgs e)
+		{
+			foreach (Form childForm in MdiChildren)
+			{
+				childForm.Close();
+			}
+		}
+
+		private void aboutToolStripMenuItem_Click(object sender, EventArgs e)
+		{
+			(new AboutBox1()).ShowDialog(this);
+		}
+
+		private void optionsToolStripMenuItem_Click(object sender, EventArgs e)
+		{
+			OptionsForm optionsform = new OptionsForm();
+			optionsform.SettingsSaved += new EventHandler<OptionsForm.SettingsSavedEventArgs>(optionsform_SettingsSaved);
+			optionsform.ShowDialog(this);
+
+		}
+
+		private void AddFileToRecentFiles(string fn)
+		{
+			Program.Settings.RecentFiles.Remove(fn);
+			Program.Settings.RecentFiles.Add(fn);
+			while (Program.Settings.RecentFiles.Count > 10)
+			{
+				Program.Settings.RecentFiles.RemoveAt(0);
+			}
+			ReloadRecentFiles();
+		}
+
+		void optionsform_SettingsSaved(object sender, OptionsForm.SettingsSavedEventArgs e)
+		{
+			foreach (Form form in this.MdiChildren)
+			{
+				if (form is MainForm)
+				{
+					((MainForm)form).RepaintCanvas();
+				}
+
+			}
+		}
+
+		private void ReloadRecentFiles()
+		{
+			openRecentToolStripMenuItem.DropDownItems.Clear();
+			if (Program.Settings.RecentFiles == null)
+			{
+				Program.Settings.RecentFiles = new System.Collections.Specialized.StringCollection();
+			}
+			for (int i = Program.Settings.RecentFiles.Count - 1; i >= 0; i--)
+			{
+				openRecentToolStripMenuItem.DropDownItems.Add(Program.Settings.RecentFiles[i], null, new EventHandler(OpenRecentHandler));
+			}
+			
+		}
+
+		private void PumpForm_Load(object sender, EventArgs e)
+		{
+			new Thread(new ThreadStart(this.CheckForNewVersion)).Start();
+
+			ReloadRecentFiles();
+
+			string[] args = Environment.GetCommandLineArgs();
+			if ( args.Length > 1 )
+				OpenFileByName(args[1]);
+			else
+				ShowNewForm(this, EventArgs.Empty);
+		}
+
+		private void OpenRecentHandler(object sender, EventArgs e)
+		{
+			ToolStripMenuItem menu = (ToolStripMenuItem) sender;
+
+			// see if file is open already
+			foreach (Form form in this.MdiChildren)
+			{
+				if (form is MainForm)
+				{
+					if (((MainForm)form).FileName == menu.Text)
+					{
+						form.Activate();
+						return;
+					}
+				}
+			}
+
+			// open file
+			OpenFileByName(menu.Text);
+		}
+
+		private void CheckForNewVersion()
+		{
+			// this is really non-critical code so let's discard all exceptions and go on with life ok?
+			try
+			{
+				WebRequest request = WebRequest.Create("http://code.google.com/p/asciipumper");
+
+				// Get the response.
+				HttpWebResponse response = (HttpWebResponse)request.GetResponse();
+				// Get the stream containing content returned by the server.
+				Stream dataStream = response.GetResponseStream();
+				// Open the stream using a StreamReader for easy access.
+				StreamReader reader = new StreamReader(dataStream);
+				// Read the content.
+				string responseFromServer = reader.ReadToEnd();
+				Regex versionregex = new Regex(@"Latest release version: (\d+)\.(\d+)\.(\d+)\.(\d+)", RegexOptions.Multiline);
+				MatchCollection matches = versionregex.Matches(responseFromServer);
+				if (matches.Count >= 1 && matches[0].Captures.Count >= 1)
+				{
+					int v1, v2, v3, v4;
+					v1 = int.Parse(matches[0].Groups[1].Value);
+					v2 = int.Parse(matches[0].Groups[2].Value);
+					v3 = int.Parse(matches[0].Groups[3].Value);
+					v4 = int.Parse(matches[0].Groups[4].Value);
+
+					Version v = Assembly.GetExecutingAssembly().GetName().Version;
+					bool old = false;
+					if (v.Major < v1)
+						old = true;
+					if (v.Major == v1 && v.Minor < v2)
+						old = true;
+					if (v.Major == v1 && v.Minor == v2 && v.Build < v3)
+						old = true;
+					if (v.Major == v1 && v.Minor == v2 && v.Build == v3 && v.Revision < v4)
+						old = true;
+
+					if (old)
+					{
+						DialogResult res = MessageBox.Show(string.Format("A new version of Ascii Pumper is available.\r\nYou have: {0}.\r\nLatest release: {1}.{2}.{3}.{4}.\r\n\r\nVisit homepage?", v.ToString(), v1, v2, v3, v4), "New Ascii Pumper version", MessageBoxButtons.YesNo);
+						if (res == DialogResult.Yes)
+						{
+							ProcessStartInfo pi = new ProcessStartInfo("http://code.google.com/p/asciipumper/");
+							Process.Start(pi);
+						}
+					}
+				}
+
+			}
+			catch (Exception e)
+			{
+				// this is really non-critical code so let's discard all exceptions and go on with life ok?
+			}
+
+
+		}
+
+		private void saveToolStripButton_Click(object sender, EventArgs e)
+		{
+			if (this.ActiveMdiChild == null)
+			{
+				MessageBox.Show(this, "No files are loaded.");
+				return;
+			}
+
+			if (this.ActiveMdiChild is MainForm)
+			{
+				((MainForm)this.ActiveMdiChild).SaveDocument();
+				AddFileToRecentFiles(((MainForm)this.ActiveMdiChild).FileName );
+			}
+
+		}
+
+		private void saveToolStripMenuItem_Click(object sender, EventArgs e)
+		{
+			saveToolStripButton_Click(sender, e);
+		}
+
+		private void imageImporterToolStripMenuItem_Click(object sender, EventArgs e)
+		{
+			OpenFileDialog ofd = new OpenFileDialog();
+			ofd.Filter = "Supported images (*.bmp, *.jpeg, *.jpg, *.png, *.gif)|*.bmp;*.jpeg;*.jpg;*.png;*.gif|Bitmaps (*.bmp)|*.bmp|GIFs (*.gif)|*.gif|JPEGs (*.jpg,*.jpeg)|*.jpeg;*.jpg|PNGs (*.png)|*.png|All Files (*.*)|*.*";
+			DialogResult res = ofd.ShowDialog(this);
+			if (res == DialogResult.OK)
+			{
+				
+				// Create a new instance of the child form.
+				MainForm childForm = new MainForm();
+				// Make it a child of this MDI form before showing it.
+				childForm.MdiParent = this;
+				//childForm.Text = "(Untitled)";
+				childForm.FileName = "(Imported image " + ++childFormNumber + ")";
+				childForm.FileModified = false;
+				childForm.Show();
+				childForm.ImportImage(ofd.FileName);
+				
+			}
+		}
+
+		private void printPreviewToolStripMenuItem_Click(object sender, EventArgs e)
+		{
+			PrintPreviewDialog previewdlg = new PrintPreviewDialog();
+			previewdlg.Document = new System.Drawing.Printing.PrintDocument();
+			previewdlg.Document.PrintPage += new PrintPageEventHandler(Document_PrintPage);
+			previewdlg.ShowDialog(this);
+		}
+
+		void Document_PrintPage(object sender, PrintPageEventArgs e)
+		{
+			if (this.ActiveMdiChild is MainForm)
+			{
+				((MainForm)this.ActiveMdiChild).PrintToGraphicDevice(e.Graphics, e);
+			}
+		}
+
+		private void printToolStripButton_Click(object sender, EventArgs e)
+		{
+			PrintDialog printdlg = new PrintDialog();
+			printdlg.Document = new PrintDocument();
+			printdlg.Document.PrintPage += new PrintPageEventHandler(Document_PrintPage);
+			if (printdlg.ShowDialog(this) == DialogResult.OK)
+				printdlg.Document.Print();
+
+		}
+
+		private void printPreviewToolStripButton_Click(object sender, EventArgs e)
+		{
+			printPreviewToolStripMenuItem_Click(sender, e);
+		}
+
+		private void printSetupToolStripMenuItem_Click(object sender, EventArgs e)
+		{
+
+		}
+
+		private void printToolStripMenuItem_Click(object sender, EventArgs e)
+		{
+			printToolStripButton_Click(sender, e);
+		}
+
+		private void redoToolStripMenuItem_Click(object sender, EventArgs e)
+		{
+			if (this.ActiveMdiChild is MainForm)
+			{
+				MainForm form = (MainForm)this.ActiveMdiChild;
+
+				form.Redo();
+			}
+		}
+
+		private void undoToolStripMenuItem_Click(object sender, EventArgs e)
+		{
+			if (this.ActiveMdiChild is MainForm)
+			{
+				MainForm form = (MainForm)this.ActiveMdiChild;
+
+				form.Undo();
+			}
+		}
+
+		private void PumpForm_FormClosing(object sender, FormClosingEventArgs e)
+		{
+			Program.Settings.Save();
+		}
+
+		private void rEADMETXTToolStripMenuItem_Click(object sender, EventArgs e)
+		{
+			ProcessStartInfo pi = new ProcessStartInfo( /*Assembly.GetExecutingAssembly().Location*/ "README.TXT");
+			Process.Start(pi);
+		}
+
+		private void PumpForm_MdiChildActivate(object sender, EventArgs e)
+		{
+			childForm_UndoChanged(this.ActiveMdiChild, MainForm.UndoChangedEventArgs.Empty);
+			childForm_RedoChanged(this.ActiveMdiChild, MainForm.RedoChangedEventArgs.Empty);
+
+		}
+	}
+}
diff --git a/source/PumpForm.resx b/source/PumpForm.resx
@@ -0,0 +1,430 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="menuStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>218, 17</value>
+  </metadata>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="newToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAQpJREFUOE+t021L
+        wlAUB3C/VH6H+hr5jSRfiPSiFiEDgwWGRhZm0EoQcQN7QoblWPNp6py6h3/cwWDkvde98MDhvrnndznn
+        cFOpfYVU7+J/lmoKipUWhGs5TO5bpJgVBfEB6aMMH7m6V5nAiVBB9UnhI+Jtmwlkz27C4iiprVyWm0zA
+        9XwQJIKowLn0TAWCIIDtbGCM7BA4ODymD/O09EgF1hsPY8uBplt8IF+sbQGeH2BmrzEwF3jXxnwgd1Hd
+        ApyVC3OyRO9nis6HyQdIf/Egg5vOV+gbM3R7I7yqenIgPrjP/gTtt180Wt/Jgfjg1K8h5M4Ady9aMiDa
+        N+tkrjHaMbmwK/f1gUPnD9/19ZYU1J08AAAAAElFTkSuQmCC
+</value>
+  </data>
+  <data name="openToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAl9JREFUOE+9k1tI
+        E2AYhnfRRVcWaVEIRpaEXYiBIdVFSNJJUUqzwkgTylMHDMU2D206dXMnp650mNt0TZ1WlmFYIRSKRGip
+        o8S0LCgqxcxQydPT3EKTLPCmH96bn+99vvf7fn6B4H+cnGIzEq2Fy3ITeToraUojy+obnawjLF7lMJ0X
+        lpNlh6VIDUQlFyOoM2tYSo01sr92SUgrITxRRWh8gRPQ22VkYqTWoR/DFqYGDVhNKurN0iUhYQlqQuO0
+        BMcWIaitUDM+XLXIPPOphClbElXlcipLczEUZ6EvyOSaUkSRLHUxtNqoYPyLcb7zrN1MrwhssUvqD8CN
+        MhnfP+odsefMTXUKh+5b82mwyLhdmYvVkI1FL8Gku8J1bTqlahE6hdCZplKfy+i7QuZiv2kRU1+lZuaN
+        BAaki/XWftefBj3J8DKRzpoILsaEIDDosvnWJ4f3Su5Uq2h7oHQW/T7CiyhoD2e6NYiJhwG8rvDh3Kn9
+        TkCZVszXVxIGWjOotyiZ7RdDd5wT0BljNx5nui2EieZ9jDbuZqhuO5J4L04EujmXWaLOYKhLyE2zgo4n
+        9iQ9SXbAGeg4yezTw0w+PshY0x6G6/34XO1Ne85qIoM88dvq4gTo8kV0N2dyy5wPfZnw3B732VEmW4IZ
+        exTASIM/g1YfPhi3YFO6Io7djO8294WnLMxLpdYkx3Y3gXaNYF5tyhU0y1ZyL2sVNelrMaS6c/XSRiIP
+        bcLf12MBoJGmoBGfJU8YTdqFY47FnI4I5MiBnezd5cMOHy+8Pd3x2ODGujUurHf9FX1Zv+kfxT8BMS7u
+        X4BvNFkAAAAASUVORK5CYII=
+</value>
+  </data>
+  <data name="saveToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAilJREFUOE+tk91L
+        k3EUx/cvdN9N0EW3NTWGa7EaPOUcyqphWBG9PZEv5dJlmqhYmUYtXyBb4dJJy+kknFT4BqZIjaFMJUsz
+        V7TEoabYRDD49ju/6Pm1Mm/qB+fy8znPOef7qFT/4z17GgWVr30Zbd4lPHYvoLEhgvuOGdTWfIL9dgg3
+        yqdQWjKBwoLXyMsdxYXzQSi9CeztAWqqV7HRW1ldgzGtF4fTnvBSBN7WRS6orPjyV57gyMIKdpufQ62W
+        YTnkEQL3o3kuKC35vK7gJ/w+vIg4kw8Fl6dxwNwkBM76WS64ZHv3h+BXeGQygm2SF9accaSmOIWg7m6Y
+        C7KzRmMEv8ODwTA2692Q5QBMJocQVFd95AL5TEARrAf3+D9gU2IDjhx9gaSkWiG4WTmN7i6wUwLHT76C
+        5dgA3zYtjGamz6bOP+A+HLR0QpLsQnC1bBIdPrAMAE2ub+zuX1F+fY4vlRZGM2dmBBU4ObUdBkOFEFwp
+        HIenGXjoXGPBicKYnhNT5hM2pJ8r4p2TUxi83wO9vkwIbHljDAaq7kR5ZxJQSOK0EobezmJsag5y7jXs
+        NbZxWLvHBZ2uSAgolo57UD6bBASfzb+FN6F5hGaWcLHYjni9i8GNiN/1ANrEfCHIzBhmcy/zmbcaPNiy
+        Q0JLRz98XYPo7vNj4OUQ9pksUOvqkcDg7Zo6aDTWWMHpU/08npQwCgndmU5F26aF0czUlYrgnQnZQvAv
+        f/R3bGg6a0rM640AAAAASUVORK5CYII=
+</value>
+  </data>
+  <data name="printToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAi5JREFUOE+tk+1P
+        klEYxlkf+39aW1utttpM1NJqwzIjnM5J0TAmBSHLCFNJ7cVaUqNH5gLdQxY4RkxrbDqDzBJdOt0SKLAg
+        TEDDeLl6nkPgSNz64L1d29nZ7ut3nfucw+HsdBltUxi0f4RpdGZb0SNubMtlDd67ffi3Nn4n4fGvYNA6
+        gZJzV8GtvrLVhG1mlUqlEQxH4HB9IhqyO2Ewj8M140WVSE0MCibQW1z4/DWcB2fJq9E4ZheXQduchFyQ
+        rqXHwSrJ0L2BUB7d6piG0+1BZYMKx87LodG+wL0+62YKRecz0jzinCd0lpolB0IxzC+F0Guwo5Qvg7Kr
+        H0/oMZQyRuQYTW16qB8OgTK/wyOjA/qXb3GXsuH6HSPELVrwGztQXqNA8VkpTl+4iW6dBRKVFsXZId5+
+        +gqRWHzL1NmNRDKF9XiCzOB7eB1fvkUhb6dQJ+1iEsgyCVQPTDC/+YDndhco02vc7xuGumcAsnYdRM09
+        EFzuAK+hBccFchSdkeAis1cpvIGDJ0UZA2X3AHz+YMEEkbUNeAKr2A0O0S6KA764DSXVUuw5WpMxaO40
+        YHpuCczccsWuf0QTmPOtYWw2TJotfw1O1CpwoEK4aaDUUND00vAG4wjH0vD/TGNxOYWJhV8Ynoyi37FC
+        yFkd4YlJcy5BvaQVsls6jE76yN3+j/IM2GNIVI9RUadEmeAauMwzLapqwmFeIw6duoT95ULsK6vHXm5t
+        jpyj78RP/gPgHTGb+rLlcwAAAABJRU5ErkJggg==
+</value>
+  </data>
+  <data name="printPreviewToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAdVJREFUOE+t099L
+        U2Ecx3H/GemqiygrwpsIzESJqJzzx4VOnMQkKFToZjcZQf5oDd0SXa0m/sJjnJU5K5eb1oIig8nUiwah
+        brLUInG6zb3znLB2PNu68QtfHjjweX2f5+E8OTmHUaJnnoMtTPoZdH3G4fwgd9Y5UjhT9Qy/5WRRbXZk
+        1D2XEeh0uJiY8WdHhl99yQiYn7yUw/ud9ij9Yx9VQDy2xdTMFJZHdm63mbhr6iS/RJf+Lp6KPgWwvb2F
+        OD7Oa880och3voUjOAQRnaGRKsMtNWITvArAPe3F5fbI3+IJ+BXdZWU9gdk2hLZarwa6BycVQJfNzvJq
+        5G84/CPOwnIMp3eesspKNdDVN6EAOizdLK2uyZPDG4m98A6+hSgPR3xcLi1VA9JNp5YgOhFdbkIbe5NX
+        YrxfjPLi0yYNzUbKyssxtTQqkVQgmUzyNRjkXoeZ3oHnPPMGsAo+GpqMaLRXGbhfhWi9rkRSgZ1YgvWf
+        UfyBAA8sFvTXDNTU1lGhuYT55jlCj8+z+64ae/uNf8g+IK2ZuuVOK/UlJ5g15rFkPcuaU0OT/uKfo0ih
+        vAu6/3ZB0RX0xcd503yausKjaItPZX9k6X5baRf5x45QeCZXDv8Gd10kHhF4wJIAAAAASUVORK5CYII=
+</value>
+  </data>
+  <data name="undoToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAZlJREFUOE+1ktsr
+        w2EYx/0p7sidnIkWlmMsSQxzlrkxhxySOV4oM9qSHG+ctuVsLCmxG+5QcoOUhZxP++324zdKDit+ylvP
+        3fP5vM/zfl8vr/88RqsL45LA6JrA1KaAWSyLXeBXd+rnBdzVNSvQanLSPO5kZPVN4FHSZblicvvN7oZ6
+        FlyUGO6I1WwTUWIjJN9KXP0xAzYPArexdfyS0Q2BZpNA76ILle4CuWaLqLI1gnKnia1YJixviozOOybE
+        vm9rVA9cUD74TOWwkyzdI+FFVkIL5kXY/NqsaLLhnzmGvO6Qlgnnd0Gh/pykthuyu5+pHb7BN8lAYI7p
+        vdFbpiWq3I689ogWswdBWvsZwdUnJLRdvU5SoDtFO3b7WaC2k6g9p92TILregazqgHD1FoF5K/grZ/BN
+        7nsXBKvmiFRvoui4RtPv+DnKr1H5JBrE8Q8pNd7TLcb7q7/wsSm0eJ30zgcytDvSYJX+HlnFLqkdD6Q0
+        7OOnGJImiG90iPAT8TV7BCgt0mD3Ckox1piaA4JyZqXDkh/qL8ALl3QQwQeUb4QAAAAASUVORK5CYII=
+</value>
+  </data>
+  <data name="redoToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAZNJREFUOE/Nkt8r
+        Q2EcxvenuMGSdsE2mptdGGYrU7NiZsoi5HdhyTY/VohdbKSxTdjM1mrKr6SEm7njSolQu9FaRue814/3
+        HFHr0CgXTj1X5/l+3ud9vq9I9Fdf9JwgckYQpgocE8zHWVjXWfyIzw1z8h8R2IMsJrZZOKMsRjcohCon
+        hBv2HhJUWx9R1roHheUAyp4ELB4GAz4WA/53yNYFgXLwWggMnRIYZp4hN66hsjcOmSnGS27eRRuFdHgZ
+        dFNIgPoqOhN82qxUjhAL1cgdCmvnoRs/5H/KTBGUGsMo1q2iYfaVT9K1wkBq3hcmcEQ4wD0K1C7kKW2f
+        BmnzNsQaN4Z9aRgXGGgm05A0bAoBUxSgsT9RsycLsLhPwIk7WT2ZgnzoAWLtkhDQv5xEvTONksZYFoAr
+        TEHvLDUfQKIP8sP5VXNCwMIOQbsnA9XwLe3BnWUQFPbdTg22S+hnXlBuOcm9968gRbTturFr1E2/QNl3
+        hRZX5vcgDqK13kDnZFAzlvw94COZxpFCE11bzif8LwxvxTcHtycxLyQAAAAASUVORK5CYII=
+</value>
+  </data>
+  <data name="cutToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAaNJREFUOE+V07tL
+        W2EcxnH/AgcHJ6GjWifxVrR4K81gokdOYpoSpcHEYGuJCDFqFNEajdeUGgmIWomCkMugB4cWiqVLK95A
+        xU1EBC+oOGq3rzkRnOTw+s6/5/Pw3lJSBBaJJTD2MBJRfjOzpDwG1PDh8Sndg1NiSHAuznhoEe/gdDJw
+        e/efmPILx2evGKCGJmciBGdjajlnF9c4W3tIT0sVByIra4wGw6xv7fLn7w7mDy3PA8LRH4xNLTARCtPR
+        H8AgW8Xb1S2MfAvj7gtgd/VS1/ARnV5+HqAiNpcPs60Nk3MIyeYTB6zDN1hGrjANHKP3bGDo2KbGu4+h
+        fRNdy09tyOK/5P34Dca+Q0qs3ymQA+hca0jdB7xNhIvr57UBs/8c89ApFc7lZLhAnkDv3kDqOqCyWSHf
+        +FUbqPOdIPcfUdmkkFc7lgRqE+3Vndu8soTIKf+kDRi/HCF59ii1x8k1PByc3v2P0sYo2a/tZLzI1gZq
+        unYpa4wl2kfJLHyXfDxljjgvS2xkFlnIk/zawJvmVQpNk2QVN5Bb1SN+dcJf9YnBe5GF6RjGCzzaAAAA
+        AElFTkSuQmCC
+</value>
+  </data>
+  <data name="copyToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAd1JREFUOE+lk99L
+        U2EYgP1TShlSXdt9RGpSYFB4UVCQRVe70KuuIsMgqxkLnG0Tc5ayzc70RKSLlJlraTJzrl+TlkFtMJVz
+        dDmnZ/a480mzLdgEX3juvvd5f3zfV1a235DHv6AjjYUFzuEgvfI77tpk9uTWkwvDMRTgastTjtY1lpZ4
+        RsN5+ZmtP3T0vcLrD3O+qb20xDkyIwTeCEgfIBRVeeh4iTSh4h5XcPkUHo8omAeXBRfvx/K76pUDuQ42
+        NjOoq2liiaQQFEZr/yJVV/yC3H7sbp841+3fxDSsclP6RXNPlL7XS/8JmqwJ5EmVIw1DAiGxZOfV515L
+        aSwqKRZiK3yKLmF/EReCNikjCM2vcMkU53DDcw6dHaCy/smOQJ93Pa3lKhvtEa5ZPvLAtZDXgfpbY/7n
+        Ov65VazSNIbTXbsCNZnm8/cEM19jBEI/GHv/jZbuneu90Z/EaIlz4V6EM7dmBVZpCkNd566g6uRlCmk2
+        zwqBlh0voWjMRdcYDap43izzaCBARY25+BtpbJ0Ugn8r/+2g0/2W8hOm4oJz132kNrawDwaxeaaxPpsS
+        lfVki3OCg8fvFBfUGL3ZbbsElfUODKdsVNR2UF7dnk1u48Cx26Wf+Z4+034PbQPvwt9VHJdeuQAAAABJ
+        RU5ErkJggg==
+</value>
+  </data>
+  <data name="pasteToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAk9JREFUOE+1k1lI
+        lGEUhn/owm6KFuqqq4LoJooIqouMwixMmzASMzInYlRKRpk0HVJLU3Rym7RsjFwGNbdKlJQiERKHdg3H
+        aJFIjZwmaxbXyeLp/78YclovogMv5+Z7l3M4nyT9j+pqzabjagbNFSloo3bxR4+m6kJmoyL/AA5bDeO2
+        Swz155GkCaQwS8d5gx5jVqKAj6BCnnI24nE1MOWoxVyqY2K0iqRoFU+7kzl5LJhk9XpsXYcYbVuONnL3
+        zwIK2eOq40L2QXoseTjfFDPSr+eV5TAtZSqiI/ypSV3Go0KJ2P0/jNRQlS/cPc4rGFIjSdeFo48L40Rs
+        KDqNinh1MDERARRpVwiB8CB/3wS15QamnfVM201MDOdgfxKHtWqxQF/lInpK53Hf6CfICgI2rfUVMJuy
+        mbRXMDmYycSzo4w/3ouzdT4FlW3kmJo5da6eZIOZ+IwyolOMRCbk+gqUl2QwNmRkvF/D2INg3HfW8e76
+        EkH2lmfmMw7XFIMjDsJiThMSpf8uUlaQhvN5Ju57gbg7V+NqX8pQpSSclSq/1iVgquugb8AmyLe6rewI
+        VX8TKclN4UPvcVwdq3DeWIi90Y+By5KI/WnmCx/dsvNbB30vbVh6XxMUEU+gTN62cw/+m7cgFZ1JxH43
+        RiYv4H3TXIar52C9IKGVZ1ZiexNclBMUm9tp6bSKrmDjmpVIZ9MTxIF4t+ztGnlhs51vW14IcuPNHura
+        HvoKFKQdkS9MhTp0OyFbNwhlZdvKzF63X3WR4He1T9628uBv+OfP/BWTNfjZ3FJ2xwAAAABJRU5ErkJg
+        gg==
+</value>
+  </data>
+  <data name="indexToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAqRJREFUOE+Fk1tI
+        01EYwOdr0HOJvfdm9FpPBZFQDyFBCb71ZoZooZiXMeetnJs6L9O8m2s6clNRN7VdtDmnS5uXleQQ3Zzm
+        XRMvYfz6b6KVZn3wceBwfr/zfecSIjojqurcbG98F21u7ogODhBlZFwPOWvtqfkAHEiXa5Wa2inUbyaR
+        SgdIT7fxX8kR7HCsUqJyYbGu8M7ko9c0i6bJjSTDfrboJNzRuYjNtk2/ZQurZYPenlV0unkaGieEigb/
+        FJ2E29r9mE0bdHUt09q2SIsANmtnaaifRqVyI5ePkpk9eNjSSVin9wVBvd5Pk2aO+noPlZVTlJRMoFCM
+        kJMzzNMEE7FPDBzDLtd6sGdN0yxa7Rzq1zPU1kzT1OpD1rxOVNEekbItJJU+5CVjxDw2oGsdOBRomseR
+        K5zU1Hl4VfGZsmI3ysJxqrR+4jVQboEPc0J6obbvgAfZXlpMbqa9M4jEEisa7RgSaR+ygiFk+SO8zHNS
+        3eghTg3aIZhf2CQ118jth1XBUe/Y4WackzylA9GzRAMziz6M5lGSU3oQi63BO89qWEJlJhhH8PCoNygp
+        qrUjVS8QHWNElJqupkDZzcKmn9llob9CM9KsPu7lrqEfPRQEIlBFQHDtbhmljSM09O8TerkU0Yv8QWHn
+        XiENmGzjrO1/xWL/RITYh+43wda3vSCcmGlkekk4C/MuF8Jyfr1MSWYfKWk9FBRb8fjnUHXOI2/fOa7A
+        Luwur3TgEeBx4TATitxERFadftopaSaeC6IO8xduJXykw7nP7g8wvPcSfqOAyXko7Vjh/FUl2Urz3/9G
+        mthMUnI3dS2TXIkyIq6eQWPbpdGyQ7xiknPhCmKT3tI/4vv351JVOMlX2ol+1EropSwuhqVy5345MpWV
+        wTF/EP4JaStxoteu5NMAAAAASUVORK5CYII=
+</value>
+  </data>
+  <data name="searchToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAtpJREFUOE+Vk1lP
+        k1EQhutC/CHGGBM1MWpc4oVLSFGhRogfFAREqVCQshSoRRAQSlFUSitQwqKtqChBEepH3IKCC4agxoi4
+        YdSw1FTQCFpE5LEfF1aCXjhX55yced7MzDuzZH9ERrGIdGVyUjbXZ7Zsns8c2ei3cdnIV7ds0vNWnhMy
+        68//086ZJS0ctIjY29q5/roLsa8Fe28uSWIMguEk0Rl2VJmnpwRmxAGTiMEm0tB9hYdfntIzNkBaYwGm
+        V1nEXVaw0VhEmKGDUH0NUbrq6RDdMQdZFgcVnWZanDZuDXfSNdpNj9tFfX8zMVYjcusz1lgaWVumQkgu
+        ZmdKuRciAfLsItZHRZT16rC9t2DvM1L+xE782XrUFUOEHXvL0nNBLDrjz/r8REISSryA1CNNVDjeYRBN
+        7HuwjeTOALQ2PWm1nrKqLmEw16AvKibSHMfiUjmLjwQSpC7yApKMjVReGyOnshLFOTlbxVBU5WZKTzdz
+        o+0Og66PvHe6qL3YRESmhvkFfiiiDV6AJr8Bs8PNgVoXkXoV/pV70NbmcbW1DSl+TMCI+ycDwxNYai6w
+        ThPElshsL2DfoXqSy96gqfqO2txLYIbGM86j9H9w/U52fv7Bi/5xmtufExQRjm+o3guIyz1PfOFtok98
+        Jco0TGj+XfYXGuj7MDSl7Pw04Un+TscLNxUNHWwXgtkgaL0AdU7dlEl2FzxEediJPLcTIV9L09VWBj95
+        lAfGuf/SzZWuURJ02QQIu8jLSp3uBclhETo7IQfvsjTVyDJtOLHaFKrrHDS292C92EFCejbByh3UmcJp
+        siZSYkibDpEcpkwsZXOSGV9VPAq1ESE2B2HnbgIFJWHB27FoNzF4Ss7Pe1HYjqfMhEgOk0wizVkaldRt
+        qWFSzWEKX2IDVvA4eyV91g0MNQeTHrPt77vxr42TADH+y7mpW81evyUo/Vf9H0ACS5B1yxbit3bBVPIv
+        gLX/NgWpi8gAAAAASUVORK5CYII=
+</value>
+  </data>
+  <metadata name="toolStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>326, 17</value>
+  </metadata>
+  <data name="newToolStripButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAQpJREFUOE+t021L
+        wlAUB3C/VH6H+hr5jSRfiPSiFiEDgwWGRhZm0EoQcQN7QoblWPNp6py6h3/cwWDkvde98MDhvrnndznn
+        cFOpfYVU7+J/lmoKipUWhGs5TO5bpJgVBfEB6aMMH7m6V5nAiVBB9UnhI+Jtmwlkz27C4iiprVyWm0zA
+        9XwQJIKowLn0TAWCIIDtbGCM7BA4ODymD/O09EgF1hsPY8uBplt8IF+sbQGeH2BmrzEwF3jXxnwgd1Hd
+        ApyVC3OyRO9nis6HyQdIf/Egg5vOV+gbM3R7I7yqenIgPrjP/gTtt180Wt/Jgfjg1K8h5M4Ady9aMiDa
+        N+tkrjHaMbmwK/f1gUPnD9/19ZYU1J08AAAAAElFTkSuQmCC
+</value>
+  </data>
+  <data name="openToolStripButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAl9JREFUOE+9k1tI
+        E2AYhnfRRVcWaVEIRpaEXYiBIdVFSNJJUUqzwkgTylMHDMU2D206dXMnp650mNt0TZ1WlmFYIRSKRGip
+        o8S0LCgqxcxQydPT3EKTLPCmH96bn+99vvf7fn6B4H+cnGIzEq2Fy3ITeToraUojy+obnawjLF7lMJ0X
+        lpNlh6VIDUQlFyOoM2tYSo01sr92SUgrITxRRWh8gRPQ22VkYqTWoR/DFqYGDVhNKurN0iUhYQlqQuO0
+        BMcWIaitUDM+XLXIPPOphClbElXlcipLczEUZ6EvyOSaUkSRLHUxtNqoYPyLcb7zrN1MrwhssUvqD8CN
+        MhnfP+odsefMTXUKh+5b82mwyLhdmYvVkI1FL8Gku8J1bTqlahE6hdCZplKfy+i7QuZiv2kRU1+lZuaN
+        BAaki/XWftefBj3J8DKRzpoILsaEIDDosvnWJ4f3Su5Uq2h7oHQW/T7CiyhoD2e6NYiJhwG8rvDh3Kn9
+        TkCZVszXVxIGWjOotyiZ7RdDd5wT0BljNx5nui2EieZ9jDbuZqhuO5J4L04EujmXWaLOYKhLyE2zgo4n
+        9iQ9SXbAGeg4yezTw0w+PshY0x6G6/34XO1Ne85qIoM88dvq4gTo8kV0N2dyy5wPfZnw3B732VEmW4IZ
+        exTASIM/g1YfPhi3YFO6Io7djO8294WnLMxLpdYkx3Y3gXaNYF5tyhU0y1ZyL2sVNelrMaS6c/XSRiIP
+        bcLf12MBoJGmoBGfJU8YTdqFY47FnI4I5MiBnezd5cMOHy+8Pd3x2ODGujUurHf9FX1Zv+kfxT8BMS7u
+        X4BvNFkAAAAASUVORK5CYII=
+</value>
+  </data>
+  <data name="saveToolStripButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAilJREFUOE+tk91L
+        k3EUx/cvdN9N0EW3NTWGa7EaPOUcyqphWBG9PZEv5dJlmqhYmUYtXyBb4dJJy+kknFT4BqZIjaFMJUsz
+        V7TEoabYRDD49ju/6Pm1Mm/qB+fy8znPOef7qFT/4z17GgWVr30Zbd4lPHYvoLEhgvuOGdTWfIL9dgg3
+        yqdQWjKBwoLXyMsdxYXzQSi9CeztAWqqV7HRW1ldgzGtF4fTnvBSBN7WRS6orPjyV57gyMIKdpufQ62W
+        YTnkEQL3o3kuKC35vK7gJ/w+vIg4kw8Fl6dxwNwkBM76WS64ZHv3h+BXeGQygm2SF9accaSmOIWg7m6Y
+        C7KzRmMEv8ODwTA2692Q5QBMJocQVFd95AL5TEARrAf3+D9gU2IDjhx9gaSkWiG4WTmN7i6wUwLHT76C
+        5dgA3zYtjGamz6bOP+A+HLR0QpLsQnC1bBIdPrAMAE2ub+zuX1F+fY4vlRZGM2dmBBU4ObUdBkOFEFwp
+        HIenGXjoXGPBicKYnhNT5hM2pJ8r4p2TUxi83wO9vkwIbHljDAaq7kR5ZxJQSOK0EobezmJsag5y7jXs
+        NbZxWLvHBZ2uSAgolo57UD6bBASfzb+FN6F5hGaWcLHYjni9i8GNiN/1ANrEfCHIzBhmcy/zmbcaPNiy
+        Q0JLRz98XYPo7vNj4OUQ9pksUOvqkcDg7Zo6aDTWWMHpU/08npQwCgndmU5F26aF0czUlYrgnQnZQvAv
+        f/R3bGg6a0rM640AAAAASUVORK5CYII=
+</value>
+  </data>
+  <data name="printToolStripButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAi5JREFUOE+tk+1P
+        klEYxlkf+39aW1utttpM1NJqwzIjnM5J0TAmBSHLCFNJ7cVaUqNH5gLdQxY4RkxrbDqDzBJdOt0SKLAg
+        TEDDeLl6nkPgSNz64L1d29nZ7ut3nfucw+HsdBltUxi0f4RpdGZb0SNubMtlDd67ffi3Nn4n4fGvYNA6
+        gZJzV8GtvrLVhG1mlUqlEQxH4HB9IhqyO2Ewj8M140WVSE0MCibQW1z4/DWcB2fJq9E4ZheXQduchFyQ
+        rqXHwSrJ0L2BUB7d6piG0+1BZYMKx87LodG+wL0+62YKRecz0jzinCd0lpolB0IxzC+F0Guwo5Qvg7Kr
+        H0/oMZQyRuQYTW16qB8OgTK/wyOjA/qXb3GXsuH6HSPELVrwGztQXqNA8VkpTl+4iW6dBRKVFsXZId5+
+        +gqRWHzL1NmNRDKF9XiCzOB7eB1fvkUhb6dQJ+1iEsgyCVQPTDC/+YDndhco02vc7xuGumcAsnYdRM09
+        EFzuAK+hBccFchSdkeAis1cpvIGDJ0UZA2X3AHz+YMEEkbUNeAKr2A0O0S6KA764DSXVUuw5WpMxaO40
+        YHpuCczccsWuf0QTmPOtYWw2TJotfw1O1CpwoEK4aaDUUND00vAG4wjH0vD/TGNxOYWJhV8Ynoyi37FC
+        yFkd4YlJcy5BvaQVsls6jE76yN3+j/IM2GNIVI9RUadEmeAauMwzLapqwmFeIw6duoT95ULsK6vHXm5t
+        jpyj78RP/gPgHTGb+rLlcwAAAABJRU5ErkJggg==
+</value>
+  </data>
+  <data name="printPreviewToolStripButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAdVJREFUOE+t099L
+        U2Ecx3H/GemqiygrwpsIzESJqJzzx4VOnMQkKFToZjcZQf5oDd0SXa0m/sJjnJU5K5eb1oIig8nUiwah
+        brLUInG6zb3znLB2PNu68QtfHjjweX2f5+E8OTmHUaJnnoMtTPoZdH3G4fwgd9Y5UjhT9Qy/5WRRbXZk
+        1D2XEeh0uJiY8WdHhl99yQiYn7yUw/ud9ij9Yx9VQDy2xdTMFJZHdm63mbhr6iS/RJf+Lp6KPgWwvb2F
+        OD7Oa880och3voUjOAQRnaGRKsMtNWITvArAPe3F5fbI3+IJ+BXdZWU9gdk2hLZarwa6BycVQJfNzvJq
+        5G84/CPOwnIMp3eesspKNdDVN6EAOizdLK2uyZPDG4m98A6+hSgPR3xcLi1VA9JNp5YgOhFdbkIbe5NX
+        YrxfjPLi0yYNzUbKyssxtTQqkVQgmUzyNRjkXoeZ3oHnPPMGsAo+GpqMaLRXGbhfhWi9rkRSgZ1YgvWf
+        UfyBAA8sFvTXDNTU1lGhuYT55jlCj8+z+64ae/uNf8g+IK2ZuuVOK/UlJ5g15rFkPcuaU0OT/uKfo0ih
+        vAu6/3ZB0RX0xcd503yausKjaItPZX9k6X5baRf5x45QeCZXDv8Gd10kHhF4wJIAAAAASUVORK5CYII=
+</value>
+  </data>
+  <data name="helpToolStripButton.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAqRJREFUOE+Fk1tI
+        01EYwOdr0HOJvfdm9FpPBZFQDyFBCb71ZoZooZiXMeetnJs6L9O8m2s6clNRN7VdtDmnS5uXleQQ3Zzm
+        XRMvYfz6b6KVZn3wceBwfr/zfecSIjojqurcbG98F21u7ogODhBlZFwPOWvtqfkAHEiXa5Wa2inUbyaR
+        SgdIT7fxX8kR7HCsUqJyYbGu8M7ko9c0i6bJjSTDfrboJNzRuYjNtk2/ZQurZYPenlV0unkaGieEigb/
+        FJ2E29r9mE0bdHUt09q2SIsANmtnaaifRqVyI5ePkpk9eNjSSVin9wVBvd5Pk2aO+noPlZVTlJRMoFCM
+        kJMzzNMEE7FPDBzDLtd6sGdN0yxa7Rzq1zPU1kzT1OpD1rxOVNEekbItJJU+5CVjxDw2oGsdOBRomseR
+        K5zU1Hl4VfGZsmI3ysJxqrR+4jVQboEPc0J6obbvgAfZXlpMbqa9M4jEEisa7RgSaR+ygiFk+SO8zHNS
+        3eghTg3aIZhf2CQ118jth1XBUe/Y4WackzylA9GzRAMziz6M5lGSU3oQi63BO89qWEJlJhhH8PCoNygp
+        qrUjVS8QHWNElJqupkDZzcKmn9llob9CM9KsPu7lrqEfPRQEIlBFQHDtbhmljSM09O8TerkU0Yv8QWHn
+        XiENmGzjrO1/xWL/RITYh+43wda3vSCcmGlkekk4C/MuF8Jyfr1MSWYfKWk9FBRb8fjnUHXOI2/fOa7A
+        Luwur3TgEeBx4TATitxERFadftopaSaeC6IO8xduJXykw7nP7g8wvPcSfqOAyXko7Vjh/FUl2Urz3/9G
+        mthMUnI3dS2TXIkyIq6eQWPbpdGyQ7xiknPhCmKT3tI/4vv351JVOMlX2ol+1EropSwuhqVy5345MpWV
+        wTF/EP4JaStxoteu5NMAAAAASUVORK5CYII=
+</value>
+  </data>
+  <metadata name="statusStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>51</value>
+  </metadata>
+  <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAABAAIAEBAQAAAABAAoAQAAJgAAACAgEAAAAAQA6AIAAE4BAAAoAAAAEAAAACAAAAABAAQAAAAAAIAA
+        AAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/
+        AAAA//8A/wAAAP8A/wD//wAA////AACIiIgAAAAAAIiIiAAAAAAACZmQAAzMAAAJmZAAzMwAAAmZkADM
+        zAAACZmQAAzMAAAJmZAAAHAAAAmZkAAAcAAACZmQAAB3AAAJmZAAAAcAAAmZkAAABwAACZmQAAB3AAAA
+        mQAAB3AAAAAHAAB3AAAAAAd3d3AAAAAAAAAAAAAAwP8AAMD/AADh4wAA4cMAAOHDAADh4wAA4fcAAOH3
+        AADh8wAA4fsAAOH7AADh8wAA8+cAAPvPAAD4HwAA//8AACgAAAAgAAAAQAAAAAEABAAAAAAAAAIAAAAA
+        AAAAAAAAEAAAABAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD/
+        /wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAACIiIiIiIAAAAAAAAAAAAAACIiIiIgAAA
+        AAAAAAAAAAAAiIiIiIAAAAAAAAAAAAAAAAiIiIgAAAAAAAAAAAAAAAAAmZmQAAAAAAAAAAAAAAAAAJmZ
+        kAAAAADMwAAAAAAAAACZmZAAAAAMzMwAAAAAAAAAmZmQAAAAzMzMwAAAAAAAAJmZkAAAAMzMzMAAAAAA
+        AACZmZAAAADMzMzAAAAAAAAAmZmQAAAAzMzMwAAAAAAAAJmZkAAAAAzMzAAAAAAAAACZmZAAAAAMzMwA
+        AAAAAAAAmZmQAAAADMzMAAAAAAAAAJmZkAAAAAAHAAAAAAAAAACZmZAAAAAAB3AAAAAAAAAAmZmQAAAA
+        AABwAAAAAAAAAJmZkAAAAAAAcAAAAAAAAACZmZAAAAAAB3AAAAAAAAAAmZmQAAAAAAcAAAAAAAAAAJmZ
+        kAAAAAAHAAAAAAAAAACZmZAAAAAABwAAAAAAAAAAmZmQAAAAAAcAAAAAAAAAAJmZkAAAAAAHAAAAAAAA
+        AACZmZAAAAAAdwAAAAAAAAAACZkAAAAAB3AAAAAAAAAAAABwAAAAAAcAAAAAAAAAAAAAcAAAAAB3AAAA
+        AAAAAAAAAHcAAAAHcAAAAAAAAAAAAAAHd3d3dwAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////+AD///wB
+        ///8Af///gP///8H////B/x//wf4P/8H8B//B/Af/wfwH/8H8B//B/g//wf4P/8H+D//B/7//wf+f/8H
+        /3//B/9//wf+f/8H/v//B/7//wf+//8H/v//B/7//wf8//+P+f//3/v//9/z///P5///4A///////w==
+</value>
+  </data>
+</root>
+\ No newline at end of file
diff --git a/source/Settings.cs b/source/Settings.cs
@@ -0,0 +1,55 @@
+#region Copyright (c) 2007, PP4L Software
+/************************************************************************************
+
+Copyright  2007, PP4L Software
+Author:	Lampiasis <lampiasis@dvolker.com>
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+'***********************************************************************************/
+#endregion
+
+namespace AsciiPumper.Properties
+{
+    
+    
+    // This class allows you to handle specific events on the settings class:
+    //  The SettingChanging event is raised before a setting's value is changed.
+    //  The PropertyChanged event is raised after a setting's value is changed.
+    //  The SettingsLoaded event is raised after the setting values are loaded.
+    //  The SettingsSaving event is raised before the setting values are saved.
+    internal sealed partial class Settings {
+        
+        public Settings() {
+            // // To add event handlers for saving and changing settings, uncomment the lines below:
+            //
+            // this.SettingChanging += this.SettingChangingEventHandler;
+            //
+            // this.SettingsSaving += this.SettingsSavingEventHandler;
+            //
+        }
+        
+        private void SettingChangingEventHandler(object sender, System.Configuration.SettingChangingEventArgs e) {
+            // Add code to handle the SettingChangingEvent event here.
+        }
+        
+        private void SettingsSavingEventHandler(object sender, System.ComponentModel.CancelEventArgs e) {
+            // Add code to handle the SettingsSaving event here.
+        }
+
+
+	
+    }
+}
diff --git a/source/UndoableAction.cs b/source/UndoableAction.cs
@@ -0,0 +1,13 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace AsciiPumper
+{
+	public interface IUndoableAction
+	{
+		void Undo( PaintCanvas canvas);
+		void Redo( PaintCanvas canvas );
+
+	}
+}