+package tim.prune.gui;
+
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.Insets;
+
+import javax.swing.JComponent;
+import javax.swing.JPanel;
+
+/**
+ * Class to make it easier to use GridBagLayout for a non-equal-width layout
+ * Default is two columns but can handle more
+ */
+public class GuiGridLayout
+{
+ private GridBagLayout _layout = null;
+ private GridBagConstraints _constraints = null;
+ private JPanel _panel = null;
+ private int _numColumns = 0;
+ private double[] _colWeights = null;
+ private boolean[] _rightAligns = null;
+ private int _x = 0;
+ private int _y = 0;
+
+ /**
+ * Constructor
+ * @param inPanel panel using layout
+ */
+ public GuiGridLayout(JPanel inPanel)
+ {
+ // Default is two columns, with more weight to the right-hand one; first column is right-aligned
+ this(inPanel, null, null);
+ }
+
+ /**
+ * Constructor
+ * @param inPanel panel using layout
+ * @param inColumnWeights array of column weights
+ * @param inAlignRights array of booleans, true for right alignment, false for left
+ */
+ public GuiGridLayout(JPanel inPanel, double[] inColumnWeights, boolean[] inAlignRights)
+ {
+ _panel = inPanel;
+ _layout = new GridBagLayout();
+ _constraints = new GridBagConstraints();
+ _colWeights = inColumnWeights;
+ _rightAligns = inAlignRights;
+ if (_colWeights == null || _rightAligns == null || _colWeights.length != _rightAligns.length
+ || _colWeights.length < 2)
+ {
+ _colWeights = new double[] {0.5, 1.0};
+ _rightAligns = new boolean[] {true, false};
+ }
+ _numColumns = _colWeights.length;
+ _constraints.weightx = 1.0;
+ _constraints.weighty = 0.0;
+ _constraints.ipadx = 10;
+ _constraints.ipady = 1;
+ _constraints.insets = new Insets(1, 5, 1, 5);
+ // Apply layout to panel
+ _panel.setLayout(_layout);
+ }
+
+ /**
+ * Add the given component to the grid
+ * @param inComponent component to add
+ */
+ public void add(JComponent inComponent)
+ {
+ _constraints.gridx = _x;
+ _constraints.gridy = _y;
+ _constraints.weightx = _colWeights[_x];
+ // set anchor
+ _constraints.anchor = (_rightAligns[_x]?GridBagConstraints.LINE_END:GridBagConstraints.LINE_START);
+ _layout.setConstraints(inComponent, _constraints);
+ // add to panel
+ _panel.add(inComponent);
+ // work out next position
+ _x++;
+ if (_x >= _numColumns) {
+ nextRow();
+ }
+ }
+
+ /**
+ * Go to the next row of the grid
+ */
+ public void nextRow()
+ {
+ _x = 0;
+ _y++;
+ }
+}