blob: feff07851b9c36ad1f811d73448a4918eeaf4d29 [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.dialogs;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
import org.eclipse.epf.authoring.ui.AuthoringUIResources;
import org.eclipse.epf.authoring.ui.filters.AllFilter;
import org.eclipse.epf.library.edit.IFilter;
import org.eclipse.epf.library.edit.PresentationContext;
import org.eclipse.epf.library.edit.TngAdapterFactory;
import org.eclipse.epf.library.edit.itemsfilter.CategorizedProcessesItemProvider;
import org.eclipse.epf.library.edit.itemsfilter.ContentCategoriesGroupItemProvider;
import org.eclipse.epf.library.edit.itemsfilter.FilterConstants;
import org.eclipse.epf.library.edit.itemsfilter.ProcessesItemProvider;
import org.eclipse.epf.library.edit.util.MethodElementUtil;
import org.eclipse.epf.library.edit.util.TngUtil;
import org.eclipse.epf.uma.Artifact;
import org.eclipse.epf.uma.ContentElement;
import org.eclipse.epf.uma.ContentPackage;
import org.eclipse.epf.uma.CustomCategory;
import org.eclipse.epf.uma.DescribableElement;
import org.eclipse.epf.uma.Discipline;
import org.eclipse.epf.uma.MethodPlugin;
import org.eclipse.epf.uma.ProcessComponent;
import org.eclipse.epf.uma.RoleSet;
import org.eclipse.epf.uma.VariabilityElement;
import org.eclipse.epf.uma.util.AssociationHelper;
import org.eclipse.epf.uma.util.UmaUtil;
import org.eclipse.ui.PlatformUI;
/**
* The dialog for showing and possibly selecting any variability related to the
* given element.
*
* @author Jeff Hardy
* @since 1.1
*/
public class VariabilitySelection {
private HashSet filterElementList = new HashSet();
private class VariabilityFilter extends AllFilter {
public boolean accept(Object obj) {
Object contentElement = helper.getContentElement();
if (contentElement != null) {
if (obj.equals(helper.getContentElement()))
return false;
}
if (helper.getAlreadySelectedList() != null) {
if (obj instanceof ProcessComponent) {
if (helper.getAlreadySelectedList().contains(
((ProcessComponent) obj).getProcess()))
return false;
} else {
if (helper.getAlreadySelectedList().contains(obj))
return false;
}
}
if (obj instanceof CustomCategory) {
if (TngUtil.isRootCustomCategory((CustomCategory) obj)) {
if (((CustomCategory) obj).getCategorizedElements()
.isEmpty())
return false;
}
}
if (!helper.matchPattern(obj))
return false;
if (obj instanceof MethodPlugin) {
if (obj instanceof MethodPlugin) {
if (contentElement != null) {
if (MethodElementUtil.getAllModels(contentElement)
.contains(obj))
return true;
else
return false;
} else {
return true;
}
}
}
if (obj instanceof ContentPackage)
return true;
if (obj instanceof ContentCategoriesGroupItemProvider) {
Collection list = ((ContentCategoriesGroupItemProvider) obj)
.getChildren(obj);
if (list.isEmpty())
return false;
else
return true;
}
if (obj instanceof ProcessesItemProvider) {
Collection list = ((ProcessesItemProvider) obj)
.getChildren(obj);
for (Iterator ior = list.iterator(); ior.hasNext();) {
Object object = ior.next();
if (((CategorizedProcessesItemProvider) object)
.getChildren(object).isEmpty())
ior.remove();
}
if (list.isEmpty())
return false;
else
return true;
}
if (childAccept(obj))
return true;
return false;
}
public boolean childAccept(Object obj) {
if ((obj instanceof ContentElement)
&& filterElementList.contains(obj)) {
return true;
}
return false;
}
};
/**
* Display variability selection dialog which lists elements and it's
* variabilities.
*
*/
public VariabilitySelection() {
}
/**
* It shows dialog box for all the contributors. User is expected to select
* one.
*
* @param element
* @return
* Object selected by user
*/
public Object getSelectedVariability(VariabilityElement element) {
Set elementSet = new HashSet();
elementSet.add(element);
elementSet = AssociationHelper.getVariabilityElements(elementSet, true, true);
filterElementList.addAll(elementSet);
if (!elementSet.isEmpty()) {
for (Iterator itor = elementSet.iterator(); itor.hasNext();) {
ContentElement contentElement = (ContentElement) itor.next();
List groupings = null;
if (contentElement instanceof Discipline) {
groupings = AssociationHelper
.getDisciplineGroups((Discipline) contentElement);
}
if (contentElement instanceof RoleSet) {
groupings = AssociationHelper
.getRoleSetGroups((RoleSet) contentElement);
}
if (contentElement instanceof CustomCategory) {
groupings = getAncestors((CustomCategory)contentElement);
}
if ((groupings != null) && (!groupings.isEmpty()))
filterElementList.addAll(groupings);
if (contentElement instanceof Artifact) {
filterElementList.addAll(getAllContainerArtifact((Artifact)contentElement));
}
}
IFilter filter = new VariabilityFilter();
String[] str = new String[] { FilterConstants.CONFIG_CONTENT_ELEMENT };
ItemsFilterDialog dlg = new ItemsFilterDialog(PlatformUI
.getWorkbench().getActiveWorkbenchWindow().getShell());
dlg.setFilter(filter);
dlg.setTitle(FilterConstants.CONFIG_CONTENT_ELEMENT);
dlg.setViewerSelectionSingle(true);
dlg.setTypes(str);
dlg.setInput(UmaUtil.getMethodLibrary((EObject) element));
dlg.setContentProvider(new AdapterFactoryContentProvider(
TngAdapterFactory.INSTANCE
.getItemsFilter_AdapterFactory(filter)),
TngAdapterFactory.INSTANCE.getItemsFilter_ComposedAdapterFactory());
dlg.setBlockOnOpen(true);
String elementName = element.getName();
if (element instanceof DescribableElement
&& PresentationContext.INSTANCE.isShowPresentationNames()) {
if (((DescribableElement) element).getPresentationName().trim()
.length() > 0)
elementName = ((DescribableElement) element)
.getPresentationName();
}
dlg
.setViewerLabel(AuthoringUIResources.bind(AuthoringUIResources.VariabilitySelection_filterdialog_viewerLabel, (new String[] { elementName })));
String title = MessageFormat
.format(
AuthoringUIResources.VariabilitySelection_filterdialog_title,
new String[] { elementName });
dlg.setTitle(title);
dlg.setBlockOnOpen(true);
dlg.open();
List result = dlg.getSelectedItems();
if ((result == null) || (result.isEmpty()))
return null;
else
return result.get(0);
}
return element;
}
private List getAllContainerArtifact(Artifact artifact) {
List result = new ArrayList();
if (artifact.getContainerArtifact() != null) {
Artifact parent = artifact.getContainerArtifact();
result.add(parent);
result.addAll(getAllContainerArtifact(parent));
}
return result;
}
/**
* Returns the ancestors for the given Custom Category.
* taken from authoring.ui.CustomCategoryAssignPage
*/
private List getAncestors(CustomCategory methodObject) {
List ancestorList = new ArrayList();
List objList = new ArrayList();
objList.add(methodObject);
getAncestors(ancestorList, objList);
return ancestorList;
}
private List getAncestors(List ancestorList, List methodObjectList) {
if (methodObjectList.isEmpty())
return ancestorList;
List allParentCustCats = new ArrayList();
for (Iterator iter = methodObjectList.iterator(); iter.hasNext();) {
CustomCategory element = (CustomCategory) iter.next();
List parentList = AssociationHelper.getCustomCategories(element);
allParentCustCats.addAll(parentList);
}
ancestorList.addAll(methodObjectList);
List nextCheckList = new ArrayList();
for (Iterator iter = allParentCustCats.iterator(); iter.hasNext();) {
Object element = iter.next();
if (!ancestorList.contains(element)) {
nextCheckList.add(element);
}
}
return getAncestors(ancestorList, nextCheckList);
}
}