blob: 531e2bda44afbc8fd7d9827da5c2074eeeb68b26 [file] [log] [blame]
//------------------------------------------------------------------------------
// Copyright (c) 2005, 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 implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.library.layout.elements;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.epf.library.configuration.ConfigurationHelper;
import org.eclipse.epf.library.edit.PresentationContext;
import org.eclipse.epf.library.edit.configuration.PracticeItemProvider;
import org.eclipse.epf.library.edit.configuration.PracticeItemProvider.GroupingHelper;
import org.eclipse.epf.library.edit.util.CategorySortHelper;
import org.eclipse.epf.library.edit.util.PracticePropUtil;
import org.eclipse.epf.library.layout.ElementLayoutManager;
import org.eclipse.epf.library.layout.util.XmlElement;
import org.eclipse.epf.uma.MethodElement;
import org.eclipse.epf.uma.Practice;
import org.eclipse.epf.uma.Task;
import org.eclipse.epf.uma.UmaPackage;
import org.eclipse.epf.uma.WorkProduct;
import org.eclipse.epf.uma.ecore.util.OppositeFeature;
import org.eclipse.epf.uma.util.UserDefinedTypeMeta;
/**
* The element layout for a Practice
*
* @author Weiping Lu
* @since 1.5
*/
public class PracticeLayout extends AbstractElementLayout {
public PracticeLayout() {
super();
}
public void init(ElementLayoutManager layoutManager, MethodElement element) {
super.__init(layoutManager, element);
}
@Override
protected XmlElement getXmlElement() {
XmlElement elementXml = super.getXmlElement();
Practice practice = (Practice) getElement();
PracticePropUtil propUtil = PracticePropUtil.getPracticePropUtil();
try {
UserDefinedTypeMeta meta = propUtil.getUtdData(practice);
if (meta != null) {
addReferences(udtFeauteObj, elementXml,
"User defined type", Collections.singletonList(meta)); //$NON-NLS-1$
}
} catch (Exception e) {
}
return elementXml;
}
private static Object udtFeauteObj = new Object();
@Override
protected void processChild(Object feature, XmlElement parent, List items,
boolean includeReferences) {
if (feature == udtFeauteObj) {
if (items == null || items.isEmpty()) {
return;
}
for (UserDefinedTypeMeta meta : (List<UserDefinedTypeMeta>) items) {
XmlElement childXmlElement = new XmlElement("Element");//$NON-NLS-1$
parent.addChild(childXmlElement);
for (String name : UserDefinedTypeMeta.rteNames) {
String value = meta.getRteNameMap().get(name);
if (value == null) {
value = name;
}
childXmlElement.setAttribute(name, value);//$NON-NLS-1$
}
}
return;
}
super.processChild(feature, parent, items, includeReferences);
}
/**
* @see org.eclipse.epf.library.layout.IElementLayout#getXmlElement(boolean)
*/
public XmlElement getXmlElement(boolean includeReferences) {
XmlElement elementXml = super.getXmlElement(includeReferences);
if (includeReferences) {
EStructuralFeature feature = UmaPackage.Literals.PRACTICE__CONTENT_REFERENCES;
List<MethodElement> children = calc0nFeatureValue(element, null,
feature, layoutManager.getElementRealizer());
List<WorkProduct> wpSlotInputs = getInputWpSlots(children);
EStructuralFeature feature1 = UmaPackage.Literals.PRACTICE__ACTIVITY_REFERENCES;
List<MethodElement> children1 = calc0nFeatureValue(element, null,
feature1, layoutManager.getElementRealizer());
// EStructuralFeature feature2 = UmaPackage.Literals.PRACTICE__SUB_PRACTICES;
// List<MethodElement> children2 = calc0nFeatureValue(element, null,
// feature2, layoutManager.getElementRealizer());
children.addAll(children1);
// children.addAll(children2);
List ret = new ArrayList();
Practice practice = (Practice) getElement();
PracticePropUtil propUtil = PracticePropUtil.getPracticePropUtil();
boolean isUtdType = propUtil.isUdtType(practice);
if (isUtdType) {
Set<MethodElement> set = new HashSet<MethodElement>();
for (EReference ref : propUtil.getUdtMeta(practice).getQualifiedReferences()) {
List<MethodElement> qrList = ConfigurationHelper
.calc0nFeatureValue(element, ref, layoutManager
.getElementRealizer());
if (qrList != null && !qrList.isEmpty()) {
set.addAll(qrList);
}
}
if (! set.isEmpty()) {
children.removeAll(set);
}
}
GroupingHelper groupingHelper = new GroupingHelper(this, isUtdType) {
protected void grouping(Object parentObject, List ret,
Collection children, GroupingHelper groupingHelper) {
if (getGrouper() instanceof PracticeLayout) {
((PracticeLayout) getGrouper()).grouping(parentObject, ret,
children, groupingHelper);
}
}
};
grouping(this, ret, children, groupingHelper);
addReferences(feature,
elementXml, "Practice guidance tree", ret); //$NON-NLS-1$
if (wpSlotInputs != null) {
addReferences(feature,
elementXml, "Input work product slots", wpSlotInputs); //$NON-NLS-1$
}
if (isUtdType) {
List<MethodElement> list = propUtil.getUdtReferencingList(practice);
if (list != null && !list.isEmpty()) {
list = ConfigurationHelper.getCalculatedElements(list, layoutManager.getElementRealizer());
}
addReferences(feature,
elementXml, "Udt referencing list", list); //$NON-NLS-1$
}
}
return elementXml;
}
private List<WorkProduct> getInputWpSlots(List<MethodElement> elements) {
Set<WorkProduct> slots = new HashSet<WorkProduct>();
for (MethodElement elem: elements) {
if (elem instanceof Task) {
Task task = (Task) elem;
for (WorkProduct wp: task.getMandatoryInput()) {
if (wp.getIsAbstract()) {
slots.add(wp);
}
}
for (WorkProduct wp: task.getOptionalInput()) {
if (wp.getIsAbstract()) {
slots.add(wp);
}
}
}
}
if (slots.isEmpty()) {
return null;
}
List<WorkProduct> wpSlotInputs = new ArrayList<WorkProduct>();
wpSlotInputs.addAll(slots);
if (wpSlotInputs.size() > 1) {
Comparator comparator = PresentationContext.INSTANCE.getPresNameComparator();
Collections.<WorkProduct>sort(wpSlotInputs, comparator);
}
return wpSlotInputs;
}
protected boolean acceptFeatureValue(EStructuralFeature feature, Object value) {
if (feature.isMany()) {
//return false;
}
return super.acceptFeatureValue(feature, value);
}
private void grouping(Object parentObject, List ret, Collection children,
PracticeItemProvider.GroupingHelper groupingHelper) {
Map<String, List> map = PracticeItemProvider.getSubGroupMap(children, groupingHelper);
boolean toSort = true;
if (parentObject instanceof PracticeLayout) {
MethodElement elem = ((PracticeLayout) parentObject).element;
if (elem != null) {
toSort = ! CategorySortHelper.isManualCategorySort(elem);
}
}
String[] keys = groupingHelper.getKeysInOrder();
for (int i = 0; i < keys.length; i++) {
String key = keys[i];
List subgroupChildren = map.get(key);
if (subgroupChildren == null || subgroupChildren.isEmpty()) {
continue;
}
if (groupingHelper.toGroup(key, subgroupChildren)) {
subgroupChildren = groupingHelper.nestedGrouping(parentObject, key, subgroupChildren);
SubGroupValue subGroupValue = new SubGroupValue(key, subgroupChildren);
ret.add(subGroupValue);
} else {
if (toSort) {
PracticeItemProvider.sort(subgroupChildren);
}
ret.addAll(subgroupChildren);
}
}
}
protected void processNonMethodElementInProcessChild(
Object nonMethodElementChild, Object feature, XmlElement parent,
boolean includeReferences) {
if (nonMethodElementChild instanceof SubGroupValue) {
SubGroupValue subGroupValue = (SubGroupValue) nonMethodElementChild;
String key = subGroupValue.key;
List listValue = subGroupValue.listValue;
addReferences(feature,
parent, key, listValue);
}
}
protected boolean acceptFeatureValue(OppositeFeature feature, Object value) {
/* if ( feature == AssociationHelper.DescribableElement_CustomCategories) {
return true;
}*/
return super.acceptFeatureValue(feature, value);
}
static class SubGroupValue {
public String key;
public List listValue;
public SubGroupValue(String key, List listValue) {
this.key = key;
this.listValue = listValue;
}
}
protected void loadQrReferences(XmlElement elementXml) {
super.loadQrReferences(elementXml);
Practice practice = (Practice) getElement();
PracticePropUtil propUtil = PracticePropUtil.getPracticePropUtil();
UserDefinedTypeMeta meta = propUtil.getUdtMeta(practice);
if (meta == null || meta.getQualifiedReferences().isEmpty()) {
return;
}
XmlElement qrWrapper = elementXml.newChild(TAG_REFERENCELIST);
qrWrapper.setAttribute("name", "UDT reference qualifiers"); //$NON-NLS-1$//$NON-NLS-2$
//List<EReference> references = getSortedReferences(meta.getQualifiedReferences(), meta);
Set<EReference> references = meta.getQualifiedReferences();
for (EReference ref : references) {
List<MethodElement> qrList = ConfigurationHelper
.calc0nFeatureValue(element, ref, layoutManager
.getElementRealizer());
if (qrList != null && !qrList.isEmpty()) {
String name = meta.getReferenceQualifierName(ref.getName());
addReferences(ref, qrWrapper, name, qrList);
}
}
}
private List<EReference> getSortedReferences(Set<EReference> references, final UserDefinedTypeMeta meta) {
List<EReference> result = new ArrayList<EReference>();
for (EReference ref : references) {
result.add(ref);
}
Collections.sort(result, new Comparator<EReference>() {
public int compare(EReference object1, EReference object2) {
String name1 = meta.getReferenceQualifierName(object1.getName());
String name2 = meta.getReferenceQualifierName(object2.getName());
return name1.compareTo(name2);
}
});
return result;
}
}