Mutable.java
- /*
- * *************************************************************************************************************************************************************
- *
- * SteelBlue: DCI User Interfaces
- * http://tidalwave.it/projects/steelblue
- *
- * Copyright (C) 2015 - 2025 by Tidalwave s.a.s. (http://tidalwave.it)
- *
- * *************************************************************************************************************************************************************
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
- * CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
- *
- * *************************************************************************************************************************************************************
- *
- * git clone https://bitbucket.org/tidalwave/steelblue-src
- * git clone https://github.com/tidalwave-it/steelblue-src
- *
- * *************************************************************************************************************************************************************
- */
- package it.tidalwave.ui.core;
- import jakarta.annotation.Nonnull;
- import java.beans.PropertyChangeListener;
- import org.apiguardian.api.API;
- import static org.apiguardian.api.API.Status.EXPERIMENTAL;
- /***************************************************************************************************************************************************************
- *
- * An interface that describes the capability of mutate status and of supporting listeners. Both old-style {@link PropertyChangeListener} and a new
- * experimental {@link MutableListener}s are supported. The three different methods {@link #addListener1(MutableListener1)},
- * {@link #addListener2(MutableListener2)} and {@link #addListener(MutableListener)} allow shorter syntaxes when only one or two parameters
- * of the callback are needed, that is:
- *
- * <pre>
- * {@code
- * mutable.addMutableListener1(newValue -> consumer1.accept(newValue));
- * mutable.addMutableListener2((oldValue, newValue) -> consumer2.accept(oldValue, newValue));
- * mutable.addMutableListener((source, oldValue, newValue) -> consumer3.accept(source, oldValue, newValue));
- * }
- * </pre>
- *
- * @see MutableListener
- * @see MutableListener1
- * @see MutableListener2
- * @since 2.0-ALPHA-2
- * @author Fabrizio Giudici
- *
- **************************************************************************************************************************************************************/
- @API(status = EXPERIMENTAL)
- public interface Mutable
- {
- /***********************************************************************************************************************************************************
- * Registers a {@link PropertyChangeListener}.
- * @param listener the listener
- **********************************************************************************************************************************************************/
- public void addPropertyChangeListener (@Nonnull PropertyChangeListener listener);
- /***********************************************************************************************************************************************************
- * Registers a {@link PropertyChangeListener} for the given property.
- * @param propertyName the name of the property
- * @param listener the listener
- **********************************************************************************************************************************************************/
- public void addPropertyChangeListener (@Nonnull String propertyName, @Nonnull PropertyChangeListener listener);
- /***********************************************************************************************************************************************************
- * Unregisters a {@link PropertyChangeListener}.
- * @param listener the listener
- **********************************************************************************************************************************************************/
- public void removePropertyChangeListener (@Nonnull PropertyChangeListener listener);
- /***********************************************************************************************************************************************************
- * Removes a {@link PropertyChangeListener} for the given property.
- * @param propertyName the name of the property
- * @param listener the listener
- **********************************************************************************************************************************************************/
- public void removePropertyChangeListener (@Nonnull String propertyName, @Nonnull PropertyChangeListener listener);
- /***********************************************************************************************************************************************************
- * Returns all the bound {@link PropertyChangeListener}s.
- * @return the listeners
- **********************************************************************************************************************************************************/
- @Nonnull
- public PropertyChangeListener[] getPropertyChangeListeners();
- /***********************************************************************************************************************************************************
- * Returns the bound {@link PropertyChangeListener}s for the given property.
- * @param propertyName the name of the property
- * @return the listeners
- **********************************************************************************************************************************************************/
- @Nonnull
- public PropertyChangeListener[] getPropertyChangeListeners (@Nonnull String propertyName);
- /***********************************************************************************************************************************************************
- * Checks whether the given property has been bound to listeners.
- * @param propertyName the name of the property
- * @return {@code true} if the property is bound
- **********************************************************************************************************************************************************/
- public boolean hasListeners (@Nonnull String propertyName);
- /***********************************************************************************************************************************************************
- * Registers a {@link MutableListener}.
- * @param <T> the type of the listener
- * @param listener the listener
- **********************************************************************************************************************************************************/
- public <T> void addListener (@Nonnull final MutableListener<T> listener);
- /***********************************************************************************************************************************************************
- * Registers a {@link MutableListener}. This method is needed to allow the compiler to infer the correct type of lambdas.
- * @param <T> the type of the listener
- * @param listener the listener
- **********************************************************************************************************************************************************/
- public default <T> void addListener1 (@Nonnull final MutableListener1<T> listener)
- {
- addListener(listener);
- }
- /***********************************************************************************************************************************************************
- * Registers a {@link MutableListener}. This method is needed to allow the compiler to infer the correct type of lambdas.
- * @param <T> the type of the listener
- * @param listener the listener
- **********************************************************************************************************************************************************/
- public default <T> void addListener2 (@Nonnull final MutableListener2<T> listener)
- {
- addListener(listener);
- }
- /***********************************************************************************************************************************************************
- * Unregisters a {@link MutableListener}.
- * @param <T> the type of the listener
- * @param listener the listener
- **********************************************************************************************************************************************************/
- public <T> void removeListener (@Nonnull final MutableListener<T> listener);
- }