package language;

/*
	A basic extension of the javax.swing.JApplet class
 */

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;

import javax.swing.JTextArea;

import application.draw.DrawFrame;
import controlledparts.ControlledFrame;
import controlledparts.FrameWithLanguageProcessor;

public class LanguageApplet extends javax.swing.JApplet implements FrameWithLanguageProcessor  
{
    public void resetStopFlag()
    {
    }
    public boolean stopFlagIsOn()
    {
        return false;
    }

    void loadExample()
    {
            String urlname="";
            String currentExample=((String)(exampleChoice.getSelectedItem()));
            URL path=this.getCodeBase();
	    	File thePath=new File(path.toString(),currentExample);
            String separator=""+System.getProperty("file.separator");
            /*
            if(separator.equals("\\"))
            	urlname="file:///"+thePath.getPath();
            else
                urlname="file://"+thePath.getPath();
            */
            urlname=thePath.getPath();
        	System.out.println("url="+urlname);

		   loadProgram( urlname );
    }

    void programRun()
    {
 		try {
//			edittingArea.show();
		} catch (Exception e) {
		}
		String input=programArea.getText();
//		textOutput.appendText("> "+input+"\n");
		inqueue.putString(input);
        basic.clearEnvironment();
//        graphicsArea.clear();
		LispObject o=((ReadLine)(basic.read)).readProgram(inqueue);
        LispObject p=basic.basicparser.parseBasic(o);
        try{
        basic.evalList(p);
        }
        catch(Exception e){}
        outputArea.repaint();
    }

    void loadProgram(String urlname)
    {
         BufferedReader inputStream=null;
        URL  url;
//        String codingCode=this.communicationNode.encodingCode;
        String codingCode="EUC-JP";
        JTextArea mes=this.outputArea;

//        int startTime=this.communicationNode.eventRecorder.timer.getTime();
        if(urlname==null){
            mes.append("URL Name is expected.\n");
            return;
        }
        mes.append("reading "+urlname+"\n");
        try{ url=new URL(urlname); }
        catch(MalformedURLException e)
        {  mes.append("MalformedURLException\n");
           return;
        }

        try{
            InputStreamReader reader=
               new InputStreamReader(url.openStream(),codingCode);
            inputStream=//new DataInputStream(url.openStream());
                    new BufferedReader( reader  );
        }
        catch(UnsupportedEncodingException e){
             mes.append("encoding unsupported.\n");
            return;
       }
        catch(IOException e){
            mes.append("url open error.\n");
            return;
        }

       this.programArea.setText("");
       int tlength=0;
       String x=null;
       do{
          x=null;
          try{
            x=inputStream.readLine();
          }
          catch(java.io.IOException e){  break;}
          if(x!=null){
             x=x+"\n";
             tlength=tlength+x.length();
             this.programArea.append(x);
          }
       } while(x!=null);
  
        try{ inputStream.close();  }
        catch(IOException e)
           { mes.append("read:IOException while closing.\n");}
        mes.append("reading done.\n");

    }

    ABasic basic;

    CQueue inqueue;

    public boolean traceFlagIsOn()
    {
        // This method is derived from interface language.GuiWithTraceFlag
        // to do: code goes here
        return this.traceCheck.isSelected();
    }

