blob: eeb5821a198176b190a14d35b8b9c95ccefb9da4 [file] [log] [blame]
//------------------------------------------------------------------------------
// Copyright (c) 2005, 2007 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 implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.library.edit.util;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.epf.library.edit.LibraryEditResources;
import org.eclipse.epf.library.edit.PresentationContext;
import org.eclipse.epf.library.edit.util.model.OrderInfo;
import org.eclipse.epf.uma.ContentCategory;
import org.eclipse.epf.uma.CustomCategory;
import org.eclipse.epf.uma.Discipline;
import org.eclipse.epf.uma.Domain;
import org.eclipse.epf.uma.MethodElement;
import org.eclipse.epf.uma.MethodElementProperty;
import org.eclipse.epf.uma.RoleSet;
import org.eclipse.epf.uma.Tool;
import org.eclipse.epf.uma.UmaFactory;
import org.eclipse.epf.uma.UmaPackage;
import org.eclipse.epf.uma.VariabilityElement;
import org.eclipse.epf.uma.WorkProductType;
/**
* Helper class to handle sorting of Category elements
* @author Jeff Hardy
*
*/
public class CategorySortHelper {
public static final String KEY_CATEGORY_ELEMENTS__SORT_TYPE = "CategoryElementsSortType"; //$NON-NLS-1$
public static final String V_CATEGORY_ELEMENTS__SORT_TYPE_ALPHA = "Alphabetic"; //$NON-NLS-1$
public static final String V_CATEGORY_ELEMENTS__SORT_TYPE_REVERSE_ALPHA = "ReverseAlphabetic"; //$NON-NLS-1$
public static final String V_CATEGORY_ELEMENTS__SORT_TYPE_METHOD_TYPE = "MethodType"; //$NON-NLS-1$
public static final String V_CATEGORY_ELEMENTS__SORT_TYPE_MANUAL = "Manual"; //$NON-NLS-1$
/**
* Creates a new MethodElementProperty to store the Category sort type
* @param sortType
* @return
*/
public static MethodElementProperty createNewSortProperty(String sortType) {
MethodElementProperty prop = UmaFactory.eINSTANCE.createMethodElementProperty();
prop.setName(KEY_CATEGORY_ELEMENTS__SORT_TYPE);
if (sortType != null) {
prop.setValue(sortType);
}
return prop;
}
/**
* Return category sort property for method element
* @param element
* @return
* property if found, else null
*/
public static MethodElementProperty getCategorySortProperty(MethodElement element) {
List props = element.getMethodElementProperty();
for (Iterator it = props.iterator(); it.hasNext();) {
MethodElementProperty prop = (MethodElementProperty) it.next();
if (KEY_CATEGORY_ELEMENTS__SORT_TYPE.equals(prop.getName())) {
return prop;
}
}
return null;
}
/**
* return true iff the category sort-type is set to manual
* @param element
* @return
* property if found, else null
*/
public static boolean isManualCategorySort(MethodElement element) {
String sortType = getCategorySortValue(element);
if (V_CATEGORY_ELEMENTS__SORT_TYPE_MANUAL.equals(sortType))
return true;
return false;
}
/**
* Returns the sort-type for the given MethodElement.
* If none is set, will return Alphabetic sort (V_CATEGORY_ELEMENTS__SORT_TYPE_ALPHA) as a default
* @param element
* @return
*/
public static String getCategorySortValue(MethodElement element) {
MethodElementProperty prop = getCategorySortProperty(element);
if (prop == null)
return V_CATEGORY_ELEMENTS__SORT_TYPE_MANUAL;
return prop.getValue();
}
public static List<String> getCategorySortTypes() {
List<String> returnList = Arrays.<String>asList(
V_CATEGORY_ELEMENTS__SORT_TYPE_MANUAL,
V_CATEGORY_ELEMENTS__SORT_TYPE_ALPHA,
V_CATEGORY_ELEMENTS__SORT_TYPE_REVERSE_ALPHA,
V_CATEGORY_ELEMENTS__SORT_TYPE_METHOD_TYPE);
return returnList;
}
public static String getSortTypeDisplayName(String sortType) {
if (V_CATEGORY_ELEMENTS__SORT_TYPE_ALPHA.equals(sortType)) {
return LibraryEditResources.SortType_Alphabetic;
}
if (V_CATEGORY_ELEMENTS__SORT_TYPE_REVERSE_ALPHA.equals(sortType)) {
return LibraryEditResources.SortType_ReverseAlphabetic;
}
if (V_CATEGORY_ELEMENTS__SORT_TYPE_METHOD_TYPE.equals(sortType)) {
return LibraryEditResources.SortType_MethodType;
}
if (V_CATEGORY_ELEMENTS__SORT_TYPE_MANUAL.equals(sortType)) {
return LibraryEditResources.SortType_Manual;
}
return ""; //$NON-NLS-1$
}
/**
* Returns a sorted category element list based on the category's sort type
* Respects the Name/PresName toggle
* @param element
* @param elements array to sort
* @return
*/
public static List<Object> sortCategoryElements(MethodElement element, Object[] elements) {
return sortCategoryElements(element, elements, false);
}
/**
* Returns a sorted category element list based on the category's sort type
* @param element
* @param elements array to sort
* @param forcePresNameSort true to always sort by presName. false will respect the toggle
* @return
*/
public static List<Object> sortCategoryElements(MethodElement element, Object[] elements, boolean forcePresNameSort) {
/*
* TODO: can't use generics here because EMF doesn't use them yet - the elements param
* usually comes from ContentElementsOrderList class which extends EMF's BasicEList and so
* the toArray() method will only return Object[]
*/
List<Object> returnList = new ArrayList<Object>(Arrays.<Object>asList(elements));
String sortType = getCategorySortValue(element);
if (V_CATEGORY_ELEMENTS__SORT_TYPE_MANUAL.equals(sortType)) {
if (element instanceof ContentCategory) {
return findManualSortOrderInContributors((ContentCategory)element, returnList);
}
return returnList;
} else if (V_CATEGORY_ELEMENTS__SORT_TYPE_ALPHA.equals(sortType)) {
Comparator comparator = PresentationContext.INSTANCE.getComparator();
if (forcePresNameSort)
comparator = PresentationContext.INSTANCE.getPresNameComparator();
Collections.<Object>sort(returnList, comparator);
} else if (V_CATEGORY_ELEMENTS__SORT_TYPE_REVERSE_ALPHA.equals(sortType)) {
Comparator comparator = PresentationContext.INSTANCE.getReverseComparator();
if (forcePresNameSort)
comparator = PresentationContext.INSTANCE.getPresNameReverseComparator();
Collections.<Object>sort(returnList, comparator);
} else if (V_CATEGORY_ELEMENTS__SORT_TYPE_METHOD_TYPE.equals(sortType)) {
Comparator comparator = PresentationContext.INSTANCE.getMethodElementTypeComparator();
if (forcePresNameSort)
comparator = PresentationContext.INSTANCE.getPresNameMethodElementTypeComparator();
Collections.<Object>sort(returnList, comparator);
}
return returnList;
}
private static List<Object> findManualSortOrderInContributors(ContentCategory cc, List<Object> elementList) {
OrderInfo latestInfo = null;
Map<String, MethodElement> guidMap = new HashMap<String, MethodElement>();
String sortType = getCategorySortValue(cc);
if (V_CATEGORY_ELEMENTS__SORT_TYPE_MANUAL.equals(sortType)) {
// set up GUID map
for (Iterator iterator = elementList.iterator(); iterator.hasNext();) {
Object o = iterator.next();
if (o instanceof MethodElement) {
guidMap.put(((MethodElement)o).getGuid(),
(MethodElement)o);
}
}
for (Iterator iter = TngUtil.getContributors(cc);iter.hasNext();) {
Object obj = iter.next();
if (obj instanceof ContentCategory) {
ContentCategory contributor = (ContentCategory)obj;
OrderInfo orderInfo = TngUtil.getOrderInfo(contributor, ContentElementOrderList.ORDER_INFO_NAME);
if (orderInfo == null) {
continue;
}
// find latest OrderInfo that contains all these elements
if (latestInfo == null || orderInfo.getTimestamp() > latestInfo.getTimestamp()) {
latestInfo = orderInfo;
}
}
}
if (latestInfo != null) {
List<Object> returnList = new ArrayList<Object>();
// sort list according to orderInfo
int size = latestInfo.getGUIDs().size();
for (int i = 0; i < size; i++) {
String guid = (String)latestInfo.getGUIDs().get(i);
Object element = guidMap.get(guid);
if (element != null) {
returnList.add(element);
guidMap.remove(guid);
} else {
// try to find element in the guidMap that has a generalizer with "guid"
MethodElement me = findElementInGeneralizerList(guidMap, guid);
if (me != null) {
returnList.add(me);
guidMap.remove(guid);
} else {
// could not locate, will return original list
}
}
}
if (elementList.size() == returnList.size())
return returnList;
}
}
return elementList;
}
private static MethodElement findElementInGeneralizerList(Map<String, MethodElement> guidMap, String guid) {
for (Iterator<MethodElement> iter = guidMap.values().iterator();iter.hasNext();) {
MethodElement value = iter.next();
if (value instanceof VariabilityElement) {
for (Iterator genIter = TngUtil.getGeneralizers((VariabilityElement)value);genIter.hasNext();) {
Object generalizer = genIter.next();
if (generalizer instanceof MethodElement) {
if (((MethodElement)generalizer).getGuid().equals(guid)) {
return (MethodElement)generalizer;
}
}
}
}
}
return null;
}
/**
* @param cc
* @param feature
* @return
*/
public static boolean needToSort(MethodElement element, EStructuralFeature feature) {
if (! (element instanceof ContentCategory)) {
return false;
}
if (element instanceof CustomCategory &&
feature == UmaPackage.eINSTANCE.getCustomCategory_CategorizedElements()) {
return true;
}
if (element instanceof Discipline &&
feature == UmaPackage.eINSTANCE.getDiscipline_Tasks()) {
return true;
}
if (element instanceof Domain &&
feature == UmaPackage.eINSTANCE.getDomain_WorkProducts()) {
return true;
}
if (element instanceof RoleSet &&
feature == UmaPackage.eINSTANCE.getRoleSet_Roles()) {
return true;
}
if (element instanceof Tool &&
feature == UmaPackage.eINSTANCE.getTool_ToolMentors()) {
return true;
}
if (element instanceof WorkProductType &&
feature == UmaPackage.eINSTANCE.getWorkProductType_WorkProducts()) {
return true;
}
return false;
}
}