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

/**
 * Class FtpClnt : Mise en place de l'interface
 * Date 26/03/97  21:07
 */
public class FtpClnt extends Frame {
  public ButtonBar bb;
  public BrowsePanel bp;
  public OperationPanel op;

/**
 * Constructeur
 * --
 * 3 composantes : 1 bar de boutons (ButtonBar), 1 panneau pour
 * parcourir les differents repertoires (BrowsePanel) et un Panneau
 * qui rapporte les operations effectuees (OperationPanel.
 */
  public FtpClnt () {
    super("Programmable Ftp Client");
    setLayout(new FlowLayout());
    setBackground(Color.white);
    Init.LoadINIFile("FtpClnt");
    add(bb = new ButtonBar(this)); bb.setBackground(Color.white);
    add(bp = new BrowsePanel(this));
    add(op = new OperationPanel(this));
  }

/**
 * Mise en place de l'application
 */
  public static void main(String args []) {
    FtpClnt master = new FtpClnt();
    master.resize(640, 530);
    master.show();
  }
}

/**
 * Class BrowsePanel
 * Mise en place des listes permettant de parcourir
 * les repertoires locaux ou distants
 */
class BrowsePanel extends Panel {
  private ButtonZone bz;
  private FtpClnt top;
  private FileZone remote, local;
  private String ClassName = "BrowsePanel";

/**
 * @param parent Frame principale
 */
  public BrowsePanel(FtpClnt parent) {
    top = parent;
    setLayout(new FlowLayout());
    add(local = new FileZone("Local Files", FileZone.LOCAL, top));
    add(bz = new ButtonZone()); bz.setBackground(Color.white);
    add(remote =  new FileZone("Remote Files", FileZone.REMOTE, top));
  }

/**
 * Demande l'ouverture d'un site distant
 * @param URL site distant
 * @param layout Panel dans lequel on doit afficher l'etat du chargement
 */
 public void Open(String URL, ButtonBar layout) {
   if (bz.getCBState())
     remote.Open(URL, layout);
   else
     remote.ReferURL(URL);
 }

/**
 * @return dimensions desirees
 * Ces dimensions sont calculees en fonction de la taille de
 * la fenetre principale.
 */
  public Dimension preferredSize() {
    Dimension tmp = top.size();
    return new Dimension(tmp.width, tmp.height/2);
  }

/**
 * Gestion des evenements sur les boutons de la ButtonZone
 */
  public boolean handleEvent(Event ev) {
    if (ev.target instanceof Button && ev.id == Event.ACTION_EVENT) {
      Init.println(ClassName, "Ev:"+ev);
      boolean isPut = ev.arg.equals("Put");
// recupere les fichiers selectionnes
      String [] liste =
        isPut?local.getSelectedFile(bz.getCBState())
             :remote.getSelectedFile(bz.getCBState());

// Si il n'y a rien a faire, on sort
      if (liste==null || liste.length==0)
        return super.handleEvent(ev);

// recupere le nom des URL en cours
      String lName=local.getURLName(), rName=remote.getURLName();

// Affiche la Date 
      top.op.newDate(bz.getDate());

// Affiche dans la boite d'operations la liste des operations a effectuer
// Une operation par fichier
      for (int i=0; i<liste.length; i++)
        if (isPut)
          top.op.addOperation(lName+liste[i], rName, ev.arg.toString());
	else
          top.op.addOperation(rName+liste[i], lName, ev.arg.toString());
    }
    return super.handleEvent(ev);
  }
}


/**
 * Class ButtonZone
 * Gestion des boutons compris entre les deux FileZone
 */
class ButtonZone extends Panel {
  private Button b_put, b_get;
  private Checkbox cb;
  private TextField tf;
  private String ClassName = "FtpClnt";

/**
 * Constructeur par defaut
 */
  public ButtonZone() {
    setLayout(null);
    add(cb = new Checkbox("Browse"));
    cb.setState(true); // par defaut on Browse
    cb.move(20, 10); cb.resize(70, 20); cb.show();
    Label l;
    add(l = new Label("Date"));
    l.move(20, 40); l.resize(70, 20); l.show();
    add(tf = new TextField("Now"));
    tf.move(0, 60); tf.resize(110, 30); tf.show();
    add(b_put = new Button("Put"));
    b_put.move(20, 100); b_put.resize(70, 20); b_put.show();
    add(b_get = new Button("Get"));
    b_get.move(20, 130); b_get.resize(70, 20); b_get.show();
  }

/**
 * @return Date entree dans la zone prevue a cet effet.
 */
  public Date getDate() {
    String tmp = tf.getText();
    if (tmp.equals("Now"))
      return new Date();
    try { return new Date(tmp); 
    } catch (IllegalArgumentException iae) {
      System.err.println("La Date entree est incorrecte.");
      tf.setText("Now");
    }
    return new Date();
  }

  public boolean action(Event ev, Object what) {
    if (ev.target == tf) {
      try { 
        new Date(tf.getText());
      } catch (IllegalArgumentException iae) {
        System.err.println("La Date entree est incorrecte.");
	tf.setText("Now");
      }
    }
    return super.action(ev, what);
  }

/**
 * @return true si on est en train de Browser, false sinon
 */
  public boolean getCBState() {
    return cb.getState();
  }

  public Dimension preferredSize() {
    return new Dimension(110, 160);
  }
}



