package com.github.xsavikx.androidscreencast.ui; import com.github.xsavikx.androidscreencast.exception.AndroidScreenCastRuntimeException; import com.github.xsavikx.androidscreencast.exception.IORuntimeException; import com.github.xsavikx.androidscreencast.util.StringUtils; import javax.swing.*; import java.awt.*; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; public class JDialogError extends JDialog { private JLabel errorDialogLabel; private JTextArea errorDescription; public JDialogError(Throwable ex) { setDefaultCloseOperation(DISPOSE_ON_CLOSE); initComponents(ex); } private void initComponents(Throwable ex) { errorDialogLabel = new JLabel(); JScrollPane scrollPane = new JScrollPane(); errorDescription = new JTextArea(); errorDescription.setLineWrap(true); errorDescription.setWrapStyleWord(true); Container contentPane = getContentPane(); contentPane.setLayout(new BorderLayout(5, 5)); errorDialogLabel.setText(ex.getClass().getSimpleName()); errorDialogLabel.setLabelFor(errorDescription); errorDialogLabel.setHorizontalAlignment(SwingConstants.CENTER); contentPane.add(errorDialogLabel, BorderLayout.NORTH); setErrorDetails(ex); scrollPane.setViewportView(errorDescription); contentPane.add(scrollPane, BorderLayout.CENTER); pack(); Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); setSize((int) screenSize.getWidth() >> 1, (int) screenSize.getHeight() >> 1); setLocationRelativeTo(null); setAlwaysOnTop(true); } private void setErrorDetails(Throwable e) { Throwable ex = getRealException(e); errorDialogLabel.setText(ex.getClass().getSimpleName()); try (StringWriter stringWriter = new StringWriter()) { AndroidScreenCastRuntimeException realCause = getCause(ex); if (realCause != null) { errorDialogLabel.setText(realCause.getClass().getSimpleName()); if (StringUtils.isNotEmpty(realCause.getMessage())) stringWriter.append(realCause.getMessage()).append('\n').append('\n'); if (StringUtils.isNotEmpty(realCause.getAdditionalInformation())) stringWriter.append(realCause.getAdditionalInformation()); } else { if (StringUtils.isNotEmpty(ex.getMessage())) stringWriter.append(ex.getMessage()).append('\n').append('\n'); ex.printStackTrace(new PrintWriter(stringWriter)); } errorDescription.setText(stringWriter.toString()); } catch (IOException ioe) { throw new IORuntimeException(ioe); } } private Throwable getRealException(Throwable e) { if (e.getClass() == RuntimeException.class && e.getCause() != null) return e.getCause(); return e; } private AndroidScreenCastRuntimeException getCause(Throwable ex) { Throwable cause = ex.getCause(); while (cause != null) { if (cause instanceof AndroidScreenCastRuntimeException) { return (AndroidScreenCastRuntimeException) cause; } cause = cause.getCause(); } return null; } }