/* * $Id$ * * Copyright (c) 2000-2009 by Rodney Kinney, Brent Easton * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License (LGPL) as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, copies are available * at http://www.opensource.org. */ package VASSAL.build.module.properties; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.util.ArrayList; import java.util.List; import VASSAL.command.Command; /** * A container for a String property that can be updated * * @author rkinney */ public interface MutableProperty { String getPropertyValue(); Command setPropertyValue(String newValue); void addMutablePropertyChangeListener(PropertyChangeListener l); void removeMutablePropertyChangeListener(PropertyChangeListener l); MutablePropertiesContainer getParent(); public static class Util { /** * Look for a {@link MutableProperty} in the list of {@link MutablePropertiesContainer}. Return the first one * found, searching the lists in order. The list may contain null references, which are skipped * * @param propertyContainers * @return */ public static MutableProperty findMutableProperty(String propertyName, List<MutablePropertiesContainer> propertyContainers) { MutableProperty p = null; for (MutablePropertiesContainer c : propertyContainers) { p = (c == null ? null : c.getMutableProperty(propertyName)); if (p != null) { break; } } return p; } } /** * Simple implementation of {@link MutableProperty} Support dynamic changing of the property name, provided that * the {@link #addTo(MutablePropertiesContainer)} method is used to register this property with a properties * container. * * @author rkinney * */ public static class Impl implements MutableProperty { private PropertyChangeSupport propSupport; private String value=""; private String propertyName; private MutablePropertiesContainer parent; // Maintain a static list of all Global Properties known to module private static List<Impl> allProperties = new ArrayList<Impl>(); public static List<Impl> getAllProperties() { return allProperties; } /** * * @param source * will be the source of any {@link PropertyChangeEvent} fired by this object */ public Impl(String propertyName, Object source) { this.propertyName = propertyName; propSupport = new PropertyChangeSupport(this); } public void addMutablePropertyChangeListener(PropertyChangeListener l) { propSupport.addPropertyChangeListener(l); } public void addTo(MutablePropertiesContainer c) { parent = c; parent.addMutableProperty(propertyName, this); allProperties.add(this); } public void setPropertyName(String name) { if (parent != null) { parent.removeMutableProperty(propertyName); parent.addMutableProperty(name, this); } propertyName = name; } public void removeFromContainer() { if (parent != null) { parent.removeMutableProperty(propertyName); allProperties.remove(this); } } public String getPropertyValue() { return value; } public String getName() { return propertyName; } public MutablePropertiesContainer getParent() { return parent; } public void removeMutablePropertyChangeListener(PropertyChangeListener l) { propSupport.removePropertyChangeListener(l); } protected Command getChangeCommand(String oldValue, String newValue) { return new ChangePropertyCommand(this,propertyName, oldValue, newValue); } public Command setPropertyValue(String newValue) { if (newValue == null) { newValue = ""; } String oldValue = value; Command c = getChangeCommand(value, newValue); value = newValue; propSupport.firePropertyChange(propertyName, oldValue, newValue); return c; } } }