/******************************************************************************* * Copyright (c) 1998, 2015 Oracle and/or its affiliates. All rights reserved. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 * which accompanies this distribution. * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * Contributors: * Oracle - initial API and implementation from Oracle TopLink ******************************************************************************/ package org.eclipse.persistence.tools.workbench.uitools; // JDK import java.awt.Component; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.Collection; import java.util.Iterator; import org.eclipse.persistence.tools.workbench.uitools.app.ValueModel; import org.eclipse.persistence.tools.workbench.utility.CollectionTools; /** * This <code>ComponentEnabler</code> keeps the "enabled" state of * a collection of components in synch with the provided boolean holder. * * @version 10.1.3 * @author Pascal Filion */ public class ComponentEnabler { /** * A listener that allows us to synchronize the components with * changes made to the underlying boolean model. */ private PropertyChangeListener booleanChangeListener; /** * A value model on the underlying boolean model */ ValueModel booleanHolder; /** * The collection of components whose "enabled" state is kept * in sync with the boolean holder's value. */ private Collection components; /** * The default setting for the "enabled" state; for when the underlying model is * <code>null</code>. The default [default value] is <code>false<code> (i.e. * the components are disabled). */ private boolean defaultValue; /** * Creates a new <code>ComponentEnabler</code>. */ private ComponentEnabler() { super(); initialize(); } /** * Creates a new <code>ComponentEnabler</code> with a default value of * <code>false</code> (i.e. disabled). * * @param booleanHolder A value model on the underlying boolean model * @param component The component whose "enabled" state is * kept in sync with the boolean holder's value */ public ComponentEnabler(ValueModel booleanHolder, Component component) { this(booleanHolder, component, false); } /** * Creates a new <code>ComponentEnabler</code>. * * @param booleanHolder A value model on the underlying boolean model * @param component The component whose "enabled" state is * kept in sync with the boolean holder's value * @param defaultValue The value to use when the underlying model is * <code>null</code> */ public ComponentEnabler(ValueModel booleanHolder, Component component, boolean defaultValue) { this(booleanHolder, new Component[] {component}, false); } /** * Creates a new <code>ComponentEnabler</code> with a default value of * <code>false</code> (i.e. disabled). * * @param booleanHolder A value model on the underlying boolean model * @param components The collection of components whose "enabled" state is * kept in sync with the boolean holder's value */ public ComponentEnabler(ValueModel booleanHolder, Collection components) { this(booleanHolder, components, false); } /** * Creates a new <code>ComponentEnabler</code>. * * @param booleanHolder A value model on the underlying boolean model * @param components The collection of components whose "enabled" state is * kept in sync with the boolean holder's value * @param defaultValue The value to use when the underlying model is * <code>null</code> */ public ComponentEnabler(ValueModel booleanHolder, Collection components, boolean defaultValue) { this(); initialize(booleanHolder, components, defaultValue); } /** * Creates a new <code>ComponentEnabler</code> with a default value of * <code>false</code> (i.e. disabled). * * @param booleanHolder A value model on the underlying boolean model * @param components The collection of components whose "enabled" state is * kept in sync with the boolean holder's value */ public ComponentEnabler(ValueModel booleanHolder, Component[] components) { this(booleanHolder, CollectionTools.collection(components), false); } /** * Creates a new <code>ComponentEnabler</code>. * * @param booleanHolder A value model on the underlying boolean model * @param components The collection of components whose "enabled" state is * kept in sync with the boolean holder's value * @param defaultValue The value to use when the underlying model is * <code>null</code> */ public ComponentEnabler(ValueModel booleanHolder, Component[] components, boolean defaultValue) { this(); initialize(booleanHolder, CollectionTools.collection(components), defaultValue); } /** * Creates a new <code>ComponentEnabler</code> with a default value of * <code>false</code> (i.e. disabled). * * @param booleanHolder A value model on the underlying boolean model * @param components An iterator on the collection of components whose * "enabled" state is kept in sync with the boolean holder's value */ public ComponentEnabler(ValueModel booleanHolder, Iterator components) { this(booleanHolder, CollectionTools.collection(components), false); } /** * Creates a new <code>ComponentEnabler</code>. * * @param booleanHolder A value model on the underlying boolean model * @param components An iterator on the collection of components whose * "enabled" state is kept in sync with the boolean holder's value * @param defaultValue The value to use when the underlying model is * <code>null</code> */ public ComponentEnabler(ValueModel booleanHolder, Iterator components, boolean defaultValue) { this(); initialize(booleanHolder, CollectionTools.collection(components), defaultValue); } /** * Returns the boolean primitive of the given <code>Boolean</code> value but * also checks for <code>null</code>, if that is the case, then * {@link #defaultValue} is returned. * * @param value The <code>Boolean</code> value to be returned as a primitive * @return The primitive of the given value or {@link #defaultValue}when the * value is <code>null</code> */ protected boolean booleanValue(Boolean value) { return (value == null) ? this.defaultValue : value.booleanValue(); } /** * Creates a listener for the boolean holder. * * @return A new <code>PropertyChangeListener</code> */ protected PropertyChangeListener buildBooleanChangeListener() { return new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent e) { updateEnableState(booleanValue((Boolean) ComponentEnabler.this.booleanHolder.getValue())); } public String toString() { return "boolean change listener"; } }; } /** * Returns an <code>Iterator</code> over the collection of <code>Component</code>s. * * @return The iteration of components */ protected Iterator components() { return this.components.iterator(); } /** * Initializes this <code>ComponentEnabler</code> by building the * appropriate listeners. */ protected void initialize() { this.booleanChangeListener = buildBooleanChangeListener(); } /** * Initializes this <code>ComponentEnabler</code> with the given state. * * @param booleanHolder A value model on the underlying boolean model * @param components An iterator on the collection of components whose * "enabled" state is kept in sync with the boolean holder's value * @param defaultValue The value to use when the underlying model is * <code>null</code> */ protected void initialize(ValueModel booleanVM, Collection comps, boolean defaultVal) { if ((booleanVM == null) || (comps == null)) throw new NullPointerException(); this.components = comps; this.defaultValue = defaultVal; this.booleanHolder = booleanVM; booleanVM.addPropertyChangeListener(ValueModel.VALUE, this.booleanChangeListener); updateEnableState(booleanValue((Boolean) booleanVM.getValue())); } /** * Updates the enable state of the <code>Component</code>s that are given * by the <code>CollectionValueModel</code>. * * @param enabledState The new enable state the components need to have */ protected void updateEnableState(boolean enabled) { for (Iterator iter = components(); iter.hasNext();) { ((Component) iter.next()).setEnabled(enabled); } } }