package jadex.bdi.examples.alarmclock;
import jadex.bdi.runtime.IBDIExternalAccess;
import jadex.bdi.runtime.IBDIInternalAccess;
import jadex.bridge.IComponentStep;
import jadex.bridge.IInternalAccess;
import jadex.commons.concurrent.SwingDefaultResultListener;
import jadex.commons.jtable.ObjectTableModel;
import jadex.commons.service.SServiceProvider;
import jadex.commons.service.clock.IClockService;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;
import javax.swing.table.TableCellRenderer;
/**
* The alarm dialog presenting a list of alarms..
*/
public class AlarmsGui extends JFrame
{
//-------- attributes --------
/** The alarms table. */
protected JTable alarms;
/** The agent. */
protected IBDIExternalAccess agent;
/** The property change listener. */
protected PropertyChangeListener plis;
//-------- constructors --------
/**
* Create a new test center panel.
*/
public AlarmsGui(final IBDIExternalAccess agent)
{
super("Alarms");
this.agent = agent;
this.plis = new PropertyChangeListener()
{
public void propertyChange(PropertyChangeEvent evt)
{
//System.out.println("-----:"+evt);
if(evt.getPropertyName().equals("alarmtime"))
alarms.repaint();
}
};
final ObjectTableModel tadata = new ObjectTableModel(new String[]{"Message", "Mode", "Active"})
{
public void setValueAt(Object value, int row, int col)
{
Alarm alarm = (Alarm)getObjectForRow(row);
//System.out.println("alarm is: "+alarm);
alarm.setActive(((Boolean)value).booleanValue());
modifyData(value, row, col);
fireTableCellUpdated(row, col);
}
};
tadata.setColumnClass(Boolean.class, 2);
tadata.setColumnEditable(true, 2);
SServiceProvider.getService(agent.getServiceProvider(), IClockService.class)
.addResultListener(new SwingDefaultResultListener(AlarmsGui.this)
{
public void customResultAvailable(Object source, Object result)
{
final IClockService cs = (IClockService)result;
alarms = new JTable(tadata)
{
public Component prepareRenderer(
TableCellRenderer renderer, int row, int column)
{
Component c = super.prepareRenderer(renderer, row, column);
if(!isRowSelected(row))
{
Alarm alarm = (Alarm)tadata.getObjectForRow(row);
// IClockService cs = (IClockService)agent.getServiceContainer().getService(IClockService.class);
if(alarm.getAlarmtime(cs.getTime())<cs.getTime())
{
c.setBackground(new Color(255, 211, 156));
}
else
{
c.setBackground(AlarmsGui.this.alarms.getBackground());
}
}
//if(isRowSelected(row) && isColumnSelected(column))
// ((JComponent)c).setBorder(new LineBorder(Color.red));
return c;
}
};
alarms.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
JScrollPane scroll = new JScrollPane(alarms);
alarms.setPreferredScrollableViewportSize(new Dimension(400, 200)); // todo: hack
JButton add = new JButton("Add...");
JButton edit = new JButton("Edit...");
JButton remove = new JButton("Remove");
Dimension md = remove.getMinimumSize();
Dimension pd = remove.getPreferredSize();
add.setMinimumSize(md);
add.setPreferredSize(pd);
edit.setMinimumSize(md);
edit.setPreferredSize(pd);
JPanel pan = new JPanel(new GridBagLayout());
pan.add(scroll, new GridBagConstraints(0,0,3,1,1,1,GridBagConstraints.NORTHEAST,
GridBagConstraints.BOTH, new Insets(4,2,2,4),0,0));
pan.add(add, new GridBagConstraints(0,1,1,1,1,0,GridBagConstraints.NORTHEAST,
GridBagConstraints.NONE, new Insets(4,2,2,4),0,0));
pan.add(edit, new GridBagConstraints(1,1,1,1,0,0,GridBagConstraints.NORTHEAST,
GridBagConstraints.NONE, new Insets(4,2,2,4),0,0));
pan.add(remove, new GridBagConstraints(2,1,1,1,0,0,GridBagConstraints.NORTHEAST,
GridBagConstraints.NONE, new Insets(4,2,2,4),0,0));
alarms.addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent e)
{
if(e.getClickCount()==2)
handleEdit(alarms, alarms.rowAtPoint(e.getPoint()), agent);
}
});
add.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
Alarm alarm = AlarmSettingsDialog.showDialog(agent, AlarmsGui.this, null);
if(alarm!=null && agent!=null)
addRow(alarm, tadata.getRowCount());
}
});
edit.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
handleEdit(alarms, alarms.getSelectedRow(), agent);
}
});
remove.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
int sel = alarms.getSelectedRow();
if(sel!=-1)
{
Alarm alarm = (Alarm)tadata.getObjectForRow(sel);
removeRow(alarm);
}
}
});
// SwingUtilities.invokeLater(new Runnable()
// {
// public void run()
// {
agent.scheduleStep(new IComponentStep()
{
public Object execute(IInternalAccess ia)
{
IBDIInternalAccess bia = (IBDIInternalAccess)ia;
final Alarm[] alarms = (Alarm[])bia.getBeliefbase().getBeliefSet("alarms").getFacts();
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
for(int i=0; i<alarms.length; i++)
{
// Cannot use add row as beliefset already contains alarm.
tadata.addRow(new Object[]{alarms[i].getMessage(), alarms[i].getMode(),
new Boolean(alarms[i].isActive())}, alarms[i]);
alarms[i].addPropertyChangeListener(plis);
}
}
});
return null;
}
});
// agent.getBeliefbase().getBeliefSetFacts("alarms").addResultListener(new SwingDefaultResultListener(AlarmsGui.this)
// {
// public void customResultAvailable(Object source, Object result)
// {
// Alarm[] alarms = (Alarm[])result;
// for(int i=0; i<alarms.length; i++)
// {
// // Cannot use add row as beliefset already contains alarm.
// tadata.addRow(new Object[]{alarms[i].getMessage(), alarms[i].getMode(),
// new Boolean(alarms[i].isActive())}, alarms[i]);
// alarms[i].addPropertyChangeListener(plis);
// }
// }
// });
// }
// });
getContentPane().add("Center", pan);
pack();
}
});
}
//-------- methods --------
/**
* Handle an edit request in the table.
* @param alarms The table.
* @param sel The selected row.
* @param agent The agent.
*/
protected void handleEdit(JTable alarms, int sel, IBDIExternalAccess agent)
{
if(sel==-1)
return;
ObjectTableModel tadata = (ObjectTableModel)alarms.getModel();
Alarm oldalarm = (Alarm)tadata.getObjectForRow(sel);
Alarm alarm = AlarmSettingsDialog.showDialog(agent, AlarmsGui.this, oldalarm);
if(alarm!=null)// && !oldalarm.equals(alarm))
{
removeRow(oldalarm);
addRow(alarm, sel);
alarms.getSelectionModel().setSelectionInterval(sel, sel);
}
}
/**
* Add a row to the table.
* Updates belief set "alarms".
* Adds new row to the jtable.
* Adds a property change listener to the alarm.
* @param alarm The alarm.
*/
public void addRow(final Alarm alarm, int rowcnt)
{
// System.out.println("Adding:"+alarm);
alarm.addPropertyChangeListener(plis);
agent.scheduleStep(new IComponentStep()
{
public Object execute(IInternalAccess ia)
{
IBDIInternalAccess bia = (IBDIInternalAccess)ia;
bia.getBeliefbase().getBeliefSet("alarms").addFact(alarm);
return null;
}
});
// agent.getBeliefbase().addBeliefSetFact("alarms", alarm);
ObjectTableModel tadata = (ObjectTableModel)alarms.getModel();
tadata.insertRow(rowcnt, new Object[]{alarm.getMessage(),
alarm.getMode(), new Boolean(alarm.isActive())}, alarm);
}
/**
* remove a row from the table.
* Updates belief set "alarms".
* Removes row from the jtable.
* Removes a property change listener from the alarm.
* @param alarm The alarm.
*/
public void removeRow(final Alarm alarm)
{
// System.out.println("Removing:"+alarm);
agent.scheduleStep(new IComponentStep()
{
public Object execute(IInternalAccess ia)
{
IBDIInternalAccess bia = (IBDIInternalAccess)ia;
bia.getBeliefbase().getBeliefSet("alarms").removeFact(alarm);
return null;
}
});
// agent.getBeliefbase().removeBeliefSetFact("alarms", alarm);
ObjectTableModel tadata = (ObjectTableModel)alarms.getModel();
tadata.removeRow(alarm);
alarm.removePropertyChangeListener(plis);
}
/**
* Main for starting.
*/
public static void main(String[] args)
{
/*AlarmsGui ad = new AlarmsGui(null);
ad.pack();
ad.setVisible(true);*/
}
}