using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;
using System.Diagnostics;
using DocToolkit;
namespace DrawTools
{
#region Enumerations
public enum DrawToolType
{
Pointer,
Rectangle,
Ellipse,
Line,
Polygon,
NumberOfDrawTools
};
#endregion
/// <summary>
/// Working area.
/// Handles mouse input and draws graphics objects.
/// </summary>
public class DrawArea : System.Windows.Forms.UserControl
{
private IContainer components;
#region Constructor, Dispose
public DrawArea()
{
// This call is required by the Windows.Forms Form Designer.
InitializeComponent();
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#endregion
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.contextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
this.selectAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.unSelectAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.deleteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.deleteAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
this.moveToFrontToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.moveToBackToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
this.contextMenuStrip.SuspendLayout();
this.SuspendLayout();
//
// contextMenuStrip
//
this.contextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.selectAllToolStripMenuItem,
this.unSelectAllToolStripMenuItem,
this.deleteToolStripMenuItem,
this.deleteAllToolStripMenuItem,
this.toolStripSeparator1,
this.moveToFrontToolStripMenuItem,
this.moveToBackToolStripMenuItem,
this.toolStripSeparator2});
this.contextMenuStrip.Name = "contextMenuStrip";
this.contextMenuStrip.Size = new System.Drawing.Size(153, 170);
//
// selectAllToolStripMenuItem
//
this.selectAllToolStripMenuItem.Name = "selectAllToolStripMenuItem";
this.selectAllToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
this.selectAllToolStripMenuItem.Text = "Select All";
this.selectAllToolStripMenuItem.Click += new System.EventHandler(this.selectAllToolStripMenuItem_Click);
//
// unSelectAllToolStripMenuItem
//
this.unSelectAllToolStripMenuItem.Name = "unSelectAllToolStripMenuItem";
this.unSelectAllToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
this.unSelectAllToolStripMenuItem.Text = "Unselect All";
this.unSelectAllToolStripMenuItem.Click += new System.EventHandler(this.unSelectAllToolStripMenuItem_Click);
//
// deleteToolStripMenuItem
//
this.deleteToolStripMenuItem.Name = "deleteToolStripMenuItem";
this.deleteToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
this.deleteToolStripMenuItem.Text = "Delete";
this.deleteToolStripMenuItem.Click += new System.EventHandler(this.deleteToolStripMenuItem_Click);
//
// deleteAllToolStripMenuItem
//
this.deleteAllToolStripMenuItem.Name = "deleteAllToolStripMenuItem";
this.deleteAllToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
this.deleteAllToolStripMenuItem.Text = "Delete All";
this.deleteAllToolStripMenuItem.Click += new System.EventHandler(this.deleteAllToolStripMenuItem_Click);
//
// toolStripSeparator1
//
this.toolStripSeparator1.Name = "toolStripSeparator1";
this.toolStripSeparator1.Size = new System.Drawing.Size(149, 6);
//
// moveToFrontToolStripMenuItem
//
this.moveToFrontToolStripMenuItem.Name = "moveToFrontToolStripMenuItem";
this.moveToFrontToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
this.moveToFrontToolStripMenuItem.Text = "Move to Front";
this.moveToFrontToolStripMenuItem.Click += new System.EventHandler(this.moveToFrontToolStripMenuItem_Click);
//
// moveToBackToolStripMenuItem
//
this.moveToBackToolStripMenuItem.Name = "moveToBackToolStripMenuItem";
this.moveToBackToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
this.moveToBackToolStripMenuItem.Text = "Move to Back";
this.moveToBackToolStripMenuItem.Click += new System.EventHandler(this.moveToBackToolStripMenuItem_Click);
//
// toolStripSeparator2
//
this.toolStripSeparator2.Name = "toolStripSeparator2";
this.toolStripSeparator2.Size = new System.Drawing.Size(149, 6);
//
// DrawArea
//
this.Name = "DrawArea";
this.Size = new System.Drawing.Size(660, 233);
this.Paint += new System.Windows.Forms.PaintEventHandler(this.DrawArea_Paint);
this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.DrawArea_KeyDown);
this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.DrawArea_MouseDown);
this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.DrawArea_MouseMove);
this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.DrawArea_MouseUp);
this.contextMenuStrip.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
#region Members
private GraphicsList graphicsList; // list of draw objects
// (instances of DrawObject-derived classes)
private DrawToolType activeTool; // active drawing tool
private Tool[] tools; // array of tools
// group selection rectangle
private Rectangle netRectangle;
private bool drawNetRectangle = false;
private ContextMenuStrip contextMenuStrip;
private ToolStripMenuItem selectAllToolStripMenuItem;
private ToolStripMenuItem unSelectAllToolStripMenuItem;
private ToolStripMenuItem deleteToolStripMenuItem;
private ToolStripMenuItem deleteAllToolStripMenuItem;
private ToolStripSeparator toolStripSeparator1;
private ToolStripMenuItem moveToFrontToolStripMenuItem;
private ToolStripMenuItem moveToBackToolStripMenuItem;
private ToolStripSeparator toolStripSeparator2;
private DocManager docManager;
#endregion
#region Properties
/// <summary>
/// Reference to DocManager
/// </summary>
public DocManager DocManager
{
get
{
return docManager;
}
set
{
docManager = value;
}
}
/// <summary>
/// Group selection rectangle. Used for drawing.
/// </summary>
public Rectangle NetRectangle
{
get
{
return netRectangle;
}
set
{
netRectangle = value;
}
}
/// <summary>
/// Flas is set to true if group selection rectangle should be drawn.
/// </summary>
public bool DrawNetRectangle
{
get
{
return drawNetRectangle;
}
set
{
drawNetRectangle = value;
}
}
/// <summary>
/// Active drawing tool.
/// </summary>
public DrawToolType ActiveTool
{
get
{
return activeTool;
}
set
{
activeTool = value;
}
}
/// <summary>
/// List of graphics objects.
/// </summary>
public GraphicsList GraphicsList
{
get
{
return graphicsList;
}
set
{
graphicsList = value;
}
}
#endregion
#region Event Handlers
/// <summary>
/// Draw graphic objects and
/// group selection rectangle (optionally)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DrawArea_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
SolidBrush brush = new SolidBrush(Color.FromArgb(255, 255, 255));
e.Graphics.FillRectangle(brush,
this.ClientRectangle);
if ( graphicsList != null )
{
graphicsList.Draw(e.Graphics);
}
DrawNetSelection(e.Graphics);
brush.Dispose();
}
/// <summary>
/// Mouse down.
/// Left button down event is passed to active tool.
/// Right button down event is handled in this class.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DrawArea_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
if ( e.Button == MouseButtons.Left )
tools[(int)activeTool].OnMouseDown(this, e);
else if ( e.Button == MouseButtons.Right )
OnContextMenu(e);
}
/// <summary>
/// Mouse move.
/// Moving without button pressed or with left button pressed
/// is passed to active tool.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DrawArea_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (e.Button == MouseButtons.Left || e.Button == MouseButtons.None)
{
Point point=new Point(e.X,e.Y);
if ((point.X > this.DisplayRectangle.X) && (point.X < this.DisplayRectangle.Right))
{
if ((point.Y > this.DisplayRectangle.Y) && (point.Y < this.DisplayRectangle.Bottom))
{
tools[(int)activeTool].OnMouseMove(this, e);
}
}
}
else
this.Cursor = Cursors.Default;
}
/// <summary>
/// Mouse up event.
/// Left button up event is passed to active tool.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DrawArea_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
{
if ( e.Button == MouseButtons.Left )
tools[(int)activeTool].OnMouseUp(this, e);
}
#endregion
#region Other Functions
/// <summary>
/// Initialization
/// </summary>
/// <param name="owner"></param>
/// <param name="docManager"></param>
public void Initialize( DocManager docManager)
{
SetStyle(ControlStyles.AllPaintingInWmPaint |
ControlStyles.UserPaint | ControlStyles.DoubleBuffer, true);
// Keep reference to owner form
this.DocManager = docManager;
// create list of graphic objects
graphicsList = new GraphicsList();
// create array of drawing tools
tools = new Tool[(int)DrawToolType.NumberOfDrawTools];
tools[(int)DrawToolType.Pointer] = new ToolPointer();
tools[(int)DrawToolType.Rectangle] = new ToolRectangle();
tools[(int)DrawToolType.Ellipse] = new ToolEllipse();
tools[(int)DrawToolType.Line] = new ToolLine();
tools[(int)DrawToolType.Polygon] = new ToolPolygon();
}
/// <summary>
/// Set dirty flag (file is changed after last save operation)
/// </summary>
public void SetDirty()
{
DocManager.Dirty = true;
}
/// <summary>
/// Draw group selection rectangle
/// </summary>
/// <param name="g"></param>
public void DrawNetSelection(Graphics g)
{
if ( ! DrawNetRectangle )
return;
ControlPaint.DrawFocusRectangle(g, NetRectangle, Color.Black, Color.Transparent);
}
/// <summary>
/// Right-click handler
/// </summary>
/// <param name="e"></param>
private void OnContextMenu(MouseEventArgs e)
{
// Change current selection if necessary
Point point = new Point(e.X, e.Y);
int n = GraphicsList.Count;
DrawObject o = null;
for ( int i = 0; i < n; i++ )
{
if ( GraphicsList[i].HitTest(point) == 0 )
{
o = GraphicsList[i];
break;
}
}
if ( o != null )
{
if ( ! o.Selected )
GraphicsList.UnselectAll();
// Select clicked object
o.Selected = true;
unSelectAllToolStripMenuItem.Enabled = true;
deleteToolStripMenuItem.Enabled = true;
moveToFrontToolStripMenuItem.Enabled = true;
moveToBackToolStripMenuItem.Enabled = true;
}
else
{
GraphicsList.UnselectAll();
unSelectAllToolStripMenuItem.Enabled = false;
deleteToolStripMenuItem.Enabled = false;
moveToFrontToolStripMenuItem.Enabled = false;
moveToBackToolStripMenuItem.Enabled = false;
}
Refresh();
// Show context menu.
contextMenuStrip.Show(point);
}
#endregion
#region Context Menu
private void selectAllToolStripMenuItem_Click(object sender, EventArgs e)
{
GraphicsList.SelectAll();
Refresh();
}
private void unSelectAllToolStripMenuItem_Click(object sender, EventArgs e)
{
GraphicsList.UnselectAll();
Refresh();
}
private void deleteToolStripMenuItem_Click(object sender, EventArgs e)
{
if (GraphicsList.DeleteSelection())
{
SetDirty();
Refresh();
}
}
private void deleteAllToolStripMenuItem_Click(object sender, EventArgs e)
{
if (GraphicsList.Clear())
{
SetDirty();
Refresh();
}
}
private void moveToFrontToolStripMenuItem_Click(object sender, EventArgs e)
{
if (GraphicsList.MoveSelectionToFront())
{
SetDirty();
Refresh();
}
}
private void moveToBackToolStripMenuItem_Click(object sender, EventArgs e)
{
if (GraphicsList.MoveSelectionToBack())
{
SetDirty();
Refresh();
}
}
#endregion
private void DrawArea_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Delete)
{
if (GraphicsList.DeleteSelection())
{
SetDirty();
Refresh();
}
}
}
}
}