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 }