Project: Clotho-Core
/*
 * Copyright (c) 2007, Romain Guy 
 * All rights reserved. 
 * 
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions 
 * are met: 
 * 
 *   * Redistributions of source code must retain the above copyright 
 *     notice, this list of conditions and the following disclaimer. 
 *   * Redistributions in binary form must reproduce the above 
 *     copyright notice, this list of conditions and the following 
 *     disclaimer in the documentation and/or other materials provided 
 *     with the distribution. 
 *   * Neither the name of the TimingFramework project nor the names of its 
 *     contributors may be used to endorse or promote products derived 
 *     from this software without specific prior written permission. 
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
 */
 
package org.clothocore.tool.pluginmanager.gui; 
 
import java.awt.Component; 
import java.awt.Container; 
import java.awt.Dimension; 
import java.awt.Insets; 
import java.awt.LayoutManager2; 
import java.awt.Rectangle; 
import java.util.LinkedList; 
import java.util.List; 
 
/**
 * 
 * @author Romain Guy <[email protected]
 */
 
public class StackLayout implements LayoutManager2 { 
    public static final String BOTTOM = "bottom"
    public static final String TOP = "top"
 
    private List<Component> components = new LinkedList<Component>(); 
 
    public void addLayoutComponent(Component comp, Object constraints) { 
        synchronized (comp.getTreeLock()) { 
            if (BOTTOM.equals(constraints)) { 
                components.add(0, comp); 
            } else if (TOP.equals(constraints)) { 
                components.add(comp); 
            } else { 
                components.add(comp); 
            } 
        } 
    } 
 
    public void addLayoutComponent(String name, Component comp) { 
        addLayoutComponent(comp, TOP); 
    } 
 
    public void removeLayoutComponent(Component comp) { 
        synchronized (comp.getTreeLock()) { 
            components.remove(comp); 
        } 
    } 
 
    public float getLayoutAlignmentX(Container target) { 
        return 0.5f
    } 
 
    public float getLayoutAlignmentY(Container target) { 
        return 0.5f
    } 
 
    public void invalidateLayout(Container target) { 
    } 
 
    public Dimension preferredLayoutSize(Container parent) { 
        synchronized (parent.getTreeLock()) { 
            int width = 0
            int height = 0
 
            for (Component comp: components) { 
                Dimension size = comp.getPreferredSize(); 
                width = Math.max(size.width, width); 
                height = Math.max(size.height, height); 
            } 
 
            Insets insets = parent.getInsets(); 
            width += insets.left + insets.right; 
            height += insets.top + insets.bottom; 
 
            return new Dimension(width, height); 
        } 
    } 
 
    public Dimension minimumLayoutSize(Container parent) { 
        synchronized (parent.getTreeLock()) { 
            int width = 0
            int height = 0
 
            for (Component comp: components) { 
                Dimension size = comp.getMinimumSize(); 
                width = Math.max(size.width, width); 
                height = Math.max(size.height, height); 
            } 
 
            Insets insets = parent.getInsets(); 
            width += insets.left + insets.right; 
            height += insets.top + insets.bottom; 
 
            return new Dimension(width, height); 
        } 
    } 
 
    public Dimension maximumLayoutSize(Container target) { 
        return new Dimension(Integer.MAX_VALUE, 
                             Integer.MAX_VALUE); 
    } 
 
    public void layoutContainer(Container parent) { 
        synchronized (parent.getTreeLock()) { 
            int width = parent.getWidth(); 
            int height = parent.getHeight(); 
 
            Rectangle bounds = new Rectangle(00, width, height); 
 
            int componentsCount = components.size(); 
            
            for (int i = 0; i < componentsCount; i++) { 
                Component comp = components.get(i); 
                comp.setBounds(bounds); 
                parent.setComponentZOrder(comp, componentsCount - i - 1); 
            } 
        } 
    } 
}