Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.
View | Details | Raw Unified | Return to bug 101993 | Differences between
and this patch

Collapse All | Expand All

(-)ui/org/eclipse/jdt/internal/ui/javaeditor/JavaOutlinePage.java (-10 / +10 lines)
Lines 43-52 Link Here
43
import org.eclipse.jface.action.MenuManager;
43
import org.eclipse.jface.action.MenuManager;
44
import org.eclipse.jface.action.Separator;
44
import org.eclipse.jface.action.Separator;
45
import org.eclipse.jface.preference.IPreferenceStore;
45
import org.eclipse.jface.preference.IPreferenceStore;
46
import org.eclipse.jface.util.DelegatingDropAdapter;
46
import org.eclipse.jface.util.IPropertyChangeListener;
47
import org.eclipse.jface.util.IPropertyChangeListener;
47
import org.eclipse.jface.util.PropertyChangeEvent;
48
import org.eclipse.jface.util.PropertyChangeEvent;
48
import org.eclipse.jface.util.TransferDragSourceListener;
49
import org.eclipse.jface.util.TransferDropTargetListener;
50
import org.eclipse.jface.viewers.IBaseLabelProvider;
49
import org.eclipse.jface.viewers.IBaseLabelProvider;
51
import org.eclipse.jface.viewers.IPostSelectionProvider;
50
import org.eclipse.jface.viewers.IPostSelectionProvider;
52
import org.eclipse.jface.viewers.ISelection;
51
import org.eclipse.jface.viewers.ISelection;
Lines 121-127 Link Here
121
import org.eclipse.jdt.internal.ui.actions.AbstractToggleLinkingAction;
120
import org.eclipse.jdt.internal.ui.actions.AbstractToggleLinkingAction;
122
import org.eclipse.jdt.internal.ui.actions.CategoryFilterActionGroup;
121
import org.eclipse.jdt.internal.ui.actions.CategoryFilterActionGroup;
123
import org.eclipse.jdt.internal.ui.actions.CompositeActionGroup;
122
import org.eclipse.jdt.internal.ui.actions.CompositeActionGroup;
124
import org.eclipse.jdt.internal.ui.dnd.DelegatingDropAdapter;
125
import org.eclipse.jdt.internal.ui.dnd.JdtViewerDragAdapter;
123
import org.eclipse.jdt.internal.ui.dnd.JdtViewerDragAdapter;
126
import org.eclipse.jdt.internal.ui.packageview.SelectionTransferDragAdapter;
124
import org.eclipse.jdt.internal.ui.packageview.SelectionTransferDragAdapter;
127
import org.eclipse.jdt.internal.ui.packageview.SelectionTransferDropAdapter;
125
import org.eclipse.jdt.internal.ui.packageview.SelectionTransferDropAdapter;
Lines 1348-1363 Link Here
1348
			};
1346
			};
1349
1347
1350
		// Drop Adapter
1348
		// Drop Adapter
1351
		TransferDropTargetListener[] dropListeners= new TransferDropTargetListener[] {
1349
		DelegatingDropAdapter delegatingDropAdapter= new DelegatingDropAdapter();
1352
			new SelectionTransferDropAdapter(fOutlineViewer)
1350
		delegatingDropAdapter.addDropTargetListener(
1353
		};
1351
			new SelectionTransferDropAdapter(fOutlineViewer)			
1354
		fOutlineViewer.addDropSupport(ops | DND.DROP_DEFAULT, transfers, new DelegatingDropAdapter(dropListeners));
1352
		);
1353
		fOutlineViewer.addDropSupport(ops | DND.DROP_DEFAULT, transfers, delegatingDropAdapter);
1355
1354
1356
		// Drag Adapter
1355
		// Drag Adapter
1357
		TransferDragSourceListener[] dragListeners= new TransferDragSourceListener[] {
1356
		JdtViewerDragAdapter dragAdapter= new JdtViewerDragAdapter(fOutlineViewer);
1357
		dragAdapter.addDragSourceListener(
1358
			new SelectionTransferDragAdapter(fOutlineViewer)
1358
			new SelectionTransferDragAdapter(fOutlineViewer)
1359
		};
1359
		);
1360
		fOutlineViewer.addDragSupport(ops, transfers, new JdtViewerDragAdapter(fOutlineViewer, dragListeners));
1360
		fOutlineViewer.addDragSupport(ops, transfers, dragAdapter);
1361
	}
1361
	}
1362
	
1362
	
1363
	/**
1363
	/**
(-)ui/org/eclipse/jdt/internal/ui/packageview/FileTransferDropAdapter.java (-18 / +34 lines)
Lines 17-22 Link Here
17
import org.eclipse.swt.dnd.DropTargetEvent;
17
import org.eclipse.swt.dnd.DropTargetEvent;
18
import org.eclipse.swt.dnd.FileTransfer;
18
import org.eclipse.swt.dnd.FileTransfer;
19
import org.eclipse.swt.dnd.Transfer;
19
import org.eclipse.swt.dnd.Transfer;
20
import org.eclipse.swt.dnd.TransferData;
20
import org.eclipse.swt.widgets.Display;
21
import org.eclipse.swt.widgets.Display;
21
import org.eclipse.swt.widgets.Shell;
22
import org.eclipse.swt.widgets.Shell;
22
23
Lines 42-56 Link Here
42
class FileTransferDropAdapter extends JdtViewerDropAdapter implements TransferDropTargetListener {
43
class FileTransferDropAdapter extends JdtViewerDropAdapter implements TransferDropTargetListener {
43
	
44
	
44
	FileTransferDropAdapter(AbstractTreeViewer viewer) {
45
	FileTransferDropAdapter(AbstractTreeViewer viewer) {
45
		super(viewer, DND.FEEDBACK_SCROLL | DND.FEEDBACK_EXPAND);
46
		super(viewer);
47
		
48
		setScrollEnabled(true);
49
		setExpandEnabled(true);
50
		setFeedbackEnabled(false);
46
	}
51
	}
47
52
48
	//---- TransferDropTargetListener interface ---------------------------------------
53
	//---- TransferDropTargetListener interface ---------------------------------------
49
	
54
	
55
	/**
56
	 * {@inheritDoc}
57
	 */
50
	public Transfer getTransfer() {
58
	public Transfer getTransfer() {
51
		return FileTransfer.getInstance();
59
		return FileTransfer.getInstance();
52
	}
60
	}
53
	
61
	
62
	/**
63
	 * {@inheritDoc}
64
	 */
54
	public boolean isEnabled(DropTargetEvent event) {
65
	public boolean isEnabled(DropTargetEvent event) {
55
		Object target= event.item != null ? event.item.getData() : null;
66
		Object target= event.item != null ? event.item.getData() : null;
56
		if (target == null)
67
		if (target == null)
Lines 60-102 Link Here
60
71
61
	//---- Actual DND -----------------------------------------------------------------
72
	//---- Actual DND -----------------------------------------------------------------
62
	
73
	
63
	public void validateDrop(Object target, DropTargetEvent event, int operation) {
74
	/**
64
		event.detail= DND.DROP_NONE;
75
	 * {@inheritDoc}
65
		
76
	 */
77
	public int validateDrop(Object target, int operation, TransferData transferType) {
78
	
66
		boolean isPackageFragment= target instanceof IPackageFragment;
79
		boolean isPackageFragment= target instanceof IPackageFragment;
67
		boolean isJavaProject= target instanceof IJavaProject;
80
		boolean isJavaProject= target instanceof IJavaProject;
68
		boolean isPackageFragmentRoot= target instanceof IPackageFragmentRoot;
81
		boolean isPackageFragmentRoot= target instanceof IPackageFragmentRoot;
69
		boolean isContainer= target instanceof IContainer;
82
		boolean isContainer= target instanceof IContainer;
70
		
83
		
71
		if (!(isPackageFragment || isJavaProject || isPackageFragmentRoot || isContainer)) 
84
		if (!(isPackageFragment || isJavaProject || isPackageFragmentRoot || isContainer)) 
72
			return;
85
			return DND.DROP_NONE;
73
			
86
			
74
		if (isContainer) {
87
		if (isContainer) {
75
			IContainer container= (IContainer)target;
88
			IContainer container= (IContainer)target;
76
			if (container.isAccessible() && !Resources.isReadOnly(container))
89
			if (container.isAccessible() && !Resources.isReadOnly(container))
77
				event.detail= DND.DROP_COPY;
90
				return DND.DROP_COPY;
78
		} else {
91
		} else {
79
			IJavaElement element= (IJavaElement)target;
92
			IJavaElement element= (IJavaElement)target;
80
			if (!element.isReadOnly()) 
93
			if (!element.isReadOnly()) 
81
				event.detail= DND.DROP_COPY;
94
				return DND.DROP_COPY;
82
		}
95
		}
83
			
96
			
84
		return;	
97
		return DND.DROP_NONE;	
85
	}
98
	}
86
99
87
	public void drop(Object dropTarget, final DropTargetEvent event) {
100
	/**
101
	 * {@inheritDoc}
102
	 */
103
	public int performDrop(final Object data) {
88
		try {
104
		try {
89
			int operation= event.detail;
105
			int operation= getCurrentOperation();
90
106
91
			event.detail= DND.DROP_NONE;
92
			final Object data= event.data;
93
			if (data == null || !(data instanceof String[]) || operation != DND.DROP_COPY)
107
			if (data == null || !(data instanceof String[]) || operation != DND.DROP_COPY)
94
				return;
108
				return DND.DROP_NONE;
95
109
96
			final IContainer target= getActualTarget(dropTarget);
110
			final IContainer target= getActualTarget(getCurrentTarget());
97
			if (target == null)
111
			if (target == null)
98
				return;
112
				return DND.DROP_NONE;
99
113
			
100
			// Run the import operation asynchronously. 
114
			// Run the import operation asynchronously. 
101
			// Otherwise the drag source (e.g., Windows Explorer) will be blocked 
115
			// Otherwise the drag source (e.g., Windows Explorer) will be blocked 
102
			// while the operation executes. Fixes bug 35796.
116
			// while the operation executes. Fixes bug 35796.
Lines 104-118 Link Here
104
				public void run() {
118
				public void run() {
105
					getShell().forceActive();
119
					getShell().forceActive();
106
					new CopyFilesAndFoldersOperation(getShell()).copyFiles((String[]) data, target);
120
					new CopyFilesAndFoldersOperation(getShell()).copyFiles((String[]) data, target);
107
					// Import always performs a copy.
108
					event.detail= DND.DROP_COPY;
109
				}
121
				}
110
			});
122
			});
123
			
124
			return DND.DROP_COPY;
111
		} catch (JavaModelException e) {
125
		} catch (JavaModelException e) {
112
			String title= PackagesMessages.DropAdapter_errorTitle; 
126
			String title= PackagesMessages.DropAdapter_errorTitle; 
113
			String message= PackagesMessages.DropAdapter_errorMessage; 
127
			String message= PackagesMessages.DropAdapter_errorMessage; 
114
			ExceptionHandler.handle(e, getShell(), title, message);
128
			ExceptionHandler.handle(e, getShell(), title, message);
115
		}
129
		}
130
		
131
		return DND.DROP_NONE;
116
	}
132
	}
117
	
133
	
118
	private IContainer getActualTarget(Object dropTarget) throws JavaModelException{
134
	private IContainer getActualTarget(Object dropTarget) throws JavaModelException{
(-)ui/org/eclipse/jdt/internal/ui/packageview/PackageExplorerPart.java (-13 / +22 lines)
Lines 55-64 Link Here
55
import org.eclipse.jface.dialogs.IDialogSettings;
55
import org.eclipse.jface.dialogs.IDialogSettings;
56
import org.eclipse.jface.dialogs.MessageDialog;
56
import org.eclipse.jface.dialogs.MessageDialog;
57
import org.eclipse.jface.preference.IPreferenceStore;
57
import org.eclipse.jface.preference.IPreferenceStore;
58
import org.eclipse.jface.util.DelegatingDropAdapter;
58
import org.eclipse.jface.util.IPropertyChangeListener;
59
import org.eclipse.jface.util.IPropertyChangeListener;
59
import org.eclipse.jface.util.PropertyChangeEvent;
60
import org.eclipse.jface.util.PropertyChangeEvent;
60
import org.eclipse.jface.util.TransferDragSourceListener;
61
import org.eclipse.jface.util.TransferDropTargetListener;
62
import org.eclipse.jface.viewers.AbstractTreeViewer;
61
import org.eclipse.jface.viewers.AbstractTreeViewer;
63
import org.eclipse.jface.viewers.DoubleClickEvent;
62
import org.eclipse.jface.viewers.DoubleClickEvent;
64
import org.eclipse.jface.viewers.IContentProvider;
63
import org.eclipse.jface.viewers.IContentProvider;
Lines 137-143 Link Here
137
136
138
import org.eclipse.jdt.internal.ui.IJavaHelpContextIds;
137
import org.eclipse.jdt.internal.ui.IJavaHelpContextIds;
139
import org.eclipse.jdt.internal.ui.JavaPlugin;
138
import org.eclipse.jdt.internal.ui.JavaPlugin;
140
import org.eclipse.jdt.internal.ui.dnd.DelegatingDropAdapter;
141
import org.eclipse.jdt.internal.ui.dnd.JdtViewerDragAdapter;
139
import org.eclipse.jdt.internal.ui.dnd.JdtViewerDragAdapter;
142
import org.eclipse.jdt.internal.ui.dnd.ResourceTransferDragAdapter;
140
import org.eclipse.jdt.internal.ui.dnd.ResourceTransferDragAdapter;
143
import org.eclipse.jdt.internal.ui.filters.OutputFolderFilter;
141
import org.eclipse.jdt.internal.ui.filters.OutputFolderFilter;
Lines 893-904 Link Here
893
			LocalSelectionTransfer.getInstance(), 
891
			LocalSelectionTransfer.getInstance(), 
894
			ResourceTransfer.getInstance(),
892
			ResourceTransfer.getInstance(),
895
			FileTransfer.getInstance()};
893
			FileTransfer.getInstance()};
