View Javadoc
1   package org.argeo.eclipse.ui.specific;
2   
3   import java.io.IOException;
4   import java.io.InputStream;
5   
6   import org.eclipse.rap.fileupload.FileDetails;
7   import org.eclipse.rap.fileupload.FileUploadHandler;
8   import org.eclipse.rap.fileupload.FileUploadReceiver;
9   import org.eclipse.rap.rwt.RWT;
10  import org.eclipse.rap.rwt.client.ClientFile;
11  import org.eclipse.rap.rwt.client.service.ClientFileUploader;
12  import org.eclipse.rap.rwt.dnd.ClientFileTransfer;
13  import org.eclipse.swt.dnd.DND;
14  import org.eclipse.swt.dnd.DropTarget;
15  import org.eclipse.swt.dnd.DropTargetAdapter;
16  import org.eclipse.swt.dnd.DropTargetEvent;
17  import org.eclipse.swt.dnd.Transfer;
18  import org.eclipse.swt.widgets.Control;
19  
20  /** Configures a {@link Control} to receive files drop from the client OS. */
21  public class FileDropAdapter {
22  
23  	public void prepareDropTarget(Control control, DropTarget dropTarget) {
24  		dropTarget.setTransfer(new Transfer[] { ClientFileTransfer.getInstance() });
25  		dropTarget.addDropListener(new DropTargetAdapter() {
26  			private static final long serialVersionUID = 5361645765549463168L;
27  
28  			@Override
29  			public void dropAccept(DropTargetEvent event) {
30  				if (!ClientFileTransfer.getInstance().isSupportedType(event.currentDataType)) {
31  					event.detail = DND.DROP_NONE;
32  				}
33  			}
34  
35  			@Override
36  			public void drop(DropTargetEvent event) {
37  				handleFileDrop(control, event);
38  			}
39  		});
40  	}
41  
42  	public void handleFileDrop(Control control, DropTargetEvent event) {
43  		ClientFile[] clientFiles = (ClientFile[]) event.data;
44  		ClientFileUploader service = RWT.getClient().getService(ClientFileUploader.class);
45  //		DiskFileUploadReceiver receiver = new DiskFileUploadReceiver();
46  		FileUploadReceiver receiver = new FileUploadReceiver() {
47  
48  			@Override
49  			public void receive(InputStream stream, FileDetails details) throws IOException {
50  				control.getDisplay().syncExec(() -> {
51  					try {
52  						processUpload(stream, details.getFileName(), details.getContentType());
53  					} catch (IOException e) {
54  						throw new IllegalStateException("Cannot process upload of " + details.getFileName(), e);
55  					}
56  				});
57  			}
58  		};
59  		FileUploadHandler handler = new FileUploadHandler(receiver);
60  //		    handler.setMaxFileSize( sizeLimit );
61  //		    handler.setUploadTimeLimit( timeLimit );
62  		service.submit(handler.getUploadUrl(), clientFiles);
63  //		for (File file : receiver.getTargetFiles()) {
64  //			paths.add(file.toPath());
65  //		}
66  	}
67  
68  	/** Executed in UI thread */
69  	protected void processUpload(InputStream in, String fileName, String contentType) throws IOException {
70  
71  	}
72  
73  }