001    /*
002     * Created on Dec 22, 2007
003     * 
004     * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
005     * the License. You may obtain a copy of the License at
006     * 
007     * http://www.apache.org/licenses/LICENSE-2.0
008     * 
009     * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
010     * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
011     * specific language governing permissions and limitations under the License.
012     * 
013     * Copyright @2007-2010 the original author or authors.
014     */
015    package org.fest.swing.hierarchy;
016    
017    import static javax.swing.SwingUtilities.isDescendingFrom;
018    
019    import java.awt.*;
020    import java.util.*;
021    import java.util.List;
022    
023    /**
024     * Understands a component hierarchy created with a specified <code>{@link Component}</code> as root.
025     * 
026     * @author Alex Ruiz
027     */
028    public final class SingleComponentHierarchy implements ComponentHierarchy {
029    
030      private final Container root;
031      private final List<Container> list = new ArrayList<Container>();
032      private final ComponentHierarchy hierarchy;
033    
034      /**
035       * Creates a new </code>{@link SingleComponentHierarchy}</code>.
036       * @param root the root component for this hierarchy
037       * @param hierarchy the base component hierarchy.
038       */
039      public SingleComponentHierarchy(Container root, ComponentHierarchy hierarchy) {
040        this.root = root;
041        this.hierarchy = hierarchy;
042        list.add(root);
043      }
044    
045      /**
046       * Returns the root component in this hierarchy.
047       * @return the root component in this hierarchy.
048       */
049      public Container root() { return root; }
050      
051      /** 
052       * Returns the parent component for the given <code>{@link Component}</code>.
053       * @param c the given <code>Component</code>.
054       * @return the parent component for the given <code>{@link Component}</code>.  
055       */
056      public Container parentOf(Component c) {
057        return hierarchy.parentOf(c);
058      }
059    
060      /**
061       * Returns a collection containing only the root <code>{@link Component}</code> in this hierarchy.
062       * @return a collection containing only the root <code>{@link Component}</code> in this hierarchy.
063       */
064      public Collection<? extends Container> roots() {
065        return list;
066      }
067    
068      /**
069       * Returns all sub-components of the given <code>{@link Component}</code>.
070       * @return all sub-components of the given <code>{@link Component}</code>.
071       */
072      public Collection<Component> childrenOf(Component c) {
073        return hierarchy.childrenOf(c);
074      }
075    
076      /** 
077       * Returns whether the hierarchy contains the given <code>{@link Component}</code>. 
078       * @return whether the hierarchy contains the given <code>{@link Component}</code>. 
079       */
080      public boolean contains(Component c) {
081        return hierarchy.contains(c) && isDescendingFrom(c, root);
082      }
083    
084      /**
085       * Provides proper disposal of the given <code>{@link Window}</code>, appropriate to this hierarchy. After disposal, 
086       * the <code>{@link Window}</code> and its descendants will no longer be reachable from this hierarchy.
087       * @param w the window to dispose.
088       */
089      public void dispose(Window w) {
090        hierarchy.dispose(w);
091      }
092    }