896
		TransferDragSourceListener[] dragListeners= new TransferDragSourceListener[] {
894
897
			new SelectionTransferDragAdapter(fViewer),
895
		JdtViewerDragAdapter dragAdapter= new JdtViewerDragAdapter(fViewer);
898
			new ResourceTransferDragAdapter(fViewer),
896
		dragAdapter.addDragSourceListener(
897
			new SelectionTransferDragAdapter(fViewer)
898
		);
899
		dragAdapter.addDragSourceListener(
900
			new ResourceTransferDragAdapter(fViewer)
901
		);
902
		dragAdapter.addDragSourceListener(
899
			new FileTransferDragAdapter(fViewer)
903
			new FileTransferDragAdapter(fViewer)
900
		};
904
		);
901
		fViewer.addDragSupport(ops, transfers, new JdtViewerDragAdapter(fViewer, dragListeners));
905
		fViewer.addDragSupport(ops, transfers, dragAdapter);
902
	}
906
	}
903
907
904
	private void initDrop() {
908
	private void initDrop() {
Lines 906-917 Link Here
906
		Transfer[] transfers= new Transfer[] {
910
		Transfer[] transfers= new Transfer[] {
907
			LocalSelectionTransfer.getInstance(), 
911
			LocalSelectionTransfer.getInstance(), 
908
			FileTransfer.getInstance()};
912
			FileTransfer.getInstance()};
909
		TransferDropTargetListener[] dropListeners= new TransferDropTargetListener[] {
913
		DelegatingDropAdapter delegatingDropAdapter= new DelegatingDropAdapter();
910
			new SelectionTransferDropAdapter(fViewer),
914
		delegatingDropAdapter.addDropTargetListener(
911
			new FileTransferDropAdapter(fViewer),
915
			new SelectionTransferDropAdapter(fViewer)
916
		);
917
		delegatingDropAdapter.addDropTargetListener(
918
			new FileTransferDropAdapter(fViewer)
919
		);
920
		delegatingDropAdapter.addDropTargetListener(	
912
			new WorkingSetDropAdapter(this)
921
			new WorkingSetDropAdapter(this)
913
		};
922
		);
914
		fViewer.addDropSupport(ops, transfers, new DelegatingDropAdapter(dropListeners));
923
		fViewer.addDropSupport(ops, transfers, delegatingDropAdapter);
915
	}
924
	}
916
925
917
	/**
926
	/**
(-)ui/org/eclipse/jdt/internal/ui/packageview/SelectionTransferDropAdapter.java (-44 / +68 lines)
Lines 18-23 Link Here
18
import org.eclipse.swt.dnd.DND;
18
import org.eclipse.swt.dnd.DND;
19
import org.eclipse.swt.dnd.DropTargetEvent;
19
import org.eclipse.swt.dnd.DropTargetEvent;
20
import org.eclipse.swt.dnd.Transfer;
20
import org.eclipse.swt.dnd.Transfer;
21
import org.eclipse.swt.dnd.TransferData;
21
import org.eclipse.swt.widgets.Shell;
22
import org.eclipse.swt.widgets.Shell;
22
23
23
import org.eclipse.jface.util.TransferDropTargetListener;
24
import org.eclipse.jface.util.TransferDropTargetListener;
Lines 52-69 Link Here
52
	private int fCanCopyElements;
53
	private int fCanCopyElements;
53
	private ISelection fSelection;
54
	private ISelection fSelection;
54
55
55
	private static final long DROP_TIME_DIFF_TRESHOLD= 150;
56
57
	public SelectionTransferDropAdapter(StructuredViewer viewer) {
56
	public SelectionTransferDropAdapter(StructuredViewer viewer) {
58
		super(viewer, DND.FEEDBACK_SCROLL | DND.FEEDBACK_EXPAND);
57
		super(viewer);
58
		
59
		setScrollEnabled(true);
60
		setExpandEnabled(true);
61
		setFeedbackEnabled(false);
59
	}
62
	}
60
63
61
	//---- TransferDropTargetListener interface ---------------------------------------
64
	//---- TransferDropTargetListener interface ---------------------------------------
62
	
65
	
66
	/**
67
	 * {@inheritDoc}
68
	 */
63
	public Transfer getTransfer() {
69
	public Transfer getTransfer() {
64
		return LocalSelectionTransfer.getInstance();
70
		return LocalSelectionTransfer.getInstance();
65
	}
71
	}
66
	
72
	
73
	/**
74
	 * {@inheritDoc}
75
	 */
