/** * (c) 2000-2011 Carlos G�mez Rodr�guez, todos los derechos reservados / all rights reserved. * Licencia en license.txt / License in license.txt * File created: 03/09/2011 23:45:25 */ package eu.irreality.age.debug; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import bsh.EvalError; import bsh.Interpreter; import bsh.NameSpace; import bsh.UtilEvalError; /** * @author carlos * */ public class BshDebugDialog extends JFrame /*JFrame appears on taskbar, JDialog doesn't*/ { private JList listOfVariables = new JList(); void refreshVariableList( Interpreter interpreter , NameSpace namespace ) { String[] varNames = namespace.getVariableNames(); for ( int i = 0 ; i < varNames.length ; i++ ) { String realVarName = varNames[i]; varNames[i] += " = "; try { varNames[i] += interpreter.eval(realVarName,namespace); } catch (EvalError e) { e.printStackTrace(); } } listOfVariables.setListData(varNames); pack(); repaint(); } public BshDebugDialog ( String name , final Thread theThread , final Interpreter interpreter , final NameSpace namespace ) { super(); setTitle(name); getContentPane().setLayout(new BoxLayout(getContentPane(),BoxLayout.PAGE_AXIS)); getContentPane().add(Box.createRigidArea(new Dimension(0,10))); final JTextField evalTextField = new JTextField(); JButton evalButton = new JButton("Evaluar"); JPanel evalPanel = new JPanel(); evalPanel.setLayout(new BoxLayout(evalPanel,BoxLayout.LINE_AXIS)); evalPanel.add(Box.createHorizontalStrut(10)); evalPanel.add(evalTextField,BorderLayout.CENTER); evalPanel.add(Box.createHorizontalStrut(10)); evalPanel.add(evalButton,BorderLayout.EAST); evalPanel.add(Box.createHorizontalStrut(10)); getContentPane().add(evalPanel); getContentPane().add(Box.createRigidArea(new Dimension(0,10))); JPanel evalResultPanel = new JPanel(); evalResultPanel.setLayout(new BoxLayout(evalResultPanel,BoxLayout.LINE_AXIS)); JLabel evalResultLabel = new JLabel("Resultado: "); final JTextArea evalResultTextArea = new JTextArea(8,60); evalResultTextArea.setEditable(false); JScrollPane evalResultScroll = new JScrollPane(evalResultTextArea); evalResultPanel.add(Box.createHorizontalStrut(10)); evalResultPanel.add(evalResultLabel); evalResultPanel.add(Box.createHorizontalStrut(10)); evalResultPanel.add(evalResultScroll); evalResultPanel.add(Box.createHorizontalStrut(10)); getContentPane().add(evalResultPanel); getContentPane().add(Box.createRigidArea(new Dimension(0,10))); listOfVariables = new JList(); JPanel variablesPanel = new JPanel(); JLabel variablesLabel = new JLabel("Variables locales: "); variablesPanel.setLayout(new BoxLayout(variablesPanel,BoxLayout.LINE_AXIS)); variablesPanel.add(Box.createHorizontalStrut(10)); variablesPanel.add(variablesLabel); variablesPanel.add(Box.createHorizontalStrut(10)); JScrollPane variablesScrollPane = new JScrollPane(listOfVariables); variablesPanel.add(variablesScrollPane); variablesPanel.add(Box.createHorizontalStrut(10)); getContentPane().add(variablesPanel); getContentPane().add(Box.createRigidArea(new Dimension(0,10))); JButton continueButton = new JButton("Continuar ejecuci�n"); JPanel bottomPanel = new JPanel(); bottomPanel.setLayout(new BoxLayout(bottomPanel,BoxLayout.LINE_AXIS)); bottomPanel.add(Box.createHorizontalGlue()); bottomPanel.add(continueButton); bottomPanel.add(Box.createHorizontalStrut(10)); getContentPane().add(bottomPanel); getContentPane().add(Box.createRigidArea(new Dimension(0,10))); refreshVariableList(interpreter,namespace); pack(); setLocationRelativeTo(null); //center on screen setVisible(true); continueButton.addActionListener( new ActionListener() { public void actionPerformed ( ActionEvent evt ) { synchronized(theThread) { theThread.notify(); } dispose(); } } ); addWindowListener ( new WindowAdapter() //closing window is same as pressing continue { public void windowClosing ( WindowEvent evt ) { synchronized(theThread) { theThread.notify(); } dispose(); } } ); evalButton.addActionListener( new ActionListener() { public void actionPerformed ( ActionEvent evt ) { evalResultTextArea.setText(""); evalResultTextArea.setText("Expression evaluation: " + evalTextField.getText() + "\n"); try { Object returnValue = interpreter.eval(evalTextField.getText(),namespace); refreshVariableList(interpreter,namespace); evalResultTextArea.append("Result: " + returnValue + "\n"); } catch ( EvalError ee ) { ee.printStackTrace(); evalResultTextArea.append("Exception:\n"); evalResultTextArea.append(ee.toString()); } evalTextField.setText(""); } } ); //block the thread (beware, it's this same thread!) try { synchronized(theThread) { theThread.wait(); } } catch (InterruptedException e) { e.printStackTrace(); } } }