/*******************************************************************************
* Copyright (c) 2006, 2015 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
******************************************************************************/
package org.eclipse.ui.internal.navigator.dnd;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.ui.internal.navigator.extensions.ExtensionSequenceNumberComparator;
import org.eclipse.ui.internal.navigator.extensions.INavigatorContentExtPtConstants;
import org.eclipse.ui.internal.navigator.extensions.NavigatorContentRegistryReader;
import org.eclipse.ui.navigator.INavigatorContentDescriptor;
import org.eclipse.ui.navigator.INavigatorContentService;
/**
* @since 3.2
*
*/
public class CommonDropDescriptorManager {
private static final CommonDropDescriptorManager INSTANCE = new CommonDropDescriptorManager();
private static final CommonDropAdapterDescriptor[] NO_DESCRIPTORS = new CommonDropAdapterDescriptor[0];
/**
* A map of (INavigatorContentDescriptor,
* CommonDropAdapterDescriptor)-pairs.
*/
private final Map<INavigatorContentDescriptor, List> dropDescriptors = new TreeMap<INavigatorContentDescriptor, List>(ExtensionSequenceNumberComparator.INSTANCE);
/**
*
* @return An initialized singleton instance of the
* CommonDropDescriptorManager.
*/
public static CommonDropDescriptorManager getInstance() {
return INSTANCE;
}
private CommonDropDescriptorManager() {
new CommonDropAdapterRegistry().readRegistry();
}
/**
*
* @param aDropTarget
* The drop target of the operation
* @param aContentService
* The associated content service to filter results by.
* @return An array of drop descriptors that can handle the given drop
* target and are <i>visible</i> and <i>active</i> for the given
* service and <i>enabled</i> for the given drop target..
*/
public CommonDropAdapterDescriptor[] findCommonDropAdapterAssistants(Object aDropTarget, INavigatorContentService aContentService) {
Set<CommonDropAdapterDescriptor> foundDescriptors = new LinkedHashSet<CommonDropAdapterDescriptor>();
for (INavigatorContentDescriptor contentDescriptor : dropDescriptors.keySet()) {
if (aContentService.isVisible(contentDescriptor.getId())
&& aContentService.isActive(contentDescriptor.getId())) {
List<CommonDropAdapterDescriptor> dropDescriptors = getDropDescriptors(contentDescriptor);
for (CommonDropAdapterDescriptor dropDescriptor : dropDescriptors) {
if (dropDescriptor.isDropElementSupported(aDropTarget)) {
foundDescriptors.add(dropDescriptor);
}
}
}
}
if (foundDescriptors.isEmpty()) {
return NO_DESCRIPTORS;
}
return foundDescriptors
.toArray(new CommonDropAdapterDescriptor[foundDescriptors
.size()]);
}
private List<CommonDropAdapterDescriptor> getDropDescriptors(
INavigatorContentDescriptor aContentDescriptor) {
List<CommonDropAdapterDescriptor> descriptors = dropDescriptors.get(aContentDescriptor);
if (descriptors != null) {
return descriptors;
}
synchronized (dropDescriptors) {
descriptors = dropDescriptors.get(aContentDescriptor);
if (descriptors == null) {
dropDescriptors.put(aContentDescriptor,
(descriptors = new ArrayList<CommonDropAdapterDescriptor>()));
}
}
return descriptors;
}
/**
* @param aContentDescriptor
* A non-null content descriptor.
* @param aDropDescriptor
* A non-null drop descriptor.
*/
private void addCommonDropAdapter(
INavigatorContentDescriptor aContentDescriptor,
CommonDropAdapterDescriptor aDropDescriptor) {
getDropDescriptors(aContentDescriptor).add(aDropDescriptor);
}
private class CommonDropAdapterRegistry extends
NavigatorContentRegistryReader implements
INavigatorContentExtPtConstants {
private CommonDropAdapterRegistry() {
}
@Override
protected boolean readElement(IConfigurationElement element) {
if (TAG_NAVIGATOR_CONTENT.equals(element.getName())) {
String id = element.getAttribute(ATT_ID);
if (id != null) {
INavigatorContentDescriptor contentDescriptor = CONTENT_DESCRIPTOR_MANAGER
.getContentDescriptor(id);
if (contentDescriptor != null) {
IConfigurationElement[] commonDropAdapters = element
.getChildren(TAG_COMMON_DROP_ADAPTER);
for (IConfigurationElement commonDropAdapter : commonDropAdapters) {
addCommonDropAdapter(contentDescriptor,
new CommonDropAdapterDescriptor(commonDropAdapter, contentDescriptor));
}
}
}
}
return super.readElement(element);
}
}
}