blob: bf9629413dd904aa2e2e65aa62256d881edea2d2 [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.providers;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
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.ITreeItemContentProvider;
import org.eclipse.emf.edit.provider.IViewerNotification;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
import org.eclipse.epf.library.edit.FeatureValueWrapperItemProvider;
import org.eclipse.epf.library.edit.TransientGroupItemProvider;
import org.eclipse.epf.library.edit.category.CustomCategoryItemProvider;
import org.eclipse.epf.library.edit.category.DisciplineCategoriesItemProvider;
import org.eclipse.epf.library.edit.category.DomainsItemProvider;
import org.eclipse.epf.library.edit.category.RoleSetsItemProvider;
import org.eclipse.epf.library.edit.category.ToolsItemProvider;
import org.eclipse.epf.library.edit.category.WorkProductTypesItemProvider;
import org.eclipse.epf.library.edit.navigator.ConfigurationsItemProvider;
import org.eclipse.epf.library.edit.navigator.PluginUIPackagesItemProvider;
import org.eclipse.epf.library.edit.util.TngUtil;
import org.eclipse.epf.library.services.SafeUpdateController;
import org.eclipse.epf.uma.ContentCategory;
import org.eclipse.epf.uma.CustomCategory;
import org.eclipse.epf.uma.MethodConfiguration;
import org.eclipse.epf.uma.MethodLibrary;
import org.eclipse.epf.uma.MethodPlugin;
import org.eclipse.jface.viewers.CheckboxTreeViewer;
import org.eclipse.jface.viewers.Viewer;
/**
* Content provider for Custom Category view of configuration page
*
* @author Jeff Hardy
*/
public class CategoryContentProvider 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
private Map<Object, Object> childUIParentMap = new HashMap<Object, Object>();
private MethodConfiguration config;
/**
* Create an instance
* @param adapterFactory
*/
public CategoryContentProvider(AdapterFactory adapterFactory, MethodConfiguration config) {
super(adapterFactory);
this.config = config;
}
/**
* @see org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider#getChildren(java.lang.Object)
*/
public Object[] getChildren(Object parentElement) {
Collection<Object> children = new ArrayList<Object>();
if (parentElement instanceof MethodPlugin) {
// add standard categories UI folders as appropriate
DisciplineCategoriesItemProvider disciplines = (DisciplineCategoriesItemProvider)TngUtil.getDisciplineCategoriesItemProvider((MethodPlugin)parentElement);
if (disciplines != null && !disciplines.getChildren(disciplines).isEmpty()) {
children.add(disciplines);
}
DomainsItemProvider domains = (DomainsItemProvider)TngUtil.getDomainsItemProvider((MethodPlugin)parentElement);
if (domains != null && !domains.getChildren(domains).isEmpty()) {
children.add(domains);
}
WorkProductTypesItemProvider wpTypes = (WorkProductTypesItemProvider)TngUtil.getWorkProductTypesItemProvider((MethodPlugin)parentElement);
if (wpTypes != null && !wpTypes.getChildren(wpTypes).isEmpty()) {
children.add(wpTypes);
}
RoleSetsItemProvider roleSets = (RoleSetsItemProvider)TngUtil.getRoleSetsItemProvider((MethodPlugin)parentElement);
if (roleSets != null && !roleSets.getChildren(roleSets).isEmpty()) {
children.add(roleSets);
}
ToolsItemProvider tools = (ToolsItemProvider)TngUtil.getToolsItemProvider((MethodPlugin)parentElement);
if (tools != null && !tools.getChildren(tools).isEmpty()) {
children.add(tools);
}
// add CustomCategories provider
// get root CC of plugin
CustomCategory rootCC = (TngUtil.getRootCustomCategory((MethodPlugin)parentElement));
if (rootCC != null && !rootCC.getCategorizedElements().isEmpty()) {
children.add(rootCC);
}
// children = unwrapFVWIPs(children);
// children = filterCategoryElements(parentElement, children);
} else if (parentElement instanceof PluginUIPackagesItemProvider) {
children.addAll(Arrays.asList(super.getChildren(parentElement)));
children = filterPlugin(children);
} else if (parentElement instanceof ContentCategory) {
children.addAll(Arrays.asList(super.getChildren(parentElement)));
// children = unwrapFVWIPs(children);
children = filterCategoryElements(parentElement, children);
} else if (parentElement instanceof FeatureValueWrapperItemProvider) {
children.addAll(Arrays.asList(super.getChildren(parentElement)));
// children = unwrapFVWIPs(children);
children = filterCategoryElements(parentElement, children);
} else if (parentElement instanceof MethodLibrary) {
children.addAll(Arrays.asList(super.getElements(parentElement)));
children = filterPlugin(children);
} else if (parentElement instanceof TransientGroupItemProvider) {
children.addAll(Arrays.asList(super.getChildren(parentElement)));
}
createChildParentMap(parentElement, children);
return children.toArray();
}
private void createChildParentMap(Object parent, Collection children) {
if (children == null || children.size() == 0) {
return;
}
for (Iterator iter = children.iterator();iter.hasNext();) {
Object child = iter.next();
// 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(child, parent);
}
}
}
/**
* @see org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider#getElements(java.lang.Object)
*/
public Object[] getElements(Object inputElement) {
return getChildren(inputElement);
}
private Collection<Object> filterPlugin(Collection<Object> elements) {
for (Iterator iter = elements.iterator();iter.hasNext();) {
Object element = iter.next();
if (element instanceof MethodPlugin) {
// filter out plugins that have no CC's
if (!hasChildren((MethodPlugin)element) || !config.getMethodPluginSelection().contains(element)) {
iter.remove();
}
} else if (element instanceof PluginUIPackagesItemProvider) {
// filter out plugin packages that have no plugins with CC's
if (!hasChildren((PluginUIPackagesItemProvider)element)) {
iter.remove();
}
} else if (element instanceof ConfigurationsItemProvider) {
// remove "Configurations" folder
iter.remove();
}
}
return elements;
}
private Collection<Object> filterCategoryElements(Object parent, Collection<Object> elements) {
for (Iterator iter = elements.iterator();iter.hasNext();) {
Object element = iter.next();
element = TngUtil.unwrap(element);
if (!(element instanceof ContentCategory)) {
// remove non-ContentCategory
iter.remove();
}
}
return elements;
}
// private Collection<Object> unwrapFVWIPs(Collection<Object> elements) {
// Collection<Object> result = new ArrayList<Object>();
// for (Iterator iter = elements.iterator();iter.hasNext();) {
// Object element = iter.next();
// element = TngUtil.unwrap(element);
// if (element instanceof CustomCategory) {
// result.add(getFirstTreeItemForCC((CustomCategory)element));
// } else if (element instanceof ContentCategory) {
// result.add(element);
// } else if (element instanceof TransientCategoryPackageItemProvider) {
// result.add(element);
// }
// }
// return result;
// }
/**
* @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 null;
// try to determine parent
// Object parent = super.getParent(element);
// if (parent instanceof ContentPackage &&
// element instanceof ContentCategory) {
// return LibraryUtil.getMethodPlugin((ContentCategory)element);
// } else if (parent instanceof CustomCategory) {
// parent = getFirstTreeItemForCC((CustomCategory)parent);
// }
// else if (parent instanceof FeatureValueWrapperItemProvider) {
// parent = TngUtil.unwrap(parent);
// }
// return parent;
}
}
public Object getFirstTreeItemForCC(CustomCategory cc) {
// get ITreeContentProvider adapater
CustomCategoryItemProvider adapter = (CustomCategoryItemProvider) getAdapterFactory().adapt(cc, ITreeItemContentProvider.class);
for (Iterator iter = adapter.getNotifyChangedListeners().iterator(); iter.hasNext();) {
Object listener = iter.next();
if (listener instanceof FeatureValueWrapperItemProvider
&& TngUtil.unwrap(listener) == cc) {
return (FeatureValueWrapperItemProvider)listener;
}
}
return cc;
}
public Collection<Object> getTreeItems(Object item) {
List<Object> result = new ArrayList<Object>();
// get ITreeContentProvider adapater
List notifyChangedListeners = TngUtil.getNotifyChangedListeners(adapterFactory, item);
if (!notifyChangedListeners.isEmpty()) {
for (Iterator iterator = notifyChangedListeners.iterator(); iterator.hasNext();) {
Object listener = iterator.next();
if(listener instanceof ITreeItemContentProvider
&& TngUtil.unwrap(listener) == item) {
result.add(listener);
}
}
} else {
result.add(item);
}
return result;
}
/**
* @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 CheckboxTreeViewer ctrl = ((CheckboxTreeViewer) super.viewer);
if (element != null && (vnt.getEventType() == Notification.ADD
|| vnt.getEventType() == Notification.SET)) {
SafeUpdateController.syncExec(new Runnable() {
public void run() {
ctrl.refresh();
}
});
}
}
}
/**
* @see org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider#dispose()
*/
public void dispose() {
super.dispose();
childUIParentMap.clear();
}
}