blob: 7ee5a4bed6c6cc866329515d6e3b4267be594baa [file] [log] [blame]
//------------------------------------------------------------------------------
// Copyright (c) 2005, 2007 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.search.ui.internal;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.epf.library.edit.LibraryEditPlugin;
import org.eclipse.epf.search.ui.SearchUIResources;
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.Process;
import org.eclipse.epf.uma.ProcessComponent;
import org.eclipse.epf.uma.ProcessElement;
import org.eclipse.epf.uma.ProcessPackage;
import org.eclipse.epf.uma.util.UmaUtil;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
/**
* The content provider for the method search result tree viewer.
*
* @author Kelvin Low
* @since 1.0
*/
public class SearchResultTreeContentProvider 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 = SearchUIResources.searchResult_methodContent; //$NON-NLS-1$
private static final String CONTENT_PACKAGES = SearchUIResources.searchResult_contentPackages; //$NON-NLS-1$
private static final String STANDARD_CATEGORIES = SearchUIResources.searchResult_standardCategories; //$NON-NLS-1$
private static final String DISCIPLINES = SearchUIResources.searchResult_disciplines; //$NON-NLS-1$
private static final String DOMAINS = SearchUIResources.searchResult_domains; //$NON-NLS-1$
private static final String WORK_PRODUCT_TYPES = SearchUIResources.searchResult_workProductTypes; //$NON-NLS-1$
private static final String ROLESETS = SearchUIResources.searchResult_roleSets; //$NON-NLS-1$
private static final String TOOLS = SearchUIResources.searchResult_tools; //$NON-NLS-1$
private static final String CUSTOM_CATEGORIES = SearchUIResources.searchResult_customCategories; //$NON-NLS-1$
private static final String PROCESSES = SearchUIResources.searchResult_processes; //$NON-NLS-1$
private static final String CAPABILITY_PATTERNS = SearchUIResources.searchResult_capabilityPatterns; //$NON-NLS-1$
private static final String DELIVERY_PROCESSES = SearchUIResources.searchResult_deliveryProcesses; //$NON-NLS-1$
private static final Object[] EMPTY_LIST = new Object[0];
private TreeViewer treeViewer;
private MethodSearchResult searchResult;
private Map elementMap;
/**
* @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(Object)
*/
public Object[] getElements(Object inputElement) {
if (inputElement instanceof MethodSearchResult) {
Object[] elements = ((MethodSearchResult) inputElement)
.getElements();
if (elements.length == 0) {
return EMPTY_LIST;
}
elementMap = new HashMap();
for (int i = 0; i < elements.length; i++) {
insert(elements[i], false);
}
insertUIFolders(inputElement);
}
return getChildren(inputElement);
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
if (newInput != null && newInput instanceof MethodSearchResult) {
treeViewer = (TreeViewer) viewer;
searchResult = (MethodSearchResult) newInput;
}
}
public void elementsChanged(Object[] updatedElements) {
for (int i = 0; i < updatedElements.length; i++) {
if (searchResult.getMatchCount(updatedElements[i]) > 0) {
if (treeViewer.testFindItem(updatedElements[i]) != null) {
insert(updatedElements[i], true);
} else {
remove(updatedElements[i], true);
}
} else {
treeViewer.remove(updatedElements[i]);
}
}
treeViewer.refresh();
}
/**
* @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(Object)
*/
public Object[] getChildren(Object parentElement) {
if (elementMap == null) {
return EMPTY_LIST;
}
Set children = (Set) 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 SearchResultUIFolder) {
return ((SearchResultUIFolder) 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 processElements = parentPackage.getProcessElements();
for (Iterator i = processElements.iterator(); i.hasNext();) {
ProcessElement processElement = (ProcessElement) i
.next();
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 processElements = processPackage.getProcessElements();
for (Iterator i = processElements.iterator(); i.hasNext();) {
ProcessElement processElement = (ProcessElement) i.next();
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() {
}
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(searchResult, child)) {
if (refreshViewer) {
treeViewer.add(searchResult, child);
}
}
}
protected boolean insertChild(Object parent, Object child) {
Set children = (Set) elementMap.get(parent);
if (children == null) {
children = new HashSet();
elementMap.put(parent, children);
}
return children.add(child);
}
protected void replace(Object parent, Object child, Object newChild) {
insert(newChild, false);
elementMap.put(newChild, (Set) elementMap.get(child));
elementMap.remove(child);
Set children = (Set) elementMap.get(parent);
children.remove(child);
}
protected void remove(Object element, boolean refreshViewer) {
if (hasChildren(element)) {
if (refreshViewer) {
treeViewer.refresh(element);
}
} else {
if (searchResult.getMatchCount(element) == 0) {
elementMap.remove(element);
Object parent = getParent(element);
if (parent != null) {
removeFromSiblings(element, parent);
remove(parent, refreshViewer);
} else {
removeFromSiblings(element, searchResult);
if (refreshViewer) {
treeViewer.refresh();
}
}
} else {
if (refreshViewer) {
treeViewer.refresh(element);
}
}
}
}
protected void removeFromSiblings(Object element, Object parent) {
Set siblings = (Set) elementMap.get(parent);
if (siblings != null) {
siblings.remove(element);
}
}
/**
* 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) {
SearchResultUIFolder methodContentFolder = new SearchResultUIFolder(
METHOD_CONTENT, LibraryEditPlugin.INSTANCE
.getImage("full/obj16/Content"), element); //$NON-NLS-1$
SearchResultUIFolder processesFolder = new SearchResultUIFolder(
PROCESSES, 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 SearchResultUIFolder(
CONTENT_PACKAGES,
LibraryEditPlugin.INSTANCE
.getImage("full/obj16/MethodPackages"), methodContentFolder)); //$NON-NLS-1$
} else if (((ContentPackage) pkg).getName()
.equals(PKG_NAME_CATEGORIES)) {
SearchResultUIFolder standardCategoriesFolder = new SearchResultUIFolder(
STANDARD_CATEGORIES,
LibraryEditPlugin.INSTANCE
.getImage("full/obj16/StandardCategories"), methodContentFolder); //$NON-NLS-1$
SearchResultUIFolder customCategoriesFolder = new SearchResultUIFolder(
CUSTOM_CATEGORIES,
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,
(Set) elementMap
.get(contentPackage));
} else if (pkgName
.equals(PKG_NAME_DISCIPLINES)) {
insert(
standardCategoriesFolder,
false);
replace(
element,
contentPackage,
new SearchResultUIFolder(
DISCIPLINES,
LibraryEditPlugin.INSTANCE
.getImage("full/obj16/Disciplines"), standardCategoriesFolder)); //$NON-NLS-1$
} else if (pkgName
.equals(PKG_NAME_DOMAINS)) {
insert(
standardCategoriesFolder,
false);
replace(
element,
contentPackage,
new SearchResultUIFolder(
DOMAINS,
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 SearchResultUIFolder(
WORK_PRODUCT_TYPES,
LibraryEditPlugin.INSTANCE
.getImage("full/obj16/WorkProductTypes"), standardCategoriesFolder)); //$NON-NLS-1$
} else if (pkgName
.equals(PKG_NAME_ROLESETS)) {
insert(
standardCategoriesFolder,
false);
replace(
element,
contentPackage,
new SearchResultUIFolder(
ROLESETS,
LibraryEditPlugin.INSTANCE
.getImage("full/obj16/Roles"), standardCategoriesFolder)); //$NON-NLS-1$
} else if (pkgName
.equals(PKG_NAME_TOOLS)) {
insert(
standardCategoriesFolder,
false);
replace(
element,
contentPackage,
new SearchResultUIFolder(
TOOLS,
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 SearchResultUIFolder(
CAPABILITY_PATTERNS,
LibraryEditPlugin.INSTANCE
.getImage("full/obj16/CapabilityPatterns"), processesFolder)); //$NON-NLS-1$
}
}
Set children = (Set) elementMap.get(element);
children.remove(methodPackage);
} else if (methodPackage instanceof ProcessPackage
&& ((ProcessPackage) methodPackage).getName()
.equals(PKG_NAME_DELIVERY_PROCESSES)) {
replace(
element,
methodPackage,
new SearchResultUIFolder(
DELIVERY_PROCESSES,
LibraryEditPlugin.INSTANCE
.getImage("full/obj16/DeliveryProcesses"), processesFolder)); //$NON-NLS-1$
}
}
}
}
}
}