//------------------------------------------------------------------------------ // 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; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Iterator; import java.util.List; import org.eclipse.emf.common.command.Command; import org.eclipse.emf.common.command.UnexecutableCommand; import org.eclipse.emf.common.notify.AdapterFactory; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.common.notify.Notifier; import org.eclipse.emf.common.util.ResourceLocator; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.edit.command.CommandParameter; import org.eclipse.emf.edit.command.RemoveCommand; import org.eclipse.emf.edit.domain.EditingDomain; import org.eclipse.emf.edit.provider.IEditingDomainItemProvider; import org.eclipse.emf.edit.provider.IItemLabelProvider; import org.eclipse.emf.edit.provider.IItemPropertySource; import org.eclipse.emf.edit.provider.IStructuredItemContentProvider; import org.eclipse.emf.edit.provider.ITreeItemContentProvider; import org.eclipse.emf.edit.provider.ItemProviderAdapter; import org.eclipse.epf.library.edit.command.MethodElementAddCommand; import org.eclipse.epf.library.edit.element.IElementItemProvider; import org.eclipse.epf.library.edit.util.TngUtil; import org.eclipse.epf.uma.provider.UmaEditPlugin; /** * Item provider for UI transient objects that can be used to group/organize * model objects in a view. * * @author Phong Nguyen Le * @since 1.0 */ public class TransientGroupItemProvider extends ItemProviderAdapter implements IEditingDomainItemProvider, IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource, IElementItemProvider, IConfigurable, IDefaultNameSetter, ILibraryItemProvider { protected String name; protected IFilter childFilter; protected Object parent; /** * @param adapterFactory */ public TransientGroupItemProvider(AdapterFactory adapterFactory, Notifier parent) { super(adapterFactory); parent.eAdapters().add(this); } /** * @param adapterFactory */ public TransientGroupItemProvider(AdapterFactory adapterFactory, Notifier parent, String name) { super(adapterFactory); parent.eAdapters().add(this); this.name = name; } protected boolean acceptAsChild(Object obj) { if (childFilter != null) { return childFilter.accept(obj); } return true; } /* * (non-Javadoc) * * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getParent(java.lang.Object) */ public Object getParent(Object object) { if (parent != null) return parent; return target; } /* * (non-Javadoc) * * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getNewChildDescriptors(java.lang.Object, * org.eclipse.emf.edit.domain.EditingDomain, java.lang.Object) */ public Collection getNewChildDescriptors(Object object, EditingDomain editingDomain, Object sibling) { return super.getNewChildDescriptors(target, editingDomain, sibling); } /* * (non-Javadoc) * * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getResourceLocator() */ protected ResourceLocator getResourceLocator() { return UmaEditPlugin.INSTANCE; } /* * (non-Javadoc) * * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#createCreateChildCommand(org.eclipse.emf.edit.domain.EditingDomain, * org.eclipse.emf.ecore.EObject, * org.eclipse.emf.ecore.EStructuralFeature, java.lang.Object, int, * java.util.Collection) */ protected Command createCreateChildCommand(EditingDomain domain, EObject owner, EStructuralFeature feature, Object value, int index, Collection collection) { Command cmd = super.createCreateChildCommand(domain, (EObject) target, feature, value, index, collection); // System.out.println(getClass().getName() + "#createCreateChildCommand: // can execute: " + cmd.canExecute()); return cmd; } /* * (non-Javadoc) * * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#createAddCommand(org.eclipse.emf.edit.domain.EditingDomain, * org.eclipse.emf.ecore.EObject, * org.eclipse.emf.ecore.EStructuralFeature, java.util.Collection, int) */ protected Command createAddCommand(EditingDomain domain, EObject owner, EStructuralFeature feature, Collection collection, int index) { Collection selection = new ArrayList(); for (Iterator iter = collection.iterator(); iter.hasNext();) { Object element = iter.next(); if (acceptAsChild(element)) { selection.add(element); } } if (selection.isEmpty()) { return UnexecutableCommand.INSTANCE; } return new MethodElementAddCommand(super.createAddCommand(domain, (EObject) target, feature, selection, index)); } /* * (non-Javadoc) * * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#createRemoveCommand(org.eclipse.emf.edit.domain.EditingDomain, * org.eclipse.emf.ecore.EObject, * org.eclipse.emf.ecore.EStructuralFeature, java.util.Collection) */ protected Command createRemoveCommand(EditingDomain domain, EObject owner, EStructuralFeature feature, Collection collection) { Command cmd = super.createRemoveCommand(domain, (EObject) target, feature, collection); // System.out.println(getClass().getName() + "#createRemoveCommand: can // execute: " + cmd.canExecute()); return cmd; } /* * (non-Javadoc) * * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#createMoveCommand(org.eclipse.emf.edit.domain.EditingDomain, * org.eclipse.emf.ecore.EObject, * org.eclipse.emf.ecore.EStructuralFeature, java.lang.Object, int) */ protected Command createMoveCommand(EditingDomain domain, EObject owner, EStructuralFeature feature, Object value, int index) { Command cmd = super.createMoveCommand(domain, (EObject) target, feature, value, index); // System.out.println(getClass().getName() + "#createMoveCommand: can // execute: " + cmd.canExecute()); return cmd; } /* * (non-Javadoc) * * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#createCommand(java.lang.Object, * org.eclipse.emf.edit.domain.EditingDomain, java.lang.Class, * org.eclipse.emf.edit.command.CommandParameter) */ public Command createCommand(Object object, EditingDomain domain, Class commandClass, CommandParameter commandParameter) { if (commandClass == RemoveCommand.class) { commandParameter.setOwner(target); } Command cmd = super.createCommand(object, domain, commandClass, commandParameter); // System.out.println(getClass().getName() + "#createCommand: " + // commandClass + ", can execute: " + cmd.canExecute() + ", owner: " + // commandParameter.getOwner() + ", collection: " + // commandParameter.getCollection()); return cmd; } /* * (non-Javadoc) * * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildren(java.lang.Object) */ public Collection getChildren(Object object) { ChildrenStore store = getChildrenStore(target); if (store != null) { return store.getChildren(); } store = createChildrenStore(target); List result = store != null ? null : new ArrayList(); EObject eObject = (EObject) target; if (target == null) return result; for (Iterator i = getChildrenFeatures(target).iterator(); i.hasNext();) { EStructuralFeature feature = (EStructuralFeature) i.next(); if (feature.isMany()) { List children = (List) eObject.eGet(feature); children = new ArrayList(children); int index = 0; for (Iterator ci = children.iterator(); ci.hasNext(); index++) { Object child = ci.next(); if (acceptAsChild(child)) { child = wrap(eObject, feature, child, index); if (store != null) { store.getList(feature).add(child); } else { result.add(child); } } } } else { Object child = eObject.eGet(feature); if (acceptAsChild(child)) { child = wrap(eObject, feature, child, CommandParameter.NO_INDEX); if (store != null) { store.setValue(feature, child); } else { result.add(child); } } } } List children = store != null ? store.getChildren() : result; Collections.sort(children, PresentationContext.INSTANCE.getComparator()); return children; } /* * (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) { boolean canExec = true; for (Iterator iter = collection.iterator(); iter.hasNext();) { if (!acceptAsChild(iter.next())) { canExec = false; break; } } Command cmd; if (canExec) { cmd = super.createDragAndDropCommand(domain, owner, location, operations, operation, collection); } else { cmd = UnexecutableCommand.INSTANCE; } // System.out.println(getClass().getName() + "#createMoveCommand: can // execute: " + cmd.canExecute()); return cmd; } /* * (non-Javadoc) * * @see org.eclipse.emf.common.notify.Adapter#notifyChanged(org.eclipse.emf.common.notify.Notification) */ public void notifyChanged(Notification msg) { TngUtil.setDefaultName(this, msg); // if(msg.getNotifier() == target) { // if(featureId == UmaPackage.CONTENT_PACKAGE__CONTENT_ELEMENTS) { // boolean notify = false; // switch(msg.getEventType()) { // case Notification.ADD: // case Notification.MOVE: // Object obj = msg.getNewValue(); // notify = acceptAsChild(obj); // break; // case Notification.REMOVE: // obj = msg.getOldValue(); // notify = acceptAsChild(obj); // break; // case Notification.ADD_MANY: // Collection collection = (Collection) msg.getNewValue(); // for_check: // for(Iterator iter = collection.iterator(); iter.hasNext();) { // if(acceptAsChild(iter.next())) { // notify = true; // break for_check; // } // } // break; // case Notification.REMOVE_MANY: // collection = (Collection) msg.getOldValue(); // for_check: // for(Iterator iter = collection.iterator(); iter.hasNext();) { // if(acceptAsChild(iter.next())) { // notify = true; // break for_check; // } // } // break; // // } // if(notify) { // fireNotifyChanged(new ViewerNotification(msg, this, true, false)); // } // } // } super.notifyChanged(msg); } public String getText(Object object) { return name; } /* * (non-Javadoc) * * @see com.ibm.library.edit.IConfigurable#setConfiguration(org.eclipse.epf.uma.MethodConfiguration) */ public void setFilter(IFilter filter) { this.childFilter = 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) { this.parent = parent; } public Object getImage(Object object) { return LibraryEditPlugin.INSTANCE.getImage("full/obj16/Folder"); //$NON-NLS-1$ } /* * (non-Javadoc) * * @see com.ibm.library.edit.IDefaultNameSetter#setDefaultName(java.lang.Object) */ public void setDefaultName(Object obj) { } /* * (non-Javadoc) * * @see com.ibm.library.edit.IDefaultNameSetter#getInterestedFeatureID() */ public int getInterestedFeatureID() { return -1; } /* * (non-Javadoc) * * @see com.ibm.library.edit.IDefaultNameSetter#getInterestedFeatureClass() */ public Class getInterestedFeatureOwnerClass() { return null; } /* * (non-Javadoc) * * @see org.eclipse.emf.edit.provider.ItemProviderAdapter#getChildrenFeatures(java.lang.Object) */ public Collection getChildrenFeatures(Object object) { return super.getChildrenFeatures(object); } }