import java.io.*;
import java.util.*;
import java.awt.*;
import java.applet.*;
import java.awt.event.*;
import java.net.*;


class MyLabel extends Component {
    String       lbl=null;
    String       url=null, target=null;
    FontMetrics  fm=null;
    Color        label_col=null;

    public MyLabel(String lbl, FontMetrics fm, String url, String target) {
	this.lbl=lbl;
	this.fm=fm;
	this.url=url;
	this.target=target;
	label_col=Color.white;
    }


    public void paint(Graphics g) {
	Dimension d=getSize();
	Color     old=g.getColor();
	int       xpos=10, ypos=20;

	if(fm != null)  // compute coords for string
	    ypos=(d.height - fm.getHeight()) / 2 + fm.getHeight()-2;
	
	g.setColor(Color.black);
	g.drawRect(0, 0, d.width-1, d.height-1);
	DrawBackground(g, d);
	if(label_col != null)
	    g.setColor(label_col);
	g.drawString(lbl == null ? "Null" : lbl, xpos, ypos);
	g.setColor(old);
    }


    void SetLabelColor(Color c) {label_col=c;}

    String GetUrl()    {return url;}
    String GetTarget() {return target;}


    void DrawBackground(Graphics gr, Dimension d) {
	int    r=20, g=20, b=20;
	Color  col=new Color(r,g,b);
	int    r_step=(255-r)/d.height;
	int    g_step=(255-g)/d.height;
	int    b_step=(255-b)/d.height;

	for(int i=1; i < d.height-2; i++) {
	    gr.setColor(col);
	    gr.drawLine(1, i, d.width-3, i);
	    r=Math.min(255, r+r_step);
	    g=Math.min(255, g+g_step);
	    b=Math.min(255, b+b_step);
	    col=new Color(r, g, b);
	}
    }


    public Dimension getPreferredSize() {
	return getMinimumSize();
    }


    public Dimension getMinimumSize() {
	Dimension ret=new Dimension(150, 25);
	if(fm != null && lbl != null) {
	    ret.width=fm.stringWidth(lbl);
	    ret.height=fm.getHeight();
	}
	return ret;
    }



}


public class Buttonbar extends Applet  {
    Font           deffont=null;
    String         font="Helvetica";
    int            font_size=12;
    int            top_spacing=2, bottom_spacing=2, left_spacing=2, right_spacing=2;
    AppletContext  context=null;
    int            num_buttons=0;
    MyLabel[]      labels=null;
    Color          label_col=Color.white, mouse_over_col=Color.red;


    
    class MouseHandler extends MouseAdapter {

	public void mouseClicked(MouseEvent evt) {
	    MyLabel l;
	    String  url=null, target=null;

	    l=(MyLabel)evt.getComponent();
	    if(l == null) return;
	    url=l.GetUrl();
	    target=l.GetTarget();

	    if(context != null && url != null) {
		try {
		    if(target != null)
			context.showDocument(new URL(getDocumentBase(), url), target);
		    else
			context.showDocument(new URL(getDocumentBase(), url));
		}
		catch(Exception e) {
		    System.err.println(e);
		}
	    }
	    else
		System.err.println("target_url is null");
	}

	public void mouseEntered(MouseEvent evt) {
	    MyLabel l=(MyLabel)evt.getComponent();
	    l.SetLabelColor(mouse_over_col);
	    l.repaint();
	}

	public void mouseExited(MouseEvent evt) {
	    MyLabel l=(MyLabel)evt.getComponent();
	    l.SetLabelColor(label_col);
	    l.repaint();
	}
    }


    


    void SetParameters() {
	String parm;

	parm=getParameter("font");
	if(parm != null)
	    font=parm;

	parm=getParameter("font_size");
	if(parm != null) {
	    try {font_size=new Integer(parm).intValue();}
	    catch(Exception e) {
		System.err.println(e);
	    }
	}

	parm=getParameter("num_buttons");
	if(parm != null) {
	    try {num_buttons=new Integer(parm).intValue();}
	    catch(Exception e) {
		System.err.println(e);
	    }
	}

	parm=getParameter("top_spacing");
	if(parm != null) {
	    try {top_spacing=new Integer(parm).intValue();}
	    catch(Exception e) {
		System.err.println(e);
	    }
	}

	parm=getParameter("left_spacing");
	if(parm != null) {
	    try {left_spacing=new Integer(parm).intValue();}
	    catch(Exception e) {
		System.err.println(e);
	    }
	}

	parm=getParameter("right_spacing");
	if(parm != null) {
	    try {right_spacing=new Integer(parm).intValue();}
	    catch(Exception e) {
		System.err.println(e);
	    }
	}

	parm=getParameter("bottom_spacing");
	if(parm != null) {
	    try {bottom_spacing=new Integer(parm).intValue();}
	    catch(Exception e) {
		System.err.println(e);
	    }
	}


	
    }


    
    public void init() {
	String       name, url, target;
	FontMetrics  fm=null;

	GridBagLayout       grid=new GridBagLayout();
	GridBagConstraints  c=new GridBagConstraints();

	//addMouseListener(new MouseHandler());

	setBackground(Color.white);
	setForeground(Color.white);

	context=getAppletContext();
	SetParameters();

	//	setLayout(new GridLayout(2,4, 5, 5));
	setLayout(grid);
	c.fill=GridBagConstraints.HORIZONTAL;
	c.ipadx=20;
	c.ipady=5;
	c.insets=new Insets(top_spacing,left_spacing,bottom_spacing,right_spacing);

	try {
	    deffont=new Font(font == null ? "Helvetica" : font, Font.PLAIN, font_size);
	}
	catch(Exception e) {
	    System.err.println(e);
	}

	if(deffont == null)
	    deffont=new Font("Helvetica", Font.PLAIN, 12);

	setFont(deffont);
	fm=getFontMetrics(deffont);
	
	labels=new MyLabel[num_buttons];
	for(int i=0; i < num_buttons; i++) {
	    name=getParameter("button" + (i+1));
	    if(name != null) {
		url=getParameter("button" + (i+1) + "_target_url");
		target=getParameter("button" + (i+1) + "_target_window");
		labels[i]=new MyLabel(name, fm, url, target);
		labels[i].addMouseListener(new MouseHandler());

		c.gridx=i % 4;
		c.gridy=(int)(i/4);

		grid.setConstraints(labels[i], c);
		add(labels[i]);
		
	    }
	}
    }
    

    
    public void start()   {}
    public void stop()    {}
    public void destroy() {}


    public Dimension getPreferredSize() {return getMinimumSize();}


    public Dimension getMinimumSize() {
	Dimension ret=new Dimension(150, 25), tmp_size;
	for(int i=0; i < labels.length; i++) {
	    tmp_size=labels[i].getPreferredSize();
	    ret.width+=tmp_size.width;
	    ret.height+=tmp_size.height;
	}
	return ret;
    }


}
