import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

/**
 * @author Remi Forax
 *
 */
public class TabbedPaneExample {

  interface ButtonFactory {
    public AbstractButton createButton(String text);
  }
  
  interface ButtonCallback {
    public void doIt(JTabbedPane pane,int position);
  }

  /*
  private static Box createControls(final JTabbedPane pane,
    ButtonFactory factory, final ButtonCallback callback,
    String title,int[] positions, String[] labels) {
      
    Box box=new Box(BoxLayout.Y_AXIS);
    box.setBorder(BorderFactory.createTitledBorder(title));
    
    ButtonGroup group=new ButtonGroup();
    for(int i=0;i<positions.length;i++) {
      AbstractButton button=factory.createButton(labels[i]);
      button.setAlignmentX(0.5f);
      final int position=positions[i];
      
      button.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
          callback.doIt(pane,position);
        }
      });
      box.add(button);
      group.add(button);
    }
    
    return box;
  }

  private static Box createTabPlacementControls(final JTabbedPane pane) {
    
    int[] placements=new int[] {
      JTabbedPane.TOP,JTabbedPane.BOTTOM,JTabbedPane.LEFT,JTabbedPane.RIGHT
    };
    String[] labels=new String[] { 
      "TOP","BOTTOM","LEFT","RIGHT"
    };
    ButtonFactory factory=new ButtonFactory() {
      public AbstractButton createButton(String text) {
        return new JButton(text);
      }
    };
    ButtonCallback callback=new ButtonCallback() {
      public void doIt(JTabbedPane pane, int placement) {
        pane.setTabPlacement(placement);
      }
    };
    return createControls(pane,factory,callback,"tab placement",
      placements,labels);
  }
  
  private static Box createTabLayoutControls(final JTabbedPane pane) {
    
    int[] policies=new int[] {
      JTabbedPane.WRAP_TAB_LAYOUT,JTabbedPane.SCROLL_TAB_LAYOUT
    };
    String[] labels=new String[] { 
      "Wrap","Scroll"
    };
    ButtonFactory factory=new ButtonFactory() {
      public AbstractButton createButton(String text) {
        return new JRadioButton(text);
      }
    };
    ButtonCallback callback=new ButtonCallback() {
      public void doIt(JTabbedPane pane, int policy) {
        pane.setTabLayoutPolicy(policy);
      }
    };
    return createControls(pane,factory,callback,"layout policy",
      policies,labels);
  }*/   

  
  private static Box createTabPlacementControls(final JTabbedPane pane) {
    
    int[] placements=new int[] {
      JTabbedPane.TOP,JTabbedPane.BOTTOM,JTabbedPane.LEFT,JTabbedPane.RIGHT
    };
    String[] labels=new String[] { 
      "TOP","BOTTOM","LEFT","RIGHT"
    };
    
    Box box=new Box(BoxLayout.Y_AXIS);
    box.setBorder(BorderFactory.createTitledBorder("tab placement"));
    for(int i=0;i<placements.length;i++) {
      JButton button=new JButton(labels[i]);
      final int placement=placements[i];
      
      button.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
          pane.setTabPlacement(placement);
        }
      });
      box.add(button);
    }
    
    return box;
  }
  
  private static Box createTabLayoutControls(final JTabbedPane pane) {
    
    int[] policies=new int[] {
      JTabbedPane.WRAP_TAB_LAYOUT,JTabbedPane.SCROLL_TAB_LAYOUT
    };
    String[] labels=new String[] { 
      "Wrap","Scroll"
    };
    
    Box box=new Box(BoxLayout.Y_AXIS);
    box.setBorder(BorderFactory.createTitledBorder("layout policy"));
    
    for(int i=0;i<policies.length;i++) {
      JRadioButton button=new JRadioButton(labels[i]);
      final int policy=policies[i];
      
      button.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
          pane.setTabPlacement(policy);
        }
      });
      box.add(button);
    }
    
    return box;
  }
  
  private static Box createAddRemoveControls(final JTabbedPane pane) {
    
    Box box=new Box(BoxLayout.Y_AXIS);
    box.setBorder(BorderFactory.createTitledBorder("add/remove"));
    
    JButton add=new JButton("Add");
    add.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        String text="tab "+(count++);
        pane.addTab(text, new JLabel(text));
      }
    });
    box.add(add);
    
    JButton remove=new JButton("Remove");
    remove.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        int index=pane.getSelectedIndex();
        if (index!=-1)
          pane.removeTabAt(index);
      }
    });
    box.add(remove);
    
    return box;
  }
  
  static int count;

  public static void main(String[] args) {
    JTabbedPane pane=new JTabbedPane();
    
    JPanel panel=new JPanel(new GridLayout(3,0));
    panel.add(createTabPlacementControls(pane));
    panel.add(createTabLayoutControls(pane));
    panel.add(createAddRemoveControls(pane));
    
    JFrame frame=new JFrame("TabbedPaneExample");
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    
    Container c=frame.getContentPane();
    c.add(panel,BorderLayout.WEST);
    c.add(pane);
    frame.pack();
    frame.show();
  }
}
