001    // License: GPL. Copyright 2007 by Immanuel Scholz and others
002    package org.openstreetmap.josm.tools;
003    
004    import java.awt.Component;
005    import java.awt.Dimension;
006    import java.awt.GridBagConstraints;
007    import java.awt.Insets;
008    
009    import javax.swing.Box;
010    
011    /**
012     * A wrapper for GridBagConstraints which has sane default static creators and
013     * member functions to chain calling.
014     *
015     * @author imi
016     */
017    public class GBC extends GridBagConstraints {
018    
019        /**
020         * Use public static creator functions to create an GBC.
021         */
022        private GBC() {}
023    
024        /**
025         * Create a standard constraint (which is not the last).
026         * @return A standard constraint with no filling.
027         */
028        public static GBC std() {
029            GBC c = new GBC();
030            c.anchor = WEST;
031            return c;
032        }
033    
034        /**
035         * Create the constraint for the last elements on a line.
036         * @return A constraint which indicates the last item on a line.
037         */
038        public static GBC eol() {
039            GBC c = std();
040            c.gridwidth = REMAINDER;
041            return c;
042        }
043    
044        /**
045         * Create the constraint for the last elements on a line and on a paragraph.
046         * This is merely a shortcut for eol().insets(0,0,0,10)
047         * @return A constraint which indicates the last item on a line.
048         */
049        public static GBC eop() {
050            return eol().insets(0,0,0,10);
051        }
052    
053        /**
054         * Try to fill both, horizontal and vertical
055         * @return This constraint for chaining.
056         */
057        public GBC fill() {
058            return fill(BOTH);
059        }
060    
061        /**
062         * Set fill to the given value
063         * @param value The filling value, either NONE, HORIZONTAL, VERTICAL or BOTH
064         * @return This constraint for chaining.
065         */
066        public GBC fill(int value) {
067            fill = value;
068            if (value == HORIZONTAL || value == BOTH)
069                weightx = 1.0;
070            if (value == VERTICAL || value == BOTH)
071                weighty = 1.0;
072            return this;
073        }
074    
075        /**
076         * Set the anchor of this GBC to a.
077         * @param a The new anchor, e.g. GBC.CENTER or GBC.EAST.
078         * @return This constraint for chaining.
079         */
080        public GBC anchor(int a) {
081            anchor = a;
082            return this;
083        }
084    
085        /**
086         * Adds insets to this GBC.
087         * @param left      The left space of the insets
088         * @param top       The top space of the insets
089         * @param right     The right space of the insets
090         * @param bottom    The bottom space of the insets
091         * @return This constraint for chaining.
092         */
093        public GBC insets(int left, int top, int right, int bottom) {
094            insets = new Insets(top, left, bottom, right);
095            return this;
096        }
097    
098        /**
099         * Specifies how to distribute extra horizontal space.
100         * @param weightx   Weight in horizontal direction
101         * @param weighty   Weight in vertical direction
102         * @return This constraint for chaining.
103         */
104        public GBC weight(double weightx, double weighty) {
105            this.weightx = weightx;
106            this.weighty = weighty;
107            return this;
108        }
109    
110        /**
111         * This is a helper to easily create a glue with a minimum default value.
112         * @param x If higher than 0, this will be a horizontal glue with x as minimum
113         *      horizontal strut.
114         * @param y If higher than 0, this will be a vertical glue with y as minimum
115         *      vertical strut.
116         * @return the glue component
117         */
118        public static Component glue(int x, int y) {
119            short maxx = x > 0 ? Short.MAX_VALUE : 0;
120            short maxy = y > 0 ? Short.MAX_VALUE : 0;
121            return new Box.Filler(new Dimension(x,y), new Dimension(x,y), new Dimension(maxx,maxy));
122        }
123    
124        public GBC grid(int x, int y) {
125            gridx = x;
126            gridy = y;
127            return this;
128        }
129    
130        public GBC span(int width, int height) {
131            gridwidth = width;
132            gridheight = height;
133            return this;
134        }
135    
136        public GBC span(int width) {
137            gridwidth = width;
138            return this;
139        }
140    
141        public static GBC std(int x, int y) {
142            GBC c = new GBC();
143            c.anchor = WEST;
144            c.gridx = x;
145            c.gridy = y;
146            return c;
147        }
148    
149    }