blob: 693ef6402533110f9df17ce53d32f2dad87f22dd [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.authoring.ui.properties;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
import org.eclipse.emf.edit.provider.ItemProviderAdapter;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
import org.eclipse.epf.authoring.ui.AuthoringUIPlugin;
import org.eclipse.epf.common.serviceability.MsgDialog;
import org.eclipse.epf.library.edit.TngAdapterFactory;
import org.eclipse.epf.library.edit.command.IActionManager;
import org.eclipse.epf.library.edit.process.RoleDescriptorWrapperItemProvider;
import org.eclipse.epf.library.edit.util.ProcessUtil;
import org.eclipse.epf.uma.Activity;
import org.eclipse.epf.uma.BreakdownElement;
import org.eclipse.epf.uma.CompositeRole;
import org.eclipse.epf.uma.Role;
import org.eclipse.epf.uma.RoleDescriptor;
import org.eclipse.epf.uma.TeamProfile;
import org.eclipse.epf.uma.UmaPackage;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.ListSelectionDialog;
import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
/**
* The Role descriptor - team profile section
*
* @author Shilpa Toraskar
* @since 1.0
*
*/
public class RoleDescriptorTeamSection extends OBSRelationSection {
private Image titleImage = null;
/**
* @see org.eclipse.epf.authoring.ui.properties.OBSRelationSection#createControls(org.eclipse.swt.widgets.Composite, org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage)
*/
public void createControls(Composite parent,
TabbedPropertySheetPage tabbedPropertySheetPage) {
super.createControls(parent, tabbedPropertySheetPage);
}
/**
* @see org.eclipse.epf.authoring.ui.properties.OBSRelationSection#initContentProvider()
*/
protected void initContentProvider() {
contentProvider = new AdapterFactoryContentProvider(
TngAdapterFactory.INSTANCE
.getNavigatorView_ComposedAdapterFactory()) {
public Object[] getElements(Object object) {
return getSelectedTeams(element).toArray();
}
};
viewer.setContentProvider(contentProvider);
}
/**
* @see org.eclipse.epf.authoring.ui.properties.OBSRelationSection#init()
*/
protected void init() {
super.init();
element = (RoleDescriptor) element;
setTabData(PropertiesResources.RoleDescriptor_Team_SectionTitle,
PropertiesResources.RoleDescriptor_Team_SectionDescription,
PropertiesResources.RoleDescriptor_Team_Table1);
}
/**
* @see org.eclipse.epf.authoring.ui.properties.OBSRelationSection#refresh()
*/
public void refresh() {
try {
if (getElement() instanceof RoleDescriptor) {
super.refresh();
element = (RoleDescriptor) getElement();
viewer.refresh();
}
} catch (Exception ex) {
logger.logError(
"Error refreshing Role Descriptor team section ", ex); //$NON-NLS-1$
}
}
private void add(Object[] items) {
// update the model
if (items != null) {
for (int i = 0; i < items.length; i++) {
TeamProfile team = (TeamProfile) items[i];
if (element instanceof CompositeRole) {
CompositeRole compRole = ProcessUtil
.createCompositeRole((CompositeRole) element);
actionMgr.doAction(IActionManager.ADD, team,
UmaPackage.eINSTANCE.getTeamProfile_TeamRoles(),
compRole, -1);
} else if (element instanceof RoleDescriptor) {
Role role = ((RoleDescriptor) element).getRole();
if (role != null) {
if (!isPartOfTeam(role, team)) {
RoleDescriptor roleDesc = ProcessUtil
.createRoleDescriptor(role);
actionMgr.doAction(IActionManager.ADD, team,
UmaPackage.eINSTANCE
.getTeamProfile_TeamRoles(),
roleDesc, -1);
}
} else {
MessageFormat mf = new MessageFormat(
PropertiesResources.Process_TeamAssignError); //$NON-NLS-1$
Object[] args = { element.getName(), team.getName() };
String message = mf.format(args);
String title = getEditor().getTitle();
MsgDialog dialog = AuthoringUIPlugin.getDefault()
.getMsgDialog();
dialog.displayError(title, message, ""); //$NON-NLS-1$
return;
}
}
actionMgr.doAction(IActionManager.ADD, team,
UmaPackage.eINSTANCE.getTeamProfile_TeamRoles(),
element, -1);
}
}
}
/**
* @see org.eclipse.epf.authoring.ui.properties.OBSRelationSection#remove(java.util.ArrayList)
*/
protected void remove(ArrayList rmItems) {
// update the model
if (!rmItems.isEmpty()) {
for (Iterator itor = rmItems.iterator(); itor.hasNext();) {
TeamProfile team = (TeamProfile) itor.next();
Role role = ((RoleDescriptor) element).getRole();
actionMgr.doAction(IActionManager.REMOVE, team,
UmaPackage.eINSTANCE.getTeamProfile_TeamRoles(),
element, -1);
// Get the list of roleDescriptors from team profile which
// has same role original role descriptor
List teamRoles = team.getTeamRoles();
List roleDescList = new ArrayList();
for (int i = 0; i < teamRoles.size(); i++) {
RoleDescriptor roleDesc = (RoleDescriptor) teamRoles.get(i);
if (roleDesc.getRole().equals(role))
{
roleDescList.add(roleDesc);
}
}
// if roleDescripor just has one element, delete that one too.
// since that would be the last one
if (roleDescList.size() == 1) {
actionMgr.doAction(IActionManager.REMOVE, team,
UmaPackage.eINSTANCE.getTeamProfile_TeamRoles(),
(RoleDescriptor) roleDescList.get(0), -1);
}
}
}
}
private boolean isPartOfTeam(Role role, TeamProfile team) {
List teamRoles = team.getTeamRoles();
List roles = new ArrayList();
for (Iterator itor = teamRoles.iterator(); itor.hasNext();) {
RoleDescriptor roleDesc = (RoleDescriptor) itor.next();
roles.add(roleDesc.getRole());
}
if (roles.contains(role))
return true;
return false;
}
/**
* @see org.eclipse.epf.authoring.ui.properties.OBSRelationSection#openAddDialog()
*/
protected void openAddDialog() {
IStructuredContentProvider teamContentProvider = new AdapterFactoryContentProvider(
TngAdapterFactory.INSTANCE
.getNavigatorView_ComposedAdapterFactory()) {
public Object[] getElements(Object object) {
List items = getTeams();
items.removeAll(getSelectedTeams(element));
return items.toArray();
}
};
ILabelProvider teamLabelProvider = new AdapterFactoryLabelProvider(
TngAdapterFactory.INSTANCE.getOBS_ComposedAdapterFactory());
ListSelectionDialog dlg = new ListSelectionDialog(PlatformUI
.getWorkbench().getActiveWorkbenchWindow().getShell(), element,
teamContentProvider, teamLabelProvider, PropertiesResources.Process_TeamDialogMessage); //$NON-NLS-1$
titleImage = Display.getCurrent().getActiveShell().getImage();
ListSelectionDialog.setDefaultImage(titleImage);
dlg.setTitle(PropertiesResources.Process_TeamDialogTitle);
dlg.setBlockOnOpen(true);
dlg.open();
add(dlg.getResult());
}
public void dispose() {
super.dispose();
if (contentProvider != null) {
contentProvider.dispose();
}
}
/**
* Get parent
*
* @param element
* @return
* Parent of the element
*/
protected Object getParent(BreakdownElement element) {
AdapterFactory aFactory = TngAdapterFactory.INSTANCE
.getOBS_ComposedAdapterFactory();
ItemProviderAdapter adapter = (ItemProviderAdapter) aFactory.adapt(
element, ITreeItemContentProvider.class);
Object parent = adapter.getParent(element);
return parent;
}
/**
* Get Teams from parent
*
* @return
* List of teams
*/
private List getTeams() {
ArrayList items = new ArrayList();
Object parent = getParent(element);
while (parent != null) {
if (parent instanceof Activity) {
Activity act = (Activity) parent;
List breakdownElements = act.getBreakdownElements();
for (Iterator it = breakdownElements.iterator(); it.hasNext();) {
BreakdownElement element = (BreakdownElement) it.next();
if (element instanceof TeamProfile) {
TeamProfile team = (TeamProfile) element;
items.add(team);
// add any sub teams if there
List subTeams = team.getSubTeam();
items.addAll(subTeams);
}
}
}
parent = getParent((BreakdownElement) parent);
}
return items;
}
/**
* Get selected teams for that role descriptor
*
* @param object
* @return
* List of selected team
*/
private List getSelectedTeams(EObject object) {
Object input = getInput();
if (input instanceof RoleDescriptorWrapperItemProvider) {
return ProcessUtil
.getTeamProfiles((RoleDescriptorWrapperItemProvider) input);
} else {
RoleDescriptor roleDesc = (RoleDescriptor) object;
return ProcessUtil.getTeamProfiles(roleDesc, getAdapterFactory());
}
}
}