package context.apps.demos.roomlight;
import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.DefaultListModel;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSlider;
import javax.swing.SwingConstants;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;
import context.arch.discoverer.Discoverer;
import context.arch.enactor.Enactor;
import context.arch.enactor.Generator;
import context.arch.intelligibility.Explainer;
import context.arch.intelligibility.presenters.ContextIcons;
import context.arch.intelligibility.presenters.StringPresenter;
/**
* Main application with GUI to display the smart room application.
* @author Brian Y. Lim
*
*/
public class RoomApplication extends JFrame implements ChangeListener, ListDataListener {
private static final long serialVersionUID = -8804998219675878102L;
protected RoomPanel roomPanel;
protected JSlider brightnessSlider;
protected RoomModel contextModel;
protected Generator generator;
protected Enactor enactor;
protected Explainer explainer;
protected StringPresenter presenter;
protected DNDList outsideList;
protected DNDList insideList;
protected DefaultListModel insideModel;
public RoomApplication() {
super("Intelligibility - Room");
initLayout();
/*
* Context modeling
*/
contextModel = new RoomModel(this); // comment this line out if using XML version
//contextModel = new RoomModelXML(this); // uncomment code to use XML version of widgets and enactors
generator = contextModel.roomGenerator;
enactor = contextModel.roomEnactor;
}
@Override
public void setVisible(boolean visible) {
if (visible) {
updateBrightness();
updatePresence();
pack();
setLocationRelativeTo(null);
}
super.setVisible(visible);
}
protected void initLayout() {
roomPanel = new RoomPanel();
add(roomPanel, BorderLayout.CENTER);
/*
* Side panel
*/
JPanel sidePanel = new JPanel();
sidePanel.setLayout(new BoxLayout(sidePanel, BoxLayout.Y_AXIS));
brightnessSlider = new JSlider(SwingConstants.VERTICAL, 0, RoomModel.BRIGHTNESS_MAX, 0);
brightnessSlider.setPreferredSize(new Dimension(50, 100));
brightnessSlider.setMajorTickSpacing(RoomModel.BRIGHTNESS_MAX);
brightnessSlider.setPaintLabels(true);
brightnessSlider.addChangeListener(this);
JPanel sliderWrapper = new JPanel();
sliderWrapper.setPreferredSize(new Dimension(120, 100));
sliderWrapper.setBorder(BorderFactory.createTitledBorder("Brightness"));
sliderWrapper.add(brightnessSlider);
sidePanel.add(sliderWrapper);
add(sidePanel, BorderLayout.EAST);
outsideList = new DNDList();
DefaultListModel outsideModel = new DefaultListModel();
// source for names: http://babynamesworld.parentsconnect.com/top-100-baby-names.php?p=top&s_top_year3=2009&s_top_nr3=100&s_gender4=1
outsideModel.addElement("Isabella");
outsideModel.addElement("Emma");
outsideModel.addElement("Jacob");
outsideList.setModel(outsideModel);
//outsideModel.addListDataListener(this); // just listen to one list, instead of both
JScrollPane scrollpane = new JScrollPane(outsideList);
scrollpane.setBorder(BorderFactory.createTitledBorder("Outside Room"));
scrollpane.setPreferredSize(new Dimension(120, 50));
sidePanel.add(scrollpane);
insideList = new DNDList();
insideModel = new DefaultListModel();
insideModel.addElement("Ethan");
insideList.setModel(insideModel);
insideModel.addListDataListener(this);
scrollpane = new JScrollPane(insideList);
scrollpane.setBorder(BorderFactory.createTitledBorder("Inside Room"));
scrollpane.setPreferredSize(new Dimension(120, 50));
sidePanel.add(scrollpane);
roomPanel.setListModels(insideModel, outsideModel);
/*
* Window properties
*/
setDefaultCloseOperation(EXIT_ON_CLOSE);
/*
* Icons
*/
ContextIcons.set("On", new ImageIcon("demos/room-rules/img/lightbulb.png"));
ContextIcons.set("Off", new ImageIcon("demos/room-rules/img/lightbulb_off.png"));
}
private void updateBrightness() {
int brightness = brightnessSlider.getValue();
roomPanel.setBrightness(brightness);
generator.setAttributeValue("brightness", (short)brightness);
}
private void updatePresence() {
int presence = insideModel.getSize();
generator.setAttributeValue("presence", presence);
}
@Override
public void stateChanged(ChangeEvent evt) {
updateBrightness();
}
@Override public void contentsChanged(ListDataEvent evt) {}
@Override
public void intervalAdded(ListDataEvent evt) {
updatePresence();
}
@Override
public void intervalRemoved(ListDataEvent evt) {
updatePresence();
}
/**
* Call this to change the light level of the lamp in the application.
* Updates the value, and the GUI paint.
* @param light
*/
public void setLight(int light) {
roomPanel.setLight(light);
roomPanel.repaint();
}
public static void main(String[] args) {
Discoverer.start();
new RoomApplication().setVisible(true);
}
}