001 package org.springframework.richclient.command;
002
003 import org.springframework.richclient.command.config.CommandButtonConfigurer;
004 import org.springframework.richclient.util.Assert;
005
006 import javax.swing.AbstractButton;
007
008 import java.util.Iterator;
009 import java.util.List;
010 import java.awt.Component;
011 import java.awt.Container;
012
013 /**
014 * A implementation of the {@link GroupMember} interface that can be associated
015 * with instances of {@link Component}s.
016 *
017 * @author Nils Olsson
018 */
019 public class ComponentGroupMember extends GroupMember {
020
021 private Component component;
022
023 /**
024 * Creates a new {@code ComponentGroupMember}.
025 * @param component The component that this group member represents.
026 */
027 public ComponentGroupMember(Component component) {
028 Assert.required(component, "component");
029 this.component = component;
030 }
031
032 /**
033 * Forwards the enabled flag to the managed component.
034 * @param enabled The enabled flag.
035 */
036 public void setEnabled(boolean enabled) {
037 component.setEnabled(enabled);
038 }
039
040 /**
041 * Searches through the component and nested components in order to see if
042 * the command with supplied id exists in this component.
043 *
044 * @param commandId The id of the command to be checked for. May be null.
045 * @return true if the component, or any of its nested components, is a
046 * command with the given command id.
047 */
048 public boolean managesCommand(String commandId) {
049 if (null != commandId) {
050 return managesCommand(component, commandId);
051 }
052 else {
053 return false;
054 }
055 }
056
057 /**
058 * Searches through the component and nested components in order to see if
059 * the command with supplied id exists in this component.
060 *
061 * @param component The component that should be searched.
062 * @param commandId The id of the command to be checked for.
063 * @return true if the component, or any of its nested components, is a
064 * command with the given command id.
065 */
066 private boolean managesCommand(Component component, String commandId) {
067 if (component instanceof AbstractButton) {
068 AbstractButton button = (AbstractButton) component;
069 if (null != button.getActionCommand()) {
070 if (button.getActionCommand().equals(commandId)) {
071 return true;
072 }
073 }
074 }
075 else if (component instanceof Container) {
076 Component[] subComponents = ((Container) component).getComponents();
077 for (int i = 0; i < subComponents.length; ++i) {
078 if (managesCommand(subComponents[i], commandId)) {
079 return true;
080 }
081 }
082 }
083 return false;
084 }
085
086 /**
087 * Asks the given container populator to add a component to its underlying
088 * container.
089 */
090 protected void fill(GroupContainerPopulator containerPopulator, Object controlFactory,
091 CommandButtonConfigurer buttonConfigurer, List previousButtons) {
092 Assert.required(containerPopulator, "containerPopulator");
093 containerPopulator.add(component);
094 }
095 }