//
// $Source: /nfs/elm/d3/home/cur/djb1/java/javat/RCS/ButtonCh.java,v $
//
// $Id: ButtonCh.java,v 1.1 1997/06/23 17:04:34 djb1 Exp $
//
// Button with Object_Channel interface class
//
// (C) Copyright 1997 Dave Beckett <D.J.Beckett@ukc.ac.uk>
// University of Kent at Canterbury
//

import java.awt.*;
import Object_Channel;

import AWTProtocol;

public class ButtonCh extends Button implements Runnable
{
  private Object_Channel toButtonCh, fromButtonCh, event_Object_Channel;
  private boolean clicked=false;
  private Thread my_thread;
  private ButtonEventHandler button_event_handler;
  
  // Constructor
  public ButtonCh(Object_Channel toButtonCh, Object_Channel fromButtonCh, Object_Channel event_Object_Channel) 
  {
    this(toButtonCh, fromButtonCh, event_Object_Channel, "");
  }
  
  // Constructor
  public ButtonCh(Object_Channel toButtonCh, Object_Channel fromButtonCh, Object_Channel event_Object_Channel, String s) 
  {
    super(s);
    this.toButtonCh=toButtonCh;
    this.fromButtonCh=fromButtonCh;
    this.event_Object_Channel=event_Object_Channel;
    
    button_event_handler = new ButtonEventHandler(event_Object_Channel, this);

    my_thread=new Thread(this, "ButtonCh");
    
    // Start my thread (configuration handler)
    my_thread.start();
  }
  
  public boolean action(Event e, Object what) 
  {
    //System.err.println("ButtonCh.action: Got click");
    setClicked();
    return false;
  }
  
  public synchronized boolean testAndResetClicked() 
  {
    boolean result;
    result=clicked;
    clicked=false;
    return result;
  }
  
  public synchronized void resetClicked() 
  {
    clicked=false;
  }

  public synchronized void setClicked() 
  {
    clicked=true;
  }

  
  public void run() 
  {
    //System.err.println ("ButtonCh.run: Thread starting");
    for(;;) {
      try 
	{
	  AWTProtocol message=(AWTProtocol) toButtonCh.read(); // BLOCKs
	  //System.err.print("ButtonCh.run: Got message ");
	  switch (message.get_type()) {
	    case AWTProtocol.SET_TEXT:
	      setLabel(message.get_arg().toString());
	      break;
	    default:
	      System.err.println("ButtonCh.run: Received Unknown / unsupported message "+message.get_type());
	  }
	  my_thread.sleep(100);
	}
      catch (InterruptedException e)
	{
	  //System.err.println ("ButtonCh.run: Thread ending");
	  break;
	}
    } // for (;;)
  }
  
}



class ButtonEventHandler implements Runnable 
{
  private Thread my_thread;
  private Object_Channel event_Object_Channel;
  private ButtonCh buttonch;
  private AWTProtocol message=null;
  
  public ButtonEventHandler (Object_Channel event_Object_Channel, ButtonCh buttonch) 
  {
    my_thread=new Thread(this, "ButtonEventHandler");
    this.event_Object_Channel=event_Object_Channel;
    this.buttonch=buttonch;
    
    // Start my thread (configuration handler)
    my_thread.start();
  }
  
  public void run () 
  {
    //System.err.println("ButtonEventHandler.run: Thread active ");
    for(;;) {
      try 
	{
	  if (message==null) {
	    if (buttonch.testAndResetClicked()) {
	      message=new AWTProtocol(AWTProtocol.MOUSE_DOWN, null);
	    }
	  }
	  		  
	  if (message != null) {
	    //System.err.println("ButtonEventHandler.run - Sending message");
	    event_Object_Channel.write(message);
	    message=null;
	  }
	  my_thread.sleep(100);
	}
      catch (InterruptedException e)
	{
	  //System.err.println ("ButtonEventHandler.run: Thread ending");
	  break;
	}
    } // for (;;)
  }


}
