package jadex.tools.debugger.micro; import jadex.commons.ChangeEvent; import jadex.commons.IBreakpointPanel; import jadex.commons.IChangeListener; import jadex.micro.MicroAgentInterpreter; import jadex.rules.state.IOAVState; import jadex.rules.state.OAVJavaType; import jadex.rules.state.OAVTypeModel; import jadex.rules.state.javaimpl.OAVStateFactory; import jadex.rules.tools.stateviewer.OAVPanel; import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.List; import javax.swing.BorderFactory; import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.ListSelectionModel; import javax.swing.SwingUtilities; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; /** * Panel for showing / manipulating the Rete agenda. */ public class MicroAgentViewPanel extends JPanel { //------- attributes -------- /** The interpreter. */ protected MicroAgentInterpreter interpreter; /** The change listener. */ protected IChangeListener listener; /** The list for the history. */ protected IOAVState step; protected DefaultListModel steps; protected Object laststep; /** The list for the history. */ protected DefaultListModel history; /** The breakpoint panel. */ protected IBreakpointPanel bpp; //------- constructors -------- /** * Create an agenda panel. */ public MicroAgentViewPanel(final MicroAgentInterpreter instance, IBreakpointPanel bpp) { this.interpreter = instance; this.bpp = bpp; steps = new DefaultListModel(); final JList sl = new JList(steps); JPanel ul = new JPanel(new BorderLayout()); ul.add(new JScrollPane(sl)); ul.setBorder(BorderFactory.createTitledBorder("Steps")); history = new DefaultListModel(); JList hl = new JList(history); JPanel ur = new JPanel(new BorderLayout()); ur.add(new JScrollPane(hl)); ur.setBorder(BorderFactory.createTitledBorder("History")); JSplitPane up = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, ul, ur); OAVTypeModel javatm = OAVJavaType.java_type_model.getDirectTypeModel(); javatm.setClassLoader(instance.getClassLoader()); step = OAVStateFactory.createOAVState(javatm); JPanel down = new JPanel(new BorderLayout()); down.add(new JScrollPane(new OAVPanel(step))); down.setBorder(BorderFactory.createTitledBorder("Step Detail")); // todo: problem should be called on process execution thread! instance.setHistoryEnabled(true); // Todo: Disable history on close? sl.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); sl.getSelectionModel().addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { int idx = sl.getSelectedIndex(); // System.out.println("sel: "+idx); if(idx!=-1) { Object st = steps.get(idx); if(st!=null && st!=laststep) { if(laststep!=null) step.removeJavaRootObject(laststep); step.addJavaRootObject(step); laststep = step; } } else if(laststep!=null) { step.removeJavaRootObject(laststep); laststep = null; } } }); this.listener = new IChangeListener() { public void changeOccurred(final ChangeEvent event) { SwingUtilities.invokeLater(new Runnable() { public void run() { synchronized(MicroAgentViewPanel.this) { if("initialState".equals(event.getType())) { Object[] scpy = (Object[])((Object[])event.getValue())[0]; Object[] hcpy = (Object[])((Object[])event.getValue())[1]; steps.removeAllElements(); for(int i=0; i<scpy.length; i++) steps.addElement(scpy[i]); history.removeAllElements(); for(int i=0; i<hcpy.length; i++) history.addElement(hcpy[i]); if(steps.size()>0) sl.setSelectedIndex(0); } else if("addStep".equals(event.getType())) { steps.addElement(event.getValue()); if(steps.size()==1) sl.setSelectedIndex(0); } else if("removeStep".equals(event.getType())) { steps.removeElementAt(((Integer)event.getValue()).intValue()); if(steps.size()>0) sl.setSelectedIndex(0); } else if("addHistoryEntry".equals(event.getType())) { history.addElement(""+event.getValue()); } } } }); } }; instance.addChangeListener(listener); JButton clear = new JButton("Clear"); clear.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // todo: invoke on agent thread with invoke later // works because history is synchronized. history.removeAllElements(); List his = instance.getHistory(); if(his!=null) his.clear(); } }); final JCheckBox hon = new JCheckBox("Store History"); hon.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // todo: invoke on agent thread with invoke later instance.setHistoryEnabled(hon.isSelected()); } }); hon.setSelected(true); JPanel buts = new JPanel(new FlowLayout(FlowLayout.RIGHT)); buts.add(hon); buts.add(clear); down.add(buts, BorderLayout.SOUTH); JSplitPane tmp = new JSplitPane(JSplitPane.VERTICAL_SPLIT); tmp.add(up); tmp.add(down); tmp.setDividerLocation(200); // Hack?! setLayout(new BorderLayout()); add(tmp, BorderLayout.CENTER); // Hack to inialize the panel. // listener.changeOccurred(null); } //-------- methods -------- /** * Dispose the panel and remove any listeners. */ public void dispose() { // instance.removeChangeListener(listener); } }