| /******************************************************************************* |
| * Copyright (c) 2006, 2010 IBM Corporation and others. |
| * |
| * This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License 2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.team.internal.ui.mapping; |
| |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.resources.mapping.IModelProviderDescriptor; |
| import org.eclipse.core.resources.mapping.ModelProvider; |
| import org.eclipse.jface.viewers.TreePath; |
| import org.eclipse.jface.viewers.TreePathViewerSorter; |
| import org.eclipse.jface.viewers.Viewer; |
| import org.eclipse.team.internal.ui.Utils; |
| import org.eclipse.ui.navigator.CommonViewerSorter; |
| import org.eclipse.ui.views.navigator.ResourceComparator; |
| |
| public class TeamViewerSorter extends TreePathViewerSorter { |
| |
| private CommonViewerSorter sorter; |
| private ResourceComparator resourceComparator; |
| |
| public TeamViewerSorter(CommonViewerSorter sorter) { |
| this.sorter = sorter; |
| this.resourceComparator = new ResourceComparator(ResourceComparator.NAME); |
| } |
| |
| @Override |
| public int category(Object element) { |
| if (element instanceof ModelProvider) { |
| return 2; |
| } |
| IResource resource = Utils.getResource(element); |
| if (resource != null && resource.getType() == IResource.PROJECT) { |
| return 1; |
| } |
| |
| return super.category(element); |
| } |
| |
| @Override |
| public int compare(Viewer viewer, TreePath parentPath, Object e1, Object e2) { |
| if (parentPath == null || parentPath.getSegmentCount() == 0) { |
| // We need to handle the sorting at the top level |
| int cat1 = category(e1); |
| int cat2 = category(e2); |
| |
| if (cat1 != cat2) |
| return cat1 - cat2; |
| |
| if (e1 instanceof ModelProvider && e2 instanceof ModelProvider) { |
| ModelProvider mp1 = (ModelProvider) e1; |
| ModelProvider mp2 = (ModelProvider) e2; |
| if (isExtends(mp1, mp2.getDescriptor())) { |
| return 1; |
| } |
| if (isExtends(mp2, mp1.getDescriptor())) { |
| return -1; |
| } |
| return mp1.getDescriptor().getLabel().compareTo(mp2.getDescriptor().getLabel()); |
| } |
| IResource r1 = Utils.getResource(e1); |
| IResource r2 = Utils.getResource(e2); |
| if (r1 != null && r2 != null) { |
| return resourceComparator.compare(viewer, r1, r2); |
| } |
| } |
| return sorter.compare(viewer, parentPath, e1, e2); |
| } |
| |
| private boolean isExtends(ModelProvider mp1, IModelProviderDescriptor desc) { |
| String[] extended = mp1.getDescriptor().getExtendedModels(); |
| for (int i = 0; i < extended.length; i++) { |
| String id = extended[i]; |
| if (id.equals(desc.getId())) { |
| return true; |
| } |
| } |
| for (int i = 0; i < extended.length; i++) { |
| String id = extended[i]; |
| IModelProviderDescriptor desc2 = ModelProvider.getModelProviderDescriptor(id); |
| if (isExtends(mp1, desc2)) { |
| return true; |
| } |
| } |
| return false; |
| } |
| } |