protected override FileExplorer.Script.IScriptCommand onEvent(RoutedEvent eventId) { switch (eventId.Name) { case "KeyDown": return (ScriptCommands.AssignGlobalParameterDic("{DragDrop}", false, //If current drag drop mode is Canvas, ScriptCommands.IfEquals(DragDropLiteCommand.DragDropModeKey, "Canvas", //And Escape is pressed. HubScriptCommands.IfKeyGesture("Esc", //Cancel Canvas drop (by clear {DragDrop} parameters) DragDropScriptCommands.CancelCanvasDrag( //Set {EventArgs.Handled} to true. HubScriptCommands.SetRoutedEventHandled( //and Detach adorner. HubScriptCommands.DettachSelectedItemsAdorner("SelectedItemsAdorner}"))))))); case "PreviewTouchDown": case "PreviewMouseDown": return //Find a DataContext that implement SupportDrag. (HubScriptCommands.AssignDataContext("{EventArgs.OriginalSource}", DataContextType.SupportDrag, "{ISupportDrag}", null, false, //And If there's one. ScriptCommands.IfAssigned("{ISupportDrag}", //Calculate a number of positions. HubScriptCommands.ObtainPointerPosition( //Assign the datacontext item to {ItemUnderMouse} HubScriptCommands.AssignItemUnderMouse("{ItemUnderMouse}", false, //And set Sender's StartDraggingItem to {ItemUnderMouse} ScriptCommands.IfAssigned("{ItemUnderMouse}", ScriptCommands.IfTrue("{ItemUnderMouse.IsSelected}", HubScriptCommands.SetDependencyProperty("{Sender}", UIEventHubProperties.StartDraggingItemProperty, "{ItemUnderMouse}")))))))); case "TouchDrag": case "MouseDrag": return //If event not marked handled. (HubScriptCommands.IfNotRoutedEventHandled( HubScriptCommands.IfDependencyPropertyEqualDefaultValue <object>("{Sender}", UIEventHubProperties.StartDraggingItemProperty, //If StartDraggingProperty = null, return. ResultCommand.NoError, //If StartDraggingProperty != null, Check and set IsDraggingProperty to true. HubScriptCommands.SetDependencyPropertyIfDifferentValue("{Sender}", UIEventHubProperties.IsDraggingProperty, true, //If changed IsDraggingProperty, Find DataContext that support ISupportDrag to {ISupportDrag} variable. HubScriptCommands.AssignDataContext("{EventArgs.OriginalSource}", DataContextType.SupportDrag, "{ISupportDrag}", null, false, //If ISupportDrag is assigned to a non-null value, //Initialize DragLiteParameters (in {DragDrop} global parameterDic). DragDropScriptCommands.StartCanvasDrag("{ISupportDrag}", //then set {EventArgs.Handled} to true. HubScriptCommands.SetRoutedEventHandled( //And attach/update adorner. HubScriptCommands.AttachSelectedItemsAdorner("{SelectedItemsAdorner}", HubScriptCommands.UpdateSelectedItemsAdorner("{SelectedItemsAdorner}"))))) , null)))); case "MouseMove": case "TouchMove": return //Only 1 of 5 TouchEvent will be processed (HubScriptCommands.ThrottleTouchDrag(5, ScriptCommands.AssignGlobalParameterDic("{DragDrop}", false, ScriptCommands.IfEquals(DragDropLiteCommand.DragDropModeKey, "Canvas", HubScriptCommands.ObtainPointerPosition( //Update adorner CentrePosition. HubScriptCommands.UpdateSelectedItemsAdorner("{SelectedItemsAdorner}")))))); case "PreviewTouchUp": case "PreviewMouseUp": return (HubScriptCommands.SetDependencyPropertyIfDifferentValue("{Sender}", UIEventHubProperties.IsDraggingProperty, false, HubScriptCommands.SetDependencyPropertyValue <object>("{Sender}", UIEventHubProperties.StartDraggingItemProperty, null, //Update position of each IPostionAware and clear {DragDrop} parameters) DragDropScriptCommands.EndCanvasDrag( //Set {EventArgs.Handled} to true. HubScriptCommands.SetRoutedEventHandled( //Detach adorner. HubScriptCommands.DettachSelectedItemsAdorner("SelectedItemsAdorner}")))))); } return(base.onEvent(eventId)); }
protected override IScriptCommand onEvent(RoutedEvent eventId) { if (eventId.Name.Contains("Mouse") && !EnableMouse) { return(base.onEvent(eventId)); } if (eventId.Name.Contains("Touch") && !EnableTouch) { return(base.onEvent(eventId)); } IScriptCommand detachAdornerAndResetDragDrop = ScriptCommands.SetPropertyValue(DragDropLiteCommand.DragDropDropTargetKey, "IsDraggingOver", false, DragDropScriptCommands.DetachAdorner("{DragDrop.AdornerLayer}", "{DragDrop.Adorner}", DragDropScriptCommands.EndLiteDrag("{DragDrop.SupportDrag}"))); if (EnableDrag) { switch (eventId.Name) { case "KeyDown": return(ScriptCommands.IfEquals(DragDropLiteCommand.DragDropModeKey, "Lite", HubScriptCommands.IfKeyGesture(new KeyGesture(Key.Escape), detachAdornerAndResetDragDrop))); case "PreviewMouseDown": case "PreviewTouchDown": return(_cmdDic.PreviewMouseDown ?? (_cmdDic.PreviewMouseDown = ScriptCommands.AssignGlobalParameterDic("{DragDrop}", false, //Set Default value for CanDrag first. ScriptCommands.Assign("{DragDrop.CanDrag}", false, false, //Find a DataContext that implement SupportDrag, and if assigned HubScriptCommands.IfHasDataContext("{EventArgs.OriginalSource}", DataContextType.SupportDrag, //and item under mouse (ISelectable) IsSelected. DragDropScriptCommands.IfItemUnderMouseIsSelected( //Notify MouseDrag can drag. ScriptCommands.Assign("{DragDrop.CanDrag}", true, false, //Prevent MultiSelect from starting. HubScriptCommands.SetRoutedEventHandled()) )))))); case "TouchDrag": case "MouseDrag": return(_cmdDic.MouseDrag ?? (_cmdDic.MouseDrag = ScriptCommands.AssignGlobalParameterDic("{DragDrop}", false, //If not handled. HubScriptCommands.IfNotRoutedEventHandled( //IfCanDrag (assigned from PreviewMouseDown) ScriptCommands.IfTrue("{DragDrop.CanDrag}", //Reset CanDrag ScriptCommands.Assign("{DragDrop.CanDrag}", false, false, //Mark handled, prevent MultiSelect from processing. HubScriptCommands.SetRoutedEventHandled( //If changed IsDraggingProperty, Find DataContext that support ISupportDrag to {ISupportDrag} variable. HubScriptCommands.AssignDataContext("{EventArgs.OriginalSource}", DataContextType.SupportDrag, "{DragDrop.SupportDrag}", null, false, //Determine DragMethod and call QueryDrag(). DragDropScriptCommands.StartLiteDrag("{DragDrop.SupportDrag}") )))))))); } } if (EnableDrop) { switch (eventId.Name) { case "QueryCursor": return(_cmdDic.GiveFeedback ?? (_cmdDic.GiveFeedback = ScriptCommands.AssignGlobalParameterDic("{DragDrop}", false, //If QueryDropResult returns none, set cursor to not droppable. ScriptCommands.IfEquals(DragDropLiteCommand.DragDropModeKey, "Lite", HubScriptCommands.QueryDropEffects("{ISupportDrop}", "{DragDrop.Draggables}", "{DataObj}", DragDropLiteCommand.DragDropEffectsKey, "{DragDrop.QueryDropResult}", false, ScriptCommands.IfEquals("{DragDrop.QueryDropResult}", QueryDropEffects.None, HubScriptCommands.SetCustomCursor(Cursors.No), HubScriptCommands.SetCustomCursor(Cursors.Arrow))))))); case "TouchMove": case "MouseMove": return(_cmdDic.MouseMove ?? (_cmdDic.MouseMove = HubScriptCommands.ThrottleTouchDrag(5, ScriptCommands.AssignGlobalParameterDic("{DragDrop}", false, //If not handled. HubScriptCommands.IfNotRoutedEventHandled( ScriptCommands.IfEquals(DragDropLiteCommand.DragDropModeKey, "Lite", HubScriptCommands.AssignDataContext("{EventArgs.OriginalSource}", DataContextType.SupportDrop, "{ISupportDrop}", "{ElementSupportDrop}", false, //And if there's one, //If Moved to different support drop. ScriptCommands.IfEquals("{ISupportDrop}", DragDropLiteCommand.DragDropDropTargetKey, DragDropScriptCommands.UpdateAdornerPointerPosition("{DragDrop.Adorner}"), HubScriptCommands.QueryDropEffects("{ISupportDrop}", "{DragDrop.Draggables}", "{DataObj}", DragDropLiteCommand.DragDropEffectsKey, "{DragDrop.QueryDropResult}", false, ScriptCommands.SetPropertyValue(DragDropLiteCommand.DragDropDropTargetKey, (ISupportDrop p) => p.IsDraggingOver, false, ScriptCommands.Assign(new Dictionary <string, object>() { { DragDropLiteCommand.DragDropDropTargetKey, "{ISupportDrop}" }, //Store SupportDrop property to global for future use. { "{DragDrop.ElementSupportDrop}", "{ElementSupportDrop}" }, //Store SupportDrop element to global for future use. { "{EventArgs.Handled}", true } //Mark RoutedEvent handled. }, false, //ScriptCommands.IfNotEquals("{DragDrop.QueryDropResult}", QueryDropEffects.None, //Attach DragAdorner and update it. ScriptCommands.SetPropertyValue(DragDropLiteCommand.DragDropDropTargetKey, (ISupportDrop p) => p.IsDraggingOver, true, DragDropScriptCommands.AttachAdorner( "{DragDrop.AdornerLayer}", "{DragDrop.Adorner}", "{ISupportDrop}", "{DragDrop.DragMethod}", "{DragDrop.Draggables}")) /*DragDropScriptCommands.DetachAdorner("{DragDrop.AdornerLayer}", "{DragDrop.Adorner}")*/))))))))))); case "TouchUp": case "PreviewMouseUp": return(_cmdDic.MouseUp ?? (_cmdDic.MouseUp = ScriptCommands.AssignGlobalParameterDic("{DragDrop}", false, ScriptCommands.IfEquals(DragDropLiteCommand.DragDropModeKey, "Lite", //Find DataContext that support ISupportDrop HubScriptCommands.AssignDataContext("{EventArgs.OriginalSource}", DataContextType.SupportDrop, "{ISupportDrop}", "{ElementSupportDrop}", false, //If ISupportDrop found. ScriptCommands.IfAssigned("{ISupportDrop}", ////Obtain DataObject from event and Call ISupportDrop.QueryDrop() to get IDraggables[] and QueryDropResult. HubScriptCommands.QueryDropEffects("{ISupportDrop}", "{DragDrop.Draggables}", "{DataObj}", DragDropLiteCommand.DragDropEffectsKey, "{DragDrop.QueryDropResult}", false, //If QueryShellDragInfo Success, if DragMethod... ScriptCommands.IfEquals(QueryDrag.DragMethodKey, DragMethod.Menu, HubScriptCommands.SetRoutedEventHandled( HubScriptCommands.ShowDragAdornerContextMenu("{DragDrop.Adorner}", "{DragDrop.QueryDropResult.SupportedEffects}", "{DragDrop.QueryDropResult.PreferredEffect}", "{ResultEffect}", //After menu closed... ScriptCommands.IfEquals("{ResultEffect}", DragDropEffectsEx.None, //If User choose None (click on empty area), detach and reset. detachAdornerAndResetDragDrop, //Otherwise, call ISupportDrop.Drop() HubScriptCommands.QueryDrop("{DragDrop.SupportDrag}", "{ISupportDrop}", "{DragDrop.Draggables}", "{DataObj}", "{ResultEffect}", "{DragDrop.DropResult}", false, //And detach adorner. detachAdornerAndResetDragDrop)))), //If DragMethod is not Menu, Drop immediately. HubScriptCommands.QueryDrop("{DragDrop.SupportDrag}", "{ISupportDrop}", "{DragDrop.Draggables}", "{DataObj}", "{DragDrop.QueryDropResult.PreferredEffect}", "{DragDrop.DropResult}", false, detachAdornerAndResetDragDrop))), //If QueryDropEffects is None, drag failed, detach adorner. detachAdornerAndResetDragDrop)))))); } } switch (eventId.Name) { case "PreviewKeyDown": return (ScriptCommands.AssignGlobalParameterDic("{DragDrop}", false, ScriptCommands.IfEquals(DragDropLiteCommand.DragDropModeKey, "Lite", HubScriptCommands.IfKeyGesture(new KeyGesture(Key.Escape), detachAdornerAndResetDragDrop)))); case "PreviewMouseUp": return (ScriptCommands.AssignGlobalParameterDic("{DragDrop}", false, ScriptCommands.IfEquals(DragDropLiteCommand.DragDropModeKey, "Lite", DragDropScriptCommands.DetachAdorner("{DragDrop.AdornerLayer}", "{DragDrop.Adorner}")))); } return(base.onEvent(eventId)); }
protected override FileExplorer.Script.IScriptCommand onEvent(RoutedEvent eventId) { if (EnableDrag) { switch (eventId.Name) { case "PreviewMouseDown": return(_cmdDic.PreviewMouseDown ?? (_cmdDic.PreviewMouseDown = ScriptCommands.AssignGlobalParameterDic("{DragDrop}", false, //Set Default value for CanDrag first. ScriptCommands.Assign("{DragDrop.CanDrag}", false, false, //Find a DataContext that implement SupportDrag, and if assigned HubScriptCommands.IfHasDataContext("{EventArgs.OriginalSource}", DataContextType.SupportShellDrag, //and item under mouse (ISelectable) IsSelected. DragDropScriptCommands.IfItemUnderMouseIsSelected( //Notify MouseDrag can drag. ScriptCommands.Assign("{DragDrop.CanDrag}", true, false, //Prevent MultiSelect from starting. HubScriptCommands.SetRoutedEventHandled()) )))))); case "MouseDrag": return(_cmdDic.MouseDrag ?? (_cmdDic.MouseDrag = ScriptCommands.AssignGlobalParameterDic("{DragDrop}", false, //If not handled. HubScriptCommands.IfNotRoutedEventHandled( //IfCanDrag (assigned from PreviewMouseDown) ScriptCommands.IfTrue("{DragDrop.CanDrag}", //Reset CanDrag ScriptCommands.Assign("{DragDrop.CanDrag}", false, false, //Mark handled, prevent MultiSelect from processing. HubScriptCommands.SetRoutedEventHandled( //If changed IsDraggingProperty, Find DataContext that support ISupportDrag to {ISupportDrag} variable. HubScriptCommands.AssignDataContext("{EventArgs.OriginalSource}", DataContextType.SupportShellDrag, "{DragDrop.SupportDrag}", null, false, //Determine DragMethod and call QueryDrag(). DragDropScriptCommands.StartShellDrag("{DragDrop.SupportDrag}") )))))))); case "PreviewMouseUp": return(_cmdDic.PreviewMouseUp ?? (_cmdDic.PreviewMouseUp = ScriptCommands.AssignGlobalParameterDic("{DragDrop}", false, //HubScriptCommands.SetDependencyPropertyValue("{Sender}", AttachedProperties.IsDraggingProperty, false, ScriptCommands.IfEquals(QueryDrag.DragMethodKey, DragMethod.Menu, ResultCommand.NoError, //This is defined in drop, detach if there's an adorner. DragDropScriptCommands.DetachAdorner("{DragDrop.AdornerLayer}", "{DragDrop.Adorner}"))))); case "MouseMove": return(_cmdDic.MouseMove ?? (_cmdDic.MouseMove = HubScriptCommands.IfDependencyProperty("{Sender}", UIEventHubProperties.IsDraggingProperty, ComparsionOperator.Equals, true, HubScriptCommands.SetRoutedEventHandled()))); } } if (EnableDrop) { switch (eventId.Name) { case "DragEnter": return(_cmdDic.DragEnter ?? (_cmdDic.DragEnter = ScriptCommands.AssignGlobalParameterDic("{DragDrop}", false, //Find DataContext that support IShellDrop HubScriptCommands.AssignDataContext("{EventArgs.OriginalSource}", DataContextType.SupportShellDrop, "{ISupportDrop}", "{ElementSupportDrop}", false, //And if there's one, ScriptCommands.IfAssigned("{ISupportDrop}", HubScriptCommands.QueryShellDragInfo("{ISupportDrop}", "{DataObj}", "{DragDrop.Draggables}", "{DragDrop.QueryDropResult}", false, //Otherwise, ScriptCommands.Assign(new Dictionary <string, object>() { { "{DragDrop.SupportDrop}", "{ISupportDrop}" }, //Store SupportDrop property to global for future use. { "{DragDrop.ElementSupportDrop}", "{ElementSupportDrop}" }, //Store SupportDrop element to global for future use. { "{ISupportDrop.IsDraggingOver}", true }, //Set DataContext.IsDraggingOver to true. { "{EventArgs.Handled}", true } //Mark RoutedEvent handled. }, false, //Attach DragAdorner and update it. DragDropScriptCommands.AttachAdorner( "{DragDrop.AdornerLayer}", "{DragDrop.Adorner}", "{ISupportDrop}", "{DragDrop.DragMethod}", "{DragDrop.Draggables}"))), DragDropScriptCommands.DetachAdorner("{DragDrop.AdornerLayer}", "{DragDrop.Adorner}")))))); case "GiveFeedback": return(_cmdDic.GiveFeedback ?? (_cmdDic.GiveFeedback = ScriptCommands.AssignGlobalParameterDic("{DragDrop}", false, //If QueryDropResult returns none, set cursor to not droppable. ScriptCommands.IfEquals("{DragDrop.QueryDropResult}", QueryDropEffects.None, HubScriptCommands.SetCustomCursor(Cursors.No))))); case "DragOver": return(_cmdDic.DragOver ?? (_cmdDic.DragOver = ScriptCommands.AssignGlobalParameterDic("{DragDrop}", false, DragDropScriptCommands.UpdateAdornerPointerPosition("{DragDrop.Adorner}")))); case "DragLeave": return(_cmdDic.DragLeave ?? (_cmdDic.DragLeave = ScriptCommands.AssignGlobalParameterDic("{DragDrop}", false, ScriptCommands.SetPropertyValue("{DragDrop.SupportDrop}", "IsDraggingOver", false, //Detach adorner if DragLeave current element. ScriptCommands.IfAssigned("{DragDrop.SupportDrop}", DragDropScriptCommands.DetachAdorner("{DragDrop.AdornerLayer}", "{DragDrop.Adorner}")))))); case "Drop": IScriptCommand detachAdornerAndResetDragDrop = ScriptCommands.SetPropertyValue("{DragDrop.SupportDrop}", "IsDraggingOver", false, DragDropScriptCommands.DetachAdorner("{DragDrop.AdornerLayer}", "{DragDrop.Adorner}", ScriptCommands.Reset(null, "{DragDrop.Adorner}", "{DragDrop.AdornerLayer}", "{DragDrop.SupportDrop}", "{DragDrop.Draggables}"))); return(_cmdDic.Drop ?? (_cmdDic.Drop = ScriptCommands.AssignGlobalParameterDic("{DragDrop}", false, //Find DataContext that support ISupportShellDrop HubScriptCommands.AssignDataContext("{EventArgs.OriginalSource}", DataContextType.SupportShellDrop, "{ISupportDrop}", "{ElementSupportDrop}", false, //If ISupportDrop found. ScriptCommands.IfAssigned("{ISupportDrop}", ////Obtain DataObject from event and Call ISupportDrop.QueryDrop() to get IDraggables[] and QueryDropResult. HubScriptCommands.SetRoutedEventHandled( HubScriptCommands.QueryShellDragInfo("{ISupportDrop}", "{DataObj}", "{DragDrop.Draggables}", "{DragDrop.QueryDropResult}", false, //If QueryShellDragInfo Success, if DragMethod... ScriptCommands.IfEquals(QueryDrag.DragMethodKey, DragMethod.Menu, //Backup because ISupportDrag parameter is reset after this command is completed. ScriptCommands.Assign("{DragDrop.SupportDragBackup}", "{DragDrop.SupportDrag}", false, //is Menu, then Show Menu. HubScriptCommands.ShowDragAdornerContextMenu("{DragDrop.Adorner}", "{DragDrop.QueryDropResult.SupportedEffects}", "{DragDrop.QueryDropResult.PreferredEffect}", "{ResultEffect}", //After menu closed... ScriptCommands.IfEquals("{ResultEffect}", DragDropEffectsEx.None, //If User choose None (click on empty area), detach and reset. detachAdornerAndResetDragDrop, //Otherwise, call ISupportDrop.Drop() HubScriptCommands.QueryDrop("{DragDrop.SupportDragBackup}", "{ISupportDrop}", "{DragDrop.Draggables}", "{DataObj}", "{ResultEffect}", "{DragDrop.DropResult}", false, //And detach adorner. detachAdornerAndResetDragDrop)))), //If DragMethod is not Menu, Drop immediately. HubScriptCommands.QueryDrop("{DragDrop.SupportDrag}", "{ISupportDrop}", "{DragDrop.Draggables}", "{DataObj}", "{DragDrop.QueryDropResult.PreferredEffect}", "{DragDrop.DropResult}", false, detachAdornerAndResetDragDrop)), //If QueryDropEffects is None, drag failed, detach adorner. detachAdornerAndResetDragDrop))))))); } } return(base.onEvent(eventId)); }