/******************************************************************************* * Copyright (c) 2008, 2009 IBM Corporation 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: * IBM Corporation - initial API and implementation * EclipseSource - Bug 223991 - [ui] Drag n' Drop does not work on certain platforms ******************************************************************************/ package org.eclipse.equinox.internal.p2.ui.dialogs; import java.net.URI; import java.net.URISyntaxException; import org.eclipse.core.runtime.URIUtil; import org.eclipse.equinox.internal.p2.repository.helpers.RepositoryHelper; import org.eclipse.jface.util.Util; import org.eclipse.swt.dnd.*; /** * URLDropAdapter can receive URL text from a drop. * The URLDropAdapter should only be used with * the URLTransfer mechanism unless otherwise stated. * * @since 3.4 * */ public abstract class URLDropAdapter extends DropTargetAdapter { private boolean convertFileToURL = false; protected URLDropAdapter(boolean convertFileToURL) { this.convertFileToURL = convertFileToURL; } public void dragEnter(DropTargetEvent e) { if (!dropTargetIsValid(e)) { e.detail = DND.DROP_NONE; return; } if (e.detail == DND.DROP_NONE) e.detail = DND.DROP_LINK; } public void dragOperationChanged(DropTargetEvent e) { if (e.detail == DND.DROP_NONE) e.detail = DND.DROP_LINK; } public void drop(DropTargetEvent event) { if (dropTargetIsValid(event)) { String urlText = getURLText(event); if (urlText != null) { handleDrop(urlText, event); return; } } event.detail = DND.DROP_NONE; } private String getURLText(DropTargetEvent event) { if (URLTransfer.getInstance().isSupportedType(event.currentDataType)) return (String) URLTransfer.getInstance().nativeToJava(event.currentDataType); if (convertFileToURL && FileTransfer.getInstance().isSupportedType(event.currentDataType)) { String[] names = (String[]) FileTransfer.getInstance().nativeToJava(event.currentDataType); if (names != null && names.length == 1) { URI potentialLocation; try { potentialLocation = URIUtil.fromString(names[0]); return URIUtil.toUnencodedString(RepositoryHelper.localRepoURIHelper(potentialLocation)); } catch (URISyntaxException e) { return names[0]; } } } return null; } /** * Determine whether the drop target is valid. Subclasses may override. * @param event the drop target event * @return <code>true</code> if drop should proceed, <code>false</code> if it should not. */ protected boolean dropTargetIsValid(DropTargetEvent event) { if (URLTransfer.getInstance().isSupportedType(event.currentDataType) && dropTargetDataIsValid(event)) return true; if (!convertFileToURL) return false; if (FileTransfer.getInstance().isSupportedType(event.currentDataType)) { String[] names = (String[]) FileTransfer.getInstance().nativeToJava(event.currentDataType); return names != null && names.length == 1; } return false; } /** * Determine whether the drop target data is valid. On some platforms this cannot be detected, * in which which case we return true. * @param event the drop target event * @return <code>true</code> if data is valid, (or can not be determined), <code>false</code> otherwise. */ protected boolean dropTargetDataIsValid(DropTargetEvent event) { if (Util.isWindows()) return URLTransfer.getInstance().nativeToJava(event.currentDataType) != null; return true; } /** * Handle the drop with the given text as the URL. * @param urlText The url text specified by the drop. It is never <code>null</code>. * @param event the originating drop target event. */ protected abstract void handleDrop(String urlText, DropTargetEvent event); }