import java.awt.Button;
import java.awt.BorderLayout;
import java.applet.Applet;
import java.awt.Color;
import java.awt.Event;
import java.lang.Thread;

import logo.ui.TurtleGraphicsPanel;
import logo.lang.Interpreter;
import logo.lang.LogoSub;

import java.net.URL;
import java.net.URLConnection;
import java.io.DataInputStream;
import java.io.InputStream;

public class rLogoRuntime extends Applet {

    TurtleGraphicsPanel t;
    RuntimeInterpreter i;
    String rLogoFile;
    boolean appIsPaused;

    public void init() {
      resize(600,600);
      t = new TurtleGraphicsPanel();
      setLayout(new BorderLayout());
      add("Center",t);
      rLogoFile=readFile(getParameter("SRC"));
    }

    public void start() {
      t.clearScreen();
      t.repaint();
      if (i!=null) {
        i.stop();
      }
      i=new RuntimeInterpreter(t);
      i.start();
      i.load(rLogoFile);
      appIsPaused=false;
    }

    public void stop() {
      i.stop();
      i=null;
      appIsPaused=true;
    }

    public boolean mouseDown(Event e, int x, int y) {
    //originally, the thread suspend() & resume() methods
    //were used instead of start() & stop(); however,
    //repeated use of these methods seems to cause problems
    //on some platforms.
      if (appIsPaused) {
        start();
      } else {
        stop();
      }
      return true;
    }

    public String readFile(String fileName) {
      String result=new String();
      DataInputStream dat;
      try {
        dat = new DataInputStream( new URL(getDocumentBase(),fileName).openStream() );
      } catch (java.net.MalformedURLException e) {
          result="write (couldn't open remote file)";
          return result;
      } catch (java.io.IOException e) {
          result="write (io error)";
          return result;
      }
      try {
        String nextLine = dat.readLine();
        while ( nextLine!=null ) {
          result=result+nextLine+"\n";
          nextLine=dat.readLine();
        }
      } catch (java.io.IOException e) {
          result="write (io error)";
      }
      return result;
    }

}

final class RuntimeInterpreter extends Interpreter {
    TurtleGraphicsPanel tg;


   public RuntimeInterpreter(TurtleGraphicsPanel t) {
      tg=t;
   }

   public void wrapString(String s) {
   }
   public void forward(int i) {
      tg.forward(i);
   }
   public void backward(int i) {
      tg.backward(i);
   }
   public void turnLeft(int i) {
      tg.turnLeft(i);
   }
   public void turnRight(int i) {
      tg.turnRight(i);
   }
   public void penUp() {
      tg.penUp();
   }
   public void penDown() {
      tg.penDown();
   }
   public void showTurtle() {
      tg.showTurtle();
   }
   public void hideTurtle() {
      tg.hideTurtle();
   }
   public void clearScreen() {
      tg.clearScreen();
   }
   public void home() {
      tg.home();
   }
   public void setColor(Color c) {
      tg.setColor(c);
   }
   public void setBackColor(Color c) {
      tg.setBackColor(c);
   }
   public void edit(LogoSub s) {
   }
   public void drawString(String s) {
      tg.drawString(s);
   }
   public void setRepaint(boolean b) {
      tg.setRepaint(b);
   }

   public void paint() {
      tg.repaint();
   }

   public void resetMode() {;}

}
