// Copyright 2001-2004, FreeHEP. package org.freehep.postscript; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; /** * Debugger for PostScript Processor * * @author Mark Donszelmann * @version $Id: PSDebugger.java 10178 2006-12-08 09:03:07Z duns $ */ public class PSDebugger extends JPanel { private static final int NCOLS=3; private static final int NROWS=10; private List listeners = new ArrayList(); private JButton b[][] = new JButton[NCOLS][NROWS]; private JPanel stackPanel; private JPanel buttonPanel; public PSDebugger() { setLayout(new BorderLayout(10,10)); stackPanel = new JPanel(); stackPanel.setLayout(new GridLayout(NROWS,NCOLS)); for (int row = 0; row < NROWS; row++) { for (int col = 0; col < NCOLS; col++) { b[col][row] = new JButton(col+":"+row); stackPanel.add(b[col][row]); } } b[0][0].setText("********************************"); b[0][0].setEnabled(false); b[1][0].setText("********************************"); b[1][0].setEnabled(false); b[2][0].setText("********************************"); b[2][0].setEnabled(false); buttonPanel = new JPanel(); buttonPanel.setLayout(new GridLayout(1,2)); JButton step = new JButton("Step"); buttonPanel.add(step); step.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { for (Iterator i=listeners.iterator(); i.hasNext(); ) { try { ((DebuggerListener)i.next()).step(); } catch (BreakException be) { // ignored, we are stepping } catch (IOException ioe) { ioe.printStackTrace(); } } } }); JButton go = new JButton("Go"); buttonPanel.add(go); go.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { for (Iterator i=listeners.iterator(); i.hasNext(); ) { try { ((DebuggerListener)i.next()).go(); } catch (IOException ioe) { ioe.printStackTrace(); } } } }); add(stackPanel, BorderLayout.CENTER); add(buttonPanel, BorderLayout.SOUTH); } public void addDebuggerListener(DebuggerListener listener) { listeners.add(listener); } public void removeDebuggerListener(DebuggerListener listener) { listeners.remove(listener); } public void showInFrame() { JFrame frame = new JFrame("FreeHEP PostScript Debugger"); frame.getContentPane().add(this); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); frame.pack(); frame.setVisible(true); } public void update(DictionaryStack dictStack, ExecutableStack execStack, OperandStack operandStack) { update(dictStack, 0); update(execStack, 1); update(operandStack, 2); } public void update(PostScriptStack ps, int col) { b[col][0].setText(ps.toString()+"("+ps.size()+")"+" "); for (int i=1; i<NROWS; i++) { if (i-1 < ps.size()) { b[col][i].setText(ps.elementAt(ps.size()-i).toString()); } else { b[col][i].setText("--"); } } } }