| /******************************************************************************* |
| * 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; |
| } |
| } |