/******************************************************************************* * Copyright (c) 2005, 2009 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.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.library.edit.navigator.ConfigPageCategoriesItemProvider; 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.edit.navigator.ConfigContentPackageItemProvider.LeafElementsItemProvider; import org.eclipse.epf.library.services.SafeUpdateController; import org.eclipse.epf.library.util.LibraryUtil; import org.eclipse.epf.uma.ContentPackage; 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; } public LeafElementsItemProvider getLeafElementsNode(Object parentElement) { if (! (parentElement instanceof ContentPackage)) { return null; } Object[] children = getChildren(parentElement); if (children == null || children.length == 0) { return null; } return children[0] instanceof LeafElementsItemProvider ? (LeafElementsItemProvider) children[0] : null; } /** * @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 || e instanceof ConfigPageCategoriesItemProvider || e instanceof LeafElementsItemProvider ); } 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(); } }