Example #1
0
        internal bool DoDragMotion(Gdk.DragContext context, int x, int y, uint time)
        {
            DragDropInfo.LastDragPosition = new Point(x, y);

            DragDropAction ac;

            if ((enabledEvents & WidgetEvent.DragOverCheck) == 0)
            {
                if ((enabledEvents & WidgetEvent.DragOver) != 0)
                {
                    ac = DragDropAction.Default;
                }
                else
                {
                    ac = ConvertDragAction(DragDropInfo.DestDragAction);
                }
            }
            else
            {
                // This is a workaround to what seems to be a mac gtk bug.
                // Suggested action is set to all when no control key is pressed
                var cact = ConvertDragAction(context.Actions);
                if (cact == DragDropAction.All)
                {
                    cact = DragDropAction.Move;
                }

                var target                = Gtk.Drag.DestFindTarget(EventsRootWidget, context, null);
                var targetTypes           = Util.GetDragTypes(new Gdk.Atom[] { target });
                DragOverCheckEventArgs da = new DragOverCheckEventArgs(new Point(x, y), targetTypes, cact);
                ApplicationContext.InvokeUserCode(delegate {
                    EventSink.OnDragOverCheck(da);
                });
                ac = da.AllowedAction;
                if ((enabledEvents & WidgetEvent.DragOver) == 0 && ac == DragDropAction.Default)
                {
                    ac = DragDropAction.None;
                }
            }

            if (ac == DragDropAction.None)
            {
                OnSetDragStatus(context, x, y, time, (Gdk.DragAction) 0);
                return(true);
            }
            else if (ac == DragDropAction.Default)
            {
                // Undefined, we need more data
                QueryDragData(context, time, true);
                return(true);
            }
            else
            {
//				Gtk.Drag.Highlight (Widget);
                OnSetDragStatus(context, x, y, time, ConvertDragAction(ac));
                return(true);
            }
        }
 public virtual void DragOverCheck(DragOverCheckEventArgs args)
 {
     if (!args.DataTypes.Intersect(this.TargetTypes).Any())
     {
         args.AllowedAction = DragDropAction.None;
     }
     else
     {
         args.AllowedAction = DragDropAction.All;
     }
 }
Example #3
0
        static NSDragOperation DraggingUpdated(IntPtr sender, IntPtr sel, IntPtr dragInfo)
        {
            IViewObject <T> ob = Runtime.GetNSObject(sender) as IViewObject <T>;

            if (ob == null)
            {
                return(NSDragOperation.None);
            }
            var backend = (ViewBackend <T, S>)WidgetRegistry.GetBackend(ob.Frontend);

            NSDraggingInfo di    = new NSDraggingInfo(dragInfo);
            var            types = di.DraggingPasteboard.Types.Select(t => ToXwtDragType(t)).ToArray();
            var            pos   = new Point(di.DraggingLocation.X, di.DraggingLocation.Y);

            if ((backend.currentEvents & WidgetEvent.DragOverCheck) != 0)
            {
                var args = new DragOverCheckEventArgs(pos, types, ConvertAction(di.DraggingSourceOperationMask));
                Toolkit.Invoke(delegate {
                    backend.eventSink.OnDragOverCheck(args);
                });
                if (args.AllowedAction == DragDropAction.None)
                {
                    return(NSDragOperation.None);
                }
                if (args.AllowedAction != DragDropAction.Default)
                {
                    return(ConvertAction(args.AllowedAction));
                }
            }

            if ((backend.currentEvents & WidgetEvent.DragOver) != 0)
            {
                TransferDataStore store = new TransferDataStore();
                FillDataStore(store, di.DraggingPasteboard, ob.View.RegisteredDragTypes());
                var args = new DragOverEventArgs(pos, store, ConvertAction(di.DraggingSourceOperationMask));
                Toolkit.Invoke(delegate {
                    backend.eventSink.OnDragOver(args);
                });
                if (args.AllowedAction == DragDropAction.None)
                {
                    return(NSDragOperation.None);
                }
                if (args.AllowedAction != DragDropAction.Default)
                {
                    return(ConvertAction(args.AllowedAction));
                }
            }

            return(di.DraggingSourceOperationMask);
        }
