Hi, 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(); > } > } -- Thomas Schindl, CTO BestSolution.at EDV Systemhaus GmbH Eduard-Bodem-Gasse 5-7, A-6020 Innsbruck http://www.bestsolution.at/ Reg. Nr. FN 222302s am Firmenbuchgericht Innsbruck