001: /* *************************************************************************
002:
003: Millstone(TM)
004: Open Sourced User Interface Library for
005: Internet Development with Java
006:
007: Millstone is a registered trademark of IT Mill Ltd
008: Copyright (C) 2000-2005 IT Mill Ltd
009:
010: *************************************************************************
011:
012: This library is free software; you can redistribute it and/or
013: modify it under the terms of the GNU Lesser General Public
014: license version 2.1 as published by the Free Software Foundation.
015:
016: This library is distributed in the hope that it will be useful,
017: but WITHOUT ANY WARRANTY; without even the implied warranty of
018: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
019: Lesser General Public License for more details.
020:
021: You should have received a copy of the GNU Lesser General Public
022: License along with this library; if not, write to the Free Software
023: Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
024:
025: *************************************************************************
026:
027: For more information, contact:
028:
029: IT Mill Ltd phone: +358 2 4802 7180
030: Ruukinkatu 2-4 fax: +358 2 4802 7181
031: 20540, Turku email: info@itmill.com
032: Finland company www: www.itmill.com
033:
034: Primary source for MillStone information and releases: www.millstone.org
035:
036: ********************************************************************** */
037:
038: package org.millstone.base.ui;
039:
040: import java.lang.reflect.Method;
041: import java.util.LinkedList;
042: import java.util.Iterator;
043:
044: /** Extension to {@link AbstractComponent} that defines the default
045: * implementation for the methods in {@link ComponentContainer}. Basic UI
046: * components that need to contain other components inherit this class to
047: * easily qualify as a MillStone component container.
048: *
049: * @author IT Mill Ltd
050: * @version 3.1.1
051: * @since 3.0
052: */
053: public abstract class AbstractComponentContainer extends
054: AbstractComponent implements ComponentContainer {
055:
056: /** Constructs a new component container. */
057: public AbstractComponentContainer() {
058: super ();
059: }
060:
061: /** Removes all components from the container. This should probably be
062: * reimplemented in extending classes for a more powerfu
063: * implementation.
064: */
065: public void removeAllComponents() {
066: LinkedList l = new LinkedList();
067:
068: // Add all components
069: for (Iterator i = getComponentIterator(); i.hasNext();)
070: l.add(i.next());
071:
072: // Remove all component
073: for (Iterator i = l.iterator(); i.hasNext();)
074: removeComponent((Component) i.next());
075: }
076:
077: /* Moves all components from an another container into this container.
078: * Don't add a JavaDoc comment here, we use the default documentation
079: * from implemented interface.
080: */
081: public void moveComponentsFrom(ComponentContainer source) {
082: LinkedList components = new LinkedList();
083: for (Iterator i = source.getComponentIterator(); i.hasNext();)
084: components.add(i.next());
085:
086: for (Iterator i = components.iterator(); i.hasNext();) {
087: Component c = (Component) i.next();
088: source.removeComponent(c);
089: addComponent(c);
090: }
091: }
092:
093: /** Notifies all contained components that the container is attached to
094: * a window.
095: *
096: * @see org.millstone.base.ui.Component#attach()
097: */
098: public void attach() {
099: super .attach();
100:
101: for (Iterator i = getComponentIterator(); i.hasNext();)
102: ((Component) i.next()).attach();
103: }
104:
105: /** Notifies all contained components that the container is detached
106: * from a window.
107: *
108: * @see org.millstone.base.ui.Component#detach()
109: */
110: public void detach() {
111: super .detach();
112:
113: for (Iterator i = getComponentIterator(); i.hasNext();)
114: ((Component) i.next()).detach();
115: }
116:
117: /* Events ************************************************************ */
118:
119: private static final Method COMPONENT_ATTACHED_METHOD;
120: private static final Method COMPONENT_DETACHED_METHOD;
121:
122: static {
123: try {
124: COMPONENT_ATTACHED_METHOD = ComponentAttachListener.class
125: .getDeclaredMethod("componentAttachedToContainer",
126: new Class[] { ComponentAttachEvent.class });
127: COMPONENT_DETACHED_METHOD = ComponentDetachListener.class
128: .getDeclaredMethod(
129: "componentDetachedFromContainer",
130: new Class[] { ComponentDetachEvent.class });
131: } catch (java.lang.NoSuchMethodException e) {
132: // This should never happen
133: throw new java.lang.RuntimeException();
134: }
135: }
136:
137: /* documented in interface */
138: public void addListener(ComponentAttachListener listener) {
139: addListener(ComponentContainer.ComponentAttachEvent.class,
140: listener, COMPONENT_ATTACHED_METHOD);
141: }
142:
143: /* documented in interface */
144: public void addListener(ComponentDetachListener listener) {
145: addListener(ComponentContainer.ComponentDetachEvent.class,
146: listener, COMPONENT_DETACHED_METHOD);
147: }
148:
149: /* documented in interface */
150: public void removeListener(ComponentAttachListener listener) {
151: removeListener(ComponentContainer.ComponentAttachEvent.class,
152: listener, COMPONENT_ATTACHED_METHOD);
153: }
154:
155: /* documented in interface */
156: public void removeListener(ComponentDetachListener listener) {
157: removeListener(ComponentContainer.ComponentDetachEvent.class,
158: listener, COMPONENT_DETACHED_METHOD);
159: }
160:
161: /** Fire component attached event. This should be called by the addComponent
162: * methods after the component have been added to this container.
163: * @param component The component that has been added to this container.
164: */
165: protected void fireComponentAttachEvent(Component component) {
166: fireEvent(new ComponentAttachEvent(this , component));
167: }
168:
169: /** Fire component detached event. This should be called by the removeComponent
170: * methods after the component have been removed from this container.
171: * @param component The component that has been removed from this container.
172: */
173: protected void fireComponentDetachEvent(Component component) {
174: fireEvent(new ComponentAttachEvent(this , component));
175: }
176:
177: /** This only implements the events and component parent calls. The extending
178: * classes must implement component list maintenance and call this method
179: * after component list maintenance.
180: * @see org.millstone.base.ui.ComponentContainer#addComponent(Component)
181: */
182: public void addComponent(Component c) {
183: c.setParent(this );
184: if (getApplication() != null)
185: c.attach();
186: fireComponentAttachEvent(c);
187: }
188:
189: /** This only implements the events and component parent calls. The extending
190: * classes must implement component list maintenance and call this method
191: * before component list maintenance.
192: * @see org.millstone.base.ui.ComponentContainer#removeComponent(Component)
193: */
194: public void removeComponent(Component c) {
195: if (getApplication() != null)
196: c.detach();
197: c.setParent(null);
198: fireComponentDetachEvent(c);
199: }
200: }
|