/* * Copyright 2000-2016 Vaadin Ltd. * * 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. */ package com.vaadin.ui; import java.io.Serializable; import java.lang.reflect.Method; import java.util.Iterator; import com.vaadin.shared.Registration; import com.vaadin.util.ReflectTools; /** * Interface that must be implemented by all {@link Component}s that contain * other {@link Component}s. * * @author Vaadin Ltd * @since 7.0.0 * */ public interface HasComponents extends Component, Iterable<Component> { /** * Gets an iterator to the collection of contained components. Using this * iterator it is possible to step through all components contained in this * container. * * @return the component iterator. */ @Override public Iterator<Component> iterator(); /** * Interface for {@link HasComponents} implementations that support sending * attach and detach events for components. * * @since 7.0 */ public interface ComponentAttachDetachNotifier extends Serializable { /** * Listens the component attach events. * * @see Registration * * @param listener * the listener to add, not null * @return a registration object for removing the listener * @since 8.0 */ public Registration addComponentAttachListener( ComponentAttachListener listener); /** * Stops the listening component attach events. * * @param listener * the listener to removed. * * @deprecated As of 8.0, replaced by {@link Registration#remove()} in * the registration object returned from * {@link #addComponentAttachListener(ComponentAttachListener)} * . * @since 8.0 */ @Deprecated public void removeComponentAttachListener( ComponentAttachListener listener); /** * Listens the component detach events. */ public Registration addComponentDetachListener( ComponentDetachListener listener); /** * Stops the listening component detach events. */ @Deprecated public void removeComponentDetachListener( ComponentDetachListener listener); } /** * Component attach listener interface. */ @FunctionalInterface public interface ComponentAttachListener extends Serializable { public static final Method attachMethod = ReflectTools.findMethod( ComponentAttachListener.class, "componentAttachedToContainer", ComponentAttachEvent.class); /** * A new component is attached to container. * * @param event * the component attach event. */ public void componentAttachedToContainer(ComponentAttachEvent event); } /** * Component detach listener interface. */ @FunctionalInterface public interface ComponentDetachListener extends Serializable { public static final Method detachMethod = ReflectTools.findMethod( ComponentDetachListener.class, "componentDetachedFromContainer", ComponentDetachEvent.class); /** * A component has been detached from container. * * @param event * the component detach event. */ public void componentDetachedFromContainer(ComponentDetachEvent event); } /** * Component attach event sent when a component is attached to container. */ @SuppressWarnings("serial") public static class ComponentAttachEvent extends Component.Event { private final Component component; /** * Creates a new attach event. * * @param container * the container the component has been detached to. * @param attachedComponent * the component that has been attached. */ public ComponentAttachEvent(HasComponents container, Component attachedComponent) { super(container); component = attachedComponent; } /** * Gets the component container. * */ public HasComponents getContainer() { return (HasComponents) getSource(); } /** * Gets the attached component. * */ public Component getAttachedComponent() { return component; } } /** * Component detach event sent when a component is detached from container. */ @SuppressWarnings("serial") public static class ComponentDetachEvent extends Component.Event { private final Component component; /** * Creates a new detach event. * * @param container * the container the component has been detached from. * @param detachedComponent * the component that has been detached. */ public ComponentDetachEvent(HasComponents container, Component detachedComponent) { super(container); component = detachedComponent; } /** * Gets the component container. * */ public HasComponents getContainer() { return (HasComponents) getSource(); } /** * Gets the detached component. * * @return the detached component. */ public Component getDetachedComponent() { return component; } } }