package nodebox.client;
import nodebox.client.devicehandler.DeviceControl;
import nodebox.client.devicehandler.DeviceHandler;
import nodebox.ui.ActionHeader;
import nodebox.ui.InsetLabel;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class DevicesDialog extends JDialog implements DeviceControl.OnPropertyChangeListener {
private static final ImageIcon plusIcon = new ImageIcon(CodeLibrariesDialog.class.getResource("/action-plus-arrow.png"));
private JPanel controlPanel;
private NodeBoxDocument document;
public DevicesDialog(NodeBoxDocument document) {
super(document, "Devices", false);
this.document = document;
setLayout(new BorderLayout());
ActionHeader actionHeader = new ActionHeader();
actionHeader.setLayout(new BoxLayout(actionHeader, BoxLayout.LINE_AXIS));
InsetLabel actionHeaderLabel = new InsetLabel("Devices");
actionHeader.add(Box.createHorizontalStrut(10));
actionHeader.add(actionHeaderLabel);
actionHeader.add(Box.createHorizontalGlue());
final DevicesPopupMenu devicesPopup = new DevicesPopupMenu();
final JButton addDeviceButton = new JButton(plusIcon);
addDeviceButton.setBorder(null);
addDeviceButton.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
devicesPopup.show(addDeviceButton, -20, 21);
}
});
actionHeader.add(addDeviceButton);
actionHeader.add(Box.createHorizontalStrut(10));
add(actionHeader, BorderLayout.NORTH);
controlPanel = new JPanel(new GridBagLayout());
JScrollPane scrollPane = new JScrollPane(controlPanel, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
scrollPane.setBorder(BorderFactory.createEmptyBorder());
add(scrollPane, BorderLayout.CENTER);
JButton closeButton = new JButton("Close");
closeButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent actionEvent) {
DevicesDialog.this.setVisible(false);
}
});
JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.TRAILING, 5, 5));
buttonPanel.add(closeButton);
add(buttonPanel, BorderLayout.SOUTH);
setSize(560, 400);
setLocationRelativeTo(document);
rebuildInterface();
}
public void rebuildInterface() {
controlPanel.removeAll();
int rowIndex = 0;
for (final DeviceHandler deviceHandler : document.getDeviceHandlers()) {
JComponent control = deviceHandler.createControl();
((DeviceControl) control).setPropertyChangeListener(this);
GridBagConstraints rowConstraints = new GridBagConstraints();
rowConstraints.gridx = 0;
rowConstraints.gridy = rowIndex;
rowConstraints.fill = GridBagConstraints.HORIZONTAL;
rowConstraints.weightx = 1.0;
ActionListener removeDeviceListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
document.removeDevice(deviceHandler.getName());
rebuildInterface();
}
};
DeviceRow deviceRow = new DeviceRow(control, removeDeviceListener);
controlPanel.add(deviceRow, rowConstraints);
rowIndex++;
}
JLabel filler = new JLabel();
GridBagConstraints fillerConstraints = new GridBagConstraints();
fillerConstraints.gridx = 0;
fillerConstraints.gridy = rowIndex;
fillerConstraints.fill = GridBagConstraints.BOTH;
fillerConstraints.weighty = 1.0;
fillerConstraints.gridwidth = GridBagConstraints.REMAINDER;
controlPanel.add(filler, fillerConstraints);
validate();
repaint();
}
public void onPropertyChange(String deviceName, String key, String newValue) {
document.setDeviceProperty(deviceName, key, newValue);
}
private class DevicesPopupMenu extends JPopupMenu {
private DevicesPopupMenu() {
add(new AddDeviceHandlerAction("osc", "osc", "OSC"));
add(new AddDeviceHandlerAction("audioplayer", "audio", "Audio Player"));
add(new AddDeviceHandlerAction("audioinput", "audio", "Audio Input"));
}
}
private class AddDeviceHandlerAction extends AbstractAction {
private String type;
private String name;
private AddDeviceHandlerAction(String type, String name, String label) {
super(label);
this.type = type;
this.name = name;
}
public void actionPerformed(ActionEvent actionEvent) {
document.addDevice(type, name);
rebuildInterface();
}
}
}