	public void init()
	{
		
		// This line prevents the "Swing: checked access to system event queue" message seen in some browsers.
		getRootPane().putClientProperty("defeatSystemEventQueueCheck", Boolean.TRUE);
		
		// This code is automatically generated by Visual Cafe when you add
		// components to the visual environment. It instantiates and initializes
		// the components. To modify the code, only use code syntax that matches
		// what Visual Cafe can generate, or Visual Cafe may be unable to back
		// parse your Java file into its visual environment.
		//{{INIT_CONTROLS
		getContentPane().setLayout(null);
		setSize(491,366);
		JScrollPane1.setOpaque(true);
		getContentPane().add(JScrollPane1);
		JScrollPane1.setBounds(120,24,348,168);
		JScrollPane1.getViewport().add(programArea);
		programArea.setBounds(0,0,345,165);
		JScrollPane2.setOpaque(true);
		getContentPane().add(JScrollPane2);
		JScrollPane2.setBounds(120,192,348,84);
		JScrollPane2.getViewport().add(outputArea);
		outputArea.setBounds(0,0,345,81);
		JScrollPane3.setOpaque(true);
		getContentPane().add(JScrollPane3);
		JScrollPane3.setBounds(120,276,264,72);
		JScrollPane3.getViewport().add(inputArea);
		inputArea.setBounds(0,0,261,69);
		fileButton.setText("file");
		fileButton.setActionCommand("file");
		getContentPane().add(fileButton);
		fileButton.setBounds(24,48,96,24);
		runProgramButton.setText("run");
		runProgramButton.setActionCommand("run");
		getContentPane().add(runProgramButton);
		runProgramButton.setBounds(24,144,96,24);
		enterButton.setText("enter");
		enterButton.setActionCommand("enter");
		getContentPane().add(enterButton);
		enterButton.setBounds(384,276,84,72);
		clearOutputButton.setText("clear");
		clearOutputButton.setActionCommand("clear");
		getContentPane().add(clearOutputButton);
		clearOutputButton.setBounds(24,216,96,24);
		clearInputButton.setText("clear");
		clearInputButton.setActionCommand("clear");
		getContentPane().add(clearInputButton);
		clearInputButton.setBounds(24,300,96,24);
		JLabel1.setText("output");
		getContentPane().add(JLabel1);
		JLabel1.setBounds(24,192,96,24);
		JLabel2.setText("input");
		getContentPane().add(JLabel2);
		JLabel2.setBounds(24,276,96,24);
		JLabel3.setText("program");
		getContentPane().add(JLabel3);
		JLabel3.setBounds(24,24,96,24);
		clearProgramButton.setText("clear");
		clearProgramButton.setActionCommand("clear");
		getContentPane().add(clearProgramButton);
		clearProgramButton.setBounds(24,168,96,24);
		getContentPane().add(exampleChoice);
		exampleChoice.setBounds(24,72,96,24);
		getContentPane().add(languageChoice);
		languageChoice.setBounds(24,120,96,24);
		loadButton.setText("load");
		loadButton.setActionCommand("load");
		getContentPane().add(loadButton);
		loadButton.setBounds(24,96,96,24);
		traceCheck.setText("trace");
		traceCheck.setActionCommand("trace");
		getContentPane().add(traceCheck);
		traceCheck.setBounds(24,324,96,24);
		//}}
	
		//{{REGISTER_LISTENERS
		SymAction lSymAction = new SymAction();
		runProgramButton.addActionListener(lSymAction);
		clearProgramButton.addActionListener(lSymAction);
		clearOutputButton.addActionListener(lSymAction);
		clearInputButton.addActionListener(lSymAction);
		enterButton.addActionListener(lSymAction);
		loadButton.addActionListener(lSymAction);
		//}}
		
		exampleChoice.addItem("factorial.bas");
		exampleChoice.addItem("hanoi.bas");
		exampleChoice.addItem("fibonacci.bas");
		exampleChoice.addItem("sieve.bas");
		exampleChoice.addItem("gauss.bas");
		exampleChoice.addItem("math-fun.bas");
		exampleChoice.addItem("lines1.bas");
		exampleChoice.addItem("sinecurve.bas");
		
		inqueue=new CQueue();
		basic=new ABasic(inputArea,outputArea,inqueue,this);
		basic.start();
	}
	
	//{{DECLARE_CONTROLS
	javax.swing.JScrollPane JScrollPane1 = new javax.swing.JScrollPane();
	javax.swing.JTextArea programArea = new javax.swing.JTextArea();
	javax.swing.JScrollPane JScrollPane2 = new javax.swing.JScrollPane();
	javax.swing.JTextArea outputArea = new javax.swing.JTextArea();
	javax.swing.JScrollPane JScrollPane3 = new javax.swing.JScrollPane();
	javax.swing.JTextArea inputArea = new javax.swing.JTextArea();
	javax.swing.JButton fileButton = new javax.swing.JButton();
	javax.swing.JButton runProgramButton = new javax.swing.JButton();
	javax.swing.JButton enterButton = new javax.swing.JButton();
	javax.swing.JButton clearOutputButton = new javax.swing.JButton();
	javax.swing.JButton clearInputButton = new javax.swing.JButton();
	javax.swing.JLabel JLabel1 = new javax.swing.JLabel();
	javax.swing.JLabel JLabel2 = new javax.swing.JLabel();
	javax.swing.JLabel JLabel3 = new javax.swing.JLabel();
	javax.swing.JButton clearProgramButton = new javax.swing.JButton();
	javax.swing.JComboBox exampleChoice = new javax.swing.JComboBox();
	javax.swing.JComboBox languageChoice = new javax.swing.JComboBox();
	javax.swing.JButton loadButton = new javax.swing.JButton();
	javax.swing.JCheckBox traceCheck = new javax.swing.JCheckBox();
	//}}

