blob: 32fe953d700066b533e4956dc17b789d44e53e6a [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.edit.configuration;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.edit.provider.IDisposable;
import org.eclipse.epf.library.edit.ContextIFilter;
import org.eclipse.epf.library.edit.IConfigurable;
import org.eclipse.epf.library.edit.IConfigurator;
import org.eclipse.epf.library.edit.IFilter;
import org.eclipse.epf.library.edit.IGroupContainer;
import org.eclipse.epf.library.edit.IStatefulItemProvider;
import org.eclipse.epf.library.edit.LibraryEditPlugin;
import org.eclipse.epf.library.edit.category.DisciplineCategoriesItemProvider;
import org.eclipse.epf.library.edit.category.RoleSetsItemProvider;
import org.eclipse.epf.library.edit.util.LibraryEditUtil;
import org.eclipse.epf.library.edit.util.ModelStructure;
import org.eclipse.epf.library.edit.util.PracticePropUtil;
import org.eclipse.epf.library.edit.util.TngUtil;
import org.eclipse.epf.uma.ContentCategory;
import org.eclipse.epf.uma.Domain;
import org.eclipse.epf.uma.MethodConfiguration;
import org.eclipse.epf.uma.Practice;
import org.eclipse.epf.uma.Role;
import org.eclipse.epf.uma.Task;
import org.eclipse.epf.uma.Tool;
import org.eclipse.epf.uma.ToolMentor;
import org.eclipse.epf.uma.UmaPackage;
import org.eclipse.epf.uma.WorkProduct;
import org.eclipse.epf.uma.WorkProductType;
import org.eclipse.epf.uma.provider.UmaEditPlugin;
import org.eclipse.epf.uma.util.AssociationHelper;
import org.eclipse.epf.uma.util.UserDefinedTypeMeta;
/**
* The item provider adapter for a method configuration in the Configuration
* view.
*
* @author Phong Nguyen Le
* @author Shilpa Toraskar
* @author Kelvin Low
* @author Jinhua Xi
* @since 1.0
*/
public class MethodConfigurationItemProvider extends
org.eclipse.epf.uma.provider.MethodConfigurationItemProvider implements
IGroupContainer, IConfigurable, IStatefulItemProvider {
private Map groupItemProviderMap;
// changed to protected, extended class can play with children variable.
protected ArrayList children;
private static boolean finalOnGetChildrenCall = false;
public static boolean isFinalOnGetChildrenCall() {
return finalOnGetChildrenCall;
}
public static void setFinalOnGetChildrenCall(boolean b) {
finalOnGetChildrenCall = b;
}
private IFilter disciplinesFilter = new IFilter() {
public boolean accept(Object obj) {
ContentCategory element = (ContentCategory) obj;
// Browsing: With categories, replace generalization
// causes both replacement and base to become invisible to browsing
return DisciplineCategoriesItemProvider.accept(element) /*
* &&
* element.getVariabilityBasedOnElement() ==
* null
*/;
}
};
private static final IFilter domainFilter = new IFilter() {
public boolean accept(Object obj) {
// Browsing: With categories, replace generalization
// causes both replacement and base to become invisible to browsing
return obj instanceof Domain /*
* &&
* ((Domain)obj).getVariabilityBasedOnElement() ==
* null
*/;
}
};
private static final IFilter workProductTypesFilter = new IFilter() {
public boolean accept(Object obj) {
// Browsing: With categories, replace generalization
// causes both replacement and base to become invisible to browsing
return obj instanceof WorkProductType /*
* &&
* ((WorkProductType)obj).getVariabilityBasedOnElement() ==
* null
*/;
}
};
private IFilter roleSetsFilter = new IFilter() {
public boolean accept(Object obj) {
// Browsing: With categories, replace generalization
// causes both replacement and base to become invisible to browsing
return RoleSetsItemProvider.accept(obj) /*
* &&
* ((VariabilityElement)obj).getVariabilityBasedOnElement() ==
* null
*/;
}
};
private static final IFilter toolsFilter = new IFilter() {
public boolean accept(Object obj) {
// Browsing: With categories, replace generalization
// causes both replacement and base to become invisible to browsing
return obj instanceof Tool /*
* &&
* ((Tool)obj).getVariabilityBasedOnElement() ==
* null
*/;
}
};
private static final ContextIFilter customCategoriesFilter = new ContextIFilter() {
public boolean accept(Object obj) {
// Browsing: With categories, replace generalization
// causes both replacement and base to become invisible to browsing
return org.eclipse.epf.library.edit.category.CustomCategoriesItemProvider
.accept(obj, getMethodConfiguration()) /*
* &&
* ((VariabilityElement)obj).getVariabilityBasedOnElement() ==
* null
*/;
}
};
// upcategorized filters can be reset based on configurator.
private IFilter uncategorizedTaskFilter = new IFilter() {
public boolean accept(Object obj) {
return obj instanceof Task
&& AssociationHelper.getDisciplines((Task) obj).isEmpty();
}
};
private IFilter domainUncategorizedWorkProductFilter = new IFilter() {
public boolean accept(Object obj) {
return obj instanceof WorkProduct
&& !AssociationHelper.getDomains((WorkProduct) obj).isEmpty();
}
};
private IFilter wpTypeUncategorizedWorkProductFilter = new IFilter() {
public boolean accept(Object obj) {
return obj instanceof WorkProduct
&& AssociationHelper.getWorkProductTypes((WorkProduct) obj)
.isEmpty();
}
};
private IFilter uncategorizedRoleFilter = new IFilter() {
public boolean accept(Object obj) {
return obj instanceof Role
&& AssociationHelper.getRoleSets((Role) obj).isEmpty();
}
};
private IFilter uncategorizedToolMentorFilter = new IFilter() {
public boolean accept(Object obj) {
return obj instanceof ToolMentor
&& AssociationHelper.getTools((ToolMentor) obj).isEmpty();
}
};
private IConfigurator configurator;
private IFilter filter;
/**
* Creates a new instance.
*/
public MethodConfigurationItemProvider(AdapterFactory adapterFactory) {
super(adapterFactory);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.emf.edit.provider.ItemProviderAdapter#dispose()
*/
public void dispose() {
if (groupItemProviderMap != null) {
for (Iterator iter = groupItemProviderMap.values().iterator(); iter
.hasNext();) {
Object adapter = iter.next();
if (adapter instanceof IDisposable) {
((IDisposable) adapter).dispose();
}
}
groupItemProviderMap.clear();
groupItemProviderMap = null;
}
if (children != null) {
children.clear();
children = null;
}
super.dispose();
}
public Collection getChildren(Object object) {
// if(object instanceof MethodConfiguration) {
// return Collections.singleton(new
// ObjectLinkItemProvider(adapterFactory, object, (Notifier) object));
// }
// MethodConfiguration conf = (MethodConfiguration)
// ((ObjectLinkItemProvider) object).getLinkedObject();
MethodConfiguration conf = (MethodConfiguration) object;
if (children == null) {
children = new ArrayList();
groupItemProviderMap = new HashMap();
String name;
Object uncategorizedImage;
CategoriesItemProvider child;
name = LibraryEditPlugin.INSTANCE
.getString("_UI_Disciplines_group"); //$NON-NLS-1$
child = new CategoriesItemProvider(
adapterFactory,
conf,
name,
LibraryEditPlugin.INSTANCE.getImage("full/obj16/Tasks_cfv"), //$NON-NLS-1$
ModelStructure.DEFAULT.disciplineDefinitionPath);
child.setParent(conf);
child.setUncategorizedFilter(uncategorizedTaskFilter);
child.setCategorizedFilter(disciplinesFilter);
child.setUncategorizedLabel(LibraryEditPlugin.INSTANCE
.getString("_UI_Uncategorized_Tasks_text")); //$NON-NLS-1$
uncategorizedImage = LibraryEditPlugin.INSTANCE
.getImage("full/obj16/Tasks"); //$NON-NLS-1$
child.setUncategorizedImage(uncategorizedImage);
children.add(child);
groupItemProviderMap.put(name, child);
name = LibraryEditPlugin.INSTANCE.getString("_UI_Domains_group"); //$NON-NLS-1$
child = new CategoriesItemProvider(adapterFactory, conf, name,
LibraryEditPlugin.INSTANCE.getImage("full/obj16/Domains"), //$NON-NLS-1$
ModelStructure.DEFAULT.domainPath);
child.setParent(conf);
child.setUncategorizedFilter(domainUncategorizedWorkProductFilter);
uncategorizedImage = LibraryEditPlugin.INSTANCE
.getImage("full/obj16/WorkProducts"); //$NON-NLS-1$
child.setUncategorizedImage(uncategorizedImage);
child.setCategorizedFilter(domainFilter);
children.add(child);
groupItemProviderMap.put(name, child);
name = LibraryEditPlugin.INSTANCE
.getString("_UI_WorkProductTypes_group"); //$NON-NLS-1$
child = new WorkProductTypesItemProvider(adapterFactory, conf,
name, LibraryEditPlugin.INSTANCE
.getImage("full/obj16/WorkProducts"), //$NON-NLS-1$
ModelStructure.DEFAULT.workProductTypePath);
child.setParent(conf);
child.setUncategorizedFilter(wpTypeUncategorizedWorkProductFilter);
uncategorizedImage = LibraryEditPlugin.INSTANCE
.getImage("full/obj16/WorkProducts"); //$NON-NLS-1$
child.setUncategorizedImage(uncategorizedImage);
child.setCategorizedFilter(workProductTypesFilter);
children.add(child);
groupItemProviderMap.put(name, child);
name = LibraryEditPlugin.INSTANCE.getString("_UI_Role_Sets_group"); //$NON-NLS-1$
child = new CategoriesItemProvider(adapterFactory, conf, name,
LibraryEditPlugin.INSTANCE.getImage("full/obj16/Roles"), //$NON-NLS-1$
ModelStructure.DEFAULT.roleSetPath);
child.setParent(conf);
child.setUncategorizedFilter(uncategorizedRoleFilter);
child.setCategorizedFilter(roleSetsFilter);
child.setUncategorizedLabel(LibraryEditPlugin.INSTANCE
.getString("_UI_Uncategorized_Roles_text")); //$NON-NLS-1$
uncategorizedImage = LibraryEditPlugin.INSTANCE
.getImage("full/obj16/Roles"); //$NON-NLS-1$
child.setUncategorizedImage(uncategorizedImage);
children.add(child);
groupItemProviderMap.put(name, child);
name = LibraryEditPlugin.INSTANCE.getString("_UI_Tools_group"); //$NON-NLS-1$
child = new CategoriesItemProvider(adapterFactory, conf, name,
LibraryEditPlugin.INSTANCE.getImage("full/obj16/Tools"), //$NON-NLS-1$
ModelStructure.DEFAULT.toolPath);
child.setParent(conf);
child.setCategorizedFilter(toolsFilter);
child.setUncategorizedFilter(uncategorizedToolMentorFilter);
uncategorizedImage = LibraryEditPlugin.INSTANCE
.getImage("full/obj16/Tools"); //$NON-NLS-1$
child.setUncategorizedImage(uncategorizedImage);
children.add(child);
groupItemProviderMap.put(name, child);
name = LibraryEditPlugin.INSTANCE.getString("_UI_Processes_group"); //$NON-NLS-1$
Object otherChild = new ProcessesItemProvider(adapterFactory, conf,
ModelStructure.DEFAULT);
children.add(otherChild);
groupItemProviderMap.put(name, otherChild);
name = LibraryEditPlugin.INSTANCE
.getString("_UI_Custom_Categories_group"); //$NON-NLS-1$
child = new CategoriesItemProvider(adapterFactory, conf, name,
LibraryEditPlugin.INSTANCE
.getImage("full/obj16/MethodPackages"), //$NON-NLS-1$
ModelStructure.DEFAULT.customCategoryPath);
child.setParent(conf);
customCategoriesFilter.setContext(conf);
child.setCategorizedFilter(customCategoriesFilter);
children.add(child);
groupItemProviderMap.put(name, child);
Collection<UserDefinedTypeMeta> udtTypes = LibraryEditUtil.getInstance().getUserDefinedTypes();
if (udtTypes != null && !udtTypes.isEmpty()) {
name = LibraryEditPlugin.INSTANCE.getString("_UI_UdtElements_group"); //$NON-NLS-1$
// GuidanceItemProvider child2 = new GuidanceItemProvider(
// adapterFactory, conf, name, LibraryEditPlugin.INSTANCE.getImage("full/obj16/Practices"));
Object image = overlayImage(object, UmaEditPlugin.INSTANCE.getImage(
"full/obj16/UdtNode")); //$NON-NLS-1$
GuidanceItemProvider child2 = new GuidanceItemProvider(
adapterFactory, conf, name, image);
IFilter udtFilter = new IFilter() {
public boolean accept(Object obj) {
if (! (obj instanceof Practice)) {
return false;
}
return PracticePropUtil.getPracticePropUtil().isUdtType((Practice) obj);
}
};
child2.setGuidanceFilter(udtFilter);
children.add(child2);
groupItemProviderMap.put(name, child2);
}
name = LibraryEditPlugin.INSTANCE.getString("_UI_Guidances_group"); //$NON-NLS-1$
GuidanceGroupingItemProvider child1 = new GuidanceGroupingItemProvider(
adapterFactory, conf);
child1.setFilter(filter);
children.add(child1);
groupItemProviderMap.put(name, child1);
}
return children;
}
// /* (non-Javadoc)
// * @see
// org.eclipse.emf.edit.provider.ItemProviderAdapter#getElements(java.lang.Object)
// */
// public Collection getElements(Object object) {
// return Collections.singleton(object);
// }
//
/*
* (non-Javadoc)
*
* @see org.eclipse.emf.edit.provider.ItemProviderAdapter#hasChildren(java.lang.Object)
*/
public boolean hasChildren(Object object) {
return super.hasChildren(object);
}
public String getText(Object object) {
return TngUtil.getLabel(object,
getString("_UI_MethodConfiguration_type")); //$NON-NLS-1$
}
/*
* (non-Javadoc)
*
* @see com.ibm.library.edit.IGroupContainer#getGroupItemProvider(java.lang.String)
*/
public Object getGroupItemProvider(String name) {
return groupItemProviderMap.get(name);
}
public Collection getNewChildDescriptors(Object object,
EditingDomain editingDomain, Object sibling) {
return Collections.EMPTY_LIST;
}
/*
* (non-Javadoc)
*
* @see com.ibm.library.edit.IConfigurable#setFilter(com.ibm.library.edit.IFilter)
*/
public void setFilter(IFilter filter) {
if ( (filter != configurator) && (filter instanceof IConfigurator) ) {
configurator = (IConfigurator) filter;
if ( configurator != null ) {
// create the uncategorized filters. If IConfigurator is set, get the filders from there.
// otherwize, use the default one.
// This is needed to allow extra uncategorized elements due to realization
// to show up in the un-categorized folder.
// For example, if a disciple is replaced by another, the tasks in the replaced disciplie
// should show up in the un-categorized tasks folder
// 156438 - Variability of disciplines is not working correctly
uncategorizedTaskFilter = configurator.getUncategorizedTaskFilter();
domainUncategorizedWorkProductFilter = configurator.getDomainUncategorizedWorkProductFilter();
wpTypeUncategorizedWorkProductFilter = configurator.getWpTypeUncategorizedWorkProductFilter();
uncategorizedRoleFilter = configurator.getUncategorizedRoleFilter();
uncategorizedToolMentorFilter = configurator.getUncategorizedToolMentorFilter();
// [Bug 162603] New: Replacing disciplines do appear inside their replaced elements discipline groupings as well as outside of the discipline grouping
// need to customize the filters for disciplines and rolesets
disciplinesFilter = configurator.getDisciplinesFilter();
roleSetsFilter = configurator.getRoleSetsFilter();
}
}
this.filter = filter;
}
/*
* (non-Javadoc)
*
* @see com.ibm.library.edit.IConfigurable#setLabel(java.lang.String)
*/
public void setLabel(String label) {
}
/*
* (non-Javadoc)
*
* @see com.ibm.library.edit.IConfigurable#setParent(java.lang.Object)
*/
public void setParent(Object parent) {
}
// public Object getParent(Object object) {
// return plugin;
// }
/*
* (non-Javadoc)
*
* @see org.eclipse.epf.uma.provider.MethodConfigurationItemProvider#notifyChanged(org.eclipse.emf.common.notify.Notification)
*/
public void notifyChanged(Notification notification) {
super.notifyChanged(notification);
if (configurator != null) {
switch (notification.getFeatureID(MethodConfiguration.class)) {
case UmaPackage.METHOD_CONFIGURATION__METHOD_PLUGIN_SELECTION:
case UmaPackage.METHOD_CONFIGURATION__METHOD_PACKAGE_SELECTION:
configurator.notifyChanged(notification);
break;
}
}
}
}