package fsm;

import java.awt.*;
import java.util.*;
import rec.*;
import rec.util.*;
import rec.core.*;

public class NodeNamer extends Recognizer
{
  int cur_name = 0;

  public NodeNamer()
  {
  }
  
  /**
   * Each new stroke generated gets put into the pipe here.  It will
   * remove and add objects to the 'out' target as it deems fit.
   *
   * @return true if changes were made
   */
  public boolean recognize( Surface s, Widget w )
  {
    /****** NOTE-- this is a bad thing since it changes an object
     without saving a copy.  This will clobber (possibly) the
     various undo features.
     */
    final Node n = (Node)w;

    if ( n.name == null )
      {
	final String the_name = "" + cur_name++;
	
	Console.writeln( "Naming node " + the_name );

	n.setName( the_name );

	AlterTransition tr =  new AlterTransition( s, n ) {
	  public void doUndo( )
	    {
	      n.name = null;
	      Console.writeln( "Removing the auto-name for the node." );
	    }

	  public Transition makeRedoTransition( )
	    {
	      Transition redo = new AlterTransition( getSurface(), 
						     getTargetWidget() ) {
		public void doUndo( )
		  {
		    ((Node)getTargetWidget()).name = the_name;
		    Console.writeln( "Reset the name to old value." );
		  }
		public Transition makeRedoTransition( )
		  {
		    throw new RuntimeException( "Can't recurse!  Why here?" );
		  }
	      };
	      return redo;
	    }
	}; // end internal AlterTransition declaration

	s.alterWidget( n, tr );
	s.addTransition( tr );

	return false; // we are not wanting to rerecognize anything.
      }
    else
      return false;
  }
  
  public Enumeration getInputTypes()
  {
    Vector v = new Vector();
    
    v.addElement( "fsm.Node" );
    
    return v.elements();
  }

  public Enumeration getOutputTypes() 
  {
    Vector v = new Vector();
    v.addElement( "fsm.Node" );

    return v.elements();
  }


}
