/*******************************************************************************
* 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.sorters;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.ui.internal.navigator.NavigatorContentService;
import org.eclipse.ui.internal.navigator.VisibilityAssistant.VisibilityListener;
import org.eclipse.ui.internal.navigator.extensions.NavigatorContentDescriptorManager;
import org.eclipse.ui.navigator.INavigatorContentDescriptor;
import org.eclipse.ui.navigator.INavigatorSorterService;
/**
*
* Provides a default implementation of {@link INavigatorSorterService}.
*
* @since 3.2
*
*/
public class NavigatorSorterService implements INavigatorSorterService, VisibilityListener {
private final NavigatorContentService contentService;
/* A map of (CommonSorterDescriptor, ViewerSorter)-pairs */
private final Map sorters = new HashMap();
private INavigatorContentDescriptor[] sortOnlyDescriptors;
/**
* Create a sorter service attached to the given content service.
*
* @param aContentService
* The content service used by the viewer that will use this
* sorter service.
*/
public NavigatorSorterService(NavigatorContentService aContentService) {
contentService = aContentService;
computeSortOnlyDescriptors();
}
private synchronized void computeSortOnlyDescriptors() {
List sortOnlyList = new ArrayList();
for (INavigatorContentDescriptor descriptor : NavigatorContentDescriptorManager.getInstance()
.getSortOnlyContentDescriptors()) {
if (contentService.isActive(descriptor.getId())) {
sortOnlyList.add(descriptor);
}
}
sortOnlyDescriptors = (INavigatorContentDescriptor[]) sortOnlyList.toArray(new INavigatorContentDescriptor[]{});
}
@Override
public ViewerSorter findSorterForParent(Object aParent) {
CommonSorterDescriptor[] descriptors = CommonSorterDescriptorManager
.getInstance().findApplicableSorters(contentService, aParent);
if (descriptors.length > 0) {
return getSorter(descriptors[0]);
}
return SkeletonViewerSorter.INSTANCE;
}
private ViewerSorter getSorter(CommonSorterDescriptor descriptor) {
ViewerSorter sorter = null;
synchronized (sorters) {
sorter = (ViewerSorter) sorters.get(descriptor);
if (sorter == null) {
sorters.put(descriptor, sorter = descriptor.createSorter());
}
}
return sorter;
}
@Override
public synchronized ViewerSorter findSorter(INavigatorContentDescriptor source,
Object parent, Object lvalue, Object rvalue) {
CommonSorterDescriptorManager dm = CommonSorterDescriptorManager
.getInstance();
CommonSorterDescriptor[] descriptors;
INavigatorContentDescriptor lookupDesc;
for (int i = 0; i < sortOnlyDescriptors.length; i++) {
lookupDesc = sortOnlyDescriptors[i];
if (source!= null && source.getSequenceNumber() < lookupDesc.getSequenceNumber()) {
lookupDesc = source;
source = null;
i--;
}
descriptors = dm. findApplicableSorters(contentService, lookupDesc, parent);
if (descriptors.length > 0) {
return getSorter(descriptors[0]);
}
}
if (source != null) {
descriptors = dm. findApplicableSorters(contentService, source, parent);
if (descriptors.length > 0) {
return getSorter(descriptors[0]);
}
}
return null;
}
@Override
public Map findAvailableSorters(INavigatorContentDescriptor theSource) {
CommonSorterDescriptor[] descriptors = CommonSorterDescriptorManager.getInstance().findApplicableSorters(theSource);
Map sorters = new HashMap();
int count = 0;
for (CommonSorterDescriptor descriptor : descriptors) {
if(descriptor.getId() != null && descriptor.getId().length() > 0)
sorters.put(descriptor.getId(), getSorter(descriptor));
else
sorters.put(theSource.getId()+".sorter."+ (++count), getSorter(descriptor)); //$NON-NLS-1$
}
return sorters;
}
@Override
public void onVisibilityOrActivationChange() {
computeSortOnlyDescriptors();
}
}