/**
 * javacmdes.java
 *
 * 27/12/11 modifié le 24/04/20 et le 29/04/20 - 14/05/2020 - 02/09/22
 *
 * lancement d'une commande, à utiliser avec NotePad ++
 * récupération de STOUT et STDERR
 *
 * Auteur : Jean-Paul Quelen
 */

import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
import java.util.*;
import javax.swing.*;

public class javacmdes extends JFrame implements ActionListener {
	static final long serialVersionUID = 220902L;

	JButton javac = new JButton ("Javac");
	JTextField tparametres = new JTextField (20);
	JButton java = new JButton ("Java");
	JButton exejar = new JButton ("exe .jar");
	JButton dir = new JButton();
	JButton delclass = new JButton ("del *.class .txt");

	JTextField tcomplement = new JTextField (20);
	JCheckBox cbmanifest = new JCheckBox ("avec manifest", true);
	JCheckBox source = new JCheckBox ("avec le source");
	JButton jar = new JButton ("Jar");

	JTextField tfcmd = new JTextField ("cmd.exe /c ", 40);
	JButton ok = new JButton ("Ok");
	JButton efface = new JButton ("Efface");
	JButton cmdexe = new JButton ("cmd.exe /c");
	TextArea ta = new TextArea ("", 40, 40);
	static BufferedReader br, brerreur;
	static String repertoire, nomf;

// exécution d'une commande
	private void execmd (String cmd) {
		try {
			Process pr = Runtime.getRuntime().exec(cmd.split(" "));
			br = new BufferedReader (new InputStreamReader (pr.getInputStream()));
	 		brerreur = new BufferedReader (new InputStreamReader (pr.getErrorStream()));
		}
		catch(Exception e) {
			ae (e.toString());
		}
	}

	private void ae (String erreur) {
		ta.append ("\n" + erreur + "\n");
	}

	public javacmdes (String s) {
		super (s);
		setLayout (new BorderLayout());
		Panel pN = new Panel();
		pN.setBackground (Color.LIGHT_GRAY);
		pN.setLayout (new GridLayout (3, 1));
		add (pN, BorderLayout.NORTH);

		Panel p = new Panel();
		pN.add (p);
		p.add (new Label ("paramètres :"));
		p.add (tparametres);
		p.add (javac);
		javac.addActionListener(this);
		p.add (java);
		java.addActionListener(this);
		p.add (exejar);
		exejar.addActionListener(this);
		p.add (dir);
		dir.addActionListener(this);
		p.add (delclass);
		delclass.addActionListener(this);

		p = new Panel();
		pN.add (p);
		p.add (new Label ("complément :"));
		p.add (tcomplement);
		cbmanifest.setBackground (Color.LIGHT_GRAY);
		p.add (cbmanifest);
		p.add (source);
		source.setBackground (Color.LIGHT_GRAY);
		p.add (jar);
		jar.addActionListener(this);

		p = new Panel();
		pN.add (p);
		p.add (tfcmd);
		p.add (ok);
		ok.addActionListener(this);
		p.add (efface);
		efface.addActionListener(this);
		p.add (cmdexe);
		cmdexe.addActionListener(this);
		add (ta, BorderLayout.CENTER);
	}

	public void actionPerformed (ActionEvent evt) {
		if ((evt.getSource() == ok) || (evt.getSource() == javac) || (evt.getSource() == java) || (evt.getSource() == exejar)
				|| (evt.getSource() == jar) || (evt.getSource() == dir) || (evt.getSource() == delclass)) {
			String s = tfcmd.getText();
			if (evt.getSource() == javac)
				s = "javac.exe " + nomf + ".java -Xlint " + tparametres.getText();
			else if (evt.getSource() == java) {
				File f = new File (repertoire + "\\" + nomf + ".class"); // blocage si nomf.class n'existe pas
				if (f.exists())
					s = "java.exe " + nomf + ".java " + tparametres.getText();	// 14/05/20 ajout de .java sinon il ne trouve pas main
				else
					s = "";
			} else if (evt.getSource() == exejar)
				s = "java.exe -jar " + nomf + ".jar " + tparametres.getText();
//				s = "cmd.exe /c " + nomf + ".jar " + tparametres.getText();
			else if (evt.getSource() == jar) {
				boolean bmanifest = cbmanifest.isSelected();
				if (bmanifest) {
					try {
						s = repertoire + "\\" + nomf + ".txt";
						FileOutputStream outs = new FileOutputStream (s);
						ta.append ("\nFichier : " + s + "\n\n");
						ecrstr (outs, "Main-Class: " + nomf + "\n");
						outs.close();
					}
					catch (java.io.IOException e) {
						ae (e + " " + repertoire + nomf);
					}
					catch (java.lang.SecurityException e) {
						ae (e.toString());
					}
				}
				s = "jar cvf";
				if (bmanifest)
					s += "m " + nomf + ".jar " + nomf + ".txt ";
				else
					s += " " + nomf + ".jar ";
				s += nomf + "*.class ";
				if (source.isSelected())
					s += nomf + ".java ";
				s += tcomplement.getText();
			} else if (evt.getSource() == dir)
				s = "cmd.exe /c dir " + nomf + "*.*";
			else if (evt.getSource() == delclass)
				s = "cmd.exe /c del " + nomf + "*.class " + nomf + ".txt";
	 		tfcmd.setText (s);
			execmd (s);
			try {
				String ligne = null;
				boolean b = s.substring(0,5).equals("javac");
				if (!b) {	// "br.readLine()" bloque si commande javac (bug ?) 
					while ((ligne = br.readLine()) != null)
						ta.append (ligne + "\n");
					br.close();
				}
				if ((ligne = brerreur.readLine()) != null)
					ta.append ("\nERREUR\n" + ligne + "\n");
				else if (b)
					ta.append ("\nProgramme compilé sans erreur\n");
				while ((ligne = brerreur.readLine()) != null)
					ta.append (ligne + "\n");
				brerreur.close();
			}
			catch (IOException e) {
				ae (e.toString());
			}
		} else if (evt.getSource() == efface) {
			tfcmd.setText ("");
			ta.setText ("");
		} else if (evt.getSource() == cmdexe)
			tfcmd.setText ("cmd.exe /c ");
	}
	
// lecture d'un entier

	private int lectint (JTextField tf) {
		int i = 0;
		try {
			 i = Integer.parseInt (tf.getText());
		}
		catch (NumberFormatException e) {}
		if (i < 0)
			i = 0;
		tf.setText (Integer.toString (i));
		return i;
	}

// écriture d'une chaîne de caractères

	private boolean ecrstr (FileOutputStream outs, String s) {
		ta.append (s);
		try {
			outs.write (s.getBytes());
		}
		catch (java.io.IOException e) {
			ae (e.toString());
			return false;
		}
		return true;
	}

	public static void main (String args[]) {
		int xdim = 900;
		int ydim = 800;
		if (args.length > 0)
			repertoire = args [0];
		if (args.length > 1)
			nomf = args [1];
		javacmdes jfcmdes = new javacmdes ("Projet : " + repertoire + "\\" + nomf);
		jfcmdes.dir.setText ("dir " + nomf + ".*");

		jfcmdes.setDefaultCloseOperation (JFrame.DISPOSE_ON_CLOSE);
		jfcmdes.setSize (xdim, ydim);
		jfcmdes.setVisible (true);
	}

}
