
import java.awt.*;
import java.util.*;

public class TabPan
  extends Panel
{
  private Panel contentPane;
  private CardLayout cl;
  private Vector nameList;
  private int selIdx = 0;
  private Vector xList;
  private int hTabs;
  private int wTabs;

  public Dimension preferredSize()
  {
    return minimumSize();
  }

  public Dimension minimumSize()
  {
    Dimension d = contentPane.minimumSize();
    return new Dimension( Math.max( d.width, wTabs ), hTabs + d.height );
  }

  public int getSelectedIndex()
  {
    return selIdx;
  }

  public TabPan()
  {
    contentPane = new Panel();
    add( contentPane );
    cl = new CardLayout();
    contentPane.setLayout( cl );
    nameList = new Vector();
    xList = new Vector();
  }

  public void addT( String name, Component c )
  {
    int n;
    String key;

    n = nameList.size();
    key = "" + n;
    contentPane.add( key, c );
    Lbl lbl = new Lbl( name );
    add( lbl );
    nameList.addElement( lbl );
    if( n == 0 ) {
      cl.show( contentPane, key );
    }
  }

  public void layout()
  {
    int x, y;
    int i, n;
    int lineH;

    Dimension D;
    Component C;

    xList.removeAllElements();
    x = 2;
    y = 1;
    lineH = 1;
    n = nameList.size();
    for( i = 0; i < n; i++ )
    {
      C = (Component) nameList.elementAt( i );
      D = C.preferredSize();
      if( lineH < D.height )
        lineH = D.height;
    }
    for( i = 0; i < n; i++ )
    {
      C = (Component) nameList.elementAt( i );
      D = C.preferredSize();
      C.reshape( x + 1, y, D.width, lineH );
      x += D.width + 5;
      xList.addElement( new Integer( x ) );
    }
    wTabs = x;
    hTabs = lineH + 1;
    x = 2;
    y += lineH + 1;
    D = size();
    contentPane.reshape( x+1, y, D.width-4, D.height-4 - lineH );
  }

  public void showT( int idx )
  {
    selIdx = idx;
    String key = "" + idx;
    postEvent( new Event( this, Event.ACTION_EVENT, new Integer( idx ) ) );
    cl.show( contentPane, key );
    repaint();
  }

  public boolean handleEvent( Event evt )
  {
    int idx;

    if( evt.id == Event.MOUSE_DOWN )
    {
      idx = nameList.indexOf( evt.target );
      if( idx >= 0 ) {
        showT( idx );
      }
    }
    if( evt.id == Event.KEY_PRESS )
    {
      if( evt.key == '\t' )
      {
        if( ( evt.modifiers & evt.SHIFT_MASK ) != 0 )
        {
          selIdx--;
          if( selIdx < 0 )
            selIdx = nameList.size() - 1;
        } else {
          selIdx++;
          if( selIdx >= nameList.size() )
            selIdx = 0;
        }
        showT( selIdx );
      }
    }
    return super.handleEvent( evt );
  }

  public void paint( Graphics g )
  {
    int i, n;
    int lastX, x;
    Dimension S;

    S = size();
    n = xList.size();
    lastX = 1;
    for( i = 0; i < n; i++ )
    {
      Integer I = (Integer) xList.elementAt( i );
      x = I.intValue();
      g.drawLine( x-4, 0, x, hTabs);
      g.drawLine( lastX, 0, lastX, hTabs);
      g.drawLine( lastX, 0, x-4, 0);
      if( i == selIdx ) {
        g.drawLine( 1, hTabs, lastX, hTabs );
        g.drawLine( x, hTabs, S.width - 2, hTabs );
      }
      lastX = x;
    }
    g.drawLine( 1, hTabs, 1, S.height-2 );
    g.drawLine( 1, S.height-1, S.width - 1, S.height - 1 );
    g.drawLine( S.width - 1, S.height - 1, S.width - 1, hTabs );
  }

/*
  public static void main( String[] args )
  {
    TabPan tp = new TabPan();

    Label lbl = new Label( "Optimization hinders evolution." );
    tp.addT( "Text 1", lbl );
    tp.addT( "Text 2", new Label( "TabPan" ) );

    Panel p = new Panel();
    p.setBackground( Color.blue );
    tp.addT( "Panel", p );

    KFrame k = new KFrame( "TabPanel Test" );
    k.add( "Center", tp );
    // k.resize( 300, 300 );
    k.show();
    k.pack();
  }
*/
}