Example #4
0
        void HandleWidgetDragMotion(object o, Gtk.DragMotionArgs args)
        {
            lastDragPosition = new Point(args.X, args.Y);

            DragDropAction ac;

            if ((enabledEvents & WidgetEvent.DragOverCheck) == 0)
            {
                if ((enabledEvents & WidgetEvent.DragOver) != 0)
                {
                    ac = DragDropAction.Default;
                }
                else
                {
                    ac = ConvertDragAction(destDragAction);
                }
            }
            else
            {
                DragOverCheckEventArgs da = new DragOverCheckEventArgs(new Point(args.X, args.Y), Util.GetDragTypes(args.Context.Targets), ConvertDragAction(args.Context.Actions));
                Toolkit.Invoke(delegate {
                    EventSink.OnDragOverCheck(da);
                });
                ac = da.AllowedAction;
                if ((enabledEvents & WidgetEvent.DragOver) == 0 && ac == DragDropAction.Default)
                {
                    ac = DragDropAction.None;
                }
            }

            if (ac == DragDropAction.None)
            {
                args.RetVal = true;
                Gdk.Drag.Status(args.Context, (Gdk.DragAction) 0, args.Time);
            }
            else if (ac == DragDropAction.Default)
            {
                // Undefined, we need more data
                args.RetVal = true;
                QueryDragData(args.Context, args.Time, true);
            }
            else
            {
//				Gtk.Drag.Highlight (Widget);
                args.RetVal = true;
                Gdk.Drag.Status(args.Context, ConvertDragAction(ac), args.Time);
            }
        }
Example #5
0
        void CheckDrop(object sender, System.Windows.DragEventArgs e)
        {
            var types          = e.Data.GetFormats().Select(DataConverter.ToXwtTransferType).ToArray();
            var pos            = e.GetPosition(Widget).ToXwtPoint();
            var proposedAction = DetectDragAction(e.KeyStates);

            e.Handled = true;             // Prevent default handlers from being used.

            if ((enabledEvents & WidgetEvent.DragOverCheck) > 0)
            {
                var checkArgs = new DragOverCheckEventArgs(pos, types, proposedAction);
                Context.InvokeUserCode(delegate {
                    eventSink.OnDragOverCheck(checkArgs);
                });
                if (checkArgs.AllowedAction == DragDropAction.None)
                {
                    e.Effects = currentDragEffect = DragDropEffects.None;
                    return;
                }
                if (checkArgs.AllowedAction != DragDropAction.Default)
                {
                    e.Effects = currentDragEffect = checkArgs.AllowedAction.ToWpfDropEffect();
                    return;
                }
            }

            if ((enabledEvents & WidgetEvent.DragOver) > 0)
            {
                var store = new TransferDataStore();
                FillDataStore(store, e.Data);                  //, DragDropInfo.TargetTypes);

                var args = new DragOverEventArgs(pos, store, proposedAction);
                OnDragOver(sender, args);
                if (args.AllowedAction == DragDropAction.None)
                {
                    e.Effects = currentDragEffect = DragDropEffects.None;
                    return;
                }
                if (args.AllowedAction != DragDropAction.Default)
                {
                    e.Effects = currentDragEffect = args.AllowedAction.ToWpfDropEffect();
                    return;
                }
            }

            e.Effects = currentDragEffect = proposedAction.ToWpfDropEffect();
        }
Example #6
0
        void WidgetDragOverHandler(object sender, System.Windows.DragEventArgs e)
        {
            var types = e.Data.GetFormats ().Select (t => t.ToXwtTransferType ()).ToArray ();
            var pos = e.GetPosition (Widget).ToXwtPoint ();
            var proposedAction = DetectDragAction (e.KeyStates);

            e.Handled = true; // Prevent default handlers from being used.

            if (Adorner != null) {
                var w = GetParentWindow ();
                var v = (UIElement)w.Content;

                if (w != AdornedWindow) {
                    AdornedLayer.Remove (Adorner);

                    AdornedWindow.AllowDrop = false;
                    AdornedWindow.DragOver -= AdornedWindowOnDragOver;

                    AdornedWindow = w;
                    AdornedWindow.AllowDrop = true;
                    AdornedWindow.DragOver += AdornedWindowOnDragOver;

                    AdornedLayer = AdornerLayer.GetAdornerLayer (v);
                    AdornedLayer.Add (Adorner);
                }

                Adorner.Offset = e.GetPosition (v);
            }

            if ((enabledEvents & WidgetEvent.DragOverCheck) > 0) {
                var checkArgs = new DragOverCheckEventArgs (pos, types, proposedAction);
                Context.InvokeUserCode (delegate {
                    eventSink.OnDragOverCheck (checkArgs);
                });
                if (checkArgs.AllowedAction == DragDropAction.None) {
                    e.Effects = currentDragEffect = DragDropEffects.None;
                    return;
                }
                if (checkArgs.AllowedAction != DragDropAction.Default) {
                    e.Effects = currentDragEffect = checkArgs.AllowedAction.ToWpfDropEffect ();
                    return;
                }
            }

            if ((enabledEvents & WidgetEvent.DragOver) > 0) {
                var store = new TransferDataStore ();
                FillDataStore (store, e.Data, DragDropInfo.TargetTypes);

                var args = new DragOverEventArgs (pos, store, proposedAction);
                OnDragOver (sender, args);
                if (args.AllowedAction == DragDropAction.None) {
                    e.Effects = currentDragEffect = DragDropEffects.None;
                    return;
                }
                if (args.AllowedAction != DragDropAction.Default) {
                    e.Effects = currentDragEffect = args.AllowedAction.ToWpfDropEffect ();
                    return;
                }
            }

            e.Effects = currentDragEffect = proposedAction.ToWpfDropEffect ();
        }
