// ---------------------------------------- // constructor // ---------------------------------------- public MouseOperatableEventDispatcher(Func <Point, IMouseOperatable> targetFinder, Control control) { _targetFinder = targetFinder; _control = control; _dragSourceEventProcessor = new DragSourceEventProcessor(); _dndEventProcessor = new MouseOperatableDnDProcessor(); _target = null; _lastTarget = null; _lastDragOverTarget = null; _dragOverIsStarted = false; _dragOutToBeCanceledOnQueryContinueDrag = false; _dragOutCanceledOnQueryContinueDrag = false; _hoverOnTimer = new Timer(); _hoverOnTimer.Interval = SystemInformation.MouseHoverTime; _hoverOnTimer.Tick += (se, ev) => { _lastHovered = _hoverOnTimer.Tag as IMouseOperatable; var hoverEventArgs = new MouseHoverEventArgs(_lastMouseMoveEventArgs); if (_lastHovered != null) { _lastHovered.HandleMouseHover(hoverEventArgs); } if (hoverEventArgs.ResetHover) { _lastHovered = null; } _hoverOnTimer.Stop(); }; }
public bool HandleDragOver(DragEventArgs e) { if (_dndEventProcessor.IsPaused) { _dragOutToBeCanceledOnQueryContinueDrag = true; return(true); } var pt = new Point(e.X, e.Y); var target = _targetFinder(pt); if (target != null) { var dragTarget = target.DragTarget as DragTarget; /// drag overのターゲットが変わったとき if (target != _lastDragOverTarget) { if (_lastDragOverTarget != null) { var lastDragTarget = _lastDragOverTarget.DragTarget as DragTarget; lastDragTarget.HandleDragLeave(lastDragTarget, e); } //if (dragTarget != null && dragTarget.SupportedFormats.ContainsAny(e.Data.GetFormats())) { if (dragTarget != null) { dragTarget.HandleDragEnter(dragTarget, e); _lastDragOverTarget = target; _dragOverIsStarted = true; } else { _lastDragOverTarget = null; _dragOverIsStarted = false; e.Effect = DragDropEffects.None; } } if (dragTarget != null) { dragTarget.HandleDragOver(dragTarget, e); } return(true); } else { /// drag overのターゲットがなくなったとき if (_lastDragOverTarget != null) { var lastDragTarget = _lastDragOverTarget.DragTarget as DragTarget; lastDragTarget.HandleDragLeave(lastDragTarget, e); _lastDragOverTarget = null; _dragOverIsStarted = false; e.Effect = DragDropEffects.None; } return(false); } }
public void ClearDnDState() { _isPrepared = false; _isStarted = false; _isPaused = false; _target = null; _dragStartMouseEventArgs = null; }
public void ForwardMouseEvents(IMouseOperatable mouseOperatable) { if (mouseOperatable == null || _MouseEventsToForwards.Contains(mouseOperatable)) { return; } _MouseEventsToForwards.Add(mouseOperatable); }
// ---------------------------------------- // method // ---------------------------------------- public bool HandleMouseMove(MouseEventArgs e) { var target = _targetFinder(e.Location); var ret = false; if (target != null) { if (target != _lastTarget) { /// targetが変わった場合 if (_lastTarget != null) { _lastTarget.HandleMouseLeave(); } target.HandleMouseEnter(); _lastTarget = target; _lastHovered = null; _hoverOnTimer.Tag = target; _hoverOnTimer.Stop(); _hoverOnTimer.Start(); } else { if (target != _lastHovered) { _hoverOnTimer.Tag = target; if (!InMouseHoverSize(e.Location, _lastMouseMovePosition)) { _hoverOnTimer.Stop(); } _hoverOnTimer.Start(); } } target.HandleMouseMove(e); _control.Cursor = target.GetMouseCursor(e) ?? Cursors.Default; ret = true; } else { if (_lastTarget != null) { /// targetがなくなった場合 _lastTarget.HandleMouseLeave(); _control.Cursor = Cursors.Default; _lastTarget = null; } _lastHovered = null; _hoverOnTimer.Stop(); ret = false; } _lastMouseMovePosition = e.Location; _lastMouseMoveEventArgs = e; return(ret); }
public bool HandleMouseLeave(EventArgs e) { if (_lastTarget != null) { _lastTarget.HandleMouseLeave(); _control.Cursor = Cursors.Default; _lastTarget = null; return(true); } return(false); }
public void StopForwardMouseEvents(IMouseOperatable mouseOperatable) { if (_mouseEventsToForwards == null) { return; } if (_MouseEventsToForwards.Contains(mouseOperatable)) { _MouseEventsToForwards.Remove(mouseOperatable); } }
//public long SessionId { // get { return _sessionId; } //} // ======================================== // method // ======================================== public void PrepareDnD(IMouseOperatable target, MouseEventArgs e) { Size dragSize = SystemInformation.DragSize; _target = target; _isPrepared = true; _dragStartMouseEventArgs = e; //if (_sessionId < long.MaxValue) { // ++_sessionId; //} else { // _sessionId = long.MinValue; //} }
public bool HandleDragLeave(EventArgs e) { if (_lastDragOverTarget != null) { var dragTarget = _lastDragOverTarget.DragTarget as DragTarget; dragTarget.HandleDragLeave(dragTarget, EventArgs.Empty); _lastDragOverTarget = null; _dragOverIsStarted = false; /// DragをキャンセルしてDragLeaveが呼ばれた後にMouseClickが発生するのを防ぐ _target = null; return(true); } return(false); }
public bool HandleMouseDown(MouseEventArgs e) { if (_dndEventProcessor.IsStarted) { return(false); } _target = _targetFinder(e.Location); if (_target != null) { _dragSourceEventProcessor.PrepareDnDOnMouseDown(_target, e); _dndEventProcessor.PrepareDnD(_target, e); _target.HandleMouseDown(e); return(true); } return(false); }
public bool HandleDragDrop(DragEventArgs e) { var pt = new Point(e.X, e.Y); var target = _targetFinder(pt); if (target != null) { var dragTarget = target.DragTarget as DragTarget; if (dragTarget != null) { dragTarget.HandleDragDrop(dragTarget, e); } _lastDragOverTarget = null; _dragOverIsStarted = false; return(true); } return(false); }
public bool HandleMouseUp(MouseEventArgs e) { if (_dndEventProcessor.IsPrepared) { _dndEventProcessor.ClearDnDState(); } if (_dragSourceEventProcessor.IsPrepared) { _dragSourceEventProcessor.ClearDnDState(); } if (_target != null) { _target.HandleMouseUp(e); _target = null; return(true); } return(false); }
// ======================================== // method // ======================================== public void PrepareDnDOnMouseDown(IMouseOperatable target, MouseEventArgs e) { if (target == null) { return; } ClearDnDState(); var dragSource = target.DragSource as DragSource; if (dragSource == null) { return; } var dragSourceEventArgs = new DragSourceEventArgs(e); dragSource.HandleJudgeDragStart(target, dragSourceEventArgs); if (dragSourceEventArgs.DoIt) { _currentProceededDragSource = dragSource; _lastCreatedDragSourceEventArgs = dragSourceEventArgs; _isPrepared = true; } }
public void SetDnDTarget(IMouseOperatable target) { _mouseDispatcher.SetDnDTarget(target); }
public void SetDnDTarget(IMouseOperatable target) { _dndEventProcessor._Target = target; }