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 } }