Skip to main content
aboutsummaryrefslogtreecommitdiffstats
blob: eabba44f9520d4ee7ecb97f592b6ca34c3651ccf (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/*******************************************************************************
 *  Copyright (c) 2007, 2010 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.p2.ui.viewers;

import java.util.*;
import org.eclipse.equinox.internal.p2.ui.ProvUI;
import org.eclipse.equinox.p2.metadata.IInstallableUnit;
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.
	 */
	@Override
	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.
	 */
	@Override
	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<IInstallableUnit> 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 = ProvUI.getAdapter(iter.next(), IInstallableUnit.class);
			if (iu != null) {
				ius.add(iu);
			}
		}
		return ius.toArray(new IInstallableUnit[ius.size()]);
	}

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

Back to the top