//------------------------------------------------------------------------------ // 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 } }