/* ErrorsDialog.java created 2007-09-19 * */ package org.signalml.app.view.common.dialogs.errors; import static org.signalml.app.util.i18n.SvarogI18n._; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Window; import javax.swing.Icon; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import org.signalml.app.util.IconUtils; import org.signalml.app.view.common.dialogs.AbstractMessageDialog; import org.signalml.plugin.export.SignalMLException; import org.springframework.context.MessageSourceResolvable; import org.springframework.validation.Errors; /** * Dialog for showing an exception. * * @author Piotr Szachewicz */ public class ExceptionDialog extends AbstractMessageDialog { private Icon icon; private JTextArea stacktraceTextArea; /** * Constructor. Sets parent window and if this dialog * blocks top-level windows. * @param w the parent window or null if there is no parent * @param isModal true, dialog blocks top-level windows, false otherwise */ public ExceptionDialog(Window w) { super(w, true); setTitle(_("Exception occurred!")); setMinimumSize(new Dimension(470, 250)); setLocationRelativeTo(null); icon = IconUtils.getErrorIcon(); } @Override protected void initialize() { super.initialize(); setResizable(true); } /** * The model for this dialog must be either of type {@link Errors} or * {@link MessageSourceResolvable}. */ @Override public boolean supportsModelClass(Class<?> clazz) { return Throwable.class.isAssignableFrom(clazz); } @Override public JPanel getMessagePanel() { if (messagePanel == null) { messagePanel = new JPanel(new BorderLayout()); messagePanel.add(getMessageLabel(), BorderLayout.NORTH); getMessageLabel().setIcon(icon); JScrollPane scrollPane = new JScrollPane(getStacktraceTextArea()); messagePanel.add(scrollPane, BorderLayout.CENTER); } return messagePanel; } public JTextArea getStacktraceTextArea() { if (stacktraceTextArea == null) { stacktraceTextArea = new JTextArea(4, 10); stacktraceTextArea.setEditable(false); } return stacktraceTextArea; } @Override public void fillDialogFromModel(Object model) throws SignalMLException { Throwable throwable = (Throwable) model; getMessageLabel().setText(getErrorMessage(throwable)); getStacktraceTextArea().setText(getStackTraceReport(throwable)); getStacktraceTextArea().setCaretPosition(0); } protected String getErrorMessage(Throwable throwable) { StringBuilder sb = new StringBuilder(); sb.append(_("An unexpected error occurred")); sb.append(" ("); sb.append(throwable.getClass().getSimpleName()); sb.append(")."); return sb.toString(); } protected String getStackTraceReport(Throwable throwable) { StringBuilder sb = new StringBuilder(); if (throwable.getLocalizedMessage() != null) { sb.append("message: " + throwable.getLocalizedMessage()); } sb.append("\n"); sb.append(throwable.getClass().toString()); sb.append("\n"); for (int i = 0; i < throwable.getStackTrace().length; i++) { sb.append(throwable.getStackTrace()[i].toString()); sb.append("\n"); } return sb.toString(); } @Override public void fillModelFromDialog(Object model) throws SignalMLException { } @Override public boolean isCancellable() { return false; } }