package gdxstudio.panel; import gdxstudio.Content; import gdxstudio.GdxStudio; import gdxstudio.StatusBar; import gdxstudio.Style; import java.awt.Color; import java.awt.Dimension; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.io.PrintStream; import java.io.PrintWriter; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.SwingUtilities; import web.laf.lite.layout.VerticalFlowLayout; import web.laf.lite.utils.UIUtils; import org.eclipse.jdt.core.compiler.CompilationProgress; import org.eclipse.jdt.core.compiler.batch.BatchCompiler; public class ConsolePanel extends JPanel implements ActionListener { private static final long serialVersionUID = 1L; private static final JTextArea consoleArea = new JTextArea(""); private static final JScrollPane consoleAreaPane = new JScrollPane(consoleArea); public static String classPath; public static int errorCount = 0; public static int warningCount = 0; public ConsolePanel(){ super(new VerticalFlowLayout()); UIUtils.setFontSize(consoleArea, 14); UIUtils.setFontName(consoleArea, Content.editor.getFont().getFontName()); UIUtils.setMargin(this, new Insets(0,0,0,0)); UIUtils.setUndecorated(this, true); consoleAreaPane.setPreferredSize(new Dimension(500, 200)); add(new Style.TitleButton("Console", this)); setVisible(false); add(consoleAreaPane); if(Content.projectExists()) updateCompiler(); } public static void updateCompiler(){ String filename = ConsolePanel.class.getProtectionDomain().getCodeSource().getLocation().getFile(); GdxStudio.log(filename); if(filename.endsWith(".jar")) classPath = filename; else classPath = filename+File.pathSeparator+ new File(filename).getParentFile().getPath()+"/libs/gdx.jar"+File.pathSeparator; } public static void redirectSystemStreams(){ final OutputStream out = new OutputStream() { @Override public void write(int b) throws IOException { ConsolePanel.updateConsoleArea(String.valueOf((char) b)); } @Override public void write(byte[] b, int off, int len) throws IOException { ConsolePanel.updateConsoleArea(new String(b, off, len)); } @Override public void write(byte[] b) throws IOException { write(b, 0, b.length); } }; final OutputStream err = new OutputStream() { @Override public void write(int b) throws IOException { consoleArea.setText(""); ConsolePanel.updateConsoleArea(String.valueOf((char) b)); } @Override public void write(byte[] b, int off, int len) throws IOException { consoleArea.setText(""); ConsolePanel.updateConsoleArea(new String(b, off, len)); } @Override public void write(byte[] b) throws IOException { write(b, 0, b.length); } }; System.setOut(new PrintStream(out, true)); System.setErr(new PrintStream(err, true)); } public static void updateConsoleArea(final String text) { SwingUtilities.invokeLater(new Runnable() { public void run() { consoleArea.append(text); consoleArea.setCaretPosition(consoleArea.getText().length()); } }); } @Override public void actionPerformed(ActionEvent e) { setVisible(false); } static String errString = ""; static Color warningColor = new Color(255, 240, 0); final static CompilationProgress prog = null; final static PrintWriter compilerWriter = new PrintWriter(new OutputStream() { @Override public void write(int b) throws IOException { } @Override public void write(byte[] b, int off, int len) throws IOException { errString = new String(b, off, len); consoleArea.setText(""); GdxStudio.log(errString); for(String line: errString.split(System.lineSeparator())){ if(line.contains("warning")){ String[] warningLine = line.split(":"); warningCount++; Content.editor.addWarning(Integer.parseInt(warningLine[warningLine.length-3]), warningLine[warningLine.length-1]); } if(line.contains("error")){ String[] errorLine = line.split(":"); errorCount++; Content.editor.addError(Integer.parseInt(errorLine[errorLine.length-3]), errorLine[errorLine.length-1]); } } if(warningCount == 1){ StatusBar.warning.setForeground(warningColor); StatusBar.warning.setText("1 Warning"); } if(warningCount > 1){ StatusBar.warning.setForeground(warningColor); StatusBar.warning.setText(warningCount+" Warnings"); } if(errorCount == 1){ StatusBar.error.setForeground(Color.red); StatusBar.error.setText("1 Error"); } if(errorCount>1){ StatusBar.error.setForeground(Color.red); StatusBar.error.setText(errorCount+" Errors"); } } @Override public void write(byte[] b) throws IOException { write(b, 0, b.length); } }); public static void compile(final String file) { clear(); Content.editor.clearIcons(); StatusBar.error.setForeground(Color.black); StatusBar.error.setText("Errors"); StatusBar.warning.setForeground(Color.black); StatusBar.warning.setText("Warnings"); errorCount = 0; warningCount = 0; consoleArea.append("Compiling... "+file+".java"+System.lineSeparator()); final String buildArgs = Content.getProject()+"source/"+ file+".java" +" -cp "+classPath +" -d "+Content.getProject()+"bin" +" -1.7" +" -Xemacs"; Thread t = new Thread(new Runnable(){ @Override public void run() { BatchCompiler.compile(buildArgs, compilerWriter, compilerWriter, prog); consoleArea.append("Finished Compiling... "+file+".java"+System.lineSeparator()); System.gc(); } }); t.start(); } public static void build() { clear(); consoleArea.append("Building.. "+Content.getProject()+System.lineSeparator()); final String buildArgs = Content.getProject()+"source/" +" -cp "+classPath +" -d "+Content.getProject()+"bin" +" -1.7" +" -Xemacs"; Thread t = new Thread(new Runnable(){ @Override public void run() { BatchCompiler.compile(buildArgs, compilerWriter, compilerWriter, prog); System.gc(); } }); t.start(); } public static void clear(){ consoleArea.setText(""); } }