// ----------------------------------------
        // 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;
 }
Exemplo n.º 4
0
 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);
 }
Exemplo n.º 7
0
 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;
            }
        }
Exemplo n.º 14
0
 public void SetDnDTarget(IMouseOperatable target)
 {
     _mouseDispatcher.SetDnDTarget(target);
 }
 public void SetDnDTarget(IMouseOperatable target)
 {
     _dndEventProcessor._Target = target;
 }