1 package eu
.etaxonomy
.taxeditor
.navigation
.navigator
;
3 import java
.util
.Arrays
;
4 import java
.util
.Comparator
;
5 import java
.util
.HashMap
;
6 import java
.util
.Iterator
;
7 import java
.util
.LinkedHashSet
;
11 import org
.eclipse
.jface
.util
.LocalSelectionTransfer
;
12 import org
.eclipse
.jface
.viewers
.IStructuredSelection
;
13 import org
.eclipse
.swt
.dnd
.TransferData
;
14 import org
.eclipse
.ui
.internal
.navigator
.dnd
.CommonDropAdapterDescriptor
;
15 import org
.eclipse
.ui
.internal
.navigator
.dnd
.CommonDropDescriptorManager
;
16 import org
.eclipse
.ui
.internal
.navigator
.extensions
.CommonDragAssistantDescriptor
;
17 import org
.eclipse
.ui
.internal
.navigator
.extensions
.NavigatorViewerDescriptor
;
18 import org
.eclipse
.ui
.navigator
.CommonDragAdapterAssistant
;
19 import org
.eclipse
.ui
.navigator
.CommonDropAdapter
;
20 import org
.eclipse
.ui
.navigator
.CommonDropAdapterAssistant
;
21 import org
.eclipse
.ui
.navigator
.INavigatorContentService
;
22 import org
.eclipse
.ui
.navigator
.INavigatorDnDService
;
24 import eu
.etaxonomy
.taxeditor
.navigation
.navigator
.dnd
.TaxonNavigatorDragAdapterAssistant
;
26 public class TaxonNavigatorDnDService
implements INavigatorDnDService
{
27 private static final CommonDropAdapterAssistant
[] NO_ASSISTANTS
= new CommonDropAdapterAssistant
[0];
29 private INavigatorContentService contentService
;
31 private TaxonNavigatorDragAdapterAssistant
[] dragAssistants
;
33 private TreeNodeDropAdapter dropAdapter
;
35 private final Map dropAssistants
= new HashMap();
37 public TaxonNavigatorDnDService(INavigatorContentService contentService
){
38 this.contentService
= contentService
;
43 public CommonDragAdapterAssistant
[] getCommonDragAssistants() {
45 return dragAssistants
;
49 public void bindDragAssistant(CommonDragAdapterAssistant anAssistant
) {
50 if(dragAssistants
== null)
51 initializeDragAssistants();
52 TaxonNavigatorDragAdapterAssistant
[] newDragAssistants
= new TaxonNavigatorDragAdapterAssistant
[dragAssistants
.length
+ 1];
53 System
.arraycopy(dragAssistants
, 0, newDragAssistants
, 0, dragAssistants
.length
);
54 newDragAssistants
[dragAssistants
.length
] = (TaxonNavigatorDragAdapterAssistant
) anAssistant
;
55 dragAssistants
= newDragAssistants
;
59 private void initializeDragAssistants() {
61 Set dragDescriptors
= ((NavigatorViewerDescriptor
) contentService
62 .getViewerDescriptor()).getDragAssistants();
63 dragAssistants
= new TaxonNavigatorDragAdapterAssistant
[dragDescriptors
65 for (Iterator iter
= dragDescriptors
.iterator(); iter
.hasNext();) {
66 CommonDragAssistantDescriptor descriptor
= (CommonDragAssistantDescriptor
) iter
68 dragAssistants
[i
++] = (TaxonNavigatorDragAdapterAssistant
) descriptor
.createDragAssistant();
73 public CommonDropAdapterAssistant
[] findCommonDropAdapterAssistants(
74 Object aDropTarget
, TransferData aTransferType
) {
75 CommonDropAdapterDescriptor
[] descriptors
= CommonDropDescriptorManager
76 .getInstance().findCommonDropAdapterAssistants(aDropTarget
,
79 if (descriptors
.length
== 0) {
83 if (LocalSelectionTransfer
.getTransfer().isSupportedType(aTransferType
)
84 && LocalSelectionTransfer
.getTransfer().getSelection() instanceof IStructuredSelection
) {
85 return getAssistantsBySelection(descriptors
, (IStructuredSelection
) LocalSelectionTransfer
.getTransfer().getSelection());
87 return getAssistantsByTransferData(descriptors
, aTransferType
);
90 private CommonDropAdapterAssistant
[] getAssistantsByTransferData(
91 CommonDropAdapterDescriptor
[] descriptors
,
92 TransferData aTransferType
) {
94 Set assistants
= new LinkedHashSet();
95 for (int i
= 0; i
< descriptors
.length
; i
++) {
96 CommonDropAdapterAssistant asst
= getAssistant(descriptors
[i
]);
97 if (asst
.isSupportedType(aTransferType
)) {
101 return sortAssistants((CommonDropAdapterAssistant
[]) assistants
102 .toArray(new CommonDropAdapterAssistant
[assistants
.size()]));
106 private CommonDropAdapterAssistant
[] getAssistantsBySelection(
107 CommonDropAdapterDescriptor
[] descriptors
, IStructuredSelection aSelection
) {
109 Set assistants
= new LinkedHashSet();
111 for (int i
= 0; i
< descriptors
.length
; i
++) {
112 if(descriptors
[i
].areDragElementsSupported(aSelection
)) {
113 assistants
.add(getAssistant(descriptors
[i
]));
117 return sortAssistants((CommonDropAdapterAssistant
[]) assistants
118 .toArray(new CommonDropAdapterAssistant
[assistants
.size()]));
121 private CommonDropAdapterAssistant
getAssistant(
122 CommonDropAdapterDescriptor descriptor
) {
123 TreeNodeDropAdapterAssistant asst
= (TreeNodeDropAdapterAssistant
) dropAssistants
128 synchronized (dropAssistants
) {
129 asst
= (TreeNodeDropAdapterAssistant
) dropAssistants
.get(descriptor
);
131 dropAssistants
.put(descriptor
, (asst
= (TreeNodeDropAdapterAssistant
) descriptor
132 .createDropAssistant()));
133 asst
.init(contentService
);
134 //asst.setCommonDropAdapter(dropAdapter);
141 private CommonDropAdapterAssistant
[] sortAssistants(CommonDropAdapterAssistant
[] array
) {
142 Arrays
.sort(array
, new Comparator() {
143 public int compare(Object arg0
, Object arg1
) {
144 CommonDropAdapterAssistant a
= (CommonDropAdapterAssistant
) arg0
;
145 CommonDropAdapterAssistant b
= (CommonDropAdapterAssistant
) arg1
;
146 // This is to ensure that the navigator resources drop assistant will
147 // always be first on the list of drop assistant, if a conflict ever
149 String id
= "org.eclipse.ui.navigator.resources."; //$NON-NLS-1$
150 if (a
.getClass().getName().startsWith(id
))
152 if (b
.getClass().getName().startsWith(id
))
154 return a
.getClass().getName().compareTo(b
.getClass().getName());
161 public CommonDropAdapterAssistant
[] findCommonDropAdapterAssistants(
162 Object aDropTarget
, IStructuredSelection theDragSelection
) {
163 // TODO Auto-generated method stub
167 public void setDropAdaptor(TreeNodeDropAdapter da
) {