com.vaadin.ui.HasComponents Maven / Gradle / Ivy
/*
* Copyright (C) 2000-2024 Vaadin Ltd
*
* This program is available under Vaadin Commercial License and Service Terms.
*
* See for the full
* license.
*/
package com.vaadin.ui;
import java.io.Serializable;
import java.lang.reflect.Method;
import java.util.Iterator;
import com.vaadin.event.SerializableEventListener;
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 {
/**
* Gets an iterator to the collection of contained components. Using this
* iterator it is possible to step through all components contained in this
* container.
*
* The iterator is typically unmodifiable, and calls to
* {@link Iterator#remove()} throw an exception.
*
* @return the component iterator.
*/
@Override
public Iterator 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 SerializableEventListener {
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 SerializableEventListener {
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;
}
}
}