	class SymAction implements java.awt.event.ActionListener
	{
		public void actionPerformed(java.awt.event.ActionEvent event)
		{
			Object object = event.getSource();
			if (object == runProgramButton)
				runProgramButton_actionPerformed(event);
			else if (object == clearProgramButton)
				clearProgramButton_actionPerformed(event);
			else if (object == clearOutputButton)
				clearOutputButton_actionPerformed(event);
			else if (object == clearInputButton)
				clearInputButton_actionPerformed(event);
			else if (object == enterButton)
				enterButton_actionPerformed(event);
			else if (object == loadButton)
				loadButton_actionPerformed(event);
		}
	}

	void runProgramButton_actionPerformed(java.awt.event.ActionEvent event)
	{
		// to do: code goes here.
			 
		runProgramButton_actionPerformed_Interaction1(event);
	}

	void runProgramButton_actionPerformed_Interaction1(java.awt.event.ActionEvent event)
	{
		try {
//			programArea.show();
		} catch (java.lang.Exception e) {
		}
		programRun();
	}

	void clearProgramButton_actionPerformed(java.awt.event.ActionEvent event)
	{
		// to do: code goes here.
			 
		clearProgramButton_actionPerformed_Interaction1(event);
	}

	void clearProgramButton_actionPerformed_Interaction1(java.awt.event.ActionEvent event)
	{
		try {
			programArea.setText("");
		} catch (java.lang.Exception e) {
		}
	}

	void clearOutputButton_actionPerformed(java.awt.event.ActionEvent event)
	{
		// to do: code goes here.
			 
		clearOutputButton_actionPerformed_Interaction1(event);
	}

	void clearOutputButton_actionPerformed_Interaction1(java.awt.event.ActionEvent event)
	{
		try {
			outputArea.setText("");
		} catch (java.lang.Exception e) {
		}
	}

	void clearInputButton_actionPerformed(java.awt.event.ActionEvent event)
	{
		// to do: code goes here.
			 
		clearInputButton_actionPerformed_Interaction1(event);
	}

	void clearInputButton_actionPerformed_Interaction1(java.awt.event.ActionEvent event)
	{
		try {
			inputArea.setText("");
		} catch (java.lang.Exception e) {
		}
	}

	void enterButton_actionPerformed(java.awt.event.ActionEvent event)
	{
		// to do: code goes here.
			 
		enterButton_actionPerformed_Interaction1(event);
	}

	void enterButton_actionPerformed_Interaction1(java.awt.event.ActionEvent event)
	{
		try {
//			inputArea.show();
		} catch (java.lang.Exception e) {
		}
		String input=inputArea.getText();
		outputArea.append(input+"\n");
		inqueue.putString(input);
//		lisp.evals(inqueue);
		inputArea.setText("");
		inputArea.repaint();
	}

	void loadButton_actionPerformed(java.awt.event.ActionEvent event)
	{
		// to do: code goes here.
			 
		loadButton_actionPerformed_Interaction1(event);
	}

	void loadButton_actionPerformed_Interaction1(java.awt.event.ActionEvent event)
	{
		try {
//			exampleChoice.getSelectedItem();
		} catch (java.lang.Exception e) {
		}
		this.loadExample();
	}
	public DrawFrame getDrawFrame() {
		// TODO �����������ꂽ���\�b�h�E�X�^�u
		return null;
	}
	public ControlledFrame lookUp(String name) {
		// TODO �����������ꂽ���\�b�h�E�X�^�u
		return null;
	}
}