// -*- mode: java; c-basic-offset: 2; -*- // Copyright 2009-2011 Google, All Rights reserved // Copyright 2011-2012 MIT, All rights reserved // Released under the Apache License, Version 2.0 // http://www.apache.org/licenses/LICENSE-2.0 package com.google.appinventor.client.widgets.properties; import com.google.appinventor.client.properties.Properties; import java.util.ArrayList; import java.util.List; /** * A collection of properties with associated {@link PropertyEditor}s. * * <p>Interested classes can register listeners to receive events about value * changes of any property in the collection. * */ public class EditableProperties extends Properties<EditableProperty> { // List of listeners for any property value changes private final List<PropertyChangeListener> changeListeners; // Fire change events after adding a new property private final boolean changeEventOnAdd; /** * Creates a new properties collection. * * @param changeEventOnAdd if {@code true}, a change event will be fired * after adding a new property */ public EditableProperties(boolean changeEventOnAdd) { this.changeEventOnAdd = changeEventOnAdd; changeListeners = new ArrayList<PropertyChangeListener>(); } /** * Adds a new property. * * @param name property name * @param defaultValue default value of property * @param caption property caption for use in the ui * @param editor property editor * @param type type of property; see {@code TYPE_*} constants in {@link EditableProperty} */ public void addProperty(String name, String defaultValue, String caption, PropertyEditor editor, int type) { addProperty(new EditableProperty(this, name, defaultValue, caption, editor, type)); } @Override protected void addProperty(EditableProperty property) { super.addProperty(property); if (changeEventOnAdd) { firePropertyChangeEvent(property.getName(), property.getValue()); } } public void removeProperty(String propertyName) { super.removeProperty(propertyName); } /** * Adds a {@link PropertyChangeListener} to the listener list. * * @param listener the {@code PropertyChangeListener} to be added */ public void addPropertyChangeListener(PropertyChangeListener listener) { changeListeners.add(listener); } /** * Removes a {@link PropertyChangeListener} from the listener list. * * @param listener the {@code PropertyChangeListener} to be removed */ public void removePropertyChangeListener(PropertyChangeListener listener) { changeListeners.remove(listener); } /** * Triggers a change event to be sent to the listener on the listener list. * * @param name property name * @param newValue new property value */ public void firePropertyChangeEvent(String name, String newValue) { for (PropertyChangeListener listener : changeListeners) { listener.onPropertyChange(name, newValue); } } /** * Adds the properties from this collection to a properties panel for display. * * @param panel properties panel */ void addToPropertiesPanel(PropertiesPanel panel) { for (EditableProperty property : this) { if (property.isVisible()) { panel.addProperty(property); } } } /** * Orphans all properties and then deletes them from this collection. */ public void clear() { for (EditableProperty property : this) { property.orphan(); } deleteAllProperties(); } }