blob: f2b64e7f157efe3932f477c21d30072d911bbbe0 [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.process;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
import org.eclipse.emf.edit.provider.ItemProviderAdapter;
import org.eclipse.emf.edit.provider.ViewerNotification;
import org.eclipse.epf.library.edit.IFilter;
import org.eclipse.epf.library.edit.command.IActionManager;
import org.eclipse.epf.library.edit.command.IResourceAwareCommand;
import org.eclipse.epf.library.edit.process.command.GenericDropCommand;
import org.eclipse.epf.library.edit.process.command.OBSDragAndDropCommand;
import org.eclipse.epf.library.edit.util.ProcessUtil;
import org.eclipse.epf.library.edit.util.TngUtil;
import org.eclipse.epf.uma.Activity;
import org.eclipse.epf.uma.BreakdownElement;
import org.eclipse.epf.uma.Role;
import org.eclipse.epf.uma.RoleDescriptor;
import org.eclipse.epf.uma.TeamProfile;
import org.eclipse.epf.uma.UmaFactory;
import org.eclipse.epf.uma.UmaPackage;
/**
* @author Phong Nguyen Le
* @since 1.0
*/
public class TeamProfileItemProvider extends BreakdownElementItemProvider {
// private Collection eClasses;
// private Collection teamRoleWrappers;
private GenericDropCommand.ElementAdapter dropAdapter;
/**
* @param adapterFactory
*/
public TeamProfileItemProvider(AdapterFactory adapterFactory,
ItemProviderAdapter delegateItemProvider) {
super(adapterFactory, delegateItemProvider);
}
/*
* (non-Javadoc)
*
* @see com.ibm.library.edit.process.BreakdownElementItemProvider#collectNewChildDescriptors(java.util.Collection,
* java.lang.Object)
*/
protected void collectNewChildDescriptors(Collection newChildDescriptors,
Object object) {
newChildDescriptors.add(createChildParameter(UmaPackage.eINSTANCE
.getTeamProfile_SubTeam(), UmaFactory.eINSTANCE
.createTeamProfile()));
}
/*
* (non-Javadoc)
*
* @see com.ibm.library.edit.process.BreakdownElementItemProvider#getChildrenFeatures(java.lang.Object)
*/
public Collection getChildrenFeatures(Object object) {
if (childrenFeatures == null) {
childrenFeatures = new ArrayList();
childrenFeatures.add(UmaPackage.eINSTANCE.getTeamProfile_SubTeam());
}
return childrenFeatures;
}
/*
* (non-Javadoc)
*
* @see com.ibm.library.edit.process.BSActivityItemProvider#createDropCommand(java.lang.Object,
* java.util.List)
*/
public IResourceAwareCommand createDropCommand(Object owner,
List dropElements) {
return new GenericDropCommand((TeamProfile) owner, UmaPackage.eINSTANCE
.getTeamProfile_TeamRoles(), dropElements,
getDropAdapter(owner));
}
private GenericDropCommand.ElementAdapter getDropAdapter(Object owner) {
BreakdownElementItemProvider adapter = (BreakdownElementItemProvider) adapterFactory
.adapt(owner, IEditingDomainItemProvider.class);
return adapter.createDropAdapter();
}
/*
* (non-Javadoc)
*
* @see com.ibm.library.edit.process.WBSActivityItemProvider#getChildren(java.lang.Object)
*/
public Collection getChildren(Object object) {
Collection children = super.getChildren(object);
// add team roles
//
IFilter filter = ProcessUtil.getFilter(adapterFactory);
boolean nullFilter = filter == null;
TeamProfile teamProfile = (TeamProfile) object;
for (Iterator iter = teamProfile.getTeamRoles().iterator(); iter
.hasNext();) {
RoleDescriptor desc = (RoleDescriptor) iter.next();
if (desc.getSuperActivities() == null && (nullFilter || filter.accept(desc))) {
children.add(desc);
}
}
// set parent for the children's item providers
//
for (Iterator iter = children.iterator(); iter.hasNext();) {
ProcessUtil.setParent(iter.next(), object, getRootAdapterFactory());
}
return children;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.emf.edit.provider.ItemProviderAdapter#dispose()
*/
// public void dispose() {
// for (Iterator iter = teamRoleWrappers.iterator(); iter.hasNext();) {
// IWrapperItemProvider wrapper = (IWrapperItemProvider) iter.next();
// wrapper.dispose();
// }
// teamRoleWrappers.clear();
//
// super.dispose();
// }
/*
* (non-Javadoc)
*
* @see com.ibm.library.edit.process.BreakdownElementItemProvider#notifyChanged(org.eclipse.emf.common.notify.Notification)
*/
public void notifyChanged(Notification notification) {
updateChildren(notification);
switch (notification.getFeatureID(TeamProfile.class)) {
case UmaPackage.TEAM_PROFILE__SUB_TEAM:
int eventType = notification.getEventType();
if (eventType == Notification.ADD
|| eventType == Notification.ADD_MANY) {
List subTeams = ProcessUtil.getAffectedElements(notification,
null);
for (Iterator iter = subTeams.iterator(); iter.hasNext();) {
TeamProfile subTeam = (TeamProfile) iter.next();
ProcessUtil.addToContainer(subTeam, this);
}
}
fireNotifyChanged(new ViewerNotification(notification, notification
.getNotifier(), true, false));
return;
case UmaPackage.TEAM_PROFILE__TEAM_ROLES:
List elements = ProcessUtil.getAffectedElements(notification, null);
eventType = notification.getEventType();
boolean refreshTeam = false;
for (Iterator iter = elements.iterator(); iter.hasNext();) {
BreakdownElement e = (BreakdownElement) iter.next();
if (eventType == Notification.ADD
|| eventType == Notification.ADD_MANY) {
ProcessUtil.addToContainer(e, this, false);
}
if (e.getSuperActivities() == null) {
refreshTeam = true;
}
else {
fireNotifyChanged(new ViewerNotification(notification, e,
false, true));
}
}
if (refreshTeam) {
fireNotifyChanged(new ViewerNotification(notification,
notification.getNotifier(), true, false));
}
return;
case UmaPackage.TEAM_PROFILE__PRESENTATION_NAME:
TeamProfile teamProfile = (TeamProfile) notification.getNotifier();
fireNotifyChanged(new ViewerNotification(notification, teamProfile,
false, true));
for (Iterator iter = teamProfile.getTeamRoles().iterator(); iter
.hasNext();) {
RoleDescriptor roleDescriptor = (RoleDescriptor) iter.next();
fireNotifyChanged(new ViewerNotification(notification,
roleDescriptor, false, true));
}
return;
case UmaPackage.ACTIVITY__SUPPRESSED:
fireNotifyChanged(new ViewerNotification(notification, notification
.getNotifier(), true, true));
return;
}
super.notifyChanged(notification);
}
public Collection getEClasses() {
return ProcessUtil.getOBSEclasses();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.emf.edit.provider.ItemProviderAdapter#createDragAndDropCommand(org.eclipse.emf.edit.domain.EditingDomain,
* java.lang.Object, float, int, int, java.util.Collection)
*/
protected Command createDragAndDropCommand(EditingDomain domain,
Object owner, float location, int operations, int operation,
Collection collection) {
return new OBSDragAndDropCommand(domain, owner, location, operations,
operation, collection)
// {
// public Collection getAffectedObjects() {
// Collection wrappers = new ArrayList();
// for (Iterator iter = super.getAffectedObjects().iterator();
// iter.hasNext();) {
// RoleDescriptor desc = (RoleDescriptor) iter.next();
// wrappers.add(TngUtil.getWrapper(teamRoleWrappers, desc.getRole()));
// }
// return wrappers;
// }
// }
;
}
private boolean descriptorExists(Object role) {
TeamProfile teamProfile = (TeamProfile) getTarget();
for (Iterator iter = teamProfile.getTeamRoles().iterator(); iter
.hasNext();) {
RoleDescriptor desc = (RoleDescriptor) iter.next();
if (desc.getRole() == role)
return true;
}
return false;
}
public GenericDropCommand.ElementAdapter createDropAdapter() {
if (dropAdapter == null) {
dropAdapter = new GenericDropCommand.ElementAdapter() {
public Object adapt(Object dropElement) {
if (dropElement instanceof Role
&& !descriptorExists(dropElement)
// && TngUtil.getWrapper(teamRoleWrappers, dropElement) ==
// null
) {
return ProcessUtil
.createRoleDescriptor((Role) dropElement);
}
return null;
}
};
}
return dropAdapter;
}
/*
* (non-Javadoc)
*
* @see com.ibm.library.edit.process.BreakdownElementItemProvider#getAttribute(java.lang.Object,
* java.lang.String)
*/
public String getAttribute(Object object, String property) {
if (property == IBSItemProvider.COL_TEAMS) {
return TngUtil.getPresentationName(((TeamProfile) object)
.getSuperTeam());
}
return super.getAttribute(object, property);
}
public void moveUp(Object obj, IActionManager actionMgr) {
Object parent = this.getParent(obj);
if ((parent != null) && (parent instanceof Activity)) {
TngUtil.moveUp((Activity) parent, obj, getEClasses(), actionMgr);
}
if ((parent != null) && (parent instanceof TeamProfile)) {
TeamProfile team = ((TeamProfile) parent);
List list = team.getSubTeam();
int location = 0;
for (int i = 0; i < list.size(); i++) {
if (obj.equals(list.get(i))) {
location = i;
break;
}
}
((EList) team.getSubTeam()).move(location, location - 1);
Activity activity = this.getActivity(obj);
TngUtil.moveUp(activity, obj, getEClasses(), actionMgr);
}
}
public void moveDown(Object obj, IActionManager actionMgr) {
Object parent = this.getParent(obj);
if ((parent != null) && (parent instanceof Activity)) {
TngUtil.moveDown((Activity) parent, obj, getEClasses(), actionMgr);
}
if ((parent != null) && (parent instanceof TeamProfile)) {
TeamProfile team = (TeamProfile) parent;
List list = team.getSubTeam();
int location = 0;
for (int i = 0; i < list.size(); i++) {
if (obj.equals(list.get(i))) {
location = i;
break;
}
}
((EList) team.getSubTeam()).move(location, location + 1);
Activity activity = this.getActivity(obj);
TngUtil.moveDown(activity, obj, getEClasses(), actionMgr);
}
}
public Activity getActivity(Object object) {
for (Object parent = getParent(object); parent != null;) {
if (parent instanceof Activity)
return (Activity) parent;
AdapterFactory aFactory = TngUtil
.getBestAdapterFactory(adapterFactory);
ItemProviderAdapter adapter = (ItemProviderAdapter) aFactory.adapt(
parent, ITreeItemContentProvider.class);
parent = adapter.getParent(parent);
}
return null;
}
}