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

class ChangeDSlider extends Slider {
protected Blackboard _bb;
public ChangeDSlider( Blackboard black ) {
	_bb = black;
	SetMinimum( 1 );
	SetMaximum( 100 );
	SetValue( 20 );
	SetWidth( 100 );
	_bb.globals.D( GetValue() );
}
public void Motion() { 
	_bb.globals.D( GetValue() ); 
}
public void Release() { 
	_bb.globals.D( GetValue() ); 
}
} // class ChangeDSlider

class ChangeLocSlider extends Slider {
protected Blackboard _bb;
public ChangeLocSlider( Blackboard black ) {
	_bb = black;
	SetMinimum( 1 );
	SetMaximum( 10 );
	SetValue( 2 );
	SetWidth( 100 );
	_bb.globals.localizationDepth( GetValue() );
}
public void Motion() { 
	_bb.globals.localizationDepth( GetValue() ); 
}
public void Release() { 
	_bb.globals.localizationDepth( GetValue() ); 
}
} // class ChangeLoclider

class ChangeCycSlider extends Slider {
protected Blackboard _bb;
public ChangeCycSlider( Blackboard black ) {
	_bb = black;
	SetMinimum( 2 );
	SetMaximum( 20 );
	SetValue( 4 );
	SetWidth( 100 );
	_bb.globals.cycleLength( GetValue() );
}
public void Motion() { 
	_bb.globals.cycleLength( GetValue() );
}
public void Release() { 
	_bb.globals.cycleLength( GetValue() );
}
} // class ChangeLoclider

class ChangeTempSlider extends Slider {
protected Blackboard _bb;
public ChangeTempSlider( Blackboard black ) {
	_bb = black;
	SetMinimum( 0 );
	SetMaximum( 1000 );
	SetValue( 0 );
	SetWidth( 100 );
	_bb.globals.minTemp( GetValue()/100.0 );
}
public void Motion() { 
	_bb.globals.minTemp( GetValue()/100.0 ); 
}
public void Release() { 
	_bb.globals.minTemp( GetValue()/100.0 ); 
}
} // class ChangeTempSlider

class ChangeACSlider extends Slider {
protected Blackboard _bb;
public ChangeACSlider( Blackboard black ) {
	_bb = black;
	SetMinimum( 0 );
	SetMaximum( 100 );
	SetValue( 10 );
	SetWidth( 100 );
	_bb.globals.ac( GetValue()/10.0 );
}
public void Motion() { 
	_bb.globals.ac( GetValue()/10.0 ); 
}
public void Release() { 
	_bb.globals.ac( GetValue()/10.0 ); 
}
} // class ChangeACSlider

class ChangeAESlider extends Slider {
protected Blackboard _bb;
public ChangeAESlider( Blackboard black ) {
	_bb = black;
	SetMinimum( 0 );
	SetMaximum( 100 );
	SetValue( 20 );
	SetWidth( 100 );
	_bb.globals.ae( GetValue()/10.0 );
}
public void Motion() { 
	_bb.globals.ae( GetValue()/10.0 ); 
}
public void Release() { 
	_bb.globals.ae( GetValue()/10.0 ); 
}
} // class ChangeAESlider

class ChangeRCSlider extends Slider {
protected Blackboard _bb;
public ChangeRCSlider( Blackboard black ) {
	_bb = black;
	SetMinimum( 0 );
	SetMaximum( 100 );
	SetValue( 10 );
	SetWidth( 100 );
	_bb.globals.rc( GetValue()/10.0 );
}
public void Motion() { 
	_bb.globals.rc( GetValue()/10.0 ); 
}
public void Release() { 
	_bb.globals.rc( GetValue()/10.0 ); 
}
} // class ChangeRCSlider

class ChangeRESlider extends Slider {
protected Blackboard _bb;
public ChangeRESlider( Blackboard black ) {
	_bb = black;
	SetMinimum( 0 );
	SetMaximum( 100 );
	SetValue( 10 );
	SetWidth( 100 );
	_bb.globals.re( GetValue()/10.0 );
}
public void Motion() { 
	_bb.globals.re( GetValue()/10.0 ); 
}
public void Release() { 
	_bb.globals.re( GetValue()/10.0 ); 
}
} // class ChangeRESlider

