package extensions.awt;
import java.awt.*;
import java.io.*;
import java.util.*;
import extensions.lang.*;

/** Manage internally the CLASSPATH parameter.
  * @version 1.0.2
  * @author John Webster Small
  */
public class ClassPathDialog
  extends ButtonDialog
  implements ActionProtocol, PropertyProtocol
{
  private List pathList;
  private ButtonActionPanel bap;

  /** Original, startup value of "java.class.path"
    * System property. */
  public static String defaultClassPath;

  /** Currently set CLASSPATH value. */
  public static String classPath;

  static
  {
    defaultClassPath = System.getProperty
      ("java.class.path",System.getProperty("java.home")+"src");
    classPath = defaultClassPath;
  }

  private void parsePaths(String paths)
  {
    StringTokenizer p =
      new StringTokenizer(paths,File.pathSeparator);
    pathList.clear();
    while (p.hasMoreTokens())
      pathList.addItem(p.nextToken());
  }

  private String concatPaths()
  {
    StringBuffer s = new StringBuffer();
    int i = pathList.countItems();
    if (i > 0)
      s.append(pathList.getItem(0));
    for (int j = 1; j < i; j++)
      s.append(File.pathSeparator+pathList.getItem(j));
    return s.toString();
  }

  /** Construct a ClassPathDialog.
    * @param parent parent frame of this dialog
    */
  public ClassPathDialog(Frame parent)
  {
    super(parent,"Paths comprising CLASSPATH",OkCancel);
    add("Center",pathList = new List());
    parsePaths(classPath);
    add("East",bap = new ButtonActionPanel
      ("Add|Default|Delete",
       ButtonActionPanel.VERT_LEFT,this));
    resize(500,200);
  }

  /** Allow user to specify the various paths to
    * incorporate into the CLASSPATH.
    * @see #classPath
    */
  public void show()
  {
    super.show();
    if (getButtonClickedIdx() == 0) // Ok
      classPath = concatPaths();
  }

  /** not used. */
  public Object get() { return null; }

  /** Do not call.
    * @see extensions.awt.PropertyProtocol
    */
  public void set(Object value)
  {
    String s = (String) value;
    if (s != null)  {
      StringTokenizer st = new StringTokenizer(s," \t");
      if (st.hasMoreTokens())
        pathList.addItem(st.nextToken());
    }
  }

  /** @see extensions.awt.ActionProtocol */
  public void action(Component forward, Event evt, Object what)
  {
    ButtonAction ba;
    if (evt.target instanceof ButtonAction
      && bap.isMemberButton(ba = (ButtonAction) evt.target)) {
      switch (ba.id)  {
        case 0:  // Add
          PromptDialog pd = new PromptDialog
            ((Frame)getParent(),"Add path to CLASSPATH",50);
          PromptDialog.setProperty(pd,this,this);
          break;
        case 1:  // Default
            parsePaths(defaultClassPath);
            break;
        case 2:  // Delete
          int[] idxs = pathList.getSelectedIndexes();
          for (int i = 0; i < idxs.length; i++)
            pathList.delItem(idxs[i]);
          break;
      }
    }
    else
      super.action(forward,evt,what);
  }
}
