API proposal: drag view

steve.x.northover at oracle.com steve.x.northover at oracle.com
Tue Jan 15 10:41:24 PST 2013


Got it.  You need to start drag and drop before you get a drag board.  
Drag and drop is started in drag detect which takes a MouseEvent, not a 
DragEvent.

How are we going to allow tree and table to provide default drag images?

Steve

On 15/01/2013 1:06 PM, Pavel Safrata wrote:
> Hi Steve,
> I take it that you want it only for the drag start and you are not 
> concerned about an inaccessible value during the rest of the gesture 
> (we are not always the source so we don't always set the drag image). 
> Still, how would you even access the dragboard in a different node 
> than the one that started the DnD to call the getter if we provided 
> it? I don't think we have a mechanism for one node starting DnD and 
> another node altering the dragboard.
> Thanks,
> Pavel
>
> On 15.1.2013 18:55, steve.x.northover at oracle.com wrote:
>> 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.
>>
>> Steve
>>
>> 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