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

            DragDropResult res;
            if ((enabledEvents & WidgetEvent.DragDropCheck) == 0) {
                if ((enabledEvents & WidgetEvent.DragDrop) != 0)
                    res = DragDropResult.None;
                else
                    res = DragDropResult.Canceled;
            }
            else {
                DragCheckEventArgs da = new DragCheckEventArgs (new Point (x, y), Util.GetDragTypes (context.ListTargets ()), cda);
                ApplicationContext.InvokeUserCode (delegate {
                    EventSink.OnDragDropCheck (da);
                });
                res = da.Result;
                if ((enabledEvents & WidgetEvent.DragDrop) == 0 && res == DragDropResult.None)
                    res = DragDropResult.Canceled;
            }
            if (res == DragDropResult.Canceled) {
                Gtk.Drag.Finish (context, false, false, time);
                return true;
            }
            else if (res == DragDropResult.Success) {
                Gtk.Drag.Finish (context, true, cda == DragDropAction.Move, time);
                return true;
            }
            else {
                // Undefined, we need more data
                QueryDragData (context, time, false);
                return true;
            }
        }
Example #2
0
        internal bool DoDragDataReceived(Gdk.DragContext context, int x, int y, Gtk.SelectionData selectionData, uint info, uint time)
        {
            if (DragDropInfo.DragDataRequests == 0) {
                // Got the data without requesting it. Create the datastore here
                DragDropInfo.DragData = new TransferDataStore ();
                DragDropInfo.LastDragPosition = new Point (x, y);
                DragDropInfo.DragDataRequests = 1;
            }

            DragDropInfo.DragDataRequests--;

            // If multiple drag/drop data types are supported, we need to iterate through them all and
            // append the data. If one of the supported data types is not found, there's no need to
            // bail out. We must raise the event
            Util.GetSelectionData (ApplicationContext, selectionData, DragDropInfo.DragData);

            if (DragDropInfo.DragDataRequests == 0) {
                if (DragDropInfo.DragDataForMotion) {
                    // If no specific action is set, it means that no key has been pressed.
                    // In that case, use Move or Copy or Link as default (when allowed, in this order).
                    var cact = ConvertDragAction (context.Actions);
                    if (cact != DragDropAction.Copy && cact != DragDropAction.Move && cact != DragDropAction.Link) {
                        if (cact.HasFlag (DragDropAction.Move))
                            cact = DragDropAction.Move;
                        else if (cact.HasFlag (DragDropAction.Copy))
                            cact = DragDropAction.Copy;
                        else if (cact.HasFlag (DragDropAction.Link))
                            cact = DragDropAction.Link;
                        else
                            cact = DragDropAction.None;
                    }

                    DragOverEventArgs da = new DragOverEventArgs (DragDropInfo.LastDragPosition, DragDropInfo.DragData, cact);
                    ApplicationContext.InvokeUserCode (delegate {
                        EventSink.OnDragOver (da);
                    });
                    OnSetDragStatus (context, (int)DragDropInfo.LastDragPosition.X, (int)DragDropInfo.LastDragPosition.Y, time, ConvertDragAction (da.AllowedAction));
                    return true;
                }
                else {
                    // Use Context.Action here since that's the action selected in DragOver
                    var cda = ConvertDragAction (context.GetSelectedAction());
                    DragEventArgs da = new DragEventArgs (DragDropInfo.LastDragPosition, DragDropInfo.DragData, cda);
                    ApplicationContext.InvokeUserCode (delegate {
                        EventSink.OnDragDrop (da);
                    });
                    Gtk.Drag.Finish (context, da.Success, cda == DragDropAction.Move, time);
                    return true;
                }
            } else
                return false;
        }