API proposal: drag view

steve.x.northover at oracle.com steve.x.northover at oracle.com
Tue Jan 15 09:55:12 PST 2013

Without a getter, the application has no idea whether a drag image has 
already been set for them.  Having a setter without a getter generally 
makes no sense.  Since we set the drag image, we can easily return the 
image that we set.


On 15/01/2013 4:20 AM, Pavel Safrata wrote:
> Hi Richard, Steve,
> On 14.1.2013 20:51, steve.x.northover at oracle.com wrote:
>> +1
>> I'd like to see some example code where the tree and table set a 
>> default image as part of the implementation of these controls. 
>> Applications would get a reasonable image for free and be able to 
>> override it as necessary.  Having and getter is necessary for this.
> Is it? What will be done with it? User will get the image and 
> programatically check if it looks good?
> (please see my answers to Richard's comments below).
>> BTW, the last time I looked, on Windows, when you set image content, 
>> then you will get a drag image for free.  This doesn't happen on the 
>> Mac.  We should stop doing this on Windows.
>> Steve
>> On 14/01/2013 2:09 PM, Richard Bair wrote:
>>> HI Pavel!
>>> Overall great. I don't see why you can't have a getter. The only way 
>>> to set the drag view is via an API we control so it seems pretty 
>>> easy to implement the getter as well. 
> No. DnD is an OS feature. You can drag data from native applications 
> to FX. Is it possible on all systems to find out what did the native 
> application use as drag image? I'm really not sure. Anybody has the 
> knowledge?
>>> You could either have a DragView class which encapsulates the 
>>> node/image and the offsetX and offsetY, or you could just break it 
>>> out into three properties on the DragBoard and save yourself the 
>>> extra class.
> If we are OK with the properties having value only during starting DnD 
> and not during the rest of the gesture, then yes, this could be done. 
> But I still don't see the value.
>>> I think you should just have an image based dragImage property and 
>>> dragImageOffsetX and dragImageOffsetY properties. We shouldn't by 
>>> default put anything in as the drag image, except for a few UI 
>>> controls. We'll want a ListView, TreeView, TableView, TreeTableView 
>>> to automatically pre-populate the DragBoard before the 
>>> onDragDetected code is called, so that those control give you a nice 
>>> drag image for free but the developer is free to replace it or clear 
>>> it as they see fit.
> I don't think this is possible with the proposed API. The DragBoard 
> instance doesn't exist until you start DnD in the DRAG_DETECTED 
> handler, so you cannot really pre-populate it. Would it be sufficient 
> if the controls contained getDefaultDragImage() method that users 
> would explicitly call?
>>> The developer could use the synchronous version of snapshot. But I 
>>> think either snapshot should be fixed to be transparent by default 
>>> instead of a white fill by default or add another snapshot method 
>>> which produces a transparent fill by default.
> True. Kevin, how easy/hard it would be to add such snapshot method?
> Thanks,
> Pavel
>>> Basically:
>>> source.setOnDragDetected(new EventHandler<MouseEvent>() {
>>>      public void handle(MouseEvent event) {
>>>          DragBoard db = source.startDragAndDrop(TransferMode.ANY);
>>>          db.setContent(…);
>>>          db.setDragImage(source.snapshot());
>>>          db.setDragImageOffsetX(event.getX());
>>>          db.setDragImageOffsetY(event.getY());
>>>          event.consume();
>>>      }
>>> }
>>> Maybe also have a convenience method on DragBoard:
>>>      db.updateDragImage(node, x, y);
>>> which then just calls the 3 setters as appropriate.
>>> Richard
>>> On Jan 13, 2013, at 11:59 PM, Pavel 
>>> Safrata<pavel.safrata at oracle.com>  wrote:
>>>> Hello,
>>>> this is a proposal of an API allowing to specify the image floating 
>>>> with mouse cursor during a drag&drop operation.
>>>> Jira: http://javafx-jira.kenai.com/browse/RT-14730
>>>> I propose to add two methods to DragBoard:
>>>> setDragView(Image image, double offsetX, double offsetY)
>>>> setDragView(Node node, double offsetX, double offsetY)
>>>> The first one simply uses the given image for the drag view with 
>>>> the offsetX and offsetY specifying cursor position over the image. 
>>>> The second one renders the given node to an image and uses the 
>>>> result (the coordinates being in the node's local space).
>>>> The typical usage will look like this:
>>>>         sourceNode.setOnDragDetected(new EventHandler<MouseEvent>() {
>>>>             public void handle(MouseEvent event) {
>>>>                 Dragboard db = 
>>>> source.startDragAndDrop(TransferMode.ANY);
>>>>                 ClipboardContent content = ...
>>>>                 db.setContent(content);
>>>>                 db.setDragView(sourceNode, event.getX(), 
>>>> event.getY()); // that's it
>>>>                 event.consume();
>>>>             }
>>>>         });
>>>> This API is meant for telling the operating system what visual cues 
>>>> to provide, I don't think it is useful (and I'm not sure it is even 
>>>> possible) to provide getters.
>>>> There is a possibility to provide default drag view - if none of 
>>>> those methods is called, the default drag view would be an image of 
>>>> the drag gesture source. This should work nice most of the times. 
>>>> However, it may cause inconveniences to some existing apps - for 
>>>> instance a text editor node which puts the selected text on the 
>>>> DragBoard - after updating FX the application starts to show the 
>>>> entire editor in the drag view. For this reason I think the default 
>>>> behavior should remain unchanged.
>>>> Thanks,
>>>> Pavel

More information about the openjfx-dev mailing list