/*******************************************************************************
 * Copyright (c) 2006, 2012 Oracle 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:
 *     Oracle Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.bpel.ui.dnd;

import org.eclipse.bpel.ui.BPELEditor;
import org.eclipse.emf.common.util.URI;
import org.eclipse.gef.GraphicalViewer;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;



/**
 * @author Michal Chmielewski (michal.chmielewski@oracle.com)
 * @date Nov 16, 2006
 *
 */
public class TextDropTargetListener extends FileDropTargetListener {
	
	/**
	 * 
	 * @param viewer
	 * @param editor
	 */
	
	public TextDropTargetListener ( GraphicalViewer viewer, BPELEditor editor) {
		super( viewer, editor );	
	}
	
	

	/** (non-Javadoc)
	 * @see org.eclipse.swt.dnd.DropTargetListener#drop(org.eclipse.swt.dnd.DropTargetEvent)
	 */
	@SuppressWarnings("nls")
	@Override
	public void drop (DropTargetEvent event) {
		
		 if (getTransfer().isSupportedType(event.currentDataType)) {
		     String data = (String) getTextTransfer().nativeToJava(event.currentDataType);
		     if (data == null) {
		    	 return ;
		     }		     
		     data = data.trim();
		     
		     // Ignore non-url drops.
		     if (data.startsWith("http://") == false &&  
		    	 data.startsWith("https://") == false &&		    	 
		         data.startsWith("ftp://") == false &&
		         data.startsWith("ftps://") == false ) 
		     {
		    	 return ;
		     }
		     
		     
		     URI uri = null;
		     try {
		    	 uri = URI.createURI(data);
		    	 startImport();
		    	 addImport( attemptLoad ( uri ), uri );
		    	 endImport(event);
		    	 
		     } catch (Throwable t) {
		    	 
		    	 return ; 
		     }		     	
		     		    
		}
		
	}



	/** (non-Javadoc)
	 * @see org.eclipse.jface.util.TransferDropTargetListener#getTransfer()
	 */
	@Override
	public Transfer getTransfer() {		
		return TextTransfer.getInstance();
	}
	
	/**
	 * This only here because nativeToJava() in Transfer is protected.
	 * 
	 * @return the text transfer instance.
	 */
	
	public TextTransfer getTextTransfer () {
		return (TextTransfer) getTransfer();
	}
	
	/** (non-Javadoc)
	 * @see org.eclipse.jface.util.TransferDropTargetListener#isEnabled(org.eclipse.swt.dnd.DropTargetEvent)
	 */
	@Override
	public boolean isEnabled (DropTargetEvent event) {
		if (TextTransfer.getInstance().isSupportedType(event.currentDataType)) {			
			String data = (String) TextTransfer.getInstance().nativeToJava(event.currentDataType);
			if (data == null) {
				return false;
			}
			data = data.trim();
			return data.startsWith("http://") || data.startsWith("https://");		
		}
		return false;
	}
	
}
