/*******************************************************************************
 * Copyright (c) 2007, 2008 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
 *******************************************************************************/
package org.eclipse.equinox.internal.provisional.p2.ui.viewers;

import java.util.*;
import org.eclipse.equinox.internal.provisional.p2.metadata.IInstallableUnit;
import org.eclipse.equinox.internal.provisional.p2.ui.ProvUI;
import org.eclipse.jface.util.LocalSelectionTransfer;
import org.eclipse.jface.viewers.*;
import org.eclipse.swt.dnd.*;
import org.eclipse.swt.widgets.Control;

/**
 * *Implements drag behaviour when IU items are dragged from a repository view.
 * 
 * @since 3.4
 */
public class IUDragAdapter extends DragSourceAdapter {

	ISelectionProvider selectionProvider;

	/**
	 * Constructs a new drag adapter.
	 * 
	 * @param provider
	 *            The selection provider
	 */
	public IUDragAdapter(ISelectionProvider provider) {
		selectionProvider = provider;
	}

	/**
	 * Set the drag data to represent the local selection of IU's if possible.
	 * Fallback to using a text description of each IU.
	 */
	public void dragSetData(DragSourceEvent event) {
		IInstallableUnit[] ius = getSelectedIUs();

		if (ius == null || ius.length == 0) {
			return;
		}

		// use local selection transfer if possible
		if (LocalSelectionTransfer.getTransfer().isSupportedType(event.dataType)) {
			event.data = LocalSelectionTransfer.getTransfer().getSelection();
			return;
		}
		// resort to a text transfer
		if (!TextTransfer.getInstance().isSupportedType(event.dataType)) {
			return;
		}

		// Get a text description of each IU and set as the drag data
		final StringBuffer buffer = new StringBuffer();

		for (int i = 0; i < ius.length; i++) {
			buffer.append(ius[i].toString());
			buffer.append('\n');
		}
		event.data = buffer.toString();
	}

	/**
	 * Start the drag only if the selection contains IUs.
	 */
	public void dragStart(DragSourceEvent event) {

		// Focus workaround copied from navigator drag adapter
		DragSource dragSource = (DragSource) event.widget;
		Control control = dragSource.getControl();
		if (control != control.getDisplay().getFocusControl()) {
			event.doit = false;
			return;
		}

		// Check the selection
		IStructuredSelection selection = (IStructuredSelection) selectionProvider.getSelection();
		// No drag if nothing is selected
		if (selection.isEmpty()) {
			event.doit = false;
			return;
		}
		if (!areOnlyIUsSelected(selection)) {
			event.doit = false;
			return;
		}
		LocalSelectionTransfer.getTransfer().setSelection(selection);
		event.doit = true;
	}

	private IInstallableUnit[] getSelectedIUs() {
		List ius = new ArrayList();

		ISelection selection = selectionProvider.getSelection();
		if (!(selection instanceof IStructuredSelection) || selection.isEmpty()) {
			return null;
		}
		IStructuredSelection structuredSelection = (IStructuredSelection) selection;

		Iterator iter = structuredSelection.iterator();
		while (iter.hasNext()) {
			IInstallableUnit iu = (IInstallableUnit) ProvUI.getAdapter(iter.next(), IInstallableUnit.class);
			if (iu != null) {
				ius.add(iu);
			}
		}
		return (IInstallableUnit[]) ius.toArray(new IInstallableUnit[ius.size()]);
	}

	private boolean areOnlyIUsSelected(IStructuredSelection selection) {
		Iterator iter = selection.iterator();
		while (iter.hasNext()) {
			IInstallableUnit iu = (IInstallableUnit) ProvUI.getAdapter(iter.next(), IInstallableUnit.class);
			if (iu == null) {
				return false;
			}
		}
		return true;
	}
}
