package debugger;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JCheckBox;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
import debugger.debuggerComponents.ClassWatcherFrame;
import resources.ResourceLoader;
public class DebuggerFrame extends JFrame {
private static final long serialVersionUID = 1L;
private JPanel contentPane;
private JPanel threadList;
private DebuggerHandler debugger;
private final DebuggerFrame frame = this;
private JScrollPane scrollPane;
private JCheckBox cbStartSuspended;
private JCheckBox cbRemoveStopped;
private JCheckBox cbExpandAll;
private JButton btnWatch;
/**
* Create the frame.
*/
public DebuggerFrame(DebuggerHandler debugger) {
this.debugger = debugger;
setTitle("PseuCo IDE - Agent Watching");
setIconImage(Toolkit.getDefaultToolkit().getImage(getClass().getResource("/resources/logo.png")));
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
actionResumeAll.actionPerformed(null);
frame.debugger.closeFrame();
}
});
setBounds(30, 100, 720, 520);
setMinimumSize(new Dimension(520, 220));
contentPane = new JPanel();
//contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);
makeToolbar();
scrollPane = new JScrollPane();
scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
contentPane.add(scrollPane, BorderLayout.CENTER);
threadList = new JPanel();
threadList.setBackground(Color.WHITE);
threadList.setLayout(new BoxLayout(threadList, BoxLayout.Y_AXIS));
//threadList.setPreferredSize(new Dimension(Short.MAX_VALUE, 30));
scrollPane.setViewportView(threadList);
setVisible(true);
}
private void makeToolbar() {
JPanel topBar = new JPanel();
topBar.setBorder(new EmptyBorder(5, 5, 5, 5));
topBar.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
contentPane.add(topBar, BorderLayout.NORTH);
topBar.add(makeBtn(actionRestart));
topBar.add(Box.createRigidArea(dimBorder));
topBar.add(makeBtn(actionResumeAll));
topBar.add(makeBtn(actionSuspendAll));
topBar.add(makeBtn(actionStopAll));
topBar.add(Box.createRigidArea(dimBorder));
btnWatch = makeBtn(actionShowValues);
topBar.add(btnWatch);
topBar.add(Box.createRigidArea(dimBorder));
JPanel checkboxes = new JPanel();
checkboxes.setLayout(new BoxLayout(checkboxes, BoxLayout.Y_AXIS));
cbStartSuspended = new JCheckBox(actionStartSuspended);
cbRemoveStopped = new JCheckBox(actionRemoveStopped);
cbExpandAll = new JCheckBox(actionExpandAll);
cbStartSuspended.setSelected(debugger.isStartSuspended());
cbRemoveStopped.setSelected(debugger.isRemoveStopped());
cbExpandAll.setSelected(debugger.isExpandAll());
checkboxes.add(cbStartSuspended);
checkboxes.add(cbRemoveStopped);
checkboxes.add(cbExpandAll);
checkboxes.add(Box.createVerticalGlue());
topBar.add(checkboxes);
}
private static final Dimension dimBorder = new Dimension(10,0);
private JButton makeBtn(Action a){
JButton result = new JButton(a);
result.setIconTextGap(0);
int h = result.getPreferredSize().height;
result.setPreferredSize(new Dimension(h+5,h));
return result;
}
/**
* Resumes all suspended threads
*/
private Action actionResumeAll = new ResumeAllAction();
private class ResumeAllAction extends AbstractAction{
private static final long serialVersionUID = 1L;
public ResumeAllAction(){
super("", ResourceLoader.loadIcon("resumebtnbig.png"));
putValue(Action.SHORT_DESCRIPTION, "Resumes all suspended agents");
}
@Override
public void actionPerformed(ActionEvent e) {
debugger.resumeAllThreadsFromEDT();
}
};
/**
* Suspends all registered threads
*/
private Action actionSuspendAll = new SuspendAllAction();
private class SuspendAllAction extends AbstractAction{
private static final long serialVersionUID = 1L;
public SuspendAllAction(){
super("", ResourceLoader.loadIcon("suspendbtnbig.png"));
putValue(Action.SHORT_DESCRIPTION, "Suspends all running agents");
}
@Override
public void actionPerformed(ActionEvent e) {
debugger.suspendAllThreadsFromEDT();
}
};
/**
* Stops all threads
*/
private Action actionStopAll = new StopAllAction();
private class StopAllAction extends AbstractAction{
private static final long serialVersionUID = 1L;
public StopAllAction(){
super("", ResourceLoader.loadIcon("stop.png"));
putValue(Action.SHORT_DESCRIPTION, "Stops all agents");
}
@Override
public void actionPerformed(ActionEvent e) {
debugger.stopAllThreadsFromEDT();
}
};
/**
* Restart the current program
*/
private Action actionRestart = new RestartAction();
private class RestartAction extends AbstractAction{
private static final long serialVersionUID = 1L;
public RestartAction(){
super("", ResourceLoader.loadIcon("run.png"));
putValue(Action.SHORT_DESCRIPTION, "Restarts the current program");
}
@Override
public void actionPerformed(ActionEvent e) {
debugger.restart();
}
};
private Action actionShowValues = new ValueAction();
private class ValueAction extends AbstractAction{
private static final long serialVersionUID = 1L;
public ValueAction(){
super("", ResourceLoader.loadIcon("binoculars.png"));
putValue(Action.SHORT_DESCRIPTION, "Shows all static values from the currently running program. ");
}
@Override
public void actionPerformed(ActionEvent e) {
new ClassWatcherFrame(DebuggerListeners.mainClass);
}
};
private Action actionStartSuspended = new StartSuspendAction();
private class StartSuspendAction extends AbstractAction{
private static final long serialVersionUID = 1L;
public StartSuspendAction(){
super("Start new agents suspended");
putValue(Action.MNEMONIC_KEY, KeyEvent.VK_S);
}
@Override
public void actionPerformed(ActionEvent arg0) {
debugger.setStartSuspended(cbStartSuspended.isSelected());
}
};
private Action actionRemoveStopped = new RemoveStoppedAction();
private class RemoveStoppedAction extends AbstractAction {
private static final long serialVersionUID = 1L;
public RemoveStoppedAction(){
super("Remove terminated agents from list");
putValue(Action.MNEMONIC_KEY, KeyEvent.VK_R);
}
@Override
public void actionPerformed(ActionEvent arg0) {
debugger.setRemoveStopped(cbRemoveStopped.isSelected());
}
};
private Action actionExpandAll = new ExpandAllAction();
private class ExpandAllAction extends AbstractAction {
private static final long serialVersionUID = 1L;
public ExpandAllAction() {
super("Expand all items");
putValue(Action.SHORT_DESCRIPTION,
"Expands or collapses all items in the agent list. ");
}
@Override
public void actionPerformed(ActionEvent e) {
debugger.setExpandAll(cbExpandAll.isSelected());
}
};
/**
* Will be called when a new thread starts - to add it to your screen
* @param mtp the new thread
*/
public void addManagedThreadPane(ManagedThreadPane mtp) {
threadList.add(mtp);
setOdd();
threadList.validate();
}
public void setWatchingEnabled(boolean empty) {
btnWatch.setEnabled(empty);
}
public void setOdd(){
boolean odd = false; //launch by 0
for (Component c: threadList.getComponents()){
if (c instanceof ManagedThreadPane){
((ManagedThreadPane) c).setOdd(odd);
odd = !odd;
}
}
}
}