/*******************************************************************************
 * Copyright (c) 2004, 2005 Sybase, Inc. 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:
 *     Sybase, Inc. - initial API and implementation
 *******************************************************************************/

package org.eclipse.jst.jsf.facesconfig.ui.pageflow;

import org.eclipse.core.resources.IResource;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPartViewer;
import org.eclipse.gef.Request;
import org.eclipse.gef.dnd.AbstractTransferDropTargetListener;
import org.eclipse.gef.requests.CreateRequest;
import org.eclipse.gef.requests.CreationFactory;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jst.jsf.facesconfig.ui.FacesConfigEditor;
import org.eclipse.jst.jsf.facesconfig.ui.util.WebrootUtil;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.ui.part.ResourceTransfer;
import org.eclipse.ui.views.navigator.LocalSelectionTransfer;

/**
 * This is the listener for resource drag and drop operations
 * 
 */
public abstract class ResourceTransferDropTargetListener extends
		AbstractTransferDropTargetListener {
	/** the pageflow editor */
	private IEditorPart editor = null;

	/**
	 * Creates a new ResourceTransferDropTargetListener instance.
	 * 
	 * @param viewer -
	 *            target pageflow editor view.
	 */
	public ResourceTransferDropTargetListener(EditPartViewer viewer,
			IEditorPart editor) {
		super(viewer, ResourceTransfer.getInstance());

		this.editor = editor;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see AbstractTransferDropTargetListener#createTargetRequest()
	 */
	protected Request createTargetRequest() {
		CreateRequest request = new CreateRequest();
		if (getCurrentEvent().data == null) {
			request.setFactory(getFactory(null));
		} else {
			IResource[] resources = (IResource[]) getCurrentEvent().data;
			request.setFactory(getFactory(resources[0]));
		}
		return request;
	}

	/**
	 * get the request for creating a new resource object
	 * 
	 * @return - creation request
	 */
	protected final CreateRequest getCreateRequest() {
		return (CreateRequest) getTargetRequest();
	}

	/**
	 * get creation factory for resource object, which should be implemented.
	 * 
	 * @param obj -
	 *            resource object
	 * @return - creation factory for resource object
	 */
	abstract protected CreationFactory getFactory(Object obj);

	/*
	 * (non-Javadoc)
	 * 
	 * @see AbstractTransferDropTargetListener#handleDragOperationChanged()
	 */
	protected void handleDragOperationChanged() {
		getCurrentEvent().detail = DND.DROP_COPY;
		super.handleDragOperationChanged();
	}

	/**
	 * get the current transfered local selection object.
	 * 
	 * @return
	 */
	private Object getCurrentLocalObject() {
		ISelection sel = LocalSelectionTransfer.getInstance().getSelection();
		if (sel instanceof IStructuredSelection) {
			return ((IStructuredSelection) sel).getFirstElement();
		}
		return null;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see AbstractTransferDropTargetListener#handleDragOver()
	 */
	protected void handleDragOver() {
		if (!isValidJSFFile(getCurrentLocalObject())) {
			getCurrentEvent().detail = DND.ERROR_INVALID_DATA;
		} else {
			getCurrentEvent().detail = DND.DROP_COPY;
		}
		getCurrentEvent().feedback = DND.FEEDBACK_SCROLL | DND.FEEDBACK_EXPAND;
		super.handleDragOver();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see AbstractTransferDropTargetListener#handleDrop()
	 */
	protected void handleDrop() {
		getCurrentEvent().detail = DND.DROP_COPY;
		super.handleDrop();
		// because the handle drop can change this event to DND.DROP_NONE
		if (getCurrentEvent().detail == DND.DROP_COPY) {
			selectAddedObject();
		}
	}

	/**
	 * select the new drag and drop object in the pageflow view.
	 */
	private void selectAddedObject() {
		Object model = getCreateRequest().getNewObject();
		if (null == model) {
			return;
		}
		EditPartViewer viewer = getViewer();
		Object editpart = viewer.getEditPartRegistry().get(model);
		if (editpart instanceof EditPart) {
			viewer.flush();
			viewer.select((EditPart) editpart);
			// Activate the editor window
			PlatformUI.getWorkbench().getActiveWorkbenchWindow()
					.getActivePage().activate((FacesConfigEditor) editor);
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see AbstractTransferDropTargetListener#updateTargetRequest()
	 */
	protected void updateTargetRequest() {
		CreateRequest request = getCreateRequest();
		request.setLocation(getDropLocation());
	}

	/**
	 * Allow drop if any of these types in the drop data, which can be jsp file
	 * or a sub folder of the webroot folder.
	 * 
	 */
	private boolean isValidJSFFile(Object resource) {
		if (resource == null || !(resource instanceof IResource)) {
			return false;
		}

		if (((IResource) resource).getProject() == ((FileEditorInput) editor
				.getEditorInput()).getFile().getProject()) {
			if (WebrootUtil.getWebPath(((IResource) resource).getFullPath())
					.length() > 0) {
				return true;
			}
		}
		return false;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see AbstractTransferDropTargetListener#isEnabled()
	 */
	public boolean isEnabled(DropTargetEvent dropTargetEvent) {
		if (super.isEnabled(dropTargetEvent)) {
			if (dropTargetEvent.data != null) {
				IResource[] resources = (IResource[]) dropTargetEvent.data;
				// The resource should be under the same project of the current
				// faces-config file
				if (isValidJSFFile(resources[0])) {
					return true;
				}
				return false;
			}
			// If no data, can't verify, so allow the drop
			return true;
		}
		return false;
	}
}
