Move & Copy DnD operation on OS-X and Linux
David Hill
David.Hill at Oracle.com
Tue Mar 29 20:19:13 UTC 2016
On 3/29/16, 7:04 AM, Tom Schindl wrote:
> Hi,
Tom,
This is something we might be able to change in 9.
Would you file a bug for this ?
thanks,
Dave
>
> While developing our editor control we tried to implement DnD of
> Text-Selection to:
> * to rearrange text inside the control
> * to copy text selections to another position inside the text
>
> On Win32 everything works as expected, if you start dragging the initial
> operation is MOVE and you can change that to a COPY by pressing CTRL
> while dragging.
>
> On Linux the initial gesture is COPY which is not how DnD works in
> things like nautilus, ... . I can get that to change to a move operation
> by holding the SHIFT key.
>
> On OS-X the initial gesture is a COPY and which is not how DnD works
> finder or eg Finder, and I haven't found a way to change the operation
> to a MOVE.
>
> I would expect the following on ALL operation systems:
> - a drag WITHOUT any modifier key is a MOVE operation
>
> - on Windows& Linux I make it to a copy operation by pressing CTRL
> while dragging
>
> - on OS-X I make it a copy operation by pressing ALT while dragging
>
> In general I think the problem is even bigger because the default
> operation depends on the target eg on windows when you drag a file
> between 2 folders on the same filesystem you get a default MOVE but if
> you drag to another one the default is a COPY and SHIFT makes it a MOVE.
>
> JavaFX does all that right but what it gets wrong is the default
> operation. Any thoughts on this? Did we miss something obvious?
>
> The simple application below is how to reproduce.
>
>> package application;
>>
>>
>> import javafx.application.Application;
>> import javafx.scene.Scene;
>> import javafx.scene.input.ClipboardContent;
>> import javafx.scene.input.DataFormat;
>> import javafx.scene.input.DragEvent;
>> import javafx.scene.input.Dragboard;
>> import javafx.scene.input.MouseEvent;
>> import javafx.scene.input.TransferMode;
>> import javafx.scene.layout.BorderPane;
>> import javafx.stage.Stage;
>>
>>
>> public class Main extends Application {
>>
>> private BorderPane root;
>> @Override
>> public void start(Stage primaryStage) {
>> try {
>> root = new BorderPane();
>> Scene scene = new Scene(root,400,400);
>> scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
>> primaryStage.setScene(scene);
>> primaryStage.show();
>>
>> root.setOnDragDetected(this::onDragDetected);
>> root.setOnDragOver(this::onDragOver);
>> root.setOnDragDropped(this::onDragDropped);
>> root.setOnDragDone(this::onDragDone);
>>
>> } catch(Exception e) {
>> e.printStackTrace();
>> }
>> }
>>
>> public static void main(String[] args) {
>> launch(args);
>> }
>>
>> private final DataFormat f = new DataFormat() {
>> };
>>
>> private void onDragDetected(MouseEvent event) {
>> System.err.println(this + " onDragDetected");
>> Dragboard db = root.startDragAndDrop(TransferMode.ANY);
>>
>> ClipboardContent c = new ClipboardContent();
>> c.putString("Hello world");
>> db.setContent(c);
>> event.consume();
>> }
>>
>> private void onDragOver(DragEvent event) {
>> event.getTransferMode();
>> event.acceptTransferModes(TransferMode.ANY);
>> System.err.println(event.getTransferMode());
>> // System.err.println("onDragOver " + event.getAcceptedTransferMode());
>> event.consume();
>> }
>>
>> private void onDragDropped(DragEvent event) {
>> System.err.println(this + " onDragDropped " + event.getAcceptedTransferMode());
>> event.setDropCompleted(true);
>> event.consume();
>> }
>>
>> private void onDragDone(DragEvent event) {
>> System.err.println(this + " onDragDone " + event.getAcceptedTransferMode());
>> System.err.println("payload: " + event.getDragboard().getString());
>> event.consume();
>> }
>> }
>
>
--
David Hill<David.Hill at Oracle.com>
Java Embedded Development
"A man's feet should be planted in his country, but his eyes should survey the world."
-- George Santayana (1863 - 1952)
More information about the openjfx-dev
mailing list