package envoy.client.data; import java.io.Serializable; import java.util.function.Consumer; import javax.swing.JComponent; /** * Encapsulates a persistent value that is directly or indirectly mutable by the user. * * @param the type of this {@link SettingsItem}'s value * @author Kai S. K. Engelbart * @since Envoy Client v0.3-alpha */ public final class SettingsItem implements Serializable { private T value; private String userFriendlyName, description; private transient Consumer changeHandler; private static final long serialVersionUID = 1L; /** * Initializes a {@link SettingsItem}. The default value's class will be mapped to a * {@link JComponent} that can be used to display this {@link SettingsItem} to the user. * * @param value the default value * @param userFriendlyName the user friendly name (short) * @param description the description (long) * @since Envoy Client v0.3-alpha */ public SettingsItem(T value, String userFriendlyName, String description) { this.value = value; this.userFriendlyName = userFriendlyName; this.description = description; } /** * @return the value * @since Envoy Client v0.3-alpha */ public T get() { return value; } /** * Changes the value of this {@link SettingsItem}. If a {@code ChangeHandler} if defined, it * will be invoked with this value. * * @param value the value to set * @since Envoy Client v0.3-alpha */ public void set(T value) { if (changeHandler != null && value != this.value) changeHandler.accept(value); this.value = value; } /** * @return the userFriendlyName * @since Envoy Client v0.3-alpha */ public String getUserFriendlyName() { return userFriendlyName; } /** * @param userFriendlyName the userFriendlyName to set * @since Envoy Client v0.3-alpha */ public void setUserFriendlyName(String userFriendlyName) { this.userFriendlyName = userFriendlyName; } /** * @return the description * @since Envoy Client v0.3-alpha */ public String getDescription() { return description; } /** * @param description the description to set * @since Envoy Client v0.3-alpha */ public void setDescription(String description) { this.description = description; } /** * Sets a {@code ChangeHandler} for this {@link SettingsItem}. It will be invoked with the * current value once during the registration and every time when the value changes. * * @param changeHandler the changeHandler to set * @since Envoy Client v0.3-alpha */ public void setChangeHandler(Consumer changeHandler) { this.changeHandler = changeHandler; changeHandler.accept(value); } }