package org.chartsy.chatsy.chat.component; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.EventQueue; import java.awt.Font; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.PrintWriter; import java.io.StringWriter; import java.io.Writer; import java.util.Arrays; import java.util.List; import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextPane; import org.chartsy.chatsy.MainWindow; import org.chartsy.chatsy.chat.ChatsyManager; public final class MessageDialog { private MessageDialog() { } public static void showErrorDialog(final Throwable throwable) { EventQueue.invokeLater(new Runnable() { public void run() { JTextPane textPane; final JOptionPane pane; final JDialog dlg; TitlePanel titlePanel; textPane = new JTextPane(); textPane.setFont(new Font("Dialog", Font.PLAIN, 12)); textPane.setEditable(false); String message = getStackTrace(throwable); textPane.setText(message); titlePanel = new TitlePanel("Error", null, null, true); final JPanel mainPanel = new JPanel(); mainPanel.setLayout(new BorderLayout()); mainPanel.add(titlePanel, BorderLayout.NORTH); Object[] options = {"Close"}; pane = new JOptionPane( new JScrollPane(textPane), JOptionPane.PLAIN_MESSAGE, JOptionPane.OK_CANCEL_OPTION, ChatsyManager.getApplicationImage(), options, options[0]); mainPanel.add(pane, BorderLayout.CENTER); MainWindow mainWindow = ChatsyManager.getMainWindow(); dlg = new JDialog(new JFrame(), "Error", false); dlg.pack(); dlg.setSize(600, 400); dlg.setContentPane(mainPanel); dlg.setLocationRelativeTo(mainWindow); PropertyChangeListener changeListener = new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent e) { String value = (String)pane.getValue(); if ("Close".equals(value)) dlg.setVisible(false); } }; pane.addPropertyChangeListener(changeListener); dlg.setVisible(true); dlg.toFront(); dlg.requestFocus(); } }); } public static void showAlert(final String message,final String header, final String title, final Icon icon) { EventQueue.invokeLater(new Runnable() { public void run() { JTextPane textPane; final JOptionPane pane; final JDialog dlg; TitlePanel titlePanel; textPane = new JTextPane(); textPane.setFont(new Font("Dialog", Font.PLAIN, 12)); textPane.setEditable(false); textPane.setText(message); textPane.setBackground(Color.white); titlePanel = new TitlePanel(header, null, icon, true); final JPanel mainPanel = new JPanel(); mainPanel.setLayout(new BorderLayout()); mainPanel.add(titlePanel, BorderLayout.NORTH); Object[] options = {"Close"}; pane = new JOptionPane( new JScrollPane(textPane), JOptionPane.PLAIN_MESSAGE, JOptionPane.OK_CANCEL_OPTION, ChatsyManager.getApplicationImage(), options, options[0]); mainPanel.add(pane, BorderLayout.CENTER); dlg = new JDialog(new JFrame(), title, false); dlg.pack(); dlg.setSize(300, 300); dlg.setContentPane(mainPanel); dlg.setLocationRelativeTo(ChatsyManager.getMainWindow()); PropertyChangeListener changeListener = new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent e) { String value = (String)pane.getValue(); if ("Close".equals(value)) dlg.setVisible(false); } }; pane.addPropertyChangeListener(changeListener); dlg.setVisible(true); dlg.toFront(); dlg.requestFocus(); } }); } public static JDialog showComponent(String title, String description, Icon icon, JComponent comp, Component parent, int width, int height, boolean modal) { final JOptionPane pane; final JDialog dlg; TitlePanel titlePanel; titlePanel = new TitlePanel(title, description, icon, true); final JPanel mainPanel = new JPanel(); mainPanel.setLayout(new BorderLayout()); mainPanel.add(titlePanel, BorderLayout.NORTH); Object[] options = {"Close"}; pane = new JOptionPane( comp, JOptionPane.PLAIN_MESSAGE, JOptionPane.OK_CANCEL_OPTION, ChatsyManager.getApplicationImage(), options, options[0]); mainPanel.add(pane, BorderLayout.CENTER); JOptionPane p = new JOptionPane(); dlg = p.createDialog(parent, title); dlg.setModal(modal); dlg.pack(); dlg.setSize(width, height); dlg.setResizable(true); dlg.setContentPane(mainPanel); dlg.setLocationRelativeTo(parent); PropertyChangeListener changeListener = new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent e) { String value; try { value= (String)pane.getValue(); if ("Close".equals(value)) dlg.setVisible(false); } catch (Exception ex) { } } }; pane.addPropertyChangeListener(changeListener); dlg.setVisible(true); dlg.toFront(); dlg.requestFocus(); return dlg; } public static String getStackTrace(Throwable aThrowable) { final Writer result = new StringWriter(); final PrintWriter printWriter = new PrintWriter(result); aThrowable.printStackTrace(printWriter); return result.toString(); } public static String getCustomStackTrace(String heading, Throwable aThrowable) { final StringBuilder result = new StringBuilder(heading); result.append(aThrowable.toString()); final String lineSeperator = System.getProperty("line.separator"); result.append(lineSeperator); StackTraceElement[] stackTrace = aThrowable.getStackTrace(); final List<StackTraceElement> traceElements = Arrays.asList(stackTrace); for (StackTraceElement traceElement : traceElements) { result.append(traceElement); result.append(lineSeperator); } return result.toString(); } }