public class ControlWindow extends Frame implements Runnable {

protected Blackboard _bb;
protected Slider _sliderLoc, _sliderCyc, _sliderD, _sliderTemp,
                 _sliderAC, _sliderAE, _sliderRC, _sliderRE;
RotateWindow _rotation;
protected Choice _embedder, _dimension;
protected Label _currTemp;

protected boolean _showing = false;
public boolean showing() { 
	return _showing;
}
public void showing( boolean s ) { 
	_showing = s;
}

public ControlWindow( Blackboard black ) {
	super( "Embedding Controls" );
	_bb = black;

	setLayout(new GridLayout( 0, 2, 4, 4 ));

	_embedder = new Choice();
	_embedder.addItem("Stable");
	_embedder.addItem("Relax");
	_embedder.addItem("Random");
	_embedder.addItem("Circular");
	_embedder.addItem("BaryCentric");
	_embedder.addItem("ForceDir");
	_embedder.addItem("Level");
	_embedder.select("Random");
	add(_embedder);
  _dimension = new Choice();
	_dimension.addItem("2D");
	_dimension.addItem("3D");
	_dimension.select("2D");
	add(_dimension);
	add(new Button("Back"));
	add(new Button("Rotate"));

	_sliderD = new ChangeDSlider( _bb );
	add( new Label("Area Constant:", Label.RIGHT) );
	add( _sliderD );
	_sliderLoc = new ChangeLocSlider( _bb );
	add( new Label("Localiz. Depth:", Label.RIGHT) );
	add( _sliderLoc );
	_sliderCyc = new ChangeCycSlider( _bb );
	add( new Label("Cycle Length:", Label.RIGHT) );
	add( _sliderCyc );
	_sliderTemp = new ChangeTempSlider( _bb );
	add( new Label("100 * Min.Temp:", Label.RIGHT) );
	add( _sliderTemp );
	_sliderAC = new ChangeACSlider( _bb );
	add( new Label("100 * Attr. Const:", Label.RIGHT) );
	add( _sliderAC );
	_sliderAE = new ChangeAESlider( _bb );
	add( new Label("100 * Attr. Exp.:", Label.RIGHT) );
	add( _sliderAE );
	_sliderRC = new ChangeRCSlider( _bb );
	add( new Label("100 * Rep. Const:", Label.RIGHT) );
	add( _sliderRC );
	_sliderRE = new ChangeRESlider( _bb );
	add( new Label("100 * Rep. Exp.:", Label.RIGHT) );
	add( _sliderRE );
	add( new Label("Current Temp:", Label.RIGHT) );
	_currTemp = new Label( "0" );
	add( _currTemp );

  _rotation = new RotateWindow( _bb );
  _rotation.pack();

	_bb.addEmbedder( "Stable", new Stabilizer( _bb ) );
	_bb.addEmbedder( "Random", new Randomizer( _bb ) );
	_bb.addEmbedder( "BaryCentric", new Cycleizer( _bb ) );
	_bb.addEmbedder( "Circular", new Circularizer( _bb ) );
	_bb.addEmbedder( "Relax", new Relaxer( _bb ) );
	_bb.addEmbedder( "Level", new Leveller( _bb ) );
	_bb.addEmbedder( "ForceDir", new ForceDirect( _bb ) );
	_bb.setEmbedding( "Random" );
}

	// Thread stuff
	//
protected synchronized void refresh() {
	_currTemp.setText( Double.toString(_bb.globals.Temp()) );
}
protected Thread _updater;
public void run() {
	Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
	while (true) {
		refresh();
		try {
			Thread.sleep(100);
		} catch (InterruptedException e) {
			break;
		}
	}
}
public void start() {
	_updater = new Thread(this);
	_updater.start();
}
public void stop() {
	if( _updater != null )
		_updater.stop();
	_updater = null;
}

public boolean action(Event evt, Object arg) {
	if (evt.target == _embedder) {
		_bb.setEmbedding( ((Choice)evt.target).getSelectedItem() );
		_bb.Init();
	}
	if (evt.target == _dimension ) {
		String s = ((Choice)evt.target).getSelectedItem();
    _rotation.origo();
		if( "2D".equals(s) ) {
			_bb.globals.depth3D( 0.0 );
		}
		else {
			_bb.globals.depth3D( _bb.globals.L() );
		}
		_bb.setEmbedding( "Random" );
		_bb.Init();
		return true;
	}
	else if (evt.target instanceof Button && "Back".equals(arg)) {
		_bb.backtrack();
	}
	else if (evt.target instanceof Button && "Rotate".equals(arg)) {
		if( !_rotation.showing() ) {
			_rotation.start();
			_rotation.show();
			_rotation.showing( true );
		}
		else {
			_rotation.showing( false );
			_rotation.stop();
			_rotation.handleEvent(new Event(_rotation,Event.WINDOW_DESTROY,null));
		}
	}
	else
		return false;
	return true;
}

public boolean handleEvent(Event evt) {
	if (evt.id == Event.WINDOW_ICONIFY) {
		hide();
		return true;
	}
	if (evt.id == Event.WINDOW_DESTROY) {
		dispose();
		return true;
	}
	return super.handleEvent(evt);
}

} // class GraphWindow