67
	public boolean isEnabled(DropTargetEvent event) {
76
	public boolean isEnabled(DropTargetEvent event) {
68
		Object target= event.item != null ? event.item.getData() : null;
77
		Object target= event.item != null ? event.item.getData() : null;
69
		if (target == null)
78
		if (target == null)
Lines 73-83 Link Here
73
82
74
	//---- Actual DND -----------------------------------------------------------------
83
	//---- Actual DND -----------------------------------------------------------------
75
	
84
	
85
	/**
86
	 * {@inheritDoc}
87
	 */
76
	public void dragEnter(DropTargetEvent event) {
88
	public void dragEnter(DropTargetEvent event) {
77
		clear();
89
		clear();
78
		super.dragEnter(event);
90
		super.dragEnter(event);
79
	}
91
	}
80
	
92
	
93
	/**
94
	 * {@inheritDoc}
95
	 */
81
	public void dragLeave(DropTargetEvent event) {
96
	public void dragLeave(DropTargetEvent event) {
82
		clear();
97
		clear();
83
		super.dragLeave(event);
98
		super.dragLeave(event);
Lines 92-115 Link Here
92
		fCanCopyElements= 0;
107
		fCanCopyElements= 0;
93
	}
108
	}
94
	
109
	
95
	public void validateDrop(Object target, DropTargetEvent event, int operation) {
110
	/**
96
		event.detail= DND.DROP_NONE;
111
	 * {@inheritDoc}
97
		
112
	 */
98
		if (tooFast(event)) 
113
	public int validateDrop(Object target, int operation, TransferData transferType) {
99
			return;
100
		
114
		
101
		initializeSelection();
115
		initializeSelection();
116
		
117
		if (target == null)
118
			return DND.DROP_NONE;
119
		
120
		//Do not allow to drop on itself, bug 14228
121
		if (fElements.size() == 1) {
122
			IJavaElement[] javaElements= ReorgUtils.getJavaElements(fElements);
123
			IResource[] resources= ReorgUtils.getResources(fElements);
124
			
125
			if (javaElements.length == 1 && javaElements[0].equals(target))
126
				return DND.DROP_NONE;
127
			
128
			if (resources.length == 1 && resources[0].equals(target))
129
				return DND.DROP_NONE;
130
		}
102
				
131
				
103
		try {
132
		try {
104
			switch(operation) {
133
			switch(operation) {
105
				case DND.DROP_DEFAULT:	event.detail= handleValidateDefault(target, event); break;
134
				case DND.DROP_DEFAULT:
106
				case DND.DROP_COPY: 	event.detail= handleValidateCopy(target, event); break;
135
					return handleValidateDefault(target);
107
				case DND.DROP_MOVE: 	event.detail= handleValidateMove(target, event); break;
136
				case DND.DROP_COPY: 
137
					return handleValidateCopy(target);
138
				case DND.DROP_MOVE: 	
139
					return handleValidateMove(target);
108
			}
140
			}
109
		} catch (JavaModelException e){
141
		} catch (JavaModelException e){
110
			ExceptionHandler.handle(e, PackagesMessages.SelectionTransferDropAdapter_error_title, PackagesMessages.SelectionTransferDropAdapter_error_message); 
142
			ExceptionHandler.handle(e, PackagesMessages.SelectionTransferDropAdapter_error_title, PackagesMessages.SelectionTransferDropAdapter_error_message); 
111
			event.detail= DND.DROP_NONE;
143
		}
112
		}	
144
		
145
		return DND.DROP_NONE;
113
	}
146
	}
114
147
115
	protected void initializeSelection(){
148
	protected void initializeSelection(){
Lines 125-140 Link Here
125
	protected ISelection getSelection(){
158
	protected ISelection getSelection(){
126
		return fSelection;
159
		return fSelection;
127
	}
160
	}
128
	
129
	private boolean tooFast(DropTargetEvent event) {
130
		return Math.abs(LocalSelectionTransfer.getInstance().getSelectionSetTime() - (event.time & 0xFFFFFFFFL)) < DROP_TIME_DIFF_TRESHOLD;
131
	}	
132
161
133
	public void drop(Object target, DropTargetEvent event) {
162
	/**
163
	 * {@inheritDoc}
164
	 */
165
	public int performDrop(Object data) {
134
		try{
166
		try{
135
			switch(event.detail) {
167
			switch(getCurrentOperation()) {
136
				case DND.DROP_MOVE: handleDropMove(target, event); break;
168
				case DND.DROP_MOVE: handleDropMove(getCurrentTarget()); break;
137
				case DND.DROP_COPY: handleDropCopy(target, event); break;
169
				case DND.DROP_COPY: handleDropCopy(getCurrentTarget()); break;
138
			}
170
			}
139
		} catch (JavaModelException e){
171
		} catch (JavaModelException e){
140
			ExceptionHandler.handle(e, PackagesMessages.SelectionTransferDropAdapter_error_title, PackagesMessages.SelectionTransferDropAdapter_error_message); 
172
			ExceptionHandler.handle(e, PackagesMessages.SelectionTransferDropAdapter_error_title, PackagesMessages.SelectionTransferDropAdapter_error_message); 
Lines 142-172 Link Here
142
			ExceptionHandler.handle(e, RefactoringMessages.OpenRefactoringWizardAction_refactoring, RefactoringMessages.OpenRefactoringWizardAction_exception); 
174
			ExceptionHandler.handle(e, RefactoringMessages.OpenRefactoringWizardAction_refactoring, RefactoringMessages.OpenRefactoringWizardAction_exception); 
143
		} catch (InterruptedException e) {
175
		} catch (InterruptedException e) {
144
			//ok
176
			//ok
145
		} finally {
146
			// The drag source listener must not perform any operation
147
			// since this drop adapter did the remove of the source even
148
			// if we moved something.
149
			event.detail= DND.DROP_NONE;
150
		}
177
		}
178
		// The drag source listener must not perform any operation
179
		// since this drop adapter did the remove of the source even
180
		// if we moved something.
181
		return DND.DROP_NONE;
182
		
151
	}
183
	}
152
	
184
	
153
	private int handleValidateDefault(Object target, DropTargetEvent event) throws JavaModelException{
185
	private int handleValidateDefault(Object target) throws JavaModelException{
154
		if (target == null)
186
		int result= handleValidateMove(target);
155
			return DND.DROP_NONE;
187
		if (result != DND.DROP_NONE)
156
		
188
			return result;
157
		if ((event.operations & DND.DROP_MOVE) != 0) {
189
			
158
			return handleValidateMove(target, event);
190
		return handleValidateCopy(target);
159
		}
160
		if ((event.operations & DND.DROP_COPY) != 0) {
161
			return handleValidateCopy(target, event);
162
		}
163
		return DND.DROP_NONE;
164
	}
191
	}
165
	
192
	
166
	private int handleValidateMove(Object target, DropTargetEvent event) throws JavaModelException{
193
	private int handleValidateMove(Object target) throws JavaModelException{		
167
		if (target == null)
168
			return DND.DROP_NONE;
169
		
170
		if (fMoveProcessor == null) {
194
		if (fMoveProcessor == null) {
171
			IMovePolicy policy= ReorgPolicyFactory.createMovePolicy(ReorgUtils.getResources(fElements), ReorgUtils.getJavaElements(fElements));
195
			IMovePolicy policy= ReorgPolicyFactory.createMovePolicy(ReorgUtils.getResources(fElements), ReorgUtils.getJavaElements(fElements));
172
			if (policy.canEnable())
196
			if (policy.canEnable())
Lines 193-199 Link Here
193
		return fCanMoveElements == 2;
217
		return fCanMoveElements == 2;
194
	}
218
	}
195
219
196
	private void handleDropMove(final Object target, DropTargetEvent event) throws JavaModelException, InvocationTargetException, InterruptedException{
220
	private void handleDropMove(final Object target) throws JavaModelException, InvocationTargetException, InterruptedException{
197
		IJavaElement[] javaElements= ReorgUtils.getJavaElements(fElements);
221
		IJavaElement[] javaElements= ReorgUtils.getJavaElements(fElements);
198
		IResource[] resources= ReorgUtils.getResources(fElements);
222
		IResource[] resources= ReorgUtils.getResources(fElements);
199
		ReorgMoveStarter starter= null;
223
		ReorgMoveStarter starter= null;
Lines 205-211 Link Here
205
			starter.run(getShell());
229
			starter.run(getShell());
206
	}
230
	}
207
231
208
	private int handleValidateCopy(Object target, DropTargetEvent event) throws JavaModelException{
232
	private int handleValidateCopy(Object target) throws JavaModelException{
209
233
210
		if (fCopyProcessor == null) {
234
		if (fCopyProcessor == null) {
211
			final ICopyPolicy policy= ReorgPolicyFactory.createCopyPolicy(ReorgUtils.getResources(fElements), ReorgUtils.getJavaElements(fElements));
235
			final ICopyPolicy policy= ReorgPolicyFactory.createCopyPolicy(ReorgUtils.getResources(fElements), ReorgUtils.getJavaElements(fElements));
Lines 232-238 Link Here
232
		return fCanCopyElements == 2;
256
		return fCanCopyElements == 2;
233
	}		
257
	}		
234
	
258
	
235
	private void handleDropCopy(final Object target, DropTargetEvent event) throws JavaModelException, InvocationTargetException, InterruptedException{
259
	private void handleDropCopy(final Object target) throws JavaModelException, InvocationTargetException, InterruptedException{
236
		IJavaElement[] javaElements= ReorgUtils.getJavaElements(fElements);
260
		IJavaElement[] javaElements= ReorgUtils.getJavaElements(fElements);
237
		IResource[] resources= ReorgUtils.getResources(fElements);
261
		IResource[] resources= ReorgUtils.getResources(fElements);
238
		ReorgCopyStarter starter= null;
262
		ReorgCopyStarter starter= null;
(-)ui/org/eclipse/jdt/internal/ui/packageview/WorkingSetDropAdapter.java (-17 / +37 lines)
Lines 26-31 Link Here
26
import org.eclipse.swt.dnd.DND;
26
import org.eclipse.swt.dnd.DND;
27
import org.eclipse.swt.dnd.DropTargetEvent;
27
import org.eclipse.swt.dnd.DropTargetEvent;
28
import org.eclipse.swt.dnd.Transfer;
28
import org.eclipse.swt.dnd.Transfer;
29
import org.eclipse.swt.dnd.TransferData;
29
30
30
import org.eclipse.jface.util.TransferDropTargetListener;
31
import org.eclipse.jface.util.TransferDropTargetListener;
31
import org.eclipse.jface.viewers.ISelection;
32
import org.eclipse.jface.viewers.ISelection;
Lines 55-70 Link Here
55
	private IWorkingSet fWorkingSet;
56
	private IWorkingSet fWorkingSet;
56
57
57
	public WorkingSetDropAdapter(PackageExplorerPart part) {
58
	public WorkingSetDropAdapter(PackageExplorerPart part) {
58
		super(part.getTreeViewer(), DND.FEEDBACK_SCROLL | DND.FEEDBACK_EXPAND);
59
		super(part.getTreeViewer());
59
		fPackageExplorer= part;
60
		fPackageExplorer= part;
61
		
62
		setScrollEnabled(true);
63
		setExpandEnabled(true);
64
		setFeedbackEnabled(false);
60
	}
65
	}
61
66
62
	//---- TransferDropTargetListener interface ---------------------------------------
67
	//---- TransferDropTargetListener interface ---------------------------------------
63
	
68
	
69
	/**
70
	 * {@inheritDoc}
71
	 */
64
	public Transfer getTransfer() {
72
	public Transfer getTransfer() {
65
		return LocalSelectionTransfer.getInstance();
73
		return LocalSelectionTransfer.getInstance();
66
	}
74
	}
67
	
75
	
76
	/**
77
	 * {@inheritDoc}
78
	 */
68
	public boolean isEnabled(DropTargetEvent event) {
79
	public boolean isEnabled(DropTargetEvent event) {
69
		Object target= event.item != null ? event.item.getData() : null;
80
		Object target= event.item != null ? event.item.getData() : null;
70
		if (target == null)
81
		if (target == null)
Lines 82-104 Link Here
82
93
83
	//---- Actual DND -----------------------------------------------------------------
94
	//---- Actual DND -----------------------------------------------------------------
84
	
95
	
85
	public void validateDrop(Object target, DropTargetEvent event, int operation) {
96
	/**
86
		event.detail= DND.DROP_NONE;
97
	 * {@inheritDoc}
98
	 */
99
	public int validateDrop(Object target, int operation, TransferData transferType) {
87
		switch(operation) {
100
		switch(operation) {
88
			case DND.DROP_DEFAULT:
101
			case DND.DROP_DEFAULT:
89
			case DND.DROP_COPY:
102
			case DND.DROP_COPY:
90
			case DND.DROP_MOVE:
103
			case DND.DROP_MOVE:
91
				event.detail= validateTarget(target, operation); 
104
				return validateTarget(target, operation);
92
				break;
105
			default:
93
			case DND.DROP_LINK:
106
				return DND.DROP_NONE;
94
				event.detail= DND.DROP_NONE; 
95
				break;
96
		}
107
		}
108
		
97
	}
109
	}
98
	
110
	
99
	private int validateTarget(Object target, int operation) {
111
	private int validateTarget(Object target, int operation) {
100
		showInsertionFeedback(false);
112
		setFeedbackEnabled(false);
101
		setDefaultFeedback(DND.FEEDBACK_SCROLL | DND.FEEDBACK_EXPAND);
113
		setScrollEnabled(true);
114
		setExpandEnabled(true);
102
		if (!isValidTarget(target))
115
		if (!isValidTarget(target))
103
			return DND.DROP_NONE;
116
			return DND.DROP_NONE;
104
		ISelection s= LocalSelectionTransfer.getInstance().getSelection();
117
		ISelection s= LocalSelectionTransfer.getInstance().getSelection();
Lines 109-117 Link Here
109
		initializeState(target, s);
122
		initializeState(target, s);
110
		
123
		
111
		if (isWorkingSetSelection()) {
124
		if (isWorkingSetSelection()) {
112
			setDefaultFeedback(DND.FEEDBACK_SCROLL);
125
			setExpandEnabled(false);
113
			if (fLocation == LOCATION_BEFORE || fLocation == LOCATION_AFTER) {
126
			if (getCurrentLocation() == LOCATION_BEFORE || getCurrentLocation() == LOCATION_AFTER) {
114
				showInsertionFeedback(true);
127
				setFeedbackEnabled(true);
115
				return DND.DROP_MOVE;
128
				return DND.DROP_MOVE;
116
			}
129
			}
117
			return DND.DROP_NONE;
130
			return DND.DROP_NONE;
Lines 184-197 Link Here
184
		return true;
197
		return true;
185
	}
198
	}
186
199
187
	public void drop(Object target, final DropTargetEvent event) {
200
	/**
201
	 * {@inheritDoc}
202
	 */
203
	public int performDrop(Object data) {
188
		if (isWorkingSetSelection()) {
204
		if (isWorkingSetSelection()) {
189
			performWorkingSetReordering();
205
			performWorkingSetReordering();
190
		} else {
206
		} else {
191
			performElementRearrange(event.detail);
207
			performElementRearrange(getCurrentOperation());
192
		}
208
		}
193
		// drag adapter has nothing to do, even on move.
209
		// drag adapter has nothing to do, even on move.
194
		event.detail= DND.DROP_NONE;
210
		return DND.DROP_NONE;
195
	}
211
	}
196
212
197
	private void performWorkingSetReordering() {
213
	private void performWorkingSetReordering() {
Lines 199-205 Link Here
199
		List activeWorkingSets= new ArrayList(Arrays.asList(model.getActiveWorkingSets()));
215
		List activeWorkingSets= new ArrayList(Arrays.asList(model.getActiveWorkingSets()));
200
		int index= activeWorkingSets.indexOf(fWorkingSet);
216
		int index= activeWorkingSets.indexOf(fWorkingSet);
201
		if (index != -1) {
217
		if (index != -1) {
202
			if (fLocation == LOCATION_AFTER)
218
			if (getCurrentLocation() == LOCATION_AFTER)
203
				index++;
219
				index++;
204
			List result= new ArrayList(activeWorkingSets.size());
220
			List result= new ArrayList(activeWorkingSets.size());
205
			List selected= new ArrayList(Arrays.asList(fElementsToAdds));
221
			List selected= new ArrayList(Arrays.asList(fElementsToAdds));
Lines 267-270 Link Here
267
			performElementRearrange(eventDetail);
283
			performElementRearrange(eventDetail);
268
		}
284
		}
269
	}
285
	}
286
287
	public void internalTestSetLocation(int location) {
288
		setCurrentLocation(location);
289
	}
270
}
290
}
(-)ui/org/eclipse/jdt/internal/ui/dnd/DelegatingDragAdapter.java (-117 lines)
Removed Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2000, 2006 IBM Corporation and others.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 *
8
 * Contributors:
9
 *     IBM Corporation - initial API and implementation
10
 *******************************************************************************/
11
package org.eclipse.jdt.internal.ui.dnd;
12
13
import java.util.ArrayList;
14
import java.util.Iterator;
15
import java.util.List;
16
17
import org.eclipse.core.runtime.Assert;
18
19
import org.eclipse.swt.dnd.DragSource;
20
import org.eclipse.swt.dnd.DragSourceEvent;
21
import org.eclipse.swt.dnd.DragSourceListener;
22
import org.eclipse.swt.dnd.Transfer;
23
import org.eclipse.swt.dnd.TransferData;
24
25
import org.eclipse.jface.util.TransferDragSourceListener;
26
27
/**
28
 * A delegating drag adapter negotiates between a set of <code>TransferDragSourceListener</code>s
29
 * On <code>dragStart</code> the adapter determines the listener to be used for any further
30
 * <code>drag*</code> callback.
31
 */
32
public class DelegatingDragAdapter implements DragSourceListener {
33
34
	private TransferDragSourceListener[] fPossibleListeners;
35
	private List fActiveListeners;
36
	private TransferDragSourceListener fFinishListener;
37
	
38
	public DelegatingDragAdapter(TransferDragSourceListener[] listeners) {
39
		setPossibleListeners(listeners);
40
	}
41
	
42
	protected void setPossibleListeners(TransferDragSourceListener[] listeners) {
43
		Assert.isNotNull(listeners);
44
		Assert.isTrue(fActiveListeners == null, "Can only set possible listeners before drag operation has started"); //$NON-NLS-1$
45
		fPossibleListeners= listeners;
46
	}
47
	
48
	/* non Java-doc
49
	 * @see DragSourceListener
50
	 */
51
	public void dragStart(DragSourceEvent event) {
52
		fFinishListener= null;
53
		boolean saveDoit= event.doit;
54
		Object saveData= event.data;
55
		boolean doIt= false;
56
		List transfers= new ArrayList(fPossibleListeners.length);
57
		fActiveListeners= new ArrayList(fPossibleListeners.length);
58
		
59
		for (int i= 0; i < fPossibleListeners.length; i++) {
60
			TransferDragSourceListener listener= fPossibleListeners[i];
61
			event.doit= saveDoit;
62
			listener.dragStart(event);
63
			if (event.doit) {
64
				transfers.add(listener.getTransfer());
65
				fActiveListeners.add(listener);
66
			}
67
			doIt= doIt || event.doit;
68
		}
69
		if (doIt) {
70
			((DragSource)event.widget).setTransfer((Transfer[])transfers.toArray(new Transfer[transfers.size()]));
71
		}
72
		event.data= saveData;
73
		event.doit= doIt;
74
	}
75
76
	/* non Java-doc
77
	 * @see DragSourceListener
78
	 */
79
	public void dragSetData(DragSourceEvent event) {
80
		fFinishListener= getListener(event.dataType);
81
		if (fFinishListener != null)
82
			fFinishListener.dragSetData(event);
83
	}
84
	
85
	/* non Java-doc
86
	 * @see DragSourceListener
87
	 */
88
	public void dragFinished(DragSourceEvent event) {
89
		try{
90
			if (fFinishListener != null) {
91
				fFinishListener.dragFinished(event);
92
			} else {
93
				// If the user presses Escape then we get a dragFinished without
94
				// getting a dragSetData before.
95
				fFinishListener= getListener(event.dataType);
96
				if (fFinishListener != null)
97
					fFinishListener.dragFinished(event);
98
			}
99
		} finally{
100
			fFinishListener= null;
101
			fActiveListeners= null;
102
		}	
103
	}
104
	
105
	private TransferDragSourceListener getListener(TransferData type) {
106
		if (type == null)
107
			return null;
108
			
109
		for (Iterator iter= fActiveListeners.iterator(); iter.hasNext();) {
110
			TransferDragSourceListener listener= (TransferDragSourceListener)iter.next();
111
			if (listener.getTransfer().isSupportedType(type)) {
112
				return listener;
113
			}
114
		}
115
		return null;
116
	}	
117
}
(-)ui/org/eclipse/jdt/internal/ui/dnd/DelegatingDropAdapter.java (-270 lines)
Removed Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2000, 2006 IBM Corporation and others.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 *
8
 * Contributors:
9
 *     IBM Corporation - initial API and implementation
10
 *******************************************************************************/
11
package org.eclipse.jdt.internal.ui.dnd;
12
13
import org.eclipse.core.runtime.Assert;
14
import org.eclipse.core.runtime.SafeRunner;
15
16
import org.eclipse.swt.dnd.DND;
17
import org.eclipse.swt.dnd.DropTargetEvent;
18
import org.eclipse.swt.dnd.DropTargetListener;
19
import org.eclipse.swt.dnd.Transfer;
20
import org.eclipse.swt.dnd.TransferData;
21
22
import org.eclipse.jface.util.SafeRunnable;
23
import org.eclipse.jface.util.TransferDropTargetListener;
24
25
/**
26
 * A delegating drop adapter negotiates between a set of
27
 * <code>TransferDropTargetListener</code> s On <code>dragEnter</code> the
28
 * adapter determines the listener to be used for any further <code>drag*</code>
29
 * callback.
30
 */
31
public class DelegatingDropAdapter implements DropTargetListener {
32
33
	private TransferDropTargetListener[] fListeners;
34
	private TransferDropTargetListener fCurrentListener;
35
	private int fOriginalDropType;
36
37
	/**
38
	 * Creates a new delegating drop adapter.
39
	 * 
40
	 * @param listeners an array of potential listeners
41
	 */
42
	public DelegatingDropAdapter(TransferDropTargetListener[] listeners) {
43
		Assert.isNotNull(listeners);
44
		fListeners= listeners;
45
	}
46
47
	/**
48
	 * The cursor has entered the drop target boundaries. The current listener
49
	 * is updated, and <code>#dragEnter()</code> is forwarded to the current
50
	 * listener.
51
	 * 
52
	 * @param event the drop target event
53
	 * @see DropTargetListener#dragEnter(DropTargetEvent)
54
	 */
55
	public void dragEnter(DropTargetEvent event) {
56
		fOriginalDropType= event.detail;
57
		updateCurrentListener(event);
58
	}
59
60
	/**
61
	 * The cursor has left the drop target boundaries. The event is forwarded to
62
	 * the current listener.
63
	 * 
64
	 * @param event the drop target event
65
	 * @see DropTargetListener#dragLeave(DropTargetEvent)
66
	 */
67
	public void dragLeave(final DropTargetEvent event) {
68
		setCurrentListener(null, event);
69
	}
70
71
	/**
72
	 * The operation being performed has changed (usually due to the user
73
	 * changing a drag modifier key while dragging). Updates the current
74
	 * listener and forwards this event to that listener.
75
	 * 
76
	 * @param event the drop target event
77
	 * @see DropTargetListener#dragOperationChanged(DropTargetEvent)
78
	 */
79
	public void dragOperationChanged(final DropTargetEvent event) {
80
		fOriginalDropType= event.detail;
81
		TransferDropTargetListener oldListener= getCurrentListener();
82
		updateCurrentListener(event);
83
		final TransferDropTargetListener newListener= getCurrentListener();
84
		// only notify the current listener if it hasn't changed based on the
85
		// operation change. otherwise the new listener would get a dragEnter
86
		// followed by a dragOperationChanged with the exact same event.
87
		if (newListener != null && newListener == oldListener) {
88
			SafeRunner.run(new SafeRunnable() {
89
				public void run() throws Exception {
90
					newListener.dragOperationChanged(event);
91
				}
92
			});
93
		}
94
	}
95
96
	/**
97
	 * The cursor is moving over the drop target. Updates the current listener
98
	 * and forwards this event to that listener. If no listener can handle the
99
	 * drag operation the <code>event.detail</code> field is set to
100
	 * <code>DND.DROP_NONE</code> to indicate an invalid drop.
101
	 * 
102
	 * @param event the drop target event
103
	 * @see DropTargetListener#dragOver(DropTargetEvent)
104
	 */
105
	public void dragOver(final DropTargetEvent event) {
106
		TransferDropTargetListener oldListener= getCurrentListener();
107
		updateCurrentListener(event);
108
		final TransferDropTargetListener newListener= getCurrentListener();
109
110
		// only notify the current listener if it hasn't changed based on the
111
		// drag over. otherwise the new listener would get a dragEnter
112
		// followed by a dragOver with the exact same event.
113
		if (newListener != null && newListener == oldListener) {
114
			SafeRunner.run(new SafeRunnable() {
115
				public void run() throws Exception {
116
					newListener.dragOver(event);
117
				}
118
			});
119
		}
120
	}
121
122
	/**
123
	 * Forwards this event to the current listener, if there is one. Sets the
124
	 * current listener to <code>null</code> afterwards.
125
	 * 
126
	 * @param event the drop target event
127
	 * @see DropTargetListener#drop(DropTargetEvent)
128
	 */
129
	public void drop(final DropTargetEvent event) {
130
		updateCurrentListener(event);
131
		if (getCurrentListener() != null) {
132
			SafeRunner.run(new SafeRunnable() {
133
				public void run() throws Exception {
134
					getCurrentListener().drop(event);
135
				}
136
			});
137
		}
138
		setCurrentListener(null, event);
139
	}
140
141
	/**
142
	 * Forwards this event to the current listener if there is one.
143
	 * 
144
	 * @param event the drop target event
145
	 * @see DropTargetListener#dropAccept(DropTargetEvent)
146
	 */
147
	public void dropAccept(final DropTargetEvent event) {
148
		if (getCurrentListener() != null) {
149
			SafeRunner.run(new SafeRunnable() {
150
				public void run() throws Exception {
151
					getCurrentListener().dropAccept(event);
152
				}
153
			});
154
		}
155
	}
156
157
	/**
158
	 * Returns the listener which currently handles drop events.
159
	 * 
160
	 * @return the <code>TransferDropTargetListener</code> which currently
161
	 *         handles drop events.
162
	 */
163
	private TransferDropTargetListener getCurrentListener() {
164
		return fCurrentListener;
165
	}
166
167
	/**
168
	 * Returns the transfer data type supported by the given listener. Returns
169
	 * <code>null</code> if the listener does not support any of the specified
170
	 * data types.
171
	 * 
172
	 * @param dataTypes available data types
173
	 * @param listener <code>TransferDropTargetListener</code> to use for
174
	 *        testing supported data types.
175
	 * @return the transfer data type supported by the given listener or
176
	 *         <code>null</code>.
177
	 */
178
	private TransferData getSupportedTransferType(TransferData[] dataTypes, TransferDropTargetListener listener) {
179
		for (int i= 0; i < dataTypes.length; i++) {
180
			if (listener.getTransfer().isSupportedType(dataTypes[i])) {
181
				return dataTypes[i];
182
			}
183
		}
184
		return null;
185
	}
186
187
	/**
188
	 * Returns the combined set of <code>Transfer</code> types of all
189
	 * <code>TransferDropTargetListeners</code>.
190
	 * 
191
	 * @return the combined set of <code>Transfer</code> types
192
	 */
193
	public Transfer[] getTransfers() {
194
		Transfer[] types= new Transfer[fListeners.length];
195
		for (int i= 0; i < fListeners.length; i++) {
196
			types[i]= fListeners[i].getTransfer();
197
		}
198
		return types;
199
	}
200
201
	/**
202
	 * Sets the current listener to <code>listener</code>. Sends the given
203
	 * <code>DropTargetEvent</code> if the current listener changes.
204
	 * 
205
	 * @return <code>true</code> if the new listener is different than the
206
	 *         previous <code>false</code> otherwise
207
	 */
208
	private boolean setCurrentListener(TransferDropTargetListener listener, final DropTargetEvent event) {
209
		if (fCurrentListener == listener)
210
			return false;
211
		if (fCurrentListener != null) {
212
			SafeRunner.run(new SafeRunnable() {
213
				public void run() throws Exception {
214
					fCurrentListener.dragLeave(event);
215
				}
216
			});
217
		}
218
		fCurrentListener= listener;
219
		if (fCurrentListener != null) {
220
			SafeRunner.run(new SafeRunnable() {
221
				public void run() throws Exception {
222
					fCurrentListener.dragEnter(event);
223
				}
224
			});
225
		}
226
		return true;
227
	}
228
229
	/**
230
	 * Updates the current listener to one that can handle the drop. There can
231
	 * be many listeners and each listener may be able to handle many
232
	 * <code>TransferData</code> types. The first listener found that can
233
	 * handle a drop of one of the given <code>TransferData</code> types will
234
	 * be selected. If no listener can handle the drag operation the
235
	 * <code>event.detail</code> field is set to <code>DND.DROP_NONE</code>
236
	 * to indicate an invalid drop.
237
	 * 
238
	 * @param event the drop target event
239
	 */
240
	private void updateCurrentListener(DropTargetEvent event) {
241
		int originalDetail= event.detail;
242
		// Revert the detail to the "original" drop type that the User
243
		// indicated. This is necessary because the previous listener 
244
		// may have changed the detail to something other than what the 
245
		// user indicated.
246
		event.detail= fOriginalDropType;
247
248
		for (int i= 0; i < fListeners.length; i++) {
249
			TransferDropTargetListener listener= fListeners[i];
250
			TransferData dataType= getSupportedTransferType(event.dataTypes, listener);
251
			if (dataType != null) {
252
				TransferData originalDataType= event.currentDataType;
253
				// set the data type supported by the drop listener
254
				event.currentDataType= dataType;
255
				if (listener.isEnabled(event)) {
256
					// if the listener stays the same, set its previously
257
					// determined
258
					// event detail
259
					if (!setCurrentListener(listener, event))
260
						event.detail= originalDetail;
261
					return;
262
				} else {
263
					event.currentDataType= originalDataType;
264
				}
265
			}
266
		}
267
		setCurrentListener(null, event);
268
		event.detail= DND.DROP_NONE;
269
	}
270
}
(-)ui/org/eclipse/jdt/internal/ui/dnd/JdtViewerDropAdapter.java (-268 / +463 lines)
Lines 1-5 Link Here
1
/*******************************************************************************
1
/*******************************************************************************
2
 * Copyright (c) 2000, 2006 IBM Corporation and others.
2
 * Copyright (c) 2007 IBM Corporation and others.
3
 * All rights reserved. This program and the accompanying materials
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
5
 * which accompanies this distribution, and is available at
Lines 10-297 Link Here
10
 *******************************************************************************/
10
 *******************************************************************************/
11
package org.eclipse.jdt.internal.ui.dnd;
11
package org.eclipse.jdt.internal.ui.dnd;
12
12
13
import org.eclipse.core.runtime.Assert;
14
15
import org.eclipse.swt.dnd.DND;
13
import org.eclipse.swt.dnd.DND;
14
import org.eclipse.swt.dnd.DropTargetAdapter;
16
import org.eclipse.swt.dnd.DropTargetEvent;
15
import org.eclipse.swt.dnd.DropTargetEvent;
17
import org.eclipse.swt.dnd.DropTargetListener;
16
import org.eclipse.swt.dnd.TransferData;
18
import org.eclipse.swt.graphics.Point;
17
import org.eclipse.swt.graphics.Point;
19
import org.eclipse.swt.graphics.Rectangle;
18
import org.eclipse.swt.graphics.Rectangle;
20
import org.eclipse.swt.widgets.Item;
19
import org.eclipse.swt.widgets.Item;
21
import org.eclipse.swt.widgets.TableItem;
20
import org.eclipse.swt.widgets.TableItem;
22
import org.eclipse.swt.widgets.TreeItem;
21
import org.eclipse.swt.widgets.TreeItem;
23
22
24
import org.eclipse.jface.viewers.StructuredViewer;
23
import org.eclipse.jface.viewers.ISelection;
24
import org.eclipse.jface.viewers.IStructuredSelection;
25
import org.eclipse.jface.viewers.Viewer;
25
26
26
/**
27
/**
27
 * A drag and drop adapter to be used together with structured viewers.
28
 * This adapter class provides generic drag-and-drop support for a viewer.
28
 * The adapater delegates the <code>dragEnter</code>, <code>dragOperationChanged
29
 * <p>
29
 * </code>, <code>dragOver</code> and <code>dropAccept</code> method to the
30
 * Subclasses must implement the following methods:
30
 * <code>validateDrop</code> method. Furthermore it adds location feedback.
31
 * <ul>
32
 *   <li><code>validateDrop</code> - identifies valid drop targets in viewer</li>
33
 *   <li><code>performDrop</code> - carries out a drop into a viewer</li>
34
 * </ul>
35
 * The <code>setFeedbackEnabled</code> method can be called to turn on and off 
36
 * visual insertion feedback (on by default).
37
 * </p>
38
 * <p>
39
 * THIS IS (ALMOST) A ONE-TO-ONE COPY OF PLATFORMS ViewerDropAdapter
40
 * REFERE THERE FIRST IF YOU NEED TO FIX SOMETHING.
41
 * </p>
31
 */
42
 */
32
public class JdtViewerDropAdapter implements DropTargetListener {
43
public abstract class JdtViewerDropAdapter extends DropTargetAdapter {
33
34
	/**
35
	 * Constant describing the position of the mouse cursor relative 
36
	 * to the target object.  This means the mouse is not positioned
37
	 * over or near any valid target.
38
	 */
39
	public static final int LOCATION_NONE= DND.FEEDBACK_NONE;
40
	
41
	/**
42
	 * Constant describing the position of the mouse cursor relative 
43
	 * to the target object.  This means the mouse is positioned
44
	 * directly on the target.
45
	 */
46
	public static final int LOCATION_ON= DND.FEEDBACK_SELECT;
47
	
48
	/**
49
	 * Constant describing the position of the mouse cursor relative 
50
	 * to the target object.  This means the mouse is positioned
51
	 * slightly before the target.
52
	 */
53
	public static final int LOCATION_BEFORE= DND.FEEDBACK_INSERT_BEFORE;
54
	
55
	/**
56
	 * Constant describing the position of the mouse cursor relative 
57
	 * to the target object.  This means the mouse is positioned
58
	 * slightly after the target.
59
	 */
60
	public static final int LOCATION_AFTER= DND.FEEDBACK_INSERT_AFTER;
61
	
62
	/**
63
	 * The threshold used to determine if the mouse is before or after
64
	 * an item.
65
	 */
66
	private static final int LOCATION_EPSILON= 5; 
67
	
68
69
	private static final int ITEM_MARGIN_LEFT= 40;
70
	private static final int ITEM_MARGIN_RIGTH= 10;
71
	
72
	/**
73
	 * Style to enable location feedback.
74
	 */
75
	public static final int INSERTION_FEEDBACK= 1 << 1; 
76
77
	private StructuredViewer fViewer;
78
	private int fFeedback;
79
	private boolean fShowInsertionFeedback;
80
	private boolean fFullWidthMatchesItem;
81
	private int fRequestedOperation;
82
	private int fLastOperation;
83
	protected int fLocation;
84
	protected Object fTarget;
85
86
87
88
	public JdtViewerDropAdapter(StructuredViewer viewer, int feedback) {
89
		Assert.isNotNull(viewer);
90
		fViewer= viewer;
91
		fFeedback= feedback;
92
		fLastOperation= -1;
93
		fFullWidthMatchesItem= true;
94
	}
95
44
96
	/**
45
    /**
97
	 * Controls whether the drop adapter shows insertion feedback or not.
46
     * Constant describing the position of the cursor relative 
98
	 * 
47
     * to the target object.  This means the mouse is positioned
99
	 * @param showInsertionFeedback <code>true</code> if the drop adapter is supposed
48
     * slightly before the target.
100
	 *	to show insertion feedback. Otherwise <code>false</code>
49
     * @see #getCurrentLocation()
101
	 */
50
     */
102
	public void showInsertionFeedback(boolean showInsertionFeedback) {
51
    public static final int LOCATION_BEFORE = 1;
103
		fShowInsertionFeedback= showInsertionFeedback;
52
104
	}
53
    /**
105
	
54
     * Constant describing the position of the cursor relative 
106
	/**
55
     * to the target object.  This means the mouse is positioned
107
	 * Controls whether the drop adapter matches an tree or table item on the full width of the viewer. 
56
     * slightly after the target.
108
	 * 
57
     * @see #getCurrentLocation()
109
	 * @param enable <code>true</code> if the drop adapter is supposed
58
     */
110
	 *	to test the horizontal distance
59
    public static final int LOCATION_AFTER = 2;
111
	 */
60
112
	protected void setFullWidthMatchesItem(boolean enable) {
61
    /**
113
		fFullWidthMatchesItem= enable;
62
     * Constant describing the position of the cursor relative 
114
	}
63
     * to the target object.  This means the mouse is positioned
115
	
64
     * directly on the target.
116
	/**
65
     * @see #getCurrentLocation()
117
	 * Returns the viewer this adapter is working on.
66
     */
118
	 */
67
    public static final int LOCATION_ON = 3;
119
	protected StructuredViewer getViewer() {
68
120
		return fViewer;
69
    /**
121
	} 
70
     * Constant describing the position of the cursor relative 
122
	
71
     * to the target object.  This means the mouse is not positioned
123
	//---- Hooks to override -----------------------------------------------------
72
     * over or near any valid target.
124
	
73
     * @see #getCurrentLocation()
125
	/**
74
     */
126
	 * The actual drop has occurred. Calls <code>drop(Object target, DropTargetEvent event)
75
    public static final int LOCATION_NONE = 4;
127
	 * </code>.
76
128
	 * @see DropTargetListener#drop(org.eclipse.swt.dnd.DropTargetEvent)
77
    /**
129
	 */	 
78
     * The viewer to which this drop support has been added.
130
	public void drop(DropTargetEvent event) {
79
     */
131
		drop(fTarget, event);
80
    private Viewer viewer;
132
	}
81
133
	
82
    /**
134
	/**
83
     * The current operation.
135
	 * The actual drop has occurred.
84
     */
136
	 * @param target the drop target in form of a domain element.
85
    private int currentOperation = DND.DROP_NONE;
137
	 * @param event the drop traget event
86
138
	 */	 
87
    /**
139
	public void drop(Object target, DropTargetEvent event) {
88
     * The last valid operation.
140
	}
89
     */
141
	
90
    private int lastValidOperation = DND.DROP_NONE;
142
	/**
91
143
	 * Checks if the drop is valid. The method calls <code>validateDrop
92
    /**
144
	 * (Object target, DropTargetEvent event). Implementors can alter the 
93
     * The data item currently under the mouse.
145
	 * <code>currentDataType</code> field and the <code>detail</code> field 
94
     */
146
	 * to give feedback about drop acceptence.
95
    private Object currentTarget;
147
	 */
96
148
	public void validateDrop(DropTargetEvent event) {
97
    /**
149
		validateDrop(fTarget, event, fRequestedOperation);
98
     * Information about the position of the mouse relative to the
150
	}
99
     * target (before, on, or after the target.  Location is one of
151
	
100
     * the <code>LOCATION_* </code> constants defined in this type.
152
	/**
101
     */
153
	 * Checks if the drop on the current target is valid. The method
102
    private int currentLocation;
154
	 * can alter the <code>currentDataType</code> field and the <code>
103
155
	 * detail</code> field to give feedback about drop acceptence.
104
    /**
156
	 * @param target the drop target in form of a domain element.
105
     * A flag that allows adapter users to turn the insertion
157
	 * @param event the drop traget event
106
     * feedback on or off. Default is <code>true</code>.
158
	 * @param operation the operation requested by the user.
107
     */
159
	 */
108
    private boolean feedbackEnabled = true;
160
	public void validateDrop(Object target, DropTargetEvent event, int operation) {
109
161
	}
110
    /**
162
	
111
     * A flag that allows adapter users to turn auto scrolling
163
	public void dragEnter(DropTargetEvent event) {
112
     * on or off. Default is <code>true</code>.
164
		dragOperationChanged(event);
113
     */
165
	}
114
    private boolean scrollEnabled = true;
166
	
115
167
	public void dragLeave(DropTargetEvent event) {
116
    /**
168
		fTarget= null;
117
     * A flag that allows adapter users to turn auto
169
		fLocation= LOCATION_NONE;
118
     * expanding on or off. Default is <code>true</code>.
170
	}
119
     */
171
	
120
    private boolean expandEnabled = true;
172
	public void dragOperationChanged(DropTargetEvent event) {
121
    
173
		fRequestedOperation= event.detail;
122
    /**
174
		fTarget= computeTarget(event);
123
     * A flag that allows adapter users to turn selection feedback
175
		fLocation= computeLocation(event);
124
     *  on or off. Default is <code>true</code>.
176
		validateDrop(event);
125
     */
177
		fLastOperation= event.detail;
126
    private boolean selectFeedbackEnabled = true;
178
		computeFeedback(event);
127
179
	}
128
    /**
180
	
129
     * Creates a new drop adapter for the given viewer.
181
	public void dragOver(DropTargetEvent event) {
130
     *
182
		Object oldTarget= fTarget;
131
     * @param viewer the viewer
183
		fTarget= computeTarget(event);
132
     */
184
		
133
    protected JdtViewerDropAdapter(Viewer viewer) {
185
		//set the location feedback
134
        this.viewer = viewer;
186
		int oldLocation= fLocation;
135
    }
187
		fLocation= computeLocation(event);
136
188
		if (oldLocation != fLocation || oldTarget != fTarget || fLastOperation != event.detail) {
137
    /**
189
			validateDrop(event);
138
     * Returns the position of the given event's coordinates relative to its target.
190
			fLastOperation= event.detail;
139
     * The position is determined to be before, after, or on the item, based on
191
		} else {
140
     * some threshold value.
192
			event.detail= fLastOperation;
141
     *
142
     * @param event the event
143
     * @return one of the <code>LOCATION_* </code>constants defined in this class
144
     */
145
    protected int determineLocation(DropTargetEvent event) {
146
        if (!(event.item instanceof Item)) {
147
            return LOCATION_NONE;
148
        }
149
        Item item = (Item) event.item;
150
        Point coordinates = new Point(event.x, event.y);
151
        coordinates = viewer.getControl().toControl(coordinates);
152
        if (item != null) {
153
            Rectangle bounds = getBounds(item);
154
            if (bounds == null) {
155
                return LOCATION_NONE;
156
            }
157
            if ((coordinates.y - bounds.y) < 5) {
158
                return LOCATION_BEFORE;
159
            }
160
            if ((bounds.y + bounds.height - coordinates.y) < 5) {
161
                return LOCATION_AFTER;
162
            }
163
        }
164
        return LOCATION_ON;
165
    }
166
167
    /**
168
     * Returns the target item of the given drop event.
169
     *
170
     * @param event the event
171
     * @return The target of the drop, may be <code>null</code>.
172
     */
173
    protected Object determineTarget(DropTargetEvent event) {
174
        return event.item == null ? null : event.item.getData();
175
    }
176
177
    /* (non-Javadoc)
178
     * Method declared on DropTargetAdapter.
179
     * The mouse has moved over the drop target.  If the
180
     * target item has changed, notify the action and check
181
     * that it is still enabled.
182
     */
183
    private void doDropValidation(DropTargetEvent event) {
184
        currentOperation= validateDrop(currentTarget, lastValidOperation, event.currentDataType);
185
        event.detail = currentOperation;
186
    }
187
188
    /* (non-Javadoc)
189
     * Method declared on DropTargetAdapter.
190
     * The drag has entered this widget's region.  See
191
     * if the drop should be allowed.
192
     */
193
    public void dragEnter(DropTargetEvent event) {
194
        currentTarget = determineTarget(event);
195
        lastValidOperation = event.detail;
196
        doDropValidation(event);
197
    }
198
199
    /* (non-Javadoc)
200
     * Method declared on DropTargetAdapter.
201
     * The drop operation has changed, see if the action
202
     * should still be enabled.
203
     */
204
    public void dragOperationChanged(DropTargetEvent event) {
205
        currentTarget = determineTarget(event);
206
        lastValidOperation = event.detail;
207
        doDropValidation(event);
208
    }
209
210
    /* (non-Javadoc)
211
     * Method declared on DropTargetAdapter.
212
     * The mouse has moved over the drop target.  If the
213
     * target item has changed, notify the action and check
214
     * that it is still enabled.
215
     */
216
    public void dragOver(DropTargetEvent event) {
217
        //use newly revealed item as target if scrolling occurs
218
        Object target = determineTarget(event);
219
220
        //set the location feedback
221
        int oldLocation = currentLocation;
222
        currentLocation = determineLocation(event);
223
        setFeedback(event, currentLocation);
224
225
        //see if anything has really changed before doing validation.
226
        if (target != currentTarget || currentLocation != oldLocation) {
227
            currentTarget = target;
228
            doDropValidation(event);
229
        }
230
    }
231
232
    /* (non-Javadoc)
233
     * Method declared on DropTargetAdapter.
234
     * The user has dropped something on the desktop viewer.
235
     */
236
    public void drop(DropTargetEvent event) {
237
        currentLocation = determineLocation(event);
238
239
        //perform the drop behavior
240
        currentOperation= performDrop(event.data);
241
        event.detail= currentOperation;
242
    }
243
244
    /* (non-Javadoc)
245
     * Method declared on DropTargetAdapter.
246
     * Last chance for the action to disable itself
247
     */
248
    public void dropAccept(DropTargetEvent event) {
249
    	event.detail= validateDrop(currentTarget, event.detail, event.currentDataType);
250
    }
251
252
    /**
253
     * Returns the bounds of the given SWT tree or table item.
254
     *
255
     * @param item the SWT Item
256
     * @return the bounds, or <code>null</code> if it is not a known type of item
257
     */
258
    protected Rectangle getBounds(Item item) {
259
        if (item instanceof TreeItem) {
260
            return ((TreeItem) item).getBounds();
261
        }
262
        if (item instanceof TableItem) {
263
            return ((TableItem) item).getBounds(0);
264
        }
265
        return null;
266
    }
267
268
    /**
269
     * Returns a constant describing the position of the mouse relative to the
270
     * target (before, on, or after the target.  
271
     *
272
     * @return one of the <code>LOCATION_* </code> constants defined in this type
273
     */
274
    protected int getCurrentLocation() {
275
        return currentLocation;
276
    }
277
278
    /**
279
     * Returns the current operation.
280
     *
281
     * @return a <code>DROP_*</code> constant from class <code>DND</code>
282
     *
283
     * @see DND#DROP_COPY
284
     * @see DND#DROP_MOVE
285
     * @see DND#DROP_LINK
286
     * @see DND#DROP_NONE
287
     */
288
    protected int getCurrentOperation() {
289
        return currentOperation;
290
    }
291
292
    /**
293
     * Returns the target object currently under the mouse.
294
     *
295
     * @return the current target object
296
     */
297
    protected Object getCurrentTarget() {
298
        return currentTarget;
299
    }
300
301
    /**
302
     * Returns whether visible insertion feedback should be presented to the user.
303
     * <p>
304
     * Typical insertion feedback is the horizontal insertion bars that appear 
305
     * between adjacent items while dragging.
306
     * </p>
307
     *
308
     * @return <code>true</code> if visual feedback is desired, and <code>false</code> if not
309
     */
310
    public boolean getFeedbackEnabled() {
311
        return feedbackEnabled;
312
    }
313
314
    /**
315
     * Returns the object currently selected by the viewer.
316
     *
317
     * @return the selected object, or <code>null</code> if either no object or 
318
     *   multiple objects are selected
319
     */
320
    protected Object getSelectedObject() {
321
        ISelection selection = viewer.getSelection();
322
        if (selection instanceof IStructuredSelection && !selection.isEmpty()) {
323
            IStructuredSelection structured = (IStructuredSelection) selection;
324
            return structured.getFirstElement();
325
        }
326
        return null;
327
    }
328
329
    /**
330
     * @return the viewer to which this drop support has been added.
331
     */
332
    protected Viewer getViewer() {
333
        return viewer;
334
    }
335
336
    /**
337
     * @deprecated this method should not be used. Exception handling has been 
338
     * 	removed from DropTargetAdapter methods overridden by this class.
339
     * Handles any exception that occurs during callback, including 
340
     * rethrowing behavior.
341
     * <p>
342
     * [Issue: Implementation prints stack trace and eats exception to avoid
343
     *  crashing VA/J.
344
     *  Consider conditionalizing the implementation to do one thing in VAJ
345
     *  and something more reasonable in other operating environments.
346
     * ]
347
     * </p>
348
     *
349
     * @param exception the exception
350
     * @param event the event
351
     */
352
    protected void handleException(Throwable exception, DropTargetEvent event) {
353
        // Currently we never rethrow because VA/Java crashes if an SWT
354
        // callback throws anything. Generally catching Throwable is bad, but in
355
        // this cases it's better than hanging the image.
356
        exception.printStackTrace();
357
        event.detail = DND.DROP_NONE;
358
    }
359
360
    /**
361
     * Performs any work associated with the drop.
362
     * <p>
363
     * Subclasses must implement this method to provide drop behavior.
364
     * </p>
365
     *
366
     * @param data the drop data
367
     * @return <code>true</code> if the drop was successful, and 
368
     *   <code>false</code> otherwise
369
     */
370
    public abstract int performDrop(Object data);
371
372
    /* (non-Javadoc)
373
     * Method declared on DropTargetAdapter.
374
     * The mouse has moved over the drop target.  If the
375
     * target item has changed, notify the action and check
376
     * that it is still enabled.
377
     */
378
    private void setFeedback(DropTargetEvent event, int location) {
379
        if (feedbackEnabled) {
380
            switch (location) {
381
            case LOCATION_BEFORE:
382
                event.feedback = DND.FEEDBACK_INSERT_BEFORE;
383
                break;
384
            case LOCATION_AFTER:
385
                event.feedback = DND.FEEDBACK_INSERT_AFTER;
386
                break;
387
            case LOCATION_ON:
388
            default:
389
                event.feedback = DND.FEEDBACK_SELECT;
390
                break;
391
            }
392
        }
393
        
394
         // Explicitly inhibit SELECT feedback if desired
395
		if (!selectFeedbackEnabled) {
396
			event.feedback &= ~DND.FEEDBACK_SELECT;
193
		}
397
		}
194
		computeFeedback(event);
398
195
	}
399
		if (expandEnabled) {
196
	
400
			event.feedback |= DND.FEEDBACK_EXPAND;
197
	public void dropAccept(DropTargetEvent event) {
198
		fTarget= computeTarget(event);
199
		validateDrop(event);
200
		fLastOperation= event.detail;
201
	}
202
	
203
	/**
204
	 * Returns the data held by <code>event.item</code>. Inside a viewer
205
	 * this corresponds to the items data model element.
206
	 */
207
	protected Object computeTarget(DropTargetEvent event) {
208
		if (event.item == null) {
209
			return null;
210
		}
211
		if (!fFullWidthMatchesItem) {
212
			Point coordinates= fViewer.getControl().toControl(new Point(event.x, event.y));
213
			Rectangle bounds= getBounds((Item) event.item);
214
			if (coordinates.x < bounds.x - ITEM_MARGIN_LEFT || coordinates.x >= bounds.x + bounds.width + ITEM_MARGIN_RIGTH) {
215
				event.item= null; // too far away
216
				return null;
217
			}
218
		}
219
		return event.item.getData();
220
	}
221
	
222
	/**
223
	 * Returns the position of the given coordinates relative to the given target.
224
	 * The position is determined to be before, after, or on the item, based on 
225
	 * some threshold value. The return value is one of the LOCATION_* constants 
226
	 * defined in this class.
227
	 */
228
	protected int computeLocation(DropTargetEvent event) {
229
		if (!(event.item instanceof Item))
230
			return LOCATION_NONE;
231
		
232
		Item item= (Item) event.item;
233
		Point coordinates= fViewer.getControl().toControl(new Point(event.x, event.y));
234
		Rectangle bounds= getBounds(item);
235
		if (bounds == null) {
236
			return LOCATION_NONE;
237
		}
238
		if ((coordinates.y - bounds.y) < LOCATION_EPSILON) {
239
			return LOCATION_BEFORE;
240
		}
401
		}
241
		if ((bounds.y + bounds.height - coordinates.y) < LOCATION_EPSILON) {
402
		if (scrollEnabled) {
242
			return LOCATION_AFTER;
403
			event.feedback |= DND.FEEDBACK_SCROLL;
243
		}
404
		}
244
		return LOCATION_ON;
405
    }
245
	}
246
247
	/**
248
	 * Returns the bounds of the given item, or <code>null</code> if it is not a 
249
	 * valid type of item.
250
	 */
251
	private Rectangle getBounds(Item item) {
252
		if (item instanceof TreeItem)
253
			return ((TreeItem) item).getBounds();
254
			
255
		if (item instanceof TableItem)
256
			return ((TableItem) item).getBounds(0);
257
			
258
		return null;
259
	}
260
406
261
	/**
407
    /**
262
	 * Sets the drag under feedback corresponding to the value of <code>fLocation</code>
408
	 * Sets whether visible insertion feedback should be presented to the user.
263
	 * and the <code>INSERTION_FEEDBACK</code> style bit.
409
	 * <p>
264
	 */
410
	 * Typical insertion feedback is the horizontal insertion bars that appear
265
	protected void computeFeedback(DropTargetEvent event) {
411
	 * between adjacent items while dragging.
266
		if (!fShowInsertionFeedback && fLocation != LOCATION_NONE) {
412
	 * </p>
267
			event.feedback= DND.FEEDBACK_SELECT;
413
	 * 
268
		} else {
414
	 * @param value
269
			event.feedback= fLocation;
415
	 *            <code>true</code> if visual feedback is desired, and
270
		}
416
	 *            <code>false</code> if not
271
		event.feedback|= fFeedback;
417
	 */
272
	}
418
    public void setFeedbackEnabled(boolean value) {
273
	
419
        feedbackEnabled = value;
274
	/**
420
    }
275
	 * Sets the drop operation to </code>DROP_NODE<code>.
421
276
	 */
422
    /**
277
	protected void clearDropOperation(DropTargetEvent event) {
423
     * Sets whether selection feedback should be provided during dragging.
278
		event.detail= DND.DROP_NONE;
424
     *
279
	}
425
     * @param value <code>true</code> if selection feedback is desired, and
280
	
426
     *   <code>false</code> if not
281
	/**
427
     *   
282
	 * Returns the requested drop operation.
428
     * @since 3.2
283
	 */
429
     */
284
	protected int getRequestedOperation() {
430
    public void setSelectionFeedbackEnabled(boolean value) {
285
		return fRequestedOperation;
431
        selectFeedbackEnabled = value;
286
	} 
432
    }
287
	
433
288
	protected void setDefaultFeedback(int feedback) {
434
    /**
289
		fFeedback= feedback;
435
     * Sets whether auto scrolling and expanding should be provided during dragging.
290
	}
436
     *
291
	
437
     * @param value <code>true</code> if scrolling and expanding is desired, and
292
	//---- helper methods to test DnD 
438
     *   <code>false</code> if not
293
	
439
     * @since 2.0
294
	public void internalTestSetLocation(int location) {
440
     */
295
		fLocation= location;
441
    public void setScrollExpandEnabled(boolean value) {
442
    	expandEnabled = value;
443
    	scrollEnabled = value;
444
    }
445
446
    /**
447
     * Sets whether auto expanding should be provided during dragging.
448
     *
449
     * @param value <code>true</code> if expanding is desired, and
450
     *   <code>false</code> if not
451
     * @since 3.4
452
     */
453
    public void setExpandEnabled(boolean value) {
454
        expandEnabled = value;
455
    }
456
    
457
    /**
458
     * Sets whether auto scrolling should be provided during dragging.
459
     *
460
     * @param value <code>true</code> if scrolling is desired, and
461
     *   <code>false</code> if not
462
     * @since 3.4
463
     */
464
    public void setScrollEnabled(boolean value) {
465
        scrollEnabled = value;
466
    }
467
468
    /**
469
     * Validates dropping on the given object. This method is called whenever some 
470
     * aspect of the drop operation changes.
471
     * <p>
472
     * Subclasses must implement this method to define which drops make sense.
473
     * </p>
474
     * 
475
     * @param target the object that the mouse is currently hovering over, or
476
     *   <code>null</code> if the mouse is hovering over empty space
477
     * @param operation the current drag operation (copy, move, etc.)
478
     * @param transferType the current transfer type
479
     * @return <code>true</code> if the drop is valid, and <code>false</code>
480
     *   otherwise
481
     */
482
    public abstract int validateDrop(Object target, int operation,
483
            TransferData transferType);
484
    
485
    /**
486
     * For testing only. The location should not be set otherwise.
487
     * @param location the location to assume
488
     */
489
    protected void setCurrentLocation(int location) {
490
    	currentLocation= location;
296
	}
491
	}
297
}
492
}
(-)ui/org/eclipse/jdt/internal/ui/dnd/JdtViewerDragAdapter.java (-3 / +3 lines)
Lines 14-20 Link Here
14
14
15
import org.eclipse.swt.dnd.DragSourceEvent;
15
import org.eclipse.swt.dnd.DragSourceEvent;
16
16
17
import org.eclipse.jface.util.TransferDragSourceListener;
17
import org.eclipse.jface.util.DelegatingDragAdapter;
18
import org.eclipse.jface.viewers.IStructuredSelection;
18
import org.eclipse.jface.viewers.IStructuredSelection;
19
import org.eclipse.jface.viewers.StructuredViewer;
19
import org.eclipse.jface.viewers.StructuredViewer;
20
20
Lines 22-29 Link Here
22
22
23
	private StructuredViewer fViewer;
23
	private StructuredViewer fViewer;
24
24
25
	public JdtViewerDragAdapter(StructuredViewer viewer, TransferDragSourceListener[] listeners) {
25
	public JdtViewerDragAdapter(StructuredViewer viewer) {
26
		super(listeners);
26
		super();
27
		Assert.isNotNull(viewer);
27
		Assert.isNotNull(viewer);
28
		fViewer= viewer;
28
		fViewer= viewer;
29
	}
29
	}
(-)ui/org/eclipse/jdt/internal/ui/callhierarchy/CallHierarchyTransferDropAdapter.java (-40 / +16 lines)
Lines 11-79 Link Here
11
 *******************************************************************************/
11
 *******************************************************************************/
12
package org.eclipse.jdt.internal.ui.callhierarchy;
12
package org.eclipse.jdt.internal.ui.callhierarchy;
13
13
14
import org.eclipse.swt.dnd.DND;
15
import org.eclipse.swt.dnd.DropTargetEvent;
16
17
import org.eclipse.jface.viewers.ISelection;
14
import org.eclipse.jface.viewers.ISelection;
18
import org.eclipse.jface.viewers.StructuredViewer;
15
import org.eclipse.jface.viewers.StructuredViewer;
19
16
20
import org.eclipse.jdt.core.IMethod;
17
import org.eclipse.jdt.core.IMethod;
21
18
22
import org.eclipse.jdt.internal.ui.packageview.SelectionTransferDropAdapter;
19
import org.eclipse.jdt.internal.ui.dnd.ViewerInputDropAdapter;
23
import org.eclipse.jdt.internal.ui.util.SelectionUtil;
20
import org.eclipse.jdt.internal.ui.util.SelectionUtil;
24
21
25
class CallHierarchyTransferDropAdapter extends SelectionTransferDropAdapter {
22
class CallHierarchyTransferDropAdapter extends ViewerInputDropAdapter {
26
23
	
27
	private static final int OPERATION = DND.DROP_LINK;
28
	private CallHierarchyViewPart fCallHierarchyViewPart;
24
	private CallHierarchyViewPart fCallHierarchyViewPart;
29
25
30
	public CallHierarchyTransferDropAdapter(CallHierarchyViewPart viewPart, StructuredViewer viewer) {
26
	public CallHierarchyTransferDropAdapter(CallHierarchyViewPart viewPart, StructuredViewer viewer) {
31
		super(viewer);
27
		super(viewer);
32
		setFullWidthMatchesItem(false);
33
		fCallHierarchyViewPart= viewPart;
28
		fCallHierarchyViewPart= viewPart;
34
	}
29
	}	
35
36
	public void validateDrop(Object target, DropTargetEvent event, int operation) {
37
		event.detail= DND.DROP_NONE;
38
		initializeSelection();
39
		if (target != null){
40
			super.validateDrop(target, event, operation);
41
			return;
42
		}	
43
		if (getInputElement(getSelection()) != null) 
44
			event.detail= OPERATION;
45
	}
46
	
30
	
47
	/* (non-Javadoc)
31
	/**
48
	 * @see org.eclipse.jdt.internal.ui.packageview.SelectionTransferDropAdapter#isEnabled(org.eclipse.swt.dnd.DropTargetEvent)
32
	 * {@inheritDoc}
49
	 */
33
	 */
50
	public boolean isEnabled(DropTargetEvent event) {
34
	protected void doInputView(Object inputElement) {
51
		return true;
35
		fCallHierarchyViewPart.setMethod((IMethod) inputElement);
52
	}
53
54
	public void drop(Object target, DropTargetEvent event) {
55
		if (target != null || event.detail != OPERATION){
56
			super.drop(target, event);
57
			return;
58
		}	
59
		IMethod input= getInputElement(getSelection());
60
		fCallHierarchyViewPart.setMethod(input);
61
	}
36
	}
62
	
37
	
63
	private static IMethod getInputElement(ISelection selection) {
38
	/**
39
	 * {@inheritDoc}
40
	 */
41
	protected Object getInputElement(ISelection selection) {
64
		Object single= SelectionUtil.getSingleElement(selection);
42
		Object single= SelectionUtil.getSingleElement(selection);
65
		if (single == null)
43
		if (single == null)
66
			return null;
44
			return null;
45
		
67
		return getCandidate(single);
46
		return getCandidate(single);
68
	}
47
	}
69
    
48
    
70
    /**
49
    private static IMethod getCandidate(Object input) {
71
     * Converts the input to a possible input candidates
50
        if (!(input instanceof IMethod))
72
     */ 
73
    public static IMethod getCandidate(Object input) {
74
        if (!(input instanceof IMethod)) {
75
            return null;
51
            return null;
76
        }
52
        
77
        return (IMethod) input;
53
        return (IMethod) input;
78
    }
54
    }
79
}
55
}
(-)ui/org/eclipse/jdt/internal/ui/callhierarchy/CallHierarchyViewPart.java (-11 / +13 lines)
Lines 40-47 Link Here
40
import org.eclipse.jface.action.MenuManager;
40
import org.eclipse.jface.action.MenuManager;
41
import org.eclipse.jface.action.Separator;
41
import org.eclipse.jface.action.Separator;
42
import org.eclipse.jface.dialogs.IDialogSettings;
42
import org.eclipse.jface.dialogs.IDialogSettings;
43
import org.eclipse.jface.util.TransferDragSourceListener;
43
import org.eclipse.jface.util.DelegatingDropAdapter;
44
import org.eclipse.jface.util.TransferDropTargetListener;
45
import org.eclipse.jface.viewers.IOpenListener;
44
import org.eclipse.jface.viewers.IOpenListener;
46
import org.eclipse.jface.viewers.ISelection;
45
import org.eclipse.jface.viewers.ISelection;
47
import org.eclipse.jface.viewers.ISelectionChangedListener;
46
import org.eclipse.jface.viewers.ISelectionChangedListener;
Lines 96-102 Link Here
96
import org.eclipse.jdt.internal.ui.IJavaHelpContextIds;
95
import org.eclipse.jdt.internal.ui.IJavaHelpContextIds;
97
import org.eclipse.jdt.internal.ui.JavaPlugin;
96
import org.eclipse.jdt.internal.ui.JavaPlugin;
98
import org.eclipse.jdt.internal.ui.actions.CompositeActionGroup;
97
import org.eclipse.jdt.internal.ui.actions.CompositeActionGroup;
99
import org.eclipse.jdt.internal.ui.dnd.DelegatingDropAdapter;
100
import org.eclipse.jdt.internal.ui.dnd.JdtViewerDragAdapter;
98
import org.eclipse.jdt.internal.ui.dnd.JdtViewerDragAdapter;
101
import org.eclipse.jdt.internal.ui.dnd.ResourceTransferDragAdapter;
99
import org.eclipse.jdt.internal.ui.dnd.ResourceTransferDragAdapter;
102
import org.eclipse.jdt.internal.ui.javaeditor.EditorUtility;
100
import org.eclipse.jdt.internal.ui.javaeditor.EditorUtility;
Lines 327-347 Link Here
327
		Transfer[] transfers= new Transfer[] { LocalSelectionTransfer.getInstance() };
325
		Transfer[] transfers= new Transfer[] { LocalSelectionTransfer.getInstance() };
328
		int ops= DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK | DND.DROP_DEFAULT;
326
		int ops= DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK | DND.DROP_DEFAULT;
329
		
327
		
330
		TransferDropTargetListener[] dropListeners= new TransferDropTargetListener[] {
328
		DelegatingDropAdapter delegatingDropAdapter= new DelegatingDropAdapter();
331
			new CallHierarchyTransferDropAdapter(this, viewer)
329
		delegatingDropAdapter.addDropTargetListener(
332
		};
330
			new CallHierarchyTransferDropAdapter(this, viewer)			
333
		viewer.addDropSupport(ops, transfers, new DelegatingDropAdapter(dropListeners));
331
		);
332
		viewer.addDropSupport(ops, transfers, delegatingDropAdapter);
334
	}
333
	}
335
334
336
	private void addDragAdapters(StructuredViewer viewer) {
335
	private void addDragAdapters(StructuredViewer viewer) {
337
		int ops= DND.DROP_COPY | DND.DROP_LINK;
336
		int ops= DND.DROP_COPY | DND.DROP_LINK;
338
		Transfer[] transfers= new Transfer[] { LocalSelectionTransfer.getInstance(), ResourceTransfer.getInstance()};
337
		Transfer[] transfers= new Transfer[] { LocalSelectionTransfer.getInstance(), ResourceTransfer.getInstance()};
339
338
340
		TransferDragSourceListener[] dragListeners= new TransferDragSourceListener[] {
339
		JdtViewerDragAdapter dragAdapter= new JdtViewerDragAdapter(viewer);
341
			new SelectionTransferDragAdapter(viewer),
340
		dragAdapter.addDragSourceListener(
341
			new SelectionTransferDragAdapter(viewer)
342
		);
343
		dragAdapter.addDragSourceListener(
342
			new ResourceTransferDragAdapter(viewer)
344
			new ResourceTransferDragAdapter(viewer)
343
		};
345
		);
344
		viewer.addDragSupport(ops, transfers, new JdtViewerDragAdapter(viewer, dragListeners));
346
		viewer.addDragSupport(ops, transfers, dragAdapter);
345
	}	
347
	}	
346
            
348
            
347
    public void createPartControl(Composite parent) {
349
    public void createPartControl(Composite parent) {
(-)ui/org/eclipse/jdt/internal/ui/typehierarchy/TypeHierarchyTransferDropAdapter.java (-32 / +13 lines)
Lines 10-72 Link Here
10
 *******************************************************************************/
10
 *******************************************************************************/
11
package org.eclipse.jdt.internal.ui.typehierarchy;
11
package org.eclipse.jdt.internal.ui.typehierarchy;
12
12
13
import org.eclipse.swt.dnd.DND;
14
import org.eclipse.swt.dnd.DropTargetEvent;
15
16
import org.eclipse.jface.viewers.AbstractTreeViewer;
13
import org.eclipse.jface.viewers.AbstractTreeViewer;
17
import org.eclipse.jface.viewers.ISelection;
14
import org.eclipse.jface.viewers.ISelection;
18
15
19
import org.eclipse.jdt.core.IJavaElement;
16
import org.eclipse.jdt.core.IJavaElement;
20
17
21
import org.eclipse.jdt.internal.ui.packageview.SelectionTransferDropAdapter;
18
import org.eclipse.jdt.internal.ui.dnd.ViewerInputDropAdapter;
22
import org.eclipse.jdt.internal.ui.util.OpenTypeHierarchyUtil;
19
import org.eclipse.jdt.internal.ui.util.OpenTypeHierarchyUtil;
23
import org.eclipse.jdt.internal.ui.util.SelectionUtil;
20
import org.eclipse.jdt.internal.ui.util.SelectionUtil;
24
21
25
public class TypeHierarchyTransferDropAdapter extends SelectionTransferDropAdapter {
22
public class TypeHierarchyTransferDropAdapter extends ViewerInputDropAdapter {
26
23
27
	private static final int OPERATION = DND.DROP_LINK;
28
	private TypeHierarchyViewPart fTypeHierarchyViewPart;
24
	private TypeHierarchyViewPart fTypeHierarchyViewPart;
29
25
30
	public TypeHierarchyTransferDropAdapter(TypeHierarchyViewPart viewPart, AbstractTreeViewer viewer) {
26
	public TypeHierarchyTransferDropAdapter(TypeHierarchyViewPart viewPart, AbstractTreeViewer viewer) {
31
		super(viewer);
27
		super(viewer);
32
		setFullWidthMatchesItem(false);
33
		fTypeHierarchyViewPart= viewPart;
28
		fTypeHierarchyViewPart= viewPart;
34
	}
29
	}
35
36
	public void validateDrop(Object target, DropTargetEvent event, int operation) {
37
		event.detail= DND.DROP_NONE;
38
		initializeSelection();
39
		if (target != null){
40
			super.validateDrop(target, event, operation);
41
			return;
42
		}	
43
		if (getInputElement(getSelection()) != null) 
44
			event.detail= TypeHierarchyTransferDropAdapter.OPERATION;
45
	}
46
		
30
		
47
	/* (non-Javadoc)
31
	/**
48
	 * @see org.eclipse.jdt.internal.ui.packageview.SelectionTransferDropAdapter#isEnabled(org.eclipse.swt.dnd.DropTargetEvent)
32
	 * {@inheritDoc}
49
	 */
33
	 */
50
	public boolean isEnabled(DropTargetEvent event) {
34
	protected void doInputView(Object inputElement) {
51
		return true;
35
		fTypeHierarchyViewPart.setInputElement((IJavaElement) inputElement);
52
	}	
53
54
	public void drop(Object target, DropTargetEvent event) {
55
		if (target != null || event.detail != TypeHierarchyTransferDropAdapter.OPERATION){
56
			super.drop(target, event);
57
			return;
58
		}	
59
		IJavaElement input= getInputElement(getSelection());
60
		fTypeHierarchyViewPart.setInputElement(input);
61
	}
36
	}
62
	
37
	
63
	private static IJavaElement getInputElement(ISelection selection) {
38
	/**
39
	 * {@inheritDoc}
40
	 */
41
	protected Object getInputElement(ISelection selection) {
64
		Object single= SelectionUtil.getSingleElement(selection);
42
		Object single= SelectionUtil.getSingleElement(selection);
65
		if (single == null)
43
		if (single == null)
66
			return null;
44
			return null;
45
		
67
		IJavaElement[] candidates= OpenTypeHierarchyUtil.getCandidates(single);
46
		IJavaElement[] candidates= OpenTypeHierarchyUtil.getCandidates(single);
68
		if (candidates != null && candidates.length > 0) 
47
		if (candidates != null && candidates.length > 0) 
69
			return candidates[0];
48
			return candidates[0];
49
		
70
		return null;
50
		return null;
71
	}
51
	}
52
72
}
53
}
(-)ui/org/eclipse/jdt/internal/ui/typehierarchy/TypeHierarchyViewPart.java (-11 / +13 lines)
Lines 56-65 Link Here
56
import org.eclipse.jface.action.ToolBarManager;
56
import org.eclipse.jface.action.ToolBarManager;
57
import org.eclipse.jface.dialogs.IDialogSettings;
57
import org.eclipse.jface.dialogs.IDialogSettings;
58
import org.eclipse.jface.dialogs.MessageDialog;
58
import org.eclipse.jface.dialogs.MessageDialog;
59
import org.eclipse.jface.util.DelegatingDropAdapter;
59
import org.eclipse.jface.util.IPropertyChangeListener;
60
import org.eclipse.jface.util.IPropertyChangeListener;
60
import org.eclipse.jface.util.PropertyChangeEvent;
61
import org.eclipse.jface.util.PropertyChangeEvent;
61
import org.eclipse.jface.util.TransferDragSourceListener;
62
import org.eclipse.jface.util.TransferDropTargetListener;
63
import org.eclipse.jface.viewers.AbstractTreeViewer;
62
import org.eclipse.jface.viewers.AbstractTreeViewer;
64
import org.eclipse.jface.viewers.IBasicPropertyConstants;
63
import org.eclipse.jface.viewers.IBasicPropertyConstants;
65
import org.eclipse.jface.viewers.ISelection;
64
import org.eclipse.jface.viewers.ISelection;
Lines 122-128 Link Here
122
import org.eclipse.jdt.internal.ui.actions.CompositeActionGroup;
121
import org.eclipse.jdt.internal.ui.actions.CompositeActionGroup;
123
import org.eclipse.jdt.internal.ui.actions.NewWizardsActionGroup;
122
import org.eclipse.jdt.internal.ui.actions.NewWizardsActionGroup;
124
import org.eclipse.jdt.internal.ui.actions.SelectAllAction;
123
import org.eclipse.jdt.internal.ui.actions.SelectAllAction;
125
import org.eclipse.jdt.internal.ui.dnd.DelegatingDropAdapter;
126
import org.eclipse.jdt.internal.ui.dnd.JdtViewerDragAdapter;
124
import org.eclipse.jdt.internal.ui.dnd.JdtViewerDragAdapter;
127
import org.eclipse.jdt.internal.ui.dnd.ResourceTransferDragAdapter;
125
import org.eclipse.jdt.internal.ui.dnd.ResourceTransferDragAdapter;
128
import org.eclipse.jdt.internal.ui.javaeditor.EditorUtility;
126
import org.eclipse.jdt.internal.ui.javaeditor.EditorUtility;
Lines 736-756 Link Here
736
		Transfer[] transfers= new Transfer[] { LocalSelectionTransfer.getInstance() };
734
		Transfer[] transfers= new Transfer[] { LocalSelectionTransfer.getInstance() };
737
		int ops= DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK | DND.DROP_DEFAULT;
735
		int ops= DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK | DND.DROP_DEFAULT;
738
		
736
		
739
		TransferDropTargetListener[] dropListeners= new TransferDropTargetListener[] {
737
		DelegatingDropAdapter delegatingDropAdapter= new DelegatingDropAdapter();
740
			new TypeHierarchyTransferDropAdapter(this, viewer)
738
		delegatingDropAdapter.addDropTargetListener(
741
		};
739
			new TypeHierarchyTransferDropAdapter(this, viewer)				
742
		viewer.addDropSupport(ops, transfers, new DelegatingDropAdapter(dropListeners));
740
		);
741
		viewer.addDropSupport(ops, transfers, delegatingDropAdapter);
743
	}
742
	}
744
743
745
	private void addDragAdapters(StructuredViewer viewer) {
744
	private void addDragAdapters(StructuredViewer viewer) {
746
		int ops= DND.DROP_COPY | DND.DROP_LINK;
745
		int ops= DND.DROP_COPY | DND.DROP_LINK;
747
		Transfer[] transfers= new Transfer[] { LocalSelectionTransfer.getInstance(), ResourceTransfer.getInstance()};
746
		Transfer[] transfers= new Transfer[] { LocalSelectionTransfer.getInstance(), ResourceTransfer.getInstance()};
748
747
749
		TransferDragSourceListener[] dragListeners= new TransferDragSourceListener[] {
748
		JdtViewerDragAdapter dragAdapter= new JdtViewerDragAdapter(viewer);
750
			new SelectionTransferDragAdapter(viewer),
749
		dragAdapter.addDragSourceListener(
750
			new SelectionTransferDragAdapter(viewer)
751
		);
752
		dragAdapter.addDragSourceListener(
751
			new ResourceTransferDragAdapter(viewer)
753
			new ResourceTransferDragAdapter(viewer)
752
		};
754
		);
753
		viewer.addDragSupport(ops, transfers, new JdtViewerDragAdapter(viewer, dragListeners));
755
		viewer.addDragSupport(ops, transfers, dragAdapter);
754
	}	
756
	}	
755
			
757
			
756
	/**
758
	/**
(-)ui/org/eclipse/jdt/internal/ui/browsing/JavaBrowsingPart.java (-10 / +13 lines)
Lines 43-52 Link Here
43
import org.eclipse.jface.action.IStatusLineManager;
43
import org.eclipse.jface.action.IStatusLineManager;
44
import org.eclipse.jface.action.IToolBarManager;
44
import org.eclipse.jface.action.IToolBarManager;
45
import org.eclipse.jface.action.MenuManager;
45
import org.eclipse.jface.action.MenuManager;
46
import org.eclipse.jface.util.DelegatingDropAdapter;
46
import org.eclipse.jface.util.IPropertyChangeListener;
47
import org.eclipse.jface.util.IPropertyChangeListener;
47
import org.eclipse.jface.util.PropertyChangeEvent;
48
import org.eclipse.jface.util.PropertyChangeEvent;
48
import org.eclipse.jface.util.TransferDragSourceListener;
49
import org.eclipse.jface.util.TransferDropTargetListener;
50
import org.eclipse.jface.viewers.IContentProvider;
49
import org.eclipse.jface.viewers.IContentProvider;
51
import org.eclipse.jface.viewers.ILabelProvider;
50
import org.eclipse.jface.viewers.ILabelProvider;
52
import org.eclipse.jface.viewers.IOpenListener;
51
import org.eclipse.jface.viewers.IOpenListener;
Lines 120-126 Link Here
120
import org.eclipse.jdt.internal.ui.JavaPlugin;
119
import org.eclipse.jdt.internal.ui.JavaPlugin;
121
import org.eclipse.jdt.internal.ui.actions.CompositeActionGroup;
120
import org.eclipse.jdt.internal.ui.actions.CompositeActionGroup;
122
import org.eclipse.jdt.internal.ui.actions.NewWizardsActionGroup;
121
import org.eclipse.jdt.internal.ui.actions.NewWizardsActionGroup;
123
import org.eclipse.jdt.internal.ui.dnd.DelegatingDropAdapter;
124
import org.eclipse.jdt.internal.ui.dnd.JdtViewerDragAdapter;
122
import org.eclipse.jdt.internal.ui.dnd.JdtViewerDragAdapter;
125
import org.eclipse.jdt.internal.ui.dnd.ResourceTransferDragAdapter;
123
import org.eclipse.jdt.internal.ui.dnd.ResourceTransferDragAdapter;
126
import org.eclipse.jdt.internal.ui.infoviews.AbstractInfoView;
124
import org.eclipse.jdt.internal.ui.infoviews.AbstractInfoView;
Lines 438-457 Link Here
438
		Transfer[] dropTransfers= new Transfer[] {
436
		Transfer[] dropTransfers= new Transfer[] {
439
			LocalSelectionTransfer.getInstance()
437
			LocalSelectionTransfer.getInstance()
440
		};
438
		};
441
		TransferDropTargetListener[] dropListeners= new TransferDropTargetListener[] {
439
		DelegatingDropAdapter delegatingDropAdapter= new DelegatingDropAdapter();
440
		delegatingDropAdapter.addDropTargetListener(
442
			new SelectionTransferDropAdapter(fViewer)
441
			new SelectionTransferDropAdapter(fViewer)
443
		};
442
		);
444
		fViewer.addDropSupport(ops | DND.DROP_DEFAULT, dropTransfers, new DelegatingDropAdapter(dropListeners));
443
		fViewer.addDropSupport(ops | DND.DROP_DEFAULT, dropTransfers, delegatingDropAdapter);
445
444
446
		// Drag
445
		// Drag
447
		Transfer[] dragTransfers= new Transfer[] {
446
		Transfer[] dragTransfers= new Transfer[] {
448
			LocalSelectionTransfer.getInstance(),
447
			LocalSelectionTransfer.getInstance(),
449
			ResourceTransfer.getInstance()};
448
			ResourceTransfer.getInstance()};
450
		TransferDragSourceListener[] dragListeners= new TransferDragSourceListener[] {
449
		
451
			new SelectionTransferDragAdapter(fViewer),
450
		JdtViewerDragAdapter dragAdapter= new JdtViewerDragAdapter(fViewer);
451
		dragAdapter.addDragSourceListener(
452
			new SelectionTransferDragAdapter(fViewer)
453
		);
454
		dragAdapter.addDragSourceListener(
452
			new ResourceTransferDragAdapter(fViewer)
455
			new ResourceTransferDragAdapter(fViewer)
453
		};
456
		);
454
		fViewer.addDragSupport(ops, dragTransfers, new JdtViewerDragAdapter(fViewer, dragListeners));
457
		fViewer.addDragSupport(ops, dragTransfers, dragAdapter);
455
	}
458
	}
456
459
457
	protected void fillActionBars(IActionBars actionBars) {
460
	protected void fillActionBars(IActionBars actionBars) {
(-)ui/org/eclipse/jdt/internal/ui/search/JavaSearchResultPage.java (-6 / +7 lines)
Lines 31-37 Link Here
31
import org.eclipse.jface.action.IToolBarManager;
31
import org.eclipse.jface.action.IToolBarManager;
32
import org.eclipse.jface.action.MenuManager;
32
import org.eclipse.jface.action.MenuManager;
33
import org.eclipse.jface.action.Separator;
33
import org.eclipse.jface.action.Separator;
34
import org.eclipse.jface.util.TransferDragSourceListener;
35
import org.eclipse.jface.viewers.ILabelProvider;
34
import org.eclipse.jface.viewers.ILabelProvider;
36
import org.eclipse.jface.viewers.IStructuredSelection;
35
import org.eclipse.jface.viewers.IStructuredSelection;
37
import org.eclipse.jface.viewers.ITreeContentProvider;
36
import org.eclipse.jface.viewers.ITreeContentProvider;
Lines 301-312 Link Here
301
		Transfer[] transfers= new Transfer[] { LocalSelectionTransfer.getInstance(), ResourceTransfer.getInstance() };
300
		Transfer[] transfers= new Transfer[] { LocalSelectionTransfer.getInstance(), ResourceTransfer.getInstance() };
302
		int ops= DND.DROP_COPY | DND.DROP_LINK;
301
		int ops= DND.DROP_COPY | DND.DROP_LINK;
303
		
302
		
304
		TransferDragSourceListener[] dragListeners= new TransferDragSourceListener[] {
303
		JdtViewerDragAdapter dragAdapter= new JdtViewerDragAdapter(viewer);
305
			new SelectionTransferDragAdapter(viewer),
304
		dragAdapter.addDragSourceListener(
305
			new SelectionTransferDragAdapter(viewer)
306
		);
307
		dragAdapter.addDragSourceListener(
306
			new ResourceTransferDragAdapter(viewer)
308
			new ResourceTransferDragAdapter(viewer)
307
		};
309
		);
308
		
310
		viewer.addDragSupport(ops, transfers, dragAdapter);
309
		viewer.addDragSupport(ops, transfers, new JdtViewerDragAdapter(viewer, dragListeners));
310
	}	
311
	}	
311
312
312
	protected void configureTableViewer(TableViewer viewer) {
313
	protected void configureTableViewer(TableViewer viewer) {
(-)ui/org/eclipse/jdt/internal/ui/dnd/ViewerInputDropAdapter.java (+102 lines)
Added Link Here
1
/*******************************************************************************
2
 * Copyright (c) 2007 IBM Corporation and others.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 *
8
 * Contributors:
9
 *     IBM Corporation - initial API and implementation
10
 *******************************************************************************/
11
package org.eclipse.jdt.internal.ui.dnd;
12
13
14
import org.eclipse.swt.dnd.DND;
15
import org.eclipse.swt.dnd.DropTargetEvent;
16
import org.eclipse.swt.dnd.TransferData;
17
import org.eclipse.swt.graphics.Point;
18
import org.eclipse.swt.graphics.Rectangle;
19
import org.eclipse.swt.widgets.Item;
20
21
import org.eclipse.jface.viewers.ISelection;
22
import org.eclipse.jface.viewers.StructuredViewer;
23
24
import org.eclipse.jdt.internal.ui.packageview.SelectionTransferDropAdapter;
25
26
public abstract class ViewerInputDropAdapter extends SelectionTransferDropAdapter {
27
28
	private static final int ITEM_MARGIN_LEFT= 40;
29
	private static final int ITEM_MARGIN_RIGTH= 10;
30
	private static final int OPERATION= DND.DROP_LINK;
31
32
	public ViewerInputDropAdapter(StructuredViewer viewer) {
33
		super(viewer);
34
	}
35
	
36
	protected abstract Object getInputElement(ISelection selection);
37
	protected abstract void doInputView(Object inputElement);
38
	
39
	/**
40
	 * {@inheritDoc}
41
	 */
42
	public int validateDrop(Object target, int operation, TransferData transferType) {
43
	
44
		setSelectionFeedbackEnabled(true);
45
		setExpandEnabled(true);
46
		
47
		initializeSelection();
48
		
49
		if (target != null){
50
			return super.validateDrop(target, operation, transferType);
51
		} else if (getInputElement(getSelection()) != null) { 
52
			setSelectionFeedbackEnabled(false);
53
			setExpandEnabled(false);
54
			return OPERATION;
55
		} else {
56
			return DND.DROP_NONE;
57
		}
58
	}
59
	
60
	/**
61
	 * {@inheritDoc}
62
	 */
63
	public int performDrop(Object data) {
64
		setSelectionFeedbackEnabled(true);
65
		setExpandEnabled(true);
66
		
67
		if (getCurrentTarget() != null || getCurrentOperation() != OPERATION){
68
			return super.performDrop(data);
69
		}
70
		
71
		Object input= getInputElement(getSelection());
72
		if (input != null)
73
			doInputView(input);
74
		
75
		return DND.DROP_NONE;
76
	}
77
78
	/**
79
	 * {@inheritDoc}
80
	 */
81
	public boolean isEnabled(DropTargetEvent event) {
82
		return true;
83
	}
84
85
	/**
86
	 * {@inheritDoc}
87
	 */
88
	protected Object determineTarget(DropTargetEvent event) {
89
		if (event.item == null)
90
			return super.determineTarget(event);
91
		
92
		Point coordinates= getViewer().getControl().toControl(new Point(event.x, event.y));
93
		Rectangle bounds= getBounds((Item) event.item);
94
		if (coordinates.x < bounds.x - ITEM_MARGIN_LEFT || coordinates.x >= bounds.x + bounds.width + ITEM_MARGIN_RIGTH) {
95
			event.item= null; // too far away
96
			return null;
97
		}
98
		
99
		return super.determineTarget(event);
100
	}
101
102
}

Return to bug 101993