CraftSynth.ImageEditor – Blame information for rev 2

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 office 1 using System;
2 using System.Drawing;
3 using System.Drawing.Drawing2D;
4 using System.Drawing.Imaging;
2 office 5 using System.IO;
1 office 6 using System.Runtime.Serialization;
7 using System.Security;
8 using System.Threading;
9 using System.Windows.Forms;
10  
11 using DocToolkit;
12  
13 namespace CraftSynth.ImageEditor
14 {
15 public partial class MainForm : UserControl
16 {
17 #region Members
18 private DrawArea drawArea;
19 private DocManager docManager;
20 private DragDropManager dragDropManager;
21 private MruManager mruManager;
22  
23 private string argumentFile = ""; // file name from command line
24  
25 //private const string registryPath = "Software\\AlexF\\DrawTools";
26  
27 private bool _controlKey = false;
28 private bool _panMode = false;
29 #endregion
30  
31 #region Properties
32  
33 public Form ParentForm { get; set; }
34 /// <summary>
35 /// File name from the command line
36 /// </summary>
37 public string ArgumentFile
38 {
39 get { return argumentFile; }
40 set { argumentFile = value; }
41 }
42  
43 /// <summary>
44 /// Get reference to Edit menu item.
45 /// Used to show context menu in DrawArea class.
46 /// </summary>
47 /// <value></value>
48 public ToolStripMenuItem ContextParent
49 {
50 get { return editToolStripMenuItem; }
51 }
52  
53 public Image InitialImage { get; set; }
54 public string InitialImageAsFilePath{get; set;}
55 public byte[] InitialImageAsPngBytes{get; set;}
56  
57 public Image Image
58 {
59 get
60 {
61 Bitmap b = new Bitmap(drawArea.Width, drawArea.Height);
62 using (Graphics g = Graphics.FromImage(b))
63 {
64 g.Clear(Color.White);
65 drawArea.TheLayers.Draw(g);
66 }
67 //b.Save(@"c:\test.bmp", ImageFormat.Bmp);
68 return b;
69 }
70 }
71  
72 private bool _zoomOnMouseWheel = false;
73 public bool ZoomOnMouseWheel
74 {
75 get
76 {
77 return _zoomOnMouseWheel;
78 }
79 set
80 {
81 _zoomOnMouseWheel = value;
82 }
83 }
84  
85 #endregion
86  
87 #region Constructor
88 public MainForm()
89 {
90 InitializeComponent();
91 MouseWheel += new MouseEventHandler(MainForm_MouseWheel);
92 if (this._zoomOnMouseWheel)
93 {
94 this.pnlDrawArea.MouseWheel += new MouseEventHandler(MainForm_MouseWheel);
95 }
96 }
97  
98 public void Initialize(Form parentForm)
99 {
100 this.ParentForm = parentForm;
101 }
102  
103 #endregion
104  
105 #region Destructor
106 // Flag: Has Dispose already been called?
107 private volatile bool _disposed = false;
108 private volatile bool _disposingOrDisposed = false;
109  
110 // Protected implementation of Dispose pattern.
111 protected override void Dispose(bool disposing)
112 {
113 this._disposingOrDisposed = true;
114 if (!this._disposed)
115 {
116 if (disposing)
117 {
118 // Free any managed objects here.
119 //
120 if (this.InitialImage != null)
121 {
122 this.InitialImage.Dispose();
123 }
124 if (this.drawArea != null)
125 {
126 this.drawArea.Dispose();
127 }
128  
129 if(components != null)
130 {
131 components.Dispose();
132 }
133 }
134  
135 // Free any unmanaged objects here.
136 //
137  
138 this._disposed = true;
139 }
140 base.Dispose(disposing);
141 }
142  
143 ~MainForm()
144 {
145 this.Dispose(false);
146 }
147 #endregion
148  
149 #region Toolbar Event Handlers
150 private void toolStripButtonNew_Click(object sender, EventArgs e)
151 {
152 CommandNew();
153 }
154  
155 private void toolStripButtonOpen_Click(object sender, EventArgs e)
156 {
157 CommandOpen();
158 }
159  
160 private void toolStripButtonSave_Click(object sender, EventArgs e)
161 {
162 CommandSave();
163 }
164  
165 private void toolStripButtonPointer_Click(object sender, EventArgs e)
166 {
167 CommandPointer();
168 }
169  
170 private void toolStripButtonRectangle_Click(object sender, EventArgs e)
171 {
172 CommandRectangle();
173 }
174  
175 private void toolStripButtonEllipse_Click(object sender, EventArgs e)
176 {
177 CommandEllipse();
178 }
179  
180 private void toolStripButtonLine_Click(object sender, EventArgs e)
181 {
182 CommandLine();
183 }
184  
185 private void toolStripButtonPencil_Click(object sender, EventArgs e)
186 {
187 CommandPolygon();
188 }
189  
190 private void toolStripButtonAbout_Click(object sender, EventArgs e)
191 {
192 CommandAbout();
193 }
194  
195 private void toolStripButtonUndo_Click(object sender, EventArgs e)
196 {
197 CommandUndo();
198 }
199  
200 private void toolStripButtonRedo_Click(object sender, EventArgs e)
201 {
202 CommandRedo();
203 }
204 #endregion Toolbar Event Handlers
205  
206 #region Menu Event Handlers
207 private void newToolStripMenuItem_Click(object sender, EventArgs e)
208 {
209 CommandNew();
210 }
211  
212 private void openToolStripMenuItem_Click(object sender, EventArgs e)
213 {
214 CommandOpen();
215 }
216  
217 private void saveToolStripMenuItem_Click(object sender, EventArgs e)
218 {
219 CommandSave();
220 }
221  
222 private void saveAsToolStripMenuItem_Click(object sender, EventArgs e)
223 {
224 CommandSaveAs();
225 }
226  
227 private void selectAllToolStripMenuItem_Click(object sender, EventArgs e)
228 {
229 this._panMode = false;
230 drawArea.Panning = this._panMode;
231  
232 int x = drawArea.TheLayers.ActiveLayerIndex;
233 drawArea.TheLayers[x].Graphics.SelectAll();
234 drawArea.Refresh();
235 }
236  
237 private void unselectAllToolStripMenuItem_Click(object sender, EventArgs e)
238 {
239 this._panMode = false;
240 drawArea.Panning = this._panMode;
241  
242 int x = drawArea.TheLayers.ActiveLayerIndex;
243 drawArea.TheLayers[x].Graphics.UnselectAll();
244 drawArea.Refresh();
245 }
246  
247 private void deleteToolStripMenuItem_Click(object sender, EventArgs e)
248 {
249 this._panMode = false;
250 drawArea.Panning = this._panMode;
251  
252 int x = drawArea.TheLayers.ActiveLayerIndex;
253 CommandDelete command = new CommandDelete(drawArea.TheLayers);
254  
255 if (drawArea.TheLayers[x].Graphics.DeleteSelection())
256 {
257 drawArea.Refresh();
258 drawArea.AddCommandToHistory(command);
259 }
260 }
261  
262 private void deleteAllToolStripMenuItem_Click(object sender, EventArgs e)
263 {
264 this._panMode = false;
265 drawArea.Panning = this._panMode;
266  
267 Clear(false);
268 }
269  
270 private void Clear(bool clearHistory)
271 {
272 int x = drawArea.TheLayers.ActiveLayerIndex;
273 CommandDeleteAll command = new CommandDeleteAll(drawArea.TheLayers);
274  
275 if (drawArea.TheLayers[x].Graphics.Clear())
276 {
277 drawArea.Refresh();
278 drawArea.AddCommandToHistory(command);
279 }
280  
281 if (clearHistory)
282 {
283 drawArea.ClearHistory();
284 }
285 }
286  
287 private void moveToFrontToolStripMenuItem_Click(object sender, EventArgs e)
288 {
289 this._panMode = false;
290 drawArea.Panning = this._panMode;
291  
292 int x = drawArea.TheLayers.ActiveLayerIndex;
293 if (drawArea.TheLayers[x].Graphics.MoveSelectionToFront())
294 {
295 drawArea.Refresh();
296 }
297 }
298  
299 private void moveToBackToolStripMenuItem_Click(object sender, EventArgs e)
300 {
301 this._panMode = false;
302 drawArea.Panning = this._panMode;
303  
304 int x = drawArea.TheLayers.ActiveLayerIndex;
305 if (drawArea.TheLayers[x].Graphics.MoveSelectionToBack())
306 {
307 drawArea.Refresh();
308 }
309 }
310  
311 private void propertiesToolStripMenuItem_Click(object sender, EventArgs e)
312 {
313 //if (drawArea.GraphicsList.ShowPropertiesDialog(drawArea))
314 //{
315 // drawArea.SetDirty();
316 // drawArea.Refresh();
317 //}
318 }
319  
320 private void pointerToolStripMenuItem_Click(object sender, EventArgs e)
321 {
322 CommandPointer();
323 }
324  
325 private void rectangleToolStripMenuItem_Click(object sender, EventArgs e)
326 {
327 CommandRectangle();
328 }
329  
330 private void ellipseToolStripMenuItem_Click(object sender, EventArgs e)
331 {
332 CommandEllipse();
333 }
334  
335 private void lineToolStripMenuItem_Click(object sender, EventArgs e)
336 {
337 CommandLine();
338 }
339  
340 private void pencilToolStripMenuItem_Click(object sender, EventArgs e)
341 {
342 CommandPolygon();
343 }
344  
345 private void aboutToolStripMenuItem_Click(object sender, EventArgs e)
346 {
347 CommandAbout();
348 }
349  
350 private void undoToolStripMenuItem_Click(object sender, EventArgs e)
351 {
352 CommandUndo();
353 }
354  
355 private void redoToolStripMenuItem_Click(object sender, EventArgs e)
356 {
357 CommandRedo();
358 }
359 #endregion Menu Event Handlers
360  
361 #region DocManager Event Handlers
362 /// <summary>
363 /// Load document from the stream supplied by DocManager
364 /// </summary>
365 /// <param name="sender"></param>
366 /// <param name="e"></param>
367 private void docManager_LoadEvent(object sender, SerializationEventArgs e)
368 {
369 // DocManager asks to load document from supplied stream
370 try
371 {
372 drawArea.TheLayers = (Layers)e.Formatter.Deserialize(e.SerializationStream);
373 } catch (ArgumentNullException ex)
374 {
375 HandleLoadException(ex, e);
376 } catch (SerializationException ex)
377 {
378 HandleLoadException(ex, e);
379 } catch (SecurityException ex)
380 {
381 HandleLoadException(ex, e);
382 }
383 }
384  
385  
386 /// <summary>
387 /// Save document to stream supplied by DocManager
388 /// </summary>
389 /// <param name="sender"></param>
390 /// <param name="e"></param>
391 private void docManager_SaveEvent(object sender, SerializationEventArgs e)
392 {
393 // DocManager asks to save document to supplied stream
394 try
395 {
396 e.Formatter.Serialize(e.SerializationStream, drawArea.TheLayers);
397 } catch (ArgumentNullException ex)
398 {
399 HandleSaveException(ex, e);
400 } catch (SerializationException ex)
401 {
402 HandleSaveException(ex, e);
403 } catch (SecurityException ex)
404 {
405 HandleSaveException(ex, e);
406 }
407 }
408 #endregion
409  
410 #region Event Handlers
411 private void MainForm_Load(object sender, EventArgs e)
412 {
413 // Create draw area
414 drawArea = new DrawArea();
415 drawArea.MyParent = this;
416 drawArea.Location = new Point(0, 0);
417 drawArea.Size = new Size(10, 10);
418 drawArea.Owner = this;
419 drawArea.BorderStyle = BorderStyle.None;
420 this.pnlDrawArea.Controls.Add(drawArea);
421  
422 // Helper objects (DocManager and others)
423 InitializeHelperObjects();
424  
425 drawArea.Initialize(this, docManager, InitialImage, InitialImageAsFilePath, InitialImageAsPngBytes);
426 ResizeDrawArea();
427  
428 LoadSettings();
429  
430 // Submit to Idle event to set controls state at idle time
431 Application.Idle += delegate
432 {
433 if (!this._disposingOrDisposed)
434 {
435 this.ResizeDrawArea();
436 //if (drawArea.PanX != 0 && drawArea.PanY != 0)
437 //{
438 // this.ManualScroll(true, -drawArea.PanX);
439 // this.ManualScroll(false, -drawArea.PanY);
440 // drawArea.PanX = 0;
441 // drawArea.PanY = 0;
442 //}
443 SetStateOfControls();
444 //Debug.WriteLine("Idle");Debug.Flush();
445 }
446 };
447  
448 // Open file passed in the command line
449 if (ArgumentFile.Length > 0)
450 OpenDocument(ArgumentFile);
451  
452 // Subscribe to DropDownOpened event for each popup menu
453 // (see details in MainForm_DropDownOpened)
454 //foreach (ToolStripItem item in menuStrip1.Items)
455 //{
456 // if (item.GetType() ==
457 // typeof(ToolStripMenuItem))
458 // {
459 // ((ToolStripMenuItem)item).DropDownOpened += MainForm_DropDownOpened;
460 // }
461 //}
462  
463 SetStateOfControls();
464 }
465  
466 /// <summary>
467 /// Resize draw area when form is resized
468 /// </summary>
469 private void MainForm_Resize(object sender, EventArgs e)
470 {
471 if (/*WindowState != FormWindowState.Minimized &&*/
472 drawArea != null)
473 {
474 ResizeDrawArea();
475 }
476 }
477  
478 /// <summary>
479 /// Form is closing
480 /// </summary>
481 private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
482 {
483 if (e.CloseReason ==
484 CloseReason.UserClosing)
485 {
486 if (!docManager.CloseDocument())
487 e.Cancel = true;
488 }
489  
490 SaveSettings();
491 }
492  
493 /// <summary>
494 /// Popup menu item (File, Edit ...) is opened.
495 /// </summary>
496 /// <param name="sender"></param>
497 /// <param name="e"></param>
498 private void MainForm_DropDownOpened(object sender, EventArgs e)
499 {
500 // Reset active tool to pointer.
501 // This prevents bug in rare case when non-pointer tool is active, user opens
502 // main main menu and after this clicks in the drawArea. MouseDown event is not
503 // raised in this case (why ??), and MouseMove event works incorrectly.
504 drawArea.ActiveTool = DrawArea.DrawToolType.Pointer;
505 }
506 #endregion Event Handlers
507  
508 #region Other Functions
509 /// <summary>
510 /// Set state of controls.
511 /// Function is called at idle time.
512 /// </summary>
513 public void SetStateOfControls()
514 {
515 // Select active tool
516 toolStripButtonPointer.Checked = !drawArea.Panning && (drawArea.ActiveTool == DrawArea.DrawToolType.Pointer);
517 toolStripButtonRectangle.Checked = (drawArea.ActiveTool == DrawArea.DrawToolType.Rectangle);
518 toolStripButtonEllipse.Checked = (drawArea.ActiveTool == DrawArea.DrawToolType.Ellipse);
519 toolStripButtonArrow.Checked = drawArea.EndCap == LineCap.ArrowAnchor && (drawArea.ActiveTool == DrawArea.DrawToolType.Line);
520 toolStripButtonLine.Checked = drawArea.EndCap != LineCap.ArrowAnchor &&(drawArea.ActiveTool == DrawArea.DrawToolType.Line);
521 toolStripButtonPencil.Checked = (drawArea.ActiveTool == DrawArea.DrawToolType.Polygon);
522  
523 pointerToolStripMenuItem.Checked = (drawArea.ActiveTool == DrawArea.DrawToolType.Pointer);
524 rectangleToolStripMenuItem.Checked = (drawArea.ActiveTool == DrawArea.DrawToolType.Rectangle);
525 ellipseToolStripMenuItem.Checked = (drawArea.ActiveTool == DrawArea.DrawToolType.Ellipse);
526 lineToolStripMenuItem.Checked = (drawArea.ActiveTool == DrawArea.DrawToolType.Line);
527 pencilToolStripMenuItem.Checked = (drawArea.ActiveTool == DrawArea.DrawToolType.Polygon);
528  
529 switch (drawArea.LineWidth)
530 {
531 case -1: this.toolStripDropDownButtonLineThickness.Text = "Thinnest"; break;
532 case 2: this.toolStripDropDownButtonLineThickness.Text = "Thin"; break;
533 case 5: this.toolStripDropDownButtonLineThickness.Text = "Thick"; break;
534 case 10: this.toolStripDropDownButtonLineThickness.Text = "Thicker"; break;
535 case 15: this.toolStripDropDownButtonLineThickness.Text = "Thickest"; break;
536 }
537  
538 this.toolStripDropDownButtonPenType.Text = DrawingPens.GetPenTypeAsString(drawArea.PenType);
539  
540 tsbLineColor.BackColor = drawArea.LineColor;
541 tsbFillColor.BackColor = drawArea.FillColor;
542  
543 int x = drawArea.TheLayers.ActiveLayerIndex;
544 bool objects = (drawArea.TheLayers[x].Graphics.Count > 0);
545 bool selectedObjects = (drawArea.TheLayers[x].Graphics.SelectionCount > 0);
546 // File operations
547 saveToolStripMenuItem.Enabled = objects;
548 //toolStripButtonSave.Enabled = objects;
549 saveAsToolStripMenuItem.Enabled = objects;
550  
551 // Edit operations
552 deleteToolStripMenuItem.Enabled = selectedObjects;
553 deleteAllToolStripMenuItem.Enabled = objects;
554 selectAllToolStripMenuItem.Enabled = objects;
555 unselectAllToolStripMenuItem.Enabled = objects;
556 moveToFrontToolStripMenuItem.Enabled = selectedObjects;
557 moveToBackToolStripMenuItem.Enabled = selectedObjects;
558 propertiesToolStripMenuItem.Enabled = selectedObjects;
559  
560 // Undo, Redo
561 undoToolStripMenuItem.Enabled = drawArea.CanUndo;
562 toolStripButtonUndo.Enabled = drawArea.CanUndo;
563  
564 redoToolStripMenuItem.Enabled = drawArea.CanRedo;
565 toolStripButtonRedo.Enabled = drawArea.CanRedo;
566  
567 // Status Strip
568 //tslCurrentLayer.Text = drawArea.TheLayers[x].LayerName;
569 //tslNumberOfObjects.Text = drawArea.TheLayers[x].Graphics.Count.ToString();
570 //tslPanPosition.Text = drawArea.PanX + ", " + drawArea.PanY;
571 //tslRotation.Text = drawArea.Rotation + " deg";
572 //tslZoomLevel.Text = (Math.Round(drawArea.Zoom * 100)) + " %";
573  
574 // Pan button
575 tsbPanMode.Checked = drawArea.Panning;
576 }
577  
578 /// <summary>
579 /// Set draw area to all form client space except toolbar
580 /// </summary>
581 private void ResizeDrawArea()
582 {
583 var bounds = drawArea.GetBounds();
584  
585 //drawArea.Left = 0;
586 //drawArea.Top = 0;
587 drawArea.Width = Math.Max(this.pnlDrawArea.ClientRectangle.Width , (int)Math.Round((bounds.Left+ bounds.Width+10)*drawArea.Zoom));
588 drawArea.Height = Math.Max(this.pnlDrawArea.ClientRectangle.Height , (int)Math.Round((bounds.Top+bounds.Height+10)*drawArea.Zoom));
589 this.pnlDrawArea.Invalidate();
590 ;
591 }
592  
593 /// <summary>
594 /// Initialize helper objects from the DocToolkit Library.
595 ///
596 /// Called from Form1_Load. Initialized all objects except
597 /// PersistWindowState wich must be initialized in the
598 /// form constructor.
599 /// </summary>
600 private void InitializeHelperObjects()
601 {
602 //Excluded by F4CIO:------------------------------------------------------------------
603 //// DocManager
604 //DocManagerData data = new DocManagerData();
605 //data.FormOwner = this.ParentForm;
606 //data.UpdateTitle = true;
607 //data.FileDialogFilter = "DrawTools files (*.dtl)|*.dtl|All Files (*.*)|*.*";
608 //data.NewDocName = "Untitled.dtl";
609 //data.RegistryPath = registryPath;
610  
611 //docManager = new DocManager(data);
612 //docManager.RegisterFileType("dtl", "dtlfile", "DrawTools File");
613  
614 //// Subscribe to DocManager events.
615 //docManager.SaveEvent += docManager_SaveEvent;
616 //docManager.LoadEvent += docManager_LoadEvent;
617  
618 //// Make "inline subscription" using anonymous methods.
619 //docManager.OpenEvent += delegate(object sender, OpenFileEventArgs e)
620 // {
621 // // Update MRU List
622 // if (e.Succeeded)
623 // mruManager.Add(e.FileName);
624 // else
625 // mruManager.Remove(e.FileName);
626 // };
627  
628 //docManager.DocChangedEvent += delegate
629 // {
630 // drawArea.Refresh();
631 // drawArea.ClearHistory();
632 // };
633  
634 //docManager.ClearEvent += delegate
635 // {
636 // bool haveObjects = false;
637 // for (int i = 0; i < drawArea.TheLayers.Count; i++)
638 // {
639 // if (drawArea.TheLayers[i].Graphics.Count > 1)
640 // {
641 // haveObjects = true;
642 // break;
643 // }
644 // }
645 // if (haveObjects)
646 // {
647 // drawArea.TheLayers.Clear();
648 // drawArea.ClearHistory();
649 // drawArea.Refresh();
650 // }
651 // };
652  
653 //docManager.NewDocument();
654  
655 // DragDropManager
656 dragDropManager = new DragDropManager(this.ParentForm);
657 dragDropManager.FileDroppedEvent += delegate(object sender, FileDroppedEventArgs e) { OpenDocument(e.FileArray.GetValue(0).ToString()); };
658  
659 //Excluded by F4CIO:-------------------------------------------------------------------
660 // MruManager
661 //mruManager = new MruManager();
662 //mruManager.Initialize(
663 // this.ParentForm, // owner form
664 // recentFilesToolStripMenuItem, // Recent Files menu item
665 // fileToolStripMenuItem, // parent
666 // registryPath); // Registry path to keep MRU list
667  
668 //mruManager.MruOpenEvent += delegate(object sender, MruFileOpenEventArgs e) { OpenDocument(e.FileName); };
669 }
670  
671 /// <summary>
672 /// Handle exception from docManager_LoadEvent function
673 /// </summary>
674 /// <param name="ex"></param>
675 /// <param name="e"></param>
676 private void HandleLoadException(Exception ex, SerializationEventArgs e)
677 {
678 MessageBox.Show(this,
679 "Open File operation failed. File name: " + e.FileName + "\n" +
680 "Reason: " + ex.Message,
681 Application.ProductName);
682  
683 e.Error = true;
684 }
685  
686 /// <summary>
687 /// Handle exception from docManager_SaveEvent function
688 /// </summary>
689 /// <param name="ex"></param>
690 /// <param name="e"></param>
691 private void HandleSaveException(Exception ex, SerializationEventArgs e)
692 {
693 MessageBox.Show(this,
694 "Save File operation failed. File name: " + e.FileName + "\n" +
695 "Reason: " + ex.Message,
696 Application.ProductName);
697  
698 e.Error = true;
699 }
700  
701 /// <summary>
702 /// Open document.
703 /// Used to open file passed in command line or dropped into the window
704 /// </summary>
705 /// <param name="file"></param>
706 public void OpenDocument(string file)
707 {
708 this._panMode = false;
709 drawArea.Panning = this._panMode;
710  
711 docManager.OpenDocument(file);
712 }
713  
714 /// <summary>
715 /// Load application settings
716 /// </summary>
717 private void LoadSettings()
718 {
719  
720 }
721  
722 /// <summary>
723 /// Save application settings
724 /// </summary>
725 private void SaveSettings()
726 {
727  
728 }
729  
730 /// <summary>
731 /// Set Pointer draw tool
732 /// </summary>
733 private void CommandPointer()
734 {
735 drawArea.ActiveTool = DrawArea.DrawToolType.Pointer;
736  
737 this._panMode = false;
738 drawArea.Panning = this._panMode;
739 }
740  
741 /// <summary>
742 /// Set Rectangle draw tool
743 /// </summary>
744 private void CommandRectangle()
745 {
746 drawArea.ActiveTool = DrawArea.DrawToolType.Rectangle;
747 drawArea.DrawFilled = false;
748  
749 drawArea.EndCap = LineCap.Round;
750 this._panMode = false;
751 drawArea.Panning = this._panMode;
752 }
753  
754 /// <summary>
755 /// Set Ellipse draw tool
756 /// </summary>
757 private void CommandEllipse()
758 {
759 drawArea.ActiveTool = DrawArea.DrawToolType.Ellipse;
760 drawArea.DrawFilled = false;
761  
762 drawArea.EndCap = LineCap.Round;
763 this._panMode = false;
764 drawArea.Panning = this._panMode;
765 }
766  
767 /// <summary>
768 /// Set Arrow Line draw tool
769 /// </summary>
770 private void CommandArrow()
771 {
772 drawArea.ActiveTool = DrawArea.DrawToolType.Line;
773  
774 drawArea.EndCap = LineCap.ArrowAnchor;
775 this._panMode = false;
776 drawArea.Panning = this._panMode;
777 }
778  
779 /// <summary>
780 /// Set Line draw tool
781 /// </summary>
782 private void CommandLine()
783 {
784 drawArea.ActiveTool = DrawArea.DrawToolType.Line;
785  
786 drawArea.EndCap = LineCap.Round;
787 this._panMode = false;
788 drawArea.Panning = this._panMode;
789 }
790  
791 /// <summary>
792 /// Set Polygon draw tool
793 /// </summary>
794 private void CommandPolygon()
795 {
796 drawArea.ActiveTool = DrawArea.DrawToolType.Polygon;
797  
798 drawArea.EndCap = LineCap.Round;
799 this._panMode = false;
800 drawArea.Panning = this._panMode;
801 }
802  
803 /// <summary>
804 /// Show About dialog
805 /// </summary>
806 private void CommandAbout()
807 {
808 FrmAbout frm = new FrmAbout();
809 frm.ShowDialog(this);
810 }
811  
812 /// <summary>
813 /// Open new file
814 /// </summary>
815 private void CommandNew()
816 {
817 this._panMode = false;
818 drawArea.Panning = this._panMode;
819  
820 docManager.NewDocument();
821 }
822  
823 /// <summary>
824 /// Open file
825 /// </summary>
826 private void CommandOpen()
827 {
828 this._panMode = false;
829 drawArea.Panning = this._panMode;
830  
831 docManager.OpenDocument("");
832 }
833  
834 /// <summary>
835 /// Save file
836 /// </summary>
837 private void CommandSave()
838 {
839 this._panMode = false;
840 drawArea.Panning = this._panMode;
841  
842 docManager.SaveDocument(DocManager.SaveType.Save);
843 }
844  
845 /// <summary>
846 /// Save As
847 /// </summary>
848 private void CommandSaveAs()
849 {
850 this._panMode = false;
851 drawArea.Panning = this._panMode;
852  
853 docManager.SaveDocument(DocManager.SaveType.SaveAs);
854 }
855  
856 /// <summary>
857 /// Undo
858 /// </summary>
859 private void CommandUndo()
860 {
861 drawArea.Undo();
862 }
863  
864 /// <summary>
865 /// Redo
866 /// </summary>
867 private void CommandRedo()
868 {
869 drawArea.Redo();
870 }
871 #endregion
872  
873 #region Mouse Functions
874 private void MainForm_MouseWheel(object sender, MouseEventArgs e)
875 {
876 if (e.Delta != 0)
877 {
878 if (_zoomOnMouseWheel)
879 {
880 ((HandledMouseEventArgs)e).Handled = true;
881 }
882  
883 if (_controlKey)
884 {
885 // We are panning up or down using the wheel
886 if (e.Delta > 0)
887 this.ManualScroll(false, 10);
888 else
889 this.ManualScroll(false,-10);
890 Invalidate();
891 } else
892 {
893 if (_zoomOnMouseWheel)
894 {
895 // We are zooming in or out using the wheel
896 if (e.Delta > 0)
897 AdjustZoom(.1f);
898 else
899 AdjustZoom(-.1f);
900 }
901 }
902 SetStateOfControls();
903 return;
904 }
905 }
906 #endregion Mouse Functions
907  
908 #region Keyboard Functions
909 private void MainForm_KeyDown(object sender, KeyEventArgs e)
910 {
911 int al = drawArea.TheLayers.ActiveLayerIndex;
912 switch (e.KeyCode)
913 {
914 case Keys.Delete:
915 drawArea.TheLayers[al].Graphics.DeleteSelection();
916 drawArea.Invalidate();
917 break;
918 case Keys.Right:
919 this.ManualScroll(true,-10);
920 drawArea.Invalidate();
921 break;
922 case Keys.Left:
923 this.ManualScroll(true,+10);
924 drawArea.Invalidate();
925 break;
926 case Keys.Up:
927 if (e.KeyCode == Keys.Up &&
928 e.Shift)
929 AdjustZoom(.1f);
930 else
931 drawArea.PanY += 10;
932 drawArea.Invalidate();
933 break;
934 case Keys.Down:
935 if (e.KeyCode == Keys.Down &&
936 e.Shift)
937 AdjustZoom(-.1f);
938 else
939 drawArea.PanY -= 10;
940 drawArea.Invalidate();
941 break;
942 case Keys.ControlKey:
943 _controlKey = true;
944 break;
945 default:
946 break;
947 }
948 drawArea.Invalidate();
949 SetStateOfControls();
950 }
951  
952 private void MainForm_KeyUp(object sender, KeyEventArgs e)
953 {
954 _controlKey = false;
955 }
956 #endregion Keyboard Functions
957  
958 #region Zoom, Pan, Rotation Functions
959 /// <summary>
960 /// Adjust the zoom by the amount given, within reason
961 /// </summary>
962 /// <param name="_amount">float value to adjust zoom by - may be positive or negative</param>
963 private void AdjustZoom(float _amount)
964 {
965 drawArea.Zoom += _amount;
966 if (drawArea.Zoom < .1f)
967 drawArea.Zoom = .1f;
968 if (drawArea.Zoom > 10)
969 drawArea.Zoom = 10f;
970  
971 drawArea.Invalidate();
972 SetStateOfControls();
973 }
974  
975 private void tsbZoomIn_Click(object sender, EventArgs e)
976 {
977 AdjustZoom(.1f);
978 }
979  
980 private void tsbZoomOut_Click(object sender, EventArgs e)
981 {
982 AdjustZoom(-.1f);
983 }
984  
985 private void tsbZoomReset_Click(object sender, EventArgs e)
986 {
987 drawArea.Zoom = 1.0f;
988 drawArea.Invalidate();
989 }
990  
991 private void tsbRotateRight_Click(object sender, EventArgs e)
992 {
993 this._panMode = false;
994 drawArea.Panning = this._panMode;
995  
996 int al = drawArea.TheLayers.ActiveLayerIndex;
997 if (drawArea.TheLayers[al].Graphics.SelectionCount > 0)
998 RotateObject(10);
999 else
1000 RotateDrawing(10);
1001 }
1002  
1003 private void tsbRotateLeft_Click(object sender, EventArgs e)
1004 {
1005 this._panMode = false;
1006 drawArea.Panning = this._panMode;
1007  
1008 int al = drawArea.TheLayers.ActiveLayerIndex;
1009 if (drawArea.TheLayers[al].Graphics.SelectionCount > 0)
1010 RotateObject(-10);
1011 else
1012 RotateDrawing(-10);
1013 }
1014  
1015 private void tsbRotateReset_Click(object sender, EventArgs e)
1016 {
1017 this._panMode = false;
1018 drawArea.Panning = this._panMode;
1019  
1020 int al = drawArea.TheLayers.ActiveLayerIndex;
1021 if (drawArea.TheLayers[al].Graphics.SelectionCount > 0)
1022 RotateObject(0);
1023 else
1024 RotateDrawing(0);
1025 }
1026  
1027 /// <summary>
1028 /// Rotate the selected Object(s)
1029 /// </summary>
1030 /// <param name="p">Amount to rotate. Negative is Left, Positive is Right, Zero indicates Reset to zero</param>
1031 private void RotateObject(int p)
1032 {
1033 int al = drawArea.TheLayers.ActiveLayerIndex;
1034 for (int i = 0; i < drawArea.TheLayers[al].Graphics.Count; i++)
1035 {
1036 if (drawArea.TheLayers[al].Graphics[i].Selected)
1037 if (p == 0)
1038 drawArea.TheLayers[al].Graphics[i].Rotation = 0;
1039 else
1040 drawArea.TheLayers[al].Graphics[i].Rotation += p;
1041 }
1042  
1043 this._panMode = false;
1044 drawArea.Panning = this._panMode;
1045  
1046 drawArea.Invalidate();
1047 SetStateOfControls();
1048 }
1049  
1050 /// <summary>
1051 /// Rotate the entire drawing
1052 /// </summary>
1053 /// <param name="p">Amount to rotate. Negative is Left, Positive is Right, Zero indicates Reset to zero</param>
1054 private void RotateDrawing(int p)
1055 {
1056 if (p == 0)
1057 drawArea.Rotation = 0;
1058 else
1059 {
1060 drawArea.Rotation += p;
1061 if (p < 0) // Left Rotation
1062 {
1063 if (drawArea.Rotation <
1064 -360)
1065 drawArea.Rotation = 0;
1066 } else
1067 {
1068 if (drawArea.Rotation > 360)
1069 drawArea.Rotation = 0;
1070 }
1071 }
1072  
1073 this._panMode = false;
1074 drawArea.Panning = this._panMode;
1075  
1076 drawArea.Invalidate();
1077 SetStateOfControls();
1078 }
1079  
1080 private void tsbPanMode_Click(object sender, EventArgs e)
1081 {
1082 _panMode = true;//!_panMode;
1083 if (_panMode)
1084 {
1085 tsbPanMode.Checked = true;
1086 }
1087 else
1088 {
1089 tsbPanMode.Checked = false;
1090 }
1091 drawArea.ActiveTool = DrawArea.DrawToolType.Pointer;
1092 drawArea.Panning = _panMode;
1093 }
1094  
1095 private void tsbPanReset_Click(object sender, EventArgs e)
1096 {
1097 _panMode = false;
1098 if (tsbPanMode.Checked)
1099 tsbPanMode.Checked = false;
1100 drawArea.Panning = false;
1101 drawArea.PanX = 0;
1102 drawArea.PanY = drawArea.OriginalPanY;
1103 drawArea.Invalidate();
1104 }
1105 #endregion Zoom, Pan, Rotation Functions
1106  
1107 private void tslCurrentLayer_Click(object sender, EventArgs e)
1108 {
1109 LayerDialog ld = new LayerDialog(drawArea.TheLayers);
1110 ld.ShowDialog();
1111 // First add any new layers
1112 for (int i = 0; i < ld.layerList.Count; i++)
1113 {
1114 if (ld.layerList[i].LayerNew)
1115 {
1116 Layer layer = new Layer();
1117 layer.LayerName = ld.layerList[i].LayerName;
1118 layer.Graphics = new GraphicsList();
1119 drawArea.TheLayers.Add(layer);
1120 }
1121 }
1122 drawArea.TheLayers.InactivateAllLayers();
1123 for (int i = 0; i < ld.layerList.Count; i++)
1124 {
1125 if (ld.layerList[i].LayerActive)
1126 drawArea.TheLayers.SetActiveLayer(i);
1127  
1128 if (ld.layerList[i].LayerVisible)
1129 drawArea.TheLayers.MakeLayerVisible(i);
1130 else
1131 drawArea.TheLayers.MakeLayerInvisible(i);
1132  
1133 drawArea.TheLayers[i].LayerName = ld.layerList[i].LayerName;
1134 }
1135 // Lastly, remove any deleted layers
1136 for (int i = 0; i < ld.layerList.Count; i++)
1137 {
1138 if (ld.layerList[i].LayerDeleted)
1139 drawArea.TheLayers.RemoveLayer(i);
1140 }
1141 drawArea.Invalidate();
1142 }
1143  
1144 #region Additional Drawing Tools
1145 /// <summary>
1146 /// Draw PolyLine objects - a polyline is a series of straight lines of various lengths connected at their end points.
1147 /// </summary>
1148 /// <param name="sender"></param>
1149 /// <param name="e"></param>
1150 private void tsbPolyLine_Click(object sender, EventArgs e)
1151 {
1152 drawArea.ActiveTool = DrawArea.DrawToolType.PolyLine;
1153 drawArea.DrawFilled = false;
1154  
1155 this._panMode = false;
1156 drawArea.Panning = this._panMode;
1157 }
1158  
1159 private void tsbConnector_Click(object sender, EventArgs e)
1160 {
1161 drawArea.ActiveTool = DrawArea.DrawToolType.Connector;
1162 drawArea.DrawFilled = false;
1163  
1164 this._panMode = false;
1165 drawArea.Panning = this._panMode;
1166 }
1167 /// <summary>
1168 /// Draw Text objects
1169 /// </summary>
1170 /// <param name="sender"></param>
1171 /// <param name="e"></param>
1172 private void tsbDrawText_Click(object sender, EventArgs e)
1173 {
1174 drawArea.ActiveTool = DrawArea.DrawToolType.Text;
1175  
1176 this._panMode = false;
1177 drawArea.Panning = this._panMode;
1178 }
1179  
1180 private void tsbFilledRectangle_Click(object sender, EventArgs e)
1181 {
1182 drawArea.ActiveTool = DrawArea.DrawToolType.Rectangle;
1183 drawArea.DrawFilled = true;
1184  
1185 drawArea.EndCap = LineCap.Round;
1186 this._panMode = false;
1187 drawArea.Panning = this._panMode;
1188 }
1189  
1190 private void tsbFilledEllipse_Click(object sender, EventArgs e)
1191 {
1192 drawArea.ActiveTool = DrawArea.DrawToolType.Ellipse;
1193 drawArea.DrawFilled = true;
1194  
1195 drawArea.EndCap = LineCap.Round;
1196 this._panMode = false;
1197 drawArea.Panning = this._panMode;
1198 }
1199  
1200 private void tsbImage_Click(object sender, EventArgs e)
1201 {
1202 drawArea.ActiveTool = DrawArea.DrawToolType.Image;
1203  
1204 drawArea.EndCap = LineCap.Round;
1205 this._panMode = false;
1206 drawArea.Panning = this._panMode;
1207 }
1208  
1209 private void tsbSelectLineColor_Click(object sender, EventArgs e)
1210 {
1211 dlgColor.AllowFullOpen = true;
1212 dlgColor.AnyColor = true;
1213 if (dlgColor.ShowDialog() ==
1214 DialogResult.OK)
1215 {
1216 drawArea.LineColor = Color.FromArgb(255, dlgColor.Color);
1217 tsbLineColor.BackColor = Color.FromArgb(255, dlgColor.Color);
1218  
1219 this._panMode = false;
1220 drawArea.Panning = this._panMode;
1221 }
1222 }
1223  
1224 private void tsbSelectFillColor_Click(object sender, EventArgs e)
1225 {
1226 dlgColor.AllowFullOpen = true;
1227 dlgColor.AnyColor = true;
1228 if (dlgColor.ShowDialog() ==
1229 DialogResult.OK)
1230 {
1231 drawArea.FillColor = Color.FromArgb(255, dlgColor.Color);
1232 tsbFillColor.BackColor = Color.FromArgb(255, dlgColor.Color);
1233  
1234 this._panMode = false;
1235 drawArea.Panning = this._panMode;
1236 }
1237 }
1238  
1239 private void tsbLineThinnest_Click(object sender, EventArgs e)
1240 {
1241 drawArea.LineWidth = -1;
1242  
1243 this._panMode = false;
1244 drawArea.Panning = this._panMode;
1245 }
1246  
1247 private void tsbLineThin_Click(object sender, EventArgs e)
1248 {
1249 drawArea.LineWidth = 2;
1250  
1251 this._panMode = false;
1252 drawArea.Panning = this._panMode;
1253 }
1254  
1255 private void tsbThickLine_Click(object sender, EventArgs e)
1256 {
1257 drawArea.LineWidth = 5;
1258  
1259 this._panMode = false;
1260 drawArea.Panning = this._panMode;
1261 }
1262  
1263 private void tsbThickerLine_Click(object sender, EventArgs e)
1264 {
1265 drawArea.LineWidth = 10;
1266  
1267 this._panMode = false;
1268 drawArea.Panning = this._panMode;
1269 }
1270  
1271 private void tsbThickestLine_Click(object sender, EventArgs e)
1272 {
1273 drawArea.LineWidth = 15;
1274  
1275 this._panMode = false;
1276 drawArea.Panning = this._panMode;
1277 }
1278 #endregion Additional Drawing Tools
1279  
1280 public void ExportToFile(string filePath, ImageFormat imageFormat)
1281 {
1282 using (Bitmap b = new Bitmap(drawArea.Width, drawArea.Height))
1283 {
1284 using (Graphics g = Graphics.FromImage(b))
1285 {
1286 g.Clear(Color.White);
1287 drawArea.DeselectAll();
1288 drawArea.TheLayers.Draw(g);
1289 b.Save(filePath, imageFormat);
1290 }
1291 }
1292 }
2 office 1293  
1294 public byte[] ExportBytes(ImageFormat imageFormat)
1295 {
1296 using (MemoryStream m = new MemoryStream())
1297 {
1298 using (Bitmap b = new Bitmap(drawArea.Width, drawArea.Height))
1299 {
1300 using (Graphics g = Graphics.FromImage(b))
1301 {
1302 g.Clear(Color.White);
1303 drawArea.DeselectAll();
1304 drawArea.TheLayers.Draw(g);
1305 b.Save(m, imageFormat);
1306 }
1307 }
1308  
1309 return m.ToArray();
1310 }
1311 }
1312  
1 office 1313 public Image ExportToImage()
1314 {
1315 Bitmap b = new Bitmap(drawArea.Width, drawArea.Height);
1316 Graphics g = Graphics.FromImage(b);
1317 g.Clear(Color.White);
1318 drawArea.DeselectAll();
1319 drawArea.TheLayers.Draw(g);
1320 return b;
1321 }
1322  
1323 private void exportToolStripMenuItem_Click(object sender, EventArgs e)
1324 {
1325 Bitmap b = new Bitmap(drawArea.Width, drawArea.Height);
1326 Graphics g = Graphics.FromImage(b);
1327 g.Clear(Color.White);
1328 drawArea.TheLayers.Draw(g);
1329 b.Save(@"c:\test.bmp", ImageFormat.Bmp);
1330 MessageBox.Show("save complete!");
1331 g.Dispose();
1332 b.Dispose();
1333 }
1334  
1335 public void CopyAllToClipboard()
1336 {
1337 using (Image image = this.ExportToImage())
1338 {
1339 Clipboard.SetDataObject(image, true);
1340 //Application.DoEvents();
1341 //Thread.Sleep(500);
1342  
1343 using (RichTextBox tempRtb = new RichTextBox())
1344 {
1345 tempRtb.WordWrap = false;
1346  
1347 tempRtb.Paste();
1348 Application.DoEvents();
1349 Thread.Sleep(500);
1350  
1351 tempRtb.SelectAll();
1352  
1353 tempRtb.Copy();
1354 Application.DoEvents();
1355 Thread.Sleep(500);
1356 }
1357 }
1358 }
1359  
1360 private void cutToolStripMenuItem_Click(object sender, EventArgs e)
1361 {
1362 drawArea.CutObject();
1363 }
1364  
1365 private void solidToolStripMenuItem_Click(object sender, EventArgs e)
1366 {
1367 drawArea.PenType = DrawingPens.PenType.Solid;
1368  
1369 this._panMode = false;
1370 drawArea.Panning = this._panMode;
1371 }
1372  
1373 private void dottedToolStripMenuItem_Click(object sender, EventArgs e)
1374 {
1375 drawArea.PenType = DrawingPens.PenType.Dot;
1376  
1377 this._panMode = false;
1378 drawArea.Panning = this._panMode;
1379 }
1380  
1381 private void dashedToolStripMenuItem_Click(object sender, EventArgs e)
1382 {
1383 drawArea.PenType = DrawingPens.PenType.Dash;
1384  
1385 this._panMode = false;
1386 drawArea.Panning = this._panMode;
1387 }
1388  
1389 private void dotDashedtoolStripMenuItem7_Click(object sender, EventArgs e)
1390 {
1391 drawArea.PenType = DrawingPens.PenType.Dash_Dot;
1392  
1393 this._panMode = false;
1394 drawArea.Panning = this._panMode;
1395 }
1396  
1397 private void doubleLineToolStripMenuItem8_Click(object sender, EventArgs e)
1398 {
1399 drawArea.PenType = DrawingPens.PenType.DoubleLine;
1400  
1401 this._panMode = false;
1402 drawArea.Panning = this._panMode;
1403 }
1404  
1405 private void toolStripButtonArrow_Click(object sender, EventArgs e)
1406 {
1407 CommandArrow();
1408 }
1409  
1410 private void ctxtMenu_Opening(object sender, System.ComponentModel.CancelEventArgs e)
1411 {
1412 this.undoToolStripMenuItem2.Enabled = drawArea.CanUndo;
1413 this.toolStripMenuItem13.Enabled = drawArea.CanRedo;
1414 }
1415  
1416 /// <summary>
1417 /// Clears graphics and history and reloads initial image if present.
1418 /// </summary>
1419 public void Reset()
1420 {
1421 this.Clear(true);
1422 drawArea.LoadInitialImage(InitialImage, InitialImageAsFilePath, InitialImageAsPngBytes, null);
1423 }
1424  
1425 private void pnlDrawArea_Scroll(object sender, ScrollEventArgs e)
1426 {
1427 //if (this._zoomOnMouseWheel)
1428 //{
1429 // e.NewValue = e.OldValue;
1430 //}
1431 }
1432  
1433 internal void ManualScroll(bool isHorizontal, int delta)
1434 {
1435 this.ResizeDrawArea();
1436 int newValue;
1437 if (isHorizontal)
1438 {
1439 newValue = this.pnlDrawArea.HorizontalScroll.Value + delta;
1440 newValue = Math.Max(this.pnlDrawArea.HorizontalScroll.Minimum, newValue);
1441 newValue = Math.Min(this.pnlDrawArea.HorizontalScroll.Maximum, newValue);
1442 this.pnlDrawArea.HorizontalScroll.Value = newValue;
1443 }
1444 else
1445 {
1446 newValue = this.pnlDrawArea.VerticalScroll.Value + delta;
1447 newValue = Math.Max(this.pnlDrawArea.VerticalScroll.Minimum, newValue);
1448 newValue = Math.Min(this.pnlDrawArea.VerticalScroll.Maximum, newValue);
1449 this.pnlDrawArea.VerticalScroll.Value = newValue;
1450 }
1451 this.pnlDrawArea.Invalidate();
1452 }
1453  
1454 public void ReplaceInitialImage(Image image, bool preserveSize, bool addNewIfNotFound)
1455 {
1456 this.InitialImageAsFilePath = null;
1457 this.InitialImageAsPngBytes = null;
1458 this.InitialImage = image;
1459  
1460 //CommandDelete command = new CommandDelete(drawArea.TheLayers);
1461  
1462 var indexAndInitialImage = drawArea.GetInitialImageGraphic();
1463 if (indexAndInitialImage != null)
1464 {
1465 if (!preserveSize)
1466 {
1467 indexAndInitialImage.Value.Value.rectangle.Width = image.Width;
1468 indexAndInitialImage.Value.Value.rectangle.Height = image.Height;
1469 }
1470 //TODO: compress theImage here
1471 indexAndInitialImage.Value.Value.TheImage = (Bitmap) image;
1472  
1473 drawArea.Invalidate();
1474 //drawArea.TheLayers[0].Graphics.RemoveAt(indexAndInitialImage.Value.Key);
1475 //drawArea.Refresh();
1476 //drawArea.AddCommandToHistory(command);
1477 }
1478 else
1479 {
1480 if (addNewIfNotFound)
1481 {
1482 drawArea.LoadInitialImage(InitialImage, InitialImageAsFilePath, InitialImageAsPngBytes, null);
1483 }
1484 }
1485  
1486 // drawArea.LoadInitialImage(this.InitialImage, null, null, indexAndInitialImage==null?null:indexAndInitialImage.Value.Value.Clone() as DrawImage);
1487 }
1488 }
1489 }