blob: 8b9e2d1abcbf50df6a1ea67a7f77cda1d27314f4 [file] [log] [blame]
/*******************************************************************************
* 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.core.runtime.*;
import org.eclipse.equinox.internal.p2.ui.ProvUIActivator;
import org.eclipse.equinox.internal.p2.ui.ProvUIMessages;
import org.eclipse.equinox.internal.provisional.p2.engine.IProfile;
import org.eclipse.equinox.internal.provisional.p2.metadata.IInstallableUnit;
import org.eclipse.equinox.internal.provisional.p2.ui.ProvUI;
import org.eclipse.equinox.internal.provisional.p2.ui.actions.InstallAction;
import org.eclipse.equinox.internal.provisional.p2.ui.model.InstalledIUElement;
import org.eclipse.equinox.internal.provisional.p2.ui.policy.Policies;
import org.eclipse.jface.util.LocalSelectionTransfer;
import org.eclipse.jface.viewers.*;
import org.eclipse.swt.dnd.*;
import org.eclipse.swt.widgets.Shell;
/**
* Defines drop behavior for selected IUs to mean install the IU on the target
* profile.
*
* @since 3.4
*
*/
public class InstallIUDropAdapter extends ViewerDropAdapter {
static boolean DEBUG = false;
Policies policies;
/**
* Constructs a new drop adapter.
*
* @param viewer
* the navigator's viewer
*/
public InstallIUDropAdapter(StructuredViewer viewer, Policies policies) {
super(viewer);
Assert.isNotNull(policies);
this.policies = policies;
}
/**
* Returns an error status with the given info.
*/
IStatus error(String message) {
return error(message, null);
}
/**
* Returns an error status with the given info.
*/
IStatus error(String message, Throwable exception) {
return new Status(IStatus.ERROR, ProvUIActivator.PLUGIN_ID, 0, message, exception);
}
/**
* Returns the target profile id for the drop. If the drop is positioned on an
* IU, return its parent profile id.
*/
private String getProfileTarget(Object mouseTarget) {
IProfile profile = (IProfile) ProvUI.getAdapter(mouseTarget, IProfile.class);
if (profile != null) {
return profile.getProfileId();
}
if (mouseTarget instanceof InstalledIUElement) {
return ((InstalledIUElement) mouseTarget).getProfileId();
}
return null;
}
/**
* Returns the shell
*/
private Shell getShell() {
return getViewer().getControl().getShell();
}
/**
* Returns an status indicating success.
*/
private IStatus ok() {
return new Status(IStatus.OK, ProvUIActivator.PLUGIN_ID, 0, null, null);
}
/**
* Perform the drop.
*
* @see org.eclipse.swt.dnd.DropTargetListener#drop(org.eclipse.swt.dnd.DropTargetEvent)
*/
public boolean performDrop(final Object data) {
if (DEBUG) {
System.out.println("Perform drop on target: " + getCurrentTarget() + " with data: " + data); //$NON-NLS-1$//$NON-NLS-2$
}
if (getCurrentTarget() == null || data == null)
return false;
ISelection selection = LocalSelectionTransfer.getTransfer().getSelection();
if (!(selection instanceof IStructuredSelection) || selection.isEmpty())
return false;
String profileId = getProfileTarget(getCurrentTarget());
if (getCurrentOperation() == DND.DROP_COPY && profileId != null) {
final IStructuredSelection structuredSelection = (IStructuredSelection) selection;
ISelectionProvider selectionProvider = new ISelectionProvider() {
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
*/
public void addSelectionChangedListener(ISelectionChangedListener listener) {
// Ignore because the selection won't change
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
*/
public ISelection getSelection() {
if (DEBUG) {
System.out.println("Selection was queried by action"); //$NON-NLS-1$
System.out.println(structuredSelection.toString());
}
return structuredSelection;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
*/
public void removeSelectionChangedListener(ISelectionChangedListener listener) {
// ignore because the selection is static
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
*/
public void setSelection(ISelection sel) {
throw new UnsupportedOperationException("This ISelectionProvider is static, and cannot be modified."); //$NON-NLS-1$
}
};
InstallAction action = new InstallAction(selectionProvider, profileId, null, policies, getShell());
if (DEBUG)
System.out.println("Running install action"); //$NON-NLS-1$
action.run();
return true;
}
return false;
}
/**
* Validate whether the drop is valid for the target
*/
public boolean validateDrop(Object target, int dragOperation, TransferData transferType) {
if (LocalSelectionTransfer.getTransfer().isSupportedType(transferType)) {
IStatus status = validateTarget(target, transferType);
if (DEBUG) {
System.out.println("Validate target: " + status); //$NON-NLS-1$
}
return status.isOK();
}
return false;
}
/*
* Overridden to force a copy when the drag is valid.
*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.ViewerDropAdapter#dragEnter(org.eclipse.swt.dnd.DropTargetEvent)
*/
public void dragEnter(DropTargetEvent event) {
event.detail = DND.DROP_COPY;
super.dragEnter(event);
}
/**
* Ensures that the drop target meets certain criteria
*/
private IStatus validateTarget(Object target, TransferData transferType) {
if (LocalSelectionTransfer.getTransfer().isSupportedType(transferType)) {
IInstallableUnit[] ius = getSelectedIUs();
if (ius.length == 0) {
return error(ProvUIMessages.ProvDropAdapter_NoIUsToDrop);
}
if (getProfileTarget(target) != null) {
return ok();
}
return error(ProvUIMessages.ProvDropAdapter_InvalidDropTarget);
}
return error(ProvUIMessages.ProvDropAdapter_UnsupportedDropOperation);
}
/**
* Returns the resource selection from the LocalSelectionTransfer.
*
* @return the resource selection from the LocalSelectionTransfer
*/
private IInstallableUnit[] getSelectedIUs() {
ISelection selection = LocalSelectionTransfer.getTransfer().getSelection();
List ius = new ArrayList();
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()]);
}
}