package nodebox.client; import nodebox.node.Node; import nodebox.node.Port; import nodebox.node.MenuItem; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import nodebox.ui.Platform; public class NodeAttributesDialog extends JDialog { private NodeBoxDocument document; private OKAction okAction = new OKAction(); private CancelAction cancelAction = new CancelAction(); private boolean changed = false; public NodeAttributesDialog(NodeBoxDocument document) { super(document, document.getActiveNode().getName() + " Metadata"); this.document = document; NodeAttributesEditor editor = new NodeAttributesEditor(this); getContentPane().add(editor); setResizable(false); setModal(true); setModalityType(Dialog.ModalityType.DOCUMENT_MODAL); JButton cancelButton = new JButton(cancelAction); JButton okButton = new JButton(okAction); JPanel bottomPanel = new JPanel(); bottomPanel.setLayout(new BoxLayout(bottomPanel, BoxLayout.X_AXIS)); bottomPanel.add(Box.createHorizontalGlue()); bottomPanel.add(cancelButton); bottomPanel.add(okButton); getContentPane().add(bottomPanel, BorderLayout.SOUTH); getRootPane().setDefaultButton(okButton); KeyStroke escapeStroke = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0); getRootPane().registerKeyboardAction(new ActionListener() { public void actionPerformed(ActionEvent e) { if (changed) { NodeAttributesDialog.this.document.stopEdits(); NodeAttributesDialog.this.document.undo(); } dispose(); } }, escapeStroke, JComponent.WHEN_IN_FOCUSED_WINDOW); } public Node getNode() { return document.getActiveNode(); } public void addPort(Node node, String portName, String portType) { onChanged(); document.addPort(node, portName, portType); } public void removePort(Node node, String portName) { onChanged(); document.removePort(node, portName); } /*public void setNodeExported(boolean exported) { onChanged(); document.setNodeExported(node, exported); } public void setPortName(Port port, String name) { //document.setPortName(port, name); } public void setPortCardinality(Port port, Port.Cardinality cardinality) { //document.setPortCardinality(port, cardinality); }*/ public void setNodeCategory(String category) { onChanged(); document.setNodeCategory(getNode(), category); } public void setNodeDescription(String description) { onChanged(); document.setNodeDescription(getNode(), description); } public void setNodeImage(String image) { onChanged(); document.setNodeImage(getNode(), image); } public void setNodeOutputType(String outputType) { onChanged(); document.setNodeOutputType(getNode(), outputType); } public void setNodeOutputRange(Port.Range range) { onChanged(); document.setNodeOutputRange(getNode(), range); } public void setNodeFunction(String function) { onChanged(); document.setNodeFunction(getNode(), function); } public void setNodeHandle(String handle) { onChanged(); document.setNodeHandle(getNode(), handle); } public void setPortLabel(String port, String label) { onChanged(); document.setPortLabel(port, label); } public void setPortDescription(String port, String description) { onChanged(); document.setPortDescription(port, description); } public void setPortWidget(String port, Port.Widget widget) { onChanged(); document.setPortWidget(port, widget); } public void setPortRange(String port, Port.Range range) { onChanged(); document.setPortRange(port, range); } public void setPortValue(String port, Object value) { onChanged(); document.setValue(document.getActiveNodePath(), port, value); } public void setPortMinimumValue(String port, Double minimumValue) { onChanged(); document.setPortMinimumValue(port, minimumValue); } public void setPortMaximumValue(String port, Double maximumValue) { onChanged(); document.setPortMaximumValue(port, maximumValue); } public void addPortMenuItem(String port, String key, String label) { onChanged(); document.addPortMenuItem(port, key, label); } public void removePortMenuItem(String port, MenuItem menuItem) { onChanged(); document.removePortMenuItem(port, menuItem); } public void movePortMenuItemDown(String port, int itemIndex) { onChanged(); document.movePortMenuItemDown(port, itemIndex); } public void movePortMenuItemUp(String port, int itemIndex) { onChanged(); document.movePortMenuItemUp(port, itemIndex); } public void updatePortMenuItem(String port, int itemIndex, String key, String label) { onChanged(); document.updatePortMenuItem(port, itemIndex, key, label); } private void onChanged() { if (! changed) { document.startEdits("Node Metadata"); changed = true; } } public class OKAction extends AbstractAction { public OKAction() { putValue(NAME, "Ok"); putValue(ACCELERATOR_KEY, Platform.getKeyStroke(KeyEvent.VK_ENTER)); } public void actionPerformed(ActionEvent e) { if (changed) { document.stopEdits(); } NodeAttributesDialog.this.dispose(); } } public class CancelAction extends AbstractAction { public CancelAction() { putValue(NAME, "Cancel"); putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0)); } public void actionPerformed(ActionEvent e) { if (changed) { document.stopEdits(); document.undo(); } NodeAttributesDialog.this.dispose(); } }}