Example #7
0
        void CheckDrop(object sender, System.Windows.DragEventArgs e)
        {
            var types = e.Data.GetFormats ().Select (t => t.ToXwtTransferType ()).ToArray ();
            var pos = e.GetPosition (Widget).ToXwtPoint ();
            var proposedAction = DetectDragAction (e.KeyStates);

            e.Handled = true; // Prevent default handlers from being used.

            if ((enabledEvents & WidgetEvent.DragOverCheck) > 0) {
                var checkArgs = new DragOverCheckEventArgs (pos, types, proposedAction);
                Context.InvokeUserCode (delegate {
                    eventSink.OnDragOverCheck (checkArgs);
                });
                if (checkArgs.AllowedAction == DragDropAction.None) {
                    e.Effects = currentDragEffect = DragDropEffects.None;
                    return;
                }
                if (checkArgs.AllowedAction != DragDropAction.Default) {
                    e.Effects = currentDragEffect = checkArgs.AllowedAction.ToWpfDropEffect ();
                    return;
                }
            }

            if ((enabledEvents & WidgetEvent.DragOver) > 0) {
                var store = new TransferDataStore ();
                FillDataStore (store, e.Data, DragDropInfo.TargetTypes);

                var args = new DragOverEventArgs (pos, store, proposedAction);
                OnDragOver (sender, args);
                if (args.AllowedAction == DragDropAction.None) {
                    e.Effects = currentDragEffect = DragDropEffects.None;
                    return;
                }
                if (args.AllowedAction != DragDropAction.Default) {
                    e.Effects = currentDragEffect = args.AllowedAction.ToWpfDropEffect ();
                    return;
                }
            }

            e.Effects = currentDragEffect = proposedAction.ToWpfDropEffect ();
        }
Example #8
0
        void WidgetDragOverHandler(object sender, System.Windows.DragEventArgs e)
        {
            var types          = e.Data.GetFormats().Select(t => t.ToXwtTransferType()).ToArray();
            var pos            = e.GetPosition(Widget).ToXwtPoint();
            var proposedAction = DetectDragAction(e.KeyStates);

            e.Handled = true;             // Prevent default handlers from being used.

            if (Adorner != null)
            {
                var w = GetParentWindow();
                var v = (UIElement)w.Content;

                if (w != AdornedWindow)
                {
                    AdornedLayer.Remove(Adorner);

                    AdornedWindow.AllowDrop = false;
                    AdornedWindow.DragOver -= AdornedWindowOnDragOver;

                    AdornedWindow           = w;
                    AdornedWindow.AllowDrop = true;
                    AdornedWindow.DragOver += AdornedWindowOnDragOver;

                    AdornedLayer = AdornerLayer.GetAdornerLayer(v);
                    AdornedLayer.Add(Adorner);
                }

                Adorner.Offset = e.GetPosition(v);
            }

            if ((enabledEvents & WidgetEvent.DragOverCheck) > 0)
            {
                var checkArgs = new DragOverCheckEventArgs(pos, types, proposedAction);
                Context.InvokeUserCode(delegate {
                    eventSink.OnDragOverCheck(checkArgs);
                });
                if (checkArgs.AllowedAction == DragDropAction.None)
                {
                    e.Effects = currentDragEffect = DragDropEffects.None;
                    return;
                }
                if (checkArgs.AllowedAction != DragDropAction.Default)
                {
                    e.Effects = currentDragEffect = checkArgs.AllowedAction.ToWpfDropEffect();
                    return;
                }
            }

            if ((enabledEvents & WidgetEvent.DragOver) > 0)
            {
                var store = new TransferDataStore();
                FillDataStore(store, e.Data, DragDropInfo.TargetTypes);

                var args = new DragOverEventArgs(pos, store, proposedAction);
                OnDragOver(sender, args);
                if (args.AllowedAction == DragDropAction.None)
                {
                    e.Effects = currentDragEffect = DragDropEffects.None;
                    return;
                }
                if (args.AllowedAction != DragDropAction.Default)
                {
                    e.Effects = currentDragEffect = args.AllowedAction.ToWpfDropEffect();
                    return;
                }
            }

            e.Effects = currentDragEffect = proposedAction.ToWpfDropEffect();
        }
Example #9
0
 protected virtual void OnDragOverCheck(NSDraggingInfo di, DragOverCheckEventArgs args)
 {
     Toolkit.Invoke(delegate {
         eventSink.OnDragOverCheck(args);
     });
 }