blob: 477cafede96921c6f703a33d1faf0277295a1e41 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006 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.sorters;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.osgi.util.NLS;
import org.eclipse.ui.internal.navigator.CommonNavigatorMessages;
import org.eclipse.ui.internal.navigator.NavigatorContentService;
import org.eclipse.ui.internal.navigator.NavigatorPlugin;
import org.eclipse.ui.internal.navigator.extensions.NavigatorContentDescriptor;
import org.eclipse.ui.internal.navigator.extensions.NavigatorContentRegistryReader;
import org.eclipse.ui.navigator.INavigatorContentDescriptor;
/**
* @since 3.2
*
*/
public class CommonSorterDescriptorManager {
private static final CommonSorterDescriptorManager INSTANCE = new CommonSorterDescriptorManager();
private static final CommonSorterDescriptor[] NO_SORTER_DESCRIPTORS = new CommonSorterDescriptor[0];
private final Map sortersMap = new HashMap();
/**
*
* @return An initialized singleton instance of the
* CommonSorterDescriptorManager.
*/
public static CommonSorterDescriptorManager getInstance() {
return INSTANCE;
}
private CommonSorterDescriptorManager() {
new CommonSorterDescriptorRegistry().readRegistry();
}
/**
*
* @param contentService
* A content service to filter the visible filters.
* @param aParent
* The parent used to search for a sorter.
* @return The set of filters that are 'visible' to the given viewer
* descriptor.
*/
public CommonSorterDescriptor[] findApplicableSorters(
NavigatorContentService contentService, Object aParent) {
INavigatorContentDescriptor sourceOfContribution = contentService
.getSourceOfContribution(aParent);
List applicableSorters = new ArrayList();
CommonSorterDescriptor descriptor;
Set sorters = getCommonSorters(sourceOfContribution);
for (Iterator sortersItr = sorters.iterator(); sortersItr.hasNext();) {
descriptor = (CommonSorterDescriptor) sortersItr.next();
if (descriptor.isEnabledForParent(aParent)) {
applicableSorters.add(descriptor);
}
}
if (applicableSorters.size() == 0) {
return NO_SORTER_DESCRIPTORS;
}
return (CommonSorterDescriptor[]) applicableSorters
.toArray(new CommonSorterDescriptor[applicableSorters.size()]);
}
/**
*
* @param aContentService
* A content service to filter the visible filters.
* @param theSource
* The source of each *value.
* @param aParent
* The parent used to search for a sorter.
* @param anLvalue
* The left operand to compare.
* @param anRvalue
* The right operand to compare.
* @return The set of filters that are 'visible' to the given viewer
* descriptor.
*/
public CommonSorterDescriptor[] findApplicableSorters(
NavigatorContentService aContentService,
INavigatorContentDescriptor theSource, Object aParent,
Object anLvalue, Object anRvalue) {
List applicableSorters = new ArrayList();
CommonSorterDescriptor descriptor;
Set sorters = getCommonSorters(theSource);
for (Iterator sortersItr = sorters.iterator(); sortersItr.hasNext();) {
descriptor = (CommonSorterDescriptor) sortersItr.next();
if (descriptor.isEnabledForParent(aParent)) {
applicableSorters.add(descriptor);
}
}
if (applicableSorters.size() == 0) {
return NO_SORTER_DESCRIPTORS;
}
return (CommonSorterDescriptor[]) applicableSorters
.toArray(new CommonSorterDescriptor[applicableSorters.size()]);
}
/**
*
* @param theSource
* The source of each *value.
* @return The set of filters that are 'visible' to the given viewer
* descriptor.
*/
public CommonSorterDescriptor[] findApplicableSorters(INavigatorContentDescriptor theSource) {
Set sorters = getCommonSorters(theSource);
if (sorters.size() == 0) {
return NO_SORTER_DESCRIPTORS;
}
return (CommonSorterDescriptor[]) sorters
.toArray(new CommonSorterDescriptor[sorters.size()]);
}
private class CommonSorterDescriptorRegistry extends
NavigatorContentRegistryReader {
private CommonSorterDescriptorRegistry() {
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.internal.navigator.extensions.NavigatorContentRegistryReader#readElement(org.eclipse.core.runtime.IConfigurationElement)
*/
protected boolean readElement(IConfigurationElement element) {
if (TAG_NAVIGATOR_CONTENT.equals(element.getName())) {
String id = element.getAttribute(ATT_ID);
if (id != null) {
NavigatorContentDescriptor contentDescriptor = CONTENT_DESCRIPTOR_MANAGER
.getContentDescriptor(id);
if (contentDescriptor != null) {
IConfigurationElement[] children = element
.getChildren(TAG_COMMON_SORTER);
if (children.length > 0) {
Set localSorters = getCommonSorters(contentDescriptor);
for (int i = 0; i < children.length; i++) {
localSorters.add(new CommonSorterDescriptor(
children[i]));
}
return true;
}
} else {
NavigatorPlugin
.logError(
0,
NLS
.bind(
CommonNavigatorMessages.CommonSorterDescriptorManager_A_navigatorContent_extension_does_n_,
new Object[] {
id,
element
.getDeclaringExtension()
.getNamespaceIdentifier() }),
null);
}
} else {
NavigatorPlugin
.logError(
0,
NLS
.bind(
CommonNavigatorMessages.CommonSorterDescriptorManager_A_navigatorContent_extesnion_in_0_,
element.getNamespaceIdentifier()),
null);
}
}
return super.readElement(element);
}
}
private Set getCommonSorters(INavigatorContentDescriptor contentDescriptor) {
Set descriptors = null;
synchronized (sortersMap) {
descriptors = (Set) sortersMap.get(contentDescriptor);
if (descriptors == null) {
sortersMap.put(contentDescriptor, descriptors = new HashSet());
}
}
return descriptors;
}
}