001    /**
002     * 
003     */
004    package nl.cwi.sen1.util;
005    
006    import java.awt.Component;
007    import java.awt.Container;
008    import java.awt.Dimension;
009    import java.awt.Insets;
010    import java.awt.LayoutManager2;
011    import java.util.HashMap;
012    import java.util.Map;
013    
014    public class StudioStatusBarLayout implements LayoutManager2 {
015        private Map<Component, StudioStatusBarConstraints> constraints = new HashMap<Component, StudioStatusBarConstraints>();
016    
017        public void addLayoutComponent(String name, Component comp) {
018            addLayoutComponent(comp, null);
019        }
020    
021        public void addLayoutComponent(Component comp, Object constraint) {
022            constraints.put(comp, (StudioStatusBarConstraints) constraint);
023        }
024    
025        public void removeLayoutComponent(Component comp) {
026            constraints.remove(comp);
027        }
028    
029        public Dimension preferredLayoutSize(Container parent) {
030            Dimension dim = new Dimension();
031            for (Component comp : constraints.keySet()) {
032                Dimension d = comp.getPreferredSize();
033                StudioStatusBarConstraints c = constraints.get(comp);
034                if (c != null) {
035                    Insets i = c.getInsets();
036                    d.width += i.left + i.right;
037                    d.height += i.top + i.bottom;
038                }
039                dim.height = Math.max(dim.height, d.height);
040                dim.width += d.width;
041            }
042    
043            Insets insets = parent.getInsets();
044            dim.width += insets.left + insets.right;
045            dim.height += insets.top + insets.bottom;
046    
047            return dim;
048        }
049    
050        public Dimension minimumLayoutSize(Container parent) {
051            return preferredLayoutSize(parent);
052        }
053    
054        public Dimension maximumLayoutSize(Container target) {
055            return new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE);
056        }
057    
058        public float getLayoutAlignmentX(Container target) {
059            return 0.5f;
060        }
061    
062        public float getLayoutAlignmentY(Container target) {
063            return 0.5f;
064        }
065    
066        public void invalidateLayout(Container target) {
067        }
068    
069        public void layoutContainer(Container parent) {
070            double maxWeight = 0.0;
071            for (Component comp : parent.getComponents()) {
072                if (comp.isVisible()) {
073                    StudioStatusBarConstraints c = constraints.get(comp);
074                    if (c != null) {
075                        maxWeight += c.getWeight();
076                    }
077                }
078            }
079            if (maxWeight == 0) {
080                maxWeight = 1.0;
081            }
082    
083            Insets parentInsets = parent.getInsets();
084            int availableWidth = parent.getWidth()
085                    - preferredLayoutSize(parent).width;
086            int nextX = parentInsets.left;
087            int height = parent.getHeight() - parentInsets.top
088                    - parentInsets.bottom;
089    
090            for (Component comp : parent.getComponents()) {
091                if (comp.isVisible()) {
092                    StudioStatusBarConstraints c = constraints.get(comp);
093                    double weight = 0.0;
094                    Insets insets = new Insets(0, 0, 0, 0);
095                    if (c != null) {
096                        weight = c.getWeight();
097                        insets = c.getInsets();
098                    }
099                    
100                    int weightedWidth = 0;
101                    if (availableWidth > 0) {
102                        weightedWidth = (int) ((weight/maxWeight) * availableWidth);
103                    }
104                    availableWidth -= weightedWidth;
105    
106                    int width = comp.getPreferredSize().width + weightedWidth;
107    
108                    int x = nextX + insets.left;
109                    int y = parentInsets.top + insets.top;
110                    comp.setSize(width, height);
111                    comp.setLocation(x, y);
112                    nextX = x + width + insets.right;
113                }
114            }
115        }
116    }