blob: bf39e0c11d4f3e2f534e08176fcb257099cd18be [file] [log] [blame]
package org.eclipse.epf.authoring.ui.providers;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.edit.provider.IViewerNotification;
import org.eclipse.emf.edit.provider.ItemProviderAdapter;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
import org.eclipse.epf.authoring.ui.views.ConfigurationViewer;
import org.eclipse.epf.library.edit.navigator.ContentItemProvider;
import org.eclipse.epf.library.edit.navigator.MethodPackagesItemProvider;
import org.eclipse.epf.library.edit.navigator.PluginUIPackagesItemProvider;
import org.eclipse.epf.library.edit.navigator.ProcessesItemProvider;
import org.eclipse.epf.library.services.SafeUpdateController;
import org.eclipse.epf.library.util.LibraryUtil;
import org.eclipse.epf.uma.CustomCategory;
import org.eclipse.epf.uma.MethodElement;
import org.eclipse.epf.uma.MethodPackage;
import org.eclipse.epf.uma.MethodPlugin;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.ui.dialogs.ContainerCheckedTreeViewer;
public class ConfigPackageContentProvider extends AdapterFactoryContentProvider {
// there is a problem in the passed in AdapterFactory
// it can't find the correct parent from the child
// need to build a map of child to it's parent if the child is a UI
// folder
// clear the map when the input is set
Map<Object, Object> childUIParentMap = new HashMap<Object, Object>();
List<Object> uiFolders = new ArrayList<Object>();
public List<Object> getUIElements() {
return uiFolders;
}
/**
* Create an instance
* @param adapterFactory
*/
public ConfigPackageContentProvider(//ConfigurationFactory configFactory,
AdapterFactory adapterFactory/* , boolean showMethodModelOnly */) {
super(adapterFactory);
}
/**
* @see org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider#getChildren(java.lang.Object)
*/
public Object[] getChildren(Object parentElement) {
Object[] items = getValidItems(parentElement, super
.getChildren(parentElement));
return items;
}
/**
* @see org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider#getElements(java.lang.Object)
*/
public Object[] getElements(Object inputElement) {
Object[] items = getValidItems(inputElement, super
.getElements(inputElement));
return items;
}
private boolean isUIFolder(Object e) {
return (e instanceof ContentItemProvider
|| e instanceof ProcessesItemProvider || e instanceof MethodPackagesItemProvider ||
e instanceof PluginUIPackagesItemProvider
);
}
public Object getUITargetElement(Object e) {
if (e instanceof CustomCategory) {
return ((CustomCategory) e).eContainer();
} else if (e instanceof MethodElement) {
return e;
} else if (e instanceof ContentItemProvider) {
return ((ContentItemProvider) e).getParent(null);
} else if (e instanceof ProcessesItemProvider) {
return ((ProcessesItemProvider) e).getParent(null);
} else if (e instanceof ItemProviderAdapter) {
Object target = ((ItemProviderAdapter) e).getTarget();
if (target != null && target instanceof MethodElement) {
return target;
}
}
return null;
}
private Object[] getValidItems(Object parent, Object[] elements) {
if (elements == null || elements.length == 0) {
return elements;
}
List<Object> pkgs = new ArrayList<Object>();
for (int i = 0; i < elements.length; i++) {
Object e = LibraryUtil.unwrap(elements[i]);
boolean uiFolder = isUIFolder(e);
if (uiFolder || e instanceof MethodPackage
|| e instanceof MethodPlugin) {
pkgs.add(e);
if (uiFolder) {
uiFolders.add(e);
}
// if the parent is a UI folder, map the child to the parent
// so that we can get the parent later
// if ( !(parent instanceof MethodElement) )
{
childUIParentMap.put(e, parent);
}
} else {
}
}
return pkgs.toArray();
}
/**
* @see org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider#getParent(java.lang.Object)
*/
public Object getParent(Object element) {
if (childUIParentMap.containsKey(element)) {
return childUIParentMap.get(element);
} else {
return super.getParent(element);
}
}
/**
* @see org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider#hasChildren(java.lang.Object)
*/
public boolean hasChildren(Object element) {
Object[] children = getChildren(element);
return (children != null && children.length > 0);
}
/**
* @see org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
*/
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
super.inputChanged(viewer, oldInput, newInput);
childUIParentMap.clear();
}
/**
* @see org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider#notifyChanged(org.eclipse.emf.common.notify.Notification)
*/
public void notifyChanged(Notification notification) {
super.notifyChanged(notification);
if ((notification instanceof IViewerNotification)) {
final IViewerNotification vnt = (IViewerNotification) notification;
final Object element = vnt.getElement();
final ContainerCheckedTreeViewer ctrl = ((ContainerCheckedTreeViewer) super.viewer);
if (element != null && (vnt.getEventType() == Notification.ADD
/*|| vnt.getEventType() == Notification.SET*/)) {
SafeUpdateController.syncExec(new Runnable() {
public void run() {
ctrl.setChecked(element, true);
}
});
}
}
}
/**
* @see org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider#dispose()
*/
public void dispose() {
super.dispose();
uiFolders.clear();
childUIParentMap.clear();
}
}