Simpler way to center frame on screen.
[svjatoslav_commons.git] / src / main / java / eu / svjatoslav / commons / gui / dialog / ExceptionDialog.java
index 766a5f9..32974f1 100755 (executable)
@@ -1,17 +1,14 @@
 /*
- * Svjatoslav Commons - shared library of common functionality.
- * Copyright ©2012-2018, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of version 3 of the GNU Lesser General Public License
- * or later as published by the Free Software Foundation.
+ * Svjatoslav Commons - shared library of common functionality. Author: Svjatoslav Agejenko.
+ * This project is released under Creative Commons Zero (CC0) license.
  */
-
 package eu.svjatoslav.commons.gui.dialog;
 
 import javax.swing.*;
 import java.awt.*;
 
+import static javax.swing.BoxLayout.Y_AXIS;
+
 public class ExceptionDialog {
 
     public ExceptionDialog(final Exception exception) {
@@ -36,67 +33,58 @@ public class ExceptionDialog {
      * @param exception exception to show
      */
     public void showException(final Exception exception) {
+        final JPanel contentPanel = new JPanel(new BorderLayout());
+        contentPanel.add(getTopPanel(exception), BorderLayout.NORTH);
+        contentPanel.add(getStackTraceView(exception.getCause()), BorderLayout.CENTER);
 
         final JFrame frame = new JFrame("Exception occurred!");
-        final JPanel contentPanel = new JPanel(new BorderLayout());
-        final Throwable cause = exception.getCause();
-
-        // build top panel
-        {
-            final JPanel topPanel = new JPanel();
-            topPanel.setLayout(new BoxLayout(topPanel, BoxLayout.Y_AXIS));
-
-            // add exception type
-            final JLabel exceptionType = new JLabel("Exception type: "
-                    + exception.getClass().getCanonicalName());
-            topPanel.add(exceptionType);
-
-            // add error message
-            final JLabel message = new JLabel("Error message: "
-                    + exception.getMessage());
-            topPanel.add(message);
-
-            // add cause message
-            if (cause != null)
-                if (cause.getMessage() != null) {
-                    final JLabel message2 = new JLabel("Cause: "
-                            + cause.getMessage());
-                    topPanel.add(message2);
-                }
-
-            contentPanel.add(topPanel, BorderLayout.NORTH);
-        }
+        frame.getContentPane().add(contentPanel);
+        frame.setSize(800, 600);
+        frame.setVisible(true);
+        frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
+        frame.setLocationRelativeTo(null); // center frame on screen
+    }
 
-        // build stack trace view
-        {
-            final StringBuilder buffer = new StringBuilder();
+    private TextArea getStackTraceView(Throwable cause) {
+        final StringBuilder buffer = new StringBuilder();
 
+        if (cause != null) {
             // if cause is available, show original stack trace
-            if (cause != null) {
-                buffer.append("Stack trace:\n");
-                final StackTraceElement[] stackTrace = cause.getStackTrace();
-                for (final StackTraceElement stackTraceElement : stackTrace)
-                    buffer.append(stackTraceElement.toString() + "\n");
-            } else {
-                // otherwise show at least current stack trace
-                buffer.append("Stack trace from original cause is not available.\nShowing current stack trace instead:\n");
-
-                for (final StackTraceElement stackTraceElement : new Exception(
-                        "Stack trace").getStackTrace())
-                    buffer.append(stackTraceElement.toString() + "\n");
-            }
-
-            final TextArea textArea = new TextArea(buffer.toString());
-            contentPanel.add(textArea, BorderLayout.CENTER);
+            buffer.append("Stack trace:\n");
+            final StackTraceElement[] stackTrace = cause.getStackTrace();
+            enlistStackTraceElements(buffer, stackTrace);
+        } else {
+            // otherwise show at least current stack trace
+            buffer.append("Stack trace from original cause is not available.\n" +
+                    "Showing current stack trace instead:\n");
+            enlistStackTraceElements(buffer, new Exception("Stack trace").getStackTrace());
         }
 
-        // finalize frame
-        frame.getContentPane().add(contentPanel);
-        frame.setSize(800, 600);
-        frame.setVisible(true);
+        return new TextArea(buffer.toString());
+    }
+
+    private void enlistStackTraceElements(StringBuilder buffer, StackTraceElement[] stackTrace) {
+        for (final StackTraceElement stackTraceElement : stackTrace)
+            buffer.append(stackTraceElement.toString()).append("\n");
+    }
+
+    private JPanel getTopPanel(Exception exception) {
+
+        final JPanel topPanel = new JPanel();
+        topPanel.setLayout(new BoxLayout(topPanel, Y_AXIS));
+
+        // add exception type
+        topPanel.add(
+                new JLabel("Exception type: " + exception.getClass().getCanonicalName()));
 
-        // Thread.dumpStack();
+        // add error message
+        topPanel.add(new JLabel("Error message: " + exception.getMessage()));
 
+        // add cause message
+        Throwable cause = exception.getCause();
+        if (cause != null && cause.getMessage() != null)
+            topPanel.add(new JLabel("Cause: " + cause.getMessage()));
+        return topPanel;
     }
 
 }