//------------------------------------------------------------------------------ // Copyright (c) 2005, 2007, 2008 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.ui.providers; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry; import org.eclipse.epf.library.edit.LibraryEditPlugin; import org.eclipse.epf.library.ui.LibraryUIResources; import org.eclipse.epf.uma.Activity; import org.eclipse.epf.uma.Artifact; import org.eclipse.epf.uma.ContentElement; import org.eclipse.epf.uma.ContentPackage; import org.eclipse.epf.uma.Discipline; import org.eclipse.epf.uma.Domain; import org.eclipse.epf.uma.MethodPackage; import org.eclipse.epf.uma.MethodPlugin; import org.eclipse.epf.uma.Practice; import org.eclipse.epf.uma.ProcessComponent; import org.eclipse.epf.uma.ProcessElement; import org.eclipse.epf.uma.ProcessPackage; import org.eclipse.epf.uma.Process; import org.eclipse.epf.uma.util.UmaUtil; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.TreeViewer; /** * An abstract tree content provider an element tree viewer. * * @author Kelvin Low * @author Phong Nguyen Le * @author Pierre Padovani * @since 1.0 */ public abstract class AbstractElementTreeContentProvider implements ITreeContentProvider { private static final String PKG_NAME_CONTENT = "Content"; //$NON-NLS-1$ private static final String PKG_NAME_CORE_CONTENT = "CoreContent"; //$NON-NLS-1$ private static final String PKG_NAME_CATEGORIES = "Categories"; //$NON-NLS-1$ private static final String PKG_NAME_DISCIPLINES = "Disciplines"; //$NON-NLS-1$ private static final String PKG_NAME_DOMAINS = "Domains"; //$NON-NLS-1$ private static final String PKG_NAME_WORK_PRODUCT_TYPES = "WP Types"; //$NON-NLS-1$ private static final String PKG_NAME_ROLESETS = "RoleSets"; //$NON-NLS-1$ private static final String PKG_NAME_TOOLS = "Tools"; //$NON-NLS-1$ private static final String PKG_NAME_CUSTOM_CATEGORIES = "CustomCategories"; //$NON-NLS-1$ private static final String PKG_NAME_CAPABILITY_PATTERNS = "CapabilityPatterns"; //$NON-NLS-1$ private static final String PKG_NAME_DELIVERY_PROCESSES = "DeliveryProcesses"; //$NON-NLS-1$ private static final String METHOD_CONTENT = LibraryUIResources.elementTCProvider_methodContent; private static final String CONTENT_PACKAGES = LibraryUIResources.elementTCProvider_contentPackages; private static final String STANDARD_CATEGORIES = LibraryUIResources.elementTCProvider_standardCategories; private static final String DISCIPLINES = LibraryUIResources.elementTCProvider_disciplines; private static final String DOMAINS = LibraryUIResources.elementTCProvider_domains; private static final String WORK_PRODUCT_TYPES = LibraryUIResources.elementTCProvider_workProductTypes; private static final String ROLESETS = LibraryUIResources.elementTCProvider_roleSets; private static final String TOOLS = LibraryUIResources.elementTCProvider_tools; private static final String CUSTOM_CATEGORIES = LibraryUIResources.elementTCProvider_customCategories; private static final String PROCESSES = LibraryUIResources.elementTCProvider_processes; private static final String CAPABILITY_PATTERNS = LibraryUIResources.elementTCProvider_capabilityPatterns; private static final String DELIVERY_PROCESSES = LibraryUIResources.elementTCProvider_deliveryProcesses; private static final Object[] EMPTY_LIST = new Object[0]; private TreeViewer treeViewer; private Map<Object, Set<Object>> elementMap = new HashMap<Object, Set<Object>>(); /** * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(Object) */ public Object[] getChildren(Object parentElement) { if (elementMap == null) { return EMPTY_LIST; } Set<Object> children = elementMap.get(parentElement); if (children == null) { return EMPTY_LIST; } return children.toArray(); } /** * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(Object) */ public Object getParent(Object element) { if (element instanceof MethodPlugin) { return null; } else if (element instanceof ElementTreeContentProviderUIFolder) { return ((ElementTreeContentProviderUIFolder) element).getParent(); } else if (element instanceof ProcessPackage) { ProcessPackage processPackage = (ProcessPackage) element; Object parent = processPackage.eContainer(); if (parent instanceof ProcessComponent) { ProcessComponent processComponent = (ProcessComponent) parent; return processComponent.getProcess(); } else { return parent; } } else if (element instanceof MethodPackage) { MethodPackage methodPackage = (MethodPackage) element; Object parent = methodPackage.eContainer(); if (parent instanceof MethodPlugin) { return parent; } MethodPackage parentPackage = methodPackage.getParentPackage(); return parentPackage; } else if (element instanceof Artifact) { Artifact artifact = (Artifact) element; Artifact containerArtifact = artifact.getContainerArtifact(); if (containerArtifact != null) { return containerArtifact; } else { return UmaUtil.getContentPackage(artifact); } } else if (element instanceof Practice) { Practice practice = (Practice) element; return practice.getContainer(); } else if (element instanceof Discipline) { Discipline discipline = (Discipline) element; return discipline.getContainer(); } else if (element instanceof Domain) { Domain domain = (Domain) element; return domain.getContainer(); } else if (element instanceof ContentElement) { return UmaUtil.getContentPackage((ContentElement) element); } else if (element instanceof Process) { Process process = (Process) element; ProcessPackage parent = (ProcessPackage) process.eContainer(); if (parent != null) { return parent.eContainer(); } } else if (element instanceof Activity) { ProcessPackage processPackage = UmaUtil .getProcessPackage((ProcessElement) element); if (processPackage != null) { ProcessPackage parentPackage = (ProcessPackage) processPackage .getParentPackage(); if (parentPackage != null) { if (parentPackage instanceof ProcessComponent) { ProcessComponent processComponent = (ProcessComponent) parentPackage; return processComponent.getProcess(); } List<ProcessElement> processElements = parentPackage .getProcessElements(); for (ProcessElement processElement : processElements) { if (processElement instanceof Activity && processElement.getName().equals( parentPackage.getName())) { return processElement; } } } } } else if (element instanceof ProcessElement) { ProcessPackage processPackage = UmaUtil .getProcessPackage((ProcessElement) element); if (processPackage != null) { if (processPackage instanceof ProcessComponent) { ProcessComponent processComponent = (ProcessComponent) processPackage; return processComponent.getProcess(); } List<ProcessElement> processElements = processPackage .getProcessElements(); for (ProcessElement processElement : processElements) { if (processElement instanceof Activity && processElement.getName().equals( processPackage.getName())) { return processElement; } } return processPackage; } } return null; } /** * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(Object) */ public boolean hasChildren(Object element) { return getChildren(element).length > 0; } public void clear() { treeViewer.refresh(); } public void dispose() { } /** * This method must return the source of the data that is populated in * this tree. * * Implementors must implement this method. * @return */ public abstract Object getContentSource(); protected void insert(Object child, boolean refreshViewer) { Object parent = getParent(child); while (parent != null) { if (insertChild(parent, child)) { if (refreshViewer) { treeViewer.add(parent, child); } } else { if (refreshViewer) { treeViewer.refresh(parent); } return; } child = parent; parent = getParent(child); } if (insertChild(getContentSource(), child)) { if (refreshViewer) { treeViewer.add(getContentSource(), child); } } } protected boolean insertChild(Object parent, Object child) { Set<Object> children = elementMap.get(parent); if (children == null) { children = new HashSet<Object>(); elementMap.put(parent, children); } return children.add(child); } protected void replace(Object parent, Object child, Object newChild) { insert(newChild, false); elementMap.put(newChild, elementMap.get(child)); elementMap.remove(child); Set<Object> children = elementMap.get(parent); children.remove(child); } /** * Implementing classes must override and implement this method. * * @param element * @param refreshViewer */ protected abstract void remove(Object element, boolean refreshViewer); protected void removeFromSiblings(Object element, Object parent) { Set<Object> siblings = elementMap.get(parent); if (siblings != null) { siblings.remove(element); } } protected void insertUIFolders(MethodPlugin element) { ElementTreeContentProviderUIFolder methodContentFolder = new ElementTreeContentProviderUIFolder( METHOD_CONTENT, ExtendedImageRegistry.getInstance().getImage( LibraryEditPlugin.INSTANCE .getImage("full/obj16/Content")), element); //$NON-NLS-1$ ElementTreeContentProviderUIFolder processesFolder = new ElementTreeContentProviderUIFolder( PROCESSES, ExtendedImageRegistry.getInstance().getImage( LibraryEditPlugin.INSTANCE .getImage("full/obj16/Processes")), element); //$NON-NLS-1$ Object[] methodPackages = getChildren(element); for (int j = 0; j < methodPackages.length; j++) { Object methodPackage = methodPackages[j]; if (methodPackage instanceof ContentPackage && ((ContentPackage) methodPackage).getName().equals( PKG_NAME_CONTENT)) { Object[] packages = getChildren(methodPackage); for (int k = 0; k < packages.length; k++) { Object pkg = packages[k]; if (pkg instanceof ContentPackage) { if (((ContentPackage) pkg).getName().equals( PKG_NAME_CORE_CONTENT)) { replace( element, pkg, new ElementTreeContentProviderUIFolder( CONTENT_PACKAGES, ExtendedImageRegistry .getInstance() .getImage( LibraryEditPlugin.INSTANCE .getImage("full/obj16/MethodPackages")), methodContentFolder)); //$NON-NLS-1$ } else if (((ContentPackage) pkg).getName().equals( PKG_NAME_CATEGORIES)) { ElementTreeContentProviderUIFolder standardCategoriesFolder = new ElementTreeContentProviderUIFolder( STANDARD_CATEGORIES, ExtendedImageRegistry .getInstance() .getImage( LibraryEditPlugin.INSTANCE .getImage("full/obj16/StandardCategories")), methodContentFolder); //$NON-NLS-1$ ElementTreeContentProviderUIFolder customCategoriesFolder = new ElementTreeContentProviderUIFolder( CUSTOM_CATEGORIES, ExtendedImageRegistry .getInstance() .getImage( LibraryEditPlugin.INSTANCE .getImage("full/obj16/CustomCategories")), methodContentFolder); //$NON-NLS-1$ Object[] contentPackages = getChildren(pkg); for (int l = 0; l < contentPackages.length; l++) { Object contentPackage = contentPackages[l]; if (contentPackage instanceof ContentPackage) { String pkgName = ((ContentPackage) contentPackage) .getName(); if (pkgName .equals(PKG_NAME_CUSTOM_CATEGORIES)) { insert(customCategoriesFolder, false); elementMap.put(customCategoriesFolder, elementMap.get(contentPackage)); } else if (pkgName .equals(PKG_NAME_DISCIPLINES)) { insert(standardCategoriesFolder, false); replace( element, contentPackage, new ElementTreeContentProviderUIFolder( DISCIPLINES, ExtendedImageRegistry .getInstance() .getImage( LibraryEditPlugin.INSTANCE .getImage("full/obj16/Disciplines")), standardCategoriesFolder)); //$NON-NLS-1$ } else if (pkgName.equals(PKG_NAME_DOMAINS)) { insert(standardCategoriesFolder, false); replace( element, contentPackage, new ElementTreeContentProviderUIFolder( DOMAINS, ExtendedImageRegistry .getInstance() .getImage( LibraryEditPlugin.INSTANCE .getImage("full/obj16/Domains")), standardCategoriesFolder)); //$NON-NLS-1$ } else if (pkgName .equals(PKG_NAME_WORK_PRODUCT_TYPES)) { insert(standardCategoriesFolder, false); replace( element, contentPackage, new ElementTreeContentProviderUIFolder( WORK_PRODUCT_TYPES, ExtendedImageRegistry .getInstance() .getImage( LibraryEditPlugin.INSTANCE .getImage("full/obj16/WorkProductTypes")), standardCategoriesFolder)); //$NON-NLS-1$ } else if (pkgName .equals(PKG_NAME_ROLESETS)) { insert(standardCategoriesFolder, false); replace( element, contentPackage, new ElementTreeContentProviderUIFolder( ROLESETS, ExtendedImageRegistry .getInstance() .getImage( LibraryEditPlugin.INSTANCE .getImage("full/obj16/Roles")), standardCategoriesFolder)); //$NON-NLS-1$ } else if (pkgName.equals(PKG_NAME_TOOLS)) { insert(standardCategoriesFolder, false); replace( element, contentPackage, new ElementTreeContentProviderUIFolder( TOOLS, ExtendedImageRegistry .getInstance() .getImage( LibraryEditPlugin.INSTANCE .getImage("full/obj16/Tools")), standardCategoriesFolder)); //$NON-NLS-1$ } } } elementMap.remove(pkg); } } else if (pkg instanceof ProcessPackage && ((ProcessPackage) pkg).getName().equals( PKG_NAME_CAPABILITY_PATTERNS)) { replace( element, pkg, new ElementTreeContentProviderUIFolder( CAPABILITY_PATTERNS, ExtendedImageRegistry .getInstance() .getImage( LibraryEditPlugin.INSTANCE .getImage("full/obj16/CapabilityPatterns")), processesFolder)); //$NON-NLS-1$ } } Set<Object> children = (Set<Object>) elementMap.get(element); children.remove(methodPackage); } else if (methodPackage instanceof ProcessPackage && ((ProcessPackage) methodPackage).getName().equals( PKG_NAME_DELIVERY_PROCESSES)) { replace( element, methodPackage, new ElementTreeContentProviderUIFolder( DELIVERY_PROCESSES, ExtendedImageRegistry .getInstance() .getImage( LibraryEditPlugin.INSTANCE .getImage("full/obj16/DeliveryProcesses")), processesFolder)); //$NON-NLS-1$ } } } /** * Inserts the UI folders into the search result tree. */ protected void insertUIFolders(Object inputElement) { Object[] elements = getChildren(inputElement); for (int i = 0; i < elements.length; i++) { Object element = elements[i]; if (element instanceof MethodPlugin) { insertUIFolders((MethodPlugin) element); } } } /** * Getter for the tree viewer * @return TreeViewer */ public TreeViewer getTreeViewer() { return treeViewer; } /** * Setter for the tree viewer. Classes that implement this abstract class must call * this method and set the tree viewer from within their inputChanged method. * * @param treeViewer */ public void setTreeViewer(TreeViewer treeViewer) { this.treeViewer = treeViewer; } /** * Getter for the elementMap * * @return elementMap */ public Map<Object, Set<Object>> getElementMap() { return elementMap; } }