/**
* Copyright (c) 2016 committers of YAKINDU and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
* Contributors:
* committers of YAKINDU - initial API and implementation
*
*/
package org.yakindu.sct.examples.wizard.drop;
import org.eclipse.jface.util.Util;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DropTarget;
import org.eclipse.swt.dnd.DropTargetAdapter;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.TransferData;
import org.eclipse.swt.dnd.URLTransfer;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;
import org.yakindu.sct.examples.wizard.ExampleWizard;
/**
* Mostly copied from
* {@link org.eclipse.epp.internal.mpc.ui.wizards.MarketplaceDropAdapter}.
*
* @author Thomas Kutz - Adjusted {@link #proceedInstallation(String)} method to
* open example wizard with preselected example based on dropped URL.
*
*/
public class ExampleDropTargetListener extends DropTargetAdapter {
private static final int[] PREFERRED_DROP_OPERATIONS = {DND.DROP_DEFAULT, DND.DROP_COPY, DND.DROP_MOVE,
DND.DROP_LINK};
@Override
public void dragEnter(DropTargetEvent e) {
updateDragDetails(e);
}
@Override
public void dragOver(DropTargetEvent e) {
updateDragDetails(e);
}
@Override
public void dragLeave(DropTargetEvent e) {
if (e.detail == DND.DROP_NONE) {
setDropOperation(e);
}
}
@Override
public void dropAccept(DropTargetEvent e) {
updateDragDetails(e);
}
@Override
public void dragOperationChanged(DropTargetEvent e) {
updateDragDetails(e);
}
private void setDropOperation(DropTargetEvent e) {
int allowedOperations = e.operations;
for (int op : PREFERRED_DROP_OPERATIONS) {
if ((allowedOperations & op) != 0) {
e.detail = op;
return;
}
}
e.detail = allowedOperations;
}
private void updateDragDetails(DropTargetEvent e) {
if (dropTargetIsValid(e, false)) {
setDropOperation(e);
}
}
private boolean dropTargetIsValid(DropTargetEvent e, boolean isDrop) {
if (URLTransfer.getInstance().isSupportedType(e.currentDataType)) {
// on Windows, we get the URL already during drag operations...
// FIXME find a way to check the URL early on other platforms,
// too...
if (isDrop || Util.isWindows()) {
if (e.data == null && !extractEventData(e)) {
// ... but if we don't, it's no problem, unless this is
// already
// the final drop event
return !isDrop;
}
final String url = getUrl(e.data);
if (!ExampleURLHandler.isValidExample(url)) {
return false;
}
}
return true;
}
return false;
}
private boolean extractEventData(DropTargetEvent e) {
TransferData transferData = e.currentDataType;
if (transferData != null) {
Object data = URLTransfer.getInstance().nativeToJava(transferData);
if (data != null && getUrl(data) != null) {
e.data = data;
return true;
}
}
return false;
}
@Override
public void drop(DropTargetEvent event) {
if (!URLTransfer.getInstance().isSupportedType(event.currentDataType)) {
return;
}
final String url = getUrl(event.data);
if (ExampleURLHandler.isValidExample(url)) {
DropTarget source = (DropTarget) event.getSource();
Display display = source.getDisplay();
display.asyncExec(new Runnable() {
public void run() {
proceedInstallation(url);
}
});
}
}
protected void proceedInstallation(String url) {
createWizardDialog(ExampleURLHandler.extractExampleId(url));
}
private void createWizardDialog(String exampleId) {
Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
ExampleWizard exampleWizard = new ExampleWizard(exampleId);
WizardDialog dialog = new WizardDialog(shell, exampleWizard);
dialog.open();
}
private String getUrl(Object eventData) {
if (eventData == null) {
return null;
}
if (eventData == null || !(eventData instanceof String)) {
return null;
}
// Depending on the form the link and browser/os,
// we get the url twice in the data separated by new lines
String[] dataLines = ((String) eventData).split(System.getProperty("line.separator")); //$NON-NLS-1$
String url = dataLines[0];
return url;
}
}