using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.IO; using System.Runtime.Serialization; using System.Security; using System.Threading; using System.Windows.Forms; using DocToolkit; namespace CraftSynth.ImageEditor { public partial class MainForm : UserControl { #region Members private DrawArea drawArea; private DocManager docManager; private DragDropManager dragDropManager; private MruManager mruManager; private string argumentFile = ""; // file name from command line //private const string registryPath = "Software\\AlexF\\DrawTools"; private bool _controlKey = false; private bool _panMode = false; #endregion #region Properties public Form ParentForm { get; set; } /// /// File name from the command line /// public string ArgumentFile { get { return argumentFile; } set { argumentFile = value; } } /// /// Get reference to Edit menu item. /// Used to show context menu in DrawArea class. /// /// public ToolStripMenuItem ContextParent { get { return editToolStripMenuItem; } } public Image InitialImage { get; set; } public string InitialImageAsFilePath{get; set;} public byte[] InitialImageAsPngBytes{get; set;} public Image Image { get { Bitmap b = new Bitmap(drawArea.Width, drawArea.Height); using (Graphics g = Graphics.FromImage(b)) { g.Clear(Color.White); drawArea.TheLayers.Draw(g); } //b.Save(@"c:\test.bmp", ImageFormat.Bmp); return b; } } private bool _zoomOnMouseWheel = false; public bool ZoomOnMouseWheel { get { return _zoomOnMouseWheel; } set { _zoomOnMouseWheel = value; } } #endregion #region Constructor public MainForm() { InitializeComponent(); MouseWheel += new MouseEventHandler(MainForm_MouseWheel); if (this._zoomOnMouseWheel) { this.pnlDrawArea.MouseWheel += new MouseEventHandler(MainForm_MouseWheel); } } public void Initialize(Form parentForm) { this.ParentForm = parentForm; } #endregion #region Destructor // Flag: Has Dispose already been called? private volatile bool _disposed = false; private volatile bool _disposingOrDisposed = false; // Protected implementation of Dispose pattern. protected override void Dispose(bool disposing) { this._disposingOrDisposed = true; if (!this._disposed) { if (disposing) { // Free any managed objects here. // if (this.InitialImage != null) { this.InitialImage.Dispose(); } if (this.drawArea != null) { this.drawArea.Dispose(); } if(components != null) { components.Dispose(); } } // Free any unmanaged objects here. // this._disposed = true; } base.Dispose(disposing); } ~MainForm() { this.Dispose(false); } #endregion #region Toolbar Event Handlers private void toolStripButtonNew_Click(object sender, EventArgs e) { CommandNew(); } private void toolStripButtonOpen_Click(object sender, EventArgs e) { CommandOpen(); } private void toolStripButtonSave_Click(object sender, EventArgs e) { CommandSave(); } private void toolStripButtonPointer_Click(object sender, EventArgs e) { CommandPointer(); } private void toolStripButtonRectangle_Click(object sender, EventArgs e) { CommandRectangle(); } private void toolStripButtonEllipse_Click(object sender, EventArgs e) { CommandEllipse(); } private void toolStripButtonLine_Click(object sender, EventArgs e) { CommandLine(); } private void toolStripButtonPencil_Click(object sender, EventArgs e) { CommandPolygon(); } private void toolStripButtonAbout_Click(object sender, EventArgs e) { CommandAbout(); } private void toolStripButtonUndo_Click(object sender, EventArgs e) { CommandUndo(); } private void toolStripButtonRedo_Click(object sender, EventArgs e) { CommandRedo(); } #endregion Toolbar Event Handlers #region Menu Event Handlers private void newToolStripMenuItem_Click(object sender, EventArgs e) { CommandNew(); } private void openToolStripMenuItem_Click(object sender, EventArgs e) { CommandOpen(); } private void saveToolStripMenuItem_Click(object sender, EventArgs e) { CommandSave(); } private void saveAsToolStripMenuItem_Click(object sender, EventArgs e) { CommandSaveAs(); } private void selectAllToolStripMenuItem_Click(object sender, EventArgs e) { this._panMode = false; drawArea.Panning = this._panMode; int x = drawArea.TheLayers.ActiveLayerIndex; drawArea.TheLayers[x].Graphics.SelectAll(); drawArea.Refresh(); } private void unselectAllToolStripMenuItem_Click(object sender, EventArgs e) { this._panMode = false; drawArea.Panning = this._panMode; int x = drawArea.TheLayers.ActiveLayerIndex; drawArea.TheLayers[x].Graphics.UnselectAll(); drawArea.Refresh(); } private void deleteToolStripMenuItem_Click(object sender, EventArgs e) { this._panMode = false; drawArea.Panning = this._panMode; int x = drawArea.TheLayers.ActiveLayerIndex; CommandDelete command = new CommandDelete(drawArea.TheLayers); if (drawArea.TheLayers[x].Graphics.DeleteSelection()) { drawArea.Refresh(); drawArea.AddCommandToHistory(command); } } private void deleteAllToolStripMenuItem_Click(object sender, EventArgs e) { this._panMode = false; drawArea.Panning = this._panMode; Clear(false); } private void Clear(bool clearHistory) { int x = drawArea.TheLayers.ActiveLayerIndex; CommandDeleteAll command = new CommandDeleteAll(drawArea.TheLayers); if (drawArea.TheLayers[x].Graphics.Clear()) { drawArea.Refresh(); drawArea.AddCommandToHistory(command); } if (clearHistory) { drawArea.ClearHistory(); } } private void moveToFrontToolStripMenuItem_Click(object sender, EventArgs e) { this._panMode = false; drawArea.Panning = this._panMode; int x = drawArea.TheLayers.ActiveLayerIndex; if (drawArea.TheLayers[x].Graphics.MoveSelectionToFront()) { drawArea.Refresh(); } } private void moveToBackToolStripMenuItem_Click(object sender, EventArgs e) { this._panMode = false; drawArea.Panning = this._panMode; int x = drawArea.TheLayers.ActiveLayerIndex; if (drawArea.TheLayers[x].Graphics.MoveSelectionToBack()) { drawArea.Refresh(); } } private void propertiesToolStripMenuItem_Click(object sender, EventArgs e) { //if (drawArea.GraphicsList.ShowPropertiesDialog(drawArea)) //{ // drawArea.SetDirty(); // drawArea.Refresh(); //} } private void pointerToolStripMenuItem_Click(object sender, EventArgs e) { CommandPointer(); } private void rectangleToolStripMenuItem_Click(object sender, EventArgs e) { CommandRectangle(); } private void ellipseToolStripMenuItem_Click(object sender, EventArgs e) { CommandEllipse(); } private void lineToolStripMenuItem_Click(object sender, EventArgs e) { CommandLine(); } private void pencilToolStripMenuItem_Click(object sender, EventArgs e) { CommandPolygon(); } private void aboutToolStripMenuItem_Click(object sender, EventArgs e) { CommandAbout(); } private void undoToolStripMenuItem_Click(object sender, EventArgs e) { CommandUndo(); } private void redoToolStripMenuItem_Click(object sender, EventArgs e) { CommandRedo(); } #endregion Menu Event Handlers #region DocManager Event Handlers /// /// Load document from the stream supplied by DocManager /// /// /// private void docManager_LoadEvent(object sender, SerializationEventArgs e) { // DocManager asks to load document from supplied stream try { drawArea.TheLayers = (Layers)e.Formatter.Deserialize(e.SerializationStream); } catch (ArgumentNullException ex) { HandleLoadException(ex, e); } catch (SerializationException ex) { HandleLoadException(ex, e); } catch (SecurityException ex) { HandleLoadException(ex, e); } } /// /// Save document to stream supplied by DocManager /// /// /// private void docManager_SaveEvent(object sender, SerializationEventArgs e) { // DocManager asks to save document to supplied stream try { e.Formatter.Serialize(e.SerializationStream, drawArea.TheLayers); } catch (ArgumentNullException ex) { HandleSaveException(ex, e); } catch (SerializationException ex) { HandleSaveException(ex, e); } catch (SecurityException ex) { HandleSaveException(ex, e); } } #endregion #region Event Handlers private void MainForm_Load(object sender, EventArgs e) { // Create draw area drawArea = new DrawArea(); drawArea.MyParent = this; drawArea.Location = new Point(0, 0); drawArea.Size = new Size(10, 10); drawArea.Owner = this; drawArea.BorderStyle = BorderStyle.None; this.pnlDrawArea.Controls.Add(drawArea); // Helper objects (DocManager and others) InitializeHelperObjects(); drawArea.Initialize(this, docManager, InitialImage, InitialImageAsFilePath, InitialImageAsPngBytes); ResizeDrawArea(); LoadSettings(); // Submit to Idle event to set controls state at idle time Application.Idle += delegate { if (!this._disposingOrDisposed) { this.ResizeDrawArea(); //if (drawArea.PanX != 0 && drawArea.PanY != 0) //{ // this.ManualScroll(true, -drawArea.PanX); // this.ManualScroll(false, -drawArea.PanY); // drawArea.PanX = 0; // drawArea.PanY = 0; //} SetStateOfControls(); //Debug.WriteLine("Idle");Debug.Flush(); } }; // Open file passed in the command line if (ArgumentFile.Length > 0) OpenDocument(ArgumentFile); // Subscribe to DropDownOpened event for each popup menu // (see details in MainForm_DropDownOpened) //foreach (ToolStripItem item in menuStrip1.Items) //{ // if (item.GetType() == // typeof(ToolStripMenuItem)) // { // ((ToolStripMenuItem)item).DropDownOpened += MainForm_DropDownOpened; // } //} SetStateOfControls(); } /// /// Resize draw area when form is resized /// private void MainForm_Resize(object sender, EventArgs e) { if (/*WindowState != FormWindowState.Minimized &&*/ drawArea != null) { ResizeDrawArea(); } } /// /// Form is closing /// private void MainForm_FormClosing(object sender, FormClosingEventArgs e) { if (e.CloseReason == CloseReason.UserClosing) { if (!docManager.CloseDocument()) e.Cancel = true; } SaveSettings(); } /// /// Popup menu item (File, Edit ...) is opened. /// /// /// private void MainForm_DropDownOpened(object sender, EventArgs e) { // Reset active tool to pointer. // This prevents bug in rare case when non-pointer tool is active, user opens // main main menu and after this clicks in the drawArea. MouseDown event is not // raised in this case (why ??), and MouseMove event works incorrectly. drawArea.ActiveTool = DrawArea.DrawToolType.Pointer; } #endregion Event Handlers #region Other Functions /// /// Set state of controls. /// Function is called at idle time. /// public void SetStateOfControls() { // Select active tool toolStripButtonPointer.Checked = !drawArea.Panning && (drawArea.ActiveTool == DrawArea.DrawToolType.Pointer); toolStripButtonRectangle.Checked = (drawArea.ActiveTool == DrawArea.DrawToolType.Rectangle); toolStripButtonEllipse.Checked = (drawArea.ActiveTool == DrawArea.DrawToolType.Ellipse); toolStripButtonArrow.Checked = drawArea.EndCap == LineCap.ArrowAnchor && (drawArea.ActiveTool == DrawArea.DrawToolType.Line); toolStripButtonLine.Checked = drawArea.EndCap != LineCap.ArrowAnchor &&(drawArea.ActiveTool == DrawArea.DrawToolType.Line); toolStripButtonPencil.Checked = (drawArea.ActiveTool == DrawArea.DrawToolType.Polygon); pointerToolStripMenuItem.Checked = (drawArea.ActiveTool == DrawArea.DrawToolType.Pointer); rectangleToolStripMenuItem.Checked = (drawArea.ActiveTool == DrawArea.DrawToolType.Rectangle); ellipseToolStripMenuItem.Checked = (drawArea.ActiveTool == DrawArea.DrawToolType.Ellipse); lineToolStripMenuItem.Checked = (drawArea.ActiveTool == DrawArea.DrawToolType.Line); pencilToolStripMenuItem.Checked = (drawArea.ActiveTool == DrawArea.DrawToolType.Polygon); switch (drawArea.LineWidth) { case -1: this.toolStripDropDownButtonLineThickness.Text = "Thinnest"; break; case 2: this.toolStripDropDownButtonLineThickness.Text = "Thin"; break; case 5: this.toolStripDropDownButtonLineThickness.Text = "Thick"; break; case 10: this.toolStripDropDownButtonLineThickness.Text = "Thicker"; break; case 15: this.toolStripDropDownButtonLineThickness.Text = "Thickest"; break; } this.toolStripDropDownButtonPenType.Text = DrawingPens.GetPenTypeAsString(drawArea.PenType); tsbLineColor.BackColor = drawArea.LineColor; tsbFillColor.BackColor = drawArea.FillColor; int x = drawArea.TheLayers.ActiveLayerIndex; bool objects = (drawArea.TheLayers[x].Graphics.Count > 0); bool selectedObjects = (drawArea.TheLayers[x].Graphics.SelectionCount > 0); // File operations saveToolStripMenuItem.Enabled = objects; //toolStripButtonSave.Enabled = objects; saveAsToolStripMenuItem.Enabled = objects; // Edit operations deleteToolStripMenuItem.Enabled = selectedObjects; deleteAllToolStripMenuItem.Enabled = objects; selectAllToolStripMenuItem.Enabled = objects; unselectAllToolStripMenuItem.Enabled = objects; moveToFrontToolStripMenuItem.Enabled = selectedObjects; moveToBackToolStripMenuItem.Enabled = selectedObjects; propertiesToolStripMenuItem.Enabled = selectedObjects; // Undo, Redo undoToolStripMenuItem.Enabled = drawArea.CanUndo; toolStripButtonUndo.Enabled = drawArea.CanUndo; redoToolStripMenuItem.Enabled = drawArea.CanRedo; toolStripButtonRedo.Enabled = drawArea.CanRedo; // Status Strip //tslCurrentLayer.Text = drawArea.TheLayers[x].LayerName; //tslNumberOfObjects.Text = drawArea.TheLayers[x].Graphics.Count.ToString(); //tslPanPosition.Text = drawArea.PanX + ", " + drawArea.PanY; //tslRotation.Text = drawArea.Rotation + " deg"; //tslZoomLevel.Text = (Math.Round(drawArea.Zoom * 100)) + " %"; // Pan button tsbPanMode.Checked = drawArea.Panning; } /// /// Set draw area to all form client space except toolbar /// private void ResizeDrawArea() { var bounds = drawArea.GetBounds(); //drawArea.Left = 0; //drawArea.Top = 0; drawArea.Width = Math.Max(this.pnlDrawArea.ClientRectangle.Width , (int)Math.Round((bounds.Left+ bounds.Width+10)*drawArea.Zoom)); drawArea.Height = Math.Max(this.pnlDrawArea.ClientRectangle.Height , (int)Math.Round((bounds.Top+bounds.Height+10)*drawArea.Zoom)); this.pnlDrawArea.Invalidate(); ; } /// /// Initialize helper objects from the DocToolkit Library. /// /// Called from Form1_Load. Initialized all objects except /// PersistWindowState wich must be initialized in the /// form constructor. /// private void InitializeHelperObjects() { //Excluded by F4CIO:------------------------------------------------------------------ //// DocManager //DocManagerData data = new DocManagerData(); //data.FormOwner = this.ParentForm; //data.UpdateTitle = true; //data.FileDialogFilter = "DrawTools files (*.dtl)|*.dtl|All Files (*.*)|*.*"; //data.NewDocName = "Untitled.dtl"; //data.RegistryPath = registryPath; //docManager = new DocManager(data); //docManager.RegisterFileType("dtl", "dtlfile", "DrawTools File"); //// Subscribe to DocManager events. //docManager.SaveEvent += docManager_SaveEvent; //docManager.LoadEvent += docManager_LoadEvent; //// Make "inline subscription" using anonymous methods. //docManager.OpenEvent += delegate(object sender, OpenFileEventArgs e) // { // // Update MRU List // if (e.Succeeded) // mruManager.Add(e.FileName); // else // mruManager.Remove(e.FileName); // }; //docManager.DocChangedEvent += delegate // { // drawArea.Refresh(); // drawArea.ClearHistory(); // }; //docManager.ClearEvent += delegate // { // bool haveObjects = false; // for (int i = 0; i < drawArea.TheLayers.Count; i++) // { // if (drawArea.TheLayers[i].Graphics.Count > 1) // { // haveObjects = true; // break; // } // } // if (haveObjects) // { // drawArea.TheLayers.Clear(); // drawArea.ClearHistory(); // drawArea.Refresh(); // } // }; //docManager.NewDocument(); // DragDropManager dragDropManager = new DragDropManager(this.ParentForm); dragDropManager.FileDroppedEvent += delegate(object sender, FileDroppedEventArgs e) { OpenDocument(e.FileArray.GetValue(0).ToString()); }; //Excluded by F4CIO:------------------------------------------------------------------- // MruManager //mruManager = new MruManager(); //mruManager.Initialize( // this.ParentForm, // owner form // recentFilesToolStripMenuItem, // Recent Files menu item // fileToolStripMenuItem, // parent // registryPath); // Registry path to keep MRU list //mruManager.MruOpenEvent += delegate(object sender, MruFileOpenEventArgs e) { OpenDocument(e.FileName); }; } /// /// Handle exception from docManager_LoadEvent function /// /// /// private void HandleLoadException(Exception ex, SerializationEventArgs e) { MessageBox.Show(this, "Open File operation failed. File name: " + e.FileName + "\n" + "Reason: " + ex.Message, Application.ProductName); e.Error = true; } /// /// Handle exception from docManager_SaveEvent function /// /// /// private void HandleSaveException(Exception ex, SerializationEventArgs e) { MessageBox.Show(this, "Save File operation failed. File name: " + e.FileName + "\n" + "Reason: " + ex.Message, Application.ProductName); e.Error = true; } /// /// Open document. /// Used to open file passed in command line or dropped into the window /// /// public void OpenDocument(string file) { this._panMode = false; drawArea.Panning = this._panMode; docManager.OpenDocument(file); } /// /// Load application settings /// private void LoadSettings() { } /// /// Save application settings /// private void SaveSettings() { } /// /// Set Pointer draw tool /// private void CommandPointer() { drawArea.ActiveTool = DrawArea.DrawToolType.Pointer; this._panMode = false; drawArea.Panning = this._panMode; } /// /// Set Rectangle draw tool /// private void CommandRectangle() { drawArea.ActiveTool = DrawArea.DrawToolType.Rectangle; drawArea.DrawFilled = false; drawArea.EndCap = LineCap.Round; this._panMode = false; drawArea.Panning = this._panMode; } /// /// Set Ellipse draw tool /// private void CommandEllipse() { drawArea.ActiveTool = DrawArea.DrawToolType.Ellipse; drawArea.DrawFilled = false; drawArea.EndCap = LineCap.Round; this._panMode = false; drawArea.Panning = this._panMode; } /// /// Set Arrow Line draw tool /// private void CommandArrow() { drawArea.ActiveTool = DrawArea.DrawToolType.Line; drawArea.EndCap = LineCap.ArrowAnchor; this._panMode = false; drawArea.Panning = this._panMode; } /// /// Set Line draw tool /// private void CommandLine() { drawArea.ActiveTool = DrawArea.DrawToolType.Line; drawArea.EndCap = LineCap.Round; this._panMode = false; drawArea.Panning = this._panMode; } /// /// Set Polygon draw tool /// private void CommandPolygon() { drawArea.ActiveTool = DrawArea.DrawToolType.Polygon; drawArea.EndCap = LineCap.Round; this._panMode = false; drawArea.Panning = this._panMode; } /// /// Show About dialog /// private void CommandAbout() { FrmAbout frm = new FrmAbout(); frm.ShowDialog(this); } /// /// Open new file /// private void CommandNew() { this._panMode = false; drawArea.Panning = this._panMode; docManager.NewDocument(); } /// /// Open file /// private void CommandOpen() { this._panMode = false; drawArea.Panning = this._panMode; docManager.OpenDocument(""); } /// /// Save file /// private void CommandSave() { this._panMode = false; drawArea.Panning = this._panMode; docManager.SaveDocument(DocManager.SaveType.Save); } /// /// Save As /// private void CommandSaveAs() { this._panMode = false; drawArea.Panning = this._panMode; docManager.SaveDocument(DocManager.SaveType.SaveAs); } /// /// Undo /// private void CommandUndo() { drawArea.Undo(); } /// /// Redo /// private void CommandRedo() { drawArea.Redo(); } #endregion #region Mouse Functions private void MainForm_MouseWheel(object sender, MouseEventArgs e) { if (e.Delta != 0) { if (_zoomOnMouseWheel) { ((HandledMouseEventArgs)e).Handled = true; } if (_controlKey) { // We are panning up or down using the wheel if (e.Delta > 0) this.ManualScroll(false, 10); else this.ManualScroll(false,-10); Invalidate(); } else { if (_zoomOnMouseWheel) { // We are zooming in or out using the wheel if (e.Delta > 0) AdjustZoom(.1f); else AdjustZoom(-.1f); } } SetStateOfControls(); return; } } #endregion Mouse Functions #region Keyboard Functions private void MainForm_KeyDown(object sender, KeyEventArgs e) { int al = drawArea.TheLayers.ActiveLayerIndex; switch (e.KeyCode) { case Keys.Delete: drawArea.TheLayers[al].Graphics.DeleteSelection(); drawArea.Invalidate(); break; case Keys.Right: this.ManualScroll(true,-10); drawArea.Invalidate(); break; case Keys.Left: this.ManualScroll(true,+10); drawArea.Invalidate(); break; case Keys.Up: if (e.KeyCode == Keys.Up && e.Shift) AdjustZoom(.1f); else drawArea.PanY += 10; drawArea.Invalidate(); break; case Keys.Down: if (e.KeyCode == Keys.Down && e.Shift) AdjustZoom(-.1f); else drawArea.PanY -= 10; drawArea.Invalidate(); break; case Keys.ControlKey: _controlKey = true; break; default: break; } drawArea.Invalidate(); SetStateOfControls(); } private void MainForm_KeyUp(object sender, KeyEventArgs e) { _controlKey = false; } #endregion Keyboard Functions #region Zoom, Pan, Rotation Functions /// /// Adjust the zoom by the amount given, within reason /// /// float value to adjust zoom by - may be positive or negative private void AdjustZoom(float _amount) { drawArea.Zoom += _amount; if (drawArea.Zoom < .1f) drawArea.Zoom = .1f; if (drawArea.Zoom > 10) drawArea.Zoom = 10f; drawArea.Invalidate(); SetStateOfControls(); } private void tsbZoomIn_Click(object sender, EventArgs e) { AdjustZoom(.1f); } private void tsbZoomOut_Click(object sender, EventArgs e) { AdjustZoom(-.1f); } private void tsbZoomReset_Click(object sender, EventArgs e) { drawArea.Zoom = 1.0f; drawArea.Invalidate(); } private void tsbRotateRight_Click(object sender, EventArgs e) { this._panMode = false; drawArea.Panning = this._panMode; int al = drawArea.TheLayers.ActiveLayerIndex; if (drawArea.TheLayers[al].Graphics.SelectionCount > 0) RotateObject(10); else RotateDrawing(10); } private void tsbRotateLeft_Click(object sender, EventArgs e) { this._panMode = false; drawArea.Panning = this._panMode; int al = drawArea.TheLayers.ActiveLayerIndex; if (drawArea.TheLayers[al].Graphics.SelectionCount > 0) RotateObject(-10); else RotateDrawing(-10); } private void tsbRotateReset_Click(object sender, EventArgs e) { this._panMode = false; drawArea.Panning = this._panMode; int al = drawArea.TheLayers.ActiveLayerIndex; if (drawArea.TheLayers[al].Graphics.SelectionCount > 0) RotateObject(0); else RotateDrawing(0); } /// /// Rotate the selected Object(s) /// /// Amount to rotate. Negative is Left, Positive is Right, Zero indicates Reset to zero private void RotateObject(int p) { int al = drawArea.TheLayers.ActiveLayerIndex; for (int i = 0; i < drawArea.TheLayers[al].Graphics.Count; i++) { if (drawArea.TheLayers[al].Graphics[i].Selected) if (p == 0) drawArea.TheLayers[al].Graphics[i].Rotation = 0; else drawArea.TheLayers[al].Graphics[i].Rotation += p; } this._panMode = false; drawArea.Panning = this._panMode; drawArea.Invalidate(); SetStateOfControls(); } /// /// Rotate the entire drawing /// /// Amount to rotate. Negative is Left, Positive is Right, Zero indicates Reset to zero private void RotateDrawing(int p) { if (p == 0) drawArea.Rotation = 0; else { drawArea.Rotation += p; if (p < 0) // Left Rotation { if (drawArea.Rotation < -360) drawArea.Rotation = 0; } else { if (drawArea.Rotation > 360) drawArea.Rotation = 0; } } this._panMode = false; drawArea.Panning = this._panMode; drawArea.Invalidate(); SetStateOfControls(); } private void tsbPanMode_Click(object sender, EventArgs e) { _panMode = true;//!_panMode; if (_panMode) { tsbPanMode.Checked = true; } else { tsbPanMode.Checked = false; } drawArea.ActiveTool = DrawArea.DrawToolType.Pointer; drawArea.Panning = _panMode; } private void tsbPanReset_Click(object sender, EventArgs e) { _panMode = false; if (tsbPanMode.Checked) tsbPanMode.Checked = false; drawArea.Panning = false; drawArea.PanX = 0; drawArea.PanY = drawArea.OriginalPanY; drawArea.Invalidate(); } #endregion Zoom, Pan, Rotation Functions private void tslCurrentLayer_Click(object sender, EventArgs e) { LayerDialog ld = new LayerDialog(drawArea.TheLayers); ld.ShowDialog(); // First add any new layers for (int i = 0; i < ld.layerList.Count; i++) { if (ld.layerList[i].LayerNew) { Layer layer = new Layer(); layer.LayerName = ld.layerList[i].LayerName; layer.Graphics = new GraphicsList(); drawArea.TheLayers.Add(layer); } } drawArea.TheLayers.InactivateAllLayers(); for (int i = 0; i < ld.layerList.Count; i++) { if (ld.layerList[i].LayerActive) drawArea.TheLayers.SetActiveLayer(i); if (ld.layerList[i].LayerVisible) drawArea.TheLayers.MakeLayerVisible(i); else drawArea.TheLayers.MakeLayerInvisible(i); drawArea.TheLayers[i].LayerName = ld.layerList[i].LayerName; } // Lastly, remove any deleted layers for (int i = 0; i < ld.layerList.Count; i++) { if (ld.layerList[i].LayerDeleted) drawArea.TheLayers.RemoveLayer(i); } drawArea.Invalidate(); } #region Additional Drawing Tools /// /// Draw PolyLine objects - a polyline is a series of straight lines of various lengths connected at their end points. /// /// /// private void tsbPolyLine_Click(object sender, EventArgs e) { drawArea.ActiveTool = DrawArea.DrawToolType.PolyLine; drawArea.DrawFilled = false; this._panMode = false; drawArea.Panning = this._panMode; } private void tsbConnector_Click(object sender, EventArgs e) { drawArea.ActiveTool = DrawArea.DrawToolType.Connector; drawArea.DrawFilled = false; this._panMode = false; drawArea.Panning = this._panMode; } /// /// Draw Text objects /// /// /// private void tsbDrawText_Click(object sender, EventArgs e) { drawArea.ActiveTool = DrawArea.DrawToolType.Text; this._panMode = false; drawArea.Panning = this._panMode; } private void tsbFilledRectangle_Click(object sender, EventArgs e) { drawArea.ActiveTool = DrawArea.DrawToolType.Rectangle; drawArea.DrawFilled = true; drawArea.EndCap = LineCap.Round; this._panMode = false; drawArea.Panning = this._panMode; } private void tsbFilledEllipse_Click(object sender, EventArgs e) { drawArea.ActiveTool = DrawArea.DrawToolType.Ellipse; drawArea.DrawFilled = true; drawArea.EndCap = LineCap.Round; this._panMode = false; drawArea.Panning = this._panMode; } private void tsbImage_Click(object sender, EventArgs e) { drawArea.ActiveTool = DrawArea.DrawToolType.Image; drawArea.EndCap = LineCap.Round; this._panMode = false; drawArea.Panning = this._panMode; } private void tsbSelectLineColor_Click(object sender, EventArgs e) { dlgColor.AllowFullOpen = true; dlgColor.AnyColor = true; if (dlgColor.ShowDialog() == DialogResult.OK) { drawArea.LineColor = Color.FromArgb(255, dlgColor.Color); tsbLineColor.BackColor = Color.FromArgb(255, dlgColor.Color); this._panMode = false; drawArea.Panning = this._panMode; } } private void tsbSelectFillColor_Click(object sender, EventArgs e) { dlgColor.AllowFullOpen = true; dlgColor.AnyColor = true; if (dlgColor.ShowDialog() == DialogResult.OK) { drawArea.FillColor = Color.FromArgb(255, dlgColor.Color); tsbFillColor.BackColor = Color.FromArgb(255, dlgColor.Color); this._panMode = false; drawArea.Panning = this._panMode; } } private void tsbLineThinnest_Click(object sender, EventArgs e) { drawArea.LineWidth = -1; this._panMode = false; drawArea.Panning = this._panMode; } private void tsbLineThin_Click(object sender, EventArgs e) { drawArea.LineWidth = 2; this._panMode = false; drawArea.Panning = this._panMode; } private void tsbThickLine_Click(object sender, EventArgs e) { drawArea.LineWidth = 5; this._panMode = false; drawArea.Panning = this._panMode; } private void tsbThickerLine_Click(object sender, EventArgs e) { drawArea.LineWidth = 10; this._panMode = false; drawArea.Panning = this._panMode; } private void tsbThickestLine_Click(object sender, EventArgs e) { drawArea.LineWidth = 15; this._panMode = false; drawArea.Panning = this._panMode; } #endregion Additional Drawing Tools public void ExportToFile(string filePath, ImageFormat imageFormat) { using (Bitmap b = new Bitmap(drawArea.Width, drawArea.Height)) { using (Graphics g = Graphics.FromImage(b)) { g.Clear(Color.White); drawArea.DeselectAll(); drawArea.TheLayers.Draw(g); b.Save(filePath, imageFormat); } } } public byte[] ExportBytes(ImageFormat imageFormat) { using (MemoryStream m = new MemoryStream()) { using (Bitmap b = new Bitmap(drawArea.Width, drawArea.Height)) { using (Graphics g = Graphics.FromImage(b)) { g.Clear(Color.White); drawArea.DeselectAll(); drawArea.TheLayers.Draw(g); b.Save(m, imageFormat); } } return m.ToArray(); } } public Image ExportToImage() { Bitmap b = new Bitmap(drawArea.Width, drawArea.Height); Graphics g = Graphics.FromImage(b); g.Clear(Color.White); drawArea.DeselectAll(); drawArea.TheLayers.Draw(g); return b; } private void exportToolStripMenuItem_Click(object sender, EventArgs e) { Bitmap b = new Bitmap(drawArea.Width, drawArea.Height); Graphics g = Graphics.FromImage(b); g.Clear(Color.White); drawArea.TheLayers.Draw(g); b.Save(@"c:\test.bmp", ImageFormat.Bmp); MessageBox.Show("save complete!"); g.Dispose(); b.Dispose(); } public void CopyAllToClipboard() { using (Image image = this.ExportToImage()) { Clipboard.SetDataObject(image, true); //Application.DoEvents(); //Thread.Sleep(500); using (RichTextBox tempRtb = new RichTextBox()) { tempRtb.WordWrap = false; tempRtb.Paste(); Application.DoEvents(); Thread.Sleep(500); tempRtb.SelectAll(); tempRtb.Copy(); Application.DoEvents(); Thread.Sleep(500); } } } private void cutToolStripMenuItem_Click(object sender, EventArgs e) { drawArea.CutObject(); } private void solidToolStripMenuItem_Click(object sender, EventArgs e) { drawArea.PenType = DrawingPens.PenType.Solid; this._panMode = false; drawArea.Panning = this._panMode; } private void dottedToolStripMenuItem_Click(object sender, EventArgs e) { drawArea.PenType = DrawingPens.PenType.Dot; this._panMode = false; drawArea.Panning = this._panMode; } private void dashedToolStripMenuItem_Click(object sender, EventArgs e) { drawArea.PenType = DrawingPens.PenType.Dash; this._panMode = false; drawArea.Panning = this._panMode; } private void dotDashedtoolStripMenuItem7_Click(object sender, EventArgs e) { drawArea.PenType = DrawingPens.PenType.Dash_Dot; this._panMode = false; drawArea.Panning = this._panMode; } private void doubleLineToolStripMenuItem8_Click(object sender, EventArgs e) { drawArea.PenType = DrawingPens.PenType.DoubleLine; this._panMode = false; drawArea.Panning = this._panMode; } private void toolStripButtonArrow_Click(object sender, EventArgs e) { CommandArrow(); } private void ctxtMenu_Opening(object sender, System.ComponentModel.CancelEventArgs e) { this.undoToolStripMenuItem2.Enabled = drawArea.CanUndo; this.toolStripMenuItem13.Enabled = drawArea.CanRedo; } /// /// Clears graphics and history and reloads initial image if present. /// public void Reset() { this.Clear(true); drawArea.LoadInitialImage(InitialImage, InitialImageAsFilePath, InitialImageAsPngBytes, null); } private void pnlDrawArea_Scroll(object sender, ScrollEventArgs e) { //if (this._zoomOnMouseWheel) //{ // e.NewValue = e.OldValue; //} } internal void ManualScroll(bool isHorizontal, int delta) { this.ResizeDrawArea(); int newValue; if (isHorizontal) { newValue = this.pnlDrawArea.HorizontalScroll.Value + delta; newValue = Math.Max(this.pnlDrawArea.HorizontalScroll.Minimum, newValue); newValue = Math.Min(this.pnlDrawArea.HorizontalScroll.Maximum, newValue); this.pnlDrawArea.HorizontalScroll.Value = newValue; } else { newValue = this.pnlDrawArea.VerticalScroll.Value + delta; newValue = Math.Max(this.pnlDrawArea.VerticalScroll.Minimum, newValue); newValue = Math.Min(this.pnlDrawArea.VerticalScroll.Maximum, newValue); this.pnlDrawArea.VerticalScroll.Value = newValue; } this.pnlDrawArea.Invalidate(); } public void ReplaceInitialImage(Image image, bool preserveSize, bool addNewIfNotFound) { this.InitialImageAsFilePath = null; this.InitialImageAsPngBytes = null; this.InitialImage = image; //CommandDelete command = new CommandDelete(drawArea.TheLayers); var indexAndInitialImage = drawArea.GetInitialImageGraphic(); if (indexAndInitialImage != null) { if (!preserveSize) { indexAndInitialImage.Value.Value.rectangle.Width = image.Width; indexAndInitialImage.Value.Value.rectangle.Height = image.Height; } //TODO: compress theImage here indexAndInitialImage.Value.Value.TheImage = (Bitmap) image; drawArea.Invalidate(); //drawArea.TheLayers[0].Graphics.RemoveAt(indexAndInitialImage.Value.Key); //drawArea.Refresh(); //drawArea.AddCommandToHistory(command); } else { if (addNewIfNotFound) { drawArea.LoadInitialImage(InitialImage, InitialImageAsFilePath, InitialImageAsPngBytes, null); } } // drawArea.LoadInitialImage(this.InitialImage, null, null, indexAndInitialImage==null?null:indexAndInitialImage.Value.Value.Clone() as DrawImage); } } }