diff options
Diffstat (limited to 'src/com/itmill/toolkit/ui/AbstractComponentContainer.java')
-rw-r--r-- | src/com/itmill/toolkit/ui/AbstractComponentContainer.java | 189 |
1 files changed, 189 insertions, 0 deletions
diff --git a/src/com/itmill/toolkit/ui/AbstractComponentContainer.java b/src/com/itmill/toolkit/ui/AbstractComponentContainer.java new file mode 100644 index 0000000000..e7b142f828 --- /dev/null +++ b/src/com/itmill/toolkit/ui/AbstractComponentContainer.java @@ -0,0 +1,189 @@ +/* ************************************************************************* + + IT Mill Toolkit + + Development of Browser User Intarfaces Made Easy + + Copyright (C) 2000-2006 IT Mill Ltd + + ************************************************************************* + + This product is distributed under commercial license that can be found + from the product package on license/license.txt. Use of this product might + require purchasing a commercial license from IT Mill Ltd. For guidelines + on usage, see license/licensing-guidelines.html + + ************************************************************************* + + For more information, contact: + + IT Mill Ltd phone: +358 2 4802 7180 + Ruukinkatu 2-4 fax: +358 2 4802 7181 + 20540, Turku email: info@itmill.com + Finland company www: www.itmill.com + + Primary source for information and releases: www.itmill.com + + ********************************************************************** */ + +package com.itmill.toolkit.ui; + +import java.lang.reflect.Method; +import java.util.LinkedList; +import java.util.Iterator; + +/** Extension to {@link AbstractComponent} that defines the default + * implementation for the methods in {@link ComponentContainer}. Basic UI + * components that need to contain other components inherit this class to + * easily qualify as a MillStone component container. + * + * @author IT Mill Ltd + * @version @VERSION@ + * @since 3.0 + */ +public abstract class AbstractComponentContainer +extends AbstractComponent implements ComponentContainer { + + /** Constructs a new component container. */ + public AbstractComponentContainer() { + super(); + } + + /** Removes all components from the container. This should probably be + * reimplemented in extending classes for a more powerfu + * implementation. + */ + public void removeAllComponents() { + LinkedList l = new LinkedList(); + + // Add all components + for (Iterator i = getComponentIterator(); i.hasNext();) + l.add(i.next()); + + // Remove all component + for (Iterator i = l.iterator(); i.hasNext();) + removeComponent((Component)i.next()); + } + + /* Moves all components from an another container into this container. + * Don't add a JavaDoc comment here, we use the default documentation + * from implemented interface. + */ + public void moveComponentsFrom(ComponentContainer source) { + LinkedList components = new LinkedList(); + for (Iterator i = source.getComponentIterator(); i.hasNext();) + components.add(i.next()); + + for (Iterator i = components.iterator(); i.hasNext();) { + Component c = (Component) i.next(); + source.removeComponent(c); + addComponent(c); + } + } + + /** Notifies all contained components that the container is attached to + * a window. + * + * @see com.itmill.toolkit.ui.Component#attach() + */ + public void attach() { + super.attach(); + + for (Iterator i = getComponentIterator(); i.hasNext();) + ((Component)i.next()).attach(); + } + + /** Notifies all contained components that the container is detached + * from a window. + * + * @see com.itmill.toolkit.ui.Component#detach() + */ + public void detach() { + super.detach(); + + for (Iterator i = getComponentIterator(); i.hasNext();) + ((Component)i.next()).detach(); + } + + + /* Events ************************************************************ */ + + private static final Method COMPONENT_ATTACHED_METHOD; + private static final Method COMPONENT_DETACHED_METHOD; + + static { + try { + COMPONENT_ATTACHED_METHOD = + ComponentAttachListener.class.getDeclaredMethod( + "componentAttachedToContainer", + new Class[] { ComponentAttachEvent.class }); + COMPONENT_DETACHED_METHOD = + ComponentDetachListener.class.getDeclaredMethod( + "componentDetachedFromContainer", + new Class[] { ComponentDetachEvent.class }); + } catch (java.lang.NoSuchMethodException e) { + // This should never happen + throw new java.lang.RuntimeException(); + } + } + + /* documented in interface */ + public void addListener(ComponentAttachListener listener) { + addListener(ComponentContainer.ComponentAttachEvent.class, listener, COMPONENT_ATTACHED_METHOD); + } + + /* documented in interface */ + public void addListener(ComponentDetachListener listener) { + addListener(ComponentContainer.ComponentDetachEvent.class, listener, COMPONENT_DETACHED_METHOD); + } + + /* documented in interface */ + public void removeListener(ComponentAttachListener listener) { + removeListener(ComponentContainer.ComponentAttachEvent.class, listener, COMPONENT_ATTACHED_METHOD); + } + + /* documented in interface */ + public void removeListener(ComponentDetachListener listener) { + removeListener(ComponentContainer.ComponentDetachEvent.class, listener, COMPONENT_DETACHED_METHOD); + } + + /** Fire component attached event. This should be called by the addComponent + * methods after the component have been added to this container. + * @param component The component that has been added to this container. + */ + protected void fireComponentAttachEvent(Component component) { + fireEvent(new ComponentAttachEvent(this,component)); + } + + /** Fire component detached event. This should be called by the removeComponent + * methods after the component have been removed from this container. + * @param component The component that has been removed from this container. + */ + protected void fireComponentDetachEvent(Component component) { + fireEvent(new ComponentAttachEvent(this,component)); + } + + /** This only implements the events and component parent calls. The extending + * classes must implement component list maintenance and call this method + * after component list maintenance. + * @see com.itmill.toolkit.ui.ComponentContainer#addComponent(Component) + */ + public void addComponent(Component c) { + c.setParent(this); + if (getApplication() != null) + c.attach(); + fireComponentAttachEvent(c); + } + + /** This only implements the events and component parent calls. The extending + * classes must implement component list maintenance and call this method + * before component list maintenance. + * @see com.itmill.toolkit.ui.ComponentContainer#removeComponent(Component) + */ + public void removeComponent(Component c) { + if (getApplication() != null) + c.detach(); + c.setParent(null); + fireComponentDetachEvent(c); + } +} |