asciipumper

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

MainForm.cs (17029B)

      1 #region Copyright (c) 2007, PP4L Software
      2 /************************************************************************************
      3 
      4 Copyright  2007, PP4L Software
      5 Author:	Lampiasis <lampiasis@dvolker.com>
      6 
      7 This program is free software; you can redistribute it and/or modify
      8 it under the terms of the GNU General Public License as published by
      9 the Free Software Foundation; either version 2 of the License, or
     10 (at your option) any later version.
     11 
     12 This program is distributed in the hope that it will be useful,
     13 but WITHOUT ANY WARRANTY; without even the implied warranty of
     14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
     15 GNU General Public License for more details.
     16 
     17 You should have received a copy of the GNU General Public License
     18 along with this program; if not, write to the Free Software
     19 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
     20 
     21 '***********************************************************************************/
     22 #endregion
     23 
     24 
     25 using System;
     26 using System.Collections.Generic;
     27 using System.ComponentModel;
     28 using System.Data;
     29 using System.Drawing;
     30 using System.Text;
     31 using System.Windows.Forms;
     32 using System.Reflection;
     33 using System.Runtime;
     34 using System.Diagnostics;
     35 using System.IO;
     36 using System.Drawing.Printing;
     37 
     38 
     39 namespace AsciiPumper
     40 {
     41 	public partial class MainForm : Form
     42 	{
     43 
     44 		public void Undo()
     45 		{
     46 			AsciiPaintCanvas.Undo();
     47 		}
     48 
     49 		public void Redo()
     50 		{
     51 			AsciiPaintCanvas.Redo();
     52 		}
     53 
     54 		public Stack<IUndoableAction> UndoList
     55 		{
     56 			get { return AsciiPaintCanvas.UndoList; }
     57 		}
     58 
     59 		public Stack<IUndoableAction> RedoList
     60 		{
     61 			get { return AsciiPaintCanvas.RedoList; }
     62 		}
     63 
     64 		private string m_FileName = "(Untitled)";
     65 
     66 		/// <summary>
     67 		/// Gets or sets the FileName.
     68 		/// </summary>
     69 		public string FileName
     70 		{
     71 			get { return m_FileName; }
     72 			set { m_FileName = value; this.Text = m_FileName + (m_FileModified ? "" : "*"); } 
     73 		}
     74 
     75 		private bool m_FileModified = false;
     76 
     77 		/// <summary>
     78 		/// Gets or sets the FileModified.
     79 		/// </summary>
     80 		public bool FileModified
     81 		{
     82 			get { return m_FileModified; }
     83 			set {
     84 				m_FileModified = value;
     85 				if (value == true)
     86 					this.Text = m_FileName + "*";
     87 				else
     88 				{
     89 					this.Text = m_FileName;
     90 					AsciiPaintCanvas.Modified = false;
     91 				}
     92 			}
     93 		}
     94 
     95 		public void LoadStream(Stream stream)
     96 		{
     97 			m_LoadingFile = true;
     98 			
     99 			AsciiPaintCanvas.DontRepaint = true;
    100 			try
    101 			{
    102 				AsciiPaintCanvas.LoadStream(stream);
    103 				numColumns.Value = AsciiPaintCanvas.Columns;
    104 				numRows.Value = AsciiPaintCanvas.Rows;
    105 				m_LoadingFile = false;
    106 			}
    107 			finally
    108 			{
    109 				AsciiPaintCanvas.DontRepaint = false;
    110 				AsciiPaintCanvas.CompleteRepaint();
    111 
    112 			}
    113 			
    114 		}
    115 
    116 
    117 
    118 		public MainForm()
    119 		{
    120 			InitializeComponent();
    121 			//this.Icon = new Icon(typeof(MainForm), "MainIcon");
    122 
    123 			AsciiPaintCanvas.Columns = (int)numColumns.Value;
    124 			AsciiPaintCanvas.Rows = (int)numRows.Value;
    125 			ColorPalette pal = AsciiPaintCanvas.Colors;
    126 			colorLMB.BackColor = pal[AsciiPaintCanvas.LeftMouseColor];
    127 			colorMMB.BackColor = pal[AsciiPaintCanvas.MiddleMouseColor];
    128 			colorRMB.BackColor = pal[AsciiPaintCanvas.RightMouseColor];
    129 			//AsciiPumper.Properties.Settings.Default.
    130 
    131 			/*AsciiPaintCanvas.Font = new Font("Consolas", 10);
    132 			if (AsciiPaintCanvas.Font.Name != "Consolas")
    133 				AsciiPaintCanvas.Font = new Font("Fixedsys", 9);
    134 			*/
    135 			this.AsciiPaintCanvas.Font = new Font((string) Program.Settings["PaintFontName"] , (float) Program.Settings["PaintFontSize"]);
    136 			AsciiPaintCanvas.CellWidth = (int)Program.Settings["CellWidth"];
    137 			AsciiPaintCanvas.CellHeight = (int)Program.Settings["CellHeight"];
    138 			numColumns.Value = (int)Program.Settings["Columns"];
    139 			numRows.Value = (int)Program.Settings["Rows"];
    140 			ColorSelector.ButtonColorChangedEventArgs ea = new ColorSelector.ButtonColorChangedEventArgs((byte)Program.Settings["LMBColor"], new MouseEventArgs(MouseButtons.Left, 0, 0, 0, 0));
    141 			this.colorSelector1_ButtonColorChanged(this, ea);
    142 			ea = new ColorSelector.ButtonColorChangedEventArgs((byte)Program.Settings["MMBColor"], new MouseEventArgs(MouseButtons.Middle, 0, 0, 0, 0));
    143 			this.colorSelector1_ButtonColorChanged(this, ea);
    144 			ea = new ColorSelector.ButtonColorChangedEventArgs((byte)Program.Settings["RMBColor"], new MouseEventArgs(MouseButtons.Right, 0, 0, 0, 0));
    145 			this.colorSelector1_ButtonColorChanged(this, ea);
    146 			
    147 
    148 			this.checkLMBfg.Checked = Program.Settings.LMBIsForeground;
    149 			this.checkMMBfg.Checked = Program.Settings.MMBIsForeground;
    150 			this.checkRMBfg.Checked = Program.Settings.RMBIsForeground;
    151 			//P//rogram.Settings.PropertyChanged += new PropertyChangedEventHandler(Settings_PropertyChanged);
    152 
    153 			this.chkWatermark.Checked = Program.Settings.ShouldWatermark;
    154 
    155 			AsciiPaintCanvas.CanvasModified += new EventHandler<PaintCanvas.CanvasModifiedEventArgs>(AsciiPaintCanvas_CanvasModified);
    156 			AsciiPaintCanvas.UndoChanged += new EventHandler<PaintCanvas.UndoChangedEventArgs>(AsciiPaintCanvas_UndoChanged);
    157 			AsciiPaintCanvas.RedoChanged += new EventHandler<PaintCanvas.RedoChangedEventArgs>(AsciiPaintCanvas_RedoChanged);
    158 		}
    159 
    160 		void AsciiPaintCanvas_RedoChanged(object sender, PaintCanvas.RedoChangedEventArgs e)
    161 		{
    162 			OnRedoChanged(RedoChangedEventArgs.Empty);
    163 		}
    164 
    165 		void AsciiPaintCanvas_UndoChanged(object sender, PaintCanvas.UndoChangedEventArgs e)
    166 		{
    167 			OnUndoChanged(UndoChangedEventArgs.Empty);
    168 		}
    169 
    170 		public class UndoChangedEventArgs : EventArgs
    171 		{
    172 			public static readonly new UndoChangedEventArgs Empty = new UndoChangedEventArgs();
    173 		}
    174 
    175 		public event EventHandler<UndoChangedEventArgs> UndoChanged;
    176 
    177 		protected virtual void OnUndoChanged(UndoChangedEventArgs e)
    178 		{
    179 			EventHandler<UndoChangedEventArgs> handler = UndoChanged;
    180 			if (handler != null)
    181 			{
    182 				handler(this, e);
    183 			}
    184 		}
    185 
    186 		public class RedoChangedEventArgs : EventArgs
    187 		{
    188 			public static readonly new RedoChangedEventArgs Empty = new RedoChangedEventArgs();
    189 		}
    190 
    191 		public event EventHandler<RedoChangedEventArgs> RedoChanged;
    192 
    193 		protected virtual void OnRedoChanged(RedoChangedEventArgs e)
    194 		{
    195 			EventHandler<RedoChangedEventArgs> handler = RedoChanged;
    196 			if (handler != null)
    197 			{
    198 				handler(this, e);
    199 			}
    200 		}
    201 
    202 		void AsciiPaintCanvas_CanvasModified(object sender, PaintCanvas.CanvasModifiedEventArgs e)
    203 		{
    204 			FileModified = true;
    205 		}
    206 
    207 		void Settings_PropertyChanged(object sender, PropertyChangedEventArgs e)
    208 		{
    209 			//AsciiPaintCanvas.CompleteRepaint();
    210 		}
    211 
    212 		private void MainForm_Load(object sender, EventArgs e)
    213 		{
    214 			
    215 		}
    216 
    217 		private void numColumns_ValueChanged(object sender, EventArgs e)
    218 		{
    219 			if ( !this.m_LoadingFile )
    220 				AsciiPaintCanvas.Columns = (int) numColumns.Value;
    221 
    222 		}
    223 
    224 		private void numRows_ValueChanged(object sender, EventArgs e)
    225 		{
    226 			if ( !this.m_LoadingFile )
    227 				AsciiPaintCanvas.Rows = (int) numRows.Value;
    228 		}
    229 
    230 		private void colorSelector1_ButtonColorChanged(object sender, ColorSelector.ButtonColorChangedEventArgs e)
    231 		{
    232 			switch (e.MouseEvent.Button)
    233 			{
    234 							
    235 				case MouseButtons.Left:
    236 					AsciiPaintCanvas.LeftMouseColor = e.ColorIndex;
    237 					colorLMB.BackColor = colorSelector1.Colors[e.ColorIndex];
    238 					Program.Settings.LMBColor = e.ColorIndex;
    239 					break;
    240 				case MouseButtons.Middle:
    241 					AsciiPaintCanvas.MiddleMouseColor = e.ColorIndex;
    242 					colorMMB.BackColor = colorSelector1.Colors[e.ColorIndex];
    243 					Program.Settings.MMBColor = e.ColorIndex;
    244 					break;
    245 				case MouseButtons.Right:
    246 					AsciiPaintCanvas.RightMouseColor = e.ColorIndex;
    247 					colorRMB.BackColor = colorSelector1.Colors[e.ColorIndex];
    248 					Program.Settings.RMBColor = e.ColorIndex;
    249 					break;
    250 				default:
    251 					throw new Exception("Invalid mouse button color changed.");
    252 			}
    253 		}
    254 
    255 		public const string WaterMark = "http://code.google.com/p/asciipumper/ ";
    256 
    257 		public char WatermarkCharAtPos(int pos)
    258 		{
    259 			string watermark = txtWatermark.Text;
    260 			if (watermark == "")
    261 				watermark = WaterMark;
    262 
    263 			return watermark[pos % watermark.Length];
    264 		}
    265 		
    266 		private const char ColorControl = '\x0003';
    267 		private const char UnderlineControl = '\x001F';
    268 		private const char BoldControl = '\x0002';
    269 		private const char PlainControl = '\x000F';
    270 		private const char ReverseControl = '\x0016';
    271 
    272 		public string GetIRCString( bool watermark)
    273 		{
    274 			StringBuilder sb = new StringBuilder();
    275 			CellInfo lastcell;
    276 			int rowcount = 0;
    277 			
    278 
    279 			foreach (List<CellInfo> row in AsciiPaintCanvas.CellRows)
    280 			{
    281 				rowcount++;
    282 				if (rowcount > AsciiPaintCanvas.Rows)
    283 					break;
    284 
    285 				// something that will not be used normally so that color is always printed at beginning of line
    286 				lastcell = new CellInfo('z', 100, 100);
    287 
    288 				int cellcount = 0;
    289 				
    290 				foreach (CellInfo cell in row)
    291 				{	// FIXME: check for digits and use two digit color code.
    292 					cellcount++;
    293 					if (cellcount > AsciiPaintCanvas.Columns)
    294 						break;
    295 					if (lastcell.Bold != cell.Bold)
    296 						sb.Append(BoldControl);
    297 					if (lastcell.Underlined != cell.Underlined)
    298 						sb.Append(UnderlineControl);
    299 					if (cell.Character == ' ' && watermark)
    300 					{
    301 						cell.ForeColor = cell.BackColor;
    302 						char character = WatermarkCharAtPos(cellcount - 1);
    303 						if (lastcell.BackColor != cell.BackColor || lastcell.ForeColor != cell.BackColor)
    304 						{
    305 							if (cell.BackColor < 10 && char.IsDigit(character))
    306 								sb.AppendFormat(ColorControl + "{0},0{1}{2}", cell.ForeColor, cell.BackColor, character);
    307 							else
    308 								sb.AppendFormat(ColorControl + "{0},{1}{2}", cell.ForeColor, cell.BackColor, character);
    309 						}
    310 						else
    311 							sb.Append(character);
    312 					}
    313 					else if (lastcell.BackColor != cell.BackColor)
    314 					{
    315 						if (char.IsDigit(cell.Character) || cell.Character == ',' )
    316 						{
    317 							if (cell.BackColor < 10 && char.IsDigit(cell.Character))
    318 								sb.AppendFormat(ColorControl + "{0},0{1}{2}", cell.ForeColor, cell.BackColor, cell.Character);
    319 							else
    320 								sb.AppendFormat(ColorControl + "{0},{1}{2}", cell.ForeColor, cell.BackColor, cell.Character);
    321 						}
    322 						else
    323 							sb.AppendFormat(ColorControl + "{0},{1}{2}", cell.ForeColor, cell.BackColor, cell.Character);
    324 					}
    325 					else if (lastcell.ForeColor != cell.ForeColor)
    326 					{
    327 						if (char.IsDigit(cell.Character))
    328 						{
    329 							if (cell.ForeColor < 10 && char.IsDigit(cell.Character))
    330 								sb.AppendFormat(ColorControl + "0{0}{1}", cell.ForeColor, cell.Character);
    331 							else
    332 								sb.AppendFormat(ColorControl + "{0}{1}", cell.ForeColor, cell.Character);
    333 						}
    334 						else if (cell.Character == ',')
    335 						{
    336 							if (cell.BackColor < 10 && char.IsDigit(cell.Character))
    337 								sb.AppendFormat(ColorControl + "{0},0{1}{2}", cell.ForeColor, cell.BackColor, cell.Character);
    338 							else
    339 								sb.AppendFormat(ColorControl + "{0},{1}{2}", cell.ForeColor, cell.BackColor, cell.Character);
    340 						}
    341 						else
    342 							sb.AppendFormat(ColorControl + "{0}{1}", cell.ForeColor, cell.Character);
    343 					}
    344 					else
    345 						sb.Append(cell.Character);
    346 					lastcell = cell;
    347 				}
    348 				sb.Append("\r\n");
    349 			}
    350 			return sb.ToString();
    351 		}
    352     
    353 
    354 		private void button1_Click(object sender, EventArgs e)
    355 		{
    356 
    357 			Cursor cur = Cursor.Current;
    358 			Cursor.Current = Cursors.WaitCursor;
    359 			try
    360 			{
    361 				Clipboard.SetText(GetIRCString(chkWatermark.Checked), TextDataFormat.Text);
    362 			}
    363 			finally
    364 			{
    365 				Cursor.Current = cur;
    366 			}
    367 			
    368 		}
    369 
    370 		private void aboutToolStripMenuItem_Click(object sender, EventArgs e)
    371 		{
    372 			AboutBox1 about = new AboutBox1();
    373 			about.ShowDialog(this);
    374 		}
    375 
    376 		public void SaveDocument()
    377 		{
    378 			if ( File.Exists(m_FileName) )
    379 			{
    380 				Stream stream = File.OpenWrite(m_FileName);
    381 				StreamWriter writer = new StreamWriter(stream);
    382 				writer.WriteLine(GetIRCString(false));
    383 
    384 				writer.Close();
    385 				this.FileModified = false;
    386 			}
    387 			else
    388 				saveAsToolStripMenuItem_Click(this, EventArgs.Empty);
    389 		}
    390 
    391 		private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
    392 		{
    393 			if (AsciiPaintCanvas.Modified == true)
    394 			{
    395 				DialogResult res = MessageBox.Show(this, m_FileName + " has been modified. Would you like to save changes?", "Save changes?", MessageBoxButtons.YesNoCancel);
    396 				if (res == DialogResult.Yes)
    397 				{
    398 					if ( File.Exists(m_FileName) )
    399 					{
    400 						Stream stream = File.OpenWrite(m_FileName);
    401 						StreamWriter writer = new StreamWriter(stream);
    402 						writer.WriteLine(GetIRCString(false));
    403 
    404 						writer.Close();
    405 						this.m_FileModified = false;
    406 					}
    407 					else
    408 						saveAsToolStripMenuItem_Click(this, EventArgs.Empty);
    409 				}
    410 				else if (res == DialogResult.Cancel)
    411 				{
    412 					e.Cancel = true;
    413 				}
    414 				else if (res == DialogResult.No)
    415 				{
    416 
    417 				}
    418 			}
    419 
    420 			Program.Settings.PropertyChanged -= new PropertyChangedEventHandler(Settings_PropertyChanged);
    421 
    422 			Program.Settings.LMBIsForeground = checkLMBfg.Checked;
    423 			Program.Settings.MMBIsForeground = checkMMBfg.Checked;
    424 			Program.Settings.RMBIsForeground = checkRMBfg.Checked;
    425 
    426 			Program.Settings.ShouldWatermark = chkWatermark.Checked;
    427 
    428 			Program.Settings.Save();
    429 		}
    430 
    431 		private void checkLMBfg_CheckedChanged(object sender, EventArgs e)
    432 		{
    433 			AsciiPaintCanvas.LeftMouseIsForeground = checkLMBfg.Checked;
    434 
    435 		}
    436 
    437 		private void checkMMBfg_CheckedChanged(object sender, EventArgs e)
    438 		{
    439 			AsciiPaintCanvas.MiddleMouseIsForeground = checkMMBfg.Checked;
    440 		}
    441 
    442 		private void checkRMBfg_CheckedChanged(object sender, EventArgs e)
    443 		{
    444 			AsciiPaintCanvas.RightMouseIsForeground = checkRMBfg.Checked;
    445 		}
    446 
    447 		private void linklabelVersion_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
    448 		{
    449 			ProcessStartInfo pi = new ProcessStartInfo("http://code.google.com/p/asciipumper/");
    450 			Process.Start(pi);
    451 		}
    452 
    453 		private void saveAsToolStripMenuItem_Click(object sender, EventArgs e)
    454 		{
    455 			DialogResult res = saveFileDialog.ShowDialog(this);
    456 			if (res == DialogResult.OK)
    457 			{
    458 				Stream stream = saveFileDialog.OpenFile();
    459 				FileName = saveFileDialog.FileName;
    460 				StreamWriter writer = new  StreamWriter(stream);
    461 				writer.WriteLine(GetIRCString(false));
    462 				
    463 				writer.Close();
    464 				this.FileModified = false;
    465 			
    466 			}
    467 		}
    468 
    469 		private bool m_LoadingFile = false;
    470 
    471 		private void openToolStripMenuItem_Click(object sender, EventArgs e)
    472 		{
    473 			DialogResult res = openFileDialog.ShowDialog(this);
    474 			if (res == DialogResult.OK)
    475 			{
    476 				Cursor cur = Cursor.Current;
    477 				Cursor.Current = Cursors.WaitCursor;
    478 				try
    479 				{
    480 					m_LoadingFile = true;
    481 					Stream stream = openFileDialog.OpenFile();
    482 					AsciiPaintCanvas.LoadStream(stream);
    483 					stream.Close();
    484 					numColumns.Value = AsciiPaintCanvas.Columns;
    485 					numRows.Value = AsciiPaintCanvas.Rows;
    486 					m_LoadingFile = false;
    487 				}
    488 				finally
    489 				{
    490 					Cursor.Current = cur;
    491 				}
    492 				
    493 
    494 			}
    495 		}
    496 
    497 		private void optionsToolStripMenuItem_Click(object sender, EventArgs e)
    498 		{
    499 			
    500 
    501 		}
    502 
    503 		void form_SettingsSaved(object sender, OptionsForm.SettingsSavedEventArgs e)
    504 		{
    505 			AsciiPaintCanvas.CompleteRepaint();
    506 		}
    507 
    508 		public void RepaintCanvas()
    509 		{
    510 			AsciiPaintCanvas.CompleteRepaint();
    511 		}
    512 
    513 		private void exitToolStripMenuItem_Click(object sender, EventArgs e)
    514 		{
    515 			this.Close();
    516 		}
    517 
    518 		private void radioPaintBrush_CheckedChanged(object sender, EventArgs e)
    519 		{
    520 			if (radioPaintBrush.Checked)
    521 				AsciiPaintCanvas.PaintMode = PaintCanvas.PaintModes.PaintBrush;
    522 		}
    523 
    524 		private void radioFill_CheckedChanged(object sender, EventArgs e)
    525 		{
    526 			if (radioFill.Checked)
    527 				AsciiPaintCanvas.PaintMode = PaintCanvas.PaintModes.Fill;
    528 		}
    529 
    530 		private void MainForm_Resize(object sender, EventArgs e)
    531 		{
    532 
    533 		}
    534 
    535 		private void chkWatermark_CheckedChanged(object sender, EventArgs e)
    536 		{
    537 
    538 		}
    539 
    540 		public void ImportImage(string filename)
    541 		{
    542 			AsciiPaintCanvas.ImportImage(filename);
    543 			numColumns.Value = AsciiPaintCanvas.Columns;
    544 			numRows.Value = AsciiPaintCanvas.Rows;
    545 		}
    546 
    547 		private void txtWatermark_Enter(object sender, EventArgs e)
    548 		{
    549 			txtWatermark.SelectAll();
    550 		}
    551 
    552 		public void PrintToGraphicDevice(Graphics graphics, PrintPageEventArgs e)
    553 		{
    554 			AsciiPaintCanvas.PrintToGraphicDevice(graphics, e);
    555 		}
    556 
    557 		private void radioBold_CheckedChanged(object sender, EventArgs e)
    558 		{
    559 			if (radioBold.Checked == true)
    560 				AsciiPaintCanvas.PaintMode = PaintCanvas.PaintModes.Bold;
    561 		}
    562 
    563 		private void radioUnderline_CheckedChanged(object sender, EventArgs e)
    564 		{
    565 			if (radioUnderline.Checked == true)
    566 				AsciiPaintCanvas.PaintMode = PaintCanvas.PaintModes.Underline;
    567 		}
    568 
    569 		private void radioRemoveFormatting_CheckedChanged(object sender, EventArgs e)
    570 		{
    571 			if (radioRemoveFormatting.Checked == true)
    572 				AsciiPaintCanvas.PaintMode = PaintCanvas.PaintModes.RemoveFormatting;
    573 		}
    574 	}
    575 }