mirror of
https://github.com/ZuneDev/Xune.git
synced 2026-07-27 13:13:10 -07:00
280 lines
9.0 KiB
C#
280 lines
9.0 KiB
C#
// Decompiled with JetBrains decompiler
|
|
// Type: Microsoft.Iris.InputHandlers.DragSourceHandler
|
|
// Assembly: UIX, Version=4.8.0.0, Culture=neutral, PublicKeyToken=ddd0da4d3e678217
|
|
// MVID: A56C6C9D-B7F6-46A9-8BDE-B3D9B8D60B11
|
|
// Assembly location: C:\Program Files\Zune\UIX.dll
|
|
|
|
using Microsoft.Iris.Input;
|
|
using Microsoft.Iris.Markup;
|
|
using Microsoft.Iris.OS;
|
|
using Microsoft.Iris.Session;
|
|
using Microsoft.Iris.UI;
|
|
using System;
|
|
|
|
namespace Microsoft.Iris.InputHandlers
|
|
{
|
|
internal class DragSourceHandler : InputHandler
|
|
{
|
|
private object _value;
|
|
private DropAction _allowedDropActions;
|
|
private DropAction _currentDropAction;
|
|
private bool _pendingDrag;
|
|
private bool _dragCanceled;
|
|
private int _initialX;
|
|
private int _initialY;
|
|
private CursorID _moveCursor;
|
|
private CursorID _copyCursor;
|
|
private CursorID _cancelCursor;
|
|
|
|
internal DragSourceHandler()
|
|
{
|
|
_moveCursor = CursorID.Move;
|
|
_copyCursor = CursorID.Copy;
|
|
_cancelCursor = CursorID.Cancel;
|
|
}
|
|
|
|
public override void OnZoneDetached()
|
|
{
|
|
if (Dragging)
|
|
EndDrag(null, InputModifiers.None, DropAction.None);
|
|
base.OnZoneDetached();
|
|
}
|
|
|
|
protected override void ConfigureInteractivity()
|
|
{
|
|
base.ConfigureInteractivity();
|
|
if (!HandleDirect)
|
|
return;
|
|
UI.MouseInteractive = true;
|
|
}
|
|
|
|
public object Value
|
|
{
|
|
get => _value;
|
|
set
|
|
{
|
|
if (_value == value)
|
|
return;
|
|
_value = value;
|
|
FireNotification(NotificationID.Value);
|
|
}
|
|
}
|
|
|
|
public DropAction AllowedDropActions
|
|
{
|
|
get => _allowedDropActions;
|
|
set
|
|
{
|
|
if (_allowedDropActions == value)
|
|
return;
|
|
_allowedDropActions = value;
|
|
FireNotification(NotificationID.AllowedDropActions);
|
|
}
|
|
}
|
|
|
|
public DropAction CurrentDropAction => _currentDropAction;
|
|
|
|
private void SetCurrentDropAction(DropAction value)
|
|
{
|
|
if (_currentDropAction == value)
|
|
return;
|
|
_currentDropAction = value;
|
|
FireNotification(NotificationID.CurrentDropAction);
|
|
UpdateCursor();
|
|
}
|
|
|
|
public bool Dragging => DragDropHelper.DraggingInternally && DragDropHelper.SourceHandler == this;
|
|
|
|
public CursorID MoveCursor
|
|
{
|
|
get => _moveCursor;
|
|
set
|
|
{
|
|
if (_moveCursor == value)
|
|
return;
|
|
_moveCursor = value;
|
|
FireNotification(NotificationID.MoveCursor);
|
|
}
|
|
}
|
|
|
|
public CursorID CopyCursor
|
|
{
|
|
get => _copyCursor;
|
|
set
|
|
{
|
|
if (_copyCursor == value)
|
|
return;
|
|
_copyCursor = value;
|
|
FireNotification(NotificationID.CopyCursor);
|
|
}
|
|
}
|
|
|
|
public CursorID CancelCursor
|
|
{
|
|
get => _cancelCursor;
|
|
set
|
|
{
|
|
if (_cancelCursor == value)
|
|
return;
|
|
_cancelCursor = value;
|
|
FireNotification(NotificationID.CancelCursor);
|
|
}
|
|
}
|
|
|
|
protected override void OnMousePrimaryDown(UIClass ui, MouseButtonInfo info)
|
|
{
|
|
_pendingDrag = true;
|
|
_initialX = info.ScreenX;
|
|
_initialY = info.ScreenY;
|
|
base.OnMousePrimaryDown(ui, info);
|
|
}
|
|
|
|
protected override void OnMouseMove(UIClass ui, MouseMoveInfo info)
|
|
{
|
|
if (Dragging)
|
|
{
|
|
DragDropHelper.Requery(info.NaturalHit, info.ScreenX, info.ScreenY, info.Modifiers);
|
|
info.MarkHandled();
|
|
}
|
|
else if (_pendingDrag)
|
|
{
|
|
if (Math.Abs(info.ScreenX - _initialX) >= Win32Api.GetSystemMetrics(68) || Math.Abs(info.ScreenY - _initialY) >= Win32Api.GetSystemMetrics(69))
|
|
{
|
|
_pendingDrag = false;
|
|
DragDropHelper.BeginDrag(this, info.Target, info.NaturalHit, 0, 0, info.Modifiers);
|
|
UI.SessionInput += new SessionInputHandler(OnSessionInput);
|
|
FireNotification(NotificationID.Dragging);
|
|
FireNotification(NotificationID.Started);
|
|
UpdateCursor();
|
|
info.MarkHandled();
|
|
}
|
|
}
|
|
else if (_dragCanceled)
|
|
info.MarkHandled();
|
|
base.OnMouseMove(ui, info);
|
|
}
|
|
|
|
protected override void OnMousePrimaryUp(UIClass sender, MouseButtonInfo info)
|
|
{
|
|
_pendingDrag = false;
|
|
if (Dragging)
|
|
{
|
|
EndDrag(info?.NaturalHit, info.Modifiers, CurrentDropAction);
|
|
info.MarkHandled();
|
|
}
|
|
else if (_dragCanceled)
|
|
{
|
|
_dragCanceled = false;
|
|
info.MarkHandled();
|
|
}
|
|
base.OnMousePrimaryUp(sender, info);
|
|
}
|
|
|
|
protected override void OnDragComplete(UIClass sender, DragDropInfo info)
|
|
{
|
|
DragDropHelper.OnDragComplete();
|
|
info.MarkHandled();
|
|
base.OnDragComplete(sender, info);
|
|
}
|
|
|
|
private void OnSessionInput(InputInfo originalEvent, EventRouteStages handledStage)
|
|
{
|
|
switch (originalEvent)
|
|
{
|
|
case KeyStateInfo keyStateInfo:
|
|
switch (keyStateInfo.Key)
|
|
{
|
|
case Keys.ControlKey:
|
|
InputModifiers modifiers = keyStateInfo.Modifiers;
|
|
if (keyStateInfo.Action == KeyAction.Down)
|
|
modifiers |= InputModifiers.ControlKey;
|
|
DragDropHelper.Requery(modifiers);
|
|
break;
|
|
case Keys.Escape:
|
|
EndDrag(null, keyStateInfo.Modifiers, DropAction.None);
|
|
_dragCanceled = true;
|
|
break;
|
|
}
|
|
keyStateInfo.MarkHandled();
|
|
break;
|
|
case MouseButtonInfo mouseButtonInfo:
|
|
if (mouseButtonInfo.Button == MouseButtons.Left)
|
|
break;
|
|
mouseButtonInfo.MarkHandled();
|
|
break;
|
|
}
|
|
}
|
|
|
|
protected override void OnLoseKeyFocus(UIClass sender, KeyFocusInfo info)
|
|
{
|
|
_pendingDrag = false;
|
|
if (Dragging)
|
|
EndDrag(null, DragDropHelper.Modifiers, DropAction.None);
|
|
base.OnLoseKeyFocus(sender, info);
|
|
}
|
|
|
|
protected override void OnLoseMouseFocus(UIClass sender, MouseFocusInfo info)
|
|
{
|
|
_pendingDrag = false;
|
|
if (Dragging)
|
|
EndDrag(null, DragDropHelper.Modifiers, DropAction.None);
|
|
base.OnLoseMouseFocus(sender, info);
|
|
}
|
|
|
|
private void EndDrag(IRawInputSite target, InputModifiers modifiers, DropAction action)
|
|
{
|
|
UI.SessionInput -= new SessionInputHandler(OnSessionInput);
|
|
DragDropHelper.EndDrag(target, modifiers, action);
|
|
}
|
|
|
|
internal void OnEndDrag(DropAction action)
|
|
{
|
|
FireNotification(NotificationID.Dragging);
|
|
switch (action)
|
|
{
|
|
case DropAction.None:
|
|
FireNotification(NotificationID.Canceled);
|
|
break;
|
|
case DropAction.Copy:
|
|
FireNotification(NotificationID.Copied);
|
|
break;
|
|
case DropAction.Move:
|
|
FireNotification(NotificationID.Moved);
|
|
break;
|
|
}
|
|
UpdateCursor();
|
|
}
|
|
|
|
internal void UpdateCurrentAction()
|
|
{
|
|
DropAction dropAction = DragDropHelper.AllowedDropActions & AllowedDropActions;
|
|
if ((dropAction & DropAction.All) == DropAction.All)
|
|
{
|
|
if ((DragDropHelper.Modifiers & InputModifiers.ControlKey) == InputModifiers.ControlKey)
|
|
SetCurrentDropAction(DropAction.Copy);
|
|
else
|
|
SetCurrentDropAction(DropAction.Move);
|
|
}
|
|
else
|
|
SetCurrentDropAction(dropAction);
|
|
}
|
|
|
|
internal override CursorID GetCursor()
|
|
{
|
|
if (Dragging)
|
|
{
|
|
switch (CurrentDropAction)
|
|
{
|
|
case DropAction.None:
|
|
return CancelCursor;
|
|
case DropAction.Copy:
|
|
return CopyCursor;
|
|
case DropAction.Move:
|
|
return MoveCursor;
|
|
}
|
|
}
|
|
return CursorID.NotSpecified;
|
|
}
|
|
}
|
|
}
|