package nodebox.client; import nodebox.node.Node; import nodebox.node.NodeRenderException; import nodebox.ui.*; import org.python.core.PyException; import javax.swing.*; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import static nodebox.ui.ExceptionDialog.getRootCause; public class NetworkPane extends Pane { private final NodeBoxDocument document; private final PaneHeader paneHeader; private final JLabel errorLabel; private final NetworkView networkView; private Throwable nodeRenderException; public NetworkPane(NodeBoxDocument document) { this.document = document; setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); paneHeader = new PaneHeader("Network"); paneHeader.setAlignmentX(JComponent.LEFT_ALIGNMENT); NButton newNodeButton = new NButton("New Node", getClass().getResourceAsStream("/network-new-node.png")); newNodeButton.setToolTipText("New Node (TAB)"); newNodeButton.setActionMethod(this, "showNodeSelectionDialog"); paneHeader.add(newNodeButton); add(paneHeader); errorLabel = new MessageBar("Error"); errorLabel.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { ExceptionDialog ed = new ExceptionDialog(null, nodeRenderException, "", false); ed.setVisible(true); } }); errorLabel.setVisible(false); add(errorLabel); networkView = new NetworkView(document); document.addZoomListener(networkView); networkView.setAlignmentX(JComponent.LEFT_ALIGNMENT); add(networkView); } public NetworkView getNetworkView() { return networkView; } public Pane duplicate() { return new NetworkPane(document); } public PaneHeader getPaneHeader() { return paneHeader; } public PaneView getPaneView() { return networkView; } public void showNodeSelectionDialog() { document.showNodeSelectionDialog(); } public void setError(Throwable e) { StringBuilder sb = new StringBuilder("<html>   "); if (e instanceof NodeRenderException) { Node node = ((NodeRenderException) e).getNode(); sb.append("<b>"); sb.append(node.getName()); sb.append(":</b> "); } sb.append("<u>"); nodeRenderException = getRootCause(e); if (nodeRenderException instanceof PyException) { PyException ex = (PyException) nodeRenderException; if (ex.value != null) { sb.append(ex.value.toString()); } else { sb.append(ex.toString()); } } else if (nodeRenderException instanceof OutOfMemoryError) { sb.append("Out of memory. Are you trying to process an infinite list?"); } else { sb.append(nodeRenderException.getMessage()); } sb.append("</u></html>"); errorLabel.setText(sb.toString()); errorLabel.setVisible(true); } public void clearError() { errorLabel.setText(""); errorLabel.setVisible(false); } }