
package uk.co.wingpath.gui;

import javax.swing.*;
import java.awt.*;

public class GridBagPanel
    extends JPanel
{
    private int gridy;
    private final GridBagLayout layout;

    public GridBagPanel ()
    {
        layout = new GridBagLayout ();
        setLayout (layout);
        gridy = 0;
    }

    public GridBagLayout getLayout ()
    {
        return layout;
    }

    public static GridBagConstraints createConstraints (int gridx, int gridy)
    {
        GridBagConstraints constraints = new GridBagConstraints ();
        constraints.gridx = gridx;
        constraints.gridy = gridy;
        constraints.gridwidth = 1;
        constraints.gridheight = 1;
        constraints.weightx = 0.0;
        constraints.weighty = 0.0;
        constraints.insets = new Insets (2, 5, 2, 5);
        constraints.anchor = GridBagConstraints.NORTHWEST;
        constraints.fill = GridBagConstraints.NONE;
        return constraints;
    }

    public GridBagConstraints createConstraints ()
    {
        return createConstraints (0, gridy++);
    }

    public void addTitle (String title, int gridwidth)
    {
        JLabel label = Gui.createDialogHeading (title, 16);
        GridBagConstraints constraints = createConstraints ();
        constraints.gridwidth = gridwidth;
        constraints.anchor = GridBagConstraints.CENTER;
        add (label, constraints);
    }

    public void addTitle (String title)
    {
        addTitle (title, 2);
    }

    public void addComponent (JLabel label, JComponent component,
        GridBagConstraints constraints)
    {
        add (label, constraints);
        ++constraints.gridx;
        add (component, constraints);
    }

    public void addComponent (JLabel label, JComponent component)
    {
        addComponent (label, component, createConstraints ());
    }

    public JTextField addTextField (String label, String tooltip, int width)
    {
        JLabel l = new JLabel (label + ":", SwingConstants.LEFT);
        if (tooltip != null)
            l.setToolTipText (tooltip);
        JTextField field = new JTextField (width);
        l.setLabelFor (field);
        addComponent (l, field);
        if (tooltip != null)
            field.setToolTipText (tooltip);
        return field;
    }

    public void addComponent (JComponent component,
        GridBagConstraints constraints)
    {
        constraints.gridwidth = 2;
        constraints.fill = GridBagConstraints.HORIZONTAL;
        add (component, constraints);
    }

    public void addComponent (JComponent component)
    {
        addComponent (component, createConstraints ());
    }

    public JLabel addText (String text)
    {
        JLabel label = new JLabel (text);
        label.setHorizontalAlignment (SwingConstants.CENTER);
        label.setAlignmentX (Component.CENTER_ALIGNMENT);
        GridBagConstraints constraints = createConstraints ();
        constraints.gridwidth = 2;
        add (label, constraints);
        return label;
    }

    public void addFiller ()
    {
        GridBagConstraints constraints = createConstraints ();
        constraints.gridwidth = 2;
        constraints.fill = GridBagConstraints.HORIZONTAL;
        constraints.weighty = 1.0;
        add (Box.createGlue (), constraints);
    }

    public void addSpacer (int height)
    {
        GridBagConstraints constraints = createConstraints ();
        constraints.gridwidth = 2;
        constraints.insets = new Insets (0, 0, 0, 0);
        add (Box.createVerticalStrut (height), constraints);
    }

    public void addComponent (WComponent wc, GridBagConstraints constraints)
    {
        JLabel label = wc.getLabel ();
        JComponent component = wc.getComponent ();
        if (label != null)
            addComponent (label, component, constraints);
        else
            addComponent (component, constraints);
    }

    public void addComponent (WComponent wc)
    {
        addComponent (wc, createConstraints ());
    }

    public void printDimensions ()
    {
        int [][] dims = layout.getLayoutDimensions ();
        System.out.println ("GridBag dimensions:");

        System.out.println ("  column widths:");
        for (int i = 0 ; i < dims [0].length ; ++i)
        {
            System.out.print (" " + dims [0][i]);
        }
        System.out.println ();

        System.out.println ("  row heights:");
        for (int i = 0 ; i < dims [1].length ; ++i)
        {
            System.out.print (" " + dims [1][i]);
        }
        System.out.println ();
    }
}


