package nodebox.ui;
import nodebox.client.Application;
import javax.swing.*;
import java.awt.*;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.ClipboardOwner;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.event.ActionEvent;
import java.io.PrintWriter;
import java.io.StringWriter;
public class ExceptionDialog extends JDialog implements ClipboardOwner {
private String log;
public ExceptionDialog(Frame owner, Throwable exception) {
this(owner, exception, "", true);
}
public ExceptionDialog(Frame owner, Throwable exception, String extraMessage) {
this(owner, exception, extraMessage, true);
}
public ExceptionDialog(Frame owner, Throwable exception, String extraMessage, boolean showQuitButton) {
super(owner, "Error", true);
Container container = getContentPane();
container.setLayout(new BorderLayout(0, 0));
JPanel innerPanel = new JPanel(new BorderLayout(10, 10));
innerPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
JLabel messageLabel = new JLabel("<html><b>Error: </b>" + exception.getMessage() + " " + extraMessage + "</html>");
JTextArea textArea = new JTextArea();
textArea.setFont(Theme.EDITOR_FONT);
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
exception.printStackTrace(pw);
log = sw.toString();
textArea.setText(log);
textArea.setEditable(false);
textArea.setCaretPosition(0);
JScrollPane scrollPane = new JScrollPane(textArea);
innerPanel.add(messageLabel, BorderLayout.NORTH);
innerPanel.add(scrollPane, BorderLayout.CENTER);
JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.TRAILING, 10, 10));
if (showQuitButton) {
JButton quitButton = new JButton("Quit");
quitButton.addActionListener(new AbstractAction() {
public void actionPerformed(ActionEvent e) {
setVisible(false);
Application.getInstance().quit();
}
});
buttonPanel.add(quitButton);
}
JButton copyButton = new JButton("Copy");
copyButton.addActionListener(new AbstractAction() {
public void actionPerformed(ActionEvent actionEvent) {
Clipboard clipboard = getToolkit().getSystemClipboard();
StringSelection ss = new StringSelection(log);
clipboard.setContents(ss, ExceptionDialog.this);
}
});
JButton closeButton = new JButton("Close");
closeButton.addActionListener(new AbstractAction() {
public void actionPerformed(ActionEvent e) {
setVisible(false);
}
});
// Simple spacer hack
buttonPanel.add(copyButton);
buttonPanel.add(closeButton);
innerPanel.add(buttonPanel, BorderLayout.SOUTH);
container.add(innerPanel, BorderLayout.CENTER);
setSize(600, 400);
Window win = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusedWindow();
SwingUtils.centerOnScreen(this, win);
}
public void lostOwnership(Clipboard clipboard, Transferable transferable) {
// Do nothing
}
public static Throwable getRootCause(Throwable e) {
if (e.getCause() == null) return e;
if (e.getCause() == e) return e;
return getRootCause(e.getCause());
}
}