blob: 9c2a1e0bc5296878d350489befa059ba78c8b962 [file] [log] [blame]
//------------------------------------------------------------------------------
// Copyright (c) 2005, 20087 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.edit.util;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.runtime.ListenerList;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.impl.AdapterImpl;
import org.eclipse.epf.library.edit.util.MethodElementPropertyMgr.ChangeEvent;
import org.eclipse.epf.library.edit.util.MethodElementPropertyMgr.ChangeEventListener;
import org.eclipse.epf.uma.MethodElement;
import org.eclipse.epf.uma.MethodElementProperty;
import org.eclipse.epf.uma.UmaFactory;
import org.eclipse.epf.uma.UmaPackage;
/**
* Class managing cached method element properties
*
* @author Weiping Lu - May 10, 2008
* @since 1.5
*/
public class MethodElementProperties extends AdapterImpl {
private MethodElement element;
private ListenerList listeners = new ListenerList();
private Set<String> propNameSet = new LinkedHashSet<String>();
private Map<String, List<MethodElementProperty>> propertyMap;
public MethodElementProperties(MethodElement element, String[] propNameArray) {
this.element = element;
if (propNameArray != null) {
for (int i = 0; i < propNameArray.length; i++) {
propNameSet.add(propNameArray[i]);
}
}
propertyMap = MethodElementPropertyHelper.getPropertyMap(element, getPropNameSet());
}
protected Set<String> getPropNameSet() {
return propNameSet;
}
public boolean propNameRegistered(String propName) {
return getPropNameSet() != null && getPropNameSet().contains(propName);
}
public void notifyChanged(Notification msg) {
Object obj = msg.getNotifier();
MethodElementProperty meProp = null;
if (obj instanceof MethodElementProperty) {
meProp = (MethodElementProperty) obj;
} else if (obj == element) {
if (msg.getFeature() != UmaPackage.eINSTANCE
.getMethodElement_MethodElementProperty()) {
return;
}
} else {
return;
}
//To be implemented: do nothing for now
}
public MethodElementProperty getProperty(String propName) {
List<MethodElementProperty> propList = propertyMap.get(propName);
return propList == null || propList.isEmpty() ? null : propList.get(0);
}
public void setProperty(String propName, String propValue) {
List<MethodElementProperty> propList = propertyMap.get(propName);
if (propList == null) {
propList = new ArrayList<MethodElementProperty>();
propertyMap.put(propName, propList);
}
MethodElementProperty prop = propList.isEmpty() ? null : propList.get(0);
if (prop == null) {
prop = UmaFactory.eINSTANCE.createMethodElementProperty();
prop.setName(propName);
element.getMethodElementProperty().add(prop);
if (propList.isEmpty()) {
propList.add(prop);
}
}
String oldValue = prop.getValue();
if (equal(oldValue, propValue)) {
return;
}
prop.setValue(propValue);
notifyListeners(new ChangeEvent(prop, oldValue, propValue));
}
public boolean getBooleanValue(String propName) {
MethodElementProperty prop = getProperty(propName);
if (prop == null) {
return false;
}
String value = prop.getValue();
return Boolean.TRUE.toString().equals(prop.getValue());
}
private boolean equal(Object a, Object b) {
if (a != null) {
return a.equals(b);
}
return b == null;
}
public void addListener(ChangeEventListener listener) {
if (this.listeners != null)
this.listeners.add(listener);
}
public void removeListener(ChangeEventListener listener) {
if (this.listeners != null)
this.listeners.remove(listener);
}
private void notifyListeners(ChangeEvent event) {
if (this.listeners != null) {
for (Object o : listeners.getListeners()) {
if (o instanceof ChangeEventListener)
((ChangeEventListener) o).notifyChange(event);
}
}
}
public void dispose() {
element = null;
listeners = null;
propNameSet = null;
propertyMap = null;
//To do: remove from this adapter from all attached Notifier objects
}
}