001: /*
002: * Copyright (c) 2004 JETA Software, Inc. All rights reserved.
003: *
004: * Redistribution and use in source and binary forms, with or without modification,
005: * are permitted provided that the following conditions are met:
006: *
007: * o Redistributions of source code must retain the above copyright notice,
008: * this list of conditions and the following disclaimer.
009: *
010: * o Redistributions in binary form must reproduce the above copyright notice,
011: * this list of conditions and the following disclaimer in the documentation
012: * and/or other materials provided with the distribution.
013: *
014: * o Neither the name of JETA Software nor the names of its contributors may
015: * be used to endorse or promote products derived from this software without
016: * specific prior written permission.
017: *
018: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
019: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
020: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
021: * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
022: * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
023: * INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
024: * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
025: * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
026: * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
027: * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
028: */
029:
030: package com.jeta.open.support;
031:
032: import java.awt.Component;
033: import java.util.Collection;
034: import java.util.Iterator;
035: import java.util.LinkedList;
036:
037: /**
038: * A component finder that is composed of multipe component finders. This is
039: * very useful for Frames that contain multiple containers with components that
040: * have the same command. For example, you might have a menu item, toolbar
041: * button, and popup menu item that have the same cut, copy, and paste commands.
042: * These commands should route to the same action listener in the controller. To
043: * handle this case, use a CompositeComponentFinder which is composed of a
044: * finder for the menu, toolbar, and popup. You can then define your Frame as a
045: * JETAContainer and delegate the most of the JETAContainer methods to this
046: * finder.
047: *
048: * @author Jeff Tassin
049: */
050: public class CompositeComponentFinder implements ComponentFinder {
051: /**
052: * A list of ComponentFinder objects.
053: */
054: private LinkedList m_finders = new LinkedList();
055:
056: /**
057: * Constructor
058: */
059: public CompositeComponentFinder() {
060:
061: }
062:
063: /**
064: * Constructor
065: */
066: public CompositeComponentFinder(ComponentFinder finder) {
067: add(finder);
068: }
069:
070: /**
071: * Adds a finder to this composite.
072: */
073: public void add(ComponentFinder finder) {
074: m_finders.add(finder);
075: }
076:
077: /**
078: * Enables/Disables the component associated with the commandid
079: *
080: * @param commandId
081: * the id of the command whose button to enable/disable
082: * @param bEnable
083: * true/false to enable/disable
084: */
085: public void enableComponent(String commandId, boolean bEnable) {
086: Iterator iter = m_finders.iterator();
087: while (iter.hasNext()) {
088: ComponentFinder finder = (ComponentFinder) iter.next();
089: Component comp = finder.getComponentByName(commandId);
090: if (comp != null) {
091: comp.setEnabled(bEnable);
092: }
093: }
094: }
095:
096: /**
097: * Since we have multiple finders, the only approach we can take is to
098: * return the first component found.
099: */
100: public Component getComponentByName(String compName) {
101: Iterator iter = m_finders.iterator();
102: while (iter.hasNext()) {
103: ComponentFinder finder = (ComponentFinder) iter.next();
104: Component comp = finder.getComponentByName(compName);
105: if (comp != null)
106: return comp;
107: }
108: return null;
109: }
110:
111: /**
112: * Recursively searches an associated parent container for all components
113: * with the given name. An empty collection is returned if no components are
114: * found with the given name.
115: */
116: public Collection getComponentsByName(String compName) {
117: LinkedList list = new LinkedList();
118: Iterator iter = m_finders.iterator();
119: while (iter.hasNext()) {
120: ComponentFinder finder = (ComponentFinder) iter.next();
121: list.addAll(finder.getComponentsByName(compName));
122: }
123: return list;
124: }
125:
126: /**
127: * Return a collection of ComponentFinder instances that are contained by
128: * this composite.
129: *
130: * @return the collection of ComponentFinder instances owned by this
131: * composite.
132: */
133: public Collection getFinders() {
134: return m_finders;
135: }
136:
137: /**
138: * Tells the implementation that any cached components should be flushed and
139: * reloaded because the parent container might have changed.
140: */
141: public void reset() {
142: Iterator iter = m_finders.iterator();
143: while (iter.hasNext()) {
144: ComponentFinder finder = (ComponentFinder) iter.next();
145: finder.reset();
146: }
147: }
148:
149: /**
150: * Shows/Hides the component associated with the commandid
151: *
152: * @param commandId
153: * the id of the command whose button to enable/disable
154: * @param bVisible
155: * show/hide the component/disable
156: */
157: public void setVisible(String commandId, boolean bVisible) {
158: Iterator iter = m_finders.iterator();
159: while (iter.hasNext()) {
160: ComponentFinder finder = (ComponentFinder) iter.next();
161: Component comp = finder.getComponentByName(commandId);
162: if (comp != null)
163: comp.setVisible(bVisible);
164: }
165: }
166:
167: /**
168: * Recursively searches an associated parent container for all components
169: * that are named. An empty collection is returned if no names components
170: * exist.
171: *
172: * @return a collection of all named Component objects.
173: */
174: public Collection getAllNamedComponents() {
175: LinkedList list = new LinkedList();
176: Iterator iter = m_finders.iterator();
177: while (iter.hasNext()) {
178: ComponentFinder finder = (ComponentFinder) iter.next();
179: list.addAll(finder.getAllNamedComponents());
180: }
181: return list;
182: }
183: }
|