using System;
using System.Collections.Generic;
using System.Windows.Forms;
using JD.Kernel.StaticHelpers;
using JD.Sequencers.Controls;
namespace JD.Sequencers.Tools
{
///
/// Manages the tools for a
///
public class ToolManager
{
#region Variables
private readonly WindowlessContainer m_container;
private Tool m_currentTool;
private readonly List m_mouseDownTools = new List();
private readonly List m_mouseMoveTools = new List();
private readonly List m_mouseUpTools = new List();
private readonly List m_mouseWheelTools = new List();
#endregion
#region Constructor
///
/// Constructor.
///
public ToolManager(WindowlessContainer container)
{
Throw.IfNull(container, "container");
m_container = container;
}
#endregion
#region Properties
public WindowlessContainer Container
{
get { return m_container; }
}
///
/// The current tool.
///
public Tool CurrentTool
{
get { return m_currentTool; }
set
{
if (m_currentTool != value)
{
if (m_currentTool != null)
{
m_currentTool.End();
}
m_currentTool = value;
if (m_currentTool != null)
{
m_currentTool.Start();
}
OnCurrentToolChanged(EventArgs.Empty);
}
}
}
#region Mouse Tools
///
/// Mouse Down Tools
///
public IList MouseDownTools
{
get
{
return m_mouseDownTools;
}
}
///
/// Mouse Move Tools
///
public IList MouseMoveTools
{
get
{
return m_mouseMoveTools;
}
}
///
/// Mouse Up Tools
///
public IList MouseUpTools
{
get
{
return m_mouseUpTools;
}
}
///
/// Mouse Wheel Tools
///
public IList MouseWheelTools
{
get
{
return m_mouseWheelTools;
}
}
#endregion
#endregion
#region Methods
public void OnMouseDown(MouseEventArgs e)
{
StartToolIfPossible(MouseDownTools, e);
if (CurrentTool != null)
{
CurrentTool.OnMouseDown(e);
}
}
public void OnMouseUp(MouseEventArgs e)
{
StartToolIfPossible(MouseUpTools, e);
if (CurrentTool != null)
{
CurrentTool.OnMouseUp(e);
}
}
public void OnMouseMove(MouseEventArgs e)
{
if (CurrentTool != null)
{
CurrentTool.OnMouseMove(e);
}
else
{
StartToolIfPossible(MouseMoveTools, e);
}
}
public void OnMouseWheel(MouseEventArgs e)
{
StartToolIfPossible(MouseWheelTools, e);
if (CurrentTool != null)
{
CurrentTool.OnMouseWheel(e);
}
}
private void StartToolIfPossible(IEnumerable tools, MouseEventArgs e)
{
foreach (Tool tool in tools)
{
var eventArgs = new ToolStartingEventArgs(e);
bool canStart = tool.CanStart(eventArgs);
if (eventArgs.CancelEntireEvent)
{
return;
}
if (canStart)
{
CurrentTool = tool;
return;
}
}
}
#endregion
#region Events
///
/// Triggered when the changes.
///
public event EventHandler CurrentToolChanged;
///
/// Triggers the event.
///
/// Event Args.
protected void OnCurrentToolChanged(EventArgs e)
{
CurrentToolChanged?.Invoke(Container, e);
}
#endregion
}
}