/* 
 * This 1.1/Swing example shows how to specify alignments when 
 * you're using a BoxLayout for components with maximum sizes
 * and different default alignments. 
 */

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

public class AlignmentDemo extends JTabbedPane {

    public AlignmentDemo() {
	JPanel buttonRow = new JPanel();
	//Use default FlowLayout.
	buttonRow.add(createButtonRow(false));
        buttonRow.add(createButtonRow(true));
	addTab("Altering alignments", buttonRow);

	JPanel labelAndComponent = new JPanel();
	//Use default FlowLayout.
	labelAndComponent.add(createLabelAndComponent(false));
        labelAndComponent.add(createLabelAndComponent(true));
	addTab("X alignment mismatch", labelAndComponent);

	JPanel buttonAndComponent = new JPanel();
	//Use default FlowLayout.
	buttonAndComponent.add(createButtonAndComponent(false));
        buttonAndComponent.add(createButtonAndComponent(true));
	addTab("Y alignment mismatch", buttonAndComponent);
    }

    protected JPanel createButtonRow(boolean changeAlignment) {
	JPanel pane = new JPanel();

	JComponent component = new JPanel();

	JButton button1 = new JButton("A JButton",
				      new ImageIcon("images/middle.gif"));
	button1.setVerticalTextPosition(AbstractButton.BOTTOM);
	button1.setHorizontalTextPosition(AbstractButton.CENTER);

	JButton button2 = new JButton("Another JButton",
				      new ImageIcon("images/geek-cght.gif"));
	button2.setVerticalTextPosition(AbstractButton.BOTTOM);
	button2.setHorizontalTextPosition(AbstractButton.CENTER);

	String title;
	if (changeAlignment) {
	    title = "Desired";
	    button1.setAlignmentY(BOTTOM_ALIGNMENT);
	    button2.setAlignmentY(BOTTOM_ALIGNMENT);
	} else {
	    title = "Default";
	}

	pane.setBorder(BorderFactory.createTitledBorder(title));
	pane.setLayout(new BoxLayout(pane, BoxLayout.X_AXIS));
	pane.add(button1);
	pane.add(button2);
	return pane;
    }

    protected JPanel createLabelAndComponent(boolean doItRight) {
	JPanel pane = new JPanel();

	JComponent component = new JPanel();
	Dimension size = new Dimension(150,100);
	component.setMaximumSize(size);
	component.setPreferredSize(size);
	component.setMinimumSize(size);
	TitledBorder border = new TitledBorder(
				  new LineBorder(Color.black),
				  "A component",
				  TitledBorder.CENTER,
				  TitledBorder.BELOW_TOP);
	border.setTitleColor(Color.black);
	component.setBorder(border);

	JLabel label = new JLabel("This is a JLabel");
	String title;
	if (doItRight) {
	    title = "Desired";
	    label.setAlignmentX(CENTER_ALIGNMENT);
	} else {
	    title = "Default";
	}

	pane.setBorder(BorderFactory.createTitledBorder(title));
	pane.setLayout(new BoxLayout(pane, BoxLayout.Y_AXIS));
	pane.add(label);
	pane.add(component);
	return pane;
    }

    protected JPanel createButtonAndComponent(boolean doItRight) {
	JPanel pane = new JPanel();

	JComponent component = new JPanel();
	Dimension size = new Dimension(100, 50);
	component.setMaximumSize(size);
	component.setPreferredSize(size);
	component.setMinimumSize(size);
	TitledBorder border = new TitledBorder(
				  new LineBorder(Color.black),
				  "A component",
				  TitledBorder.CENTER,
				  TitledBorder.BELOW_TOP);
	border.setTitleColor(Color.black);
	component.setBorder(border);

	JButton button = new JButton("A JButton", 
				     new ImageIcon("images/geek-cght.gif"));
	button.setVerticalTextPosition(AbstractButton.BOTTOM);
	button.setHorizontalTextPosition(AbstractButton.CENTER);
	String title;
	if (doItRight) {
	    title = "Desired";
	    button.setAlignmentY(CENTER_ALIGNMENT);
	} else {
	    title = "Default";
	}

	pane.setBorder(BorderFactory.createTitledBorder(title));
	pane.setLayout(new BoxLayout(pane, BoxLayout.X_AXIS));
	pane.add(button);
	pane.add(component);
	return pane;
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame("AlignmentDemo");

	frame.setContentPane(new AlignmentDemo());

        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });

        frame.pack();
        frame.setVisible(true);
    }
}
