blob: ea4d71634e804c6f074881a8467a49b78234beed [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.library.layout.elements;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
import org.eclipse.epf.library.configuration.ConfigurationHelper;
import org.eclipse.epf.library.edit.process.BreakdownElementWrapperItemProvider;
import org.eclipse.epf.library.edit.process.IBSItemProvider;
import org.eclipse.epf.library.edit.util.MilestonePropUtil;
import org.eclipse.epf.library.edit.util.Suppression;
import org.eclipse.epf.library.edit.util.TaskDescriptorPropUtil;
import org.eclipse.epf.library.edit.util.TngUtil;
import org.eclipse.epf.library.layout.ElementLayoutManager;
import org.eclipse.epf.library.layout.IElementLayout;
import org.eclipse.epf.library.layout.util.XmlElement;
import org.eclipse.epf.library.util.LibraryUtil;
import org.eclipse.epf.uma.Activity;
import org.eclipse.epf.uma.BreakdownElement;
import org.eclipse.epf.uma.Constraint;
import org.eclipse.epf.uma.MethodElement;
import org.eclipse.epf.uma.Milestone;
import org.eclipse.epf.uma.Process;
import org.eclipse.epf.uma.TaskDescriptor;
import org.eclipse.epf.uma.WorkProductDescriptor;
import com.ibm.icu.util.StringTokenizer;
/**
* abstrct class for process element layout that is process specific
*
* @author Jinhua Xi
* @since 1.0
*/
public abstract class AbstractProcessElementLayout extends
AbstractElementLayout {
protected Process owningProcess = null;
protected String elementProcessPath = null;
protected String relProcessPath = null;
protected String[] paths = null;
protected String displayName = null;
/**
* construct a layout for process element
*
* @param layoutManager
* @param element
* @param owningProc
* @param path
*/
public void init(ElementLayoutManager layoutManager, MethodElement element,
Process owningProc, String path) {
init(layoutManager, element);
this.owningProcess = owningProc;
this.elementProcessPath = path;
if (this.owningProcess == null) {
this.owningProcess = TngUtil
.getOwningProcess((BreakdownElement) super.element);
}
if (LibraryUtil.isProcess(element)) {
owningProcess = (Process) element;
elementProcessPath = AbstractProcessElementLayout.makePath(null,
element);
relProcessPath = elementProcessPath;
}
if ( elementProcessPath == null && this.element instanceof BreakdownElement)
{
elementProcessPath = AbstractProcessElementLayout.getPath((BreakdownElement)this.element);
}
// get the path array
paths = getPathArray(elementProcessPath);
}
/**
* the process path of this item relative to the calling item
* @param path
*/
public void setRelativeProcessPath(String path)
{
this.relProcessPath = path;
}
/**
* get the relative process path
* @return String
*/
public String getRelativeProcessPath()
{
return this.relProcessPath;
}
// public String getUrl() {
// String url = super.getUrl();
//
// return url + getQueryString();
// }
/**
* get query string for the process element
* @return String
*/
public String getQueryString() {
// if (owningProcess == element) {
// return "";
// }
// return "?" + ResourceHelper.URL_PARAMETER_PROCESS + "=" +
// owningProcess.getGuid() + "&" + ResourceHelper.URL_PARAMETER_PATH +
// "=" + elementProcessPath;
return ElementLayoutManager.getQueryString(owningProcess.getGuid(),
elementProcessPath);
}
/**
* @see org.eclipse.epf.library.layout.IElementLayout#getDisplayName()
*/
public String getDisplayName() {
if ( this.displayName == null ) {
Process proc = getOwningProcess();
// need to handle the supressed breakdown elements
// use the Supress utility
Suppression sup = getSuppression(proc);
// display name needs to be fixed, extended activity may need to get display name from the base
// DVT: PNs of extended processes no picked up for publish (TCT 638)
ComposedAdapterFactory adapterFactory = layoutManager.getCBSAdapterFactory();
Object wrapper = sup.getObjectByPath(this.paths, adapterFactory);
if ( wrapper == null ) {
wrapper = super.element;
}
IBSItemProvider adapter = (IBSItemProvider) adapterFactory.adapt(
wrapper, ITreeItemContentProvider.class);
// this.displayName = ProcessUtil.getAttribute(element,
// IBSItemProvider.COL_PRESENTATION_NAME, adapter);
this.displayName = ConfigurationHelper.getPresentationName(element, this.getLayoutMgr().getConfiguration());
}
return displayName;
}
protected Suppression getSuppression(Process proc)
{
return layoutManager.getSuppression(proc);
}
protected XmlElement getXmlElement() {
XmlElement elementXml = super.getXmlElement();
elementXml.setAttribute("queryString", getQueryString()) //$NON-NLS-1$
//.setAttribute("owningProcessGuid", owningProcess.getGuid()) // //$NON-NLS-1$
//.setAttribute("elementProcessPath", elementProcessPath) //$NON-NLS-1$
.setAttribute("relProcessPath", relProcessPath); //$NON-NLS-1$
return elementXml;
}
protected Process getOwningProcess() {
return owningProcess;
}
protected IElementLayout getLayout(ProcessElementItem item) {
IElementLayout layout = layoutManager.createLayout(item.element, owningProcess, item.path);
if ( layout instanceof AbstractProcessElementLayout )
{
// set the relative path to this layout since this is the caller
String relPath = AbstractProcessElementLayout.getRelativePath(item.path, this.elementProcessPath);
((AbstractProcessElementLayout)layout).setRelativeProcessPath(relPath);
}
return layout;
}
protected String getSuperActivityPath() {
if ( element instanceof BreakdownElement ) {
Activity act = ((BreakdownElement)element).getSuperActivities();
String id = act.getGuid();
int i = elementProcessPath.indexOf(id);
if ( i >=0 ) {
return elementProcessPath.substring(0, i + id.length());
}
}
return null;
}
/**
* static utility methods for make a path for the process elenment
*/
public static String makePath(String parentPath, MethodElement element) {
if (parentPath == null || parentPath.length() == 0) {
return element.getGuid();
}
return parentPath + "," + element.getGuid(); //$NON-NLS-1$
}
/**
* static method to get the path of a break down element
* @param element
* @return String
*/
public static String getPath(BreakdownElement element) {
String path = element.getGuid();
BreakdownElement act = element;
Process proc = TngUtil.getOwningProcess(element);
// Check superactivity is process and should owning process (this is useful in deepcopy
while ( act != proc )
{
Activity superActs = act.getSuperActivities();
if ( superActs != null )
{
act = superActs;
path = act.getGuid() + "," + path; //$NON-NLS-1$
}
else
{
break;
}
}
return path;
}
/**
* get the path for a given breakdown element item provider
* @param wrapper BreakdownElementWrapperItemProvider
* @return String the path
*/
public static String getPath(BreakdownElementWrapperItemProvider wrapper)
{
Object e = LibraryUtil.unwrap(wrapper);
if ( !(e instanceof MethodElement) ) {
return null;
}
Object topItem = wrapper.getTopItem();
StringBuffer path = new StringBuffer();
path.append(((MethodElement)e).getGuid());
Object parent = wrapper;
while (parent != null && parent != topItem) {
if ( parent instanceof BreakdownElement ) {
parent = ((BreakdownElement)parent).getSuperActivities();
e = parent;
} else if ( parent instanceof BreakdownElementWrapperItemProvider ){
parent = ((BreakdownElementWrapperItemProvider)parent).getParent(parent);
e = LibraryUtil.unwrap(parent);
} else {
break;
}
if ( e instanceof MethodElement) {
path.insert(0, ((MethodElement)e).getGuid() + ","); //$NON-NLS-1$
}
}
return path.toString();
}
/**
* utility method to get the relative path to the parent
* @param path String
* @param parentPath String
* @return String
*/
public static String getRelativePath(String path, String parentPath) {
if ( path == null )
{
return path;
}
if ( path.startsWith(parentPath) )
{
return path.substring(parentPath.length());
}
return path;
}
/**
* get the path arrray
* @param path String
* @return String[]
*/
public static String[] getPathArray(String path)
{
if ( path == null )
{
return new String[]{};
}
List items = new ArrayList();
StringTokenizer st = new StringTokenizer(path, ","); //$NON-NLS-1$
while ( st.hasMoreTokens() )
{
String s = st.nextToken().trim();
if ( s.length() > 0 )
{
items.add(s);
}
}
String[] arr = new String[items.size()];
items.toArray(arr);
return arr;
}
/**
* get the owning process from path, the first part of the path is the guid of the process
* @param path
* @return String
*/
public static String getOwningProcessGuidFromPath(String path)
{
if ( path == null )
{
return null;
}
int index = path.indexOf(","); //$NON-NLS-1$
String guid;
if ( index < 0 )
{
guid = path;
}
else
{
guid = path.substring(0, index);
}
return guid;
}
/**
* get the parent path
* @param path
* @return String
*/
public static String getParentPath(String path) {
if ( path == null ) {
return null;
}
int index = path.lastIndexOf(","); //$NON-NLS-1$
if ( index > 0 ) {
return path.substring(0, index);
}
return null;
}
@Override
protected void modifyChildDisplayName(Object feature,
XmlElement childXmlElement, MethodElement childElement) {
if (! (element instanceof TaskDescriptor) && !(element instanceof Milestone)) {
return;
}
if (! (childElement instanceof WorkProductDescriptor)) {
return;
}
if (! (feature instanceof EReference)) {
return;
}
EReference ref = (EReference) feature;
if (! ref.isMany()) {
return;
}
WorkProductDescriptor wpd = (WorkProductDescriptor) childElement;
String displayName = childXmlElement.getAttribute("DisplayName"); //$NON-NLS-1$)
if (displayName == null) {
return;
}
List<Constraint> states = null;
if (element instanceof TaskDescriptor) {
states = TaskDescriptorPropUtil.getTaskDescriptorPropUtil().getWpStates(
(TaskDescriptor) element, wpd, ref);
} else if (element instanceof Milestone) {
states = MilestonePropUtil.getMilestonePropUtil().getWpStates(
(Milestone) element, wpd, ref);
}
if (states != null && states.size() > 0) {
String stateName = states.get(0).getBody();
String newDisplayName = displayName + " [" + stateName + "]"; //$NON-NLS-1$ //$NON-NLS-2$
childXmlElement.setAttribute("DisplayName", newDisplayName); //$NON-NLS-1$
}
}
}