//------------------------------------------------------------------------------ // 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.Collection; import java.util.Collections; import java.util.List; import java.util.Map; 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.edit.domain.EditingDomain; import org.eclipse.emf.edit.provider.ITableItemLabelProvider; 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.ICachedChildrenItemProvider; import org.eclipse.epf.library.edit.command.IActionManager; import org.eclipse.epf.library.edit.command.IResourceAwareCommand; import org.eclipse.epf.library.edit.command.ResourceAwareDragAndDropCommand; import org.eclipse.epf.library.edit.process.command.GenericDropCommand; import org.eclipse.epf.library.edit.util.PredecessorList; 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.Process; import org.eclipse.epf.uma.WorkBreakdownElement; /** * Base item provider for all breakdown elements * * @author Phong Nguyen Le * @since 1.0 */ public class BreakdownElementItemProvider extends org.eclipse.epf.uma.provider.BreakdownElementItemProvider implements IProcessItemProvider, IBSItemProvider, ITableItemLabelProvider, ICachedChildrenItemProvider { private Object parent; private int id; private Object topItem; private boolean rolledUp; private Boolean expanded; private PredecessorList predecessors; protected ItemProviderAdapter delegateItemProvider; protected List cachedChildren; /** * @param adapterFactory */ public BreakdownElementItemProvider(AdapterFactory adapterFactory, ItemProviderAdapter delegateItemProvider) { super(adapterFactory); this.delegateItemProvider = delegateItemProvider; } /* * (non-Javadoc) * * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#dispose() */ public void dispose() { if (predecessors != null) { predecessors.dispose(); } if(cachedChildren != null) { cachedChildren.clear(); cachedChildren = null; } super.dispose(); } public List getPropertyDescriptors(Object object) { if (delegateItemProvider != null) { return delegateItemProvider.getPropertyDescriptors(object); } return super.getPropertyDescriptors(object); } /* * (non-Javadoc) * * @see org.eclipse.epf.uma.provider.BreakdownElementItemProvider#collectNewChildDescriptors(java.util.Collection, * java.lang.Object) */ protected void collectNewChildDescriptors(Collection newChildDescriptors, Object object) { } /* * (non-Javadoc) * * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildrenFeatures(java.lang.Object) */ public Collection getChildrenFeatures(Object object) { return Collections.EMPTY_LIST; } /* * (non-Javadoc) * * @see com.ibm.library.edit.process.IBSItemProvider#isExpanded() */ public Boolean isExpanded() { return expanded; } /* * (non-Javadoc) * * @see com.ibm.library.edit.process.IBSItemProvider#setExpanded(boolean) */ public void setExpanded(Boolean b) { expanded = b; } /* * (non-Javadoc) * * @see org.eclipse.epf.uma.tng.process.IBSItemProvider#setParent(java.lang.Object) */ public void setParent(Object obj) { parent = obj; } /* * (non-Javadoc) * * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getParent(java.lang.Object) */ public Object getParent(Object object) { if (parent != null) { return parent; } if(object instanceof BreakdownElement) { return ((BreakdownElement)object).getSuperActivities(); } return null; } /* * (non-Javadoc) * * @see org.eclipse.epf.uma.tng.process.IBSItemProvider#getId() */ public int getId() { return id; } /* * (non-Javadoc) * * @see org.eclipse.epf.uma.tng.process.IBSItemProvider#setId(int) */ public void setId(int id) { this.id = id; } /* * (non-Javadoc) * * @see org.eclipse.epf.uma.tng.process.IBSItemProvider#getTopItem() */ public Object getTopItem() { Object parent = getParent(target); if (topItem == null && parent != null) { IBSItemProvider adapter = (IBSItemProvider) getRootAdapterFactory() .adapt(parent, ITreeItemContentProvider.class); if (adapter != null) { Object top = adapter.getTopItem(); if (top == null && parent instanceof Process && ((Process) parent).getSuperActivities() == null) { top = parent; adapter.setTopItem(top); } return top; } } return topItem; } protected String getColumnName(int columnIndex) { AdapterFactory rootAdapterFactory = getRootAdapterFactory(); if (rootAdapterFactory instanceof IColumnAware) { Map columnIndexToNameMap = ((IColumnAware) rootAdapterFactory) .getColumnIndexToNameMap(); if (columnIndexToNameMap != null) { return (String) columnIndexToNameMap.get(new Integer( columnIndex)); } } return null; } /* * (non-Javadoc) * * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnImage(java.lang.Object, * int) */ public Object getColumnImage(Object object, int columnIndex) { String colName = getColumnName(columnIndex); return TngUtil.getColumnImage(object, colName); } /* * (non-Javadoc) * * @see org.eclipse.emf.edit.provider.ITableItemLabelProvider#getColumnText(java.lang.Object, * int) */ public String getColumnText(Object object, int columnIndex) { // String colName = (String) columnIndexToNameMap.get(new // Integer(columnIndex)); String colName = getColumnName(columnIndex); return getAttribute(object, colName); } /* * (non-Javadoc) * * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getText(java.lang.Object) */ public String getText(Object object) { return TngUtil.getLabel(object); } /* * (non-Javadoc) * * @see org.eclipse.epf.uma.tng.process.IBSItemProvider#setTopItem(java.lang.Object) */ public void setTopItem(Object top) { topItem = top; } /* * (non-Javadoc) * * @see com.ibm.library.edit.process.IBSItemProvider#isRolledUp() */ public boolean isRolledUp() { return rolledUp; } /* * (non-Javadoc) * * @see com.ibm.library.edit.process.IBSItemProvider#setRolledUp(boolean) */ public void setRolledUp(boolean b) { rolledUp = b; } // /* (non-Javadoc) // * @see // com.ibm.library.edit.process.IBSItemProvider#setColumnIndexToNameMap(java.util.Map) // */ // public void setColumnIndexToNameMap(Map map) { // if (map != null) // { // columnIndexToNameMap = map; // } // } /* * (non-Javadoc) * * @see com.ibm.library.edit.process.IBSItemProvider#getAttribute(java.lang.Object, * java.lang.String) */ public String getAttribute(Object object, String property) { return ProcessUtil.getAttribute(object, property, this); } /* * (non-Javadoc) * * @see com.ibm.library.edit.process.IBSItemProvider#setAttribute(java.lang.Object, * java.lang.String, java.lang.String) */ public void setAttribute(Object object, String prop, String txt) { WorkBreakdownElement e = (WorkBreakdownElement) object; if (prop == IBSItemProvider.COL_NAME) { e.setName(txt); } else if (prop == IBSItemProvider.COL_PREDECESSORS) { } else if (prop == IBSItemProvider.COL_IS_EVENT_DRIVEN) { e.setIsEventDriven(Boolean.valueOf(txt)); } else if (prop == IBSItemProvider.COL_IS_ONGOING) { e.setIsOngoing(Boolean.valueOf(txt)); } else if (prop == IBSItemProvider.COL_IS_REPEATABLE) { e.setIsRepeatable(Boolean.valueOf(txt)); } } /* * (non-Javadoc) * * @see com.ibm.library.edit.process.IBSItemProvider#getListeners() */ public List getListeners() { if (changeNotifier == null) return null; return Collections.unmodifiableList((List) changeNotifier); } /* * (non-Javadoc) * * @see com.ibm.library.edit.process.IBSItemProvider#getPredecessors() */ public PredecessorList getPredecessors() { if (predecessors == null) { predecessors = new PredecessorList(TngUtil .getBestAdapterFactory(adapterFactory), target); } return predecessors; } public boolean isFirstElement(Object obj) { return ProcessUtil.isFirstElement(getRootAdapterFactory(), this, obj); // Object parent = this.getParent(obj); // if ((parent != null) && (parent instanceof Activity)) // { // Activity activity = (Activity) this.getParent(obj); // List elements = getFilteredBreakdownElements(activity, obj); // // // if it's first element, return true // if (elements.get(0).equals(obj)) // { // return true; // } // else return false; // } // // return true; } public boolean isLastElement(Object obj) { return ProcessUtil.isLastElement(getRootAdapterFactory(), this, obj); // Object parent = this.getParent(obj); // if ((parent != null) && (parent instanceof Activity)) // { // Activity activity = (Activity) this.getParent(obj); // List elements = getFilteredBreakdownElements(activity, obj); // // // if it's last element, return true // if (elements.get(elements.size() - 1).equals(obj)) // { // return true; // } // else return false; // } // // return true; } 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); } } 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); } } public Collection getEClasses() { // implemented by subclasses return null; } /* * (non-Javadoc) * * @see org.eclipse.epf.uma.provider.DescriptorItemProvider#getImage(java.lang.Object) */ public Object getImage(Object object) { Object image = TngUtil.getCustomNodeIcon(object); if(image != null) { return image; } if (delegateItemProvider != null) { return delegateItemProvider.getImage(object); } return super.getImage(object); } /* * (non-Javadoc) * * @see org.eclipse.epf.uma.provider.DescriptorItemProvider#notifyChanged(org.eclipse.emf.common.notify.Notification) */ public void notifyChanged(Notification notification) { if (TngUtil.handlePredecessorListChange(this, notification)) return; super.notifyChanged(notification); } protected void refreshChildren(Notification notification, Collection newOrOldChildren) { if (!newOrOldChildren.isEmpty()) { // // recalculate the IDs of breakdown elements and refresh them // // // Activity topAct = (Activity) getTopItem(); // AdapterFactory adapterFactory = getRootAdapterFactory(); // ProcessUtil.updateIDs(adapterFactory, new // AdapterFactoryTreeIterator(adapterFactory, topAct), topAct); fireNotifyChanged(new ViewerNotification(notification, notification .getNotifier(), true, false)); return; } } public GenericDropCommand.ElementAdapter createDropAdapter() { return null; } /* * (non-Javadoc) * * @see com.ibm.library.edit.process.IBSItemProvider#createDropCommand(java.lang.Object, * java.util.List) */ public IResourceAwareCommand createDropCommand(Object owner, List dropElements) { return null; } /* (non-Javadoc) * @see org.eclipse.epf.library.edit.ICachedChildrenItemProvider#getChildrenFromCache() */ public Collection getChildrenFromCache() { if(cachedChildren == null) { getChildren(target); } return cachedChildren; } /* (non-Javadoc) * @see org.eclipse.epf.library.edit.ICachedChildrenItemProvider#getRollupChildrenFromCache() */ public Collection getRollupChildrenFromCache() { return Collections.EMPTY_LIST; } @Override protected Command createDragAndDropCommand(EditingDomain domain, Object owner, float location, int operations, int operation, Collection collection) { return new ResourceAwareDragAndDropCommand(domain, owner, location, operations, operation, collection); } }